顯示具有 自我學習 標籤的文章。 顯示所有文章
顯示具有 自我學習 標籤的文章。 顯示所有文章

2012年5月17日 星期四

懶人Unzipo

事實證明,越懶的人....越勤快....

因為在網路上"索取"了一些測試檔案
又懶得一個一個點開來解壓縮
就寫了一支程式來幫忙了...

流程大概如下:

  1. 搜尋所有類型檔案
  2. 檔案分組 >分成 7z單檔、7z多檔、rar 單檔、rar多檔、zip單檔
  3. 個別對分組群的 7z多檔、 rar多檔檢查檔案是否完結
    1. 抓取分佈檔1來判定頭檔是否存在
    2. 根據檔案大小判定尾檔是否存在
    3. 擷取尾檔檔名來判定檔案數量是否正確
  4. 讀取密碼表
  5. 對所有有效的分組群進行解壓縮
  6. 根據解壓後的資訊判定檔案是否正確
  7. 對所有錯誤的分組群進行 rar 測試(7z和zip的就不鳥它了)
  8. 取得錯誤的rar檔案名稱後進行fix,並rename回原本檔案
  9. 再次對錯誤的分組群進行流程5
  10. 移除*.html *.bat *.lnk *.htm
  11. done~
這是Step5 (Step1~4是看不到的、Lack是指檔案沒下載完、Fail是指檔案損毀)

這是Step8 (Step6-7是看不到的)

這是Step9


這就是結果了~







by Keng-li.Lin

2012年5月11日 星期五

手作Smile Passport(319 Passport)

