2011年12月13日 星期二

Linux kernel內讀寫檔案

在driver裡面,我們有時需要留一些資訊在磁碟上讓userspace作溝通,因此需要從kernel上直接寫入檔案。

相關API程式碼如下:

void InitKernelEnv(void){ 
oldfs = get_fs();
set_fs(KERNEL_DS);
}

void DinitKernelEnv(){
set_fs(oldfs);
}

struct file *OpenFile(char *path,int flag,int mode){
struct file *fp;

fp=filp_open(path, flag, 0);
if (fp) return fp;
else return NULL;
}

int WriteFile(struct file *fp,char *buf,int readlen) {
if (fp->f_op && fp->f_op->read)
return fp->f_op->write(fp,buf,readlen, &fp->f_pos);
else
return -1;
}

int ReadFile(struct file *fp,char *buf,int readlen)
{
if (fp->f_op && fp->f_op->read)
return fp->f_op->read(fp,buf,readlen, &fp->f_pos);
else
return -1;
}

int CloseFile(struct file *fp) {
filp_close(fp,NULL);
return 0;
}

而使用方法請參考下面這個範例:

void test(){
char read_buf[2048] = "";
char write_buf[2048] = "";
struct file *fp;

InitKernelEnv();

//read file
fp = OpenFile(WPS_STA_LIST_FILE, O_RDONLY | O_CREAT, 0);
if(fp != NULL){
ReadFile(fp, read_buf, sizeof(read_buf));
}

CloseFile(fp);


//write to file
fp = OpenFile(WPS_STA_LIST_FILE, O_CREAT | O_WRONLY, 0);
if (fp!= NULL) {
WriteFile(fp, write_buf, sizeof(write_buf));
}

CloseFile(fp);

DinitKernelEnv();

}

參考資料:
[1] 請問內核中讀寫配置文件的源碼在哪個目錄的哪個文件中
[2] Reading file in kernel-簡單但實用

Linux kernel內取得時間

在kernel裡面,沒有辦法使用time(0)取得時間,但是我們可以利用do_gettimeofday()方式將時間取出。

//預先引入標頭檔
#include <linux/time.h>

...

//取得時間
struct timeval tv1;
do_gettimeofday(&tv1);

經由tv內部的tv_sec就可以取得目前系統時間的秒數了。


參考資料:
[1] linux kernel时间
[2] 时间处理函数 | do_gettimeofday() -- 获取当前系统时间

2011年12月11日 星期日

小笨霖的英文筆記

有一陣子剛好逛到小笨霖的英文筆記。

裡面依據主題條列了許多道地的英文口語說法。對於常接觸電影或是影集的人,會感到不陌生才是。

我花了點時間全部看完,真得是很推薦!

網址:http://som.twbbs.org/klee/notebook/index.html

2011年12月9日 星期五

Free

我的心終於自由了。

很感謝這次出國的機會,讓我見識到更多。我發現我的喜歡是很膚淺的。只要女生有打扮化妝,型又是我喜歡的那種,我就會有喜歡的感覺了。

因此,我已經放棄以前的想法了。

把該塵封的都封閉起來,該封鎖的都封鎖了,不想讓這份以前情感再流露出去。

最好的方式,就是完全不要看到,不要想到。

忽然有種海闊天空的感概。

2011年11月20日 星期日

忍住

到現在已經兩個禮拜了,說好不連絡的我,心情反而急轉直下。

我好想再跟妳聊聊天,問妳最近過得怎樣。聽聽妳的聲音,還有妳那因為遲疑而空白的無聲。

到頭來,被制約的反而是我自己。

到底怎樣做才比較好。

2011年11月7日 星期一

調適

我一直覺得心理上我還在學習如何自我調節。

為什麼跟妳沒有見面就會開始不安。

為什麼腦海中都填滿妳的點點滴滴。

為什麼好想再跟妳說說話。

為什麼想要再見到妳。

我以為我已經學會了,其實還是不堪一擊。

2011年10月27日 星期四

I-Chia's mail

這是我的好朋友I-Chia,目前正在米國工作。
在上班mail閒聊時候,我覺得很中肯的話。在此引用只修改掉錯字。

 

