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

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

Mavericks apache2 issue after Server 3 removed

After remove Server.app, my apache2 on Mac OS X 10.9.2 Mavericks couldn’t start normally while everything looks OK. After carefully studied the log file through Console.app and looked into the content of /usr/sbin/apachectl, I realized that the starting process of apache in OS X is quite different than that in Linux: it uses launchctl!

So, I searched the apache launchctl config file:/System/Library/LaunchDaemons/org.apache.httpd.plist. Aha! it said:

1
2
3
4
5
6
7
8
9
10
11
12
<key>SERVER_INSTALL_PATH_PREFIX</key>
<string>/Applications/Server.app/Contents/ServerRoot</string>
......
and
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd</string>
<string>-D</string>
<string>FOREGROUND</string>
<string>-f</string>
<string>/Library/Server/Web/Config/apache2/httpd_server_app.conf</string>
</array>

The key SERVER_INSTALL_PATH_PREFIX and ProgramArguments were modified by Server.app aparently. Just recover them to /usr and /etc/apache2/http.conf, there, it works again!

testcode

C code rendered by system:

1
2
3
4
5
6
/* Hello World program */
#include<stdio.h>
main()
{
printf("Hello World");
}

C code rendered by vim:

/* Hello World program */
#include<stdio.h>
main()
{
     printf("Hello World");
}

Hexo建站并自定义步骤

前段时间稍微折腾了一下 Octopress,被其自由、强大的功能能所吸引,毅然决然地将博客搬到了 Octopress+Github 上。但随着博客数量的增多,其速度慢的弊端逐渐显现,这时候,基于nodejshexo闪电般地出现了,其速度简直是 blazingly fast。于是,不出所料地,又搬到了 hexo 上。

搭建 hexo 的博客也很简单,从 Octopress 的内容迁移也只需把当时 post 下面的 .md 文件移到 source/_post 下面即可。但功能上的完善还是需要一定的技巧的。

  • 安装 hexo

    首先,要有 node。Mac 可以 brew install node,Linux 则可以方便地 apt-get。安装好 node 以后,npm install hexo -g,搞定!

  • 创建并配置 hexo

    运行 hexo init myblog,然后修改其下的_config.yml 文件,自定义博客名等内容。

  • 启用 MathJax 支持数学公式编写

    1. 首先安装 hexo-math 插件
      npm install hexo-math --save
    2. 然后初始化
      hexo math install
    3. 编辑_config.yml:
1
2
plugins:
- hexo-math
  • 启用本地图片支持

    npm install hexo-local-image --save,然后添加到_config.yml。

  • 使用 Vim 高亮代码

    npm install vim-tag-vimhighlight,并添加到_config.yml。然后在代码前后加上前缀<hexoescape>0</hexoescape>. 效果如下:

;*****************************************************
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
;*****************************************************
begin
  gsn_define_colormap(wks,"rainbow")
  gsn_reverse_colormap(wks)
  type                      = "eps"
  type@wkColorModel         ="cmyk"
  wks                       = gsn_open_wks(type,"NPP")

  res@cnLevelSelectionMode  = "ExplicitLevels"
  res@cnLevelSelectionMode  = "ManualLevels"
  res@cnMinLevelValF        = 0.0001
  
  startd = 20110101
  ssdate = yyyymmdd_to_yyyyddd(startd)
  do idate = 0,180
    date = yyyyddd_to_yyyymmdd(ssdate+idate)
    print("Now idate and date:  "+ idate +" ; "+ date )
     do hr = 0,23
       shr = sprinti("%0.2i",hr)
       filename = date+shr+".nc"
       ... ...
  • 支持 RSS
    npm install hexo-generator-feed --save
    _config.yml plugins

  • 支持 SiteMap
    npm install hexo-generator-sitemap --save
    _config.yml plugins

  • 去掉 tag,只保留 tagcloud
    拷贝默认的 landscape 为 myls,编辑 themes/myls/_config.yml 去掉 其中的 tag,保留 tagcloud.

  • 修改默认模板,加入 categories
    为了生成 post 时默认生成 categories 配置项. 在 scaffolds/post.md 中,添加一行 categories:。并可在内容中添加任何想加入到模板中的内容,如{vimhl} 和{!--more--},同理可应用在 page.md 和 photo.md。

  • 修改模板图片 自行修改 themes/myls/source/css/images/banner.jpg,使题图和主题配合更好;同时可对应修改themes/myls/source/css/_variables.stylbanner-height,以更好地匹配。

  • 添加 icon 小图标 在themes/myls/layout/_partial/head.ejs里将 <link href="<%- config.root %>favicon.png" rel="icon">替换为<link href="<%- config.root %>favicon.ico" rel="icon" type="image/x-ico">。将 favicon.ico 图标文件放在 source 目录下。

  • 添加微博秀 到新浪微博开放平台 生成微博秀代码,将生成的代码保存为 weibo.ejs 到 themes/myls/layout/_widget 目录中,并在 themes/myls 目录下的_config.yml 中的 widget 栏添加 - weibo 即可。

  • 添加百度 share
    添加“百度分享”到百度分享获得代码,在 themes/myls/layout/_partial/article.ejs 中,将 &lt;%-partial(&#39;post/share&#39;)%&gt; 删掉,替换为 百度分享的代码

  • 添加多说和 disqus
    Disqus 和多说在国内外各有用处,因此最好都加上。修改 themes/myls/layout/_partial/article.ejs ,添加 一部分代码 即可

  • 安装百度统计

    1. 百度统计 获取统计代码

    2. 配置.

3.  add configuration. 
vim themes/myls/_config.yml
baidu_analytics: true

使用 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

NCL批量处理数据及作图

科研中不免要与大量的数据打交道,NCL 中倒也内置了比较好用的 do 循环等,可以方便地批量处理数据,但 NCL 内置的循环批量画图就比较麻烦一些,毕竟涉及 workspace 的 open 与 close(当然,如果画图到 pdf 文件也无所谓,pdf 多页支持还是很好的)。

结合 shell 脚本与 NCL 的命令行参数接收变量赋值的特性,可以方便地批量画图。

例如,若要批量处理 2000 年到 2010 年十年的逐日资料并把每天的日均气温画出来,那么可以写一个如下的 NCL 脚本 [runwithargs.ncl] 以及相应的 Bash 脚本:

NCL:

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"

begin
   ;;date is a variable from command line args
   print("The current date is "+sdate)
   ;; Following is other code

end

其中,sdate 这个变量在 NCL 中并没有赋值,而是要在运行时指定。

上面的 NCL 脚本应配合以下的 shell 脚本 [runnclargs.sh] 运行:

#!/bin/bash
basedate="20000101"
for idate in `seq -w 1 3653`
do
    thedate=`date +%Y%m%d -d "$basedate + $idate"`
    ncl runwithargs.ncl "sdate=$thedate" |grep date
done

如此,只需通过运行 ./runnclargs.sh, 10 年的数据就处理完了。:-0

一个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