关于GIS

  |  
 阅读次数

关于地图数据服务和地图引擎服务,权威解读

地图服务至少包括两部分内容:

  • 一是地图数据服务。

    考虑到安全性,国家对这一块是严令禁止的,这一块需要有国家测绘资质的企业去采集,如果没有测绘资质的去采集是违法的,如果没有测绘资质的企业要用地图数据,这些企业可以去向有资质的企业采购(一般是四维或者高德),并且地图必须是测绘局审批过有审图号的数据;普通图商购买这些数据后,和自己的地图引擎一起进行售卖。试用阶段,图商提供的地图数据都是非法过期数据。

  • 二是地图引擎服务。

    这个是把数据进行管理,包括图层管理、渲染、路径规划等基本功能,这些工具有ESRI公司的Arcgis系列以及超图的软件、公安行业还有一家叫山海经纬的公司做的PGIS也是地图引擎。但是,以上任何一家,都是很大的团队、花费至少十几二十年以上时间在做这个,这个不是几个人的团队在短时间内做的了的。

程序员30岁后的 20 条人生建议

  |  
 阅读次数

程序员,活得是本事:30 岁后的 20 条人生建议

一个程序员看待职业的方式,决定了他能走多远。

有的人把职业当游戏,不论 buff 还是 bug 都要闯过去;有的人把职业当对手,不是一心想赢,只是不想输;有的人,活得是造型;有的人,活得是人设;程序员,活得是本事。

今天,我们采访了 10 多位程序员,并将他们的经验整理成这篇《程序员的 20 条职业感悟》。

01 关于 Work life balance

❶ 把身体锻炼好,只要你有一个健康的身体和健康的生活观,这个世界就饿不死人。

❷ 最好能够做到早起,一方面早上人的头脑比较清晰,另一方面可以在没有人打扰的时间里多学点东西。

❸ 自己的发展路线应该是最大限度地加强和发挥自己独特的组合,而不是寻求单项的超越。主要是通过实践,其次是要有意识地构造。

❹ 学习的能力和阅读的习惯,是从大学毕业后最该带到工作里的两样东西。

❺ 不要做个纯码农,多抽空做点其他自己感兴趣的事情。

02 关于技术

❶ 编程是一件需要技术积累的工作。涉及的不仅仅是写程序,还有对系统的了解,对工具的熟悉,工作方法,经验很重要。

❷ 学习新技术的时候多看“官方文档”。编写文档的人群,通常就是这些技术或者软件的开发者,他们是对这些东西最了解的人。因此,官方文档质量是很高的,通常也是最新的。

❸ 把觉得不靠谱的需求放到最后做,也许到时候需求就变了。

❹ 宁愿终止程序也不要带着错误运行下去。

❺ 隔一段时间就回去看看自己几个月之前写的代码,这能够让你认识到代码的可读性有多重要,亲身体会才能懂得。

❻ 程序不等于数据结构加算法,而等于搜索引擎加英语。

03 关于年龄

❶ 所谓的年龄歧视是在给自己设定心理障碍,你真正应该担心的不是年龄,在于你是否有职业规划,是否朝职业目标努力,你的年龄是否达到了相应的能力及经验

❷ 如果你坚持持续学习,不管在哪一个行业都会越老越香的。

❸ 无论年龄多大,需要学习的东西有很多,在专业的道路上还是要继续尝试做技术创新。

❹ 条条大路通罗马,选择一个自己热爱的行业很重要。

04 关于情商

心要皮实,但话语和脸皮要柔软,记住有句老话叫,伸手不打笑脸人

❷ 编码的时候只思考同一个思维层次的逻辑,在这层完成之后再思考下一层。

❸ 千万别真的认为别人都是傻逼,否则会降低你的可合作性,可合作性在团队里是项很重要的能力。

❹ 真正的领导能力不是令人服从,而是让大家用正确高效的方法完成任务。

❺ 永远别小看程序媛。

对了,还有一条最重要的感悟是几位程序员共同提到的

  • 一定要记录自己的技术积累, 才能获得技术的提升,不论是写文章还是做分享. 或许你资历尚浅,技术思路和技术方向还很难摸清。这时学习与模仿对你来说至关重要,学习别人思考问题的角度,分析成熟的技术文章的知识脉络。

  • 这样做的意义在于:

    • 从自身学习出发:从别人的思路里看到自己的技术边界,找到一个方向学习;
    • 从业务方向出发:看看别人输出成熟的技术实践,帮助你解决业务难题

