mount小tricks


1. 我今天才知道原来同一个device (比如/dev/sdb1)可以被重复mount到几个不同的mount points(比如/home和/mnt/debug).

2. 一个mount point上重复mount两个devices会发生什么情况?比如说在/dev/sda1已经被mount到/home的情况下,你不小心又mount /dev/sdb1到/home. 这个我很早以前就知道了,效果基本上相当于直接mount了后面那个device. 你可以读写到/dev/sdb1。当你执行了一次umount /home之后,Kernel会自动恢复到mount /dev/sda1到/home的状况。

3. 一般情况下当然只有root才能mount。要想让某个device可以让用户mount,可以在/etc/fstab里相关的那一行加参数user. 比如:

/dev/cdrom /cd iso9660 ro,user,noauto,unhide

4. mount好了的一个分区想改变属性,比如说从可读写改成只读,可以这样:mount -o remount,ro /home

,

发表评论

Ubuntu 12.04安装笔记


又到了需要升级我的Ubuntu系统的时候,以下是我的笔记,写出来主要是为了给自己看,但如果能给别人一些帮助也挺好。

基本系统安装

CD
烧了一张Ubuntu 12.04 Alternative AMD64 安装CD. 没有用标准的图形化界面一是因为这年头Gnome/Unity已经没法用了,得选其它的桌面;二是因为Alternative disk有更多的控制选项(boot的时候按F4, 选定制安装)。本来也可以用USB jumpdrive的,但我以前试过,读取数据有时候远远不如从CD上读。
分区
之前的电脑上本来就分好了,一个28G的分区给系统(/), 56G的给/home,145G的放在/mnt/data,用来存所有的音乐,照片等等。这次重装系统,我只需要把/格式化掉即可。现在的Ubuntu default文件系统好像是ext4, 速度谈不上最快但很稳定。我觉得没必要折腾btrfs之类的东西了。
安装
现在基本上很智能了。记得选附近(RIT)的mirror,还有就是从网上直接下载最新的package. Desktop我选了Lubuntu和Xubuntu。

安装更多的软件

装完基本系统,重启看看没什么问题之后就装自己常用的软件。

  • 第一步,打开universe和multiverse source,再加上Ubuntu partners. Optional: 可以再加上一些PPA. 比如说下面是最新版本emacs的源
    sudo add-apt-repository ppa:cassou/emacs
  • 第二步,update system.
    sudo aptitude update && sudo aptitude safe-upgrade
  • 第三步,去网上下载安装ubuntu-tweak. 用它可以方便的管理一些第三方软件源,比如说skype。
  • 第四步,用自己的script装(几乎)所有的软件。

系统配置

  • sudo免密码
    用这个命令修改sudo的设置

    sudo visudo

    加上这么一句:

    yourusername ALL=(ALL) NOPASSWD: ALL
  • 网卡问题
    装好之后我这个老革命也碰到了一个从来没见过的新问题。无线网卡不能上网,只能有线上。用ifconfig看,只有lo和eth0,没有wlan0. ifup wlan0也不行。开始我以为是kernel module的问题(3.2系列kernel我以前没用过,而且驱动模块从iwlagn变成了iwl4965)瞎折腾了半天,后来才发现最神奇的是一旦插上网线,eth0和wlan0就同时出来了,然后拔掉网线也可以用无线上网。这样的话就肯定不是内核或者硬件的问题。折腾了半天,最后的解决方法是删掉/etc/network/interfaces里头的这一段看似无比正确的语句

    auto eth0
    iface eth0 inet dhcp

    然后一切都正常了。至今不明原理。

  • 声音问题
    这个也是好久好久没碰到过的问题了:没有声音。根据以前的经验,多半不是什么高深的驱动问题,而是最最简单的mute/unmute问题。浪费了不少时间调alsamixer一点用都没有,突然想起来这些年来Linux又换了一个声音后端,现在多半不用alsa而是用pulse audio了。赶紧查一下什么程序可以调pulse, 发现系统自带一个程序叫做pulse volume control(包的名字:pavucontrol)就是干这个的。unmute即可。
  • 生成中文locales
    现在其实需要中文locales的地方已经很少很少了。但telnet上BBS还是需要的。 cd /var/lib/locales/supported.d 编辑一个文件:zh zhHK.UTF-8 UTF-8 zhTW.UTF-8 UTF-8 zhCN.UTF-8 UTF-8 zhCN.GB2312 GB2312 zhCN.GBK GBK zhCN.GB18030 GB18030 zhTW.Big5 Big5Optional: 你可以从那个en文件当中删掉一些不想要的locales, 只保留一个enUS.UTF-8 UTF-8即可。然后sudo dpkg-reconfigure locales
  • Keyboard shortcuts
    • xmodmap
      Xfce自动会读=~/.Xmodmap=.
    • GTK apps Emacs keybindings
      如果想要让GTK程序(绝大多数程序)都用上类似于emacs的keybindings, 可以这样: gconf-editor ==> desktop ==> gnome ==> interface ==> gtkkeytheme, replace ‘Default’ to ‘Emacs’
    • Make use of “Win” key
      [GUI] ==> System ==> Keyboard ==> Layout Options ==> Alt/Win key behavior ==> Hyper is mapped to the Win-keys
    • Use Alt-F6 to max vert
      gconf-editor ==> apps ==> metacity ==> globalkeybindings, disable <Alt>F6, then windowkeybindings, define A-F6
  • xrdb
    Xfce会自动读=~/.Xdefaults=. 如有另外配置需读,可以放到=.xsessionrc=里。

