星期五, 11月 07, 2014

inotify (檔案變更監視) 以及 autossh reverse tunnel (ssh 逆向通道)

最近需要管理一台會到處"漂"的電腦,它有網路(衛星的哩)、有電源還有冷氣可吹,高級的很。
缺點就是衛星網路很慢,所以如果想要遠端去管理,最佳方案是文字介面,因為它在防火牆內(雖說如果需要,也能拿到實體ip),不過它也沒什麼服務,還是放防火牆內安心些。
所以,ssh 逆向通道就很方便啦,反正電腦隨時保持一條管道讓我可以ssh進去就好。方法也實在簡單。不過有幾個重點應該要注意。
第一,網路會斷,斷了是沒關係,但是連線後要能再連回來,所以autossh可以代勞這個事。
第二,那台電腦會每天重開機,重開機之後要能自動連線回來。這個我不知道是什麼原因,猜想是因為重開機或重啟SSH reverse tunnel時,因為被連端的電腦的port還來不及關閉,新的連線需求就又來了,導致電腦回應說我的port已經在使用中了,所以無法建立連線。由於知識不足,所以想了另一個方法,就是我每次要建tunnel時,就把port加1。當這個port加到一個值時,就再來新的一輪。例如讓port從2220開始,每執行一次就讓port+1,直到port 到2230之後,就再讓port從2220開始。
#!/bin/bash
killall -9 autossh
sleep 10
rportf="/home/user/bin/rport"
RPORT=$(/bin/cat $rportf)
RPORT=$(/usr/bin/expr $RPORT + 1)
echo $RPORT
if [ $RPORT -gt 2230 ]; then
  RPORT=2220
fi
/bin/echo $RPORT > $rportf
SSH_OPTIONS="-i /home/user/.ssh/id_rsa"
# Always assume initial connection will be successful
export AUTOSSH_GATETIME=0
# Disable echo service, relying on SSH exiting itself
export AUTOSSH_PORT=0
autossh -f -- $SSH_OPTIONS -o 'ControlPath none' -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -R $RPORT:localhost:22 serverUserName@serverIP -N
監視一個檔案,如果它有變動,就...
因為那台再外面"漂"的電腦,順利的話會定時傳東西回來。
所以,如果有東西回來時,我要把它放在一個地方昭告大家…
lsyncd是不錯的選擇,不過我想試點不同的,如inotify或是fanotify之類的。
不過好像centos6.5的kernel 還不支援fanotify ,而且查到的討論很少。
所以還是用inotify,不過殘念的是inotify的計畫已經停止了…所以將來還是得回歸到fanotify吧(?)
inotify 預設沒有安裝,套件庫也沒有,要先裝epel,假設你有epel套件庫,那就
yum install incron
即安裝完成。
設定開機啟動 chkconfig incrond on
用法很像crontab,就輸入下面的指令
incrontab -e
如果不給用,出現 user 'xxx' is not allowed to use incron 那就編輯 /etc/incron.allow (如果不存在,就新增一個)
把要用incrontab 的使用者加進去即可,例如:
vi /etc/incron.allow
xxx
yyy
好了之後,再重新
incrontab -e
#分三個部份:
#要監視的檔案/資料夾 事件 要執行的指令
/home/cmd/or1/ IN_MODIFY /bin/cp $@/latestmidas.json /var/www/html/nrtfcst/
#上面會去監視/home/cmd/or1資料夾, 如果有變更(IN_MODIFY),就把裏面的latestmidas.json這個檔案cp到 /var/www/html/nrtfcst中。
#其實我只想監視一個檔案,但是如果我只設定一個檔案,它只有第一次的更動會複製,接下來就沒反應了。
#原因是它是針對檔案的代碼,但是這個檔案一有變動,代碼如果也根著變,它的監視行動就取消了(因為對像(代碼)不見了),但是如果是監視資料夾就沒這個問題,只是這個資料夾有任何變動,我都會把我原來只想監視的檔案複製一份到別的地方。(還好,反正這個資料夾也就一個檔案)。

星期三, 9月 24, 2014

lsyncd 安裝 + 免密碼登入ssh

yum install rsync xinedtd
vi /etc/xinetd.d/rsync
disable = yes 改成
disable = no
/sbin/service xinetd start
chkconfig xinetd on

