工程师的情商

一件小事

有这么一件小事,总是觉得不值得一写,却又总是念念不忘,恐怕不写下来我就会一直惦记着这件事。

为 zsh 实现 fish shell 的效果

fish shell

很久以前就见过fish shell,很多人见到这两张图就会想去试一下:

Fish Shell Auto Suggestion Fish Shell Colors

fish shell炫酷在哪?

主要就是这两张图中的两个功能:智能提示 和 语法高亮。

 

为此我也试用过多次fish shell,但是每次都败了,因为还是有很多地方不习惯:

  • 无插件系统,功能上还是比oh-my-zsh少了很多
  • 不兼容bash语法,导致我之前的很多脚本无法运行

 

oh-my-zsh才是我的真爱!

那么问题来了,oh-my-zsh中有没有插件可以实现类似的功能?

答案是肯定的!

将群晖 NAS 安全地暴露到公网中

群晖 NAS

家里的群晖 NAS 已经用了一年了,好话就不多说了,谁用谁知道。一年内成功安利了三位朋友买了群晖。(群晖是不是要给我点推广费?)

去年开始运营商网络挟持很猖狂,各种嵌入广告,国内互联网公司也都纷纷上了 HTTPS。

我一个个人 NAS 也不太可能被盯上,但是在这种网络情况下,只要有人针对你,那么挟持你的相关信息是分分钟的。

所以我也开始在自家的 NAS 上折腾 HTTPS 了。

除了这块的教程,我也顺便也把 NAS 如何暴露到公网相关的教程都写一下,包含了很多个部分:光线猫破解,光纤猫改桥接,端口转发设置,DDNS 设置,NAS 设置等。

暴露到公网后用起来就很方便了,再配合 HTTPS,基本不用担心安全问题了。

API Blueprint Docker

API Blueprint

上次介绍的 API Blueprint 解决方案 虽然不错,但是有一些问题:

  1. 部署麻烦,需要装不少东西
  2. 文档更新后不支持自动部署
  3. 没有权限控制

以至于我们团队最后没有用这个方案,所以我想了下解决方案。

  1. 通过 Docker 镜像,解决部署问题
  2. 通过 Docker 镜像中的脚本,配合 Github Webhook 来实现自动化部署
  3. 还未实现

正好顺便学习一下 Docker,Docker 的书看过几本了,之前同事也做过分享,但还是那句话:实践出真知。

之前虽然了解各种概念,但是自己捣鼓后,才算是真正的理解。

2015年的那些事

迟到的年终总结

那天一位老友问我怎么还没写2015年总结?

为什么要等我的总结?

他说他也准备写,想先看看我的…

我突然想到了学生时代的一句话:喂,你作业做好了借我抄一下。

 

其实,今年写这么晚主要是在等一个时间点,因为一些事只能在这个时候才方便说。

现在时间点已过,我就随便说说吧。不像往年,我今年就不列自己看了多少书学了多少东西了,那样太俗。

(๑•́ ₃ •̀๑) 啊。。。别揭穿我,其实真相是,我今年真的没看几本书…

API Blueprint

对 API 文档的幻想

你对 API 文档有哪些需求?写起来方便看起来舒服?

这两个应该是文档最基本的需求了。

其实,前后端配合开发的时候,还常常会有这样一种需求:

“你接口定义好了吗?定义好了的话能不能先帮我做一个 Mock Server 让我先跑起来?”

Alfred2 插件:Hasher

工具化思维

最近在做的项目,需要频繁地转换 timestamp 到人类可识别的日期时间文本。之前一直在用一个 Chrome 的插件,可以快速转换各种格式,但是每次都要切换到 Chrome 实在是太不方便了,每次都要浪费1-3秒。这对一个懒人来说,是无法接受的。所以决定开始造工具了!

然后最近正好又买了正版的 Alfred2,也学了一点点 Python,那用 Python 给 Alfred2 做一个插件就再合适不过了!

源码和下载地址:传送门

自定义 JDBC Driver 连接公司数据库

DataGrip

DataGrip

JetBrains 家最近发布了新的数据库管理工具:DataGrip

Mac 上其实一直没有好用的数据库管理工具。Sequel Pro 一天一崩溃;MySQL 官方的各种快捷键很奇怪,而且只支持 MySQL;其他的就更别说了,根本没到可用这个级别。

DataGrip 就不一样了,用惯了 Intellij IDEA 后会非常熟悉。

DataGrip 的大部分功能(基本是所有功能,目前还真没发现什么不一样的)其实在 Intellij IDEA 里都有,那为什么还要额外装一个呢?

好吧,其实我是买了 JetBrains 家所有产品的授权,所以对我来说都不需要额外付钱了。

所以其实无论你是用 Intellij IDEA、 PyCharm 还是别的 JetBrains 家产品,都可以找到同样的数据库管理功能。

利用 PhantomReference 替代 finalize

问题来源

之前的一篇文章讲了 利用 WeakReference 关闭守护线程 ,守护线程一旦发现守护的对象不在了,就把自己清理掉。

