I always treat blockchain as a distributed database.
For database learning, start from "CRUD" is a good approach.
(But for blockchain, please ignore delete.)
This is a note for R3 Corda learning, based on M14.
*******
不知道大家怎麼看待區塊鏈這個東西?特別是私有鏈的架構。
我個人對於私有鏈的作法一直不以為然,因為這跟封閉式有權限的資料庫幾乎無異。
如果在乎資料被部分用戶更動,難道不能用Log當作稽核的工具?
區塊鏈的原意,是要在公開的環境下使用,作為公開的賬本。
但是現在有不少的區塊鏈方案,主打私有鏈適合企業的特點。
不過我還是抱著問號,如果封閉的使用模式,何必要特地導入區塊鏈?
以上是我對私有鏈的懷疑跟疑問,但是基於工作的原因還是得碰。
從IBM Hyperledger Fabric玩到R3的Corda,Corda是我覺得最莫名其妙的東西。
連他們自己都講了,Corda不是區塊鏈,但是從區塊鏈得到啟發。
區塊鏈最基本的定義,就是區塊鏈上每一個用戶都是平等的。
可以有一樣的操作權限還有使用同樣的資料。
但是Corda完全違背這個原則,它認為所有的交易不應該發布給所有節點。
只有相關的參與方會得到資料,其他用戶不會有任何相關資料儲存。
舉例來說,一個轉帳交易只有A跟B兩方,A轉帳給B的事實。
所以在R3的Corda裡面,只有A跟B的賬本有交易紀錄,其他C或D是完全不知道的。
萬一A或B有一方的系統故障,可能有資料被另一方竄改的風險。
或者非常剛好A跟B的儲存系統同時故障,於是所有相關交易紀錄消失。
不知道這樣的模式是否有資格跟人家叫區塊鏈?
反正R3跟你說他就是要這樣玩,主打的對象是銀行等金融機構。
他們的假設是金融機構有強大且安全的基礎建設。
不管是安全性或者資料儲存備援,理論上沒有太大故障的問題。
另一主張是對金融機構,共享所有交易資料的區塊鏈賬本模式也未必適合。
所以他們開發適合金融應用的區塊鏈,這就是R3 Corda。
這家公司的理念,也讓不少原先的銀行參與者退出。
不過還是從銀行間拿了很多錢,募資至少超過一億美金。
*******
以上是個人的看法,不管你是否認同,我的重點是要介紹Corda的基本開發。
區塊鏈的學習就當作玩資料庫,從CRUD的角度切入。
(不過區塊鏈沒有Delete的概念)
知道怎麼把資料寫入跟讀出來,其他的使用就是應用程式的問題了。
反正資料庫的功能就只是紀錄資料而已,不是嗎?
Corda相較一般資料庫比較複雜,有環環相扣的模組來操作資料寫入。
透過UTXO的模式,以公證方(Notary)節點來驗證交易的真實性,避免Double Spend的問題。
舉例來說,A把100元轉給B之後,他不能再次把同樣的交易單改收款人C再次轉帳。
因為公證方會發現這個問題,一個提交的交易只能進行一次,被標示為已發生。
從這個角度,大家應該也可以意識到:如果公證方節點死了怎麼辦?
那就真的死了!整個網路無法進行交易。
站在HA的考量,Corda確實有點奇怪。只能藉由增加公證方節點的數目來避免。
(透過集中權利的公證節點又再次違背區塊鏈去中心化的理念)
在送往公證方節點之前,還有其他步驟,主要是簽署該份合約。
合約定義了交易的規則,例如轉帳這個合約就是A跟B兩方要簽署。
同意之後會把協議的資金移轉,即從A轉到B。(或者B轉到A)
簽署合約的方式就是提出轉帳的那一邊先簽名,簽完之後給另一邊簽。
(簽名的方式是使用私鑰簽名,規格是常見的X.509憑證)
兩邊都簽完之後,送到公證方確定沒問題之後,寫入到狀態資料庫內。
以上的流程透過資料流Flow來定義。
*******
目前Corda是採開放原始碼的方式,任何有興趣的人都可以自己開發相關應用。
主要的開發語言是Kotlin,一個我之前也沒聽過的東西。
簡單用一句話介紹Kotlin:他就是屬於Android的Swift!
以Java概念為基礎,用相對簡單的Scripting Language實作應用程式。
如果你有很堅強的Java底子,Kotlin應該不會造成你很大的問題。
不然就跟筆者一樣,拿別人的樣板來改吧!
除此之外,也請下載IntelliJ 2017.02 (請確定版本號一樣)
這個IDE是開發Kotlin必備的工具(開發Corda區塊鏈應用的官方工具)。
你應該跟我以前有一樣的疑問,能不能用Eclipse?
答案是不可以!
在Corda官方教育訓練時,講師的回答是這樣。
而開發Kotlin語言的公司,就是創造IntelliJ的公司。
最後是Java JDK,請安裝Java 8。
Build號碼在133之後的版本。
我後面使用的R3 Corda版本,會是根基於M13以後的版本。
從M1到M14(我寫這篇文章時最新的版本)架構變化不小。
M13之後相對之前的版本,有不少的Class都被Refactor了。
(就是Class的名稱改變或者換到其他Name Space下)
一些函式名稱也更動,算是不小的更動。
如果您現在要進入Corda的開發,不要懷疑選M13以後版本就對了。
(M15應該也快了,從官方的Jira可以看到M16應該是內定1.0版)
*******
粗淺的寫了一堆東西,大家應該很難對Corda有完整的框架。
還是等下一個部分實作時配合程式碼一併說明。
2017年9月3日 星期日
2015年11月1日 星期日
Mac使用PS4的Controller教學
PlayStation 4 controller supports Bluetooth 2.1
You can connect to Mac and play emulator games.
*******
買了PS4好一陣子了,這幾天看到有人說控制器可以在Mac用。
利用假日研究了一下該怎麼用,其實還蠻簡單的。
這邊分享一下使用方法,適用有Mac跟PS4控制器的人。
首先要確定你的Mac機型有藍芽。
這應該是蠻簡單的條件,近年出廠的Mac幾乎都有藍芽。
只要確認藍芽是可以正常工作的就好。
開啟藍芽,然後按住PS4控制器中間的PlayStation按鈕跟Share鍵。
等一下子,OS X的就可以看到多了一個Wireless Controller的項目。
按下Pair的按鈕,讓手把跟電腦配對。
等配對成功,就可以看到狀態變成已連線。

要確認控制器真的連線成功了,還可以在系統資訊中確認。
在藍芽的分頁裡面,可以找到Wireless Controller的項目。

安裝了PS4的控制器,當然就是要玩遊戲啊!
這邊推薦Mac的模擬器軟體是OpenEmu
支援非常多經典的遊戲主機,也有非常漂亮的ROM管理功能。
(不要問我哪裡可以下載ROM...)

執行遊戲之後,下面有控制器設定的選項。

選擇遊戲主機,找到對應的控制器設定。
把Input選擇偵測到的Sony PS4 Dualshock 4即可。
會有預設的按鍵配置,如果不滿意請自己修改。

就是這麼簡單,設定完成回到遊戲畫面就可以繼續打電動了。
頓時感覺PS4控制器的錢花得真是值得!
******
如果不想用藍芽無線連接,堅持當年的復古。
就拿一條Micro USB的線把手把跟Mac連接。
這樣一邊打還可以一邊充電。
You can connect to Mac and play emulator games.
*******
買了PS4好一陣子了,這幾天看到有人說控制器可以在Mac用。
利用假日研究了一下該怎麼用,其實還蠻簡單的。
這邊分享一下使用方法,適用有Mac跟PS4控制器的人。
首先要確定你的Mac機型有藍芽。
這應該是蠻簡單的條件,近年出廠的Mac幾乎都有藍芽。
只要確認藍芽是可以正常工作的就好。
開啟藍芽,然後按住PS4控制器中間的PlayStation按鈕跟Share鍵。
等一下子,OS X的就可以看到多了一個Wireless Controller的項目。
按下Pair的按鈕,讓手把跟電腦配對。
等配對成功,就可以看到狀態變成已連線。