安裝epel
wget http://mirror01.idc.hinet.net/EPEL/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
安裝 lsyncd
yum install lsyncd
設定 epel
vi /etc/lsyncd.conf
加入下述內容
# 不知道怎麼回事,在使用者模式下命令是正常,但是放在服務下就失敗
# 一直是ssh permission的問題,試了半天,重點是rsh時要指定使用者(-l), 及其 private key (-i)
settings{
    statusFile = "/var/run/lsyncd.status",
    logfile = "/var/log/lsyncd.log",
    nodaemon = false,
--    insist = true,
    log = all
}
sync{
    default.rsync,
    source="/home/cmd/disk1/send2ntu",
    target="192.168.4.11:./or1/",
    rsync={
       binary = "/usr/bin/rsync",
       rsh = "/usr/bin/ssh -i /home/cmd/.ssh/id_rsa -l cmd -o StrictHostKeyChecking=no",
       compress = true,
       sparse = true,
       update = true,
       links = true,
       times = true
    },
    delay = 10
}
# 完成之後存檔,/sbin/service lsyncd restart 即可啟動。 
# 測試正常之後即可設定開機啟動 chkconfig lsyncd on
# selinux issue:
# 很煩,弄了很久,一直有如下的錯諤訊息
#rsync: Failed to exec sudo: Permission denied (13)
#rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
#rsync: connection unexpectedly closed (0 bytes received so far) [sender]
#rsync error: error in IPC code (code 14) at io.c(600) [sender=3.0.6]
#測試了老半天之後,想到 selinux 定理:就是查不出原因的錯誤,而且打指令可以執行,放到服務裏就不行
#那九成是selinux出包,用如下指令暫時關掉 selinux
# echo 0 > /selinux/enforce 
# 再重新啟動 lsyncd 竟然正常,那就就定selinux 得設定
# 這裏講一下新工具,allow2audit,它可以分析autit.log檔,並且幫忙產生設定檔,用就是了!!
# 執行下面的指令,把audit.log裏關於AVC與rsync的問題丟給audit2allow 處理,
cat /var/log/audit/audit.log | grep AVC | grep rsync | audit2allow -M  rsyncissue
#******************** IMPORTANT ***********************
#To make this policy package active, execute:
#
#semodule -i rsyncissue.pp
#寫會產生rsyncissue.pp 與 rsyncissue.te 二個檔案,後面那個可以看看,前可那個是二進位檔,用下面的指令設定
semodule -i rsyncissue.pp
#就幫你把問題解決了!!!!
#不過有時候上面的二個步驟要多做幾次才行,因為你知道的,selinux就是那麼複雜。
安裝allow2audit
它是一個關於selinux policy管理的套件組中的一個程式
如果用yum知道哪個套件組有它?請用下面的指令
yum provides */allow2audit
免密碼登入ssh主機
ssh-keygen -t rsa -C "mdchiou@ntu.edu.tw"
#輸入上述指令後,下面三個問題都直接enter即可
Generating public/private rsa key pair.
Enter file in which to save the key (/home/or1/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/or1/.ssh/id_rsa.
Your public key has been saved in /home/or1/.ssh/id_rsa.pub.
#至此即產生完金鑰與私鑰,再透過下面的指令把私鑰上傳至欲登入的主機
ssh-copy-id user@IP
#就這樣,超方便der
安裝samba
yum install samba.x86_64
pdbedit -a user1 # linux已經存在的帳號如or1...
#修改iptables 開放 139 445
#修改selinux 權限開放家目錄
setsebool -P samba_enable_home_dirs on

星期一, 4月 14, 2014

selinux httpd 資料夾權限設定

由於伺服器的硬碟只有200g,所以另外接了一個硬碟櫃,並掛在/disk1 下面 想當然爾,希望把web的幾個服務搬到/disk1下面,然後不意外的selinux肯定會擋 以前都是只好關掉selinux,可是畢竟不是辦法,所以上網查了一下,做法,看起來也不是太難 例如我想放在/disk1/www/html 下
#首先在 /etc/httpd/conf.d/ 下新增一個 mysite.conf 內容如下:
Alias /mysite/ "/disk1/www/html/mysite/"

  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all

#然後
chcon -R -t httpd_sys_content_t /disk1/www/html 
/sbin/service httpd restart
#應該就要好了 #結果試了老半天都不行,都403的權限問題 #上網查了老半天,資料夾的範例都是要你放/var/www 或是/home/user 下面 #啊就硬碟容量不夠,所以不是我要的解法方法 #想來想去,看一下/home /var /disk1 三者的selinux權限哪裏不同好了:
ls -Z /
drwxr-xr-x. root root system_u:object_r:file_t:s0      disk1
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
drwxr-xr-x. root root system_u:object_r:var_t:s0       var
#嗯,的確不同,然後想到要讓httpd可以讀 /home 的資料夾是需要設定的,指令如下:
setsebool -P httpd_enable_homedirs=on
#這樣一來,應該可以讀/home 的資料夾,(但是應該不是/home 下的全部資料,裏面要開放的資料夾還必需要是httpd_sys_content_t 才行)
#那我們把disk1也改成 home_root_t是否就可以了?
chcon -t httpd_sys_content_t /disk1
#注意,不需要加上-R ,因為只要/disk1 是 home_root_t 即可,/disk1 下的www 才需要 httpd_sys_content_t
#本來是打指令啦,不過其實建議用視窗來勾選…比較不會出錯,

system-config-selinux
#如果沒有安裝,請裝上這個就可以了
yum install ploicycoreutils-gui

星期一, 3月 24, 2014

ownCloud 安裝

#用編譯好的套件安裝
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-6/isv:ownCloud:community.repo
yum install owncloud
#正常情況下安裝好後會在/var/www/html 下建立 owncloud 資料夾
#也會在/etc/httpd/conf.d 下多出這個檔案 owncloud.conf
#重啟httpd 與 mysql
/sbin/service httpd restart
/sbin/service mysql restart

設定MariaDB,這步要先做,主要是在MariaDB中把資料庫及使用者建好
mysql -uroot -p
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS owncloud;
GRANT ALL PRIVILEGES ON owncloud.* TO 'username'@'localhost' IDENTIFIED BY 'password';
quit
#建好之後就可以連上 http://server.ip/owncloud/
#第一次連要設定一個管理者的帳密,重點是要選擇進階選項
#進階選項中可以選用mysql(所以mariadb一定要和mysql完全相容),然後填入上面建的資料庫名稱及使用者帳密
#如果手殘忘了選怎麼辦…
#那就殺掉這個檔案 /var/www/html/owncloud/config.php 
#這個檔案是初始化之後建的,而下面的ssl設定要更動這個檔案,所以有先後順序。
設定使用 https
yum install mod_ssl
mkdir /etc/httpd/ssl
openssl genrsa -des3 -out owncloud.key 4096
openssl req -new -key owncloud.key -out owncloud.csr
openssl x509 -req -days 3650 -in owncloud.csr -signkey owncloud.key -out owncloud.crt
openssl rsa -in owncloud.key -out owncloud.key.insecure 
mv owncloud.key owncloud.secure # 不知道這個檔案做什麼用
mv owncloud.insecure owncloud.key 

mv owncloud.key /etc/pki/tls/private
cp owncloud.crt /etc/pki/tls/certs

#修改 /etc/httpd/conf.d/owncloud.conf

DocumentRoot /var/www/html
SSLEngine On
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCertificateFile /etc/pki/tls/certs/owncloud.crt
SSLCertificateKeyFile /etc/pki/tls/private/owncloud.key
#修改 /var/www/html/owncloud/config.php
#加上 'forcessl' => true,

#重啟服務
/sbin/service httpd restart
#如果錯誤訊息說找不到 owncloud.key 而它確實存在
#就是selinux 的問題,用 ls -Z 看owncloud.key 的屬性和其他檔案是否不同,
#是的話用chcon 改回來即可。

星期一, 3月 17, 2014

samba selinux

新的samba 伺服務設定愈來愈簡單了
什麼都不太需要做就能完成
如果還有問題,就是防火牆沒開 139 與 445
然後,輸入密碼、也能登入,就是進不去資料夾…明明權限都有
搞了半天,是selinux的權限問題,這個仔細看smb.conf裏其實有提到
os:寫英文的誰會看那麼仔細啦!!
家目錄相關的權限設定如下
# If you want to share home directories via samba please run: 
# setsebool -P samba_enable_home_dirs on 

自己在家以外的地方建資料夾,然後要開共享資料夾的權限則設定如下:
# If you create a new directory you want to share you should mark it as 
# "samba-share_t" so that selinux will let you write into it. 
# Make sure not to do that on system directories as they may already have 
# been marked with othe SELinux labels. 
# 
# Use ls -ldZ /path to see which context a directory has 
# 
# Set labels only on directories you created! 
# To set a label use the following: chcon -t samba_share_t /path 

如果是要分享系統資料夾,方法如下(基本上不會用到這個吧):
# 
# If you need to share a system created directory you can use one of the 
# following (read-only/read-write): 
# setsebool -P samba_export_all_ro on 
# or 
# setsebool -P samba_export_all_rw on 
# 
# If you want to run scripts (preexec/root prexec/print command/...) please 
# put them into the /var/lib/samba/scripts directory so that smbd will be 
# allowed to run them. 
# Make sure you COPY them and not MOVE them so that the right SELinux context 
# is applied, to check all is ok use restorecon -R -v /var/lib/samba/scripts 
關於使用者,現在都改用 pdbedit 啦,

星期日, 3月 16, 2014

編譯gmt5

終於,只能裝GMT5了,新版的建議用 yum 安裝,但習慣自己編譯,所以
先裝必要套件,這類套件在 epel 裏都有,要先裝epel
yum install cmake28 netcdf-devel gdal-devel
註:不知道我在堅持什麼,gmt5也在裏面,怎不直接就裝了…
svn checkout svn://gmtserver.soest.hawaii.edu/gmt5/trunk gmt5-dev
下載岸線 gshhg-gmt-2.3.2.tar.gz 放在gmt5-dev裏
tar zxvf gshhg-gmt-2.3.2.tar.gz 會得到gshhg-gmt-2.3.2資料夾,這個路徑要設定在下面中
注意版本也許有更新。
下載 dcw-gmt-1.1.1.tar.gz,並tar zxvf dcw-gmt-1.1.1.tar.gz
#複製 cmake/ConfigUserTemplate.cmake 檔案一份成為 cmake/ConfigUser.cmake
cd cmake
cp ConfigUserTemplate.cmake ConfigUser.cmake
#編輯 cmake/ConfigUser.cmake
vi ConfigUser.cmake
set (CMAKE_INSTALL_PREFIX "/usr/local/gmt5/")
set (NETCDF_ROOT "/usr/bin")  
set (GSHHG_ROOT "/home/cmd/gmt5-dev/gshhg-gmt-2.3.2") 
set (COPY_GSHHG TRUE)
set (DCW_ROOT "/home/cmd/gmt5-dev/dcw-gmt-1.1.1")
set (COPY_DCW TRUE)

# 因為我有自己編譯netcdf,seadas也有自行編譯的一份,而我們還用yum裝了一份
# 想想還是用系統裝的,所以這裏要設定好要用哪一個版本
# 注意1 ConfigUserTemplate.cmake 一定要複製一份成為ConfigUser.cmake,改變才有效
# 注意2 我習慣更動ConfigUser.cmake後會把build裏的東西清空再重做cmake28 ..
cd gmt5-dev
mkdir build
cd build
cmake28 ..
#注意看看是否下列都有出現(節錄,不是整段一樣)
#-- Found DCW: /home/cmd/gmt5-dev/dcw-gmt-1.1.1  
#*  Found GSHHG database       : /home/cmd/gmt5-dev/gshhg-gmt-2.3.0 (2.3.0)
#*  NetCDF library             : /usr/lib64/libnetcdf.so
#*  NetCDF include dir         : /usr/include

make
make install # make install 注意CMAKE_INSTALL_PREFIX 的路徑是否有權限,不然就用root執行

星期四, 3月 13, 2014

安裝Seadas7.02 on CentOS6.5

export OCSSWROOT=/opt/seadas-7.0.2/ocssw
export OCSSW_DEBUG=0               # set to 1 for debugging

vi $OCSSWROOT/OCSSW_bash.env
#export FC=${FC:=gfortran} 改成
export FC=${FC:=ifort}

source $OCSSWROOT/OCSSW_bash.env

cd $OCSSWROOT/build/lib3/src
然後會有一堆問題:權限問題…sqlite3問題…
這些主要都是權限問題,解法方法是弄一個seadas群組,讓要用的人都在那個群組中。
權限問題完之後就是這個問題:
-E- /home/swdev/ocssw/build/src/l2gen/xcal.c line 75: SDstart(/opt/seadas-7.0.2/ocssw/run/var/modisa/xcal/OPER/xcal_modisa_axc26e_412.hdf, 1) failed.
如果
ls /opt/seadas-7.0.2/ocssw/run/var/modisa/xcal/OPER/ 
xcal_modisa_axc26f_412.hdf
#這個問題是程式要用axc26e,但是資料夾裏的是axc26f,解決方法是執行下面的指令
$OCSSWROOT/run/scripts/update_luts.py aqua

星期日, 2月 16, 2014

iptables 內部機器連上內部網站

之前幫實驗室把一台不用舊linux機器拿來當防火牆用
反正內部也沒幾個人,所以只用幾個簡單的指令,主要目的就讓大家共用一個ip上網
後來放外部的一個網站伺服器沒什麼人管,被要求也要納路內網說是比較安並
然後…就發現只要外部ip的人可以連上該伺服器,內網的人反而不行…
找了一下解決方法,搞不太定(因為iptables根本不會,都是網路上查來的)
只好先請大家在自己電腦上的hosts把那個網站的域名的ip直接設成該伺服器的內部ip
最近,查了一下問題原因及解決方法,細節就不多講了,我也是外行,反正適合我們這種只有分內網與外網的簡單的防火牆(二張網卡)就是了。
#防火牆ip
EXTIP=140.11x.xx.xxx
#內部ip
innet=192.168.69.0/24
#網站伺服器ip(當然是在內網中)是 192.168.69.138
#這二行都要有才行
/sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 80 -j DNAT --to 192.168.69.138
/sbin/iptables -t nat -A POSTROUTING -s $innet -d 192.168.69.138 -p tcp --dport 80 -j MASQUERADE

#很怪的是,我本來是透過下面這一行,做到上面那二行的第一行的功能,但是這樣子沒辦法和上面的第二行搭配…
/sbin/iptables -t nat -A PREROUTING -i $EXTIF -p tcp --dport 80 -j DNAT --to 192.168.69.138

星期二, 12月 10, 2013

GMT 繪圖軟體使用中文字

因為不知道下次是多久之後才會再設定到了
所以在這裏記錄一下
也不想另外安裝字型,就用系統裏的。

系統內建的中文字型檔,不是從 windows co 過去的!!

yum CentOS6.4 的字型套件名:cjkuni-fonts-ghostscript.noarch
CentOS 7 的字型套件名與上面的不同:ghostscript-chinese-zh_TW.noarch
首先看看這個檔在不在 vi /usr/share/ghostscript/conf.d/cidfmap.zh_TW
不在就是字型套件沒裝,就裝上吧:
yum install cjkuni-fonts-ghostscript.noarch #centos 6
yum install ghostscript-chinese-zh_TW.noarch #centos 7
它應該至少會把二個字型分別裝在 /usr/share/fonts/cjkuni-ukai/ 與 /usr/share/fonts/cjkuni-uming/
然後 /usr/share/ghostscript/conf.d/cidfmap.zh_TW 這個檔案也會出現!內容如下:
/ZenKai-Medium          << /FileType /TrueType /Path (/usr/share/fonts/cjkuni/ukai.ttc) /CSI [(CNS1) 4] >> ;
/ShanHeiSun-Light       << /FileType /TrueType /Path (/usr/share/fonts/cjkuni/uming.ttc) /CSI [(CNS1) 4] >> ;
/Adobe-CNS1             /ShanHeiSun-Light ;
不知道在搞什麼!字型的位置跟實際上的不太一樣,把它改過來,改成下面的樣子

/ZenKai-Medium          << /FileType /TrueType /Path (/usr/share/fonts/cjkuni-ukai/ukai.ttc) /CSI [(CNS1) 4] >> ;
/ShanHeiSun-Light       << /FileType /TrueType /Path (/usr/share/fonts/cjkuni-uming/uming.ttc) /CSI [(CNS1) 4] >> ;
/Adobe-CNS1             /ShanHeiSun-Light ;

加到GMT的字型列表中

然後,ZenKai-Medium 聽起來像是正楷,就把它加到gmt中吧,方法如下:
#gmt4的版本,是要改PS_font_info.d 這個檔案,gmt 5則不是(請看下面gmt 5的部份)
#後面三行看起來像這樣:
vi /usr/local/gmt/share/pslib/PS_font_info.d Palatino-BoldItalic 0.677 0 ZapfChancery-MediumItalic 0.610 0 ZapfDingbats 0.700 1 #最後面新增一行 ZenKai-Medium-UniCNS-UTF8-H 0.700 1 #如果是gmt5,改的是PSL_custom_fonts.txt這個檔案在 /gmtdir/share/postscriptlight/下吧 vi /usr/local/share/postscriptlight/PSL_custom_fonts.txt #一樣在最後面新增一行 ZenKai-Medium-UniCNS-UTF8-H 0.700 1
上面這行很重要的是ZenKai-Medium是字型名稱,但是後面還一定要加一串不知道是什麼鬼的字"-UniCNS-UTF8-H"
我真的不知道為什麼,只知道UniCNS-UTF8-H 可以
ls /usr/share/ghostscript/8.70/Resource/CMap/
中找到,網路上人家簡體字用的是UniGB-UTF8-H,我試了一下不行…想說GB命名的編碼八成都與簡體有關,就想說隨便拿幾個試試…第一個就是把GB換成CNS…就成功了!耶!
# 重要1,gmt 的字型設定可以分五項FONT_ANNOT_PRIMARY, FONT_ANNOT_SECONDARY, FONT_LABEL, FONT_LOGO, FONT_TITLE,要確定你用到字型的部份是哪一個,不然會以為沒改好。 # 重要2, 可以用gmtset,只在需要打中文字的前面設定使用中文字形,之後再設定回原來的字型,這樣英文字比較不會怪…
gmtset HEADER_FONT 35; echo 1.5 5 40 0 35 LM GMT,測試 >tmp;echo 5 0.5 20 0 35 LM 測試2>>tmp;pstext tmp -R0/7/0/7 -JX6i/6i -B1/1:."GMT 中文": -P >cn.ps; ghostscript cn.ps
如果有中文字就成功了
CentOS5 設定路徑和6.4版不同,我的系統也沒要裝什麼,cidfmap.zh_TW是放在/etc/ghostscript/中。看起來與6.4版內容很像,所以什麼都沒做,就從"加到GMT的字型列表中"的部份開始即可

星期一, 7月 22, 2013

python3.3 easy_install numpy scipy matplotlib 安裝

安裝ptyhon 3.3.2
yum install tk-devel.x86_64
yum install tcl-devel.x86_64
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel
yum install lzma-devel.x86_64 # centos 6.5 不叫這個名字,先不裝看看
yum install xz-devel.x86_64

#上面二個要先裝,不然plot.show()會沒畫面跳出來。
wget http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2
tar jxvf Python-3.3.2.tar.bz2
cd Python-3.3.2
export LDFLAGS=-L/usr/lib64;./configure --prefix=/opt/python3 --with-wide-unicode
# 還有,如之後要裝 mod_wsgi (django會用到),那麼記得一定要在configure時加上,--enable-shared
# 還要在編譯時加上-fPIC 不過應該做好--enable-shared設定時就會加上了,如果沒有就export CFLAGS=-fPIC再configure

make
make test
#出現如下錯誤,但似乎不是程式的問題,是不應該用真實存在的網址www.python.org做測試
#所以假裝測這件事…
#FAIL: test_geturl (test.test_urllibnet.urlopenNetworkTests)
#----------------------------------------------------------------------
#Traceback (most recent call last):
#  File "/home/cmd/tmp/python3/Python-3.3.5/Lib/test/test_urllibnet.py", line 86, in test_geturl
#    self.assertEqual(gotten_url, URL)
#AssertionError: 'https://www.python.org/' != 'http://www.python.org/'
#- https://www.python.org/
#?     -
#+ http://www.python.org/

make install
# 有人說要用 make altinstall
# 不知道差異是啥…

#好了之後記得設定路徑
# 因為Centos5已經裝了python2.? 所以我們新裝的請用python3執行

移除先前用yum裝的版本(如果有裝的話)
yum remove python-setuptools.noarch

安裝 setuptools
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py 
python3 ez_setup.py
easy_install pip
pip install numpy
cd /opt/python3/lib/python3.3/site-packages/numpy-1.7.1-py3.3-linux-x86_64.egg/numpy/distutils
# 這一段應該不用執行
# 執行 python3 setup.py ,然後輸入下面二行設定c與fortran 編譯器
# gcc
# f<intelem>
# Ctrl-D
新增 site.cfg 檔案,內容如下:
vi /opt/python3/lib/python3.3/site-packages/numpy/distutils/site.cfg
[mkl]
library_dirs = /opt/intel/mkl/lib/intel64
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =
透過pip 安裝 scipy 及 matplotlib
先裝 libpng-devel
yum install libpng-devel.x86_64
pip install scipy
pip install matplotlib
# 上面這個如果有X相關的問題(可能是遠端ssh 有x-tunnel沒開X serv),

安裝Module netCDF4 假設我們已經裝好hdf5在 /usr/local/hdf5及netcdf4在/usr/local/netcdf 中
export HDF5_DIR=/usr/local/hdf5
export NETCDF4_DIR=/usr/local/netcdf
export USE_NCCONFIG=1
pip install netcdf4
安裝basemap
yum install agg.x86_64
# geos 必需3.?版以上與 proj 與 ,所以另外增加第三方套件庫,
wget http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
wget http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
#註,請自行連上網去看,上面的/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm 檔案有無更新的版本。
rpm -Uvh rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
yum install proj-devel.x86_64
yum install geos-devel.x86_64
# yum install geos-python.x86_64 <--不用?

pip install pillow
pip install pytz
pip install python-dateutil
easy_install basemap
# 在用到PIL套件時如果遇到此類錯誤
#decoder jpeg not available
#就是沒裝libjpeg
#要裝上它(CentOS6.5是如下套件)
yum install libjpeg-turbo-devel.x86_64
#完了之後要重新裝PIL及相關套件(Python2版)在python3中叫做Pillow
pip install -I Pillow
pip install -I pytz
pip install -I python-dateutil
# 
easy_install -mxN basemap
easy_install basemap
# 這次在CentOS6.5的機器上,一直沒有辦法把basemap裝好,
#感覺是GEOS的問題,試了好久,只好編譯basemap裏面附的geos版本
# 編譯好之後再手動setup basemap,步驟如下
# 下載 basemap-1.0.7.tar.gz 並且 tar zxvf
# src 資料夾裏有一個 geos-3.3.3
./configure --prefix=/usr/local/geos
make; make install
export GEOS_DIR=/usr/local/geos
cd ../
python3 setup.py install
# 搞定
安裝ipython
#先安裝zeromq 套件,網站建議用yum,所以要把該網站的repo放到/etc/yum.repos.d/中
#cd /etc/yum.repos.d/
#wget http://download.opensuse.org/repositories/home:/fengshuo:/zeromq/CentOS_CentOS-5/home:fengshuo:zeromq.repo
# 6.5 版直接不用做上面的步驟
yum install zeromq-devel.x86_64
pip install tornado
pip install pyzmq
pip install ipython

星期二, 12月 25, 2012

ImageMagick 將 jpeg 合併製成 gif 動畫

簡報檔只能有一個檔案是個人在做簡報的一個原則,所以裏面的動畫檔,基本上都用gif來解決…可是最近一直有gif檔太大,但是縮小又太模糊的困擾發生,只好測試一下看看該怎麼做gif檔比較能夠接受。
本篇重點在於resize jpg圖檔時,記得 -quality 100,圖形才不會糊糊的。
convert -resize 14% -quality 100 input.jpg output.jpg
基本上用到的工具就只是ImageMagick,請自行安裝先…

這是原始圖檔,4600x5500像素…檔案大小1.64MB,這樣的檔案一共44個。
基本上放ppt檔的圖形不需要那麼多像素,full hd 也才1920x1200。何況投影片解析度通常沒那麼高,以1024x768為目標來說,我們把圖形縮 14% 的話就變成644x770的檔案。指令如下:
convert -resize 14% original-1.jpg small-1.jpg
檔案大小被這麼一縮,剩下82k大小,可是圖形變的很糊,字與線條邊邊都會因為壓縮而有雜點…

用下述指令產生gif 檔
convert -loop 30 -delay 25 small-*.jpg anim.gif
做成的檔案大小是10.6mb,真是出人意料之外,因為44個各別的檔案也才3.64mb,怎會做成gif卻變那麼大,而且gif圖形品質當然不會變好哩。


jpeg轉檔時記得不要壓縮
由於jpeg存檔時可以指定是否壓縮,預設都會壓(不過我不知道convert採用的預設值多少),我們可以透過-quality 來決定壓縮值,0-100,100是不壓,所以重新用下述指令縮小圖檔:
convert -resize 14% -quality 100 original-1.jpg small-1.jpg
檔案大小變成約300kb,44個一共13.0mb

用下述指令把jpg合成gif後,檔案變成約9mb大小…又是另一個讓人意外的答案。
convert -loop 30 -delay 25 small-*.jpg anim.gif
註:
convert -loop 30 -delay 25 -quality 100 smail-*.jpg anim.gif
convert -loop 30 -delay 25 -quality 50 smail-*.jpg anim.gif
合成的檔案大小一樣是9mb,懷疑合成gif時沒有用到壓縮,所以quality在合成gif時無做用。


星期四, 10月 11, 2012

samba無法進入連結(link)資料夾

因為安全因素,所以samba預設不會讓你進到連結的資料夾。當然,一定有打開的方法,如下:
編輯/etc/samba/smb.conf

[global]
如果有這些關鍵字,就把它設成如下,不然就新增。然後/sbin/service smb restart 即可。
follow symlinks = yes
wide links = yes
unix extensions = no

#然後記得還有 selinux 的權限問題, #假如你link到/disk1/cmd 那麼記得執行如下指令打開selinux權限 chcon -t samba_share_t /disk1/cmd

星期二, 6月 12, 2012

bash 如何用變數取得變數名稱

中文形容的不恰當,英文比較貼切
bash, how to get variable name from variable

假設bash有如下變數:
st21413=5234.3
st21416=4432.2
st52405=5732.1
所以
echo $st21413 會得到 5234.3
那如果
A=st21413
有沒有什麼方法可以透過A得到5234.3的值?
直覺得想法像是
echo $`$A`
結果得到 $st21413 而非 5234.3 …
正解:
A=st21413
echo ${!A}
即可得到5234.3
如果
B=${!A}
那 B 的值就是 5234.3 囉,即
echo $B 會得到 5234.3

星期一, 5月 14, 2012

用 ImageMagick 的 convert 合併圖檔

話說生論文的重點在於你有沒有好看的圖…英文不好、論點不佳、結果很慘,只好靠作圖來加分…是這樣嗎。
使用GMT繪圖時,撰寫的scripts習慣以一張圖為一個檔案,並且直接轉成jpg。 可是在論文編排時,常常需要把幾張圖合成一張,然後在圖中附上a,b,c,d。 以前的做法是用power point編排後再存成ps檔,再由ps檔轉成jpg(此時可設定解析度)。 本來以為這樣的做法,解析度可以保持(事實上解析度是很大…可以過論文排版的檢查),不過實際上圖的解析度並沒有很好。 另外的做法是用gimp處理jpg檔,或是保留ps檔使用coreldraw,可是對於不常用這些軟體的我來說很是麻煩。
由於我一直有在使用ImageMagick,尤其是要執行縮小或製作gif檔時使用convert命令的方法很是方便。 當然強大的ImageMagick如果只是要把很有規則(大小一樣有的沒的)的幾張圖重新排列,並加上(a)(b)(c)(d)應該不難,只是我不會,也一直沒空去了解。最近又要排版了,再用回power point實在品質太差(我標準提高了嗎?)。所以只好花點時間研究ImageMagick,哇~簡值是神奇,只要一個指令就可以搞定。 例如我有四張圖如下:




然後透過下面的指令:
convert \( -page -0-0 \( figure4-a.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(a\) -flatten \) -page -0-0 \( figure4-b.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(b\) -flatten \) -bordercolor black -border 50 +append \) \( -page -0-0 \( figure4-c.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(c\) -flatten \) -page -0-0 \( figure4-d.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(d\) -flatten \) -bordercolor black -border 50 +append \) -append out.jpg
就變成這樣一張圖:

很神奇對不對(我是指我能寫出這天書般的指令),只是上面的指令記不起來的啦,下次也保證看不懂的啦。既然已經花點時間去了解ImageMagick裏convert的用法,也相信下次要用時會忘記,只好寫個簡單的scripts幫助記憶,並且希望可以再下次要用時直接取用。如果你有需要就請隨便用,把你的圖搞壞了別怪我就是了。
convert 可以透過( ) 來優先處理,所以下面的邏輯是先對每一張圖加上(a) (b) (c) (d),用-label給文字,-pointsize給大小,-page給位置。另外,圖要合併時是沒間距的,所以透過-border加個白色外框(由-bordercolor設定白色)。
然後用+append把二張做橫向合併,所以每個橫向的合併要再用一個( )
最後把橫向合份好的結果再用-append用垂向合併。大致上是這個意思
convert   ( (圖1加字) (圖2加字) +append)  ( (圖3加字) (圖4加字) +append ) )  -append  outfigname.jpg

