1. Readable Clojure

    作为一名软件工程师,主要精力都集中在「开发」和「维护」上,特别当项目开展时间足够长,维护所花的精力就更多了。 而人的生命是有限的,为了享受人生乐趣,我们应该在有限的时间内完成更多的事情,想办法能更有效率地「维护」项目。

    回想一下我们刚接手一个项目的时候是怎么开始「维护」的呢? 大概是看 README、看文档了解使用的技术栈,随后我想一定是离不开阅读代码。 按照经验,我们不难得出一个结论,想要「维护」一个项目,那么一定要「读」懂项目代码。并且读得越快,理解得越好,越容易着手维护项目代码。 所以想要让项目更易于维护,我们首先需要写出可读的代码。

    今天我将从 Clojure 这门语言入手,谈谈它的可读性,之所以会选择 Clojure 主要是:

    1. 过程几年都在维护 Clojure 的项目,有一点小心得。
    2. C-like 可读性相关的论述已经足够多,但函数式语言则不多 ...

  2. 去哪儿 IM 分析 - Cowboy HTTP Server

    前言

    昨天「去哪儿」开源了自研的 IM Startalk,作为一个在 IM 领域划水了一段时间的人,也想了解下其他人是如何去考虑 IM 设计,所以就开始了源码阅读之旅。接下来会用几篇文章简单分析一下。

    本篇分析的是 Cowboy HTTP Server.

    结构

    基本采用了 Cowboy HTTP 框架实现,路由表保存在 config 中: config/ejb_http_server.config,让我想到 Haskell 的 yesod Orz。 于是整个项目就相对比较清晰了。 下面挑几个感兴趣的 API 来分析。

    获取在线用户

    http_getonlineuser.erl

    从这个 module 可以看到几个点:

    1. 在线人数是通过 ets 缓存到 erlang 内。
    2. 用户会根据 ...

  3. 去哪儿 IM 分析 - Search

    前言

    昨天「去哪儿」开源了自研的 IM Startalk,作为一个在 IM 领域划水了一段时间的人,也想了解下其他人是如何去考虑 IM 设计,所以就开始了源码阅读之旅。接下来会用几篇文章简单分析一下。

    本篇分析的是 Search.

    介绍

    简单浏览了代码,可以看到 IM Search 是基于 Flask 开发的,而且是单例运行的,带有几个全局变量,甚至还运行在 debug 模式下。没有使用 gunicorn 等 Server。

    qtalk_search 提供了搜索用户和搜索群组的功能。

    搜索用户

    搜索用户是通过一次很晦涩的 SQL 查询得出的,核心 SQL (原本不带分行的,格式化了一下...):

    sql = "select aa.user_id,aa.department ...

  4. 去哪儿 IM 分析 - OR

    前言

    昨天「去哪儿」开源了自研的 IM Startalk,作为一个在 IM 领域划水了一段时间的人,也想了解下其他人是如何去考虑 IM 设计,所以就开始了源码阅读之旅。接下来会用几篇文章简单分析一下。

    本篇分析的是 HTTP 负载均衡.

    基于 OpenResty 增加相关能力

    核心基于 OpenResty,利用 lua 扩展 NGINX 本身的能力,增加

    1. 上游服务探活
    2. 用户鉴权
    3. 用户级黑白名单
    4. 频率限制

    上游监控

    使用 https://github.com/openresty/lua-resty-upstream-healthcheck 做 upstreams 的探活,并生成报告页面。

    鉴权

    /newapi//package/qtapi/ 会做鉴权 ...


  5. Open Source GCI

    一直以来都在用 git ,用起的时候也有一些痒点:

    1. 很多时候,开发新 feature 的时候总会忘记及时 git commit, 导致最后一大堆已经修改的文件,如果对 commit 有追求的话, 还要 git diff 查看哪些文件的修改是由于同一个原因可以合并到一个 commit 里。
    2. git add 文件之后,又不记得文件都做了什么修改,commit message 就会写的很抽象。 对未来开发是不友好的。

    我想,需要有一个工具帮我解决上面的痒点, 于是写了一个简单的脚本帮助完成。

    https://github.com/shonenada/gci.sh

    这其实只是一篇骗 star 的 Blog.

    https://github.com/shonenada/gci.sh


  6. ChatOps 的一次简单实践

    回顾一下自己部署服务的变化:

    最初学习的时候,部署 ASP, PHP 是通过 FTP(甚至 Web)将 ASP/PHP 文件上传到服务器上。 后来知道有版本控制器之后,将代码托管到版本库,手动通过 ssh 登录服务器更新代码来部署服务, 再后来,知道利用 fabfile.py 等来自动化 ssh 到更新,到部署的过程了。 再后来,学会使用 CI,通过 travis / Jenkins 来自动部署服务。 一直到 ChatOps 实践之前,最便捷的方式是登录 Jenkins,输入 commit sha 来指定构建的版本,进行服务部署。 虽然如此,还是避免不了比较繁琐的人工操作。

    Slack / BearyChat / 微信等 IM 发展 ...


  7. 我的半桶水前端栈

    这篇博客是前面几篇有关前端博客的总结。

    包管理器

    大约一年前,我写前端还用 Bower 来作为前端的包管理器。

    $ bower install what-you-need 将依赖安装到 bower_components 中,(或者通过 .bowerrc 配置安装的路径)。 配合 wiredep ,在 index.html<!-- bower:css --><!-- endbower --><!-- bower:js --><!-- endbower --> 即可导入所有依赖。

    而最近了解了 WebPack 之后,更喜欢 npm + webpack 来作依赖管理。

    $ npm install what-you-need
    $ npm init    # Create package.json
    

    index.js:

    import DepOne from 'scripts ...

  8. 说一说 R2D2

    在 Vanke 近一年的工作,我们重写了原本的 2.0 系统。现在也基本进入稳定状态。 接下来的工作,更多地是用运营数据说话,尽可能通过技术手段影响我们所在的行业。

    R2D2 就是这么一个背景下诞生出来的项目。本质就是一个数据可视化的项目。

    讲讲两个 App

    我们对外产品主要是 “住这儿” 和 “助这儿”,用户分别是业主和员工。关于产品的设计不是这篇 Blog 要讨论的,所以不评论功能是否合理等等。

    “住这儿” 面向业主。提供了缴物业费、查询邮包、提交报事、反馈、物业评分等物业支撑功能,同时也提供了一些社区活动、帖子,以及我们发送通知的渠道。

    可以收集的数据有:

    • App 的普及率;
    • 不同社区业主的活跃程度;
    • 不同社区业主使用 App 的主要目的;
    • 不同社区物业评分情况;
    • 业主更喜欢什么功能。

    “助这儿” 面向员工。提供员工工作所需的功能,签到、抢单、查询业主信息等 ...


  9. Vue 初窥

    Vue

    Vue 是一个类型 AngularJs 的库。但不同于 Angular,Vue 主要是转主语数据绑定和组件化开发两大特性。同时 Vue 也提供了一套非常简单的 API,上手非常容易。

    Data Binding

    Vue 数据绑定会将 HTML 模板中的 “变量” 和 JavaScript 中的对象绑定起来,一旦数据绑定了,Vue 就会对它们进行同步。

    https://vuejs.org/images/mvvm.png

    这点跟 AngularJs 的效果是一样的。

    文本绑定

    文本绑定语法与 Angular 是一样的:

    Hello {{ username }}
    

    一次绑定

    Vue 数据绑定支持 “一次绑定”,也就是说当数据改变时候,HTML DOM 并不会跟着同步。

    Hello {{* onceBindingUsername }}
    

    JavaScript 表达式

    Vue 支持在 ...


  10. 从一个小项目谈 Web 开发

    前阵子和室友一个做了一个关于追梦的网站(《追者》, https://ichaser.net),产品本身的功能很简单,但是从技术层面来看,《追者》也是普普通通的一个网站。也许和平常我所开发的 Web 不同的是,这个 Web 每一层技术栈都尝试使用一些现代化开发工具,特别是前端工具链。这篇 Blog 记录了这个网站使用的一些工具和技术架构,作为这个网站的技术总结。当然,所列举的工具并不一定是最“现代化”的,欢迎一起讨论。

    一、服务器

    服务器使用了我一贯喜欢的搭配 Nginx + Gunicorn + Gevent。 iChaser 采用了灰度发布的方式,设置了 stage 和 prod。为了方便分别发布 stage 和 prod,服务器配置了 Supervisord (http://supervisord.org/)。酱就能通过命令来重启对应的服务:

    $ supervisorctl restart ichaser ...

Page 1 / 6