ADSense script

Code Colors

顯示具有 程式科技類 標籤的文章。 顯示所有文章
顯示具有 程式科技類 標籤的文章。 顯示所有文章

2020年5月4日 星期一

猴子壓縮法(monkey zip with pseudorandomness)

在一本書上的插畫,常看到一堆猴子在敲鍵盤,
也許是因為 "猴子若有夠多數目和夠長時間在打字機上敲打,最終必然會打出莎士比亞的全部作品"
諷刺著工程師跟猴子應該有差別

然而這句話觸動了我的心,
"猴子長時間敲打,最終會敲出作品"
也許它可以當成壓縮法的核心概念。

把句子替換成 "猴子若有足夠長的時間在打字機上敲打,最終必然會打出內容"
再換一下,"在有限的時間內,猴子若有足夠快速度在打字機上敲打,最終必然會打出內容"

內容:固定大小的隨機數.如1K,4K... 等大小區塊.
有限的時間內: 就限定一個小時內
足夠快: 當人們以為破不了的MD5 或 加密都變成瞬解的時候,也就是在量子電腦上
猴子在打字機上敲打: 亂數產生器
如果是真亂數那就無法還原了,所以要使用偽亂數,也就是用相同亂數種子可以跑一樣的內容。
例如, R250n (R250 random number generator) 偽亂數產生器。

上述如果成立,壓縮代碼可能就是 種子,pass次數,data長度
解碼方式 就是在任一個電腦上面重現亂數即可:

rand_init(seed);
while(passCnt --) rand();
while(dataCnt --) printf("%c",rand());

這樣壓縮率應該可以到2%以下,而且解壓縮超快。
如果再次壓縮,那就....再壓個2%...
壓縮代碼可能變成  (rand 種子,pass次數,data長度,壓縮層數)
{rand 種子,pass次數,data長度},{rand 種子,pass次數,data長度},{.....}
或者 {rand 種子,pass次數,data長度,壓縮層數},{rand 種子,pass次數,data長度,壓縮層數},{.....}

到那一天,硬碟映像檔案可能就 1k以下。


2020年4月12日 星期日

GUI Debug String with mutable arguments in C

#include <stdio.h> 
char vstr_bur[64];
void DB_Prt(char idx, char* char_ptr, ... ){
  va_list args;
  int i;
  static char tempstr[20][64]={""};
  static char index=0;
  char prt_idx=0;
  //const int left=800-6*64-20;
  const int left=800-6*64-20;

  va_start(args, char_ptr);
  vsprintf(vstr_bur, char_ptr, args);
  va_end(args);

  printf("%s",vstr_bur);
  if(idx != 0)
    index = idx;
  GUI_SetTextMode(GUI_TM_NORMAL);
  GUI_SetFont(&GUI_Font6x8);
  GUI_SetColor(GUI_WHITE);
  GUI_SetBkColor(GUI_TRANSPARENT);
  if(index >=20) index=0;
  strncpy(tempstr[index], vstr_bur, sizeof(tempstr[0])-1);
  #if 1
  GUI_DispStringAtCEOL(tempstr[index],left+10,10+index*10);
  #elif 0
  for(i=(index +1 )%20;i<20;i++,prt_idx++){
    if(i == index )
      GUI_DispStringAt("*",left,10+prt_idx*10);
    else
      GUI_DispStringAt(" ",left,10+prt_idx*10);
    GUI_DispStringAtCEOL(tempstr[prt_idx],left+10,10+prt_idx*10);
  }
  if(index!=19){
    for(i=0;i<=index;i++,prt_idx++){
      if(i == index )
        GUI_DispStringAt("*",left,10+prt_idx*10);
      else
        GUI_DispStringAt(" ",left,10+prt_idx*10);
      GUI_DispStringAtCEOL(tempstr[prt_idx],left+10,10+prt_idx*10);
    }
  }
  #else
  for(i=0;i<20;i++){
    if(i == index )
      GUI_DispStringAtCEOL("*",left,10+i*10);
    else
      GUI_DispStringAtCEOL(" ",left,10+i*10);
    GUI_DispStringAtCEOL(tempstr[i],left+10,10+i*10);
  }
  #endif
  index++;
  GUI_SetTextMode(GUI_TM_TRANS);	//透明文本
}
//#define printf(...)  DB_Prt(0,__VA_ARGS__)


