diff --git "a/Books and Software/Books/Tkinter\345\237\272\346\234\254\345\205\245\351\227\250\346\226\207\345\255\227\346\225\231\347\250\213(\350\257\246\347\273\206\344\273\213\347\273\215Tkinter\345\220\204\351\241\271\344\276\213\347\250\213).doc" "b/Books and Software/Books/Tkinter\345\237\272\346\234\254\345\205\245\351\227\250\346\226\207\345\255\227\346\225\231\347\250\213(\350\257\246\347\273\206\344\273\213\347\273\215Tkinter\345\220\204\351\241\271\344\276\213\347\250\213).doc" deleted file mode 100644 index f368759..0000000 Binary files "a/Books and Software/Books/Tkinter\345\237\272\346\234\254\345\205\245\351\227\250\346\226\207\345\255\227\346\225\231\347\250\213(\350\257\246\347\273\206\344\273\213\347\273\215Tkinter\345\220\204\351\241\271\344\276\213\347\250\213).doc" and /dev/null differ diff --git "a/Books and Software/Books/Tkinter\345\256\214\346\225\264\347\211\210.doc" "b/Books and Software/Books/Tkinter\345\256\214\346\225\264\347\211\210.doc" deleted file mode 100644 index 4f78814..0000000 Binary files "a/Books and Software/Books/Tkinter\345\256\214\346\225\264\347\211\210.doc" and /dev/null differ diff --git "a/Books and Software/Books/pygame\346\225\231\347\250\213.pdf" "b/Books and Software/Books/pygame\346\225\231\347\250\213.pdf" deleted file mode 100644 index 1d1d59a..0000000 Binary files "a/Books and Software/Books/pygame\346\225\231\347\250\213.pdf" and /dev/null differ diff --git a/Books and Software/Software/GoSublime-master.zip b/Books and Software/Software/GoSublime-master.zip deleted file mode 100644 index f2d4ee1..0000000 Binary files a/Books and Software/Software/GoSublime-master.zip and /dev/null differ diff --git a/Books and Software/Software/Sublime548Text3.zip b/Books and Software/Software/Sublime548Text3.zip deleted file mode 100644 index 4e6670b..0000000 Binary files a/Books and Software/Software/Sublime548Text3.zip and /dev/null differ diff --git a/Books and Software/Software/anaconda-2.1.17.tar.gz b/Books and Software/Software/anaconda-2.1.17.tar.gz deleted file mode 100644 index e78044b..0000000 Binary files a/Books and Software/Software/anaconda-2.1.17.tar.gz and /dev/null differ diff --git a/Books and Software/Software/gocode-master.zip b/Books and Software/Software/gocode-master.zip deleted file mode 100644 index 9e1909f..0000000 Binary files a/Books and Software/Software/gocode-master.zip and /dev/null differ diff --git "a/Books and Software/Software/\350\260\267\346\255\214\346\224\266\350\227\217\345\244\271Bookmarks" "b/Books and Software/Software/\350\260\267\346\255\214\346\224\266\350\227\217\345\244\271Bookmarks" deleted file mode 100644 index 57a34af..0000000 --- "a/Books and Software/Software/\350\260\267\346\255\214\346\224\266\350\227\217\345\244\271Bookmarks" +++ /dev/null @@ -1,1293 +0,0 @@ -{ - "checksum": "0dc44490522a9915629eb5c54d05e7da", - "roots": { - "bookmark_bar": { - "children": [ { - "date_added": "13090319288183370", - "id": "13", - "meta_info": { - "last_visited_desktop": "13147406366544243" - }, - "name": "百度知道 - 全球最大中文互动问答平台", - "type": "url", - "url": "http://zhidao.baidu.com/" - }, { - "date_added": "13091355111377790", - "id": "16", - "meta_info": { - "last_visited_desktop": "13147406570233197" - }, - "name": "百度百科_全球最大中文百科全书", - "type": "url", - "url": "http://baike.baidu.com/" - }, { - "date_added": "13122974374767373", - "id": "74", - "meta_info": { - "last_visited_desktop": "13147422275150144" - }, - "name": "Google 翻译", - "type": "url", - "url": "https://translate.google.com/" - }, { - "date_added": "13122370249467344", - "id": "68", - "meta_info": { - "last_visited_desktop": "13147441460922434" - }, - "name": "博客园 - 开发者的网上家园", - "type": "url", - "url": "http://www.cnblogs.com/" - }, { - "date_added": "13122195666108385", - "id": "65", - "meta_info": { - "last_visited_desktop": "13147432542026308" - }, - "name": "博客专题-博客首页", - "type": "url", - "url": "http://3ms.huawei.com/hi/blog/index.html?3ms_type=menu" - }, { - "date_added": "13129124669574837", - "id": "121", - "meta_info": { - "last_visited_desktop": "13147442333820983" - }, - "name": "lgjabc/python_learn", - "type": "url", - "url": "https://github.com/lgjabc/python_learn" - }, { - "date_added": "13145008643729602", - "id": "311", - "meta_info": { - "last_visited_desktop": "13147267535257710" - }, - "name": "W3School在线测试工具 V2", - "type": "url", - "url": "http://www.w3school.com.cn/tiy/t.asp?f=csse_background-color" - }, { - "children": [ { - "date_added": "13096804225160392", - "id": "31", - "name": "51Testing软件测试网-中国软件测试人的精神家园", - "type": "url", - "url": "http://www.51testing.com/html/index.html" - }, { - "date_added": "13095150442153000", - "id": "27", - "meta_info": { - "last_visited_desktop": "13147432481963790" - }, - "name": "软通动力专业服务系统", - "type": "url", - "url": "https://passport.isoftstone.com/?DomainUrl=http://ipsapro.isoftstone.com&ReturnUrl=%2fDefault.aspx" - }, { - "date_added": "13094987410201826", - "id": "24", - "meta_info": { - "last_visited_desktop": "13147241550206476" - }, - "name": "搜狗地图", - "type": "url", - "url": "http://map.sogou.com/" - }, { - "date_added": "13107518908304754", - "id": "46", - "name": "Python - 网站分类 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/cate/python/#p5" - }, { - "date_added": "13108117436274722", - "id": "50", - "name": "Intetool", - "type": "url", - "url": "http://rnd-mirrors.huawei.com/" - }, { - "date_added": "13122195694588375", - "id": "66", - "name": "Python Requests库:HTTP for Humans - 再见紫罗兰 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/linxiyue/p/3980003.html" - }, { - "date_added": "13122371432900384", - "id": "69", - "meta_info": { - "last_visited_desktop": "13145938054045127" - }, - "name": "HTTPS证书生成原理和部署细节 - 李铁牛 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/leetieniu2014/p/5258564.html" - }, { - "date_added": "13126707294500205", - "id": "97", - "meta_info": { - "last_visited_desktop": "13147403703027524" - }, - "name": "游客门户_心声社区", - "type": "url", - "url": "http://xinsheng.huawei.com/cn/index/guest.html" - }, { - "date_added": "13128512856722270", - "id": "113", - "meta_info": { - "last_visited_desktop": "13146828656058256" - }, - "name": "CSDN搜索", - "type": "url", - "url": "http://so.csdn.net/so/search/s.do?q=python&q=python" - }, { - "date_added": "13128575307577161", - "id": "114", - "name": "Sign in to GitHub · GitHub", - "type": "url", - "url": "https://github.com/login?return_to=%2Fvinta%2Fawesome-python" - }, { - "date_added": "13129024462955822", - "id": "118", - "meta_info": { - "last_visited_desktop": "13145010966261003" - }, - "name": "PyPI - the Python Package Index : Python Package Index", - "type": "url", - "url": "https://pypi.python.org/pypi" - }, { - "date_added": "13132309273600631", - "id": "147", - "name": "知识库 - 你身边的技术百科全书 - CSDN", - "type": "url", - "url": "http://lib.csdn.net/bases" - }, { - "date_added": "13135056240829485", - "id": "176", - "name": "CIDA", - "type": "url", - "url": "http://10.21.193.238:8080/iGuci/main.action" - }, { - "date_added": "13140178097254980", - "id": "221", - "name": "pygame - thystar的专栏 - 博客频道 - CSDN.NET", - "type": "url", - "url": "http://blog.csdn.net/thystar/article/category/3140461" - }, { - "date_added": "13140328045737236", - "id": "224", - "meta_info": { - "last_visited_desktop": "13143864398405282" - }, - "name": "51CTO.COM - 技术成就梦想 - 中国领先的IT技术网站", - "type": "url", - "url": "http://www.51cto.com/" - }, { - "date_added": "13140692459144501", - "id": "233", - "meta_info": { - "last_visited_desktop": "13143864343740739" - }, - "name": "登录 - 支付宝", - "type": "url", - "url": "https://authem14.alipay.com/login/index.htm" - }, { - "date_added": "13140757337670331", - "id": "236", - "name": "中国IT实验室 - 技术精英由此开始", - "type": "url", - "url": "http://www.chinaitlab.com/" - }, { - "date_added": "13140869500774893", - "id": "237", - "name": "SQL ORDER BY 子句", - "type": "url", - "url": "http://www.w3school.com.cn/sql/sql_orderby.asp" - }, { - "date_added": "13123067700653472", - "id": "76", - "name": "CIDA", - "type": "url", - "url": "http://10.21.193.238:8080/iGuci/login.jsp" - }, { - "date_added": "13133407889255351", - "id": "163", - "name": "【双旦晒藏书,感恩有好礼】回帖晒感激,帮你和那个他赢好礼 - 邓敏的博客", - "type": "url", - "url": "http://3ms.huawei.com/hi/blog/13063_2006589.html" - }, { - "date_added": "13133409625954646", - "id": "165", - "meta_info": { - "last_visited_desktop": "13146052487011071" - }, - "name": "博客频道 - CSDN.NET", - "type": "url", - "url": "http://blog.csdn.net/" - }, { - "date_added": "13091355141570910", - "id": "17", - "name": "百度文库——让每个人平等地提升自我", - "type": "url", - "url": "http://wenku.baidu.com/" - }, { - "date_added": "13123059099200664", - "id": "75", - "meta_info": { - "last_visited_desktop": "13146715342797563" - }, - "name": "Defect Tracking", - "type": "url", - "url": "http://dts.huawei.com/net/dts/DTS/MyWorkPage.aspx" - }, { - "date_added": "13123583380023217", - "id": "83", - "meta_info": { - "last_visited_desktop": "13144929651714182" - }, - "name": "liuguojin WX307086 / APIMgt-PaaS2.0 · CodeClub", - "type": "url", - "url": "http://code.huawei.com/lWX307086/APIMgt-PaaS2.0" - } ], - "date_added": "13122195529862131", - "date_modified": "13146306986263695", - "id": "63", - "name": "常用网址", - "type": "folder" - }, { - "children": [ { - "date_added": "13122436324373956", - "id": "71", - "name": "【转】java中byte, int的转换, byte String转换 - wi100sh - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/wi100sh/p/4548599.html" - }, { - "date_added": "13123846707193994", - "id": "86", - "name": "Java基础加强之集合篇(模块记忆、精要分析) - ITPSC - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hjwublog/p/6065804.html#autoid-3-2-1" - }, { - "date_added": "13127561493056755", - "id": "100", - "meta_info": { - "last_visited_desktop": "13143261683035906" - }, - "name": "python gui之tkinter语法杂记 - tommy.yu - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/Tommy-Yu/p/4171006.html" - }, { - "date_added": "13127561498209826", - "id": "101", - "name": "Python-Tkinter几何布局管理(转) - 一路前行 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/zhangpengshou/p/3626137.html" - }, { - "date_added": "13127561506450826", - "id": "102", - "name": "python--tkinter桌面编程开发--记事本 - Kobe10 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/Kobe10/p/5712233.html" - }, { - "date_added": "13128156242282568", - "id": "108", - "name": "go strings 包函数使用 - 王腾飞 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/wtf0215-golang/p/5033102.html" - }, { - "date_added": "13128156415276168", - "id": "109", - "name": "Golang包 - 标签 - GoLove - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/golove/tag/Golang%E5%8C%85/" - }, { - "date_added": "13128489325920298", - "id": "112", - "name": "《JAVA与模式》之装饰模式 - java_my_life - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html" - }, { - "date_added": "13129126098809140", - "id": "122", - "name": "Github干货系列:Python 免费资源集合 - scott_h - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/scotth/p/3881488.html" - }, { - "date_added": "13129349864179509", - "id": "126", - "name": "java一个好玩的接口讲解 - 儒 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/zhixiaoye/p/5318242.html" - }, { - "date_added": "13129608835815474", - "id": "129", - "name": "浅谈算法和数据结构: 基本排序:选择 , 插入, 合并, 四 快速排序,五 优先级队列与堆排序 - 贺大卫 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/virusolf/p/5394343.html" - }, { - "date_added": "13130823938557671", - "id": "132", - "name": "python paramiko - starof - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/starof/p/4670433.html" - }, { - "date_added": "13131190858646902", - "id": "135", - "meta_info": { - "last_visited_desktop": "13145361049537457" - }, - "name": "JAVA多线程和并发基础面试问答(转载) - 海 子 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/dolphin0520/p/3932934.html" - }, { - "date_added": "13131190883510902", - "id": "136", - "name": "Java线程面试题 Top 50 (转载) - 海 子 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/dolphin0520/p/3958019.html" - }, { - "date_added": "13131532324054595", - "id": "139", - "name": "tkinter - 标签 - Hongten - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hongten/tag/tkinter/" - }, { - "date_added": "13131532874442895", - "id": "140", - "name": "画图 - 标签 - Zoctopus - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/OctoptusLian/tag/%E7%94%BB%E5%9B%BE/" - }, { - "date_added": "13131533982332808", - "id": "141", - "name": "tkinter - 随笔分类 - python客栈 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/tkinter/category/846939.html" - }, { - "date_added": "13131537130936127", - "id": "142", - "name": "python - 图形图像处理 博客园", - "type": "url", - "url": "http://www.cnblogs.com/denny402/tag/python/" - }, { - "date_added": "13131794045650099", - "id": "143", - "meta_info": { - "last_visited_desktop": "13144239739633381" - }, - "name": "SQL注入攻击 - 开始上路 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/tanshuicai/archive/2010/02/03/1664900.html" - }, { - "date_added": "13132220430797252", - "id": "146", - "meta_info": { - "last_visited_desktop": "13146042201388810" - }, - "name": "asyncio - 大诗人 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/styier/p/6415850.html" - }, { - "date_added": "13132739918599258", - "id": "150", - "name": "Java基础 - 随笔分类 - 五月的仓颉 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xrq730/category/731394.html" - }, { - "date_added": "13132740443397916", - "id": "151", - "meta_info": { - "last_visited_desktop": "13145360680638114" - }, - "name": "40个Java多线程问题总结 - 五月的仓颉 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xrq730/p/5060921.html" - }, { - "date_added": "13132746346713325", - "id": "154", - "name": "Java多线程5:synchronized锁方法块 - 五月的仓颉 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xrq730/p/4851530.html" - }, { - "date_added": "13132808953305136", - "id": "155", - "meta_info": { - "last_visited_desktop": "13145592828141271" - }, - "name": "HelloGitHub月刊 - 随笔分类 - 削微寒 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xueweihan/category/824908.html" - }, { - "date_added": "13132829080937250", - "id": "156", - "name": "Python 库大全 - 代码青春ζ - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/test404/p/6262649.html" - }, { - "date_added": "13132830104225685", - "id": "157", - "name": "Linux系统安全需要注意的一些问题 - 踏雪无痕SS - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/chenpingzhao/p/6443354.html" - }, { - "date_added": "13132830246011716", - "id": "158", - "name": "LINUX - 随笔分类 - 踏雪无痕SS - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/chenpingzhao/category/689535.html" - }, { - "date_added": "13132830925824753", - "id": "159", - "name": "剖析 Pexpect(转) - pretty_pretty_fish - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/pretty-pretty-fish/p/3233192.html" - }, { - "date_added": "13132834542968622", - "id": "160", - "meta_info": { - "last_visited_desktop": "13145361044197457" - }, - "name": "Java代码优化(长期更新) - 五月的仓颉 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xrq730/p/4865416.html" - }, { - "date_added": "13133949977532217", - "id": "169", - "name": "openresty(nginx)、lua、drizzle调研 - 一片相思林 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/huligong1234/p/4007103.html" - }, { - "date_added": "13133879386978009", - "id": "168", - "name": "OpenResty(nginx+lua) 入门 - digdeep - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/digdeep/p/4859575.html" - }, { - "date_added": "13134732669229768", - "id": "172", - "name": "build-web-application-with-golang/preface.md at master · astaxie/build-web-application-with-golang", - "type": "url", - "url": "https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md" - }, { - "date_added": "13134810262043058", - "id": "173", - "name": "golang 小知识点记录 - wangxusummer - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/wangxusummer/p/4203792.html" - }, { - "date_added": "13135424588591146", - "id": "179", - "name": "一个小时学会MySQL数据库 - 张果 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/best/p/6517755.html" - }, { - "date_added": "13135922302014936", - "id": "182", - "name": "python_21_线程+进程+协程 - 北门吹雪 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/2bjiujiu/p/6668932.html" - }, { - "date_added": "13136000461461415", - "id": "183", - "name": "jemygraw (Jemy Graw) / Repositories", - "type": "url", - "url": "https://github.com/jemygraw?page=3&tab=repositories" - }, { - "date_added": "13136541611492147", - "id": "186", - "name": "requireJS 从概念到实战 - 卷柏的花期 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/HCJJ/p/6611669.html" - }, { - "date_added": "13136541624286147", - "id": "187", - "name": "require.js入门 - 爱喝酸奶的吃货 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/yingzi1028/p/6693852.html" - }, { - "date_added": "13136608663721854", - "id": "190", - "name": "go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package", - "type": "url", - "url": "https://github.com/Go-SQL-Driver/MySQL" - }, { - "date_added": "13137164706316644", - "id": "191", - "name": "贝叶斯公式_百度百科", - "type": "url", - "url": "http://baike.baidu.com/item/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%85%AC%E5%BC%8F" - }, { - "date_added": "13137218146204390", - "id": "192", - "name": "宪哥的逆袭 - 叶炳成 -概率论 - elar - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/elaron/p/3408190.html" - }, { - "date_added": "13139649192725485", - "id": "209", - "name": "Interface 只是一个特殊的struct - 编程技术沙龙 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2029071/blog_2625413.html?mapId=4077611" - }, { - "date_added": "13139649201118820", - "id": "210", - "name": "深入Go语言模型(1):interface的底层详解 - 编程技术沙龙 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2029071/blog_2555625.html?mapId=3990547&for_statistic_from=all_group_blog" - }, { - "date_added": "13139658759765047", - "id": "211", - "name": "Golang精编100题 - 牛杰的博客", - "type": "url", - "url": "http://3ms.huawei.com/hi/blog/709791_2624655.html?for_statistic_from=interfix_blog_rec_related" - }, { - "date_added": "13139738381442953", - "id": "212", - "name": "Python面试必须要看的15个问题 - MR.QiGao - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/zhangqigao/p/6397853.html" - }, { - "date_added": "13139738387187953", - "id": "213", - "name": "《Django By Example》第一章 中文 翻译 (个人学习,渣翻) - 夜夜月月 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/levelksk/p/6152893.html" - }, { - "date_added": "13139738390101953", - "id": "214", - "name": "Python 沙箱逃逸 - Chesky - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/Chesky/p/Python_sandbox.html" - }, { - "date_added": "13139741742985703", - "id": "215", - "name": "Python3字节码指令集 - 101010 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/fortwo/archive/2013/05/13/3076780.html" - }, { - "date_added": "13140145418395924", - "id": "218", - "name": "调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令 - blcblc - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/charlesblc/p/6256912.html" - }, { - "date_added": "13140348560503099", - "id": "227", - "name": "「UI 测试自动化selenium」汇总 - 虫师 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/fnng/p/3157639.html" - }, { - "date_added": "13140685095568491", - "id": "230", - "meta_info": { - "last_visited_desktop": "13144850366012360" - }, - "name": "requests 模块 - 陨落&新生 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/shizhengwen/p/6837442.html" - }, { - "date_added": "13141298452231887", - "id": "240", - "name": "Python 资源大全中文版 - 测试之家 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/1502677/blog_2565037.html?mapId=4003407" - }, { - "date_added": "13141808550520617", - "id": "243", - "name": "大声喊出我们的口号:去他妈的WAF(SQL注入绕过) - ssooking - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/ssooking/articles/6358018.html" - }, { - "date_added": "13138879714975147", - "id": "202", - "name": "【Go命令教程】6. go doc 与 godoc - phpgo - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/phpgo/p/6442208.html" - }, { - "date_added": "13139049690425928", - "id": "203", - "name": "GO - 标签 - 黑手党老k - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/zhangym/tag/GO/" - }, { - "date_added": "13145361024957457", - "id": "317", - "meta_info": { - "last_visited_desktop": "13145361024958457" - }, - "name": "java发送http的get、post请求 - 上校 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html" - }, { - "date_added": "13145369304034639", - "id": "318", - "meta_info": { - "last_visited_desktop": "13145369304034639" - }, - "name": "Java总结篇系列:Java多线程(二) - Windstep - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/lwbqqyumidi/p/3817517.html" - }, { - "date_added": "13145369361902581", - "id": "319", - "meta_info": { - "last_visited_desktop": "13145369361902581" - }, - "name": "Java总结篇系列:Java多线程(三) - Windstep - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/lwbqqyumidi/p/3821389.html" - }, { - "date_added": "13145789737088131", - "id": "335", - "meta_info": { - "last_visited_desktop": "13145789737089131" - }, - "name": "github上总结的python资源列表 - tina的博客 - CSDN博客", - "type": "url", - "url": "http://blog.csdn.net/tina_ttl/article/details/51830845?locationNum=2&fps=1" - }, { - "date_added": "13147262821497929", - "id": "369", - "meta_info": { - "last_visited_desktop": "13147262821497929" - }, - "name": "Python3 多进程和多线程 - Coder25 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/284628487a/p/5590857.html" - }, { - "date_added": "13147262828669929", - "id": "370", - "meta_info": { - "last_visited_desktop": "13147262828669929" - }, - "name": "py编码终极版 - Yuan先生 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/yuanchenqi/articles/5956943.html" - } ], - "date_added": "13141895878657953", - "date_modified": "13147324359110243", - "id": "246", - "name": "不常用网址", - "type": "folder" - }, { - "children": [ { - "date_added": "13142501462032753", - "id": "254", - "name": "Bootstrap3 CSS样式基本用法总结 - TabWeng - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hlwyfeng/p/5182722.html" - }, { - "date_added": "13142505301315644", - "id": "256", - "name": "Redhat修改主机名_Red hat怎么永久修改主机名hostname(转) - dy9776 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/nucdy/p/5660266.html" - }, { - "date_added": "13143021887272497", - "id": "259", - "meta_info": { - "last_visited_desktop": "13144993892909182" - }, - "name": "HTML 基础篇 - 索宁 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/suoning/p/5614372.html" - }, { - "date_added": "13143527345109243", - "id": "265", - "meta_info": { - "last_visited_desktop": "13143527345109243" - }, - "name": "Bootstrap学习目录 - 小火柴的蓝色理想 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xiaohuochai/p/7097376.html" - }, { - "date_added": "13143535954702465", - "id": "266", - "meta_info": { - "last_visited_desktop": "13143535954702465" - }, - "name": "在哪里可以下载Dreamweaver软件? - 海军基地 - 3MS知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/km/groups/3271901/blogs/details/2485439" - }, { - "date_added": "13143983079455862", - "id": "272", - "meta_info": { - "last_visited_desktop": "13144128574435089" - }, - "name": "Flask扩展flask-script文档中文翻译 - agmcs - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/agmcs/articles/4445644.html" - }, { - "date_added": "13144158146786476", - "id": "278", - "meta_info": { - "last_visited_desktop": "13144158146786476" - }, - "name": "HTML5+CSS3静态页面项目-BusinessTheme的总结 - omoc - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/omoc/p/7144231.html" - }, { - "date_added": "13144469361979917", - "id": "287", - "meta_info": { - "last_visited_desktop": "13144495068538834" - }, - "name": "谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法 - ChokCoco - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/coco1s/p/5893921.html" - }, { - "date_added": "13144491566607174", - "id": "288", - "meta_info": { - "last_visited_desktop": "13144747590115362" - }, - "name": "chokcoco (Coco)", - "type": "url", - "url": "https://github.com/chokcoco" - }, { - "date_added": "13144491609986097", - "id": "289", - "meta_info": { - "last_visited_desktop": "13144730337313199" - }, - "name": "Python-Flask:利用flask_sqlalchemy实现分页效果 - 魂牵梦琳 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/Alin-2016/p/7170243.html" - }, { - "date_added": "13144495299937833", - "id": "290", - "meta_info": { - "last_visited_desktop": "13144730342127199" - }, - "name": "谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画! - ChokCoco - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/coco1s/p/6603403.html" - }, { - "date_added": "13144747948121569", - "id": "293", - "meta_info": { - "last_visited_desktop": "13144747948122569" - }, - "name": "跟着9张思维导图学习Javascript - ChokCoco - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/coco1s/p/3953653.html" - }, { - "date_added": "13144930507736355", - "id": "304", - "meta_info": { - "last_visited_desktop": "13144930507736355" - }, - "name": "css - 标签 - 司徒正美 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/rubylouvre/tag/css/default.html?page=2" - }, { - "date_added": "13144988516303259", - "id": "307", - "meta_info": { - "last_visited_desktop": "13144988516303259" - }, - "name": "纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),NB么? - sxwgf - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/sxwgf/archive/2012/01/17/2324256.html" - }, { - "date_added": "13144992512492423", - "id": "308", - "meta_info": { - "last_visited_desktop": "13144992512492423" - }, - "name": "css样式大全(整理版) - lhyterry - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/laihuayan/archive/2012/07/27/2611111.html" - }, { - "date_added": "13141896600518859", - "id": "249", - "meta_info": { - "last_visited_desktop": "13145508419031217" - }, - "name": "计算机程序的思维逻辑 - 文章列表 - 老马说编程 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/swiftma/p/5631311.html" - }, { - "date_added": "13145524570214474", - "id": "322", - "meta_info": { - "last_visited_desktop": "13145532461212619" - }, - "name": "设计基础法则总结 - Designer UCD能力中心 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2033375/thread_5347069.html?mapId=6487607&for_statistic_from=all_group_forum" - }, { - "date_added": "13145525910536251", - "id": "323", - "meta_info": { - "last_visited_desktop": "13145532441861619" - }, - "name": "如何给作品配图!清晰度?合适性?统一性? - Designer UCD能力中心 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2033375/thread_6134265.html?mapId=7712327" - }, { - "date_added": "13145526477821240", - "id": "324", - "meta_info": { - "last_visited_desktop": "13145526477821240" - }, - "name": "【Execl技巧录屏教学】 - Designer UCD能力中心 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2033375/thread_1240457.html?mapId=7764285&for_statistic_from=all_group_forum" - }, { - "date_added": "13145526600890336", - "id": "325", - "meta_info": { - "last_visited_desktop": "13145526600890336" - }, - "name": "那些年,我们看过的各种设计理论法则 - Designer UCD能力中心 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2033375/thread_6315717.html?mapId=7940835&for_statistic_from=all_group_forum" - }, { - "date_added": "13145706848268418", - "id": "328", - "meta_info": { - "last_visited_desktop": "13145706848268418" - }, - "name": "精通CSS滤镜(filter)(实例解析) - 施杨 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/shiyangxt/archive/2008/11/16/1334633.html" - }, { - "date_added": "13145768216460531", - "id": "331", - "meta_info": { - "last_visited_desktop": "13145768216461531" - }, - "name": "BootStrap学习笔记 - *茉莉花开* - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/jasmine-95/p/5266842.html" - }, { - "date_added": "13145772713508891", - "id": "332", - "meta_info": { - "last_visited_desktop": "13145772713508891" - }, - "name": "python进程、线程、协程 - 张岩林 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/aylin/p/5601969.html" - }, { - "date_added": "13145943270729807", - "id": "338", - "meta_info": { - "last_visited_desktop": "13145943270730807" - }, - "name": "mongoDB 入门指南、示例 - hoojo - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html" - }, { - "date_added": "13145943285287807", - "id": "339", - "meta_info": { - "last_visited_desktop": "13145943285288807" - }, - "name": "MongoDB数据库 - 索宁 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/suoning/p/6759367.html" - }, { - "date_added": "13145945491529530", - "id": "340", - "meta_info": { - "last_visited_desktop": "13145945491530530" - }, - "name": "Python 操作 MongoDB - 罗兵 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hhh5460/p/5838516.html" - }, { - "date_added": "13145948498020051", - "id": "341", - "meta_info": { - "last_visited_desktop": "13145948498020051" - }, - "name": "Python之with语句 - 如果的事 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/chenny7/p/4213447.html" - }, { - "date_added": "13145950279199244", - "id": "342", - "meta_info": { - "last_visited_desktop": "13145950279199244" - }, - "name": "python中 try、except、finally 的执行顺序 - ybwang1989 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/ybwang/p/4738621.html" - }, { - "date_added": "13145958399636890", - "id": "343", - "meta_info": { - "last_visited_desktop": "13145958399637890" - }, - "name": "python类的成员和装饰器 - Geek_Ma - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/geekma/archive/2013/02/18/2915623.html" - }, { - "date_added": "13145961391001600", - "id": "344", - "meta_info": { - "last_visited_desktop": "13145961391001600" - }, - "name": "python yield用法总结 - 智慧IT人生 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/python-life/articles/4549996.html" - }, { - "date_added": "13146221725907432", - "id": "347", - "meta_info": { - "last_visited_desktop": "13146221725907432" - }, - "name": "Python标准模块--collections - 老顽童2007 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/zhbzz2007/p/5986369.html" - }, { - "date_added": "13146280771559553", - "id": "348", - "meta_info": { - "last_visited_desktop": "13146718173690493" - }, - "name": "Flask源码剖析 - yz764127031的博客 - CSDN博客", - "type": "url", - "url": "http://blog.csdn.net/yz764127031/article/details/54955619?locationNum=5&fps=1" - } ], - "date_added": "13142501478426657", - "date_modified": "13146286338310224", - "id": "255", - "name": "html与css", - "type": "folder" - }, { - "children": [ { - "date_added": "13125575696916540", - "id": "89", - "name": "Welcome to Onebox", - "type": "url", - "url": "https://onebox.huawei.com/#file/1/0" - }, { - "date_added": "13125832426371278", - "id": "92", - "name": "常用排序算法的python实现和性能分析 - waterxi - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/wiki-royzhang/p/3614694.html" - }, { - "date_added": "13125832430111278", - "id": "93", - "name": "各种排序算法汇总 - wolfy - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/wolf-sun/p/4312475.html" - }, { - "date_added": "13125832438144278", - "id": "94", - "name": "浅谈算法和数据结构: 四 快速排序 - yangecnu - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/yangecnu/p/Introduce-Quick-Sort.html" - }, { - "date_added": "13128052343465743", - "id": "105", - "meta_info": { - "last_visited_desktop": "13143958781840457" - }, - "name": "哈佛商学院经典案例:不要轻易和少妇上床 - 潘文龙的博客", - "type": "url", - "url": "http://3ms.huawei.com/hi/blog/443131_1555025.html?for_statistic_from=interfix_blog_rec_related" - }, { - "date_added": "13128680248601872", - "id": "117", - "name": "中国知网", - "type": "url", - "url": "http://cnki.huawei.com/kns55/default.aspx" - }, { - "date_added": "13143545171671684", - "id": "267", - "meta_info": { - "last_visited_desktop": "13143545171672684" - }, - "name": "pyMagic:用python控制的Geek入门神器 - K1two2 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/k1two2/p/5458321.html" - }, { - "date_added": "13143545188607684", - "id": "268", - "meta_info": { - "last_visited_desktop": "13143545188607684" - }, - "name": "[TPYBoard - Micropython之会python就能做硬件 5] 学习使用重力传感器及PWM - 小五义 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/xiaowuyi/p/6426884.html" - }, { - "date_added": "13143693569057459", - "id": "269", - "meta_info": { - "last_visited_desktop": "13143693569057459" - }, - "name": "专为渗透测试人员设计的Python工具大合集 - 华为网络安全技术社区 - 3ms知识管理社区", - "type": "url", - "url": "http://3ms.huawei.com/hi/group/2034125/thread_6325065.html?mapId=7960923" - }, { - "date_added": "13144147345927733", - "id": "275", - "meta_info": { - "last_visited_desktop": "13144147345927733" - }, - "name": "Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压 - 叶剑飞Victor - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/yejianfei/p/3351626.html" - }, { - "date_added": "13144158433220621", - "id": "279", - "meta_info": { - "last_visited_desktop": "13144158433220621" - }, - "name": "学会git玩转github,结尾有惊喜!有惊喜!有惊喜! - 小君君的博客 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/qijunjun/p/7139562.html" - }, { - "date_added": "13144233443800998", - "id": "282", - "meta_info": { - "last_visited_desktop": "13144233443800998" - }, - "name": "Git常用命令总结 - 圣骑士wind - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/mengdd/p/4153773.html" - }, { - "date_added": "13144303509530972", - "id": "283", - "meta_info": { - "last_visited_desktop": "13144303509531972" - }, - "name": "SSH 本地端口转发 - Hopkings - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hopkings/p/6442057.html" - }, { - "date_added": "13144303514907972", - "id": "284", - "meta_info": { - "last_visited_desktop": "13144303514908972" - }, - "name": "linux端口转发 - stefanlee - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/stefanlee/p/3500501.html" - }, { - "date_added": "13144819694471697", - "id": "296", - "meta_info": { - "last_visited_desktop": "13144819694471697" - }, - "name": "Java 9 揭秘(11. Java Shell) - 林本托 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/IcanFixIt/p/7199108.html" - }, { - "date_added": "13144835037191107", - "id": "299", - "meta_info": { - "last_visited_desktop": "13144835037191107" - }, - "name": "sql(join on 和where的执行顺序) - higirle - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/Jessy/p/3525419.html" - }, { - "date_added": "13144849458784032", - "id": "300", - "meta_info": { - "last_visited_desktop": "13144849458784032" - }, - "name": "Ubuntu16.04下使用sublime text3搭建Python IDE - unflynaomi - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/unflynaomi/p/5704293.html" - }, { - "date_added": "13144907059004929", - "id": "303", - "meta_info": { - "last_visited_desktop": "13144907059005929" - }, - "name": "mysql--增删改查 - Kobe10 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/Kobe10/p/5764153.html" - } ], - "date_added": "13141895892228953", - "date_modified": "13144930507736355", - "id": "247", - "name": "猎奇网址", - "type": "folder" - }, { - "children": [ { - "date_added": "13143201488295515", - "id": "262", - "meta_info": { - "last_visited_desktop": "13143201488295515" - }, - "name": "JMeter录制 Http(s)脚本 - 郑永意的博客", - "type": "url", - "url": "http://3ms.huawei.com/km/blogs/details/1972219" - }, { - "date_added": "13143201513363515", - "id": "264", - "meta_info": { - "last_visited_desktop": "13143283612249085" - }, - "name": "jmeter调用IR接口,SSL配置 遇到connection reset问题解决 - 肖和飞的博客", - "type": "url", - "url": "http://3ms.huawei.com/km/blogs/details/2428779" - }, { - "date_added": "13145075349838247", - "id": "314", - "meta_info": { - "last_visited_desktop": "13145075349839247" - }, - "name": "Sublime Text 3 配置Java开发 - 指戈 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/final/p/5348350.html" - } ], - "date_added": "13143201504544515", - "date_modified": "13145361024957457", - "id": "263", - "name": "工具使用", - "type": "folder" - }, { - "children": [ { - "date_added": "13146286338310224", - "id": "351", - "meta_info": { - "last_visited_desktop": "13147167057337515" - }, - "name": "redis 学习指南 - hoojo - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/hoojo/p/4466024.html" - }, { - "date_added": "13146287882039207", - "id": "353", - "meta_info": { - "last_visited_desktop": "13146287882040207" - }, - "name": "Python—redis - J_hong - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/melonjiang/p/5342383.html" - }, { - "date_added": "13146818550619526", - "id": "356", - "meta_info": { - "last_visited_desktop": "13147167050055515" - }, - "name": "Flask0.1源码剖析 - 王博文的专栏 - CSDN博客", - "type": "url", - "url": "http://blog.csdn.net/dutsoft/article/details/70943352?locationNum=3&fps=1" - }, { - "date_added": "13146825716574112", - "id": "357", - "meta_info": { - "last_visited_desktop": "13147167053557515" - }, - "name": "flask源码剖析之上下文全局变量 - zhuma的编程学习 - CSDN博客", - "type": "url", - "url": "http://blog.csdn.net/LANGQING12345/article/details/46740551" - }, { - "date_added": "13146897031275770", - "id": "358", - "meta_info": { - "last_visited_desktop": "13147151739858370" - }, - "name": "《大话设计模式》Python版代码实现 - 五岳 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html" - }, { - "date_added": "13146910188015721", - "id": "359", - "meta_info": { - "last_visited_desktop": "13146910188016721" - }, - "name": "一定会爱上Python - 标签 - 请叫我头头哥 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/toutou/tag/%E4%B8%80%E5%AE%9A%E4%BC%9A%E7%88%B1%E4%B8%8APython/" - }, { - "date_added": "13146915986624109", - "id": "360", - "meta_info": { - "last_visited_desktop": "13146915986624109" - }, - "name": "使用公司内部源作为Docker仓库 - 刘佳的博客", - "type": "url", - "url": "http://3ms.huawei.com/km/blogs/details/2459359" - }, { - "date_added": "13146916176766544", - "id": "361", - "meta_info": { - "last_visited_desktop": "13146916176766544" - }, - "name": "内网安装docker的方法 - 徐宝馨的博客", - "type": "url", - "url": "http://3ms.huawei.com/km/blogs/details/2658009" - }, { - "date_added": "13146916204658544", - "id": "362", - "meta_info": { - "last_visited_desktop": "13146916204659544" - }, - "name": "Docker安装新手教程详解 - 禹业立的博客", - "type": "url", - "url": "http://3ms.huawei.com/km/blogs/details/1958731?l=zh-cn" - }, { - "date_added": "13146918386238185", - "id": "363", - "meta_info": { - "last_visited_desktop": "13147175033316971" - }, - "name": "我司Suse安装Python3 - 丘忠润的博客", - "type": "url", - "url": "http://3ms.huawei.com/km/blogs/details/2599747" - }, { - "date_added": "13147178436902715", - "id": "366", - "meta_info": { - "last_visited_desktop": "13147178436902715" - }, - "name": "linux下Tab及shell 补全python - yijieshusheng - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/senzhe/p/yijieshusheng.html" - }, { - "date_added": "13147324359110243", - "id": "373", - "meta_info": { - "last_visited_desktop": "13147324359110243" - }, - "name": "Linux回炉复习系列文章大纲 - 骏马金龙 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/f-ck-need-u/p/7048359.html" - }, { - "date_added": "13147441761467186", - "id": "374", - "meta_info": { - "last_visited_desktop": "13147441761468186" - }, - "name": "SSH隧道技术----端口转发,socket代理 - 登高行远 - 博客园", - "type": "url", - "url": "http://www.cnblogs.com/fbwfbi/p/3702896.html" - } ], - "date_added": "13146286370676625", - "date_modified": "13147441761467186", - "id": "352", - "name": "杂货铺子", - "type": "folder" - } ], - "date_added": "13086095051711324", - "date_modified": "13146818550619526", - "id": "1", - "name": "书签栏", - "type": "folder" - }, - "other": { - "children": [ ], - "date_added": "13086095051711324", - "date_modified": "0", - "id": "2", - "name": "其他书签", - "type": "folder" - }, - "synced": { - "children": [ ], - "date_added": "13086095051711324", - "date_modified": "0", - "id": "3", - "name": "移动设备书签", - "type": "folder" - } - }, - "version": 1 -} diff --git "a/Learn by example/Example2_python/sublime\351\205\215\347\275\256.py" "b/Learn by example/Example2_python/sublime\351\205\215\347\275\256.py" deleted file mode 100644 index b7bae38..0000000 --- "a/Learn by example/Example2_python/sublime\351\205\215\347\275\256.py" +++ /dev/null @@ -1,311 +0,0 @@ -创建项目和初始化{ -#http://www.cnblogs.com/levelksk/p/6152893.html -pip3.4 install Django==1.8.6 #pip3.4 install Django==1.8.6 -i http://10.93.135.120/pypi/simple --trusted-host 10.93.135.120 - -django-admin startproject mysite #创建一个初始化的项目文件结构,目录如下: - -manage.py:一个实用的命令行,用来与你的项目进行交互。它是一个对django-admin.py工具的简单封装。你不需要编辑这个文件。 - mysite/:你的项目目录,由以下的文件组成: - init.py:一个空文件用来告诉Python这个mysite目录是一个Python模块。 - settings.py:你的项目的设置和配置。里面包含一些初始化的设置。 - urls.py:你的URL模式存放的地方。这里定义的每一个URL都映射一个视图(view)。 - wsgi.py:配置你的项目运行如同一个WSGI应用。 - -python3.4 manage.py migrate #初始应用表将会在数据库中创建 - -python3.4 manage.py runserver #开启开发服务器 - -python3.4 manage.py runserver 10.175.102.179:8001 --settings=mysite.settings #定制的host和端口上运行开发服务 - -} - - -广泛涉猎时得到的兴趣点,可以带动学习,但边际效益表明这样的学习方式的收货会随着时间递减,自己的核心竞争力是需要对技术的再深入和磨练。一般通过大量的刷题+记录+快速迭代,可以不断的熟悉自己原先不熟的知识点,但真正的能力不是表面经验,而是对内部逻辑的反复理解而形成的习惯。 - -下周计划 学习pygame库 - - -#关于主题的几个博客 -http://www.cnblogs.com/gotodsp/p/5769342.html -http://www.cnblogs.com/woodk/p/5120074.html -http://www.cnblogs.com/mengxiaotian/p/5327826.html -http://www.cnblogs.com/damens/p/6459912.html - -#常用命令 -Ctrl+P 打开搜索框。举个栗子:1、输入当前项目中的文件名,快速搜索文件,2、输入@和关键字,查找文件中函数名,3、输入:和数字,跳转到文件中该行代码,4、输入#和关键字,查找变量名。 -Ctrl+Shift+P 打开命令框。场景栗子:打开命名框,输入关键字,调用sublime text或插件的功能,例如使用package安装插件。 -Ctrl+Shift+/ 注释多行。 - -#常用主题控制插件 -安装Package​Resource​Viewer插件后可以在控制台使用命令 -PackageResourceViewer: Open Resource -从这个Package​Resource​Viewer插件打开你的主题文件,直接搜索sidebar【侧边栏】修改配置 - - -#gosublime配置编译 - "env": { - "PATH":"C:\\go\\bin", - //"GOPATH":"D:\\godemo\\centralGame", - "GOROOT":"C:\\go" - }, - -#my Go自定义编译 -{ - "windows": - { - "cmd": "go run ${file}", - "shell":true - } - -} - - -#实例学习配置新编译系统 -{ - "path": "D:\\CodeBlocks\\MinGW\\bin", - "cmd": "g++ $file -o $file_base_name.exe", - "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", - "working_dir": "$file_path", - "selector": "source.c, source.c++", - "shell": true, - "variants": - [ - { - "name": "RUN", - "cmd": "g++ $file -o $file_base_name.exe && start $file_base_name.exe" - } - ] -} - -#解释: -文件名:CPP.sublime-build意味着在sublime中按ctrl+shift+b的时候弹出来的编译选项的名字是CPP,理论上可以随便改啦 -path:由于cmd执行程序(如g++)的时候默认会去环境变量中找,这个属性是直接来后面的路径去找,所以直接放进去g++.exe的所在目录就好 -cmd:选择CPP后执行的命令(由系统执行,可以看成是在cmd中执行的效果),这里$后面被当做变量名解析 -file_regex:正则式筛选cmd的debug信息回显 -working_dir:这个挺舒服的,工作路径,如果填了F:\test就相当于cd F:\test这个意思,所以我们后面的文件名都相对路径就好了 -selector:主要看后缀名,符合这些后缀名的文件将激活这个编译文档,这里把.c .cpp一块丢给g++就好 -shell:是否弹出cmd窗口来运行程序,true的好处是可以输入参数 -variants:这里面是CPP编译文档的副本,相当于备选编译选项,可以由多个备选,每个都用{}并列起来 -name:编译选项的小名,如果写了RUN,按ctrl+shift+b的时候就会多出来一个CPP:RUN这样的编译选项;name只能在variants中写 -cmd:此处的cmd可以覆盖外面的cmd;这里为了方便我把编译和运行写在同一句话了,如此按一下就和codeblocks里的F5(F9?不记得了...)一样爽,中间用&&连接 - - - - - #Anaconda不显示框框 -{"anaconda_linting": false} - -#DocBlockr -通过DocBlockr插件可以快速地在代码中添加各种不同风格的注释。尝试在代码中输入"/*"或者"/**",然后回车,DocBlockr会自动生成注释行。如果在函数体前面输入"/**" 类型的注释,DocBlockr还会自动生成函数的说明。 - -#sublime用户配置 -#http://3ms.huawei.com/hi/blog/8909_1571239.html -{ - "color_scheme": "Packages/Color Scheme - Default/IDLE.tmTheme", - "font_size": 11.0, - "ignored_packages": - [ - "Vintage" - ], - "theme": "Soda Dark 3.sublime-theme", - "update_check": false, - "word_wrap": "auto", - // 设置tab的大小为4 - "tab_size": 4, - // 使用空格代替tab - "translate_tabs_to_spaces": true, - // 添加行宽标尺 - "rulers": [80, 100], - // 显示空白字符 - "draw_white_space": "all", - // 保存时自动去除行末空白 - "trim_trailing_white_space_on_save": true, - // 保存时自动增加文件末尾换行 - "ensure_newline_at_eof_on_save": true, -} - - - - -在 Preference -> Setting-User的配置文件中输入 -"theme": "Soda Light.sublime-theme" -"theme": "Soda Light 3.sublime-theme" - -如果想要深色的就输入: -"theme": "Soda Dark.sublime-theme" -"theme": "Soda Dark 3.sublime-theme" - -[ -// QUICK PANEL - { - "class": "quick_panel_label", - "fg": [50, 50, 50, 255], - "match_fg": [243, 119, 34, 255], - "selected_fg": [25, 25, 25, 255], - "selected_match_fg": [243, 119, 34, 255] - }, - { - "class": "quick_panel_score_label", - "fg": [0,170,170, 255], - "selected_fg": [0,170,170, 255] - } -] - -Settings-User配置: -{ -  "theme": "Soda Light 3.sublime-theme", -  "color_scheme": "Packages/Color Scheme - Default/IDLE.tmTheme", -  "font_size": 11, -  "ignored_packages": -  [ -  "Vintage" -  ], -  "show_encoding": true, -  "soda_classic_tabs": true, -  "soda_folder_icons": true, - -  "highlight_line": true,    // 高亮显示当前行 -  "fade_fold_buttons": false, // 代码折叠按钮一直显示 -  "show_encoding": true,    // 显示当前文件的编码 -  "bold_folder_labels": true, // 加粗文件夹名称 -  "highlight_modified_tabs": true,      // 着重标示修改过的文件 -  "trim_trailing_white_space_on_save": true, // 保存时去掉行尾无用空格 -  "show_full_path": true,           // 显示全路径,默认 -  // "show_line_endings": true, -  // "draw_white_space": "all",        // 显示所有空格,"none"|"selection"|"all" -  // "sublime_enhanced_keybindings": true, // 转到上一次编辑的地方 -  // "word_wrap": true,            // 文字根据屏幕大小自动换行,防止水平滚动 true | false | "auto" -  // "save_on_focus_lost": true,        // 焦点丢失后自动保存 - -} - - -以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标。 - -选择类 - -Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 - -Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名、函数名等。 - -Ctrl+L 选中整行,继续操作则继续选择下一行,效果和 Shift+↓ 效果一样。 - -Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,即可同时编辑这些行。 - -Ctrl+Shift+M 选择括号内的内容(继续选择父括号)。举个栗子:快速选中删除函数中的代码,重写函数体代码或重写括号内里的内容。 - -Ctrl+M 光标移动至括号内结束或开始的位置。 - -Ctrl+Enter 在下一行插入新行。举个栗子:即使光标不在行尾,也能快速向下插入一行。 - -Ctrl+Shift+Enter 在上一行插入新行。举个栗子:即使光标不在行首,也能快速向上插入一行。 - -Ctrl+Shift+[ 选中代码,按下快捷键,折叠代码。 - -Ctrl+Shift+] 选中代码,按下快捷键,展开代码。 - -Ctrl+K+0 展开所有折叠代码。 - -Ctrl+← 向左单位性地移动光标,快速移动光标。 - -Ctrl+→ 向右单位性地移动光标,快速移动光标。 - -shift+↑ 向上选中多行。 - -shift+↓ 向下选中多行。 - -Shift+← 向左选中文本。 - -Shift+→ 向右选中文本。 - -Ctrl+Shift+← 向左单位性地选中文本。 - -Ctrl+Shift+→ 向右单位性地选中文本。 - -Ctrl+Shift+↑ 将光标所在行和上一行代码互换(将光标所在行插入到上一行之前)。 - -Ctrl+Shift+↓ 将光标所在行和下一行代码互换(将光标所在行插入到下一行之后)。 - -Ctrl+Alt+↑ 向上添加多行光标,可同时编辑多行。 - -Ctrl+Alt+↓ 向下添加多行光标,可同时编辑多行。 - -编辑类 - -Ctrl+J 合并选中的多行代码为一行。举个栗子:将多行格式的CSS属性合并为一行。 - -Ctrl+Shift+D 复制光标所在整行,插入到下一行。 - -Tab 向右缩进。 - -Shift+Tab 向左缩进。 - -Ctrl+K+K 从光标处开始删除代码至行尾。 - -Ctrl+Shift+K 删除整行。 - -Ctrl+/ 注释单行。 - -Ctrl+Shift+/ 注释多行。 - -Ctrl+K+U 转换大写。 - -Ctrl+K+L 转换小写。 - -Ctrl+Z 撤销。 - -Ctrl+Y 恢复撤销。 - -Ctrl+U 软撤销,感觉和 Gtrl+Z 一样。 - -Ctrl+F2 设置书签 - -Ctrl+T 左右字母互换。 - -F6 单词检测拼写 - -搜索类 - -Ctrl+F 打开底部搜索框,查找关键字。 - -Ctrl+shift+F 在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找,略高端,未研究。 - -Ctrl+P 打开搜索框。举个栗子:1、输入当前项目中的文件名,快速搜索文件,2、输入@和关键字,查找文件中函数名,3、输入:和数字,跳转到文件中该行代码,4、输入#和关键字,查找变量名。 - -Ctrl+G 打开搜索框,自动带:,输入数字跳转到该行代码。举个栗子:在页面代码比较长的文件中快速定位。 - -Ctrl+R 打开搜索框,自动带@,输入关键字,查找文件中的函数名。举个栗子:在函数较多的页面快速查找某个函数。 - -Ctrl+: 打开搜索框,自动带#,输入关键字,查找文件中的变量名、属性名等。 - -Ctrl+Shift+P 打开命令框。场景栗子:打开命名框,输入关键字,调用sublime text或插件的功能,例如使用package安装插件。 - -Esc 退出光标多行选择,退出搜索框,命令框等。 - -显示类 - -Ctrl+Tab 按文件浏览过的顺序,切换当前窗口的标签页。 - -Ctrl+PageDown 向左切换当前窗口的标签页。 - -Ctrl+PageUp 向右切换当前窗口的标签页。 - -Alt+Shift+1 窗口分屏,恢复默认1屏(非小键盘的数字) - -Alt+Shift+2 左右分屏-2列 - -Alt+Shift+3 左右分屏-3列 - -Alt+Shift+4 左右分屏-4列 - -Alt+Shift+5 等分4屏 - -Alt+Shift+8 垂直分屏-2屏 - -Alt+Shift+9 垂直分屏-3屏 - -Ctrl+K+B 开启/关闭侧边栏。 - -F11 全屏模式 - -Shift+F11 免打扰模式 diff --git "a/Learn by example/Example2_python/yield\347\224\250\346\263\225\346\200\273\347\273\223.py" "b/Learn by example/Example2_python/yield\347\224\250\346\263\225\346\200\273\347\273\223.py" deleted file mode 100644 index 89d23bb..0000000 --- "a/Learn by example/Example2_python/yield\347\224\250\346\263\225\346\200\273\347\273\223.py" +++ /dev/null @@ -1,61 +0,0 @@ -def fab(max): - n, a, b = 0, 0, 1 - while n < max: - yield b - # print b - a, b = b, a + b - n = n + 1 - -for n in fab(5): - print(n) - - -# 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数, -# Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时, -# 每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行, -# 而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。 - -# python yield用法总结 -# http://www.cnblogs.com/python-life/articles/4549996.html - -def read_file(fpath): - BLOCK_SIZE = 5 - with open(fpath, 'rb') as f: - while True: - block = f.read(BLOCK_SIZE) - if block: - yield block - else: - return - -for x in read_file("./1.py"): - print(x) - -# 当一个函数中含有yield时, 它不再是一个普通的函数, 而是一个生成器.当该函数被调用时不会自动执行, 而是暂停, -# 调用函数.next()才会被执行,如一个函数中出现多个yield则next()会停止在下一个yield前 - ->> > def fun(): -... print 'start...' -... a, b = 1, 1 -... m = yield 5 -... print m -... print 'middle...' -... d = yield 12 -... print d -... print 'end...' -... ->> > m = fun() // 函数未调用,而是创建一个生成器对象 ->> > next(m) // 调用next()执行函数,执行到下一个yield前,返回yield后面的值, 并且保留当前区域所有变量状态a = 1, b = 1 -start... -5 ->> > m.send('message') // send(value)与next类似, 唤醒到上一次生成器暂停的位置执行,并把value值传给yield表达式, 即yield 5表达式的值是message -message // send()传递进来的 -middle... -12 ->> > next(m) -None // next()相当于send(None), 传递给yield表达式的值是None,所以d的值是None -end... -Traceback(most recent call last): - File "", line 1, in < module > -StopIterationf - diff --git "a/My Summary/Go\345\255\246\344\271\240\346\200\273\347\273\223.c" "b/My Summary/Go\345\255\246\344\271\240\346\200\273\347\273\223.c" deleted file mode 100644 index f6879d0..0000000 --- "a/My Summary/Go\345\255\246\344\271\240\346\200\273\347\273\223.c" +++ /dev/null @@ -1,4798 +0,0 @@ -//Go学习总结--2017/3/20 -//https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md -//https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md - -//基础语法 -1.变量的定义{ - -var v1 int -var v2 string -var v3 [10]int // 数组 ---数组有固定长度 -var v31 [...]int{1,2,3,4}// 数组 --- "..."会推断数组的长度 -var v4 []int // 数组切片 ,只定义 -v41 := []int{} // 数组切片,定义并赋值 -var v5 struct { - f int -} -var v6 *int // 指针 -var v7 map[string]int // map,key为string类型,value为int类型 -var v8 func(a int) int - -} -2.变量的初始化{ -var v1 int = 10 // 正确的使用方式1 -var v2 = 10 // 正确的使用方式2,编译器可以自动推导出v2的类型 -v3 := 10 // 正确的使用方式3,编译器可以自动推导出v3的类型 -#三种方式完全一样 -} -3.支持交换{ -交换i和j变量的语句: -i, j = j, i -} -4.常量{ -const Pi float64 = 3.14159265358979323846 -const zero = 0.0 // 无类型浮点常量 -const ( - size int64 = 1024 - eof = -1 // 无类型整型常量 -) -const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值 -const a, b, c = 3, 4, "foo" -// a = 3, b = 4, c = "foo", 无类型整型和字符串常量 - -} -5.预定义常量{ -Go语言预定义了这些常量:true、false和iota。 -iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被 -重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。 -从以下的例子可以基本理解iota的用法: -const ( // iota被重设为0 - c0 = iota // c0 == 0 - c1 = iota // c1 == 1 - c2 = iota // c2 == 2 -) -#这里写的并不完全,如果用到更深的操作,可以查看文档 -} -6.类型 { - -Go语言内置以下这些基础类型: - 布尔类型:bool。 - 整型:int8、byte、int16、int、uint、uintptr等。 - 浮点类型:float32、float64。 - 复数类型:complex64、complex128。 - 字符串:string。 - 字符类型:rune。 - 错误类型:error。 -此外,Go语言也支持以下这些复合类型: - 指针(pointer) - 数组(array) - 切片(slice) - 字典(map) - 通道(chan) - 结构体(struct) - 接口(interface) -} -7.位运算{ -x << y 左移 124 << 2 // 结果为496 -x >> y 右移 124 >> 2 // 结果为31 -x ^ y 异或 124 ^ 2 // 结果为126 -x & y 与 124 & 2 // 结果为0 -x | y 或 124 | 2 // 结果为126 -^x 取反 ^2 // 结果为3 -} -8.字符串{ -var str string // 声明一个字符串变量 -str = "Hello world" // 字符串赋值 -ch := str[0] // 取字符串的第一个字符 -#但字符串的内容不能在初始化后被修改 -x + y 字符串连接 "Hello" + "123" // 结果为Hello123 -len(s) 字符串长度 len("Hello") // 结果为5 -s[i] 取字符 "Hello" [1] // 结果为'e' - -#更多的字符串操作,请参考标准库strings包。 - -8.1字符串遍历 - Go语言支持两种方式遍历字符串。 - #一种是以字节数组的方式遍历: - str := "Hello,世界" - n := len(str) - for i := 0; i < n; i++ { - ch := str[i] // 依据下标取字符串中的字符,类型为byte - fmt.Println(i, ch) - } - #另一种是以Unicode字符遍历: - str := "Hello,世界" - for i, ch := range str { - fmt.Println(i, ch)//ch的类型为rune - } - #每个中文字符在UTF-8中占3个字节,而不是1个字节。 -} -9.字符类型{ -在Go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。 -Go标准库的unicode包。另外unicode/utf8包也提供了UTF8和Unicode之间的转换。 -} -10.数组{ -10.1.数组就是指一系列同一类型数据的集合,数组长度在定义后就不可更改 - #以下为一些常规的数组声明方法: - [32]byte // 长度为32的数组,每个元素为一个字节 - [2*N] struct { x, y int32 } // 复杂类型数组 - [1000]*float64 // 指针数组 - *[1000]float64 // 数组的指针 - [3][5]int // 二维数组 - [2][2][2]float64 // 等同于[2]([2]([2]float64)) - a := [3]int{1, 2} // 未初始化元素值为 0。 - b := [...]int{1, 2, 3, 4} // 通过初始化值确定数组长度。------> ... 可以推断数组长度 - c := [5]int{2: 100, 4:200} // 使用索引号初始化元素。 - //总结就是 数组是有固定长度的,切片长度不固定。 -10.2.遍历: - for i := 0; i < len(array); i++ { - fmt.Println("Element", i, "of array is", array[i]) - } - for i, v := range array { - fmt.Println("Array element[", i, "]=", v) - } - -10.3.值类型 -在Go语言中数组是一个值类型(value type)。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,则在函数调用时该 -参数将发生数据复制。因此,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所传入数组的一个副本。 - -} -11.数组切片{ -11.1.数组切片的数据结构可以抽象为以下3个变量: - // ()转换 - // {}元素 - e1 := []byte("a string") - e2 := []byte{'a', 'c', 24, 45, 75} - - struct Slice - { - byte* array; // 一个指向原生数组的指针; - uintgo len; // 数组切片中的元素个数; - uintgo cap; // 数组切片已分配的存储空间。 - }; - //引用类型。但自身本质是结构体,值拷贝传递。 -11.2.基于数组、直接创建、切片创建切片 - // 先定义一个数组 - var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - // 基于数组创建一个数组切片 - var mySlice []int = myArray[:5] - - //创建一个初始元素个数为5的数组切片,元素初始值为0: - mySlice1 := make([]int, 5) - //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间: - mySlice2 := make([]int, 5, 10) - //直接创建并初始化包含5个元素的数组切片: - mySlice3 := []int{1, 2, 3, 4, 5} - //创建一个初始元素个数为0的数组切片,元素初始值为[]: - var mySlice4 []int - mySlice5 :=[]int{} - //无论是基于数组还是切片,新产生的切片都会影响原数组或切片。原因如下: - slice总是指向底层的一个array。slice是一个指向array的指针,这是其与array不同的地方; - slice是引用类型,这意味着当赋值某个slice到另外一个变量,两个引用会指向 - 同一个array。例如,如果一个函数需要一个slice参数,在其内对slice元素的 - 修改也会体现在函数调用者中,这和传递底层的array指针类似。 -11.3.append - mySlice = append(mySlice, 1, 2, 3) - 函数append()的第二个参数其实是一个不定参数,我们可以按自己需求添加若干个元素, - 甚至直接将一个数组切片追加到另一个数组切片的末尾: - mySlice2 := []int{8, 9, 10} - // 给mySlice后面添加另一个数组切片 - mySlice = append(mySlice, mySlice2...) - append分配一个足够大的、新的slice来存放原有slice的元素和追加 - 的值。因此,返回的slice可能指向不同的底层array。 -11.4.copy - slice1 := []int{1, 2, 3, 4, 5} - slice2 := []int{5, 4, 3} - - copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中 - copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置 - - -} -12.函数参数传值、闭包传引用{ - -什么叫传引用? -比如有以下代码: -var a Object -doSomething(a) // 修改a的值 -print(a) - -//如果函数doSomething修改a的值, 然后print打印出来的也是修改后的值, 那么就可以认为doSomething是通过引用的方式使用了参数a. - -//可以参考 22.值语义与引用语义 -//http://www.cnblogs.com/dasn/articles/5826923.html -//http://3ms.huawei.com/hi/group/2029033/thread_3979985.html?mapId=2928431 -总结: -函数参数传值, 闭包传引用! -slice 含 values/count/capacity 等信息, 是按值传递 -按值传递的 slice 只能修改values指向的数据, 其他都不能修改 -slice 是结构体和指针的混合体 -引用类型和传引用是两个概念 - -//但是因为slice和map/chan底层结构的差异, 又导致了它们传值的影响并不完全等同.-->ps:我的理解-->复制传入函数的那一份中指针部分和原版是相同的,当随后函数中修改的部分是指针部分时就会影响原来的值,所以, 引用类型一般都是底层指针实现, 只是在上层加上的语法糖而已 -重点归纳如下: -GoSpec: the parameters of the call are passed by value! -map/slice/chan 都是传值, 不是传引用 -map/chan 对应指针, 和引用类似 -slice 是结构体和指针的混合体 -slice 含 values/count/capacity 等信息, 是按值传递 -slice 中的 values 是指针, 按值传递 -按值传递的 slice 只能修改values指向的数据, 其他都不能修改 -以指针或结构体的角度看, 都是值传递! - -12.1例子1{ - package main - - import ( - //"io" - //"os" - //"reflect" - "fmt" - //"sync" - ) - - //函数参数传值, 闭包传引用! - //slice 含 values/count/capacity 等信息, 是按值传递 - //按值传递的 slice 只能修改values指向的数据, 其他都不能修改 - //slice 是结构体和指针的混合体 - func main() { - - a := [3]int{0, 1, 2} //数组,长度必须是定值 - b := a[:] //引用a,成为切片,共享内存地址 - c := a //复制a,地址不同,同为数组 - fmt.Println("a在被使用前:", a) - fmt.Printf("a:%p\nb:%p\nc:%p\n", &a, &b, &c) - change1(a) - fmt.Println("a值传递使用后:", a) - fmt.Println(a,b,c) - change2(&a) - fmt.Println("a引用使用后:", a) - fmt.Printf("a:%p\nb:%p\nc:%p\n", &a, &b, &c) - fmt.Println(a,b,c) - //循环的次数已经在传入时确定,改变a,也不会影响循环 - //闭包传引用 - for i, _ := range c { - c[i] = 10 - } - fmt.Println("range是引用类型,c引用使用后:", c) - fmt.Printf("a:%p\nb:%p\nc:%p\n", &a, &b, &c) - fmt.Println(a,b,c) - } - //函数传值 - func change1(a [3]int) [3]int { - a[0] = 10 - return a - } - func change2(a *[3]int) [3]int { - a[0] = 10 - return *a - } - - -//值类型和引用类型的区别,就在于当函数参数传递的时候. -//值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的 -//而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了. - -/* -a在被使用前: [0 1 2] -a:0xc04203c3c0 -b:0xc04203c3e0 -c:0xc04203c400 -a值传递使用后: [0 1 2] -[0 1 2] [0 1 2] [0 1 2] -a引用使用后: [10 1 2] -a:0xc04203c3c0 -b:0xc04203c3e0 -c:0xc04203c400 -[10 1 2] [10 1 2] [0 1 2] -range是引用类型,c引用使用后: [10 10 10] -a:0xc04203c3c0 -b:0xc04203c3e0 -c:0xc04203c400 -[10 1 2] [10 1 2] [10 10 10] -*/ - } -12.2例子2{ - package main - import "fmt" - //import "reflect" - func main() { - alist := []int{1, 2, 3, 4}//切片->直接传入 - blist := [4]int{1, 2, 3, 4}//数组1->直接传入 - blist2 := [4]int{1, 2, 3, 4}//数组2->指针传入 - c := 100//变量1->直接传入 - d := 200//变量2->指针传入 - fmt.Println("原始值:", alist, blist, blist2, c, d) - demo(alist, blist, &blist2, c, &d) - //1.想要改变非引用型变量的值,需要传入 &d(变量的地址),2.想要改变值类型变量的值也需要传入&blist2 3.slice是一个指向array的指针,所以切片传入时不需要加 &,引用型变量都不用加 - fmt.Println("使用后:", alist, blist, blist2, c, d) - } - - //内建变量与引用型变量传入函数的区别 - func demo(la []int, lb [4]int, lc *[4]int, c int, d *int) { - la[0] = 10 - lb[0] = 10 // *lb[0] = 10 这样是错误的 - lc[0] = 10 //在函数中使用不用加* - c = 1000 - *d = 1000 //非引用型变量在函数中使用需要加 * 才能被使用 - } - - /*重点!! - & 取一个变量的地址 - * 取指针变量所指向的地址中的值 - - 引用类型包括 slice、map 和 channel - 数组算是值类型 - */ - - /*结果 - 原始值: [1 2 3 4] [1 2 3 4] [1 2 3 4] 100 200 - 使用后: [10 2 3 4] [1 2 3 4] [10 2 3 4] 100 1000 -*/ -} - -} -13.类型转换{ -//<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言 -//<目标类型的值> := <表达式>.( 目标类型 )  //非安全类型断言 -func test6() { - var i interface{} = "TT" - j, b := i.(int) - if b { - fmt.Printf("%T->%d\n", j, j) - } else { - fmt.Println("类型不匹配") - } -} //断言式 安全类型转换 - -func echoArray(a interface{}){ - b,c:=a.([]int)//通过断言实现类型转换 - if c { - for _,v:=range b{ -    fmt.Print(v," ") -   } -   fmt.Println() -   return - }  -}  - -//合法转换 -{ - + From xb[]byte xi[]int xr[]rune s string f float32 i int - + To - + []byte []byte(s) - + []int []int(s) - + []rune []rune(s) - + string string(xb) string(xi) string(xr) - + float32 float32(i) - + int int(f) - - //例子 - b := []byte{'h','e','l','l','o'} 复合声明 - s := string(b) - i := []rune{257,1024,65} - r := string(i) - -} - -//进阶 Go语言要求不同的类型之间必须做显示的转换。转化分为 类型转换和接口转化。 -{ - #X类型需要转换为Y类型,语法是y(x),如果对于某些地方的优先级拿不准可以自己加()约束,变成(T)(X)。如: - *Point(p) // 和 *(Point(p))一样 - (*Point)(p) // p 转换成 *Point - (func())(x) // x 转换成func() - (func() int)(x) // x 转换 func() int - - //接口转换 - 比如有以下2个接口类型: - type IA interface {} - type IB interface {Foo()} - - IA要向IB转换: - var a A - var b = a.(B) - IB像IA转换: - var b B - var a = A(b) - - 上面两个转换的区别: - 1、首先要意识到IB比IA多了个方法Foo(),它是IA的子集。 - 2、IA转成IB,是由一般向特殊的转换,不一定能成功,所以要用断言a.(B) ,从“断言”这个字面意思也可以理解要“判断”一下,不一定能成功。 - 3、IB转化成IA,是由特殊向一般的转化,直接A(b)强制转化就可以了。 -} -//go中基础类型比如string,int,bool之间的转化需要用strconv包。 - - -} -14.map{ - //复合型map - f := map[string]interface{}{"a": 1, "b": 2, "c": "c", "d": []string{"aa", "bb", "cc"}} - fmt.Println(f["d"]) -// PersonInfo是一个包含个人详细信息的类型 -type PersonInfo struct { - ID string - Name string - Address string -} -14.1.变量声明 -var myMap map[string] PersonInfo -//myMap是声明的map变量名,string是键的类型,PersonInfo则是其中所存放的值类型。 -14.2.创建 -//可以使用Go语言内置的函数make()来创建一个新map。下面的这个例子创建了一个键类型为string、值类型为PersonInfo的map: -myMap = make(map[string] PersonInfo) -//也可以选择是否在创建时指定该map的初始存储能力,下面的例子创建了一个初始存储能力为100的map: -myMap = make(map[string] PersonInfo, 100) -14.3.元素赋值 -myMap["1234"] = PersonInfo{"1", "Jack", "Room 101,..."} -14.4.元素删除 -//Go语言提供了内置函数delete(),用于删除容器内的元素 -delete(myMap, "1234") -14.5.查找 -要从map中查找一个特定的键,可以通过下面的代码来实现: -value, ok := myMap["1234"] -if ok { // 找到了 - // 处理找到的value -} - -} -15.流程控制{ -//Go语言支持如下的几种流程控制语句: - 条件语句,对应的关键字为if、else和else if; - 选择语句,对应的关键字为switch、case和select(将在介绍channel的时候细说); - 循环语句,对应的关键字为for和range; range迭代器操作,返回 (索引, 值) 或 (键, 值)。 - 跳转语句,对应的关键字为goto。 -Go语言还添加了如下关键字:break、continue和fallthrough。 -//在有返回值的函数中,不允许将“最终的”return语句包含在if...else...结构中否则会编译失败: - -//例子 -{ - switch i { - case 0: - fmt.Printf("0") - case 1: - fmt.Printf("1") - case 2: - fallthrough - case 3: - fmt.Printf("3") - case 4, 5, 6: - fmt.Printf("4, 5, 6") - default: - fmt.Printf("Default") -} -运行上面的案例,将会得到如下结果: - i = 0时,输出0; - i = 1时,输出1; - i = 2时,输出3; - i = 3时,输出3; - i = 4时,输出4, 5, 6; - i = 5时,输出4, 5, 6; - i = 6时,输出4, 5, 6; - i = 其他任意值时,输出Default。 -//只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case; -//它不会匹配失败后自动向下尝试,但是可以使用 fallthrough 使其这样做。没有fallthrough: - switch i { - case 0: // 空的 case 体 - case 1: - f() // 当 i == 0 时,f 不会被调用! - } - //而这样: - switch i { - case 0: fallthrough - case 1: - f() // 当 i == 0 时,f 会被调用! - } - - -//循环嵌套循环时,可以在break后指定标签。用标签决定哪个循环被终止: - - J: - for j := 0; j < 5; j++ { - for i := 0; i < 10; i++ { - if i > 5 { - break J //现在终止的是 j 循环,而不是 i 的那个 - } - println(i) - } - } -//利用continue让循环进入下一个迭代,而略过剩下的所有代码。下面循环打印了0到5。 - for i := 0; i < 10; i++ { - if i > 5 { - continue //跳过循环中所有的代码 - println(i) - - } - - } -//保留字range可用于循环。它可以在slice、array、string、map和channel。range是个迭代器,当被调用的时候,从它循环的内容中返回一个键值对。 -//基于不同的内容,range返回不同的东西。当对slice或者array做循环时,range返回序号作为键,这个序号对应的内容作为值。考虑这个代码: - list := []string{"a", "b", "c", "d", "e", "f"} - - for k, v := range list { - // 对 k 和 v 做想做的事情 - } - //例子 - func main() { - L1: - for x := 0; x < 3; x++ { - L2: - for y := 0; y < 5; y++ { - if y > 2 { continue L2 } - if x > 1 { break L1 } - print(x, ":", y, " ") - } - println() - } - } - //输出: - 0:0 0:1 0:2 - 1:0 1:1 1:2 - //附:break 可用于 for、switch、select, continue 仅能用于 for 循环。 - - //例子 - - import "fmt" - import "reflect" - - func main() { - a := [...]int{1, 2, 3, 4, 5} - //fmt.Println("a的type:", reflect.TypeOf(a)) - for i, v := range a { // index、value 都是从复制品中取出。 - if i == 0 { // 在修改前,我们先修改原数组。 - a[1], a[2] = 999, 999 - fmt.Println(a) // 确认修改有效,输出 [0, 999, 999]。 - } - a[i] = v + 100 // 使用复制品中取出的 value 修改原数组。 - fmt.Println("range中:", a) - } - fmt.Println("range外:", a) // 输出 [100, 101, 102]。 - - ////对比可以看出,range内修改数组也是生效的,会影响原数组 - - s := []int{1, 2, 3, 4, 5} - fmt.Println("s的type:", reflect.TypeOf(s)) - for i, v := range s { // 复制 struct slice { pointer, len, cap }。 - if i == 0 { - s = s[:3] // 对 slice 的修改,不会影响 range。 - s[2] = 100 // 对底层数据的修改。 - } - fmt.Println(i, v) - } - fmt.Println("range外的s:", s) - ////对比可以看出,range内修改切片也是生效的,会影响原切片 - } - //总结就是 range 会复制 struct array slice { pointer, len, cap },在range中可以改变这些变量的值,但改变后并不会影响本次遍历 - - -} -} -16.预定义函数{ -//Table 2.3. Go中的预定义函数与保留字: -close new panic complex delete make recover real len append print imag cap copy println -/*用处 -close 用于channel通讯。使用它来关闭channel -delete 用于在map中删除实例 -len和cap 可用于不同的类型, len用于返回字符串、slice和数组的长度 -copy 用于复制slice。 -append 用于追加slice -panic和recover 用于异常处理机制。 -print和println 是底层打印函数,可以在不引入 fmt包的情况下使用。它们主要用于调试。 -*/ -//Table 2.2. Go中的保留字 -break default func interface select -case defer go map struct -chan else goto package switch -const fallthrough if range type -continue for import return var - -#new分配;make初始化 -{ -• new(T)返回*T指向一个零值T -• make(T)返回初始化后的T -//当然make仅适用于slice,map和channel。 - var p *[]int = new([]int) //分配 slice 结构内存;*p == nil已经可用 - var v []int = make([]int, 0) //v 指向一个新分配的有 0 个整数的数组。 - fmt.Println(p) //&[] - fmt.Println(v) //[] -} -} -17.指针{ -p = &i //获取 i 的地址 -*p = 8 //修改 i 的值 - -func zhizheng() { - var p *int //在p是一个指向整数值的指针,所有新定义的变量都被赋值为其类型的零值 - fmt.Println(p) // 打印 nil - var i int //定义一个整形变量 i - p = &i //使得 p 指向 i,获取 i 的地址 - fmt.Println(p) //打印出来的内容类似 0x7ff96b81c000a - *p = 8 //修改 i 的值 - fmt.Println(*p) //打印 8 - fmt.Println(i) // 同上 -} -} -18.函数{ - -type mytype int //新的类型 -func (p mytype) funcname(q int) (r,s int) { //函数的结构 - //do something - return 0,0 - } - -保留字func用于定义一个函数; -1 函数可以定义用于特定的类型,这类函数更加通俗的称呼是method。这部分称作receiver而它是可选的。 -2 funcname是你函数的名字 -3 int类型的变量q作为输入参数。参数用pass-by-value方式传递,意味着它们会被复制; -4 变量r和s是这个函数的命名返回值。在Go的函数中可以返回多个值。如果不想对返回的参数命名,只需要提供类型:(int,int)。如果只有一个返回值,可以省略圆括号。如果函数是一个子过程,并且没有任何返回值,也可以省略这些内容. -5 这是函数体,注意return是一个语句,所以包裹参数的括号是可选的。 - -//因此需要先牢记这样的规则:小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。 -//这个规则也适用于类型和变量的可见性。 - -//任意类型的不定参数 -之前的例子中将不定参数类型约束为int,如果你希望传任意类型,可以指定类型为interface{}。下面是Go语言标准库中fmt.Printf()的函数原型: - func Printf(format string, args ...interface{}) { - // ... - } -//匿名函数与调用 - f := func(x, y int) int { - return x + y - } - - func(ch chan int) { - ch <- ACK - } (reply_chan) // 花括号后直接跟参数列表表示函数调用 - -} -19.作用域{ -在Go中,定义在函数外的变量是全局的,那些定义在函数内部的变量,对于 -函数来说是局部的。如果命名覆盖——一个局部变量与一个全局变量有相同的 -名字——在函数执行的时候,局部变量将覆盖全局变量。 -} -20.defer{ -//Go有了defer语句。在defer后指定的函数会在函数退出前调用。 - func ReadWrite() bool { - file.Open("file") - defer file.Close() //file.Close() 被添加到了 defer 列表 - } - - //可以将多个函数放入“延迟列表”中 - for i := 0; i < 5; i++ { - defer fmt.Printf("%d ", i) - } - //延迟的函数是按照后进先出(LIFO)的顺序执行,所以上面的代码打印:4 3 2 1 0 - - //利用defer甚至可以修改返回值,假设正在使用命名结果参数和闭包函数 - defer func() {//匿名函数的定义方式 - /* ... */ - }() //() 在这里是必须的 - - defer func(x int) { - /* ... */ - }(5) //为输入参数 x 赋值 5 - - //在defer中修改返回值 - func f() (ret int) { //ret 初始化为零 - defer func() { - ret++ //ret 增加为 1 - }() - return 0 //返回的是 1 而不是 0 - } - -} -21.Go的面向对象{ -//在Go语言中,面向对象的神秘面纱被剥得一干二净。对比下面的两段代码: -func (a Integer) Less(b Integer) bool { // 面向对象 - return a < b -} -func Integer_Less(a Integer, b Integer) bool { // 面向过程 - return a < b -} - -a.Less(2) // 面向对象的用法 -Integer_Less(a, 2) // 面向过程的用法 - -//Go语言和C语言一样,类型传入函数时都是基于值传递的。要想修改变量的值,只能传递指针。 -} -22.值语义和引用语义 { -//值语义和引用语义的差别在于赋值,比如下面的例子: -b = a -b.Modify() -//如果b的修改不会影响a的值,那么此类型属于值类型。如果会影响a的值,那么此类型是引用类型。 - -//Go语言中的大多数类型都基于值语义,包括: - 基本类型,如byte、int、bool、float32、float64和string等; - 复合类型,如数组(array)、结构体(struct)和指针(pointer)等。 - -//Go语言中有4个类型比较特别,看起来像引用类型,如下所示。 - 数组切片:数组切片内部是指向数组的指针,所以可以改变所指向的数组元素并不奇怪。数组切片类型本身的赋值仍然是值语义。 - map:map本质上是一个字典指针 - channel:执行体(goroutine)间的通信设施。 - 接口(interface):对一组满足某个契约的类型的抽象。 - -//按值传递(call by value) 按引用传递(call by reference) - -Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。 - -如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针。如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。(译者注:指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址。所以,按引用传递也是按值传递。) - -几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。 - -在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。 -} -23.结构体与方法{ - //定义一个矩形类型: - type Rect struct { - x, y float64 - width, height float64 //小写的对外不可见 - } - //定义成员方法Area()来计算矩形的面积: - func (r *Rect) Area() float64 { - return r.width * r.height - } - //初始化结构体 - rect1 := new(Rect) - rect2 := &Rect{} - rect3 := &Rect{0, 0, 100, 200} - rect4 := &Rect{width: 100, height: 200} - - //这里只能定义类型,不能带默认值!! - type my struct{ - A string - B string - C string - } - - func main(){ - fmt.Println("Hello World") - a:=my{"a","bb","ccc"} - fmt.Println(a.A) - b:=new(my) - *b=my{"c","d","e"} - fmt.Println(b.A) - - } -//在Go语言中,未进行显式初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false,int类型的零值为0,string类型的零值为空字符串。 -//注意首字母大写的字段可以被导出,也就是说,在其他包中可以进行读写。字段名以小写字母开头是当前包的私有的 - - #方法 - 可以对新定义的类型创建函数以便操作,可以通过两种途径: - 1. 创建一个函数接受这个类型的参数。 - - func doSomething(in1 *NameAge, in2 int) { /* ... */ } - - 2. 创建一个工作在这个类型上的函数: - - func (in1 *NameAge) doSomething(in2 int) { /* ... */ } - - //可以类似这样使用: - var n *NameAge - n.doSomething(2) - 3. 每个类型都有与之关联的方法集,这会影响到接口实现规则。 - •类型 T 方法集包含全部 receiver T 方法。 - •类型 *T 方法集包含全部 receiver T + *T 方法。 - •如类型 S 包含匿名字段 T,则 S 方法集包含 T 方法。 - •如类型 S 包含匿名字段 *T,则 S 方法集包含 T + *T 方法。 - •不管嵌套 T 或 *T,*S 方法集总是包含 T + *T 方法。 - - //定义类型,结构体 - type S struct{ i int } - //定义 结构体的 方法 - func (p S) Get() int { return p.i } - func (p S) Put() int { - p.i = 5 - return p.i - } - //接口声明 - type ABC interface { - Get() int - Put() int - } - //结构体是类型的合集,接口是结构体方法的合集 - //接口的使用 - func f(a ABC) { - fmt.Println(a.Get()) - fmt.Println(a.Put()) - } - //空接口的使用,需要先判断b的类型 - func kongjiekou(b interface{}) { - switch b.(type) { - case string: - fmt.Println(b) - case int: - fmt.Println(2) - default: - fmt.Println("......") - } - } -} -24.结构体的初始化{ - type Rect struct { - x, y float64 - width, height float64 //小写的对外不可见 - } - rect1 := new(Rect) - rect2 := &Rect{} - rect3 := &Rect{0, 0, 100, 200} - rect4 := &Rect{width:100, height:200} - var rect5 *Rect=new(Rect) - //注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符 - rect6 := Rect{} //则表示这个是一个Rect{}类型 - fmt.Println("rect1:",rect1) - fmt.Println("rect2:",rect2) - fmt.Println("rect3:",rect3) - fmt.Println("rect4:",rect4) - fmt.Println("rect5:",rect5) - fmt.Println("rect6:",rect6) - /* - rect1: &{0 0 0 0} - rect2: &{0 0 0 0} - rect3: &{0 0 100 200} - rect4: &{0 0 100 200} - rect5: &{0 0 0 0} - rect6: {0 0 0 0} - &{0 0 0 100} - */ - rect1.height=100 - fmt.Println(rect1)//&{0 0 0 100} - *rect1=Rect{100, 100, 100, 200} - fmt.Println(rect1) //&{100 100 100 200} -} -25.new、make{ -//有三种方式建立一个指向bytes.Buffer类型值为0的指针p,结果相同: -{ -// 分配足够的内存空间存放bytes.Buffer类型的value,返回指向value地址的指针 -var buf bytes.Buffer -p := &buf - -// 使用一个复合字面量分配内存给value,返回指向value地址的指针 -p := &bytes.Buffer{} - -// 使用new函数实现上面的功能 -p := new(bytes.Buffer) - -} -内建函数make(T, args)与new(T)的使用目的不同。它仅用于初始化slices、maps、channels,并返回一个初始化(非零)的T类型(不是T)值。 -造成这种差异的原因是,这三种类型,表层下面,代表的是对数据结构的引用,以至于使用前必须初始化。 - date2 := make([]byte, 11) - date2 := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //等效于make - -} - -//进阶部分 -接口断言{ - - //还可用 switch 做批量类型判断,不支持 fallthrough。 - func main() { - var o interface{} = &User{1, "Tom"} - switch v := o.(type) { - case nil: // o == nil - fmt.Println("nil") - case fmt.Stringer: // interface - fmt.Println(v) - case func() string: // func - fmt.Println(v()) - case *User: // *struct - fmt.Printf("%d, %s\n", v.id, v.name) - default: - fmt.Println("unknown") - } -} - //接口断言 - var w io.Writer - w = os.Stdout - f := w.(*os.File) //成功 - //c := w.(*bytes.Buffer) //异常 - -} - -常用包{ - buffio :实现带缓存的IO操作 - bytes:实现了针对byte slice的各种操作,和strings包具有类似的功能 - json:实现了json数据的编解码 - binary:实现了二进制数字的编解码 - flag:实现了命令行的flag解析 - database:实现了数据库操作接口 - ioutil:实现一些IO操作函数 - log:定义简单的日志接口 - fmt:实现格式IO,类似C中的printf和scanf - io:定义和实现了基本的IO操作 - filepath:实现了类似path的操作,但与系统相关 - reflect:实现了runtime的反射,可以在运行时操作对象 - os:实现了平台无关的系统操作 - path:实现了基于分隔符的路径操作 - strconv:实现了string和其他类型之间的转换 - strings:实现了操作UTF8字符串的各种操作 - regexp:实现了正则匹配搜索,RE2语法 - runtime:实现了和Go运行系统的交互操作 - sync:实现了同步操作的原语,例如锁 - time:实现了针对时间的各种够计算和显示 -} - -读写文件{ -#readfile - { - // readfile - package main - import ( - "fmt" - // "io" - "io/ioutil" - "os" - ) - func main() { - //读取文件测试 - fmt.Println("读取文件测试test1 of readfile:") - file1name := "c:\\lgj\\read2\\readfile.go" - file1, _ := os.Open(file1name) - file1date, _ := ioutil.ReadAll(file1) - fmt.Println(string(file1date)) - //// - var filename string - fmt.Println("input path+filename,when write enter exit to exit:") - fmt.Scanln(&filename) - file, err := os.Create(filename) - if err != nil { - panic(err) - } - defer file.Close() - //开始追加写入测试1 - fmt.Println("开始追加写入测试1test1 of writefile:") - for { - var input string - fmt.Scanln(&input) - if input == "exit" { - fmt.Println("write is over") - break - } - file.WriteString(input) - file.Write([]byte("\n")) - } - //开始写入测试2 - fmt.Println("开始写入测试2test2 of writefile:") - var input2 string - fmt.Scanln(&input2) - inputdate := make([]byte, len(input2)) - inputdate = []byte(input2) - //ioutil.WriteFile(filename....)能创建不存在的文件test1.txt - ioutil.WriteFile("c:\\lgj\\read2\\test1.txt", inputdate, 0664) - } - } - -} - -go的并发机制与超时{ -//常用的定义chan的方式 -var chanName chan ElementType -var ch chan int -var m map[string] chan bool -ch := make(chan int) - - -//go 关键字放在方法调用前新建一个 goroutine 并执行方法体 -go GetThingDone(param1, param2); - -//新建一个匿名方法并执行 -go func(param1, param2) { -}(val1, val2) - -//直接新建一个 goroutine 并在 goroutine 中执行代码块 -go { - //do someting... -} - - -通过channel传递的元素类型、容器(或缓冲区)和传递的方向由“<-”操作符指定。 -可以使用内置函数 make分配一个channel: - i := make(chan int) // by default the capacity is 0 - s := make(chan string, 3) // non-zero capacity - - r := make(<-chan bool) // can only read from - w := make(chan<- []os.FileInfo) // can only write to -//单向channel变量的声明非常简单,如下: - var ch1 chan int // ch1是一个正常的channel,不是单向的 - var ch2 chan<- float64 // ch2是单向channel,只用于写float64数据 - var ch3 <-chan int // ch3是单向channel,只用于读取int数据 -//可以将 channel 隐式转换为单向队列,只收或只发。 - c := make(chan int, 3) - var send chan<- int = c // send-only - var recv <-chan int = c // receive-only - /* - send <- 1 - // <-send // Error: receive from send-only type chan<- int - <-recv - // recv <- 2 // Error: send to receive-only type <-chan int - */ -并发:一个时间段内有很多的线程或进程在执行,但何时间点上都只有一个在执行,多个线程或进程争抢时间片轮流执行 -并行:一个时间段和时间点上都有多个线程或进程在执行 - -goroutine机制实现了 M : N的线程模型,goroutine机制是协程(coroutine)的一种实现,golang内置的调度器,可以让多核CPU中每个CPU执行一个协程。 -///虽然goroutine是并发执行的,但是它们并不是并行运行的。如果不告诉Go额外的东西,同一时刻只会有一个goroutine执行。利用runtime.GOMAXPROCS(n)可以设置goroutine并行执行的数量。 - -ci := make(chan int) -cs := make(chan string) -cf := make(chan interface{}) - -ci <- 1 //发送整数 1 到 channel ci -<-ci //从 channel ci 接收整数 -i := <-ci //从 channel ci 接收整数,并保存到 i 中 - -//关闭channel -#当channel被关闭后,读取端需要知道这个事情。下面的代码演示了如何检查channel是否被关系。 - -x, ok = <-ch - -当ok被赋值为true意味着channel尚未被关闭,同时可以读取数据。否则ok被赋值为false。在这个情况下表示channel被关闭。 - -//内置函数 len 返回未被读取的缓冲元素数量,cap 返回缓冲区大小。 -d1 := make(chan int) -d2 := make(chan int, 3) -d2 <- 1 -fmt.Println(len(d1), cap(d1)) // 0 0 -fmt.Println(len(d2), cap(d2)) // 1 3 - -///通过select(和其他东西)可以监听channel上输入的数据。 -//有多少 发送就应该有多少 接收 - var c chan int - func ready(w string, sec int) { - time.Sleep(time.Duration(sec) * time.Second) - fmt.Println(w, "is ready!") - c <- 1 - } - func main() { - c = make(chan int) - go ready("Tea", 2) - go ready("Coffee", 1) - fmt.Println("I'm waiting, but not too long") - L: - for { - select { - case <-c: - i++ - if i > 1 { - break L - } - } - } - } - -//channel实现超时机制 - -//虽然select机制不是专为超时而设计的,却能很方便地解决超时问题。因为select的特点是只要其中一个case已经完成,程序就会继续往下执行,而不会考虑其他case的情况。 -package main - -import ( - "fmt" - "time" -) - -func main() { - // 首先,我们实现并执行一个匿名的超时等待函数 - timeout := make(chan bool, 1) - ch := make(chan bool, 1) - go func() { - time.Sleep(2e9) // 等待2秒钟 - timeout <- true - }() - fmt.Println("start") - // 然后我们把timeout这个channel利用起来 - select { - case <-ch: - // 从ch中读取到数据 - case <-timeout: - // 一直没有从ch中读取到数据,但从timeout中读取到了数据 - } - fmt.Println("end") -} - -//进阶版 - -package main - -import ( - "fmt" - "math/rand" - "time" -) - -func main() { - sth := make(chan int) - result := make(chan int) - go func() { - id := rand.Intn(100) - time.Sleep(1 * time.Second) - for { - sth <- id - } - }() - go func() { - for { - time.Sleep(1 * time.Second) - tmp := <-sth - result <- tmp - } - }() - select { - case c := <-result: - fmt.Println("Get result:", c) - case e := <-time.After(2 * time.Second): - fmt.Println("指定时间内都没有得到结果:",e) - } - - NewTicker() -} - -func NewTicker() { - //耗时间的操作 - concurrencyCount := runtime.NumCPU() - for i := 0; i < concurrencyCount; i++ { - go func(index int) { - for { - time.Sleep(1 * time.Second) - } - }(i) - } - //ticker - t := time.NewTicker(2 * time.Second) - for { - select { - case <-t.C: - fmt.Println("周期执行") - // 计算并打印实时数据 - } - } -} - -/* -ch4 := make(chan int) -ch5 := <-chan int(ch4) // ch5就是一个单向的读取channel -ch6 := chan<- int(ch4) // ch6 是一个单向的写入channel -*/ - - -} - -同步锁{ -Go语言包中的sync包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。Mutex是最简单的一种锁类型,同时也比较暴力,当一个goroutine获得了Mutex后,其他goroutine就只能乖乖等到这个goroutine释放该Mutex。 -RWMutex相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个goroutine可同时获取读锁 -//典型使用模式 - var l sync.Mutex - func foo() { - l.Lock() - defer l.Unlock() - //... - } - -} - -json解析到interface/map{ -/* -JSON中的布尔值将会转换为Go中的bool类型; -数值会被转换为Go中的float64类型; -字符串转换后还是string类型; -JSON数组会转换为[]interface{}类型; -JSON对象会转换为map[string]interface{}类型; -null值会转换为nil。 -*/ - package main - - import ( - "encoding/json" - "fmt" - "reflect" - ) - - //input输入字符串型,最好原样输入,get是索引(第一个索引值),若get是数组或map,那key就会有作用 - //(get对应的是map,key应该是map的key,get对应的是数组时,key应该是数组的index) - func myjson(input string, get string, key interface{}) interface{} { - - var gojson map[string]interface{} - var areturn interface{} - b := []byte(input) - err := json.Unmarshal(b, &gojson) - if err != nil { - return err - } - fmt.Println("解析后:", gojson) - if true { - for k, v := range gojson { //k是索引,v是值 - if k == get { - switch v2 := v.(type) { //固定句式,只能在这里用 - case string: - //fmt.Println(k, "is string", v2) - areturn = v2 - case int: - //fmt.Println(k, "is int", v2) - areturn = v2 - case float64: - //fmt.Println(k, "is float64", v2) - areturn = v2 - case bool: - //fmt.Println(k, "is bool", v2) - areturn = v2 - } - switch v3 := v.(type) { - case []interface{}: - //fmt.Println(k, "is an array", ",index is", key) - for i, iv := range v3 { - if key == i { - areturn = iv - } - //fmt.Println("areturn:", areturn) - } - case map[string]interface{}: - //fmt.Println(k, "is an map", ",key is", key) - //fmt.Println("v3:", v3) - for i, iv := range v3 { - if key == i { - areturn = iv - //fmt.Println("areturn:", areturn) - } - } - } - } - } - - } - return areturn - } - - func main() { - a := `{ - "Title": "Go语言编程", - "Authors": ["XuShiwei", "HughLv", "Pandaman", "GuaguaSong", "HanTuo", "BertYuan","XuDaoli",{"cmap":{"a":1,"b":"b","c":0.11}}], - "Publisher": "ituring.com.cn", - "IsPublished": true, - "Price": 9.99, - "Sales": 1000000, - "amap":{"a":1,"b":2,"c":3}, - "bmap":{"a":1,"b":"b","c":0.11} - }` - - atype := myjson(a, "Authors", 7) - fmt.Println("函数返回值是:", atype) - fmt.Println("函数返回值的类型是:", reflect.TypeOf(atype)) //[]interface {} 不支持索引 - /* - atype := myjson(a, "Authors", 7) - 函数返回值是: map[cmap:map[c:0.11 a:1 b:b]] - 函数返回值的类型是: map[string]interface {} >>>>>>atype["a"],atype["cmap"] >>>都不支持索引,只能在switch的case中for..range。如下: - */ - - switch v3 := atype.(type) { - case []interface{}: - fmt.Println("v31:", v3) - for i, iv := range v3 { - fmt.Println(i, iv) - } - case map[string]interface{}: - fmt.Println("v32:", v3) - for i, iv := range v3 { - fmt.Println("key:", i, "value:", iv) - switch v4 := iv.(type) { - case map[string]interface{}: - fmt.Println("v33:", v4) - for i, iv := range v4 { - fmt.Println("key1:", i, "value1:", iv) - } - } - } - } - - } - - -} - -//扩展知识 -docker的常用命令{ -(1)docker attach -Attach to a running container:进入一个正在运行的容器 -(2)docker start - Start a stopped container:启动一个停止的容器,让它的状态变为running -(3)docker stop - Stop a running container:停止一个正在运行的容器 -(4)docker rm - Remove one or more containers:删除一个停止的容器(如果说这个容器是running状态时,先要执行docker stop命令,再执行docker rm命令,才能删除容器) -(5)docker kill - Kill a running container:删除一个正在运行的容器 -(6)其他docker命令 - build Build an image from a Dockerfile - commit Create a new image from a container's changes - cp Copy files/folders from a container's filesystem to the host path - create Create a new container - diff Inspect changes on a container\'s filesystem - events Get real time events from the server - exec Run a command in an existing container - export Stream the contents of a container as a tar archive - history Show the history of an image - images List images - import Create a new filesystem image from the contents of a tarball - info Display system-wide information - inspect Return low-level information on a container - load Load an image from a tar archive - login Register or log in to a Docker registry server - logout Log out from a Docker registry server - logs Fetch the logs of a container - port Lookup the public-facing port that is NAT-ed to PRIVATE_PORT - pause Pause all processes within a container - ps List containers - pull Pull an image or a repository from a Docker registry server - push Push an image or a repository to a Docker registry server - restart Restart a running container - rmi Remove one or more images - run Run a command in a new container - save Save an image to a tar archive - search Search for an image on the Docker Hub - tag Tag an image into a repository - top Lookup the running processes of a container - unpause Unpause a paused container - version Show the Docker version information - wait Block until a container stops, then print its exit code -} - -strconv包中最常用方法{ - -// Itoa 相当于 FormatInt(i, 10) -func Itoa(i int) string - -func main() { - fmt.Println(strconv.Itoa(-2048)) // -2048 - fmt.Println(strconv.Itoa(2048)) // 2048 -} - -// Atoi 相当于 ParseInt(s, 10, 0) -// 通常使用这个函数,而不使用 ParseInt -func Atoi(s string) (i int, err error) - -func main() { - fmt.Println(strconv.Atoi("2147483647")) - // 2147483647 - fmt.Println(strconv.Atoi("2147483648")) - // 2147483647 strconv.ParseInt: parsing "2147483648": value out of range -} - -// ParseInt 将字符串转换为 int 类型 -// s:要转换的字符串 -// base:进位制(2 进制到 36 进制) -// bitSize:指定整数类型(0:int、8:int8、16:int16、32:int32、64:int64) -// 返回转换后的结果和转换时遇到的错误 -// 如果 base 为 0,则根据字符串的前缀判断进位制(0x:16,0:8,其它:10) - -} - -执行系统命令{ - import "os/exec" - cmd := exec.Command("/bin/ls", "-l") - err := cmd.Run() - 上面的例子运行了“ls -l”,但是没有对其返回的数据进行任何处理,通过如下 - 方法从命令行的标准输出中获得信息: - import "exec" - cmd := exec.Command("/bin/ls", "-l") - buf, err := cmd.Output() buf 是一个 []byte -} - -//例子部分 -简单的go并发{ - package main - - import "fmt" - import "time" - - func f(n *int) { - a := "hello, world" - (*n)++ - fmt.Println(*n) - fmt.Println(a + string(*n)) - - } - - func main() { - n := 64 - go f(&n) - go f(&n) - go f(&n) - time.Sleep(1) //不加的话,不会打印f函数中的提示 - fmt.Println("n:", n) - } - - /*为什么打印不会混乱? - 65 - hello, worldA - 66 - hello, worldB - 67 - hello, worldC - n: 67 - */ - - -} - -加锁后的go并发{ - //一般是不应这样的,都是用chan - package main - - import "fmt" - import "sync" - import "runtime" - - //import "time" - - var counter int = 0 - var counter1 int = 0 - - //加锁 - func Count(lock *sync.Mutex) { - lock.Lock() - counter++ - fmt.Println("counter:", counter) - lock.Unlock() - } - - //不加锁 - func Count1(i int) { - counter1++ - fmt.Println("i:", i) - fmt.Println("counter1:", counter1) - } - - func main() { - lock := &sync.Mutex{} - - for i := 0; i < 10; i++ { - go Count(lock) - } - - for { - lock.Lock() - - c := counter - - lock.Unlock() - - runtime.Gosched() - if c >= 10 { - break - } - } - fmt.Println("=====不加锁======1") - for i := 0; i < 20; i++ { - go Count1(i) - } - - //time.Sleep(10) - for { - d := counter1 - fmt.Println("d:", d) - if d >= 10 { - fmt.Println("break") - break - } - } - fmt.Println("=====不加锁======2") - //不加锁也没有混乱,是因为并发的原因的吗? - } - - /* - - go func() { - for { - d := counter1 - fmt.Println("d:", d) - if d >= 10 { - fmt.Println("break") - break - } - } - }() - - */ - - -} - -select与并发{ - - package main - - import "fmt" - import "os" - - func main() { - fmt.Println("-----") - a, b := make(chan int, 3), make(chan int) - go func() { - v, ok, s := 0, false, "" - for { - select { // 随机选择可用 channel,接收数据。 - case v, ok = <-a: - s = "a" - case v, ok = <-b: - s = "b" - } - if ok { - fmt.Println(s, v) - } else { - os.Exit(0) - } - } - }() - - for i := 0; i < 5; i++ { - select { - case a <- i: - case b <- i: - } - } - close(a) - select {} // 没有可用 channel,阻塞 main goroutine。 - - } - - /* - os.Args 返回命令⾏参数,os.Exit 终止进程。 - 要获取正确的可执行文件路径,可用 filepath.Abs(exec.LookPath(os.Args[0]))。 - */ -//超时与并发 -package main - -import ( - "fmt" - "math/rand" - "time" -) - -func main() { - sth := make(chan int) - result := make(chan int) - go func() { - id := rand.Intn(100) - time.Sleep(1 * time.Second) - for { - sth <- id - } - }() - go func() { - for { - time.Sleep(1 * time.Second) - tmp := <-sth - result <- tmp - } - }() - - select { - case c := <-result: - fmt.Println("Get result:", c) - case e := <-time.After(2 * time.Second): //主程序等待2秒,没有消息就继续 - fmt.Println("指定时间内都没有得到结果:",e) - } -} - -/* -ch4 := make(chan int) -ch5 := <-chan int(ch4) // ch5就是一个单向的读取channel -ch6 := chan<- int(ch4) // ch6 是一个单向的写入channel -*/ - - - -} - -再学json解析{ - - package main - -import ( - "encoding/json" - "fmt" - "reflect" - "strconv" - "strings" -) - -//input输入字符串型,最好原样输入,get是索引(第一个索引值),若get是数组或map,那key就会有作用 -//(get对应的是map,key应该是map的key,get对应的是数组时,key应该是数组的index) -func myjson(input string, get string, key interface{}) interface{} { - - var gojson map[string]interface{} - var areturn interface{} - b := []byte(input) - err := json.Unmarshal(b, &gojson) - if err != nil { - return err - } - fmt.Println("解析后:", gojson) - if true { - for k, v := range gojson { //k是索引,v是值 - if k == get { - switch v2 := v.(type) { //固定句式 - case string: - //fmt.Println(k, "is string", v2) - areturn = v2 - case int: - //fmt.Println(k, "is int", v2) - areturn = v2 - case float64: - //fmt.Println(k, "is float64", v2) - areturn = v2 - case bool: - //fmt.Println(k, "is bool", v2) - areturn = v2 - } - switch v3 := v.(type) { - case []interface{}: - //fmt.Println(k, "is an array", ",index is", key) - for i, iv := range v3 { - if key == i { - areturn = iv - } - //fmt.Println("areturn:", areturn) - } - case map[string]interface{}: - //fmt.Println(k, "is an map", ",key is", key) - //fmt.Println("v3:", v3) - for i, iv := range v3 { - if key == i { - areturn = iv - //fmt.Println("areturn:", areturn) - } - } - } - } - } - - } - return areturn -} -func main() { - //递归方式变量未知结构 - a := `{ - "Title": "Go语言编程", - "Authors": ["XuShiwei", "HughLv", "Pandaman", "BertYuan","XuDaoli",{"cmap":{"a4":1,"b4":"b4","c4":0.11}}], - "Publisher": "ituring.com.cn", - "IsPublished": true, - "Price": 9.99, - "Sales": 1000000, - "amap":{"a":1,"b":2,"c":3}, - "bmap":{"a1":1,"b1":"b","c1":0.11,"dmap":{"a2":1,"b2":"b","c2":0.11,"emap":{"a3":1,"b3":"b3","c3":0.11}}} - }` - - atype := myjson(a, "Authors", 5) - fmt.Println("函数返回值是:", atype) - fmt.Println("函数返回值的类型是:", reflect.TypeOf(atype)) //[]interface {} 不支持索引 - - //可以将多种类型赋给interface{} - var b interface{} - c := "abcdefg" - d := []string{"1", "2", "a"} - b = c - fmt.Println(b) - b = d - fmt.Println(b) - fmt.Println([]byte("aaaaaaaa")) - - println(strings.Contains(a, "cmap")) - //()转换 {}元素 - //e := []byte(`{"a1": 1, "b1": "b", "c1": 0.11, "dmap": {"a2": 1, "b2": "b", "c2": 0.11, "emap": {"a3": 1, "b3": "b3", "c3": 0.11}}}`) - //fmt.Println(e) - - //复合型map - f := map[string]interface{}{"a": 1, "b": 2, "c": "c", "d": []string{"aa", "bb", "cc"}} - fmt.Println(f["d"]) - fmt.Println(strconv.FormatFloat(12.164, 'g', 8, 32)) - //map ->string ->map - fbyte, _ := json.Marshal(f) - fmt.Println(string(fbyte)) - var fjson map[string]interface{} - err := json.Unmarshal(fbyte, &fjson) - fmt.Println(err, fjson) - -} - -/* - atype := myjson(a, "Authors", 7) - 函数返回值是: map[cmap:map[c:0.11 a:1 b:b]] - 函数返回值的类型是: map[string]interface {} >>>>>>atype["a"],atype["cmap"] >>>都不支持索引,只能在switch的case中for..range。如下: - - //错误的map - //e := map[string]interface{}{"a1": 1, "b1": "b", "c1": 0.11, "dmap": {"a2": 1, "b2": "b", "c2": 0.11, "emap": {"a3": 1, "b3": "b3", "c3": 0.11}}} - //fmt.Println(f["dmap"]) - //复合型map - f := map[string]interface{}{"a": 1, "b": 2, "c": "c", "d": []string{"aa", "bb", "cc"}} - fmt.Println(f["d"]) - - - func MaptoStr(amap map[string]interface{}) string { - var astr string - var v2 string - for k, v := range amap { - fmt.Println("k:v", k, v) - fmt.Println("v类型是:", reflect.TypeOf(v)) - switch v.(type) { - case string: - v2 = v.(string) - //fmt.Println("v2", v2) - case int: - v2 = strconv.Itoa(v.(int)) - //fmt.Println("v2", v2) - case float64: - v2 = strconv.FormatFloat(v.(float64), 'g', 8, 32) - //fmt.Println("v2", v2) - - case []interface{}: - fmt.Println(k, "is an array", ",index is", v) - v2 = ArrtoStr(v.([]interface{})) - case map[string]interface{}: - //fmt.Println(k, "is an map", ",key is", key) - v2 = MaptoStr(v.(map[string]interface{})) - } - astr = k + ":" + v2 + "," + astr - } - return astr - } - - func ArrtoStr(arry []interface{}) string { - var astr string - var v2 string - for k, v := range arry { - fmt.Println("array", k, v) - switch v.(type) { - case string: - v2 = v.(string) - fmt.Println("v2", v2) - case int: - v2 = strconv.Itoa(v.(int)) - //fmt.Println("v2", v2) - case float64: - v2 = strconv.FormatFloat(v.(float64), 'g', 8, 32) - //fmt.Println("v2", v2) - case []interface{}: - fmt.Println(k, "is an array", ",index is", v) - v2 = ArrtoStr(v.([]interface{})) - case map[string]interface{}: - //fmt.Println(k, "is an map", ",key is", key) - v2 = MaptoStr(v.(map[string]interface{})) - } - astr = astr + "," + v2 - } - return astr - } - - -*/ - -//////// 限制struct 的格式 ----> ServerName 为空时,解析后的b中不会有ServerName缺省后的默认值 -/* -针对JSON的输出,我们在定义struct tag的时候需要注意几点: -字段的tag是“-”,那么这个字段不会输出到JSON -tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中,例如上面例子中的serverName -tag中如果带有“omitempty”选项,那么如果该字段值为空,就不会输出到JSON串中 -如果字段类型是bool,string,int,int64等,而tag中带有“,string”选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串 -*/ -package main - -import ( - "encoding/json" - "os" -) - -type Server struct { - //ID不会导出到JSON - ID int `json:"-"` - - //ServerName的值会进行二次JSON编码 - ServerName bool `json:"serverName,omitempty"` - ServerName2 string `json:"serverName2, string"` - - //如果ServerIP为空,则不输出到JSON中 - ServerIP string `json:"serverIP,omitempty"` - Description string `json:"description,string"` -} - -func main() { - - s := Server{ - ID: 3, - ServerName2: `Go "1.0"`, - ServerIP: ``, - Description: "描述信息", - } - - b, _ := json.Marshal(s) - os.Stdout.Write(b) - -} - -//{"serverName2":"Go \"1.0\"","description":"\"描述信息\""} -} - -//解固定格式的json - //`json:"id"` 就是id字段在从结构体实例编码到JSON数据格式的时候,使用id作为名字。算是一种重命名的方式。 -func Sub_json(SubscribeApisInfo []byte, n int )(return_str [12]string){ - type apiList_struct struct { - Id string `json:"id"` - Name string `json:"name"` - Context string `json:"context"` - Version string `json:"version"` - Status string `json:"status"` - Quota string `json:"quota"` - Catalog string `json:"catalog"` - } - type Res_struct struct { - ResultCode int `json:"resultCode"` - ResultMsg string `json:"resultMsg"` - TotalSize int `json:"totalSize"` - PageSize int `json:"pageSize"` - PageIndex int `json:"pageIndex"` - ApiList []apiList_struct - } - - //json str 转struct - var get Res_struct - if err := json.Unmarshal(SubscribeApisInfo, &get); err == nil { - //common.PrintlnCyan("================json str to struct==") -return_str=[12]string{strconv.Itoa(get.ResultCode),get.ResultMsg,strconv.Itoa(get.TotalSize),strconv.Itoa(get.PageSize),strconv.Itoa(get.PageIndex),get.ApiList[n].Id,get.ApiList[n].Name,get.ApiList[n].Context,get.ApiList[n].Version,get.ApiList[n].Status,get.ApiList[n].Quota,get.ApiList[n].Catalog} - //common.PrintlnCyan(return_str) - } - return -} - -} - -管道原来可以这样用{ -//首先限定基本的数据结构: - type PipeData struct { - value int - handler func(int) int - next chan int - } - - //流式处理数据: - func handle(queue chan *PipeData) { - for data := range queue { - data.next <- data.handler(data.value) - } - } - -} - -/////golang小知识点记录 -golang小知识点记录{ - -1.获取url中的参数及输出到页面的几种方式 -func SayHello(w http.ResponseWriter, req *http.Request) { - req.Method //获取url的方法 GET or POST - request := req.URL.Query() //获取url中的所有参数(get或post) - io.WriteString(w, req.FormValue("id")) //获取url的id参数(常用) - w.Write([]byte(request["wang"][0])) //发送到HTTP客户端 - io.WriteString(w, "hello, world!\n") //发送到HTTP客户端 - fmt.Fprintf(w, "%s", "hello, world!\n") //发送到HTTP客户端 - -} - -2.获取当前路径 - - os.Getwd() //执行用户当前所在路径 - file, _ := exec.LookPath(os.Args[0])//执行程序所在的绝对路径 - -3.变量类型转换 - -floatTOint - int(float) - -intTOfloat - var a int = 2 - var b float64 = float64(a) -stringTOfloat(32 / 64) - f, err := strconv.ParseFloat(s, 32) - f, err := strconv.ParseFloat(s, 64) -intTOstring - var i int = 10 - str1 := strconv.Itoa(i) // 通过Itoa方法转换 - str2 := fmt.Sprintf("%v", i) // 通过Sprintf方法转换 万能 -stringTOint - var s string = "1" - var i int - i, err = strconv.Atoi(s) -stringToint - strconv.ParseInt() -strToBool - i, err =strconv.ParseBool("1") -intToint32 - var a int - b = int32(a) -interface TO string - var a interface{} - var b string - a = "asdasdasdasd" - b = a.(string) -interface TO float32 - var a interface{} - var b float32 - a = 126.982577 - b = a.(float32) - interface TO int32 - var a interface{} - var b int32 - a = 126 - b = a.(int32) -//强制类型转换 1 - type MyInt32 int32 - func main() { - var uid int32 = 12345 - var gid MyInt32 = MyInt32(uid) - fmt.Printf("uid=%d, gid=%d\n", uid, gid) - } -//强制类型转换 2 - unsafe.Pointer - -//string byte互转 - aa:="hello world" - bb:=[]byte(aa) - cc:=string(bb) - - - - - -4.当前时间戳 - fmt.Println(time.Now().Unix()) - # 1389058332 - -5.时间戳到具体显示的转化 - fmt.Println(time.Unix(t, 0).String()) - -6.带纳秒的时间戳 - t = time.Now().UnixNano() -7.基本格式化的时间表示 - fmt.Println(time.Now().String()) -8.格式化时间 - fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 记忆方法:6-1-2-3-4-5 - # 2014-01-07 09:42:20 - -9.时间戳转str格式化时间 - str_time := time.Unix(1389058332, 0).Format("2006-01-02 15:04:05") - fmt.Println(str_time) # 2014-01-07 09:32:12 - -10.str格式化时间转时间戳 - the_time := time.Date(2014, 1, 7, 5, 50, 4, 0, time.Local) - unix_time := the_time.Unix() - fmt.Println(unix_time) # 389045004 - -//还有一种方法,使用time.Parse - the_time, err := time.Parse("2006-01-02 15:04:05", "2014-01-08 09:04:41") - if err == nil { - unix_time := the_time.Unix() - fmt.Println(unix_time) - } - # 1389171881 -11.sleep - - time.Sleep(time.Millisecond * 1000) #sleep 1000毫秒 - time.Sleep(time.Second * 1) #sleep 1秒 -12.fmt - 万能格式:%v - 字符串: %s - 十进制: %d - 浮点数: %f 保留2位小数 %0.2f - 二进制: %b - Boolen: %t - - fmt.Fprintf(os.Stdout, "%08b\n", 32) // 00100000 - fmt.Printf("%v", "hello world") // hello world 直接格式化打印 - fmt.Print(fmt.Sprintf("%v", "hello world")) // hello world Sprintf 返回格式化后的变量 - fmt.Print(fmt.Errorf("%08b\n", 32)) // 00100000 - fmt.Fprint(os.Stdout, "A") - fmt.Fprintln(os.Stdout, "A") // A - fmt.Println("B") // B - fmt.Print(fmt.Sprintln("C")) // C - -13.函数不定参数 -func sum (nums ...int) { - fmt.Print(nums, " ") //输出如 [1, 2, 3] 之类的数组 - total := 0 - for _, num := range nums { //要的是值而不是下标 - total += num - } - fmt.Println (total) -} -a:=[]int{1,2,3,4,5} //可传slice … -sum(a…) - -14.执行命令行 -import "os/exec" - func main () { - //cmd := exec.Command("ps", "-aux") - cmd := exec.Command ("ls", "/root") - out, err := cmd.Output () - if err!=nil { - println ("Command Error!", err.Error ()) - return - } - fmt.Println (string (out)) - } - 或者(正规一点) - func main () { - cmd := exec.Command ("tr", "a-z", "A-Z") - cmd.Stdin = strings.NewReader ("some input") - var out bytes.Buffer - cmd.Stdout = &out - err := cmd.Run () - if err != nil { - log.Fatal (err) - } - fmt.Printf("in all caps: %q\n", out.String ()) - } - - 输出:in all caps: "SOME INPUT" - -//命令行参数 (可用flag包) -func main () { - args := os.Args - fmt.Println (args) //带执行文件的 - } -$go run args.go aaa bbb ccc ddd - -15.生成随机数 -r := rand.New(rand.NewSource(time.Now().UnixNano())) //使用时间作为种子 - -16.结构体的初始化方法 - rect1 := new(Rect) - rect2 := &Rect{} - rect3 := &Rect{0, 0, 100, 200} - rect4 := &Rect{width:100, height:200} - var rect5 *Rect=new(Rect) - 注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符 - a := Rect{} - 则表示这个是一个Rect{}类型 -17.md5 - -import ( - "crypto/md5" - "encoding/hex" -) - -func GetMd5String(s string) string { - h := md5.New() - h.Write([]byte(s)) - return hex.EncodeToString(h.Sum(nil)) -} - -18.urlencode -import "net/url" -url.QueryEscape("strings") - -19.log 记日志 -logfile, _ := os.OpenFile("./pro.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777) -defer logfile.Close() - -logger := log.New(logfile, "", 0) -logger.Printf("%v%v", err, ret) -20.判断文件是否存在 -func main() { - f, err := os.Open("dotcoo.com.txt") - defer f.Close() - if err != nil && os.IsNotExist(err) { - fmt.Printf("file not exist!\n") - return - } - fmt.Printf("file exist!\n") - } - -21.string如果里面有"或换行,可以使用`来进行包含 - -jsonString := ` - { - "development":{ - "connector":[ - {"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "wsPort":3050} - ], - "gate":[ - {"id": "gate-server-1", "host": "127.0.0.1", "wsPort": 3014} - ] - } - }` - -22.path.Clean -path.Clean用于对路径 ../../等进行过滤,在创建修改文件的时候需要使用到,否则会有漏洞 - - -23.import包命名 - -import的包可以给它命名import l4g "code.google.com/p/log4go" - -24.判断当前用户是否是root用户 -os.Geteuid() != 0 - -25.break -//退出指定的循环体 如果在某个条件下,你需要从 for-select 中退出,就需要使用标签 -sum := 0 -MyForLable: - for { - for i := 0; i < 10; i++ { - if sum > 200 { - break MyForLable //将退出循环体for{} - } - sum += i - } - } - fmt.Println(sum) - -26.golang中的类型判断 - - -var a interface{} - a=12 - newA,ok:=a.(string) - 如果ok 是 true 则说明 变量a 是字符串类型,而newA就是string类型的变量,a的实际值 - a.(type) 返回的是 a的 类型, 注意他返回的不是一个 字符串表示 string int 这样表示a的类型 - a.(type)是和switch 搭配使用的 - switch vtype:=v.(type){ - case string: - case int: - case []interface{}: - default: - } - -27.json简单的encode,decode - - -import "encoding/json" - - type MyData struct { - Name string `json:"item"` - Other float32 `json:"amount"` - } - detail:=&MyData{"Name":"hello","Other":2} - userinfo, _ := json.Marshal(detail) - fmt.Println(string(userinfo)) - //`json:"item"` 就是Name字段在从结构体实例编码到JSON数据格式的时候,使用item作为名字。算是一种重命名的方式。 - //输出:{"item":"hello","amount":2} - userinfo,_:=json.Marshal(detail) - ObjUser := make(map[string]interface{}) - json.Unmarshal([]byte(userinfo), &ObjUser) - -28.panic和恢复recover用法 - -defer func() { - if re := recover(); re != nil { - fmt.Printf("%v", re) - } -}() - - -29.从文件中json解析 - -尽量使用os.OpenFile直接获取reader,然后再从reader中使用Decoder来解析json -package main - -import ( - "fmt" - "encoding/json" - "os") - -func main() { - pathToFile := "jsondata.txt" - - file, err := os.OpenFile(pathToFile, os.O_RDONLY, 0644) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - configs := make(map[string]map[string][]Service, 0) - err = json.NewDecoder(file).Decode(&configs) - if err != nil { - fmt.Println(err) - os.Exit(1) - }} - -30.lock 并发小例 -import ( - "fmt" - "sync" - "time" -) - -var l sync.Mutex - -func main() { - l.Lock() - defer l.Unlock() - m := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - ch := make(chan int) - defer close(ch) - for i := 0; i < 30; i++ { - time.Sleep(time.Second) - go func(x int) { - for { - if len(m) == 0 { - break - } else { - l.Unlock() - fmt.Println(x, m[0:1]) - m = m[1:len(m)] - l.Lock() - } - time.Sleep(time.Second) - - } - ch <- x - - }(i) - } - for i := 0; i < 30; i++ { - fmt.Println(<-ch) - } - -} - -31.future小例 -package main - -import ( - "fmt" -) - -//一个查询结构体 -type query struct { - //参数Channel - sql chan string - //结果Channel - result chan string -} - -//执行Query -func execQuery(q query) { - //启动协程 - go func() { - //获取输入 - sql := <-q.sql - //访问数据库,输出结果通道 - q.result <- "get " + sql - }() - -} - -func main() { - //初始化Query - q := - query{make(chan string, 1), make(chan string, 1)} - //执行Query,注意执行的时候无需准备参数 - execQuery(q) - - //准备参数 - q.sql <- "select * from table" - //获取结果 - fmt.Println(<-q.result) -} - -32.反射小例 - -package main -import ( - "errors" - "fmt" - "reflect" -) - -func foo() { - fmt.Println("hello") - -} -func bar(a, b, c int) { - fmt.Println(a, b, c) -} - -func Call(m map[string]interface{}, name string, params ...interface{}) (result []reflect.Value, err error) { - f := reflect.ValueOf(m[name]) - if len(params) != f.Type().NumIn() { - err = errors.New("The number of params is not adapted.") - return - } - in := make([]reflect.Value, len(params)) - for k, param := range params { - in[k] = reflect.ValueOf(param) - } - result = f.Call(in) - return -} - -func main() { - funcs := map[string]interface{}{"foo": foo, "bar": bar} - Call(funcs, "foo") - Call(funcs, "bar", 1, 2, 3) -} - -33.快速搭建服务器 -func main(){ - http.HandleFunc( "/",Handler) - http.HandleFunc( "/valueget",valueget) - s := &http.Server{ - Addr: ":80", - ReadTimeout: 30 * time.Second, - WriteTimeout: 30 * time.Second, - MaxHeaderBytes: 1 << 20, - } - log.Fatal(s.ListenAndServe()) -} - -func valueget(w http.ResponseWriter, r *http.Request) { - params := r.URL.Query() - user := params.Get("user") - fmt.Fprintf(w, "you are get user %s", user) -} - -go “静态目录服务” http.FileServer - - -//对目录提供静态映射服务 -http.Handle("/", http.FileServer(http.Dir("/tmp"))) - -http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, r.URL.Path[1:]) - -}) - - - -34.go语言中导入另外一个库结果调用时出错:cannot refer to unexported name -解决方法 :go,模块中要导出的函数,必须首字母大写。 - - -34.goto -func main() { - defer fmt.Println("cc") - goto L - defer fmt.Println("dd") - fmt.Println("aa") -L: - fmt.Println("bb") -} - -输出 -bb -cc - - -35.hook -package main - -import ( - "fmt" -) - -var hooks []hookfunc //hook function slice to store the hookfunc - -type hookfunc func() error //hook function to run - -func initOne() error { - fmt.Println("hello world 1") - return nil -} -func initTwo() error { - fmt.Println("hello world 2") - return nil -} -func AddHook(hf hookfunc) { - hooks = append(hooks, hf) -} - -func main() { - AddHook(initOne) - AddHook(initTwo) - - // do hooks function - for _, hk := range hooks { - err := hk() - if err != nil { - panic(err) - } - } -} - - -36.signalpackage main -import ( - "fmt" - "os" - "os/signal" - "syscall" - "time" -) - -func main() { - go signalHandle() - time.Sleep(time.Second * 50) -} - -func signalHandle() { - for { - ch := make(chan os.Signal) - signal.Notify(ch, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGHUP) - sig := <-ch - switch sig { - default: - fmt.Println("default") - case syscall.SIGHUP: - fmt.Println("SIGHUP") - case syscall.SIGINT: - fmt.Println("SIGINT") - case syscall.SIGUSR1: - fmt.Println("SIGUSR1") - case syscall.SIGUSR2: - fmt.Println("SIGUSR2") - - } - } -} - -37.闭包 -package main -import "fmt" - -func adder() func(int) int { - sum := 0 - return func(x int) int { - sum += x - return sum - } -} - -func main() { - pos, neg := adder(), adder() - for i := 0; i < 10; i++ { - fmt.Println( - pos(i), - neg(-2*i), - ) - } - -} - -} - -HTTP请求{ -package main -1.最简单的请求 - import ( - "fmt" - "io/ioutil" - "net/http" - ) - - func main() { - response, _ := http.Get("http://3ms.huawei.com/") - defer response.Body.Close() - body, _ := ioutil.ReadAll(response.Body) - fmt.Println(string(body)) - } - -2.定制化请求 -//最简单的带头域的get、post请求 - package main - - import ( - "fmt" - "io/ioutil" - "net/http" - "strings" - ) - - func main() { - fmt.Println(getstat()) - fmt.Println(putconf()) - } - - //curl -k -v -X GET -H "Authorization:Basic cHJvdmlkZXI6UHYmODlJam4=" -H "beginDate:2015-09-01 12:00:00" -H "endDate:2017-09-08 12:00:00" - // 'http://10.175.102.220:9580/rest/invoke/statistics?pageSize=200&pageIndex=1' - func getstat() string { - client := &http.Client{} - reqest, _ := http.NewRequest("GET", "http://10.175.102.220:9580/rest/invoke/statistics?pageSize=1&pageIndex=1", nil) //新建请求样式 - //set部分可不要 - reqest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") - reqest.Header.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3") - reqest.Header.Set("Accept-Encoding", "gzip,deflate,sdch") - reqest.Header.Set("Accept-Language", "zh-CN,zh;q=0.8") - reqest.Header.Set("Cache-Control", "max-age=0") - reqest.Header.Set("Connection", "keep-alive") - //add部分必须参数 - reqest.Header.Add("Authorization", "Basic cHJvdmlkZXI6UHYmODlJam4=") - reqest.Header.Add("beginDate", "2015-09-01 12:00:00") - reqest.Header.Add("endDate", "2017-09-08 12:00:00") - - response, err := client.Do(reqest) //发送定制化后的请求 - if response.StatusCode == 200 { - body, _ := ioutil.ReadAll(response.Body) - bodystr := string(body) - return bodystr - } - return err.Error() - } - - //curl -v -k -X PUT http://127.0.0.1:9763/rest/configuration -H "Authorization:Basic cHJvdmlkZXI6UHYmODlJam4=" -H "Content-Type:application/json;CHARSET=UTF-8" - //-d '{"params": [{"name": "trace.message", "value": "on"}]}' - func putconf() string { - //postbody := strings.NewReader("{'params': [{'name':'trace.message','value':'on'}]}") - postbody := strings.NewReader(`{"params": [{"name": "trace.message", "value": "on"}]}`) - client := &http.Client{} - reqest, _ := http.NewRequest("PUT", "http://10.175.102.220:9580/rest/configuration", postbody) //新建请求样式 - fmt.Println(reqest) - //add部分必须参数 - reqest.Header.Add("Authorization", "Basic cHJvdmlkZXI6UHYmODlJam4=") - reqest.Header.Add("Content-Type", "application/json;CHARSET=UTF-8") - fmt.Println(reqest.Header) - fmt.Println("======2") - //fmt.Println(reqest.Body.Read([]byte(`{"params": [{"name": "trace.message", "value": "on"}]}`))) - response, err := client.Do(reqest) //发送定制化后的请求 - fmt.Println(err) - fmt.Println(response.StatusCode) - if response.StatusCode == 200 { - body, _ := ioutil.ReadAll(response.Body) - bodystr := string(body) - return bodystr - } - return err.Error() - } - -} - -HTTP代理{ -1.带密码的代理 - package main - - import ( - "fmt" - "io/ioutil" - "net/http" - "net/url" - "os" - ) - - ///这种方式在window上跑不过:An attempt was made to access a socket in a way forbidden by its access permissions.是因为isafe的限制 - //但在linux上 url.Parse("http://name:passwd@172.18.32.134:8080") 是可以的 go run go例子7_代理.go - func main() { - - proxy := func(ht *http.Request) (*url.URL, error) { - /* - auserinfo := url.UserPassword("name", "passwd") - fmt.Println("auserinfo:", auserinfo) - fmt.Print("QueryUnescape:") - fmt.Println(url.QueryUnescape(auserinfo.String())) - name, _ := url.QueryUnescape("name") - pass, _ := url.QueryUnescape("passwd") - auserinfo1 := url.UserPassword(name, pass) - fmt.Println("auserinfo1:", auserinfo1) - - aurl := &url.URL{ - Scheme: "http", - Host: "172.18.32.134:8080", - Opaque: "name:passwd", - //User :auserinfo, - - } - //RawQuery: - //User :auserinfo, - //Host :url.QueryEscape("http://name:passwd@172.18.32.134:8080"), - //Host :"172.18.32.134:8080", - //Scheme:"http",//格式 - //Opaque:"http://name:passwd@172.18.32.134:8080",//不透明 - - fmt.Println("====:", aurl.String()) - */ - return url.Parse("http://name:passwd@172.18.32.134:8080") //根据定义Proxy func(*Request) (*url.URL, error)这里要返回url.URL - //return url.Parse(aurl.String()) - } - //proxies = {"http": "http://name:qwer!4321@172.18.32.134:8080","https": "https://name:qwer!4321@172.18.32.134:8080"} - transport := &http.Transport{ - Proxy: proxy, - } - client := &http.Client{Transport: transport} - resp, err := client.Get("http://www.cnblogs.com/") //请求并获取到对象,使用代理 - //resp, err := client.Get("http://3ms.huawei.com/") //请求并获取到对象,使用代理 - - if err != nil { - fmt.Println(err) - } - dataproxy, err := ioutil.ReadAll(resp.Body) //取出主体的内容 - if err != nil { - fmt.Println(err) - } else { - fmt.Println(string(dataproxy)) - } - defer resp.Body.Close() - fmt.Println("使用代理:%s", proxy) //打印 - } - - func Env_proxy() { - //go theproxy() - fmt.Println("Hello World") - goPath := os.Getenv("GOPATH") - fmt.Printf("The goPath is: %s\n", goPath) - //proxies = {"http": "http://name:passwd@172.18.32.134:8080","https": "https://name:passwd@172.18.32.134:8080"} - os.Setenv("HTTP_PROXY", "http://name:passwd@172.18.32.134:8080") - os.Setenv("HTTP_PROXYS", "https://name:passwd@172.18.32.134:8080") - //fmt.Println(os.Environ()) - fmt.Println("==================1") - transport := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - } - client1 := &http.Client{Transport: transport} - resp, err := client1.Get("http://www.cnblogs.com/") //请求并获取到对象,使用代理 - fmt.Println("==================2") - if err != nil { - fmt.Println(err) - } - dataproxy, err := ioutil.ReadAll(resp.Body) //取出主体的内容 - if err != nil { - fmt.Println(err) - } else { - fmt.Println(string(dataproxy)) - } - fmt.Println("==================3") - defer resp.Body.Close() - } - - -} - -bee学习{ -//GOPATH环境变量添加时: -添加D:\gosms路径之后,GOPATH字符串后面多了一个;,去掉;,并cmd重启,可解决。 -GOPATH :E:\\GoWork -GOROOT :C:\Go\ -Path :C:\Go\bin;E:\GoWork\bin - -#上面都配好后 ->bee new hello ->bee run hello - -//在浏览器中打开 http://localhost:8080/ 进行访问 - -//LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全 -http://www.cnblogs.com/liuning8023/p/4512524.html - -我的实践: -E:\soft\gocode-master\gocode-master\ -下执行 go build -生成gocode-master.exe改名成gocode.exe 替换到C:\liteide\bin下 -重启IDE就行了 -估计是 LiteIDE 自带的 gocode.exe 比较旧的原因 - -} - -关于switch{ - func main(){ - list := []string{"a", "b", "c", "d", "e", "f"} - for _,y:=range list{ - switch y { - case "a": - fmt.Println("a") - goto end - case "b": - fmt.Println("b") - case "c": - fmt.Println("c") - case "d": - fmt.Println("d") - case "e": - fmt.Println("e") - - } - - - } - end: -} - -func main(){ - list := []string{"a", "b", "c", "d", "e", "f"} - var bb =false - for _,y:=range list{ - if bb==true{ - break - } - switch y { - case "a": - fmt.Println("a") - bb=true - case "b": - fmt.Println("b") - case "c": - fmt.Println("c") - case "d": - fmt.Println("d") - case "e": - fmt.Println("e") - - } - - - } -} - - -func main(){ - - b:=aa() - fmt.Println("aaaa",b) -} - -func aa()string{ - list := []string{"a", "b", "c", "d", "e", "f"} - for _,y:=range list{ - switch y { - case "a": - fmt.Println("a") - - case "b": - fmt.Println("b") - return "a" - break - case "c": - fmt.Println("c") - case "d": - fmt.Println("d") - case "e": - fmt.Println("e") - - } - - - - } - return "" -} - -package main - -import ( - "encoding/json" - "fmt" - "strconv" - //"strings" -) - -//很好的解析json的方法,直接返回key对应的value,无论多深的json,但在key存在重复时,请注意可能出现异常 -func EasyJson(key string, str string) string { - b := []byte(str) - var f interface{} - var ret string - err := json.Unmarshal(b, &f) - if err != nil { - fmt.Println("解析json失败:", err) - return "" - } - switch f.(type) { - case map[string]interface{}: - m := f.(map[string]interface{}) - for k, v := range m { - if k == key { - switch vv := v.(type) { - case bool: - ret = strconv.FormatBool(vv) - goto end - case string: - ret = vv - goto end - case float64: - ret = strconv.FormatFloat(vv, 'f', -1, 64) - goto end - case []interface{}: - by, _ := json.Marshal(vv) - fmt.Println(k, "is array1", string(by)) - ret = string(by) - goto end - case map[string]interface{}: - by, _ := json.Marshal(vv) - fmt.Println(k, "is map1", string(by)) - ret = string(by) - goto end - default: - fmt.Println(k, "is of a err1 type") - } - } - switch vv2 := v.(type) { - case []interface{}: - by, _ := json.Marshal(vv2) - fmt.Println(k, "is array1", string(by)) - ret = EasyJson(key, string(by)) - case map[string]interface{}: - by, _ := json.Marshal(vv2) - fmt.Println(k, "is map1", string(by)) - ret = EasyJson(key, string(by)) - default: - fmt.Println(k, "is of a err2 type") - } - } - case []interface{}: - by, _ := json.Marshal(f) - fmt.Println(by, "is array1", string(by)) - ret = EasyJson(key, string(by)) - } -end: - return ret -} - -func main() { - a := `{ - "Title": "Go语言编程", - "Authors": ["XuShiwei", "HughLv", "Pandaman", "GuaguaSong", "HanTuo", "BertYuan","XuDaoli",{"cmap":{"a":1,"b":"b","c":0.11}}], - "Publisher": "ituring.com.cn", - "IsPublished": true, - "Price": 9.99, - "Sales": 1000000, - "amap":{"a":1,"b":2,"c":3}, - "bmap":{"a":1,"b":"b","c":0.11} - }` - - atype := EasyJson("amap", a) - fmt.Println("解析结果是:", atype) -} - - - -} - -关于贝叶斯算法与机器学习{ - -http://www.cnblogs.com/LeftNotEasy/archive/2010/08/29/1812101.html -http://www.cnblogs.com/kesalin/p/bayes_rule.html -http://www.cnblogs.com/elaron/archive/2012/10/26/2741511.html -http://www.cnblogs.com/Finley/p/5334987.html -http://www.cnblogs.com/netuml/p/5725650.html -http://www.cnblogs.com/marc01in/p/4775440.html - -//摘要: -通常,事件 A 在事件 B 发生的条件下的概率,与事件 B 在事件 A 发生的条件下的概率是不一样的;然而,这两者是有确定关系的,贝叶斯定理就是这种关系的陈述。 -贝叶斯公式的用途在于通过己知三个概率来推测第四个概率。它的内容是:在 B 出现的前提下,A 出现的概率等于 A 出现的前提下 B 出现的概率乘以 A 出现的概率再除以 B 出现的概率。通过联系 A 与 B,计算从一个事件发生的情况下另一事件发生的概率,即从结果上溯到源头(也即逆向概率)。 - -通俗地讲就是当你不能确定某一个事件发生的概率时,你可以依靠与该事件本质属性相关的事件发生的概率去推测该事件发生的概率。用数学语言表达就是:支持某项属性的事件发生得愈多,则该事件发生的的可能性就愈大。这个推理过程有时候也叫贝叶斯推理。 - -P(B|A) = P(A|B) * P(B) / [P(A|B) * P(B) + P(A|~B) * P(~B) ] - -收缩起来就是: - -P(B|A) = P(AB) / P(A) - -其实这个就等于: - -P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B) - -难怪拉普拉斯说概率论只是把常识用数学公式表达了出来。 - -然而,后面我们会逐渐发现,看似这么平凡的贝叶斯公式,背后却隐含着非常深刻的原理。 -} - -beego的dome{ -#项目名 mypro2 -//////////////main.go -package main - -import ( - "fmt" - - "github.com/astaxie/beego" - "github.com/astaxie/beego/orm" - - _ "mypro2/routers" - - _ "github.com/go-sql-driver/mysql" -) - -//数据库的配置 -const ( - DRIVER_NAME = "mysql" - DATA_SOURCE = "root:root@tcp(10.120.189.164:15432)/golang?charset=utf8" //使用golang数据库 - MAX_IDLE_CONN = 5 - MAX_OPEN_CONN = 30 -) - -func init() { - // 注册驱动 - orm.RegisterDriver("mysql", orm.DRMySQL) - // 注册默认数据库 - // 备注:此处第一个参数必须设置为“default”(因为我现在只有一个数据库),否则编译报错说:必须有一个注册DB的别名为 default - orm.RegisterDataBase("default", DRIVER_NAME, DATA_SOURCE, MAX_IDLE_CONN, MAX_OPEN_CONN) -} - -func main() { - fmt.Println("开始运行!") - // 开启 orm 调试模式:开发过程中建议打开,release时需要关闭,只在本函数中生效,可以显示建表过程 - orm.Debug = true - // 自动建表 - orm.RunSyncdb("default", false, true) - beego.Run() -} -//////////////models.go -package models - -import ( - "github.com/astaxie/beego/orm" -) - -type User struct { - Id int - Name string - Age string - Sex string -} - -//Profile *Profile `orm:"rel(one)"` // OneToOne relation -/* -type Profile struct { - Id int - Age int16 - User *User `orm:"reverse(one)"` // 设置反向关系(可选) -} -*/ -//数据库中自动建立 user 表和其中的键 -func init() { - // 需要在 init 中注册定义的 model - //orm.RegisterModel(new(User), new(Profile)) - orm.RegisterModel(new(User)) -} - -//////////////controllers.go -package controllers - -import ( - "fmt" - "mypro2/models" - "strconv" - - "github.com/astaxie/beego" - "github.com/astaxie/beego/orm" -) - -type MainController struct { - beego.Controller -} - -//默认的 -func (c *MainController) Gets() { - c.Data["Website"] = "beego.me" - c.Data["Email"] = "astaxie@gmail.com" - //定义首页模板 - c.TplName = "index.tpl" -} - -func (c *MainController) Add() (err error) { - orm.Debug = true //只在本函数中生效,可以显示增加api的过程 - - var id int - var name string - var age string - var sex string - err = c.Ctx.Input.Bind(&id, ":id") //此方法只能获取url的context中的参数 - name, age, sex = c.Input().Get("name"), c.Input().Get("age"), c.Input().Get("sex") //获取url中固定参数 - if err != nil { - fmt.Println("add err:", err) - return err - } - user := new(models.User) - user.Name = name - user.Sex, err = strconv.ParseBool(sex) - if err != nil { - fmt.Println("sex`s type is err", err) - return err - } - user.Age, err = strconv.Atoi(age) - if err != nil { - fmt.Println("age`s type is err", err) - return err - } - //建立连接 - norm := orm.NewOrm() - //开始事务 - if err = norm.Begin(); err != nil { - fmt.Println("开始事务失败:", err) - return err - } - //插入缓存 - _, err = norm.Insert(user) - if err == nil { - //提交修改 - err = norm.Commit() - if err == nil { - fmt.Println("创建API成功:", user.Id) - } else { - fmt.Println("创建API失败:", err) - return err - } - } else { - fmt.Println("插入数据库失败:", err) - return err - //回退 - err1 := norm.Rollback() - if err1 != nil { - fmt.Println("事务回退失败:", err1) - return err - } - } - return -} - -func (c *MainController) Get() { - orm.Debug = true - - var id int - err := c.Ctx.Input.Bind(&id, ":id") - if err != nil { - fmt.Println("add err:", err) - } - // 创建一个 ormer 对象 - o := orm.NewOrm() - //o.Using("default") - - user := new(models.User) - _, err = o.QueryTable("User").Filter("id", id).All(&user) - - if err != nil { - fmt.Println("GetApi sql error ") - } - fmt.Println("查询API:", user) - -} - -func (c *MainController) Delete() { - orm.Debug = true - - var id int - // 创建一个 ormer 对象 - o := orm.NewOrm() - o.Using("default") - - err := c.Ctx.Input.Bind(&id, ":id") - if err != nil { - fmt.Println("add err:", err) - } - // delete - o.Delete(&models.User{Id: id}) - fmt.Println("删除API:", &models.User{Id: id}) -} - - -//////////////routers.go -package routers - -import ( - "mypro2/controllers" - - "github.com/astaxie/beego" -) - -func init() { - beego.Router("/", &controllers.MainController{}, "get:Gets") -} - -func init() { - - var MyApis controllers.MainController - - //添加api - beego.Router("/api/:id:int", &MyApis, "put:Add") - //删除api - beego.Router("/api/:id:int", &MyApis, "delete:Delete") - //api查找 - beego.Router("/api/:id:([0-9]+)", &MyApis, "get:Get") - -} - -/* -curl -k -v -X PUT "http://10.177.241.210:8080/api/1?name=lgj&age=18&sex=20" -curl -k -v -X GET "http://10.177.241.210:8080/api/1" -curl -k -v -X PUT "http://10.177.241.210:8080/api/1" -*/ - - - - -} - -包导入{ - -1 相对路径 - -import ".model" //<--是与当前文件同一目录的model目录,但是不建议使用这种方式来导包 - -2 绝对路径 - -import "shortcut/model" //<--加载gopath/src/shortulr/model模块 - -3 点操作 -我们有时候会看到如下的方式导入包 - -import(. " fmt") - -这个点操作的含义就是这个包导入之后在你调用这个包的函数时, 你可以省略前缀的包名, 也就是前面你调用的fmt. Println("hello world") 可以省略的写成Println("hello world"),无闻的视频上建议不要使用这样的方式,可读性太差 - -4 别名操作 -别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字 -import(f " fmt") -别名操作的话调用包函数时前缀变成了 我们的前缀, 即f. Println("hello world"),个人不喜欢这种方式,好好的系统包调用名字你给改了,其他人读代码多不爽 - -5 _操作 -import ( -" database/ sql" -_ " github. com/ziutek/mymysql/godrv"//<----很重要 感谢天感谢地可算知道这破玩意是啥意思了 -) -_ 操作其实是引入该包, 而不直接使用包里面的函数, 而是调用了该包里面的init函数 - -} - -godoc与go doc{ - - http://www.cnblogs.com/phpgo/p/6442208.html - godoc -http=:9090 -index - - -} - -//再进阶部分 -go flag 包{ - //命令行解析 - http://www.cnblogs.com/phpgo/p/6732297.html -} - -readpasswd不回显{ -//读取passwd不回显 ,仅linux上 -package main - -import ( - "fmt" - //"os" - //"os/exec" - "io" - "syscall" - "unsafe" -) - -func main() { - fmt.Println("Enter password: ") - password, err := ReadPassword(0) - if err == nil { - fmt.Println("Password typed: " + string(password)) - } - fmt.Println("err:", err) -} - -func ReadPassword(fd int) ([]byte, error) { - var oldState syscall.Termios - //ioctlWriteTermios := uintptr(syscall.TCGETS) - //ioctlReadTermios := uintptr(syscall.TCSETS) - //uintptr(syscall.TCGETS) 是读取 - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCGETS), uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); err != 0 { - return nil, err - } - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - //uintptr(syscall.TCGETS) 是输出 - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { - return nil, err - } - - defer func() { - syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&oldState)), 0, 0, 0) - }() - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} - -/* -root@api:/home/lgj/Go# go run readpasswd.go -Enter password: -Password typed: dwaoidhoihruofg -err: -root@api:/home/lgj/Go# -*/ - -} - -pipe{ -//例子1 -func main() { - date1 := []byte("hello1") - //date2 := make([]byte, 11) - date2 := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //等效于make - r, w := io.Pipe() - go Write(w, date1) - Read(r, date2) - fmt.Println("date2:", string(date2)) -} - -func Read(r *io.PipeReader, date []byte) int { - n, err := r.Read(date) - if err == nil { - fmt.Println("read:", n) - } - return n -} - -func Write(w *io.PipeWriter, date []byte) int { - n, err := w.Write(date) - if err == nil { - fmt.Println("write:", n) - } - return n -} - - -//例子2 -func main() { - reader, writer := io.Pipe() - inputData := []byte("1234567890ABCD") - go writer.Write(inputData) - outputData := make([]byte, 11) - n, _ := reader.Read(outputData) - fmt.Println("read number", n) - fmt.Println(string(outputData)) - -} -//例子3 -func main() { - - reader, writer ,_ := os.Pipe() - inputData := []byte("1234567890ABCD") - go writer.Write(inputData) - outputData := make([]byte, 11) - n, _ := reader.Read(outputData) - fmt.Println("read number", n) - fmt.Println(string(outputData)) - -} - - -//例子4 -package main - -import( - "fmt" - "io" - "time" - "math/rand" - -) - -var r = rand.New(rand.NewSource(time.Now().UnixNano())) - -func generate(writer *io.PipeWriter) { - arr := make([]byte, 32) - for { - for i := 0; i < 32; i++ { - arr[i] = byte(r.Uint32() >> 24) - } - _, err := writer.Write(arr) - if nil != err { - fmt.Println(err) - } - time.Sleep(200 * time.Millisecond) - } -} - -func main() { - rp, wp := io.Pipe() - for i := 0; i < 20; i++ { - go generate(wp) - } - time.Sleep(1 * time.Second) - data := make([]byte, 64) - for { - n, err := rp.Read(data) - if nil != err { - fmt.Println(err) - } - if 0 != n { - fmt.Println("main loop", n, string(data)) - } - time.Sleep(1 * time.Second) - } -} - - - -} - -并发写文件之死锁{ -//例子1 -package main - -import( - "fmt" - "os" - //"sync" - "time" -) -//var lock sync.Mutex -func main(){ - - f, e := os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\print.log", os.O_RDWR, 0) - fmt.Println(e) - for i := 0; i < 5; i++ { - fmt.Println("wirting") - go bb(f) - } - f.Sync() - defer f.Close() - time.Sleep(60) //不加的话主程序会提前退出,文件写入不完整,当然这种方法不推荐 - - -} -func bb(f *os.File){ - //lock.Lock() - f.WriteString("hello\n") - //lock.Unlock() -} - -//例子2 -package main - -import( - "fmt" - "os" - "sync" -) -//调度器不能保证多个 goroutine 执行次序,且进程退出时不会等待它们结束。 -//可使用环境变量或标准库函数 runtime.GOMAXPROCS 修改,让调度器执行多个线程实现多核并行,而不仅仅是并发。 -func main(){ - wg := new(sync.WaitGroup) //WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的 - wg.Add(7) //不加的话主程序会提前退出,文件写入不完整,需要和for中的个数统一 - f, e := os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\print.log", os.O_RDWR, 0) - fmt.Println(e) - for i:=0;i<7;i++{ - go func(f *os.File) { - defer wg.Done() - f.WriteString("hell11111o\n") - }(f) - } - wg.Wait() -} - -//例子3 -package main -import ( - "fmt" - "runtime" -) -func say(s string) { - for i := 0; i < 5; i++ { - runtime.Gosched() //runtime.Gosched()表示让CPU把时间片让给别人,下次某个时候继续恢复执行该goroutine。 - fmt.Println(s) - } -} -func main() { - go say("world") //开一个新的Goroutines执行 - say("hello") //当前Goroutines执行 - fmt.Println(runtime.GOMAXPROCS(6)) //设置环境变量GOMAXPROCS的值来控制使用多少个CPU核心---设置为6但只成功4个 - fmt.Println(string(runtime.CPUProfile())) - fmt.Println(runtime.NumCPU())//获得核心数 -} - -//例子4 -package main - -import ( - "fmt" - "net/http" - "sync" -) -//想要完整执行url ,这几句缺一不可 -func main() { - var wg sync.WaitGroup - var urls = []string{ - "http://www.golang.org/", - "http://www.google.com/", - "http://www.somestupidname.com/", - } - for _, url := range urls { - // 遍历,执行一个增加一个等待 - wg.Add(1) - // Launch a goroutine to fetch the URL. - go func(url string) { - // defer是必须的 - defer wg.Done() - // Fetch the URL. - http.Get(url) - fmt.Println("我先干活, 主程序等着我") - }(url) - } - // Wait for all HTTP fetches to complete. - wg.Wait() - fmt.Println("应该最后才出来") - -} -/* -type WaitGroup //相当于一个箱子,将main goroutine 保护到里面 -func (*WaitGroup) Add //调用一次为箱子加一把锁(当然,你愿意也可以多把) -func (*WaitGroup) Done // 调用一次开一把锁(only one!) -func (*WaitGroup) Wait //箱子的盖子,没锁了自动打开 -*/ - -//例子5 -package main - -//阻塞,直到WaitGroup中的所以过程完成。 -import ( - "fmt" - "sync" -) - -func wgProcess(wg *sync.WaitGroup, id int) { - fmt.Printf("process:%d is going!\n", id) - wg.Done() -} - -func main() { - //var wg sync.WaitGroup - wg := new(sync.WaitGroup) - for i := 0; i < 3; i++ { - wg.Add(1) - go wgProcess(wg, i) - } - wg.Wait() - fmt.Println("after wait group") -} - -//例子6 - -//最方便的方式 chan - -package main - -import( - "fmt" -) - -var complete chan int = make(chan int) - -func loop() { - for i := 0; i < 10; i++ { - fmt.Printf("%d ", i) - } - complete <- 0 // 执行完毕了,发个消息 -} - -func main() { - go loop() - <- complete // 直到线程跑完, 取到消息. main在此阻塞住 -} - -//例子7 -//进阶版 -package main - -import( - "fmt" - "os" -) - -var complete chan int = make(chan int) - -func loop(f *os.File) { - for i := 0; i < 10; i++ { - f.WriteString("测试字符\n") - } - complete <- 0 // 执行完毕了,发个消息 -} - -func main() { - f, e := os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\print.log", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) - if e!=nil{ - fmt.Println(e) - } - go loop(f) - go loop(f) - //go loop(f) //-->fatal error: all goroutines are asleep - deadlock! 死锁 注释掉此句,主程序知道不会等到complete返回了,所以不再等待goroutines。 - <- complete // 直到线程跑完, 取到消息. main在此阻塞住 - <- complete // 直到线程跑完, 取到消息. main在此阻塞住 -} - -//为什么会死锁?非缓冲信道上如果发生了流入无流出,或者流出无流入,也就导致了死锁。或者这样理解 Go启动的所有goroutine里的非缓冲信道一定要一个线里存数据,一个线里取数据,要成对才行 。 - -//例子8 -//缓冲信道 如何产生死锁 -package main - -import( - "fmt" -) - -var ch chan int = make(chan int) - -func foo(id int) { //id: 这个routine的标号 - ch <- id -} - -func main() { - // 开启5个routine - for i := 0; i < 5; i++ { - go foo(i) - } - - // 取出信道中的数据 - for i := 0; i < 6 ; i++ { //只有5个进程,多取一个都会死锁,少取并不会 - fmt.Print(<- ch) - } -} - -} - -并行测试{ - -//例子1 -package main - -import ( - "fmt" - "runtime" -) -//并行测试 -//当一个goroutine发生阻塞,Go会自动地把与该goroutine处于同一系统线程的其他goroutines转移到另一个系统线程上去,以使这些goroutines不阻塞 -var quit chan int = make(chan int) - -func loop(id int) { // id: 该goroutine的标号 - for i := 0; i < 10; i++ { //打印10次该goroutine的标号 - fmt.Printf("%d,%d ", id,i) - } - quit <- 0 -} - -func main() { - runtime.GOMAXPROCS(2) // 最多同时使用2个核 - //runtime.GOMAXPROCS(1) // 最多同时使用1个核,结果如下: - //2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 - for i := 0; i < 3; i++ { //开三个goroutine - go loop(i) - } - - for i := 0; i < 3; i++ { - <- quit - } -} - -//0,0 0,1 0,2 0,3 0,4 0,5 0,6 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 1,0 1,1 1,2 0,7 0,8 0,9 1,3 1,4 1,5 1,6 1,7 1,8 1,9 - -/* -1. 有时会发生抢占式输出(说明Go开了不止一个原生线程,达到了真正的并行) -2. 有时会顺序输出, 打印完3再打印4, 再打印5(说明Go开一个原生线程,单线程上的goroutine不阻塞不松开CPU) -3. 还会观察到一个现象,无论是抢占地输出还是顺序的输出,都会有那么两个数字表现出这样的现象: -一个数字的所有输出都会在另一个数字的所有输出之前 -原因是, 3个goroutine分配到至多2个线程上,就会至少两个goroutine分配到同一个线程里,单线程里的goroutine 不阻塞不放开CPU, 也就发生了顺序输出。 - -第三个结论和观察不符,,不是每次都出现,需要后面讨论。但和多线程设计思路相同 -*/ - -//例子2 - -} - -打开文件的flag{ - -func OpenFile(name string, flag int, perm FileMode) (file *File, err error)  -//指定文件权限和打开方式打开name文件或者create文件,其中flag标志如下: -O_RDONLY :只读模式(read-only) -O_WRONLY :只写模式(write-only) -O_RDWR :读写模式(read-write) -O_APPEND :追加模式(append) -O_CREATE :文件不存在就创建(create a new file if none exists.) -O_EXCL :与 O_CREATE 一起用,构成一个新建文件的功能,它要求文件必须不存在(used with O_CREATE, file must not exist) -O_SYNC :同步方式打开,即不使用缓存,直接写入硬盘 -O_TRUNC :打开并清空文件 - -至于操作权限perm,除非创建文件时才需要指定,不需要创建新文件时可以将其设定为0.虽然go语言给perm权限设定了很多的常量, -但是习惯上也可以直接使用数字,如0666(具体含义和Unix系统的一致). - -} - -os包{ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "reflect" - "time" -) - -func main() { - dir, _ := os.Getwd() - fmt.Println("dir:", dir) - err := os.Chdir("d:/project/test2") - dir, _ = os.Getwd() - fmt.Println("dir:", dir) - - //参数不区分大小写 - //不存在环境变量就返回空字符串 len(path) = 0 - path := os.Getenv("gopath") - fmt.Println(path) - - //返回有效group id - egid := os.Getegid() - fmt.Println("egid:", egid) - - //返回有效UID - euid := os.Geteuid() - fmt.Println("euid:", euid) - - gid := os.Getgid() - fmt.Println("gid:", gid) - - uid := os.Getuid() - fmt.Println("uid:", uid) - - ppid := os.Getppid() - fmt.Println("ppid", ppid) - - //err:getgroups: not supported by windows - g, err := os.Getgroups() - fmt.Println(g, "error", err) - - pagesize := os.Getpagesize() - fmt.Println("pagesize:", pagesize) - - - - //filemode, err := os.Stat("main.go") - //不存在文件返回GetFileAttributesEx test2: The system cannot find the file specified. - filemode, err := os.Stat("main.go") - if err == nil { - fmt.Println("Filename:", filemode.Name()) - fmt.Println("Filesize:", filemode.Size()) - fmt.Println("Filemode:", filemode.Mode()) - fmt.Println("Modtime:", filemode.ModTime()) - fmt.Println("IS_DIR", filemode.IsDir()) - fmt.Println("SYS", filemode.Sys()) - } else { - fmt.Println("os.Stat error", err) - } - - //Chmod is not supported under windows. - //在windows变化是这样子的 -rw-rw-rw- => -r--r--r-- - err = os.Chmod("main.go", 7777) - fmt.Println("chmod:", err) - filemode, err = os.Stat("main.go") - fmt.Println("Filemode:", filemode.Mode()) - - //access time modification time - err = os.Chtimes("main.go", time.Now(), time.Now()) - fmt.Println("Chtime error:", err) - - //获取全部的环境变量 - data := os.Environ() - for _, val := range data { - fmt.Println(val) - } - fmt.Println("---------end---environ----------------------") - - mapping := func(s string) string { - m := map[string]string{"xx": "sssssssssssss", - "yy": "ttttttttttttttt"} - return m[s] - } - datas := "hello $xx blog address $yy" - //这个函数感觉还蛮有用处 - expandStr := os.Expand(datas, mapping) - fmt.Println(expandStr) - datas = "GOBIN PATH $gopaTh" //不区分大小写 - fmt.Println(os.ExpandEnv(datas)) - - hostname, err := os.Hostname() - fmt.Println("hostname:", hostname) - - _, err = os.Open("WWWW.XX") - if err != nil { - fmt.Println(os.IsNotExist(err)) - fmt.Println(err) - } - - f, err := os.Open("WWWW.XX") - if err != nil && !os.IsExist(err) { - fmt.Println(f, "not exist") - } - - //windows 下两个都是true - fmt.Println(os.IsPathSeparator('/')) - fmt.Println(os.IsPathSeparator('\\')) - fmt.Println(os.IsPathSeparator('.')) - - //判断返回的error 是否是因为权限的问题 - //func IsPermission(err error) bool - - // not supported by windows - err = os.Link("main.go", "newmain.go") - if err != nil { - fmt.Println(err) - } - - var pathSep string - if os.IsPathSeparator('\\') { - pathSep = "\\" - } else { - pathSep = "/" - } - fmt.Println("PathSeparator:", pathSep) - //MkdirAll 创建的是所有下级目录,如果没有就创建他 - //Mkdir 创建目录,如果是多级目录遇到还未创建的就会报错 - err = os.Mkdir(dir+pathSep+"md"+pathSep+"md"+pathSep+"md"+pathSep+"md"+pathSep+"md", os.ModePerm) - if err != nil { - fmt.Println(os.IsExist(err), err) - } - - err = os.RemoveAll(dir + "md\\md\\md\\md\\md") - fmt.Println("removall", err) - - //rename 实际上通过movefile来实现的 - err = os.Rename("main.go", "main1.go") - //文件相同判断 - f1, _ := os.Stat("main.go") - f2, _ := os.Stat("main1.go") - if os.SameFile(f1, f2) { - fmt.Println("the sanme") - } else { - fmt.Println("not same") - } - - //os.Setenv 这个函数是设置环境变量的很简单 - evn := os.Getenv("WD_PATH") - fmt.Println("WD_PATH:", evn) - err = os.Setenv("WD_PATH", "D:/project") - if err != nil { - fmt.Println(err) - } - //临时目录 - tmp, _ := ioutil.TempDir(dir, "tmp") - fmt.Println(tmp) - tmp = os.TempDir() - fmt.Println(tmp) - - cf, err := os.Create("golang.go") - defer cf.Close() - fmt.Println(err) - fmt.Println(reflect.ValueOf(f).Type()) - - of, err := os.OpenFile("golang.goss", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777) - defer of.Close() - fmt.Println("os.OpenFile:", err) - - oof, err := os.Open("golang.goss") - defer oof.Close() - fmt.Println("os.Open file:", oof.Fd()) - fmt.Println("os.Open err:", err) - oof.Close() - - r, w, err := os.Pipe() - w.Write([]byte("1111")) - var buf = make([]byte, 4) - r.Read(buf) - fmt.Println(buf) - w.Write([]byte("2222")) - r.Read(buf) // 如果没有调用w.Write(),r.Read()就会阻塞 - fmt.Println("ssss--", buf) - - b := make([]byte, 100) - ff, _ := os.Open("main.go") - n, _ := ff.Read(b) - fmt.Println(n) - fmt.Println(string(b[:n])) - - //第二个参数,是指,从第几位开始读取 - n, _ = ff.ReadAt(b, 20) - fmt.Println(n) - fmt.Println(string(b[:n])) - - //获取文件夹下文件的列表 - dirs, err := os.Open("md") - if err != nil { - fmt.Println(err) - } - defer dirs.Close() - //参数小于或等去0,表示读取所有的文件 - //另外一个只读取文件名的函数 - //fs, err := dirs.Readdirname(0) - fs, err := dirs.Readdir(-1) - if err == nil { - for _, file := range fs { - fmt.Println(file.Name()) - } - } else { - fmt.Println("Readdir:", err) - } - - //func (f *File) WriteString(s string) (ret int, err error) - //写入字符串函数原型,哪个个函数比较快呢?? - - //p, _ := os.FindProcess(628) - //fmt.Println(p) - //p.Kill() - attr := &os.ProcAttr{ - Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, - } - //参数也可以这么写 `c:\windows\system32\notepad.EXE` 用的是反单引号 - p, err := os.StartProcess("c:\\windows\\system32\\notepad.EXE", []string{"c:\\windows\\system32\\notepad.EXE", "d:/1.txt"}, attr) - p.Release() - time.Sleep(1000000000) - p.Signal(os.Kill) - os.Exit(10) - -} -} - -调用系统API{ - -syscall.Syscall系列方法 -当前共5个方法 - -syscall.Syscall -syscall.Syscall6 -syscall.Syscall9 -syscall.Syscall12 -syscall.Syscall15 -分别对应 3个/6个/9个/12个/15个参数或以下的调用 - -参数都形如 -syscall.Syscall(trap, nargs, a1, a2, a3) -第二个参数, nargs 即参数的个数,一旦传错, 轻则调用失败,重者直接APPCARSH -多余的参数, 用0代替 - - -//例子1 -package main - -import( - "fmt" - "unsafe" - "syscall" -) -//获取磁盘空间 -func main(){ -fmt.Println("Hello World") -//首先,准备输入参数, GetDiskFreeSpaceEx需要4个参数, 可查MSDN -lpFreeBytesAvailable := int64(0) //注意类型需要跟API的类型相符 -lpTotalNumberOfBytes := int64(0) -lpTotalNumberOfFreeBytes := int64(0) - -//获取方法的引用 -kernel32, err := syscall.LoadLibrary("Kernel32.dll") // 严格来说需要加上 defer syscall.FreeLibrary(kernel32) -fmt.Println(err) -GetDiskFreeSpaceEx, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GetDiskFreeSpaceExW") -fmt.Println(err) - -//执行之. 因为有4个参数,故取Syscall6才能放得下. 最后2个参数,自然就是0了 -r, _, err := syscall.Syscall6(uintptr(GetDiskFreeSpaceEx), 4, - uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("C:"))), - uintptr(unsafe.Pointer(&lpFreeBytesAvailable)), - uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)), - uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)), 0, 0) - -// 注意, errno并非error接口的, 不可能是nil -// 而且,根据MSDN的说明,返回值为0就fail, 不为0就是成功 -fmt.Println(err) -if r != 0 { - fmt.Printf("Free %dmb", lpTotalNumberOfFreeBytes/1024/1024) -} -} - - - - -} - -调用系统命令{ - -//例子1 -package main - -import ( - "os" - "os/exec" -) - -func main() { - run1() - run2() - run3() - run4() -} - -func run1() { - cmd := exec.Command("echo", "hello") - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Start() - cmd.Run() - cmd.Wait() -} - -func run2() { - c1 := exec.Command("ls") - c2 := exec.Command("wc", "-l") - c2.Stdin, _ = c1.StdoutPipe() - c2.Stdout = os.Stdout - c2.Stderr = os.Stderr - c2.Start() - c1.Run() - c2.Wait() -} -//利用管道可以把命令之间的输入输出联系起来 -func run3() { - c1 := exec.Command("ps", "-eaf") - c2 := exec.Command("grep", "node") - c3 := exec.Command("grep", "-v", `"grep"`) - c4 := exec.Command("awk", "{print $2}") - //依次把上个命令的输出作为下一个命令的输入 - c2.Stdin, _ = c1.StdoutPipe() - c3.Stdin, _ = c2.StdoutPipe() - c4.Stdin, _ = c3.StdoutPipe() - //将最后的输出打印到屏幕 - c4.Stdout = os.Stdout - c4.Stderr = os.Stderr - - c4.Start() - c3.Start() - c2.Start() - c1.Run() - c4.Wait() -} -//效果同上 -func run4() { - cmd := exec.Command("/bin/sh", "-c", `ps -eaf|grep "node"|grep -v "grep"|awk '{print $2}'`) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Start() - cmd.Run() - cmd.Wait() -} - - -//例子2 -package main - -import( - "fmt" - "os/exec" - "os" -) -//将cmd中执行结果写入文件 -func main(){ - cmd2() -} - -//通过 输入管道 连续执行多个命令 并将结果重定向到文件 -func cmd1(){ - f, e := os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\print.log", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) - defer f.Close() - fmt.Println(e) - //设置输入输出管道,这样可以连续执行命令 - cmd := exec.Command("cmd", "args") - //stdout, _ := cmd.StdoutPipe() - stdint,_ :=cmd.StdinPipe() - //将输出定向到文件 - cmd.Stdout=f - cmd.Stderr=f - stdint.Write([]byte("help\n")) - stdint.Write([]byte("ipconfig\n")) - stdint.Write([]byte("exit\n")) - cmd.Run() //执行并等待命令完返回 - - //cmd.Start() //只执行,不等待返回 - //cmd.Wait() //等待返回再停止main,配合start使用 -} - -//直接执行单个系统命令并重定向到文件 -func cmd2(){ - f, e := os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\print1.log", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) - defer f.Close() - fmt.Println(e) - //直接执行系统命令 - cmd := exec.Command("help") - //将输出定向到屏幕 - cmd.Stdout=f - cmd.Stderr=f - cmd.Run() //执行并等待命令完返回 - -} -//例子3 -package main - -import( - "os/exec" - "os" -) -//将shell中执行结果写入文件 -func main(){ - //文件读+不存在就创建+打开后清空 ,0666的权限 - f, _ := os.OpenFile("./print.log", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - defer f.Close() - cmd:=exec.Command("/bin/bash") - //设置输入输出管道,这样可以连续执行命令 - //stdout, _ := cmd.StdoutPipe() - stdint,_ :=cmd.StdinPipe() - //将输出定向到文件 - cmd.Stdout=f - cmd.Stderr=f - stdint.Write([]byte("help\n")) //想要这样可以输入必须在cmd定义时使用Command("/bin/bash") 命令集 - stdint.Write([]byte("ifconfig\n")) - stdint.Write([]byte("ls\n")) - stdint.Write([]byte("who\n")) - //cmd.Run() //执行并等待命令完返回 - cmd.Start() - //cmd.Wait() - panic("Hello from panic\n") //此处的错误没能打印到日志中,因为这是main程序的错误 方法见例子4 - -} -//例子4 -package main - -import ( - "fmt" - "os" - "syscall" -) -//linux上将主屏幕定向到文件 -//syscall.Dup2 仅在linux中有效 -func main() { - logFile, _ := os.OpenFile("./print.log", os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0755) - fmt.Println("Hello from main") //此句会被打印到屏幕 - syscall.Dup2(int(logFile.Fd()), 1) //将主屏幕的输入输出定向到log - syscall.Dup2(int(logFile.Fd()), 2) - fmt.Printf("Hello from fmt\n") //词句会被打印到log - panic("Hello from panic\n") //此处的错误被定向到了log中 -} - -//例子5 -package main - -import ( - "fmt" - "os" -) - -//win上将主屏幕重定向到文件,copy报错 :read /dev/stderr: Access is denied. -func main() { - f, e := os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\print1.log", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) - defer f.Close() - fmt.Println("hello world1") //----打印到屏幕 - fmt.Println(os.Stdout.Fd()) //260 - fmt.Println(f.Fd()) //212 - //将输出定向到屏幕 - os.Stdin=f - os.Stdout=f - os.Stderr=f - f, e = os.OpenFile("C:\\Users\\lWX307086\\Desktop\\三月下扬州\\go例子\\测试\\pri\\nt1.log", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0)//尝试触发一个错误 - fmt.Println(e) //----打印文件 - fmt.Println("hello world2") //----打印到文件 - - panic("Hello from panic\n") //----打印到屏幕 ----不知道这个怎么重定向 - -} - - - -} - -信号监听的使用技巧{ - - -os.Signal是信号类型: -type Signal interface { - String() string - Signal() // to distinguish from other Stringers -} -signal.Notify函数用于监听通道的信号: -func Notify(c chan<- os.Signal, sig ...os.Signal) -下面程序简单演示了如何监听信号。 -package main - -import ( - "fmt" - "os" - "os/signal" -) - -func main() { - sigs := make(chan os.Signal, 0) - signal.Notify(sigs) - - s := <-sigs - fmt.Println("Got signal:", s) -} -程序运行后,ps -a命令找出程序进程的PID,然后执行命令kill -SIGUSR1 PID,给程序发信号,程序输出: -Got signal: user defined signal 1 -也可以指定监听的信号类型: -package main - -import "fmt" -import "os" -import "os/signal" -import "syscall" - -func main() { - go SignalProc() - select {} - -} - -func SignalProc() { - sigs := make(chan os.Signal) - signal.Notify(sigs, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGHUP, os.Interrupt) - - for { - msg := <-sigs - fmt.Println("Recevied signal:", msg) - - switch msg { - default: - fmt.Printf("get sig=%v\n", msg) - case syscall.SIGHUP: - fmt.Println("get sighup\n") - case syscall.SIGUSR1: - fmt.Println("SIGUSR1 test") - case syscall.SIGUSR2: - fmt.Println("SIGUSR2 test") - } - } -} - -输入:kill -SIGUSR1 PID -输出: -Recevied signal: user defined signal 1 -SIGUSR1 test -以下是借用go的信号监听机制实现的配置数据热加载程序,其中用sync.RWMutex实现了对配置数据的互诉访问,也用到了json包的解析能力。 -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "log" - "os" - "os/signal" - "sync" - "syscall" -) - -type Config struct { - Name string `json:"Name"` - Age int `json:"Age"` -} - -var ( - config *Config - configLock = new(sync.RWMutex) -) - -func loadConfig() bool { - f, err := ioutil.ReadFile("config.json") - - if err != nil { - fmt.Println("load config error: ", err) - return false - } - - temp := new(Config) - err = json.Unmarshal(f, &temp) - if err != nil { - fmt.Println("Para config failed: ", err) - return false - } - - configLock.Lock() - config = temp - configLock.Unlock() - return true -} - -func GetConfig() *Config { - configLock.RLock() - defer configLock.RUnlock() - return config -} - -func init() { - if !loadConfig() { - os.Exit(1) - } - - fmt.Printf("%v\n", *GetConfig()) - - //热更新配置可能有多种触发方式,这里使用系统信号量sigusr1实现 - s := make(chan os.Signal, 1) - signal.Notify(s, syscall.SIGUSR1) - go func() { - for { - <-s - log.Println("Reloaded config:", loadConfig()) - fmt.Printf("%v\n", *GetConfig()) - } - }() -} - -func main() { - select {} -} - -准备好json文件config.json内容: -{"Name":"taozs","Age":18} -程序启动后的输出: -{taozs 18} -修改json文件config.json内容: -{"Name":"taozs","Age":28} -同样用ps -a找出进程的PID,然后使用命令:kill -SIGUSR1 PID给程序发信号,程度输出: -2017/03/18 08:58:44 Reloaded config: true -{taozs 28} -} - -HTTPS双向认证{ -//http://www.cnblogs.com/sevenyuan/p/4544492.html -//https://github.com/bigwhite/experiments/tree/master/gohttps - -以下通过从增加IP别名、生成证书和key文件、服务端和客户端代码的完整过程给大家演示如何用Go语言实现双向认证,请遵从下面指定的目录结构。 -1、增加IP别名 -/etc/hosts文件中增加两行: -127.0.0.1 server -127.0.0.1 client -2、生成证书和key文件 -文件存放目录:./src/key,另外需要安装openssl。 -(1)生成CA的key和证书文件 -openssl genrsa -out ca.key 2048 -#这里可以使用 -subj 不用进行交互 当然还可以添加更多的信息 -openssl req -x509 -new -nodes -key ca.key -subj "/CN= server" -days 5000 -out ca.crt -(2)生成服务端的key和证书文件 -openssl genrsa -out server.key 2048 -#这里的/cn可以是必须添加的 是服务端的域名 或者是etc/hosts中的ip别名 -openssl req -new -key server.key -subj "/CN=server" -out server.csr -openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000 -(3)生成客户端的key和证书文件 -openssl genrsa -out client.key 2048 -openssl req -new -key client.key -subj "/CN=client" -out client.csr -echo extendedKeyUsage=clientAuth > extfile.cnf -openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out client.crt -days 5000 - -3、服务端代码 -//文件路径:./src/server/server.go -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" -) - -type myhandler struct { -} - -func (h *myhandler) ServeHTTP(w http.ResponseWriter,r *http.Request) { - fmt.Fprintf(w,"Hi, This is an example of https service in golang!\n") -} - -func main() { - pool := x509.NewCertPool() - caCertPath := "../key/ca.crt" - - caCrt, err := ioutil.ReadFile(caCertPath) - if err != nil { - fmt.Println("ReadFile err:", err) - return - } - pool.AppendCertsFromPEM(caCrt) - - s := &http.Server{ - Addr: ":8081", - Handler: &myhandler{}, - TLSConfig: &tls.Config{ - ClientCAs: pool, - ClientAuth: tls.RequireAndVerifyClientCert, - }, - } - - err = s.ListenAndServeTLS("../key/server.crt", "../key/server.key") - if err != nil { - fmt.Println("ListenAndServeTLS err:", err) - } -} -4、客户端代码 -//文件路径:./src/client/client.go -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" -) - -func main() { - pool := x509.NewCertPool() - caCertPath := "../key/ca.crt" - - caCrt, err := ioutil.ReadFile(caCertPath) - if err != nil { - fmt.Println("ReadFile err:", err) - return - } - pool.AppendCertsFromPEM(caCrt) - - cliCrt, err := tls.LoadX509KeyPair("../key/client.crt", "../key/client.key") - if err != nil { - fmt.Println("Loadx509keypair err:", err) - return - } - - tr := &http.Transport{ - TLSClientConfig: &tls.Config{ - RootCAs: pool, - Certificates: []tls.Certificate{cliCrt}, - }, - } - client := &http.Client{Transport: tr} - resp, err := client.Get("https://server:8081") - if err != nil { - fmt.Println("Get error:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - fmt.Println(string(body)) -} - -//cat client.crt client.key |tee client.pem -//curl -key ./client/client.pem --cert ./client/client.pem -v -X get https://server:8081 - -/* --E/--cert 客户端证书文件和密码 (SSL) ---cert-type 证书文件类型 (DER/PEM/ENG) (SSL) ---key 私钥文件名 (SSL) ---key-type 私钥文件类型 (DER/PEM/ENG) (SSL) ---pass 私钥密码 (SSL) ---engine 加密引擎使用 (SSL). "--engine list" for list ---cacert CA证书 (SSL) ---capath CA目 (made using c_rehash) to verify peer against (SSL) ---ciphers SSL密码 -*/ - - -5、注意事项 -(1)https的TLS协议刚开始通信要先握手(handshake),双方互相发送自己的证书(crt文件),本地需要有证书机构的根证书(ca.crt),用于验证对方发来的证书的合法性。 -(2)每一次对话(session),客户端和服务器端都生成一个“对话密钥”(session key),用它来加密信息。由于“对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。请参考:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html -(3)生成证书需要有CA的key和证书,生成key不需要。 -(4)go语言是区分服务端和客户端的,代码不同,客户端生成crt也不同,需要增加单独的文件告知。 -} - -几种HTTPS认证{ -// http -{ - -//http的server -package main - -import ( - "fmt" - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hi, This is an example of http service in golang!") -} - -func main() { - http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) -} - -} -//https-1 -{ - -//server -package main - -import ( - "fmt" - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hi, This is an example of http service in golang!") -} - -func main() { - http.HandleFunc("/", handler) - http.ListenAndServeTLS(":8081", "server.crt", "server.key", nil) -} - -/* -openssl genrsa -out server.key 2048 // private key -openssl req -new -x509 -key server.key -out server.crt -days 365 //self-signed certificate -*/ - -//client-1 -//不带证书访问--报错 -package main - -import ( - "fmt" - "io/ioutil" - "net/http" -) - -func main() { - resp, err := http.Get("https://localhost:8081") - if err != nil { - fmt.Println("error:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - fmt.Println(string(body)) -} -//client-2 -//忽略证书访问--ok -package main - -import ( - "crypto/tls" - "fmt" - "io/ioutil" - "net/http" -) - -func main() { - tr := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - client := &http.Client{Transport: tr} - resp, err := client.Get("https://localhost:8081") - - if err != nil { - fmt.Println("error:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - fmt.Println(string(body)) -} - - -} - -//https-2 -{ -//客户端校验服务端证书 -//server -package main - -import ( - "fmt" - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, - "Hi, This is an example of http service in golang!") -} - -func main() { - http.HandleFunc("/", handler) - http.ListenAndServeTLS(":8081","server.crt", "server.key", nil) -} - -/* -openssl genrsa -out ca.key 2048 -openssl req -x509 -new -nodes -key ca.key -subj "/CN=tonybai.com" -days 5000 -out ca.crt - -openssl genrsa -out server.key 2048 -openssl req -new -key server.key -subj "/CN=localhost" -out server.csr -openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000 - -*/ - - -//client -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" -) - -func main() { - pool := x509.NewCertPool() - caCertPath := "ca.crt" - - caCrt, err := ioutil.ReadFile(caCertPath) - if err != nil { - fmt.Println("ReadFile err:", err) - return - } - pool.AppendCertsFromPEM(caCrt) - - tr := &http.Transport{ - TLSClientConfig: &tls.Config{RootCAs: pool}, - } - client := &http.Client{Transport: tr} - resp, err := client.Get("https://localhost:8081") - if err != nil { - fmt.Println("Get error:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - fmt.Println(string(body)) -} - - -} - -//https-3 -{ -//双向校验 -//server -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" -) - -type myhandler struct { -} - -func (h *myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hi, This is an example of http service in golang!\n") -} - -func main() { - pool := x509.NewCertPool() - caCertPath := "ca.crt" - - caCrt, err := ioutil.ReadFile(caCertPath) - if err != nil { - fmt.Println("ReadFile err:", err) - return - } - pool.AppendCertsFromPEM(caCrt) - - s := &http.Server{ - Addr: ":8081", - Handler: &myhandler{}, - TLSConfig: &tls.Config{ - ClientCAs: pool, - ClientAuth: tls.RequireAndVerifyClientCert, - }, - } - - err = s.ListenAndServeTLS("server.crt", "server.key") - if err != nil { - fmt.Println("ListenAndServeTLS err:", err) - } -} - -/* -ca: -openssl genrsa -out ca.key 2048 -openssl req -x509 -new -nodes -key ca.key -subj "/CN=tonybai.com" -days 5000 -out ca.crt - -server: -openssl genrsa -out server.key 2048 -openssl req -new -key server.key -subj "/CN=localhost" -out server.csr -openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000 - -client: -openssl genrsa -out client.key 2048 -openssl req -new -key client.key -subj "/CN=tonybai_cn" -out client.csr -openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 5000 -//http://www.cnblogs.com/sevenyuan/p/4544492.html 参考本文 -1、创建文件client.ext -内容: -extendedKeyUsage=clientAuth -2、重建client.crt -client: -openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile client.ext -out client.crt -days 5000 -*/ -//client -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" -) - -func main() { - pool := x509.NewCertPool() - caCertPath := "ca.crt" - - caCrt, err := ioutil.ReadFile(caCertPath) - if err != nil { - fmt.Println("ReadFile err:", err) - return - } - pool.AppendCertsFromPEM(caCrt) - - cliCrt, err := tls.LoadX509KeyPair("client.crt", "client.key") - if err != nil { - fmt.Println("Loadx509keypair err:", err) - return - } - - tr := &http.Transport{ - TLSClientConfig: &tls.Config{ - RootCAs: pool, - Certificates: []tls.Certificate{cliCrt}, - }, - } - client := &http.Client{Transport: tr} - resp, err := client.Get("https://localhost:8081") - if err != nil { - fmt.Println("Get error:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - fmt.Println(string(body)) -} - - -} - - -} - -闭包和go func{ - - -//闭包函数引用局部变量时,传递的是指针而不是实际的值,因此局部变量的值变化,能随时反映到闭包函数里面 -func main() { - strs := []string{"one", "two", "three"} - ch:=make(chan int) - for _, s := range strs { - fmt.Println("s1:",s,&s) - go func() { - fmt.Println("s2:",s,&s) - ch <- 1 - - }() - } - <- ch - <- ch - <- ch -} -/* -s1: one 0xc04200c280 -s1: two 0xc04200c280 -s1: three 0xc04200c280 -s2: three 0xc04200c280 -s2: three 0xc04200c280 -s2: three 0xc04200c280 -*/ - -//闭包函数引用局部变量时,传递的是指针而不是实际的值,因此局部变量的值变化,能随时反映到闭包函数里面 -func main() { - strs := []string{"one", "two", "three"} - ch:=make(chan int) - for _, s := range strs { - fmt.Println("s1:",s,&s) - go func(s string) { - fmt.Println("s2:",s,&s) - ch <- 1 - - }(s) - } - <- ch - <- ch - <- ch -} -/* -s1: one 0xc04203a1d0 -s1: two 0xc04203a1d0 -s1: three 0xc04203a1d0 -s2: three 0xc04203a260 -s2: two 0xc04203a290 -s2: one 0xc04207a000 -*/ -//闭包函数引用局部变量时,传递的是指针而不是实际的值,因此局部变量的值变化,能随时反映到闭包函数里面。 -继续测试: -func main() { - for i := 0; i < 5; i++ { - go func() { - fmt.Printf("i=%d\n", i) - }() - } - time.Sleep(2 * time.Second) - } - -测试结果: -i=4 -i=4 -i=5 -i=5 -i=5 - -测试结果分析: int类型的局部变量也是使用指针传递的go func 时, 多次使用局部变量,因为传递的是指针,所以在func真正执行时,取到的值是后面修改掉的局部变量的值。 - -//如果要让i值使用当时的值,一般情况下可以通过增加参数: -func main() { - for i := 0; i < 5; i++ { - go func(x int) { - fmt.Printf("i=%d\n", x) - }(i) - } - time.Sleep(2 * time.Second) -} -2. go func 时, 多次使用局部变量,因为传递的是指针,所以在func真正执行时, -取到的值是后面修改掉的局部变量的值。怎么做才能使用当时的局部变量,但是又不想使用参数传递?因此如果没有参数,可以做到非常方便调用闭包函数答案是有! 只需要定义一个var变量,就搞定啦 - -测试代码: -func main() { - for i := 0; i < 5; i++ { - var xx = i - go func() { - fmt.Printf("i=%d\n", xx) - }() - } - time.Sleep(2 * time.Second) - } -测试结果: -i=1 -i=3 -i=2 -i=4 -i=0 -//参考 上面基础部分的闭包传引用说明 -} - - - - - - - - - - - - - - - - - - - diff --git "a/My Summary/Mysql\345\237\272\347\241\200\346\223\215\344\275\234.sql" "b/My Summary/Mysql\345\237\272\347\241\200\346\223\215\344\275\234.sql" deleted file mode 100644 index 76d21a4..0000000 --- "a/My Summary/Mysql\345\237\272\347\241\200\346\223\215\344\275\234.sql" +++ /dev/null @@ -1,250 +0,0 @@ -Mysql基础操作 -1、数据库操作 -  进入命令行:mysql -uroot -p123456 -  查看数据库:show databases; -  查看数据库创建语句:show create database test; -  创建数据库:create database test charset utf8mb4; -  选择数据库:use test; -  删除数据库:drop database test; -  备份指定数据库:mysqldump -uroot -p test >test.sql 注:由于mysql5.6版本不支持在命令行界面输入密码,所以暂不输入密码,回车后输入密码即可。 -  备份所有数据库:mysqldump -uroot -p -A >test.sql -  恢复指定数据库:mysql -uroot -p test -         select * from user where name like '张%'; #查询姓张的用户 -         select * from user where name like '张_';   #查询姓张并且姓名为2个字的用户 -         select * from user where name in ('张三','李四','王五');  #查询姓名为张三、李四、王五的信息 -          select * from user where phone between 13700000000 and 13712345678;  #查询手机号在13700000000和13712345678之间的用户 -          select * from user order by create_time desc;  #查询按照用户创建时间倒序显示,默认升序asc -         select * from user where addr='' or addr is null;  #查询地址为空或为null的用户 -         select distinct name from user;  #不显示重复的姓名 -         select count(*) from user where sex='女';  #统计女生有多少人 -         select max(age),min(age),avg(age),sum(age) from user where sex='男';  #查找男生年龄最大、最小、平均、总和 -         select *,COUNT(sex) from user GROUP BY sex having sex='女';  #按照性别分组,并显示女生有多少人 -    多表查询: -        select * from user u,user_group g where u.id=g.id    #查询两张表共有的数据 -        select * from user u inner join user_group g on u.id=g.id;  #查询两张表共有的数据 -        select * from user u left join user_group g on u.id=g.id;  #左边所有的数据都查出来,右边如果有匹配的则查出来 -        select * from user u right join user_group g on u.id=g.id;  #右边所有的数据都查出来,左边如果有匹配的则查出来 -        select * from user u left join user_group g on u.id=g.id -        union -        select * from user u right join user_group g on u.id=g.id;  #左边和右边匹配的数据全部查出来并去重(union all不会去重),相当于oracle的全连接 -        select * from (select id,name,sex from user where sex='女') user;  #把查询结果作为一张表查询 -        select * from user where id in(select id from user_group where g_name='计算机');  #子查询,查询学计算机的用户信息 -4、用户管理 -  添加用户: -    insert into user (user,host,password) values('xiaoxitest','%',PASSWORD('123456')); #添加xiaoxitest用户并允许远程计算机登录,密码为:123456 -  更改用户: -    update user set password=password("654321") where user='xiaoxitest'; #更改用户密码 -    update user set user='xiaoxi' where user='xiaoxitest';  #更改用户名xiaoxitest为xiaoxi -  删除用户: -    delete from user where user='xiaoxi';  #删除xiaoxi用户 -5、权限管理 -  用户授权: -  授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码" with grant option; -    grant all on *.* to 'xiaoxi'@'%' IDENTIFIED BY '123456' with grant option; #表示为xiaoxi用户添加所有数据库所有权限,并可以给其他人授权。 -    grant all on test.* to 'xiaoxi'@'%' IDENTIFIED BY '123456' ;  #表示为xiaoxi用户添加test数据库所有权限 -    grant select on *.* to 'xiaoxi'@'%' IDENTIFIED BY '123456' ;  #表示为xiaoxi用户添加所有数据库查询权限 -  取消授权: -    Revoke select on *.* from 'xiaoxi'@'%';  #表示为xiaoxi用户取消所有数据库查询权限 -    Revoke all on *.* from 'xiaoxi'@'%';  #表示为xiaoxi用户取消所有数据库所有权限 -  刷新权限: -    flush privileges; - - -#mysql--增删改查 -{ - -#修改表名 - -#创建用户表 -CREATE TABLE IF NOT EXISTS user7( -id SMALLINT UNSIGNED KEY AUTO_INCREMENT, -username VARCHAR(50) NOT NULL UNIQUE, -password CHAR(20) NOT NULL, -email VARCHAR(20) NOT NULL DEFAULT '592681026@qq.com', -age TINYINT UNSIGNED DEFAULT 18, -sex ENUM('男','女','保密') NOT NULL DEFAULT '男', -addr VARCHAR(50) NOT NULL DEFAULT '上海', -salary FLOAT(6,2),#这个是浮点型 6位数,保留两位小数 -regTime INT UNSIGNED, -face CHAR(100) NOT NULL DEFAULT 'default.jpg' -); - -INSERT user6(id,username,password,regTime) VALUES(1,'付志强','dazhi',1994); - - -#重命名表名:user7变为user8 -ALTER TABLE user7 RENAME TO user8; -ALTER TABLE user8 RENAME AS user7;#TO 和 AS 都可以省略 -ALTER TABLE user8 RENAME user7; - -RENAME TABLE 原表名 TO 新表名;#这个TO不能省略 - -添加和删除字段 - -#添加字段,删除字段 -#添加:ALTER TABLE tbl_name ADD 字段名称 字段类型[完整性约束条件][FIRST|AFTER 字段名称](加在首部或者某个字段之后) 和写字段差不多 最后可以字段的位置 -#添加card字段 CHAR(18) -ALTER TABLE user7 ADD card CHAR(18); -ALTER TABLE user7 ADD test1 VARCHAR(100) NOT NULL UNIQUE; -ALTER TABLE user7 ADD test2 VARCHAR(100) NOT NULL UNIQUE FIRST; - - -#一次添加多个字段 选中一个表,完成多个操作 -ALTER TABLE user7 - -ADD test5 VARCHAR(100) NOT NULL UNIQUE AFTER sex, -ADD test6 SET('A','B','C'); - - -#删除指定字段 ALTER TABLE tab_name DROP 字段名称 - ALTER TABLE user7 DROP test6; - - #一次性的删除test1,test2,test3,test4,test5 - ALTER TABLE user7 - DROP test1, - DROP test2, - DROP test3, - DROP test4; - - #添加test字段 删除addr字段 - ALTER TABLE user7 - - ADD test INT UNSIGNED NOT NULL DEFAULT 10 AFTER sex, - DROP addr; - -修改字段 - -#修改字段 ALTER TABLE tab_name MODIFY 字段名称 字段类型[完整性约束条件][FIRST|AFTER 字段名称] - #MODIFY 修改字段类型 将email 修改位VARCHAR(200) - ALTER TABLE user7 MODIFY email VARCHAR(200);#这个修改的时候最好是带上全部的完整性约束条件 - ALTER TABLE user7 MODIFY email VARCHAR(50) NOT NULL DEFAULT '592681026@qq.com';#带上完整的约束性 - - #将card字段移动到test字段之后 - ALTER TABLE user7 MODIFY card CHAR(18) AFTER test;#这里要带上card的完整的约束性条件 - - #将test字段修改位CHAR(32) NOT NULL DEFAULT '123' 移动到第一个位置 - ALTER TABLE user7 MODIFY test CHAR(32) NOT NULL DEFAULT '1234' FIRST; - - #修改字段的名称(也能完成MODIFY的功能) ALTER TABLE tab_name 原字段名称 新字段名称 字段类型 - #将test字段改为test1 - ALTER TABLE user7 CHANGE test test1 CHAR(32) NOT NULL ; - -添加删除默认值 -#添加删除默认值 - ALTER TABLE 表名 ALTER 字段名称 SET DEFAULT 默认值 - ALTER TABLE 表名 ALTER 字段名称 DROP DEFAULT -添加删除主键 - -#添加和删除主键 - ALTER TABLE 表名 ADD [CONSTRAINT] PRIMARY KEY (字段名称,...)#...表示括号里面可以是多个字段,那就是复合主键了,如果是一个,那就是单一主键了 - ALTER TABLE 表名 DROP PRIMARY KEY - -CREATE TABLE test12( -id INT - ); -ALTER TABLE test12 ADD PRIMARY KEY (id); - -CREATE TABLE test13( -id INT, -card VARCHAR(50) NOT NULL -); -ALTER TABLE test13 ADD PRIMARY KEY (id,card); - -ALTER TABLE test13 DROP PRIMARY KEY;#删除 -ALTER TABLE test12 DROP PRIMARY KEY;#删除 - -#注意:这里如果建表的时候自增长和主键同时存在的时候,你不能直接删除主键,而是应该先是删除AOTU_INCREMENT,然后再删除主键 -ALTER TABLE 表名 MODIFY id UNSIGNED NOT NULL;#这样自增长就没有了 - -添加删除唯一 - -#添加测试索引 -ALTER TABLE 表名 ADD UNIQUE(username); -ALTER TABLE 表名 ADD CONSTRAINT symbol UNIQUE uni_id(username);#这里的uni_id 是一个索引的名称,如果不写这个系统会让字段名称变成默认的索引名称 -ALTER TABLE 表名 ADD CONSTRAINT symbol UNIQUE aa(card,username);#复合索引唯一 - -#删除索引唯一 -ALTER TABLE 表名 DROP {INDEX|KEY} 唯一名称; - -#修改表的引擎 -ALTER TABLE 表名 ENGINE=MyISAM; - -#修改自增长值 -ALTER TABLE 表名 AUTO_INCREMENT=100; - -删除数据表 - -#删除数据表 -DROP TABLE [IF EXISTS]表名;#可以一次删除多个 也可以删除一个 类似于添加。 -当然手动删除也是可以的。必须先关闭mysql,在关闭mysql服务,最后在文件中手动删除数据表, - -#当我们进入mysql想登录的同时直接打开某个数据库的时候: -mysql -uroot -p -D 数据库名称。 - -更新删除 应用order by 和limit -   - -#更新用户名为4位的用户,让其已有的年龄-3 -UPDATE cms_user SET age=age-3 WHERE username LIKE '____'; - -#更新前三条记录 ,让已有年龄+10 -UPDATE cms_user SET age=age+10 LIMIT 3; -UPDATE cms_user SET age=age+10 LIMIT 0,3; - -#按照id降序排列 更新前三条 -UPDATE cms_user SET age=age+10 ORDER BY id DESC LIMIT 3; - -#删除用户性别为男的用户,按照年龄降序排序,删除前一条记录 -DELETE FROM cms_user WHERE sex='男' ORDER BY age DESC LIMIT 1; -} diff --git "a/Learn by example/Example2_python/Python\344\270\255\347\232\204\350\277\233\347\250\213\345\210\206\346\224\257fork\345\222\214exec\350\257\246\350\247\243.sh" "b/Python Tips/Python\344\270\255\347\232\204\350\277\233\347\250\213\345\210\206\346\224\257fork\345\222\214exec\350\257\246\350\247\243.sh" similarity index 100% rename from "Learn by example/Example2_python/Python\344\270\255\347\232\204\350\277\233\347\250\213\345\210\206\346\224\257fork\345\222\214exec\350\257\246\350\247\243.sh" rename to "Python Tips/Python\344\270\255\347\232\204\350\277\233\347\250\213\345\210\206\346\224\257fork\345\222\214exec\350\257\246\350\247\243.sh" diff --git "a/Learn by example/Example3_python/aiohttp\345\237\272\346\234\254\347\224\250\346\263\225.sh" "b/Python Tips/aiohttp\345\237\272\346\234\254\347\224\250\346\263\225.sh" similarity index 100% rename from "Learn by example/Example3_python/aiohttp\345\237\272\346\234\254\347\224\250\346\263\225.sh" rename to "Python Tips/aiohttp\345\237\272\346\234\254\347\224\250\346\263\225.sh" diff --git "a/Learn by example/Example3_python/asyncio\345\271\266\345\217\221\347\273\206\350\212\202.sh" "b/Python Tips/asyncio\345\271\266\345\217\221\347\273\206\350\212\202.sh" similarity index 100% rename from "Learn by example/Example3_python/asyncio\345\271\266\345\217\221\347\273\206\350\212\202.sh" rename to "Python Tips/asyncio\345\271\266\345\217\221\347\273\206\350\212\202.sh" diff --git "a/Python Tips/gevent API\345\247\277\345\212\277\346\257\224\350\276\203.py" "b/Python Tips/gevent API\345\247\277\345\212\277\346\257\224\350\276\203.py" new file mode 100644 index 0000000..4b336f5 --- /dev/null +++ "b/Python Tips/gevent API\345\247\277\345\212\277\346\257\224\350\276\203.py" @@ -0,0 +1,235 @@ +# -*- coding:utf-8 -*- + +import time +import gevent +from gevent.pool import Pool + + +""" +参考Openstack_lgj\Python\线程池与阻塞、非阻塞、同步、异步的问题.sh + +注意 print("domeX before iter :", alist)的位置,可以帮助理解协程运行的顺序,有些API方法必须要触发才会去执行任务 +对比from multiprocessing.dummy import Pool as ThreadPool from multiprocessing.pool import ThreadPool API样式基本相同,效果也相似,但dome5 中apply_async API效果不一样 + + +运行结果: +('Spend time :', 2.0369999408721924) +('dome0 alist:', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) +------------------------------ +('Spend time :', 0.40599989891052246) +('dome1 alist:', [0, 4, 3, 2, 1, 5, 9, 8, 7, 6]) +------------------------------ +('dome2 before iter :', []) + +('Spend time :', 0.4049999713897705) +('dome2 after iter :', [0, 4, 3, 2, 1, 5, 9, 8, 7, 6]) +------------------------------ +('dome3 before iter :', []) +('Spend time :', 0.40799999237060547) +('dome3 after iter :', [0, 4, 3, 2, 1, 5, 9, 8, 7, 6]) +------------------------------ +('dome4 before iter :', []) +('Spend time :', 2.0320000648498535) +('dome4 after iter :', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) +------------------------------ +('dome5 before iter :', []) +('Spend time :', 0.20300006866455078) +('dome5 after iter :', [0, 4, 3, 2, 1]) +------------------------------ +('dome6 before iter :', []) +('Spend time :', 0.6080000400543213) +('dome6 after iter :', [5, 9, 8, 7, 6, 0, 4, 3, 2, 1, 5, 9, 8, 7, 6]) +------------------------------ +('dome7 before iter :', []) + +('Spend time :', 0.40599989891052246) +('dome7 after iter :', [0, 4, 3, 2, 1, 5, 9, 8, 7, 6]) +------------------------------ +('dome8 before iter :', []) +('Spend time :', 0.20099997520446777) +('dome8 after iter :', [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]) +------------------------------ +(xrange(10), ) +([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ) +""" +# 协程池大小,这个size大小还是比较影响运行速度的,对比dome5和dome8的情况理解 +pool = Pool(size=5) +alist = [] + + +def hello_from(n): + def task(n): + gevent.sleep(0.2) + alist.append(n) + task(n) + #print('Size of pool', len(pool)) + + +def dome0(): + global alist + alist = [] + t1 = time.time() + for x in range(10): + hello_from(x) + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome0 alist:", alist) + + +dome0() +print("------------------------------") + + +def dome1(): + global alist + alist = [] + t1 = time.time() + pool.map(hello_from, xrange(10)) + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome1 alist:", alist) + + +dome1() +print("------------------------------") + + +def dome2(): + global alist + alist = [] + t1 = time.time() + iimap = pool.imap(hello_from, xrange(10)) + # imap(func, *iterables, maxsize=None) -> iterable + # imap是懒惰 - 直到您真正使用结果迭代器才会做任何工作 imap在multiprocessing和gevent遵守同样的规则。 + print("dome2 before iter :", alist) + print(type(iimap)) + list(iimap) # 触发iterable + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome2 after iter :", alist) + + +dome2() +print("------------------------------") + + +def dome3(): + global alist + alist = [] + t1 = time.time() + map_async_test = pool.map_async(hello_from, xrange(10)) # 返回一个Greenlet对象 + print("dome3 before iter :", alist) + # 方法1--缺一不可 + # pool.start(map_async_test) + # pool.join() + # 方法2 + map_async_test.run() + # map_async(self, func, iterable, callback=None) -> Greenlet + # map_async是懒惰 - 直到您真正run返回的Greenlet才会做任何工作 + # map_async在multiprocessing和gevent遵守同样的规则。 + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome3 after iter :", alist) + + +dome3() +print("------------------------------") + + +def dome4(): + global alist + alist = [] + print("dome4 before iter :", alist) + t1 = time.time() + for number in range(10): + pool.apply(hello_from, args=(number,)) + # pool.join() + # apply 在multiprocessing和gevent遵守同样的规则。 + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome4 after iter :", alist) + + +dome4() +print("------------------------------") + + +def dome5(): + global alist + alist = [] + t1 = time.time() + # Pool(5) 时alist只有[0, 4, 3, 2, 1],Pool()时是[0, 9, 8, 7, 6, 5, 4, 3, 2, 1] + for number in range(10): + pool.apply_async(hello_from, args=(number,)) # 只运行了5次,很奇怪,这里需要注意和线程池、进程池不一样 + print("dome5 before iter :", alist) + pool.join() + # apply_async 必须在pool.join()后才会执行任务,apply_async + # 在multiprocessing和gevent遵守同样的规则。 + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome5 after iter :", alist) + + +dome5() +print("------------------------------") + +# dome5 和dome6有影响啊!dome5没接收完的9, 8, 7, 6, 5 被dome6接收了! + +def dome6(): + global alist + alist = [] + t1 = time.time() + print("dome6 before iter :", alist) + for i in range(10): + pool.spawn(hello_from, i) + print("dome6 before iter :", alist) + pool.join() + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome6 after iter :", alist) + + +dome6() +print("------------------------------") + + +def dome7(): + global alist + alist = [] + t1 = time.time() + iimap = pool.imap_unordered(hello_from, xrange(10)) + # imap_unordered(func, *iterables, maxsize=None) -> iterable + # imap_unordered是懒惰 - 直到您真正使用结果迭代器才会做任何工作。 + print("dome7 before iter :", alist) + print(type(iimap)) + list(iimap) # 触发iterable + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome7 after iter :", alist) + + +dome7() + +print("------------------------------") + + +def dome8(): + global alist + alist = [] + t1 = time.time() + jobs = [] + for x in range(10): + # 比上面的方法都快,主要原因是未使用协程池,一波走完,和Pool(10)一样效果 + jobs.append(gevent.spawn(hello_from, x)) + print("dome8 before iter :", alist) + gevent.joinall(jobs) + t2 = time.time() + print("Spend time :", t2 - t1) + print("dome8 after iter :", alist) + + +dome8() + +print("------------------------------") +print(xrange(10), type(xrange(10))) # xrange(10) +print(range(10), type(range(10))) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] diff --git "a/Python Tips/gevent API\351\200\237\345\272\246\346\257\224\350\276\203.py" "b/Python Tips/gevent API\351\200\237\345\272\246\346\257\224\350\276\203.py" new file mode 100644 index 0000000..a4bc112 --- /dev/null +++ "b/Python Tips/gevent API\351\200\237\345\272\246\346\257\224\350\276\203.py" @@ -0,0 +1,89 @@ +#-*- coding:utf-8 -*- +import timeit +import gevent +from gevent.pool import Pool + +x = Pool(40) +a=[] +b=[] +c=[] +d=[] +e=[] + +def async1(): + def task1(i): + gevent.sleep(0.01) # 任务是异步的 + #time.sleep(0.001) # 任务是同步的 + a.append(i) + for i in range(10): + x.spawn(task1,i) + x.join() + +def async2(): + def task1(i): + gevent.sleep(0.01) # 任务是异步的 + #time.sleep(0.001) # 任务是同步的 + b.append(i) + + list(x.imap(task1,range(10))) + +def async3(): + def task1(i): + gevent.sleep(0.01) # 任务是异步的 + #time.sleep(0.001) # 任务是同步的 + c.append(i) + + list(x.imap_unordered(task1,range(10))) # 对出的结果并不要求顺序 + +def async4(): + def task1(i): + gevent.sleep(0.01) # 任务是异步的 + #time.sleep(0.001) # 任务是同步的 + e.append(i) + + list(x.map(task1,range(10))) # 对出的结果并不要求顺序 + +def sync(): + def task1(i): + gevent.sleep(0.01) # 任务是异步的 + #time.sleep(0.001) # 任务是同步的 + d.append(i) + for i in range(10): + task1(i) + + +print '异步1开始了' +print timeit.timeit(stmt=async1, setup='''from __main__ import async1''', number=100) +print("len(a):%s , a:%s" % (len(a),a)) +print '异步2开始了' +print timeit.timeit(stmt=async2, setup='''from __main__ import async2''', number=100) +print("len(b):%s , b:%s" % (len(b),b)) +print '异步3开始了' +print timeit.timeit(stmt=async3, setup='''from __main__ import async3''', number=100) +print("len(c):%s , c:%s" % (len(c),c)) +print '异步4开始了' +print timeit.timeit(stmt=async4, setup='''from __main__ import async4''', number=100) +print("len(e):%s , e:%s" % (len(e),e)) +print '同步开始了' +print timeit.timeit(stmt=sync, setup='''from __main__ import sync''', number=100) +print("len(d):%s , d:%s" % (len(d),d)) +print '测试结束' + +""" +异步1开始了 +1.4359165 +len(a):1000 , a:[0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4, 8, 7, 6, 5, 1, 3, 2, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 8, 7, 6, 5, 4, 3, 2, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1] +异步2开始了 +1.5639138 +len(b):1000 , b:[0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1] +异步3开始了 +1.4889286 +len(c):1000 , c:[0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4, 5, 6, 1, 2, 3, 7, 9, 8, 0, 4, 5, 1, 2, 3, 8, 9, 6, 7, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 8, 7, 6, 5, 4, 3, 2, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 8, 7, 6, 5, 4, 3, 2, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 6, 5, 4, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1] +异步4开始了 +1.5665378 +len(e):1000 , e:[0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1] +同步开始了 +15.2502518 +len(d):1000 , d:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +测试结束 +""" \ No newline at end of file diff --git "a/Python Tips/gevent\346\211\251\345\261\225\347\237\245\350\257\206.py" "b/Python Tips/gevent\346\211\251\345\261\225\347\237\245\350\257\206.py" new file mode 100644 index 0000000..ef97e64 --- /dev/null +++ "b/Python Tips/gevent\346\211\251\345\261\225\347\237\245\350\257\206.py" @@ -0,0 +1,231 @@ +# 两个优秀的参考博客 +http://hhkbp2.github.io/gevent-tutorial/#_1 +https://softlns.github.io/2015/11/28/python-gevent/ + + +#grequests库就可以在python里使用gevent基于coroutines(协程)解决并发请求 + +import grequests +import requests +import cProfile + +urls = [ + 'http://www.xiachufang.com/downloads/baidu_pip/2016030101.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030102.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030103.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030104.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030105.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030106.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030107.json', + 'http://www.xiachufang.com/downloads/baidu_pip/2016030108.json', +] +def haha(urls): + rs = (grequests.get(u) for u in urls) + return grequests.map(rs) + +cProfile.run("haha(urls)") + +def hehe(urls): + hehe = [requests.get(i) for i in urls] + return hehe + +cProfile.run("hehe(urls)") + + +#队列 +import gevent +from gevent.queue import Queue, Empty + +tasks = Queue(maxsize=3) + +def worker(n): + try: + while True: + task = tasks.get(timeout=1) # decrements queue size by 1 + print('Worker %s got task %s' % (n, task)) + gevent.sleep(0) + except Empty: + print('Quitting time!') + +def boss(): + """ + Boss will wait to hand out work until a individual worker is + free since the maxsize of the task queue is 3. + """ + + for i in xrange(1,10): + tasks.put(i) + print('Assigned all work in iteration 1') + + for i in xrange(10,20): + tasks.put(i) + print('Assigned all work in iteration 2') + +gevent.joinall([ + gevent.spawn(boss), + gevent.spawn(worker, 'steve'), + gevent.spawn(worker, 'john'), + gevent.spawn(worker, 'bob'), +]) + + +#给gevent上下文来指定那些数据是本地的。 + +import gevent +from gevent.local import local + +stash = local() + +def f1(): + stash.x = 1 + print(stash.x) + +def f2(): + stash.y = 2 + print(stash.y) + + try: + stash.x + except AttributeError: + print("x is not local to f2") + +g1 = gevent.spawn(f1) +g2 = gevent.spawn(f2) + +gevent.joinall([g1, g2]) + + +#组是一个由greenlet组成的集合,并且能够被统一管理。 + +import gevent +from gevent.pool import Group + +def talk(msg): + for i in xrange(3): + print(msg) + +g1 = gevent.spawn(talk, 'bar') +g2 = gevent.spawn(talk, 'foo') +g3 = gevent.spawn(talk, 'fizz') + +group = Group() +group.add(g1) +group.add(g2) +group.join() + +group.add(g3) +group.join() + + +# server.py +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import sys +import socket +import time +import gevent +from gevent import socket,monkey,pool #导入pool +monkey.patch_all() + +def server(port, pool): + s = socket.socket() + s.bind(('0.0.0.0', port)) + s.listen() + while True: + cli, addr = s.accept() + #print("Welcome %s to SocketServer" % str(addr[0])) + pool.spawn(handle_request, cli) #通过pool.spawn()运行协程 + +def handle_request(conn): + try: + data = conn.recv(1024) + print("recv:", data) + data = 'From SockeServer:192.168.88.118---%s' % data.decode("utf8") + conn.sendall(bytes(data, encoding="utf8")) + if not data: + conn.shutdown(socket.SHUT_WR) + except Exception as ex: + print(ex) + finally: + conn.close() + +if __name__ == '__main__': + pool = pool.Pool(5) #限制并发协程数量5 + server(8888, pool) + +#client.py +import socket +import gevent +from gevent import socket, monkey +from gevent.pool import Pool +import time + +monkey.patch_all() + +HOST = '192.168.88.118' +PORT = 8888 +def sockclient(i): + #time.sleep(2) + s = socket.socket() + s.connect((HOST, PORT)) + #print(gevent.getcurrent()) + msg = bytes(("This is gevent: %s" % i),encoding="utf8") + s.sendall(msg) + data = s.recv(1024) + print("Received", data.decode()) + + s.close() + +pool = Pool(5) +threads = [pool.spawn(sockclient, i) for i in range(2000)] +gevent.joinall(threads) + + +from werkzeug.local import LocalProxy +from werkzeug.wrappers import Request +from contextlib import contextmanager + +from gevent.wsgi import WSGIServer + +_requests = local() +request = LocalProxy(lambda: _requests.request) + +@contextmanager +def sessionmanager(environ): + _requests.request = Request(environ) + yield + _requests.request = None + +def logic(): + return "Hello " + request.remote_addr + +def application(environ, start_response): + status = '200 OK' + + with sessionmanager(environ): + body = logic() + + headers = [ + ('Content-Type', 'text/html') + ] + + start_response(status, headers) + return [body] + +WSGIServer(('', 8000), application).serve_forever() + + +# 子进程 +import gevent +from gevent.subprocess import Popen, PIPE + +def cron(): + while True: + print "cron" + gevent.sleep(0.2) + +g = gevent.spawn(cron) +sub = Popen(['sleep 1; uname'], stdout=PIPE, shell=True) +out, err = sub.communicate() +g.kill() +print out.rstrip() diff --git "a/Learn by example/Example2_python/pexpect\345\255\246\344\271\240.py" "b/Python Tips/pexpect\345\255\246\344\271\240.py" similarity index 100% rename from "Learn by example/Example2_python/pexpect\345\255\246\344\271\240.py" rename to "Python Tips/pexpect\345\255\246\344\271\240.py" diff --git "a/Learn by example/Example1_python/requests\345\272\223\347\232\204\344\275\277\347\224\250.py" "b/Python Tips/requests\345\272\223\347\232\204\344\275\277\347\224\250.py" similarity index 100% rename from "Learn by example/Example1_python/requests\345\272\223\347\232\204\344\275\277\347\224\250.py" rename to "Python Tips/requests\345\272\223\347\232\204\344\275\277\347\224\250.py" diff --git "a/Learn by example/Example1_python/requests\345\272\223\347\232\204\344\275\277\347\224\2502.py" "b/Python Tips/requests\345\272\223\347\232\204\344\275\277\347\224\2502.py" similarity index 100% rename from "Learn by example/Example1_python/requests\345\272\223\347\232\204\344\275\277\347\224\2502.py" rename to "Python Tips/requests\345\272\223\347\232\204\344\275\277\347\224\2502.py" diff --git "a/Python Tips/yield from\350\247\243\346\236\220.py" "b/Python Tips/yield from\350\247\243\346\236\220.py" deleted file mode 100644 index c2d8132..0000000 --- "a/Python Tips/yield from\350\247\243\346\236\220.py" +++ /dev/null @@ -1,52 +0,0 @@ -def writer(): - # 读取send传进的数据,并模拟写进套接字或文件 - while True: - w = (yield) # w接收send传进的数据 - print('>> ', w) - - -def writer_wrapper(coro1): - # 手工处理异常被抛给子生成器 - print('2222:', coro1.send(None)) # 生成器准备好接收数据 - while True: - try: - try: - x = (yield) - print('3333:', x) - except Exception as e: # 捕获异常 - coro1.throw(e) - else: - coro1.send(x) - except StopIteration: - pass - -# 上面的writer_wrapper等效于下面的writer_wrapper2,yield from隐式处理了传值和抛出异常给子生成器 - - -def writer_wrapper2(coro): - yield from coro - - -w = writer() -wrap = writer_wrapper(w) -print('1111:', wrap.send(None)) # 生成器准备好接收数据 - -for i in range(4): - wrap.send(i) - - -''' -yield from 与 yield 的区别: -#http://www.cnblogs.com/aademeng/articles/7236768.html -Python3.3版本的PEP 380中添加了yield from语法,允许一个generator生成器将其部分操作委派给另一个生成器。其产生的主要动力在于使生成器能够很容易分为多个拥有send和throw方法的子生成器,像一个大函数可以分为多个子函数一样简单。Python的生成器是协程coroutine的一种形式,但它的局限性在于只能向它的直接调用者yield值。这意味着那些包含yield的代码不能想其他代码那样被分离出来放到一个单独的函数中。这也正是yield from要解决的。 -虽然yield from主要设计用来向子生成器委派操作任务,但yield from可以向任意的迭代器委派操作; -对于简单的迭代器,yield from iterable 本质上等于 for item in iterable: yield item的缩写版 -def func(): - # for i in 'AB': - # yield i - yield from 'AB' # 等同于上面两行 - -yield from 允许外界与子协程直接交互,这样就允许代码重构:把一部分包含 yield 的代码放到另外的函数,再使用 yield from 调用该函数。这样,就实现委托工作. -yield from 的主要功能是打开双向通道,把最外层的调用方与最内层的子生成器连接起来,使两者可以直接发送和产出值,还可以直接传入异常,而不用在中间的协程添加异常处理的代码。 - -''' diff --git "a/Python Tips/\345\215\217\347\250\213\350\277\233\345\214\226\345\217\262.py" "b/Python Tips/\345\215\217\347\250\213\350\277\233\345\214\226\345\217\262.py" index 330986d..f9ce770 100644 --- "a/Python Tips/\345\215\217\347\250\213\350\277\233\345\214\226\345\217\262.py" +++ "b/Python Tips/\345\215\217\347\250\213\350\277\233\345\214\226\345\217\262.py" @@ -14,26 +14,86 @@ # 1. 简单yield生成器 - -def dome1(): - def fib(n): - index = 0 - a = 0 - b = 1 - while index < n: - yield b - a, b = b, a + b - index += 1 - print('-' * 10 + 'test yield fib' + '-' * 10) - for fib_res in fib(10): - print(fib_res) - -# dome1() - -# 目前只有数据从fib(20)中通过yield流向外面的for循环;如果可以向fib(20)发送数据,那不是就可以在Python中实现协程。 - - -def dome2(): +def fab(max): + n, a, b = 0, 0, 1 + while n < max: + yield b + # print b + a, b = b, a + b + n = n + 1 + +for n in fab(5): + print(n) + + +# 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数, +# Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时, +# 每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行, +# 而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。 + +# python yield用法总结 +# http://www.cnblogs.com/python-life/articles/4549996.html + +def read_file(fpath): + BLOCK_SIZE = 5 + with open(fpath, 'rb') as f: + while True: + block = f.read(BLOCK_SIZE) + if block: + yield block + else: + return + +for x in read_file("./1.py"): + print(x) + +# 当一个函数中含有yield时, 它不再是一个普通的函数, 而是一个生成器.当该函数被调用时不会自动执行, 而是暂停, +# 调用函数.next()才会被执行,如一个函数中出现多个yield则next()会停止在下一个yield前 + +#-*- coding:utf-8 -*- +def test1(): + def fun(): + print 'start' + a = yield 5 + print a + print 'middle' + b = yield 12 + print b + c = yield 12 + print c + print 'end' + + m = fun() #创建一个对象 + print("-----------------") + print("return:",m.next()) #会使函数执行到一个yield,并停下 + print("-----------------") + print("return:",m.send('message')) #利用send()传递值 + print("-----------------") + print("return:",m.close()) #throw() 与 close()中断 Generator + print("return:",m.next()) + print("-----------------") + +def test2(): + def gen(): + for x in range(5): + print("x3:", x) + y = yield x + print("x,y:", x, y) + print("---------") + + a = gen() + for x in a: # 开始迭代 Generator 时就会执行 print("x3:", x),相当于x = a.next() + print("x1:", x) + if x == 2: + print("x=2:", x) + print("get next:", a.send("lgj")) + # 获取了下一个yield表达式的参数,也就是3-->导致a的迭代直接少了x=3的片段-->跳过了print("x1:", x)--->也就是说send包含了next的迭代功能同时也有传送值给y的功能 + # g.next()和g.send(None)是相同的 ,send(msg) 和 next()是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数 + print("x2:", x) + + + +def test3(): import random import time @@ -68,7 +128,7 @@ def stupid_fib(n): ----------test yield send---------- fib_res2: 1 ''' -# dome2() +# test3() # 2. yield from @@ -187,8 +247,7 @@ def writer_wrapper(coro2): ''' -# 3. -# asyncio是一个基于事件循环的实现异步I/O的模块。通过yieldfrom,我们可以将协程asyncio.sleep的控制权交给事件循环,然后挂起当前协程;之后,由事件循环决定何时唤醒asyncio.sleep,接着向后执行代码。 +# 3. asyncio是一个基于事件循环的实现异步I/O的模块。通过yieldfrom,我们可以将协程asyncio.sleep的控制权交给事件循环,然后挂起当前协程;之后,由事件循环决定何时唤醒asyncio.sleep,接着向后执行代码。 def dome4(): import asyncio @@ -224,3 +283,45 @@ async def stupid_fib(n): loop.close() dome4() + + + +def writer(): + # 读取send传进的数据,并模拟写进套接字或文件 + while True: + w = (yield) # w接收send传进的数据 + print('>> ', w) + + +def writer_wrapper(coro1): + # 手工处理异常被抛给子生成器 + print('2222:', coro1.send(None)) # 生成器准备好接收数据 + while True: + try: + try: + x = (yield) + print('3333:', x) + except Exception as e: # 捕获异常 + coro1.throw(e) + else: + coro1.send(x) + except StopIteration: + pass + +# 上面的writer_wrapper等效于下面的writer_wrapper2,yield from隐式处理了传值和抛出异常给子生成器 + + +def writer_wrapper2(coro): + yield from coro + + +w = writer() +wrap = writer_wrapper(w) +print('1111:', wrap.send(None)) # 生成器准备好接收数据 + +for i in range(4): + wrap.send(i) + + + + diff --git "a/Learn by example/Example1_python/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.py" "b/Python Tips/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.py" similarity index 100% rename from "Learn by example/Example1_python/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.py" rename to "Python Tips/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.py" diff --git "a/Learn by example/Example3_python/\347\261\273\347\232\204\345\206\205\347\275\256\346\226\271\346\263\225\350\277\233\351\230\266.sh" "b/Python Tips/\347\261\273\347\232\204\345\206\205\347\275\256\346\226\271\346\263\225\350\277\233\351\230\266.sh" similarity index 100% rename from "Learn by example/Example3_python/\347\261\273\347\232\204\345\206\205\347\275\256\346\226\271\346\263\225\350\277\233\351\230\266.sh" rename to "Python Tips/\347\261\273\347\232\204\345\206\205\347\275\256\346\226\271\346\263\225\350\277\233\351\230\266.sh" diff --git a/Books and Software/Books/Flask_Tutorial.pdf "b/\345\233\276\344\271\246/Books/Flask_Tutorial.pdf" similarity index 100% rename from Books and Software/Books/Flask_Tutorial.pdf rename to "\345\233\276\344\271\246/Books/Flask_Tutorial.pdf" diff --git "a/Books and Software/Books/Python\346\240\207\345\207\206\345\272\223\344\270\255\346\226\207\346\211\213\345\206\214.pdf" "b/\345\233\276\344\271\246/Books/Python\346\240\207\345\207\206\345\272\223\344\270\255\346\226\207\346\211\213\345\206\214.pdf" similarity index 100% rename from "Books and Software/Books/Python\346\240\207\345\207\206\345\272\223\344\270\255\346\226\207\346\211\213\345\206\214.pdf" rename to "\345\233\276\344\271\246/Books/Python\346\240\207\345\207\206\345\272\223\344\270\255\346\226\207\346\211\213\345\206\214.pdf" diff --git "a/Books and Software/Books/python\345\256\236\344\276\213\346\211\213\345\206\214.py" "b/\345\233\276\344\271\246/Books/python\345\256\236\344\276\213\346\211\213\345\206\214.py" similarity index 100% rename from "Books and Software/Books/python\345\256\236\344\276\213\346\211\213\345\206\214.py" rename to "\345\233\276\344\271\246/Books/python\345\256\236\344\276\213\346\211\213\345\206\214.py" diff --git "a/Books and Software/Books/python\347\273\235\346\212\200\357\274\232\350\277\220\347\224\250python\346\210\220\344\270\272\351\241\266\347\272\247\351\273\221\345\256\242.pdf" "b/\345\233\276\344\271\246/Books/python\347\273\235\346\212\200\357\274\232\350\277\220\347\224\250python\346\210\220\344\270\272\351\241\266\347\272\247\351\273\221\345\256\242.pdf" similarity index 100% rename from "Books and Software/Books/python\347\273\235\346\212\200\357\274\232\350\277\220\347\224\250python\346\210\220\344\270\272\351\241\266\347\272\247\351\273\221\345\256\242.pdf" rename to "\345\233\276\344\271\246/Books/python\347\273\235\346\212\200\357\274\232\350\277\220\347\224\250python\346\210\220\344\270\272\351\241\266\347\272\247\351\273\221\345\256\242.pdf" diff --git "a/Books and Software/Books/shell\345\256\236\344\276\213\346\211\213\345\206\214.sh" "b/\345\233\276\344\271\246/Books/shell\345\256\236\344\276\213\346\211\213\345\206\214.sh" similarity index 100% rename from "Books and Software/Books/shell\345\256\236\344\276\213\346\211\213\345\206\214.sh" rename to "\345\233\276\344\271\246/Books/shell\345\256\236\344\276\213\346\211\213\345\206\214.sh" diff --git "a/Books and Software/Books/\343\200\212\344\275\240\347\232\204\347\201\257\350\277\230\344\272\256\347\235\200\345\220\227\357\274\237\343\200\213------\350\247\243\345\206\263\351\227\256\351\242\230\347\232\204\346\226\271\346\263\225\350\256\272.sh" "b/\345\233\276\344\271\246/Books/\343\200\212\344\275\240\347\232\204\347\201\257\350\277\230\344\272\256\347\235\200\345\220\227\357\274\237\343\200\213------\350\247\243\345\206\263\351\227\256\351\242\230\347\232\204\346\226\271\346\263\225\350\256\272.sh" similarity index 100% rename from "Books and Software/Books/\343\200\212\344\275\240\347\232\204\347\201\257\350\277\230\344\272\256\347\235\200\345\220\227\357\274\237\343\200\213------\350\247\243\345\206\263\351\227\256\351\242\230\347\232\204\346\226\271\346\263\225\350\256\272.sh" rename to "\345\233\276\344\271\246/Books/\343\200\212\344\275\240\347\232\204\347\201\257\350\277\230\344\272\256\347\235\200\345\220\227\357\274\237\343\200\213------\350\247\243\345\206\263\351\227\256\351\242\230\347\232\204\346\226\271\346\263\225\350\256\272.sh" diff --git "a/Books and Software/Books/\344\275\240\346\211\200\344\270\215\347\237\245\351\201\223\347\232\204\345\206\260\345\206\267\347\232\204\347\273\217\346\265\216\347\234\237\347\233\270.sh" "b/\345\233\276\344\271\246/Books/\344\275\240\346\211\200\344\270\215\347\237\245\351\201\223\347\232\204\345\206\260\345\206\267\347\232\204\347\273\217\346\265\216\347\234\237\347\233\270.sh" similarity index 100% rename from "Books and Software/Books/\344\275\240\346\211\200\344\270\215\347\237\245\351\201\223\347\232\204\345\206\260\345\206\267\347\232\204\347\273\217\346\265\216\347\234\237\347\233\270.sh" rename to "\345\233\276\344\271\246/Books/\344\275\240\346\211\200\344\270\215\347\237\245\351\201\223\347\232\204\345\206\260\345\206\267\347\232\204\347\273\217\346\265\216\347\234\237\347\233\270.sh" diff --git "a/Books and Software/Books/\345\246\202\344\275\225\351\230\205\350\257\273\344\270\200\346\234\254\344\271\246--\346\221\230\350\246\201.sh" "b/\345\233\276\344\271\246/Books/\345\246\202\344\275\225\351\230\205\350\257\273\344\270\200\346\234\254\344\271\246--\346\221\230\350\246\201.sh" similarity index 95% rename from "Books and Software/Books/\345\246\202\344\275\225\351\230\205\350\257\273\344\270\200\346\234\254\344\271\246--\346\221\230\350\246\201.sh" rename to "\345\233\276\344\271\246/Books/\345\246\202\344\275\225\351\230\205\350\257\273\344\270\200\346\234\254\344\271\246--\346\221\230\350\246\201.sh" index c0eca56..4702725 100644 --- "a/Books and Software/Books/\345\246\202\344\275\225\351\230\205\350\257\273\344\270\200\346\234\254\344\271\246--\346\221\230\350\246\201.sh" +++ "b/\345\233\276\344\271\246/Books/\345\246\202\344\275\225\351\230\205\350\257\273\344\270\200\346\234\254\344\271\246--\346\221\230\350\246\201.sh" @@ -1,8 +1,6 @@ -只有一种方式是真正地在阅读。没有任何外力的帮助,你就是要读这本书。你什么都没有,只凭着 -内心的力量,玩味着眼前的字句,慢慢地提升自己,从只有模糊的概念到更清楚地理解为止。 +只有一种方式是真正地在阅读。没有任何外力的帮助,你就是要读这本书。你什么都没有,只凭着内心的力量,玩味着眼前的字句,慢慢地提升自己,从只有模糊的概念到更清楚地理解为止。 -是一个凭借着头脑运作,除了玩味读物中的 -一些字句之外,不假任何外助,以一己之力来提升自我的过程。 +是一个凭借着头脑运作,除了玩味读物中的一些字句之外,不假任何外助,以一己之力来提升自我的过程。 获得资讯 记得住 提升理解力 解释得了 @@ -54,7 +52,7 @@ (12)证明作者的知识不足。 (13)证明作者的知识错误。 (14)证明作者不合逻辑。 - (15)证明作者的分析与理由是不完整的。 + (15)证明作者的分析与理由是不完整的。 #实用性的书因此可分为两种类型: diff --git "a/Books and Software/Books/\347\224\250 Python \345\222\214 Pygame \345\206\231\346\270\270\346\210\217 - \344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232.pdf" "b/\345\233\276\344\271\246/Books/\347\224\250 Python \345\222\214 Pygame \345\206\231\346\270\270\346\210\217 - \344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232.pdf" similarity index 100% rename from "Books and Software/Books/\347\224\250 Python \345\222\214 Pygame \345\206\231\346\270\270\346\210\217 - \344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232.pdf" rename to "\345\233\276\344\271\246/Books/\347\224\250 Python \345\222\214 Pygame \345\206\231\346\270\270\346\210\217 - \344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232.pdf" diff --git "a/Books and Software/Books/\347\262\276\350\277\233-\351\207\207\351\223\234-\350\257\273\344\271\246\347\254\224\350\256\260.sh" "b/\345\233\276\344\271\246/Books/\347\262\276\350\277\233-\351\207\207\351\223\234-\350\257\273\344\271\246\347\254\224\350\256\260.sh" similarity index 99% rename from "Books and Software/Books/\347\262\276\350\277\233-\351\207\207\351\223\234-\350\257\273\344\271\246\347\254\224\350\256\260.sh" rename to "\345\233\276\344\271\246/Books/\347\262\276\350\277\233-\351\207\207\351\223\234-\350\257\273\344\271\246\347\254\224\350\256\260.sh" index c716326..0f34236 100644 --- "a/Books and Software/Books/\347\262\276\350\277\233-\351\207\207\351\223\234-\350\257\273\344\271\246\347\254\224\350\256\260.sh" +++ "b/\345\233\276\344\271\246/Books/\347\262\276\350\277\233-\351\207\207\351\223\234-\350\257\273\344\271\246\347\254\224\350\256\260.sh" @@ -1,6 +1,7 @@ +```shell 精进-采铜 简介 - 采铜:崔翔宇 浙大心理学博士 曾就职于我司,知乎大神,被誉为 知乎社区中最具“知乎精神“,最符合社区理想与追求的楷模 + 采铜:崔翔宇 浙大心理学博士,知乎大神,被誉为 知乎社区中最具“知乎精神“,最符合社区理想与追求的楷模 简介:提供时间、选择、行动、学习、思维、才能、成功七个方面的精进路径,只要依据书中的方法反复磨炼,便可以日益精进,成为一个很厉害的人, 找到实现自我的成功之道 对待时间的态度 @@ -71,7 +72,7 @@ 睡到自然醒 如何更好的选择 树立最高目标 - 现象1:人通常采用“满意原则”,而不是“最优原则” + 现象1:人通常采用“满意原则”,而不是“最优原则”(人生关键抉择上听从内心,平时的小事上遵从理性) 现象2:成熟的人会遵循自己内心的标准,很多人却轻易为环境所左右 四个层次的格局 零度格局:盲众(看不见) @@ -299,6 +300,7 @@ 保留和发展自己的“怪癖”,并将其发展为自己的竞争力 为小的事务狂热,并在小事务中发现大世界 开展思想实验和行动实验,让思想和行到相互激发 +``` diff --git "a/Books and Software/Books/\350\257\273\344\271\246\347\254\224\350\256\260.sh" "b/\345\233\276\344\271\246/Books/\350\257\273\344\271\246\347\254\224\350\256\260.sh" similarity index 100% rename from "Books and Software/Books/\350\257\273\344\271\246\347\254\224\350\256\260.sh" rename to "\345\233\276\344\271\246/Books/\350\257\273\344\271\246\347\254\224\350\256\260.sh" diff --git "a/\345\233\276\344\271\246/Books/\350\260\267\346\255\214\346\224\266\350\227\217\345\244\271.md" "b/\345\233\276\344\271\246/Books/\350\260\267\346\255\214\346\224\266\350\227\217\345\244\271.md" new file mode 100644 index 0000000..e268b60 --- /dev/null +++ "b/\345\233\276\344\271\246/Books/\350\260\267\346\255\214\346\224\266\350\227\217\345\244\271.md" @@ -0,0 +1,2839 @@ +{ + "checksum": "4dff9a3c1a7394fd6f999560ee1eb82c", + "roots": { + "bookmark_bar": { + "children": [ { + "date_added": "13090319288183370", + "id": "13", + "meta_info": { + "last_visited_desktop": "13166256951453870" + }, + "name": "百度知道 - 全球最大中文互动问答平台", + "type": "url", + "url": "http://zhidao.baidu.com/" + }, { + "date_added": "13091355111377790", + "id": "16", + "meta_info": { + "last_visited_desktop": "13166170419796175" + }, + "name": "百度百科_全球最大中文百科全书", + "type": "url", + "url": "http://baike.baidu.com/" + }, { + "date_added": "13122974374767373", + "id": "74", + "meta_info": { + "last_visited_desktop": "13166595149345875" + }, + "name": "Google 翻译", + "type": "url", + "url": "https://translate.google.com/" + }, { + "date_added": "13122370249467344", + "id": "68", + "meta_info": { + "last_visited_desktop": "13166602581616929" + }, + "name": "博客园 - 开发者的网上家园", + "type": "url", + "url": "http://www.cnblogs.com/" + }, { + "date_added": "13122195666108385", + "id": "65", + "meta_info": { + "last_visited_desktop": "13166519025983860" + }, + "name": "博客专题-博客首页", + "type": "url", + "url": "http://3ms.huawei.com/hi/blog/index.html?3ms_type=menu" + }, { + "date_added": "13154096416758782", + "id": "519", + "meta_info": { + "last_visited_desktop": "13166603145290054" + }, + "name": "lgjabc (lgj)", + "type": "url", + "url": "https://github.com/lgjabc" + }, { + "children": [ { + "date_added": "13096804225160392", + "id": "31", + "meta_info": { + "last_visited_desktop": "13153895960630225" + }, + "name": "51Testing软件测试网-中国软件测试人的精神家园", + "type": "url", + "url": "http://www.51testing.com/html/index.html" + }, { + "date_added": "13095150442153000", + "id": "27", + "meta_info": { + "last_visited_desktop": "13166591727475229" + }, + "name": "软通动力专业服务系统", + "type": "url", + "url": "https://passport.isoftstone.com/?DomainUrl=http://ipsapro.isoftstone.com&ReturnUrl=%2fDefault.aspx" + }, { + "date_added": "13094987410201826", + "id": "24", + "meta_info": { + "last_visited_desktop": "13160204580531644" + }, + "name": "搜狗地图", + "type": "url", + "url": "http://map.sogou.com/" + }, { + "date_added": "13107518908304754", + "id": "46", + "meta_info": { + "last_visited_desktop": "13151041088050243" + }, + "name": "Python - 网站分类 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/cate/python/#p5" + }, { + "date_added": "13108117436274722", + "id": "50", + "meta_info": { + "last_visited_desktop": "13149939217899910" + }, + "name": "Intetool", + "type": "url", + "url": "http://rnd-mirrors.huawei.com/" + }, { + "date_added": "13122195694588375", + "id": "66", + "meta_info": { + "last_visited_desktop": "13147784717749197" + }, + "name": "Python Requests库:HTTP for Humans - 再见紫罗兰 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/linxiyue/p/3980003.html" + }, { + "date_added": "13122371432900384", + "id": "69", + "meta_info": { + "last_visited_desktop": "13145938054045127" + }, + "name": "HTTPS证书生成原理和部署细节 - 李铁牛 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/leetieniu2014/p/5258564.html" + }, { + "date_added": "13126707294500205", + "id": "97", + "meta_info": { + "last_visited_desktop": "13162632785435435" + }, + "name": "游客门户_心声社区", + "type": "url", + "url": "http://xinsheng.huawei.com/cn/index/guest.html" + }, { + "date_added": "13128575307577161", + "id": "114", + "meta_info": { + "last_visited_desktop": "13161402648658927" + }, + "name": "Sign in to GitHub · GitHub", + "type": "url", + "url": "https://github.com/login?return_to=%2Fvinta%2Fawesome-python" + }, { + "date_added": "13129024462955822", + "id": "118", + "meta_info": { + "last_visited_desktop": "13164103088902060" + }, + "name": "PyPI - the Python Package Index : Python Package Index", + "type": "url", + "url": "https://pypi.python.org/pypi" + }, { + "date_added": "13132309273600631", + "id": "147", + "name": "知识库 - 你身边的技术百科全书 - CSDN", + "type": "url", + "url": "http://lib.csdn.net/bases" + }, { + "date_added": "13140178097254980", + "id": "221", + "meta_info": { + "last_visited_desktop": "13150448861825729" + }, + "name": "pygame - thystar的专栏 - 博客频道 - CSDN.NET", + "type": "url", + "url": "http://blog.csdn.net/thystar/article/category/3140461" + }, { + "date_added": "13140328045737236", + "id": "224", + "meta_info": { + "last_visited_desktop": "13143864398405282" + }, + "name": "51CTO.COM - 技术成就梦想 - 中国领先的IT技术网站", + "type": "url", + "url": "http://www.51cto.com/" + }, { + "date_added": "13140692459144501", + "id": "233", + "meta_info": { + "last_visited_desktop": "13143864343740739" + }, + "name": "登录 - 支付宝", + "type": "url", + "url": "https://authem14.alipay.com/login/index.htm" + }, { + "date_added": "13140757337670331", + "id": "236", + "name": "中国IT实验室 - 技术精英由此开始", + "type": "url", + "url": "http://www.chinaitlab.com/" + }, { + "date_added": "13140869500774893", + "id": "237", + "name": "SQL ORDER BY 子句", + "type": "url", + "url": "http://www.w3school.com.cn/sql/sql_orderby.asp" + }, { + "date_added": "13133407889255351", + "id": "163", + "name": "【双旦晒藏书,感恩有好礼】回帖晒感激,帮你和那个他赢好礼 - 邓敏的博客", + "type": "url", + "url": "http://3ms.huawei.com/hi/blog/13063_2006589.html" + }, { + "date_added": "13133409625954646", + "id": "165", + "meta_info": { + "last_visited_desktop": "13166180334979554" + }, + "name": "博客频道 - CSDN.NET", + "type": "url", + "url": "http://blog.csdn.net/" + }, { + "date_added": "13091355141570910", + "id": "17", + "meta_info": { + "last_visited_desktop": "13150259346388732" + }, + "name": "百度文库——让每个人平等地提升自我", + "type": "url", + "url": "http://wenku.baidu.com/" + }, { + "date_added": "13152175325511815", + "id": "460", + "meta_info": { + "last_visited_desktop": "13152270921765676" + }, + "name": "开源中国 - 找到您想要的开源项目,分享和交流", + "type": "url", + "url": "http://www.oschina.net/" + }, { + "date_added": "13152175337766815", + "id": "461", + "meta_info": { + "last_visited_desktop": "13166180351018292" + }, + "name": "openstack - 51CTO 搜索", + "type": "url", + "url": "http://so.51cto.com/index.php?project=blog&keywords=openstack" + }, { + "date_added": "13152335826956274", + "id": "471", + "meta_info": { + "last_visited_desktop": "13166180362018292" + }, + "name": "CSDN搜索", + "type": "url", + "url": "http://so.csdn.net/so/?ref=toolbar_logo" + }, { + "date_added": "13148120199925712", + "id": "390", + "meta_info": { + "last_visited_desktop": "13148120199925712" + }, + "name": "Stack Overflow - Where Developers Learn, Share, & Build Careers", + "type": "url", + "url": "https://stackoverflow.com/" + }, { + "date_added": "13145008643729602", + "id": "311", + "meta_info": { + "last_visited_desktop": "13158832226559070" + }, + "name": "W3School在线测试工具 V2", + "type": "url", + "url": "http://www.w3school.com.cn/tiy/t.asp?f=csse_background-color" + } ], + "date_added": "13122195529862131", + "date_modified": "13161356114518996", + "id": "63", + "name": "常用网址", + "type": "folder" + }, { + "children": [ { + "date_added": "13122436324373956", + "id": "71", + "name": "【转】java中byte, int的转换, byte String转换 - wi100sh - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wi100sh/p/4548599.html" + }, { + "date_added": "13123846707193994", + "id": "86", + "name": "Java基础加强之集合篇(模块记忆、精要分析) - ITPSC - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hjwublog/p/6065804.html#autoid-3-2-1" + }, { + "date_added": "13127561493056755", + "id": "100", + "meta_info": { + "last_visited_desktop": "13143261683035906" + }, + "name": "python gui之tkinter语法杂记 - tommy.yu - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Tommy-Yu/p/4171006.html" + }, { + "date_added": "13127561498209826", + "id": "101", + "name": "Python-Tkinter几何布局管理(转) - 一路前行 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhangpengshou/p/3626137.html" + }, { + "date_added": "13127561506450826", + "id": "102", + "name": "python--tkinter桌面编程开发--记事本 - Kobe10 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Kobe10/p/5712233.html" + }, { + "date_added": "13128156242282568", + "id": "108", + "name": "go strings 包函数使用 - 王腾飞 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wtf0215-golang/p/5033102.html" + }, { + "date_added": "13128156415276168", + "id": "109", + "name": "Golang包 - 标签 - GoLove - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/golove/tag/Golang%E5%8C%85/" + }, { + "date_added": "13128489325920298", + "id": "112", + "name": "《JAVA与模式》之装饰模式 - java_my_life - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html" + }, { + "date_added": "13129126098809140", + "id": "122", + "name": "Github干货系列:Python 免费资源集合 - scott_h - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/scotth/p/3881488.html" + }, { + "date_added": "13129349864179509", + "id": "126", + "name": "java一个好玩的接口讲解 - 儒 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhixiaoye/p/5318242.html" + }, { + "date_added": "13129608835815474", + "id": "129", + "name": "浅谈算法和数据结构: 基本排序:选择 , 插入, 合并, 四 快速排序,五 优先级队列与堆排序 - 贺大卫 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/virusolf/p/5394343.html" + }, { + "date_added": "13130823938557671", + "id": "132", + "meta_info": { + "last_visited_desktop": "13154077978480257" + }, + "name": "python paramiko - starof - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/starof/p/4670433.html" + }, { + "date_added": "13131190858646902", + "id": "135", + "meta_info": { + "last_visited_desktop": "13145361049537457" + }, + "name": "JAVA多线程和并发基础面试问答(转载) - 海 子 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/dolphin0520/p/3932934.html" + }, { + "date_added": "13131190883510902", + "id": "136", + "name": "Java线程面试题 Top 50 (转载) - 海 子 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/dolphin0520/p/3958019.html" + }, { + "date_added": "13131532324054595", + "id": "139", + "name": "tkinter - 标签 - Hongten - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hongten/tag/tkinter/" + }, { + "date_added": "13131532874442895", + "id": "140", + "name": "画图 - 标签 - Zoctopus - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/OctoptusLian/tag/%E7%94%BB%E5%9B%BE/" + }, { + "date_added": "13131533982332808", + "id": "141", + "name": "tkinter - 随笔分类 - python客栈 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/tkinter/category/846939.html" + }, { + "date_added": "13131537130936127", + "id": "142", + "name": "python - 图形图像处理 博客园", + "type": "url", + "url": "http://www.cnblogs.com/denny402/tag/python/" + }, { + "date_added": "13131794045650099", + "id": "143", + "meta_info": { + "last_visited_desktop": "13164453725611840" + }, + "name": "SQL注入攻击 - 开始上路 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/tanshuicai/archive/2010/02/03/1664900.html" + }, { + "date_added": "13132220430797252", + "id": "146", + "meta_info": { + "last_visited_desktop": "13146042201388810" + }, + "name": "asyncio - 大诗人 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/styier/p/6415850.html" + }, { + "date_added": "13132739918599258", + "id": "150", + "name": "Java基础 - 随笔分类 - 五月的仓颉 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xrq730/category/731394.html" + }, { + "date_added": "13132740443397916", + "id": "151", + "meta_info": { + "last_visited_desktop": "13145360680638114" + }, + "name": "40个Java多线程问题总结 - 五月的仓颉 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xrq730/p/5060921.html" + }, { + "date_added": "13132746346713325", + "id": "154", + "name": "Java多线程5:synchronized锁方法块 - 五月的仓颉 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xrq730/p/4851530.html" + }, { + "date_added": "13132808953305136", + "id": "155", + "meta_info": { + "last_visited_desktop": "13154099081824691" + }, + "name": "HelloGitHub月刊 - 随笔分类 - 削微寒 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xueweihan/category/824908.html" + }, { + "date_added": "13132829080937250", + "id": "156", + "name": "Python 库大全 - 代码青春ζ - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/test404/p/6262649.html" + }, { + "date_added": "13132830104225685", + "id": "157", + "name": "Linux系统安全需要注意的一些问题 - 踏雪无痕SS - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/chenpingzhao/p/6443354.html" + }, { + "date_added": "13132830246011716", + "id": "158", + "name": "LINUX - 随笔分类 - 踏雪无痕SS - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/chenpingzhao/category/689535.html" + }, { + "date_added": "13132830925824753", + "id": "159", + "name": "剖析 Pexpect(转) - pretty_pretty_fish - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/pretty-pretty-fish/p/3233192.html" + }, { + "date_added": "13132834542968622", + "id": "160", + "meta_info": { + "last_visited_desktop": "13145361044197457" + }, + "name": "Java代码优化(长期更新) - 五月的仓颉 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xrq730/p/4865416.html" + }, { + "date_added": "13133949977532217", + "id": "169", + "name": "openresty(nginx)、lua、drizzle调研 - 一片相思林 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/huligong1234/p/4007103.html" + }, { + "date_added": "13133879386978009", + "id": "168", + "name": "OpenResty(nginx+lua) 入门 - digdeep - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/digdeep/p/4859575.html" + }, { + "date_added": "13134732669229768", + "id": "172", + "name": "build-web-application-with-golang/preface.md at master · astaxie/build-web-application-with-golang", + "type": "url", + "url": "https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md" + }, { + "date_added": "13134810262043058", + "id": "173", + "name": "golang 小知识点记录 - wangxusummer - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wangxusummer/p/4203792.html" + }, { + "date_added": "13135424588591146", + "id": "179", + "name": "一个小时学会MySQL数据库 - 张果 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/best/p/6517755.html" + }, { + "date_added": "13135922302014936", + "id": "182", + "name": "python_21_线程+进程+协程 - 北门吹雪 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/2bjiujiu/p/6668932.html" + }, { + "date_added": "13136000461461415", + "id": "183", + "name": "jemygraw (Jemy Graw) / Repositories", + "type": "url", + "url": "https://github.com/jemygraw?page=3&tab=repositories" + }, { + "date_added": "13136541611492147", + "id": "186", + "name": "requireJS 从概念到实战 - 卷柏的花期 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/HCJJ/p/6611669.html" + }, { + "date_added": "13136541624286147", + "id": "187", + "name": "require.js入门 - 爱喝酸奶的吃货 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yingzi1028/p/6693852.html" + }, { + "date_added": "13136608663721854", + "id": "190", + "name": "go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package", + "type": "url", + "url": "https://github.com/Go-SQL-Driver/MySQL" + }, { + "date_added": "13137164706316644", + "id": "191", + "name": "贝叶斯公式_百度百科", + "type": "url", + "url": "http://baike.baidu.com/item/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%85%AC%E5%BC%8F" + }, { + "date_added": "13137218146204390", + "id": "192", + "name": "宪哥的逆袭 - 叶炳成 -概率论 - elar - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/elaron/p/3408190.html" + }, { + "date_added": "13139649192725485", + "id": "209", + "name": "Interface 只是一个特殊的struct - 编程技术沙龙 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2029071/blog_2625413.html?mapId=4077611" + }, { + "date_added": "13139649201118820", + "id": "210", + "name": "深入Go语言模型(1):interface的底层详解 - 编程技术沙龙 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2029071/blog_2555625.html?mapId=3990547&for_statistic_from=all_group_blog" + }, { + "date_added": "13139658759765047", + "id": "211", + "name": "Golang精编100题 - 牛杰的博客", + "type": "url", + "url": "http://3ms.huawei.com/hi/blog/709791_2624655.html?for_statistic_from=interfix_blog_rec_related" + }, { + "date_added": "13139738381442953", + "id": "212", + "name": "Python面试必须要看的15个问题 - MR.QiGao - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhangqigao/p/6397853.html" + }, { + "date_added": "13139738387187953", + "id": "213", + "name": "《Django By Example》第一章 中文 翻译 (个人学习,渣翻) - 夜夜月月 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/levelksk/p/6152893.html" + }, { + "date_added": "13139738390101953", + "id": "214", + "name": "Python 沙箱逃逸 - Chesky - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Chesky/p/Python_sandbox.html" + }, { + "date_added": "13139741742985703", + "id": "215", + "name": "Python3字节码指令集 - 101010 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/fortwo/archive/2013/05/13/3076780.html" + }, { + "date_added": "13140145418395924", + "id": "218", + "name": "调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令 - blcblc - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/charlesblc/p/6256912.html" + }, { + "date_added": "13140348560503099", + "id": "227", + "meta_info": { + "last_visited_desktop": "13149673957264477" + }, + "name": "「UI 测试自动化selenium」汇总 - 虫师 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/fnng/p/3157639.html" + }, { + "date_added": "13140685095568491", + "id": "230", + "meta_info": { + "last_visited_desktop": "13144850366012360" + }, + "name": "requests 模块 - 陨落&新生 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/shizhengwen/p/6837442.html" + }, { + "date_added": "13141298452231887", + "id": "240", + "name": "Python 资源大全中文版 - 测试之家 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1502677/blog_2565037.html?mapId=4003407" + }, { + "date_added": "13141808550520617", + "id": "243", + "name": "大声喊出我们的口号:去他妈的WAF(SQL注入绕过) - ssooking - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/ssooking/articles/6358018.html" + }, { + "date_added": "13138879714975147", + "id": "202", + "name": "【Go命令教程】6. go doc 与 godoc - phpgo - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/phpgo/p/6442208.html" + }, { + "date_added": "13139049690425928", + "id": "203", + "name": "GO - 标签 - 黑手党老k - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhangym/tag/GO/" + }, { + "date_added": "13145361024957457", + "id": "317", + "meta_info": { + "last_visited_desktop": "13145361024958457" + }, + "name": "java发送http的get、post请求 - 上校 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html" + }, { + "date_added": "13145369304034639", + "id": "318", + "meta_info": { + "last_visited_desktop": "13145369304034639" + }, + "name": "Java总结篇系列:Java多线程(二) - Windstep - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/lwbqqyumidi/p/3817517.html" + }, { + "date_added": "13145369361902581", + "id": "319", + "meta_info": { + "last_visited_desktop": "13145369361902581" + }, + "name": "Java总结篇系列:Java多线程(三) - Windstep - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/lwbqqyumidi/p/3821389.html" + }, { + "date_added": "13145789737088131", + "id": "335", + "meta_info": { + "last_visited_desktop": "13145789737089131" + }, + "name": "github上总结的python资源列表 - tina的博客 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/tina_ttl/article/details/51830845?locationNum=2&fps=1" + }, { + "date_added": "13147262821497929", + "id": "369", + "meta_info": { + "last_visited_desktop": "13147262821497929" + }, + "name": "Python3 多进程和多线程 - Coder25 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/284628487a/p/5590857.html" + }, { + "date_added": "13147262828669929", + "id": "370", + "meta_info": { + "last_visited_desktop": "13147262828669929" + }, + "name": "py编码终极版 - Yuan先生 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yuanchenqi/articles/5956943.html" + }, { + "date_added": "13152591454763943", + "id": "474", + "meta_info": { + "last_visited_desktop": "13152591454763943" + }, + "name": "【GoLang】50 个 Go 开发者常犯的错误 - junneyang - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/junneyang/p/6098821.html" + }, { + "children": [ { + "date_added": "13142501462032753", + "id": "254", + "name": "Bootstrap3 CSS样式基本用法总结 - TabWeng - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hlwyfeng/p/5182722.html" + }, { + "date_added": "13142505301315644", + "id": "256", + "name": "Redhat修改主机名_Red hat怎么永久修改主机名hostname(转) - dy9776 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/nucdy/p/5660266.html" + }, { + "date_added": "13143021887272497", + "id": "259", + "meta_info": { + "last_visited_desktop": "13151039863485199" + }, + "name": "HTML 基础篇 - 索宁 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/suoning/p/5614372.html" + }, { + "date_added": "13143527345109243", + "id": "265", + "meta_info": { + "last_visited_desktop": "13143527345109243" + }, + "name": "Bootstrap学习目录 - 小火柴的蓝色理想 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xiaohuochai/p/7097376.html" + }, { + "date_added": "13143535954702465", + "id": "266", + "meta_info": { + "last_visited_desktop": "13143535954702465" + }, + "name": "在哪里可以下载Dreamweaver软件? - 海军基地 - 3MS知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/km/groups/3271901/blogs/details/2485439" + }, { + "date_added": "13143983079455862", + "id": "272", + "meta_info": { + "last_visited_desktop": "13148725208164438" + }, + "name": "Flask扩展flask-script文档中文翻译 - agmcs - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/agmcs/articles/4445644.html" + }, { + "date_added": "13144158146786476", + "id": "278", + "meta_info": { + "last_visited_desktop": "13144158146786476" + }, + "name": "HTML5+CSS3静态页面项目-BusinessTheme的总结 - omoc - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/omoc/p/7144231.html" + }, { + "date_added": "13144469361979917", + "id": "287", + "meta_info": { + "last_visited_desktop": "13144495068538834" + }, + "name": "谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法 - ChokCoco - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/coco1s/p/5893921.html" + }, { + "date_added": "13144491566607174", + "id": "288", + "meta_info": { + "last_visited_desktop": "13144747590115362" + }, + "name": "chokcoco (Coco)", + "type": "url", + "url": "https://github.com/chokcoco" + }, { + "date_added": "13144491609986097", + "id": "289", + "meta_info": { + "last_visited_desktop": "13144730337313199" + }, + "name": "Python-Flask:利用flask_sqlalchemy实现分页效果 - 魂牵梦琳 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Alin-2016/p/7170243.html" + }, { + "date_added": "13144495299937833", + "id": "290", + "meta_info": { + "last_visited_desktop": "13144730342127199" + }, + "name": "谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画! - ChokCoco - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/coco1s/p/6603403.html" + }, { + "date_added": "13144747948121569", + "id": "293", + "meta_info": { + "last_visited_desktop": "13144747948122569" + }, + "name": "跟着9张思维导图学习Javascript - ChokCoco - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/coco1s/p/3953653.html" + }, { + "date_added": "13144930507736355", + "id": "304", + "meta_info": { + "last_visited_desktop": "13144930507736355" + }, + "name": "css - 标签 - 司徒正美 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/rubylouvre/tag/css/default.html?page=2" + }, { + "date_added": "13144988516303259", + "id": "307", + "meta_info": { + "last_visited_desktop": "13144988516303259" + }, + "name": "纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),NB么? - sxwgf - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/sxwgf/archive/2012/01/17/2324256.html" + }, { + "date_added": "13144992512492423", + "id": "308", + "meta_info": { + "last_visited_desktop": "13144992512492423" + }, + "name": "css样式大全(整理版) - lhyterry - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/laihuayan/archive/2012/07/27/2611111.html" + }, { + "date_added": "13141896600518859", + "id": "249", + "meta_info": { + "last_visited_desktop": "13145508419031217" + }, + "name": "计算机程序的思维逻辑 - 文章列表 - 老马说编程 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/swiftma/p/5631311.html" + }, { + "date_added": "13145524570214474", + "id": "322", + "meta_info": { + "last_visited_desktop": "13145532461212619" + }, + "name": "设计基础法则总结 - Designer UCD能力中心 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2033375/thread_5347069.html?mapId=6487607&for_statistic_from=all_group_forum" + }, { + "date_added": "13145525910536251", + "id": "323", + "meta_info": { + "last_visited_desktop": "13145532441861619" + }, + "name": "如何给作品配图!清晰度?合适性?统一性? - Designer UCD能力中心 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2033375/thread_6134265.html?mapId=7712327" + }, { + "date_added": "13145526477821240", + "id": "324", + "meta_info": { + "last_visited_desktop": "13145526477821240" + }, + "name": "【Execl技巧录屏教学】 - Designer UCD能力中心 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2033375/thread_1240457.html?mapId=7764285&for_statistic_from=all_group_forum" + }, { + "date_added": "13145526600890336", + "id": "325", + "meta_info": { + "last_visited_desktop": "13145526600890336" + }, + "name": "那些年,我们看过的各种设计理论法则 - Designer UCD能力中心 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2033375/thread_6315717.html?mapId=7940835&for_statistic_from=all_group_forum" + }, { + "date_added": "13145706848268418", + "id": "328", + "meta_info": { + "last_visited_desktop": "13145706848268418" + }, + "name": "精通CSS滤镜(filter)(实例解析) - 施杨 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/shiyangxt/archive/2008/11/16/1334633.html" + }, { + "date_added": "13145768216460531", + "id": "331", + "meta_info": { + "last_visited_desktop": "13145768216461531" + }, + "name": "BootStrap学习笔记 - *茉莉花开* - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/jasmine-95/p/5266842.html" + }, { + "date_added": "13145772713508891", + "id": "332", + "meta_info": { + "last_visited_desktop": "13165916492939281" + }, + "name": "python进程、线程、协程 - 张岩林 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/aylin/p/5601969.html" + }, { + "date_added": "13145943270729807", + "id": "338", + "meta_info": { + "last_visited_desktop": "13145943270730807" + }, + "name": "mongoDB 入门指南、示例 - hoojo - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html" + }, { + "date_added": "13145943285287807", + "id": "339", + "meta_info": { + "last_visited_desktop": "13164193109736025" + }, + "name": "MongoDB数据库 - 索宁 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/suoning/p/6759367.html" + }, { + "date_added": "13145945491529530", + "id": "340", + "meta_info": { + "last_visited_desktop": "13145945491530530" + }, + "name": "Python 操作 MongoDB - 罗兵 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hhh5460/p/5838516.html" + }, { + "date_added": "13145948498020051", + "id": "341", + "meta_info": { + "last_visited_desktop": "13145948498020051" + }, + "name": "Python之with语句 - 如果的事 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/chenny7/p/4213447.html" + }, { + "date_added": "13145950279199244", + "id": "342", + "meta_info": { + "last_visited_desktop": "13164434516840868" + }, + "name": "python中 try、except、finally 的执行顺序 - ybwang1989 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/ybwang/p/4738621.html" + }, { + "date_added": "13145958399636890", + "id": "343", + "meta_info": { + "last_visited_desktop": "13145958399637890" + }, + "name": "python类的成员和装饰器 - Geek_Ma - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/geekma/archive/2013/02/18/2915623.html" + }, { + "date_added": "13145961391001600", + "id": "344", + "meta_info": { + "last_visited_desktop": "13145961391001600" + }, + "name": "python yield用法总结 - 智慧IT人生 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/python-life/articles/4549996.html" + }, { + "date_added": "13146221725907432", + "id": "347", + "meta_info": { + "last_visited_desktop": "13164432779150777" + }, + "name": "Python标准模块--collections - 老顽童2007 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhbzz2007/p/5986369.html" + }, { + "date_added": "13146280771559553", + "id": "348", + "meta_info": { + "last_visited_desktop": "13146718173690493" + }, + "name": "Flask源码剖析 - yz764127031的博客 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/yz764127031/article/details/54955619?locationNum=5&fps=1" + } ], + "date_added": "13142501478426657", + "date_modified": "13146286338310224", + "id": "255", + "name": "html与css", + "type": "folder" + }, { + "children": [ { + "date_added": "13125575696916540", + "id": "89", + "name": "Welcome to Onebox", + "type": "url", + "url": "https://onebox.huawei.com/#file/1/0" + }, { + "date_added": "13125832426371278", + "id": "92", + "name": "常用排序算法的python实现和性能分析 - waterxi - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wiki-royzhang/p/3614694.html" + }, { + "date_added": "13125832430111278", + "id": "93", + "name": "各种排序算法汇总 - wolfy - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wolf-sun/p/4312475.html" + }, { + "date_added": "13125832438144278", + "id": "94", + "name": "浅谈算法和数据结构: 四 快速排序 - yangecnu - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yangecnu/p/Introduce-Quick-Sort.html" + }, { + "date_added": "13128052343465743", + "id": "105", + "meta_info": { + "last_visited_desktop": "13143958781840457" + }, + "name": "哈佛商学院经典案例:不要轻易和少妇上床 - 潘文龙的博客", + "type": "url", + "url": "http://3ms.huawei.com/hi/blog/443131_1555025.html?for_statistic_from=interfix_blog_rec_related" + }, { + "date_added": "13128680248601872", + "id": "117", + "name": "中国知网", + "type": "url", + "url": "http://cnki.huawei.com/kns55/default.aspx" + }, { + "date_added": "13143545171671684", + "id": "267", + "meta_info": { + "last_visited_desktop": "13143545171672684" + }, + "name": "pyMagic:用python控制的Geek入门神器 - K1two2 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/k1two2/p/5458321.html" + }, { + "date_added": "13143545188607684", + "id": "268", + "meta_info": { + "last_visited_desktop": "13143545188607684" + }, + "name": "[TPYBoard - Micropython之会python就能做硬件 5] 学习使用重力传感器及PWM - 小五义 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xiaowuyi/p/6426884.html" + }, { + "date_added": "13143693569057459", + "id": "269", + "meta_info": { + "last_visited_desktop": "13143693569057459" + }, + "name": "专为渗透测试人员设计的Python工具大合集 - 华为网络安全技术社区 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2034125/thread_6325065.html?mapId=7960923" + }, { + "date_added": "13144147345927733", + "id": "275", + "meta_info": { + "last_visited_desktop": "13144147345927733" + }, + "name": "Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压 - 叶剑飞Victor - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yejianfei/p/3351626.html" + }, { + "date_added": "13144158433220621", + "id": "279", + "meta_info": { + "last_visited_desktop": "13144158433220621" + }, + "name": "学会git玩转github,结尾有惊喜!有惊喜!有惊喜! - 小君君的博客 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/qijunjun/p/7139562.html" + }, { + "date_added": "13144233443800998", + "id": "282", + "meta_info": { + "last_visited_desktop": "13144233443800998" + }, + "name": "Git常用命令总结 - 圣骑士wind - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/mengdd/p/4153773.html" + }, { + "date_added": "13144303509530972", + "id": "283", + "meta_info": { + "last_visited_desktop": "13144303509531972" + }, + "name": "SSH 本地端口转发 - Hopkings - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hopkings/p/6442057.html" + }, { + "date_added": "13144303514907972", + "id": "284", + "meta_info": { + "last_visited_desktop": "13144303514908972" + }, + "name": "linux端口转发 - stefanlee - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/stefanlee/p/3500501.html" + }, { + "date_added": "13144819694471697", + "id": "296", + "meta_info": { + "last_visited_desktop": "13144819694471697" + }, + "name": "Java 9 揭秘(11. Java Shell) - 林本托 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/IcanFixIt/p/7199108.html" + }, { + "date_added": "13144835037191107", + "id": "299", + "meta_info": { + "last_visited_desktop": "13144835037191107" + }, + "name": "sql(join on 和where的执行顺序) - higirle - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Jessy/p/3525419.html" + }, { + "date_added": "13144849458784032", + "id": "300", + "meta_info": { + "last_visited_desktop": "13150870197280910" + }, + "name": "Ubuntu16.04下使用sublime text3搭建Python IDE - unflynaomi - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/unflynaomi/p/5704293.html" + }, { + "date_added": "13144907059004929", + "id": "303", + "meta_info": { + "last_visited_desktop": "13144907059005929" + }, + "name": "mysql--增删改查 - Kobe10 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Kobe10/p/5764153.html" + } ], + "date_added": "13141895892228953", + "date_modified": "13144930507736355", + "id": "247", + "name": "猎奇网址", + "type": "folder" + }, { + "children": [ { + "date_added": "13143201488295515", + "id": "262", + "meta_info": { + "last_visited_desktop": "13143201488295515" + }, + "name": "JMeter录制 Http(s)脚本 - 郑永意的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/1972219" + }, { + "date_added": "13143201513363515", + "id": "264", + "meta_info": { + "last_visited_desktop": "13143283612249085" + }, + "name": "jmeter调用IR接口,SSL配置 遇到connection reset问题解决 - 肖和飞的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/2428779" + }, { + "date_added": "13145075349838247", + "id": "314", + "meta_info": { + "last_visited_desktop": "13145075349839247" + }, + "name": "Sublime Text 3 配置Java开发 - 指戈 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/final/p/5348350.html" + } ], + "date_added": "13143201504544515", + "date_modified": "13145361024957457", + "id": "263", + "name": "工具使用", + "type": "folder" + }, { + "children": [ { + "date_added": "13146286338310224", + "id": "351", + "meta_info": { + "last_visited_desktop": "13164868001986631" + }, + "name": "redis 学习指南 - hoojo - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hoojo/p/4466024.html" + }, { + "date_added": "13146287882039207", + "id": "353", + "meta_info": { + "last_visited_desktop": "13161245965454505" + }, + "name": "Python—redis - J_hong - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/melonjiang/p/5342383.html" + }, { + "date_added": "13146818550619526", + "id": "356", + "meta_info": { + "last_visited_desktop": "13147167050055515" + }, + "name": "Flask0.1源码剖析 - 王博文的专栏 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/dutsoft/article/details/70943352?locationNum=3&fps=1" + }, { + "date_added": "13146825716574112", + "id": "357", + "meta_info": { + "last_visited_desktop": "13147167053557515" + }, + "name": "flask源码剖析之上下文全局变量 - zhuma的编程学习 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/LANGQING12345/article/details/46740551" + }, { + "date_added": "13146897031275770", + "id": "358", + "meta_info": { + "last_visited_desktop": "13160192870379627" + }, + "name": "《大话设计模式》Python版代码实现 - 五岳 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html" + }, { + "date_added": "13146910188015721", + "id": "359", + "meta_info": { + "last_visited_desktop": "13146910188016721" + }, + "name": "一定会爱上Python - 标签 - 请叫我头头哥 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/toutou/tag/%E4%B8%80%E5%AE%9A%E4%BC%9A%E7%88%B1%E4%B8%8APython/" + }, { + "date_added": "13146915986624109", + "id": "360", + "meta_info": { + "last_visited_desktop": "13150888269145416" + }, + "name": "使用公司内部源作为Docker仓库 - 刘佳的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/2459359" + }, { + "date_added": "13146916176766544", + "id": "361", + "meta_info": { + "last_visited_desktop": "13146916176766544" + }, + "name": "内网安装docker的方法 - 徐宝馨的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/2658009" + }, { + "date_added": "13146916204658544", + "id": "362", + "meta_info": { + "last_visited_desktop": "13146916204659544" + }, + "name": "Docker安装新手教程详解 - 禹业立的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/1958731?l=zh-cn" + }, { + "date_added": "13146918386238185", + "id": "363", + "meta_info": { + "last_visited_desktop": "13147175033316971" + }, + "name": "我司Suse安装Python3 - 丘忠润的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/2599747" + }, { + "date_added": "13147178436902715", + "id": "366", + "meta_info": { + "last_visited_desktop": "13147178436902715" + }, + "name": "linux下Tab及shell 补全python - yijieshusheng - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/senzhe/p/yijieshusheng.html" + }, { + "date_added": "13147324359110243", + "id": "373", + "meta_info": { + "last_visited_desktop": "13148467774321150" + }, + "name": "Linux回炉复习系列文章大纲 - 骏马金龙 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/f-ck-need-u/p/7048359.html" + }, { + "date_added": "13147441761467186", + "id": "374", + "meta_info": { + "last_visited_desktop": "13147444486046004" + }, + "name": "SSH隧道技术----端口转发,socket代理 - 登高行远 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/fbwfbi/p/3702896.html" + }, { + "date_added": "13147442817261872", + "id": "375", + "meta_info": { + "last_visited_desktop": "13147932674956331" + }, + "name": "centos6.5 iptables实现端口转发 - CalvinChu - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/apexchu/p/4255551.html" + }, { + "date_added": "13147443741959920", + "id": "376", + "meta_info": { + "last_visited_desktop": "13147932965297351" + }, + "name": "20条IPTables防火墙规则用法! - Linux就该这么学 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/linuxprobe/p/5643684.html" + }, { + "date_added": "13147445711564270", + "id": "377", + "meta_info": { + "last_visited_desktop": "13147445711564270" + }, + "name": "SSH 端口转发 - angelfzt - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/angelfzt/p/3600650.html" + }, { + "date_added": "13147776795815167", + "id": "380", + "meta_info": { + "last_visited_desktop": "13164874830729125" + }, + "name": "简单好用的日志管理工具 Logrotate - 傅腾(futeng) - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/futeng/p/4785206.html" + }, { + "date_added": "13147949008469763", + "id": "381", + "meta_info": { + "last_visited_desktop": "13147949008469763" + }, + "name": "使用openssl进行证书格式转换 - 奋斗1984 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhengah/p/5010613.html" + }, { + "date_added": "13147949482525365", + "id": "382", + "meta_info": { + "last_visited_desktop": "13147949482525365" + }, + "name": "openssl的证书格式转换 - 奋斗1984 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhengah/p/4998202.html" + }, { + "date_added": "13148101335690357", + "id": "385", + "meta_info": { + "last_visited_desktop": "13148101335690357" + }, + "name": "每天一个linux命令(50):crontab命令 - peida - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html" + }, { + "date_added": "13148104540078652", + "id": "386", + "meta_info": { + "last_visited_desktop": "13148104540079652" + }, + "name": "Linux下logrotate日志轮询操作梳理 - 散尽浮华 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/kevingrace/p/6307298.html" + }, { + "date_added": "13148117044705280", + "id": "387", + "meta_info": { + "last_visited_desktop": "13148117044705280" + }, + "name": "一张图搞定OAuth2.0 - 闪客sun - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/flashsun/p/7424071.html" + }, { + "date_added": "13148118880138416", + "id": "388", + "meta_info": { + "last_visited_desktop": "13148118880138416" + }, + "name": "python win32com - 字符串 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/shgq/p/4165121.html" + }, { + "date_added": "13148120070142454", + "id": "389", + "meta_info": { + "last_visited_desktop": "13148120793318220" + }, + "name": "如何写代码 —— 编程内功心法 - Bug辉 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/bughui/p/7422304.html" + }, { + "date_added": "13148620590968815", + "id": "396", + "meta_info": { + "last_visited_desktop": "13148620590968815" + }, + "name": "SQL查询中关键词的执行顺序 - hbsygfz - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hbsygfz/p/4231828.html" + }, { + "date_added": "13148731967103705", + "id": "399", + "meta_info": { + "last_visited_desktop": "13148986272103551" + }, + "name": "Flask 扩展 HTTP认证 - Erick-LONG - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Erick-L/p/7060806.html" + }, { + "date_added": "13148732015005787", + "id": "400", + "meta_info": { + "last_visited_desktop": "13149246556961127" + }, + "name": "Flask学习 - 随笔分类 - Erick-LONG - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Erick-L/category/1017281.html" + }, { + "date_added": "13148970024485256", + "id": "403", + "meta_info": { + "last_visited_desktop": "13148970024485256" + }, + "name": "Flask - kikaylee的专栏 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/kikaylee/article/category/6551426" + }, { + "date_added": "13148979953882736", + "id": "404", + "meta_info": { + "last_visited_desktop": "13149139706816689" + }, + "name": "python - NunchakusHuang的专栏 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/huangyong1314/article/category/6326979" + }, { + "date_added": "13149136071265235", + "id": "405", + "meta_info": { + "last_visited_desktop": "13149136071265235" + }, + "name": "Flask下载文件 - 苏小鸡 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/we8fans/p/7107353.html" + }, { + "date_added": "13149158048443805", + "id": "406", + "meta_info": { + "last_visited_desktop": "13149158048443805" + }, + "name": "Flask 文件和流 - Erick-LONG - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Erick-L/p/7015783.html" + }, { + "date_added": "13149316143074132", + "id": "409", + "meta_info": { + "last_visited_desktop": "13149318878525148" + }, + "name": "aiohttp 异步IO库 - Vincen_shen - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/vincenshen/articles/7280074.html" + }, { + "date_added": "13149655320529876", + "id": "412", + "meta_info": { + "last_visited_desktop": "13149655320529876" + }, + "name": "Python3基础教程-廖雪峰[带标签完整版] - yeayee - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yeayee/p/4961804.html" + }, { + "date_added": "13149671440515939", + "id": "413", + "meta_info": { + "last_visited_desktop": "13149671440515939" + }, + "name": "python 将png图片格式转换生成gif动画 - dcb3688 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/dcb3688/p/4608048.html" + }, { + "date_added": "13149680632620471", + "id": "414", + "meta_info": { + "last_visited_desktop": "13149680632620471" + }, + "name": "HTTP真的很简单 - 削微寒 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xueweihan/p/5330189.html" + }, { + "date_added": "13149680635657471", + "id": "415", + "meta_info": { + "last_visited_desktop": "13149680635657471" + }, + "name": "十分钟搞懂什么是CGI - 削微寒 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xueweihan/p/5319893.html" + }, { + "date_added": "13149741260267137", + "id": "416", + "meta_info": { + "last_visited_desktop": "13149741477749949" + }, + "name": "网关协议学习:CGI、FastCGI、WSGI、uWSGI - hzhtracy - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hzhtracy/p/4365938.html" + }, { + "date_added": "13149852903690589", + "id": "417", + "meta_info": { + "last_visited_desktop": "13149852903690589" + }, + "name": "[译]httpie: CLI, 类似cURL的客户端 - 山里程序猿 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/iostream7/p/5935386.html" + }, { + "date_added": "13149938603729213", + "id": "420", + "meta_info": { + "last_visited_desktop": "13149938603729213" + }, + "name": "selenium知识点小结 - 51Testing软件测试网", + "type": "url", + "url": "http://www.51testing.com/html/94/n-3721094-2.html" + }, { + "date_added": "13149938606831762", + "id": "421", + "meta_info": { + "last_visited_desktop": "13149938606831762" + }, + "name": "JMeter目录及关键配置分析 - 51Testing软件测试网", + "type": "url", + "url": "http://www.51testing.com/html/12/n-3721212.html" + }, { + "date_added": "13150279005983370", + "id": "424", + "meta_info": { + "last_visited_desktop": "13150279018142370" + }, + "name": "胶片宝典,学了不能保证绝对牛逼,但绝对比之前的自己牛逼 - IDP资料工具园 - 3MS知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/km/groups/1007849/blogs/details/1948225#preview_attachment_box_1948225" + }, { + "date_added": "13150349589676551", + "id": "427", + "meta_info": { + "last_visited_desktop": "13150349589676551" + }, + "name": "Python之Redis操作 - ccorz - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/ccorz/p/5691501.html" + }, { + "date_added": "13150351896799478", + "id": "428", + "meta_info": { + "last_visited_desktop": "13150351896800478" + }, + "name": "【微信支付】普通商户接入文档", + "type": "url", + "url": "https://pay.weixin.qq.com/wiki/doc/api/index.html" + }, { + "date_added": "13150351916672458", + "id": "429", + "meta_info": { + "last_visited_desktop": "13150351916672458" + }, + "name": "开放平台文档中心", + "type": "url", + "url": "https://docs.open.alipay.com/" + }, { + "date_added": "13150458332380293", + "id": "432", + "meta_info": { + "last_visited_desktop": "13150458332380293" + }, + "name": "python关键字 - zhuzhu2016 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhuzhu2016/p/6170150.html" + }, { + "date_added": "13150812282671941", + "id": "435", + "meta_info": { + "last_visited_desktop": "13150812282671941" + }, + "name": "python性能检测工具整理 - lxmhhy - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/lxmhhy/p/6133018.html" + }, { + "date_added": "13150812285761941", + "id": "436", + "meta_info": { + "last_visited_desktop": "13150812285761941" + }, + "name": "Python内存优化:Profile,slots,compact dict - xybaby - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xybaby/p/7488216.html" + }, { + "date_added": "13150812288500941", + "id": "437", + "meta_info": { + "last_visited_desktop": "13150812288501941" + }, + "name": "使用gc、objgraph干掉python内存泄露与循环引用! - xybaby - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xybaby/p/7491656.html" + }, { + "date_added": "13150812292511941", + "id": "438", + "meta_info": { + "last_visited_desktop": "13150812292511941" + }, + "name": "我常用的 Python 调试工具 - 宋宏达的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/1336379" + }, { + "date_added": "13150812295231941", + "id": "439", + "meta_info": { + "last_visited_desktop": "13152765745127666" + }, + "name": "Python程序的性能分析指南 - 宋宏达的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/1305147" + }, { + "date_added": "13150814343073245", + "id": "440", + "meta_info": { + "last_visited_desktop": "13150814343074245" + }, + "name": "Python性能分析指南 - Django's blog - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/DjangoBlog/p/5624940.html" + }, { + "date_added": "13150885867605346", + "id": "441", + "meta_info": { + "last_visited_desktop": "13150885867606346" + }, + "name": "Python之路【第十七篇】:Django【进阶篇 】 - 武沛齐 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wupeiqi/articles/5246483.html" + }, { + "date_added": "13150955474118472", + "id": "444", + "meta_info": { + "last_visited_desktop": "13150955474119472" + }, + "name": "TCP/IP(一)之开启计算机网络之路 - 苦水润喉 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhangyinhua/p/7598603.html" + }, { + "date_added": "13151125602082488", + "id": "447", + "meta_info": { + "last_visited_desktop": "13152858301758524" + }, + "name": "NotePad++ 正则表达式替换 高级用法 [转] - aj117 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/tibit/p/6387199.html" + }, { + "date_added": "13151130104420545", + "id": "450", + "meta_info": { + "last_visited_desktop": "13151130104420545" + }, + "name": "sublime 安装 Terminal 使用 cmder - 井底之蛙丶 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/juedui0769/p/5058554.html" + }, { + "date_added": "13152070656007677", + "id": "453", + "meta_info": { + "last_visited_desktop": "13152070656007677" + }, + "name": "程序员必知的Python陷阱与缺陷列表 - xybaby - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xybaby/p/7183854.html" + }, { + "date_added": "13152094651103738", + "id": "454", + "meta_info": { + "last_visited_desktop": "13152094651104738" + }, + "name": "USB 调试工具(python2.7 + Tkinter + pyusb/pywinusb) - jakey.chen - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/jakeyChen/p/4463530.html" + }, { + "date_added": "13152095975417273", + "id": "455", + "meta_info": { + "last_visited_desktop": "13152096646392027" + }, + "name": "使用python来调试串口 - Biiigfish - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/pied/p/4175641.html" + }, { + "date_added": "13152096745671089", + "id": "456", + "meta_info": { + "last_visited_desktop": "13152175972850492" + }, + "name": "python3 Serial 串口助手的接收读取数据 - 木子宣 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/attentle/p/7098408.html" + }, { + "date_added": "13152099885265170", + "id": "457", + "meta_info": { + "last_visited_desktop": "13152099885266170" + }, + "name": "tty&pty - 记录点滴 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/growup/archive/2011/07/12/2104623.html" + }, { + "date_added": "13152101368978338", + "id": "458", + "meta_info": { + "last_visited_desktop": "13152101368979338" + }, + "name": "【转】linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解----不错 - wi100sh - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wi100sh/p/4513245.html" + }, { + "date_added": "13152161774435243", + "id": "459", + "meta_info": { + "last_visited_desktop": "13152166120856393" + }, + "name": "Linux 终端tty pty pts描述 - 乐沙弥的世界 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/leshami/article/details/77101939" + }, { + "date_added": "13155623323576254", + "id": "543", + "meta_info": { + "last_visited_desktop": "13155623323576254" + }, + "name": "我们的梦中情人", + "type": "url", + "url": "http://xinsheng.huawei.com/cn/index.php?app=forum&mod=Detail&act=index&id=3406637&p=1" + } ], + "date_added": "13146286370676625", + "date_modified": "13155816214202502", + "id": "352", + "name": "杂货铺子", + "type": "folder" + } ], + "date_added": "13141895878657953", + "date_modified": "13152766862983940", + "id": "246", + "name": "不常用网址", + "type": "folder" + }, { + "children": [ { + "date_added": "13152177495017585", + "id": "462", + "meta_info": { + "last_visited_desktop": "13152177495018585" + }, + "name": "openstack学习指南 - 11315401 - 51CTO技术博客", + "type": "url", + "url": "http://11325401.blog.51cto.com/11315401/1764725" + }, { + "date_added": "13152185375779740", + "id": "466", + "meta_info": { + "last_visited_desktop": "13152185375779740" + }, + "name": "OpenStack Grizzly-g3 单节点安装在 Ubuntu12.04 - 朱靓的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/1407811?l=zh-cn" + }, { + "date_added": "13152185378681486", + "id": "467", + "meta_info": { + "last_visited_desktop": "13152185404957486" + }, + "name": "Openstack的G版本单节点安装总结 - 中软罗素部交流社区 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2692033/wiki_3863189.html" + }, { + "date_added": "13152185759192959", + "id": "468", + "meta_info": { + "last_visited_desktop": "13152608305609901" + }, + "name": "OpenStack从入门到放弃 - 青春永不言弃 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/pythonxiaohu/p/5861409.html" + }, { + "date_added": "13152185810624741", + "id": "469", + "meta_info": { + "last_visited_desktop": "13152608068895236" + }, + "name": "Openstack新建云主机的流程 - AWM - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/awmpy/p/6637869.html" + }, { + "date_added": "13152187498476527", + "id": "470", + "meta_info": { + "last_visited_desktop": "13152273702449646" + }, + "name": "python-RabbitMQ - 面对面 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/menkeyi/p/6971581.html" + }, { + "date_added": "13152612766715489", + "id": "475", + "meta_info": { + "last_visited_desktop": "13152612766715489" + }, + "name": "VMware 虚拟机的虚拟磁盘编程知识点扫盲之一 - JmilkFan_范桂飓 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/jmilkfan-fanguiju/p/7532224.html" + }, { + "date_added": "13152612775495489", + "id": "476", + "meta_info": { + "last_visited_desktop": "13152612775495489" + }, + "name": "Openstack Nova 源码分析 — RPC 远程调用过程 - JmilkFan_范桂飓 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/jmilkfan-fanguiju/p/7532329.html" + } ], + "date_added": "13152177524029469", + "date_modified": "13152612775495489", + "id": "463", + "name": "openstack", + "type": "folder" + }, { + "children": [ { + "date_added": "13153365822050417", + "id": "495", + "meta_info": { + "last_visited_desktop": "13155095654212072" + }, + "name": "升级VT总结 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4825493.html" + }, { + "date_added": "13153893797516379", + "id": "508", + "meta_info": { + "last_visited_desktop": "13165638739504231" + }, + "name": "从零开始学tempest - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4513427.html" + }, { + "date_added": "13152781865971185", + "id": "481", + "meta_info": { + "last_visited_desktop": "13165639536095252" + }, + "name": "fi-tempest-plugin用例补充、用例对接门禁介绍 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4577661.html" + }, { + "date_added": "13152780770575311", + "id": "480", + "meta_info": { + "last_visited_desktop": "13154084006295618" + }, + "name": "Python安全编码经验 - 赵明亮的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/5027037" + }, { + "date_added": "13152868159120829", + "id": "483", + "meta_info": { + "last_visited_desktop": "13152868693225165" + }, + "name": "Python工具之Graphviz和pyreverse - IaaS产品部 - 3MS知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/km/groups/1005027/blogs/details/5109835#preview_attachment_box_5109835" + }, { + "date_added": "13152869089961945", + "id": "484", + "meta_info": { + "last_visited_desktop": "13152869089961945" + }, + "name": "Python code 提取UML - lyh225 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/linyihai/p/7466235.html" + }, { + "date_added": "13152873190176023", + "id": "485", + "meta_info": { + "last_visited_desktop": "13152873190177023" + }, + "name": "群组加入/退出", + "type": "url", + "url": "http://iright.huawei.com/Pages/Group/GroupMemberFlowCreate.aspx?GroupId=20130227-1744-3063-528a-83e2502ff026" + }, { + "date_added": "13152873199142023", + "id": "486", + "meta_info": { + "last_visited_desktop": "13153225129482235" + }, + "name": "D-BOX 首页", + "type": "url", + "url": "http://plm-pia.huawei.com/Windchill/netmarkets/jsp/index.htm#tab:menu_index" + }, { + "date_added": "13152873206125023", + "id": "487", + "meta_info": { + "last_visited_desktop": "13153225130996235" + }, + "name": "D-Box产品文档库权限申请指导 - 无线配置管理综合频道 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2026711/thread_5318911.html" + }, { + "date_added": "13152949454911695", + "id": "490", + "meta_info": { + "last_visited_desktop": "13152949454911695" + }, + "name": "FSP环境安装(PXE) - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4230917.html" + }, { + "date_added": "13153202159529527", + "id": "491", + "meta_info": { + "last_visited_desktop": "13160643436983322" + }, + "name": "CodeTask", + "type": "url", + "url": "http://rnd-idea.huawei.com/task/" + }, { + "date_added": "13153202354576297", + "id": "492", + "meta_info": { + "last_visited_desktop": "13153202354577297" + }, + "name": "WeLink", + "type": "url", + "url": "http://office.huawei.com/_layouts/15/Huawei.RandD.DesktopPages/hw_index.aspx" + }, { + "date_added": "13153301235404942", + "id": "493", + "meta_info": { + "last_visited_desktop": "13160640906844866" + }, + "name": "GaussDB常用操作大全 - ROSA设备管理组Family - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1503887/wiki_3013033.html" + }, { + "date_added": "13153306864374151", + "id": "494", + "meta_info": { + "last_visited_desktop": "13154077203709318" + }, + "name": "Paramiko使用 - 铭威 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yangmv/p/5169924.html" + }, { + "date_added": "13153385235270814", + "id": "496", + "meta_info": { + "last_visited_desktop": "13153385235270814" + }, + "name": "postgreSql 常用操作总结 - jihite - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/kaituorensheng/p/4667160.html#_label0" + }, { + "date_added": "13153388466358200", + "id": "497", + "meta_info": { + "last_visited_desktop": "13153388466358200" + }, + "name": "linux yum命令详解 - chuncn - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/chuncn/archive/2010/10/17/1853915.html" + }, { + "date_added": "13153475306570800", + "id": "498", + "meta_info": { + "last_visited_desktop": "13155019670983117" + }, + "name": "自动化集成工具 - 薛文韬的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/5167917" + }, { + "date_added": "13153476125047010", + "id": "499", + "meta_info": { + "last_visited_desktop": "13155721913589381" + }, + "name": "升级有关资料整理 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4834261.html" + }, { + "date_added": "13153477538406382", + "id": "500", + "meta_info": { + "last_visited_desktop": "13155101535896423" + }, + "name": "auto_install · Search · CodeClub", + "type": "url", + "url": "http://code.huawei.com/search?utf8=%E2%9C%93&search=auto_install&group_id=&project_id=&search_code=&repository_ref=" + }, { + "date_added": "13153494692836210", + "id": "501", + "meta_info": { + "last_visited_desktop": "13153494692837210" + }, + "name": "Euler镜像制作-FusionStage2.0--20170420修订 - 崔少杰的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/2543159" + }, { + "date_added": "13153551274839942", + "id": "502", + "meta_info": { + "last_visited_desktop": "13153551274840942" + }, + "name": "进程池 - 少年乘风 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/niehaidong111/p/7445317.html" + }, { + "date_added": "13153571575281842", + "id": "503", + "meta_info": { + "last_visited_desktop": "13153908036800770" + }, + "name": "tortoisegit 常见错误disconnected no supported authentication methods available(server sent: publickey) - 哈姆PP - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/hamsterPP/p/5184491.html" + }, { + "date_added": "13153803341852389", + "id": "507", + "meta_info": { + "last_visited_desktop": "13153803341852874" + }, + "name": "pip安装与pycharm中pylint,flake8,autopep8集成 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4438667.html" + }, { + "date_added": "13153904063697855", + "id": "510", + "meta_info": { + "last_visited_desktop": "13153907692863625" + }, + "name": "pycharm快捷键、常用设置、配置管理 - 皮皮blog - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/pipisorry/article/details/39909057?locationNum=2&fps=1" + }, { + "date_added": "13153904254918148", + "id": "511", + "meta_info": { + "last_visited_desktop": "13153904254918822" + }, + "name": "我的Pycharm,我做主 - 陈俊岭的程序员之路 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/u013088062/article/details/50388329" + }, { + "date_added": "13153907526097822", + "id": "512", + "meta_info": { + "last_visited_desktop": "13153907560128214" + }, + "name": "python2和python3的区别、转换及共存 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/pipisorry/article/details/22107553" + }, { + "date_added": "13153907711241524", + "id": "513", + "meta_info": { + "last_visited_desktop": "13153907711242033" + }, + "name": "python异常处理和断言 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/pipisorry/article/details/47907589" + }, { + "date_added": "13153912235662031", + "id": "514", + "meta_info": { + "last_visited_desktop": "13153912235662521" + }, + "name": "pep8语法异常修复总结 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4291021.html#3" + }, { + "date_added": "13153980827051798", + "id": "517", + "meta_info": { + "last_visited_desktop": "13153980827052798" + }, + "name": "python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/xiemanR/article/details/71746561?locationNum=1&fps=1" + }, { + "date_added": "13153980980271163", + "id": "518", + "meta_info": { + "last_visited_desktop": "13153980980271163" + }, + "name": "阻塞与非阻塞,同步与异步 - RAMA - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/rama/p/4362593.html" + }, { + "date_added": "13154415446979010", + "id": "526", + "meta_info": { + "last_visited_desktop": "13165466506093254" + }, + "name": "CloudStage-CloudDragon", + "type": "url", + "url": "https://szxy1-cdt.huawei.com/stage/home/dashboard" + }, { + "date_added": "13154665530636039", + "id": "527", + "meta_info": { + "last_visited_desktop": "13154665530636039" + }, + "name": "python使用Fabric模块实现自动化运维 - 囍。 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/aslongas/p/5961144.html" + }, { + "date_added": "13154671138412047", + "id": "528", + "meta_info": { + "last_visited_desktop": "13154671168214047" + }, + "name": "《每天5分钟玩转 OpenStack》教程目录 - WeLink知识-内容社区 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2952325/thread_6017377.html?mapId=7539009" + }, { + "date_added": "13154778763996937", + "id": "529", + "meta_info": { + "last_visited_desktop": "13154779113230125" + }, + "name": "面试经典算法题集锦——《剑指 offer》小结 - .....? - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/fanling999/p/7810558.html" + }, { + "date_added": "13155032737066102", + "id": "533", + "meta_info": { + "last_visited_desktop": "13155032737067102" + }, + "name": "Index of /CloudOS/V100R006C10/master/euler/release/20171113145421/", + "type": "url", + "url": "http://10.186.55.179/CloudOS/V100R006C10/master/euler/release/20171113145421/" + }, { + "date_added": "13155211545288293", + "id": "536", + "meta_info": { + "last_visited_desktop": "13158831879798243" + }, + "name": "目录 - 徐亚平 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/xuyaping/p/7667055.html" + }, { + "date_added": "13155274816089715", + "id": "538", + "meta_info": { + "last_visited_desktop": "13155721829258562" + }, + "name": "问题定位排查矩阵 - OpenStack社区技术委员会 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2028039/wiki_4673433.html" + }, { + "date_added": "13155276103565141", + "id": "539", + "meta_info": { + "last_visited_desktop": "13165297638141647" + }, + "name": "基础服务问题定位统一入口 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4339631.html" + }, { + "date_added": "13155362174195416", + "id": "540", + "meta_info": { + "last_visited_desktop": "13155643432327370" + }, + "name": "CloudTest-CloudDragon", + "type": "url", + "url": "https://szxy1-cdt.huawei.com/cloudtest/cloudtest/servicedetails/559cf97954b5482686fee2537d72558e/oj7p7j5k2oj//design" + }, { + "date_added": "13154414666401994", + "id": "525", + "meta_info": { + "last_visited_desktop": "13165396894451148" + }, + "name": "升级问题组件接口人 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4632429.html" + }, { + "date_added": "13155032473763578", + "id": "532", + "meta_info": { + "last_visited_desktop": "13162459078879272" + }, + "name": "安装部署问题定位wiki指南 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4420501.html?for_statistic_from=creation_group_wiki" + }, { + "date_added": "13152867254258840", + "id": "482", + "meta_info": { + "last_visited_desktop": "13164445288603633" + }, + "name": "Project cloudos-tests/fi-tempest-plugin | cloudos-review.huawei Code Review", + "type": "url", + "url": "http://cloudos-review.huawei.com/#/admin/projects/cloudos-tests/fi-tempest-plugin" + } ], + "date_added": "13152766895130940", + "date_modified": "13161356095990996", + "id": "478", + "name": "NEW", + "type": "folder" + }, { + "date_added": "13154169076839573", + "id": "522", + "meta_info": { + "last_visited_desktop": "13165399656784379" + }, + "name": "tempest总结文档 - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_4503683.html#photo_container" + }, { + "children": [ { + "date_added": "13155816214202502", + "id": "546", + "meta_info": { + "last_visited_desktop": "13164687193917529" + }, + "name": "Web UI 自动化工具RIDE使用简介 - SPO平台测试能力中心 - 3MS知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/km/groups/2026317/blogs/details/2657795" + }, { + "date_added": "13156221086639884", + "id": "550", + "meta_info": { + "last_visited_desktop": "13166502896227342" + }, + "name": "基础服务团队例行运作管理.xlsx", + "type": "url", + "url": "http://office.huawei.com/sites/it-rdiaasspdu/fsp/_layouts/15/WopiFrame.aspx?sourcedoc=%7B0ef42a41-0fe6-4434-a66e-65427fd04208%7D&action=view" + }, { + "date_added": "13156243144951432", + "id": "551", + "meta_info": { + "last_visited_desktop": "13156326347145202" + }, + "name": "Robot Framework 安装使用手册 - BES Cloud Operation - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2869305/wiki_4737331.html" + }, { + "date_added": "13156256249766958", + "id": "552", + "meta_info": { + "last_visited_desktop": "13156326341145202" + }, + "name": "远程访问工具——paramiko安装 - 云操作系统集成与验证部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2036073/wiki_4180391.html" + }, { + "date_added": "13156414082155852", + "id": "553", + "meta_info": { + "last_visited_desktop": "13156414082156852" + }, + "name": "交换机端口类型介绍(Access、Trunk和Hybrid) - IaaS产品部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/1005027/wiki_3279549.html?for_statistic_from=all_group_wiki#photo_container" + }, { + "date_added": "13156416265678388", + "id": "554", + "meta_info": { + "last_visited_desktop": "13156416396865176" + }, + "name": "ATCA机框存在VLAN的定位过程总结和VLAN配置 - 云核心网解决方案集成与验证部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/5929/wiki_4432981.html" + }, { + "date_added": "13156516368860047", + "id": "555", + "meta_info": { + "last_visited_desktop": "13156565836266418" + }, + "name": "WIKI - 环境服务化 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/3270285/wikis.html" + }, { + "date_added": "13156516372262047", + "id": "556", + "meta_info": { + "last_visited_desktop": "13161840642975804" + }, + "name": "DeployFormation-CloudDragon", + "type": "url", + "url": "https://szxy1-cdt.huawei.com/formation/manager/resource" + }, { + "date_added": "13156564432825537", + "id": "559", + "meta_info": { + "last_visited_desktop": "13161768940854058" + }, + "name": "tempest插件用例编写指导 - 李祖海的博客", + "type": "url", + "url": "http://3ms.huawei.com/km/blogs/details/2406049" + }, { + "date_added": "13156568424216599", + "id": "562", + "meta_info": { + "last_visited_desktop": "13165640769595088" + }, + "name": "CloudStage-CloudDragon", + "type": "url", + "url": "https://szxy1-cdt.huawei.com/stage/home/projectMonitoring" + }, { + "date_added": "13156916323664417", + "id": "563", + "meta_info": { + "last_visited_desktop": "13156933711336100" + }, + "name": "软件研发云2.0 alpha 环境嵌套虚拟化PacketiX VPN 配置方法 - 环境服务化 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/3270285/wiki_4938511.html?for_statistic_from=all_group_wiki" + }, { + "date_added": "13157198776271733", + "id": "566", + "meta_info": { + "last_visited_desktop": "13157198776272431" + }, + "name": "Wireshark命令行工具tshark详解(含例子)-01 - seeker的博客 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/liun1994/p/6142505.html" + }, { + "date_added": "13157198779036111", + "id": "567", + "meta_info": { + "last_visited_desktop": "13157198779036580" + }, + "name": "Linux抓包工具tcpdump详解 - wangkangluo1 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wangkangluo1/archive/2012/05/08/2490560.html" + }, { + "date_added": "13158234275865192", + "id": "570", + "meta_info": { + "last_visited_desktop": "13158234275865192" + }, + "name": "【FusionSphere OpenStack】cinder问题快速定位宝典 - 云计算维护部 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2029719/wiki_4675829.html" + }, { + "date_added": "13158403933854252", + "id": "573", + "meta_info": { + "last_visited_desktop": "13158403933854252" + }, + "name": "Index of /CloudOS/V100R006C10/master/euler/release/", + "type": "url", + "url": "http://10.186.55.179/CloudOS/V100R006C10/master/euler/release/" + }, { + "date_added": "13158918498638420", + "id": "576", + "meta_info": { + "last_visited_desktop": "13158918498639420" + }, + "name": "漫谈TCP - 轩脉刃 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yjf512/p/5909031.html" + }, { + "date_added": "13160654553933216", + "id": "579", + "meta_info": { + "last_visited_desktop": "13160654578496676" + }, + "name": "详解Paste deploy - 王智愚 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Security-Darren/p/4087587.html" + }, { + "date_added": "13160654576433676", + "id": "580", + "meta_info": { + "last_visited_desktop": "13160654576433676" + }, + "name": "eventlet - 标签 - 王智愚 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/Security-Darren/tag/eventlet/" + }, { + "date_added": "13161233601655862", + "id": "581", + "meta_info": { + "last_visited_desktop": "13161233601655862" + }, + "name": "Redis常用命令速查 \u003C第二篇> - 逆心 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/kissdodog/p/3599047.html" + }, { + "date_added": "13161255353479773", + "id": "582", + "meta_info": { + "last_visited_desktop": "13164102144139840" + }, + "name": "OpenStack集成开发部新员工培养能力_知识地图V1.0.xlsx", + "type": "url", + "url": "http://office.huawei.com/sites/it-cospdu/fresh/_layouts/15/WopiFrame2.aspx?sourcedoc={CD7F2BAB-5C08-4D73-9068-5A2259190B85}&file=OpenStack%E9%9B%86%E6%88%90%E5%BC%80%E5%8F%91%E9%83%A8%E6%96%B0%E5%91%98%E5%B7%A5%E5%9F%B9%E5%85%BB%E8%83%BD%E5%8A%9B_%E7%9F%A5%E8%AF%86%E5%9C%B0%E5%9B%BEV1.0.xlsx&action=default" + }, { + "date_added": "13155272083150879", + "id": "537", + "meta_info": { + "last_visited_desktop": "13165297525132159" + }, + "name": "HWS研发类生产沟通矩阵 - 研发类生产运维管理团队 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/2033031/wiki_4116981.html" + }, { + "date_added": "13161840339782398", + "id": "588", + "meta_info": { + "last_visited_desktop": "13161840339782398" + }, + "name": "研发云2.0 alpha 环境嵌套虚拟化Softether VPN 配置方法 - 环境服务化 - 3ms知识管理社区", + "type": "url", + "url": "http://3ms.huawei.com/hi/group/3270285/wiki_4971065.html?for_statistic_from=all_group_wiki" + } ], + "date_added": "13155816238912502", + "date_modified": "13162034829640046", + "id": "547", + "name": "TEST", + "type": "folder" + }, { + "date_added": "13152766912166940", + "id": "479", + "meta_info": { + "last_visited_desktop": "13165923478982551" + }, + "name": "Projects | cloudos-review.huawei Code Review", + "type": "url", + "url": "http://cloudos-review.huawei.com/#/admin/projects/" + }, { + "date_added": "13153572361089884", + "id": "504", + "meta_info": { + "last_visited_desktop": "13164444790254824" + }, + "name": "Zuul Status", + "type": "url", + "url": "http://sz-ci-zuul.host.huawei.com/" + }, { + "children": [ { + "date_added": "13162034829640046", + "id": "589", + "meta_info": { + "last_visited_desktop": "13162034829641046" + }, + "name": "算法复杂度分析 - 匠心十年 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html" + }, { + "date_added": "13162034855151656", + "id": "591", + "meta_info": { + "last_visited_desktop": "13164431144759989" + }, + "name": "算法时间复杂度分析基础 - T2噬菌体 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/leoo2sk/archive/2008/11/14/1332381.html" + }, { + "date_added": "13162034858378656", + "id": "592", + "meta_info": { + "last_visited_desktop": "13162034858379656" + }, + "name": "《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度 - 伍迷 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/cj723/archive/2011/03/05/1971640.html" + }, { + "date_added": "13162303897629656", + "id": "595", + "meta_info": { + "last_visited_desktop": "13162303897629656" + }, + "name": "我的2017——求职篇(归宿) - codingHeart - 博客园", + "type": "url", + "url": "https://www.cnblogs.com/codingHeart/p/8410017.html" + }, { + "date_added": "13162369505578899", + "id": "596", + "meta_info": { + "last_visited_desktop": "13162369505578899" + }, + "name": "Python中的eval()、exec()及其相关函数 - 云游道士 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yyds/p/6276746.html" + }, { + "date_added": "13162376364417131", + "id": "597", + "meta_info": { + "last_visited_desktop": "13162378841350165" + }, + "name": "网络数据传输安全及SSH与HTTPS工作原理 - 云游道士 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yyds/p/6992125.html" + }, { + "date_added": "13163840244369532", + "id": "600", + "meta_info": { + "last_visited_desktop": "13163840244369532" + }, + "name": "Python标准模块--linecache - 老顽童2007 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/zhbzz2007/p/5957644.html" + }, { + "date_added": "13163840254595532", + "id": "601", + "meta_info": { + "last_visited_desktop": "13164963602577926" + }, + "name": "python watchdog:监控文件系统事件的Python库 - chenglinhust的专栏 - CSDN博客", + "type": "url", + "url": "http://blog.csdn.net/chdhust/article/details/50514391" + }, { + "date_added": "13163840267334532", + "id": "602", + "meta_info": { + "last_visited_desktop": "13166264960768891" + }, + "name": "python watchdog - Let it be! - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wangshide/p/4594049.html" + }, { + "date_added": "13163840282600532", + "id": "603", + "meta_info": { + "last_visited_desktop": "13164963564210926" + }, + "name": "watchdog应用实例 - 高清鬼猫猫 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/muyr/p/3723507.html" + }, { + "date_added": "13163933486622999", + "id": "604", + "meta_info": { + "last_visited_desktop": "13163933486622999" + }, + "name": "Python日期时间函数 - emanlee - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/emanlee/p/4399147.html" + }, { + "date_added": "13163933498498999", + "id": "605", + "meta_info": { + "last_visited_desktop": "13163933498498999" + }, + "name": "Python时区设置与pytz的应用 - JustRun - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/JustRun1983/archive/2013/01/06/2847420.html" + }, { + "date_added": "13163933506571999", + "id": "606", + "meta_info": { + "last_visited_desktop": "13163933506572999" + }, + "name": "python时区设置——pytz模块 - Iwillbback - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/makeabug/articles/3426876.html" + }, { + "date_added": "13163933509655999", + "id": "607", + "meta_info": { + "last_visited_desktop": "13163933509656999" + }, + "name": "python中通过datetime获取UTC时间ISO格式 - 及时 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/AcAc-t/p/datetime_utc_iso.html" + }, { + "date_added": "13163933534355059", + "id": "608", + "meta_info": { + "last_visited_desktop": "13163933534356059" + }, + "name": "python 正则,常用正则表达式大全 - 小秒 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/cp-miao/p/5567115.html" + }, { + "date_added": "13163933538426059", + "id": "609", + "meta_info": { + "last_visited_desktop": "13163933538426059" + }, + "name": "python3 re模块 - z寒江雪 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wenwei-blog/p/7216102.html" + }, { + "date_added": "13163943347443828", + "id": "610", + "meta_info": { + "last_visited_desktop": "13163943347444828" + }, + "name": "python单例模式 - renpingsheng - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/renpingsheng/p/7922865.html" + }, { + "date_added": "13164080836581708", + "id": "611", + "meta_info": { + "last_visited_desktop": "13164275259509249" + }, + "name": "xshell-jumpserver · Wiki · IAAS-Beta / ops · CodeClub", + "type": "url", + "url": "http://code.huawei.com/IAAS-Beta/ops/wikis/xshell-jumpserver" + }, { + "date_added": "13164080839296708", + "id": "612", + "meta_info": { + "last_visited_desktop": "13164275243422729" + }, + "name": "home · Wiki · IAAS-Beta / ops · CodeClub", + "type": "url", + "url": "http://code.huawei.com/IAAS-Beta/ops/wikis/home" + }, { + "date_added": "13164080842074708", + "id": "613", + "meta_info": { + "last_visited_desktop": "13164275267319249" + }, + "name": "how-to-login-console · Wiki · IAAS-Beta / ops · CodeClub", + "type": "url", + "url": "http://code.huawei.com/IAAS-Beta/ops/wikis/how-to-login-console" + }, { + "date_added": "13164080851777708", + "id": "614", + "meta_info": { + "last_visited_desktop": "13164275122674490" + }, + "name": "jumpserver · Wiki · IAAS-Beta / ops · CodeClub", + "type": "url", + "url": "http://code.huawei.com/IAAS-Beta/ops/wikis/jumpserver" + }, { + "date_added": "13164104338742710", + "id": "615", + "meta_info": { + "last_visited_desktop": "13164104338742710" + }, + "name": "logstash 统计告警 - 大胡子码农 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/stackflow/p/6071807.html" + }, { + "date_added": "13164685570833707", + "id": "618", + "meta_info": { + "last_visited_desktop": "13164685570833707" + }, + "name": "Markdown语法你都会了吗? - Jetictors - 博客园", + "type": "url", + "url": "https://www.cnblogs.com/Jetictors/p/8506757.html" + }, { + "date_added": "13164685976922246", + "id": "619", + "meta_info": { + "last_visited_desktop": "13164685976923246" + }, + "name": "MySQL架构篇(一) - demon_gdy - 博客园", + "type": "url", + "url": "https://www.cnblogs.com/demon89/p/8503814.html" + }, { + "date_added": "13164861511699485", + "id": "620", + "meta_info": { + "last_visited_desktop": "13164960955586050" + }, + "name": "python 的日志logging模块学习 - dkcndk - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html" + }, { + "date_added": "13164861586551188", + "id": "621", + "meta_info": { + "last_visited_desktop": "13164861586551188" + }, + "name": "Python之队列queue模块使用 常见问题与用法 - 明天OoO你好 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/wt11/p/5952500.html" + }, { + "date_added": "13165324251184092", + "id": "624", + "meta_info": { + "last_visited_desktop": "13165324251187092" + }, + "name": "15.python笔记之psutil模块 - 刘耀 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/liu-yao/p/5678157.html" + }, { + "date_added": "13165589327325853", + "id": "626", + "meta_info": { + "last_visited_desktop": "13165589496031237" + }, + "name": "MySQL 索引管理与执行计划 - 惨绿少年 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/clsn/p/8087501.html" + }, { + "date_added": "13165589695455514", + "id": "627", + "meta_info": { + "last_visited_desktop": "13166076196550177" + }, + "name": "Shell编程 - 随笔分类 - 惨绿少年 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/clsn/category/1127035.html" + }, { + "date_added": "13165653652936640", + "id": "628", + "meta_info": { + "last_visited_desktop": "13165653652936640" + }, + "name": "Linux Shell脚本编程--nc命令使用详解 - 风言枫语 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/keanuyaoo/p/3281257.html" + }, { + "date_added": "13166086228621616", + "id": "629", + "meta_info": { + "last_visited_desktop": "13166086228621616" + }, + "name": "【转】海量数据处理问题 - sivkun - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/sivkun/p/7421904.html" + }, { + "date_added": "13166095616688479", + "id": "630", + "meta_info": { + "last_visited_desktop": "13166095962954834" + }, + "name": "MySQL中的锁(表锁、行锁) - 雪山飞猪 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/chenqionghe/p/4845693.html" + }, { + "date_added": "13166171330699496", + "id": "631", + "meta_info": { + "last_visited_desktop": "13166171330700496" + }, + "name": "linux负载均衡总结性说明(四层负载/七层负载) - 散尽浮华 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/kevingrace/p/6137881.html" + }, { + "date_added": "13166173567250203", + "id": "632", + "meta_info": { + "last_visited_desktop": "13166173567251203" + }, + "name": "Bloom Filter算法 - 横刀天笑 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/yuyijq/archive/2012/02/08/2343374.html" + }, { + "date_added": "13166179451417812", + "id": "633", + "meta_info": { + "last_visited_desktop": "13166179520717891" + }, + "name": "Lucene倒排索引原理 - balaamwe - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/balaamwe/archive/2012/09/27/2705767.html" + }, { + "date_added": "13166180296090554", + "id": "634", + "meta_info": { + "last_visited_desktop": "13166180296090554" + }, + "name": "java十年技术栈[总结复习用] - 码农恋码 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/thingk/p/6813045.html" + }, { + "date_added": "13166264901244264", + "id": "637", + "meta_info": { + "last_visited_desktop": "13166264901244264" + }, + "name": "python 协程库gevent学习--gevent数据结构及实战(四) - piperck - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/piperck/p/5730814.html" + }, { + "date_added": "13166264909227264", + "id": "638", + "meta_info": { + "last_visited_desktop": "13166268969305812" + }, + "name": "python 协程库gevent学习--gevent数据结构及实战(三) - piperck - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/piperck/p/5719733.html" + }, { + "date_added": "13166267291803262", + "id": "639", + "meta_info": { + "last_visited_desktop": "13166267291804262" + }, + "name": "gevent程序员指南 - 小石 - 博客园", + "type": "url", + "url": "http://www.cnblogs.com/dhcn/p/7106424.html" + } ], + "date_added": "13162034849956046", + "date_modified": "13166267291803262", + "id": "590", + "name": "算法", + "type": "folder" + }, { + "date_added": "13164966989712531", + "id": "622", + "meta_info": { + "last_visited_desktop": "13166181705098636" + }, + "name": "liuguojin WX307086 / log_agent_cts · CodeClub", + "type": "url", + "url": "http://code.huawei.com/lWX307086/log_agent_cts" + } ], + "date_added": "13086095051711324", + "date_modified": "13165324251184092", + "id": "1", + "name": "书签栏", + "type": "folder" + }, + "other": { + "children": [ ], + "date_added": "13086095051711324", + "date_modified": "0", + "id": "2", + "name": "其他书签", + "type": "folder" + }, + "synced": { + "children": [ ], + "date_added": "13086095051711324", + "date_modified": "0", + "id": "3", + "name": "移动设备书签", + "type": "folder" + } + }, + "version": 1 +} diff --git "a/\346\200\273\347\273\223/Mysql\345\237\272\347\241\200\346\223\215\344\275\234.sql" "b/\346\200\273\347\273\223/Mysql\345\237\272\347\241\200\346\223\215\344\275\234.sql" new file mode 100644 index 0000000..a7d41e5 --- /dev/null +++ "b/\346\200\273\347\273\223/Mysql\345\237\272\347\241\200\346\223\215\344\275\234.sql" @@ -0,0 +1,621 @@ +mysql基础操作 + +1、数据库操作 +  进入命令行: mysql -uroot -p123456 +  查看数据库: show databases; +  查看数据库创建语句: show create database test; +  创建数据库: create database test charset utf8mb4; +  选择数据库: use test; +  删除数据库: drop database test; +  备份指定数据库: mysqldump -uroot -p test >test.sql 注: 由于mysql5.6版本不支持在命令行界面输入密码,所以暂不输入密码,回车后输入密码即可。 +  备份所有数据库: mysqldump -uroot -p -a >test.sql +  恢复指定数据库: mysql -uroot -p test +         select * from user where name like '张%'; #查询姓张的用户 +         select * from user where name like '张_';   #查询姓张并且姓名为2个字的用户 +         select * from user where name in ('张三','李四','王五');  #查询姓名为张三、李四、王五的信息 +          select * from user where phone between 13700000000 and 13712345678;  #查询手机号在13700000000和13712345678之间的用户 +          select * from user order by create_time desc;  #查询按照用户创建时间倒序显示,默认升序asc +         select * from user where addr='' or addr is null;  #查询地址为空或为null的用户 +         select distinct name from user;  #不显示重复的姓名 +         select count(*) from user where sex='女';  #统计女生有多少人 +         select max(age),min(age),avg(age),sum(age) from user where sex='男';  #查找男生年龄最大、最小、平均、总和 +         select *,count(sex) from user group by sex having sex='女';  #按照性别分组,并显示女生有多少人 +    多表查询: +        select * from user u,user_group g where u.id=g.id    #查询两张表共有的数据 +        select * from user u inner join user_group g on u.id=g.id;  #查询两张表共有的数据 +        select * from user u left join user_group g on u.id=g.id;  #左边所有的数据都查出来,右边如果有匹配的则查出来 +        select * from user u right join user_group g on u.id=g.id;  #右边所有的数据都查出来,左边如果有匹配的则查出来 +        select * from user u left join user_group g on u.id=g.id +        union +        select * from user u right join user_group g on u.id=g.id;  #左边和右边匹配的数据全部查出来并去重(union all不会去重),相当于oracle的全连接 +        select * from (select id,name,sex from user where sex='女') user;  #把查询结果作为一张表查询 +        select * from user where id in(select id from user_group where g_name='计算机');  #子查询,查询学计算机的用户信息 + +4、用户管理 +  添加用户: +    insert into user (user,host,password) values('xiaoxitest','%',password('123456')); #添加xiaoxitest用户并允许远程计算机登录,密码为: 123456 +  更改用户: +    update user set password=password("654321") where user='xiaoxitest'; #更改用户密码 +    update user set user='xiaoxi' where user='xiaoxitest';  #更改用户名xiaoxitest为xiaoxi +  删除用户: +    delete from user where user='xiaoxi';  #删除xiaoxi用户 + +5、权限管理 + 查看用户权限: show grants for 'username'@'localhost'; +  用户授权: +  授权格式: + grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码" with grant option; +    grant all on *.* to 'xiaoxi'@'%' identified by '123456' with grant option; #表示为xiaoxi用户添加所有数据库所有权限,并可以给其他人授权。 +    grant all on test.* to 'xiaoxi'@'%' identified by '123456' ;  #表示为xiaoxi用户添加test数据库所有权限 +    grant select on *.* to 'xiaoxi'@'%' identified by '123456' ;  #表示为xiaoxi用户添加所有数据库查询权限 +    grant replication slave, reload, super on *.* to 'toto1'@'%' identified by 'toto123'; +  取消授权: +    revoke select on *.* from 'xiaoxi'@'%';  #表示为xiaoxi用户取消所有数据库查询权限 +    revoke all on *.* from 'xiaoxi'@'%';  #表示为xiaoxi用户取消所有数据库所有权限 +  刷新权限: +    flush privileges; + + + + +#mysql --增删改查 + +{ + +#修改表名 + +#创建用户表 +create table if not exists user7( +id smallint unsigned key auto_increment, +username varchar(50) not null unique, +password char(20) not null, +email varchar(20) not null default '592681026@qq.com', +age tinyint unsigned default 18, +sex enum('男','女','保密') not null default '男', +addr varchar(50) not null default '上海', +salary float(6,2),#这个是浮点型 6位数,保留两位小数 +regtime int unsigned, +face char(100) not null default 'default.jpg' +); + +insert user6(id,username,password,regtime) values(1,'付志强','dazhi',1994); + + +#重命名表名: user7变为user8 +alter table user7 rename to user8; +alter table user8 rename as user7;#to 和 as 都可以省略 +alter table user8 rename user7; + +rename table 原表名 to 新表名;#这个to不能省略 + +添加和删除字段 + +#添加字段,删除字段 +#添加: alter table tbl_name add 字段名称 字段类型[完整性约束条件][first|after 字段名称](加在首部或者某个字段之后) 和写字段差不多 最后可以字段的位置 +#添加card字段 char(18) +alter table user7 add card char(18); +alter table user7 add test1 varchar(100) not null unique; +alter table user7 add test2 varchar(100) not null unique first; + + +#一次添加多个字段 选中一个表,完成多个操作 +alter table user7 + +add test5 varchar(100) not null unique after sex, +add test6 set('a','b','c'); + + +#删除指定字段 alter table tab_name drop 字段名称 + alter table user7 drop test6; + + #一次性的删除test1,test2,test3,test4,test5 + alter table user7 + drop test1, + drop test2, + drop test3, + drop test4; + + #添加test字段 删除addr字段 + alter table user7 + + add test int unsigned not null default 10 after sex, + drop addr; + +修改字段 + +#修改字段 alter table tab_name modify 字段名称 字段类型[完整性约束条件][first|after 字段名称] + #modify 修改字段类型 将email 修改位varchar(200) + alter table user7 modify email varchar(200);#这个修改的时候最好是带上全部的完整性约束条件 + alter table user7 modify email varchar(50) not null default '592681026@qq.com';#带上完整的约束性 + + #将card字段移动到test字段之后 + alter table user7 modify card char(18) after test;#这里要带上card的完整的约束性条件 + + #将test字段修改位char(32) not null default '123' 移动到第一个位置 + alter table user7 modify test char(32) not null default '1234' first; + + #修改字段的名称(也能完成modify的功能) alter table tab_name 原字段名称 新字段名称 字段类型 + #将test字段改为test1 + alter table user7 change test test1 char(32) not null ; + +添加删除默认值 +#添加删除默认值 + alter table 表名 alter 字段名称 set default 默认值 + alter table 表名 alter 字段名称 drop default +添加删除主键 + +#添加和删除主键 + alter table 表名 add [constraint] primary key (字段名称,...)#...表示括号里面可以是多个字段,那就是复合主键了,如果是一个,那就是单一主键了 + alter table 表名 drop primary key + +create table test12( + id int + ); +alter table test12 add primary key (id); + +create table test13( + id int, + card varchar(50) not null +); +alter table test13 add primary key (id,card); + +alter table test13 drop primary key;#删除 +alter table test12 drop primary key;#删除 + +#注意: 这里如果建表的时候自增长和主键同时存在的时候,你不能直接删除主键,而是应该先是删除aotu_increment,然后再删除主键 +alter table 表名 modify id unsigned not null;#这样自增长就没有了 + +添加删除唯一 + +#添加测试索引 +alter table 表名 add unique(username); +alter table 表名 add constraint symbol unique uni_id(username);#这里的uni_id 是一个索引的名称,如果不写这个系统会让字段名称变成默认的索引名称 +alter table 表名 add constraint symbol unique aa(card,username);#复合索引唯一 + +#删除索引唯一 +alter table 表名 drop {index|key} 唯一名称; + +# 删除外键 +alter table project_line drop foreign key project_line_ibfk_1; + + +#修改表的引擎 +alter table 表名 engine=myisam; + +#修改自增长值 +alter table 表名 auto_increment=100; + +删除数据表 + +#删除数据表 +drop table [if exists]表名;#可以一次删除多个 也可以删除一个 类似于添加。 +当然手动删除也是可以的。必须先关闭mysql,在关闭mysql服务,最后在文件中手动删除数据表, + +#当我们进入mysql想登录的同时直接打开某个数据库的时候: +mysql -uroot -p -d 数据库名称。 + +更新删除 应用order by 和limit +   + +#更新用户名为4位的用户,让其已有的年龄-3 +update cms_user set age=age-3 where username like '____'; + +#更新前三条记录 ,让已有年龄+10 +update cms_user set age=age+10 limit 3; +update cms_user set age=age+10 limit 0,3; + +#按照id降序排列 更新前三条 +update cms_user set age=age+10 order by id desc limit 3; + +#删除用户性别为男的用户,按照年龄降序排序,删除前一条记录 +delete from cms_user where sex='男' order by age desc limit 1; +} + + +select +line_no, +line_name, +start_org_code, +start_org_name, +end_org_code, +end_org_name, +fre_status, +ifnull(full_take_time,0), +ifnull(full_distance,0.000), +line_property, +trans_type, +if(line_status!=3,'启用','禁用') as status, +line_frequency_name, +line_frequency_no, +start_time, +end_time, +day_span, +ifnull(transfer_center_set,"") +from line +where line_no like 'mot%' and line_status in(1,2,4) and exists(select 1 from t_mot_line where t_mot_line.line_no=line.line_no) order by line_no,line_frequency_no,fre_status desc into outfile 'd:/both_camel_line.txt'; + +select distinct(delete_flag) from user; # 去重 + + +SELECT fk_truck_plate,real_vehicle_type FROM carrier_truck_commit where update_time="2020-08-06 00:00:00" INTO OUTFILE '/home/lgj/carrier_truck_commit.txt'; + +# mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; + +# 导出整个数据库结构和数据 +mysqldump -h localhost -uroot -p123456 database > dump.sql + +# 导出单个数据表结构和数据 +mysqldump -h localhost -uroot -p123456 database table > dump.sql + +# 导出整个数据库结构(不包含数据) +mysqldump -h localhost -uroot -p123456 -d database > dump.sql + +# 导出单个数据表结构(不包含数据) +mysqldump -h localhost -uroot -p123456 -d database table > dump.sql + + + +mysqldump -h localhost -uroot -proot camel conformation > conformation.sql + +mysql -h localhost -uroot -proot camel < conformation.sql + +mysql -uroot -p123456 < runoob.sql +mysql> source /home/abc/abc.sql # 导入备份数据库 + + +alter table 表名 add 索引类型 (index,unique,primary key,fulltext)[索引名](字段名) +alter table camel_truck add index index_org_id(org_id); # 增加普通索引 + + +# create只能添加这两种索引; +create index index_name on table_name (column_list) +create unique index index_name on table_name (column_list) + +select `sname` from `stu` where `age`+10=30;-- 不会使用索引,因为所有索引列参与了计算 + +select `sname` from `stu` where left(`date`,4) <1990; -- 不会使用索引,因为使用了函数运算,原理与上面相同 + +select * from `houdunwang` where `uname` like'后盾%' -- 走索引 + +select * from `houdunwang` where `uname` like "%后盾%" -- 不走索引 + +#正则表达式不使用索引,这应该很好理解,所以为什么在sql中很难看到regexp关键字的原因 + +#字符串与数字比较不使用索引; +create table `a` (`a` char(10)); +explain select * from `a` where `a`="1" -- 走索引 +explain select * from `a` where `a`=1 -- 不走索引 + +select * from dept where dname='xxx' or loc='xx' or deptno=45 #如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字 + +#如果mysql估计使用全表扫描要比使用索引快,则不使用索引 + + +# typeerror: expected string or unicode object, long found 一般都是数据库返回的数据格式和model不服 + + +mysql 根据一个表数据更新另外一个表: +方法1: + update 更新表 set 字段 = (select 参考数据 from 参考表 where 参考表.id = 更新表.id); + update table_2 m set m.column = (select column from table_1 mp where mp.id= m.id); +方法2: + update table_1 t1,table_2 t2 set t1.column = t2.column where t1.id = t2.pid; + +在开发过程中,使用到了mysql数据库,但是想知道每次对数据库进行了哪些操作,方便对自己的代码进行优化,这时候就需要用到查询日志genral_log。 + + +# 动态修改配置 +mysql > show variables like "%general_log%"; ++------------------+------------------------------+ +| variable_name | value | ++------------------+------------------------------+ +| general_log | on | +| general_log_file | /tmp/mariadb_general_log.log | ++------------------+------------------------------+ +可以看到设置到两个变量,一个是开关,一个是general_log的文件保存路径。 +# 开启文件记录 +mysql > set global general_log_file='/tmp/mariadb_general_log.log'; +mysql > set global general_log=on; +配置文件里面修改 +在mysqld的节点加上以下配置 +general_log_file=/tmp/mariadb_general_log.log +general_log=on +# 将日志记录到表 +如果不方便查看文件,也可以将日志直接存放到表里面(适合mysql数据库在远程) +mysql > set global log_output='table'; +mysql > set global general_log=on; +# 总结 +这个使用本地的开发环境,生产上勿用。 + + +select distinct(delete_flag) from user; # 去重 +select id,org_id,code from transport_location group by id order by org_id; +select distinct code from transport_location; +select count(distinct code) from transport_location; + +一般而言,distinct子句是group by子句的特殊情况,group by子句可对结果集分组并进行排序,而distinct去重并不进行排序 +效果差不多,distinct还可以使用聚合函数:sum,avg和count + +-- 比较两个表 +select id, title +from + ( + select t1.id, t1.title + from t1 + union all + select t2.id, t2.title + from t2 +) t +group by id, title +having count(*) = 1 +order by id; + + +-- 要使用first_name,last_name和email列中的重复值在contacts表中查找行,请使用以下查询: +select + first_name, count(first_name), + last_name, count(last_name), + email, count(email) +from + contacts +group by + first_name , + last_name , + email +having count(first_name) > 1 + and count(last_name) > 1 + and count(email) > 1; + + +-- 在基于一列的表中找到重复值,则使用以下语句: +select + col, + count(col) +from + table_name +group by col +having count(col) > 1; + + +-- 要将数据从表复制到新表,请使用create table和select语句,如下所示: +create table if not exists t3 select id, note from t2; + +create table offices_dup like offices; +insert office_dup select * from offices; + +-- 将表复制到其他数据库 +create table destination_db.new_table like source_db.existing_table; +insert destination_db.new_table select * from source_db.existing_table; + +-- 比like厉害的正则匹配 +^ 匹配搜索字符串开头处的位置 +$ 匹配搜索字符串末尾的位置 +. 匹配任何单个字符 +[…] 匹配方括号内的任何字符 +[^…] 匹配方括号内未指定的任何字符 + 匹配p1或p2模式 +* 匹配前面的字符零次或多次 ++ 匹配前一个字符一次或多次 +{n} 匹配前几个字符的n个实例 +{m,n} 从m到n个前一个字符的实例匹配 + +select * from t3 where note regexp '^n'; + + +-- row_number - 为每行添加行号要模拟row_number函数,必须在查询中使用会话变量。 +set @row_number = 0; +select + (@row_number:=@row_number + 1) as num, firstname, lastname +from + employees +limit 5; + + +-- 使用order by rand()选择随机记录 +select * from t3 order by rand() limit 1; + + +-- mysql使用truncate table语句重置自动增量值truncate table语句删除表的所有数据,并将auto_increment值重置为0。 +truncate table table_name; + +-- 删除删除表并重新创建它,因此,自动增量的值将重置为0。 +drop table table_name; +create table table_name(...); + + +-- 今天的日期 +mysql> select date(now()); ++-------------+ +| date(now()) | ++-------------+ +| 2019-01-10 | ++-------------+ +mysql> select curdate(); ++------------+ +| curdate() | ++------------+ +| 2019-01-10 | ++------------+ +-- 明天 +select date_add('2017-12-31 00:00:01',interval 1 day) result; + +mysql> select curdate() + interval 1 day tomorrow; ++------------+ +| tomorrow | ++------------+ +| 2019-01-11 | ++------------+ +mysql> select curdate() - interval 1 day yesterday; ++------------+ +| yesterday | ++------------+ +| 2019-01-09 | ++------------+ + +-- 字符串中的子字符串sql的位置,不区分大小写 +select instr('mysql instr', 'sql'); + +-- 字符串拼接 +mysql> select 'mysql ' 'string ' 'concatenation'; ++----------------------------+ +| mysql | ++----------------------------+ +| mysql string concatenation | ++----------------------------+ +mysql> select concat('mysql','concat','concatenation'); ++------------------------------------------+ +| concat('mysql','concat','concatenation') | ++------------------------------------------+ +| mysqlconcatconcatenation | ++------------------------------------------+ +--使用分隔符连接字符串 +mysql> select concat_ws('aaaa','max','su'); ++------------------------------+ +| concat_ws('aaaa','max','su') | ++------------------------------+ +| maxaaaasu | ++------------------------------+ +-- 返回具有指定长度的字符串的左边部分 +select left('mysql left', 5); + +-- 字符串替换 +update tbl_name +set + field_name = replace(field_name, + string_to_find, + string_to_replace) +where + conditions; + + + +select + [all | distinct | distinctrow ] + [high_priority] + [straight_join] + [sql_small_result] [sql_big_result] [sql_buffer_result] + [sql_cache | sql_no_cache] [sql_calc_found_rows] + select_expr [, select_expr ...] + [from table_references + [partition partition_list] + [where where_condition] + [group by {col_name | expr | position} + [asc | desc], ... [with rollup]] + [having where_condition] + [order by {col_name | expr | position} + [asc | desc], ...] + [limit {[offset,] row_count | row_count offset offset}] + [procedure procedure_name(argument_list)] + [into outfile 'file_name' + [character set charset_name] + export_options + | into dumpfile 'file_name' + | into var_name [, var_name]] + [for update | lock in share mode]] + + + +修改数据库字符集为 utf8 +alter database `awesome_app` default character set utf8 +修改表字符集为 utf8 +alter table `users` convert to character set utf8 +修改表字段字符集为 utf8 +alter table `users` modify `name` char(10) character set utf8 +修改字段类型 +alter table `users` modify `regtime` datetime not null +修改字段注释 +alter table `users` modify `id` int not null auto_increment comment '用户id'; +alter table `users` modify `name` char(10) comment '用户名'; +alter table `users` modify `avatar` varchar(300) comment '用户头像'; +alter table `users` modify `regtime` datetime not null default current_timestamp comment '注册时间'; +删除表 +drop table if exists `users` +清空表中所有数据 +这个操作相当于先 drop table 再 create table ,因此需要有 drop 权限。 +truncate table `users`; + + +show proceslist +show full processlist +kill id + + + +DROP TABLE IF EXISTS `dispatcher_transport_rule`; +CREATE TABLE `dispatcher_transport_rule` ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`start_name` varchar(30) DEFAULT NULL, +`start_code` varchar(10) DEFAULT NULL, +`end_name` varchar(30) DEFAULT NULL, +`end_code` varchar(10) DEFAULT NULL, +`status` tinyint(4) DEFAULT 1 COMMENT '状态 1.正常 2.已注销', +`settlement_mode` varchar(10) DEFAULT NULL COMMENT '结算方式 ZC.整车 JZ.计重', +`run_mode` tinyint(4) DEFAULT NULL COMMENT '运行方式 0.单边 1.双边', +`start_time` datetime NULL DEFAULT NULL, +`end_time` datetime NULL DEFAULT NULL, +`carrier_code` varchar(10) DEFAULT NULL, +`carrier_name` varchar(50) DEFAULT NULL, +`user_id` int(11) DEFAULT NULL, +`user_name` varchar(30) DEFAULT NULL, +`create_time` datetime NULL DEFAULT NULL, +`update_time` datetime NULL DEFAULT NULL, +PRIMARY KEY (`id`), +KEY `index_start_name` (`start_name`), +KEY `index_end_name` (`end_name`), +UNIQUE INDEX `unique_index` (`start_name`,`end_name`,`carrier_code`,`run_mode`), +UNIQUE KEY `unique_keys` (`start_name`,`end_name`,`carrier_code`,`run_mode`), +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + diff --git "a/My Summary/html\344\270\216css\346\200\273\347\273\223.sh" "b/\346\200\273\347\273\223/html\344\270\216css\346\200\273\347\273\223.sh" similarity index 100% rename from "My Summary/html\344\270\216css\346\200\273\347\273\223.sh" rename to "\346\200\273\347\273\223/html\344\270\216css\346\200\273\347\273\223.sh" diff --git "a/My Summary/java\345\255\246\344\271\240\346\200\273\347\273\223.sh" "b/\346\200\273\347\273\223/java\345\255\246\344\271\240\346\200\273\347\273\223.sh" similarity index 100% rename from "My Summary/java\345\255\246\344\271\240\346\200\273\347\273\223.sh" rename to "\346\200\273\347\273\223/java\345\255\246\344\271\240\346\200\273\347\273\223.sh" diff --git "a/My Summary/python\345\255\246\344\271\240\346\200\273\347\273\223.sh" "b/\346\200\273\347\273\223/python\345\255\246\344\271\240\346\200\273\347\273\223.sh" similarity index 100% rename from "My Summary/python\345\255\246\344\271\240\346\200\273\347\273\223.sh" rename to "\346\200\273\347\273\223/python\345\255\246\344\271\240\346\200\273\347\273\223.sh" diff --git "a/My Summary/shell\345\255\246\344\271\240\346\200\273\347\273\223.sh" "b/\346\200\273\347\273\223/shell\345\255\246\344\271\240\346\200\273\347\273\223.sh" similarity index 100% rename from "My Summary/shell\345\255\246\344\271\240\346\200\273\347\273\223.sh" rename to "\346\200\273\347\273\223/shell\345\255\246\344\271\240\346\200\273\347\273\223.sh" diff --git "a/Books and Software/Software/sublime\351\205\215\347\275\256\345\222\214\344\275\277\347\224\250.py" "b/\346\200\273\347\273\223/sublime\351\205\215\347\275\256\345\222\214\344\275\277\347\224\250.py" similarity index 78% rename from "Books and Software/Software/sublime\351\205\215\347\275\256\345\222\214\344\275\277\347\224\250.py" rename to "\346\200\273\347\273\223/sublime\351\205\215\347\275\256\345\222\214\344\275\277\347\224\250.py" index 20097b6..861b29a 100644 --- "a/Books and Software/Software/sublime\351\205\215\347\275\256\345\222\214\344\275\277\347\224\250.py" +++ "b/\346\200\273\347\273\223/sublime\351\205\215\347\275\256\345\222\214\344\275\277\347\224\250.py" @@ -1,3 +1,30 @@ +创建项目和初始化{ +#http://www.cnblogs.com/levelksk/p/6152893.html +pip3.4 install Django==1.8.6 #pip3.4 install Django==1.8.6 -i http://10.93.135.120/pypi/simple --trusted-host 10.93.135.120 + +django-admin startproject mysite #创建一个初始化的项目文件结构,目录如下: + +manage.py:一个实用的命令行,用来与你的项目进行交互。它是一个对django-admin.py工具的简单封装。你不需要编辑这个文件。 + mysite/:你的项目目录,由以下的文件组成: + init.py:一个空文件用来告诉Python这个mysite目录是一个Python模块。 + settings.py:你的项目的设置和配置。里面包含一些初始化的设置。 + urls.py:你的URL模式存放的地方。这里定义的每一个URL都映射一个视图(view)。 + wsgi.py:配置你的项目运行如同一个WSGI应用。 + +python3.4 manage.py migrate #初始应用表将会在数据库中创建 + +python3.4 manage.py runserver #开启开发服务器 + +python3.4 manage.py runserver 10.175.102.179:8001 --settings=mysite.settings #定制的host和端口上运行开发服务 + +} + + +广泛涉猎时得到的兴趣点,可以带动学习,但边际效益表明这样的学习方式的收货会随着时间递减,自己的核心竞争力是需要对技术的再深入和磨练。一般通过大量的刷题+记录+快速迭代,可以不断的熟悉自己原先不熟的知识点,但真正的能力不是表面经验,而是对内部逻辑的反复理解而形成的习惯。 + +下周计划 学习pygame库 + + #关于主题的几个博客 http://www.cnblogs.com/gotodsp/p/5769342.html http://www.cnblogs.com/woodk/p/5120074.html @@ -74,30 +101,40 @@ #sublime用户配置 #http://3ms.huawei.com/hi/blog/8909_1571239.html { - "color_scheme": "Packages/Color Scheme - Default/IDLE.tmTheme", - "font_size": 11.0, - "ignored_packages": - [ - "Vintage" - ], - "theme": "Soda Dark 3.sublime-theme", - "update_check": false, - "word_wrap": "auto", - // 设置tab的大小为4 - "tab_size": 4, - // 使用空格代替tab - "translate_tabs_to_spaces": true, - // 添加行宽标尺 - "rulers": [80, 100], - // 显示空白字符 - "draw_white_space": "all", - // 保存时自动去除行末空白 - "trim_trailing_white_space_on_save": true, - // 保存时自动增加文件末尾换行 - "ensure_newline_at_eof_on_save": true, + "color_scheme": "Packages/Color Scheme - Default/IDLE.tmTheme", + "font_size": 11, + "ignored_packages": + [ + "Vintage" + ], + "update_check": false, + "word_wrap": "auto", + // 设置tab的大小为4 + "tab_size": 4, + // 使用空格代替tab + "translate_tabs_to_spaces": true, + // 添加行宽标尺 + "rulers": [80, 100], + // 显示空白字符 + "draw_white_space": "all", + // 保存时自动去除行末空白 + "trim_trailing_white_space_on_save": true, + // 保存时自动增加文件末尾换行 + "ensure_newline_at_eof_on_save": true, } +#sublime 配置 Terminal cmder +在 packagecontrol.io 可以找到 Terminal +在 cmder.net 下载 cmder +复制 Terminal.sublime-settings 文件到 C:\Users\WXG\AppData\Roaming\Sublime Text 3\Packages\User 目录下. 作如下修改: +{ + "terminal": "C:/wxg/tools/cmder_mini/Cmder.exe", + "parameters": ["/START", "%CWD%"] +} +然后就可以在sublime下调用cmder了. +如果加上 "parameters": ["/START", "%CWD%"] -> 可以定位到当前打开文件所在的目录. + 在 Preference -> Setting-User的配置文件中输入 diff --git "a/Frame/CGI\344\270\216WSGI\345\214\272\345\210\253.sh" "b/\346\241\206\346\236\266/CGI\344\270\216WSGI\345\214\272\345\210\253.sh" similarity index 100% rename from "Frame/CGI\344\270\216WSGI\345\214\272\345\210\253.sh" rename to "\346\241\206\346\236\266/CGI\344\270\216WSGI\345\214\272\345\210\253.sh" diff --git "a/Frame/Flask\345\255\246\344\271\240.py" "b/\346\241\206\346\236\266/Flask\345\255\246\344\271\240.py" similarity index 100% rename from "Frame/Flask\345\255\246\344\271\240.py" rename to "\346\241\206\346\236\266/Flask\345\255\246\344\271\240.py" diff --git "a/Frame/Pyhton Flask\344\271\213\346\227\205.sh" "b/\346\241\206\346\236\266/Pyhton Flask\344\271\213\346\227\205.sh" similarity index 100% rename from "Frame/Pyhton Flask\344\271\213\346\227\205.sh" rename to "\346\241\206\346\236\266/Pyhton Flask\344\271\213\346\227\205.sh" diff --git a/Frame/Source code/README.md "b/\346\241\206\346\236\266/Source code/README.md" similarity index 100% rename from Frame/Source code/README.md rename to "\346\241\206\346\236\266/Source code/README.md" diff --git a/Frame/Source code/bottle-v0.12.13.py "b/\346\241\206\346\236\266/Source code/bottle-v0.12.13.py" similarity index 100% rename from Frame/Source code/bottle-v0.12.13.py rename to "\346\241\206\346\236\266/Source code/bottle-v0.12.13.py" diff --git a/Frame/Source code/bottle-v0.4.10.py "b/\346\241\206\346\236\266/Source code/bottle-v0.4.10.py" similarity index 100% rename from Frame/Source code/bottle-v0.4.10.py rename to "\346\241\206\346\236\266/Source code/bottle-v0.4.10.py" diff --git a/Frame/Source code/flask-0.1.py "b/\346\241\206\346\236\266/Source code/flask-0.1.py" similarity index 100% rename from Frame/Source code/flask-0.1.py rename to "\346\241\206\346\236\266/Source code/flask-0.1.py" diff --git a/Frame/Source code/flask-0.4.py "b/\346\241\206\346\236\266/Source code/flask-0.4.py" similarity index 100% rename from Frame/Source code/flask-0.4.py rename to "\346\241\206\346\236\266/Source code/flask-0.4.py" diff --git "a/Frame/flask/HTTP\350\256\244\350\257\201.py" "b/\346\241\206\346\236\266/flask/HTTP\350\256\244\350\257\201.py" similarity index 100% rename from "Frame/flask/HTTP\350\256\244\350\257\201.py" rename to "\346\241\206\346\236\266/flask/HTTP\350\256\244\350\257\201.py" diff --git "a/Frame/flask/url\346\236\204\345\273\272.py" "b/\346\241\206\346\236\266/flask/url\346\236\204\345\273\272.py" similarity index 100% rename from "Frame/flask/url\346\236\204\345\273\272.py" rename to "\346\241\206\346\236\266/flask/url\346\236\204\345\273\272.py" diff --git "a/Frame/flask/\347\273\217\345\205\270flaskr.py" "b/\346\241\206\346\236\266/flask/\347\273\217\345\205\270flaskr.py" similarity index 100% rename from "Frame/flask/\347\273\217\345\205\270flaskr.py" rename to "\346\241\206\346\236\266/flask/\347\273\217\345\205\270flaskr.py" diff --git a/Frame/hello_of_flask_dome.py "b/\346\241\206\346\236\266/hello_of_flask_dome.py" similarity index 100% rename from Frame/hello_of_flask_dome.py rename to "\346\241\206\346\236\266/hello_of_flask_dome.py" diff --git a/Frame/myweb/README.md "b/\346\241\206\346\236\266/myweb/README.md" similarity index 100% rename from Frame/myweb/README.md rename to "\346\241\206\346\236\266/myweb/README.md" diff --git a/Frame/myweb/myweb.py "b/\346\241\206\346\236\266/myweb/myweb.py" similarity index 100% rename from Frame/myweb/myweb.py rename to "\346\241\206\346\236\266/myweb/myweb.py" diff --git a/Frame/myweb/schema.sql "b/\346\241\206\346\236\266/myweb/schema.sql" similarity index 100% rename from Frame/myweb/schema.sql rename to "\346\241\206\346\236\266/myweb/schema.sql" diff --git a/Frame/myweb/static/style.css "b/\346\241\206\346\236\266/myweb/static/style.css" similarity index 100% rename from Frame/myweb/static/style.css rename to "\346\241\206\346\236\266/myweb/static/style.css" diff --git a/Frame/myweb/templates/layout.html "b/\346\241\206\346\236\266/myweb/templates/layout.html" similarity index 100% rename from Frame/myweb/templates/layout.html rename to "\346\241\206\346\236\266/myweb/templates/layout.html" diff --git a/Frame/myweb/templates/login.html "b/\346\241\206\346\236\266/myweb/templates/login.html" similarity index 100% rename from Frame/myweb/templates/login.html rename to "\346\241\206\346\236\266/myweb/templates/login.html" diff --git a/Frame/myweb/templates/reg.html "b/\346\241\206\346\236\266/myweb/templates/reg.html" similarity index 100% rename from Frame/myweb/templates/reg.html rename to "\346\241\206\346\236\266/myweb/templates/reg.html" diff --git a/Frame/myweb/templates/show_entries.html "b/\346\241\206\346\236\266/myweb/templates/show_entries.html" similarity index 100% rename from Frame/myweb/templates/show_entries.html rename to "\346\241\206\346\236\266/myweb/templates/show_entries.html" diff --git a/Frame/myweb/templates/show_web.html "b/\346\241\206\346\236\266/myweb/templates/show_web.html" similarity index 100% rename from Frame/myweb/templates/show_web.html rename to "\346\241\206\346\236\266/myweb/templates/show_web.html" diff --git a/Frame/myweb/templates/time.html "b/\346\241\206\346\236\266/myweb/templates/time.html" similarity index 100% rename from Frame/myweb/templates/time.html rename to "\346\241\206\346\236\266/myweb/templates/time.html" diff --git a/Frame/myweb/templates/upload_file.html "b/\346\241\206\346\236\266/myweb/templates/upload_file.html" similarity index 100% rename from Frame/myweb/templates/upload_file.html rename to "\346\241\206\346\236\266/myweb/templates/upload_file.html" diff --git a/Frame/pidr_flaskr_API.py "b/\346\241\206\346\236\266/pidr_flaskr_API.py" similarity index 100% rename from Frame/pidr_flaskr_API.py rename to "\346\241\206\346\236\266/pidr_flaskr_API.py"