Roy Notes

21世纪的互联网居民

Happy New Year to You!

Permalink

1
2
3
4
$ pry

2.0.0 (main):0 > 'Happy new year to you!'.each_byte.inject(:+)
=> 2014

偶尔在 twitter 上看到这个,惊喜之余翻出inject探个究竟

文档给出这样的例子

1
2
(5..10).inject(:+)
=> 45

inject可以解释作注入,它是Enumerable其中的一个实例方法,实现了Enumerable模块的类都可以使用它的实例方法,Array类当然实现了它。所以inject的作用就是在每个数组元素之间进行你想做的处理。Ruby 的API 文档给出了很直观的例子。

回到开头那行代码就很直白了,将字符串转换成字节码然后相加,最终得到2014,令人愉悦的是那个字符串是Happy new year to you!

尝试用Java来写一下

1
2
3
4
5
6
7
8
9
10
    public static void main(String[] args) {
      String str = "Happy new year to you!";

      int sum  = 0;
      for(byte b: str.getBytes()) {
          sum += b;
      }
      
      System.out.println(sum);
  }

About Fitbit Force

Permalink

过去三周中除了洗澡的时间,我几乎一直佩戴着 Fitbit Force。这是我购买的第一款智能腕带产品,所以我也无法对其与Nike Fuelband、Jawbond UP 等产品对待比较,下面只是我这三周下来的体验感受。

为何选择 Force

Force 只是比上一代多了一个小屏幕用于显示时间,当天步行数,公里数,楼梯数,跑步数,闹钟时间等信息。官网介绍上说到在更新后,可以显示来电信息。

正是因为看重这个小屏幕,所以选择了多支付30美元购买了Force 而不是 Flex。购买前当然也对比了 Fuelband 和 UP,不选择这两者的原因很简单,前者价格稍贵、外观线条粗犷、功能性也不占上风,虽然也很喜欢后者,但缺陷在于数据必须通过有线同步,这是一个不能接受的原因。

我通过朋友在 LA 购买,税后的总价约140 刀左右,如果遇上什么电子节,黑色星期五之类的应该能拿到更优惠的价格。

日常使用

Force 佩戴非常舒服舒适,重量很轻,有时我还担心它是否有戴在手上,腕带能否扣住,但这几周下来证明这是多余的。

可能由于腕带是橡胶材料的原因,第一次使用时扣上有点困难,但我觉得习惯就好,每次都能很顺利的扣上,而且上面也提到,一般情况下不会脱落,我也只在一次打篮球时被撞脱过。

有些报道说Force 能防水,但当你看到背面那个USB充电接口,我相信你也跟我有同样的想法,一定不能戴着它游水和洗澡。但我相信洗手还是没有问题的,所以没有将它摘下。毕竟作为一个跑步/步行运动跟踪设备应该有考虑到一般的防水情况,因手背有大量汗水而导致它工作不良,这也太扯了吧?

续航能力

其续航能力真的非常值得称道,从充满电到系统提醒电力不足,它足足工作了15+ 天,朋友 mib 则宣称有三周时间。

饮食与卡路里

我每天使用Force 来跟踪步行数,没有关注过饮食数据,不使用的主要原因是需要手工录入,我对于卡路里的控制还没有到强迫症的地步,忽略它。

睡眠与闹钟

睡前通过长按 Force上的按钮几秒,它将跳出一个秒钟开始计时,意味着它进入收集睡眠数据状态,你该睡了。醒来时重复该动作结束睡眠,或你有设置一个闹钟,闹钟结束时就是你的起库时间。

这,跟我理想的睡眠跟踪系统就有点距离了,我需要的是系统能自动分析进入睡眠数据收集,我醒来时它也能自动发现。同时我也需要一个智能闹钟,而不是一个定时闹钟,智能唤醒能帮助我更好的睡眠(我相信该理论并使用 App Store 上的Apps 试验过一段时间)。

当然,有这样的一个时间跟踪也让我更清楚:我的睡眠时间严重不足,平均每天只有7小时。

Apps