#不定參數 C 語言
#GUI 除錯字串

2019年12月28日 星期六

Define version with git tag and breach

有時候看到程式有問題,卻不知道他出自哪個版本
也許可以參考下列:
程式 build 之前, 讓IDE 自動執行 ctrl.sh 檔案(不能自動就手動囉) 將所需要的版本號 compiler 進去程式裡面
由於該項目沒有正式導入使用,使用者請斟酌

最大原因 version.h 檔案無法與真正的commit的一致!!!
因為 commit 後 commit次數變了 檔案指紋也變了 所以執行 ctrl.sh 後 又會生成一個新的 version 檔案...
無限循環 雞生蛋 蛋生雞的問題 我投降!!...
有需要的 可以參考下面 程序自行更改:

2019年12月23日 星期一

讓 git commit 更好的理解commit 的作用...type:

程式變動不外乎 新增/變動feature, fix bug, refactor function, add some tests, change style, modify documentation, revert commit, improves performance.

因此 type 使用以下類別:

2019年12月16日 星期一

C語言 debug 跑到哪一行

你可以用IDE 逐步偵錯,或者把除錯訊息印出來.
一般我常用 無腦印除錯訊息:

printf("jr@%s, %d.\r\n",__func__,__LINE__);

jr 是我的名字縮寫 你可以自己改。

#include <stdio.h>
#include <stdlib.h>

int funcTest1(int x ){
    printf("jr@%s,%d. x=%x\r\n",__func__,__LINE__,x);
    return x^0x1;
}
int funcTest2(int x ){
    printf("jr@%s,%d. x=%x\r\n",__func__,__LINE__,x);
    return x^0x10;
}
int main()
{
    int rnd_1=(rand()%100)+1;
    int rnd_2=(rand()%100)+1;
    printf("Hello world!\n");
    if(rnd_1 > rnd_2){
        printf("jr@%s,%d.\r\n",__func__,__LINE__);
        rnd_2+=rnd_1/2;
    }
    if(rnd_1 < rnd_2){
        printf("jr@%s,%d.\r\n",__func__,__LINE__);
        rnd_1=rnd_1/2;
    }

    rnd_1 = funcTest1(rnd_1);
    rnd_2 = funcTest2(rnd_2);
    printf("jr@%s,%d.\r\n",__func__,__LINE__);
    printf("rnd_1=%d.\r\n",rnd_1);
    printf("rnd_2=%d.\r\n",rnd_2);

    return 0;
}

2019年6月3日 星期一

不想加入git 的檔案類型

有些檔案不想放在 Git 裡面…

有些檔案很特別,例如臨時生成的檔案或者特別大的二進制檔案,都不適合放在Git做版本控管。這時我們就可以使用.gitignore 檔案,把不想要的檔名通通濾掉(忽略特定檔案名稱或者檔案類型)啦。

我常使用的 .gitignore 檔案內容

# 這是註解 .NET
#[Oo]bj
#[Bb]in
#[Tt]emp
#*.user
#*.suo

#*.DS_Store
#[Tt]est[Rr]esult*
[Tt]humbs.db
#_ReSharper.*
#*.resharper
#Ankh.NoLoad

*.[Cc]ache
*.bak
*.log

# stm32 .c
*.o
*.crf
*.axf
*.d
*.dep
*.su
*.elf
*.list
/Drivers
/MDK-ARM

# 如果你想忽略壓縮檔或一些大檔案
*.7z
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

*.pdf

# microchip No storage needed
*.hex
*.map
*.cof
*.err
*.mcs
*.mcw

# C::B
/Release
/bin
/obj
/wx_pch.h.gch
*.layout

*.bat



特別注意!!

.gitignore只能忽略那些沒有被追蹤的檔案 (Untracked Files),也就是說比.gitignore 晚加入的檔案。

