利用 Day One 2 整理每天的编码工作

每天的工作都离不开代码, 每周还要整理工作计划, 常常忘记了自己的工作内容. 同时, 如果涉及到多个项目的开发, 还往往有疏漏.

一个偶然的机会, 发现了 Day one 的自动添加日记功能 API, 可以自动将每日的工作整理入库.

第一步当然是安装 Day One 2的cli工具, 官方提供了支持文档 Command Line Interface (CLI)

安装只需一行命令

sudo /Applications/Day\ One.app/Contents/Resources/install_cli.sh

Day One Tools 也提供了一些有用的玩法.

参考 @dduan 的 git2dayone, 发现是基于 day one 1的, 所以基于这个脚本做了一定的修改.

#!/usr/bin/env sh

query=$1

if [ -n "$query" ]; then
    date=$query
else
    date=`date +%Y-%m-%d`
fi

workspaces='/Users/dan/workspace/wanda /Users/dan/workspace/personal /Users/dan/workspace/duitang'

for workspace in $workspaces
do
    repos=`ls $workspace/`

    for repoPath in $repos
    do
        cd $workspace/$repoPath
        logs=`git log --after "$date 00:00" --before "$date 23:59" --author "dan"`
        if [ -n "$logs" ]; then
            echo "Found logs @ $repoPath"
            echo "Commits for $repoPath\\n $logs" | /usr/local/bin/dayone2 -d="$date" -j="Workspace" new -t git
        fi
    done
done

这里看到我在平时工作可能涉及到三个workspace, 脚本会针对每个workspace中的每个git项目来导出当天的git commit log, 并保存到 Day One 2.

最基本的功能已经完成了, 下面要让脚本自动执行, 我所在的公司每天 17:30 下班, 所以我给自己写个 cron 任务

30 17 * * * /Users/dan/workspace/others/git2dayone/day_one_git_messages.sh

最后一步, 为了有的时候周末在家或者咖啡厅写代码, 可能不会触发 17:30 的job, 我需要添加一个方便的手动触发的功能. 这一次, 借助了 Alfred 的 workflow.

利用 Alfred workflows 简化两步验证流程

为了安全性的问题, 我把能开通 两步验证 的帐号全部打开了. 比如:

  • google
  • evernote
  • dropbox
  • facebook
  • coding.net
  • 微软
  • 坚果云
  • 小米

然后利用 Authy 的 cloud 同步功能, 来在不同移动设备之间进行配置共享, 而且在桌面端, 还可以通过 chrome 插件 的方式共享配置非常方便.

移动端没什么问题, 但是在桌面客户端上, chrome 插件的使用还是比较麻烦. 因为必须要用鼠标人为的点击一下对应的帐号, 还要在点一下 Copy 按钮, 更麻烦的是, 每次启动 authy 时, 都要输入一次 master 密码. 这个对于个人电脑来说感觉没有什么必要, 而且这个功能还无法取消.

对于严重的键盘党来说, 这几次窗口的切入和鼠标的切换完全不能忍.

网上搜索到了一个使用 alfred workflows 的方式来输入两步验证码, 叫做 Gauth: Google Authenticator (Time-Based Two-Factor Authentication).

装上去以后, 问题来了…按照文档的要求, 我需要提供如下信息

[google - bob@gmail.com]
secret = xxxxxxxxxxxxxxxxxx

[evernote - robert]
secret = yyyyyyyyyyyyyyyyyy

但是我倒哪里去拿到这个secret呢? 我们知道在初次启动二次校验的是可以通过二维码或者这个secret来关联, 但是一旦关联成功, 还怎么去查这个呢? 我在 mac 上定位到了 authy 的 chrome 插件的数据文件在 /Users/Dan/Library/Application Support/Google/Chrome/Default/Extensions/gaedmjdfmmahhbjefcbgaolhhanlaolb/1.5.0_0/_metadata/verified_contents.json, 但是没有用, 整个文件被加密了.

只能去翻源代码了. 最终的解决方案是:

找到业务逻辑代码 app.js, 在 /Users/Dan/Library/Application Support/Google/Chrome/Default/Extensions/gaedmjdfmmahhbjefcbgaolhhanlaolb/1.5.0_0/js

定位到有个 updateTokens function:

    TokensView.prototype.updateTokens = function(tokenRows) {
      var app, element, i, len, results, tokenRow;
      results = [];
      for (i = 0, len = tokenRows.length; i < len; i++) {
        tokenRow = tokenRows[i];
        element = $(tokenRow);
        app = AppManager.get().find(element.attr('data-token-id'));
        element.find('.tokenCode').html(app.formatToken()(app.getOtp()));
        results.push(element.find('.tokenCodeString').html(app.getOtp()));
      }
      return results;
    };

这部分逻辑在每隔30秒更新token时触发, 我们这里动点手脚:

results.push(element.find('.tokenCodeString').html(app.getOtp()));
results.push(element.find('.tokenCodeString').html(JSON.stringify(AppManager.get())));