XFCE或者LXDE桌面相关配置

和gnome相比,这两个桌面都比较轻量。相对而言,需要手动配置的地方也多一些。

  • 让XFCE/LXDE启动时source一些个人配置
    这两个桌面(还包括一些更简单的“桌面”,比如说openbox)默认都不会去source你的~/.bashrc. 这样可能会造成很多不方便的地方,因为所有通过GUI启动的程序都不会遵守你自己写的配置。 查了好久,发现正确的配置文件为=~/.xsessionrc=. 通过这个就可以改比如说PATH之类的环境变量了。 另外一个相关但不一样的问题:如何让LXDE/XFCE启动桌面的时候自动启动一些程序?最佳的方式是把一些=.desktop=文件拖拽到=~/.config/autostart=这个目录下。

,

发表评论

SSH的配置文件


该文件本身为~/.ssh/config,可以把常用的一些配置写在里面。

例子:

ServerAliveInterval 30  #每30秒发一个空包让服务器不把你踢下去
ForwardX11 yes  #相当于ssh -X

Host servname # 短名, 这样 ssh servname就行了
  Hostname servname.domain.com # 全名或者IP
  Port 12345 # 相当于 ssh -p 12345
  User root # 相当于 ssh root@....
  LocalForward 10021 ftpserv.ip.address:21
  LocalForward 10139 fileserv.ip.address:139
  DynamicForward 9999

最后的几句解释一下。 LocalFoward把对方内网服务器端口map到本地,所以本来对外不开放的服务/端口就能通过SSH tunnel到你的本地机器。有了这两句,当你ssh servname联通之后,可以用ftp client直接连localhost的10021端口,用smb client连localhost的10139端口。之所以不直接用port 21, 139是因为这两个低号码端口只有root才能开。

DynamicForward 9999的意思是在你的本地机端口9999建立一个socks5代理,一大堆应用程序比如说Firefox, Pidgin等等就可以通过这个代理走SSH通道了。

最后一个小tip, Firefox的options菜单里头可以手动改SOCKS代理,但是每次要改来改去显然不方便。装一个叫做foxyproxy的插件就能点一个图标切换(多个)代理设置了。

最后最后一个小tip, SOCKS代理让你的公司网管查不到你上的网站,但聪明一点的网管仍然可以分析出来你大致上在干嘛,因为大部分http连接之前你还得做域名解析(DNS)。最安全的SSH加密浏览必须让域名解析也走SSH. 在Firefox里,这个选项叫做network.proxy.socks_remote_dns,可以通过about:config来改(不过好像通过foxyproxy的图形化界面也可以搞定)。

, ,

发表评论

[转载] 芦笛对动车事故的分析


很少转载文章,这篇算是还蛮靠谱的分析就转过来了。

====================
先声明,本人是道地外行,以下所说,是这两天杂七杂八从网上看来的 “民铁”(仿“民科”制作)们提出来的各种事故原因推测,经本人这完全彻底的老外综合提炼加工,得出的修正假说。本人不是方舟子,有严格的学术道德观念,深知理应给出各假说来源,无奈我看到的多为转帖,原作者是谁根本就不知道。好在这既不是向有偿杂志也不是向学术期刊投稿,不那么严格还是说得过去的吧。

一、 疑点

1) 为何所有的自动控制系统统统失灵?

