Mirror a git repo

git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

cd ..
rm -rf old-repository.git
# Remove our temporary local repository

See here for more.

Raspbian GNU/Linux 7 配置WIFI

在树梅派原厂的,基于Debian Wheezy的系统中配置WIFI连接,让它开机自动连热点…这样就可以无头使用了…

偷懒,问度娘。不过度娘说的大都都用不了。想偷懒还是不行滴…

查Debian手册,找到了这个:WiFi/HowToUse#wpasupplicant

树梅派系统默认带了wpa_supplicant,所以只要wlan0能识别出来就可以(可以用ip link命令确认)。

执行wpa_passphrase,获得psk。假设WIFI名字(SSID)是myssid,密码是my_very_secret_passphrase。

wpa_passphrase myssid my_very_secret_passphrase

得到以下输出:

network={
        ssid="myssid"
        #psk="my_very_secret_passphrase"
        psk=ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b
}

复制psk=ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b备用。

用一个你喜欢的编辑器打开/etc/network/interfaces

如果你想要dhcp,修改wlan0的部分为:

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
    wpa-ssid myssid
    wpa-psk  ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b

如果你想要静态IP,假设IP为192.168.0.2,子网掩码255.255.255.0,网关为192.168.0.1,修改wlan0的部分:

allow-hotplug wlan0
auto wlan0
iface wlan0 inet static
    wpa-ssid myssid
    wpa-psk  ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b
    address  192.168.0.2
    netmask  255.255.255.0
    gateway  192.168.0.1
    # dns-nameservers 192.168.0.1 # not work

dns-nameservers在这里不起作用。事实上,resolvconf并没有默认安装。
所以,dns服务器需要直接修改/etc/resolv.conf,例如将dns改为192.168.0.1:

nameserver 192.168.0.1

关于resolvconf和dns-nameservers的细节,戳这里

HOW-TO: 在ArchLinux中降级软件包

因为各种奇怪的事情,偶尔在pacman -Syu之后,有趣的现象会发生,比如上不了网了…

今天pacman -Syu之后,wifi-menu一直报错,显示Aborted。

查了一下/var/log/pacman.log,感觉是wpa_supplicant的问题:

[2015-04-25 14:24] [ALPM] upgraded wpa_supplicant (2.3-1 -> 2.4-1)

所以先降级。看一下以前升级下的低版本包。ArchLinux每次升级都会把包下载到本地,并且不会覆盖以前的包。
也就是说,如果没有删过,那安装的某个包的所有版本,都会留在本地。

[/var/cache/pacman/pkg] femrat$ ls wpa*
wpa_supplicant-2.4-1-x86_64.pkg.tar.xz

纳尼。。我什么时候手欠把老包删了。。。。

如果你在这个目录中找到了老版本的包,请直接跳转到文章末尾安装即可。

ArchLinux作为滚动发行版,一大特色就是…没!有!历!史!包!提!供!下!载!

…ArchLinux源里只有最新版本的包。不过对于历史…ArchLinux也没有丢弃,提供PKGBUILD下载。

ArchLinux的PKGBUILD是打包控制文件,它决定了源码从哪下载,包怎么打什么的。
一般PKGBUILD里会给出上游源码(或者二进制)下载的URL,打包的时候从指定的地址下载源码包然后本地编译打包。

所以现在需要祈祷的就是,上游源码还在…下载地址还有效…

不过在祈祷之前,首先得找到PKGBUILD。

访问http://archlinux.org,右侧Package Search中填入wpa_supplicant,选择目标架构(Arch)对应的包——这里我选的是x86_64,会进入到https://www.archlinux.org/packages/core/x86_64/wpa_supplicant/这个页面。

在页面右侧Package Actions中,点Source Files,我们来到了https://projects.archlinux.org/svntogit/packages.git/tree/trunk?h=packages/wpa_supplicant

题外话。这是一个Git源。如果你有足够的好奇心,可以点summary,把页面往下拉,找到git地址把库clone下来… 不过我这网速还是算了吧。顺便提一句,每个包都对应这个库中的一个分支(Branch),所以你clone的时候实际上是把所有包的所有历史都拽回来了。

ArchLinux这个库中,对于每个分支,有trunk和repos两个文件夹。刚才进入的是trunk,这个不是发布到源中的包用的打包脚本。所以找到summary refs log…下面的path: root/trunk,点root然后进入root/repos,即这个页面:https://projects.archlinux.org/svntogit/packages.git/tree/repos?h=packages/wpa_supplicant

core-x86_64文件夹就是我们需要的东西了。点它旁边的log,查看所有和这个文件夹有关的git历史。

Age         Commit message (Expand)                                                ...
15 hours    db-move: moved wpa_supplicant from [testing] to [core] (i686, x86_64)  ...
2014-10-19  db-move: moved wpa_supplicant from [testing] to [core] (i686, x86_64)  ...

ArchLinux包维护是testing测好了之后发布到core/extra/community。15 hours那个包就是我们现在装的,有问题。所以我们降到2014-10-19的包。点那个commit的commit message,进入https://projects.archlinux.org/svntogit/packages.git/commit/repos/core-x86_64?h=packages/wpa_supplicant&id=4ed8733c9b86bcecf6131386a54f1cdec56e9222