最近想到以前黃瓶子給我看過的那個微笑護照(N年前有喔....

本來想去旅遊中心拿的,但現在到處都拿不到,

而且天下雜誌目前也沒有再出版的計畫,

原本想上網買的,但都是2011年版,沒有新的五都內容

而且....那原本是免費的耶,居然要給人家坑一筆,就不是很高興

於是在網路上找到了人家做的樣板文檔來參考,自己改了一下

增加了五都的內容與改善(爛!?)了使用方式

改好後的成品就像這樣










有需要的可以下載來用(  SmilePassport-N使用說明書.doc 有一些說明和列印方式 )

(直接線上觀看格式會跑掉,請務必下載後用office word 2003以上的版本開)

SmilePassport

by Keng-li.Lin

2012年3月8日 星期四

Using MCR in Windows Azure Web/Worker Role

ppt版本
找了眾多的方法,終於找到一種可以用的了
首先說明我使用的架構是User <=WCF=> Web Role <=Azure Queue=> Worker Role(Run MCR)
皆為64位元版本
在此只講Worker Role環境架設就好。

行前準備:
MCRInstaller.exe <== 自己想辦法得到
BootStrapper.exe <== Google "Windows Azure Bootstrapper"
vcredistx64.exe  <== Google一下,可以抓到
AzureStorageExplorer4.exe <== Google "AzureStorageExplorer" (可以先在本機端上安裝)

動作:
1.將取得的MCRInstaller.exe
(在Windows Server 2008 R2的作業系統上執行安裝一次,建議安裝路徑為:D:\Program Files\MATLAB\MATLAB Compiler Runtime\v714\runtime\win64\ ,此範例使用64位元 R2010b版本,不同版本路徑會有差異,注意一下就好)
(沒電腦的話,開一台Worker role用遠端桌面登入安裝好後,再抓回來是個笨方法,但有時還蠻好用的...)

2.到剛安裝的路徑D:\Program Files\,把MATLAB整個資料夾用"zip"壓縮起來,在此命為MATLAB.zip

3.開啟AzureStorageExplorer,在你的Blob中建立新的Container名為initfile

4.將MATLAB.zip上傳到雲端Blob的initfile下

5.將vcredistx64.exe上傳到雲端Blob的initfile下

6.開啟你的雲端專案,在ServiceDefinition.csdef 的WorkerRole部分,設定Startup 和 Runtime如下:


7.在WorkerRole的環境中增加連接字串 "ConnectionString" ,並將他定為放置MATLAB.zip的Storage位置

8.在WorkerRole的專案中加入新的檔案名為InstallVcredistx64.cmd,設定"永遠複製",其檔案內容如下:
d:\vcredistx64.exe /q

9.在WorkerRole的專案中加入BootStrapper.exe (和 BootStrapper.exe.config),設定"永遠複製"。

10.將D:\Program Files\MATLAB\MATLAB Compiler Runtime\v714\toolbox\dotnetbuilder\bin\win64\v2.0\MWArray.dll加到WorkerRole的專案中,順便將自己要用的DLL一起加入,並設定"永遠複製"。
注意:自己的DLL也要用相同本版的Matlab編譯成的才行

11. 確認其他的專案也弄好後,就可以發佈了,發佈的服務位置最好和Storage相同,不然起始時會很慢。

by Keng-li.Lin

2011年11月15日 星期二

Windows 作業系統的暫存檔功能

這是在 [小朱® 的技術隨手寫] 中找到的
由於暫存檔會交由WS自行清除,也不用費心去想檔名和自己清除,應該有可以利用的空間。

以下為節錄修改後的程式範例:

FileInfo tempFile = new FileInfo(Path.GetTempFileName());
FileStream fs = tempFile.OpenWrite();
fs.Write(DataString, 0, DataString.Length);
fs.Close();
// tempFile.FullName 檔案位址


來源網址:
[bug逃走中][.NET] 莫名奇妙的 "在根層次的資料無效,行1,位置1"
http://www.dotblogs.com.tw/regionbbs/archive/2011/09/10/35944.aspx

by Keng-li.Lin

2011年11月14日 星期一

Stop WebClinet.DownloadFiles() in MultiThread

使用WebClinet在multithread環境下下載檔案時的停止方式

ThreadList為 List元件 Thread形態的全域變數

假定Thread宣告內容為
Thread t1 = new Thread(() =>;
{
 try
 {
  using (WebClient mywebclient = new WebClient())
  {
   string sUrlToReadFileFrom = ImageUrl;
   string sFilePathToWriteFileTo = targeturl;
   Stream streamRemote = null;
   Stream streamLocal = null;
   using (WebClient client = new WebClient())
   {
    try
    {
     streamRemote = client.OpenRead(sUrlToReadFileFrom);

     streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None);

     int iByteSize = 0;
     byte[] byteBuffer = new byte[4096];

     while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
     {
      streamLocal.Write(byteBuffer, 0, iByteSize);
     }
    }
    catch (System.Net.WebException){// 可加入console.write}
    catch (Exception){// 可加入console.write}

    if (streamLocal != null){
streamLocal.Close();}
    if (streamRemote != null){streamRemote.Close();}
   }
  }
 }
 catch (System.Net.WebException){// 可加入console.write}
 catch (Exception){// 可加入console.write}
 ThreadList.Add(t1); 

 t1.Start();
}

停止則是另開了一個BackgroundWorker來進行
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
 int icount = 0;
 for (int ia = 0; ia < ThreadList.Count; ia++)
 {
  if (ThreadList[ia].IsAlive)
  {
   ThreadList[ia].Interrupt();
   icount++;
  }
  else
  {
   ThreadList[ia] = null;
  }
 }
 Thread.Sleep(500);
 bool totalStop = false;
 while (!totalStop)
 {
  totalStop = true;
  icount = 0;
  Thread.Sleep(500);
  for (int ia = 0; ia < ThreadList.Count; ia++)
  {
   if (ThreadList[ia] != null)
   {
    if (ThreadList[ia].IsAlive)
    {
     totalStop = false;
     icount++;
    }
    else
    {
     ThreadList[ia] = null;
    }
   }
  }
 }
}


by Keng-li.Lin

2011年11月10日 星期四

giveMeBreakfast 練習程式

最近完成了一個抓網頁的程式

開發環境:
Visual Studio 2010 .net 4

主要功能流程:
1.為抓取洪爺的網頁
2.截取分頁帖數量與連結後,置入Queue中
3.啟動Timer元件進行,對Queue中的連結進行內頁內碼擷取
4.轉換內碼,移除所有特殊html語法,並開啟Thread,使用WebClient進行圖片背景下載
5.將轉換後的內碼組合成html網頁
6.等待圖片下載完成後,自動展示網頁。

主要學習目的為:
web網頁擷取、html語法、多執行序分工

原始碼載點(google Docs空間):
giveMeBreakfast[source].7z
或
https://docs.google.com/leaf?id=0B4zlMKG7kf2mZTMyZDZlM2YtY2NiMi00MzRiLTg4YWQtZDYxMzAwOTFlMDcz

執行檔載點(google Docs空間):
giveMeBreakfast[bin].7z
或
https://docs.google.com/leaf?id=0B4zlMKG7kf2mNzM2NDVlMDMtMmNmMS00ODhiLWI4YTgtNmUxNDRhOTEyODFm

p.s. 此程式行為符合網站操作流程,非惡意攻擊程式,請放心使用。
另外,程式展示的內容含有限制級內容,請慎重考慮後使用。
by Keng-li.Lin

2011年10月31日 星期一

giveMeporm程式練習

最近完成了一個有關抓網頁的練習
有興趣的可以抓下來看

直接開網頁板
giveMeporn[bin].7z

giveMeporn[source].7z

全抓下來在看板
giveMeporn2[bin].7z

giveMeporn2[source].7z

檔案放在Google Docs
可以直接抓不用登入

 p.s.程式內容是18禁限制的
請小孩子不要下載喔

 by Keng-li.Lin

2011年10月27日 星期四

C# 解決WebBrowser 網頁中文為亂碼的方式

WebBrowser WB = new WebBrowser();

using (StreamReader SR = new StreamReader(WB.DocumentStream, System.Text.Encoding.GetEncoding("BIG5"))) // 要先確認該網頁使用的編碼
{
using (StreamWriter SW = new StreamWriter(".\\WebDocument.txt"))
{
SW.Write(SR.ReadToEnd());
SW.Flush();
SW.Close();
}
SR.Close();
}
WB.Dispose();
WB = null;



by Keng-li.Lin

2011年10月17日 星期一

C# 修改資料夾或檔案的隱藏屬性

// 隱藏檔案
String strFileName = @"C:\test.txt";
FileInfo fileInfo = new FileInfo(strFileName);
fileInfo.Attributes = FileAttributes.Hidden;


// 隱藏資料夾
String strDirName = @"C:\test";
DirectoryInfo diMyDir = new DirectoryInfo(strDirName);
diMyDir.Attributes = FileAttributes.Hidden;


Ref:  http://msdn.microsoft.com/zh-tw/library/system.io.filesysteminfo.attributes.aspx

2011年9月13日 星期二

解決重VS2008轉換到VS2010出現 Error: This file requires _WIN32_WINNT to be #defined at least to 0x0403. ....的錯誤


發生原因是代碼定義值是舊版VS訂的
所以只要更換定義值即可

在各專案中,如果標頭檔中有stdafx.h的話
只要在裡面填加

==========================================================================
#ifndef WINVER // 允許使用 Windows 95 與 Windows NT 4 (含) 以後版本的特定功能。
#define WINVER 0x0501 // 將它變更為針對 Windows XP (含) 以後版本適當的值。
#endif

#ifndef _WIN32_WINNT // 允許使用 Windows NT 4 (含) 以後版本的特定功能。
#define _WIN32_WINNT 0x0501 // 將它變更為針對 Windows XP  (含) 以後版本適當的值。
#endif

#ifndef _WIN32_WINDOWS // 允許使用 Windows 98 (含) 以後版本的特定功能。
#define _WIN32_WINDOWS 0x0501 // 將它變更為針對 Windows Me (含) 以後版本適當的值。
#endif

#ifndef _WIN32_IE // 允許使用 IE 4.0 (含) 以後版本的特定功能。
#define _WIN32_IE 0x0601 // 將它變更為針對 IE 5.0 (含) 以後版本適當的值。
#endif
==========================================================================
如果有相同的定義名稱,也可以改定義值即可


by Keng-li.Lin

2011年9月5日 星期一

Windows Azure 建置托管服務

Step.1 開啟Windows Azure 平台 左下角[託管服務、儲存體XXXX]  > 左中間[託管服務] > 左上角[新增託管服務]




Step.2 建立新託管服務 
  1. 設定服務名稱(自取)
  2. 設定URL(想一個全世界唯一個,一般使用英文小寫加數字)
  3. 選擇儲存體(跟Storage同一個比較好)
  4. 選擇不佈署(僅建立服務個體)







Step.3-1 加入憑證 未加入憑證的託管服務無法佈署! 按左上方加入憑證


Step.3-2 加入.pfx加密憑證 加入用來佈署的那台VS所使用的.pfx加密憑證
加密憑證製作方法,請參照



by Keng-li.Lin

Windows Azure VM Role 建置

由於步驟跟內容太多了


請直接連結到Google Docs觀看


~~~~~~~VM Role建置~~~~~~~

p.s. 部分內容會參照到其他文章

by Keng-li.Lin

Windows Azure 建置憑證 - 匯出備份憑證

Step.1 開啟[執行] > certmgr.msc 在個人 > 憑證 中,找到與會出的憑證 點 右鍵 > 所有工作 > 匯出


Step.2 憑證匯出 點選會出私密金鑰

點選 pfx匯出格式(也只有這個可以用)

設定密碼 與 匯出位置 後即可。

by Keng-li.Lin

Windows Azure 建置憑證 - 自行建置憑證

以下範例所使用的憑證號與拇指紋請使用自己的~ 照著圖片打是無效的 


Step.1 先將makecert.exe 移到C:\Windows\System32中 使用的是Win 7環境,路徑在C:\Program Files\Microsoft SDKs\Windows\v7.0A\ bin\ 下 沒有的可上網找


Step.2 開啟指令模式 ,移動到想放置憑證的位置 鍵入 makecert -sky exchange -r -n “CN=yourname1” -pe -a sha1 -len 2048 -ss My “yourname2.cer“ yourname1是發行者 yourname2是憑證名 範例檔名為 lingpxs45.cer


Step.3 開啟[執行] > certmgr.msc 在個人 > 憑證 中,可以找到剛剛產生的憑證檔 點 右鍵 > 內容,修改好記的名稱。



Step.4 開起VS後,根據[Windows Azure 建置憑證 - 利用Visual Studio流程]到Step3時,即可看到自己產生的憑證了。
by Keng-li.Lin

Windows Azure 建置憑證 - 利用Visual Studio

以下範例所使用的憑證號與拇指紋請使用自己的~ 照著圖片打是無效的~
Step.1 在作為管理的Visual Studio上,選[檢視] > [伺服器總管]


Step.2 在Windows Azure Compute上右鍵>Add Deployment Environment…


Step.3 選擇新增


Step.4 可點選產生新的憑證,或使用Visual Studio之前的憑證. 第二項可以連結到憑證位置,如:C:\Users\lingpxs\AppData\Local\Temp\uarlqm2d.zi3\PublicKey 86-45.cer


Step.5 到管理平台點選加入憑證,貼上Step.4的路徑



Step.6 建立完成後,將訂閱用戶的ID貼到Visual Studio中。到管理平台點選加入憑證,貼上Step.4的路徑,並命名即可。 過程會與Windows Azure連線建立憑證,請確認網路是否通暢。



Step.7 完成後,重新進入即可看到剛剛產生的憑證。


Step.n 如果憑證太多用不到,可以在[開始] > [執行 > ”certmgr.msc” 裡。 個人>憑證 中 刪掉多餘的。
by Keng-li.Lin

2011年8月23日 星期二

利用WCF服務實現傳輸大型檔案

最近和學弟一起玩 Windwos Azure 雲端開發,使用WCF服務時發現的一個問題
"參數不能傳送較大的檔案"

原來是要把檔案用Stream 或 byte[]的方式放在服務參數的方式來實現Server - Client互傳檔案時
會一直出現記憶體配置錯誤

WCF服務契約中有預設傳送內容大小
所以要實現這的方式需要手動更改服務契約內容

如下修改範例~

1.打開Windows Visual Studio 2010(我只有這版...
新增一個C#的WCF服務應用程式,做為Server端(在此範例中取名叫 WCFServerSite)
另外在新增一C#的Windows Form應用程式,做為Client端(WCFClientStie)

2.在WCFServerSite的IService1.cs中增加一OperationContract

// 增加新的服務
[OperationContract]
string UploadData(Stream SourceStream);


2.在WCFServerSite的Service1.svc.cs中定義 UploadData的內容

public string UploadData(Stream SourceStream)
{
byte[] buffer;
FileStream TargetFS = new FileStream( System.Web.Hosting.HostingEnvironment.MapPath("~") + "\\Temp.file", FileMode.Create);
try
{
BinaryReader BR = new BinaryReader(SourceStream);
BinaryWriter BW = new BinaryWriter(TargetFS);
do
{
buffer = BR.ReadBytes(1024);//可自行調整
BW.Write(buffer);
}
while (buffer.Length > 0);
BW.Close();
}
finally
{
SourceStream.Close();
TargetFS.Close();
}
return string.Format("Good Job");
}


ps. 由於UploadData中使用到寫檔指令,須確認IIS是否有開起寫入權限。



3.將Service發布到IIS中(此範例所設定的發佈路徑是 http://localhost/WCFServerSite/Service1.svc)

Client端中參照的命名空間名稱設為SR

在Form中新增一Button和OpenFileDialog元件
Button內容如下:

private void button1_Click(object sender, EventArgs e)
{
SR.Service1Client SRC = new SR.Service1Client();
openFileDialog1.ShowDialog();
try
{
MessageBox.Show(SRC.UploadData(openFileDialog1.OpenFile()));
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
}


確認Client端可正常使用服務參照,且使用一般小檔(1-3kb)傳輸。

4.修改Server端 Web.config設定
設定如下:


5.修改Client端 app.config設定
設定如下:


6.這樣就完成了~

盡量不要為求方便設定太大,少量多傳才是好的架構!

2009年5月1日 星期五

自我學習:指標參照

剛剛看了一下C_and_C++版
記一下重點...


預設
int a1;
int *a2;
a2 = &a1;

比較下列三式的不同所在

void func1(int *p1)
void func2(int* &p2)
void func3(int **p3)

==================================================

第一比較簡單

就是所謂的指標型態

在程式外圍須傳入指標形態 例如

func1(&a1);
or
func1(a2);

而在func中要更改p1內值須使用(*p1)

-----------------------------------------

第二個比較少見

他是指標的參照

在程式外圍需傳入指標的參照

也就是func2(&a1) or func2(a2);

跟第一很像

但&p2在編譯時不會另外配置空間

-----------------------------------------

第三個就常見多了

就是指標的指標

一般用在製作二維陣列上

例如:
int a[5][5];//此a為 二維指標
func3(a);

============================================

比較說明:

舉個例,一般的int a=5;

放置在記憶體0FFF這個位置

所以在程式中,a可以說是替代成0FFF

讀取a的話,會讀取到0FFF這個記憶體位置上的值,也就是5;

-------------------------------------------

而指標不同

舉個例:
int a = 6; //a表示的記憶體位置0FFF 內值為6
int* b; //b表示的記憶體位置0EEE 內值未定

此時,如果執行
b = &a;

在記憶體位址0EEE中的內值將會變成0FFF;

在讀取b時,要使用*b來讀取

系統知道b視為指標變數

會將b的內值是為真值的所在位置

也就是0FFF中的值 => 6

------------------------------------------
參照!

之前說了
int a=5; //a代表記憶體位址0FFF 內值為5
此時另設一個
int b; //b代表記憶體位址0EEE

執行
&b=a;的話
b代表的記憶體位址會改變,變成0FFF
所以a跟b都代表0FFF 內值為5

不過!

這只能執行在初始宣告中

也就是b的宣告時

所以只有下式是合法使用的

int &b = a;

其餘時使用都不合法!


by Keng-li.Lin

自我學習:函式返回指標


有關於函式返回指標

也就是 int func1() 和 int &func2() 的差別

一般而言

假設{}內容都是return n;

int func1() 所返回的值會先放至在一個暫時性變數TP中

這個TP會再進入func1時生成,出來結束指令後消失

所以可以用一個變數去接

例如: int a = func1();

會變成 N -> TP -> a

TP會再將值傳入a後,即被delete掉。

所以 如果是用 int &a = func1();

a指到的會是個被delete掉的非法區域


而int &func2()使用方式較不一樣

內容假設一樣為 return n;

差別在這次並不會產生暫時變數TP

所以執行 int &a = func2();

會直接變成

n -> a

迴傳的值會存在該行當中

此時,如果n為全域變數 或者 經由外部參照近來的值

則會合法存在

也就可以使出下列用法

例如: func2()=9l;

func2()在執行完後,會變成一個已經早已存在的全域值的位置

但如果n是func2()的內部變數

此實執行 func2()=9l;的話

91會被放到被delete掉的n的位置

變成非法給值
=================================================

以下是網路上找到的一個使用例子
=================================================

來源:http://zhidao.baidu.com/question/58852657.html?fr=qrl&fr2=query


by Keng-li.Lin

2009年2月26日 星期四

自我學習:從錯誤中學習

今天去面試
被問倒了
看來我真的很嫩很嫩...
不過還是要學習一下

===================================================================================
What is Memory leak?

以下是wikipedia的原文解釋
In computer science, a memory leak is a particular type of unintentional memory consumption by a computer program where the program fails to release memory when no longer needed. This condition is normally the result of a bug in a program that prevents it from freeing up memory that it no longer needs.

This term has the potential to be confusing, since memory is not physically lost from the computer. Rather, memory is allocated to a program, and that program subsequently loses the ability to access it due to program logic flaws.

簡單的說,就是我們所謂的記憶體垃圾,C/C++中並無像Java或C#有垃圾收集器,所以指標的亂用可能會造成記憶體裂縫。
而所謂的記憶體垃圾,就是我們在程式執行間所分配出來使用的記憶體,在使用完後,沒有有效的清除,或者清除了以後,卻仍有指標索引的,很容易造成bug出現。所以良好的寫程式習慣是一定要的,使用指標完要確實delete掉,且指標要轉成NULL。


=====================================================================================
描述 Macro、inline function、function的不同

Macro 巨集
在編譯時,程式碼中有呼叫巨集的部份,將會被原始巨集所取代,就是複製一份去覆蓋的地方,好處是程式執行不用跳離,壞處則是增加程式碼容量。

先說function
function函式
編譯時,呼叫到函式的地方會變成jump指令,jump到函式編譯的位址,在使用時,發現要進入函式時,會先要求OS配置記憶體,載入好函式指令後,再進入執行。優點是主程式不肥,需要用時再載入,加快程式準備時間,但缺點是一但要使用函式,會花時間去載入。

inline function
行內函式
介於macro與function之間,以下是wiki的解釋
In computer science, an inline function is a programming language construct used to suggest to a compiler that a particular function be subjected to in-line expansion; that is, it suggests that the compiler insert the complete body of the function in every context where that function is used.
簡單的說,寫上inline的function,compiler會去判定適不適合展開,如果適合,會像Macro一樣在程式碼內展開,如果不適合,就會像一般的function一樣使用jump執行。而展不展開是根據compiler決定,不同的compiler會有不同的作法。




=====================================================================================
Virtual function虛擬函式
因為太長了,所以直接貼網路上找到的
來源

虛擬函式(Virtual function)

當我們使用繼承的方法來使用其他類別的函式時,會出現一個問題,即別的類別的函式,
並不完全適合我們的需求,因此,便有了" 虛擬函式"(virtual function)的設計。透過虛擬函式,
我們可以更改函式成為我們所要的function。

虛擬函式的宣告
在函式的前頭加上" virtual ",即宣告此函式為虛擬函式。


// The general syntax for declaring virtual functions is as follows:
class className1
{
// member functions
virtual returnType functionName();
};

class className2 :public className1
{
// member functions
virtual returnType functionName();
};

虛擬函式的特性:

虛擬函式是一種動態的函式,此類函式必須要等到函式執行時,才決定要執行什麼程
式。
見下面的範例


The following example shows how virtual functions can successfully implement polymorphic behavior in the cA and cB classes

#include

class cA
{
public:
virtual double A(double x) {return x * x ; }
double B(double x) {return A(x)/2;}
};

class cB : public cA
{
public:
virtual double A(double x) {return x * x * x ; }
};

int main( )
{
cB aB;
cout << aB.B(3) << "\n";
return 0;
}

範例解說:

class cA
{
public:
virtual double A(double x) {return x * x ; }
double B(double x) {return A(x)/2;}
};
class cB : public cA
{
public:
virtual double A(double x) {return x * x * x ; }
};

宣告虛擬函式
我們在分別在類別cA中及類別cB中宣告一個虛擬函式 :

virtual double A(oduble x) {return x*x ; }

和

virtual double A(oduble x) {return x*x*x; }


這二種函式的運算並不相同,而這二個宣告為虛擬函式的部分,必須要等到函式
執行才決定要傳回 x*x 或是 x*x*x .

類別cB繼承類別cA, class cB: public cA

int main( )
{
cB aB;
cout << aB.B(3) << "\n";
return 0;
}


在主程式的地方,我們宣告一個物件aB,其類別為cB : cB aB
接著,我們做aB的B函式的運算,x值為3, aB.B(3)

class cB : public cA
{
public:
virtual double A(double x) {return x * x * x ; }
};


在cB中並沒有函式B,所以我們回到上一層繼承的類別cA中找:

class cA
{
public:
virtual double A(double x) {return x * x ; }
double B( double x ) {return A(x)/2;}
};


找到函式B,然後將x=3代入,這時,我們可以發現,其傳回函式為:return A(x)/2
,函式A被宣告為 virtual。
被宣告為 virtual的函式,必須要等到函式執行至此的時候才決定要執行什麼;我
們回到cB中可以發現,cB中也有函式A。

compiler這時候要如何決定用cA還是cB的函式呢?
因為我們要計算的是cB.B(3),因此,compiler一但發現繼承而來的類別cA中的函式A被
宣告為virtual,compiler便不會直接使用cA的A函式,它會回到cB中看看cB中是否有A函式:

class cB : public cA
{
public:
virtual double A(oduble x) {return x * x * x ; }
};


結果找到了! 在cB有一個虛擬函式 A
compiler此時便不用cA中而使用cB中的函式A了。

在設計類別(Class)的時候,透過虛擬函式(virtual function)的設計,可以讓程式變得更有彈性;
尤其是當我們所設計的類別在未來有被其他類別繼承的可能,而函式有被修改的可能及
必要時,最好能夠設計為virtual function,以提供其他類別能夠修改使用函式。

====================================================================================
const用法
具體定義:常量、不可變動,常用在防止數值被修改。下面有一些用法
int XXX(const int array[], int num)
在XXX函式中,array[]只可以被取值,不可填值,也就是說,只可出現 = array[],不可出現array[]=的形式。

另一些用法說明
const char ch = 'a';
//ch為'a',且不可變動。

const int a[5] = {1, 2, 3, 4, 5};
//a[]陣列內值固定,不可變動。所以使用時要事先給定義值。

const int *p = b;
//b是陣列的地址,p是指向常量的指針,b陣列值不可經由p來更改,例如:
// *p = 10; --Error
// *(p + 2) = 1; --Error
// b[0]=0; OK

int * const p = b;
//b是陣列的地址,p是常量型指針,p的位址值不可改變,但所指的值可以變,如:
// *p = 0; OK
// *(p+1) = 0; OK
// p++; Error
// b[0]=0; OK

const int * const p = b;
//b是陣列的地址,p是常量型指針,且p指向常量。所以p本身不能改,也不可經過p更改b的值。
// *p = 0; Error
// *(p+1) = 0; Error
// p++; Error
// b[0]=0; OK


例如A本身沒定義const,利用A更改不會出錯,如果B以const連到A,則不可藉由B來更改A的值,但A可以更改自己的值。
如果A本身定為const,則不可利用A更改內值,且任何連到A的B,都不可以更改A值。

by Keng-li.Lin

2009年2月2日 星期一

自我學習:強子對撞機

內容節錄於維基百科

大型強子對撞器(Large Hadron Collider,簡稱:LHC)是一座位於瑞士日內瓦近郊歐洲核子研究組織CERN的對撞型粒子加速器,作為國際高能物理學研究之用。

2008年9月10日開始試運轉,並且成功地維持了兩質子束在軌道中運行,成為世界上最大的粒子加速器設施。

2008年9月19日,LHC 第三與第四段之間用來冷卻超導磁鐵的液態氦發生了嚴重的洩漏,目前據推測是由於聯接兩個超導磁鐵的接點接觸不良,在超導高電流的情況下融毀所造成的。依據 CERN的安全條例,必需將磁鐵升回到室溫後詳細檢查才能繼續運轉,這將需要三到四週的時間。要再冷卻回運作溫度,也是得經過三四週的時間,如此正好遇上預定的年度檢修時程,因此要開始運作將可能延遲至2009年夏天。

2008年10月21日預計將開始進行低能量對撞實驗。LHC是一個國際合作計劃,由全球85國中的多個大學與研究機構,超過八千位物理學家共同合力出資合作興建。



LHC包含了一個圓周為27公里的圓形隧道,因當地地形的緣故位於地下50至150公尺之間,是先前大型電子正子加速器(LEP)所使用隧道的再利用。隧道本身直徑三公尺,位於同一平面上,並貫穿瑞士與法國邊境,如右圖表示,主要的部份大半位於法國。雖然隧道本身位於地底下,尚有許多地面設施如冷卻壓縮機,通風設備,控制電機設備,還有冷凍槽等等建構於其上。

加速器通道中,主要是放置兩個質子束管。由於須維持前所未有高能量的粒子運行,加速管由超導磁鐵所包覆,以液態氦來冷卻。管中的質子是以相反的方向,環繞著整個環型加速器運行。除此之外,在四個實驗碰撞點附近,另有安裝其他的偏向磁鐵及聚焦磁鐵。

兩個對撞加速管中的質子,初步將以 5 TeV(兆電子伏特)的能量對撞,總撞擊能量達 10 TeV之多。(設計目標為 14 TeV)每個質子環繞整個儲存環的時間為 89 微秒 。因為同步加速器的特性,加速管中的粒子是以粒子團(bunch)的形式,而非連續的粒子流。整個儲存環將會有2800個粒子團,最短碰撞週期為 25 奈秒 。在加速器開始運作的初期,將會以軌道中放入較少的粒子團的方式運作,碰撞週期為 75 奈秒,再逐步提升到設計目標。

在粒子入射到主加速環之前,會先經過一系列加速設施,逐級提升能量。其中,由兩個直線加速器所構成的質子同步加速器(PS)將產生50 MeV的能量,接著質子同步推進器(PSB)提升能量到1.4GeV。而質子同步加速環可達到26GeV的能量。低能量入射環(LEIR)為一離子儲存與冷卻的裝置。反物質減速器(AD)可以將3.57 GeV的反質子,減速到2 GeV。最後超級質子同步加速器(SPS)可提升質子的能量到450 GeV。

在LHC加速環的四個碰撞點,分別設有五個偵測器在碰撞點的地穴中。其中超環面儀器(ATLAS)與緊湊渺子線圈(CMS)是通用型的粒子偵測器。其他三個(LHC底夸克偵測器(LHCb), 大型離子對撞器(ALICE)以及全截面彈性散射偵測器(TOTEM)則是較小型的特殊目標偵測器。

LHC也可以用來加速對撞 重離子,例如 鉛(Pb)離子可加速到1150 TeV。

由於LHC有著對工程技術上極端的挑戰,安全的確保是極其重要的。當LHC開始運作時,磁鐵中的總能量高達100億焦耳(GJ),而粒子束中的總能量也高達725百萬焦耳(MJ)。只需要10−7總粒子能量便可以使超導磁鐵脫離超導態,而丟棄全部的加速粒子可相當於一個小型的爆炸。

此對撞機主要藉由電磁加速兩強子此其環繞在環型管中,達到99.999999%的光速速度後相撞,藉由強力撞擊撞開強子,期望找到新的物質。

在美國 RHIC 開始實驗之時,包括內部的研究者與其他外部的一些科學家,曾擔心類似的實驗可能會引發理論上的一些災難,甚至摧毀地球或是整個宇宙:

* 創造出一個穩定的黑洞
* 創造出比一般物質更穩定的一種,由上下奇三種夸克組成的奇異物質 (構成假說中的「奇異星」的物質)吸收掉所有一般物質
* 創造出磁單極促成質子衰變
* 造成量子力學真空態的相變到另一個未知的相態(詳見虛真空)

RHIC 與 CERN 都進行了一些研究調查,檢視是否有可能產生例如微黑洞、微小的奇異物質(奇異微子)或是磁單極等危險的事件。這份報告認為「我們找不到任何可以證實的危害」。例如,除非某個未經證實的理論是對的,否則是不可能產生出微小黑洞的。即使真有微黑洞產生了,預期會透過霍金輻射的機制,很快就會蒸發消失,所以會是無害的。而像 LHC 這樣高能量的加速器的安全性,最有力的論點在於一個簡單的事實:宇宙射線的能量比起 LHC 來要高出非常多數量級,太陽系星體從形成到現在這麼多年下來,都不斷地被宇宙射線轟擊。既沒有產生出微黑洞、微小的奇異物質或是磁單極,太陽、地球和月球也都沒有因此被摧毀。

然而,仍有一些人還是對 LHC 的安全性有疑慮:類似這樣新的、未經測試過的實驗,是沒有辦法完全保證上述的情況不會發生。約翰·尼爾森(John Nelson)在伯明罕大學談到RHIC說「這是非常不可能會有危害的──但是我無法百分之百保證。」另外在學術界,對於霍金輻射是否正確,也有一些疑問。

RHIC自2000年運行到現在,都沒有產生可以摧毀地球的物質的跡象。