scripts的寫法是當然由最裏面的小圖一路往上拓展,內容如下:

figncols=2
fignrows=2
outfigname=out.jpg
figname[1]=figure4-a.jpg
figname[2]=figure4-b.jpg
figname[3]=figure4-c.jpg
figname[4]=figure4-d.jpg

labelvar[1]="label:\(a\)"
labelvar[2]="label:\(b\)"
labelvar[3]="label:\(c\)"
labelvar[4]="label:\(d\)"
labelvar[5]="label:\(e\)"
labelvar[6]="label:\(f\)"
labelvar[7]="label:\(g\)"
labelvar[8]="label:\(h\)"
labelvar[9]="label:\(i\)"
labelvar[10]="label:\(j\)"
labelvar[11]="label:\(k\)"
labelvar[12]="label:\(l\)"
# ( if rows=3, cols=4, there will have 12 figs)
#          rows
# c    fig1   fig2   fig3
# o    fig4   fig5   fig6
# l    fig7   fig8   fig9
# s    fig10  fig11  fig12
#
#
figtots=`expr $figncols \* $fignrows`
pagevar="-page +350+220"  # label position in pixel
#  下面設定圖與圖中的間隔及顏色,這裏是設黑色,寬度50
bordervar="-bordercolor black -border 50"
pointsize="-pointsize 220"  # font size in pixel
pointvar="$pagevar -background none -fill black $pointsize"
for (( i=1; i<=$figtots; i++ )); do
  a[$i]=`echo " -page -0-0 \( ${figname[$i]} $pointvar ${labelvar[$i]} -flatten \)"`