如果 .gitignore是後面修改/新增,想要把已追蹤過的檔案剔除,可以參考以下命令:
git rm -r --cached .
git add . 
git commit -m 'update .gitignore'

2018年11月14日 星期三

jquery ajax Error

太久沒有碰網頁了,從 jquery Version 1.x 跨入了 Version 3.x , 許多變革都不知道。
除了一些Func 名稱得更動外,在Local端都無法正常運作的原因居然是.... 因跨網域的安全因素被瀏覽器攔了下來,害我廢了一整晚。
以下 開放跟我一樣蠢的人回應....

"Failed to load file.Cross origin requests"


Chrome 解決方式:  先拉一個捷徑,然後在目標尾巴加上
 "--allow-file-access-from-files "
再重新用捷徑開啟檔案即可。

參考資料:https://ask.layabox.com/question/13

話說 ....跨網域的問題不是幾年前就碰過了,雖然是在FFX上,沒寫下來都忘光keyword了。

2017年8月18日 星期五

python 入門code2 - comment 註解

寫程式是寫給電腦執行(看),但寫多了人會忘記,那怎辦?
那就寫些東西給人看,電腦會自動跳過,不看不執行
這些東西就叫做 comment 註解,說明

單行註解 # , 後面整行 都不會執行

a= 5
a= 6
# 這個後面電腦 不看 (不執行),
# 可以寫說明幫助人了解
# 反正重點就是不執行..

# a=7
print(a)

多行註解以 """ 開始,""" 結尾
這兩個中間不管幾行 都當註解 不執行

a= 5
a= 6
""" 這個後面電腦 不看 (不執行) ,
可以寫說明幫助人了解
反正重點就是不執行..
"""

"""a=7"""
print(a)

所以最後 print 會印出多少呢?

2017年8月16日 星期三

python 入門code

線上編譯, Compiler on http://ideone.com

# your code goes here
def max(a, b):
    if a > b:
        Return_Data = a
    else:
        Return_Data = b
    return Return_Data
    
print (max(10,100))
print (max(99,98))

簡易說明,
函數定義 (函式,function 都有人用) ::
def (define 簡寫), 用來聲明定義函數。
函數一般用 return(返回,回傳)來結束函數

定義的格式如下
def 函數名(參數1名稱,參數1名稱,.....,參數n名稱):
  函數本體

由於python 並沒有採用主流的{}來表述區塊的概念,強制程序猿採用縮排來表明層序關係。
在python看到  :   後面就是換行+縮排
例如
if a > b:
    Return_Data = a
else:
    Return_Data = b

而縮排的前面空白通常可用"兩個空白","四個空白" 或 "一個Tab",這都表示一組縮排。
但整份程序中請統一使用一種,以避免出錯。

2017年7月10日 星期一

tick 時間型態測試

想看看tick 作 timer 數值會不會出錯,可以簡單用下面函式看一下能否正常結束。
void tick_test(){
  static int hadRun=0;
  if(hadRun) return;
  hadRun++;

  int ticks=10;
  int i,loop;
  int startTick,sysTick = 0x7ffffffa;
  unsigned int ustartTick, usysTick;

  for(loop=0;loop<2;loop++){
    i=0;
    startTick = sysTick;
    while(sysTick - startTick < ticks){
        sysTick++;
        i++;
        printf("startTick=%d Tick=%d [%d]\r\n", startTick, sysTick,i);
    }
    printf("break!\r\n");
  
    sysTick = 0xfffffffa;
  }
  printf("\r\n");

  usysTick = 0x7ffffffa;
  for(loop=0;loop<2;loop++){
    i=0;
    ustartTick = usysTick;
    while(usysTick - ustartTick < ticks){
        usysTick++;
        i++;
        printf("startTick=%u Tick=%u [%u]\r\n", ustartTick, usysTick,i);
    }
    printf("break!\r\n");
  
    usysTick = 0xfffffffa;
  } 
}
Testlog
 ==== Stm32 Board ====
