2008年6月30日 星期一

為甚麼還要問?

答案, 我早已告訴你. 再問, 也不會改變.

有何關係? 要發生的自會發生, 不會發生的就是不會.

我早說過就讓一切順其自然, 這回事, 誰也勉強不來的.

以後的事, 誰知道, 隨心而活, 事情要怎樣發展就怎樣發展吧.

別再問我了, 好嗎? 其實我真的不知道.

退款

同事芬姐想學乒乓球, 由於另一位同事洋仔一直跟資深老師學習, 芬姐便拜托洋仔代為安排. 洋仔經過一番聯絡工夫後, 終安排好十課堂乒乓球班, 並為芬姐找到能一起上堂作為練習對手的人選.

本來一切已經定當, 豈料芬姐在上堂前數星期發現自己臨時有事, 不能出席第一堂之講課. 雖然這樣甚是可惜, 但既有急事, 那亦沒有辦法. 然而奧妙之處卻在於芬姐竟因此而要求洋仔向教練取回第一堂之學費, 其道理為既然沒有上堂, 便不應收費. 洋仔向芬姐表示這樣實有困難, 十堂課之收費實為一個總數, 而且上課日期是大家協議好的, 現在是芬姐自行放棄, 實在找不到理由向教練取回一堂學費. 芬姐為此向其他同事訴苦, 但同事阿祈對此卻不表贊同, 他以報讀工聯會課程為例嘗試向芬姐解釋自行放棄上課是不應得到退款. 我也從旁解說芬姐行為便如大學生走堂, 怎可向老師收回學費.

可是芬姐堅持個人安排之課程不等同報讀工聯會, 繼續向洋仔追收一堂之款項. 洋仔左右做人難, 沒想到好意幫忙卻換來一推煩惱. 聽說最後芬姐惱修成怒, 決定放棄學習乒乓球, 至於學費之去向, 就不得而知了.

對於芬姐要求退款所持的理由, 我真的不能理解, 我亦興幸自己無法理解當中的道理. 老實說, 這樣的行為, 已經不只是自私這麼簡單的了.

2008年6月29日 星期日

你知道嗎?

當大家都在談論那張舊照片時, 你注意到嗎? 你會怎麼想呢? 你會在意嗎? 我知道你不會.
聽到你想吃雞翼, 我立即幫你叫, 你知道我是特意幫你叫的嗎? 我知道你不知道.
伴著你們走, 你會覺得奇怪嗎? 會意識到甚麼嗎? 你根本不會放在心上.
送你回家, 你真的以為是順路嗎? 我似這麼閒嗎? 你不會想到這裡去.
你更不會知道, 輕輕的觸碰, 淺淺的微笑, 遠遠的揮手作別, 竟深深的印在我心上.

但是, 你真的不用知道啊! 只要能夠繼續看到你的笑面, 我已經心滿意足了.
心還在動, 那已經足夠了.

2008年6月28日 星期六

小執著

從小就對一些事有那麼的一點執著, 就試試列出來.

1 紅綠燈過馬路要等綠公仔
2 扶手電梯靠右企
3 港鐵候車靠邊站
4 不亂拋垃圾
5 讓坐與有需要人仕
6 要排隊, 不打尖
7 路不拾遺
8 不在睡房吃東西

想來想去都只是想到八樣, 可能還有一些小事情, 但一時間真的想不起來. 當中有一些其實做了是犯法的, 但真的很多人都會做, 只是我就是不願意. 其中第一點"等綠公仔"最經典, 很多時候一班朋友在街上一起走著, 卻只有我一個墮後了, 就是因為在等紅綠燈. 而且我也會對那些願意等紅綠燈的行人產生莫名的好感, 真的幾無聊.

個 monitor 壞左?

有時做 support, 要處理o既問題都幾濕碎. 好似今日有用家打上來話個 monitor壞左, 出唔倒佢要o既野, 但係又著倒架喎. 咁我地梗係要走去睇下乜野事啦, 大約估計都可以係d 線鬆左咁上下. 點知走到去, 望一望個 display, 再按一按遙控, 原來係選錯channel. 即係, 大約等如你o係屋企想用DVD機來睇DVD, 但係個電視機仲係播緊無線個台咁上下啦. 咁我地唯有幫佢轉返個台, 再講聲佢知下次可以點做.

2008年6月27日 星期五

gtk dialog box test

用 gtk 開個 "yes,no" dialog box.
compile by : cc -o d_box -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include -L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm d_box.c