done
for (( i=1; i<=$fignrows; i++ )); do
    b[$i]=`echo "\("`
  for (( j=1; j<=$figncols; j++ )); do
    k=`expr \( $i \- 1 \) \* $figncols \+ $j `
    b[$i]=`echo "${b[$i]} ${a[$k]}"`
  done
    b[$i]=`echo "${b[$i]} $bordervar +append \)"`
done
c=`echo "convert "`
for (( i=1; i<=$fignrows; i++ )); do
  c=`echo "$c ${b[$i]}"`
done
c=`echo "$c -append $outfigname"`
echo $c
echo "the command above is excuting"
eval $c
echo "done"

星期一, 1月 30, 2012

編譯 ncview


一直以來,都用 fortran 配合 GMT畫模式輸出結果的圖,其實已經很方便了,不過常常還是要改一下script。有時候只想非常快速的看一下結果,(完全不重品質),其實 ncview 算是不錯的軟體。下面是其安裝步驟:

安裝 udunits
export F77=ifort
./configure --prefix=/usr/local/udunits
make
make check
make install
make install-html install-pdf


安裝 ncview 除udunits外,至少需要下面的套件
yum install libXaw-devel.x86_64
yum install libXmu-devel.x86_64
yum install libpng-devel.x86_64
./configure --prefix=/usr/local/ncview --with-udunits2_incdir=/usr/local/udunits/include --with-udunits2_libdir=/usr/local/udunits/lib
make
make install

