Roy Notes

21世纪的互联网居民

Copy Finder Path to Terminal

Permalink

我们有时需要从Finder中将当前路径复制到控制台中,但这路径有时长得令人发指,即使使用Tab键辅助也是很困难。奇怪的是,就这样一个小需求OSX也没有提供。

这是一个有关Finder的小技巧,其实你只需要将Finder上的文件夹拖放到Terminal就可以了,详见视频。

如无法播放点击这里下载

另外推荐一下DTerm这个免费的Terminal工具可以跟Finder配合着使用,通过热键⌘+⇧+↵呼出后就直接在Finder的当前路径进行Terminal操作,相当方便。而且可以跟IDE配合着使用,官方首页有详细的介绍及视频展示

UPDATE:

通过DTerm快速在当前目录打开Terminal,在Finder中热键⌘+⇧+↵呼出DTerm,再按⌘+↵

Problems With Meteor

Permalink

最近一个月关注了一下几个前端MVC库,包括有Emberjs/Angularjs/Meteorjs/Backbonejs等,发现所谓的前端后端的界线越来越模糊了。

Angularjs非常吸引人,看起来真的不错,而且还是由google这个业界巨头开源出来,质量值得信任。如果已经有一个良好的后端架构支持,Angularjs/Backbonejs之间必定任选其一都不会错,说到底就是看用哪家的API更舒服一些了。

如果从零开始学习或玩票性质地想做一些尝试性项目,我个人推崇Meteor。这个家伙启动成本真的很低很低,一体化的框架,基于nodejs+mongodb,社区也足够的活跃。当然了,优点也就是缺点,Full Stack Framework就是意味着一些制约了。

Emberjs则有点像Rails,或者直接说就是一个完全遵循Rails思想的框架,而且天生就跟Rails做高整合。如果熟悉Rails并且有一个基于Rails的后端或许是一个不错的选择,但个人感觉学习曲线有点徒(当然这更多是臆测,因为个人上手感觉不大习惯)。

另外还有几个Knockout/CanJS/Batman/Spine就没细看了,从github上的fork和wacth来看,感觉社区活跃度都比不上前面提到的几家。

最后尝试用meteor写一个app,遇到一些小问题并记录下来

加载nodejs package

Meteor实际上基于nodejs,所以可以直接加载nodejs已有的package

1
2
3
$ meteor create myapp
$ cd myapp/.meteor/local/build/server
$ npm install <package>

然后用以下方法加载

1
var pkg = __meteor_bootstrap__.require('package_name');

项目结构

Meteor 有两种方式拆分服务端和客户端代码

  1. 使用Meteor.is_clientMeteor.is_server区别代码块,meteor create project后生成的代码就是用这种方法。
  2. 将服务端和客户端代码分别放到项目根目录下的serverclient文件夹。

使用第二种方式,需要在项目目录下新建serverclient目录,并将Meteor生成的项目的主文件分别拆分到目录,分别命名为${ROOT}/server/proj_server.js${ROOT}/client/proj_client.js

另外,在项目根目录下的js文件可以设置公共的方法和变量,它能同时被server和client端调用。

使用Meteor.http特性

因为文档看得不够仔细,总是得到一个undefined的错误,后来发现Meteor.http也是Packages之一,所以需要meteor add http才可以使用。

关于编码

如果需要通过Meteor.http.get方法获取non-UTF8的内容就需要注意,因为Meteor将response设置成 UTF8返回,并不可以指定encoding。如果确认需要这处理GBK这个字符集,那么需要一点hacking code

修改packages/http/httpcall_server.js文件