#include <stdio.h>
#include <gtk/gtk.h>

void ButtonClicked(GtkWidget *widget, gpointer data);

int main(int argc, char *argv[])
{
GtkWidget *window, *yes, *no, *basebox, *hbox, *tbox;
GtkWidget *lbox;
char mesg[512];

if (argc != 2)
{
fprintf(stderr,"Usage : %s \n",argv[0]);
exit(-1);
}

gtk_set_locale();
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Dialog box test");
gtk_window_set_default_size(GTK_WINDOW(window),400,100);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
basebox = gtk_vbox_new(TRUE,0);
hbox = gtk_hbox_new(TRUE,0);
gtk_box_pack_start(GTK_BOX(basebox), hbox, FALSE, TRUE, 0);
tbox = gtk_hbutton_box_new();
gtk_box_pack_start(GTK_BOX(basebox), tbox, FALSE, TRUE, 0);
sprintf(mesg,"%s",argv[1]);
lbox = gtk_label_new(mesg);
gtk_box_pack_start(GTK_BOX(hbox), lbox, FALSE, TRUE, 0);
gtk_button_box_set_layout(GTK_BUTTON_BOX(tbox),GTK_BUTTONBOX_SPREAD);
gtk_button_box_set_child_size(GTK_BUTTON_BOX(tbox),50,16);
yes = gtk_button_new_with_label("Yes");
gtk_container_add(GTK_CONTAINER(tbox), yes);
gtk_signal_connect(GTK_OBJECT(yes), "clicked", GTK_SIGNAL_FUNC(ButtonClicked), "yes");
no = gtk_button_new_with_label("No");
gtk_container_add(GTK_CONTAINER(tbox), no);
gtk_signal_connect(GTK_OBJECT(no), "clicked", GTK_SIGNAL_FUNC(ButtonClicked), "no");
gtk_container_add(GTK_CONTAINER(window), basebox);
gtk_window_set_focus(GTK_WINDOW(window),yes);
gtk_widget_show_all(window);
gtk_main();
return(0);
}

void ButtonClicked(GtkWidget *widget, gpointer data)
{
if (g_strcasecmp(data, "yes") == 0)
{
printf("0\n");
}
else
{
printf("1\n");
}

gtk_main_quit();
}

還在下雨

又是下雨天, 不是說不喜歡下雨, 如果不用出門的話; 不是說討厭下雨, 如果不用上班的話; 也不是說害怕下雨, 如果不用起床的話. 其實, 也不只是喜不喜歡, 討不討厭, 害不害怕的問題, 下雨的時候總是懶床不願起來, 明明被鬧鐘吵醒了, 還是會躺在床上輾轉反側朦朦朧朧的再次睡去. 相反在陽光普照的日子裡, 很自然的便會早起, 而且精神奕奕. 我有時真的懷疑自己是要光合作用來推動的呢. 下雨的時候, 四周圍都是濕濕的, 總提不起勁走到街上, 想到無論牆上, 門上, 天上, 路上都是濕濕滑滑時, 就已經覺得很麻煩了. 可能, 我真的太怕麻煩了吧. 但是陰陰濕濕的天氣真的叫人沒精打彩啊, 心裡鬱鬱悶悶的, 精神恍恍惚惚的, 手腳遲遲鈍鈍的, 人也好像變得呆呆笨笨的. 下雨時不可以行山, 不可以游泳, 不可以攀石, 不可以跑步, 不可以爬艇... 我喜歡的戶外活動都不能做啊.

但是, 我覺得下雨很美. 微雨時的淒美, 滂沱大雨時的壯麗, 我同樣喜歡. 有時我會呆呆的坐在窗前, 看著由天上落下的雨絲一點點的打到街上, 甚麼也不用想, 就是這樣呆著, 心中卻感到平安踏實. 或許, 只有這個時候, 才可以真真正正地停下來休息一下吧.

雨, 總會停下來, 當太陽再次照到我身上, 又將會是努力向前的新一天.

2008年6月26日 星期四

不是要放手, 也不是要忘記, 而是要接受

很多人都會叫人把以前的種種放下或是忘記, 重新做人. 放下了的, 會再拿起; 忘記了的, 會再勾起. 只有接受, 才能面對自己, 勇敢步向將來.

