-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbloogle.json
1 lines (1 loc) · 54.9 KB
/
bloogle.json
1
{"description":"bloogle sitemap","type":"hexo","contentType":"markdown","meta":{"title":"cmlanche","subtitle":"金鳞岂是池中物","description":null,"author":"cmlanche","url":"http://www.cmlanche.com","root":"/"},"posts":[{"id":"f061b8f051a003ee64bfb21140acb372","rawpath":"raw/f061b8f051a003ee64bfb21140acb372.json","title":"健康才是福,工作和生活的心态要平衡","date":1555246964000,"updated":1555308348000,"path":"2019/04/14/健康才是福,工作和生活的心态要平衡/","link":"","permalink":"http://www.cmlanche.com/2019/04/14/健康才是福,工作和生活的心态要平衡/","excerpt":"<p>今天一早8点,肾结石突发,疼死我了,急忙跑到医院打针吃药,下午终于有点好转,感谢生命!但是基本上一坐下来就疼,只能站着。</p>","categories":[],"tags":[{"name":"生活","slug":"生活","permalink":"http://www.cmlanche.com/tags/生活/"}]},{"id":"f29562d350c87e0f160f9ac592d51c40","rawpath":"raw/f29562d350c87e0f160f9ac592d51c40.json","title":"gradle构建appium-uiautomator2-server出现gradle版本不匹配","date":1555043491000,"updated":1555308362000,"path":"2019/04/12/gradle构建appium-uiautomator2-server出现gradle版本不匹配/","link":"","permalink":"http://www.cmlanche.com/2019/04/12/gradle构建appium-uiautomator2-server出现gradle版本不匹配/","excerpt":"<p>在克隆代码:<a href=\"https://github.com/appium/appium-uiautomator2-server\" target=\"_blank\" rel=\"noopener\">appium-uiautomator2-server</a>后,按照说明文档README.md中所说,进行构建</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"code\"><pre><span class=\"line\">gradle clean assembleE2ETestDebug assembleE2ETestDebugAndroidTest</span><br></pre></td></tr></table></figure>","categories":[],"tags":[{"name":"appium","slug":"appium","permalink":"http://www.cmlanche.com/tags/appium/"},{"name":"uiautomator2","slug":"uiautomator2","permalink":"http://www.cmlanche.com/tags/uiautomator2/"},{"name":"appium-uiautomator2-server","slug":"appium-uiautomator2-server","permalink":"http://www.cmlanche.com/tags/appium-uiautomator2-server/"}]},{"id":"06e516be1e70bc9f2f679556b9d27e07","rawpath":"raw/06e516be1e70bc9f2f679556b9d27e07.json","title":"给Appium内置系统对话框自动处理 - appium-uiautomator2-driver篇","date":1554973340000,"updated":1555054854000,"path":"2019/04/11/给Appium内置系统对话框自动处理---appium-uiautomator2-driver篇/","link":"","permalink":"http://www.cmlanche.com/2019/04/11/给Appium内置系统对话框自动处理---appium-uiautomator2-driver篇/","excerpt":"<p>欢迎关注我的Appium知乎专栏:<a href=\"https://zhuanlan.zhihu.com/custom-appium\" target=\"_blank\" rel=\"noopener\">自定义Appium之路</a></p>\n<p>当appium脚本的uiautomationName设置为UiAutomator2时,就会启动appium-uiautomator2-driver这个driver来执行你的脚本测试,而它的系统对话框的处理跟UIAutomator1的就不一样了,更加复杂一点。</p>\n<p>因为UIAutomator2是一个apk形式的,本身可以认为是一个应用,是需要安装的,所以在启动UIAutomator2之前,就会碰到系统对话框的问题,此时,我们需要借助UIAutomator1来做这件事。</p>","categories":[],"tags":[{"name":"appium","slug":"appium","permalink":"http://www.cmlanche.com/tags/appium/"}]},{"id":"69974b90323f1e9ec5cd28d725aebdfe","rawpath":"raw/69974b90323f1e9ec5cd28d725aebdfe.json","title":"自定义系统框处理 – 有哪些方法?","date":1554970822000,"updated":1554978368000,"path":"2019/04/11/自定义系统框处理-–-有哪些方法?/","link":"","permalink":"http://www.cmlanche.com/2019/04/11/自定义系统框处理-–-有哪些方法?/","excerpt":"<p>系统框处理流程有哪些方法?</p>","categories":[],"tags":[]},{"id":"643c623bbd6be034a0209bcd682d97d9","rawpath":"raw/643c623bbd6be034a0209bcd682d97d9.json","title":"appium的技术架构","date":1554967767000,"updated":1554978374000,"path":"2019/04/11/appium的技术架构/","link":"","permalink":"http://www.cmlanche.com/2019/04/11/appium的技术架构/","excerpt":"<p>欢迎关注我的Appium知乎专栏:<a href=\"https://zhuanlan.zhihu.com/custom-appium\" target=\"_blank\" rel=\"noopener\">自定义Appium之路</a></p>\n<p>appium是基于nodejs来打包、发布的,也用它来管理各个driver,如下图所示,它的结构图如下:</p>","categories":[],"tags":[{"name":"appium","slug":"appium","permalink":"http://www.cmlanche.com/tags/appium/"}]},{"id":"a8b33cd061ee5c262840fe45885f9958","rawpath":"raw/a8b33cd061ee5c262840fe45885f9958.json","title":"给 Appium 内置系统对话框处理吧!appium-android-driver 篇","date":1554967126000,"updated":1554978351000,"path":"2019/04/11/Appium的UIAutomator1的自定义权限框处理/","link":"","permalink":"http://www.cmlanche.com/2019/04/11/Appium的UIAutomator1的自定义权限框处理/","excerpt":"<p>欢迎关注我的Appium知乎专栏:<a href=\"https://zhuanlan.zhihu.com/custom-appium\" target=\"_blank\" rel=\"noopener\">自定义Appium之路</a></p>\n<p>当Appium脚本中的uiautomationName设置为UiAutomator1时,会启动UIAutomator1的Driver来测试你的Appium脚本,在脚本之前之前,会有很多权限框弹出,此时就需要我们的UIAutomator1来自动处理这样的对话框,并且要在安装apk之前就启动UIAutomator1的服务。</p>\n<p>很不幸,appium的代码中,是先安装Appium Setting APK和被测应用的,那怎么改呢?</p>","categories":[],"tags":[{"name":"appium","slug":"appium","permalink":"http://www.cmlanche.com/tags/appium/"},{"name":"uiautomator","slug":"uiautomator","permalink":"http://www.cmlanche.com/tags/uiautomator/"}]},{"id":"cbbbe3158984f19ba956dfdd6c9552fd","rawpath":"raw/cbbbe3158984f19ba956dfdd6c9552fd.json","title":"独立开发者的开放心态:帮助他人,其实就是在帮你自己!","date":1554951679000,"updated":1554978382000,"path":"2019/04/11/Open心态/","link":"","permalink":"http://www.cmlanche.com/2019/04/11/Open心态/","excerpt":"","categories":[],"tags":[{"name":"独立开发者","slug":"独立开发者","permalink":"http://www.cmlanche.com/tags/独立开发者/"}]},{"id":"c745f86b35729152c68288520b8dd4cb","rawpath":"raw/c745f86b35729152c68288520b8dd4cb.json","title":"appium怎么本地执行、调试","date":1554791794000,"updated":1554967486000,"path":"2019/04/09/appium怎么本地执行、调试/","link":"","permalink":"http://www.cmlanche.com/2019/04/09/appium怎么本地执行、调试/","excerpt":"<p>欢迎关注我的Appium知乎专栏:<a href=\"https://zhuanlan.zhihu.com/custom-appium\" target=\"_blank\" rel=\"noopener\">自定义Appium之路</a></p>\n<h3 id=\"本地执行\"><a href=\"#本地执行\" class=\"headerlink\" title=\"本地执行\"></a>本地执行</h3><p>通常的执行方式是:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span> 下载npm库中的appium</span><br><span class=\"line\">npm i -g appium </span><br><span class=\"line\"><span class=\"meta\">#</span> 启动appium服务器</span><br><span class=\"line\">appium</span><br></pre></td></tr></table></figure>\n<p>但如果是本地appium代码怎么执行呢?请看如下shell脚本</p>","categories":[],"tags":[]},{"id":"b29724f5773be726c66739cc588d0ad2","rawpath":"raw/b29724f5773be726c66739cc588d0ad2.json","title":"怎么证明你买的域名是你的?","date":1554379179000,"updated":1554380659000,"path":"2019/04/04/怎么证明你买的域名是你的/","link":"","permalink":"http://www.cmlanche.com/2019/04/04/怎么证明你买的域名是你的/","excerpt":"<p>这是我的”独立开发者”微信群中网友问的,我之前还从来没想过这个问题,自认为买了就是我的。</p>\n<p><img src=\"https://cmlanche-1251406926.cos.ap-guangzhou.myqcloud.com/blog/yy68o.png\" alt=\"1\"></p>\n<p><img src=\"https://cmlanche-1251406926.cos.ap-guangzhou.myqcloud.com/blog/lcil0.png\" alt=\"2\"></p>\n<p>但仔细一想,其实这件事没有那么简单,比如我在阿里云万网买了域名,我可以对这个域名做任何操作,然而这个操作是建立在阿里云这个平台上的,也就是说,阿里云也可以随时强制收回这个域名,可以强制更改这个域名的所有者,可以禁用转移等,也就是说,你买了的这个域名,真正的所有者是这个平台,是阿里云!</p>","categories":[],"tags":[{"name":"域名","slug":"域名","permalink":"http://www.cmlanche.com/tags/域名/"}]},{"id":"1973e6835242605c0004df71a03cc284","rawpath":"raw/1973e6835242605c0004df71a03cc284.json","title":"初步成功自定义Appium","date":1554111368000,"updated":1554202338000,"path":"2019/04/01/初步成功自定义Appium/","link":"","permalink":"http://www.cmlanche.com/2019/04/01/初步成功自定义Appium/","excerpt":"<h1 id=\"改造appium-android-driver\"><a href=\"#改造appium-android-driver\" class=\"headerlink\" title=\"改造appium-android-driver\"></a>改造appium-android-driver</h1><p>这个driver是UIAutomator1的driver,负责UIAutomator1的服务启动、停止、命令接收和执行。</p>\n<h3 id=\"工程结构\"><a href=\"#工程结构\" class=\"headerlink\" title=\"工程结构\"></a>工程结构</h3><ul>\n<li>appium-android-driver(NodeJS工程)<ul>\n<li>bootstrap(Maven工程)</li>\n</ul>\n</li>\n</ul>\n<p>本身appium-android-driver是一个nodejs工程,它还套着一个bootstrap的maven工程,这个maven工程就是用来打包UIAutomator1的,会再bootstrap/bin的目录下构建生成一个叫AppiumBootstrap.jar的供外层的NodeJS工程使用。代码在<code>appium-android-driver/lib/bootstrap.js</code>的start函数中</p>","categories":[],"tags":[{"name":"appium,自定义Appium","slug":"appium-自定义Appium","permalink":"http://www.cmlanche.com/tags/appium-自定义Appium/"}]},{"id":"1d9ecfa6ec8f3578fcc09a32031609b4","rawpath":"raw/1d9ecfa6ec8f3578fcc09a32031609b4.json","title":"主机排行网重大更新,移动端自适应","date":1554022524000,"updated":1554026141000,"path":"2019/03/31/主机排行网重大更新,移动端自适应/","link":"","permalink":"http://www.cmlanche.com/2019/03/31/主机排行网重大更新,移动端自适应/","excerpt":"<p>此前有网友反馈,<a href=\"https://hostingranking.cn/\" target=\"_blank\" rel=\"noopener\">主机排行网</a>在移动端表现太丑了,希望我改改,今天周末,我专门花了两个多小时来好好把移动短整治了一下,比以前好看多了。</p>\n<h3 id=\"对比改变\"><a href=\"#对比改变\" class=\"headerlink\" title=\"对比改变\"></a>对比改变</h3><p>对比一下吧,下图是前版本的主机排行网:</p>\n<p><img src=\"https://cmlanche-1251406926.cos.ap-guangzhou.myqcloud.com/blog/d9fyk.gif\" alt=\"hostingranking-old-mobile\"></p>","categories":[],"tags":[]},{"id":"69bb0496dc98bcba87cd2bc278c20ff4","rawpath":"raw/69bb0496dc98bcba87cd2bc278c20ff4.json","title":"我也来碎碎念 - 主机排行网运营一个月小结","date":1553828419000,"updated":1553940598000,"path":"2019/03/29/我也来碎碎念/","link":"","permalink":"http://www.cmlanche.com/2019/03/29/我也来碎碎念/","excerpt":"<h3 id=\"我也来碎碎念-主机排行网运营一个月小结\"><a href=\"#我也来碎碎念-主机排行网运营一个月小结\" class=\"headerlink\" title=\"我也来碎碎念 - 主机排行网运营一个月小结\"></a>我也来碎碎念 - 主机排行网运营一个月小结</h3><blockquote>\n<p>学习<a href=\"https://toolinbox.net\" target=\"_blank\" rel=\"noopener\">iPic作者Jason</a>每周一的碎碎念,我也来碎碎念了,只有我有新的想法灵感,我就会立马记录下来,不管内容有多少。</p>\n</blockquote>\n<p>今天要总结一下我的产品:主机排行网 <a href=\"https://hostingranking.cn\" target=\"_blank\" rel=\"noopener\">HostingRanking.cn</a></p>","categories":[],"tags":[{"name":"碎碎念","slug":"碎碎念","permalink":"http://www.cmlanche.com/tags/碎碎念/"},{"name":"主机排行网","slug":"主机排行网","permalink":"http://www.cmlanche.com/tags/主机排行网/"}]},{"id":"27da0068000658094d2d630919927012","rawpath":"raw/27da0068000658094d2d630919927012.json","title":"我的最佳写作方式","date":1551148633000,"updated":1551398555000,"path":"2019/02/26/我的最佳写作方式/","link":"","permalink":"http://www.cmlanche.com/2019/02/26/我的最佳写作方式/","excerpt":"<p>最近喜欢上了写作,喜欢自己写的东西能被别人阅读,赞赏,也希望我写的东西能更有价值,体验也更好。</p>\n<p>今天我分享的是我的最佳写作方式。</p>\n<h1 id=\"我的最佳写作方式\"><a href=\"#我的最佳写作方式\" class=\"headerlink\" title=\"我的最佳写作方式\"></a>我的最佳写作方式</h1><p>工具汇总</p>\n<table>\n<thead>\n<tr>\n<th>markdown编辑器</th>\n<th>截图工具</th>\n<th>gif录制工具</th>\n<th>图床工具</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Typora</td>\n<td>QQ / wechat</td>\n<td>licecap</td>\n<td>iPic</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"markdown编辑器-·-Typora\"><a href=\"#markdown编辑器-·-Typora\" class=\"headerlink\" title=\"markdown编辑器 · Typora\"></a>markdown编辑器 · Typora</h3><p>完全免费的markdown编辑器,无与伦比的写作体验,让人爱不释手,具体的特性请移步官网:<a href=\"https://typora.io/\" target=\"_blank\" rel=\"noopener\">https://typora.io/</a></p>\n<p>我最常用的快捷键是<kbd>Command</kbd>+<kbd>/</kbd>,可以切换源码模式和打字机模式。</p>","categories":[],"tags":[{"name":"写作方式","slug":"写作方式","permalink":"http://www.cmlanche.com/tags/写作方式/"}]},{"id":"57aeba9a53eb56e00c086fc71f1dafff","rawpath":"raw/57aeba9a53eb56e00c086fc71f1dafff.json","title":"CSDN、博客园等6大技术博客平台的写作体验测评","date":1551080318000,"updated":1552392755000,"path":"2019/02/25/CSDN、博客园等6大技术博客平台的写作体验测评/","link":"","permalink":"http://www.cmlanche.com/2019/02/25/CSDN、博客园等6大技术博客平台的写作体验测评/","excerpt":"<h1 id=\"功能对比\"><a href=\"#功能对比\" class=\"headerlink\" title=\"功能对比\"></a>功能对比</h1><p><img src=\"https://cmlanche-1251406926.cos.ap-guangzhou.myqcloud.com/blog/kgs2s.png\" alt=\"QQ20190312-201125@2x\"></p>","categories":[],"tags":[{"name":"评测","slug":"评测","permalink":"http://www.cmlanche.com/tags/评测/"},{"name":"csdn","slug":"csdn","permalink":"http://www.cmlanche.com/tags/csdn/"},{"name":"博客园","slug":"博客园","permalink":"http://www.cmlanche.com/tags/博客园/"}]},{"id":"081198a01ad0dfe0e93b1e911e006ffe","rawpath":"raw/081198a01ad0dfe0e93b1e911e006ffe.json","title":"面试题·HashMap和Hashtable的区别(转载再整理)","date":1551065209000,"updated":1551163271000,"path":"2019/02/25/HashMap和Hashtable的区别(转)/","link":"","permalink":"http://www.cmlanche.com/2019/02/25/HashMap和Hashtable的区别(转)/","excerpt":"<blockquote>\n<p>原文链接: <a href=\"http://javarevisited.blogspot.hk/2010/10/difference-between-hashmap-and.html\" target=\"_blank\" rel=\"noopener\">Javarevisited</a> 翻译: <a href=\"http://www.importnew.com/\" target=\"_blank\" rel=\"noopener\">ImportNew.com </a>- <a href=\"http://www.importnew.com/author/tangxiaojuan\" target=\"_blank\" rel=\"noopener\">唐小娟</a><br>译文链接: <a href=\"http://www.importnew.com/7010.html\" target=\"_blank\" rel=\"noopener\">http://www.importnew.com/7010.html</a></p>\n</blockquote>\n<p>HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。</p>\n<p>这篇文章中,我们不仅将会看到HashMap和Hashtable的区别,还将看到它们之间的相似之处。</p>","categories":[],"tags":[{"name":"hashmap","slug":"hashmap","permalink":"http://www.cmlanche.com/tags/hashmap/"},{"name":"hashtable","slug":"hashtable","permalink":"http://www.cmlanche.com/tags/hashtable/"},{"name":"面试题","slug":"面试题","permalink":"http://www.cmlanche.com/tags/面试题/"}]},{"id":"225a6154aece337de78b0805543e1596","rawpath":"raw/225a6154aece337de78b0805543e1596.json","title":"hostingranking.cn·基于ghost的轻量技术架构整理","date":1550986805000,"updated":1552446173000,"path":"2019/02/24/hostingranking.cn技术架构/","link":"","permalink":"http://www.cmlanche.com/2019/02/24/hostingranking.cn技术架构/","excerpt":"<blockquote>\n<p>本篇纯粹只讲<a href=\"https://hostingranking.cn\" target=\"_blank\" rel=\"noopener\">hostingranking.cn</a>网站的技术架构,也就是怎么做到的,达到什么效果。至于它是什么,为什么要做暂且不说,另篇会分享。</p>\n</blockquote>\n<h3 id=\"技术组成\"><a href=\"#技术组成\" class=\"headerlink\" title=\"技术组成\"></a>技术组成</h3><p>首先hostingranking.cn是基于ghost博客平台而构建的,ghost最强大的部分就是可以最大限度的让你DIY网站,能力特别强。如下是技术组成图:</p>\n<p><img src=\"https://cmlanche-1251406926.cos.ap-guangzhou.myqcloud.com/blog/o6rge.png\" alt=\"image-20190224143748243\"></p>\n<h3 id=\"技术讲解\"><a href=\"#技术讲解\" class=\"headerlink\" title=\"技术讲解\"></a>技术讲解</h3><table>\n<thead>\n<tr>\n<th></th>\n<th>运行环境</th>\n<th>用途</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Ghost</td>\n<td>Nodejs</td>\n<td>博客平台,可供主题创作的环境,博客管理,SEO等一系列可插拔的功能</td>\n</tr>\n<tr>\n<td>JQuery</td>\n<td>Javascript</td>\n<td>前端js交互</td>\n</tr>\n<tr>\n<td>handlebar</td>\n<td>-</td>\n<td>网页模板</td>\n</tr>\n<tr>\n<td>spring boot</td>\n<td>java</td>\n<td>提供后端服务,连接第三方服务</td>\n</tr>\n<tr>\n<td>typeform</td>\n<td></td>\n<td>第三方问卷调查服务</td>\n</tr>\n<tr>\n<td>mailchimp</td>\n<td></td>\n<td>第三方邮件服务</td>\n</tr>\n</tbody>\n</table>","categories":[],"tags":[{"name":"hostingranking.cn","slug":"hostingranking-cn","permalink":"http://www.cmlanche.com/tags/hostingranking-cn/"},{"name":"技术架构","slug":"技术架构","permalink":"http://www.cmlanche.com/tags/技术架构/"}]},{"id":"100597616ffc423b7981e7385f4b0dc4","rawpath":"raw/100597616ffc423b7981e7385f4b0dc4.json","title":"程序员的微创业","date":1550970010000,"updated":1552446535000,"path":"2019/02/24/微创业/","link":"","permalink":"http://www.cmlanche.com/2019/02/24/微创业/","excerpt":"<p><img src=\"https://cmlanche-1251406926.cos.ap-guangzhou.myqcloud.com/blog/zgc28.jpg\" alt=\"v2-6cea99c48c9aa053b6bd6bbcd70f3631_hd\"></p>\n<p>不知道有没有觉得程序员是吃青春饭的;</p>\n<p>有没有发现很多公司的招聘需求上写着35岁以上不要;</p>\n<p>有没有发现一转眼都已奔三,却依旧一事无成,无房无车;</p>\n<h3 id=\"怎么办?\"><a href=\"#怎么办?\" class=\"headerlink\" title=\"怎么办?\"></a>怎么办?</h3><p>我想过创业,我也创业过,15年的时候和同学一块做人脸识别,种种原因最后没成功,此前两年的积蓄也清零,创业?人家都说是九死一生,我说就是,在你没有足够人脉钱脉的时候你去创业,无异于以卵击石。</p>\n<p>程序员是吃请青春饭的,因为这个行业加班最严重,年轻人不断涌上,没时间谈恋爱,谈了恋爱的不敢结婚,结婚的不敢生孩子,生孩子了也不能自己养,要爸妈带,中国现在社会就是这样,年轻人压力巨大,上有老下有小,奔三的我感觉鸭梨山大。</p>\n<p>既然不能创业那就好好工作,把工作的事情做好,我也觉得,但是2018年底都知道大裁员,公司也未必是可靠的,如果你没有足够好的技能和其他的收入傍身,最后哭的怎么不会是你?</p>","categories":[],"tags":[{"name":"程序员","slug":"程序员","permalink":"http://www.cmlanche.com/tags/程序员/"},{"name":"微创业","slug":"微创业","permalink":"http://www.cmlanche.com/tags/微创业/"}]},{"id":"0e78645e8c70784eb0e6072b233388bf","rawpath":"raw/0e78645e8c70784eb0e6072b233388bf.json","title":"安装指定版本的node的方法","date":1548249559000,"updated":1550969469000,"path":"2019/01/23/安装指定版本的node/","link":"","permalink":"http://www.cmlanche.com/2019/01/23/安装指定版本的node/","excerpt":"","categories":[],"tags":[{"name":"nodejs","slug":"nodejs","permalink":"http://www.cmlanche.com/tags/nodejs/"}]},{"id":"a6d655241076ba55c1c0ba8df9b1bb52","rawpath":"raw/a6d655241076ba55c1c0ba8df9b1bb52.json","title":"开闭原则","date":1544410857000,"updated":1551163205000,"path":"2018/12/10/开闭原则/","link":"","permalink":"http://www.cmlanche.com/2018/12/10/开闭原则/","excerpt":"<h1 id=\"再谈开闭原则\"><a href=\"#再谈开闭原则\" class=\"headerlink\" title=\"再谈开闭原则\"></a>再谈开闭原则</h1><p>最开始了解设计模式之开闭原则是在6年前,那个时候我还是在校大学生,我是读《设计模式之禅》了解到它的。开闭原则是说,对扩展开发,对修改关闭,当时我看书的时候还不太了解它的含义,只知道这是设计模式最重要的原则,其他5大原则(如最小接口原则、迪米特原则、里式替换原则等)都是为了更好的实现开闭原则而总结出来的一套方法论,而书中说的23大设计模式都是基于这些模式的实践。</p>\n<p>今天我又一次感受到了开闭原则的牛逼,我感受到,它不仅仅可以用在实际的代码编写上,对整个系统的架构都有指导借鉴意义。</p>","categories":[],"tags":[{"name":"开闭原则","slug":"开闭原则","permalink":"http://www.cmlanche.com/tags/开闭原则/"},{"name":"设计模式","slug":"设计模式","permalink":"http://www.cmlanche.com/tags/设计模式/"}]},{"id":"d9631df1365983dec696e6f44009769b","rawpath":"raw/d9631df1365983dec696e6f44009769b.json","title":"面基","date":1535280067000,"updated":1550969819000,"path":"2018/08/26/面基青春无罪/","link":"","permalink":"http://www.cmlanche.com/2018/08/26/面基青春无罪/","excerpt":"","categories":[],"tags":[{"name":"面基","slug":"面基","permalink":"http://www.cmlanche.com/tags/面基/"}]},{"id":"196ce9ed56916458d52f59c864d7b67c","rawpath":"raw/196ce9ed56916458d52f59c864d7b67c.json","title":"制作ghost主题","date":1535260564000,"updated":1551163256000,"path":"2018/08/26/制作ghost主题/","link":"","permalink":"http://www.cmlanche.com/2018/08/26/制作ghost主题/","excerpt":"<h3 id=\"以开发模式启动ghost\"><a href=\"#以开发模式启动ghost\" class=\"headerlink\" title=\"以开发模式启动ghost\"></a>以开发模式启动ghost</h3><figure class=\"highlight shell\"><table><tr><td class=\"code\"><pre><span class=\"line\">cd yourghostpath</span><br><span class=\"line\">ghost start --development</span><br><span class=\"line\"><span class=\"meta\">#</span> 如果你已经启动了ghost,但不是开发模式,你可以用ghost stop来结束ghost</span><br></pre></td></tr></table></figure>\n<h3 id=\"建立主题目录\"><a href=\"#建立主题目录\" class=\"headerlink\" title=\"建立主题目录\"></a>建立主题目录</h3><p>首先主题的开发环境是nodejs,所以要我们要先用nodejs构建一个项目,比如我们的项目是example:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"code\"><pre><span class=\"line\">cd yourghostpath/content/themes</span><br><span class=\"line\">mkdir example</span><br><span class=\"line\">cd example</span><br><span class=\"line\">npm init</span><br></pre></td></tr></table></figure>\n<p>按照提示建立好基本的package.json,ghost主题最少的要求是有2个文件:index.hbs和post.hbs,这里hbs文件是<a href=\"https://themes.ghost.org/docs/handlebars\" target=\"_blank\" rel=\"noopener\">handlerbars</a>文件,它是一个模板引擎,而ghost只支持用handlerbars,所以掌握handlerbars很重要,其实也不难,关键是要了解怎么传递值的。<br>目录和文件建立好了,主题就算完成了,虽然一句代码都没有,但他确实能够正常运转!</p>","categories":[],"tags":[{"name":"ghost","slug":"ghost","permalink":"http://www.cmlanche.com/tags/ghost/"},{"name":"ghost主题","slug":"ghost主题","permalink":"http://www.cmlanche.com/tags/ghost主题/"}]},{"id":"b42cc20d727d9a4f4d9ee99e119a5520","rawpath":"raw/b42cc20d727d9a4f4d9ee99e119a5520.json","title":"工作无非是温水煮青蛙","date":1535100625000,"updated":1535101070000,"path":"2018/08/24/温水煮青蛙/","link":"","permalink":"http://www.cmlanche.com/2018/08/24/温水煮青蛙/","excerpt":"","categories":[],"tags":[]},{"id":"acccc7632e9726a5529a11336e1e8166","rawpath":"raw/acccc7632e9726a5529a11336e1e8166.json","title":"令人绝望的UIAutomator WebView自动化测试","date":1534503720000,"updated":1534684283000,"path":"2018/08/17/令人绝望的UIAutomator-WebView自动化测试/","link":"","permalink":"http://www.cmlanche.com/2018/08/17/令人绝望的UIAutomator-WebView自动化测试/","excerpt":"","categories":[],"tags":[{"name":"UIAutomator吐槽","slug":"UIAutomator吐槽","permalink":"http://www.cmlanche.com/tags/UIAutomator吐槽/"}]},{"id":"fa14e3f1ae5ffb4e1956e90404682432","rawpath":"raw/fa14e3f1ae5ffb4e1956e90404682432.json","title":"Android自动化·细数UIAutomator的坑·UIAutomator渲染WebView控件树在不同手机上的差异","date":1534157431000,"updated":1534158574000,"path":"2018/08/13/Android自动化·细数UIAutomator的坑·控件树在不同手机上的差异/","link":"","permalink":"http://www.cmlanche.com/2018/08/13/Android自动化·细数UIAutomator的坑·控件树在不同手机上的差异/","excerpt":"<p>我想只有<a href=\"https://testin.cn\" target=\"_blank\" rel=\"noopener\">Testin云测</a>才会遇到这样的问题,云测的自动化技术是要抹掉手机的差异性的,就是说一套脚本可以在不同的手机产商不同的手机版本上成功运行,而云测会遇到很多很多各种各样因为手机产商与版本的差异导致脚本不兼容的问题,而今天我讲的是最近发现的UIAutomator在WebView控件树渲染在不同手机上的差异。</p>\n<p>Testin云测已跨越自动化测试的万水千山,欢迎来测!</p>","categories":[],"tags":[{"name":"Android自动化","slug":"Android自动化","permalink":"http://www.cmlanche.com/tags/Android自动化/"},{"name":"细数UIAutomator的坑","slug":"细数UIAutomator的坑","permalink":"http://www.cmlanche.com/tags/细数UIAutomator的坑/"}]},{"id":"0ed05b87949777c38b4959dcc22788ed","rawpath":"raw/0ed05b87949777c38b4959dcc22788ed.json","title":"android自动化研发日志 - 细数UIAutomator缺点 - 1.0和2.0的区别","date":1534151886000,"updated":1534157343000,"path":"2018/08/13/android自动化研发日志---细数UIAutomator缺点---关于版本的吐槽/","link":"","permalink":"http://www.cmlanche.com/2018/08/13/android自动化研发日志---细数UIAutomator缺点---关于版本的吐槽/","excerpt":"","categories":[],"tags":[{"name":"android自动化测试","slug":"android自动化测试","permalink":"http://www.cmlanche.com/tags/android自动化测试/"},{"name":"细数UIAutomator缺点","slug":"细数UIAutomator缺点","permalink":"http://www.cmlanche.com/tags/细数UIAutomator缺点/"}]},{"id":"6e09a14b2f72a624645214955cd25279","rawpath":"raw/6e09a14b2f72a624645214955cd25279.json","title":"你真的了解java的lambda吗?- java lambda用法与源码分析","date":1532223852000,"updated":1532334106000,"path":"2018/07/22/lambda用法与源码分析/","link":"","permalink":"http://www.cmlanche.com/2018/07/22/lambda用法与源码分析/","excerpt":"<h1 id=\"用法\"><a href=\"#用法\" class=\"headerlink\" title=\"用法\"></a>用法</h1><h3 id=\"示例:最普遍的一个例子,执行一个线程\"><a href=\"#示例:最普遍的一个例子,执行一个线程\" class=\"headerlink\" title=\"示例:最普遍的一个例子,执行一个线程\"></a>示例:最普遍的一个例子,执行一个线程</h3><figure class=\"highlight java\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">new</span> Thread(() -> System.out.print(<span class=\"string\">\"hello world\"</span>)).start();</span><br></pre></td></tr></table></figure>\n<p><code>-></code>我们发现它指向的是<code>Runnable</code>接口</p>\n<figure class=\"highlight java\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@FunctionalInterface</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">interface</span> <span class=\"title\">Runnable</span> </span>{</span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * When an object implementing interface <code>Runnable</code> is used</span></span><br><span class=\"line\"><span class=\"comment\"> * to create a thread, starting the thread causes the object's</span></span><br><span class=\"line\"><span class=\"comment\"> * <code>run</code> method to be called in that separately executing</span></span><br><span class=\"line\"><span class=\"comment\"> * thread.</span></span><br><span class=\"line\"><span class=\"comment\"> * <p></span></span><br><span class=\"line\"><span class=\"comment\"> * The general contract of the method <code>run</code> is that it may</span></span><br><span class=\"line\"><span class=\"comment\"> * take any action whatsoever.</span></span><br><span class=\"line\"><span class=\"comment\"> *</span></span><br><span class=\"line\"><span class=\"comment\"> * <span class=\"doctag\">@see</span> java.lang.Thread#run()</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">abstract</span> <span class=\"keyword\">void</span> <span class=\"title\">run</span><span class=\"params\">()</span></span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<h3 id=\"分析\"><a href=\"#分析\" class=\"headerlink\" title=\"分析\"></a>分析</h3><ol>\n<li><p><code>-></code>这个箭头是lambda表达式的关键操作符</p>\n</li>\n<li><p><code>-></code>把表达式分成两截,前面是函数参数,后面是函数体。</p>\n</li>\n<li><p>Thread的构造函数接收的是一个Runnable接口对象,而我们这里的用法相当于是把一个函数当做接口对象传递进去了,这点理解很关键,这正是函数式编程的含义所在。</p>\n</li>\n<li><p>我们注意到Runnable有个注解<code>@FunctionalInterface</code>,它是jdk8才引入,它的含义是函数接口。它是lambda表达式的协议注解,这个注解非常重要,后面做源码分析会专门分析它的官方注释,到时候一目了然。</p>\n<figure class=\"highlight java\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">/* @jls 4.3.2. The Class Object</span></span><br><span class=\"line\"><span class=\"comment\"> * @jls 9.8 Functional Interfaces</span></span><br><span class=\"line\"><span class=\"comment\"> * @jls 9.4.3 Interface Method Body</span></span><br><span class=\"line\"><span class=\"comment\"> * @since 1.8</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"><span class=\"meta\">@Documented</span></span><br><span class=\"line\"><span class=\"meta\">@Retention</span>(RetentionPolicy.RUNTIME)</span><br><span class=\"line\"><span class=\"meta\">@Target</span>(ElementType.TYPE)</span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"meta\">@interface</span> FunctionalInterface {}</span><br></pre></td></tr></table></figure>\n</li>\n</ol>","categories":[],"tags":[{"name":"java","slug":"java","permalink":"http://www.cmlanche.com/tags/java/"},{"name":"lambda","slug":"lambda","permalink":"http://www.cmlanche.com/tags/lambda/"},{"name":"UnaryOperator","slug":"UnaryOperator","permalink":"http://www.cmlanche.com/tags/UnaryOperator/"}]},{"id":"147ecd75eee6e56720e484c0f94b1acf","rawpath":"raw/147ecd75eee6e56720e484c0f94b1acf.json","title":"聊一聊JavaFx中的TextFormatter以及一元操作符UnaryOperator","date":1532159367000,"updated":1532222118000,"path":"2018/07/21/聊一聊JavaFx中的TextFormater/","link":"","permalink":"http://www.cmlanche.com/2018/07/21/聊一聊JavaFx中的TextFormater/","excerpt":"<h3 id=\"直击主题:它在JavaFx中可以实现什么效果\"><a href=\"#直击主题:它在JavaFx中可以实现什么效果\" class=\"headerlink\" title=\"直击主题:它在JavaFx中可以实现什么效果\"></a>直击主题:它在JavaFx中可以实现什么效果</h3><p>它可以格式化输入文本的内容,可以允许输入哪种值,可以规定光标的位置,例如可以实现一个输入框只允许输入数字,</p>\n<p>例如<code>textfield</code>表示输入框对象,那么设置格式化内容的话就应该像这样子:<code>textfield.setTextformatter(new TextFormatter<String>(IntegerFilter))</code>, 而其中<code>IntegerFilter</code>就是只允许输入数字的过滤器,它的代码是怎样的呢?</p>\n<figure class=\"highlight java\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * Created by cmlanche on 2017/7/10.</span></span><br><span class=\"line\"><span class=\"comment\"> * 整数过滤器</span></span><br><span class=\"line\"><span class=\"comment\"> * 应用:比如使一个输入框只能输入数字</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">IntegerFilter</span> <span class=\"keyword\">implements</span> <span class=\"title\">UnaryOperator</span><<span class=\"title\">TextFormatter</span>.<span class=\"title\">Change</span>> </span>{</span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"keyword\">final</span> <span class=\"keyword\">static</span> Pattern DIGIT_PATTERN = Pattern.compile(<span class=\"string\">\"\\\\d*\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> TextFormatter.<span class=\"function\">Change <span class=\"title\">apply</span><span class=\"params\">(TextFormatter.Change change)</span> </span>{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> DIGIT_PATTERN.matcher(change.getText()).matches() ? change : <span class=\"keyword\">null</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>DIGIT_PATTERN大家都能看出来它是正则表达式,是匹配文本是否是整数的表达式。</p>\n<p>apply方法中的实现的意思是,只要符合整数就返回change,否则返回null</p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"textformatter","slug":"textformatter","permalink":"http://www.cmlanche.com/tags/textformatter/"},{"name":"unaryoperator","slug":"unaryoperator","permalink":"http://www.cmlanche.com/tags/unaryoperator/"},{"name":"lambda表达式","slug":"lambda表达式","permalink":"http://www.cmlanche.com/tags/lambda表达式/"}]},{"id":"c4744b8fa66011ea1e2a3f6c74f190a9","rawpath":"raw/c4744b8fa66011ea1e2a3f6c74f190a9.json","title":"Unable to start monitor 4454, An other instance is problaly using the same port","date":1531897226000,"updated":1531897978000,"path":"2018/07/18/Unable-to-start-monitor-4454,-An-other-instance-is-problaly-using-the-same-port/","link":"","permalink":"http://www.cmlanche.com/2018/07/18/Unable-to-start-monitor-4454,-An-other-instance-is-problaly-using-the-same-port/","excerpt":"<blockquote>\n<p>最近两个月启动IDEA一直这个错误,终于今天忍不住了,找了下解决这个问题的方法</p>\n</blockquote>\n<p><img src=\"https://ws2.sinaimg.cn/large/006tNc79ly1fte0ysjmz2j30ow09gdgz.jpg\" width=\"400px\"></p>\n<p>造成IDEA启动失败。</p>","categories":[],"tags":[{"name":"idea","slug":"idea","permalink":"http://www.cmlanche.com/tags/idea/"}]},{"id":"7fb971e4510ff62063f89ce1ca89ba1e","rawpath":"raw/7fb971e4510ff62063f89ce1ca89ba1e.json","title":"解决Android Robotium(Instrumentation)初始化时getActivity阻塞的问题","date":1531799543000,"updated":1531893369000,"path":"2018/07/17/解决Android-Robotium初始化时getActivity不返回的问题/","link":"","permalink":"http://www.cmlanche.com/2018/07/17/解决Android-Robotium初始化时getActivity不返回的问题/","excerpt":"<h3 id=\"如果应用没有启动,阻塞了\"><a href=\"#如果应用没有启动,阻塞了\" class=\"headerlink\" title=\"如果应用没有启动,阻塞了\"></a>如果应用没有启动,阻塞了</h3><p>这种情况getActivity肯定会阻塞的,你需要调用startActivity启动起来:</p>\n<figure class=\"highlight java\"><table><tr><td class=\"code\"><pre><span class=\"line\">getInstrumentation().getTargetContext().startActivity(intent);</span><br></pre></td></tr></table></figure>\n<p>如果在Robotium中还是没启动,你就需要借助外力来启动它了,比如命令:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"code\"><pre><span class=\"line\">am start .... // 代码未写完整,意思就是你需要借助am的命令来启动应用</span><br></pre></td></tr></table></figure>","categories":[],"tags":[{"name":"Robotium","slug":"Robotium","permalink":"http://www.cmlanche.com/tags/Robotium/"},{"name":"自动化研发","slug":"自动化研发","permalink":"http://www.cmlanche.com/tags/自动化研发/"}]},{"id":"500684697f28caf3101583f552a3a247","rawpath":"raw/500684697f28caf3101583f552a3a247.json","title":"Bloogle开发日记 | 制作一个滚动大纲的前端网页","date":1531268398000,"updated":1531804809000,"path":"2018/07/11/从零制作一个滚动markdown大纲的前端网页/","link":"","permalink":"http://www.cmlanche.com/2018/07/11/从零制作一个滚动markdown大纲的前端网页/","excerpt":"<p>从零教学怎么制作一个滚动大纲</p>\n<p><img src=\"http://pboedpdg9.bkt.clouddn.com/letsblog%E5%BC%80%E5%8F%91%E6%97%A5%E8%AE%B0-%E6%BB%9A%E5%8A%A8%E5%A4%A7%E7%BA%B2.gif\" alt></p>","categories":[],"tags":[{"name":"bloogle","slug":"bloogle","permalink":"http://www.cmlanche.com/tags/bloogle/"},{"name":"网页前端","slug":"网页前端","permalink":"http://www.cmlanche.com/tags/网页前端/"}]},{"id":"6fc52eacd4c1c3f4678990edd28bb011","rawpath":"raw/6fc52eacd4c1c3f4678990edd28bb011.json","title":"腾讯云建站主机的一次奇妙之旅","date":1529590027000,"updated":1531804741000,"path":"2018/06/21/腾讯云建站主机的一次奇妙之旅/","link":"","permalink":"http://www.cmlanche.com/2018/06/21/腾讯云建站主机的一次奇妙之旅/","excerpt":"","categories":[],"tags":[{"name":"腾讯云","slug":"腾讯云","permalink":"http://www.cmlanche.com/tags/腾讯云/"},{"name":"建站主机","slug":"建站主机","permalink":"http://www.cmlanche.com/tags/建站主机/"}]},{"id":"afbb26d3f0cb61db039564a81a0e2bab","rawpath":"raw/afbb26d3f0cb61db039564a81a0e2bab.json","title":"hexo自动部署到git、ftp(虚拟主机等)、云服务器的方式","date":1529453952000,"updated":1531804732000,"path":"2018/06/20/hexo-deployers/","link":"","permalink":"http://www.cmlanche.com/2018/06/20/hexo-deployers/","excerpt":"","categories":[],"tags":[{"name":"hexo","slug":"hexo","permalink":"http://www.cmlanche.com/tags/hexo/"},{"name":"git","slug":"git","permalink":"http://www.cmlanche.com/tags/git/"},{"name":"ftp","slug":"ftp","permalink":"http://www.cmlanche.com/tags/ftp/"},{"name":"云服务器","slug":"云服务器","permalink":"http://www.cmlanche.com/tags/云服务器/"}]},{"id":"86500235fc1cedd3280645c1daef1f1b","rawpath":"raw/86500235fc1cedd3280645c1daef1f1b.json","title":"静态模板方法的用法","date":1529453078000,"updated":1531804708000,"path":"2018/06/20/静态模板方法的用法/","link":"","permalink":"http://www.cmlanche.com/2018/06/20/静态模板方法的用法/","excerpt":"","categories":[],"tags":[{"name":"java","slug":"java","permalink":"http://www.cmlanche.com/tags/java/"},{"name":"静态模板方法","slug":"静态模板方法","permalink":"http://www.cmlanche.com/tags/静态模板方法/"}]},{"id":"ac6dde61e35ed8af76c55fd6ce6d21cd","rawpath":"raw/ac6dde61e35ed8af76c55fd6ce6d21cd.json","title":"js判断某元素是否真的可见(以人的视角的可见)","date":1517044792000,"updated":1517061180000,"path":"2018/01/27/js判断某元素是否真的可见(以人的视角的可见)/","link":"","permalink":"http://www.cmlanche.com/2018/01/27/js判断某元素是否真的可见(以人的视角的可见)/","excerpt":"","categories":[],"tags":[]},{"id":"ed7491096616788b86fd4f6bc092dd3f","rawpath":"raw/ed7491096616788b86fd4f6bc092dd3f.json","title":"java内存泄漏分析","date":1514359804000,"updated":1514543765000,"path":"2017/12/27/java内存泄漏分析/","link":"","permalink":"http://www.cmlanche.com/2017/12/27/java内存泄漏分析/","excerpt":"<h3 id=\"什么是内存泄漏?\"><a href=\"#什么是内存泄漏?\" class=\"headerlink\" title=\"什么是内存泄漏?\"></a>什么是内存泄漏?</h3><p>内存泄漏就是一些已经不使用的对象还存在于内存之中且垃圾回收机制无法回收它们,导致它们常驻内存,会使内存消耗越来越大,最终导致程序性能变差。 </p>\n<h3 id=\"java导出heap数据的方法\"><a href=\"#java导出heap数据的方法\" class=\"headerlink\" title=\"java导出heap数据的方法\"></a>java导出heap数据的方法</h3><p><code>jmap -heap pid</code></p>\n<p>这个是获取某java进程的heap基本信息。</p>\n<p><code>jmap -dump:format=b,file=heap.bin pid</code></p>\n<p>这个是dump一份heap的内存分析状态文件,然后你用eclipse mat软件来导入这个文件,然后看看给出的分析报告。</p>","categories":[],"tags":[]},{"id":"6cf5b0caf0985ff32a28a703438c6989","rawpath":"raw/6cf5b0caf0985ff32a28a703438c6989.json","title":"使用java-api在windows上打开本地html文件无法传递query参数","date":1514277702000,"updated":1531804771000,"path":"2017/12/26/使用java-api在windows上打开本地html文件无法传递query参数/","link":"","permalink":"http://www.cmlanche.com/2017/12/26/使用java-api在windows上打开本地html文件无法传递query参数/","excerpt":"","categories":[],"tags":[{"name":"java","slug":"java","permalink":"http://www.cmlanche.com/tags/java/"}]},{"id":"3d3618605fc9cca063cd3bbe3f334d50","rawpath":"raw/3d3618605fc9cca063cd3bbe3f334d50.json","title":"JavaFx中gif图片显示内存泄漏","date":1512816280000,"updated":1514445388000,"path":"2017/12/09/JavaFx中gif图片显示内存泄漏/","link":"","permalink":"http://www.cmlanche.com/2017/12/09/JavaFx中gif图片显示内存泄漏/","excerpt":"","categories":[],"tags":[]},{"id":"2734695e3e827cd3bab437054bf62f14","rawpath":"raw/2734695e3e827cd3bab437054bf62f14.json","title":"图片压缩(tinypng)+七牛云存储客户端","date":1512271721000,"updated":1551163233000,"path":"2017/12/03/图片压缩(tinypng)+七牛云存储客户端/","link":"","permalink":"http://www.cmlanche.com/2017/12/03/图片压缩(tinypng)+七牛云存储客户端/","excerpt":"<h3 id=\"想法来源\"><a href=\"#想法来源\" class=\"headerlink\" title=\"想法来源\"></a>想法来源</h3><p>个人写博客,很多情况下需要图片,而图片的话需要压缩,否则占用空间太大,使得网站反应慢,而且占流量,同时减少云存储大小,减少损失,对静态网站比如hexo或者hugo直接写markdown这种形式的博客,需要上传文件取得一个文件url,那么现有就没有一个很好的方式来自动处理这种需求了。</p>","categories":[],"tags":[{"name":"tinypng","slug":"tinypng","permalink":"http://www.cmlanche.com/tags/tinypng/"},{"name":"七牛云","slug":"七牛云","permalink":"http://www.cmlanche.com/tags/七牛云/"},{"name":"七牛云客户端","slug":"七牛云客户端","permalink":"http://www.cmlanche.com/tags/七牛云客户端/"},{"name":"个人博客客户端","slug":"个人博客客户端","permalink":"http://www.cmlanche.com/tags/个人博客客户端/"}]},{"id":"9809fd06ff442e61afce8b3d9f5fcf67","rawpath":"raw/9809fd06ff442e61afce8b3d9f5fcf67.json","title":"JavaFx新手教程-布局-StackPane","date":1512223837000,"updated":1512279519000,"path":"2017/12/02/stackpane/","link":"","permalink":"http://www.cmlanche.com/2017/12/02/stackpane/","excerpt":"","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"javafx-layout","slug":"javafx-layout","permalink":"http://www.cmlanche.com/tags/javafx-layout/"},{"name":"javafx-stackpane","slug":"javafx-stackpane","permalink":"http://www.cmlanche.com/tags/javafx-stackpane/"}]},{"id":"0d2af72f9f5ed16f2d110598416cd034","rawpath":"raw/0d2af72f9f5ed16f2d110598416cd034.json","title":"梁文道·一千零一夜·儒学","date":1512209251000,"updated":1512210567000,"path":"2017/12/02/ruxue/","link":"","permalink":"http://www.cmlanche.com/2017/12/02/ruxue/","excerpt":"<p>儒家的个人始终和我们习惯的西方个人主义是不一样的观念,更加不是西方的自由主义的那套东西,<strong>儒家的个人始终是一个在社会之中的人,儒家的每一个人,每一个个体都是社会中的人,他必然是一个家庭的成员,他是一个社区邻里中的一分子,他是一个国家的一员,更是世界公民群体中的一员,更是大自然万物中的一员,每一个个人,都跟身边所有这些东西是密切联系起来的,他不是一个独立的绝对的,以己为本的一个个体</strong>。</p>","categories":[],"tags":[{"name":"文化","slug":"文化","permalink":"http://www.cmlanche.com/tags/文化/"},{"name":"儒学","slug":"儒学","permalink":"http://www.cmlanche.com/tags/儒学/"}]},{"id":"e64184980d3848a14bb0f2a4614f6c66","rawpath":"raw/e64184980d3848a14bb0f2a4614f6c66.json","title":"JavaFx概要脑图","date":1503633015000,"updated":1512206776000,"path":"2017/08/25/JavaFx概要脑图/","link":"","permalink":"http://www.cmlanche.com/2017/08/25/JavaFx概要脑图/","excerpt":"<p>本脑图是我自己总结的在JavaFx开发中的要点。</p>\n<p><img src=\"http://onrd7xdyg.bkt.clouddn.com/JavaFx%E8%84%91%E5%9B%BE.jpg\" alt=\"JavaFx脑图\"></p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"javafx脑图","slug":"javafx脑图","permalink":"http://www.cmlanche.com/tags/javafx脑图/"}]},{"id":"cf9445d87c1ebf0b336c2d33ec4c6830","rawpath":"raw/cf9445d87c1ebf0b336c2d33ec4c6830.json","title":"Jenkins自动集成小记","date":1502375582000,"updated":1512206827000,"path":"2017/08/10/Jenkins自动集成小记(一)/","link":"","permalink":"http://www.cmlanche.com/2017/08/10/Jenkins自动集成小记(一)/","excerpt":"<p>Jenkins是用来自动构建任务的,也许你还不知道什么叫自动构建任务,它的意思是可以针对某个任务进行自动化,比如你开发的某个软件,每次写完代码提交到<code>github</code>之后,你可以设置让Jenkins自动进行打包构建发布包或者进行Units测试,发布报告,不用你每次手工在<code>IDE</code>中去Build,尤其是当打包非常繁琐的时候,用自动化构建可以极大的提高工作效率。</p>","categories":[],"tags":[{"name":"jenkins","slug":"jenkins","permalink":"http://www.cmlanche.com/tags/jenkins/"}]},{"id":"e7e5404171c7e39c90b600de6159a9bf","rawpath":"raw/e7e5404171c7e39c90b600de6159a9bf.json","title":"JavaFx TableView疑难详解","date":1496887874000,"updated":1512206817000,"path":"2017/06/08/JavaFx-TableView详解/","link":"","permalink":"http://www.cmlanche.com/2017/06/08/JavaFx-TableView详解/","excerpt":"<p>TableView是个十分有用的控件,适应性和灵活性非常强,可以对它进行任意的修改,比如界面样式、功能。本文将从一步步提问的方式讲解TableView</p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"javafx-tableview","slug":"javafx-tableview","permalink":"http://www.cmlanche.com/tags/javafx-tableview/"}]},{"id":"d6416eb7d8f002e1e5d86fbba5346c64","rawpath":"raw/d6416eb7d8f002e1e5d86fbba5346c64.json","title":"JavaFx新手入门布局介绍","date":1496753849000,"updated":1512288083000,"path":"2017/06/06/JavaFx新手入门布局介绍/","link":"","permalink":"http://www.cmlanche.com/2017/06/06/JavaFx新手入门布局介绍/","excerpt":"<p><code>JavaFx</code>新手入门,首先应该从布局容器入手,常用的布局容器有<code>StackPane</code>, <code>BorderPane</code>, <code>HBox</code>, <code>VBox</code>等,在使用他们时,特别是手动编写fxml布局文件时,了解他们的特性可以加速你的编写过程,能够活学活用。本文一次性介绍他们的特点。</p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"javafx-layout","slug":"javafx-layout","permalink":"http://www.cmlanche.com/tags/javafx-layout/"}]},{"id":"6a491a8d46d9634449fc37a767479bfd","rawpath":"raw/6a491a8d46d9634449fc37a767479bfd.json","title":"JavaFx新手入门之布局 - SplitPane分隔容器","date":1496752630000,"updated":1512206759000,"path":"2017/06/06/JavaFx新手入门之布局SplitPane分隔容器/","link":"","permalink":"http://www.cmlanche.com/2017/06/06/JavaFx新手入门之布局SplitPane分隔容器/","excerpt":"<p><code>JavaFx</code>新手入门,首先应该从布局容器入手,常用的布局容器有<code>StackPane</code>, <code>BorderPane</code>, <code>HBox</code>, <code>VBox</code>等,本文介绍相对使用频率较少的<code>SplitPane</code>,<strong>分隔容器</strong></p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"splitpane","slug":"splitpane","permalink":"http://www.cmlanche.com/tags/splitpane/"}]},{"id":"c43cc4119ca5852a04f06fbbd4209f93","rawpath":"raw/c43cc4119ca5852a04f06fbbd4209f93.json","title":"初入vertx遇到的问题,可能你也遇到了","date":1496032539000,"updated":1531804836000,"path":"2017/05/29/初入vertx遇到的问题,可能你也遇到了/","link":"","permalink":"http://www.cmlanche.com/2017/05/29/初入vertx遇到的问题,可能你也遇到了/","excerpt":"<p><code>wement.io</code>的服务器准备采用<code>vertx</code>来开发,vertx的开发速度非常快,有很多写好的组件,这篇文章作为学习vertx的第一篇文章,总结了一些新手可能会遇到的问题。</p>","categories":[],"tags":[{"name":"vertx","slug":"vertx","permalink":"http://www.cmlanche.com/tags/vertx/"}]},{"id":"b0266260d85b589d7d947ce0b7e170fe","rawpath":"raw/b0266260d85b589d7d947ce0b7e170fe.json","title":"wement.io介绍文档","date":1495880205000,"updated":1512206844000,"path":"2017/05/27/wement.io介绍文档/","link":"","permalink":"http://www.cmlanche.com/2017/05/27/wement.io介绍文档/","excerpt":"<p><code>wement.io</code>是我准备开源做的一个开源公共的评论服务,分为评论插件,数据存储服务,广告服务。developing中,敬请期待</p>","categories":[],"tags":[{"name":"wement.io","slug":"wement-io","permalink":"http://www.cmlanche.com/tags/wement-io/"}]},{"id":"ba845b066bb7de36112e96111a5c5eb1","rawpath":"raw/ba845b066bb7de36112e96111a5c5eb1.json","title":"记录JavaFx中非常重要的细节","date":1494247738000,"updated":1512206789000,"path":"2017/05/08/JavaFx细节/","link":"","permalink":"http://www.cmlanche.com/2017/05/08/JavaFx细节/","excerpt":"<p><code>JavaFx</code>中有一些疑难杂症,或许你以为你掌握了<code>JavaFx</code>,但是也未必知道我所说的这些问题和解决方案,如果有帮助到你的,可以加群<code>最大最活跃的JavaFx社群:518914410</code> 欢迎访问我的个人博客<a href=\"http://www.cmlanche.com\">www.cmlanche.com</a></p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"javafx细节记录","slug":"javafx细节记录","permalink":"http://www.cmlanche.com/tags/javafx细节记录/"}]},{"id":"31630d4c11f57af3d8c78309a91569a6","rawpath":"raw/31630d4c11f57af3d8c78309a91569a6.json","title":"Hexo使用经验总结","date":1494059284000,"updated":1512206686000,"path":"2017/05/06/hexo使用总结/","link":"","permalink":"http://www.cmlanche.com/2017/05/06/hexo使用总结/","excerpt":"<p>首页的文章列表显示文章摘要,而不是整段文章:<a href=\"https://ohmyarch.github.io/2014/12/24/Hexo%E4%B8%BB%E9%A1%B5%E6%98%BE%E7%A4%BA%E6%91%98%E8%A6%81/\" target=\"_blank\" rel=\"noopener\">Hexo主页显示摘要</a></p>","categories":[],"tags":[{"name":"hexo","slug":"hexo","permalink":"http://www.cmlanche.com/tags/hexo/"}]},{"id":"0432fc1e78e72b0bc1b6c745e312d436","rawpath":"raw/0432fc1e78e72b0bc1b6c745e312d436.json","title":"JavaFx自定义Tab-Order","date":1493719966000,"updated":1512206804000,"path":"2017/05/02/JavaFx自定义Tab Order/","link":"","permalink":"http://www.cmlanche.com/2017/05/02/JavaFx自定义Tab Order/","excerpt":"<p>Tab-order是什么?在界面上当你按tab键触发焦点转移的功能,这就是tab order。但是Javafx有个缺陷就是不方便自己设置tab-order的顺序。</p>","categories":[],"tags":[{"name":"javafx","slug":"javafx","permalink":"http://www.cmlanche.com/tags/javafx/"},{"name":"javafx-tab-order","slug":"javafx-tab-order","permalink":"http://www.cmlanche.com/tags/javafx-tab-order/"}]},{"id":"91f8bdf3a2d08f687b01839986433ecf","rawpath":"raw/91f8bdf3a2d08f687b01839986433ecf.json","title":"hexo网站的搭建实践与经验感触分享","date":1491098130000,"updated":1512206705000,"path":"2017/04/02/hexo网站的搭建实践与经验感触分享/","link":"","permalink":"http://www.cmlanche.com/2017/04/02/hexo网站的搭建实践与经验感触分享/","excerpt":"<p>做个人博客网站,从我粗鄙的见识认为,有三类,一类是不懂技术的小白,使用wordpress,当然我虽然是搞技术的,在很长一段时间我长期使用wordpress,因为它非常简单容易上手,傻瓜式的操作,而且内容也非常容易管理,第二类呢是使用hexo、hugo等工具自己在服务器上进行复杂的配置然后才能搭建,我呢现在属于这类,第三类呢,是在第二类的基础上,能够自己开发网站的样式,这个需要比较深厚的前端技术,你需要懂js、html、css等很多知识,还需要很多实践才能做。</p>","categories":[],"tags":[{"name":"hexo","slug":"hexo","permalink":"http://www.cmlanche.com/tags/hexo/"}]}]}