[{"content":"关于我 IYABAO，Go/PHP 全栈开发者。\nFood And Freedom. Make my own world a better place.\n关于本站 基于 Hugo + PaperMod 构建，部署于阿里云 ESA。\n","permalink":"https://www.plbear.com/about/","summary":"\u003ch2 id=\"关于我\"\u003e关于我\u003c/h2\u003e\n\u003cp\u003eIYABAO，Go/PHP 全栈开发者。\u003c/p\u003e\n\u003cp\u003eFood And Freedom. Make my own world a better place.\u003c/p\u003e\n\u003ch2 id=\"关于本站\"\u003e关于本站\u003c/h2\u003e\n\u003cp\u003e基于 \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e + \u003ca href=\"https://github.com/adityatelange/hugo-PaperMod\"\u003ePaperMod\u003c/a\u003e 构建，部署于阿里云 ESA。\u003c/p\u003e","title":"关于"},{"content":"PHPUnit踩坑实录\n版本信息 说明：现有项目使用php7.2, 只能支持phpunit8.5, 不支持部分新特性\nphp 7.4.30 phpunit 9.5.21 mockery 1.5.0 日常开发 测试类继承 PHPUnit\\Framework\\TestCase use PHPUnit\\Framework\\TestCase;\nclass BackBlackServiceTest extends TestCase{}\n测试方法 public function testBackBlackService($data, $expect), 需是public, 以test开头\n多用例可使用注解 @dataProvider dataProvider dataProvider 方法需为public, 参数个数,类型可按需自定义\n建 议 $ d a t a 按 表 格 式 组 装 数 据 ， m o c k 方 法 ， 指 向 预 期 值 [ ’ m y F u n c ‘ = \u0026gt; ' m y F u n c E x p e c t D a t a ' ] public function serviceProvider() {\nr ] e ; t ' ' u 测 测 r 试 试 n 用 用 例 例 [ 名 名 1 2 ' ' = = \u0026gt; \u0026gt; [ [ $ $ d d a a t t a a , , $ $ e e x x p p e e c c t t ] ] , }\n断言时可增加用例名作为报错message\np u b l i c f u n c t i o n t e s t B a c k B l a c k S e r v i c e ( ) { this−\u0026gt;assertEquals(this-\u0026gt;assertEquals(this−\u0026gt;assertEquals(expected, $actual, $this-\u0026gt;getName());\n} 常用技巧 对象mock(原则上需要mock的类为操作db，调用第三方服务的类) 可注入对象使用一般方法 \\Mockery::mock(MyClass::class)\n无 使 需 用 注 o 入 v ( e 基 r 于 l 代 o 码 \\ \\ a 现 M M d 状 o o : , c c k k 不 e e a 改 r r l 动 y y i 现 : : a 有 : : s 代 m m : 码 o o ) c c k k 需 ( ( 配 \" \" 合 o a 以 v l 下 e i 注 r a 解 l s 使 o : 用 a \" d : . \" M . y C M l y a C s l s a : s : s c : l : a c s l s a ) s ; s ) ; 静 态 方 法 @runInSeparateProcess @runTestsInSeparateProcesses @preserveGlobalState disabled 使用shouldReceive定义mock方法，返回值 \\Mockery::mock(\u0026ldquo;alias:\u0026rdquo; . MyClass::class)-\u0026gt;shouldReceive(\u0026lsquo;myFunc\u0026rsquo;)-\u0026gt;andReturn($data[\u0026lsquo;myFunc\u0026rsquo;] ?? []);\nreplyValidation−\u0026gt;shouldReceive(′valiate′)−\u0026gt;andThrow(newValidException(replyValidation-\u0026gt;shouldReceive(\u0026lsquo;valiate\u0026rsquo;)-\u0026gt;andThrow(new ValidException(replyValidation−\u0026gt;shouldReceive(′valiate′)−\u0026gt;andThrow(newValidException(data[\u0026lsquo;validate\u0026rsquo;])); //需要抛异常\n多用例时需增加Mockery::close()方法 public function tearDown(): void { parent::tearDown(); Mockery::close(); }\n特殊技巧 链式操作 person=ResumeService::module(′base′)−\u0026gt;findbyuserid((int)person = ResumeService::module(\u0026lsquo;base\u0026rsquo;)-\u0026gt;find_by_user_id((int)person=ResumeService::module(′base′)−\u0026gt;findb​yu​seri​d((int)userId); $resume_service-\u0026gt;shouldReceive(\u0026lsquo;module-\u0026gt;find_by_user_id\u0026rsquo;) 同一个方法调用多次 参数区分 withAnyArgs() 任意传参\n次 数 区 分 \\ a a t M t t i o 按 L M m c 传 e o e k 参 a s s e 返 s t ( r 回 t ( 3 y ( ) ) : w ) - : i - \u0026gt; s t \u0026gt; t 明 p h t i 确 y ( i m 调 ( . m e 用 ' . e s 次 a . s ( 数 l $ ( 2 ， i a 2 ) 多 a r ) 了 s g ， : s 最 最 ' ) 少 多 少 调 调 了 . 用 用 都 次 次 不 C 数 数 行 o 。 n \\ f M i o g c : k : e c r l y a : s : s s ) p - y \u0026gt; ( s ' h a o l u i l a d s R : e ' c e . i v C e o ( n ' f g i e g t : C : o c n l f a i s g s I ) t - e \u0026gt; m s ' h ) o - u \u0026gt; l a d t R L e e c a e s i t v ( e ) ( - ' \u0026gt; g t e i t m C e o s n ( f 2 i ) g - I \u0026gt; t a e n m d ' R ) e - t \u0026gt; u w r i n t ( h $ ( d \" a a t \" a ) 1 - , \u0026gt; a $ n d d a R t e a t 2 u ) r ; n ( $ d a t a 1 ) ; 静态常量 使用“alias:” mock的类无法访问该类的常量，静态变量\n使用自定义类，方式注入\nclass ConstMap { public const CONTRACT_RESUME = \u0026lsquo;View\u0026rsquo;; //简 public static $remain_field = \u0026lsquo;SurplusNum\u0026rsquo;;\n}\n\\Mockery::mock(\u0026lsquo;alias:\u0026rsquo; . ContractService::class, ConstMap::class);\n魔术方法 类里面未定义属性，使用魔术方法__get($name) 访问\n\\Mockery::mock(\u0026lsquo;overload:\u0026rsquo; . CompanyComponent::class)-\u0026gt;shouldReceive(\u0026rsquo;__construct\u0026rsquo;)-\u0026gt;andSet(\u0026lsquo;company_name\u0026rsquo;, \u0026lsquo;公司名\u0026rsquo;);\n代码注解使用 通过phpunit.xml 定义，测试用例常量 如 inPhpUnit 跳过测试用例无法覆盖代码， 如register_shutdown_function !defined(\u0026lsquo;inPhpUnit\u0026rsquo;) \u0026amp;\u0026amp; register_shutdown_function(function(){});\n使用注解跳过相关代码块覆盖 // @codeCoverageIgnoreStart\n/ @ c o d e C o v e r a g e I g n o r e E n d phpunit.xml phpunit.xml (phpunit9) 关注参数 forceCoversAnnotation=\u0026ldquo;false\u0026rdquo;\n\u0026lt; c o v e r a g e \u0026gt; \u0026lt; / c o v e r a g e \u0026gt; 覆 盖 源 文 件 配 置 xml version=\u0026ldquo;1.0\u0026rdquo; encoding=\u0026ldquo;UTF-8\u0026rdquo;?\nsrc\ntests\nphpunit.xml (phpunit8.5) 关注参数 forceCoversAnnotation=\u0026ldquo;false\u0026rdquo;\n\u0026lt; w h i t e l i s t \u0026gt; \u0026lt; / w h i t e l i s t \u0026gt; 覆 盖 源 文 件 配 置 xml version=\u0026ldquo;1.0\u0026rdquo; encoding=\u0026ldquo;UTF-8\u0026rdquo;?\ntests\nsrc\nIDE支持 点选phpunit.xml, 或者指定用例, 更多运行/调试，使用覆盖率运行\n命令行 全部覆盖率\np 指 p h 定 h p 测 p 试 - - d d x x d d e e b b u u g g . . m m o o d d e e = = c c o o v v e e r r a a g g e e / / U U s s e e r r s s / / * * * * * * * * * * * * / / c c o o m m p p o o s s e e r r / / v v e e n n d d o o r r / / p p h h p p u u n n i i t t / / p p h h p p u u n n i i t t / / p p h h p p u u n n i i t t - - c c o o n n f f i i g g u u r r a a t t i i o o n n p p h h p p u u n n i i t t . . x x m m l l t e s t s / u n i t / S e r v i c e / R e s u m e / K i c k F a v o r i t e S e r v i c e T e s t . p h p 开发建议 db层不封装业务逻辑\n对 数 象 据 实 层 体 ， 能 第 以 三 对 方 象 服 形 务 式 支 代 持 替 注 数 入 组 ， 形 简 式 化 返 m 回 o ， c k 便 难 于 度 模 拟 数 据 。 相关文档 https://phpunit.readthedocs.io/en/9.5/\nhttps://phpunit.readthedocs.io/zh_CN/latest/ (中文文档相对滞后)\nhttp://docs.mockery.io/en/latest/index.html\n下一篇\n### 阿里云盘 挂载本地挂载\n","permalink":"https://www.plbear.com/posts/phpunit/","summary":"\u003cp\u003ePHPUnit踩坑实录\u003c/p\u003e\n\u003cp\u003e版本信息\n说明：现有项目使用php7.2, 只能支持phpunit8.5, 不支持部分新特性\u003c/p\u003e\n\u003cp\u003ephp 7.4.30\nphpunit 9.5.21\nmockery 1.5.0\n日常开发\n测试类继承 PHPUnit\\Framework\\TestCase\nuse PHPUnit\\Framework\\TestCase;\u003c/p\u003e","title":"PHPUnit"},{"content":"Alist\n一般电脑上挂载云盘到本地都是两步走，先利用网盘目录程序搞定网盘，再映射成本地网络磁盘，所以想把网盘挂载到本地，我们需要两个工具。\n当然，网盘目录程序有很多，不过你可以试试今天这个 Alist，开源在 GitHub 上，已经荣获了 6.2K+ Star。\n而且不光是阿里云盘，什么天翼云盘、谷歌云盘、123 云盘、蓝奏云、夸克网盘等等，Alist 可以一口气帮你聚合十几种网盘。\nAlist 用起来很简单，双击解压后的可执行文件，你会看到这样一个运行窗口，里面记录了自动生成的密码，和本地访问的端口：\n如果双击无反应，大家可以试试右键「以管理员身份运行」：\n只要运行窗口正常弹出，Alist 在你电脑上就搭建好了，去浏览器上访问地址「127.0.0.1:5244」，输入刚刚生成的密码：\n你就进入 Alist 的管理后台了。\n注意，我们最小化运行窗口就行，不要关闭，否则 Alist 会停止服务：\n还有就是第一次配置 Alist 后，会生成一个配置文件，如果使用过程中有什么问题，把它删了，重新启动下面的可执行文件就行。\n增添网盘\n不过此时的 Alist 空空如也，不过别急，在左侧菜单「账号」处添加自己的网盘即可：\n以阿里云盘为例，你会看到这样一个窗口，必填项有「虚拟路径」和「刷新令牌」，前者随意，后者则包含了我们登录信息的 token 值：\n别的网盘你可以在浏览器上获得 token，但阿里云盘只能用移动端的 token，不过贴心的是，作者提供了个提取移动端 token 的在线工具。\n点击「Get Token」，手机阿里云盘扫码即可获取：\n粘贴到 Alist 的管理后台，重新访问「127.0.0.1:5244」，你的 Alist 就该是这个样子，图片里框起来的地方就是我们填写的「虚拟路径」：\n可移动、可下载、可重命名：\n资源还可在线观看：\n而当你把多个网盘都配置好，你就能在「127.0.0.1:5244」这个网页内随便访问了，比如我配置了阿里云盘、蓝奏云、123网盘和夸克网盘，访问效果如下：\nRaiDrive\n这时还只是浏览器里操作，想映射本地，还得请出评论区出镜率最高的 RaiDrive。\n下载安装，打开 RaiDrive 后，按照提示去右上角找「Add」：\n然后在「NAS」处找到「WebDAV」协议，给你挂载的盘符选个名，比如我选的是「L」，输入链接「127.0.0.1:5244/dav」，输入账号、密码，最后点击「OK」。\n如果你不知道怎么搞，像我上面这张图配置即可，至于账号密码哪里找？去 Alist 管理后台的「后端」处找，密码每个人不一样，大家可别照抄了：\n当你做好了这些，再打开「我的电脑」，会发现有个「网络磁盘 L」：\n打开你会发现有 4 个文件夹，分别是阿里云盘、蓝奏云、夸克网盘和 123 盘，怎么操作就看你的了：\n感受一下，你的电脑磁盘第一次出现以 EB 为单位的容量是什么感觉，也不是很大，1EB 也就等于 100 万 TB 吧，不管实际有多少，看着就带劲，想想看这里面能住多少个小姐姐。。。\n不过大家别被这 8EB 迷住了眼，你配置了多少网盘，有多少容量，就能挂多少，但等你挂载完，就知道和你电脑合二为一的网盘到底有多方便了。\n结语\n把网盘挂载到本地，图的就是个方便，如果你没有把网盘挂到本地的需求，也可以利用 Alist 实现多网盘管理，一个网页就能查看所有网盘的资源。\n具体的配置攻略，建议大家去看看 Alist 的官方文档，所有网盘的配置需求，包括那个提取阿里云盘移动端 token，文档里都有。\n下一篇\n### 技术博客\n","permalink":"https://www.plbear.com/posts/a-li-yun-pan-gua-zai-ben-di-gua-zai/","summary":"\u003cp\u003e\u003cstrong\u003eAlist\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般电脑上挂载云盘到本地都是两步走，先利用网盘目录程序搞定网盘，再映射成本地网络磁盘，所以想把网盘挂载到本地，我们需要两个工具。\u003c/p\u003e\n\u003cp\u003e当然，网盘目录程序有很多，不过你可以试试今天这个 Alist，开源在 GitHub 上，已经荣获了 6.2K+ Star。\u003c/p\u003e","title":"阿里云盘 挂载本地挂载"},{"content":"技术RoadMap 云风的Blog 美团技术团队 阮一峰的网络日志 陈皓（CoolShell博主） 廖雪峰的官方网站 陈硕的Blog - C++博客 刘未鹏 | Mind Hacks 床长人工智能教程 九霄天空\nMartin Fowler JakeWharton DAVID HEINEMEIER HANSSON David Ford David Walsh John D. Cook Joshtronic\n惠新宸 峰云就她了 信海龙 张宴 洋沙居士 rango 新rango\nStephen Guise ScottHYoung Jeremy Morgan\n博主 博客地址 主要方向 微信公众号 D瓜哥 www.diguage.com JAVA 农码一生 www.cnblogs.com/zhaopei C# .NET 纯洁的微笑 www.ityouknow.com JAVA 纯洁的微笑 左潇龙 www.zuoxiaolong.com JAVA stoneniqiu www.cnblogs.com/stoneniqiu 前端 老农-zkweb www.cnblogs.com/zkweb .Net Jeffcky www.cnblogs.com/CreateMyself C# .NET mindwind www.cnblogs.com/mindwind JAVA mindwind 数据之巅 www.cnblogs.com/asxinyu C# .NET chenssy www.cmsblogs.com JAVA 阿蜜果 www.blogjava.net/amigoxie JAVA 静儿1986 www.cnblogs.com/xiexj JAVA 小柒 blog.52itstyle.com JAVA 匠心十年 www.cnblogs.com/gaochundong C# .NET tkb至简 www.cnblogs.com/farb C# .NET LearningHard www.cnblogs.com/zhili C# .NET 一线码农 www.cnblogs.com/huangxincheng C# .NET LineZero www.cnblogs.com/linezero C# .NET 上位者的怜悯 www.cnblogs.com/lianmin 前端 田园里的蟋蟀 www.cnblogs.com/xishuai C# .NET 冯尧 blog.csdn.net/fengyao1995 JAVA 许进 www.xujin.org JAVA 焰尾迭 www.cnblogs.com/yanweidie C# .NET 张子阳 www.cnblogs.com/JimmyZhang C# .NET Emrys www.cnblogs.com/emrys5 C# .NET 王爵nice www.biezhi.me JAVA wc的一些事一些情 www.cnblogs.com/wcd144140 JAVA ChokCoco www.cnblogs.com/coco1s 前端 知秋 muyinchen.github.io JAVA 方志朋 blog.csdn.net/forezp JAVA 天在雨 www.algorithmdog.com 机器学习 李同学 virusdefender.net python 梅文杰-bboys www.bboysoul.com 后端 查利鹏 imzlp.me C++ 勇敢的心 studyai.com/blog/index 机器学习 CLL www.geekjc.com 前端 柴 www.geektechblog.tk python mikumikulch mikumikulch.gitbooks.io java 抹桥 www.kisnows.com 前端 polaris blog.studygolang.com golang 黑鸟🐦 www.blovb.com 安全 码志 mazhuang.org JAVA 翟路佳 blog.meathill.com 全栈 crossoverJie crossoverjie.top JAVA crossoverJie 刘超 tech.liuchao.me 后端 liletian database.jlu.edu.cn/liletian python yonghaowu yonghaowu.github.io C/C++, PHP or Python 姜汁啤酒 gingerbeer.blog.51cto.com 网络 金笔头 jinbitou.net 后端 丑胖侠 http://blog.csdn.net/wo541075754 区块链\u0026amp;Drools 以诺网 www.enoch.site JAVA 无 apoollo www.apoollo.com JAVA 无 万家博客 www.wanhejia.com JAVA 无 大老杨 www.dalaoyang.cn JAVA 大老杨 唐亚峰博客 blog.battcn.com JAVA battcn 张亚东博客 www.zhyd.me JAVA 码一码 匠心零度 www.jiangxinlingdu.com JAVA 匠心零度 Vim教程网 https://vimjc.com Vim vimtutor 会打篮球的程序猿 http://www.lzhpo.com Java和大数据 会打篮球的程序猿 bugstack虫洞栈 https://bugstack.cn Java bugstack虫洞栈 寅春树博客 https://www.chunshu.net 全栈 寅春树 后端开发 Keep LearningBuilding with Observability in mindMetrics logging and other observable itemsthat could help you in debugging and solvingthe issues when things go wrongArchitectural PatternsMonolithic AppsMicroservicesCQRS and Event SourcingSearch EnginesElasticsearchSolrSOANeo4jRabbitMQKafkaMessage BrokersContainerization vs VirtualizationWeb ServersNginxApacheCaddyMS IISDockerrktLXCGraphQLApolloRelay ModernGraph DatabasesWebSocketsOAuthBasic AuthenticationToken AuthenticationJWTOpenIDSAMLCachingRedisMemcachedServer SideClient SideCDNRelational DatabasesPostgreSQLMySQLMariaDBMS SQLOracleNoSQL DatabasesDocumentMongoDB, CouchDBRealtimeFirebase, RethinkDBACIDMore about DatabasesTransactionsN+1 ProblemSharding StrategiesDatabase NormalizationData ReplicationIndexes and how they workLearn about APIsRESTRead Roy Fielding’s PaperJSON APIsSOAPHATEOASOpen API Spec and SwaggerCAP TheoremAuthenticationWeb Security KnowledgeCORSHTTPSContent Security PolicyOWASP Security RisksMD5 and why not to use itSHA FamilyscryptbcryptHashing AlgorithmsCookie BasedSSL/TLSTestingIntegration TestingUnit TestingFunctional TestingBackendFind the detailed version of this roadmapalong with resources and other roadmapsroadmap.shhttp://Personal Recommendation / OpinionI wouldn\u0026rsquo;t recommendOrder in roadmap not strict (Learn anytime)Alternative Option - Pick this or purpleGoJavaRustC#Learn a LanguageMake sure to learn its quirks. Core details about itsruntime e.g. concurrency, memory model etc.PHPJavaScriptPythonRubyInternetHow does the internet work?What is HTTP?Browsers and how they work?DNS and how it works?What is Domain Name?What is hosting?Basic Frontend KnowledgeHTMLCSSJavaScriptMemory ManagementInterprocess CommunicationI/O ManagementPOSIX Basicsstdin, stdout, stderr, pipesBasic Networking ConceptsOS and General KnowledgeTerminal UsageBasic Terminal Commandsgrep, awk, sed, lsof, curl, wgettail, head, less, find, ssh, killProcess ManagementThreads and ConcurrencyHow OSs work in GeneralBasic Usage of GitGitHubRepo hosting servicesCreate account and Learn to use GitHubVersion Control SystemsWhat are they and why you should use oneBitbucketGitLabORMsCI / CDDesign and Development PrinciplesSOLIDKISSYAGNIDRYGOF Design PatternsDomain Driven DesignTest Driven DevelopmentServerlessBuilding for ScaleGeneral topics that you should learnand care about for the sustainabilityof the product.Mitigation StrategiesUnderstand the Diff.MonitoringThrottlingBackpressureLoadshiftingGracefulTelemetryInstrumentationCircuit BreakerMigration StrategiesHorizontal vs Vertical ScalingDegradationgRPCColumn DBsCassandraTime seriesInfluxDB, TimescaleDB\n下一篇\n### 程序员应该访问的最佳网站中文版\n","permalink":"https://www.plbear.com/posts/ji-zhu-bo-ke/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/kamranahmedse/developer-roadmap\"\u003e技术RoadMap\u003c/a\u003e\n\u003ca href=\"https://blog.codingnow.com/\"\u003e云风的Blog\u003c/a\u003e\n\u003ca href=\"https://tech.meituan.com/\"\u003e美团技术团队\u003c/a\u003e\n\u003ca href=\"http://www.ruanyifeng.com/blog/\"\u003e阮一峰的网络日志\u003c/a\u003e\n\u003ca href=\"https://coolshell.cn/\"\u003e陈皓（CoolShell博主）\u003c/a\u003e\n\u003ca href=\"https://www.liaoxuefeng.com/\"\u003e廖雪峰的官方网站\u003c/a\u003e\n\u003ca href=\"http://www.cppblog.com/solstice/\"\u003e陈硕的Blog - C++博客\u003c/a\u003e\n\u003ca href=\"http://mindhacks.cn/\"\u003e刘未鹏 | Mind Hacks\u003c/a\u003e\n\u003ca href=\"https://www.captainbed.net/blog-neo/\"\u003e床长人工智能教程\u003c/a\u003e\n\u003ca href=\"https://turbock79.cn/\"\u003e九霄天空\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.martinfowler.com/\"\u003eMartin Fowler\u003c/a\u003e\n\u003ca href=\"https://jakewharton.com/blog/\"\u003eJakeWharton\u003c/a\u003e\n\u003ca href=\"https://dhh.dk/\"\u003eDAVID HEINEMEIER HANSSON\u003c/a\u003e\n\u003ca href=\"https://medium.com/@daveford\"\u003eDavid Ford\u003c/a\u003e\n\u003ca href=\"https://davidwalsh.name/\"\u003eDavid Walsh\u003c/a\u003e\n\u003ca href=\"https://www.johndcook.com/blog/\"\u003eJohn D. Cook\u003c/a\u003e\n\u003ca href=\"https://joshtronic.com/blog/\"\u003eJoshtronic\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.laruence.com/\"\u003e惠新宸\u003c/a\u003e\n\u003ca href=\"https://xiaorui.cc/\"\u003e峰云就她了\u003c/a\u003e\n\u003ca href=\"https://www.bo56.com/\"\u003e信海龙\u003c/a\u003e\n\u003ca href=\"http://zyan.cc/index.php\"\u003e张宴\u003c/a\u003e\n\u003ca href=\"http://guweigang.com/\"\u003e洋沙居士\u003c/a\u003e\n\u003ca href=\"https://rango.swoole.com/\"\u003erango\u003c/a\u003e\n\u003ca href=\"https://wenda.swoole.com/u/1\"\u003e新rango\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://stephenguise.com/blog/\"\u003eStephen Guise\u003c/a\u003e\n\u003ca href=\"https://www.scotthyoung.com/blog/\"\u003eScottHYoung\u003c/a\u003e\n\u003ca href=\"https://www.jeremymorgan.com/\"\u003eJeremy Morgan\u003c/a\u003e\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e博主\u003c/th\u003e\n          \u003cth\u003e博客地址\u003c/th\u003e\n          \u003cth\u003e主要方向\u003c/th\u003e\n          \u003cth\u003e微信公众号\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eD瓜哥\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.diguage.com/\"\u003ewww.diguage.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e农码一生\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/zhaopei/\"\u003ewww.cnblogs.com/zhaopei\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e纯洁的微笑\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.ityouknow.com/\"\u003ewww.ityouknow.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e纯洁的微笑\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e左潇龙\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.zuoxiaolong.com/\"\u003ewww.zuoxiaolong.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003estoneniqiu\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/stoneniqiu/\"\u003ewww.cnblogs.com/stoneniqiu\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e前端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e老农-zkweb\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/zkweb\"\u003ewww.cnblogs.com/zkweb\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e.Net\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eJeffcky\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/CreateMyself\"\u003ewww.cnblogs.com/CreateMyself\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003emindwind\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/mindwind/\"\u003ewww.cnblogs.com/mindwind\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003emindwind\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e数据之巅\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/asxinyu/\"\u003ewww.cnblogs.com/asxinyu\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003echenssy\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://cmsblogs.com/\"\u003ewww.cmsblogs.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阿蜜果\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.blogjava.net/amigoxie/\"\u003ewww.blogjava.net/amigoxie\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e静儿1986\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/xiexj/\"\u003ewww.cnblogs.com/xiexj\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e小柒\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.52itstyle.com/\"\u003eblog.52itstyle.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e匠心十年\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/gaochundong\"\u003ewww.cnblogs.com/gaochundong\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003etkb至简\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/farb/\"\u003ewww.cnblogs.com/farb\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eLearningHard\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/zhili\"\u003ewww.cnblogs.com/zhili\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e一线码农\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/huangxincheng/\"\u003ewww.cnblogs.com/huangxincheng\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eLineZero\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/linezero/\"\u003ewww.cnblogs.com/linezero\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e上位者的怜悯\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/lianmin\"\u003ewww.cnblogs.com/lianmin\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e前端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e田园里的蟋蟀\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/xishuai\"\u003ewww.cnblogs.com/xishuai\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e冯尧\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.csdn.net/fengyao1995\"\u003eblog.csdn.net/fengyao1995\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e许进\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://xujin.org\"\u003ewww.xujin.org\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e焰尾迭\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/yanweidie/\"\u003ewww.cnblogs.com/yanweidie\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e张子阳\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/JimmyZhang/\"\u003ewww.cnblogs.com/JimmyZhang\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eEmrys\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/emrys5/\"\u003ewww.cnblogs.com/emrys5\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC# .NET\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e王爵nice\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://biezhi.me/\"\u003ewww.biezhi.me\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003ewc的一些事一些情\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/wcd144140/\"\u003ewww.cnblogs.com/wcd144140\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eChokCoco\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.cnblogs.com/coco1s/\"\u003ewww.cnblogs.com/coco1s\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e前端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e知秋\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://muyinchen.github.io/\"\u003emuyinchen.github.io\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e方志朋\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.csdn.net/forezp\"\u003eblog.csdn.net/forezp\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e天在雨\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.algorithmdog.com/\"\u003ewww.algorithmdog.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e机器学习\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e李同学\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://virusdefender.net\"\u003evirusdefender.net\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003epython\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e梅文杰-bboys\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.bboysoul.com\"\u003ewww.bboysoul.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e后端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e查利鹏\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://imzlp.me\"\u003eimzlp.me\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC++\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e勇敢的心\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://studyai.com/blog/index\"\u003estudyai.com/blog/index\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e机器学习\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCLL\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.geekjc.com\"\u003ewww.geekjc.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e前端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e柴\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.geektechblog.tk\"\u003ewww.geektechblog.tk\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003epython\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003emikumikulch\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://mikumikulch.gitbooks.io/chucklin_blog/content/\"\u003emikumikulch.gitbooks.io\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003ejava\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e抹桥\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.kisnows.com\"\u003ewww.kisnows.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e前端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003epolaris\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.studygolang.com\"\u003eblog.studygolang.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003egolang\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e黑鸟🐦\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.blovb.com\"\u003ewww.blovb.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e安全\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e码志\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://mazhuang.org\"\u003emazhuang.org\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e翟路佳\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.meathill.com\"\u003eblog.meathill.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e全栈\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003ecrossoverJie\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://crossoverjie.top\"\u003ecrossoverjie.top\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003ecrossoverJie\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e刘超\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://tech.liuchao.me\"\u003etech.liuchao.me\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e后端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eliletian\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://database.jlu.edu.cn/liletian\"\u003edatabase.jlu.edu.cn/liletian\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003epython\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eyonghaowu\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://yonghaowu.github.io\"\u003eyonghaowu.github.io\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eC/C++, PHP or Python\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e姜汁啤酒\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://gingerbeer.blog.51cto.com\"\u003egingerbeer.blog.51cto.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e网络\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e金笔头\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://jinbitou.net\"\u003ejinbitou.net\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e后端\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e丑胖侠\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.csdn.net/wo541075754\"\u003ehttp://blog.csdn.net/wo541075754\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e区块链\u0026amp;Drools\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e以诺网\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.enoch.site/\"\u003ewww.enoch.site\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e无\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eapoollo\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.apoollo.com/\"\u003ewww.apoollo.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e无\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e万家博客\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.wanhejia.com/\"\u003ewww.wanhejia.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e无\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e大老杨\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.dalaoyang.cn/\"\u003ewww.dalaoyang.cn\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e大老杨\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e唐亚峰博客\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://blog.battcn.com/\"\u003eblog.battcn.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003ebattcn\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e张亚东博客\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.zhyd.me\"\u003ewww.zhyd.me\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e码一码\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e匠心零度\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.jiangxinlingdu.com/\"\u003ewww.jiangxinlingdu.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJAVA\u003c/td\u003e\n          \u003ctd\u003e匠心零度\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eVim教程网\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://vimjc.com\"\u003ehttps://vimjc.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eVim\u003c/td\u003e\n          \u003ctd\u003evimtutor\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e会打篮球的程序猿\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.lzhpo.com\"\u003ehttp://www.lzhpo.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJava和大数据\u003c/td\u003e\n          \u003ctd\u003e会打篮球的程序猿\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003ebugstack虫洞栈\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://bugstack.cn\"\u003ehttps://bugstack.cn\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003eJava\u003c/td\u003e\n          \u003ctd\u003ebugstack虫洞栈\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e寅春树博客\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.chunshu.net\"\u003ehttps://www.chunshu.net\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e全栈\u003c/td\u003e\n          \u003ctd\u003e寅春树\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003ca href=\"https://roadmap.sh/backend\"\u003e后端开发\u003c/a\u003e\nKeep LearningBuilding with Observability in mindMetrics logging and other observable itemsthat could help you in debugging and solvingthe issues when things go wrongArchitectural PatternsMonolithic AppsMicroservicesCQRS and Event SourcingSearch EnginesElasticsearchSolrSOANeo4jRabbitMQKafkaMessage BrokersContainerization vs VirtualizationWeb ServersNginxApacheCaddyMS IISDockerrktLXCGraphQLApolloRelay ModernGraph DatabasesWebSocketsOAuthBasic AuthenticationToken AuthenticationJWTOpenIDSAMLCachingRedisMemcachedServer SideClient SideCDNRelational DatabasesPostgreSQLMySQLMariaDBMS SQLOracleNoSQL DatabasesDocumentMongoDB, CouchDBRealtimeFirebase, RethinkDBACIDMore about DatabasesTransactionsN+1 ProblemSharding StrategiesDatabase NormalizationData ReplicationIndexes and how they workLearn about APIsRESTRead Roy Fielding’s PaperJSON APIsSOAPHATEOASOpen API Spec and SwaggerCAP TheoremAuthenticationWeb Security KnowledgeCORSHTTPSContent Security PolicyOWASP Security RisksMD5 and why not to use itSHA FamilyscryptbcryptHashing AlgorithmsCookie BasedSSL/TLSTestingIntegration TestingUnit TestingFunctional TestingBackendFind the detailed version of this roadmapalong with resources and other roadmapsroadmap.shhttp://Personal Recommendation / OpinionI wouldn\u0026rsquo;t recommendOrder in roadmap not strict (Learn anytime)Alternative Option - Pick this or purpleGoJavaRustC#Learn a LanguageMake sure to learn its quirks. Core details about itsruntime e.g. concurrency, memory model etc.PHPJavaScriptPythonRubyInternetHow does the internet work?What is HTTP?Browsers and how they work?DNS and how it works?What is Domain Name?What is hosting?Basic Frontend KnowledgeHTMLCSSJavaScriptMemory ManagementInterprocess CommunicationI/O ManagementPOSIX Basicsstdin, stdout, stderr, pipesBasic Networking ConceptsOS and General KnowledgeTerminal UsageBasic Terminal Commandsgrep, awk, sed, lsof, curl, wgettail, head, less, find, ssh, killProcess ManagementThreads and ConcurrencyHow OSs work in GeneralBasic Usage of GitGitHubRepo hosting servicesCreate account and Learn to use GitHubVersion Control SystemsWhat are they and why you should use oneBitbucketGitLabORMsCI / CDDesign and Development PrinciplesSOLIDKISSYAGNIDRYGOF Design PatternsDomain Driven DesignTest Driven DevelopmentServerlessBuilding for ScaleGeneral topics that you should learnand care about for the sustainabilityof the product.Mitigation StrategiesUnderstand the Diff.MonitoringThrottlingBackpressureLoadshiftingGracefulTelemetryInstrumentationCircuit BreakerMigration StrategiesHorizontal vs Vertical ScalingDegradationgRPCColumn DBsCassandraTime seriesInfluxDB, TimescaleDB\u003c/p\u003e","title":"技术博客"},{"content":"awesome 程序员应该访问的最佳网站中文版原版 一些对程序员有用的网站\n在学习CS的时候有一些你必须知道的有用的站点来获取通知为了你的技术储备和学习新知识。这里是一个你应该访问的不是非常全面的一些站点的列表，这个列表会不断更新，只要我能得到链接，你也可以通过添加你知道的来为此做出贡献\nIndex 索引\n当你遇到问题时 新闻篇 杂志篇 针对新手的代码训练 加密货币 针对那些想开始一个小的项目但是无从下手的人 通用编码建议 编码风格 通用工具 面试准备 纪录片 学习新知识-mooc 与你首选的编程语言的站点(对我来说是java) AI学习 研讨会、研究性写作、会谈等 Reddit知识汇总 Youtube频道 好文章 bash和shell脚本 播客 构建一个简单的编译器/解释器 欣赏他人的代码 教程 一个程序员应该知道的东西 编程比赛 计算机书籍 视频指南 在线编译和共享代码片段 开发者博客 用来提高你的英语 当你厌倦了CS相关的东西 开源网站 当你遇到问题时 Codementor: 国际版在行，更侧重于开发者之间的帮助，可以从某些方面的专家那里获取帮助 devRant: 供你吐槽和释放压力的地方 Learn Anything: 帮助你找到学习任何知识时的最佳路径 Quora: 一个共享知识和更好的理解世界的地方 Stack Overflow: 订阅他们的每周新闻和任何你感兴趣的主题 新闻篇 ACM TechNews : 科技新闻 Stratechery : 类似于个人博客 AlternativeTo : 众包软件推荐 Ars Technica : 精品文章 Better Dev Links : 每周一次的链接推送帮助你成为更好的开发者 DevOpsLinks : 一个对DevOps感兴趣的众多开发者和it专家的在线社区 GSMArena.com : 与最新手机和android相关的新闻 Hacker News Digest : Hacker News文摘 Hacker News: 针对程序员的新闻聚合，通过新闻稿获取头条新闻 Hacker Newsletter : 手工编辑，周周更新 Hacker Noon : 一些技术科技类文章的网站 High Scalability : 不同公司在他们的apps上的成功的故事 Lobsters : Lobsters是一个聚焦于技术的社区，主要是链接聚合和对话题进行讨论 product hunt : 寻找你最喜欢的东西 Recode : 聚焦硅谷商业的科技新闻 Reddit.com/r/programming :科技新闻和文章的聚合 Slashdot : 新闻，社会新闻 Stack Share :各公司技术栈共享站点 TechCrunch : 一个科技新闻的站点 The DEV Community : 程序员分享想法和互相帮助的地方 Ars Technica : 发表的独特的精品文章 The Verge : 更多面向产品的科技新闻 XDA :Android开发者新闻 杂志篇 Mit技术评论 :麻省理工学院技术评论杂志 Nautilus : 纽约人看技术 LWN :开源技术，编程等的新闻周刊等（原linux每周新闻） 针对初学者的代码练习 Cave of programming : 学习编程，提升技巧 Codeacademy : 交互式编码学习，免费 CodeAbbey - 一个任何人都能精通编程的地方 : 从菜鸟到专家进阶之地 Exercism.io : 用超过30种不同的语言解决实践问题，与其他人分享你的解决方案 freeCodeCamp : 学习编码并且为非营利性组织构建项目。打造你的全栈开发技能 karan/Projects-Solutions 用不同语言实现的项目 Lod - Cloud : 开放数据云图 Programming by Doing : 编程进阶站点 Reddit.com/r/dailyprogrammer : 有趣的编程挑战，在这里你能学习其他人的编码，对于你解决不了的编码你能看看其他人是怎么解决的 People Can Program :互联网上最友好的编程学习应用 Programming Tasks : 小程序汇总，不是微信的小程序 Vim adventures :边玩边学vim Pramp : 尝试面试官角色，结束后，可以点击左边的按钮交换角色 Paqmind :学习编程的指南和挑战 treehouse :快速容易和经济实惠的方法来提升技巧 加密货币 加密货币爱好者必知内容 :加密货币爱好者必须要知道的8项内容 区块链基础 :区块链介绍 针对那些想开始一个小的项目但是无从下手的人 freeCodeCamp | React project ideas :学习react的27个有趣的想法 martyr2s-mega-project-ideas-list : 包含125个项目，从初级到中级 karan/Projects : 针对新手的小项目的汇总 Wrong \u0026ldquo;big projects\u0026rdquo; for beginners : 怎样选择，从哪里开始 vicky002/1000-Projects : 一个能够用任何编程语言解决的巨型项目清单 通用编码建议 成为一名优秀开发者的10种方法 代码审查最佳实践: Kevin London的博客 Dieter Rams : 好的产品设计的10个原则 设计模式 : 用例子详细说明设计模式 如何成为一个程序员或谷歌搜索的艺术 js项目指南:javascript项目最佳实践集合 Learn to Code With Me : 一个资源非常全的网站，旨在为科技界的开发人员提供资源 一个程序员一生应遵循的原则 编程规范 :程序设计原理与模式分类综述 软件设计模式 : 设计模式的汇总 良好的编程原则 我希望在我一开始学习编码的时候就能得到的一些建议 — Free Code Camp : 从教别人处学到的东西 在计算机科学专业应该知道什么 :良好的编程规范 软件开发者的工作 : Henrik Warne的博客 编码风格 Airbnb JS 风格指南 : 写JavaScript最好的方式 Airbnb Ruby 风格指南 : Airbnb的ruby风格指南 Ruby 编码风格指南 : 社区驱动的Ruby编码风格指南 Angular 1 风格指南 : 官方认可的风格指南，作者John Pappa CS 106B 编码风格指南 : 代码臃肿者必看 调试问题 :检查如何调试程序 CS课程目录(许多在线讲座) : 另一个在线CS课程 在线CS课程目录 : 免费的在线CS课程 优秀的 C 编码习惯 • /r/C_Programming google C++ 编码风格 怎样高效的报告Bug 建议初学者避免使用的坏的编码习惯? PEP8 - Python编码风格指南 标准 JS 风格指南 : JavaScript风格指南 Google Python 风格指南 Aurelia 风格指南 通用工具 CodePad : 远程面试工具 CodePen : 基于浏览器共享前端代码的地方 Devicons : 免费图标汇总 regex101 : 在线正则表达式测试和调试，国内也有不少 regexr : 另一个在线学习、测试正则表达式的工具 Wit AI :帮助开发者灵活的控制应用，适合没有移动端开发经验的用户 bash和shell脚本 Advanced Bash-Scripting Guide :对shell脚本艺术的深入挖掘 Bash Guide for Beginners :对新手的bash使用指南 Bash编程 Bash参考手册 Bash指南 Conquering the Command Line : 针对开发者的Unix和Linux命令 面试准备 /r/cscareerquestions : 这是一个非常大的面试问题列表是我在为4大面试时用到的，我认为对大家也是有用的 10个最频繁的SQL查询面试问题 逻辑题答案汇总 算法设计流程 资质问题与答案 : Quant and aptitude preparation 一个技术面试题，逻辑题等的站点 : 各种让你思考的东西 BeehYve :各种学生需要的资源 面试准备时的链接的汇总 • /r/cscareerquestions 算法复杂度笔记 大家的误解 位操作技巧 ChiperSoft/InterviewThis : 在面试期间问到对公司的了解的问题 Code Project : 面向开发人员 Java核心面试问题 - 每个主题的面试题 一些有趣的C问题 CS9: CS技术面试中的问题解决 优秀的逻辑题 确定不同循环的时间复杂度? :在stackoverflow上的一些好问题包括计算时间复杂度. 5个基本的电话面试问题 - steveyegge2 新人面试 GeeksforGeeks | 针对geek的计算机科学入门 : 订阅他们获取新文章 准备学习SQL篇：用语言描述一下数据库规范化 - Essential SQL https://github.com/odino/interviews : 面试重要问题列表 让你的简历改头换面 技术面试指南 如何为技术面试做准备• /r/cscareerquestions 怎样进行算法面试 怎样进行自我介绍 | The Art of Manliness 如何回答最棘手的40个面试问题| ICS Job Portal 如何进入科技企业-求职和面试指南 怎样面试 怎样准备一个面试 - 1 IIT Delhi 实习经验 : samwincott/Internship-Guide : 与实习相关的链接汇总 华尔街面试 面试架构 - Java Honk 工作面试：如何做好求职面试|展示个人魅力 求职面试新闻、视频、评论和八卦 - Lifehacker 求职面试问题和最佳答案 kimberli/interviews : 面试学习表格 Mission-peace/interview problems : 一个大的编码面试的问题的汇总 软件工程师面试实践平台 :与真正的同行进行编程交流 Problems | LeetCode OJ : 针对面试的编码训练 程序员和软件面试问答 Reddit.com/user/ashish2199/m/puzzles : Reddit逻辑题 SQL面试问题 : 好的SQL测试 使用韦恩图进行SQL连接 svozniuk/java-interviews : Java面试题 25个最难的HR问题 面试10大算法 Unix／Linux笔记 为求职者和雇主提供的建议 通过动画可视化数据结构和算法 We Help Coders Get Hired : 提供系统设计，面试策略，软件技能等的web站点 你的问题是什么? 为何你会赚钱少 • /r/cscareerquestions wu :: riddles(hard) : 逻辑题 夏季实习：最终篇 求职面试问题和最好的答案 Java面试问题与答案 编程语言概念 课堂笔记 : 面向对象概念和编程语言概念 系统设计面试 一个站点提供技术面试题，逻辑题或者你想的其他内容 前端常见面试题汇总 纪录片 什么都能问 Gayle Laakmann McDowell (程序员面试宝典的作者) Breaking the Code: Alan Turing传 攻破代码面试 攻破代码面试-全栈开发演讲者系列 书呆子的胜利 : Play-list 哈佛大学 CS50 - 渐进学习 (视频) cpu如何执行程序(视频) 机器代码指令(视频) 机器改变世界 - 关于计算机历史的纪录片 Part 1: 巨大的大脑 Part 2: 发现未来 Part 3: 台式计算机 Part 4: 机器的思考 Part 5: 指尖上的世界 机械计算机(All Parts) : 20世纪50年代的一个视频，说明了在没有现代电子的情况下机械计算机是如何工作的 Project Code Rush - netscape/mozilla起源的纪录片 自学计算机科学 Linux的故事 Download: 互联网的真实故事 : 发现频道关于浏览器战争和互联网泡沫的记录 Linux操作系统的故事 学习新知识-mooc 课程中心 : 超过10万名学生评价的目录 计算机科学资源 : 针对自学者的mooc列表 Coursera.org :在网上学习全世界最好的课程 CS50 edX : 免费在线课程，帮助你进步，改善你的生活 Kadenze | Creative Programming: 注重艺术和创造力的编程课 麻省理工学院电气工程和计算机科学 MOOC.fi : 赫尔辛基大学在线课程 NPTEL Vidoes COMP_SCI_ENGG prakhar1989/awesome-CS-courses : CS课程大汇总 Udacity UCBerkeley 网上CS课程的收集 极客教程 与你偏爱的编程语言相关的网站(对我来说是Java) 学习java的最好的书 : Java基础 Bjarne Stroustrup\u0026rsquo;s C++风格和技术问答 : C++问答 Bjarne Stroustrup\u0026rsquo;s FAQ : The C++ FAQ C++11 -新的ISO C++ 标准 : C++11问答 编译器(视频) 深入Java：垃圾回收! 免费在线的章节用来学习java虚拟机 垃圾搜集如何工作 算法、数据结构、面试问题和答案的实现 IntelliJ键盘快捷键 :使用IntelliJ的键盘快捷键用来提高生产力 Java Corner at Artima.com Java课程笔记 Java堆 Java-source : Java开源软件 Java Visualizer : 帮助将引用，值，变量可视化 JournalDev - Java, Java EE, Android, Web Development Tutorials Learning Java:一个免费的在线学习Java语言的教材 Netbeans的键盘快捷键 : 键盘快捷键能够使你在工作时提高生产力 搜索开源的Java API : 浏览Java库的源代码，并且学习如何实现 C++编程语言 : C++编程语言 Java内存模型 The Java™ Tutorials : 最好的Java手册 理解JVM 垃圾回收是什么 : 动态垃圾搜集 Welcome to JavaWorld.com XyzWs Java FAQs : Java面试题汇总 AI学习 fast.ai : 针对没有研究生水准的数学的开发者的免费实用的深度学习课程 grakn.ai : 数据库AI Robots that learn : 机器人学习 无监督神经元 AI、机器学习、深度学习的不同 TensorFlow : 一个针对机器智能的软件开源库 Scikit-learn : 一个针对机器学习的Python模块 DeepLearning.ai : 深度学习课程，作者coursera的创建者，吴恩达 深度学习的历史 Serpent AI : 游戏代理框架 研讨会、研究性写作、会谈等 关于研究和写作的建议 博士论文 在会议上讨论的实用技巧 研讨会和报告 Latex参考 Begin Latex in minutes : 针对初学者的Latex的简单介绍帮助你轻松掌握Latex Lshort : 对Latex2的详细介绍 知识汇总 reddit.com/user/ashish2199/m/cs_student_subs : 在reddits中计算机科学和编程相关的主题 一个程序员应该访问的web站点 :发表在Quora上，作者ashish2199 Moocha : 从edx、coursera、udacity等搜索在线课程 Rico\u0026rsquo;s cheatsheets : 常用知识备忘集合 API Documentation : 一个众所周知的带有搜索接口的API文档，类似于dash youtube频道 C++Now (BoostCon) :当前的C++会议 code::dive conference : 有诺基亚技术中心组织的会议 Coding Blocks : 指南，技巧 Computerphile : 每个CS学生都应该看 ComputerHistory : 针对那些想知道如何达成目标的人 CppCon : C++会议 Facebook Developers Fun Fun Function : 每周一次的对编程主题的分类，也包括一些与编码不直接相关的内容 Google Developers GoogleTechTalks : 关于热门话题的视频和在技术界的一些趣事 Gynvael Coldwin :逆向工程和黑客（CTF）博客，每周三都有新的直播 HowToBecomeTV : 与技术界相关的开发人员的好的面试 Java : 有关Java的会谈 JavaOne : Java会议 Meeting C++ YT Kanalseite : C++会议 Netflix UI Engineering : web开发者，移动开发者和对Netflix技术栈感兴趣的视频 O\u0026rsquo;Reilly : 世界最佳技术作家访谈录 Placement Grid : 面试及校园实习经验 Scott Meyers: Past Talks Siraj Raval : AI和深度学习指南视频 ThinMatrix : 开发者在java中使用OpenGL制作的一个3D游戏的博客和指南 thoughtbot : 谈论各种话题 yegor256 好文章 白话40个关键的计算机科学概念 关于图论的一个介绍 一个对程序员友好的语言 软件开发者的阅读列表 : 这是一些好书和链接 关于TCP/IP协议栈的代码: 编写一个TCP/IP的协议栈，5:TCP重传 代码的转换:语言的选择 数据结构与算法:一些算法和数据结构的解决方案 深入字节码 初级开发者的想法 Linux内核 算法清单 提升编码技巧的关键 Unicode编码 我们正在通过创新重塑零售业 每个程序员都需要知道的关于在文本中设置编码和字符的内容 每个程序员都应该了解的关于内存的内容-pdf 为什么网页的快速加载是很重要的:为什么一个APP的速度决定了其收入 qotoqot-提升技巧:我是如何一个月工作200个小时的 Pixel Beat - Unix:使用unix工具并行处理 学习Vim:我希望我应该知道什么 播客 Coding Blocks:一个播客，涵盖最佳编程实践，设计模式，性能编码，面向对象编码，数据库设计和实现、提示、技巧和许多其他主题的内容 水深火热的开发者:一个播客，分享开发人员的人性，并讲述了由Dave Rael主持的一些令人惊叹的软件人物的故事 开发者茶话会 : 开发者在喝茶小憩时浏览的播客 前端的欢乐时光:来自Netflix，Evernote，Atlassian＆LinkedIn的软件工程师小组，讨论关于前端开发的所有事情的一个博客。 无线电的所有流程:包括从产品设计和用户体验到单元测试和系统管理。 Groovy播客:专用于Groovy编程语言及其生态系统的播客。 IPhreaks:每周讨论一次关于iOS开发和开发中的最新技术，具体讨论苹果，工具，做法 和代码 JavaScript 论坛:每周一次关于JavaScript，前端开发，社区，职业和框架的讨论。 用我的播客学习代码:以一个季为一集的科技播客，是由劳伦斯·布拉德福德（Laurence Bradford）主持，从科技职业到科技业务的课程 MS示例展示:Jason Young和Carl Schweitzer谈到有关Azure云，Windows，Windows Phone，Visual Studio以及使用Microsoft平台的跨平台开发等最新的开发者新闻 React Native Radio:每周讨论使用JavaScript和React构建移动应用程序的工具，技术和技术 软件工程日报:关于软件主题的日常技术面试 软件工程无线电:针对专业软件开发人员的播客，目标是成为一个持久的教育资源而不是新闻 语法 :对Wes Bos＆Scott Tolinski和Web开发人员来说是一个比较有趣的博客 The Bike Shed :参与者讨论他们的开发经验和Ruby，Rails，JavaScript等的挑战 The Change log : 每周一次的谈话，参与者都是开源技术的核心人员和创建者 愤世嫉俗的开发者 :一个播客，旨在通过解释最新和最伟大的开发技术，为您提供开发知识和职业生涯，并提供您作为开发人员取得成功的需要。覆盖桌面，网络和移动开发，主要围绕.Net堆栈，也经常研究其他软件和框架 构建一个简单的编译器/解释器 snowman：可能是有史以来最小的编译器 : 这是一个超简化的例子，它描述了一个使用JavaScript编写的易于阅读的 现代编译器的所有主要部分 精彩的编译器 : 编译器，翻译和运行的精彩资源列表 提升一个编译器 : 了解如何提升一个编译器 一起开发一个简单的解释器-第一章 : 尝试通过构建一个编译器，揭开它的神秘面纱 业余编译器开发者的资源 : 业余编译器开发者的资源 计算机程序的构造与解释 : 计算机程序的结构和解释 我开发的第一个编译器 : 写出你的第一个编译器 编译器简介 : 如何与计算机说话，例如Siri先生 编写自己的编译器 : 如何编写自己的编译器 教程 A Hacker\u0026rsquo;s Guide to Git : 为那些想学习git的人打下坚实的基础 Best Of - Gustavo Duarte : 包含各种主题的文章 CMSI 281: Data Structures : 针对数据结构的轻量级的说明 Collecting all the cheat sheets : 大量编程语言的接口表 C Programming C编程语言常见问题 Data Structures and Algorithms by John Morris : 代码和其分析的另一个好的来源 深入学习C语言 : 关于C语言的一个很好的演示 设计模式：可重用面向对象的软件的基础 : aka the \u0026ldquo;Gang Of Four\u0026rdquo; book, or GOF Dynamic programming - PrismoSkills : 学习如何解决动态规划问题 Git从入门到精通 Head First Design Patterns How to Program in C++ : 怎样学习C++编程，关于学习C++和STL的好资源 http://www.mysqltutorial.org/ indradhanush tutotials : 写一个Unix核 Introduction to C Programming 10分钟搞定UNIX Learning the shell. Linux Journey : 学习Linux的好站点 Linux Tutorial : 学习Linux的好资源 More about Github-flavored markdown MySQL Essentials Open Data Structures : 用来学习数据结构和算法的优秀的资源提供了C++ , Java等各种语言的伪代码 OS Course Notes : Galvin\u0026rsquo;s书的章节笔记 从新手到专家-编程、web开发、DevOps新闻，教程和工具 SQL (Structured Query Language) in one page : SQL.SU : 结构化查询语言，一个非常好的SQL记录表 Subtle | Poor Man\u0026rsquo;s CI : 了解连续集成平台如何工作，通过使用Node.js构建您自己的git之一 TCP/IP图解 The Bash Guide : 学习Bash Shell的优秀教程 The Descent to C : 针对那些从高级编程语言像java或者python迁移到C的人 The Linux 命令行: yige完整介绍 The Unix环境编程 TopCoder Tutorials Tutorialspoint : UPSC，IAS，PCS，公务员，银行，能力，问题，答案，解释，面试，入学考试，解决方案的文本和视频教程 UNIX和Linux系统管理员手册 第四版 VimTutor+ : 从浏览器上学习VIM W3Schools在线Web教程 Unix Shell : ksh / bash的Unix shell脚本 Snap SVG : 现代Web的JavaScript SVG库 vim.rtorr : Vim Cheat Sheet Open Vim : 交互式Vim教程 Algorithm Using Dynamic Programming and A : 使用动态编程和A*设计树差分算法 Learn Python : 免费的交互式Python教程 C++17 : C ++指南17 欣赏他人的代码 LiveEdu.tv : 构建应用，网站游戏等人的视频 Twitch.tv : Twitch的编程社区 一个程序员应该知道的东西 GitHub.com Build software better, together : 向其他人展示你的项目和与人协作的地方（为了更高效的使用它必须知道Git） Gitlab提供无限制的私有库，和无限制的组织 程序员能力矩阵 : 一篇用来了解我们作为程序员的水平的文章 编程比赛 Archived Problems - Project Euler : 问题归档 Art of Problem Solving : 数学课对你来说太容易了吗？你来到正确的地方！ CodeChef : 唯一的编程比赛Web 2.0平台 Codefights : 测试你的编码技巧 Codeforces : 编程竞赛，在线计算机编程 Codewars : 根据完成代码排名 Codility : 验证和提高编码技能 Codingame : 通过游戏和挑战学习编码！ Google Code Jam Practice and : 过去比赛的练习题 HackerEarth - Programming challenges and Developer jobs HackerRank : 实践编码、竞争、找工作 PKU ACM ICPC Practice problems : ACMACPC 在线审核 Sphere Online Judge (SPOJ) : 成为一名真正的编程硕士学习如何编写和构建高效的算法 Topcoder : 通过更多的包为代码提供更快的速度 UVa Online Judge : 支持多种语言的数百种问题 WakaTime : 通过编辑器插件收集编码度量的排行榜 计算机书籍 Become a Programmer, Motherfucker (list of books) :来自Zed A. Shaw的书籍详尽清单 最佳图书奖 cses.fi/book.html github.com/vhf/free-programming-books : 超过500本免费电子书几乎包括你能想到的所有语言 GitBook : GitBook 可以帮助您的团队在线编写，协作和发布内容 Data Science course : Python数据科学手册 视频指南 codedamn : 前端Web开发教程 代码学院 : PluralSight公司和一个有抱负和有经验的开发人员的互动学习的地方 CodingMadeEasy : C ++教程 CS1: Higher Computing - Richard Buckland UNSW : 一个很好的介绍性的CS课程 Derek Banas : 优质的教程 算法的设计与分析 DevTips : web开发教程 Kathryn Hodge : 为初学者提供好视频 mycodeschool : 数据结构和算法教程 Pluralsight :通过多个短期课程学习软件开发，DevOps和数据科学 thenewboston : 课程很好但是与实际内容相比有点啰嗦 Tushar Roy : 印度Youtuber的算法和数据结构教程 Vim Tutorial Videos - Flarfnoogins : 用于学习Vim好的视频教程 XDA-University - Helping You Learn Android Development:帮助您学习Android开发 Khan Academy : 免费学习计算机科学 Functional programming : John Carmack功能编程（2013） Video about vims : 关于Vim的一系列教程 在线编译和共享代码片段 CodePad : 支持代码编写，测试和运行，支持超过25种语言 Codesandbox.io : CodeSandbox可以更轻松地创建，与他人共享和重用React项目 Godbolt.org : 一款非常优秀的工具用来探索在不同编译器没有优化时的输出 Ideone.com : 用于60多种编程语言的在线编译和调试工具 JSFiddle : 在线测试你的javascript，CSS，HTML或者CoffeeScript Pastebin.com C9.io : 在云端的开发环境 Github Gist : 即时分享代码，笔记和片段 开发者博客 Algo-Geeks : 编程拼图，数学技巧，算法等 Antirez - Redis Creator\u0026rsquo;s blog : Antirez的博客 Antonio081014\u0026rsquo;s Algorithms Codes : RULE下的世界 Archives — Ask a Manager : 人力资源相关的东西 Armin Ronacher\u0026rsquo;s Thoughts and Writings : 关于Python和开源的博客 blog.might.net : might dot net的博客 Brendon Gregg - Linux Kernel Dev : Brendon D. Gregg博客 Clean Coder Blog : 《代码整洁之道》一书作者的博客 CodeAhoy : 软件和人为因素的博客，100％测试人类 CoderGears Blog Insights from : the CoderGears Team Coding Geek - A blog about IT, programming and Java : 关于IT，编程和Java的博客 Coding Horror : 一个最好的编码博客 CSE Blog : 量子，数学，计算机科学难题 Daedtech.com : 有关软件的故事 Dan Dreams of Coding Daniel Lemire\u0026rsquo;s Blog : Daniel Lemire的博客 Eli Bendersky : 从Python到LLVM的一切 Geek Land : 我珍贵的收藏品 HackerEarth Blog : 黑客博客 IT Enthusiast : IT热衷者 Joel on Software : StackOverflow首席执行官的博客 Late Developer : 一个老C ++人的随机想法 1ucasvb\u0026rsquo;s laboriginal math and physics visualization : Lucas Vieira Barbosa的实验室原始数学和物理可视化 Math ∩ Programming : Math ∩ Programming My Tech Interviews : 准备技术访谈 Paul Graham Essays : Paul Grahan Essays Programming Blog : Yegor Bugayenko的编程博客 Programming in the 21st Century : 二十一世纪的编程 rudhakar Rayavaram : Sudhakar Rayavaram博客 Runhe Tian Coding Practice : 苹果，谷歌，Facebook，亚马逊和微软的技术面试问题 Small Programming Challenges and Puzzles : Nayuki项目 Stephen Haunts { Coding in the Trenches } : 软件开发，架构和技术领导力 stevehanov.ca : 我知道如何在线制作和销售软件，我可以和你分享我的提示 Takipi Blog : 主要关注Java和JVM语言 WildMl : 机器学习博客 XDA - Android Developer Forum : Android开源开发者论坛 用来提高你的英语 Englishclub.com/learn-english 语法和写作指南 : 对于那些想提高英语语言能力的人 标点符号和字母大小写规则 PPurdue大学在线写作实验室 Quia - English 当你厌倦了CS相关的东西 Barcroft TV : 构成世界的各种各样的人的短小的纪录片 Big Think : 专家驱动，可操作的教育内容，包括比尔·克林顿到比尔·奈 ColdFusion : 过去的当前的以及未来的技术 CrashCourse : 各种科目的小班课程 Every Frame a Painting : 高质量的电影分析 National Geographic 来自世界各地的高品质内容 r/ProgrammerHumor : Subreddit 用于听什么像什么 Reddit the front page of the internet : 适合有大把空闲时间的人 Ridddle : 关于科学的YouTube频道，主要是但不仅仅是宇宙和空间 SciShow : 有关您一直想知道的有趣问题的答案 SmarterEveryDay : 关于我们周围世界的许多惊人的科学信息，通常用高速摄像机 TED : 谈论技术，娱乐和设计 TestTube News : 有关世界各地新闻的有趣信息 Reddit the front page of the internet : 适合有大把空闲时间的人 How to live for long time ? : 长寿的秘密 Vsauce : 最好的YouTube频道 Ox A cuk : 如何过幸福的生活 lonelyspeck : 关于轻污染天文摄影的权利的曝光 - Palos Verdes，洛杉矶，加利福尼亚州 开源网站 Open Hatch : OpenHatch是一个非营利组织，致力于将潜在的免费软件贡献者与社区，工具和教育相匹配 Source Forge : SourceForge主持着近28万个项目（最后一次）。它每天提供超过200万次下载，并包含各种类别的应用程序和工具 Google Code : Google使用Subversion或Mercurial版本控制系统为开源项目提供免费托管服务。它提供2GB的存储，集成的代码审查工具，维基和问题跟踪。 Google Code网站还提供了Google许多公开API和其他开发人员工具的链接。 Launch Pad :由Canonical、LaunchPad维护，特别针对在Ubuntu上运行的项目。它为超过21,000个使用Bazaar版本控制系统的项目提供托管 Google Open Source : Google开源 Red Hat Developer : 全球领先的开源解决方案提供商 Open Source : 开源 Google Summer of Code : Google Summer of Code是一项全球性计划，致力于将更多的学生开发人员引入开源软件开发。学生在休学期间，用户3个月与一个开源组织合作完成的编程项目 Open Source Web Design : 开源网页设计是一个共享符合标准的免费网页设计模板的平台。我们通过良好的设计给网络发布商一个通知 Mozilla Winter of Security : 安全冬季（MWOS）是由Mozilla安全小组组织的一个计划：让学生参与安全项目，学生必须执行一个学期项目作为大学课程的一部分，可以选择其中一个MWOS项目 Eclipse Lab : Eclipse Labs是一个基于Eclipse平台构建技术的开源项目社区。它提供开源项目通常需要的基础架构服务，如代码存储库，错误跟踪，项目网站/ wiki。 Eclipse Labs由Google Code Project Hosting托管，所以对于已经使用Google Code Project Hosting的开发人员来说，这将非常熟悉 Bit Bucket : 像GitHub一样，BitBucket也承载了公共和私人项目。在这个网站上，少于五个用户的开源项目和私人项目是免费的。它拥有超过48,000个存储库，其中许多存储库可在现场进行搜索site. Media Wiki : MediaWiki是一款用PHP编写的免费软件开源维基软件包，最初用于维基百科。现在也被非营利维基媒体基金会和许多其他维基的其他项目使用，包括这个网站，MediaWiki的主页 Code Curiosity : CodeCuriosity是一个鼓励开放源代码的平台，无论项目是大还是小，每个人都为自己的努力而获得回报 Code Triage : 帮助完成您最喜欢的开源项目，并在开发过程中成为更好的开发人员 Issue Hub : 贡献于开源。搜索问题标签为您找到正确的项目 Up for Grabs : 这是一个专门为新贡献者策划的项目的列表。这些是开始使用项目的好方法，或是帮助分享开源项目的负担。 First Timers Only : 首次对开放源码做出贡献可能是可怕的，有点压倒性。也许你是一个代码新手，或者你已经编码了一段时间，但还没有找到一个你觉得自己很有帮助的项目 Your First PR : 您的第一个公关帮助在GitHub和其他地方展示最佳启动器问题为开源做贡献 特别感谢 如果您发现这很有用或考虑也参与并作出贡献，请考虑一个github Star。 特别感谢Ashish Padalkar（@ ashish2199）为初始版本原始帖子贡献了大量的数据和结构。 Maintained with ❤️ by sdmg15 \u0026amp; al\n下一篇\n### Go资源大全\n","permalink":"https://www.plbear.com/posts/cheng-xu-yuan-ying-gai-fang-wen-de-zui-jia-wang-zhan-zhong-wen-ban/","summary":"\u003ch1 id=\"awesome\"\u003eawesome\u003c/h1\u003e\n\u003ch1 id=\"程序员应该访问的最佳网站中文版原版\"\u003e程序员应该访问的最佳网站中文版\u003ca href=\"https://github.com/sdmg15/Best-websites-a-programmer-should-visit\"\u003e原版\u003c/a\u003e\u003c/h1\u003e\n\u003cp\u003e一些对程序员有用的网站\u003c/p\u003e\n\u003cp\u003e在学习CS的时候有一些你必须知道的有用的站点来获取通知为了你的技术储备和学习新知识。这里是一个你应该访问的不是非常全面的一些站点的列表，这个列表会不断更新，只要我能得到链接，你也可以通过添加你知道的来为此做出贡献\u003c/p\u003e","title":"程序员应该访问的最佳网站中文版"},{"content":"Contents Awesome Go Contents Audio and Music Authentication and OAuth Blockchain Bot Building Build Automation Command Line Advanced Console UIs Standard CLI Configuration Continuous Integration CSS Preprocessors Data Structures and Algorithms Bit-packing and Compression Bit Sets Bloom and Cuckoo Filters Data Structure and Algorithm Collections Iterators Maps Miscellaneous Data Structures and Algorithms Nullable Types Queues Sets Text Analysis Trees Pipes Database Caches Databases Implemented in Go Database Schema Migration Database Tools SQL Query Builders Database Drivers Interfaces to Multiple Backends Relational Database Drivers NoSQL Database Drivers Search and Analytic Databases Date and Time Distributed Systems Dynamic DNS Email Embeddable Scripting Languages Error Handling File Handling Financial Forms Functional Game Development Generators Geographic Go Compilers Goroutines GUI Hardware Images IoT (Internet of Things) Job Scheduler JSON Logging Machine Learning Messaging Microsoft Office Microsoft Excel Miscellaneous Dependency Injection Project Layout Strings Uncategorized Natural Language Processing Language Detection Morphological Analyzers Slugifiers Tokenizers Translation Transliteration Networking HTTP Clients OpenGL ORM Package Management Performance Query Language Resource Embedding Science and Data Analysis Security Serialization Server Applications Stream Processing Template Engines Testing Text Processing Formatters Markup Languages Parsers/Encoders/Decoders Regular Expressions Sanitation Scrapers RSS Utility/Miscellaneous Third-party APIs Utilities UUID Validation Version Control Video Web Frameworks Middlewares Actual middlewares Libraries for creating HTTP middlewares Routers WebAssembly Windows XML Zero Trust Code Analysis Editor Plugins Go Generate Tools Go Tools Software Packages DevOps Tools Other Software Resources Benchmarks Conferences E-Books E-books for purchase Free e-books Gophers Meetups Style Guides Social Media Twitter Reddit Websites Tutorials ⬆ back to top\nAudio and Music Libraries for manipulating audio.\nflac - Native Go FLAC encoder/decoder with support for FLAC streams. gaad - Native Go AAC bitstream parser. GoAudio - Native Go Audio Processing Library. gosamplerate - libsamplerate bindings for go. id3v2 - ID3 decoding and encoding library for Go. malgo - Mini audio library. minimp3 - Lightweight MP3 decoder library. music-theory - Music theory models in Go. Oto - A low-level library to play sound on multiple platforms. PortAudio - Go bindings for the PortAudio audio I/O library. ⬆ back to top\nAuthentication and OAuth Libraries for implementing authentications schemes.\nauthboss - Modular authentication system for the web. It tries to remove as much boilerplate and \u0026ldquo;hard things\u0026rdquo; as possible so that each time you start a new web project in Go, you can plug it in, configure, and start building your app without having to build an authentication system each time. branca - branca token specification implementation for Golang 1.15+. casbin - Authorization library that supports access control models like ACL, RBAC, ABAC. cookiestxt - provides parser of cookies.txt file format. go-email-normalizer - Golang library for providing a canonical representation of email address. go-guardian - Go-Guardian is a golang library that provides a simple, clean, and idiomatic way to create powerful modern API and web authentication that supports LDAP, Basic, Bearer token and Certificate based authentication. go-jose - Fairly complete implementation of the JOSE working group\u0026rsquo;s JSON Web Token, JSON Web Signatures, and JSON Web Encryption specs. gologin - chainable handlers for login with OAuth1 and OAuth2 authentication providers. gorbac - provides a lightweight role-based access control (RBAC) implementation in Golang. goth - provides a simple, clean, and idiomatic way to use OAuth and OAuth2. Handles multiple providers out of the box. jeff - Simple, flexible, secure and idiomatic web session management with pluggable backends. jwt - Lightweight JSON Web Token (JWT) library. jwt - Safe, simple and fast JSON Web Tokens for Go. jwt-auth - JWT middleware for Golang http servers with many configuration options. loginsrv - JWT login microservice with plugable backends such as OAuth2 (Github), htpasswd, osiam. oauth2 - Successor of goauth2. Generic OAuth 2.0 package that comes with JWT, Google APIs, Compute Engine and App Engine support. osin - Golang OAuth2 server library. otpgen - Library to generate TOTP/HOTP codes. otpgo - Time-Based One-Time Password (TOTP) and HMAC-Based One-Time Password (HOTP) library for Go. paseto - Golang implementation of Platform-Agnostic Security Tokens (PASETO). permissions2 - Library for keeping track of users, login states and permissions. Uses secure cookies and bcrypt. rbac - Minimalistic RBAC package for Go applications. scope - Easily Manage OAuth2 Scopes In Go. scs - Session Manager for HTTP servers. securecookie - Efficient secure cookie encoding/decoding. session - Go session management for web servers (including support for Google App Engine - GAE). sessions - Dead simple, highly performant, highly customizable sessions service for go http servers. sessionup - Simple, yet effective HTTP session management and identification package. sjwt - Simple jwt generator and parser. ⬆ back to top\nBlockchain Tools for building blockchains.\ncosmos-sdk - A Framework for Building Public Blockchains in the Cosmos Ecosystem. go-ethereum - Official Go implementation of the Ethereum protocol. gossamer - A Go implementation of the Polkadot Host. solana-go - Go library to interface with Solana JSON RPC and WebSocket interfaces. tendermint - High-performance middleware for transforming a state machine written in any programming language into a Byzantine Fault Tolerant replicated state machine using the Tendermint consensus and blockchain protocols. ⬆ back to top\nBot Building Libraries for building and working with bots.\nechotron - An elegant and concurrent library for Telegram Bots in Go. ephemeral-roles - A Discord bot for managing ephemeral roles based upon voice channel member presence. go-chat-bot - IRC, Slack \u0026amp; Telegram bot written in Go. go-joe - A general-purpose bot library inspired by Hubot but written in Go. go-sarah - Framework to build bot for desired chat services including LINE, Slack, Gitter and more. go-tgbot - Pure Golang Telegram Bot API wrapper, generated from swagger file, session-based router and middleware. go-twitch-irc - Library to write bots for twitch.tv chat Golang CryptoTrading Bot - A golang implementation of a console-based trading bot for cryptocurrency exchanges. govkbot - Simple Go VK bot library. hanu - Framework for writing Slack bots. Kelp - official trading and market-making bot for the Stellar DEX. Works out-of-the-box, written in Golang, compatible with centralized exchanges and custom trading strategies. larry - Larry 🐦 is a really simple Twitter bot generator that tweets random repositories from Github built in Go. margelet - Framework for building Telegram bots. micha - Go Library for Telegram bot api. olivia - A chatbot built with an artificial neural network. slack-bot - Ready to use Slack Bot for lazy developers: Custom commands, Jenkins, Jira, Bitbucket, Github\u0026hellip; slacker - Easy to use framework to create Slack bots. slackscot - Another framework for building Slack bots. tbot - Telegram bot server with API similar to net/http. telebot - Telegram bot framework written in Go. telego - Telegram Bot API library for Golang with full one-to-one API implementation. telegram-bot-api - Simple and clean Telegram bot client. teleterm - Telegram Bot Exec Terminal Command. Tenyks - Service oriented IRC bot using Redis and JSON for messaging. wayback - A bot for Telegram, Mastodon, Slack, and other messaging platforms archives webpages. ⬆ back to top\nBuild Automation Libraries and tools helping with build automation.\n1build - Command line tool to frictionlessly manage project-specific commands. anko - Simple application watcher for multiple programming languages. gaper - Builds and restarts a Go project when it crashes or some watched file changes. gilbert - Build system and task runner for Go projects. goyek - Create build pipelines in Go. mage - Mage is a make/rake-like build tool using Go. mmake - Modern Make. realize - Go build system with file watchers and live reload. Run, build and watch file changes with custom paths. Task - simple \u0026ldquo;Make\u0026rdquo; alternative. taskctl - Concurrent task runner. ⬆ back to top\nCommand Line Advanced Console UIs Libraries for building Console Applications and Console User Interfaces.\nasciigraph - Go package to make lightweight ASCII line graph ╭┈╯ in command line apps with no other dependencies. aurora - ANSI terminal colors that supports fmt.Printf/Sprintf. box-cli-maker - Make Highly Customized Boxes for your CLI. cfmt - Contextual fmt inspired by bootstrap color classes. cfmt - Simple and convenient formatted stylized output fully compatible with fmt library. chalk - Intuitive package for prettifying terminal/console output. colourize - Go library for ANSI colour text in terminals. ctc - The non-invasive cross-platform terminal color library does not need to modify the Print method. go-ataman - Go library for rendering ANSI colored text templates in terminals. go-colorable - Colorable writer for windows. go-colortext - Go library for color output in terminals. go-isatty - isatty for golang. go-prompt - Library for building a powerful interactive prompt, inspired by python-prompt-toolkit. gocui - Minimalist Go library aimed at creating Console User Interfaces. gommon/color - Style terminal text. gookit/color - Terminal color rendering tool library, support 16 colors, 256 colors, RGB color rendering output, compatible with Windows. marker - Easiest way to match and mark strings for colorful terminal outputs. mpb - Multi progress bar for terminal applications. progressbar - Basic thread-safe progress bar that works in every OS. pterm - A library to beautify console output on every platform with many combinable components. simpletable - Simple tables in terminal with Go. spinner - Go package to easily provide a terminal spinner with options. tabby - A tiny library for super simple Golang tables. table - Small library for terminal color based tables . tabular - Print ASCII tables from command line utilities without the need to pass large sets of data to the API. termbox-go - Termbox is a library for creating cross-platform text-based interfaces. termdash - Go terminal dashboard based on termbox-go and inspired by termui. termenv - Advanced ANSI style \u0026amp; color support for your terminal applications. termui - Go terminal dashboard based on termbox-go and inspired by blessed-contrib. uilive - Library for updating terminal output in realtime. uiprogress - Flexible library to render progress bars in terminal applications. uitable - Library to improve readability in terminal apps using tabular data. yacspin - Yet Another CLi Spinner package, for working with terminal spinners. ⬆ back to top\nStandard CLI Libraries for building standard or basic Command Line applications.\nacmd - Simple, useful and opinionated CLI package in Go. argparse - Command line argument parser inspired by Python\u0026rsquo;s argparse module. argv - Go library to split command line string as arguments array using the bash syntax. carapace - Command argument completion generator for spf13/cobra. carapace-bin - Multi-shell multi-command argument completer. carapace-spec - Define simple completions using a spec file. cli - Feature-rich and easy to use command-line package based on golang struct tags. cli - Simple and complete API for building command line interfaces in Go. climax - Alternative CLI with \u0026ldquo;human face\u0026rdquo;, in spirit of Go command. clîr - A Simple and Clear CLI library. Dependency free. cmd - Extends the standard flag package to support sub commands and more in idiomatic way. cmdr - A POSIX/GNU style, getopt-like command-line UI Go library. cobra - Commander for modern Go CLI interactions. command-chain - A go library for configure and run command chains - such like pipelining in unix shells. commandeer - Dev-friendly CLI apps: sets up flags, defaults, and usage based on struct fields and tags. complete - Write bash completions in Go + Go command bash completion. Dnote - A simple command line notebook with multi-device sync. elvish - An expressive programming language and a versatile interactive shell. env - Tag-based environment configuration for structs. flag - Simple but powerful command line option parsing library for Go supporting subcommand. flaggy - A robust and idiomatic flags package with excellent subcommand support. flagvar - A collection of flag argument types for Go\u0026rsquo;s standard flag package. go-andotp - A CLI program to encrypt/decrypt andOTP files. Can be used as library as well. go-arg - Struct-based argument parsing in Go. go-commander - Go library to simplify CLI workflow. go-flags - go command line option parser. go-getoptions - Go option parser inspired on the flexibility of Perl’s GetOpt::Long. gocmd - Go library for building command line applications. hiboot cli - cli application framework with auto configuration and dependency injection. job - JOB, make your short-term command as a long-term job. kingpin - Command line and flag parser supporting sub commands (superseded by kong; see below). liner - Go readline-like library for command-line interfaces. mitchellh/cli - Go library for implementing command-line interfaces. mow.cli - Go library for building CLI applications with sophisticated flag and argument parsing and validation. ops - Unikernel Builder/Orchestrator. pflag - Drop-in replacement for Go\u0026rsquo;s flag package, implementing POSIX/GNU-style \u0026ndash;flags. sand - Simple API for creating interpreters and so much more. sflags - Struct based flags generator for flag, urfave/cli, pflag, cobra, kingpin and other libraries. strumt - Library to create prompt chain. subcmd - Another approach to parsing and running subcommands. Works alongside the standard flag package. ts - Timestamp convert \u0026amp; compare tool. ukautz/clif - Small command line interface framework. urfave/cli - Simple, fast, and fun package for building command line apps in Go (formerly codegangsta/cli). wlog - Simple logging interface that supports cross-platform color and concurrency. wmenu - Easy to use menu structure for cli applications that prompts users to make choices. ⬆ back to top\nConfiguration Libraries for configuration parsing.\naconfig - Simple, useful and opinionated config loader. cleanenv - Minimalistic configuration reader (from files, ENV, and wherever you want). config - Cloud native application configuration. Bind ENV to structs in only two lines. config - configure you app using file, environment variables, or flags in two lines of code config - JSON or YAML configuration wrapper with environment variables and flags parsing. configuration - Library for initializing configuration structs from env variables, files, flags and \u0026lsquo;default\u0026rsquo; tag. configure - Provides configuration through multiple sources, including JSON, flags and environment variables. configuro - opinionated configuration loading \u0026amp; validation framework from ENV and Files focused towards 12-Factor compliant applications. confita - Load configuration in cascade from multiple backends into a struct. conflate - Library/tool to merge multiple JSON/YAML/TOML files from arbitrary URLs, validation against a JSON schema, and application of default values defined in the schema. env - Parse environment variables to Go structs (with defaults). env - A lightweight package for loading environment variables into structs. envcfg - Un-marshaling environment variables to Go structs. envconf - Configuration from environment. envconfig - Read your configuration from environment variables. envh - Helpers to manage environment variables. fig - Tiny library for reading configuration from a file and from environment variables (with validation \u0026amp; defaults). gcfg - read INI-style configuration files into Go structs; supports user-defined types and subsections. genv - Read environment variables easily with dotenv support. go-aws-ssm - Go package that fetches parameters from AWS System Manager - Parameter Store. go-conf - Simple library for application configuration based on annotated structs. It supports reading the configuration from environment variables, config files and command line parameters. go-ini - A Go package that marshals and unmarshals INI-files. go-ssm-config - Go utility for loading configuration parameters from AWS SSM (Parameter Store). go-up - A simple configuration library with recursive placeholders resolution and no magic. goConfig - Parses a struct as input and populates the fields of this struct with parameters from command line, environment variables and configuration file. godotenv - Go port of Ruby\u0026rsquo;s dotenv library (Loads environment variables from .env). gofigure - Go application configuration made easy. GoLobby/Config - GoLobby Config is a lightweight yet powerful configuration manager for the Go programming language. gone/jconf - Modular JSON configuration. Keep you config structs along with the code they configure and delegate parsing to submodules without sacrificing full config serialization. gonfig - Tag-based configuration parser which loads values from different providers into typesafe struct. gookit/config - application config manage(load,get,set). support JSON, YAML, TOML, INI, HCL. multi file load, data override merge. harvester - Harvester, a easy to use static and dynamic configuration package supportig seeding, env vars and Consul integration. hjson - Human JSON, a configuration file format for humans. Relaxed syntax, fewer mistakes, more comments. hocon - Configuration library for working with the HOCON(a human-friendly JSON superset) format, supports features like environment variables, referencing other values, comments and multiple files. ingo - Flags persisted in an ini-like config file. ini - Go package to read and write INI files. ini - INI Parser \u0026amp; Write Library, Unmarshal to Struct,Marshal to Json,Write File,watch file. joshbetz/config - Small configuration library for Go that parses environment variables, JSON files, and reloads automatically on SIGHUP. kelseyhightower/envconfig - Go library for managing configuration data from environment variables. koanf - Light weight, extensible library for reading config in Go applications. Built in support for JSON, TOML, YAML, env, command line. konfig - Composable, observable and performant config handling for Go for the distributed processing era. kong - Command-line parser with support for arbitrarily complex command-line structures and additional sources of configuration such as YAML, JSON, TOML, etc (succesor to kingpin). mini - Golang package for parsing ini-style configuration files. nasermirzaei89/env - Simple useful package for read environment variables. nfigure - Per-library struct-tag based configuration from command lines (Posix \u0026amp; Go-style); environment, JSON, YAML onion - Layer based configuration for Go, Supports JSON, TOML, YAML, properties, etcd, env, and encryption using PGP. piper - Viper wrapper with config inheritance and key generation. store - Lightweight configuration manager for Go. swap - Instantiate/configure structs recursively, based on build environment. (YAML, TOML, JSON and env). typenv - Minimalistic, zero dependency, typed environment variables library. uConfig - Lightweight, zero-dependency, and extendable configuration management. viper - Go configuration with fangs. xdg - Go implementation of the XDG Base Directory Specification and XDG user directories. xdg - Cross platform package that follows the XDG Standard. ⬆ back to top\nContinuous Integration Tools for help with continuous integration.\nCDS - Enterprise-Grade CI/CD and DevOps Automation Open Source Platform. drone - Drone is a Continuous Integration platform built on Docker, written in Go. duci - A simple ci server no needs domain specific languages. gomason - Test, Build, Sign, and Publish your go binaries from a clean workspace. gotestfmt - go test output for humans. goveralls - Go integration for Coveralls.io continuous code coverage tracking system. overalls - Multi-Package go project coverprofile for tools like goveralls. roveralls - Recursive coverage testing tool. ⬆ back to top\nCSS Preprocessors Libraries for preprocessing CSS files.\ngcss - Pure Go CSS Preprocessor. go-libsass - Go wrapper to the 100% Sass compatible libsass project. ⬆ back to top\nData Structures and Algorithms Bit-packing and Compression bingo - Fast, zero-allocation, lexicographical-order-preserving packing of native types to bytes. binpacker - Binary packer and unpacker helps user build custom binary stream. bit - Golang set data structure with bonus bit-twiddling functions. crunch - Go package implementing buffers for handling various datatypes easily. go-ef - A Go implementation of the Elias-Fano encoding. roaring - Go package implementing compressed bitsets. Bit Sets bitmap - Dense, zero-allocation, SIMD-enabled bitmap/bitset in Go. bitset - Go package implementing bitsets. Bloom and Cuckoo Filters bloom - Go package implementing Bloom filters. bloom - Bloom filters implemented in Go. bloom - Golang Bloom filter implementation. bloomfilter - Yet another Bloomfilter implementation in Go, compatible with Java\u0026rsquo;s Guava library. boomfilters - Probabilistic data structures for processing continuous, unbounded streams. cuckoo-filter - Cuckoo filter: a comprehensive cuckoo filter, which is configurable and space optimized compared with other implements, and all features mentioned in original paper is available. cuckoofilter - Cuckoo filter: a good alternative to a counting bloom filter implemented in Go. ring - Go implementation of a high performance, thread safe bloom filter. Data Structure and Algorithm Collections algorithms - Algorithms and data structures.CLRS study. go-datastructures - Collection of useful, performant, and thread-safe data structures. gods - Go Data Structures. Containers, Sets, Lists, Stacks, Maps, BidiMaps, Trees, HashSet etc. gostl - Data structure and algorithm library for go, designed to provide functions similar to C++ STL. Iterators goterator - Iterator implementation to provide map and reduce functionalities. iter - Go implementation of C++ STL iterators and algorithms. Maps See also Database for more complex key-value stores, and Trees for additional ordered map implementations.\ncmap - a thread-safe concurrent map for go, support using interface{} as key and auto scale up shards. dict - Python-like dictionaries (dict) for Go. goradd/maps - Go 1.18+ generic map interface for maps; safe maps; ordered maps; ordered, safe maps; etc. Miscellaneous Data Structures and Algorithms concurrent-writer - Highly concurrent drop-in replacement for bufio.Writer. conjungo - A small, powerful and flexible merge library. count-min-log - Go implementation Count-Min-Log sketch: Approximately counting with approximate counters (Like Count-Min sketch but using less memory). fsm - Finite-State Machine package. genfuncs - Go 1.18+ generics package inspired by Kotlin\u0026rsquo;s Sequence and Map. go-geoindex - In-memory geo index. go-rampart - Determine how intervals relate to each other. go-rquad - Region quadtrees with efficient point location and neighbour finding. go-tuple - Generic tuple implementation for Go 1.18+. go18ds - Go Data Structures using Go 1.18 generics. gofal - fractional api for Go. gota - Implementation of dataframes, series, and data wrangling methods for Go. hide - ID type with marshalling to/from hash to prevent sending IDs to clients. hilbert - Go package for mapping values to and from space-filling curves, such as Hilbert and Peano curves. hyperloglog - HyperLogLog implementation with Sparse, LogLog-Beta bias correction and TailCut space reduction. slices - Functions that operate on slices; like package strings but adapted to work with slices. slices - Pure, generic functions for slices. Nullable Types nan - Zero allocation Nullable structures in one library with handy conversion functions, marshallers and unmarshallers. null - Nullable Go types that can be marshalled/unmarshalled to/from JSON. typ - Null Types, Safe primitive type conversion and fetching value from complex structures. Queues deque - A highly optimized double-ended queue. deque - Fast ring-buffer deque (double-ended queue). goconcurrentqueue - Concurrent FIFO queue. memlog - An easy to use, lightweight, thread-safe and append-only in-memory data structure inspired by Apache Kafka. Sets dsu - Disjoint Set data structure implementation in Go. golang-set - Thread-Safe and Non-Thread-Safe high-performance sets for Go. goset - A useful Set collection implementation for Go. set - Simple set data structure implementation in Go using LinkedHashMap. Text Analysis bleve - Modern text indexing library for go. go-adaptive-radix-tree - Go implementation of Adaptive Radix Tree. go-edlib - Go string comparison and edit distance algorithms library (Levenshtein, LCS, Hamming, Damerau levenshtein, Jaro-Winkler, etc.) compatible with Unicode. levenshtein - Levenshtein distance and similarity metrics with customizable edit costs and Winkler-like bonus for common prefix. levenshtein - Implementation to calculate levenshtein distance in Go. mspm - Multi-String Pattern Matching Algorithm for information retrieval. parsefields - Tools for parse JSON-like logs for collecting unique fields and events. ptrie - An implementation of prefix tree. trie - Trie implementation in Go. Trees hashsplit - Split byte streams into chunks, and arrange chunks into trees, with boundaries determined by content, not position. merkle - Space-efficient computation of Merkle root hashes and inclusion proofs. skiplist - Very fast Go Skiplist implementation. skiplist - Skiplist implementation in Go. treap - Persistent, fast ordered map using tree heaps. treemap - Generic key-sorted map using a red-black tree under the hood. Pipes ordered-concurrently - Go module that processes work concurrently and returns output in a channel in the order of input. parapipe - FIFO Pipeline which parallels execution on each stage while maintaining the order of messages and results. pipeline - An implementation of pipelines with fan-in and fan-out. ⬆ back to top\nDatabase Caches Data stores with expiring records, in-memory distributed data stores, or in-memory subsets of file-based databases.\n2q - 2Q in-memory cache implementation. bcache - Eventually consistent distributed in-memory cache Go library. BigCache - Efficient key/value cache for gigabytes of data. cache - In-memory key:value store with expiration time, 0 dependencies, \u0026lt;100 LoC, 100% coverage. cache2go - In-memory key:value cache which supports automatic invalidation based on timeouts. cachego - Golang Cache component for multiple drivers. clusteredBigCache - BigCache with clustering support and individual item expiration. couchcache - RESTful caching micro-service backed by Couchbase server. fastcache - fast thread-safe inmemory cache for big number of entries. Minimizes GC overhead. GCache - Cache library with support for expirable Cache, LFU, LRU and ARC. gdcache - A pure non-intrusive cache library implemented by golang, you can use it to implement your own distributed cache. go-mcache - Fast in-memory key:value store/cache library. Pointer caches. gocache - A complete Go cache library with mutiple stores (memory, memcache, redis, \u0026hellip;), chainable, loadable, metrics cache and more. groupcache - Groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases. remember-go - A universal interface for caching slow database queries (backed by redis, memcached, ristretto, or in-memory). timedmap - Map with expiring key-value pairs. ttlcache - An in-memory cache with item expiration and generics. ttlcache - In-memory key value storage with TTL for each record. Databases Implemented in Go badger - Fast key-value store in Go. bbolt - An embedded key/value database for Go. Bitcask - Bitcask is an embeddable, persistent and fast key-value (KV) database written in pure Go with predictable read/write performance, low latency and high throughput thanks to the bitcask on-disk layout (LSM+WAL). buntdb - Fast, embeddable, in-memory key/value database for Go with custom indexing and spatial support. clover - A lightweight document-oriented NoSQL database written in pure Golang. cockroach - Scalable, Geo-Replicated, Transactional Datastore. Coffer - Simple ACID key-value database that supports transactions. column - High-performance, columnar, embeddable in-memory store with bitmap indexing and transactions. CovenantSQL - CovenantSQL is a SQL database on blockchain. Databunker - Personally identifiable information (PII) storage service built to comply with GDPR and CCPA. dgraph - Scalable, Distributed, Low Latency, High Throughput Graph Database. diskv - Home-grown disk-backed key-value store. dtf - A distributed transaction manager. Support XA, TCC, SAGA, Reliable Messages. eliasdb - Dependency-free, transactional graph database with REST API, phrase search and SQL-like query language. godis - A Golang implemented high-performance Redis server and cluster. goleveldb - Implementation of the LevelDB key/value database in Go. hare - A simple database management system that stores each table as a text file of line-delimited JSON. immudb - immudb is a lightweight, high-speed immutable database for systems and applications written in Go. influxdb - Scalable datastore for metrics, events, and real-time analytics. ledisdb - Ledisdb is a high performance NoSQL like Redis based on LevelDB. levigo - Levigo is a Go wrapper for LevelDB. lotusdb - Fast k/v database compatible with lsm and b+tree. Milvus - Milvus is a vector database for embedding management, analytics and search. moss - Moss is a simple LSM key-value storage engine written in 100% Go. nutsdb - Nutsdb is a simple, fast, embeddable, persistent key/value store written in pure Go. It supports fully serializable transactions and many data structures such as list, set, sorted set. piladb - Lightweight RESTful database engine based on stack data structures. pogreb - Embedded key-value store for read-heavy workloads. prometheus - Monitoring system and time series database. pudge - Fast and simple key/value store written using Go\u0026rsquo;s standard library. rosedb - An embedded k-v database based on LSM+WAL, supports string, list, hash, set, zset. rqlite - The lightweight, distributed, relational database built on SQLite. tempdb - Key-value store for temporary items. tidb - TiDB is a distributed SQL database. Inspired by the design of Google F1. tiedot - Your NoSQL database powered by Golang. unitdb - Fast timeseries database for IoT, realtime messaging applications. Access unitdb with pubsub over tcp or websocket using github.com/unit-io/unitd application. Vasto - A distributed high-performance key-value store. On Disk. Eventual consistent. HA. Able to grow or shrink without service interruption. VictoriaMetrics - fast, resource-effective and scalable open source time series database. May be used as long-term remote storage for Prometheus. Supports PromQL. Database Schema Migration atlas - A Database Toolkit. A CLI designed to help companies better work with their data. avro - Discover SQL schemas and convert them to AVRO schemas. Query SQL records into AVRO bytes. darwin - Database schema evolution library for Go. go-fixtures - Django style fixtures for Golang\u0026rsquo;s excellent built-in database/sql library. go-pg-migrate - CLI-friendly package for go-pg migrations management. go-pg-migrations - A Go package to help write migrations with go-pg/pg. goavro - A Go package that encodes and decodes Avro data. godfish - Database migration manager, works with native query language. Support for cassandra, mysql, postgres, sqlite3. goose - Database migration tool. You can manage your database\u0026rsquo;s evolution by creating incremental SQL or Go scripts. gormigrate - Database schema migration helper for Gorm ORM. libschema - Define your migrations separately in each libary. Migrations for open source libraries. MySQL \u0026amp; PostgreSQL. migrate - Database migrations. CLI and Golang library. migrator - Dead simple Go database migration library. migrator - MySQL database migrator designed to run migrations to your features and manage database schema update with intuitive go code. pravasan - Simple Migration tool - currently for MySQL but planning to soon support Postgres, SQLite, MongoDB, etc. schema - Library to embed schema migrations for database/sql-compatible databases inside your Go binaries. skeema - Pure-SQL schema management system for MySQL, with support for sharding and external online schema change tools. soda - Database migration, creation, ORM, etc\u0026hellip; for MySQL, PostgreSQL, and SQLite. sql-migrate - Database migration tool. Allows embedding migrations into the application using go-bindata. sqlize - Database migration generator. Allows generate sql migration from model and existing sql by differ them. Database Tools chproxy - HTTP proxy for ClickHouse database. clickhouse-bulk - Collects small inserts and sends big requests to ClickHouse servers. datagen - A fast data generator that\u0026rsquo;s multi-table aware and supports multi-row DML. dbbench - Database benchmarking tool with support for several databases and scripts. dynago - Simplify working with AWS DynamoDB. go-mysql - Go toolset to handle MySQL protocol and replication. go-mysql-elasticsearch - Sync your MySQL data into Elasticsearch automatically. kingshard - kingshard is a high performance proxy for MySQL powered by Golang. myreplication - MySql binary log replication listener. Supports statement and row based replication. octillery - Go package for sharding databases ( Supports every ORM or raw SQL ). orchestrator - MySQL replication topology manager \u0026amp; visualizer. pg_timetable - Advanced scheduling for PostgreSQL. pgweb - Web-based PostgreSQL database browser. prep - Use prepared SQL statements without changing your code. pREST - Simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new. rdb - Redis RDB file parser for secondary development and memory analysis. rwdb - rwdb provides read replica capability for multiple database servers setup. vitess - vitess provides servers and tools which facilitate scaling of MySQL databases for large scale web services. SQL Query Builders Libraries for building and using SQL.\nbqb - Lightweight and easy to learn query builder. buildsqlx - Go database query builder library for PostgreSQL. dbq - Zero boilerplate database operations for Go. Dotsql - Go library that helps you keep sql files in one place and use them with ease. gendry - Non-invasive SQL builder and powerful data binder. godbal - Database Abstraction Layer (dbal) for go. Support SQL builder and get result easily. goqu - Idiomatic SQL builder and query library. gosql - SQL Query builder with better null values support. hasql - Library for accessing multi-host SQL database installations. igor - Abstraction layer for PostgreSQL that supports advanced functionality and uses gorm-like syntax. jet - Framework for writing type-safe SQL queries in Go, with ability to easily convert database query result into desired arbitrary object structure. mpath - MPTT (Modified Preorder Tree Traversal) package for SQL records - materialized path realisation. ormlite - Lightweight package containing some ORM-like features and helpers for sqlite databases. ozzo-dbx - Powerful data retrieval methods as well as DB-agnostic query building capabilities. qry - Tool that generates constants from files with raw SQL queries. sg - A SQL Gen for generating standard SQLs(supports: CRUD) written in Go. sq - Type-safe SQL builder and struct mapper for Go. sqlc - Generate type-safe code from SQL. sqlf - Fast SQL query builder. sqlingo - A lightweight DSL to build SQL in Go. sqrl - SQL query builder, fork of Squirrel with improved performance. Squalus - Thin layer over the Go SQL package that makes it easier to perform queries. Squirrel - Go library that helps you build SQL queries. xo - Generate idiomatic Go code for databases based on existing schema definitions or custom queries supporting PostgreSQL, MySQL, SQLite, Oracle, and Microsoft SQL Server. ⬆ back to top\nDatabase Drivers Interfaces to Multiple Backends cayley - Graph database with support for multiple backends. dsc - Datastore connectivity for SQL, NoSQL, structured files. gokv - Simple key-value store abstraction and implementations for Go (Redis, Consul, etcd, bbolt, BadgerDB, LevelDB, Memcached, DynamoDB, S3, PostgreSQL, MongoDB, CockroachDB and many more). Relational Database Drivers avatica - Apache Avatica/Phoenix SQL driver for database/sql. bgc - Datastore Connectivity for BigQuery for go. firebirdsql - Firebird RDBMS SQL driver for Go. go-adodb - Microsoft ActiveX Object DataBase driver for go that uses database/sql. go-mssqldb - Microsoft MSSQL driver for Go. go-oci8 - Oracle driver for go that uses database/sql. go-sql-driver/mysql - MySQL driver for Go. go-sqlite3 - SQLite3 driver for go that uses database/sql. godror - Oracle driver for Go, using the ODPI-C driver. gofreetds - Microsoft MSSQL driver. Go wrapper over FreeTDS. Kivik - Kivik provides a common Go and GopherJS client library for CouchDB, PouchDB, and similar databases. pgx - PostgreSQL driver supporting features beyond those exposed by database/sql. pig - Simple pgx wrapper to execute and scan query results easily. pq - Pure Go Postgres driver for database/sql. Sqinn-Go - SQLite with pure Go. sqlhooks - Attach hooks to any database/sql driver. NoSQL Database Drivers aerospike-client-go - Aerospike client in Go language. arangolite - Lightweight golang driver for ArangoDB. asc - Datastore Connectivity for Aerospike for go. forestdb - Go bindings for ForestDB. go-couchbase - Couchbase client in Go. go-pilosa - Go client library for Pilosa. go-rejson - Golang client for redislabs\u0026rsquo; ReJSON module using Redigo golang client. Store and manipulate structs as JSON objects in redis with ease. gocb - Official Couchbase Go SDK. gocosmos - REST client and standard database/sql driver for Azure Cosmos DB. gocql - Go language driver for Apache Cassandra. godis - redis client implement by golang, inspired by jedis. godscache - A wrapper for the Google Cloud Platform Go Datastore package that adds caching using memcached. gomemcache - memcache client library for the Go programming language. gorethink - Go language driver for RethinkDB. goriak - Go language driver for Riak KV. mgm - MongoDB model-based ODM for Go (based on official MongoDB driver). mgo - (unmaintained) MongoDB driver for the Go language that implements a rich and well tested selection of features under a very simple API following standard Go idioms. mongo-go-driver - Official MongoDB driver for the Go language. neo4j - Neo4j Rest API Bindings for Golang. Neo4j-GO - Neo4j REST Client in golang. neoism - Neo4j client for Golang. qmgo - The MongoDB driver for Go. It‘s based on official MongoDB driver but easier to use like Mgo. redeo - Redis-protocol compatible TCP servers/services. redigo - Redigo is a Go client for the Redis database. redis - Redis client for Golang. rueidis - Fast Redis RESP3 client with auto pipelining and server-assisted client side caching. xredis - Typesafe, customizable, clean \u0026amp; easy to use Redis client. Search and Analytic Databases elastic - Elasticsearch client for Go. elasticsql - Convert sql to elasticsearch dsl in Go. elastigo - Elasticsearch client library. go-elasticsearch - Official Elasticsearch client for Go. goes - Library to interact with Elasticsearch. skizze - probabilistic data-structures service and storage. ⬆ back to top\nDate and Time Libraries for working with dates and times.\ncarbon - A simple, semantic and developer-friendly golang package for datetime. carbon - Simple Time extension with a lot of util methods, ported from PHP Carbon library. cronrange - Parses Cron-style time range expressions, checks if the given time is within any ranges. date - Augments Time for working with dates, date ranges, time spans, periods, and time-of-day. dateparse - Parse date\u0026rsquo;s without knowing format in advance. durafmt - Time duration formatting library for Go. feiertage - Set of functions to calculate public holidays in Germany, incl. specialization on the states of Germany (Bundesländer). Things like Easter, Pentecost, Thanksgiving\u0026hellip; go-persian-calendar - The implementation of the Persian (Solar Hijri) Calendar in Go (golang). go-str2duration - Convert string to duration. Support time.Duration returned string and more. go-sunrise - Calculate the sunrise and sunset times for a given location. go-week - An efficient package to work with ISO8601 week dates. gostradamus - A Go package for working with dates. iso8601 - Efficiently parse ISO8601 date-times without regex. kair - Date and Time - Golang Formatting Library. now - Now is a time toolkit for golang. NullTime - Nullable time.Time. strftime - C99-compatible strftime formatter. timespan - For interacting with intervals of time, defined as a start time and a duration. timeutil - Useful extensions (Timedelta, Strftime, \u0026hellip;) to the golang\u0026rsquo;s time package. tuesday - Ruby-compatible Strftime function. ⬆ back to top\nDistributed Systems Packages that help with building Distributed Systems.\narpc - More effective network communication, support two-way-calling, notify, broadcast. celeriac - Library for adding support for interacting and monitoring Celery workers, tasks and events in Go. consistent - Consistent hashing with bounded loads. consistenthash - Consistent hashing with configurable replicas. dht - BitTorrent Kademlia DHT implementation. digota - grpc ecommerce microservice. dot - distributed sync using operational transformation/OT. doublejump - A revamped Google\u0026rsquo;s jump consistent hash. dragonboat - A feature complete and high performance multi-group Raft library in Go. drmaa - Job submission library for cluster schedulers based on the DRMAA standard. dynamolock - DynamoDB-backed distributed locking implementation. dynatomic - A library for using DynamoDB as an atomic counter. emitter-io - High performance, distributed, secure and low latency publish-subscribe platform built with MQTT, Websockets and love. failured - adaptive accrual failure detector for distributed systems. flowgraph - flow-based programming package. gleam - Fast and scalable distributed map/reduce system written in pure Go and Luajit, combining Go\u0026rsquo;s high concurrency with Luajit\u0026rsquo;s high performance, runs standalone or distributed. glow - Easy-to-Use scalable distributed big data processing, Map-Reduce, DAG execution, all in pure Go. gmsec - A Go distributed systems development framework. go-doudou - A gossip protocol and OpenAPI 3.0 spec based decentralized microservice framework. Built-in go-doudou cli focusing on low-code and rapid dev can power up your productivity. go-health - Library for enabling asynchronous dependency health checks in your service. go-jump - Port of Google\u0026rsquo;s \u0026ldquo;Jump\u0026rdquo; Consistent Hash function. go-kit - Microservice toolkit with support for service discovery, load balancing, pluggable transports, request tracking, etc. go-micro - A distributed systems development framework. go-mysql-lock - MySQL based distributed lock. go-pdu - A decentralized identity-based social network. go-sundheit - A library built to provide support for defining async service health checks for golang services. go-zero - A web and rpc framework. It\u0026rsquo;s born to ensure the stability of the busy sites with resilient design. Builtin goctl greatly improves the development productivity. gorpc - Simple, fast and scalable RPC library for high load. grpc-go - The Go language implementation of gRPC. HTTP/2 based RPC. hprose - Very newbility RPC Library, support 25+ languages now. jsonrpc - The jsonrpc package helps implement of JSON-RPC 2.0. jsonrpc - JSON-RPC 2.0 HTTP client implementation. Kratos - A modular-designed and easy-to-use microservices framework in Go. liftbridge - Lightweight, fault-tolerant message streams for NATS. lura - Ultra performant API Gateway framework with middlewares. micro - A distributed systems runtime for the cloud and beyond. NATS - Lightweight, high performance messaging system for microservices, IoT, and cloud native systems. outboxer - Outboxer is a go library that implements the outbox pattern. pglock - PostgreSQL-backed distributed locking implementation. pjrpc - Golang JSON-RPC Server-Client with Protobuf spec. raft - Golang implementation of the Raft consensus protocol, by HashiCorp. raft - Go implementation of the Raft consensus protocol, by CoreOS. rain - BitTorrent client and library. redis-lock - Simplified distributed locking implementation using Redis. resgate - Realtime API Gateway for building REST, real time, and RPC APIs, where all clients are synchronized seamlessly. ringpop-go - Scalable, fault-tolerant application-layer sharding for Go applications. rpcx - Distributed pluggable RPC service framework like alibaba Dubbo. Semaphore - A straightforward (micro) service orchestrator. sleuth - Library for master-less p2p auto-discovery and RPC between HTTP services (using ZeroMQ). torrent - BitTorrent client package. ⬆ back to top\nDynamic DNS Tools for updating dynamic DNS records.\nDDNS - Personal DDNS client with Digital Ocean Networking DNS as backend. dyndns - Background Go process to regularly and automatically check your IP Address and make updates to (one or many) Dynamic DNS records for Google domains whenever your address changes. GoDNS - A dynamic DNS client tool, supports DNSPod \u0026amp; HE.net, written in Go. ⬆ back to top\nEmail Libraries and tools that implement email creation and sending.\nchasquid - SMTP server written in Go. douceur - CSS inliner for your HTML emails. email - A robust and flexible email library for Go. email-verifier - A Go library for email verification without sending any emails. go-dkim - DKIM library, to sign \u0026amp; verify email. go-email-validator - Modular email validator for syntax, disposable, smtp, etc\u0026hellip; checking. go-imap - IMAP library for clients and servers. go-mail - A simple Go library for sending mails in Go. go-message - Streaming library for the Internet Message Format and mail messages. go-premailer - Inline styling for HTML mail in Go. go-simple-mail - Very simple package to send emails with SMTP Keep Alive and two timeouts: Connect and Send. Hectane - Lightweight SMTP client providing an HTTP API. hermes - Golang package that generates clean, responsive HTML e-mails. mailchain - Send encrypted emails to blockchain addresses written in Go. mailgun-go - Go library for sending mail with the Mailgun API. MailHog - Email and SMTP testing with web and API interface. mailx - Mailx is a library that makes it easier to send email via SMTP. It is an enhancement of the golang standard library net/smtp. SendGrid - SendGrid\u0026rsquo;s Go library for sending email. smtp - SMTP server protocol state machine. smtpmock - Lightweight configurable multithreaded fake SMTP server. Mimic any SMTP behaviour for your test environment. truemail-go - Configurable Golang email validator/verifier. Verify email via Regex, DNS, SMTP and even more. ⬆ back to top\nEmbeddable Scripting Languages Embedding other languages inside your go code.\nanko - Scriptable interpreter written in Go. binder - Go to Lua binding library, based on gopher-lua. cel-go - Fast, portable, non-Turing complete expression evaluation with gradual typing. ecal - A simple embeddable scripting language which supports concurrent event processing. expr - Expression evaluation engine for Go: fast, non-Turing complete, dynamic typing, static typing. gentee - Embeddable scripting programming language. gisp - Simple LISP in Go. go-duktape - Duktape JavaScript engine bindings for Go. go-lua - Port of the Lua 5.2 VM to pure Go. go-php - PHP bindings for Go. go-python - naive go bindings to the CPython C-API. goja - ECMAScript 5.1(+) implementation in Go. golua - Go bindings for Lua C API. gopher-lua - Lua 5.1 VM and compiler written in Go. gval - A highly customizable expression language written in Go. metacall - Cross-platform Polyglot Runtime which supports NodeJS, JavaScript, TypeScript, Python, Ruby, C#, WebAssembly, Java, Cobol and more. ngaro - Embeddable Ngaro VM implementation enabling scripting in Retro. prolog - Embeddable Prolog. purl - Perl 5.18.2 embedded in Go. tengo - Bytecode compiled script language for Go. ⬆ back to top\nError Handling Libraries for handling errors.\nemperror - Error handling tools and best practices for Go libraries and applications. eris - A better way to handle, trace, and log errors in Go. Compatible with the standard error library and github.com/pkg/errors. errlog - Hackable package that determines responsible source code for an error (and some other fast-debugging features). Pluggable to any logger in-place. errors - Drop-in replacement for the standard library errors package and github.com/pkg/errors. Provides various error handling primitives. errors - Package that provides simple error handling primitives. errors - Simple golang error handling with classification primitives. errors - The most simple error wrapper with awesome performance and minimal memory overhead. errors - Drop-in replacement for builting Go errors. This is a minimal error handling package with custom error types, user friendly messages, Unwrap \u0026amp; Is. With very easy to use and straightforward helper functions. errorx - A feature rich error package with stack traces, composition of errors and more. exception - A simple utility package for exception handling with try-catch in Golang. Falcon - A Simple Yet Highly Powerful Package For Error Handling. go-multierror - Go (golang) package for representing a list of errors as a single error. tracerr - Golang errors with stack trace and source fragments. ⬆ back to top\nFile Handling Libraries for handling files and file systems.\nafero - FileSystem Abstraction System for Go. afs - Abstract File Storage (mem, scp, zip, tar, cloud: s3, gs) for Go. baraka - A library to process http file uploads easily. bigfile - A file transfer system, support to manage files with http api, rpc call and ftp client. checksum - Compute message digest, like MD5, SHA256, SHA1, CRC or BLAKE2s, for large files. copy - Copy directory recursively. flop - File operations library which aims to mirror feature parity with GNU cp. gdu - Disk usage analyzer with console interface. go-csv-tag - Load csv file using tag. go-decent-copy - Copy files for humans. go-exiftool - Go bindings for ExifTool, the well-known library used to extract as much metadata as possible (EXIF, IPTC, \u0026hellip;) from files (pictures, PDF, office, \u0026hellip;). go-gtfs - Load gtfs files in go. gofs - A file synchronization tool out of the box. gut/yos - Simple and reliable package for file operations like copy/move/diff/list on files, directories and symbolic links. higgs - A tiny cross-platform Go library to hide/unhide files and directories. notify - File system event notification library with simple API, similar to os/signal. opc - Load Open Packaging Conventions (OPC) files for Go. parquet - Read and write parquet files. pathtype - Treat paths as their own type instead of using strings. pdfcpu - PDF processor. skywalker - Package to allow one to concurrently go through a filesystem with ease. stl - Modules to read and write STL (stereolithography) files. Concurrent algorithm for reading. tarfs - Implementation of the FileSystem interface for tar files. todotxt - Go library for Gina Trapani\u0026rsquo;s todo.txt files, supports parsing and manipulating of task lists in the todo.txt format. vfs - A pluggable, extensible, and opinionated set of filesystem functionality for Go across a number of filesystem types such as os, S3, and GCS. ⬆ back to top\nFinancial Packages for accounting and finance.\naccounting - money and currency formatting for golang. ach - A reader, writer, and valdiator for Automated Clearing House (ACH) files. currency - Handles currency amounts, provides currency information and formatting. currency - High performant \u0026amp; accurate currency computation package. decimal - Arbitrary-precision fixed-point decimal numbers. fastme - Fast extensible matching engine Go implementation. fpdecimal - Fast and precise serialization and arithmetic for small fixed-point decimals go-finance - Comprehensive financial markets data in Go. go-finance - Library of financial functions for time value of money (annuities), cash flow, interest rate conversions, bonds and depreciation calculations. go-finance - Module to fetch exchange rates, check VAT numbers via VIES and check IBAN bank account numbers. go-finnhub - Client for stock market, forex and crypto data from finnhub.io. Access real-time financial market data from 60+ stock exchanges, 10 forex brokers, and 15+ crypto exchanges. go-money - Implementation of Fowler\u0026rsquo;s Money pattern. ofxgo - Query OFX servers and/or parse the responses (with example command-line client). orderbook - Matching Engine for Limit Order Book in Golang. payme - QR code generator (ASCII \u0026amp; PNG) for SEPA payments. sleet - One unified interface for multiple Payment Service Providers (PsP) to process online payment. techan - Technical analysis library with advanced market analysis and trading strategies. ticker - Terminal stock watcher and stock position tracker. transaction - Embedded transactional database of accounts, running in multithreaded mode. vat - VAT number validation \u0026amp; EU VAT rates. ⬆ back to top\nForms Libraries for working with forms.\nbind - Bind form data to any Go values. binding - Binds form and JSON data from net/http Request to struct. conform - Keeps user input in check. Trims, sanitizes \u0026amp; scrubs data based on struct tags. form - Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. Dual Array and Full map support. formam - decode form\u0026rsquo;s values into a struct. forms - Framework-agnostic library for parsing and validating form/JSON data which supports multipart forms and files. gorilla/csrf - CSRF protection for Go web applications \u0026amp; services. httpin - Decode an HTTP request into a custom struct, including querystring, forms, HTTP headers, etc. nosurf - CSRF protection middleware for Go. qs - Go module for encoding structs into URL query parameters. queryparam - Decode url.Values into usable struct values of standard or custom types. ⬆ back to top\nFunctional Packages to support functional programming in Go.\nfp-go - Collection of Functional Programming helpers powered by Golang 1.18+ generics. fpGo - Monad, Functional Programming features for Golang. fuego - Functional Experiment in Go. go-underscore - Useful collection of helpfully functional Go collection utilities. gofp - A lodash like powerful utility library for Golang. mo - Monads and popular FP abstractions, based on Go 1.18+ Generics (Option, Result, Either\u0026hellip;). underscore - Functional programming helpers for Go 1.18 and beyond. valor - Generic option and result types that optionally contain a value. ⬆ back to top\nGame Development Awesome game development libraries.\nAzul3D - 3D game engine written in Go. Ebiten - dead simple 2D game library in Go. engo - Engo is an open-source 2D game engine written in Go. It follows the Entity-Component-System paradigm. g3n - Go 3D Game Engine. go-astar - Go implementation of the A* path finding algorithm. go-sdl2 - Go bindings for the Simple DirectMedia Layer. go3d - Performance oriented 2D/3D math package for Go. gonet - Game server skeleton implemented with golang. goworld - Scalable game server engine, featuring space-entity framework and hot-swapping. Leaf - Lightweight game server framework. nano - Lightweight, facility, high performance golang based game server framework. Oak - Pure Go game engine. Pitaya - Scalable game server framework with clustering support and client libraries for iOS, Android, Unity and others through the C SDK. Pixel - Hand-crafted 2D game library in Go. prototype - Cross-platform (Windows/Linux/Mac) library for creating desktop games using a minimal API. raylib-go - Go bindings for raylib, a simple and easy-to-use library to learn videogames programming. termloop - Terminal-based game engine for Go, built on top of Termbox. tile - Data-oriented and cache-friendly 2D Grid library (TileMap), includes pathfinding, observers and import/export. ⬆ back to top\nGenerators Tools that generate Go code.\ncopygen - Generate type-to-type code without reflection. generis - Code generation tool providing generics, free-form macros, conditional compilation and HTML templating. go-enum - Code generation for enums from code comments. go-linq - .NET LINQ-like query methods for Go. go-xray - Helpers for making the use of reflection easier. goderive - Derives functions from input types. gotype - Golang source code parsing, usage like reflect package. goverter - Generate converters by defining an interface. GoWrap - Generate decorators for Go interfaces using simple templates. interfaces - Command line tool for generating interface definitions. jennifer - Generate arbitrary Go code without templates. typeregistry - A library to create type dynamically. ⬆ back to top\nGeographic Geographic tools and servers\ngeoserver - geoserver Is a Go Package For Manipulating a GeoServer Instance via the GeoServer REST API. gismanager - Publish Your GIS Data(Vector Data) to PostGIS and Geoserver. godal - Go wrapper for GDAL. [h3-go] - Go bindings for H3, a hierarchical hexagonal geospatial indexing system. H3 GeoJSON - Conversion utilities between H3 indexes and GeoJSON. H3GeoDist - Distribution of Uber H3geo cells by virtual nodes. mbtileserver - A simple Go-based server for map tiles stored in mbtiles format. osm - Library for reading, writing and working with OpenStreetMap data and APIs. pbf - OpenStreetMap PBF golang encoder/decoder. S2 geojson - Convert geojson to s2 cells \u0026amp; demonstrating some S2 geometry features on map. S2 geometry - S2 geometry library in Go. simplefeatures - simplesfeatures is a 2D geometry library that provides Go types that model geometries, as well as algorithms that operate on them. Tile38 - Geolocation DB with spatial index and realtime geofencing. Web-Mercator-Projection A project to easily use and convert LonLat, Point and Tile to display info, markers, etc, in a map using the Web Mercator Projection. WGS84 - Library for Coordinate Conversion and Transformation (ETRS89, OSGB36, NAD83, RGF93, Web Mercator, UTM). ⬆ back to top\nGo Compilers Tools for compiling Go to other languages.\nc4go - Transpile C code to Go code. esp32 - Transpile Go into Arduino code. f4go - Transpile FORTRAN 77 code to Go code. gopherjs - Compiler from Go to JavaScript. tardisgo - Golang to Haxe to CPP/CSharp/Java/JavaScript transpiler. ⬆ back to top\nGoroutines Tools for managing and working with Goroutines.\nants - A high-performance and low-cost goroutine pool in Go. artifex - Simple in-memory job queue for Golang using worker-based dispatching. async - An alternative sync library for Go (Future, Promise, Locks). async - A safe way to execute functions asynchronously, recovering them in case of panic. async-job - AsyncJob is an asynchronous queue job manager with light code, clear and speed. breaker - Flexible mechanism to make execution flow interruptible. channelify - Transform your function to return channels for easy and powerful parallel processing. concurrency-limiter - Concurrency limiter with support for timeouts , dynamic priority and context cancellation of goroutines. conexec - A concurrent toolkit to help execute funcs concurrently in an efficient and safe way. It supports specifying the overall timeout to avoid blocking and uses goroutine pool to improve efficiency. cyclicbarrier - CyclicBarrier for golang. execpool - A pool built around exec.Cmd that spins up a given number of processes in advance and attaches stdin and stdout to them when needed. Very similar to FastCGI or Apache Prefork MPM but works for any command. go-floc - Orchestrate goroutines with ease. go-flow - Control goroutines execution order. go-tools/multithreading - Manage a pool of goroutines using this lightweight library with a simple API. go-trylock - TryLock support on read-write lock for Golang. go-waitgroup - Like sync.WaitGroup with error handling and concurrency control. go-workers - Easily and safely run workers for large data processing pipelines. goccm - Go Concurrency Manager package limits the number of goroutines that allowed to run concurrently. gohive - A highly performant and easy to use Goroutine pool for Go. gollback - asynchronous simple function utilities, for managing execution of closures and callbacks. gowl - Gowl is a process management and process monitoring tool at once. An infinite worker pool gives you the ability to control the pool and processes and monitor their status. goworker - goworker is a Go-based background worker. gowp - gowp is concurrency limiting goroutine pool. gpool - manages a resizeable pool of context-aware goroutines to bound concurrency. grpool - Lightweight Goroutine pool. hands - A process controller used to control the execution and return strategies of multiple goroutines. Hunch - Hunch provides functions like: All, First, Retry, Waterfall etc., that makes asynchronous flow control more intuitive. kyoo - Provides an unlimited job queue and concurrent worker pools. neilotoole/errgroup - Drop-in alternative to sync/errgroup, limited to a pool of N worker goroutines. nursery - Structured concurrency in Go. oversight - Oversight is a complete implementation of the Erlang supervision trees. parallel-fn - Run functions in parallel. pond - Minimalistic and High-performance goroutine worker pool written in Go. pool - Limited consumer goroutine or unlimited goroutine pool for easier goroutine handling and cancellation. queue - Gives you a sync.WaitGroup like queue group accessibility. Helps you to throttle and limit goroutines, wait for the end of the all goroutines and much more. routine - go routine control with context, support: Main, Go, Pool and some useful Executors. semaphore - Semaphore pattern implementation with timeout of lock/unlock operations based on channel and context. semaphore - Fast resizable semaphore implementation based on CAS (faster than channel-based semaphore implementations). stl - Software transactional locks based on Software Transactional Memory (STM) concurrency control mechanism. threadpool - Golang threadpool implementation. tunny - Goroutine pool for golang. worker-pool - goworker is a Go simple async worker pool. workerpool - Goroutine pool that limits the concurrency of task execution, not the number of tasks queued. ⬆ back to top\nGUI Libraries for building GUI Applications.\nToolkits\napp - Package to create apps with GO, HTML and CSS. Supports: MacOS, Windows in progress. fyne - Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. go-astilectron - Build cross platform GUI apps with GO and HTML/JS/CSS (powered by Electron). go-gtk - Go bindings for GTK. go-sciter - Go bindings for Sciter: the Embeddable HTML/CSS/script engine for modern desktop UI development. Cross platform. goradd/html5tag - Library for outputting HTML5 tags. gotk3 - Go bindings for GTK3. gowd - Rapid and simple desktop UI development with GO, HTML, CSS and NW.js. Cross platform. qt - Qt binding for Go (support for Windows / macOS / Linux / Android / iOS / Sailfish OS / Raspberry Pi). ui - Platform-native GUI library for Go. Cross platform. Wails - Mac, Windows, Linux desktop apps with HTML UI using built-in OS HTML renderer. walk - Windows application library kit for Go. webview - Cross-platform webview window with simple two-way JavaScript bindings (Windows / macOS / Linux). Interaction\ngo-appindicator - Go bindings for libappindicator3 C library. gosx-notifier - OSX Desktop Notifications library for Go. mac-activity-tracker - OSX library to notify about any (pluggable) activity on your machine. mac-sleep-notifier - OSX Sleep/Wake notifications in golang. robotgo - Go Native cross-platform GUI system automation. Control the mouse, keyboard and other. systray - Cross platform Go library to place an icon and menu in the notification area. trayhost - Cross-platform Go library to place an icon in the host operating system\u0026rsquo;s taskbar. zenity - Cross-platform Go library and CLI to create simple dialogs that interact graphically with the user. ⬆ back to top\nHardware Libraries, tools, and tutorials for interacting with hardware.\narduino-cli - Official Arduino CLI and library. Can run standalone, or be incorporated into larger Go projects. emgo - Go-like language for programming embedded systems (e.g. STM32 MCU). ghw - Golang hardware discovery/inspection library. go-osc - Open Sound Control (OSC) bindings for Go. go-rpio - GPIO for Go, doesn\u0026rsquo;t require cgo. goroslib - Robot Operating System (ROS) library for Go. joystick - a polled API to read the state of an attached joystick. sysinfo - A pure Go library providing Linux OS / kernel / hardware system information. ⬆ back to top\nImages Libraries for manipulating images.\nbild - Collection of image processing algorithms in pure Go. bimg - Small package for fast and efficient image processing using libvips. cameron - An avatar generator for Go. canvas - Vector graphics to PDF, SVG or rasterized image. darkroom - An image proxy with changeable storage backends and image processing engines with focus on speed and resiliency. draft - Generate High Level Microservice Architecture diagrams for GraphViz using simple YAML syntax. geopattern - Create beautiful generative image patterns from a string. gg - 2D rendering in pure Go. gift - Package of image processing filters. gltf - Efficient and robust glTF 2.0 reader, writer and validator. go-cairo - Go binding for the cairo graphics library. go-gd - Go binding for GD library. go-nude - Nudity detection with Go. go-opencv - Go bindings for OpenCV. go-webcolors - Port of webcolors library from Python to Go. go-webp - Library for encode and decode webp pictures, using libwebp. gocv - Go package for computer vision using OpenCV 3.3+. goimagehash - Go Perceptual image hashing package. goimghdr - The imghdr module determines the type of image contained in a file for Go. govatar - Library and CMD tool for generating funny avatars. govips - A lightning fast image processing and resizing library for Go. gowitness - Screenshoting webpages using go and headless chrome on command line. gridder - A Grid based 2D Graphics library. image2ascii - Convert image to ASCII. imagick - Go binding to ImageMagick\u0026rsquo;s MagickWand C API. imaginary - Fast and simple HTTP microservice for image resizing. imaging - Simple Go image processing package. img - Selection of image manipulation tools. ln - 3D line art rendering in Go. mergi - Tool \u0026amp; Go library for image manipulation (Merge, Crop, Resize, Watermark, Animate). mort - Storage and image processing server written in Go. mpo - Decoder and conversion tool for MPO 3D Photos. picfit - An image resizing server written in Go. pt - Path tracing engine written in Go. resize - Image resizing for Go with common interpolation methods. rez - Image resizing in pure Go and SIMD. scout - Scout is a standalone open source software solution for DIY video security. smartcrop - Finds good crops for arbitrary images and crop sizes. steganography - Pure Go Library for LSB steganography. stegify - Go tool for LSB steganography, capable of hiding any file within an image. svgo - Go Language Library for SVG generation. tga - Package tga is a TARGA image format decoder/encoder. webp-server - Simple and minimal image server capable of storing, resizing, converting and caching images. ⬆ back to top\nIoT (Internet of Things) Libraries for programming devices of the IoT.\nconnectordb - Open-Source Platform for Quantified Self \u0026amp; IoT. devices - Suite of libraries for IoT devices, experimental for x/exp/io. eywa - Project Eywa is essentially a connection manager that keeps track of connected devices. flogo - Project Flogo is an Open Source Framework for IoT Edge Apps \u0026amp; Integration. gatt - Gatt is a Go package for building Bluetooth Low Energy peripherals. gobot - Gobot is a framework for robotics, physical computing, and the Internet of Things. huego - An extensive Philips Hue client library for Go. iot - IoT is a simple framework for implementing a Google IoT Core device. mainflux - Industrial IoT Messaging and Device Management Server. periph - Peripherals I/O to interface with low-level board facilities. sensorbee - Lightweight stream processing engine for IoT. ⬆ back to top\nJob Scheduler Libraries for scheduling jobs.\ncdule - Job scheduler library with database support cheek - A simple crontab like scheduler that aims to offer a KISS approach to job scheduling. clockwerk - Go package to schedule periodic jobs using a simple, fluent syntax. cronticker - A ticker implementation to support cron schedules. Dagu - No-code workflow executor. it executes DAGs defined in a simple YAML format. go-cron - Simple Cron library for go that can execute closures or functions at varying intervals, from once a second to once a year on a specific date and time. Primarily for web applications and long running daemons. go-quartz - Simple, zero-dependency scheduling library for Go. gocron - Easy and fluent Go job scheduling. This is an actively maintained fork of jasonlvhit/gocron. goflow - A workflow orchestrator and scheduler for rapid prototyping of ETL/ML/AI pipelines. gron - Define time-based tasks using a simple Go API and Gron’s scheduler will run them accordingly. gronx - Cron expression parser, task runner and daemon consuming crontab like task list. JobRunner - Smart and featureful cron job scheduler with job queuing and live monitoring built in. jobs - Persistent and flexible background jobs library. leprechaun - Job scheduler that supports webhooks, crons and classic scheduling. sched - A job scheduler with the ability to fast-forward time. scheduler - Cronjobs scheduling made easy. tasks - An easy to use in-process scheduler for recurring tasks in Go. ⬆ back to top\nJSON Libraries for working with JSON.\najson - Abstract JSON for golang with JSONPath support. ask - Easy access to nested values in maps and slices. Works in combination with encoding/json and other packages that \u0026ldquo;Unmarshal\u0026rdquo; arbitrary data into Go data-types. dynjson - Client-customizable JSON formats for dynamic APIs. ej - Write and read JSON from different sources succinctly. epoch - Contains primitives for marshaling/unmarshaling Unix timestamp/epoch to/from build-in time.Time type in JSON. fastjson - Fast JSON parser and validator for Go. No custom structs, no code generation, no reflection. gjo - Small utility to create JSON objects. GJSON - Get a JSON value with one line of code. go-jsonerror - Go-JsonError is ment to allow us to easily create json response errors that follow the JsonApi spec. go-respond - Go package for handling common HTTP JSON responses. gojq - JSON query in Golang. gojson - Automatically generate Go (golang) struct definitions from example JSON. JayDiff - JSON diff utility written in Go. jettison - Fast and flexible JSON encoder for Go. jscan - High performance zero-allocation JSON iterator. JSON-to-Go - Convert JSON to Go struct. JSON-to-Proto - Convert JSON to Protobuf online. json2go - Advanced JSON to Go struct conversion. Provides package that can parse multiple JSON documents and create struct to fit them all. jsonapi-errors - Go bindings based on the JSON API errors reference. jsoncolor - Drop-in replacement for encoding/json that outputs colorized JSON. jsondiff - JSON diff library for Go based on RFC6902 (JSON Patch). jsonf - Console tool for highlighted formatting and struct query fetching JSON. jsongo - Fluent API to make it easier to create Json objects. jsonhal - Simple Go package to make custom structs marshal into HAL compatible JSON responses. jsonic - Utilities to handle and query JSON without defining structs in a type safe manner. jzon - JSON library with standard compatible API/behavior. kazaam - API for arbitrary transformation of JSON documents. mapslice-json - Go MapSlice for ordered marshal/ unmarshal of maps in JSON. mp - Simple cli email parser. It currently takes stdin and outputs JSON. OjG - Optimized JSON for Go is a high performance parser with a variety of additional JSON tools including JSONPath. omg.jsonparser - Simple JSON parser with validation by condition via golang struct fields tags. ujson - Fast and minimal JSON parser and transformer that works on unstructured JSON. vjson - Go package for validating JSON objects with declaring a JSON schema with fluent API. ⬆ back to top\nLogging Libraries for generating and working with log files.\ndistillog - distilled levelled logging (think of it as stdlib + log levels). glg - glg is simple and fast leveled logging library for Go. glo - PHP Monolog inspired logging facility with identical severity levels. glog - Leveled execution logs for Go. go-cronowriter - Simple writer that rotate log files automatically based on current date and time, like cronolog. go-log - A logging library with strack traces, object dumping and optional timestamps. go-log - Simple and configurable Logging in Go, with level, formatters and writers. go-log - Log lib supports level and multi handlers. go-log - Log4j implementation in Go. go-logger - Simple logger of Go Programs, with level handlers. gologger - Simple easy to use log lib for go, logs in Colored Console, Simple Console, File or Elasticsearch. gomol - Multiple-output, structured logging for Go with extensible logging outputs. gone/log - Fast, extendable, full-featured, std-lib source compatible log library. httpretty - Pretty-prints your regular HTTP requests on your terminal for debugging (similar to http.DumpRequest). journald - Go implementation of systemd Journal\u0026rsquo;s native API for logging. kemba - A tiny debug logging tool inspired by debug, great for CLI tools and applications. log - An O(1) logging system that allows you to connect one log to multiple writers (e.g. stdout, a file and a TCP connection). log - Structured logging package for Go. log - Simple, configurable and scalable Structured Logging for Go. log - Structured log interface for Go cleanly separates logging facade from its implementation. log-voyage - Full-featured logging saas written in golang. log15 - Simple, powerful logging for Go. logdump - Package for multi-level logging. logex - Golang log lib, supports tracking and level, wrap by standard log lib. logger - Minimalistic logging library for Go. logmatic - Colorized logger for Golang with dynamic log level configuration. logo - Golang logger to different configurable writers. logrus - Structured logger for Go. logrusiowriter - io.Writer implementation using logrus logger. logrusly - logrus plug-in to send errors to a Loggly. logur - An opinionated logger interface and collection of logging best practices with adapters and integrations for well-known libraries (logrus, go-kit log, zap, zerolog, etc). logutils - Utilities for slightly better logging in Go (Golang) extending the standard logger. logxi - 12-factor app logger that is fast and makes you happy. lumberjack - Simple rolling logger, implements io.WriteCloser. mlog - Simple logging module for go, with 5 levels, an optional rotating logfile feature and stdout/stderr output. noodlog - Parametrized JSON logging library which lets you obfuscate sensitive data and marshal any kind of content. No more printed pointers instead of values, nor escape chars for the JSON strings. onelog - Onelog is a dead simple but very efficient JSON logger. It is the fastest JSON logger out there in all scenarios. Also, it is one of the logger with the lowest allocation. ozzo-log - High performance logging supporting log severity, categorization, and filtering. Can send filtered log messages to various targets (e.g. console, network, mail). phuslu/log - Structured Logging Made Easy. rollingwriter - RollingWriter is an auto-rotate io.Writer implementation with multi policies to provide log file rotation. seelog - Logging functionality with flexible dispatching, filtering, and formatting. slf4g - Simple Logging Facade for Golang: Simple structured logging; but powerful, extendable and customizable, with huge amount of learnings from decades of past logging frameworks. spew - Implements a deep pretty printer for Go data structures to aid in debugging. sqldb-logger - A logger for Go SQL database driver without modify existing *sql.DB stdlib usage. stdlog - Stdlog is an object-oriented library providing leveled logging. It is very useful for cron jobs. structy/log - A simple to use log system, minimalist but with features for debugging and differentiation of messages. tail - Go package striving to emulate the features of the BSD tail program. xlog - Plugin architecture and flexible log system for Go, with level ctrl, multiple log target and custom log format. xlog - Structured logger for net/context aware HTTP handlers with flexible dispatching. yell - Yet another minimalistic logging library. zap - Fast, structured, leveled logging in Go. zerolog - Zero-allocation JSON logger. zkits-logger - A powerful zero-dependency JSON logger. ⬆ back to top\nMachine Learning Libraries for Machine Learning.\nbayesian - Naive Bayesian Classification for Golang. CloudForest - Fast, flexible, multi-threaded ensembles of decision trees for machine learning in pure Go. ddt - Dynamic decision tree, create trees defining customizable rules. eaopt - An evolutionary optimization library. evoli - Genetic Algorithm and Particle Swarm Optimization library. fonet - A Deep Neural Network library written in Go. go-cluster - Go implementation of the k-modes and k-prototypes clustering algorithms. go-deep - A feature-rich neural network library in Go. go-fann - Go bindings for Fast Artificial Neural Networks(FANN) library. go-featureprocessing - Fast and convenient feature processing for low latency machine learning in Go. go-galib - Genetic Algorithms library written in Go / golang. go-pr - Pattern recognition package in Go lang. gobrain - Neural Networks written in go. godist - Various probability distributions, and associated methods. goga - Genetic algorithm library for Go. GoLearn - General Machine Learning library for Go. golinear - liblinear bindings for Go. GoMind - A simplistic Neural Network Library in Go. goml - On-line Machine Learning in Go. gonet - Neural Network for Go. Goptuna - Bayesian optimization framework for black-box functions written in Go. Everything will be optimized. goRecommend - Recommendation Algorithms library written in Go. gorgonia - graph-based computational library like Theano for Go that provides primitives for building various machine learning and neural network algorithms. gorse - An offline recommender system backend based on collaborative filtering written in Go. goscore - Go Scoring API for PMML. gosseract - Go package for OCR (Optical Character Recognition), by using Tesseract C++ library. libsvm - libsvm golang version derived work based on LIBSVM 3.14. m2cgen - A CLI tool to transpile trained classic ML models into a native Go code with zero dependencies, written in Python with Go language support. neat - Plug-and-play, parallel Go framework for NeuroEvolution of Augmenting Topologies (NEAT). neural-go - Multilayer perceptron network implemented in Go, with training via backpropagation. ocrserver - A simple OCR API server, seriously easy to be deployed by Docker and Heroku. onnx-go - Go Interface to Open Neural Network Exchange (ONNX). probab - Probability distribution functions. Bayesian inference. Written in pure Go. randomforest - Easy to use Random Forest library for Go. regommend - Recommendation \u0026amp; collaborative filtering engine. shield - Bayesian text classifier with flexible tokenizers and storage backends for Go. tfgo - Easy to use Tensorflow bindings: simplifies the usage of the official Tensorflow Go bindings. Define computational graphs in Go, load and execute models trained in Python. Varis - Golang Neural Network. ⬆ back to top\nMessaging Libraries that implement messaging systems.\nami - Go client to reliable queues based on Redis Cluster Streams. amqp - Go RabbitMQ Client Library. APNs2 - HTTP/2 Apple Push Notification provider for Go — Send push notifications to iOS, tvOS, Safari and OSX apps. Asynq - A simple, reliable, and efficient distributed task queue for Go built on top of Redis. Beaver - A real time messaging server to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps. Benthos - A message streaming bridge between a range of protocols. Bus - Minimalist message bus implementation for internal communication. Centrifugo - Real-time messaging (Websockets or SockJS) server in Go. Chanify - A push notification server send message to your iOS devices. Commander - A high-level event driven consumer/producer supporting various \u0026ldquo;dialects\u0026rdquo; such as Apache Kafka. Confluent Kafka Golang Client - confluent-kafka-go is Confluent\u0026rsquo;s Golang client for Apache Kafka and the Confluent Platform. dbus - Native Go bindings for D-Bus. drone-line - Sending Line notifications using a binary, docker or Drone CI. emitter - Emits events using Go way, with wildcard, predicates, cancellation possibilities and many other good wins. event - Implementation of the pattern observer. EventBus - The lightweight event bus with async compatibility. gaurun-client - Gaurun Client written in Go. Glue - Robust Go and Javascript Socket Library (Alternative to Socket.io). go-mq - RabbitMQ client with declarative configuration. go-notify - Native implementation of the freedesktop notification spec. go-nsq - the official Go package for NSQ. go-res - Package for building REST/real-time services where clients are synchronized seamlessly, using NATS and Resgate. go-socket.io - socket.io library for golang, a realtime application framework. go-vitotrol - Client library to Viessmann Vitotrol web service. Gollum - A n:m multiplexer that gathers messages from different sources and broadcasts them to a set of destinations. golongpoll - HTTP longpoll server library that makes web pub-sub simple. gopush-cluster - gopush-cluster is a go push server cluster. gorush - Push notification server using APNs2 and google GCM. gosd - A library for scheduling when to dispatch a message to a channel. guble - Messaging server using push notifications (Google Firebase Cloud Messaging, Apple Push Notification services, SMS) as well as websockets, a REST API, featuring distributed operation and message-persistence. hare - A user friendly library for sending messages and listening to TCP sockets. hub - A Message/Event Hub for Go applications, using publish/subscribe pattern with support for alias like rabbitMQ exchanges. jazz - A simple RabbitMQ abstraction layer for queue administration and publishing and consuming of messages. machinery - Asynchronous task queue/job queue based on distributed message passing. mangos - Pure go implementation of the Nanomsg (\u0026ldquo;Scalability Protocols\u0026rdquo;) with transport interoperability. melody - Minimalist framework for dealing with websocket sessions, includes broadcasting and automatic ping/pong handling. Mercure - Server and library to dispatch server-sent updates using the Mercure protocol (built on top of Server-Sent Events). messagebus - messagebus is a Go simple async message bus, perfect for using as event bus when doing event sourcing, CQRS, DDD. NATS Go Client - Lightweight and high performance publish-subscribe and distributed queueing messaging system - this is the Go library. nsq-event-bus - A tiny wrapper around NSQ topic and channel. oplog - Generic oplog/replication system for REST APIs. pubsub - Simple pubsub package for go. rabbus - A tiny wrapper over amqp exchanges and queues. rabtap - RabbitMQ swiss army knife cli app. RapidMQ - RapidMQ is a lightweight and reliable library for managing of the local messages queue. redisqueue - redisqueue provides a producer and consumer of a queue that uses Redis streams. rmqconn - RabbitMQ Reconnection. Wrapper over amqp.Connection and amqp.Dial. Allowing to do a reconnection when the connection is broken before forcing the call to the Close () method to be closed. sarama - Go library for Apache Kafka. Uniqush-Push - Redis backed unified push service for server-side notifications to mobile devices. zmq4 - Go interface to ZeroMQ version 4. Also available for version 3 and version 2. ⬆ back to top\nMicrosoft Office unioffice - Pure go library for creating and processing Office Word (.docx), Excel (.xlsx) and Powerpoint (.pptx) documents. Microsoft Excel Libraries for working with Microsoft Excel.\nexcelize - Golang library for reading and writing Microsoft Excel™ (XLSX) files. exl - Excel binding to struct written in Go.(Only supports Go1.18+) go-excel - A simple and light reader to read a relate-db-like excel as a table. goxlsxwriter - Golang bindings for libxlsxwriter for writing XLSX (Microsoft Excel) files. xlsx - Library to simplify reading the XML format used by recent version of Microsoft Excel in Go programs. xlsx - Fast and safe way to read/update your existing Microsoft Excel files in Go programs. ⬆ back to top\nMiscellaneous Dependency Injection Libraries for working with dependency injection.\nalice - Additive dependency injection container for Golang. di - A dependency injection container for go programming language. dig - A reflection based dependency injection toolkit for Go. dingo - A dependency injection toolkit for Go, based on Guice. do - A dependency injection framework based on Generics. fx - A dependency injection based application framework for Go (built on top of dig). gocontainer - Simple Dependency Injection Container. goioc/di - Spring-inspired Dependency Injection Container. GoLobby/Container - GoLobby Container is a lightweight yet powerful IoC dependency injection container for the Go programming language. google/wire - Automated Initialization in Go. HnH/di - DI container library that is focused on clean API and flexibility. kinit - Customizable dependency injection container with the global mode, cascade initialization and panic-safe finalization. linker - A reflection based dependency injection and inversion of control library with components lifecycle support. nject - A type safe, reflective framework for libraries, tests, http endpoints, and service startup. wire - Strict Runtime Dependency Injection for Golang. ⬆ back to top\nProject Layout Unofficial set of patterns for structuring projects.\nardanlabs/service - A starter kit for building production grade scalable web service applications. cookiecutter-golang - A Go application boilerplate template for quick starting projects following production best practices. go-sample - A sample layout for Go application projects with the real code. go-starter - An opinionated production-ready RESTful JSON backend template, highly integrated with VSCode DevContainers. go-todo-backend - Go Todo Backend example using modular project layout for product microservice. gobase - A simple skeleton for golang application with basic setup for real golang application. golang-standards/project-layout - Set of common historical and emerging project layout patterns in the Go ecosystem. Note: despite the org-name they do not represent official golang standards, see this issue for more information. Nonetheless, some may find the layout useful. golang-templates/seed - Go application GitHub repository template. insidieux/inizio - Golang project layout generator with plugins. modern-go-application - Go application boilerplate and example applying modern practices. pagoda - Rapid, easy full-stack web development starter kit built in Go. scaffold - Scaffold generates a starter Go project layout. Lets you focus on business logic implemented. wangyoucao577/go-project-layout - Set of practices and discussions on how to structure Go project layout. ⬆ back to top\nStrings Libraries for working with strings.\nbexp - Go implementation of Brace Expansion mechanism to generate arbitrary strings. go-formatter - Implements replacement fields surrounded by curly braces {} format strings. gobeam/Stringy - String manipulation library to convert string to camel case, snake case, kebab case / slugify etc. strutil - String utilities. sttr - cross-platform, cli app to perform various operations on string. xstrings - Collection of useful string functions ported from other languages. ⬆ back to top\nUncategorized These libraries were placed here because none of the other categories seemed to fit.\nanagent - Minimalistic, pluggable Golang evloop/timer handler with dependency-injection. antch - A fast, powerful and extensible web crawling \u0026amp; scraping framework. archiver - Library and command for making and extracting .zip and .tar.gz archives. autoflags - Go package to automatically define command line flags from struct fields. avgRating - Calculate average score and rating based on Wilson Score Equation. banner - Add beautiful banners into your Go applications. base64Captcha - Base64captch supports digit, number, alphabet, arithmetic, audio and digit-alphabet captcha. basexx - Convert to, from, and between digit strings in various number bases. battery - Cross-platform, normalized battery information library. bitio - Highly optimized bit-level Reader and Writer for Go. browscap_go - GoLang Library for Browser Capabilities Project. captcha - Package captcha provides an easy to use, unopinionated API for captcha generation. conv - Package conv provides fast and intuitive conversions across Go types. datacounter - Go counters for readers/writer/http.ResponseWriter. faker - Fake data generator. faker - Random fake data and struct generator for Go. ffmt - Beautify data display for Humans. gatus - Automated service health dashboard. go-commandbus - A slight and pluggable command-bus for Go. go-commons-pool - Generic object pool for Golang. go-openapi - Collection of packages to parse and utilize open-api schemas. go-resiliency - Resiliency patterns for golang. go-unarr - Decompression library for RAR, TAR, ZIP and 7z archives. gofakeit - Random data generator written in go. gommit - Analyze git commit messages to ensure they follow defined patterns. gopsutil - Cross-platform library for retrieving process and system utilization(CPU, Memory, Disks, etc). gosh - Provide Go Statistics Handler, Struct, Measure Method. gosms - Your own local SMS gateway in Go that can be used to send SMS. gotoprom - Type-safe metrics builder wrapper library for the official Prometheus client. gountries - Package that exposes country and subdivision data. gtree - Provide CLI and Package for tree output and directories creation from Markdown or programmatically. health - A simple and flexible health check library for Go. health - Easy to use, extensible health check library. healthcheck - An opinionated and concurrent health-check HTTP handler for RESTful services. hostutils - A golang library for packing and unpacking FQDNs list. indigo - Distributed unique ID generator of using Sonyflake and encoded by Base58. lk - A simple licensing library for golang. llvm - Library for interacting with LLVM IR in pure Go. metrics - Library for metrics instrumentation and Prometheus exposition. morse - Library to convert to and from morse code. numa - NUMA is a utility library, which is written in go. It help us to write some NUMA-AWARED code. openapi - OpenAPI 3.x parser. pdfgen - HTTP service to generate PDF from Json requests. persian - Some utilities for Persian language in go. sandid - Every grain of sand on earth has its own ID. shellwords - A Golang library to manipulate strings according to the word parsing rules of the UNIX Bourne shell. shortid - Distributed generation of super short, unique, non-sequential, URL friendly IDs. shoutrrr - Notification library providing easy access to various messaging services like slack, mattermost, gotify and smtp among others. stateless - A fluent library for creating state machines. stats - Monitors Go MemStats + System stats such as Memory, Swap and CPU and sends via UDP anywhere you want for logging etc\u0026hellip; turtle - Emojis for Go. url-shortener - A modern, powerful, and robust URL shortener microservice with mysql support. VarHandler - Generate boilerplate http input and output handling. varint - A faster varying length integer encoder/decoder than the one provided in the standard library. xdg - FreeDesktop.org (xdg) Specs implemented in Go. xkg - X Keyboard Grabber. xz - Pure golang package for reading and writing xz-compressed files. ⬆ back to top\nNatural Language Processing Libraries for working with human languages.\nSee also Text Processing and Text Analysis.\nLanguage Detection detectlanguage - Language Detection API Go Client. Supports batch requests, short phrase or single word language detection. getlang - Fast natural language detection package. guesslanguage - Functions to determine the natural language of a unicode text. whatlanggo - Natural language detection package for Go. Supports 84 languages and 24 scripts (writing systems e.g. Latin, Cyrillic, etc). Morphological Analyzers go-stem - Implementation of the porter stemming algorithm. go2vec - Reader and utility functions for word2vec embeddings. golibstemmer - Go bindings for the snowball libstemmer library including porter 2. gosentiwordnet - Sentiment analyzer using sentiwordnet lexicon in Go. govader - Go implementation of VADER Sentiment Analysis. govader-backend - Microservice implementation of GoVader. kagome - JP morphological analyzer written in pure Go. libtextcat - Cgo binding for libtextcat C library. Guaranteed compatibility with version 2.2. nlp - Extract values from strings and fill your structs with nlp. nlp - Go Natural Language Processing library supporting LSA (Latent Semantic Analysis). paicehusk - Golang implementation of the Paice/Husk Stemming Algorithm. porter - This is a fairly straightforward port of Martin Porter\u0026rsquo;s C implementation of the Porter stemming algorithm. porter2 - Really fast Porter 2 stemmer. RAKE.go - Go port of the Rapid Automatic Keyword Extraction Algorithm (RAKE). snowball - Snowball stemmer port (cgo wrapper) for Go. Provides word stem extraction functionality Snowball native. spaGO - Self-contained Machine Learning and Natural Language Processing library in Go. spelling-corrector - A spelling corrector for the Spanish language or create your own. Slugifiers go-slugify - Make pretty slug with multiple languages support. slug - URL-friendly slugify with multiple languages support. Slugify - Go slugify application that handles string. Tokenizers gojieba - This is a Go implementation of jieba which a Chinese word splitting algorithm. gotokenizer - A tokenizer based on the dictionary and Bigram language models for Golang. (Now only support chinese segmentation) gse - Go efficient text segmentation; support english, chinese, japanese and other. MMSEGO - This is a GO implementation of MMSEG which a Chinese word splitting algorithm. prose - Library for text processing that supports tokenization, part-of-speech tagging, named-entity extraction, and more. English only. segment - Go library for performing Unicode Text Segmentation as described in Unicode Standard Annex #29 sentences - Sentence tokenizer: converts text into a list of sentences. shamoji - The shamoji is word filtering package written in Go. stemmer - Stemmer packages for Go programming language. Includes English and German stemmers. textcat - Go package for n-gram based text categorization, with support for utf-8 and raw text. Translation go-i18n - Package and an accompanying tool to work with localized text. go-localize - Simple and easy to use i18n (Internationalization and localization) engine - used for translating locale strings. go-mystem - CGo bindings to Yandex.Mystem - russian morphology analyzer. go-pinyin - CN Hanzi to Hanyu Pinyin converter. gotext - GNU gettext utilities for Go. icu - Cgo binding for icu4c C library detection and conversion functions. Guaranteed compatibility with version 50.1. iuliia-go - Transliterate Cyrillic → Latin in every possible way. spreak - Flexible translation and humanization library for Go, based on the concepts behind gettext. t - Another i18n pkg for golang, which follows GNU gettext style and supports .po/.mo files: t.T (gettext), t.N (ngettext), etc. And it contains a cmd tool xtemplate, which can extract messages as a pot file from text/html template. Transliteration enca - Minimal cgo bindings for libenca, which detects character encodings. go-unidecode - ASCII transliterations of Unicode text. gounidecode - Unicode transliterator (also known as unidecode) for Go. transliterator - Provides one-way string transliteration with supporting of language-specific transliteration rules. ⬆ back to top\nNetworking Libraries for working with various layers of the network.\narp - Package arp implements the ARP protocol, as described in RFC 826. buffstreams - Streaming protocolbuffer data over TCP made easy. canopus - CoAP Client/Server implementation (RFC 7252). cidranger - Fast IP to CIDR lookup for Go. dhcp6 - Package dhcp6 implements a DHCPv6 server, as described in RFC 3315. dns - Go library for working with DNS. dnsmonster - Passive DNS Capture/Monitoring Framework. easytcp - A light-weight TCP framework written in Go (Golang), built with message router. EasyTCP helps you build a TCP server easily fast and less painful. ether - Cross-platform Go package for sending and receiving ethernet frames. ethernet - Package ethernet implements marshaling and unmarshaling of IEEE 802.3 Ethernet II frames and IEEE 802.1Q VLAN tags. fasthttp - Package fasthttp is a fast HTTP implementation for Go, up to 10 times faster than net/http. fortio - Load testing library and command line tool, advanced echo server and web UI. Allows to specify a set query-per-second load and record latency histograms and other useful stats and graph them. Tcp, Http, gRPC. ftp - Package ftp implements a FTP client as described in RFC 959. ftpserverlib - Fully featured FTP server library. gaio - High performance async-io networking for Golang in proactor mode. gev - gev is a lightweight, fast non-blocking TCP network library based on Reactor mode. gldap - gldap provides an ldap server implementation and you provide handlers for its ldap operations. gmqtt - Gmqtt is a flexible, high-performance MQTT broker library that fully implements the MQTT protocol V3.1.1. gnet - gnet is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. gNxI - A collection of tools for Network Management that use the gNMI and gNOI protocols. go-getter - Go library for downloading files or directories from various sources using a URL. go-powerdns - PowerDNS API bindings for Golang. go-stun - Go implementation of the STUN client (RFC 3489 and RFC 5389). gobgp - BGP implemented in the Go Programming Language. gohooks - GoHooks make it easy to send and consume secured web-hooks from a Go application. Inspired by Spatie\u0026rsquo;s Laravel Webhook Client and Server. golibwireshark - Package golibwireshark use libwireshark library to decode pcap file and analyse dissection data. gopacket - Go library for packet processing with libpcap bindings. gopcap - Go wrapper for libpcap. goshark - Package goshark use tshark to decode IP packet and create data struct to analyse packet. gosnmp - Native Go library for performing SNMP actions. gotcp - Go package for quickly writing tcp applications. grab - Go package for managing file downloads. graval - Experimental FTP server framework. HTTPLab - HTTPLabs let you inspect HTTP requests and forge responses. httpproxy - HTTP proxy handler and dialer. iplib - Library for working with IP addresses (net.IP, net.IPNet), inspired by python ipaddress and ruby ipaddr jazigo - Jazigo is a tool written in Go for retrieving configuration for multiple network devices. kcp-go - KCP - Fast and Reliable ARQ Protocol. kcptun - Extremely simple \u0026amp; fast udp tunnel based on KCP protocol. lhttp - Powerful websocket framework, build your IM server more easily. linkio - Network link speed simulation for Reader/Writer interfaces. llb - It\u0026rsquo;s a very simple but quick backend for proxy servers. Can be useful for fast redirection to predefined domain with zero memory allocation and fast response. mdns - Simple mDNS (Multicast DNS) client/server library in Golang. mqttPaho - The Paho Go Client provides an MQTT client library for connection to MQTT brokers via TCP, TLS or WebSockets. nbio - Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use. netpoll - A high-performance non-blocking I/O networking framework, which focused on RPC scenarios, developed by ByteDance. NFF-Go - Framework for rapid development of performant network functions for cloud and bare-metal (former YANFF). packet - Send packets over TCP and UDP. It can buffer messages and hot-swap connections if needed. panoptes-stream - A cloud native distributed streaming network telemetry (gNMI, Juniper JTI and Cisco MDT). peerdiscovery - Pure Go library for cross-platform local peer discovery using UDP multicast. portproxy - Simple TCP proxy which adds CORS support to API\u0026rsquo;s which don\u0026rsquo;t support it. publicip - Package publicip returns your public facing IPv4 address (internet egress). quic-go - An implementation of the QUIC protocol in pure Go. raw - Package raw enables reading and writing data at the device driver level for a network interface. sftp - Package sftp implements the SSH File Transfer Protocol as described in https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt. ssh - Higher-level API for building SSH servers (wraps crypto/ssh). sslb - It\u0026rsquo;s a Super Simples Load Balancer, just a little project to achieve some kind of performance. stun - Go implementation of RFC 5389 STUN protocol. tcp_server - Go library for building tcp servers faster. tspool - A TCP Library use worker pool to improve performance and protect your server. utp - Go uTP micro transport protocol implementation. vssh - Go library for building network and server automation over SSH protocol. water - Simple TUN/TAP library. webrtc - A pure Go implementation of the WebRTC API. winrm - Go WinRM client to remotely execute commands on Windows machines. xtcp - TCP Server Framework with simultaneous full duplex communication, graceful shutdown, and custom protocol. ⬆ back to top\nHTTP Clients Libraries for making HTTP requests.\ngentleman - Full-featured plugin-driven HTTP client library. go-cleanhttp - Get easily stdlib HTTP client, which does not share any state with other clients. go-http-client - Make http calls simply and easily. go-otelroundtripper - Go http.RoundTripper that emits open telemetry metrics for HTTP requests. go-req - Declarative golang HTTP client. go-retryablehttp - Retryable HTTP client in Go. grequests - A Go \u0026ldquo;clone\u0026rdquo; of the great and famous Requests library. heimdall - An enhanced http client with retry and hystrix capabilities. httpc - A customizable and simple HTTP client library. Only depend on the stdlib HTTP client. httpretry - Enriches the default go HTTP client with retry functionality. pester - Go HTTP client calls with retries, backoff, and concurrency. req - Simple Go HTTP client with Black Magic (Less code and More efficiency). request - HTTP client for golang. If you have experience about axios or requests, you will love it. No 3rd dependency. requests - HTTP requests for Gophers. Uses context.Context and doesn\u0026rsquo;t hide the underlying net/http.Client, making it compatible with standard Go APIs. Also includes testing tools. resty - Simple HTTP and REST client for Go inspired by Ruby rest-client. rq - A nicer interface for golang stdlib HTTP client. sling - Sling is a Go HTTP client library for creating and sending API requests. ⬆ back to top\nOpenGL Libraries for using OpenGL in Go.\ngl - Go bindings for OpenGL (generated via glow). glfw - Go bindings for GLFW 3. go-glmatrix - Go port of glMatrix library. goxjs/gl - Go cross-platform OpenGL bindings (OS X, Linux, Windows, browsers, iOS, Android). goxjs/glfw - Go cross-platform glfw library for creating an OpenGL context and receiving events. mathgl - Pure Go math package specialized for 3D math, with inspiration from GLM. ⬆ back to top\nORM Libraries that implement Object-Relational Mapping or datamapping techniques.\ncacheme - Schema based, typed Redis caching/memoize framework for Go. ent - An entity framework for Go. Simple, yet powerful ORM for modeling and querying data. go-firestorm - A simple ORM for Google/Firebase Cloud Firestore. go-pg - PostgreSQL ORM with focus on PostgreSQL specific features and performance. go-queryset - 100% type-safe ORM with code generation and MySQL, PostgreSQL, Sqlite3, SQL Server support based on GORM. go-sql - A easy ORM for mysql. go-sqlbuilder - A flexible and powerful SQL string builder library plus a zero-config ORM. go-store - Simple and fast Redis backed key-value store library for Go. golobby/orm - Simple, fast, type-safe, generic orm for developer happiness. GORM - The fantastic ORM library for Golang, aims to be developer friendly. gormt - Mysql database to golang gorm struct. gorp - Go Relational Persistence, ORM-ish library for Go. grimoire - Grimoire is a database access layer and validation for golang. (Support: MySQL, PostgreSQL and SQLite3). lore - Simple and lightweight pseudo-ORM/pseudo-struct-mapping environment for Go. marlow - Generated ORM from project structs for compile time safety assurances. pop/soda - Database migration, creation, ORM, etc\u0026hellip; for MySQL, PostgreSQL, and SQLite. Prisma - Prisma Client Go, Typesafe database access for Go. reform - Better ORM for Go, based on non-empty interfaces and code generation. rel - Modern Database Access Layer for Golang - Testable, Extendable and Crafted Into a Clean and Elegant API. SQLBoiler - ORM generator. Generate a featureful and blazing-fast ORM tailored to your database schema. upper.io/db - Single interface for interacting with different data sources through the use of adapters that wrap mature database drivers. XORM - Simple and powerful ORM for Go. (Support: MySQL, MyMysql, PostgreSQL, Tidb, SQLite3, MsSql and Oracle). Zoom - Blazing-fast datastore and querying engine built on Redis. ⬆ back to top\nPackage Management Official tooling for dependency and package management\ngo modules - Modules are the unit of source code interchange and versioning. The go command has direct support for working with modules, including recording and resolving dependencies on other modules. Official experimental tooling for package management\ndep - Go dependency tool. vgo - Versioned Go. Unofficial libraries for package and dependency management.\nglide - Manage your golang vendor and vendored packages with ease. Inspired by tools like Maven, Bundler, and Pip. godep - dependency tool for go, godep helps build packages reproducibly by fixing their dependencies. gom - Go Manager - bundle for go. goop - Simple dependency manager for Go (golang), inspired by Bundler. gop - Build and manage your Go applications out of GOPATH. gopm - Go Package Manager. govendor - Go Package Manager. Go vendor tool that works with the standard vendor file. gpm - Barebones dependency manager for Go. johnny-deps - Minimal dependency version using Git. modgv - Converts \u0026lsquo;go mod graph\u0026rsquo; output into Graphviz\u0026rsquo;s DOT language. mvn-golang - plugin that provides way for auto-loading of Golang SDK, dependency management and start build environment in Maven project infrastructure. nut - Vendor Go dependencies. VenGO - create and manage exportable isolated go virtual environments. ⬆ back to top\nPerformance jaeger - A distributed tracing system. pixie - No instrumentation tracing for Golang applications via eBPF. profile - Simple profiling support package for Go. statsviz - Live visualization of your Go application runtime statistics. tracer - Simple, lightweight tracing. ⬆ back to top\nQuery Language api-fu - Comprehensive GraphQL implementation. dasel - Query and update data structures using selectors from the command line. Comparable to jq/yq but supports JSON, YAML, TOML and XML with zero runtime dependencies. gojsonq - A simple Go package to Query over JSON Data. goven - A drop-in query language for any database schema. gqlgen - go generate based graphql server library. graphql - graphql parser + utilities. graphql - GraphQL server with a focus on ease of use. graphql-go - Implementation of GraphQL for Go. gws - Apollos\u0026rsquo; \u0026ldquo;GraphQL over Websocket\u0026rdquo; client and server implementation. jsonpath - A query library for retrieving part of JSON based on JSONPath syntax. jsonql - JSON query expression library in Golang. jsonslice - Jsonpath queries with advanced filters. rql - Resource Query Language for REST API. rqp - Query Parser for REST API. Filtering, validations, both AND, OR operations are supported directly in the query. straf - Easily Convert Golang structs to GraphQL objects. ⬆ back to top\nResource Embedding debme - Create an embed.FS from an existing embed.FS subdirectory. esc - Embeds files into Go programs and provides http.FileSystem interfaces to them. fileb0x - Simple tool to embed files in go with focus on \u0026ldquo;customization\u0026rdquo; and ease to use. go-resources - Unfancy resources embedding with Go. go.rice - go.rice is a Go package that makes working with resources such as HTML, JS, CSS, images, and templates very easy. mule - Embed external resources like images, movies \u0026hellip; into Go source code to create single file binaries using go generate. Focussed on simplicity. packr - The simple and easy way to embed static files into Go binaries. rebed - Recreate folder structures and files from Go 1.16\u0026rsquo;s embed.FS type statics - Embeds static resources into go files for single binary compilation + works with http.FileSystem + symlinks. statik - Embeds static files into a Go executable. templify - Embed external template files into Go code to create single file binaries. vfsgen - Generates a vfsdata.go file that statically implements the given virtual filesystem. ⬆ back to top\nScience and Data Analysis Libraries for scientific computing and data analyzing.\nassocentity - Package assocentity returns the average distance from words to a given entity. bradleyterry - Provides a Bradley-Terry Model for pairwise comparisons. calendarheatmap - Calendar heatmap in plain Go inspired by Github contribution activity. chart - Simple Chart Plotting library for Go. Supports many graphs types. dataframe-go - Dataframes for machine-learning and statistics (similar to pandas). decimal - Package decimal implements arbitrary-precision decimal floating-point arithmetic. evaler - Simple floating point arithmetic expression evaluator. ewma - Exponentially-weighted moving averages. geom - 2D geometry for golang. go-dsp - Digital Signal Processing for Go. go-estimate - State estimation and filtering algorithms in Go. go-gt - Graph theory algorithms written in \u0026ldquo;Go\u0026rdquo; language. godesim - Extended/multivariable ODE solver framework for event-based simulations with simple API. goent - GO Implementation of Entropy Measures. gohistogram - Approximate histograms for data streams. gonum - Gonum is a set of numeric libraries for the Go programming language. It contains libraries for matrices, statistics, optimization, and more. gonum/plot - gonum/plot provides an API for building and drawing plots in Go. goraph - Pure Go graph theory library(data structure, algorithm visualization). gosl - Go scientific library for linear algebra, FFT, geometry, NURBS, numerical methods, probabilities, optimisation, differential equations, and more. GoStats - GoStats is an Open Source GoLang library for math statistics mostly used in Machine Learning domains, it covers most of the Statistical measures functions. graph - Library of basic graph algorithms. jsonl-graph - Tool to manipulate JSONL graphs with graphviz support. ode - Ordinary differential equation (ODE) solver which supports extended states and channel-based iteration stop conditions. orb - 2D geometry types with clipping, GeoJSON and Mapbox Vector Tile support. pagerank - Weighted PageRank algorithm implemented in Go. piecewiselinear - Tiny linear interpolation library. PiHex - Implementation of the \u0026ldquo;Bailey-Borwein-Plouffe\u0026rdquo; algorithm for the hexadecimal number Pi. rootfinding - root-finding algorithms library for finding roots of quadratic functions. sparse - Go Sparse matrix formats for linear algebra supporting scientific and machine learning applications, compatible with gonum matrix libraries. stats - Statistics package with common functions missing from the Golang standard library. streamtools - general purpose, graphical tool for dealing with streams of data. TextRank - TextRank implementation in Golang with extendable features (summarization, weighting, phrase extraction) and multithreading (goroutine) support. triangolatte - 2D triangulation library. Allows translating lines and polygons (both based on points) to the language of GPUs. ⬆ back to top\nSecurity Libraries that are used to help make your application more secure.\nacmetool - ACME (Let\u0026rsquo;s Encrypt) client tool with automatic renewal. acra - Network encryption proxy to protect database-based applications from data leaks: strong selective encryption, SQL injections prevention, intrusion detection system. age - A simple, modern and secure encryption tool (and Go library) with small explicit keys, no config options, and UNIX-style composability. argon2-hashing - light wrapper around Go\u0026rsquo;s argon2 package that closely mirrors with Go\u0026rsquo;s standard library Bcrypt and simple-scrypt package. argon2pw - Argon2 password hash generation with constant-time password comparison. autocert - Auto provision Let\u0026rsquo;s Encrypt certificates and start a TLS server. BadActor - In-memory, application-driven jailer built in the spirit of fail2ban. Cameradar - Tool and library to remotely hack RTSP streams from surveillance cameras. certificates - An opinionated tool for generating tls certificates. CertMagic - Mature, robust, and powerful ACME client integration for fully-managed TLS certificate issuance and renewal. Coraza - Enterprise-ready, modsecurity and OWASP CRS compatible WAF library. dongle - A simple, semantic and developer-friendly golang package for encoding\u0026amp;decoding and encryption\u0026amp;decryption. firewalld-rest - A rest application to dynamically update firewalld rules on a linux server. go-generate-password - Password generator that can be used on the cli or as a library. go-htpasswd - Apache htpasswd Parser for Go. go-password-validator - Password validator based on raw cryptographic entropy values. go-yara - Go Bindings for YARA, the \u0026ldquo;pattern matching swiss knife for malware researchers (and everyone else)\u0026rdquo;. goArgonPass - Argon2 password hash and verification designed to be compatible with existing Python and PHP implementations. goSecretBoxPassword - A probably paranoid package for securely hashing and encrypting passwords. Interpol - Rule-based data generator for fuzzing and penetration testing. lego - Pure Go ACME client library and CLI tool (for use with Let\u0026rsquo;s Encrypt). memguard - A pure Go library for handling sensitive values in memory. nacl - Go implementation of the NaCL set of API\u0026rsquo;s. optimus-go - ID hashing and Obfuscation using Knuth\u0026rsquo;s Algorithm. passlib - Futureproof password hashing library. secret - Prevent your secrets from leaking into logs, std* etc. secure - HTTP middleware for Go that facilitates some quick security wins. secureio - An keyexchanging+authenticating+encrypting wrapper and multiplexer for io.ReadWriteCloser based on XChaCha20-poly1305, ECDH and ED25519. simple-scrypt - Scrypt package with a simple, obvious API and automatic cost calibration built-in. ssh-vault - encrypt/decrypt using ssh keys. sslmgr - SSL certificates made easy with a high level wrapper around acme/autocert. themis - high-level cryptographic library for solving typical data security tasks (secure data storage, secure messaging, zero-knowledge proof authentication), available for 14 languages, best fit for multi-platform apps. ⬆ back to top\nSerialization Libraries and tools for binary serialization.\nasn1 - Asn.1 BER and DER encoding library for golang. bambam - generator for Cap\u0026rsquo;n Proto schemas from go. bel - Generate TypeScript interfaces from Go structs/interfaces. Useful for JSON RPC. binstruct - Golang binary decoder for mapping data into the structure. cbor - Small, safe, and easy CBOR encoding and decoding library. colfer - Code generation for the Colfer binary format. csvutil - High Performance, idiomatic CSV record encoding and decoding to native Go structures. elastic - Convert slices, maps or any other unknown value across different types at run-time, no matter what. fixedwidth - Fixed-width text formatting (UTF-8 supported). fwencoder - Fixed width file parser (encoding and decoding library) for Go. go-capnproto - Cap\u0026rsquo;n Proto library and parser for go. go-codec - High Performance, feature-Rich, idiomatic encode, decode and rpc library for msgpack, cbor and json, with runtime-based OR code-generation support. go-lctree - Provides a CLI and primitives to serialize and deserialize LeetCode binary trees. gogoprotobuf - Protocol Buffers for Go with Gadgets. goprotobuf - Go support, in the form of a library and protocol compiler plugin, for Google\u0026rsquo;s protocol buffers. jsoniter - High-performance 100% compatible drop-in replacement of \u0026ldquo;encoding/json\u0026rdquo;. mapstructure - Go library for decoding generic map values into native Go structures. php_session_decoder - GoLang library for working with PHP session format and PHP Serialize/Unserialize functions. pletter - A standard way to wrap a proto message for message brokers. structomap - Library to easily and dynamically generate maps from static structures. unitpacking - Library to pack unit vectors into as fewest bytes as possible. ⬆ back to top\nServer Applications algernon - HTTP/2 web server with built-in support for Lua, Markdown, GCSS and Amber. Caddy - Caddy is an alternative, HTTP/2 web server that\u0026rsquo;s easy to configure and use. consul - Consul is a tool for service discovery, monitoring and configuration. cortex-tenant - Prometheus remote write proxy that adds add Cortex tenant ID header based on metric labels. devd - Local webserver for developers. discovery - A registry for resilient mid-tier load balancing and failover. dudeldu - A simple SHOUTcast server. dummy - Run mock server based off an API contract with one command. Easegress - A cloud native high availability/performance traffic orchestration system with observability and extensibility. etcd - Highly-available key value store for shared configuration and service discovery. Euterpe - Self-hosted music streaming server with built-in web UI and REST API. Fider - Fider is an open platform to collect and organize customer feedback. Flagr - Flagr is an open-source feature flagging and A/B testing service. flipt - A self contained feature flag solution written in Go and Vue.js go-feature-flag - A feature flag solution, with only a YAML file in the backend (S3, GitHub, HTTP, local file \u0026hellip;), no server to install, just add a file in a central system and refer to it. go-proxy-cache - Simple Reverse Proxy with Caching, written in Go, using Redis. jackal - An XMPP server written in Go. lets-proxy2 - Reverse proxy for handle https with issue certificates in fly from lets-encrypt. minio - Minio is a distributed object storage server. Moxy - Moxy is a simple mocker and proxy application server, you can create mock endpoints as well as proxy requests in case no mock exists for the endpoint. nginx-prometheus - Nginx log parser and exporter to Prometheus. nsq - A realtime distributed messaging platform. protoxy - A proxy server that converts JSON request bodies to Protocol Buffers. psql-streamer - Stream database events from PostgreSQL to Kafka. riemann-relay - Relay to load-balance Riemann events and/or convert them to Carbon. RoadRunner - High-performance PHP application server, load-balancer and process manager. SFTPGo - Fully featured and highly configurable SFTP server with optional FTP/S and WebDAV support. It can serve local filesystem and Cloud Storage backends such as S3 and Google Cloud Storage. simple-jwt-provider - Simple and lightweight provider which exhibits JWTs, supports login, password-reset (via mail) and user management. Trickster - HTTP reverse proxy cache and time series accelerator. Wish - Make SSH apps, just like that! ⬆ back to top\nStream Processing Libraries and tools for stream processing and reactive programming.\ngo-streams - Go stream processing library. goio - An implementation of IO, Stream, Fiber for Golang, inspired by awesome Scala libraries cats and fs2. machine - Go library for writing and generating stream workers with built in metrics and traceability. stream - Go Stream, like Java 8 Stream: Filter/Map/FlatMap/Peek/Sorted/ForEach/Reduce\u0026hellip; ⬆ back to top\nTemplate Engines Libraries and tools for templating and lexing.\nego - Lightweight templating language that lets you write templates in Go. Templates are translated into Go and compiled. extemplate - Tiny wrapper around html/template to allow for easy file-based template inheritance. fasttemplate - Simple and fast template engine. Substitutes template placeholders up to 10x faster than text/template. gospin - Article spinning and spintax/spinning syntax engine, useful for A/B, testing pieces of text/articles and creating more natural conversations. got - A Go code generator inspired by Hero and Fasttemplate. Has include files, custom tag definitions, injected Go code, language translation, and more. goview - Goview is a lightweight, minimalist and idiomatic template library based on golang html/template for building Go web application. jet - Jet template engine. liquid - Go implementation of Shopify Liquid templates. maroto - A maroto way to create PDFs. Maroto is inspired in Bootstrap and uses gofpdf. Fast and simple. pongo2 - Django-like template-engine for Go. quicktemplate - Fast, powerful, yet easy to use template engine. Converts templates into Go code and then compiles it. raymond - Complete handlebars implementation in Go. Razor - Razor view engine for Golang. Soy - Closure templates (aka Soy templates) for Go, following the official spec. sprig - Useful template functions for Go templates. tbd - A really simple way to create text templates with placeholders - exposes extra builtin Git repo metadata. ⬆ back to top\nTesting Libraries for testing codebases and generating test data.\nTesting Frameworks\napitest - Simple and extensible behavioural testing library for REST based services or HTTP handlers that supports mocking external http calls and rendering of sequence diagrams. assert - Basic Assertion Library used along side native go testing, with building blocks for custom assertions. badio - Extensions to Go\u0026rsquo;s testing/iotest package. baloo - Expressive and versatile end-to-end HTTP API testing made easy. be - The minimalist generic test assertion library. biff - Bifurcation testing framework, BDD compatible. charlatan - Tool to generate fake interface implementations for tests. commander - Tool for testing cli applications on windows, linux and osx. covergates - Self-hosted code coverage report review and management service. cupaloy - Simple snapshot testing addon for your test framework. dbcleaner - Clean database for testing purpose, inspired by database_cleaner in Ruby. dsunit - Datastore testing for SQL, NoSQL, structured files. embedded-postgres - Run a real Postgres database locally on Linux, OSX or Windows as part of another Go application or test. endly - Declarative end to end functional testing. fixenv - Fixture manage engine, inspired by pytest fixtures. flute - HTTP client testing framework. frisby - REST API testing framework. gherkingen - BDD boilerplate generator and framework. ginkgo - BDD Testing Framework for Go. gnomock - integration testing with real dependencies (database, cache, even Kubernetes or AWS) running in Docker, without mocks. go-carpet - Tool for viewing test coverage in terminal. go-cmp - Package for comparing Go values in tests. go-hit - Hit is an http integration test framework written in golang. go-mutesting - Mutation testing for Go source code. go-testdeep - Extremely flexible golang deep comparison, extends the go testing package. go-testpredicate - Test predicate style assertions library with extensive diagnostics output. go-vcr - Record and replay your HTTP interactions for fast, deterministic and accurate tests. goblin - Mocha like testing framework fo Go. goc - Goc is a comprehensive coverage testing system for The Go Programming Language. gocheck - More advanced testing framework alternative to gotest. GoConvey - BDD-style framework with web UI and live reload. gocrest - Composable hamcrest-like matchers for Go assertions. godog - Cucumber or Behat like BDD framework for Go. gofight - API Handler Testing for Golang Router framework. gogiven - YATSPEC-like BDD testing framework for Go. gomatch - library created for testing JSON against patterns. gomega - Rspec like matcher/assertion library. GoSpec - BDD-style testing framework for the Go programming language. gospecify - This provides a BDD syntax for testing your Go code. It should be familiar to anybody who has used libraries such as rspec. gosuite - Brings lightweight test suites with setup/teardown facilities to testing by leveraging Go1.7\u0026rsquo;s Subtests. got - An enjoyable golang test framework. gotest.tools - A collection of packages to augment the go testing package and support common patterns. Hamcrest - fluent framework for declarative Matcher objects that, when applied to input values, produce self-describing results. httpexpect - Concise, declarative, and easy to use end-to-end HTTP and REST API testing. is - Professional lightweight testing mini-framework for Go. jsonassert - Package for verifying that your JSON payloads are serialized correctly. omg.testingtools - The simple library for change a values of private fields for testing. restit - Go micro framework to help writing RESTful API integration test. schema - Quick and easy expression matching for JSON schemas used in requests and responses. stop-and-go - Testing helper for concurrency. testcase - Idiomatic testing framework for Behavior Driven Development. testfixtures - A helper for Rails\u0026rsquo; like test fixtures to test database applications. Testify - Sacred extension to the standard go testing package. testmd - Convert markdown snippets into testable go code. testsql - Generate test data from SQL files before testing and clear it after finished. testza - Full-featured test framework with nice colorized output. trial - Quick and easy extendable assertions without introducing much boilerplate. Tt - Simple and colorful test tools. wstest - Websocket client for unit-testing a websocket http.Handler. Mock\ncounterfeiter - Tool for generating self-contained mock objects. genmock - Go mocking system with code generator for building calls of the interface methods. go-localstack - Tool for using localstack in AWS testing. go-sqlmock - Mock SQL driver for testing database interactions. go-txdb - Single transaction based database driver mainly for testing purposes. gock - Versatile HTTP mocking made easy. gomock - Mocking framework for the Go programming language. govcr - HTTP mock for Golang: record and replay HTTP interactions for offline testing. hoverfly - HTTP(S) proxy for recording and simulating REST/SOAP APIs with extensible middleware and easy-to-use CLI. httpmock - Easy mocking of HTTP responses from external resources. minimock - Mock generator for Go interfaces. mockery - Tool to generate Go interfaces. mockhttp - Mock object for Go http.ResponseWriter. mockit - Allows functions and method easy mocking, without defining new types; it\u0026rsquo;s similar to Mockito for Java. timex - A test-friendly replacement for the native time package. Fuzzing and delta-debugging/reducing/shrinking.\ngo-fuzz - Randomized testing system. gofuzz - Library for populating go objects with random values. Tavor - Generic fuzzing and delta-debugging framework. Selenium and browser control tools.\ncdp - Type-safe bindings for the Chrome Debugging Protocol that can be used with browsers or other debug targets that implement it. chromedp - a way to drive/test Chrome, Safari, Edge, Android Webviews, and other browsers supporting the Chrome Debugging Protocol. ggr - a lightweight server that routes and proxies Selenium WebDriver requests to multiple Selenium hubs. playwright-go - browser automation library to control Chromium, Firefox and WebKit with a single API. rod - A Devtools driver to make web automation and scraping easy. selenoid - alternative Selenium hub server that launches browsers within containers. Fail injection\nfailpoint - An implementation of failpoints for Golang. ⬆ back to top\nText Processing Libraries for parsing and manipulating texts.\nSee also Natural Language Processing and Text Analysis.\nFormatters address - Handles address representation, validation and formatting. align - A general purpose application that aligns text. bytes - Formats and parses numeric byte values (10K, 2M, 3G, etc.). go-fixedwidth - Fixed-width text formatting (encoder/decoder with reflection). go-humanize - Formatters for time, numbers, and memory size to human readable format. gotabulate - Easily pretty-print your tabular data with Go. textwrap - Wraps text at end of lines. Implementation of textwrap module from Python. Markup Languages bafi - Universal JSON, BSON, YAML, XML translator to ANY format using templates. bbConvert - Converts bbCode to HTML that allows you to add support for custom bbCode tags. blackfriday - Markdown processor in Go. github_flavored_markdown - GitHub Flavored Markdown renderer (using blackfriday) with fenced code block highlighting, clickable header anchor links. go-output-format - Output go structures into multiple formats (YAML/JSON/etc) in your command line app. go-toml - Go library for the TOML format with query support and handy cli tools. goq - Declarative unmarshaling of HTML using struct tags with jQuery syntax (uses GoQuery). html-to-markdown - Convert HTML to Markdown. Even works with entire websites and can be extended through rules. htmlquery - An XPath query package for HTML, lets you extract data or evaluate from HTML documents by an XPath expression. mxj - Encode / decode XML as JSON or map[string]interface{}; extract values with dot-notation paths and wildcards. Replaces x2j and j2x packages. toml - TOML configuration format (encoder/decoder with reflection). Parsers/Encoders/Decoders allot - Placeholder and wildcard text parsing for CLI tools and bots. codetree - Parses indented code (python, pixy, scarlet, etc.) and returns a tree structure. commonregex - A collection of common regular expressions for Go. did - DID (Decentralized Identifiers) Parser and Stringer in Go. doi - Document object identifier (doi) parser in Go. editorconfig-core-go - Editorconfig file parser and manipulator for Go. encdec - Package provides a generic interface to encoders and decoders. go-fasttld - High performance top level domains (TLD) extraction module. go-nmea - NMEA parser library for the Go language. go-vcard - Parse and format vCard. gofeed - Parse RSS and Atom feeds in Go. gographviz - Parses the Graphviz DOT language. gonameparts - Parses human names into individual name parts. ltsv - High performance LTSV (Labeled Tab Separated Value) reader for Go. normalize - Sanitize, normalize and compare fuzzy text. omniparser - A versatile ETL library that parses text input (CSV/txt/JSON/XML/EDI/X12/EDIFACT/etc) in streaming fashion and transforms data into JSON output using data-driven schema. parseargs-go - string argument parser that understands quotes and backslashes. parth - URL path segmentation parsing. sdp - SDP: Session Description Protocol [RFC 4566]. sh - Shell parser and formatter. tokenizer — Parse any string, slice or infinite buffer to any tokens. when - Natural EN and RU language date/time parser with pluggable rules. xj2go - Convert xml or json to go struct. Regular Expressions genex - Count and expand Regular Expressions into all matching Strings. go-wildcard - Simple and lightweight wildcard pattern matching. goregen - Library for generating random strings from regular expressions. regroup - Match regex expression named groups into go struct using struct tags and automatic parsing. Sanitation bluemonday - HTML Sanitizer. gofuckyourself - A sanitization-based swear filter for Go. Scrapers colly - Fast and Elegant Scraping Framework for Gophers. dataflowkit - Web scraping Framework to turn websites into structured data. GoQuery - GoQuery brings a syntax and a set of features similar to jQuery to the Go language. gospider - A simple golang spider/scraping framework,build a spider in 3 lines. migrated from goribot pagser - Pagser is a simple, extensible, configurable parse and deserialize html page to struct based on goquery and struct tags for golang crawler. Tagify - Produces a set of tags from given source. xurls - Extract urls from text. RSS podcast - iTunes Compliant and RSS 2.0 Podcast Generator in Golang syndfeed - A syndication feed for Atom 1.0 and RSS 2.0. Utility/Miscellaneous go-runewidth - Functions to get fixed width of the character or string. go-zero-width - Zero-width character detection and removal for Go. kace - Common case conversions covering common initialisms. petrovich - Petrovich is the library which inflects Russian names to given grammatical case. radix - Fast string sorting algorithm. TySug - Alternative suggestions with respect to keyboard layouts. ⬆ back to top\nThird-party APIs Libraries for accessing third party APIs.\nairtable - Go client library for the Airtable API. amazon-product-advertising-api - Go Client Library for Amazon Product Advertising API. anaconda - Go client library for the Twitter 1.1 API. appstore-sdk-go - Unofficial Golang SDK for AppStore Connect API. aws-sdk-go - The official AWS SDK for the Go programming language. bqwriter - High Level Go Library to write data into Google BigQuery at a high throughout. brewerydb - Go library for accessing the BreweryDB API. cachet - Go client library for Cachet (open source status page system). circleci - Go client library for interacting with CircleCI\u0026rsquo;s API. clarifai - Go client library for interfacing with the Clarifai API. codeship-go - Go client library for interacting with Codeship\u0026rsquo;s API v2. coinpaprika-go - Go client library for interacting with Coinpaprika\u0026rsquo;s API. device-check-go - Go client library for interacting with iOS DeviceCheck API v1. discordgo - Go bindings for the Discord Chat API. dusupay-sdk-go - Unofficial Dusupay payment gateway API Client for Go ethrpc - Go bindings for Ethereum JSON RPC API. facebook - Go Library that supports the Facebook Graph API. fasapay-sdk-go - Unofficial Fasapay payment gateway XML API Client for Golang. fcm - Go library for Firebase Cloud Messaging. gads - Google Adwords Unofficial API. gami - Go library for Asterisk Manager Interface. gcm - Go library for Google Cloud Messaging. geo-golang - Go Library to access Google Maps, MapQuest, Nominatim, OpenCage, Bing, Mapbox, and OpenStreetMap geocoding / reverse geocoding APIs. github - Go library for accessing the GitHub REST API v3. githubql - Go library for accessing the GitHub GraphQL API v4. go-atlassian - Go library for accessing the Atlassian Cloud services (Jira, Jira Service Management, Jira Agile, Confluence, Admin Cloud) go-aws-news - Go application and library to fetch what\u0026rsquo;s new from AWS. go-chronos - Go library for interacting with the Chronos Job Scheduler go-hacknews - Tiny Go client for HackerNews API. go-here - Go client library around the HERE location based APIs. go-hibp - Simple Go binding to the \u0026ldquo;Have I Been Pwned\u0026rdquo; APIs. go-imgur - Go client library for imgur go-jira - Go client library for Atlassian JIRA go-lark - An easy-to-use unofficial SDK for Feishu and Lark Open Platform. go-marathon - Go library for interacting with Mesosphere\u0026rsquo;s Marathon PAAS. go-myanimelist - Go client library for accessing the MyAnimeList API. go-openproject - Go client library for interacting with OpenProject API. go-postman-collection - Go module to work with Postman Collections (compatible with Insomnia). go-restcountries - Go library for the REST Countries API. go-sophos - Go client library for the Sophos UTM REST API with zero dependencies. go-sptrans - Go client library for the SPTrans Olho Vivo API. go-swagger-ui - Go library containing precompiled Swagger UI for serving swagger json. go-telegraph - Telegraph publishing platform API client. go-trending - Go library for accessing trending repositories and developers at Github. go-twitch - Go client for interacting with the Twitch v3 API. go-twitter - Go client library for the Twitter v1.1 APIs. go-unsplash - Go client library for the Unsplash.com API. go-xkcd - Go client for the xkcd API. go-yapla - Go client library for the Yapla v2.0 API. gogtrends - Google Trends Unofficial API. golang-tmdb - Golang wrapper for The Movie Database API v3. golyrics - Golyrics is a Go library to fetch music lyrics data from the Wikia website. gomalshare - Go library MalShare API malshare.com GoMusicBrainz - Go MusicBrainz WS2 client library. google - Auto-generated Google APIs for Go. google-analytics - Simple wrapper for easy google analytics reporting. google-cloud - Google Cloud APIs Go Client Library. google-email-audit-api - Go client library for Google G Suite Email Audit API. google-play-scraper - Get data from Google Play Store. gopaapi5 - Go Client Library for Amazon Product Advertising API 5.0. gosip - Go client library SharePoint API. gostorm - GoStorm is a Go library that implements the communications protocol required to write Storm spouts and Bolts in Go that communicate with the Storm shells. hipchat - This project implements a golang client library for the Hipchat API. hipchat (xmpp) - A golang package to communicate with HipChat over XMPP. igdb - Go client for the Internet Game Database API. jokeapi-go - Go client for JokeAPI. kanka - Go client for the Kanka API. lark - Feishu/Lark Open API Go SDK, Support ALL Open API and Event Callback. lastpass-go - Go client library for the LastPass API. libgoffi - Library adapter toolbox for native libffi integration Medium - Golang SDK for Medium\u0026rsquo;s OAuth2 API. megos - Client library for accessing an Apache Mesos cluster. minio-go - Minio Go Library for Amazon S3 compatible cloud storage. mixpanel - Mixpanel is a library for tracking events and sending Mixpanel profile updates to Mixpanel from your go applications. newsapi-go - Go client for NewsAPI. patreon-go - Go library for Patreon API. paypal - Wrapper for PayPal payment API. playlyfe - The Playlyfe Rest API Go SDK. pushover - Go wrapper for the Pushover API. rawg-sdk-go - Go library for the RAWG Video Games Database API rrdaclient - Go Library to access statdns.com API, which is in turn RRDA API. DNS Queries over HTTP. shopify - Go Library to make CRUD request to the Shopify API. simples3 - Simple no frills AWS S3 Library using REST with V4 Signing written in Go. slack - Slack API in Go. smite - Go package to wraps access to the Smite game API. spotify - Go Library to access Spotify WEB API. steam - Go Library to interact with Steam game servers. stripe - Go client for the Stripe API. textbelt - Go client for the textbelt.com txt messaging API. translate - Go online translation package. Trello - Go wrapper for the Trello API. TripAdvisor - Go wrapper for the TripAdvisor API. tumblr - Go wrapper for the Tumblr v2 API. twitter-scraper - Scrape the Twitter Frontend API without authentication and limits. uptimerobot - Go wrapper and command-line client for the Uptime Robot v2 API. vl-go - Go client library around the VerifID identity verification layer API. webhooks - Webhook receiver for GitHub and Bitbucket. wit-go - Go client for wit.ai HTTP API. ynab - Go wrapper for the YNAB API. zooz - Go client for the Zooz API. ⬆ back to top\nUtilities General utilities and tools to make your life easier.\napm - Process manager for Golang applications with an HTTP API. backscanner - A scanner similar to bufio.Scanner, but it reads and returns lines in reverse order, starting at a given position and going backward. beyond - The Go tool that will drive you to the AOP world! blank - Verify or remove blanks and whitespace from strings. bleep - Perform any number of actions on any set of OS signals in Go. boilr - Blazingly fast CLI tool for creating projects from boilerplate templates. changie - Automated changelog tool for preparing releases with lots of customization options. chyle - Changelog generator using a git repository with multiple configuration possibilities. circuit - An efficient and feature complete Hystrix like Go implementation of the circuit breaker pattern. circuitbreaker - Circuit Breakers in Go. clipboard - 📋 cross-platform clipboard package in Go. clockwork - A simple fake clock for golang. cmd - Library for executing shell commands on osx, windows and linux. command - Command pattern for Go with thread safe serial and parallel dispatcher. copy - Package for fast copying structs of different types. copy-pasta - Universal multi-workstation clipboard that uses S3 like backend for the storage. countries - Full implementation of ISO-3166-1, ISO-4217, ITU-T E.164, Unicode CLDR and IANA ccTLD standarts. create-go-app - A powerful CLI for create a new production-ready project with backend (Golang), frontend (JavaScript, TypeScript) \u0026amp; deploy automation (Ansible, Docker) by running one command. cryptgo - Crytpgo is a TUI based application written purely in Go to monitor and observe cryptocurrency prices in real time! ctop - Top-like interface (e.g. htop) for container metrics. ctxutil - A collection of utility functions for contexts. cvt - Easy and safe convert any value to another type. dbt - A framework for running self-updating signed binaries from a central, trusted repository. Death - Managing go application shutdown with signals. Deepcopier - Simple struct copying for Go. delve - Go debugger. dlog - Compile-time controlled logger to make your release smaller without removing debug calls. equalizer - Quota manager and rate limiter collection for Go. ergo - The management of multiple local services running over different ports made easy. evaluator - Evaluate an expression dynamicly based on s-expression. It\u0026rsquo;s simple and easy to extend. filetype - Small package to infer the file type checking the magic numbers signature. filler - small utility to fill structs using \u0026ldquo;fill\u0026rdquo; tag. filter - provide filtering, sanitizing, and conversion of Go data. fzf - Command-line fuzzy finder written in Go. generate - runs go generate recursively on a specified path or environment variable and can filter by regex. ghokin - Parallelized formatter with no external dependencies for gherkin (cucumber, behat\u0026hellip;). git-time-metric - Simple, seamless, lightweight time tracking for Git. go-actuator - Production ready features for Go based web frameworks. go-astitodo - Parse TODOs in your GO code. go-bind-plugin - go:generate tool for wrapping symbols exported by golang plugins (1.8 only). go-bsdiff - Pure Go bsdiff and bspatch libraries and CLI tools. go-clip - A minimalistic clipboard manager for Mac. go-convert - Package go-convert enables you to convert a value into another type. go-countries - Lightweight lookup over ISO-3166 codes. go-dry - DRY (don\u0026rsquo;t repeat yourself) package for Go. go-funk - Modern Go utility library which provides helpers (map, find, contains, filter, chunk, reverse, \u0026hellip;). go-health - Health package simplifies the way you add health check to your services. go-httpheader - Go library for encoding structs into Header fields. go-lock - go-lock is a lock library implementing read-write mutex and read-write trylock without starvation. go-pkg - A go toolkit. go-problemdetails - Go package for working with Problem Details. go-rate - Timed rate limiter for Go. go-safe - Panic-safe sandbox. go-sitemap-generator - XML Sitemap generator written in Go. go-trigger - Go-lang global event triggerer, Register Events with an id and trigger the event from anywhere from your project. go-type - Library providing Go types for store/validation and transfer of ISO-4217, ISO-3166, and other types. goback - Go simple exponential backoff package. goctx - Get your context value with high performance. godaemon - Utility to write daemons. godropbox - Common libraries for writing Go services/applications from Dropbox. gohper - Various tools/modules help for development. golarm - Fire alarms with system events. golog - Easy and lightweight CLI tool to time track your tasks. gopencils - Small and simple package to easily consume REST APIs. goplaceholder - a small golang lib to generate placeholder images. goreadability - Webpage summary extractor using Facebook Open Graph and arc90\u0026rsquo;s readability. goreleaser - Deliver Go binaries as fast and easily as possible. goreporter - Golang tool that does static analysis, unit testing, code review and generate code quality report. goseaweedfs - SeaweedFS client library with almost full features. gostrutils - Collections of string manipulation and conversion functions. gotenv - Load environment variables from .env or any io.Reader in Go. goval - Evaluate arbitrary expressions in Go. gpath - Library to simplify access struct fields with Go\u0026rsquo;s expression in reflection. grofer - A system and resource monitoring tool written in Golang! gubrak - Golang utility library with syntactic sugar. It\u0026rsquo;s like lodash, but for golang. handy - Many utilities and helpers like string handlers/formatters and validators. hostctl - A CLI tool to manage /etc/hosts with easy commands. htcat - Parallel and Pipelined HTTP GET Utility. hub - wrap git commands with additional functionality to interact with github from the terminal. hystrix-go - Implements Hystrix patterns of programmer-defined fallbacks aka circuit breaker. immortal - *nix cross-platform (OS agnostic) supervisor. intrinsic - Use x86 SIMD without writing any assembly code. jsend - JSend\u0026rsquo;s implementation writen in Go. jump - Jump helps you navigate faster by learning your habits. koazee - Library inspired in Lazy evaluation and functional programming that takes the hassle out of working with arrays. lets-go - Go module that provides common utilities for Cloud Native REST API development. Also contains AWS Specific utilities. limiters - Rate limiters for distributed applications in Golang with configurable back-ends and distributed locks. lo - A Lodash like Go library based on Go 1.18+ Generics (map, filter, contains, find\u0026hellip;) lrserver - LiveReload server for Go. mani - CLI tool to help you manage multiple repositories. mc - Minio Client provides minimal tools to work with Amazon S3 compatible cloud storage and filesystems. mergo - Helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. mimemagic - Pure Go ultra performant MIME sniffing library/utility. mimesniffer - A MIME type sniffer for Go. mimetype - Package for MIME type detection based on magic numbers. minify - Fast minifiers for HTML, CSS, JS, XML, JSON and SVG file formats. minquery - MongoDB / mgo.v2 query that supports efficient pagination (cursors to continue listing documents where we left off). moldova - Utility for generating random data based on an input template. mole - cli app to easily create ssh tunnels. mongo-go-pagination - Mongodb Pagination for official mongodb/mongo-go-driver package which supports both normal queries and Aggregation pipelines. mssqlx - Database client library, proxy for any master slave, master master structures. Lightweight and auto balancing in mind. multitick - Multiplexor for aligned tickers. myhttp - Simple API to make HTTP GET requests with timeout support. netbug - Easy remote profiling of your services. nfdump - Read nfdump netflow files. nostromo - CLI for building powerful aliases. objwalker - Walk by go objects with reflection. okrun - go run error steamroller. olaf - Twitter Snowflake implemented in Go. onecache - Caching library with support for multiple backend stores (Redis, Memcached, filesystem etc). panicparse - Groups similar goroutines and colorizes stack dump. pattern-match - Pattern matching libray. peco - Simplistic interactive filtering tool. pgo - Convenient functions for PHP community. pm - Process (i.e. goroutine) manager with an HTTP API. pointer - Package pointer contains helper routines for simplifying the creation of optional fields of basic type. ptr - Package that provide functions for simplified creation of pointers from constants of basic types. rclient - Readable, flexible, simple-to-use client for REST APIs. reflectutils - Helpers for working with reflection: struct tag parsing; recursive walking; fill value from string. repeat - Go implementation of different backoff strategies useful for retrying operations and heartbeating. request - Go HTTP Requests for Humans™. rerate - Redis-based rate counter and rate limiter for Go. rerun - Recompiling and rerunning go apps when source changes. rest-go - A package that provide many helpful methods for working with rest api. retry - The most advanced functional mechanism to perform actions repetitively until successful. retry - A simple but highly configurable retry package for Go. retry - Simple and easy retry mechanism package for Go. retry - A pretty simple library to ensure your work to be done. retry-go - Retrying made simple and easy for golang. robustly - Runs functions resiliently, catching and restarting panics. rospo - Simple and reliable ssh tunnels with embedded ssh server in Golang. scan - Scan golang sql.Rows directly to structs, slices, or primitive types. scany - Library for scanning data from a database into Go structs and more. serve - A static http server anywhere you need. set - Performant and flexible struct mapping and loose type conversion. shutdown - App shutdown hooks for os.Signal handling. silk - Read silk netflow files. slice - Type-safe functions for common Go slice operations. sliceconv - Slice conversion between primitive types. slicer - Makes working with slices easier. sorty - Fast Concurrent / Parallel Sorting. sqlx - provides a set of extensions on top of the excellent built-in database/sql package. sshman - SSH Manager for authorized_keys files on multiple remote servers. statiks - Fast, zero-configuration, static HTTP filer server. Storm - Simple and powerful toolkit for BoltDB. structs - Implement simple functions to manipulate structs. throttle - Throttle is an object that will perform exactly one action per duration. tik - Simple and easy timing wheel package for Go. tome - Tome was designed to paginate simple RESTful APIs. toolbox - Slice, map, multimap, struct, function, data conversion utilities. Service router, macro evaluator, tokenizer. ugo - ugo is slice toolbox with concise syntax for Go. UNIS - Common Architecture™ for String Utilities in Go. usql - usql is a universal command-line interface for SQL databases. util - Collection of useful utility functions. (strings, concurrency, manipulations, \u0026hellip;). wuzz - Interactive cli tool for HTTP inspection. xferspdy - Xferspdy provides binary diff and patch library in golang. ⬆ back to top\nUUID Libraries for working with UUIDs.\ngoflake - A small, scalable, \u0026amp; serverless unique ID generator for use in distributed systems. Inspired by Twitters Snowflake. goid - Generate and Parse RFC4122 compliant V4 UUIDs. gouid - Generate cryptographically secure random string IDs with just one allocation. nanoid - A tiny and efficient Go unique string ID generator. sno - Compact, sortable and fast unique IDs with embedded metadata. ulid - Go implementation of ULID (Universally Unique Lexicographically Sortable Identifier). uniq - No hassle safe, fast unique identifiers with commands. uuid - Generate, encode, and decode UUIDs v1 with fast or cryptographic-quality random node identifier. uuid - Implementation of Universally Unique Identifier (UUID). Supports both creation and parsing of UUIDs. Actively maintained fork of satori uuid. uuid - Go package for UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services. wuid - An extremely fast unique number generator, 10-135 times faster than UUID. xid - Xid is a globally unique id generator library, ready to be safely used directly in your server code. ⬆ back to top\nValidation Libraries for validation.\ncheckdigit - Provide check digit algorithms (Luhn, Verhoeff, Damm) and calculators (ISBN, EAN, JAN, UPC, etc.). gody - 🎈 A lightweight struct validator for Go. govalid - Fast, tag-based validation for structs. govalidator - Validators and sanitizers for strings, numerics, slices and structs. govalidator - Validate Golang request data with simple rules. Highly inspired by Laravel\u0026rsquo;s request validation. jio - jio is a json schema validator similar to joi. ozzo-validation - Supports validation of various data types (structs, strings, maps, slices, etc.) with configurable and extensible validation rules specified in usual code constructs instead of struct tags. terraform-validator - A norms and conventions validator for Terraform. validate - Go package for data validation and filtering. support validate Map, Struct, Request(Form, JSON, url.Values, Uploaded Files) data and more features. validate - This package provides a framework for writing validations for Go applications. validator - Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving. Validator - A lightweight model validator written in Go.Contains VFs:Min, Max, MinLength, MaxLength, Length, Enum, Regex. ⬆ back to top\nVersion Control Libraries for version control.\nfroggit-go - Froggit-Go is a Go library, allowing to perform actions on VCS providers. gh - Scriptable server and net/http middleware for GitHub Webhooks. git2go - Go bindings for libgit2. githooks - Per-repo and shared Git hooks with version control and auto update. glab - An open-source GitLab command line tool bringing GitLab\u0026rsquo;s cool features to your command line. go-git - highly extensible Git implementation in pure Go. go-vcs - manipulate and inspect VCS repositories in Go. hercules - gaining advanced insights from Git repository history. hgo - Hgo is a collection of Go packages providing read-access to local Mercurial repositories. ⬆ back to top\nVideo Libraries for manipulating video.\ngmf - Go bindings for FFmpeg av* libraries. go-astisub - Manipulate subtitles in GO (.srt, .stl, .ttml, .webvtt, .ssa/.ass, teletext, .smi, etc.). go-astits - Parse and demux MPEG Transport Streams (.ts) natively in GO. go-m3u8 - Parser and generator library for Apple m3u8 playlists. go-mpd - Parser and generator library for MPEG-DASH manifest files. goav - Comprehensive Go bindings for FFmpeg. gortsplib - Pure Go RTSP server and client library. gst - Go bindings for GStreamer. libgosubs - Subtitle format support for go. Supports .srt, .ttml, and .ass. libvlc-go - Go bindings for libvlc 2.X/3.X/4.X (used by the VLC media player). m3u8 - Parser and generator library of M3U8 playlists for Apple HLS. v4l - Video capture library for Linux, written in Go. ⬆ back to top\nWeb Frameworks Full stack web frameworks.\naah - Scalable, performant, rapid development Web framework for Go. Aero - High-performance web framework for Go, reaches top scores in Lighthouse. Air - An ideally refined web framework for Go. anoweb - The lightweight and powerful web framework using the new way for Go.Another go the way. appy - An opinionated productive web framework that helps scaling business easier. Banjo - Very simple and fast web framework for Go. Beego - beego is an open-source, high-performance web framework for the Go programming language. Buffalo - Bringing the productivity of Rails to Go! Confetti Framework - Confetti is a Go web application framework with an expressive, elegant syntax. Confetti combines the elegance of Laravel and the simplicity of Go. Echo - High performance, minimalist Go web framework. Fiber - An Express.js inspired web framework build on Fasthttp. Fireball - More \u0026ldquo;natural\u0026rdquo; feeling web framework. Flamingo - Framework for pluggable web projects. Including a concept for modules and offering features for DI, Configareas, i18n, template engines, graphql, observability, security, events, routing \u0026amp; reverse routing etc. Flamingo Commerce - Providing e-commerce features using clean architecture like DDD and ports and adapters, that you can use to build flexible e-commerce applications. Gearbox - A web framework written in Go with a focus on high performance and memory optimization. Gin - Gin is a web framework written in Go! It features a martini-like API with much better performance, up to 40 times faster. If you need performance and good productivity. Ginrpc - Gin parameter automatic binding tool,gin rpc tools. Gizmo - Microservice toolkit used by the New York Times. go-json-rest - Quick and easy way to setup a RESTful JSON API. go-rest - Small and evil REST framework for Go. Goa - Goa provides a holistic approach for developing remote APIs and microservices in Go. goa - goa is just like koajs for golang, it is a flexible, light, high-performance and extensible web framework based on middleware. golamb - Golamb makes it easier to write API endpoints for use with AWS Lambda and API Gateway. Golax - A non Sinatra fast HTTP framework with support for Google custom methods, deep interceptors, recursion and more. Golf - Golf is a fast, simple and lightweight micro-web framework for Go. It comes with powerful features and has no dependencies other than the Go Standard Library. Gondola - The web framework for writing faster sites, faster. gongular - Fast Go web framework with input mapping/validation and (DI) Dependency Injection. GoTuna - Minimalistic web framework for Go with mux router, middlewares, sessions, templates, embedded views and static files. goweb - Web framework with routing, websockets, logging, middleware, static file server (optional gzip), and automatic TLS. Goyave - Feature-complete REST API framework aimed at clean code and fast development, with powerful built-in functionalities. hiboot - hiboot is a high performance web application framework with auto configuration and dependency injection support. Huma - Framework for modern REST/GraphQL APIs with built-in OpenAPI 3, generated documentation, and a CLI. Macaron - Macaron is a high productive and modular design web framework in Go. mango - Mango is a modular web-application framework for Go, inspired by Rack, and PEP333. Microservice - The framework for the creation of microservices, written in Golang. neo - Neo is minimal and fast Go Web Framework with extremely simple API. patron - Patron is a microservice framework following best cloud practices with a focus on productivity. Resoursea - REST framework for quickly writing resource based services. REST Layer - Framework to build REST/GraphQL API on top of databases with mostly configuration over code. Revel - High-productivity web framework for the Go language. rex - Rex is a library for modular development built upon gorilla/mux, fully compatible with net/http. rk-boot - A bootstrapper library for building enterprise go microservice with Gin and gRPC quickly and easily. rux - Simple and fast web framework for build golang HTTP applications. tango - Micro \u0026amp; pluggable web framework for Go. tigertonic - Go framework for building JSON web services inspired by Dropwizard. uAdmin - Fully featured web framework for Golang, inspired by Django. utron - Lightweight MVC framework for Go(Golang). vox - A golang web framework for humans, inspired by Koa heavily. WebGo - A micro-framework to build web apps; with handler chaining, middleware and context injection. With standard library compliant HTTP handlers(i.e. http.HandlerFunc). YARF - Fast micro-framework designed to build REST APIs and web services in a fast and simple way. ⬆ back to top\nMiddlewares Actual middlewares client-timing - An HTTP client for Server-Timing header. CORS - Easily add CORS capabilities to your API. formjson - Transparently handle JSON input as a standard form POST. go-fault - Fault injection middleware for Go. go-server-timing - Add/parse Server-Timing header. Limiter - Dead simple rate limit middleware for Go. ln-paywall - Go middleware for monetizing APIs on a per-request basis with the Lightning Network (Bitcoin). mid - Miscellaneous HTTP middleware features: idiomatic error return from handlers; receive/respond with JSON data; request tracing; and more. rk-gin - Middleware for Gin framework with logging, metrics, auth, tracing etc. rk-grpc - Middleware for gRPC with logging, metrics, auth, tracing etc. Tollbooth - Rate limit HTTP request handler. XFF - Handle X-Forwarded-For header and friends. Libraries for creating HTTP middlewares alice - Painless middleware chaining for Go. catena - http.Handler wrapper catenation (same API as \u0026ldquo;chain\u0026rdquo;). chain - Handler wrapper chaining with scoped data (net/context-based \u0026ldquo;middleware\u0026rdquo;). go-wrap - Small middlewares package for net/http. gores - Go package that handles HTML, JSON, XML and etc. responses. Useful for RESTful APIs. interpose - Minimalist net/http middleware for golang. mediary - add interceptors to http.Client to allow dumping/shaping/tracing/\u0026hellip; of requests/responses. muxchain - Lightweight middleware for net/http. negroni - Idiomatic HTTP middleware for Golang. render - Go package for easily rendering JSON, XML, and HTML template responses. renderer - Simple, lightweight and faster response (JSON, JSONP, XML, YAML, HTML, File) rendering package for Go. rye - Tiny Go middleware library (with canned Middlewares) that supports JWT, CORS, Statsd, and Go 1.7 context. stats - Go middleware that stores various information about your web application. ⬆ back to top\nRouters alien - Lightweight and fast http router from outer space. bellt - A simple Go HTTP router. Bone - Lightning Fast HTTP Multiplexer. Bxog - Simple and fast HTTP router for Go. It works with routes of varying difficulty, length and nesting. And he knows how to create a URL from the received parameters. chi - Small, fast and expressive HTTP router built on net/context. fasthttprouter - High performance router forked from httprouter. The first router fit for fasthttp. FastRouter - a fast, flexible HTTP router written in Go. goblin - A golang http router based on trie tree. gocraft/web - Mux and middleware package in Go. Goji - Goji is a minimalistic and flexible HTTP request multiplexer with support for net/context. GoLobby/Router - GoLobby Router is a lightweight yet powerful HTTP router for the Go programming language. goroute - Simple yet powerful HTTP request multiplexer. GoRouter - GoRouter is a Server/API micro framework, HTTP request router, multiplexer, mux that provides request router with middleware supporting net/context. gowww/router - Lightning fast HTTP router fully compatible with the net/http.Handler interface. httprouter - High performance router. Use this and the standard http handlers to form a very high performance web framework. httptreemux - High-speed, flexible tree-based HTTP router for Go. Inspiration from httprouter. lars - Is a lightweight, fast and extensible zero allocation HTTP router for Go used to create customizable frameworks. mux - Powerful URL router and dispatcher for golang. nchi - chi-like router built on httprouter with dependency injection based middleware wrappers ngamux - Simple HTTP router for Go. ozzo-routing - An extremely fast Go (golang) HTTP router that supports regular expression route matching. Comes with full support for building RESTful APIs. pure - Is a lightweight HTTP router that sticks to the std \u0026ldquo;net/http\u0026rdquo; implementation. Siesta - Composable framework to write middleware and handlers. vestigo - Performant, stand-alone, HTTP compliant URL Router for go web applications. violetear - Go HTTP router. xmux - High performance muxer based on httprouter with net/context support. xujiajun/gorouter - A simple and fast HTTP router for Go. ⬆ back to top\nWebAssembly dom - DOM library. go-canvas - Library to use HTML5 Canvas, with all drawing within go code. tinygo - Go compiler for small places. Microcontrollers, WebAssembly, and command-line tools. Based on LLVM. vert - Interop between Go and JS values. wasmbrowsertest - Run Go WASM tests in your browser. webapi - Bindings for DOM and HTML generated from WebIDL. ⬆ back to top\nWindows d3d9 - Go bindings for Direct3D9. go-ole - Win32 OLE implementation for golang. gosddl - Converter from SDDL-string to user-friendly JSON. SDDL consist of four part: Owner, Primary Group, DACL, SACL. ⬆ back to top\nXML Libraries and tools for manipulating XML.\nXML-Comp - Simple command line XML comparer that generates diffs of folders, files and tags. xml2map - XML to MAP converter written Golang. xmlwriter - Procedural XML generation API based on libxml2\u0026rsquo;s xmlwriter module. xpath - XPath package for Go. xquery - XQuery lets you extract data from HTML/XML documents using XPath expression. zek - Generate a Go struct from XML. Zero Trust Libraries and tools to implement Zero Trust architectures.\nCosign - Container Signing, Verification and Storage in an OCI registry. in-toto - Go implementation of the in-toto (provides a framework to protect the integrity of the software supply chain) python reference implementation. Spiffe-Vault - Utilizes Spiffe JWT authentication with Hashicorp Vault for secretless authentication. Spire - SPIRE (the SPIFFE Runtime Environment) is a toolchain of APIs for establishing trust between software systems across a wide variety of hosting platforms. Code Analysis Source code analysis tools, also known as Static Application Security Testing (SAST) Tools.\napicompat - Checks recent changes to a Go project for backwards incompatible changes. ChainJacking - Find which of your Go lang direct GitHub dependencies is susceptible to ChainJacking attack. dupl - Tool for code clone detection. errcheck - Errcheck is a program for checking for unchecked errors in Go programs. gcvis - Visualise Go program GC trace data in real time. go-checkstyle - checkstyle is a style check tool like java checkstyle. This tool inspired by java checkstyle, golint. The style referred to some points in Go Code Review Comments. go-cleanarch - go-cleanarch was created to validate Clean Architecture rules, like a The Dependency Rule and interaction between packages in your Go projects. go-critic - source code linter that brings checks that are currently not implemented in other linters. go-mod-outdated - An easy way to find outdated dependencies of your Go projects. go-outdated - Console application that displays outdated packages. goast-viewer - Web based Golang AST visualizer. GoCover.io - GoCover.io offers the code coverage of any golang package as a service. goimports - Tool to fix (add, remove) your Go imports automatically. golang-ifood-sdk - iFood API SDK. golines - Formatter that automatically shortens long lines in Go code. GoLint - Golint is a linter for Go source code. Golint online - Lints online Go source files on GitHub, Bitbucket and Google Project Hosting using the golint package. GoPlantUML - Library and CLI that generates text plantump class diagram containing information about structures and interfaces with the relationship among them. goreturns - Adds zero-value return statements to match the func return types. gosimple - gosimple is a linter for Go source code that specialises on simplifying code. gostatus - Command line tool, shows the status of repositories that contain Go packages. lint - Run linters as part of go test. php-parser - A Parser for PHP written in Go. staticcheck - staticcheck is go vet on steroids, applying a ton of static analysis checks you might be used to from tools like ReSharper for C#. tarp - tarp finds functions and methods without direct unit tests in Go source code. tickgit - CLI and go package for surfacing code comment TODOs (in any language) and applying a git blameto identify the author. todocheck - Static code analyser which links TODO comments in code with issues in your issue tracker. unconvert - Remove unnecessary type conversions from Go source. unused - unused checks Go code for unused constants, variables, functions and types. validate - Automatically validates struct fields with tags. ⬆ back to top\nEditor Plugins Plugin for text editors and IDEs.\ncoc-go language server extension for Vim/Neovim - This plugin adds gopls features to Vim/Neovim. Go Doc - A Visual Studio Code extension for showing definition in output and generating go doc. Go plugin for JetBrains IDEs - Go plugin for JetBrains IDEs. go-language-server - A wrapper to turn the VSCode go extension into a language server supporting the language-server-protocol. go-mode - Go mode for GNU/Emacs. go-plus - Go (Golang) Package For Atom That Adds Autocomplete, Formatting, Syntax Checking, Linting and Vetting. gocode - Autocompletion daemon for the Go programming language. goimports-reviser - Formatting tool for imports. goprofiling - This extension adds benchmark profiling support for the Go language to VS Code. GoSublime - Golang plugin collection for the text editor SublimeText 3 providing code completion and other IDE-like features. gounit-vim - Vim plugin for generating Go tests based on the function\u0026rsquo;s or method\u0026rsquo;s signature. theia-go-extension - Go language support for the Theia IDE. vim-compiler-go - Vim plugin to highlight syntax errors on save. vim-go - Go development plugin for Vim. vscode-go - Extension for Visual Studio Code (VS Code) which provides support for the Go language. Watch - Runs a command in an acme win on file changes. ⬆ back to top\nGo Generate Tools generic - flexible data type for Go. genny - Elegant generics for Go. gocontracts - brings design-by-contract to Go by synchronizing the code with the documentation. godal - Generate orm models corresponding to golang by specifying sql ddl file, which can be used by gorm. gonerics - Idiomatic Generics in Go. gotests - Generate Go tests from your source code. gounit - Generate Go tests using your own templates. hasgo - Generate Haskell inspired functions for your slices. re2dfa - Transform regular expressions into finite state machines and output Go source code. TOML-to-Go - Translates TOML into a Go type in the browser instantly. xgen - XSD (XML Schema Definition) parser and Go/C/Java/Rust/TypeScript code generator. ⬆ back to top\nGo Tools colorgo - Wrapper around go command for colorized go build output. depth - Visualize dependency trees of any package by analyzing imports. docs - Automatically generate RESTful API documentation for GO projects - aligned with Open API Specification standard. generator-go-lang - A Yeoman generator to get new Go projects started. go-callvis - Visualize call graph of your Go program using dot format. go-james - Go project skeleton creator, builds and tests your projects without the manual setup. go-pkg-complete - Bash completion for go and wgo. go-swagger - Swagger 2.0 implementation for go. Swagger is a simple yet powerful representation of your RESTful API. godbg - Implementation of Rusts dbg! macro for quick and easy debugging during development. gomodrun - Go tool that executes and caches binaries included in go.mod files. gotestdox - Show Go test results as readable sentences. gothanks - GoThanks automatically stars your go.mod github dependencies, sending this way some love to their maintainers. igo - An igo to go transpiler (new language features for Go language!) modver - Compare two versions of a Go module to check the version-number change required (major, minor, or patchlevel), according to semver rules. OctoLinker - Navigate through go files efficiently with the OctoLinker browser extension for GitHub. richgo - Enrich go test outputs with text decorations. roumon - Monitor current state of all active goroutines via a command line interface. rts - RTS: response to struct. Generates Go structs from server responses. typex - Examine Go types and their transitive dependencies, alternatively export results as TypeScript value objects (or types) declaration. ⬆ back to top\nSoftware Packages Software written in Go.\n⬆ back to top\nDevOps Tools abbreviate - abbreviate is a tool turning long strings in to shorter ones with configurable seperaters, for example to embed branch names in to deployment stack IDs. aptly - aptly is a Debian repository management tool. aurora - Cross-platform web-based Beanstalkd queue server console. awsenv - Small binary that loads Amazon (AWS) environment variables for a profile. Balerter - A self-hosted script-based alerting manager. Blast - A simple tool for API load testing and batch jobs. bombardier - Fast cross-platform HTTP benchmarking tool. bosun - Time Series Alerting Framework. cassowary - Modern cross-platform HTTP load-testing tool written in Go. Ddosify - High-performance load testing tool, written in Golang. DepCharge - Helps orchestrating the execution of commands across the many dependencies in larger projects. docker-go-mingw - Docker image for building Go binaries for Windows with MinGW toolchain. Dockerfile-Generator - A go library and an executable that produces valid Dockerfiles using various input channels. dogo - Monitoring changes in the source file and automatically compile and run (restart). drone-jenkins - Trigger downstream Jenkins jobs using a binary, docker or Drone CI. drone-scp - Copy files and artifacts via SSH using a binary, docker or Drone CI. Dropship - Tool for deploying code via cdn. easyssh-proxy - Golang package for easy remote execution through SSH and SCP downloading via ProxyCommand. fac - Command-line user interface to fix git merge conflicts. gaia - Build powerful pipelines in any programming language. ghorg - Quickly clone an entire org/users repositories into one directory - Supports GitHub, GitLab, Gitea, and Bitbucket. Gitea - Fork of Gogs, entirely community driven. gitea-github-migrator - Migrate all your GitHub repositories, issues, milestones and labels to your Gitea instance. go-furnace - Hosting solution written in Go. Deploy your Application with ease on AWS, GCP or DigitalOcean. go-rocket-update - A simple way to make self updating Go applications - Supports Github and Gitlab. go-selfupdate - Enable your Go applications to self update. gobrew - gobrew lets you easily switch between multiple versions of go. godbg - Web-based gdb front-end application. Gogs - A Self Hosted Git Service in the Go Programming Language. gonative - Tool which creates a build of Go that can cross compile to all platforms while still using the Cgo-enabled versions of the stdlib packages. govvv - “go build” wrapper to easily add version information into Go binaries. gox - Dead simple, no frills Go cross compile tool. goxc - build tool for Go, with a focus on cross-compiling and packaging. grapes - Lightweight tool designed to distribute commands over ssh with ease. GVM - GVM provides an interface to manage Go versions. Hey - Hey is a tiny program that sends some load to a web application. httpref - httpref is a handy CLI reference for HTTP methods, status codes, headers, and TCP and UDP ports. jcli - Jenkins CLI allows you manage your Jenkins as an easy way. kala - Simplistic, modern, and performant job scheduler. kcli - Command line tool for inspecting kafka topics/partitions/messages. ko - Command line tool for building and deploying Go applications on Kubernetes kool - Command line tool for managing Docker environments as an easy way. kubernetes - Container Cluster Manager from Google. kwatch - Monitor \u0026amp; detect crashes in your Kubernetes(K8s) cluster instantly. lstags - Tool and API to sync Docker images across different registries. lwc - A live-updating version of the UNIX wc command. manssh - manssh is a command line tool for managing your ssh alias config easily. Mantil - Go specific framework for building serverless applications on AWS that enables you to focus on pure Go code while Mantil takes care of the infrastructure. Mizu - API traffic viewer for Kubernetes enabling you to view all API communication between microservices, multiprotocol support: HTTP1.1, HTTP/2, AMQP, Kafka, Redis. Moby - Collaborative project for the container ecosystem to assemble container-based systems. Mora - REST server for accessing MongoDB documents and meta data. ostent - collects and displays system metrics and optionally relays to Graphite and/or InfluxDB. Packer - Packer is a tool for creating identical machine images for multiple platforms from a single source configuration. Pewpew - Flexible HTTP command line stress tester. Pomerium - Pomerium is an identity-aware access proxy. Rodent - Rodent helps you manage Go versions, projects and track dependencies. s3-proxy - S3 Proxy with GET, PUT and DELETE methods and authentication (OpenID Connect and Basic Auth). s3gof3r - Small utility/library optimized for high speed transfer of large objects into and out of Amazon S3. s5cmd - Blazing fast S3 and local filesystem execution tool. Scaleway-cli - Manage BareMetal Servers from Command Line (as easily as with Docker). script - Making it easy to write shell-like scripts in Go for DevOps and system administration tasks. sg - Benchmarks a set of HTTP endpoints (like ab), with possibility to use the response code and data between each call for specific server stress based on its previous response. skm - SKM is a simple and powerful SSH Keys Manager, it helps you to manage your multiple SSH keys easily! StatusOK - Monitor your Website and REST APIs.Get Notified through Slack, E-mail when your server is down or response time is more than expected. terraform-provider-openapi - Terraform provider plugin that dynamically configures itself at runtime based on an OpenAPI document (formerly known as swagger file) containing the definitions of the APIs exposed. traefik - Reverse proxy and load balancer with support for multiple backends. trubka - A CLI tool to manage and troubleshoot Apache Kafka clusters with the ability of generically publishing/consuming protocol buffer and plain text events to/from Kafka. uTask - Automation engine that models and executes business processes declared in yaml. Vegeta - HTTP load testing tool and library. It\u0026rsquo;s over 9000! wait-for - Wait for something to happen (from the command line) before continuing. Easy orchestration of Docker services and other things. webhook - Tool which allows user to create HTTP endpoints (hooks) that execute commands on the server. Wide - Web-based IDE for Teams using Golang. winrm-cli - Cli tool to remotely execute commands on Windows machines. ⬆ back to top\nOther Software Better Go Playground - Go playground with syntax highlight, code completion and other features. blocky - Fast and lightweight DNS proxy as ad-blocker for local network with many features. borg - Terminal based search engine for bash snippets. boxed - Dropbox based blog engine. Cherry - Tiny webchat server in Go. Circuit - Circuit is a programmable platform-as-a-service (PaaS) and/or Infrastructure-as-a-Service (IaaS), for management, discovery, synchronization and orchestration of services and hosts comprising cloud applications. Comcast - Simulate bad network connections. confd - Manage local application configuration files using templates and data from etcd or consul. crawley - Web scraper/crawler for cli. croc - Easily and securely send files or folders from one computer to another. Docker - Open platform for distributed applications for developers and sysadmins. Documize - Modern wiki software that integrates data from SaaS tools. dp - Through SDK for data exchange with blockchain, developers can get easy access to DAPP development. drive - Google Drive client for the commandline. Duplicacy - A cross-platform network and cloud backup tool based on the idea of lock-free deduplication. Gebug - A tool that makes debugging of Dockerized Go applications super easy by enabling Debugger and Hot-Reload features, seamlessly. gfile - Securely transfer files between two computers, without any third party, over WebRTC. Go Package Store - App that displays updates for the Go packages in your GOPATH. go-peerflix - Video streaming torrent client. goblin - Golang binaries in a curl, built by goblins. GoBoy - Nintendo Game Boy Color emulator written in Go. gocc - Gocc is a compiler kit for Go written in Go. GoDocTooltip - Chrome extension for Go Doc sites, which shows function description as tooltip at function list. Gokapi - Lightweight server to share files, which expire after a set amount of downloads or days. Similar to Firefox Send, but without public upload. GoLand - Full featured cross-platform Go IDE. Gor - Http traffic replication tool, for replaying traffic from production to stage/dev environments in real-time. Guora - A self-hosted Quora like web application written in Go. hoofli - Generate PlantUML diagrams from Chrome or Firefox network inspections. hugo - Fast and Modern Static Website Engine. ide - Browser accessible IDE. Designed for Go with Go. ipe - Open source Pusher server implementation compatible with Pusher client libraries written in GO. joincap - Command-line utility for merging multiple pcap files together. Juju - Cloud-agnostic service deployment and orchestration - supports EC2, Azure, Openstack, MAAS and more. Leaps - Pair programming service using Operational Transforms. lgo - Interactive Go programming with Jupyter. It supports code completion, code inspection and 100% Go compatibility. limetext - Lime Text is a powerful and elegant text editor primarily developed in Go that aims to be a Free and open-source software successor to Sublime Text. LiteIDE - LiteIDE is a simple, open source, cross-platform Go IDE. mockingjay - Fake HTTP servers and consumer driven contracts from one configuration file. You can also make the server randomly misbehave to help do more realistic performance tests. myLG - Command Line Network Diagnostic tool written in Go. naclpipe - Simple NaCL EC25519 based crypto pipe tool written in Go. Neo-cowsay - 🐮 cowsay is reborn. for a New Era. nes - Nintendo Entertainment System (NES) emulator written in Go. Orbit - A simple tool for running commands and generating files from templates. peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. Plik - Plik is a temporary file upload system (Wetransfer like) in Go. protoncheck - ProtonMail module for waybar/polybar/yabar/i3blocks. restic - De-duplicating backup program. scc - Sloc Cloc and Code, a very fast accurate code counter with complexity calculations and COCOMO estimates. Seaweed File System - Fast, Simple and Scalable Distributed File System with O(1) disk seek. shell2http - Executing shell commands via http server (for prototyping or remote control). snap - Powerful telemetry framework. Snitch - Simple way to notify your team and many tools when someone has deployed any application via Tsuru. Stack Up - Stack Up, a super simple deployment tool - just Unix - think of it like \u0026lsquo;make\u0026rsquo; for a network of servers. stew - An independent package manager for compiled binaries. syncthing - Open, decentralized file synchronization tool and protocol. tcpdog - eBPF based TCP observability. tcpprobe - TCP tool for network performance and path monitoring, including socket statistics. term-quiz - Quizzes for your terminal. toxiproxy - Proxy to simulate network and system conditions for automated tests. tsuru - Extensible and open source Platform as a Service software. vaku - CLI \u0026amp; API for folder-based functions in Vault like copy, move, and search. vFlow - High-performance, scalable and reliable IPFIX, sFlow and Netflow collector. wellington - Sass project management tool, extends the language with sprite functions (like Compass). woke - Detect non-inclusive language in your source code. ⬆ back to top\nResources Where to discover new Go libraries.\n⬆ back to top\nBenchmarks autobench - Framework to compare the performance between different Go versions. go-benchmark-app - Powerful HTTP-benchmark tool mixed with Аb, Wrk, Siege tools. Gathering statistics and various parameters for benchmarks and comparison results. go-benchmarks - Few miscellaneous Go microbenchmarks. Compare some language features to alternative approaches. go-http-routing-benchmark - Go HTTP request router benchmark and comparison. go-json-benchmark - Go JSON benchmark. go-ml-benchmarks - benchmarks for machine learning inference in Go. go-web-framework-benchmark - Go web framework benchmark. go_serialization_benchmarks - Benchmarks of Go serialization methods. gocostmodel - Benchmarks of common basic operations for the Go language. golang-sql-benchmark - Collection of benchmarks for popular Go database/SQL utilities. gospeed - Go micro-benchmarks for calculating the speed of language constructs. kvbench - Key/Value database benchmark. skynet - Skynet 1M threads microbenchmark. speedtest-resize - Compare various Image resize algorithms for the Go language. ⬆ back to top\nConferences Capital Go - Washington, D.C., USA. dotGo - Paris, France. GoCon - Tokyo, Japan. GoDays - Berlin, Germany. GoLab - Florence, Italy. GopherChina - Shanghai, China. GopherCon - Denver, USA. GopherCon Australia - Sydney, Australia. GopherCon Brazil - Florianópolis, Brazil. GopherCon Europe - Berlin, Germany. GopherCon India - Pune, India. GopherCon Israel - Tel Aviv, Israel. GopherCon Russia - Moscow, Russia. GopherCon Singapore - Mapletree Business City, Singapore. GopherCon UK - London, UK. GopherCon Vietnam - Ho Chi Minh City, Vietnam. GoWayFest - Minsk, Belarus. GoWest Conference - Lehi, USA. ⬆ back to top\nE-Books E-books for purchase 100 Go Mistakes: How to Avoid Them Build an Orchestrator in Go Continuous Delivery in Go - This practical guide to continuous delivery shows you how to rapidly establish an automated pipeline that will improve your testing, code quality, and final product. For the Love of Go - An introductory book for Go beginners. Know Go: Generics - A guide to understanding and using generics in Go. The Power of Go: Tools - A guide to writing command-line tools in Go. Writing A Compiler In Go Writing An Interpreter In Go - Book that introduces dozens of techniques for writing idiomatic, expressive, and efficient Go code that avoids common pitfalls. Free e-books A Go Developer\u0026rsquo;s Notebook An Introduction to Programming in Go Build Web Application with Golang Building Web Apps With Go Go 101 - A book focusing on Go syntax/semantics and all kinds of details. Go Bootcamp Go Succinctly - in Persian. GoBooks - A curated list of Go books. How To Code in Go eBook - A 600 page introduction to Go aimed at first time developers. Learning Go Network Programming With Go Practical Go Lessons Spaceship Go A Journey to the Standard Library The Go Programming Language The Golang Standard Library by Example (Chinese) Web Application with Go the Anti-Textbook ⬆ back to top\nGophers Free Gophers Pack - Gopher graphics pack by Maria Letta with illustrations and emotional characters in vector and raster. Go-gopher-Vector - Go gopher Vector Data [.ai, .svg]. gopher-logos - adorable gopher logos. gopher-stickers gophericons gopherize.me - Gopherize yourself. gophers - Gopher artworks by Ashley McNamara. gophers - Free gophers. gophers - random gopher graphics. gophers - Gopher amigurumi toy pattern. gophers - Gophers by Aurélie Vache. ⬆ back to top\nMeetups Basel Go Meetup Belfast Gophers Belgrade Golang Meetup Berlin Golang Brisbane Gophers Canberra Gophers Go Language NYC Go London User Group Go Remote Meetup Go Toronto Go User Group Atlanta GoBandung GoBridge, San Francisco, CA GoCracow - Krakow, Poland GoJakarta Golang Amsterdam Golang Argentina Golang Athens Golang Baltimore, MD Golang Bangalore Golang Belo Horizonte - Brazil Golang Boston Golang Bulgaria Golang Cardiff, UK Golang Copenhagen Golang Curitiba - Brazil Golang DC, Arlington, VA Golang Dorset, UK Golang Estonia Golang Gurgaon, India Golang Hamburg - Germany Golang Israel Golang Joinville - Brazil Golang Kathmandu Golang Korea Golang Lima - Peru Golang Lyon Golang Marseille Golang Melbourne Golang Mountain View Golang New York Golang North East Golang Paris Golang Poland Golang Pune Golang Singapore Golang Stockholm Golang Sydney, AU Golang São Paulo - Brazil Golang Taipei Golang Thessaloniki Golang Turkey Golang Vancouver, BC Golang Vienna, Austria Golang Казань Golang Москва Golang Питер GoSF - San Francisco, CA Istanbul Golang Seattle Go Programmers Ukrainian Golang User Groups Utah Go User Group Women Who Go - San Francisco, CA Add the group of your city/country here (send PR)\n⬆ back to top\nStyle Guides bahlo/go-styleguide CockroachDB GitLab Hyperledger Magnetico Sourcegraph Thanos Trybe Uber ⬆ back to top\nSocial Media Twitter @golang @golang_news @golangch @golangflow @golangweekly ⬆ back to top\nReddit r/golang ⬆ back to top\nWebsites Awesome Go @LibHunt - Your go-to Go Toolbox. Awesome Golang Workshops - A curated list of awesome golang workshops. Awesome Remote Job - Curated list of awesome remote jobs. A lot of them are looking for Go hackers. awesome-awesomeness - List of other amazingly awesome lists. awesome-go-extra - Parse awesome-go README file and generate a new README file with repo info. Code with Mukesh - Software Engineer and Blogs @ codewithmukesh.com. Coding Mystery - Solve exciting escape-room-inspired programming challenges using Go. CodinGame - Learn Go by solving interactive tasks using small games as practical examples. Go Blog - The official Go blog. Go Code Club - A group of Gophers read and discuss a different Go project every week. Go Community on Hashnode - Community of Gophers on Hashnode. Go Forum - Forum to discuss Go. Go In 5 Minutes - 5 minute screencasts focused on getting one thing done. Go Projects - List of projects on the Go community wiki. Go Proverbs - Go Proverbs by Rob Pike. Go Report Card - A report card for your Go package. go.dev - A hub for Go developers. gocryforhelp - Collection of Go projects that needs help. Good place to start your open-source way in Go. godoc.org - Documentation for open source Go packages. Golang Developer Jobs - Developer Jobs exclusivly for Golang related Roles. Golang Flow - Post Updates, News, Packages and more. Golang News - Links and news about Go programming. Golang Resources - A curation of the best articles, exercises, talks and videos to learn Go. golang-graphics - Collection of Go images, graphics, and art. golang-nuts - Go mailing list. Google Plus Community - The Google+ community for #golang enthusiasts. Gopher Community Chat - Join Our New Slack Community For Gophers (Understand how it came). Gophercises - Free coding exercises for budding gophers. gowalker.org - Go Project API documentation. json2go - Advanced JSON to Go struct conversion - online tool. justforfunc - Youtube channel dedicated to Go programming language tips and tricks, hosted by Francesc Campoy @francesc. Learn Go Programming - Learn Go concepts with illustrations. Lille Gophers - Golang talks community in Lille, France (@LilleGophers). Made with Golang r/Golang - News about Go. studygolang - The community of studygolang in China. Trending Go repositories on GitHub today - Good place to find new Go libraries. TutorialEdge - Golang ⬆ back to top\nTutorials 50 Shades of Go - Traps, Gotchas, and Common Mistakes for New Golang Devs. A Guide to Golang E-Commerce - Building a Golang site for e-commerce (demo included). A Tour of Go - Interactive tour of Go. Build web application with Golang - Golang ebook intro how to build a web app with golang. Building and Testing a REST API in Go with Gorilla Mux and PostgreSQL - We’ll write an API with the help of the powerful Gorilla Mux. Building Go Web Applications and Microservices Using Gin - Get familiar with Gin and find out how it can help you reduce boilerplate code and build a request handling pipeline. Caching Slow Database Queries - How to cache slow database queries. Canceling MySQL - How to cancel MySQL queries. Debugged.it Go patterns - Advanced Go patterns with ready-to-run examples. Design Patterns in Go - Collection of programming design patterns implemented in Go. Ethereum Development with Go - A little e-book on Ethereum Development with Go. Games With Go - A video series teaching programming and game development. Go By Example - Hands-on introduction to Go using annotated example programs. Go Cheat Sheet - Go\u0026rsquo;s reference card. Go database/sql tutorial - Introduction to database/sql. Go Language Tutorial - Learn Go language Tutorial. Go Playground for iOS - Interactively edit \u0026amp; play Go snippets on your mobile device. Go Tutorial - Learn Go programming. Go WebAssembly Tutorial - Building a Simple Calculator go-clean-template - Clean Architecture template for Golang services. go-patterns - Curated list of Go design patterns, recipes and idioms. goapp - An opinionated guideline to structure \u0026amp; develop a Go web application/service. Golang for Node.js Developers - Examples of Golang compared to Node.js for learning. Golang Tutorial Guide - A List of Free Courses to Learn the Go Programming Language. Golangbot - Tutorials to get started with programming in Go. GolangCode - Collection of code snippets and tutorials to help tackle every day issues. GopherSnippets - Code snippets with tests and testable examples for the Go programming language. Gosamples - Collection of code snippets that let you solve everyday code problems. Hackr.io - Learn Go from the best online golang tutorials submitted \u0026amp; voted by the golang programming community. How to Benchmark: dbq vs sqlx vs GORM - Learn how to benchmark in Go. As a case-study, we will benchmark dbq, sqlx and GORM. How To Deploy a Go Web Application with Docker - Learn how to use Docker for Go development and how to build production Docker images. How to Use Godog for Behavior-driven Development in Go - Get started with Godog — a Behavior-driven development framework for building and testing Go applications. Learn Go with 1000+ Exercises - Learn Go with thousands of examples, exercises, and quizzes. Learn Go with TDD - Learn Go with test-driven development. Learning Go by examples - Serie of article in order to learn Golang language by concrete applications as example. Learning Golang - From zero to hero - Getting started with golang for beginner. package main - YouTube channel about Programming in Go. Programming with Google Go - Coursera Specialization to learn about Go from scratch. Saving a Third of Our Memory by Re-ordering Go Struct Fields - How inefficient field ordering in Go structs. The world’s easiest introduction to WebAssembly with Golang Working with Go - Intro to go for experienced programmers. Your basic Go - Huge collection of tutorials and how to\u0026rsquo;s. ⬆ back to top\n下一篇\n### ES索引的增删改查\n","permalink":"https://www.plbear.com/posts/go-zi-yuan-da-quan/","summary":"\u003ch2 id=\"contents\"\u003eContents\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#awesome-go\"\u003eAwesome Go\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#contents\"\u003eContents\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#audio-and-music\"\u003eAudio and Music\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#authentication-and-oauth\"\u003eAuthentication and OAuth\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#blockchain\"\u003eBlockchain\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#bot-building\"\u003eBot Building\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#build-automation\"\u003eBuild Automation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#command-line\"\u003eCommand Line\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#advanced-console-uis\"\u003eAdvanced Console UIs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#standard-cli\"\u003eStandard CLI\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#continuous-integration\"\u003eContinuous Integration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#css-preprocessors\"\u003eCSS Preprocessors\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#data-structures-and-algorithms\"\u003eData Structures and Algorithms\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#bit-packing-and-compression\"\u003eBit-packing and Compression\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#bit-sets\"\u003eBit Sets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#bloom-and-cuckoo-filters\"\u003eBloom and Cuckoo Filters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#data-structure-and-algorithm-collections\"\u003eData Structure and Algorithm Collections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#iterators\"\u003eIterators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#maps\"\u003eMaps\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#miscellaneous-data-structures-and-algorithms\"\u003eMiscellaneous Data Structures and Algorithms\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nullable-types\"\u003eNullable Types\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#queues\"\u003eQueues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sets\"\u003eSets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#text-analysis\"\u003eText Analysis\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#trees\"\u003eTrees\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#pipes\"\u003ePipes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#database\"\u003eDatabase\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#caches\"\u003eCaches\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#databases-implemented-in-go\"\u003eDatabases Implemented in Go\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#database-schema-migration\"\u003eDatabase Schema Migration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#database-tools\"\u003eDatabase Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sql-query-builders\"\u003eSQL Query Builders\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#database-drivers\"\u003eDatabase Drivers\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#interfaces-to-multiple-backends\"\u003eInterfaces to Multiple Backends\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#relational-database-drivers\"\u003eRelational Database Drivers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nosql-database-drivers\"\u003eNoSQL Database Drivers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#search-and-analytic-databases\"\u003eSearch and Analytic Databases\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#date-and-time\"\u003eDate and Time\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#distributed-systems\"\u003eDistributed Systems\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#dynamic-dns\"\u003eDynamic DNS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#email\"\u003eEmail\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#embeddable-scripting-languages\"\u003eEmbeddable Scripting Languages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#error-handling\"\u003eError Handling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#file-handling\"\u003eFile Handling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#financial\"\u003eFinancial\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#forms\"\u003eForms\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#functional\"\u003eFunctional\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#game-development\"\u003eGame Development\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#generators\"\u003eGenerators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#geographic\"\u003eGeographic\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#go-compilers\"\u003eGo Compilers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#goroutines\"\u003eGoroutines\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gui\"\u003eGUI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardware\"\u003eHardware\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#images\"\u003eImages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#iot-internet-of-things\"\u003eIoT (Internet of Things)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#job-scheduler\"\u003eJob Scheduler\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#json\"\u003eJSON\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#logging\"\u003eLogging\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#machine-learning\"\u003eMachine Learning\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#messaging\"\u003eMessaging\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#microsoft-office\"\u003eMicrosoft Office\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#microsoft-excel\"\u003eMicrosoft Excel\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#miscellaneous\"\u003eMiscellaneous\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#dependency-injection\"\u003eDependency Injection\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#project-layout\"\u003eProject Layout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#strings\"\u003eStrings\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#uncategorized\"\u003eUncategorized\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#natural-language-processing\"\u003eNatural Language Processing\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#language-detection\"\u003eLanguage Detection\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#morphological-analyzers\"\u003eMorphological Analyzers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#slugifiers\"\u003eSlugifiers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#tokenizers\"\u003eTokenizers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#translation\"\u003eTranslation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#transliteration\"\u003eTransliteration\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#networking\"\u003eNetworking\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#http-clients\"\u003eHTTP Clients\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#opengl\"\u003eOpenGL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#orm\"\u003eORM\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#package-management\"\u003ePackage Management\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#performance\"\u003ePerformance\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#query-language\"\u003eQuery Language\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#resource-embedding\"\u003eResource Embedding\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#science-and-data-analysis\"\u003eScience and Data Analysis\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#security\"\u003eSecurity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#serialization\"\u003eSerialization\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#server-applications\"\u003eServer Applications\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#stream-processing\"\u003eStream Processing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#template-engines\"\u003eTemplate Engines\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#testing\"\u003eTesting\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#text-processing\"\u003eText Processing\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#formatters\"\u003eFormatters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#markup-languages\"\u003eMarkup Languages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#parsersencodersdecoders\"\u003eParsers/Encoders/Decoders\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#regular-expressions\"\u003eRegular Expressions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sanitation\"\u003eSanitation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#scrapers\"\u003eScrapers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rss\"\u003eRSS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#utilitymiscellaneous\"\u003eUtility/Miscellaneous\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#third-party-apis\"\u003eThird-party APIs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#utilities\"\u003eUtilities\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#uuid\"\u003eUUID\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#validation\"\u003eValidation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#version-control\"\u003eVersion Control\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#video\"\u003eVideo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#web-frameworks\"\u003eWeb Frameworks\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#middlewares\"\u003eMiddlewares\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#actual-middlewares\"\u003eActual middlewares\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#libraries-for-creating-http-middlewares\"\u003eLibraries for creating HTTP middlewares\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#routers\"\u003eRouters\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#webassembly\"\u003eWebAssembly\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#windows\"\u003eWindows\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#xml\"\u003eXML\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#zero-trust\"\u003eZero Trust\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#code-analysis\"\u003eCode Analysis\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#editor-plugins\"\u003eEditor Plugins\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#go-generate-tools\"\u003eGo Generate Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#go-tools\"\u003eGo Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#software-packages\"\u003eSoftware Packages\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#devops-tools\"\u003eDevOps Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#other-software\"\u003eOther Software\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#resources\"\u003eResources\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#benchmarks\"\u003eBenchmarks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#conferences\"\u003eConferences\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#e-books\"\u003eE-Books\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#e-books-for-purchase\"\u003eE-books for purchase\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#free-e-books\"\u003eFree e-books\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gophers\"\u003eGophers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#meetups\"\u003eMeetups\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#style-guides\"\u003eStyle Guides\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#social-media\"\u003eSocial Media\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#twitter\"\u003eTwitter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#reddit\"\u003eReddit\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#websites\"\u003eWebsites\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#tutorials\"\u003eTutorials\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"#contents\"\u003e⬆ back to top\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e","title":"Go资源大全"},{"content":"标准的restful接口\n查 查看所有index, 等价于show tables;\nGET _cat/indices\nGET test_index\nGET kibana_sample_data_logs?include_type_name=true\u0026amp;include_defaults=true\naliases mappings settings 删 DELETE test_index\nDELETE test_index?ignore_unavailable=true ==\u0026gt; drop table xx if exists\n增 P { \" } U m T a p k p } \" } i i , s b n \" } e \" } a g _ t i n s d \" } t n \" \" \" a \" o p i d n a n _ c r \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } \" } n e u u u s : \" o @ , a , b , c , e , e , g , h , i , i , m , m , m , p , r , r , r , t , t , u , u g x m t m a p t \" \" g \" \" } y \" l \" v \" } x \" \" } e \" } o \" \" } n \" \" } p \" a \" } e \" e \" \" } h \" e \" e \" \" } e \" \" } a \" \" } i \" r \" \" } t \" s \" b o b m { : e i t p e t f t t i t e p t t f o p s t f d t f \" t c p m t s t f p t f t q t f s t f g t f m t l t f c t \" e _ e p r m y a n y i \" } e y e y n r \" } e y i \" } \" r \" } \" } \" } \" } t y i \" } e y i \" } y h r \" } \" } o y s y i \" } m y e y u y i \" } p y i \" } s y i \" } e y \" y i \" } _ y : r e r l { t e p t t p e k s p n p t o d n p e k o c , d , s , s \" p e k x p e k : p i o o , r r p a p e k e p r p e p e k o p e k \" p e k s p p e k t p : _ x _ e i s e h \" e l e \" \" \" e t e \" p a \" s e l e \" \" : p o \" e \" r \" r \" e l e \" \" \" e l e \" \" e n p s \" \" } a \" y e g e l e \" \" m e e e s e l e \" \" n e l e \" \" e l e \" \" t e : e l e \" \" i e { o p o _ e t \" \" \" d y t i \" i \" e t t i \" d y t i e o t s t c t c t : \" d y t i \" d y t i { \" e e \" t f m t \" \" e \" d y t i o \" r \" t \" d y t i s \" d y t i : \" d y t i a \" \" d y t i m \" { f a f d s a : s w y g : p : r a y o s w y g { r r y t y \" y d y s w y g : s w y g \" r y i \" } \" y \" s w y g r \" \" s w y g e s w y g s w y g m { s w y g e _ n _ a \" m : : : \" o p n : \" : t s p n : \" o p n t d p \" p p e p { : \" o p n : \" o p n : t : p e k p : : : \" o p n y : : : \" o p n \" : \" o p n { : \" o p n p : : \" o p n \" : s d r t p { r e o { { i e e \" r e o i i e e : e s e r e o { r e o : i e l e \" \" : e : r e o \" : : r e o r e o r e o \" r e o h _ e a : \" \" \" \" : d \" r \" : \" e t \" \" : d \" r e n \" : \" \" t \" \" : d \" r \" : d \" r \" e { \" d y t i \" { \" \" : d \" r \" \" \" : d \" r : \" : d \" r \" : d \" r \" \" : d \" r : \" a r p _ a t t \" e l i s \" : t \" e s a { \" t \" e t \" e i { s s w y g { d { t \" e : l { k { t \" e t \" e t \" e : d t \" e d r e l e { : l i e { : _ o { p \" : e { : _ \" t : { : : : e { : _ e { : _ p \" : \" o p n : o e { : _ o e e { : _ { e { : _ e { : _ a e { : _ { a d p i c i m x : a n \" : { x : a e : x : a x : a \" r e o u x : a { n y x : a x : a x : a { t x : a t s l c o { a e t \" b g : \" t \" b : s \" \" \" \" t \" b t \" b : \" : d \" r \" b t \" b g w t \" b t \" b t \" b e t \" b e \" i a m s s \" { k o \" { k \" { k o \" g k k { k \" { k o \" { k o t \" e l l \" { k o \" o \" { k o \" { k o \" { k o \" \" { k o \" c s m \" t , e v { e , e v { e e e e , e v , e v { e { : _ o e , e v r , e v , e v , e v , e v : a \" e , a y e y y e : o y y y y e y e x : a n \" y e d y e y e y e y e s r m w \" w w \" _ w w w w \" w \" t \" b g w \" \" w \" w \" w \" w \" \" \" : c p o o o { p o o o o o \" { k o \" o o o o o 1 e \" r : r r : o r r r r : r : , e v r : r : r : r : r : \" : \" 2 d d d i d d d d d y e d d d d d , 1 ? \" 2 \" \" 2 n \" \" \" \" 2 \" 2 w \" \" 2 \" 2 \" 2 \" 2 \" 2 \" \" i , 5 , 5 t , 5 , 5 o , 5 , 5 , 5 , 5 , 5 0 n 6 6 \" 6 6 r : 6 6 6 6 6 - c d 1 l \" 2 \" u , 5 , d 6 e _ t y p e _ n a m e = t r u e 改 reindex\nP { } O S \" } \" } T d , s e \" o \" _ s i u i r t n r n e \" d c d i : e e e n x \" x d { \" : \" e : : x { ? \" \" w k k a i i i b b t a a _ n n f a a o _ _ r s s _ a a c m m o p p m l l p e e l _ _ e d d t a a i t t o a a n _ _ = e e t c c r o o u m m e m m e e r r c c e e 2 \" \" P { } O S \" ] T a c { } { } _ t , a i \" } \" } l o a r i n d \" \" e \" \" a s d i a m i a s \" \" n l o n l e : : d i v d i s e a e e a [ { x s \" x s \" \" : \" \" : : : : { \" \" \" \" k e k e i c i c b o b o a m a m n m n m a e a e _ r _ r s c s c a e a e m \" m \" p p l l e e _ _ d d a a t t a a _ _ e e c c o o m m m m e e r r c c e e 2 \" \" , , mapping\nPOST kibana_sample_data_ecommerce2/_mapping {\n\" } p r \" } o a p g \" \" } e e t f r n y i \" } \" } t t p e k , h i \" e l e \" \" e \" \" e : \" d y t i l t i s : s w y g l y g \" { \" o p n o p n : \" : r e o \" e o t d \" r : \" r { e { \" : e { : e x : _ \" _ t \" a k a \" { k b e b , e o y o y v w v w e o e o \" r \" r : d : d \" \" 2 , 1 , 5 6 }\nsettings\nPUT kibana_sample_data_ecommerce2/_settings {\n\" } i n \" \" d a n e u u x t m \" o b : _ e e r { x _ p o a f n _ d r _ e r p e l p i l c i a c s a \" s : \" : \" 2 \" \" 0 - 1 \" , }\n直接 ==\u0026gt; 插入数据，\n让他动态索引（dynamic mapping）得到mapping，在此基础上更改。\n字段类型\nField data types Elasticsearch supports a number of different data types for the fields in a document:\nCore data types string\ntext, keyword and wildcard\nNumeric\nlong, integer, short, byte, double, float, half_float, scaled_float\nDate\ndate\nDate nanoseconds\ndate_nanos\nBoolean\nboolean\nBinary\nbinary\nRange\ninteger_range, float_range, long_range, double_range, date_range, ip_range\nComplex data types Object\nobject for single JSON objects\nNested\nnested for arrays of JSON objects\nSpatial data types Geo-point\ngeo_point for lat/lon points\nGeo-shape\ngeo_shape for complex shapes like polygons\nPoint\npoint for arbitrary cartesian points.\nShape\nshape for arbitrary cartesian geometries.\nSpecialised data types IP\nip for IPv4 and IPv6 addresses\nCompletion data type\ncompletion to provide auto-complete suggestions\nToken count\ntoken_count to count the number of tokens in a string\nmapper-murmur3\nmurmur3 to compute hashes of values at index-time and store them in the index\nmapper-annotated-text\nannotated-text to index text containing special markup (typically used for identifying named entities)\nPercolator\nAccepts queries from the query-dsl\nJoin\nDefines parent/child relation for documents within the same index\nRank feature\nRecord numeric feature to boost hits at query time.\nRank features\nRecord numeric features to boost hits at query time.\nDense vector\nRecord dense vectors of float values.\nSparse vector\nRecord sparse vectors of float values.\nSearch-as-you-type\nA text-like field optimized for queries to implement as-you-type completion\nAlias\nDefines an alias to an existing field.\nFlattened\nAllows an entire JSON object to be indexed as a single field.\nHistogram\nhistogram for pre-aggregated numerical values for percentiles aggregations.\nConstant keyword\nSpecialization of keyword for the case when all documents have the same value.\nArrays In Elasticsearch, arrays do not require a dedicated field data type. Any field can contain zero or more values by default, however, all values in the array must be of the same data type. See Arrays.\nMulti-fields It is often useful to index the same field in different ways for different purposes. For instance, a string field could be mapped as a text field for full-text search, and as a keyword field for sorting or aggregations. Alternatively, you could index a text field with the standard analyzer, the english analyzer, and the french analyzer.\nThis is the purpose of multi-fields. Most data types support multi-fields via the fieldsparameter.\n\u0026ldquo;dynamic\u0026rdquo; : \u0026ldquo;true\u0026rdquo; | \u0026ldquo;false\u0026rdquo; | \u0026ldquo;strict\u0026rdquo;\n\u0026ldquo;copy_to\u0026rdquo;\n数组\n多字段特性\n简单提下， 下下次专门讲这块\nAnalysis | Built-in analyzer char filter\nTokenizer [必须有一个]\ntoken filter\nh m p t a a m p t l p t _ i e s n r t g n r _ i r p e p l a c e P { } U T \" } s m e \" } y t a - t n \" } i i a a n n l n \" } d g y a m e s s l y \" \" \" ] \" ] x \" i y _ t t c , f - : s z c y o h \" i \" \" 0 \" e u p k a h l l a 0 { : r s e e r t t o s 0 \" t \" n _ m e w c 0 { : o : i f l r e i 0 m z i _ \" r i 1 { _ \" e l s : c f a c r t t a o n u \" e r [ s l a s : r i e d l t \" p \" i y o \" : \" , n z m s g e \" t [ \" r , a \" n : d a { r d \" , 下一篇\n### Python资源大全\n","permalink":"https://www.plbear.com/posts/es-suo-yin-de-zeng-shan-gai-cha/","summary":"\u003cp\u003e标准的restful接口\u003c/p\u003e\n\u003ch1 id=\"查\"\u003e查\u003c/h1\u003e\n\u003cp\u003e查看所有index, 等价于show tables;\u003c/p\u003e\n\u003cp\u003eGET _cat/indices\u003c/p\u003e\n\u003cp\u003eGET test_index\u003c/p\u003e\n\u003cp\u003eGET kibana_sample_data_logs?include_type_name=true\u0026amp;include_defaults=true\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ealiases\u003c/li\u003e\n\u003cli\u003emappings\u003c/li\u003e\n\u003cli\u003esettings\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"删\"\u003e删\u003c/h1\u003e\n\u003cp\u003eDELETE test_index\u003c/p\u003e\n\u003cp\u003eDELETE test_index?ignore_unavailable=true ==\u0026gt; drop table xx if exists\u003c/p\u003e\n\u003ch1 id=\"增\"\u003e增\u003c/h1\u003e\n\n\n\n\u003cdiv class=\"goat svg-container \"\u003e\n  \n    \u003csvg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      font-family=\"Menlo,Lucida Console,monospace\"\n      \n        viewBox=\"0 0 456 2633\"\n      \u003e\n      \u003cg transform='translate(8,16)'\u003e\n\u003ctext text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'\u003eP\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='2612' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'\u003eU\u003c/text\u003e\n\u003ctext text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'\u003eT\u003c/text\u003e\n\u003ctext text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='2484' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='2500' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='2596' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='2484' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='2500' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='2468' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='2500' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='2516' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='2580' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='2500' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='2516' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='2452' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='2500' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='2516' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='2532' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='2548' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='2564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='68' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='2500' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='2516' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='2532' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='2548' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='2564' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='132' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='148' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='276' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='292' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='324' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='340' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='372' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='388' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='484' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='500' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='628' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='644' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='884' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='900' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1028' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1044' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1172' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1188' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1220' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1236' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1476' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1492' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1524' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1540' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1668' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1684' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1716' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1732' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1764' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1780' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1908' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='1924' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2052' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2068' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2196' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2212' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2244' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2260' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2388' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2404' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2436' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2500' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2516' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2532' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2548' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='2564' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'\u003e@\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='132' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='148' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='276' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='292' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='324' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='340' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='372' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='388' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='484' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='500' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='628' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='644' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='884' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='900' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1028' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1044' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1172' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1188' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1220' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1236' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1476' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1492' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1524' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1540' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1668' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1684' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1716' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1732' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1764' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1780' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1908' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='1924' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2052' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2068' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2196' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2212' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2244' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2260' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2388' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2404' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2500' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2516' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2532' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2548' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='2564' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='68' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='148' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='164' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='180' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='260' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='292' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='308' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='340' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='356' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='388' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='404' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='468' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='500' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='516' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='532' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='612' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='644' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='660' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='868' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='900' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='916' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='932' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1012' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1044' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1060' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1076' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1156' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1188' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1204' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1236' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1252' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1460' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1492' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1508' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1540' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1556' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1572' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1652' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1684' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1700' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1732' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1748' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1780' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1796' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1812' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1892' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1924' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1940' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='1956' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2036' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2068' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2084' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2100' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2180' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2212' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2228' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2260' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2276' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2292' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2372' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2404' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2420' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2500' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2516' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2532' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2548' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='96' y='2564' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='148' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='164' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='180' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='292' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='308' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='340' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='356' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='388' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='404' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='500' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='516' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='532' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='644' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='660' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='900' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='916' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='932' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1044' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1060' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1076' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1188' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1204' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1236' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1252' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1492' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1508' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1540' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1556' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1572' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1684' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1700' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1732' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1748' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1780' fill='currentColor' style='font-size:1em'\u003eq\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1796' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1812' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1924' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1940' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='1956' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2068' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2084' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2100' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2212' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2228' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2260' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2276' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2292' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2404' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2420' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2500' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2532' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2548' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='104' y='2564' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='116' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='148' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='164' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='180' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='196' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='244' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='292' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='308' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='340' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='356' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='388' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='404' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='420' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='452' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='500' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='516' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='532' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='548' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='596' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='644' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='660' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='676' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='708' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='724' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='756' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='772' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='804' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='820' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='852' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='900' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='916' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='932' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='948' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='996' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1044' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1060' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1076' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1092' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1140' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1204' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1236' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1252' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1268' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1396' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1412' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1444' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1492' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1508' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1540' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1556' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1572' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1588' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1636' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1684' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1700' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1732' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1748' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1780' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1796' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1812' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1828' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1876' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1924' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1940' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1956' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='1972' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2020' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2068' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2084' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2100' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2116' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2164' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2212' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2228' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2260' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2276' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2292' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2308' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2356' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2404' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2420' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2516' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2532' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2548' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='2564' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='84' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='116' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='148' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='164' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='180' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='196' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='292' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='308' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='340' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='356' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='388' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='404' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='420' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='500' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='516' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='532' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='548' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='660' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='676' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='708' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='724' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='756' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='772' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='804' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='820' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='900' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='916' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='932' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='948' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1044' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1060' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1076' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1092' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1188' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1204' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1236' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1252' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1268' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1396' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1412' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1492' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1508' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1540' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1556' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1572' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1588' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1684' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1700' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1732' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1748' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1780' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1796' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1812' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1828' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1924' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1940' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1956' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='1972' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2068' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2084' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2100' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2116' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2212' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2228' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2276' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2292' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2308' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2404' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2420' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2500' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2532' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2548' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='2564' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='68' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='100' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='148' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='164' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='180' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='196' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='212' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='228' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='292' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='308' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='340' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='356' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='388' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='404' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='420' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='436' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='500' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='516' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='532' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='548' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='580' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='644' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='660' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='676' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='692' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='724' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='740' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='772' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='788' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='820' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='836' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='916' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='932' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='948' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='964' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='980' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1044' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1060' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1076' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1092' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1108' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1124' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1204' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1236' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1252' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1268' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1284' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1300' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1380' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1412' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1428' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1492' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1508' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1540' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1556' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1572' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1588' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1604' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1620' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1684' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1700' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1732' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1748' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1780' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1796' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1812' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1828' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1844' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1860' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1924' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1940' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1956' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1972' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='1988' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2004' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2084' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2100' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2116' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2132' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2148' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2212' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2228' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2260' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2276' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2292' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2308' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2324' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2340' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2404' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2420' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2516' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2532' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2548' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='2564' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='100' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='164' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='180' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='196' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='212' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='228' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='308' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='340' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='356' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='404' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='420' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='436' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='500' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='516' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='532' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='548' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='564' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='580' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='660' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='676' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='692' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='724' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='740' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='772' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='788' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='820' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='836' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='900' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='916' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='932' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='948' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='964' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='980' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1060' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1076' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1092' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1108' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1124' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1188' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1204' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1236' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1252' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1268' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1284' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1300' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1412' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1428' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1492' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1508' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1540' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1556' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1572' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1588' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1604' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1620' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1684' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1700' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1732' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1748' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1780' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1796' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1812' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1828' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1844' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1860' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1924' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1940' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1956' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1972' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='1988' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2004' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2068' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2084' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2100' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2116' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2132' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2148' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2212' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2228' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2276' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2292' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2308' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2324' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2340' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2404' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2420' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2500' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2532' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2548' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='2564' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='148' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='180' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='196' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='212' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='228' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='292' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='340' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='388' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='404' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='420' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='436' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='500' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='532' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='548' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='564' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='580' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='644' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='660' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='676' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='692' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='724' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='740' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='772' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='788' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='820' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='836' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='932' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='948' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='964' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='980' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1044' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1076' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1092' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1108' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1124' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1236' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1252' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1284' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1300' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1316' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1364' fill='currentColor' style='font-size:1em'\u003e}\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1412' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1428' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1540' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1572' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1588' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1604' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1620' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1684' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1732' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1780' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1812' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1828' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1844' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1860' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1924' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1956' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1972' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='1988' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2004' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2100' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2116' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2132' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2148' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2212' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2260' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2292' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2308' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2324' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2340' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2404' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2532' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2548' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='2564' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='68' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='84' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='100' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='116' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='164' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='180' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='196' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='212' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='228' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='308' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='340' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='356' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='404' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='420' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='436' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='500' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='516' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='532' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='548' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='564' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='580' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='660' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='676' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='692' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='724' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='740' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='788' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='820' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='836' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='900' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='916' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='932' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='948' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='964' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='980' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1060' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1076' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1092' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1108' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1124' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1204' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1252' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1268' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1284' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1300' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1316' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1428' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1492' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1508' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1556' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1572' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1588' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1604' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1620' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1684' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1700' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1748' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1796' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1812' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1828' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1844' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1860' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1924' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1940' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1956' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1972' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='1988' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2004' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2068' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2084' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2100' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2116' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2132' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2148' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2212' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2228' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2276' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2292' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2308' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2324' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2340' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2404' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2420' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2532' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2548' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='2564' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='84' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='148' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='196' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='212' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='228' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='292' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='388' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='404' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='420' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='436' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='500' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='548' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='564' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='580' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='660' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='676' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='692' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='740' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='772' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='788' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='820' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='836' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='948' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='964' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='980' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1044' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1092' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1108' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1124' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1236' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1252' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1284' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1300' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1316' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1332' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1348' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1412' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1428' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1540' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1588' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1604' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1620' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1684' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1732' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1780' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1828' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1844' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1860' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1972' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='1988' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2004' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2116' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2132' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2148' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2212' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2308' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2324' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2340' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2532' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2548' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='2564' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='68' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='84' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='100' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='116' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='164' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='180' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='196' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='212' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='228' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='308' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='340' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='356' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='404' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='420' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='436' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='516' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='532' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='548' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='580' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='660' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='676' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='692' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='724' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='740' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='788' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='820' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='836' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='916' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='932' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='948' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='964' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='980' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1060' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1076' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1092' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1108' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1124' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1204' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1252' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1268' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1284' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1300' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1316' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1332' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1348' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1428' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1492' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1508' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1556' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1572' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1588' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1604' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1620' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1700' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1748' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1796' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1812' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1828' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1844' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1860' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1924' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1940' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1956' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1972' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='1988' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2004' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2084' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2100' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2116' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2132' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2148' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2228' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2276' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2292' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2308' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2324' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2340' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2404' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2420' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2532' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2548' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='2564' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='100' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='116' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='164' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='196' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='228' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='308' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='356' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='404' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='420' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='500' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='516' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='548' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='580' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='660' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='676' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='772' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='820' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='916' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='948' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='980' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1060' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1092' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1124' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1204' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1236' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1252' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1300' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1316' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1332' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1348' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1412' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1508' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1540' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1556' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1588' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1620' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1684' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1700' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1732' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1748' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1780' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1796' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1828' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1860' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1940' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='1972' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2004' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2084' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2116' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2148' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2212' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2228' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2276' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2308' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2340' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2420' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2532' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2548' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='2564' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='68' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='84' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='100' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='116' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='164' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='180' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='212' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='228' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='308' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='340' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='356' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='404' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='436' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='516' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='532' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='564' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='580' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='660' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='676' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='692' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='724' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='740' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='788' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='836' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='916' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='932' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='964' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='980' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1060' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1076' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1108' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1124' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1204' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1252' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1284' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1300' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1316' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1332' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1348' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1428' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1508' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1556' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1572' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1604' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1620' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1700' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1748' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1796' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1812' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1844' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1860' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1924' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1940' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1956' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='1988' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2004' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2084' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2100' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2132' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2148' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2228' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2276' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2292' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2324' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2340' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2404' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2420' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2532' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2548' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='2564' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='100' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='116' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='164' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='196' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='228' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='308' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='356' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='420' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='500' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='516' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='548' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='580' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='676' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='820' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='916' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='948' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='980' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1060' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1092' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1124' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1204' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1316' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1332' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1348' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1508' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1556' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1588' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1620' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1684' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1700' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1748' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1796' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1828' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1860' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1940' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='1972' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2004' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2084' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2116' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2148' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2212' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2228' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2276' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2308' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2340' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2420' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2532' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2548' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='2564' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='84' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='100' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='116' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='164' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='212' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='228' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='308' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='404' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='436' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='516' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='580' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='660' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='676' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='692' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='740' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='788' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='836' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='916' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='964' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='980' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1060' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1108' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1124' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1252' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1284' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1300' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1316' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1332' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1348' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1428' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1508' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1556' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1604' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1620' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1700' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1748' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1796' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1844' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1860' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1940' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='1988' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2004' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2084' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2132' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2148' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2228' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2276' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2324' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2340' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2420' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2532' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2548' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='2564' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='100' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='116' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='164' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='196' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='212' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='228' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='308' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='420' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='436' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='516' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='548' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='564' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='580' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='676' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='692' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='740' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='788' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='820' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='836' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='916' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='948' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='964' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='980' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1060' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1092' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1108' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1124' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1284' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1316' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1348' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1428' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1508' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1556' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1588' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1604' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1620' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1700' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1748' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1796' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1828' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1844' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1860' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1940' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1972' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='1988' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2004' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2084' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2116' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2132' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2148' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2228' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2276' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2308' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2324' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2340' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2420' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2548' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='2564' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='100' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='116' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='164' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='212' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='228' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='404' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='436' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='516' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='564' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='580' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='660' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='692' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='740' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='788' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='836' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='916' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='964' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='980' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1060' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1108' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1124' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1252' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1284' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1300' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1332' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1348' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1428' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1508' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1556' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1604' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1620' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1748' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1796' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1844' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1860' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1940' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='1988' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2004' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2084' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2132' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2148' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2276' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2324' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2340' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2532' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2548' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='2564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='100' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='116' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='212' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='228' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='436' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='564' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='580' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='676' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='692' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='740' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='788' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='836' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='964' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='980' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1108' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1124' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1284' fill='currentColor' style='font-size:1em'\u003ex\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1316' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1348' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1428' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1508' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1604' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1620' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1748' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1844' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1860' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='1988' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='2004' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='2132' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='2148' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='2324' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='2340' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='2548' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='116' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='212' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='228' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='436' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='564' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='580' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='692' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='740' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='788' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='836' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='964' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='980' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1108' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1124' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1284' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1332' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1348' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1428' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1604' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1620' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1748' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1844' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1860' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='1988' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2004' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2132' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2148' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2324' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2340' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2532' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2548' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='2564' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='212' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='436' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='564' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='676' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='692' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='740' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='788' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='836' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='964' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1108' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1284' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1316' fill='currentColor' style='font-size:1em'\u003e{\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1332' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1348' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1428' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1604' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1844' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='1988' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='2132' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='2324' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='2532' fill='currentColor' style='font-size:1em'\u003e1\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='212' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='228' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='436' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='564' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='580' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='692' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='740' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='788' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='836' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='964' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='980' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1108' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1124' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1284' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1332' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1348' fill='currentColor' style='font-size:1em'\u003ev\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1604' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1620' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1844' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1860' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='1988' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2004' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2132' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2148' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2324' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2340' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2532' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2548' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='2564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='212' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='436' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='564' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='692' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='740' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='788' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='836' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='964' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='1108' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='1332' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='1348' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='1604' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='1844' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='1988' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='2132' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='2324' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='2532' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='2564' fill='currentColor' style='font-size:1em'\u003e1\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'\u003e?\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='212' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='228' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='436' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='580' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='692' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='740' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='788' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='836' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='964' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='980' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1108' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1124' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1332' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1348' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1604' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1620' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1844' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1860' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='1988' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2004' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2132' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2148' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2324' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2340' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2548' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='2564' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='212' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='228' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='564' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='580' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='692' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='964' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='980' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1108' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1124' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1332' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1604' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1620' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1844' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1860' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='1988' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='2004' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='2132' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='2148' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='2324' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='2340' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='2548' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='228' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='580' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='692' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='980' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='1124' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='1332' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='1348' fill='currentColor' style='font-size:1em'\u003e:\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='1620' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='1860' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='2004' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='2148' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='2340' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='2548' fill='currentColor' style='font-size:1em'\u003e-\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='1332' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='2548' fill='currentColor' style='font-size:1em'\u003e1\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='1332' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='1348' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='2548' fill='currentColor' style='font-size:1em'\u003e\"\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='4' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='1332' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='1348' fill='currentColor' style='font-size:1em'\u003e5\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='2548' fill='currentColor' style='font-size:1em'\u003e,\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='1348' fill='currentColor' style='font-size:1em'\u003e6\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='4' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='4' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='352' y='4' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='360' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='368' y='4' fill='currentColor' style='font-size:1em'\u003e_\u003c/text\u003e\n\u003ctext text-anchor='middle' x='376' y='4' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='384' y='4' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='392' y='4' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='400' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='408' y='4' fill='currentColor' style='font-size:1em'\u003e=\u003c/text\u003e\n\u003ctext text-anchor='middle' x='416' y='4' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='424' y='4' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='432' y='4' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='440' y='4' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003c/g\u003e\n\n    \u003c/svg\u003e\n  \n\u003c/div\u003e\n\u003cp\u003e改 reindex\u003c/p\u003e","title":"ES索引的增删改查"},{"content":"环境管理 管理 Python 版本和环境的工具\np：非常简单的交互式 python 版本管理工具。官网 pyenv：简单的 Python 版本管理工具。官网 Vex：可以在虚拟环境中执行命令。官网 virtualenv：创建独立 Python 环境的工具。官网 virtualenvwrapper：virtualenv 的一组扩展。官网 buildout：在隔离环境初始化后使用声明性配置管理。官网 包管理 管理包和依赖的工具。\npip：Python 包和依赖关系管理工具。官网 pip-tools：保证 Python 包依赖关系更新的一组工具。官网 pipenv：Python 官方推荐的新一代包管理工具。官网 poetry: 可完全取代 setup.py 的包管理工具。官网 conda：跨平台，Python 二进制包管理工具。官网 Curdling：管理 Python 包的命令行工具。官网 wheel：Python 分发的新标准，意在取代 eggs。官网 包仓库 本地 PyPI 仓库服务和代理。\nwarehouse：下一代 PyPI。官网 bandersnatch：PyPA 提供的 PyPI 镜像工具。官网 devpi：PyPI 服务和打包/测试/分发工具。官网 localshop：本地 PyPI 服务（自定义包并且自动对 PyPI 镜像）。官网 分发 打包为可执行文件以便分发。\nPyInstaller：将 Python 程序转换成独立的执行文件（跨平台）。官网 cx_Freeze：将python程序转换为带有一个动态链接库的可执行文件。官网 dh-virtualenv：构建并将 virtualenv 虚拟环境作为一个 Debian 包来发布。官网 Nuitka：将脚本、模块、包编译成可执行文件或扩展模块。官网 py2app：将 Python 脚本变为独立软件包（Mac OS X）。官网 py2exe：将 Python 脚本变为独立软件包（Windows）。官网 pynsist：一个用来创建 Windows 安装程序的工具，可以在安装程序中打包 Python 本身。官网 构建工具 将源码编译成软件。\nbuildout：一个构建系统，从多个组件来创建，组装和部署应用。官网 BitBake：针对嵌入式 Linux 的类似 make 的构建工具。官网 fabricate：对任何语言自动找到依赖关系的构建工具。官网 PlatformIO：多平台命令行构建工具。官网 PyBuilder：纯 Python 实现的持续化构建工具。官网 SCons：软件构建工具。官网 交互式解析器 交互式 Python 解析器。\nIPython：功能丰富的工具，非常有效的使用交互式 Python。官网 bpython：界面丰富的 Python 解析器。官网 ptpython：高级交互式 Python 解析器， 构建于 python-prompt-toolkit 之上。官网 文件 文件管理和 MIME（多用途的网际邮件扩充协议）类型检测。\naiofiles：基于 asyncio，提供文件异步操作。官网 imghdr：（Python 标准库）检测图片类型。官网 mimetypes：（Python 标准库）将文件名映射为 MIME 类型。官网 path.py：对 os.path 进行封装的模块。官网 pathlib：（Python3.4+ 标准库）跨平台的、面向对象的路径操作库。官网 python-magic：文件类型检测的第三方库 libmagic 的 Python 接口。官网 Unipath：用面向对象的方式操作文件和目录。官网 watchdog：管理文件系统事件的 API 和 shell 工具。官网 日期和时间 操作日期和时间的类库。\narrow：更好的 Python 日期时间操作类库。官网 Chronyk：Python 3 的类库，用于解析手写格式的时间和日期。官网 dateutil：Python datetime 模块的扩展。官网 delorean：解决 Python 中有关日期处理的棘手问题的库。官网 maya：人性化的时间处理库。官网 moment：一个用来处理时间和日期的 Python 库。灵感来自于 Moment.js。官网 pendulum：一个比 arrow 更具有明确的，可预测的行为的时间操作库。官网 PyTime：一个简单易用的 Python 模块，用于通过字符串来操作日期/时间。官网 pytz：现代以及历史版本的世界时区定义。将时区数据库引入 Python。官网 when.py：提供用户友好的函数来帮助用户进行常用的日期和时间操作。官网 文本处理 用于解析和操作文本的库。\n通用 chardet：字符编码检测器，兼容 Python2 和 Python3。官网 difflib：(Python 标准库)帮助我们进行差异化比较。官网 ftfy：让 Unicode 文本更完整更连贯。官网 fuzzywuzzy：模糊字符串匹配。官网 Levenshtein：快速计算编辑距离以及字符串的相似度。官网 pangu.py：在中日韩语字符和数字字母之间添加空格。官网 pypinyin：汉字拼音转换工具 Python 版。官网 shortuuid：一个生成器库，用以生成简洁的，明白的，URL 安全的 UUID。官网 simplejson：Python 的 JSON 编码、解码器。官网 unidecode：Unicode 文本的 ASCII 转换形式 。官网 uniout：打印可读的字符，而不是转义的字符串。官网 xpinyin：一个用于把汉字转换为拼音的库。官网 yfiglet-figlet：pyfiglet -figlet 的 Python 实现。 flashtext: 一个高效的文本查找替换库。官网 Slug 化 awesome-slugify：一个 Python slug 化库，可以保持 Unicode。官网 python-slugify：Python slug 化库，可以把 unicode 转化为 ASCII。官网 unicode-slugify：一个 slug 工具，可以生成 unicode slugs ,需要依赖 Django 。官网 解析器 phonenumbers：解析，格式化，储存，验证电话号码。官网 PLY：lex 和 yacc 解析工具的 Python 实现。官网 Pygments：通用语法高亮工具。官网 pyparsing：生成通用解析器的框架。官网 python-nameparser：把一个人名分解为几个独立的部分。官网 python-user-agents：浏览器 user agent 解析器。官网 sqlparse：一个无验证的 SQL 解析器。官网 特殊文本格式处理 一些用来解析和操作特殊文本格式的库。\n通用 tablib：一个用来处理中表格数据的模块。官网 Office Marmir：把输入的 Python 数据结构转换为电子表单。官网 openpyxl：一个用来读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的库。官网 pyexcel：一个提供统一 API，用来读写，操作 Excel 文件的库。官网 python-docx：读取，查询以及修改 Microsoft Word 2007/2008 docx 文件。官网 relatorio：模板化 OpenDocument 文件。官网 unoconv：在 LibreOffice/OpenOffice 支持的任意文件格式之间进行转换。官网 XlsxWriter：一个用于创建 Excel .xlsx 文件的 Python 模块。官网 xlwings：一个使得在 Excel 中方便调用 Python 的库（反之亦然），基于 BSD 协议。官网 xlwt：读写 Excel 文件的数据和格式信息。官网 / xlrd PDF PDFMiner：一个用于从 PDF 文档中抽取信息的工具。官网 PyPDF2：一个可以分割，合并和转换 PDF 页面的库。官网 ReportLab：快速创建富文本 PDF 文档。官网 Markdown Mistune：快速并且功能齐全的纯 Python 实现的 Markdown 解析器。官网 Python-Markdown：John Gruber’s Markdown 的 Python 版实现。官网 Python-Markdown2：纯 Python 实现的 Markdown 解析器，比 Python-Markdown 更快，更准确，可扩展。官网 YAML PyYAML：Python 版本的 YAML 解析器。官网 CSV csvkit：用于转换和操作 CSV 的工具。官网 Archive unp：一个用来方便解包归档文件的命令行工具。官网 自然语言处理 用来处理人类语言的库。\nNLTK：一个先进的平台，用以构建处理人类语言数据的 Python 程序。官网 jieba：中文分词工具。官网 langid.py：独立的语言识别系统。官网 Pattern：Python 网络信息挖掘模块。官网 SnowNLP：一个用来处理中文文本的库。官网 TextBlob：为进行普通自然语言处理任务提供一致的 API。官网 TextGrocery：一简单高效的短文本分类工具，基于 LibLinear 和 Jieba。官网 thulac:清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包官网 文档 用以生成项目文档的库。\nSphinx：Python 文档生成器。官网 awesome-sphinxdoc：官网 MkDocs：对 Markdown 友好的文档生成器。官网 pdoc：一个可以替换 Epydoc 的库，可以自动生成 Python 库的 API 文档。官网 Pycco：文学编程（literate-programming）风格的文档生成器。官网 readthedocs：一个基于 Sphinx/MkDocs 的在线文档托管系统，对开源项目免费开放使用。官网 配置 用来保存和解析配置的库。\nconfig：logging 模块作者写的分级配置模块。官网 ConfigObj：INI 文件解析器，带验证功能。官网 ConfigParser：(Python 标准库) INI 文件解析器。官网 profig：通过多种格式进行配置，具有数值转换功能。官网 python-decouple：将设置和代码完全隔离。官网 命令行工具 用于创建命令行程序的库。\n命令行程序开发 asciimatics：跨平台，全屏终端包（即鼠标/键盘输入和彩色，定位文本输出），完整的复杂动画和特殊效果的高级 API。官网 cement：Python 的命令行程序框架。官网 click：一个通过组合的方式来创建精美命令行界面的包。官网 cliff：一个用于创建命令行程序的框架，可以创建具有多层命令的命令行程序。官网 clint：Python 命令行程序工具。官网 colorama：跨平台彩色终端文本。官网 docopt：Python 风格的命令行参数解析器。官网 Gooey：一条命令，将命令行程序变成一个 GUI 程序。官网 python-prompt-toolkit：一个用于构建强大的交互式命令行程序的库。官网 python-fire：Google 出品的一个基于 Python 类的构建命令行界面的库。官网 Pythonpy：在命令行中直接执行任何 Python 指令。官网 生产力工具 aws-cli：Amazon Web Services 的通用命令行界面。官网 bashplotlib：在终端中进行基本绘图。官网 caniusepython3：判断是哪个项目妨碍你你移植到 Python3。官网 cookiecutter：从 cookiecutters（项目模板）创建项目的一个命令行工具。官网 doitlive：一个用来在终端中进行现场演示的工具。官网 pyftpdlib：一个速度极快和可扩展的 Python FTP 服务库。官网 howdoi：通过命令行获取即时的编程问题解答。官网 httpie：一个命令行 HTTP 客户端，cURL 的替代品，易用性更好。官网 PathPicker：从 bash 输出中选出文件。官网 percol：向 UNIX shell 传统管道概念中加入交互式选择功能。官网 SAWS：一个加强版的 AWS 命令行。官网 thefuck：修正你之前的命令行指令。官网 mycli：一个 MySQL 命令行客户端，具有自动补全和语法高亮功能。官网 pgcli：Postgres 命令行工具，具有自动补全和语法高亮功能。官网 try：一个从来没有更简单的命令行工具，用来试用 python 库。官网 下载器 用来进行下载的库.\ns3cmd：一个用来管理 Amazon S3 和 CloudFront 的命令行工具。官网 s4cmd：超级 S3 命令行工具，性能更加强劲。官网 you-get：一个 YouTube/Youku/Niconico 视频下载器，使用 Python3 编写。官网 youtube-dl：一个小巧的命令行程序，用来下载 YouTube 视频。官网 图像处理 用来操作图像的库.\npillow：Pillow 是一个更加易用版的 PIL。官网 hmap：图像直方图映射。官网 imgSeek：一个使用视觉相似性搜索一组图片集合的项目。官网 nude.py：裸体检测。官网 pyBarcode：不借助 PIL 库在 Python 程序中生成条形码。官网 pygram：类似 Instagram 的图像滤镜。官网 python-qrcode：一个纯 Python 实现的二维码生成器。官网 Quads：基于四叉树的计算机艺术。官网 scikit-image：一个用于（科学）图像处理的 Python 库。官网 thumbor：一个小型图像服务，具有剪裁，尺寸重设和翻转功能。官网 wand：MagickWand的 Python 绑定。MagickWand 是 ImageMagick 的 C API 。官网 face_recognition：简单易用的 python 人脸识别库。官网 OCR 光学字符识别库。\npyocr：Tesseract 和 Cuneiform 的一个封装(wrapper)。官网 pytesseract：Google Tesseract OCR 的另一个封装(wrapper)。官网 python-tesseract：Google Tesseract OCR 的一个包装类。 音频 用来操作音频的库\naudiolazy：Python 的数字信号处理包。官网 audioread：交叉库 (GStreamer + Core Audio + MAD + FFmpeg) 音频解码。官网 beets：一个音乐库管理工具及 MusicBrainz 标签添加工具。官网 dejavu：音频指纹提取和识别。官网 django-elastic-transcoder：Django + Amazon Elastic Transcoder。官网 eyeD3：一个用来操作音频文件的工具，具体来讲就是包含 ID3 元信息的 MP3 文件。官网 id3reader：一个用来读取 MP3 元数据的 Python 模块。官网 m3u8：一个用来解析 m3u8 文件的模块。官网 mutagen：一个用来处理音频元数据的 Python 模块。官网 pydub：通过简单、简洁的高层接口来操作音频文件。官网 pyechonest：Echo Nest API 的 Python 客户端。官网 talkbox：一个用来处理演讲/信号的 Python 库。官网 TimeSide：开源 web 音频处理框架。官网 tinytag：一个用来读取 MP3, OGG, FLAC 以及 Wave 文件音乐元数据的库。官网 mingus：一个高级音乐理论和曲谱包，支持 MIDI 文件和回放功能。官网 Video 用来操作视频和 GIF 的库。\nmoviepy：一个用来进行基于脚本的视频编辑模块，适用于多种格式，包括动图 GIFs。官网 scikit-video：SciPy 视频处理常用程序。官网 地理位置 地理编码地址以及用来处理经纬度的库。\nGeoDjango：世界级地理图形 web 框架。官网 GeoIP：MaxMind GeoIP Legacy 数据库的 Python API。官网 geojson：GeoJSON 的 Python 绑定及工具。官网 geopy：Python 地址编码工具箱。官网 GeoIP2：GeoIP2 Webservice 客户端与数据库 Python API。官网 django-countries：一个 Django 应用程序，提供用于表格的国家选择功能，国旗图标静态文件以及模型中的国家字段。官网 HTTP 使用 HTTP 的库。\naiohttp：基于 asyncio 的异步 HTTP 网络库。官网 requests：人性化的 HTTP 请求库。官网 grequests：requests 库 + gevent ，用于异步 HTTP 请求.官网 httplib2：全面的 HTTP 客户端库。官网 treq：类似 requests 的 Python API 构建于 Twisted HTTP 客户端之上。官网 urllib3：一个具有线程安全连接池，支持文件 post，清晰友好的 HTTP 库。官网 数据库 Python 实现的数据库。\npickleDB：一个简单，轻量级键值储存数据库。官网 PipelineDB：流式 SQL 数据库。官网 TinyDB：一个微型的，面向文档型数据库。官网 ZODB：一个 Python 原生对象数据库。一个键值和对象图数据库。官网 数据库驱动 用来连接和操作数据库的库。\nMySQL：awesome-mysql 系列 aiomysql：基于 asyncio 的异步 MySQL 数据库操作库。官网 mysql-python：Python 的 MySQL 数据库连接器。官网 ysqlclient：mysql-python 分支，支持 Python 3。 oursql：一个更好的 MySQL 连接器，支持原生预编译指令和 BLOBs。官网 PyMySQL：纯 Python MySQL 驱动，兼容 mysql-python。官网 PostgreSQL psycopg2：Python 中最流行的 PostgreSQL 适配器。官网 queries：psycopg2 库的封装，用来和 PostgreSQL 进行交互。官网 txpostgres：基于 Twisted 的异步 PostgreSQL 驱动。官网 其他关系型数据库 apsw：另一个 Python SQLite 封装。官网 dataset：在数据库中存储 Python 字典 pymssql：一个简单的 Microsoft SQL Server 数据库接口。官网 NoSQL 数据库 asyncio-redis：基于 asyncio 的 redis 客户端 (PEP 3156)。官网 cassandra-python-driver：Cassandra 的 Python 驱动。官网 HappyBase：一个为 Apache HBase 设计的，对开发者友好的库。官网 Plyvel：一个快速且功能丰富的 LevelDB 的 Python 接口。官网 py2neo：Neo4j restful 接口的 Python 封装客户端。官网 pycassa：Cassandra 的 Python Thrift 驱动。官网 PyMongo：MongoDB 的官方 Python 客户端。官网 redis-py：Redis 的 Python 客户端。官网 telephus：基于 Twisted 的 Cassandra 客户端。官网 txRedis：基于 Twisted 的 Redis 客户端。官网 ORM 实现对象关系映射或数据映射技术的库。\n关系型数据库 Django Models：Django 的一部分。官网 SQLAlchemy：Python SQL 工具以及对象关系映射工具。官网 awesome-sqlalchemy 系列 Peewee：一个小巧，富有表达力的 ORM。官网 PonyORM：提供面向生成器的 SQL 接口的 ORM。官网 python-sql：编写 Python 风格的 SQL 查询。官网 NoSQL 数据库 django-mongodb-engine：Django MongoDB 后端。官网 PynamoDB：Amazon DynamoDB 的一个 Python 风格接口。官网 flywheel：Amazon DynamoDB 的对象映射工具。官网 MongoEngine：一个 Python 对象文档映射工具，用于 MongoDB。官网 hot-redis：为 Redis 提供 Python 丰富的数据类型。官网 redisco：一个 Python 库，提供可以持续存在在 Redis 中的简单模型和容器。官网 其他 butterdb：Google Drive 电子表格的 Python ORM。官网 Web 框架 全栈 Web 框架。\nDjango：Python 界最流行的 web 框架。官网 awesome-django 系列 Flask：一个 Python 微型框架。官网 awesome-flask 系列 pyramid：一个小巧，快速，接地气的开源 Python web 框架。 awesome-pyramid 系列 Bottle：一个快速小巧，轻量级的 WSGI 微型 web 框架。官网 CherryPy：一个极简的 Python web 框架，服从 HTTP/1.1 协议且具有 WSGI 线程池。官网 TurboGears：一个可以扩展为全栈解决方案的微型框架。官网 web.py：一个 Python 的 web 框架，既简单，又强大。官网 web2py：一个全栈 web 框架和平台，专注于简单易用。官网 Tornado：一个 web 框架和异步网络库。官网 sanic：基于 Python3.5+ 的异步网络框架。官网 权限 允许或拒绝用户访问数据或功能的库。\nCarteblanche：站在用户和设计者角度开发的一个代码对齐模块，很好地处理了代码导航及权限。官网 django-guardian：Django 1.2+ 实现了单个对象权限。官网 django-rules：一个小巧但是强大的应用，提供对象级别的权限管理，且不需要使用数据库。官网 CMS 内容管理系统\nodoo-cms: 一个开源的，企业级 CMS，基于 odoo。官网 django-cms：一个开源的，企业级 CMS，基于 Django。官网 djedi-cms：一个轻量级但却非常强大的 Django CMS ，考虑到了插件，内联编辑以及性能。官网 FeinCMS：基于 Django 构建的最先进的内容管理系统之一。官网 Kotti：一个高级的，Python 范的 web 应用框架，基于 Pyramid 构建。官网 Mezzanine：一个强大的，持续的，灵活的内容管理平台。官网 Opps：一个为杂志，报纸网站以及大流量门户网站设计的 CMS 平台，基于 Django。官网 Plone：一个构建于开源应用服务器 Zope 之上的 CMS。官网 Quokka：灵活，可扩展的小型 CMS，基于 Flask 和 MongoDB。官网 Wagtail：一个 Django 内容管理系统。官网 Widgy：最新的 CMS 框架，基于 Django。官网 电子商务 用于电子商务以及支付的框架和库。\ndjango-oscar：一个用于 Django 的开源的电子商务框架。官网 django-shop：一个基于 Django 的店铺系统。官网 Cartridge：一个基于 Mezzanine 构建的购物车应用。官网 shoop：一个基于 Django 的开源电子商务平台。官网 alipay：非官方的 Python 支付宝 API。官网 merchant：一个可以接收来自多种支付平台支付的 Django 应用。官网 money：一个货币类库。带有可选的 CLDR 后端本地化格式，提供可扩展的货币兑换解决方案。官网 python-currencies：显示货币格式以及它的数值。官网 RESTful API 用来开发 RESTful APIs 的库\nDjango django-rest-framework：一个强大灵活的工具，用来构建 web API。官网 django-tastypie：为 Django 应用开发 API。官网 django-formapi：为 Django 的表单验证，创建 JSON APIs 。官网 Flask flask-api：为 flask 开发的，可浏览 Web APIs 。官网 flask-restful：为 flask 快速创建 REST APIs 。官网 flask-restless：为 SQLAlchemy 定义的数据库模型创建 RESTful APIs 。官网 flask-api-utils：为 Flask 处理 API 表示和验证。官网 eve：REST API 框架，由 Flask, MongoDB 等驱动。官网 Pyramid cornice：一个 Pyramid 的 REST 框架 。官网 与框架无关的 falcon：一个用来建立云 API 和 web app 后端的高性能框架。官网 sandman：为现存的数据库驱动系统自动创建 REST APIs 。官网 restless：框架无关的 REST 框架 ，基于从 Tastypie 学到的知识。官网 ripozo：快速创建 REST/HATEOAS/Hypermedia APIs。官网 验证 实现验证方案的库。\nOAuth Authomatic：简单但是强大的框架，身份验证/授权客户端。官网 django-allauth：Django 的验证应用。官网 django-oauth-toolkit：为 Django 用户准备的 OAuth2。官网 django-oauth2-provider：为 Django 应用提供 OAuth2 接入。官网 Flask-OAuthlib：OAuth 1.0/a, 2.0 客户端实现，供 Flask 使用。官网 OAuthLib：一个 OAuth 请求-签名逻辑通用、 完整的实现。官网 python-oauth2：一个完全测试的抽象接口。用来创建 OAuth 客户端和服务端。官网 python-social-auth：一个设置简单的社会化验证方式。官网 rauth：OAuth 1.0/a, 2.0, 和 Ofly 的 Python 库。官网 sanction：一个超级简单的 OAuth2 客户端实现。官网 其他 jose：JavaScript 对象签名和加密草案的实现。官网 PyJWT：JSON Web 令牌草案 01。官网 python-jws：JSON Web 签名草案 02 的实现。官网 python-jwt：一个用来生成和验证 JSON Web 令牌的模块。官网 模板引擎 模板生成和词法解析的库和工具。\nJinja2：一个现代的，对设计师友好的模板引擎。官网 Chameleon：一个 HTML/XML 模板引擎。 模仿了 ZPT（Zope Page Templates）, 进行了速度上的优化。官网 Genshi：Python 模板工具，用以生成 web 感知的结果。官网 Mako：Python 平台的超高速轻量级模板。官网 队列 处理事件以及任务队列的库。\ncelery：一个异步任务队列/作业队列，基于分布式消息传递。官网 huey：小型多线程任务队列。官网 mrq：Mr. Queue -一个 Python 的分布式 worker 任务队列， 使用 Redis 和 gevent。官网 rq：简单的 Python 作业队列。官网 simpleq：一个简单的，可无限扩张的，基于亚马逊 SQS 的队列。官网 搜索 对数据进行索引和执行搜索查询的库和软件。\ndjango-haystack：Django 模块化搜索。官网 elasticsearch-py：Elasticsearch 的官方底层 Python 客户端。官网 elasticsearch-dsl-py：Elasticsearch 的官方高级 Python 客户端。官网 solrpy：solr 的 Python 客户端。官网 Whoosh：一个快速的纯 Python 搜索引擎库。官网 动态消息 用来创建用户活动的库。\ndjango-activity-stream：从你的站点行为中生成通用活动信息流。官网 Stream-Framework：使用 Cassandra 和 Redis 创建动态消息和通知系统。官网 资源管理 管理、压缩、缩小网站资源的工具。\ndjango-compressor：将链接和内联的 JavaScript 或 CSS 压缩到一个单独的缓存文件中。官网 django-storages：一个针对 Django 的自定义存储后端的工具集合。官网 fanstatic：打包、优化，并且把静态文件依赖作为 Python 的包来提供。官网 File Conveyor：一个后台驻留的程序，用来发现和同步文件到 CDNs, S3 和 FTP。官网 Flask-Assets：帮你将 web 资源整合到你的 Flask app 中。官网 jinja-assets-compressor：一个 Jinja 扩展，用来编译和压缩你的资源。官网 webassets：为你的静态资源打包、优化和管理生成独一无二的缓存 URL。官网 缓存 缓存数据的库。\nBeaker：一个缓存和会话库，可以用在 web 应用和独立 Python 脚本和应用上。官网 django-cache-machine：Django 模型的自动缓存和失效。官网 django-cacheops：具有自动颗粒化事件驱动失效功能的 ORM。官网 django-viewlet：渲染模板，同时具有额外的缓存控制功能。官网 dogpile.cache：dogpile.cache 是 Beaker 的下一代替代品，由同一作者开发。官网 HermesCache：Python 缓存库，具有基于标签的失效和 dogpile effect 保护功能。官网 johnny-cache：django 应用缓存框架。官网 pylibmc：libmemcached 接口的 Python 封装。官网 电子邮件 用来发送和解析电子邮件的库。\ndjango-celery-ses：带有 AWS SES 和 Celery 的 Django email 后端。官网 envelopes：供人类使用的电子邮件库。官网 flanker：一个 email 地址和 Mime 解析库。官网 imbox：Python IMAP 库。官网 inbox.py：Python SMTP 服务器。官网 inbox：一个开源电子邮件工具箱。官网 lamson：Python 风格的 SMTP 应用服务器。官网 mailjet：Mailjet API 实现，用来提供批量发送邮件，统计等功能。官网 marrow.mailer：高性能可扩展邮件分发框架。官网 modoboa：一个邮件托管和管理平台，具有现代的、简约的 Web UI。官网 pyzmail：创建，发送和解析电子邮件。官网 Talon：Mailgun 库，用来抽取信息和签名。官网 yagmail：yagmail是一个GMAIL / SMTP客户端，旨在使其尽可能简单地发送电子邮件。官网 国际化 用来进行国际化的库。\nBabel：一个 Python 的国际化库。官网 Korean：一个韩语词态库。官网 URL 处理 解析 URLs 的库\nfurl：一个让处理 URL 更简单小型 Python 库。官网 purl：一个简单的，不可变的 URL 类，具有简洁的 API 来进行询问和处理。官网 pyshorteners：一个纯 Python URL 缩短库。官网 shorturl：生成短小 URL 和类似 bit.ly 短链的 Python 实现。官网 webargs：一个解析 HTTP 请求参数的库，内置对流行 web 框架的支持，包括 Flask, Django, Bottle, Tornado 和 Pyramid。官网 HTML 处理 处理 HTML 和 XML 的库。\nBeautifulSoup：以 Python 风格的方式来对 HTML 或 XML 进行迭代，搜索和修改。官网 bleach：一个基于白名单的 HTML 清理和文本链接库。官网 cssutils：一个 Python 的 CSS 库。官网 html5lib：一个兼容标准的 HTML 文档和片段解析及序列化库。官网 lxml：一个非常快速，简单易用，功能齐全的库，用来处理 HTML 和 XML。官网 MarkupSafe：为 Python 实现 XML/HTML/XHTML 标记安全字符串。官网 pyquery：一个解析 HTML 的库，类似 jQuery。官网 requests-html：人性化的，Pythonic 的 HTML 解析库。官网 untangle：将 XML 文档转换为 Python 对象，使其可以方便的访问。官网 xhtml2pdf：HTML/CSS 转 PDF 工具。官网 xmltodict：像处理 JSON 一样处理 XML。官网 爬取网络站点的库\nScrapy：一个快速高级的屏幕爬取及网页采集框架。官网 ScrapydWeb：一个用于 Scrapyd 集群管理的全功能 web UI，支持 Scrapy 日志分析和可视化，自动打包，定时器任务和邮件通知等特色功能。官网 cola：一个分布式爬虫框架。官网 Demiurge：基于 PyQuery 的爬虫微型框架。官网 feedparser：通用 feed 解析器。官网 Grab：站点爬取框架。官网 MechanicalSoup：用于自动和网络站点交互的 Python 库。官网 portia：Scrapy 可视化爬取。官网 pyspider：一个强大的爬虫系统。官网 RoboBrowser：一个简单的，Python 风格的库，用来浏览网站，而不需要一个独立安装的浏览器。官网 网页内容提取 用于进行网页内容提取的库。\nHaul：一个可以扩展的图像爬取工具。官网 html2text：将 HTML 转换为 Markdown 格式文本。官网 lassie：人性化的网页内容检索库。官网 micawber：一个小型网页内容提取库，用来从 URLs 提取富内容。官网 newspaper：使用 Python 进行新闻提取，文章提取以及内容策展。官网 opengraph：一个用来解析开放内容协议(Open Graph Protocol)的 Python 模块。官网 python-goose：HTML 内容/文章提取器。官网 python-readability：arc90 公司 readability 工具的 Python 高速端口。官网 sanitize：为杂乱的数据世界带来调理性。官网 sumy：一个为文本文件和 HTML 页面进行自动摘要的模块。官网 textract：从任何格式的文档中提取文本，Word，PowerPoint，PDFs 等等。官网 表单 进行表单操作的库。\nDeform：Python HTML 表单生成库，受到了 formish 表单生成库的启发。官网 django-bootstrap3：集成了 Bootstrap 3 的 Django。官网 django-crispy-forms：一个 Django 应用，他可以让你以一种非常优雅且 DRY（Don\u0026rsquo;t repeat yourself） 的方式来创建美观的表单。官网 django-remote-forms：一个平台独立的 Django 表单序列化工具。官网 WTForms：一个灵活的表单验证和呈现库。官网 WTForms-JSON：一个 WTForms 扩展，用来处理 JSON 数据。官网 数据验证 数据验证库。多用于表单验证。\nCerberus：一个映射验证器（mappings-validator）。支持多种规则，提供归一化功能，可以方便地定制为 Python 风格的 schema 定义。官网 colander：一个用于对从 XML, JSON，HTML 表单获取的数据或其他同样简单的序列化数据进行验证和反序列化的系统。官网 kmatch：一种用于匹配/验证/筛选 Python 字典的语言。官网 schema：一个用于对 Python 数据结构进行验证的库。官网 Schematics：数据结构验证。官网 valideer：轻量级可扩展的数据验证和适配库。官网 voluptuous：一个 Python 数据验证库。主要是为了验证传入 Python 的 JSON，YAML 等数据。官网 jsonschema：JSON Schema的 python 实现，用于 JSON 数据的验证。官网 反垃圾技术 帮助你和电子垃圾进行战斗的库。\ndjango-simple-captcha：一个简单、高度可定制的 Django 应用，可以为任何 Django 表单添加验证码。官网 django-simple-spam-blocker：一个用于 Django 的简单的电子垃圾屏蔽工具。官网 标记 用来进行标记的库。\ndjango-taggit：简单的 Django 标记工具。官网 管理面板 管理界面库。\nAjenti：一个你的服务器值得拥有的管理面板。官网 django-suit：Django 管理界面的一个替代品 (仅对于非商业用途是免费的)。官网 django-xadmin：Django admin 的一个替代品，具有很多不错的功能。官网 flask-admin：一个用于 Flask 的简单可扩展的管理界面框架。官网 flower：一个对 Celery 集群进行实时监控和提供 web 管理界面的工具。官网 Grappelli：Django 管理界面的一个漂亮的皮肤。官网 Wooey：一个 Django 应用，可以为 Python 脚本创建 web 用户界面。官网 静态站点生成器 静态站点生成器是一个软件，它把文本和模板作为输入，然后输出 HTML 文件。\nPelican：使用 Markdown 或 ReST 来处理内容， Jinja 2 来制作主题。支持 DVCS, Disqus.。AGPL 许可。官网 Cactus：为设计师设计的静态站点生成器。官网 Hyde：基于 Jinja2 的静态站点生成器。官网 Nikola：一个静态网站和博客生成器。官网 Tinkerer：Tinkerer 是一个博客引擎/静态站点生成器，由 Sphinx 驱动。官网 Lektor：一个简单易用的静态 CMS 和博客引擎。官网 进程 操作系统进程启动及通信库。\nenvoy：比 Python subprocess 模块更人性化。官网 sarge：另一 种 subprocess 模块的封装。官网 sh：一个完备的 subprocess 替代库。官网 并发和并行 用以进行并发和并行操作的库。\nmultiprocessing：(Python 标准库) 基于进程的“线程”接口。官网 threading：(Python 标准库)更高层的线程接口。官网 eventlet：支持 WSGI 的异步框架。官网 gevent：一个基于协程的 Python 网络库，使用 greenlet。官网 Tomorrow：用于产生异步代码的神奇的装饰器语法实现。官网 uvloop：在 libuv 之上超快速实现 asyncio 事件循环。官网 网络 用于网络编程的库。\nasyncio：(Python 标准库) 异步 I/O, 事件循环, 协程以及任务。官网 Twisted：一个事件驱动的网络引擎。官网 pulsar：事件驱动的并发框架。官网 diesel：基于 Greenlet 的事件 I/O 框架。官网 pyzmq：一个 ZeroMQ 消息库的 Python 封装。官网 Toapi：一个轻巧，简单，快速的 Flask 库，致力于为所有网站提供 API 服务。官网 txZMQ：基于 Twisted 的 ZeroMQ 消息库的 Python 封装。官网 WebSocket 帮助使用 WebSocket 的库。\nAutobahnPython：给 Python 、使用的 WebSocket \u0026amp; WAMP 基于 Twisted 和 asyncio。官网 Crossbar：开源统一应用路由(Websocket \u0026amp; WAMP for Python on Autobahn)。官网 django-socketio：给 Django 用的 WebSockets。官网 WebSocket-for-Python：为 Python2/3 以及 PyPy 编写的 WebSocket 客户端和服务器库。官网 WSGI 服务器 兼容 WSGI 的 web 服务器\ngunicorn：Pre-forked, 部分是由 C 语言编写的。官网 uwsgi：uwsgi 项目的目的是开发一组全栈工具，用来建立托管服务， 由 C 语言编写。官网 bjoern：异步，非常快速，由 C 语言编写。官网 fapws3：异步 (仅对于网络端)，由 C 语言编写。官网 meinheld：异步，部分是由 C 语言编写的。官网 netius：异步，非常快速。官网 paste：多线程，稳定，久经考验。官网 rocket：多线程。官网 waitress：多线程, 是它驱动着 Pyramid 框架。官网 Werkzeug：一个 WSGI 工具库，驱动着 Flask ，而且可以很方便大嵌入到你的项目中去。官网 RPC 服务器 兼容 RPC 的服务器。\nSimpleJSONRPCServer：这个库是 JSON-RPC 规范的一个实现。官网 SimpleXMLRPCServer：(Python 标准库) 简单的 XML-RPC 服务器实现，单线程。官网 zeroRPC：zerorpc 是一个灵活的 RPC 实现，基于 ZeroMQ 和 MessagePack。官网 密码学 cryptography：这个软件包意在提供密码学基本内容和方法提供给 Python 开发者。官网 hashids：在 Python 中实现 hashids 。官网 Paramiko：SSHv2 协议的 Python (2.6+, 3.3+) ，提供客户端和服务端的功能。官网 Passlib：安全密码存储／哈希库，官网 PyCrypto：Python 密码学工具箱。官网 PyNacl：网络和密码学(NaCl) 库的 Python 绑定。官网 图形用户界面 用来创建图形用户界面程序的库。\ncurses：内建的 ncurses 封装，用来创建终端图形用户界面。官网 enaml：使用类似 QML 的 Declaratic 语法来创建美观的用户界面。官网 kivy：一个用来创建自然用户交互（NUI）应用程序的库，可以运行在 Windows, Linux, Mac OS X, Android 以及 iOS 平台上。官网 pyglet：一个 Python 的跨平台窗口及多媒体库。官网 PyQt：跨平台用户界面框架 Qt 的 Python 绑定 ，支持 Qt v4 和 Qt v5。官网 PySide：跨平台用户界面框架 Qt 的 Python 绑定 ，支持 Qt v4。官网 Tkinter：Tkinter 是 Python GUI 的一个事实标准库。官网 Toga：一个 Python 原生的, 操作系统原生的 GUI 工具包。官网 urwid：一个用来创建终端 GUI 应用的库，支持组件，事件和丰富的色彩等。官网 wxPython：wxPython 是 wxWidgets C++ 类库和 Python 语言混合的产物。官网 PyGObject：GLib/GObject/GIO/GTK+ (GTK+3) 的 Python 绑定。官网 Flexx：Flexx 是一个纯 Python 语言编写的用来创建 GUI 程序的工具集，它使用 web 技术进行界面的展示。官网 游戏开发 超赞的游戏开发库。\nCocos2d：cocos2d 是一个用来开发 2D 游戏， 示例和其他图形/交互应用的框架。基于 pyglet。官网 Panda3D：由迪士尼开发的 3D 游戏引擎，并由卡内基梅陇娱乐技术中心负责维护。使用 C++ 编写, 针对 Python 进行了完全的封装。官网 Pygame：Pygame 是一组 Python 模块，用来编写游戏。官网 PyOgre：Ogre 3D 渲染引擎的 Python 绑定，可以用来开发游戏和仿真程序等任何 3D 应用。官网 PyOpenGL：OpenGL 的 Python 绑定及其相关 APIs。官网 PySDL2：SDL2 库的封装，基于 ctypes。官网 RenPy：一个视觉小说（visual novel）引擎。官网 日志 用来生成和操作日志的库。\nlogging：(Python 标准库) 为 Python 提供日志功能。官网 logbook：Logging 库的替代品。官网 Eliot：为复杂的和分布式系统创建日志。官网 Raven：Sentry 的 Python 客户端。官网 Sentry：实时记录和收集日志的服务器。官网 测试 进行代码库测试和生成测试数据的库。\n测试框架 unittest：(Python 标准库) 单元测试框架。官网 nose：nose 扩展了 unittest 的功能。官网 contexts：一个 Python 3.3+ 的 BDD 框架。受到 C# – Machine.Specifications 的启发。官网 hypothesis：Hypothesis 是一个基于先进的 Quickcheck 风格特性的测试库。官网 mamba：Python 的终极测试工具， 拥护 BDD。官网 PyAutoGUI：PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块。官网 pyshould：Should 风格的断言，基于 PyHamcrest。官网 pytest：一个成熟的全功能 Python 测试工具。官网 green：干净，多彩的测试工具。官网 pyvows：BDD 风格的测试工具，受 Vows.js 的启发。官网 Robot Framework：一个通用的自动化测试框架。官网 Web 测试 Selenium：Selenium WebDriver 的 Python 绑定。官网 locust：使用 Python 编写的，可扩展的用户加载测试工具。官网 sixpack：一个和语言无关的 A/B 测试框架。官网 splinter：开源的 web 应用测试工具。官网 Mock 测试 mock：(Python 标准库) 一个用于伪造测试的库。官网 doublex：Python 的一个功能强大的 doubles 测试框架。官网 freezegun：通过伪造日期模块来生成不同的时间。官网 httmock：针对 Python 2.6+ 和 3.2+ 生成 伪造请求的库。官网 httpretty：Python 的 HTTP 请求 mock 工具。官网 responses：伪造 Python 中的 requests 库的一个通用库。官网 VCR.py：在你的测试中记录和重放 HTTP 交互。官网 对象工厂 factoryboy：一个 Python 用的测试固件 (test fixtures) 替代库。官网 mixer：另外一个测试固件 (test fixtures) 替代库，支持 Django, Flask, SQLAlchemy, Peewee 等。官网 modelmommy：为 Django 测试创建随机固件。官网 代码覆盖率 coverage：代码覆盖率测量。官网 Codecov：一个代码覆盖率测试工具，为开源项目提供免费代码覆盖率测试服务。官网 伪数据 faker：一个 Python 库，用来生成伪数据。官网 fake2db：伪数据库生成器。官网 radar：生成随机的日期/时间。官网 错误处理 FuckIt.py：FuckIt.py 使用最先进的技术来保证你的 Python 代码无论对错都能继续运行。官网 代码分析和 Lint 工具 进行代码分析，解析和操作代码库的库和工具。\n代码分析 coala：语言独立和易于扩展的代码分析应用程序。官网 code2flow：把你的 Python 和 JavaScript 代码转换为流程图。官网 pycallgraph：这个库可以把你的 Python 应用的流程(调用图)进行可视化。官网 pysonar2：Python 类型推断和检索工具。官网 Lint 工具 Flake8：模块化源码检查工具: pep8, pyflakes 以及 co。官网 Pylint：一个完全可定制的源码分析器。官网 YAPF: Google 的 Python 代码格式化工具。官网 pylama：Python 和 JavaScript 的代码审查工具。官网 代码格式化 autopep8：自动格式化 Python 代码，以使其符合 PEP8 规范。官网 black：一个坚定的 Python 代码格式化工具。官网 调试工具 用来进行代码调试的库。\n调试器 ipdb：IPython 启用的 pdb。官网 pudb：全屏，基于控制台的 Python 调试器。官网 pyringe：可以在 Python 进程中附加和注入代码的调试器。官网 wdb：一个奇异的 web 调试器，通过 WebSockets 工作。官网 winpdb：一个具有图形用户界面的 Python 调试器，可以进行远程调试，基于 rpdb2。官网 django-debug-toolbar：为 Django 显示各种调试信息。官网 django-devserver：一个 Django 运行服务器的替代品。官网 flask-debugtoolbar：django-debug-toolbar 的 flask 版。官网 性能分析器 lineprofiler：逐行性能分析。官网 Memory Profiler：监控 Python 代码的内存使用。官网、内存 profiling：一个交互式 Python 性能分析工具。官网 其他 pyelftools：解析和分析 ELF 文件以及 DWARF 调试信息。官网 python-statsd：statsd 服务器的 Python 客户端。官网 科学计算和数据分析 用来进行科学计算和数据分析的库。\nastropy：一个天文学 Python 库。官网 bcbio-nextgen：这个工具箱为全自动高通量测序分析提供符合最佳实践的处理流程。官网 bccb：生物分析相关代码集合。官网 Biopython：Biopython 是一组可以免费使用的用来进行生物计算的工具。官网 blaze：NumPy 和 Pandas 的大数据接口。官网 cclib：一个用来解析和解释计算化学软件包输出结果的库。官网 NetworkX：一个为复杂网络设计的高性能软件。官网 Neupy：执行和测试各种不同的人工神经网络算法。官网 Numba：Python JIT (just in time) 编译器，针对科学用的 Python ，由 Cython 和 NumPy 的开发者开发。官网 NumPy：使用 Python 进行科学计算的基础包。官网 Open Babel：一个化学工具箱，用来描述多种化学数据。官网 Open Mining：使用 Python 挖掘商业情报 (BI) (Pandas web 接口)。官网 orange：通过可视化编程或 Python 脚本进行数据挖掘，数据可视化，分析和机器学习。官网 Pandas：提供高性能，易用的数据结构和数据分析工具。官网 PyDy：PyDy 是 Python Dynamics 的缩写，用来为动力学运动建模工作流程提供帮助， 基于 NumPy, SciPy, IPython 和 matplotlib。官网 PyMC：马尔科夫链蒙特卡洛采样工具。官网 RDKit：化学信息学和机器学习软件。官网 SciPy：由一些基于 Python ，用于数学，科学和工程的开源软件构成的生态系统。官网 statsmodels：统计建模和计量经济学。官网 SymPy：一个用于符号数学的 Python 库。官网 zipline：一个 Python 算法交易库。官网 Bayesian-belief-networks：优雅的贝叶斯信念网络框架。官网 数据可视化 进行数据可视化的库。 参见: awesome-javascript。\nmatplotlib：一个 Python 2D 绘图库。官网 bokeh：用 Python 进行交互式 web 绘图。官网 ggplot：ggplot2 给 R 提供的 API 的 Python 版本。官网 plotly：协同 Python 和 matplotlib 工作的 web 绘图库。官网 pyecharts：基于百度 Echarts 的数据可视化库。官网 pygal：一个 Python SVG 图表创建工具。官网 pygraphviz：Graphviz 的 Python 接口。官网 PyQtGraph：交互式实时 2D/3D/ 图像绘制及科学/工程学组件。官网 SnakeViz：一个基于浏览器的 Python\u0026rsquo;s cProfile 模块输出结果查看工具。官网 vincent：把 Python 转换为 Vega 语法的转换工具。官网 VisPy：基于 OpenGL 的高性能科学可视化工具。官网 计算机视觉 计算机视觉库。\nOpenCV：开源计算机视觉库。官网 pyocr：Tesseract 和 Cuneiform 的包装库。官网 pytesseract：Google Tesseract OCR 的另一包装库。官网 SimpleCV：一个用来创建计算机视觉应用的开源框架。官网 机器学习 机器学习库。 参见: awesome-machine-learning.\nCaffe: 一个 Caffe 的 python 接口。官网 Caffe2：一个轻量级的，模块化的，可扩展的深度学习框架。官网 Crab：灵活、快速的推荐引擎。官网 gensim：人性化的话题建模库。官网 hebel：GPU 加速的深度学习库。官网 keras: 以 tensorflow/theano/CNTK 为后端的深度学习封装库，快速上手神经网络。官网 MXNet：一个高效和灵活的深度学习框架。官网 NuPIC：智能计算 Numenta 平台。官网 pattern：Python 网络挖掘模块。官网 PyBrain：另一个 Python 机器学习库。官网 pydeep：Python 深度学习库。官网 Pylearn2：一个基于 Theano 的机器学习库。官网 python-recsys：一个用来实现推荐系统的 Python 库。官网 Pytorch：一个具有张量和动态神经网络，并有强大 GPU 加速能力的深度学习框架。官网 scikit-learn：基于 SciPy 构建的机器学习 Python 模块。官网 skflow：一个 TensorFlow 的简化接口(模仿 scikit-learn)。官网 TensorFlow：谷歌开源的最受欢迎的深度学习框架。官网 Theano：一个快速数值计算库。官网 vowpalporpoise：轻量级 Vowpal Wabbit 的 Python 封装。官网 MapReduce MapReduce 框架和库。\ndpark：Spark 的 Python 克隆版，一个类似 MapReduce 的框架。官网 dumbo：这个 Python 模块可以让人轻松的编写和运行 Hadoop 程序。官网 luigi：这个模块帮你构建批处理作业的复杂流水线。官网 mrjob：在 Hadoop 或 Amazon Web Services 上运行 MapReduce 任务。官网 PySpark：Spark 的 Python API 。官网 streamparse：运行针对事实数据流的 Python 代码。集成了 Apache Storm。官网 函数式编程 使用 Python 进行函数式编程。\nCyToolz：Toolz 的 Cython 实现 : 高性能函数式工具。官网 fn.py：在 Python 中进行函数式编程 : 实现了一些享受函数式编程缺失的功能。官网 funcy：炫酷又实用的函数式工具。官网 Toolz：一组用于迭代器，函数和字典的函数式编程工具。官网 第三方 API 用来访问第三方 API 的库。 参见： List of Python API Wrappers and Libraries。\napache-libcloud：一个为各种云设计的 Python 库。官网 boto：Amazon Web Services 的 Python 接口。官网 django-wordpress：WordPress models and views for Django.官网 facebook-sdk：Facebook 平台的 Python SDK.官网 facepy：Facepy 让和 Facebook\u0026rsquo;s Graph API 的交互变得更容易。官网 gmail：Gmail 的 Python 接口。官网 google-api-python-client：Python 用的 Google APIs 客户端库。官网 gspread：Google 电子表格的 Python API.官网 twython：Twitter API 的封装。官网 DevOps 工具 用于 DevOps 的软件和库。\nAnsible：一个非常简单的 IT 自动化平台。官网 SaltStack：基础设施自动化和管理系统。官网 OpenStack：用于构建私有和公有云的开源软件。官网 Docker Compose：快速，分离的开发环境，使用 Docker。官网 Fabric：一个简单的，Python 风格的工具，用来进行远程执行和部署。官网 cuisine：为 Fabric 提供一系列高级函数。官网 Fabtools：一个用来编写超赞的 Fabric 文件的工具。官网 gitapi：Git 的纯 Python API。官网 hgapi：Mercurial 的纯 Python API。官网 honcho：Foreman 的 Python 克隆版，用来管理基于 Procfile 的应用。官网 pexpect：Controlling interactive programs in a pseudo-terminal like 在一个伪终端中控制交互程序，就像 GNU expect 一样。官网 psutil：一个跨平台进程和系统工具模块。官网 supervisor：UNIX 的进程控制系统。官网 任务调度 任务调度库。\nAPScheduler：轻巧但强大的进程内任务调度，使你可以调度函数。官网 django-schedule：一个 Django 排程应用。官网 doit：一个任务执行和构建工具。官网 gunnery：分布式系统使用的多用途任务执行工具 ，具有 web 交互界面。官网 Joblib：一组为 Python 提供轻量级作业流水线的工具。官网 Plan：如有神助地编写 crontab 文件。官网 schedule：人性化的 Python 任务调度库。官网 Spiff：使用纯 Python 实现的强大的工作流引擎。官网 TaskFlow：一个可以让你方便执行任务的 Python 库，一致并且可靠。官网 * AirFlow：Airflow 是Airbnb公司开源的，是一个工作流分配管理系统，通过有向非循环图的方式管理任务流程，设置任务依赖关系和时间调度。官方 外来函数接口 使用外来函数接口的库。\ncffi：用来调用 C 代码的外来函数接口。官网 ctypes：(Python 标准库) 用来调用 C 代码的外来函数接口。官网 PyCUDA：Nvidia CUDA API 的封装。官网 SWIG：简化的封装和接口生成器。官网 高性能 让 Python 更快的库。\nCython：优化的 Python 静态编译器。使用类型混合使 Python 编译成 C 或 C++ 模块来获得性能的极大提升。官网 PeachPy：嵌入 Python 的 x86-64 汇编器。可以被用作 Python 内联的汇编器或者是独立的汇编器，用于 Windows, Linux, OS X, Native Client 或者 Go 。官网 PyPy：使用 Python 实现的 Python。解释器使用黑魔法加快 Python 运行速度且不需要加入额外的类型信息。官网 Pyston：使用 LLVM 和现代 JIT 技术构建的 Python 实现，目标是为了获得很好的性能。官网 Stackless Python：一个强化版的 Python。官网 微软的 Windows 平台 在 Windows 平台上进行 Python 编程。\nPython(x,y)：面向科学应用的 Python 发行版，基于 Qt 和 Spyder。官网 pythonlibs：非官方的 Windows 平台 Python 扩展二进制包。官网 PythonNet：Python 与 .NET 公共语言运行库 (CLR)的集成。官网 PyWin32：针对 Windows 的 Python 扩展。官网 WinPython：Windows 7/8 系统下便携式开发环境。官网 网络可视化和 SDN 用来进行网络可视化和 SDN(软件定义网络)的工具和库。\nMininet：一款流行的网络模拟器以及用 Python 编写的 API。官网 POX：一个针对基于 Python 的软件定义网络应用（例如 OpenFlow SDN 控制器）的开源开发平台。官网 Pyretic：火热的 SDN 编程语言中的一员，为网络交换机和模拟器提供强大的抽象能力。官网 SDX Platform：基于 SDN 的 IXP 实现，影响了 Mininet, POX 和 Pyretic。官网 NRU：一个基于组件的软件定义网络框架。官网 硬件 用来对硬件进行编程的库。\nino：操作 Arduino 的命令行工具。官网 Pyro：Python 机器人编程库。官网 PyUserInput：跨平台的，控制鼠标和键盘的模块。官网 scapy：一个非常棒的操作数据包的库。官网 wifi：一个 Python 库和命令行工具用来在 Linux 平台上操作 WiFi。官网 Pingo：Pingo 为类似 Raspberry Pi，pcDuino， Intel Galileo 等设备提供统一的 API 用以编程。官网 兼容性 帮助从 Python 2 向 Python 3 迁移的库。\nPython-Future：这就是 Python 2 和 Python 3 之间丢失的那个兼容性层。官网 Python-Modernize：使 Python 代码更加现代化以便最终迁移到 Python 3。官网 Six：Python 2 和 3 的兼容性工具。官网 杂项 不属于上面任何一个类别，但是非常有用的库。\nblinker：一个快速的 Python 进程内信号/事件分发系统。官网 itsdangerous：一系列辅助工具用来将可信的数据传入不可信的环境。官网 pluginbase：一个简单但是非常灵活的 Python 插件系统。官网 Pychievements：一个用来创建和追踪成就的 Python 框架。官网 Tryton：一个通用商务框架。官网 算法和设计模式 Python 实现的算法和设计模式。\nalgorithms：一个 Python 算法模块。官网 python-patterns：Python 设计模式的集合。官网 sortedcontainers：快速，纯 Python 实现的 SortedList，SortedDict 和 SortedSet 类型。官网 Python：使用Python实现的算法大全。官网 编辑器插件 编辑器和 IDE 的插件\nEmacs Elpy：Emacs Python 开发环境。官网 Sublime Text SublimeJEDI：一个 Sublime Text 插件，用来使用超赞的自动补全库 Jedi。官网 Anaconda：Anaconda 把你的 Sublime Text 3 变成一个功能齐全的 Python IDE。官网 Vim YouCompleteMe：引入基于 Jedi 的 Python 自动补全引擎。官网 Jedi-vim：绑定 Vim 和 Jedi 自动补全库对 Python 进行自动补全。官网 Python-mode：将 Vim 变成 Python IDE 的一款多合一插件。官网 Visual Studio PTVS：Visual Studio 的 Python 工具。官网 集成开发环境 流行的 Python 集成开发环境。\nPyCharm：商业化的 Python IDE ，由 JetBrains 开发。也有免费的社区版提供。官网 LiClipse：基于 Eclipse 的免费多语言 IDE 。使用 PyDev 来支持 Python 。官网 Spyder：开源 Python IDE。官网 自动聊天工具 用于开发聊天机器人的库\nErrbot：最简单和最流行的聊天机器人用来实现自动聊天工具。官网 服务 在线工具和简化开发的 API 。\n金融数据 Tushare ：一个可以提供免费股票、基金、期货、港股等金融数据的 Python 开源数据。官网 Ta-Lib ：金融数据技术分析库，可以依据原始金融数据计算各种技术指标,计算性能比较优异。官网 持续集成 参见: awesome-CIandCD.\nTravis CI：一个流行的工具，为你的开源和 私人 项目提供持续集成服务。(仅支持 GitHub)官网 CircleCI：一个持续集成工具，可以非常快速的进行并行测试。 (仅支持 GitHub)官网 Vexor CI：一个为私人 app 提供持续集成的工具，支持按分钟付费。官网 Wercker：基于 Docker 平台，用来构建和部署微服务。官网 代码质量 Codacy：自动化代码审查，更加快速的发布高质量代码。对于开源项目是免费的。官网 QuantifiedCode：一个数据驱动、自动、持续的代码审查工具。官网 资源 在这里可以找到新的 Python 库。\n网站 r/Python CoolGithubProjects Django Packages Full Stack Python Python 3 Wall of Superpowers Python Hackers Python ZEEF Trending Python repositories on GitHub today PyPI Ranking 周刊 Import Python Newsletter Pycoder\u0026rsquo;s Weekly Python Weekly Twitter @codetengu @getpy @planetpython @pycoders @pypi @pythontrending @PythonWeekly 学习指南 Scipy-lecture-notes：如何用 Python 来做学术？官网 SScientific-python-lectures：Python 科学计算的资料。官网 Mario-Level-1：用 Python 和 Pygame 写的超级马里奥第一关。官网 Python Koans：Python 的交互式学习工具。官网 Minecraft：用 python 写的 Minecraft 游戏。官网 pycrumbs：Python 资源大全。官网 python-patterns：使用 python 实现设计模式。官网 Projects：Python 项目大集合。官网 The Hitchhiker’s Guide to Python：旅行者的 Python 学习指南。官网 Code Like a Pythonista: Idiomatic Python：如何像 Python 高手(Pythonista)一样编程。官网 知名网站 《值得关注的 10 个 Python 英文博客》 ","permalink":"https://www.plbear.com/posts/python-that-is-all-about-python/","summary":"\u003ch3 id=\"环境管理\"\u003e环境管理\u003c/h3\u003e\n\u003cp\u003e管理 Python 版本和环境的工具\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ep：非常简单的交互式 python 版本管理工具。\u003ca href=\"https://github.com/qw3rtman/p\"\u003e官网\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003epyenv：简单的 Python 版本管理工具。\u003ca href=\"https://github.com/yyuu/pyenv\"\u003e官网\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVex：可以在虚拟环境中执行命令。\u003ca href=\"https://github.com/sashahart/vex\"\u003e官网\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003evirtualenv：创建独立 Python 环境的工具。\u003ca href=\"https://pypi.python.org/pypi/virtualenv\"\u003e官网\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003evirtualenvwrapper：virtualenv 的一组扩展。\u003ca href=\"https://pypi.python.org/pypi/virtualenvwrapper\"\u003e官网\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebuildout：在隔离环境初始化后使用声明性配置管理。\u003ca href=\"http://www.buildout.org/en/latest\"\u003e官网\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"包管理\"\u003e包管理\u003c/h3\u003e\n\u003cp\u003e管理包和依赖的工具。\u003c/p\u003e","title":"Python资源大全"},{"content":"Awesome PHP 一个PHP资源列表，内容包括：库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等\n目录 Awesome PHP Composer源 Composer Repositories 依赖管理 Dependency Management 其他的依赖管理 Dependency Management Extras 框架 Frameworks 其他框架 Framework Extras 框架组件 Components 微型框架 Micro Frameworks 其他微型框架 Micro Framework Extras 路由 Routers 模板 Templating 静态站点生成器 Static Site Generators 超文本传输协议 HTTP 爬虫 Scraping 中间件 Middlewares 网址 URL 电子邮件 Email 文件 Files 流 Streams 依赖注入 Dependency Injection 图像 Imagery 测试 Testing 持续集成 Continuous Integration 文档 Documentation 安全 Security 密码 Passwords 代码分析 Code Analysis 代码质量 Code Quality 静态分析 Static Analysis Architectural Architectural 调试和分析 Debugging and Profiling 构建工具 Build Tools 任务运行器 Task Runners 导航 Navigation 资源管理 Asset Management 地理位置 Geolocation 日期和时间 Date and Time 事件 Event 日志 Logging 电子商务 E-commerce PDF PDF Office Office 数据库 Database 迁移 Migrations NoSQL NoSQL 队列 Queue 搜索 Search 命令行 Command Line 身份验证和授权 Authentication and Authorization 标记 Markup 字符串 Strings 数字 Numbers 过滤和验证 Filtering and Validation API API 缓存 Caching 数据结构和存储 Data Structure and Storage 通知 Notifications 部署 Deployment 国际化和本地化 Internationalisation and Localisation 第三方API Third Party APIs 扩展 Extensions 杂项 Miscellaneous 软件 Software PHP安装 PHP Installation 开发环境 Development Environment 虚拟机 Virtual Machines 文本编辑器和IDE Text Editors and IDEs Web应用 Web Applications 基础架构 Infrastructure 资源 Resources PHP网站 PHP Websites 其他网站 Other Websites PHP书籍 PHP Books 其他书籍 Other Books PHP视频 PHP Videos PHP播客 PHP Podcasts PHP阅读 PHP Reading PHP内核阅读 PHP Internals Reading PHP杂志 PHP Magazines Composer源 Composer Repositories Composer源\nFiregento - Magento模块Composer源 Packagist - PHP包的源 Private Packagist - 一个PHP的服务，提供Composer包的存储 WordPress Packagist - 使用Composer管理你的WordPress插件 Zend Framework Packages - Zend Framework Composer源 依赖管理 Dependency Management 依赖和包管理库\nComposer Installers - 一个多框架Composer库安装器 Composer - 一个包和依赖管理器 Melody - 一个用于构建Composer脚本文件的工具 Pickle - 一个PHP扩展安装器 其他的依赖管理 Dependency Management Extras 其他的相关依赖管理\nComposed - 一个在运行时解析你项目Composer环境的库 Composer Merge Plugin - 一个用于合并多个composer.json文件的Composer插件 Prestissimo - 一个开启并行安装进程的Composer插件 Satis - 一个静态Composer存储库的生成器 tooly - 一个在项目中使用Composer管理PHAR文件的库 Toran Proxy - 一个静态Composer存储库和代理 框架 Frameworks Web开发框架\nAura Framework - 一个独立的组件框架 CakePHP - 一个快速应用程序开发框架 (CP) Laravel 5 - 另一个PHP框架 (L5) Nette - 另一个由个体组件组成的框架 Phalcon - 通过C扩展实现的框架 PPI Framework 2 - 一个互操作性框架 Symfony - 一个独立组件组成的框架 (SF) Yii2 - 另一个PHP框架 Zend Framework 2 - 另一个由独立组件组成的框架 (ZF2) Ice - 另一个通过C扩展实现的简单快速的PHP框架 其他框架 Framework Extras 其他Web开发框架\nCakePHP CRUD - CakePHP的快速应用程序（RAD）插件 Knp RAD Components - Symfony 2的快速应用程序（RAD）包 Symfony CMF - 一个创建自定义CMS的内容管理框架 框架组件 Components 来自web开发框架的独立组件\nAura - 独立组件，完全解耦，不依赖于任何其他框架 CakePHP Plugins - CakePHP插件的目录 Hoa Project - 另一个PHP组件包 League of Extraordinary Packages - 一个PHP软件开发组 Symfony Components - Symfony组件 Zend Framework 2 Components - Zend Framework 2组件 微型框架 Micro Frameworks 微型框架和路由\nBullet PHP - 用于构建REST APIs的微型框架 Lumen - 一个Laravel的微型框架 Radar - 一个PHP的Action-Domain-Responder的实现 Slim - 另一个简单的微型框架 其他微型框架 Micro Framework Extras 其他相关的微型框架和路由\nSilex Skeleton - Silex的项目架构 Silex Web Profiler - 一个Silex web的调试工具 Slim Skeleton - Slim架构 Slim Twig View - Twig集成在中 Slim PHP View - 一个Slim中的简单PHP渲染 路由 Routers 处理应用路由的库\nAura.Router - 一个全功能的路由库 Fast Route - 一个快速路由的库 Klein - 一个灵活的路由的库 Pux - 另一个快速路由的库 Route - 一个基于Fast Route的路由的库 模板 Templating 模板化和词法分析的库和工具\nAura.View - 提供TemplateView和TwoStepView，支持partials, sections和helpers Foil - 另一个原生PHP模板库 MtHaml - 一个HAML模板语言的PHP实现 Mustache - 一个Mustache模板语言的PHP实现 PHPTAL - 一个TAL模板语言的PHP实现 Plates - 一个原生PHP模板库 Smarty - 一个模板引擎 Twig - 一个全面的模板语言 Tale Jade - Jade模版语言的PHP实现 静态站点生成器 Static Site Generators 用来生成web页面的预处理内容的工具\nCouscous - 一个将Markdown转化为漂亮的网站的工具 Sculpin - 转换Markdown和Twig为静态HTML的工具 Spress - 一个能够将Markdown和Twig转化为HTML的可扩展工具 超文本传输协议 HTTP 用于HTTP的库\nBuzz - 另一个HTTP客户端 Guzzle - 一个全面的HTTP客户端 HTTPFul - 一个链式HTTP库 HTTPlug - 一个没有绑定特定实现的HTTP客户端的抽象 PHP VCR - 一个录制和重放HTTP请求的库 Requests - 一个简单的HTTP库 Retrofit - 一个能轻松创建REST API客户端的库 zend-diactoros - PSR-7 HTTP消息实现 爬虫 Scraping 用于网站爬取的库\nEmbed - 一个从web服务或网页中提取的信息的工具 Goutte - 一个简单的web爬取器 PHP Spider - 一个可配置和可扩展的PHP web爬虫 中间件 Middlewares 使用中间件构建应用程序的库\nExpressive - 基于PSR-7的Zend中间件 PSR7-Middlewares - 灵感来源于方便的中间件 Relay - 一个PHP 5.5 PSR-7的中间件调度器 Stack - 一个用于Silex/Symfony的可堆叠的中间件的库 zend-stratigility - 基于PHP PSR-7之上的中间件之上 网址 URL 解析URL的库\nPHP Domain Parser - 一个本地前缀解析库 Purl - 一个URL处理库 sabre/uri - 一个URI操作库 Uri - 另一个URL处理库 电子邮件 Email 发送和解析邮件的库\nCssToInlineStyles - 一个在邮件模板中的内联CSS库 Email Reply Parser - 一个邮件回复解析的库 Email Validator - 一个较小的电子邮件验证库 Fetch - 一个IMAP库 Mautic - 邮件营销自动化 PHPMailer - 另一个邮件解决方案 Stampie - 一个邮件服务库，类似于SendGrid,PostMark,MailGun和Mandrill. SwiftMailer - 一个邮件解决方案 文件 Files 文件处理和MIME类型检测的库\nCSV - 一个CSV数据处理库 Flysystem - 另一个文件系统抽象层 Gaufrette - 一个文件系统抽象层 Hoa Mime - 另一个MIME检测库 PHP FFmpeg - 一个用于FFmpeg视频包装的库 UnifiedArchive - 一个统一标准的压缩和解压的库 流 Streams 处理流的库\nStreamer - 一个简单的面向对象的流包装库 依赖注入 Dependency Injection 实现依赖注入设计模式的库\nAura.Di - 一个依赖注入容器 Acclimate - 一个依赖注入容器和服务定位的通用接口 Auryn - 一个递归的依赖注入容器 Container - 另一个可伸缩的依赖注入容器 Disco - 一个兼容PSR-11基于annotation的依赖注入容器 PHP-DI - 一个支持自动装配和PHP配置的依赖注入容器 Pimple - 一个小的依赖注入容器 Symfony DI - 一个依赖注入容器组件 (SF2) 图像 Imagery 处理图像的库\nColor Extractor - 一个从图像中提取颜色的库 Glide - 一个按需处理图像的库 Image Hash - 一个用于生成图像哈希感知的库 Image Optimizer - 一个优化图像的库 Imagine - 一个图像处理库 Intervention Image - 另一个图像处理库 PHP Image Workshop - 另一个图像处理库 测试 Testing 测试代码和生成测试数据的库\nAlice - 富有表现力的一代库 AspectMock - 一个PHPUnit/Codeception的模拟框架。 Atoum - 一个简单的测试库 Behat - 一个行为驱动开发（BDD）测试框架 Codeception - 一个全栈测试框架 DBUnit - 一个PHPUnit的数据库测试库 Faker - 一个伪数据生成库 HTTP Mock - 一个在单元测试模拟HTTP请求的库 Kahlan - 全栈Unit/BDD测试框架，内置stub，mock和代码覆盖率的支持 Mink - Web验收测试 Mockery - 一个用于测试的模拟对象的库 ParaTest - 一个PHPUnit的并行测试库 Peridot - 一个事件驱动开发的测试框架 Phake - 另一个用于测试的模拟对象的库 Pho - 另一个行为驱动开发测试框架 PHP-Mock - 一个基于PHP函数的模拟库 PHPSpec - 一个基于功能点设计的单元测试库 PHPT - 一个使用PHP本身的测试工具 PHPUnit - 一个单元测试框架 Prophecy - 一个可选度很高的模拟框架 VFS Stream - 一个用于测试的虚拟文件系统流的包装器 持续集成 Continuous Integration 持续集成的库和应用\nCircleCI - 一个持续集成平台 GitlabCi - 使用GitLab CI测试、构建、部署你的代码，像TravisCI Jenkins - 一个PHP支持的持续集成平台 JoliCi - 一个用PHP编写的由Docker支持的持续集成的客户端 PHPCI - 一个PHP的开源的持续集成平台 SemaphoreCI - 一个开放源码和私人项目的持续集成平台 Shippable - 一个基于开源和私人项目持续集成平台的docker Travis CI - 一个持续集成平台 Wercker - 一个持续集成平台 文档 Documentation 生成项目文档的库\nAPIGen - 另一个API文档生成器 daux.io - 一个使用Markdown文件的文档生成器 PHP Documentor 2 - 一个API文档生成器 phpDox - 一个PHP项目的文档生成器（不限于API文档） Sami - 一个API文档生成器 安全 Security 生成安全的随机数，加密数据，扫描漏洞的库\nHalite - 一个简单的使用libsodium的加密库 HTML Purifier - 一个兼容标准的HTML过滤器 IniScan - 一个扫描PHP INI文件安全的库 Optimus - 基于Knuth乘法散列方法的身份混淆工具 PHP Encryption - 一个安全的PHP加密库 PHP SSH - 一个试验的面向对象的SSH包装库 PHPSecLib - 一个纯PHP安全通信库 random_compat - PHP 5.x 支持random_bytes()和random_int() RandomLib - 一个生成随机数和字符串的库 SensioLabs Security Check - 一个为检查Composer依赖提供安全建议的web工具 TCrypto - 一个简单的键值加密存储库 VAddy - 一个持续安全的web应用测试平台 Zed - 一个集成的web应用渗透测试工具 密码 Passwords 处理和存储密码的库和工具\nGenPhrase - 一个随机生成安全密码哈希的库 Password Compat - 一个新的PHP5.5密码函数的兼容库 Password Policy - 一个PHP和JavaScript的密码策略库 Password Validator - 一个校验和升级密码哈希的库 Password-Generator - 一个生成随机密码的PHP库 PHP Password Lib - 一个生成和校验密码的库 phpass - 一个便携式的密码哈希框架 Zxcvbn PHP - 一个基于Zxcvbn JS的现实的PHP密码强度估计库 代码分析 Code Analysis 分析，解析和处理代码库的库和工具\nBetter Reflection - 基于AST的反射库，允许分析操作代码 Code Climate - 一个自动代码审查工具 PHP Parser - 一个PHP编写的PHP解析器 PHP Semantic Versioning Checker - 一个比较两个源集和确定适当的应用语义版本的命令行实用程序 PHPLOC - 一个快速测量PHP项目大小的工具 PHPQA - 一个用于运行质量保证工具的工具(phploc, phpcpd, phpcs, pdepend, phpmd, phpmetrics). Qafoo Quality Analyzer - 一个可视化指标和源代码的工具 Scrutinizer - 一个审查PHP代码的web工具 UBench - 一个简单的微型基准检测库 代码质量 Code Quality 管理代码质量、格式化和lint的库\nPHP CodeSniffer - 一个检测PHP、CSS和JS代码标准冲突的库 PHP CS Fixer - 一个编码标准库 PHP Mess Detector - 一个扫描代码缺陷，次优代码，未使用的参数等等的库 PHPCheckstyle - 一个帮助遵守特定的编码惯例的工具 PHPCPD - 一个检测复制和粘贴代码的库 静态分析 Static Analysis PHP代码静态分析的库\nExakat - 一个PHP的静态分析引擎 Mondrian - 使用图论的代码分析工具 phan - 一个基于PHP 7+和php-ast扩展的静态分析器 PHPCompatibility - 一个PHP CodeSniffer的兼容性检查器 PhpDependencyAnalysis - 一个创建可定制依赖图的工具 PHP Metrics - 一个静态测量库 PHP Migration - 一个PHP版本升级的静态分析库 PHPStan - 一个PHP静态分析工具 Pslam - 一个用于在PHP应用程序中查找错误的静态分析工具 Architectural Architectural 相关的设计模式库，组织代码编程的方法和途径\nDesign Patterns PHP - 一个使用PHP实现的设计模式存储库 Finite - 一个简单的PHP有限状态机 Functional PHP - 一个函数式编程库 Iter - 一个使用生成器提供迭代原语的库 Patchwork - 一个重新定义用户的函数库 Pipeline - 一个管道模式的实现 RulerZ - 一个强大的规则引擎和规范模式的实现 调试和分析 Debugging and Profiling 调试和分析代码的库和工具\nAPM - 一个收集SQLite/MySQL/StatsD错误信息和统计信息的监控扩展 Barbushin PHP Console - 另一个使用Google Chrome的web调试控制台 Blackfire.io - 一个低开销的代码分析器 Kint - 一个调试和分析工具 PHP Console - 一个web调试控制台 PHP Debug Bar - 一个调试工具栏 PHPBench - 一个基准测试框架 Tideways.io - Monitoring and profiling tool Tracy - A一个简单的错误检测，写日志和时间测量库 xDebug - 一个调试和分析PHP的工具 XHProf - 一个最初由Facebook开发的分析工具 Z-Ray - 一个调试和配置Zend服务器的工具 构建工具 Build Tools 项目构建和自动化工具\nBox - 一个构建PHAR文件的工具 Construct - 一个PHP项目的生成器 Phing - 一个灵感来自于Apache Ant的PHP项目构建系统 任务运行器 Task Runners 自动运行任务的库\nBldr - 一个构建在Symfony组件上的PHP任务运行器 Jobby - 一个没有修改crontab的PHP定时任务管理器 Robo - 一个面向对象配置的PHP任务运行器 Task - 一个灵感来源于Grunt和Gulp的纯PHP任务运行器 导航 Navigation 构建导航结构的工具\nKnpMenu - 一个菜单库 资源管理 Asset Management 管理，压缩和最小化web站点资源的工具\nJShrink - 一个JavaScript的最小化库 Munee - 一个资源优化库 Puli - 一个检测资源绝对路径的库 BowerPHP - Bower的一个PHP实现，一个web包管理工具 地理位置 Geolocation 地理编码地址和使用纬度经度的库\nGeoCoder - 一个地理编码库 GeoJSON - 一个GeoJSON的实现 GeoTools - 一个地理工具相关的库 PHPGeo - 一个简单的地理库 日期和时间 Date and Time 处理日期和时间的库\nCalendR - 一个日历管理库 Carbon - 一个简单的日期时间API扩展 Chronos - 一个支持可变和不可变日期时间的DateTime API扩展 Moment.php - 灵感来源于Moment.js的PHP DateTime处理库，支持国际化 Yasumi - 一个帮助你计算节日日期和名称的库 事件 Event 时间驱动或实现非阻塞事件循环的库\nAmp - 一个事件驱动的不阻塞的I/O库 Broadway - 一个事件源和CQRS(命令查询责任分离)库 Cake Event - 一个事件调度的库 (CP) Elephant.io - 另一个web socket库 Evenement - 一个事件调度的库 Event - 一个专注于域名事件的库 Hoa EventSource - 一个事件源库 Hoa WebSocket - 另一个web socket库 Prooph Event Store - 一个持久化事件消息的事件源组件 Ratchet - 一个web socket库 React - 一个事件驱动的非阻塞I/O库. RxPHP - 一个reactive扩展库 Workerman - 一个事件驱动的不阻塞的I/O库 日志 Logging 生成和处理日志文件的库\nMonolog - 一个全面的日志工具 电子商务 E-commerce 处理支付和构建在线电子商务商店的库和应用\nMoney - 一个Fowler金钱模式的PHP实现 OmniPay - 一个框架混合了多网关支付处理的库 Payum - 一个支付抽象库 Shopware - 一个可高度定制的电子商务软件 Swap - 一个汇率库 Sylius - 一个开源的电子商务解决方案 PDF PDF 处理PDF文件的库和软件\nDompdf - 一个将HTML转换为PDF的工具 PHPPdf - 一个将XML文件转换为PDF和图片的库 Snappy - 一个PDF和图像生成器库 WKHTMLToPDF - 一个将HTML转换为PDF的工具 Office Office Libraries for working with office suite documents.\nPHPPowerPoint - 一个处理PPT文档的库 PHPWord - 一个处理Word文档的库 PHPSpreadsheet - 一个纯PHP的读写电子表格的库 (successor of PHPExcel) 数据库 Database 使用对象关系映射（ORM）或数据映射技术的数据库交互的库\nAtlas.Orm - 一个PHP持久化模型数据映射的实现 Aura.Sql - 一个使用PDO的ORM Aura.SqlQuery - 支持MySQL, PostgreSQL, SQLite和Microsoft SQL Server的ORM Baum - 一个Eloquent的嵌套集实现 Cake ORM - 对象关系映射工具，利用DataMapper模式实现 (CP) Doctrine Extensions - 一个Doctrine行为扩展的集合 Doctrine - 一个全面的DBAL和ORM Eloquent - 一个简单的ORM(L5) LazyRecord - 一个简单、可扩展、高性能的ORM Pomm - 一个PostgreSQL对象模型管理器 Propel - 一个快速的ORM，迁移库和查询构架器 ProxyManager - 一个为数据映射生成代理对象的工具集 RedBean - 一个轻量级，低配置的ORM Spot2 - 一个MySQL的ORM映射器 迁移 Migrations 帮助管理数据库模式和迁移的库\nDoctrine Migrations - 一个Doctrine的迁移库 Migrations - 一个迁移管理库 Phinx - 另一个数据库迁移的管理库 PHPMig - 另一个迁移管理库 Ruckusing - 基于PHP下ActiveRecord的数据库迁移，支持MySQL, Postgres, SQLite NoSQL NoSQL 处理NoSQL后端的库\nPHPMongo - 一个MongoDB ORM. Predis - 一个功能完整的Redis库 队列 Queue 处理事件和任务队列的库\nBernard - 一个多后端抽象库 BunnyPHP - 一个高性能的纯PHP AMQP(RabbitMQ)同步和异步(ReactPHP)库 Pheanstalk - 一个Beanstalkd客户端库 PHP AMQP - 一个纯PHP AMQP库 Tarantool Queue - PHP绑定Tarantool队列 Thumper - 一个RabbitMQ模式库 搜索 Search 在数据上索引和执行查询的库和软件\nElastica - ElasticSearch的客户端库 ElasticSearch PHP - ElasticSearch的官方客户端库 Solarium - Solr的客户端库 Sphinx Search - Sphinx搜索库，提供SphinxQL索引和搜索的功能 SphinxQL query builder - Sphinx搜索引擎的的查询库 命令行 Command Line 关于命令行工具的库\nAura.Cli - 一个命令行库 Boris - 一个微型PHP REPL Cilex - 一个构建命令行工具的微型框架 CLI Menu - 一个构建CLI菜单的库 CLIFramework - 一个支持完全zsh／bash、子命令和选项约束的命令行框架，这也归功于phpbrew CLImate - 一个输出带颜色的和特殊格式的命令行库 Commando - 另一个简单的命令行选择解析器 Cron Expression - 一个计算cron运行日期的库 GetOpt - 一个命令行选择解析器 GetOptionKit - 另一个命令行选择解析器 Hoa Console - 另一个命令行库 PsySH - 另一个PHP REPL ShellWrap - -一个简单的命令行包装库 身份验证和授权 Authentication and Authorization 实现身份验证和授权的库\nAura.Auth - 一个身份认证的库 SocialConnect Auth - 一个开源的social sign (OAuth1\\OAuth2\\OpenID\\OpenIDConnect) Json Web Token - 使用JSON Tokens进行身份验证和信息传输 OAuth 1.0 Client - 一个OAuth 1.0客户端的库 OAuth 2.0 Client - 一个OAuth 2.0客户端的库 OAuth2 Server - 另一个OAuth2服务器实现 OAuth2 Server - 另一个OAuth2服务器实现 Opauth - 一个多渠道的身份验证框架 PHP oAuthLib - 另一个OAuth库 Sentinel Social - 一个社交网络身份验证库 Sentinel - 一个混合的身份验证和授权的框架库 TwitterOAuth - 一个Twitter OAuth库 标记 Markup 处理标记的库\nCebe Markdown - 一个快速的可扩展的Markdown解析器 CommonMark PHP - 一个对CommonMark spec全支持的Markdown解析器 Decoda - 一个轻量级标记解析库 Emoji - 一个把Unicode字符和名称转换为表情符号图片的库 HTML to Markdown - 将HTML转化为Markdown HTML5 PHP - 一个HTML5解析和序列化库 Parsedown - 另一个Markdown解析器 PHP Markdown - 一个Markdown解析器 字符串 Strings 解析和处理字符串的库\nAgent - 一个基于Mobiledetect的桌面／手机端user agent解析库 ANSI to HTML5 - 一个将ANSI转化为HTML5的库 Color Jizz - 处理和转换颜色的库 Device Detector - 另一个解析user agent字符串的库 Hoa String - 另一个UTF-8字符串库 Jieba-PHP - Python的jieba的PHP端口，自然语言处理的中文文本分词 Mobile-Detect - 一个用于检测移动设备的轻量级PHP类(包括平板电脑) Patchwork UTF-8 - 一个处理UTF-8字符串的便携库 Slugify - 转换字符串到slug的库 SQL Formatter - 一个格式化SQL语句的库 Stringy - 一个多字节支持的字符串处理库 UA Parser - 一个解析user agent字符串的库 URLify - 一个Django中URLify.js的PHP版本 UUID - 生成UUIDs的库 数字 Numbers 处理数字的库\nByteUnits - 一个在二进制和度量系统中解析,格式化和转换字节单元的库 LibPhoneNumber for PHP - 一个Google电话号码处理的PHP实现库 PHP Conversion - 另一个用于度量单位间转换的库 PHP Units of Measure - 一个计量单位转换的库 过滤和验证 Filtering and Validation 过滤和验证数据的库\nAura.Filter - 一个验证库 Cake Validation - 另一个验证库 (CP) Filterus - 一个简单的PHP过滤库 ISO-codes - 一个验证各种ISO和ZIP编码的库(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN) MetaYaml - 一个支持YAML,JSON和XML的模式验证库 Respect Validation - 一个简单的验证库 Upload - 一个处理文件上传和验证的库 Valitron - 另一个验证库 Volan - 另一个简单的验证库 API API 开发REST-ful API的库和web工具\nAPI Platform - 暴露出REST API的项目，包含JSON-LD, Hydra格式 Apigility - 一个使用Zend Framework 2构建的API构建器 Drest - 一个将Doctrine实体暴露为REST资源节点的库 HAL - 一个超文本应用语言(HAL)构建库 Hateoas - 一个HOATEOAS REST web服务库 Negotiation - 一个内容协商库 Restler - 一个将PHP方法暴露为RESTful web API的轻量级框架 wsdl2phpgenerator - 一个从SOAP WSDL文件生成PHP类的工具 缓存 Caching 缓存数据的库\nAlternative PHP Cache (APC) - 打开PHP操作码缓存 APIx Cache - 一个轻量级的PSR-6缓存 CacheTool - 一个使用命令行清除apc/opcode缓存的工具 Cake Cache - 一个缓存库 (CP) Doctrine Cache - 一个缓存库 Metaphore - 一个缓存失效防范的库，使用信号标记阻止dogpile影响 Stash - 另一个缓存库 Zend Cache - 另一个缓存库 (ZF2) 数据结构和存储 Data Structure and Storage 实现数据结构和存储技术的库\nCake Collection - 一个简单的集合库 (CP) Collections - 一个PHP的集合抽象库 Fractal - 一个转换复杂数据结构到JSON输出的库 Ginq - 另一个基于.NET实现的PHP的LINQ库 JsonMapper - 一个将内嵌JSON结构映射为PHP类的库 Knapsack - 一个集合的库，灵感来自Clojure的相关库 PINQ - 一个基于.NET实现的PHP的LINQ(Language Integrated Query)库 Porter - 数据导入的抽象框架 Serializer - 一个序列化和反序列化数据的库 YaLinqo - 另一个PHP的LINQ库 Zend Serializer - 另一个序列化和反序列化数据的库 (ZF2) 通知 Notifications 处理通知软件的库\nJoliNotif - 一个跨平台的桌面通知库(支持Growl, notify-send, toaster等) Notification Pusher - 一个设备推送通知的独立库 Notificato - 一个处理推送通知的库 Notificator - 一个轻量级的通知库 Php-pushwoosh - 一个使用Pushwoosh REST Web服务轻松推送通知的PHP库 部署 Deployment 项目部署库\nDeployer - 一个部署工具 Envoy - 一个用PHP运行SSH任务的工具 Rocketeer - PHP世界里的一个快速简单的部署器 国际化和本地化 Internationalisation and Localisation 国际化(I18n)和本地化(L10n)的库\nAura.Intl - 一个国际化的库 Cake I18n - 消息国际化和日期和数字的本地化 (CP) 第三方API Third Party APIs 访问第三方API的库\nAmazon Web Service SDK - PHP AWS SDK官方库 Campaign Monitor - Campaign Monitor官方PHP库 Dropbox SDK - Dropbox SDK官方PHP库 Github - 一个Github API交互库 Stripe - Stripe官方PHP库 Twilio - Twilio官方PHP REST API 扩展 Extensions 帮助构建PHP扩展的库\nPHP CPP - 一个开发PHP扩展的C++库 Zephir - 用于开发PHP扩展，且介于PHP和C++之间的编译语言 杂项 Miscellaneous 创建一个开发环境的软件\nAnnotations - 一个注释库(Doctrine的一部分) BotMan - 一个构建跨平台聊天机器人的PHP框架库 Cake Utility - 工具类如Inflector，字符串，哈希，安全和XML (CP) Chief - 一个命令总线库 ClassPreloader - 一个优化自动加载的库 Country List - 所有带有名称和ISO 3166-1编码的国家列表 Embera - 一个Oembed消费库 Essence - 一个用于提取网络媒体的库 Graphviz - 一个图形库 Hprose-PHP - 一个很牛的RPC库，现在支持25+种语言 JSON Lint - 一个JSON lint工具 JSONPCallbackValidator - 验证JSONP回调的库 Metrics - 一个简单的度量API库 noCAPTCHA - 一个帮助使用谷歌noCAPTCHA (reCAPTCHA)的工具 Nmap - 一个Nmap PHP包装器 Pagerfanta - 一个分页库 PHP PassBook - 一个iOS PassBook PHP库 PHP-ML - 一个机器学习的PHP库 PHPCR - 一个Java内容存储库(JCR)的PHP实现 PHPStack - 一个PHP编写的TCP/IP栈概念 print_o - 一个对象图的可视化器 Procrastinator - 一个运行耗时任务的库 Prooph Service Bus - 轻量级的消息总线，支持CQRS和微服务 RMT - 一个编写版本和发布软件的库 sabre/vobject - 一个解析VCard和iCalendar对象的库 Slimdump - 一个简单的MySQL dumper工具 Spork - 一个处理forking的库 SuperClosure - 一个允许闭包序列化的库 Symfony VarDumper - 一个dumper库(SF2) Underscore - 一个Undersccore JS库的PHP实现 Whoops - 一个不错的错误处理库 PHP安装 PHP Installation 在你的电脑上帮助安装和管理PHP的工具\nHomeBrew PHP - 一个HomeBrew的PHP通道 HomeBrew - 一个OSX包管理器 PHP Brew - 一个PHP版本管理和安装器 PHP Build - 另一个PHP版本安装器 PHP OSX - 一个OSX下的PHP安装器 VirtPHP - 一个创建和管理独立PHP环境的工具 开发环境 Development Environment 创建沙盒开发环境的软件和工具\nAnsible - 一个非常简单的编制框架 Phansible - 一个用Ansible构建PHP开发虚拟机的web工具 Protobox - 另一个构建PHP开发虚拟机的web工具 PuPHPet - 一个构建PHP开发虚拟机的web工具 Puppet - 一个服务器自动化框架和应用 Vagrant - 一个便携的开发环境工具 Docker - 一个容器化的平台 虚拟机 Virtual Machines 相关的PHP虚拟机\nHack - 一个PHP进行无缝操作的HHVM编程语言 HHVM - Facebook出品的PHP虚拟机，Runtime和JIT 文本编辑器和IDE Text Editors and IDEs 支持PHP的文本编辑器和集成开发环境(IDE)\nAtom - 一个文本编辑器 Atom IDE - 一个扩展自Atom的IDE Eclipse for PHP Developers - 一个基于Eclipse平台的PHP IDE Netbeans - 一个支持PHP和HTML5的IDE PhpStorm - 一个商业PHP IDE VS Code - 一个开源的代码编辑器 Web应用 Web Applications 基于Web的应用和工具\n3V4L - 一个在线的PHP和HHVM shell DBV - 一个数据库版本控制应用 PHP Queue - A一个管理后端队列的应用 MailCatcher - 一个抓取和查看邮件的web工具 Cachet - 开源状态页面系统 phpRedisAdmin - 一个用于管理Redis数据库的简单web界面 phpMyAdmin - 一个MySQL/MariaDB的web界面 Adminer - 一个数据库管理工具 Grav - 一个现代的flat－file的CMS Lychee - 一个易于使用和好看的照片管理系统 基础架构 Infrastructure 提供PHP应用和服务的基础架构\nappserver.io - 一个用PHP写的多线程的PHP应用服务器 php-pm - 一个PHP应用的进程管理器、修改器和负载平衡器 PHP网站 PHP Websites PHP相关的有用的网站\nNomad PHP - 一个在线PHP学习资源 PHP Best Practices - 一个PHP最佳实践指南 PHP FIG - PHP框架交互组 PHP Mentoring - 点对点PHP导师组织 PHP Package Development Standards - PHP包开发标准 PHP School - PHP的开源学习 PHP Security - 一个PHP安全指南 PHP The Right Way - 一个PHP最佳实践的快速指引手册 PHP UG - 一个帮助用户定位最近的PHP用户组(UG)的网站 PHP Versions - 哪些版本的PHP可以用在哪几种流行的Web主机上的列表 PHP Weekly - 一个PHP新闻周刊 PHPTrends - 一个快速增长的PHP类库的概述 Securing PHP - 一个关于PHP安全和库的建议的简报 Seven PHP - 一个PHP社区成员采访的网站 PHP Annotated Monthly - 一个PHP新闻的月度摘要 其他网站 Other Websites web开发相关的有用网站\nAtlassian Git Tutorials - 一个Git教程系列 Hg Init - 一个Mercurial教程系列 Learning Linux - 一个学习linux的个网站 Semantic Versioning - 一个解析语义版本的网站 Servers for Hackers - 一个关于服务器管理的新闻通讯 The Open Web Application Security Project (OWASP) - 一个开放软件安全社区 WebSec IO - 一个web安全社区资源 PHP书籍 PHP Books PHP相关的非常好的书籍\nFunctional Programming in PHP - 这本书将告诉你如何利用PHP5.3+的新功能的认识函数式编程的原则 Grumpy PHPUnit - 一本Chris Hartjes关于使用PHPUnit进行单元测试的书 Mastering Object-Orientated PHP - 一本Brandon Savage关于PHP面向对象的书 Modern PHP New Features and Good Practices - 一本Josh Lockhart关于新的PHP功能和最佳做法的书 Modernizing Legacy Applications in PHP - 一本Paul M.Jones关于遗留PHP应用进行现代化的书 PHP 7 Upgrade Guide - 一本Colin O\u0026rsquo;Dell的包含所有PHP 7功能和改变的书 PHP Pandas - 一本Dayle Rees关于如何学习写PHP的书 Scaling PHP Applications - 一本Steve Corona关于扩展PHP应用程序的电子书 Securing PHP: Core Concepts - 一本Chris Cornutt关于PHP常见安全条款和实践的书 Signaling PHP - 一本Cal Evans关于在CLI脚本捕获PCNTL信号的书 The Grumpy Programmer\u0026rsquo;s Guide to Building Testable PHP Applications - 一本Chris Hartjes关于构建PHP应用程序测试的书 XML Parsing with PHP - 这本书涵盖的解析和验证XML文档，利用XPath表达式，使用命名空间，以及如何创建和修改XML文件的编程 Domain-Driven Design in PHP - 展示PHP DDD风格的实例 其他书籍 Other Books 与一般计算和web开发相关的书\nElasticsearch: The Definitive Guide - Clinton Cormley和Zachary Tong编写的与Elasticsearch工作的一本指南 Eloquent JavaScript - Marijin Haverbeke关于JavaScript编程的一本书 Head First Design Patterns - 解说软件设计模式的一本书 Pro Git - Scott Chacon和Ben Straub关于Git的一本书 The Linux Command Line - William Shotts关于Linux命令行的一本书 The Tangled Web — Securing Web Applications - Michal Zalewski关于web应用安全的一本书 Understanding Computation - Tom Stuart关于计算理论的一本书 Vagrant Cookbook - Erika Heidi关于创建 Vagrant环境的一本书 PHP视频 PHP Videos PHP相关的非常不错的视频\nNomad PHP Lightning Talks - PHP社区成员10到15分钟的快速会谈 PHP UK Conference - 一个PHP英国会议的视频集合 Programming with Anthony - Anthony Ferrara的视频系列 Taking PHP Seriously - 来自Facebook Keith Adams 讲述PHP优势 PHP播客 PHP Podcasts 专注于PHP话题的博客\nPHP Town Hall - 一个随意的Ben Edmunds和Phil Sturgeon的PHP播客 PHP Roundtable - PHP Roundtable是一个讨论PHP开发者关心话题的临时聚会 PHP阅读 PHP Reading PHP相关的阅读资料\nComposer Primer - Composer初级使用 Composer Stability Flags - 一篇关于Composer稳定性标志的文章 Composer Versioning - 一篇关于Composer版本的文章 Create Your Own PHP Framework - 一部Fabien Potencier的关于如何创建你自己的PHP框架的系列文章 Don\u0026rsquo;t Worry About BREACH - 一篇关于BREACH攻击和CSRF令牌的文章 On PHP 5.3, Lambda Functions and Closures - 一篇关于lambda函数和闭包的文章 PHP Is Much Better Than You Think - 一篇关于PHP语言和生态圈的文章 PHP Package Checklist - 一个成功PHP包开发的清单 PHP Sucks! But I Like It! - 一篇关于PHP利弊的文章 Preventing CSRF Attacks - 一篇阻止CSRF攻击的文章 Seven Ways to Screw Up BCrypt - 一篇关于纠正BCrypt实现的文章 The 2018 Guide to Building Secure PHP Software - 一份建立安全PHP软件的指南 Use Env - 一篇关于使用unix环境帮助的文章 PHP内核阅读 PHP Internals Reading 阅读PHP内核或性能相关的资料\nDisproving the Single Quotes Myth - 一篇关于单，双引号字符串性能的文章 How Big Are PHP Arrays (And Values) Really? - 一篇关于数组原理的文章 How Foreach Works - StackOverflow关于foreach回答的详情 How Long is a Piece of String - 一篇关于字符串原理的文章 PHP Evaluation Order - 一篇关于PHP评估顺序的文章 PHP Internals Book - 一本由三名核心开发编写的关于PHP内核的在线书 PHP RFCs - PHP RFCs主页(请求注解) Print vs Echo, Which One is Faster? - 一篇关于打印和echo性能的文章 The PHP Ternary Operator. Fast or Not? - 一篇关于三元操作性能的文章 Understanding OpCodes - 一篇关于opcodes的文章 When Does Foreach Copy? - 一篇关于foreach原理的文章 Why Objects (Usually) Use Less Memory Than Arrays - 一篇关于对象和数组原理的文章 You\u0026rsquo;re Being Lied To - 一篇关于内核ZVALs的文章 PHP杂志 PHP Magazines 有趣的PHP相关的杂志\nphp[architect] - 一个致力于PHP的月更的杂志 ","permalink":"https://www.plbear.com/posts/all-about-php/","summary":"\u003ch1 id=\"awesome-php\"\u003eAwesome PHP\u003c/h1\u003e\n\u003cp\u003e一个PHP资源列表，内容包括：库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等\u003c/p\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#awesome-php\"\u003eAwesome PHP\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#composer%E6%BA%90-composer-repositories\"\u003eComposer源 Composer Repositories\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86-dependency-management\"\u003e依赖管理 Dependency Management\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%85%B6%E4%BB%96%E7%9A%84%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86-dependency-management-extras\"\u003e其他的依赖管理 Dependency Management Extras\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%A1%86%E6%9E%B6-frameworks\"\u003e框架 Frameworks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%85%B6%E4%BB%96%E6%A1%86%E6%9E%B6-framework-extras\"\u003e其他框架 Framework Extras\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%A1%86%E6%9E%B6%E7%BB%84%E4%BB%B6-components\"\u003e框架组件 Components\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%BE%AE%E5%9E%8B%E6%A1%86%E6%9E%B6-micro-frameworks\"\u003e微型框架 Micro Frameworks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%85%B6%E4%BB%96%E5%BE%AE%E5%9E%8B%E6%A1%86%E6%9E%B6-micro-framework-extras\"\u003e其他微型框架 Micro Framework Extras\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%B7%AF%E7%94%B1-routers\"\u003e路由 Routers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%A8%A1%E6%9D%BF-templating\"\u003e模板 Templating\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%9D%99%E6%80%81%E7%AB%99%E7%82%B9%E7%94%9F%E6%88%90%E5%99%A8-static-site-generators\"\u003e静态站点生成器 Static Site Generators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE-http\"\u003e超文本传输协议 HTTP\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%88%AC%E8%99%AB-scraping\"\u003e爬虫 Scraping\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%B8%AD%E9%97%B4%E4%BB%B6-middlewares\"\u003e中间件 Middlewares\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%BD%91%E5%9D%80-url\"\u003e网址 URL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6-email\"\u003e电子邮件 Email\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%96%87%E4%BB%B6-files\"\u003e文件 Files\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%B5%81-streams\"\u003e流 Streams\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5-dependency-injection\"\u003e依赖注入 Dependency Injection\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%9B%BE%E5%83%8F-imagery\"\u003e图像 Imagery\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%B5%8B%E8%AF%95-testing\"\u003e测试 Testing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-continuous-integration\"\u003e持续集成 Continuous Integration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%96%87%E6%A1%A3-documentation\"\u003e文档 Documentation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%AE%89%E5%85%A8-security\"\u003e安全 Security\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%AF%86%E7%A0%81-passwords\"\u003e密码 Passwords\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90-code-analysis\"\u003e代码分析 Code Analysis\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F-code-quality\"\u003e代码质量 Code Quality\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%9D%99%E6%80%81%E5%88%86%E6%9E%90-static-analysis\"\u003e静态分析 Static Analysis\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#architectural-architectural\"\u003eArchitectural Architectural\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%B0%83%E8%AF%95%E5%92%8C%E5%88%86%E6%9E%90-debugging-and-profiling\"\u003e调试和分析 Debugging and Profiling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7-build-tools\"\u003e构建工具 Build Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BB%BB%E5%8A%A1%E8%BF%90%E8%A1%8C%E5%99%A8-task-runners\"\u003e任务运行器 Task Runners\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%AF%BC%E8%88%AA-navigation\"\u003e导航 Navigation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86-asset-management\"\u003e资源管理 Asset Management\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%9C%B0%E7%90%86%E4%BD%8D%E7%BD%AE-geolocation\"\u003e地理位置 Geolocation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%97%A5%E6%9C%9F%E5%92%8C%E6%97%B6%E9%97%B4-date-and-time\"\u003e日期和时间 Date and Time\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BA%8B%E4%BB%B6-event\"\u003e事件 Event\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%97%A5%E5%BF%97-logging\"\u003e日志 Logging\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1-e-commerce\"\u003e电子商务 E-commerce\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#pdf-pdf\"\u003ePDF PDF\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#office-office\"\u003eOffice Office\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%95%B0%E6%8D%AE%E5%BA%93-database\"\u003e数据库 Database\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%BF%81%E7%A7%BB-migrations\"\u003e迁移 Migrations\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nosql-nosql\"\u003eNoSQL NoSQL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%98%9F%E5%88%97-queue\"\u003e队列 Queue\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%90%9C%E7%B4%A2-search\"\u003e搜索 Search\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%91%BD%E4%BB%A4%E8%A1%8C-command-line\"\u003e命令行 Command Line\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%92%8C%E6%8E%88%E6%9D%83-authentication-and-authorization\"\u003e身份验证和授权 Authentication and Authorization\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%A0%87%E8%AE%B0-markup\"\u003e标记 Markup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%AD%97%E7%AC%A6%E4%B8%B2-strings\"\u003e字符串 Strings\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%95%B0%E5%AD%97-numbers\"\u003e数字 Numbers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%BF%87%E6%BB%A4%E5%92%8C%E9%AA%8C%E8%AF%81-filtering-and-validation\"\u003e过滤和验证 Filtering and Validation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#api-api\"\u003eAPI API\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%BC%93%E5%AD%98-caching\"\u003e缓存 Caching\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E5%AD%98%E5%82%A8-data-structure-and-storage\"\u003e数据结构和存储 Data Structure and Storage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%80%9A%E7%9F%A5-notifications\"\u003e通知 Notifications\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%83%A8%E7%BD%B2-deployment\"\u003e部署 Deployment\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%9B%BD%E9%99%85%E5%8C%96%E5%92%8C%E6%9C%AC%E5%9C%B0%E5%8C%96-internationalisation-and-localisation\"\u003e国际化和本地化 Internationalisation and Localisation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%AC%AC%E4%B8%89%E6%96%B9api-third-party-apis\"\u003e第三方API Third Party APIs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%89%A9%E5%B1%95-extensions\"\u003e扩展 Extensions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%9D%82%E9%A1%B9-miscellaneous\"\u003e杂项 Miscellaneous\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%BD%AF%E4%BB%B6-software\"\u003e软件 Software\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#PHP%E5%AE%89%E8%A3%85-php-installation\"\u003ePHP安装 PHP Installation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83-development-environment\"\u003e开发环境 Development Environment\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%99%9A%E6%8B%9F%E6%9C%BA-virtual-machines\"\u003e虚拟机 Virtual Machines\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8%E5%92%8Cide-text-editors-and-ides\"\u003e文本编辑器和IDE Text Editors and IDEs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#web%E5%BA%94%E7%94%A8-web-applications\"\u003eWeb应用 Web Applications\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%9F%BA%E7%A1%80%E6%9E%B6%E6%9E%84-infrastructure\"\u003e基础架构 Infrastructure\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E8%B5%84%E6%BA%90-resources\"\u003e资源 Resources\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#php%E7%BD%91%E7%AB%99-php-websites\"\u003ePHP网站 PHP Websites\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%85%B6%E4%BB%96%E7%BD%91%E7%AB%99-other-websites\"\u003e其他网站 Other Websites\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#php%E4%B9%A6%E7%B1%8D-php-books\"\u003ePHP书籍 PHP Books\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%85%B6%E4%BB%96%E4%B9%A6%E7%B1%8D-other-books\"\u003e其他书籍 Other Books\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#php%E8%A7%86%E9%A2%91-php-videos\"\u003ePHP视频 PHP Videos\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#php%E6%92%AD%E5%AE%A2-php-podcasts\"\u003ePHP播客 PHP Podcasts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#php%E9%98%85%E8%AF%BB-php-reading\"\u003ePHP阅读 PHP Reading\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#php%E5%86%85%E6%A0%B8%E9%98%85%E8%AF%BB-php-internals-reading\"\u003ePHP内核阅读 PHP Internals Reading\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#php%E6%9D%82%E5%BF%97-php-magazines\"\u003ePHP杂志 PHP Magazines\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"composer源-composer-repositories\"\u003eComposer源 Composer Repositories\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eComposer源\u003c/em\u003e\u003c/p\u003e","title":"PHP资源列表"},{"content":"YAML 全名 YAML Ain’t Markup Language，主要设计目标是对人类可读性高。 YAML 1.2 是 JSON 的超集，也就是说合法的 JSON 扔给 YAML 1.2 解析器是可以被完美解析的。YAML 集 JSON 和 XML 等各种标记语言之长，进行了扩展强化，功能全面也很易读，很多的系统采用它作为配置文件的格式。\n示例 f r u - - - i t a a p s p p e : p c p c a l o l o r e l e l 1 o 2 o : r : r : : r g e r d e e n ","permalink":"https://www.plbear.com/posts/yaml/","summary":"\u003cp\u003e\u003ca href=\"http://yaml.org/\"\u003eYAML\u003c/a\u003e\n全名 YAML Ain’t Markup Language，主要设计目标是对人类可读性高。 \u003ca href=\"http://yaml.org/spec/1.2/spec.html\"\u003eYAML 1.2\u003c/a\u003e\n是 JSON 的超集，也就是说合法的 JSON 扔给 YAML 1.2 解析器是可以被完美解析的。YAML 集 JSON 和 XML 等各种标记语言之长，进行了扩展强化，功能全面也很易读，很多的系统采用它作为配置文件的格式。\u003c/p\u003e","title":"YAML基础语法手册以及和JSON的对照"},{"content":"下面演示MySQL Range类型分区的操作，其他类型的分区还有Hash、Key、List等等。\n分区优点：\n分区可以分在多个磁盘，存储更大一点。\n根据查找条件，也就是where后面的条件，查找只查找相应的分区不用全部查找了。\n进行大数据搜索时可以进行并行处理。\n跨多个磁盘来分散数据查询，来获得更大的查询吞吐量.\n1. 创建演示表 tr，设置range 类型分区 CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE)\nPARTITION BY RANGE( YEAR(purchased) ) (\nPARTITION p0 VALUES LESS THAN (1990),\nPARTITION p1 VALUES LESS THAN (1995),\nPARTITION p2 VALUES LESS THAN (2000),\nPARTITION p3 VALUES LESS THAN (2005),\nPARTITION p4 VALUES LESS THAN (2010),\nPARTITION p5 VALUES LESS THAN (2015)\n);\n2. 插入演示数据 INSERT INTO tr VALUES\n(1, \u0026lsquo;desk organiser\u0026rsquo;, \u0026lsquo;2003-10-15\u0026rsquo;),\n(2, \u0026lsquo;alarm clock\u0026rsquo;, \u0026lsquo;1997-11-05\u0026rsquo;),\n(3, \u0026lsquo;chair\u0026rsquo;, \u0026lsquo;2009-03-10\u0026rsquo;),\n(4, \u0026lsquo;bookcase\u0026rsquo;, \u0026lsquo;1989-01-10\u0026rsquo;),\n(5, \u0026rsquo;exercise bike\u0026rsquo;, \u0026lsquo;2014-05-09\u0026rsquo;),\n(6, \u0026lsquo;sofa\u0026rsquo;, \u0026lsquo;1987-06-05\u0026rsquo;),\n(7, \u0026rsquo;espresso maker\u0026rsquo;, \u0026lsquo;2011-11-22\u0026rsquo;),\n(8, \u0026lsquo;aquarium\u0026rsquo;, \u0026lsquo;1992-08-04\u0026rsquo;),\n(9, \u0026lsquo;study desk\u0026rsquo;, \u0026lsquo;2006-09-16\u0026rsquo;),\n(10, \u0026rsquo;lava lamp\u0026rsquo;, \u0026lsquo;1998-12-25\u0026rsquo;);\n3. 查询分区 p2中的数据\nSELECT * FROM tr\nWHERE purchased BETWEEN \u0026lsquo;1995-01-01\u0026rsquo; AND \u0026lsquo;1999-12-31\u0026rsquo;;\n也可以使用分区参数partition 获取相同的信息。\nSELECT * FROM tr PARTITION (p2); 4. 删除分区 下面指定删除分区p2，执行如下命令。\nALTER TABLE tr DROP PARTITION p2;\n需要注意的是：当删除一个分区时，分区中的数据也会被删除。\n再次执行前面的SELECT 脚本，没有任何数据返回。\nSELECT * FROM tr\nWHERE purchased BETWEEN \u0026lsquo;1995-01-01\u0026rsquo; AND \u0026lsquo;1999-12-31\u0026rsquo;;\n返回结果：0 row(s) returned\nSELECT * FROM tr PARTITION (p2);\n出现异常：Error Code: 1735. Unknown partition \u0026lsquo;p2\u0026rsquo; in table \u0026rsquo;tr\u0026rsquo;\n5. 查看表tr的分区定义 SHOW CREATE TABLE tr;\npartition p2 已经不存在了。\n现在插入 purchased 列数据在1995-01-01 到 2004-12-31 之间的数据，新的行数据将存储在 partition p3中。\nINSERT INTO tr VALUES (11, \u0026lsquo;pencil holder\u0026rsquo;, \u0026lsquo;1995-07-12\u0026rsquo;);\nSELECT * FROM tr WHERE purchased BETWEEN \u0026lsquo;1995-01-01\u0026rsquo; AND \u0026lsquo;2004-12-31\u0026rsquo;;\nselect * from tr partition(p3);\n6. RANGE 重建分区 将原来的 p0,p1 分区合并起来，放到新的 p0 分区中。\n在分区合并之前，先检查一下 p0和p1 分区中的数据。\nselect * from tr partition(p0,p1);\n输出结果：3条记录\n下面进行分区合并操作。\nALTER TABLE tr REORGANIZE PARTITION p0, p1 INTO (PARTITION p0 VALUES LESS THAN (1995));\n合并操作完成之后，分区 p1 已经不存在了，新的 p0 分区数据记录如下，3条记录。\nselect * from tr partition(p0);\n查看更新后的分区定义，分区p0的范围进行了重新定义。\nSHOW CREATE TABLE tr;\n打开MySQL的数据目录，查看分区的表空间文件如下。\n7. 子分区 子分区是分区表中每个分区的再次分割，子分区既可以使用HASH分区，也可以使用KEY分区。这也被称为复合分区（composite partitioning）。\n子分区的几点注意事项：\n如果一个分区中创建了子分区，其他分区也要有子分区。 如果创建了子分区，每个分区中的子分区数必有相同。 同一分区内的子分区，名字不相同，不同分区内的子分区名字可以相同。 由于分区是RANGE和LIST分区，所以删除分区也是同RANGE和LIST分区一样，这里只能对每个分区进行删除，不能针对每个子分区进行删除操作，删除分区后子分区连同数据一并被删除。 子分区由两种创建方法：\n一种是不定义每个子分区的名字和路径由分区决定；\n二是定义每个子分区的分区名和各自的路径；\n（1）不定义每个子分区\n表名称：tb_sub\nCREATE TABLE tb_sub (id INT, purchased DATE)\nPARTITION BY RANGE( YEAR(purchased) )\nSUBPARTITION BY HASH( TO_DAYS(purchased) )\nSUBPARTITIONS 2 (\nPARTITION p0 VALUES LESS THAN (1990),\nPARTITION p1 VALUES LESS THAN (2000),\nPARTITION p2 VALUES LESS THAN MAXVALUE\n);\n分区表空间文件如下。\n查看系统中表tb_sub 信息：\nSELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION\nFROM information_schema.PARTITIONS\nWHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME=\u0026lsquo;tb_sub\u0026rsquo;;\n（2）定义每个子分区\n定义子分区可以为每个子分区定义具体的分区名和分区路径。\nCREATE TABLE tb_sub_ev (id INT, purchased DATE)\nPARTITION BY RANGE( YEAR(purchased) )\nSUBPARTITION BY HASH( TO_DAYS(purchased) ) (\nPARTITION p0 VALUES LESS THAN (1990) (\nSUBPARTITION s0,\nSUBPARTITION s1\n),\nPARTITION p1 VALUES LESS THAN (2000) (\nSUBPARTITION s2,\nSUBPARTITION s3\n),\nPARTITION p2 VALUES LESS THAN MAXVALUE (\nSUBPARTITION s4,\nSUBPARTITION s5\n)\n);\n插入测试记录：\nINSERT INTO tb_sub_ev() VALUES(1,\u0026lsquo;1989-01-01\u0026rsquo;),(2,\u0026lsquo;1989-03-19\u0026rsquo;),(3,\u0026lsquo;1989-04-19\u0026rsquo;);\n从查询结果中，可以看到3条记录分表存储在2个不同的子分区中。\n查看如下查询语言的执行计划：\nexplain select * from tb_sub where purchased=\u0026lsquo;1989-01-01\u0026rsquo;;\nexplain select * from tb_sub where purchased=\u0026lsquo;1989-03-19\u0026rsquo;;\nexplain select * from tb_sub where purchased=\u0026lsquo;1989-04-19\u0026rsquo;;\n8. 移除表的分区 注意：使用remove移除分区是仅仅移除分区的定义，并不会删除数据和drop PARTITION不一样，后者会连同数据一起删除。\nALTER TABLE tb_sub REMOVE PARTITIONING;\n移除分区之后，再次查询表中的数据，确认表的数据依然存在。\n查看表结构，确认表分区已经成功移除了。\nshow create table tb_sub;\n","permalink":"https://www.plbear.com/posts/mysql-partition/","summary":"\u003cp\u003e下面演示MySQL Range类型分区的操作，其他类型的分区还有Hash、Key、List等等。\u003c/p\u003e\n\u003cp\u003e分区优点：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e分区可以分在多个磁盘，存储更大一点。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e根据查找条件，也就是where后面的条件，查找只查找相应的分区不用全部查找了。\u003c/p\u003e","title":"MySQL表分区（partition）创建、查询、删除以及重建分区等等操作"},{"content":" 本文以在线商城系统为主要业务场景，分别定义了用户、商品和订单三个微服务，并实现三个微服务所涉及到的数据库和表的水平拆分、垂直拆分和读写分离的相关配置。\n概念 先来看一下本文业务场景中涉及到的数据库表。\n单机环境的数据库结构\n1、水平拆分\n将同一个表的数据进行分块保存到不同的数据库中，这些数据库中的表结构完全相同。\n我们把数据库水平拆分成三个数据库，每个数据库中的表结构是完全相同的，不同数据库中表的记录条数不同。\n水平拆分后的数据库结构\n2、垂直拆分\n按功能模块拆分，比如分为订单库、商品库、用户库\u0026hellip;这种方式多个数据库之间的表结构不同。\n按用户库、商品库和订单库实现的不同功能进行垂直拆分。\n垂直拆分数据库结构\n3、读写分离\n读写分离一般来说都是通过主从复制（Master-Slave）的方式来同步数据，再通过读写分离（MySQL-Proxy）来提升数据库的并发负载能力这样的方案来进行部署与实施的。\n数据库读写分离架构\n4、Mycat介绍\n首先，Mycat是数据库分库分表中间件。这是Mycat官网（http://mycat.io/）定义的一句话。个人理解它相当于一个数据库的代理，将拆分后的数据库在逻辑上重新封装，对外暴露和未拆分之前是同样的数据库结构。\n按照上面的业务场景，将数据库进行垂直拆分再水平拆分。按三个业务模块进行垂直拆分，在分别水平拆分成3个数据库，最后形成9个数据库。再按一主一从的方式进行读写分离配置，即一共18个数据库。\n垂直、水平拆分及读写分离架构\n1、 不同的微服务连接Mycat中间件。访问对应业务模块的数据库。\n2、 Mycat中的三个数据库在物理上并不存在，是逻辑上的三个数据库。\n3、 Master将三个业务模块的数据库表进行水平拆分，各库中的表结构相同，数据不同。并作为主数据库完成数据的写操作。\n4、 Slave将三个业务模块的数据库表进行水平拆分，各库中的表结构相同，数据不同。并作为从数据库完成数据的读操作。\n5、 Master和Slave实现数据同步操作。\nMycat配置 概览\nMycat官网下载1.6.7-release版本解压后的目录结构包括bin、catlet、conf、lib和version.txt。其中conf目录中存放大量的配置文件，其中最主要的是有server.xml、schema.xml和rule.xml三个文件。\n1、server.xml\nserver.xml 包含mycat的系统配置信息，它有两个标签，分别是user和system。\nuser标签\nserver的user标签\nname：user的名称，下面的schema.xml文件中的数据库访问用户名。\npassword：访问密码。\nschemas：下面schema.xml文件中的逻辑数据库名称，这里把三个都配置上了，方便操作。\nreadOnly：说明此用户只有读权限，没有写权限。上面配置中，如果使用user用户登录，则只能进行读操作。\nsystem标签：\n这里只着重介绍sequnceHanlderType属性，这里是Mycat主键的生成策略。因为现在是把数据进行了多节点的分片拆分。所以使用主键的自增就会造成主键冲突的问题。\nsequnceHanlderType属性有三个选项。0代表本地文件，1代表数据库方式，2代表时间戳方式。这里可以根据需要自行配置。数据库方式的话需要对dataNode创建一些相关的函数才能使用。本地文件是使用conf/sequence_conf.properties文件内容进行维护的。具体详见该文件的内容。\nsequnceHanlderType配置\n2、schema.xml\n这里将数据库从逻辑上分为三个，javapupil_user(用户库)、javapupil_goods(商品库)、javapupil_order(订单库)。\nschema-table-datanode配置\ntable配置：\nname：表名。\nprimaryKey：表中的主键列名。\ndataNode：数据库表所在的数据节点名称。\nrule：数据插入规则，rule.xml小节中详述。\ndataNode配置\ndataNode配置：\nname：数据节点名称。\ndataHost：数据主机名称。下面详述。\ndatabase：数据库名称。\ndataHost配置\nname：dataHost的名称。\nbalance：负载均衡类型。\n（1）0不开启读写分离机制，所有读操作都发送到当前可用的writeHost 上。\n（2）全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡，简单的说，当双主双从模式(M1-\u0026gt;S1，M2-\u0026gt;S2，并且 M1 与 M2 互为主备)，正常情况下，M2,S1,S2 都参与 select 语句的负载均衡。\n（3）balance=\u0026ldquo;2\u0026rdquo;，所有读操作都随机的在 writeHost、 readhost 上分发。\n（4）balance=\u0026ldquo;3\u0026rdquo;，所有读请求随机的分发到 wiriterHost 对应的 readhost 执行，writerHost 不负担读压力，注意 balance=3 只在 1.4 及其以后版本有，1.3 没有。\n所以，这里使用1和3都是可以的。\nwriteType：\n（1）writeType=\u0026ldquo;0\u0026rdquo;, 所有写操作发送到配置的第一个 writeHost，第一个挂了切到还生存的第二个riteHost，重新启动后已切换后的为准，切换记录在配置文件中:dnindex.properties.\n（2）writeType=\u0026ldquo;1\u0026rdquo;，所有写操作都随机的发送到配置的 writeHost，1.5 以后废弃不推荐。\nheartbeat：心跳，判断该数据库是否存活。\nwriteHost：Master写操作的数据库配置\nreadHost：Slave读操作的数据库配置。如果有多个Slave，这里可以配置多个。\n3、rule.xml\n规则配置文件。\n\u0026lt; t a b l e n a m e = \" u s e r \" p r i m a r y K e y = \" i d \" d a t a N o d e = \" d n 1 , d n 2 , d n 3 \" r u l e = \" m o d - l o n g \" rule属性的mod-long在此配置文件中进行设置。这里表示的是“取模”规则。\nrule.xml文件中会找到如下代码：\nmod-long配置\ncolumns：表示利用哪个列进行操作，这里是用id列进行操作。这里的id列必须是整型。\nalgorithm：表示具体的算法，这里的算法是mod-long。\n那么mod-long是怎么实现的呢：\n实现mod-long的java类\nclass：io.mycat.route.funciton.PartitionByMod。取模的算法是通过这个类实现的。\ncount：表示一共有几个数据节点，这里配置3个，也就是当生成的id与3取模，得到的余数是几就将该条记录插入到哪个数据库中。比如余数是0，就进入dn1中，余数是1就进入dn2中，余数是2就进入dn3中。\n应用配置 1、数据库连接配置\n本例中因为使用了Mycat作为数据库中间件，代理了数据库的分库分表。所以应用程序只需要连接Mycat中的逻辑数据库javapupil_user、javapupil_goods、javapupil_order即可。\njdbc:mysql://192.168.1.145:8066/javapupil_user\njdbc:mysql://192.168.1.145:8066/javapupil_ goods\njdbc:mysql://192.168.1.145:8066/javapupil_order\n注意：Mycat默认的端口是8066。\n2、sql配置\n当程序需要插入数记录时，在insert into中需要加入如下的Sql代码：\nnext value for MYCATSEQ_GLOBAL，这里的GLOBAL是在conf/sequence_conf.properties中进行的配置。\nSEQ_GLOBAL配置\n总结 本文着重介绍了基于Mycat的Mysql分库分表及读写分离的配置。使用了垂直和水平相结合的方式对数据库进行拆分。Mycat是一款强大的分库分表的中间件，配置简单，运行稳定。希望本文能给正在研究微服务架构分库分表读写分离的朋友带来一点启发。\n","permalink":"https://www.plbear.com/posts/mycat/","summary":"\u003cblockquote\u003e\n\u003cp\u003e本文以在线商城系统为主要业务场景，分别定义了用户、商品和订单三个微服务，并实现三个微服务所涉及到的数据库和表的水平拆分、垂直拆分和读写分离的相关配置。\u003c/p\u003e","title":"微服务架构基于Mycat分库分表及读写分离的配置实战"},{"content":"1. 概述 大家都知道Nginx有很多功能模块，比如反向代理、缓存等，这篇文章总结下我们这些年实际环境中那些有用的Nginx规则和模块，大部分是用法的概括及介绍，具体细节在实际配置时再自行google。\n2. 内置语法 先介绍Nginx默认已支持的内置功能，靠这些基本就满足大部分的web服务需求。\n2.1 proxy代理 proxy常用于两类应用场景，一类是中转，如异地科学的上网方式，另外一类是到后端服务的负载均衡方案。\n用反向代理时候，需要特别注意里面的域名默认是在nginx启动时候就解析了，除非reload否则一直用的是当初解析的域名，也就是说不能动态解析。\n但这个问题是可以通过别的模块或者用内置字典变量方式来解决。\nr s } e e l s p } s r o e r o v c t o l e a x v r t $ y e i s _ r { o e p n r a 1 s 1 / e s 4 r . { s h 1 t 1 g t 4 i p . t : 1 h / 1 u / 4 b $ . . s 1 c e 1 o r 4 m v ; ; e r s ; 2.1.1 中转 针对某个域名进行中转：\ns l } e i s l p p p } r s e o r r r v t r c o o o e e v a x x x r n e t y y y r i _ _ _ { 1 _ o s r p 7 n n e e a 2 a t d s . m ~ _ i s 1 e h r 6 / e e h . p s a c t 1 y i d t t 0 p m e p . i p r o : 1 . l f / : p e H f / 8 y o ; p 0 t { s y ; h t p o i n $ . . h p o t y r t t g p h ; _ o h n o . s o t r ; g ; 注意如果是前后端域名不一样的话需要处理proxy_redirect的301跳转之类的显示，否则在跳转时候会跳转到proxy_pass的域名。\n另外可以直接代理所有80端口的http流量：\ns } e l s r s l p } r i e e e o r v s r s t c o e t v o a x r e e l $ t y n r v U i _ { _ e R o p 8 n r L n a 0 a s ; m 1 $ / s e 1 h 4 o { h _ . s t ; 1 t t 1 ; p 4 : . / 1 / 1 $ 4 U . R 1 L 1 ; 4 ; 如果是想代理https的站点也不是不可能，只是需要自行处理CA证书导入即可，而且经过https中转的流量对nginx是透明的，也就是有证书的时候做窃听和劫持的情况。\n2.1.2 负载均衡 这是代理的另外一个常见用法，通过upstream到多个后端，可以通过weight来调节权重或者backup关键词来指定备份用的后端，通常默认就可以 了，或者可以指定类似ip_hash这样的方式来均衡，配置很简单，先在http区域添加upstream定义：\nu } p i s s s p e e t _ r r r h v v e a e e a s r r m h ; b b b a a a c c c k k k e e e n n n d d d 1 2 . . { e e x x a a m m p p l l e e . . c c o o m m w w e e i i g g h h t t = = 5 5 ; ; ; 然后在server里面添加proxy_pass：\nl } o p p p c r r r a o o o t x x x i y y y o _ _ _ n p h s a t e / s t t s p _ { _ h h v e t e a t r d p s e : i r / n C b o a 1 n c . n k 1 e e ; c n t d i ; o n \" \" ; 做负载均衡的时候可以智能识别后端服务器状态，虽然可以智能地proxy_next_upstream到另外的后端，但还是会定期损失一些正常的“尝试性”的连接，比如过了max_fails 次尝试之后，休息fail_timeout时间，过了这个时间之后又会去尝试，这个时候可以使用第三方的upstream_check模块来在后台定期地自动探索，类似这样：\nc h e c k i n t e r v a l = 3 0 0 0 r i s e = 2 f a l l = 5 t i m e o u t = 2 0 0 0 t y p e = h t t p ; 这样替代用户正常的连接来进行尝试的方式进一步保障了高可用的特性。\n还有就是在做前端代理的时候也是这样的方式，直接proxy_pass到后端即可，比如CDN的场景。\n2.2 防盗链 普通的防盗链是通过referer来做，比如：\nl } o v i r } c a f e a l t t i ( u i d $ r o _ i n n r n e v 4 ~ f a 0 * e l 3 r i ; e d r _ ( s r g e i n f f o e | n r j e e p r g b ) | l p o { n c g k | e b d m p ) . $ e x { a m p l e . c o m s e r v e r _ n a m e s ~ \\ . g o o g l e \\ . ~ \\ . b a i d u \\ . ; 再精细一点的就是URL加密，针对一些用户IP之类的变量生成一个加密URL通常是针对文件下载时候用到，可以通过openresty来写lua脚本或者是accesskey之类的模块来实现。\n2.3 变量 nginx里面支持正则匹配和变量配置，默认的变量比如remote_addr、request_filename、query_string、server_name之类的，这些组合在一起可以做很多规则，或者还有日志里面status、http_cookie等。\n还有在进行多域名配置时候可以用通配符，比如：\ns r e o r o v t e r / _ d n a a t m a e / w ~ e ^ b ( / w $ w 2 w ; \\ . ) ? ( . + ) $ ; 这样就实现了自动进行域名的目录指派。\n变量方面，比如配置变量a=1：\ns e t $ a 1 ; 下面这个案例配合if判断来做有更大的用处。\n2.4 if判断 nginx里面支持一些简单的if判断，但是没有多重逻辑的语法，多个判断条件用起来需要结合变量的方式来实现，比如允许ip地址为10.10.61段和和192.168.100段的用户访问，其余的拒绝，返回405状态码：\ns e i s } i s } i r } t f e f e f e t t t $ ( ( ( u e $ $ r r $ e $ e $ n r r r r r e e r e r r 4 0 m m r 0 ; o 0 o 0 5 t ; t ; = ; e e _ _ 1 a a ) d d { d d r r ~ ~ 1 1 0 9 . 2 1 . 0 1 . 6 6 8 1 . . 1 ) 0 { 0 . ) { 这样通过一个err变量比较巧妙实现了需求。\n2.5 error_page 有用到后端proxy的地方需要加上这句话才可以传到状态码到nginx：\nf a s t c g i _ i n t e r c e p t _ e r r o r s o n ; 具体配置一般是配置到具体的错误URL页面，比如：\n# e # e 返 r 返 r 回 r 回 r 具 o 2 o 体 r 0 r 状 _ 0 _ 态 p 状 p 码 a 态 a g 码 g e e 4 4 0 0 4 4 4 4 0 0 3 3 / = 4 2 x 0 x 0 . h / t e m r l r o r . h t m l 或者采用callback的方式统一做处理：\ne l } r o p a r c r c o a o c r t x e _ i y s p o _ s a n p _ g a l e @ s o f s g 4 a 0 l h / 4 l t d b t a 4 a p t 0 c : a 3 k / l = { b o a g @ c s f k / a e 4 l n 0 l d 4 b ; _ a e c r k r ; o r . l o g a c c e s s ; 这样在重定向时不会改变URL，然后把404页面直接返回。\n2.6 rewrite rewrite做一些301、302之类的跳转，同时也可以在CDN前端做“去问号”缓存的效果。\nl } o r i c e n a w c t r l i i u o t d n e e / p d r b o . x t y x $ . t 1 c ? o { n b f r ; e a k ; 另外最常见的跳转写法：\nr e w r i t e / g a m e / ( . * ) / $ 1 ; 把/game/test跳转为/test的效果，注意这样是没有状态码的，如果访问正常就直接返回200状态码。\n可以在后面加个permanent参数，就变为了301 Moved Permanently，或者添加redirect改为302跳转。\n同理，还可以进行多个正则匹配进行URL重组，比如：\nr e w r i t e / d o w n l o a d / ( . * ) / l a s t e s t / ( . * ) $ / f i l e / $ 1 ? v e r = $ 2 b r e a k ; 2.7 日志字段 想针对每个连接进行日志留档，可以在nginx日志那里配置好字段，比如记录cookie之类的数据。\n在log_format字段里面加入$http_cookie变量即可。\n另外post的数据可以永久保留在文件里面，比如用来做http的日志备份，包括get和post的原始数据，把这个值开启即可：\nc l i e n t _ b o d y _ i n _ f i l e _ o n l y o n ; 然后post的数据就会保存在nginx/client_body_temp文件夹里面。\n2.8 internal关键词 这个关键词很少见，但有时候是很有用的，比如在有很多规则时候，突然需要针对某个目录转为nginx内部处理。\nl a i } o l n c i t a a e t s r i n o / a n d l a ; ^ t ~ a w u e p b l d a t d s / / d d o t w s n f / i l { e / d o w n / ; 2.9 try_files 字面意思是尝试，后面可以接多个目录或者文件，比如kohana框架：\nt r y _ f i l e s $ u r i / i n d e x . p h p ? $ q u e r y _ s t r i n g ; 先看是否有URL这个文件，没有的话再调用index.php来处理，或者支持状态码处理：\nt r y _ f i l e s / f o o / b a r / = 4 0 4 ; 没有这两个文件的话返回404状态。\n2.10 auth认证 可以做简单的用户登录认证方式，其中的passwd_file得通过apache的htpasswd命令来生成。\na a u u t t h h _ _ b b a a s s i i c c _ \" u R s e e s r t _ r f i i c l t e e d p \" a ; s s w d _ f i l e ; 认证通过之后每次访问会在头部添加Authorization字段包含用户名密码的base64加密密文给服务端。\n2.11 gzip 普通的线上web站点gzip压缩是必须要开的，压缩一些文本类型的文件再返回给用户。\n注意必须手动指定全需要压缩的类型，比如css、js之类的，线上配置如下：\ng g g g g g z z z z z z i i i i i i p p p p p p _ _ _ _ _ o m b v h t n i u a t y ; n f r t p _ f y p e l e _ s e r o v n s n e t g ; r e t 4 s x h i t 1 o / 2 6 n p 0 k l 4 ; 1 a 8 . i ; 1 n ; t e x t / c s s t e x t / x m l a p p l i c a t i o n / x m l a p p l i c a t i o n / j a v a s c r i p t a p p l i c a t i o n / x - j a v a s c r i p t ; 2.12 mime配置 很久以前基本是忽略这个配置，但手游流行之后就发现异常了，需要让手机浏览器知道返回的apk后缀是什么类型，否则类似IE浏览器会以zip后缀返回，需要加上：\na a p p p p l l i i c c a a t t i i o o n n / / i n p d h . o a n n e d r p o x i l d . i p p a a c ; k a g e - a r c h i v e a p k ; 2.13 限速 限速包括限制请求的并发数和请求的下载速度。\n简单的限制某个线程的下载速度就直接加上一句话就可以了：\nl i m i t _ r a t e 1 0 2 4 k ; 要限制某个IP的并发数之类的就需要用ngx_http_limit_req_module和ngx_http_limit_conn_module模块了，不过是默认就编译好的。\n比如使用一个 10M 大小的状态缓存区，针对每个IP每秒只接受20次的请求：\nl i m i t _ r e q _ z o n e $ b i n a r y _ r e m o t e _ a d d r z o n e = N A M E : 1 0 m r a t e = 2 0 r / s ; 2.14 location匹配 location匹配有多种方式，常见的比如\nl l l o o o c c c a a a t t t i i i o o o n n n = / ^ ~ / / t e s t { 是有优先级的，直接 ”=” 的优先级是最高的，一般就用”~”这个符号来匹配php就好了，不过是区分了大小写的：\nl o c a t i o n ~ . p h p $ 2.15 文件缓存 返回给用户的文件一般都配置了过期时间，让浏览器缓存起来。\n比如缓存14天：\ne x p i r e s 1 4 d ; 针对某些特殊的文件就需要location匹配之后进行禁止缓存配置：\na a e d d x d d p _ _ i h h r e e e a a s d d e e o r r f f C C ; a a c c h h e e - - C C o o n n t t r r o o l l n n o o - - c s a t c o h r e e ; ; 2.16 缓存文件 nginx可以作为ATS这样的缓存服务器来缓存文件，配置也比较简单，不过我们很少用，除非一些特殊的场合，参考配置：\n# p p p # p p p p p a 先 r r r 然 r r r r r d 在 o o o 后 o o o o o d 全 x x x 在 x x x x x _ 局 y y y s y y y y y h 下 _ _ _ e _ _ _ _ _ e 面 c t c r c c c p c a 定 a e a v a a a a a d 义 c m c e c c c s c e 好 h p h r h h h s h r 缓 e _ e 里 e e e e 存 _ p _ 面 _ _ h _ N 存 p a k 的 c v v t k g 放 a t e l a a a t e i 的 t h y o c l l p y n 目 h c h i i s x 录 $ a e d d : $ - d h t _ / h C d a o i o 2 a / o a a t s o n 0 n $ s c t a t n e 0 y h t h a $ 匹 ; o $ e c u 配 3 1 s u c a r 好 0 0 t r \" a c i 目 4 m ; i $ c h $ 的 ; $ u h e i 文 2 i p e s 件 4 s s p _ ， h _ t r a 加 ; a r l o r 入 r e e x g 下 g a v y s 一 s m e _ $ 段 $ _ l t a 即 a c s e r 可 r a = m g g c 1 p s s h : _ ; ; e 2 p _ a s k t t e h a y ; t s u _ s z \" o ; n e 3 = . c a 内 c 置 h 模 e 块 _ o n e : 1 0 m i n a c t i v e = 7 d m a x _ s i z e = 1 0 g ; 3. 内置模块 nginx含有大量的模块可以支持多种复杂的需求，比如源码目录src/http/modules里面就有很多c模块的代码，或者直接通过./configure –help|grep module来查看有哪些内置模块，编译时候直接加上就可以了。\n除了nginx内置的模块，网络上还有很多第三方的模块，可以通过编译时候加参数–add-module=PATH指定模块源码来编译。\n下面介绍一些我们线上用过而且比较赞的内置模块。\n3.1 stream 端口转发的模块，从nginx1.9版本才开始支持，包含tcp和udp的支持，和IPTABLES相比这个虽然是应用层，会监听端口，但是配置起来很方便，比IPTABLES灵活，在tcp模块下面添加类似vhost的server就可以了，方便自动化管理，参考配置：\ns } e l p a r i r c v s o c e t x e r e y s n _ s { p _ P a l O s o R s g T ; I / P d : a P t O a R / T l ; o g s / t c p / P O R T . l o g ; 3.2 http_realip_module nginx反向代理之后，如何让后端web直接获取到的IP不是反向代理的iP，而是直接获取到用户的真实IP呢，就需要这个模块了，不需要代码那里再做类似X-Real-IP的变量特殊判断。\n3.3 http_slice_module 在做CDN时候可以用到，让一个大文件分片，分成多个小文件通过206断点续传到后端，然后再组合起来，避免大文件直接回源导致多副本和多次回源的问题。\n3.4 http_secure_link_module 前面说到的防盗链可以用这个来做，但是这个一般是针对那种文件下载时候用到的，比如从网页下载时候，服务端生成一个加密URL给用户，然后这个URL有过期时间之类的，避免此URL被多次分享出去，不过普通的素材加载还是用普通的防盗链即可。\n3.5 http_sub_module 替换响应给用户的内容，相对于sed之后再返回，比如可以在需要临时全局修改网站背景或者title时候可以一次性处理好。\n4. 扩展项目 简单介绍下大名鼎鼎的两个基于nginx的扩展项目，也是我们线上有很多地方用到的。\n4.1 openresty 集成lua脚本，几乎可以完成任何普通web相关的需求。\n比如URL加密进行防劫持和防盗链，服务端动态生成一串aes加密的URL给CDN，CDN的openresty解密之后用普通的URL转发到后端，然后再返回给用户正确的内容。\n4.2 tengine 淘宝的nginx修改版，实现了很多nginx的收费功能或者是特殊功能，比如动态加载、concat合并请求，动态解析等。\n","permalink":"https://www.plbear.com/posts/nginx-rule/","summary":"\u003ch1 id=\"1-概述\"\u003e\u003cstrong\u003e1. 概述\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e大家都知道Nginx有很多功能模块，比如反向代理、缓存等，这篇文章总结下我们这些年实际环境中那些有用的Nginx规则和模块，大部分是用法的概括及介绍，具体细节在实际配置时再自行google。\u003c/p\u003e","title":"运维的生活中常见的Nginx规则"},{"content":"无规矩不成方圆，为了开发人员间更好的配合，我特意整理了这么一篇文档供大家参考学习，如有意见、见解，请在评论区留言探讨。\n接口规范说起来大，其实也就那么几个部分，接口规范、接口管理工具、接口文档编写、开发文档编写。\n接口规范定义\n一、协议规范\n为了确保不同系统/模块间的数据交互，需要事先约定好通讯协议，如：TCP、HTTP、HTTPS协议。为了确保数据交互安全，建议使用HTTPS协议。\n二、接口路径规范\n作为接口路径，为了方便清晰的区分来自不同的系统，可以采用不同系统/模块名作为接口路径前缀。\n格式规范如下：\n支付模块 /pay/xx\n订单模块 /order/xx\n三、版本控制规范\n为了便于后期接口的升级和维护，建议在接口路径中加入版本号，便于管理，实现接口多版本的可维护性。如果你细心留意过的话，你会发现好多框架对外提供的API接口中(如：Eureka)，都带有版本号的。如：接口路径中添加类似\u0026quot;v1\u0026quot;、\u0026ldquo;v2\u0026quot;等版本号。\n格式规范如下：\n/xx/v1/xx\n更新版本后可以使用v2、v3等、依次递加。\n四、接口命名规范\n和Java命名规范一样，好的、统一的接口命名规范，不仅可以增强其可读性，而且还会减少很多不必要的口头/书面上的解释。\n可结合【接口路径规范】、【版本控制规范】，外加具体接口命名(路径中可包含请求数据，如：id等)，建议具体接口命名也要规范些，可使用\u0026rdquo;驼峰命名法\u0026ldquo;按照实现接口的业务类型、业务场景等命名，有必要时可采取多级目录命名，但目录不宜过长，两级目录较为适宜。\n格式规范如下：\n/user/v1/sys/login 用户服务/模块的系统登录接口\n/zoo/v1/zoos/{ID} 动物园服务/模块中，获取id为ID的动物\n具体接口命名，通常有以下两种方式：\n接口名称动词前/后缀化 接口名称以接口数据操作的动词为前/后缀，常见动词有：add、delete、update、query、get、send、save、detail、list等，如：新建用户addUser、查询订单详情queryOrderDetail。\n接口名称动词+请求方式 接口路径中包含具体接口名称的名词，接口数据操作动作以HTTP请求方式来区分。常用的HTTP请求方式有：\nGET：从服务器取出资源（一项或多项）。\nPOST：在服务器新建一个资源。\nPUT：在服务器更新资源（客户端提供改变后的完整资源）。\nPATCH：在服务器更新资源（客户端提供改变的属性）。\nDELETE：从服务器删除资源。\n如：\nGET /zoo/v1/zoos：列出所有动物园\nPOST /zoo/v1/zoos：新建一个动物园\nGET /zoo/v1/zoos/{ID}：获取某个指定动物园的信息\nPUT /zoo/v1/zoos/{ID}：更新某个指定动物园的信息（提供该动物园的全部信息）\nPATCH /zoo/v1/zoos/{ID}：更新某个指定动物园的信息（提供该动物园的部分信息）\nDELETE /zoo/v1/zoos/{ID}：删除某个动物园\nGET /zoo/v1/zoos/{ID}/animals：列出某个指定动物园的所有动物\nDELETE /zoo/v1/zoos/ID/animals/ID：删除某个指定动物园的指定动物\n五、请求参数规范\n请求方式： 按照GET、POST、PUT等含义定义，避免出现不一致现象，对人造成误解、歧义。 请求头： 请求头根据项目需求添加配置参数。如：请求数据格式，accept=‘application/json’等。如有需要，请求头可根据项目需求要求传入用户token、唯一验签码等加密数据。 请求参数/请求体： 请求参数字段，尽可能与数据库表字段、对象属性名等保持一致，因为保持一致最省事，最舒服的一件事。\n六、返回数据规范\n统一规范返回数据的格式，对己对彼都有好处，此处以json格式为例。返回数据应包含：返回状态码、返回状态信息、具体数据。\n格式规范如下：\n{ } \" \" \" } s m d / t s a j a g t s t \" a o u : \" n s \" : 格 \" s 式 : u { 的 \" c 具 0 c 体 0 e 数 0 s 据 0 s 0 \" 0 , \" , 接口管理工具推荐\n接口开发完后，最终的目的是提供给其他系统/模块来使用的，因此，接口的管理是必不可少的。\n接口管理的痛点\n接口的管理常常面临很多的痛苦，这里就列举几个常见的，看看你是否也遇到过。\n系统/模块太多、接口太多，没有系统统一管理所有接口。 代码修改后，接口文档没有及时更新，造成接口文档和实际接口不一致的现象。 接口管理系统自主研开发成本高。 接口管理缺少接口mock功能。 接口管理工具推荐\n在日常工作过程中用过、接触过的接口管理工具也是不尽其数，下面介绍你可能使用过、没有使用过的接口管理工具，同时也介绍这些接口管理工具的优缺点。\nword\n相信大家之前用来管理接口比较多的应该是word吧，开发人员将系统的接口维护在word文档里，不管是组内沟通还是和其他团队的接口沟通都离不开这些接口文档，每次修改文档和代码都要同步修改。相信使用word的缺点大家应该也很清楚，就是维护和管理很麻烦，我们经常会遇到文档和代码不一致的情况，大部分不一致都是因为接口因为种种原因修改了，开发人员大部分都是只改了代码里的接口实现，而没有去修改接口文档。而且word文档搜索接口也很麻烦，没办法建全局索引，只能一个个文档点开查看，想想就很痛苦。但不可否认的是，word对于一些小团队用起来还是挺方便的，不用搭建系统，给谁一看就明白。\n自建接口管理系统\n对于一些有一定规模的企业，在各项工程管理活动上都非常正规，各种ISO标准要遵守，自然对接口管理的要求也非常高，之前在国有银行，我们就是自建了接口管理系统，自建还是很消耗人力成本的，从开发到后续运维，都要消耗人力，但是自建的好处就是，可以根据公司的要求进行各种花样的定制，我们之前在接口管理系统中加入了很多好用的定制功能，例如接口被哪些系统调用、接口是在哪个批次投产又在哪个批次做过变更等等，这对于架构师来说非常好用，用于分析接口影响范围非常方便。目前开源的接口管理系统还没有能做到这些定制化功能的。\nwiki\n之前在小团队的时候还用过一段时间的私有wiki，wiki特别适合于小团队高速线性迭代开发，在wiki上看到的就是最新的接口，团队内所有成员看到的都是一样的，如果接口有变化，相关开发人员修改后立即生效，保证了顺畅的接口沟通。但是wiki的缺点也很多，接口文档只是静态页面，无法实现一些动态效果，无法实现追溯等等缺点。\nRAP\n相信很多互联网公司都在使用RAP，RAP是阿里开源的一套接口管理系统，RAP可以比较方便的管理公司所有系统的接口，同时还有比较完善的权限管理，还可以做接口mock，方便开发人员在接口功能还没有完成的时候能够及时发布出去，给调用方去使用。但是RAP的缺点就是每个接口都需要维护进去，接口修改后也需要及时维护，当时我们在使用的时候遇到的最大的问题也是经常碰到接口没有及时维护的问题。\nswagger\n上面说的那些接口管理工具，其实都有一个很大的问题就是修改代码后需要同步维护接口文档，但是让程序员去修改文档是很难的，大部分程序员都比较讨厌维护各类文档。当我第一次了解到swagger的时候，发现这简直就是为程序员定制的接口管理工具，swagger定义了很多注解，在对接口加上swagger相关的注解，当接口代码修改后，swagger在工程启动后会根据代码自动生成最新的接口html文档，同时swagger提供了mock接口模拟的功能，也能够更加方便的模拟接口，并且还能够在swagger界面上直接发起接口调用，可以方便调用方在还没写代码的时候就能够尝试下接口调用后的结果。\n看了那么多swagger的优点，下面也说说swagger的缺点，那就是swagger是跟随着每个工程一起启动的，这就导致每个工程都有一个swagger的访问地址，如果公司系统很多的话，那就会导致查看不同系统的接口都要到不同的地址去查看，每个开发都要自己收藏好各个系统的swagger地址。有些公司也自己开发了统一网关，将所有swagger的接口地址聚合起来，但是多少还是涉及到一些开发工作的，而且做的还不一定很完善。\nEasy Mock\n官网的这张图基本上介绍清楚了easymock的核心功能，这其中我最看重的功能有两块，一个是能够集成swagger接口并集中管理所有接口，另一个就是响应式数据。\nEasyMock能够根据swagger接口的地址自动导入所有swagger接口，非常方便，对于非swagger的接口也可以手工维护进去，这样可以很方便的做到全公司接口统一维护，而且也有比较完善的接口权限管理，方便分组管理。但缺点就是过于庞大，可能太适合小一点项目或团队。\n上面提及到接口管理工具，大家可根据自己项目的规模、需求，进行实际选择，切记生搬硬套。\n","permalink":"https://www.plbear.com/posts/that-is-how-restful-api-workds/","summary":"\u003cp\u003e\u003cstrong\u003e无规矩不成方圆\u003c/strong\u003e，为了开发人员间更好的配合，我特意整理了这么一篇文档供大家参考学习，如有意见、见解，请在评论区留言探讨。\u003c/p\u003e\n\u003cp\u003e接口规范说起来大，其实也就那么几个部分，接口规范、接口管理工具、接口文档编写、开发文档编写。\u003c/p\u003e","title":"如何写出完美的接口：接口规范定义、接口管理工具推荐"},{"content":"如果你有机会在公司内部做一次Elasticsearch 技术分享，如何才能讲的逼格高，又接地气，那么建议从以下几个方面展开，大家有好的想法，也欢迎文章留言交流。\n1、可视化展示ELK效果 如果条件允许，demo的内容是：通过logstash 同步日志或数据库（oracle、mysql）表的数据到 Elasticsearch，然后通过kibana进行可视化。\n1、通过Canvas对数据进行可视化布局与展现，可以实现非常酷炫的大屏展示效果。2、展示实时数据的数据量。3、展示你定的几个维度的数据信息。\n这么切入的目的：很直观，很明显，很接地气。用到ELK技术栈的内容，有带动性，让参与的同事不犯困且很容易让大家对它产生兴趣。\n2、 Elk stack大家族简介 考虑到不同受众关注点不同。结合业务的数据的特点，从输入、中间处理、存储\u0026amp;检索、分析等全数据流环节展开。\n2.1 输入\nElastic 支持的输入包含但不限于：\n1、日志类数据：类log4j.log，apache log等，可借助 beats或logstash同步\n2、关系型数据库：mysql oracle pgsql等\n3、非关系型数据库:mongodb redis等\n4、实时数据流：flink spark kafka hdfs等\n5、大数据：hadoop hdfs等\n此处的不同数据的导入，Lostash有丰富的input/output插件，支持N多不同数据源接入，估计同事也会眼前一亮。\n2.2 中间处理ETL\n基础数据很可能是异构的数据，中间的ETL非常重要。logstash filter、elasticsearch ingest 都具备ETL功能。\n2.3 存储\u0026amp;检索\n基于合理的数据建模，在Elastic落地存储，Elastic提供全文检索、数据聚合等。\n2.4 分析\n强调一下，kibana的可视化和监控功能。\n2.5 ELKB认知\nElastic Stack数据平台由Logstash、Beats、ElasticSearch和Kibana四大核心产品组成，在数据摄取、存储计算分析及数据可视化方面有着无可比拟的优势。\n1、E = Elasticsearch，在存储、计算和分析方面，ElasticSearch允许执行和合并多种类型的搜索，解决不断涌现的各种用例，并具有极高的可用性及容错性，充分保障集群安全。\n2、L = Logstash, Logstash 是开源的服务器端数据处理管道，可同时从多个来源采集、转换数据，并将数据发送到存储库中。\n3、K = Kibana，Kibana作为用户界面的核心，集成了丰富的可视化工具、界面交互开发工具和管理工具，帮助开发人员将数据轻松分享给任何人，甚至还能通过机器学习来监测数据中的隐藏异常并追溯其来源。\n4、B = Beats，Beats作为轻量级的数据搬运工，集合了多种单一用途数据采集器，将数据发送给Logstash或ElasticSearch，其可扩展的框架及丰富的预置采集器将使工作事半功倍。\n以上，主要从大而全的维度，讲解ELK，给大家带来全景认知。\n以这四大核心产品为基础构建的Elastic数据平台实现了数据实时性、相关性及扩展性的完美结合，不仅可以处理各种数据，还能深入挖掘数据的内在关联并迅速呈现，彻底解决企业的大数据实时处理难题。\n3、 Elasticsearch 是什么？ 展示的过程中：可以通过kibana的dsl进行展开的讲解。注意例子：可以提前准备好，规划好时间，不用现场敲代码。\n此时可以借助head插件或者kibama-dev讲解。\n3.1 Elasticsearch的组成\n如果是集群部署的更好。讲解内容包括：\n集群、 索引、 分片、 副本、 分段、 倒排索引。 ES的底层是lucene等。 3.2 Elasticsearch分布式可扩展的特性\n强调Elasticsearch可以支持PB级别甚至更高级别数据量的存储。\n3.3 强调Elasticsearch特点\n1、简单的restful api，天生的兼容多语言开发。2、分布式的实时文件存储，每个字段都被索引且可用于搜索。3、分布式的实时分析搜索引擎，海量数据下近实时秒级响应。4、易扩展，处理PB级结构化或非结构化数据。\n4、 Elasticsearch 能做什么？ 4.1 全文检索等\n其实也可以类比一下mysql，强调一下：关系型数据库一些检索是做不到的。对比的目的：因为大家都熟悉关系型数据库，这样能够加深理解。\n也可以类比下Google，百度等传统的搜索引擎。告诉同事，其实他们可以做的功能我们都可以做。比如：全文检索，高亮，分页，统计聚合，高级检索等。\n检索的分类：\n1、精确匹配。2、模糊检索。3、正则检索。4、强调全文检索。强调他的快。基于倒排索引实现。5、等等。\n检索类型可以画一个脑图。其实可以，举个例子。演示一下最好。\n4.2 聚合分析\n这里也可以举一下例子。比如:对比一下mycle的group by,limit等功能点讲解。聚合的分类很多，可以抽几个进行讲解。\n4.3 应用场景\n1、记录和日志分析\n2、采集和组合公共数据\n3、全文搜索及个性化推荐\n4、事件数据和指标\n5、数据可视化\n5、Elasticsearch 极易上手且性能牛逼 主流的Java、python、ruby等。C++等也有个人开源维护API。\n可以借助他山之石，把其他公司的应用场景、对应的硬件资源、写入、查询、QPS等性能指标展示出来，凸显牛逼功能和性能。\n6、Elastic 前景光明 Elasticsearch在DBRanking 数据库排行榜搜索引擎部分近几年一直处于第一名的领先优势。\n基于Elastic的分布式、可扩展性、良好的性能，BAT、滴滴、美团、小米、华为、携程、360、有赞等几乎所有的主流互联网公司甚至婚庆网站的搜索引擎已经都已经转成ES了。\n那么咱们公司还在犹豫什么呢？\n7、Elastic技术社区非常活跃 这里主要强调，出了问题也不用怕，一个人搞不定，还有国外、国内官方论坛、社区，基本很短时间都能解决问题。\n交流的高效性、问题解决的速度、github迭代更新的速度。以及最近的版本更新的速度:比如7.0的发布，7.0的新特性。大家也会对新的特性充满期待。速度提升快。\n估计讲完这些大家都会跃跃欲试了。\n8、Elasticsearch 相对薄弱的环节 有所为，有所不为。\n8.1 多表关联\n不能简单认为，将mysql同步到Elasticsearch就能解决问题了。\n我们除了看到基于倒排索引Elasticsearch的全文检索的强大，也要看到Elasticsearch对于关系型数据库多表关联的支持相对薄弱，nested类型、Join类型的多表关联操作大数据场景下都会有性能问题。\n8.2 深度分页\n从性能角度考虑，Elasticsearch默认支持10000条数据的返回，除非修改maxresultwindow参数。\n也就是会出现越往后翻页越慢的情况。这点，补救方案：scroll+scroll_after实现。\n但是，更长远角度，建议：参考Google、百度的深度分页实现。\n8.3 实时性\nElasticsearch是近实时的系统，不是准实时。受限于：refresh_inteval设置，有最快1s延时。\n准实时要求高的场景，建议选型注意。\n9 小结 ELK远不止文章中提到的这些内容，可以说，以上列举的只是冰山一角的点，N多底层原理（索引分片原理、写入原理、检索原理、倒排索引原理、高可靠性原理、大数据实战场景等）都没有提及或展开。\n","permalink":"https://www.plbear.com/posts/how-to-get-started-with-elasticsearch-tutorial/","summary":"\u003cp\u003e如果你有机会在公司内部做一次Elasticsearch 技术分享，如何才能讲的逼格高，又接地气，那么建议从以下几个方面展开，大家有好的想法，也欢迎文章留言交流。\u003c/p\u003e","title":"如何高逼格的给同事做 Elasticsearch 技术分享"},{"content":"在计算机技术日新月异的今天， Docker 在国内发展的如火如荼。\n特别是在一线互联网公司 Docker 的使用是十分普遍的，甚至成为了一些企业面试的加分项，不信的话看看下面这张图。\n这是我在某招聘网站上看到的招聘 Java 开发工程师的招聘要求，其中有一条熟悉 Docker 成为了你快速入职的加分项，由此可见熟悉 Docker 在互联网公司的地位之重要。\n市面上已经有很多优秀的 Docker 教程，但是很多原理性的东西，笔者认为那些教程对初学者而言还是很难理解，感觉没有说清楚(笔者自己都觉得挺懵逼的)。\n为了让初学者少走弯路，我将以我的学习经历以及作为一个 CTF 的角度，编写此套教程，来带大家去了解并熟练运用 Docker 。\nDocker 是什么?\n说了这么多， Docker 到底是个什么东西呢?我们在理解 Docker 之前，首先得先区分清楚两个概念，容器和虚拟机。\n可能很多读者朋友都用过虚拟机，而对容器这个概念比较的陌生。我们用的传统虚拟机如 VMware ， VisualBox 之类的需要模拟整台机器包括硬件。\n每台虚拟机都需要有自己的操作系统，虚拟机一旦被开启，预分配给它的资源将全部被占用。\n每一台虚拟机包括应用，必要的二进制和库，以及一个完整的用户操作系统。\n而容器技术是和我们的宿主机共享硬件资源及操作系统，可以实现资源的动态分配。\n容器包含应用和其所有的依赖包，但是与其他容器共享内核。容器在宿主机操作系统中，在用户空间以分离的进程运行。\n容器技术是实现操作系统虚拟化的一种途径，可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。\n通过使用容器，我们可以轻松打包应用程序的代码、配置和依赖关系，将其变成容易使用的构建块，从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。\n容器可以帮助保证应用程序快速、可靠、一致地部署，其间不受部署环境的影响。\n容器还赋予我们对资源更多的精细化控制能力，让我们的基础设施效率更高。\n通过下面这幅图，我们可以很直观的反映出这两者的区别所在：\nDocker 属于 Linux 容器的一种封装，提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。\n而 Linux 容器是 Linux 发展出的另一种虚拟化技术，简单来讲， Linux 容器不是模拟一个完整的操作系统，而是对进程进行隔离，相当于是在正常进程的外面套了一个保护层。\n对于容器里面的进程来说，它接触到的各种资源都是虚拟的，从而实现与底层系统的隔离。\nDocker 将应用程序与该程序的依赖，打包在一个文件里面。运行这个文件，就会生成一个虚拟容器。\n程序在这个虚拟容器里运行，就好像在真实的物理机上运行一样。有了 Docker ，就不用担心环境问题。\n总体来说，Docker 的接口相当简单，用户可以方便地创建和使用容器，把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改，就像管理普通的代码一样。\nDocker 的优势\nDocker 相比于传统虚拟化方式具有更多的优势：\nDocker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。 Docker 需要的资源更少。Docker 在操作系统级别进行虚拟化，Docker 容器和内核交互，几乎没有性能损耗，性能优于通过 Hypervisor 层与内核层的虚拟化。 Docker 更轻量。Docker 的架构可以共用一个内核与共享应用程序库，所占内存极小。同样的硬件环境，Docker 运行的镜像数远多于虚拟机数量，对系统的利用率非常高。 与虚拟机相比，Docker 隔离性更弱。Docker 属于进程之间的隔离，虚拟机可实现系统级别隔离。 安全性。Docker 的安全性也更弱，Docker 的租户 Root 和宿主机 Root 等同，一旦容器内的用户从普通用户权限提升为 Root 权限，它就直接具备了宿主机的 Root 权限，进而可进行无限制的操作。 虚拟机租户 Root 权限和宿主机的 Root 虚拟机权限是分离的，并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术。\n这种隔离技术可以防止虚拟机突破和彼此交互，而容器至今还没有任何形式的硬件隔离，这使得容器容易受到攻击。\n可管理性。Docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具，例如 VMware vCenter 提供完备的虚拟机管理能力。 高可用和可恢复性。Docker 对业务的高可用支持是通过快速重新部署实现的。 虚拟化具备负载均衡，高可用，容错，迁移和数据保护等经过生产实践检验的成熟保障机制， VMware 可承诺虚拟机 99.999% 高可用，保证业务连续性。 快速创建、删除。虚拟化创建是分钟级别的，Docker 容器创建是秒级别的，Docker 的快速迭代性，决定了无论是开发、测试、部署都可以节约大量时间 交付、部署。虚拟机可以通过镜像实现环境交付的一致性，但镜像分发无法体系化。Docker 在 Dockerfile 中记录了容器构建过程，可在集群中实现快速分发和快速部署。 我们可以从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优势所在：\nDocker 的三个基本概念\n从上图我们可以看到，Docker 中包括三个基本的概念：\nImage(镜像) Container(容器) Repository(仓库) 镜像是 Docker 运行容器的前提，仓库是存放镜像的场所，可见镜像更是 Docker 的核心。\nImage(镜像)\n那么镜像到底是什么呢?Docker 镜像可以看作是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。\n镜像不包含任何动态数据，其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角，也许这个定义有些难以理解，下面的这张图能够帮助读者理解镜像的定义：\n从左边我们看到了多个只读层，它们重叠在一起。除了最下面一层，其他层都会有一个指针指向下一层。这些层是 Docker 内部的实现细节，并且能够在主机的文件系统上访问到。\n统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统，为这些层提供了一个统一的视角。\n这样就隐藏了多层的存在，在用户的角度看来，只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。\nContainer(容器)\n容器(Container)的定义和镜像(Image)几乎一模一样，也是一堆层的统一视角，唯一区别在于容器的最上面那一层是可读可写的。\n由于容器的定义并没有提及是否要运行容器，所以实际上，容器 = 镜像 + 读写层。\nRepository(仓库)\nDocker 仓库是集中存放镜像文件的场所。镜像构建完成后，可以很容易的在当前宿主上运行。\n但是， 如果需要在其他服务器上使用这个镜像，我们就需要一个集中的存储、分发镜像的服务，Docker Registry(仓库注册服务器)就是这样的服务。\n有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈，并不严格区分。\nDocker 仓库的概念跟 Git 类似，注册服务器可以理解为 GitHub 这样的托管服务。\n实际上，一个 Docker Registry 中可以包含多个仓库(Repository)，每个仓库可以包含多个标签(Tag)，每个标签对应着一个镜像。\n所以说，镜像仓库是 Docker 用来集中存放镜像文件的地方，类似于我们之前常用的代码仓库。\n通常，一个仓库会包含同一个软件不同版本的镜像，而标签就常用于对应该软件的各个版本 。\n我们可以通过\u0026lt;仓库名\u0026gt;:\u0026lt;标签\u0026gt;的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签，将以 Latest 作为默认标签。\n仓库又可以分为两种形式：\nPublic(公有仓库) Private(私有仓库) Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。\n一般这类公开服务允许用户免费上传、下载公开的镜像，并可能提供收费服务供用户管理私有镜像。\n除了使用公开服务外，用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像，可以直接使用做为私有 Registry 服务。\n当用户创建了自己的镜像之后就可以使用 Push 命令将它上传到公有或者私有仓库，这样下次在另外一台机器上使用这个镜像时候，只需要从仓库上 Pull 下来就可以了。\n我们主要把 Docker 的一些常见概念如 Image，Container，Repository 做了详细的阐述，也从传统虚拟化方式的角度阐述了 Docker 的优势。\n我们从下图可以直观地看到 Docker 的架构：\nDocker 使用 C/S 结构，即客户端/服务器体系结构。Docker 客户端与 Docker 服务器进行交互，Docker服务端负责构建、运行和分发 Docker 镜像。\nDocker 客户端和服务端可以运行在一台机器上，也可以通过 RESTful 、 Stock 或网络接口与远程 Docker 服务端进行通信。\n这张图展示了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud )，默认情况下 Docker 会在 Docker 中央仓库寻找镜像文件。\n这种利用仓库管理镜像的设计理念类似于 Git ，当然这个仓库是可以通过修改配置来指定的，甚至我们可以创建我们自己的私有仓库。\nDocker 的安装和使用\nDocker 的安装和使用有一些前提条件，主要体现在体系架构和内核的支持上。\n对于体系架构，除了 Docker 一开始就支持的 X86-64 ，其他体系架构的支持则一直在不断地完善和推进中。\nDocker 分为 CE 和 EE 两大版本。CE 即社区版，免费支持周期 7 个月;EE 即企业版，强调安全，付费使用，支持周期 24 个月。\n我们在安装前可以参看官方文档获取最新的 Docker 支持情况，官方文档在这里：\nh t t p s : / / d o c s . d o c k e r . c o m / i n s t a l l / Docker 对于内核支持的功能，即内核的配置选项也有一定的要求(比如必须开启 Cgroup 和 Namespace 相关选项，以及其他的网络和存储驱动等)。\nDocker 源码中提供了一个检测脚本来检测和指导内核的配置，脚本链接在这里：\nh t t p s : / / r a w . g i t h u b u s e r c o n t e n t . c o m / d o c k e r / d o c k e r / m a s t e r / c o n t r i b / c h e c k - c o n f i g . s h 在满足前提条件后，安装就变得非常的简单了。\nDocker CE 的安装请参考官方文档：\nMacOS：https://docs.docker.com/docker-for-mac/install/ Windows：https://docs.docker.com/docker-for-windows/install/ Ubuntu：https://docs.docker.com/install/linux/docker-ce/ubuntu/ Debian：https://docs.docker.com/install/linux/docker-ce/debian/ CentOS：https://docs.docker.com/install/linux/docker-ce/centos/ Fedora：https://docs.docker.com/install/linux/docker-ce/fedora/ 其他 Linux 发行版：https://docs.docker.com/install/linux/docker-ce/binaries/ 这里我们以 CentOS 7 作为演示。\n环境准备：\n阿里云服务器(1 核 2G，1M 带宽)\nCentOS 7.4 64 位\n由于 Docker-CE 支持 64 位版本的 CentOS 7 ，并且要求内核版本不低于 3.10，首先我们需要卸载掉旧版本的 Docker：\n$ d d d d d d d d d s o o o o o o o o o u c c c c c c c c c d k k k k k k k k k o e e e e e e e e e r r r r r r r r r y - - - - - - - - - u c c c l l l s e e m l l o a a o e n n i i m t t g l g g r e e m e e r i i i e n n o s s o n n n m t t n t t t u e e - - a x - v l \\ l t s e a e \\ e t g l d e r \\ i o s o n c t t u k a x e \\ t r e \\ \\ \\ 我们执行以下安装命令去安装依赖包：\n$ d l s e v u v m d i 2 o c e y - u m m a p i p n e s r t - a p l e l r s - i y s t y e u n m t - - u d t a i t l a s \\ \\ 这里我事先已经安装过了，所以提示我已经安装了最新版本：\n安装 Docker\nDocker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 Docker，只需要运行下面的 yum 命令：\n$ s u d o y u m i n s t a l l d o c k e r 当然在测试或开发环境中 Docker 官方为了简化安装流程，提供了一套便捷的安装脚本，CentOS 系统上可以使用这套脚本安装：\nc u r l - f s S L g e t . d o c k e r . c o m g e t - d o c k e r . s h s h g e t - d o c k e r . s h 具体可以参看 docker-install 的脚本：\nh t t p s : / / g i t h u b . c o m / d o c k e r / d o c k e r - i n s t a l l 执行这个命令后，脚本就会自动的将一切准备工作做好，并且把 Docker CE 的 Edge 版本安装在系统中。\n安装完成后，运行下面的命令，验证是否安装成功：\nd o c k e r v e r s i o n o r d o c k e r i n f o 返回 Docker 的版本相关信息，证明 Docker 安装成功：\n启动 Docker-CE：\n$ s u d o s y s t e m c t l e n a b l e d o c k e r $ s u d o s y s t e m c t l s t a r t d o c k e r Docker 的简单运用 Hello World\n由于服务器日常崩溃了， Docker 出了点问题，所以以下案例的演示是基于 Kali Linux 环境下进行的。\n我们通过最简单的 Image 文件 Hello World，感受一下 Docker 的魅力吧!\n我们直接运行下面的命令，将名为 hello-world 的 image 文件从仓库抓取到本地：\nd o c k e r p u l l l i b r a r y / h e l l o - w o r l d docker pull images 是抓取 image 文件，library/hello-world 是 image 文件在仓库里面的位置，其中 library 是 image 文件所在的组，hello-world 是 image 文件的名字。\n抓取成功以后，就可以在本机看到这个 image 文件了：\nd o c k e r i m a g e s 我们可以看到如下结果：\n现在，我们可以运行 hello-world 这个 image 文件：\nd o c k e r r u n h e l l o - w o r l d 我们可以看到如下结果：\n输出这段提示以后，hello world 就会停止运行，容器自动终止。有些容器不会自动终止，因为提供的是服务，比如 MySQL 镜像等。\n是不是很 Easy 呢?我们从上面可以看出，Docker 的功能是十分强大的，除此之外，我们还可以拉取一些 Ubuntu，Apache 等镜像，在未来的教程中我们将会一一提到。\nDocker 提供了一套简单实用的命令来创建和更新镜像，我们可以通过网络直接下载一个已经创建好了的应用镜像，并通过 Docker RUN 命令就可以直接使用。\n当镜像通过 RUN 命令运行成功后，这个运行的镜像就是一个 Docker 容器啦。\n容器可以理解为一个轻量级的沙箱，Docker 利用容器来运行和隔离应用，容器是可以被启动、停止、删除的，这并不会影响 Docker 镜像。\n我们可以看看下面这幅图：\nDocker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 Docker 命令行运行命令时，Docker 客户端将这些命令发送给服务器端，服务端将执行这些命令。\nDocker 命令使用 Docker API 。Docker 客户端可以与多个服务端进行通信。\n我们将剖析一下 Docker 容器是如何工作的，学习好 Docker 容器工作的原理，我们就可以自己去管理我们的容器了。\nDocker 架构\n在上面的学习中，我们简单地讲解了 Docker 的基本架构。了解到了 Docker 使用的是 C/S 结构，即客户端/服务器体系结构。\n明白了 Docker 客户端与 Docker 服务器进行交互时，Docker 服务端负责构建、运行和分发 Docker 镜像。\n知道了 Docker 客户端和服务端可以运行在一台机器上，我们可以通过 RESTful 、Stock 或网络接口与远程 Docker 服务端进行通信。\n我们从下图可以很直观的了解到 Docker 的架构：\nDocker 的核心组件包括：\nDocker Client Docker Daemon Docker Image Docker Registry Docker Container Docker 采用的是 Client/Server 架构。客户端向服务器发送请求，服务器负责构建、运行和分发容器。\n客户端和服务器可以运行在同一个 Host 上，客户端也可以通过 Socket 或 REST API 与远程的服务器通信。\n可能很多朋友暂时不太理解一些东西，比如 REST API 是什么东西等，不过没关系，在后面的文章中会一一给大家讲解清楚。\nDocker Client\nDocker Client ，也称 Docker 客户端。它其实就是 Docker 提供命令行界面(CLI)工具，是许多 Docker 用户与 Docker 进行交互的主要方式。\n客户端可以构建，运行和停止应用程序，还可以远程与 Docker_Host 进行交互。\n最常用的 Docker 客户端就是 Docker 命令，我们可以通过 Docker 命令很方便地在 Host 上构建和运行 Docker 容器。\nDocker Daemon\nDocker Daemon 是服务器组件，以 Linux 后台服务的方式运行，是 Docker 最核心的后台进程，我们也把它称为守护进程。\n它负责响应来自 Docker Client 的请求，然后将这些请求翻译成系统调用完成容器管理操作。\n该进程会在后台启动一个 API Server ，负责接收由 Docker Client 发送的请求，接收到的请求将通过 Docker Daemon 内部的一个路由分发调度，由具体的函数来执行请求。\n我们大致可以将其分为以下三部分：\nDocker Server Engine Job Docker Daemon 的架构如下所示：\nDocker Daemon 可以认为是通过 Docker Server 模块接受 Docker Client 的请求，并在 Engine 中处理请求，然后根据请求类型，创建出指定的 Job 并运行。\nDocker Daemon 运行在 Docker Host 上，负责创建、运行、监控容器，构建、存储镜像。\n运行过程的作用有以下几种可能：\n向 Docker Registry 获取镜像。 通过 graphdriver 执行容器镜像的本地化操作。 通过 networkdriver 执行容器网络环境的配置。 通过 execdriver 执行容器内部运行的执行工作。 由于 Docker Daemon 和 Docker Client 的启动都是通过可执行文件 Docker 来完成的，因此两者的启动流程非常相似。\nDocker 可执行文件运行时，运行代码通过不同的命令行 Flag 参数，区分两者，并最终运行两者各自相应的部分。\n启动 Docker Daemon 时，一般可以使用以下命令来完成：\nd d o o c c k k e e r r – - d d a = e m t o r n u e = t r u e d o c k e r – d 再由 Docker 的 main() 函数来解析以上命令的相应 Flag 参数，并最终完成 Docker Daemon 的启动。\n下图可以很直观地看到 Docker Daemon 的启动流程：\n默认配置下，Docker Daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求，需要在配置文件中打开 TCP 监听。\n我们可以照着如下步骤进行配置：\n①编辑配置文件/etc/systemd/system/multi-user.target.wants/docker.service，在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0，允许来自任意 IP 的客户端连接。\n②重启 Docker Daemon：\ns s y y s s t t e e m m c c t t l l d r a e e s m t o a n r - t r e d l o o c a k d e r . s e r v i c e ③我们通过以下命令即可实现与远程服务器通信：\nd o c k e r - H 服 务 器 I P 地 址 i n f o -H 是用来指定服务器主机，info 子命令用于查看 Docker 服务器的信息。\nDocker Image\nDocker 镜像可以看作是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。\n镜像不包含任何动态数据，其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板，通过它可以创建 Docker 容器。\n镜像有多种生成方法：\n从无到有开始创建镜像 下载并使用别人创建好的现成的镜像 在现有镜像上创建新的镜像 我们可以将镜像的内容和创建步骤描述在一个文本文件中，这个文件被称作 Dockerfile ，通过执行 docker build 命令可以构建出 Docker 镜像。\nDocker Registry\nDocker Registry 是存储 Docker Image 的仓库，它在 Docker 生态环境中的位置如下图所示：\n运行 docker push、docker pull、docker search 时，实际上是通过 Docker Daemon 与 Docker Registry 通信。\nDocker Container\nDocker 容器就是 Docker 镜像的运行实例，是真正运行项目程序、消耗系统资源、提供服务的地方。\nDocker Container 提供了系统硬件环境，我们可以使用 Docker Images 这些制作好的系统盘，再加上我们所编写好的项目代码，Run 一下就可以提供服务啦。\nDocker 组件是如何协作运行容器\n看到这里，我相信各位读者朋友们应该已经对 Docker 基础架构熟悉的差不多了，我们还记得运行的第一个容器吗?\n现在我们再通过 hello-world 这个例子来体会一下 Docker 各个组件是如何协作的。\n容器启动过程如下：\nDocker 客户端执行 docker run 命令。 Docker Daemon 发现本地没有 hello-world 镜像。 Daemon 从 Docker Hub 下载镜像。 下载完成，镜像 hello-world 被保存到本地。 Docker Daemon 启动容器。 具体过程可以看如下这幅演示图：\n我们可以通过 Docker Images 可以查看到 hello-world 已经下载到本地：\n我们可以通过 Docker Ps 或者 Docker Container ls 显示正在运行的容器，我们可以看到，hello-world 在输出提示信息以后就会停止运行，容器自动终止，所以我们在查看的时候没有发现有容器在运行。\n我们把 Docker 容器的工作流程剖析的十分清楚了，我们大体可以知道 Docker 组件协作运行容器可以分为以下几个过程：\nDocker 客户端执行 docker run 命令。 Docker Daemon 发现本地没有我们需要的镜像。 Daemon 从 Docker Hub 下载镜像。 下载完成后，镜像被保存到本地。 Docker Daemon 启动容器。 了解了这些过程以后，我们再来理解这些命令就不会觉得很突兀了，下面我来给大家讲讲 Docker 常用的一些命令操作吧。\nDocker 常用命令\n我们可以通过 docker -h 去查看命令的详细的帮助文档。在这里我只会讲一些日常我们可能会用的比较多的一些命令。\n例如，我们需要拉取一个 Docker 镜像，我们可以用如下命令：\nd o c k e r p u l l i m a g e _ n a m e image_name 为镜像的名称，而如果我们想从 Docker Hub 上去下载某个镜像，我们可以使用以下命令：\nd o c k e r p u l l c e n t o s : l a t e s t cento：lastest 是镜像的名称，Docker Daemon 发现本地没有我们需要的镜像，会自动去 Docker Hub 上去下载镜像，下载完成后，该镜像被默认保存到 /var/lib/docker 目录下。\n接着我们如果想查看主机下存在多少镜像，我们可以用如下命令：\nd o c k e r i m a g e s 我们要想知道当前有哪些容器在运行，我们可以用如下命令：\nd o c k e r p s - a -a 是查看当前所有的容器，包括未运行的。我们该如何去对一个容器进行启动，重启和停止呢?\n我们可以用如下命令：\nd d d o o o c c c k k k e e e r r r s r s t e t a s o r t p t a r c c t o o n n c t t o a a n i i t n n a e e i r r n _ _ e n n r a a _ m m n e e a / / m c c e o n n c t t o a a n i i t n n a e e i r r n _ _ e i i r d d _ i d 这个时候我们如果想进入到这个容器中，我们可以使用 attach 命令：\nd o c k e r a t t a c h c o n t a i n e r _ n a m e / c o n t a i n e r _ i d 那如果我们想运行这个容器中的镜像的话，并且调用镜像里面的 bash ，我们可以使用如下命令：\nd o c k e r r u n - t - i c o n t a i n e r _ n a m e / c o n t a i n e r _ i d / b i n / b a s h 那如果这个时候，我们想删除指定镜像的话，由于 Image 被某个 Container 引用(拿来运行)，如果不将这个引用的 Container 销毁(删除)，那 Image 肯定是不能被删除。\n我们首先得先去停止这个容器：\nd o c k e r p s d o c k e r s t o p c o n t a i n e r _ n a m e / c o n t a i n e r _ i d 然后我们用如下命令去删除这个容器：\nd o c k e r r m c o n t a i n e r _ n a m e / c o n t a i n e r _ i d 然后这个时候我们再去删除这个镜像：\nd o c k e r r m i i m a g e _ n a m e 此时，常用的 Docker 相关的命令就讲到这里为止了，我们在后续的文章中还会反复地提到这些命令。\nDockerfile 是什么\n前面我们已经提到了 Docker 的一些基本概念。以 CTF 的角度来看，我们可以去使用 Dockerfile 定义镜像，依赖镜像来运行容器，可以去模拟出一个真实的漏洞场景。\n因此毫无疑问的说， Dockerfile 是镜像和容器的关键，并且 Dockerfile 还可以很轻易的去定义镜像内容，说了这么多，那么 Dockerfile 到底是个什么东西呢?\nDockerfile 是自动构建 Docker 镜像的配置文件，用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 Linux 下的 Shell 命令。\n我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系：\n我们从上图中可以看到，Dockerfile 可以自定义镜像，通过 Docker 命令去运行镜像，从而达到启动容器的目的。Dockerfile 是由一行行命令语句组成，并且支持已 # 开头的注释行。\n一般来说，我们可以将 Dockerfile 分为四个部分：\n基础镜像(父镜像)信息指令 FROM。 维护者信息指令 MAINTAINER。 镜像操作指令 RUN 、EVN 、ADD 和 WORKDIR 等。 容器启动指令 CMD 、ENTRYPOINT 和 USER 等。 下面是一段简单的 Dockerfile 的例子：\nF W R E R O U X O R N P M K O D p S p I i E y R p t 5 h i 0 a n 0 n p s 0 : p t E 2 a N . l T 7 l R M Y A - P I r O N I T r N A e T I q N u [ E i \" R r p e y A m t n e h g n o e t n l s \" _ . ] K t C i x M t t D t y [ \" \u0026lt; a a p n p g . e p l y k \" i ] t t y 6 6 9 8 @ g m a i l . c o m \u0026gt; C O P Y . / a p p 我们可以分析一下上面这个过程：\n从 Docker Hub 上 Pull 下 Python 2.7 的基础镜像。 显示维护者的信息。 Copy 当前目录到容器中的 /App 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里 。 指定工作路径为 /App。 安装依赖包。 暴露 5000 端口。 启动 App。 这个例子是启动一个 Python Flask App 的 Dockerfile ( Flask 是 Python 的一个轻量的 Web 框架)，相信大家从这个例子中能够稍微理解了 Dockfile 的组成以及指令的编写过程。\nDockerfile 常用的指令\n根据上面的例子，我们已经差不多知道了 Dockerfile 的组成以及指令的编写过程，我们再来理解一下这些常用命令就会得心应手了。\n由于 Dockerfile 中所有的命令都是以下格式：INSTRUCTION argument ，指令(INSTRUCTION)不分大小写，但是推荐大写和 SQL 语句是不是很相似呢?下面我们正式来讲解一下这些指令集吧。\nFROM\nFROM 是用于指定基础的 images ，一般格式为 FROM or FORM :。\n所有的 Dockerfile 都应该以 FROM 开头，FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础，FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。\n可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。比如我们要指定 Python 2.7 的基础镜像，我们可以像如下写法一样：\nF R O M p y t h o n : 2 . 7 MAINTAINER\nMAINTAINER 是用于指定镜像创建者和联系方式，一般格式为 MAINTAINER 。\n这里我设置成我的 ID 和邮箱：\nM A I N T A I N E R A n g e l _ K i t t y \u0026lt; a n g e l k i t t y 6 6 9 8 @ g m a i l . c o m \u0026gt; COPY\nCOPY 是用于复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。\n当使用本地目录为源目录时，推荐使用 COPY 。一般格式为 COPY 。\n例如我们要拷贝当前目录到容器中的 /app 目录下，我们可以这样操作：\nC O P Y . / a p p WORKDIR\nWORKDIR 用于配合 RUN，CMD，ENTRYPOINT 命令设置当前工作路径。\n可以设置多次，如果是相对路径，则相对前一个 WORKDIR 命令。默认路径为/。一般格式为 WORKDIR /path/to/work/dir。\n例如我们设置 /app 路径，我们可以进行如下操作：\nW O R K D I R / a p p RUN\nRUN 用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层，原有的镜像不会有变化。一般格式为 RUN 。\n例如我们要安装 Python 依赖包，我们做法如下：\nR U N p i p i n s t a l l - r r e q u i r e m e n t s . t x t EXPOSE\nEXPOSE 命令用来指定对外开放的端口。一般格式为 EXPOSE [ \u0026hellip;]。\n例如上面那个例子，开放5000端口：\nE X P O S E 5 0 0 0 ENTRYPOINT\nENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT，如果有多个，则最后一个生效。\nENTRYPOINT 命令也有两种格式：\nENTRYPOINT [\u0026ldquo;executable\u0026rdquo;, \u0026ldquo;param1\u0026rdquo;, \u0026ldquo;param2\u0026rdquo;] ：推荐使用的 Exec 形式。 ENTRYPOINT command param1 param2 ：Shell 形式。 例如下面这个，我们要将 Python 镜像变成可执行的程序，我们可以这样去做：\nE N T R Y P O I N T [ \" p y t h o n \" ] CMD\nCMD 命令用于启动容器时默认执行的命令，CMD 命令可以包含可执行文件，也可以不包含可执行文件。\n不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个，然后 CMD 命令的参数就会作为 ENTRYPOINT 的参数。\nCMD 命令有三种格式：\nCMD [\u0026ldquo;executable\u0026rdquo;,\u0026ldquo;param1\u0026rdquo;,\u0026ldquo;param2\u0026rdquo;]：推荐使用的 exec 形式。 CMD [\u0026ldquo;param1\u0026rdquo;,\u0026ldquo;param2\u0026rdquo;]：无可执行程序形式。 CMD command param1 param2：Shell 形式。 一个 Dockerfile 中只能有一个 CMD，如果有多个，则最后一个生效。而 CMD 的 Shell 形式默认调用 /bin/sh -c 执行命令。\nCMD 命令会被 Docker 命令行传入的参数覆盖：docker run busybox /bin/echo Hello Docker 会把 CMD 里的命令覆盖。\n例如我们要启动 /app ，我们可以用如下命令实现：\nC M D [ \" a p p . p y \" ] 当然还有一些其他的命令，我们在用到的时候再去一一讲解一下。\n构建 Dockerfile\n我们大体已经把 Dockerfile 的写法讲述完毕，我们可以自己动手写一个例子：\nm c t k d o d u i s c r t h a s t D t i o a c c t _ k i w e c e r _ b f w i e l b e 然后 vi Dockerfile 开始编辑该文件，输入 i 开始编辑。以下是我们构建的 Dockerfile 内容：\nF M R R A U O I N M N T e n A c g I h i N o n E x R \u0026lt; A h n 1 g \u0026gt; e H l e _ l K l i o t , t y D o \u0026lt; c a k n e g r e ! l \u0026lt; k / i h t 1 t \u0026gt; y ' 6 6 9 8 / @ u g s m r a / i s l h . a c r o e m / \u0026gt; n g i n x / h t m l / i n d e x . h t m l 编辑完后按 esc 退出编辑，然后 ：wq写入，退出。\n我们在 Dockerfile 文件所在目录执行：\nd o c k e r b u i l d - t a n g e l k i t t y / n g i n x _ w e b : v 1 . 我们解释一下：\n-t 是为新镜像设置仓库和名称 angelkitty 为仓库名 nginx_web 为镜像名 ：v1 为标签(不添加为默认 latest ) 我们构建完成之后，使用 Docker Images 命令查看所有镜像，如果存在 REPOSITORY 为 Nginx 和 TAG 是 v1 的信息，就表示构建成功。\n接下来使用 docker run 命令来启动容器：\nd o c k e r r u n - n a m e n g i n x _ w e b - d - p 8 0 8 0 : 8 0 a n g e l k i t t y / n g i n x _ w e b : v 1 这条命令会用 Nginx 镜像启动一个容器，命名为 nginx_web ，并且映射了 8080 端口。\n这样我们可以用浏览器去访问这个 Nginx 服务器：http://localhost:8080/ 或者 http://本机的 IP 地址：8080/，页面返回信息：\n","permalink":"https://www.plbear.com/posts/awesome-docker-get-start/","summary":"\u003cp\u003e在计算机技术日新月异的今天， Docker 在国内发展的如火如荼。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"这可能是最为详细的Docker入门吐血总结\" loading=\"lazy\" src=\"http://p1.pstatp.com/large/pgc-image/1540437482919069761a6bf\"\u003e\u003c/p\u003e\n\u003cp\u003e特别是在一线互联网公司 Docker 的使用是十分普遍的，甚至成为了一些企业面试的加分项，不信的话看看下面这张图。\u003c/p\u003e","title":"这可能是最为详细的Docker入门吐血总结"},{"content":"电子交易的一个很基本的问题，就是避免用户下重复订单。用户明明想买一次，结果一看下了两个单。如果没有及时发现，就会带来额外的物流成本和扯皮。对商家的信誉也不好看。\n从技术上看，这是一个分布式一致性问题；但实际上，技术无法100%解决这类问题，得结合多种手段综合处理。这里就来说道说道。\n为啥会下重了呢？ 原因1：客户端bug\n比如下单的按键在点按之后，在没有收到服务器请求之前，按键的状态没有设为已禁用状态，还可以被按。又或者，在触摸屏下，用户手指的点按可能被手机操作系统识别为多次点击。\n嗯，谁能保证客户端不偶尔出个什么bug 呢。\n原因2: 超时\n用户的设备与服务器之间可能是不稳定的网路。这样一个下单请求过去，返回不一定回得来。超时最大的问题是: 从用户的角度，他无法确定下单的请求是还没到服务器，还是已经到了服务器但是返回丢失了。——用户无法区分到底这个单下了还是没下。\n这样在等待一个超时后，UI可能会提示用户下单超时，请重复再试。\n原因3: 用户的App闪退/人工强退，之后重新打开重新下单\n也许可以使用一些技术手段避免用户下重单，但是心急的用户可能会重启流程/重启App/重启手机。在这种强制的手段下，任何技术手段都会失效——用户压根就不让你的技术执行，你怎么玩？\n在这些条件下，如何避免用户多下了一笔订单呢？\n用幂等防止重复订单 在技术方面，这是一个分布式一致性的问题，即客户端和服务器端对某个订单是否成功/失败达成一致。防止重单的关键是使用一个由客户端生成的，可用于避免重复的key，俗称dedup key（deduplicate key之意）。这个key可以用任意可以保证全局唯一性的方式生成，比如uuid。客户端和服务器需要使用这个dedup key作为串联条件，一起解决去重问题。\n客户端的流程 客户端需要实现这样一个下单界面。用户点击【确认下单】时，应该产生一个独一无二的dedup key，连定订单数据发送给服务器端。在服务器返回之前，该界面应该一直等待，直到服务器响应成功/失败或者超时发生（比如15秒后，收不到服务器响应）。如果超时发生，应该向用户提示是否重试下单或者退出该界面。当用户点击【重试】时，应该用刚刚生成的dedup key来再次发送下单请求——如果用户一直不退出这个流程，每次用户点击重试，都应该用这个dedup key来重试下单，直到服务器正常返回，或者用户放弃返回。\n下单的客户端流程\n后端数据表设计 后端在订单数据表中，需要增加dedup_key这列，并设置唯一约束。\nc ) r # d # u ; e e n a d i t u q e p u _ e t k a e u b y n l i e v q a _ o r d r c e d h d e a u r r p ( ( _ 6 k 0 e ) y ( n d o e t d u n p u _ l k l e y c ) o m m e n t ' k e y t o p r e t e n d o r d e r d u p l i c a t i o n ' , 下单的实现 在实现下单逻辑时，基于该dedup_key实现一个\u0026quot;create-or-get\u0026quot;语义的下单接口——简单说就是\n如果带有指定dedup_key的订单已经存在，则直接返回；否则，用该dedup_key下单。\n用伪代码表示大概是：\n@ O } T r t S O o r } O o r } } r d r t r r e r r e a e y r d d t c d d t c n r i e e u a i e e u a h s { n r r r t f r r r t a a c g . n c . n c n c r o s h d o s h l t e o r e o ( u r e o d i a r d t r U p d t r ( e o t d e D d n l e D d E n e e r u e i i r u e x o a O r p r q c p r c t l r I = l ; u a = l ; e h d d i e t i p e e g c K e g c t r r = e a e d e a i ( t t y t t o e I c O e V o O e n r n r r d i r r d r t e d ( o d d ( e o e a e f l e e t ) r g t r a a r r r s e e B l t B u { r O y s i h y e a r I e o a D ) n u d d ) n s e ; d s e ( ; E d e r o x e u r r ( r c x p o I u d e i K l d s e p s e l , e r t t y b r I i e ( a S I d o d d c t d ) n e k r , ; d i e u t n p ) p r g r K a { e n p d r y s r C e ) a o o a ; c d d d t C e i o , o o d r n e a d , m e o r D u e n f c t r i , o m m a d l e d u b a p m K o e u y n ) t ; , S t r i i n n s g e r d t e d a u p n K e e w y ) o r { d e r 这时，这段下单代码总是能返回一个订单（除非发生一些DB挂了之类的错误），要么是新创建的，要么就是一个已经存在的单。注意，最好在订单里增加一个属性（比如例子中用“duplicated”）来表示这个订单是这次新生成的，还是因为幂等而直接返回的。这样前端可以有针对性的对这两种情况提示不同的文案。\n技术搞定幂等就足够了吗？ 上面的流程没有考虑一种情况，就是用户中途强制退出客户端，或者直接点击【返回】回到产品页，重新走下单流程。这个时候客户端就无法判断用户到底是想重新下单，还是想第二次下单。此时，可以从产品设计上考虑一下。\n比如，在客户端缓存一个表，记录所有没有确认结果的订单。\n产品代码 产品数量 金额 dedup key 未确认订单1 AAA 1 1000 xxx-yyy-zzz 未确认订单2 BBB 2 500.00 Aaa-bbb-ccc \u0026hellip; 通过这个表，我们可以猜一下用户的意图。比如，如果用户重新提交了一笔订单，其产品代码、金额与表中记录的某条完全一致，就可以提示一下用户:\n提示一下用户是不是下重了\n如果用户想重试，可以继续用表中对应记录的dedup key重新发起下单。\n这样不是绝对准确的，仅仅是尽量的减少用户误操作的可能性。当然，在产品设计上可以能出于用户交互简化，不一定真的会这样做。这就需要其他机制来配合，比如“通知”。\n通知 一旦服务器下单成功，可以通过某种通知机制（如APNS、Websocket）主动将订单推送至客户端，强行让客户端重新拉取最新的订单信息，并配合“未确认订单”表，以通知Badge/弹框等方式提示用户刚刚一笔状态未知的订单成功/失败了。\n另外一种手段就是，服务器端实时扫描用户的下单数据，一旦发现可能的重单，就立刻通知客服主动联系用户，及时处理问题。\n如果还拦不住…… 经过层层阻拦，可能还是会有用户误操作，直到收到两份商品才发现下重了。此时就得依靠运营/客服的支持了。提供用户申诉的手段，让用户提出哪些订单是重复的，并且由销售系统店家、商品提供者和买家三方共同根据用户操作的记录来协商如何处理。我们需要让技术帮助让这种人工处理的几率尽量小。因为每次处理都会耗费较大的人工成本，和一些运营费用（比如赔款、小礼品等等）。\n这么麻烦，有必要吗？ 这要分业务场景，对于很多电商来讲可能不是必要的。因为从用户下单到订单被审核处理进入到发货阶段需要一定的时间（可能是半小时～1小时），并且一定是支付成功后才会开始进行下一步流程。在这个时间段，用户大概率能从网络错误中恢复过来，自行区分是否下重了。配合客服主动提示，会极大的降低出问题的概率。\n但是对于理财服务来说，这种去重就非常必要了。因为\n“下单+支付”。用户购买理财往往是“下单+支付”一起执行，不可以单独下单/单独支付 用户的入金可能很大。例如数万，数十万 准确性丢失。如果一旦下重了，有可能影响用户的投资资金配置的准确性。 撤销难。部分理财产品存在下单不可撤销的问题；或者即便撤销，资金也无法立刻回款。等到回款，可能这个购入机会就错过去了。例如对于基金交易，错过1个交易日，价格就会发生变动。 基于这些特性，在理财产品中，就要竭尽全力的去重。\n结论 以上所讲是处理重复订单问题的一般方法。你可以注意到，无论多么好的技术，也不可能100%的拦截所有的可能性，必须依靠技术+产品设计+运营支持的综合手段才能解决这类问题。\n另外，本文还没涉及到关于订单支付（支付也可能重复哦）带来的进一步的复杂性，也没有讨论在高并发情况下的性能优化，仅仅讨论下单本身的问题。所以可以想象一下现实中的交易业务比这里的说的要复杂得多。\n本文介绍的原理也不仅仅适用于防止下重复订单，而是可以应用到任何**需要“创建一个不应该重复资源”**的场景，比如“向用户发一条通知”，“触发一次不能重复的批处理任务！\n","permalink":"https://www.plbear.com/posts/jia-gou-cheng-chang-zhi-lu-fen-bu-shi-miao-sha-xi-tong-zhi-ru-he-fang-zhi-dan-ge-yong-hu-chong-fu-miao-sha-xia-dan/","summary":"\u003cp\u003e电子交易的一个很基本的问题，就是避免用户下重复订单。用户明明想买一次，结果一看下了两个单。如果没有及时发现，就会带来额外的物流成本和扯皮。对商家的信誉也不好看。\u003c/p\u003e","title":"架构成长之路：分布式秒杀系统之如何防止单个用户重复秒杀下单？"},{"content":"游戏化思维\n下一篇\n### Hello World\n","permalink":"https://www.plbear.com/posts/roleplayinglife/","summary":"\u003cp\u003e\u003ca href=\"https://i.plbear.com/tag/gamification/\"\u003e游戏化思维\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下一篇\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://i.plbear.com/post/about/\"\u003e### Hello World\u003c/a\u003e\u003c/p\u003e","title":"Gamification"},{"content":"最近，在国外著名的stackexchange网站上出现了一个有趣的问题，有人问：西方的程序员眼里，东方的程序员是什么样的？他描述道：\n世界的东方（印度/中国/菲律宾）是西方（美国/欧洲）的主要软件外包服务提供者。\n你是否有过与这种离岸外包团队合作的经历？如果有，感觉如何？\n你对这些来自东方的程序员有没有一些总结性的看法和观点(比如：他们是否合作，是否能按时提交代码，写出的程序是否有质量？)。依据是什么？\n读者的回复很踊跃，其中一个被顶的最高的回答是关于印度人的，回答中他说一个印度分包商给他们开发了一个组件，他认为这 是他接触过的最恐怖的程序，里面最大的一个文件体积超过600KB，大概有3万多行。他向上天乞求希望自己永远不需要去维护这样的代码。这位答复者说他在 印度生活了3个月，发现东方人和西方人在文化上的差异很大，印度人很勤奋，但常常却不能把事情做对。印度人里有个根深蒂固的文化，就是从不说no，他说即 使你到副食品商店里要求买一条毯子，店主也会说“是，先生，稍等一会”，然后派一个小孩到外面商店把东西买回来。这虽然在生意上是好的做法，但未必适用于 做软件开发。\n另外一个回复是关于俄国人的，同样，他觉得这些俄国人写的代码顶多当作原型来使用，最终都会被丢掉，不能用。\n我找了很久，终于在帖子的最底部发现一个关于中国程序员的回复，不过内容非常的有趣：\n到现在，我在中国已经待了2年多一点时间了(我是个加拿大人)，跟中国的开发人员一起共事你会感到非常的奇特。我敢说上面这些关于东方的程序员的总结都是正确的，至少对于中国人是这样的。我遇到的/一起共事的大多数开发人员基本属于这种情况：\n**缺少上进心和创造性。**这里我并不想说他们很差劲或愚蠢。也许更可能是一种文化。在历史上他们就有一种官本位和 崇尚权威的传统。于是他们对来自“上面”的糟糕的设计从不提出疑议。同样，他们更多的是关注技术技巧，而忽略业务领域知识。我费力九牛二虎之力教他们模式 和各种抽象概念，直到他们能应用这些东西到他们手头的任务中。然而，过不了多久，就像是决堤的洪水，他们竟然肆无忌惮的挑战权威，至少在技术层面上是这样 的，我可不想弄得签证被撤销。;-)\n磨擦前面这个问题说过，但我要强调一下。这也许是最重要的一个问题，是产生中国开发人员跟这里的海外同事(这里是加拿大人)共事时产生紧张关系的原因。通常， 我在这里共事的西方人会特意的夸大跟东方人共事时东方人的一些不好的方面。我这些加拿大同事对人友好但在代码审查时极其的苛刻。如果发现这些中国程序员一 个小失误或没有使用好的编写方法，他们就是发脾气、大呼小叫。但当他们自己被礼貌的要求也按照这种要求完成他们自己的任务时，他们也会发脾气、大呼小叫。\n牺牲中国人并不以介意使用蹩脚的二手器械。我坐坏了三把椅子后才终于要了一把稍微舒服一点的椅子。可是当我坐上这把较好的椅子后，突然感觉不是很好，因为看到 这些中国人仍然坐在好像是中世纪那么原始的椅子上。然而，等我访问了这家公司的总部后，我发现这里的程序员的一张桌子就有我们4～6个人的团队的占地面积 那么大，更别提他们的椅子了！\n在起初，他们编写的程序并不是很好。这当然是文化上产生的裂痕，但这也是开始时糟糕的系统设计产生的很陡的学习曲线造成的。但你们知道吗，两年之后，这个系统中一些最优秀的模块都是出自中国公司。于是这就更加明显的导致了双方程序员的磨擦加剧…\n坦白的说，这几年走过来不容易，以个人经验判断事情的趋势，我认为对这个问题的看法是正确的。\n做为一个中国人，对于西方人对我们的看法和观点，我觉得不需要去急着找他们的论点漏洞进行反驳。你可感到到他们对东方人的不满是一种普遍弥漫的气氛，俗话说，苍蝇不叮无缝的蛋，我们应该还是先从自身找问题，有则改之，无则加勉。\n","permalink":"https://www.plbear.com/posts/zai-xi-fang-de-cheng-xu-yuan-yan-li-dong-fang-de-cheng-xu-yuan-shi-shi-me-yang-de/","summary":"\u003cp\u003e最近，在国外著名的stackexchange网站上出现了一个有趣的问题，有人问：西方的程序员眼里，东方的程序员是什么样的？他描述道：\u003c/p\u003e\n\u003cp\u003e世界的东方（印度/中国/菲律宾）是西方（美国/欧洲）的主要软件外包服务提供者。\u003c/p\u003e","title":"在西方的程序员眼里，东方的程序员是什么样的？"}]