2010年12月26日 星期日

幾個有趣的 Project 和文章

因為分頁開著放很久了,又沒時間去看,先紀錄下來,以後如果有空再...。

pep8
pep8 is a tool to check your Python code against some of the style conventions in PEP 8.

archery

Archey is a system information tool written in Python.

psutil :
psutil is a module providing an interface for retrieving information on running processes and system utilization (CPU, memory) in a portable way by using Python, implementing many functionalities offered by command line tools like ps, top, kill, lsof and netstat.

shellinabox
Shell In A Box implements a web server that can export arbitrary command line tools to a web based terminal emulator. This emulator is accessible to any JavaScript and CSS enabled web browser and does not require any additional browser plugins.

How to get your code into an open source project

2010年11月14日 星期日

讓 xpdf 能正常顯示無內嵌字型的檔案

之前有寫過一篇 讓 xpdf 能正常顯示中文 (Arch Linux);但是捐血中心寄來的檢驗報告一直都是亂碼,原本以為是捐血中心的問題,直到前幾天想下載 大家來學 Vim 一個歷久彌新的編輯器 的 pdf 才發現沒有內嵌字型的 pdf 也是亂碼,於是就用 shell 呼叫 xpdf 開檔案,再由錯誤訊息去 google ,找了一堆討論,發現 xpdf 的語言包可以解決這個問題;自己測試沒有問題後,再追到 Arch Linux 的 package 上面,發現最新的 PKGBUILD 沒有複製 Adobe-CNS1.cidToUnicode 到 /usr/share/xpdf/ 下面,丟了個 bug report ,隔天 trunk 的 PKGBUILD 就更新了,雖然不知道什麼時候才會移到正式版上面去,但是能貢獻自己小小心力,還有學到一丁點知識,有點開心 :)

Reference:
FreeBSD Chinese HOWTO - 6.9. 以 gs 觀看不內嵌的 pdf 檔
"資訊人權貴" 之家 - 字形/中文
Edward G.J. Lee 的 xpdfrc 範例檔
xpdf - Download
Arch Linux Package - xpdf-chinese-traditional
Arch Wiki - Creating Packages

2010年11月2日 星期二

mount /var to a new partition

當初安裝的時候沒有把 /var 獨立出一個分割區,最近發現 / 剩餘空間愈來愈少,利用
sudo du -h --max-depth=1 /
才發現 /var 就佔了超過 2G ,大部份都是被 Cache 這個目錄吃掉,這是 pacman 的暫存檔,雖然可以用
sudo pacman -Sc
清掉,但是身為一個懶惰的傢伙,加上不曉得什麼時候會需要 downgrade 某個套件,乾脆就另外準備一個分割區來放。


備份資料到隨身碟時,發現裡面中文目錄或檔案都變成亂碼,似乎是 xfce4 的問題,
修改 /etc/xdg/xfce4/mount.rc
在 [vfat] 下面增加一行
utf8=true
下次插入隨身碟時就可以正常顯示中文了。

使用 Gparted Live CD 以預設選項進入 X 時,螢幕會出現
Out of Range
無法顯示畫面,逼的我用 Alt + SysRq + [ U , B ] 來重開機,改手動設定解析度就可以正常進入 X,切好分割區並格式化後,mount 原本的 / 與 新切割給 /var 的分割區,複製舊資料,更改原本的 /etc/fstab 。
mkdir ~/rrt ~/new_var

mount /dev/real_root_partition ~/rrt
mount /dev/new_var_partition ~/new_var

