使用七牛云存储托管Octopress

七牛云存储

七牛云存储致力于提供最适合开发者的数据在线托管、传输加速以及云端处理的服务。区别于国内外其他云存储,七牛自行研发的全分布式架构解决了其他云存储单一数据中心的架构可能存在的风险,同时首创双向加速特性对数据上传下载均加速,使得数据访问速度较传统方案平均提升50%以上。

博客迁移

之前我的博客是托管在github上的,因为都是静态内容,迁移到七牛非常方便,

下载

qrsync 命令行辅助同步工具下载地址:

Mac OS: http://devtools.qiniudn.com/qiniu-devtools-darwin_amd64-current.zip

安装

先在octopress目录建立一个配置文件,比如叫 conf.json,内容大体如下:

{ "access_key": "Please apply your access key here", "secret_key": "Dont send your secret key to anyone", "bucket": "Bucket name on qiniu resource storage", "sync_dir": "Local directory to upload", "async_ops": "fop1;fop2;fopN", "debug_level": 1 }

配置文件语法可以参考 JSON 。
其中,access_key 和 secret_key 在七牛云存储平台上申请。步骤如下:

开通七牛开发者帐号

登录七牛开发者自助平台,查看 Access Key 和 Secret Key

bucket 是你在七牛云存储上希望保存数据的 Bucket 名(类似于数据库的表),这个自己选择一个合适的就可以,要求是只能由字母、数字、下划线等组成。

sync_dir 是本地需要上传的目录,绝对路径完整表示。这个目录中的所有内容会被同步到指定的 bucket 上。注意:Windows 平台上路径的表示格式为:盘符:/目录,比如 E 盘下的目录 data 表示为:e:/data 。

async_ops 是设置上传预转参数,一般上传的音视频如果需要转码,可以使用该参数。详情参考:音视频上传预转 - asyncOps

ignore_patterns 参数是一个关于忽略文件或目录的匹配字符串数组,匹配规则类似.gitignore,参考具体规则

同步

在octopress目录执行以下命令,开始把博客同步到七云空间

./qrsync cong.json

pthread_cond_timedwait设定

pthread_cond_timedwait用于在指定的时间之前阻塞,与pthread_cond_wait的用法基本相同,
区别在于在由 abstime指定的时间之后pthread_cond_timedwait()不再被阻塞。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct timespec abstime; //绝对时间
struct timeval now;
int err;
int timeout_ms  = 500; //超时时间毫秒
gettimeofday(&now, NULL); //获得精确到微秒(1000,000分之一秒)
int nsec = now.tv_usec * 1000 + (timeout_ms % 1000) * 1000000;
abstime.tv_nsec = nsec % 1000000000; //纳秒 1000,000,000分之一秒
abstime.tv_sec = now.tv_sec + nsec / 1000000000 + timeout_ms / 1000;  //秒
err = pthread_cond_timedwait(&(&p_decode->datafifo)->cond, 
&(&p_decode->datafifo)->mutex,&abstime);
if(err == ETIMEDOUT)
{
	//超时后的处理
}

OSX升级失败后的无限菊花

问题现象

10.8.5直接安装10.9 DP7出现错误,重启后无限菊花

Time Machine备份。

开机Command+R 通过磁盘管理工具Reinstall a new copy of OS X无效,因为10.9已是最新版T-T

尝试过将菊花的电脑作为目标磁盘,通过火线连接,挂载到另一台Mac,失败。。

最终解决方案

在其他电脑上制作了一个U盘系统盘(就是将一个完成OS X安装到了U盘),这个比较简单,就是要把U盘设置为GUID分区表,然后将10.9的安装到上边。

然后在菊花的电脑的上开机按Option,选择U盘启动。因为系统完全从这个U盘启动,速度很慢。

进入系统后,可以看到挂载的原硬盘,这时候把10.9的安装镜像copy到原硬盘上。双击开始安装,位置就是原硬盘
大概20多分钟,系统就安装好了,再次进入系统就是崭新的10.9了,而且用户数据都在的。

在OS X上搭建Git服务器

我勒了擦,配置个Git服务器居然浪费了哥一天的时间。各种问题不断。

1.准备

在系统设置-用户和组中,添加一个新的普通用户,名称为git。

在共享中开启文件共享 远程登录 网络共享,设置为允许git访问。

确认pythongit已经安装了。

2.制作公钥

为了省去来回切换用户的麻烦,首先在客户端制作公钥。
客户端可以是同一台机器的其他用户或另外一台机器。我这里用的当前登录用户xujingbao作为客户端。执行以下命令:

1
ssh-keygen -t rsa

提示输入3次,直接打回车就可以了。id_rsa(私钥)和id_rsa.pub(公钥)就生成了,然后把公钥复制到服务器端的/tmp目录下,顺便把名字改了。

1
cp ~/.ssh/id_rsa.pub /tmp/xujingbao.pub

3.安装gitosis

切换到服务端,也就是刚才创建的git用户,安装gitosis;

1
2
3
git clone git://github.com/res0nat0r/gitosis.git
cd gitosis  
sudo python setup.py install

!这里因为git是一个普通用户,执行sudo时会报is not in the sudoers file. this is incident will be reported的错误,所以切换到可以执行sudo的用户,为其添加权限。

1
vi /etc/sudoers

在root ALL=(ALL)ALL下边添加一行 git ALL=(ALL)ALL

4.初始化gitosis
1
sudo -H -u git gitosis-init < /tmp/xujingbao.pub

初始化成功的话,会有以下提示:

1
2
Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/  
Reinitialized existing Git repository in /Users/git/repositories/gitosis-admin.git/

同时在home目录下会出现一个repositories目录,目录下有一个gitosis-admin.git,那么这个git库就是用来管理所有git库的访问权限的。它有gitosis.conf和一个keydir两个目录,gitosis.conf文件就是权限配置的地方,keydir存放的是所有客户端的公钥,公钥名字必须和配置文件中的member名字对应。

其他修改:

1
2
3
4
5
6
7
//修改post-update的权限
sudo chmod 755 /Users/git/repositories//gitosis-admin.git/hooks/post-update
//
touch ~/.bashrc  
echo PATH=/usr/local/bin:/usr/local/git/bin:\$PATH > .bashrc  
echo export PATH >> .bashrc  
cat .bashrc

这样服务端配置就完成了!

5.gitosis-admin

因为我用xujingbao.pub 初始化了这个库,所以我可以在xujingbao这个用户下clone这个库,然后管理所有的访问权限。

1
git clone git@host:repositories/gitosis-admin.git

打开gitosis.conf,有如下内容:

1
2
3
4
5
[gitosis]  
  
[group gitosis-admin]  //组名 仓库名
members = xujingbao    //成员
writable = gitosis-admin //权限

如果我们新添加一个项目叫test,他的成员有zhangsan,lisi,wangwu,zhangsan和lisi有写权限,wangwu只读,那就添加如下内容:

1
2
3
4
[group test]  
members  = zhangsan lisi wangwu  
writable = zhangsan lisi
readable = wangwu

在本地修改完权限后,需要提交到服务器:

1
git push

在服务端创建库test:

1
2
3
4
cd repositories
mkdir test
cd test
git init --bare   //--bare是必须的

回到客户端在需要git管理的项目目录下进行初始化

1
2
3
4
5
git init
git remote add origin git@host:repositories/test.git 
git add .
git commit -m "commit"
git push -u origin master

这样就把本地的文件推上去了。

旧工程在Xcod5下出现的问题

最近把iOS6的项目拿到Xcode5下去编译并运行,出现了一些问题:

1、AssertMacros: queueEntry, file: /SourceCache/IOKitUser/IOKitUser-920.1.11/hid.subproj/IOHIDEventQueue.c,

修改main.m,添加如下代码

1
2
3
4
5
6
7
8
9
typedef int (*PYStdWriter)(void *, const char *, int);
static PYStdWriter _oldStdWrite;
int __pyStderrWrite(void *inFD, const char *buffer, int size)
{
    if ( strncmp(buffer, "AssertMacros:", 13) == 0 ) {
        return 0;
    }
    return _oldStdWrite(inFD, buffer, size);
}

然后在main()中的 @autoreleasepool 前添加

1
_oldStdWrite = stderr->_write; stderr->_write = __pyStderrWrite;
2、-[UIView setImage:]: unrecognized selector sent to instance 0x1d410f0

通过Debug定位到如下的代码:

1
2
3
4
5
6
for (int i = 0; i < [self.subviews count]; i++)
{
     UIImageView* dot = [self.subviews objectAtIndex:i];
     if (i == self.currentPage) dot.image = activeImage;
     else dot.image = inactiveImage;
}

self是一个UIPageControl,也就是它的subviews不都是UIImageView,所以要做一下检查,修改如下:

1
2
3
4
 if ([dot isKindOfClass:[UIImageView class]]) {
     if (i == self.currentPage) dot.image = activeImage;
     else dot.image = inactiveImage;
 }