GitChat 上技术达人、技术大佬的那些高质量文章,总有一篇能够戳中当下现状的你,汲取他们的技术经验和技术思想,应用在自己的学习与项目中。

比如:

58沈剑的系列 Chat 文章

《数据库典型架构实践》
《从用户中心开始,聊“单KEY”类业务数据库水平切分架构实践》
《从帖子中心开始,聊“1对多”类业务数据库水平切分架构实践》
《从好友关系开始,聊“多对多”类业务数据库水平切分架构实践
《从订单中心开始,聊“多KEY”类业务数据库水平切分架构实践》
《除了水平切分,数据库架构设计还经常遇到哪些问题》

左耳朵耗子的 Chat 文章

《左耳朵谈个人成长:做正确的事,等着被开除》

狼叔的 Chat 文章

《深入浅出浏览器渲染原理》

CSS-自定义Input[type=radio]样式

  |  
 阅读次数

伪类 :checkbox 实现

1
2
3
4
5
6
7
8
<div class="female">
<input type="radio" id="female" name="sex" />
<label for="female"></label>
</div>
<div class="male">
<input type="radio" id="male" name="sex" />
<label for="male"></label>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* 未选中 */
input[type="radio"] + label::before {
content: "\a0"; /*不换行空格*/
display: inline-block;
box-sizing: border-box;
width: 1em;
height: 1em;
margin-right: .4em;
font-size: 18px;
line-height: 1;
text-indent: .15em;
vertical-align: middle;
border-radius: 50%;
border: 1px solid #01cd78;
}

/* 选中 */
input[type="radio"]:checked + label::before {
background-color: #01cd78;
background-clip: content-box;
padding: .2em;
}

/* 隐藏原来选中框 */
input[type="radio"] {
position: absolute;
clip: rect(0, 0, 0, 0);
}

隐藏原来的单选按钮时,如果使用 display: none;,那样会把它从键盘 tab 键切换焦点的队列中完全删除。

于是可采用剪切的方式,让剪切后的尺寸为零,这样就隐藏了原来的单选按钮。

为什么现在很多男生宁愿打游戏,也不愿去追女生?

  |  
 阅读次数