星期四, 12月 29, 2011

剛學NCL很多東西還搞不是很清楚,只好用TIP的方式。
跑海洋模式,大部份在繪圖時會用到岸線資料,所以寫一個能畫模式結果並顯示岸線資料是基本的工夫,如下圖。但如果不想繪岸線怎辦?


最簡單的想法是透過繪圖的順序,把岸線蓋掉。在NCL中,岸線是與CONTOUR畫在一起。控制繪圖順序的方式有PreDraw, Draw,  與 PostDraw。
PreDraw是最先畫的,Draw次之最後是PostDraw,所以讓岸線先畫,Contour後畫。不過還是得先找出控制繪圖順序的屬性,cnFillDrawOrder是contour的屬性;mpOutlineDrawOrder是map的屬性。在程式碼上加上下面二行屬性。
res@cnFillDrawOrder        = "Draw"
res@mpOutlineDrawOrder="PreDraw"
結果如果是沒有反應,那應該是我們用了rangs/gshhs 的高解析度岸線的關係…如果我們用了rangs/gshhs的岸線,有很多屬性會自動失效(手冊上寫的,別問我原因)…所以就不要用 rangs/gshhs的岸線檔就好了,改用預設值,就是把下面這一行註解掉就可以了。
;res@mpDataBaseVersion      = "HighRes"

