2009年4月30日 星期四

多工作業下的資料讀寫處理事項 - read()/write() 被 signal 中斷的處理

當 read() 或 write() 在處理資料時,若剛好產生了一個 signal ,系統為了要處理這個 signal ,便會中斷 read() 或 write() ,將程序狀態切換到 signal 的處理動作中。而當 signal 的處理動作結束後,再將程序狀態切換到 read() 或 write() 的後續處理動作。

在多工作業環境下, read()/write() 被系統中斷,將作業資源切換到其他工作狀態下的情形,是非常普遍的現象。中斷讀寫動作後再切換回去,想當然爾會關係到資料讀寫的完整性。因此切換回去後的後續處理動作,自然會影嚮資料讀取或寫入的完整性,但是在這一方面,各系統間卻有很大的差異存在,在 POSIX (*1) 中也未採取強制規範。

原文請參考這裡

2009年4月28日 星期二

建立儲存指標變數的陣列

建立一個儲存指標變數的陣列

第一步,若要建立一個儲存變數的陣列,可以用以下方式建立
int a[5];

int *a = new int[5];

int *a = malloc(5*sizeof(int));
以上這三個方式都可以。
給值的方式哩,就是
a[0]=0;

那麼要建立一個儲存指標變數的陣列,就可以以下方式建立啦
int *a[5];

int **a = new int*[5];

int **a = malloc(5*sizeof(int*));
給值的方式哩,就是
a[0] = new int(0);

耶,是不是一瞬間很難理解啊~花一點時間應該就可以想通啦~

透過qt寫入與讀取xml檔案

必需要注意的是,在每一個tag均不可以有空白存在,若有空白存在,雖然寫入不會出現問題,但是,在讀取時會出現錯誤,而xml檔案的好處就是可以儲存使用者的設定檔

寫入的範例程式
main.cpp

#include <qapplication.h>
#include <qdom.h>
#include <qfile.h>

int main(int argc,char **argv)
{
// 不顯示GUI
// renyang - 若使用這一行的話, 則不在X11也是可以執行,不會連到X服務器
QApplication app(argc,argv,false);

// 在程式中建立一個叫"IhuConfigXML"的xml檔
QDomDocument doc("IhuConfigXML");
// 建立一個在doc中的成員
QDomElement root = doc.createElement("renyang");
// 把root設定為doc目前的最後一個child
doc.appendChild(root);

// 建立一個在doc中的成員
QDomElement general = doc.createElement("general");

// 設定屬性
general.setAttribute("myName","fangrenyang");
general.setAttribute("height","168cm");
general.setAttribute("weight","70kg");

QDomElement family = doc.createElement("family");

family.setAttribute("grandemother",true);
family.setAttribute("father",true);
family.setAttribute("mother",true);
family.setAttribute("old_brother",true);
family.setAttribute("little_brother",true);

QDomElement education = doc.createElement("education");

education.setAttribute("primary_school",true);
education.setAttribute("secondary_school",true);
education.setAttribute("high_school",true);
education.setAttribute("university",true);
education.setAttribute("graduate_school",true);

// 設定general, family, education均為root的child
// 架構圖為
// doc--root--general
// --family
// --education
root.appendChild(general);
root.appendChild(family);
root.appendChild(education);

// 開啟檔案
QFile confFile("confFile.xml");
// 限定開啟檔案的權限
if (confFile.open(IO_WriteOnly))
{
// 建立一個QTextStream, 提供了基本的讀寫的功能
QTextStream ts(&confFile);
ts << doc.toString();
qDebug("create xml success!!");
confFile.close();
}
else
{
qDebug(QString("can't write config file %1 (%2)").arg("confFile.xml").arg(confFile.errorString()));
}

return 0;
}


讀取的範例程式
main.cpp
#include <qapplication.h>
#include <qfile.h>
#include <qdom.h>
#include <qstring.h>

int main(int argc,char **argv)
{
QApplication app(argc,argv,false);

// 用來記錄是否讀取xml檔案成功
bool ret = false;

QDomDocument doc("IhuConfigXML");

QString fileName("confFile.xml");

QFile confFile(fileName);

if (confFile.open(IO_ReadOnly))
{
// This function reads the XML document from the IO device dev
// 若xml內的tag有空白的話,那麼此時會出現錯誤
if (doc.setContent(&confFile))
{
// 設定文件標頭為一開始的最上層tag
QDomElement root = doc.documentElement();
if (root.tagName() == "renyang")
{
// 取得第一個child tage
QDomNode n = root.firstChild();
while (!n.isNull())
{
QDomElement e = n.toElement();
if (!e.isNull())
{
QString tagName = e.tagName();
if (tagName == "general")
{
qDebug(QString("myName: %1").arg(e.attribute("myName",QString(""))));
}
else if (tagName == "family")
{
// 這裡會找不到grandemother, 因為實際檔案中grandmother多打了一個e, 找不到就會回傳後面的預設值
qDebug(QString("grandmother: %1").arg(e.attribute("grandmother","99")));
}
else if (tagName == "education")
{
qDebug(QString("primary_school: %1").arg(e.attribute("primary_school","99")));
}
else
{
// do nothing
}
}
// 下一個tag
n = n.nextSibling();
}
ret = true;
}
else
{
qWarning(QString("Error: %1 is not a valid config file").arg("confFile.xml"));
}
confFile.close();
}
else
{
qWarning(QString("Error: error occurred while parsing %1").arg("confFile.xml"));
}
}
else
{
qWarning(QString("Error: can't read config file %1 (%2)").arg("confFile.xml").arg(confFile.errorString()));
}
return ret;
}

2009年4月27日 星期一

在debian下安裝nvidia驅動程式

參考資料:
Debian - NVIDIA drivers

debian - 光碟救援

因為grub的位置設定錯誤,所以必需要重新安裝grub的位置
這個時候,就要使用救援模式,很可惜的是,目前顯卡抓不到,先留下連結吧~

1. 先把Debian安裝光碟放到光碟機中,並且設定為光碟開機

2. 一開始進入光碟機畫面後,按enter

3. 然後,按alt + F2,會得到一個shell,也就是可以讓你輸入指令的地方

4. 在目前目錄下建立一個空目錄mnt
# mkdir mnt

5. 以我的電腦為例,我目前這一台電腦的debian的分割區是/dev/sda7,則先把它掛載起來
# mount /dev/sda7 mnt

6. 以剛剛掛載的目錄為系統的主要目錄
# chroot mnt
[註]嘿嘿,這個時候可以改這一個磁區root的密碼囉
# passwd root newpasswd

7. 噹噹,這個時候你使用的環境就好像是你直接由/dev/sda7開機,進入系統的環境是一樣的,然後,要重新安裝grub啦
# grub

8. 會變成以下的指令畫面
grub>

9. 透過以下命令之後會顯示 (hdx,y),其中x、y就是你的啟動菜單的位置了。
grub> find /boot/grub/stage1

10. 下面的指令是表示以(hdx,y)分割區為主要的grub選單來源
grub> root (hdx,y)

11. 下面這一個指令呢,是把上面的指定選定的grub安裝在(hda,b)上
grub> setup (hda,b)

參考資料:
用 Debian 安裝盤修復 Grub , 及 掛載本地硬盤 的 方法
Debian 套件管理系統

安裝anca-0.9.1

因為我的電腦有qt3與qt4, 因此要設定qt3的路徑, 否則它有可能會找到Qt4

$ ./configure --with-qt-dir=/usr/share/qt3

一開始要編譯會出現問題,會缺少某一些套件

$ sudo apt-get install libpt-dev libopenh323-dev

好不容易,configure都過了,這就表示我們需要編譯的相關套件都有了。

好啦,可以開始make了吧~

噹噹,馬上出現問題。

說什麼找不到aclocal-1.7與automake-1.7
但是,我的電腦有aclocal與automake啊~
一定要那一個版本嗎?

使用以下的指令就可以解決

$ sudo cp /usr/bin/aclocal /usr/bin/aclocal-1.7
$ sudo cp /usr/bin/automake /usr/bin/automake-1.7

這個時候再去make
基本上沒有問題啦~
錯,哪有這麼順利,出現以下的錯誤啦~
yuv2rgb.cpp:131: error: lvalue required as left operand of assignment
yuv2rgb.cpp:135: error: lvalue required as left operand of assignment
yuv2rgb.cpp:139: error: lvalue required as left operand of assignment

進入程式碼中,131行原本是如下
c_this->y_buffer = (uint8_t *)c_this->y_chunk = 0;
把它改成如下
c_this->y_chunk = 0;
c_this->y_buffer = (uint8_t *)c_this->y_chunk;

其它的依些類推

再make一次
好啦,849這一行也有一樣的問題啦
原本是如下這一行
(uint8_t *)c_this->table_rV[i] += c_this->entry_size*(gamma - c_this->gamma);
把它改成
c_this->table_rV[i] = (uint8_t *)c_this->table_rV[i] + c_this->entry_size*(gamma - c_this->gamma);

參考資料:
SourceForge.net

C/C++ - getenv()

char * getenv ( const char * name );
可以取得環境變數的值。

#include <stdio.h>
#include <stdlib.h>

int main ()
{
char * pPath;
pPath = getenv ("PATH");
if (pPath!=NULL)
printf ("The current path is: %s",pPath);
return 0;
}


參考資料:
getenv

2009年4月26日 星期日

netstat 指令

netstat:顯示TCP/IP網路連線與每一種協定的統計資料,如:有多少人使用telnet 或ftp進入系統。

netstat -a:顯示所有連線中與等待連線的Socket狀態

netstat -e:以網路配接卡分類顯示目前的網路狀態

netstat -n:顯示網路狀態時,以數字顯示位址

netstat -o:顯示每個連線所擁有的處理程序ID

netstat -s:以協定分類顯示網路使用的統計

netstat -p protocol:顯示某protocol的狀態,如TCP、IP

netstat -r:顯示 route table 的內容

netstat [interval]:每隔interval就重新整理網路狀態的畫面。

要查看 port 被使用, 使用 netstat 即可.
$ netstat -tunl

t: tcp, u:udp, n: don't resolve names, l: listening
但要查看 port 被那隻程式, 就要使用 lsof,
$ lsof -i

$ netstat -antp
也同樣能看出是哪隻程式佔用著 port.

