星期三, 8月 29, 2018

[Python] Python + OpenCV 環境安裝紀錄


1. 下載最新版 Python 後, 安裝。2.7.15 版後已內建 pip,因此強烈建議安裝最新版。

2. 設定環境變數 Path,新增下列兩項。
    C:\Python27
    C:\Python27\Scripts

3. 依據 Python版本與作業系統版本下載 Numpy,放到自訂資料夾。

4. 按下Shift + 右鍵,選擇[在此處開啟命令視窗],輸入
     pip install [Numpy檔名]
    註:輸入前可先輸入以下文字以更新 pip到最新版
           python -m pip install -U pip setuptools

5. 依據作業系統下載 OpenCV 後安裝。

6. 複製 opencv/build/python/2.7/cv2.pydC:/Python27/lib/site-packeges 下。

7. 開啟 Python IDLE,輸入以下文字。
    >> import cv2
    >> print cv2.__version__

8. 如果沒有任何錯誤且印出 OpenCV版本,表示安裝成功。


9. 如果要安裝 matplotlib, 也可用 pip 指令進行安裝。輸入以下文字即可。
     python -m pip install matplotlib
    
  

星期六, 6月 23, 2018

[C#] 擷取網頁資料 筆記

最快速簡單的方法就是使用 HTML Agility Pack。

1.首先, 用 NuGet 安裝。如果用NuGet 套件管理員無法安裝。
   可能是版本不相容,可改用主控台模式安裝指定版本。如下

PM> Install-Package HtmlAgilityPack -Version 1.4.9.5

2.接著如以下範例,取得網頁資料

HtmlWeb client = new HtmlWeb(); client.LoadAsync("http://astro.click108.com.tw/daily_10.php?iAstro=10");

3.再用 XPath 取得節點資料, XPath 路徑可使用瀏覽器+套件

HtmlNodeCollection nameNodes = doc.DocumentNode.SelectNodes(@"//div[@class='ROOT']/p/a[2]"); foreach (HtmlNode node in nameNodes) { string strValue = (node.InnerText).Substring(5); //擷取字串 Debug.WriteLine(strValue); }




參考網頁:
https://dotblogs.com.tw/v6610688/2013/11/02/parsing_html_by_html_agility_parser_on_windows_phone_8

https://msdn.microsoft.com/zh-tw/ee787055.aspx

https://blog.exfast.me/2016/07/c-use-the-htmlagilitypack-to-collect-web-pages/

星期三, 5月 30, 2018

[Code] 清除文字檔內容 C 與 C++

C語言版本

   fclose(fopen("file.txt", "w"));

C++語言版本

std::ofstream ofs;
ofs.open("test.txt", std::ofstream::out | std::ofstream::trunc);
ofs.close();

星期五, 5月 05, 2017

[C#] NLog 使用筆記 - 簡易版


1. 安裝:
    使用 NuGet 安裝 NLog
    主控台中輸入 Install-Package NLog.Config

2. 設定:
    打開 NLog.config 文件,修改 兩個欄位
    決定 log 檔案存放位置, 決定哪一個類別要存放到哪一個 target。
 
    Target 範例:
     <target xsi:type="File" name="f1" fileName="${basedir}/logs/${shortdate}.log"
               layout="${longdate} ${uppercase:${level}} ${message}" />
       說明: Target 名稱為 f1,存檔路徑為執行檔路徑/logs/YY-MM-DD.log
                    儲存內容為 "時間 類型 訊息內容"
 
    Rule 範例
        <logger name="*" minlevel="Info" writeTo="f1" />
     
      說明:Info 類型存放到 Target-f1,Trace 類型存放到 Target-f1

     參考來源:
        http://blog.developer.idv.tw/2012/12/nlog-rules.html
        http://kevintsengtw.blogspot.tw/2011/10/nlog-advanced-net-logging-1.html

3.使用:
    using NLog;
    private static Logger logger = LogManager.GetCurrentClassLogger();
    logger.Info(stringMessage);



星期日, 5月 04, 2014

[程式] 讓程式只存在一個執行實體

1. 首先利用 CreateMutex 建立互斥實體
HANDLE hExistMutex = CreateMutex(NULL,FALSE,"Exist_Mutex");

2. 然後用 GetLastError 檢查回傳直是否等於 ERROR_ALREADY_EXISTS

3. 若相等就中止目前執行程序:
        HANDLE hself = GetCurrentProcess();
        TerminateProcess(hself, 0);

4. 或是利用以下函式關閉前一個執行實體:

void CloseProgram(CString strProgram)
{
    HANDLE handle; //定義CreateToolhelp32Snapshot系統快照句柄
    HANDLE handle1; //定義要結束進程句柄
    handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//獲得系統快照句柄
    PROCESSENTRY32 *info; //定義PROCESSENTRY32結構字指
    //PROCESSENTRY32 結構的 dwSize 成員設置成 sizeof(PROCESSENTRY32)
   
    info = new PROCESSENTRY32;
    info->dwSize = sizeof(PROCESSENTRY32);
    //調用一次 Process32First 函數,從快照中獲取進程列表
    Process32First(handle, info);
    //重複調用 Process32Next,直到函數返回 FALSE 為止
    DWORD curProcessID = GetCurrentProcessId();
    while(Process32Next(handle, info) != FALSE )
    { 
        if(info->th32ProcessID == curProcessID)
        {
            continue;
        }

        CString strTmp = info->szExeFile;     //指向進程名字 
        //strcmp字符串比較函數同要結束相同 
        //if(strcmp(c, info->szExeFile) == 0 ) 
        if (strProgram.CompareNoCase(info->szExeFile) == 0 ) 
        { 
            //PROCESS_TERMINATE表示為結束操作打開,FALSE=可繼承,info->th32ProcessID=進程ID  
            handle1 = OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID);
            //結束進程  
            TerminateProcess(handle1, 0);  
        } 
    }
    delete info;
    CloseHandle(handle);
}

星期四, 4月 24, 2014

[VC6] 變更 DLL 名稱

要改變 DLL 檔的檔名除了在 [Link] -> [Category:General] -> Output file name 改名稱以外。
   如果編譯後出現 LNK4770 的錯誤,則需要手動更改 MyDll.def 檔中的 LIBRARY,將後面改為需要的輸出檔名。 之後再編譯即可得到對應的 lib 與 dll 檔。