顯示具有 程式語言 標籤的文章。 顯示所有文章
顯示具有 程式語言 標籤的文章。 顯示所有文章

2017/09/13

[Linux] Ubuntu之中Inter-Process Communication 利用sd-bus (D-bus)來實現

上次討論過在OpenWrt之中的IPC服務ubus,所以這次要來探討更大的系統Ubuntu之中所使用的IPC,也就是D-Bus。關於ubus的使用,有興趣可以參考這篇


從D-Bus的Wiki可以看到洋洋灑灑的介紹,但是這裡想要討論的是關於D-Bus的各種Implementations。目前比較常看到的有libdbus、sd-bus和GDBus等等,大體而言這三個都有依照D-Bus的標準來實作,只是三者在函式實作的等級不一樣。


2017/05/12

[C/C++] Thread Pool的實作 及 pthread_create參數的傳遞

假設一個使用情境,今天有10個人,每個人從1-10之間拿一個數字,隨機順序的累加。

設計上,可以利用pthread pool的方式來實作,用struct的方式來綁定一個thread,包含人名及所包含的值。然後各thread去累加一個global的變數。



2017/04/08

[Swift] Could not fetch Error Domain=Foundation._GenericObjCError Code=0

有時候在iOS模擬器跑程式會看到這個錯誤
Could not fetch Error Domain=Foundation._GenericObjCError Code=0 "(null)", [:]

然後執行之後,就看到程式會閃退。

2017/03/02

[OpenWrt] Init Scripts之中開機順序的設定

根據官網的說明,我們是可以在OpenWrt中設定process在開機之後被帶起來的順序。


2017/02/24

[OpenWrt] 用dnsmasq在OpenVPN設計custom domain

在OpenWrt中,可以透過dnsmasq來設定custom domain,基本的設定可以參考官網

但是如果想要透過OpenVPN連線,也能夠使用custom domain的話,要如何設定呢?

2017/02/17

[OpenWrt] 用ubus實現Inter-Process Communication

OpenWrt依靠ubus來做所有的IPC,所以也就是說,我認為玩OpenWrt不能不懂什麼是ubus。


[OpenWrt] ubus_invoke()使用介紹

一直在網路上找不到詳細介紹ubus_invoke的資料;在研究OpenWrt一段時間之後,決定把一些心得記錄下來。

2017/01/06

[C/C++] 轉換hex string to int

如果想要把hex string轉換成integer,可以利用stroul()stroull()來達成。

但要注意的是轉出來數值的範圍
資料型態
最大值(Decimal)
最大值(Hexadecimal)
unsigned long
4,294,967,295
0xFFFFFFFF
unsigned long long
18,446,744,073,709,551,615
0x1999999999999999

如表格所示,如果hex string數值超過0xFFFFFFFF,就要用stroull()來轉換。

[Android] WifiManager for Android M or later

Android M之後,Google做了很多權限的管理,加上寫Android的工具也從Eclipse變成Android Studio之後,決定來更新WiFiManager的使用。

關於WiFiManager地說明可以參考 [Android] 用WifiManager來get wifi的SSID, power level和所使用的channel基本資訊

本篇主要就Android M以及使用Android Studio為基礎,利用原本的範例當修改。


2017/01/04

[Linux] shell script default values 腳本的變數預設值

如果我們要在腳本中,為變數設定預設值,可以透過"${a:-b}"的方式來設定

例如,設定變數$1之預設值為1492,則可以寫成
#!/bin/sh

mtu="${1:-1492}"
echo "$mtu"

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]之值