一周年纪念

2016年10月15日20点58分55秒,我和她拍下了这一张照片。 这是我第一次约她出来玩,那时我还远不知我会和她走到哪一步,只是很开心和她在一起,心里有一些兴奋,一些喜悦,一些紧张,一些期待。明月当空照,当时特想赋诗一首,可惜才情不够,现在终于可以补上: 皎洁的月儿挂在天上 静静地照着繁华的都市 摩天大楼笼上了薄雾啊 湘江的水轻轻流淌 我在月光底下惝佯 身边那可爱的姑娘 你就是天上的月亮啊 没有你黑夜将如何漫长 天上的月光很美,地上的灯光也不差,橘子洲头正在举行灯展,实话说我没有对灯展报多大的期望,只是一项可有可无的行程,可是进去以后有点超越我的预期。和美人儿一起穿过五光十色的树林,在巨大的脸谱下面拍照,在月光灯光照耀下的草坪上小憩,真是一件很享受的事情。 她跟我并不是特别的近乎,想合影留恋,她不太答应;走路时故意靠的近一点,她会回到一个安全距离;轻松随意的聊天,却也没有亲密私密的话题。不近不远的距离,让我开心也忐忑的第一次见面。开心是因为和她相处愉快,忐忑是因为第一次见面,她似乎就闯进我心里。精致秀气的脸蛋,配上恰到好处的妆容,忍不住多看几眼;匀称窈窕的身姿,搭着新潮又得体的衣着,美丽中透出气质;温润如玉的声音,笑起来咯咯咯特好听,一口字正腔圆的普通话,让我误以为她是北方人。这么可爱的人儿,以后见不着咋办? 她在一家服装店上班,是长沙市的老市场,个体户老板外加销售的性质,每月只能休息两天。所以我们的交流大多是在网上进行的,偶尔可以约出来玩玩,也多数是晚上。我是个不太会玩的人,每次约她出来,就是吃饭唱歌外加她喜欢的洗脚,可能是没给她留下什么太深的印象,而我急于跟她走的更近,我们爆发了第一次矛盾。她一个劲的要认我做哥哥,而我就是不答应,而且非常不爽,电话里吵了一通之后冷战了两天。 在我死皮赖脸的沟通下,以及偶尔机智爆棚的小幽默,她渐渐又开始搭理我了

October 15, 2016 · 1 分钟 · ming

spring 注入私有属性

spring 可以注入私有属性 因工作原因, 最近又重归 java 阵营, java 已经到了版本8, spring 已经到了 4.X. 在学过 ruby on rails 和 nodejs 等东西后, 对 java 和 spring 又有了新的认识. 今天, 在看代码的时候, 发现 spring 可以注入私有 bean, 有点小惊讶, 我印象中 java 强类型, 访问修饰符这样的东西反射机制应该是改不了的. @Component public class Bean1 { //... } @Component public class Bean2 { @Autowired private Bean1 bean1; } spring 有4种注入方式: 构造函数 setter 方法 静态工厂方法 实例工厂方法 上述代码好像一条也不满足, 而且 bean1 是私有的, 我以为注入不了, 谁知道居然可以. 一句话: java的反射可以绕过访问权限,访问到类的私有方法和成员。

March 2, 2016 · 1 分钟 · ming

rent house in shanghai

上海租房 朋友在"延安西路 1118 号" 附近上班, 现在租的房子在 “昌李东路浦三路” 附近, 现在从家到公司: 最快速方式打车15.2公里31分钟51元. 最折中的方式是步行640米+公交+地铁, 18.1公里70分钟5元. 鉴于现在住的较远, 路上一来一回路上花费近 3 小时, 且房间吵闹影响睡眠, 且费用 2500/月 并不便宜, 考虑到公司附近租房, 要求: 离公司较近, 最好不超过 30 分钟路程. 安静, 安全, 不影响睡眠. 价格便宜, 2000 左右. 干净舒适. 解决方案 经过百度搜索及各大租房网站收集信息发现, 在长宁有以下几个地点性价比比较高: 天山西路, 仙霞西路, 曹杨新村, 丰庄等. 天山路, 仙霞路是两天并行的横向路, 沿龙梦大厦往西南方向(下为南左为西)走, 会依次经过天山路, 仙霞路, 再往西看, 则是天山西路和仙霞西路了, 即使最远端的仙霞西路路, 直线距离也小于10公里; 而离的最近的天山路附近的天山二,三,四村等小区, 距离只有1到2公里. 曹杨新村 在公司西北方向约2至3公里. 丰庄 也在公司西北方向, 沿公司那条纬线南北对称的样子. 天山路仙霞路沿线(往西更远也更便宜) 天二村 2000 元/月 押一付三 1室0厅1卫 35㎡ 普通住宅 中等装修 朝向北 2层/4层...

October 28, 2015 · 1 分钟 · ming

强大的 docker

做过多年软件开发的人一定被各种依赖折磨过. 从最简单的库的依赖, 到高层点的框架的依赖, 再到更高层的操作系统, 数据库等环境的依赖, 甚至网络, 硬件等合理抽象下都可以看成依赖. 库的依赖每个语言有各自的库管理和分发工具, 框架级别的依赖可以打包或者使用库依赖管理工具. 如何对操作系统, 数据库等外部环境依赖进行隔离呢? 有三种解决方案. 使用脚本等工具创建一致的外部环境, 如新建一个相同版本的操作系统, 在安装相同版本的数据库, 语言等. 类似于1, 但借助虚拟机, 使得操作更容易, 如 vagrant. 借助于可增量读写的"文件系统", 将外部环境依赖持久化到镜像,从而可以分发. docker 和 1, 2 的本质区别是 docker 是真正的分发可重用, 而1, 2是借助工具重建一致的开发环境. 即使一个普通的开发者, 一般本地开发, 部署到远程虚拟机, 那至少也需要折腾2次, 实在费时费力. 而借助 docker 一切问题都迎刃而解. 每个开发者都应该去试下 docker.

January 13, 2015 · 1 分钟 · ming

开源社区的精神, 坚持与人性

用了一段时间的 nodejs 了, 今天意外发现有了一个新repo iojs, 了解了一下事情的前因后果, 也谈谈开源社区的精神, 坚持与人性. iojs 的由来, 可以追述到 这个 issue. 我来复述一下. 某人 A 修改了项目的文档, 将文档中带性别倾向的那些词, 如 he, him 等改成了通用的 they, them 等词. 这个改动当然是很小的, 对项目的功能, 性能的影响为无, 对文档的可读性的影响也很微小. 这个提交被项目的某个维护者 B 拒绝掉了. 因为 nodejs 是公司 C 赞助的, 而社区以为 B 是 C 的员工, 故而认为 B(以及 C 公司)个人意志凌驾社区意志之上, 然后引发大规模的吐槽. 其实, B 不是 C 的员工, A 才是; 而 A 的行为才是 C 公司赞赏的. 事后 B 被开除, 这一段我也没懂, 不是员工怎么开除? 可能是外包顾问或者第三方吧. 具体可以看这里. 从这件事可以看出一些有意义的东西: 一个社区(团队), 有公共的准则(信仰)是多么的重要....

December 8, 2014 · 1 分钟 · ming

ember 开发中的几个小坑 2

数组的 addObjects 方法不能对 undefined 的使用. {% highlight javascript %} //假如结果是 undefined 的 var nothing = this.store.get(‘nothing’); // 下面的代码会出错, 报 forEach 没有定义 [].addObjects(nothing); {% endhighlight %} 原因是 addObjects 会期待形参中的对象有 forEach 方法, 个人觉得这里不要报错啥都不做比较好. 看下面的例子: {% highlight javascript %} try { var nothing = this.store.get(‘nothing’); } catch (e) { alert(‘my god, 异步的异常捕捉不带, 咋整?') } {% endhighlight %} this.store.get 返回的是 promise, 是一个异步的东东, 如果异步的回调出现问题, 比如 sideload 的数据不对时, 会抛出异常, 而且因为是异步的, 你还不能直接捕捉到, 暂时没想到好的办法, 只能让这部分不出现问题. 我碰到这个问题的原因是 sideload 的数据不完整, 通过修改数据完整性解决....

December 5, 2014 · 1 分钟 · ming

ember computed macro and computed property

最近项目在 ie8 下面碰到性能问题, 费了近一个星期, 终于弄好了. 第一步, 确定原因出在哪. 为排除其他因素, 我建了个很简单的 repo, 来看 ie8 下面 ember 的性能到底咋样, 有兴趣的可以去下载下来跑一跑. 实验很简单, 2个 model: {% highlight javascript %} //post export default DS.Model.extend({ text: DS.attr(‘string’), comments: DS.hasMany(‘comment’), isReaded: false }); // comment export default DS.Model.extend({ text: DS.attr(‘string’), isReaded: false }); {% endhighlight %} 然后在 模板里直接打印. {% highlight html %} {% raw %} {{#each}} {{text}} {{#each comment in comments}} {{comment.text}} {{/each}} {{/each}} {% endraw %} {% endhighlight %}...

December 3, 2014 · 2 分钟 · ming

ie8警告: 长时间运行的脚本使得页面没有响应, 是否终止?

今天测试项目在 ie8 下面的表现, 出现了如下警告: A script on this page is causing Internet Explorer to run slowly. If it continues to run, your computer may become unresponsive. Do you want to abort the script? 之前并没有出现这个问题, 大概调了一下, 抛出错误的地方是 ember view 模块系统库里面的一个方法, findChildById, 它会递归调用自己. 页面数据并不多, 大概就是 20 个数组, 每个数组 2 个元素. 联想到 taobao 等页面那么多元素也未见报这个错误, 大概率是我们的代码哪里有问题. 那问题出在哪呢? 什么情况下 ie8 会报这个错误呢? 翻看了一些博客已经 MSDN 上的一些文章, 大概找到答案: Internet Explorer determines that a script is long-running by the total amount of statements the JScript engine has executed....

November 24, 2014 · 1 分钟 · ming

ember 路由中几个常用方法的执行顺序

ember 中 route 指明了你应用的状态, 也提供了几个很常用的方法用来切换状态. 其中最常用的有三个钩子方法: model. 获得 model 供 controller 使用. beforeModel. 在 model 方法前执行. afterModel. 在 model 方法后执行. 三个方法都会处理 promise, 使用起来很方便. 比如在 beforeModel 中判断用户是否登录, 没登录就跳转至登录页面等. 还有一个常用方法是 setupController, 该方法在 controller 的 init 方法后 调用. 我们知道 application route 总是会执行的, 那么它和其他的 route 会是怎样的执行顺序呢? 今天我刚好碰到了这个问题. 假设我们有 application route, application controller; 还有 users route, users controller, 那么你访问 user 路由时, 这些方法的执行顺序是怎么样的呢? 有点出乎我的意外, 是如下的顺序: {% highlight javascript %} application model users model application controller init application route setupController...

November 19, 2014 · 1 分钟 · ming

ember 开发中的几个小坑

不能在 ember 项目中任意创建目录 一次折腾项目时想整合 ember 和 express, 在 ember 项目下建了一个 server 目录, 然后 ember start 就报错了. 查了好几个小时没找到原因, 后来才知 server 目录被保留用来存放 mock 相关的文件. ember 和 ember-cli 对目录结构和命名规范均有严格要求, 开发时要注意. http-mock 和 http-proxy 在 ember-cli 0.46版本中有问题, 不能一起工作. 具体代码是 server/index.js 中的如下几行, 即 bodyParser 将 request 从 stream 转换成了 object, connect-restreamer 将 object 转换回 stream, 但是转换时似乎格式方面有些问题, 所以把两部分同时注释掉之后解决问题. 看我提的这个 issue. {% highlight javascript %} app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); // proxy expects a stream, but express will have turned // the request stream into an object because bodyParser // has run....

November 10, 2014 · 1 分钟 · ming