为防止追尾事故发生,铁路系统有一系列的冗余(估计英文是redundant)的自动控制系统。所谓“冗余”,就是多于一个的系统具有同一功能。例如人有两个肾脏,仅用一个就能满足排除代谢废物的要求。上帝之所以多造一个,就是给您装个备胎,坏了一只还能靠另外那只顶住。此所以有的父/母可以放弃一个肾脏,把它献给自己的肾衰竭的孩子。这种事出于父爱母爱无足奇,但英国有位女子,竟然为一个素不相识的陌生人献出了一只肾。这种无缘无故的爱,国人包括我在内绝对无法理解。

安全系统也同样实行冗余原则,以便东方不亮西方亮。为防止同向运行的火车追尾,铁路以4公里为一“闭塞区间”。那意思是,在一列火车之后4公里内的这段距离,都不许车辆进入,是close的。为了确保这一点,有三四套系统执行警告功能。第一套就是信号机。信号机的转换靠测量两根铁轨之间的电阻改变触发。平时无车辆时为绿灯,车开进来了,钢轮与轮轴就把两根铁轨短接了,于是两轨间电阻剧降,触发继电器,绿灯就换成了红灯。要等该列车开出4公里之后,那红灯才会转换为黄灯,以后才是绿灯。这就是说,那列车之后一律红灯,到了4公里才变成黄灯,再往后一定距离(记不得是多远了)才会变成绿灯(有的作者说黄灯与绿灯之间还有黄绿灯)。

过去使用这预警系统的只有司机那活人,跟咱们开车无区别:看见黄灯就减速,看见红灯就刹车。现在的车上则多装了两套系统,一套lki监测系统,将前方的信号色灯显示在屏幕上。若是司机睡着了,它就会代替司机发出指令,减速或是刹车。这就是活人之外的第一套冗余系统。

第二套冗余系统则是ATP,亦即三磷酸腺苷——瞎扯哦,全称是Automatic Train Protection(列车自动保护系统)。它通过铁轨接收前一列车自动发过来信号,用电脑算出与前车的距离。若是发现进入了闭塞空间(也就是与前车之距小于等于4公里),则立即发出指令,减速或刹车。

第三套冗余系统则是车站的调度控制。线路上有多少列车,距离如何,在调度室的屏幕上都该显示出来。调度一眼就能看出列车之间的距离。若是两车相距太近,就会及时提醒后车司机减速和/或前车司机加速。

追尾事故要发生,必须是以上所有系统全部失灵。这概率小到不可思议,应该说是不可能——若是系统统统失灵,那调度就会命令司机停下来,司机的本能反应也只会是停下来。

2) D301是快车,D3115是慢车,按时刻表,应该是D301先到站,而实际运行却反了过来,是慢车D3115先开出永嘉,开得很慢,最后要停下来之时,却被从后面赶上来的D301以100多公里的速度撞了上去。D301本不该在永嘉站停车,却在那儿停了十多分钟,让理应后走的D3115先开走。歪?

3) 高铁为何对雷电超敏感,简直可以用来作雷电指示器了?京沪高铁因雷击,在不到一个月的时间内就出了4次故障,而供电单位却声称从未发生过断电现象。这是为什么?电力机车的驱动无非是电动机。若是电闪雷鸣能影响马达运转,那工厂都得在雨季停工了。而若是雷电动辄击毁输电线,那凡是城市都要在雨季大面积停电了。若是直接击中列车,那又怎么可能如此频繁?老天为何要一而再再而三地雷击高铁?那又不是什么高入云天的烟囱。

4) 事发后5小时,铁道部就命令活埋车辆,恢复通车,这处理完全违背常识——事故原因都没查清,恢复通车很可能再次发生类似事故,领导为何敢于冒这风险?他们就不怕一再出事?

二、 答案

1) 动车上根本没有ATP,或起码不工作,只有lki系统,它只能接收色灯信号,提醒司机或代替他采取减速制动措施。

2) 雷电使得信号机出了故障,统统成了红灯,发出假警报。

3) 因京沪高铁频频出事,上海铁路局将各地的干员抽去充实京沪高铁技术管理队伍,该地段留下来的管理人员乃是国企中最常见的废物,吃皇粮不干活的七大姑八大姨小舅子马舅子之类。

