2014/12/27

[Peregrinate] 日本東京Tokyo 皇居こうきょ 慢跑

本來應該是邊跑步,然後多拍一些皇居的照片的。但無奈的是手機拿去當GPS跑步用了,還沒有買GPS錶,在國外跑步好吃虧呀!只能用一張東京車站照片當代表了。

2014/12/06

[Android] 利用AsyncTask和Progressbar來做APP起始畫面(SplashScreen)

許多的程式都會擺上自家的品牌Logo,做成所謂的起始畫面(Splash Screen),除了可以邊讀取資料之外,也算是幫自家廣告。那麼起始畫面要怎麼來實作呢?

分成幾個部分,負責起始畫面的SplashScreenActivity,用AsyncTask產生ProgressBar效果的SplashScreenAsyncTask,完成之後切換到主要畫面的MainActivity。


[Android] 利用AsyncTask和ProgressDialog來做Activity之間切換的效果

通常在APP在下載資料或者切換到另外一個畫面時,常常會需要等到資料載入完成後,才能夠切換畫面。這時候可以做一個ProgressDialog的效果,讓使用者知道目前的下載進度。

所以利用AsyncTask來控制ProgressDialog,以及切換到下一個Activity,就可以完成這樣一個切換Activity之間的效果。

2014/11/12

[Linux] Static Library和 Dynamic Library編譯

在Linux下編譯靜態連結函式庫(Static Library)和動態連結函式庫(Dynamic Library),兩者的差別是靜態函式庫是把整個Library包進去執行檔,因此可以保證到不同機器環境下執行,也不會因為少了這個函式庫導致無法執行檔案,但其缺點是檔案會比較大,假如大部分檔案都需要用到相同的函式庫,但全部都使用靜態連結的方式,那這樣非常的佔空間資源;而動態連結函式庫的好處,就是可以讓多個執行檔案,同時連結使用,可以減少佔空間,但是卻容易發生如果Library的版本不同,會導致連結執行錯誤。

兩者各有優缺點,要端看環境軟體和設定需求,來選擇編譯的方式。譬如檔案共用的多而且函式庫常見,那就要採用動態;少數檔案使用,或者函式庫較稀有,那就採用靜態設計。

2014/08/29

[ezXML] 簡單好用的XML Parsing C Library

XML格式檔案不管在寫程式或者網路上傳輸參數設定,都很常使用。這邊介紹一個簡單的XML Parser,可以用來取出每個參數的值,提供程式做參數設定使用。網站請參考,這次使用的版本是ezxml-0.8.6.tar.gz

2014/08/22

[OpenSSL]利用PEM_write_bio_RSAPrivateKey()來把DER格式轉換成PEM

上一篇([OpenSSL] 利用PEM_write_bio_X509()來把DER格式轉PEM格式)利用程式碼把Certificate轉乘PEM的格式,而這篇則是要把Private Key來轉換成PEM格式。

首先,把PEM的格式先轉換成DER。
openssl rsa -inform PEM -in private_key.pem -outform DER -out private_key.bin

[OpenSSL] 利用PEM_write_bio_X509()來把DER格式轉PEM格式

Certificate及Key pairs檔案有很多種格式,有興趣可以參考這篇

這篇的目的是,格式上的轉換,除了用OpenSSL的指令來轉換之外,也可以用C函式來轉換,底下是用PEM_write_bio_X509()來把Certificate從DER格式轉換成PEM格式。

2014/07/19

[miniupnpd] miniupnpd 的 uPnP daemon使用

除了上一篇的uPnP client之外,更常使用的應該是uPnP的daemon,讓每個電腦和嵌入式裝置可以發出SSDP的Notify和M-Search Reply來確認目前聯結的網路裝置有哪些,以及具備哪些功能。

[miniupnpc] 在Windows下用MinGW編譯miniupnp client

網路上有很多open source的code可以使用,譬如以uPnP協定來說,就有一整套的miniupnp可以使用,不管是在電腦或者嵌入式系統上,都可以很方便的應用,網站參考

這次要利用MinGW,在Windows下的環境建置類似Linux的編譯環境,來讓在Windows下也可以編譯Linux的程式碼。首先,就要先安裝MinGW這套工具,由此下載

2014/06/27

[mongoose] HTTPs web server使用分享

上次分享的mongoose的HTTP web server,[mongoose] HTTP web server使用分享,除了架設一般的HTTP連線之外,同時mongoose也suppot安全性SSL的連線,也就是HTTPs。

不過要使用HTTPs,就必須產生憑證給mongoose,才能夠利用這組憑證來加密。憑證產生的方式利用OpenSSL就可以做到。

首先先產生一組private key
openssl genrsa -out private.pem 1024

2014/05/20

[C/C++] 幾個容易搞混的指標pointer用法整理

1.pointer integer
int i, *pi;
i = 10;
pi = &i;
int *pi; --> 表示pi代表一個記憶體位址,*pi會取出這個記憶體位址所儲存之值
int i; &i --> 表示取出i所在的記憶體位址

2.pointer array
int list[5] = {0, 1, 2, 3, 4};
list代表list[0]所在的記憶體位址,所以透過指標*(list+i)就可以相當於取list[i]之值