可以负责任的说,官方Apps虽称不上反人类,但绝对不是经过优良的设计。暂时也找不到可替代官方的Apps。

而且官方Apps 没有中国商店上架,所以你需要切换到香港或美国区下载安装。

感觉打开App 的背景同步功能后,iPhone 掉电较平时更多。

总结

因为Force ,我每天会多选择走动来收集数据,甚至有时我会选择楼梯而不是电梯回到办公室。设定每天步行10000步的目标,达成后通过震动你的手腕提醒,每天感受它的震动也是一种快乐与满足。

闹钟虽不尽如人意,但也习惯了每天被Force 震动唤醒。同时能收集睡眠数据,有时我会觉得通过数据能看到更真实的自己。

最后,我想就可以这样描述Fitbit Force,有缺陷但对得起价格,值得购买。

Workflow to Set DNS Servers

Permalink

一直有在用签名为24says.comSet DNS Servers 工作流,花了点时间解决以下两个问题(同时加了自己的签名):

  1. 直接把支持的 DNS 列出来提示选择
  2. 不需要每次变更都输入密码

效果如图:

下载地址:http://d.pr/f/tyf4


  • UPDATE 2013-12-13 发现脚本有BUG,下载地址已更新,如有下载请更新一下

    每次更新DNS还是需要输入密码,如果要解决可以将networksetup 加入到sudoer里。

New MacBook Air Bootstarp

Permalink

新电脑到手了,上一台 MacBook 购于2008年底,到现在整整使用了5年时光。事实上更换过SSD的它到目前为止还一切健康,促使我更换的原因有二:

  1. 虽然只有5年但也过于沉重
  2. 电池退化严重,续航能力为0

电池其实已经坏掉好久了,也曾试过买兼容电池但很快又坏了。针对以上两个问题,我一直纠结于Air or Pro(Retina)。事实上Pro已经很轻了,但对于我脆弱的颈椎还是有很大的压力,所以最后还是选择了 MacBook Air 11“,而且我还给她起了一个非常棒的名字:Peter Pan。

旧电脑用了五年,新机到手就没打算过如何做系统迁移,而是选择按需重组系统环境,特记录如下。


系统设置

  • Caps Lock键改为 Ctrl键
  • 安装了清歌输入法,放弃了鼠须管
  • 设置 中将鼠标和触控板能打勾的都勾上
  • 登录 iCloud 打开 MAS 下载已购软件
  • GoAgentX 科学上网

办公工具

  • Pages/Nubmers/Keynote 都免费了,赞

懒得再装 Office,极少使用,用 iWork 足够解决需要了

效率工具

  • Dropbox 数据存储同步软件,有计划启用 微盘和百度网盘了,但周边支持太少
  • Evernote 笔记类工具,我只用于归档同步
  • nvALT 支持 Markdown 的速记工具,这使我可以弃用 Evernote
  • Byword 又一个支持 Markdown 的工具,iOS/OSX 支持,内购发布功能
  • Alfred 加速启动,加上工作流无比强大,附后工作流推荐,到这里下载
    • Dash
    • Dash documentation lookup
    • Flush DNS
    • Google Suggest
    • Network Location 快速切换网络位置
    • Open current Safari tab in Chrome
    • Toggle Caffeine
    • Tunnelblick
    • Wi-Fi Toggle
    • Workflow Searcher
  • Spectacle 分屏工具
  • Mou 有时用一下
  • Marked 预览 Markdown 的工具
  • Bartender 从Menu Bar 收纳一些非常用的 Icon
  • Fantastical 替换日历,Bundle购买就装上
  • Path Finder 替换 Finder,Bundle购买也一直没用好,继续尝试
  • 1Password 贵!!!密码好帮手

通常我会使用 nvALT 速记,以纯文本的方式存储到 Byword 的目录使之可以通过 iCloud 同步,在片段经常整理成型后使用 Byword 的 publish(内购) 能力发布到 Evernote 归档。 从而形成以下工作流 nvALT -> Byword -> Evernote