[2009.06.13 補充]
最近開skype啊,因為skype可以線上收尋,所以會有很多援交之類的問你人在哪裡,要不要援之類的,很可惜的是,這一些大部分都是詐騙,一開始第一句話是問你要不要援,奇怪了,你還不知道我在哪裡,就問我要不要援,這不會太奇怪了嗎?
然後,第二點你就說你住哪裡,通常他就會說他住哪裡!
我住台南,你就住台南;我住台北,你就住台北,會不會太剛好啦~

因此呢,還好skype與msn均是p2p的軟體,所以,你跟他通訊,可以得知道方的ip,再到網路上查ip,可以查到大概在哪一個位置,現在就是要補充這一個東西。

這次我們就以skype為例吧:
1. 先由工作管理員得知,skype的pid(process id)是多少?預設在工作管理員是不會顯示pid的,那我們就要先把他打開

得知skype的pid是2576

2. 到「命令提示字元」輸入
$ netstat -ano
可以顯示目前所有的port是由哪一個pid所占用,配起來就可以知道你目前是跟你在通話的是哪一個ip address啦~


220.133.96.106
就是對方的ip啦~

3. 然後再到查ip位置的網頁,輸入剛剛查到的ip
Geotool

參考資料:
如何查出佔用連接埠(port)的程式(程序)

speex的相關函式

初始化一個編碼器
void *speex_encoder_init(const SpeexMode *mode);

類似ioctl,直接對底層要求服務
int speex_encoder_ctl(void *state, int request, void *ptr);
SPEEX_SET_COMPLEXITY // 設定編碼複雜度
SPEEX_SET_VBR // 設定VBR是否要開啟

目前mp3有三種壓縮演算法:

CBR (固定位元率) : 鎖定一個固定位元率來編碼,檔案容量最大。(320kbps的CBR,為目前mp3最高音質,但檔案也是最大。)

VBR (變動位元率) : 在保持音質的前提下,會自動依聲音複雜程度來加強或減少資料流量。如:在檔案無聲的部份,減少流量;在大動態或大編制的場景,則增加流量。可在最小音質破壞的限度內,達到節省空間的目的,流量上下限也可以設定。

ABR (平均位元率):由LAME發展,介於CBR與VBR之間的一種模式,基本上就是以CBR的演算法去做VBR的工作。簡單的分別就是,VBR可設定流量的上下限,而ABR可再多加設定流量平均值(中間值)。

不懂的話沒關係,反正普遍情況是這樣的:

音質:CBR > VBR → ABR

192 kbps以下的CBR,與後兩者無明顯差異,但檔案容量差很多,建議有心要壓CBR就直接衝高流量!

檔案大小:CBR → VBR & ABR

後兩者隨參數設定而有差別,大致上差不了多少

參考資料:
MP3基本介紹與LAME設定
您的聲音工具分貝 ( dB ) 知多少?

用來記錄音訊的project

這兩個部分均在IHU裡面的程式碼中看到的

Advanced Linux Sound Architecture (ALSA) project homepage

JACK

目前大概知道如何使用就好,那不是我的目前的重點

C/C++ - 同時宣告兩個指標變數

同時宣告兩個指標變數,常會有人搞錯,我也不例外,因此,把它記錄在這裡吧~

#include <stdio>

int main(int argc,char **argv)
{
// 如下宣告, 則只有a是指標變數, 而b是一般的變數
int* a,b;

// 只有如下這兩宣告, 才是兩個都是指標
int *val,*x;

return 0;
}


參考資料:
C Gossip: 指標與記憶體位址

2009年4月25日 星期六

C/C++ - signal

這裡介紹如何使用訊號~
所謂的訊號就是把一個副程式註冊到系統中,當此程式接收到某一個特定的訊號時,會執行相對應的副程式。

在signal.h有定義所有的特定訊號
SIGHUP 1 /* hangup */
SIGINT 2 /* interrupt */
SIGQUIT 3 /* quit */
SIGILL 4 /* illegal instruction */
SIGABRT 6 /* used by abort */
SIGKILL 9 /* hard kill */
SIGALRM 14 /* alarm clock */
SIGCONT 19 /* continue a stopped process */
SIGCHLD 20 /* to parent on child stop or exit */

這裡介紹兩個例子:
SIGHUP:
main.c

#include <stdio.h>
#include <signal.h>

void exithandle(int sig)
{
printf("signal id=%d received\n",sig);
}

int main(int argc,char **argv)
{
// 註冊使得當此程式收到HUP的訊號時, 會執行exithandle的函式
signal(SIGHUP,exithandle);
pause();
printf("I want to leave\n");
return 0;
}

操作方式:
執行方式

先編譯程式
$ make

執行程式
$ ./main

得知目前這一個程式的process id
$ ps -u
可以尋找到目前這一個執行程式的process id

$ kill -1 pid

對目前這一個process id送出HUP訊號

就會印出目前所設定當收到HUP訊號時要執行的副程式

SIGINT:
main.c
#include <stdio.h>
#include <signal.h>

void exithandle(int sig)
{
printf("signal id=%d received\n",sig);
}

int main(int argc,char **argv)
{
// 註冊使得當此程式收到INT(ctrl+c)的訊號時, 會執行exithandle的函式
signal(SIGINT,exithandle);
pause();
printf("I want to leave\n");
return 0;
}

操作方式:
執行方式

先編譯程式
$ make

執行程式
$ ./main

當按Ctrl+c
會被系統抓到這一個訊號

參考資料:
怎樣抓獲或忽略像 control-C 這樣的鍵盤中斷?
IPC:Interrupts and Signals

2009年4月22日 星期三

wireshark - ethereal - 網路封包分析工具

凡是研究網路的人,基本是都會用到ethereal。
因為,它實在是太好用了。
它可以把網路上最基本的單位packet都抓下來。
並且可以分析這一些封包。
是非常實用的軟體。

在ubuntu下安裝的話,實在是因為apt,所以變的太簡單啦~
$ sudo apt-get install ethereal

以下有一些教學、說明網站可以參考看看
wireshark官網
網路封包分析的好幫手—Wireshark 擷取分析、防範攻擊無所不包
Wireshark 教學
網路流量的錄製與重播
Ethereal 和 StarDict
Ethereal

[觀念]由 Peer to Peer 觀念來看視訊會議系統

這一篇文章說明如何透過Peer to Peer來傳送視訊...
應該是蠻有幫助的。

先前說到 Peer to Peer 的連線方式
當 Peer To Peer 完成連線之後
我們來探討由 PC Cam 所取得的影像資料, 如何來實作網路視訊會議系統

A Win ClientSocket --------------------- B Win ServerSocket
A Win ServerSocket --------------------- B Win ClientSocket

話說由 PC Cam 擷取資料這個元件, 由於涉及技術面
所以原 VCL 設計者要求付費來購買此元件, 所以我花了些許美金購得此元件
在由 USB PC Cam 抓取資料後, 通常會給你的是單一點陣圖檔 BMP 格式
而大家都知道 BMP 格式動不動就要 20KBytes 以上, 這樣的速率在網路上
尤其是對撥接用戶 56K 若每五到六秒才一格畫面 甚至是十秒.. 一定非常的難受
所以在抓取到 BMP 格式的影像後, 我們透過了壓縮, 或是轉換成 JPEG 的方式來達成
我發現, 當轉換到 JPEG 後.. 影像檔可以縮小為 2~3K Bytes .. 這是多麼大的差距
2~3K Bytes 56K Modem 就可以在一秒內送出及接收
ok .. 解決了圖檔的大小 size 問題了 .. 大家不僅心中還有許多疑問
因為箇中道理繁雜, 待小弟往後再慢慢為各位回答, 今天只勾起大家的觀念, 設計潛力為
主軸, ok .. 我們往下講

而然 A Win 及 B Win 的程式上各有一個可以支援 JPEG 秀圖的 Image 元件
當任何一端的 ServerSocket 收到資料 .. 再完成檢查工作
(所謂的檢查工作就是檢查 JPEG 的檔頭及檔尾, 確定是一份完整 JPEG 圖檔)
就可以把所接收的資料不管是存在 File 也好 .. 存成 Stream 也好
秀在 Image 元件中 .. 你可以使用 Image 的函式 LoadToFile 或 LoadToStream
都可以完成秀圖 ...
然後再送出一個確認字串, 由 ClientSocket 傳送給遠端
讓另一端知道你確認收到了他的影像
為什麼要這樣做呢 ? 何不就一直接收對方的影像就好
還得送出確認封包 ?? 這是什麼道理 ??
呵呵 ... 我們大家都知道, 網路連線的環境 .. 不是非常通達的 ..
今天一值狂丟資料到對方 Socket ... 難免會有 Buffer 溢滿的情況發生
導致資料不完整或是 lost ... 而且每個 Client 連線環境都不一樣
有人使用 56K 撥接, 更有 33.6K Modem .. 及一些 ADSL 用戶, 甚至有網咖連上來的專線
使用者 ... 企業固網等等 ....
那麼你怎麼知道要抓取什麼樣的 Timer 傳送目前影像呢 ?
抓取影像的時機為何 ?
答案很簡單 .. 就是當收到對方確認封包後 !!!!
呵呵 ~~ A Win 今天抓了一個即時影像給 B Win (可能過了一秒甚至更快)
A Win 這時就等待 B Win 的命令, 抓取下一個即時影像, 所以 A Win ← 等待
而當 B Win 收到了 A Win 的影像.. 確認已經丟到了 Image 讓使用者看到對方後
即傳送確認封包給 A Win, 請 A Win 再送影像(可能過了一秒甚至更快)
而當 A Win 收到 B Win 確認的封包 (真好, B Win 已經收到囉)
就立即再抓取 PC Cam 的影像資料傳送給 B Win ... 然後 A Win ← 又等待
而當 B Win 收到了 A Win 的影像.. 確認已經丟到了 Image 讓使用者看到對方後
即傳送確認封包給 A Win, 請 A Win 再送影像(可能過了一秒甚至更快)
而當 A Win 收到 B Win 確認的封包 (真好, B Win 已經收到囉)
就立即再抓取 PC Cam 的影像資料傳送給 B Win ... 然後 A Win ← 又等待