找到

download  packages-4ed8733c9b86bcecf6131386a54f1cdec56e9222.tar.gz

点链接下载,解压,进入packages-4ed8733c9b86bcecf6131386a54f1cdec56e9222/repos/core-x86_64目录,以非root身份运行:

makepkg

提示缺依赖的话,用makepkg -s命令。

如果一切顺利,makepkg会从PKGBUILD中下载指定的源码包,然后自动打包生成wpa_supplicant-2.3-1-x86_64.pkg.tar.xz,留在这个目录下。

安装这个包:

切换到root,执行

pacman -U wpa_supplicant-2.3-1-x86_64.pkg.tar.xz

Enjoy。(对于wpa_supplicant这个包… 可能需要重启一下才好用,否则报systemd服务无法启动。原因不明——谁让我重启快=。=…不找原因了。)

sync system time with ntpdate

Install ntp for CentOS:

yum install ntp

Use the following commands to sync with the server

ntpdate -u pool.ntp.org
hwclock -w

The parameter -u means:

-u      Direct  ntpdate  to  use  an unprivileged port for outgoing packets. This is most useful when behind a
        firewall that blocks incoming traffic to privileged ports, and you  want  to  synchronize  with  hosts
        beyond the firewall. Note that the -d option always uses unprivileged ports.

Note that without -u, you may get such an error while ntpdate -d pool.ntp.org reports no error.

ntpdate: no server suitable for synchronization found

No need to start ntpd service.

References:
http://askubuntu.com/questions/429306/ntpdate-no-server-suitable-for-synchronization-found
http://www.cyberciti.biz/faq/howto-set-date-time-from-linux-command-prompt/
http://www.blogjava.net/spray/archive/2008/07/10/213964.html

srt字幕文件格式

1
00:00:10,500 --> 00:00:13,000
Elephant's Dream

2
00:00:15,000 --> 00:00:18,000
At the left we can see
how many ...

类似以上。

注意序号从1开始,而且不能省略
时间的小时、分钟、秒数必须是两位,比如00、01。
时间的秒和毫秒之间必须是逗号,小数点不行。
换行必须是\r\n(0x0d, 0x0a)

部分播放器可以兼容比如没序号,小时数不是两位,甚至逗号和小数点混用的情况,但是在另一些设备上则不行。

Ref:
http://en.wikipedia.org/wiki/SubRip

remove CNNIC cert

for ArchLinux

ln -s /etc/ssl/certs/CNNIC_ROOT.pem /etc/ca-certificates/trust-source/blacklist && update-ca-trust

for others
◇清理Windows的证书(适用IE、Chrome、Safari)

  对于使用Windows下的IE或Chrome或Safari浏览器,则需要执行如下步骤:
1. 运行Windows的证书管理器(到命令行执行certmgr.msc)。
2. 选中“受信任的根证书颁发机构”=>“证书”。
3. 查看右边的证书列表。如果里面已经有CNNIC的证书,直接跳到第7步。
4. 先翻墙到“这个页面”下载现成的CNNIC证书(要解压缩出来)。
5. 鼠标在“受信任的根证书颁发机构”=>“证书”上点右键。在右键菜单中点“所有任务”=>“导入”。
6. 出现一个导入向导,根据先导一步步的提示,把上述CNNIC证书导入到证书列表中。
7. 选中CNNIC证书,点右键。在右键菜单中点“属性”。
8. 在跳出的属性对话框中,选中“停用这个证书的所有目的”,然后确定。
9. 最后,为了保险起见,再把这三个证书,导入到“不信任的证书”中(方法和上述类似)。

注:上述操作仅对当前用户生效。如果你的Windows系统中有多个常用的用户帐号,要对每一个用户进行上述设置。

◇清理苹果Mac OS的证书(适用Safari、Chrome)

  对于使用Mac OS下的Safari或Chrome浏览器,则需要执行如下步骤:
请到“实用工具”=>“钥匙串访问”=>“系统根证书”=>“证书”,找到CNNIC的证书并双击,改为“永不信任”。

注:如果你的界面是洋文,其操作方式也八九不离十。俺就不再啰嗦了。

◇清理Linux的证书(适用Chrome、Safari)

  对于Debian和Ubuntu系统,以管理员权限进行如下操作:
方法1:
运行命令:dpkg-reconfigure ca-certificates 会出现一个图形界面,把CNNIC证书不选,并确认。
方法2:
编辑 /etc/ca-certificates.conf 文件,把CNNIC证书对应的行删除或注释掉。然后用命令 update-ca-certificates 使之生效。

注:对于其它Linux发行版本,也有类似操作,俺不再啰嗦。

◇清理Firefox的证书

  不论是在哪个操作系统下,只要你用的是Firefox浏览器(它的证书体系独立于操作系统的),则需要执行如下步骤:
1. 从菜单“工具”=>“选项” ,打开选项对话框
2. 切换到“高级”部分,选中“加密”标签页,点“查看证书”按钮。
3. 在证书对话框中,切换到“证书机构”。
4. 里面的证书列表是按字母排序的。把CNNIC打头的都删除。