結果岸線的確是變粗,不過還是沒有成功,主要是預設的邊界設定還沒關閉,再加上下面這一行:
res@mpFillBoundarySets="NoBoundaries"
結果就會如下圖一樣,看不到岸線…白色的地方是因為模式本身的mask所致。


星期三, 7月 13, 2011

/etc/sysconfig/iptables 被重設

最近某一台新機器的iptables改完之後常常會跑回原先的設定
仔細看一下/etc/sysconfig/iptables 的檔案,發現前二行是
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
大意是說,這個iptables是由 system-config-sercuritylevel 產生,查了一下
發現這是一個執行檔在/usr/bin下
改為root,執行system-config-sercuritylevel (文字介面即可)
嗯,是一個防火牆的設定介面…裏面的設定值大概固定時間會寫一次到iptables這個檔案,難怪怎麼設定都沒用。
怎麼解決?就把要開的埠在寫在自訂就好了5901,5902,5903 餘類推。

POM bcond

純個人紀錄用…
最近在計算海嘯的例子發現在邊界上有明顯的反射…

這個試了n天,這應該是預設邊界條件的ramp(一個介於1~0間的值)所致…
ramp的目的是要由邊界推動模式時,可以在一個時間內慢慢的起動,免得一下推太用力爆掉,但是這個算例(海嘯)是由計算區域內往外傳,所以ramp反而把該往外傳的值變的比較小…導致出去的不乾淨,造成反射。下面是原始的code,在bcond 的subroutine中(idx=2)。
       vaf(i,jm)=vabn(i)
     $          +rfn*sqrt(grav/h(i,jmm1))
     $          *(el(i,jmm1)-eln(i))
       vaf(i,jm)=ramp*vaf(i,jm)
