Archive

Archive for the ‘Other’ Category

使用 C# 呼叫 MATLAB Function

九月 10th, 2009

最近在寫一些演算法的程式,經常要在一堆程式和檔案切換來切換去的,跑完數據還要開 MATLAB 畫圖,一直重複這些動作實在是很麻煩,所以把它寫成 Windows Form 用滑鼠點一點就 OK 了,其中繪圖部份就要利用 C# 去 call MATLAB 來作,查了許多資料,發現有很多種方法,但比較簡單方便的應該是用 MATLAB Builder NE for .NET 將 MATLAB 程式編譯成 .NET 可執行的元件。

1. 首先準備好你要 compiler 的 M-file,測試的 M-file 如下(由檔案讀取 x, y 數據曲線圖):


function rmse(file)

data = load(file);
x = data(:,1);
y = data(:,2);

plot(x,y,'LineWidth',1);

xlabel('Iteration');
ylabel('RMS error');

2. 開啟 MATLAB 並在 command windows 輸入:deploytool
新建一個 project,名稱為 rmse。
New Project
選擇 .NET component
.NET component
將 M-file 加入,然後按 Build the project,編譯完成會產生 rmse.dll
Add file

3. 將 .dll 加入 Visual Studio 參考(Reference)
在方案總管右鍵選「加入參考」>「瀏覽」,將剛剛編譯完成的 .dll 以及 MATLAB 安裝目錄底下的 toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll 加入。

4. 加入 Namespace
using MathWorks.MATLAB.NET.Arrays;
using rmse;

5. 使用方式
Rmse demo = new Rmse();
MWArray fileName = @"rmse.txt";
demo.rmse(fileName);

demo 範例原始碼下載

※ 如果想在沒安裝 MATLAB 的電腦上執行,需安裝 MATLAB Compiler Runtime (MCR),檔案在安裝目錄的 toolbox\compiler\deploy\win32\MCRInstaller.exe,大小約 150MB

Other, 程式筆記 , , ,

Windows PPPoE 自動重撥 Script

七月 25th, 2009

隨著 ADSL 及經濟型光纖網路的普及,有許多人都會在自家架設 server 主機,但如果沒有用分享器而是直接透過 PPPoE 撥接上網的,就很怕網路突然斷線(如忘記繳錢被停掉),雖然說 Windows 內建的連線程式有一個「斷線後重新撥號」的選項,但其實並不好用。比較保險的作法是系統定期檢查對外連線的狀況(ping),一旦發現斷線就自動重新連線。

在網路上可以找到很多這種作法的 Linux 版本,如「Debian Linux: ADSL PPPoE 自動重撥 Script」,但相對 Windows 的討論卻很少,所以就自己寫了一個重撥的 WSH(Windows Script Host),搭配工作排程就可以達到目的。
※ 本方法適用於 XP 以後之 Windows。

Step 1:將下列程式存為 repppoe.vbs,修改連線資訊並放置在安全的地方


DIALNAME = "寬頻連線"              '連線名稱
DIALUSER = "12345678@ip.hinet.net" '連線帳號
DIALPASS = "xxxxxxxx"              '連線密碼

Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("ping www.hinet.net", 0, true)
If RetCode <> 0 Then
	WshShell.Run "rasdial " & DIALNAME & " /DISCONNECT", 0, true
	WScript.Sleep(3000)
	WshShell.Run "rasdial " & DIALNAME & " " & DIALUSER & " " & DIALPASS, 0
End If

Step 2:設定 Windows 工作排程。(控制台->排定的工作->新增排定的工作)

1
‧選擇步驟 1 的 repppoe.vbs 檔案

2

3

4
‧輸入具有 Administrator 權限的使用者及密碼

5

6

7
‧表示每 30 分鐘檢查一次連線狀況,可依需求修改,然後收工。

※ 備註:
之所以選擇 ping www.hinet.net 而不用 IP 是因為經實驗結果,若網卡有設定 Default gateway,則可能會因為 gateway response 影響連線判斷。

Other, Server, Windows, 程式筆記, 系統筆記 , , , ,

Wordpress 2.3.2 無法中文化問題

一月 10th, 2008

Wordpress 最近已經更新到 2.3.2 版了,趁著最近專題發表結束的空閒來更新一下,到官方抓了新版以及 Kirin Lin 的中文語系,由於 2.3.2 只是些 bug 及安全性修正,所以就直接採用覆蓋大法更新了。完工之後,咦?怎麼變英文介面了,wp-config.php 設定沒錯阿,於是求助 google 大神,馬上就找到了這篇,原來在 PHP 5.2.x 以及 64bit 系統下會有這個問題,登入 BlueHost 主機的後台看一下,果然沒錯,開始修正囉!

其實只要修正一行即可:
wp-includes/gettext.php LINE:117


if ($magic == ($MAGIC1 & 0xFFFFFFFF) || $magic == ($MAGIC3 & 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms

更改成:


if ($magic == $MAGIC1 || $magic == $MAGIC3) { // <- 64 BIT FIX: CHANGE THIS LINE!

ok!

Other, 程式筆記 , ,

Google Map 地圖定位

一月 10th, 2008

Google Map 提供的 API 實在是強大又好用,結合 GPS 很快就可以做出地圖定位的網站,將之前的 Urmap 範例修改了一下,成為 Google Map 地圖定位系統,為了能夠展示所以將座標先寫好讓它自己動態更新,其中按下停止按鈕會畫出所有紀錄點的連線,可做路徑追蹤。

Google Map API 網路上的資源已經相當豐富了,在此就不多敘述,比較特別的是畫折線(polyline)的部份,如果用原始的 GPolyline 方法來畫,大概幾十個點就需要運算很久,甚至導致瀏覽器 crash,所以 API 後來又加入了編碼折線(encodedPolyline)的功能,先將所有的點用特定演算法轉換成一串文字符號,再丟給 GPolyline.fromEncoded 顯示,幾乎是馬上就顯示出來了,差很多喔,而這個編碼演算法也已經有人寫好囉!請看:Encoding polylines for Google Maps

Ajax, Other, 程式筆記 , , ,

編譯 ZD1211 無線網卡驅動

十一月 19th, 2007

關於如何編譯 ZD1211/ZD1211B 晶片的 USB 無線網卡 driver,經常在各大討論區及 BBS 看到有人提出相同的問題,因此來寫個教學。

前往 ZD1211 專案網站可以知道目前有三種版本的驅動,其中建議使用 zd1211rw 這個版本,因為它持續在更新且已納入 Linux 2.6.18 以後的 kernel 裡。zd1211rw 支援這三種晶片:

  • ZyDAS ZD1211
  • ZyDAS ZD1211B
  • Atheros AR5007UG

不過既然都已經納入 kernel 了為什麼還要編譯驅動?因為還是有很多產品的 USB ID 不能被 zd1211rw 所辨識(我的 PCI GW-US54GXS 就是),當然就沒辦法驅動囉!這篇要做的就是從 kernel 裡的 zd1211rw source code 加入對應的 USB ID,主機環境是 ubuntu 7.10,其他版本應該也差不多。

首先要安裝編譯相關套件 & 下載 linux source
$ sudo apt-get install build-essential kernel-package linux-source

切換至 src 目錄並解開 linux source
$ cd /usr/src
$ sudo tar -xjvf linux-source-2.6.22.tar.bz2

拷貝 kernel 設定檔(.config) 至 linux source
$ sudo cp linux-headers-2.6.22-14-generic/.config linux-source-2.6.22

編輯 zd_usb.c 加入新 USB ID,可利用 lsusb 指令可以找出網卡的 ID,如:2019:5303
$ cd linux-source-2.6.22
$ sudo vim drivers/net/wireless/zd1211rw/zd_usb.c
在檔案開頭不遠處可以看到一堆 USB ID 號碼,就是要加進這裡面,GW-US54GXS 是 ZD1211B 晶片,所以在 ZD1211B 下方增加一行:
/* ZD1211B */
{ USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B },
確認後就存檔離開

開始編譯驅動
$ sudo mkdir .tmp_versions
$ sudo make drivers/net/wireless/zd1211rw/zd1211rw.ko

沒錯誤就會產生 zd1211rw.ko,將它覆蓋原本系統中的
$ sudo cp drivers/net/wireless/zd1211rw/zd1211rw.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/zd1211rw
$ sudo depmod -a

重開機應該就可以正確驅動了:D

參考資料:
Adding new device IDs to zd1211rw

Linux, Other, 硬體筆記 , , ,