-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.xml
718 lines (619 loc) · 103 KB
/
index.xml
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>编程超能力入门班 on Engine GO</title>
<link>https://www.enginego.org/</link>
<description>Recent content in 编程超能力入门班 on Engine GO</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Tue, 11 Feb 2020 00:10:14 +0800</lastBuildDate>
<atom:link href="https://www.enginego.org/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>LLDB 快速教程</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/lldb-%E5%8D%81%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E6%95%99%E7%A8%8B/</link>
<pubDate>Tue, 11 Feb 2020 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/lldb-%E5%8D%81%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E6%95%99%E7%A8%8B/</guid>
<description>概述 macOS 默认使用 LLDB 来进行 C/C++ 程序的调试, LLDB 能够逐行调试程序,使开发者能够了解程序的变量值以及堆栈是如何变化的,一旦学会之后使用起来也比 printf 更加方便和简单,赶紧学起来吧。
LLDB 实现原理 在此之前,请考虑如何实现一个能够监听其他程序(被监听者称为 Client)运行情况的程序(监听者称为 Server)。
第一种方式是 Server 拷贝 Client 的代码来模拟 Client 运行,并且在运行的过程中,Server 通过在模拟过程中使用额外的指令从而能够查看和修改 Client 的运行堆栈和数据信息,其中,Valgrind 就是这样实现的。这种方式的优点是无需预先编译 Client 程序,缺点是因为需要运行额外的指令所以 Server 的运行会比 Client 慢很多(Valgrind 大概会会原程序慢 20-50 倍)。
第二种方式是使用操作系统的 ptrace 系统调用,这也是 LLDB 的实现方式。ptrace 系统调用可以让 A 进程监听和控制 B 进程的内存和寄存器。ptrace 系统调用有以下几个主要功能:
捕获 exec 系统调用并阻止程序的运行。 查询 CPU 的寄存器来获取当前的指令,数据和栈地址。 监听 clone/fork 事件来判断是否创建新的线程。 读取或者修改 Client 内存变量。 也就是说利用 ptrace 系统调用,Client 运行的每一行代码的情况 Server 都能知道。</description>
</item>
<item>
<title>栈结构(上)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84/%E6%A0%88%E7%BB%93%E6%9E%84/%E6%A0%88%E7%BB%93%E6%9E%84%E4%B8%8A%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Wed, 08 Jan 2020 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84/%E6%A0%88%E7%BB%93%E6%9E%84/%E6%A0%88%E7%BB%93%E6%9E%84%E4%B8%8A%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description>概述 栈绝对是数据机构中最被低估的一类,许多对栈的理解仅仅停留在后入先出这几个字。却不知道这几个字真正蕴含的力量,首先介绍下栈结构,简单来说,当你手上有排序好的编号为1到n的书,当你从编号1开始把这些书放到一个箱子的话,那么这个箱子会变成。
如果你把书再次拿出来,编号为n的书因为在顶部所以第一本被拿出来,如此类推,手上的书从编号1到n变成编号n到1。
好吧,这有什么用,这不就是翻转一个队列吗?或者说,原本从头开始取,现在从最后开始取而已。有什么实际作用呢?这是一个非常好的问题。现实生活中我们一般只会将一维数组按顺序放入栈中,就如放书的例子,这样用途确实不大(除了单调栈之外,我们以后会介绍到)。但是当你将图或者树这类相对复杂的结构和栈结合起来的话,那么就能得到非常多的应用方式。而且当每个元素可以根据状态重复放入栈的时候,更加演变出非常复杂的使用方法。例如使用栈来实现 DFS 或者 递归。通过改变元素的状态以及运行顺序就能实现我们需要的算法。这属于比较高级的用法,不过只要你真正理解了栈结构的话,我觉得你也可以轻而易举地把递归改为栈来实现。
树的遍历 常见的树的遍历类型有四种,前序,中序,后序以及层序,其中前三种非常类似,只是父节点以及子节点位置的相对不同。
![img](father, child)
实现方式也有多种,最简单的当然是递归实现,这里给出伪代码:
function preorder(root): if not root: return print root preorder(root.left) preorder(root.right) 前序 [ root ] [ left ] [ right ] 中序 [ left ] [ root ] [ right ] 后序 [ left ] [ right ] [ root ] 为什么使用 stack,如何使用 stack</description>
</item>
<item>
<title>栈(上)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E6%A0%88%E4%B8%8A%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Wed, 08 Jan 2020 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E6%A0%88%E4%B8%8A%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description>概述 栈绝对是数据机构中最被低估的一类,许多对栈的理解仅仅停留在后入先出这几个字。却不知道这几个字真正蕴含的力量,首先介绍下栈结构,简单来说,当你手上有排序好的编号为1到n的书,当你从编号1开始把这些书放到一个箱子的话,那么这个箱子会变成。
如果你把书再次拿出来,编号为n的书因为在顶部所以第一本被拿出来,如此类推,手上的书从编号1到n变成编号n到1。
好吧,这有什么用,这不就是翻转一个队列吗?或者说,原本从头开始取,现在从最后开始取而已。有什么实际作用呢?这是一个非常好的问题。现实生活中我们一般只会将一维数组按顺序放入栈中,就如放书的例子,这样用途确实不大(除了单调栈之外,我们以后会介绍到)。但是当你将图或者树这类相对复杂的结构和栈结合起来的话,那么就能得到非常多的应用方式。而且当每个元素可以根据状态重复放入栈的时候,更加演变出非常复杂的使用方法。例如使用栈来实现 DFS 或者 递归。通过改变元素的状态以及运行顺序就能实现我们需要的算法。这属于比较高级的用法,不过只要你真正理解了栈结构的话,我觉得你也可以轻而易举地把递归改为栈来实现。
树的遍历 常见的树的遍历类型有四种,前序,中序,后序以及层序,其中前三种非常类似,只是父节点以及子节点位置的相对不同。
![img](father, child)
实现方式也有多种,最简单的当然是递归实现,这里给出伪代码:
function preorder(root): if not root: return print root preorder(root.left) preorder(root.right) 前序 [ root ] [ left ] [ right ] 中序 [ left ] [ root ] [ right ] 后序 [ left ] [ right ] [ root ] 为什么使用 stack,如何使用 stack</description>
</item>
<item>
<title>栈(上)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84/%E6%A0%88%E7%BB%93%E6%9E%84/%E6%A0%88%E4%B8%8A%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Wed, 08 Jan 2020 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84/%E6%A0%88%E7%BB%93%E6%9E%84/%E6%A0%88%E4%B8%8A%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description>概述 栈绝对是数据机构中最被低估的一类,许多对栈的理解仅仅停留在后入先出这几个字。却不知道这几个字真正蕴含的力量,首先介绍下栈结构,简单来说,当你手上有排序好的编号为1到n的书,当你从编号1开始把这些书放到一个箱子的话,那么这个箱子会变成。
如果你把书再次拿出来,编号为n的书因为在顶部所以第一本被拿出来,如此类推,手上的书从编号1到n变成编号n到1。
好吧,这有什么用,这不就是翻转一个队列吗?或者说,原本从头开始取,现在从最后开始取而已。有什么实际作用呢?这是一个非常好的问题。现实生活中我们一般只会将一维数组按顺序放入栈中,就如放书的例子,这样用途确实不大(除了单调栈之外,我们以后会介绍到)。但是当你将图或者树这类相对复杂的结构和栈结合起来的话,那么就能得到非常多的应用方式。而且当每个元素可以根据状态重复放入栈的时候,更加演变出非常复杂的使用方法。例如使用栈来实现 DFS 或者 递归。通过改变元素的状态以及运行顺序就能实现我们需要的算法。这属于比较高级的用法,不过只要你真正理解了栈结构的话,我觉得你也可以轻而易举地把递归改为栈来实现。
树的遍历 常见的树的遍历类型有四种,前序,中序,后序以及层序,其中前三种非常类似,只是父节点以及子节点位置的相对不同。
![img](father, child)
实现方式也有多种,最简单的当然是递归实现,这里给出伪代码:
function preorder(root): if not root: return print root preorder(root.left) preorder(root.right) 个人来说,我觉得将栈底想象成右边,元素从左边进行插入和获取会比较容易理解。
前序 ( root ) ( left ) ( right ) ] 中序 [ left ] [ root ] [ right ] 后序 [ left ] [ right ] [ root ] 为什么使用栈,而不是其他数据结构来实现递归。 递归函数一般来说是需要作用于结构体里面的所有对象的,如果对树结构进行递归,那么递归应该对每一个节点都运行一次。(这里我们不讨论使用动态规划或者缓存来简化计算的情况)简单地来说,栈能够修改下一个执行的对象,例如当
( root ) ] 当我们从栈中获取元素 ( root ) 后,正常的下一个执行的对象应该是空的,但是如果我们在每次执行前对当前元素进行一些操作,例如,将当前节点的右支点和左支点分别压入栈中,那么我们在执行之前就能得到这样的栈,下一个执行对象就变成 root.left 了</description>
</item>
<item>
<title>树结构(上)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E6%A0%91%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84%E4%B8%8A/</link>
<pubDate>Wed, 08 Jan 2020 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E6%A0%91%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84%E4%B8%8A/</guid>
<description>概述 </description>
</item>
<item>
<title>树结构(上)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84%E4%B8%8A/</link>
<pubDate>Wed, 08 Jan 2020 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84%E4%B8%8A/</guid>
<description>概述 </description>
</item>
<item>
<title>一文理解字符串编码</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E4%B8%80%E6%96%87%E7%90%86%E8%A7%A3%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%BC%96%E7%A0%81/</link>
<pubDate>Sat, 06 Jul 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E4%B8%80%E6%96%87%E7%90%86%E8%A7%A3%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%BC%96%E7%A0%81/</guid>
<description>在打开网页或者文件的时候,你一定会遇过像这样的字符串乱码问题:
É��OÇ��,常见的操作系统包括&hellip;
同时或多或少也遇到Unicode, UTF-8, ASCII, Latin-1这些编码术语。编码问题可以说是新人必踩坑,虽然从最后的解决方案来看,可能两三句代码就能解决,但是实际大部分开发者,包括我以前,也没有真正地理解它。**原因并不是因为它复杂,而是它涉及了计算机科学中一个常见的问题,理论与工程实现的区别。理论上我们只需要按照A方案就可以解决问题,但是实际上,由于不同语言,不同系统的历史原因,实现的方案就变成多个,许多编程语言的编码实现都不同。**所以要真正地理解字符串编码,首先需要了解计算机的一些基础知识,包括字符串如何存储在计算机硬盘中。如果只是希望靠运气来解决或者避开它,反而会在一次次盲目的尝试中浪费更多的时间。如果你不熟悉Python代码的话,完全可以跳过这篇文章所有的代码段,它不会影响你对这篇文章的影响。
基础术语 计算机如何存储数据 ASCII编码 GBK编码 Unicode UTF-8编码 HTML实体编码 URL编码 常见问题 总结 基础术语 字符 字符串 键值表 字符串编码与解码 字符 A B C 天 气 エ ン コ 😁 上面的用空格分割的都是单个字符(Character),它代表对人类能看懂的有意义的语言文字。
字符串 Hello 天气 Hola 字符串(Strings)就是多个字符组成的集合
键值表 一一对应的表,函数
y = x * 2 中每个x都对应着唯一的一个y值,x与y组成的集合就是键值表(Hash Table),例如:
1 -&gt; 2 2 -&gt; 4 3 -&gt; 6 这里的每一个x(1, 2, 3)都有对应的y(2, 4, 6)</description>
</item>
<item>
<title>DFS 解题模式(上)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/dfs-%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F%E4%B8%8A/</link>
<pubDate>Mon, 01 Jul 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/dfs-%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F%E4%B8%8A/</guid>
<description>概述 这篇文章介绍 Leetcode 常见 DFS 问题的解题模式,希望你了解这些模式之后,对大部分 DFS 问题(hard 难度的需要一些变形)都能够迎刃而解。由于 Leetcode 上 DFS 问题中常见的都是无环图,所以我们这里也只讨论无环图的解题模式。阅读本文之前你需要对图的基础知识有一定的了解,包括什么是图?常见的图的类型有那些?(有向无环图,有向有环图),如何遍历图?(前序遍历以及后序遍历)。
辨别问题 那么什么样的问题可以用 DFS 来解决呢?,DFS 问题常见的表达形式为:
“给定一个图(树,字符串,矩阵),找到在遍历图的过程中,符合特定条件的数值或路径。”
上面的这个定义有点抽象,举两个例子:
Leetcode 113 Path Sum II
&ldquo;Given a binary tree and a sum, find all root-to-leaf paths where each path&rsquo;s sum equals the given sum.&rdquo;
“给定一个有向无环图(二叉树),找到在遍历图的过程中,符合特定条件的数值(路径和等于 sum )”
Given the below binary tree and sum = 22, input: 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1 output: [ [5,4,11,2], [5,8,4,5] ] Leetcode 200 Number of Islands</description>
</item>
<item>
<title>公私钥加密</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%85%AC%E7%A7%81%E9%92%A5%E5%8A%A0%E5%AF%86/</link>
<pubDate>Mon, 07 May 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%85%AC%E7%A7%81%E9%92%A5%E5%8A%A0%E5%AF%86/</guid>
<description>简介 对称密码 非对称密码 数字签名 SSH登录 Https传输 API调用 简介 我接触过不少工程师对于对称加密,非对称加密,公钥和私钥只停留在应用的层面,而并不了解背后的原理。所以在开发过程中犯了不少错误,而通常涉及加密传输或者加密存储的错误都比较严重,这篇文章着重介绍了密码学常用的工具以及常见场景。
对称密码 我们日常接触最多的就是对称密码,它最重要的性质有两点:
对称密码中加密和解密使用的是同一个密码。 对称密码中加密后的密文只有该对称密码才能解密。 对称加密有很多名称,例如对称密码,私钥密码,它类似家里的保险柜,把密码设置成9527然后锁上,那么也需要使用9527才能打开。当你要把“芹菜,香菜”利用对称密码“000111”传输给朋友:
# 原文 芹菜,香菜 # 约定一个密钥(不能被第三方知道) 000111 # 把信息和对称密钥异或运算,得到密文 101100 这时候你可以直接把密文“101100”告诉你的朋友。你的朋友使用约定的密钥“000111”对密文进行再一次异或就能得到原文。实际使用中,加解密不止异或一次那么简单,通常会使用分组密码多次迭代异或。常用的对称加密算法有DES与AES。
DES AES 密钥长度 56位 128, 192, 256 位 加密方式 对称分组密码 对称分组密码 加密轮数 16轮 128位10轮,192位12轮,256位14轮 安全性 被攻破 安全 速度 较慢 较快 密钥配送 **对称密码最大的问题是密钥配送问题,也就是如何约定只有传输者和接受者都知道并且足够长的密钥“000111”,任何得到这个密钥的人都能够解密信息。**常用的解决方法有两种:</description>
</item>
<item>
<title>如何准备技术面试</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%87/</link>
<pubDate>Tue, 19 Feb 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%87/</guid>
<description>刚开始参加工作的时候,我对面试总是很恐惧,既担心简历无法通过初筛,也担心即使简历通过筛选,因为面试经验不多以及基础知识不扎实而导致发挥不好。我刚开始拿着普通的简历(专业不是计算机,作品也没多少)也得到了一线大厂的面试机会,但是因为根本没有准备,也不知道怎么准备。自然地,那次面试我表现得不好,也没有得到 Offer。
恐惧也使我不想浪费时间去面试不同类型的公司。**我当初并不知道对比其他求职者,自己的优势和劣势在哪里,也不知道如何去准备面试,面试官看重的是哪些方面,更不知道自己到底值多少钱。**现在回过头看,我觉得当初只是在欺骗自己,我真正担心的是即使自己认真准备简历和面试也对结果毫无影响,更不敢去想如果放弃某个 Offer,找不到其他工作怎么办。
工作了几年,当我有了越来越多的面试官的经验之后,我越来越发现认真准备简历和面试是非常重要的,**因为毫无准备就来面试的求职者真的太多了。**而且互联网公司招聘到合适的工程师实在非常难,有计算机基础知识,有项目经验,愿意学习而且愿意来这家公司,实在不好找。所以只要求职者能证明自己有一定的计算机水平并且愿意努力,市场上还是有非常多机会的。
这篇文章我把这几年作为面试者和面试官身份的的经验給大家,希望大家可以从中学到一些面试的技巧,找到心仪的工作。大家也可以使用 Overseas Rabbit 进行简历 Review 和模拟面试,这样既能节省请假面试的时间,也能根据我们的反馈改善自己面试的表现。这样在真实面试的时候更有把握。
1. 分析阶段 1.1 公司需要怎样的员工 我很喜欢 Google 前 CEO 施密特分享的一个故事,他刚到 Google 的时候,Google 还只是个小的创业公司。他一开始以为 Google 和其他公司没什么两样,直到有一个周五,拉里佩奇在用谷歌搜索一些关键字的时候,他发现出现了一些不相干的广告推荐(这个情况我们现在在国内最大的搜索引擎也经常看到)。施密特以为接下来就是开几个会议,然后分到具体的工程师手上解决。但是拉里佩奇没有这么做,他用纸条写下&quot;These Ads Suck!&quot;,附上相关的截图贴在布告栏上就回家了。接下来的 72 小时彻底改变了施密特的认知。在周一凌晨 5点,有几位并不是负责广告业务的工程师发来一份邮件,从头到尾阐述了这个问题产生的原因,他们的解决方案,以及这个计划对公司有什么影响。他们从公司的角度去思考,自愿自发地用周末的时间去解决并不属于自己范畴的问题。
这样的员工我想就是每个公司都需要的:
不错的技术能力,工作认真负责,可以及时解决问题,能给公司带来实际效益 出色的团队合作精神,能与团队一起成长 愿意自我学习,投资自己 **所以求职者的简历与面试中必须能体现出这几点品质。**举个例子,要在简历或者面试中展现自己喜欢学习计算机知识,与其笼统地说:
热爱计算机,喜欢学习计算机系统的知识。
可以改为:
喜欢阅读计算机系统的书籍,完成《深入理解计算机系统》80% 以上的习题。并在博客(链接)分享学到的知识。
面试官在筛选简历看到的时候就会自然地打开博客,进一步地了解求职者(恭喜你,击败了其他 80% 的求职者)。另外,一些软技能,例如团队合作能力也是面试官非常注重的一点,面试过程中如果被问到有没有带领团队的经验,即使没有也不要简单地回答没有,可以这样回答:
“我在以往的项目中与团队成员都能融洽相处,并且每个月都会做定期的技术分享互相学习,虽然没有带团队的机会,但是相信自己能够做到。”
当然这些回答不可能一下子能想到,面试方面的技巧必须多练。重要的是在职期间定期找几家公司面试练练手,一方面能知道市场的行情,找到其他更好工作机会,另一方面本身自己就有工作,等于手拿一个 Offer,面试的时候就能比较放松。未雨绸缪对于一位工程师尤为重要。等到离职再找工作就比较晚了。
1.2 员工需要怎样的公司 找新工作之前,求职者需要先认真思考下几个问题,一份工作中你最看重的是哪些方面?
薪酬 公司名气与规模 公司福利/工作环境 / 地点 工作方向(假如你要从技术转向管理,这个岗位提供这样的可能吗?) 工程师文化 个人成长 有时候薪酬远不及公司名气与规模 / 工程师文化重要,有的公司能聚集一批优秀的工程师,那么只要认真待一两年,进步速度远比其他地方快,以后跳槽也会更加容易。有的厂则能提供大量隐性的福利(国内可以参考腾讯)。求职者需要真正地去思考自己想要去怎么样的公司。**工作和找男女朋友一样,找你喜欢的,而不是找你能找到的。**前几家公司的选择对你的职业规划会有很大的影响,大公司还是小公司,和你个人的性格或者职业规划有直接的关系:
大公司 优势</description>
</item>
<item>
<title>如何写一份更好的简历</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%A6%82%E4%BD%95%E5%86%99%E4%B8%80%E4%BB%BD%E6%9B%B4%E5%A5%BD%E7%9A%84%E7%AE%80%E5%8E%86/</link>
<pubDate>Fri, 16 Nov 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%A6%82%E4%BD%95%E5%86%99%E4%B8%80%E4%BB%BD%E6%9B%B4%E5%A5%BD%E7%9A%84%E7%AE%80%E5%8E%86/</guid>
<description>概述 从零开始写简历是一件痛苦的事,因为它既重要又耗时。写得太短的话觉得没诚意,写得太长的话又感觉无从下手。而且大多数求职者没有面试官的经验,没有阅读过其他求职者的简历,所以无法从优秀的简历中学习如何改进自己的简历。我遇过不少求职者写完简历后连自己都不忍心看,错别字连篇,排版混乱就投出去,这也不难怪没有获得面试的机会。加上程序员工资中位数较高,有大量人才从其他专业转来,竞争非常激烈。这篇文章分成两部分,简历中的常见错误以及如何写一份出色的简历,通过分享我们的经验以及技巧,帮助你从众多简历中脱颖而出。
简历中的常见错误 1. 信息过多,缺乏重点
信息过多的常见表现是十几行的技能列表, 我举一个血淋淋的例子:
20 行的技能列表,这位求职者开始就把自己了解的所有工具都列出来,希望能够突显自己的经验和学习能力,但是却适得其反。因为大部分人包括 HR 遇到大段文字都会选择跳读,**不信你回头看看,第 3 行和 14 行其实是一样的。**我们首先要了解 HR 是如何筛选简历的,例如要招前端工程师,HR会先找简历是否有简介这类总结性的板块,看求职者是否符合基本的岗位要求。接下来会在技能列表中搜索 Vue,React,jQuery 等关键字。如果也符合要求,才会认真阅读整份简历的其他部分。平均来说,给每份简历的时间只有不到十秒钟。所以越简洁清晰的简历,HR 反而越有可能认真看。这里还有个小技巧,**投简历不要扎堆在周末投,而应该在平日投。**因为周一堆积了周五未处理完的简历以及周末的简历,是最多简历需要处理的时候,HR 花费在每份简历上的平均时间会相对较少。另外,HR 会倾向于把同一天的求职者当成竞争对手,从中挑选合适的,所以那么简历越多竞争也越激烈。
大段的技能列表还有另外一个问题,当 HR 发现里面有几行是一些非常基础的技能时,反而会开始怀疑求职者的技术能力。想象下,当你上网搜索到一个 20部最佳喜剧电影榜单。却发现其中好几部都是之前看过的烂片,一点都不好笑。这个情况下,你就会开始怀疑这个喜剧电影排行榜有问题。技能列表也是一样的,基础的技能点越多,被怀疑的可能性也越高。 **那么技能列表应该这么写呢?因为 HR 既可能是工程师,也可能是非技术员工,所以技能列表也应该简短而排版清晰,让外行人也能快速定位技能。**我建议参考这种方式(熟练度从高到低进行排列,但不要强调熟练度):
后端框架:Django, Flask, Tornado 前端框架:Vue, React, jQuery 数据库:Redis, MySQL 工具:Docker, Jenkins, Git 其他:HTTP, TCP/IP, WebSocket 外语:大学英语四级,能流畅阅读英文文档 就是如此简短,让 HR 能快速定位到求职者的技能,做出是否看下去的判断。可能有读者会疑问了,这样好像太简单,无法突显我对工具的熟悉程度以及技术能力,这个问题,可以参考下文的简介部分来找到解答。
2. 无意义描述
第二个常见错误就是叙述项目经验的时候进行无意义的描述:
XXX平台
根据项目任务要求完成规划工作和按时完成软件开发。 完成爬虫模块,展示模块。 开发后台管理系统,实现自定义分页,第三方登录。 完成数据整理与入库功能。 HR 无法从这样的描述中得到有效的信息,也无法判断求职者的技术能力。项目经验是最能够突显技术能力的地方,应该按照
使用什么工具: 使用 Scrapy 开发异步爬虫系统 实现什么功能: 构建 IP 代理池,优化爬虫策略和防屏蔽规则 结果怎么样: 提升 200% 网页抓取速度 三个点来修改,这里的 200% 量化数据是画龙点睛之处。就算没做太多统计和优化,也可以展示 CPU 或者内存负载数据。</description>
</item>
<item>
<title>系统设计面试 101</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E9%9D%A2%E8%AF%95-101/</link>
<pubDate>Sun, 21 Jul 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E9%9D%A2%E8%AF%95-101/</guid>
<description>求职系列文章:
如何准备技术面试 如何写一份更好的简历 程序员国外求职指南 面试流程 这篇文章并不是教读者如何构建一个高可用的系统,而是着重于阐述系统面试的具体流程以及常见的错误,系统设计流程总体可以分成 5个 部分,总时长约一个小时
确定范围(5分钟) 粗略计算(5分钟) 整体架构(5分钟) 组件架构(20分钟) 架构优化(20分钟) 1. 确定范围 系统面试开始之时,面试官可能只会提出一个问题:
“如何设计 Uber 这样的应用?”
“如何设计 Whatsapp 这样的应用?”
如果你刚参加工作或者刚毕业,会对如何设计一个这样的系统束手无策,要设计高可用,易扩展的系统需要广阔的计算机知识以及大量的项目经验累积,也往往需要一个团队配合设计以及多个版本的迭代。所以,面试官并不期待你可以在一小时内把 Uber 或者 Whatsapp 的全部功能都设计出来。系统设计面试真正考核的是
把抽象问题转变成实际工程中能够解决的简单问题 利用自己现有的知识设计一个基本可用的系统 观察现有方案可能出现的瓶颈并提出解决方案 第一阶段,确定范围就显得特别重要了。我们需要先与面试官讨论该系统
需要实现的功能点 用户量,数据存储量,两者的增长量以及其他限制条件 1.1 需要实现的功能点 如果你之前没有使用过这些应用(Uber, Whatsapp),不要害怕通过提问来确认功能点。(这并不奇怪,2016年,美国有三分之一人没听过 Uber 或者 Lyft)。用来确认功能点的问题有:
用户可以使用这个应用做什么?
这个应用有什么与众不同的功能?
设计架构本身花不了多少时间,我们值得投资更多时间在了解清楚问题中。切记,不要没有理解问题就动手设计。本文以设计 Uber 为例,Uber 包括多项功能,前端工程师关注显示地图,司机位置更新,日志传输。后端工程师关注车辆预订(包含定价,派单,司机信息),费用支付,用户评价,日志分析。我们先把想到的功能点都列在白板上,这里以后端工程师为例:
第一步,我们从中选出几项主要功能,在 Uber 中,车辆预订功能最为重要,确定好之后与面试官进行确认:
“我先从这些功能开始进行设计可以吗?”
我们必须经过面试官对设计的功能点认可才能进行接下来的系统设计。
1.2 用户量,数据存储量,两者的增长量以及其他限制条件 接下来我们需要了解
“每秒有多少用户预订车辆?有多少数据需要存储?用户每个月的增长量是多少?对响应时间以及服务器数量有没有限制?”</description>
</item>
<item>
<title>程序员国外求职指南</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%9B%BD%E5%A4%96%E6%B1%82%E8%81%8C%E6%8C%87%E5%8D%97/</link>
<pubDate>Wed, 21 Nov 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%9B%BD%E5%A4%96%E6%B1%82%E8%81%8C%E6%8C%87%E5%8D%97/</guid>
<description>求职系列文章:
如何准备技术面试 如何写一份更好的简历 我去年第一次到欧洲中西部旅游,旅程中给我的感受是他们更懂得享受生活。印象最深刻的是一次在法国的普通小镇,南希,我和朋友到当地的酒吧 Les Berthom Nancy 喝酒,吧台里有一名典型的高帅法国服务生。过了一会服务生下班了,他换下了制服却没有离开,而是坐到我们旁边点了一杯啤酒自顾自喝起来,那一刻我突然觉得他过得比我要幸福得多。另外一次,之前在 TX 面试的时候,与面试官闲聊的时候我问他,你在这里工作开心吗?他看着我,想了一下然后回答,“我在这里工作了四年没有人问过我这个问题,我想的只是努力地去做好一款产品。” 我很欣赏他为公司付出的努力,同时也惊讶于四年来没有人问他工作得开不开心。国内企业普遍缺乏不同国家与背景的人才,身边的人与自己往往有类似的成长背景,加上等级森严的层级关系,工程师像是复制粘贴出来的。在那次面试后,每一次面试我都会问自己,我真的想在这里工作吗?
或许就在这两个瞬间,到国外工作的想法就埋在我脑里了。几个月来,我一直在找国外的工作机会,经过过百份简历的投递和海量的面试(我面试了美国,加拿大,英国,欧洲,新加坡,香港这几个地方加起来超过 20 次),**最终决定到柏林的一家创业公司工作,他们像我一样热爱开源,还有令人激动的产品以及充满多样性的员工,来自不同国家与背景,这两点在国内都不常见。**这篇文章从我的亲身经历出发,希望能给国外求职的各位一些帮助。
前期规划 自信 记得在电影《独立游戏大电影》中的主人公 Tommy 自我介绍说,我非常非常擅长编程。当时在屏幕前的我第一反应是被吓到了,虽然程序员之间存在鄙视链,但是我接触的大部分的程序员都谦逊而不擅于线下社交,从没听过自己非常擅长编程这样的直白。第二反应是有些不屑,我当时觉得要像 Linus 这样的程序员才能自称非常擅长编程吧,一般人配不上非常擅长这几个字。不过后来我慢慢明白,这或许是国内教育给我的烙印,缺乏自信而且不擅长表现自己。其实不需要成为 Linus 才能自称擅长编程,认真钻研于一个领域,有一定的技术能力,无论是做业务开发,运维管理还是人工智能,只要有人喜欢你的代码编织出来的产品,那么你就已经比世界上 90% 的程序员要优秀了。所以前期规划中,建立自信是最重要的,出国工作并不难,对学历和技术的要求也不高,只要有出国的意愿都应该去尝试。
硬实力 自信心之外就是硬实力。主要包括语言能力与工作能力。有时候语言能力甚至比工作能力本身更重要,所以该专注于哪个方向,取决于你现在的程度。(小提示:如果职位描述是英语的话,代表求职者擅长英语即可,除非描述中额外注明)
英语水平:
听
面试官可能来自各个国家,口音有轻有重,其中印度与法国的口语比较难听懂,当两个英语都不好的人用英语互相面试,体验难以置信地差。记得有一次面试中我把 Symmetric and Asymmetric 听成了 Synchronize and Asynchronous,回答了一通之后,面试官给了我一个疑惑的表情然后说了句 &ldquo;Forget about it&rdquo;。所以如果你的英语听力也不好,建议上 Udacity 和 YouTube 编程频道练习听力,起码要熟悉一些常见的技术名词是怎么读的。不然面试的时候根本无法回答。
说
面试前我找了一位英语老师(wx: bohe_yoyo)上了 10节 模拟面试的课程,她问我一些常见的面试问题,然后再根据我的回答给出反馈以及建议,所以在真实面试中,有不少问题我都曾经遇过,回答起来也就得心应手,在下面的章节我也会举一些常见的例子。另外,我还使用 Pramp 进行算法模拟面试,系统会自动匹配一名工程师与你交替做面试官和求职者,求职者需要使用半小时解决一道算法题并与面试官保持沟通。我匹配了几次,从一开始的战战兢兢到现在的心如止水,真正感受到 Pramp 的名字所暗示的 Practice makes Perfect,Pramp 既训练算法还训练表达能力,实在是两全其美,关键的是它还是免费的。
读
阅读部分,最好是阅读自己感兴趣领域的文章,我从两年前开始每天阅读 Hackernews 的文章,里面发布着业内最新的资讯,有些文章艰深而且词汇量多,不像文档那么易读。令我坚持下来的是这里聚集着全球最优秀的工程师以及最新的科技资讯。两年后,我的阅读能力大有进步,现在能阅读原文的技术书籍,这部分没有捷径,只有每天积累。
写</description>
</item>
<item>
<title>劳动法赔偿 101</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%8A%B3%E5%8A%A8%E6%B3%95%E8%B5%94%E5%81%BF101/</link>
<pubDate>Tue, 25 Dec 2018 14:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%8A%B3%E5%8A%A8%E6%B3%95%E8%B5%94%E5%81%BF101/</guid>
<description>注:本文适用于中国大陆地区,不同地区的劳动仲裁情况可能有所差异
“《劳动法》与《劳动合同法》是保护劳动者的。”
这是我经历劳动法维权时,律师朋友对我说的话,当初听起来只觉得是泛泛而谈,但当我为了维权而了解案例,研读法律法规的时候却慢慢感受到这句话的力量,也给了我争取合法权利的勇气。我的维权经历不算美好的回忆,当时的用人单位愿意按法律赔偿,但是其中涉及了离职证明内容,赔偿金额细节的商讨,所以结果不算愉快,但却是一个不错的职场经验。而且到最后你往往发现,即使你与上司的私交再好,离职的时候他也会站在用人单位的角度来处理事情。在此期间,我非常幸运有一位律师协助我处理,并最后得到我比较满意的结局。从我的经验来说,劳动纠纷时,先与用人单位进行协商会是比较好的方法,因为真正走劳动仲裁确实费时费力,准备资料,走法院,等待,最后拿到的钱还会打折。有些老板或者 HR 只是抓住劳动者不懂法的弱点以离职证明,调岗或其他手段侵害劳动者的权利。所以你不一定走到劳动仲裁这步,只需要向用人单位提出法律依据,让他们知道你懂法,而且他们很大概率会败诉的情况即可,毕竟他们都喜欢欺负软柿子。当然,在此之前首先你要知道自己有什么权利,才能知道如何谈判以及让步。**从我身边的案例来看,劳动者与用人单位发生劳动纠纷时,大部分情况下都是优势方。如果因为不懂法或者不想付出时间精力而放弃自己的权利,是逃避的行为,因为你无法担保下次会不会出现类似的情况。**所以,不需要害怕与他们据理力争,用人单位比我们更害怕劳动法。我希望这篇文章能帮到面临劳动法赔偿的各位,因为谁也不知道下一个被解雇的是不是自己。
阅读本文之前,请大家花 5分钟粗略阅读劳动法,劳动合同法以及劳动合同法实施条例,它们比技术文档易读得多,不过相对细节也较少,没有对一些边界条件进行定义,当然也没有源码,需要参考实际案例的裁决,不过对基本条款有初步的了解是非常重要的。
赔偿金额 常见的赔偿方式为标准赔偿以及双倍赔偿:
《劳动合同法》第四十七条:经济补偿按劳动者在本单位工作的年限,每满一年支付一个月工资的标准向劳动者支付。六个月以上不满一年的,按一年计算;不满六个月的,向劳动者支付半个月工资的经济补偿。
劳动者月工资高于用人单位所在直辖市、设区的市级人民政府公布的本地区上年度职工月平均工资三倍的,向其支付经济补偿的标准按职工月平均工资三倍的数额支付,向其支付经济补偿的年限最高不超过十二年。
本条所称月工资是指劳动者在劳动合同解除或者终止前十二个月的平均工资。应发工资是指劳动者提供正常劳动按照法律规定应当获得的全部工资,包括了基本工资、加班工资、奖金、津贴等。实发工资是劳动者每月实际拿到的工资,通常会被扣减一些费用,比如代扣代缴社会保险费、所得税,扣伙食费、房租费等,劳动者实际到手的金额通常会比应发工资少。经济补偿金的计算应当以劳动者的应发工资作为基数,而不是以基本工资、实发工资为基数。
标准赔偿:工作年限(包括试用期)超过六个月,赔偿一个月工资,超过一年少于一年半,赔偿一个半月工资,以此类推,这就是常说的赔偿 N 个月,N 在这里指的是工作年限。如果用人单位没有提前 30天 通知劳动者就解除劳动合同,需要额外支付一个月的工资,这就是 N+1 赔偿。
双倍赔偿:标准赔偿乘以 2,只有在违法解雇的情况下才适用。
要注意,这里的月工资是指劳动者提供正常劳动按照法律规定应当获得的全部工资,包括了基本工资、加班工资、奖金、津贴等。不扣除代缴社会保险费、所得税,扣伙食费、房租费等。(谢谢 Zhang_Siayng 的指正)
加班费 很可惜,我没有找到维权成功拿到加班费的案例(欢迎大家提供),举证其实不难,最高人民法院在劳动争议相关司法解释中,对加班费举证责任问题作出了明确规定:“劳动者主张加班费的,应当就加班事实的存在承担举证责任。但劳动者有证据证明用人单位掌握加班事实存在的证据,用人单位不提供的,由用人单位承担不利后果。” 也就是说,与劳动仲裁争议事项有关的证据属于用人单位掌握管理的,用人单位应当依法提供,用人单位不提供的,应当承担不利后果。 **但是用人单位往往会在劳动合同中说明工资是包含加班费来逃避支付加班费。**而且当劳动者每月领取工资条,表明其已知悉工资(包含加班费)的具体数额及计算方式,但却未曾向公司对加班费的基数及计算方法提出任何异议的话,这样的情况,法院一般不支持加班费的赔偿。
工作阶段 我把工作阶段分成四个阶段:
阶段 事件后 事件前 入职 接受了口头或者书面 offer 签署劳动合同 试用期 签署劳动合同 试用期结束 在职期 试用期结束 离职 离职期 自行离职 / 被解雇 / 协商解除合同 / 入职阶段 入职阶段不会涉及劳动赔偿法,一般发生经济赔偿的情况是用人单位撤回 offer。</description>
</item>
<item>
<title>DFS 解题模式(下)(未完成)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/dfs-%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Sun, 07 Jul 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/dfs-%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description>概述 这篇文章介绍 Leetcode 常见 DFS 问题的解题模式,希望你了解这些模式之后,对大部分 DFS 问题(hard 难度的需要一些变形)都能够迎刃而解。由于 Leetcode 上 DFS 问题中常见的都是无环图,所以我们这里也只讨论无环图的解题模式。阅读本文之前你需要对图的基础知识有一定的了解,包括什么是图?常见的图的类型有那些?(有向无环图,有向有环图),如何遍历图?(前序遍历以及后序遍历)。
辨别问题 那么什么样的问题可以用 DFS 来解决呢?,DFS 问题常见的表达形式为:
“给定一个图(树,字符串,矩阵),找到在遍历图的过程中,符合特定条件的数值或路径。”
上面的这个定义有点抽象,举两个例子:
Leetcode 113 Path Sum II
&ldquo;Given a binary tree and a sum, find all root-to-leaf paths where each path&rsquo;s sum equals the given sum.&rdquo;
“给定一个有向无环图(二叉树),找到在遍历图的过程中,符合特定条件的数值(路径和等于 sum )”
Given the below binary tree and sum = 22, input: 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1 output: [ [5,4,11,2], [5,8,4,5] ] Leetcode 200 Number of Islands</description>
</item>
<item>
<title>二分查找解题模式</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F/</link>
<pubDate>Thu, 04 Jul 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F/</guid>
<description>概述 二分查找是 Leetcode 常见的题型,难点有二,第一是编写正确的二分查找程序,第二是想到用二分查找来解这道题,后者明显更难。
辨别问题 先分析二分查找算法的使用场景:
从一个有限的递增区间中,找到符合要求的极值。
我们需要从题目中找到有限递增区间以及目标,先从最基础的二分查找程序开始,
Leetcode 704. Binary Search
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a function to search target in nums. If target exists, then return its index, otherwise return -1.
给定一个递增数组以及一个目标值,如果目标值在数组内,则返回其索引值,否则返回 -1。
Input: nums = [-1,0,3,5,9,12], target = 9 Output: 4 Explanation: 9 exists in nums and its index is 4 有限递增区间是 [-1, 0, 3, 5, 9, 12],目标是找到值等于 9 的元素。</description>
</item>
<item>
<title>单调队列解题模式(未完成)</title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/%E5%8D%95%E8%B0%83%E9%98%9F%E5%88%97%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F/</link>
<pubDate>Thu, 04 Jul 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/leetcode/%E5%8D%95%E8%B0%83%E9%98%9F%E5%88%97%E8%A7%A3%E9%A2%98%E6%A8%A1%E5%BC%8F/</guid>
<description>概述 496. Next Greater Element I</description>
</item>
<item>
<title>App Store 无用评价过滤</title>
<link>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/app-store-%E8%AF%84%E4%BB%B7%E8%BF%87%E6%BB%A4%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Thu, 20 Jun 2019 00:19:14 +0800</pubDate>
<guid>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/app-store-%E8%AF%84%E4%BB%B7%E8%BF%87%E6%BB%A4%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description>App Store 的垃圾评论不是一天两天了,垃圾短信
苹果的不作为 我不清楚为什么苹果并没有用心在过滤垃圾评价这里,垃圾评价多得我几乎找不到正常的评价,而且我在美国区的 APP STORE 找不到这些情况,我不确定是因为美国区刷评价情况比较少(但是 刷亚马逊评价的多得一塌糊涂,即使现在比较少,将来刷评价的也会多)还是苹果放弃了这一块。苹果或者觉得减少垃圾评价对它的业绩毫无帮助,作为一名开发者,当看到别的应用因为刷评价排到搜索的前面而自己却在后面的时候,很难开心得起来。这篇文章让我们用一些简单常用的方法来识别垃圾评价,顺便学习下数据分析吧。
目标 看起来我们的目标很一致,过滤垃圾评价,保留正常用户的真实评价。不过这里对于“真实”可能大家的理解不一致,每个用户的背景以及受教育程度同,评低分的原因也各不相同(有的可能因为这个应用要求评分就评低分,有的可能仅仅是发泄情绪,有的为了让评论能置顶所以评5星,但是里面的实际内容却是差评),所以这里我们的目标并不是筛选海军/机器人刷的评论,而是找出对用户最有用的评论,这里在 App Store 的默认评价也可以看到,虽然,往往出来的都没有用。
结果 虽然最终我们会通过我实现的代码来找到这些有用的评价,但是代码以及算法本身却不是最重要的,如何理解数据并且懂得对数据进行不同维度的分析才是最应该学习的地方,这篇文章不会涉及太多代码以及技术细节,你们可以把它当成一个即开即用的工具就好,问题是如何使用这些工具,以什么顺序,什么方式来使用,如何测量最终的结果。
有用的评价 直接想什么是有用的评价可能不是太容易,我们先判断什么是没用的
评价字数过短或者过长的 这点一开始大家不一定认同,不过我们对比下知乎以及Quora,你会发现知乎上有非常多抖机灵的回答,通常依旧是一两句话。但是 Quora 却规定回答必须超过一定的长度,硬性地确保回答的信息量达到一定标准。虽然这是产品选择的不同,不过从一定程度也能够杜绝一些纯粹发泄情绪或者无用的评价信息。同样,防止过长以及不相关的评价是防止用户在发现限制后乱填内容,我们也能通过其他方式来检测到。或者说,就苹果现在的情况来说,越少的评价反而更好。
语法错误问题严重的,语句不通顺 这点我想大家没有异议,语法错误严重的,语句不通顺代表没有深思熟虑思考过就提交的。
评价与应用主题不相关的 评论本身重复程度过高
评价之间重复程度过多
打广告的,让大家去哪里下载什么的 这个防止恶意刷评价(无论是刷自己还是刷竞争对手)
当然,还有其他标准,这里只列举最常见的几种。中国区的评价数量都较多,我们可以列举最有用的50条评价,我想已经足够大家去了解这个应用的情况。让我们一条条来分析,</description>
</item>
<item>
<title>我们只追逐豪门(译)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E6%88%91%E4%BB%AC%E5%8F%AA%E8%BF%BD%E9%80%90%E8%B1%AA%E9%97%A8%E8%AF%91/</link>
<pubDate>Sat, 02 Mar 2019 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E6%88%91%E4%BB%AC%E5%8F%AA%E8%BF%BD%E9%80%90%E8%B1%AA%E9%97%A8%E8%AF%91/</guid>
<description>两年前,我在 HN 看到这篇文章,至今仍时常出现在我的脑中。文中谈到了问题在国内同样也在发生,我了解的许多公司招聘的时候只专注于“大厂”,“211/985” 这些标签,而不是求职者的真实能力。在某程度上,这也限制了阶级向上流动。这篇文章提出了一些有趣的解决方法,以下是原文翻译:
我的好友 Mike 最近在找一份新工作,他刚刚以合同工的身份被微软解雇,我身边不少朋友也有类似的遭遇。和我一样,Mike 也有十一年的硬件行业工作经验,不同的是他并不认识那些身在豪门的工程师。所以我把他的简历内推给了一些急需招聘的工程师朋友。朋友们都认为 Mike 的简历不错,但大多数招聘人员在却在简历关就拒绝了他。
被拒绝的原因通常是:
“没有相关领域的工作经验。”
“涉猎太广泛,支付,移动开发,数据分析和用户体验都有接触过。”
“通常来说合约工技术水平不高。”
其中有一家公司 TrendCo,与其他数以千计的公司同样声称拥有世界一流的工程师,并且只会雇用最好的工程师。这几个回应是他们的招聘人员通过工程师传达给我的,工程师对这些回应也表示不满。但这确实代表了一大批公司对 Mike 的普遍反应。
&gt; “Mike 是一名 .NET 开发者,我们不喜欢有 Windows 开发经验的工程师” 我熟悉 TrendCo 的现状,不少员工都说已经火烧眉头了,他们核心系统的 QPS 低于 1k,高负载下偶尔会宕机。Mike 研发过可以承受更高数量级负载的系统,但他的经验显然是,无关紧要的。 我曾经面试过 TrendCo,他们的吸引点之一是它是一个创业公司,你能够接触各种各类的工作。TrendCo 需要聘请多面手,但 Mike 的对于他们来说显然是,涉猎过多。
和第一点一样,TrendCo 还抱怨 Mike 不是他们想要的类型,TrendCo 的大部分员工都是刚刚从一些最好的学校毕业 0-2年 的工程师。他们没有太多招聘的经验,大多数时候他们都选择从一些热门的大公司中进行招聘,而不是一些像微软这些无聊的公司。
无论你认为这种偏向某种类型而且拒绝其他类型的做法是否不妥,正如 Thomas Ptacek 所指出的,如果你目标人才的类型与其他人的类型相同,那么“你正在与市场上最富有的(或资金过剩的)科技公司竞争“。
如果你看看萌新工程师的招聘数据,脸书给刚毕业的工程师超过 10万 美金一年,10万 的签约奖金,15万 的受限股票,加起来大概 16万 美金一年。而且第一年 24万 美金,谷歌也给了大概 10万 一年,1万 左右的签约奖金,18万7千 的受限股票,虽然比脸书低点,但是比很多那些宣称只招聘最优秀的工程师的公司要高得多,而且他们为了争夺工程师还可能会给更高,一些有经验的工程师得到的工资远比你想象的要高,如果你不是招聘人员,他们的薪酬水平很可能会高于您的预期。</description>
</item>
<item>
<title>Python 是如何运行的(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E7%BC%96%E7%A8%8B%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AD%A5/python%E6%98%AF%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E7%9A%84/</link>
<pubDate>Wed, 16 Jan 2019 00:21:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E7%BC%96%E7%A8%8B%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AD%A5/python%E6%98%AF%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E7%9A%84/</guid>
<description>Python 是我以及许多人第一门深入学习的编程语言,在我初学 Python 的时候,并不需要了解它的运作原理,而随着我了解得越多,我想知道的也变得越多。我阅读了不少 Python 的源代码,也阅读了很多相关的文章,这篇文章会略过代码,从高层次的角度给各位一些指引。
世界上最好的编程语言是什么,取决于你用来做什么,不过正确的答案往往是问你这个问题的人最喜欢的语言。如果你学习编程是为了乐趣的话,那么 Python 会给你很多乐趣。从服务器后端,机器学习,数据分析都有它重要的位置,而且可读性非常高。如果你是为了找份工作的话,学习什么语言就根据你所在地的招聘信息来定了,一般来说 Golang, Java, C++ 这几个都不错。Guido van Rossum 在 1989 年趁着家人去旅游写下的第一个版本是用 C 语言实现的(感谢那次旅游),至今最流行的实现也是这个版本,称为 CPython。
不过无可否认的是,Python 正慢慢变成全球最受欢迎的语言,没有之一。
那么计算机是如何理解并且运行 Python 的源代码的呢?分为编译与解释两个过程,首先,计算机按照顺序从上到下一条条执行指令的,计算机的优点是它能迅速地完成一些重复的工作,例如 1秒钟 进行百万次的加减,赋值。由于计算机不能像人类一样理解过于抽象的内容,例如函数,类(即使可以,也会非常耗时),所以需要把复杂,抽象的源代码简化为机器能够理解,能够快速运行的代码,这个过程就是 Python 的编译过程。
tokenizer 过程 编译器首先要理解源代码,首先要分析每个字符串的含义,例如 def 和 class 这类关键字的含义与普通的字符串就不一样。
举一个例子 hello.py
def say_hello(): print(&quot;Hello, World!&quot;) 下面我们使用 Python 自带的 tokenize 模块分析 hello.py,我们可以看到 tokenize 模块把 &ldquo;Hello, World&rdquo; 当成 STRING 类型,而 def, say_hello 等当成了 NAME 类型。
$ python -m tokenize hello.py 0,0-0,0: ENCODING 'utf-8' 1,0-1,3: NAME 'def' 1,4-1,13: NAME 'say_hello' 1,13-1,14: OP '(' 1,14-1,15: OP ')' 1,15-1,16: OP ':' 1,16-1,17: NEWLINE '\n' 2,0-2,4: INDENT ' ' 2,4-2,9: NAME 'print' 2,9-2,10: OP '(' 2,10-2,25: STRING '&quot;Hello, World!</description>
</item>
<item>
<title>微博抽奖到数据分析</title>
<link>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E5%BE%AE%E5%8D%9A%E6%8A%BD%E5%A5%96%E5%88%B0%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/</link>
<pubDate>Wed, 14 Nov 2018 00:19:14 +0800</pubDate>
<guid>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E5%BE%AE%E5%8D%9A%E6%8A%BD%E5%A5%96%E5%88%B0%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/</guid>
<description>感谢王思聪微博抽奖这个热点事件,我们获得了一个学习数据分析的机会😄😄。开始之前,我们先回顾一下这个事件:IG 战队在 LOL 比赛中夺冠,某王姓土豪发布了微博,从转发者中抽取 113名 用户送现金。
我们可以看到大概有 2200万 人转发了该微博,开奖之后,出现了奇怪的事情,中奖者有 112名 女生,仅有 1名 男生。 这个悬殊的比例引起了一些争议:
有的人说王思聪在选后宫,只抽女生。 有的人从直觉出发说微博抽奖明显有猫腻,再怎么男生用户也不可能那么少。属于暗箱操作,虚伪抽奖,欺诈行为。 有的人从历史数据中发现微博抽奖女生中奖的概率要比男生大得多,而且得出了少女 &gt; 小孩 &gt; 男人的用户价值鄙视链。发表了微博抽奖扭曲了价值观之类的言论。 有的从新浪的角度出发,表明这只是新浪为了清除僵尸粉的措施,不小心把大部分男粉丝清除掉了。 有的人认为抽到的都不是 ig 的粉丝,这样就像把演唱会门票送给不是粉丝的人一样,并不公平。 作为一名旁观者,如果没有一定的统计与概率论背景,不太容易明白他们在说什么,更不用说判断对错了。如果你本身就不喜欢微博,会更容易认同诋毁微博方的观点。不过,这种根据自己的喜好所得出的结论是自欺欺人而不是真相。统计学是一个工具,而且是可以根据使用者的主观意识去操控的工具。我希望通过这篇文章通俗地解释整个事件背后的原理,让读者得出自己的结论,独立思考远比随波逐流重要。更好的消息是,这篇文章不需要任何数学背景知识。可以说,只要在今年双十一懂得如何凑单,都能看懂。(好吧,凑单其实好难,😂😂)
小型微博 **要知道这个抽奖有没有猫腻,我们先要知道怎么的结果是有问题的,怎样的是正常的。**我们坐上时光机器,回到微博刚开始发展的时候,那时候微博一共只有 100名 用户,刚好 50名 男生 50名 女生,
微博为了庆祝这个里程碑举办了一次抽奖活动,从所有用户中里面随机抽取 100名 中奖者。毫无疑问地,中奖者的男女比例一定是 1 比 1,因为把所有用户都抽到了,皆大欢喜。
慢慢越来越多人加入微博,现在已经有 1000名 用户,男女用户比例不变,还是 1 比 1。微博举行第二次抽奖,这时候还是从所有用户中随机抽取 100名 中奖者,那么这个时候,中奖者的男女比例是多少呢?我们不知道,有可能还是 1 比 1,有可能 60名女生,40名男生。也有可能全是女生。不需要用到数学公式,我们知道,**男女用户数量相近的情况会比全是女生出现的概率要大。**为什么?想象你参加一个游戏。
一个箱子里装了 50个 红色球代表女生 ,50个 蓝色球代表男生。充分混合后,要求从箱子里连续抽出 50个 红色小球。
额,这太难了吧。你说。因为抽的时候必须**靠运气避开所有蓝色球。**好吧,那我修改下规则,同样的条件下允许你错 10次,抽 50次 里面有 40个红色球就好。这虽然还是很难,但是要比一开始要简单,**因为这种情况允许你犯错 10次,所以成功的机会更高。**回到刚刚微博抽奖的问题,抽 100名用户,要求全部是女生的话,必须避开另外的 500名 男生用户。所以这种情况出现的概率比允许犯错(90名 女生,10名 男生)要出现的概率更低,具体多低呢?下面这个图片显示了中奖者女生数量出现的概率大小,越高代表概率越大。</description>
</item>
<item>
<title>DNS查询</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/dns%E6%9F%A5%E8%AF%A2/</link>
<pubDate>Sun, 11 Nov 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/dns%E6%9F%A5%E8%AF%A2/</guid>
<description>当你在浏览器输入 www.apple.com。按下回车之后,浏览器跳到苹果的官网,把 iPhone 的介绍和图片显示出来。浏览器是如何通过这个域名找到 iPhone 的内容并且正确显示呢?第一步就要经过 DNS 查询。
DNS 查询 DNS 查询其实很好理解,生活上比较贴近的例子就是通讯录,我们通常能够记住自己的电话号码,不过要找其他人的电话,一般都需要通过通讯录。我们输入朋友的名字,通讯录就会找到对应的电话号码。在这里,通讯录担任了把难记的电话号码转成好记的人名的工作。DNS查询其实也一样,负责把难记的 IP 地址转成容易记忆的域名。
互联网刚开始发展的时候,联网的电脑加起来才几千台(没错~)。每台电脑都需要保存一个文件(称为 hosts 文件)用作记录域名对应哪个IP地址(就像通讯录记录人名对应哪个电话号码)。
www.enginego.org 104.24.120.11(每一行分别对应着域名和 IP 地址) www.apple.com 119.145.144.223 www.ieee.org 23.38.177.118 所以早期的时候,当我们在浏览器输入域名的时候,浏览器会先查询 hosts 文件,找到该域名对应的 IP 地址。然后再通过 IP 地址获取到服务器里面的内容并且显示在浏览器中。不过问题随着互联网的发展慢慢显现了:
每个小时都有新的域名被注册,新的主机加入互联网,现在已经超过 10亿 台设备接入互联网,如果每次查询的话都要从文件中找到对应的 IP 地址,那么会非常耗时,而且 hosts 文件也会变得非常大。 大部分的网站用户根本不会浏览,每上线一个小网站就要求全球的电脑都更新 hosts 文件这样显然小题大做了。 为了解决这几个问题,现代的 DNS 查询会按顺序经过 3个 步骤,一旦查询到结果,就会跳过剩下的步骤:
先查询浏览器有没有保留缓存
如果你之前访问过这个网站,那么浏览器会保存网站对应的 IP 地址,这样下一次访问就能直接从缓存中取出地址,减少查询 IP 地址的时间。
查询本地的hosts文件
如果hosts文件有对应域名包含的 IP 地址,例如
www.apple.com 119.145.144.223 那么计算机就会直接使用这个 IP 地址,你可以查看自己电脑的 hosts 文件,不同系统分别存储在不同的位置</description>
</item>
<item>
<title>终端</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E7%BB%88%E7%AB%AF/</link>
<pubDate>Sun, 11 Nov 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E7%BB%88%E7%AB%AF/</guid>
<description>命令行界面 在计算机技术刚发展的时候,并没有像现在手机/计算机那么容易上手的操作界面。大家都需要通过一个黑乎乎的程序输入命令,然后等待计算机执行。
上面我运行了 ls 这个命令,这个命令的作用是列出当前路径下的所有文件。可以看到里面包含了 10个 文件。
└── 当前目录 ├── README.md ├── config.toml ├── data ├── layouts ├── static ├── archetypes ├── content ├── docs ├── public ├── themes 运行不同的程序需要使用不同的命令。在我们平时使用的操作系统中,如果需要打开一个叫做 normal.txt 的文本文件,双击文件就能打开文件看到内容了,不过在命令行界面中,需要使用 cat 命令:
cat normal.txt 那么文本的内容会显示出来。其实终端就是一个能够接收输入(键盘,鼠标),能够通过特定指令运行计算机功能的软件。
亲自试试吧 你可以尝试先打开自己计算机的终端:
macOS: 同时按住&quot;control&quot;+&quot;space&quot;键,在搜索框输入termianl,&ldquo;回车&rdquo;
Windows 7:打开&quot;开始&quot;菜单,在搜索框里输入cmd,&ldquo;回车&rdquo;
Windows 8+:同时按住&quot;win&quot;+&quot;Q&quot;键,然后在弹出的搜索框里输入cmd,&ldquo;回车&rdquo;
成功打开之后,光标会停留在某一行。类似:
WindsondeMacBook-Air:~ windson$ | 因为和计算机交互需要遵守一定的指令规则,终端默认会运行一个程序,常见的是 Bash(Bourne Again SHell)或者 sh,你可以尝试输入一个命令,然后让终端执行。
macOS: &ldquo;ls&quot;+&quot;回车&rdquo;
Windows: &ldquo;dir&quot;+&quot;回车&rdquo;</description>
</item>
<item>
<title>macOS 安装 Python</title>
<link>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85python/macos-%E5%AE%89%E8%A3%85-python/</link>
<pubDate>Wed, 22 Aug 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85python/macos-%E5%AE%89%E8%A3%85-python/</guid>
<description>安装 Python 访问 Python 下载地址,如下图:
点击上图蓝色框中的链接,像普通文件一样下载即可。下载完毕之后双击该安装包(一般情况下在下载目录中),出现下图,点击继续:
下图包括软件的基本介绍,点击继续。
下图包括软件的使用协议,点击继续,接着软件会弹出一个小窗口,需要你同意协议,点击同意按钮即可。
下图选择安装的地方,macOS 一般只有一个盘,点击继续即可。
出现下图后,点击安装,软件会弹出一个小窗口,要求输入管理密码,你输入管理密码之后,回车,然后软件会开始安装,稍等几分钟。 显示下图界面则代表安装成功了。如果没有安装成功的话请仔细核对以上的步骤重新安装一次。 </description>
</item>
<item>
<title>macOS 安装编辑器</title>
<link>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/macos-%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/</link>
<pubDate>Wed, 22 Aug 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/macos-%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/</guid>
<description>安装Atom编辑器 访问 Atom 下载地址,点击下图中的 Download 按钮
下载完之后安装,安装之后打开 Atom 程序,出现下图,点击蓝色框中的 Install a Package
在左边的搜索框中输入 script,然后点击右边的 Install,稍等5分钟
安装成功
安装成功之后可以尝试运行,在 Atom 中新建名为 first.py 的文件。粘贴这段代码进去:
print('hello world') 如下图:
然后使用快捷键&quot;command&rdquo; + &ldquo;i&quot;就能运行代码了。你可以看到上图的最下面显示了:
hello, world [Finished in 0.276s] </description>
</item>
<item>
<title>Windows 安装 Python</title>
<link>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85python/windows-%E5%AE%89%E8%A3%85-python/</link>
<pubDate>Wed, 22 Aug 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85python/windows-%E5%AE%89%E8%A3%85-python/</guid>
<description>安装 Python 访问 Python 下载地址,点击下图中蓝色框的链接,像普通文件一样下载即可。
下载完毕之后双击该安装包(一般情况下在下载目录中),出现下图,勾选 Add Python 3.7 to PATH 之后点击 Customize installation。
这是安装的选择,直接点击 Next
点击 Browse 选择安装路径,推荐安装在非系统盘,下面的例子安装在 E 盘,你也可以根据自己的情况选择路径,然后点击 Install。
这时候就会开始安装:
恭喜,安装成功!
</description>
</item>
<item>
<title>Windows 安装编辑器</title>
<link>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/windows-%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/</link>
<pubDate>Wed, 22 Aug 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/windows-%E5%AE%89%E8%A3%85%E7%BC%96%E8%BE%91%E5%99%A8/</guid>
<description>安装 Atom 编辑器 访问 Atom 下载地址,点击下图中的 Download 按钮
下载后双击打开就可以了,软件的界面如下:
点击左上角 File 然后 new 来创建新的文件,接下来就可以在文档中写代码并且保存。
</description>
</item>
<item>
<title>什么是编程(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E7%BC%96%E7%A8%8B%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AD%A5/%E4%BB%80%E4%B9%88%E6%98%AF%E7%BC%96%E7%A8%8B/</link>
<pubDate>Fri, 01 Jun 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E7%BC%96%E7%A8%8B%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AD%A5/%E4%BB%80%E4%B9%88%E6%98%AF%E7%BC%96%E7%A8%8B/</guid>
<description>我常常去参加一些编程活动,意外的是,这些活动中我接触到很多想学习计算机的朋友。他们想学习编程,但是常常被计算机不同的范畴弄得头昏脑胀,**先学编程语言呢,还是数据结构和算法,先学建网站,写 APP,还是大数据,人工智能?**这里我推荐 Crash Course 计算机科学的视频,它从原理介绍了编程的起源以什么是编程,非常有趣和浅显易懂,适合完全零基础甚至初中生去看。
计算机科学速成课 (YouTube) 计算机科学速成课(中文字幕) 在电子计算机还没有被发明的时候。计算机指的并不是我们现在常识中的电脑硬件,而是使用计算器计算的人(大多是女性,我猜因为女性比较细心,容易管理)。她们会被分配一些数据和需要计算的步骤,接着按照步骤耐心地操作计算器,然后写出结果。如果你看过电影《隐藏人物》应该会对一大堆女生拿着计算器埋头计算的场景有印象。不过,你不会把用计算器按下数字得到答案当作在编程,只会把它当成是使用工具的一种方式,但是实际上它与编程并没有太大的区别。举个例子,我们现在需要把一个文本文件的数据转换为Excel表格保存。文本的内容是:
Shall I compare thee to a summer’s day?
Thou art more lovely and more temperate.
Rough winds do shake the darling buds of May,
我们想把这些数据转换成Excel文件:
A1 A2 A3 Shall I compare thee to a summer’s day? Thou art more lovely and more temperate. Rough winds do shake the darling buds of May, 与按计算器不一样的是,这里的数字变成了三行的文本,乘法法则变成了格式转换。得到的结果变成了Excel的文件。不过它们两者都遵循三个原则,接受数据,处理数据,输出数据,要解决这个问题就像按计算器一样简单:</description>
</item>
<item>
<title>Python爬虫基础(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E7%88%AC%E8%99%AB/%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80/</link>
<pubDate>Fri, 11 May 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E7%88%AC%E8%99%AB/%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80/</guid>
<description>这篇文章要求读者有一定的HTML基础知识,如果之前没有学习过HTML的话,可以先花一些时间在这里学习。当进行数据分析统计,或者数据收集之前,我们需要有数据。(这不是废话吗)数据的来源既可以是搜寻已有的数据集,也可以自己去收集数据。计算机中爬虫就是获取目标应用数据的方式,例如当你要做一个项目,你觉得知乎现在广告太多了,回答下面都是二维码,你打算统计答案中包含二维码占全部答案的比例。那么如何获取这些数据呢?第一个方法当然可以像平时一样一个个答案点开,这样的问题是效率太低。如果要统计1万个答案的话怎么办,再如果下次统计的是包含广告链接的话难道要重新一个个点开吗?这显然不现实。有没有一种高效率的方法解决这个重复性的问题。
没有
好啦,我只是开玩笑,怎么可能没有呢?:D,爬虫就是一个方法,如果你之前接触过Python爬虫,应该听过一堆requests, Scrapy, Asyncio, Beautifulsoup等库,也听过多线程,多进程,异步IO爬虫什么的。应该怎么选择呢?先不用急。如果你问这个问题,代表你对爬虫了解得不多,我们一步步从零开始介绍爬虫,之后也会涉及这些高级的爬虫。
为了方便读者,我搭建了一个非常简单的网站,教程列表,它的结构非常简单,包括一个首页和三个子页面。
/(首页) │ └── 子页面 ├── 1.html ├── 2.html ├── 3.html 点击首页的不同链接就跳转到对应的子页面。
第一个小任务 我们的第一个小任务是获取首页中所有子页面的标题,也就是获取
DNS查询 Ping命令 终端 好吧,这个任务看起来很简单,不写程序也能几秒钟完成,用鼠标复制粘贴就可以,不过先跟着我们一步步来。在首页空白处点击鼠标右键,然后点击查看网页源代码,可以看到一些HTML代码。
&lt;html&gt; &lt;head&gt; &lt;title&gt;首页&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h2&gt;教程列表&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;../1.html&quot;&gt;DNS查询&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;../2.html&quot;&gt;Ping命令&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;../3.html&quot;&gt;终端&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/body&gt; &lt;/html&gt; 浏览器的作用就是根据这些代码渲染成我们平时看到的网站,可能包括背景,字体的大小,颜色。爬虫要做的其实也一样,不过要简单一点,爬虫是抽取HTML中出现的数据。当你观察上面的HTML代码的时候,发现我们要获取的标题都在&lt;li&gt;标签的&lt;a&gt;标签里面。**所以我们的任务就变成,
获取页面的HTML代码 从HTML代码中获取所有&lt;a&gt;标签中的文字 刚刚我们是通过浏览器获取源代码,如何用程序获取呢?第一个方法是使用Requests库,之后我们会介绍使用其他库获取的方式,一开始我们先从最简单开始。
打开终端
新建一个文件夹crawl,并进入文件夹
运行pip install requests(如果遇到错误信息的话,请把错误信息的最后一句复制到搜索引擎搜索解决方案,这也是锻炼编程与解决能力的一步)
遇到类似这样的信息代表安装成功啦,撒花。
Collecting requests Downloading https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl (91kB) 100% |████████████████████████████████| 92kB 208kB/s &hellip; Installing collected packages: certifi, chardet, urllib3, idna, requests Successfully installed certifi-2018.</description>
</item>
<item>
<title>Ping命令</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/ping%E5%91%BD%E4%BB%A4/</link>
<pubDate>Wed, 25 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/ping%E5%91%BD%E4%BB%A4/</guid>
<description>基础版 进阶版 基础版 ping命令 有时候当我们无法上网,会计算机的朋友会说,你ping一下网关,或者你ping一个网站看看。ping这个命令,其实是操作系统自带的命令之一,常用作在网络诊断中。你可以在终端中输入:
ping www.enginego.org 你可以把&quot;www.enginego.org&quot;替换成其他任意的域名,终端会显示:
PING www.enginego.org (104.24.120.11): 56 data bytes 64 bytes from 104.24.121.11: icmp_seq=0 ttl=54 time=170.383 ms 64 bytes from 104.24.121.11: icmp_seq=1 ttl=54 time=170.053 ms 64 bytes from 104.24.121.11: icmp_seq=2 ttl=54 time=171.298 ms 64 bytes from 104.24.121.11: icmp_seq=3 ttl=54 time=170.352 ms 64 bytes from 104.24.121.11: icmp_seq=4 ttl=54 time=170.636 ms ... 这表示从我的计算机发送64个字节的数据到104.24.121.11 (这个是经过DNS查询后的www.enginego.org的ip地址),从发送到接受对方返回总共经过了170.xxx毫秒。代表www.enginego.org对应的那台服务器是开启并且响应ping指令的。
如果返回:
PING www.enginego.org (104.24.121.11): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3 这就代表连接超时,访问失败。原因有可能是本地计算机网络问题,也有可能是对应的服务器关闭或者不响应ping指令,或者你根本只是输错域名了。</description>
</item>
<item>
<title>协议</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%8D%8F%E8%AE%AE/</link>
<pubDate>Wed, 25 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%8D%8F%E8%AE%AE/</guid>
<description>什么是协议 协议的优点 协议与API 什么是协议 计算机使用了多种多样的协议,大家接触得比较多的是HTTP, TCP/IP, FTP, ICMP等,**计算机中的协议和我们现实生活中签的协议其实挺像,双方按照协议上的约定发送和解析数据。**举个例子,你和你的朋友通过短信约定明天吃饭的时间地点:
明天
中午12点
在公司等
即使改变文字的顺序
明天
在公司等吧,
中午12点
一般人也能理解。不过计算机不一样,你可以把计算机当成患强迫症的朋友,它会要求你发的信息一定要符合一个规则:
日期(两个字)
时间(四个字)
地点(四个字)
那么信息必须按照这个规定发送:
明天(日期)
上午9点(时间)
在公司等(地点)
只要你和朋友都愿意遵守这个约定发送和接受信息,那么你们就互相遵守了协议。
协议的优点 **无论对计算机或者人类来说,信息都变得有序和容易处理。**当我们知道信息遵守协议A的时候,我们不需要阅读信息都知道前两个字是日期,接着是四个字的时间,最后是四个字的地点。
举个常见的例子,当你使用浏览器访问www.apple.com,浏览器其实是按照HTTP协议的约定向苹果服务器发出信息,协议要求内容:
第一行:请求方法和协议版本(8个字节) 第二行:请求的URL(30个字节) 第三行:缓存策略(30个字节) ... 实际发送的文字内容是:
GET / HTTP/1.1\r\n(请求方法和协议版本) Host: www.apple.com\r\n(请求的URL) Connection: keep-alive\r\n(缓存策略) Pragma: no-cache\r\n Cache-Control: no-cache\r\n Upgrade-Insecure-Requests: 1\r\n User-Agent: Mozilla/5.</description>
</item>
<item>
<title>路径</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E8%B7%AF%E5%BE%84/</link>
<pubDate>Wed, 25 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E8%B7%AF%E5%BE%84/</guid>
<description>计算机文件存储 当前路径 绝对路径和相对路径 切换路径 计算机文件存储 计算机文件的存储结构如下:
/(根目录) │ └── usr ├── foo │ ├── first.md │ └── second.md ├── bar │ ├── sunkist.toml │ ├── cherry.toml 我们平时使用计算机,都会接触到文件夹以及目录,上图中,**计算机中只有一个usr文件夹,usr 文件夹中又包含了foo和bar两个文件夹,分别包含两个文件。**路径指的是文件/文件夹存放在计算机中的位置。要描述first.md这个文件的位置可以有两种方式,绝对路径和相对路径,其中绝对路径是
/usr/foo/first.md 每个文件/文件夹都只有一个绝对路径,无数个相对路径,如果你不理解的话,没关系,我们从头一步步开始介绍。
当前路径 我们平时用导航软件的时候,首先需要知道的是现在的位置,在计算机中也是一样,我们首先要知道自己在哪里,当你打开终端的时候:
(masOS) WindsondeMacBook-Air:fun/ windson$ (Windsons) C:fun\: 这里的&quot;fun/&ldquo;和&quot;C:fun&quot;指当前执行命令的地方,也就是你的当前路径。可以通过命令来查看当前路径的绝对路径
(masOS) WindsondeMacBook-Air:foo/ windson$ pwd /usr/foo/ (Windsons) C:foo\: cd \usr\foo\ 当你在终端中输入命令,默认命令针对的是当前路径。例如输入&quot;ls&rdquo;,计算机会理解成&quot;ls /usr/foo/&quot;(Windows下输入&quot;dir&rdquo;,理解为&quot;dir \usr\foo&quot;),两个命令都会列出当前路径下的所有文件名称。
绝对路径和相对路径 有一天,Cherry在路上遇到Sunkist,它问Sunkist的公司地址在哪里,Sunkist可能有两个答案:
以这里为起点,西南方向500米的石室大厦 中国广东省广州市思哲路石室大厦 第一个答案以当前的位置为起点所描述的称为相对路径。根据Sunkist当前的位置不一样,它回答的相对路径会不一样,第二个答案从国家到省份城市巨细无遗地描述称为绝对路径**,一个文件除非被移动,否则绝对路径是不会变化的。每个文件/文件夹在一台计算机中可能会有无数个相对路径,但是只有一个绝对路径。**回到文章最初的文件存储结构,first.md的绝对路径是
/usr/foo/first.md (first.md的绝对路径) 这是从根目录&rdquo;/&ldquo;开始一层一层描述的位置。了解相对路径之前先有一点预备知识。在路径命令中&rdquo;.&ldquo;以及&rdquo;..&ldquo;这两个符号有特殊意义,**分别代表当前目录以及上一级目录。**如果当前路径是&rdquo;/usr/foo/&rdquo;
/usr/foo/ (当前路径) ./ = /usr/foo/ (当前目录) .</description>
</item>
<item>
<title>hook(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/hook/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/hook/</guid>
<description></description>
</item>
<item>
<title>内存(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%86%85%E5%AD%98/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%86%85%E5%AD%98/</guid>
<description></description>
</item>
<item>
<title>堆栈(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%A0%86%E6%A0%88/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%A0%86%E6%A0%88/</guid>
<description></description>
</item>
<item>
<title>嵌套字(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%B5%8C%E5%A5%97%E5%AD%97/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%B5%8C%E5%A5%97%E5%AD%97/</guid>
<description></description>
</item>
<item>
<title>抓包(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E6%8A%93%E5%8C%85/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E6%8A%93%E5%8C%85/</guid>
<description></description>
</item>
<item>
<title>操作系统(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</guid>
<description></description>
</item>
<item>
<title>环境变量(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/</guid>
<description></description>
</item>
<item>
<title>进程(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E8%BF%9B%E7%A8%8B/</link>
<pubDate>Sun, 08 Apr 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E8%BF%9B%E7%A8%8B/</guid>
<description></description>
</item>
<item>
<title>理解贝叶斯分类</title>
<link>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E7%90%86%E8%A7%A3%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%88%86%E7%B1%BB/</link>
<pubDate>Mon, 26 Mar 2018 00:19:14 +0800</pubDate>
<guid>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E7%90%86%E8%A7%A3%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%88%86%E7%B1%BB/</guid>
<description>作者:Windson Yang
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处(www.enginego.org)。
贝叶斯模型在机器学习以及人工智能中都有出现,cherry分类器使用了朴素贝叶斯模型算法,**经过简单的优化,使用1000个训练数据就能得到97.5%的准确率。**虽然现在主流的框架都带有朴素贝叶斯模型算法,大多数开发者只需要直接调用api就能使用。但是在实际业务中,面对不同的数据集,必须了解算法的原理,实现以及懂得对结果进行分析,才能达到高准确率。
cherry分类器 关键字过滤 贝叶斯模型 数学推导 贝叶斯模型实现 测试 统计分析 总结 cherry分类器 基础术语: cherry分类器默认支持中英文分类,用作例子的数据缓存中,中文训练数据包含正常,政治敏感,赌博,色情4个类别,英文训练数据包含正常邮件,垃圾邮件两个类别 (训练数据可以通过Google drive下载)。调用非常容易,使用pip安装后,输入句子:
警方召开了全省集中打击赌博违法犯罪活动专项行动电视电话会议。会议的重点是“查处”六合彩、赌球赌马等赌博活动。
&gt;&gt;&gt; import cherry &gt;&gt;&gt; result = cherry.classify('警方召开了全省集中打击赌博违法犯罪活动专项行动电 电话会议。会议的重点是“查处”六合彩、赌球赌马等赌博活动。') Building prefix dict from the default dictionary ... Loading model from cache /var/folders/md/0251yy51045d6nknpkbn6dc80000gn/T/jieba.cache Loading model cost 0.894 seconds. Prefix dict has been built succesfully. 分类器判断输入句子有99.7%的概率是正常句子,0.2%是政治敏感,剩余0.1%是其他两个类别
&gt;&gt;&gt; result.percentage [('normal.dat', 0.997), ('politics.dat', 0.002), ('gamble.dat', 0.0), ('sex.dat', 0.0)] 其中对分类器判断影响最大的词语分别是赌博,活动,会议,违法犯罪,警方,打击
&gt;&gt;&gt; result.word_list [('赌博', 8.</description>
</item>
<item>
<title>编程语言选择(未完成)</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E9%80%89%E6%8B%A9%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Tue, 27 Feb 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E9%80%89%E6%8B%A9%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description>刚开始学习编程的时候,我也很困惑这个问题,有那么那么多的编程语言,常见的有
python ruby php Go c java R &hellip; 我们可以根据你的职业职业规划来选择要学习的语言:
前端工程师 完成设计 后端交互 前端工程师主要的职责是把设计师的设计图实现,当设计师设计完界面之后
完成设计 前端工程师需要用代码来实现设计图,例如界面的布局,按钮的颜色等等。这期间需要和设计师合作交流,讨论哪些方面在工程实现中可能会有困难,可能影响性能这类的因素。
后端交互 完成设计之后,前端工程师需要根据不同的页面以及业务逻辑来与后端交互,这句话什么意思呢?假如你开发的是一个让用户写日记的应用。那么当用户写完日记之后,点击保存按钮,这个按钮要触发一个保存日记的事件,需要把日记根据协议传输到服务器,然后存储在数据库里面。听起来有点复杂,其实非常简单,因为都有通用的工具帮助你完成。
后端工程师。 业务逻辑处理 前端交互 业务逻辑处理 前端交互 运维工程师 数据分析/机器学习工程师 </description>
</item>
<item>
<title>域名</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%9F%9F%E5%90%8D/</link>
<pubDate>Mon, 08 Jan 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E5%9F%9F%E5%90%8D/</guid>
<description>计算机知识往往互相关联,要真正了解域名是什么,必须先了解什么是URI。这里有一些常见的例子。
https://www.apple.com http://www.w3c.org ftp://example.org/resource.txt file:///Users/example/hello.jpg 最后两个大家可能不太熟悉,以最后一个为例子,你们可以尝试把自己电脑中任意的文件拖放到浏览器中,浏览器会去猜这个文件类型,一些常见的文件类型例如图片,浏览器可以判断并渲染出来。同时浏览器的地址栏也会变成file开头。这个例子中的file就是这个URI所使用的协议。常见的协议还有
HTTP 超文本传输协议 SMTP 邮件协议 telnet 终端传输协议 DNS 域名系统协议 DHCP 动态主机配置协议 好吧,我承认部分对于一般大众不是很常见,不过如果你想认真学习编程,起码看到这些名词的时候知道是什么。感兴趣的学生可以前往Lists of network protocols。那么协议又是什么呢?其实协议的本质非常简单。
域名(Domain names)是互联网基础架构的关键部分。它们为互联网上任何可用的网页服务器提供了人类可读的地址。 任何连上互联网的电脑都可以通过一个公共IP地址访问到,对于IPv4来说,这个地址由32位组成(它们通常写成四个范围在0~255以内,由点分隔的数字组成,比如173.194.121.32),而对于IPv6来说,这个地址由128位组成,通常写成八组由冒号分隔的四进制数(e.g., 2027:0da8:8b73:0000:0000:8a2e:0370:1337). </description>
</item>
<item>
<title>服务端</title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E6%9C%8D%E5%8A%A1%E7%AB%AF/</link>
<pubDate>Mon, 08 Jan 2018 00:10:14 +0800</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E6%9C%AF%E8%AF%AD/%E6%9C%8D%E5%8A%A1%E7%AB%AF/</guid>
<description>服务端 很简单,服务器就是一台**24小时运行**,运行着**专为服务器设计的系统**的**高性能计算机**。它也是由内存,硬盘,CPU组成。不过它会根据这台服务器的用途来配置不同的组件。有些服务器专门用来存储文件,图片,那么它就需要更大的硬盘,对CPU的要求就没那么高。有些专门用来进行高密度的计算,例如视频转格式,数据分析那么就要更快的CPU。 服务器会根据不同客户端的请求返回不同的内容,当你使用浏览器访问一个页面的时候,实际上浏览器就是寻找该页面对应的服务器获取相应的图片和文字内容。 客户端 常见的客户端包括浏览器,手机,它请求服务器需要的资源,然后客户端解析返回的内容并且显示给用户。 </description>
</item>
<item>
<title></title>
<link>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%A6%82%E4%BD%95%E8%BD%AC%E8%A1%8C%E4%B8%BA%E7%A8%8B%E5%BA%8F%E5%91%98/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.enginego.org/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%A6%82%E4%BD%95%E8%BD%AC%E8%A1%8C%E4%B8%BA%E7%A8%8B%E5%BA%8F%E5%91%98/</guid>
<description>如何转行为程序员
我大学的专业并非计算机相关,从转行到得到第一份程序员的工作花了很多时间,经过了多年之后回过头看,走了不少弯路。如果你是非计算机专业却想转行为程序员的话,这是我个人的几点建议。
理解热爱 转行之前你先问自己,为什么想要转行为程序员。你真的喜欢编程吗?转行为程序员的人非常多,你有足够的意志力打败他们吗?大多数程序员的工资并没有想象中那么高,而且工作时长也很长。需要经常熬夜加班。你能接受吗?我听过医学生和我说他想转行,因为觉得我们看起来很酷。我觉得这不是一个好原因。可能被电影渲染得多,大家只看到酷的程序员或者他们酷的一面,而没有看到这个行业辛苦的一面。搜索下程序员加班以及程序员中年危机会给你更好的认知。程序员我偶尔会看到这样的转行原因:“因为我编程实现了xxx,给我带来了成就感,所以我喜欢编程”。这本身并没有问题,但是错把学会一件新鲜事物,完成一件事带来的成就感理解为热爱编程那就大错特错了。其实无论什么行业,第一次设计出海报,,还是用毛笔写了几个自我感觉不错的字,或者仅仅是人生中第一次投中三分球都能带给你成就感。这与相应的行业并没有直接的关系。而且容易给你一种错觉,编程就是这样,按照教程一步步写项目,上线。然后下一个项目。那是因为新手项目故意忽略了那些枯燥的,带给你挫折感,但是又必须的东西,例如撰写文档,API 调试,版本控制,测试用例,代码重构等。编程并不需要超乎常人的智商,但是需要极其的耐心和锲而不舍的精神。我忘了多少次在电脑前因为不知道代码哪里出了问题而崩溃。不过,这也是磨练个人逻辑思维的方法,在这一次次的崩溃中我学会如何编程,如何调试。而我不知道有没有更好的方法。把热爱当成职业却不一样,例如你热爱篮球,你打球很快乐是因为你能够选择怎样去打球以及什么时候打。如果要求你每天7点起来,先做两小时“与篮球无关”的准备运动,例如力量训练,柔韧度训练,身体对抗。然后每天都要训练4个小时战术。那么你可能发现自己并没有那么热爱篮球。把他当成职业的话你需要忍受背后的辛苦。
良师益友 不管是什么行业,这都是最重要的一点。我初学编程的时候只认识几个计算机专业的朋友,很可惜,后来他们去了实习之后太忙,也没有时间向他们学习。找到合适的老师是非常难的,因为新手的问题不单单是编程本身的问题,更多的是一些工具使用,环境配置的一些“无聊问题”,例如“如何运行 Java”,“如何安装 Python”,“Syntax error 这个报错什么意思?”,这些问题无论是多么有经验的工程师也无法全部解决,都需要依赖搜索引擎自己找答案。所以益友这时候就重要了,因为大家基础都差不多,遇到的问题也差不多。这么能找到这些朋友呢?最简单的方法,找对应的 QQ 群。搜索 Python Java 这些关键字进入里面的 QQ 群。这是我当初没有做的,虽然 QQ 群里面的成员参差不齐,但是起码帮助你缩小了搜索的范围。加十个群,每个群能认识一两个朋友那就够了。当然,他们的想法也不一定成熟,他们喜欢的教材和课程不一定适用你自己,你可以用作参考但需要判断的能力。不仅能互相学习交流,他们还能分享面试经验,简历经验,互联网企业永远都在招聘,有一些工程师会在群里招人,内推远比海投成功率更高。
选对方向 请不要根据热点而选择方向,例如人工智能,区块链。99.9% 它不会让你找到一份工作,因为他的准入门槛极高,大多的在线课程只会教你如何使用一些开源库来实现功能,这固然重要,不过企业更多是需要能理解原理,推导以及理解公式的。那么应该做什么方向,前端还是后端,应该选择什么语言?我给不了一个很好的答案给你,通常来说,前端入门门槛较低,但是门槛较低代表竞争者越多,不一定是好处。我建议根据你想要工作城市的招聘网站的岗位数量来做选择,关键字就是 前端,后端,java,python,c++,php,.net 看看哪些岗位数量比较多。而且当你看了十个岗位描述之后,其实你就知道自己要学习什么了,例如 Java 基本都会要求会语言的基础,Spring。python要求的是django,php的是larvel。网络框架相对好学,主要靠经验积累和看文档的能力。
学会学习 选对教材,市面上的教材,我在这篇文章列举了一些。至于要不要参加培训班,培训班水平层次不齐,大多数都只是照本宣科让你有学习的错觉,大部分还是得靠自己,好处是能找到线下的交流编程的人一起学习。
学会问问题和找答案 互联网的问题在于资源太多而不是太少。新手在编程之前需要先学会如何使用工具找答案以及提问题。就像有一本我力荐的书“如何阅读一本书”一样,你需要在阅读其他书之前先阅读一本书。你需要做的事情其实很简单,第一,把搜索引擎改为谷歌,相信我,用谷歌搜索问题和答案能帮你节省非常多的时间。第二,学习英语,一开始英语不好的时候你可以选择把报错信息,&ldquo;SyntaxError: invalid syntax 问题&rdquo; 加上几个中文字来看到中文相关的搜索结果,当你愿意静下心看的时候,直接用英文搜索结果,你会开始熟悉并且爱上一个叫 Stackoverflow 的网站,他解答了基本所有程序员会遇到的问题。如果你的问题找不到答案,只有两个原因。这个问题太简单或者太难了。大多数情况都是第一种,你需要想清楚问题发生的原因,这也是锻炼逻辑思维的方法。
求职准备 写好简历,做几个有技术含量的项目,即使是跟着教程做也要理解里面的内容。
勇于尝试 去投简历吧。</description>
</item>
<item>
<title></title>
<link>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E4%B8%8D%E5%BA%94%E8%AF%A5%E8%B5%8C%E5%8D%9A%E6%9C%AA%E5%AE%8C%E6%88%90/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.enginego.org/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E4%B8%8D%E5%BA%94%E8%AF%A5%E8%B5%8C%E5%8D%9A%E6%9C%AA%E5%AE%8C%E6%88%90/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E7%9F%A5%E8%AF%86%E7%82%B9/%E6%95%B4%E6%95%B0%E6%B5%AE%E7%82%B9%E6%95%B0%E7%9A%84%E8%A1%A8%E7%A4%BA/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E7%9F%A5%E8%AF%86%E7%82%B9/%E6%95%B4%E6%95%B0%E6%B5%AE%E7%82%B9%E6%95%B0%E7%9A%84%E8%A1%A8%E7%A4%BA/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E7%9F%A5%E8%AF%86%E7%82%B9/%E8%BF%90%E8%A1%8C%E6%97%B6%E6%A0%88/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.enginego.org/%E7%AE%97%E6%B3%95/%E8%B0%B7%E6%AD%8C%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80/%E7%9F%A5%E8%AF%86%E7%82%B9/%E8%BF%90%E8%A1%8C%E6%97%B6%E6%A0%88/</guid>
<description></description>
</item>
</channel>
</rss>