-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
12538 lines (9067 loc) · 566 KB
/
atom.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
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[iOS梦工厂]]></title>
<link href="http://al1020119.github.io/atom.xml" rel="self"/>
<link href="http://al1020119.github.io/"/>
<updated>2017-01-19T16:36:52+08:00</updated>
<id>http://al1020119.github.io/</id>
<author>
<name><![CDATA[iCocos]]></name>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[初次见面-LLVM/Clang]]></title>
<link href="http://al1020119.github.io/blog/2017/01/20/chu-ci-jian-mian-llvm-slash-clang/"/>
<updated>2017-01-20T23:34:34+08:00</updated>
<id>http://al1020119.github.io/blog/2017/01/20/chu-ci-jian-mian-llvm-slash-clang</id>
<content type="html"><![CDATA[<p>做了几个小时的车,终于到了世界上最美的地方-《家》,虽然有点累,但是还是很开心,总有种说不出的激动。</p>
<ul>
<li>虽然过年,但是像我这么爱学习的孩子,肯定不会停止学习,因为在车上用电脑看了孙源将的Clang的视频,所以打算自己也去摸索一下,哪怕是瞎扯一番,希望以后也有机会能用到实战或者工作中。</li>
</ul>
<p>开始之前,祝大家新年快乐,身体健康,万事如意,也祝各位单身狗早日脱单(虽然我也是单身狗),相信过年都还坐在电脑前的不是单身狗就是技术狂。</p>
<p>好了,废话也不多说,come on….</p>
<!--more-->
<h3>介绍</h3>
<pre><code>iOS 开发中 Objective-C 和 Swift 都用的是 Clang / LLVM 来编译的。LLVM是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器,目的是提供惊人的快速编译,比 GCC 快3倍,其中的 clang static analyzer 主要是进行语法分析,语义分析和生成中间代码,当然这个过程会对代码进行检查,出错的和需要警告的会标注出来。LLVM 核心库提供一个优化器,对流行的 CPU 做代码生成支持。lld 是 Clang / LLVM 的内置链接器,clang 必须调用链接器来产生可执行文件。
LLVM 比较有特色的一点是它能提供一种代码编写良好的中间表示 IR,这意味着它可以作为多种语言的后端,这样就能够提供语言无关的优化同时还能够方便的针对多种 CPU 的代码生成。
</code></pre>
<h3>总结一句</h3>
<pre><code>LLVM是编译器和工具链技的集合,Clang才是真正的编译器,Clang必须调用链接器(内置lldb)来产生可执行文件。
</code></pre>
<p>摘自<a href="https://linuxtoy.org/archives/llvm-and-clang.html">https://linuxtoy.org/archives/llvm-and-clang.html</a></p>
<pre><code>LLVM(Low Level Virtual Machine):编译器的后台——进行程序语言的编译期优化、链接优化、在线编译优化、代码生成(优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time))
Clang::编译器(LLVM)的前端— 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC
</code></pre>
<h6>LLVM其他用途</h6>
<pre><code>LLVM 还被用在 Gallium3D 中进行 JIT 优化,Xorg 中的 pixman 也有考虑使用 LLVM 来优化执行速度,llvm-lua 使用 LLVM 来编译 Lua 代码,gpuocelot 使用 LLVM 可以令 CUDA 程序无需重新编译即可运行在多核 X86CPU、IBM Cell、支持 OpenCL 的设备之上...
LLVM,做语法树分析,实现语言转换、字符串加密。编写ClangPlugin,扩展功能。编写Pass,代码混淆优化。
</code></pre>
<h3>区别于优势:</h3>
<h6>总结:Clang 具有如下优点:</h6>
<pre><code>编译速度快:在某些平台上,Clang 的编译速度显著的快过 GCC。
占用内存小:Clang 生成的 AST 所占用的内存是 GCC 的五分之一左右。
模块化设计:Clang 采用基于库的模块化设计,易于 IDE 集成及其他用途的重用。
诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告。
</code></pre>
<h6>Clang缺陷:</h6>
<pre><code>支持更多语言:GCC 除了支持 C/C++/Objective-C, 还支持 Fortran/Pascal/Java/Ada/Go 和其他语言。Clang 目前支持的语言有 C/C++/Objective-C/Objective-C++。
加强对 C++ 的支持:Clang 对 C++ 的支持依然落后于 GCC,Clang 还需要加强对 C++ 提供全方位支持。
支持更多平台:GCC 流行的时间比较长,已经被广泛使用,对各种平台的支持也很完备。Clang 目前支持的平台有 Linux/Windows/Mac OS。
</code></pre>
<h6>当然,GCC 也有其优势:</h6>
<pre><code>GCC 原名为GNU C语言编译器
支持 JAVA/ADA/FORTRAN
当前的 Clang 的 C++ 支持落后于 GCC,参见。(近日 Clang 已经可以自编译,见)
GCC 支持更多平台
GCC 更流行,广泛使用,支持完备
GCC 基于 C,不需要 C++ 编译器即可编译
</code></pre>
<h3>关于Clang</h3>
<h6>clang分三个实体概念:</h6>
<pre><code>clang驱动:利用现有OS、编译环境以及参数选项来驱动整个编译过程的工具。
clang编译器:利用clang前端组件及库打造的编译器,其入口为cc1_main; 参数为clang -cc1 或者 -Xclang;
clang前端组件及库:包括Support、Basic、Diagnostics、Preprocessor、Lexer、Sema、CodeGen等;
</code></pre>
<h5>Clang架构图</h5>
<p><img src="http://al1020119.github.io/images/clang0001.png" title="Caption" ></p>
<h5>Clang流程图</h5>
<p><img src="http://al1020119.github.io/images/clang0002.png" title="Caption" ></p>
<h5>关于编译器:</h5>
<pre><code>编译器前端负责产生机器无关的中间代码
编译器后端负责对中间代码进行优化并转化为目标机器代码,
</code></pre>
<h3>编译过程:</h3>
<pre><code>预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件。
编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件。
汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件。
链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)。
</code></pre>
<h6>曾经看到有人对ios编译流程做了更加详细的理解</h6>
<pre><code>编译信息写入辅助文件,创建文件架构 .app 文件
处理文件打包信息
执行 CocoaPod 编译前脚本,checkPods Manifest.lock
编译.m文件,使用 CompileC 和 clang 命令
链接需要的 Framework
编译 xib
拷贝 xib ,资源文件
编译 ImageAssets
处理 info.plist
执行 CocoaPod 脚本
拷贝标准库
创建 .app 文件和签名
</code></pre>
<h6>期间包括了各种特性与底层</h6>
<ul>
<li>预处理(宏的替换,头文件的导入,#if的处理)</li>
<li>词法分析(把代码切成一个个 Token,大小括号,等于号,字符串)</li>
<li>语法分析(法是否正确,将所有节点组成抽象语法树 AST)</li>
<li>IR中间代码的生成</li>
<li>CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR(IR 是编译过程的前端的输出后端的输入,Pass 是 LLVM 优化工作的一个节点,一个节点做些事,一起加起来就构成了 LLVM 完整的优化和转化。)</li>
<li>开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。</li>
<li>生成汇编</li>
<li>生成目标文件</li>
<li>生成可执行文件</li>
</ul>
<h3>点击Run做了什么(上面的详细版):</h3>
<pre><code>预处理 -> 词法分析 (token ) ->语法分析 ->语义分析 ->中间代码生成 -> 生成字节码-> 优化 -> 生成汇编代码 -> Link -> 目标文件 ->生层可执行文件。
</code></pre>
<h6>预处理</h6>
<pre><code>预处理:处理源文件中#开头的预编译命令,宏的替换
</code></pre>
<h6>编译</h6>
<pre><code>词法分析 (token ):把代码切成一个个Token(词法/代码符号),大小括号,等于号,字符串
语法分析:符号化的字符串,转化抽象为可以被计算机存储的树形结构,即抽象语法树(AST),检测正确性
语义分析:语义分析器就会发现类型不匹配,编译器提出相应的错误警告。主要是类型检查、以及符号表管理
中间代码生成:编译器前端负责产生机器无关的中间代码,编译器后端负责对中间代码进行优化并转化为目标机器代码
生成字节码/目标代码:编译器后端主要包括代码生成器、代码优化器。代码生成器将中间代码转换为目标代码,代码优化器主要是进行一些优化,比如删除多余指令,选择合适寻址方式等
</code></pre>
<h6>汇编</h6>
<p>目标代码需要经过汇编器处理,才能变成机器上可以执行的指令。生成对应的.o文件</p>
<h6>链接</h6>
<p>链接器(这里指的是静态链接器)将多个目标文件合并为一个可执行文件,在 OS X 和 iOS中的可执行文件是 Mach-O,对于Mach-O的文件格式可以参考这里,刚才所描述的过程其实可以用 sunnyxx的一页 ppt来进行总结</p>
<ul>
<li>动态:静态链接:在编译链接期间发挥作用,把目标文件和静态库一起链接形成可执行文件</li>
<li>静态:动态链接:链接过程推迟到运行时再进行。</li>
</ul>
<h6>区别</h6>
<pre><code>如果多个程序都用到了一个库,那么每个程序都要将其链接到可执行文件中,非常冗余,动态链接的话,多个程序可以共享同一段代码,不需要在磁盘上存多份拷贝,但是动态链接发生在启动或运行时,增加了启动时间,造成一些性能的影响。
静态库不方便升级,必须重新编译,动态库的升级更加方便
</code></pre>
<h6>签名(.app)</h6>
<p>.app目录中,有又一个叫_CodeSignature的子目录,这是一个 plist文件,里面包含了程序的代码签名,你的程序一旦签名,就没有办法更改其中的任何东西,包括资源文件,可执行文件等,iOS系统会检查这个签名。</p>
<pre><code>签名过程本身是由命令行工具 codesign 来完成的。如果你在 Xcode中build一个应用,这个应用构建完成之后会自动调用codesign 命令进行签名,这也是Link之后的一个关键步骤。
</code></pre>
<h6>启动</h6>
<p>启动过程中,dyld(动态链接器) 起了很重要的作用,进行动态链接,进行符号和地址的一个绑定</p>
<pre><code>加载所依赖的dylibs
Fix-ups:Rebase修正地址偏移,因为 OS X和 iOS 搞了一个叫 ASLR的东西来做地址偏移(随机化)来避免收到攻击
Fix-ups:Binding确定 Non-Lazy Pointer地址,进行符号地址绑定。
ObjC runtime初始化:加载所有类
Initializers:执行load 方法和__attribute__((constructor))修饰的函数
</code></pre>
<h3>扯在最后</h3>
<pre><code> 宏观的LLVM,指的是整个的LLVM的框架,它肯定包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。虽然这个前端占的比重比较大,但是它依然只是个前端,LLVM框架可以有很多个前端和很多个后端,只要你想继续扩展。
微观的LLVM指的是以实际开发过程中,包括实际使用过程中,划分出来的LLVM。比如编译LLVM和Clang的时候,LLVM的源码包是不包含Clang的源码包的,需要单独下载Clang的源码包。
所以这里想讨论的就是微观的LLVM和Clang的关系。从编译器用户的角度,Clang使用了LLVM中的一些功能,目前所知道的主要就是对中间格式代码的优化,或许还有一部分生成代码的功能。从Clang和微观LLVM的源码位置可以看出,Clang是基于微观的LLVM的一个工具。而从功能的角度来说,微观的LLVM可以认为是一个编译器的后端,而Clang是一个编译器的前端,它们的关系就更加的明了了,一个编译器前端想要程序最终变成可执行文件,是缺少不了对编译器后端的介绍的。
</code></pre>
<hr />
<hr />
<h6>微信号:</h6>
<p>clpaial10201119(Q Q:2211523682)</p>
<h6>微博WB:</h6>
<p><a href="http://weibo.com/u/3288975567?is_hot=1">http://weibo.com/u/3288975567?is_hot=1</a></p>
<h6>gitHub:</h6>
<p><a href="https://github.com/al1020119">https://github.com/al1020119</a></p>
<h6>博客</h6>
<p><a href="http://al1020119.github.io/">http://al1020119.github.io/</a></p>
<hr />
<p><img src="http://al1020119.github.io/images/iCocosCoder.jpg" title="Caption" ></p>
<p><img src="http://al1020119.github.io/images/iCocosPublic.jpg" title="Caption" ></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Node.js是什么鬼?]]></title>
<link href="http://al1020119.github.io/blog/2017/01/12/node-dot-jsshi-shi-yao-gui-%3F/"/>
<updated>2017-01-12T11:18:13+08:00</updated>
<id>http://al1020119.github.io/blog/2017/01/12/node-dot-jsshi-shi-yao-gui-?</id>
<content type="html"><![CDATA[<h6>Node.js介绍</h6>
<pre><code>Node.js什么时候出现,2009年,Ryan Dahl(瑞恩·达尔)在GitHub上发布了最初版本的部分Node.js包,随后几个月里,有人开始使用Node.js开发应用
什么是Node.js,做过Javascript开发的,看到Node.js这个名字,初学者可能会误以为这是一个Javascript应用,事实上,Node.js采用C++语言编写而成,是一个Javascript的运行环境,意思就是底层使用c++编写,外层封装采用Javascript,需要使用Javascript解析执行。
比如OC底层也是c++,但是执行代码,只需要解析OC代码。
Node.js是一个后端的Javascript运行环境,这意味着你可以编写服务器端的Javascript代码,交给Node.js来解释执行。
</code></pre>
<!--more-->
<h6>Node.js工作原理与优缺点(了解一门语言的开始)</h6>
<pre><code>传统Web服务器原理(T):传统的网络服务技术,是每个新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。
Node.js工作原理(T):只运行在一个单线程中,使用非阻塞的异步 I/O 调用,所有连接都由该线程处理,也就是一个新的连接,不会开启新的线程,仅仅一个线程去处理多个请求。
优缺点:
传统的比较消耗内存,Node.js只开启一个线程,大大减少内存消耗。
假设是普通的Web程序,新接入一个连接会占用 2M 的内存,在有 8GB RAM的系统上运行时, 算上线程之间上下文切换的成本,并发连接的最大理论值则为 4000 个。这是在传统 Web服务端技术下的处理情况。而 Node.js 则达到了约 1M 一个并发连接的拓展级别
Node.js弊端:大量的计算可能会使得 Node 的单线程暂时失去反应, 并导致所有的其他客户端的请求一直阻塞, 直到计算结束才恢复正常
疑问?Node.js是单线程的。单线程怎么开启异步?怎么工作的? 需要了解事件驱动。
什么是事件驱动?
传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。
Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
本质:当然最终处理事件还是需要底层开启线程,只不过接受请求只用一个线程去接收。
</code></pre>
<h6>Node.js使用介绍</h6>
<pre><code>Node.js使用Module模块去划分不同的功能,以简化App开发,Module就是库,跟组件化差不多,一个功能一个库。
NodeJS内建了一个HTTP服务器,可以轻而易举的实现一个网站和服务器的组合,不像PHP那样,在使用PHP的时候,必须先搭建一个Apache之类的HTTP服务器,然后通过HTTP服务器的模块加载CGI调用,才能将PHP脚本的执行结果呈现给用户
require() 函数,用于在当前模块中加载和使用其他模块;
</code></pre>
<h6>Express模块(框架)</h6>
<pre><code>Express是Node.JS第三方库
Express可以处理各种HTTP请求
Express是目前最流行的基于Node.js的Web开发框架,
Express框架建立在node.js内置的http模块上,可以快速地搭建一个Web服务器
</code></pre>
<h3>Node搭建服务器及使用</h3>
<h4>方案一:</h4>
<pre><code>打开终端,输入node -v,先查看是否已经安装
如果没有安装,就需要安装node软件。
mac上可以使用Homebrew,安装node
Homebrew:Homebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于window上360管家,可以帮你下载软件。
先输入brew -v,查看mac是否安装了HomeBrew
安装ruby教程(http://www.jianshu.com/p/daa92187621c)
使用ruby安装Homebrew,前提是安装了ruby
输入指令安装brew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
使用Homebrew安装Node,输入指令
brew install node
安装完,输入`node -v``查看是否安装成功
</code></pre>
<h6>二、安装NPM</h6>
<pre><code>NPM是随同NodeJS一起安装的包管理工具,用于下载NodeJS第三方库。
类似iOS开发中cocoapods,用于安装第三方框架
新版的NodeJS已经集成了npm,所以只要安装好Node.JS就好
</code></pre>
<h6>三、利用NPM下载第三方模块(Express和Socket.IO)</h6>
<pre><code>package.json
package.json类似cocoapods中的Podfile文件
package.json文件描述了下载哪些第三方框架.
可以使用npm init创建
需要添加dependencies字段,描述添加哪些框架,其他字段随便填
注意:不能有中文符号
"dependencies": {
"express": "^4.14.0",
"socket.io": "^1.4.8"
}
</code></pre>
<h6>四、执行npm install,就会自动下载依赖库</h6>
<pre><code>npm install
</code></pre>
<h4>方案二:</h4>
<h6>step1</h6>
<p>或者你如果不喜欢使用命令的话这个方案相信是最好的选择。</p>
<pre><code>访问nodejs官网,点击蓝色选框区域稳定版,并下载https://nodejs.org/en/
</code></pre>
<h6>step 2:</h6>
<pre><code>双击刚下载的文件,按步骤默认安装就行
</code></pre>
<h6>step 3:</h6>
<pre><code>安装完成后打开终端,输入
npm -v
node -v
两个命令,如下图出现版本信息,说明安装成功。
</code></pre>
<h4>使用</h4>
<p>使用上面任何一种种方式完成以后,就可以开始测试了。</p>
<p>新建一个js文件,nodejsTest.js , 输入下面的代码, 并保存</p>
<pre><code>var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {
"Content-Type" : "text/plain"
});
response.write("Welcome to Nodejs");
response.end();
}).listen(8000, "127.0.0.1");
console.log("Creat server on http://127.0.0.1:8000/");
</code></pre>
<h4>测试</h4>
<p>打开终端进入 nodejsTest.js 所在目录, 输入 node nodejsTest</p>
<p><img src="http://al1020119.github.io/images/node0001.png" title="Caption" ></p>
<p>打开浏览器,点击或者输入<a href="http://127.0.0.1:8000/%EF%BC%8C">http://127.0.0.1:8000/%EF%BC%8C</a> 如果无法打开,可以去掉.listen(8000, “127.0.0.1”) 中得ip监听改成 .listen(8000),然后点击或者输入<a href="http://localhost:8000/">http://localhost:8000/</a></p>
<p><img src="http://al1020119.github.io/images/node0002.png" title="Caption" ></p>
<p>关于Node.js其他的相关配置可以查看<a href="http://www.jianshu.com/p/d76ecf5ed690">http://www.jianshu.com/p/d76ecf5ed690</a>,笔者也就是好奇所以是了一下,希望不会被喷。</p>
<blockquote><p>后面有机会会结合客户端实现数据的交互相关处理。</p></blockquote>
<p>参考:
<a href="http://www.ruanyifeng.com/blog/2014/10/event-loop.html">http://www.ruanyifeng.com/blog/2014/10/event-loop.html</a></p>
<p><a href="http://www.csdn.net/article/a/2016-07-12/3358">http://www.csdn.net/article/a/2016-07-12/3358</a></p>
<p><a href="http://www.yiibai.com/nodejs/nodejs-quick-start.html">http://www.yiibai.com/nodejs/nodejs-quick-start.html</a></p>
<hr />
<hr />
<h6>微信号:</h6>
<p>clpaial10201119(Q Q:2211523682)</p>
<h6>微博WB:</h6>
<p><a href="http://weibo.com/u/3288975567?is_hot=1">http://weibo.com/u/3288975567?is_hot=1</a></p>
<h6>gitHub:</h6>
<p><a href="https://github.com/al1020119">https://github.com/al1020119</a></p>
<h6>博客</h6>
<p><a href="http://al1020119.github.io/">http://al1020119.github.io/</a></p>
<hr />
<p><img src="http://al1020119.github.io/images/iCocosCoder.jpg" title="Caption" ></p>
<p><img src="http://al1020119.github.io/images/iCocosPublic.jpg" title="Caption" ></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[App打包发布———坑中之坑]]></title>
<link href="http://al1020119.github.io/blog/2017/01/10/appda-bao-fa-bu-keng-zhong-zhi-keng/"/>
<updated>2017-01-10T10:54:05+08:00</updated>
<id>http://al1020119.github.io/blog/2017/01/10/appda-bao-fa-bu-keng-zhong-zhi-keng</id>
<content type="html"><![CDATA[<blockquote><p>上线了这么多App,关于App上线的坑,也遇到了很多,但是这一次是最严重,也是最值得思考的,所以我打算翻云覆雨一番。</p></blockquote>
<h2>问题起源</h2>
<pre><code>构建版本中找不到提交的二进制文件
</code></pre>
<p>可能有人会说,这个一般等个20分钟就有了的,如果是这么简单,那我还在这里写个鬼啊!</p>
<p>所以,等待被咔嚓了,因为我等了一个晚上。。。。。</p>
<!--more-->
<pre><code>因为年前的最后第二个版本就在昨晚打包提交(不要问我为什么是最后第二个,因为放假的那天晚上还有一场奋斗),因为我一般的习惯是公司打包提交之后,回到家里再点提交以供审核,所以就直接回家了。
</code></pre>
<p>成功上传提示</p>
<p><img src="http://al1020119.github.io/images/uploadSuccess.png" title="Caption" ></p>
<pre><code>回到家里撒野没管,该干撒干撒,看书,看电影,和家里视频。。。。10点钟的时候,被老大告知,itnues connect里面是空的,不应该,从没遇到过这种问题,我在想估计又是苹果的坑,网上一搜,原来还真有一大把类似问题发,其中大部分这样的是因为我或者UI不细心。
</code></pre>
<p>好了下面细数一下整个过程。</p>
<ul>
<li>网上找到了这么几种问题及分析方案。</li>
</ul>
<h4>图片错误提示</h4>
<pre><code>运行成功,打包也成功,但是打包的时候报了一个:pngcrush caught libpng error:类似错误(这里即时有错误还是成功打包)
</code></pre>
<h6>两种解决方法 :</h6>
<pre><code> 1. 在build settings里把工程里的Compress PNG files设置为NO,问题解决,但这样设置以后,弄出来的ipa会很大,感觉不是很理想。
2. mac上的preview(预览)打开出问题的png文件,然后重新导出为png文件或者用photoshop把png图片保存为NOT INTERLACED(不交错)的,这样真机调试时就没有错误了。
</code></pre>
<h6>还有一种类似的提示,当然大部分都会直接提示到对应的图片。</h6>
<pre><code> While reading /Volumes/data2/project/ChildStory/ChildStory/nav_bar.png pngcrush caught libpng error:
Could not find file: /Users/hopo/Library/Developer/Xcode/DerivedData/ChildStory-cwdwhztnszhpawbnlproivndbuvw/Build/Products/Debug-iphoneos/ChildStory.app/nav_bar.png
Command /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/copypng emitted errors but did not return a nonzero exit code to indicate failure
</code></pre>
<h6>原因:</h6>
<p>该文件不是真正的png文件,可能是个jpg文件(被你手动更改的),实际的文件头信息是不一样的,造成不能识别。</p>
<p>解决方法有两种:</p>
<pre><code>1. 重新把图片文件处理成png文件
2. 修改文件名后缀,比如改成.jpg
</code></pre>
<h3>关于二进制</h3>
<pre><code>提交打包提交App,将包上传到iTunes Connect之后,以为就能发布了,便点击构建版本,发现没有刚刚上传的包,于是就点击"预发行"看一下,会看到"已上传",过不久再刷新一次再看,就变成了二进制无效,无比的郁闷,上传了五六次都是二进制文件无效,
</code></pre>
<h6>原因:</h6>
<p>自2015年2月份开始,新上传到iTunes上面审核的app,必须支持64位,新上传是指第一次上传,</p>
<p>或者没有审核通过过,总之就是在AppStore上面没有上架的app,必须支持64位,包括工程里面的代码和用到的静态库文件</p>
<pre><code>1. build setting中Archivecture指定arm64
2. Schemes的Analyze和Archive设置release模式
3. Build Active Architecture Only:是否只编译当前设备适用的指令集(如果这个参数设为YES,使用iPhone 6调试,那么最终生成的一个支持ARM64指令集的Binary。一般在DEBUG模式下设为YES,RELEASE设为NO)。
</code></pre>
<p>Valid architectures:即将编译的指令集。(Valid architectures 和 Architecture两个集合的交集为最终编译生成的版本)</p>
<p>Architectures:你想支持的指令集。(支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。)</p>
<p>温馨提示+警钟</p>
<p>上线的时候一定要切忌(作为一个好的程序员应有的习惯)</p>
<pre><code>1. 不要TMD直接修改jpg<-->png。
2. 一定要跑真机,一定要Analyze,一定要跑一下Profile里面常见的工具。
3. 编译,运行,打包的时候一定不能放过任何错误,一个都不行。
4. 编译,运行,打包(尤其是打包)的时候一定要尽量减少警告。
5. archive之前一定要细心检查相关配置,release/debug,API切换,脚本配置等等
6. Archive-Upload之后,最好等提交以供审核了之后再下班,或者带电脑回去,不然运气不好加班也白加了。
</code></pre>
<h6>最后来个喜讯,相信这之前是大部分iOS开发者苦恼的问题之一,所以你们懂。</h6>
<p><img src="http://al1020119.github.io/images/iCocosATS0001.png" title="Caption" ></p>
<hr />
<hr />
<h6>微信号:</h6>
<p>clpaial10201119(Q Q:2211523682)</p>
<h6>微博WB:</h6>
<p><a href="http://weibo.com/u/3288975567?is_hot=1">http://weibo.com/u/3288975567?is_hot=1</a></p>
<h6>gitHub:</h6>
<p><a href="https://github.com/al1020119">https://github.com/al1020119</a></p>
<h6>博客</h6>
<p><a href="http://al1020119.github.io/">http://al1020119.github.io/</a></p>
<hr />
<p><img src="http://al1020119.github.io/images/iCocosCoder.jpg" title="Caption" ></p>
<p><img src="http://al1020119.github.io/images/iCocosPublic.jpg" title="Caption" ></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[保持初心继续前进-年终篇]]></title>
<link href="http://al1020119.github.io/blog/2016/12/30/bao-chi-chu-cin-ji-xu-qian-jin/"/>
<updated>2016-12-30T18:16:05+08:00</updated>
<id>http://al1020119.github.io/blog/2016/12/30/bao-chi-chu-cin-ji-xu-qian-jin</id>
<content type="html"><![CDATA[<p>今年一年可谓是我收获最多的一年,技术,圈子,交际,心态。唯一没有收获的就是:依然是条单身🐩😂😂😂😂😂😂😂😂😂😂😂😂。。。。。此处省去一万字!!!</p>
<p>因为我一直都是比较喜欢学习的,尤其是研究技术,关于非技术的的实在太多,而且很多需要自己亲身感受才能体会的。所以这里就先总结一下去年一年个人在技术上的发展。然后对接下来的一年和和以后的规划。</p>
<!--more-->
<ol>
<li><p>项目: 真正从零开始架构一个项目,并不像之前做外包那样瞎整一条。这其中考虑到了,设计模式,架构模式,多线程处理,音视频处理,性能处理,数据持久性优化等,都有综合考虑,虽然还有欠缺的地方,但是总之跟之前做的东西里面还是有一个很大的突破的。</p></li>
<li><p>直播:今年可谓是个直播元年,可以看到的是,各大公司和部分创业型公司都开始往直播的方向发展,很多女性,不管长的美不美,或者有没有才华,年不年轻,都有试着或者想做一下直播,有的是专业,有的是业余,或许为了娱乐,或许为了生活,甚至很多男性或者屌丝男都开始玩起直播了。</p>
<ul>
<li>所以我也专门花了一段时间研究了一下直播相关的技术,因为直播里面的技术可谓层出不穷,可以算是最难最广的一块。说实话我自己也不知道自己现在算不算是对这一块入门,因为有些东西实在太深入,或者牵扯的东西太多。如果有机会实战这样的一个项目,我觉得也是一件很有挑战性事情。</li>
</ul>
</li>
<li><p>前后端:这一年和往年不同的另一个热点就是,关于iOS行业,记得12年学习iOS的时候,几乎发现不到多少的人在学习iOS,或者苹果相关开发,做这个的也少之又少。基本上如果你会拖个界面或者写一些简单的逻辑都可以找到一份还可以的工作。但是,由于培训机构的大量兴起,各大高校大学毕业生的涌入,导致从2016年初开始市面上就开始流行一个词:iOS烂大街(自己体会)。</p>
<ul>
<li><p>所以在这样的背景下,我不得不在深入学习iOS的同时,在业余的时间或者抽出更多的时间学学习一些其他的技术,不管是因为趋势还是为了以后留一条后路,对于一个程序员来时,学习是无时无刻的。</p></li>
<li><p>因为之前有过一点H5的经验,而且去年下半年小程序的火热,我选择的深入研究一下JavaScript(没有研究CSS,Html5),网上买了几本高级的书有空就看看练练,还是蛮有收获的。</p></li>
<li><p>另一门技术就是php,我之所以选择学习php,有两个原因,在这个行业也有一段时间了,也不可能一辈子这样干下去,就算不创业,也要考虑或者向管理层发展,而几乎所有公司都不会让一个做iOS的带领整个技术部,至少我现在没有发现。还有一个原因是,后台目前用的最多的也就是java和php,因为大部分大学有学习java这本们语言,所以就是在大学学的不好,哪怕偶尔看一下书,也是比PHP有优势的,php基本上没有学校对这门课进行开设课程,唯一有的也就是一些爱好者,或者培训出来的人,所以导致php目前在市面上还是很紧缺的,网上不是传说一句话:php是世界上最好的语言。具体是不是我也不知道,只有深入学习过了才能体会这句话的真谛。</p></li>
<li><p>最后一个就是大部分程序员的通病,算法,数据结构,设计模式,这里就要感谢我。。。在开发的过程中,看到了我的代码,然后做了一下评价,并且给了一些很受益的建议,所以我也专门抽空学习了一些重要的算法,和大学欠下的债,现在也有空就会看看相关的东西或者尽量应用到实战,希望能提高自己在这一块的思维。</p></li>
</ul>
</li>
</ol>
<p>接下来的一年除了将 自己本分工作做好的同时,会专门而且不断的深入学习与实战PHP技术,希望能做到一个真正的转型,即时我暂时还不会靠这个吃饭。</p>
<p>我喜欢用笔记记录下这一过程,大概的内容有</p>
<ol>
<li>php基础与总结篇</li>
<li>php高级篇</li>
<li>php实战篇</li>
<li>php拓展,与面试篇</li>
<li>php综合篇</li>
</ol>
<p>希望能一步一步学好这门技术。至于未来,我曾说过每年都会学习并且入门一门语言,这个虽然有点夸张,不现实,而且没有必要,但是我总归去试试,我相信。。。。。。</p>
<p>关于以后的路,或者做管理,或者创业,拿都是以后的事情,谁也说不准,就看我有没有这种心并且为之付出应有的努力!</p>
<p>最后我也会抽空出来锻炼身体:身体才是革命的本钱,身体垮了学再多东西,转太多钱都没用
还会偶尔出去旅游一下,既能散心,又能看看风景,最主要的是还能看看外面的世界,提高一下自己眼界与对待人,事与对待生活的方式
最后争取今年提辆车,虽然有点困难,有点不现实,嘿嘿!</p>
<p>至于其他的就太多的,谁也不知会发生什么,得自己慢慢经历了。</p>
<p>不管怎么样,要用微笑面对生活,善待身边的每一个人,学会感恩,不忘初心的付出,我相信总有一天你能得到不一样的收获,即时没有什么成功,但是当你在回过头来看看这一切的时候,依然是很值得回忆,并且是一笔无价的财富。</p>
<p>。
。。
。。。
。。。。
。。。。。
。。。。。。
。。。。。。。
。。。。。。。。
。。。。。。。。。
。。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。。。。
保持初心,继续前进。。。。。。
。。。。。。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。
。。。。。。。。。
。。。。。。。。
。。。。。。。
。。。。。。
。。。。。
。。。。
。。。
。。
。</p>
<hr />
<hr />
<h6>微信号:</h6>
<p>clpaial10201119(Q Q:2211523682)</p>
<h6>微博WB:</h6>
<p><a href="http://weibo.com/u/3288975567?is_hot=1">http://weibo.com/u/3288975567?is_hot=1</a></p>
<h6>gitHub:</h6>
<p><a href="https://github.com/al1020119">https://github.com/al1020119</a></p>
<h6>博客</h6>
<p><a href="http://al1020119.github.io/">http://al1020119.github.io/</a></p>
<hr />
<p><img src="http://al1020119.github.io/images/iCocosCoder.jpg" title="Caption" ></p>
<p><img src="http://al1020119.github.io/images/iCocosPublic.jpg" title="Caption" ></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[自动打包上传代码]]></title>
<link href="http://al1020119.github.io/blog/2016/12/26/ios-daobao/"/>
<updated>2016-12-26T18:16:05+08:00</updated>
<id>http://al1020119.github.io/blog/2016/12/26/ios-daobao</id>
<content type="html"><![CDATA[<p>由于17年之前,也就是这个月30好要上线,所以就有了下面。。。。。</p>
<h2>封装</h2>
<h4>使用前:</h4>
<ol>
<li>安装pip</li>
<li>sudo easy_install pip</li>
<li>安装json-query</li>
<li>pip install json-query</li>
<li>安装 gym</li>
<li>pip install gym</li>
</ol>
<!--more-->
<h4>新建一个.sh文件,好了开始撸,,哒哒哒哒哒。。。。</h4>
<pre><code>#!/bin/sh
#LEPgyerApiKey 在Info.plist中配置蒲公英apiKey
#LEPgyerUKey 在Info.plist中配置蒲公英ukey
result=''
uploadToPgyer()
{
echo "params"
echo "ipa路径: " $1
echo "UserKey: " $2
echo "ApiKey: " $3
echo "Password:" $4
result=$(curl -F "file=@$1" -F "uKey=$2" -F "_api_key=$3" -F "publishRange=2" -F "isPublishToPublic=2" -F "password=$4" 'https://www.pgyer.com/apiv1/app/upload' | json-query data.appShortcutUrl)
}
tempPath="$(pwd)"
if [ ! -f pkgtopgy_path.config ] ; then
touch pkgtopgy_path.config
fi
lines=`sed -n '$=' pkgtopgy_path.config`
if [[ $lines == '' ]]; then
lines=0
fi
echo "请选择你需要打包的目录:"
for i in `cat pkgtopgy_path.config `
do
echo $((++no)) ":" $i
done
echo $((++no)) ":" "${tempPath}"
echo "若没有符合需求的路径,请直接回车"
read -p "你的选择是:" pathselection
if [[ $pathselection >0 ]] && [[ $pathselection -le `expr $lines+1` ]] ; then
if [[ $pathselection -le $lines ]] ; then
project_path=`sed -n ${pathselection}p pkgtopgy_path.config`
else
echo "已选目录:${tempPath}"
read -p "请确认上述已选目录:(y/n)" checkPath
if [[ $checkPath = "y" ]] ; then
project_path=$tempPath
fi
fi
else
echo "未找到合适的路径"
fi
if [[ $project_path == '' ]]; then
read -p "请手动输入打包工程的绝对路径:" inputPath
project_path=$inputPath
if [[ $project_path != '' ]]; then
echo $project_path >> pkgtopgy_path.config
cat pkgtopgy_path.config
fi
fi
if [[ -d "$project_path" ]]; then
echo "当前路径为:" $project_path
else
echo "路径:"$project_path
echo "当前路径有误,已终止!!!\n"
exit
fi
SECONDS=0
#取当前时间字符串添加到文件结尾
now=$(date +"%Y_%m_%d_%H_%M_%S")
#工程名
cd ${project_path}
project=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
#指定项目地址
workspace_path="$project_path/${project}.xcworkspace"
if [[ ! -d "$workspace_path" ]]; then
echo "路径:"$workspace_path
echo "未找到.xcworkspace文件,已终止!!!"
exit
fi
#工程配置文件路径
echo "检查蒲公英设置"
project_infoplist_path=${project_path}/${project}/Info.plist
pgyerApiKey=''
pgyerUKey=''
pgyerApiKey=$(/usr/libexec/PlistBuddy -c "print LEPgyerApiKey" ${project_infoplist_path})
pgyerUKey=$(/usr/libexec/PlistBuddy -c "print LEPgyerUKey" ${project_infoplist_path})
pgyPassword=$(/usr/libexec/PlistBuddy -c "print LEPgyerPassword" ${project_infoplist_path})
if [[ $pgyerUKey = '' ]] || [[ $pgyerApiKey = '' ]]; then
read -p "发现尚未配置蒲公英上传的apiKey及ukey,是否配置?(y/n)" checkConfig
if [[ $checkConfig = "y" ]] ; then
read -p "请输入蒲公英上传的apiKey:" apikey
pgyerApiKey=$apikey
read -p "请输入蒲公英上传的ukey:" ukey
pgyerUKey=$ukey
else
if [[ $pgyPassword = '' ]]; then
echo '发现蒲公英下载密码,未在工程项目的Info.plist配置,配置名称为LEPgyerPassword'
fi
read -p "是否继续打包?(y/n)" checkPkg
if [[ $checkPkg = "n" ]] ; then
exit
fi
fi
fi
#指定项目的scheme名称
scheme=$project
#指定要打包的配置名
configuration="Release"
#指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method参数
export_method='development'
#export_method='app-store'
#指定输出路径
mkdir "${HOME}/Desktop/${project}_${now}"
output_path="${HOME}/Desktop/${project}_${now}"
echo $output_path
#指定输出归档文件地址
archive_path="$output_path/${project}_${now}.xcarchive"
#指定输出ipa地址
ipa_path="$output_path/${project}_${now}.ipa"
#指定输出ipa名称
ipa_name="${project}_${now}.ipa"
#获取执行命令时的commit message
commit_msg="$1"
#输出设定的变量值
echo "=================AutoPackageBuilder==============="
echo "begin package at ${now}"
echo "workspace path: ${workspace_path}"
echo "archive path: ${archive_path}"
echo "ipa path: ${ipa_path}"
echo "export method: ${export_method}"
echo "commit msg: $1"
#pod update
#pod update --no-repo-update
#先清空前一次build
#gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}
gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}
#输出总用时
echo "==================>Finished. Total time: ${SECONDS}s"
if [[ $pgyerUKey = '' ]] || [[ $pgyerApiKey = '' ]]; then
echo "未在工程项目的Info.plist文件中配置LEPgyerApiKey(蒲公英apiKey)及LEPgyerUKey(蒲公英userKey),因此无法上传项目至蒲公英平台"
else
if [[ -f "$ipa_path" ]]; then
uploadToPgyer $ipa_path $pgyerUKey $pgyerApiKey $pgyPassword
while [[ $result == '' ]]
do
read -p "上传失败,是否重新上传到蒲公英?(y/n)" reUploadToPgyer
if [[ $reUploadToPgyer = "y" ]] ; then
uploadToPgyer $ipa_path $pgyerUKey $pgyerApiKey $pgyPassword
else
echo "本次打包完成,ipa位置: ${ipa_path}"
exit
fi
done
if [[ $result != '' ]]; then
echo "请前往此处下载最新的app" http://www.pgyer.com/$result
open http://www.pgyer.com/$result
fi
fi
fi
echo "本次打包完成"
exit
</code></pre>
<h2>测试使用(DEV环境)</h2>
<ol>
<li>下载pkgtopgy.sh至任意目录</li>
<li>终端新建窗口 输入sh (sh+空格),</li>
<li>然后拖入文件 pkgtopgy.sh 回车 (也可以右击-显示简介-打开方式设置为终端,然后双击打开)</li>
</ol>
<hr />
<hr />
<h6>微信号:</h6>
<p>clpaial10201119(Q Q:2211523682)</p>
<h6>微博WB:</h6>
<p><a href="http://weibo.com/u/3288975567?is_hot=1">http://weibo.com/u/3288975567?is_hot=1</a></p>
<h6>gitHub:</h6>
<p><a href="https://github.com/al1020119">https://github.com/al1020119</a></p>
<h6>博客</h6>
<p><a href="http://al1020119.github.io/">http://al1020119.github.io/</a></p>
<hr />
<p><img src="http://al1020119.github.io/images/iCocosCoder.jpg" title="Caption" ></p>
<p><img src="http://al1020119.github.io/images/iCocosPublic.jpg" title="Caption" ></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[PHP完美搭配之Mysql初探]]></title>
<link href="http://al1020119.github.io/blog/2016/12/03/phpwan-mei-da-pei-mysql/"/>
<updated>2016-12-03T13:36:37+08:00</updated>
<id>http://al1020119.github.io/blog/2016/12/03/phpwan-mei-da-pei-mysql</id>
<content type="html"><![CDATA[<h3>数据库概念</h3>
<h6>什么是数据库</h6>
<p>数据库就是用来存储和管理数据的仓库!</p>
<p>数据库存储数据的优先:</p>
<pre><code>可存储大量数据;
方便检索;
保持数据的一致性、完整性;
安全,可共享;
通过组合分析,可产生新数据。
</code></pre>
<p> <!--more--></p>
<h6>数据库的发展历程</h6>
<p> 没有数据库,使用磁盘文件存储数据;</p>
<pre><code> 层次结构模型数据库;
网状结构模型数据库;
关系结构模型数据库:
使用二维表格来存储数据;
关系-对象模型数据库;
MySQL就是关系型数据库!
</code></pre>
<h6>常见数据库</h6>
<pre><code> Oracle(神喻):甲骨文(最高!);
DB2:IBM;
SQ Server:微软;
Sybase:赛尔斯;
MySQL:甲骨文;
</code></pre>
<h6>理解数据库</h6>
<pre><code> RDBMS = 管理员(manager)+仓库(database)
database = N个table
</code></pre>
<p> table:</p>
<pre><code>表结构:定义表的列名和列类型!
表记录:一行一行的记录!
</code></pre>
<p>我们现在所说的数据库泛指“关系型数据库管理系统(RDBMS - Relationa database management system)”,即“数据库服务器”。</p>
<p>当我们安装了数据库服务器后,就可以在数据库服务器中创建数据库,每个数据库中还可以包含多张表。</p>
<pre><code>表头(header): 每一列的名称;
列(row): 具有相同数据类型的数据的集合;
行(col): 每一行用来描述某个人/物的具体信息;
值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
键(key): 表中用来识别某个特定的人\物的方法, 键的值在当前列中具有唯一性。
</code></pre>
<p>数据库表就是一个多行多列的表格。在创建表时,需要指定表的列数,以及列名称,列类型等信息。而不用指定表格的行数,行数是没有上限的</p>
<h6>应用程序与数据库</h6>
<p> 应用程序使用数据库完成对数据的存储!</p>
<h6>启动和关闭mysql服务器</h6>
<pre><code> 启动:net start mysql;