兩三年前在看電視的時候,就發現了冷泡茶的方法。
後來經過實驗之後,的確蠻好喝的,可以幾乎 100% 複製出回甘的感覺。
方法如下:找個寶特瓶,抓適量茶葉丟進去,加開水,丟到冰箱,放置約五到六小時就大功告成。以 600 cc 為例,茶葉的量約半個掌心。
注意事項:
- 不要拿茶包,拿好一點的茶,否則你永遠也別想泡出好喝的冷泡茶。
- 不要用熱開水或溫開水,要用冷開水。
- 不要丟在冰箱太多天。
Just thinking more…
兩三年前在看電視的時候,就發現了冷泡茶的方法。
後來經過實驗之後,的確蠻好喝的,可以幾乎 100% 複製出回甘的感覺。
方法如下:找個寶特瓶,抓適量茶葉丟進去,加開水,丟到冰箱,放置約五到六小時就大功告成。以 600 cc 為例,茶葉的量約半個掌心。
注意事項:
今天要用到時,才驚覺以前的筆記居然不見了…,努力回想了好一陣子,才想起來。
一般來說,如果不熟的話,最好是關掉 SELinux 選項。
那我為甚麼要用?…..別問了吧….
SELinux 的 policy 真的是複雜,複雜到我實在是不太想看下去。
這裡有個簡單的方法可以幫你產生 policy,首先,先去執行被 SELinux 阻擋的程式,然後執行
#audit2allow -d -o xxx.policy
這會產生 xxx.policy
接著把這個檔案複製到 /etc/selinux/targeted/src/policy/domains/misc/local.te
切到 /etc/selinux/targeted/src/policy/
執行 make reload
這樣就大功告成了。
p.s. 我的環境是CentOS 4.3,RHEL、WHEL、Fedora應該都差不多。
本來有想要把線路升級成 2M/256k,可是在仔細考量之後,發現我根本用不到那麼多,所以決定還是維持原樣:1M/64k。
然後把月繳改為年繳,預期可以更省下一些上網費用。
1M/64k:
月繳:219 x 12 = 2628
年繳:2292
2628 – 2292 = 336
電路費:410 x 12 = 4920
如果是用 2M/256k:
月繳:259 x 12 = 3108
年繳:2688
3108 – 2688 = 420
電路費:440 x 12 = 5280
也許移植一個 .Net application 到其他平台上,並不如想像中容易。
正如 Java application 並不是 100% 的 run anywhere。
Mono專案的頭頭最近把Paint.NET移植到 Linux 的Mono上,你可以看看這篇他的文章:Porting Paint.NET to Mono。
看到這個標題,我是很高興的,可是看完以後,發現移植的過程曲折離奇,其中的過程頗值得玩味。
昨天在代碼裡面看到一個從沒看過的用法,如下列紅色標示部份:
class MyBase {
protected:
int _id;
public:
MyBase():_id(0) {}
MyBase( int id ):_id(id) {}
int getId() {return _id; }
};
class MyClass: public MyBase {
public:
MyClass() {}
MyClass( int id ):MyBase( id ) {}
};
int myclass_mem[ sizeof(MyClass)/sizeof(int) ];
using namespace std;
MyBase* test()
{
return new (myclass_mem)MyClass( 100 );// 這裡 (1)
//return new MyClass( 100 ); // (2)
}
int
main( int argc, char* argv[] )
{
int len = sizeof( myclass_mem );
cout << "The size of myclass_mem is " << len << endl;
cout << "content of myclass_mem" << endl;
for( int i=0; i<len; i++ )
cout << myclass_mem[i] << ” “;
cout << endl;
MyBase* base = ::test();
cout << base->getId() << endl;
cout << "content of myclass_mem" << endl;
for( int i=0; i<len; i++ )
cout << myclass_mem[i] << ” “;
cout << endl;
}
以執行的結果來說,我實在是分辨不出來 (1) 與 (2) 有甚麼分別。
後來我用 gcc -S 去分別產生組合語言碼,總算是大致猜到了,原來以 (1) 的方法來寫,會把 new 以後的結果也複製到 myclass_mem 這個陣列裡面。
所以加上輸出 myclass_mem 內容的程式碼,再分別產生執行檔來看執行結果就很清楚了。
真是特別。
自從使用 ctags 以後,看code方便多了。最近又看到taglist,心想或許可以讓看code的生活變得更美好,所以就來摸索看看。
首先到這裡下載最新版本。
解開以後,有兩個目錄,一個是 doc,另外一個是 plugin,把他們複製到你的 HOME 的 vimfiles 目錄下(舉例:c:\documents and settings\your_name\vimfiles\),然後在你的 _vimrc 裡面指定 Tlist_Ctags_Cmd 變數,這是用來讓 taglist 知道 ctags 的路徑。
我是把 ctags.exe 放在 c:\tools 下,所以是這樣寫:
let Tlist_Ctags_Cmd=’c:\tools\ctags.exe’
這樣就大功告成了。
使用的時候,
。
備註:
我沒在 Linux 下用過,安裝方法應該差不多;記得把 HOME 替換為 /home,vimfiles/ 替換為 .vim/。
Console 模式下,有比較特別,文件說,因為 terminal/console 不支援變動視窗寬度,所以要設置 Tlist_Inc_Winwidth 為 0。
資料的繫結基本上都是靠 Controls.DataBindings,所以
text1.DataBindings.Add( new Binding(“Text”, ds, “customers.custNo”) );
就可以把 text1 這個控制項的 Text 屬性繫結到 ds.Tables[“customers”] 的 custNo 欄位上。
如果想要有一些處理與變化,那麼可以透過 Binding.Format 與 Binding.Parse:
Binding b=new Binding(“Text”, ds, “customers.custOrder.OrderAmount”);
b.Parse+=new ConvertEventHandler( currencyStringToDecimal); // currencyStringToDecimal 是自訂的
b.Format+=new ConvertEventHandler( DecimalToCurrencyString ); // DecimalToCurrencyString 也是…
text3.DataBindings.Add(b);
這表示在轉換控制項屬性到資料來源的時候,會透過這兩個事件作變化。
Parse 表示控制項到資料來源,而 Format 正好相反。
都繫結上了以後呢?我們可以透過 BindingManagerBase 來作巡覽。
BinderManagerBase bm = BindingContext[ dataset, “tablename” ];
此時可用 bm.Position 取得位置,bm.Current 取得當前的物件(如果資料來源是 datatable,那就是 DataRowView;若是陣列,那就是所指向的元素)
bm.Position+1 就是下一筆,反之則是上一筆。到了最後一筆的時候,bm.Position+1 以後仍然會是一樣。
那麼,位置移動的時候會觸發甚麼事件?PositionChanged。所以我們可以撰寫自己的處理事件,
PositionChanged+=new EventHandler( this.fmMain_PositionChanged )
不僅僅是 TextBox 可以作,只要有提供 DataBindings 屬性的控制項都可以。
把 Button 的 Text 屬性 Bind 到某資料來源的某欄,而 Enable 屬性又 Bind 到 某欄時,那麼當移動資料來源位置的時候,就可以讓 Button 的相關狀態自動改變了。
這讓我想到似乎可以作一些 state machine 的東西…