开发工具

  • IDEA 它把我用了几年的 Eclipse 给革命了
  • XCode 把命令行工具也装上
  • Homebrew 方便安装各种包
  • iTerm2 替换系统自带的终端
  • YADR dotfiles The best vim,git,zsh plugins and the cleanest vimrc you’ve ever seen https://github.com/skwp/dotfiles 因为针对zsh/vim/iTerm2/ruby等做了相应的配置,所以应该放到最后设置,提供了很多实用配置。
  • Sublime Text 2 已经是开发必备了,它始终让我无法转向 TextMate。插件包管理是必须的
  • Robomongo 它把MongoHub给击败了,赞
  • Sequel Pro Mysql Client 必备
  • pgAdmin3 Postgres Client 必备
  • Postgres.app 就是 Postgres Server,这货太好用了
  • Dash 文档速查工具,配合 Alfred 使用更佳
  • JewelryBox ruby版本管理工具,rvm GUI
  • MacVim 经常YADR Dotfiles 定制过也挺好用

网络工具

  • QQ 这货耗电,但也离不开
  • 迅雷 会员还是挺好用的
  • Chrome 主力还是 Safari,需要它的 Apps
  • Forklift FTP工具,冻点购买,够用也比较便宜

其他

  • Pocket 延时阅读好帮手
  • VLC 看片好帮手
  • Sip 取色,勉强还行
  • Tunnelblick OpenVPN Client,配合 Alfred 使用更佳
  • tig Shell 下的 Git UI 工具
  • Caffeine 避免长时间离开系统休眠,配合 Alfred 使用更佳

本来打算随便写写,结果写了这么多…想到再补

Auto Sync File With Nitrous.io on Mavericks

Permalink

自从升级到 Mavericks 后,Nitrous.IO 的 OSX App 就失效了,官方的最新版本还没有释放出来,这导致离线编辑自动同步到线上测试变得不可用。

我知道有rsync同步的方法,但一直也懒得去研究,直到我遇到这篇文章 后算是解决问题了,只需要一条命令。

开始前需要安装fswatchunison,前者用于扫描文件变化,后者用于双向实时同步(跨Win/Linux/OSX),而且支持通过 SSH/RSH/Socket 进行同步。如果你也像我一样在使用brew,可以通过命令 brew install fswatch unison安装。

然后进入 ~/Nitrous.IO/gobox/bin 创建一个同步脚本,我照抄上面的文章

1
2
#!/bin/bash
fswatch . "date +%H:%M:%S; unison /Users/roymax/Nitrous.IO/gobox/ ssh://[email protected]//home/action/workspace -ui text -terse -batch"

当我们需要工作时,只需要进入目录执行./bin/start_sync.sh,当本地编辑文件时将自己上传到 Nitrous.IO 的对应目录了。

不过据本人测试,同步有点延时但总算能够正常工作。

Let’s Go - Revel

Permalink

部署好Nitrous.io的Go环境和输入Hello World!!后,接下来试试如何开发一个Web应用,并同样输出Hello World!!,于是找到了Revel

Revel

官网这样描述它A high-productivity web framework for the Go language.,而这里选择的原因只是因为看起来像rails罢了

那么开始吧,要先安装这个框架,照着官网「Getting Started

1
2
3
4
$ ssh gobox # 我配置了[ssh config](/blog/2013/09/let-us-go/)

(gobox) $ cd workspace
(gobox) $ go get github.com/robfig/revel/revel

稍候片刻安装完成,看看目录结构

1
2
3
4
5
6
7
.
├── bin
├── pkg
│   └── linux_amd64
└── src
    ├── code.google.com
    ├── github.com

多了几个目录,其中src是依赖库的源代码目录,pkg是编译后的代码目录,bin则是命令行工具,现在我们有了一个revel命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
~/workspace$ revel
~
~ revel! http://robfig.github.com/revel
~
usage: revel command [arguments]

The commands are:

    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line

Use "revel help [command]" for more information.

如果想了解Nitrous.io默认给我们准备好的开发环境,可以打开~/.bashrc看看,里面包含了一些预设的环境变量。比如安装Go语言需要设置的$GOPATH$GOROOT

