March 24, 2016
golang的json操作
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;encoding/json\u0026#34;\n \u0026#34;fmt\u0026#34;\n \u0026#34;os\u0026#34;\n)\n\ntype ConfigStruct struct {\n Host string `json:\u0026#34;host\u0026#34;`\n Port int `json:\u0026#34;port\u0026#34;`\n AnalyticsFile string `json:\u0026#34;analytics_file\u0026#34;`\n StaticFileVersion int `json:\u0026#34;static_file_version\u0026#34;`\n StaticDir string `json:\u0026#34;static_dir\u0026#34;`\n TemplatesDir string `json:\u0026#34;templates_dir\u0026#34;`\n SerTcpSocketHost …\u003c/code\u003e\u003c/pre\u003e"
March 23, 2016
golang中的md5的用法
"\u003cp\u003e代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;crypto/md5\u0026#34;\n\t\u0026#34;encoding/hex\u0026#34;\n\t\u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n\t// md5 加密的第一种方法\n\tsrcData := []byte(\u0026#34;iyannik0215\u0026#34;)\n\tcipherText1 := md5.Sum(srcData)\n\tfmt.Printf(\u0026#34;md5 encrypto is \u0026#34;iyannik0215\u0026#34;: %x n\u0026#34;, cipherText1)\n\n\t// md5 加密的第二种方法\n\thash := md5.New()\n\thash.Write(srcData)\n\tcipherText2 := hash.Sum(nil)\n\thexText := make([]byte, 32)\n\thex.Encode(hexText, cipherText2)\n\tfmt.Println(\u0026#34;md5 encrypto is \u0026#34;iyannik0215\u0026#34;:\u0026#34;, …\u003c/code\u003e\u003c/pre\u003e"
March 21, 2016
如何优雅的在 koa 中处理错误
"\u003cp\u003e\u003ca href=\"http://taobaofed.org/blog/2016/03/18/error-handling-in-koa/\"\u003ehttp://taobaofed.org/blog/2016/03/18/error-handling-in-koa/\u003c/a\u003e\u003c/p\u003e"
March 21, 2016
koa中生成器函数generator执行顺序详解
"\u003cp\u003e\u003cstrong\u003eES6的generator\u003c/strong\u003e \u003ca href=\"http://book.apebook.org/minghe/koa-action/co/start.html\"\u003ehttp://book.apebook.org/minghe/koa-action/co/start.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\nfunction* gen() {\n var a = yield \u0026#39;start\u0026#39;;\n console.log(a);\n var b = yield \u0026#39;end\u0026#39;;\n console.log(b);\n return \u0026#39;over\u0026#39;;\n}\nvar it = gen();\nconsole.log(it.next()); // {value: \u0026#39;start\u0026#39;, done: false}\nconsole.log(it.next(22)); // 22 {value: \u0026#39;end\u0026#39;, done: false}\nconsole.log(it.next(333)); // 333 {value: \u0026#39;over\u0026#39;, done: true}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e带有 \u003ccode\u003e*\u003c/code\u003e 的函数声明表示是一个 generator 函数,当执行 \u003ccode\u003egen()\u003c/code\u003e 时,函数体内的代码并没有执行, …\u003c/p\u003e"
March 15, 2016
给一个正在运行的Docker容器动态添加Volume(转)
"\u003cp\u003e之前有人问我Docker容器启动之后还能否再挂载卷,考虑mnt命名空间的工作原理,我一开始认为这很难实现。不过现在我认为是它实现的。\u003c/p\u003e\n\u003cp\u003e简单来说,要想将磁盘卷挂载到正在运行的容器上,我们需要:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用\u003ca href=\"https://github.com/jpetazzo/nsenter\"\u003ensenter\u003c/a\u003e将包含这个磁盘卷的整个文件系统mount到临时挂载点上;\u003c/li\u003e\n\u003cli\u003e从我们想当作磁盘卷使用的特定文件夹中创建绑定挂载(bind mount)到这个磁盘卷的位置;\u003c/li\u003e\n\u003cli\u003eumount第一步创建的临时挂载点。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"注意事项\"\u003e\u003cstrong\u003e注意事项\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e在下面的示例中,我故意包含了$符号来表示这是Shell命令行提示符,以帮助大家区分哪些是你需要输入的,哪些是机器回复的。有一些多行命令,我也继续用\u0026gt;。我知道这样使得例子里的命令无法轻易得被拷贝粘贴。如果你想要拷贝粘贴代码,请查看文章最后的示例脚本。\u003c/p\u003e\n\u003ch4 id=\"详细步骤\"\u003e\u003cstrong\u003e详细步骤\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e下面示例的前提是你已经使用如下命令启动了一个简单的名为charlie的容器:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker run --name charlie -ti ubuntu bash\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们需要做的是将宿主文件夹 \u003ccode\u003e/home/jpetazzo/Work/DOCKER/docker\u003c/code\u003e 挂载到容器里的 \u003ccode\u003e/src\u003c/code\u003e 目录。好了,让我们开始吧。 …\u003c/p\u003e"
March 12, 2016
node出现“dyld: bad external relocation length”的解决办法
"\u003cp\u003emac下有时候在执行 npm的过程中,我们强制中止了操作或者一些命令出现问题会提示“dyld: bad external relocation length”这个错误,这个时候只要将未下载完的文件删除即可,我这里使用 n 4.4.3下载的时候,网络出现异常,提示这个错误,只要删除 /usr/local/n/versions/node/4.4.3 这个目录即可。\u003c/p\u003e\n\u003cp\u003e如果还是不行的话,可以试着执行一下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew doctor\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e命令,根据提示操作就可以了。\u003c/p\u003e\n\u003cp\u003e我遇到的情况是使用node版本控制n安装新版本号的时候,好像安装包下载的不完整,但提示安装成功了,在最后提示这个错误。试了好多方法卸载重装也不行,最后根据 brew doctor 的提示,执行了\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew link --overwrite node\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e彻底解决了。\u003c/p\u003e"
March 12, 2016
nodejs中package.json文件说明
"\u003cp\u003e推荐: \u003ca href=\"http://jingpin.jikexueyuan.com/article/34254.html\"\u003ehttp://jingpin.jikexueyuan.com/article/34254.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epackage.json 中包含各种所需模块以及项目的配置信息(名称、版本、许可证等)meta 信息。\u003c/p\u003e\n\u003cp\u003epackage.json文件可以通过npm init 来创建\u003c/p\u003e\n\u003ch4 id=\"包含可配置项\"\u003e包含可配置项\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ename 名称\u003c/li\u003e\n\u003cli\u003e应用描述 description\u003c/li\u003e\n\u003cli\u003e版本号 version\u003c/li\u003e\n\u003cli\u003e应用的配置项 config\u003c/li\u003e\n\u003cli\u003e作者 author\u003c/li\u003e\n\u003cli\u003e资源仓库地址 respository\u003c/li\u003e\n\u003cli\u003e授权方式 licenses\u003c/li\u003e\n\u003cli\u003e目录 directories\u003c/li\u003e\n\u003cli\u003e应用入口文件 main\u003c/li\u003e\n\u003cli\u003e命令行文件 bin\u003c/li\u003e\n\u003cli\u003e项目应用运行依赖模块 dependencies\u003c/li\u003e\n\u003cli\u003e项目应用开发环境依赖 devDependencies\u003c/li\u003e\n\u003cli\u003e运行引擎 engines\u003c/li\u003e\n\u003cli\u003e脚本 script\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e简单模式\u003c/p\u003e\n\u003cp\u003e==========================\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\n name: \u0026#34;myApp\u0026#34;,\n\n version :\u0026#34;0.0.1\u0026#34;\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e完整模式\u003c/p\u003e\n\u003cp\u003e===========================\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\n \u0026#34;name\u0026#34;: …\u003c/code\u003e\u003c/pre\u003e"
March 12, 2016
windows平台下的PHP的线程安全版本与非线程安全版本的区别
"\u003cp\u003eWindows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分(Linux/Unit平台没有这个概念的东西的),这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。\u003c/p\u003e\n\u003cp\u003ePHP有2中运行方式:\u003cstrong\u003eISAPI\u003c/strong\u003e和\u003cstrong\u003eFastCGI\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;\u003c/p\u003e\n\u003cp\u003e而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。\u003c/p\u003e\n\u003cp\u003e对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。\u003c/p\u003e\n\u003cp\u003e1.\u003cstrong\u003eNon Thread Safe\u003c/strong\u003e版本php适用在使用CGI以及fastCGI的web服务器上,如nginx,lighttpd以及IIS的CGI模式下\u003c/p\u003e\n\u003cp\u003e2. …\u003c/p\u003e"
March 12, 2016
PHP底层工作原理
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/03/51de416caaddc.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2016/03/51de416caaddc.png\" alt=\"51de416caaddc\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从图上可以看出,php从下到上是一个4层体系\u003c/p\u003e\n\u003cp\u003e①Zend引擎\u003c/p\u003e\n\u003cp\u003eZend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、 实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend 实现。\u003c/p\u003e\n\u003cp\u003e②Extensions\u003c/p\u003e\n\u003cp\u003e围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过 extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析 就是extension的典型应用)。\u003c/p\u003e\n\u003cp\u003e③Sapi\u003c/p\u003e\n\u003cp\u003eSapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过 sapi成功的将php本身和上层应用解耦隔离,php可以不 …\u003c/p\u003e"
March 10, 2016
NPM 命令介绍(转)
"\u003cp\u003eNPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e允许用户从NPM服务器下载别人编写的第三方包到本地使用。\u003c/li\u003e\n\u003cli\u003e允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。\u003c/li\u003e\n\u003cli\u003e允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 **“npm -v” **来测试是否成功安装。命令如下,出现版本提示表示安装成功:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ npm -v\n2.3.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo npm install npm -g\n/usr/local/bin/npm -\u0026gt; /usr/local/lib/node_modules/npm/bin/npm-cli.js\[email protected] /usr/local/lib/node_modules/npm\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果是 Window 系统使用以下命令即可:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install npm -g\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"使用-npm-命令安装模块\"\u003e使用 npm 命令安装模块\u003c/h2\u003e\n\u003cp\u003enpm …\u003c/p\u003e"
March 10, 2016
nodejs学习资料
"\u003cp\u003e修改npm包管理器的registry( \u003ca href=\"http://registry.npmjs.org/\"\u003eregistry.npmjs.org\u003c/a\u003e)为淘宝镜像( \u003ca href=\"http://npm.taobao.org\"\u003enpm.taobao.org\u003c/a\u003e),参考nam config -h 相关命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm config set registry “https://registry.npm.taobao.org“\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"http://npm.taobao.org\"\u003ehttp://npm.taobao.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e七天学会NodeJS \u003ca href=\"http://nqdeng.github.io/7-days-nodejs/\"\u003ehttp://nqdeng.github.io/7-days-nodejs/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNode.js Style Guide \u003ca href=\"https://github.com/dead-horse/node-style-guide\"\u003ehttps://github.com/dead-horse/node-style-guide\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e深入Node.js的模块机制 \u003ca href=\"http://www.infoq.com/cn/articles/nodejs-module-mechanism/\"\u003ehttp://www.infoq.com/cn/articles/nodejs-module-mechanism/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e学习ES6生成器(Generator) \u003ca href=\"http://www.toobug.net/article/learning_es6_generator.html\"\u003ehttp://www.toobug.net/article/learning_es6_generator.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003erequire() 源码解读 \u003ca href=\"http://www.ruanyifeng.com/blog/2015/05/require.html\"\u003ehttp://www.ruanyifeng.com/blog/2015/05/require.html …\u003c/a\u003e\u003c/p\u003e"
March 10, 2016
nodejs中exports与module.exports的区别
"\u003cp\u003e对于两者的理解只要记住一句话:“\u003cstrong\u003eexports就是module.exports****的引用\u003c/strong\u003e”即可。\u003c/p\u003e\n\u003cp\u003e推荐易理解的文档: \u003ca href=\"http://cnodejs.org/topic/5231a630101e574521e45ef8\"\u003ehttp://cnodejs.org/topic/5231a630101e574521e45ef8\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文:\u003c/p\u003e\n\u003cp\u003e你肯定非常熟悉nodejs模块中的\u003cstrong\u003eexports\u003c/strong\u003e对象,你可以用它创建你的模块。例如:(假设这是rocker.js文件)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexports.name = function() {\n console.log(\u0026#39;My name is Lemmy Kilmister\u0026#39;);\n};\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在另一个文件中你这样引用\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar rocker = require(\u0026#39;./rocker.js\u0026#39;);\nrocker.name(); // \u0026#39;My name is Lemmy Kilmister\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e那到底\u003cstrong\u003eModule.exports\u003c/strong\u003e是什么呢?它是否合法呢?\u003c/p\u003e\n\u003cp\u003e其实,\u003cstrong\u003e\u003ccode\u003eModule.exports\u003c/code\u003e\u003cstrong\u003e才是真正的接口,\u003cstrong\u003eexports\u003c/strong\u003e只不过是它的一个辅助工具。 最终返回给调用的是\u003c/strong\u003e\u003ccode\u003eModule.exports\u003c/code\u003e\u003cstrong\u003e而不是\u003c/strong\u003eexports。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e所有的\u003cstrong\u003eexports\u003c/strong\u003e收集到的属 …\u003c/p\u003e"
March 7, 2016
Node.js框架比较: Express vs. Koa vs. Hapi
"\u003cp\u003e\u003ca href=\"http://www.nodejs.net/a/20141223/191626.html\"\u003ehttp://www.nodejs.net/a/20141223/191626.html\u003c/a\u003e \u003ca href=\"http://www.zhihu.com/question/25388201\"\u003ehttp://www.zhihu.com/question/25388201\u003c/a\u003e \u003ca href=\"https://cnodejs.org/topic/56936889c2289f51658f0926\"\u003ehttps://cnodejs.org/topic/56936889c2289f51658f0926\u003c/a\u003e\u003c/p\u003e"
February 23, 2016
jQuery.extend和jQuery.fn.extend的区别-转
"\u003cp\u003ejQuery.extend和jQuery.fn.extend的区别,其实从这两个办法本身也就可以看出来。很多地方说的也不详细。这里详细说说之间的区别.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e我们先把jQuery看成了一个类,这样好理解一些。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ejQuery.extend(),是扩展的jQuery这个类。\u003c/p\u003e\n\u003cp\u003e假设我们把jQuery这个类看成是人类,能吃饭能喝水能跑能跳,现在我们用jQuery.extend这个方法给这个类拓展一个能唱歌的技能。这样的话,不论是男人,女人,xx人…..等能继承这个技能(方法)了。\u003c/p\u003e\n\u003cp\u003e可以如下图这样写着:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/jquery-1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jquery-1.png\" alt=\"jquery-1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e然后:$.liu();这样就能打印出来”liu“这个字符串\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码在下面:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/jquery-2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jquery-2.png\" alt=\"jquery-2\"\u003e\u003c/a\u003e 3. 这说明啥啊,这说明.liu()变成了jQuery这个类本身的方法(object)嘛。他现在能”唱歌“了。但是吧,这个能力啊,只有代表全人类的 jQuery 这个类本身,才能用啊。你个人想用,你张三李四王五麻六,你个小草民能代表全人类嘛?\u003c/p\u003e\n\u003cp\u003e所以啊,这个扩展也就是所谓的静态方法。只跟这个 类 本身有关。跟你具体的实例化对象是没关系滴。\u003c/p\u003e\n\u003cp\u003e我们再看看jQuery.fn.extend()这个方法。\u003c/p\u003e\n\u003cp\u003e从字面理解嘛,这个拓展 …\u003c/p\u003e"
February 23, 2016
Git-svn命令对比表,svn用户必看
"\u003cp\u003e提供给从svn转git的开发人员参考\u003c/p\u003e\n\u003cp\u003eGit与Subversion的命令对比表\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003e操作\u003c/strong\u003e\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003eGIT\u003c/strong\u003e\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003eSUBVERSION\u003c/strong\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e复制数据仓库\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit clone\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn checkout\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e提交\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit commit\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn commit\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e查看提交的详细记录\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit show\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn cat\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认状态\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit status\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn status\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认差异\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit diff\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn diff\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认记录\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"