如此 ..... 是不是就完成了整個連線, 而且連抓資料的時機都有了
不怕網路塞車所照成的 Buffer 溢滿問題
不管如何, 也都能夠確定對方收到與否 ...
這時一定有人想 .. 那若真的某個影像 B Win 沒接收到, 而 A Win 又再等待 B Win
回應的話怎麼辦 ?
所以我們要設一個 Time Out 值囉 .. 再 B Win 15 秒內若都沒收到 A Win 的影像
就是 Time Out ... 所以就再傳送一個確認封包給 A Win
A Win ← 本身不用理會是不是 Time Out .. 反正收到確認封包就再丟一個目前影像
如此也就解決了久久收不到影像的問題了
不過據本人實務經驗, Time Out 會發生的可能性超小
因為大家要知道 TCP/IP 會追蹤封包狀態, 若是有些錯誤 WinSock 都會再幕後重送封包
這部分就交給 WinSock 處理吧 ..
除非您使用的是 UDP 所謂送後不理的通訊協定
否則一般 TCP/IP 接收不到導致 Time Out 的機率視微乎其微

參考資料:
<socket> 由 Peer to Peer 觀念來看視訊會議系統

2009年4月21日 星期二

特殊符號

這一篇文章就收集特別的符號吧~方便blog使用~
↙←↑→↗↓↖↘

sctp在ubuntu7.10與8.04不同的地方

今天意外的發現一些在ubuntu下,因版本不同,而關鍵字也會有不同的情況。
因為學長寫的程式環境在ubuntu 6.06下寫的,所以,基本上應該在ubuntu 6.06下是最穩定的。
但是,我在ubuntu 7.10下還是可以跑。

但是,因為ubuntu 6.06 - ubuntu 7.10快要沒有更新了,而8.04有三年的維護期間,因此,我基本上都是在ubuntu 8.04下寫sctp程式。

1. 在ubuntu 8.04下寫的程式,沒有辦法server端在ip分享器外,client端在ip分享器內。因此,以後的程式都必需要在ubuntu 7.10的環境下設置了。

目前先列出一些不一樣的地方。

==我是分格線==我是分格線==我是分格線==我是分格線==我是分格線==
SCTP_ADAPTION_INDICATION→SCTP_ADAPTATION_INDICATION
sctp_adaption_indication→sctp_adaptation_indication
struct sctp_prim→struct sctp_setprim
struct sctp_peerprim→struct sctp_setpeerprim

(null)→SCTP_ADDR_CONFIRMED:表示本來沒有,最後變成有這一個.其實在kernel的部分還是有的,只是在header的部分沒有寫出來必需要到
/usr/include/netinet/sctp.h修改,修改如下:
原本:

        SCTP_ADDR_MADE_PRIM,
};
修改:
SCTP_ADDR_MADE_PRIM,
SCTP_ADDR_CONFIRMED,
};

Linux - xxd指令

以下是我在學長的程式碼中找到他們把圖片嵌入在程式中,
而我不知道如何產生嵌入在程式碼中的圖片碼是怎麼來的,只好ptt的C_AND_CPP版去求救了。

==過程如下==過程如下==過程如下==過程如下==過程如下==過程如下==過程如下==
看起來你要的應該只是單純的把壓縮過的 png binary data 寫成陣列的形式
那很簡單...

$ xxd -i pic.png > pic.c

xxd 是 linux 下的指令
windows 上你裝 vim 它會附送 windows 版的 xxd 給你用

若要產生嵌在程式碼中的圖片,關鍵字
fromMimeSource
QMimeSourceFactory
有空再去查…

2009年4月20日 星期一

工作狂太賣命 拚400萬換2腫瘤

應該好好想一想,進入現在沒有錢可以賺的科技業是不是一個好的選擇,
喜歡玩電腦與爆肝寫程式,應該是兩回事吧~
但是,我覺得人是要努力,但是,不可以過勞~
努力是為了讓人生沒有白活,多見識可以給以後的小朋友一個正確的見意!
正確的抉擇常常是在錯誤中學得的,但是,所學得的知識可以減少錯誤的產生。
=========================================================

「400萬換2顆腫瘤,人生別太賣命!」

這句話是曾經連續3年、每天工作19小時、才32歲就與癌症閃身而過的藝能界工作狂張杰倫,給上班族的警語。

實踐大學服裝設計系畢業,曾幫歌手江蕙、張清芳、黃立行等人企劃唱片,身兼模特兒、DJ、作家、健身教練、經紀顧問、多媒體創意人的張杰倫,退伍後每天工作14至16小時,為了拉生意,還一口氣喝乾一瓶紅酒,連膽汁都吐出。努力工作,讓他在30歲前,賺進人生第一桶金。

1999年他將200萬積蓄投進香港股市遇上股災,全數泡湯,另負債達400萬。為了償還債務,3年間,他狂接活動主持、外稿、明星書總編輯、拍八點檔連續劇和廣告,一天趕場工作19小時,睡不到3小時,健康亮起紅燈。

6年前,張杰倫發現脖子有硬物感壓迫、常感疲勞,竟在短短8個月,頸椎火速爆出2顆腫瘤,其中一顆長達8公分,被診斷為零期癌。噩耗襲來,人生慘跌谷底。

在手術房和死神交戰8小時切除腫瘤後,所幸未再復發。擁有健美、運動等4張教練執照的他,立志將瀕臨「過勞死」的經歷,提供世人警惕,逢人便教上班族以身邊30幾種物品健身。

他說,從早上刷牙到就寢前,都能運動,連開會、坐辦公桌,都能同步進行減壓操。配合吸氣、吐氣,毛巾、皮帶、公事包、報紙、iPod、筆記本、馬克杯、電話、鉛筆、桌子、椅子、水瓶、手機、筆記型電腦、旅行箱,就是舒肩、舒頸、舒腿、舒手、舒胸最好的輔具。

睡對時間、吃對東西、做對運動、找對醫師、有一份信仰,是張杰倫悟出擁有健康的5大要點。他指出,晚上10點至凌晨2點,是肝脛脾造血黃金時間,「睡對時間」佔了70%健康比例,像經營之神王永慶能活到92歲,就是早睡早起養生好範例。而日本上班族現在最流行晚上9點睡、3點起床的「晨型人」,以抵抗「過勞症候群」。

自嘲為「瘤帥」的張杰倫,如今自許「賺每一分錢都要健康快樂!」有感於當年腫瘤位置接近淋巴,稍有閃失即可能半身不遂,甚至變成植物人,今年初,他撰寫出版「上班族防過勞運動寶典一○一」一書,版稅收入扣除成本,全數捐贈中華民國腦性麻痺協會,希望以撿回的命救更多的人。

Qt - QSettings類別

這一個像是在記錄應用程式設定值的類別,常常有應用程式在第一次執行程式之後,會要求使用者設定一些參數值,而這一個類別像是用來記錄這一些參數值。

QString QSettings::readEntry(const QString & key, const QString & def = QString::null, bool * ok = 0)

透過key讀取特定的值,回傳一個QString,或是一個default value,若找不到此值對應的value,則以default value為相對應此key的值,並且回傳回來。若不能被讀取且ok又不是一個null pointer則會回傳TRUE,否則為FALSE

bool QSettings::writeEntry ( const QString & key, const QString & value )
把value的值寫入相對應的key中,若失敗的話,會回傳false,若成功的話,會回傳true

QStringList QSettings::entryList ( const QString & key ) const
列出所有目錄下的成員,例:
/MyCompany/MyApplication/background color
/MyCompany/MyApplication/foreground color
/MyCompany/MyApplication/geometry/x
/MyCompany/MyApplication/geometry/y
/MyCompany/MyApplication/geometry/width
/MyCompany/MyApplication/geometry/height
若key為"/MyCompany/MyApplication"

/MyCompany/MyApplication/background color
/MyCompany/MyApplication/foreground color
會被收集起來,而子目錄下的並不會被收集起來,換句話說,只會收集當前目錄下的成員。

main.cpp

#include <qsettings.h>
#include <qapplication.h>
#include <qstringlist.h>

int main(int argc,char **argv)
{
QApplication app(argc,argv);

bool gui=false;
bool ret=false;
int width = 88;
QString bgColor;
QStringList keys;
QValueList <QSettings>::iterator it; // 用來放QSettings的容器

QSettings settings;
// settings.insertSearchPath(QSettings::Windows,"MyCompany");
// No search path needed for Unix; see notes further on.
// Use default values if the keys don't exist

// 可以把後面的數值寫到settings的這一個key項目中
// 1. 設定第一個項目"/MyApplication/geometry/width"

settings.writeEntry("/MyApplication/geometry/width",width);

// 讀取相對應的key,且讀出來的是字串型態
// 2. 因之前沒有設定過,所以目前是設定第二個項目"/MyApplication/background color"
// 字串的部分一直轉換!!失敗!!,所以在search時,也不會找到這一個key

bgColor = settings.readEntry("/MyApplication/background color","white",&ret);
if (!ret)
qDebug("1. transfer error");

// 若沒有找到則以後面的default value設定"MyApplication/geometry/width"為相對應的值,並回傳回來
// 以下的例子,若之前沒有設定"MyApplication/geometry/width"的相對應的值
// 則"MyApplication/geoetry/width"會被設定為640

width = settings.readNumEntry("/MyApplication/geometry/width",640,&ret);

qDebug("%d",settings.readNumEntry("/MyApplication/geometry/width",55,&ret));

keys = settings.entryList("/MyApplication/geometry");

qDebug("%d",keys.count());

return gui?app.exec():0;
}

QPixmap::fromMimeSource

然後,在程式碼中有看到QPixmap::fromMimeSource( "mic.png" )
但是,確找不到定義在哪裡,真是奇怪啊~

找不到QPixmap::fromMimeSource(char *)啊?

原來是在比較新的官方說明網頁才會有啊~

QImage - loadFromData

我們之前都是把圖片放到放在目錄中,等到需要時才去讀取,如此一來的優點是圖片方便改寫,當你想換一個圖片時,不需要修改程式碼,只要直接換圖片就好了。不過,其缺點就是圖片可能在傳遞的過程中,可能會遺失,或是系統不支援此圖片的格式。0

在之前的學長的程式中,我發現另一個方式,把圖片以陣列的方式儲存圖片,而用這一個方式的優點是圖片比較不會遺失,而缺點就是當你要修改圖片時,必需要動到程式碼。

在Qt的類別中QImage有一個function
bool QImage::loadFromData ( const uchar * buf, uint len, const char * format = 0 )
可以把陣列中的資料讀取成為圖片的型式顯示出來
例:

static const unsigned char image_14_data[] = {
0x00,0x00,0x04,0x00,0x78,0x9c,0x63,0x60,0x18,0x8c,0xa0,0xe1,0x3f,0x26,
0x26,0x45,0xef,0x7f,0x2c,0x98,0x18,0x33,0x70,0xe9,0x25,0xc6,0x0c,0x42,
0x7a,0x09,0x99,0x31,0xd2,0xf5,0x53,0x1a,0xfe,0x84,0xcc,0x20,0x35,0x0d,
0x91,0x9b,0xfe,0x86,0x16,0x00,0x00,0x3f,0xb7,0xb3,0x5b
};
QImage img;
img.loadFromData( image_14_data, sizeof( image_14_data ), "PNG" );


目前還不知道那一個image_14_data[]是怎麼轉換出來的,還在找資料當中(尋問ptt的高手)...
請參考Linux - xxd指令

2009年4月17日 星期五

NIST - 網路模擬器

NIST Net is a network emulation package that runs on Linux. NIST Net allows a single Linux PC set up as a router to emulate a wide variety of network conditions

這是一個在Linux上的網路模擬器,可以模擬封包的傳送,就如上所說的,可以用一台電腦模擬網路上的各種情況

以下是擷取網路上的資料,實際上是還沒有測試過:
NistNet是一款基於Linux系統能夠動態即時仿真IP網路環境的開源工具,它可實現端到端網路中那些關鍵性能,例如延遲、抖動、丟包等多種複雜的網路環境的類比,為那些對於網路環境較為敏感的應用提供了便利的測試方法。

NistNet是做為Linux內核的一個可動態載入的模組來實現的。它用圖形用戶介面和命令行介面兩種使用形勢。

下面介紹如何配置、編譯、安裝、使用NistNet。

1) 下載NistNet原始檔案。
Sourforge和Nist的項目主頁都提供NistNet的源碼下載。
http://snad.ncsl.nist.gov/nistnet/
http://sourceforge.net/projects/nistnet/
下載nistnet.2.0.12b.tar.gz壓縮包
並在一台運行Linux的主機上解壓縮此檔。
2) 配置
運行解壓縮目錄下的configure命令。
3) 編譯
Configure如果無誤,即可運行make命令進行編譯。
4) 安裝
編譯後,運行Make install進行安裝。
5) 使用
$ ./Load.Nistnet
此命令可以載入NistNet到內核
然後可以通過
cnistnet或者xnistnet啟動NistNet工具。
例:為源IP為192.168.1.203:5060目的IP為192.168.100.156:5060的UDP流量增加10%丟包率,並且增加1s的延時。
執行下序命令:
$ ./Load.NistNet
$ cnistnet -u
$ cnistnet –a 192.168.1.203:5060 192.168.100.156:5060 --drop 10 --delay 1000


注:使用此功能之前要使能Linux系統的路由功能,以便能夠跨網段轉發
使能Linux路由功能的命令是
$ echo 1 < /proc/sys/net/ipv4/ip_forward
查看路由功能是否啟動的命令是
$ cat /proc/sys/net/ipv4/ip_forward
如果終端顯示‘1’則表明路由功能啟動成功,如果顯示‘0’則表示路由沒有成功啟動

參考資料:
用NistNet模仿網路環境
NIST Net Home Page

2009年4月16日 星期四

Ubuntu上的一些相關檔案或目錄的路徑

本來這一篇文章只是要記錄Ubuntu下垃圾桶的路徑,但是,覺得這樣實在是太虛了,所以,標題就改成現在這個樣子啦~資料以後會陸續增加啦~

Ubuntu - 資源回收桶的路徑
存在/home/$USER/.local/share/Trash裡面 並且分為files跟info info裡儲存的是檔案的原始路徑跟刪除的時間

2009年4月15日 星期三

C/C++ - strtok

這是一個可以分析字串的指令,但是,我記得我之前好像也有記錄一個指令可以分析字串的,現在找不到啦~
請參考getopt - getopt_long - 命令行參數的分析

char * strtok ( char * str, const char * delimiters );

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}


參考資料:
strtok - C++ Reference

linux指令 - xargs