注:如果某个证书是Firefox自带的,则删除之后,下次再打开该对话框,此证书还在。不过不要紧,它的所有“信任设置”,都已经被清空了。

◇清理Opera的证书

不论是在哪个操作系统下,只要你用的是Opera浏览器(它的证书体系独立于操作系统的),则需要执行如下步骤:
1. 从菜单“工具”=>“首选项” ,打开首选项对话框
2. 切换到“高级”标签页,在左边选择“安全性”这项。
3. 点“管理证书”按钮,出来一个证书的对话框。切换到“证书颁发机构”标签页。
4. 找到CNNIC的证书并选中,点“查看”按钮,在证书属性对话框中,把“允许连接到使用此证书的网站”的打勾去掉

注:俺是基于Opera 10.10进行操作。新版本的界面可能略有差异。

★如何确认门户已经清理干净?

  为了保险起见,在完成上述的清除工作之后,你需要用浏览器访问一下老流氓的一个网站,地址是 https://www.cnnic.cn 记得用 HTTPS 协议哦。
  如果你的浏览器报告该网站的证书有问题,那恭喜你,你的门户清理干净了 🙂
  如果该网站的页面顺利打开,那你就要重新检查一下,看上述操作是否出了差错。

references
http://program-think.blogspot.com/2010/02/remove-cnnic-cert.html
(csdn mirror: http://blog.csdn.net/program_think/article/details/5309699)
http://forum6.hkgolden.com/view.aspx?type=BW&message=5744329

pacman

pacman包管理器有很多好玩的命令

femrat$ pacman -Ql pacman | grep bin
pacman /usr/bin/
pacman /usr/bin/bacman
pacman /usr/bin/checkupdates
pacman /usr/bin/cleanupdelta
pacman /usr/bin/makepkg
pacman /usr/bin/makepkg-template
pacman /usr/bin/paccache
pacman /usr/bin/pacdiff
pacman /usr/bin/paclist
pacman /usr/bin/paclog-pkglist
pacman /usr/bin/pacman
pacman /usr/bin/pacman-db-upgrade
pacman /usr/bin/pacman-key
pacman /usr/bin/pacman-optimize
pacman /usr/bin/pacscripts
pacman /usr/bin/pacsearch
pacman /usr/bin/pacsort
pacman /usr/bin/pactree
pacman /usr/bin/pkgdelta
pacman /usr/bin/rankmirrors
pacman /usr/bin/repo-add
pacman /usr/bin/repo-elephant
pacman /usr/bin/repo-remove
pacman /usr/bin/testdb
pacman /usr/bin/testpkg
pacman /usr/bin/updpkgsums
pacman /usr/bin/vercmp

比如pactree:

femrat$ pactree bash
bash
├─readline
│ ├─glibc
│ │ ├─linux-api-headers
│ │ ├─tzdata
│ │ └─filesystem
│ │   └─iana-etc
│ └─ncurses
│   ├─glibc
│   ├─gcc-libs-multilib provides gcc-libs
│   │ ├─glibc
│   │ └─lib32-gcc-libs
│   │   └─lib32-glibc
│   └─bash provides sh
└─glibc

程序的运行时间

times的函数签名是这样的:

#include <sys/times.h>

clock_t times(struct tms *buffer);

man(3)中的描述是这样的:

times — get process and waited-for child process times

struct tms的声明在/usr/include/sys/times.h中:

/* Structure describing CPU time used by a process and its children.  */
struct tms {
    clock_t tms_utime;      /* User CPU time.  */
    clock_t tms_stime;      /* System CPU time.  */
    clock_t tms_cutime;     /* User CPU time of dead children.  */
    clock_t tms_cstime;     /* System CPU time of dead children.  */
};

这里,waited-for child process就指的是已经结束的、并且已经被wait()系列函数取回过进程信息的子进程。

不用wait()系列函数取回进程信息的话,子进程时间不会加进来。

下面例子说明:

#include <stdio.h>
#include <sys/times.h>
#include <unistd.h>

void print_times(const char *str) {
    struct tms s;
    times(&s);
    printf("%s: %ld, %ld, %ld, %ld\n", str,
            s.tms_utime, s.tms_stime, s.tms_cutime, s.tms_cstime);
}

int main(void) {
    if (fork() == 0) {
        print_times("child(start)");
        long long i;
        for (i = 0; i < 1999999999; ++i) ++i;
        print_times("child(end)");
    } else {
        print_times("parent(start)");
        sleep (1);
        print_times("parent(after sleep)");
        wait(NULL);
        print_times("parent(after wait)");
    }
    return 0;
}

执行:

femrat$ gcc test.c
femrat$ ./a.out
parent(start): 0, 0, 0, 0
child(start): 0, 0, 0, 0
parent(after sleep): 0, 0, 0, 0
child(end): 400, 0, 0, 0
parent(after wait): 0, 0, 400, 0

如果要读正在运行中的进程信息,那么需要访问/proc/[pid]/stat等文件。
这里有一个写好的,来自Tufts。