OSX: can't open X11 display

由于苹果公司果断放弃了自己维护 X11.app,只能用 XQuatz 来替代。但是在使用 XQuartz 的过程中经常遇到一些问题,比如环境变量的设置问题。今天遇到一个问题就是,自己点击安装的 XQuartz.app 是能正常运行的,但是在终端里面使用 xeys、GrADS 等软件的时候报错:“can’’t open display”。

大部分情况下,如果正确安装了 XQuartz 但是遇到这个问题的话,很可能是配置文件没能正确地起作用。

If XQuartz were installed and you can launch it, while can’t launch it in terminal, then you may solve it by:

1
2
3
launchctl unload -w /Library/LaunchAgents/org.macosforge.xquartz.startx.plist
launchctl load -w /Library/LaunchAgents/org.macosforge.xquartz.startx.plist
reboot

Then it should work!.

问题解决。

su 出现 This account is currently not available

su 切换用户的时候出现 “This account is currently not available” 的提示,尤其是在 /etc/init.d/ 的文件里面,运行一些服务需要切换到特定的用户,如启动 tomcat 的脚本,需要切换到 www 用户,但是 www 用户在 /etc/passwd 里面的 shell 是 /sbin/nologin,那么在启动的脚本里面:

1
su www -c /opt/tomcat7/bin/startup.sh

这一句就会导致上述的报错。

解决的办法有几种,第一,运行 vipw 修改 passwd 文件,将其 shell 项改为 /bin/bash。第二种方法则是修改这条命令,改为:

1
su -s /bin/bash www -c /opt/tomcat7/bin/startup.sh

个人更喜欢第二种方案。第一种要修改系统的安全设置,不太建议。

使用 Sweave 给 R 写文档的模板

以前一直傻傻的 用 \begin{verbatim} 或者 listing 的方式在文章中加 R 代码
然后再手工 include 结果的方式,现在知道了 Sweave,终于可以结束这段傻
不楞登的过程直接自动化了。

\documentclass[a4paper, 12pt]{article}
\begin{document}
\title{emacs \& Sweave}
\author{Wang Jun}
\maketitle

\section{Now begins R Sweave test}

First Save this file as example.Rnw

Then run Sweave("example") in R

Compile the generated tex file example.tex with pdflatex or xelatex (I prefer XeLeTeX)

Here you got the Sweaved R script

%%%%%%%%%%%%% Here begins the Main Content

This is just a simple example

<<>>=
library(maps)
library(mapdata)
###map("china")
x=rnorm(100)
y=rnorm(100)
lm(y~x)
@

Now that you have tried Sweave, how does it perform?

\end{document}

PS: 当然,现在流行的 R 文档写作方式应该是 knitr + LyX的方式,将另文描述了。

我的VIM 控制文件: vimrc

每次新装一个系统总是要到处找 VIMRC 的配置,现保存于此也好有个备份

set mouse=a "启用鼠标
"双引号开始的行为注释行,下同
"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
set backspace=indent,eol,start
set showcmd
"显示行号
set number
"检测文件的类型
filetype on
"记录历史的行数
set history=1000
"背景使用黑色
"set background=dark
"语法高亮度显示
syntax on
"下面两行在进行编写代码时,在格式对起上很有用;
"第一行,vim使用自动对齐,也就是把当前行的对起格式应用到下一行;
"第二行,依据上面的对起格式,智能的选择对齐方式,对于类似C语言编
"写上很有用
set autoindent
set smartindent
"第一行设置tab键为4个空格,第二行设置当行之间交错时使用2个空格
set expandtab ""# 使用space代替tab.
set tabstop=4 ""# 四个空格。
set shiftwidth=2 ""# 自动缩进的宽度。
"设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
"去除vim的GUI版本中的toolbar
"set guioptions-=T
"当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set vb t_vb=
"在编辑过程中,在右下角显示光标位置的状态行
set ruler
"默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示
set nohls
"查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
"个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
"次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
"时,别忘记回车
set incsearch
"修改一个文件后,自动进行备份,备份的文件名为原文件名加“~“后缀

"NCL的语法高亮等
    au BufRead,BufNewFile *.ncl set filetype=ncl
    auSyntax newlang source $VIM/ncl.vim