First Web App

1
2
3
4
5
6
7
8
9
$ revel new goweb #在src下会生成一个名goweb的项目
$ revel run goweb
~
~ revel! http://robfig.github.com/revel
~
INFO  2013/09/26 15:52:46 revel.go:292: Loaded module testrunner
INFO  2013/09/26 15:52:46 revel.go:292: Loaded module static
INFO  2013/09/26 15:52:46 run.go:57: Running goweb (goweb) in dev mode
INFO  2013/09/26 15:52:46 harness.go:157: Listening on :9000

这样就跑起来了,可以看到默认跑在:9000端口,但Nitrous只支持3000,4000,8080,8888这四个端口,那么先把端口改为3000

打开~/workspace/src/goweb/conf/app.conf找到第四行http.port=9000改为http.port=3000重新启动revel

打开boxes列表找出预览URL,加上3000端口从浏览器打开可以看到It Works!的大字

goweb it works

Tips: 域名很难记,但如果你像我一样在用MacBook,你还可以通过Nitrous的客户端打开Port Forwarding,然后就可以通过http://localhost:<port>来访问你的远端程序了

nitrous Port Forwarding

注意:HTTPS貌似预览访问不了

再进一步

只是显示一个It Works!就结束还是单调了点,我打算传一个参数name=roy进去,然后显示Hi,Roy

Sublime Text打开~/Nitrous.IO/gobox,使用cmd+p呼出搜索框输入app.go打开。

通过文档我知道,如果需要传入参数,我可以这么做

1
2
3
func (c App) Index(name string) revel.Result {
  return c.Render(name)
}

再打开It Works!所在的模板文件app/views/App/Index.html,同时修改为

1
2
3
...
<h1>hi \{\{.name\}\}!!</h1>
...#省略上下HTML部分

再刷新浏览器发现只显示出现hi,再把URL修改为http://localhost:3000/?name=Roy看看结果吧。

后记

观察一下revel生成的goweb项目,你会发现目录结构跟rails真的差不多,简单的摸索已经可以上手。接下来,或者可以试试连接数据库操作了。


留下Nitrous小尾巴求闪电: https://www.nitrous.io/join/YsusrqFe8dY

Let Us Go

Permalink

简介

这里有两个主角,一个是 Nitrous.io,另一个是Go。正因为想学Go,所以想把一些学习过程记录下来

Nitrous.io

很早就知道 Nitrous.io 这个东西了,当时没有太多的感觉,没太多关注。最近无意中真正注册了一个帐号才发现,这不是一个所谓的 云IDE 这么简单,它还可以建立一个线上的虚拟开发环境,进行线上开发和测试,就像在本地用 Vagrant 进行开发一样。

Go

我想 Go 语言堪称当前最热的新开发语言了吧,除了系出 google 名门外,一些富现代感的特性让人赞不绝口。

开始

注册过程就跳过不表了,激活帐号后可以通过提供免费方案创造一个虚拟机,默认可选 Rails / node.js / Python / Go 四种预先定制的开发环境 box 。事实上这是一个基于 Ubuntu 的虚拟机,常用的开发工具一应俱全,比如: git, hg, build-essential。你甚至可以在上面安装任意软件,如:JVM、Lua 或其他。我在这里选择了基于 Go 的模板虚拟环境!

同时,还可以选择服务器所在地区,我选的是亚洲区域,总体上来说速度还可以接受。

一切Ok后将进入如下图的在线开发环境工作台

工作台的左方为项目目录树,中间有编辑区,下方是终端控制台。

Hello World

在终端输入命令

1
2
3
[email protected]:~$ cd workspace/ && touch hello.go
[email protected]:~/workspace$ ls
hi.go

然后可以通过IDE左方的目录树点击workspace发现刚才创建的hi.go文件,双击打开并输入

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
  fmt.Println("Hello, World!!")
}

回到终端,我可以使用 go run hi.go 执行它然后将回显 Hello World!!

像Vagrant一样