$ xargs [-0epn] command
參數:
-0 :如果輸入的 stdin 含有特殊字元,例如 `, \, 空白鍵等等字元時,這個 -0 參數
可以將他還原成一般字元。這個參數可以用於特殊狀態喔!
-e :這個是 EOF (end of file) 的意思。後面可以接一個字串,當 xargs 分析到
這個字串時,就會停止繼續工作!
-p :在執行每個指令的 argument 時,都會詢問使用者的意思;
-n :後面接次數,每次 command 指令執行時,要使用幾個參數的意思。看範例三。
當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔!


這一個指令的好處在於,並不是每一個指令均可以使用管線命令,而透過xargs就可以讓這一些不支援管線命令的程式,可以使用前一個指令完成之後的結果。
例如鳥哥舉的一個例子:

找出 /sbin 底下具有特殊權限的檔名,並使用 ls -l 列出詳細屬性
$ find /sbin -perm +7000 | ls -l
# 結果竟然僅有列出目前所在目錄下的檔案!這不是我們要的!
# 因為 ll (ls) 並不是管線命令的原因啊!


$ find /sbin -perm +7000 | xargs ls -l
-rwsr-xr-x 1 root root 70420 May 25 2008 /sbin/mount.nfs
-rwsr-xr-x 1 root root 70424 May 25 2008 /sbin/mount.nfs4
-rwxr-sr-x 1 root root 5920 Jun 15 2008 /sbin/netreport
....(底下省略)....


但是,若管線前面沒有資料送過來,後面的指令會因為沒有參數可以執行,會出現錯誤。
這個時候,就要使用--no-run-if-empty參數啦~
例:
$ find -iname "*.bak" | xargs --no-run-if-empty rm

$ find -iname "*.bak" | xargs -i cp {} ~/bakdir
使用 -i 和 {} 就可以把前面所得到的輸出列表,不是一整串,而是一個一個地傳給後面的指令
上述的指令的效果就像是這樣…

參考資料:
鳥哥的私房菜
xargs應用介紹

linux指令 - sed

sed的這一個指令真的很好用,它可以用來對檔案進行分析,並且可以以行為單位進行刪除,取代,新增,插入,列印的動作,真的非常好用,跟awk一樣非常好用~
find, grep, awk, sed這四個均列為非常好用的程式。
先列出鳥哥的網頁的部分資料吧~

$ sed [-nefr] [動作]
參數:
-n  :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 
的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過
sed 特殊處理的那一行(或者動作)才會被列出來。
-e  :直接在指令列模式上進行 sed 的動作編輯;
-f  :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 
sed 動作;
-r  :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i  :直接修改讀取的檔案內容,而不是由螢幕輸出。

動作說明:  [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作
是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

function 有底下這些咚咚:
a   :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c   :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d   :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
i   :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p   :列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
s   :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配
正規表示法!例如 1,20s/old/new/g 就是啦!


目前剛好要用到,大量取代的功能~而且是多個資料夾內的大量資料,因此,就先拿一些小檔案來開刀啦~
案例1:
之前在寫Makefile時,除了clean與另一個我就是寫clean_target,但是,最近覺得還是寫distclean會比較好,那就用以下的指令啦~
$ find . -name Makefile -exec sed -i 's/clean_target/distclean/g' {} \;
噹噹,不到10秒就完成了二十個檔案以上的修改啦~

$ cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d
以上這一個指令是把man.config的檔案內含有MAN的行取出,並且移除掉以#為開頭的註解,並且把一整行都是空白的部份刪掉,除了最後一個sed的指令是指把一整行都是空白的部分刪掉不懂之外,其它部分都懂哩!然後,用man查了一下sed發現原來有這一個語法,如下:
       /regexp/
Match lines matching the regular expression regexp.

所以
$ sed '/^$/d' file
是表示把在file檔案內的空白行刪除

[2009.11.24 補充]
在Windows下使用sed(安裝GnuWin32)時要注意的是,當我們在Linux下使用sed時,是使用'(單引號)當作分隔鍵,而在winodws下則必需要使用"(雙引號)當作分隔鍵;本文章以下的內容都是使用linux的表示方式,若要在windows下使用的話,請自動把單引號轉換為雙引號

以下是把當前目錄的所有文字檔內的內容含有Caspar-comment這一個字串的這一行全部刪掉
% sed -i '/.*Caspar-comment.*/d' *

[2009.12.07 補充]
上面的使用方式,也會掃到資料夾,所以,會出現錯誤訊息,這個時候呢?用find可以達到指針對檔案作動作
% find . -type f | grep -v svn | xargs -i sed -i '/.*Caspar-comment.*/d' {}

[2010.01.01 補充]
同時對多個檔案,加入多個取代的字串
例:把first.txt與second.txt內的內容,同時把a轉換為A且把b轉換為B
% sed -e 's/a/A/g' -e 's/b/B/g' first.txt second.txt

[2010.09.22 補充]
把目前資料夾(包含子目錄)下的所有檔案,每一行的檔案最後多餘的空白移除掉~
% find . -type f | grep -v svn | grep .c$ | xargs -i sed -i 's/ \+$//g' {}

[2010.12.16 補充]把test.txt檔案內符合ValueString這一個字串的整行刪掉,且不區分大小寫
% sed -i '/^ValueString$/Id' test.txt

[2010.12.19 補充]
在Windows下使用sed(GnuWin32)時,若有使用-i這一個參數,會多出一個sed開頭並且亂數結尾的備份檔案,目前還找不到方法可以不要產生這一個備份檔案。所以,只好用另一個方法達成。
sed -i '/^ValueString$/Id' test.txt>temp_test.txt
move /Y temp_test.txt test.txt

若直接使用以下的方法,會產生空白檔案!我也不知道為什麼會這樣!
sed -i '/^ValueString$/Id' test.txt>test.txt

[2010.12.28 補充]
刪除完美符合CPT_*的字串
sed.exe "/^CPT_\*$/Id" test.txt
目前已知的特殊字元
&, ^, $, *,

[2014.07.08 補充]
sed -i '$ a\插入字符串' datafile

參考資料:
鳥哥的Linux私房菜
linux sed命令技巧
正規表示式的入門與應用(二)

在ubnutn下用root權限執行程式的快速鍵

在ubuntu下按以下快捷鍵,可以透過root的權限執行程式
alt + F2
雖然說對我常用文字指令的人來說沒有差,
但是還是記錄一下,當作備份吧~

2009年4月14日 星期二

linphone

Linphone is an internet phone or Voice Over IP phone (VoIP).

* With linphone you can communicate freely with people over the internet, with voice, video, and text instant messaging.
* Linphone complies to the SIP protocol, an open standart for internet telephony. Linphone should be able to interoperate with most SIP-compatible phones and proxies.
* If you subscribe a VoIP to PSTN (=classic telephony) account to a telecom provider, you can reach everyone that has a "classic" phone line. However those calls are not free since PSTN networks are costly.
* linphone is free-software (or open-source), you can download and redistribute it freely.
* linphone works under Linux and Windows XP

好像是一個不錯的東西,還可以在windows xp上跑哩~

還沒有安裝完成,但是,至少有下面幾個套件需要安裝
sudo apt-get install libsdl1.2-dev
sudo apt-get install libexosip2-dev
sudo apt-get install libosip2-dev
sudo apt-get install libglade2-dev
sudo apt-get install intltool

linphone主網頁

2009年4月13日 星期一

Office - 修訂和註解

就好像寫程式一樣,最好有一個系統可以記錄你修改過什麼東西,這就是office內的修訂的功能。可能在寫論文的時候用的到喔~

而不需要進入副程式trace就可以知道這一個副程式在做什麼,這就是office內的註解功能。

這裡要稍微說明一下如何建立移除隱藏修訂」和「註解」功能。

建立

1. 開啟「修訂」的功能

工具」-「追蹤修訂

噹噹~這樣就可以開啟「修訂」的功能啦,要注意的是,受影響的單位為一個文件,若開啟之後,你整個文件的修改過程都會被記錄下來

2. 插入「註解」

把滑鼠游標移到你想插入註解的地方,或是框選你要註解的文字

插入」-「註解

這樣就出現一個註解啦,而一個文件可以很多個註解


隱藏

當你建立許多「註解」和開啟了「追踨修訂」,整個畫面一定會很亂,如何把它「暫時」隱藏哩?

檢視」-「標記

永久刪除

1. 「註解」的部分,直接在註解的部分按右鍵,點選「刪除註解」

2. 「追踨修訂」的部分,比較複雜,請照下列步驟進行

a. 在 [檢視] 功能表上,將游標指向 [工具列],再按一下 [檢閱]。
b. 在 [檢閱] 工具列上,按一下 [顯示],然後確認下列每一個項目旁邊都有出現一個核取符號:
[註解]

[筆跡標註] (僅適用於 Word 2003)

[插入與刪除]

[設定格式]

[檢閱者] (將游標指向 [檢閱者],並確認 [所有檢閱者] 處於選取狀態)

如果上述某個項目旁邊沒有出現核取符號,請按一下該項目,將其選取起來。

c. 在 [檢閱] 工具列上,按一下 [下一個],即可從目前的修訂或註解移至下一個。
d. 在 [檢閱] 工具列上,針對每一個修訂或註解按一下 [接受變更] 或 [拒絕變更/刪除註解]。
e. 重複步驟 c 和 d,直到文件中的所有修訂均已被接受或拒絕、以及所有註解均已遭到刪除為止。
f. 然後再到「檢閱」的工具列上「追蹤修訂」把它取消勾選


參考資料:
徹底移除追蹤修訂和註解

2009年4月11日 星期六

擺脫貧窮四部曲 - by 鄭弘儀

鄭弘儀:拿口袋裡的來投資腦袋

雖然鄭弘儀的太太已經再三警告他不可以多談家裡的私事,但是談到太太最近的健康情形,他還是忍不住回答了記者的話:「我太太最近身體健康已經好很多了。」說完就開心一笑,不再多說。

太太對鄭弘儀真的很重要。即使他已經當了一段時間的名人,即使他已經結婚十八年了,緋聞跟他還是絕緣體。他自嘲自己過的名人生活不過就是平凡、無膽、但自在,外界的誘惑對他來說都不是真實的,只有自己的家庭,才是心靈快樂的泉源。

讓自己「名」符其「實」

所以成名之後的鄭弘儀享受的不是財富的滋味,而是腳踏實地的感覺。他的頭髮還是老婆繼續幫他剪,他的中飯還是喜歡吃老婆準備的便當,就連裝便當的袋子也是老婆的手工拼布作品,很家居卻又實用,還可以裝他上班準備要看的資料。

「因為窮苦出身,所以他非常懂得惜福。」和他相交十多年,同屬五年級排頭的資深記者、《錢》雜誌總編輯許啟智說。

表裡如一的樸實

在他位於三立電視台不到三坪的小辦公室裡,螢光幕後的鄭弘儀看起來像一個公務員。他穿著有領的T恤,外面罩上一件抵抗冷氣的薄夾克,顏色樸實的西裝褲用皮帶整整齊齊地繫好,配上一雙有一點歷史的黑色皮鞋與逐漸斑白的頭髮,看起來好像公家機關裡的一位科長。

就連他的辦公室也沒有任何華麗的裝飾,只有牆壁上掛著兒子女兒以前念小學時候的繪畫與書法作品,他很認真地用漂亮的框裱起來,只要抬頭看到這些童畫,他就眉開眼笑了起來。他總是樂意和記者分享他的家居樂趣。在「大話新聞」、「新聞挖挖哇」
等帶狀節目中,日日出現在兩千三百萬觀眾眼前、略帶台灣南部口音、眼神深邃的這位中年男子,為什麼會成為全台灣女性上班族理想老公人選的第一名?

努力不怕出身低

給人一種實在的感覺,是鄭弘儀的「魅力無法擋」的關鍵成功要素。要知道在媒體的抽樣調查中,他的競爭對手可是企業家嚴凱泰、英俊瀟灑的劉德華、長得像日本卡通夢中偶像的無敵帥哥金城武等人,鄭弘儀憑什麼把這三大帥哥遠遠地拋在腦後?或許就是因為他有一種令人感到彷彿《詩經》名句中「執子之手,與子偕老」的情調,那種已經不多見的古典男子的忠實和可靠。

鄭弘儀說,他不太在乎別人怎麼看他,因為他知道自己要怎麼活出成功。當年就算只有工專畢業的學歷,他還是自告奮勇寫了一封信,向報社毛遂自薦報考記者。

當上記者之後又因為學歷比別人都低,深怕裁員一定會先裁到他,所以採訪新聞比別人努力三倍,規定自己每天撰稿字數至少兩三千字,寫稿寫到半夜2、3點。在他打破報社紀錄,成為有史以來最年輕、學歷最低的財經新聞主管後,他又自掏腰包用六分之一的薪水請老外來給他上英文課,因為他不想永遠用一口破英文來面對出國採訪時的尷尬。每塊拼圖都不馬虎難怪他稱自己的知識是「拼圖式學習」,因為他的成功是用每一塊拼圖老老實實地完成它,沒有一絲僥倖。在他從平面媒體轉戰電視圈後,他也老老實實地一大早4點半就趕到火車站等待剛出爐的報紙,再趕到電視台準備一早的財經節目。那是他進入電視圈的第一個節目,時段冷門,大家都不看好這個一大清早的節目會有什麼好的收視率,只是老闆好心給他一個露臉的機會。但是他很認真地抓住了這個機會。既然自認不是俊男,乾脆實實在在地把財經資料消化整理後,為電視觀眾作精闢的剖析,並延請重要的財經人物上節目助陣,結果,竟然大爆冷門,成了眾多廣告商指名要上廣告的節目。

惦惦呷三碗公那是1996年以前的往事,但是誰也沒想到,這位外型鄉土,說著台灣國語的記者,竟然在十年後搖身一變,成為家喻戶曉的電視名人。早年曾經與鄭弘儀共事過一段時間的一位資深平面媒體人回憶,當年大夥兒一塊跑財經新聞時,其他記者都會聚在一起聊天聊個不停,只有鄭弘儀永遠是安安靜靜地坐在一旁,不發一語地看著大家,是大家印象中典型的木訥記者,沒想到後來卻一飛沖天,把大家遠遠拋在後面。

雖然鄭弘儀做了很多讓大家跌破眼鏡的事,從一個貧窮農家的小孩,一個木訥不多話的年輕人,變成現在晚上只要一打開電視,隨便轉台就可以看到鄭弘儀在談話節目中振振有詞。但是鄭弘儀還是鄭弘儀,他的樸實真情依舊不改,所以他可以邊主持節目邊與來賓激烈地辯論時事,也可以在聆聽白冰冰談女兒被撕票的心路歷程時,不能自已地頻頻哭出聲音,激動得連節目都主持不下去,讓電視機前的觀眾陪著他一起掉眼淚。

機會到處都是正因為他把腳踏實地看得很重要,所以他無法認同唱衰台灣沒有未來的論調。他不認為現在台灣變窮了,年輕人的工作機會變少了,當然,他更無法理解現在年輕人的理財消費觀。錢要花在資本財「我承認這是一個消費的時代,」鄭弘儀皺著眉,帶著擔心的表情說:「但是有些事情就是要堅守基本核心價值,你不能把賺來最寶貴的錢都花在消費財上,你應該花在資本財上。」他環顧電視圈的工作人員,幾乎都是在25歲到35歲之間,每人每天最常做的一件事就是拿著一杯占去薪水十分之一的咖啡,肩上掛著的是超過月薪的名牌包包,卻已經欠銀行現金卡兩三百萬的債務。

鄭弘儀常會擔心地問他們:「夠還嗎?」許多人給他的回答都是:「快不夠了,只能一天過一天。」這樣的理財態度讓他沒辦法想像,為什麼30幾歲的人生就要這樣被兩三百萬的債務壓得死死的,而且這一切還是自找的。「有就有,沒有就沒有,為什麼要怕人知道?現在的人都要武裝自己不懂、或是沒有的東西,這才是最嚴重的問題。

這時候的鄭弘儀又變成電視上深鎖眉頭的沉思表情,只不過他的深鎖眉頭不是因為政經新聞,而是現在的30世代。 物質不窮,精神窮不過隔了一個世代,50年次的鄭宏儀已經開始覺得與六年級生處於兩個世界。關於貧窮的滋味,他從小就開始體驗,即使他是家中七個小孩的老 么,照樣半夜要去巡田到天亮,放學回家後要先放牛吃草才能回家吃晚飯,在晚餐的桌上只要多挾一點菜就會被爸爸用筷子嚴厲地打下去,目睹爸爸在田裡因為太勞 累又營養不良而多次昏倒,連自己也常因為噴灑農藥而中毒倒在田裡。鄭弘儀張開自己雙掌,瞪視著上面滿佈當年割菸葉所造成的大小割痕,看著這些成長的痕跡他 還是不認為小時候的窮是在過苦日子,因為只是物質窮,精神不窮。回憶小時候,鄭弘儀很開心地提到當時最大的享受,就是與哥哥省下每天通車上學的錢,然後把 這一點點的通車費拿去買零嘴吃,雖然代價是哥哥得用兩小時的勞力騎腳踏車載他一起去上學;又或者是半夜12點躺在床上,聆聽嘉南平原另一端傳來平快車的聲 音,隨著火車緩緩駛進,他就開始想像火車上究竟坐了哪些人?正要駛往何處?那時候世界又大又遙遠,台灣對他來說就是一個堡壘,雖然當時機會並不多,產業也 不像現在蓬勃又多樣。

所以他還是不認同現在年輕人覺得正在過苦日子的想法。他覺得現在的日子反而是物質不窮,精神窮。「到處都是機會,怎麼會認為沒有機會?怎 麼會覺得機會都在中國那邊?」他揚起有些生氣的音調反問。或許對於鄭弘儀來說,他最不能忍受的就是失敗主義的論調,還沒有先努力就開始嘆氣,是他最不能忍受的人生態度

何不當新富階級

一路走來他都坦然面對自己的人生,靠努力來彌補自己在各方面的不足,堅信沒有人是不吃苦就能成功的定律。對於現在高喊的「新貧階級」,他理直氣壯地說:「既然有新貧階級出現,當然也有新富階級在形成,你為什麼不去選擇當新富階級的這一邊人?」

從來不嘆氣的鄭弘儀,一向保持自己看事情樂觀面的個性。他的快樂來自於他自己所形容的一種「俯仰無愧的態度」,既不欠錢債(從不拿違背良心的錢)、也不欠情債(不外遇也不關說),所以他從不失眠,每天紮紮實實地過生活

談著談著,他又把話題轉回老婆幫他剪了十八年的頭髮。他認真地想傳達他真正快樂的秘訣,並不是因為自己人剪頭髮可以因此省下多少錢,而是他 在乎這段與老婆相處的寧靜時光。這時候的他只是屬於老婆的鄭弘儀、孩子的爸爸,又或者只是勞累過頭猛打瞌睡的自己,這種無形的自在,才是真快樂。

鄭弘儀應該是快樂的。他努力想告訴大家,如果這樣一個既非俊男,也非高學歷或出身富裕家庭的青年,都可以憑藉一步一腳印的努力獲得成功,為什麼其他的人不行呢?

鄭弘儀給30世代的叮嚀:

1. 賺來寶貴的錢不要花在消費財上,要花在資本財上。

2. 性格、觀念與知識會決定你會不會成功,性格就是不怕苦、願意接受挑戰;觀念就是態度,知識無關學歷,而是解決事情的能力。

3. 人生有太多會被別人取笑的地方,沒有什麼好怕的,重點是要懂得學習。

4. 要去看別人辛苦的一面,而不是成功的一面。

5. 不要隨便欠任何東西,如果你欠了,那就付出代價,逃避是最愚笨的方法。

2009年4月10日 星期五

分散在網路各地的老師的網頁

最近一直在網路上找資料,常常會找到一些老師的網站,通常這一些網站都是放一些課堂上的投影片啦,文件啦~相當的仔細。
比起在各地的網友寫的資料更有條理,所以,還是建立一篇文章來收集這一些文件吧!!

http://solomon.ipv6.club.tw/Course/

「252生存訊號」的特映會的記錄

因為之前捐血活動(我真是個熱血青年啊!!),有獲得「252生存訊號」的特映會的電影票,地點在威秀影城。

這一部電影呢,我個人覺得整體上還不錯~
劇中在描寫消防救難隊的生活。

很奇特的,天災(冰雹),地災(海嘯)(地震),全部都因為一個超強大的颱風而在同一個時間點出現。
這就好像看籃球漫畫,每一個人都會打籃球;看棒球漫畫,全世界都在打棒球的情況是一樣的~
因為,這是一部救災的電影嘛~

其中,我現在想要想出我對這一部電影比較有感觸的地方。
目前好像只有兩個,
第一個是:因為男主角之前是救難隊的,現在被困住了,當男主角生死未知時,她對男主角的哥哥,也就是目前救難隊的小頭頭說了一句話:
「我之前丈夫去救人時,我都在想為什麼要冒著生命危險去救他們;現在,我才知道,目前他們能靠的就只有你們啊~」
她說這一句話的意思是叫他們快點冒著生命危險去救他的先生。
基本上,救難隊就是評估去救受困者是否會同時危及到救難隊的安全來決定是否要出動這一個救援,若救難隊評估有危險,為什麼叫他一定要去救你的家人?他們的命不是命?他們後面也是有家庭的啊~
ok~若救回來了,若他再回到救難隊,同樣的情況,你會讓你的丈夫下去救這一個人嗎?
有很高的機會是不會的,他一定會勸自己的生命要先保住啊!
我了解每一個人一定是自私的,但是,你也要站在同理心替別人想啊~
常常為人婦就會有這一個情況~
自己的家庭擺第一位,其他人的家人死不完。
常常很討厭這一種行為,
但是,的確因為這一種母親的執著,在新聞上時有所聞,一個母親為了救子女發揮了男人都做不到的事情,只是為了保住子女的性命。
不過,客觀的認為,若你要救你的子女,在救難隊判斷有危險時而決定不行動時,要嘛你自己去救,要嘛你就祈禱,不要別人去做冒著生命危險去救你兒女的事情。

第二個是:
在電影的最後,有顯示他們救難隊的訓練就好像軍隊一樣,
這樣我想到郭台銘的公司管理也像是軍隊一樣,
其實最好的管理就是要研究出一套有效的方法,
然後徹底去執行,讓熟練度可以到達最高,讓突然有事情時,在訓練範圍內的事情才可以馬上解決,
而意外的事情才可以有多一點的時間去處理啊~
就好像考試一樣,基本題要非常熟,處理的時間要短,這個時候變化題才有比較多一點時間去處理。
同時想到,我們的消防隊好像沒有他們那麼認真在做訓練了(可能我不知道啦)~
看來,我們有很多要跟日本去做學習的地方~
有時候企業還是最先要講的是效率,再來才是人情面,但是,也不是唯一啦~
但是,我這裡說的軍事化管理的前提是,領導人要非常有sense,
否則,這一個軍事化管理反而更糟糕!!
這就叫一黨獨大~
政策對,用軍事化的行動才會有效果,因為最後還是有一個很好的成果,像是股票領很多啦~
政策錯,用軍事化的行動只會讓大家離開這一個團隊!

2009年4月9日 星期四

SATA硬碟做GHOST

SATA硬碟作GHOST
這問題根本不用複雜的去設定BIOS
要對SATA硬碟作GHOST,只需在DOS底下輸入
$ GHOST -NOIDE
的參數後就可以正常使用了....
因為GHOST預設參數是搜尋IDE硬碟再啟用...所以只要加入 -NOIDE 讓它不要一開始就去搜尋IDE一切就都解決了....
至於使用視窗版的GHOST 2003如果沒記錯的話,它有一個選項是可以輸入參數的...在裡面輸入-NOIDE重開機後,開始跑GHOST也一樣可以正常執行的..
所以根本不用從BIOS動手

參考資料:
SATA硬碟作GHOST

Dos - 批次檔教學

甚麼是批次檔:
在DOS系統下,有三類檔案是可以使DOS執行而進行某些工作,這三類檔案分別有以下三個不同的副檔名
1. .com (指令檔,命令檔) 例如 Command.com, Edit.com 等。
2. .exe (執行檔) 例如 Copy.exe, Mem.exe 等。
3. .bat (批次檔) 例如 Autoexec.bat 等。

其中 .com 及 .exe 的檔案是用編譯或組合語言寫出,需要較多工夫來學習編寫,一般終端用者 (end-user) 不會花時間來學習編寫這些程式,但 .bat 的批次檔是一連串的DOS 內部或外部指令 (批次檔的意思是 指令集) ,或是執行程式的主檔名,因此只要懂得這些指令,加上一些簡單的語法,就可寫出批次檔。終端用者利用自己編寫的批次檔,就可使 DOS 執行自己編定的程序。
批次檔是由 DOS 指令組成,因此批次檔有錯誤時,就等於我們在提示號 (C)鍵入錯的指令一樣,螢幕會有 Bad command or file name 的回應。
批次檔必定要是純文字檔案,可使用 DOS 的編輯器(DOS Editor)或用windows內的 記事本 寫出來,這兩個都是簡單的文書處理器,文稿內不含任何控制碼 (如字款和字的大小,文章闊度等等),這就最適合用來編來批次檔。

批次檔的規格:
1. 批次檔要以純文字寫出,每一項指令要在一行中完成,不能分兩行,每行最多是 127 個字。每一行只能容納一個指令,兩個指令就要分兩行 (或用連結符號)。
2. 批次檔的檔案要用 .bat 為副檔名,除了 Autoexec.bat,主檔名由用者自定,但最好避免和 DOS 指令同名,例如不要用 Copy.bat、Del.bat、Dir.bat、Exit.bat 等等。
3. 批次檔需用 DOS 指令加上特定語次寫成,這些指令包括 DOS 內部及外部指令,語法有以下各項:
call
choice
echo
for...in...do
goto
if(if exit)(if not exist)
pause
rem
shift
指令錯誤會有 "Bad command or file name" 回應,語法錯誤會有 " Syntax error" 的回應。

4. 要 DOS 執行批次檔的指令,只需鍵入主檔名,例如 Menu.bat 或 menu。不過若批次檔的主檔名和 .com 或 .exe 的主檔名相同時,就要鍵入全名,例如批次檔的名稱是copy.bat 或 edit.bat時,就要鍵入copy.bat 或 edit.bat 才能使電腦執行批次檔的指令,否則電腦會執行 copy.exe 或 edit.com 這些 DOS 指令。
5. 在批次檔執行途中,一起按下 [Ctrl]+[C] 或 [Ctrl]+[Break] 可終止程序。按下這兩個鍵後,螢幕會顯示:Terminate batch job (y/N)?
按 [Y] 會終止這批次檔和回到 DOS 的提示號,按 [N] 則取消[Ctrl]+[C] 指令,批次檔會繼續執行程序。

早期在DOS系統工作下,都可能需要使用批次檔來執行電腦工作,當文字介面的系統逐漸被Windows、Unix系統(圖形介面)所取代時,現今一般使用電腦的人,可能也不是很清楚什麼是批次檔,我們今天就來介紹何謂批次檔。

批次檔是一種文字檔案(ASCII檔案),由一連串的MS-DOS命令所組成的。
批次檔的命名規則與一般檔案相同,但其副檔名固定為".BAT",即"將 一連串的命令"儲存在檔案中,該批次檔的指令可無限制的重覆使用,永遠得到相同的執行結果。究竟批次檔又該如何使用呢?以下介紹批次檔的常用指令。

批次檔的常用指令如下:
另外,這裡要注意的事,每一個指令前面都不可以有空白。
*------------------------------------------
* 一、 ECHO
*------------------------------------------


在正常的情況下,批次檔中的每道命令執行前都會先出現螢幕上。有了ECHO命令,就可以任意控制是否列印出命令列。
用法:在批次檔中鍵入echo on/off ,on:表示要印出命令列,off:則不印出命令列,若要禁止批次檔的命令顯示在螢幕上,則使用隱藏echo off(@ECHO OFF),或在命令列的開頭上加上@符號
Ex:
TEST.bat
@echo off
echo .... 測試ECHO指令
echo .... 請稍後
echo .... 完成.....


結果:
$ Test.bat
.... 測試ECHO指令
.... 請稍後
.... 完成.....


*------------------------------------------
* 二、 代換參數
*------------------------------------------

代換參數的標記是一個百分號(%)再跟著一個阿拉伯數字,最多可使用10個代換參數,這些變數的值,則由呼叫批次檔的命令所指定。
Ex:
TEST.bat
@echo off
echo .... 測試代換參數指令
echo .... 請稍後
echo .... 完成.....
echo %1 %2 %3 %4


結果:
$ TEST.bat TCP EDU NETWORK CENTER
.... 測試ECHO指令
.... 請稍後
.... 完成.....
TCP EDU NETWORK CENTER


*------------------------------------------
* 三、 PAUSE:是暫停批次檔的執行。
*------------------------------------------

當MS-DOS執行到PAUSE時就暫時中止目前的工作,並印出下列訊息:
press any key to contunue ……
Ex:
TEST.bat
@echo off
echo .... 測試代換參數指令
echo .... 請稍後
echo .... 完成.....
echo %1 %2 %3 %4
pause
echo %5 %6


結果:
$ Test TCP EDU NETWORK CENTER
$ E-Mail chan@ms64.hinet.net

.... 測試ECHO指令
.... 請稍後
.... 完成.....
TCP EDU NETWORK CENTER
Press any key to continue ....

E-Mail chan@ms64.hinet.net


*------------------------------------------
* 四、 REM(REMark)用來在批次檔執行中顯示某些訊息
*------------------------------------------

用法是在批次檔中鍵入rem,後面跟著所要顯示的字串

Ex:
TEST.bat
@echo off
echo .... 測試代換參數指令
echo .... 請稍後
echo .... 完成.....
rem 下面指令,開始做代換參數
echo %1 %2 %3 %4
pause
echo %5 %6


*------------------------------------------
* 五、 IF
*------------------------------------------

IF命令在批次檔中用來測試特定的條件,以決定是否執行某些命令。絛件的型態分為四種:
////////////////////////////////////////////////////////////////////
(1) IF EXIST
此條件是用來檢查某一檔案是否存在,若存在則條件成立,便執行指定的命令
Ex:
@echo off
if exist test1.bat type test1.bat


////////////////////////////////////////////////////////////////////
(2) IF String1 == String2(== 表相等性的比較)
Ex:
@echo off
echo .... 測試IF指令
echo %1
if '%OS%'=='Windosws_NT' goto good
if %1 == a goto first
if %1 == b goto second
if %1 == c goto three
:good
echo 作業系統%OS%
:first
echo 執行first (a)
goto finish
:second
echo 執行second (b)
goto finish
:three
echo 執行three (c)
goto finish
:finish


結果:
$ Test a
a
執行First(a)


////////////////////////////////////////////////////////////////////
(3) IF ERRORLEVEL
ERRORLEVEL是由MS-DOS所管理的一個系統變數,目的是監視所有錯誤發生的情況。(類似ErrorMessage)

////////////////////////////////////////////////////////////////////
(4) IF NOT
IF NOT是當測試條件不成立時才執行後面命令

Ex:
@echo off
if not exist test1.bat type test1.bat
echo 執行程式結束


////////////////////////////////////////////////////////////////////

*------------------------------------------
* 六、 GOTO
*------------------------------------------

GOTO命令在批次檔中用來轉移控制權,可以指示批次檔跳至某一標記(line label)由一個冒號(:)跟著字元符號所組成的;label也可使用代換變數
Ex:
goto first 或 goto %1

*------------------------------------------
* 七、 FOR
*------------------------------------------

FOR命令允許批次檔中的其他命令,可以重覆地執行
for %%a IN (file1 file2 file3) DO del %%a
虛擬變數必須以兩個百分號(%%)起頭,in後面著參數列,do後面跟著要執行的命令

Ex1:
TEST.bat
@echo off
echo .... 測試FOR指令
echo .... 請稍後
echo .... 完成.....
echo ....
for %%a IN (test_a.bat test_b.bat test_c.bat) do copy %%a prn


結果:
$ TEST

.... 測試FOR指令
.... 請稍後
.... 完成.....
....
1 File(s) Copied
1 File(s) Copied
1 File(s) Copied




Ex2:
REM 取得日期
FOR /F "tokens=1-4 delims=/ " %%a IN ("%date%") DO (SET _MyDate=%%a%%b%%c%%d)

REM 顯示去掉分隔符號後的結果
echo %_MyDate%

說明:
/F 是指定將後面 %date% 的環境變數當成檔案來處理,而處理的依據就是在「"tokens=1-4 delims=/ "」這邊。tokens如果按照字面翻譯的話,是權杖的意思,這樣翻不太直覺,在這邊翻成順序可能比較好一些。以這個例子來說,就是要取得順序 1 ~ 4 的字串,那程式怎麼知道這個順序的分法呢?透過 delims 這個引述的設定,程式就知道要怎麼去分析 %date% 環境變數的順序。在 delims 等號右邊的字元就是用來指定分割順序的依據。以這個例子來說,我們用「/」與「 」(空白,White Space)這兩個分隔符號來分割 %date% 的順序。因此原本 %date% 的內容是 2006/03/07 星期二,在程式來看就變成了:

順序 內  容
﹉﹉ ﹉﹉﹉﹉
1    2006
2      03
3     07
4   星期二


%%a 是說把順序 1 的結果指派給名稱為 %%a 的變數,因此順序 2 的變數名稱就會是 %%b,以此類推,最多可以有 52 個變數,原因如下:變數名稱有大小寫之分,所以 %%a 跟 %%A 不同,且僅能以一個英文字母來命名,所以 26(個字母)× 2(大寫跟小寫 2 種)=52(個)。DO 後面的括號內容是用來指定所要執行的命令內容,以這個例子來說,就是指定一個名稱為 _MyDate 的變數,它的內容是由 %%a%%b%%c%%d 所構成的。

再來我們看看使用 FOR 指令去掉時間變數之分隔符號的結果:

MyTime.bat 的檔案內容如下所示:
REM 取得時間
FOR /F "tokens=1-4 delims=:." %%a IN ("%time%") DO (SET _MyTime=%%a%%b%%c%%d)

REM 顯示去掉分隔符號後的結果
echo %_MyTime%


看看執行的結果:

$ MyTime

螢幕輸出:

14243241

講了這麼多,您知道該怎麼運用 %date% 與 %time% 環境變數了嗎?

*------------------------------------------
* 八、 SHIFT
*------------------------------------------

SHIFT命令允許在批次檔的起動命令中,使用超過10以上的實際參數
(%0~%9)

*------------------------------------------
* 九、 CALL
*------------------------------------------

模組化的程式設計,是將一個完整的程式分割成一個個獨立的模組(module),每個模組負責一項功能
Ex:
TEST.bat
@echo off
echo .... 測試CALL指令
echo .... 請稍後
echo %1 %2
call test_b
echo %3 %4
echo 程式模組已執行完畢 (test_a.bat)

@echo off
echo 執行test_b程式
echo 即將執行test_c .....
call test_c
echo 執行test_b程式完畢~~~ (test_b.bat)

@echo off
echo 執行test_c程式
if exist test2.bat type test2.bat
echo 執行test_c程式完畢~~~ (test_b.bat)


*------------------------------------------
* 十、 set
*------------------------------------------

宣告變數;設定變數

set gbs=%OS%取得作業系統
set xdate=%date%取得目前日期20080610
set xmonth=%date:~5,2%取得目前月份06
set select=
set /P select=請選擇:
等待取得使用者所輸入字元

在DOS環境下輸入Set,可列出windows環境變數

Q: 得知某一變數的內容值
要取得PATH變數的內容值
echo %PATH%

[2010.02.09 補充]
學習如何分析字串
例:分析日期與時間,再更新組合成為一個新的字串
取得目前的日期
% echo %data%
2010/02/09 星期二
取得目前的時間
% echo %time%
22:39:39.18

Q: 如何得到2010.02.09.2239字串

這個時候要透過fortokensdelims來完成要求
DateTimeFileName.bat
@echo off
rem analyze the Date string
rem delims表示把後面的字串以"/"與" "為分隔字元,分成許多小節
rem 再透過tokens把第1個小節到第4個小節,由%%a開始儲存
rem 因為由%%a開始儲存,並且存1-4個,所以分別會存到%%a, %%b, %%c, %%d

FOR /F "tokens=1-4 delims=/ " %%a IN ("%date%") DO (
SET SYS_DATE=%%a.%%b.%%c
)

rem analyze the Time string
rem delims表示把後面的字串以":"與"."為分隔字元,分成許多小節
rem 再透過tokens把第1個小節到第4個小節,由%%e開始儲存
rem 因為由%%e開始儲存,並且存1-4個,所以分別會存到%%e, %%f, %%g, %%h

FOR /F "tokens=1-4 delims=:." %%e IN ("%time%") DO (
SET SYS_TIME=%%e%%f
)
SET FILE_TIME=%SYS_DATE%.%SYS_TIME%
echo %FILE_TIME%

pause


[2010.08.26 補充]
顯示資料夾內所有名為_svn的資料夾
%> dir *_svn /s /b /a:d

參考資料:

批次檔教學

批次檔教學
批次檔案和命令的使用
MS-DOS的批次檔
如何在 Batch 檔取得系統的日期、時間欄位 (第二版)

linux指令 - seq

linux指令 - seq

這一個指令在script會常常用到~可以建立一個有規律的字串與數字,非常好用~
由其在迴圈時,更是常使用到。
$ seq 5
1
2
3
4
5


$ seq 2 5
2
3
4
5


$ seq 1 2 5
1
3
5


還有以下三個參數
-f, --format=FORMAT use printf style floating-point FORMAT (default: %g)
-s, --separator=STRING use STRING to separate number (default:\n)
-w, --equal-width equalize with by padding with leading zeroes

-f 最常用 , 例如一次制做 10 個名 dir001 , dir002 .. dir010 的目錄,它便很有用途,我們可以這樣下一個命令便可了
$ seq -f 'dir%03g' 1 10 | xargs mkdir

$ mkdir $(seq -f 'dir%03g' 1 10)
它用的是 printf 的格式 , %03g' 代表以三位浮點數,以此方法,如用bash3 的 printf也可作為等價命令
$ printf 'dir%03d\n' {1..10} | xargs mkdir

$ mkdir `printf 'dir%03d ' {1..10}`

awk 當然也可以
$ awk 'BEGIN { while (num < 10 ) printf "dir%03d\n", ++num ; exit}' | xargs mkdir

這樣會比寫一個腳本快, 不必寫成

for dir in 001 002 003 004 005 006 007 008 009 010
do
mkdir dir${dir}
done


-s 選項主要改變輸出的分格符, 預設是 \n , 就是 newline
如用 -s 便可改變 , 以空格作為分格,如:
$ seq -s ' ' 1 10
1 2 3 4 5 6 7 8 9 10

-w 根據數字寬度,自動在不足位前補0
$ seq 1 10
01
02
03
04
05
06
07
08
09
10

參考資料:
seq 的一般用途和它相若的命令

2009年4月7日 星期二

Dos指令 - 複製指令

因為在windows下大量刪除資料與大量複製資料,系統為了顯示百分比,所以,在正式動作之前,會計算所有的資料量,但是,這樣反而會浪費更多的時間,如果透過dos指令,就可以避免系統去計算時間,直接開始運作~
果然文字介面還是王道啊~~
如果要由A目錄把整個copy到B目錄可以使用以下指令~
而若只使用下面的指令,並不會複製隱藏資料夾下的檔案或系統資料夾下的檔案~
$ xcopy A B /E

不過,好像目前系統在使用的檔案就沒有辦法複製過來,可能還要加其它參數之類的吧~有空再研究看看吧~而且好像不支援長檔名~

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/Q] [/F] [/L] [/H] [/R] [/T] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/EXCLUDE:file1[+file2][+file3]...]

source 指定要複製的文件。
destination 指定新文件的位置和/或名稱。
/A 只複製有存檔屬性集的文件,
但不改變屬性。
/M 只複製有存檔屬性集的文件,
並關閉存檔屬性。
/D:m-d-y 複製在指定日期或指定日期以後改變的文件。
如果沒有提供日期,只複製那些源時間
比目標時間新的文件。
/EXCLUDE:file1[+file2][+file3]...
指定含有字符串的文件列表。如果有任何
字符串與要被覆制的文件的絕對路徑
相符,那個文件將不會得到複製。
例如,指定如 \obj\ 或 .obj 的字符串會排除
目錄 obj 下面的所有文件或帶有
.obj 擴展名的文件。
/P 創建每個目標文件前提示。
/S 複製目錄和子目錄,除了空的。
/E 複製目錄和子目錄,包括空的。與 /S /E 相同。可以用來修改 /T。
/V 驗證每個新文件。
/W 提示您在複製前按鍵。
/C 即使有錯誤,也繼續複製。
/I 如果目標不存在,又在複製一個以上的文件,則假定目標一定是一個目錄。
/Q 複製時不顯示文件名。
/F 複製時顯示完整的源和目標文件名。
/L 顯示要複製的文件。
/H 也複製隱藏和系統文件。
/R 改寫只讀文件。
/T 創建目錄結構,但不複製文件。不包括空目錄或子目錄。/T /E 包括空目錄和子目錄。
/U 只複製已經存在於目標中的文件。
/K 複製屬性。一般的 Xcopy 會重設只讀屬性。
/N 用生成的短名複製。
/O 複製文件所有權和 ACL 信息。
/X 複製文件審核設置(隱含 /O)。
/Y 禁止提示以確認改寫一個現存目標文件。
/-Y 導致提示以確認改寫一個現存目標文件。
/Z 用重新啟動模式複製網絡文件。

命令選項 /Y 可以預先在 COPYCMD 環境變量中設置。
這可能被命令行上的 /-Y 改寫。

[2010.04.22 補充]
由source的目錄copy到destination這一個目錄,同時排除資料夾名為filerfolder、副檔名為why的檔案
xcopy source destination /E /EXCLUDE:filter.txt
filter.txt的內容為
\filterfolder\
.why

則xcopy會根據filter.txt的內容來排除特定的資料夾和檔案

參考資料:
dos命令之xcopy命令-目錄複製命令
Ms Dos
xcopy 的 /EXCLUDE: 參數使用方式

2009年4月4日 星期六

Ubuntu 8.10改成固定IP

若要將 Ubuntu 8.10 中的 DHCP IP 改成 static IP,必須手動用以下步驟改,因為 Ubuntu 8.10 的 NetworkManager 有 bug

$ sudo update-rc.d -f NetworkManager remove
$ sudo reboot

編輯 /etc/network/interfaces
$ sudo vi /etc/network/interfaces

auto lo eth0
iface lo inet loopback
iface eth0 inet static
address xxx.xxx.xxx.xxx(enter your ip here)
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx(enter gateway ip here)

編輯 /etc/resolv.conf
$ sudo vi /etc/resolv.conf

# Generated by NetworkManager
nameserver xxx.xxx.xxx.xxx(enter your dns server ip)
nameserver xxx.xxx.xxx.xxx(enter your alt dns server ip)

$ sudo /etc/init.d/networking restart

參考資料:
Doug的技術園地_Change DHCP IP to static IP in Ubuntu 8.10

Free Download Manage

若我沒有記錯的話,這一個軟體一開始是祺豪大大介紹給我的。
當時我並沒有特別的去注意它。
當我在開始在使用portable的軟體時,意外的發現,
這一個有portable的軟體,
而且還可以下載youtobe的影片,那實在是太方便啦~
除了是免費,功能上並不輸給flashget,

這裡有一個網頁介紹free Download Manage非常的詳細。
Free Download Manager 功能豐富老牌下載軟體,推3.0最新版

另外,之前flashget有一個功能,可以下載剪貼簿內的所有下載網址,但是,前幾天要使用時,卻沒有在free download manage沒有這一個功能,這實在是太奇怪了,這一個功能應該大家都還蠻常用到的啊~

最後,發現果然還是有這一個功能~
檔案-匯入-從剪貼簿匯入網址清單

嗯,非常好的一個免費軟體

忘記說,這一個軟體還可以下載youtube的影片,還可以幫你轉檔哩~
詳細情況可以參考下面的參考網址
參考資料:
Free Download Manager 功能豐富老牌下載軟體,推3.0最新版

2009年4月3日 星期五

C/C++ : 不定長度引數(Variable-length argument)

在定義函式時,有時我們並無法事先得知要傳遞的參數個數,這邊介紹不定長度引數(Variable-length argument)的使用為了要使用不定長度引數,您必須含入stdarg.h表頭檔案:
#include <stdarg.h>
不定長度引數使用幾個識別字來建立不定長度引數:

* va_list
一個特殊的型態(type),在va_start、 va_arg與va_end三個巨集(macro)時當作參數使用。

* va_start
啟始不定長度引數的巨集。

* va_arg
讀取不定長度引數的巨集。

* va_end
終止不定長度引數的巨集。

在宣告不定長度引數時,您在函式定義時使用 ... 表示將使用不定長度引數,而之前必須告知將傳遞幾個不定長度引數,例如:
void foo(int, ...);

在使用va_arg巨集取出引數內容時,您必須指定將以何種資料型態取出,例如:
va_arg(num_list, double);

下面這個程式示範如何使用不定長度引數:

#include <stdio.h>
#include <stdarg.h>

void foo(int, ...);

int main(void) {
double x = 1.1, y = 2.1, z = 3.9;
double a = 0.1, b = 0.2, c = 0.3;

puts("三個參數:");
foo(3, x, y, z);

puts("六個參數:");
foo(6, x, y, z, a, b, c);

return 0;
}

void foo(int i, ...) {
double tmp;
va_list num_list;

va_start(num_list, i);

int j;
for(j = 0; j < i; j++) {
printf("%.1f\n", va_arg(num_list, double));
}

va_end(num_list);
}


而常與不定長度一起使用的function就是
int vsprintf (char * str, const char * format, va_list arg );
int vsnprintf(char *restrict s, size_t n, const char *restrict format,va_list ap);
下面這一個就是一個範例:
/* vsprintf example */
#include <stdio.h>
#include <stdarg.h>

// 不確定參數個數,format也是一個陣列,每一個對應一個變數,這一個例子是[%s,%d]
// 而...代表的就是後面的參數
void PrintFError (char * format, ...)
{
char buffer[256];
va_list args;
va_start (args, format); // format表示要arg是要以何種資料形態取出
// int vsprintf (char * str, const char * format, va_list arg );
// str表示要寫入的空間指標
vsprintf (buffer,format, args); // 把所有的字串塞到buffer所指的空間中
perror (buffer); // 把設定好的錯誤訊息字串列印出來,同時會依errno,列印出相對的錯誤訊息
va_end (args); // 結束不定參數個數函式的使用
}

int main ()
{
FILE * pFile;
char szFileName[]="myfile.txt";
int firstchar = (int) '#';

pFile = fopen (szFileName,"r");
if (pFile == NULL)
PrintFError ("Error opening '%s'\npFile:%d\n",szFileName,pFile);
else
{
// file successfully open
fclose (pFile);
}
return 0;
}

參考資料:
C Gossip: 不定長度引數(Variable-length argument)
vsprintf
vsprintf