My Step on My Way
生活點滴心得記錄,這裡只記錄好的、有趣的、快樂的東西。
星期三, 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.pyd 到 C:/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.接著如以下範例,取得網頁資料
https://blog.exfast.me/2016/07/c-use-the-htmlagilitypack-to-collect-web-pages/
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++語言版本
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 文件,修改
Target 範例:
<target xsi:type="File" name="f1" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
儲存內容為 "時間 類型 訊息內容"
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);
}
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 檔。
如果編譯後出現 LNK4770 的錯誤,則需要手動更改 MyDll.def 檔中的 LIBRARY,將後面改為需要的輸出檔名。 之後再編譯即可得到對應的 lib 與 dll 檔。
訂閱:
文章 (Atom)