要確認控制器真的連線成功了,還可以在系統資訊中確認。
在藍芽的分頁裡面,可以找到Wireless Controller的項目。

安裝了PS4的控制器,當然就是要玩遊戲啊!
這邊推薦Mac的模擬器軟體是OpenEmu
支援非常多經典的遊戲主機,也有非常漂亮的ROM管理功能。
(不要問我哪裡可以下載ROM...)

執行遊戲之後,下面有控制器設定的選項。

選擇遊戲主機,找到對應的控制器設定。
把Input選擇偵測到的Sony PS4 Dualshock 4即可。
會有預設的按鍵配置,如果不滿意請自己修改。

就是這麼簡單,設定完成回到遊戲畫面就可以繼續打電動了。
頓時感覺PS4控制器的錢花得真是值得!
******
如果不想用藍芽無線連接,堅持當年的復古。
就拿一條Micro USB的線把手把跟Mac連接。
這樣一邊打還可以一邊充電。
2014年1月26日 星期日
Neo4j: Perl與CGI範例
How to using Neo4j perl library?
From local script to Web CGI.
I've create a simple backend case.
*******
這週末嘗試做一些Neo4j的網頁介面整合。
因為資料庫最終還是需要有前端的查詢介面。
測試了很多的Neo4j函式庫,最後還是選擇Perl。
Python的Django我不會,現在也沒空學。
Ruby的部份,我已經忘了RoR(Ruby on Rails)。
用Perl配合CGI的作法還是容易許多。
首先要做的,是安裝Neo4j的Perl函式庫。
用CPAN安裝就好,進入CPAN的指令介面後:
install REST::Neo4p
就會開始安裝所有必要套件,編譯並且測試。
另外,Apache2網頁伺服器也要開啟CGI的支援,
主要是修改設定檔,指定CGI程式的目錄。
以Ubuntu為例,要修改的是/etc/apache2/sites-available/default
加上cgi執行目錄的定義與允許的副檔名
</Directory>
指令是sudo /etc/init.d/apache2 restart
安裝並設定好了以後,先用簡單的Perl程式來測試一下。
主要是驗證資料庫的連接沒有問題。
我先在資料庫主機端測試,避免一些意外狀況。
就建立一個Perl的檔案,然後包含以下的程式碼內容:
#!/usr/bin/perl -w
use strict;
use warnings;
#建立一個查詢的物件
my $query = REST::Neo4p::Query->new(
' match(peptide)-[:HOST_IN]->({name:"Bos taurus"})
return peptide'
#把Cypher語法寫在括弧裡面
);
#送出查詢
$query->execute;
print "Show me which peptide host in \"Bos taurus\"?\n";
while (my $result = $query->fetch)
{
#查詢的結果被回傳,開始Parse結果的JSON檔案
print $result->[0]->get_property('name')."\n";
}
不意外,經過Perl跟Neo4j管理介面回傳的結果都一致
但是我還想知道上面那個案例的回傳矩陣是怎麼運作。
經過了解之後,寫了一個稍微複雜的查詢追蹤程式邏輯。
#!/usr/bin/perl -w
use REST::Neo4p;
use strict;
use warnings;
REST::Neo4p->connect('http://127.0.0.1:7474');
print "The sequence of Chrombacin?\n";
'match (peptide {name:"Chrombacin"})-[:HAS_SEQUENCE]->(sequence)
return peptide,sequence'
);
print $result2->[1]->get_property('seq')."\n";
}
現在要回傳的有兩個值(查詢結果):peptide跟sequence
$result2基本上是一個被parse過的陣列集合
$query2是經由Web Service回傳的JSON檔案
所以陣列集合裡按照順序,peptide就是[0],sequence是[1]
至於Properties的部份,對應的name跟seq。
是Node的屬性設定,這在建立節點時就已經定義了。
執行看看這個perl script,結果符合預期。
現在要把Perl用CGI的方式執行,看看能不能成功用網頁展示結果。
把同樣perl script複製到/var/www/cgi-bin裡面。
開啟瀏覽器看看結果,竟然出現錯誤了。
查看其他可以運作的Perl CGI範例。
發現我少了網頁伺服器可以剖析的元件。
Perl的輸出要符合HTML跟瀏覽器的規範啊!
主要是MIME的定義。
所以一開始要先輸出這一行:
print "Content-type: text/html\n";
然後其他要用HTML顯示的元素也要符合語法。
例如說換行的部份,就要輸出<br>的標籤。
單單是"\n"並沒有用,只有Perl知道。
HTML的換行是<br/>才對
小改一下perl script內容,存檔之後重開就有了。
也請記得這個pl檔案要賦予執行的權限。
sudo chmod +x case.pl
*******
以上,Perl跟Neo4j就是這麼簡單。
附上官方的參考資料
您也許同樣感興趣的文章:
Neo4j: Cypher語法筆記:Match語法
Neo4j: Cypher語法筆記:Pattern呈現形式
Neo4j: Cypher語法筆記:Expressions
From local script to Web CGI.
I've create a simple backend case.
*******
這週末嘗試做一些Neo4j的網頁介面整合。
因為資料庫最終還是需要有前端的查詢介面。
測試了很多的Neo4j函式庫,最後還是選擇Perl。
Python的Django我不會,現在也沒空學。
Ruby的部份,我已經忘了RoR(Ruby on Rails)。
用Perl配合CGI的作法還是容易許多。
首先要做的,是安裝Neo4j的Perl函式庫。
用CPAN安裝就好,進入CPAN的指令介面後:
install REST::Neo4p
就會開始安裝所有必要套件,編譯並且測試。
另外,Apache2網頁伺服器也要開啟CGI的支援,
主要是修改設定檔,指定CGI程式的目錄。
以Ubuntu為例,要修改的是/etc/apache2/sites-available/default
加上cgi執行目錄的定義與允許的副檔名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory /var/www/cgi-bin/>
Options ExecCGI
AddHandler cgi-script cgi pl
</Directory>
以上面範例,要建一個cgi-bin的資料夾在/var/www目錄下
(這是Ubuntu預設的網頁根目錄)
之後記得要重開Apache2伺服器指令是sudo /etc/init.d/apache2 restart
安裝並設定好了以後,先用簡單的Perl程式來測試一下。
主要是驗證資料庫的連接沒有問題。
我先在資料庫主機端測試,避免一些意外狀況。
就建立一個Perl的檔案,然後包含以下的程式碼內容:
#!/usr/bin/perl -w
#呼叫必要的函式庫,特別是Neo4p
use REST::Neo4p;use strict;
use warnings;
#建立一個與資料庫伺服器的連線
REST::Neo4p->connect('http://127.0.0.1:7474');#建立一個查詢的物件
my $query = REST::Neo4p::Query->new(
' match(peptide)-[:HOST_IN]->({name:"Bos taurus"})
return peptide'
#把Cypher語法寫在括弧裡面
);
#送出查詢
$query->execute;
while (my $result = $query->fetch)
{
#查詢的結果被回傳,開始Parse結果的JSON檔案
print $result->[0]->get_property('name')."\n";
}
不意外,經過Perl跟Neo4j管理介面回傳的結果都一致
但是我還想知道上面那個案例的回傳矩陣是怎麼運作。
經過了解之後,寫了一個稍微複雜的查詢追蹤程式邏輯。
#!/usr/bin/perl -w
use REST::Neo4p;
use strict;
use warnings;
#特別要看的部份是以下
my $query2 = REST::Neo4p::Query->new('match (peptide {name:"Chrombacin"})-[:HAS_SEQUENCE]->(sequence)
return peptide,sequence'
);
#尤其是這裡
$query2->execute;
while (my $result2 = $query2->fetch) {
print $result2->[0]->get_property('name')."\n";print $result2->[1]->get_property('seq')."\n";
}
現在要回傳的有兩個值(查詢結果):peptide跟sequence
$result2基本上是一個被parse過的陣列集合
$query2是經由Web Service回傳的JSON檔案
所以陣列集合裡按照順序,peptide就是[0],sequence是[1]
至於Properties的部份,對應的name跟seq。
是Node的屬性設定,這在建立節點時就已經定義了。
執行看看這個perl script,結果符合預期。
現在要把Perl用CGI的方式執行,看看能不能成功用網頁展示結果。
把同樣perl script複製到/var/www/cgi-bin裡面。
開啟瀏覽器看看結果,竟然出現錯誤了。
查看其他可以運作的Perl CGI範例。
發現我少了網頁伺服器可以剖析的元件。
Perl的輸出要符合HTML跟瀏覽器的規範啊!
主要是MIME的定義。
所以一開始要先輸出這一行:
print "Content-type: text/html\n";
然後其他要用HTML顯示的元素也要符合語法。
例如說換行的部份,就要輸出<br>的標籤。
單單是"\n"並沒有用,只有Perl知道。
HTML的換行是<br/>才對
小改一下perl script內容,存檔之後重開就有了。
也請記得這個pl檔案要賦予執行的權限。
sudo chmod +x case.pl
*******
以上,Perl跟Neo4j就是這麼簡單。
附上官方的參考資料
您也許同樣感興趣的文章:
Neo4j: Cypher語法筆記:Match語法
Neo4j: Cypher語法筆記:Pattern呈現形式
Neo4j: Cypher語法筆記:Expressions
2013年12月19日 星期四
Neo4j: Cypher語法筆記:Match語法
MATCH syntax in Neo4j is for search.
Search the node, relationship...
*******
基本上Neo4j的語法組成跟SQL很像。
MATCH跟SELECT的功能有點像。
就是挑出符合條件的資料,最後可以配合WHERE過濾。
MATCH符合的內容,最後被RETURN。
就是一個簡單的Cypher語法。
Neo4j官方有提供「沙盒」(Sandbox),你可以任意操作。
先介紹節點的搜尋
如果你想要Neo4j列出所有的節點,語法如下:
MATCH (n)
RETURN (n)
MATCH跟RETURN都是保留字,可以用小寫也沒關係。
節點是可以有標籤的(label)
如果要找到所有標籤為NCBI的節點
MATCH (journal:NCBI)
RETURN journal
journal就是代表節點的變數,:NCBI如同認知,是個標籤
(複習一下,標籤就是冒號:起頭,冒號右邊是標籤名稱)
現在要找有關係的節點(Related nodes)
以官方網站的語法例子為例
MATCH (director {name:"Oliver Stone"})--(movie)
RETURN movie.title
就是先找出一個path,主要是導演跟電影的關係
然後要回傳的是電影節點中的標題屬性
你可以測試RETURN的變化,去了解Neo4j的語法規則。
例如RETURN movie,會RETURN所有的東西,不只是Title
像那個director,也只是一個暫時指派的變數而已。
目的是方便理解,movie也是。
在實際設計的些語法的時候,本來就要考量可讀性跟維護性。
重點在{name:"Oliver Stone"}的地方,這是MATCH的關鍵。
要找到所有跟Oliver Stone有關係的電影。
(這是已經假設案例跟電影有關,Neo4j的沙盒網站預設的)
不信你可以把director跟movie換掉試試看。
繼續是搜尋有向的關係,網站的例子是
MATCH (martin {name:"Martin Sheen"})-->(movie)
RETURN movie.title
要找的是屬性名為Martin Sheen向外發展的節點
如果你從官方的沙盒細看,會發現查詢結果的關係是:ACTED_IN
指的是Martin Sheen有演過的電影,以他為中心出發的有向查詢
至於這層有向的關係是什麼呢?請繼續看官方的範例
MATCH (martin {name:"Martin Sheen"})-[r]->(movie)
RETURN r
也就是把上面的範例小改,多加入一個表示關係的r變數
現在RETURN查詢結果r,顯示所有的關係
關係可以是未知,只要有關係就全部列出來,如上例。
也可以列出已知關係的節點,像是我要知道誰有演某部電影。
官方網站的範例語法如下
MATCH (wall street {title:"Wall Street"})<-[:ACTED_IN]-(actor)
RETURN actor
這兩行語法,重點的地方在{title:"Wall Street"}還有 <-[:ACTED_IN]-
請特別注意我把關係的箭頭方向有列出來
就語意上的意思是我要找誰有在Wall Street這部電影中演出。
執行之後就會列出演員了。
再多一個小變化,就可以有多重關係的查詢結果
MATCH (wall street {title:"Wall Street"})<-[:ACTED_IN|:DIRECTED]-(person)
RETURN person
現在要找的是Wall Street這部電影中,導戲跟演戲的人
原本那個actor也順勢換成person,目的是方便理解。
現在不只是找actor而已。
查詢多重關係也可以,例如想知道誰演某部電影、導演是誰。
然後現有條件只知道演員,可以用下列的範例語法:
MATCH (charlie {name:"Charlie Sheen"})-[:ACTED_IN]->(movie)<-[:DIRECTED]->(director)
RETURN charlie, movie, director
查詢結果會回傳三個「節點」,這是原本的範例內容。
一樣,可以自己變化。例如只回傳電影標題、導演名稱:
RETURN movie.title , director.name
想知道某演員演過的電影之間的可能關係,包含電影跟演員。
然後只要一到兩層的關係就好。
(我的理解是可能只想知道被查詢演員有跟誰又共演一齣戲。
這是根據下列查詢語法回應而推斷的)
MATCH (martin {name: "Martin Sheen"})-[:ACTED_IN*1..2]-(x)
RETURN x
執行之後只會列出被ACTED_IN關係最少一層,最多兩層的節點
*******
先寫到這樣,之後想到再補。
或者有需要可以參考官方網站資料,有非常華麗的功能。
例如尋找最短路徑。
Search the node, relationship...
*******
基本上Neo4j的語法組成跟SQL很像。
MATCH跟SELECT的功能有點像。
就是挑出符合條件的資料,最後可以配合WHERE過濾。
MATCH符合的內容,最後被RETURN。
就是一個簡單的Cypher語法。
Neo4j官方有提供「沙盒」(Sandbox),你可以任意操作。
先介紹節點的搜尋
如果你想要Neo4j列出所有的節點,語法如下:
MATCH (n)
RETURN (n)
MATCH跟RETURN都是保留字,可以用小寫也沒關係。
節點是可以有標籤的(label)
如果要找到所有標籤為NCBI的節點
MATCH (journal:NCBI)
RETURN journal
journal就是代表節點的變數,:NCBI如同認知,是個標籤
(複習一下,標籤就是冒號:起頭,冒號右邊是標籤名稱)
現在要找有關係的節點(Related nodes)
以官方網站的語法例子為例
MATCH (director {name:"Oliver Stone"})--(movie)
RETURN movie.title
就是先找出一個path,主要是導演跟電影的關係
然後要回傳的是電影節點中的標題屬性
你可以測試RETURN的變化,去了解Neo4j的語法規則。
例如RETURN movie,會RETURN所有的東西,不只是Title
像那個director,也只是一個暫時指派的變數而已。
目的是方便理解,movie也是。
在實際設計的些語法的時候,本來就要考量可讀性跟維護性。
重點在{name:"Oliver Stone"}的地方,這是MATCH的關鍵。
要找到所有跟Oliver Stone有關係的電影。
(這是已經假設案例跟電影有關,Neo4j的沙盒網站預設的)
不信你可以把director跟movie換掉試試看。
繼續是搜尋有向的關係,網站的例子是
MATCH (martin {name:"Martin Sheen"})-->(movie)
RETURN movie.title
要找的是屬性名為Martin Sheen向外發展的節點
如果你從官方的沙盒細看,會發現查詢結果的關係是:ACTED_IN
指的是Martin Sheen有演過的電影,以他為中心出發的有向查詢
至於這層有向的關係是什麼呢?請繼續看官方的範例
MATCH (martin {name:"Martin Sheen"})-[r]->(movie)
RETURN r
也就是把上面的範例小改,多加入一個表示關係的r變數
現在RETURN查詢結果r,顯示所有的關係
關係可以是未知,只要有關係就全部列出來,如上例。
也可以列出已知關係的節點,像是我要知道誰有演某部電影。
官方網站的範例語法如下
MATCH (wall street {title:"Wall Street"})<-[:ACTED_IN]-(actor)
RETURN actor
這兩行語法,重點的地方在{title:"Wall Street"}還有 <-[:ACTED_IN]-
請特別注意我把關係的箭頭方向有列出來
就語意上的意思是我要找誰有在Wall Street這部電影中演出。
執行之後就會列出演員了。
再多一個小變化,就可以有多重關係的查詢結果
MATCH (wall street {title:"Wall Street"})<-[:ACTED_IN|:DIRECTED]-(person)
RETURN person
現在要找的是Wall Street這部電影中,導戲跟演戲的人
原本那個actor也順勢換成person,目的是方便理解。
現在不只是找actor而已。
查詢多重關係也可以,例如想知道誰演某部電影、導演是誰。
然後現有條件只知道演員,可以用下列的範例語法:
MATCH (charlie {name:"Charlie Sheen"})-[:ACTED_IN]->(movie)<-[:DIRECTED]->(director)
RETURN charlie, movie, director
查詢結果會回傳三個「節點」,這是原本的範例內容。
一樣,可以自己變化。例如只回傳電影標題、導演名稱:
RETURN movie.title , director.name
想知道某演員演過的電影之間的可能關係,包含電影跟演員。
然後只要一到兩層的關係就好。
(我的理解是可能只想知道被查詢演員有跟誰又共演一齣戲。
這是根據下列查詢語法回應而推斷的)
MATCH (martin {name: "Martin Sheen"})-[:ACTED_IN*1..2]-(x)
RETURN x
執行之後只會列出被ACTED_IN關係最少一層,最多兩層的節點
*******
先寫到這樣,之後想到再補。
或者有需要可以參考官方網站資料,有非常華麗的功能。
例如尋找最短路徑。
2013年12月18日 星期三
Neo4j: Cypher語法筆記:呈現形式 Pattern
Pattern is an important part of Cypher syntax.
To represent the node, property and relationship.
*******
Pattern不知道該怎麼翻譯比較好。
說是模式、形式應該都可以,重點在內容的呈現。
對於Neo4j這個NoSQL型態的圖資料庫而言。
每一筆資料可以是一個節點Node
節點的表達就是用( )包起來呈現
例如節點的名稱叫做a01,這節點就是(a01)
每個節點之間可以有關係,就是用箭號的形式表達。
請發揮你的想像力,用簡單的ASCII字元聯想
--> 總共三個字元構成了一個箭號
一對一的關係,徐玄是少女 時代的成員
(SeoHyun)-->(SNSD)
把徐玄指向少女時代就好
如果要表達一對多的關係呢?例如:徐玄跟Jessica都是少女 時代的成員。
可以寫成兩個表達式
(SeoHyun)-->(SNSD), (Jessica)-->(SNSD)
甚至更直接,一個就夠了
(SeoHyun)-->(SNSD)< --(Jessica)
一個包含節點與關係的組合,稱為Path
標籤可以作為節點的標記,呈現方式是 :標籤名稱
例如 :SNSD
有一個叫做徐玄的節點,註記是少女時代:
(SeoHyun:SNSD)
使用標籤也是沒問題的,例如要多一個韓國人的標籤:
(SeoHyun:SNSD:Korean)
節點可以定義屬性,Neo4j裡面很像是一個JSON的表達方法。
屬性需要包在節點裡面,然後用大括號呈現。
例如一個節點徐玄,姓名Seo Hyun 性別是女。
然後生日部分,出生年是1991,日期6月28日。
在Neo4j的完整呈現方式如下(請容許我都翻成英文):
(SeoHyun {name:"Seo Hyun", gender:"female", year: 1991, date:"Jun.28"})
屬性的定義是為了日後的查詢操作。
節點跟節點之間原本沒有關係,可以讓他們發生關係。
並針對這個關係命名。
例如Jessica跟Crystal有姊妹的關係。
就可以這樣呈現 (Jessica)-[:SISTER]-(Crystal)
關係也可以是有向性的,例如Eric知道Jessica
因為Jessica是公眾人物,而阿宅我本人只是一個知道他的人。
Jessica並不知道我是誰(如果知道了就好)
(Eric)-[:KNOWS]->(Jessica)
看得出來吧?基本上箭號那個線條就是兩個-構成 --
然後在中間插入[: 關係名稱] 就是有向的關係定義了
不若用來描述節點的標籤(label)可以有很多種
關係只能有一種,並沒有「開放式的交友關係」
所以可以用 | 來呈現多種關係的存在。
例如(Eric)-[:KNOWS|FANS_OF]->(Jessica)
語意上就是Eric知道Jessica或者說Eric是Jessica的粉絲。
關於關係的建立,該如何寫入資料庫中,之後說明。
當然,雙向關係也是可以的。
例如在夢中Jessica也認識Eric我本人。
(Eric)<-[:KNOWS]->(Jessica)
關係還有遠近之分,也就是有幾層?
現在就不要再舉少女時代的例子了,不然等等就被投訴
最實際的,就是朋友之間的關係。
我們生活中常常有以下對話:
「張三是那個我叫李四的朋友的朋友」
用Cypher表達節點與關係,就是
(Me)-->(李四)-->(張三)
這就是兩層的關係,可以用層級表達我跟張三的關係
(Me)->[*2]->(張三)
如果關係更複雜,想要表達我跟張三間3到5層的關係。
就是(Me)->[*3.. 5]->(張三)
表達3層以後的關係 (Me)->[*3.. ]->(張三)
表達小於5層的關係 (Me)->[*.. 5 ]->(張三)
表達任何曾的關係 (Me)->[*]->(張三)
套用到實際查詢上的語法範例:
MATCH (me)-[:KNOWS*1.. 2]-(friends)
WHERE me.name = "Eric"
RETURN friends.name
意義就是請Neo4j幫我找出跟我有認識的朋友關係
這邊定義了兩個臨時宣告的變數節點me還有friends
因為是變數,還要更明確的指出我的名字是Eric
所以有結合WHERE的條件與property是name要等於字串"Eric"
最後再回傳friends的節點名字
看得出來被指到friends的節點,應該都具備跟Eric節點類似的內容。
至少有name這個屬性就是了。
此外,整個「路徑」也可以用一個變數接受傳遞
例如 path = (me)-[*3.. 5]-(potential_friends)
在使用MATCH查詢時,最後如果是RETURN path
就會列出所有3到5層的關係
*******
這篇網誌還沒有講到更複雜的關係建立。
只是單純的介紹Neo4j的一些呈現形式。
建議先搞清楚({})這樣的節點跟屬性包裝,有助於後續的關係推廣。
原始的官方參考資料在這,覺得我寫的很爛請直接參考原文。
您也許同樣感興趣的文章:
Neo4j: Cypher語法筆記:一般表達形式 Expressions
To represent the node, property and relationship.
*******
Pattern不知道該怎麼翻譯比較好。
說是模式、形式應該都可以,重點在內容的呈現。
對於Neo4j這個NoSQL型態的圖資料庫而言。
每一筆資料可以是一個節點Node
節點的表達就是用( )包起來呈現
例如節點的名稱叫做a01,這節點就是(a01)
每個節點之間可以有關係,就是用箭號的形式表達。
請發揮你的想像力,用簡單的ASCII字元聯想
--> 總共三個字元構成了一個箭號
一對一的關係,徐玄是少女
(SeoHyun)-->(SNSD)
把徐玄指向少女時代就好
如果要表達一對多的關係呢?例如:徐玄跟Jessica都是少女
可以寫成兩個表達式
(SeoHyun)-->(SNSD),
甚至更直接,一個就夠了
(SeoHyun)-->(SNSD)<
一個包含節點與關係的組合,稱為Path
標籤可以作為節點的標記,呈現方式是 :標籤名稱
例如 :SNSD
有一個叫做徐玄的節點,註記是少女時代:
(SeoHyun:SNSD)
使用標籤也是沒問題的,例如要多一個韓國人的標籤:
(SeoHyun:SNSD:Korean)
節點可以定義屬性,Neo4j裡面很像是一個JSON的表達方法。
屬性需要包在節點裡面,然後用大括號呈現。
例如一個節點徐玄,姓名Seo Hyun 性別是女。
然後生日部分,出生年是1991,日期6月28日。
在Neo4j的完整呈現方式如下(請容許我都翻成英文):
(SeoHyun {name:"Seo Hyun", gender:"female", year: 1991, date:"Jun.28"})
屬性的定義是為了日後的查詢操作。
節點跟節點之間原本沒有關係,可以讓他們發生關係。
並針對這個關係命名。
例如Jessica跟Crystal有姊妹的關係。
就可以這樣呈現 (Jessica)-[:SISTER]-(Crystal)
關係也可以是有向性的,例如Eric知道Jessica
因為Jessica是公眾人物,而阿宅我本人只是一個知道他的人。
Jessica並不知道我是誰
(Eric)-[:KNOWS]->(Jessica)
看得出來吧?基本上箭號那個線條就是兩個-構成 --
然後在中間插入[: 關係名稱] 就是有向的關係定義了
不若用來描述節點的標籤(label)可以有很多種
關係只能有一種,並沒有「開放式的交友關係」
所以可以用 | 來呈現多種關係的存在。
例如(Eric)-[:KNOWS|FANS_OF]->(Jessica)
語意上就是Eric知道Jessica或者說Eric是Jessica的粉絲。
關於關係的建立,該如何寫入資料庫中,之後說明。
當然,雙向關係也是可以的。
例如在夢中Jessica也認識Eric我本人。
(Eric)<-[:KNOWS]->(Jessica)
關係還有遠近之分,也就是有幾層?
現在就不要再舉少女時代的例子了,
最實際的,就是朋友之間的關係。
我們生活中常常有以下對話:
「張三是那個我叫李四的朋友的朋友」
用Cypher表達節點與關係,就是
(Me)-->(李四)-->(張三)
這就是兩層的關係,可以用層級表達我跟張三的關係
(Me)->[*2]->(張三)
如果關係更複雜,想要表達我跟張三間3到5層的關係。
就是(Me)->[*3.. 5]->(張三)
表達3層以後的關係 (Me)->[*3.. ]->(張三)
表達小於5層的關係 (Me)->[*.. 5 ]->(張三)
表達任何曾的關係 (Me)->[*]->(張三)
套用到實際查詢上的語法範例:
MATCH (me)-[:KNOWS*1.. 2]-(friends)
WHERE me.name = "Eric"
RETURN friends.name
意義就是請Neo4j幫我找出跟我有認識的朋友關係
這邊定義了兩個臨時宣告的變數節點me還有friends
因為是變數,還要更明確的指出我的名字是Eric
所以有結合WHERE的條件與property是name要等於字串"Eric"
最後再回傳friends的節點名字
看得出來被指到friends的節點,應該都具備跟Eric節點類似的內容。
至少有name這個屬性就是了。
此外,整個「路徑」也可以用一個變數接受傳遞
例如 path = (me)-[*3.. 5]-(potential_friends)
在使用MATCH查詢時,最後如果是RETURN path
就會列出所有3到5層的關係
*******
這篇網誌還沒有講到更複雜的關係建立。
只是單純的介紹Neo4j的一些呈現形式。
建議先搞清楚({})這樣的節點跟屬性包裝,有助於後續的關係推廣。
原始的官方參考資料在這,覺得我寫的很爛請直接參考原文。
您也許同樣感興趣的文章:
Neo4j: Cypher語法筆記:一般表達形式 Expressions
Neo4j: Cypher語法筆記:表達形式 Expressions
The article described the expressions of Neo4j.
*******
Neo4j的Cypher語法支援了下面幾種表達形式。
如同多數的程式語言一樣,數字、字串、函數等方法都有支援。
以下是我簡單整理給自己看的,主要參考Neo4j的官方文件。
數字型態,主要是整數與小數,小數只支援到雙倍精確度(Double)
呈現時就是直接輸入數字,例如6, 7, 13, 12.05
字串 String,可以用單引號或者雙引號,夾帶長串的文字
"Eric Zero", 'Zero', "Neo4j"
變數,就是變數。英文習慣是Variable,但是官方文件說是identifier
可以是文字或者文字帶有數字,並且有區分大小寫。
在送出查詢使用時不用先宣告變數。
x, X, xYz, x1, 1xZ都可以,就是不能用單獨數字。
不然會被當成是一個數值內容。
每個物件本身會被視為一個物件。
屬性(Property),變數下的細節層級。
例如一個變數可以有長度或者名稱。
不要忘了,這個變數本身就是一個物件。
例如gene.name,指gene這個物件下面有一個名叫name的屬性。
gene.length,指gene下面還有length的屬性存在。
關於屬性,可能要自己建立一個資料節點(node)後比較有感。
這個之後再聊。
參數,用大括號包起來。
例如{param}、{0}
集合(collection of expression),使用中括號包裝。
裡面的元素用逗號區隔,集合內可以都是同樣型態的資料。
或者夾雜數字、字串、參數等混合。空集合也可以。
["a","b"]、[0,1,1.1,2]、["a2", 2,"test"]、[ ]
函數,跟多數程式語言一樣,用函數名與小括號。
括號裡面再放入輸入的物件,例如 length( str )
路徑表達 (path-pattern),實際上是「關係」的呈現為主。
這是Cypher很有特色的一點,用ASCII Art的方式呈現。
例如A指到B,就是(A)-->(B)
A跟C都指到B,可以用兩個方法呈現。
第一種:(A)-->(B) , (C)-->(B)
第二種:(A)-->(B)<--(C)
很有趣吧!包起來物件的左右小括號,看起來就跟圈圈一樣。
配合橫線跟大於等於的符號形成一個箭頭。
在語法表達式中,等號具備傳值的功能。
規則是右邊的值給左邊。
例如LengthOfSeq = seq.length
意思是LengthOfSeq這個變數的值,是來自於物件seq的length屬性。
length屬性如果是字串,LengthOfSeq收到後就是字串。
如果是Numerical, 收到後就是數值。
跳脫字元也是必要的,因為特殊字元需要特殊的處理方式。
有程式設計經驗的人都知道,Cypher也承襲多數語法慣例:
\t Tab字元
\n 換行字元
\b 退位字元
\\ 斜線
\' 單引號
\" 雙引號
跳脫字元 Escape Character的使用非常重要
尤其配合正規表示法(RegEx, Regular Expression)很普遍。
CASE,是一種條件表達式。符合條件的會被執行。
請看一下這個簡單的Cypher範例:
MATCH n
RETURN CASE n.eyes
WHEN 'blue'
THEN 1
WHEN 'brown'
THEN 2
ELSE 3 END AS result
上面例子中,先找到資料節點n。
(MATCH等語法,另闢一文說明)
之後回傳n.eyes的屬性值作為CASE條件判斷用途
當值是字串blue傳回1,字串brown傳回2
其他都當作3(預設值),CASE到此結束以END表示
result這個值就是THEN的條件判斷後結果
*******
表達式的筆記先介紹到這裡,有錯誤煩請指教。
參考的原始官方網頁
*******
Neo4j的Cypher語法支援了下面幾種表達形式。
如同多數的程式語言一樣,數字、字串、函數等方法都有支援。
以下是我簡單整理給自己看的,主要參考Neo4j的官方文件。
數字型態,主要是整數與小數,小數只支援到雙倍精確度(Double)
呈現時就是直接輸入數字,例如6, 7, 13, 12.05
字串 String,可以用單引號或者雙引號,夾帶長串的文字
"Eric Zero", 'Zero', "Neo4j"
變數,就是變數。英文習慣是Variable,但是官方文件說是identifier
可以是文字或者文字帶有數字,並且有區分大小寫。
在送出查詢使用時不用先宣告變數。
x, X, xYz, x1, 1xZ都可以,就是不能用單獨數字。
不然會被當成是一個數值內容。
每個物件本身會被視為一個物件。
屬性(Property),變數下的細節層級。
例如一個變數可以有長度或者名稱。
不要忘了,這個變數本身就是一個物件。
例如gene.name,指gene這個物件下面有一個名叫name的屬性。
gene.length,指gene下面還有length的屬性存在。
關於屬性,可能要自己建立一個資料節點(node)後比較有感。
這個之後再聊。
參數,用大括號包起來。
例如{param}、{0}
集合(collection of expression),使用中括號包裝。
裡面的元素用逗號區隔,集合內可以都是同樣型態的資料。
或者夾雜數字、字串、參數等混合。空集合也可以。
["a","b"]、[0,1,1.1,2]、["a2", 2,"test"]、[ ]
函數,跟多數程式語言一樣,用函數名與小括號。
括號裡面再放入輸入的物件,例如 length( str )
路徑表達 (path-pattern),實際上是「關係」的呈現為主。
這是Cypher很有特色的一點,用ASCII Art的方式呈現。
例如A指到B,就是(A)-->(B)
A跟C都指到B,可以用兩個方法呈現。
第一種:(A)-->(B) , (C)-->(B)
第二種:(A)-->(B)<--(C)
很有趣吧!包起來物件的左右小括號,看起來就跟圈圈一樣。
配合橫線跟大於等於的符號形成一個箭頭。
在語法表達式中,等號具備傳值的功能。
規則是右邊的值給左邊。
例如LengthOfSeq = seq.length
意思是LengthOfSeq這個變數的值,是來自於物件seq的length屬性。
length屬性如果是字串,LengthOfSeq收到後就是字串。
如果是Numerical, 收到後就是數值。
跳脫字元也是必要的,因為特殊字元需要特殊的處理方式。
有程式設計經驗的人都知道,Cypher也承襲多數語法慣例:
\t Tab字元
\n 換行字元
\b 退位字元
\\ 斜線
\' 單引號
\" 雙引號
跳脫字元 Escape Character的使用非常重要
尤其配合正規表示法(RegEx, Regular Expression)很普遍。
CASE,是一種條件表達式。符合條件的會被執行。
請看一下這個簡單的Cypher範例:
MATCH n
RETURN CASE n.eyes
WHEN 'blue'
THEN 1
WHEN 'brown'
THEN 2
ELSE 3 END AS result
上面例子中,先找到資料節點n。
(MATCH等語法,另闢一文說明)
之後回傳n.eyes的屬性值作為CASE條件判斷用途
當值是字串blue傳回1,字串brown傳回2
其他都當作3(預設值),CASE到此結束以END表示
result這個值就是THEN的條件判斷後結果
*******
表達式的筆記先介紹到這裡,有錯誤煩請指教。
參考的原始官方網頁
2013年2月19日 星期二
OS X 10.8 Mountain Lion安裝Git
Install Xcode in OS X, you will have Mercurial.
It's a version control system, but I need Git...
*******
OS X在安裝Xcode之後就會有版本控制系統。
簡單來講,就是可以讓你把寫好的程式碼備份。
而且是系統化的備份,以分散式的架構儲存。
方便做各種規模的維護,落實管理的功能。
最近因為學校的小專題,我開始認真的重學版本控制。
過去都是用CVS或者SVN,這次打算玩Git。
但是因為OS X沒有,所以必須另外安裝。
所以趁這個機會,把整個過程整理成一邊文章當成筆記。
這樣日後要裝在其他電腦時,就可以快速上手。
首先下載Git OS X Installer ,一直有在持續維護。
下載最新Snow Leopard的版本即可。
我確定用在Mountain Lion 10.8上面沒有問題。
下載之後,因為OS X有安全設計。
現在的應用程式都要數位簽名,才能直接安裝。
沒有簽名的應用程式必須經過同意。
從系統偏好設定的地方手動開啟。
從「安全性與隱私」的頁面,允許「任何來源」。
從Google Code下載的DMG檔,掛載之後安裝pkg檔案。
依照一般應用程式的安裝流程即可,並沒有太特別。
安裝完成之後,打開終端機(Terminal)。
執行下面的兩個指令,讓Git與系統連結。
sudo make -p /usr/local/bin
sudo ln -s /usr/local/git/bin/git /usr/local/bin/git
過程中需要管理員的密碼。
順利執行完兩個指令之後,重新啟動終端機。
輸入git --version
應該可以看到安裝的Git版本,這樣就大功告成了。
相關的Git指令,這邊暫時不討論。
*******
如果要升級到新版本的Git Installer
只要用掛載的DMG,裡面的uninstall.sh移除。
然後再根據同樣的方法安裝即可!
It's a version control system, but I need Git...
*******
OS X在安裝Xcode之後就會有版本控制系統。
簡單來講,就是可以讓你把寫好的程式碼備份。
而且是系統化的備份,以分散式的架構儲存。
方便做各種規模的維護,落實管理的功能。
最近因為學校的小專題,我開始認真的重學版本控制。
過去都是用CVS或者SVN,這次打算玩Git。
但是因為OS X沒有,所以必須另外安裝。
所以趁這個機會,把整個過程整理成一邊文章當成筆記。
這樣日後要裝在其他電腦時,就可以快速上手。
首先下載Git OS X Installer ,一直有在持續維護。
下載最新Snow Leopard的版本即可。
我確定用在Mountain Lion 10.8上面沒有問題。
下載之後,因為OS X有安全設計。
現在的應用程式都要數位簽名,才能直接安裝。
沒有簽名的應用程式必須經過同意。
從系統偏好設定的地方手動開啟。
從「安全性與隱私」的頁面,允許「任何來源」。
從Google Code下載的DMG檔,掛載之後安裝pkg檔案。
依照一般應用程式的安裝流程即可,並沒有太特別。
安裝完成之後,打開終端機(Terminal)。
執行下面的兩個指令,讓Git與系統連結。
sudo make -p /usr/local/bin
sudo ln -s /usr/local/git/bin/git /usr/local/bin/git
過程中需要管理員的密碼。
順利執行完兩個指令之後,重新啟動終端機。
輸入git --version
應該可以看到安裝的Git版本,這樣就大功告成了。
相關的Git指令,這邊暫時不討論。
*******
如果要升級到新版本的Git Installer
只要用掛載的DMG,裡面的uninstall.sh移除。
然後再根據同樣的方法安裝即可!
2013年2月16日 星期六
微波爐香菇蒸蛋
The guide about using microwave to cook egg.
*******
其實這個標題下的有很大的矛盾。
既然都用微波爐了,那來「蒸」這回事。
主要是用微波爐營造蒸蛋的口感,所以姑且叫蒸蛋。
蒸蛋這件事原本可以很簡單,但是用微波爐之後不容易。
應該講大家都會用大同電鍋,可是微波爐規格不一定。
功率不盡然一樣,很難有一個標準。
經過了三次實驗,終於做出比較理想的「蒸蛋」。
材料的部份,講求簡單好準備。
原本只有醬油,但煮出來不夠好吃。
最重要的是「沒有香味」,沒有食慾可言。
所以研究了「香菇蒸蛋」的作法。
請準備香菇、醬油、雞蛋這三種材料。
一開始,請先處理一下香菇。
就是那種超市就買得到的乾香菇。
一到兩人份的蒸蛋,以三顆蛋為例。
個人覺得三朵就很多了。
這跟香菇本身的大小有直接關係。
拿出三朵香菇,先以冷水洗乾淨稍微泡水。
然後拿出電熱水壺,燒開滾水。
把洗淨的香菇剪開、切開後放進去。
讓香菇的「精華」被滾水沖出來。
滾水要放多少,其實跟打的蛋有多少有關係。
個人覺得與蛋白蛋黃1:1的情況最好。
這也是香菇放太多不妥的原因,等等整碗都香菇。
兩人份打三個蛋,差不多了。
調味料這邊只有醬油,應該可以加點香油。
個人覺得這樣就夠了,並不需要加鹽。
把醬油酌量加到香菇水裡面。
(千萬不要加太多,一點點就夠了)
準備開始打蛋。
微波爐蒸蛋的要訣,就是打蛋要用溫水或熱水。
不然微波時容易受熱不均勻,甚至表面結塊。
這也是為什麼倒在香菇的熱水不要太多。
配合蛋的份量調整,不要浪費香菇的精華。
另外,用溫熱水打蛋比較好打...
雞蛋、香菇打在一起之後,準備微波。
直接轉到最高溫,加熱三分鐘就好。
我看到有人作法是最低溫用十五分鐘。
不過我是用三分鐘最高溫的方式處理。
這就是成品,看起來賣相不佳。
但是香味四溢,連我室友都覺得今天怎麼有香味。
另外,建議用大一點的容器。
有可能在微波時膨脹而溢出,清理微波爐很麻煩。
用湯匙翻開下面看,顏色一樣均勻。
不過還是有非常多的小孔。
管他的,可以吃就好!
*******
不是我自賣自誇,吃起來的味道真的不錯。
沒想到多加一樣香菇之後,更好吃了。
蒸蛋的湯汁得到升級,味道真的有比較好。
如果要用更華麗一點,可以加魚板。
我在附近的超市都沒有看到,所以就不加魚板了。
您也許同樣感興趣的文章:
微波爐煮白米飯
微波爐煮水餃
*******
其實這個標題下的有很大的矛盾。
既然都用微波爐了,那來「蒸」這回事。
主要是用微波爐營造蒸蛋的口感,所以姑且叫蒸蛋。
蒸蛋這件事原本可以很簡單,但是用微波爐之後不容易。
應該講大家都會用大同電鍋,可是微波爐規格不一定。
功率不盡然一樣,很難有一個標準。
經過了三次實驗,終於做出比較理想的「蒸蛋」。
材料的部份,講求簡單好準備。
原本只有醬油,但煮出來不夠好吃。
最重要的是「沒有香味」,沒有食慾可言。
所以研究了「香菇蒸蛋」的作法。
請準備香菇、醬油、雞蛋這三種材料。
一開始,請先處理一下香菇。
就是那種超市就買得到的乾香菇。
一到兩人份的蒸蛋,以三顆蛋為例。
個人覺得三朵就很多了。
這跟香菇本身的大小有直接關係。
拿出三朵香菇,先以冷水洗乾淨稍微泡水。
然後拿出電熱水壺,燒開滾水。
把洗淨的香菇剪開、切開後放進去。
讓香菇的「精華」被滾水沖出來。
滾水要放多少,其實跟打的蛋有多少有關係。
個人覺得與蛋白蛋黃1:1的情況最好。
這也是香菇放太多不妥的原因,等等整碗都香菇。
兩人份打三個蛋,差不多了。
調味料這邊只有醬油,應該可以加點香油。
個人覺得這樣就夠了,並不需要加鹽。
把醬油酌量加到香菇水裡面。
(千萬不要加太多,一點點就夠了)
準備開始打蛋。
微波爐蒸蛋的要訣,就是打蛋要用溫水或熱水。
不然微波時容易受熱不均勻,甚至表面結塊。
這也是為什麼倒在香菇的熱水不要太多。
配合蛋的份量調整,不要浪費香菇的精華。
另外,用溫熱水打蛋比較好打...
雞蛋、香菇打在一起之後,準備微波。
直接轉到最高溫,加熱三分鐘就好。
我看到有人作法是最低溫用十五分鐘。
不過我是用三分鐘最高溫的方式處理。
這就是成品,看起來賣相不佳。
但是香味四溢,連我室友都覺得今天怎麼有香味。
另外,建議用大一點的容器。
有可能在微波時膨脹而溢出,清理微波爐很麻煩。
用湯匙翻開下面看,顏色一樣均勻。
不過還是有非常多的小孔。
管他的,可以吃就好!
*******
不是我自賣自誇,吃起來的味道真的不錯。
沒想到多加一樣香菇之後,更好吃了。
蒸蛋的湯汁得到升級,味道真的有比較好。
如果要用更華麗一點,可以加魚板。
我在附近的超市都沒有看到,所以就不加魚板了。
您也許同樣感興趣的文章:
微波爐煮白米飯
微波爐煮水餃
2013年2月9日 星期六
用微波爐煮水餃
A guide for cooking dumpling by microwave.
*******
在過去的認知裡面,水餃就是用鍋熱水煮。
但是出外人哪有這麼方便?特別是禁用爐火時。
連使用電磁爐的權利都被剝奪了。
就這樣,繼微波爐煮白飯之後,又有新花招。
因為過年了,大家想吃水餃。
那就用微波爐煮水餃吧!
方法比想像中簡單、迅速,加上不黏鍋。
過去煮水餃時都很怕煮破,但是現在不要擔心。
連攪動都不需要,就能煮出餃子。
要準備的器材如下:
水餃、保鮮盒、淺盤、電熱水壺。
首先請用電熱水壺把水燒滾
同時間水餃可以先放在旁邊稍微解凍備用
水餃先放到保鮮盒裡面。
水滾之後直接倒入保鮮盒,水面蓋過水餃即可。
蓋上有通氣孔的蓋子,或者保鮮膜戳洞。
微波爐的功率開到最大,微波時間設定3分鐘。
之後開始微波,等待短短的3分鐘。
(大推IKEA這種高的保鮮盒,真的適合煮東西)
好了之後拿出來打開蓋子,請小心被蒸汽燙到。
水餃擺盤,煮出來的樣子非常好看。
沒有破跟黏一起的問題,吃起來跟水煮差不多。
配上醋跟醬油,吃起來味道不錯。
*******
就這樣,微波爐煮水餃比想像中方便。
整個過程也不過五分鐘。
整個過程也不過五分鐘。
您也許同樣感興趣的文章:
微波爐煮白米飯
微波爐煮白米飯
2013年2月8日 星期五
用微波爐煮白米飯
Cook rice by microwave is very easy.
And the most important: very quick.
*******
出國之前,猶豫要不要帶電鍋來。
因為從台灣帶電鍋,電壓跟新加坡不一樣。
大同電鍋要買到240V的,價格並不便宜。
就算買了,也不見得可以用:因為住宿舍!
事實上,也真的不能用。
有規定不能用的東西,通常是高瓦數的設備。
(那理論上也不能放雷射印表機...)
於是研究了一下,微波爐煮飯的方法。
(每一戶四人的宿舍都有微波爐)
非常幸運的,一次就搞定了。
首先請準備保鮮盒,要可以微波的那種。
IKEA買得到,價格並不貴。
(學校買一個,IKEA可以買兩個)
可以微波的保鮮盒,上面有一個活動的開口。
照片中藍色這種就不行了,保證煮飯時會炸開。
紅色透明蓋那個,上面有一個活動開口。
切記,這種蓋子完全沒有開口的保鮮盒。
拿來煮飯效果不太好。
米買來,洗米是一定要的。
記得要泡一下,大概十五分鐘到二十分鐘。
這樣煮出來會比較好吃。
然後米跟水的比例是1:1.5
也就是一杯的米,要放一杯半的水。
最後把整個保鮮盒放到微波爐。
請記得要先墊一個盤子,避免溢出水造成難清理。
(除了微波爐的轉盤之外)
另外,也可能因此把微波爐弄壞。
微波爐的功率要開到最大,時間十五分鐘。
十五分鐘以後,就有好吃的米飯了!
抱歉用iPhone拍的不夠清楚。
飯一點都不會黏保鮮盒,非常好清理。
*******
煮出來的東西不難吃,不輸給電鍋。
關鍵在水份的控制,不要微波的太乾。
室友:你也太有才了!

