錯誤 1935

在某些時候,安裝 .Net framework redistributable package 會失敗,出現如下的錯誤訊息:
錯誤 1935。An error occured during the installation of assembly component {….}. HRESULT: -2147319761.
netframeworkinstallation_1935_error
這時候你可以參考這位大老寫的剖析,相當清楚:Troubleshooting 1935 and 2908 errors during installation
我(或者應該說是我朋友)遇到的情況是用如下步驟就可解決:

  1. 將 %windir%\system32\mscoree.dll (在 Windows 98/me 上是 %windir%\system\mscoree.dll) 更名。
  2. 如果 %windir%\system32\urttemp 存在的話,刪除掉。(在 Windows 98/me 上是 %windir%\system\urttemp)
  3. 重新執行 .Net framework redistributable package 安裝程式

sp_attach_db

用法很簡單…

EXEC sp_attach_db @dbname = N’pubs’,
@filename1 = N’c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf’,
@filename2 = N’c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf’

在 osql command line mode 下輸入以後,記得再輸入 go,表示執行指令。
參考資料:

冷泡茶

兩三年前在看電視的時候,就發現了冷泡茶的方法。

後來經過實驗之後,的確蠻好喝的,可以幾乎 100% 複製出回甘的感覺。

方法如下:找個寶特瓶,抓適量茶葉丟進去,加開水,丟到冰箱,放置約五到六小時就大功告成。以 600 cc 為例,茶葉的量約半個掌心。

注意事項:

  1. 不要拿茶包,拿好一點的茶,否則你永遠也別想泡出好喝的冷泡茶。
  2. 不要用熱開水或溫開水,要用冷開水。
  3. 不要丟在冰箱太多天。

SELinux tip

今天要用到時,才驚覺以前的筆記居然不見了…,努力回想了好一陣子,才想起來。
一般來說,如果不熟的話,最好是關掉 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應該都差不多。

2006續約的考量

本來有想要把線路升級成 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

Porting

也許移植一個 .Net application 到其他平台上,並不如想像中容易。
正如 Java application 並不是 100% 的 run anywhere。
Mono專案的頭頭最近把Paint.NET移植到 Linux 的Mono上,你可以看看這篇他的文章:Porting Paint.NET to Mono
看到這個標題,我是很高興的,可是看完以後,發現移植的過程曲折離奇,其中的過程頗值得玩味。

new之後,constructor之前

昨天在代碼裡面看到一個從沒看過的用法,如下列紅色標示部份:

#include <iostream>

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 內容的程式碼,再分別產生執行檔來看執行結果就很清楚了。
真是特別。

好人卡

沒事去參加團購,買了這個,準備當作禮物送人…
誰會是第一個好人?
好人卡拆箱照(1)
好人卡拆箱照(2)
好人卡拆箱照(3)

taglist的安裝與使用

自從使用 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’

這樣就大功告成了。
使用的時候,

  • 用 :TlistOpen 指令把 taglist 視窗叫出來,用 :TlistClose 指令關閉 taglist 視窗
  • 用 :TListToggle 來打開或關閉 taglist 視窗
  • 可以用 ctrl-w h 與 ctrl-w l 來切換 taglist 視窗與編輯視窗
  • 開啟檔案以後,taglist會自動把 tag 資訊列在左邊視窗。


備註:
我沒在 Linux 下用過,安裝方法應該差不多;記得把 HOME 替換為 /home,vimfiles/ 替換為 .vim/。
Console 模式下,有比較特別,文件說,因為 terminal/console 不支援變動視窗寬度,所以要設置 Tlist_Inc_Winwidth 為 0。