加的这一行把整个 apps 列表的数据全部拉下来, 并保存到剪切板.

注意这个方法是在每次tokens更新时才调用, 所以如果刚刚打开authy, 要等它下次更新后, 再去点copy.

我们把剪切板中的数据弄出来, 可以看到每个网站解密后的数据.

    {
		"createdDate": 1471348752428,
		"otpGenerator": {},
		"uploadState": "uploaded",
		"uniqueId": "1453918",
		"name": "xxx@shanhh.com",
		"originalName": "Google:xxx@shanhh.com",
		"accountType": "google",
		"salt": "Pu1W9NpUkrlF4SILqQ8Z7ApYbgFw",
		"encryptedSeed": "eGgxm+go5dT6zIkstJDgEfJOh8TAEHKSVgSjskz4YkCgDaa",
		"decryptedSeed": "nryz4gnasdfa123fmn3xbddi5yjo4",
		"passwordTimestamp": 1456943408,
		"markedForDeletion": false,
		"deleteDate": null,
		"digits": 6
	}

其中 decryptedSeed 就是我们需要的 secret 了

利用DaoCloud在阿里云自动发布Jekyll

很久没有更新 blog, 实在是懒得折腾. 前段时间利用闲暇功夫折腾了一下整个部署流程.

简单描述一下:

  1. 作者(也就是我), 通过github提交代码.
  2. DaoCloud 监听到这次push, 并用最新的代码来生成 docker 镜像.
  3. 把文章中的所有附件(图片, zip包)之类的上传到 七牛云.
  4. 把生成的 docker 镜像在 阿里云 上进行部署.

以上流程中, 只有阿里云和域名需要付费, 而七牛和 DaoCloud 的使用是完全免费的.

具体步骤:

对接 DaoCloud 和web空间

如何购买阿里云的主机, 不是本文的考虑重点, 自己去弄好了. 我各人来说, 自己的需求非常简单, 就买了个华南区的ECS主机.

这里虽然以阿里云上的 Ubuntu 为例, 但实际上 DaoCloud 支持的空间很多, 目前已经涵盖了 ubuntu, centOS, windows, mac.

针对不同的对接方法可以在 daocloud 中的 我的集群 -> 添加主机 中查看不同环境的接入方案.

教程非常详细, 这里不过多介绍了.

使用七牛 CDN来管理静态资源

Mac Today 自定义 widget

自己是一个 GTD 拥护者, 在常规使用电脑的时候, 也会做很多适合自己的配置.

这里主要提到的是对 Mac 系统的 Today Widget 做一点点配置, 让他更适合自己的使用.

先看看我自己的配置

这里用到了一个不错的 Today-Scripts 开源软件. 安装以后, 可以在 Today 中增加多个 script, 用于执行系统命令.

我这里用的就是

cal | grep --before-context 6 --after-context 6 --color -e "$(date +%e)" -e "^$(date +%e)"

/usr/local/bin/icalBuddy -f -sd eventsToday+3

第一个命令不用说了, 用于显示日历. 第二个命令用到了另一个工具 icalBuddy, 用于显示近几日的日程.

用同样的方式, 我又增加了一个脚本, 只是做一个很简单的 cat 操作, 用于做一个简单的便签操作.

另外在写了一个 alfred 的 workflow 用于写入这个文件. 只贴了关键代码, 实现起来很简单.

  • Script Filter
note='{query}'

echo '<?xml version="1.0"?>'
echo '<items>'
echo '<item uid="'$time'" arg="'$note'">'
    echo '<title>Add note "'$note'"</title>'
    echo '<subtitle></subtitle>'
    echo '<icon>icon.png</icon>'
echo '</item>'
echo '</items>'
  • Run Script
note='{query}'
time=`date "+%Y-%m-%d %H:%M:%S"`
file="/Users/Dan/cloud/nutstore/notes"

echo "$time" >> "$file"
echo "$note" >> "$file"
echo "-------------------"  >> "$file"
echo >> "$file"
整理一下我过去的一些慷慨激昂的 FUCKing codes

这个是在pptv中定义变量的时候, 碰到英文捉急了…果然有人说开发中难度最大的地方就是在于定义变量.


为了一个左侧导航的功能点是否放出来, 加入了一段非常恶心的代码.


这个上下文有点长…不说了


产品对于结婚的同城活动参与用户的一段硬逻辑.


旅游婚纱是这边最特殊的模块…有很多吐槽的地方:

  1. 明明是个产品分类, 却混在各种商户分类的逻辑里.

  2. 旅游婚纱不区分城市, 也就是说, 任何一个穷乡僻壤都能看到它, 哪怕这个城市连结婚业务都没有开通.

  3. 各种特殊的逻辑都是针对旅游婚纱才产生的, 比如拍摄地, 跨城市商户搜索…


针对一些特殊文案的逻辑.


又是旅游婚纱.


又是旅游婚纱..


生命周期的一段打点的处理逻辑.


单元测试里的吐槽就更多了.


之前在前公司里单元测试中的就更多了. 不过都在测试代码中.