startTick=2147483642 Tick=2147483643 [1]
startTick=2147483642 Tick=2147483644 [2]
startTick=2147483642 Tick=2147483645 [3]
startTick=2147483642 Tick=2147483646 [4]
startTick=2147483642 Tick=2147483647 [5]
startTick=2147483642 Tick=-2147483648 [6]
startTick=2147483642 Tick=-2147483647 [7]
startTick=2147483642 Tick=-2147483646 [8]
startTick=2147483642 Tick=-2147483645 [9]
startTick=2147483642 Tick=-2147483644 [10]
break!
startTick=-6 Tick=-5 [1]
startTick=-6 Tick=-4 [2]
startTick=-6 Tick=-3 [3]
startTick=-6 Tick=-2 [4]
startTick=-6 Tick=-1 [5]
startTick=-6 Tick=0 [6]
startTick=-6 Tick=1 [7]
startTick=-6 Tick=2 [8]
startTick=-6 Tick=3 [9]
startTick=-6 Tick=4 [10]
break!

startTick=2147483642 Tick=2147483643 [1]
startTick=2147483642 Tick=2147483644 [2]
startTick=2147483642 Tick=2147483645 [3]
startTick=2147483642 Tick=2147483646 [4]
startTick=2147483642 Tick=2147483647 [5]
startTick=2147483642 Tick=2147483648 [6]
startTick=2147483642 Tick=2147483649 [7]
startTick=2147483642 Tick=2147483650 [8]
startTick=2147483642 Tick=2147483651 [9]
startTick=2147483642 Tick=2147483652 [10]
break!
startTick=4294967290 Tick=4294967291 [1]
startTick=4294967290 Tick=4294967292 [2]
startTick=4294967290 Tick=4294967293 [3]
startTick=4294967290 Tick=4294967294 [4]
startTick=4294967290 Tick=4294967295 [5]
startTick=4294967290 Tick=0 [6]
startTick=4294967290 Tick=1 [7]
startTick=4294967290 Tick=2 [8]
startTick=4294967290 Tick=3 [9]
startTick=4294967290 Tick=4 [10]
break!

2017年7月5日 星期三

清除沒用又被佔住 COM PORT

步驟如下:
1.開啟命令提示字元.
2.執行指令:set devmgr_show_nonpresent_devices=1 & devmgmt.msc
3.裝置管理員跳出來後選擇  檢視->顯示隱藏裝置
4.點開 "+"連接埠(COM 和 LPT), 呈現淡灰色的就是離線設備。
5.刪掉沒有用的離線連接埠設備

喔  記得要用系統管理員身分開啟命令提示字元哦

參考資料:
https://support.microsoft.com/zh-hk/help/315539/device-manager-does-not-display-devices-that-are-not-connected


若不知道命令提示字元是什麼,可以這樣做:
a.開一個新文字檔
b.開啟檔案後,填上指令
  set devmgr_show_nonpresent_devices=1 & devmgmt.msc
c.選擇另存新檔,將檔名改成 a.bat
d.在資料夾中用滑鼠右鍵 點擊 a.bat 檔案,再以系統管理員身分執行.
e.進行步驟 3~5.

2017年6月14日 星期三

C語言 字串轉十六進位 (string to hex array)

有時要把使用者輸入的訊息送出,需要先從字串轉換成16進制的數值。
記錄一下 string to hex array by ANSI C:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

#define u16 unsigned short
#define u32 unsigned int

#define BYTE_SWAP_16(x) \
     (u16) ( ((((u16)(x)) & 0x00ff) << 8 ) | \
             ((((u16)(x)) & 0xff00) >> 8 ) \
          )

#define BYTE_SWAP_24(x) \
     (u32) (\
     (( ((u32)(x)) & 0x00ff0000 ) >> 16 ) | \
     (( ((u32)(x)) & 0x0000ff00 ) >> 0 ) | \
     (( ((u32)(x)) & 0x000000ff ) << 16) \
    )
#define BYTE_SWAP_32(x) \
     (u32) (\
     (( ((u32)(x)) & 0xff000000 ) >> 24) | \
     (( ((u32)(x)) & 0x00ff0000 ) >> 8 ) | \
     (( ((u32)(x)) & 0x0000ff00 ) << 8 ) | \
     (( ((u32)(x)) & 0x000000ff ) << 24) \
    )

    