事实上,Nitrous连作为一个好用的文本编辑器都不够格,那如何胜任开发的重任呢,这不是有点鸡肋吗?事实上,可以把Nitrous当Vagrant来使,好处有

  • 不占本地资源:硬盘、内存和CPU SSD还是挺贵的
  • 不需要安装vagrant
  • 我可怜的08年 MacBook 风扇不再狂转
  • 工作环境云同步,网吧也能写代码

Vagrant 有一个很好的功能就是文件同步,在本地使用习惯的 IDE 进行开发,文件实时同步在虚拟环境测试。既然 Nitrous 的线上 IDE 不好用,那么可以使用本地顺手的 IDE 进行开发。

针对 Mac 可以下载官方的客户端,并打开文件同步功能

这时将在Home目录创建一个名为Nitrous.IO的文件夹并进行同步,同步完成后将多了一个对应 box 命名的文件夹,内容为虚拟环境的Home目录。用 sublime text 2 打开刚才创建的hi.rb,本地做任何修改将在线上IDE看到即时变化。

另外,还可以使用 iTerm 来替换线上的终端环境。

打开https://www.nitrous.io/app#/boxes 选中已创建的box 会发现有一项SSH URI。只要点击这个URI,Safari就会询问授权打开默认终端。当然,你也可以通过命令行在iTerm中输入打开远程终端,因为使用的是ssh 密钥认证所以整个过程无需密码

1
ssh [email protected] -p PORT

有时,从终端输入命令太繁琐了,可以在~/.ssh/创建一个config文件,内容如下

1
2
3
4
5
6
#~/.ssh/config
Host gobox
  HostName apne1.actionbox.io
  User action
  Port 12345
  IdentityFile ~/.ssh/id_rsa

保存后即可通过命令ssh gobox进入远端命令行

另一种方法是配置一下iTerm,创建一个 Profiles并设置一个快捷键快速打开进入远端


开发环境基本准备好了,接下来我要看看如何用Go做一个Web应用。

最后,如果你想试用 Nitrous,欢迎点击 Nitrous小尾巴 帮助我赞点小闪电。

Get My Fund Value

Permalink

回想2008年,头脑发热买了一批基金,而且是在暴跌的前夕。无需有太多的猜想也知道,必亏无疑的,直到今天每一只在未计息和通货的情况下也亏损30%左右。是的,无论基于什么价值投资也好,沉没成本也好我都好像应该卖了它,事实上是我一直也没有将它们卖出。每隔一段时间我都会看看他们的「收益」如何。

基金工具有很多,但没有一个我觉得称心的,我只是想偶尔看一下,不想录入太多不必要的表单。我只想录入基金编号,本金和份额,得到当前的价值即可。

以前,我是用一个Excel文件记录下每一只基金,忘记了调用一个什么函数动态从一个基金网站抓取当天的净值数据,后来这个文件丢失了,我只好每次查询每一只基金并输入净值数据。

这个周末,刚好看到一个便捷的基金接口后,我决定写一个小脚本完成我的小需求。

ruby 1.9.3测试通过,依赖httparty,settingslogic,text-table,colorize,运行前请确认已经安装以上gem,同时需要到juhe.cn申请一个API KEY。

运行效果,看这个

Twitter Finagle

Permalink

简介

Finagle是twitter内部的一个非常重要的核心工具库,它大量被应用于twitter内部系统。Finagle是一个异步的网络框架,能被用于实现异步的RPC客户端程序和基于JVM语言体系的服务端,包括Java,Scala,Jython等。

它还支持众多协议

  • HTTP
  • HTTP Streaming (Comet)
  • Thrift
  • Memcached/Kestrel
  • MySQL
  • protobuf
  • ……

基于Finagle的Server端特性支持

  • Backpressure (to defend against abusive clients)
  • Service Registration (e.g., via Zookeeper)
  • Distributed Tracing
  • OpenSSL

基于Finagle的Client端特性支持

  • Connection Pooling
  • Load Balancing
  • Failure Detection
  • Failover/Retry
  • Distributed Tracing (à la Dapper)
  • Service Discovery (e.g., via Zookeeper)
  • Rich Statistics
  • Native OpenSSL Bindings

