-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
1183 lines (843 loc) · 706 KB
/
search.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"?>
<search>
<entry>
<title><![CDATA[Hexo-完全免费全平台搭建个人博客(2)-域名主题设置]]></title>
<url>%2F2017%2F03%2F10%2F113%2F</url>
<content type="text"><![CDATA[Hexo-完全免费全平台搭建个人博客 上一篇文章把 Hexo 博客整体搭建一遍了,能通过 xxxxx.github.io 访问,主题也换了一个比较赏心悦目的 NexT,接下来我们在个性化设置下,更加人性化。 教程分为四大部分: Hexo 设置个性域名 Hexo NexT 主题设置 一些常见的问题 1.Hexo 设置个性域名首先打开电脑终端,输入npm install hexo-generator-cname –save ,安装 CNAME 工具后,会在发布的时候自动添加 CNAME 文件,里面也会自动填写域名,不过目前里面的内容是xxxxx.github.io。 登陆 GitHub,然后点击进入你博客的仓库,然后 Settings-GitHub Pages-Custom domain,里面填上你的需要绑定的域名。如果还没有域名的话,域名购买只需要几十元即可,可以参考文章:小白搭建博客教程-购买域名(1)了解域名购买相关知识,然后参考小白搭建博客教程-域名解析(3)了解相关的解析知识。 下面是域名解析部分只需要 CNAME 即可: 设置完毕后,执行下hexo clean && hexo g && hexo d 重新生成静态文件部署,然后访问自己购买绑定的域名就可以了,我的是http://github.huangbowei.com。 2.Hexo NexT 主题设置这里贴出我的博客_config.yml 文件与主题_config.yml 文件: 博客配置文件: # Hexo Configuration Docs: https://hexo.io/docs/configuration.htmlSource: https://github.com/hexojs/hexo/Sitetitle: Tim博客 #网站标题subtitle: 不忘初心,方得始终 #网站副标题description: 自学iOS开发进阶博客,分享高质量的iOS开发技术。 #网站描述author: Timhbw #您的名字language: zh-Hans #网站使用的语言timezone: UTC #网站时区。Hexo 默认使用您电脑的时区。avatar: /images/avatar.png URLIf your site is put in a subdirectory, set url as ‘http://yoursite.com/child‘ and root as ‘/child/‘url: https://github.huangbowei.com #网址root: / #网站根目录permalink: :year/:month/:day/:title/ #文章的 永久链接 格式permalink_defaults: #永久链接中各部分的默认值 Directorysource_dir: source #资源文件夹,这个文件夹用来存放内容。public_dir: public #公共文件夹,这个文件夹用于存放生成的站点文件。tag_dir: tags #标签文件夹archive_dir: archives #归档文件夹category_dir: categories #分类文件夹code_dir: downloads/code #Include code 文件夹i18n_dir: :lang #国际化(i18n)文件夹skip_render: #跳过指定文件的渲染,您可使用 <a href=”https://github.com/isaacs/node-glob“ target=”_blank” rel=”external”>glob 表达式</a>来匹配路径。 README.md Writingnew_post_name: :title.md #新文章的文件名称default_layout: post #预设布局auto_spacing: true #在中文和英文之间加入空格titlecase: false #把标题转换为 title caseexternal_link: true #在新标签中打开链接filename_case: 0 #把文件名称转换为 (1) 小写或 (2) 大写render_drafts: false #显示草稿post_asset_folder: false #启动 <a href=”https://hexo.io/zh-cn/docs/asset-folders.html">Asset 文件夹</a>relative_link: false #把链接改为与根目录的相对位址future: true #显示未来的文章highlight: #代码块的设置 enable: true line_number: true auto_detect: false tab_replace: Category & Tagdefault_category: ios #默认分类category_map: ios #分类别名tag_map: ios #标签别名 Date / Time formatHexo uses Moment.js to parse and display dateYou can customize the date format as defined inhttp://momentjs.com/docs/#/displaying/format/date_format: YYYY-MM-DD #日期格式time_format: HH:mm:ss #时间格式 PaginationSet per_page to 0 to disable paginationper_page: 10 #每页显示的文章量 (0 = 关闭分页功能)pagination_dir: page #分页目录 ExtensionsPlugins: https://hexo.io/plugins/Themes: https://hexo.io/themes/theme: next #当前主题名称。值为<code>false</code>时禁用主题 DeploymentDocs: https://hexo.io/docs/deployment.htmldeploy: type: git #用 Git 发布 repo: https://github.com/Timhbw/timhbw.github.io.git #刚刚在 Github 上创建的仓库的地址 branch: master plugins: -hexo-generator-cname 百度分享服务baidushare: true JiaThis 分享服务jiathis: true search: path: search.xml field: post format: html limit: 10000 ExtensionsPlugins: hexo-generator-feed hexo-generator-sitemap #Feed Atomfeed: type: atom path: atom.xml limit: 20 #sitemapsitemap: path: sitemap.xml主题配置文件: # ————————————————————— Site Information Settings—————————————————————Put your favicon.ico into hexo-site/source/ directory.favicon: /favicon.ico Set default keywords (Use a comma to separate)keywords: “ios开发,objective-c教程,swift 教程, xcode 教程,网站建设,tim的博客,timblog, tim,tim博客” Set rss to false to disable feed link.Leave rss as empty to use site’s feed link.Set rss to specific value if you have burned your feed already.rss: Specify the date when the site was setup#since: 2015 icon between year and author @Footerauthoricon: heart Footer powered-by and theme-info copyrightcopyright: true Canonical, set a canonical link tag in your hexo, you could use it for your SEO of blog.See: https://support.google.com/webmasters/answer/139066Tips: Before you open this tag, remember set up your URL in hexo _config.yml ( ex. url: http://yourdomain.com )canonical: true Change headers hierarchy on site-subtitle (will be main site description) and on all post/pages titles for better SEO-optimization.seo: false —————————————————————Menu Settings—————————————————————When running the site in a subdirectory (e.g. domain.tld/blog), remove the leading slash (/archives -> archives)menu: home: / tags: /tags categories: /categories archives: /archives about: /about sitemap: /sitemap.xml commonweal: /404.html Enable/Disable menu icons.Icon Mapping:Map a menu item to a specific FontAwesome icon name.Key is the name of menu item and value is the name of FontAwesome icon. Key is case-senstive.When an question mask icon presenting up means that the item has no mapping icon.menu_icons: enable: true #KeyMapsToMenuItemKey: NameOfTheIconFromFontAwesome home: home about: user categories: th schedule: calendar tags: tags archives: archive sitemap: sitemap commonweal: heartbeat —————————————————————Scheme Settings—————————————————————Schemes#scheme: Muse #scheme: Mistscheme: Pisces —————————————————————Font Settings- Find fonts on Google Fonts (https://www.google.com/fonts)- All fonts set here will have the following styles:light, light italic, normal, normal italic, bold, bold italic- Be aware that setting too much fonts will cause site running slowly- Introduce in 5.0.1—————————————————————font: enable: true Uri of fonts host. E.g. //fonts.googleapis.com (Default) host: Global font settings used on <body> element. global: # external: true will load this font family from host. external: true family: Lato Font settings for Headlines (h1, h2, h3, h4, h5, h6)Fallback to global font settings. headings: external: true family: Font settings for postsFallback to global font settings. posts: external: true family: Font settings for LogoFallback to global font settings.The size option use px as unit logo: external: true family: size: Font settings for <code> and code blocks. codes: external: true family: size: —————————————————————Sidebar Settings—————————————————————Social LinksKey is the link label showing to end users.Value is the target link (E.g. GitHub: https://github.com/iissnan)social: GitHub: https://github.com/timhbw 微博: http://weibo.com/huangboweicom Social Links IconsIcon Mapping:Map a menu item to a specific FontAwesome icon name.Key is the name of the item and value is the name of FontAwesome icon. Key is case-senstive.When an globe mask icon presenting up means that the item has no mapping icon.social_icons: enable: true Icon Mappings.KeyMapsToSocialItemKey: NameOfTheIconFromFontAwesome GitHub: github #Twitter: twitter Weibo: weibo Sidebar Avatarin theme directory(source/images): /images/avatar.jpgin site directory(source/uploads): /uploads/avatar.jpg#avatar: Table Of Contents in the Sidebartoc: enable: true Automatically add list number to toc. number: true Creative Commons 4.0 International License.http://creativecommons.org/Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero#creative_commons: by-nc-sa #creative_commons: sidebar: Sidebar Position, available value: left | right #position: left position: right Sidebar Display, available value:- post expand on posts automatically. Default.- always expand for all pages automatically- hide expand only when click on the sidebar toggle icon.- remove Totally remove sidebar including sidebar toggle. display: post #display: always #display: hide #display: remove Sidebar offset from top menubar in pixels. offset: 12 offset_float: 0 Back to top in sidebar b2t: false Scroll percent label in b2t button scrollpercent: false Blog rolls#links_title: Links #links_layout: block #links_layout: inline #links: #Title: http://example.com/ —————————————————————Post Settings—————————————————————Automatically scroll page to section which is under <!– more –> mark.scroll_to_more: true Automatically excerpt description in homepage as preamble text.excerpt_description: true Automatically Excerpt. Not recommend.Please use <!– more –> in the post to control excerpt accurately.auto_excerpt: enable: true length: 150 Post meta display settingspost_meta: item_text: true created_at: true updated_at: false categories: true Post wordcount display settingsDependencies: https://github.com/willin/hexo-wordcountpost_wordcount: item_text: true wordcount: true min2read: true Wechat Subscriber#wechat_subscriber: enabled: true qcode: /uploads/wechat-qcode.jpg description: 欢迎您扫一扫上面的微信号,与我交流! —————————————————————Misc Theme Settings—————————————————————Custom Logo.!!Only available for Default Scheme currently.Options:enabled: [true/false] - Replace with specific imageimage: url-of-image - Images’s urlcustom_logo: enabled: false image: Code Highlight themeAvailable value:normal | night | night eighties | night blue | night brighthttps://github.com/chriskempson/tomorrow-themehighlight_theme: night —————————————————————Third Party Services Settings—————————————————————MathJax Supportmathjax: enable: false per_page: false cdn: //cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML Swiftype Search API Key#swiftype_key: Baidu Analytics ID#baidu_analytics: Duoshuo ShortNameduoshuo_shortname: githubhuangbowei Disqus#disqus_shortname: Hypercomments#hypercomments_id: Gentie productKey#gentie_productKey: Support for youyan comments system.You can get your uid from http://www.uyan.cc#youyan_uid: your uid Support for LiveRe comments system.You can get your uid from https://livere.com/insight/myCode (General web site)#livere_uid: your uid Baidu ShareAvailable value:button | slideWarning: Baidu Share does not support https.#baidushare: type: buttonShare#jiathis: Warning: JiaThis does not support https.#add_this_id: Share#duoshuo_share: true Google Webmaster tools verification settingSee: https://www.google.com/webmasters/#google_site_verification: Google Analytics#google_analytics: Yandex Webmaster tools verification settingSee: https://webmaster.yandex.ru/#yandex_site_verification: CNZZ count#cnzz_siteid: Application InsightsSee https://azure.microsoft.com/en-us/services/application-insights/application_insights:Make duoshuo show UAuser_id must NOT be null when admin_enable is true!you can visit http://dev.duoshuo.com get duoshuo user id.duoshuo_info: ua_enable: true admin_enable: true user_id: xxxxxxxxxxx #填写自己的多说 id admin_nickname: timhbw博主 Facebook SDK Support.https://github.com/iissnan/hexo-theme-next/pull/410facebook_sdk: enable: false app_id: #<app_id> fb_admin: #<user_id> like_button: #true webmaster: #true Facebook comments pluginThis plugin depends on Facebook SDK.If facebook_sdk.enable is false, Facebook comments plugin is unavailable.facebook_comments_plugin: enable: false num_of_posts: 10 # min posts num is 1 width: 100% # default width is 550px scheme: light # default scheme is light (light or dark) VKontakte API Support.To get your AppID visit https://vk.com/editapp?act=createvkontakte_api: enable: false app_id: #<app_id> like: true comments: true num_of_posts: 10 Show number of visitors to each article.You can visit https://leancloud.cn get AppID and AppKey.leancloud_visitors: enable: false app_id: #<app_id> app_key: #<app_key> Show PV/UV of the website/page with busuanzi.Get more information on http://ibruce.info/2015/04/04/busuanzi/busuanzi_count: count values only if the other configs are false enable: true custom uv span for the whole site site_uv: true site_uv_header: <i class=”fa fa-user”></i> site_uv_footer: 人次 custom pv span for the whole site site_pv: true site_pv_header: <i class=”fa fa-eye”></i> site_pv_footer: 次 custom pv span for one page only page_pv: true page_pv_header: <i class=”fa fa-file-o”></i> page_pv_footer: 次 Tencent analytics IDtencent_analytics:Tencent MTA IDtencent_mta:Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEObaidu_push: false Google CalendarShare your recent schedule to others via calendar page# API Documentation:https://developers.google.com/google-apps/calendar/v3/reference/events/listcalendar: enable: false calendar_id: <required> api_key: <required> orderBy: startTime offsetMax: 24 offsetMin: 4 timeZone: showDeleted: false singleEvents: true maxResults: 250 Algolia Searchalgolia_search: enable: false hits: per_page: 10 labels: input_placeholder: Search for Posts hits_empty: “We didn’t find any results for the search: ${query}” hits_stats: “${hits} results found in ${time} ms” Local searchlocal_search: enable: true External URL with BASE64 encrypt & decryptUsage: text url titleAlias: text url titleexturl: false #! ————————————————————— #! DO NOT EDIT THE FOLLOWING SETTINGS #! UNLESS YOU KNOW WHAT YOU ARE DOING #! ————————————————————— Motionuse_motion: true Fancyboxfancybox: true Canvas-nestcanvas_nest: false Script Vendors.Set a CDN address for the vendor you want to customize.For examplejquery: https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.jsBe aware that you should use the same version as internal ones to avoid potential problems.Please use the https protocol of CDN files when you enable https on your site.vendors: Internal path prefix. Please do not edit it. _internal: lib Internal version: 2.1.3 jquery: Internal version: 2.1.5See: http://fancyapps.com/fancybox/ fancybox: fancybox_css: Internal version: 1.0.6See: https://github.com/ftlabs/fastclick fastclick: Internal version: 1.9.7See: https://github.com/tuupola/jquery_lazyload lazyload: Internal version: 1.2.1See: http://VelocityJS.org velocity: Internal version: 1.2.1See: http://VelocityJS.org velocity_ui: Internal version: 0.7.9See: https://faisalman.github.io/ua-parser-js/ ua_parser: Internal version: 4.6.2See: http://fontawesome.io/ fontawesome: Internal version: 1https://www.algolia.com algolia_instant_js: algolia_instant_css: Internal version: 1.0.0https://github.com/hustcc/canvas-nest.js canvas_nest: Assetscss: cssjs: jsimages: images Theme versionversion: 5.1.0 website startsince: 2015 duoshuo_hotartical: true 3.一些常见的问题3.1.不能上传 README.md 文件GitHub 不能上传 README.md 文件,对于强迫症患者来说,这是不能接受的,如果按普通做法的话,当你生成静态文件然后上传的时候,hexo 会自动把README.md渲染成README.html,内容也变了,就因为这个,差点重装用另一种方法。但是经过一番摸索,搞定,下面是方法: 在博客目录下的 source 文件夹下新建README.md 文件: 然后修改博客的_config.yml ,29行左右修改为: skip_render: README.md,然后执行hexo clean && hexo g && hexo d ,再去 GitHub 上看,会发现久违的 README.md 文件出现了,这才完整,赏心悦目。]]></content>
</entry>
<entry>
<title><![CDATA[Hexo-完全免费全平台搭建个人博客(1)-整体搭建]]></title>
<url>%2F2017%2F03%2F09%2F112%2F</url>
<content type="text"><![CDATA[几个月前就想写这篇文章了,很多人也让我写过,也帮很多人搭建过,但是一直没时间纪录下来,这次有时间了,把安装的过程详细的记录下来。虽然网上有大量教程,我为什么又要造轮子呢?因为长时间的观察和浏览,教程这东西写的详细的很少,当然还是有的,百度上大部分都是一模一样的教程,博主为了浏览量爬虫或者粘贴复制过来的,参考价值不大,排版混乱。所以,自己动手写一个,让初学者不走弯路。 教程分为四大部分: Hexo 本地部署(博客前端设置) Hexo 简单个性化(博客前端设置) 文章迁移(可选) Github域名设置(博客后端设置) Hexo 与 Github 关联(前端后端连接) 1.Hexo本地部署1.1.安装HomebrewHomebrew 是一个套件管理器,安装完之后就可以用 brew 命令安装各种依赖软件,类似于 Linux 下的 apt-get 和 yum。进入 Homebrew 的官方中文网站:Homebrew 官方网站,打开 Mac 的终端,输入一行命令:/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” ,稍作等待,就可以安装成功,我的电脑基本上都是挂着 ss 的,你们如果没有梯子的话,下载速度可能有点慢,Mac 用户在编译时可能会遇到问题,请先到 App Store 安装 Xcode,Xcode 完成后,启动并进入 Preferences -> Download -> Command Line Tools -> Install 安装命令行工具。 1.2.安装 Node.jsa.输入命令brew install wget ,安装 wget: b.输入wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh 安装nvm,这一步是为了安装 Node.js,因为安装 Node.js 的最佳方式是使用 nvm。 c.输入nvm install stable 安装 Node.js: 1.3.安装Git输入brew install git 安装 Git: 1.4.安装Hexo输入npm install -g hexo-cli 安装我们今天的主角: 2.Hexo 简单个性化我们来看一看 Hexo 的主页: 让我们继续设置下我们的博客,这里简单配置下然后修改下样式,后面大家有时间研究可以深入研究,先初始化一个 Hexo 目录,用来放我们所有的博客静态文件,文件夹命名随意,这里我规范点,以 timhbw.github.io 命名,因为这个就是GitHub 提供给我们的免费域名,后面会讲到。输入hexo init xxxxx : 然后执行下面命令,1.进入博客目录,2.安装 npm模块,安装在node_modules目录下图中执行的hexo generate 暂时可以不用执行,是用来生成静态文件的: cd xxxxx npm install [![](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo15.png)](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo15.png) 启动 Hexo 本地服务,输入hexo server ,然后浏览器输入http://localhost:4000/,[点击](http://localhost:4000/)访问: [![](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo16.png)](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo16.png) 默认的主题不太美观,还是换一个主题比较好,就换 NexT主题,Hexo 平台用户量数一数二的,外观、效果、扩展性也的确没话说,可玩性高。输入git clone https://github.com/iissnan/hexo-theme-next themes/next 安装 NexT 主题,关于 NexT 主题,可以去[官网](http://theme-next.iissnan.com/)看一看,做 iOS 想必大家都熟悉瞄神,他的主题在[这里](https://github.com/monniya/hexo-theme-new-vno),Hexo 官方收录的主题在[这里](https://hexo.io/themes/): [![](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo17.png)](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo17.png) 下载好文件到博客目录的themes文件夹下后,系统怎么知道你要用哪一个主题呢?当然要自己修改配置文件了。打开_config.yml 文件修改66行左右为theme: next : [![](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo18.png)](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo18.png) [![](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo19.png)](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo19.png) [![](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo20.png)](https://www.huangbowei.com/wp-content/uploads/2017/03/hexo20.png) 修改主题为 next 后,可以顺便把配置文件里面的其他东西一并修改,下面是我修改好的_config.yml ,个人添加了详细解释,**大家根据自己情况修改(_config.yml是博客的整体配置文件,很多基础配置、插件配置等都需要在里面进行,有些是在主题里面设置。要注意的是,该文件格式要求比较严格,冒号后要一定有空格,不要 Tab 缩进,用空格)**: # Hexo Configuration ## Docs: https://hexo.io/docs/configuration.html ## Source: https://github.com/hexojs/hexo/ # Site title: Tim博客 #网站标题 subtitle: 不忘初心,方得始终 #网站副标题 description: 自学iOS开发进阶博客,分享高质量的iOS开发技术。#网站描述 author: Timhbw #您的名字 language: zh-Hans #网站使用的语言 timezone: UTC #网站时区。Hexo 默认使用您电脑的时区。 # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' url: http://timhbw.github.io #网址 root: / #网站根目录 permalink: :year/:month/:day/:title/ #文章的 永久链接 格式 permalink_defaults: #永久链接中各部分的默认值 # Directory source_dir: source #资源文件夹,这个文件夹用来存放内容。 public_dir: public #公共文件夹,这个文件夹用于存放生成的站点文件。 tag_dir: tags #标签文件夹 archive_dir: archives #归档文件夹 category_dir: categories #分类文件夹 code_dir: downloads/code #Include code 文件夹 i18n_dir: :lang #国际化(i18n)文件夹 skip_render: #跳过指定文件的渲染,您可使用 [glob 表达式](https://github.com/isaacs/node-glob)来匹配路径。 # Writing new_post_name: :title.md #新文章的文件名称 default_layout: post #预设布局 auto_spacing:true #在中文和英文之间加入空格 titlecase: false #把标题转换为 title case external_link: true #在新标签中打开链接 filename_case: 0 #把文件名称转换为 (1) 小写或 (2) 大写 render_drafts: false #显示草稿 post_asset_folder: false #启动 [Asset 文件夹](https://hexo.io/zh-cn/docs/asset-folders.html) relative_link: false #把链接改为与根目录的相对位址 future: true #显示未来的文章 highlight: #代码块的设置 enable: true line_number: true auto_detect: false tab_replace: # Category & Tag default_category: ios #默认分类 category_map: #分类别名 tag_map: #标签别名 # Date / Time format ## Hexo uses Moment.js to parse and display date ## You can customize the date format as defined in ## http://momentjs.com/docs/#/displaying/format/ date_format: YYYY-MM-DD #日期格式 time_format: HH:mm:ss #时间格式 # Pagination ## Set per_page to 0 to disable pagination per_page: 10 #每页显示的文章量 (0 = 关闭分页功能) pagination_dir: page #分页目录 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: next #当前主题名称。值为`false`时禁用主题 # Deployment ## Docs: https://hexo.io/docs/deployment.html deploy: #部署部分的设置 type: 3.文章迁移(可选)如果是刚刚开始写博客读者,可以直接看 GitHub 域名设置了。有些人是其他博客转过来的,之前还有文章,一篇一篇复制过来太慢,像我的文章快100多篇了,手动转换的话估计没人愿意转移到 Hexo 平台下。所以就有一键迁移这个工具,我试了下,效果还不错。 支持以下格式迁移: RSS Jekyll Octopress WordPress Joomla这里我以用户数量庞大的WordPress 为例: 先在 Mac 终端里面输入npm install hexo-migrator-wordpress –save 插件用来迁移 WordPress 文章,然后根据图中所示登录 WordPress 后台下载好 xml 格式的文件: 然后回到终端,输入如下命令,注意 xml 文件的路径请修改为自己的路径: hexo migrate wordpress /Users/timhbw/Downloads/tim.wordpress.2017-03-08.xml然后重新启动 Hexo,输入hexo server ,然后浏览器输入http://localhost:4000/,[点击](http://localhost:4000/)访问: 4.Github域名设置经过以上步骤,网站在本地已经有模有样了,就差部署到服务器上了,这样普通用户就可以通过网络任意访问你写的文章,而不是只有你本地或者局域网能访问,那这样博客的意义也就消失了。这里既然是免费,那就采取 GitHub 的免费服务器和免费域名,如果折腾一会儿,想要更好的性能或者权限,就得自己购买服务器和域名,域名30左右,服务器国内阿里云,腾讯云一般60左右一个月,一般人不会掏这个钱,国外 VPS 性价比比较高,可以搭建梯子还可以放置个人博客等等,价格100到几千一年不等。下面开始 Github 服务端部署: 4.1.注册一个 GitHub 账号注意注册账号时填写的 username,将会是你的域名的一部分,你的域名是 username.github.io 这个样子,所以取一个自己常用的,有代表性的 username。如果已经有了可以进行下一步。 4.2.新建一个仓库 4.3.设置仓库信息Repository name设置为username.github.io,Description (描述)可以选填: 创建好仓库后稍作设置,就可以访问了: 5.Hexo 与 Github 关联5.1.修改 Hexo 配置文件文件位于xxxxx.github.io/_config.yml ,注意配置文件内的冒号后要有空格: 这里只要修改Deployment 部分,大家根据自己情况修改,不要照抄: # Deployment Docs: https://hexo.io/docs/deployment.htmldeploy: type: git #用 Git 发布 repo: https://github.com/Timhbw/timhbw.github.io.git #刚刚在 Github 上创建的仓库的地址 然后安装安装 hexo-deployer-git: npm install hexo-deployer-git –save然后一键部署,只需一条命令就能将网站部署到服务器上: hexo deploy更多常用的命令: hexo clean && hexo g -s #清除、生成、启动hexo clean && hexo g -d #清除、生成、部署hexo new “postName” #新建文章hexo new page “pageName” #新建页面hexo generate #生成静态页面至public目录hexo server #开启预览访问端口(默认端口4000,’ctrl + c’关闭server)hexo deploy #将.deploy目录部署到GitHubhexo help #查看帮助hexo version #查看Hexo的版本 发布完成,可以进 Github 上看一看自己的仓库: 打开 GitHub 上你的仓库,刷新一下页面,然后访问 xxxxx.github.io,就可以看到你的博客了。 5.总结到这里,简单的搭建一个完全免费的个人博客已经搞定。其实还是挺简单的,而且有官方文档,挺详细的,想要更多的设置,更加个性化,还有很多要做,一步一步来,先把整个框架搭起来,保证博客能访问。后面我会写一篇关于 Hexo 个性化设置的详细文章,以我的博客为基础,让大家也能够实时的看到效果。]]></content>
</entry>
<entry>
<title><![CDATA[网站全站开启 HTTPS(二、腾讯云 SSL 证书)]]></title>
<url>%2F2017%2F02%2F06%2F111-1%2F</url>
<content type="text"><![CDATA[网站全站开启 HTTPS(一、又拍云一键部署) 之前写过又拍云的 SSL 证书一键部署,用的是 Let’s Encrypt 证书,而这次介绍的腾讯云用的是 TrustAsia 亚洲诚信的证书,Symantec™(赛门铁克)的白金合作伙伴,专业为企业提供包含数字证书在内的所有网络安全服务,它家的证书有效期是一年,而 Let’s Encrypt 的证书有效期是3个月,虽然会自动续期,但是身为强迫症还是选择期限久的,起码方便。如果有服务器在腾讯云上用自家的服务也是相当的不错的,下面介绍相关教程: 这个网站最开始还是 HTTP 的,没有小绿锁。首先进入腾讯云官网注册账号,官网地址: 点击右上角就可以注册: 注册完毕后开始申请 SSL 证书: 这里有一些介绍,可以看看,以便增加了解,下方也有工具可以检测是否开启 HTTPS,点击立即使用: 图中是我自己网站之前申请的 SSL 证书,我们首先点击申请证书: 然后默认选择亚洲诚信免费的一年证书: 填写相关资料,点击下一步: 因为我的服务器是在腾讯云,并且使用腾讯云解析,所以会有第一个选项,一般用手动 DNS 验证就好: 点击确认使用后弹出窗口: 可以看到提示如图,需要添加 CNAME 记录: 到域名解析商处添加上图给你的信息: 一般十几秒就好,慢点的就几分钟: 等待证书审核: 几分钟后,手机收到短信,邮箱收到邮件,提示审核通过,点击下载按钮下载相关文件: 下载文件中有如下3个文件夹:分别是 linux 下的 Nginx、Apache 和 Windows 下的 IIS,这里我选择 Nginx,大家根据自己情况选择,关于搭建博客大家可以参考我以前写的文章:小白搭建博客教程-购买虚拟主机并搭建(2) 腾讯云证书申请成功,但是服务器端也要做相应的修改,我的修改路径是在: /usr/local/nginx/conf/vhost ,下面是网站的 Nginx 配置的初始配置代码与修改后的配置代码,方便大家对照,大家根据自己情况修改对应域名,然后在/usr/local/nginx/conf/ssl/ 中放入刚刚在腾讯云下载的2个文件:1_ssltencent.huangbowei.com_bundle.crt 和2_ssltencent.huangbowei.com.key ,名称与你自己申请的域名对应: 修改前: server { listen 80; #listen [::]:80; server_name ssltencent.huangbowei.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/ssltencent.huangbowei.com; include none.conf; #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log off; } 修改后:server {listen 80;server_name ssltencent.huangbowei.com; rewrite ^ https://$server_name$request_uri permanent;} server { listen 443 ssl http2; #listen 80; #listen [::]:80; server_name ssltencent.huangbowei.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/ssltencent.huangbowei.com; ssl on; ssl_certificate /usr/local/nginx/conf/ssl/1_ssltencent.huangbowei.com_bundle.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/2_ssltencent.huangbowei.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; include none.conf; #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log off; }</pre> 这时候大家刷新下浏览器,就会看到网站已经有一把令人心情愉悦的小绿锁了,如果没有,清除浏览器缓存或者重启 Nginx 服务器,点击进入测试网站:cd lnmp1.3-full lnmp nginx restart]]></content>
</entry>
<entry>
<title><![CDATA[网站全站开启 HTTPS(二、腾讯云 SSL 证书)]]></title>
<url>%2F2017%2F02%2F06%2F111%2F</url>
<content type="text"><![CDATA[网站全站开启 HTTPS(一、又拍云一键部署) 之前写过又拍云的 SSL 证书一键部署,用的是 Let’s Encrypt 证书,而这次介绍的腾讯云用的是 TrustAsia 亚洲诚信的证书,Symantec™(赛门铁克)的白金合作伙伴,专业为企业提供包含数字证书在内的所有网络安全服务,它家的证书有效期是一年,而 Let’s Encrypt 的证书有效期是3个月,虽然会自动续期,但是身为强迫症还是选择期限久的,起码方便。如果有服务器在腾讯云上用自家的服务也是相当的不错的,下面介绍相关教程: 这个网站最开始还是 HTTP 的,没有小绿锁。首先进入腾讯云官网注册账号,官网地址: 点击右上角就可以注册: 注册完毕后开始申请 SSL 证书: 这里有一些介绍,可以看看,以便增加了解,下方也有工具可以检测是否开启 HTTPS,点击立即使用: 图中是我自己网站之前申请的 SSL 证书,我们首先点击申请证书: 然后默认选择亚洲诚信免费的一年证书: 填写相关资料,点击下一步: 因为我的服务器是在腾讯云,并且使用腾讯云解析,所以会有第一个选项,一般用手动 DNS 验证就好: 点击确认使用后弹出窗口: 可以看到提示如图,需要添加 CNAME 记录: 到域名解析商处添加上图给你的信息: 一般十几秒就好,慢点的就几分钟: 等待证书审核: 几分钟后,手机收到短信,邮箱收到邮件,提示审核通过,点击下载按钮下载相关文件: 下载文件中有如下3个文件夹:分别是 linux 下的 Nginx、Apache 和 Windows 下的 IIS,这里我选择 Nginx,大家根据自己情况选择,关于搭建博客大家可以参考我以前写的文章:小白搭建博客教程-购买虚拟主机并搭建(2) 腾讯云证书申请成功,但是服务器端也要做相应的修改,我的修改路径是在: /usr/local/nginx/conf/vhost ,下面是网站的 Nginx 配置的初始配置代码与修改后的配置代码,方便大家对照,大家根据自己情况修改对应域名,然后在/usr/local/nginx/conf/ssl/ 中放入刚刚在腾讯云下载的2个文件:1_ssltencent.huangbowei.com_bundle.crt 和2_ssltencent.huangbowei.com.key ,名称与你自己申请的域名对应: 修改前: server { listen 80; #listen [::]:80; server_name ssltencent.huangbowei.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/ssltencent.huangbowei.com; include none.conf; #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log off; } 修改后:server {listen 80;server_name ssltencent.huangbowei.com; rewrite ^ https://$server_name$request_uri permanent;} server { listen 443 ssl http2; #listen 80; #listen [::]:80; server_name ssltencent.huangbowei.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/ssltencent.huangbowei.com; ssl on; ssl_certificate /usr/local/nginx/conf/ssl/1_ssltencent.huangbowei.com_bundle.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/2_ssltencent.huangbowei.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; include none.conf; #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log off; }</pre> 这时候大家刷新下浏览器,就会看到网站已经有一把令人心情愉悦的小绿锁了,如果没有,清除浏览器缓存或者重启 Nginx 服务器,点击进入测试网站:cd lnmp1.3-full lnmp nginx restart]]></content>
</entry>
<entry>
<title><![CDATA[网站全站开启 HTTPS(一、又拍云一键部署)]]></title>
<url>%2F2017%2F02%2F01%2F110-1%2F</url>
<content type="text"><![CDATA[HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近两年,Google、Apple、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国外的大型互联网公司很多也都已经启用了全站 HTTPS,这也是未来互联网发展的趋势。为鼓励全球网站的 HTTPS 实现,Google 甚至调整了搜索引擎算法,让采用 HTTPS 的网站在搜索中排名更靠前。想必在不久的将来,全网 HTTPS 势在必行。越来越多的网站选择 HTTPS 加密访问作为用户信息与网站安全的保障,所以趁着过年这几天有时间,准备把手下所有网站全部加上小绿锁,这几天也一直在研究,终于搞定,,一通全通,其实步骤也不难,只需要几步就可以搞定,下面把详细教程写出来,以免大家走弯路。通过查阅资料等,我大概掌握到3种比较便捷、自动的方法,这里先介绍第一种: 服务器环境: 上海腾讯云65元/月 Debina 7.8 64位 lnmp(lnmp.org) 1.全站 HTTPS 趋势 苹果宣布 2017 年 App Store 中的所用应用都必须使用 HTTPS 加密连接; 百度、Google 等搜索引擎优先收录 HTTPS 页面并提升排名; 英美强制要求所有政府网站 2016 年实现全站 HTTPS 加密; 百度、阿里巴巴等互联网巨头均启用全站 HTTPS 加密;* 新一代 HTTP/2 协议的支持需以 HTTPS 为基础; 2.专有名词介绍先介绍一些专有名词,以便大家更好地阅读文章,已经了解的可以忽略这一步: HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,即 HTTP 的安全版。HTTPS 的安全基础是 SSL/TLS,它提供了身份验证与加密通讯的方法,现在被广泛用于万维网上安全敏感的通讯,比如交易、支付等。 SSL(Secure Socket Layer,安全套接字层) SSL 由为 Netscape 公司所研发,用以保障在 Internet 上数据传输之安全,利用数据加密 (Encryption) 技术,可确保数据在网络上传输过程中不会被截取。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。 TLS(Transport Layer Security,传输层安全) 传输层加密协议,其前身是 SSL 协议, 1999 年经过 IETF(The Internet Engineering Task Force 国际互联网工程任务组) 讨论和规范后,改名为 TLS。发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。TLS 1.3 改动会比较大,还在草案阶段,目前使用最广泛的是 TLS 1.1、TLS 1.2。 SSL 证书 SSL 证书就是遵守 SSL 协议的服务器数字证书,通过验证域名、服务器身份后,由受信任的数字证书授权机构 CA 颁发,具有服务器身份验证和数据传输加密等功能。 CA 数字证书授权机构 (CA,Certificate Authority) 是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。 域名型 SSL 证书(DV SSL) 即证书颁布机构只对域名的所有者(一般是域名管理员邮箱,比如admin@hotmail.com)进行在线检查,通常是发送验证邮件给域名管理员或以该域名结尾的邮箱。 企业型 SSL 证书(OV SSL) 是要购买者提交组织机构资料和单位授权信等在官方注册的凭证,证书颁发机构在签发 SSL 证书前不仅仅要检验域名所有权,还必须对这些资料的真实合法性进行多方查验,只有通过验证的才能颁发 SSL 证书。 增强型 SSL 证书(EV SSL) 与其他 SSL 证书一样,都是基于 SSL/TLS 安全协议,但是验证流程更加具体详细,验证步骤更多,这样一来证书所绑定的网站就更加的可靠、可信。它跟普通 SSL 证书的区别也是明显的,安全浏览器的地址栏变绿,如果是不受信的 SSL 证书则拒绝显示,如果是钓鱼网站,地址栏则会变成红色,以警示用户。 3.网站申请证书前一个月左右看群里消息,发现又拍云也可以免费部署证书,但是一直没有时间,所以过年尝试下。又拍云的免费证书,官方宣称:一键部署,免费、自动化证书签发。到底是不是,我来试试就知道了,下面开始。 进入又拍云官网:又拍云,注册账号什么的不用我说了,大家都会。 这个是测试网站,现在访问还是 http 形式的,非常不安全。 注册好账号后,进入又拍云的控制台,如图依次点击: 点击继续: 填写需要申请的域名,域名需要已经备案的: 这时候会提醒你没有绑定服务,点击前往绑定服务,这个窗口无需关闭: 接下来是创建服务: 服务名称只要自己方便记忆就好,这里回源协议选择 HTTP,服务器端的配置文件不需要更改,更加方便: 根据提示填写: 服务创建成功: 根据提示到域名服务商添加 CNAME 记录: 由于我的是托管在腾讯云,之前用的是 CloudXNS ,不错,广大博主都从 Dnspod 迁移过来,但是我为了方便管理,就全部托管在腾讯云: 这时候再回到上一个页面,点击下一步: 点击提交: 申请提交已经成功,等待审核: 会显示对应状态,我的还在审核中,一般几分钟就好: 证书已经申请成功: 接下来还需要简单配置2步,第一步: 第二步: 又拍云配置成功,但是服务器端也要做相应的修改,我的修改路径是在:/usr/local/nginx/conf/vhost ,下面是网站的 Nginx 配置的图片,下面会给出代码格式,方便大家对照,大家根据自己情况修改对应域名: server { listen 443 ssl http2; #listen [::]:80; server_name ssl.huangbowei.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/ssl.huangbowei.com; include none.conf; #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log off; } 这时候大家刷新下浏览器,就会看到网站已经有一把令人心情愉悦的小绿锁了,如果没有,清除浏览器缓存或者重启 Nginx 服务器,点击进入测试网站:cd lnmp1.3-full lnmp nginx restart 网站检测,ssllabs: 4.总结虽然看起来步骤简单,但是大家动手才知道。一开始我也不太会,几天后,阅读一些文章和文档,才知道具体步骤,然后结合又拍云文档才配置成功,一次部署,自动续期,Let’s Encrypt 证书有效期是90天,然后就必须重新签发,好在又拍云会自动完成续签,虽然Let’s Encrypt 官方、Oneinstack、lnmp(2017/6 即将推出的正式版1.4版本,测试版已经有) 都有相应的Let’s Encrypt自动续期脚本,各有各的好处,大家根据自身情况选择。]]></content>
</entry>
<entry>
<title><![CDATA[网站全站开启 HTTPS(一、又拍云一键部署)]]></title>
<url>%2F2017%2F02%2F01%2F110%2F</url>
<content type="text"><![CDATA[HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近两年,Google、Apple、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国外的大型互联网公司很多也都已经启用了全站 HTTPS,这也是未来互联网发展的趋势。为鼓励全球网站的 HTTPS 实现,Google 甚至调整了搜索引擎算法,让采用 HTTPS 的网站在搜索中排名更靠前。想必在不久的将来,全网 HTTPS 势在必行。越来越多的网站选择 HTTPS 加密访问作为用户信息与网站安全的保障,所以趁着过年这几天有时间,准备把手下所有网站全部加上小绿锁,这几天也一直在研究,终于搞定,,一通全通,其实步骤也不难,只需要几步就可以搞定,下面把详细教程写出来,以免大家走弯路。通过查阅资料等,我大概掌握到3种比较便捷、自动的方法,这里先介绍第一种: 服务器环境: 上海腾讯云65元/月 Debina 7.8 64位 lnmp(lnmp.org) 1.全站 HTTPS 趋势 苹果宣布 2017 年 App Store 中的所用应用都必须使用 HTTPS 加密连接; 百度、Google 等搜索引擎优先收录 HTTPS 页面并提升排名; 英美强制要求所有政府网站 2016 年实现全站 HTTPS 加密; 百度、阿里巴巴等互联网巨头均启用全站 HTTPS 加密;* 新一代 HTTP/2 协议的支持需以 HTTPS 为基础; 2.专有名词介绍先介绍一些专有名词,以便大家更好地阅读文章,已经了解的可以忽略这一步: HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,即 HTTP 的安全版。HTTPS 的安全基础是 SSL/TLS,它提供了身份验证与加密通讯的方法,现在被广泛用于万维网上安全敏感的通讯,比如交易、支付等。 SSL(Secure Socket Layer,安全套接字层) SSL 由为 Netscape 公司所研发,用以保障在 Internet 上数据传输之安全,利用数据加密 (Encryption) 技术,可确保数据在网络上传输过程中不会被截取。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。 TLS(Transport Layer Security,传输层安全) 传输层加密协议,其前身是 SSL 协议, 1999 年经过 IETF(The Internet Engineering Task Force 国际互联网工程任务组) 讨论和规范后,改名为 TLS。发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。TLS 1.3 改动会比较大,还在草案阶段,目前使用最广泛的是 TLS 1.1、TLS 1.2。 SSL 证书 SSL 证书就是遵守 SSL 协议的服务器数字证书,通过验证域名、服务器身份后,由受信任的数字证书授权机构 CA 颁发,具有服务器身份验证和数据传输加密等功能。 CA 数字证书授权机构 (CA,Certificate Authority) 是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。 域名型 SSL 证书(DV SSL) 即证书颁布机构只对域名的所有者(一般是域名管理员邮箱,比如admin@hotmail.com)进行在线检查,通常是发送验证邮件给域名管理员或以该域名结尾的邮箱。 企业型 SSL 证书(OV SSL) 是要购买者提交组织机构资料和单位授权信等在官方注册的凭证,证书颁发机构在签发 SSL 证书前不仅仅要检验域名所有权,还必须对这些资料的真实合法性进行多方查验,只有通过验证的才能颁发 SSL 证书。 增强型 SSL 证书(EV SSL) 与其他 SSL 证书一样,都是基于 SSL/TLS 安全协议,但是验证流程更加具体详细,验证步骤更多,这样一来证书所绑定的网站就更加的可靠、可信。它跟普通 SSL 证书的区别也是明显的,安全浏览器的地址栏变绿,如果是不受信的 SSL 证书则拒绝显示,如果是钓鱼网站,地址栏则会变成红色,以警示用户。 3.网站申请证书前一个月左右看群里消息,发现又拍云也可以免费部署证书,但是一直没有时间,所以过年尝试下。又拍云的免费证书,官方宣称:一键部署,免费、自动化证书签发。到底是不是,我来试试就知道了,下面开始。 进入又拍云官网:又拍云,注册账号什么的不用我说了,大家都会。 这个是测试网站,现在访问还是 http 形式的,非常不安全。 注册好账号后,进入又拍云的控制台,如图依次点击: 点击继续: 填写需要申请的域名,域名需要已经备案的: 这时候会提醒你没有绑定服务,点击前往绑定服务,这个窗口无需关闭: 接下来是创建服务: 服务名称只要自己方便记忆就好,这里回源协议选择 HTTP,服务器端的配置文件不需要更改,更加方便: 根据提示填写: 服务创建成功: 根据提示到域名服务商添加 CNAME 记录: 由于我的是托管在腾讯云,之前用的是 CloudXNS ,不错,广大博主都从 Dnspod 迁移过来,但是我为了方便管理,就全部托管在腾讯云: 这时候再回到上一个页面,点击下一步: 点击提交: 申请提交已经成功,等待审核: 会显示对应状态,我的还在审核中,一般几分钟就好: 证书已经申请成功: 接下来还需要简单配置2步,第一步: 第二步: 又拍云配置成功,但是服务器端也要做相应的修改,我的修改路径是在:/usr/local/nginx/conf/vhost ,下面是网站的 Nginx 配置的图片,下面会给出代码格式,方便大家对照,大家根据自己情况修改对应域名: server { listen 443 ssl http2; #listen [::]:80; server_name ssl.huangbowei.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/ssl.huangbowei.com; include none.conf; #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log off; } 这时候大家刷新下浏览器,就会看到网站已经有一把令人心情愉悦的小绿锁了,如果没有,清除浏览器缓存或者重启 Nginx 服务器,点击进入测试网站:cd lnmp1.3-full lnmp nginx restart 网站检测,ssllabs: 4.总结虽然看起来步骤简单,但是大家动手才知道。一开始我也不太会,几天后,阅读一些文章和文档,才知道具体步骤,然后结合又拍云文档才配置成功,一次部署,自动续期,Let’s Encrypt 证书有效期是90天,然后就必须重新签发,好在又拍云会自动完成续签,虽然Let’s Encrypt 官方、Oneinstack、lnmp(2017/6 即将推出的正式版1.4版本,测试版已经有) 都有相应的Let’s Encrypt自动续期脚本,各有各的好处,大家根据自身情况选择。]]></content>
</entry>
<entry>
<title><![CDATA[VPS搭建梯子科学上网教程]]></title>
<url>%2F2017%2F01%2F23%2F109%2F</url>
<content type="text"><![CDATA[应朋友要求,写此教程,已经会的可以忽略,基础教程。首先你得有一台国外的VPS,本教程内容为:在Windows或者Mac平台下如何连接VPS并搭建科学上网服务器。 我之前用的是搬瓦工的VPS,一年19.9刀,延迟200左右,由于搬瓦工的服务器都为OpenVZ,所以很多加速都不能用,上上谷歌还是可以,上油管看1080就看不了了。所以买了个贵点的Vultr,一年60刀,平时延迟90左右,看油管1080一点都不卡,jp的服务器,最好用104开头IP的服务器,43,45开头的我这里150左右延迟,可能因为运营商还有网络差别,请自测。 话不多说,开始我的教程,全文搭建只需要6条命令,无需其他操作! 1.连接VPS服务器1.1 Windows 平台连接VPS服务器Windows下用 PuTTY 连接就好,软件下载地址:PuTTY。 下载完毕后,一直下一步下一步就安装完毕,打开 PuTTY,填入VPS服务器的IP后,点击右下角open: 输入服务器的账号密码登录: 1.2 macOS 平台下连接VPS服务器mac下打开终端,输入 ssh root@1xx.xx.xx.x1 #端口号不是默认的22用下面这条命令,-p 后面接端口号 ssh root@1xx.xx.xx.x1 -p 5xxx0 2.搭建科学上网梯子都是用的秋大的一键脚本,总共6条命令: Shadowsocks 一键安装脚本(四合一) Windows 下和 mac 下输入命令都是一样的,这里以 Windows 为例子。以root 用户登录后,下面是搭建科学上网的,输入下面3条命令 wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.shchmod +x shadowsocks-all.sh./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log 3.开启加速服务开启加速服务,不安装这个我这边装完后勉强看油管720p,安装完这个后1080无压力,4k电脑带不动,CPU,内存飙升,所以未测试。 一键安装最新内核并开启 BBR 脚本 这个是google出品,必属精品: wget –no-check-certificate https://github.com/teddysun/across/raw/master/bbr.shchmod +x bbr.sh./bbr.sh等几分钟会有提示,输入y并回车,服务器会重启,并断开连接,等下需要再用PuTTY连接一次,然后输入uname -r 验证一下是否成功安装最新内核并开启 TCP BBR,含有 4.9 就表示 OK 了,我的返回4.9.5-040905-generic ,一般没啥问题,起码我Debina,Centos下都没出错。 4.用小飞机连接科学上网下载对应客户端软件,输入服务器地址、密码、端口、加密方式等就可以。具体就不多说,看秋大文章,或者百度云盘直接下载: 百度云 [reply] 密码: thtg[/reply] 也可以GitHub下载: 以下客户端只有windows客户端和python版客户端可以使用SSR特性,其他原版客户端只能以兼容的方式连接SSR服务器(SSR可兼容SS客户端)。 Windows / macOS Linux python / Linux Qt Android / iOS OpenWRT ]]></content>
</entry>
<entry>
<title><![CDATA[VPS搭建梯子科学上网教程]]></title>
<url>%2F2017%2F01%2F23%2F109-1%2F</url>
<content type="text"><![CDATA[应朋友要求,写此教程,已经会的可以忽略,基础教程。首先你得有一台国外的VPS,本教程内容为:在Windows或者Mac平台下如何连接VPS并搭建科学上网服务器。 我之前用的是搬瓦工的VPS,一年19.9刀,延迟200左右,由于搬瓦工的服务器都为OpenVZ,所以很多加速都不能用,上上谷歌还是可以,上油管看1080就看不了了。所以买了个贵点的Vultr,一年60刀,平时延迟90左右,看油管1080一点都不卡,jp的服务器,最好用104开头IP的服务器,43,45开头的我这里150左右延迟,可能因为运营商还有网络差别,请自测。 话不多说,开始我的教程,全文搭建只需要6条命令,无需其他操作! 1.连接VPS服务器1.1 Windows 平台连接VPS服务器Windows下用 PuTTY 连接就好,软件下载地址:PuTTY。 下载完毕后,一直下一步下一步就安装完毕,打开 PuTTY,填入VPS服务器的IP后,点击右下角open: 输入服务器的账号密码登录: 1.2 macOS 平台下连接VPS服务器mac下打开终端,输入 ssh root@1xx.xx.xx.x1 #端口号不是默认的22用下面这条命令,-p 后面接端口号 ssh root@1xx.xx.xx.x1 -p 5xxx0 2.搭建科学上网梯子都是用的秋大的一键脚本,总共6条命令: Shadowsocks 一键安装脚本(四合一) Windows 下和 mac 下输入命令都是一样的,这里以 Windows 为例子。以root 用户登录后,下面是搭建科学上网的,输入下面3条命令 wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.shchmod +x shadowsocks-all.sh./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log 3.开启加速服务开启加速服务,不安装这个我这边装完后勉强看油管720p,安装完这个后1080无压力,4k电脑带不动,CPU,内存飙升,所以未测试。 一键安装最新内核并开启 BBR 脚本 这个是google出品,必属精品: wget –no-check-certificate https://github.com/teddysun/across/raw/master/bbr.shchmod +x bbr.sh./bbr.sh等几分钟会有提示,输入y并回车,服务器会重启,并断开连接,等下需要再用PuTTY连接一次,然后输入uname -r 验证一下是否成功安装最新内核并开启 TCP BBR,含有 4.9 就表示 OK 了,我的返回4.9.5-040905-generic ,一般没啥问题,起码我Debina,Centos下都没出错。 4.用小飞机连接科学上网下载对应客户端软件,输入服务器地址、密码、端口、加密方式等就可以。具体就不多说,看秋大文章,或者百度云盘直接下载: 百度云 [reply] 密码: thtg[/reply] 也可以GitHub下载: 以下客户端只有windows客户端和python版客户端可以使用SSR特性,其他原版客户端只能以兼容的方式连接SSR服务器(SSR可兼容SS客户端)。 Windows / macOS Linux python / Linux Qt Android / iOS OpenWRT ]]></content>
</entry>
<entry>
<title><![CDATA[经过2天补救,网站恢复正常]]></title>
<url>%2F2017%2F01%2F22%2F108%2F</url>
<content type="text"><![CDATA[1.网站数据丢失大概说一下前因后果,前几天本想着备份网站数据到本地,虽然网站会每天自动备份博客和数据库到服务器,但还是不放心,毕竟不在自己手里,于是用软件同步所有文件夹,手抖选错,然后软件删除了东西,我一看正在删除,马上暂停。然后访问自己网站,没有什么问题,备份的事也就搁置了,因为这软件没这功能。 虽然删除文件比较怕,但是想着应该没啥事。下午ssh连接主机连接不上,以为自己记错密码,虽然前几个小时还登陆过,于是重启机器,结果发现网站挂了。不能开机,根本连接不上。什么报错都看不到。于是只有一个办法,试试腾讯云控制台自带的远程登录,结果能登陆,但是报错如图,按照网上办法不能解决,网上给出的解决办法都是没删除启动文件,只是找不到而已,然后通过命令设置引导启动,估计我当时是把这个启动文件删除了: 于是提交工单给腾讯云,腾讯云那边响应速度惊呆,还电话了解情况,腾讯云工程师 给我修复了下,说:”您好,这边这种情况无法恢复的,只能给您备份数据然后重装系统,请问您的数据放在系统盘还是数据盘?”,也行,反正我只要博客数据库,毕竟那么多心血文章,服务器环境自己在配置就好。于是 您好,您这边确认数据在系统盘后可以重装系统,这边已经给您系统盘进行了备份。 ftp帐号 ftp密码 ftp服务器 ftp端口0xxxxd 5xxxxxxxxxx5 1x.xxx.xx.x9 5xxx0 您重装系统后,可以通过这个ftp下载您需要的数据,谢谢您的支持。 如果问题已经解决,可确认此工单,并对服务做出评价。如果问题尚未解决,您可以继续在本工单中留言,我们会为您持续跟进。如果您有其他新的问题,欢迎提交新的工单联系我们。感谢您的支持,祝您工作顺利。 想着问题就解决了,有惊无险。于是把服务器重装系统之后,通过ftp连接腾讯工程师给我的地址:操作如下: yum install ftp ftp服务器地址 ftp端口 ftp 1.xxx.xx.xx 5xxx0 然后根据提示输入账号密码,里面有一个插曲,一开始我连接这个ftp发现怎么都连不上,咨询后才知道提供的是内网ip,只有腾讯云服务器才能连接结果进去ls下,该有的都有,很开心,然后进入博客备份文件夹,wwroot文件夹有,MySQL文件夹 有,日志文件文件夹夹和我的数据备份文件夹没了,好神奇!!想着既然数据库备份没有,那就进 MySQL 目录拷贝也一样,结果下载后恢复没用,博客数据还是没有,这里就尴尬了。 于是再次提交工单,腾讯云工程师一听,还有这事: 您好这里只做的ftp就是您系统的完整数据了,制作ftp肯定是因为无法登陆了,这个需要您确定这些数据是否在无法登陆的时候就已经被删除。或者不存在 但是文件肯定是有的,而且我设置定时任务每天都有备份,我就在工单里说明,于是他们就去排查了,期间多次电话沟通,7点多开始,然后他们那边折腾到9点多,最后电话告诉我,他们多次排查,甚至去总部机房的物理机查看也没有发现,好吧,也许服务器抽风,出问题的时候文件丢失也是有概率得,没办法,只能这样了,工程师也折腾蛮久,百分百确定连物理机都没有文件。 2.手动恢复数据我的备份是本机和另一个vps都有备份的,但是当我把vps的备份文件拉下来,恢复备份,发现竟然备份的是另一个网站的数据库,内心崩溃的,最后一根救命稻草没了。庆幸的是还有8月份的备份,好久远,但是总比没有好。 这时候又想到一根稻草,还好因为写简书,所以又一次把博客所有文章的都粘贴复制到简书笔记中,但是排版是不对的,完全混乱,于是把8月份以后的文章全部重新排版,看当时写的文章就好比看当年写的代码一样,赶紧润色润色,不规范的改一改等等,既然要做,就做的完美一点! 历经2天,文章全部恢复完毕,但是之前的评论、阅读量全部没有了,这个实在没办法。至此,恢复全部完工,心累。 3.总结历经这次以后,我赶紧在腾讯云买了一块云硬盘,以后定时任务备份的时候云硬盘一处备份,服务器一处备份,vps一处备份,本地再一处备份,再也不用担心数据丢失!以后大家也要时常检查备份文件,看看是否正确,校验下。在小年把所有问题解决,也算是圆满了。 最后,祝大家小年快乐!!]]></content>
</entry>
<entry>
<title><![CDATA[经过2天补救,网站恢复正常]]></title>
<url>%2F2017%2F01%2F22%2F108-1%2F</url>
<content type="text"><![CDATA[1.网站数据丢失大概说一下前因后果,前几天本想着备份网站数据到本地,虽然网站会每天自动备份博客和数据库到服务器,但还是不放心,毕竟不在自己手里,于是用软件同步所有文件夹,手抖选错,然后软件删除了东西,我一看正在删除,马上暂停。然后访问自己网站,没有什么问题,备份的事也就搁置了,因为这软件没这功能。 虽然删除文件比较怕,但是想着应该没啥事。下午ssh连接主机连接不上,以为自己记错密码,虽然前几个小时还登陆过,于是重启机器,结果发现网站挂了。不能开机,根本连接不上。什么报错都看不到。于是只有一个办法,试试腾讯云控制台自带的远程登录,结果能登陆,但是报错如图,按照网上办法不能解决,网上给出的解决办法都是没删除启动文件,只是找不到而已,然后通过命令设置引导启动,估计我当时是把这个启动文件删除了: 于是提交工单给腾讯云,腾讯云那边响应速度惊呆,还电话了解情况,腾讯云工程师 给我修复了下,说:”您好,这边这种情况无法恢复的,只能给您备份数据然后重装系统,请问您的数据放在系统盘还是数据盘?”,也行,反正我只要博客数据库,毕竟那么多心血文章,服务器环境自己在配置就好。于是 您好,您这边确认数据在系统盘后可以重装系统,这边已经给您系统盘进行了备份。 ftp帐号 ftp密码 ftp服务器 ftp端口0xxxxd 5xxxxxxxxxx5 1x.xxx.xx.x9 5xxx0 您重装系统后,可以通过这个ftp下载您需要的数据,谢谢您的支持。 如果问题已经解决,可确认此工单,并对服务做出评价。如果问题尚未解决,您可以继续在本工单中留言,我们会为您持续跟进。如果您有其他新的问题,欢迎提交新的工单联系我们。感谢您的支持,祝您工作顺利。 想着问题就解决了,有惊无险。于是把服务器重装系统之后,通过ftp连接腾讯工程师给我的地址:操作如下: yum install ftp ftp服务器地址 ftp端口 ftp 1.xxx.xx.xx 5xxx0 然后根据提示输入账号密码,里面有一个插曲,一开始我连接这个ftp发现怎么都连不上,咨询后才知道提供的是内网ip,只有腾讯云服务器才能连接结果进去ls下,该有的都有,很开心,然后进入博客备份文件夹,wwroot文件夹有,MySQL文件夹 有,日志文件文件夹夹和我的数据备份文件夹没了,好神奇!!想着既然数据库备份没有,那就进 MySQL 目录拷贝也一样,结果下载后恢复没用,博客数据还是没有,这里就尴尬了。 于是再次提交工单,腾讯云工程师一听,还有这事: 您好这里只做的ftp就是您系统的完整数据了,制作ftp肯定是因为无法登陆了,这个需要您确定这些数据是否在无法登陆的时候就已经被删除。或者不存在 但是文件肯定是有的,而且我设置定时任务每天都有备份,我就在工单里说明,于是他们就去排查了,期间多次电话沟通,7点多开始,然后他们那边折腾到9点多,最后电话告诉我,他们多次排查,甚至去总部机房的物理机查看也没有发现,好吧,也许服务器抽风,出问题的时候文件丢失也是有概率得,没办法,只能这样了,工程师也折腾蛮久,百分百确定连物理机都没有文件。 2.手动恢复数据我的备份是本机和另一个vps都有备份的,但是当我把vps的备份文件拉下来,恢复备份,发现竟然备份的是另一个网站的数据库,内心崩溃的,最后一根救命稻草没了。庆幸的是还有8月份的备份,好久远,但是总比没有好。 这时候又想到一根稻草,还好因为写简书,所以又一次把博客所有文章的都粘贴复制到简书笔记中,但是排版是不对的,完全混乱,于是把8月份以后的文章全部重新排版,看当时写的文章就好比看当年写的代码一样,赶紧润色润色,不规范的改一改等等,既然要做,就做的完美一点! 历经2天,文章全部恢复完毕,但是之前的评论、阅读量全部没有了,这个实在没办法。至此,恢复全部完工,心累。 3.总结历经这次以后,我赶紧在腾讯云买了一块云硬盘,以后定时任务备份的时候云硬盘一处备份,服务器一处备份,vps一处备份,本地再一处备份,再也不用担心数据丢失!以后大家也要时常检查备份文件,看看是否正确,校验下。在小年把所有问题解决,也算是圆满了。 最后,祝大家小年快乐!!]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(四)-持续更新题目]]></title>
<url>%2F2017%2F01%2F21%2F107%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 以下是一些自己收集的一些面试问题,大家可以自己思考下。 1.有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现? 2.关于 HTTP 请求 GET 和 POST 的区别是什么? 3.如何把 NSArray 里的 NSNumber 对象以顺序或反序排序? 4.iOS 开发中数据持久化的几种方式。 5.描述 UITableView的单元格重用机制,以及如何使用。 6.循环引用的产生原因,以及解决方法。 7.NSTimer 使用时注意事项? 8.在某个实例方法中,self.name = _name,name = _name 它们有区别吗,为什么? 9.非递归实现折半查找数组中值为 x 的某个元素(快速查找)。 10.Swift 的枚举、结构体和类有什么区别? 11.最近的ipv6上架的问题 以及了解ipv6是什么 12.instuments用过哪些工具,如何测试核心动画性能 13.对于ffmpeg,opengl的了解 14.如何收集APP异常信息(比如:崩溃、闪退等) 15.说说你对离屏渲染的了解,了解的话说一下你一般是从哪几方面操作的? 16.说说你对KVC和KVO的理解? 17.lldb(gdb)常用的调试命令。 18.当键盘出现的时候,如何让 UITextField 自动上移,说说你的做法。 19.说一下你编程时的命名规范,包括文件命名、类命名、类别名、一般变量名、实体变量命名、方法命名、常量命名。 20.#import 跟#include、@class有什么区别?#import<> 跟 #import””又什么区别? 21.属性 readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用? 22.写一个 setter 方法用于完成@property (nonatomic,retain)NSString name,写一个 setter 方法用于完成@property(nonatomic,copy)NSString name. 23.对于语句 NSString*obj = [[NSData alloc] init]; ,编译时和运行时obj分别是什么类型? 24.常见的 object-c 的数据类型有那些, 和 C 的基本数据类型有什么区别? 25.Objective-C 如何对内存管理的,说说你的看法和解决方法? 26.内存管理的几条原则时什么?按照默认法则.哪些方法生成的对象需要手动释放?在和 property 结合的时候怎样有效的避免内存泄露? 27.OC 中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码? 28.Difference between shallow copy and deep copy? 29.What is advantage of categories? What is difference between implementing a category and inheritance? 30.Difference between categories and extensions? 31.Difference between protocol in objective c and interfaces in java? 32.What are KVO and KVC? 33.What is purpose of delegates? 34.What are mutable and immutable types in Objective C? 35.When we call objective c is runtime language what does it mean? 36.what is difference between NSNotification and protocol? 37.What is push notification? 38.What is Polymorphism? 39.What is Singleton? 40.What is responder chain? 41.Difference between frame and bounds? 42.Difference between method and selector? 43.Is there any garbage collection mechanism in Objective C.? 44.What is NSOperation queue? 45.What is lazy loading? 46.Can we use one tableview with two different datasources? How you will achieve this? 47.id、nil 代表什么? 48.如何对iOS设备进行性能测试?]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(四)-持续更新题目]]></title>
<url>%2F2017%2F01%2F21%2F107-1%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 以下是一些自己收集的一些面试问题,大家可以自己思考下。 1.有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现? 2.关于 HTTP 请求 GET 和 POST 的区别是什么? 3.如何把 NSArray 里的 NSNumber 对象以顺序或反序排序? 4.iOS 开发中数据持久化的几种方式。 5.描述 UITableView的单元格重用机制,以及如何使用。 6.循环引用的产生原因,以及解决方法。 7.NSTimer 使用时注意事项? 8.在某个实例方法中,self.name = _name,name = _name 它们有区别吗,为什么? 9.非递归实现折半查找数组中值为 x 的某个元素(快速查找)。 10.Swift 的枚举、结构体和类有什么区别? 11.最近的ipv6上架的问题 以及了解ipv6是什么 12.instuments用过哪些工具,如何测试核心动画性能 13.对于ffmpeg,opengl的了解 14.如何收集APP异常信息(比如:崩溃、闪退等) 15.说说你对离屏渲染的了解,了解的话说一下你一般是从哪几方面操作的? 16.说说你对KVC和KVO的理解? 17.lldb(gdb)常用的调试命令。 18.当键盘出现的时候,如何让 UITextField 自动上移,说说你的做法。 19.说一下你编程时的命名规范,包括文件命名、类命名、类别名、一般变量名、实体变量命名、方法命名、常量命名。 20.#import 跟#include、@class有什么区别?#import<> 跟 #import””又什么区别? 21.属性 readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用? 22.写一个 setter 方法用于完成@property (nonatomic,retain)NSString name,写一个 setter 方法用于完成@property(nonatomic,copy)NSString name. 23.对于语句 NSString*obj = [[NSData alloc] init]; ,编译时和运行时obj分别是什么类型? 24.常见的 object-c 的数据类型有那些, 和 C 的基本数据类型有什么区别? 25.Objective-C 如何对内存管理的,说说你的看法和解决方法? 26.内存管理的几条原则时什么?按照默认法则.哪些方法生成的对象需要手动释放?在和 property 结合的时候怎样有效的避免内存泄露? 27.OC 中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码? 28.Difference between shallow copy and deep copy? 29.What is advantage of categories? What is difference between implementing a category and inheritance? 30.Difference between categories and extensions? 31.Difference between protocol in objective c and interfaces in java? 32.What are KVO and KVC? 33.What is purpose of delegates? 34.What are mutable and immutable types in Objective C? 35.When we call objective c is runtime language what does it mean? 36.what is difference between NSNotification and protocol? 37.What is push notification? 38.What is Polymorphism? 39.What is Singleton? 40.What is responder chain? 41.Difference between frame and bounds? 42.Difference between method and selector? 43.Is there any garbage collection mechanism in Objective C.? 44.What is NSOperation queue? 45.What is lazy loading? 46.Can we use one tableview with two different datasources? How you will achieve this? 47.id、nil 代表什么? 48.如何对iOS设备进行性能测试?]]></content>
</entry>
<entry>
<title><![CDATA[由于误删文件导致服务器问题,网站8月份以后文章丢失,已经解决!]]></title>
<url>%2F2017%2F01%2F20%2Fsorryfordelete-1%2F</url>
<content type="text"><![CDATA[首先,非常不好意思,由于误删文件导致服务器问题,然后网站每天备份的博客数据库又神奇的丢失,找到腾讯云的工作人员也没办法解决,幸好本地保存着2016年8月份以前的所有内容,但是网站文章8月份文章丢失。还好我在简书有文字备份,不过要自己重新排版格式了,不多说了,全是泪,重新配置博客去。看来以后备份还是得来双重保险。有一些文章在简书,大家可以移步阅读,谢谢。个人简书地址:timhbw]]></content>
</entry>
<entry>
<title><![CDATA[由于误删文件导致服务器问题,网站8月份以后文章丢失,已经解决!]]></title>
<url>%2F2017%2F01%2F20%2Fsorryfordelete%2F</url>
<content type="text"><![CDATA[首先,非常不好意思,由于误删文件导致服务器问题,然后网站每天备份的博客数据库又神奇的丢失,找到腾讯云的工作人员也没办法解决,幸好本地保存着2016年8月份以前的所有内容,但是网站文章8月份文章丢失。还好我在简书有文字备份,不过要自己重新排版格式了,不多说了,全是泪,重新配置博客去。看来以后备份还是得来双重保险。有一些文章在简书,大家可以移步阅读,谢谢。个人简书地址:timhbw]]></content>
</entry>
<entry>
<title><![CDATA[2016再见,2017努力!]]></title>
<url>%2F2017%2F01%2F05%2F106%2F</url>
<content type="text"><![CDATA[2016,这一年有得有失,感悟良多。这时候大部分人都会写一份年终总结与大家共享,然而我的年终总结就不共享出来啦,时机成熟会与大家一起分享。在这里希望大家在新的一年里大家技术越来越好;没有女朋友的找到自己心仪的女生;正在找工作的找到一份满意的工作;在工作的节节高升。 2017,我会尽自己的能力给大家更新原创技术文章,也谢谢这一年大家的支持。还是那句话,不忘初心,方得始终,大家一起学习,一起进步,一起共勉!]]></content>
</entry>
<entry>
<title><![CDATA[2016再见,2017努力!]]></title>
<url>%2F2017%2F01%2F05%2F106-1%2F</url>
<content type="text"><![CDATA[2016,这一年有得有失,感悟良多。这时候大部分人都会写一份年终总结与大家共享,然而我的年终总结就不共享出来啦,时机成熟会与大家一起分享。在这里希望大家在新的一年里大家技术越来越好;没有女朋友的找到自己心仪的女生;正在找工作的找到一份满意的工作;在工作的节节高升。 2017,我会尽自己的能力给大家更新原创技术文章,也谢谢这一年大家的支持。还是那句话,不忘初心,方得始终,大家一起学习,一起进步,一起共勉!]]></content>
</entry>
<entry>
<title><![CDATA[iOS10.1.X 已经可以越狱!逆向的同学有福了]]></title>
<url>%2F2016%2F12%2F22%2F105-1%2F</url>
<content type="text"><![CDATA[最近这些天有关越狱的消息不断,我估摸着越狱也快发布了,就等着国外大神发推或者国内的盘古,太极等发布工具。然后手头上的设备也 DFU 降级至10.1等待越狱,之前用着 beta 版本的 iOS10.2。在看这本书之前其实也不太想越狱(虽然每次出越狱必定尝试),毕竟越狱后设备安全风险增加,容易白苹果,手机上几百 G 的资料丢失比较麻烦,但是最近在看iOS逆向工程的书籍《iOS应用逆向工程 第2版》,不越狱的话没办法测试,还想着用旧设备越狱测试,其实内心是想iOS10.1 越狱的,不然我降级干嘛呢,哈哈。 很幸运的是苹果于前天关闭 iOS10.1和 iOS10.1.1的验证,还好我降级的及时。我还想着既然关闭验证了,那越狱消息发布也快了,果不其然,昨天中午2016/12/22逛Twitter,Luca Todesco发布beta1版本的越狱工具,目前迭代至 beta3,还在更新迭代中,内心激动中。 Luca Todesco 是来自意大利(由于他的推特上地理定位是朝鲜,所以很多报道写的是朝鲜大神发布越狱,这就尴尬了,朝鲜的国情大家懂得)的著名的黑客和安全研究人员 。大家越狱需谨慎,我的个人意见是不着急的话等到25号,仅供参考。由于现在还是 beta 版本的工具,极其不稳定,而且越狱后能安装的插件也不多,需要等待开发人员更新,所以先观望一段时间,毕竟如果白苹果的话,由于验证关闭,那就只能 iOS10.2再见,与越狱无缘,虽然有消息称会出10.2越狱,估计还的等一段时间。 1.支持系统由于该工具是beta版本,目前支持的系统为: 支持系统:iOS10.1~iOS10.1.1 2.支持设备支持设备:iPhone 7、iPhone 7 Plus、iPhone 6s、iPhone 6s Plus、9.7 英寸 iPad Pro 和 12.9 英寸 iPad Pro 3.越狱工具越狱工具下载地址:https://yalu.qwertyoruiop.com 他的推特账户:qwertyoruiopz 4.小白鼠越狱测试4.1 下载测试版越狱工具 网址一:https://yalu.qwertyoruiop.com 网址二:http://www.cydiaimpactor.com 下载完毕 4.2 安装程序1.安装Impactor_0.9.36 2.打开Impactor 3.电脑插上 iPhone 4.把下载好的mach_portal+yalu-b3.ipa拖到Impactor,会让你输入AppleID。 5.然后就会报错,看完报错说明大概懂意思了,由于我开启了2步验证,所以需要进入官网生成 App 专用密码。https://appleid.apple.com 6.生成 App 专用密码 7.输入 appleid 账号以及 App 专用密码后,成功 8.手机上会出现一个应用图标mach_portal,当时还不能打开,需要进入设置 -> 通用 -> 设备管理 -> 信任应用。 9.点击mach_portal应用程序,安静的等待几分钟,重启一次后没有出现 Cydia,继续重启,还是没有 Cydia,尝试多次后,还是无解,越狱失败,但是其他软件显示已经越狱,比如支付宝的指纹就不能用,说检测到设备已经越狱。论坛里也有人有这种现象,还不少,只能等待出正式版越狱工具了。 10.今天越狱成功(2016/12/30更新),想着大不了直接升级到10.2,固件也已经下好。下面说下详细步骤: 1.先用电脑 iTunes 备份iPhone 的数据到电脑本机,以备后面恢复手机数据使用,比备份在 iCloud恢复速度快。 2.打开手机的 设置-> iCloud -> 查找我的 iPhone; 3.打开电脑登录iCloud:https://www.icloud.com,进入查找我的 iPhone,可能会让你输入密码,输入 AppleID 密码就好; 4.选择你的设备,然后选择‘抹掉 iPhone ’,后面一直下一步下一步就好; 5.稍等几秒,手机会自动抹掉,然后慢慢等待。抹掉完毕设置一下手机,这时候进入桌面就会看到 Cydia,大功告成!!!(用mach_portal+yalu-b3.ipa,用mach_portal+yalu-b4-1.ipa的话 Cydia 会闪退,建议大家把图中我安装的插件都安装,以防手机白苹果之后,还能用 iFile、Terminal 救回来)。 5.总结出门在外没有无线,只能用手机开热点,电脑连接热点写文章,也算是对这篇文章的有始有终。越狱总算告一段落,算是2016年又一成功解决的事件之一。新的2017年,希望技术能够得到进一步的提升,逆向工程算是一个难啃的骨头的,利用自己的闲暇时间慢慢琢磨。]]></content>
</entry>
<entry>
<title><![CDATA[iOS10.1.X 已经可以越狱!逆向的同学有福了]]></title>
<url>%2F2016%2F12%2F22%2F105%2F</url>
<content type="text"><![CDATA[最近这些天有关越狱的消息不断,我估摸着越狱也快发布了,就等着国外大神发推或者国内的盘古,太极等发布工具。然后手头上的设备也 DFU 降级至10.1等待越狱,之前用着 beta 版本的 iOS10.2。在看这本书之前其实也不太想越狱(虽然每次出越狱必定尝试),毕竟越狱后设备安全风险增加,容易白苹果,手机上几百 G 的资料丢失比较麻烦,但是最近在看iOS逆向工程的书籍《iOS应用逆向工程 第2版》,不越狱的话没办法测试,还想着用旧设备越狱测试,其实内心是想iOS10.1 越狱的,不然我降级干嘛呢,哈哈。 很幸运的是苹果于前天关闭 iOS10.1和 iOS10.1.1的验证,还好我降级的及时。我还想着既然关闭验证了,那越狱消息发布也快了,果不其然,昨天中午2016/12/22逛Twitter,Luca Todesco发布beta1版本的越狱工具,目前迭代至 beta3,还在更新迭代中,内心激动中。 Luca Todesco 是来自意大利(由于他的推特上地理定位是朝鲜,所以很多报道写的是朝鲜大神发布越狱,这就尴尬了,朝鲜的国情大家懂得)的著名的黑客和安全研究人员 。大家越狱需谨慎,我的个人意见是不着急的话等到25号,仅供参考。由于现在还是 beta 版本的工具,极其不稳定,而且越狱后能安装的插件也不多,需要等待开发人员更新,所以先观望一段时间,毕竟如果白苹果的话,由于验证关闭,那就只能 iOS10.2再见,与越狱无缘,虽然有消息称会出10.2越狱,估计还的等一段时间。 1.支持系统由于该工具是beta版本,目前支持的系统为: 支持系统:iOS10.1~iOS10.1.1 2.支持设备支持设备:iPhone 7、iPhone 7 Plus、iPhone 6s、iPhone 6s Plus、9.7 英寸 iPad Pro 和 12.9 英寸 iPad Pro 3.越狱工具越狱工具下载地址:https://yalu.qwertyoruiop.com 他的推特账户:qwertyoruiopz 4.小白鼠越狱测试4.1 下载测试版越狱工具 网址一:https://yalu.qwertyoruiop.com 网址二:http://www.cydiaimpactor.com 下载完毕 4.2 安装程序1.安装Impactor_0.9.36 2.打开Impactor 3.电脑插上 iPhone 4.把下载好的mach_portal+yalu-b3.ipa拖到Impactor,会让你输入AppleID。 5.然后就会报错,看完报错说明大概懂意思了,由于我开启了2步验证,所以需要进入官网生成 App 专用密码。https://appleid.apple.com 6.生成 App 专用密码 7.输入 appleid 账号以及 App 专用密码后,成功 8.手机上会出现一个应用图标mach_portal,当时还不能打开,需要进入设置 -> 通用 -> 设备管理 -> 信任应用。 9.点击mach_portal应用程序,安静的等待几分钟,重启一次后没有出现 Cydia,继续重启,还是没有 Cydia,尝试多次后,还是无解,越狱失败,但是其他软件显示已经越狱,比如支付宝的指纹就不能用,说检测到设备已经越狱。论坛里也有人有这种现象,还不少,只能等待出正式版越狱工具了。 10.今天越狱成功(2016/12/30更新),想着大不了直接升级到10.2,固件也已经下好。下面说下详细步骤: 1.先用电脑 iTunes 备份iPhone 的数据到电脑本机,以备后面恢复手机数据使用,比备份在 iCloud恢复速度快。 2.打开手机的 设置-> iCloud -> 查找我的 iPhone; 3.打开电脑登录iCloud:https://www.icloud.com,进入查找我的 iPhone,可能会让你输入密码,输入 AppleID 密码就好; 4.选择你的设备,然后选择‘抹掉 iPhone ’,后面一直下一步下一步就好; 5.稍等几秒,手机会自动抹掉,然后慢慢等待。抹掉完毕设置一下手机,这时候进入桌面就会看到 Cydia,大功告成!!!(用mach_portal+yalu-b3.ipa,用mach_portal+yalu-b4-1.ipa的话 Cydia 会闪退,建议大家把图中我安装的插件都安装,以防手机白苹果之后,还能用 iFile、Terminal 救回来)。 5.总结出门在外没有无线,只能用手机开热点,电脑连接热点写文章,也算是对这篇文章的有始有终。越狱总算告一段落,算是2016年又一成功解决的事件之一。新的2017年,希望技术能够得到进一步的提升,逆向工程算是一个难啃的骨头的,利用自己的闲暇时间慢慢琢磨。]]></content>
</entry>
<entry>
<title><![CDATA[【iOS秘籍】-下载历史版本App超详细教程]]></title>
<url>%2F2016%2F12%2F02%2F104%2F</url>
<content type="text"><![CDATA[有些时候我们需要下载旧版本的 App 进行研究或者其他用途,然而在 iOS 下,苹果的 App Store 里面默认只能下载最新版本的 App,对滴,就是这么任性,不服不行。然而在 Android 里面任意一个应用商店都可以下载任意版本的 App,就是这么开放。重点来啦,今天我要教大家的就是利用 iTunes 下载任意历史版本的 App,任意哟,下面开始教程😍。(为方便大家理解操作,图片较多,流量党慎入0-0) 题外话(强迫症排版、拼写): 文章排版:个人强迫症比较喜欢关注一些细节,比如博客或者简历里面关键字的拼写,看似没什么,但是从这个最能看出一个人做事、做人的态度。最常见的就是 iOS 这几个字母的拼写,还有下面这些:(不过我截图的时候由于某些原因,里面的 HTTPS 拼写错误,大家见谅,不好意思) 正确 -> 错误iOS -> ios,IOS,IosiPhone -> IPHONE IPhoneXcode -> XCode xcodeObjective-C -> Object-CJSON -> JsonHTTP -> HttpHTTPS -> Https中英文排版:中英文间用一个半角空格(英文下再输空格,使用输入法时半月亮是半角,半角输入占文件一个字节; 全月亮是全角,全角输入占文件两个字节)隔开,排版会漂亮很多。大家可以观察下比较细心的大牛的博客或者其他文章,基本上排版都是这样,让人赏心悦目。简历和博客展示的不仅是内容,还展现着你做事的认真态度和代码风格。 对文章负责。写完文章记得检查几遍。我的习惯是写完文章检查4遍,确保文字拼写、是否有错别字、排版是否美观、语法时候有误,自己写的文章自己要负责,文章是让别人看的,要让别人看着赏心悦目。读者提出的问题也要及时采纳、更正,这样才能不断提高自己,写出好文章,帮助你我他。 1.软件准备【必备】Charles4.0.1下载密码: jfnk 【不需要,配合Charles食用效果更佳】Paw2.3.1下载密码: t3my 2.正式开始2.1 打开Charles青花瓷 2.2 安装证书以便能够拦截解析HTTPS请求数据 2.2.1 如果是选择本地安装证书的话,记住保存格式选择.cer 2.2.2 双击下载好的证书 2.2.3 右键点击证书 2.2.4 信任证书 2.2.5 ssl代理证书配置完成 2.3 打开iTunes 2.4 单击编辑左上角以便能够出现应用这个选项 2.5 在下拉选项中勾选应用 2.6 单击正上方的App Store 2.7 搜索需要下载历史版本的App,这里我以IT之家为例 2.8 点击获取按钮,就会变成正在下载 2.9 这时候查看Charles能够看到一大堆请求,看关键字p28-buy,这个是Itunes的下载请求,而且是HTTPS加密的,链接旁边有一把小锁,不能查看里面的内容 2.10 打开ssl代理并打断点拦截该请求 2.11 进入iTunes删除刚才下载的App,因为刚才只是为了获取下载请求 2.12 删除好App后刷新一下,重启Charles,再次点击iTunes的获取按钮 2.13 可以看到这时候已经能够查看HTTPS请求里面的内容了,点击图中相应位置 2.14 往下翻,可以查看到一大串数字,这些全都是该App的历史版本编号,我们只需要把想下载的历史版本的编号复制下来就好,后面会用到,这里我复制第一个11577427,为该app的第一个版本 2.15 再次点击获取按钮,下载请求会被拦截,跳转到Charles 2.16 这时候把最新的版本号替换成刚才我们复制好的历史版本号 2.17 点击Excute执行按钮,可能会来断点2次,除了第一次,后面的都直接点击Excute执行按钮 2.18 大功告成!!! 2.19 查看下载好的App的版本号 3.安装旧版本App旧版本的App下载好了,接下来我们要安装到手机上才是王道,或者进行其他用途,这里介绍下2种安装到iPhone上的方法。 利用iTunes安装手机链接电脑,iTunes自动弹出,然后会进行同步,刚才电脑上下载好的应用会自动安装到iPhone上。 利用iTools安装 4.总结学习不易,希望大家在平时学习中多多总结,积累经验,这样才能不断提高自己,做什么都不容易,不要以为其他行业简单,坚持下去就会胜利,不忘初心,方得始终。]]></content>
</entry>
<entry>
<title><![CDATA[【iOS秘籍】-下载历史版本App超详细教程]]></title>
<url>%2F2016%2F12%2F02%2F104-1%2F</url>
<content type="text"><![CDATA[有些时候我们需要下载旧版本的 App 进行研究或者其他用途,然而在 iOS 下,苹果的 App Store 里面默认只能下载最新版本的 App,对滴,就是这么任性,不服不行。然而在 Android 里面任意一个应用商店都可以下载任意版本的 App,就是这么开放。重点来啦,今天我要教大家的就是利用 iTunes 下载任意历史版本的 App,任意哟,下面开始教程😍。(为方便大家理解操作,图片较多,流量党慎入0-0) 题外话(强迫症排版、拼写): 文章排版:个人强迫症比较喜欢关注一些细节,比如博客或者简历里面关键字的拼写,看似没什么,但是从这个最能看出一个人做事、做人的态度。最常见的就是 iOS 这几个字母的拼写,还有下面这些:(不过我截图的时候由于某些原因,里面的 HTTPS 拼写错误,大家见谅,不好意思) 正确 -> 错误iOS -> ios,IOS,IosiPhone -> IPHONE IPhoneXcode -> XCode xcodeObjective-C -> Object-CJSON -> JsonHTTP -> HttpHTTPS -> Https中英文排版:中英文间用一个半角空格(英文下再输空格,使用输入法时半月亮是半角,半角输入占文件一个字节; 全月亮是全角,全角输入占文件两个字节)隔开,排版会漂亮很多。大家可以观察下比较细心的大牛的博客或者其他文章,基本上排版都是这样,让人赏心悦目。简历和博客展示的不仅是内容,还展现着你做事的认真态度和代码风格。 对文章负责。写完文章记得检查几遍。我的习惯是写完文章检查4遍,确保文字拼写、是否有错别字、排版是否美观、语法时候有误,自己写的文章自己要负责,文章是让别人看的,要让别人看着赏心悦目。读者提出的问题也要及时采纳、更正,这样才能不断提高自己,写出好文章,帮助你我他。 1.软件准备【必备】Charles4.0.1下载密码: jfnk 【不需要,配合Charles食用效果更佳】Paw2.3.1下载密码: t3my 2.正式开始2.1 打开Charles青花瓷 2.2 安装证书以便能够拦截解析HTTPS请求数据 2.2.1 如果是选择本地安装证书的话,记住保存格式选择.cer 2.2.2 双击下载好的证书 2.2.3 右键点击证书 2.2.4 信任证书 2.2.5 ssl代理证书配置完成 2.3 打开iTunes 2.4 单击编辑左上角以便能够出现应用这个选项 2.5 在下拉选项中勾选应用 2.6 单击正上方的App Store 2.7 搜索需要下载历史版本的App,这里我以IT之家为例 2.8 点击获取按钮,就会变成正在下载 2.9 这时候查看Charles能够看到一大堆请求,看关键字p28-buy,这个是Itunes的下载请求,而且是HTTPS加密的,链接旁边有一把小锁,不能查看里面的内容 2.10 打开ssl代理并打断点拦截该请求 2.11 进入iTunes删除刚才下载的App,因为刚才只是为了获取下载请求 2.12 删除好App后刷新一下,重启Charles,再次点击iTunes的获取按钮 2.13 可以看到这时候已经能够查看HTTPS请求里面的内容了,点击图中相应位置 2.14 往下翻,可以查看到一大串数字,这些全都是该App的历史版本编号,我们只需要把想下载的历史版本的编号复制下来就好,后面会用到,这里我复制第一个11577427,为该app的第一个版本 2.15 再次点击获取按钮,下载请求会被拦截,跳转到Charles 2.16 这时候把最新的版本号替换成刚才我们复制好的历史版本号 2.17 点击Excute执行按钮,可能会来断点2次,除了第一次,后面的都直接点击Excute执行按钮 2.18 大功告成!!! 2.19 查看下载好的App的版本号 3.安装旧版本App旧版本的App下载好了,接下来我们要安装到手机上才是王道,或者进行其他用途,这里介绍下2种安装到iPhone上的方法。 利用iTunes安装手机链接电脑,iTunes自动弹出,然后会进行同步,刚才电脑上下载好的应用会自动安装到iPhone上。 利用iTools安装 4.总结学习不易,希望大家在平时学习中多多总结,积累经验,这样才能不断提高自己,做什么都不容易,不要以为其他行业简单,坚持下去就会胜利,不忘初心,方得始终。]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(三)-附答案]]></title>
<url>%2F2016%2F11%2F24%2F103-1%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 这次的问题是网络多线程相关的哟,面试的时候也是必问的,大家多看看 11月24日修正一处错误:18、19题目一样,答案不一样(其实是两种理解,修改为最优的一种放上来.多谢读者提醒) 以下是一些自己收集的网络多线程方面比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。 1.请简单说明多线程技术的优点和缺点? 优点: 能够适当提高程序的执行效率; 能够适当的提高资源的利用率,比如CPU、内存。 缺点: 创建线程有额外开销 程序的代码更加复杂 线程越多,CPU在调度线程上的开销就越大 如果开启大量线程,反而会降低程序的性能 2.请简单说明线程和进程,以及他们之间的关系? 进程是CPU调度和分配资源的单位。 线程是CPU调用的最小单位 关系: 进程包含线程; 一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程; 同一个进程内的线程共享进程的资源。 3.请简单说明在iOS开发中有哪些多线程的实现方案? PThread NSThread GCD NSOperation 4.请简单说明主线程的作用,以及使用注意点? 主线程:默认启动的线程 作用:(1)显示和刷新UI界面 (2)处理UI事件 注意点: 不要将耗时操作放在主线程中执行 UI操作必须在主线程中执行 !!!! 5.请简单列出NSThread线程的几种状态,并说明状态转换的逻辑?新建->就绪 CPU调度当前任务->运行->阻塞->死亡 CPU调度其他任务->就绪 #### 6.请简单说明如何简单的解决多线程访问同一块资源造成的线程安全的问题,以及注意点? * 加同步(互斥)锁, * @synchronized * OC中的同步锁:(锁对象) + {要锁住的代码} * 锁对象:要求是全局唯一的属性 * 注意点: 1. 要注意加锁的位置 2. 加锁需要耗费性能,因此需要注意加锁的条件(多线程访问同一块资源) 3. 专业术语:线程同步 #### 7.请简单介绍下什么是原子和非原子属性? * atomic:原子属性,会为setter方法加锁,默认为atomic。线程安全,会消耗大量资源 * nonatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备。 #### 8.请简单介绍下GCD这门技术? * 全称 Grand Central Dispatch,中枢调度器。 * GCD中有2个核心概念:任务和队列。 * GCD使用:封装任务,将封装好的任务添加到队列中,遵循FIFO。 #### 9.请简单介绍GCD中的几种队列?(4种) * 并发队列:多个任务同时执行,会开启多个线程同时执行任务,只有在异步函数下才有效。 * 串行队列:任务只能一个接一个的去执行,不会开启多个线程,主队列属于串行队列,主队列所有的任务必须在主线程中执行。 * 全局队列 * 主队列 #### 10.如果当前有多个任务,这些任务都需要开子线程执行,而多个任务之间有一定的依赖关系,如果使用GCD来实现请试着给出一些解决方案。 * 使用异步函数(同步函数)+主队列 * * * #### 11.请简单说明单例模式的特点(作用)? * 如果一个类实现了单例,那么可以保证在程序运行过程,一个类只有一个实例 * 单例对象易于供外界访问(通常会提供一个类方法) * 实现了单例模式后,可以方便地控制了实例个数,并节约系统资源 #### 12.请简单介绍操作队列? * 操作队列本身是OC语言的,在iOS开发中可以用来实现多线程编程 * 操作队列有两大核心的概念,一个是操作(NSOperation),一个是队列(NSOperationQueue),操作用来封装任务,队列用来存放操作 * 要使用操作队列进行多线程编程,只需要把封装好的操作提交到相应的队列中即可,系统内部会视情况自动开启相应的线程来执行任务 * 在操作队列这门技术中,系统提供了两个子类可以来封装任务,一个是NSInvocationOperation,一个是NSBlockOperation,除此之外也可以直接自定义操作 * 操作队列中有两种队列,一种是通过[NSOperationQueue mainQueue]获得的主队列,一种是通过[[NSOperationQueue alloc]init]方法获得的非主队列 * 主队列是和主线程相关的串行队列,提交到主队列中的操作将被安排在主线程中执行(可以利用该特性来处理线程间通信的相关逻辑) * 操作+队列: * NSInvocationOperation * NSBlockOperatio * NSOperationQueue * 自己创建 [[NSOperationQueue alloc]init]; * 主队列 [NSOperationQueue main]; #### 13.如果有多个操作如何来设置依赖关系,如何监听到某个操作执行完毕事件? 1. 设置依赖关系:假设有有两个操作分别是op1和op2,op1需要依赖于op2,那么只需要使用[op1 addDependency:op2]方法设置即可。 2. 操作依赖补充:使用操作队列可以方便的指定多个操作间的依赖关系,甚至可以实现跨队列的操作依赖,但是在使用的时候需要注意操作之间不能有循环依赖关系 3. 操作监听:可以使用^completionBlock来实现操作监听 #### 14.请简单比较GCD中的全局并发队列和使用dispatch_queue_create函数创建的并发队列异同? 1. 全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级、默认优先级、低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用。而Create函数是实打实的从头开始去创建一个队列。 2. 在iOS6.0之前,在GCD中凡是使用了带Create和retain的函数在最后都需要做一次release操作。而主队列和全局并发队列不需要我们手动release。当然了,在iOS6.0之后GCD已经被纳入到了ARC的内存管理范畴中,即便是使用retain或者create函数创建的对象也不再需要开发人员手动释放,我们像对待普通OC对象一样对待GCD就OK。 3. 在使用栅栏函数的时候,栅栏函数只有在和使用create函数自己的创建的并发队列一起使用的时候才有效 4. 其它区别涉及到XNU内核的系统级线程编程,不一一列举。 #### 15.请简单说明对图片进行二级缓存的实现思路? * 在显示图片的时候 1.先检查该图片对应的内存缓存 1.如果存在内存缓存,则 a.直接使用设置并显示图片; 2.如果内存缓存中没有,则 a.继续检查该图片对应的磁盘缓存是否存在,跳转到第2步。 2.检查该图片对应的磁盘缓存 1.如果存在磁盘缓存,则 a.先保存一份到内存缓存中(方便下次使用) b.然后设置并显示图片 2.如果不存在磁盘缓存,则直接下载该图片,下载完成后 a.保存一份到内存缓存中 b.保存一份到磁盘缓存中 c.设置并显示图片 #### 16.请简单对比下GCD和NSOperation两种多线程的实现方案? * GCD是纯C语言的API,而操作队列则是Object-C的对象。 * 在GCD中,任务用块(block)来表示,而块是个轻量级的数据结构;相反操作队列中的『操作』NSOperation则是个更加重量级的Object-C对象。 * 具体该使用GCD还是使用NSOperation需要看具体的情况,如果只是想简单开一个子线程执行任务推荐使用GCD,如果有很多任务需要开多个子线程下载推荐使用操作队列 #### 17.请按照自己的理解,说一说在进行多线程编程的时候相对于GCD而言,操作队列有哪些优势? * NSOperation和NSOperationQueue的好处有: 1. NSOperationQueue可以方便的调用cancel方法来取消某个操作,而GCD中的任务是无法被取消的(安排好任务之后就不管了)。 2. NSOperation可以方便的指定操作间的依赖关系。 3. NSOperation可以通过KVO提供对NSOperation对象的精细控制(如监听当前操作是否被取消或是否已经完成等) 4. NSOperation可以方便的指定操作优先级。操作优先级表示此操作与队列中其它操作之间的优先关系,优先级高的操作先执行,优先级低的后执行。 5. 通过自定义NSOperation的子类可以实现操作重用 #### 18.请谈一谈,自定义操作的好处? * 自定义操作,对操作进行封装,那么以后在使用的时候只需要alloc init即可,创建该操作的人不需要关系内部的代码实现,信息隐蔽。 * 自定义操作有助于代码重用 19.请简单介绍GCD中的一次性代码? * 一次性代码: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"-------"); }); 2.特点:在整个程序运行过程中block中的代码只会被执行一次 一次性代码本身是线程安全的 3.常用于单例模式的实现中 20.GCD中的dispatch_after是延迟把任务提交到队列还是先提交到队列再延迟执行? 是延迟之后在把任务提交到队列执行,把任务提交到队列中在延迟执行难度较大,不容易实现. 21.请说明NSRunloop和线程的关系? 线程和runloop是一一对应的关系(字典) 主线程对应的runloop是默认创建并启动的 子线程对应的runloop需要手动的创建并启动 如何获得子线程对应的runloop?[NSRunloop currentRunloop]该方法是懒加载的,在第一次调用该方法的时候发现该子线程对应的runloop不存在则会直接创建一个runloop保存并且返回. 线程销毁后runloop也要销毁 22.请简单说明NSCache的特点 NSCache是苹果推出专门用来处理内存缓存的类 NSCache默认是线程安全的,在使用的时候可以不用考虑线程安全的问题 NSCache使用方法和可变字典类似,当缓存文件超过最大限度的时候会开启一个回收过程,把最老的缓存对象回收 NSCache可以设置缓存的const(成本)和缓存的数量 23.请简单说明runloop中几个类之间的相互关系(runloop & source & timer &observer &mode) runloop启动之后会选择一种运行模式,在执行执行会先检查运行模式内部是否有source和timers,如果一个sourc或者是一个timer都没有那么runlooop启动之后就立刻退出了。 runlooop的source有两种分类方法,按照以前的分类方法可以分为 基于端口的 自定义的 performSelector事件 按照函数调用栈来划分,可以分为source0和soucr1。 observer,可以用来监听当前runloop运行状态的改变,注意(Core foundation框架) NSTimer必须添加到runloop中才会工作,且其工作收到runloop运行模式的影响。 24.请简单介绍下SDWebImage框架? SDWebImage框架是一款非常流行的用来处理图片下载和缓存的第三方框架 SDWebImage框架为我们提供了高性能异步下载图片的方案,内部使用GCD等多线程相关技术 使用SDWebImage框架来下载图片,它内部默认会对图片进行内存缓存和磁盘缓存的二级缓存结构 该框架为UIButton,UIImageView等UI控件提供了分类,能够方便的处理相关控件图片的远程下载和缓存设置 该框架内部还提供了GIF图片播放,判断图片类型等一般功能 25.请问SDWebImage框架内部在清理磁盘缓存的时候clearDisk方法和cleanDisk方法有什么区别? clearDisk:直接把整个缓存文件删除,删除之后创建一个新的空文件; cleanDisk:先删除过期的缓存文件,然后计算当前剩余缓存文件的大小,如果该数值超过设定的最大缓存大小,那么久安全文件创建的时间从远到近依次删除,直到整个剩余缓存文件大小小于设定的最大缓存大小为止。 26.请问SDWebImage框架的框架结构是怎么样的? SDWebImage框架有几个主要的组件: 管理者(SDWebImageManager) 缓存处理组件(SDImageCache)主要对下载的图片进行内存缓存和磁盘缓存处理 下载处理组件(SDWebImageDownloader|SDWebImageDownloadOperation)主要处理开子线程异步发送网络请求下载图片相关操作 27.请问SDWebImage框架内部怎么处理内存缓存的? 内部使用NSCache来专门处理内存缓存 28.请简单说明NSRunloop的基本作用? 保持程序的持续运行 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件) 节省CPU资源,提高程序性能:该做事时做事,该休息时休息 29.什么是runloop? 从字面意思看:运行循环、跑圈.其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer) 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop 30.runloop的自动释放池什么时候创建释放? 当runloop进入的时候会创建一个自动释放池。 当runloop退出的时候会把之前的自动释放池销毁。 当runloop即将进入休眠的时候会把之前的自动释放池先销毁,然后创建一个新的自动释放池。 31.请简单说明使用NSURLConnection发送网络请求的几种方法? 使用NSURLConnection发送同步请求([NSURLConnection sendSync….]) 使用NSURLConnection发送异步请求1([NSURLConnection sendAsync…]) 使用NSURLConnection发送异步请求2(设置代理,再发送网络请求)同步 NSData *data = [NSURLConnection sendSync….] 异步 [NSURLConnection sendAsync] 代理 delegate 32.请简单说明GET请求和POST个请求有什么区别,如何选择? GET请求的参数直接用&拼接并以?为分隔拼接在请求URL的后面 POST请求的参数是转换为二进制设置在请求体传递的 如果仅仅只是索取数据获得数据,那么建议使用GET请求,其他情况则建议使用POST请求,相对而言POST请求安全性更好一些。 33.请简单列出使用NSURLConnection发送一个异步POST网络请求的步骤? 确定请求路径(URL) 创建可变的请求对象(NSMutableURLRequest) 修改请求方法为POST请求 把参数拼接起来转换为二进制数据,设置请求体 使用NSURLConnection发送异步请求([NSURLConnection sendAsync....]) 解析服务器返回的数据,查看请求结果 34.请简单说明HTTP通信的过程? 请求:如果客户端想要获得相应的数据,那么就对着服务器发送一个请求,请求是客户端向服务器索要数据的过程。 响应:服务器接收到客户端的请求之后,需要对该请求作出反应,响应是服务器端把数据返回给客户端的过程。 请求分为两部分,一个是请求头,一个是请求体(GET请求没有请求体)。其中请求头是对客户端信息和请求本身的描述,而请求体存放要发送给服务器端的具体数据 响应分为两部分,一个是响应头,一个是响应体。其中响应头是对服务器端信息和响应数据本身的描述,而响应体存放要发送给客户端的具体数据。 35.请简单说明NSURLSession对比NSURLConnection的优势? session支持http2.0协议(iOS 9.0 +) 在处理下载任务的时候可以直接把数据下载到磁盘 支持后台下载|上传 同一个session发送多个请求,只需要建立一次连接(复用了TCP) 提供了全局的session并且可以统一配置,使用更加方便 下载的时候是多线程异步处理的效率更高 36.请简单列出NSURLSession发送POST请求的步骤? 确定请求路径(NSURL) 创建可变的请求对象(NSMutableURLRequest) 修改请求方法为POST(HTTPMethod) 把要传递的参数拼接,转换为二进制数据,设置为请求体(HTTPBody) 创建会话对象(NSURLSession shareSession) 根据会话对象来创建一个NSURLSessionDataTask任务 执行请求Task (需要调用Resume方法) 拿到服务器返回的数据之后,解析数据 37.在发送网络请求的时候,如果请求路径中的参数有中文导致发送的网络请求失败,应该如何处理? 如果URL字符串中有中文,那么在进行使用发送请求的时候应该先对URL进行中文转码 相关方法:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 38.观察下面的代码,请问completionHandler在主线程还是子线程执行?[[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //.... }] resume]; completionHandler在子线程中执行。 39.请简单介绍下网络响应的状态码? 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误。 如200 OK状态码以3位数字+原因短语组成。数字中的第一位指定了响应的类别, 后两位无分类。 状态码分为五种类别,分别是: 以1开头的(如100),定义范围为100~101,表示接收的请求正在处理,原因短语为Informational(信息性状 态码)。 以2开头的(如200),定义范围为200~206,表示请求正常处理完毕,原因短语为Success(成功状态码)。 以3开头的(如300),定义范围为300~305,表示需要进行附加的操作以完成网络请求,原因短语为Redirection(重定向状态 码)。 以4开头的(如404),定义范围为400~415,表示客户端有错误,服务器无法处理请求,原因短语为Client error(客户端错误)。 以5开头的(如500),定义范围为500~505,表示服务器端处理请求出错,原因短语为Server error(服务器错误)。 40.使用NSURLSession发送网络请求的时候,最多可以建立多少个TCP连接? 在iOS中最多可以建立4个连接,在OSX中默认最多可以建立6个连接。 在iOS中NSURLSessionConguration内部有HTTPMaximumConnectionsPerHost属性,可以设置连接的数 量:The default value is 6 in OS X, or 4 in iOS 说明: * 由于HTTP/1.1 不支持多路复用,因此如果要处理多个网络请求,在处理HTTP请求的时候 多数浏览器厂商都是不假思索的就在客户端排队所有的HTTP请求,然后通过一个持久连接,一个接着一个的发送这些请求。然而这种方式性能实在太差。实际上,浏览器开发商对于对于此性能问题,尚没有任何更好的办法,因此只能允许客户端并行打开多个TCP连接会话。但是具体最多可以打开多少个TCP连接是有数量限制的, 多数现代的浏览器,包括桌面和移动浏览器,都支持打开6个连接。即客户端可以并行分派最多6个请求,服务器可以并行处理最多6个请求。 为什么是6个连接?有什么特殊的意义吗?其实,这个数字是多方平衡后的结果:这个数字越大,便能够带来更多的请求并行能力,但是同样的客户端和服务器端所占用的资源也会越多。因此,每个主机6个连接只不过是大家都觉得比较安全,能够接受的一个数字而已。 41.请简单介绍JSON和XML? JSON和XML都是一种用来表示数据的一种数据格式,JSON更加轻量级。 服务器返回的数据通常是JSON的或者是XML的两种,JSON数据格式和OC对象中字典和数组有些相似,XML又称为XML文档,XML的语法结构由三部分构成分别是文档声明,元素和属性。 如果服务器返回的数据是JSON,那么在开发中通常需要对JSON数据进行反序列化处理,把JSON数据转换为OC对象。 如果服务器返回的数据是XML格式的,那么需要对XML文档进行解析,解析XML的方式有两种,分别是SAX(从根元素开始解析)和DOM(先把整个XML文档加载进内存再解析) 42.JSON格式中的true和false,对应OC中的什么数据类型,值为多少? true和false对应OC中的NSNumber数据类型 true对应的值为1,false对应的值为0 43.请简单说明什么是序列化和反序列处理,用到了什么方法? 反序列化处理,即把JSON数据—>OC对象,使用的方法为:[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil] 序列化处理,即把OC对象—>JSON数据,使用的方法为:[NSJSONSerialization dataWithJSONObject:jsonString options:0 error:nil],注意并不是所有的OC对象都能够序列化为JSON数据 44.请简单说明输出流的使用步骤【应用于文件下载时】和注意点?使用步骤: 创建输出流(指定路径) 打开输出流(open) 使用输出流写数据 (write…) 关闭输出流 (close) 注意点:数据写完之后一定要关闭输出流 45.请简单说明文件句柄(NSFileHandle)的使用步骤【应用于文件下载时】和注意点?使用步骤: 创建空的文件(路径) 创建文件句柄(指向文件) 默认指向开头 使用文件句柄来写数据(内部边写数据边移动文件句柄指针) 关闭文件句柄(closeFile) 注意点: 在写使用文件句柄指针写数据的时候,内部会自动移动文件句柄指针 写数据的时候可以设置位置(偏移量),如设置从文件的末尾接着写数据 使用完毕之后,应该把句柄关闭 46.请简单介绍下NSURLSessionTask的几个子类? NSURLSessionTask是一个抽象类,如果要使用那么只能使用它的子类; NSURLSessionTask有两个子类,一个是NSURLSessionDataTask,该task可以用来处理一般的网络请求,如GET|POST请求等,一个是NSURLSessionDownloadTask,该downloadTask在处理下载请求的时候有很大的优势; NSURLSessionDataTask有一个子类为NSURLSessionUploadTask,该uploadTask在处理上传请求的时候有优势. 47.请简单介绍在iOS开发中XML的几种解析方式? XML文档有两种解析模式,一种是SAX(从根元素开发一个接着一个的解析),一种是DOM(将整个XML文档加载进内存解析) 在iOS开发中常用的XML的解析方法有两种,一种是使用苹果原生的NSXMLParser来解析(该方法基于SAX),一种是使用谷歌公司提供的第三方框架GDataXML来解析(该方法基于DOM)DOM 一次性加载 GDataXML SAX 一个元素一个元素的解析 NSXMLParser(创建解析器->设置代理->开始解析) #### 48.如何解决session设置代理之后对代理对象的强引用问题? NSURLSession对象在使用的时候,如果设置了代理,那么session对代理对象会保持一个强引用,在合适的时候应该主动进行释放 可以在控制器调用viewDidDisappear方法的时候来进行处理,可以通过调用invalidateAndCancel方法或者是finishTasksAndInvalidate方法来释放对代理对象的强引用 invalidateAndCancel方法直接取消请求然后释放代理对象,finishTasksAndInvalidate方法等请求完成之后释放代理对象。 49.在XCode中如何配置以MRC的方式来编译处理某个类? 点击项目的Targets,点击Build phases(编译阶段),点击展开Compile Sources,找到要处理的类,配置为-fno-objc-arc即可。 50.在使用NSURLSessionDataTask发送请求下载文件的时候,实现断点下载的技术要点是什么? 所谓断点下载,即只下载完整文件中的某一部分数据,如该文件有10M,那么需要做到只请求下载这个文件中5M~10M的这部分数据 可以通过设置请求头信息来实现,参考代码如下:NSString *header = [NSString stringWithFormat:@”bytes=%zd-“,self.currentSize]; [request setValue:header forHTTPHeaderField:@”Range”] 51.请简单比较使用NSURLSessionDownloadTask下载文件和使用NSURLSessionDataTask下载文件的优劣? NSURLSessionDataTask下载文件的优点:可以实现离线断点下载。缺点:代码复杂 NSURLSessionDownloadTask下载文件的 优点: 内部已经完成了边接收数据边写入到沙盒中的操作(解决了下载大文件时候的内存飙升问题) 可以方便的实现断点下载 缺点: 无法实现离线断点下载 52.请列出使用NSURLSession发送请求实现文件上传的主要步骤? 确定上传请求的路径 (NSURL) 创建可变的请求对象(NSMutableURLRequest) 修改请求方法为POST 设置请求头信息(告知服务器端这是一个文件上传请求) 按照固定的格式拼接要上传的文件等参数 根据请求对象创建会话对象(NSURLSession对象) 根据session对象来创建一个uploadTask上传请求任务 执行该上传请求任务(调用resume方法) 得到服务器返回的数据,解析数据(上传成功|上传失败) 53.请列出你认为在进行文件上传时候需要注意的细节(注意点)? 创建可变的请求对象,因为需要修改请求方法为POST,设置请求头信息 设置请求头这个步骤可能会被遗漏 要处理上传参数的时候,一定要按照固定的格式来进行拼接 需要采用合适的方法来获得上传文件的二进制数据类型(MIMEType) 54.请简单说明能够获得文件二进制数据类型(MIMEType)的几种方法? 直接百度 搜索 对着该文件发送一个网络请求,接受到该请求响应的时候,可以通过响应头信息中的MIMEType属性得到 使用通用的二进制数据类型表示任意的二进制数据 application/octet-stream 调用C语言的API来实现 55.请简单介绍下AFN各个主要版本的情况?0.1--1.0 "2.0---2.6.3" 3.0-->3.1.0 NSURLConnection - (NSURLConnection + NSURLSession) - NSURLSessio 0.1-2.0 NSURLConnection 2.0 -3.0 NSURLSession + NSURLConnection 3.0 + NSURLSession #### 56.如果服务器返回的数据不是JSON数据,那么在使用AFN发送网络请求的时候会请求失败请问是什么原因产生的?如何解决? * AFN在接受到服务器返回数据的时候,内部默认采用以JSON的方式来对响应体信息进行反序列化处理,而如果服务器返回的数据不是JSON而是其他数据比如XML数据或者是图片数据的时候就会提示网络请求失败 * 如果服务器返回的数据不是JSON,那么应该修改AFN对响应的解析方式 * 如果是XML数据,则: manager.responseSerializer = [AFXMLParserResponseSerializer serializer] 如果既不是JSON也不是XML,则manager.responseSerializer = [AFHTTPResponseSerializer serializer] 57.在使用NSURLSession进行文件上传的时候,如何监听文件上传的进度,有哪些注意点? 创建会话对象的时候,需要设置代理,让控制器成为session的代理 遵守代理协议(NSURLSessionDataDelegate) 实现代理方法,在代理方法中计算文件的上传进度- (void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend 注意:当任务执行完毕的时候应该释放对代理对象的强引用 58.请简单说明系统默认提供的NSURLSessionConfiguration三种配置信息? “defaultSessionConfiguration”返回标准配置,这实际上与NSURLConnection的网络协议栈是一样的,具有相同的共享NSHTTPCookieStorage,共享NSURLCache和共享NSURLCredentialStorage “ephemeralSessionConfiguration”返回一个预设配置,没有持久性存储的缓存,Cookie或证书。这对于实现像”秘密浏览”功能的功能来说,是很理想的 “backgroundSessionConfiguration”:独特之处在于,它会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文 59.在发送网络请求的时候,如果一个参数(place)需要对应着多个值,那么以下两种请求路径哪种是正确的?①:http://192.168.31.520:1314/loveyou?place=Beijing&Shanghai ②:http://192.168.31.520:1314/loveyou?place=Beijing&place=Shanghai 第二种请求路径是正确的,第一种是错误的,后面的shanghai将会被忽略 60.使用AFN进行文件下载相对于NSURLSessionDownloadTask而言有何好处? 可以很方便的监听文件的下载进度 NSURLSessionDownloadTask在实现文件下载的时候,内部默认把文件下载到了tmp临时路径,等下载完毕之后我们需要执行一个剪切操作 AFN下载请求的实现内部基于NSURLSessionDownloadTask,在使用的时候只需要告知AFN应该把文件剪切到什么路径,那么AFN内部会自动的进行文件剪切处理 61.请简单回答网络安全的原则是什么? 在网络上”不允许”传输用户隐私数据的”明文” 在本地”不允许”保存用户隐私数据的”明文” 62.请简单介绍下Base64编码? 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符:A~Z a~z 0~9 + / = 对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。 Base64编码原理: 将所有字符转化为ASCII码; 将ASCII码转化为8位二进制; 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位; 统一在6位二进制前补两个0凑足8位; 将补0后的二进制转为十进制; 从Base64编码表获取十进制对应的Base64编码 63.请简单说明单向散列函数的特点? 加密后密文的长度是定长的 如果明文不一样,那么散列后的结果一定不一样 如果明文一样,那么加密后的密文一定一样(对相同数据加密,加密后的密文一样) 所有的加密算法是公开的 不可以逆推反算 总结: 不可逆 原文相同 散列值相同 原文不同 散列值不同 加密后密文的长度是定长的 64.请简单介绍下散列函数的一些应用领域? 搜索 多个关键字,先对每个关键字进行散列,然后多个关键字进行或运算,如果值一致则搜索结果一致 版权 对文件进行散列判断该文件是否是正版或原版的 文件完整性验证 对整个文件进行散列,比较散列值判断文件是否完整或被篡改 65.请简单介绍下对称加密的特点和经典算法? 特点: 加密和解密使用相同的秘钥 加密和解密的过程是可逆的 性能好,效率高 经典算法 DES 数据加密标准 3DES 使用3个密钥,对消息进行(密钥1·加密)+(密钥2·解密)+(密钥3·加密) AES 高级加密标准 66.请简单说明ECB和CBC两种分组加密模式? ECB模式的全称为Electronic CodeBook模式。又成为电子密码本模式。 特点: 使用ECB模式加密的时候,相同的明文分组会被转换为相同的密文分组。 类似于一个巨大的明文分组——密文分组的对照表。 CBC模式全称为Cipher Block Chainning模式(密文分组链接模式|电子密码链条) 特点: 在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。 67.请简单介绍下非对称加密的特点和经典算法? 非对称加密的特点: 使用一个密钥对进行加密和解密,公钥加密,私钥解密 公钥是公开的,私钥是保密的 使用非对称加密来处理加密和解密的过程高度安全,但是效率低下,性能很差 经典算法:RSA 68.请简单介绍下数字签名这门技术? 应用场景:需要严格验证发送方身份信息情况 数字签名原理 客户端处理 对”消息”进行 HASH 得到 “消息摘要” 发送方使用自己的私钥对”消息摘要” 加密(数字签名) 把数字签名附着在”报文”的末尾一起发送给接收方 服务端处理 对”消息” HASH 得到 “报文摘要” 使用公钥对”数字签名” 解密 对结果进行匹配 69.数字证书和公钥什么关系? 数字证书就是对公钥进行数字签名 证书和驾照很相似,里面记有姓名、组织、地址等个人信息,以及属于此人的公钥,并有认证机构施加数字签名,只要看到公钥证书,我们就可以知道认证机构认证该公钥的确属于此人 数字证书的主要内容: 公钥 认证机构的数字签名 70.请简单说明在安装cocoapods时,使用pod install命令安装框架后的大致过程? 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。 下载依赖:根据分析依赖的结果,下载指定版本的类库到本地项目中。 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。 [reply]PDF3文件下载[/reply] ]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(三)-附答案]]></title>
<url>%2F2016%2F11%2F24%2F103%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 这次的问题是网络多线程相关的哟,面试的时候也是必问的,大家多看看 11月24日修正一处错误:18、19题目一样,答案不一样(其实是两种理解,修改为最优的一种放上来.多谢读者提醒) 以下是一些自己收集的网络多线程方面比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。 1.请简单说明多线程技术的优点和缺点? 优点: 能够适当提高程序的执行效率; 能够适当的提高资源的利用率,比如CPU、内存。 缺点: 创建线程有额外开销 程序的代码更加复杂 线程越多,CPU在调度线程上的开销就越大 如果开启大量线程,反而会降低程序的性能 2.请简单说明线程和进程,以及他们之间的关系? 进程是CPU调度和分配资源的单位。 线程是CPU调用的最小单位 关系: 进程包含线程; 一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程; 同一个进程内的线程共享进程的资源。 3.请简单说明在iOS开发中有哪些多线程的实现方案? PThread NSThread GCD NSOperation 4.请简单说明主线程的作用,以及使用注意点? 主线程:默认启动的线程 作用:(1)显示和刷新UI界面 (2)处理UI事件 注意点: 不要将耗时操作放在主线程中执行 UI操作必须在主线程中执行 !!!! 5.请简单列出NSThread线程的几种状态,并说明状态转换的逻辑?新建->就绪 CPU调度当前任务->运行->阻塞->死亡 CPU调度其他任务->就绪 #### 6.请简单说明如何简单的解决多线程访问同一块资源造成的线程安全的问题,以及注意点? * 加同步(互斥)锁, * @synchronized * OC中的同步锁:(锁对象) + {要锁住的代码} * 锁对象:要求是全局唯一的属性 * 注意点: 1. 要注意加锁的位置 2. 加锁需要耗费性能,因此需要注意加锁的条件(多线程访问同一块资源) 3. 专业术语:线程同步 #### 7.请简单介绍下什么是原子和非原子属性? * atomic:原子属性,会为setter方法加锁,默认为atomic。线程安全,会消耗大量资源 * nonatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备。 #### 8.请简单介绍下GCD这门技术? * 全称 Grand Central Dispatch,中枢调度器。 * GCD中有2个核心概念:任务和队列。 * GCD使用:封装任务,将封装好的任务添加到队列中,遵循FIFO。 #### 9.请简单介绍GCD中的几种队列?(4种) * 并发队列:多个任务同时执行,会开启多个线程同时执行任务,只有在异步函数下才有效。 * 串行队列:任务只能一个接一个的去执行,不会开启多个线程,主队列属于串行队列,主队列所有的任务必须在主线程中执行。 * 全局队列 * 主队列 #### 10.如果当前有多个任务,这些任务都需要开子线程执行,而多个任务之间有一定的依赖关系,如果使用GCD来实现请试着给出一些解决方案。 * 使用异步函数(同步函数)+主队列 * * * #### 11.请简单说明单例模式的特点(作用)? * 如果一个类实现了单例,那么可以保证在程序运行过程,一个类只有一个实例 * 单例对象易于供外界访问(通常会提供一个类方法) * 实现了单例模式后,可以方便地控制了实例个数,并节约系统资源 #### 12.请简单介绍操作队列? * 操作队列本身是OC语言的,在iOS开发中可以用来实现多线程编程 * 操作队列有两大核心的概念,一个是操作(NSOperation),一个是队列(NSOperationQueue),操作用来封装任务,队列用来存放操作 * 要使用操作队列进行多线程编程,只需要把封装好的操作提交到相应的队列中即可,系统内部会视情况自动开启相应的线程来执行任务 * 在操作队列这门技术中,系统提供了两个子类可以来封装任务,一个是NSInvocationOperation,一个是NSBlockOperation,除此之外也可以直接自定义操作 * 操作队列中有两种队列,一种是通过[NSOperationQueue mainQueue]获得的主队列,一种是通过[[NSOperationQueue alloc]init]方法获得的非主队列 * 主队列是和主线程相关的串行队列,提交到主队列中的操作将被安排在主线程中执行(可以利用该特性来处理线程间通信的相关逻辑) * 操作+队列: * NSInvocationOperation * NSBlockOperatio * NSOperationQueue * 自己创建 [[NSOperationQueue alloc]init]; * 主队列 [NSOperationQueue main]; #### 13.如果有多个操作如何来设置依赖关系,如何监听到某个操作执行完毕事件? 1. 设置依赖关系:假设有有两个操作分别是op1和op2,op1需要依赖于op2,那么只需要使用[op1 addDependency:op2]方法设置即可。 2. 操作依赖补充:使用操作队列可以方便的指定多个操作间的依赖关系,甚至可以实现跨队列的操作依赖,但是在使用的时候需要注意操作之间不能有循环依赖关系 3. 操作监听:可以使用^completionBlock来实现操作监听 #### 14.请简单比较GCD中的全局并发队列和使用dispatch_queue_create函数创建的并发队列异同? 1. 全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级、默认优先级、低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用。而Create函数是实打实的从头开始去创建一个队列。 2. 在iOS6.0之前,在GCD中凡是使用了带Create和retain的函数在最后都需要做一次release操作。而主队列和全局并发队列不需要我们手动release。当然了,在iOS6.0之后GCD已经被纳入到了ARC的内存管理范畴中,即便是使用retain或者create函数创建的对象也不再需要开发人员手动释放,我们像对待普通OC对象一样对待GCD就OK。 3. 在使用栅栏函数的时候,栅栏函数只有在和使用create函数自己的创建的并发队列一起使用的时候才有效 4. 其它区别涉及到XNU内核的系统级线程编程,不一一列举。 #### 15.请简单说明对图片进行二级缓存的实现思路? * 在显示图片的时候 1.先检查该图片对应的内存缓存 1.如果存在内存缓存,则 a.直接使用设置并显示图片; 2.如果内存缓存中没有,则 a.继续检查该图片对应的磁盘缓存是否存在,跳转到第2步。 2.检查该图片对应的磁盘缓存 1.如果存在磁盘缓存,则 a.先保存一份到内存缓存中(方便下次使用) b.然后设置并显示图片 2.如果不存在磁盘缓存,则直接下载该图片,下载完成后 a.保存一份到内存缓存中 b.保存一份到磁盘缓存中 c.设置并显示图片 #### 16.请简单对比下GCD和NSOperation两种多线程的实现方案? * GCD是纯C语言的API,而操作队列则是Object-C的对象。 * 在GCD中,任务用块(block)来表示,而块是个轻量级的数据结构;相反操作队列中的『操作』NSOperation则是个更加重量级的Object-C对象。 * 具体该使用GCD还是使用NSOperation需要看具体的情况,如果只是想简单开一个子线程执行任务推荐使用GCD,如果有很多任务需要开多个子线程下载推荐使用操作队列 #### 17.请按照自己的理解,说一说在进行多线程编程的时候相对于GCD而言,操作队列有哪些优势? * NSOperation和NSOperationQueue的好处有: 1. NSOperationQueue可以方便的调用cancel方法来取消某个操作,而GCD中的任务是无法被取消的(安排好任务之后就不管了)。 2. NSOperation可以方便的指定操作间的依赖关系。 3. NSOperation可以通过KVO提供对NSOperation对象的精细控制(如监听当前操作是否被取消或是否已经完成等) 4. NSOperation可以方便的指定操作优先级。操作优先级表示此操作与队列中其它操作之间的优先关系,优先级高的操作先执行,优先级低的后执行。 5. 通过自定义NSOperation的子类可以实现操作重用 #### 18.请谈一谈,自定义操作的好处? * 自定义操作,对操作进行封装,那么以后在使用的时候只需要alloc init即可,创建该操作的人不需要关系内部的代码实现,信息隐蔽。 * 自定义操作有助于代码重用 19.请简单介绍GCD中的一次性代码? * 一次性代码: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"-------"); }); 2.特点:在整个程序运行过程中block中的代码只会被执行一次 一次性代码本身是线程安全的 3.常用于单例模式的实现中 20.GCD中的dispatch_after是延迟把任务提交到队列还是先提交到队列再延迟执行? 是延迟之后在把任务提交到队列执行,把任务提交到队列中在延迟执行难度较大,不容易实现. 21.请说明NSRunloop和线程的关系? 线程和runloop是一一对应的关系(字典) 主线程对应的runloop是默认创建并启动的 子线程对应的runloop需要手动的创建并启动 如何获得子线程对应的runloop?[NSRunloop currentRunloop]该方法是懒加载的,在第一次调用该方法的时候发现该子线程对应的runloop不存在则会直接创建一个runloop保存并且返回. 线程销毁后runloop也要销毁 22.请简单说明NSCache的特点 NSCache是苹果推出专门用来处理内存缓存的类 NSCache默认是线程安全的,在使用的时候可以不用考虑线程安全的问题 NSCache使用方法和可变字典类似,当缓存文件超过最大限度的时候会开启一个回收过程,把最老的缓存对象回收 NSCache可以设置缓存的const(成本)和缓存的数量 23.请简单说明runloop中几个类之间的相互关系(runloop & source & timer &observer &mode) runloop启动之后会选择一种运行模式,在执行执行会先检查运行模式内部是否有source和timers,如果一个sourc或者是一个timer都没有那么runlooop启动之后就立刻退出了。 runlooop的source有两种分类方法,按照以前的分类方法可以分为 基于端口的 自定义的 performSelector事件 按照函数调用栈来划分,可以分为source0和soucr1。 observer,可以用来监听当前runloop运行状态的改变,注意(Core foundation框架) NSTimer必须添加到runloop中才会工作,且其工作收到runloop运行模式的影响。 24.请简单介绍下SDWebImage框架? SDWebImage框架是一款非常流行的用来处理图片下载和缓存的第三方框架 SDWebImage框架为我们提供了高性能异步下载图片的方案,内部使用GCD等多线程相关技术 使用SDWebImage框架来下载图片,它内部默认会对图片进行内存缓存和磁盘缓存的二级缓存结构 该框架为UIButton,UIImageView等UI控件提供了分类,能够方便的处理相关控件图片的远程下载和缓存设置 该框架内部还提供了GIF图片播放,判断图片类型等一般功能 25.请问SDWebImage框架内部在清理磁盘缓存的时候clearDisk方法和cleanDisk方法有什么区别? clearDisk:直接把整个缓存文件删除,删除之后创建一个新的空文件; cleanDisk:先删除过期的缓存文件,然后计算当前剩余缓存文件的大小,如果该数值超过设定的最大缓存大小,那么久安全文件创建的时间从远到近依次删除,直到整个剩余缓存文件大小小于设定的最大缓存大小为止。 26.请问SDWebImage框架的框架结构是怎么样的? SDWebImage框架有几个主要的组件: 管理者(SDWebImageManager) 缓存处理组件(SDImageCache)主要对下载的图片进行内存缓存和磁盘缓存处理 下载处理组件(SDWebImageDownloader|SDWebImageDownloadOperation)主要处理开子线程异步发送网络请求下载图片相关操作 27.请问SDWebImage框架内部怎么处理内存缓存的? 内部使用NSCache来专门处理内存缓存 28.请简单说明NSRunloop的基本作用? 保持程序的持续运行 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件) 节省CPU资源,提高程序性能:该做事时做事,该休息时休息 29.什么是runloop? 从字面意思看:运行循环、跑圈.其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer) 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop 30.runloop的自动释放池什么时候创建释放? 当runloop进入的时候会创建一个自动释放池。 当runloop退出的时候会把之前的自动释放池销毁。 当runloop即将进入休眠的时候会把之前的自动释放池先销毁,然后创建一个新的自动释放池。 31.请简单说明使用NSURLConnection发送网络请求的几种方法? 使用NSURLConnection发送同步请求([NSURLConnection sendSync….]) 使用NSURLConnection发送异步请求1([NSURLConnection sendAsync…]) 使用NSURLConnection发送异步请求2(设置代理,再发送网络请求)同步 NSData *data = [NSURLConnection sendSync….] 异步 [NSURLConnection sendAsync] 代理 delegate 32.请简单说明GET请求和POST个请求有什么区别,如何选择? GET请求的参数直接用&拼接并以?为分隔拼接在请求URL的后面 POST请求的参数是转换为二进制设置在请求体传递的 如果仅仅只是索取数据获得数据,那么建议使用GET请求,其他情况则建议使用POST请求,相对而言POST请求安全性更好一些。 33.请简单列出使用NSURLConnection发送一个异步POST网络请求的步骤? 确定请求路径(URL) 创建可变的请求对象(NSMutableURLRequest) 修改请求方法为POST请求 把参数拼接起来转换为二进制数据,设置请求体 使用NSURLConnection发送异步请求([NSURLConnection sendAsync....]) 解析服务器返回的数据,查看请求结果 34.请简单说明HTTP通信的过程? 请求:如果客户端想要获得相应的数据,那么就对着服务器发送一个请求,请求是客户端向服务器索要数据的过程。 响应:服务器接收到客户端的请求之后,需要对该请求作出反应,响应是服务器端把数据返回给客户端的过程。 请求分为两部分,一个是请求头,一个是请求体(GET请求没有请求体)。其中请求头是对客户端信息和请求本身的描述,而请求体存放要发送给服务器端的具体数据 响应分为两部分,一个是响应头,一个是响应体。其中响应头是对服务器端信息和响应数据本身的描述,而响应体存放要发送给客户端的具体数据。 35.请简单说明NSURLSession对比NSURLConnection的优势? session支持http2.0协议(iOS 9.0 +) 在处理下载任务的时候可以直接把数据下载到磁盘 支持后台下载|上传 同一个session发送多个请求,只需要建立一次连接(复用了TCP) 提供了全局的session并且可以统一配置,使用更加方便 下载的时候是多线程异步处理的效率更高 36.请简单列出NSURLSession发送POST请求的步骤? 确定请求路径(NSURL) 创建可变的请求对象(NSMutableURLRequest) 修改请求方法为POST(HTTPMethod) 把要传递的参数拼接,转换为二进制数据,设置为请求体(HTTPBody) 创建会话对象(NSURLSession shareSession) 根据会话对象来创建一个NSURLSessionDataTask任务 执行请求Task (需要调用Resume方法) 拿到服务器返回的数据之后,解析数据 37.在发送网络请求的时候,如果请求路径中的参数有中文导致发送的网络请求失败,应该如何处理? 如果URL字符串中有中文,那么在进行使用发送请求的时候应该先对URL进行中文转码 相关方法:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 38.观察下面的代码,请问completionHandler在主线程还是子线程执行?[[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //.... }] resume]; completionHandler在子线程中执行。 39.请简单介绍下网络响应的状态码? 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误。 如200 OK状态码以3位数字+原因短语组成。数字中的第一位指定了响应的类别, 后两位无分类。 状态码分为五种类别,分别是: 以1开头的(如100),定义范围为100~101,表示接收的请求正在处理,原因短语为Informational(信息性状 态码)。 以2开头的(如200),定义范围为200~206,表示请求正常处理完毕,原因短语为Success(成功状态码)。 以3开头的(如300),定义范围为300~305,表示需要进行附加的操作以完成网络请求,原因短语为Redirection(重定向状态 码)。 以4开头的(如404),定义范围为400~415,表示客户端有错误,服务器无法处理请求,原因短语为Client error(客户端错误)。 以5开头的(如500),定义范围为500~505,表示服务器端处理请求出错,原因短语为Server error(服务器错误)。 40.使用NSURLSession发送网络请求的时候,最多可以建立多少个TCP连接? 在iOS中最多可以建立4个连接,在OSX中默认最多可以建立6个连接。 在iOS中NSURLSessionConguration内部有HTTPMaximumConnectionsPerHost属性,可以设置连接的数 量:The default value is 6 in OS X, or 4 in iOS 说明: * 由于HTTP/1.1 不支持多路复用,因此如果要处理多个网络请求,在处理HTTP请求的时候 多数浏览器厂商都是不假思索的就在客户端排队所有的HTTP请求,然后通过一个持久连接,一个接着一个的发送这些请求。然而这种方式性能实在太差。实际上,浏览器开发商对于对于此性能问题,尚没有任何更好的办法,因此只能允许客户端并行打开多个TCP连接会话。但是具体最多可以打开多少个TCP连接是有数量限制的, 多数现代的浏览器,包括桌面和移动浏览器,都支持打开6个连接。即客户端可以并行分派最多6个请求,服务器可以并行处理最多6个请求。 为什么是6个连接?有什么特殊的意义吗?其实,这个数字是多方平衡后的结果:这个数字越大,便能够带来更多的请求并行能力,但是同样的客户端和服务器端所占用的资源也会越多。因此,每个主机6个连接只不过是大家都觉得比较安全,能够接受的一个数字而已。 41.请简单介绍JSON和XML? JSON和XML都是一种用来表示数据的一种数据格式,JSON更加轻量级。 服务器返回的数据通常是JSON的或者是XML的两种,JSON数据格式和OC对象中字典和数组有些相似,XML又称为XML文档,XML的语法结构由三部分构成分别是文档声明,元素和属性。 如果服务器返回的数据是JSON,那么在开发中通常需要对JSON数据进行反序列化处理,把JSON数据转换为OC对象。 如果服务器返回的数据是XML格式的,那么需要对XML文档进行解析,解析XML的方式有两种,分别是SAX(从根元素开始解析)和DOM(先把整个XML文档加载进内存再解析) 42.JSON格式中的true和false,对应OC中的什么数据类型,值为多少? true和false对应OC中的NSNumber数据类型 true对应的值为1,false对应的值为0 43.请简单说明什么是序列化和反序列处理,用到了什么方法? 反序列化处理,即把JSON数据—>OC对象,使用的方法为:[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil] 序列化处理,即把OC对象—>JSON数据,使用的方法为:[NSJSONSerialization dataWithJSONObject:jsonString options:0 error:nil],注意并不是所有的OC对象都能够序列化为JSON数据 44.请简单说明输出流的使用步骤【应用于文件下载时】和注意点?使用步骤: 创建输出流(指定路径) 打开输出流(open) 使用输出流写数据 (write…) 关闭输出流 (close) 注意点:数据写完之后一定要关闭输出流 45.请简单说明文件句柄(NSFileHandle)的使用步骤【应用于文件下载时】和注意点?使用步骤: 创建空的文件(路径) 创建文件句柄(指向文件) 默认指向开头 使用文件句柄来写数据(内部边写数据边移动文件句柄指针) 关闭文件句柄(closeFile) 注意点: 在写使用文件句柄指针写数据的时候,内部会自动移动文件句柄指针 写数据的时候可以设置位置(偏移量),如设置从文件的末尾接着写数据 使用完毕之后,应该把句柄关闭 46.请简单介绍下NSURLSessionTask的几个子类? NSURLSessionTask是一个抽象类,如果要使用那么只能使用它的子类; NSURLSessionTask有两个子类,一个是NSURLSessionDataTask,该task可以用来处理一般的网络请求,如GET|POST请求等,一个是NSURLSessionDownloadTask,该downloadTask在处理下载请求的时候有很大的优势; NSURLSessionDataTask有一个子类为NSURLSessionUploadTask,该uploadTask在处理上传请求的时候有优势. 47.请简单介绍在iOS开发中XML的几种解析方式? XML文档有两种解析模式,一种是SAX(从根元素开发一个接着一个的解析),一种是DOM(将整个XML文档加载进内存解析) 在iOS开发中常用的XML的解析方法有两种,一种是使用苹果原生的NSXMLParser来解析(该方法基于SAX),一种是使用谷歌公司提供的第三方框架GDataXML来解析(该方法基于DOM)DOM 一次性加载 GDataXML SAX 一个元素一个元素的解析 NSXMLParser(创建解析器->设置代理->开始解析) #### 48.如何解决session设置代理之后对代理对象的强引用问题? NSURLSession对象在使用的时候,如果设置了代理,那么session对代理对象会保持一个强引用,在合适的时候应该主动进行释放 可以在控制器调用viewDidDisappear方法的时候来进行处理,可以通过调用invalidateAndCancel方法或者是finishTasksAndInvalidate方法来释放对代理对象的强引用 invalidateAndCancel方法直接取消请求然后释放代理对象,finishTasksAndInvalidate方法等请求完成之后释放代理对象。 49.在XCode中如何配置以MRC的方式来编译处理某个类? 点击项目的Targets,点击Build phases(编译阶段),点击展开Compile Sources,找到要处理的类,配置为-fno-objc-arc即可。 50.在使用NSURLSessionDataTask发送请求下载文件的时候,实现断点下载的技术要点是什么? 所谓断点下载,即只下载完整文件中的某一部分数据,如该文件有10M,那么需要做到只请求下载这个文件中5M~10M的这部分数据 可以通过设置请求头信息来实现,参考代码如下:NSString *header = [NSString stringWithFormat:@”bytes=%zd-“,self.currentSize]; [request setValue:header forHTTPHeaderField:@”Range”] 51.请简单比较使用NSURLSessionDownloadTask下载文件和使用NSURLSessionDataTask下载文件的优劣? NSURLSessionDataTask下载文件的优点:可以实现离线断点下载。缺点:代码复杂 NSURLSessionDownloadTask下载文件的 优点: 内部已经完成了边接收数据边写入到沙盒中的操作(解决了下载大文件时候的内存飙升问题) 可以方便的实现断点下载 缺点: 无法实现离线断点下载 52.请列出使用NSURLSession发送请求实现文件上传的主要步骤? 确定上传请求的路径 (NSURL) 创建可变的请求对象(NSMutableURLRequest) 修改请求方法为POST 设置请求头信息(告知服务器端这是一个文件上传请求) 按照固定的格式拼接要上传的文件等参数 根据请求对象创建会话对象(NSURLSession对象) 根据session对象来创建一个uploadTask上传请求任务 执行该上传请求任务(调用resume方法) 得到服务器返回的数据,解析数据(上传成功|上传失败) 53.请列出你认为在进行文件上传时候需要注意的细节(注意点)? 创建可变的请求对象,因为需要修改请求方法为POST,设置请求头信息 设置请求头这个步骤可能会被遗漏 要处理上传参数的时候,一定要按照固定的格式来进行拼接 需要采用合适的方法来获得上传文件的二进制数据类型(MIMEType) 54.请简单说明能够获得文件二进制数据类型(MIMEType)的几种方法? 直接百度 搜索 对着该文件发送一个网络请求,接受到该请求响应的时候,可以通过响应头信息中的MIMEType属性得到 使用通用的二进制数据类型表示任意的二进制数据 application/octet-stream 调用C语言的API来实现 55.请简单介绍下AFN各个主要版本的情况?0.1--1.0 "2.0---2.6.3" 3.0-->3.1.0 NSURLConnection - (NSURLConnection + NSURLSession) - NSURLSessio 0.1-2.0 NSURLConnection 2.0 -3.0 NSURLSession + NSURLConnection 3.0 + NSURLSession #### 56.如果服务器返回的数据不是JSON数据,那么在使用AFN发送网络请求的时候会请求失败请问是什么原因产生的?如何解决? * AFN在接受到服务器返回数据的时候,内部默认采用以JSON的方式来对响应体信息进行反序列化处理,而如果服务器返回的数据不是JSON而是其他数据比如XML数据或者是图片数据的时候就会提示网络请求失败 * 如果服务器返回的数据不是JSON,那么应该修改AFN对响应的解析方式 * 如果是XML数据,则: manager.responseSerializer = [AFXMLParserResponseSerializer serializer] 如果既不是JSON也不是XML,则manager.responseSerializer = [AFHTTPResponseSerializer serializer] 57.在使用NSURLSession进行文件上传的时候,如何监听文件上传的进度,有哪些注意点? 创建会话对象的时候,需要设置代理,让控制器成为session的代理 遵守代理协议(NSURLSessionDataDelegate) 实现代理方法,在代理方法中计算文件的上传进度- (void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend 注意:当任务执行完毕的时候应该释放对代理对象的强引用 58.请简单说明系统默认提供的NSURLSessionConfiguration三种配置信息? “defaultSessionConfiguration”返回标准配置,这实际上与NSURLConnection的网络协议栈是一样的,具有相同的共享NSHTTPCookieStorage,共享NSURLCache和共享NSURLCredentialStorage “ephemeralSessionConfiguration”返回一个预设配置,没有持久性存储的缓存,Cookie或证书。这对于实现像”秘密浏览”功能的功能来说,是很理想的 “backgroundSessionConfiguration”:独特之处在于,它会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文 59.在发送网络请求的时候,如果一个参数(place)需要对应着多个值,那么以下两种请求路径哪种是正确的?①:http://192.168.31.520:1314/loveyou?place=Beijing&Shanghai ②:http://192.168.31.520:1314/loveyou?place=Beijing&place=Shanghai 第二种请求路径是正确的,第一种是错误的,后面的shanghai将会被忽略 60.使用AFN进行文件下载相对于NSURLSessionDownloadTask而言有何好处? 可以很方便的监听文件的下载进度 NSURLSessionDownloadTask在实现文件下载的时候,内部默认把文件下载到了tmp临时路径,等下载完毕之后我们需要执行一个剪切操作 AFN下载请求的实现内部基于NSURLSessionDownloadTask,在使用的时候只需要告知AFN应该把文件剪切到什么路径,那么AFN内部会自动的进行文件剪切处理 61.请简单回答网络安全的原则是什么? 在网络上”不允许”传输用户隐私数据的”明文” 在本地”不允许”保存用户隐私数据的”明文” 62.请简单介绍下Base64编码? 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符:A~Z a~z 0~9 + / = 对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。 Base64编码原理: 将所有字符转化为ASCII码; 将ASCII码转化为8位二进制; 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位; 统一在6位二进制前补两个0凑足8位; 将补0后的二进制转为十进制; 从Base64编码表获取十进制对应的Base64编码 63.请简单说明单向散列函数的特点? 加密后密文的长度是定长的 如果明文不一样,那么散列后的结果一定不一样 如果明文一样,那么加密后的密文一定一样(对相同数据加密,加密后的密文一样) 所有的加密算法是公开的 不可以逆推反算 总结: 不可逆 原文相同 散列值相同 原文不同 散列值不同 加密后密文的长度是定长的 64.请简单介绍下散列函数的一些应用领域? 搜索 多个关键字,先对每个关键字进行散列,然后多个关键字进行或运算,如果值一致则搜索结果一致 版权 对文件进行散列判断该文件是否是正版或原版的 文件完整性验证 对整个文件进行散列,比较散列值判断文件是否完整或被篡改 65.请简单介绍下对称加密的特点和经典算法? 特点: 加密和解密使用相同的秘钥 加密和解密的过程是可逆的 性能好,效率高 经典算法 DES 数据加密标准 3DES 使用3个密钥,对消息进行(密钥1·加密)+(密钥2·解密)+(密钥3·加密) AES 高级加密标准 66.请简单说明ECB和CBC两种分组加密模式? ECB模式的全称为Electronic CodeBook模式。又成为电子密码本模式。 特点: 使用ECB模式加密的时候,相同的明文分组会被转换为相同的密文分组。 类似于一个巨大的明文分组——密文分组的对照表。 CBC模式全称为Cipher Block Chainning模式(密文分组链接模式|电子密码链条) 特点: 在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。 67.请简单介绍下非对称加密的特点和经典算法? 非对称加密的特点: 使用一个密钥对进行加密和解密,公钥加密,私钥解密 公钥是公开的,私钥是保密的 使用非对称加密来处理加密和解密的过程高度安全,但是效率低下,性能很差 经典算法:RSA 68.请简单介绍下数字签名这门技术? 应用场景:需要严格验证发送方身份信息情况 数字签名原理 客户端处理 对”消息”进行 HASH 得到 “消息摘要” 发送方使用自己的私钥对”消息摘要” 加密(数字签名) 把数字签名附着在”报文”的末尾一起发送给接收方 服务端处理 对”消息” HASH 得到 “报文摘要” 使用公钥对”数字签名” 解密 对结果进行匹配 69.数字证书和公钥什么关系? 数字证书就是对公钥进行数字签名 证书和驾照很相似,里面记有姓名、组织、地址等个人信息,以及属于此人的公钥,并有认证机构施加数字签名,只要看到公钥证书,我们就可以知道认证机构认证该公钥的确属于此人 数字证书的主要内容: 公钥 认证机构的数字签名 70.请简单说明在安装cocoapods时,使用pod install命令安装框架后的大致过程? 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。 下载依赖:根据分析依赖的结果,下载指定版本的类库到本地项目中。 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。 [reply]PDF3文件下载[/reply] ]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(二)-附答案]]></title>
<url>%2F2016%2F11%2F22%2F102%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 以下是一些自己收集的比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。 1.xcode5和xcode7区别? xcode7没有Frameworks文件夹,xcode7内部会自动帮你导入一些常见的框架. xcode7多了LaunchScreen.xib,LaunchScreen.xib设置启动界面,而且可以确定模拟器或者真机的真实尺寸,如果没有设置,默认4s的尺寸(320,480) xcode7没有pch文件 xcode5当中也有info.plist,只不过它的名字很长.是工程的名称. 2.pch文件原理? 把pch里面的所有内容导入到每个文件中去 3.UIApplication常见功能? 设置应用提醒数字 设置连网状态 设置状态栏 跳转网页 4.程序完整启动流程? 执行Main 执行UIApplicationMain函数. 创建UIApplication对象,并设置UIApplicationMain对象的代理.UIApplication的第三个参数就是UIApplication的名称,如果指定为nil,它会默认为UIApplication.UIApplication的第四个参数为UIApplication的代理. 开启一个主运行循环.保证应用程序不退出. 加载info.plist.加载配置文件.判断一下info.plist文件当中有没有Main storyboard file base name,里面有没有指定storyboard文件,如果有就去加载info.plist文件,如果没有,那么应用程序加载完毕. 5.UIWindow是什么? UIWindow是一种特殊的UIView,通常在一个app中至少有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view, 最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow 6.手动创建窗口的步骤? 创建窗口,要有窗口显示,必须要有强引用.窗口也是控件,要想展示出来.必须得要有尺寸. 创建控制器 设置控制器为窗口的根控制器 显示窗口 7.makeKeyAndVisible做了哪些事情? 让窗口成为显示状态. 把根控制器的View添加到窗口上面. 把当前窗口设置成应用程序的主窗口 8.如何从从StoryBoard加载控制器? 加载指定的storyBoard 加载箭头所指向的控制器. 加载指定标识的控制器. 9.initWithNibName的加载过程? 如果没有指定名称.指定为nil,那么它就会去先加载跟它相同名称的Xib. 如果没有跟它相同名称的Xib,那么它就会再去加载跟它相同名称去点Controller的名字的Xib. 控制器的init方法会调用initWithNibName:方法. 10.LoadView 作用以及使用LoadView的注意点? 控制器调用loadView方法创建控制器的view.它的默认做法是: 先去判断当前控制器是不是从StoryBoard当中加载的,如果是,那么它就会从StoryBoard当中加载控制器的View. 如果不是从StoryBoard当中加载的, 那么它还会判断是不是从Xib当中创建的控制器.如果是,那么它就会从xib加载控制器的View. 如果也不是从Xib加载的控制器.那么它就会创建一个空的UIView.设为当前控制器的View. 注意点: * 一旦重写了loadView,表示需要自己创建控制器的View. 如果控制器的View还没有赋值,就不能调用控制器View的get方法.会造成死循环.因为控制器View的get方法底层会调用loadView方法. 11.UIPickView是什么控件,基本用法怎样的? UIPickView选择控件,用来供用户选择一些城市等.它的基本用法与tableView基本相似,要设置数据源,代理, 让其展示数据 12.KVC底层实现? 拿字符串与当前类的属性进行匹配.如果匹配到,就给该属性赋值.[flagItem setValue:obj forKeyPath:key]; 会找有没有跟key值相同名称的set方法,如果有,就会调用set方法,把obj传入 如果说没有set方法.那么它会去找没有相同名称,并且带有下划线的成员属性,如果有就会给该属性赋值. 如果也没有带有下划线的成员属性,就看有没有跟它相同名称的成员属性,如果有就会给该属性赋值. 如果还没有跟它相同名称的成员属性,就会调用setValue:(id)value forUndefinedKey: 如果没有实现setValue: forUndefinedKey: 就直接报错 13.导航控制器View的结构是怎样的? 一个专门存放栈顶控制器View的View 一个导航条,导航条的高度为44,Y值为20 14.导航push做了哪些事情? 当调用push方法时, 会把要push的控制器添加到导航控制器管理的栈中,把之前导航控制器中栈顶控制器View给移除,把当前栈顶控制器添加上去. 15.导航pop做了哪些事情? 当调用pop方法时, 会把要pop的控制器从栈里移除,把之前导航控制器中栈顶控制器View给移除,把当前栈顶控制器添加上去. 16.如何设置导航条的内容? 导航条的内容由导航控制器的栈顶控制器的NavigationItem决定. 17.导航控制器pop操作有哪些? 返回上一级 返回到根控制器 返回到指定的控制器. 18.文本框如何拦截用户输入? 给指定的文件框,设置代理 ,实现代理方法.里面包括是否允许开始编辑,是否允许结束编辑,是否允许改变字符等等. 19.如何自定义键盘? 自定义键盘,要继承系统的UITextField,设置文本框的一个属性,该属性名称为inputView.这样就可以把键盘定义成自己要想的View. 20.导航控制器的作用? 导航控制器可以轻松的完成控制器之间的切换.其操作有push,pop等. 21.自动跳转与手动型跳转区别? 自动跳转:通过控件直接拖线的方式进行跳转 手动跳转:在跳转之前要去做一些处理工作. 必须得要执行performSegueWithIdentifier:才能跳转. 22.什么时候使用代理 ,代理的步骤? 当一个对象发生某一件事时,想要把自己的东西传给别人.或是通知别人做某事使用代理. 使用场景: 上下级之间,通常是它的上一级成为它的代理. 步骤: 定义协议 定义代理属性 在.m文件当中调用代理方法 设置代理 遵守协议 实现协议方法 23.ios当中存储方式有哪些? XML属性列表(plist) Preference(偏好设置) NSKeyedArchiver,只有遵守NSCoding协议的对象才可以使用这种方式。 SQLite Core Data 24.tableView性能优化 tableView的缓存机制. 在不等高Cell当中,提前计算Cell的行高.提前估一个行高.200-250 如果说Cell当中有圆形图片,图片不要用ImageView加载layer.corneadius裁剪去做.会造成离屏渲染. 用绘图Qurarzds裁剪,生成一张圆形的图片. 如果说图片的宽高,指定为小数点.会造成锯齿,造成锯齿就会导致离屏渲染 cell当中的ImageView的大小最好是跟UIImage是一样大,如果不一样大 它会对UIImage做形变操作.cell当中展示都是小图.小图的大小跟ImageView 点击放大,是再去用大的ImageView加载大图. 做tableView的时候一定要用真机. 如果是从网络加载数据,一定要放到子线程(异步加载)当中做. 加载完毕的数据一定做本地缓存. cell当中不要动态的添加子控件.一般都在创建时,就把要出现的Cell给添加进去,暂时不要显示的,可隐藏. 尽量减少Cell内部子控件的个数. 如果控件非常多,把不需要与用户进行交互的控件.能过异步绘制出来.生成一张图片.把图片添加到cell当中 [reply]PDF2文件下载[/reply] ]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(二)-附答案]]></title>
<url>%2F2016%2F11%2F22%2F102-1%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 以下是一些自己收集的比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。 1.xcode5和xcode7区别? xcode7没有Frameworks文件夹,xcode7内部会自动帮你导入一些常见的框架. xcode7多了LaunchScreen.xib,LaunchScreen.xib设置启动界面,而且可以确定模拟器或者真机的真实尺寸,如果没有设置,默认4s的尺寸(320,480) xcode7没有pch文件 xcode5当中也有info.plist,只不过它的名字很长.是工程的名称. 2.pch文件原理? 把pch里面的所有内容导入到每个文件中去 3.UIApplication常见功能? 设置应用提醒数字 设置连网状态 设置状态栏 跳转网页 4.程序完整启动流程? 执行Main 执行UIApplicationMain函数. 创建UIApplication对象,并设置UIApplicationMain对象的代理.UIApplication的第三个参数就是UIApplication的名称,如果指定为nil,它会默认为UIApplication.UIApplication的第四个参数为UIApplication的代理. 开启一个主运行循环.保证应用程序不退出. 加载info.plist.加载配置文件.判断一下info.plist文件当中有没有Main storyboard file base name,里面有没有指定storyboard文件,如果有就去加载info.plist文件,如果没有,那么应用程序加载完毕. 5.UIWindow是什么? UIWindow是一种特殊的UIView,通常在一个app中至少有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view, 最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow 6.手动创建窗口的步骤? 创建窗口,要有窗口显示,必须要有强引用.窗口也是控件,要想展示出来.必须得要有尺寸. 创建控制器 设置控制器为窗口的根控制器 显示窗口 7.makeKeyAndVisible做了哪些事情? 让窗口成为显示状态. 把根控制器的View添加到窗口上面. 把当前窗口设置成应用程序的主窗口 8.如何从从StoryBoard加载控制器? 加载指定的storyBoard 加载箭头所指向的控制器. 加载指定标识的控制器. 9.initWithNibName的加载过程? 如果没有指定名称.指定为nil,那么它就会去先加载跟它相同名称的Xib. 如果没有跟它相同名称的Xib,那么它就会再去加载跟它相同名称去点Controller的名字的Xib. 控制器的init方法会调用initWithNibName:方法. 10.LoadView 作用以及使用LoadView的注意点? 控制器调用loadView方法创建控制器的view.它的默认做法是: 先去判断当前控制器是不是从StoryBoard当中加载的,如果是,那么它就会从StoryBoard当中加载控制器的View. 如果不是从StoryBoard当中加载的, 那么它还会判断是不是从Xib当中创建的控制器.如果是,那么它就会从xib加载控制器的View. 如果也不是从Xib加载的控制器.那么它就会创建一个空的UIView.设为当前控制器的View. 注意点: * 一旦重写了loadView,表示需要自己创建控制器的View. 如果控制器的View还没有赋值,就不能调用控制器View的get方法.会造成死循环.因为控制器View的get方法底层会调用loadView方法. 11.UIPickView是什么控件,基本用法怎样的? UIPickView选择控件,用来供用户选择一些城市等.它的基本用法与tableView基本相似,要设置数据源,代理, 让其展示数据 12.KVC底层实现? 拿字符串与当前类的属性进行匹配.如果匹配到,就给该属性赋值.[flagItem setValue:obj forKeyPath:key]; 会找有没有跟key值相同名称的set方法,如果有,就会调用set方法,把obj传入 如果说没有set方法.那么它会去找没有相同名称,并且带有下划线的成员属性,如果有就会给该属性赋值. 如果也没有带有下划线的成员属性,就看有没有跟它相同名称的成员属性,如果有就会给该属性赋值. 如果还没有跟它相同名称的成员属性,就会调用setValue:(id)value forUndefinedKey: 如果没有实现setValue: forUndefinedKey: 就直接报错 13.导航控制器View的结构是怎样的? 一个专门存放栈顶控制器View的View 一个导航条,导航条的高度为44,Y值为20 14.导航push做了哪些事情? 当调用push方法时, 会把要push的控制器添加到导航控制器管理的栈中,把之前导航控制器中栈顶控制器View给移除,把当前栈顶控制器添加上去. 15.导航pop做了哪些事情? 当调用pop方法时, 会把要pop的控制器从栈里移除,把之前导航控制器中栈顶控制器View给移除,把当前栈顶控制器添加上去. 16.如何设置导航条的内容? 导航条的内容由导航控制器的栈顶控制器的NavigationItem决定. 17.导航控制器pop操作有哪些? 返回上一级 返回到根控制器 返回到指定的控制器. 18.文本框如何拦截用户输入? 给指定的文件框,设置代理 ,实现代理方法.里面包括是否允许开始编辑,是否允许结束编辑,是否允许改变字符等等. 19.如何自定义键盘? 自定义键盘,要继承系统的UITextField,设置文本框的一个属性,该属性名称为inputView.这样就可以把键盘定义成自己要想的View. 20.导航控制器的作用? 导航控制器可以轻松的完成控制器之间的切换.其操作有push,pop等. 21.自动跳转与手动型跳转区别? 自动跳转:通过控件直接拖线的方式进行跳转 手动跳转:在跳转之前要去做一些处理工作. 必须得要执行performSegueWithIdentifier:才能跳转. 22.什么时候使用代理 ,代理的步骤? 当一个对象发生某一件事时,想要把自己的东西传给别人.或是通知别人做某事使用代理. 使用场景: 上下级之间,通常是它的上一级成为它的代理. 步骤: 定义协议 定义代理属性 在.m文件当中调用代理方法 设置代理 遵守协议 实现协议方法 23.ios当中存储方式有哪些? XML属性列表(plist) Preference(偏好设置) NSKeyedArchiver,只有遵守NSCoding协议的对象才可以使用这种方式。 SQLite Core Data 24.tableView性能优化 tableView的缓存机制. 在不等高Cell当中,提前计算Cell的行高.提前估一个行高.200-250 如果说Cell当中有圆形图片,图片不要用ImageView加载layer.corneadius裁剪去做.会造成离屏渲染. 用绘图Qurarzds裁剪,生成一张圆形的图片. 如果说图片的宽高,指定为小数点.会造成锯齿,造成锯齿就会导致离屏渲染 cell当中的ImageView的大小最好是跟UIImage是一样大,如果不一样大 它会对UIImage做形变操作.cell当中展示都是小图.小图的大小跟ImageView 点击放大,是再去用大的ImageView加载大图. 做tableView的时候一定要用真机. 如果是从网络加载数据,一定要放到子线程(异步加载)当中做. 加载完毕的数据一定做本地缓存. cell当中不要动态的添加子控件.一般都在创建时,就把要出现的Cell给添加进去,暂时不要显示的,可隐藏. 尽量减少Cell内部子控件的个数. 如果控件非常多,把不需要与用户进行交互的控件.能过异步绘制出来.生成一张图片.把图片添加到cell当中 [reply]PDF2文件下载[/reply] ]]></content>
</entry>
<entry>
<title><![CDATA[《Pro Git》学习笔记连载(一.起因)]]></title>
<url>%2F2016%2F11%2F17%2F101%2F</url>
<content type="text"><![CDATA[《Pro Git》这本书可谓是学习进阶Git的最好材料了,之所以阅读这本书,是因为虽然用Git,然而并不是了解的很深入,抱着学东西要学就学懂的心态,开始研读这本书,希望与大家一起进步,文章内容可能与原书本差不多,直接搬过来的,方便以后阅读,同时也会加上自己的心得,文章会不定期更新。 在开始之前,先引用下别人对它的评价: 长短适中:每个section大概10-20min能够读完,可以利用饭后休息时间见缝插针地读 内容全面:涵盖了Git的常用命令、分支特性、远程仓库、自己搭建Git服务器、配置、内部原理等各个方面。零基础的初学者可以通过前3章成为一名个人Git用户,后几章能够满足中高阶用户深入了解的需求。 图文并茂:Git作为一门工具,最好的学习方法还是使用它。书中给出了大量的应用案例,不同开发工作模式有不同的用法,配合插图演示版本变化的状态,很容易理解。 知其然更知其所以然:介绍命令的时候也会涉及Git数据结构等内容,有助于理解为什么要这么做,不用死记硬背命令。初学的时候嫌太复杂可以直接跳过,不影响理解。]]></content>
</entry>
<entry>
<title><![CDATA[《Pro Git》学习笔记连载(一.起因)]]></title>
<url>%2F2016%2F11%2F17%2F101-1%2F</url>
<content type="text"><![CDATA[《Pro Git》这本书可谓是学习进阶Git的最好材料了,之所以阅读这本书,是因为虽然用Git,然而并不是了解的很深入,抱着学东西要学就学懂的心态,开始研读这本书,希望与大家一起进步,文章内容可能与原书本差不多,直接搬过来的,方便以后阅读,同时也会加上自己的心得,文章会不定期更新。 在开始之前,先引用下别人对它的评价: 长短适中:每个section大概10-20min能够读完,可以利用饭后休息时间见缝插针地读 内容全面:涵盖了Git的常用命令、分支特性、远程仓库、自己搭建Git服务器、配置、内部原理等各个方面。零基础的初学者可以通过前3章成为一名个人Git用户,后几章能够满足中高阶用户深入了解的需求。 图文并茂:Git作为一门工具,最好的学习方法还是使用它。书中给出了大量的应用案例,不同开发工作模式有不同的用法,配合插图演示版本变化的状态,很容易理解。 知其然更知其所以然:介绍命令的时候也会涉及Git数据结构等内容,有助于理解为什么要这么做,不用死记硬背命令。初学的时候嫌太复杂可以直接跳过,不影响理解。]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(一)-附答案]]></title>
<url>%2F2016%2F11%2F16%2F100%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 以下是一些自己收集的比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。 1.简单的描述下类扩展和分类的区别?(说2点) 类扩展没有名字,分类有名字。 类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩充方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明。 2.简要的说明UIView的frame和bounds的区别。 frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点. bounds表示的是控件矩形框的位置和尺寸,是以自己的左上角为坐标原点. 3.什么是控制器 凡是继承自UIViewController的对象都是控制器. 4.简单的描述控制器的作用 负责处理软件界面的各种事件,并负责软件界面的创建和销毁. 5.简单的描述下storyboard的作用 用来描述描述软件界面的. 6.简述程序的启动原理 程序一启动,就会加载Main.storyboard文件;会创建箭头所指的控制器,并显示控制器所管理的软件界面 7.IBOutLet有什么作用 被IBOutlet修饰的属性能拖线到storyboard中,而且只能修饰属性. 8.IBAction有什么作用 被IBAction修饰的方法能拖线到storyboard中,只能修饰方法返回值类型 9.IBAction和IBOutLet前缀IB是什么意思 IB全称:Interface Builder,从Xcode4开始,Interface Builder已经整合到Xcode中 10.简单描述父子控件 每个控件都是个容器,能容纳其他控件;内部小控件是大控件的子控件;大控件是内部小控件的父控件 #### 11. 解释下引用资源的时候每个选项的含义 copy:勾选copy,会把资源拷贝一份到项目的文件夹中(建议勾选,因为这样修改项目中的资源不会影响源资源) Added folder:如果勾选Create groups,只会会创建一个虚拟的文件夹,程序打包后,安装包中不存在这个文件夹;如果勾选Create folder references,真的创建一个文件夹,程序打包后,安装包中真的有这个文件夹. Add to targets:要不要把资源打包到软件安装包中去.一定要勾选,不勾选到时候程序打包后,安装包中没有这个资源. 12.UILabel如何设置自动换行 设置numberOflines 为0. 13.Character Wrap和Word Wrap的区别 Character Wrap 字符包裹; Word Wrap 单词包裹<保证单词的完整性>. 14.contentMode的作用 内容模式: 一般用来控制图片如何显示 15.initWithImage:的作用? 根据传入的图片对象创建UIImageView对象;并且UIImageView的尺寸默认等于图片的尺寸 16.如何修改一个控件的frame属性? 直接使用CGRectMake函数 利用临时结构体变量 直接运用结构体赋值 17.如何抽方法? 先把相同的代码抽到方法中 把要变化的东西换成变量,然后编译,把报错的设置为方法的参数 18.通过imageNamed:这个方法加载图片有什么特点? 有缓存UIImage *image =[UIImage imageNamed:@”图片名”] 使用场合:图片比较小、使用频率比较高 建议:把需要缓存的图片放到Images.xcassets 19.开发如何选择UILabel,UIImageView,UIButton 能用UILabel,UIImageView的尽量用UILabel,UIImageView;需要和用户交互用UIButton 20.什么是自定义控件 继承自系统的控件写一个自己的控件,目的是封装控件内部的细节 21.通过代码如何自定义控件? 并且简单的描述下每一个步骤的理由? 新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件) 在initWithFrame方法中添加子控件(保证别人在外面不管是通过init还是initWithFrame创建都能够添加子控件,因为init方法内部会调用initWithFrame 在layoutSubViews方法中设置子控件的frame(因为在InitWithFrame方法中当前控件尺寸可能没值,所以计算不了子控件的位置和尺寸,而在layoutSubViews方法,能够拿到当前控件的尺寸) 提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上) 22.什么是模型 概念:专门用来存放数据的对象 特点:一般继承NSObject,在.h文件中声明一些用来存放数据的属性 23.通过XIB如何自定义控件? 并且简单的描述下每一个步骤的理由? 新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件) 新建一个xib文件(xib的文件名最好和类名一样) 修改最外面那个控件的class为控件类名(只有修改类名,当时候从xib中出来的才是我这种类型的控件) 提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上) 24.instancetype和id的区别 都可以代表任意类型 instancetype只能作为返回值 id类型可以作为返回值,也可以作为参数,也可以定义变量 instancetype会类型检测,id不会进行类型检测 25. @property的使用策略 assign:’基本数据类型’、’枚举‘、’结构体‘等非OC对象 weak:OC对象类型(比如NSArray、NSDate、NSNumber、模型类) strong:OC对象类型(比如NSArray、NSDate、NSNumber、模型类) 一个对象只要有强指针引用,就不会被销毁 26.懒加载的好处? 用到时再加载,只会加载一次 27.如果是通过xib或者storyboard创建控件,初始化的操作可以在initWithFrame:方法中做吗? 如果是通过xib或者storyboard创建控件,初始化时是不会调用initWithFrame,会调用initWithCoder.初始化完毕会调用awakeFromNib方法,建议在awakeFromNib中做初始化 28.通过alloc/init或者alloc/initWithFrame创建控件会不会主动加载xib? 通过alloc/init或者alloc/initWithFrame创建控件不会主动加载xib,即使xib的名称和控件的类名一样 29.用一个属性引用UI控件的时候为什么可以用weak? 因为UI控件添加到父控件中以后,会有强指针指向这个对象,就应经可以保证这个对象不会被销毁.在搞一个属性引用这个对象,用弱引用就可以. 30.如何隐藏一个控件? 设置hidden为YES; 设置alpha为0.0. 31.如何用按钮来实现图片上文字下的效果?自定义按钮,实现 -(CGRect)titleRectForContentRect:(CGRect)contentRect { // 返回文字的frame } - (CGRect)imageRectForContentRect:(CGRect)contentRect { // 返回图片的frame } - 自定义按钮,实现layoutSubViews方法调整按钮内部子控件的位置和尺寸 #### 32.通过代码如何设置的内边距? self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0); self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0); self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0); #### 33.如何处理图片拉伸问题? 创建可拉伸的图片对象 bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(10,10,10,10) resizingMode:..];//平铺和拉伸 UIImage *bg = ... #### 34.在xcode中如何配置拉伸图片? * 选中图片--->右边(Slicing)-->Sices:Horizontal and Vertical -->上下左右设置 #### 35.KVC的作用? * Key Value Coding 键值编码,可以修改属性的值,并且可以修改私有的成员比变量;可以取值 * * * #### 36.如何监听scrollView停止滚动? 1. 设置scrollView的代理 2. 代理对象遵守<UIScrollViewDelegate>协议 3. 实现协议里面 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView #### 37.定时器一般有什么作用?以及如何使用定时器 * 可以办到每隔一定的时间做一件事件. 通过 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; 可以创建一个自定执行任务的定时器对象 通过 - (void)invalidate这个方法可以停止定时器 #### 38.scrollView的使用场景 * 当内容数据一多,在可视的View中就展示不完,这时候就需要用到UIScrollView控件. #### 39.UIScrollView无法滚动的原因 1. 没有设置contentSize,或者设置的contenSize小于等于scrollView的尺寸 2. scrollEnable = NO; 3. userInteractionEnable = NO; // 是否允许与用户交互 #### 40.scrollEnable和userInteractionEnable的区别 1. scrollEnable仅仅是不能滚动,其他事件依旧能够响应 2. userInteractionEnable禁止任何交互事件 #### 41.alwaysBounceVertical alwaysBounceHorizontal的作用 * 不管有没有contentSize,总是有弹簧效果;作用:用来做下拉刷新和上拉刷新的 #### 42.如何监听UIScrollView各种行为 1. 设置scrollView的delegate(代理)为控制器对象 2. 控制器要遵守协议UIScrollViewDelegate协议 3. 控制器要实现UIScrollViewDelegate协议里面的方法 #### 43.代理的注意点 1. scrollView的代理可以是任何类型的OC 对象 2. 代理一定是weak #### 44.利用UIScrollView如何实现内容缩放 1. 设置代理 2. 实现代理方法 -(UIView *)viewForZoomingInScrollview:(UIScrollView *)scrollView; 3. 设置缩放比例 self.scrollView.maximumZoomScale = 2.0; self.scrollView.minimumZoomScale = 0.2; 45.如何监听控件的行为? 通过addTarget:只有继承来自UICotrol的对象,才有这个功能 通过delegate:只有拥有delegate属性的控件,才有这个功能 46.通过autolayout如何实现UILabel包裹内容? 设置位置约束 设置宽度约束<=固定值 不需要设置高度约束 47.什么是适配? 适应、兼容各种不同的情况 系统适配:针对不同版本的操作系统进行适配 屏幕适配:针对不同大小的屏幕尺寸进行适配 48.点和像素的区别 在用户眼中,屏幕是由无数个像素组成的,像素越多,屏幕越清晰 在开发者眼中,屏幕是由无数个点组成的,点又是由像素组成的,一个点钟包含的像素越多,屏幕越清晰. 49.什么是Autolayout? Autolayout是一种“自动布局”技术,专门用来布局UI界面的 50.简单描述下Autolayout的2个核心概念约束和参照 约束:通过给控件添加约束,来决定控件的位置和尺寸 参照:在添加约束时,是依照谁来添加(可以是父控件或者兄弟控件) 51.Autolayout的警告和错误 警告:控件的frame不匹配所添加的约束 错误:1>缺乏必要的约束;2>两个约束冲突 52.通过代码添加约束的原则 对于两个同层级view之间的约束关系,添加到它们的父view上 对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上 对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上 53.什么是VFL VFL全称是Visual Format Language,翻译过来是“可视化格式语言” VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言 54.通过约束如何实现动画 在修改了约束之后,只要执行下面代码,就能做动画效果[UIView animateWithDuration:1.0 animations:^{ [添加了约束的view的父控件 layoutIfNeeded]; }]; 55.性能优化的具体实现 当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。 当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象. 56.UITableView如何展示数据? 设置数据源对象self.tableView.dataSource = self; 数据源对象要遵守协议 实现数据源方法// 多少组数据 (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // 每一组有多少行数据 (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // 每一行显示什么内容 (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 57.UITableView的有哪几种样式 UITableViewStylePlain UITableViewStyleGrouped 58.UITableViewController的认识 tableVieController有个tableView属性,指向一个tableView,而tableView的dataSource和delegate属性指向就是这个控制器.并且这个控制器已经遵守了UITableViewDataSource和UITableViewDelegate协议.而每个控制器的内部都有一个view属性,在tableVieController中,view和tableView属性指向的是同一个对象. 59.性能优化的思路 iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象 60.UITableView的性能优化的实现步骤/* 每当一个cell要进入视野范围就会调用这个方法 / (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ // 1.定义一个重用标识static NSString *ID = @”tim”; // 2.去缓存池取可循环利用的cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3.缓存池如果没有可循环利用的cell,自己创建if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];// 建议:所有cell都一样的设置,写在这个大括号中;所有cell不都一样的设置写在外面cell.backgroundColor = [UIColor redColor]; }// 4.设置数据cell.textLabel.text = [NSString stringWithFormat:@”第%zd行数据”,indexPath.row]; return cell;} 61.registerClass:的作用 根据一个ID注册这个ID标识对应的cell类型. 62.通过注册的方法如何实现cell的重用 NSString *ID = @”wine”; (void)viewDidLoad {[super viewDidLoad];// 注册ID 这个标识对应的cell类型为UITableViewCell[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];} (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath{// 1.先去缓存池中查找可循环利用的cellUITableViewCell cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 2.设置数据cell.textLabel.text = [NSString stringWithFormat:@”%zd行的数据”, indexPath.row]; return cell;} 63.如何监听tableView内部cell的点击事件 设置代理 代理对象遵守协议 实现协议里面的方法 64.简述registerNib:(nullable UINib )nib forCellReuseIdentifier:(NSString )identifier 和registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier 这2个方法的区别 registerClass这个方法是根据ID 注册对应的cell类型,系统创建cell的方式是通过alloc/initWithStyle… registerNib 这个方法是根据ID 注册一个xib文件,系统创建cell的方式是通过加载xib文件. 65.如何计算一段文字的宽度和高度? 第一种情况:如果label只有一行,通过sizeWithAttributes:这个方法,告知这段文字的字体和字体大小就可以计算这段文字的尺寸. 第二种情况:如果label需要换行计算高度,通过boundingRectWithSize: options: attributes:attributes context: 这个方法,告知这段文字的字体和字体大小,并且在一个限制的尺寸内计算这段文字的尺寸. 66.什么是自定义cell? 继承自系统的UITableViewCell写一个自己的cell 67.通过代码自定义cell能在ininWithFrame:方法中添加子控件吗? 不能,自定义cell 是在initWithStyle:reuseIdentifier:方法添加子控件 68.通过代码自定义cell能在initWithStyle:reuseIdentifier:方法中计算子控件的位置和尺寸吗? 不行,因为在这个方法,cell的尺寸可能还没有,而计算子控件的位置和尺寸需要相对于cell来计算.通过代码自定义cell是在layoutSubviews中计算的 69.通过代码自定义cell,frame和Autolayout2中的方式有什么区别? 这2种方法,只是子控件的位置和尺寸的确定方法不一样.frame是通过设置子控件的frame来确定;而Autolayout是通过添加约束的方式来确定 70.通过storyboard的方式是如何加载cell 首先根据ID去缓存池中取,如果缓存中没有,也没有注册,会自动去storyboard中找有没有ID这种标识的Cell,如果有,会加载这个cell,并且绑定这个标识返回 71.字典转模型第三方框架的了解 Mantle:所有模型都必须继承自MTModel JSONModel:所有模型都必须继承自JSONModel MJExtension:不需要强制继承任何其他类 72.设计框架需要考虑的问题 侵入性:侵入性大就意味着很难离开这个框架 易用性:比如少量代码实现N多功能 扩展性:很容易给这个框架增加新功能 [reply]PDF文件下载[/reply]]]></content>
</entry>
<entry>
<title><![CDATA[iOS基础问答面试题连载(一)-附答案]]></title>
<url>%2F2016%2F11%2F16%2F100-1%2F</url>
<content type="text"><![CDATA[「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 以下是一些自己收集的比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。 1.简单的描述下类扩展和分类的区别?(说2点) 类扩展没有名字,分类有名字。 类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩充方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明。 2.简要的说明UIView的frame和bounds的区别。 frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点. bounds表示的是控件矩形框的位置和尺寸,是以自己的左上角为坐标原点. 3.什么是控制器 凡是继承自UIViewController的对象都是控制器. 4.简单的描述控制器的作用 负责处理软件界面的各种事件,并负责软件界面的创建和销毁. 5.简单的描述下storyboard的作用 用来描述描述软件界面的. 6.简述程序的启动原理 程序一启动,就会加载Main.storyboard文件;会创建箭头所指的控制器,并显示控制器所管理的软件界面 7.IBOutLet有什么作用 被IBOutlet修饰的属性能拖线到storyboard中,而且只能修饰属性. 8.IBAction有什么作用 被IBAction修饰的方法能拖线到storyboard中,只能修饰方法返回值类型 9.IBAction和IBOutLet前缀IB是什么意思 IB全称:Interface Builder,从Xcode4开始,Interface Builder已经整合到Xcode中 10.简单描述父子控件 每个控件都是个容器,能容纳其他控件;内部小控件是大控件的子控件;大控件是内部小控件的父控件 #### 11. 解释下引用资源的时候每个选项的含义 copy:勾选copy,会把资源拷贝一份到项目的文件夹中(建议勾选,因为这样修改项目中的资源不会影响源资源) Added folder:如果勾选Create groups,只会会创建一个虚拟的文件夹,程序打包后,安装包中不存在这个文件夹;如果勾选Create folder references,真的创建一个文件夹,程序打包后,安装包中真的有这个文件夹. Add to targets:要不要把资源打包到软件安装包中去.一定要勾选,不勾选到时候程序打包后,安装包中没有这个资源. 12.UILabel如何设置自动换行 设置numberOflines 为0. 13.Character Wrap和Word Wrap的区别 Character Wrap 字符包裹; Word Wrap 单词包裹<保证单词的完整性>. 14.contentMode的作用 内容模式: 一般用来控制图片如何显示 15.initWithImage:的作用? 根据传入的图片对象创建UIImageView对象;并且UIImageView的尺寸默认等于图片的尺寸 16.如何修改一个控件的frame属性? 直接使用CGRectMake函数 利用临时结构体变量 直接运用结构体赋值 17.如何抽方法? 先把相同的代码抽到方法中 把要变化的东西换成变量,然后编译,把报错的设置为方法的参数 18.通过imageNamed:这个方法加载图片有什么特点? 有缓存UIImage *image =[UIImage imageNamed:@”图片名”] 使用场合:图片比较小、使用频率比较高 建议:把需要缓存的图片放到Images.xcassets 19.开发如何选择UILabel,UIImageView,UIButton 能用UILabel,UIImageView的尽量用UILabel,UIImageView;需要和用户交互用UIButton 20.什么是自定义控件 继承自系统的控件写一个自己的控件,目的是封装控件内部的细节 21.通过代码如何自定义控件? 并且简单的描述下每一个步骤的理由? 新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件) 在initWithFrame方法中添加子控件(保证别人在外面不管是通过init还是initWithFrame创建都能够添加子控件,因为init方法内部会调用initWithFrame 在layoutSubViews方法中设置子控件的frame(因为在InitWithFrame方法中当前控件尺寸可能没值,所以计算不了子控件的位置和尺寸,而在layoutSubViews方法,能够拿到当前控件的尺寸) 提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上) 22.什么是模型 概念:专门用来存放数据的对象 特点:一般继承NSObject,在.h文件中声明一些用来存放数据的属性 23.通过XIB如何自定义控件? 并且简单的描述下每一个步骤的理由? 新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件) 新建一个xib文件(xib的文件名最好和类名一样) 修改最外面那个控件的class为控件类名(只有修改类名,当时候从xib中出来的才是我这种类型的控件) 提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上) 24.instancetype和id的区别 都可以代表任意类型 instancetype只能作为返回值 id类型可以作为返回值,也可以作为参数,也可以定义变量 instancetype会类型检测,id不会进行类型检测 25. @property的使用策略 assign:’基本数据类型’、’枚举‘、’结构体‘等非OC对象 weak:OC对象类型(比如NSArray、NSDate、NSNumber、模型类) strong:OC对象类型(比如NSArray、NSDate、NSNumber、模型类) 一个对象只要有强指针引用,就不会被销毁 26.懒加载的好处? 用到时再加载,只会加载一次 27.如果是通过xib或者storyboard创建控件,初始化的操作可以在initWithFrame:方法中做吗? 如果是通过xib或者storyboard创建控件,初始化时是不会调用initWithFrame,会调用initWithCoder.初始化完毕会调用awakeFromNib方法,建议在awakeFromNib中做初始化 28.通过alloc/init或者alloc/initWithFrame创建控件会不会主动加载xib? 通过alloc/init或者alloc/initWithFrame创建控件不会主动加载xib,即使xib的名称和控件的类名一样 29.用一个属性引用UI控件的时候为什么可以用weak? 因为UI控件添加到父控件中以后,会有强指针指向这个对象,就应经可以保证这个对象不会被销毁.在搞一个属性引用这个对象,用弱引用就可以. 30.如何隐藏一个控件? 设置hidden为YES; 设置alpha为0.0. 31.如何用按钮来实现图片上文字下的效果?自定义按钮,实现 -(CGRect)titleRectForContentRect:(CGRect)contentRect { // 返回文字的frame } - (CGRect)imageRectForContentRect:(CGRect)contentRect { // 返回图片的frame } - 自定义按钮,实现layoutSubViews方法调整按钮内部子控件的位置和尺寸 #### 32.通过代码如何设置的内边距? self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0); self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0); self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0); #### 33.如何处理图片拉伸问题? 创建可拉伸的图片对象 bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(10,10,10,10) resizingMode:..];//平铺和拉伸 UIImage *bg = ... #### 34.在xcode中如何配置拉伸图片? * 选中图片--->右边(Slicing)-->Sices:Horizontal and Vertical -->上下左右设置 #### 35.KVC的作用? * Key Value Coding 键值编码,可以修改属性的值,并且可以修改私有的成员比变量;可以取值 * * * #### 36.如何监听scrollView停止滚动? 1. 设置scrollView的代理 2. 代理对象遵守<UIScrollViewDelegate>协议 3. 实现协议里面 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView #### 37.定时器一般有什么作用?以及如何使用定时器 * 可以办到每隔一定的时间做一件事件. 通过 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; 可以创建一个自定执行任务的定时器对象 通过 - (void)invalidate这个方法可以停止定时器 #### 38.scrollView的使用场景 * 当内容数据一多,在可视的View中就展示不完,这时候就需要用到UIScrollView控件. #### 39.UIScrollView无法滚动的原因 1. 没有设置contentSize,或者设置的contenSize小于等于scrollView的尺寸 2. scrollEnable = NO; 3. userInteractionEnable = NO; // 是否允许与用户交互 #### 40.scrollEnable和userInteractionEnable的区别 1. scrollEnable仅仅是不能滚动,其他事件依旧能够响应 2. userInteractionEnable禁止任何交互事件 #### 41.alwaysBounceVertical alwaysBounceHorizontal的作用 * 不管有没有contentSize,总是有弹簧效果;作用:用来做下拉刷新和上拉刷新的 #### 42.如何监听UIScrollView各种行为 1. 设置scrollView的delegate(代理)为控制器对象 2. 控制器要遵守协议UIScrollViewDelegate协议 3. 控制器要实现UIScrollViewDelegate协议里面的方法 #### 43.代理的注意点 1. scrollView的代理可以是任何类型的OC 对象 2. 代理一定是weak #### 44.利用UIScrollView如何实现内容缩放 1. 设置代理 2. 实现代理方法 -(UIView *)viewForZoomingInScrollview:(UIScrollView *)scrollView; 3. 设置缩放比例 self.scrollView.maximumZoomScale = 2.0; self.scrollView.minimumZoomScale = 0.2; 45.如何监听控件的行为? 通过addTarget:只有继承来自UICotrol的对象,才有这个功能 通过delegate:只有拥有delegate属性的控件,才有这个功能 46.通过autolayout如何实现UILabel包裹内容? 设置位置约束 设置宽度约束<=固定值 不需要设置高度约束 47.什么是适配? 适应、兼容各种不同的情况 系统适配:针对不同版本的操作系统进行适配 屏幕适配:针对不同大小的屏幕尺寸进行适配 48.点和像素的区别 在用户眼中,屏幕是由无数个像素组成的,像素越多,屏幕越清晰 在开发者眼中,屏幕是由无数个点组成的,点又是由像素组成的,一个点钟包含的像素越多,屏幕越清晰. 49.什么是Autolayout? Autolayout是一种“自动布局”技术,专门用来布局UI界面的 50.简单描述下Autolayout的2个核心概念约束和参照 约束:通过给控件添加约束,来决定控件的位置和尺寸 参照:在添加约束时,是依照谁来添加(可以是父控件或者兄弟控件) 51.Autolayout的警告和错误 警告:控件的frame不匹配所添加的约束 错误:1>缺乏必要的约束;2>两个约束冲突 52.通过代码添加约束的原则 对于两个同层级view之间的约束关系,添加到它们的父view上 对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上 对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上 53.什么是VFL VFL全称是Visual Format Language,翻译过来是“可视化格式语言” VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言 54.通过约束如何实现动画 在修改了约束之后,只要执行下面代码,就能做动画效果[UIView animateWithDuration:1.0 animations:^{ [添加了约束的view的父控件 layoutIfNeeded]; }]; 55.性能优化的具体实现 当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。 当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象. 56.UITableView如何展示数据? 设置数据源对象self.tableView.dataSource = self; 数据源对象要遵守协议 实现数据源方法// 多少组数据 (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // 每一组有多少行数据 (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // 每一行显示什么内容 (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 57.UITableView的有哪几种样式 UITableViewStylePlain UITableViewStyleGrouped 58.UITableViewController的认识 tableVieController有个tableView属性,指向一个tableView,而tableView的dataSource和delegate属性指向就是这个控制器.并且这个控制器已经遵守了UITableViewDataSource和UITableViewDelegate协议.而每个控制器的内部都有一个view属性,在tableVieController中,view和tableView属性指向的是同一个对象. 59.性能优化的思路 iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象 60.UITableView的性能优化的实现步骤/* 每当一个cell要进入视野范围就会调用这个方法 / (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ // 1.定义一个重用标识static NSString *ID = @”tim”; // 2.去缓存池取可循环利用的cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3.缓存池如果没有可循环利用的cell,自己创建if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];// 建议:所有cell都一样的设置,写在这个大括号中;所有cell不都一样的设置写在外面cell.backgroundColor = [UIColor redColor]; }// 4.设置数据cell.textLabel.text = [NSString stringWithFormat:@”第%zd行数据”,indexPath.row]; return cell;} 61.registerClass:的作用 根据一个ID注册这个ID标识对应的cell类型. 62.通过注册的方法如何实现cell的重用 NSString *ID = @”wine”; (void)viewDidLoad {[super viewDidLoad];// 注册ID 这个标识对应的cell类型为UITableViewCell[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];} (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath{// 1.先去缓存池中查找可循环利用的cellUITableViewCell cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 2.设置数据cell.textLabel.text = [NSString stringWithFormat:@”%zd行的数据”, indexPath.row]; return cell;} 63.如何监听tableView内部cell的点击事件 设置代理 代理对象遵守协议 实现协议里面的方法 64.简述registerNib:(nullable UINib )nib forCellReuseIdentifier:(NSString )identifier 和registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier 这2个方法的区别 registerClass这个方法是根据ID 注册对应的cell类型,系统创建cell的方式是通过alloc/initWithStyle… registerNib 这个方法是根据ID 注册一个xib文件,系统创建cell的方式是通过加载xib文件. 65.如何计算一段文字的宽度和高度? 第一种情况:如果label只有一行,通过sizeWithAttributes:这个方法,告知这段文字的字体和字体大小就可以计算这段文字的尺寸. 第二种情况:如果label需要换行计算高度,通过boundingRectWithSize: options: attributes:attributes context: 这个方法,告知这段文字的字体和字体大小,并且在一个限制的尺寸内计算这段文字的尺寸. 66.什么是自定义cell? 继承自系统的UITableViewCell写一个自己的cell 67.通过代码自定义cell能在ininWithFrame:方法中添加子控件吗? 不能,自定义cell 是在initWithStyle:reuseIdentifier:方法添加子控件 68.通过代码自定义cell能在initWithStyle:reuseIdentifier:方法中计算子控件的位置和尺寸吗? 不行,因为在这个方法,cell的尺寸可能还没有,而计算子控件的位置和尺寸需要相对于cell来计算.通过代码自定义cell是在layoutSubviews中计算的 69.通过代码自定义cell,frame和Autolayout2中的方式有什么区别? 这2种方法,只是子控件的位置和尺寸的确定方法不一样.frame是通过设置子控件的frame来确定;而Autolayout是通过添加约束的方式来确定 70.通过storyboard的方式是如何加载cell 首先根据ID去缓存池中取,如果缓存中没有,也没有注册,会自动去storyboard中找有没有ID这种标识的Cell,如果有,会加载这个cell,并且绑定这个标识返回 71.字典转模型第三方框架的了解 Mantle:所有模型都必须继承自MTModel JSONModel:所有模型都必须继承自JSONModel MJExtension:不需要强制继承任何其他类 72.设计框架需要考虑的问题 侵入性:侵入性大就意味着很难离开这个框架 易用性:比如少量代码实现N多功能 扩展性:很容易给这个框架增加新功能 [reply]PDF文件下载[/reply]]]></content>
</entry>
<entry>
<title><![CDATA[学习提升之HTTP状态码详解]]></title>
<url>%2F2016%2F11%2F14%2F99%2F</url>
<content type="text"><![CDATA[最近太忙了,不好意思,木有更新博客,所以今天抽空把这些天积累的知识都写下来与大家分享。这篇文章是我在学习网络部分的一些学习笔记,在这里分享给大家。之前看到状态码都是搜索下就完事,常用的也都记得,毕竟搭建博客等过程深入学习过这些。下面进入正题,在讲解状态码之前先了解下其他相关的知识,涉及的内容可能比较多,大家耐心看看,学习的过程就是如此,一个知识点发散思维。 先记录下iOS中发送HTTP请求的方案: > 苹果原生(自带)>>> 1.NSURLConnection:用法简单,最古老最经典最直接的一种方案【坑比较多】>>> 2.NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术【2013推出,iOS7开始出的技术】>>> 3.CFNetwork:NSURL*的底层,纯C语言>> 第三方框架>>> 1.ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新>>> 2.AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多>>> 3.MKNetworkKit:简单易用,产自三哥的故乡印度,维护和使用者少 了解1.URL1.1 什么是URL? URL的全称是Uniform Resource Locator(统一资源定位符) 通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL URL的基本格式 = 协议://主机地址/路径http://cdn.huangbowei.com/images/xcodepluginslogo.png http://21X.3X.45X.2X/images/xcodepluginslogo.png 协议:不同的协议,代表着不同的资源查找方式、资源传输方式 主机地址:存放资源的主机(服务器)的IP地址(域名) 路径:资源在主机(服务器)中的具体位置 2.URL中常见的协议2.1 HTTP超文本传输协议,访问的是远程的网络资源,格式是http:// http协议是在网络开发中最常用的协议 2.2 file访问的是本地计算机上的资源,格式是file://(不用加主机地址) 2.3 mailto访问的是电子邮件地址,格式是mailto: 2.4 FTP访问的是共享主机的文件资源,格式是ftp:// 3.TCP/IP协议簇 为了能够理解HTTP,我们需要先了解TCP/IP协议簇。通常意义上,我们使用的网络是在TCP/IP协议簇的基础上运作的,而HTTP属于它内部的一个子集。 计算机与网络设备需要通信,双方就必须要基于相同的方法,比如具体应该如何探测通信目标,由哪一方面发起通信,使用什么语言进行沟通等等,所有的这一切都需要规则。而我们则把这些规则称之为协议(potocol)。 在协议中规定了很多的各式各样的内容,如选址方法,双方建立通信的顺序等等。这些协议如(ICMP DNS TCP FTP HTTP SNMP PPPoE IP FDDI)等等,通常我们把TCP/IP认为是在IP协议的通信过程中,使用到的协议簇的统称。 TCP 协议簇里面最重要的一点就是分层设计:按照层次分别分为应用层、传输层、网络层和数据链路层。其中,与HTTP关系密切的协议有TCP、IP、DNS等。 4.TCP/IP参考模型 TCP/IP参考模型 5.HTTP协议简介5.1 不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议 访问Tim的博客主页:http://www.huangbowei.com 获得腾讯新闻的新闻数据 获得A站的视频数据 5.2 HTTP协议的作用 HTTP的全称是Hypertext Transfer Protocol,超文本传输协议 规定客户端和服务器之间的数据传输格式 让客户端和服务器能有效地进行数据沟通 6.HTTP协议的特点(为什么选择HTTP)6.1 简单快速因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快。 6.2 灵活HTTP允许传输各种各样的数据。 6.3 HTTP 0.9和1.0使用非持续连接限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间。 正题了解了一些基本知识后,下面开始聊聊HTTP协议里面的状态码: 1 何谓HTTP状态码HTTP状态码的作用是:Web服务器用来告诉客户端,发生了什么事。 状态码位于HTTP Response 的第一行中,会返回一个”三位数字的状态码“和一个“状态消息”。 ”三位数字的状态码“便于程序进行处理, “状态消息”更便于人理解。 2 状态码分类HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码。随着协议的发展,HTTP规范中会定义更多的状态码。 已定义范围分类1XX100-101信息提示2XX200-206成功3XX300-305重定向4XX400-415客户端错误5XX500-505服务器错误 3 常见的状态码一般常见的状态码已经够使用的,我之前弄博客的时候几乎每天都要见到,不是301就是501,幸运的就是200完美! 3.1 1XX 信息性状态码信息性状态码,表示接受的请求正在处理。 状态码 状态消息 含义100Continue(继续)收到了请求的起始部分,客户端应该继续请求101Switching Protocols(切换协议)服务器正根据客户端的指示将协议切换成Update Header列出的协议 3.2 2XX 成功状态码2xx 响应结果表示从客户端发来的请求在服务器端被正常处理了。 状态码状态消息含义200OK服务器成功处理了请求(这个是我们见到最多的)201Created(已创建)对于那些要服务器创建对象的请求来说,资源已创建完毕。202Accepted(已接受)请求已接受, 但服务器尚未处理203Non-Authoritative Information(非权威信息)服务器已将事务成功处理,只是实体Header包含的信息不是来自原始服务器,而是来自资源的副本。204No Content(没有内容)Response中包含一些Header和一个状态行, 但不包括实体的主题内容(没有response body)205Reset Content(重置内容) 另一个主要用于浏览器的代码。意思是浏览器应该重置当前页面上所有的HTML表单。206Partial Content(部分内容) 部分请求成功 3.3 3XX 重定向状态码3XX 响应结果表明浏览器需要执行某些特殊的处理以完成请求。重定向状态码用来告诉浏览器客户端,它们访问的资源已被移动, Web服务器发送一个重定向状态码和一个可选的Location Header, 告诉客户端新的资源地址在哪。之前改域名做SEO优化的时候经常会碰到301重定向。 状态码状态消息含义300Multiple Choices(多项选择) 客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了301Moved Permanently(永久移除)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置302Found(已找到)与状态码301类似。但这里的移除是临时的。 客户端会使用Location中给出的URL,重新发送新的HTTP request303 See Other(参见其他)类似302304Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存305 Use Proxy(使用代理)必须通过代理访问资源, 代理的地址在Response 的Location中306 未使用 这个状态码当前没使用307Temporary Redirect(临时重定向类似302 3.4 4XX客户端错误状态码有时客户端会发送一些服务器无法处理的东西,比如格式错误的Request, 或者最常见的是, 请求一个不存在的URL。 状态码状态消息含义400Bad Request(坏请求)告诉客户端,它发送了一个错误的请求。401Unauthorized(未授权)需要客户端对自己认证402Payment Required(要求付款)这个状态还没被使用, 保留给将来用403Forbidden(禁止)请求被服务器拒绝了404Not Found(未找到)未找到资源405Method Not Allowed(不允许使用的方法)不支持该Request的方法。406Not Acceptable(无法接受)407Proxy Authentication Required(要求进行代理认证)与状态码401类似, 用于需要进行认证的代理服务器408Request Timeout(请求超时) 如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接409Conflict(冲突)发出的请求在资源上造成了一些冲突410Gone(消失了)服务器曾经有这个资源,现在没有了, 与状态码404类似411Length Required(要求长度指示)服务器要求在Request中包含Content-Length。412Precondition Failed(先决条件失败)413Request Entity Too Large(请求实体太大)客户端发送的实体主体部分比服务器能够或者希望处理的要大414Request URI Too Long(请求URI太长)客户端发送的请求所携带的URL超过了服务器能够或者希望处理的长度415Unsupported Media Type(不支持的媒体类型)服务器无法理解或不支持客户端所发送的实体的内容类型416Requested Range Not Satisfiable(所请求的范围未得到满足)417Expectation Failed(无法满足期望) 3.5 5XX服务器错误状态码有时候客户端发送了一条有效Request, Web服务器自身却出错了。 可能是Web服务器运行出错了, 或者网站都挂了。 5XX就是用来描述服务器错误的。 状态码状态消息含义500Internal Server Error(内部服务器错误)服务器遇到一个错误,使其无法为请求提供服务501Not Implemented(未实现)客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码。502Bad Gateway(网关故障)代理使用的服务器遇到了上游的无效响应503Service Unavailable(未提供此服务)服务器目前无法为请求提供服务,但过一段时间就可以恢复服务504Gateway Timeout(网关超时)与状态吗408类似, 但是响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时505HTTP Version Not Supported(不支持的HTTP版本)服务器收到的请求使用了它不支持的HTTP协议版本。 有些服务器不支持HTTP早期的HTTP协议版本,也不支持太高的协议版本 #### 下面是表格里的状态码的一些详细说明,供强迫症患者食用 3.6 204 No Content(没有内容)该状态码表示服务器接收到的请求已经处理完毕,但是服务器不需要返回响应体.比如,客户端是浏览器的话,发出的请求返回204响应,那么浏览器显示的页面不会发生更新。 3.7 206 Partial Content(部分内容)该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。客户端发起的请求,必须在请求头中包含Range字段。服务端响应报文中,必须包含由Content-Range指定范围的实体内容(entity-bodies ) 3.8 301 Moved Permanently(永久移除)永久性重定向。该状态码表示请求的资源已经被分配了新的URI,并且以后使用资源现在所指的URI。并且根据请求的方法有不同的处理方式:HEAD:必须在响应头部Location字段中指明新的永久性的URI。GET:除了有Location字段以外,还需要在响应体中附上永久性URI的超链接文本。POST:客户端在发送POST请求,受到301响应之后,不应该自动跳转URI,应当让用户确认跳转。 比如访问: http://www.huangbowei.cn/ 或者http://iosdev.vip/ 请求会被重定向到: http://www.huangbowei.com/ 3.9 302 Found临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。和301 Moved Permanently 状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。如果,用户把一个URI收藏为书签,302响应是不会像301那样去更新书签。 3.10 303 See Other该状态码表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。303与302不同之处在于,302是不会改变请求的方法,如果请求方法是POST的话,重定向的请求也应该是POST。而对于303,使用POST请求的话,重定向的请求应该是GET请求。 3.11 304 Not Modified该状态码表示客户端发送附带条件请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主题部分。 3.12 307 Temporary Redirect临时重定向。该状态码与302和303的有着类似的含义,不同之处在于,307状态码并不会指定客户端要用什么样的请求方法请求重定向地址。(302指定使用原有请求方法,303指定使用GET方法) 3.13 400 Bad Request(坏请求)表示该请求报文中存在语法错误,导致服务器无法理解该请求。客户端需要修改请求的内容后再次发送请求。 3.14 401 Unauthorized(需要认证)该状态码表示发送的请求需要有通过HTTP认证(Basic认证,Digest认证)的认证信息。返回含有401的响应,必须在头部包含WWW-Authenticate以指明服务器需要哪种方式的认证。 3.15 403 Forbidden(禁止)该状态码表明对请求资源的访问被服务器拒绝了。服务器没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的主体部分原因进行描述,这样就能让用户看到了。未获得文件系统的访问权限,访问权限出现某些问题,从未授权的发送源IP地址试图访问等情况都可能发生403响应。 3.16 404 Not Found(无法找到指定的资源)该状态码表明服务器上无法找到指定的资源。通常被用于服务器不想透露拒绝请求的原因,或者没有其他的响应可提供。 3.17 405 Method Not Allowed(不允许使用的方法)405是指Web服务器不支持Request中的方法。 3.18 411 Length Required(要求长度指示)服务器要求在Request中包含Content-Length。当浏览器使用Post方法,发送数据给Web服务器时, 必须要有Content-Length。这样Web服务器才知道你要发送多少数据,否则Web服务器会返回411状态码 3.19 413 Request Entity Too Large(请求实体太大)作用:客户端发送的实体主体部分比服务器能够或者希望处理的要大。 一般情况下我们看不到这个状态码。 因为浏览器不会发送太大的数据给网站,但是机器人可能会。 3.20 414 Request URI Too Long(请求URL太长)就是说Request URI太长, 一般浏览器本身对URI的长度就会有限制,所以不会发送URI很长的Request. 我们平常是根本看不到414错误的。 但是机器人可以发送很长URI。 3.21 500 Internal Server Error(内部服务器错误)该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的BUG或某些临时的故障。弄博客的时候经常见,哈哈哈。 3.22 501 Not Implemented(未实现)客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码)。 一般的Web服务器只支持GET和POST方法。 3.23 502 Bad Gateway(网关故障)代理使用的服务器遇到了上游的无效响应。当我们访问www.youtube.com,就可以看到熟悉的502了。 3.24 503 Service Unavailable该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上需要的时间,最好写入Retry-After首部字段再返回给客户端。 3.25 505 HTTP Version Not Supported(不支持的HTTP版本)表示Web服务器不支持此HTTP协议的版本。 参考文章: HTTP协议之状态码详解 ]]></content>
</entry>
<entry>
<title><![CDATA[学习提升之HTTP状态码详解]]></title>
<url>%2F2016%2F11%2F14%2F99-1%2F</url>
<content type="text"><![CDATA[最近太忙了,不好意思,木有更新博客,所以今天抽空把这些天积累的知识都写下来与大家分享。这篇文章是我在学习网络部分的一些学习笔记,在这里分享给大家。之前看到状态码都是搜索下就完事,常用的也都记得,毕竟搭建博客等过程深入学习过这些。下面进入正题,在讲解状态码之前先了解下其他相关的知识,涉及的内容可能比较多,大家耐心看看,学习的过程就是如此,一个知识点发散思维。 先记录下iOS中发送HTTP请求的方案: > 苹果原生(自带)>>> 1.NSURLConnection:用法简单,最古老最经典最直接的一种方案【坑比较多】>>> 2.NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术【2013推出,iOS7开始出的技术】>>> 3.CFNetwork:NSURL*的底层,纯C语言>> 第三方框架>>> 1.ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新>>> 2.AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多>>> 3.MKNetworkKit:简单易用,产自三哥的故乡印度,维护和使用者少 了解1.URL1.1 什么是URL? URL的全称是Uniform Resource Locator(统一资源定位符) 通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL URL的基本格式 = 协议://主机地址/路径http://cdn.huangbowei.com/images/xcodepluginslogo.png http://21X.3X.45X.2X/images/xcodepluginslogo.png 协议:不同的协议,代表着不同的资源查找方式、资源传输方式 主机地址:存放资源的主机(服务器)的IP地址(域名) 路径:资源在主机(服务器)中的具体位置 2.URL中常见的协议2.1 HTTP超文本传输协议,访问的是远程的网络资源,格式是http:// http协议是在网络开发中最常用的协议 2.2 file访问的是本地计算机上的资源,格式是file://(不用加主机地址) 2.3 mailto访问的是电子邮件地址,格式是mailto: 2.4 FTP访问的是共享主机的文件资源,格式是ftp:// 3.TCP/IP协议簇 为了能够理解HTTP,我们需要先了解TCP/IP协议簇。通常意义上,我们使用的网络是在TCP/IP协议簇的基础上运作的,而HTTP属于它内部的一个子集。 计算机与网络设备需要通信,双方就必须要基于相同的方法,比如具体应该如何探测通信目标,由哪一方面发起通信,使用什么语言进行沟通等等,所有的这一切都需要规则。而我们则把这些规则称之为协议(potocol)。 在协议中规定了很多的各式各样的内容,如选址方法,双方建立通信的顺序等等。这些协议如(ICMP DNS TCP FTP HTTP SNMP PPPoE IP FDDI)等等,通常我们把TCP/IP认为是在IP协议的通信过程中,使用到的协议簇的统称。 TCP 协议簇里面最重要的一点就是分层设计:按照层次分别分为应用层、传输层、网络层和数据链路层。其中,与HTTP关系密切的协议有TCP、IP、DNS等。 4.TCP/IP参考模型 TCP/IP参考模型 5.HTTP协议简介5.1 不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议 访问Tim的博客主页:http://www.huangbowei.com 获得腾讯新闻的新闻数据 获得A站的视频数据 5.2 HTTP协议的作用 HTTP的全称是Hypertext Transfer Protocol,超文本传输协议 规定客户端和服务器之间的数据传输格式 让客户端和服务器能有效地进行数据沟通 6.HTTP协议的特点(为什么选择HTTP)6.1 简单快速因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快。 6.2 灵活HTTP允许传输各种各样的数据。 6.3 HTTP 0.9和1.0使用非持续连接限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间。 正题了解了一些基本知识后,下面开始聊聊HTTP协议里面的状态码: 1 何谓HTTP状态码HTTP状态码的作用是:Web服务器用来告诉客户端,发生了什么事。 状态码位于HTTP Response 的第一行中,会返回一个”三位数字的状态码“和一个“状态消息”。 ”三位数字的状态码“便于程序进行处理, “状态消息”更便于人理解。 2 状态码分类HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码。随着协议的发展,HTTP规范中会定义更多的状态码。 已定义范围分类1XX100-101信息提示2XX200-206成功3XX300-305重定向4XX400-415客户端错误5XX500-505服务器错误 3 常见的状态码一般常见的状态码已经够使用的,我之前弄博客的时候几乎每天都要见到,不是301就是501,幸运的就是200完美! 3.1 1XX 信息性状态码信息性状态码,表示接受的请求正在处理。 状态码 状态消息 含义100Continue(继续)收到了请求的起始部分,客户端应该继续请求101Switching Protocols(切换协议)服务器正根据客户端的指示将协议切换成Update Header列出的协议 3.2 2XX 成功状态码2xx 响应结果表示从客户端发来的请求在服务器端被正常处理了。 状态码状态消息含义200OK服务器成功处理了请求(这个是我们见到最多的)201Created(已创建)对于那些要服务器创建对象的请求来说,资源已创建完毕。202Accepted(已接受)请求已接受, 但服务器尚未处理203Non-Authoritative Information(非权威信息)服务器已将事务成功处理,只是实体Header包含的信息不是来自原始服务器,而是来自资源的副本。204No Content(没有内容)Response中包含一些Header和一个状态行, 但不包括实体的主题内容(没有response body)205Reset Content(重置内容) 另一个主要用于浏览器的代码。意思是浏览器应该重置当前页面上所有的HTML表单。206Partial Content(部分内容) 部分请求成功 3.3 3XX 重定向状态码3XX 响应结果表明浏览器需要执行某些特殊的处理以完成请求。重定向状态码用来告诉浏览器客户端,它们访问的资源已被移动, Web服务器发送一个重定向状态码和一个可选的Location Header, 告诉客户端新的资源地址在哪。之前改域名做SEO优化的时候经常会碰到301重定向。 状态码状态消息含义300Multiple Choices(多项选择) 客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了301Moved Permanently(永久移除)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置302Found(已找到)与状态码301类似。但这里的移除是临时的。 客户端会使用Location中给出的URL,重新发送新的HTTP request303 See Other(参见其他)类似302304Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存305 Use Proxy(使用代理)必须通过代理访问资源, 代理的地址在Response 的Location中306 未使用 这个状态码当前没使用307Temporary Redirect(临时重定向类似302 3.4 4XX客户端错误状态码有时客户端会发送一些服务器无法处理的东西,比如格式错误的Request, 或者最常见的是, 请求一个不存在的URL。 状态码状态消息含义400Bad Request(坏请求)告诉客户端,它发送了一个错误的请求。401Unauthorized(未授权)需要客户端对自己认证402Payment Required(要求付款)这个状态还没被使用, 保留给将来用403Forbidden(禁止)请求被服务器拒绝了404Not Found(未找到)未找到资源405Method Not Allowed(不允许使用的方法)不支持该Request的方法。406Not Acceptable(无法接受)407Proxy Authentication Required(要求进行代理认证)与状态码401类似, 用于需要进行认证的代理服务器408Request Timeout(请求超时) 如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接409Conflict(冲突)发出的请求在资源上造成了一些冲突410Gone(消失了)服务器曾经有这个资源,现在没有了, 与状态码404类似411Length Required(要求长度指示)服务器要求在Request中包含Content-Length。412Precondition Failed(先决条件失败)413Request Entity Too Large(请求实体太大)客户端发送的实体主体部分比服务器能够或者希望处理的要大414Request URI Too Long(请求URI太长)客户端发送的请求所携带的URL超过了服务器能够或者希望处理的长度415Unsupported Media Type(不支持的媒体类型)服务器无法理解或不支持客户端所发送的实体的内容类型416Requested Range Not Satisfiable(所请求的范围未得到满足)417Expectation Failed(无法满足期望) 3.5 5XX服务器错误状态码有时候客户端发送了一条有效Request, Web服务器自身却出错了。 可能是Web服务器运行出错了, 或者网站都挂了。 5XX就是用来描述服务器错误的。 状态码状态消息含义500Internal Server Error(内部服务器错误)服务器遇到一个错误,使其无法为请求提供服务501Not Implemented(未实现)客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码。502Bad Gateway(网关故障)代理使用的服务器遇到了上游的无效响应503Service Unavailable(未提供此服务)服务器目前无法为请求提供服务,但过一段时间就可以恢复服务504Gateway Timeout(网关超时)与状态吗408类似, 但是响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时505HTTP Version Not Supported(不支持的HTTP版本)服务器收到的请求使用了它不支持的HTTP协议版本。 有些服务器不支持HTTP早期的HTTP协议版本,也不支持太高的协议版本 #### 下面是表格里的状态码的一些详细说明,供强迫症患者食用 3.6 204 No Content(没有内容)该状态码表示服务器接收到的请求已经处理完毕,但是服务器不需要返回响应体.比如,客户端是浏览器的话,发出的请求返回204响应,那么浏览器显示的页面不会发生更新。 3.7 206 Partial Content(部分内容)该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。客户端发起的请求,必须在请求头中包含Range字段。服务端响应报文中,必须包含由Content-Range指定范围的实体内容(entity-bodies ) 3.8 301 Moved Permanently(永久移除)永久性重定向。该状态码表示请求的资源已经被分配了新的URI,并且以后使用资源现在所指的URI。并且根据请求的方法有不同的处理方式:HEAD:必须在响应头部Location字段中指明新的永久性的URI。GET:除了有Location字段以外,还需要在响应体中附上永久性URI的超链接文本。POST:客户端在发送POST请求,受到301响应之后,不应该自动跳转URI,应当让用户确认跳转。 比如访问: http://www.huangbowei.cn/ 或者http://iosdev.vip/ 请求会被重定向到: http://www.huangbowei.com/ 3.9 302 Found临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。和301 Moved Permanently 状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。如果,用户把一个URI收藏为书签,302响应是不会像301那样去更新书签。 3.10 303 See Other该状态码表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。303与302不同之处在于,302是不会改变请求的方法,如果请求方法是POST的话,重定向的请求也应该是POST。而对于303,使用POST请求的话,重定向的请求应该是GET请求。 3.11 304 Not Modified该状态码表示客户端发送附带条件请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主题部分。 3.12 307 Temporary Redirect临时重定向。该状态码与302和303的有着类似的含义,不同之处在于,307状态码并不会指定客户端要用什么样的请求方法请求重定向地址。(302指定使用原有请求方法,303指定使用GET方法) 3.13 400 Bad Request(坏请求)表示该请求报文中存在语法错误,导致服务器无法理解该请求。客户端需要修改请求的内容后再次发送请求。 3.14 401 Unauthorized(需要认证)该状态码表示发送的请求需要有通过HTTP认证(Basic认证,Digest认证)的认证信息。返回含有401的响应,必须在头部包含WWW-Authenticate以指明服务器需要哪种方式的认证。 3.15 403 Forbidden(禁止)该状态码表明对请求资源的访问被服务器拒绝了。服务器没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的主体部分原因进行描述,这样就能让用户看到了。未获得文件系统的访问权限,访问权限出现某些问题,从未授权的发送源IP地址试图访问等情况都可能发生403响应。 3.16 404 Not Found(无法找到指定的资源)该状态码表明服务器上无法找到指定的资源。通常被用于服务器不想透露拒绝请求的原因,或者没有其他的响应可提供。 3.17 405 Method Not Allowed(不允许使用的方法)405是指Web服务器不支持Request中的方法。 3.18 411 Length Required(要求长度指示)服务器要求在Request中包含Content-Length。当浏览器使用Post方法,发送数据给Web服务器时, 必须要有Content-Length。这样Web服务器才知道你要发送多少数据,否则Web服务器会返回411状态码 3.19 413 Request Entity Too Large(请求实体太大)作用:客户端发送的实体主体部分比服务器能够或者希望处理的要大。 一般情况下我们看不到这个状态码。 因为浏览器不会发送太大的数据给网站,但是机器人可能会。 3.20 414 Request URI Too Long(请求URL太长)就是说Request URI太长, 一般浏览器本身对URI的长度就会有限制,所以不会发送URI很长的Request. 我们平常是根本看不到414错误的。 但是机器人可以发送很长URI。 3.21 500 Internal Server Error(内部服务器错误)该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的BUG或某些临时的故障。弄博客的时候经常见,哈哈哈。 3.22 501 Not Implemented(未实现)客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码)。 一般的Web服务器只支持GET和POST方法。 3.23 502 Bad Gateway(网关故障)代理使用的服务器遇到了上游的无效响应。当我们访问www.youtube.com,就可以看到熟悉的502了。 3.24 503 Service Unavailable该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上需要的时间,最好写入Retry-After首部字段再返回给客户端。 3.25 505 HTTP Version Not Supported(不支持的HTTP版本)表示Web服务器不支持此HTTP协议的版本。 参考文章: HTTP协议之状态码详解 ]]></content>
</entry>
<entry>
<title><![CDATA[Mac开发必备软件-SimPholders]]></title>
<url>%2F2016%2F10%2F24%2F98%2F</url>
<content type="text"><![CDATA[趁着1024程序猿的节日,今天抽出一点时间来小码哥论坛分享一些好东西,分享一些比较好的软件,方便广大程序猿(媛)提高开发效率。所谓的1024大家不要想歪啦,其实是下面的意思: 1024是2的十次方,二进制计数的基本计量单位之一。程序员(英文Programmer)是从事程序开发、 维护的专业人员。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1GB=1024M,而1GB与1级谐音,也有一级棒 的意思。从2014年起,每年10月24日定义为程序员节。以一个节日的形式,向通过coding改变世界,也以实际行动在浮躁的世界里,固执地坚持自己 对于知识、技术和创新追求的程序员们表示致敬。 话不多说,下面进入主题介绍一个Mac开发人员用的软件SimPholders。它是一款 Mac上开发ios的辅助工具,能够在菜单栏里面快速的访问iphone simulator中的应用的文件夹,从而帮助开发人员进行软件开发,还可以在模拟器中直接运行软件,清除缓存,删除应 用,从而节省开发人员的很多时间,同时还可以离线使用,使用起来非常的方便简单,很实用。 下面是一些应用截图以及下载地址: 下载地址: [button]点击下载[/button]]]></content>
</entry>
<entry>
<title><![CDATA[Mac开发必备软件-SimPholders]]></title>
<url>%2F2016%2F10%2F24%2F98-1%2F</url>
<content type="text"><![CDATA[趁着1024程序猿的节日,今天抽出一点时间来小码哥论坛分享一些好东西,分享一些比较好的软件,方便广大程序猿(媛)提高开发效率。所谓的1024大家不要想歪啦,其实是下面的意思: 1024是2的十次方,二进制计数的基本计量单位之一。程序员(英文Programmer)是从事程序开发、 维护的专业人员。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1GB=1024M,而1GB与1级谐音,也有一级棒 的意思。从2014年起,每年10月24日定义为程序员节。以一个节日的形式,向通过coding改变世界,也以实际行动在浮躁的世界里,固执地坚持自己 对于知识、技术和创新追求的程序员们表示致敬。 话不多说,下面进入主题介绍一个Mac开发人员用的软件SimPholders。它是一款 Mac上开发ios的辅助工具,能够在菜单栏里面快速的访问iphone simulator中的应用的文件夹,从而帮助开发人员进行软件开发,还可以在模拟器中直接运行软件,清除缓存,删除应 用,从而节省开发人员的很多时间,同时还可以离线使用,使用起来非常的方便简单,很实用。 下面是一些应用截图以及下载地址: 下载地址: [button]点击下载[/button]]]></content>
</entry>
<entry>
<title><![CDATA[个人搭建博客中一些100%碰到的问题(附详细解决办法)]]></title>
<url>%2F2016%2F09%2F21%2F97%2F</url>
<content type="text"><![CDATA[鉴于许多人在这个途中碰到过问题,而且有一些问题是100%碰见,许多同学都问过我,每次回答大家效率也不高,耽误大家时间,所以这里我总结一下分享给大家,方便大家查阅,少走弯路: dnspod上购买的.com域名正常价格是49每年,是49元/年,不需要其他任何附加费用。 购买域名的时候填写基本信息最好填真实信息,比较私密的信息可以模糊填写。 购买域名以后需要进行实名认证。有一些同学购买后,搭建博客5、6天后就不能访问,然后跑过来问我,经过问题排查,才发现是这个问题,后面又有几个同学有相同的问题,经过排查,都是这个原因。 域名实名认证需要填写身份证号和上传身份证照片正反面。这个照片上传要注意,它只能上传一张照片,而且没说要正反面,要求只说照片大小要求。这时候许多同学要不就只上传一张照片,因为只能上传一张照片,然后审核就一直不能通过,网站也就不能访问。 身份证正反面合成技巧。不需要PS,不需要任何第三方软件。把拍好的正反面照片上传到电脑,双击打开两张图片,摆好位置,一张上面一张下面,中间不留缝隙,然后是关键步骤:打开截图软件,截图一下,这样一张正反面照片就搞定,简单方便。 暂时就这么多,如果有的话还会添加,最后,祝福大家中秋快乐,多多吃月饼、蜜柚,晚上赏月幸福哒,虽然远在它乡求学,但是我的心依旧思念着家乡的亲人们呀!!]]></content>
</entry>
<entry>
<title><![CDATA[个人搭建博客中一些100%碰到的问题(附详细解决办法)]]></title>
<url>%2F2016%2F09%2F21%2F97-1%2F</url>
<content type="text"><![CDATA[鉴于许多人在这个途中碰到过问题,而且有一些问题是100%碰见,许多同学都问过我,每次回答大家效率也不高,耽误大家时间,所以这里我总结一下分享给大家,方便大家查阅,少走弯路: dnspod上购买的.com域名正常价格是49每年,是49元/年,不需要其他任何附加费用。 购买域名的时候填写基本信息最好填真实信息,比较私密的信息可以模糊填写。 购买域名以后需要进行实名认证。有一些同学购买后,搭建博客5、6天后就不能访问,然后跑过来问我,经过问题排查,才发现是这个问题,后面又有几个同学有相同的问题,经过排查,都是这个原因。 域名实名认证需要填写身份证号和上传身份证照片正反面。这个照片上传要注意,它只能上传一张照片,而且没说要正反面,要求只说照片大小要求。这时候许多同学要不就只上传一张照片,因为只能上传一张照片,然后审核就一直不能通过,网站也就不能访问。 身份证正反面合成技巧。不需要PS,不需要任何第三方软件。把拍好的正反面照片上传到电脑,双击打开两张图片,摆好位置,一张上面一张下面,中间不留缝隙,然后是关键步骤:打开截图软件,截图一下,这样一张正反面照片就搞定,简单方便。 暂时就这么多,如果有的话还会添加,最后,祝福大家中秋快乐,多多吃月饼、蜜柚,晚上赏月幸福哒,虽然远在它乡求学,但是我的心依旧思念着家乡的亲人们呀!!]]></content>
</entry>
<entry>
<title><![CDATA[Apple发布会有感总结]]></title>
<url>%2F2016%2F09%2F08%2F96-1%2F</url>
<content type="text"><![CDATA[北京时间9月8号凌晨1点,一年一度的重头戏上映,先说下这次发布会的大致情况: iPhone7/iPhone Plus发布,iPhone7配置为:4.7寸(iPhone7 Plus为5.5寸),四核A10处理器+M10协处理器,内存的话和往年一样并木有公布,等待拆机砖家拆机验证,我感觉是2GG的运行内存,内存容量则 是32G/128G/256G,惊呆,虽然之前一直有爆料,然而我在想256G这是要存多少小电影。700万的前置摄像头+1200万光学防抖的后置摄像 头(iPhone7Plus为1200万广角及长焦双摄像头+光学防抖 ),价格方面还是很良心的,5388/6188/6988(iPhone7Plus为6388/7188/7988),按常理应该是5288起步的,不过 这次是32G起步的内存容量,加价100也不贵吧。颜色方面新增加亮黑色,也就是钢琴黑吧,比较符合我的口味。取消3.5mm借口的耳机孔!增加上下立体 声扬声器个人认为亮点如下:1.iPhone 7Plus增加后置双摄像头,一个为广角镜头,一个为远焦镜头,d都是1200万像素,4个闪光灯,支持光学防抖,可怕!2.取消几十年历史传统的 3.5mm耳机接口,改为全新的Lightning接口,智能手机播放看来又将迎来新的春天,还好目前适配Lightning接口的厂商还是有的,比如 JBL,毕竟苹果的号召力你懂的,7和7Plus会赠送一段Lightning转3.5mm耳机接口线材;3.Home更改为支持Force Touch的home键;4.首次支持IP67级防水防尘,内部结构重新设计. iOS10.又是熟悉的套路,按照惯例,发布会结束后, 果然推送iOS 10 GM开发者预览版,和大家科普下GM版本的含义:Golden Master 意味着 Apple 已经完成该操作系统的设计、开发工作,随时可能上市销售,无限接近正式版.更新后版本号升级至iOS10.0.1,更新包大小约为1.96GB.更新内容 如下: “信息”使您可以用全新方式表达自己,现在,在对话中即可访问心仪的应用。 App Store 中的部分应用现在可以通过 Siri 来发送信息、拨打电话,甚至进行更多操作。 “地图”旧貌换新颜,全新扩展使您可以预订餐厅、叫车出行。 全新的“照片”提供了智能搜索,使找人、找地点等更加方便,还提供了优美的新途径供您回味记忆中的场景。 “家庭”是一款新应用,它允许您集中一处,简便、安全地管理家支持自动化的产品。 Apple Music 经过全新设计,给您带来更清晰简便的全方位体验。 全新设计的 Apple News 添加了粗体排版,颜色更鲜明,栏目更清楚,使查找特定主题的报道更容易。 重新设计的锁定屏幕和深度整合的 3D Touch 功能,使您访问所需信息更加简迅速。 QuickType 键盘增加了新的表情符号、多语言输入,并利用深度神经网络技术提供上下文预测。 根据“邮件”中找到的信息,将建议的事件和联系人详细信息添加到应用中。 Apple Watch Series 2.第二代Apple Watch相比第一代处理器更换为全新的S2双核处理器,性能比上一代提升50%,屏幕亮度也提升2倍,使得在户外能够更加轻易看清楚屏幕;更加强大的防 水功能,内置GPS,价格2188起步,白色精密陶瓷款38mm和42mm价格感人,9588和9988RMB。 WatchOS 3.历经多个Beta版本的测试,正式版终于亮相。主要更新如下:1.更快的应用启动速度/控制中心;2.全新的表盘;3,Activity Sharing(运动分享);4.新的呼吸应用;5.健身应用的优化;6.新的健身指标;7.更加实用的短信服务;8.Home应用的支持,也就是家庭健 康了,苹果这几年一直在推的,智能家居;8.能够发送SOS求救信号.然而我还是喜欢用我的ticwatch2,更加的本土化,更加符合我这种极客的口 味。 这次并没有观看直播,换作以前,那是必须的看的呀,然而新的作息时间表,新的生活方式下,我选择保持我的生活习惯,放弃这种不健康的生活习惯,每天6点早起可以让我会更好的规划今天一天将要做的事情,可以定下今日目标、晨跑等。]]></content>
</entry>
<entry>
<title><![CDATA[Apple发布会有感总结]]></title>
<url>%2F2016%2F09%2F08%2F96%2F</url>
<content type="text"><![CDATA[北京时间9月8号凌晨1点,一年一度的重头戏上映,先说下这次发布会的大致情况: iPhone7/iPhone Plus发布,iPhone7配置为:4.7寸(iPhone7 Plus为5.5寸),四核A10处理器+M10协处理器,内存的话和往年一样并木有公布,等待拆机砖家拆机验证,我感觉是2GG的运行内存,内存容量则 是32G/128G/256G,惊呆,虽然之前一直有爆料,然而我在想256G这是要存多少小电影。700万的前置摄像头+1200万光学防抖的后置摄像 头(iPhone7Plus为1200万广角及长焦双摄像头+光学防抖 ),价格方面还是很良心的,5388/6188/6988(iPhone7Plus为6388/7188/7988),按常理应该是5288起步的,不过 这次是32G起步的内存容量,加价100也不贵吧。颜色方面新增加亮黑色,也就是钢琴黑吧,比较符合我的口味。取消3.5mm借口的耳机孔!增加上下立体 声扬声器个人认为亮点如下:1.iPhone 7Plus增加后置双摄像头,一个为广角镜头,一个为远焦镜头,d都是1200万像素,4个闪光灯,支持光学防抖,可怕!2.取消几十年历史传统的 3.5mm耳机接口,改为全新的Lightning接口,智能手机播放看来又将迎来新的春天,还好目前适配Lightning接口的厂商还是有的,比如 JBL,毕竟苹果的号召力你懂的,7和7Plus会赠送一段Lightning转3.5mm耳机接口线材;3.Home更改为支持Force Touch的home键;4.首次支持IP67级防水防尘,内部结构重新设计. iOS10.又是熟悉的套路,按照惯例,发布会结束后, 果然推送iOS 10 GM开发者预览版,和大家科普下GM版本的含义:Golden Master 意味着 Apple 已经完成该操作系统的设计、开发工作,随时可能上市销售,无限接近正式版.更新后版本号升级至iOS10.0.1,更新包大小约为1.96GB.更新内容 如下: “信息”使您可以用全新方式表达自己,现在,在对话中即可访问心仪的应用。 App Store 中的部分应用现在可以通过 Siri 来发送信息、拨打电话,甚至进行更多操作。 “地图”旧貌换新颜,全新扩展使您可以预订餐厅、叫车出行。 全新的“照片”提供了智能搜索,使找人、找地点等更加方便,还提供了优美的新途径供您回味记忆中的场景。 “家庭”是一款新应用,它允许您集中一处,简便、安全地管理家支持自动化的产品。 Apple Music 经过全新设计,给您带来更清晰简便的全方位体验。 全新设计的 Apple News 添加了粗体排版,颜色更鲜明,栏目更清楚,使查找特定主题的报道更容易。 重新设计的锁定屏幕和深度整合的 3D Touch 功能,使您访问所需信息更加简迅速。 QuickType 键盘增加了新的表情符号、多语言输入,并利用深度神经网络技术提供上下文预测。 根据“邮件”中找到的信息,将建议的事件和联系人详细信息添加到应用中。 Apple Watch Series 2.第二代Apple Watch相比第一代处理器更换为全新的S2双核处理器,性能比上一代提升50%,屏幕亮度也提升2倍,使得在户外能够更加轻易看清楚屏幕;更加强大的防 水功能,内置GPS,价格2188起步,白色精密陶瓷款38mm和42mm价格感人,9588和9988RMB。 WatchOS 3.历经多个Beta版本的测试,正式版终于亮相。主要更新如下:1.更快的应用启动速度/控制中心;2.全新的表盘;3,Activity Sharing(运动分享);4.新的呼吸应用;5.健身应用的优化;6.新的健身指标;7.更加实用的短信服务;8.Home应用的支持,也就是家庭健 康了,苹果这几年一直在推的,智能家居;8.能够发送SOS求救信号.然而我还是喜欢用我的ticwatch2,更加的本土化,更加符合我这种极客的口 味。 这次并没有观看直播,换作以前,那是必须的看的呀,然而新的作息时间表,新的生活方式下,我选择保持我的生活习惯,放弃这种不健康的生活习惯,每天6点早起可以让我会更好的规划今天一天将要做的事情,可以定下今日目标、晨跑等。]]></content>
</entry>
<entry>
<title><![CDATA[教你快速提取iOS App中的图片素材]]></title>
<url>%2F2016%2F08%2F29%2F95%2F</url>
<content type="text"><![CDATA[平时玩手机,看到iOS app中许多不错的图片素材的时候,有木有很心动,是不是想把其中的图片资源导出来使用,即可以练手,又可以提高自己的审美观0-0,增加app的颜值。当然,请不要作为商业用途。开发软件不易,盗版容易,同为程序猿大家不能互相伤害呀。当做技术研究就好,不要干坏事哟。 1.软件下载下面介绍一个Mac端的软件,很方便的就可以导出iTunes中下载的ipa中的图片素材。我还是在Github上偶然发现的这个项目的,作者乃福建厦门人是也。 送上Github地址:iOS-Images-Extractor,由于Github网速可能不太好,贴上我搬运过来的资源: 软件源码:点击下载 Mac下DMG格式安装包: [reply][file][/reply] 2.软件使用2.1 下载app安装包打开iTunes 2.2 利用工具获取图片资源打开下载好的iosimagesextractor软件 ### 3.大功告成到此为止,图片素材已经全部提取出来,其实还有一些方法:1.把ipa包下载好后,把后缀改为zip,解压后,可以看到Assets.car文件,不过据我亲测,有的app没有这个文件;2,利用iTools下载好ipa安装包,后面步骤大致相同。不过以目前为止,最好的办法还是iTunes加iosimagesextractor这个工具,不用那么麻烦。教程到此结束,如果大家还有什么不懂得,欢迎大家提出来。]]></content>
</entry>
<entry>
<title><![CDATA[教你快速提取iOS App中的图片素材]]></title>
<url>%2F2016%2F08%2F29%2F95-1%2F</url>
<content type="text"><![CDATA[平时玩手机,看到iOS app中许多不错的图片素材的时候,有木有很心动,是不是想把其中的图片资源导出来使用,即可以练手,又可以提高自己的审美观0-0,增加app的颜值。当然,请不要作为商业用途。开发软件不易,盗版容易,同为程序猿大家不能互相伤害呀。当做技术研究就好,不要干坏事哟。 1.软件下载下面介绍一个Mac端的软件,很方便的就可以导出iTunes中下载的ipa中的图片素材。我还是在Github上偶然发现的这个项目的,作者乃福建厦门人是也。 送上Github地址:iOS-Images-Extractor,由于Github网速可能不太好,贴上我搬运过来的资源: 软件源码:点击下载 Mac下DMG格式安装包: [reply][file][/reply] 2.软件使用2.1 下载app安装包打开iTunes 2.2 利用工具获取图片资源打开下载好的iosimagesextractor软件 ### 3.大功告成到此为止,图片素材已经全部提取出来,其实还有一些方法:1.把ipa包下载好后,把后缀改为zip,解压后,可以看到Assets.car文件,不过据我亲测,有的app没有这个文件;2,利用iTools下载好ipa安装包,后面步骤大致相同。不过以目前为止,最好的办法还是iTunes加iosimagesextractor这个工具,不用那么麻烦。教程到此结束,如果大家还有什么不懂得,欢迎大家提出来。]]></content>
</entry>
<entry>
<title><![CDATA[Xcode神器-Alcatraz]]></title>
<url>%2F2016%2F08%2F13%2F94-1%2F</url>
<content type="text"><![CDATA[Alcatraz,Xcode上的神器!一个插件管理器。不知道什么时候,突然发现了它,省去自己找插件,安装插件等繁琐的步骤,相当不错,简直神兵利器。程序猿给Xcode装上一些插件后,撸代码效率更高,而且更加享受撸代码的过程,开发起iOS程序不要不要的。下面介绍一下安装方法以及一些推荐的插件: 相关地址官网地址:http://alcatraz.io Github地址:https://github.com/alcatraz/Alcatraz 本地下载地址:[reply][file][/reply] 安装方法这个插件安装起来也是挺人性化的。 下载好压缩包后,解压,在Xcode中打开,编译,然后重启Xcode即可。 如果没有安装Command Line Tools,打开终端,输入xcode-select –install 就会安装好Command Line Tools(注意:Alcatraz只支持Xcode7以上的版本安装使用)。 使用方法 安装完毕后,打开Xcode在顶部菜单栏Window->Package Manager 打开,或者快捷键command+shift+9.安装插件直接点击你想要安装插件的左边的INSTALL,卸载的话就是REMOVE,然后重启,会弹出一个对话框,选择Load Bundle 就OK。 我的插件在时间的历练后,最后留下一些比较好的插件分享给大家,希望大家也可以分享自己觉得还不错的插件,大家一起探讨。 ActivatePowerMode这款插件让你打代码成为一种享受,让你撸代码停不下来,自带机械键盘音效烟花效果等,可以根据个人喜好自行开关各种效果。支持Xcode6和Xcode7。 Xcode顶部菜单 Plugins->ActivatePowerMode Enable 总开关 Enable Spark 开关烟花效果 Enable Shake 开关抖动效果 Enable Sound 开关音效 AdjustFontSize在Xcode中调节字体比较麻烦,还要进preferences中的Fonts&Colors调节,安装这个插件后,只需要按 <span class="lang:default decode:true crayon-inline ">Control - 和 Control +</span> 就可以直接字体调节大小。不支持Xcode8. Backlight高亮目前正在编辑的代码行,打代码的时候,有时候不能快速到光标,比较影响效率,这个完美解决,在iTerm中用过这个功能,特地找的这个插件。 FuzzyAutocomplete加强Xcode的代码自动补全,老牌插件,非常强大,支持Xcode5+。 VVDocumenter在要文档的代码上面连续打上的斜杠,就会自动提取参数生成规范的注释。(支持Xcode5、6、7) ]]></content>
</entry>
<entry>
<title><![CDATA[Xcode神器-Alcatraz]]></title>
<url>%2F2016%2F08%2F13%2F94%2F</url>
<content type="text"><![CDATA[Alcatraz,Xcode上的神器!一个插件管理器。不知道什么时候,突然发现了它,省去自己找插件,安装插件等繁琐的步骤,相当不错,简直神兵利器。程序猿给Xcode装上一些插件后,撸代码效率更高,而且更加享受撸代码的过程,开发起iOS程序不要不要的。下面介绍一下安装方法以及一些推荐的插件: 相关地址官网地址:http://alcatraz.io Github地址:https://github.com/alcatraz/Alcatraz 本地下载地址:[reply][file][/reply] 安装方法这个插件安装起来也是挺人性化的。 下载好压缩包后,解压,在Xcode中打开,编译,然后重启Xcode即可。 如果没有安装Command Line Tools,打开终端,输入xcode-select –install 就会安装好Command Line Tools(注意:Alcatraz只支持Xcode7以上的版本安装使用)。 使用方法 安装完毕后,打开Xcode在顶部菜单栏Window->Package Manager 打开,或者快捷键command+shift+9.安装插件直接点击你想要安装插件的左边的INSTALL,卸载的话就是REMOVE,然后重启,会弹出一个对话框,选择Load Bundle 就OK。 我的插件在时间的历练后,最后留下一些比较好的插件分享给大家,希望大家也可以分享自己觉得还不错的插件,大家一起探讨。 ActivatePowerMode这款插件让你打代码成为一种享受,让你撸代码停不下来,自带机械键盘音效烟花效果等,可以根据个人喜好自行开关各种效果。支持Xcode6和Xcode7。 Xcode顶部菜单 Plugins->ActivatePowerMode Enable 总开关 Enable Spark 开关烟花效果 Enable Shake 开关抖动效果 Enable Sound 开关音效 AdjustFontSize在Xcode中调节字体比较麻烦,还要进preferences中的Fonts&Colors调节,安装这个插件后,只需要按 <span class="lang:default decode:true crayon-inline ">Control - 和 Control +</span> 就可以直接字体调节大小。不支持Xcode8. Backlight高亮目前正在编辑的代码行,打代码的时候,有时候不能快速到光标,比较影响效率,这个完美解决,在iTerm中用过这个功能,特地找的这个插件。 FuzzyAutocomplete加强Xcode的代码自动补全,老牌插件,非常强大,支持Xcode5+。 VVDocumenter在要文档的代码上面连续打上的斜杠,就会自动提取参数生成规范的注释。(支持Xcode5、6、7) ]]></content>
</entry>
<entry>
<title><![CDATA[Mac必备软件(3)-程序猿从入门到日常]]></title>
<url>%2F2016%2F07%2F31%2F93%2F</url>
<content type="text"><![CDATA[个人喜欢收集一些软件,特别是好软件、新软件,手机上一直都是100+个软件,多多尝试软件,顺便收集灵感。从Windows转Mac或者刚开始使 用 Mac的同学或多或少都为找不到替代软件而烦恼,Mac上的软件不如Windows上大众,方便下载,这里特地分享给大家,希望能帮助到大家。 Mac必备软件(1)-CleanMyMac Mac必备软件(2)-浏览器(Chrome长期更新) 持续更新中… 随着使用mac时间的增长,软件越下越多,装了删,删了下,最后留下来的必定是精品,这次我就把我自己mac的精品软件分享给大家。 先给大家看下我电脑上的软件: 先给出软件介绍,所有软件下载地址稍后放出,博主苦逼考试学习,挤出时间继续更新。 Alfred 3Alfred 这是一款被称之为Mac效率神器的App,有了它你甚至无需鼠标就可以实现各种操作,包括出发各种文件、网络操作,其UI界面使用方便,而且不是通过命令来实现,是开发者们和键盘童鞋们的神器。Mac 平台上最为传奇的效率作品,誉为神兵利器毫不为过。完全可以替代OS X自带的Spotlight,功能非常强大,屡获殊荣。可以我用的不多,没研究这个,不过确实强大。 欧路词典Mac下优秀的词典工具,支持苹果系统直接屏幕取词。还有划词搜索,生词本,翻译朗读,词库扩展等等功能。App Store有免费版本和付费版本,区别不太大。 Mou一款Mac下的Markdown工具,平时用来做笔记,之前用Typecho搭建博客的时候天天用Markdown写文章,所以觉得还不错。 GitBook也是用来阅读Markdown文本的,毕竟Github上有许多书要用这个来看。 网易云音乐这个没话说,网易云音乐刚出来的时候就在手机上下载过,算是老用户,Mac下的做的还算良心,不比酷狗,万年不更新,还不能下载音乐。 BBEditBBEdit 是一款著名代码编辑器。适用于Mac OS平台版本, 用于编辑HTML文件, 文本文件及程序源代码,相当于Windows下的Editplus、notepad++,万能的编辑文本软件。 CheatSheet让快捷键一目了然,安装后长按command会出现当前软件的所有快捷键,非常方便。 GestimerGestimer 是一款简单方便的提醒创建小工具,虽然 Mac OS X 预装了提醒事项应用,但想要创建提醒事件时必须首先输入事件的名称,然后选择在某个特定的时间或地点提醒自己,比较麻烦。Gestimer 提供的事件创建功能更直观,可以快速流畅的创建提醒事项,当然,软件也有一定的局限性,比如创建的提醒事项不能相隔太久。等于一个提醒事项,只不过做的很有文艺气息,也很好玩,从顶部往下拉,拉得越长,倒计时越久。 HazeOverHazeOver 是 Mac OS X 上的一款小工具,它可以在激活的窗口区域以外显示阴影,这可以让你很方便聚焦在当前的任务上,再也不用担心所有窗口叠在一起了,等于高亮当前窗口,尽量不分散你的注意力。一个比较有创意的软件。 iThoughtsXiThoughtsX 是一款适用于 Mac 的思维导图应用程序。 此应用程序基于 iOS iThoughts 并与其完全兼容。思维导图可助您直观组织想法、主意和信息。 XMindXMind是一款实用的思维导图软件,简单易用、美观、功能强大,拥有高效的可视化思维模式,具备可扩展、跨平台、稳定性和性能,真正帮助用户提高生产率,促进有效沟通及协作。 Paste强大的剪切板增强工具. 可以记录无穷尽的粘贴复制记录用户日后访问时候使用. 界面美观操作简单.Paste for mac 是一款功能强大的mac剪切板记录管理工具,开启这款软件后你复制的所有数据都会在软件中储存,想要使用时直接打开软件找到该内容即可。相当赞的,媲美原生的粘贴复制工具,最多可以保存无限个复制历史,而且颜值相当高。 PPDuck一个离线的图片压缩工具,压缩率不错,平时上传博客的图片都是用它压缩,购买后可以一次压缩无限张,没购买只能一次压缩10张,关闭后再次打开有时10张。 Qbserve一个自动的私人时间跟踪系统,可帮助提高您的效率。它给你即时的答案,你的时间通过智能地观察活动应用程序的方式。所有跟踪的信息私人存储在您的设备上。看到自己每天用Mac干了啥,用某一个软件多久。 ScreenFlowMac OS平台上一款老牌的屏幕录像软件。不但可以录制桌面操作还可以进行后期的剪辑工作,可以添加字幕, 增加视频效果与文字效果等功能,支持输出成 MOV,FLV 等格式。此软件获得WWDC 2008软件设计大奖。 Sip一款非常不错的Mac屏幕取色软件,你只需要鼠标点一下即可取得屏幕当前位置的颜色值,并将数据自动存到剪切板,方便随时粘贴出来。支持 CSS、UIColor 等多种格式。 SketchSketch 3(App Store 精华) 是最强大的移动应用矢量绘图设计工具,对于网页设计和移动设计者来说,比PhotoShop好用N倍!尤其是在移动应用设计方面,Sketch 3 的优点在于使用简单,学习曲线低,并且功能更加强大易用,支持自动切图,并且具有移动设计模板,能够大大节省设计师的时间和工作量,非常适合进行网站设 计、移动应用设计、图标设计等。叼炸天的工具,虽然我现在还用不上,因为我还没那么吊,但是有一定开发经验的人都知道这个。 Snip腾讯难得的几个良心软件,从qq截图里面分离出来的,纯粹的截图软件,自带编辑功能。 Annotate一款非常强大好用的图片注释软件,可对屏幕截图或者现有图片进行批注。同时,在基础的图片注释功能上还增加了“局部高亮”、“Emoji 表情”、 ”GIF 动图录制与注释“、“与 Dropbox/CloudApp 同步数据“等功能。腾讯的Snip也很好,但是没有马赛克功能,选择放弃。 Dash非常出名的API调试工具,可以浏览几乎任何主流编程语言的文档,我用来看iOS的文档。 Yummy FTP ProMac平台上的一款好用的FTP、FTP SSL/TLS和SFTP客户端,Yummy FTP Mac版结合并改进了其它文件传输方案中最好的功能,添加了大量独特的强大功能,以一个高度可调谐的FTP引擎驱动。与远程服务器传输文件用的。 射手影音平时播放视频用的,支持格式多。 MovistMac平台下一个全格式播放器,基于QuickTime & FFmpeg,您可以选择由QuickTime 还是 FFmpeg来解码播放,支持.avi、.mkv、.wmv、flv、rmvb等格式,有快进功能。]]></content>
</entry>
<entry>
<title><![CDATA[Mac必备软件(3)-程序猿从入门到日常]]></title>
<url>%2F2016%2F07%2F31%2F93-1%2F</url>
<content type="text"><![CDATA[个人喜欢收集一些软件,特别是好软件、新软件,手机上一直都是100+个软件,多多尝试软件,顺便收集灵感。从Windows转Mac或者刚开始使 用 Mac的同学或多或少都为找不到替代软件而烦恼,Mac上的软件不如Windows上大众,方便下载,这里特地分享给大家,希望能帮助到大家。 Mac必备软件(1)-CleanMyMac Mac必备软件(2)-浏览器(Chrome长期更新) 持续更新中… 随着使用mac时间的增长,软件越下越多,装了删,删了下,最后留下来的必定是精品,这次我就把我自己mac的精品软件分享给大家。 先给大家看下我电脑上的软件: 先给出软件介绍,所有软件下载地址稍后放出,博主苦逼考试学习,挤出时间继续更新。 Alfred 3Alfred 这是一款被称之为Mac效率神器的App,有了它你甚至无需鼠标就可以实现各种操作,包括出发各种文件、网络操作,其UI界面使用方便,而且不是通过命令来实现,是开发者们和键盘童鞋们的神器。Mac 平台上最为传奇的效率作品,誉为神兵利器毫不为过。完全可以替代OS X自带的Spotlight,功能非常强大,屡获殊荣。可以我用的不多,没研究这个,不过确实强大。 欧路词典Mac下优秀的词典工具,支持苹果系统直接屏幕取词。还有划词搜索,生词本,翻译朗读,词库扩展等等功能。App Store有免费版本和付费版本,区别不太大。 Mou一款Mac下的Markdown工具,平时用来做笔记,之前用Typecho搭建博客的时候天天用Markdown写文章,所以觉得还不错。 GitBook也是用来阅读Markdown文本的,毕竟Github上有许多书要用这个来看。 网易云音乐这个没话说,网易云音乐刚出来的时候就在手机上下载过,算是老用户,Mac下的做的还算良心,不比酷狗,万年不更新,还不能下载音乐。 BBEditBBEdit 是一款著名代码编辑器。适用于Mac OS平台版本, 用于编辑HTML文件, 文本文件及程序源代码,相当于Windows下的Editplus、notepad++,万能的编辑文本软件。 CheatSheet让快捷键一目了然,安装后长按command会出现当前软件的所有快捷键,非常方便。 GestimerGestimer 是一款简单方便的提醒创建小工具,虽然 Mac OS X 预装了提醒事项应用,但想要创建提醒事件时必须首先输入事件的名称,然后选择在某个特定的时间或地点提醒自己,比较麻烦。Gestimer 提供的事件创建功能更直观,可以快速流畅的创建提醒事项,当然,软件也有一定的局限性,比如创建的提醒事项不能相隔太久。等于一个提醒事项,只不过做的很有文艺气息,也很好玩,从顶部往下拉,拉得越长,倒计时越久。 HazeOverHazeOver 是 Mac OS X 上的一款小工具,它可以在激活的窗口区域以外显示阴影,这可以让你很方便聚焦在当前的任务上,再也不用担心所有窗口叠在一起了,等于高亮当前窗口,尽量不分散你的注意力。一个比较有创意的软件。 iThoughtsXiThoughtsX 是一款适用于 Mac 的思维导图应用程序。 此应用程序基于 iOS iThoughts 并与其完全兼容。思维导图可助您直观组织想法、主意和信息。 XMindXMind是一款实用的思维导图软件,简单易用、美观、功能强大,拥有高效的可视化思维模式,具备可扩展、跨平台、稳定性和性能,真正帮助用户提高生产率,促进有效沟通及协作。 Paste强大的剪切板增强工具. 可以记录无穷尽的粘贴复制记录用户日后访问时候使用. 界面美观操作简单.Paste for mac 是一款功能强大的mac剪切板记录管理工具,开启这款软件后你复制的所有数据都会在软件中储存,想要使用时直接打开软件找到该内容即可。相当赞的,媲美原生的粘贴复制工具,最多可以保存无限个复制历史,而且颜值相当高。 PPDuck一个离线的图片压缩工具,压缩率不错,平时上传博客的图片都是用它压缩,购买后可以一次压缩无限张,没购买只能一次压缩10张,关闭后再次打开有时10张。 Qbserve一个自动的私人时间跟踪系统,可帮助提高您的效率。它给你即时的答案,你的时间通过智能地观察活动应用程序的方式。所有跟踪的信息私人存储在您的设备上。看到自己每天用Mac干了啥,用某一个软件多久。 ScreenFlowMac OS平台上一款老牌的屏幕录像软件。不但可以录制桌面操作还可以进行后期的剪辑工作,可以添加字幕, 增加视频效果与文字效果等功能,支持输出成 MOV,FLV 等格式。此软件获得WWDC 2008软件设计大奖。 Sip一款非常不错的Mac屏幕取色软件,你只需要鼠标点一下即可取得屏幕当前位置的颜色值,并将数据自动存到剪切板,方便随时粘贴出来。支持 CSS、UIColor 等多种格式。 SketchSketch 3(App Store 精华) 是最强大的移动应用矢量绘图设计工具,对于网页设计和移动设计者来说,比PhotoShop好用N倍!尤其是在移动应用设计方面,Sketch 3 的优点在于使用简单,学习曲线低,并且功能更加强大易用,支持自动切图,并且具有移动设计模板,能够大大节省设计师的时间和工作量,非常适合进行网站设 计、移动应用设计、图标设计等。叼炸天的工具,虽然我现在还用不上,因为我还没那么吊,但是有一定开发经验的人都知道这个。 Snip腾讯难得的几个良心软件,从qq截图里面分离出来的,纯粹的截图软件,自带编辑功能。 Annotate一款非常强大好用的图片注释软件,可对屏幕截图或者现有图片进行批注。同时,在基础的图片注释功能上还增加了“局部高亮”、“Emoji 表情”、 ”GIF 动图录制与注释“、“与 Dropbox/CloudApp 同步数据“等功能。腾讯的Snip也很好,但是没有马赛克功能,选择放弃。 Dash非常出名的API调试工具,可以浏览几乎任何主流编程语言的文档,我用来看iOS的文档。 Yummy FTP ProMac平台上的一款好用的FTP、FTP SSL/TLS和SFTP客户端,Yummy FTP Mac版结合并改进了其它文件传输方案中最好的功能,添加了大量独特的强大功能,以一个高度可调谐的FTP引擎驱动。与远程服务器传输文件用的。 射手影音平时播放视频用的,支持格式多。 MovistMac平台下一个全格式播放器,基于QuickTime & FFmpeg,您可以选择由QuickTime 还是 FFmpeg来解码播放,支持.avi、.mkv、.wmv、flv、rmvb等格式,有快进功能。]]></content>
</entry>
<entry>
<title><![CDATA[关于Windows下的弱智记事本]]></title>
<url>%2F2016%2F07%2F12%2F92-1%2F</url>
<content type="text"><![CDATA[由于之前用过一段时间Windows调试网站,家里的电脑也是Windows,在折腾网站修改文件的时候碰见过一些非常奇葩、弱智的问题,虽然是好几个月前的事情,但今天突然想起来,所以特地告诉大家,还好我现在已经全部转移到Mac下,都找到替代软件,工作效率大大提升!!说真的,大部分软件开发工作,在Mac下比Windows下工作效率会提升很多倍,可以自行查阅相关资料(顺便说下,今天正式开始IOS深入学习征程,7月11,纪念下)。 其实我很早以前就不用Win自带的记事本了,一直Notepad++和Editplus混合使用,但是当时也不知道什么原因,用记事本编辑了一个插件的php文件,结果微信公众平台里面token验证失败一直报错,折腾一晚上,到最后才知道由于用记事本打开编辑,文件袋BOM,导致token验证失败。从此坚决再也不碰记事本!! Windows下自带的记事本致命缺陷:千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++、Editplus等代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM(由于兼容性,带BOM的utf-8在一些浏览器中显示为乱码)即可。]]></content>
</entry>
<entry>
<title><![CDATA[关于Windows下的弱智记事本]]></title>
<url>%2F2016%2F07%2F12%2F92%2F</url>
<content type="text"><![CDATA[由于之前用过一段时间Windows调试网站,家里的电脑也是Windows,在折腾网站修改文件的时候碰见过一些非常奇葩、弱智的问题,虽然是好几个月前的事情,但今天突然想起来,所以特地告诉大家,还好我现在已经全部转移到Mac下,都找到替代软件,工作效率大大提升!!说真的,大部分软件开发工作,在Mac下比Windows下工作效率会提升很多倍,可以自行查阅相关资料(顺便说下,今天正式开始IOS深入学习征程,7月11,纪念下)。 其实我很早以前就不用Win自带的记事本了,一直Notepad++和Editplus混合使用,但是当时也不知道什么原因,用记事本编辑了一个插件的php文件,结果微信公众平台里面token验证失败一直报错,折腾一晚上,到最后才知道由于用记事本打开编辑,文件袋BOM,导致token验证失败。从此坚决再也不碰记事本!! Windows下自带的记事本致命缺陷:千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++、Editplus等代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM(由于兼容性,带BOM的utf-8在一些浏览器中显示为乱码)即可。]]></content>
</entry>
<entry>
<title><![CDATA[个人学习网站分享(8月7日更新)]]></title>
<url>%2F2016%2F07%2F11%2F91%2F</url>
<content type="text"><![CDATA[人生在于学习。俗话说得好,学到老,活到老,作为一个程序猿更是,IT技术日异月新,每天都在变化,不断学习新技术,才能更好的解决问题,提高工作效率。这里我分享一些自己平时经常逛的大牛博客,或者学习网站(非广告0-0,纯属个人收藏学习)。 我所列出来的所有网站,经过我一个一个测试,全部可以正常访问,并且内容正常更新。 个人博客: Tim’s Blog(无耻的写上了自己的博客,我相信慢慢的会成真) 张戈博客(关注互联网以及分享IT运维工作经验的个人博客) 知更鸟(分享交流WordPress经验与技巧,关注网站前端设计与网站制作) 小波说雨燕(中文精品Swift和iOS教学视频,网上下过Swift学习视频的应该都认识) stormzhang(良心Android开发者,虽然我不学Android,但是可以学习到许多其他知识 ) 逗比根据地(上面有许多梯子的教程,在这里不宜多说,你懂的,博主很好) 史蒂芬周的博客(上面有许多实用的Mac**软件) 知己知彼(交流电脑技术、提供优质软件、分享互联网最新资讯,Win上的好多**软件就是这里下的) 唐巧的技术博客(内容包括 iOS 开发技巧、创业感悟、读书心得,作者在在猿题库创业) 以上7.14日更新 池建强的随想录(关注技术和人文) OneV’s Den(中国的 iOS / Unity 开发者,居日本,就职于 LINE) Lancy’s Blog(蓝晨钰,猿题库任 iOS 研发工程师,文章不太多) 以上7.15日更新 一只魔法师的工坊 破船之家 NSHipster sunnyxx的技术博客 I’m TualatriX Cocoabit webfrogs 代码手工艺人 王中周的技术博客 Luke’s Homepage 萧宸宇 Yuan博客 码农人生 玉令天下的Blog 不掏蜂窝的熊 里脊串的开发随笔 Why’s blog - 汪海的实验室 土土哥的技术Blog 庞海礁的个人空间 Casa Taloyum Kenshin Cui’s Blog 老谭笔记 coderyi 雷纯锋的技术博客 向晨宇的技术博客 不会开机的男孩(貌似停更,但内容不错,保留) Wonderffee’s Blog (貌似停更,但内容不错,保留)以上8.7日更新 其他: 专注于Win7(目前少有的纯净版本Win7,简直良心,而且和我一样”处女座”,对事情要求完美) Github(作为一个做大的同性交友平台,上面有许多大牛和值得学习的东西,没事多逛逛) V2EX(一个关于分享和探索的地方,里面有许多大牛以及好玩技术的社区) 开发者头条(可以阅读头条新闻、分享技术文章、发布开源项目,程序猿多看看,有手机app) PDF之家(上面有许多最新的报刊杂志,表示陪伴我好几年的电脑报就是这里下的) 简书(上面有许多呕心沥血的技术文章,可以没事看一看) CocoaChina(苹果开发中文社区,上面有许多最新资讯和鸡汤) androidweekly(有关于Android的周报,平时了解些动态,不过是英文的) 中国版androidweekly(上面的中文版) ( 暂时就这么多,如果发现新的还会加上来,大家也可以分享自己觉得有用的网站)]]></content>
</entry>
<entry>
<title><![CDATA[个人学习网站分享(8月7日更新)]]></title>
<url>%2F2016%2F07%2F11%2F91-1%2F</url>
<content type="text"><![CDATA[人生在于学习。俗话说得好,学到老,活到老,作为一个程序猿更是,IT技术日异月新,每天都在变化,不断学习新技术,才能更好的解决问题,提高工作效率。这里我分享一些自己平时经常逛的大牛博客,或者学习网站(非广告0-0,纯属个人收藏学习)。 我所列出来的所有网站,经过我一个一个测试,全部可以正常访问,并且内容正常更新。 个人博客: Tim’s Blog(无耻的写上了自己的博客,我相信慢慢的会成真) 张戈博客(关注互联网以及分享IT运维工作经验的个人博客) 知更鸟(分享交流WordPress经验与技巧,关注网站前端设计与网站制作) 小波说雨燕(中文精品Swift和iOS教学视频,网上下过Swift学习视频的应该都认识) stormzhang(良心Android开发者,虽然我不学Android,但是可以学习到许多其他知识 ) 逗比根据地(上面有许多梯子的教程,在这里不宜多说,你懂的,博主很好) 史蒂芬周的博客(上面有许多实用的Mac**软件) 知己知彼(交流电脑技术、提供优质软件、分享互联网最新资讯,Win上的好多**软件就是这里下的) 唐巧的技术博客(内容包括 iOS 开发技巧、创业感悟、读书心得,作者在在猿题库创业) 以上7.14日更新 池建强的随想录(关注技术和人文) OneV’s Den(中国的 iOS / Unity 开发者,居日本,就职于 LINE) Lancy’s Blog(蓝晨钰,猿题库任 iOS 研发工程师,文章不太多) 以上7.15日更新 一只魔法师的工坊 破船之家 NSHipster sunnyxx的技术博客 I’m TualatriX Cocoabit webfrogs 代码手工艺人 王中周的技术博客 Luke’s Homepage 萧宸宇 Yuan博客 码农人生 玉令天下的Blog 不掏蜂窝的熊 里脊串的开发随笔 Why’s blog - 汪海的实验室 土土哥的技术Blog 庞海礁的个人空间 Casa Taloyum Kenshin Cui’s Blog 老谭笔记 coderyi 雷纯锋的技术博客 向晨宇的技术博客 不会开机的男孩(貌似停更,但内容不错,保留) Wonderffee’s Blog (貌似停更,但内容不错,保留)以上8.7日更新 其他: 专注于Win7(目前少有的纯净版本Win7,简直良心,而且和我一样”处女座”,对事情要求完美) Github(作为一个做大的同性交友平台,上面有许多大牛和值得学习的东西,没事多逛逛) V2EX(一个关于分享和探索的地方,里面有许多大牛以及好玩技术的社区) 开发者头条(可以阅读头条新闻、分享技术文章、发布开源项目,程序猿多看看,有手机app) PDF之家(上面有许多最新的报刊杂志,表示陪伴我好几年的电脑报就是这里下的) 简书(上面有许多呕心沥血的技术文章,可以没事看一看) CocoaChina(苹果开发中文社区,上面有许多最新资讯和鸡汤) androidweekly(有关于Android的周报,平时了解些动态,不过是英文的) 中国版androidweekly(上面的中文版) ( 暂时就这么多,如果发现新的还会加上来,大家也可以分享自己觉得有用的网站)]]></content>
</entry>
<entry>
<title><![CDATA[Github之修改用户名]]></title>
<url>%2F2016%2F07%2F10%2F90%2F</url>
<content type="text"><![CDATA[这几天开始正式深入学习Github方面的知识,由于之前的用户名比较随便,所以第一件事就是更改自己的用户名,取一个比较有标志性的名字。中途碰到一点问题,所以特此分享出来,虽然很简单,但是还算有用。 Github官网 进入你的Github个人主页,例如我的就是Timhbw的Github。 点击右上角的小箭头,会出现许多选项,依次选择右上角Settings-左侧Account-中间Change username,然后填写你的新用户名。 可能会报如下错误:Login is already taken原因是该用户名被占用了。 解决方法:我们可以用一个快捷的方法检测用户名是否被占用:在浏览器中输入https://github.com/用户名/,如果是404错误,那恭喜你,这个用户名可以使用,否则就不能使用,填写这个用户名的话会报错。]]></content>
</entry>
<entry>
<title><![CDATA[Github之修改用户名]]></title>
<url>%2F2016%2F07%2F10%2F90-1%2F</url>
<content type="text"><![CDATA[这几天开始正式深入学习Github方面的知识,由于之前的用户名比较随便,所以第一件事就是更改自己的用户名,取一个比较有标志性的名字。中途碰到一点问题,所以特此分享出来,虽然很简单,但是还算有用。 Github官网 进入你的Github个人主页,例如我的就是Timhbw的Github。 点击右上角的小箭头,会出现许多选项,依次选择右上角Settings-左侧Account-中间Change username,然后填写你的新用户名。 可能会报如下错误:Login is already taken原因是该用户名被占用了。 解决方法:我们可以用一个快捷的方法检测用户名是否被占用:在浏览器中输入https://github.com/用户名/,如果是404错误,那恭喜你,这个用户名可以使用,否则就不能使用,填写这个用户名的话会报错。]]></content>
</entry>
<entry>
<title><![CDATA[Mac必备软件(2)-浏览器(Chrome长期更新)]]></title>
<url>%2F2016%2F07%2F09%2F89-1%2F</url>
<content type="text"><![CDATA[个人喜欢收集一些软件,特别是好软件、新软件,手机上一直都是100+个软件,多多尝试软件,顺便收集灵感。从Windows转Mac或者刚开始使用 Mac的同学或多或少都为找不到替代软件而烦恼,Mac上的软件不如Windows上大众,方便下载,这里特地分享给大家,希望能帮助到大家。 Mac必备软件(1)-CleanMyMac 持续更新中… Mac虽然自带好用的Safari,然而只有自家才有,在Windows、Linux上都木有,书签、浏览记录啥的都不能跨平台同步,所以还是要多个浏览器一起使用。下面推荐两个我一直在使用而且非常不错的浏览器,支持的平台也非常广泛,相比大家都已经知道了。 这篇文章得另一个目的就是方便大家下载Chrome浏览器,毕竟国内行情大家懂得,有更新的话我就会同步到这里,长期更新。福利给大家一个网址,能不能访问看你梯子怎么样啦:Chrome各版本下载 Firefox浏览器这个浏览器不必多说,用过都知道。Mozilla Firefox,中文俗称“火狐”(正式缩写为Fx或fx,非正式缩写为FF),是一个自由及开放源代码网页浏览器,使用Gecko排版引擎,支持多种操作系统,如Windows、Mac OS X及GNU/Linux等。该浏览器提供了两种版本,普通版和ESR(Extended Support Release,延长支持)版,ESR版本是 Mozilla 专门为那些无法或不愿每隔六周就升级一次的企业打造。Firefox ESR 版的升级周期为 42 周,而普通 Firefox 的升级周期为 6 周。据2013年8月浏览器统计数据,Firefox在全球网页浏览器市占率76%至81%,用户数在各网页浏览器中排名第三,全球估计有6450万位用户。在印度尼西亚、德国和波兰的占有率最高,分别为97.84%、86.41%和84.31%。自Firefox 29起,浏览器界面有很大程度改变。由于该浏览器开放了源代码,因此还有一些第三方编译版供使用。如pcxFirefox,苍月浏览器,tele009等。根据英国防病毒公司Sophos的最新调查数据显示,Firefox连续三年成为互联网用户最受信赖的浏览器。有Windows、OS X、Linux、Android、以及iOS版本提供下载。 下载地址: [url href=http://dl.huangbowei.com/Firefox/Mac/20160709/Firefox-latest0709.dmg]Firefox0709(Mac) [/url] [url href=http://dl.huangbowei.com/Firefox/Windows/20160709/Firefox-latest0709.exe]Firefox0709(Windows) [/url] Chrome浏览器Google Chrome,又称Google浏览器,是一个由Google(谷歌)公司开发的网页浏览器。该浏览器是基于其他开源软件所 撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。软件的名称是来自于称作Chrome的网络浏览器图形使用 者界面(GUI)。软件的beta测试版本在2008年9月2日发布,提供50种语言版本,有Windows、OS X、Linux、Android、以及iOS版本提供下载。 下载地址: [url href=http://dl.huangbowei.com/Chrome/Mac/20160709/googlechrome0709.dmg]Chrome0709(Mac) [/url] [url href=http://dl.huangbowei.com/Chrome/Windows/20160709/googlechrome0709.exe]Chrome0709(Windows) [/url] ]]></content>
</entry>
<entry>
<title><![CDATA[Mac必备软件(2)-浏览器(Chrome长期更新)]]></title>
<url>%2F2016%2F07%2F09%2F89%2F</url>
<content type="text"><![CDATA[个人喜欢收集一些软件,特别是好软件、新软件,手机上一直都是100+个软件,多多尝试软件,顺便收集灵感。从Windows转Mac或者刚开始使用 Mac的同学或多或少都为找不到替代软件而烦恼,Mac上的软件不如Windows上大众,方便下载,这里特地分享给大家,希望能帮助到大家。 Mac必备软件(1)-CleanMyMac 持续更新中… Mac虽然自带好用的Safari,然而只有自家才有,在Windows、Linux上都木有,书签、浏览记录啥的都不能跨平台同步,所以还是要多个浏览器一起使用。下面推荐两个我一直在使用而且非常不错的浏览器,支持的平台也非常广泛,相比大家都已经知道了。 这篇文章得另一个目的就是方便大家下载Chrome浏览器,毕竟国内行情大家懂得,有更新的话我就会同步到这里,长期更新。福利给大家一个网址,能不能访问看你梯子怎么样啦:Chrome各版本下载 Firefox浏览器这个浏览器不必多说,用过都知道。Mozilla Firefox,中文俗称“火狐”(正式缩写为Fx或fx,非正式缩写为FF),是一个自由及开放源代码网页浏览器,使用Gecko排版引擎,支持多种操作系统,如Windows、Mac OS X及GNU/Linux等。该浏览器提供了两种版本,普通版和ESR(Extended Support Release,延长支持)版,ESR版本是 Mozilla 专门为那些无法或不愿每隔六周就升级一次的企业打造。Firefox ESR 版的升级周期为 42 周,而普通 Firefox 的升级周期为 6 周。据2013年8月浏览器统计数据,Firefox在全球网页浏览器市占率76%至81%,用户数在各网页浏览器中排名第三,全球估计有6450万位用户。在印度尼西亚、德国和波兰的占有率最高,分别为97.84%、86.41%和84.31%。自Firefox 29起,浏览器界面有很大程度改变。由于该浏览器开放了源代码,因此还有一些第三方编译版供使用。如pcxFirefox,苍月浏览器,tele009等。根据英国防病毒公司Sophos的最新调查数据显示,Firefox连续三年成为互联网用户最受信赖的浏览器。有Windows、OS X、Linux、Android、以及iOS版本提供下载。 下载地址: [url href=http://dl.huangbowei.com/Firefox/Mac/20160709/Firefox-latest0709.dmg]Firefox0709(Mac) [/url] [url href=http://dl.huangbowei.com/Firefox/Windows/20160709/Firefox-latest0709.exe]Firefox0709(Windows) [/url] Chrome浏览器Google Chrome,又称Google浏览器,是一个由Google(谷歌)公司开发的网页浏览器。该浏览器是基于其他开源软件所 撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。软件的名称是来自于称作Chrome的网络浏览器图形使用 者界面(GUI)。软件的beta测试版本在2008年9月2日发布,提供50种语言版本,有Windows、OS X、Linux、Android、以及iOS版本提供下载。 下载地址: [url href=http://dl.huangbowei.com/Chrome/Mac/20160709/googlechrome0709.dmg]Chrome0709(Mac) [/url] [url href=http://dl.huangbowei.com/Chrome/Windows/20160709/googlechrome0709.exe]Chrome0709(Windows) [/url] ]]></content>
</entry>
<entry>
<title><![CDATA[Mac必备软件(1)-CleanMyMac3.7.1]]></title>
<url>%2F2016%2F07%2F09%2F88-1%2F</url>
<content type="text"><![CDATA[个人喜欢收集一些软件,特别是好软件、新软件,手机上一直都是100+个软件,多多尝试软件,顺便收集灵感。从Windows转Mac或者刚开始使用Mac的同学或多或少都为找不到替代软件而烦恼,Mac上的软件不如Windows上大众,方便下载,这里特地分享给大家,希望能帮助到大家。 CleanMyMac 软件介绍 CleanMyMac是一款集所有功能于一身的先进程序卸载清理器,只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。拥有超强的清理能力,能够快速清理Mac垃圾文件、陈旧数据等,恢复Mac原本性能,保持电脑最佳状态!绝对是Mac必备神器!!!自己一直再用。 下面给出一些图片,供大家参考: CleanMyMac3.4下载地址: 链接: CleanMyMac34## CleanMyMac3.5下载地址(2016/11/03更新):链接: CleanMyMac3.5密码: rc5f## CleanMyMac3.7.1下载地址(2017/01/26更新)因版权原因,暂不提供下载:[reply]CleanMyMac3.7.1[/reply]]]></content>
</entry>
<entry>
<title><![CDATA[Mac必备软件(1)-CleanMyMac3.7.1]]></title>
<url>%2F2016%2F07%2F09%2F88%2F</url>
<content type="text"><![CDATA[个人喜欢收集一些软件,特别是好软件、新软件,手机上一直都是100+个软件,多多尝试软件,顺便收集灵感。从Windows转Mac或者刚开始使用Mac的同学或多或少都为找不到替代软件而烦恼,Mac上的软件不如Windows上大众,方便下载,这里特地分享给大家,希望能帮助到大家。 CleanMyMac 软件介绍 CleanMyMac是一款集所有功能于一身的先进程序卸载清理器,只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。拥有超强的清理能力,能够快速清理Mac垃圾文件、陈旧数据等,恢复Mac原本性能,保持电脑最佳状态!绝对是Mac必备神器!!!自己一直再用。 下面给出一些图片,供大家参考: CleanMyMac3.4下载地址: 链接: CleanMyMac34## CleanMyMac3.5下载地址(2016/11/03更新):链接: CleanMyMac3.5密码: rc5f## CleanMyMac3.7.1下载地址(2017/01/26更新)因版权原因,暂不提供下载:[reply]CleanMyMac3.7.1[/reply]]]></content>
</entry>
<entry>
<title><![CDATA[仍在继续的学习生涯]]></title>
<url>%2F2016%2F07%2F09%2F87%2F</url>
<content type="text"><![CDATA[网络IT行业发展飞速,各行各业谁都不能预测它的未来,或许你选择Android开发,有人说已经饱和,选择大数据,有人说技术还不太成熟,看发展等等,我只想说:Follow your heart!别人的意见可以参考,做决定的是你自己,与其每天做着不喜欢的事拿着高薪,不如选择你喜欢的事,坚持做下去,一定会有收获。 由于感觉自己还需要学习,所以接下来的时间会加强学习其他内容,深化iOS编程思想。个人学习时间会占据我的大部分时间,博客更新会比以往慢点,但是我还是会继续坚持,把有用的知识分享给大家,把自己学习中的经验,那些坑分享给大家,帮助大家绕过弯路,一路向前。最后希望与大家一起成长,努力吧!!!]]></content>
</entry>
<entry>
<title><![CDATA[仍在继续的学习生涯]]></title>
<url>%2F2016%2F07%2F09%2F87-1%2F</url>
<content type="text"><![CDATA[网络IT行业发展飞速,各行各业谁都不能预测它的未来,或许你选择Android开发,有人说已经饱和,选择大数据,有人说技术还不太成熟,看发展等等,我只想说:Follow your heart!别人的意见可以参考,做决定的是你自己,与其每天做着不喜欢的事拿着高薪,不如选择你喜欢的事,坚持做下去,一定会有收获。 由于感觉自己还需要学习,所以接下来的时间会加强学习其他内容,深化iOS编程思想。个人学习时间会占据我的大部分时间,博客更新会比以往慢点,但是我还是会继续坚持,把有用的知识分享给大家,把自己学习中的经验,那些坑分享给大家,帮助大家绕过弯路,一路向前。最后希望与大家一起成长,努力吧!!!]]></content>
</entry>
<entry>
<title><![CDATA[Aria2-不限速全平台下载利器]]></title>
<url>%2F2016%2F06%2F28%2F86%2F</url>
<content type="text"><![CDATA[之前写过一篇,发现浏览下载人数众多,所以抽出时间把相关资源更新、失效的链接剔除以及添加最新软件下载链接(2017/01/17)。 这次给大家介绍一个下载利器,之前玩路由器也听说过,然而那时候水平有限,并不太懂。大家都知道,在mac下太坑爹,迅雷下东西大部分时候都是0KB/S,也没有百度云下载(新更新的百度网盘 Mac 版本可以下载东西,之前只能同步文件用),用浏览器下载速度也慢。这些天又偶遇Aria2,然后钻研一番,得道。特地分享出来给大家,话不多说,一个字一个字的码还要核对失效链接等资源,希望大家多多支持。 1.工具下载(包含本文中出现的所有工具的最新版本)下载链接:点击下载 [reply]密码: xtpj[/reply] 2. Aria2简介官网地址:Aria2官网 aria2 is a lightweight multi-protocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP,BitTorrent and Metalink. aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.(Aria2是一个命令行下轻量级、多协议、多来源的下载工具(支持 HTTP/HTTPS、FTP、BitTorrent、Metalink),内建 XML-RPC 和 JSON-RPC 用户界面。) 3.安装与配置3.1 Aria2 for macOS3.1.1 懒人版 — Aria2GUI(客户端,推荐)下载安装Aria2GUI.dmg,位于网盘的Aria2 for Mac文件夹中,或者 github 地址:aria2gui mac 1.3.5客户端。 首先下载 BaiduExporter 0.8.5 Chrome 浏览器插件,然后解压下载好的文件,打开 Chrome 浏览器,点击浏览器右上角设置->扩展程序,把开发者模式打上勾,最后把文件夹中的 chrome.crx往 Chrome 中拖,一直点击下一步下一步的节奏。打开Aria2GUI,然后打开需要下载的百度云盘的分享链接,会发现网页上下载按钮旁边多出一个「导出下载」按钮,点击它弹出的「ARIA2 RPC」就自动添加到你的下载队列里了。 测试链接:阿甘正传 这时候看Aria2客户端就能看到下载的文件了,我这边移动下载速度满速下载。 3.1.2 技术宅版 — 适合喜欢折腾的人下载安装Aria2。下载安装最新Mac版的Aria2(目前是1.30.0),项目地址:Aria2 Github地址,当然网盘中也有:Aria2 for Mac-> aria2-1.30.0-osx-darwin.dmg. 下载aria2.conf。找到网盘文件夹中的配置文件aria2.conf。运行Aria2所有的选项都可以在配置文件中设置。想更进一步了解配置文件可以参考以下网站: 1.Aria2 & YAAW 使用说明 2.aria2c(1) — aria2 1.30.0 documentation 用文本编辑器打开aria2c.conf, 第二行是设置下载路径 dir=/Users/XXX/Downloads ,把XXX改为你自己电脑的用户名 [![](https://www.huangbowei.com/wp-content/uploads/2016/06/FindYourUsername.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/FindYourUsername.png) * 打开终端Terminal,输入: mkdir ~/.aria2 (该命令会在用户根目录下会生成一个.aria2的隐藏文件夹) open ~/.aria2 (该命令会打开.aria2隐藏文件夹) * 将配置文件`aria2.conf` 拖入`.aria2`文件夹中(这一步是为了方便每次启动aria2c的时候不用每次手动输入配置文件的位置),接着找到压缩文件aria2c.zip,解压后将aria2c文件夹整个拖入 /Applications 目录下。 运行Aria2,继续在Terminal输入: aria2c * 如果第二步中的文件放置的位置没问题那么aria2c应该已经启动了,看aria2c 是否启动的办法是Terminal中输入: ps aux|grep aria2c * 出现图片中第三行的结果说明aria2c已经正常启动,如果无法正常启动,检查第二步中各种文件的位置是否正确 [![](https://www.huangbowei.com/wp-content/uploads/2016/06/ps-auxgrep-aria2c.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/ps-auxgrep-aria2c.png) * 通过webui-aria2控制Aria2 aria2是基于命令行的下载工具,不过还好大神们早已开发了各种易用的UI方便我们小白使用,最常用的: [Aria2 WebUI](http://ziahamza.github.io/webui-aria2/)、[Yet Another Aria2 Web Frontend](http://binux.github.io/yaaw/demo/)。最简便的方法是直接打开以上网站然后设置主机为[code]代码localhost[/code]会自动连接(爱折腾的可以到 [webui-aria2](https://github.com/ziahamza/webui-aria2) 或 [yaaw](https://github.com/binux/yaaw) 下载所需文件自己搭建server)。 下面以webui-aria2为例:打开 [http://ziahamza.github.io/webui-aria2/ ](http://ziahamza.github.io/webui-aria2/)出现以下结果说明webui和Aria2已经连接成功。 [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUI.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUI.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIConfig.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIConfig.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload2.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload2.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload3.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload3.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload4.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload4.png) 如果连接不成功可以打开网页上方设置,查看主机是否为localhost,或者端口是否是6800。到这里就可以在webui中添加链接或者种子开始满速下载啦。 #### 3.2 Aria2 for Windows ##### 3.2.1 懒人版 — Aria2GUI(网页版,推荐) 首先下载网盘相关文件,详见网盘Aria2 for Windows。其中aria2.rar这个文件一定要解压在D:\aria2这个文件夹里,即D:\aria2\里面不能再有文件夹了,然后在D盘根目录建立一个Downloads的文件夹,这个文件夹就是你下载的文件存放的地方,不要把文件的名字搞错了(如果想要更改目录的,需要修改2个文件里面的内容,一个是aria2.conf,一个是HideRun.vbs,修改里面的D:为你的磁盘就好); 进入D:\aria2\里面,双击HideRun.vbs这个文件,电脑不会有任何反应,因为运行窗口被屏蔽掉了,这时你进入任务管理器可以看到aria2c.exe这个进程正在运行。如果想开机自行启动,请看折腾版。 然后找到 `aria2网页版.zip`,将这个文件在任意位置解压缩,然后双击index.html这个文件,你的默认浏览器就会打开一个网页,这个网页就是控制aria2这个软件的界面,这是中文界面。然后把他加入浏览器的收藏夹即可,不必每次都找到文件夹再点击打开。 同样必须安装浏览器插件,才能使用,网盘中的plugin就有。这样就可以下载百度云,迅雷离线中的资源,下载速度很快,而且占用的电脑资源小,但是设置有一点点复杂。 ##### 3.2.2 折腾版 (不推荐) * aria2 Github下载(注意32与64位) 下载地址:[aria2 1.30.0](https://github.com/aria2/aria2/releases/tag/release-1.30.0) * 安装 把下载好的文件解压后找一个英文路径的放进去就ok了,我就放在D:\Program Files\aria2\下 接下来新建几个文件: Aria2.log (日志,空文件就行) aria2.session (下载历史,空文件就行) aria2.conf (配置文件) HideRun.vbs (隐藏cmd窗口运行用到的) 配置aria2.conf,用文本编辑工具打开刚才建立的aria2.conf,复制按下面的内容,注意修改以下选项: dir=D:\Downloads\ (下载文件保存路径,改为你想要的) log=D:\Program Files\aria2\Aria2.log (日志文件,如果不需要日志,这一行可去掉,如果需要,路径D:\Program Files\aria2\改为你安装aria2的路径) input-file=D:\Program Files\aria2\aria2.session save-session=D:\Program Files\aria2\aria2.session(这两个是记录和读取下载历史用的,断电和重启时保证下载任务不会丢失,如果有时aria2不能启动,清空这里面的内容就行了,路径D:\Program Files\aria2\改为你安装aria2的路径) 完整版配置文件:dir=D:\Downloads\ log=D:\Program Files\aria2\Aria2.log input-file=D:\Program Files\aria2\aria2.session save-session=D:\Program Files\aria2\aria2.session save-session-interval=60 force-save=true log-level=error see — split optionmax-concurrent-downloads=5 continue=true max-overall-download-limit=0 max-overall-upload-limit=50K max-upload-limit=20 Http/FTP optionsconnect-timeout=120 lowest-speed-limit=10K max-connection-per-server=10 max-file-not-found=2 min-split-size=1M split=5 check-certificate=false http-no-cache=true FTP Specific OptionsBT/PT Settingbt-enable-lpd=true #bt-max-peers=55 follow-torrent=true enable-dht6=false bt-seed-unverified rpc-save-upload-metadata=true bt-hash-check-seed bt-remove-unselected-file bt-request-peer-speed-limit=100K seed-ratio=0.0 Metalink Specific OptionsRPC Optionsenable-rpc=true pause=false rpc-allow-origin-all=true rpc-listen-all=true rpc-save-upload-metadata=true rpc-secure=false Advanced Optionsdaemon=true disable-ipv6=true enable-mmap=true file-allocation=falloc max-download-result=120 #no-file-allocation-limit=32M force-sequential=true parameterized-uri=true 实现开机无cmd窗口启动用文本编辑工具打开刚才建立的HideRun.vbs 复制以下内容,注意修改D:\Progra~1\aria2\ 为你的aria2安装路径。 CreateObject(“WScript.Shell”).Run “D:\Progra~1\aria2\aria2c.exe — conf-path=aria2.conf”,0 要启动aria2,一定要点击这个文件,不要点击aria2c.exe如果要开机启动,创建一个HideRun.vbs的快捷方式,把快捷方式放到 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup中 管理界面aria2是命令行下载器,是没有界面的,不过有webui,最简单就是直接访问在线网址就行了: Aria2 WebUI ghostry Aria2 WebUI ziahamza Aria2 Web控制台 4.进阶运用(浏览器插件) 1.YAAW for Chrome点击YAAW图标便会出现YAAW的管理界面,设置好 JSON-RPC Path即可. 如果Chrome设置了下载之前不询问下载位置的话,可以自动取消Chrome下载 使用Aria2c下载. 可以设置多大的文件使用导出下载,小文件使用Chrome自带的下载功能,拦截下载默认使用第一个RPC地址. 开启右键菜单之后任意链接都可以右键导出到YAAW进行下载. 2.QQ旋风网页版离线下载增强 :UI精简Aria2命令/文件导出Aria2 RPCIDM文件导出Orbit文件导出自动登录magnet链接支持bt任务文件夹折叠限速解除 3.BaiduPanDownloadHelper:批量导出百度盘的下载链接支持2层目录支持个人主页、分享文件夹或单文件、分享专辑页面、分享主页支持复制到剪贴板、复制为 Aria2 格式、YAAW 4.ThunderLixianExporter将迅雷离线地址导出成aria2/wget等下载命令,方便Linux/Mac用户使用原生导出界面整合, 原生设置界面整合反文件名截断多种可扩展的导出器(aria2/aria2-rpc/wget/IDM/Orbit)云点播HTML5播放,导出直接输出选中的链接,配合FlashGot/DownThemAll使用 4.115网盘下载 部分内容参考自:bbs.feng.com/read-htm-tid-9585996.html]]></content>
</entry>
<entry>
<title><![CDATA[Aria2-不限速全平台下载利器]]></title>
<url>%2F2016%2F06%2F28%2F86-1%2F</url>
<content type="text"><![CDATA[之前写过一篇,发现浏览下载人数众多,所以抽出时间把相关资源更新、失效的链接剔除以及添加最新软件下载链接(2017/01/17)。 这次给大家介绍一个下载利器,之前玩路由器也听说过,然而那时候水平有限,并不太懂。大家都知道,在mac下太坑爹,迅雷下东西大部分时候都是0KB/S,也没有百度云下载(新更新的百度网盘 Mac 版本可以下载东西,之前只能同步文件用),用浏览器下载速度也慢。这些天又偶遇Aria2,然后钻研一番,得道。特地分享出来给大家,话不多说,一个字一个字的码还要核对失效链接等资源,希望大家多多支持。 1.工具下载(包含本文中出现的所有工具的最新版本)下载链接:点击下载 [reply]密码: xtpj[/reply] 2. Aria2简介官网地址:Aria2官网 aria2 is a lightweight multi-protocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP,BitTorrent and Metalink. aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.(Aria2是一个命令行下轻量级、多协议、多来源的下载工具(支持 HTTP/HTTPS、FTP、BitTorrent、Metalink),内建 XML-RPC 和 JSON-RPC 用户界面。) 3.安装与配置3.1 Aria2 for macOS3.1.1 懒人版 — Aria2GUI(客户端,推荐)下载安装Aria2GUI.dmg,位于网盘的Aria2 for Mac文件夹中,或者 github 地址:aria2gui mac 1.3.5客户端。 首先下载 BaiduExporter 0.8.5 Chrome 浏览器插件,然后解压下载好的文件,打开 Chrome 浏览器,点击浏览器右上角设置->扩展程序,把开发者模式打上勾,最后把文件夹中的 chrome.crx往 Chrome 中拖,一直点击下一步下一步的节奏。打开Aria2GUI,然后打开需要下载的百度云盘的分享链接,会发现网页上下载按钮旁边多出一个「导出下载」按钮,点击它弹出的「ARIA2 RPC」就自动添加到你的下载队列里了。 测试链接:阿甘正传 这时候看Aria2客户端就能看到下载的文件了,我这边移动下载速度满速下载。 3.1.2 技术宅版 — 适合喜欢折腾的人下载安装Aria2。下载安装最新Mac版的Aria2(目前是1.30.0),项目地址:Aria2 Github地址,当然网盘中也有:Aria2 for Mac-> aria2-1.30.0-osx-darwin.dmg. 下载aria2.conf。找到网盘文件夹中的配置文件aria2.conf。运行Aria2所有的选项都可以在配置文件中设置。想更进一步了解配置文件可以参考以下网站: 1.Aria2 & YAAW 使用说明 2.aria2c(1) — aria2 1.30.0 documentation 用文本编辑器打开aria2c.conf, 第二行是设置下载路径 dir=/Users/XXX/Downloads ,把XXX改为你自己电脑的用户名 [![](https://www.huangbowei.com/wp-content/uploads/2016/06/FindYourUsername.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/FindYourUsername.png) * 打开终端Terminal,输入: mkdir ~/.aria2 (该命令会在用户根目录下会生成一个.aria2的隐藏文件夹) open ~/.aria2 (该命令会打开.aria2隐藏文件夹) * 将配置文件`aria2.conf` 拖入`.aria2`文件夹中(这一步是为了方便每次启动aria2c的时候不用每次手动输入配置文件的位置),接着找到压缩文件aria2c.zip,解压后将aria2c文件夹整个拖入 /Applications 目录下。 运行Aria2,继续在Terminal输入: aria2c * 如果第二步中的文件放置的位置没问题那么aria2c应该已经启动了,看aria2c 是否启动的办法是Terminal中输入: ps aux|grep aria2c * 出现图片中第三行的结果说明aria2c已经正常启动,如果无法正常启动,检查第二步中各种文件的位置是否正确 [![](https://www.huangbowei.com/wp-content/uploads/2016/06/ps-auxgrep-aria2c.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/ps-auxgrep-aria2c.png) * 通过webui-aria2控制Aria2 aria2是基于命令行的下载工具,不过还好大神们早已开发了各种易用的UI方便我们小白使用,最常用的: [Aria2 WebUI](http://ziahamza.github.io/webui-aria2/)、[Yet Another Aria2 Web Frontend](http://binux.github.io/yaaw/demo/)。最简便的方法是直接打开以上网站然后设置主机为[code]代码localhost[/code]会自动连接(爱折腾的可以到 [webui-aria2](https://github.com/ziahamza/webui-aria2) 或 [yaaw](https://github.com/binux/yaaw) 下载所需文件自己搭建server)。 下面以webui-aria2为例:打开 [http://ziahamza.github.io/webui-aria2/ ](http://ziahamza.github.io/webui-aria2/)出现以下结果说明webui和Aria2已经连接成功。 [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUI.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUI.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIConfig.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIConfig.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload2.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload2.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload3.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload3.png) [![](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload4.png)](https://www.huangbowei.com/wp-content/uploads/2016/06/aria2WebUIDownload4.png) 如果连接不成功可以打开网页上方设置,查看主机是否为localhost,或者端口是否是6800。到这里就可以在webui中添加链接或者种子开始满速下载啦。 #### 3.2 Aria2 for Windows ##### 3.2.1 懒人版 — Aria2GUI(网页版,推荐) 首先下载网盘相关文件,详见网盘Aria2 for Windows。其中aria2.rar这个文件一定要解压在D:\aria2这个文件夹里,即D:\aria2\里面不能再有文件夹了,然后在D盘根目录建立一个Downloads的文件夹,这个文件夹就是你下载的文件存放的地方,不要把文件的名字搞错了(如果想要更改目录的,需要修改2个文件里面的内容,一个是aria2.conf,一个是HideRun.vbs,修改里面的D:为你的磁盘就好); 进入D:\aria2\里面,双击HideRun.vbs这个文件,电脑不会有任何反应,因为运行窗口被屏蔽掉了,这时你进入任务管理器可以看到aria2c.exe这个进程正在运行。如果想开机自行启动,请看折腾版。 然后找到 `aria2网页版.zip`,将这个文件在任意位置解压缩,然后双击index.html这个文件,你的默认浏览器就会打开一个网页,这个网页就是控制aria2这个软件的界面,这是中文界面。然后把他加入浏览器的收藏夹即可,不必每次都找到文件夹再点击打开。 同样必须安装浏览器插件,才能使用,网盘中的plugin就有。这样就可以下载百度云,迅雷离线中的资源,下载速度很快,而且占用的电脑资源小,但是设置有一点点复杂。 ##### 3.2.2 折腾版 (不推荐) * aria2 Github下载(注意32与64位) 下载地址:[aria2 1.30.0](https://github.com/aria2/aria2/releases/tag/release-1.30.0) * 安装 把下载好的文件解压后找一个英文路径的放进去就ok了,我就放在D:\Program Files\aria2\下 接下来新建几个文件: Aria2.log (日志,空文件就行) aria2.session (下载历史,空文件就行) aria2.conf (配置文件) HideRun.vbs (隐藏cmd窗口运行用到的) 配置aria2.conf,用文本编辑工具打开刚才建立的aria2.conf,复制按下面的内容,注意修改以下选项: dir=D:\Downloads\ (下载文件保存路径,改为你想要的) log=D:\Program Files\aria2\Aria2.log (日志文件,如果不需要日志,这一行可去掉,如果需要,路径D:\Program Files\aria2\改为你安装aria2的路径) input-file=D:\Program Files\aria2\aria2.session save-session=D:\Program Files\aria2\aria2.session(这两个是记录和读取下载历史用的,断电和重启时保证下载任务不会丢失,如果有时aria2不能启动,清空这里面的内容就行了,路径D:\Program Files\aria2\改为你安装aria2的路径) 完整版配置文件:dir=D:\Downloads\ log=D:\Program Files\aria2\Aria2.log input-file=D:\Program Files\aria2\aria2.session save-session=D:\Program Files\aria2\aria2.session save-session-interval=60 force-save=true log-level=error see — split optionmax-concurrent-downloads=5 continue=true max-overall-download-limit=0 max-overall-upload-limit=50K max-upload-limit=20 Http/FTP optionsconnect-timeout=120 lowest-speed-limit=10K max-connection-per-server=10 max-file-not-found=2 min-split-size=1M split=5 check-certificate=false http-no-cache=true FTP Specific OptionsBT/PT Settingbt-enable-lpd=true #bt-max-peers=55 follow-torrent=true enable-dht6=false bt-seed-unverified rpc-save-upload-metadata=true bt-hash-check-seed bt-remove-unselected-file bt-request-peer-speed-limit=100K seed-ratio=0.0 Metalink Specific OptionsRPC Optionsenable-rpc=true pause=false rpc-allow-origin-all=true rpc-listen-all=true rpc-save-upload-metadata=true rpc-secure=false Advanced Optionsdaemon=true disable-ipv6=true enable-mmap=true file-allocation=falloc max-download-result=120 #no-file-allocation-limit=32M force-sequential=true parameterized-uri=true 实现开机无cmd窗口启动用文本编辑工具打开刚才建立的HideRun.vbs 复制以下内容,注意修改D:\Progra~1\aria2\ 为你的aria2安装路径。 CreateObject(“WScript.Shell”).Run “D:\Progra~1\aria2\aria2c.exe — conf-path=aria2.conf”,0 要启动aria2,一定要点击这个文件,不要点击aria2c.exe如果要开机启动,创建一个HideRun.vbs的快捷方式,把快捷方式放到 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup中 管理界面aria2是命令行下载器,是没有界面的,不过有webui,最简单就是直接访问在线网址就行了: Aria2 WebUI ghostry Aria2 WebUI ziahamza Aria2 Web控制台 4.进阶运用(浏览器插件) 1.YAAW for Chrome点击YAAW图标便会出现YAAW的管理界面,设置好 JSON-RPC Path即可. 如果Chrome设置了下载之前不询问下载位置的话,可以自动取消Chrome下载 使用Aria2c下载. 可以设置多大的文件使用导出下载,小文件使用Chrome自带的下载功能,拦截下载默认使用第一个RPC地址. 开启右键菜单之后任意链接都可以右键导出到YAAW进行下载. 2.QQ旋风网页版离线下载增强 :UI精简Aria2命令/文件导出Aria2 RPCIDM文件导出Orbit文件导出自动登录magnet链接支持bt任务文件夹折叠限速解除 3.BaiduPanDownloadHelper:批量导出百度盘的下载链接支持2层目录支持个人主页、分享文件夹或单文件、分享专辑页面、分享主页支持复制到剪贴板、复制为 Aria2 格式、YAAW 4.ThunderLixianExporter将迅雷离线地址导出成aria2/wget等下载命令,方便Linux/Mac用户使用原生导出界面整合, 原生设置界面整合反文件名截断多种可扩展的导出器(aria2/aria2-rpc/wget/IDM/Orbit)云点播HTML5播放,导出直接输出选中的链接,配合FlashGot/DownThemAll使用 4.115网盘下载 部分内容参考自:bbs.feng.com/read-htm-tid-9585996.html]]></content>
</entry>
<entry>
<title><![CDATA[macOS Sierra下载地址]]></title>
<url>%2F2016%2F06%2F17%2F85%2F</url>
<content type="text"><![CDATA[天生爱折腾,ios10还是比较好下载的,WWDC2016刚结束,网上一就一大堆教程,然而macOS Sierra苹果官方就没有给出下载地址了,还要开发者帐号登录,然而我的只能下到Xcode 8beta版(木有叫800大洋的开发者费用)。然后上网看啦下,资源几乎没有,都是说如何更新macOS Sierra,然而写着下载地址稍后更新(我选择狗带)。 经过不懈努力,找到一个国外下载地址了,而且这个版本的macOS DP不需要开发者账号即可使用。正在挂代理下载中,不挂代理0KB的速度也是醉了。(还好我学会一门新技术,Aria2.从此摆脱限速云与会员雷,下载满速无限制!!!) 地址稍后等待我下载好后上传至国内网盘,目测是数字云盘,因为限速云有文件4GB限制,我开不起高贵的会员。大家耐心等待下,代理不稳定,下载2MB/s,速度还好,不过有时候不稳定。(中午左右应该可以搞定,等下大学狗还要去上人生中的最后一节课!!!) 吃完饭回来,已经下载好。正在校检MD5、SHA1等。幸运的是全部一致!大家下载好后请对照下面,如果不一致请删除重新下载!不然会有致命错误。 大小: 5, 020, 229, 976 字节 MD5: 3635505EC428B062FADB15C63C14E95E SHA1: F8B4C16E4C3EA376B1D04A30F6E1D223FE327E16 CRC32: 2B044DF5 [url href=http://dl.huangbowei.com/macOS_Sierra_Beta1.torrent]点击下载macOS_Sierra种子文件[/url] 数字云盘下载地址:[file][reply] 访问密码 293a[/reply] 如果需要制作优盘,请往下看: 下载dmg文件。 挂载/打开dmg文件。 右击dmg里面的app文件,选择“显示包内容” 在 /Contents/SharedSupport/ 里找到InstallESD.dmg。 在InstallESD.dmg里,找到BaseSystem.dmg。这个文件是隐藏的。如果要显示隐藏文件,打开OS X的终端,粘贴defaults write com.apple.finder AppleShowAllFiles YES然后按下回车。按下Option键,右击Dock上的Finder图标,选择重新启动Finder。如果要隐藏隐藏文件,打开OS X 终端,粘贴defaults write com.apple.finder AppleShowAllFiles NO然后按下回车。按下Option键,右击Dock上的Finder图标,选择重新启动Finder。 打开苹果自带的磁盘工具/Disk Utility,然后将BaseSystem.dmg展开到你的优盘上。优盘的分区图应该是GUID,分区格式应该是OS X扩展(日志)/ OS X Extended (Journaled)或者HFS+。 在InstallESD.dmg里,拷贝 /Packages 文件夹到你优盘里的 /System/Installation 文件夹,覆盖里面的快捷方式。 在InstallESD.dmg里,拷贝BaseSystem.dmg和BaseSystem.chunklist到优盘的根目录。必须要拷贝BaseSystem.dmg和BaseSystem.chunklist,不然安装程序将无法开始。两个文件都是隐藏文件。 大功告成!文章参考:bbs.feng.com/read-htm-tid-10567445.html]]></content>
</entry>
<entry>
<title><![CDATA[macOS Sierra下载地址]]></title>
<url>%2F2016%2F06%2F17%2F85-1%2F</url>
<content type="text"><![CDATA[天生爱折腾,ios10还是比较好下载的,WWDC2016刚结束,网上一就一大堆教程,然而macOS Sierra苹果官方就没有给出下载地址了,还要开发者帐号登录,然而我的只能下到Xcode 8beta版(木有叫800大洋的开发者费用)。然后上网看啦下,资源几乎没有,都是说如何更新macOS Sierra,然而写着下载地址稍后更新(我选择狗带)。 经过不懈努力,找到一个国外下载地址了,而且这个版本的macOS DP不需要开发者账号即可使用。正在挂代理下载中,不挂代理0KB的速度也是醉了。(还好我学会一门新技术,Aria2.从此摆脱限速云与会员雷,下载满速无限制!!!) 地址稍后等待我下载好后上传至国内网盘,目测是数字云盘,因为限速云有文件4GB限制,我开不起高贵的会员。大家耐心等待下,代理不稳定,下载2MB/s,速度还好,不过有时候不稳定。(中午左右应该可以搞定,等下大学狗还要去上人生中的最后一节课!!!) 吃完饭回来,已经下载好。正在校检MD5、SHA1等。幸运的是全部一致!大家下载好后请对照下面,如果不一致请删除重新下载!不然会有致命错误。 大小: 5, 020, 229, 976 字节 MD5: 3635505EC428B062FADB15C63C14E95E SHA1: F8B4C16E4C3EA376B1D04A30F6E1D223FE327E16 CRC32: 2B044DF5 [url href=http://dl.huangbowei.com/macOS_Sierra_Beta1.torrent]点击下载macOS_Sierra种子文件[/url] 数字云盘下载地址:[file][reply] 访问密码 293a[/reply] 如果需要制作优盘,请往下看: 下载dmg文件。 挂载/打开dmg文件。 右击dmg里面的app文件,选择“显示包内容” 在 /Contents/SharedSupport/ 里找到InstallESD.dmg。 在InstallESD.dmg里,找到BaseSystem.dmg。这个文件是隐藏的。如果要显示隐藏文件,打开OS X的终端,粘贴defaults write com.apple.finder AppleShowAllFiles YES然后按下回车。按下Option键,右击Dock上的Finder图标,选择重新启动Finder。如果要隐藏隐藏文件,打开OS X 终端,粘贴defaults write com.apple.finder AppleShowAllFiles NO然后按下回车。按下Option键,右击Dock上的Finder图标,选择重新启动Finder。 打开苹果自带的磁盘工具/Disk Utility,然后将BaseSystem.dmg展开到你的优盘上。优盘的分区图应该是GUID,分区格式应该是OS X扩展(日志)/ OS X Extended (Journaled)或者HFS+。 在InstallESD.dmg里,拷贝 /Packages 文件夹到你优盘里的 /System/Installation 文件夹,覆盖里面的快捷方式。 在InstallESD.dmg里,拷贝BaseSystem.dmg和BaseSystem.chunklist到优盘的根目录。必须要拷贝BaseSystem.dmg和BaseSystem.chunklist,不然安装程序将无法开始。两个文件都是隐藏文件。 大功告成!文章参考:bbs.feng.com/read-htm-tid-10567445.html]]></content>
</entry>
<entry>
<title><![CDATA[Windows下iOS开发环境搭建教程]]></title>
<url>%2F2016%2F06%2F15%2F84-1%2F</url>
<content type="text"><![CDATA[可能许多初学者并没有Mac,这电脑太贵,便宜的也要6000多,所以用手头上的Windows电脑开发IOS也是比较经济的方式了,当然等到真正走这行,进入工作,最好还是买一台Mac,除非公司会配一台给你。Windows环境下开发IOS有一下2种方式,这篇文章我介绍第一种方法: 最简单的安装虚拟机跑Mac。优点:经济、简单、方便,利用现有电脑就可以。缺点:性能不足,打开软件缓慢略微有点不兼容等,因为需要同时运行2个操作系统; 黑苹果安装。Windows安装双系统,一个Windows,一个Macos。优点:充分发挥手中电脑,性能比较好,因为一次只运行一个操作系统,接近Mac。缺点:安装难度大,不同电脑安装教程都不同,我曾经研究过一个暑假,但是自己家的台式电脑处理器不兼容,没办法搞定。然后帮另一个学习IOS开发的朋友搞定,记得他是一台联想黑色的2013年左右的电脑(电脑越大众越好安装)。 1.下载工具 VMware-workstation-full-12.1.0 Mac OS X 10.11 unlocker206(for OS X 插件补丁) Xcode 7.2 darwin6.0.3.iso下载地址:[file] [reply] 密码:gjac [/reply] 2.安装基本文件 安装vmware workstation 12,一直下一步即可。 在下载文件中,有一个key.txt,打开输入其中的许可证密钥即可激活。 右键以管理员身份运行unlocker206\win-install.cmd,等待运行完即可。 按下图操作创建虚拟机OS X 10.11。 3.开始主要步骤 按照下图编辑虚拟机设置,加载Mac OS X 10.11镜像文件OS X 10.11.1(15B42).cdr 打开虚拟机配置文件OS X 10.11.vmx,在smc.present = “TRUE”行后增加:smc.version = 0按下图操作安装Mac OS X 10.11如下图设置主机与虚拟机共享目录。如下图安装VMware Tools 4.总结安装虚拟机开发IOS算是一个比较好的方法了,相比于安装黑苹果来说简直小儿科,大家安装好后可以装13,可以开发,可以尝试下macOS的魅力,然后会发现与Windows的与众不同。 文章参考:www.xiaoboswift.com]]></content>
</entry>
<entry>
<title><![CDATA[Windows下iOS开发环境搭建教程]]></title>
<url>%2F2016%2F06%2F15%2F84%2F</url>
<content type="text"><![CDATA[可能许多初学者并没有Mac,这电脑太贵,便宜的也要6000多,所以用手头上的Windows电脑开发IOS也是比较经济的方式了,当然等到真正走这行,进入工作,最好还是买一台Mac,除非公司会配一台给你。Windows环境下开发IOS有一下2种方式,这篇文章我介绍第一种方法: 最简单的安装虚拟机跑Mac。优点:经济、简单、方便,利用现有电脑就可以。缺点:性能不足,打开软件缓慢略微有点不兼容等,因为需要同时运行2个操作系统; 黑苹果安装。Windows安装双系统,一个Windows,一个Macos。优点:充分发挥手中电脑,性能比较好,因为一次只运行一个操作系统,接近Mac。缺点:安装难度大,不同电脑安装教程都不同,我曾经研究过一个暑假,但是自己家的台式电脑处理器不兼容,没办法搞定。然后帮另一个学习IOS开发的朋友搞定,记得他是一台联想黑色的2013年左右的电脑(电脑越大众越好安装)。 1.下载工具 VMware-workstation-full-12.1.0 Mac OS X 10.11 unlocker206(for OS X 插件补丁) Xcode 7.2 darwin6.0.3.iso下载地址:[file] [reply] 密码:gjac [/reply] 2.安装基本文件 安装vmware workstation 12,一直下一步即可。 在下载文件中,有一个key.txt,打开输入其中的许可证密钥即可激活。 右键以管理员身份运行unlocker206\win-install.cmd,等待运行完即可。 按下图操作创建虚拟机OS X 10.11。 3.开始主要步骤 按照下图编辑虚拟机设置,加载Mac OS X 10.11镜像文件OS X 10.11.1(15B42).cdr 打开虚拟机配置文件OS X 10.11.vmx,在smc.present = “TRUE”行后增加:smc.version = 0按下图操作安装Mac OS X 10.11如下图设置主机与虚拟机共享目录。如下图安装VMware Tools 4.总结安装虚拟机开发IOS算是一个比较好的方法了,相比于安装黑苹果来说简直小儿科,大家安装好后可以装13,可以开发,可以尝试下macOS的魅力,然后会发现与Windows的与众不同。 文章参考:www.xiaoboswift.com]]></content>
</entry>
<entry>
<title><![CDATA[苹果iOS10开发者预览版Beta1新特性:支持卸载部分系统应用]]></title>
<url>%2F2016%2F06%2F14%2F83%2F</url>
<content type="text"><![CDATA[和以往一样,苹果公司在WWDC2016首日开幕主题演讲结束之后,正式放出iOS10开发者预览版Beta1,而公测版将在7月份到来,最终正式版将随着iPhone7/Plus在今年秋季正式登场。 现在已经有网友通过安装iOS10开发者预览版描述文件的方式抢先体验上了iOS10(直接使用Safari浏览器打开对应描述文件,安装并重启后,直接在系统更新下检查并下载安装更新即可。),并发现了苹果未在发布会上提及的一项新功能,那就是部分系统应用的卸载,直接在图标上长按之后,可删除的系统应用左上角也会出现“X”号,不过一些诸如电话、信息等核心应用默认不支持卸载,也避免了误删带来的系统崩溃等意外情况。 可隐藏(卸载)应用如下: 计算器,日历、指南针、通讯录、家庭系统、iCloud、邮件、地图、音乐、笔记、播客、提醒、股票、建议、视频、语音备忘、天气、手表、iBooks。 原文链接:www.ithome.com/html/ios/233115.htm]]></content>
</entry>
<entry>
<title><![CDATA[苹果iOS10开发者预览版Beta1新特性:支持卸载部分系统应用]]></title>
<url>%2F2016%2F06%2F14%2F83-1%2F</url>
<content type="text"><![CDATA[和以往一样,苹果公司在WWDC2016首日开幕主题演讲结束之后,正式放出iOS10开发者预览版Beta1,而公测版将在7月份到来,最终正式版将随着iPhone7/Plus在今年秋季正式登场。 现在已经有网友通过安装iOS10开发者预览版描述文件的方式抢先体验上了iOS10(直接使用Safari浏览器打开对应描述文件,安装并重启后,直接在系统更新下检查并下载安装更新即可。),并发现了苹果未在发布会上提及的一项新功能,那就是部分系统应用的卸载,直接在图标上长按之后,可删除的系统应用左上角也会出现“X”号,不过一些诸如电话、信息等核心应用默认不支持卸载,也避免了误删带来的系统崩溃等意外情况。 可隐藏(卸载)应用如下: 计算器,日历、指南针、通讯录、家庭系统、iCloud、邮件、地图、音乐、笔记、播客、提醒、股票、建议、视频、语音备忘、天气、手表、iBooks。 原文链接:www.ithome.com/html/ios/233115.htm]]></content>
</entry>
<entry>
<title><![CDATA[苹果iOS10全新官方壁纸下载]]></title>
<url>%2F2016%2F06%2F14%2F82%2F</url>
<content type="text"><![CDATA[苹果今天在WWDC2016大会上发布了最新的iOS10系统,新的系统除了一大波功能更新之外,还带来了一张全新的壁纸。 这张新壁纸展示了巨大的海浪,整体风格跟此前iOS9(点击这里下载ios9自带壁纸)的自带壁纸相一致.iOS10的一些主要更新包括锁屏界面重新设计、删除预装应用、Siri向开发者开放SDK、相册应用新增场景识别、苹果地图升级等。iOS10壁纸下载:[reply][file][/reply]]]></content>
</entry>
<entry>
<title><![CDATA[苹果iOS10全新官方壁纸下载]]></title>
<url>%2F2016%2F06%2F14%2F82-1%2F</url>
<content type="text"><![CDATA[苹果今天在WWDC2016大会上发布了最新的iOS10系统,新的系统除了一大波功能更新之外,还带来了一张全新的壁纸。 这张新壁纸展示了巨大的海浪,整体风格跟此前iOS9(点击这里下载ios9自带壁纸)的自带壁纸相一致.iOS10的一些主要更新包括锁屏界面重新设计、删除预装应用、Siri向开发者开放SDK、相册应用新增场景识别、苹果地图升级等。iOS10壁纸下载:[reply][file][/reply]]]></content>
</entry>
<entry>
<title><![CDATA[苹果iOS10开发者预览版Beta1固件下载大全]]></title>
<url>%2F2016%2F06%2F14%2F81%2F</url>
<content type="text"><![CDATA[可惜我身边没有ios设备,不然必须肯定的得刷一波高贵ios10,因为在WWDC 2016上,苹果将几乎三分之二的时间留给了iOS10,iOS10也不负众望,带来了10项重大革新,而且其中很多新功能几乎是为中国用户量身打造,可以说iOS10是史上最接中国地气的国外研发操作系统。现在为大家带来了iOS10开发者预览版Beta1的IPSW格式固件下载大全。 值得注意的是,今年的iOS10固件明显进行了合并,不再像此前一样每款设备都有自己的单独固件,看上去简洁清爽不少。除了官方提到的十项提升外, 网友们还陆续在iOS10中发现了部分系统应用可卸载、App Store支持免费试用付费APP等最新特性,如果你在体验的过程中发现了一些新特性,也不妨通过投稿功能与IT之家的网友们一起分享。 需要特别提醒的是,iOS10首个开发者预览版必然会存在不少的Bug以及兼容性问题,因此大家尽量不要在自己的主力设备上进行尝试,如果非要更新体验,请务必提前用iCloud或iTunes做好备份,以防万一。 1、固件下载:苹果iOS10开发者预览版Beta1固件下载大全(国外镜像网站下载地址,官方地址稍后更新): • iPhone5/iPhone5c • iPhone5s • iPhone SE • iPhone6/6s • iPhone6 Plus/6s Plus • iPad 4 • iPad Air/iPad mini 2 • iPad mini 4/iPad Air 2/iPad mini 3 • iPad Pro 9.7 • iPad Pro 12.9 • iPod Touch 6(暂无) • Apple TV tvOS:点此下载 OTA更新描述文件: • iOS • watchOS • tvOS 2、兼容设备列表iOS10 支持的iPhone将从iPhone5起跳,包括iPhone5c、iPhone5s、iPhone SE、iPhone6/Plus、iPhone6s/Plus;而iPad方面,iPad 2和iPad 3(The New iPad)惨被抛弃,仅支持iPad 4、iPad Air、iPad Air 2、iPad Pro(9.7/12.9)、iPad mini 2、iPad mini 3、iPad mini 4,iPod方面仅有iPod Touch 6一款设备。 3、更新说明1、iTunes升级:在桌面端打开最新版iTunes,同时按下“Shift+更新”选取将要刷入的固件,下面的动作交给苹果就好了; 2、描述文件OTA更新:直接使用Safari浏览器打开对应描述文件,安装并重启后,直接在系统更新下检查并下载安装更新即可。 大家尽量不要在自己的主力设备上进行尝试,如果非要更新体验,请务必提前用iCloud或iTunes做好备份,以防万一! 原文地址:www.ithome.com/html/iphone/233119.htm]]></content>
</entry>
<entry>
<title><![CDATA[苹果iOS10开发者预览版Beta1固件下载大全]]></title>
<url>%2F2016%2F06%2F14%2F81-1%2F</url>
<content type="text"><![CDATA[可惜我身边没有ios设备,不然必须肯定的得刷一波高贵ios10,因为在WWDC 2016上,苹果将几乎三分之二的时间留给了iOS10,iOS10也不负众望,带来了10项重大革新,而且其中很多新功能几乎是为中国用户量身打造,可以说iOS10是史上最接中国地气的国外研发操作系统。现在为大家带来了iOS10开发者预览版Beta1的IPSW格式固件下载大全。 值得注意的是,今年的iOS10固件明显进行了合并,不再像此前一样每款设备都有自己的单独固件,看上去简洁清爽不少。除了官方提到的十项提升外, 网友们还陆续在iOS10中发现了部分系统应用可卸载、App Store支持免费试用付费APP等最新特性,如果你在体验的过程中发现了一些新特性,也不妨通过投稿功能与IT之家的网友们一起分享。 需要特别提醒的是,iOS10首个开发者预览版必然会存在不少的Bug以及兼容性问题,因此大家尽量不要在自己的主力设备上进行尝试,如果非要更新体验,请务必提前用iCloud或iTunes做好备份,以防万一。 1、固件下载:苹果iOS10开发者预览版Beta1固件下载大全(国外镜像网站下载地址,官方地址稍后更新): • iPhone5/iPhone5c • iPhone5s • iPhone SE • iPhone6/6s • iPhone6 Plus/6s Plus • iPad 4 • iPad Air/iPad mini 2 • iPad mini 4/iPad Air 2/iPad mini 3 • iPad Pro 9.7 • iPad Pro 12.9 • iPod Touch 6(暂无) • Apple TV tvOS:点此下载 OTA更新描述文件: • iOS • watchOS • tvOS 2、兼容设备列表iOS10 支持的iPhone将从iPhone5起跳,包括iPhone5c、iPhone5s、iPhone SE、iPhone6/Plus、iPhone6s/Plus;而iPad方面,iPad 2和iPad 3(The New iPad)惨被抛弃,仅支持iPad 4、iPad Air、iPad Air 2、iPad Pro(9.7/12.9)、iPad mini 2、iPad mini 3、iPad mini 4,iPod方面仅有iPod Touch 6一款设备。 3、更新说明1、iTunes升级:在桌面端打开最新版iTunes,同时按下“Shift+更新”选取将要刷入的固件,下面的动作交给苹果就好了; 2、描述文件OTA更新:直接使用Safari浏览器打开对应描述文件,安装并重启后,直接在系统更新下检查并下载安装更新即可。 大家尽量不要在自己的主力设备上进行尝试,如果非要更新体验,请务必提前用iCloud或iTunes做好备份,以防万一! 原文地址:www.ithome.com/html/iphone/233119.htm]]></content>
</entry>
<entry>
<title><![CDATA[WWDC2016简报]]></title>
<url>%2F2016%2F06%2F14%2F80%2F</url>
<content type="text"><![CDATA[作为一个io是程序猿,昨天熬夜看WWDC2016,看到凌晨3点,看的是王自如在熊猫TV的直播。这里给大家简单介绍下大会上4大系统的升级说明。 #### iOS 10iOS10这次拥有10项重大革新,而且其中很多新功能几乎是为中国用户量身打造,可以说iOS10是史上最接中国地气的国外研发操作系统。##### 1、锁屏虽然iOS10的UI设计总体上并没有特别明显的变化,但还是重新设计了锁屏界面,锁屏界面下可以显示更丰富的通知内容,锁屏向右滑动可直接进入拍照界面,左滑则有丰富的插件集成。在锁屏界面上使用3D Touch,可以直接管理通知和各项操作,无需解锁进入系统。##### 2、控制中心iOS10对控制中心作出了巨大改变,首先是改进了UI设计,布局更加合理,功能更加丰富,控制中心支持左右滑动,新增音乐控制中心,使用3D Touch也可以在控制中心实现更多样化的操作。##### 3、Siri开放SDKiOS10中,用户可以直接在Siri中控制第三方应用,比如搜索、查看微信消息,通过Siri呼叫滴滴打车等。首批支持Siri的第三方应用包括,微信、滴滴Uber、Lyft、WhatsApp、Slack、Shutterfly、Pinterest,Runtastic、RunKeeper、Saqure、Spark、Vonage、Skype等应用。##### 4、相册应用iOS10中的相册应用现在加入智能脸部识别和场景识别功能,支持高级搜索功能,也将自动整合元素相近的照片,提供一个记忆功能面板,可以提供基于地图或不同身份的整合显示。并且新增LivePhoto编辑功能。支持自动将相同类型图片创建视频,用户切换音乐之后,视频也会自动适应并给出相应的剪辑;##### 5、苹果地图苹果地图提供了更加清晰的导航界面,支持实时交通信息显示,支持长路途搜索功能,并且支持Car Play;苹果开放苹果地图给开发者,可以集成大众点评订餐、滴滴、UBER叫车等服务。##### 6、Apple Music经常被吐槽难用的Apple Music这次大幅更新了界面,界面更加简洁,提供单独的音乐下载管理面板,底部多了浏览功能,提供全新的歌词面板显示。##### 7、新闻Apple News新增突发新闻推送以及新闻订阅功能。##### 8、Home应用iOS10新增Home统一智能家居管理应用,通过这个应用,智能硬件的开发商基本无需自己研发APP了,使用HomeKit可以管理所有连接iOS的智能硬件。home应用提供场景化功能,也可以在锁屏状态下使用3D Touch呼出面板,快速调整智能家居设备。##### 9、电话功能iOS10电话功能专门为中国用户进行了优化,增加骚扰电话过滤功能,由腾讯安全提供技术支持。联系人功能加强,提供VoIP API,社交软件的联系方式可以直接添加到自带联系人中。##### 10、iMessageiOS10 可以自动识别可以被emoji表情替换的词语,点击即可自动替换成emoji表情。iMessage支持使用触控板来发送信息,Apple Watch新增的触控板同样可以进行类似操作;支持在iMessage中使用Apple Music播放,同时iMessage正式向第三方应用开放,提供独立的程序抽屉以在iMessage中进行调用,可发送的消息不再局限于文本,也可以发 送视频、图片、音乐、各种动图、支付信息,也可以添加各种动态效果;支持发送手写信息。##### 其他除了以上10大更新外,还有iPad版Safari浏览器支持独立分屏功能、加强隐私保护功能等更新。iOS10开发者预览版已经放出,拥有开发者账号的可以下载安装,正式版将在9月发布。 #### macOS SierraOS X成为历史,今后的苹果桌面系统叫macOS,新版的系统名为macOS Sierra,更新的核心就是移动、桌面生态的协同化,让iOS、watchOS和macOS融为一体,形成牢不可破的生态体验。macOS Sierra主要新功能如下:1. macOS支持使用Apple Watch解锁,该功能名为“Auto Unlock(自动解锁)”,佩戴升级watchOS 3后的Apple Watch靠近打在macOS的设备,即可自动解锁该设备。2. macOS新增通用剪贴板功能,macOS与iOS共享剪贴板中内内容并且完全同步,比如你可以在iOS上选择复制,在macOS上进行粘贴,非常方便。3. iCloud Drive也可以在Mac上使用,所有文件在macOS和iOS之间共享,支持自动将旧文件移动到iCloud上,从而释放macOS的空间;4. Siri功能登陆macOS,macOS版Siri同时在Dock栏以及顶部出现,它可以在Finder中搜索文件,可以处理邮件,使用iCloud Drive,播放音乐,从网上查找内容,控制音乐视频播放等等,还可以进行图片搜索,可以使用Siri进行语音回复,甚至可以使用Siri进行网页上的 Apple Pay支付。 #### WatchOS 3watchOS 3系统应用的响应速度更快,是此前的7倍,开启应用无需等待,在Apple Watch上实现应用驻留内存并可以实时预览。watchOS 3采用全新的交互界面设计,配色、排版方案更加丰富,用户可通过滑动进行切换。新界面下误触的几率更低,提供Scribble功能,用户可以通过类似手写的滑动操作完成输入,而且还支持中文输入。watchOS 3还新增了一个动态效果米奇表盘,升级全新健身应用,加入Activity Share功能,支持活动分享,查看好友的运动情况,以及发送互动信息。同时还增加了一款残疾人士专用应用Breathe,可以通过相关设置引导使用者进 行深呼吸,达到平静和放松的目的。在watchOS 3系统下,侧键功能改名为“Dock”按键,按压即可在多个板块之间快速切换,而且第三方应用也可添加Dock面板,长按侧边按键可实现SOS紧急呼叫。此外,watchOS 3开放了大量API,并加入游戏中心、Apple Pay功能,同时也能够直接在Apple Watch上观看视频。#### tvOS新版tvOS内集成的Siri功能进一步增强。如今,Siri可以直接在电视上搜索YouTube视频。新版tvOS将会支持1300个直播频道,并拥有6000多款原生应用。新版的tvOS还将提供单点登录功能,从而消除用户在反复输入身份验证信息的苦恼。苹果还为新版tvOS推出了一款iOS遥控应用。功能和国内很多电视盒子的适配应用一样,用户可将iPhone作为Apple TV遥控器使用,还可以使用iPhone的键盘更加便捷的输入文本。原文链接:www.ithome.com/html/iphone/233120.htm]]></content>
</entry>
<entry>
<title><![CDATA[WWDC2016简报]]></title>
<url>%2F2016%2F06%2F14%2F80-1%2F</url>
<content type="text"><![CDATA[作为一个io是程序猿,昨天熬夜看WWDC2016,看到凌晨3点,看的是王自如在熊猫TV的直播。这里给大家简单介绍下大会上4大系统的升级说明。 #### iOS 10iOS10这次拥有10项重大革新,而且其中很多新功能几乎是为中国用户量身打造,可以说iOS10是史上最接中国地气的国外研发操作系统。##### 1、锁屏虽然iOS10的UI设计总体上并没有特别明显的变化,但还是重新设计了锁屏界面,锁屏界面下可以显示更丰富的通知内容,锁屏向右滑动可直接进入拍照界面,左滑则有丰富的插件集成。在锁屏界面上使用3D Touch,可以直接管理通知和各项操作,无需解锁进入系统。##### 2、控制中心iOS10对控制中心作出了巨大改变,首先是改进了UI设计,布局更加合理,功能更加丰富,控制中心支持左右滑动,新增音乐控制中心,使用3D Touch也可以在控制中心实现更多样化的操作。##### 3、Siri开放SDKiOS10中,用户可以直接在Siri中控制第三方应用,比如搜索、查看微信消息,通过Siri呼叫滴滴打车等。首批支持Siri的第三方应用包括,微信、滴滴Uber、Lyft、WhatsApp、Slack、Shutterfly、Pinterest,Runtastic、RunKeeper、Saqure、Spark、Vonage、Skype等应用。##### 4、相册应用iOS10中的相册应用现在加入智能脸部识别和场景识别功能,支持高级搜索功能,也将自动整合元素相近的照片,提供一个记忆功能面板,可以提供基于地图或不同身份的整合显示。并且新增LivePhoto编辑功能。支持自动将相同类型图片创建视频,用户切换音乐之后,视频也会自动适应并给出相应的剪辑;##### 5、苹果地图苹果地图提供了更加清晰的导航界面,支持实时交通信息显示,支持长路途搜索功能,并且支持Car Play;苹果开放苹果地图给开发者,可以集成大众点评订餐、滴滴、UBER叫车等服务。##### 6、Apple Music经常被吐槽难用的Apple Music这次大幅更新了界面,界面更加简洁,提供单独的音乐下载管理面板,底部多了浏览功能,提供全新的歌词面板显示。##### 7、新闻Apple News新增突发新闻推送以及新闻订阅功能。##### 8、Home应用iOS10新增Home统一智能家居管理应用,通过这个应用,智能硬件的开发商基本无需自己研发APP了,使用HomeKit可以管理所有连接iOS的智能硬件。home应用提供场景化功能,也可以在锁屏状态下使用3D Touch呼出面板,快速调整智能家居设备。##### 9、电话功能iOS10电话功能专门为中国用户进行了优化,增加骚扰电话过滤功能,由腾讯安全提供技术支持。联系人功能加强,提供VoIP API,社交软件的联系方式可以直接添加到自带联系人中。##### 10、iMessageiOS10 可以自动识别可以被emoji表情替换的词语,点击即可自动替换成emoji表情。iMessage支持使用触控板来发送信息,Apple Watch新增的触控板同样可以进行类似操作;支持在iMessage中使用Apple Music播放,同时iMessage正式向第三方应用开放,提供独立的程序抽屉以在iMessage中进行调用,可发送的消息不再局限于文本,也可以发 送视频、图片、音乐、各种动图、支付信息,也可以添加各种动态效果;支持发送手写信息。##### 其他除了以上10大更新外,还有iPad版Safari浏览器支持独立分屏功能、加强隐私保护功能等更新。iOS10开发者预览版已经放出,拥有开发者账号的可以下载安装,正式版将在9月发布。 #### macOS SierraOS X成为历史,今后的苹果桌面系统叫macOS,新版的系统名为macOS Sierra,更新的核心就是移动、桌面生态的协同化,让iOS、watchOS和macOS融为一体,形成牢不可破的生态体验。macOS Sierra主要新功能如下:1. macOS支持使用Apple Watch解锁,该功能名为“Auto Unlock(自动解锁)”,佩戴升级watchOS 3后的Apple Watch靠近打在macOS的设备,即可自动解锁该设备。2. macOS新增通用剪贴板功能,macOS与iOS共享剪贴板中内内容并且完全同步,比如你可以在iOS上选择复制,在macOS上进行粘贴,非常方便。3. iCloud Drive也可以在Mac上使用,所有文件在macOS和iOS之间共享,支持自动将旧文件移动到iCloud上,从而释放macOS的空间;4. Siri功能登陆macOS,macOS版Siri同时在Dock栏以及顶部出现,它可以在Finder中搜索文件,可以处理邮件,使用iCloud Drive,播放音乐,从网上查找内容,控制音乐视频播放等等,还可以进行图片搜索,可以使用Siri进行语音回复,甚至可以使用Siri进行网页上的 Apple Pay支付。 #### WatchOS 3watchOS 3系统应用的响应速度更快,是此前的7倍,开启应用无需等待,在Apple Watch上实现应用驻留内存并可以实时预览。watchOS 3采用全新的交互界面设计,配色、排版方案更加丰富,用户可通过滑动进行切换。新界面下误触的几率更低,提供Scribble功能,用户可以通过类似手写的滑动操作完成输入,而且还支持中文输入。watchOS 3还新增了一个动态效果米奇表盘,升级全新健身应用,加入Activity Share功能,支持活动分享,查看好友的运动情况,以及发送互动信息。同时还增加了一款残疾人士专用应用Breathe,可以通过相关设置引导使用者进 行深呼吸,达到平静和放松的目的。在watchOS 3系统下,侧键功能改名为“Dock”按键,按压即可在多个板块之间快速切换,而且第三方应用也可添加Dock面板,长按侧边按键可实现SOS紧急呼叫。此外,watchOS 3开放了大量API,并加入游戏中心、Apple Pay功能,同时也能够直接在Apple Watch上观看视频。#### tvOS新版tvOS内集成的Siri功能进一步增强。如今,Siri可以直接在电视上搜索YouTube视频。新版tvOS将会支持1300个直播频道,并拥有6000多款原生应用。新版的tvOS还将提供单点登录功能,从而消除用户在反复输入身份验证信息的苦恼。苹果还为新版tvOS推出了一款iOS遥控应用。功能和国内很多电视盒子的适配应用一样,用户可将iPhone作为Apple TV遥控器使用,还可以使用iPhone的键盘更加便捷的输入文本。原文链接:www.ithome.com/html/iphone/233120.htm]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-wordpress等博客平台安装步骤(4)完结]]></title>
<url>%2F2016%2F06%2F11%2F79%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第四篇(中间比较悲催,这篇文章本来已经写好,然后发布的时候出错…草稿也没保存到): 域名已经解析好,大家访问网站可以看到探针,就是一些服务器的基本信息,这时候虚拟机里面还没有东西。我们先用putty登录虚拟机,输入以下命令: cd /root/oneinstack #进入oneinstack目录 ./vhost.sh #添加虚拟主机,按照提示输入网站域名等,官网有详细说明 这时候用Winscp登录到虚拟机,进入以下目录,把下载好的wordpress解压,把里面的所有内容直接拖入以下目录。由于wordpress官网全都被墙,无语,特此提供目前最新版下载:[file] /data/wwwroot/abc.com #进入这个目录,abc.com根据个人设置变化 这时候打开你的网址,就会自动跳转到wordpress安装界面,点击现在就开始! : 进入下一步,填写数据库信息: 不出意外,会报错,这一步90%的人都碰见过,我也不例外,毕竟第一次,看报错说明也很简单,就是wordpress这个数据库不存在,这个好办。(1)安 装过phpMyadmin,输入你的IP加phpMyadmin,例如http://115.123.12.34/phpMyadmin,输入数据库用户 名与密码后,在首页上方单击数据库,然后再下面新建数据库填入wordpress,单击创建就ok(2)未安装phpMyadmin,打开putty,登 录虚拟机,输入mysql -u root -p,然后输入数据库密码,然后输入create database wordpress; 这样就创建好wordpress数据库了。 以上步骤做好后,点击重试 再一次输入数据库账户密码,单击进行安装 : 进入最后一步,输入你网站的基本信息。站点标题、管理员用户名、密码、联系邮箱。大功告成,等待一会儿,再次打开你的网站,就会发现一片神奇的新大陆,从此以后你也是有博客的男人啦! 总结经 历过wordpress的安装,你就学会了一门新套路,因为大部分程序都是这样安装的:下载好安装程序-解压-上传至网站根目录-打开对应网站-自动跳转 至程序安装程序。满满的全是套路。至于博客平台的选择,实在太多,后面有时间给大家介绍下。大家最好从wordpress开始入门,毕竟资料多,上手简 单。 有些人喜欢推荐小白安装面板,也就是图形化管理主机,不需要打代码等等,然而像我这样 的程序猿,啪啪啪的打代码这么爽感,怎么可能会用面板这种东西。其实是因为面板会消耗一定内存,虽然非常小,但是这样毕竟不太好,多动动脑子,动动手。这 里还是要推荐几个比较好的面板(我没用过,从自己研究这么久大家的口碑推荐):1.AMH(4.2以前免费,后面的就是按月收费)。2.Wdcp。]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-wordpress等博客平台安装步骤(4)完结]]></title>
<url>%2F2016%2F06%2F11%2F79-1%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第四篇(中间比较悲催,这篇文章本来已经写好,然后发布的时候出错…草稿也没保存到): 域名已经解析好,大家访问网站可以看到探针,就是一些服务器的基本信息,这时候虚拟机里面还没有东西。我们先用putty登录虚拟机,输入以下命令: cd /root/oneinstack #进入oneinstack目录 ./vhost.sh #添加虚拟主机,按照提示输入网站域名等,官网有详细说明 这时候用Winscp登录到虚拟机,进入以下目录,把下载好的wordpress解压,把里面的所有内容直接拖入以下目录。由于wordpress官网全都被墙,无语,特此提供目前最新版下载:[file] /data/wwwroot/abc.com #进入这个目录,abc.com根据个人设置变化 这时候打开你的网址,就会自动跳转到wordpress安装界面,点击现在就开始! : 进入下一步,填写数据库信息: 不出意外,会报错,这一步90%的人都碰见过,我也不例外,毕竟第一次,看报错说明也很简单,就是wordpress这个数据库不存在,这个好办。(1)安 装过phpMyadmin,输入你的IP加phpMyadmin,例如http://115.123.12.34/phpMyadmin,输入数据库用户 名与密码后,在首页上方单击数据库,然后再下面新建数据库填入wordpress,单击创建就ok(2)未安装phpMyadmin,打开putty,登 录虚拟机,输入mysql -u root -p,然后输入数据库密码,然后输入create database wordpress; 这样就创建好wordpress数据库了。 以上步骤做好后,点击重试 再一次输入数据库账户密码,单击进行安装 : 进入最后一步,输入你网站的基本信息。站点标题、管理员用户名、密码、联系邮箱。大功告成,等待一会儿,再次打开你的网站,就会发现一片神奇的新大陆,从此以后你也是有博客的男人啦! 总结经 历过wordpress的安装,你就学会了一门新套路,因为大部分程序都是这样安装的:下载好安装程序-解压-上传至网站根目录-打开对应网站-自动跳转 至程序安装程序。满满的全是套路。至于博客平台的选择,实在太多,后面有时间给大家介绍下。大家最好从wordpress开始入门,毕竟资料多,上手简 单。 有些人喜欢推荐小白安装面板,也就是图形化管理主机,不需要打代码等等,然而像我这样 的程序猿,啪啪啪的打代码这么爽感,怎么可能会用面板这种东西。其实是因为面板会消耗一定内存,虽然非常小,但是这样毕竟不太好,多动动脑子,动动手。这 里还是要推荐几个比较好的面板(我没用过,从自己研究这么久大家的口碑推荐):1.AMH(4.2以前免费,后面的就是按月收费)。2.Wdcp。]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-域名解析(3)]]></title>
<url>%2F2016%2F06%2F10%2F78%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第三篇: 解释下DNS工作原理(不喜欢看的可以跳过这一步):[s][p] DNS的工作原理及过程分下面几个步骤: 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址。 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。 重复第四步,直到找到正确的纪录。 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。让 我们举一个例子来详细说明解析域名的过程。假设我们的客户机如果想要访问站点: www.apple.com , 此客户本地的域名服务器 是 dns.company.com , 一个根域名服务器是 ns.inter.net ,所要访问的网站的域名服务器 是 dns.apple.com ,域名解析的过程如下所示: 客户机发出请求解析域名 www.apple.com 的报文; 本地的域名服务器收到请求后,查询本地缓存,假设没有该纪录,则本地域名服务器 dns.company.com 则向根域名服务器 ns.inter.net 发出请求解析域名 www.apple.com ; 根 域名服务器 ns.inter.net 收到请求后查询本地记录得到如下结果:apple.com NS dns.apple.com (表 示 apple.com 域中的域名服务器为:dns.apple.com ),同时给出 dns.apple.com 的地址,并将结果返 回给域名服务器 dns.company.com ; 域名服务器 dns.company.com 收到回应后,再发出请求解析域名 www.apple.com的报文; 域 名服务器 dns.apple.com 收到请求后,开始查询本地的记录,找到如下一条记 录: www.apple.com A 211.120.3.12 (表示 apple.com 域中域名服务 器 dns.apple.com 的IP地址为:211.120.3.12),并将结果返回给客户本地域名服务 器 dns.company.com ; 客户本地域名服务器将返回的结果保存到本地缓存,同时将结果返回给客户机。这样就完成了一次域名解析过程。[/p] 解析商选择解析商推荐CloudXNS,之前用的DNSpod,后来发现CloudXNS马上路转粉,功能比较多,也挺人性化的,也比DNSPod稳定。这个大家可以谷歌下或者自己观察。 如何设置域名解析? 首先进入CloudXNS官网,注册帐号。 点击左上角-添加域名,输入你购买的域名; 然后你会看到提示:域名未接管提示 您的域名还未被CloudXNS接管,请在域名注册处将域名的NS服务器修改为我们为您提供的专用NS服务器:NS服务器: lv3ns1.ffdns.net lv3ns2.ffdns.net lv3ns3.ffdns.net lv3ns4.ffdns.net 如果您已经修改为上述NS服务器:可能由于域名服务商或LocalDNS的原因,原NS记录还没有过期需要等待一段时间新NS记录才生效 这时候进入你域名购买服务商,修改DNS服务器设置(这里每个服务商位置不一样,一般在域名基本信息或者设置里面),修改为上面4个,等待5、6分钟,阿里云坑爹的要好久,我睡一觉起来才接管成功。这时候就再也不需要进入阿里云万网那里了,域名解析操作都可以在CloudXns完成。 域名一般是www.huangbowei.com或者huangbowei.com,这时候解析就这样设置(记录值填写你的公网IP):然后Oneinstack一键部署工具添加虚拟主机的时候选择你需要的主域名与副域名就可以。 比如,www.huangbowei.com作为主域名,访问www.huangbowei.com和huangbowei.com都会跳转到www.huangbowei.com; 如果huangbowei.com作为主域名,访问www.huangbowei.com和huangbowei.com都会跳转到huangbowei.com。这个看个人喜好而定。 如果你想要添加一个域名qq.huangbowei.com,则解析如下(记录值填写你的公网IP):]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-域名解析(3)]]></title>
<url>%2F2016%2F06%2F10%2F78-1%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第三篇: 解释下DNS工作原理(不喜欢看的可以跳过这一步):[s][p] DNS的工作原理及过程分下面几个步骤: 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址。 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。 重复第四步,直到找到正确的纪录。 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。让 我们举一个例子来详细说明解析域名的过程。假设我们的客户机如果想要访问站点: www.apple.com , 此客户本地的域名服务器 是 dns.company.com , 一个根域名服务器是 ns.inter.net ,所要访问的网站的域名服务器 是 dns.apple.com ,域名解析的过程如下所示: 客户机发出请求解析域名 www.apple.com 的报文; 本地的域名服务器收到请求后,查询本地缓存,假设没有该纪录,则本地域名服务器 dns.company.com 则向根域名服务器 ns.inter.net 发出请求解析域名 www.apple.com ; 根 域名服务器 ns.inter.net 收到请求后查询本地记录得到如下结果:apple.com NS dns.apple.com (表 示 apple.com 域中的域名服务器为:dns.apple.com ),同时给出 dns.apple.com 的地址,并将结果返 回给域名服务器 dns.company.com ; 域名服务器 dns.company.com 收到回应后,再发出请求解析域名 www.apple.com的报文; 域 名服务器 dns.apple.com 收到请求后,开始查询本地的记录,找到如下一条记 录: www.apple.com A 211.120.3.12 (表示 apple.com 域中域名服务 器 dns.apple.com 的IP地址为:211.120.3.12),并将结果返回给客户本地域名服务 器 dns.company.com ; 客户本地域名服务器将返回的结果保存到本地缓存,同时将结果返回给客户机。这样就完成了一次域名解析过程。[/p] 解析商选择解析商推荐CloudXNS,之前用的DNSpod,后来发现CloudXNS马上路转粉,功能比较多,也挺人性化的,也比DNSPod稳定。这个大家可以谷歌下或者自己观察。 如何设置域名解析? 首先进入CloudXNS官网,注册帐号。 点击左上角-添加域名,输入你购买的域名; 然后你会看到提示:域名未接管提示 您的域名还未被CloudXNS接管,请在域名注册处将域名的NS服务器修改为我们为您提供的专用NS服务器:NS服务器: lv3ns1.ffdns.net lv3ns2.ffdns.net lv3ns3.ffdns.net lv3ns4.ffdns.net 如果您已经修改为上述NS服务器:可能由于域名服务商或LocalDNS的原因,原NS记录还没有过期需要等待一段时间新NS记录才生效 这时候进入你域名购买服务商,修改DNS服务器设置(这里每个服务商位置不一样,一般在域名基本信息或者设置里面),修改为上面4个,等待5、6分钟,阿里云坑爹的要好久,我睡一觉起来才接管成功。这时候就再也不需要进入阿里云万网那里了,域名解析操作都可以在CloudXns完成。 域名一般是www.huangbowei.com或者huangbowei.com,这时候解析就这样设置(记录值填写你的公网IP):然后Oneinstack一键部署工具添加虚拟主机的时候选择你需要的主域名与副域名就可以。 比如,www.huangbowei.com作为主域名,访问www.huangbowei.com和huangbowei.com都会跳转到www.huangbowei.com; 如果huangbowei.com作为主域名,访问www.huangbowei.com和huangbowei.com都会跳转到huangbowei.com。这个看个人喜好而定。 如果你想要添加一个域名qq.huangbowei.com,则解析如下(记录值填写你的公网IP):]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-购买虚拟主机并搭建(2)]]></title>
<url>%2F2016%2F06%2F10%2F77%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第二篇: 虚拟主机选择域名有了,接下来要有主体,一个虚拟主机,可以让你的博客或者网站放在虚拟主机上“跑”起来。域名就好比车牌号,虚拟主机就好比发动机。 虚拟主机大致分2种。国内虚拟主机与国外VPS。价格的话从几块到几千一个月不等,相差比较大,因为厂商搞活动,有些时候还免费送,充多少钱送多少钱。国内虚拟主机价格普遍比国外VPS高。 国内便宜的主机建议大家不要购买,空间大小、数据库大小以及带宽流量都非常有限,即使是国外的无限主机在CPU使用率和文件个数方面也是有限制的,而且大部分便宜的虚拟主机都是公用IP,容易受到同虚拟主机网站的牵连,当然这个可以通过购买独立IP解决。想要玩一玩那就随便,真的想要写好一个博客还是选择阿里云、腾讯云(学生认证后1元可得65元每月的虚拟主机)等大厂商的服务比较好。(国内访问速度快,需要备案,手续繁琐) 国外VPS性价比也不错,搬瓦工、Linode、Vultr等都可以选择,买VPS不仅可以搭建网站,还可以科学上网,你懂的,满足你的特殊需求。(国内访问速度一般,无需备案,方便快捷) 虚拟主机搭建环境一键部署工具选择虚拟主机买好后,可以进行以下步骤,大家一步一步来: 系统选择Centos7比较好,Centos稳定性高,遇到问题查阅资料方便,Debian占用内存等资源少,但是遇到问题查找资料没有Centos方便。 连接虚拟主机参考我之前写的文章: 连接虚拟主机终端:分享下平时我在windows平台下开发用的一些比较好的软件-putty(三) 虚拟主机上传文件:分享下平时我在windows平台下开发用的一些比较好的软件-winscp(四) 接下来就是环境搭建了,需要用到putty。这里介绍搭建wordpress博客环境的搭建,毕竟干不同的事要不同的环境,这里要说明下。以下推荐几个一键部署工具: OneinStack; 军哥的LNMP; lnmp、lamp、lnmpa一键安装包;我一直用的是Oneinstack,因为这个更新快,功能强大,满足我这个强迫症用最新版本软件的需求。1和3是同一个·作者的,一直不懂为什么要出2个,而且里面内容差不多,最近看作者说以后会把3合并进1,只有Oneinstack。2是一些老站长比较推崇的,这个出现的比较早,2009年就有啦!!自然许多人就习惯用LNMP,毕竟情怀。而Oneinstack2015年才开发第一个初始版本。 刚刚看啦下,LNMP最后一次更新在2016年6月1日,上一次在2015年6月1日。。。。,而且据我观察,几乎每个版本都是儿童节左右出来,原来如此,前几个月我看2015年才更新的稳定版,我还以为不会更新了,强迫症的我肯定不会用的,看来作者是稳定一年一更的节奏呀。 开始一键部署根据个人喜好选择好一键部署工具后,安装的话可以上工具网站,有很详细的介绍,我在这里也就不粘贴复制了。不过我在这里贴上我的Oneinstack工具的配置,因为许多小白连Nginx、PHP都不知道是啥,更不用谈如何选择了。 总结服务器环境部署这一块大家可以多多尝试,尝试的越多,明白的就越多,有些问题也就理解的越透彻,当初我的服务器经历过无数次的部署与重装系统!!所以现在才略微了解其中的奥妙。还有,有些人喜欢用面板控制主机,因为图形化界面,容易操作,不需要敲代码,很方便,面板软件有:1、AMH (AMH 4.2 免费,后面的都是按月收费使用的);2、wdCP。不过我从来没有使用过,没有办法评价,作为一个程序猿当然是进终端啪啪啪滴敲代码更爽了,安装面板还占用内存资源,还有Bug。 ]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-购买虚拟主机并搭建(2)]]></title>
<url>%2F2016%2F06%2F10%2F77-1%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第二篇: 虚拟主机选择域名有了,接下来要有主体,一个虚拟主机,可以让你的博客或者网站放在虚拟主机上“跑”起来。域名就好比车牌号,虚拟主机就好比发动机。 虚拟主机大致分2种。国内虚拟主机与国外VPS。价格的话从几块到几千一个月不等,相差比较大,因为厂商搞活动,有些时候还免费送,充多少钱送多少钱。国内虚拟主机价格普遍比国外VPS高。 国内便宜的主机建议大家不要购买,空间大小、数据库大小以及带宽流量都非常有限,即使是国外的无限主机在CPU使用率和文件个数方面也是有限制的,而且大部分便宜的虚拟主机都是公用IP,容易受到同虚拟主机网站的牵连,当然这个可以通过购买独立IP解决。想要玩一玩那就随便,真的想要写好一个博客还是选择阿里云、腾讯云(学生认证后1元可得65元每月的虚拟主机)等大厂商的服务比较好。(国内访问速度快,需要备案,手续繁琐) 国外VPS性价比也不错,搬瓦工、Linode、Vultr等都可以选择,买VPS不仅可以搭建网站,还可以科学上网,你懂的,满足你的特殊需求。(国内访问速度一般,无需备案,方便快捷) 虚拟主机搭建环境一键部署工具选择虚拟主机买好后,可以进行以下步骤,大家一步一步来: 系统选择Centos7比较好,Centos稳定性高,遇到问题查阅资料方便,Debian占用内存等资源少,但是遇到问题查找资料没有Centos方便。 连接虚拟主机参考我之前写的文章: 连接虚拟主机终端:分享下平时我在windows平台下开发用的一些比较好的软件-putty(三) 虚拟主机上传文件:分享下平时我在windows平台下开发用的一些比较好的软件-winscp(四) 接下来就是环境搭建了,需要用到putty。这里介绍搭建wordpress博客环境的搭建,毕竟干不同的事要不同的环境,这里要说明下。以下推荐几个一键部署工具: OneinStack; 军哥的LNMP; lnmp、lamp、lnmpa一键安装包;我一直用的是Oneinstack,因为这个更新快,功能强大,满足我这个强迫症用最新版本软件的需求。1和3是同一个·作者的,一直不懂为什么要出2个,而且里面内容差不多,最近看作者说以后会把3合并进1,只有Oneinstack。2是一些老站长比较推崇的,这个出现的比较早,2009年就有啦!!自然许多人就习惯用LNMP,毕竟情怀。而Oneinstack2015年才开发第一个初始版本。 刚刚看啦下,LNMP最后一次更新在2016年6月1日,上一次在2015年6月1日。。。。,而且据我观察,几乎每个版本都是儿童节左右出来,原来如此,前几个月我看2015年才更新的稳定版,我还以为不会更新了,强迫症的我肯定不会用的,看来作者是稳定一年一更的节奏呀。 开始一键部署根据个人喜好选择好一键部署工具后,安装的话可以上工具网站,有很详细的介绍,我在这里也就不粘贴复制了。不过我在这里贴上我的Oneinstack工具的配置,因为许多小白连Nginx、PHP都不知道是啥,更不用谈如何选择了。 总结服务器环境部署这一块大家可以多多尝试,尝试的越多,明白的就越多,有些问题也就理解的越透彻,当初我的服务器经历过无数次的部署与重装系统!!所以现在才略微了解其中的奥妙。还有,有些人喜欢用面板控制主机,因为图形化界面,容易操作,不需要敲代码,很方便,面板软件有:1、AMH (AMH 4.2 免费,后面的都是按月收费使用的);2、wdCP。不过我从来没有使用过,没有办法评价,作为一个程序猿当然是进终端啪啪啪滴敲代码更爽了,安装面板还占用内存资源,还有Bug。 ]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-购买域名(1)]]></title>
<url>%2F2016%2F06%2F10%2F76%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第一篇: 一个网站想要别人记住,要的不仅是高质量的文章,还要有一个朗朗上口的域名,让别人愿意访问,容易记住,购买域名,推荐狗爹(godaddy),因为经常有优惠。不过现在的话,阿里云的万网、DNSPod、西部数码都可以购买,毕竟国内服务商比较方便,价格也贵不到哪里。(注意事项,许多域名第一年免费或者几块钱,大家不要贪图便宜,得看下续费价格,一般这种域名续费价格高昂,几百不等。一年后,如果你玩玩而已还好,就不续费或者换一个,如果你的网站做的还不错,这时候更换域名就没这么容易了。) 付款方式的话国内域名商一般都支持微信支付,支付宝支付等接地气的方式,很方便,国外的话情况不一样,一般信用卡或paypal,不适合小白。 购买的话流程都一样,输入你想要的域名,如果没人注册,你可以进行下一步,如果已经被注册,那就得换过一个重新验证。然后填好你的个人信息,最好填真实的,然后付钱,大功告成,也可以设置下开启域名Whois隐私保护,可以在别人查询域名注册者的时候隐藏你的信息。还有域名都是一年一年购买的。.com域名一般50左右一年,每家域名商都不一样。大家也可以购买.vip后缀的域名,只要24元每年,尊贵域名,奢华之选!!详情可以看我之前写的文章启用iosdev.vip域名。 ]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程-购买域名(1)]]></title>
<url>%2F2016%2F06%2F10%2F76-1%2F</url>
<content type="text"><![CDATA[上一回说道:小白搭建博客教程之流程,这次趁着端午节写完它,也算是一个了结。 教程有4篇: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。下面开始第一篇: 一个网站想要别人记住,要的不仅是高质量的文章,还要有一个朗朗上口的域名,让别人愿意访问,容易记住,购买域名,推荐狗爹(godaddy),因为经常有优惠。不过现在的话,阿里云的万网、DNSPod、西部数码都可以购买,毕竟国内服务商比较方便,价格也贵不到哪里。(注意事项,许多域名第一年免费或者几块钱,大家不要贪图便宜,得看下续费价格,一般这种域名续费价格高昂,几百不等。一年后,如果你玩玩而已还好,就不续费或者换一个,如果你的网站做的还不错,这时候更换域名就没这么容易了。) 付款方式的话国内域名商一般都支持微信支付,支付宝支付等接地气的方式,很方便,国外的话情况不一样,一般信用卡或paypal,不适合小白。 购买的话流程都一样,输入你想要的域名,如果没人注册,你可以进行下一步,如果已经被注册,那就得换过一个重新验证。然后填好你的个人信息,最好填真实的,然后付钱,大功告成,也可以设置下开启域名Whois隐私保护,可以在别人查询域名注册者的时候隐藏你的信息。还有域名都是一年一年购买的。.com域名一般50左右一年,每家域名商都不一样。大家也可以购买.vip后缀的域名,只要24元每年,尊贵域名,奢华之选!!详情可以看我之前写的文章启用iosdev.vip域名。 ]]></content>
</entry>
<entry>
<title><![CDATA[腾讯云COS开启FTP功能]]></title>
<url>%2F2016%2F06%2F07%2F75%2F</url>
<content type="text"><![CDATA[我的网站一直用的是腾讯云的COS,图片、JS、CSS等静态资源都存在上面,速度比较理想。但有一个通点:文件管理相当不方便,上传文件虽然说可以支持单文件20G,但是删除文件只能一个一个删除,而且当文件夹里面有文件是还不能删除,只能把文件夹里的东西一个一个删除,然后删除文件夹。有些人或许会说,那就放那里呗,反正不影响,但对于我这个强迫症来说,这个不能忍!!有时候我还真一个一个删除,真苦逼呀。 所以今天上网研究一番,发现网上有用官方API写脚本批量控制的,还不错,还有就是用wp插件的。接下来就是本文的重点,超级无敌方便:申请官方FTP权限管理文件。 步骤: 登录腾讯云官网,进入控制台; 点击右上角:工单-我的工单; 左侧:提交工单-请选择问题分类-存储与CDN-对象存储COS; 然后选择:FTP功能开通。下面填写你想要开通FTP功能的Bucket; 大功告成!审核速度没的说,我得大概7、8分钟就通过了。 到这里,大概的都差不多完成了,剩下的就是去创建FTP账户(对象存储服务-Bucke列表-修改配置-FTP设置),然后用Winscp登录,你就可以看到所有文件了,再也不用每次上传文件都苦逼的登录官网,然后上传,在这里你可以随意操作,当然风险也更大,万一操作失误就白白啦。下面是FTP的一些说明: 客户端配置: 地址:ftp://ftp.file.myqcloud.com 端口号:9421 加密方式:TLS 显式加密(推荐) 或 不加密(不推荐) 连接模式:pasv 被动模式 超时设置:300 秒(建议)功能限制:不支持下载操作。 不支持远程移动、复制和重命名操作。 最大文件限制为 100 MB。 ]]></content>
</entry>
<entry>
<title><![CDATA[腾讯云COS开启FTP功能]]></title>
<url>%2F2016%2F06%2F07%2F75-1%2F</url>
<content type="text"><![CDATA[我的网站一直用的是腾讯云的COS,图片、JS、CSS等静态资源都存在上面,速度比较理想。但有一个通点:文件管理相当不方便,上传文件虽然说可以支持单文件20G,但是删除文件只能一个一个删除,而且当文件夹里面有文件是还不能删除,只能把文件夹里的东西一个一个删除,然后删除文件夹。有些人或许会说,那就放那里呗,反正不影响,但对于我这个强迫症来说,这个不能忍!!有时候我还真一个一个删除,真苦逼呀。 所以今天上网研究一番,发现网上有用官方API写脚本批量控制的,还不错,还有就是用wp插件的。接下来就是本文的重点,超级无敌方便:申请官方FTP权限管理文件。 步骤: 登录腾讯云官网,进入控制台; 点击右上角:工单-我的工单; 左侧:提交工单-请选择问题分类-存储与CDN-对象存储COS; 然后选择:FTP功能开通。下面填写你想要开通FTP功能的Bucket; 大功告成!审核速度没的说,我得大概7、8分钟就通过了。 到这里,大概的都差不多完成了,剩下的就是去创建FTP账户(对象存储服务-Bucke列表-修改配置-FTP设置),然后用Winscp登录,你就可以看到所有文件了,再也不用每次上传文件都苦逼的登录官网,然后上传,在这里你可以随意操作,当然风险也更大,万一操作失误就白白啦。下面是FTP的一些说明: 客户端配置: 地址:ftp://ftp.file.myqcloud.com 端口号:9421 加密方式:TLS 显式加密(推荐) 或 不加密(不推荐) 连接模式:pasv 被动模式 超时设置:300 秒(建议)功能限制:不支持下载操作。 不支持远程移动、复制和重命名操作。 最大文件限制为 100 MB。 ]]></content>
</entry>
<entry>
<title><![CDATA[启用iosdev.vip域名]]></title>
<url>%2F2016%2F06%2F02%2F74-1%2F</url>
<content type="text"><![CDATA[很早就知道一个有全新,尽显贵族、王者、装逼,高大上的顶级域名要发售,所以特地订好日历时间提醒,也就是5月18日。当然,许多大公司早就和明智墨斯(vip后缀域名提供商)签订好协议,什么qq.vip,vip.vip,taobao.vip早就已经归属他们所有,防止恶意抢注域名,保护公司权益。当然,现在恶意抢注已经不好使了,经典案例:weixin.com最后还是归属腾讯微信所有。 不过iosdev.vip这域名我还是5月19号购买的,因为18号当天没找到在哪里购买,当时也忙着别的事,就没买。19号,看群里有人发这个消息,还有购买地址,阿里云的,于是便进去选几个好点的域名备用,现在不用,以后说不定还能投资勒,毕竟不贵,才28元/年,续费30元/年,今天看了下,只要24元!!!西部数码貌似每次都比阿里价格低,只要22,但是相比较起来,阿里毕竟更加大牌,服务什么的更加方便快捷,所以最后还是在阿里入手。 大家可以试一试: http://iosdev.vip ]]></content>
</entry>
<entry>
<title><![CDATA[启用iosdev.vip域名]]></title>
<url>%2F2016%2F06%2F02%2F74%2F</url>
<content type="text"><![CDATA[很早就知道一个有全新,尽显贵族、王者、装逼,高大上的顶级域名要发售,所以特地订好日历时间提醒,也就是5月18日。当然,许多大公司早就和明智墨斯(vip后缀域名提供商)签订好协议,什么qq.vip,vip.vip,taobao.vip早就已经归属他们所有,防止恶意抢注域名,保护公司权益。当然,现在恶意抢注已经不好使了,经典案例:weixin.com最后还是归属腾讯微信所有。 不过iosdev.vip这域名我还是5月19号购买的,因为18号当天没找到在哪里购买,当时也忙着别的事,就没买。19号,看群里有人发这个消息,还有购买地址,阿里云的,于是便进去选几个好点的域名备用,现在不用,以后说不定还能投资勒,毕竟不贵,才28元/年,续费30元/年,今天看了下,只要24元!!!西部数码貌似每次都比阿里价格低,只要22,但是相比较起来,阿里毕竟更加大牌,服务什么的更加方便快捷,所以最后还是在阿里入手。 大家可以试一试: http://iosdev.vip ]]></content>
</entry>
<entry>
<title><![CDATA[激动人心的WWDC2016邀请函已经放出]]></title>
<url>%2F2016%2F06%2F02%2F73%2F</url>
<content type="text"><![CDATA[北京时间6月2日,苹果对外正式放出了WWDC 2016大会的邀请函,宣布苹果全球开发者大会(WWDC)主题演讲将于太平洋时间6月13日上午10点(北京时间6月14日凌晨一点)在位于旧金山的比尔·格雷厄姆市政礼堂拉开帷幕。 WWDC2016大会将持续至6月17日,届时苹果会直播这次大会,并发布所有分论坛的视频。苹果通常会借助WWDC主题演讲发布一些软件和产品升级,主要是最新版本的iOS和其它软件,激动人心有木有! 邀请函是今天刚发出的,但是消息苹果公司早就宣布了,在苹果开发者官网首页上,而且估计只有程序猿才看得懂的代码信息:]]></content>
</entry>
<entry>
<title><![CDATA[激动人心的WWDC2016邀请函已经放出]]></title>
<url>%2F2016%2F06%2F02%2F73-1%2F</url>
<content type="text"><![CDATA[北京时间6月2日,苹果对外正式放出了WWDC 2016大会的邀请函,宣布苹果全球开发者大会(WWDC)主题演讲将于太平洋时间6月13日上午10点(北京时间6月14日凌晨一点)在位于旧金山的比尔·格雷厄姆市政礼堂拉开帷幕。 WWDC2016大会将持续至6月17日,届时苹果会直播这次大会,并发布所有分论坛的视频。苹果通常会借助WWDC主题演讲发布一些软件和产品升级,主要是最新版本的iOS和其它软件,激动人心有木有! 邀请函是今天刚发出的,但是消息苹果公司早就宣布了,在苹果开发者官网首页上,而且估计只有程序猿才看得懂的代码信息:]]></content>
</entry>
<entry>
<title><![CDATA[关于网站后期速度优化的一些坑]]></title>
<url>%2F2016%2F06%2F01%2F72%2F</url>
<content type="text"><![CDATA[由于网站已经迁移完成,所以昨天在优化服务器和WP,加快读者们的访问速度,毕竟有强迫症的我不能忍受网站点击下还在加载读条中,那是极其糟糕的,完全没有阅读欲望!所以就准备装一些WP的插件老解决,当然,插件不能太多,一句老话:能用代码解决的,千万不要用插件。插件越少越好。 下面说一下我优化过程中的一些经验,防止大家走我的老路。 WP Super Cache这插件貌似人气很高,而且经久不衰,功能也还可以,带CDN功能,不过没有W3 Total Cache功能多。这插件最大的作用就是静态缓存。但是和我目前用的主题有点冲突: 前台登陆后返回结果为网站主页:解决方法就是勾选WP Super Cache设置-高级-不要为已知用户缓存。 和WP-PostViews插件冲突,阅读不计数,如果你不在意阅读数的话,可以不用管。解决方法的话网上有,但是很复杂,改动代码的。 评论无效。多次测试,填写留言,无显示。后来发现是ajax评论与CDN缓存之间的问题。解决方法:找到你主题里面的comments-ajax.js ,加入一行代码,亲测有效。var i = 0, got = -1, len = document.getElementsByTagName(‘script’).length;while ( i <= len && got == -1){var js_url = document.getElementsByTagName(‘script’)[i].src,got = js_url.indexOf('comments-ajax.js'); i++ ; }js_url = js_url.replace(‘www.yourcdndomain.com’,’www.yourdomain.com’);//添加的代码,第一个为你的CDN域名,第二个为你的网站域名由于这个插件带来的问题远远少于给我网站增加的速度,于是删除它。说实话,如果你的主题和这个插件兼容,没有啥问题,缓存测试也成功(PS:我的缓存测试显示时间戳不对),那还能用一用。如果会带来问题,需要修改代码才能解决(并不是说修改代码不好,考虑到小白居多,修改后问题更多,就算是老手,频繁的修改主题或wp代码也不利于以后维护),而且速度收益比较小,还是删除这个插件吧,并没有传说中的那么神奇。 最后,权衡利弊,删除之。 W3 Total Cache这插件功能多到难以想象,压缩代码,CDN,等等,我个人最讨厌这种插件,太花哨了,过于庞大,带来问题的潜在因素也比较大。我安装这个插件主要是体验又拍云的CDN,利用这插件自带的CDN和FTP和又拍云CDN同步静态资源,这样就可以从又拍云调用资源,加快访问速度和减少源站的压力。然后发现并不怎么好用,FTP同步是能同步,就是灰常慢,而且没有提示,只告诉你花费的时间,没有剩余时间。 最后,权衡利弊,删除之。 WP CDN Rewrite上面2个插件用的人多,效果说好的好,反正我体验完后觉得可有可无,对我的网站的速度提升不大(PS:可能我的网站的速度已经逆天0-0)。这插件的作用就是修改网站静态资源为CDN上镜像存储的资源,所以该插件的核心功能就是修改静态资源的URL,也是唯一的功能。因为我和大部分人装这类插件的目的一样:提升网站速度。你不要给我搞事,做好分内的事就好,这插件就是。设置还简单,只需要填写CDN Root URL (required),CDN的根URL,这个可以在CDN服务提供商中找到,设置的时候不要忘了输入http://。 最后总结加速插件,缓存静态资源,CDN这类插件的目的就是让你的网站访问速度得以提升。可能会带来一些其它副作用,一般都能解决,但是你是不是真的需要?用这些插件真的有用?一般在国内阿里云,腾讯云的主机速度都不会差,我用的就是最低配置,完全够跑好几个wp,我现在跑4个网站都没有一点压力,当然,这个得看你网站的流量情况。小白的话,不要看什么插件好就装什么,有时候反而速度会慢下来,带来问题。插件能少装一个就少装一个,特别是那种功能非常多的插件。 最后我就只装了这三个中的一个插件:WP CDN Rewrite。因为通过其他插件我发现什么静态缓存网页都是浮云,我只需要CDN缓存我网站的图片、CSS、JS等静态资源,方面调用。]]></content>
</entry>
<entry>
<title><![CDATA[关于网站后期速度优化的一些坑]]></title>
<url>%2F2016%2F06%2F01%2F72-1%2F</url>
<content type="text"><![CDATA[由于网站已经迁移完成,所以昨天在优化服务器和WP,加快读者们的访问速度,毕竟有强迫症的我不能忍受网站点击下还在加载读条中,那是极其糟糕的,完全没有阅读欲望!所以就准备装一些WP的插件老解决,当然,插件不能太多,一句老话:能用代码解决的,千万不要用插件。插件越少越好。 下面说一下我优化过程中的一些经验,防止大家走我的老路。 WP Super Cache这插件貌似人气很高,而且经久不衰,功能也还可以,带CDN功能,不过没有W3 Total Cache功能多。这插件最大的作用就是静态缓存。但是和我目前用的主题有点冲突: 前台登陆后返回结果为网站主页:解决方法就是勾选WP Super Cache设置-高级-不要为已知用户缓存。 和WP-PostViews插件冲突,阅读不计数,如果你不在意阅读数的话,可以不用管。解决方法的话网上有,但是很复杂,改动代码的。 评论无效。多次测试,填写留言,无显示。后来发现是ajax评论与CDN缓存之间的问题。解决方法:找到你主题里面的comments-ajax.js ,加入一行代码,亲测有效。var i = 0, got = -1, len = document.getElementsByTagName(‘script’).length;while ( i <= len && got == -1){var js_url = document.getElementsByTagName(‘script’)[i].src,got = js_url.indexOf('comments-ajax.js'); i++ ; }js_url = js_url.replace(‘www.yourcdndomain.com’,’www.yourdomain.com’);//添加的代码,第一个为你的CDN域名,第二个为你的网站域名由于这个插件带来的问题远远少于给我网站增加的速度,于是删除它。说实话,如果你的主题和这个插件兼容,没有啥问题,缓存测试也成功(PS:我的缓存测试显示时间戳不对),那还能用一用。如果会带来问题,需要修改代码才能解决(并不是说修改代码不好,考虑到小白居多,修改后问题更多,就算是老手,频繁的修改主题或wp代码也不利于以后维护),而且速度收益比较小,还是删除这个插件吧,并没有传说中的那么神奇。 最后,权衡利弊,删除之。 W3 Total Cache这插件功能多到难以想象,压缩代码,CDN,等等,我个人最讨厌这种插件,太花哨了,过于庞大,带来问题的潜在因素也比较大。我安装这个插件主要是体验又拍云的CDN,利用这插件自带的CDN和FTP和又拍云CDN同步静态资源,这样就可以从又拍云调用资源,加快访问速度和减少源站的压力。然后发现并不怎么好用,FTP同步是能同步,就是灰常慢,而且没有提示,只告诉你花费的时间,没有剩余时间。 最后,权衡利弊,删除之。 WP CDN Rewrite上面2个插件用的人多,效果说好的好,反正我体验完后觉得可有可无,对我的网站的速度提升不大(PS:可能我的网站的速度已经逆天0-0)。这插件的作用就是修改网站静态资源为CDN上镜像存储的资源,所以该插件的核心功能就是修改静态资源的URL,也是唯一的功能。因为我和大部分人装这类插件的目的一样:提升网站速度。你不要给我搞事,做好分内的事就好,这插件就是。设置还简单,只需要填写CDN Root URL (required),CDN的根URL,这个可以在CDN服务提供商中找到,设置的时候不要忘了输入http://。 最后总结加速插件,缓存静态资源,CDN这类插件的目的就是让你的网站访问速度得以提升。可能会带来一些其它副作用,一般都能解决,但是你是不是真的需要?用这些插件真的有用?一般在国内阿里云,腾讯云的主机速度都不会差,我用的就是最低配置,完全够跑好几个wp,我现在跑4个网站都没有一点压力,当然,这个得看你网站的流量情况。小白的话,不要看什么插件好就装什么,有时候反而速度会慢下来,带来问题。插件能少装一个就少装一个,特别是那种功能非常多的插件。 最后我就只装了这三个中的一个插件:WP CDN Rewrite。因为通过其他插件我发现什么静态缓存网页都是浮云,我只需要CDN缓存我网站的图片、CSS、JS等静态资源,方面调用。]]></content>
</entry>
<entry>
<title><![CDATA[wordpress文章ID不连续]]></title>
<url>%2F2016%2F05%2F31%2F71%2F</url>
<content type="text"><![CDATA[先说明,这个明显是强迫症才会搞这种累死人不的好处的活,当然,我也是这种人。当初Typecho写文章的时候还没太在意,因为文章ID变化不太大,没引起我注意。当转到wp后,2篇文章之间ID相差太大,强迫症的我不能忍,于是一顿搜索找到几个方法,发现网上那些文章都是抄的,还都是一模一样的,错别字、格式什么的都没变化。好在有张戈这位技术型博主,文章写的非常好,所以这里结合下我的经验分享下。 真ID连续一开始是采用这种的,毕竟强迫症,要解决就得真解决。下面是Mysql代码:update wp_posts set id = 3 where id = 69;//ID69的文章改为ID3文章update wp_term_relationships set object_id = 3 where object_id = 69;update wp_postmeta set post_id = 3 where post_id = 69;update wp_comments set comment_post_ID = 3 where comment_post_ID = 69;但是改完几篇过后就会发现越来越不对劲呀!因为有一些ID是改不了的,比如菜单啥的,它也会占用ID号,总不能为了文章连续,一个一个改吧,工作量与复杂度太大了,而且容易出错,故弃之! 伪ID连续这个是看到张戈的文章后得到的方法,一开始还没看明白,后来一想,这办法,还真不错,解决方式很巧妙,这也提供了一种解决问题的方式:有时候,一个问题,正面解决不了,从另一个方面入手解决反而更好。 这里我简单解释下,想要wp文章id连续,满足的是链接上的连续,在wp中固定链接可以是/%post_id%.html 也可以是/%postname%.html ,设置为post_id就是真ID,我们可以通过在后台中设置固定链接为/%postname%.html,然后写文章的时候将文章别名设置为阿拉伯数字(眼中的ID),这样改起来比动数据库简单、安全多啦。 下面是步骤: 进入Mysql命令或者PhpMyAdmin的SQl,执行下列命令: update wp_posts set post_name=ID where post_status='publish' and post_type='post'; 然后进入wordpress后台-设置-固定连接处,选择自定义链接,改为:/archives/%postname%.html 这样以后写文章的时候只要改一下别名就可以让所有文章ID”完美“连续!目前我就是采用这种方法的。 更详细的介绍,请看原文:http://zhangge.net/5008.html]]></content>
</entry>
<entry>
<title><![CDATA[wordpress文章ID不连续]]></title>
<url>%2F2016%2F05%2F31%2F71-1%2F</url>
<content type="text"><![CDATA[先说明,这个明显是强迫症才会搞这种累死人不的好处的活,当然,我也是这种人。当初Typecho写文章的时候还没太在意,因为文章ID变化不太大,没引起我注意。当转到wp后,2篇文章之间ID相差太大,强迫症的我不能忍,于是一顿搜索找到几个方法,发现网上那些文章都是抄的,还都是一模一样的,错别字、格式什么的都没变化。好在有张戈这位技术型博主,文章写的非常好,所以这里结合下我的经验分享下。 真ID连续一开始是采用这种的,毕竟强迫症,要解决就得真解决。下面是Mysql代码:update wp_posts set id = 3 where id = 69;//ID69的文章改为ID3文章update wp_term_relationships set object_id = 3 where object_id = 69;update wp_postmeta set post_id = 3 where post_id = 69;update wp_comments set comment_post_ID = 3 where comment_post_ID = 69;但是改完几篇过后就会发现越来越不对劲呀!因为有一些ID是改不了的,比如菜单啥的,它也会占用ID号,总不能为了文章连续,一个一个改吧,工作量与复杂度太大了,而且容易出错,故弃之! 伪ID连续这个是看到张戈的文章后得到的方法,一开始还没看明白,后来一想,这办法,还真不错,解决方式很巧妙,这也提供了一种解决问题的方式:有时候,一个问题,正面解决不了,从另一个方面入手解决反而更好。 这里我简单解释下,想要wp文章id连续,满足的是链接上的连续,在wp中固定链接可以是/%post_id%.html 也可以是/%postname%.html ,设置为post_id就是真ID,我们可以通过在后台中设置固定链接为/%postname%.html,然后写文章的时候将文章别名设置为阿拉伯数字(眼中的ID),这样改起来比动数据库简单、安全多啦。 下面是步骤: 进入Mysql命令或者PhpMyAdmin的SQl,执行下列命令: update wp_posts set post_name=ID where post_status='publish' and post_type='post'; 然后进入wordpress后台-设置-固定连接处,选择自定义链接,改为:/archives/%postname%.html 这样以后写文章的时候只要改一下别名就可以让所有文章ID”完美“连续!目前我就是采用这种方法的。 更详细的介绍,请看原文:http://zhangge.net/5008.html]]></content>
</entry>
<entry>
<title><![CDATA[分享一些HTML5的模板]]></title>
<url>%2F2016%2F05%2F30%2F70-1%2F</url>
<content type="text"><![CDATA[前几天看到一个HTML5 UP的网站,发现国内许多网站都用的他的模板做的首页,的确非常适合,高端大气上档次。 完全响应式设计 基于HTML5+CSS3 定制性高 100%免费分享 里面有38个完全免费的模板,于是我当一回雷锋,全部下载下来,分享给大家。 这里给出官网以及下载地址: http://html5up.net/ [reply][file][/reply] ]]></content>
</entry>
<entry>
<title><![CDATA[分享一些HTML5的模板]]></title>
<url>%2F2016%2F05%2F30%2F70%2F</url>
<content type="text"><![CDATA[前几天看到一个HTML5 UP的网站,发现国内许多网站都用的他的模板做的首页,的确非常适合,高端大气上档次。 完全响应式设计 基于HTML5+CSS3 定制性高 100%免费分享 里面有38个完全免费的模板,于是我当一回雷锋,全部下载下来,分享给大家。 这里给出官网以及下载地址: http://html5up.net/ [reply][file][/reply] ]]></content>
</entry>
<entry>
<title><![CDATA[写篇文章庆祝下]]></title>
<url>%2F2016%2F05%2F29%2F69%2F</url>
<content type="text"><![CDATA[博客从Typecho迁移至Wordpress本来可以很快完工的,但是博主大三狗,事情灰常多,作为一个程序猿马上又要去培训,在选择培训机构,还要考英语6级,然后碰上感冒,不过现在这些事情全部搞定,现在就是安心学习、写博客,准备英语,准备培训啦,博客我会坚持写下去,更新频率不一定,估计暑假去培训比较忙会更新慢点,所以趁现在,把自己的好东西分享出来,哈哈。 ]]></content>
</entry>
<entry>
<title><![CDATA[写篇文章庆祝下]]></title>
<url>%2F2016%2F05%2F29%2F69-1%2F</url>
<content type="text"><![CDATA[博客从Typecho迁移至Wordpress本来可以很快完工的,但是博主大三狗,事情灰常多,作为一个程序猿马上又要去培训,在选择培训机构,还要考英语6级,然后碰上感冒,不过现在这些事情全部搞定,现在就是安心学习、写博客,准备英语,准备培训啦,博客我会坚持写下去,更新频率不一定,估计暑假去培训比较忙会更新慢点,所以趁现在,把自己的好东西分享出来,哈哈。 ]]></content>
</entry>
<entry>
<title><![CDATA[博客全新改版完成!]]></title>
<url>%2F2016%2F05%2F17%2F1%2F</url>
<content type="text"><![CDATA[5月29日 博客迁移所有工作已经做好,感冒也痊愈,可喜可贺。 5月26日 由于这一个礼拜感冒,电脑几乎没开,所以博客博客什么的暂时没打理,现在稍微好点啦,开始完成博客迁移还没完成的部分。 5月19日 之前博客的文章正在编辑中,已经搬过来一部分,友情链接也都加上,有遗漏的请告知,不好意思啦,事情太多,忙不过来,难免有疏忽。总之,有问题可以一起交流。 从一开始的wordpress到typecho再到wordpress,历经还几个月的磨练,个人技术也有些长进,发现简单的typecho已经满足不了我的需求,加上主机要升级,得重装系统,于是经过再三考虑,还是把博客转移,一步一步迁移。 由于平时还有课,大学狗,所以进度有点慢,目前整体已经好啦,所有文章连接不变,文章内容可能会变化,因为wordpress对MarkDown兼容不太好,所以每篇文章我都重新排版一遍,苦逼呀,不然SEO方面不好,好不容易收录的文章,链接变化就404,就得又等些日子才会收录。文章虽然迁移过来,由于Typecho用的是多说,因为没有好看的评论样式,只能用多说,而且多说服务器经常抽风,虽然部分代码本地化也没啥用。目前打算用主题自带的评论,挺好的,所以小伙伴们的留言、评论也就木有啦,只不过是重头再来,泪奔!! 新的开始,希望我能给大家带来更多有用的东西,也记录自己学习、成长的点滴! 在这里感谢下Typecho这个平台,以及从我开始用Typecho时就选用主题的作者Jrotty。]]></content>
</entry>
<entry>
<title><![CDATA[博客全新改版完成!]]></title>
<url>%2F2016%2F05%2F17%2F1-1%2F</url>
<content type="text"><![CDATA[5月29日 博客迁移所有工作已经做好,感冒也痊愈,可喜可贺。 5月26日 由于这一个礼拜感冒,电脑几乎没开,所以博客博客什么的暂时没打理,现在稍微好点啦,开始完成博客迁移还没完成的部分。 5月19日 之前博客的文章正在编辑中,已经搬过来一部分,友情链接也都加上,有遗漏的请告知,不好意思啦,事情太多,忙不过来,难免有疏忽。总之,有问题可以一起交流。 从一开始的wordpress到typecho再到wordpress,历经还几个月的磨练,个人技术也有些长进,发现简单的typecho已经满足不了我的需求,加上主机要升级,得重装系统,于是经过再三考虑,还是把博客转移,一步一步迁移。 由于平时还有课,大学狗,所以进度有点慢,目前整体已经好啦,所有文章连接不变,文章内容可能会变化,因为wordpress对MarkDown兼容不太好,所以每篇文章我都重新排版一遍,苦逼呀,不然SEO方面不好,好不容易收录的文章,链接变化就404,就得又等些日子才会收录。文章虽然迁移过来,由于Typecho用的是多说,因为没有好看的评论样式,只能用多说,而且多说服务器经常抽风,虽然部分代码本地化也没啥用。目前打算用主题自带的评论,挺好的,所以小伙伴们的留言、评论也就木有啦,只不过是重头再来,泪奔!! 新的开始,希望我能给大家带来更多有用的东西,也记录自己学习、成长的点滴! 在这里感谢下Typecho这个平台,以及从我开始用Typecho时就选用主题的作者Jrotty。]]></content>
</entry>
<entry>
<title><![CDATA[【通知】服务器升级,博客可能暂时无法访问(已完成)]]></title>
<url>%2F2016%2F05%2F15%2F68%2F</url>
<content type="text"><![CDATA[由于腾讯云服务器升级,硬盘改为云硬盘,并且变为20g等等,虽然很早就得知这个消息,但是怕麻烦,而且现在8g硬盘也够用。然而最近觉得Typecho满足不了我的需求,很多东西无法实现,刚好发现一个极好的wordpress主题,有我想要的一切!!!SEO优化,社会化推广等等。所以决定再次投向wp的怀抱。虽然wp臃肿,还好我有七牛,又拍云,腾讯云三家的CDN,看下能不能把wordpress优化和Typecho一样的流畅。 综合以上几点,考虑几天后或者,决定找一个周末升级服务器,Typecho转wordpress,更换更加专业的主题,用上全新CDN!!!]]></content>
</entry>
<entry>
<title><![CDATA[【通知】服务器升级,博客可能暂时无法访问(已完成)]]></title>
<url>%2F2016%2F05%2F15%2F68-1%2F</url>
<content type="text"><![CDATA[由于腾讯云服务器升级,硬盘改为云硬盘,并且变为20g等等,虽然很早就得知这个消息,但是怕麻烦,而且现在8g硬盘也够用。然而最近觉得Typecho满足不了我的需求,很多东西无法实现,刚好发现一个极好的wordpress主题,有我想要的一切!!!SEO优化,社会化推广等等。所以决定再次投向wp的怀抱。虽然wp臃肿,还好我有七牛,又拍云,腾讯云三家的CDN,看下能不能把wordpress优化和Typecho一样的流畅。 综合以上几点,考虑几天后或者,决定找一个周末升级服务器,Typecho转wordpress,更换更加专业的主题,用上全新CDN!!!]]></content>
</entry>
<entry>
<title><![CDATA[新的CDN体验-又拍云]]></title>
<url>%2F2016%2F05%2F11%2F67-1%2F</url>
<content type="text"><![CDATA[缘由现在用的是腾讯云的CDN,因为主机是腾讯云的,所以干脆用全家桶。这些天逛博客,论坛,发现又拍云口碑还不错,去官网逛一逛,发现还不错,反正以后也用得上,就去注册一个账号试试,今天刚注册的,听说还有开发者计划: 又拍云联盟是又拍云推出的开发者帮助计划对开发者提供完善的云存储、CDN 等服务,加速个人网站、博客、APP 等项目. 福利重点是下面这个: 成为又拍云联盟的用户,一年内每月可免费使用 10GB 存储空间及 15GB 流量。 提供图片的自定义缩略图、水印;提供音视频的转码、压缩处理,助力快速开发。 小结所以没办法,你看到我网站底部加了一个链接,还好不算太违和。大家谅解下。等我体验过后,为大家带来体验心得,大家等我的好消息,哈哈哈。 进展5月11日更新今天下午在又拍云控制台查看是否审核通过,虽然发邮件了,发了2封,一封是欢迎申请联盟之类的,照常我以为是机器自动发送。第二封一看写的是底下的可以根据自己喜好变成图片或文字,还有个表情,有点人工发的意思。第三封叫我耐心等待,每周五出结果。于是我试着回一封邮件挑逗下,结果真有人回我!!!出乎意料。 还有就是中午在控制台问客服,就是那种网站上悬浮窗的客户,结果没人回复我,就没管,干别的事情去。过啦不就,手机qq振动,加好友备注为又拍云。我以为是审核开发者联盟的过程,就加了。交流中得知,他是因为中午休息,客服帐号没有下线,导致我刚才问问题无人回复,结果他就加我qq解答(惊呆啦0-0),顺便和他聊会天。 头一次碰到服务态度这么好的公司,表示有点小激动,期待他们家公司的服务质量。 5月13日更新下午收到邮件通知了,审核通过,哈哈。 您的又拍云联盟申请已审核通过,代金券已发放至您账户,请及时查看并进行核对。 为更好在用户与用户之间交流,请加 又拍云用户交流群 xxxxxxxxx 如有任何疑问,欢迎群内咨询,谢谢~]]></content>
</entry>
<entry>
<title><![CDATA[新的CDN体验-又拍云]]></title>
<url>%2F2016%2F05%2F11%2F67%2F</url>
<content type="text"><![CDATA[缘由现在用的是腾讯云的CDN,因为主机是腾讯云的,所以干脆用全家桶。这些天逛博客,论坛,发现又拍云口碑还不错,去官网逛一逛,发现还不错,反正以后也用得上,就去注册一个账号试试,今天刚注册的,听说还有开发者计划: 又拍云联盟是又拍云推出的开发者帮助计划对开发者提供完善的云存储、CDN 等服务,加速个人网站、博客、APP 等项目. 福利重点是下面这个: 成为又拍云联盟的用户,一年内每月可免费使用 10GB 存储空间及 15GB 流量。 提供图片的自定义缩略图、水印;提供音视频的转码、压缩处理,助力快速开发。 小结所以没办法,你看到我网站底部加了一个链接,还好不算太违和。大家谅解下。等我体验过后,为大家带来体验心得,大家等我的好消息,哈哈哈。 进展5月11日更新今天下午在又拍云控制台查看是否审核通过,虽然发邮件了,发了2封,一封是欢迎申请联盟之类的,照常我以为是机器自动发送。第二封一看写的是底下的可以根据自己喜好变成图片或文字,还有个表情,有点人工发的意思。第三封叫我耐心等待,每周五出结果。于是我试着回一封邮件挑逗下,结果真有人回我!!!出乎意料。 还有就是中午在控制台问客服,就是那种网站上悬浮窗的客户,结果没人回复我,就没管,干别的事情去。过啦不就,手机qq振动,加好友备注为又拍云。我以为是审核开发者联盟的过程,就加了。交流中得知,他是因为中午休息,客服帐号没有下线,导致我刚才问问题无人回复,结果他就加我qq解答(惊呆啦0-0),顺便和他聊会天。 头一次碰到服务态度这么好的公司,表示有点小激动,期待他们家公司的服务质量。 5月13日更新下午收到邮件通知了,审核通过,哈哈。 您的又拍云联盟申请已审核通过,代金券已发放至您账户,请及时查看并进行核对。 为更好在用户与用户之间交流,请加 又拍云用户交流群 xxxxxxxxx 如有任何疑问,欢迎群内咨询,谢谢~]]></content>
</entry>
<entry>
<title><![CDATA[iOS 学习巩固笔记-Socket]]></title>
<url>%2F2016%2F05%2F10%2F47%2F</url>
<content type="text"><![CDATA[下面是一些个人学习笔记,查缺补漏,巩固知识,希望大家能有所收获。 Socket又称“套接字” 网络上的两端通过建立一个双向的通信连接实现数据的交换,这个端就称为一个Socket端 应用程序通常通过“套接字“向网络发出请求或者应答网络请求 网络通信的要素 网络上的请求就是通过Socket来建立连接然后互相通信 IP地址(网络上主机设备的唯一标识) 端口号(定位程序) 用于标示进程的逻辑地址,不同进程的标示 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发中建议使用1024以上的端口 传输协议(用什么样的方式进行交互) 通讯的规则 常见协议:TCP、UDP TCP&UDPTCP(传输控制协议) 建立连接,形成传输数据的通道 在连接中进行大数据传输(数据大小不收限制) 通过三次握手完成连接,是可靠协议,安全送达 必须建立连接,效率会稍低 UDP(用户数据报协议) 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小限制在64K之内 因为无需连接,因此是不可靠协议 不需要建立连接,速度快 ]]></content>
</entry>
<entry>
<title><![CDATA[iOS 学习巩固笔记-Socket]]></title>
<url>%2F2016%2F05%2F10%2F47-1%2F</url>
<content type="text"><![CDATA[下面是一些个人学习笔记,查缺补漏,巩固知识,希望大家能有所收获。 Socket又称“套接字” 网络上的两端通过建立一个双向的通信连接实现数据的交换,这个端就称为一个Socket端 应用程序通常通过“套接字“向网络发出请求或者应答网络请求 网络通信的要素 网络上的请求就是通过Socket来建立连接然后互相通信 IP地址(网络上主机设备的唯一标识) 端口号(定位程序) 用于标示进程的逻辑地址,不同进程的标示 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发中建议使用1024以上的端口 传输协议(用什么样的方式进行交互) 通讯的规则 常见协议:TCP、UDP TCP&UDPTCP(传输控制协议) 建立连接,形成传输数据的通道 在连接中进行大数据传输(数据大小不收限制) 通过三次握手完成连接,是可靠协议,安全送达 必须建立连接,效率会稍低 UDP(用户数据报协议) 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小限制在64K之内 因为无需连接,因此是不可靠协议 不需要建立连接,速度快 ]]></content>
</entry>
<entry>
<title><![CDATA[Markdown基本语法-自学收藏]]></title>
<url>%2F2016%2F05%2F10%2F46-1%2F</url>
<content type="text"><![CDATA[下面是一些常用语法,以前用Typecho用MarkDown写文章经常用(wordpress不能显示,所以只有代码展示)。 标题这是 H1 一级标题这是 H2 二级标题这是 H1 一级标题这是 H2 二级标题这是 H3 三级标题这是 H4 四级标题这是 H5 五级标题这是 H6 六级标题快捷键: [ctrl + h] 待办事项[ ] 未完成事项 [-] 未完成事项 [x] 完成事项 [X] 完成事项 缩写定义The HTML specification is maintained by the W3C. *[HTML]: Hyper Text Markup Language *[W3C]: World Wide Web Consortium 文字格式**这是文字粗体格式** __这是文字粗体格式__ *这是文字斜体格式* _这是文字斜体格式_ 无序列表* 项目1 * 子项目1.1 * 子项目1.2 * 子项目1.2.1 * 项目2 * 项目3 有序列表1\. 项目1 2\. 项目2 3\. 项目3 1\. 项目3.1 2\. 项目3.2 有序列表起始编号58\. 项目5 2\. 项目6 **快捷键**: [ctrl + o] #### 图片 ![图片名称](http://huangboweicom-10023220.file.myqcloud.com/images/firebugcourse.png) 链接[链接名称](链接地址) [链接名称][1] [1] : 链接地址 引用> 第一行引用文字 > 第二行引用文字 水平线*** 代码行内代码var x = "hello world"`</pre> ##### 块代码 <pre class="lang:default decode:true">```javascript var a = "hello world"; var b = "good luck"; ``]]></content>
</entry>
<entry>
<title><![CDATA[Markdown基本语法-自学收藏]]></title>
<url>%2F2016%2F05%2F10%2F46%2F</url>
<content type="text"><![CDATA[下面是一些常用语法,以前用Typecho用MarkDown写文章经常用(wordpress不能显示,所以只有代码展示)。 标题这是 H1 一级标题这是 H2 二级标题这是 H1 一级标题这是 H2 二级标题这是 H3 三级标题这是 H4 四级标题这是 H5 五级标题这是 H6 六级标题快捷键: [ctrl + h] 待办事项[ ] 未完成事项 [-] 未完成事项 [x] 完成事项 [X] 完成事项 缩写定义The HTML specification is maintained by the W3C. *[HTML]: Hyper Text Markup Language *[W3C]: World Wide Web Consortium 文字格式**这是文字粗体格式** __这是文字粗体格式__ *这是文字斜体格式* _这是文字斜体格式_ 无序列表* 项目1 * 子项目1.1 * 子项目1.2 * 子项目1.2.1 * 项目2 * 项目3 有序列表1\. 项目1 2\. 项目2 3\. 项目3 1\. 项目3.1 2\. 项目3.2 有序列表起始编号58\. 项目5 2\. 项目6 **快捷键**: [ctrl + o] #### 图片 ![图片名称](http://huangboweicom-10023220.file.myqcloud.com/images/firebugcourse.png) 链接[链接名称](链接地址) [链接名称][1] [1] : 链接地址 引用> 第一行引用文字 > 第二行引用文字 水平线*** 代码行内代码var x = "hello world"`</pre> ##### 块代码 <pre class="lang:default decode:true">```javascript var a = "hello world"; var b = "good luck"; ``]]></content>
</entry>
<entry>
<title><![CDATA[iOS 学习巩固笔记-UIWebView/JavaScript]]></title>
<url>%2F2016%2F05%2F09%2F48%2F</url>
<content type="text"><![CDATA[1 UIWebView简介 UIWebView是iOS内置的浏览器控件 系统自带的Safari浏览器就是通过UIWebView实现的 UIWebView不但能加载远程的网页资源,还能加载绝大部分的常见文件:html、htm、pdf、doc、ppt、txt、mp4等 1.1 UIWebView常用的加载资源的方法- (void)loadRequest:(NSURLRequest *)request; 1.2 UIWebView常用属性和方法 重新加载(刷新) - (void)reload; 停止加载 - (void)stopLoading; 回退 - (void)goBack; 前进 - (void)goForward; 需要进行检测的数据类型 @property(nonatomic) UIDataDetectorTypes dataDetectorTypes 是否能回退 @property(nonatomic,readonly,getter=canGoBack) BOOL canGoBack; 是否能前进 @property(nonatomic,readonly,getter=canGoForward) BOOL canGoForward; 是否正在加载中 @property(nonatomic,readonly,getter=isLoading) BOOL loading; 是否伸缩内容至适应屏幕当前尺寸@property(nonatomic) BOOL scalesPageToFit; 1.3 监听UIWebView的加载过程成为UIWebView的代理,遵守UIWebViewDelegate协议,就能监听UIWebView的加载过程 - (void)webViewDidStartLoad:(UIWebView *)webView; 请求完毕(加载数据完毕)时调用这个方法 - (void)webViewDidFinishLoad:(UIWebView *)webView; 请求错误时调用这个方法 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error; UIWebView在发送请求之前,都会调用这个方法,如果返回NO,代表停止加载请求,返回YES,代表允许加载请求 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 2 JavaScript简介 JavaScript是一门脚本语言,简称JS 2.1 JavaScript的常见作用 给HTML网页添加动态功能,比如响应用户的各种操作 操纵HTML元素,比如添加、删除、修改网页元素 2.2 常见的JavaScript函数alert(10); //弹框 document.getElementById(‘test’); //根据ID获得某个DOM元素 ## 3 OC中调用JavaScipt使用UIWebView的stringByEvaluatingJavaScriptFromString方法即可。 3.1 WebView的基本概念 webView是有缺点的,会导致内存泄露,而且这个问题是它系统本身的问题。 手机上面的safai其实就是用webView来实现的 现在的开发并不完全是原生的开发,而更加倾向于原生+Html5的方式 webView是OC代码和html代码之间进行交互的桥梁 3.1.1 代码 网页操控相关方法[self.webView goBack]; //回退[self.webView goForward]; //前进[self.webView reload]; //刷新 设置是否能够前进和回退self.goBackBtn.enabled = webView.canGoBack;self.fowardBtn.enabled = webView.canGoForward; 常用的属性设置//设置网页自动适应self.webView.scalesPageToFit = YES; //设置检测网页中的格式类型,all表示检测所有类型包括超链接、电话号码、地址等。self.webView.dataDetectorTypes = UIDataDetectorTypeAll; 可滚动范围self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0); 代理方法每当将加载请求的时候调用该方法,返回YES 表示加载该请求,返回NO 表示不加载该请求//可以在该方法中拦截请求-(BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType{return ![request.URL.absoluteString containsString:@”dushu”];} //开始加载网页,不仅监听我们指定的请求,还会监听内部发送的请求-(void)webViewDidStartLoad:(UIWebView *)webView //网页加载完毕之后会调用该方法-(void)webViewDidFinishLoad:(UIWebView *)webView //网页加载失败调用该方法-(void)webView:(UIWebView )webView didFailLoadWithError:(NSError )error 加载本地资源NSURL *url = [[NSBundle mainBundle] URLForResource:@”ithome.pdf” withExtension:nil];[self.webView loadRequest:[NSURLRequest requestWithURL:url]]; 3.2 HTML 1.Html决定网页的内容,css决定网页的样式,js决定网页的事件 2.html学习网站:W3School 3.2 OC和JS代码的互调 OC调用JS的代码NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@”sum()”]; JS调用OC的说明新的需求:点击按钮的时候拨打电话 但是我在点击按钮的时候,用户是不知道的,我们怎么能够知道用户点击了网页上面的一个按钮,只能通过一个技巧,那就是自己搞一个特定的协议头比如说hbw:当我拦截到你的网络请求的时候,只需要判断一下当前的协议头是不是这个就能判断你现在是否是JS调用。 OC里面有通过字符串生成SEL类型的方法,所以当拿到数据之后做下面的事情 截取方法的名称 将截取出来的字符串转换为SEL 利用performSelect方法来调用SEL 涉及到的相关方法//判断字符串是否以一个固定的字符开头,这里为A[@”abc” hasPrefix:@”A”] //截串操作 (NSString *)substringFromIndex:(NSUInteger)from; //切割字符串,返回一个数组 (NSArray<NSString > )componentsSeparatedByString:(NSString *)separator; //替换操作 (NSString )stringByReplacingOccurrencesOfString:(NSString )target withString:(NSString *)replacement //把string包装成SELSEL selector = NSSelectorFromString(sel); 如何屏蔽警告#pragma clang diagnostic push#pragma clang diagnostic ignored “-Warc-performSelector-leaks”//-Warc-performSelector-leaks为唯一的警告标识,这里面的代码可以去除警告[self performSelector:selector withObject:nil];#pragma clang diagnostic pop 4 NSInvocation的基本使用(任意调用对象消息方法并可以传N多参数的一个类)在iOS中可以直接调用某个对象的消息方式有两种: performSelector:withObject; NSInvocation。第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作。 封装invacation可以调用多个参数的方法 -(void)invacation{ //1.创建一个MethodSignature,签名中保存了方法的名称,参数和返回值 //这个方法属于谁,那么就用谁来进行创建 //注意:签名一般是用来设置参数和获得返回值的,和方法的调用没有太大的关系 NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)]; //注意不要写错了方法名称 NSMethodSignature *signature = [ViewController methodSignatureForSelector:@selector(call)]; //2.通过MethodSignature来创建一个NSInvocation NSInvocation中保存了方法所属于的对象|方法名称|参数|返回值等等 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; //2.1 设置invocation,来调用方法 invocation.target = self; invocation.selector = @selector(call); invocation.selector = @selector(callWithNumber:); invocation.selector = @selector(callWithNumber:andContext:); invocation.selector = @selector(callWithNumber:andContext:withStatus:); NSString *number = @"1761237846"; NSString *context = @"玩游戏"; NSString *status = @"上课的时候"; //注意: //1.自定义的参数索引从2开始,0和1已经被self and _cmd占用了 //2.方法签名中保存的方法名称必须和调用的名称一致 [invocation setArgument:&amp;number atIndex:2]; [invocation setArgument:&amp;context atIndex:3]; [invocation setArgument:&amp;status atIndex:4]; //3.调用invok方法来执行 [invocation invoke]; } 异常处理1.一般处理方式: app异常闪退,那么捕获crash信息,并记录在本地沙盒中。 当下次用户重新打开app的时候,检查沙盒中是否保存有上次捕获到的crash信息。 如果有那么利用专门的接口发送给服务器,以求在后期版本中修复。 2.如何抛出异常 抛出异常的两种方式方式一@throw [NSException exceptionWithName:@”程序异常” reason:@”异常原因:数组越界” userInfo:nil];方式二NSString *info = [NSString stringWithFormat:@”%@找不到方法”,NSStringFromSelector(aSelector)];下面这种方法是自动抛出的[NSException raise:@”抛出异常” format:info,nil]; 3.如何捕获异常 NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);void UncaughtExceptionHandler(NSException *exception) { NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息 NSString *reason = [exception reason];//非常重要,就是崩溃的原因 NSString *name = [exception name];//异常类型 NSString *errorMsg = [NSString stringWithFormat:@"当前调用栈的信息:%@\nCrash的原因:%@\n异常类型:%@\n",arr,reason,name]; //把该信息保存到本地沙盒,下次回传给服务器。 } void UncaughtExceptionHandler(NSException *exception) { //获取异常崩溃信息 NSArray *callStack = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]]; //把异常崩溃信息发送至开发者邮件 NSMutableString *mailUrl = [NSMutableString string]; [mailUrl appendString:@"mailto:test@qq.com"]; [mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"]; [mailUrl appendFormat:@"&amp;body=%@", content]; //打开地址 NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]]; } 5 补充 关于JS相关的学习框架:WebViewJavascriptBridge ]]></content>
</entry>
<entry>
<title><![CDATA[iOS 学习巩固笔记-UIWebView/JavaScript]]></title>
<url>%2F2016%2F05%2F09%2F48-1%2F</url>
<content type="text"><![CDATA[1 UIWebView简介 UIWebView是iOS内置的浏览器控件 系统自带的Safari浏览器就是通过UIWebView实现的 UIWebView不但能加载远程的网页资源,还能加载绝大部分的常见文件:html、htm、pdf、doc、ppt、txt、mp4等 1.1 UIWebView常用的加载资源的方法- (void)loadRequest:(NSURLRequest *)request; 1.2 UIWebView常用属性和方法 重新加载(刷新) - (void)reload; 停止加载 - (void)stopLoading; 回退 - (void)goBack; 前进 - (void)goForward; 需要进行检测的数据类型 @property(nonatomic) UIDataDetectorTypes dataDetectorTypes 是否能回退 @property(nonatomic,readonly,getter=canGoBack) BOOL canGoBack; 是否能前进 @property(nonatomic,readonly,getter=canGoForward) BOOL canGoForward; 是否正在加载中 @property(nonatomic,readonly,getter=isLoading) BOOL loading; 是否伸缩内容至适应屏幕当前尺寸@property(nonatomic) BOOL scalesPageToFit; 1.3 监听UIWebView的加载过程成为UIWebView的代理,遵守UIWebViewDelegate协议,就能监听UIWebView的加载过程 - (void)webViewDidStartLoad:(UIWebView *)webView; 请求完毕(加载数据完毕)时调用这个方法 - (void)webViewDidFinishLoad:(UIWebView *)webView; 请求错误时调用这个方法 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error; UIWebView在发送请求之前,都会调用这个方法,如果返回NO,代表停止加载请求,返回YES,代表允许加载请求 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 2 JavaScript简介 JavaScript是一门脚本语言,简称JS 2.1 JavaScript的常见作用 给HTML网页添加动态功能,比如响应用户的各种操作 操纵HTML元素,比如添加、删除、修改网页元素 2.2 常见的JavaScript函数alert(10); //弹框 document.getElementById(‘test’); //根据ID获得某个DOM元素 ## 3 OC中调用JavaScipt使用UIWebView的stringByEvaluatingJavaScriptFromString方法即可。 3.1 WebView的基本概念 webView是有缺点的,会导致内存泄露,而且这个问题是它系统本身的问题。 手机上面的safai其实就是用webView来实现的 现在的开发并不完全是原生的开发,而更加倾向于原生+Html5的方式 webView是OC代码和html代码之间进行交互的桥梁 3.1.1 代码 网页操控相关方法[self.webView goBack]; //回退[self.webView goForward]; //前进[self.webView reload]; //刷新 设置是否能够前进和回退self.goBackBtn.enabled = webView.canGoBack;self.fowardBtn.enabled = webView.canGoForward; 常用的属性设置//设置网页自动适应self.webView.scalesPageToFit = YES; //设置检测网页中的格式类型,all表示检测所有类型包括超链接、电话号码、地址等。self.webView.dataDetectorTypes = UIDataDetectorTypeAll; 可滚动范围self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0); 代理方法每当将加载请求的时候调用该方法,返回YES 表示加载该请求,返回NO 表示不加载该请求//可以在该方法中拦截请求-(BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType{return ![request.URL.absoluteString containsString:@”dushu”];} //开始加载网页,不仅监听我们指定的请求,还会监听内部发送的请求-(void)webViewDidStartLoad:(UIWebView *)webView //网页加载完毕之后会调用该方法-(void)webViewDidFinishLoad:(UIWebView *)webView //网页加载失败调用该方法-(void)webView:(UIWebView )webView didFailLoadWithError:(NSError )error 加载本地资源NSURL *url = [[NSBundle mainBundle] URLForResource:@”ithome.pdf” withExtension:nil];[self.webView loadRequest:[NSURLRequest requestWithURL:url]]; 3.2 HTML 1.Html决定网页的内容,css决定网页的样式,js决定网页的事件 2.html学习网站:W3School 3.2 OC和JS代码的互调 OC调用JS的代码NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@”sum()”]; JS调用OC的说明新的需求:点击按钮的时候拨打电话 但是我在点击按钮的时候,用户是不知道的,我们怎么能够知道用户点击了网页上面的一个按钮,只能通过一个技巧,那就是自己搞一个特定的协议头比如说hbw:当我拦截到你的网络请求的时候,只需要判断一下当前的协议头是不是这个就能判断你现在是否是JS调用。 OC里面有通过字符串生成SEL类型的方法,所以当拿到数据之后做下面的事情 截取方法的名称 将截取出来的字符串转换为SEL 利用performSelect方法来调用SEL 涉及到的相关方法//判断字符串是否以一个固定的字符开头,这里为A[@”abc” hasPrefix:@”A”] //截串操作 (NSString *)substringFromIndex:(NSUInteger)from; //切割字符串,返回一个数组 (NSArray<NSString > )componentsSeparatedByString:(NSString *)separator; //替换操作 (NSString )stringByReplacingOccurrencesOfString:(NSString )target withString:(NSString *)replacement //把string包装成SELSEL selector = NSSelectorFromString(sel); 如何屏蔽警告#pragma clang diagnostic push#pragma clang diagnostic ignored “-Warc-performSelector-leaks”//-Warc-performSelector-leaks为唯一的警告标识,这里面的代码可以去除警告[self performSelector:selector withObject:nil];#pragma clang diagnostic pop 4 NSInvocation的基本使用(任意调用对象消息方法并可以传N多参数的一个类)在iOS中可以直接调用某个对象的消息方式有两种: performSelector:withObject; NSInvocation。第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作。 封装invacation可以调用多个参数的方法 -(void)invacation{ //1.创建一个MethodSignature,签名中保存了方法的名称,参数和返回值 //这个方法属于谁,那么就用谁来进行创建 //注意:签名一般是用来设置参数和获得返回值的,和方法的调用没有太大的关系 NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)]; //注意不要写错了方法名称 NSMethodSignature *signature = [ViewController methodSignatureForSelector:@selector(call)]; //2.通过MethodSignature来创建一个NSInvocation NSInvocation中保存了方法所属于的对象|方法名称|参数|返回值等等 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; //2.1 设置invocation,来调用方法 invocation.target = self; invocation.selector = @selector(call); invocation.selector = @selector(callWithNumber:); invocation.selector = @selector(callWithNumber:andContext:); invocation.selector = @selector(callWithNumber:andContext:withStatus:); NSString *number = @"1761237846"; NSString *context = @"玩游戏"; NSString *status = @"上课的时候"; //注意: //1.自定义的参数索引从2开始,0和1已经被self and _cmd占用了 //2.方法签名中保存的方法名称必须和调用的名称一致 [invocation setArgument:&amp;number atIndex:2]; [invocation setArgument:&amp;context atIndex:3]; [invocation setArgument:&amp;status atIndex:4]; //3.调用invok方法来执行 [invocation invoke]; } 异常处理1.一般处理方式: app异常闪退,那么捕获crash信息,并记录在本地沙盒中。 当下次用户重新打开app的时候,检查沙盒中是否保存有上次捕获到的crash信息。 如果有那么利用专门的接口发送给服务器,以求在后期版本中修复。 2.如何抛出异常 抛出异常的两种方式方式一@throw [NSException exceptionWithName:@”程序异常” reason:@”异常原因:数组越界” userInfo:nil];方式二NSString *info = [NSString stringWithFormat:@”%@找不到方法”,NSStringFromSelector(aSelector)];下面这种方法是自动抛出的[NSException raise:@”抛出异常” format:info,nil]; 3.如何捕获异常 NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);void UncaughtExceptionHandler(NSException *exception) { NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息 NSString *reason = [exception reason];//非常重要,就是崩溃的原因 NSString *name = [exception name];//异常类型 NSString *errorMsg = [NSString stringWithFormat:@"当前调用栈的信息:%@\nCrash的原因:%@\n异常类型:%@\n",arr,reason,name]; //把该信息保存到本地沙盒,下次回传给服务器。 } void UncaughtExceptionHandler(NSException *exception) { //获取异常崩溃信息 NSArray *callStack = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]]; //把异常崩溃信息发送至开发者邮件 NSMutableString *mailUrl = [NSMutableString string]; [mailUrl appendString:@"mailto:test@qq.com"]; [mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"]; [mailUrl appendFormat:@"&amp;body=%@", content]; //打开地址 NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]]; } 5 补充 关于JS相关的学习框架:WebViewJavascriptBridge ]]></content>
</entry>
<entry>
<title><![CDATA[分享下平时我在Mac平台下的比较好的软件-为知笔记(一)]]></title>
<url>%2F2016%2F05%2F09%2F45-1%2F</url>
<content type="text"><![CDATA[有用的信息在没有经过归纳、整理、思考之前只是一堆无用的数据。而笔记类应用现在也来越往知识管理软件的方向发展,其目的就是让信息在其中变成对用户真正有用的知识。之前用过印象笔记,有道云笔记,为知笔记是前不久才用上的,下面说下对着3个笔记软件的个人感受(图片稍后贴上,苦逼中午考试还在为你们写文章有木有): 印象笔记2013年8月开始用(Android版),中途卸载,前几个月又装上,一方面因为许多人推荐过,毕竟国内国外好评如潮,所以就装上来试试,发现使用习惯和我个人不符,便卸载了,一直使用锤子便签替代。后来又装上来试试,发现更新这么久还是不符合我,最后终于放弃。 有道云笔记印象最深的就是广告,印象中王自如的评测手机视频每一集开头都有他的广告,毕竟有一个“好爸爸”网易。所以前几个月尝试使用。然而一进去就是广告,这叫我怎么能忍受,你做广告可以,但是不能是固定在笔记的广告呀,虽然可以x掉,但是印象差评。有道云笔记侧重的应该是团队协作,然而对于我这种大学汪来说,并不需要,而且和印象笔记一样,界面、使用功能没有符合我的口味的。 为知笔记这个软件让我有好感的就是全平台有木有!!!,我大Mac下也可以使用。还可以用MarkDown(前面2个也可以)、皮肤好看(大实话,对于我这种强迫症来说都觉得看)、多级文件夹(印象笔记要收费)、实时同步(可以说是笔记软件的基本功能)、支持一键发布到博客、团队比较用心,更新勤快。最让我动心的就是可以收藏网页,不是收藏网址,是完整的网页内容,我之前收藏网页内容都是靠接图,然后等有时间在去浏览,或者用锤子便签记住网址。但是自从用上这个,你懂的,保存下来,上课不怕没流量啦,哈哈哈。每月500M对于一般人来说够用了。 贱贱滴分享下为知笔记的邀请链接。 展示(提示:点击图片进入看图模式效果更佳) 印象笔记 有道云笔记 为知笔记 总结 论美观,安卓下面的Material Design设计不能少。印象笔记和为知笔记胜出;有道云笔记还是顶部大黑边,差评,而且整体UI不咋滴好看;为知笔记整个app都是MD设计,看起来灰常有感觉,时尚年轻。 论功能,就我体验,保存资料,例如离线网页,为知笔记胜出,能够完整显示出原网页;印象笔记一般,网页结构与原网页不一致,内容还是有的;有道云笔记差评,我要的是网页,然而它给我保存一个网址链接,整个人都黑线了0-0. 论侧重点。有道云笔记绝对是侧重办公,里面的团队协作等等;为知笔记偏向年轻群体;印象笔记用户群体比较广泛。 论云端容量。有道云笔记胜出,默认3G,每天签到也可以的几M容量;为知笔记600M;印象笔记最少60M。 论用户体验。这个每个人评判标准都不一样,毕竟如何”一万个人心中有一万个哈姆雷特”.我个人觉得为知笔记用户体验最好,MarkDown支持完善、美观 的界面、必要的功能有、还有一些极客功能,例如文章直接推送到博客、其他拓展功能收费也应该,不是刚性需求,毕竟开发需要资金。]]></content>
</entry>
<entry>
<title><![CDATA[分享下平时我在Mac平台下的比较好的软件-为知笔记(一)]]></title>
<url>%2F2016%2F05%2F09%2F45%2F</url>
<content type="text"><![CDATA[有用的信息在没有经过归纳、整理、思考之前只是一堆无用的数据。而笔记类应用现在也来越往知识管理软件的方向发展,其目的就是让信息在其中变成对用户真正有用的知识。之前用过印象笔记,有道云笔记,为知笔记是前不久才用上的,下面说下对着3个笔记软件的个人感受(图片稍后贴上,苦逼中午考试还在为你们写文章有木有): 印象笔记2013年8月开始用(Android版),中途卸载,前几个月又装上,一方面因为许多人推荐过,毕竟国内国外好评如潮,所以就装上来试试,发现使用习惯和我个人不符,便卸载了,一直使用锤子便签替代。后来又装上来试试,发现更新这么久还是不符合我,最后终于放弃。 有道云笔记印象最深的就是广告,印象中王自如的评测手机视频每一集开头都有他的广告,毕竟有一个“好爸爸”网易。所以前几个月尝试使用。然而一进去就是广告,这叫我怎么能忍受,你做广告可以,但是不能是固定在笔记的广告呀,虽然可以x掉,但是印象差评。有道云笔记侧重的应该是团队协作,然而对于我这种大学汪来说,并不需要,而且和印象笔记一样,界面、使用功能没有符合我的口味的。 为知笔记这个软件让我有好感的就是全平台有木有!!!,我大Mac下也可以使用。还可以用MarkDown(前面2个也可以)、皮肤好看(大实话,对于我这种强迫症来说都觉得看)、多级文件夹(印象笔记要收费)、实时同步(可以说是笔记软件的基本功能)、支持一键发布到博客、团队比较用心,更新勤快。最让我动心的就是可以收藏网页,不是收藏网址,是完整的网页内容,我之前收藏网页内容都是靠接图,然后等有时间在去浏览,或者用锤子便签记住网址。但是自从用上这个,你懂的,保存下来,上课不怕没流量啦,哈哈哈。每月500M对于一般人来说够用了。 贱贱滴分享下为知笔记的邀请链接。 展示(提示:点击图片进入看图模式效果更佳) 印象笔记 有道云笔记 为知笔记 总结 论美观,安卓下面的Material Design设计不能少。印象笔记和为知笔记胜出;有道云笔记还是顶部大黑边,差评,而且整体UI不咋滴好看;为知笔记整个app都是MD设计,看起来灰常有感觉,时尚年轻。 论功能,就我体验,保存资料,例如离线网页,为知笔记胜出,能够完整显示出原网页;印象笔记一般,网页结构与原网页不一致,内容还是有的;有道云笔记差评,我要的是网页,然而它给我保存一个网址链接,整个人都黑线了0-0. 论侧重点。有道云笔记绝对是侧重办公,里面的团队协作等等;为知笔记偏向年轻群体;印象笔记用户群体比较广泛。 论云端容量。有道云笔记胜出,默认3G,每天签到也可以的几M容量;为知笔记600M;印象笔记最少60M。 论用户体验。这个每个人评判标准都不一样,毕竟如何”一万个人心中有一万个哈姆雷特”.我个人觉得为知笔记用户体验最好,MarkDown支持完善、美观 的界面、必要的功能有、还有一些极客功能,例如文章直接推送到博客、其他拓展功能收费也应该,不是刚性需求,毕竟开发需要资金。]]></content>
</entry>
<entry>
<title><![CDATA[更新了自我介绍内容,更加炫(zhuang )酷(bi)]]></title>
<url>%2F2016%2F05%2F09%2F44%2F</url>
<content type="text"><![CDATA[前几天无意间看到一个网站,具体哪一个忘记了,那天浏览了大量博客。他的关于界面做得非常炫酷,看了他的源码,百度一下原来是黑科技:impress.js。 这等炫(zhuang)酷(bi)的东西,你懂的。于是乎,我便用上了。大家可以访问我的看看:about。也可以自己动手做一个,Github上有现成的例子,自己只需要修改即可。Github地址:impress.js (截止我写文章的时候,已经有27281的star)。 Github可能被墙,所以提供目前最新版给大家下载: [file]]]></content>
</entry>
<entry>
<title><![CDATA[更新了自我介绍内容,更加炫(zhuang )酷(bi)]]></title>
<url>%2F2016%2F05%2F09%2F44-1%2F</url>
<content type="text"><![CDATA[前几天无意间看到一个网站,具体哪一个忘记了,那天浏览了大量博客。他的关于界面做得非常炫酷,看了他的源码,百度一下原来是黑科技:impress.js。 这等炫(zhuang)酷(bi)的东西,你懂的。于是乎,我便用上了。大家可以访问我的看看:about。也可以自己动手做一个,Github上有现成的例子,自己只需要修改即可。Github地址:impress.js (截止我写文章的时候,已经有27281的star)。 Github可能被墙,所以提供目前最新版给大家下载: [file]]]></content>
</entry>
<entry>
<title><![CDATA[个人博客SEO设置小技巧]]></title>
<url>%2F2016%2F05%2F06%2F43%2F</url>
<content type="text"><![CDATA[个人水平有限,还在初步学习SEO中,下面会更新一些我所学到的关于博客SEO的小技巧,大家可以发表自己的看法或者分享自己的技巧,一起成长,一起共勉! 设置站点描述<meta name=”description” content=”关于你的博客的介绍” /> 设置关键词<meta name=”keywords” content=”你的博客的关键词”/> 翻页按钮设置一般博客有好几页文章,所以有下一页,上一页按钮,然而如果蜘蛛爬行到你的网站,爬文章的时候,第一页爬玩了,想爬行最后一页,它会发现只能一页一页爬过去,没有快捷方式,对小蜘蛛很不友好。可以改为1,2,3…最后一页类似的形式,方便读者阅读与蜘蛛爬行。 外链转内链你在博客里面引入一个外部链接网址,蜘蛛爬行你的文章,然后就顺着链接跑走了,再也回不来了。这时候就需要把外链转内链,减少权重的流失。 例子: 百度主页都知道是www.baidu.com ,如果进行外链转内链,就会是(这是我在Typecho下的插件得出的)http://www.huangbowei.com/t/aHR0cHM6Ly93d3cuYmFpZHUuY29tLw== 注意友情链接里的nofollow值顾名思义,nofollow 是HTML页面中a标签的属性值。这个标签的意义是告诉搜索引擎”不要追踪此网页上的链接或不要追踪此特定链接”。这个一般用在评论区,防止爬虫追踪评论区里面的恶意链接,对网站造成影响。但是某些博主可能会在友情链接标签里面动手脚,大家和别人交换友情链接的时候要注意,例子:原本正常的友情链接应该是这样:<a target=”_blank” href=”http://www.huangbowei.com">Tim's Blog</a>动手脚后,告诉爬虫不要追踪此链接,同时也阻止了权重的传递,这样友情链接的作用就微乎其微了:<a target=”_blank” href=”http://www.huangbowei.com“ rel=”nofollow”>Tim’s Blog</a>大家可以用Firebug查看源代码得知,教程Firebug学习资料 SEO工具网站 站长工具还不错,可以用来查询百度权重,博客速度诊断等。]]></content>
</entry>
<entry>
<title><![CDATA[个人博客SEO设置小技巧]]></title>
<url>%2F2016%2F05%2F06%2F43-1%2F</url>
<content type="text"><![CDATA[个人水平有限,还在初步学习SEO中,下面会更新一些我所学到的关于博客SEO的小技巧,大家可以发表自己的看法或者分享自己的技巧,一起成长,一起共勉! 设置站点描述<meta name=”description” content=”关于你的博客的介绍” /> 设置关键词<meta name=”keywords” content=”你的博客的关键词”/> 翻页按钮设置一般博客有好几页文章,所以有下一页,上一页按钮,然而如果蜘蛛爬行到你的网站,爬文章的时候,第一页爬玩了,想爬行最后一页,它会发现只能一页一页爬过去,没有快捷方式,对小蜘蛛很不友好。可以改为1,2,3…最后一页类似的形式,方便读者阅读与蜘蛛爬行。 外链转内链你在博客里面引入一个外部链接网址,蜘蛛爬行你的文章,然后就顺着链接跑走了,再也回不来了。这时候就需要把外链转内链,减少权重的流失。 例子: 百度主页都知道是www.baidu.com ,如果进行外链转内链,就会是(这是我在Typecho下的插件得出的)http://www.huangbowei.com/t/aHR0cHM6Ly93d3cuYmFpZHUuY29tLw== 注意友情链接里的nofollow值顾名思义,nofollow 是HTML页面中a标签的属性值。这个标签的意义是告诉搜索引擎”不要追踪此网页上的链接或不要追踪此特定链接”。这个一般用在评论区,防止爬虫追踪评论区里面的恶意链接,对网站造成影响。但是某些博主可能会在友情链接标签里面动手脚,大家和别人交换友情链接的时候要注意,例子:原本正常的友情链接应该是这样:<a target=”_blank” href=”http://www.huangbowei.com">Tim's Blog</a>动手脚后,告诉爬虫不要追踪此链接,同时也阻止了权重的传递,这样友情链接的作用就微乎其微了:<a target=”_blank” href=”http://www.huangbowei.com“ rel=”nofollow”>Tim’s Blog</a>大家可以用Firebug查看源代码得知,教程Firebug学习资料 SEO工具网站 站长工具还不错,可以用来查询百度权重,博客速度诊断等。]]></content>
</entry>
<entry>
<title><![CDATA[Objective-c自学笔记(1)-AppDelegate.m]]></title>
<url>%2F2016%2F05%2F05%2F42-1%2F</url>
<content type="text"><![CDATA[写一些平时看书学习ios的笔记,基础的、进阶的都有,供以后回顾,也可以让刚开始学习的同学学习。一些基本文件的解释: #import “AppDelegate.h” @interface AppDelegate () @end @implementation AppDelegate (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions { // Override point for customization after application launch. //可以在这里重载应用程序启动后的自定义代码 return YES;} (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. //应用程序从活动状态切换到非活动状态时会触发这个方法。在出现某种临时中断(比如来电话或者短信)或用户退出应用程序时都会触发。然后应用程序就会转为后台运行。 // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. //可以在这个方法中暂停正在运行的任务、禁用定时器和降低OpenGL ES帧率。如果是游戏应用,可以在这个方法中暂停游戏。} (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. //在该方法中释放公用资源、保存用户数据、取消定时器,并尽量存储应用程序状态信息,这样万一后面应用程序被终止了,将来可以恢复到当前状态。 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. //如果你的应用程序支持在后台运行,那么当用户退出时会调用这个方法而不是applicationWillTerminate方法。} (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. //这个方法会在应用程序从后台运行状态转换到活动状态的过程中被调用,可以在这里恢复应用程序正常运行所需要的信息。} (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. //重启应用程序在非活动状态被暂停(或者尚未启动)的任务。如果应用程序之前在后台运行,那么可以选择是否刷新用户界面。} (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. //程序即将终止时会调用孩方法。请尽可能保存数据。参考applicationDidEnterBackground方法} @end ]]></content>
</entry>
<entry>
<title><![CDATA[Objective-c自学笔记(1)-AppDelegate.m]]></title>
<url>%2F2016%2F05%2F05%2F42%2F</url>
<content type="text"><![CDATA[写一些平时看书学习ios的笔记,基础的、进阶的都有,供以后回顾,也可以让刚开始学习的同学学习。一些基本文件的解释: #import “AppDelegate.h” @interface AppDelegate () @end @implementation AppDelegate (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions { // Override point for customization after application launch. //可以在这里重载应用程序启动后的自定义代码 return YES;} (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. //应用程序从活动状态切换到非活动状态时会触发这个方法。在出现某种临时中断(比如来电话或者短信)或用户退出应用程序时都会触发。然后应用程序就会转为后台运行。 // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. //可以在这个方法中暂停正在运行的任务、禁用定时器和降低OpenGL ES帧率。如果是游戏应用,可以在这个方法中暂停游戏。} (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. //在该方法中释放公用资源、保存用户数据、取消定时器,并尽量存储应用程序状态信息,这样万一后面应用程序被终止了,将来可以恢复到当前状态。 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. //如果你的应用程序支持在后台运行,那么当用户退出时会调用这个方法而不是applicationWillTerminate方法。} (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. //这个方法会在应用程序从后台运行状态转换到活动状态的过程中被调用,可以在这里恢复应用程序正常运行所需要的信息。} (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. //重启应用程序在非活动状态被暂停(或者尚未启动)的任务。如果应用程序之前在后台运行,那么可以选择是否刷新用户界面。} (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. //程序即将终止时会调用孩方法。请尽可能保存数据。参考applicationDidEnterBackground方法} @end ]]></content>
</entry>
<entry>
<title><![CDATA[调试工具---Firebug学习资料]]></title>
<url>%2F2016%2F05%2F05%2F41%2F</url>
<content type="text"><![CDATA[Firebug是WEB调试工具之一,是网页浏览器 Firefox 下的一款开发类插件。它集HTML查看和编辑、JS控制台、网络状况监视器于一体,是开发JavaScript、CSS、HTML和Ajax的得力助手。掌握Firebug的使用,可从各个不同的角度剖析Web页面内部的细节,给Web开发带来极大的便利。 由于最近在观看各大博客,企业等的的网站,学习他们代码里面的精髓,顺便看看源代码,有时候自己也要调试网页,火狐的Firebug和谷歌浏览器自带的调试器当然比不可少,虽然知道一些基本用法,但是求知欲驱使着我了解Firebug的更多高级使用方法,所以查找资料学习进阶,不进前端可以用到,就算是后端也可以用到,多多学习,增长知识!目前正在完善网站SEO方面的东西,有新的学习资料我也会分享出来给大家! 慕课网的学习视频: SEO在网页制作中的应用: [reply][file][/reply]]]></content>
</entry>
<entry>
<title><![CDATA[调试工具---Firebug学习资料]]></title>
<url>%2F2016%2F05%2F05%2F41-1%2F</url>
<content type="text"><![CDATA[Firebug是WEB调试工具之一,是网页浏览器 Firefox 下的一款开发类插件。它集HTML查看和编辑、JS控制台、网络状况监视器于一体,是开发JavaScript、CSS、HTML和Ajax的得力助手。掌握Firebug的使用,可从各个不同的角度剖析Web页面内部的细节,给Web开发带来极大的便利。 由于最近在观看各大博客,企业等的的网站,学习他们代码里面的精髓,顺便看看源代码,有时候自己也要调试网页,火狐的Firebug和谷歌浏览器自带的调试器当然比不可少,虽然知道一些基本用法,但是求知欲驱使着我了解Firebug的更多高级使用方法,所以查找资料学习进阶,不进前端可以用到,就算是后端也可以用到,多多学习,增长知识!目前正在完善网站SEO方面的东西,有新的学习资料我也会分享出来给大家! 慕课网的学习视频: SEO在网页制作中的应用: [reply][file][/reply]]]></content>
</entry>
<entry>
<title><![CDATA[关于学习SEO的一些资料]]></title>
<url>%2F2016%2F05%2F05%2F40-1%2F</url>
<content type="text"><![CDATA[不论任何网站,当然希望越多人访问越好,除了那些私人网站。那么SEO必不可少,我也是问了自己博客才学习SEO,当然ios程序猿只能学学皮毛。分享下我的学习资料。 SEO实战密码:60天网站流量提高20倍这本书堪称经典,可以说学习SEO这本书就够了。作者也是叼叼的:昝辉,网名Zac。Zac于2006年开始写中文博客<SEO每天一贴>。几个月内该博客成为中国SEO领域被引用最多,受欢迎的行业博客之一,很多文章在网上广为流传。这本书第1版也是2010年12月上市,转眼间已经5年多了。这5年中,第1版、第2版都取得了骄人的成绩,连续5年获得电子工业出版社最畅销书奖,并且本书第2版获得“第十二届输出版优秀图书”的荣誉。第三版也于2015年7月份出版。大家感兴趣可以买纸质书学习。 SEO个人学习技巧可以参考我写的文章SEO小技巧 [reply][file][/reply]]]></content>
</entry>
<entry>
<title><![CDATA[关于学习SEO的一些资料]]></title>
<url>%2F2016%2F05%2F05%2F40%2F</url>
<content type="text"><![CDATA[不论任何网站,当然希望越多人访问越好,除了那些私人网站。那么SEO必不可少,我也是问了自己博客才学习SEO,当然ios程序猿只能学学皮毛。分享下我的学习资料。 SEO实战密码:60天网站流量提高20倍这本书堪称经典,可以说学习SEO这本书就够了。作者也是叼叼的:昝辉,网名Zac。Zac于2006年开始写中文博客<SEO每天一贴>。几个月内该博客成为中国SEO领域被引用最多,受欢迎的行业博客之一,很多文章在网上广为流传。这本书第1版也是2010年12月上市,转眼间已经5年多了。这5年中,第1版、第2版都取得了骄人的成绩,连续5年获得电子工业出版社最畅销书奖,并且本书第2版获得“第十二届输出版优秀图书”的荣誉。第三版也于2015年7月份出版。大家感兴趣可以买纸质书学习。 SEO个人学习技巧可以参考我写的文章SEO小技巧 [reply][file][/reply]]]></content>
</entry>
<entry>
<title><![CDATA[关于模仿网站的一些心得]]></title>
<url>%2F2016%2F05%2F05%2F39%2F</url>
<content type="text"><![CDATA[最近在做一个公司网站(学习为主),发现大部分企业网站都是静态网页,用php的少之又少,大部分都是html的。于是便打开浏览器的调试器,Firebug不错,谷歌自带的调试器也相当给力。可以直接查看网页源代码,然后拷贝到本地。步骤也不繁琐,一个小点的网站几十分钟就可以全部搞定。不过,有一个神器,全自动帮你完成,我自己用了下,还真不错,可以用来写写[swift][1],[objective-c][2]等学习的网站,特此推荐给大家。 关于网站建设可以看:小白搭建博客教程之流程 下面介绍本文的重点: 仿站神器:Teleport Pro Teleport Pro由美国Tennyson Maxwell公司开发,曾被PC Magazine评为”编辑选择奖”、ZDNet评为五星。它可以完全或部分下载一个网站上的内容,使用户能够离线浏览;可以在硬盘上创建一个与原网站完全相同的镜象;可以在网站上寻找并下载某一类型的文件;可以探测并记录一个网站的所有网页和文件的清单;可以从一个中心网站探测每一个与之链接的网站。工具使用方法也非常简单,下面会用图片介绍一下步骤,大家千万不要用来干坏事哟0-0: 打开文件夹,会看到网页已经全部下载好了,而且js,css等全部帮你分类好了,有木有点小激动! 最后在本地打开网页可能会乱码,解决方法也很简单,用editplus或者notepad++把所有有下面代码的网页一键替换:charset=UTF-8”UTF-8”改为charset=”UTF-8”[file] 悄悄滴放上一个激活码: [reply]激活码:注册用户名:iHackSoft.com注册码:1509213634 [/reply]]]></content>
</entry>
<entry>
<title><![CDATA[关于模仿网站的一些心得]]></title>
<url>%2F2016%2F05%2F05%2F39-1%2F</url>
<content type="text"><![CDATA[最近在做一个公司网站(学习为主),发现大部分企业网站都是静态网页,用php的少之又少,大部分都是html的。于是便打开浏览器的调试器,Firebug不错,谷歌自带的调试器也相当给力。可以直接查看网页源代码,然后拷贝到本地。步骤也不繁琐,一个小点的网站几十分钟就可以全部搞定。不过,有一个神器,全自动帮你完成,我自己用了下,还真不错,可以用来写写[swift][1],[objective-c][2]等学习的网站,特此推荐给大家。 关于网站建设可以看:小白搭建博客教程之流程 下面介绍本文的重点: 仿站神器:Teleport Pro Teleport Pro由美国Tennyson Maxwell公司开发,曾被PC Magazine评为”编辑选择奖”、ZDNet评为五星。它可以完全或部分下载一个网站上的内容,使用户能够离线浏览;可以在硬盘上创建一个与原网站完全相同的镜象;可以在网站上寻找并下载某一类型的文件;可以探测并记录一个网站的所有网页和文件的清单;可以从一个中心网站探测每一个与之链接的网站。工具使用方法也非常简单,下面会用图片介绍一下步骤,大家千万不要用来干坏事哟0-0: 打开文件夹,会看到网页已经全部下载好了,而且js,css等全部帮你分类好了,有木有点小激动! 最后在本地打开网页可能会乱码,解决方法也很简单,用editplus或者notepad++把所有有下面代码的网页一键替换:charset=UTF-8”UTF-8”改为charset=”UTF-8”[file] 悄悄滴放上一个激活码: [reply]激活码:注册用户名:iHackSoft.com注册码:1509213634 [/reply]]]></content>
</entry>
<entry>
<title><![CDATA[windows安装双系统教程]]></title>
<url>%2F2016%2F04%2F23%2F38-1%2F</url>
<content type="text"><![CDATA[装双系统其实mac下更难,windows电脑装双windows系统很简单,但是鉴于大家水平不一样,应{朋 友|xiong ming}要求,还是把自己{装 机|zhuang bi}多年的经验分享给大家,让大家可以在妹子前耍帅0-0. 下载windows系统查看电脑是32位还是64位系统方法:按住键盘上的windows加R打开运行窗口,输入cmd,然后在弹出的黑白窗口输入systeminfo。 推荐进入msdn官网下载,全部都是微软官方镜像,不会有什么推广垃圾软件和病毒。 然后图中的windows10有4个版本供你选择(推荐下Multiple Editions版本):分别是 Multiple Editions:包含家庭版和专业版。家庭版:面向使用PC、平板电脑和二合一设备的消费者。它将拥有Windows 10的主要功能:Cortana语音助手(选定市场)、Edge浏览器、面向触控屏设备的Continuum平板电脑模式、Windows Hello(脸部识别、虹膜、指纹登录)、串流Xbox One游戏的能力、微软开发的通用Windows应用(Photos、Maps、Mail、Calendar、Music和Video)。 专业版:面向使用PC、平板电脑和二合一设备的企业用户。除具有Windows 10家庭版的功能外,它还使用户能管理设备和应用,保护敏感的企业数据,支持远程和移动办公,使用云计算技术。另外,它还带有Windows Update for Business,微软承诺该功能可以降低管理成本、控制更新部署,让用户更快地获得安全补丁软件。 Education:教育版。以Windows 10企业版为基础,面向学校职员、管理人员、教师和学生。它将通过面向教育机构的批量许可计划提供给客户,学校将能够升级Windows 10家庭版和Windows 10专业版设备。 Enterprise:企业版。以专业版为基础,增添了大中型企业用来防范针对设备、身份、应用和敏感企业信息的现代安全威胁的先进功能,供微软的批量许可(Volume Licensing)客户使用,用户能选择部署新技术的节奏,其中包括使用Windows Update for Business的选项。作为部署选项,Windows 10企业版将提供长期服务分支(Long Term Servicing Branch)。 Enterprise 2015 LTSB:ltsb为长期支持版本,支持周期长达10年,但只会推送安全更新和热修复补丁,而不会增加任何新功能。该版本无edge浏览器。其他无差别,是为需要系统维持一定稳定性的企业推出的。勾选好你要下载的操作系统,点击下方已勾选,会看到这样的东西:ed2k://|file|cn_windows_10_multiple_editions_x64_dvd_6848463.iso|4303300608|94FD861E82458005A9CA8E617379856A|/把这些复制到你的下载器,比如迅雷,旋风啥的,让他下载。 安装windows系统 把下载下来的iso非系统分区的根目录,比如你现在的系统装在C盘,那就解压在除C盘外的任意一个根目录。 然后下载nt6 hdd installer: [file] 直接打开nt6 hdd installer v3.1.4.exe。然后键盘上输入 1 即可进行下一步安装。 接着,如果win10原版的安装包解压的位置正确(上面提到解压在非安装盘的根目录即可),NT6工具会自动识别到它。然后键盘输入 2 选择重启。 选择重启后,重启时会多出一个NT6的启动项,选择从mode 1 来启动即可。 接下来就会进入熟悉的windows安装界面。(提示输入密钥选择先跳过,开机后用工具即可)。 最重要的部分,因为我们是安装双系统,不是重装系统,等到提示“你想执行哪种类型的安装”的时候,选择自定义安装,这样不会产生windows old文件备份。然后会问“你想将windows安装在哪里?”,(如果电脑上有多个硬盘时一定要不弄所要安装第二个系统的盘(这里是指win10),否则选择错会损失数据,数据无价,请再三确认,可通过不同盘的容量来确认),选择一个你想安装windows10的系统的盘,注意,这部会格式化你选择的盘的数据,其它盘的数据不会影响。 然后就开始安装啦,慢慢等待。等安装完成会进行一些基本设置,按照个人喜好设置即可,没什么大影响。 以后开机就会有双系统选择提示,这样,双系统的安装差不多结束啦!有哪些地方写的不清楚或者错误,欢迎指出或提问。 ]]></content>
</entry>
<entry>
<title><![CDATA[windows安装双系统教程]]></title>
<url>%2F2016%2F04%2F23%2F38%2F</url>
<content type="text"><![CDATA[装双系统其实mac下更难,windows电脑装双windows系统很简单,但是鉴于大家水平不一样,应{朋 友|xiong ming}要求,还是把自己{装 机|zhuang bi}多年的经验分享给大家,让大家可以在妹子前耍帅0-0. 下载windows系统查看电脑是32位还是64位系统方法:按住键盘上的windows加R打开运行窗口,输入cmd,然后在弹出的黑白窗口输入systeminfo。 推荐进入msdn官网下载,全部都是微软官方镜像,不会有什么推广垃圾软件和病毒。 然后图中的windows10有4个版本供你选择(推荐下Multiple Editions版本):分别是 Multiple Editions:包含家庭版和专业版。家庭版:面向使用PC、平板电脑和二合一设备的消费者。它将拥有Windows 10的主要功能:Cortana语音助手(选定市场)、Edge浏览器、面向触控屏设备的Continuum平板电脑模式、Windows Hello(脸部识别、虹膜、指纹登录)、串流Xbox One游戏的能力、微软开发的通用Windows应用(Photos、Maps、Mail、Calendar、Music和Video)。 专业版:面向使用PC、平板电脑和二合一设备的企业用户。除具有Windows 10家庭版的功能外,它还使用户能管理设备和应用,保护敏感的企业数据,支持远程和移动办公,使用云计算技术。另外,它还带有Windows Update for Business,微软承诺该功能可以降低管理成本、控制更新部署,让用户更快地获得安全补丁软件。 Education:教育版。以Windows 10企业版为基础,面向学校职员、管理人员、教师和学生。它将通过面向教育机构的批量许可计划提供给客户,学校将能够升级Windows 10家庭版和Windows 10专业版设备。 Enterprise:企业版。以专业版为基础,增添了大中型企业用来防范针对设备、身份、应用和敏感企业信息的现代安全威胁的先进功能,供微软的批量许可(Volume Licensing)客户使用,用户能选择部署新技术的节奏,其中包括使用Windows Update for Business的选项。作为部署选项,Windows 10企业版将提供长期服务分支(Long Term Servicing Branch)。 Enterprise 2015 LTSB:ltsb为长期支持版本,支持周期长达10年,但只会推送安全更新和热修复补丁,而不会增加任何新功能。该版本无edge浏览器。其他无差别,是为需要系统维持一定稳定性的企业推出的。勾选好你要下载的操作系统,点击下方已勾选,会看到这样的东西:ed2k://|file|cn_windows_10_multiple_editions_x64_dvd_6848463.iso|4303300608|94FD861E82458005A9CA8E617379856A|/把这些复制到你的下载器,比如迅雷,旋风啥的,让他下载。 安装windows系统 把下载下来的iso非系统分区的根目录,比如你现在的系统装在C盘,那就解压在除C盘外的任意一个根目录。 然后下载nt6 hdd installer: [file] 直接打开nt6 hdd installer v3.1.4.exe。然后键盘上输入 1 即可进行下一步安装。 接着,如果win10原版的安装包解压的位置正确(上面提到解压在非安装盘的根目录即可),NT6工具会自动识别到它。然后键盘输入 2 选择重启。 选择重启后,重启时会多出一个NT6的启动项,选择从mode 1 来启动即可。 接下来就会进入熟悉的windows安装界面。(提示输入密钥选择先跳过,开机后用工具即可)。 最重要的部分,因为我们是安装双系统,不是重装系统,等到提示“你想执行哪种类型的安装”的时候,选择自定义安装,这样不会产生windows old文件备份。然后会问“你想将windows安装在哪里?”,(如果电脑上有多个硬盘时一定要不弄所要安装第二个系统的盘(这里是指win10),否则选择错会损失数据,数据无价,请再三确认,可通过不同盘的容量来确认),选择一个你想安装windows10的系统的盘,注意,这部会格式化你选择的盘的数据,其它盘的数据不会影响。 然后就开始安装啦,慢慢等待。等安装完成会进行一些基本设置,按照个人喜好设置即可,没什么大影响。 以后开机就会有双系统选择提示,这样,双系统的安装差不多结束啦!有哪些地方写的不清楚或者错误,欢迎指出或提问。 ]]></content>
</entry>
<entry>
<title><![CDATA[关于最新163邮箱密码泄露]]></title>
<url>%2F2016%2F04%2F10%2F37%2F</url>
<content type="text"><![CDATA[前段时间网易163邮箱泄露就闹得沸沸扬扬,然而网易单方面公告说没有泄露,结合最近一大波iphone用户手机被锁,进行敲诈勒索,叫人怎么能相信密码没有泄露,就在前几天,又被曝出密码再次泄露,还好我从来不用163,126邮箱0-0,不论如何,大家尽快修改自己的密码,做到定期更换密码才是王道。 关于保护iphone被锁定,可以访问:关于iphone设备被陌生人锁定!! 下载地址:[file](由于国内政策,你懂的,需梯子)下面给出一些个人认为比较好的查询网站(个人推荐3) 请大家不要做非法用途!!!1.听说这个网站是好心黑客专门搭建的,让大家查询自己网易邮箱密码是否泄露,大家可以进去试试看,名字是网易52密码库查询(难道是网易的52g密码数据库都泄露了吗,估计还是明文保存的):https://163password.download/2.还有一个是貌似是乌云(自由平等开放的漏洞报告平台)建立的,里面可以查询的泄露密码比较多,有12306,QQ,Gmail,天涯,7K7K等:http://www.xiumima.com/[![](https://www.huangbowei.com/wp-content/uploads/2017/01/163youxiang2.png)](https://www.huangbowei.com/wp-content/uploads/2017/01/163youxiang2.png)3.这个是个人博主免费开放的,里面可以查询的信息非常多,甚至有开房记录,让人汗颜。2月份的时候博主还因为资金不够发起捐款,因为数据太多,6台服务器费用太昂贵,截止3月份已经超过2000元捐赠,人多力量大,好比开源软件,程序猿的无私奉献总会得到回报,多少不说,心意在就好(由于国内政策,你懂的,部分查询需翻墙):https://www.findmima.com/info/list.html]]></content>
</entry>
<entry>
<title><![CDATA[关于最新163邮箱密码泄露]]></title>
<url>%2F2016%2F04%2F10%2F37-1%2F</url>
<content type="text"><![CDATA[前段时间网易163邮箱泄露就闹得沸沸扬扬,然而网易单方面公告说没有泄露,结合最近一大波iphone用户手机被锁,进行敲诈勒索,叫人怎么能相信密码没有泄露,就在前几天,又被曝出密码再次泄露,还好我从来不用163,126邮箱0-0,不论如何,大家尽快修改自己的密码,做到定期更换密码才是王道。 关于保护iphone被锁定,可以访问:关于iphone设备被陌生人锁定!! 下载地址:[file](由于国内政策,你懂的,需梯子)下面给出一些个人认为比较好的查询网站(个人推荐3) 请大家不要做非法用途!!!1.听说这个网站是好心黑客专门搭建的,让大家查询自己网易邮箱密码是否泄露,大家可以进去试试看,名字是网易52密码库查询(难道是网易的52g密码数据库都泄露了吗,估计还是明文保存的):https://163password.download/2.还有一个是貌似是乌云(自由平等开放的漏洞报告平台)建立的,里面可以查询的泄露密码比较多,有12306,QQ,Gmail,天涯,7K7K等:http://www.xiumima.com/[![](https://www.huangbowei.com/wp-content/uploads/2017/01/163youxiang2.png)](https://www.huangbowei.com/wp-content/uploads/2017/01/163youxiang2.png)3.这个是个人博主免费开放的,里面可以查询的信息非常多,甚至有开房记录,让人汗颜。2月份的时候博主还因为资金不够发起捐款,因为数据太多,6台服务器费用太昂贵,截止3月份已经超过2000元捐赠,人多力量大,好比开源软件,程序猿的无私奉献总会得到回报,多少不说,心意在就好(由于国内政策,你懂的,部分查询需翻墙):https://www.findmima.com/info/list.html]]></content>
</entry>
<entry>
<title><![CDATA[关于iphone设备被陌生人锁定!!]]></title>
<url>%2F2016%2F04%2F10%2F36-1%2F</url>
<content type="text"><![CDATA[最近有很多论坛,贴吧里面提到自己的苹果设备无缘无故被锁定,还被人威胁加对方QQ并且给予一定的钱,否则就要被抹掉数据(一般都是163邮箱的苹果帐号)。 遇到这种情况肿么办? 断网:关闭Wifi,取出你的手机sim卡,这样对方就暂时无法通过icloud抹掉你的手机了。 既然你手机被远程锁定,那不用想,此时iCloud的账号一定被盗,对方如果已经盗取你的邮箱一定会修改你的密码或者更换你的icloud账号,所以先在电脑端进入Apple ID账户管理(请认准唯一官方网站!!),通过之前设置的救援邮箱,抢在对方之前更改你的icloud账号的密码,并将与之关联的所有设备解除关联,更改之后,你的账号就安全了。 此时便可以进入iCloud官网(请注意识别网址,有许多钓鱼网站专门伪造iCloud登录界面骗取你的帐号密码)解除对你手机的锁定。 因为我的iCloud开启过两步验证,所以登陆后还要手机短信验证码验证或者已经登陆iCloud设备验证才能进行更多操作,但是仍然可以使用“查找我的iPhone”。 特别提醒:很多黑客会通过邮箱假冒苹果官方的邮件来骗取您的apple id密码,所以请您一定要看清楚发件人的邮箱地址,只有appleid@id.apple.com才是苹果官方的专门处理apple id的邮件服务账号。如遇任何疑问,请及时拨打苹果官方客服热线:4006272273. 我们平时应该怎样预防这类事情的发生: 不要轻易使用公共Wifi,很多黑客会自建一个假的名称和公共Wifi很像的无线热点,然后守株待兔等你上钩,如果此时你很不幸的正好要更新/下载APP,当你输入密码的时候,对方便可以轻松掌握你的Apple ID和密码。 Apple ID为126和163邮箱的用户请尽快更改密码,近期有大量的用户因为126邮箱和163邮箱数据被盗导致Apple ID被黑的情况发生,所以请以上用户尽快修改密码,避免被居心叵测之人钻空子! 建议大家不要越狱,越狱不仅会在你处于公共wifi下增加安全风险,而且部分插件也会增加被盗号的风险,这边就不单独列举了。 不要轻易相信iPhone弹出的icloud登录窗,一不小心在假的登录窗输入密码以后就会让不法分子有可乘之机!那如何判断icloud弹窗是否是苹果官方的呢?方法很简单:弹窗后按home键,如果消失了就是病毒,如果没消失就是系统级别的,就是安全的! ]]></content>
</entry>
<entry>
<title><![CDATA[关于iphone设备被陌生人锁定!!]]></title>
<url>%2F2016%2F04%2F10%2F36%2F</url>
<content type="text"><![CDATA[最近有很多论坛,贴吧里面提到自己的苹果设备无缘无故被锁定,还被人威胁加对方QQ并且给予一定的钱,否则就要被抹掉数据(一般都是163邮箱的苹果帐号)。 遇到这种情况肿么办? 断网:关闭Wifi,取出你的手机sim卡,这样对方就暂时无法通过icloud抹掉你的手机了。 既然你手机被远程锁定,那不用想,此时iCloud的账号一定被盗,对方如果已经盗取你的邮箱一定会修改你的密码或者更换你的icloud账号,所以先在电脑端进入Apple ID账户管理(请认准唯一官方网站!!),通过之前设置的救援邮箱,抢在对方之前更改你的icloud账号的密码,并将与之关联的所有设备解除关联,更改之后,你的账号就安全了。 此时便可以进入iCloud官网(请注意识别网址,有许多钓鱼网站专门伪造iCloud登录界面骗取你的帐号密码)解除对你手机的锁定。 因为我的iCloud开启过两步验证,所以登陆后还要手机短信验证码验证或者已经登陆iCloud设备验证才能进行更多操作,但是仍然可以使用“查找我的iPhone”。 特别提醒:很多黑客会通过邮箱假冒苹果官方的邮件来骗取您的apple id密码,所以请您一定要看清楚发件人的邮箱地址,只有appleid@id.apple.com才是苹果官方的专门处理apple id的邮件服务账号。如遇任何疑问,请及时拨打苹果官方客服热线:4006272273. 我们平时应该怎样预防这类事情的发生: 不要轻易使用公共Wifi,很多黑客会自建一个假的名称和公共Wifi很像的无线热点,然后守株待兔等你上钩,如果此时你很不幸的正好要更新/下载APP,当你输入密码的时候,对方便可以轻松掌握你的Apple ID和密码。 Apple ID为126和163邮箱的用户请尽快更改密码,近期有大量的用户因为126邮箱和163邮箱数据被盗导致Apple ID被黑的情况发生,所以请以上用户尽快修改密码,避免被居心叵测之人钻空子! 建议大家不要越狱,越狱不仅会在你处于公共wifi下增加安全风险,而且部分插件也会增加被盗号的风险,这边就不单独列举了。 不要轻易相信iPhone弹出的icloud登录窗,一不小心在假的登录窗输入密码以后就会让不法分子有可乘之机!那如何判断icloud弹窗是否是苹果官方的呢?方法很简单:弹窗后按home键,如果消失了就是病毒,如果没消失就是系统级别的,就是安全的! ]]></content>
</entry>
<entry>
<title><![CDATA[自用图片压缩工具推荐(优化博客加载速度)]]></title>
<url>%2F2016%2F03%2F24%2F34-1%2F</url>
<content type="text"><![CDATA[之前wordpress写博客时文章里面的图片都是上传到服务器中,以前以为这样省事,都是原图上传,发现到后面弊端就出来啦。图片越来越多,服务器容量不够用不说,前端加载速度慢,影响读者阅读,导致读者流失。 毕竟那时候刚开始接触博客,随着后来知识面拓展,阅读量增加,发现这种做法效率太低。说下我现在的做法: 图片本地压缩 上传到空间上。例如七牛,腾讯云,利用CDN加速。下面详细讲解下: 1.图片本地压缩有时候博客或者网页里面需要插入图片,毕竟图文并茂对于读者来说更加有吸引力,更容易理解。图片利用压缩软件压缩,一般可以压缩50%以上,大大节省服务器空间和网页加载速度。这里提供我用的软件,这个软件好处就是图片拖进去,不用处理,原图片直接覆盖,其他的软件一般是输出到另一个文件夹,文件名也会改变,不方便。这个软件免费版一次只能处理10张图片,等于你要处理10张以后关闭,再打开,付费版没有限制。PP鸭下载链接:[file] 图片上传空间加速用得最多的恐怕就是七牛吧。大概的工作原理我通俗的解释下: 首先是图片存储在你自己服务器上:读者访问你的文章,直接从本地服务器加载图片。(用的是自己的流量,自己的服务器处理,没有额外加速buff)点击测试:我存在自己服务器上的图片 如果存储在七牛等上:读者访问你的文章,直接从七牛服务器加载图片。(用的是七牛的流量,七牛的服务器,根据服务商不同,可能会提供加速服务,减轻服务器压力,提高页面加载速度,有额外buff)点击测试:我存在腾讯cos上的图片 最后我说下感想: 毕竟自己用的是腾讯云的主机,发现用腾讯的存储空间还是挺方便的。七牛作为使用人数和接受度比较高的厂商,在前几年用的人多(可能现在还是比较多),因为免费还不需要备案就可以使用,对于服务器流量,性能不够的用户还是灰常不错的,一开始我也尝试用过七牛,但是不太方便,速度不太理想,图片还没有我放在本地加载快,而且想要使用CDN加速好像得充值10元验证你的账户。腾讯云就不一样,服务和价格都在那里,而且速度好,结合自己用的也是腾讯云的主机,事半功倍,图片也提供CDN加速。 我的网站所有图片都是放在腾讯的cos(对象存储服务)上的,图片提供CDN加速,网站也用了百度和腾讯云的CDN(内容分发网络),所以在网页加载速度上还是比较好滴。 ]]></content>
</entry>
<entry>
<title><![CDATA[自用图片压缩工具推荐(优化博客加载速度)]]></title>
<url>%2F2016%2F03%2F24%2F34%2F</url>
<content type="text"><![CDATA[之前wordpress写博客时文章里面的图片都是上传到服务器中,以前以为这样省事,都是原图上传,发现到后面弊端就出来啦。图片越来越多,服务器容量不够用不说,前端加载速度慢,影响读者阅读,导致读者流失。 毕竟那时候刚开始接触博客,随着后来知识面拓展,阅读量增加,发现这种做法效率太低。说下我现在的做法: 图片本地压缩 上传到空间上。例如七牛,腾讯云,利用CDN加速。下面详细讲解下: 1.图片本地压缩有时候博客或者网页里面需要插入图片,毕竟图文并茂对于读者来说更加有吸引力,更容易理解。图片利用压缩软件压缩,一般可以压缩50%以上,大大节省服务器空间和网页加载速度。这里提供我用的软件,这个软件好处就是图片拖进去,不用处理,原图片直接覆盖,其他的软件一般是输出到另一个文件夹,文件名也会改变,不方便。这个软件免费版一次只能处理10张图片,等于你要处理10张以后关闭,再打开,付费版没有限制。PP鸭下载链接:[file] 图片上传空间加速用得最多的恐怕就是七牛吧。大概的工作原理我通俗的解释下: 首先是图片存储在你自己服务器上:读者访问你的文章,直接从本地服务器加载图片。(用的是自己的流量,自己的服务器处理,没有额外加速buff)点击测试:我存在自己服务器上的图片 如果存储在七牛等上:读者访问你的文章,直接从七牛服务器加载图片。(用的是七牛的流量,七牛的服务器,根据服务商不同,可能会提供加速服务,减轻服务器压力,提高页面加载速度,有额外buff)点击测试:我存在腾讯cos上的图片 最后我说下感想: 毕竟自己用的是腾讯云的主机,发现用腾讯的存储空间还是挺方便的。七牛作为使用人数和接受度比较高的厂商,在前几年用的人多(可能现在还是比较多),因为免费还不需要备案就可以使用,对于服务器流量,性能不够的用户还是灰常不错的,一开始我也尝试用过七牛,但是不太方便,速度不太理想,图片还没有我放在本地加载快,而且想要使用CDN加速好像得充值10元验证你的账户。腾讯云就不一样,服务和价格都在那里,而且速度好,结合自己用的也是腾讯云的主机,事半功倍,图片也提供CDN加速。 我的网站所有图片都是放在腾讯的cos(对象存储服务)上的,图片提供CDN加速,网站也用了百度和腾讯云的CDN(内容分发网络),所以在网页加载速度上还是比较好滴。 ]]></content>
</entry>
<entry>
<title><![CDATA[就在今天,Swift 2.2 发布了!(iphone SE等也是)]]></title>
<url>%2F2016%2F03%2F22%2F33-1%2F</url>
<content type="text"><![CDATA[今天北京时间凌晨1点,iphone的春季发布会召开,可惜太晚,我熬不住,早上一起来必定是iphone占据头条,然后一大波人说:哎呀,这性价比,这屏幕怎么这么小,怎么长的和iphone5s一个样子,一点创新都没有等等,或者国产手机大厂商会发微博说苹果眼光不行,现在消费者都接受5寸屏幕手机,你推出个4寸小屏手机,没乔布斯苹果的设计太烂等等。 早上一起来,打开挨踢之家,中关村在线,看一波头条。iphone SE有银色,金色,深空灰色,玫瑰金(不买玫瑰金你怎么知道我买的是最新款iphone SE,手动斜眼)。有16GB,64GB2个容量,处理器用的iphone6S上的64位A9,叼炸天,1200万摄像头,支持NFC,4K视频拍摄,价格方面:16GB RMB3288,64GB RMB4088.当然海外版性价比更高,64GB也就3000多。A9处理器带个4寸小身板,1136 x 640 像素分辨率的手机,这流畅度简直要飞起。 进入正题 先给大家一些swift学习地址,(swift于2015年12月4日正式开源)大家可以到这里学习: swift官网 The Apple home on GitHub hosts all the Swift source code The Swift mailing lists are how we interact The Getting Started pages will help you setup a Swift development environment The Download page includes pre-built binaries for the supported platforms The Swift Evolution Process describes how new features are proposedswift中文文档,官网翻译推荐文档,原话: A great example of this is the GitHub project for the Chinese translation:github上可以下载阅读,地址:中文版 Apple 官方 Swift 教程《The Swift Programming Language》 如果大家愿意的话,可以一起帮助翻译,人多力量大,让大家更好地学习,顺便提高自己,造福他人,地址:swift-dev 官网中有swift的详细介绍,不过都是英文滴,好在我英文还行,下面是swift2.2的更新日志: Swift 2.2 is a minor language release that is mostly source-compatible with Swift 2.1. It contains the following language changes that went through the Swift’s evolution process: SE-0001: Allow (most) keywords as argument labels SE-0015: Tuple comparison operators SE-0014: Constraining AnySequence.init SE-0011: Replace typealias keyword with associatedtype for associated type declarations SE-0021: Naming Functions with Argument Labels SE-0022: Referencing the Objective-C selector of a method SE-0020: Swift Language Version Build ConfigurationBeyond these language changes Swift 2.2 also contains numerous bug fixes, enhancements to diagnostics, and produces even faster-running code. 最后,其他的也就不墨迹,大家刚把得,加油,程序猿之路贵在学习,更新知识! ]]></content>
</entry>
<entry>
<title><![CDATA[就在今天,Swift 2.2 发布了!(iphone SE等也是)]]></title>
<url>%2F2016%2F03%2F22%2F33%2F</url>
<content type="text"><![CDATA[今天北京时间凌晨1点,iphone的春季发布会召开,可惜太晚,我熬不住,早上一起来必定是iphone占据头条,然后一大波人说:哎呀,这性价比,这屏幕怎么这么小,怎么长的和iphone5s一个样子,一点创新都没有等等,或者国产手机大厂商会发微博说苹果眼光不行,现在消费者都接受5寸屏幕手机,你推出个4寸小屏手机,没乔布斯苹果的设计太烂等等。 早上一起来,打开挨踢之家,中关村在线,看一波头条。iphone SE有银色,金色,深空灰色,玫瑰金(不买玫瑰金你怎么知道我买的是最新款iphone SE,手动斜眼)。有16GB,64GB2个容量,处理器用的iphone6S上的64位A9,叼炸天,1200万摄像头,支持NFC,4K视频拍摄,价格方面:16GB RMB3288,64GB RMB4088.当然海外版性价比更高,64GB也就3000多。A9处理器带个4寸小身板,1136 x 640 像素分辨率的手机,这流畅度简直要飞起。 进入正题 先给大家一些swift学习地址,(swift于2015年12月4日正式开源)大家可以到这里学习: swift官网 The Apple home on GitHub hosts all the Swift source code The Swift mailing lists are how we interact The Getting Started pages will help you setup a Swift development environment The Download page includes pre-built binaries for the supported platforms The Swift Evolution Process describes how new features are proposedswift中文文档,官网翻译推荐文档,原话: A great example of this is the GitHub project for the Chinese translation:github上可以下载阅读,地址:中文版 Apple 官方 Swift 教程《The Swift Programming Language》 如果大家愿意的话,可以一起帮助翻译,人多力量大,让大家更好地学习,顺便提高自己,造福他人,地址:swift-dev 官网中有swift的详细介绍,不过都是英文滴,好在我英文还行,下面是swift2.2的更新日志: Swift 2.2 is a minor language release that is mostly source-compatible with Swift 2.1. It contains the following language changes that went through the Swift’s evolution process: SE-0001: Allow (most) keywords as argument labels SE-0015: Tuple comparison operators SE-0014: Constraining AnySequence.init SE-0011: Replace typealias keyword with associatedtype for associated type declarations SE-0021: Naming Functions with Argument Labels SE-0022: Referencing the Objective-C selector of a method SE-0020: Swift Language Version Build ConfigurationBeyond these language changes Swift 2.2 also contains numerous bug fixes, enhancements to diagnostics, and produces even faster-running code. 最后,其他的也就不墨迹,大家刚把得,加油,程序猿之路贵在学习,更新知识! ]]></content>
</entry>
<entry>
<title><![CDATA[画流程图,UML图神器:亿图图示专家]]></title>
<url>%2F2016%2F03%2F16%2F32-1%2F</url>
<content type="text"><![CDATA[学生党文档比较多,一到学期末,各种实训报告,论文等等,里面经常要画流程图,UML图,以前用office,wps里面的画图工具,虽然能画出来,但是比例,风格总不是那么好,歪歪扭扭的,所以网上找工具,于是得到这么一个神器。功能比较多,画流程图,UML图不在话下。 简单介绍: EDraw Max是一款功能强大的专业制作各种应用图形的设计软件,通过这款软件你可以轻松制作出流程图,组织结构图,业务流程,UML图,工作流程,程序结构,网络图,图表和图形,心智图,定向地图以及数据库图表,该款软件内置了2000多个符号及预画库,让你在制作各类图形中应用自如,而且EDraw Max(亿图图示专家)是基于矢量绘图,这样制作的图形点用空间相对更少,对电脑的要求也非常的低,让我们完全没必要通过CorelDRAW、Photoshop之类的大型软件来制作各类专用图形。 适用范围: 流程设计、工作汇报、说明简介、程序设计、思路展示、网络布线等,都少不了要用流程图来形象清晰的说明问题。用Word自带的图形绘制工具,难免有点不够专业,功能也不是很完善,使用亿图专业流程图、网络图制作工具,不仅可以完成普通流程图的制作,还可以完成专业网络图的绘制,它界面美观,操作简单,自带的丰富素材库能帮你快速的绘制出满意的效果,还提供了丰富的模板和示例供参考。 下面是一些运行截图: 这是我当时做文档的一张截图,画得不好,请见谅: 下载链接:[file]]]></content>
</entry>
<entry>
<title><![CDATA[画流程图,UML图神器:亿图图示专家]]></title>
<url>%2F2016%2F03%2F16%2F32%2F</url>
<content type="text"><![CDATA[学生党文档比较多,一到学期末,各种实训报告,论文等等,里面经常要画流程图,UML图,以前用office,wps里面的画图工具,虽然能画出来,但是比例,风格总不是那么好,歪歪扭扭的,所以网上找工具,于是得到这么一个神器。功能比较多,画流程图,UML图不在话下。 简单介绍: EDraw Max是一款功能强大的专业制作各种应用图形的设计软件,通过这款软件你可以轻松制作出流程图,组织结构图,业务流程,UML图,工作流程,程序结构,网络图,图表和图形,心智图,定向地图以及数据库图表,该款软件内置了2000多个符号及预画库,让你在制作各类图形中应用自如,而且EDraw Max(亿图图示专家)是基于矢量绘图,这样制作的图形点用空间相对更少,对电脑的要求也非常的低,让我们完全没必要通过CorelDRAW、Photoshop之类的大型软件来制作各类专用图形。 适用范围: 流程设计、工作汇报、说明简介、程序设计、思路展示、网络布线等,都少不了要用流程图来形象清晰的说明问题。用Word自带的图形绘制工具,难免有点不够专业,功能也不是很完善,使用亿图专业流程图、网络图制作工具,不仅可以完成普通流程图的制作,还可以完成专业网络图的绘制,它界面美观,操作简单,自带的丰富素材库能帮你快速的绘制出满意的效果,还提供了丰富的模板和示例供参考。 下面是一些运行截图: 这是我当时做文档的一张截图,画得不好,请见谅: 下载链接:[file]]]></content>
</entry>
<entry>
<title><![CDATA[genymotion安卓模拟器]]></title>
<url>%2F2016%2F03%2F16%2F31%2F</url>
<content type="text"><![CDATA[安卓开发的同学们用过安卓模拟器(当然我只是因为上课需要研究了下),Eclipse里面自带模拟器,但是用过的人都知道,非常难用,又慢又卡,genymotion是首选,国内外都非常推崇的,使用它你必须的注册一个账号,不然即使你安装了,也不能下载里面的机器。 在我这里,貌似genymotion官网也被墙啦,记得前几年英文官网还能上去,不知道是不是校园网的问题。 所以在这里给出基于2016/3/16的最新版genymotion-2.6.0-vbox的下载地址: [file] 安装一直下一步就可以,免费软件,只不过要登录才能用。 安装完桌面会出现3个图标: 点击Genymotion就可以愉快地运行了!]]></content>
</entry>
<entry>
<title><![CDATA[genymotion安卓模拟器]]></title>
<url>%2F2016%2F03%2F16%2F31-1%2F</url>
<content type="text"><![CDATA[安卓开发的同学们用过安卓模拟器(当然我只是因为上课需要研究了下),Eclipse里面自带模拟器,但是用过的人都知道,非常难用,又慢又卡,genymotion是首选,国内外都非常推崇的,使用它你必须的注册一个账号,不然即使你安装了,也不能下载里面的机器。 在我这里,貌似genymotion官网也被墙啦,记得前几年英文官网还能上去,不知道是不是校园网的问题。 所以在这里给出基于2016/3/16的最新版genymotion-2.6.0-vbox的下载地址: [file] 安装一直下一步就可以,免费软件,只不过要登录才能用。 安装完桌面会出现3个图标: 点击Genymotion就可以愉快地运行了!]]></content>
</entry>
<entry>
<title><![CDATA[国外代理账号说明]]></title>
<url>%2F2016%2F03%2F13%2F29-1%2F</url>
<content type="text"><![CDATA[ 此页面内容失效!!!国际代理帐号密码说明请移步老司机开车 免责声明:本站提供的账号均为个人使用,请勿用作非法活动,使用者需负起一切使用后果。 vpn: 服务器名称(地址): vpn类型:pptp 用户名: 密码: ss: 地址: 端口:9008 密码: 加密: 用的人多了,服务器偶尔会来大姨妈,表现为连不上服务器,或者连上了也非常慢,断断续续的样子。出现这种情况的时候,请联系我,会做下相应的处理,就会恢复得快一点。 如果你连不上服务器,请再三手动输入确认上面四项没有填错,依然连不上的话,请尝试PING下服务器看是否通,如果不通,一般是你的线路(电信、联通、地域、时间等相关,有可能是暂时性问题)问题。但注意在少数情况下不管你是否能PING通,都跟是否能连上ss服务器无关。最后说下一般都不会是服务器的问题,也就是说最大的可能性是:1.客户端,2.线路。 服务器域名会通过DNS解释成IP地址,域名对应的IP偶尔会变,也偶尔会用DNS做负载均衡,一个域名会解释到多个IP,如果使用时遇到问题,不妨试下改一改你客户端的DNS,一般避免用运营商的,可以用百度,阿里,谷歌,114等(180.76.76.76,223.5.5.5, 8.8.8.8, 114.114.114.114)。 一般客户端会有两种使用模式:1.自动/PAC,2.全局。在电脑客户端上一般默认是模式1,在这个模式下,会有一个PAC列表,里面是一些你平时访问不了的网站地址,例如twitt*.com,goole.com,当你要访问的网站地址匹配到这个列表其中一个地址时,流量就会自动走ss路线,当访问的网站地址没匹配到时,例如baidu.com,qq.com默认是不在列表中的,这时流量就不会走ss路线。模式1应该是最好用的,但当然那个列表也不是万能的,总会漏掉一些平时访问不了的小众的网站,这时你可以切换模式2,全局模式,在这个模式下,访问所有网站都会走ss路线。假如你不想用全局模式,又想访问那些小众的网站,那你可以动手编辑那个PAC列表,把你想访问的网站加入去,至于编辑方法可以自己去搜索一下。 本站及本站所提供的ss服务(美国洛杉矶节点)运行在搬瓦工VPS上,点击链接 (自动使用我的优惠码)注册购买VPS可享受88折优惠。选洛杉矶或日本(不过新账号不能购买日本服务器)的机房在国内访问会比较快。(提示:搬瓦工可以使用支付宝或者PayPal支付,而PayPal可以使用银联卡,也即是一般的银行卡/借记卡来支付) ss mac,windows,android客户端下载: [file] 使用教程见: 科学上网利器 Shadowsocks 简介]]></content>
</entry>
<entry>
<title><![CDATA[国外代理账号说明]]></title>
<url>%2F2016%2F03%2F13%2F29%2F</url>
<content type="text"><![CDATA[ 此页面内容失效!!!国际代理帐号密码说明请移步老司机开车 免责声明:本站提供的账号均为个人使用,请勿用作非法活动,使用者需负起一切使用后果。 vpn: 服务器名称(地址): vpn类型:pptp 用户名: 密码: ss: 地址: 端口:9008 密码: 加密: 用的人多了,服务器偶尔会来大姨妈,表现为连不上服务器,或者连上了也非常慢,断断续续的样子。出现这种情况的时候,请联系我,会做下相应的处理,就会恢复得快一点。 如果你连不上服务器,请再三手动输入确认上面四项没有填错,依然连不上的话,请尝试PING下服务器看是否通,如果不通,一般是你的线路(电信、联通、地域、时间等相关,有可能是暂时性问题)问题。但注意在少数情况下不管你是否能PING通,都跟是否能连上ss服务器无关。最后说下一般都不会是服务器的问题,也就是说最大的可能性是:1.客户端,2.线路。 服务器域名会通过DNS解释成IP地址,域名对应的IP偶尔会变,也偶尔会用DNS做负载均衡,一个域名会解释到多个IP,如果使用时遇到问题,不妨试下改一改你客户端的DNS,一般避免用运营商的,可以用百度,阿里,谷歌,114等(180.76.76.76,223.5.5.5, 8.8.8.8, 114.114.114.114)。 一般客户端会有两种使用模式:1.自动/PAC,2.全局。在电脑客户端上一般默认是模式1,在这个模式下,会有一个PAC列表,里面是一些你平时访问不了的网站地址,例如twitt*.com,goole.com,当你要访问的网站地址匹配到这个列表其中一个地址时,流量就会自动走ss路线,当访问的网站地址没匹配到时,例如baidu.com,qq.com默认是不在列表中的,这时流量就不会走ss路线。模式1应该是最好用的,但当然那个列表也不是万能的,总会漏掉一些平时访问不了的小众的网站,这时你可以切换模式2,全局模式,在这个模式下,访问所有网站都会走ss路线。假如你不想用全局模式,又想访问那些小众的网站,那你可以动手编辑那个PAC列表,把你想访问的网站加入去,至于编辑方法可以自己去搜索一下。 本站及本站所提供的ss服务(美国洛杉矶节点)运行在搬瓦工VPS上,点击链接 (自动使用我的优惠码)注册购买VPS可享受88折优惠。选洛杉矶或日本(不过新账号不能购买日本服务器)的机房在国内访问会比较快。(提示:搬瓦工可以使用支付宝或者PayPal支付,而PayPal可以使用银联卡,也即是一般的银行卡/借记卡来支付) ss mac,windows,android客户端下载: [file] 使用教程见: 科学上网利器 Shadowsocks 简介]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程之流程]]></title>
<url>%2F2016%2F03%2F12%2F28%2F</url>
<content type="text"><![CDATA[搭建个人博客其实说简单也简单,说难也难,当初我一个独自探索,到现在也差不多摸清门路了,因此写一个教程防止大家走弯路,少碰壁,以最迅速,最直接的方式完成它,一下全部为个人见解,如有误,请指出。下面是后续文章链接: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。先说下大致步骤: 购买域名(如果你只打算以例如ip:115.159.xxx.xxx方式访问这步可以忽略),推荐狗爹(godaddy),有许多优惠,还安全,不用担心被封,国内购买域名的地方也有很多:Dnspod,新网等等,但是出于国内众多因素,在国内购买域名不怕一万,就怕万一,哪天谁不开心啦,直接封你域名,当然,一般是不会的。 购买虚拟主机,如果你家有公网ip地址可以直接在家搭建,但是当前公网ip本来就少,会分配公网ip给个人的运营商几乎没有,电信的用户可以试试,貌似联系客户,强烈要求分配公网ip就可以。(如果你是在校大学生,强烈建议腾讯云,1元主机加免费.cn域名一直到赠送到你毕业为止,阿里的貌似对学生优惠只有3个月) 物色一个好的解析商,如DnsPod,CloudXNS等,我之前用的是DnsPod,然后转战CloudXNS(推荐)。 解析商大致的作用流程:用户访问www.huangbowei.com,然后解析商就会应用你在解析商那里填写的规则,把www.huangbowei.com解析到115.159.xxx.xxx,然后用户就可以访问你的博客内容。 如果你直接访问ip地址,大致流程就是:用户输入115.159.xxx.xxx,转到访问博客内容。 如果你没有解析商,用户输入www.huangbowei.com,然后不知道转到哪一个虚拟主机,就不能访问。 选择一个搭建博客的平台:wordpress,Hexo,Typecho,Ghost,jekyll等等,我第一个用的(也是大部分人第一次用的)就是wordpress,它操作简单,后台有图形化操作界面,主题多,插件多,使用人数多,碰到问题解决方法也多,但是现在越发臃肿,不能满足我对博客速度的极致要求,便转到Typecho,以后准备试试更简单,搭建环境更加简单,更黑客的Hexo。 ## 到这里,搭建博客大致的流程就结束啦,这只是一个大致的思路,由于全部写完篇幅过多,我准备过几天把每一步详细写出来,以及我碰到的问题,以及解答方法 。]]></content>
</entry>
<entry>
<title><![CDATA[小白搭建博客教程之流程]]></title>
<url>%2F2016%2F03%2F12%2F28-1%2F</url>
<content type="text"><![CDATA[搭建个人博客其实说简单也简单,说难也难,当初我一个独自探索,到现在也差不多摸清门路了,因此写一个教程防止大家走弯路,少碰壁,以最迅速,最直接的方式完成它,一下全部为个人见解,如有误,请指出。下面是后续文章链接: 购买域名; 购买虚拟主机并搭建(Linux); 域名解析; wordpress等博客平台安装步骤。先说下大致步骤: 购买域名(如果你只打算以例如ip:115.159.xxx.xxx方式访问这步可以忽略),推荐狗爹(godaddy),有许多优惠,还安全,不用担心被封,国内购买域名的地方也有很多:Dnspod,新网等等,但是出于国内众多因素,在国内购买域名不怕一万,就怕万一,哪天谁不开心啦,直接封你域名,当然,一般是不会的。 购买虚拟主机,如果你家有公网ip地址可以直接在家搭建,但是当前公网ip本来就少,会分配公网ip给个人的运营商几乎没有,电信的用户可以试试,貌似联系客户,强烈要求分配公网ip就可以。(如果你是在校大学生,强烈建议腾讯云,1元主机加免费.cn域名一直到赠送到你毕业为止,阿里的貌似对学生优惠只有3个月) 物色一个好的解析商,如DnsPod,CloudXNS等,我之前用的是DnsPod,然后转战CloudXNS(推荐)。 解析商大致的作用流程:用户访问www.huangbowei.com,然后解析商就会应用你在解析商那里填写的规则,把www.huangbowei.com解析到115.159.xxx.xxx,然后用户就可以访问你的博客内容。 如果你直接访问ip地址,大致流程就是:用户输入115.159.xxx.xxx,转到访问博客内容。 如果你没有解析商,用户输入www.huangbowei.com,然后不知道转到哪一个虚拟主机,就不能访问。 选择一个搭建博客的平台:wordpress,Hexo,Typecho,Ghost,jekyll等等,我第一个用的(也是大部分人第一次用的)就是wordpress,它操作简单,后台有图形化操作界面,主题多,插件多,使用人数多,碰到问题解决方法也多,但是现在越发臃肿,不能满足我对博客速度的极致要求,便转到Typecho,以后准备试试更简单,搭建环境更加简单,更黑客的Hexo。 ## 到这里,搭建博客大致的流程就结束啦,这只是一个大致的思路,由于全部写完篇幅过多,我准备过几天把每一步详细写出来,以及我碰到的问题,以及解答方法 。]]></content>
</entry>
<entry>
<title><![CDATA[分享下平时我在windows平台下开发用的一些比较好的软件-winscp(四)]]></title>
<url>%2F2016%2F03%2F12%2F24%2F</url>
<content type="text"><![CDATA[WinSCPWinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。 特性 图形用户界面 多语言 与Windows完美集成(拖拽, URL,快捷方式) 支持所有常用文件操作 支持基于SSH-1、SSH-2的SFTP和SCP协议 支持批处理脚本和命令行方式 多种半自动、自动的目录同步方式 内置文本编辑器 支持SSH密码、键盘交互、公钥和Kerberos(GSS) 验证 通过与Pageant(PuTTY Agent)集成支持各种类型公钥验证 提供Windows Explorer与Norton Commander界面 可选地存储会话信息 可将设置存在配置文件中而非注册表中,适合在移动介质上操作 WinSCP下载地址: [file] ]]></content>
</entry>
<entry>
<title><![CDATA[分享下平时我在windows平台下开发用的一些比较好的软件-winscp(四)]]></title>
<url>%2F2016%2F03%2F12%2F24-1%2F</url>
<content type="text"><![CDATA[WinSCPWinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。 特性 图形用户界面 多语言 与Windows完美集成(拖拽, URL,快捷方式) 支持所有常用文件操作 支持基于SSH-1、SSH-2的SFTP和SCP协议 支持批处理脚本和命令行方式 多种半自动、自动的目录同步方式 内置文本编辑器 支持SSH密码、键盘交互、公钥和Kerberos(GSS) 验证 通过与Pageant(PuTTY Agent)集成支持各种类型公钥验证 提供Windows Explorer与Norton Commander界面 可选地存储会话信息 可将设置存在配置文件中而非注册表中,适合在移动介质上操作 WinSCP下载地址: [file] ]]></content>
</entry>
<entry>
<title><![CDATA[分享下平时我在windows平台下开发用的一些比较好的软件-putty(三)]]></title>
<url>%2F2016%2F03%2F12%2F23-1%2F</url>
<content type="text"><![CDATA[putty PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。较早的版本仅支持Windows平台,在最近的版本中开始支持各类Unix平台,并打算移植至Mac OS X上。除了官方版本外,有许多第三方的团体或个人将PuTTY移植到其他平台上,像是以Symbian为基础的移动电话。PuTTY为一开放源代码软件,主要由Simon Tatham维护,使用MIT licence授权。随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程。在各种远程登录工具中,Putty是出色的工具之一。Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工具。 优点1. 完全免费; 2. 对于HTML网页编程代码,可直接选择在不同的浏览器中打开查看,以方便进行调试; 3. 全面支持ssh1和ssh2; 4. 体积很小,仅472KB(0.62 版本); 5. 操作简单,所有的操作都在一个控制面板中实现; [file]]]></content>
</entry>
<entry>
<title><![CDATA[分享下平时我在windows平台下开发用的一些比较好的软件-putty(三)]]></title>
<url>%2F2016%2F03%2F12%2F23%2F</url>
<content type="text"><![CDATA[putty PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。较早的版本仅支持Windows平台,在最近的版本中开始支持各类Unix平台,并打算移植至Mac OS X上。除了官方版本外,有许多第三方的团体或个人将PuTTY移植到其他平台上,像是以Symbian为基础的移动电话。PuTTY为一开放源代码软件,主要由Simon Tatham维护,使用MIT licence授权。随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程。在各种远程登录工具中,Putty是出色的工具之一。Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工具。 优点1. 完全免费; 2. 对于HTML网页编程代码,可直接选择在不同的浏览器中打开查看,以方便进行调试; 3. 全面支持ssh1和ssh2; 4. 体积很小,仅472KB(0.62 版本); 5. 操作简单,所有的操作都在一个控制面板中实现; [file]]]></content>
</entry>
<entry>
<title><![CDATA[MarkdownPad 在win10下html渲染错误This view has crashed]]></title>
<url>%2F2016%2F03%2F11%2F27-1%2F</url>
<content type="text"><![CDATA[前几天在安装MarkdownPad 的时候碰见一个问题,一直报错,不能正常运行,这里给出解决方法: windows 10系统 需要下载 一个 awesomium_v1.6.6_sdk_win 这是一个 HTML UI ENGINE awesomium下载地址: [file] 如果以上安装后问题还没解决,官方文档建议下载安装 Microsoft’s DirectX End-User Runtimes (June 2010).]]></content>
</entry>
<entry>
<title><![CDATA[MarkdownPad 在win10下html渲染错误This view has crashed]]></title>
<url>%2F2016%2F03%2F11%2F27%2F</url>
<content type="text"><![CDATA[前几天在安装MarkdownPad 的时候碰见一个问题,一直报错,不能正常运行,这里给出解决方法: windows 10系统 需要下载 一个 awesomium_v1.6.6_sdk_win 这是一个 HTML UI ENGINE awesomium下载地址: [file] 如果以上安装后问题还没解决,官方文档建议下载安装 Microsoft’s DirectX End-User Runtimes (June 2010).]]></content>
</entry>
<entry>
<title><![CDATA[面试中被面试官问到的问题答案(一)]]></title>
<url>%2F2016%2F03%2F11%2F20-1%2F</url>
<content type="text"><![CDATA[以下问题的答案是之前写的一篇文章 面试中被面试官问到的问题 现在把问题的答案整理了一份出来给大家。希望对大家有所帮助。如果整理的答案有问题,请联系我。shavekevin@gmail.com 1.请你谈谈static和宏定义的区别。什么时候用static什么时候用宏定义。让你声明的常量只在你声明的文件里有作用要不编译器会保存 宏定义: 1). 一般来说我们使用宏定义最常见的是定义一些常量 简单的”函数”(比如求两个数的最大小值)例如:定义常量PI <span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> PI 3.1415926</span> `</pre> 定义函数 <pre>`<span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> MIN(A,B) ((A) &lt; (B) ? (A):(B))</span> `</pre> 我们不对宏定义进行修改 2) . 使用宏定义可以在很大程度上可以简化我们的代码 例如:我们在写单例的时候 之前我们写的是 <pre>`<span class="hljs-preprocessor">#import <span class="hljs-title">"ShareSingleton.h"</span></span> <span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">ShareSingleton</span></span> +(instancetype)shareSingleton { <span class="hljs-keyword">static</span> ShareSingleton *leader = <span class="hljs-literal">nil</span>; <span class="hljs-keyword">static</span> <span class="hljs-built_in">dispatch_once_t</span> onceToken; <span class="hljs-built_in">dispatch_once</span>(&amp;onceToken, ^{ leader = [[ShareSingleton alloc]init]; }); <span class="hljs-keyword">return</span> leader; } <span class="hljs-keyword">@end</span> `</pre> //如果我们使用宏定义的话我们可以这样写: <pre>`<span class="hljs-preprocessor">#define DISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&amp;onceToken, onceBlock);</span> <span class="hljs-preprocessor">#import <span class="hljs-title">"ShareSingleton.h"</span></span> <span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">ShareSingleton</span></span> +(instancetype)shareSingleton { <span class="hljs-keyword">static</span> ShareSingleton *leader = <span class="hljs-literal">nil</span>; DISPATCH_ONCE_BLOCK(^{ leader = [[ShareSingleton alloc]init]; }) <span class="hljs-keyword">return</span> leader; } <span class="hljs-keyword">@end</span> `</pre> 其实#define的原理就是不管三七二十一,直接做替换,所以我们完全可以利用这个特点,发挥自己的想象,简化代码~ 宏定义实质是一个预编译指令,在程序未运行之前将某些指令付给相应的变量。 小结一下: static标记的变量会存储到全局变量区,生命周期和程序相同。而宏定义所定义的生命周期与所在的载体的生命周期有关. static只在声明的类中可见。 在声明的类中结束后,再次使用还是之前的值。 2.你是怎么看待代理 通知的 他们有什么区别? 首先,我们把代理通知 放到一起来讨论第一反映是传值。 ok,下面慢慢来说各个的用法和区别。 通知中心 通过NSNotification可以给多个对象传递数据和消息(多个传递) 代理 通过protocol(代理模式)只能给一个对象传递数据和消息(单一传递)“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理(可以用多点回调,下面见解)。 代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败。 区别: 代理和通知的区别应该主要是一对一和一对多的关系。delegate的多点回调相对notification更加便捷,更多方便,让项目更好维护。 3.说说你对内存管理的理解。 内存管理原则 引用计数的增加和减少相等,当引用计数降为0之后,不应该再使用这块内存空间。 凡是用alloc retain 或者copy让内存的引用计数增加了。就需要使用release或者autorelease让内存的引用 计数减少。在一段代码内。增加和减少的次数要相等。 autoreleasepool的使用 通过autoreleasepool控制autorelease对象的释放 向一个对象发送autorelease消息。这个对象何时释放取决于autoreleasepool copy方法 跟retain不同,一个对象想要copy,生成自己的副本,需要实现NSCopying协议,定义copy的细节(如何copy)如果类没有接受NSCoping协议而给类发送copy消息,会引起crash 总结: OC借助引用计数机制去管理内存,凡是使用了alloc copy retain 等 方法,增加了引用计数,就要使用release 和autorelease 减少引用计数,引用计数为0的时候,对象所占的内存,被系统回收。 autorelease是未来某个时间(出autorelease)引用减一,不是即时的。 不是任何对象都可以接受copy消息。只有接受了NSCoping协议的对象才接受copy消息。 4.谈谈你对iOS性能优化的理解. 谈起iOS的性能优化我们首先想到的是应该是tableview表视图的优化。关于表视图的优化我们可以从以下几个方面来看: 1).tableviewcell渲染 绘制时要尽可能的避免分配资源,比如UIFont,NSDateFormatter或者任何在绘制时 需要的对象,推荐使用类层级的初始化方法中执行分配,并将其存储为静态变量。 2).图层渲染的问题 透明图层对渲染性能会有一定的影响,系统必须将透明图层与下面的视图混合起来计算颜色,并 绘制出来。减少透明图层并使用不透明的图层来替代它们,可以极大地提高渲染速度。 3).为代理方法瘦身 我们要尽量避免在tableview的cellforrowatindexpath的代理方法里写那么多代码,这样做不仅可以简化代码方便维护和管理,这对程序的运行也有帮助。 4).复杂视图尽量采用纯代码的方式 当 UITableViewCell拥有多个子视图时,IOS的渲染机制会拖慢速度。重写drawRect直接绘制内容的方式可 以提高性能,而不是在类初始化的时候初始化一些label或者imageview等。 (以下来源于yykit作者ibireme[这是源链接](http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/)) 下面就是些CPU 资源消耗原因和解决方案 还有GPU资源消耗原因和解决方案 对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗 CPU 资源。尽量用轻量的对象代替重量的对象,可以对性能有所优化。比如 CALayer 比 UIView 要轻量许多,那么不需要响应触摸事件的控件,用 CALayer 显示会更加合适。如果对象不涉及 UI 操作,则尽量放到后台线程去创建,但可惜的是包含有 CALayer 的控件,都只能在主线程创建和操作。通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大非常多,在性能敏感的界面里,Storyboard 并不是一个好的技术选择。 1).对象的创建 尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。如果对象可以复用,并且复用的代价比释放、创建新对象要小,那么这类对象应当尽量放到一个缓存池里复用。 2).对象调整 对象的调整也经常是消耗 CPU 资源的地方。这里特别说一下 CALayer:CALayer 内部并没有属性,当调用属性方法时,它内部是通过运行时 resolveInstanceMethod 为对象临时添加一个方法,并把对应属性值保存到内部的一个 Dictionary 里,同时还会通知 delegate、创建动画等等,非常消耗资源。UIView 的关于显示相关的属性(比如 frame/bounds/transform)等实际上都是 CALayer 属性映射来的,所以对 UIView 的这些属性进行调整时,消耗的资源要远大于一般的属性。对此你在应用中,应该尽量减少不必要的属性修改。 当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。 3). 对象销毁 对象的销毁虽然消耗资源不多,但累积起来也是不容忽视的。通常当容器类持有大量对象时,其销毁时的资源消耗就非常明显。同样的,如果对象可以放到后台线程 去释放,那就挪到后台线程去。这里有个小 Tip:把对象捕获到 block 中,然后扔到后台队列去随便发送个消息以避免编译器警告,就可以让对象在后台线程销毁了。 例如: <pre>`<span class="hljs-built_in">NSArray</span> *tmp = <span class="hljs-keyword">self</span><span class="hljs-variable">.array</span>; <span class="hljs-keyword">self</span><span class="hljs-variable">.array</span> = <span class="hljs-literal">nil</span>; <span class="hljs-built_in">dispatch_async</span>(queue, ^{ [tmp class]; }); `</pre> 4).一些计算 视图布局的计算是 App 中最为常见的消耗 CPU 资源的地方。如果能在后台线程提前计算好视图布局、并且对视图布局进行缓存,那么这个地方基本就不会产生性能问题了。 不论通过何种技术对视图进行布局,其最终都会落到对 UIView.frame/bounds/center 等属性的调整上。上面也说过,对这些属性的调整非常消耗资源,所以尽量提前计算好布局,在需要时一次性调整好对应属性,而不要多次、频繁的计算和调整这些 属性。 Autolayout 是苹果本身提倡的技术,在大部分情况下也能很好的提升开发效率,但是 Autolayout 对于复杂视图来说常常会产生严重的性能问题。随着视图数量的增长,Autolayout 带来的 CPU 消耗会呈指数级上升。具体数据可以看这个文章:[http://pilky.me/36/。](http://pilky.me/36/%E3%80%82) 如果你不想手动调整 frame 等属性,你可以用一些工具方法替代(比如常见的 left/right/top/bottom/width/height 快捷属性),或者使用 ComponentKit、AsyncDisplayKit 等框架. 如果一个界面中包含大量文本(比如微博微信朋友圈等),文本的宽高计算会占用很大一部分资源,并且不可避免。如果你对文本显示没有特殊要求,可以参 考下 UILabel 内部的实现方式:用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本。尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。 5).文本的绘制 如果你用 CoreText 绘制文本,那就可以先生成 CoreText 排版对象,然后自己计算了,并且 CoreText 对象还能保留以供稍后绘制使用。 屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。对此解决方案只有一个,那就是自定义文本控件,用 TextKit 或最底层的 CoreText 对文本异步绘制。尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText 对象占用内存较少,可以缓存下来以备稍后多次渲染. 6).图片的解码 当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。 7).图像的绘制 图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。由于 CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行。一个简单异步绘制的过程大致如下(实际情况会比这个复杂得多,但原理基本一致) <pre>`<span class="hljs-built_in">dispatch_async</span>(backgroundQueue, ^{ CGContextRef ctx = CGBitmapContextCreate(...); <span class="hljs-comment">// draw in context...</span> CGImageRef img = CGBitmapContextCreateImage(ctx); CFRelease(ctx); <span class="hljs-built_in">dispatch_async</span>(mainQueue, ^{ layer<span class="hljs-variable">.contents</span> = img; }); }); `</pre> GPU 资源消耗原因和解决方案 1.纹理的渲染 所有的 Bitmap,包括图片、文本、栅格化的内容,最终都要由内存提交到显存,绑定为 GPU Texture。不论是提交到显存的过程,还是 GPU 调整和渲染 Texture 的过程,都要消耗不少 GPU 资源。当在较短时间显示大量图片时(比如 TableView 存在非常多的图片并且快速滑动时),CPU 占用率很低,GPU 占用非常高,界面仍然会掉帧。避免这种情况的方法只能是尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。 当图片过大,超过 GPU 的最大纹理尺寸时,图片需要先由 CPU 进行预处理,这对 CPU 和 GPU 都会带来额外的资源消耗。目前来说,iPhone 4S 以上机型,纹理尺寸上限都是 4096x4096,更详细的资料可以看这里:iosres.com。所以,尽量不要让图片和视图的大小超过这个值。 2.视图的混合 当多个视图(或者说 CALayer)重叠在一起显示时,GPU 会首先把他们混合到一起。如果视图结构过于复杂,混合的过程也会消耗很多 GPU 资源。为了减轻这种情况的 GPU 消耗,应用应当尽量减少视图数量和层次,并在不透明的视图里标明 opaque 属性以避免无用的 Alpha 通道合成。当然,这也可以用上面的方法,把多个视图预先渲染为一张图片来显示 3.图像的生成 CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在 后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。 <pre>`如何检测应用的流畅度? `</pre> “过早的优化是万恶之源”,在需求未定,性能问题不明显时,没必要尝试做优化,而要尽量正确的实现功能。做性能优化时,也最好是走修改代码 -&gt; Profile -&gt; 修改代码这样一个流程,优先解决最值得优化的地方。 如果你需要一个明确的 FPS 指示器,可以尝试一下 KMCGeigerCounter。对于 CPU 的卡顿,它可以通过内置的 CADisplayLink 检测出来;对于 GPU 带来的卡顿,它用了一个 1x1 的 SKView 来进行监视。这个项目有两个小问题:SKView 虽然能监视到 GPU 的卡顿,但引入 SKView 本身就会对 CPU/GPU 带来额外的一点的资源消耗;这个项目在 iOS 9 下有一些兼容问题,需要稍作调整。 5.你用过单元测试吗?怎么才能做好单元测试? > 什么是单元测试? 单元测试:以下内容来自维基百科[单元测试](https://zh.wikipedia.org/wiki/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95) 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程 等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 <pre>`通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书要求的工作目标,没有程序错误;虽然单元测试不是什么必须的,但也不坏,这牵涉到项目管理的政策决定。 每个理想的测试案例独立于其它案例;为测试时隔离模块,经常使用<span class="hljs-tag">stubs</span>、<span class="hljs-tag">mock</span><span class="hljs-attr_selector">[1]</span>或<span class="hljs-tag">fake</span>等测试马甲程序。单元测试通常由软件开发人员编写,用于确保他们所写的代码符合软件需求和遵循开发目标。它的实施方式可以是非常手动的(通过纸笔),或者是做成构建自动化的一部分。 `</pre> > 单元测试有什么好处? 单元测试的一个好处就是我们可以只测试单个模块,我们可以测试 单一模块有没有问题。比如说我们在开发中经常会写一些测试性的demo。我们写的测试性demo运行正常达到了我们需要的效果,那么我们就可以把demo的效果运用到我们的工程中进行调试。 适应变更单元测试允许程序员在未来重构代码,并且确保模块依然工作正确(复合测试)。这个过程就是为所有函数和方法编写单元测试,一旦变更导致错误发生,借助于单元测试可以快速定位并修复错误。可读性强的单元测试可以使程序员方便地检查代码片断是否依然正常工作。良好设计的单元测试案例覆盖程序单元分支和循环条件的所有路径。在连续的单元测试环境,通过其固有的持续维护工作,单元测试可以延续用于准确反映当任何变更发生时可执行程序和代码的表现。借助于上述开发实践和单元测试的覆盖,可以分分秒秒维持准确性。 简化集成单元测试消除程序单元的不可靠,采用自底向上的测试路径。通过先测试程序部件再测试部件组装,使集成测试变得更加简单。业界对于人工集成测试的必要性存在较大争议。尽管精心设计的单元测试体系看上去实现了集成测试,因为集成测试需要人为评估一些人为因素才能证实的方 面,单元测试替代集成测试不可信。一些人认为在足够的自动化测试系统的条件下,人力集成测试组不再是必需的。事实上,真实的需求最终取决于开发产品的特点 和使用目标。另外,人工或手动测试很大程度上依赖于组织的可用资源。[来源请求] 文档记录单元测试提供了系统的一种文档记录。借助于查看单元测试提供的功能和单元测试中如何使用程序单元,开发人员可以直观的理解程序单元的基础API。单元测试具体表现了程序单元成功的关键特点。这些特点可以指出正确使用和非正确使用程序单元,也能指出需要捕获的程序单元的负面表现(译注:异常和错误)。尽管很多软件开发环境不仅依赖于代码做为产品文档,在单元测试中和单元测试本身确实文档化了程序单元的上述关键特点。另一方面,传统文档易受程序本身实现的影响,并且时效性难以保证(如设计变更、功能扩展等在不太严格时经常不能保持文档同步更新)。 表达设计在测试驱动开发的软件实践中,单元测试可以取代正式的设计。每一个单元测试案例均可以视为一项类、方法和待观察行为等设计元素。下面的Java例可以帮助说明这一点。 当然,单元测试缺乏图的可读性,但UML图可以在自由工具(通常可从IDE扩展获取)中为大多数现代程序语言生成UML图,很难要求采购昂贵的UML设计套装软件。自由工具,类似于基于xUnit框架的工具,测试结果输出到一些可生成供人工识读的图形化工具系统中去。 分离接口和实现因为很多类会引用其它类,对这个类的测试经常会要求测试其它的类。一个最普遍的例子是依赖于数据库的类:为了测试它,测试人员通常编写代码去操作数据库。这是不对的,因为单元测试不应超出待测试的类边界。作为替代,软件开发人员应创建一个数据库连接的抽象接口,然后实现这个接口的模拟对象。通过对代码所需附件的抽象(临时降低了网状的耦合效应),这些独立程序单元较前者更能被完整测试。高质量的代码单元也可提供更好的可维护性。 局限测试不可能发现所有的程序错误,单元测试也不例外。按定义,单元测试只测试程序单元自身的功能。因此,它不能发现集成错误、性能问题、或者其他系统 级别的问题。单元测试结合其他软件测试活动更为有效。与其它形式的软件测试类似,单元测试只能表明测到的问题,不能表明不存在未测试到的错误。软件测试是一个组合问题。例如,每一个布尔型的决断语句需要至少两种测试:一个返回真,一个返回假。因此,针对每行书写的代码,程序员通常需要写3 至5行的测试代码。[3]这很明显地很花时间而且对此的投入可能并不值得。也有些问题是根本不能简单地检测出来的——例如具不确定性的或牵扯到多线程的问 题。此外,替单元测试写的代码可能就像要测试的代码一样有程序错误。佛瑞德·布鲁克斯在人月神话一书中举例说明:“绝对不要带两个计时器去海边。最好总是 带一或三个”。意味着,如果两个计时器互相冲突的话,你该怎么知道哪个是对的?为了获得单元测试的好处,在软件开发过程中应形成一套严格纪律意识。仔细保 留记录是必要的,不仅仅只保留执行的测试,也包括保留对应的源码和其它软件单元的变更历史。即,使用版本控制系统是必要的。如果后续版本不能通过一个以前 测试通过的单元测试,版本控制系统可以提供对应时间段对源代码所做的变更清单。每天养成查看单元测试案例失败测试并及时确定错误原因的习惯是必要的。如果没有这样的流程,没有在团队工作流程中体现,单元测试系列将走向不同步,造成越来越多的错误和越来越低效的单元测试案例系列。 iOS中的单元测试在开发中,经常用到的单元测试一是测试某个模块的功能,也就是说把这个模块独立起来,单独进行测试。用到最多的应该是测试模块功能和接口调试功能。当然单元测试还有一些高级的用法自动测试和自动发布等。 OCUnit(即用XCTest进行测试)其实就是苹果自带的测试框架,我们主要讲的就是这个。GHUnit是一个可视化的测试框架。(有了它,你可以点 击APP来决定测试哪个方法,并且可以点击查看测试结果等。)OCMock就是模拟某个方法或者属性的返回值,你可能会疑惑为什么要这样做?使用用模型生 成的模型对象,再传进去不就可以了?答案是可以的,但是有特殊的情况。比如你测试的是方法A,方法A里面调用到了方法B,而且方法B是有参数传入,但又不 是方法A所提供。这时候,你可以使用OCMock来模拟方法B返回的值。(在不影响测试的情况下,就可以这样去模拟。)除了这些,在没有网络的情况下,也 可以通过OCMock模拟返回的数据。UITests就是通过代码化来实现自动点击界面,输入文字等功能。靠人工操作的方式来覆盖所有测试用例是非常困难 的,尤其是加入新功能以后,旧的功能也要重新测试一遍,这导致了测试需要花非常多的时间来进行回归测试,这里产生了大量重复的工作,而这些重复的工作有些 是可以自动完成的,这时候UITests就可以帮助解决这个问题了。 6. 你知道的的本地数据持久化都有哪些。你比较喜欢用哪些 为什么? 采用的数据存储的方式有以下几种:1、 FMDB(常用)2、 Sqlite(次之)3、 Coredata(次之)4、 NSUserdefaults(最多使用)5、 序列化反序列化(归档和解档)6、 MongoDB(小众型的) 大家讨论用的最多的是FMDB,原因很简单,关系型数据库,使用方便(相对于没经过封装和加工的Sqlite来说)。其次就是sqlite和 coredata 当然使用者三种主要是为了缓存。因为我们在开发中为了给用户更好的体验,就采用缓存的形式。一般情况下要做的操作就是在本地建立一个数据库(本地后台)。 7.谈谈MVC设计模式的优缺点 编程以来就一直被灌输MVC设计模式,具体MVC使用到底好在哪里 又有那些不足之处,可以通过下面的介绍得以了解。 一、mvc原理 mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。 模型(model)它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的Action,dao类)和数据模块(pojo类)。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性 视图(view) 用户与之交互的界面、在web中视图一般由jsp,html组成 控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用.二、MVC的优点 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。三、MVC的不足之处 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。8.谈谈你对多线程的理解,你经常用的多线程有哪些实现方式,谈谈他们优缺点。 使用NSOperationQueue用来管理子类化的NSOperation对象,控制其线程并发数目。GCD和NSOperation都 可以实现对线程的管理,区别是 NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优点是NSOperation是 对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是 多线程支持,而接口简单,建议在复杂项目中使用。 项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。 什么时候用多线程?大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文 件、视频图像的采集、处理、显示、保存等。多线程的作用?可以解决负载均衡问题,充分利用cpu资源 。为了提高CPU的使用率,采用多线程的方式去同时完 成几件事情而互不干扰.iOS实现多线程有哪几种方式?主要有三种主要方法。 1、NSThread。 2、NSOperation。 3、GCD。 多线程安全问题的几种解决方案?使用锁。锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正 确性。使用POSIX互斥锁;使用NSLock类;使用@synchronized指令等。分线程回调主线程方法是什么?有什么作用呢?回到主线程的方法: (1). performSelectorOnMainThrea[<span class="hljs-keyword">self</span> performSelectorOnMainThread:&lt;<span class="hljs-preprocessor">#(SEL)#&gt;withObject:<span class="hljs-title">&lt;#(id)#&gt;</span>waitUntilDone:<span class="hljs-title">&lt;#(BOOL)#&gt;</span>];</span>(2). GCD<span class="hljs-built_in">dispatch_async</span>(dispatch_get_main_queue(), ^{ });(3). NSOperationQueue[[NSOperationQueue mainQueue]addOperationWithBlock:^{ }]作用:主线程是显示UI界面,子线程多数是进行数据处理. PS:最高境界是异步单线程,江湖上称协程。可以参考 boost 中的 asio 用户级的任务调度 9.谈谈你对面向对象和面向过程的认识。 简单对比 面向过程就像是一个细心的管家,事无具细的都要考虑到。而面向对象就像是个家用电器,你只需要知道他的功能,不需要知道它的工作原理。“面向过 程”是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。面向对象是以“对象”为中心的编程思想。 简单的举个例子:汽车发动、汽车到站 这对于“面向过程”来说,是两个事件,汽车启动是一个事件,汽车到站是另一个事件,面向过程编程的过程中我们关心的是事件,而不是汽车本身。针 对上述两个事件,形成两个函数,之后依次调用。然而这对于面向对象来说,我们关心的是汽车这类对象,两个事件只是这类对象所具有的行为。而且对于这两个行 为的顺序没有强制要求。 两种思想的对比 面向过程其实最为实际的一种思考方式,因为我们总是一贯一步一步的解决问题。(举个简单的事情,在初学面向对象的语言例如c++时,我们也总是 不经意的面向过程了!)。其实就算是面向对象思想也是包含有面向过程思想的,面向过程需形成事件、也就是函数,面向对象需抽象出类,并且也会定义出这类对 象的“行为”及方法。但是不论是面向过程的函数,还是面向对象的方法,两者所完成目的都是一致的。可以说面向过程是一种基础的方法,它考虑的是实际的实 现,一般情况下,面向过程是自顶向下逐步求精,其最重要的是模块化的思想方法。面向对象的方法主要是把事物给对象化,包括其属性和行为。这里在程序较小的 时候,面向过程就会体现出一种优势,其程序流程十分清楚。如同上述汽车发动、到站这一过程,面向过程可以很清晰的将这一过程体现出来。而面向对像仅仅是抽 象出一个Bus类,包括发动、到站之两个行为,具体的执行顺序不能体现出来。 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象,抽象出对象的目的并不在于完成某个步骤,而是描述其再整个解决问 题的步骤中的行为。面向过程的思维方式是分析综合,面向对象的思维方式是构造。 例如c语言解决问题时,一般是先定义数据结构,然后在构造算法。而是面向对象求解时则是先抽象出对象,构造一个“封闭”的环境,这个环境中有定义的数据和 解决问题的算法。面向过程的设计更具挑战性,技巧性,面向对象主要在于对象抽象的技术性,一旦完成抽象,任何人都可以做后面的工作了。从代码层结构上来说 的话,面向对象和面向过程的主要区别就是数据是单独存数还是与操作存储在一起。面向对象提供了数据的封装后,是的对某一操作而言,数据的访问变得可靠了。 面向过程就是将coding当做一件事,一步一步完成,面向对象就是将coding当做一件事物,需要做什么的时候由事物(对象)本身的行为去完成。 总的来说: 面向对象是将事物高度抽象化。 面向过程是一种自顶向下的编程。 面向对象必须先建立抽象模型,之后直接使用模型就行了。面向过程就是说把做事情的步骤一步一步要干啥清楚明了的告诉我们。就是说我们知道具体是通过什么方式来实现的。 面向对象说白了就是我们只需要知道我们所使用的对象有什么功能,然后我们让对象去做事情。我们关心的不是实现的过程,而是能否实现和实现的结果。是事物抽象化的一种体现。 10.什么是单例?怎么用?有什么好处?指出你项目中用到的单例模式。 什么是单例模式单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 单例模式的作用可以保证在运行程序过程中,一个类只有一个实例,而且该实例易于供外界访问; 方便控制实例个数,节约系统资源。如何使用?单例是整个 Cocoa 中被广泛使用的核心设计模式之一。事实上,苹果开发者库把单例作为 “Cocoa 核心竞争力” 之一。作为一个iOS开发者,我们经常和单例打交道,比如 UIApplication 和 NSFileManager 等等。我们在开源项目、苹果示例代码和 StackOverflow 中见过了无数使用单例的例子。Xcode 甚至有一个默认的 “Dispatch Once” 代码片段,可以使我们非常简单地在代码中添加一个单例:`+ (instancetype)sharedInstance{ <span class="hljs-keyword">static</span> <span class="hljs-built_in">dispatch_once_t</span> once; <span class="hljs-keyword">static</span> <span class="hljs-keyword">id</span> sharedInstance; <span class="hljs-built_in">dispatch_once</span>(&amp;once, ^{ sharedInstance = [[<span class="hljs-keyword">self</span> alloc] init]; }); <span class="hljs-keyword">return</span> sharedInstance; }`由于这些原因,单例在 iOS 开发中随处可见。问题是,它们很容易被滥用。 尽管有些人认为单例是 ‘反模式’, ‘魔鬼’ 以及 ‘病态的说谎者’,我不会去完全否认单例所带来的的好处,而是会展示一些使用单例所带来的问题,这样下一次在使用 dispatch_once 代码片段的自动补全功能时,你可以对它的影响进行评估,三思而行。 全局状态大多数的开发者都认同使用全局可变的状态是不好的行为。太多状态使得程序难以理解,难以调试。我们这些面向对象的程序员在最小化代码的状态复杂程度的方面,有很多需要向函数式编程学习的地方。`@implementation SPMath { NSUInteger _a; NSUInteger _b; } (NSUInteger)computeSum{ return _a + _b;}`在上面这个简单的数学库的实现中,程序员需要在调用 computeSum 前正确的设置实例变量 _a 和 _b。这样有以下问题: 1.computeSum 没有显式地通过使用参数的形式声明它依赖于 _a 和 _b 的状态。与仅仅通过查看函数声明就可以知道这个函数的输出依赖于哪些变量不同的是,另一个开发者必须查看这个函数的具体实现才能明白这个函数依赖那些变量。隐藏依赖是不好的。 2.当为调用 computeSum 做准备而修改 _a 和 _b 的数值时,程序员需要保证这些修改不会影响任何其他依赖于这两个变量的代码的正确性。而这在多线程的环境中是尤其困难的。 把下面的代码和上面的例子做对比:`+ (NSUInteger)computeSumOf:(NSUInteger)a plus:(NSUInteger)b{ <span class="hljs-keyword">return</span> a + b; }`这里,对变量 a 和 b 的依赖被显式地声明了。我们不需要为了调用这个方法而去改变实例变量的状态。并且我们也不需要担心调用这个函数会留下持久的副作用。我们甚至可以把这个方法声明为类方法,这样就告诉了代码的阅读者这个方法不会修改任何实例的状态。 那么,这个例子和单例又有什么关系呢?用 Miško Hevery 的话来说,”单例就是披着羊皮的全局状态”。一个单例可以被使用在任何地方,而不需要显式地声明依赖。就像变量 _a 和 _b 在 computeSum 内部被使用了,却没有被显式声明一样,程序的任意模块都可以调用 [SPMySingleton sharedInstance] 并且访问这个单例。这意味着任何和这个单例交互产生的副作用都会影响程序其他地方的任意代码。`@interface SPSingleton : NSObject (instancetype)sharedInstance; (NSUInteger)badMutableState; (void)setBadMutableState:(NSUInteger)badMutableState; @end @implementation SPConsumerA (void)someMethod{ if ([[SPSingleton sharedInstance] badMutableState]) {<span class="hljs-comment">// ...</span> }} @end @implementation SPConsumerB (void)someOtherMethod{ [[SPSingleton sharedInstance] setBadMutableState:0];} @end`在上面的例子中,SPConsumerA 和 SPConsumerB 是两个完全独立的模块。但是 SPConsumerB 可以通过使用单例提供的共享状态来影响 SPConsumerA 的行为。这种情况应该只能发生在 consumer B 显式引用了 A,并表明了两者之间的关系时。这里使用了单例,由于其具有全局和多状态的特性,导致隐式地在两个看起来完全不相关的模块之间建立了耦合。 让我们来看一个更具体的例子,并且暴露一个使用全局可变状态的额外问题。比如我们想要在我们的应用中构建一个网页查看器。为了支持这个查看器,我们构建了一个简单的 URL cache:`@interface SPURLCache (SPCache *)sharedURLCache; (void)storeCachedResponse:(NSCachedURLResponse )cachedResponse forRequest:(NSURLRequest )request; @end`这个开发者开始写一些单元测试来保证代码在一些不同的情况下都能达到预期。首先,他写了一个测试用例来保证网页查看器在设备没有连接时能够展示出错 误信息。然后他写了一个测试用例来保证网页查看器能够正确的处理服务器错误。最后,他为成功情况时写了一个测试用例,来保证返回的网络内容能够被正确的显 示出来。这个开发者运行了所有的测试用例,并且它们都如预期一样正确。赞! 几个月以后,这些测试用例开始出现失败,尽管网页查看器的代码从它写完后就从来没有再改动过!到底发生了什么? 原来,有人改变了测试的顺序。处理成功的那个测试用例首先被运行,然后再运行其他两个。处理错误的那两个测试用例现在竟然成功了,和预期不一样,因为 URL cache 这个单例把不同测试用例之间的 response 缓存起来了。 持久化状态是单元测试的敌人,因为单元测试在各个测试用例相互独立的情况下才有效。如果状态从一个测试用例传递到了另外一个,这样就和测试用例的执行顺序就有关系了。有 bug 的测试用例,尤其是那些本来不应该通过的测试用例,是非常糟糕的事情。 对象的生命周期另外一个关键问题就是单例的生命周期。当你在程序中添加一个单例时,很容易会认为 “永远只会有一个实例”。但是在很多我看到过的 iOS 代码中,这种假定都可能被打破。 比如,假设我们正在构建一个应用,在这个应用里用户可以看到他们的好友列表。他们的每个朋友都有一张个人信息的图片,并且我们想使我们的应用能够下 载并且在设备上缓存这些图片。 使用 dispatch_once 代码片段,我们可以写一个 SPThumbnailCache 单例:`@interface SPThumbnailCache : NSObject (instancetype)sharedThumbnailCache; (void)cacheProfileImage:(NSData )imageData forUserId:(NSString )userId; (NSData )cachedProfileImageForUserId:(NSString )userId; @end`我们继续构建我们的应用,一切看起来都很正常,直到有一天,我们决定去实现‘注销’功能,这样用户可以在应用中进行账号切换。突然我们发现我们将要 面临一个讨厌的问题:用户相关的状态存储在全局单例中。当用户注销后,我们希望能够清理掉所有的硬盘上的持久化状态。否则,我们将会把这些被遗弃的数据残 留在用户的设备上,浪费宝贵的硬盘空间。对于用户登出又登录了一个新的账号这种情况,我们也想能够对这个新用户使用一个全新的 SPThumbnailCache 实例。 问题在于按照定义单例被认为是“创建一次,永久有效”的实例。你可以想到一些对于上述问题的解决方案。或许我们可以在用户登出时移除这个单例:`static SPThumbnailCache *sharedThumbnailCache; (instancetype)sharedThumbnailCache{ if (!sharedThumbnailCache) { sharedThumbnailCache = [[<span class="hljs-keyword">self</span> alloc] init]; } return sharedThumbnailCache;} (void)tearDown{ // The SPThumbnailCache will clean up persistent states when deallocated sharedThumbnailCache = nil;}`这是一个明显的对单例模式的滥用,但是它可以工作,对吧? 我们当然可以使用这种方式去解决,但是代价实在是太大了。我们不能使用简单的的 dispatch_once 方案了,而这个方案能够保证线程安全以及所有调用 [SPThumbnailCache sharedThumbnailCache] 的地方都能访问到同一个实例。现在我们需要对使用缩略图 cache 的代码的执行顺序非常小心。假设当用户正在执行登出操作时,有一些后台任务正在执行把图片保存到缓存中的操作:`dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[SPThumbnailCache sharedThumbnailCache] cacheProfileImage:newImage <span class="hljs-keyword">for</span>UserId:userId]; });`我们需要保证在所有的后台任务完成前, tearDown 一定不能被执行。这确保了 newImage 数据可以被正确的清理掉。或者,我们需要保证在缩略图 cache 被移除时,后台缓存任务一定要被取消掉。否则,一个新的缩略图 cache 的实例将会被延迟创建,并且之前用户的数据 (newImage 对象) 会被存储在它里面。 由于对于单例实例来说它没有明确的所有者,(因为单例自己管理自己的生命周期),“关闭”一个单例变得非常的困难。 分析到这里,我希望你能够意识到,“这个缩略图 cache 从来就不应该作为一个单例!”。问题在于一个对象得生命周期可能在项目的最初阶段没有被很好得考虑清楚。举一个具体的例子,Dropbox 的 iOS 客户端曾经只支持一个账号登录。它以这样的状态存在了数年,直到有一天我们希望能够同时支持多个用户账号登录 (同时登陆私人账号和工作账号)。突然之间,我们以前的的假设“只能够同时有一个用户处于登录状态”就不成立了。如果假定了一个对象的生命周期和应用的生 命周期一致,那你的代码的灵活扩展就受到了限制,早晚有一天当产品的需求产生变化时,你会为当初的这个假定付出代价的。 这里我们得到的教训是,单例应该只用来保存全局的状态,并且不能和任何作用域绑定。如果这些状态的作用域比一个完整的应用程序的生命周期要短,那么这个状态就不应该使用单例来管理。用一个单例来管理用户绑定的状态,是代码的坏味道,你应该认真的重新评估你的对象图的设计。 避免使用单例既然单例对局部作用域的状态有这么多的坏处,那么我们应该怎样避免使用它们呢? 让我们来重温一下上面的例子。既然我们的缩略图 cache 的缓存状态是和具体的用户绑定的,那么让我们来定义一个user对象吧:`@interface SPUser : NSObject @property (nonatomic, readonly) SPThumbnailCache *thumbnailCache; @end @implementation SPUser (instancetype)init{ if ((self = [super init])) { _thumbnailCache = [[SPThumbnailCache alloc] init]; <span class="hljs-comment">// Initialize other user-specific state...</span> } return self;} @end</pre> 我们现在用一个对象来作为一个经过认证的用户会话的模型类,并且我们可以把所有和用户相关的状态存储在这个对象中。现在假设我们有一个view controller来展现好友列表: <pre>@interface SPFriendListViewController : UIViewController (instancetype)initWithUser:(SPUser *)user; @end`我们可以显式地把经过认证的 user 对象作为参数传递给这个 view controller。这种把依赖性传递给依赖对象的技术正式的叫法是依赖注入,它有很多优点: 1.对于阅读这个 SPFriendListViewController 头文件的读者来说,可以很清楚的知道它只有在有登录用户的情况下才会被展示。 2.这个 SPFriendListViewController 只要还在使用中,就可以强引用 user 对象。举例来说,对于前面的例子,我们可以像下面这样在后台任务中保存一个图片到缩略图 cache 中:`dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [_user.thumbnailCache cacheProfileImage:newImage <span class="hljs-keyword">for</span>UserId:userId]; }); 就算后台任务还没有完成,应用其他地方的代码也可以创建和使用一个全新的 SPUser 对象,而不会在清理第一个实例时阻塞用户交互. 为了更详细的说明一下第二点,让我们画一下在使用依赖注入之前和之后的对象图。 假设我们的 SPFriendListViewController 是当前 window 的 root view controller。使用单例时,我们的对象图看起来如下所示: view controller 自己,以及自定义的 image view 的列表,都会和 sharedThumbnailCache 产生交互。当用户登出后,我们想要清理 root view controller 并且退出到登录页面: 这里的问题在于这个好友列表的 view controller 可能仍然在执行代码 (由于后台操作的原因),并且可能因此仍然有一些没有执行的涉及到 sharedThumbnailCache 的调用。 和使用依赖注入的解决方案对比一下: 简单起见,假设 SPApplicationDelegate 管理 SPUser 的实例 (在实践中,你可能会把这些用户状态的管理工作交给另外一个对象来做,这样可以使你的 application delegate 简化)。当展现好友列表 view controller 时,会传递进去一个 user 的引用。这个引用也会向下传递给 profile image views。现在,当用户登出时,我们的对象图如下所示: 这个对象图看起来和使用单例时很像。那么,区别是什么呢? 关键问题是作用域。在单例那种情况中,sharedThumbnailCache 仍然可以被程序的任意模块访问。假如用户快速的登录了一个新的账号。该用户也想看看他的好友列表,这也就意味着需要再一次的和缩略图 cache 产生交互: 当用户登录一个新账号,我们应该能够构建并且与全新的 SPThumbnailCache 交互,而不需要再在销毁老的缩略图 cache 上花费精力。基于对象管理的典型规则,老的 view controllers 和老的缩略图 cache 应该能够自己在后台延迟被清理掉。简而言之,我们应该隔离用户 A 相关联的状态和用户 B 相关联的状态: 结论这一切的关键点是,在面向对象编程中我们想要最小化可变状态的作用域。但是单例却因为使可变的状态可以被程序中的任何地方访问,而站在了对立面。下一次你想使用单例时,能够好好考虑一下使用依赖注入作为替代方案。 原文:shavekevin.com/2016/02/28/mianshiwentidaanyi]]></content>
</entry>
<entry>
<title><![CDATA[面试中被面试官问到的问题答案(一)]]></title>
<url>%2F2016%2F03%2F11%2F20%2F</url>
<content type="text"><![CDATA[以下问题的答案是之前写的一篇文章 面试中被面试官问到的问题 现在把问题的答案整理了一份出来给大家。希望对大家有所帮助。如果整理的答案有问题,请联系我。shavekevin@gmail.com 1.请你谈谈static和宏定义的区别。什么时候用static什么时候用宏定义。让你声明的常量只在你声明的文件里有作用要不编译器会保存 宏定义: 1). 一般来说我们使用宏定义最常见的是定义一些常量 简单的”函数”(比如求两个数的最大小值)例如:定义常量PI <span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> PI 3.1415926</span> `</pre> 定义函数 <pre>`<span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> MIN(A,B) ((A) &lt; (B) ? (A):(B))</span> `</pre> 我们不对宏定义进行修改 2) . 使用宏定义可以在很大程度上可以简化我们的代码 例如:我们在写单例的时候 之前我们写的是 <pre>`<span class="hljs-preprocessor">#import <span class="hljs-title">"ShareSingleton.h"</span></span> <span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">ShareSingleton</span></span> +(instancetype)shareSingleton { <span class="hljs-keyword">static</span> ShareSingleton *leader = <span class="hljs-literal">nil</span>; <span class="hljs-keyword">static</span> <span class="hljs-built_in">dispatch_once_t</span> onceToken; <span class="hljs-built_in">dispatch_once</span>(&amp;onceToken, ^{ leader = [[ShareSingleton alloc]init]; }); <span class="hljs-keyword">return</span> leader; } <span class="hljs-keyword">@end</span> `</pre> //如果我们使用宏定义的话我们可以这样写: <pre>`<span class="hljs-preprocessor">#define DISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&amp;onceToken, onceBlock);</span> <span class="hljs-preprocessor">#import <span class="hljs-title">"ShareSingleton.h"</span></span> <span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">ShareSingleton</span></span> +(instancetype)shareSingleton { <span class="hljs-keyword">static</span> ShareSingleton *leader = <span class="hljs-literal">nil</span>; DISPATCH_ONCE_BLOCK(^{ leader = [[ShareSingleton alloc]init]; }) <span class="hljs-keyword">return</span> leader; } <span class="hljs-keyword">@end</span> `</pre> 其实#define的原理就是不管三七二十一,直接做替换,所以我们完全可以利用这个特点,发挥自己的想象,简化代码~ 宏定义实质是一个预编译指令,在程序未运行之前将某些指令付给相应的变量。 小结一下: static标记的变量会存储到全局变量区,生命周期和程序相同。而宏定义所定义的生命周期与所在的载体的生命周期有关. static只在声明的类中可见。 在声明的类中结束后,再次使用还是之前的值。 2.你是怎么看待代理 通知的 他们有什么区别? 首先,我们把代理通知 放到一起来讨论第一反映是传值。 ok,下面慢慢来说各个的用法和区别。 通知中心 通过NSNotification可以给多个对象传递数据和消息(多个传递) 代理 通过protocol(代理模式)只能给一个对象传递数据和消息(单一传递)“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理(可以用多点回调,下面见解)。 代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败。 区别: 代理和通知的区别应该主要是一对一和一对多的关系。delegate的多点回调相对notification更加便捷,更多方便,让项目更好维护。 3.说说你对内存管理的理解。 内存管理原则 引用计数的增加和减少相等,当引用计数降为0之后,不应该再使用这块内存空间。 凡是用alloc retain 或者copy让内存的引用计数增加了。就需要使用release或者autorelease让内存的引用 计数减少。在一段代码内。增加和减少的次数要相等。 autoreleasepool的使用 通过autoreleasepool控制autorelease对象的释放 向一个对象发送autorelease消息。这个对象何时释放取决于autoreleasepool copy方法 跟retain不同,一个对象想要copy,生成自己的副本,需要实现NSCopying协议,定义copy的细节(如何copy)如果类没有接受NSCoping协议而给类发送copy消息,会引起crash 总结: OC借助引用计数机制去管理内存,凡是使用了alloc copy retain 等 方法,增加了引用计数,就要使用release 和autorelease 减少引用计数,引用计数为0的时候,对象所占的内存,被系统回收。 autorelease是未来某个时间(出autorelease)引用减一,不是即时的。 不是任何对象都可以接受copy消息。只有接受了NSCoping协议的对象才接受copy消息。 4.谈谈你对iOS性能优化的理解. 谈起iOS的性能优化我们首先想到的是应该是tableview表视图的优化。关于表视图的优化我们可以从以下几个方面来看: 1).tableviewcell渲染 绘制时要尽可能的避免分配资源,比如UIFont,NSDateFormatter或者任何在绘制时 需要的对象,推荐使用类层级的初始化方法中执行分配,并将其存储为静态变量。 2).图层渲染的问题 透明图层对渲染性能会有一定的影响,系统必须将透明图层与下面的视图混合起来计算颜色,并 绘制出来。减少透明图层并使用不透明的图层来替代它们,可以极大地提高渲染速度。 3).为代理方法瘦身 我们要尽量避免在tableview的cellforrowatindexpath的代理方法里写那么多代码,这样做不仅可以简化代码方便维护和管理,这对程序的运行也有帮助。 4).复杂视图尽量采用纯代码的方式 当 UITableViewCell拥有多个子视图时,IOS的渲染机制会拖慢速度。重写drawRect直接绘制内容的方式可 以提高性能,而不是在类初始化的时候初始化一些label或者imageview等。 (以下来源于yykit作者ibireme[这是源链接](http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/)) 下面就是些CPU 资源消耗原因和解决方案 还有GPU资源消耗原因和解决方案 对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗 CPU 资源。尽量用轻量的对象代替重量的对象,可以对性能有所优化。比如 CALayer 比 UIView 要轻量许多,那么不需要响应触摸事件的控件,用 CALayer 显示会更加合适。如果对象不涉及 UI 操作,则尽量放到后台线程去创建,但可惜的是包含有 CALayer 的控件,都只能在主线程创建和操作。通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大非常多,在性能敏感的界面里,Storyboard 并不是一个好的技术选择。 1).对象的创建 尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。如果对象可以复用,并且复用的代价比释放、创建新对象要小,那么这类对象应当尽量放到一个缓存池里复用。 2).对象调整 对象的调整也经常是消耗 CPU 资源的地方。这里特别说一下 CALayer:CALayer 内部并没有属性,当调用属性方法时,它内部是通过运行时 resolveInstanceMethod 为对象临时添加一个方法,并把对应属性值保存到内部的一个 Dictionary 里,同时还会通知 delegate、创建动画等等,非常消耗资源。UIView 的关于显示相关的属性(比如 frame/bounds/transform)等实际上都是 CALayer 属性映射来的,所以对 UIView 的这些属性进行调整时,消耗的资源要远大于一般的属性。对此你在应用中,应该尽量减少不必要的属性修改。 当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。 3). 对象销毁 对象的销毁虽然消耗资源不多,但累积起来也是不容忽视的。通常当容器类持有大量对象时,其销毁时的资源消耗就非常明显。同样的,如果对象可以放到后台线程 去释放,那就挪到后台线程去。这里有个小 Tip:把对象捕获到 block 中,然后扔到后台队列去随便发送个消息以避免编译器警告,就可以让对象在后台线程销毁了。 例如: <pre>`<span class="hljs-built_in">NSArray</span> *tmp = <span class="hljs-keyword">self</span><span class="hljs-variable">.array</span>; <span class="hljs-keyword">self</span><span class="hljs-variable">.array</span> = <span class="hljs-literal">nil</span>; <span class="hljs-built_in">dispatch_async</span>(queue, ^{ [tmp class]; }); `</pre> 4).一些计算 视图布局的计算是 App 中最为常见的消耗 CPU 资源的地方。如果能在后台线程提前计算好视图布局、并且对视图布局进行缓存,那么这个地方基本就不会产生性能问题了。 不论通过何种技术对视图进行布局,其最终都会落到对 UIView.frame/bounds/center 等属性的调整上。上面也说过,对这些属性的调整非常消耗资源,所以尽量提前计算好布局,在需要时一次性调整好对应属性,而不要多次、频繁的计算和调整这些 属性。 Autolayout 是苹果本身提倡的技术,在大部分情况下也能很好的提升开发效率,但是 Autolayout 对于复杂视图来说常常会产生严重的性能问题。随着视图数量的增长,Autolayout 带来的 CPU 消耗会呈指数级上升。具体数据可以看这个文章:[http://pilky.me/36/。](http://pilky.me/36/%E3%80%82) 如果你不想手动调整 frame 等属性,你可以用一些工具方法替代(比如常见的 left/right/top/bottom/width/height 快捷属性),或者使用 ComponentKit、AsyncDisplayKit 等框架. 如果一个界面中包含大量文本(比如微博微信朋友圈等),文本的宽高计算会占用很大一部分资源,并且不可避免。如果你对文本显示没有特殊要求,可以参 考下 UILabel 内部的实现方式:用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本。尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。 5).文本的绘制 如果你用 CoreText 绘制文本,那就可以先生成 CoreText 排版对象,然后自己计算了,并且 CoreText 对象还能保留以供稍后绘制使用。 屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。对此解决方案只有一个,那就是自定义文本控件,用 TextKit 或最底层的 CoreText 对文本异步绘制。尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText 对象占用内存较少,可以缓存下来以备稍后多次渲染. 6).图片的解码 当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。 7).图像的绘制 图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。由于 CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行。一个简单异步绘制的过程大致如下(实际情况会比这个复杂得多,但原理基本一致) <pre>`<span class="hljs-built_in">dispatch_async</span>(backgroundQueue, ^{ CGContextRef ctx = CGBitmapContextCreate(...); <span class="hljs-comment">// draw in context...</span> CGImageRef img = CGBitmapContextCreateImage(ctx); CFRelease(ctx); <span class="hljs-built_in">dispatch_async</span>(mainQueue, ^{ layer<span class="hljs-variable">.contents</span> = img; }); }); `</pre> GPU 资源消耗原因和解决方案 1.纹理的渲染 所有的 Bitmap,包括图片、文本、栅格化的内容,最终都要由内存提交到显存,绑定为 GPU Texture。不论是提交到显存的过程,还是 GPU 调整和渲染 Texture 的过程,都要消耗不少 GPU 资源。当在较短时间显示大量图片时(比如 TableView 存在非常多的图片并且快速滑动时),CPU 占用率很低,GPU 占用非常高,界面仍然会掉帧。避免这种情况的方法只能是尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。 当图片过大,超过 GPU 的最大纹理尺寸时,图片需要先由 CPU 进行预处理,这对 CPU 和 GPU 都会带来额外的资源消耗。目前来说,iPhone 4S 以上机型,纹理尺寸上限都是 4096x4096,更详细的资料可以看这里:iosres.com。所以,尽量不要让图片和视图的大小超过这个值。 2.视图的混合 当多个视图(或者说 CALayer)重叠在一起显示时,GPU 会首先把他们混合到一起。如果视图结构过于复杂,混合的过程也会消耗很多 GPU 资源。为了减轻这种情况的 GPU 消耗,应用应当尽量减少视图数量和层次,并在不透明的视图里标明 opaque 属性以避免无用的 Alpha 通道合成。当然,这也可以用上面的方法,把多个视图预先渲染为一张图片来显示 3.图像的生成 CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在 后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。 <pre>`如何检测应用的流畅度? `</pre> “过早的优化是万恶之源”,在需求未定,性能问题不明显时,没必要尝试做优化,而要尽量正确的实现功能。做性能优化时,也最好是走修改代码 -&gt; Profile -&gt; 修改代码这样一个流程,优先解决最值得优化的地方。 如果你需要一个明确的 FPS 指示器,可以尝试一下 KMCGeigerCounter。对于 CPU 的卡顿,它可以通过内置的 CADisplayLink 检测出来;对于 GPU 带来的卡顿,它用了一个 1x1 的 SKView 来进行监视。这个项目有两个小问题:SKView 虽然能监视到 GPU 的卡顿,但引入 SKView 本身就会对 CPU/GPU 带来额外的一点的资源消耗;这个项目在 iOS 9 下有一些兼容问题,需要稍作调整。 5.你用过单元测试吗?怎么才能做好单元测试? > 什么是单元测试? 单元测试:以下内容来自维基百科[单元测试](https://zh.wikipedia.org/wiki/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95) 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程 等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 <pre>`通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书要求的工作目标,没有程序错误;虽然单元测试不是什么必须的,但也不坏,这牵涉到项目管理的政策决定。 每个理想的测试案例独立于其它案例;为测试时隔离模块,经常使用<span class="hljs-tag">stubs</span>、<span class="hljs-tag">mock</span><span class="hljs-attr_selector">[1]</span>或<span class="hljs-tag">fake</span>等测试马甲程序。单元测试通常由软件开发人员编写,用于确保他们所写的代码符合软件需求和遵循开发目标。它的实施方式可以是非常手动的(通过纸笔),或者是做成构建自动化的一部分。 `</pre> > 单元测试有什么好处? 单元测试的一个好处就是我们可以只测试单个模块,我们可以测试 单一模块有没有问题。比如说我们在开发中经常会写一些测试性的demo。我们写的测试性demo运行正常达到了我们需要的效果,那么我们就可以把demo的效果运用到我们的工程中进行调试。 适应变更单元测试允许程序员在未来重构代码,并且确保模块依然工作正确(复合测试)。这个过程就是为所有函数和方法编写单元测试,一旦变更导致错误发生,借助于单元测试可以快速定位并修复错误。可读性强的单元测试可以使程序员方便地检查代码片断是否依然正常工作。良好设计的单元测试案例覆盖程序单元分支和循环条件的所有路径。在连续的单元测试环境,通过其固有的持续维护工作,单元测试可以延续用于准确反映当任何变更发生时可执行程序和代码的表现。借助于上述开发实践和单元测试的覆盖,可以分分秒秒维持准确性。 简化集成单元测试消除程序单元的不可靠,采用自底向上的测试路径。通过先测试程序部件再测试部件组装,使集成测试变得更加简单。业界对于人工集成测试的必要性存在较大争议。尽管精心设计的单元测试体系看上去实现了集成测试,因为集成测试需要人为评估一些人为因素才能证实的方 面,单元测试替代集成测试不可信。一些人认为在足够的自动化测试系统的条件下,人力集成测试组不再是必需的。事实上,真实的需求最终取决于开发产品的特点 和使用目标。另外,人工或手动测试很大程度上依赖于组织的可用资源。[来源请求] 文档记录单元测试提供了系统的一种文档记录。借助于查看单元测试提供的功能和单元测试中如何使用程序单元,开发人员可以直观的理解程序单元的基础API。单元测试具体表现了程序单元成功的关键特点。这些特点可以指出正确使用和非正确使用程序单元,也能指出需要捕获的程序单元的负面表现(译注:异常和错误)。尽管很多软件开发环境不仅依赖于代码做为产品文档,在单元测试中和单元测试本身确实文档化了程序单元的上述关键特点。另一方面,传统文档易受程序本身实现的影响,并且时效性难以保证(如设计变更、功能扩展等在不太严格时经常不能保持文档同步更新)。 表达设计在测试驱动开发的软件实践中,单元测试可以取代正式的设计。每一个单元测试案例均可以视为一项类、方法和待观察行为等设计元素。下面的Java例可以帮助说明这一点。 当然,单元测试缺乏图的可读性,但UML图可以在自由工具(通常可从IDE扩展获取)中为大多数现代程序语言生成UML图,很难要求采购昂贵的UML设计套装软件。自由工具,类似于基于xUnit框架的工具,测试结果输出到一些可生成供人工识读的图形化工具系统中去。 分离接口和实现因为很多类会引用其它类,对这个类的测试经常会要求测试其它的类。一个最普遍的例子是依赖于数据库的类:为了测试它,测试人员通常编写代码去操作数据库。这是不对的,因为单元测试不应超出待测试的类边界。作为替代,软件开发人员应创建一个数据库连接的抽象接口,然后实现这个接口的模拟对象。通过对代码所需附件的抽象(临时降低了网状的耦合效应),这些独立程序单元较前者更能被完整测试。高质量的代码单元也可提供更好的可维护性。 局限测试不可能发现所有的程序错误,单元测试也不例外。按定义,单元测试只测试程序单元自身的功能。因此,它不能发现集成错误、性能问题、或者其他系统 级别的问题。单元测试结合其他软件测试活动更为有效。与其它形式的软件测试类似,单元测试只能表明测到的问题,不能表明不存在未测试到的错误。软件测试是一个组合问题。例如,每一个布尔型的决断语句需要至少两种测试:一个返回真,一个返回假。因此,针对每行书写的代码,程序员通常需要写3 至5行的测试代码。[3]这很明显地很花时间而且对此的投入可能并不值得。也有些问题是根本不能简单地检测出来的——例如具不确定性的或牵扯到多线程的问 题。此外,替单元测试写的代码可能就像要测试的代码一样有程序错误。佛瑞德·布鲁克斯在人月神话一书中举例说明:“绝对不要带两个计时器去海边。最好总是 带一或三个”。意味着,如果两个计时器互相冲突的话,你该怎么知道哪个是对的?为了获得单元测试的好处,在软件开发过程中应形成一套严格纪律意识。仔细保 留记录是必要的,不仅仅只保留执行的测试,也包括保留对应的源码和其它软件单元的变更历史。即,使用版本控制系统是必要的。如果后续版本不能通过一个以前 测试通过的单元测试,版本控制系统可以提供对应时间段对源代码所做的变更清单。每天养成查看单元测试案例失败测试并及时确定错误原因的习惯是必要的。如果没有这样的流程,没有在团队工作流程中体现,单元测试系列将走向不同步,造成越来越多的错误和越来越低效的单元测试案例系列。 iOS中的单元测试在开发中,经常用到的单元测试一是测试某个模块的功能,也就是说把这个模块独立起来,单独进行测试。用到最多的应该是测试模块功能和接口调试功能。当然单元测试还有一些高级的用法自动测试和自动发布等。 OCUnit(即用XCTest进行测试)其实就是苹果自带的测试框架,我们主要讲的就是这个。GHUnit是一个可视化的测试框架。(有了它,你可以点 击APP来决定测试哪个方法,并且可以点击查看测试结果等。)OCMock就是模拟某个方法或者属性的返回值,你可能会疑惑为什么要这样做?使用用模型生 成的模型对象,再传进去不就可以了?答案是可以的,但是有特殊的情况。比如你测试的是方法A,方法A里面调用到了方法B,而且方法B是有参数传入,但又不 是方法A所提供。这时候,你可以使用OCMock来模拟方法B返回的值。(在不影响测试的情况下,就可以这样去模拟。)除了这些,在没有网络的情况下,也 可以通过OCMock模拟返回的数据。UITests就是通过代码化来实现自动点击界面,输入文字等功能。靠人工操作的方式来覆盖所有测试用例是非常困难 的,尤其是加入新功能以后,旧的功能也要重新测试一遍,这导致了测试需要花非常多的时间来进行回归测试,这里产生了大量重复的工作,而这些重复的工作有些 是可以自动完成的,这时候UITests就可以帮助解决这个问题了。 6. 你知道的的本地数据持久化都有哪些。你比较喜欢用哪些 为什么? 采用的数据存储的方式有以下几种:1、 FMDB(常用)2、 Sqlite(次之)3、 Coredata(次之)4、 NSUserdefaults(最多使用)5、 序列化反序列化(归档和解档)6、 MongoDB(小众型的) 大家讨论用的最多的是FMDB,原因很简单,关系型数据库,使用方便(相对于没经过封装和加工的Sqlite来说)。其次就是sqlite和 coredata 当然使用者三种主要是为了缓存。因为我们在开发中为了给用户更好的体验,就采用缓存的形式。一般情况下要做的操作就是在本地建立一个数据库(本地后台)。 7.谈谈MVC设计模式的优缺点 编程以来就一直被灌输MVC设计模式,具体MVC使用到底好在哪里 又有那些不足之处,可以通过下面的介绍得以了解。 一、mvc原理 mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。 模型(model)它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的Action,dao类)和数据模块(pojo类)。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性 视图(view) 用户与之交互的界面、在web中视图一般由jsp,html组成 控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用.二、MVC的优点 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。三、MVC的不足之处 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。8.谈谈你对多线程的理解,你经常用的多线程有哪些实现方式,谈谈他们优缺点。 使用NSOperationQueue用来管理子类化的NSOperation对象,控制其线程并发数目。GCD和NSOperation都 可以实现对线程的管理,区别是 NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优点是NSOperation是 对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是 多线程支持,而接口简单,建议在复杂项目中使用。 项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。 什么时候用多线程?大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文 件、视频图像的采集、处理、显示、保存等。多线程的作用?可以解决负载均衡问题,充分利用cpu资源 。为了提高CPU的使用率,采用多线程的方式去同时完 成几件事情而互不干扰.iOS实现多线程有哪几种方式?主要有三种主要方法。 1、NSThread。 2、NSOperation。 3、GCD。 多线程安全问题的几种解决方案?使用锁。锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正 确性。使用POSIX互斥锁;使用NSLock类;使用@synchronized指令等。分线程回调主线程方法是什么?有什么作用呢?回到主线程的方法: (1). performSelectorOnMainThrea[<span class="hljs-keyword">self</span> performSelectorOnMainThread:&lt;<span class="hljs-preprocessor">#(SEL)#&gt;withObject:<span class="hljs-title">&lt;#(id)#&gt;</span>waitUntilDone:<span class="hljs-title">&lt;#(BOOL)#&gt;</span>];</span>(2). GCD<span class="hljs-built_in">dispatch_async</span>(dispatch_get_main_queue(), ^{ });(3). NSOperationQueue[[NSOperationQueue mainQueue]addOperationWithBlock:^{ }]作用:主线程是显示UI界面,子线程多数是进行数据处理. PS:最高境界是异步单线程,江湖上称协程。可以参考 boost 中的 asio 用户级的任务调度 9.谈谈你对面向对象和面向过程的认识。 简单对比 面向过程就像是一个细心的管家,事无具细的都要考虑到。而面向对象就像是个家用电器,你只需要知道他的功能,不需要知道它的工作原理。“面向过 程”是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。面向对象是以“对象”为中心的编程思想。 简单的举个例子:汽车发动、汽车到站 这对于“面向过程”来说,是两个事件,汽车启动是一个事件,汽车到站是另一个事件,面向过程编程的过程中我们关心的是事件,而不是汽车本身。针 对上述两个事件,形成两个函数,之后依次调用。然而这对于面向对象来说,我们关心的是汽车这类对象,两个事件只是这类对象所具有的行为。而且对于这两个行 为的顺序没有强制要求。 两种思想的对比 面向过程其实最为实际的一种思考方式,因为我们总是一贯一步一步的解决问题。(举个简单的事情,在初学面向对象的语言例如c++时,我们也总是 不经意的面向过程了!)。其实就算是面向对象思想也是包含有面向过程思想的,面向过程需形成事件、也就是函数,面向对象需抽象出类,并且也会定义出这类对 象的“行为”及方法。但是不论是面向过程的函数,还是面向对象的方法,两者所完成目的都是一致的。可以说面向过程是一种基础的方法,它考虑的是实际的实 现,一般情况下,面向过程是自顶向下逐步求精,其最重要的是模块化的思想方法。面向对象的方法主要是把事物给对象化,包括其属性和行为。这里在程序较小的 时候,面向过程就会体现出一种优势,其程序流程十分清楚。如同上述汽车发动、到站这一过程,面向过程可以很清晰的将这一过程体现出来。而面向对像仅仅是抽 象出一个Bus类,包括发动、到站之两个行为,具体的执行顺序不能体现出来。 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象,抽象出对象的目的并不在于完成某个步骤,而是描述其再整个解决问 题的步骤中的行为。面向过程的思维方式是分析综合,面向对象的思维方式是构造。 例如c语言解决问题时,一般是先定义数据结构,然后在构造算法。而是面向对象求解时则是先抽象出对象,构造一个“封闭”的环境,这个环境中有定义的数据和 解决问题的算法。面向过程的设计更具挑战性,技巧性,面向对象主要在于对象抽象的技术性,一旦完成抽象,任何人都可以做后面的工作了。从代码层结构上来说 的话,面向对象和面向过程的主要区别就是数据是单独存数还是与操作存储在一起。面向对象提供了数据的封装后,是的对某一操作而言,数据的访问变得可靠了。 面向过程就是将coding当做一件事,一步一步完成,面向对象就是将coding当做一件事物,需要做什么的时候由事物(对象)本身的行为去完成。 总的来说: 面向对象是将事物高度抽象化。 面向过程是一种自顶向下的编程。 面向对象必须先建立抽象模型,之后直接使用模型就行了。面向过程就是说把做事情的步骤一步一步要干啥清楚明了的告诉我们。就是说我们知道具体是通过什么方式来实现的。 面向对象说白了就是我们只需要知道我们所使用的对象有什么功能,然后我们让对象去做事情。我们关心的不是实现的过程,而是能否实现和实现的结果。是事物抽象化的一种体现。 10.什么是单例?怎么用?有什么好处?指出你项目中用到的单例模式。 什么是单例模式单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 单例模式的作用可以保证在运行程序过程中,一个类只有一个实例,而且该实例易于供外界访问; 方便控制实例个数,节约系统资源。如何使用?单例是整个 Cocoa 中被广泛使用的核心设计模式之一。事实上,苹果开发者库把单例作为 “Cocoa 核心竞争力” 之一。作为一个iOS开发者,我们经常和单例打交道,比如 UIApplication 和 NSFileManager 等等。我们在开源项目、苹果示例代码和 StackOverflow 中见过了无数使用单例的例子。Xcode 甚至有一个默认的 “Dispatch Once” 代码片段,可以使我们非常简单地在代码中添加一个单例:`+ (instancetype)sharedInstance{ <span class="hljs-keyword">static</span> <span class="hljs-built_in">dispatch_once_t</span> once; <span class="hljs-keyword">static</span> <span class="hljs-keyword">id</span> sharedInstance; <span class="hljs-built_in">dispatch_once</span>(&amp;once, ^{ sharedInstance = [[<span class="hljs-keyword">self</span> alloc] init]; }); <span class="hljs-keyword">return</span> sharedInstance; }`由于这些原因,单例在 iOS 开发中随处可见。问题是,它们很容易被滥用。 尽管有些人认为单例是 ‘反模式’, ‘魔鬼’ 以及 ‘病态的说谎者’,我不会去完全否认单例所带来的的好处,而是会展示一些使用单例所带来的问题,这样下一次在使用 dispatch_once 代码片段的自动补全功能时,你可以对它的影响进行评估,三思而行。 全局状态大多数的开发者都认同使用全局可变的状态是不好的行为。太多状态使得程序难以理解,难以调试。我们这些面向对象的程序员在最小化代码的状态复杂程度的方面,有很多需要向函数式编程学习的地方。`@implementation SPMath { NSUInteger _a; NSUInteger _b; } (NSUInteger)computeSum{ return _a + _b;}`在上面这个简单的数学库的实现中,程序员需要在调用 computeSum 前正确的设置实例变量 _a 和 _b。这样有以下问题: 1.computeSum 没有显式地通过使用参数的形式声明它依赖于 _a 和 _b 的状态。与仅仅通过查看函数声明就可以知道这个函数的输出依赖于哪些变量不同的是,另一个开发者必须查看这个函数的具体实现才能明白这个函数依赖那些变量。隐藏依赖是不好的。 2.当为调用 computeSum 做准备而修改 _a 和 _b 的数值时,程序员需要保证这些修改不会影响任何其他依赖于这两个变量的代码的正确性。而这在多线程的环境中是尤其困难的。 把下面的代码和上面的例子做对比:`+ (NSUInteger)computeSumOf:(NSUInteger)a plus:(NSUInteger)b{ <span class="hljs-keyword">return</span> a + b; }`这里,对变量 a 和 b 的依赖被显式地声明了。我们不需要为了调用这个方法而去改变实例变量的状态。并且我们也不需要担心调用这个函数会留下持久的副作用。我们甚至可以把这个方法声明为类方法,这样就告诉了代码的阅读者这个方法不会修改任何实例的状态。 那么,这个例子和单例又有什么关系呢?用 Miško Hevery 的话来说,”单例就是披着羊皮的全局状态”。一个单例可以被使用在任何地方,而不需要显式地声明依赖。就像变量 _a 和 _b 在 computeSum 内部被使用了,却没有被显式声明一样,程序的任意模块都可以调用 [SPMySingleton sharedInstance] 并且访问这个单例。这意味着任何和这个单例交互产生的副作用都会影响程序其他地方的任意代码。`@interface SPSingleton : NSObject (instancetype)sharedInstance; (NSUInteger)badMutableState; (void)setBadMutableState:(NSUInteger)badMutableState; @end @implementation SPConsumerA (void)someMethod{ if ([[SPSingleton sharedInstance] badMutableState]) {<span class="hljs-comment">// ...</span> }} @end @implementation SPConsumerB (void)someOtherMethod{ [[SPSingleton sharedInstance] setBadMutableState:0];} @end`在上面的例子中,SPConsumerA 和 SPConsumerB 是两个完全独立的模块。但是 SPConsumerB 可以通过使用单例提供的共享状态来影响 SPConsumerA 的行为。这种情况应该只能发生在 consumer B 显式引用了 A,并表明了两者之间的关系时。这里使用了单例,由于其具有全局和多状态的特性,导致隐式地在两个看起来完全不相关的模块之间建立了耦合。 让我们来看一个更具体的例子,并且暴露一个使用全局可变状态的额外问题。比如我们想要在我们的应用中构建一个网页查看器。为了支持这个查看器,我们构建了一个简单的 URL cache:`@interface SPURLCache (SPCache *)sharedURLCache; (void)storeCachedResponse:(NSCachedURLResponse )cachedResponse forRequest:(NSURLRequest )request; @end`这个开发者开始写一些单元测试来保证代码在一些不同的情况下都能达到预期。首先,他写了一个测试用例来保证网页查看器在设备没有连接时能够展示出错 误信息。然后他写了一个测试用例来保证网页查看器能够正确的处理服务器错误。最后,他为成功情况时写了一个测试用例,来保证返回的网络内容能够被正确的显 示出来。这个开发者运行了所有的测试用例,并且它们都如预期一样正确。赞! 几个月以后,这些测试用例开始出现失败,尽管网页查看器的代码从它写完后就从来没有再改动过!到底发生了什么? 原来,有人改变了测试的顺序。处理成功的那个测试用例首先被运行,然后再运行其他两个。处理错误的那两个测试用例现在竟然成功了,和预期不一样,因为 URL cache 这个单例把不同测试用例之间的 response 缓存起来了。 持久化状态是单元测试的敌人,因为单元测试在各个测试用例相互独立的情况下才有效。如果状态从一个测试用例传递到了另外一个,这样就和测试用例的执行顺序就有关系了。有 bug 的测试用例,尤其是那些本来不应该通过的测试用例,是非常糟糕的事情。 对象的生命周期另外一个关键问题就是单例的生命周期。当你在程序中添加一个单例时,很容易会认为 “永远只会有一个实例”。但是在很多我看到过的 iOS 代码中,这种假定都可能被打破。 比如,假设我们正在构建一个应用,在这个应用里用户可以看到他们的好友列表。他们的每个朋友都有一张个人信息的图片,并且我们想使我们的应用能够下 载并且在设备上缓存这些图片。 使用 dispatch_once 代码片段,我们可以写一个 SPThumbnailCache 单例:`@interface SPThumbnailCache : NSObject (instancetype)sharedThumbnailCache; (void)cacheProfileImage:(NSData )imageData forUserId:(NSString )userId; (NSData )cachedProfileImageForUserId:(NSString )userId; @end`我们继续构建我们的应用,一切看起来都很正常,直到有一天,我们决定去实现‘注销’功能,这样用户可以在应用中进行账号切换。突然我们发现我们将要 面临一个讨厌的问题:用户相关的状态存储在全局单例中。当用户注销后,我们希望能够清理掉所有的硬盘上的持久化状态。否则,我们将会把这些被遗弃的数据残 留在用户的设备上,浪费宝贵的硬盘空间。对于用户登出又登录了一个新的账号这种情况,我们也想能够对这个新用户使用一个全新的 SPThumbnailCache 实例。 问题在于按照定义单例被认为是“创建一次,永久有效”的实例。你可以想到一些对于上述问题的解决方案。或许我们可以在用户登出时移除这个单例:`static SPThumbnailCache *sharedThumbnailCache; (instancetype)sharedThumbnailCache{ if (!sharedThumbnailCache) { sharedThumbnailCache = [[<span class="hljs-keyword">self</span> alloc] init]; } return sharedThumbnailCache;} (void)tearDown{ // The SPThumbnailCache will clean up persistent states when deallocated sharedThumbnailCache = nil;}`这是一个明显的对单例模式的滥用,但是它可以工作,对吧? 我们当然可以使用这种方式去解决,但是代价实在是太大了。我们不能使用简单的的 dispatch_once 方案了,而这个方案能够保证线程安全以及所有调用 [SPThumbnailCache sharedThumbnailCache] 的地方都能访问到同一个实例。现在我们需要对使用缩略图 cache 的代码的执行顺序非常小心。假设当用户正在执行登出操作时,有一些后台任务正在执行把图片保存到缓存中的操作:`dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[SPThumbnailCache sharedThumbnailCache] cacheProfileImage:newImage <span class="hljs-keyword">for</span>UserId:userId]; });`我们需要保证在所有的后台任务完成前, tearDown 一定不能被执行。这确保了 newImage 数据可以被正确的清理掉。或者,我们需要保证在缩略图 cache 被移除时,后台缓存任务一定要被取消掉。否则,一个新的缩略图 cache 的实例将会被延迟创建,并且之前用户的数据 (newImage 对象) 会被存储在它里面。 由于对于单例实例来说它没有明确的所有者,(因为单例自己管理自己的生命周期),“关闭”一个单例变得非常的困难。 分析到这里,我希望你能够意识到,“这个缩略图 cache 从来就不应该作为一个单例!”。问题在于一个对象得生命周期可能在项目的最初阶段没有被很好得考虑清楚。举一个具体的例子,Dropbox 的 iOS 客户端曾经只支持一个账号登录。它以这样的状态存在了数年,直到有一天我们希望能够同时支持多个用户账号登录 (同时登陆私人账号和工作账号)。突然之间,我们以前的的假设“只能够同时有一个用户处于登录状态”就不成立了。如果假定了一个对象的生命周期和应用的生 命周期一致,那你的代码的灵活扩展就受到了限制,早晚有一天当产品的需求产生变化时,你会为当初的这个假定付出代价的。 这里我们得到的教训是,单例应该只用来保存全局的状态,并且不能和任何作用域绑定。如果这些状态的作用域比一个完整的应用程序的生命周期要短,那么这个状态就不应该使用单例来管理。用一个单例来管理用户绑定的状态,是代码的坏味道,你应该认真的重新评估你的对象图的设计。 避免使用单例既然单例对局部作用域的状态有这么多的坏处,那么我们应该怎样避免使用它们呢? 让我们来重温一下上面的例子。既然我们的缩略图 cache 的缓存状态是和具体的用户绑定的,那么让我们来定义一个user对象吧:`@interface SPUser : NSObject @property (nonatomic, readonly) SPThumbnailCache *thumbnailCache; @end @implementation SPUser (instancetype)init{ if ((self = [super init])) { _thumbnailCache = [[SPThumbnailCache alloc] init]; <span class="hljs-comment">// Initialize other user-specific state...</span> } return self;} @end</pre> 我们现在用一个对象来作为一个经过认证的用户会话的模型类,并且我们可以把所有和用户相关的状态存储在这个对象中。现在假设我们有一个view controller来展现好友列表: <pre>@interface SPFriendListViewController : UIViewController (instancetype)initWithUser:(SPUser *)user; @end`我们可以显式地把经过认证的 user 对象作为参数传递给这个 view controller。这种把依赖性传递给依赖对象的技术正式的叫法是依赖注入,它有很多优点: 1.对于阅读这个 SPFriendListViewController 头文件的读者来说,可以很清楚的知道它只有在有登录用户的情况下才会被展示。 2.这个 SPFriendListViewController 只要还在使用中,就可以强引用 user 对象。举例来说,对于前面的例子,我们可以像下面这样在后台任务中保存一个图片到缩略图 cache 中:`dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [_user.thumbnailCache cacheProfileImage:newImage <span class="hljs-keyword">for</span>UserId:userId]; }); 就算后台任务还没有完成,应用其他地方的代码也可以创建和使用一个全新的 SPUser 对象,而不会在清理第一个实例时阻塞用户交互. 为了更详细的说明一下第二点,让我们画一下在使用依赖注入之前和之后的对象图。 假设我们的 SPFriendListViewController 是当前 window 的 root view controller。使用单例时,我们的对象图看起来如下所示: view controller 自己,以及自定义的 image view 的列表,都会和 sharedThumbnailCache 产生交互。当用户登出后,我们想要清理 root view controller 并且退出到登录页面: 这里的问题在于这个好友列表的 view controller 可能仍然在执行代码 (由于后台操作的原因),并且可能因此仍然有一些没有执行的涉及到 sharedThumbnailCache 的调用。 和使用依赖注入的解决方案对比一下: 简单起见,假设 SPApplicationDelegate 管理 SPUser 的实例 (在实践中,你可能会把这些用户状态的管理工作交给另外一个对象来做,这样可以使你的 application delegate 简化)。当展现好友列表 view controller 时,会传递进去一个 user 的引用。这个引用也会向下传递给 profile image views。现在,当用户登出时,我们的对象图如下所示: 这个对象图看起来和使用单例时很像。那么,区别是什么呢? 关键问题是作用域。在单例那种情况中,sharedThumbnailCache 仍然可以被程序的任意模块访问。假如用户快速的登录了一个新的账号。该用户也想看看他的好友列表,这也就意味着需要再一次的和缩略图 cache 产生交互: 当用户登录一个新账号,我们应该能够构建并且与全新的 SPThumbnailCache 交互,而不需要再在销毁老的缩略图 cache 上花费精力。基于对象管理的典型规则,老的 view controllers 和老的缩略图 cache 应该能够自己在后台延迟被清理掉。简而言之,我们应该隔离用户 A 相关联的状态和用户 B 相关联的状态: 结论这一切的关键点是,在面向对象编程中我们想要最小化可变状态的作用域。但是单例却因为使可变的状态可以被程序中的任何地方访问,而站在了对立面。下一次你想使用单例时,能够好好考虑一下使用依赖注入作为替代方案。 原文:shavekevin.com/2016/02/28/mianshiwentidaanyi]]></content>
</entry>
<entry>
<title><![CDATA[MarkDown编辑器推荐--MarkdownPad]]></title>