2013年6月28日 星期五

[javascript]javascript有dictionary可用嗎?

javascript 有 dictionary 可用嗎?簡短的答案是有的。

在 javascript 裡也許找不到名字叫做 dictionary 的物件,因此先放棄研究 javascript 裡是否有無 dictionary 這種物件。讓我們把焦點放在 dictionary 有哪些功能,在 javascript 中要怎麼來使用。

dictionary 的功能就是可利用鍵值,獲取對應的值。在 javascript 裡,一個最簡單的例子是:

var a = {'key1':'a','key2':'b','key3':'c'};
console.log(a['key1'])
// 會得到 'a'

然而,在實務上,還會希望對 dictionary 有其他的操作,例如,

新增:

a['key4'] = 'd';
console.log(a);
// 會得到 Object {key1: "a", key2: "b", key3: "c", key4: "d"}

刪除:

delete a['key2'];
console.log(a);
// 會得到 Object {key1: "a", key3: "c", key4: "d"}

檢查 鍵值是否存在:

console.log('key3' in a);
// 會得到 true
console.log('key5' in a);
// 會得到 false

如此,對於 dictionary 的需求,都可以利用上面的方式達成。所以 javascript 有沒有 dictionary 物件的事,就得等有空的時候再討論了。

2013年6月24日 星期一

[named pipe] 列出本機已開啟的 named pipe

Named pipe 在 windows 上,是個很常用的 IPC (Interprocess Communication)。

如果下載 pipelist (註1),執行後會列出電腦上已有的 named pipe 的名字。

我執行後嚇一跳,還真是多。

 

利用 c# 也可以寫程式把這些名字列出來。

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");

可惜的是,如果電腦上有開啟 vmware,就會有 named pipe 的名字有帶磁碟機符號。

那麼,就會出現以下的錯誤:

System.ArgumentException: 第二個路徑片段不可以是磁碟機或 UNC 名稱。
參數名稱: path2
   於 System.IO.Path.InternalCombine(String path1, String path2)
   於 System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
   於 System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
   於 System.IO.Directory.GetFiles(String path)

這問題,我目前還沒有辦法解決。

所以,pipelist 湊合著用吧。

 

註1:http://technet.microsoft.com/en-us/sysinternals/dd581625.aspx

參考:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx

http://stackoverflow.com/questions/258701/how-can-i-get-a-list-of-all-open-named-pipes-in-windows

2013年6月6日 星期四

[python]dulwich 只是個 git client 我想…

https://github.com/jelmer/dulwich

安裝…找不到說明,BUT!

出奇的簡單,用 git 從 github 下載回來,使用 setup.py install 就搞定。

 

操作…

操作的文件在這 http://www.samba.org/~jelmer/dulwich/docs/tutorial/index.html,真的是RTFM,不注意還找不到文件在哪裡。我太嫩了。

已經知道細節的人,可以直接跳 http://www.samba.org/~jelmer/dulwich/docs/tutorial/repo.html 開始!但是,不知道細節的人,一定要從頭到尾看清楚每個字,尤其是 Introduction,它把這個軟體的功能說的很清楚。就是「它有寫的就是它能做的」。我原先以為他能像 git command line 工具一樣操作,結果不是。文章中,介紹了 .git 裡面的三個物件,commit, tree, blob,dulwich 軟體主要就是讓你操作這三個物件來達成你想要的動作。於是經過了嘗試、失敗、掙扎、又嘗試別的程式,失敗,掙扎,又回來嘗試這程式…的循環,我得到了我想要的結果。

我這裡整理一下我知道的跟我不知道的對應表。
















git init myrepo
from dulwich.repo import Repo
repo = Repo.init('myrepo',mkdri=True)
git --bare init不知道該怎辦。因為我只是把 dulwich 當 client 端,應該不會用到這個指令。
git add foo.txtrepo.stage(["foo.txt"])
git commitcommit_id = repo.do_commit("The first commit", committer="your name <name@example.com>")
git clone說明:這個大家最常用來抓新專案的指令,沒辦法直接對應,要先使用 fetch,再自行把檔案內容從 stores 裡面抓出來,寫到本地端的檔案系統。
例:

repo = Repo("myrepo")
commit_sha = repo['HEAD'].id  # 先拿到最近的 commit sha
tree = repo[commit_sha].tree    # 再拿到那個 commit 的 tree
store = repo.object_store
for filename, mode, sha in store.iter_tree_contents(tree): # 列舉那個 tree 的全部內容
    relpath = unicode(os.path.join(repo.path,filename))    # 計算出本地端的相對路徑
    ensure_dir_exists(os.path.dirname(relpath))               # 確定目錄有建立
    with open(relpath,'wb') as f:                                    # 開啟 bin mode 寫入內容
        f.write(repo[sha].data) 
    repo.stage([filename,])
    os.chmod(relpath, mode)


這是我不小心在亂晃的時候發現的 https://lists.launchpad.net/dulwich-users/msg00116.html 藏得很隱密

git fetch目前到 github 我都是用 https:// 的,所以就試了一個用 https:// 的。git:// 的我沒試。
server_address = 'https://github.com/'
client = HttpGitClient(server_address)
local = Repo.init("local", mkdir=True)
remote_refs = client.fetch("/jelmer/dulwich.git", local, determine_wants=local.object_store.determine_wants_all, progress=sys.stdout.write)
local["HEAD"] = remote_refs["HEAD"] #這個很重要,不然會沒有HEAD!

2013年6月4日 星期二

[nodejs]在 windows 安裝 git-server 有奇怪事件發生(已解決)

https://github.com/qrpike/NodeJS-Git-Server

在照該網站上的步驟進行,到了要用 git 測試,就會出現

events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:980:11)
at Process.ChildProcess._handle.onexit (child_process.js:771:34)

不曉得為什麼,已經在那裡留 issue 了。

但是在 ubuntu 就沒問題…。

後續:

後來不死心,用了最笨的方法,就是在 source code 裡到處加 console.log,看看程式怎麼跑。

後來知道了兩點,就把它修好了。

一、啟動新 server 需要指定 repoLocation。因為預設是 /tmp/repo,這目錄在 windows 下一定不存在。

二、git-server 其實是執行 git 指令,所以,一定要安裝 git,以 windows 來說,我安裝了 msysgit 的 Git-1.8.1.2-preview20130201.exe。

三、git-server 其實是執行 git 指令,又不會自帶路徑,所以要在環境變數 path,加入以下路徑:

C:\Program Files (x86)\Git\bin;C:\Program Files (x86)\Git\libexec\git-core

這樣,就可以啟動 git-server 了。