2020年10月31日 星期六

winform 在dll中的usercontrol只能用Any CPU或是x86編譯

 [問題描述]

現在有兩個專案,一個是dll的專案,裡面有usercontrol,
另一個是dll(usercontrol)的測試專案,
兩個編譯平台都是Release x64。
在測試專案winform的designer中,
將dll中的Usercontrol元件拉到form上,
出現「Failed to load toolbox item. It will be removed from the toolbox」,如下圖

dll的編譯設定如下圖


測試專案的編譯設定如下圖

2020年10月19日 星期一

強大的markdown語法與evernote

我滿早之前就知道markdown語法了,但一直都沒幫自己找機會去學習,
因為也覺得沒這個必要。八月初在撰寫COSCUP的共筆時,
發現是要使用markdown的語法,那時才動了要去學的念頭,
但一直都沒實行,寫共筆時也「偷吃步」地複製別人的語法並改字而已。

直到前一陣子轉換跑道順便休息,在整理github,並寫README.md,
這時才開始認真學markdown語法,學的心得是 ─ 太好用了!!!
所以我開始想:evernote支援markdown嗎?

2020年10月17日 星期六

windows 10 在每個視窗使用不同的輸入法

我平時習慣使用gcin的倉頡,
但由於我gcin設定成要按下Enter鍵才會有確認字,
這對於visual studio的vsvim來說不太好用,
按快捷鍵都會卡住。

在2019年11月初更新前,
在不同視窗都可以使用不同的輸入法,
但更新後,每個視窗可以使用的輸入法都只能一樣。
導致找資料和coding時要不斷地切換,超麻煩。
於是乎,便找找看有沒有相關設,還真被我找到了!

使用git Bash/Terminal 將已有的專案上傳到github

如果有VS 2015 以上的visual studio,在github上建立新專案是非常容易的事。
執行下面的步驟,記得要在安裝時勾選git相關選項

首先,先建立好一個專案,接著,
只要在工具欄中點選「View->Team Explorer」,
最後在Team Explorer的視窗中依指示上傳github即可

不過在linux下或是沒有使用visual studio,卻又想將已建好的專案想將之上傳到github就有點小麻煩(雖然難不到哪),
下面這邊記錄一下方法

若push發生錯誤,重傳的方法

已經發生了幾次push發生錯誤,修改後重傳的事件,
每次都要再查一次資料覺得麻煩
乾脆做個筆記

C\C++ X-Macro 初步心得

第一次看到X-macro這個技術時,是在[C/C++] enum to string 的方法實作 (X Macro)這篇文章中,
當時看得「霧霧煞煞」(台語:一頭霧水之意),但由於是滿有趣的技巧,
所以就先將其存在evernote中了。
昨天為了寫個功能,想做類似的事
所以特別打開evernote中的記事來研究一下,
終於看懂這個東西了,
所以在這邊記錄一下我對X-Macro的理解!

第一次看到X-Macro時,總是無法將三個小巨集(Macro)連起來,
看懂後發現是我想的太複雜了

先來個例子:
一般而言,將enum轉成字串,可能會用下面的方式
#include <iostream>

enum eOption
{
option1,
option2,
option3
};

char* OptStr[] = {"option1", "option2", "option3" };

const char* enum2str(eOption idx)
{
return OptStr[idx];
}

int main(int argc, char* argv[])
{

printf("%s\n", enum2str(eOption::option1));
printf("%s\n", enum2str(eOption::option2));
printf("%s\n", enum2str(eOption::option3));

system("pause");
return 1;
}

2020年7月22日 星期三

[log book] opencv 使用ROI卻無法改變ROI影像內的值

[問題描述]
在撰寫一個特別的演算法時,
需要只針對某一行做運算,因此使用cv::Rect做了一個ROI,
將某一行取出做運算,但發現我不太能修改ROI取出的影像的值。

linux 下 Vim NeoDebug 套件使用方法筆記

若是用VS久了,在Linux下debug會覺得有點不習慣,因為要記、打一堆gdb相關指令。
筆者最近發現了一個好用的vim套件 ─ NeoDebug,下面來介紹安裝及使用方法。

筆者是在始碼的資料夾下建一個build資料夾,接著使用cmake 生成Makefile後,再使用「cmake --build build」指令在build資料夾編譯原始碼成執行檔

[Log Book] 解決函式回傳char*時,傳出去後出現亂碼

[問題描述]
最近遇到一個問題我有一個函式GetTime函式回傳char*,
在GetTime函式中,要傳出去的變數currentTime值是非常正常的,
如下圖
但在外面接到的,卻變亂碼。

2020年5月17日 星期日

SikuliX安裝筆記

最近快到FGO的金閃祭了,
想要讓電腦幫我周回,
但bluestack的腳本功能並不能滿足我,
因為我的練度不高,所以不只要可以記錄我的點擊位置,有時也要選擇從者或是判斷一些簡單的狀況。
雖然照著官網的方式做,但小卡關,
後來找到了資料[1],發現只差一點點就成功了,
但怕後來忘了,所以寫做筆記,
而且我發現我參考資料[1]中的作者,也是為了玩FGO所以才寫sikuli的 XD

2020年4月18日 星期六

用「附加至處理程序(Attach to Process ...)」Debug

今天來分享一個好用的dll debug方式!