以後只要到樓下餐廳買菜配就好。
一碗飯賣0.5有點貴。
自己買5公斤的米,也才6元不到。
And the most important: very quick.
*******
出國之前,猶豫要不要帶電鍋來。
因為從台灣帶電鍋,電壓跟新加坡不一樣。
大同電鍋要買到240V的,價格並不便宜。
就算買了,也不見得可以用:因為住宿舍!
事實上,也真的不能用。
有規定不能用的東西,通常是高瓦數的設備。
(那理論上也不能放雷射印表機...)
於是研究了一下,微波爐煮飯的方法。
(每一戶四人的宿舍都有微波爐)
非常幸運的,一次就搞定了。
首先請準備保鮮盒,要可以微波的那種。
IKEA買得到,價格並不貴。
(學校買一個,IKEA可以買兩個)
可以微波的保鮮盒,上面有一個活動的開口。
照片中藍色這種就不行了,保證煮飯時會炸開。
紅色透明蓋那個,上面有一個活動開口。
切記,這種蓋子完全沒有開口的保鮮盒。
拿來煮飯效果不太好。
米買來,洗米是一定要的。
記得要泡一下,大概十五分鐘到二十分鐘。
這樣煮出來會比較好吃。
然後米跟水的比例是1:1.5
也就是一杯的米,要放一杯半的水。
最後把整個保鮮盒放到微波爐。
請記得要先墊一個盤子,避免溢出水造成難清理。
(除了微波爐的轉盤之外)
另外,也可能因此把微波爐弄壞。
微波爐的功率要開到最大,時間十五分鐘。
十五分鐘以後,就有好吃的米飯了!
抱歉用iPhone拍的不夠清楚。
飯一點都不會黏保鮮盒,非常好清理。
*******
煮出來的東西不難吃,不輸給電鍋。
關鍵在水份的控制,不要微波的太乾。
室友:你也太有才了!
以後只要到樓下餐廳買菜配就好。
一碗飯賣0.5有點貴。
自己買5公斤的米,也才6元不到。
2012年8月10日 星期五
詳解Windows 7授權升級版全新安裝
Because of the license, some Windows versions have restrictions.
Like you have to install previous version in hard drive before.
Or you can't activate your legal product cd-key.
*******
微軟的授權政策,常常製造一些合法使用者的麻煩。
雖然如此,你就是需要遵守,不然不爽不要用。
但是在合情合理的情況(我是指具有合法授權),作弊一下無妨。
我的情況是前篇文章的「教育版大量授權」 有合法序號,而非使用KMS啟動的版本。
這個版本有規定是採「升級版」的形式,必須要有已安裝的Windows。
不管是Windows XP、Vista或是其他OEM版本的Windows 7。
我的筆記型電腦就有Windows 7 Home Premium的隨機版。
機器的底部有貼合法的COA貼紙。
但是拿到的大量授權光碟有規定硬碟一定要有Windows。
如果我堅持採用全新安裝(Clean Install)。
裝好之後的啟動程序可能會有問題。
以下是輸入完序號等待線上驗證的畫面。
結果出現了錯誤訊息:0xC004F061
我們要做的就是修改Windows登錄檔,讓他以為是採用升級安裝。
請從開始功能表搜尋的地方輸入regedit,然後按滑鼠右鍵。
選擇「以系統管理員身分執行」
在登陸編輯程式中找到以下路徑
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OOBE
裡面有一個MediaBootInstall的項目
雙擊之後,把原本的機碼從1改成0。
確定之後關閉登錄編輯程式。
現在我們還需要命令提示字元。
一樣從開始功能表搜尋CMD,按右鍵「以系統管理員身分執行」。
命令提示字元的視窗開啟後,輸入以下指令:
slmgr /rearm
輸入完成之後按Enter鍵。
不久之後你會看到提示重新開機的訊息視窗,請重新啟動電腦。
重新啟動之後,從控制台裡面的系統。
最下面的地方有一個Windows啟用,點選立即啟用的連結。
一樣輸入序號等待線上驗證。
不久之後,啟動成功了!
恭喜你有正版的Windows可以用。
*******
希望這個方法可以節省你的時間,不需要每次都先裝舊版軟體。
個人覺得微軟也應該設計一個機制,在安裝時要求輸入舊版系統序號就好。
您也許感興趣的文章:
製作Windows 7 USB安裝碟
Like you have to install previous version in hard drive before.
Or you can't activate your legal product cd-key.
*******
微軟的授權政策,常常製造一些合法使用者的麻煩。
雖然如此,你就是需要遵守,不然不爽不要用。
但是在合情合理的情況(我是指具有合法授權),作弊一下無妨。
我的情況是前篇文章的「教育版大量授權」 有合法序號,而非使用KMS啟動的版本。
這個版本有規定是採「升級版」的形式,必須要有已安裝的Windows。
不管是Windows XP、Vista或是其他OEM版本的Windows 7。
我的筆記型電腦就有Windows 7 Home Premium的隨機版。
機器的底部有貼合法的COA貼紙。
但是拿到的大量授權光碟有規定硬碟一定要有Windows。
如果我堅持採用全新安裝(Clean Install)。
裝好之後的啟動程序可能會有問題。
以下是輸入完序號等待線上驗證的畫面。
結果出現了錯誤訊息:0xC004F061
我們要做的就是修改Windows登錄檔,讓他以為是採用升級安裝。
請從開始功能表搜尋的地方輸入regedit,然後按滑鼠右鍵。
選擇「以系統管理員身分執行」
在登陸編輯程式中找到以下路徑
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OOBE
裡面有一個MediaBootInstall的項目
雙擊之後,把原本的機碼從1改成0。
確定之後關閉登錄編輯程式。
現在我們還需要命令提示字元。
一樣從開始功能表搜尋CMD,按右鍵「以系統管理員身分執行」。
命令提示字元的視窗開啟後,輸入以下指令:
slmgr /rearm
輸入完成之後按Enter鍵。
不久之後你會看到提示重新開機的訊息視窗,請重新啟動電腦。
重新啟動之後,從控制台裡面的系統。
最下面的地方有一個Windows啟用,點選立即啟用的連結。
一樣輸入序號等待線上驗證。
不久之後,啟動成功了!
恭喜你有正版的Windows可以用。
*******
希望這個方法可以節省你的時間,不需要每次都先裝舊版軟體。
個人覺得微軟也應該設計一個機制,在安裝時要求輸入舊版系統序號就好。
您也許感興趣的文章:
製作Windows 7 USB安裝碟
訂閱:
文章 (Atom)

