# 複製原本 var 下的檔案到新分割區
# 重新命名原本的 var,避免重新開機後掛載到內有檔案的資料夾
sudo cp -ax ~/rrt/var/* ~/new_var/
sudo mv ~/rrt/var ~/rrt/var.old
sudo mkdir ~/rrt/var

sudo cp ~/rrt/etc/fstab ~/rrt/etc/fstab.old

# 利用 blkid 來查 uuid 資料並更新 fstab 資料
blkid > ~/uuid.txt
cat ~/rrt/etc/fstab ~/uuid.txt > ~/fstab.new
# 使用 vi 修改完畢後覆蓋回原本的 /etc/fstab
sudo cp ~/fstab.new ~/rrt/etc/fstab
# 重新開機,測試是否有成功掛載
# 自己重新開機後有碰到一個問題,blkid 顯示的還是舊的分割區資料
# 後來 man blkid 才知道是讀取 cache 的問題
# 使用 blkid -g 就可以清除 ( 但是要用 root 權限去跑,否則沒用 )
sudo blkid -g
sudo blkid

Reference:
ArchWiki:Xfce
Ubuntu Forums:I want to move /var to a new partition

2010年11月1日 星期一

Hide Opera system tray icon with Opera 10.63

過去都是使用
opera -notrayicon
來隱藏 Opera 的圖示,現在已經沒有這個 argument,改成直接在 opera:config 裡面設定



取消勾選 Show Tray Icon 就行了。

2010年10月28日 星期四

在 linux 下的 UTF-8 termial 使用 telnet 連上中文 bbs 與 mud

目前是使用 PCMan X 上 bbs,在巴哈洽特上看到有人推廣 doommud,連過去卻無法輸入任何字元,在 termial 裡使用 telnet 連上去則是中文全變亂碼,google 了一下才發現解法,只要使用 luit 就行了


luit -encoding big5 telnet doommud.twbbs.org 4000


在 Xfce Terminal Emulator 和 rxvt-unicode 測試過,拿來上 bbs 也行,只是不在 big5 範圍內的文字會無法顯示,一些 ascii art 也會跑掉,單純看文章應該是夠用的,但是只能在 X window 下的 terminal emulator 使用,一般的 terminal 大概要使用 zhcon 才能正常顯示? (沒試過)

參考:
[Tips]解決utf8環境下,telnet bbs亂碼
Luit -- locale and ISO 2022 support for Unicode terminals

2010年9月30日 星期四

利用 shell script 一次同步多個目錄

買了顆日立 1T 硬碟搭配 CyberSLIM S1 來備份資料,雖然只能使用 USB 傳輸,但總比再弄張 sata 轉接卡接硬碟來的方便。

平常電源都是關閉,只有要傳資料時才會開啟,但每次都要 sudo mount ,接著在不同目錄內找新資料傳過去,實在很麻煩,這時想到可以利用 rsync 來同步資料夾,不用自己比對,想說這麼簡單的東西不必再用 Python ,練習寫個 shell script 就行了,沒想到也是卡了快一天...Orz

作法是在 /etc/fstab 內先將硬碟設定為一般使用者可以 mount ( pass 要設為 0 ,不然一開機就會檢查,然後卡住... )
# get UUID
blkid

# In /etc/fstab, set user, noauto
/dev/disk/by-uuid/a123-456a-789d-abcd /mnt/HDD ext4 rw,user,noauto,suid,dev,exec,async 0 0

sync.sh:

#!/bin/bash
# Description:
# sync multiple folders to external Hard disk

MOUNT_POINT=/mnt/HDD

### array in shell script
SOURCE_DIR=(
/mnt/SOURCE_1/
/mnt/SOURCE_2/
/mnt/SOURCE_3/
)

DEST_DIR=(
/mnt/DEST_1
/mnt/DEST_2
/mnt/DEST_3
)

# check if Hard disk mounted or not
if [[ -z `mount | grep "$MOUNT_POINT"` ]]
then
mount $MOUNT_POINT
echo "mount $MOUNT_POINT "
else
echo "$MOUNT_POINT already mounted !!"
fi

echo

# if unable to mount external Hard disk , stop the script and leave
if [[ -z `mount | grep "$MOUNT_POINT"`]]
then
echo "***** Unable to mount $MOUNT_POINT *****"
exit 1
fi

### seq : like range() in python
### ${#SOURCE_DIR[*]} : total element number in $SOURCE_DIR

# use for loop to sync multiple directories, counter start from 0
for counter in `seq 0 $(( ${#SOURCE_DIR[*]} - 1 ))`
do
echo "*********************************************"
echo "Source:" ${SOURCE_DIR[$counter]}
echo "Dest: " ${DEST_DIR[$counter]}
echo "*********************************************"
echo
rsync -av --exclude="*.sh" ${SOURCE_DIR[$counter]} \
${DEST_DIR[$counter]}
echo
done

exit 0;
裡面大部份程式碼都是從網路上的範例 copy 過來,應該還有更好的寫法,但可以正常運作就足夠了。

令我驚訝的是 shell script 內也有 for ... in ... ( 不好意思,我什麼都不知道 ),命令串接也很好用;但變數存取、運算和陣列相關的操作讓我很想用 python ;一些簡單的東西用 shell script 寫起來應該會很方便,只是目前還不熟...

2010年7月18日 星期日

944 Happy Numbers

範圍 1 ~ 99999
( 9^2 ) * 5 = 405
1 ~ 405 共有 67 個 Happy Number

最後卡 WA 的原因是
Print a blank line between two consecutive test cases.

between 而非 after each case ...Orz

2010年7月10日 星期六

mount DVD and windows share folder with chinese characters

在 Windows 下有燒錄一些光碟,裡面資料包含了中文檔名,換用 Linux 讀取時發現全部變成問號,網路上搜尋後發現要在 /etc/fstab 內設定 iocharset=utf8 就能正常顯示中文

/dev/dvd /media/dvd auto ro,user,noauto,unhide,iocharset=utf8 0 0


家中有台 windows 開分享資料夾,要丟資料到那台列印前,先使用

smbclient -L //WINDOWS_SERVER_NAME_OR_IP -U username

輸入正確密碼後,就會列出該台電腦上有分享的服務,確認要連線的分享資料夾後

sudo mount -t cifs -o iocharset=utf8,username=USER_NAME //WINDOWS_SERVER_NAME_OR_IP/SHARE_FOLDER /mnt/SHARE_FOLDER

一樣驗證密碼後就能使用分享資料夾。

在測試的時候才發現不輸入帳號密碼也可以看到 XP 上面的所有磁碟分割和服務,嚇了一跳,趕快把 guest 的帳號停用,另外建帳號作分享之用;查了一下,XP 預設會共用所有磁碟分割 (連線還是要輸入帳號密碼) , 雖然只要管理者有設密碼,就不會隨便被連進去,遠端管理也很方便,但還是覺得不太安心,如果要隱藏共用磁碟的話,可以參考下方第四個連結。

Reference:
如何讓ubuntu顯示ms燒入光碟的文字
[分享] 在 ubuntu 下使用 big5 編碼的光碟片的注意事項

Mount a Windows Shared Folder on Linux with Samba
如何防止 Windows NT Server 4.0 的系統管理共用的建立

2010年4月18日 星期日

[Script] Split audio files by cue

自從去年那篇 Split(Rename) audio files by cue files 後,覺得還要一個一個打指令實在太麻煩了,就自己寫個 script 來完成全部步驟,所需 package 相同, 只是要多加一個 ffmpeg 來幫 ape 轉檔,shnsplit 內建是 mac ,但是原作者網站都掛了,AUR 上又連到 gentoo 的軟體包去抓,實在很怪,就用 ffmpeg 來轉,如果 cue 是 UTF-8 的話會移除 BOM 再餵給 cuebreakpoint 才不會出錯,分割完後使用 cuetag.sh 設定 tag 資訊,但只支援 id3 和 vorbis,最後再改檔名。

下載

內容:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# require: ffmpeg, cuebreakpoint, cueprint, cuetag.sh , shnsplit
# use ffmpeg to convert musics

import sys
import os
import glob
import getopt
import subprocess as sp

###### usage ######
usage = """ \
Usage :
-c cuefile: the cue files to be used
-i file : the music file to be split
-o format : specify the format to be converted
"""

###### main ######

def parse_opt():
c_file = m_file = format = ""
try:
opts, args = getopt.getopt( sys.argv[1:],"c:i:o:" )
for o in opts:
if o[0] == "-c":
c_file = o[1]
elif o[0] == "-i":
m_file = o[1]
elif o[0] == "-o":
format = o[1]

# raise Error if not correct args
for f in [ c_file, m_file, format]:
if f == "": raise ValueError

return c_file ,m_file ,format

except ( getopt.GetoptError, ValueError ):
print usage
sys.exit()

def try_cmd( cmd_arg ):
# error strings
error = ["error", "Error", "ERROR"]
try:
ret = sp.Popen([ cmd_arg ],stdout=sp.PIPE,stderr=sp.PIPE,\
shell=True).communicate()
# if error strings passed to stdout or stderror
# raise error and stop the script
for es in error:
if ( es in ret[0] ) or ( es in ret[1]):
raise OSError( "\n\nExecution failed !!!\n" +\
"error messages :\n\n" +\
ret[0] + ret [1] )
return ret[0]
except OSError, e:
raise

def track_rename( c_file ):
track_names = try_cmd("cueprint -t '%02n. %t\n' " + c_file)
track_names = track_names.split('\n')
tracks = glob.glob("./split_cue_tmp_*")
tracks = sorted( tracks )
file_type = tracks[0].rpartition('.')[2]
zf = zip(tracks, track_names)
for t_name in zf:
print t_name[0], t_name[1]
os.rename( t_name[0], t_name[1] + '.' + file_type)

def remove_BOM( utf8_file ):
with open(utf8_file,'r') as f:
content = f.readlines()

check_c = map( ord, [ c for c in content[0][0:3] ] )

if check_c == [239, 187, 191] :
print "There are BOM inside!"
content[0] = content[0][3:]
with open(utf8_file + ".tmp.cue" , 'w') as f:
f.writelines(content)
return utf8_file + ".tmp.cue"
else:
print "File with no BOM"
return utf8_file

def check_format( m_file, format ):
if format == "":
return False
f_string = [format.lower(), format.upper(), format.capitalize()]
f_info = try_cmd("file " + m_file)
print f_info
for s in f_string:
if s in f_info:
print "Orginal file format is the same as specified !!"
return True
# different file format, need conversion
return False

def split_tracks(c_file, m_file, format):
# mac not installed , use ffmpeg to convert ape
if check_format( m_file, "ape"):
new_m_file = m_file.rpartition('.')[0] + '.' + format.lower()
try_cmd("ffmpeg -i " + m_file + " " + new_m_file)
m_file = new_m_file

# cuebreakpoints |shnsplit
s_args = " -a split_cue_tmp_ -o " + format + " "
try_cmd("cuebreakpoints " + c_file + "|shnsplit " + s_args + m_file)
# use cuetag.sh to add tags (only for vorbis and id3)
try_cmd("cuetag.sh " + c_file + " split_cue_tmp_*")

def main():
c_file, m_file, format = parse_opt()
c_file = remove_BOM( c_file )
split_tracks(c_file, m_file, format)
track_rename(c_file)


if __name__ == "__main__":
main()


2010年2月24日 星期三

設定開機時自動 fsck 的頻率

Reference:設定常規檔案系統檢查 (Filesystem Check, fsck)忽視fsck 當mount filesystem達到指定的數量

指令:dumpe2fs、tune2fs

因為電腦用途為個人使用,每天開開關關,沒幾個禮拜就會跑 fsck 檢查硬碟,實在很煩,可是又不想把這功能關掉,就來把檢查的掛載次數設多一點。

相關資訊利用

sudo dumpe2fs -h device

來查詢,Maximum mount count 就是設定這個磁區掛載幾次後,下次掛載時便執行 fsck 檢查,修改方式:

sudo tune2fs -c [ Maximum mount count Number] device

另外 Check interval 代表多久檢查一次,修改方式:

sudo tune2fs -i [ interval-between-checks ] device

如果在 /etc/fstab 內設定不檢查的話,用 dumpe2fs 來看上面的數值就是 -1 和 0

這些指令只對 ext2/ext3/ext4 有效,其他格式如果在 /etc/fstab 內設定要檢查的話,不知道有沒有辦法設定檢查時間,還要查一下相關資訊。

2010年1月6日 星期三

搞定不正確的系統時間

忘記從去年的什麼時候開始,每次開機時,系統時間都不準,必須要手動下 sudo ntpd -ds 才能校正,但下次開機時又是一樣的情形,查看 /var/log/daemon.log ,上次關機時 ntpd 明明都有 adjtime ,就覺得很奇怪,原本想說是不是 BIOS 電池沒電,但也不會每次都慢個一兩天,而且在 開機過程中 ntfs-3g 的時間是正常的,非常神奇,明明前後的時間都不對,就只有 ntfs-3g 跑的那段時間是正確的,昨天晚上突然想到 /etc/rc.conf 裡面似乎有 hardwareclock 的選項,才想到用 hwclock 指令查查看,果然問題就出在這邊,上網 google 了一下,才發現解決方法:

rm /var/lib/hwclock/adjtime (開機後會再重新產生,所以不用備份)

利用 ntpd -ds更新系統時間 (我是用 openntpd)

再下 hwclock -w

下次開機時間應該就正常了,不過問題出在哪我還不是很清楚,或許要翻翻 hwclock 的 document 或是上次更新時有將新的rc.conf 安裝到 rc.conf.pacnew,我還沒更新內容的關係?

Reference:
Arch Linux Forum:
My hw clock is randomly off even though I set it right...

吃葡萄不吐葡萄皮:
archlinux无厘头的时间错乱问题