int StrHex(char* str, unsigned char *HexData, unsigned int endian_swap_enable){
    //char str[] ="a,b,c,d*e"; 
    const char * split = " "; 
    char * p;
    unsigned int Hex,len;
    int HexData_len =0;
    int i;
    printf("%s \r\n",str);
    p = strtok (str,split); 
    while(p) { 
        //printf ("%s\n",p); 
        Hex = strtol(p, NULL, 16);
        //printf("%x\n", Hex);
        len = (strlen(p)+1)>>1;len = (strlen(p)+1)/2;
        //------------------------
        // swap
        if(endian_swap_enable){
            //------------
            if(len <= 1) ;
            else if(len == 2) Hex = BYTE_SWAP_16(Hex);
            else if(len == 3) Hex = BYTE_SWAP_24(Hex);
            else if(len == 4) Hex = BYTE_SWAP_32(Hex);
        }
        //------------------------
        if(len > 4){
            printf("Error!");
            return -1;
        }
        memcpy(&HexData[HexData_len], &Hex, len);
        HexData_len += len;
        
        p = strtok(NULL,split); 
    }
        
    for(i=0;i<HexData_len;i++){
        printf("%02x ", (unsigned char) HexData[i]);
    }
    return HexData_len;
}

int main()
{
    char buf[1024];
    char str[] = "00 12 123 1234 12345 123456 1234567 12345678";
    //char str[] = "00 1234567890";
    StrHex(str, (unsigned char*)buf, 1);
    return 0;
}


log:

00 12 123 1234 12345 123456 1234567 12345678
00 12 01 23 12 34 01 23 45 12 34 56 01 23 45 67 12 34 56 78
Process returned 0 (0x0)   execution time : 0.031 s
Press any key to continue.

2017年5月14日 星期日

C語言-取得時間數字

DateTime Timestamp string by sec
void DateTime(char const *date, char *buff) {
    int month, day, year;
    int hour, minute, second;
    static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";

    sscanf(date, "%s %d %d %d:%d:%d", buff, &day, &year,&hour, &minute, &second);
    month = (strstr(month_names, buff)-month_names)/3+1;
    sprintf(buff, "%d%02d%02d%02d%02d%02d", year, month, day, hour, minute, second);
   
    //!Application Example
    //{
    //    #if 1
    //    #undef __TIME__
    //    #define  __TIME__ "21:23:39"
    //    #endif // 1
    //    char StrTime[32];
    //    int yy,mm,dd,hh,min,sec;
    //    printf("\r\n " __DATE__ " " __TIME__ "\r\n");
    //    DateTime(__DATE__ " " __TIME__,StrTime);
    //    printf(" StrTime:%s\r\n",StrTime);
    //    sscanf(&StrTime[2], "%02d%02d%02d%02d%02d%02d", &yy,&mm,&dd,&hh,&min,&sec);
    //    printf(" Times :%3d%3d%3d%3d%3d%3d\r\n",yy,mm,dd,hh,min,sec);
    //}
}


log:
 May 14 2017 21:23:39
 StrTime:20170514212339
 Times : 17  5 14 21 23 39

Process returned 0 (0x0)   execution time : 0.022 s
Press any key to continue.

2017年5月10日 星期三

File Hash

在 Window 下取得檔案指紋(Hash), 可用 fciv.exe (檔案加總檢查碼完整性檢查器公用程式),
但每次都要用命令列,似乎有點麻煩。

所以懶惰蟲就寫了一個 FileHash.bat,這檔案要跟 fciv.exe 放在一起,然後使用時把檔案拖曳到FileHash.bat 上面就可以了。

2017年1月31日 星期二

Windows push repo to bitbucket by TortoiseGit

Step 1: 建立Putty Key 密鑰  密鑰
Step 2: 申請Bitbucket帳號, 並建立一個Repository
Step 3: Bitbucket SSH 密鑰設定方式
進入Bitbucket的管理畫面,在Bitbucket 右上角頭像中選取 Bitbucket settings

選擇左下角 Security 的SSH key

