Right way to connect to a wireless network and assign a static IP address in Raspbian

Connect to a wireless network

Add these code to /etc/wpa_supplicant/wpa_supplicant.conf

network={
    ssid="SSID"
    psk="Your_wifi_password"
}

Then ifdown and then ifup your wireless interface.
Raspbian should connect to the network and get an IP address by dhcpcd automatically.

Set static IP address for an interface

NEVER modify /etc/network/interfaces again.

Add these to /etc/dhcpcd.conf

interface eth0
static ip_address=192.168.0.200/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

Replace eth0 and the addresses as what you want.

ref: 1 2

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。