[Linux] Build Linux i2c-gpio module 標準Linux i2c interface[bit-banging]

I2C是在IC之間,常被使用的data bus,而在目前的MCU之中,很多時候都會用GPIO來做模擬,也稱作bit-banging,而且Linux kernel也有support這個部分的driver,以下為研究的小心得:

詳細的I2C protocol可以參考

這次的I2C detail information:
7 bits address / not open-drain / 100kHz

2014/05/11

[Linux] 使用getnameinfo()來get local IPv6 address及用mask比較subnet

IPv6會是未來使用IP address的趨勢,所以嘗試使用getnameinfo來拿到本機的IPv6位址,並且跟其他的IPv6位址(fe80::19fb:8e1d:e1c:947e)比較,看使否在同一個子網域之下。比較的方式採用IPv6的位址與mask做完AND運算,得到Network ID後與另外一個IPv6的Network ID位址比較,因為無法一次比較128bytes,所以依次8個bytes一組,總共比較16次,16的結果都相同,就判定在同一個subnet之下。

IPv6為長度128 bytes的位址,表示的方式會以每16個bytes以符號分號":"隔開的方式來表示,譬如例子的"fe80:0000:0000:0000:19fb:8e1d:e1c:947e",總個128bytes,然後連續0的地方可以用連續兩個分號"::"來表示,所以就變成"fe80::19fb:8e1d:e1c:947e"。

2014/04/26

[Windows] Windows 8.1升級和跳過動態磚首頁

一開始拿到Windows 8的電腦,由於並非螢幕都是觸控,因此在使用Windows 8,可能就沒有那麼的順手。好加在Windows 8可以升級成Windows 8.1,除了擁有開始鍵之外,還能夠跳過動態磚,讓一開始登入的畫面就是傳統的桌面。

但是,在開心拿到Windows 8的電腦,要去市集下載更新的時候,會發現找不到Windows 8.1,查了一下,發現是因為Windows 8沒有更新些套件,因此在市集找不到Windows 8.1。參考官網說明

2014/04/25

[mongoose] HTTP web server使用分享

網頁server已經是現在不可或缺的一部份了,網頁的連線都要透過HTTP web server來處理,包括提供多連線的能力,簡單的HTTP web server可以參考[Java] Web Server撰寫這篇。

不過這次來介紹網路上提供open source的HTTP web server:mongoose的使用介紹。不僅可以在多個作業系統上使用,包括Linux、Mac和Windows,而且是open source,提供使用者自己去修改內容。網站參考mongoose download

這次使用的版本是mongoose-3.7.tgz,在Ubuntu 12.04下的環境使用

下載之後放在Ubuntu底下,然後解壓縮

2014/03/18

[Linux] 連續記憶體分配策略(Contiguous Memory Allocation)

作業系統的記憶體管理,可以分成採用連續記憶體分配(Contiguous Memory Allocation)和採用分頁(Paging)技術。採用連續記憶體分配,方法簡單且速度快速,但缺點在於容易產生剩餘的記憶體片段(Fragmentation),記憶體的使用效率並不好,為了解決此現象,因此採用記憶體分頁的方式,來提升記憶體的使用率。

而在連續記憶體分配,有三個最常見的演算法,最先適用(first-fit)、最佳適用(best-fit)和最不適用(worst-fit)。底下舉特考的例子為例:

(102調查局特考_計算機概論)
五、記憶體的配置策略(Storage Placement Strategies)是用以決定進來的程式或資料應置於記憶體的那一區域。其策略包含最不適用(worst-fit)、最佳適用(best-fit)和最先適用(first-fit)等。 
(一)請說明上述三種策略(最不適用、最佳適用和最先適用)在比較之下,各策略的優勢為何?(10分)
(二)若目前記憶體分區(memory partitions)狀況依序為 490 KB,190 KB,290 KB及550 KB,而記憶體空間需求依序為400 KB,220 KB,120 KB及450 KB。請分別描述在最不適用、最佳適用和最先適用三種不同策略下的記憶體配置情形。(10分)

2014/03/16

[Linux] fork()的使用介紹

整個作業系統(Operating System, OS)是為了分配有限的硬體資源給Program使用,然而OS也視為一個Program,放進CPU中執行,為了讓OS Kernel辨識每個Process,就會有所謂的行程辨識元(Process Identifier, PID),其中特別的是PID 0和1,0是Kernel用來Swap,交換分頁使用;而1則是初始化行程,也是Kernel建立的第一個Process,其他的Process基本上都是透過PID 1的init Process來產生。因此整個OS系統本身可以想像成一個Tree of Processes,root為init Process,亦為Parent Process,然後用fork()依序產生底下的Child Process,並回傳值0代表是Child Process。

[Linux] Program, Process and Thread之差異

  • Program: code程式
  • Process: 正在CPU執行的Program
  • Thread: 使用CPU的最小單元,較為輕巧的process,一個process可以產生多的threadCPU是配給thread使用。