這邊SSH Key 能刪除但不能更改.新增方式 Add Key, 將標記名稱與公鑰即可貼上.
Step 4: 在TortoiseGit中輸入相關訊息
推送有兩種方式,都需要將其路徑貼到 TortoiseGet   Remote origin 的 URL 中,Putty Key 位置也一併寫入。

上述的 URL 路徑 可以在Bitbucket 中的 Repository中找到。

1. HTTPS:
   Push 的時候會讓你輸入Bitbucket 的密碼。

2. SSH:
  設定密碼到 Bitbucket 後,可不輸入密碼直接上傳資料。

但...人算不如天算,錯誤訊息:
tortoisegit bitbucket to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository.這主要是因為Key 無法正確配置,我們雖然設定了密鑰位置也設定了 Bitbucket 的公鑰,但 TortoiseGit 推送中的 autoload key 顯示無法勾選,那到底是有load key 還是沒有 load key 呢?

其實這主要是由於 ssh client 設定錯誤, 我們需要指定 SSH client 的位置,預設是ssh (for OpenSSH),對應錯誤會讓 Key 無法產生作用,我們需要在 TortoiseGit settings => Network 中設定 SSH client 正確路徑, Plink 一般是 "C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe"
參考. 當然你安裝時選成 Plink 但想用openssh key, 也是相同的位置做更改。

2017年1月28日 星期六

Git 移除太大的檔案

一不小心加入大檔案到 git , 事後才發覺該怎麼辦呢?
請參考官方網站 維護及資料復原 ...
注意 請先將資料備份  若改壞恕不負責

使用 "C:\Program Files\Git\git-bash.exe", 看一下Git 控管中資料到底有多少,
先用 git 整理一下資料,
 $ git gc
Counting objects: 118, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (103/103), done.
Writing objects: 100% (118/118), done.
Total 118 (delta 74), reused 0 (delta 0)

看看資料大小:
$ git count-objects -v
count: 0
size: 0                  <===== 尚未整裡的資料大小
in-pack: 118
packs: 1
size-pack: 88824 <===== 整理後的資料大小 (88MB)
prune-packable: 0
garbage: 0
size-garbage: 0

先看看我們有什麼大的檔案 在 git 歷史裡
$ git verify-pack -v .git/objects/pack/pack-f281f7156b17e6bd09a5997530c06f73f00d35d9 | sort -k 3 -n | tail -3
41695866016a1b15c0afca6f245ead1688927a78 blob   48375598 17882652 73069419 1 431afce4d21aae4f7456423d57e7aa41e5270572
431afce4d21aae4f7456423d57e7aa41e5270572 blob   107386372 18624491 54444035
98cfa13fbe22f508b65b58772b18d0888f7a02e8 blob   107386372 18662533 27542