4) D3115准点到达永嘉,本来只该停靠一两分钟,但前方的信号灯却是红的。调度人员派出电务去查明前方究竟是怎么回事,致使D3115停了半小时左右。因为同一原因,本不该停车的D301在10多分钟后到站,也被迫停了下来。但电务马舅子不懂技术,迟迟无法修好,调度不得已只好实行“非常站控”,也就是以人力调度代替电脑,令司机关掉lki系统,大胆闯红灯,以每小时20公里的速度行进,靠目测确定前方有无障碍物。不幸的是,调度也是个不懂业务的马舅子,因此犯了个致命错误,把D3115当成了必须先发的D301,因此错误地让它先开走。此时检修信号机的电务查不出毛病来,干脆将信号机的继电器以手动置于高电阻位,于是红灯变成恒定的绿灯,调度见状,以为故障已被排除,于是又令D301开出。D301丝毫不知道信号灯被电务人为地转成绿灯,但见前方一路绿灯,于是按常规操作加速行进,很快就追上了前面开得很慢的D3115。调度在屏幕上看见两车距离越来越近,吓出了一身汗,他以为后面那车是D3115,立即命令D3115停车,于是D3115就停了下来,被后面的D301撞了上来。调度在屏幕上眼睁睁地看着两车相撞,总算悟出了他犯了什么错误,当场崩溃。

必须说明,以上头三段是假说,但第四段含有已知真实情形,请参看央视记者报导(http://news.sohu.com/20110728/n314735900.shtml)。该报导披露了D301与D3115颠倒了发车顺序,也披露了那晚实行的是非常站控,还披露:“当晚整个温州市区因为雷击都出现了短暂的停电。这个基地也是一样,电脑都无法使用。它不是一个点,而是一大片地区,电务都忙不过来。”但若动车真有ATP,即使调度的电脑失灵也不会造成追尾。所以,“没有有效的ATP”这一点似乎能肯定。不满足这一必要条件,则碰撞就绝不会发生。

以上假说,可以完满解释上列四个疑点:

1) 并不是所有的安全系统全都失灵:真正失灵的只是信号机系统。但因为信号灯失灵,lki系统也就无用了。若是车上真有ATP,则这事故就不会发生了。可惜ATP只存在于宣传中,因此只能实行非常站控。而车站调度虽然看到两车在迅速接近,却不幸误以为后车是D3115,令其停车,因而非但没有起到保护作用,还促成了两车相撞。

2) D3115在D301前开出,是调度把它错当成应该先走的D301了。

3) 高铁之所以对雷电超敏感,是因为它没有ATP,关键的安全保障系统是易受雷电影响的信号机系统,一旦信号灯失灵,则lki系统就只能关掉,唯一的办法便是非常站控,以人事指挥取代自动系统。在多数情况下,车站都只能决定暂不发车,或实行非常站控,于是造成晚点。换言之,因为没有ATP,信号机系统便成了高铁脆弱的瓶颈。

4) 事故发生后,领导要审的第一个对象,便是那调度马舅子,他自然只能如实招供。因此,早在领导前往现场查看前,他(们)就已经知道出事与路况无关,即使通车也不会再出什么事。这就是他(们)何以敢决定活埋车辆后就恢复通车。

作者:芦笛 在 芦笛自治区 发贴, 来自 http://www.hjclub.info

发表评论

R的错误处理机制


基本用法:在自己写的函数里调用 warning("a message.") 或者 stop("a message.") 两者的区别是 warning() 不会中断你的函数, stop() 则会。

mysqrt <- function(x) {
  if (x>0) {
    warning("Only the positive square root is computed.")
    return(sqrt(x))
  } else if (x<0) {
    stop("x must be a positive number.")
  } else {
    return(0)
  }
}

大部分时候,警告/中断机制都有它存在的意义。但有时候我们要做1000次simulation, 其中要有一次 glm() 不收敛了可能整晚上的simulation就中断了。这时候怎么办?

解决方法是 tryCatch() . 写一个 inline 函数在警告的时候跑,再写一个 inline 函数在中断的时候跑。用 tryCatch() 来做这种特殊的分支。

newsqrt <- function(x) {
  tryCatch(mysqrt(x),
           warning=function(msg) {
             print(paste("Caught warning message:", msg))
             return(-x)
           },
           error=function(msg) {
             print(paste("Caught fatal message:", msg))
             return(NA)
           }
           )
}

发表评论

cacheSweave使用简介


介绍

我假设你了解并会使用Sweave. 如果你不知道Sweave但知道并会用R和LaTeX,我强烈建议你学一下Sweave. 一个Sweave文档基本上是LaTeX文档和R code的组合。我现在几乎所有的consulting的报告,一些教课的文档等都用Sweave来写了。 Emacs对Sweave(通过noweb-mode)的支持也还算可以。