Thread存在有以下的目的:
(1) Responsiveness: 允許程式可以在被I/O中斷時,能夠繼續執行,譬如Web瀏覽器,可以同時看影片及下載檔案
(2) Resource Sharing: thread分享同樣的memoryresource,而process只能透過shared memorymessage passing的方法來分享資料
(3) Economy: threadprocess輕巧,創建和context switch thread比創建一個process來的快速
(4) Scalability: 可以平行執行於多核心的平台。


總結來說,寫好的code稱作為Program,放到CPU中執行就變成Process,但Process可以使用多的Thread代表的CPU執行單元,來增加執行效率。

2014/03/01

[OpenSSL] RSA非對稱型加解密演算法

RSA為目前在電子商業網路上很常用的加解密演算法,其安全性依靠因數分解,因為對極大整數做因數分解是很困難且花時間的,一般都會採用RSA numbers來產生公鑰(Public Key)和私鑰(Private Key),目前大多採用1024bits2048bits

公鑰和私鑰的產生
1.      隨意選擇兩個大的質數pqp不等於q,計算N=p*q
2.      根據歐拉函式,求得r= φ(N) = φ(p)φ(q) = (p-1)*(q-1)
3.      選擇一個小於r的整數e,且與r互質。
4.      用以下公式計算d : d*e1 (mod(p-1)*(q-1))
5.      (N, e)為私鑰,(N, d)則為公鑰。

2014/02/26

[Linux] Ubuntu12.04下利用QEMU + chroot來編譯Linux Kernel (二)

參考上篇設定,利用QEMU執行Ubuntu,且連上網路。下載完Linux Kernel後,就可以準備來進行編譯Linux的Kernel了。細節可以參考這篇http://linux.vbird.org/linux_basic/0540kernel.php,目標是Ubuntu 12.04採用3.2版Kernel改成3.5版的Kernel。

查詢目前Kernel版本
\>uname -r

2014/02/20

[Linux] Ubuntu12.04下利用 QEMU + chroot來編譯 Linux Kernel

為了避免在編譯Linux Kernel的錯誤,把原本的Linux OS損壞。可以採用在原本的Linux中使用QEMU的Guset OS的Linux的環境來編譯Kernel,這樣就可以避免修改到原本的OS系統,細節可以參考這篇文章

不過照著教學的步驟,使用Ubuntu 12.04來設定QEMU和編譯可能會遇到一些問題,像是一開始安裝QEMU和KVM之後
$ sudo apt-get install qemu qemu-kvm
會發現其實在Ubuntu 12.04找不到qemu的指令

2014/02/13

[Android] 用WifiManager來get wifi的SSID, power level和所使用的channel基本資訊

***2017/01/06更新***
請參考 [Android] WifiManager for Android M or later
******

在行動裝置上最常用到的莫過於是網路了,其中因為Wi-Fi在很多政府機關、公共場所都是免費可使用的,因此Wi-Fi應該算得上是在行動裝置中很重要的一部分。

Android本身有提供WifiInfoWifiManager兩個類別提供我們來使用及控制Wi-Fi,除了可以開啟、關閉Wi-Fi之外,也可以取得目前的位置有哪些Wi-Fi網路存在、訊號強度如何,所使用的頻帶有否跟其他Wi-Fi網路重疊,也可以取得目前連線的Wi-Fi IP資訊、速度等資訊。

以下利用WifiInfo和WifiManager類別簡單的開發一個查詢目前周遭有哪些Wi-Fi網路,取得服務設定的識別碼(Service Set Identifie, SSID),並且回報最強的訊號是哪一個SSID,所使用的是哪個頻段(2.4G/5G)等等。

2014/01/16

[Android] Android Virtual Device path 設定

隨著Android版本越出越新,但其實還是有大多手機使用者是使用舊版Android,所以開發程式的時候就得載很多版本的Android來測試。

但偏偏Eclipse預設存在C槽,假設空間不夠大的話常常就會爆掉了。所以可以修改增加系統變數ANDROID_SDK_HOME,再把Eclipse重開就可以看到Android Virtual Device的路徑變成自己所設定的位置了。

設定新增系統變數 我的電腦->按右鍵->內容->進階系統設定->進階->環境變數->新增系統變數

[VirtualBox] Ubuntu Waiting for network configuration

工程師換新電腦最麻煩的事情就是要重架環境,假設不想重架可以直接用VirtualBox來開啟虛擬作業系統的vdi檔案,就可以直接執行了。

不過網路的設定上卻遇到了"Waiting for network configuration"的問題,Google了一下要做以下的設定修正

2014/01/11

[Java] 使用DatagramSocket類別來撰寫UDP網路程式

除了TCP之外,另外一種網路連線方式就是透過UDP。與TCP相較之下,UDP因為不需要連線,也沒有麻煩的重傳等機制,雖然在可靠度上不如TCP,但對於不要求每個byte都不能損失的資料型態,像是影音串流,就適合用UDP來傳送。

最有名的UDP程式的例子,非DNS(Domain Name Server)莫屬了,假設每個電腦要詢問網址的主機IP位址都要透過TCP建連線的話,在資源使用上是很浪費的,而且IP位址的封包資料並沒有很大,因此就很適合利用UDP來實作。