山田草太也很普通阿.標準的被發好人卡型的.
長的也還好.我現在認為把妹完全就是靠運氣.
假設認識的五十個女生中,有十個是你覺得不賴的,扣除五個有男朋友了, 剩的五個能把到得到一個.這機率不算低了
但是問題是,認識到五十個女生的時間要花多久,如果你跟賴其人一樣念社會組,從小到大大概身邊都至少有三四十個認識的女生.如果你跟我跟信吉仔一樣念自然組.收集五十個女生的時間差不多約三四年吧.也就是如果你運氣普通平均大概也要三四年才能遇到一個女朋友的候選人.還要請老天保佑不要自己搞爆.通常能過爽爽的男生都是身陷在一堆女生之中環境工作的男生.如果有那種環境,每天打killzone跟魔獸也會有人看上你~

2011年10月7日 星期五

分心

分心!分心!

我需要分心!

我不能這樣一直沉迷在很遙遠的夢想。

疑惑

自以為往正確方向駛去,但事實好像跟我想的相反。

我真得不懂~我真得不懂。

2011年10月5日 星期三

Pretty Poodle

這blog是一個日本的設計師做的。他主要提供一些很可愛的背景風格,像是經典的水玉點點,或是緞帶圖案。同一種設計也提供了許多不同的顏色做參考。

很有日系的風格,我很喜歡

網址:http://prettypoodle.blogspot.com/

2011年9月20日 星期二

Yahoo! レシピ

某天忽然逛到日本的Yahoo竟然也有提供食譜的服務。我做菜不是很厲害,但是看著這些漂亮的食譜,心裡也會躍躍欲試呢。其實我的ipad裡面也是下載了好多日本食譜,可是都沒有認真去翻閱,哈哈。

Yahoo! レシピ位址在 http://recipe.gourmet.yahoo.co.jp/


http://recipe.gourmet.yahoo.co.jp/E505192/

2011年9月19日 星期一

Down

自己覺得,在感情這段路上,要學習的事情還有很多,要走的路真得很漫長。我知道自己的分量還是不夠。人不夠nice,無法激起心中的火花,再加上經驗不足。

Eliza是我的老師,經過和她開檢討會之後,重新認識了自己,還有很多需要加強的地方。

我和Eliza約定好了,要積極、樂觀,縱然結束了,也要有一個完美的Ending做結尾。

現在就繼續努力下去!

我不會哭的。

2011年9月13日 星期二

Pocket Monster 拼豆

http://blog.livedoor.jp/insidears/archives/52489345.html

這算是日本2ch討論區節錄出來的。實在很佩服這些神人。

要做這麼大的拼豆,第一要有夠大的拼豆版,還要有不錯的美術底子,可以把全彩圖片降階到拼豆的色彩。(這問題可以用演算法的距離演算法算出來,但還要寫就很懶)

我的拼豆都在生灰了。

image

2011年8月23日 星期二

Lolita Fashion條目

日本的wiki有針對Lolita條目做詳細的解說,也順便介紹了一下目前的日本地區的品牌。很值得參考。

我還是最喜歡白,粉紅為基調lolita!

ロリータ・ファッション

ゴスロリブランド一覧

2011年8月22日 星期一

海賊木樽ジョッキ

小賴傳給我的。喝酒用的杯子,但不接受海外訂購。有實體店,去東京可以順便去晃晃。

 http://urakita.ocnk.net/

2011年8月21日 星期日

Linux local socket範例

這是我在做測試時寫的一個關於local socket的範例。

由main產生child與parent這兩個process,然後parent作為server,child為client。由child向server發送資料,並由server印出在console上。

#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/un.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <errno.h>

#define SERVER "/home/mark/test/test_socket"

/* Open socket from local socket */
int openMsgSocket(){
int fd;
struct sockaddr_un name;
int fd_flags;

fd = socket(PF_LOCAL, SOCK_STREAM, 0);

//Set socket to non-block mode
fd_flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, fd_flags | O_NONBLOCK);

name.sun_family = AF_LOCAL;
strcpy(name.sun_path, SERVER);
bind(fd, &name, SUN_LEN(&name));
listen(fd, 5);

return fd;
}

/* Send message to local socket */
void sendMsg(char *msg_string){
int socket_fd;
struct sockaddr_un name;

socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0);
name.sun_family = AF_LOCAL;
strcpy(name.sun_path, SERVER);

connect(socket_fd, &name, SUN_LEN(&name));


int i = write(socket_fd, msg_string, strlen(msg_string)+1);
if(i < 0){
printf("write error\n");
}

close(socket_fd);
}

/* Format string and call send message */
int debug(const char * __restrict format, ...){
char buf[512];
va_list arg;
int rv;

va_start(arg, format);
rv = vsprintf(buf, format, arg);
va_end(arg);

sendMsg(buf);

return rv;
}


int main (void){
unlink(SERVER);
pid_t chpid;

if ( (chpid = fork()) == (pid_t) -1 ) {
fprintf(stderr, "%s: fork(2)\n", strerror(errno));

exit(1);

} else if ( chpid == 0 ){
/* child */
printf("child start...\n");

sleep(5);

printf("child send msg 55555\n");
debug("55555");
printf("child send msg 666\n");
debug("666");
}else{
/* parent */
printf("parent start...\n");
int fd = openMsgSocket();
//int fd=5;

printf("parent open socket\n");

while(1){

int client_socket_fd;
struct sockaddr_un client_name;
int client_name_len;
int i;
char msg[512];

client_socket_fd = accept(fd, &client_name, &client_name_len);

if(client_socket_fd != -1){

if(i = read(client_socket_fd, &msg, sizeof(msg)) > 0){
printf("parent get msg %s\n", msg);
}
close(client_socket_fd);
}

}
}
return 0;
}

要注意的是,server端因為沒有使用select機制,會導致CPU利用率100%。如果真得要使用,請加上select機制。


參考資料:
[1] GNU C

2011年8月7日 星期日

Alice: Madness Returns

動作類型。

這遊戲最可取的地方就是美術風格,還有 Alice會一直換可愛的衣服,我承認我是被這樣的風格吸引而去玩的。

而最失敗的地方是遊戲性,一直重複的關卡,還有從頭到尾的跳跳樂,老實說我還挺失望的。要收藏的許多支線要素,讓我浪費了不少時間順道去拿,最後也是沒有收集完就是了。

此外,遊戲的英文用詞好難,且對話之間大多不連續,我其實都不知道在演什麼!

如果關卡冗餘設計能再刪減許多,才會比較好玩吧~。

alice-madness-returns-cover-art

2011年8月4日 星期四

C#簡單的對稱加解密

這是參考自Jeff隨手記。我將他稍作修改可以讓Key與initial vector可以直接吃字串。解密失敗時會產生exception,可以作為檢測該密碼是否合法。

        public string EncodeString(string EnString){
byte[] Key = Encoding.UTF8.GetBytes("xxxxxxxx");
byte[] IV = Encoding.UTF8.GetBytes("yyyyyyyy");
byte[] b = Encoding.UTF8.GetBytes(EnString);   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform ict = des.CreateEncryptor(Key, IV);
byte[] outData = ict.TransformFinalBlock(b, 0, b.Length);
return Convert.ToBase64String(outData);
}
        public string DecodeString(string DeString){   byte[] Key = Encoding.UTF8.GetBytes("xxxxxxxx");
byte[] IV = Encoding.UTF8.GetBytes("yyyyyyyy");
byte[] b = Convert.FromBase64String(DeString);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform ict = des.CreateDecryptor(Key, IV);
byte[] outData = ict.TransformFinalBlock(b, 0, b.Length);
return Encoding.UTF8.GetString(outData);
}

資料來源:
[1] 對稱式加解密 C#

2011年7月28日 星期四

可愛的日文字體

因為要做一些圖片,所以前陣子上網survey了日文字體。

 

Maniackers Design Font
裡面有很多設計很棒的日文字體。我很喜歡。可惜的是好像沒有連漢字一起設計,只有純假名。
http://www2.wind.ne.jp/maniackers/designfont.html

Cute Japanese font for download
http://www.jay-han.com/2007/09/21/cute-japanese-font-for-download/

2011年7月26日 星期二

Panasonic QE-PL201

QE-PL201是支援qi無線充電技術的電池尿袋。原本是Sanyo的牌子,後來被Panasonic併掉。除了尿袋,還有小巧可愛的充電版(QE-TM101-W)。


http://ctlg.panasonic.jp/product/info.do?pg=04&hb=QE-TM101-W

現在kakaku查到的價格要3980日幣,好像也沒很貴。有機會弄來玩玩好了

2011年7月7日 星期四

Linux shell script tutorial

因為最近程式需要用到shell script,以前又沒有好好學,所以找了網路上的教學硬K。

發現了幾個不錯的網站,在這邊紀錄。

Linux Shell Scripting Tutorial v1.05r3 A Beginner's handbook
http://www.freeos.com/guides/lsst/index.html
從很基礎開始,當作handbook也不錯。

Steve's Bourne / Bash shell scripting tutorial
http://steve-parker.org/sh/sh.shtml
很簡略的教學。

2011年4月16日 星期六

graniph

http://www.graniph.com/index.html

如果你喜歡一些有趣的T桖,那麼graniph是不錯的選擇。

我印象比較深刻的是Sanrio明星圖案的T,裡面不是普通的把kitty,melody圖案印上而已,而是有許多逗趣的造型,讓人覺得這不只是個T而已。另外,還有Snoopy的樣式可以選擇。

台灣目前是有三間分店,但是價錢跟款式相比,我還是不覺得很優。如果日幣走低的話,直接代購是比較好的選擇。

決定了!下一間就是買她。

2011年3月23日 星期三

[360] Marvel Ultimate Alliance 2

動作類。

之前曾經在wii上有玩過1代,那時候對這遊戲的印象就是畫面挺爛的,用力扁敵人就是。不久後來到了二代,這遊戲的理念也是跟之前一樣,狂扁就是了。

這代的人物還是挺多的,可是好像沒有了像一代一樣的角色升級系統。所以首要目標就是要人物對話選像要選對。是的,裡面有像AVG一樣的對話選項。只是英文太爛,不知道裡面的梗以及人物之間的關係,總是亂選。但我覺得這一切都不重要,把敵人打倒就是了。

畫面老實說有時覺得挺爛的,有時還不錯,場景就一直repeat類似房間就完成一關那種。如果開機一直打下去可是很膩的。

跟rako花了一年時間斷斷續續把他給通關的,遊戲時間很長,非常值回票價。

imgres

[360] 魔人傳說- 失落的帝國

ACT動作類型。

如果僅僅把它當作一般第三人稱的動作遊戲,那就是太小看他了。其實他是不折不扣的解謎遊戲。這遊戲把地圖劃分成許多小區域,每個區域都蘊藏著謎題。有的是需要特殊機關才能打開門,有的是需要運用能力才能拿得到的寶物。如果想當成動作類,主角弱到連個最普通的敵人都很難打死,需要靠的是主角的搭檔-魔人,以及利用地形的一些優勢,才可以痛扁敵人。

畫面來說其實還好,沒有說很精細。但魔人的配音以及動作還蠻逗趣的。遊戲中提示我覺得有點不太夠,有時候因為不知道該怎麼過而氣得想折斷手把,結果最後才發現需要很簡單的特殊操作就可以完成。

如果下班玩的話,還是不建議玩這款。應該玩有如三國無雙的割草遊戲才爽快呀!

imgres

2011年2月7日 星期一

[PS3] God of War 1

動作類。

破完3代之後,理所當然就要入手戰神HD重製版來玩玩看。畫面表現上,物件是變HD,但是材質還是跟以前一樣很單調。有些過場動畫不是即時運算,錄製的影片沒有換成HD,導致落差感很大,非常傷眼呀!

操作仍舊非常流暢。在開啟門時需要連打R2,PS3上R2是變成像360一樣trigger類比按鍵,一直這樣按真得很心疼手把。

故事真得很長,很驚訝那時候地圖設計就有顧及整個故事發展,不是走過就算了,而是會回來開啟不同的事件。

一代讓我留下時代的眼淚,已經漸漸無法忍受以前的老畫面了。

God_of_War_Collection_Cover

[PSP] God of War - Ghost of Sparta

動作類。

這款遊戲還是延續一代(奧林巴斯之鍊)在PSP上良好的操作跟流暢感,還有無縫讀取。玩起來覺得跟PS3版本沒啥兩樣。劇情說的就是奎爺要去救他自己的弟弟。

我自己認為,跟一代比起來,Ghost of sparta比較著重在室內或是有限的場景,一代比較有廣大的空間跟華麗的QTE。一切表現得很到位,但是少了點驚豔感。

我選Easy模式,約6小時破關,長度很夠。

PSPcoversheet_108

2011年1月31日 星期一

簡單的自動登入網頁 in C#

公司裡面使用網路需要登入認證網頁作認證。但是我不想每天都要輸入認證密碼,想要電腦自動去認證。在C#中,做到這樣的事其實很簡單。使用WebBrowser類別就可以達到模擬登入的效果了。

首先我們看網頁長怎樣。下圖是一個很典型的登入畫面
image

首先要知道網址在哪裡。將WebBrowser指向這個網址。

webBrowser1.Navigate(http://10.10.10.1/);

待網頁讀取完後,就在WebBrowserDocumentCompleted事件裡面去讀取網頁的內容。在這裡需要一點html的知識。先確認Username、Password跟Login元件的name。你應該可以找到類似這樣的html。

<p><label for="login">Username</label><br/>
<input id="user_login" name="username" size="30" type="text" /><br/></p>
<p><label for="password">Password</label><br/>
<input id="user_password" name="password" size="30" type="password" /></p>
<p><input class="button" name="commit" type="submit" value="Log in" /></p>

有了name就好辦了。

在WebBrowser裡面,可以針對name把該元件提取出來,並作一些動作。我們可以把要登入的資料寫進裡面。

HtmlElement username = webBrowser1.Document.All["username"];
username.InnerText = "David";

HtmlElement password = webBrowser1.Document.All["password"];
password.InnerText = "@#Fae@r";

接著模擬按下按鈕的行為。
HtmlElement commit = webBrowser1.Document.All["commit"];
commit.InvokeMember("click");

執行一次,試試看可不可以動吧~。使用WebBrowser好處是可以幫你處理掉一些安全認證問題,如果用socket方式寫的話,遇到SSL就頭大了。其他工具的話,AutoIt也可以達到類似的效果。

參考資料:
[1] Automated Web button click in WebBrowser control

2011年1月30日 星期日

Painting Your Own Tabs - Second Edition in C#

C#裡面,GUI預設的TabControl組件只提供少少的樣式可以選擇。如果想要有Chrome或是IE8樣子的TabControl,就必須自己覆寫TabControl。由於覆寫太麻煩了,在Code Project上剛好有人提供了這些現成的方式。

http://www.codeproject.com/KB/tabs/NewCustomTabControl.aspx

套用起來就可以像下面這樣。當然X按鈕也是它內建的。
image

建議下載DLL檔案並且把它放在References。並在自己設計GUI的ToolBox中加入這個組件。

不過我在使用拖拉GUI上遇到了困難。只要畫面上一擺放它的TabControl,整個畫面就會變得很不正常,甚至設計GUI的畫面不能使用。在執行作者提供的DEMO project也是會有這種情況發生。

後來沒有找到解法,只有迂迴的方法,那就是不要在自己的ToolBox上新增。一切用手工打造程式碼。

this.tabControl1 = new CustomTabControl();
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(708, 377);
this.tabControl1.DisplayStyle = System.Windows.Forms.TabStyle.Chrome;
this.tabControl1.DisplayStyleProvider.ShowTabCloser = true;
this.tabControl1.TabIndex = 0;

this.panel2.Controls.Add(this.tabControl1);

自己手動加入panel2中。這樣設計GUI的畫面就不會爛掉了。

2011年1月16日 星期日

偵測.Net版本程式

.NET Version Detector X提供存在電腦中各.Net版本的偵測。貼心的是,還有提供下載網址供安裝。

詳細:http://www.asoft.be/prod_netver.html

image

2011年1月4日 星期二

System tray program in C#

C#創建一個含有system程式是非常簡單的。步驟如下。

1. 建立一個windows form程式。

2. 從Toolbox上拖曳一個Notify Icon到windows form上。由於Notify Icon沒有實體,所以就會落在下方的灰色地帶。
image

3. 調整Notify Icon的Text屬性,還有顯示的icon。注意,如果沒有設定icon的形況下,執行時在system tray是不會出現icon的。

4. 接著想要在system tray上按右鍵出現表單,從ToolBox上拖曳ContextMenuStrip到windows form上。ContextMenustrip上就自己新增選項跟事件。
image

5. 回到剛剛的Notify Icon,在Context Menu上加入剛剛的ContextMenuStrip。
image

6. 最後的樣子應該會長這樣。編譯後就會出現了。
image

如果你想要讓你的主視窗按下X後自動隱藏,你可以使用下面程式碼。

private void Form1_Resize(object sender, System.EventArgs e){
   if (FormWindowState.Minimized == WindowState)
      Hide();
}

若要顯示,可以使用Show()這個方法。

如果你的主視窗是用Application啟動,那麼Hide()可能會失效。你可以改用

this.ShowInTaskbar = false;
this.WindowState = FormWindowState.Minimized;

使用下面的程式碼就可以讓視窗回復

this.ShowInTaskbar = true;
this.WindowState = FormWindowState.Normal;

參考資料:
[1] C# Tip: Placing Your C# Application in the System Tray