下述的code應該有一個邏輯上的錯誤,就是不應該全部的值乘上ramp,而是只有邊界往內傳的部份要乘上ramp。照上面的想法,只要不要啟動ramp(即ramp一直為1)就應該不會有反射(或至少要變的比較小),試跑之後,得到下面的結果:
果然邊界的反射沒有了…
按上面的敘述把code改成如下(共四個邊界,這舉一隅,餘類推):
       vaf(i,jm)=ramp*vabn(i)
     $               +rfn*sqrt(grav/h(i,jmm1))
     $               *(el(i,jmm1)-ramp*eln(i))
這一行就不要了,看是刪掉還是註解掉。
c       vaf(i,jm)=ramp*vaf(i,jm)
註:話說回來rfn 放的地方也怪怪的…印像中,他是rfe=0或1,第於1就沒什麼意思,有乘等於沒乘。等於0就讓vaf=0,就等於設了一道牆,既然設為牆了,vabn(i)應該也要乘才是。不過目前為止,我的例子的rfn都是1,就暫且不管了。不過還是把認為對的寫在下面,當成記錄,方便哪天用到時可以查。
       vaf(i,jm)=ramp*vabn(i)
     $              +sqrt(grav/h(i,jmm1))
     $              *(el(i,jmm1)-ramp*eln(i))
       vaf(i,jm)=rfn*vabn(i)

星期三, 6月 01, 2011

intel fortran 使用大的陣列 ( > 2G)

跑數值的當然會需要有大大的記體,然後開大大的陣列
編譯時如果遇到  relocation truncated to fit 錯誤,那編譯時就加入
-shared-intel -mcmodel=medium
例如:
ifort -shared-intel -mcmodel=medium mycode.f90


如果用的是動態陣列,不會先知道用多大的陣列,可以編譯過關
但是執行時可能會遇到 segment fault 錯誤
那就執行程式前使用下列命令
ulimit -s unlimited

星期六, 5月 21, 2011

車控~


終於到了可以讓我這個老爸好好玩軌道組的時候了…今天帶小雞去反斗城買一組五百元左右的一火車及一個簡單的軌道組,想說來和現有的A夢火車拼一起,並且這樣就有二台小火車可以跑…結果明明架上寫的是498的…付錢卻變成1190……這種過年過節才買的下去的價位…當然就沒買了…不過還是買了99元的二倍長型軌道一包四支…
Posted by Picasa