1
2
3
4
5
6
7
8
     var req_options = {
       url: new_url,
       method: method,
-      encoding: "utf8",
+      encoding: options.encoding || "utf8",
       jar: false,
       timeout: options.timeout,
       body: content,

然后,你可以这样做

1
2
3
4
5
6
7
8
9
10
11
12
13
  Meteor.methods({getMyFunds: function() {
    this.unblock();
    var result = Meteor.http.get("http://hq.sinajs.cn/list=of110002"
      , { encoding: "base64" }
      );
    if (result.statusCode === 200) {
        var require = __meteor_bootstrap__.require;
        var Iconv = require('iconv').Iconv;
        var iconv = new Iconv('GBK', 'UTF-8//TRANSLIT//IGNORE');
        return iconv.convert(new Buffer(result.content,'base64')).toString();
    }

  }});

Kanban in Process

Permalink

重新做了一块看板应用到一个新项目组,并执行三周,继续探索中…

简介

看板的三个主要原则:

  • 可视化流程
  • 限制工作的数量
  • 改善周期

约定

  • 所有原始需求放到redmine中
  • 所有的Bug通过redmine提交
  • 黄色便签代表 backlog/story/task
  • 红色便签代表 bug
  • 当前任务项贴上自己的磁贴标记
  • 每周一收集上一周的工作数据
  • 每天早上10点进行立会
  • 按需召开产品分析会议
    • 看板上任务不够了
    • 功能优先级调整了
  • 流程顺序,从上到下从左到右
  • 按需发布,由产品负责人决定
  • 每周一收集上周的WIP产生CFD(Cumulative Flow Graph)

需求分析会议上需要明确的内容

  • 任务分解
  • 设计需时
  • 开发需时
  • 按功能优先级制定冲刺目标

版本控制的约定

开发过程

  • 基于gitflow的分支模型
  • master分支设置为产品分支,并设置为保护模式,开发人员不能向该分支push代码
  • develop分支设置为开发分支,开发人员每进行一个功能或bug修改需要新建分支操作并完成后合并回来
1
2
3
4
5
6
7
8
9
10
git flow feature start <feature_name>
git add <file>
git ci 
# and more ...
# need a help?
# git flow feature publish <feature_name>
# done!
git flow feature finish <feature_name>
git pull origin develop
git push origin develop

发布过程

  • 产品人员决定需要发布时间和特性
  • 所有列入发布范围的特性生成一个release branch待验收测试
  • 所有未列入发布范围的功能或缺陷停止提交到develop
  • 所有基于release branch的修改在该分支上进行
  • 发布成功后,发布版本打上指定版本标签,develop允许开放提交

版本标签

版本标签以x.y.z标记,

  • x 代表重大版本变更
  • y 代表较多功能特性增加及变更
  • z 代表针对现有功能做出变更

Mac osx自动添加VPN路由

Permalink

最近需要频繁使用VPN拨号,但由于网段不一样,每次连上后都需要手工添加路由,在Mac下同样可以通过ip-up和ip-down自动完成路由的添加。

非常简单的代码,其中第7行的${5:-} 对应远程IP地址,另还有以下参数可以使用

$1 the interface name used by pppd (e.g. ppp3)
$2 the tty device name
$3 the tty device speed
$4 the local IP address for the interface
$5 the remote IP address
$6 the parameter specified by the 'ipparam' option to pppd

最后,必须赋执行权限

1
2
3
4
$ sudo chmod a+x /etc/ppp/ip-up

#查看是否添加成功
$ netstat -nr

待遇问题

Permalink

农历年回来后就一直非常紧张地进行招聘工作,幸运的是在不到一个月的时间能够确定了三位技术新同事。

在本周一扎堆报到时的确是让我异常的兴奋,今年的团队建设任务在开始阶段就成效不错。三位新同事中还有两位是资深技术人员,这非常重要,因为今年团队招聘名额不多,但在创业团队中组成一个倒三角架构是可以减少犯错机会的。

遗憾的是在今天其中一位因待遇问题选择了离开,祝福这位共事两天的同事寻觅到自己另一份理想工作。

我们是家创业公司,运营的四年来并没有拿过风投一分钱过日子,我们不太可能给出超越经营成本的薪资成满足大家的待遇要求。事实上,我们也在尽量匹配市场的薪资水平,甚至在有合适的人材时以略超出薪资体系结构的月薪来保持竞争力。

待遇问题真是一个好问题,评判标准因人而异,而且没有谁对谁错。判断对错时如果不是过于在乎短期收益,那么最好想想对公司能给予多少的附加值,附加值包括但不限于:

  • 是否有充足的成长空间
  • 对行业方向是否认同、一致
  • 是否存在长期投资回报收益(公司可持续发展性)
  • 公司气氛、文化是否吻合
  • 技术创新程度
  • 价值观又是否一致
  • 上司是一个怎样的人

这些都属于我值得关注的待遇问题,绝不单纯因为月薪的短期或多或少去加入一家公司,不能臭味相投及DNA不匹配的公司会令我工作得非常痛苦。

未来的时间我们将继续寻找合适的工作伙伴,如果你是一位有多年工作经验的Java开发者,对Rails感兴趣,熟悉linux,非常欢迎将简历投递到邮箱roy.wei#xiangrikui.com

如果希望了解更多,可以访问 向日葵保险网

Node-restify 简介

Permalink

restifyNode.js的模块。虽然restify的API或多或少的参考了express,但restify不是一个MVC框架,它是一套为了能够正确构建REST风格API而诞生的框架。

安装restify

restify安装到目录restify-dmeo

1
2
3
$ mkdir restify-demo
$ cd restify-demo
$ npm install restify

Hello World

app.js
1
2
3
4
5
6
7
8
9
10
11
12
var restify = require('restify');

function respond(req, res, next) {
  res.send('hello ' + req.params.name);
}

var server = restify.createServer();
server.get('/hello/:name', respond);

server.listen(8080, function() {
  console.log('%s listening at %s', server.name, server.url);
});

保存文件并执行

1
2
$ node app.js
restify listening at http://0.0.0.0:8080

通过curl命令测试,服务器返回HTTP状态码200和一个application/json类型的内容(事实上这里不是)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl -is http://localhost:8080/hello/roy
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version
Access-Control-Expose-Headers: X-Api-Version, X-Request-Id, X-Response-Time
Server: restify
X-Request-Id: ec3e9e55-7083-4e12-93ee-9c24a0c5c398
Access-Control-Allow-Methods: GET
Connection: close
Content-Length: 5
Content-MD5: 65tW24XBT3r1jLUpw0o0Fw==
Content-Type: application/json
Date: Sun, 19 Feb 2012 16:14:13 GMT
X-Response-Time: 3

"hello roy"

特性

接触到restify是因为内部系统需要一个手机归属地的查询接口,基于nodejsredis的高性能实现,决定快速实现一个,当时也很自然地选择了express作为web层。但express始终是一个Web MVC框架,它包含了一些我不太需要的功能实现(i.e., templating/rendering)。而我只是需要一个更纯粹的API接口而已–接收请求然后返回一个JSON结果集。

后来从推上找到了restify时,我就觉得这才是我想要的:

  1. 路由

    • 基本等同于express/sinatra的路由方式
    • 路由正则表达式支持
    • 版本化支持
  2. 自动选择内容格式进行响应,并可以自定义格式

  3. 内置REST风格的错误处理机制,重载了400和409来解析应答,得到一个包含codemessage的JSON对象。也可以子类化restify.RestError实现自己错误代码和信息。

    已实现的RestError:

    • RestError
    • BadDigestError
    • BadMethodError
    • InternalErrorError
    • InvalidArgumentError
    • InvalidContentError
    • InvalidCredentialsError
    • InvalidHeaderError
    • InvalidVersionError
    • MissingParameterError
    • NotAuthorizedError
    • RequestExpiredError
    • RequestThrottledError
    • ResourceNotFoundError
    • WrongAcceptError
  4. 插件机制

  5. DTrace支持,这个绝对是调式、诊断和性能测量利器

虽然现在restify还是初生婴儿,我还是把上面提到的手机归属地查询接口改用了restify来实现了一个moquery

正如官方描述一样

restify is a smallish framework, similar to `express` for building REST APIs. 

Installing GitLab on Ubuntu Server 11.10

Permalink

打算在团队内推广Git,替换掉当前使用的SVN。所以打算挑选一个类GitHub的管理界面,最终在GitLab和Gitblit中选择了前者。本文为GitLab在虚拟机下的安装过程。

安装Ubuntu 11.10

安装好Ubuntu Server后,我设置源指向163

1
2
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
$ sudo echo "" > /etc/apt/sources.list

编辑source.list加入

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse 
deb-src http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse 
deb http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted 
deb http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted 
deb http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted 
deb http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted

更新服务器并安装一些必要软件

1
2
3
$ sudo apt-get update
$ sudo apt-get dist-upgrade -y
$ sudo apt-get install git-core openssh-server sendmail curl gcc libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev python-setuptools  

如果使用VMWare的虚拟机,最好安装一下VMWare-tools

安装rvm & ruby

gitlab需要使用ruby 1.9.2-p290,习惯了使用rvm来管理ruby版本,所以把rvm也安装一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
$ source /etc/profile.d/rvm.sh
$ type rvm | head -1
rvm is a function


#Rubies installed in system, gemsets separated per user:
$ rvm user gemsets
$ rvmsudo rvm install 1.9.2
$ sudo -H -i   #切换到root
$ rvm --default use 1.9.2
$ exit #退出root
$ rvm reload
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

基于速度的原因,把rubygem的源调整成taobao

1
2
3
4
5
6
7
$ gem sources -a http://ruby.taobao.org/
$ gem sources --remove http://rubygems.org/
$ gem sources -l 
*** CURRENT SOURCES ***

http://ruby.taobao.org/
$ 

淘宝镜像上第1,2行跟我这里反过来的,按官网写法我无法删除rubygems的源,另外我的source文件rubygems.org域名后面是有/的,所以也要加入才能删除。

或直接通过手工编辑vi ~/.gemrc删除。

由于使用了rvm多用户模式所以部分命令需要加上rvmsudo 进行。

安装rails

1
2
$ rvmsudo gem update --system 1.8.14 #安装1.8.15会出错
$ rvmsudo gem install rails

或安装GitLab指定版本

1
$ rvmsudo gem install rails -v 3.1.1 --no-ri --no-rdoc

安装和设置Gitolite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ sudo adduser \
  --system \
  --shell /bin/sh \
  --gecos 'git version control' \
  --group \
  --disabled-password \
  --home /home/git \
  git

# Add your user to git group
$ sudo usermod -a -G git `eval whoami` 

# Create ssh key
$ ssh-keygen -t rsa

# copy your pub key to git home
sudo cp ~/.ssh/id_rsa.pub /home/git/rails.pub

# clone gitolite
sudo -u git -H git clone git://github.com/gitlabhq/gitolite /home/git/gitolite

# install gitolite
sudo -u git -H /home/git/gitolite/src/gl-system-install

# Setup (Dont forget to set umask as 0007!! 搜索0077修改为0007)
sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup ~/rails.pub"

sudo chmod -R g+rwX /home/git/repositories/
sudo chown -R git:git /home/git/repositories/

检查gitolite安装是否成功,先重新登录确保已经加入git用户组

1
2
3
4
5
6
# clone admin repo to add localhost to known_hosts
# & be sure your user has access to gitolite
git clone [email protected]:gitolite-admin.git /tmp/gitolite-admin 

# if succeed  you can remote it
rm -rf /tmp/gitolite-admin 

如果有下面类似提示

1
2
3
4
5
6
7
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
  LANGUAGE = "en_US:",
  LC_ALL = (unset),
  LC_CTYPE = "zh_CN.UTF-8",
  LANG = "en_US.UTF-8"
    are supported and installed on your system.

编辑sudo vi /etc/environment添加以下内容到最后

1
2
3
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"
LANGUAGE="zh:en_US:en"

保存后执行source /etc/environment使其生效。

安装和设置GitLab

这里安装的是GitLab的Stable 2.1版本

安装GitLab必须包
1
2
3
$ sudo apt-get install python-dev python-pip sendmail redis-server libicu-dev
$ sudo pip install pygments
$ sudo gem install bundler

安装gitlab

按个人习惯将gitlab装在/usr/local目录下

1
2
3
4
$ sudo git clone -b stable git://github.com/gitlabhq/gitlabhq.git
$ sudo chown -R `eval whoami`:`eval whoami` /usr/local/gitlabhq
$ cd /usr/local/gitlabhq
$ rvmsudo gem install charlock_holmes -v '0.6.8'

修改GemFile的http://rubygems.orghttp://ruby.taobao.org/,然后

1
2
3
$ bundle install --without development test 
$ bundle exec rake db:setup RAILS_ENV=production
$ bundle exec rake db:seed_fu RAILS_ENV=production

Start Server

bundle exec rails s -e production

测试安装

打开 http://<ip>:3000,使用以下帐号和密码登录

User - [email protected] Password - 5iveL!fe

进入http://<ip>:3000/admin/users新增一个用户,完成后退出管理帐号。

使用刚新增的用户登录,并进入http://<ip>:3000/keys添加一个ssh key,如果没有则生成一个(可以参考github设置你的Git)。

返回首页,新建一个project成功后按系统提示操作

1
2
3
4
5
6
7
8
$ mkdir mylab
$ cd mylab
$ git init
$ touch README
$ git add README
$ git commit -m 'first commit'
$ git remote add origin [email protected]:mylab.git   #将loaclhost换成你的ip
$ git push -u origin master

如果push成功,你应该可以通过浏览http://<ip>:3000/mylab/repository看到刚刚的第一次提交。

后续安装

通过安装Passenger+Nginx可以使用系统管理更加方便,可以参考官方文档介绍。

Enjoy!


参考资料

  1. 如何在Ubuntu Server 11.10上安装GitLab
  2. Gitolite 构建 Git 服务器
  3. Create git user & install gitolite
  4. Installing GitLab on Ubuntu Server
  5. GitLab stable版Ubuntu安装

安装autoddvpn

Permalink

在家已经成功部署autoddvpn近两个月,所以在家里上网的感觉特好(偶尔拉风一下),特记录下来为大家做一次明灯。

动机

在用dd-wrt方案前,我用的是ssh tunnel再加上本地autopac,基本已经是一个无敌的解决方案了,也特靠谱的。但家里设备一多,你得想尽办法为每台设备折腾一下,找解决方案。折腾的这些东西都是很折腾人的。与其这样,何不在路由上做功夫,一劳永逸呢。

需要环境

准备

关于DD-WRT路由器

家里正好有两台设备,一台是D-Link DIR-605 D1 ,通过查询是wip状态:

work in progress, router support is in the works, but please don’t ask how long it takes, we cannot give you a schedule in the most cases.

另一台为Netgear WGR614 v9,非常悲剧也是wip。正要放弃准备购买新设备时得知,DIR-605可以刷DIR-615 D2,经过两个晚上的几个小时尝试最终也刷成功,但最后我还是买了一台路由器,因为DIR-605无论如何也支持不了OpenVPN。

如果设备支持OpenVPN,在下载页会列出标有vpn字样的下载链接

我为什么需要OpenVPN?因为我拥有一个Astrill的VPN帐号推广链接,就因为这个家伙介绍支持DD-WRT我才知晓可以这样玩. Astrill VPN本身是不支持多设备同时登录,通过DD-WRT则可允许7台设备同时使用。

当时我还不知道有autoddvpn这个东西,只能按Astrill的安装介绍来寻找一台支持OpenVPN版本的DD-WRT路由器了。而Astrill推荐Asus RT-N16Linksys WRT 160N,刚好有朋友从香港回来就托运了一台,这样又多花费550人左右。所以我最后用的设备是RT-N16。

事实上,你不需要OpenVPN,用PPTP也是可以的,只要按照autoddvpn的文档写好你的脚本。通过Astrill的安装界面只是图个方便而已。这里我用“可能”来描述是因为我没有进行测试。只不过到后来我也放弃了Astrill的内置安装模式。

关于PPTP或OpenVPN帐号

刚才我说了,我的解决方案是Astrill,大概一年70刀,最近又涨价了。而且现在竟然将DD-WRT单独出来做增值收费, 需要另付 $1/月。

如果你有root权限的主机,自建一个OpenVPN Server也是不错的选择。反正我就没有时间折腾,留给后来人做。

而淘宝上也有很多廉价VPN,总会有你合适的吧。想不花点钱还是不太靠谱吧?

顺便说说Astrill的优势在于服务器节点多,虽然很多速度也不怎么样,但香港节点和美国部分节点都非常的快,而且都不限流量。试过有一次通过New York节点下载XCode 4 ,是1MB/秒的速度。

ADSL

中国电信的8M ADSL

安装调试

刷新固件

硬件准备好后就可以开始刷设备了,从dd-wrt.com下载合适的rom文件到本地。针对我的RT-N16,我一共下载了三个文件

  • dd-wrt.v24-14896_NEWD-2_K2.6_mini_RT-N16.trx
  • dd-wrt.v24-14896_NEWD-2_K2.6_mini.bin
  • dd-wrt.v24-14896_NEWD-2_K2.6_openvpn.bin

用网线接上路由器,访问路由器设置网,找到通过本地上传方式更新固件的位置,必须先刷第一个文件,即扩展名为.trx的那个。刷新成功后,再刷其它,都非常简单就不表了。可以看看这里

设置路由

如果使用的是Astrill服务,非常简单。连上网络后通过Astrill的客户端调出安装界面按提示执行就可以了。安装成功后在DD-WRT的路由设置页面进行设置,而且有专门针对GFW的设置,其实原理跟autoddvpn差不多,通过判断IP是否在墙内选择链路。

不过最后,我还是选择了使用autoddvpn介绍的最好模式graceMode。通过Astrill的傻瓜方式虽然可行,但:

  • 连接服务不知为何非常的慢。
  • 访问国内网站cdn cache会失效
  • 依赖VPN的稳定性,试过几次VPN掉了连国内网站都访问不到

而autoddvpn是反向处理,使用的是本地DNS,对于部分指定的域名才走VPN链路。所以就算VPN不稳定的情况下,至少能保障国内的网站可以访问。

至于如何设置autoddvpn这里不说了,我认为官方的文档已经足够详细。如果你也像我一样使用Astrill VPN服务的话,通过ssh登录路由器,准备你的OpenVPN设置。

openvpn.conf文件需要用到的证书可以通过登录as trill的会员中心VPN SERVICES - OpenVPN certificates 下载。Server List则可以获取当前的服务器状态和IP,选择几个最快的节点吧,我使用的是HK1和NY1。

使用感受

两个月来,在家上网的体验是最好的,唯一不足是最近路由器竟然连接不上,会自动死掉也不会重启,重启后很快又正常。也不知道是否因为刷了DD-WRT而不稳定,我听朋友说他家的官ROM还是非常稳定的,有空时我想重刷一次看看效果。

这样作在家里用倒不错,但出门后就有点麻烦了。手机还好,需要那个情况不好,而且twitter也可以用API Proxy解决。所以我的Mac还是装用iSSH和PAC以备不时之需。其实我想过段日子每天出街自备一个TP—LINK TL-WR800N,连上网络后再接家里的VPN Server端口再访问出去……但多绕啊!再看看吧,不一定弄了。

最后感觉变成Astrill的推广文了,不写了…其实我觉得如果有Linode的东京节点,自建个OpenVPN Server应该也是不错的选择。

如有问题欢迎跟我交流联系.

Sinaly将退伇

Permalink

一大早的,见到trunk.ly已经被AVOS收购,将整合到Delicious,同时trunk.ly将于2012年1月13日停止运作。那么我的同步程序Sinaly也可以于同一天停止动作了,大家尽快适应Delicious吧。

现在我的问题是还不知道如何将旧delicious的书签导入到新版?又如何将trunkly导入?

后者trunkly正在努力,我相信会有好的解决方案,祝贺trunk.ly团队

Gitbox=git+dropbox

Permalink

自从没有每天背着手提电脑上班后,感觉颈椎真的轻松了很多,为了身体,未来一段时间也不会背着电脑移动。但电脑不移动后,就要想办法将办公室与家里的电脑同步,以保持文档版本的一致性。 现在云服务非常流行,当然将主要文档同步到云端去,我选择了一直使用的dropbox做简单的文档同步就好了。而又有一些属于私人性质的项目代码使用Git进行版本控制,当然我暂时不想将它们公开放到github,又不想购买私有仓库。当然用 [bitbucket](https://bitbucket.org/) 也不错,它现在已经提供免费的git私有仓库了。当然用dropbox DIY一个其实也挺靠谱的,你只需要这样做:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#工作目录 
~/project $ git init
~/project $ git add .
~/project $ git commit -m "first commit"
~/project $ cd ~/Dropbox/git

#Dropbox目录 
~/Dropbox/git $ mkdir project.git
~/Dropbox/git $ cd project.git
~/Dropbox/git $ git init --bare
~/Dropbox/git $ cd ~/project

#将工作目录推送到Dropbox云端
~/project $ git remote add origin ~/Dropbox/git/project.git
~/project $ git push origin master