twitter是Scala重度用户,同时Finagle也是写于Scala,围绕Finagle衍生了很多辅助的项目

其中scrooge是一个thrift代码生成器的Scala版本,是Apapche Thrift版本的替换且保持与它兼容,它同时用于生成符合Finagle使用的代码,当前只支持生成Scala和Java文件。而sbt-scrooge则是一个sbt插件。

scala-bootstrapper类似于一个脚手架工具,用于生成一个基础的finagle项目

sbt-package-dist则是一个基于sbt的打包插件

Hello World

这个Hello World将由scala-bootstrapper项目入手,该项目是一个ruby项目,因此确保有ruby安装环境。

通过scala-bootstrapper <project>可以生成项目,但必须先建立一个项目目录,否则在当前目录创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ mkdir myfinagle && cd myfinagle
$ scala-bootstrapper myfinagle
writing Capfile
writing config/development.scala
writing config/production.scala
writing config/staging.scala
writing config/test.scala
writing Gemfile
writing project/build/MyfinagleProject.scala
writing project/build.properties
writing project/plugins/Plugins.scala
writing run
writing src/main/scala/com/twitter/myfinagle/MyfinagleServiceImpl.scala
writing src/main/scala/com/twitter/myfinagle/config/MyfinagleServiceConfig.scala
writing src/main/scala/com/twitter/myfinagle/Main.scala
writing src/main/thrift/myfinagle.thrift
writing src/scripts/console
writing src/scripts/startup.sh
writing src/test/scala/com/twitter/myfinagle/AbstractSpec.scala
writing src/test/scala/com/twitter/myfinagle/MyfinagleServiceSpec.scala

我还根据需要,修改了一些依赖配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.....

libraryDependencies ++= Seq(
  "org.scala-lang" % "jline"                 % “2.9.1”,  #升级版本
  "com.twitter"    % "scrooge-generator"     % "3.0.8" intransitive(),  #升级版本
  "com.twitter"    % "scrooge-runtime"       % "3.0.8" intransitive(),  #升级版本
  "com.twitter"    % "finagle-core"          % “6.1.2”,  #升级版本
  "com.twitter"    % "finagle-thrift"        % “6.1.2”,  #升级版本 
  "com.twitter"    % "finagle-ostrich4"      % “6.1.2”,  #升级版本
  "org.scalatest" %% "scalatest"             % "1.7.1" % "test",
  "com.twitter"   %% "scalatest-mixins"      % "1.1.0" % "test"
)

...

CompileThriftScrooge.scroogeVersion := "3.0.8"  #升级版本

升级版本后,需要打开src/main/scala/com/twitter/<project>/FinalgeServiceImpl.scala将最后的shutdown()方法删除,否则无法编译通过

最后按照项目目录下的TUTORIAL.md执行更新和测试启动是否成功

但要正常运行,请看有哪些坑吧

sbt

  • 执行sbt update前,如果你有自己架设的maven代理服务器,建议添加一下代理仓库,或加到项目根目录下的sbt文件里