这次的问题更棘手一些,假如一个对象有一些资源需要被关闭,那怎么处理?

很多人会说,这个简单啊!用 Java 的finalize

但在 Java 中的finalize真的设计得不好,一不小心就会引发很多问题。

解决 MHA 切换后导致应用无可用连接的问题

问题来源

环境:MHA + MySQL + c3p0

最近在一次 MHA 切换的时候,发现应用中的 c3p0 老连接一直在等待,而新进来的请求全部被 c3p0 拒绝了。

然后又过了很长时间,老的连接断开,然后恢复了正常。整个过程极其诡异。

利用 CDN 解决百度爬虫被 Github Pages 拒绝的问题

百度爬虫被 Github Pages 拒绝

前两天在知乎看到一个问题:如何解决百度爬虫无法爬取搭建在Github上的个人博客的问题?

我一看,这不是和我的情况一模一样吗?

我赶紧上去看了看我网站的统计信息:

Netty 自动重连

自动重连

用 Netty 写 Client 和 Server 的时候必须要去处理自动重连。

Server 端启动时的错误,要去不断重试。

Client 端不仅要处理启动时的错误,还要处理中途断开连接。

“秒杀”问题的数据库和SQL设计

问题的来源

上篇文章介绍了 ETL 场景下的高性能最终一致性解决方案,这次的问题也是一个常见的问题。

最近发现很多人被类似秒杀这样的设计困扰,其实这类问题可以很方便地解决,先来说说这类问题的关键点是什么:

  1. 一定要高性能,不然还能叫秒杀吗?
  2. 要强一致性,库存只有100个,不能卖出去101个吧?但是库存10000实际只卖了9999是否允许呢?
  3. 既然这里说了是秒杀,那往往还会针对每个用户有购买数量的限制。

总结一下,还是那几个词:高性能强一致性!

下文的所有解决方案是在 Mysql InnoDB 下做的。因为用到了很多数据库特性。其他的数据库或其他的数据库引擎会有不同的表现,请注意。

高性能、最终一致性的数据同步方案

问题的来源

先描述一下问题:

两个系统的数据需要做数据同步,可以是数据库到数据库,也可以是数据库到内存。要求高性能(速度快),最终一致性(数据不能错)。

2014年总结

一年一篇

又到了一年一篇时间了,今年真的有很多话想要说,也经历了很多很多很多,这些事是我在2013年完全想不到的。

但是没想到,我还是做了!

Netty 长连接服务

推送服务

还记得一年半前,做的一个项目需要用到 Android 推送服务。和 iOS 不同,Android 生态中没有统一的推送服务。Google 虽然有 Google Cloud Messaging ,但是连国外都没统一,更别说国内了,直接被墙。

所以之前在 Android 上做推送大部分只能靠轮询。而我们之前在技术调研的时候,搜到了 jPush 的博客,上面介绍了一些他们的技术特点,他们主要做的其实就是移动网络下的长连接服务。单机 50W-100W 的连接的确是吓我一跳!后来我们也采用了他们的免费方案,因为是一个受众面很小的产品,所以他们的免费版够我们用了。一年多下来,运作稳定,非常不错!

时隔两年,换了部门后,竟然接到了一项任务,优化公司自己的长连接服务端。

责任链模式

Chain of Responsibility

在 面向对象程式设计里, 责任链模式是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。

传送门:责任链模式

Java 中见到最多的对责任链模式的应用就是在Servlets Filters中了:

public class LogFilter implements Filter  {
   @Override
   public void  init(FilterConfig config) 
                         throws ServletException{ }

   @Override                      
   public void  doFilter(ServletRequest request, 
                 ServletResponse response,
                 FilterChain chain) 
                 throws java.io.IOException, ServletException {

      // do something
      
      chain.doFilter(request,response);
   }
}

利用 WeakReference 关闭守护线程

不要让 this 在构造期间逸出

《Java 并发编程实战》中有这么一段:

不要让this在构造期间逸出。

原因很简单,因为如果在构造期间创建了一个新线程并把this传递给新线程,this还没有准备完毕,新线程如果提前使用调用一些数据的话可能会有未知的错误。具体的错误和JVM的实现有关,可能大部分情况下没问题,但是一旦有了问题,你恐怕找都找不到。

参考:

小米手环评测

坑爹的咕咚手环

自从买了咕咚手环后一直对其他手环念念不忘…

因为咕咚的太难用了!罪证如下:

  • 待机时间只有4天
  • 固件从来不更新
  • 软件基本没更新过
  • 只支持iOS,Android手机明明也有蓝也4.0,可以连接但是同步失败
  • 材质感不好,略丑,搭扣很容易松
  • 不防水,不能带着洗澡

可惜别的手环太贵,直到小米手环到了…

Mac OS 中使用QQ域名邮箱

Google 被墙之后

Google 被彻底墙掉之后,最不方便的就是手机端的邮件、联系人和日历的同步了。

电脑上可以翻墙,手机上没买 VPN,也不想手机一直开着 VPN 啊…

寻思了一番后,发现国内目前做得比较好的也就只有QQ邮箱了,对应的功能全部有。