"Show autocomplete menus.
set complete-=k complete+=k " Add dictionary search (as per dictionary option)
set wildmode=list:full
set wildmenu
au BufRead,BufNewFile *.ncl set dictionary=~/.vim/dictionary/ncl.dic

 " When editing a file, always jump to the last known cursor position.
 " Don't do it when the position is invalid or when inside an event handler
 " (happens when dropping a file on gvim).
 " 记住上次的编辑位置
 autocmd BufReadPost *
    \ if line("'\"") > 0 && line("'\"") <= line("$") |
    \   exe "normal g`\"" |
    \ endif

 " 打开文件时,按照 viminfo 保存的上次关闭时的光标位置重新设置光标
 au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

"中文的猜测顺序
set fileencodings=utf-8,gb2312,gbk,gb18030 
set termencoding=utf-8
"set encoding=prc

一个Fortran 读文件并带参数的模板

Fortran 作为科学计算常用语言,自然免不了各种文件读写的操作,以下是一个简单的模板

参见 gist bdb32fffcd08b9ab21ea:

或者,直接参见下面:

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
30
31
32
33
program gaugeselect
implicit none
character(len=80):: filename
character(len=80):: arg1 ,arg2
character(len=80):: buff
logical:: flag=.false.
!================================================================!
call getarg(1,arg1)
call getarg(2,arg2)
if (len_trim(arg1)==0 )then
print *,"please specify the argument of running file!!"
print *,"usage: ./gaugeselect filename"
stop
else
filename=trim(arg1)
inquire(file=trim(filename),exist=flag)
if(flag)then
open(5,file=trim(filename))
do while(.true.)
read(5,*,end=100)buff
enddo
100 close(5)
print *,'file:',trim(filename), "processed"
else
print *,"oops........"
print *,'can NOT open file:',trim(filename)
print *," "
endif
endif
end program gaugeselect

Ubuntu UFW Firewall

用一下几条命令安装并开启 ufw:

1
2
3
sudo apt-get install ufw
sudo ufw enable
sudo ufw default reject

这样就安装开启了 UFW 防火墙,并默认拒绝一切外来连接请求(reject),显示为未连接,为安全起见,最好将 reject 改为deny

为开启 SSH 和 WWW 服务,运行:

1
2
sudo ufw allow ssh/tcp
sudo ufw allow www/tcp

同时使用以下命令查询状态:

1
sudo ufw status

轻松并发执行作业--GNU Parallel

有的时候要执行一些很快但是却很多重复的操作,例如修改所有普通文件的权限,修改一下权限本是很快的操作,但是文件很多的话操作起来就慢了。再比如要下载很多 http 下很小的文件,下载一个文件如果只需要三秒,但是每一个文件从建立连接、进行对话然后开始下载直到下载完成,中间会浪费很多时间,可能浪费的比实际下载所需的时间还多。

因此,如果能有一个方法并发进行,那么效率会高得多。以前在 Shell 里面也有一些 tricks 来进行这方面的操作,但是总是因为繁琐而容易出错。

现在 FSF 开发的 GNU parallel 一出,问题迎刃而解。例如修改所有子目录下面普通文件的权限:

1
find ./ -type f | parallel -m chmod mode

批量修改文件夹权限

1
find ./ -type d | parallel -m chmod mode

再如有一个顺序任务的脚本 batch.sh

1
2
3
4
5
6
wget url1
wget url2
wget url3
wget url4
wget url5
wget url6

那么你就可以并行运行如下:

1
2
3
4
parallel -j+0 < batch.txt
## This runs as many instance of the commands in batch.txt
## in parallel as you have cores (-j+0) and schedules the
## jobs in an efficient manner

当然,你也可以直接 使用一个 parallel 脚本(shebang)

1
2
#!/usr/bin/parallel
blahblah

要安装它很简单,比如:

  • Ubuntu: sudo apt-get install parallel
  • Fedora: yum install parallel
  • Mac OSX: brew install parallel
  • Others: 源码编译(下载, tar xjvf parallel....tar.bz2; ./configure; make install)

    至于详细功能,那就需要: man parallel

RSYNC 同步数据

rsync 是同步、备份数据时的强大工具。

1
rsync -avz --password-file=rsync.ps user@192.168.0.206:/backup/dir /home/destdir

其中注意 -a 意味着 archive,即保留各种权限等,-v 表示 verbose, -z 则是压缩传输。 —password-file 要注意权限,以防被别人窥探,当然如果不是在脚本里面批量使用,就不需要这个选项了,直接交互输入密码更为安全。

一般在传输文本文件的时候加上 -z 选项,速度会快很多,但如果是二进制数据等,一般还是不要加的好。