之前在上海幫忙的時候,
jim就有教過我們用「附加至處理程序」(Attach to Process ...),
並跟我們說這個功能很好用,
不過當時並沒有體會到這個功能好用的地方。

在上海負責的案子比較特殊,
是用CCF (CIM Control Framework)的框架,
而那個框架是用分散式架構,分程三支程式;分別放在三台電腦中,
重點是開啟是有順序的。
若用一般debug的手法會很難debug,
直接按下F5,然後下斷點,會不好debug,
除了程式啟動的順序外,
彼此的dll都有一些關聯,這樣做可能會出問題。
所以一直以為,
那個「附加至處理程序」(Attach to Process ...),
是因為CCF的架構不好debug才使用的。

但今天才發現,這個功能真的爆幹好用!
一般來說,如果方案較大,裡面包含有dll的專案,
在debug dll時,就要將dll設成啟始專案,

2020年1月17日 星期五

opencv 及halcon存圖的速度比較

執行平台:
visual 2015
opencv 3.1
halcon 12.0.2

圖檔:
用ink一眼的圖測試之
16384 * 300000 pixels
約 1.52 G 

結果:
Mat > iplimage > halcon

mat存圖比較快,大多在十三秒左右,有時候不知為什麼,會到十七秒將近二十秒;iplimage存圖次之,約十七秒左右,有時候會到廿一秒;halcon最慢,約在卅八秒左右,但速度好像都滿穩定的。
對了,經由這次的測試發現,imshow及image watch好像没法看1.52 G的圖,我猜它們只能顯示1 G以內的圖。

2020年1月16日 星期四

[Log book] stringstream的建構子中不可傳入其他建構子

─ 問題描述
目標:在win 10環境下使用VS 2008的C++讀入ini檔並用逗點分隔讀入的key值
使用方法及問題:使用std的iostream類的函式,並用getline來分割,但在getline的函式一直編譯出錯,編譯器一直顯示引數類型不正確、没有相關多載之類的錯誤訊息。
下面是程式碼
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <sstream>
#include "tchar.h"  
#include "windows.h"
#define COUNTOF(x)  ( sizeof(x) / sizeof((x)[0]) )
bool GetCurrentDirectory(TCHAR *obuf, DWORD osize)
{
    if ( ! GetModuleFileName(0, obuf, osize) )
    {
        *obuf = '\0';
        return FALSE;
    }
    TCHAR *lastslash = 0;
    for ( ; *obuf; obuf ++)   
    {   
        if ( *obuf == '\\' || *obuf == '/' )   
            lastslash = obuf;   
    }   
    
    if ( lastslash ) *lastslash = '\0';  
    
    return TRUE;   
}
void main()
{
        TCHAR filebuf[256];
        char data[100];
        std::string tempStr;
        std::vector<std::string> output;
        if ( GetCurrentDirectory(filebuf, COUNTOF(filebuf)) )   
    {  
               wcscat_s(filebuf,_T("\\IrregularShapeSetting.ini"));
               TCHAR temp_str[100];
               ::GetPrivateProfileString(_T("Irregular Shape Setting"), _T("Folder"),  _T("="), temp_str, 100, filebuf);
               wcstombs(data, temp_str, 100);
               std::string ConverToStr = std::string(data);
               
               std::stringstream folders(std::string(data)); // 但問題在這
               while (std::getline(folders, tempStr, ',')) // 出錯在這行
                       output.push_back(tempStr);
               for(int i = 0; i < output.size(); i++)
                       std::cout << output[i].c_str() << std::endl;
    }   
    else
    {           
               wprintf_s(_T("ERROR: cannot get irregular shape inspection setting  directory\n"));
    }
        system("pause");
}
下面是錯誤訊息

nlohmann/json 使用筆記

因為工作的關係,有一支C++寫的程式要用到json來與另一支程式傳資料,
上網找C++的json函式庫,找到了一個好用的函式庫 ─ nlohmann大大的json。

nlohmann大大寫的json語義解析器非常好用,
而且安裝方法又簡單

[Log Book] C++\CLI Graphics使用Dispose時遇到 「'Dispose': is not a member of 'System::Drawing::Graphics'」

[問題描述]
在使用C++\CLI將自己寫的演算法包起來給.net使用時,
將System::Drawing::Graphics (managed class)使用Dispose方法釋放資源,
結果遇到「Error C2039 'Dispose': is not a member of 'System::Drawing::Graphics'」

C++及C++\CLI 修改指標變數的方法 (雙重指標的應用)

在原生的C++ (native C++)中,若要修改指標變數,會用雙重指標(指標的指標),
就像要修改某變數時,要將該變數的指標傳入函數一樣的道理。
下面是原生C++要修改指標變數時的方法
#include <iostream>

class UnmanagedClass
{
public:
int i;
};

void ModifyUnmanagedPointer(UnmanagedClass** p)
{
*p = new UnmanagedClass();
(*p)->i = 100;
}

void main()
{
UnmanagedClass* p;
ModifyUnmanagedPointer(&p);
std::cout << "value = " << p->i << std::endl;
system("pause");
}

其輸出為:


此道理在C++\CLI (C++的.net版本,以下簡稱CLI)中也不例外,
不過由於托管類別(managed class)都被托管,
沒辦法直接使用「^^」來做為托管指標的位址。
以下介紹兩種修改托管指標的方法: