發表文章

目前顯示的是 2012的文章

變更整合 Skype 後的 MSN 別名

圖片
原本 Skype 的聯絡人,可以按滑鼠右鍵 " 修改名稱 ",但匯入的 MSN 聯絡人卻無此功能。原來要把聯絡人打開,在名字的右邊有一個隱藏的 " 編輯 " 功能,按下去就可以修改了,藏得真好啊! 這樣總算可以 "正名" 了,不然聯絡人上面一堆 !@#$ 的名字,都不曉得誰是誰了 PS : MSN 修改後的別名似乎只存在 Local 端,在別台電腦還得再改一次才行 資料來源: 將MSN聯絡人匯入Skype中(名單群組|新增別名|傳送檔案)

智力測驗分享

有點像數獨,當初 Interview 時卡好久,等了好幾天都沒消息,所以決定把它公開了! 在飛機場的餐廳中,坐著四個不同國籍的旅客甲、乙、丙、丁。 他們每個人都會講英、法、德、日四種語言中的兩種 ,但是 這四個人沒有一種共同的語言 , 只有一種語言是三個人都會講的 , 沒有一個人既會講法語又會講德語 , 乙雖然不會講英文 ,但 當甲和丙對話時卻能充當它們的翻譯 , 乙會講德語 , 丁一點都不會德語 , 但是 甲和乙交談的很好 , 乙、丙、丁三人無法用一種共同語言交談 ,請問他們個人都會講哪兩種語言?

小小的 copy 大大的學問

平常都是直接在電腦上寫程式,結果面試的時候要在紙上寫,還真的寫不太出來。因為都習慣線上查資料,所以參數都沒有背,所以拿回家 compiler 後果然一堆錯誤,不是參數位置放錯,不然就是個數不正確。 以下是修改過的版本,錯誤檢查是一定要的,比較特別的是 fread  跟 fwrite  的第 2 & 3 個參數,其中第 2 個參數是 size,第 3 個參數是個數,而傳回值是成功讀取或寫入的個數而非 size。我原本的寫法是 length = fread(buf, sizeof(buf),1 , fp) 成功時 length = 1,但最後一筆不滿 buf size 的就讀不到了,所以才改成 length = fread(buf, 1, sizeof(buf) , fp) 這樣 length 就傳回實際讀到的長度了,不過不曉得有沒有影響效能就是了

重建 BeagleBoard-xM Angstrom

圖片
自從開始玩 BeagleBoard-xM  後,SD 卡不曉得被我毀掉幾次了 (原廠建議這一塊不要動,另外拿一塊新的 SD 卡來實驗,不過我沒有多的,只好 ...)。有幾次雖然有載入 Angstrom,HDMI 也有畫面輸出,LED 也是一直閃,但卡在登入畫面一個多小時 (Console 顯示 Uncompressing Linux...),實在是沒耐性就把它給關了。

Read Beagle Board xM RS-232 Serial output

環境設置 Beagle Board xM 使用 OTG USB 供電 Beagle Board xM RS-232 Serial output 連接到電腦 USB to COM 軟體修改老師的 ext_uart.c 如下

getfile

圖片
實現 getfile <ipaddr> <source filename> <destination filename> 例如 ./getfile 127.0.0.1 /etc/passwd passwd 顯示 成功 GET Success (12345 bytes) 失敗 Error! 參考 ch7/file ch7/wrapper/tcputils.c

Character bitmap with signal

圖片
#include <stdio.h> #include <signal.h> #include <unistd.h> //how_bitmap函式可將二維陣列的值輸出,輸出方式:當bit為1時輸出’*’,0輸出空白 //字元’ ’,每處理完2個byte輸出換行'\n' void update_time(int sig); char array[2][30] = { { 0x08,0x20,0x08,0x24,0xfe,0xfe,0x08,0x20, 0x00,0x00,0x08,0x20,0x04,0x40,0x04,0x40, 0x02,0x80,0x01,0x00,0x02,0x80,0x0c,0x70, 0x30,0x0e,0xc0,0x04,0x00,0x00 }, { 0x20,0x20,0x51,0xfc,0x88,0x88,0x00,0x50, 0xfb,0xfe,0x22,0x22,0x22,0x22,0xf9,0xfc, 0x21,0x24,0x21,0x24,0xa9,0x24,0x71,0x2c, 0x20,0x20,0xf8,0x20,0x00,0x00 } }; void update_time(int sig) { static int i = 0; static char *ptr = (char*)(void*)array; // change to one dimention char array int j,k; if (i < sizeof(array)) { for (j=0; j<2; j++) { for (k=7; k>=0; k--) { printf("%c", ( *(ptr+i) & (1 << k) ) ? '*' : ' ');

Character bitmap

圖片
#include <stdio.h> //how_bitmap函式可將二維陣列的值輸出,輸出方式:當bit為1時輸出’*’,0輸出空白 //字元’ ’,每處理完2個byte輸出換行'\n' void show_bitmap( char (*a)[30] ,int row); char array[2][30] = { { 0x08,0x20,0x08,0x24,0xfe,0xfe,0x08,0x20, 0x00,0x00,0x08,0x20,0x04,0x40,0x04,0x40, 0x02,0x80,0x01,0x00,0x02,0x80,0x0c,0x70, 0x30,0x0e,0xc0,0x04,0x00,0x00 }, { 0x20,0x20,0x51,0xfc,0x88,0x88,0x00,0x50, 0xfb,0xfe,0x22,0x22,0x22,0x22,0xf9,0xfc, 0x21,0x24,0x21,0x24,0xa9,0x24,0x71,0x2c, 0x20,0x20,0xf8,0x20,0x00,0x00 } }; void show_bitmap( char (*a)[30] ,int row) { int i, j, k; for (i=0; i<row; i++) { for (j=0; j<30; j++) { for (k=7; k>=0; k--) { printf("%c", ( a[i][j] & (1 << k) ) ? '*' : ' '); } if ( (j % 2) == 1 ) // new line every two bytes { printf("\n");

qsort without move

圖片
使用 qsort 排序字串陣列,輸出按字典排序方式輸出,但排列完成後,原始陣列內容不可改變 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define length (sizeof(string) / sizeof(string[0])) char string[][12] = { "Linux", "programming", "Embedded", "Android", "ittraining" }; static int cmpstringp(const void *p1, const void *p2) { return strcmp(*(char * const *)p1, *(char * const *)p2); } int main() { char* stringindex[length]; int i; // copy pointer for (i=0; i<length; i++) { stringindex[i] = string[i]; } qsort(stringindex, length, sizeof(stringindex[0]), cmpstringp); printf("\nSorted data:\n"); for (i=0; i<length; i++) { printf("%d = %s\n", i, stringindex[i]); } printf("After qsort, origonal array:\n"); for (i=0; i<length; i++) { printf("string[%d] = %s\n", i, string[i]); }

Padding file

對任意讀入的檔案進行 padding Padding rule:以 1M, 2M, 4M ... 二的倍數去 padding  顯示補了多少 Bytes 的資料 操作方式:./padding <file> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main(int argc, char *argv[]) { int fd; struct stat filestat; off_t alignmentsize; if (argc != 2) { printf("padding <filename>\n"); return 0; } // open file fd = open(argv[1], O_RDWR | O_EXCL); if (fd < 0) { printf("%s\n", strerror(errno)); return 0; } // get filesize fstat(fd, &filestat); if (filestat.st_size >= (1ul << 31) ) { close(fd); perror("File great than 2GB, it can not padding."); return 0; } // check alignment size alignmentsize = 1; while (filestat.st

Windows 7 開啟 Administrator 帳戶

圖片
通常使用 Windows 的時候,為了安全性的考量,會將帳戶設定為一般使用者,但必須要有一個系統管理者的條件下才能設定。 以前我不知道有一個 Adminstrator 的帳戶被停用了,直到今天要建的時候才發現 Windows 7 不讓我建,原因是名稱重覆了,才意外發現這個狀況。 於是就照著 一點通 - Windows 7 啟用系統管理員 Administrator 帳戶 (MVP 撰寫) 的說明將帳號啟用了 以系統管理員的身份執行 命令提示宇元 輸入 net user administrator /active:yes 即可 那 Windows XP 呢?它原本就有 Administrator 了,但只要一建立其它使用者,它就隱藏起來,而且新的使用者也無法改成一般使用者。 解決方法也很簡單,直接到 控制台 | 系統管理工具 | 電腦管理 ,打開 本機使用者與群組 | 使用者 ,將該使用者的 成員隸屬 移除 Administrators 群組 就可以了。 參考: XP的使用者帳戶問題~~請大大幫忙

PIC 中斷程式寫法

圖片
程式碼的框架如下 #include < myapp.h > void HISR(); // 高優先權中斷服務常式宣告 void LISR(); // 低優先權中斷服務常式宣告 #pragma config PBADEN = OFF // 將 Port B 類比輸入的功能關閉 // 設定為數位輸入 #pragma code P008 = 0x000008 // 將高優先權中斷服務常式的位置固定在 0x0008 void P008(void) { _asm goto HISR _endasm; // 因空間有限,故跳到實際的中斷服務常式 } #pragma code P018 = 0x000018 // 將低優先權中斷服務常式的位置固定在 0x0018 void P018(void) { _asm goto LISR _endasm; // 跳到實際的中斷服務常式 } #pragma code // 固定程式碼結束標記 #pragma interrupt HISR // 宣告此函式為中斷服務常式,會自動保存暫存器 void HISR() // 並以中斷的方式返回 (重啟 GIE) { CLR(INTCON,BIT1); // 清除中斷旗標 } #pragma interruptlow LISR void LISR() { CLR(INTCON,BIT1); } void main() { SET(INTCON, BIT7 | BIT6 | BIT4); // 初始化 INT0 中斷 while (1) { } }

PIC 中斷觀察

圖片
今天來觀察一下中斷的工作方式,先到 Debugger | Select Tool | MPLAB SIM 選擇軟體模擬的方式,然後開啟 View | Program Memory ,照以下的說明輸入組合語言程式來觀察一下吧

PIC18x Timer 分享 IV

圖片
這一次我們就來看看 CCP1 的輸出功能

【未解決】如何在 Google Blogger 中貼程式碼

圖片
原來是用 CSS 的方式,不是很懂,就記錄一下步驟吧 按 設計 進入範本

PIC18x Timer 分享 III

圖片
經過 Timer0 的洗禮,會不會覺得 8-bit 的計數太 Low end 呢?還得自己數 125 次才能得到 1ms。接下來讓我們看看 Timer1 + CCP 模組的威力吧! PIC18F4520 Data Sheet (Page 130)

PIC18x Timer 分享 II

圖片
在繼續之前,我們先來看看上次的討論

PIC18x Timer 分享 I

圖片
今天課程的重點是 PIC Timer 的介紹,首先我們來觀察一下 Timer 是怎麼一回事呢?

myapp.h

圖片
#ifndef __MYAPP__ #define __MYAPP__ #include <p18f4520.h> #define BIT0 (1) #define BIT1 (1 << 1) #define BIT2 (1 << 2) #define BIT3 (1 << 3) #define BIT4 (1 << 4) #define BIT5 (1 << 5) #define BIT6 (1 << 6) #define BIT7 (1 << 7) #define SET(reg,b) reg |= (b) #define CLR(reg,b) reg &= ~(b) #define TGL(reg,b) reg ^= (b) #define GET(reg,b) (reg & (b)) typedef enum { FALSE, TRUE } BOOL; // 2012/10/18 add typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned short long uint24; typedef unsigned long int uint32; typedef char int8; typedef int int16; typedef short long int24; typedef long int int32; #endif // __MYAPP__ 由於這是一個共用的標頭檔,建議把它放在專案一個固定的目錄下,例如 D:\PIC18\Include ,則 PIC18 底下的其它專案要引用只要設定 Include 路徑 就可以了,就樣就可以只維護一份最新的,而不用每個專案都要 Copy 一份了 開啟專案後,點選 Project | Build Options | Project ,選擇 Include Search Path ,新增一個 ..\include 即可。這裡用相對路徑而不用絕對路徑是方便將專案移到其它位置時不用再修改一次。

MPLAB 使用心得

圖片
這是單晶片的第一個作業,裡面有一些軟體的操作技巧,所以就順便記錄一下。首先是程式需求: 使用 PIC18F4520 RC0 連接 SW1 (Normal Open),Active Low 動作 RC1 連接 Relay 控制電燈 (或其它電器),Active High 動作 按下 SW1 後電燈亮,Timer1 開始計數 Timer1 計數超過 100 時,將電燈關掉 PS : 這個電路圖是用 LTspice 畫的,因為很多零件找不到,所以就先用其它零件代替來示意了

電路模擬

圖片
我們都知道 PSpice 是一套不錯的電路模疑軟體,不過它並不是免費的,而且功能也太專業了。所以趁著今天上課,將老師使用的 LTspice 介紹給大家。 它是由 Linear Technology  所提供的軟體,目前的版本是 LTspice IV (2012/10/1 更新) 。安裝過程沒甚麼特別的,所以就不多說了。先來看看主畫面,跟著一步一步試試看吧!

【已解決】Rip CD 無法抓太多音軌

圖片
Asunder CD Ripper 碰到太多音軌的 CD 時,程式開啟後就當掉了,不曉得是音軌太多?還是 CD 有超燒的情況,所以只好換一個了 PS: 標準應該是 650 MB,先前碰過 96 軌的 CD 佔了 701.6 MB 的

[已解決] Rhythmbox 音樂播放程式 無法啟動

圖片
最近突然心血來潮,想將音樂 CD 轉成 MP3 拿到車上聽,看看 Ubuntu 裡面的程式 Rhythmbox 好像還不錯,沒想到一執行畫面閃一下就不見了 於是再換一套 Banshee 媒體播放程式 ,結果還是一樣 : 一閃而過 難道是我系統的問題? (回家再驗證看看:家裡的也一樣) 先到安全模式去執行 (排除顯示卡 Driver 的問題) : 還是不行 網路搜尋了半天還是沒找到解決的辦法,不過無意中看到可以在 終端機 下執行程式看看

【已解決】網路的怪問題

家裡有一台電腦是透過 AP LAN port 上網,但奇怪的是: Ubuntu 可以正常連線 (AP 指示燈有亮) Windows XP 就不行 (AP 指示燈沒亮) 後來發現在開機時 AP 指示燈不會亮,要進入 Ubuntu 之後才會亮,但離開 Ubuntu 時指示燈又會熄掉。表示 網路是在 Ubuntu 下被開啟 的。那 Windows XP 先前為甚麼可以用呢?(為此我還重灌 Windows XP 呢!) 另外我還試過直接接到 ADSL Modem 甚至更換網路線,但在 Windows XP 下還是偵測不到網路連線,怪哉! 後來在利用 Ubuntu Live CD  重建 GRUB 時意外發現, 它會開啟網路連線,而且在離開後不會關閉 ,此時進入 Windows XP 就可以正常連線了。更詭異的是,在電腦關機的狀態下,開啟 AP 也能偵測到連線,為甚麼?(主機板有 Standby 電源的關係嗎?回家試著把 PC 電源關掉看看。 沒錯,PC 電源關掉的話,AP 的指示燈就不會亮了 ) 此後進入 Windows XP 網路連線就沒問題了,直到再一次進入 Ubuntu 被關閉後才不行。這時只好再一次用 Live CD 開機了! 我的疑問: 我的主機板很舊,是否路網路線是否 跳線 有關係? 連線偵測是在 AP?還是主機板的網路? 設定是永久性的?(不會因為關機而消失) 是否可以寫一個程式在 Windows 下設定? 這樣就不需要 Live CD 了 2012/7/30 原來關鍵就在 Wake on Lan,搜尋 " Ubuntu Wake on Lan " 找到 HOWTO: Set your system up for Wake On LAN (WOL) ,只要 sudo ethtool -s eth0 wol g 就可以了。原本還以為要照論壇中的說明將 Script 加入開機流程中,結果只要設定一次就可以了。讚!

小小網站搬家記

圖片
原本家中一個小小的網站,現在決定搬到外面獨立,於是我找了一些免費的 ASP.NET 網路空間,最後決定 Somee.com – 免費ASP空間,支援MS Access / FTP 立即啟用! 基本上註冊完一天後就可以用了,它支援 FTP Access (上傳網站用) ASP.NET v1.1-4.0 AJAX v1.0, 3.5 (用不到) Silverlight (用不到) MS Report Viewer 2005, 2008 (取代原本的 Crystal Report) MS Access 2003, 2007 (存一些簡單的資料庫) MS SQL 2005 Express (存放 Membership) 還有一些林林總總的就不列出來,以上就以經夠我用了。 以下是搬家過程中碰到的一些問題,特別記錄一下,以備將來之用

Windows Live Mail 奮鬥記

圖片
公司的 NB 用的是 Windows 7 專業版 64-bit 的版本,使用到目前為止一切安好,除了 Live Mail 三不五時給我當機,有時是收 e-mail 收到一半就沒有回應,但 HD 還是一直在轉,有時甚至看 e-mail 也會沒有回應,天啊

Ubuntu 11.10 的點點滴滴

把視窗放大、縮小的按鈕移到右邊 安裝 gconf-editor 點選 apps | metacity | general | button_layout 將 close,minimize,maximize:  改成 menu:close,minimize,maximize  即可 (注意冒號的位置) 開關機的按鈕不見了? 看看  外觀  的設定是不是選到 HighContrast or HighContrastInverse 是的話,改回 Ambiance or Radiance 就可以了 如何查硬碟的 UUID? 到 /dev/disk/by-uuid 用 ls -l 查看就可以了

ASP.NET Membership 重置密碼

ASP.NET 的使用者密碼有 加密 以及 安全性問題 兩道防護,所以如果使用者忘記密碼,同時也忘記安全性問題的解答,那 MIS 也神仙難救了 (註 1)。 通常使用者在註冊的時候會被要求輸入 明碼的 Password ,然後系統會隨機產生一個 密錀 Salt ,經過 MD5Sum  的運算產生 暗碼的 Password 。最後會將 Salt 與暗碼的 Password 存入資料庫,因為 MD5Sum 的運算是單向不可逆的 (註 2),所以即使駭客取得暗碼的 Password,也無法反推出原本的 Password。 同時為了讓使用者忘記密碼時,可以自行取回密碼,所以有了 安全性問題與解答 ,其中安全性問題是用來提示的,而安全性解答則與 Password 相同的方式,使用 同一個密錀 Salt  加密後,存入資料庫。因此當使用者忘記密碼時,會收到安全性問題的提示,然後被要求提供解答,如果解答不正確,當然就無法取回密碼了 (因為 MIS 也看不到問題的解答啊 ...)