为什么现在很多男生宁愿打游戏,也不愿去追女生?

  • 1.男性在恋爱中的经济成本过高。这一点可能会让知乎上经济独立的女生觉得委屈,但先别急,我们接着往下说。在两性相处中,有一个水很深的概念,叫“动态AA”。所谓“动态AA”,就是两人约会开销不由某一方承担,但也不刻意平均。举个例子就是:你请我看电影,我请你喝奶茶;或者“你送我礼物,我也会回送。”这在知乎上几乎是政治正确,在现实中确实也有许多女生如此实行。乍一看,这是女生自我价值的觉醒与对男性的体贴,但仔细观察就会发现,这其中其实存在许多猫腻:
    男生总是承担大宗消费。在恋爱中,甚至可能出现8:2的男女出资比例。

    男生常年请吃饭成了女生口中“并没花什么实质的钱”。在此处有个词“dinner whore”,感兴趣的朋友可以自行查阅。有的女生吃饭从来不付钱,钱,但是会送男朋友礼物,而且还挺大方。一谈到男女在恋爱中的花销,她们可以说“我送了你这个,我送了你那个”,男生也只不过送了类似价值的礼物而已,似乎她们达到了“新时代独立自主女性”的要求。但是有会计常识的人,都能看出来,一年就算送几次比较贵重的礼物,也不过几千块,但是常年请吃饭,在上海得好几万。

    拼着把钱花光。这是一种看似平等其实很不平等的做法。有的女生吃饭愿意AA,收礼也愿意回礼,但是她们喜欢把个人月光的生活方式带到恋爱关系中。于是两个年轻人一起拼着消费,出入高档餐厅,打卡网红餐厅,到处旅游,互相送贵重的礼物。几年恋爱谈下来,两个都成了月光族。但是这种女生在结婚方面的硬性物质要求一点都不会降低,房子还是要的,车子也是必须的。所以这种高消费的恋爱关系最终会结束,女生潸然泪下,“跟你在一起这些年真的很开心”,“再也找不到对我更好的人了”,然后嫁给了一个物质条件更好的男人。如果两个人在一起的前提必须是降低男生自己的生活质量,那么恋爱对于男生来说又能有多大的吸引力呢?

  • 2.舔狗之殇,谁的痛?这个时代不浪漫到了简直伤人的地步。

    知乎的择偶标准,逐渐成了各位女生的向往:
    身高185;
    月薪5万+;
    至少在二线城市有车有房且不用还贷;
    学历985硕士起步,最好本科清北并在全球top5名校有过留洋经历;
    原生家庭小康,父母知书达理且不存在重大家庭矛盾……

    在这类文字的评论区,多少青春少女围坐欢呼,满怀憧憬,认为只有这样的“正常男子”才能配得上自己。达不到如此标准的,都难逃被粗暴扣上各类帽子的命运:舔狗、癞蛤蟆男、凤凰男、猥琐男、直男癌、妈宝男……

    那么现实世界中真正的正常人,在情场的生存状况是什么样子呢?

    “舔狗舔到最后一无所有。”
    “你看这个人好烦啊,长成那个样子,还天天给我发这么恶心的情话。”
    “我真的想和你做很好的朋友,可是你能不能打消和我在一起的念头,不要再给我压力了?”

    稍微幸运一些的,抱得美人归之后的生活也不如人意:

    “他爱不爱你,看购物车就知道了。”

    “不管怎样,希望女朋友是处女的都是无可救药的直男癌。”

    “送两百块的口红,不如送她自由。”

    “买房我一分钱都不会出,他是男生,应该通过自己奋斗,并且加上父母半辈子积蓄来买车买房。最重要的是,房子必须加上我的名字,不然就是不爱我、没诚意、算计我。”…..

    以著名情感某大V为首的一堆营销号,凭借着一堆鸡汤爽文,不知不觉给大部分本是纯真善良的女孩儿洗了脑。她们开始怀疑自己的独立、自尊、自爱、自立、自强、内心强大、有思想、有内涵、尊重别人、善解人意、通过自身价值和实际能力换得的人家的尊重和珍惜。她们觉得优秀的女人不会傻乎乎地自己拼命,勾勾手指就有舔狗上门俯首称臣的生活才是她们价值和魅力的体现。真正的爱情不再被欣赏,体贴恋人的女生也会被人指责“太傻”。不管人家感情多幸福,也总有田园女权要站出来,拎着女孩的耳朵,告诉她:这样做太亏太傻,为爱情牺牲没有好下场。恋爱逐渐成了一座围城,城内的男生如坐针毡,城外的男生望洋兴叹。

  • 3.这个社会,一直都在给男生贩卖焦虑。

    “寒门状元之死,原生家庭决定了你一辈子的高度。”

    “不满175的男生都是diao丝,不满170的都是二级残废。”

    “专科的男生,不配有后代。”……

JS数据结构

  |  
 阅读次数

前端数据结构与算法

js数据类型

  • 基本类型(栈 stack) : Number、String 、Boolean、Null 和 Undefined , Symbol(es6 新增); 基本数据类型是按值访问 由高向低分配,栈内存最大是 8MB,(超出报栈溢出), String:是特殊的栈内存 (向高分配大小不定),程序员分配

  • 引用类型(堆 heap) :Object 、Array 、Function 、Data;引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址(指针),向高分配,系统自动分配

一、堆栈空间分配区别:

  • 栈(操作系统): 由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

  • 堆(操作系统): 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表。

二、堆栈缓存方式区别:

  • 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

  • 堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆 、栈数据结构区别:

  • 堆(数据结构):堆可以被看成是一棵树,如:堆排序;

  • 栈(数据结构):一种先进后出的数据结构。

数据结构

数据结构 是指 相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成;数据结构的基本操作的设置的最重要的准则是,实现应用程序与存储结构的独立(数据结构=数据的存储+算法)

数据结构

数据结构分类

逻辑结构: 反映数据之间的逻辑关系;

1
2
3
4
集合: 结构中的数据元素除了同属于一种类型外,别无其它关系。(无逻辑关系)
线性结构: 数据元素之间一对一的关系(线性表)
树形结构: 数据元素之间一对多的关系(非线性)
图状结构 | 网状结构: 结构中的数据元素之间存在多对多的关系(非线性)

