强大的 docker

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

January 13, 2015 · 1 分钟 · ming

ubuntu 12.04 创建启动器

最近又想折腾下android,所有在ubuntu下弄了下开发环境。 值得一提的是,ubuntu下如果你要在命令行里能使用你的 命令,你需要将可执行文件路径加进$PATH, 那如果你想在 桌面启动一个应用程序,怎么办呢? 很简单,看我添加eclipse的例子: 先添加一个文件/usr/share/applications/eclipse.desktop 内容类似如下: [Desktop Entry] Version=1.0 Name=eclipse Exec=/home/ming/applications/eclipse/eclipse Terminal=false Icon=/home/ming/applications/eclipse/icon.xpm Type=Application Categories=Development my development enviroment java Develop Kit 1.7 installed in /usr/lib/jvm/jdk1.7.0_05, configred in .bashrc eclipse 4.2 installed in /home/ming/applications/eclipse, added a luncher to /usr/share/applications/eclipse.desktop android SDK /home/ming/applications

July 14, 2012 · 1 分钟 · ming

my first gem

学了大半年的rails,却还没写过自己到gem,我这个吉他新手,还老需要去翻教材,找一些和弦是如何按的, 于是我决定写一个简单的gem,用来查找这些和弦。思路: 将常用和弦以yaml的形式存到文件中 设计一个简单的和弦类,它的to_s方法显示改和弦,像这样 am |--0--|-----|-----|-----|-----| |-----|--1--|-----|-----|-----| |-----|-----|--3--|-----|-----| |-----|-----|--2--|-----|-----| |--0--|-----|-----|-----|-----| |--0--|-----|-----|-----|-----| 用rake显示多个或指定和弦 我们可以用bundle来新建一个gem,他会替我们生成一个骨架bundle gem guitar_chords. 我的gem是下面这个样子 $ tree . ├── Gemfile ├── Gemfile.lock ├── guitar_chords.gemspec ├── lib │ ├── guitar_chords │ │ ├── guitar_chord.rb │ │ ├── guitar_chords.yml │ │ └── version.rb │ └── guitar_chords.rb ├── LICENSE ├── Rakefile ├── README.md └── spec ├── guitar_chords_spec.rb └── spec_helper.rb 我尝试用SPEC进行TDD,虽然才写了几个test case,却也能在重构时帮我快速找出不少问题。 配置spec时,碰到一些依赖方面的问题,对于module,require之后才能include。然后路径 的问题,特别是相对路径,如果你在guitar_chord.rb中写guitar_chords/guitar_chords.yml的 话,不一定能找到,因为当前目录是你调用spec时所在的目录,并不是guitar_chord.rb的目录。 然后慢慢去翻书,找别人的代码参考,终于实现了个大概。 TODO: rake部分 用单例模式,在第一次加载guitar_chords....

July 11, 2012 · 1 分钟 · ming

node.js底层是基于什么原理

今天在社区里面闲逛,发现node.js很火。之前也零零星星的看过一些node.js的介绍,知道它底层是google v8引擎的 基于事件模型的服务器软件。但脑子有几个why一直挥之不去: 1.基于事件模型的理论并不新鲜,为什么没有在其他语言中实现。可能的原因是,其他语言都没有基于基于事件模型的概念或者习惯, 而在浏览器里运行的js则处处都是事件,onclick,onmouseover等等。 2.在不是基于事件的http请求中,客户端和服务器建立tcp连接(http都是基于tcp吧),直到响应完毕,断掉tcp连接。 而现在node.js中在收到请求后,通知客户端断掉tcp连接,并说我之后会把找到的东西发给你。问题来了:服务器端是 怎么找到客户器端的呢?我们知道客户端去找服务器端是花了不少力气的,先dns,再ip;现在tcp断了,我不知道有什么机制 能让服务器找到客户端?难道node.js不是用在这样的场景么? 好吧,精力有限,还来不及去研究这个问题的答案。哪位同学了解的话,解答一下吧。纯属解惑。

June 28, 2012 · 1 分钟 · ming

rails guide学习笔记1

学习rails也有2,3个星期了。虽然有javaEE的使用经验,也较系统的提前学习了ruby, 不得不说学习起来还是有不少的难度。简单来说,ruby on raisl就相当于java中的 struts+spring+habinate,再加一个非常方便的代码生成工具。 同时,也建议初学者直接从RailsGuides官方文档作为学习的第一站,因为这里有对rails 方方面面的介绍,从怎么做到为什么这么做。以我为例,我学的第一本教材是那本著名的 《用rails进行敏捷开发》第4版(Agile Web Development),但由于没有一点概念,书中 说用rails new,generate,scaffold等时不知道他是想干什么,为什么他要这么做,只能跟 着书一步一步作,学习效果并不理想, 所有我只有fall back来看官方文档。也见解印证了我 的那个观点:官方文档永远是值得考虑认真学习的文档。 今天基本看完教材上model的部分,终于也能在学习中体验到爽的感觉。聪明的migrations, 聪明的验证和回调,聪明的实体关联,聪明的查询接口。ror的开发理念让很多东西都聪明起来, 当然,里面也有很多你一不注意就会犯错的小陷阱。比如哪些方法会触发回调,低性能的N+1查 询问题等。我要在理解的基础上记忆的同时,增加实战经验。

March 3, 2012 · 1 分钟 · ming

markdown 语法学习

###h 标题的写法 #h1 ##h2 ######h6 ul 和 li testtest testtest testtest testtest testtest * testtest * testtest * testtest * testtest * testtest testtest testtest testtest testtest testtest 1. testtest 2. testtest 3. testtest 4. testtest 5. testtest

December 2, 2011 · 1 分钟 · ming