會有今天的我們, 全因為我們的過去, 無論開心的; 傷心的; 煩惱的; 對的錯的, 都是我們的經歷. 如果沒了這些經歷, 我們可能便不會是現在這樣子了. 對於過去, 我們一定要接受, 做得好的便繼續下去, 要做得更好; 做得不好的要檢討, 下次要做好它. 幸運的, 我們感恩. 不幸的, 我們當作鼓勵.

做人嘛, 最緊要接受自己. 不是叫你放任, 而是要認識自己, 了解自己, 接受自己的優缺點, 從而找出更適合自己的將來.

2008年6月25日 星期三

只想做一粒小螺絲

在這個講增值, 講效益, 人人力爭上游, 個個拼命進修的城市裡, 想做一粒快樂的小螺絲真的不容易. 我一直認為, 如果把社會比喻為一部機器, 不同的人在社會不同的角色就像是機器裡不同的部位. 有人會做手把, 有人會做齒輪, 自然也有人會做螺絲.

其實做一粒稱職的螺絲並不簡單, 每時每刻也要堅守自己的崗位, 努力工作, 默默付出. 對於一部機器, 每一個部份都同樣重要, 螺絲只是比較低調, 不愛出風頭. 為甚麼大家就是不讓螺絲好好做自己的工作, 要輕視他, 說他沒用, 說他不上進, 硬要他進修, 硬要他去做他不喜歡的工作? 難道, 大家以為一部機器沒了螺絲還可以正常運作嗎?

請尊重螺絲的選擇, 也請尊重你自己. 希望每粒螺絲可以繼續快快樂樂地工作, 要好好做一粒螺絲真是不容易啊.

tracker_write

為免 i/o buffer 令一些 tracking message 印唔切, 寫了個用 fflush 清 stdout buffer o既 program 比 script 呼叫.


#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[])
{
FILE *fp;
int pres;

time_t now;
struct tm *stime;
char timeval[20];

if (argc < 3)
{
fprintf(stderr,"%s \n",argv[0]);
exit(-1);
}

if (fp = fopen(argv[1],"a"))
{
now = time(NULL);
stime = localtime(&now);
sprintf(timeval,"%d%02d%02d %02d:%02d:%02d",stime->tm_year + 1900,stime->tm_mon + 1,stime->tm_mday,stime->tm_hour,stime->tm_min,stime->tm_sec);

pres = fprintf(fp,"%s %s\n",timeval,argv[2]);
fflush(fp);
fclose(fp);
if (pres < 0)
{
fprintf(stderr,"File %s write error.\n",argv[1]);
}
}
else
{
fprintf(stderr,"File %s could not open.\n",argv[1]);
exit(-1);
}
}

2008年6月23日 星期一

用餐的要求

昨天到附近的餐廳晚餐, 看到鄰桌的一位客人總是面黑黑的. 我滿心奇怪, 因為這間餐廳雖不是甚麼高級餐室, 但一向殷勤待客, 食物也中規中矩. 細心留意之下, 發現這個客人真的有很多不滿. 首先, 他對於舉手示意時未有侍應即時反應表現得很不耐煩. 之後又嫌餐湯不夠熱, 又嫌主菜太快送來(因為他還在喝湯,可能真的不夠熱吧...). 又對於配主菜的意粉分開送來表示奇怪. 當他正在吃主菜時, 侍應拿了一份本是我的咖喱牛腩飯到他桌邊準備放下, 他在表示那不是他叫的菜之後, 還要數落別人沒腦根, 見桌上滿是食物還要問他. 之後, 不論是甜品, 餐飲以至結賬, 他都表現得很煩燥, 覺得侍應行動太慢. 到臨走前還要略帶諷刺地教訓其中一個侍應, 問他今天是不是不夠人返工等等...

就我觀察, 餐廳今天的表現也不算很差, 見到客人招呼也會立即回應. 至於奉上食物的速度也不是特別慢, 約10分鐘左右便有得吃了. 有時真的不明白, 做人真的要這麼趕嗎? 難道不可以安安靜靜, 舒舒服服的吃一餐飯嗎? 做人輕鬆一點, 無論對人對自己都別拉得這麼緊不是更好嗎?

2008年6月22日 星期日

stat test

用 stat 查出檔案的資料.


#!/usr/bin/perl
#
# test stat
#

my $file1 = shift;
if (! (-e $file1))
{
print "Invalid file : $file1\n";
exit(-1);
}

my @t1 = stat($file1);

print "file : $file1 stat result\n";
foreach $line(@t1)
{
print "$line ";
}
print "\n";

my @des;
$des[0]="Device";$des[1]="Inode";$des[2]="Permission";
$des[3]="Links";$des[4]="Uid";$des[5]="Gid";
$des[6]="Device Type";$des[7]="Size";$des[8]="Access";
$des[9]="Modify";$des[10]="Change";$des[11]="IO Block";$des[12]="Blocks";
print "Description\n";
for($i=0;$i<=$#t1;$i++)
{
print "$i : $des[$i] : $t1[$i]\n";
}

exit(0);

2008年6月21日 星期六

fuser

見到個port有program listen 住, 可以用 fuser 去查下邊個程序/用戶用緊.


例子:
用 netstat -ln 查下邊個port 有程序 listen 緊
查詢結果 :
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:32768 0.0.0.0:*

如想知 tcp port 111 邊個用緊 :
fuser -uv -n tcp 111
結果 :
USER PID ACCESS COMMAND
111/tcp root 778 f.... portmap

這樣便可以知道用戶 root, pid 778, 程式 portmap 用緊 port 111

usage: fuser [ -a | -s ] [ -n space ] [ -signal ] [ -kimuv ] name ...
[ - ] [ -n space ] [ -signal ] [ -kimuv ] name ...
fuser -l
fuser -V

check web service

睇下個URL係咪正常去得到.


#!/usr/bin/perl
#
# check web service
#
use strict;
use LWP::Simple;
use URI::URL;

my $url = shift;
if (! ($url) )
{
print "Usage : $0 \n";
exit(-1);
}

# make and check url
my $chkurl = URI::URL->new($url);
my @headers = head($chkurl);
if (@headers)
{
print "Host : $url\n";
print "Server : @{[pop @headers]}\n\n";
}
else
{
print "Unable to retrive @{[$chkurl->as_string]}\n\n";
}

exit(0);

2008年6月20日 星期五

apt / yum

#
# Install apt server
#

Step 1, install apt rpm (*install httpd for using web access on apt)
- from Redhat disc
i.e. rpm -Uvh apt-0.5.5cnc6-fr1

Step 2, setup RPM folders for os and updates
i.e. mkdir -p /var/www/html/apt/redhat
mkdir /var/www/html/apt/redhat/9
mkdir /var/www/html/apt/redhat/9/RPMS.os
mkdir /var/www/html/apt/redhat/9/RPMS.updates
copy redhat disc RPMS to RPMS.os
copy patch updates to RPMS.updates

Step 3, generate base folder for apt
i.e. genbasedir /var/www/html/apt/redhat/9 os updates

Step 4, start web server

Step 5, [Client side] EDIT /etc/apt/source.list
(ADD) rpm http:///apt/redhat/9 os updates

Usage :
Update rpm package list : apt-get update
Install package : apt-get install
Upgrade all package to newest version : apt-get upgrade

=======================================================
#
# Yum install (* under FC4)
#
Step 1 : install yum rpm
- from FC4 disc
i.e. rpm -Uvh yum-2.3.2-7.rpm

Step 2 : install createrepo
- from FC4 disc
i.e. rpm -Uvh createrepo-0.4.2-2.noarch.rpm

Step 3 : setup RPM folders for base and update
i.e. mkdir -p /var/www/html/yum/fc4
mkdir /var/www/html/yum/fc4/base
mkdir /var/www/html/yum/fc4/update
cp fc4 disc RPMS to base
cp fc4 patch updates to update

Step 4 : import GPG key (both server and client)
i.e. rpm --import /usr/share/rhn/RPM-GPG-KEY
rpm --import /usr/share/rhn/BETA-RPM-GPG-KEY
rpm --import /usr/share/rhn/RPM-GPG-KEY-fedora
rpm --import /usr/share/rhn/RPM-GPG-KEY-fedora-test

Step 5 : generate rpms header folder
i.e. yum-arch /var/www/html/yum/fc4/base
yum-arch /var/www/html/yum/fc4/update

Step 4 : setup repositories
i.e. createrepo /var/www/html/yum/base
createrepo /var/www/html/yum/update

Step 5 : setup repositories entry (both server and client side)
clear old .repo files(rm /etc/yum.repos.d/*.repo)
ADD new file for yum server -
/etc/yum.repos.d/fc4.repo
---------------------------------------------
[fc4-base]
name=fc4 - base
baseurl=http://YUM_SERVER/yum/fc4/base
enabled=1
[fc4-update]
name=fc4 - update
baseurl=http://YUM_SERVER/yum/fc4/update
enabled=1
---------------------------------------------

Step 6 : start web server

Usage :
Install package : yum install
Update package : yum update
Upgrade all package to newest version : yum -y update
Clean downloaded packages : yum clean packages

2008年6月19日 星期四

Network boot server


#
# Network boot server setting
#

# require package
dhcp
tftp-server
syslinux

# Setup dhcp server
EDIT /etc/dhcpd.conf
#-----------------------------------------------
ddns-update-style none;

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.11 192.168.0.20;
default-lease-time 3600;
max-lease-time 4800;
option routers 0.0.0.0;
option subnet-mask 255.255.255.0;
filename "pxelinux.0";
}
#-----------------------------------------------

** option - filename : this is the file for pxe client download and execute

# Setup tftp server
EDIT /etc/xinet.d/tftp
#-----------------------------------------------
server_args = -v -s /tftpboot
disable = no
#-----------------------------------------------
restart xinetd
/etc/rc.d/init.d/xinetd restart

# Setup kernel for remote client
- Fedora Core
get from FC source
copy FC source : /isolinux/vmlinuz to /tftpboot/fc
copy FC source : /isolinux/initrd.img to /tftpboot/fc-initrd

# Setup pxelinux file for boot
mkdir /tftpboot (if not exists)
cp -a /usr/lib/syslinux/pxelinux.0 /tftpboot/
mkdir /tftpboot/pxelinux.cfg
EDIT /tftpboot/pxelinux.cfg/default
#-----------------------------------------------
prompt 1
default fc
timeout 150

label fc
kernel fc
append initrd=fc-initrd ramdisk_size=8192
#-----------------------------------------------

# Usage
# start dhcp server
1) /etc/rc.d/init.d/dhcpd start
2) start client machine use network boot
** default is boot from fc, press enter would continue

# nfs install for linux (optional, u may not want to install throung nfs)
EDIT /etc/exports
#-----------------------------------------------
/data/FC (ro)
#-----------------------------------------------
/etc/rc.d/init.d/nfs start

mass_ssh

經由 ssh, 呼叫一定數量機器運行特定指令.


#!/bin/sh
#
# call other machine to exec cmd by ssh
#

# function
exec_cmd()
{
LSUB=$1
IPS=$2
LCMD=$3

CHKRNG=`echo "${IPS}" | grep "-"`

if [ ${CHKRNG} ]; then
OIFS=$IFS
IFS="-"
SIP=
EIP=
for A in ${IPS}
do
if [ ! ${SIP} ]; then
SIP=${A}
else
EIP=${A}
fi
done
IFS=$OIFS

if [[ ${SIP} -gt ${EIP} ]]; then
echo "Start IP : ${SIP} greater than End IP : ${EIP}"
else
CIP=${SIP}
while [[ ${CIP} -le ${EIP} ]]
do
echo "Exec [${LCMD}] on ${LSUB}.${CIP}"
ssh ${LSUB}.${CIP} "$LCMD"
echo
CIP=$(($CIP + 1))
done
fi
else
echo "Exec [${LCMD}] on ${LSUB}.${IPS}"
ssh ${LSUB}.${IPS} "$LCMD"
echo
fi
}


if [[ $# -lt 3 ]]; then
echo "Not enough parameter."
echo "Usage : $0 "
echo "e.g. $0 192.168.0 ls 1 3 5"
exit -1
fi

ALLARGV=$@

if [[ -z ${ALLARGV} ]]; then
echo "Usage : $0 "
echo "e.g. $0 192.168.0 ls 1 3 5"
exit -1
fi

# separate Command and Machine Numbers
SUBNET=$1
CMD=$2
shift 2

if [[ -z "$@" ]]; then
echo "Please input "
echo "e.g $0 192.168.0 \"ls -l\" \"1-3\""
exit -1
fi

for A in $@
do
exec_cmd ${SUBNET} ${A} "${CMD}"
done

exit 0

2008年6月18日 星期三

disable browser : checkloaduri

為了讓 browser 可以call local program來行, 要disable 一些安全設定.

Firefox 1.0.x 或較早版本流覽器
在地址欄中鍵入 "about:config". 找到 "security.checkloaduri"一項 (你可以在過濾中鍵入 "security.check" 以快速尋找) 當前這個值顯示為 "true". 雙擊這一行內容. 這個值會轉變為 "false". 現在本機上的檔可以被正常讀取.

Firefox 1.5.x 或更新版本流覽器
尋找 Firefox 在硬碟中的使用者設定, 這是一個包含8個字的隨機字串目錄 (下例中[12341234]是隨機的8位元字串):
· Windows : "C:\Documents and Settings\username\Application Data\Mozilla\Firefox\Profiles[12341234].default\"
· Linux : "/home/username/.mozilla/firefox/[12341234].default/"
· Mac : /username/Library/Application Support/Firefox/Profiles/[12341234].default/
在這個目錄中建立一個名為 "user.js" 的文字檔案, 然後把下面幾條 rule 放進去:
user_pref("capability.policy.policynames", "localfilelinks");
user_pref("capability.policy.localfilelinks.sites", "http://www.abc.com http://www.def.com");
user_pref("capability.policy.localfilelinks.checkloaduri.enabled", "allAccess");
如此, 便可讓 www.abc.com 及 www.def.com 經網頁呼叫 user 本機的檔案.

opening page

讀書時貪得意寫的, 用類似原理, 現在用來做 console program waiting signal.


#include <stdio.h>
#include <termios.h>
#include <unistd.h>

#define COLOR "^[[%d;%dm"
#define POSITION "^[[%d;%df"
#define CLEAR "^[[2J"

struct termios save_termios;

main()
{
op();
printf(CLEAR);
}

tty_reset()
{
if (tcsetattr(STDIN_FILENO,TCSAFLUSH,&save_termios) < 0)
exit(-1);
return(0);
}

tty_cbreak(work,times)
int work;
int times;
{
int i;
char c;
struct termios buf;

if (tcgetattr(STDIN_FILENO,&save_termios)<0)
exit(0);
buf=save_termios;
buf.c_lflag &= ~(ECHO | ICANON);
buf.c_cc[VMIN] = work;
buf.c_cc[VTIME] = times;
if (tcsetattr(STDIN_FILENO,TCSAFLUSH,&buf) < 0)
exit(-1);
return(0);
}

op()
{
int work,times;
int x,y,z;
int cr=30;
int ef=1;
char c=0;

printf(CLEAR);

printf(POSITION,22,5);
printf("^[[5;37mPress any Key to continue!");

work=0;times=1;
tty_cbreak(work,times);

while (c==0)
{
read(STDIN_FILENO,&c,1);
y=1;
for (x=6;x<15;x++)
{
printf(POSITION,x,y++);
if (ef==0)ef=1;else ef=0;
if (cr==38)cr=31;
printf(COLOR,ef,cr++);
printf("VVV");
}
for (x=15;x>5;x--)
{
printf(POSITION,x,y++);
if (ef==0)ef=1;else ef=0;
if (cr==38)cr=31;
printf(COLOR,ef,cr++);
printf("VVV");
}

for (x=0;x<10000;x++)
for (y=0;y<50;y++)
;
}
tty_reset();
}

2008年6月17日 星期二

系統保安

最近 USB手指遺失和資料外洩或棄掉事件弄得沸沸盪盪, 公司還是沒甚麼警覺性. 那些所謂特權階級繼續把敏感的資料傳來傳去.
冇事由自可, 有事咪又係怪 IT.
唉。。幾時都好,保安最大漏洞都係人為疏忽。
搞保安,搞程序,用家又話你阻住做野,有事時又話 IT 唔掂,真係好得意。
部電腦要login, 都有用家會牙痛咁聲,唔知佢地屋企鎖唔鎖門,要唔要用鎖匙開門架呢?

random number

random 0-9, 其實用 pid / time 其中一個做 seed 都 ok, 不過用 time - pid 都唔算係好花 resource 啊.


#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>

main()
{
int j;
pid_t mypid;
time_t now;

mypid = getpid();
now = time(NULL);

printf("pid = %d\n",mypid);
printf("time = %d\n",now);

srand((int)time - mypid);
j=(int) (10.0*rand()/(RAND_MAX));
printf("j = %d\n",j);

j=(int) (10.0*rand()/(RAND_MAX));
printf("j = %d\n",j);
}

check last local login user

check 下最後 local login 係邊個, print out userid, hostname 同埋現在的時間


#!/bin/sh
#
# check uid and hostname
#
LASTUSER=`last | grep ' :0 '|head -n 1`
if [[ -z ${LASTUSER} ]]
then
LASTUSER=`last -f /var/log/wtmp.1 | grep ' :0 '|head -n 1`
fi

if `test "${LASTUSER}"`
then
LUSER=`echo ${LASTUSER} | awk '{print $1}'`
else
LUSER="nologin"
fi

NOW=`date +%Y%m%d%H%M`
HNAME=`hostname -s`

echo "${LUSER}:${HNAME}:${NOW}"

exit

2008年6月16日 星期一

關於馬會網頁的意見

To: INTERNET, HKJC eWIN
Subject: (EM029417)
你好,
對於馬會提供的網上服務, 我實在深表失望. 本來網上服務是為了方便大眾, 可惜馬會網上服務卻有著太大的限制, 要求用家使用單一瀏覽器 -- Internet explore. 由於我並非微軟用家, 無法安裝 IE 作為瀏覽器, 至使無法使用馬會的網上服務. 對馬會只支援單一作業系統, 我實在深表遺憾.
--
用家

馬會的回覆 --

親愛的用家:
多謝您的電郵。
就有關查詢,我們抱歉在現階段網上投注服務暫未能支援Internet Explorer以外之瀏覽器。不便之處,敬請原諒。

我們已就您的個案向有關部門反映,作為日後業務發展及提升服務之參考。我們會定期收集顧客所提出的每項意見及建議,以參考並改善有關服務。您的意見將有助我們更進一步為顧客提供更佳的投注服務。

有關使用網上投注服務之個人電腦的最低規格,請參考以下之詳情或瀏覽︰http://special.hkjc.com/infomenu/ch/channel/ewin/requisite.asp。

(1) Pentium 4,512MB記憶體, 200MB 硬碟容量, Microsoft Windows XP 作業系統
(2) 瀏覽器:微軟 IE6.0 或以上版本,並裝有128位元高加密功能及啟動「下載簽名的 Active X 控制項」
(3) 顯示器解象度:1204 x 768
(4) 上網連線速度:1.5Mbps 或以上

如有任何查詢,歡迎致電顧客服務熱線1818或電郵至 eWin@hkjc.org.hk與我們聯絡。再次感謝您聯絡我們。
祝 好運!

香港賽馬會
顧客服務部
-----------------------------

其實真係好唔明, 咁大個機構, 做出來的網頁也不照顧一下弱勢社群, 真係好麻煩.

請用 openoffice

很奇怪, 不明白為甚麼很多人寧願用翻版的MS office, 都不用免費的Openoffice.

我已經用了Openoffice 好幾年了, 像我這種只是偶然要打打文件, 用用試算表的人, 我真的不覺得要花錢買那大大件的 MS office, openoffice 真的很夠用了.

(* 我全公司上上下下的文書處理也是用 Openoffice 的)

甚麼是 openoffice
Ref : http://zh.wikipedia.org/wiki/OpenOffice.org

OpenOffice.org V.S MS Office
Ref : http://ooo.tnc.edu.tw/modules/tadbook2/open_book.php?book_sn=4

Get your own Openoffice
Ref : http://download.openoffice.org/

2008年6月15日 星期日

check cpu usage

grep 個 cpu usage 同埋 uptime 出來, print 去 stdout


#!/usr/bin/perl
#
# Used to check cpu usage and return to stdout
#
$machine = `hostname -s`;
$getcpu = `/usr/bin/sar -u 1 5 | grep Average`;
$getuptime = `/usr/bin/uptime`;

$getcpu =~ /^Average:\s+(\w+)\s+(\d+)\.(\d+)\s+(\d+)\.(\d+)\s+(\d+)\.(\d+)\s+(\d+)\.(\d+)/;
$getcpuusr = $2;
$getcpusys = $6;
print "$getcpuusr\n";
print "$getcpusys\n";

if ($getuptime =~ /^\s+(\d{1,2}:\d{2}:\d{2})\s+up\s+(\d+\s+\w+)/)
{
$utime = $2;
}
else
{
$getuptime =~ /^\s+\d{1,2}:\d{2}:\d{2}\s+up\s+(\d+:\d+)/;
$utime = $1;
}
print "$utime\n";

print "$machine\n";

又係日期時間

真係無乜辦法, 無論用邊隻語言, 都係要砌時間.

localtime.pl

#!/usr/bin/perl
my @now = localtime();

for($i=0;$i <= $#now; $i++)
{
print "$now[$i]\n";
}


timelocal.pl

#!/usr/bin/perl
use Time::Local;

my $offset = shift; $offset = 0 if (!($offset));

my $time = time();
my $ltime = localtime($time);
my ($t0,$t1,$t2,$t3,$t4,$t5) = (localtime($time))[0,1,2,3,4,5];
my $tlime = timelocal($t0,$t1,$t2,$t3,$t4,$t5+1900);

print "$t0,$t1,$t2,$t3,$t4,$t5\n";
print "timestamp = $time\nlocaltime = $ltime\ntimelocal = $tlime\n";

my ($o0,$o1,$o2,$o3,$o4,$o5) = (localtime($time - (86400 * $offset)))[0,1,2,3,4,5];
my $daystart = timelocal(0,0,0,$o3,$o4,$o5+1900);
my $dayend = timelocal(59,59,23,$o3,$o4,$o5+1900);
print "oldday : start = $daystart, end = $dayend\n";

2008年6月14日 星期六

rename

記得初初轉用 windows, 最令我激氣就係唔可以一次過轉一推file o既名.
因為以前玩dailup bbs, 經常要轉一推 file o既 extension.
明明一句 rename *.xxx *.jpg 不知幾簡單, 去到 windows o既 file manager, 竟然完全唔知可以點做.

而家用 linux, 個 rename 就更好用, 好似用來加 sequence number 就真係一流.
假設我已經有 99 個 file, 由 goodpic01.jpg 到 goodpic99.jpg
只要行句 rename c c0 *
咁果 99 個 file 就會變成由 goodpic001.jpg 到 goodpic099.jpg, 非常方便.

SYNOPSIS : rename "from" "to" "file..."

可惜, 如果一開始d file 冇 extension(或者唔一樣), rename 係加唔倒野o係個尾度.
例如, 有 100 個 file, 由 file00 到 file99, 係唔可以用 rename 一次過將佢地改為 file00.txt 到 file99.txt
反而加o係前面又得喎, 好像行 rename '' test_ *
就可以將 file 名變成 test_file00 到 test_file99

2008年6月13日 星期五

用唔倒個 library

同事話唔知點整個 .so 來比佢個program call download 返來果個 library, 我唯有寫個簡單call test 做例子. 乜而家大學唔教呢d 架咩?

compile 個 .so 同個 test
g++ -shared -I../../C/FreeImage/Dist dyncall.cpp libfreeimage.a -o dyncall.so
gcc -O3 testcall.cpp dyncall.so -o testcall
-------------
dyncall.cpp

#include <stdio.h>
#include <FreeImage.h>

int dyncall();

main()
{
dyncall();
}

int dyncall()
{
bool fBigEndian;

fprintf(stderr,"test 1 : start\n");

fBigEndian = !FreeImage_IsLittleEndian();

FreeImage_Initialise();

fprintf(stderr,"test 2 : end\n");
}



calltest.cpp

#include <stdio.h>

int dyncall();

main()
{
dyncall();
}

test ldap server auth

無啦啦要 check 下個 ldap auth ok 唔 ok


#!/usr/bin/perl
#
# test ldap call
#
use Authen::Simple::LDAP;

my $ldap = Authen::Simple::LDAP->new(host => '192.168.0.1', basedn => 'ou=People,o=finance,dc=abc,dc=com') or die "$@";

if ($ldap->authenticate('test','ttpasswd'))
{
print "auth ok\n";
}
else
{
print "auth fail\n";
}

顯示時間值


#include <stdio.h>
#include <time.h>

main()
{
time_t now;
char *cnow;
struct tm *stime;
time_t nnow;
time_t mnow;
time_t daystart;

now = time(NULL);
printf("time(NULL) = %d\n",now);

cnow = ctime(&now);
printf("ctime(&now) = %s",cnow);

stime = localtime(&now);
printf("stime : tm_sec = %d, tm_min = %d, tm_hour = %d, tm_mday = %d, tm_mon = %d, tm_year = %d\n",stime->tm_sec,stime->tm_min,stime->tm_hour,stime->tm_mday,stime->tm_mon,stime->tm_year);

nnow = mktime(stime);
printf("nnow = %d\n",nnow);

stime->tm_hour = 0;
stime->tm_min = 0;
stime->tm_sec = 0;

mnow = mktime(stime);
printf("mnow = %d\n",mnow);
}

2008年6月12日 星期四

ascii

唔知點解, 總係有時會拿起手無 ascii table...


#include <stdio.h>

main()
{
int i;
int row = 3;

for(i=0; i<128; i++)
{
printf("%d (%c) ",i,i);
if (i % row == 2){printf("\n");}
}
printf("\n");

}

Hello World

呢個都應該係最多人寫過架喇. 作為第一篇, 甚有意思.


#include <stdio.h>

main()
{
printf("Hello World\n");
}