1
2
3
  #!/bin/bash

  export SBT_PROXY_REPO="proxy server address"
  • 如果打算使用自己的maven代理,将project/plugins.sbt里的resolvers部分指定的仓库加入到私有仓库。

  • twitter的仓库(http://maven.twttr.com/)已被污染了IP,请确认你能访问该域名,否则应该修改/etc/hosts添加199.59.148.212 maven.twttr.com

  • freemarker也无法访问,好像无关痛痒,注释掉

  • 没有必要单独安装sbt和scala,因为项目根目录本来就有一个sbt的脚本,它会自动下载并构建一个sbt和scala的运行环境,并且推荐使用该脚本文件

  • 如果需要使用本地的sbt环境,需要指定sbt版本echo "sbt.version=0.11.3" > ./project/build.properties

scala-bootstrapper

尝试gem install scala-bootstrapper发现可以安装,观察一下版本发现有点旧了,最后还是自己编译安装

1
2
3
4
$ git clone https://github.com/twitter/scala-bootstrapper.git
$ cd scala-bootstrapper
$ rake build
$ gem install pkg/scala-bootstrapper-*.gem

但我在rake build这一步时遇到问题

fail “ERROR: ‘rake/rdoctask’ is obsolete and no longer supported. Use ‘rdoc/task’ (available in RDoc 2.4.2+) instead.”

最后通过修改源代码解决

1
2
3
4
5
# Add this line just before the require to fix the deprecation notice
$LOAD_PATH.sort_by! { |p| p.match(%r[/rake\-]) ? 1 : 0 }

# 找到rake/rdoctask 替换为 rdoc/task
require 'rdoc/task'

scrooge

编译脚本会从twitter的仓库下载一个scrooge-3.0.0.zip的压缩包,不知道什么原因,scrooge的最新版本没有上传到仓库,同时也找不到这个最新版本的zip。那么如果需要使用新版本的scrooge,那要么使用maven,要么自己打一个zip包放到本地仓库

我不知道twitter内部的计划,我通过以下方法生成了一个3.0.8版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd /tmp
git clone git://github.com/twitter/scrooge.git
cd scrooge 
mvn package dependency:copy-dependencies

cd /tmp
wget http://maven.twttr.com/com/twitter/scrooge/3.0.1/scrooge-3.0.1.zip
unzip scrooge-3.0.1
mv scrooge-3.0.1 scrooge-3.0.8
cd scrooge-3.0.8 
rm -rf *.jar libs/*.jar
sed -i "" -e "s/3.0.1/3.0.8/g" ./scripts/scrooge
cp /tmp/scrooge/scrooge-generator/target/scrooge-generator-3.0.8.jar ./scrooge-3.0.8.jar
cp -r /tmp/scrooge/scrooge-generator/target/dependency/*.jar libs/
cd ..
zip -r scrooge-3.0.8.zip scrooge-3.0.8
cp scrooge-3.0.8.zip ~/.m2/repository/com/twitter/scrooge/3.0.8/

后记

Finagle作为twitter的核心工具库,性能和稳定性应该还是有一定保障的,而且从公布开源的出来的一系列工具堆栈非常有吸引力,如用于数据收集和报告的ostrich,性能分析的zipkin等。但文档确认稍候欠奉,会遇上各种坑。

再加上Scala的各版本不太兼容,稍不注意你就找不到对应的包。比如我希望设置用于scala-2.10.0版本就遇到些问题,而且花了好些时间才解决。估计scala发行版本再不保障版本的向前兼容,估计以后也很难普及。scala的社区个人觉得还是不够好,关注的人太少。scala在github上1196人加星,374人fork;而ruby的数据则是3826/867。

另不知基于什么原因,估计twitter已经开始将sbt迁移到maven,以至于有多个sbt插件项目已经至少半年以上没有更新了,其中就包括了scala-bootstrappersbt-scrooge。所以,如果确定要使用finagle,建议还是使用maven吧,反正scala-bootstrapper生成的代码也没帮到多少,自己用giter8也不是什么难事。

参考资料

Alfred Workflows

Permalink

早几天将Alfred升级到2.0,一些旧的扩展都不能用了,整理了一些我需要用到的workflows,可以通过Dropbox下载

Dash documentation lookup

可以通过快捷dl快速查询Dash.app,例子

  • dl java:String查询java的String类
  • dl pop 所有包括pop关键字的API

Flush DNS

这是一个重写自1.x扩展的工作流,作用是刷新DNS缓存。比较简单,但经常用到,通过flush关键字调用。

Github

快速查询github,详细看这里

Network Location

更改网络位置,之前因为在公司需要指定IP,这种快速切换网络位置的功能比较实用。因为是从我的配置中导出,所以这里将快捷键设置成lo {query}

The Pirate Bay

看这里吧

WiFi Toggle

通过wifi触发打开关闭wifi

Startup News

Startup News 最近浏览比较多,本来打算做一个,结果有人做好了


UPDATE:

一个Alfred工作流的汇总页 http://www.alfredworkflow.com/