├── .gitignore ├── .md ├── 2015-11-19-01.png ├── 2015-11-19-01副本.png ├── 2015-11-19-02.png ├── QQ20151118-0.png ├── QQ20151118-1.png ├── QQ20151119-1.png ├── QQ20151223-1.png ├── QQ20151223-2.png ├── QQ20151230-0.png ├── QQ20160103-0.png ├── QQ20160103-1.png ├── QQ20160103-2.png ├── QQ20160103-3.png ├── QQ20160106-0.png ├── QQ20160107-0.png ├── QQ20160107-3.png ├── QQ20160114-0.png ├── QQ20160117-0.png ├── QQ20160117-1.png ├── QQ20160121-1.png ├── QQ20160129-0.png ├── QQ20160129-1.png ├── QQ20160131-0.png ├── QQ20160131-1.png ├── QQ20160131-2.png ├── QQ20160131-3.png ├── QQ20160929-0.png ├── QQ20160929-1.png ├── QQ20160930-0.png ├── QQ20161008-0.png ├── QQ20161010-0.png ├── README.md ├── SUMMARY.md ├── ai-ni-jiu-xiang-ai-sheng-ming.md ├── ajax.md ├── amazingjavascript-2.md ├── an_quan.md ├── assets ├── QQ20170111-0.png ├── QQ20180731-111326.png ├── QQ20180731-231629.png ├── QQ20180731-234152.png ├── QQ20180802-175921.png ├── QQ20180802-183651.png ├── QQ20180802-212558.png ├── QQ20180814-112146.png ├── QQ20180814-232214.png ├── QQ20180816-195255.png ├── QQ20180816-201349.png ├── QQ20180817-182406.png ├── QQ20180823-124559.png ├── QQ20180823-1245591.png ├── QQ20180823-140715.png ├── QQ20180823-195019.png ├── QQ20180823-201831.png ├── QQ20180823-201939.png ├── QQ20180825-083223.png ├── QQ20180825-164827.png ├── QQ20180825-234654.png ├── QQ20180826-213226.png ├── QQ20180826-220305.png ├── QQ20180827-215901.png ├── QQ20180828-225557.png ├── QQ20180901-233408.png ├── QQ20180901-234727.png ├── QQ20180901-235802.png ├── QQ20180901-235855.png ├── QQ20180903-225014.png ├── QQ20180903-230222.png ├── QQ20180903-230836.png ├── QQ20180903-233427.png ├── QQ20180903-234353.png ├── QQ20190706-214738.jpg ├── QQ20190706-214950.jpg ├── QQ20190714-225057.jpg ├── QQ20190824-163127.jpg ├── QQ20190824-163454.jpg ├── QQ20190824-163537.jpg ├── QQ20190824-172818.jpg ├── QQ20190824-173151.jpg ├── QQ20211106-200859.png ├── WX20180813-234952.png ├── WX20190704-230424.png ├── WX20190708-230906.png ├── jian-kong-wei-du.png └── radial_gradient_varied.png ├── bai-mao-zi-jiang-web-sao-miao.md ├── bai_mao_zi_jiang_web_an_quan.md ├── base_-farewell.md ├── beirf_history_of_humankind.md ├── bian_cheng_shi_zhan.md ├── bian_xie_ke_ce_shi_de_javascript_dai_ma.md ├── book.json ├── bootstrapshi_zhan.md ├── cong-ling-kai-shi-xue-you-yong.md ├── css3.md ├── cssjie_mi.md ├── cssshi-jie.md ├── cui-yu-tao-bao-bei-jian-kang-gong-kai-ke.md ├── da_xing_wang_zhan_ji_zhu_jia_gou_he_xin_yuan_li_yu.md ├── dan_yuan_ce_shi_de_yi_zhu.md ├── dombian_cheng.md ├── effectivejavascriptbian_xie_gao_zhi_liang_javascri.md ├── fan_qie_gong_zuo_fa_tu_jie.md ├── feng_kuang_html5__css3__javascript.md ├── front ├── pwd-kai-fa-shi-jian.md ├── shen-ru-li-jie-svg.md └── typescript-bian-cheng.md ├── fu_wu_qi_duan.md ├── gao_xing_neng_javascript.md ├── gao_xing_neng_wang_zhan_jian_she_zhi_nan.md ├── git_ji_chu.md ├── go_lang └── go-cheng-xu-she-ji-yu-yan.md ├── google75026bf2fa85c633.html ├── graphql-xue-xi-zhi-nan.md ├── han-shu-shi-bian-cheng-si-7ef45c.md ├── he-qiu-xie-yi-qi-xue-ppt.md ├── html5.md ├── html5_canvas.md ├── http.md ├── http_power_book.md ├── internet_game_technology.md ├── javascript-dom-编程艺术第2版.md ├── javascript.md ├── javascript_.md ├── javascript_design.md ├── javascriptgao-xiao-tu-xing-bian-cheng.md ├── javascriptgao_ji_cheng_xu_she_ji.md ├── javascripthan_shu_shi_bian_cheng.md ├── javascriptqi_shi_lu.md ├── javascriptquan_wei_zhi_nan.md ├── javascriptshe_ji_mo_shi_yu_kai_fa_shi_jian.md ├── javascriptwebying_yong_kai_fa.md ├── javascriptxing_neng_you_hua_du_liang_3001_jian_kon.md ├── javascript语言精粹.md ├── ji_chu.md ├── ji_chu_.md ├── jia_zai_yu_zhi_xing.md ├── jiao_ben_hua_wen_dang.md ├── jing-tong-zheng-ze-biao-da-shi.md ├── jqueryji_zhu_nei_mu_ff1a_shen_ru_jie_xi_jquery_jia.md ├── ke_hu_duan_javascript.md ├── laravelkuang_jia_guan_jian_ji_zhu_jie_xi.md ├── linux.md ├── linuxniao_ge_si_fang_cai_ji_chu_xue_xi_pian.md ├── modernphp.md ├── node.js.md ├── package.json ├── phphe_xin_ji_zhu_yu_zui_jia_shi_jian.md ├── progit.md ├── qi-ye-ying-yong-jia-gou-mo-shi.md ├── qi_ye_guan_li.md ├── qian-duan-kua-yu-yi-pian-jiu-gou.md ├── qian_duan.md ├── robots.txt ├── server ├── 5- 数据复制.png ├── Compact行记录结构.jpg ├── Innodb逻辑存储结构.jpg ├── QQ_1728871978055.png ├── QQ_1728872137326.png ├── QQ_1735864394102.png ├── QQ_1735868189230.png ├── QQ_1736298660879.png ├── QQ_1736298779219.png ├── QQ_1736905740736.png ├── QQ_1736992594467.png ├── QQ_1736993090767.png ├── QQ_1737002309672.png ├── QQ_1737002711777.png ├── binlog_cache_size写入流程.png ├── create_data.sql ├── create_data2.sql ├── es-shi-zhan.md ├── gao-xing-neng-mysql.md ├── go-bian-cheng-zhi-lv.md ├── go-bin-fa-bian-cheng-shi-jian.md ├── image-1.png ├── image-10.png ├── image-2.png ├── image-3.png ├── image-4.png ├── image-5.png ├── image-6.png ├── image-7.png ├── image-8.png ├── image-9.png ├── image.png ├── innodb数据存放-共享表和单独表.jpg ├── mysql-bi-zhi-bi-hui.md ├── mysql-ji-chu-jiao-cheng.md ├── mysql-ji-shu-nei-mu-innodb-cun-chu-yin-qin.md ├── mysql-ji-shu-nei-mu-sql-bian-cheng.md ├── mysql-pai-cuo-zhi-nan.md ├── promethus-yuan-li-ying-yong-yuan-ma-yu-tuo-zhan-xiang-jie.md ├── redis-shi-zhan.md ├── shu_ju_mi_ji_xing_ying_yong_xi_tong_she_ji.md ├── sre-google-yun-wei-jie-mi.md ├── zhong-tai-jia-gou-yu-shi-xian.md ├── 单调读.png ├── 读自己的写.png └── 页结构.jpg ├── she_ji.md ├── she_ji_xin_li_xue_yi.md ├── shen_ru_php_mian_xiang_dui_xiang_3001_mo_shi_yu_sh.md ├── shi_jian_chu_li.md ├── shu-xue-zhi-mei.md ├── shu_ju_du_qu.md ├── sitemap.xml ├── springshi_zhan.md ├── suan_fa_he_liu_cheng_kong_zhi.md ├── tcpipxiang_jie_juan_4e003a_xie_yi.md ├── tmp.txt ├── tu_jie_http.md ├── ui.md ├── utils.md ├── utils ├── bei-tao-yan-de-yong-qi.md ├── graphql-shi-zhan.md ├── graphql-xue-xi-zhi-nan.md ├── jia-gou-shi-xiu-lian-zhi-dao-zhang.md ├── jia-gou-shi-xiu-lian-zhi-dao.md ├── shang-di-zhi-tou-zi.md ├── xi-tong-zhi-mei-jue-ce-zhe-de-xi-tong-si-kao.md └── xing-fu-de-yong-qi.md ├── vimshi_yong_ji_qiao.md ├── wang-luo-pa-chong-quan-jie-xi-ji-zhu-3001-yuan-li-yu-shi-zhan.md ├── wang-luo-ying-xiao-tui-guang-shi-zhan-bao-dian.md ├── wang_luo.md ├── web-apide-she-ji-yu-kai-fa.md ├── web-xie-yi-xiang-jie-yu-zhua-bao-shi-zhan.md ├── webkitji_zhu_nei_mu.md ├── webqian_duan_hei_ke_ji_zhu_jie_mi.md ├── webqian_duan_kai_fa_zui_jia_shi_jian.md ├── webxing-neng-quan-wei-zhi-nan.md ├── wei-jiao-hu.md ├── wireshark-shu-ju-bao-fen-xi-shi-zhan.md ├── wiresharkwang_luo_fen_xi_de_yi_zhu.md ├── xi_tong_fen_xi_shi_uml_xiang_mu_shi_zhan.md ├── xiao_lv.md ├── yi_dong_she_ji.md ├── zhi_mei_yong_hu_ren_ben_she_ji_pou_xi.md ├── zhi_you_pian_zhi_kuang_cai_neng_sheng_cun.md ├── zhong_gou_gai_shan_ji_you_dai_ma_de_she_ji.md ├── zi_dong_ji_cheng.md ├── zi_fu_chuan_he_zheng_ze_biao_da_shi.md ├── 两个装饰模式.png ├── 深入浅出node.md ├── 程序员修炼之道--从小工到专家.md ├── 组合模式.png ├── 编写可维护的javascript.md ├── 网页设计创意书卷4.md ├── 装饰模式.png └── 鲜活的数据--数据可视化指南.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | _book/ 3 | copy_book/ 4 | .DS_Store -------------------------------------------------------------------------------- /.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/.md -------------------------------------------------------------------------------- /2015-11-19-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/2015-11-19-01.png -------------------------------------------------------------------------------- /2015-11-19-01副本.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/2015-11-19-01副本.png -------------------------------------------------------------------------------- /2015-11-19-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/2015-11-19-02.png -------------------------------------------------------------------------------- /QQ20151118-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20151118-0.png -------------------------------------------------------------------------------- /QQ20151118-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20151118-1.png -------------------------------------------------------------------------------- /QQ20151119-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20151119-1.png -------------------------------------------------------------------------------- /QQ20151223-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20151223-1.png -------------------------------------------------------------------------------- /QQ20151223-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20151223-2.png -------------------------------------------------------------------------------- /QQ20151230-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20151230-0.png -------------------------------------------------------------------------------- /QQ20160103-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160103-0.png -------------------------------------------------------------------------------- /QQ20160103-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160103-1.png -------------------------------------------------------------------------------- /QQ20160103-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160103-2.png -------------------------------------------------------------------------------- /QQ20160103-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160103-3.png -------------------------------------------------------------------------------- /QQ20160106-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160106-0.png -------------------------------------------------------------------------------- /QQ20160107-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160107-0.png -------------------------------------------------------------------------------- /QQ20160107-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160107-3.png -------------------------------------------------------------------------------- /QQ20160114-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160114-0.png -------------------------------------------------------------------------------- /QQ20160117-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160117-0.png -------------------------------------------------------------------------------- /QQ20160117-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160117-1.png -------------------------------------------------------------------------------- /QQ20160121-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160121-1.png -------------------------------------------------------------------------------- /QQ20160129-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160129-0.png -------------------------------------------------------------------------------- /QQ20160129-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160129-1.png -------------------------------------------------------------------------------- /QQ20160131-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160131-0.png -------------------------------------------------------------------------------- /QQ20160131-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160131-1.png -------------------------------------------------------------------------------- /QQ20160131-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160131-2.png -------------------------------------------------------------------------------- /QQ20160131-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160131-3.png -------------------------------------------------------------------------------- /QQ20160929-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160929-0.png -------------------------------------------------------------------------------- /QQ20160929-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160929-1.png -------------------------------------------------------------------------------- /QQ20160930-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20160930-0.png -------------------------------------------------------------------------------- /QQ20161008-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20161008-0.png -------------------------------------------------------------------------------- /QQ20161010-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/QQ20161010-0.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 读书总结 2 | ======= 3 | 4 | 为什么读书?学我不会的知识. 5 | 6 | 读书能否巩固知识?能,但是巩固知识最好的方式是实践. 7 | 8 | 本书主要记录我的阅读总结 9 | 10 | 在线阅读 11 | 12 | 1. 网络 13 | 1. `<<图解HTTP>>` 14 | 2. 前端 15 | 1. `<<高性能JavaScript>>` 16 | 2. `<>` 17 | 3. `<<疯狂Html5/CSS3/JavaScript>>` 18 | 4. `<<高性能网站建设指南>>` 19 | 5. `<<高性能网站建设进阶指南>>` 20 | 6. `<>` 21 | 22 | 3. 服务器端 23 | 1. `<<系统分析师UML项目实战>>` 24 | 2. `<<深入php面向对象、模式与实践>>` 25 | 3. `<>` 26 | 4. Utils 27 | 1. `<>` 28 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | * [网络](wang_luo.md) 5 | * [图解HTTP](tu_jie_http.md) 6 | * [Wireshark网络分析的艺术](wiresharkwang_luo_fen_xi_de_yi_zhu.md) 7 | * [TCP-IP详解 卷一: 协议](tcpipxiang_jie_juan_4e003a_xie_yi.md) 8 | * [HTTP权威指南](http_power_book.md) 9 | * [Wireshark数据包分析实战](wireshark-shu-ju-bao-fen-xi-shi-zhan.md) 10 | * [Web协议详解与抓包实战](web-xie-yi-xiang-jie-yu-zhua-bao-shi-zhan.md) 11 | * [前端](qian_duan.md) 12 | * [高性能JavaScript](gao_xing_neng_javascript.md) 13 | * [JavaScript权威指南](javascriptquan_wei_zhi_nan.md) 14 | * [疯狂Html5-CSS3-JavaScript](feng_kuang_html5__css3__javascript.md) 15 | * [HTML5](html5.md) 16 | * [CSS3](css3.md) 17 | * [JavaScript](amazingjavascript-2.md) 18 | * [高性能网站建设指南](gao_xing_neng_wang_zhan_jian_she_zhi_nan.md) 19 | * [高性能网站建设进阶指南](gao_xing_neng_wang_zhan_jian_she_jin_jie_zhi_nan.md) 20 | * [BootStrap实战](bootstrapshi_zhan.md) 21 | * [JavaScript设计模式与开发实践](javascriptshe_ji_mo_shi_yu_kai_fa_shi_jian.md) 22 | * [JavaScript高级程序设计](javascriptgao_ji_cheng_xu_she_ji.md) 23 | * [JavaScript函数式编程](javascripthan_shu_shi_bian_cheng.md) 24 | * [HTML5 Canvas](html5_canvas.md) 25 | * [编写可测试的JavaScript代码](bian_xie_ke_ce_shi_de_javascript_dai_ma.md) 26 | * [JavaScriptWeb应用开发](javascriptwebying_yong_kai_fa.md) 27 | * [WebKit技术内幕](webkitji_zhu_nei_mu.md) 28 | * [CSS揭秘](cssjie_mi.md) 29 | * [JavaScript启示录](javascriptqi_shi_lu.md) 30 | * [EffectiveJavaScript编写高质量JavaScript的68个有效方法](effectivejavascriptbian_xie_gao_zhi_liang_javascri.md) 31 | * [Web前端开发最佳实践](webqian_duan_kai_fa_zui_jia_shi_jian.md) 32 | * [JavaScript性能优化度量、监控与可视化](javascriptxing_neng_you_hua_du_liang_3001_jian_kon.md) 33 | * [jQuery技术内幕:深入解析jQuery架构设计与实现原理](jqueryji_zhu_nei_mu_ff1a_shen_ru_jie_xi_jquery_jia.md) 34 | * [编写可维护的JavaScript](编写可维护的javascript.md) 35 | * [JavaScript语言精粹](javascript语言精粹.md) 36 | * [JavaScript DOM 编程艺术\(第2版\)](javascript-dom-编程艺术第2版.md) 37 | * [深入浅出node](深入浅出node.md) 38 | * [javascript\_设计模式](javascript_design.md) 39 | * [Node.js高级编程](node.js.md) 40 | * [JavaScript高效图形编程](javascriptgao-xiao-tu-xing-bian-cheng.md) 41 | * [Web性能权威指南](webxing-neng-quan-wei-zhi-nan.md) 42 | * [CSS世界](cssshi-jie.md) 43 | * [TypeScript编程](front/typescript-bian-cheng.md) 44 | * [PWA开发实践](front/pwd-kai-fa-shi-jian.md) 45 | * [深入理解SVG](front/shen-ru-li-jie-svg.md) 46 | * [服务器端](fu_wu_qi_duan.md) 47 | * [系统分析师UML项目实战](xi_tong_fen_xi_shi_uml_xiang_mu_shi_zhan.md) 48 | * [深入php面向对象、模式与实践](shen_ru_php_mian_xiang_dui_xiang_3001_mo_shi_yu_sh.md) 49 | * [PHP核心技术与最佳实践](phphe_xin_ji_zhu_yu_zui_jia_shi_jian.md) 50 | * [单元测试的艺术](dan_yuan_ce_shi_de_yi_zhu.md) 51 | * [Spring实战](springshi_zhan.md) 52 | * [Linux鸟哥私房菜基础学习篇](linuxniao_ge_si_fang_cai_ji_chu_xue_xi_pian.md) 53 | * [Linux内核设计与实现](linux.md) 54 | * [大型网站技术架构核心原理与案例分析](da_xing_wang_zhan_ji_zhu_jia_gou_he_xin_yuan_li_yu.md) 55 | * [Laravel框架关键技术解析](laravelkuang_jia_guan_jian_ji_zhu_jie_xi.md) 56 | * [ModernPHP](modernphp.md) 57 | * [网络游戏核心技术与实战](internet_game_technology.md) 58 | * [高性能MySQL](server/gao-xing-neng-mysql.md) 59 | * [Web API的设计与开发](web-apide-she-ji-yu-kai-fa.md) 60 | * [Graphql学习指南](utils/graphql-xue-xi-zhi-nan.md) 61 | * [Graphql实战](utils/graphql-shi-zhan.md) 62 | * [Go程序设计语言](go_lang/go-cheng-xu-she-ji-yu-yan.md) 63 | * [Promethus原理、应用、源码及扩展详解](server/promethus-yuan-li-ying-yong-yuan-ma-yu-tuo-zhan-xiang-jie.md) 64 | * [MySQL排错指南](server/mysql-pai-cuo-zhi-nan.md) 65 | * [MySQL必知必会](server/mysql-bi-zhi-bi-hui.md) 66 | * [MySQL基础教程](server/mysql-ji-chu-jiao-cheng.md) 67 | * [MySQL技术内幕SQL编程](server/mysql-ji-shu-nei-mu-sql-bian-cheng.md) 68 | * [ES实战](server/es-shi-zhan.md) 69 | * [Redis实战](server/redis-shi-zhan.md) 70 | * [Go语言编程之旅](server/go-bian-cheng-zhi-lv.md) 71 | * [Go并发编程实践](server/go-bin-fa-bian-cheng-shi-jian.md) 72 | * [中台架构与实现](server/zhong-tai-jia-gou-yu-shi-xian.md) 73 | * [SRE-Google运维解密](server/sre-google-yun-wei-jie-mi.md) 74 | * [MySQL技术内幕-InnoDB存储引擎](server/mysql-ji-shu-nei-mu-innodb-cun-chu-yin-qin.md) 75 | * [数据密集型应用系统设计](server/shu_ju_mi_ji_xing_ying_yong_xi_tong_she_ji.md) 76 | * [安全](an_quan.md) 77 | * [Web前端黑客技术揭秘](webqian_duan_hei_ke_ji_zhu_jie_mi.md) 78 | * [白帽子讲WEB安全](bai_mao_zi_jiang_web_an_quan.md) 79 | * [白帽子讲Web扫描](bai-mao-zi-jiang-web-sao-miao.md) 80 | * [Utils](utils.md) 81 | * [Pro\_Git](progit.md) 82 | * [重构改善既有代码的设计](zhong_gou_gai_shan_ji_you_dai_ma_de_she_ji.md) 83 | * [Vim使用技巧](vimshi_yong_ji_qiao.md) 84 | * [程序员修炼之道--从小工到专家](程序员修炼之道--从小工到专家.md) 85 | * [鲜活的数据--数据可视化指南](鲜活的数据--数据可视化指南.md) 86 | * [人类简史](beirf_history_of_humankind.md) 87 | * [最好的告别](base_-farewell.md) 88 | * [企业应用架构模式](qi-ye-ying-yong-jia-gou-mo-shi.md) 89 | * [函数式编程思维](han-shu-shi-bian-cheng-si-7ef45c.md) 90 | * [网络营销推广实战宝典](wang-luo-ying-xiao-tui-guang-shi-zhan-bao-dian.md) 91 | * [精通正则表达式](jing-tong-zheng-ze-biao-da-shi.md) 92 | * [网络爬虫全解析技术、原理与实战](wang-luo-pa-chong-quan-jie-xi-ji-zhu-3001-yuan-li-yu-shi-zhan.md) 93 | * [从零开始学游泳](cong-ling-kai-shi-xue-you-yong.md) 94 | * [和秋叶一起学PPT](he-qiu-xie-yi-qi-xue-ppt.md) 95 | * [数学之美](shu-xue-zhi-mei.md) 96 | * [爱你就像爱生命](ai-ni-jiu-xiang-ai-sheng-ming.md) 97 | * [崔玉涛宝贝健康公开课](cui-yu-tao-bao-bei-jian-kang-gong-kai-ke.md) 98 | * [被讨厌的勇气](utils/bei-tao-yan-de-yong-qi.md) 99 | * [幸福的勇气](utils/xing-fu-de-yong-qi.md) 100 | * [上帝掷骰子](utils/shang-di-zhi-tou-zi.md) 101 | * [系统之美-决策者的系统思考](utils/xi-tong-zhi-mei-jue-ce-zhe-de-xi-tong-si-kao.md) 102 | * [架构师修炼之道](utils/jia-gou-shi-xiu-lian-zhi-dao.md) 103 | * [架构师修炼之道-张](utils/jia-gou-shi-xiu-lian-zhi-dao-zhang.md) 104 | * [企业管理](qi_ye_guan_li.md) 105 | * [只有偏执狂才能生存](zhi_you_pian_zhi_kuang_cai_neng_sheng_cun.md) 106 | * [设计](she_ji.md) 107 | * [至美用户人本设计剖析](zhi_mei_yong_hu_ren_ben_she_ji_pou_xi.md) 108 | * [移动设计](yi_dong_she_ji.md) 109 | * [设计心理学一](she_ji_xin_li_xue_yi.md) 110 | * [网页设计创意书\(卷4\)](网页设计创意书卷4.md) 111 | * [微交互](wei-jiao-hu.md) 112 | * [效率](xiao_lv.md) 113 | * [番茄工作法图解](fan_qie_gong_zuo_fa_tu_jie.md) 114 | 115 | -------------------------------------------------------------------------------- /ai-ni-jiu-xiang-ai-sheng-ming.md: -------------------------------------------------------------------------------- 1 | # 爱你就像爱生命 2 | 3 | -------------------------------------------------------------------------------- /ajax.md: -------------------------------------------------------------------------------- 1 | # Ajax 2 | 3 | 请求数据分类: 4 | 5 | 1. XMLHttpRequest(XHR) 6 | 2. Dynamic script tag insertion 动态脚本注入 7 | 3. iframes 8 | 4. Comet 9 | 5. Multipart XHR 10 | 11 | 这里主要讲述`XHR` `动态脚本注入` `Multipart XHR` 12 | 13 | ##1. XMLHttpRequest 14 | 15 | `Get` 请求: 16 | ```javascript 17 | var url = '/data.php'; 18 | var params = [ 19 | 'id=123', 20 | 'limit=20' 21 | ]; 22 | 23 | var req = new XMLHttpRequest(); 24 | 25 | req.onreadystatechange = function(){ 26 | 27 | if (req.readyState == 3){ //正在`流`数据 接受到部分信息,但不是所有 28 | var data_now = req.responseText; 29 | ... 30 | } 31 | 32 | if (req.readyState === 4){ 33 | var reponse_headers = req.getAllReponseHeaders();//获取响应头信息 34 | 35 | var data =req.reponseText; //获取数据 36 | ... 37 | } 38 | 39 | req.open('GET',url+'?' +params.join('&'),true); 40 | req.setRequestHeader('X-Requested-With','XMLHttpRequest')//设置请求头信息. 41 | req.send(null);//发送请求 42 | 43 | } 44 | ``` 45 | 46 | Post请求 47 | ```javascript 48 | function xhr_post(url,params,callback){ 49 | var req =XMLHttpRequest(); 50 | 51 | req.onerror = function(){ 52 | setTimeout(function(){ 53 | xhr_post(url,params,callback); 54 | },1000); 55 | } 56 | 57 | req.onreadystatechange = function(){ 58 | if(req.readyState ==4){ 59 | if (callback && typeof callback === 'function'){ 60 | callback(); 61 | } 62 | } 63 | }; 64 | 65 | req.open('POST',url,true); 66 | req.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 67 | req.setRequestHeader('Contetn-Length',params.length); 68 | req.send(params.join('&')); 69 | } 70 | 71 | ``` 72 | 73 | 注意点 74 | 75 | 1. `XHR`不能从外域请求数据. 76 | 2. 低版本IE不支持`流`,和readyState为`3` 77 | 3. `GET`请求不改变服务器数据,只作请求数据(幂等行为),这样这个GET会被缓存起来(也是一些BUG引发的原因),当URL长度超过2048时,建议使用POST,具体建议参考`RESTful` 78 | 4. 一个POST请求至少发送两个数据包,一个装在头信息,另一个装在POST正文.而`GET`只发送一次. 79 | 80 | 能兼容IE的XHR写法 81 | 82 | ```javascript 83 | function create_XHR_object(){ 84 | var msxml_progid = [ 85 | 'MSXML2.XMLHTTP.6.0', 86 | 'MSXML3.XMLHTTP', 87 | 'Microsoft.XMLHTTP', //不支持readyStatue 3 88 | 'MSXML2.XMLHTTP.3.0', //不支持readyStatue 3 89 | ]; 90 | 91 | var req ; 92 | try { 93 | req =new XMLHttpRequest(); 94 | }catch(e){ 95 | for (var i=0,len=msxml_progid.length;i) 117 | 118 | 外部文件lib.js 119 | ```javascript 120 | json_callback({"status" : 1}); 121 | ``` 122 | 本地`javascript` 123 | ```javascript 124 | var script_element = document.createElement('script'); 125 | script_element.src = "http://any-domain.com/javascript/lib.js"; 126 | document.getElementByTagName('head')[0].appendChild(script_element); 127 | 128 | //回调函数,名字与外域的可执行`javascript`方法名一样,当外域js加载完成后,会执行json_callback(json_string)方法; 129 | function json_callback(json_string){ 130 | var data = eval('('+json_string+')'); 131 | 132 | } 133 | ``` 134 | 135 | 本地通过创建和外域.js的方法同名而实现回调. 136 | 137 | 但是调用在声明之前,为何可以?. 138 | 139 | 可以详细看`第二章 :数据读取`. 140 | 141 | ##3. Multipart XHR 142 | 143 | `Multipart XHR`基于XHR, 144 | 145 | 只不过是把多个`XHR`封装成一个`XHR`而已. 146 | 147 | 但是性能可以快4~10倍. 148 | 149 | 具体实现代码可参考. 150 | 151 | 使用建议. 152 | 153 | 1. 页面包含了大量其他地方用不到的资源. 154 | 2. 无需从缓存读数据,除非重载页面 155 | 156 | ##4. Beacons 157 | 158 | 和动态脚本注入类似 159 | ```javascript 160 | var url = '/status_tracker.php'; 161 | var params = [ 162 | 'step=2', 163 | 'time=1248219291', 164 | ]; 165 | 166 | (new Image()).src = url + '?' + params.join('&'); 167 | 168 | //需要获取返回信息 169 | var beacon = new Image(); 170 | beacon.src = url + '?' + params.join('&'); 171 | 172 | //这里假设服务器会返回图片,设定返回图片宽度为1为正确,2为错误. 173 | beacon.onload = function (){ 174 | if(this.width == 1){ 175 | //成功 176 | }else if (this.width ==2 ){ 177 | //失败,重新发送操作. 178 | } 179 | } 180 | ``` 181 | 注意事项 182 | 183 | 1. 当不用服务器返回数据时,服务器应该返回一个204状态码,阻止客户端继续等待不会到来的消息正文. 184 | 2. 这也是和`GET`一样收url长度限制的 185 | 3. 这个是给服务器回传消息的最佳方式,性能消耗很小. 186 | 4. 服务器的错误完全影响不到客户端. 187 | 188 | ##5. JSON 189 | 190 | 1. 数组JSON和对象集的JSON,前者下载和解析速度会比较快. 191 | 2. 在使用动态脚本注入的时候,外域JSON数据建议封装在`parseJSON(JSON数据)里.` 192 | 3. XHR和动态脚本注入的效率基本一致.(小数据集),大数据动态脚本会比较快.因为不用解析JSON字符串. 193 | 194 | 195 | ##总结 196 | 197 | 1. XHR技术比较安全,但解析比较慢,因为传递的是字符串. 198 | 2. 动态注入脚本就不安全,但是不用解析.并且可以请求外域. 199 | 3. Multipart XHR 可以很好的解决要很多HTTP连接问题.但不能缓存 200 | 4. 减少请求数,合并javascript和css -------------------------------------------------------------------------------- /an_quan.md: -------------------------------------------------------------------------------- 1 | # 安全 2 | 3 | -------------------------------------------------------------------------------- /assets/QQ20170111-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20170111-0.png -------------------------------------------------------------------------------- /assets/QQ20180731-111326.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180731-111326.png -------------------------------------------------------------------------------- /assets/QQ20180731-231629.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180731-231629.png -------------------------------------------------------------------------------- /assets/QQ20180731-234152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180731-234152.png -------------------------------------------------------------------------------- /assets/QQ20180802-175921.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180802-175921.png -------------------------------------------------------------------------------- /assets/QQ20180802-183651.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180802-183651.png -------------------------------------------------------------------------------- /assets/QQ20180802-212558.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180802-212558.png -------------------------------------------------------------------------------- /assets/QQ20180814-112146.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180814-112146.png -------------------------------------------------------------------------------- /assets/QQ20180814-232214.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180814-232214.png -------------------------------------------------------------------------------- /assets/QQ20180816-195255.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180816-195255.png -------------------------------------------------------------------------------- /assets/QQ20180816-201349.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180816-201349.png -------------------------------------------------------------------------------- /assets/QQ20180817-182406.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180817-182406.png -------------------------------------------------------------------------------- /assets/QQ20180823-124559.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180823-124559.png -------------------------------------------------------------------------------- /assets/QQ20180823-1245591.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180823-1245591.png -------------------------------------------------------------------------------- /assets/QQ20180823-140715.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180823-140715.png -------------------------------------------------------------------------------- /assets/QQ20180823-195019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180823-195019.png -------------------------------------------------------------------------------- /assets/QQ20180823-201831.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180823-201831.png -------------------------------------------------------------------------------- /assets/QQ20180823-201939.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180823-201939.png -------------------------------------------------------------------------------- /assets/QQ20180825-083223.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180825-083223.png -------------------------------------------------------------------------------- /assets/QQ20180825-164827.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180825-164827.png -------------------------------------------------------------------------------- /assets/QQ20180825-234654.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180825-234654.png -------------------------------------------------------------------------------- /assets/QQ20180826-213226.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180826-213226.png -------------------------------------------------------------------------------- /assets/QQ20180826-220305.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180826-220305.png -------------------------------------------------------------------------------- /assets/QQ20180827-215901.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180827-215901.png -------------------------------------------------------------------------------- /assets/QQ20180828-225557.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180828-225557.png -------------------------------------------------------------------------------- /assets/QQ20180901-233408.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180901-233408.png -------------------------------------------------------------------------------- /assets/QQ20180901-234727.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180901-234727.png -------------------------------------------------------------------------------- /assets/QQ20180901-235802.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180901-235802.png -------------------------------------------------------------------------------- /assets/QQ20180901-235855.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180901-235855.png -------------------------------------------------------------------------------- /assets/QQ20180903-225014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180903-225014.png -------------------------------------------------------------------------------- /assets/QQ20180903-230222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180903-230222.png -------------------------------------------------------------------------------- /assets/QQ20180903-230836.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180903-230836.png -------------------------------------------------------------------------------- /assets/QQ20180903-233427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180903-233427.png -------------------------------------------------------------------------------- /assets/QQ20180903-234353.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20180903-234353.png -------------------------------------------------------------------------------- /assets/QQ20190706-214738.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190706-214738.jpg -------------------------------------------------------------------------------- /assets/QQ20190706-214950.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190706-214950.jpg -------------------------------------------------------------------------------- /assets/QQ20190714-225057.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190714-225057.jpg -------------------------------------------------------------------------------- /assets/QQ20190824-163127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190824-163127.jpg -------------------------------------------------------------------------------- /assets/QQ20190824-163454.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190824-163454.jpg -------------------------------------------------------------------------------- /assets/QQ20190824-163537.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190824-163537.jpg -------------------------------------------------------------------------------- /assets/QQ20190824-172818.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190824-172818.jpg -------------------------------------------------------------------------------- /assets/QQ20190824-173151.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20190824-173151.jpg -------------------------------------------------------------------------------- /assets/QQ20211106-200859.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/QQ20211106-200859.png -------------------------------------------------------------------------------- /assets/WX20180813-234952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/WX20180813-234952.png -------------------------------------------------------------------------------- /assets/WX20190704-230424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/WX20190704-230424.png -------------------------------------------------------------------------------- /assets/WX20190708-230906.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/WX20190708-230906.png -------------------------------------------------------------------------------- /assets/jian-kong-wei-du.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/jian-kong-wei-du.png -------------------------------------------------------------------------------- /assets/radial_gradient_varied.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/assets/radial_gradient_varied.png -------------------------------------------------------------------------------- /bai-mao-zi-jiang-web-sao-miao.md: -------------------------------------------------------------------------------- 1 | # 白帽子讲Web扫描 2 | 3 | # 第5章 4 | 5 | ## 5.1 安全漏洞审计三部曲 6 | 7 | 安全漏洞分类 8 | 9 | 1. 通用型漏洞: 例如SQL注入漏洞、XSS跨站漏洞、命令执行注入或者文件包含漏洞等 10 | 2. NDay/0Day: 具有针对性, 通常是指某一类具体应用, 比如Discuz的SQL注入和OpenSSL的心脏出血等 11 | 12 | tips: Nday表示厂商已发布漏洞补丁, 而0Day指厂商未发布修复补丁的漏洞 13 | 14 | -------------------------------------------------------------------------------- /bai_mao_zi_jiang_web_an_quan.md: -------------------------------------------------------------------------------- 1 | #白帽子将Web的安全 2 | 3 | # 0 总结 4 | 5 | 算是比较仔细的读前6章 6 | 7 | 后面挺多服务端的章节都跳过去,因为我是个Jser 8 | 9 | 一般找洞刚开始是个比较枯燥的活,后面的很多洞现在应该也不太好使,但是关键是思路 10 | 11 | 我更倾向于着手当前比较流行的洞,有实践练习,可能会好点 12 | 13 | 总体评价3.5星(满5) 14 | 15 | 总页数432 16 | 17 | # 1. 基础 18 | 19 | 安全三要素 20 | 21 | 1. 机密性 22 | 2. 完整性 23 | 3. 可用性 24 | 25 | # 3. 跨站脚本攻击(xss) 26 | 27 | ## 3.1 XSS简介 28 | 29 | XSS根据效果不同分类 30 | 31 | 1. 反射型XSS 32 | 33 | 需要引诱用户点击一个恶意链接,链接上的参数对页面逻辑处理有影响 34 | 2. 存储型XSS 35 | 36 | 把恶意的javascript存储在数据库 37 | 38 | 加以开启HTTPOnly 39 | 40 | 成功获取XSS漏洞后 41 | 42 | 可以`帮`用户发出GET/POST请求 43 | 44 | 可以通过JS画出登录框....从而获取用户的账号密码...... 45 | 46 | 可以通过 visited属性判断用户是否浏览过某些网站 47 | 48 | location.hash不会被服务器记载,能很好的达到隐藏的功能 49 | 50 | ## 3.3 XSS的防御 51 | 52 | ### 3.3.1 四两拨千斤: HTTPOnly 53 | 54 | 可以针对某一key开启HttpOnloy 55 | 56 | ### 3.3.2 输入检查 57 | 58 | 过滤黑名单 59 | 60 | 前后端共同校验 61 | 62 | ### 3.3.3 输出检查 63 | 64 | 相应的html转义方法 65 | 66 | ``` 67 | & -> & 68 | < -> < 69 | > -> > 70 | " -> " 71 | ' ->  //不建议&aops; 72 | / -> / //以防闭合HTML entity 73 | 74 | ``` 75 | 76 | 1. PHP有htmlentities和htmlspecialchars 77 | 2. javascript有JavascriptEncode 78 | 79 | ### 3.3.5 处理富文本 80 | 81 | 遵循白名单而非黑名单 82 | 83 | 例如富文本肯定不包含 iframe script base form等 84 | 85 | 我们应该尽量使用白名单`a img div span`等比较`安全的标签` 86 | 87 | php腿脚使用的XSS Filter 88 | 89 | 90 | # 4 跨站点请求伪造(CSRF) 91 | 92 | ## 4.3 CSRF的防御 93 | 94 | ### 4.3.1 验证码 95 | 96 | 最有效的防御CSRF 97 | 98 | ### 4.3.2 Referer Check 99 | 100 | 验证referer 101 | 102 | 但是例如HTTPS跳到HTTP,出于安全原因,浏览器不会发Referer 103 | 104 | 这个方法可以辅助防止CSRF,就是有的时候验证,没有的话,让其走其他通道 105 | 106 | ### 4.3.3 Anti CSRF Token 107 | 108 | ### 4.3.3.1 CSRF的本质 109 | 110 | CSRF攻击的成功: 重要参数都被攻击者猜测到 111 | 112 | 一般的token都是放在隐藏的input或者session当中 113 | 114 | ### 4.3.3.2 Token使用原则 115 | 116 | 1. 切勿放在url上,或者发出的所有请求(img),很大几率把url放在refer泄露 117 | 2. 有XSS的情况下,CSRF形同虚设 118 | 119 | # 5. 点击劫持 120 | 121 | 点击劫持的前提 122 | 123 | 1. 流氓运营商 124 | 2. 钓鱼网址 125 | 126 | ## 5.1 什么是点击劫持 127 | 128 | 使用一个不可见的全屏的元素覆盖在网页上(就是一般黄色网址都有的,点击先跳过去一个游戏网页之类的) 129 | 130 | 还可以通过点击劫持打开摄像头哦...不过浏览器一般都会访问权限 131 | 132 | 133 | ## 5.6 防御ClickJacking 134 | 135 | ### 5.6.2 X-FRAMT-Options 136 | 137 | 这个我觉得防止运营商插入的iframe广告还有点用..因为运营商一般放iframe广告比较多,,敢点击劫持的还是少数 138 | 139 | 当值为 140 | 141 | 1. DENY: 阻止任何FRAME 142 | 2. SAMEORIGIN: 同域 143 | 3. ALLOW-FROM: 定义允许frame加载的网页标签 144 | 145 | # 6 HTML5安全 146 | 147 | ## 6.1 HTML5新标签 148 | 149 | ### 6.1.2 iframe的sandbox 150 | 151 | HTML5为iframe添加了sanbox属性,其value可选(多选)有 152 | 153 | 1. allow-same-origin: 允许同源访问 154 | 2. allow-top-navigation: 允许访问顶层窗口 155 | 3. aloow-forms: 允许提交表单 156 | 4. allow-scripts: 允许执行脚本,但有些还是不允许的,例如弹出窗口 157 | 158 | ### 6.1.3 Link Types: noreferrer 159 | 160 | 给a/area标签可以添加rel='noreferer' 161 | 162 | 这样跳转页面时,不会带referer 163 | 164 | ### 6.1.4 Canvas妙用 165 | 166 | 可以用这个能破解简单的验证码 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /base_-farewell.md: -------------------------------------------------------------------------------- 1 | # 最好的告别 -- 关于衰老和死亡,你必须知道的常识 2 | 3 | # 总结 4 | 5 | 这本书主要讲述一个个善终和严格医疗的例子,最后几章,深刻的表名作者的亲身记录 6 | 7 | 能给予人较多对于死亡的新看法 8 | 9 | 评分4: (248页) 10 | 11 | # 自序: 一介凡夫,医生也许都想错了 12 | 13 | 应该如何优雅的跨越生命的终点?大多数人缺少观念,而只是把命运交给医学、技术或者陌生人来掌控 14 | 15 | 生的愉悦和死的坦然都将成为生命圆满的标志 16 | 17 | # 1. 活到100岁的代价 18 | 19 | 与其说老年人丧失传统的地位和控制权,不如说他们分享了新的地位和控制权, 20 | 21 | 现代化并没有降低老年人的地位,而是降低了家庭的地位 22 | 23 | # 2. 接受变老这件事 24 | 25 | 脚才是老年人真正的危险 26 | 27 | 医生的工作是维护病人的生活质量 28 | 29 | # 3. 依赖-我们为老做好准备了吗 30 | 31 | 高龄人告诉我,他们最害怕的不是死亡,而是那之前的种种状况--丧失听力、记忆力,失去最好的朋友和固有的生活方式 32 | 33 | # 4. 帮助- 适应从家到老人院生活的转变 34 | 35 | 年龄大了以后,人们交往的人减少,交往对象主要是家人和老朋友,他们把注意力放在了存在上,而不是做事上 36 | 37 | 关注当下,而不是未来 38 | 39 | 斯坦福的劳拉·卡斯滕森研究表明: 人们根本没有随着年龄变大而变得不开心,而是随着年岁增长,快乐程度提高,他们比年轻时更少焦虑、压抑和愤怒 40 | 41 | 生活是一项技能.老年的平静和智慧是在时间历程中实现的 42 | 43 | 当我逐渐恢复,开始能够认识到我离死神有多近之后,我对什么事情更重要有了非常不同的看法. 44 | 45 | 重要的是存在于我生活中的其他人. 46 | 47 | 我才21岁,以前我每一个念头都是: 下一步做什么?如何才能成功?我能找到完美的灵魂伴侣吗? 48 | 49 | 卡斯滕森: 我们如何使用时间可能取决于我们觉得自己还有多少时间 50 | 51 | 但随着你的视野收缩,当你开始觉得未来有限的、不确定的时候,你的关注点开始转向此时此地,放在了日常生活的预约和最亲近的人身上. 52 | 53 | 当生命的脆弱性凸显出来时,人们的日常生活目标和动机会彻底改变 54 | 55 | 即便死亡的威胁使我们重新对欲望加以排序,但这些欲望也并非不能满足 56 | 57 | # 5. 更好的生活-抗击疗养院的三大瘟疫 58 | 59 | 唯一让死亡并非毫无意义的途径,就是把自己视为某种更大的食物的一部分: 家庭、社区和社会. 60 | 61 | 生活中最好的事情就是能自己去卫生间 62 | 63 | 使老年生活有意义是一种新思路.所以,这笔仅仅使老人安全需要更多的想象力和创见 64 | 65 | 我们终于迈进了这样一个时代,在这个时代,越来越多的人认识到他们的工作不是以安全的名义限制人们的选择,而是以过有价值生活的名义扩大选择的范围. 66 | 67 | # 6. 什么时候努力医治,什么时候放弃治疗 68 | 69 | 标准医疗和善终护理的区别并不是治疗和无所作为的区别,而是优先顺序不同 70 | 71 | 善终服务试图提供一种死亡方式的新范式 72 | 73 | 那些接受的人在为我们这个时代展示一种死亡艺术 74 | 75 | 不仅仅是抗击痛苦,同时也是抗击医学治疗看似不可阻挡的势头 76 | 77 | 只要不去努力活的更长,才能够活的更长 78 | 79 | # 7. 艰难的谈话-为迎接生命的终点谋求共识 80 | 81 | 本章大部分在讲述作者父亲应对癌症的过程 82 | 83 | 作者家人是如何一步步艰难的做出现在看来是正确的决定 84 | 85 | 但是后面决定放疗,这看来是一个错误的决定,因为有很多副作用,而且肿瘤变大了 86 | 87 | 临床医生唯一害怕犯的错误就是做得太少. 88 | 89 | 大多数医生不理解在另一个方向上也可以犯同样可怕的错误--做得太多对一个生命具有同样的毁灭性 90 | 91 | 善终服务是一个不错的选择,记住食用药量,并且一定不要摔跤. 92 | 93 | 把今天过得最好、而不是为了未来牺牲现在 94 | 95 | 本章很好的诠释一个孩子对待父母衰老的感受 96 | 97 | # 8. 勇气--最好的告别 98 | 99 | 一个人生命走到尽头的时候,也就是做决定的责任转移到另一个人身上的时候. 100 | 101 | # 尾声 三杯恒河水-思考死亡是为了活得更好 102 | 103 | 104 | -------------------------------------------------------------------------------- /beirf_history_of_humankind.md: -------------------------------------------------------------------------------- 1 | # 人类简史 2 | 3 | # 0 总结 4 | 5 | 这本书会用历史的一些理性来总结人类的规则,至今还受用,但是有些地方,在论述的时候,我觉得有点啰嗦了 6 | 7 | 评分: 4分,总页数430 8 | # 1. 人类: 一种也没什特别的动物 9 | 10 | 1. 大约在135亿年前: 宇宙大爆炸,物理学特征开始生成 11 | 2. 大约38亿年前: 在地球上,有分子结合起来,形成有机体,生物学开始形成 12 | 3. 大约250万年前: 人类开始在东非演化 13 | 4. 大约在7万年前: 现在智人开始发展处新的语言技能,能八卦数小时 14 | 5. 大约在一万年前,人类开始左上农业革命 15 | 6. 公元前3000~公元前500年间,各国开始发表出能完整表达意思的文字 16 | 17 | 18 | # 2. 知善恶树 19 | 20 | 即使到了今天,人类团体还是受150这个神奇的数字影响,只要在150人以下,不论是社群、公司、社会网络还是军事单位,只要靠着大家互相认识,彼此互通消息,都能运作顺畅 21 | 22 | 如果没有发生基因的突变,它们的社会行为就不会有显著的改变 23 | 24 | # 3. 亚当和夏娃的一天 25 | 26 | 自从采集时代以来,智人的脑容量其实是逐渐减少的,因为到了农业和工业时代,只要肯挑水和当个生产线的工人,就能活下来,并把自己那些平庸的基因传下去 27 | 28 | 像是现在 29 | 30 | 1. 如果在血汗工厂工作,每天早上7点就得出门,走过饱受污染的街道,进到工厂用同一种方式不断的操作通一台机器,时间长达10小时,叫人心灵麻木,还得再洗碗,洗衣服. 31 | 2. 在3万年前,如果是个采集者,大约早上8点钟离开部落,在附件的森林和草地上晃晃,采采蘑菇,挖挖根茎,抓抓青蛙,偶尔躲躲老虎,但是到中午过后,就可以回部落煮午餐,还有大把时间聊聊八卦,讲讲故事,和孩子玩,或者放松放松 32 | 33 | 历史的很多猜测,都无法验证 34 | 35 | # 4. 毁天灭地的人类洪水 36 | 37 | 人类离开亚非大陆后,到达各个地方都会带来很多物种的灭绝 38 | 39 | # 5. 史上大骗局 40 | 41 | 儿童死亡率增高,但人口快速增加,人类已经回不去以前的采集时代 42 | 43 | 有的牛刚出生就被困在身体大小的笼子了,为了不让他走路,使牛肉更加鲜嫩 44 | 45 | # 6. 盖起金字塔 46 | 47 | 1. 想象建构的秩序神神与真实世界结合 48 | 2. 想象建构的秩序塑造了我们的欲望 49 | 3. 想象建构的秩序存在于人和人之间的思想的连接 50 | 51 | # 7. 记忆过载 52 | 53 | 阿拉伯数字其实是印度人发明的,因为当时阿拉伯在攻打印度 54 | 55 | # 8. 历史从无正义 56 | 57 | 独立宣言说人人平等 58 | 59 | 但是 还是区分 60 | 61 | 1. 男女: 男性从中获得,女性被剥夺权利 62 | 2. 白人,黑人,印度安人: 让白人享受自由民主 63 | 64 | 女人一般比男人更能抵抗饥饿,疾病和疲劳 65 | 66 | # 9. 历史的方向 67 | 68 | # 10. 金钱的味道 69 | 70 | 金钱的价值只存在于我们共同的想象当中 71 | 72 | 金钱正是有史以来最普遍也是最有效的互信系统 73 | 74 | # 11. 帝国的愿景 75 | 76 | 统治你们,是为了你们好 77 | 78 | # 12. 宗教的法则 79 | 80 | 金钱和帝国之外,宗教正是第三种让人类统一的力量 81 | 82 | 苦行憎以阿特曼的观看看待这个世界,认识到从永恒的角度来看,所有世俗的欲望和恐惧都如梦幻泡影 83 | 84 | 宗教一般都有个共同的特征: 相信的都是神灵或者超自然对象 85 | 86 | 而中国的道教和儒教则不是,他们信仰的是自然法则 87 | 88 | 释迦牟尼体会到一切苦难并非来自噩运、社会不公或是神zhi的任性,而是出于每个人自己心中的思想模式 89 | 90 | 在事物带来快乐或者痛苦的时候,重点是看清四五的本质,而不是着重在它带来的感受. 91 | 92 | # 13. 成功的秘密 93 | 94 | 科学革命 95 | 96 | # 14. 发现自己的无知 97 | 98 | 公元1500年,全球智人只有5亿,而现在已经达到了70亿(人口增加14倍,生产增加240倍,消耗能量增加115倍) 99 | 100 | # 15. 科学与帝国的联姻 101 | 102 | 1969年7月20日,尼尔·阿姆斯特朗和伯兹·艾德林踏上了月球表面 103 | 104 | # 16. 资本主义教条 105 | 106 | 精美的金融家A,开设了一家银行 107 | 108 | 建筑承包商B刚完成了一大案子,赚了100万,然后把100万存入A的银行 109 | 110 | 经验不足的面包师傅C小姐,想开店,问A银行借了100万 111 | 112 | A银行给了100万支票C小姐,C请承包商B盖面包店,正好也是需要100万 113 | 114 | B就拿着这100万存入A银行 115 | 116 | 然后施工期间,100万不够,C小姐需要问A银行再借100万给承包商B 117 | 118 | 这样B户口有300万 119 | 120 | 而银行实际一直只有100万 121 | 122 | 根据美国银行法 这种作业还可以再重复7次 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 | # 17. 工业的巨轮 157 | 158 | 火药到大炮,经过了600年 159 | 160 | 爱因斯坦E=m(c平方),过了40年,原子弹就落在了广岛和长崎,核电厂也遍布全球 161 | 162 | 内燃机,不够一个世纪就改变了运输方式 163 | 164 | 这个世界缺的不是资源,而是能够驾驭并转换符合我们所需要的知识 165 | 166 | 猪的智商和好奇心在哺乳动物里数一数二,可能只低于巨猿 167 | 168 | # 18. 一场永远的革命 169 | 170 | 为什么战争最近比较难出现 171 | 172 | 1. 战争的成本大幅上升 173 | 2. 有了核武器后,超级大国之间如果再开战,无疑集体自杀 174 | 3. 战争不再有利可图,和平却是划算的生意 175 | 4. 全球政治文化有了结构性大变动 176 | 177 | # 19.从此过着幸福快乐的日子 178 | 179 | 智人虽然获得了空前的成就,但几乎赔上所有其他动物的命运 180 | 181 | 疾病会短期降低人的幸福感,但除非病情不断恶化,或是症状带有持续、让人无力的疼痛,或者疾病不会造成长期的不快 182 | 183 | 高兴无关无知,是身体的激素 184 | 185 | 一农民建筑好了房子和富商住上高科技房子的高兴程度是一致的 186 | 187 | 只要你不揭穿中世纪人民相信来世,那么他们会比现在人对于死亡来得更快乐 188 | 189 | # 20. 智人末日 190 | 191 | 三种方式让智慧设计取代自然选择 192 | 193 | 1. 生物工程 194 | 2. 仿生工程 195 | 3. 无机生命工程 196 | 197 | 198 | -------------------------------------------------------------------------------- /bian_cheng_shi_zhan.md: -------------------------------------------------------------------------------- 1 | # 编程实战 2 | 3 | ##1. 避免双重求值 4 | 5 | 标准动态执行代码方法 6 | 7 | ```javascript 8 | var num_1 =5, 9 | num_2 = 6; 10 | ``` 11 | 12 | 1. eval() 13 | 14 | ```javascript 15 | result = eval ("num_1 + num_2"); 16 | ``` 17 | 2. Function() 构造函数 18 | 19 | ```javascript 20 | sum = new Function("arg1","arg2","return arg1 +arg2"); 21 | ``` 22 | 3. setTimeout() 23 | 24 | ```javascript 25 | setTimeout("sum = num_1 + num_2",100); 26 | ``` 27 | 4. setInterval() 28 | 29 | ```javascript 30 | setInterval("sum = num_1 + num_2",100); 31 | ``` 32 | 因为在执行一段`javascript`代码时去执行另外一个`javascript`代码,会导致双重求值的性能消耗. 33 | 34 | 尽可能不用eval和Function,setTimeout和setInterval建议使用匿名函数. 35 | 36 | ##2. 使用Object/Array直接量 37 | 38 | ```javascript 39 | var my_object =new Object(); 40 | my_object.name ='404_K'; 41 | 42 | var my_array =new Array(); 43 | my_array[0] = 1; 44 | my_array[1] = 2; 45 | ``` 46 | 47 | 使用直接量. 48 | 49 | ```javascript 50 | var my_object = { 51 | 'name' : '404_K' 52 | }; 53 | 54 | var my_array = ['1',2]; 55 | ``` 56 | 57 | ##3 避免重复工作 58 | 59 | 1. 别做无关紧要的工作 60 | 2. 别重复做已经完成的工作. 61 | 62 | 最常见的重复工作为浏览器判断, 63 | 64 | ```javascript 65 | function add_handler(target,event_type,handler){ 66 | if(target.addEventListener){ //DOM2 Events 67 | target.addEventListener(event_type,handler,false); 68 | } else { //IE 69 | target.attachEvent("on" +eventType,handler); 70 | } 71 | } 72 | 73 | function remove_handler(target,event_type,handler){ 74 | if(target.removeEventListener){ 75 | target.removeEventListener(event_type,hanlder,false); 76 | }else { 77 | target.detachEvent("on"+eventType,handelr); 78 | } 79 | } 80 | ``` 81 | 82 | 每次运行方法都熬做方法的判断 83 | 84 | 解决办法 85 | 86 | 1. 延迟加载 87 | 88 | 在函数被调用前,没有必要判断用哪种方式执行. 89 | 90 | ```javascript 91 | function add_handler(target,evnet_type,handler){ 92 | if(target.addEventListener){ 93 | add_handler = function(target,event_type,handler){ 94 | target.addEventListener(evenet_type,handler,false); 95 | } 96 | }else { 97 | add_handler = function(target,event_type,handler){ 98 | target.attachEvent("on"+event_type,handler); 99 | } 100 | } 101 | 102 | return add_handler(target,event_type,handler); 103 | } 104 | ``` 105 | 这里就第一次执行add_handler去判断该如何操作. 106 | 2. 条件预加载 107 | 108 | 和延迟加载类似,不过判断条件是提前执行的,以保证每次执行该函数的速度一致. 109 | 110 | ```javascript 111 | var add_handler = document.body.addEventLister ? 112 | function(target,event_type,handler){ 113 | target.addEventLister(event_type,handler,false); 114 | } : 115 | function(target,evnet_type,handler){ 116 | target.attachEvent("on"+evenet_type,handler); 117 | } 118 | ``` 119 | 120 | ##2. 位操作 121 | 122 | `javascript`中的数字都依照IEEE-754标准以64位格式存储,在位操作中,数字被转换为有符号的32位格式 123 | 124 | ```javascript 125 | var num_1 =25 126 | alert(num_2.toString(2));//会忽略最高位的0 127 | ``` 128 | 129 | 逻辑操作符 130 | 131 | 1. 按位与 & 132 | 2. 按位或 | 133 | 3. 按位异或 ^ (两个操作数的对应位只有一个为1,则该位为1) 134 | 4. 按位取反 ~ 135 | 5. `<<` 136 | 6. `>>` 137 | 7. 无符号右移 138 | 139 | 140 | 1. 判断奇偶 141 | 142 | ```javascript 143 | if(i%2)... 144 | if(i&1)... //优化 145 | ``` 146 | 2. 位掩码 147 | 148 | 处理存在多个布尔选项的情形,思路为使用单个数字的每一位来判断是否选项成立.掩码中的每个选项的值都等于2的幂. 149 | 150 | ```javascript 151 | var OPTION_A = 1; //1 152 | var OPTION_B = 2; //10 153 | var OPTION_C = 4; //100 154 | 155 | //定义可选项 156 | var options =OPTION_A | OPTION_C; // 101 157 | if(options & OPTION_A){ // 101 & 001 158 | ... 159 | } 160 | ``` 161 | 162 | ##3. 使用原生方法. 163 | 164 | 了解`Math`对象 165 | 166 | 另外一个就是CSS选择器`querySelector()`和`querySelectAll()` 167 | 168 | ##总结 169 | 170 | 1. 避免使用eval(),Function(),setTimeout()和setInterval()使用匿名函数 171 | 2. 尽量直接量创建数组和对象 172 | 3. 避免重复检测操作 173 | 4. 尽量使用Math.,既javascript原生代码. 174 | -------------------------------------------------------------------------------- /bian_xie_ke_ce_shi_de_javascript_dai_ma.md: -------------------------------------------------------------------------------- 1 | # 编写可测试的JavaScript 2 | 3 | # 0.总结 4 | 5 | 这本书 前面几章 专门讲单元测试的时候还不错 6 | 7 | 后面的内容就有点老旧了..没太多粗发到G点 8 | 9 | 评分 3 总页数(246) 10 | 11 | # 1. 可测试的JavaScript 12 | 13 | ..... 14 | 15 | # 2. 复杂度 16 | 17 | 复杂度代表糟糕,简单代表美好 18 | 19 | 衡量复杂度: JSLint,圈复杂度,代码行数,扇入和扇出 20 | 21 | 我们会花费50%的时间在调试和测试我们的代码 22 | 23 | 认识问题是解决问题的第一步,了解项目的复杂度问题所在,然后一个个解决 24 | 25 | 代码尽量减少 26 | 27 | 函数最好保持读写分离 28 | 29 | 圈复杂度是表示代码中独立现行路径的数量 30 | 31 | ```javascript 32 | function sum(a, b) { 33 | if (typeof(a) !== typeof(b)) { 34 | throw new Error('Cannot sum different types!'); 35 | } else { 36 | return a + b ; 37 | } 38 | } 39 | ``` 40 | 这里的话圈复杂度为2 41 | 42 | 有人说: 任何方法的圈复杂度都不应该大于10 43 | 44 | 可以使用jscheckstyle && Jenkins把圈JS文件的圈复杂度计算出来 45 | 46 | 如果发现代码被编写了两遍,就应该抽取出来了 47 | 48 | ## 2.5 扇出 49 | 50 | 过程A的扇出是表示过程A的内部流程数量与过程A所更新的数据结构数量之和. 51 | 52 | 下次操作当做一个内部流程 53 | 54 | 1. 如果A调用B 55 | 2. 如果B调用A,并且A返回一个B随后可以利用的值 56 | 3. 如果C调用A和B,且A的返回值传递给B 57 | 58 | ## 2.6 扇入 59 | 60 | 过程A的扇入是过程A的内部流程数量与欲从过程A中获取信息的数据结构数量之和 61 | 62 | ## 2.7耦合 63 | 64 | 1. 内容耦合: 例如外部对象O被其他对象修改,耦合分数为5 65 | 66 | ```javascript 67 | O.property = 'blah'; 68 | O.method = function(){}; 69 | ``` 70 | 2. 公共耦合: 两个对象共享另外一个全局变量,耦合分数为4 71 | 3. 控制耦合: 用参数来设置外部对象,耦合分数为3 72 | 4. 印记耦合: 向外部对象传递一个记录,而只使用该记录的一部分,耦合分数为2 73 | 5. 数据耦合: 一个对象传递给另一个对象消息数据,而没有传递控制外部对象的参数时. 74 | 6. 无耦合 75 | 76 | 代码审查时查找代码耦合一个很好的方法 77 | 78 | YUIdocjs 可以转注释为HTML 79 | 80 | 81 | # 3. 基于事件的架构 82 | 83 | 可以参考基于socket.io的样例实现 84 | 85 | npm install EventHub 86 | 87 | 启动 npm start EventHub 88 | 89 | # 4. 单元测试 90 | 91 | 最难编写的的单元是第一个单元测试 92 | 93 | 测试框架最重要的是将测试聚合到测试套件和测试用例当中 94 | 95 | 一个模块的所有测试归类到一个单独的测试套件当中 96 | 97 | 一个好的单元测试最重要的是隔离和作用域 98 | 99 | ## 4.3 编写好的单元测试 100 | 101 | ### 4.3.1隔离 102 | 103 | 104 | 单元测试测试的是代码的最小部分-方法 105 | 106 | # 5. 代码覆盖率 107 | 108 | # 6. 集成测试、性能测试、负载测试 109 | 110 | # 7. 调试 111 | 112 | 我真心不推荐进行调试 113 | 114 | # 8. 自动化 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "404k的阅读笔记", 3 | "description": "404mzk 阅读笔记", 4 | "language": "zh", 5 | "plugins": [ 6 | "tbfed-pagefooter", 7 | "github-buttons", 8 | "splitter", 9 | "anchor-navigation-ex", 10 | "anchors", 11 | "catalogue-title", 12 | "edit-link", 13 | "sitemap-general", 14 | "prism", 15 | "-highlight", 16 | "3-ba", 17 | "details" 18 | ], 19 | "pluginsConfig": { 20 | "disqus": { 21 | "shortName": "read-404mzk-com-1" 22 | }, 23 | "prism": { 24 | "css": [ 25 | "prismjs/themes/prism-okaidia.css" 26 | ] 27 | }, 28 | "3-ba": { 29 | "token": "e896671664efc07c29c08fa1f080f297" 30 | }, 31 | "tbfed-pagefooter": { 32 | "copyright":"© 404mzk", 33 | "modify_label": "http://read.404mzk.com 该文件修订时间:", 34 | "modify_format": "YYYY-MM-DD HH:mm:ss" 35 | }, 36 | "github-buttons": { 37 | "buttons": [{ 38 | "user": "mzkmzk", 39 | "repo": "Read", 40 | "type": "star", 41 | "size": "small" 42 | }, { 43 | "user": "mzkmzk", 44 | "repo": "Read", 45 | "type": "watch", 46 | "size": "small" 47 | }] 48 | }, 49 | "anchor-navigation-ex": { 50 | "showLevel": false, 51 | "associatedWithSummary": true, 52 | "mode": "float", 53 | "float": { 54 | "showLevelIcon": false, 55 | "level1Icon": "fa fa-hand-o-right", 56 | "level2Icon": "fa fa-hand-o-right", 57 | "level3Icon": "fa fa-hand-o-right" 58 | }, 59 | "pageTop": { 60 | "showLevelIcon": false, 61 | "level1Icon": "fa fa-hand-o-right", 62 | "level2Icon": "fa fa-hand-o-right", 63 | "level3Icon": "fa fa-hand-o-right" 64 | } 65 | }, 66 | "simple-page-toc": { 67 | "maxDepth": 3, 68 | "skipFirstH1": true 69 | }, 70 | "edit-link": { 71 | "base": "https://github.com/mzkmzk/Read/blob/master", 72 | "label": "Edit This Page" 73 | }, 74 | "sitemap-general": { 75 | "prefix": "http://read.404mzk.com" 76 | } 77 | 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /bootstrapshi_zhan.md: -------------------------------------------------------------------------------- 1 | # BootStrap实战 2 | 3 | -------------------------------------------------------------------------------- /cong-ling-kai-shi-xue-you-yong.md: -------------------------------------------------------------------------------- 1 | # 从零开始学游泳 2 | 3 | 在水中运动能够在不给身体带来很大负担的情况下提高体力、促进健康 4 | 5 | 无论是哪种泳姿, 最重要的都是用手和脚尽量地抱水 6 | 7 | 只有身体保持笔直伸展的姿势才能减少水的阻力 8 | 9 | 游泳时并不是将水向后方推而前进, 而是依靠中心的移动而前进 10 | 11 | # 2. 优雅舒适地游蛙泳 12 | 13 | 在进行长距离游泳时往往采用蛙泳, 而且游泳时头部可以一直露出水面 14 | 15 | 在四种姿势中, 蛙泳是最需要时间的 16 | 17 | 踢脚练习: 18 | 19 | 1. 一只手扶墙, 身体笔直, 脚跟靠近臀部、横向张开、踢出、双腿并拢 20 | 21 | 蛙泳的打退动作是利用脚掌将水向身后推。脚掌如果感觉布道水的阻力的话, 打水效果肯定不会太明显 22 | 23 | Q: 脚掌的感觉是笔者推出去还是水中滑过的感觉? -------------------------------------------------------------------------------- /cssjie_mi.md: -------------------------------------------------------------------------------- 1 | # CSS揭秘 2 | 3 | # 1. 引言 4 | 5 | 能猜想到收货不大,但是因为强迫症而读完了 6 | 7 | # 2. 背景与边框 8 | 9 | ## 2.1 半透明边框 10 | 11 | http://demo.404mzk.com/cssjiemi/01-translucent-borders.html 12 | 13 | ```css 14 | body{ 15 | background: url('./images/stone-art.jpg') 16 | } 17 | div{ 18 | border: 10px solid hsla(0, 0%, 100%, .5);; 19 | background: white; 20 | 21 | 22 | max-width: 20em; 23 | padding: 2em; 24 | margin: 2em auto 0; 25 | font: 100%/1.5 sans-serif; 26 | } 27 | .success{ 28 | background-clip: padding-box; 29 | } 30 | 31 | .error{ 32 | /* 默认border-box 所以背景background 的白在底部 看不出透明的感觉 */ 33 | /*background-clip: padding-box;*/ 34 | } 35 | ``` 36 | 37 | ![](/assets/QQ20180731-231629.png) 38 | 39 | ## 2.2 多重边框 40 | 41 | http://demo.404mzk.com/cssjiemi/02-multiple-borders.html 42 | 43 | ```css 44 | .box-shadow{ 45 | width: 100px; 46 | height: 60px; 47 | margin: 25px; 48 | background: yellow; 49 | /* offset-x offset-y blur-radius spread-radius color*/ 50 | box-shadow: 0 0 0 10px #655, 51 | 0 0 0 15px deeppink, 52 | 0 2px 5px 15px rgba(0,0,0.6); 53 | } 54 | ``` 55 | 56 | 需要注意的是 57 | 58 | 1. box-shadow是一层层的 像#655 在最里扩张半径为10 而deeplink设为15 其实只有5px的扩张半径 59 | 2. box-shadow属于外圈 即不在点击范围内 设置内嵌 需要在属性前加inset 60 | 61 | ![](/assets/QQ20180731-234152.png) 62 | 63 | ## 2.3 灵活的背景定位 64 | 65 | http://demo.404mzk.com/cssjiemi/03-background.html 66 | 67 | 实现右下角设置图标的功能 68 | 69 | ![灵活的背景定位](/assets/WX20180813-234952.png) 70 | 71 | ```css 72 | .text-box{ 73 | width: 200px ; 74 | height: 100px; 75 | padding: 10px 20px; 76 | margin: 10px; 77 | } 78 | .background-position{ 79 | background: url('./images/code-pirate.svg') no-repeat #58a bottom right; 80 | background-position: right 20px bottom 10px; 81 | } 82 | .background-origin{ 83 | background: url('./images/code-pirate.svg') no-repeat #58a bottom right; 84 | background-origin: content-box; 85 | background-position: right bottom; 86 | } 87 | .background-cale{ 88 | background: url('./images/code-pirate.svg') no-repeat #58a bottom right; 89 | background-position: calc(100% - 20px) calc(100% - 10px); 90 | } 91 | ``` 92 | 93 | 1. 最后的`bottom right`是为了防止不支持background-position设置数值的浏览器 能退化到图标在右下角 94 | 95 | ## 2.4 边框内圆角 96 | 97 | http://demo.404mzk.com/cssjiemi/04-inner-rounding.html 98 | 99 | ![边框内圆角](/assets/QQ20180814-232214.png) 100 | 101 | ```css 102 | .scheme1{ 103 | outline: .6em solid #655; 104 | box-shadow: 0 0 0 .4em #655; 105 | 106 | max-width: 10em; 107 | border-radius: .8em; 108 | padding: 1em; 109 | margin: 1em; 110 | background: tan; 111 | font: 100%/1.5 sans-serif; 112 | } 113 | 114 | .scheme2{ 115 | background: #655; 116 | padding: .6em; 117 | max-width: 12em; 118 | 119 | } 120 | .scheme2 > div { 121 | 122 | background: tan; 123 | border-radius: .8em; 124 | padding: 1em; 125 | font: 100%/1.5 sans-serif; 126 | 127 | } 128 | ``` 129 | 130 | ```html 131 |
I have a nice subtle inner rounding, don’t I look pretty?
132 | 133 |
134 |
135 | I have a nice subtle inner rounding, don’t I look pretty? 136 |
137 |
138 | ``` 139 | 140 | 用了两种方式实现边框内圆角 141 | 142 | 第一种方式用 143 | 144 | outline画外部的灰色边框 145 | 146 | 然后内部用圆角 147 | 148 | 但是会有一些间隙 149 | 150 | 用box-shadow填补 151 | 152 | 那么box-shadow应该设置多少了 153 | 154 | 现在我们的border-radio设置的是.8em 表明 是个正圆 155 | 156 | 所以边长一致, 圆心到描边角的距离为 开根号(0.8^2 + 0.8^2) 所以box-shadow 应该是 开根号(2 * (0.8^2) ) - 0.8 157 | 158 | 总结公式可为 r(根号2 - 1) 因为根号2-1 < 0.5 也可以偷懒设置为0.5 所以就是0.5 * r (r即为border-radius) 159 | 160 | 该公式也暴露了一个问题 box-shadow需要比outline宽度小, 并且 扩张半径要比(根号2 -1)r要大 才能进行填充 161 | 162 | 第二种方式就比较简单了不多说明了 163 | 164 | ## 2.5 条纹背景 165 | 166 | ```html 167 | 如果多个色标具有相同的位置, 他们会产生一个无限小的过渡区域, 168 | 169 | 过渡的起止色分别是 第一个和最右一个指定值, 从效果上看 颜色会在那个位置突然变化 170 | 171 | 而不是一个平滑的剪标过程 172 | ``` 173 | 174 | ```html 175 | 如果某个色标的位置值比整个列表中在它之前的色标位置值都要小 176 | 177 | 则该色标的位置值会被设置为它前面所有色标位置值的最大值 178 | ``` 179 | 180 | # 5. 字体排印 181 | 182 | # 7. 结构和布局 183 | 184 | ## 7.38 根据兄弟元素的数量来设置样式 185 | 186 | 想当列表中子元素的个数为4个的时候设置元素 187 | 188 | ```css 189 | li:first-child:nth-last-child(4), /* 匹配第一个元素 并且是倒数第4个元素 那就是li元素只有4个情况才能匹配上*/ 190 | li:first-child:nth-last-child(4) ~ li /* 取到第一个元素然后向后取兄弟节点*/ 191 | { } 192 | 193 | ``` 194 | 195 | 做成通用的scss就是 196 | 197 | ```css 198 | @mixin n-items($n){ 199 | &:first-child:nth-last-child(#{$n}), 200 | &:first-child:nth-last-child(#{$n} ~ &) { 201 | @content; 202 | } 203 | } 204 | 205 | /* 调用时 */ 206 | li { 207 | @include n-items(4){ 208 | xxx 209 | } 210 | } 211 | ``` 212 | 213 | 当想匹配到元素大于等于4个时 样式为A 214 | 215 | ```css 216 | li:first-child:nth-last-child(n+4), 217 | li:first-child:nth-last-child(n+4) ~ li { A } 218 | ``` 219 | 220 | 当想匹配元素小于等于4个时样式为B 221 | 222 | ```css 223 | li:first-child:nth-last-child(-n+4), 224 | li:first-child:nth-last-child(-n+4) ~ li { B } 225 | ``` 226 | 227 | # DEMO 228 | 229 | http://play.csssecrets.io/ -------------------------------------------------------------------------------- /da_xing_wang_zhan_ji_zhu_jia_gou_he_xin_yuan_li_yu.md: -------------------------------------------------------------------------------- 1 | # 大型网站技术架构核心原理与案 2 | 3 | # 1. 大型网站架构演化 4 | 5 | ## 1.4 网络架构设计误区 6 | 7 | ### 1.4.3 企图用技术解决所有问题 8 | 9 | 12306在2013年抢票为秒杀模式,这种几亿人一票难求的情况下仍然用秒杀模式,无法从技术水平上解决 10 | 11 | 从业务方面下手,购票改为分时段售票. 12 | 13 | # 2. 大型网站架构模式 14 | 15 | 建筑学的模式: 每一个模式描述一个在我们周围不断重复发生的问题以及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必重复工作 16 | 17 | ## 2.1 网站架构模式 18 | 19 | ### 2.1.1 分层 20 | 21 | 横向切分 22 | 23 | 1. 应用层: 视图和业务展示 24 | 2. 服务层: 为应用层提供服务支持 25 | 3. 数据层: 提供数据存储访问服务 26 | 27 | 分层最初为了规划软件清晰的逻辑结构,但分层结构对高并发分布式方向发展至关重要 28 | 29 | ### 2.1.2 分割 30 | 31 | 比如在应用层,将不同业务进行分割 32 | 33 | ### 2.1.3 分布式 34 | 35 | 对于大型网站,分层和分割的其中一个目的是为了切分后的模块便于分布式部署 36 | 37 | ### 2.1.4 集群 38 | 39 | 即使访问量很少的分布式应用和服务,也至少要部署两台服务器构成一个小的集群 40 | 41 | ### 2.1.5 缓存 42 | 43 | ### 2.1.6 异步 44 | 45 | 服务器可以通过多线程共享内存队列来实现异步 46 | 47 | ### 2.1.7 冗余 48 | 49 | 服务器可能出现故障,某台服务器down掉是必然事件. 50 | 51 | 要想保住服务器宕机情况下网站一人可以继续服务,不丢失数据,就需要一定程度的服务器冗余进行,数据冗余备份 52 | 53 | 访问和负载很小也必须至少部署两台服务器构成一个集群 54 | 55 | 数据库除了定期备份,存档保存,实现冷备份外,为了保证业务高可用,还需要数据库主从分离,实时同步实现热备份 56 | 57 | 为了抵御地震,海啸,还需要全球范围内部署灾备数据中心 58 | 59 | ### 2.1.8 自动化 60 | 61 | 1. 自动化代码管理: 代码版本控制、代码分支创建合并等过程自动化(打tag可以自动化,但是代码分支创建合并自动化????) 62 | 2. 自动化测试: 自动化测试并发测试报告 63 | 3. 自动化部署: 将工程代码自动部署到线上生产环境(简单理解为一键部署吧?) 64 | 4. 自动化安全检测: 安全检查工具对代码进行静态安全扫描及部署到安全测试环境进行安全攻击测试,评估其安全性. 65 | 5. 自动化监控: 对服务器进行心跳检测,对各项性能指标和应用程序的关键数据指标. 66 | 6. 自动化失效转移: 监控到有问题的服务器,自动移除出集群 67 | 7. 自动化失效恢复: 故障消除后,自动失效恢复 68 | 8. 自动化降级: 当网站到达高峰时,关闭不重要和耗时的功能,保证整个系统安全可用 69 | 9. 自动化分配资源: 必要时,还需要自动化分配资源,将空闲资源给配给重要的服务 70 | 10. 自动化性能测试: 发布部署时,可以对前端模拟加载时间和访问接口自动进行压测(笔者自己加的) 71 | 72 | ### 2.1.9 安全 73 | 74 | 1. 通信家吗 75 | 2. XSS SQL注入防范 76 | 77 | # 3 大型网站核心架构要素 78 | 79 | 架构: 最高层次的规划,难以改变的决定 80 | 81 | ## 3.1 性能 82 | 83 | 性能只是必要条件,指标有响应时间,TPS,系统性能计数器 84 | 85 | ## 3.2 可用性 86 | 87 | 网站高可用的主要手段是冗余 88 | 89 | ## 3.3 伸缩性 90 | 91 | 应用服务器,只要服务器不保存服务器,所有服务器偶读对等 92 | 93 | 缓存服务器,加入新服务器可能会导致缓存路由失效,可能会导致系统GG 94 | 95 | 关系数据库的伸缩性方案必须在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群 96 | 97 | 而大部分NoSQL是天生支持伸缩的 98 | 99 | ## 3.4 拓展性 100 | 101 | 如何设计网站的架构能快速响应业务变化,是可拓展的主要目的 102 | 103 | ## 3.5 安全性 104 | 105 | # 4 瞬时响应: 网站高性能架构 106 | 107 | ## 4.1 网站性能测试 108 | 109 | ### 4.1.2 性能测试指标 110 | 111 | >响应时间 112 | 113 | 一般的响应时间表 114 | 115 | 1. 打开一个网站: 几秒 116 | 2. 在数据库查找有索引的记录: 十几毫秒 117 | 3. 机械磁盘一次寻址定位: 4毫秒 118 | 4. 从机械磁盘顺序读取1MB数据: 2毫秒 119 | 5. 从SSD顺序读取1MB数据: 0.3毫秒 120 | 6. 从远程分布式缓存Redis读取一个数据: 0.5毫秒 121 | 7. 从内存中读取1MB数据: 十几微秒 122 | 8. Java本地方法调用: 几毫秒 123 | 9. 网络传输2KB数据: 1微秒 124 | 125 | >并发数 126 | 127 | 指系统能够同时处理请求的数目 128 | 129 | > 吞吐量 130 | 131 | 指单位时间内系统处理的请求数量 132 | 133 | 1. TPS: 每秒事务数 134 | 2. HPS: 每秒HTTP请求数 135 | 3. QPS: 每秒查询数 136 | 137 | > 性能计数器 138 | 139 | 主要是top的指标 140 | 141 | ## 4.3 应用服务器性能优化 142 | 143 | ### 4.3.4 代码优化 144 | 145 | >多线程 146 | 147 | 启动线程数 = [任务执行时间/(任务执行时间-IO等待时间)] X CPU内核数 148 | 149 | 注意线程安全问题 150 | 151 | 1. 将对象设计为无状态对象: 对象本身不存储状态信息(对象无成员变量或者成员变量也是无状态对象) 152 | 2. 使用局部变量: 除非故意的把对象传给其他线程 153 | 3. 并发访问资源时加使用锁: 154 | 155 | > 资源复用 156 | 157 | 1. 单例 158 | 2. 对象池 159 | 160 | # 5 万无一失: 网站的高可用架构 161 | 162 | # 6 永无止境: 网站的伸缩性架构 163 | 164 | ## 6.3 分布式缓存集群的伸缩性设计 165 | 166 | ### 6.3.2 Memcached分布式缓存集群的伸缩性挑战 167 | 168 | 简单的路由算法可以用余数Hash 169 | 170 | 用服务器数目除缓存数据KEY的Hash值 171 | 172 | 余数为服务器列表的下标编号 173 | 174 | 如果不考虑服务器集群的伸缩性,余数Hash几乎可以满足绝大多数缓存路由需求 175 | 176 | 但是 177 | 178 | 假如由于业务发展网站从三台缓存服务器扩容到四台 179 | 180 | 那么大概会有3/4被缓存的数据不能被命中 181 | 182 | 所以这种扩容抖好一般都要在访问量比较少时j进行(例如半夜) 183 | 184 | 假如在100台服务器中加入一台服务器,不能命中的概率为99% 185 | 186 | ### 6.3.3 分布式缓存的异质性Hash算法 187 | 188 | 一致性Hash算法通过一个叫做一致性Hash环的数据结构实现KEY到缓存服务器的Hash映射 189 | 190 | 具体算法过程: 先构造2^32的整数环(一致性Hash环), 根据节点名称的Hash值(其分部范围是[0, 2^32 - 1]), 将缓存服务器节点放置在这个Hash环上。 191 | 192 | 然后根据需要缓存数据的KEY值计算得到其Hash值(其范围也是[0, 2^32 - 1]), 然后在Hash环上顺时针查找距离这个Key的Hash值最近的缓存服务器节点 193 | 194 | 就完成了KEY到服务器的Hash映射查找 195 | 196 | 当服务器扩容时 只需要讲新节点插入一致性Hash环即可, 影响的只有整个环中的一小段 197 | 198 | 3台服务器扩容到4台服务器时 命中原先概率为75% 199 | 200 | 100台服务器扩容增加一台服务器 继续命中的概率为99% 201 | 202 | 具体应用中 这个长度为2^32的一致性Hash环通常使用二叉树查找实现, Hash查找的过程是在二叉查找树中找不少于查找树的最小数值。 203 | 204 | 当然这个二叉树最右边椰子节点和最左边的椰子节点相连接, 构成环 205 | 206 | 但是还有一个小问题 207 | 208 | 新加入的节点Node3只使Node1收益了, 即一部分原来要访问Node1的数据要访问Node3(概率上为50%) 209 | 210 | 但是原先的Node0和Node2不受影响, 意味着Node0和Node2缓存数据量和压力是Node1和Node3的两倍 211 | 212 | 如果四个机器的性能一样, 那么这种结果显然不是我们需要的 213 | 214 | 计算机领域有句话: `计算机的任何问题都可以通过增加一个虚拟层来解决` 215 | 216 | 做法是 将每台物理服务器虚拟为一组虚拟缓存服务器, 将虚拟服务器的Hash值放置在Hash环上, KEY在还上先 217 | 218 | 找到虚拟服务器节点,再得到物理服务器的信息 219 | 220 | 这样新加入服务器节点时, 是将一组虚拟节点加入环中, 如果虚拟节点的数组足够多, 221 | 222 | 这组虚拟节点蒋辉影响统一多数目的已经在环上存在的虚拟节点,这些已经存在的虚拟节点又对应不同的物理节点 223 | 224 | 这样最终新加一台缓存服务器, 将会较为均匀的影响原来集群中所有的服务器 225 | 226 | ## 6.4 数据存储服务器集群的伸缩性设计 227 | 228 | 和缓存服务器集群不同, 数据库存储服务器集群的伸缩性对数据的持久性和可用性提出了更高的要求 229 | 230 | 231 | 232 | ### 6.4.3 NoSQL数据库的伸缩性设计 233 | 234 | NoSQL: Not Only SQL,表示NoSQL只是关系数据库的补充,而不是替代方案 235 | 236 | # 随需应变: 网站的可拓展架构 237 | 238 | 239 | 240 | 241 | -------------------------------------------------------------------------------- /dan_yuan_ce_shi_de_yi_zhu.md: -------------------------------------------------------------------------------- 1 | # 单元测试的艺术 2 | 3 | #0. 总结 4 | 5 | 1~2章介绍的是单元测试的基本概念 6 | 7 | 3~6在教你如何测试 8 | 9 | 7~8教你怎么写好代码 10 | 11 | 9: 鸡汤 12 | 13 | 10: 对付遗留代码 14 | 15 | 11: 好好设计代码吧 16 | 17 | #1. 入门 18 | 19 | 优秀单元测试的特性 20 | 21 | 1. 自动化,可重复执行 22 | 2. 很容易实现 23 | 3. 以后还有意义 24 | 4. 任何人都能一键运行 25 | 5. 速度很快 26 | 6. 独立于其他测试的运行 27 | 7. 如果它失败了,能快速定位问题 28 | 29 | 什么是集成测试 30 | 31 | 依赖到一个或多个真实依赖物,例如真实的系统时间,真实的文件系统,真实的数据库. 32 | 33 | 单元测试和集成测试的区别 34 | 35 | 集成测试会使用真实依赖物,而单元测试则把被测试单元和其以来无隔离开. 36 | 37 | 单元测试要点 38 | 39 | 1. 测试的命名 测试的可维护性 测试的可读性 40 | 2. 该成果的时候成果,该失败的时候失败 41 | 42 | # 2 第一个单元测试 43 | 44 | 测试的命名 45 | 1. UnitOfWork_Scenario_ExpectedBehavior 46 | 2. UnitOfWork: 被测试的方法、一组方法或者一组类 47 | 3. Scenario: 测试进行的假设条件 48 | 4. ExpectedBehavior: 在测试场景指定的条件下,你对呗测试方法行为的预期 49 | 50 | 单元测试主要的三个行为 51 | 52 | 1. 准备(Arrange)对象,创建对象,进行必要的设置 53 | 2. 操作(Act)对象 54 | 3. 断言(Assert) 某件事情的预期 55 | 56 | # 3 使用存根破除依赖 57 | 58 | 存根跟模拟对象的区别是: 两者类似,但是我们需要对模拟对象进行断言,而不会对存根进行断言 59 | 60 | 这里主要是为了烂代码去写更多的代码去实现测试,感觉会本末倒置 61 | 62 | 使用IOC可优好的测试. 63 | 64 | 同意赞同重构代码,使其易于测试 65 | 66 | # 4 使用模拟对象进行交互测试 67 | 68 | ## 4.1 基于值测试,基于状态测试,和交互测试 69 | 70 | 伪对象、存根、模拟对象的区别 71 | 72 | 1. 伪对象指模拟对象/存根 73 | 2. 如果伪对象用于检测一个交互,这个伪对象为模拟对象,否则为存根 74 | 75 | ## 4.2 模拟对象和存根的区别 76 | 77 | 模拟对象和存根的根本区别: 存根永远不会导致测试失败,而模拟对象可以 78 | 79 | 这个作者也是醉了.. 80 | 81 | 第三、四章说完就说这两有缺陷,,这抛砖引玉...好啊......擦.. 82 | 83 | # 5 隔离(模拟)框架 84 | 85 | 麻鸡... 86 | 87 | #6 深入了解隔离框架 88 | 89 | ##6.2 优秀隔离框架的价值 90 | 91 | 提高测试健壮性的功能 92 | 93 | 1. 递归伪对象 94 | 2. 对行为和验证默认忽略参数 95 | 3. 非严格验证和行为 96 | 4. 大范围伪造 97 | 98 | # 7. 测试层次和组织 99 | 100 | # 7.4将测试类映射到源代码 101 | 102 | 1. 集成测试和单元测试必须分块 103 | 2. 将每个待测试类对应一个测试类 104 | 3. 当某个方法需要特别多的测试,新建对应的一个测试类 105 | 106 | ## 7.6 为应用程序构建测试API 107 | 108 | ### 7.6.3 把你的API介绍给开发人员 109 | 110 | 1. 偶尔结对编程,一带一 111 | 2. 准备小文档/速查表 112 | 3. 在团队会议上讨论API变更 113 | 4. 新人入职带过文档 114 | 5. 进行测试审查 115 | 116 | #8 优秀单元测试的支柱 117 | 118 | 优秀测试 119 | 120 | 1. 可靠 121 | 2. 可维护 122 | 3. 可读 123 | 124 | ## 8.1编写可靠测试 125 | 126 | ### 8.1.2避免测试中的逻辑 127 | 128 | 单元测试不应该有任何 switch if else for等语句 129 | 130 | 如果第一个断言失败了,你还会关心下一个断言的结果吗?如果会,就把它分为两个单元测试 131 | 132 | ## 8.2 编写可维护的测试 133 | 134 | ### 8.2.4 实施测试隔离 135 | 136 | 测试中的臭味道 137 | 138 | 1. 强制的测试顺序 139 | 2. 隐藏的测试调用 140 | 3. 共享状态损坏: 测试共享内存里的状态,却没有状态回滚 141 | 4. 外部共享状态损坏: 集成测试共享资源,却没有回滚资源 142 | 143 | # 9 在组织中引入单元测试 144 | 145 | 这里一看就是一碗鸡汤,就看你干不干 146 | 147 | ## 9.1 变成倡导者 148 | 149 | ### 9.1.1 准备面对质疑 150 | 151 | 回答自己最难的问题 152 | 153 | ### 9.1.2 找到支持者和反对者 154 | 155 | 支持者: 教他们回答问题 156 | 157 | 反对者: 请他们参与其中的一些细节,切记不要告诉他们,他们哪里做得不好 158 | 159 | ### 9.1.3 找到可能的切入点 160 | 161 | 1. 选择较少团队 162 | 2. 经验少的一般愿意接受变革,经验多且墨守成规的,你很难改变他们,所以找一个技术经理愿意变革,且团队成员经验较浅的团队 163 | 3. 经常性代码审查,要面对面的审查 164 | 4. 自下而上 165 | 166 | 167 | ##9.2 成功之道 168 | 169 | ### 9.2.4 使进度可见 170 | 171 | ### 9.2.5 设置具体目标 172 | 173 | ## 9.3 失败原因 174 | 175 | ### 9.3.3 不好的实现和第一印象 176 | 177 | 你自己要把整体的布局想好了,才开始实施,自己必须要牛逼,不然自己也不咋懂,就开始瞎弄,可能会丢掉以后的机会 178 | 179 | ### 9.3.4 缺少团队的支持 180 | 181 | 你应该逐个交谈,并回答他们的尖锐问题 182 | 183 | 这章主要讲心理学和人际交往学 184 | 185 | 主要考虑一下6个影响因素 186 | 187 | 1. 个人能力: 你真正掌握这门技术吗 188 | 2. 个人动机: 这个人把事情做对了吗,遇到困难能坚持吗 189 | 3. 社会能力: 你是否给这个人提供帮组,在关键时刻 190 | 4. 社会动机: 这个人周围的人是否鼓励正确的行为,反对你的人能否体现出其正确的行为 191 | 5. 组织能力: 是否存在坏境因素,使其方便的提供帮助 192 | 6. 组织动机: 如果你做了正确/错误的事情,能得到预期的回报吗 193 | 194 | ## 9.5 质疑和回答 195 | 196 | ### 9.5.6 我们有大量没有测试的代码: 应该从哪里开始 197 | 198 | 20%的代码包含80%的bug,从这里开始吧 199 | 200 | # 10. 遗留代码 201 | 202 | ## 10.3 在重构前编写集成测试 203 | 204 | 有些代码无法单元测试 205 | 206 | 1. 进行集成测试 207 | 2. 重构 208 | 3. 逐一单元测试 209 | 210 | ##10.5 总结 211 | 212 | 要了解各个组件的依赖书和逻辑量,初学者可以先对最简单的进行测试 213 | 214 | # 11.设计与可测试性 215 | 216 | 好的代码是可以测试的 -------------------------------------------------------------------------------- /dombian_cheng.md: -------------------------------------------------------------------------------- 1 | # DOM编程 2 | 3 | 浏览器独自实现JS和DOM 4 | 5 | IE中.分别存在`jscript.dll` & `mshtml.dll` 6 | 7 | 为什么DOM会慢 8 | 9 | 因为分开实现,之间通过接口访问.之间需要`过桥费` 10 | 11 | ##1. 优化建议 12 | 13 | 1. 谨慎使用循环操作DOM 14 | 15 | 因为这个过桥费,所以谨慎使用循环. 16 | 17 | 若DOM操作有顺序,先放在一个字符串里,汇总完后再一次修改DOM. 18 | 19 | 2. `innerHTML` & `createElement` 20 | 21 | 在旧浏览器中`innerHTML`比`标准DOM操作(document.createElement())`快 22 | 23 | 现代浏览器相差无几,甚至有点反超. 24 | 25 | 3. 节点`clone` 26 | 27 | 先`createElement`好所需元素. 28 | 29 | 在循环中`clone` 30 | 4. HTML集合优化 31 | 32 | 1. document.getElementByName(); 33 | 2. document.getElementsByClassName(); 34 | 3. document.getElementsByTagName(); 35 | 4. document.images; 36 | 5. document.links; 37 | 6. document.forms; 38 | 7. document.forms[0].elements 39 | 40 | 以上方法军返回HTML集合对象,非数组,因为没有`push()`和`slice()`等方法,可以根据索引获取对象和length获取长度 41 | 42 | 建议如果频繁操作HTML集合,可转换为数组. 43 | 44 | 避免在for循环中使用HTML集合.length因为每次都会重新计算. 45 | 46 | 尽量采用局部变量,但要用到对象成员时. 47 | ```javascript 48 | function K(){ 49 | var coll document.getElementsByTagName('div'), 50 | len = coll.length, 51 | name ='', 52 | el =null; 53 | for(var count =0;countli->a`,要把所有的a链接改为ajax更新页面. 210 | 211 | ```javascript 212 | document.getElementByID('ul_ID').onclick =function (e){ 213 | //IE6/7/8中会采取后面的方式获得全局事件对象.. 214 | e = e || window.event 215 | 216 | var pageid,hrefparts; 217 | //获取触发事件的元素 后者还是为了兼容IE. 218 | var target = e.target || e.srcElement; 219 | 220 | if(target.nodeName !=='A'){ 221 | return ; 222 | } 223 | 224 | //作者应该默认网页为../id.html 225 | //从链接找到页面ID 226 | hrefparts =target.href.splict('/'); 227 | pageid =hrefparts[hreparts.length-1]; 228 | //把.html去掉.. 229 | pageid = pageid.replace('.html',''); 230 | 231 | ajaxRequets('xhr.php?page='+id,updatePageContent); 232 | 233 | 234 | if(typeof e.preventDefault == 'function'){ 235 | //阻止浏览器默认行为 跳转页面 236 | e.preventDefault(); 237 | //阻止事件冒泡&捕获 238 | e.stopPropagation(); 239 | }else { 240 | e.returnValue =false; 241 | e.cancelBubble =true; 242 | } 243 | } 244 | ``` 245 | 246 | ##总结 247 | 248 | 1. 尽量减少DOM访问次数,尽可能在JS解决,然后采取操作DOM 249 | 2. 使用HTML最好把它放到数组里. 250 | 3. 动画中使用绝对定位. 251 | 4. 使用事件委托,减少绑定数量. 252 | 253 | 254 | 255 | -------------------------------------------------------------------------------- /effectivejavascriptbian_xie_gao_zhi_liang_javascri.md: -------------------------------------------------------------------------------- 1 | # EffectiveJavaScript编写高质量JavaScript的68方法 2 | 3 | # 第零章 总结 4 | 5 | 其实这本书,可能可读性相对较差 6 | 7 | 第二章说作用域和第四章说原型的时候,相对感兴趣一点 8 | 9 | 其他的话,可能笔者在实践中基本也不会这么写,也就没怎么细读了 10 | 11 | 总体感觉3点5星吧(满5) 12 | 13 | # 第一章 让自己习惯JavaScript 14 | 15 | ## 第3条 当心隐式的强制转换 16 | 17 | 验证一个值是否是真正的NaN 18 | 19 | isNaN不能判断是否为真的NaN 20 | 21 | ```javascript 22 | 23 | var x = NaN 24 | isNaN(x)//true 25 | isNaN('foo')//true 26 | ``` 27 | 28 | 验证是否为真的NaN....怪异的来了 29 | 30 | ```javascript 31 | function isReallyNaN(x) { 32 | return x!==x 33 | } 34 | ``` 35 | 36 | ## 第5条 避免对混合类型使用==运算符 37 | 38 | 对于类型转换 39 | 40 | 1. Date对象会先尝试toString再尝试valueOf 41 | 2. 非Date就会先尝试valueOf再尝试toString 42 | 43 | ## 第6条 了解分号插入的阶段 44 | 45 | 1. 仅在"}"标记之前,一行的结束和程序的结束处推导分号 46 | 2. 仅在紧接着的标记不能被解析时推导分号 47 | 3. 在以`( [ + - /`字符开头的语句前决不能省略分号 48 | 4. 当脚本连接时,在脚本之间显式地插入分号 49 | 5. 在return throw break continue ++ --参数之前决不能换行 50 | 6. 分号不能作为for循环的头部或空语句的分隔符而被推导出 51 | 52 | # 第二章 变量作用域 53 | 54 | ## 第8条 尽量少用全局对象 55 | 56 | 先这样写,以后再调整.虽然会比较方便 57 | 58 | 但是优秀的程序员会不断留意程序结构,持续地归类相关的功能以及分离不相关的组件,并将这些行为作为变成过程中的一部分 59 | 60 | 使用全局对象来做平台特性检测 61 | 62 | ## 第12条 理解变量声明提升 63 | 64 | 把变量理解为两个部分 声明和赋值 65 | 66 | ```javascript 67 | function k (){ 68 | 69 | ... 70 | if (...) { 71 | var a = 2 72 | } 73 | } 74 | 75 | //等效于 76 | 77 | function k (){ 78 | var a; 79 | ... 80 | if (...) { 81 | a = 2 82 | } 83 | } 84 | 85 | ``` 86 | 87 | ## 第16条 避免使用eval创建局部变量 88 | 89 | 如果eval函数代码可能创建全局变量,将此调用封装到嵌套函数中以防止作用域污染 90 | 91 | ```javascript 92 | var y = 'global' 93 | function test(src) { 94 | eval(src); 95 | return y 96 | } 97 | 98 | test('var y = local') //local 99 | 100 | //防止域污染 101 | var y = 'global' 102 | function test(src) { 103 | (function(){eval(src);})() 104 | return y 105 | } 106 | 107 | test('var y = local') //global 108 | 109 | ``` 110 | 111 | # 第17条 间接调用eval优于直接调用 112 | 113 | 114 | 直接调用eval,编译器需要确保执行程序具有完全访问调用者作用域的权限,我们可以通过间接调用令eval失去所有局部作用域的访问能力 115 | 116 | ```javascript 117 | var x = 'global' 118 | function test() { 119 | var x = 'local' 120 | var f = eval 121 | return f('x') 122 | } 123 | 124 | test()//global 125 | 126 | 127 | ``` 128 | 129 | 还有一些奇怪的代码可以实现这种方案 130 | 131 | (0,eval)(src) 132 | 133 | 0被求值被忽略掉了,括号表示的序列表达产生的结果是eval函数,但是其没有访问作用域的能力 134 | 135 | # 第三章 使用函数 136 | 137 | ## 第23条 永远不要修改arguments对象 138 | 139 | 永远不要修改arguments对象 140 | 141 | 使用 [].slice.call(arguments)将arguments对象复制到一个真正的数组中再进行修改 142 | 143 | 144 | 145 | # 第四章 对象和原型 146 | 147 | ## 第30条 理解prototype getPrototypeOf和__proto__之间的不同 148 | 149 | 1. C.prototyoe: 用于建立由new C()创建的对象原型 150 | 2. Object.getPrototypeOf(obj): ES5获取obj对象原型的标准方法 151 | 3. obj.__proto__: 获取obj对象的原型非标准方法 152 | 153 | ```javascript 154 | function User(){} 155 | var u = new User() 156 | Object.prototype(u) === User.prototype 157 | ``` 158 | 159 | ## 第33条 使构造函数和new无关 160 | 161 | ```javascript 162 | function User(){ 163 | this.name = 'k' 164 | } 165 | 166 | var u = User() 167 | u //undefiend 168 | this.name//k 169 | ``` 170 | 171 | 这样不适用new的情况下 172 | 173 | this默认为全局,而在严格模式下 this为undefined 174 | 175 | 所以在webpack+babel打包class的时候检查一下使用class时 是否用了new 176 | 177 | ```javascript 178 | 179 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 180 | 181 | var KReport = function () { 182 | function KReport() { 183 | _classCallCheck(this, KReport); 184 | } 185 | 186 | ``` 187 | 188 | 只有使用new的时,this才会变为构造函数的实例 189 | 190 | 当然也有措施使使用了new和没使用new变得一样 191 | 192 | ```javascript 193 | function User(name) { 194 | var self = this instanceof User 195 | ? this 196 | : Object_create(User.prototype) 197 | self.name = name 198 | return self 199 | } 200 | 201 | //兼容不支持Create的浏览器 202 | if(typeof Object.create === 'undefined') { 203 | Object.create = function(prototype) { 204 | function C() {} 205 | C.prototype = prototype 206 | return new C() 207 | } 208 | } 209 | 210 | 211 | ``` 212 | 213 | # 第五章 数组和字典 214 | 215 | ## 第44条 使用null原型防止原型污染 216 | 217 | 218 | ```javascript 219 | function C(){} 220 | C.prototype = null 221 | 222 | var o = new C() 223 | Object.getPrototypeOf(o) === null //false 224 | Object.getPrototypeOf(o) === Object.prototype //true 225 | 226 | ``` 227 | 228 | 以上这样还是已object.prototype为原型 229 | 230 | ES5提供了一个真正的null原型 231 | 232 | ```javascript 233 | 234 | var x = Object.create(null) 235 | Object.getPrototypeOf(x) === null //true 236 | Object.getPrototypeOf(x) === Object.prototype //false 237 | ``` 238 | 239 | # 第六章 类和API设计设计 240 | 241 | ## 第60条: 支持方法链 242 | 243 | 通过在无状态的方法中返回新对象来支持方法链 244 | 245 | 通过在有状态的方法中返回this来支持方法链 246 | 247 | 248 | 249 | # 第七章 并发 250 | 251 | ## 第68条 使用promise模式清洁异步逻辑 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 | -------------------------------------------------------------------------------- /fan_qie_gong_zuo_fa_tu_jie.md: -------------------------------------------------------------------------------- 1 | # 番茄工作法图解 2 | 3 | # 1. 一次只做一件事情 4 | 5 | 开始之前 6 | 7 | 要想做到专注,你就得坚决抛开各种杂念 8 | 9 | 每想到一件事越做越复杂-填入计划外紧急 10 | 11 | 头脑被各种想法占据-填入计划外紧急 12 | 13 | 流程管理,纸上谈兵: 跟踪全天工作流程的真实数据,这些数据用于每日回归,改进第二天的流程,可以先开始记录简单的中断数和完成番茄数 14 | 15 | 什么是番茄工作法: 当初当天的事情, 设置25分钟, 然后从第一件事开始, 此外还要每日回顾、每日承诺、 控制中断、预估要花的功夫等 16 | 17 | 没想到一件事越做越复杂, 在活动进行中 经常会有一些次要任务产生出来, 这属于计划外紧急, 然后再接再厉, 完成主要活动, 这部分与`定性评估有关` 18 | 19 | 20 | # 2. 背景 21 | 22 | 基础 23 | 24 | 进入好整以暇、正襟危坐、全神贯注的姿势 25 | 26 | 作息不规律的人往往更容易迷茫和焦虑 27 | 28 | 通过执行一套相同的动作和准备程序,可以使大脑自我调整,进入执行某类事物的最佳状态 29 | 30 | 例如训练自己一开始番茄钟, 就会进入专注模式 31 | 32 | 联想机器: 33 | 34 | 长期记忆的信息通常以语义形式存储 35 | 36 | 一天以后再来回忆,延迟回忆更容易记住不同语义的词语 37 | 38 | 可视化技术比如思维导图,是理清联想脉络、服务长期记忆的极佳工具 39 | 40 | 拖延 三种情况导致拖延 41 | 42 | 1. 被强迫 43 | 2. 自己要求完美 44 | 3. 害怕犯错 45 | 46 | 拖延会暂时缓解你的压力,但请记住,压力来自内部,而治疗的良方是找到项目的起跑线 47 | 48 | 调整过程 49 | 50 | 专注工作的过程中,应当只对相关指标做记录,定期会议/回顾,才是专门用来分析调整的场合 51 | 52 | # 3. 方法 53 | 54 | 计划 55 | 56 | 1. 活动清单 57 | 2. 今日待办(中断次数,质量,评分) 最后期限 权重 58 | 59 | 当人类心智能量的投入获得成功的结果时,人们会得到满足 60 | 61 | 25分钟,后休息的最低标准 62 | 63 | 站起来,从我办公椅走开,至少两步远 64 | 65 | 然后确定继续同一项活动还是切换到另一项 66 | 67 | 在休息期间,思考上一个番茄或下一个番茄都是不允许的 68 | 69 | 阶段性休息 70 | 71 | 最好将4个番茄钟作为一组,每组过后进行15~30分钟的消遣 72 | 73 | 可以收拾下桌子啊,逛下咖啡吧啊,或者到社交网站转转 74 | 75 | 已完成活动 76 | 77 | 可以进行过度学习,回顾和重复刚所做的 78 | 79 | 记录和处理 80 | 81 | 结束了一天的工作,要马上进入记录阶段 82 | 83 | 此时此地 84 | 85 | 每天要有一个承诺 86 | 87 | 一个番茄钟 一个活动 一个目标 88 | 89 | 在番茄钟里 重要的不是整个活动何时完成, 而是你有没有尽力去完成任务 90 | 91 | 92 | # 4. 中断 93 | 94 | 通过评估有多少计划外(U)标记,计划外紧急有多少活动,能评估自己的计划能力 95 | 96 | # 5. 预估 97 | 98 | 活动清单表格中的评估 99 | 100 | 承诺是番茄工作法的核心 101 | 102 | 活动规模 103 | 104 | 大于7个番茄,建议分开 105 | 106 | 少于1时,可以设为0,待会把几个0合并为1 107 | 108 | 当出现一个任务番茄不够用时,可以在不够用时再度设置番茄 109 | 110 | 活动规划中 尽量不超过10天的规划, 这会扰乱军心 111 | # 6. 应变 112 | 113 | 至少应该有两周来适应变化,看是否合适 114 | 115 | # 7. 团队 116 | 117 | -------------------------------------------------------------------------------- /feng_kuang_html5__css3__javascript.md: -------------------------------------------------------------------------------- 1 | # 疯狂Html5/CSS3/JavaScript 2 | 3 | -------------------------------------------------------------------------------- /front/pwd-kai-fa-shi-jian.md: -------------------------------------------------------------------------------- 1 | # PWA开发实践 2 | 3 | ## 3. CacheStorage API 4 | 5 | ### 3.6 匹配每个请求的正确响应 6 | 7 | > ignoreSearch 8 | 9 | 在我们进行html请求缓存的时候, 因为html可以携带了N多参数 10 | 11 | 假如缓存的key是`/promo.html`, 那么请求的url是`/promo.html?test=1` 则会找不到缓存 12 | 13 | 如果确定参数对html内容无影响的话, 可以进行忽略参数的查找`Cache` 14 | 15 | `caches.match(event.request, { ignoreSearch, true })` 16 | 17 | ## 4. Service worker生命周期及缓存管理 18 | 19 | installing -> installed/waiting -> activating -> activated -> redundant 20 | 21 | 当 installing 失败时也会 22 | 23 | installing -> redundant 24 | 25 | > installing 26 | 27 | 使用`navigator.serviceWorker.register`注册一个新的service worker时,  28 | 29 | js代码就会被下载、解析、进入安装状态, 安装成功后 就进入installed状态 30 | 31 | 假如安装失败, 则直接进入redundant 32 | 33 | 安装过程中可以使用`waitUntil(promise)`, 进行延伸 34 | 35 | ```javascript 36 | self.addEventListener('install', function(event){ 37 | event.waitUntil(promise) 38 | }) 39 | ``` 40 | 41 | 则会等待promise返回resolver才进入`installed` 42 | 43 | > installed/waiting 44 | 45 | service worker安装完成后, 就会进入installed状态 46 | 47 | 一般情况下会立马进入activating状态, 除非另一个activating的service worker依然在控制页面, 48 | 49 | 那么installed的service worker 就会进入waiting状态 50 | 51 | > activating 52 | 53 | 在sw激活和接管应用之前, 会触发activate事件, 同样可以用event.waitUntil进行扩展 54 | 55 | 一旦sw激活了, 就可以监听功能性事件了, 例如`fetch事件` 56 | 57 | sw只能在页面开始加载之前控制页面, 58 | 59 | `如果页面在sw激活前就已经开始加载`, 则sw是不能够控制页面的 60 | 61 | 一个sw的生命周期中, 安装和激活只会运行一次 62 | 63 | ### 4.2 service worker的声明周期与waitUntil的重要性 64 | 65 | 一旦sw安装并激活, 会发生什么呢? 66 | 67 | 因为sw不是直接绑定在任何标签页/窗口上, 并且可以随时响应事件, 它是否意味着它一直在运行呢? 68 | 69 | 答案是否定的, 这样浏览器会很卡 70 | 71 | 代替的方案是: sw的生命周期直接与它所处理的事件的执行联系在一起, 当某个sw作用域下的时机被触发, sw就会被唤起 72 | 73 | 然后处理事件, 然后终止 74 | 75 | 但是假如事件被唤起执行时, 执行了个异步方法, 但没进行event.waitUntil, 异步事件就不会执行 76 | 77 | 所以异步事件, 需要用event.waitUntil包裹 78 | 79 | ```javascript 80 | self.addEventListener('push', function(event){ 81 | event.waitUntil(function(){ 82 | fetch('updates') 83 | .then(() => { 84 | return self.registration.showNotification('new updates') 85 | }) 86 | }) 87 | }) 88 | ``` 89 | 90 | ### 4.3 更新service worker 91 | 92 | 每当页面加载一个激活的sw, 就会检查sw脚本的更新 93 | 94 | 如果sw在注册之后发生了更改, 新的sw就会被注册和安装 95 | 96 | 安装完成后不会立即替换到现有的sw 97 | 98 | 屙屎需要sw作用域中的每个标签页/窗口关闭, 或者导航到一个不再其控制范围内的页面. 99 | 100 | 只有在当前激活的sw控制的页面全部被关闭后, 旧的sw才会进入废弃状态 101 | 102 | 然后新的sw才会激活 103 | 104 | ### 4.4 为什吗需要管理缓存 105 | 106 | 建议每一个sw存取/读取的缓存都加一个版本号, 避免新旧sw操作同一个缓存 107 | 108 | 但我们也需要把之前的缓存给清除掉, 不然很快存储会达到上限 109 | 110 | 一般操作是在sw里增加`active`事件监听, 在里面清除旧缓存 111 | 112 | ### 4.6 重用已缓存的响应 113 | 114 | 当我们知道有些url内容是用久不变的, 就可以copy旧缓存到新缓存里 115 | 116 | ### 4.7 配置服务器以提供正确的响应头部 117 | 118 | 在sw文件里每次加载都会检查, sw的缓存建议1~10分钟 119 | 120 | ## 5.拥抱离线优先 121 | 122 | ### 5.2 常用的缓存模式 123 | 124 | > 仅缓存 125 | 126 | 在缓存中读取请求, 若缓存无法找到, 则请求失败 127 | 128 | > 缓存优先, 网络作为回退方案 129 | 130 | 现在缓存中取, 网络没有sw再去网络中取回 131 | 132 | > 仅网络 133 | 134 | > 网络优先, 缓存作为回退方案 135 | 136 | > 先缓存, 后网络 137 | 138 | 先使用缓存结果, 当网络结果回来了进行结果对比, 不一样则替换 139 | 140 | ### 5.3 混合和匹配: 创造新模式 141 | 142 | - 按需缓存 143 | - 缓存优先, 网络作为回退方案, 并且频繁更新缓存 -------------------------------------------------------------------------------- /front/shen-ru-li-jie-svg.md: -------------------------------------------------------------------------------- 1 | # 深入理解SVG 2 | 3 | ## 序 4 | 5 | - 仓库源码:https://github.com/oreillymedia/SVG_Colors_Patterns_Gradients 6 | - 仓库示例:http://oreillymedia.github.io/SVG_Colors_Patterns_Gradien -------------------------------------------------------------------------------- /fu_wu_qi_duan.md: -------------------------------------------------------------------------------- 1 | # 服务器端 2 | 3 | -------------------------------------------------------------------------------- /gao_xing_neng_wang_zhan_jian_she_zhi_nan.md: -------------------------------------------------------------------------------- 1 | # 高性能网站建设指南 2 | 3 | 这本书可能对于现在的我并没有什么用,可能多百万级网站会有用点.现节点没有吸收太多. 4 | 5 | 2分 6 | 7 | ##1. 请求头 8 | 9 | 1. `If-Modified-Since` 值为缓存的最后修改时间,即:浏览器说:我拥有组件的一个版本,这是它最后的修改时间,可以修改他吗,最后修改时间为该资源缓存时服务器响应的`Last-Modified`,如果组件自生成时间就没变过,服务器会返回一个`304 Not Modified`,服务器将不发生响应体. 10 | 2. `` 11 | 12 | ##2. 响应头 13 | 14 | 1. `Content-Encoding ` 若值为gzip,则表明服务器已压缩. 15 | 2. `Last-Modified ` 值为响应资源的最后修改时间. 16 | 3. `Expries` 值为时间,该资源到该资源过期前,都不会发送请求. 17 | 4. `Cache-Control :max-age=` 表示缓存多少s,会覆盖`Expries`. 18 | 5. 19 | 20 | ##3. 减少HTTP请求 21 | 22 | 1. CSS Sprite 23 | 2. 合并CSS/JS 使用Sass和grunt/gulp等 24 | 25 | 26 | ##4. 使用CDN 27 | 28 | ##5. 使用LINK标签将样式表放在文档的HEAD中 29 | 30 | ##6. 将脚本放在``前 31 | 32 | ##7 压缩CSS和JS 33 | 34 | ##8 避免重定向 35 | 36 | 有些网站通过301跳出到内部其他网站,然后通过301统计跳出数量,替代方案:Referer 37 | 38 | -------------------------------------------------------------------------------- /google75026bf2fa85c633.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google75026bf2fa85c633.html -------------------------------------------------------------------------------- /graphql-xue-xi-zhi-nan.md: -------------------------------------------------------------------------------- 1 | # GraphQL学习指南 2 | 3 | # 第三章 GraphQL查询语言 4 | 5 | 用公开GraphQL API查询学习 6 | 7 | 例如github 8 | 9 | - 在线查询 https://developer.github.com/v4/explorer/ 10 | - Schema下载链接: https://docs.github.com/en/free-pro-team@latest/graphql/overview/public-schema 11 | 12 | # 第四章 设计schema 13 | 14 | 在设计新API之前, 应该要统筹, 讨论并确定下来类型(type)的集合 15 | 16 | schema优先是一种设计方法论 17 | 18 | 后端团队清楚存储和交付的数据, 前端团队拥有了构建页面时锁需要的结构大纲 19 | 20 | 前后端无需互相等待, 所有人可以立即开始工作 21 | 22 | ### 标量类型 23 | 24 | GraphQL内置的标量类型(Int, Float, String, Boolean, id)非常有用 25 | 26 | 我们也可以自定义标量类型, 然后定义规则的保证字段值正确 27 | 28 | 例如有公共库 https://github.com/stylesuxx/graphql-custom-types 29 | 30 | 实现了比较常见的标量类型 31 | 32 | ``` 33 | scalar DateTime 34 | 35 | type Photo { 36 | created: DateTime! 37 | } 38 | ``` 39 | 40 | ### 枚举 41 | 42 | 限定一个值的可选类型 43 | 44 | ``` 45 | enum PhotoCategory { 46 | SELECT 47 | PORTRAIT 48 | ACTION 49 | LANDSCAPE 50 | GRAPHIC 51 | } 52 | ``` 53 | 54 | 使用 55 | 56 | ``` 57 | type Photo { 58 | category: PhotoCategory! 59 | } 60 | 61 | ### 联合类型 62 | 63 | 例如计划表中 有锻炼和学习 64 | 65 | ``` 66 | query schedule { 67 | agenda { 68 | ... on Workout { 69 | name 70 | reps 71 | } 72 | ... on Study { 73 | name 74 | subject 75 | 76 | } 77 | } 78 | } 79 | ``` 80 | 81 | ``` 82 | union AgendaItem = Workout | Study 83 | 84 | type Study { 85 | name: String! 86 | subject: String! 87 | } 88 | 89 | type Workout { 90 | name: String! 91 | reps: Int! 92 | } 93 | 94 | 95 | type Query { 96 | agenda: [AgendaItem!]! 97 | } 98 | ``` 99 | 100 | ### 接口 101 | 102 | 有相同特种的对象类型 103 | 104 | 实现着必须实现接口的所有属性 105 | 106 | ``` 107 | query schedule { 108 | agenda { 109 | name 110 | start 111 | end 112 | ... on Workout { 113 | reps 114 | } 115 | } 116 | } 117 | ``` 118 | 119 | ``` 120 | scalar DataTime 121 | 122 | interface AgendaItem { 123 | name: String! 124 | start: DateTime! 125 | end: DateTime! 126 | } 127 | 128 | type Study implements AgendaItem { 129 | name: String! 130 | start: DateTime! 131 | end: DateTime! 132 | participants: [User!]! 133 | topic: String! 134 | } 135 | 136 | type Workout implements AgendaItem { 137 | name: String! 138 | start: DateTime! 139 | end: DateTime! 140 | reps: Int! 141 | } 142 | 143 | type Query { 144 | agenda [AgendaItem!]! 145 | } 146 | 147 | ``` 148 | 149 | 何时用联合, 何时用抽象 150 | 151 | 联合: 多个无关系的对象, 但有时需要在一个字段表示 152 | 153 | 接口: 有共同特征的对象, 需要再一个字段表示 154 | 155 | 156 | -------------------------------------------------------------------------------- /han-shu-shi-bian-cheng-si-7ef45c.md: -------------------------------------------------------------------------------- 1 | # 函数式编程思维 2 | 3 | # 0. 总结 4 | 5 | 这本是前3章还是挺有意思了,后面可能也挺有意思,不过笔者在函数式的实践较少的原因,还没能吸收 6 | 7 | 书中后面也有例子,不过看不太懂... 8 | 9 | 总分3.5 (146) 10 | 11 | # 1. 为什么 12 | 13 | 1. 简介 14 | 15 | # 2. 转变思维 16 | 17 | 函数式三板斧 18 | 19 | 1. 筛选: filter 20 | 2. 映射: map 21 | 3. 折叠: reduce 22 | 23 | # 3. 权责让渡 24 | 25 | 理解掌握的抽象层次永远要比日常使用的抽象层次更深一层 26 | 27 | # 4. 用巧不用蛮 28 | 29 | 这里讲了很多缓存值的语法和作用 30 | 31 | 但是作为一个jser,觉得还离挺远.... 32 | 33 | # 5. 演化的语言 34 | 35 | 100个函数操作一种数据结构,要好过10个函数操作10种数据结构的组合 36 | 37 | # 6. 模式和重用 38 | 39 | 没咋看懂 40 | 41 | .... 42 | 43 | # 7. 现实应用 44 | 45 | 实现一个不可变的java类 46 | 47 | 1. 所有字段标记为final 48 | 2. 把类编辑为final, 防止子类覆盖 49 | 3. 不要提供无参数的构造器 50 | 4. 提供至少一个构造器: 构造器是我们在对象里添置状态的最后机会! 51 | 5. 除了构造器外, 不要提供任何制造变化的方法 52 | 53 | # 8. 多语言和多范式 54 | 55 | 正交: 如果两个组件没有互相影响 -------------------------------------------------------------------------------- /he-qiu-xie-yi-qi-xue-ppt.md: -------------------------------------------------------------------------------- 1 | # 和秋叶一起学PPT 2 | 3 | # 1. 哪里才能找到好的图 4 | 5 | ## 1.2 别忽略PPT中的字体 6 | 7 | 有衬线字体: 线条粗细不同, 更适合小字号使用, 投影时清晰度不高(serif sansa seif 宋体) 8 | 9 | 无衬线字体: 线条粗细相同, 更适合大字号使用, 投影时更美观(微软雅黑) 10 | 11 | 传统英文正文阶段, 衬线字体带来更加的可读性, 因为增加了其阅读时对文字的视觉参照 12 | 13 | 传统的中文正文阶段, 衬线会给人严肃的感觉, 所以比较推荐无衬线字体 14 | 15 | PPT里: 文不如字, 字不如表, 表不如图 16 | 17 | 去http://www.zcool.com.cn/ 搜PPT找灵感 18 | 19 | # 读感 20 | 21 | 感觉这本书没啥节奏, 例如第一章, 不应该如何提炼大纲, 然后在实现大框的时候, 才教别人如何找材料吗 -------------------------------------------------------------------------------- /html5_canvas.md: -------------------------------------------------------------------------------- 1 | # HTML5 Canvas 2 | 3 | # 1.HTML5 Canvas简介 4 | 5 | 这章就是扯了下蛋,讲了几个demo. 6 | 7 | 比平常用定时器,设定动画效果 8 | 9 | 更优的做法为 10 | 11 | ```javascript 12 | window.requestAnimFrame = ( 13 | function(){ 14 | return window.requestAnimationFrame || 15 | window.webkitRequestAnimationFrame || 16 | window.oRequestAnimationFrame || 17 | window.msRequestAnimationFrame || 18 | function (callback) { 19 | window.setTimeout(callback,1000/60); 20 | }; 21 | } 22 | )(); 23 | //应用时 感觉这样会爆栈? 24 | ( 25 | function animploop(){ 26 | requestAnimFrame(animploop); 27 | render(); 28 | } 29 | )(); 30 | ``` 31 | 32 | # 2. 在Canvas上绘图 33 | 34 | ##2.4 使用路径创建线段 35 | 36 | ### 2.4.1 设置路径的开始和结束 37 | 38 | 1. beginPath() 39 | 2. closePath() 40 | 41 | 当前变换矩形将影响路径中绘制的任何内容 42 | 43 | ### 2.4.2 动态绘图 44 | 45 | 1. lineCap: 定义端点 46 | 1. butt: 默认值,端点垂直于线段边缘的平直边缘 47 | 2. round: 以线宽为直径的半圆 48 | 3. square: 以线宽为长、以一般线宽为宽的矩形 49 | 50 | 2. lineJoin: 定义两条线相交产生的拐角 51 | 1. miter: 默认值,在连接处边缘延长相接 52 | 2. bevel: 连接处是一个对角线斜角 53 | 3. round: 连接处是一个圆 54 | 55 | ## 2.7简单画布变换 56 | 57 | 旋转变化等,要先把中心点用translate,然后再进行绘图和变换. 58 | 59 | 1. context.setTransform(a,b,c,d,e,f),重置并创建新的变换矩阵,再次绘制矩形. 60 | 61 | 该方法和transform的区别主要在于,setTransform不会相对于其他变换来发送行为.即执行多次相同参数,效果一直,而transform会一直效果累加 62 | 1. a: 水平旋转绘图 63 | 2. b: 水平倾斜绘图 64 | 3. c: 垂直倾斜绘图 65 | 4. d: 垂直缩放绘图 66 | 5. e: 水平移动绘图 67 | 6. f: 垂直移动绘图 68 | 2. translate: 重新映射画布在(0,0)的位置 69 | 3. rotate: 旋转当前绘图 70 | 4. scale: 缩放 71 | 72 | ## 2.8 用颜色和渐变填充对象 73 | 74 | ### 2.8.2 填充渐变形状 75 | 76 | 1. 线性渐变: 创建水平/垂直/对角线的填充图案 77 | 78 | 1. gr = ctx.createLiearGradient(x1,y1,x2,y2): 创建线性渐变 79 | 2. gr.addColorStop(0~1,颜色值) 80 | 2. 径向: 中心点散发 81 | 1. ctx.createRedialGradient(x1,y1,半径1,x2,y2,半径2) 82 | 83 | ## 2.9 用图案填充形状 84 | 85 | 1. createPattern(实体Image,重复方式repeat) 86 | 87 | ## 2.10 创建阴影 88 | 89 | 1. shadowOffsetX: x偏移量 90 | 2. shadowOffsetY: y偏移量 91 | 3. shadowBlur: 模糊程度 92 | 4. shadowColor: 颜色 93 | 94 | ##2.12 检查一个点是否在当前路径 95 | 96 | 1. isPointInpath(x,y): 判断该点是否在当前路径中 97 | 98 | #3 HTML5 Canvas的文本API 99 | 100 | ##3.1 显示基本文本 101 | 102 | ### 3.1.4 使用measureText 103 | 104 | 1. ctx.measureText('文本') 获取一个文本的宽度. 105 | 106 | #4 Canvas图像 107 | 108 | 地图绘制软件 Tiled Mappy Tile Studio 109 | 110 | 裁剪等图像处理和碰撞检测 111 | 112 | #5 数学、物理和动画 113 | 114 | 反弹球 115 | 116 | 摩擦力 117 | 118 | 圆周运动 119 | 120 | 螺旋运动 121 | 122 | 多种贝塞尔 123 | 124 | 重力 125 | 126 | 弹力 127 | 128 | 弹力+重力 129 | 130 | 缓冲 131 | 132 | Box2D框架 133 | 134 | #6 HTML5对视频的支持 135 | 136 | #7 使用音频 -------------------------------------------------------------------------------- /http.md: -------------------------------------------------------------------------------- 1 | # HTTP 2 | 3 | -------------------------------------------------------------------------------- /internet_game_technology.md: -------------------------------------------------------------------------------- 1 | # 网络游戏核心技术与实战 2 | 3 | # -1 总结 4 | 5 | 带着问题 6 | 7 | 网页游戏,如何同时同步多个玩家信息 8 | 9 | 10 | 11 | # 0 网络游戏编程 12 | 13 | # 1 网络游戏的历史和眼花 14 | 15 | ## 1.1 网络游戏的技术历史 16 | 17 | ### 1.1.9 本世纪前10年的后半期: 基于WEB浏览器的MMOG在商业上的成功 18 | 19 | # 3. 网络游戏的架构 20 | 21 | ## 3.1 游戏编程的特性--保持快速响应 22 | 23 | ### 3.1.2 将数据存放在内存中的理由 24 | 25 | 1. 游戏数据要在16毫秒这一短暂时间内持续变化 26 | 27 | ## 3.3 物理架构详解 28 | 29 | ### 3.3.1 基本的网络拓扑结构 30 | 31 | 1. 环型: 形成一个环,即使一条线路中断,还是能使用反反向的线路将信息传递给所有节点, 从一个节点到另外一个节点的平均拓扑数为所有节点数的一般 32 | 2. 线型: 33 | 3. 网状: 多个节点不规则的连接在一起 34 | 4. 星型: 多个节点连接到一个特殊的中央节点,中央节点负荷很高 35 | 5. 全网型: 所有节点互相连接,一个节点到另一个节点只需要1条线路,这种方式不适合那些线路维护成本很高的网络 36 | 6. 树型 37 | 7. 总线型: 多个节点由一条公共的总线连接 38 | 39 | ## 3.4 逻辑架构详解 40 | 41 | ### 3.4.1 MO MMO是什么--同时在线数的区别 42 | 43 | MO: 同时在线为2~100人,游戏时间相对较短 44 | 45 | MM0: 数百甚至上千,游戏通常几十个小时,而且不能充值游戏数据 46 | 47 | ### 3.4.4 同步方式/全网状结构的实现 -- 所有终端都拥有主数据 48 | 49 | 必要条件 50 | 51 | 1. 初始状态完全相同 52 | 2. 所有输入信息的数据包都确确实实的,毫无遗漏的发送到其他所有终端 53 | 3. 游戏过程数据不会随机变化(如果结果完全相同的伪随机数没问题) 54 | 4. 游戏过程数据的变化不会发生波动 55 | 56 | 要满足以上条件,需要做到 57 | 58 | 1. 伪随机数的种子在所有终端保持一致 59 | 2. 所有终端以完全相同的数据来初始化游戏 60 | 3. 循环开始 61 | 62 | 1. 所有终端开始输入信息的传输,在全部接受完成前始终处于等待状态 63 | 2. 按照玩家A~Z顺序进行处理,依次改变游戏状态 64 | 3. 渲染 65 | 4. 受理下一个操作 66 | 5. 发送自己这部分的输入信息 67 | 68 | 问题 69 | 70 | 1. 人数增加后,收发信息的完整性极易奔溃 71 | 2. 最慢的终端会拖长整体的传输时间 72 | 3. 不能中途加入游戏 73 | 74 | ### 3.4.5 同步方式/星装结构 75 | 76 | 问题 77 | 78 | 1. 响应较慢 79 | 2. 如果玩家A中途离线,游戏无法恢复,只能强行中止 80 | 3. 信息整理方面的逻辑增加时,程序的结构比全网的结构稍微复杂一些 81 | 4. 玩家A的终端上传输负荷比其他终端高出许多,不公平 82 | 83 | ### 3.4.6 异步方式--接受各终端上游戏状态的不一致 84 | 85 | 三个重要因素 自己 对手 环境 86 | 87 | ### 3.4.8 自己和对手--对战游戏和玩家之间往来数据的抽象程度 88 | 89 | 特殊情况 90 | 91 | 1. A攻击B 92 | 2. A正在发送给包给B , A这里是打中了B,但是B在包发送的同时,进行了躲避,B显示没被A打中 93 | 94 | ### 3.4.9 保持结果一致性的方法--两种覆盖方法 95 | 96 | 1. 采用造成伤害的那一方的结果 97 | 2. 采用受到攻击的那一方的结果 98 | 99 | 就是把其中一者的结果 发给对方,并强行覆盖 100 | 101 | ### 3.4.11 互斥控制的实现--采用与同步方式类似的机制来实现异步方式 102 | 103 | 例如 两个人抢炸弹,如果不做处理,可能两个人同时拿到炸弹 104 | 105 | 对这种只能一个人拿到的物品,可以通过后台确认 106 | 107 | 就是捡炸弹的同时,给后台发送一个请求,谁的请求先到达后台,则返回结果为谁拿到 108 | 109 | ### 3.4.12 状态会自动变化的环境--静态环境和动态环境 110 | 111 | 纠正动态环境的误差 112 | 113 | 1. 所有NPC的相关信息都在一个终端处理 114 | 2. 定时修正NPC位置 115 | 3. 根据某些规则将NPC分组 116 | 1. 根据仇恨值信息进行分组 117 | 118 | # 4. (实践)C/S MMO游戏开发 119 | 120 | 121 | # 6. 网络游戏的辅助系统 122 | 123 | 这里的功能很多属于常用的业务功能,觉得有点多余 124 | 125 | ## 6.2 交互/通信功能 126 | 127 | ### 6.2.4 聊天 128 | 129 | > 聊天功能的基本处理 130 | 131 | 1. cli(游戏客户端)向聊天服务器发送信息,并同时向需要的客户端发送 132 | 2. 需要在1~2秒内将信息送达需要的客户端(Push) 133 | 3. 和邮件不同,不需要给不在线的玩家发信息,所以不用保存信息 134 | 4. 服务器不需要保存用户日志 135 | 136 | -------------------------------------------------------------------------------- /javascript-dom-编程艺术第2版.md: -------------------------------------------------------------------------------- 1 | # JavaScript DOM 编程艺术(第2版) 2 | 3 | # 总结 4 | 5 | 这本书 相对比较基础,初学者可以跟着模仿一下 6 | 7 | 但是这本书我没细看,主要是写一些功能性的函数,然后讲解它,入门后,其实不太建议看这个了 8 | 9 | 不过如果跟着书自己写demo,效果应该也还可以的 10 | 11 | 评分2.5(总分5) 12 | 13 | 页数 286 14 | 15 | -------------------------------------------------------------------------------- /javascript_.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/javascript_.md -------------------------------------------------------------------------------- /javascript_design.md: -------------------------------------------------------------------------------- 1 | #javascript_设计模式 2 | 3 | # 第0章 总结 4 | 5 | 这本是读到第九章后,基本都是翻过,因为这本感觉不如曾探的设计模式 6 | 7 | 书上很多jQuery相关的还不如去深读下jQuery,而其他设计模式的说法,实属感觉不通俗易懂 8 | 9 | 总结 2.5星(241页) 10 | 11 | # 第七章 设计模式类别 12 | 13 | ## 1. 创建型设计模式 14 | 15 | 1. Constructor(构造器) 16 | 2. Factory(工厂) 17 | 3. Abstract(抽象) 18 | 4. Prototype(原型) 19 | 5. Singleton(单例) 20 | 6. Builder(生成器) 21 | 22 | ## 2. 结构型设计模式 23 | 24 | 1. Decorator(装饰器) 25 | 2. Facade(外观) 26 | 3. Flyweight(享元) 27 | 4. Adapter(适配器) 28 | 5. Proxy(代理) 29 | 30 | ## 3. 行为设计模式 31 | 32 | 1. Iterator(迭代器) 33 | 2. Mediator(中介者) 34 | 3. ObSERVER(观察者)和Visitor(访问者) 35 | 36 | # 第九章 javascript设计模式 37 | 38 | 这里列了很多设计模式 39 | 40 | 但是很多都是没说明要求,然后就写出代码,这样对理解造成困难 41 | 42 | # 第十章 javascriptMV*模式 43 | 44 | 笔者之前折腾过react ,对这种MV*模式并没啥好感 45 | 46 | # 第十一章 模块化的javascript设计模式 47 | 48 | 感觉webpack的实现比书上的好一大截 49 | 50 | # 第十二章 jQuery的设计模式 51 | 52 | 读读jQuery源码吧 53 | 54 | # 第十三章 jQuery插件设计模式 55 | 56 | 笔者对jQuery插件无感... -------------------------------------------------------------------------------- /javascriptgao-xiao-tu-xing-bian-cheng.md: -------------------------------------------------------------------------------- 1 | # JavaScript高效图形编程 2 | 3 | # 0. 总结 4 | 5 | 这里的demo很多... 6 | 7 | 不过不知道代码在哪里可以下,运行执行的效果可能会好很多 8 | 9 | 大篇幅的代码...感觉有点烦躁 10 | 11 | 这本书比较有用的是前几章教别人使用CSS DOM和canvas... 12 | 13 | 总页数232 评价(2.5) 14 | 15 | # 1. 代码的重用和优化 16 | 17 | 一些比较基本的css,dom优化 18 | 19 | # 2. DHTML基础 20 | 21 | 距离了一个控制CSS的案例 22 | 23 | # 3. 滚动 24 | 25 | 操作DOM使动画... 26 | 27 | 感觉这样的应该要淘汰了吧 28 | 29 | # 4. 高级UI 30 | 31 | 旋转木马...... 32 | 33 | # 5. JavaScript游戏介绍 34 | 35 | ### 5.2.5 碰撞检测 36 | 37 | 对页面计切成成方格 38 | 39 | 只对周围方格的对象进行检测 40 | 41 | # 6. HTML5画布 42 | 43 | ### 6.7.4 绘制直线好曲线 44 | 45 | 1. beginPath(): 开始新路径 46 | 2. moveTo(x, y): 设置路径的起始位置 47 | 3. LineTo(x, y): 定义从当前位置开始的直线 48 | 4. arc(x, y, 圆半径, 起始角度, 结束角度, 绘制弧线的方向): 定义弧 49 | 5. arcrTo(x1, y1, x2, y2, 弧度): 定义从当前位置开始的弧,方便制作直线之间的圆角 50 | 6. quadraticCureTo: 定义从当前位置开始的二次曲线 51 | 7. bezierCurveTo: 定义从当前位置开始的贝塞尔曲线 52 | 8. closePath: 结束路径 53 | 9. stroke: 勾画路径 54 | 10. fill: 填充颜色,会自动执行closePath命令 55 | 56 | `to`是命令(LineTo, bezierCurveTo) ,to命令的结束位置也定义了下一个to的开始位置,可以把to想象成在纸上连续地画线 57 | 58 | 而moveTo就是领你将笔离开纸面,从其他地方重新开始画 59 | 60 | ### 6.7.5 绘制位图图像 61 | 62 | drawImage函数可以载入图像,img标签,canvas标签或video便签 63 | 64 | api: 65 | 66 | 1. drawImage(source,x, y): 简单的把图片源复制到画布的(x,y) 67 | 2. drawImage(source,x, y, width, height): 在1的基础上 缩放图像到所需大小 68 | 3. drawImage(source, sx, sy, swidth, sheight, x, y, width, height): 2~5参数制定源图像中的源矩形块,6~9绘制画布上的目标 69 | 70 | drawImage在FF或Opera 绘制小数点的像素位置,会导致严重的性能损失 71 | 72 | 最好先 Math.floor(x) 或 (x>>0) 73 | 74 | 75 | # 7. 游戏和模拟中的向量 76 | 77 | # 8. 谷歌可视化 78 | 79 | 国人喜欢echart 80 | 81 | # 9. 使用jquery mobile为移动设备开发 82 | 83 | # 10. PhoneGap创建Android应用 84 | 85 | 86 | -------------------------------------------------------------------------------- /javascripthan_shu_shi_bian_cheng.md: -------------------------------------------------------------------------------- 1 | # JavaScript函数式编程 2 | 3 | ##0 阅读感想 4 | 5 | 1.20160423: 第一次读完这本书.我是懵逼的 6 | 7 | ## 1. JavaScript函数式编程简介 8 | 9 | 函数式编程: 通过使用函数来将值转换成抽象单元,接着用于构建软件系统 10 | 11 | 实践中的函数式编程并不以消除状态改变为主要目的,而是将任何已知系统中突变的出现尽量压缩到最小区域中去 12 | 13 | 函数式编程 14 | 15 | 1. 一个队`存在`的抽象函数的定义 16 | 2. 一个建立在存在函数智商的,对`真`的抽象函数的定义 17 | 3. 通过其他函数来使用上面的两个函数,以实现更多的行为 18 | 19 | ## 2. 一等函数与Application编程 20 | 21 | 用100个函数操作一个数据结构,要比10个函数控制10个数据结构要好 22 | 23 | 高阶函数至少会有的动作 24 | 25 | 1. 以一个函数为参数 26 | 2. 以返回一个函数作为结果 27 | 28 | 函数式编程最常用的方法 29 | 30 | 1. map: 遍历集合并对每一个值调用一个函数,返回结果的集合 31 | 2. reduce: 利用函数将值的集合合并成一个值,该函数接受一个累计值和本次处理的值 32 | 3. filter: 对集合每一个值调用一个返回boolean的函数,抽取返回true的值的集合 33 | 4. find: 接受集合和返回Boolean的函数,返回第一个为true的元素 34 | 5. reject: 与find反向查找 35 | 6. all: 接受一个集合和return Boolean的函数,全部true则最终返回true 36 | 7. any: 接受一个集合和return Boolean的函数,有一个true则返回true 37 | 8. sortBy: 接受一个集合和一个返回比较条件的函数 38 | 9. groupBy: 接受一个集合和一个条件函数,并返回一个对象,键为传入函数所返回的条件,值为与其对应的元素 39 | 40 | ```javascript 41 | var albums = [ 42 | {title: "K_title_1",genre: "Metal"}, 43 | {title: "K_title_2",genre: "Metal"}, 44 | {title: "F_Title_1",genre: "Fuck"}, 45 | ] 46 | _.groupBy(albums,function(a){ return a.genre}); 47 | //返回值为 => 48 | { 49 | Metal: [ 50 | {title: "K_title_1",genre: "Metal"}, 51 | {title: "K_title_2",genre: "Metal"}, 52 | ] 53 | Fuck: [ 54 | {title: "F_Title_1",genre: "Fuck"}, 55 | ] 56 | } 57 | 58 | ``` 59 | 10. countBy: 返回groupBy对象的结果总和数 60 | 61 | ```javascript 62 | _.countBy(alums, function(a) {return a.genre}); 63 | //=> {Metal: 2,Fuck: 1} 64 | ``` 65 | 11. keys: 获取所有key 66 | 12. values: 获取所有value 67 | 13. pluck: 获取指定字段 68 | 14. omit: 筛选不要的字段 69 | 15. pick: 获取要的指定的一个/多个字段 70 | 16. findWhere: 可指定多个字段的值,筛选出第一个与之对应的值 71 | 17. where: 与findWhere泪水,但返回所有符合的值 72 | 73 | ## 3.变量的作用域和闭包 74 | 75 | ### 3.1 全局作用域 76 | 77 | 没用var声明/在顶级的变量都是全局变量 78 | 79 | ### 3.2 词法作用域 80 | 81 | 词法作用域值一个变量的可见性,及其文本表示的模拟值. 82 | 83 | ### 3.3 动态作用域 84 | 85 | 谁调用的,谁就是this 86 | 87 | ### 3.4 函数作用域 88 | 89 | 函数内的var不能被外部访问 90 | 91 | ### 3.5闭包 92 | 93 | 闭包: 闭包就是一个函数,捕获作用域内的外部绑定(例如: 不是自己的参数),这些绑定是为了之后(即使在该作用域已结束)使用而被定义的 94 | 95 | 最简单的闭包 96 | 97 | ```javascript 98 | function whatWasTheLocal(){ 99 | var CAPTURED ="oh hai"; 100 | 101 | return function() { 102 | return "The local was: "+ CAPTURED; 103 | } 104 | } 105 | var reportLocal = whatWasTheLocal(); 106 | reportLocal(); //"The local was oh hai" 107 | ``` 108 | 109 | 简单地说: 在调用完whatWasTheLocal后,还能使用她内部定义的变量 110 | 111 | 自由变量是指能通过闭包比外部访问的变量. 112 | 113 | 闭包作用: 闭包允许你在创建函数时做一些配置 114 | 115 | 例如 116 | 117 | ```javascript 118 | function createScaleFunction(FACTOR) { 119 | return function(v) { 120 | return _.map(v.function(n)) { 121 | return (n * FACTOR); 122 | }); 123 | } 124 | } 125 | 126 | var scale10 = createScaleFunction(10); 127 | scale10([1,2]); //=>[10,20] 128 | 129 | var scale20 = createScaleFunction(20); 130 | scale10([1,2]); //=>[20,40] 131 | ``` 132 | 133 | ## 4. 高阶函数 134 | 135 | 使用函数 而不是值 136 | 137 | 最常用的函数式编程设计 138 | 139 | 忽略其参数并只返回一个常量的函数 140 | 141 | ```javascript 142 | function always(VALUE) { 143 | return function() { 144 | return VALUE; 145 | } 146 | } 147 | ``` 148 | 149 | 可以在调用闭包时传递不一样的函数 150 | 151 | 每一个新的闭包都会捕获不一样的值 152 | ```javascript 153 | var f = always(function(){}); 154 | var g = always(function(){}); 155 | 156 | f() === f() //true 157 | f() === g() //false 158 | ``` 159 | 160 | ## 5.由函数构建函数 161 | 162 | ### 5.1 柯里化 163 | 164 | ```javascript 165 | function leftCurryDiv(n) { 166 | return function(d) { 167 | return n/d; 168 | }); 169 | } 170 | 171 | var divide10By = leftCurryDiv(10); 172 | divide10By(2); //5 173 | 174 | function rightCurryDiv(d) { 175 | return function(n) { 176 | return n/d; 177 | } 178 | }; 179 | 180 | var divide10By = rightCurryDiv(10); 181 | divide10By(2); //0.2 182 | ``` 183 | 184 | 深度柯里化 185 | 186 | ```javascript 187 | function curry2(fun) { 188 | return function(secondArg) { 189 | return function (firstArg) { 190 | return fun(firstArg,secondArg); 191 | } 192 | } 193 | } 194 | ``` 195 | 196 | 对之前的`divideBy10`柯里化 197 | 198 | ```javascript 199 | function div(n,d) {return n / d} 200 | 201 | var div10 =curry2(div)(10); 202 | 203 | div(50); //5 204 | ``` 205 | 206 | ## 6.递归 207 | 208 | ## 7 纯度、不变形和更改策略 209 | 210 | ### 7.1 纯度和幂等性 211 | 212 | 幂等性是指执行无数次后还具有相同的结果 213 | 214 | 215 | ## 8. 基于流的编程 216 | 217 | ##9 无类编程 218 | 219 | ###9.1 惰性链 220 | 221 | 1. 获取一些对象 222 | 2. 定义一个与对象相关的链 223 | 3. 执行该链 -------------------------------------------------------------------------------- /javascriptqi_shi_lu.md: -------------------------------------------------------------------------------- 1 | # JavaScripte启示录 2 | 3 | # 0 总结 4 | 5 | 这本书适合初级和中级的JSer 6 | 7 | 主要讲他this prototype constructor 这几个概念讲得比较多,讲解的水平适中,没涉及到特别复杂的情况,实在讲基础性的东西 8 | 9 | 后面讲基础对象的章节基本可以一带而过 10 | 11 | # 1. JavaScript对象 12 | 13 | ## 1.2 JavaScript构造函数并返回对象实例 14 | 15 | 只要使用new调用某函数,就会将该函数的this设置为正在构建的新对象,并默认返回新创建的对象(this) 16 | 17 | ## 1.16 typeof操作符 18 | 19 | 注意点 20 | 21 | ```javascript 22 | 23 | typeof null //object 24 | 25 | var myFunction = new Function('x','y','return x* y') 26 | typeof myFunction //function 27 | 28 | var myRegExp = new RegEXP('\abc\') 29 | typeof myRegExp // function 30 | 31 | ``` 32 | 33 | 其他一般情况下 typeof基本类型 返回的是基本类型 非基本类型的都是object 34 | 35 | 基本类型一般是指非new出来的基本类型例如 36 | 37 | 1. var a = String('123') //基本类型 typeof 后为string 38 | 2. var b = new String('123') //复杂类型 typeof 后为object 39 | 40 | ## 1.18 构造函数实例都拥有指向其构造函数的Constructor属性 41 | 42 | 所有字变量/new方式出来的变量都会对应其constructor 43 | 44 | ```javascript 45 | var myNumber = new Number('23') 46 | var myNumberL = 23 47 | 48 | myNumber.constructor === Number //true 49 | myNumberL.constructor ===Number //true 50 | ``` 51 | 52 | ## 1.19 验证对象是否是特定构造函数的实例 53 | 54 | 和constructor的验证不一样 55 | 56 | 自变量的instanceof 不会对应着包装类 57 | 58 | ```javascript 59 | 111 instanceof Number //fasle 60 | 61 | var num = Number(111) 62 | 63 | num instanceof Number //false 64 | 65 | var numNew = new Number('111') 66 | 67 | numNew instanceof Number //true 68 | ``` 69 | 70 | # 2 对象与属性 71 | 72 | ## 2.4 删除对象属性 73 | 74 | delete不会删除在原型上找到的属性 75 | 76 | # 4 Function 77 | 78 | ## 4.10 函数实例的length属性和arguments.length 79 | 80 | ```javascript 81 | var myFunction = function (a,b,c) { 82 | return arguments.length 83 | } 84 | 85 | muFunction() //0 86 | 87 | var myFunction1 = function (a,b,c) { 88 | return myFunction1.length 89 | } 90 | 91 | myFunction1() //3 92 | 93 | ``` 94 | 95 | ## 4.18 函数可以嵌套 96 | 97 | 在ES3和javascript1.5的函数嵌套中的this是window 98 | 99 | ```javascript 100 | var a= function () { 101 | console.log('a') 102 | console.log(this)//window 103 | var b= function (){ 104 | console.log('b') 105 | console.log(this)//window 106 | var c = function (){ 107 | console.log('c') 108 | console.log(this)//window 109 | } 110 | c() 111 | } 112 | b() 113 | 114 | } 115 | ``` 116 | 117 | 其实这个比较好懂 如果在最外层 118 | 119 | a的this是window 120 | 121 | 而后面this就一直没变 122 | 123 | ## 4.19 函数提升 124 | 125 | 被定义为函数表达式的函数没有被提升,只有函数语句被提升 126 | 127 | 128 | ```javascript 129 | sum() //1 130 | function sum (){ 131 | return 1 132 | } 133 | 134 | sum2() //Uncaught TypeError: sum2 is not a function(…) 135 | 136 | var sum2 = function(){ 137 | return 2 138 | } 139 | ``` 140 | 141 | # 5. 全局对象 142 | 143 | 显示调用全局对象方法比隐式要慢 144 | 145 | ```javascript 146 | window.alert(1)//慢 147 | alert(2)//快 148 | ``` 149 | 150 | 笔者认为在自定义的全局函数里,必须要显式的写. 151 | 152 | 因为如果自定义的函数绑定在全局上 153 | 154 | 而不显示的写window,代码会变得非常难读 155 | 156 | 这点性能应该可以忽略 157 | 158 | 159 | # 6. this 160 | 161 | ## 6.3 在嵌套函数中的this关键引用head对象 162 | 163 | 在ES3中函数嵌套容易丢失this 164 | 165 | ```javascript 166 | var myObject = { 167 | func1: function() { 168 | console.log(this) //myObject 169 | var func2 = function() { 170 | console.log(this)//ES3: window /ES5 :myObject 171 | }(); 172 | } 173 | } 174 | myObject.func1() 175 | ``` 176 | 但是笔者在chrome试还是丢失了this的, 177 | 178 | ## 6.6 在自定义构造函数中使用this 179 | 180 | 如果没有使用new 构造函数(),this将变成window 181 | 182 | ```javascript 183 | 184 | var Person = function (){console.log(this)} 185 | 186 | Person()//window 187 | 188 | new Person()//Person{} 189 | 190 | var a = { 191 | b: function(){ 192 | console.log(this) //Object{} 193 | Person() //window 194 | } 195 | } 196 | 197 | a.b() 198 | 199 | ``` 200 | 201 | # 7 作用域和闭包 202 | 203 | ## 7.6 函数定义时确定作用域,而非调用时确定 204 | 205 | # 8. 函数原型属性 206 | 207 | ## 8.4 默认的prototype属性是object对象 208 | 209 | ```javascript 210 | var myFunction = function(){} 211 | 212 | myFunction.prototype = {} //浏览器自动执行的 213 | 214 | console.log(myFunction.prototype) //object{} 215 | ``` 216 | 217 | ## 8.5 将构造函数创建的实例链接至构造函数的prototype属性 218 | 219 | 原型链将每个实例都链接至构造函数的prototype属性 220 | 221 | 即实例.__proto === 构造函数.prototype 222 | 223 | ```javascript 224 | Array.prototype.foo = 'foo'; 225 | var myArray = []; 226 | console.log(myArray.__proto__ === Array.prototype) //true 227 | console.log(myArray.__proto__.foo) //foo 228 | ``` 229 | 230 | ## 8.6 原型链的最后是Object.prototype 231 | 232 | 任何添加到Object.prototype都会出现在for in中 233 | 234 | ## 8.8 用新对象替换prototype属性会删除默认构造函数属性 235 | 236 | 用一个新值替换prototype属性,这样的话其构造函数也会变为新值的构造函数 237 | 238 | ```javascript 239 | var Foo =function Foo(){} 240 | 241 | Foo.prototype = {} 242 | 243 | var FooInstance = new Foo() 244 | 245 | cosole.log(FooInstance.constructor) //Object() 246 | 247 | //手动把她还原 248 | 249 | var Foo1 = function(){} 250 | 251 | Foo.prototype = { constructor:Foo1} 252 | 253 | var FooInstance1= new Foo1() 254 | 255 | console.log(FooInstance1.constructor) //Foo1() 256 | 257 | ``` 258 | 259 | ## 8.9 继承原型属性的实例总是能够获取最新值 260 | 261 | ## 8.10 用新对象替换prototype属性不会更新以前的实例 262 | 263 | 264 | 265 | 266 | -------------------------------------------------------------------------------- /javascriptwebying_yong_kai_fa.md: -------------------------------------------------------------------------------- 1 | # JavaScriptWeb应用开发 2 | 3 | # 1. 构建过程 4 | 5 | 你可以逐渐改进代码基,重构你接触到的代码,为重构后的功能编写测试,把过时的代码包装在接口里,以后再重构.--这样做能不断提升项目中代码的平均质量 6 | 7 | # 2. 编写构建任务,指定流程 8 | 9 | 介绍了下Grunt下使用less,jslint,babel编译等 10 | 11 | # 3. 精通环境配置和开发流程 12 | 13 | 一般有三种构建 14 | 15 | 1. 本地 16 | 2. 测试环境 17 | 3. 正式站点 18 | 19 | LiveReload: 自动刷新浏览器 20 | 21 | # 4. 发布、部署和监控 22 | 23 | 优化图片使用`grunt-contrib-imagemin`,能实现隔行扫描图像 24 | 25 | 使用更改日志`grunt-conventional-changelog` 26 | 27 | 提交git时,使用`fix:`,`feat: `,`BREAKING`,为commit的开头,该插件能自动生成changelog 28 | 29 | 最好使用Travis托管的CI,获取github上的标识 30 | 31 | ## 4.5 监控和诊断 32 | 33 | ### 4.5.1 日志和通知 34 | 35 | 使用winston处理日志 36 | 37 | ### 4.5.2 调试弄得 38 | 39 | node-inspector/IDE 40 | 41 | ### 4.5.3 分析性能 42 | 43 | node: nodetime-register 44 | 45 | ### 4.5.4 运行时间和进程管理 46 | 47 | cluster,类似于集群配置,但还不稳定 48 | 49 | # 5. 理解模块化和依赖管理 50 | 51 | 主要管理依赖方式 52 | 53 | 1. RequireJS,使用AMD 54 | 2. CommonJs,使用Browserify编译 55 | 3. AngularJS,自动解析依赖图 56 | 57 | # 6. 理解Javascript的异步流程控制方法 58 | 59 | 多一层回调就多一层作用域,还要再向内收紧一层,逼着我们买更宽的浏览器 60 | 61 | ## 6.2 使用async库 62 | 63 | 1. waterfall: 瀑布,前者返回结果会传递给后者 64 | 2. series: 串行 65 | 3. parallel: 并行 66 | 67 | # 7. 使用模型-视图-控制器 68 | 69 | 讲了Rendr,Backbone实现MVC. 70 | 71 | 其实我觉得该被React替代了 72 | 73 | # 8. 测试JavaScript组件 74 | 75 | Sinon.js可以用来测试setTimeout、XHR等请求, 76 | 77 | Proxyquire可以模拟数据等返回数据,专门用于造数据 78 | 79 | 集成测试推荐Selenium 80 | 81 | 外观测试推荐Grunt-photobox 82 | 83 | 性能测试tuijian1Goole PageSpeed 或 YahooYslow 84 | 85 | # REST API设计和分层服务架构 86 | 87 | REST资源: 在REST架构中,资源是一切信息的抽象。这里,我们可以把资源理解成数据库中的模型。用户是资源,商品和分类也是资源。资源可以使用前面说的统一接口查询 88 | 89 | REST 90 | 91 | 1. 全部小写,使用连字符 92 | 2. 使用1/2个名称描述资源 93 | 3. 资源一定要复数 94 | 95 | 实现外部API注意分页 缓存 限流 96 | 97 | Measly中止旧请求 -------------------------------------------------------------------------------- /javascriptxing_neng_you_hua_du_liang_3001_jian_kon.md: -------------------------------------------------------------------------------- 1 | # JavaScript的性能优化度量、监控与可视化 2 | 3 | # 0. 总结 4 | 5 | 这本书我看第一章,还以为有点东西 6 | 7 | 后面看着大量的代码,其实核心的东西没多少 8 | 9 | 评分: 3星(满分5) 10 | 11 | 总页数185 12 | 13 | # 1. 什么是性能 14 | 15 | ## 1.2 解析和渲染 16 | 17 | 规定一个IP包最大值为65535字节(约8kb) 18 | 19 | ## 1.4 为什么性能如此重要 20 | 21 | 放弃率 = (1- (成功访问数/访问总数)) x 100 22 | 23 | 成功访问数是 购买一个商品 注册一个账号 点击一个按钮 24 | 25 | ## 1.6 本书的目的 26 | 27 | 熟练的工人能制造出一些东西,但只有大师才能制作出杰出的作品,并用数据证明它的杰出之处 28 | 29 | ## 1.7 使用技术以及技术拓展 30 | 31 | http://httparchive.org/trends.php 32 | 33 | 上面有非常多有趣的统计 例如CDN的占用率等 34 | 35 | 推荐可视化入门书籍https://item.jd.com/11098788.html 36 | 37 | 还有可视化讲解的网址 http://flowingdata.com 38 | 39 | # 3. WPTRunner 40 | 41 | 插件相关url: https://sites.google.com/a/webpagetest.org/docs/advanced-features/webpagetest-restful-apis 42 | 43 | 44 | 45 | 作者也把自己的小mode放在github上https://github.com/tomjbarker/WPTRunner 46 | 47 | 这里面主要统计的有加载时候和请求数 48 | 49 | # 4. perfLogger --javascript基于测试和日志记录 50 | 51 | 这里主要通过自己主动埋点然后通过xhr记录 52 | 53 | https://github.com/tomjbarker/perfLogger 54 | 55 | # 5. 展望未来,性能的标准化 56 | 57 | 这里主要介绍performance进行数据记录 58 | 59 | # 6. Web性能优化 60 | 61 | 主要通过分析性能来提优化点,也大都是老生常谈的优化技巧了 62 | 63 | # 7. 运行时性能 64 | 65 | 也是对一些技巧进行性能分析.... 66 | 67 | # 8. 在性能、软件工程最佳实践和软件产品运行之间谋求平衡 68 | 69 | 没啥用 70 | 71 | 72 | -------------------------------------------------------------------------------- /javascript语言精粹.md: -------------------------------------------------------------------------------- 1 | # JavaScript语言精粹 2 | 3 | # 总结 4 | 5 | 说真的,这是一本我连一个字都不想记下来的书 6 | 7 | 评分 1 (总分5) -------------------------------------------------------------------------------- /ji_chu.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/ji_chu.md -------------------------------------------------------------------------------- /jia_zai_yu_zhi_xing.md: -------------------------------------------------------------------------------- 1 | # 加载与执行 2 | 3 | 1. `` 33 | 34 | 因为第一种Set Cookie 服务器只能设置服务器根域或子域的Cookie 35 | 36 | 而 JS最多只能拿到根域的cookie 所以页面根域和接口根域 必须一致 才能拿到数据 37 | 38 | # JSONP 39 | 40 | JSONP的原理就是 41 | 42 | 1. 现在window设置一个函数名 window.abc = function(){} 43 | 2. 往页面插入一个script: script src="...?callback=abc" 44 | 3. 服务器返回 abc({...}) 45 | 46 | 所以JSONP只是类似请求一个JS资源..所以它当然只能GET拉 47 | 48 | # OPTIONS 204 和 跨域 49 | 50 | 假如发跨域的xhr请求时 自定义了header 51 | 52 | 浏览器就会给服务器先发一个OPTIONS请求 主要问浏览器支持哪些提交方法 和 允许哪些自定义头 53 | 54 | 然后服务器一般是返回204给浏览器 55 | 56 | ![204返回](/assets/QQ20180802-212558.png) 57 | 58 | 然后再去真正的请求 59 | 60 | # xhr跨域和cookie 61 | 62 | form表单和jsonp都是默认带cookie 63 | 64 | 但是 xhr的跨域想带cookie就js和服务器都是做设置 65 | 66 | 服务器需要带`Access-Control-Allow-Credentials: true` 67 | 68 | 而浏览器需要设置`xhr.withCredentials = true` 69 | 70 | 这样才能带上cookie 71 | 72 | withCredentials属性也是从IE10开始支持 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/withCredentials 73 | 74 | # 跨站与IE 75 | 76 | 虽然IE8 9 都有XMLHttpRequest 77 | 78 | 但是跨域的话 会显示`SCRIPT5: 拒绝访问。` 79 | 80 | 所以这个可以用XDomainRequest 来解决跨域问题 81 | 82 | 但是 XDomainRequest 是 没有setRquestHeader方法的...所以IE无法跨域时设置Header 83 | 84 | https://developer.mozilla.org/en-US/docs/Web/API/XDomainRequest 也有相关的介绍 85 | 86 | # 服务器的Set-Cookie是否只允许 设置域名根域 或者其子域 87 | 88 | aaa.xxx.com接口返回Set-Cookie: upgrade=; Path=/; Domain=xxx.com 89 | 90 | 这样才能设置cookie 否则无效(抓包有Set-Cookie头 但是chrome Response没有) 91 | 92 | ![无效cookie](/assets/QQ20180802-183651.png) 93 | 94 | 95 | -------------------------------------------------------------------------------- /qian_duan.md: -------------------------------------------------------------------------------- 1 | # 前端 2 | 3 | -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | 4 | Sitemap: http://read.404mzk.com/sitemap.xml -------------------------------------------------------------------------------- /server/5- 数据复制.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/5- 数据复制.png -------------------------------------------------------------------------------- /server/Compact行记录结构.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/Compact行记录结构.jpg -------------------------------------------------------------------------------- /server/Innodb逻辑存储结构.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/Innodb逻辑存储结构.jpg -------------------------------------------------------------------------------- /server/QQ_1728871978055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1728871978055.png -------------------------------------------------------------------------------- /server/QQ_1728872137326.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1728872137326.png -------------------------------------------------------------------------------- /server/QQ_1735864394102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1735864394102.png -------------------------------------------------------------------------------- /server/QQ_1735868189230.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1735868189230.png -------------------------------------------------------------------------------- /server/QQ_1736298660879.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1736298660879.png -------------------------------------------------------------------------------- /server/QQ_1736298779219.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1736298779219.png -------------------------------------------------------------------------------- /server/QQ_1736905740736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1736905740736.png -------------------------------------------------------------------------------- /server/QQ_1736992594467.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1736992594467.png -------------------------------------------------------------------------------- /server/QQ_1736993090767.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1736993090767.png -------------------------------------------------------------------------------- /server/QQ_1737002309672.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1737002309672.png -------------------------------------------------------------------------------- /server/QQ_1737002711777.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/QQ_1737002711777.png -------------------------------------------------------------------------------- /server/binlog_cache_size写入流程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/binlog_cache_size写入流程.png -------------------------------------------------------------------------------- /server/create_data.sql: -------------------------------------------------------------------------------- 1 | begin; 2 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 3 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 4 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 5 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 6 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 7 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 8 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 9 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 10 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 11 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 12 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 13 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 14 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 15 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 16 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 17 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 18 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 19 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 20 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 21 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 22 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 23 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 24 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 25 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 26 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 27 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 28 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 29 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 30 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 31 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 32 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 33 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 34 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 35 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 36 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 37 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 38 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 39 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 40 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 41 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 42 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 43 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 44 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 45 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 46 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 47 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 48 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 49 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 50 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 51 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 52 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 53 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 54 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 55 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 56 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 57 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 58 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 59 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 60 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 61 | insert read_innodb.read_innodb_4_2_3_t1 select null, repeat('a', 7000); 62 | commit; 63 | -------------------------------------------------------------------------------- /server/go-bin-fa-bian-cheng-shi-jian.md: -------------------------------------------------------------------------------- 1 | # Go并发编程实践 2 | 3 | # 2. 语法规范 4 | 5 | ## 2.1基本构成元素 6 | 7 | 类型断言: 判断一个接口值的实际类型是否为某个类型, 或一个非接口值的类型是否实现了某个接口类型, v1.[I1] 8 | 9 | 解决类型断言的运行时恐慌, `var i1, ok = interface{}(v1).(I1)` 10 | 11 | ## 2.2 基本类型 12 | 13 | - byte: 字节类型, 可以看做8位二进制表示的无符号整数类型 14 | - rune: rune类型, 涌过来存储Unicode字符, 可以看做32位二进制表示的有符号整数类型 15 | 16 | ## 2.3 高级类型 17 | 18 | ### 2.3.1 数组 19 | 20 | 数组类型的零值一定是一个不包含任何元素的空数组 21 | 22 | ### 2.3.4 函数方法 23 | 24 | 方法是函数的一种, 它实际就是与某个数据类型关联在一起的函数 25 | 26 | ```go 27 | type myInt int 28 | 29 | func (i myInt) add(another int) myInt { 30 | i = i + myInt(another) 31 | return i 32 | } 33 | 34 | i1 := myInt(1) 35 | i2 := i1.add(2) 36 | fmt.Println(i1, i2) // 1 3 37 | ``` 38 | 在i1调用add方法时, 这个值被赋给了接受者变量1, 所以i和i1是两个变量 39 | 40 | 如果需要改造可以 41 | 42 | ```go 43 | func (i *myInt) add(another int) myInt { 44 | *i = *i + myInt(another) 45 | return *i 46 | } 47 | 48 | i1 := myInt(1) 49 | i2 := i1.add(2) 50 | fmt.Println(i1, i2) // 3 3 51 | ``` 52 | 53 | 在非指针数据类型的值上, 也是能够调用其指针方法的.因为Go在内部做了自动转换 54 | 55 | 例如add是指针方法,那么i1.add(2)会被自动转换为(&i1).add(2) 56 | 57 | ### 2.4.4 for语句 58 | 59 | - 迭代nil的通道值, 会让当前刘畅永远阻塞在for语句上 60 | 61 | ### 2.4.5 defer语句 62 | 63 | - 当外围函数中的语句正常执行完毕时, 只有其中所有的延迟函数都执行完毕, 外围函数才会真正结束执行 64 | - 当执行外围函数中的return语句时, 只有其中所有的延迟函数都执行完毕后, 外围函数才会真正返回 65 | - 当外围函数中的代码引发运行恐慌时, 只有其中所有的延迟函数都执行完毕后, 该运行恐慌才会真正被扩散至调用函数 66 | 67 | 注意点 68 | 69 | - 多个defer 语句, 执行顺序与声明顺序相反 70 | - defer 通过参数传入, 参数的值在会在当前defer语句被执时求出 71 | 72 | ### 2.4.6 panic和recover 73 | 74 | > recover 75 | 76 | recover应该和der语句配合使用 77 | 78 | ```go 79 | defer func() { 80 | if e := recover(); e != nil { 81 | fmt.Printf(e) 82 | } 83 | } 84 | ``` 85 | 86 | # 3. 并发编程综述 87 | 88 | ## 3.2 多进程编程 89 | 90 | ### 3.2.2 关于同步 91 | 92 | 执行过程中不能中断的操作称为原子操作, 而只能被串行化访问或执行的某个资源或某段代码称为临界区 93 | 94 | 原子操作是必须一个单一汇编指令的,一般是sync/atomic中的函数 95 | 96 | 相比原子操作, 让串行化执行的若干代码形成临界区更加通用 97 | 98 | ### 3.2.3 管道 99 | 100 | 管道是只能父进程和子进程以及祖先和子进程进行通信方式 101 | 102 | ### 3.2.4 信号 103 | 104 | 操作系统信号是IPC中唯一一种异步的通信方式 105 | 106 | unix系统中`SIGKILL`和`SIGSTOP`不能由进程自行处理 107 | 108 | # 4. Go的并发机制 109 | 110 | ## 4.1 原理探究 111 | 112 | goroutine: 不要用共享内存的方式来通信. 作为替代, 应该以通信作为手段来共享内存 113 | 114 | ### 4.1.1 线程实现模型 115 | 116 | - M: machine, 一个M代表一个内核线程 117 | - P: processor, 一个P代表一个Go代码片段所需的资源(上下文环境) 118 | - G: goroutine, 一个G代表一个Go代码片段 119 | 120 | ## 4.3 channel 121 | 122 | ### 4.3.1 channel的基本概念 123 | 124 | 通道类型是一个引用的类型 125 | 126 | > 类型表达法 127 | 128 | `chan T`, T代表该通道类型的元素类型 129 | 130 | `type IntChan chan int` 131 | 132 | 这种声明通道类型是双向的 133 | 134 | 如果需要声明单向类型通道, 需要使用`<-` 135 | 136 | - `chan<- T` 只能向此通道发送元素值 137 | - `<-chan T` 只能接受此通道的元素值 138 | 139 | > 操作特性 140 | 141 | 通道主要用于多个goroutine通信, 在同一时刻, 只能有一个goroutine能向一个通道发送元素值 142 | 143 | 同一时刻, 也只有一个goroutine从通道接受元素值 144 | 145 | 已被接受的通道元素值, 会立即从通道删除 146 | 147 | > 初始化通道 148 | 149 | - 缓冲通道: `make(chan int, 10)` 同一时刻最多可缓存10个元素值 150 | - 非缓冲通道: `make(chan int)` 发送给它的元素值应该立即取走, 否则发送方的goroutine就会被阻塞, 直到有接受方接受这个元素值 151 | 152 | > 接受元素值 153 | 154 | ```go 155 | strChan := make(chan string, 3) 156 | elem, ok := <-strChan 157 | ``` 158 | 159 | 此时goroutine会进入GWaiting态, 等待strChan有新的元素值 160 | 161 | 试图从一个未初始化的通道值接受元素值, 会造成当前goroutine永久阻塞 162 | 163 | > 放松元素值 164 | 165 | ```go 166 | strChan := make(chan string, 3) 167 | strChan <- "a" 168 | strChan <- "b" 169 | strChan <- "c" 170 | ``` 171 | 172 | 此时strChan通道已满, 假如再有goroutine向通道发送值, 则该goroutine会被阻塞, 知道缓存通道有空余 173 | 174 | `struct{}`代表不包含任何字段的结构类型, 空结构体的变量都拥有相同的内存地址, 建议不携带信息时, 都用struct{} 作为元素类型 175 | 176 | - 向一个nil的通道发送元素时, 该goroutine会永久阻塞 177 | - 向一个关闭的通道发送元素时, 会panic 178 | 179 | 若多个goroutine因为发送信息给已满通道而被阻塞时, 最先被阻塞的会先被唤醒 180 | 181 | Go运行时, 每次只会唤醒一个goroutine 182 | 183 | > 关闭通道 184 | 185 | 无论如何都不应该在接受端关闭通道, 因为在接受端通常无法判断发送端是否还会向该通道发送元素值 186 | 187 | 在发送端关闭通道一般不会对接受端有什么影响. 如果该通道在被关闭时, 仍有元素值, 仍可用表达式取出 188 | 189 | ### 4.3.2 单向channel 190 | 191 | channel为单向通道只是语法糖, 用来做强制类型 192 | 193 | 不能强制转化channel类型 194 | 195 | ### 4.3.3 for语句和channel 196 | 197 | 从一个未初始化的通道中接受元素值会导致当前goroutine的永久阻塞 198 | 199 | for语句会不断尝试从通道中接受元素值, 直到通道关闭 200 | 201 | 通道关闭时, 如果通道仍有元素 for range循环会继续读完再结束 202 | 203 | ### 4.3.4 select语句 204 | 205 | > 分支选择规则 206 | 207 | 开始执行select语句时, 所有跟在case关键字右边的发送语句或接受语句都会被先求值(从左到右, 从上到下) 208 | 209 | ```go 210 | package main 211 | import "fmt" 212 | 213 | var intChan1 chan int 214 | var intChan2 chan int 215 | var channels = []chan int{intChan1, intChan2} 216 | 217 | var numbers = []int{1,2,3,4,5} 218 | 219 | func getChan(i int) chan int { 220 | fmt.Printf("channels[%d]\n", i) 221 | return channels[i] 222 | } 223 | 224 | func getNumber(i int) int { 225 | fmt.Printf("numbers[%d]\n", i) 226 | return numbers[i] 227 | } 228 | 229 | func main() { 230 | select { 231 | case getChan(0) <- getNumber(0): 232 | fmt.Println("1th") 233 | case getChan(1) <- getNumber(1): 234 | fmt.Println("2th") 235 | default: 236 | fmt.Println("default") 237 | } 238 | } 239 | ``` 240 | 241 | 输出结果为 242 | 243 | ``` 244 | channels[0] 245 | numbers[0] 246 | channels[1] 247 | numbers[1] 248 | default 249 | ``` 250 | 251 | 因为上述channel 都未被初始化, 所以会永久阻塞, 走到了defaultcase 252 | 253 | 执行select时, 会自上而下的判断每个case发送或接收操作是否可以立即进行, 如果多个case都满足条件 254 | 255 | 系统会通过伪随机算法选中一个case 256 | 257 | 如果没有一个case符合条件并且没有default case, 此处将会永久阻塞 258 | 259 | default无论位置在哪, 执行舒心都是最后 260 | 261 | ### 4.3.6 time包和channel 262 | 263 | 超时设置 264 | 265 | ```go 266 | package main 267 | 268 | import ( 269 | "fmt" 270 | "time" 271 | ) 272 | 273 | func main() { 274 | intChan := make(chan int, 1) 275 | go func() { 276 | for i:=0; i< 5; i++ { 277 | time.Sleep(time.Second) 278 | intChan <- i 279 | } 280 | close(intChan) 281 | }() 282 | timeout := time.Millisecond * 500 283 | var timer *time.Timer 284 | for { 285 | if timer == nil { 286 | timer = time.NewTimer(timeout) 287 | } else { 288 | timer.Reset(timeout) 289 | } 290 | select { 291 | case e, ok := <- intChan: 292 | if !ok { 293 | fmt.Println("End.") 294 | return 295 | } 296 | fmt.Printf("Reveciver: %v\n", e) 297 | case <-timer.C: 298 | fmt.Println("Timeout") 299 | } 300 | } 301 | } 302 | 303 | ``` -------------------------------------------------------------------------------- /server/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-1.png -------------------------------------------------------------------------------- /server/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-10.png -------------------------------------------------------------------------------- /server/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-2.png -------------------------------------------------------------------------------- /server/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-3.png -------------------------------------------------------------------------------- /server/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-4.png -------------------------------------------------------------------------------- /server/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-5.png -------------------------------------------------------------------------------- /server/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-6.png -------------------------------------------------------------------------------- /server/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-7.png -------------------------------------------------------------------------------- /server/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-8.png -------------------------------------------------------------------------------- /server/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image-9.png -------------------------------------------------------------------------------- /server/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/image.png -------------------------------------------------------------------------------- /server/innodb数据存放-共享表和单独表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzkmzk/Read/f73605024434e4738d8463ee96be6de24ed443e6/server/innodb数据存放-共享表和单独表.jpg -------------------------------------------------------------------------------- /server/mysql-bi-zhi-bi-hui.md: -------------------------------------------------------------------------------- 1 | # MySQL必知必会 2 | 3 | ## 1. 了解SQL 4 | 5 | SQL: 结构化查询语言(Structured Query Language) 6 | 7 | 8 | ## 3. 使用MySQL 9 | 10 | ### 3.3 了解数据库和表 11 | 12 | 查询创建数据库的语句 13 | 14 | ```bash 15 | show create database mzk_test; 16 | ``` 17 | 18 | ``` 19 | +----------+-------------------------------------------------------------------+ 20 | | Database | Create Database | 21 | +----------+-------------------------------------------------------------------+ 22 | | mzk_test | CREATE DATABASE `mzk_test` /*!40100 DEFAULT CHARACTER SET utf8 */ | 23 | +----------+-------------------------------------------------------------------+ 24 | ``` 25 | 26 | 查询创建表的语句 27 | 28 | ```bash 29 | mysql> show create table 1_items\G; 30 | *************************** 1. row *************************** 31 | Table: 1_items 32 | Create Table: CREATE TABLE `1_items` ( 33 | `id` int(11) NOT NULL AUTO_INCREMENT, 34 | PRIMARY KEY (`id`) 35 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 36 | ``` 37 | 38 | ## 4. SELECT语句 39 | 40 | ### 4.2 检索单个列 41 | 42 | SQL语句大小写, SQL语句不区分大小写, 很多SQL开发人员习惯把SQL关键字大写, 列名和表名使用小写, 方便代码阅读 43 | 44 | ### 4.5 检索不同的行 45 | 46 | 假如我们想排查相同结果的列应该如何做, 47 | 48 | 现有数据 49 | 50 | ```bash 51 | mysql> select iid from 1_items_links; 52 | +-----+ 53 | | iid | 54 | +-----+ 55 | | 1 | 56 | | 1 | 57 | | 1 | 58 | | 2 | 59 | +-----+ 60 | ``` 61 | 62 | 排除相同数据 63 | 64 | ```bash 65 | mysql> SELECT DISTINCT iid from 1_items_links; 66 | +-----+ 67 | | iid | 68 | +-----+ 69 | | 1 | 70 | | 2 | 71 | +-----+ 72 | ``` 73 | 74 | ​ tips: DISTINCT 应用于所有列, 而不只是前置它的列 75 | 76 | 当DISTINCT后面跟着多个字段, 则需多个字段的value都一样才算`重复值` 77 | 78 | ### 4.6 限制结果 79 | 80 | ```bash 81 | SELECT prod_name FROM products LIMIT 5,7 82 | ``` 83 | 84 | 表示从第6(默认值为0, 第一行为行0)行开始, 检索7个符合结果的列(包括第6行) 85 | 86 | 但这个从0行开始算比较容易弄混淆, 一般都用OFFSET表示从第几行开始 87 | 88 | OFFSET制定的数字就是从第1行开始 89 | 90 | ```bash 91 | SELECT prod_name FROM products LIMIT 7 OFFSET 6 92 | ``` 93 | 94 | ## 6. 过滤数据 95 | 96 | ### 6.2 Where子句操作符 97 | 98 | > 6.2.1 检查某个值 99 | 字符串`=`和`!=`比较是忽略大小写的 100 | 101 | ```bash 102 | SELECT prod_name FROM products WHERE prod_name = 'fuses'; 103 | ``` 104 | 105 | 这个SQL能匹配`fuses`也能匹配`Fuses` 106 | 107 | > 6.2.3 范围值检查 108 | 109 | ```bash 110 | SELECT prod_name FROM products Where prod_price BETWEEN 5 AND 10 111 | ``` 112 | 113 | 找出`prod_price`大于等于5和小于等于10的列 114 | 115 | > 6.2.4 空值检查 116 | 117 | 创建表时, 可以设定表是否可以不包含值, 不包含的话就是NULL 118 | 119 | 找出空值 120 | ```bash 121 | select prod_name from products where prod_price is NULL; 122 | ``` 123 | 124 | ## 7. 数据过滤 125 | 126 | ### 7.1 组合Where子句 127 | 128 | > 7.1.3 计算次序 129 | 130 | 当包含任意数目的`OR`和`AND`, 会先处理AND操作, 然后再处理OR操作, 没有`()`的情况下 131 | 132 | ## 8. 用通配符过滤 133 | 134 | ### 8.1 like操作符 135 | 136 | > 8.1.2 下划线`_`通配符 137 | 138 | `_`表示只匹配单个字符 139 | 140 | ## 9.用正则表达式进行搜索 141 | 142 | ## 9.2 使用MySQL正则表达式 143 | 144 | > 9.2.2 进行OR匹配 145 | 146 | ```sql 147 | select prod_name from products where prod_name regexp '[123] Ton' 148 | ``` 149 | 150 | > 9.2.5匹配特殊字符 151 | 152 | 为了匹配特殊字符, 必须用`\\`作为前导, `\\-`为了找`-`, `\\.`为了找`.` 153 | 154 | ## 13 分组数据 155 | 156 | ### 13.3 过滤分组 157 | 158 | GROUP BY用于分组数据, 可以用HAVING过滤分组 159 | 160 | HAVING和WHERE非常类似, WHERE过滤的是行, HAVING过滤的是分组 161 | 162 | 例如要过滤加个大于10的商品, 最后的分组要过滤大于2个的分组 163 | 164 | ```sql 165 | SELECT vend_id, count(*) as num prods 166 | from products 167 | where prod_price >= 10 168 | group by vend_id 169 | having count(*) >=2; 170 | ``` 171 | 172 | ### 13.5 select自举顺序 173 | 174 | - select 175 | - from 176 | - where 177 | - group by 178 | - having 179 | - order by 180 | - limit 181 | 182 | ## 15 联结表 183 | 184 | ### 15.2 创建联结 185 | 186 | > 15.2.2 内部联结 187 | 188 | 基于两张表之间相等测试, 这种联结称为内部联结 189 | 190 | ```sql 191 | select vend_name, prod_name, prod_price 192 | from vendors inner join products 193 | on vendors.vend_id = products.vend_id 194 | ``` 195 | 196 | ## 16 创建高级联结 197 | 198 | ### 16.2 自联结 199 | 200 | 一般情况下 自联结的查询速度会比子查询要快很多 201 | 202 | > 16.2.3 外部联结 203 | 204 | 以下场景会使用到外部联结 205 | 206 | - 每个客户下了多少订单进行计数, 包括至今未下单的从客户 207 | - 列出所有产品以及订购数量, 包括没人订购的产品 208 | 209 | 包含了那些相关表中没有关联行的行, 称为外部链接 210 | 211 | 外部联结有外部左链接和外部右联结 212 | 213 | 外部联结还包括没有关联行的行, 外部左联结表示会左边表里的所有行 214 | 215 | ```sql 216 | select customers.cust_id, orders.order_num 217 | from customers right outer join orders 218 | on orders.cust_id = customers.cust_id; 219 | ``` 220 | 221 | ## 17 组合查询 222 | 223 | ### 17.1 组合查询 224 | 225 | 以下两种基本情况, 需要使用组合查询 226 | 227 | - 在单个查询中从不同的表返回类似结构的数据 228 | - 对单个表执行多个查询, 按单个查询返回数据 229 | 230 | ### 17.2 UNION规则 231 | 232 | - UNION中每个查询必须包含相同的列, 表达式或聚合函数(次序可不同) 233 | - 列数据类型必须兼容, 类型不必完全相同, 但必须是DBMS可以隐式转换的类型 234 | 235 | > 17.2.3 包含或取消重复的行 236 | 237 | UNION和WHERE的OR一样 都会去掉重复的行 238 | 239 | 要不取消冲的行则使用`UNION ALL` 240 | 241 | > 17.2.4 对组合查询结果排序 242 | 243 | UNION组合查询时, ORDER BY只能出现一次, 而且必须在最后一个SELECT中 244 | 245 | ## 18 全文本搜索 246 | 247 | ### 18.1 理解全文本搜索 248 | 249 | MyISAM支持全文本搜索而InnoD不支持 250 | 251 | ## 19 插入数据 252 | 253 | ### 19.2 插入完整的行 254 | 255 | 如果插入优先级低, 而查询优先级高则可以使用`INSERT LOW_PRIORITY INTO` 256 | 257 | ### 19.3 插入多个行 258 | 259 | mysql单条insert语句多个插入比使用多条INSERT语句要快 260 | 261 | ### 19.4 插入检索出的数据 262 | 263 | 利用SELECT语句把结果插入表里 264 | 265 | ```sql 266 | insert into customers(cust_id, cust_contact) 267 | SELECT cust_id, cust_contact from custnew; 268 | ``` 269 | 270 | ## 26. 管理事务处理 271 | 272 | ### 26.1 事务处理 273 | 274 | MyISAM不支持事务, InnoDB支持事务 275 | 276 | - 事务: transaction 指一组SQL语句 277 | - 回退: rollback 指撤销指定SQL语句的国产 278 | - 提交: commit 指将未存储的SQL语句结果写入数据库表 279 | - 保留点: savepoint 指事务处理中设置的临时占位符, 可以对它发布回退 280 | 281 | 不能回退CREATE或DROP操作, 事务中可以使用者两个操作, 但回退时不会被撤销 282 | 283 | ### 26.2 控制事务处理 284 | 285 | 当COMMIT或ROLLBACK语句执行后, 事务会自动关闭 286 | 287 | ```sql 288 | start transaction; 289 | DELETE from orderitems where order_nul = 1; 290 | DELETE from orders where order_num = 20010; 291 | commit 292 | ``` 293 | 294 | 使用保留点 295 | 296 | ```sql 297 | savepoint delete1; 298 | rollback to delete1; 299 | ``` 300 | 301 | ## 27. 全球化和本地化 302 | 303 | ### 27.1 字符集和校对顺序 304 | 305 | - 字符集: 字母和符号的集合 306 | - 编码: 为某个字符集成员的内部表示 307 | - 校对: 为规定字符如何比较的指令 308 | 309 | ### 27.2 使用字符集和校对顺序 310 | 311 | ```sql 312 | -- 查看所有字符集列表 313 | show character set; 314 | -- 输出所有支持校对的完整列表 315 | show collation 316 | ``` 317 | 318 | - `_cs`结尾表示一次区分大小写 319 | - `_ci`结尾表示一次不区分大小写 320 | 321 | 322 | ```sql 323 | create table mytable 324 | ( 325 | col int, 326 | col2 varchar(10) 327 | col3 varchar(10) character set latin1 collate latin1_general_ci 328 | ) DEFAULT character set hebrew 329 | collate hebrew_general_ci; 330 | ``` -------------------------------------------------------------------------------- /server/promethus-yuan-li-ying-yong-yuan-ma-yu-tuo-zhan-xiang-jie.md: -------------------------------------------------------------------------------- 1 | # 深入浅出 Prometheus 原理、应用源码与拓展详解 2 | 3 | ## 第1章 监控 4 | 5 | ![监控维度](../assets/jian-kong-wei-du.png) 6 | 7 | 对监控指标不要一味求全, 没有必要采集所有监控指标 8 | 9 | # 第2章 深入Prometheus 设计 10 | 11 | ## 2.1 指标 12 | 13 | 定义指标需要充分考虑通用性和拓展性 14 | 15 | ### 2.1.1 Prometheus 的指标定义 16 | 17 | Prometheus的所有监控指标(Metric) 被统一定义为 18 | 19 | ``` 20 | {