就因为Sweave是联合体,每次编译Sweave都得要重新跑一遍里面的R code. 简单的consulting当然没有什么,但有些加了simulation的东西这样每次编译要重新跑就不现实了。cacheSweave/pgfSweave就是为了解决这个问题而写的。

安装

  • 先保证你的R版本够新(R>=2.12). 如果你嫌用Ubuntu自带的R太老,你可 以加CRAN上的deb repository. 具体请google之。
  • 接下来你只要在R里 install.packages(c("filehash", "cacheSweave")) 一下即可。 filehash必须手动装(这应该 是cacheSweave的一个bug)。
  • Google并下载 Sweave.sh, 放到binary PATH里头。

基本使用

  • 正文例子. 基本上,就是在需要计算但不需要output verbatim/tex的code chunk上加参数 cache=TRUE . 当然,最好用 setCacheDir(cache) 设一个cache directory, 否则在你的working directory里会生成无数垃圾文件夹。
  • 命令行用法:
    Sweave.sh -c foo.Rnw
    

    第一次跑当然不会变快,但第二次跑就应该几乎不花什么时间了。

, ,

发表评论

Linux下Access Control List (ACL) 的简单设置


Linux下标准的文件权限管理大致基于这么一个比较简单的模式:

  • 任何一个文件都有三个权限:可读,可写,可执行,记号分别是r, w, x。
  • 文件属性有三个级别:用户,群,全体;每个级别分别可以有不同的上述权限。

用=ls -l=命令可以看一个文件的这些权限,比如说:

-rwxrwxr-x 1 qiuxing compbio  556 Mar 30  2010 README.TXT

这说明=README.TXT=这个文件的创建用户为=qiuxing=, 群为=compbio=; 最前面的 rwxrwxr-x 说明用户 qiuxing (头三个字母)和群 compbio 都对这个文件拥有读写执行权限,但其他用户(最后三个字母)只拥有读和执行权限,不能写它。

现在假设我要和别人共享文件(比如说通过FTP server),那么标准的做法是这样子的:

  1. 新建一个群,比如说 ftpuser. 然后把所有要和我共享文件的用户都加入这个群。这个现在都可以通过图形化界面来干了。
  2. 把共享目录(比如说 /var/data )的所有文件的群都设成 ftpuser, 权限都设置成比如说群可读写。另外还要注意一点,所有的目录都得设置成群 可执行, 否则别人没法 cd 进去。
    sudo chgrp -R ftpuser /var/data
    sudo chmod -R 775 ftpuser /var/data
    

但这样做还有一点点问题。每次任何一个用户在 /var/data 下新生成的文件缺省属性都是这样的: 文件的群属性为该用户的主要群(在大部分Linux上这个群要么叫做users, 要么干脆就和用户名一样),权限为用户本人可读写,所有别人可读。这样每次生成一个文件都要改属性,很不方便。

所以我们应该让 /var/data 下的新生成文件缺省群属性为 ftpuser, 权限为群可读可写可执行。方法是 1. set group ID; 2. acl.

用root身份执行

find /var/data -type d -exec chmod g+s '{}' \;

这行命令把 /var/data 下所有的目录均 setgid 成 ftpuser, 这样在它们里面生成的任何文件缺省群为 ftpuser.

关于acl.

  1. Ubuntu下access control tool 可以如下安装:
    sudo apt-get install acl
    
  2. ACL是在文件系统级别上实现的。所以装上了之后得要让文件系统知道有这么回事。改你的 /etc/fstab, 在mount选项上加上acl这个参数:
    # <file system>  <mount point>     <type>  <options>   <dump>  <pass>
    /dev/sdb1        /var              ext3    defaults,acl   0       0
    

    然后重新mount一下:

    sudo mount -o remount,acl /var
    
  3. setfacl 来改属性
    sudo setfacl -d -m g:ftpuser:rwx /var/data
    

    这行命令具体什么意思,还有 setfacl 别的用法,请参看 BeginLinux.com 的文章。

高级问题:为什么不用 umask? 如果你去google, 会发现很多老一点的设置缺省权限的方法都基于 umask. 但是在shell 的配置文件里改 umask 值的后果是该用户创建的 所有 文件都变成这个属性了,这往往不是我们想要的效果。

, ,

发表评论

关注

每发布一篇新博文的同时向您的邮箱发送备份。