存储结构: 数据结构在计算机中的表示;

1
2
3
4
顺序存储数据结构
链式存储数据结构
索引存储数据结构
散列存储数据结构

线性结构

1
2
3
4
5
队列: 也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。先进先出。

栈: 是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。先进后出。top= -1时为空栈,top=0只能说明栈中只有一个元素,并且元素进栈时top应该自增。后进先出。

串: 是零个或多个字符组成的有限序列。长度为零的串称为空串(Empty String),它不包含任何字符。通常将仅由一个或多个空格组成的串称为空白串(Blank String) 注意:空串和空白串的不同,例如" "和""分别表示长度为1的空白串和长度为0的空串。

非线性结构

1
2
3
4
5
6
7
树: 一种非线性结构。树是递归结构,在树的定义中又用到了树的概念.

有序树: 子节点之间有顺序关系

无序树: 子节点之间没有顺序关系

二叉树: 一种非线性结构。树是递归结构,在树的定义中又用到了树的概念

二叉树遍历:

使得每一个结点均被访问一次,而且仅被访问一次。非递归的遍历实现要利用栈。

1
2
3
4
5
6
7
+ 先序遍历DLR:根节点->左子树->右子树(广度遍历)

+ 中序遍历LDR:左子树->根节点->右子树。必须要有中序遍历才能得到一棵二叉树的正确顺序(广度遍历)

+ 后续遍历LRD:左子树->右子树->根节点。需要栈的支持。(广度遍历)

+ 层次遍历:用一维数组存储二叉树时,总是以层次遍历的顺序存储结点。层次遍历应该借助队列。(深度遍历)

二叉树

内存: 一条很长一维数组

算法

算法特征:

有穷性、确定性、可行性、输入、输出

算法设计衡量:

正确性、可读性、健壮性、时间复杂度、空间复杂度

算法分类:

  • 快速排序
  • 堆排序
  • 归并排序

  • 二分查找

  • 线性查找

  • 深度优先

  • 广度优先

  • 戴克斯特拉

  • 动态规划
  • 贝叶斯分类

基本算法(必会)

  • 冒泡排序
    冒泡排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
    for (var j = 0; j < len - 1 - i; j++) {
    if (arr[j] > arr[j+1]) {
    var temp = arr[j+1];
    arr[j+1] = arr[j];
    arr[j] = temp;
    }
    }
    }
    return arr
    }
  • 快速排序
    快速排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function swap(items, firstIndex, secondIndex) {
    var temp = items[firstIndex];
    items[firstIndex] = items[secondIndex];
    items[secondIndex] = temp;
    }

    function partition(items, left, right) {
    var pivot = items[Math.floor((left + right) / 2)],
    i = left,
    j = right;
    while (i <= j) {
    while (items[i] < pivot) i++;
    while (items[j] < pivot) j--;
    if (i <= j) {
    swap(items, i, j)
    i++
    j--
    }
    }
    return i
    }

    function quickSort(items, left, right) {
    var index;
    if (items.length > 1) {
    index = partition(items, left, right);
    if (left < index -1) quickSort(items, left, index -1)
    if (index < right) quickSort(items, index, right)
    }
    return items;
    }
  • 插入排序
    插入排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function insertionSorting(arr) {
    var len = arr.length;
    var preIndex, current;
    for(var i = 1; i < len; i++) {
    preIndex = i - 1;
    current = arr[i];
    while(preIndex >= 0 && arr[preIndex] > current) {
    arr[preIndex+1] = arr[preIndex];
    preIndex--
    }
    arr[preIndex+1] = current;
    }
    return arr
    }
  • 选择排序
    选择排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    for (let i = 0; i < len -1; i++) {
    minIndex = i;
    for (let j = i + 1; j < len; j++) {
    if (arr[j] < arr[minIndex]) minIndex = j;
    }
    temp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = temp;
    }
    return arr
    }

时/空间复杂度

在冒泡排序,插入排序,选择排序,快速排序中,在最最坏情况下,快速排序的时间复杂为O(n2) ,插入排序O(n2),选择排序O(n2),冒泡排序O(n2)

算法时/空间复杂度