偷懶的做法:
$ git verify-pack -v .git/objects/pack/* | sort -k 3 -n | tail -3  
431afce4d21aae4f7456423d57e7aa41e5270572 blob   107386372 18624491 54444035
98cfa13fbe22f508b65b58772b18d0888f7a02e8 blob   107386372 18662533 27542  <== 會有重複的
98cfa13fbe22f508b65b58772b18d0888f7a02e8 blob   107386372 18662533 27542

檔案名稱反查
$ git rev-list --objects --all | grep 98cfa13f
98cfa13fbe22f508b65b58772b18d0888f7a02e8 wx_pch.h.gch/Debug_wx_pch_h_gch

知道名稱後,就可以把他從 Git 控管的歷史中移除掉
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch  wx_pch.h.gch/Debug_wx_pch_h_gch'
Rewrite a9d6e52a7bbfe36b82aa1b84aaf2042ff6942210 (1/7) (0 seconds passed, remaining 0 predicted) rm 'wx_pch.h.gch/Debug_wx_pch_h_gch'
Rewrite 5d5eba75d45a1da9728be2536c72db25831fb4d3 (2/7) (1 seconds passed, remaining 2 predicted) rm 'wx_pch.h.gch/Debug_wx_pch_h_gch'
Rewrite 7dd375e3e9f5a92c8af45ea9e418a9ba9f4f6258 (2/7) (1 seconds passed, remaining 2 predicted) rm 'wx_pch.h.gch/Debug_wx_pch_h_gch'
Rewrite a46b60616757186fb94f2a3d81f526b3c6e4db19 (2/7) (1 seconds passed, remaining 2 predicted) rm 'wx_pch.h.gch/Debug_wx_pch_h_gch'
Rewrite c89c8050190e6c9c4a7054843a210ec545848f1d (5/7) (2 seconds passed, remainRewrite 22fd295101421c6d805bd076d359e94938da731f (5/7) (2 seconds passed, remainRewrite 342f4d3624e78b7528eeb4ebbd1ccafd033162e6 (5/7) (2 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

再讓 Git 整理一下資料
$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc
Counting objects: 64, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (64/64), done.
Total 64 (delta 34), reused 53 (delta 33)
$ git prune --expire=now

看看整理過後的資料大小:
$ git count-objects -v
count: 0
size: 0
in-pack: 64
packs: 1
size-pack: 39
prune-packable: 0
garbage: 0
size-garbage: 0


縮小好多 就等待檢查資料有沒有被改壞.....

2017年1月13日 星期五

久違的 wxWidgets

由於 win7 最近需要一些工具,Console 說他解決不了,剛好 wxWidgets 湊巧路過,於是就開始了痛苦的掙扎......
我沒有概念是否有現成的 dll 可以直接下載,還是走了老方法自己 build 一套;但不是 dll build不出來,不然就是C::B一直說錯版本,最後才在 youtube上試到可行的方式,

Code::Blocks 16.01  含 mingw 的版本
wxWidgets 3.0.2 Windows 的版本

1. Build wxWidgets:
cmd (console)下:
//==============================================
先設定 compiler 路徑:
set MinGW=C:\Program Files (x86)\CodeBlocks\MinGW\
set Path=%MinGW%bin;%MinGW%mingw32\bin;%Path%
//==============================================
將路徑移至 wxWidets 資料夾後,清除資料再進行編譯(約30分鐘或更久)
cd  wxWidgets-3.0.2\build\msw
SET MAKE_PARM=-f makefile.gcc SHARED=1 MONOLITHIC=1 UNICODE=1 CXXFLAGS=-std=gnu++11
mingw32-make %MAKE_PARM% BUILD=release clean
mingw32-make %MAKE_PARM% BUILD=release 
//==============================================
檢查是否成功編譯
查看 wxWidgets-3.0.2\lib\gcc_dll 是否有成功產出 dll 檔案


//==============================================
把setup.h檔案複製到 include 資料夾中
 lib\gcc_dll\ 底下出現 "mswu" 和 "mswud" 兩個資料夾,
選擇其中一個,將 wx 資料夾裡的setup.h 檔案複製至include\wx 下即可

2012年12月15日 星期六

wxWidgets

最近重灌系統,順便把睽違兩年的IDE新版 code::blocks 裝起來"聞香"一下,
後來想說只有DOS介面也太遜了,把之前沒有弄出來的GUI - wxWidgets再弄弄看吧。

拜了Google大神,裡面 小吳の學習筆記  基礎設定寫的滿清楚的,照著做一遍,果然弄懂了之前不明白的變數設定,也學到如何在windows底下用MinGW編譯。

然後馬上遇到問題..."中文字串都是亂碼!!!",但心想"沒道理那麼差吧,UTF-8 橋接點都過了那麼久,有問題也早修正了吧",後來測試了_T()才成功讓中文字不變身。
因此立即重新定義巨集:
#define _(s)  _T(s)
否則GUI版面重新配置後視窗的名稱又便會變回去亂碼 orz...


好了,現在還有幾問題沒弄懂,
1.GUI Builder : wxSmith與 wxFormBuilder 有什麼差別?哪個比較流行?或是跨平台的。
2.Application Type 又是啥?? Dialog / Frame  有什麼特別的差異呢?

牙醫助理可以做一輩子嗎

很多人好奇牙醫助理可以做一輩子嗎? 理想是 牙醫助理可以一輩子做,但要靠進修或轉向管理/技術,才能保持薪資與職涯成長,不然容易薪資高度在那。 還有助理做到診所牙醫退休關門的。