2014年2月12日 星期三

[Android] Avoid "Reference Table Overflow" issue in JNI

下面這些function 需要自己release reference, 不能仰賴vm去回收

1. FindClass:
jclass cls = env->FindClass("java/lang/String");
env->DeleteLocalRef(cls);

2. NewString/ NewStringUTF/NewObject/NewByteArray:
jstring  str =  env->NewStringUTF(const char*);
env->DeleteLocalRef(str);

3. GetObjectField/GetObjectClass/GetObjectArrayElement:
jclass ref = env->GetObjectClass(robj);
env->DeleteLocalRef(str);

4. GetByteArrayElements:
jbyte* array = env->GetByteArrayElements(jarray, &isCopy);
env->ReleaseByteArrayElements(jarray, array, 0);

5. GetStringUTFChars/GetStringChars:
const char* input = env->GetStringUTFChars(jinput, &isCopy);
env->ReleaseStringUTFChars(jinput, input);

6. NewGlobalRef:
jobject ref= env->NewGlobalRef(customObj);
env->DeleteGlobalRef(customObj);

2013年3月13日 星期三

2013 NTU Startup Day


曾經一直認為台灣的創業是個小圈子, 畢竟台灣人相對保守的教育下, 去考國考的人可能比較多(笑). 當初知道這個活動是 follow Jamie 的 facebook 而得知, 一方面很好奇國內大學的領頭羊台大會怎麼辦這樣一場盛會, 一方面自己也想了解現在大家創業都在做什麼, 所以就馬上報名了.


地點在台北國際會議中心, 分成展覽廳跟演講廳, 展覽廳一進去瞬間有科展的感覺XD.
共有32組新創團隊各自Demo他們的成果, 除了我這種看熱鬧的鄉民之外, 現場還有一些大學生模樣的人(後來聽說台大創業學程修課的都會來參加), 創投公司的人, 甚至有科技公司的人直接問某團隊能不能接case, 場面十分熱鬧.

滿有意思的是創業團隊裡並非全都是科技網路業(當然還是居大多數), 有團隊是做生機飲食的, 有做國際志工的, 有做手工包包的, 有時候我們被自己的視野侷限住, 來看一看這些不同領域的創業團隊, 也是一種新的啟發.

不過身為一個工程師, 我比較有興趣的還是科技網路這方面的團隊嚕, 有一個叫 Tapgo 的團隊他們的技術頗有意思, 簡單來說就是把一般平面廣告的 QR CODE 直接藏進廣告圖片裡, 我猜是在 pixel 之間插一些黑點, 在肉眼不失真的前提下把資訊藏進去, 這樣大家就不用去對著 QR CODE 的小方塊掃描, 直接對著廣告圖本身掃就可以有 QR CODE 的功能. 感覺做起來應用會很廣.


下午開始就是演講及18組的團隊 presentation,一開始是王品的戴董演講, 他也是台大創聯會的共同發起人之一. 戴董提到他心中的兩大黃金產業 - 科技業跟連鎖店, 其實聽完我還是不知道黃金在哪XD, 還有培養關於財經報紙雜誌的閱讀習慣 (這我倒是很疏忽).

之後各個團隊的 presentation, 因為只有六分鐘, 所以大部分都是簡單介紹而已, 比較有意思的是團隊的成員, 有些跟所學幾乎完全無關, 所以會看到財金系的去做生機飲食, 國企系的去弄網路, 學法律的去弄志工, 我想這就是創業的精神吧, 不管你以前是學什麼, 只要你發現問題, 認真去想解決這個問題, 就是一個新事業的誕生.

最後的一些心得, 我覺得台大不愧是首府, 資源真的比較多, 像創聯會這種組織目前沒聽到其他學校有類似的, 這次活動各方面看來都算是辦的不錯, 而且台大這種綜合型的大學對有志於創業的學生是比較有利的, 畢竟財金, 工程, 資訊, 法律等各式各樣的人都可以遇的到, 相信對於激發不同領域間的創意也是很有幫助的.

對這場活動有興趣的朋友可以到 TechOrange 看一下當天影片, 希望對有心創業的朋友們有些幫助.



2012年3月6日 星期二

Python IDE: Eclipse + PyDev

在Windows上想開發python又沒有合適的IDE嗎?
試試看Eclipse + PyDev plugin吧

1. Eclipse: http://www.eclipse.org/downloads/
安裝Eclipse, 不知道要抓哪版就先裝classic.
下載完是一個zip, 直接解開就可以用了不需要安裝

2. Python: http://python.org/getit/
安裝python主程式, 目前3.x版沒有向下相容2.x
可以選擇裝3.x或2.7(2.x版的最終release)來安裝

3. 加入python到PATH環境參數
在PATH後面多貼
C:\Python27;C:\Python27\Tools\Scripts   <= 如果是裝2.7版的python

C:\Python32;C:\Python32\Tools\Scripts   <= 如果是裝3.2版的python

4. PyDev: http://pydev.org/download.html
安裝Pydev plugin, 打開eclipse以後選
Help -> Install New Software
填入http://pydev.org/updates (因為pydev有改網址 網路上很多舊資料是一個錯誤的link)
 接下來一路Next就安裝完成啦!

 5. 開一個新的python project:
eclipse -> File -> New -> Other
選Pydev Project

2010年5月2日 星期日

[貓] C++ 五歲了


C++五歲了

有時候時間這東西很奇妙,不知不覺中,這隻貓女兒已經陪我度過了這麼多年

不管是大學、研究所、當兵夏令營到現在的上班族,每段日子都有C++的蹤跡

今天趁她剛過五歲,來回顧一下C++的成長史:


2005年6月12號,感謝好心的貓中途讓我領養了她。有圖為證,那時候才兩個月左右
真的是好小一隻。


2005/07,似乎長大了一丁點,看起來還是很瘦弱可憐的樣子。


2005/08,毛色比較亮麗了,眼神楚楚可憐是她的大絕招,常常用此逃過處罰XD


2005/11,肚子開始變胖了XD

2006 照片消失了 >_<


2007/09,跟我住到新竹去,看起來很大隻其實都被獸醫說瘦。


偶爾要假裝自己是蛇


偶爾也要幫某運動廠商宣傳


喜歡霸佔電腦不給我用


2009,又跟我搬回台北了,而且他適應新環境都很快,真是一隻好貓。


現在最常玩手不見了的遊戲(因為大部分時間都在睡覺orz)


西家家 生日快樂~

要乖乖喔~

2010年2月26日 星期五

[C++][STL] delete item in loop

STL 好用是好用,小地方還是要注意,不然很容易爆炸又難DEBUG

1. Use List:
list中erase會回傳iterator,所以要erase(it)
list<int> tmp;
for(list::iterator it = tmp.begin() ; it != tmp.end() ; /*empty*/ )
{
        if( something )
                it = tmp.erase(it);
        else
                it++;
}

2. Use Map:
map中erase竟然又不一樣,回傳void,所以需要erase(it++)
map<int,int> tmp;
for(map::iterator it = tmp.begin() ; it != tmp.end() ; /*empty*/ )
{
        if( something )
                tmp.erase(it++);
        else
                it++;
}

其實應該要看他內部為啥實做成兩種模式的
但是STL聖經一直供在桌上懶得看XD
有空再來研究

[Blog] 在blogger貼漂亮的程式碼

換身為一個宅宅工程師,在BLOG上貼漂亮的程式碼也是合情合理的(推眼鏡)

上網可以搜尋到一缸子的blogger解法
很囧的是不知道為啥很多人貼的解法我都弄不起來
經過多次嘗試失敗
一怒之下直接去看人家的原始網頁
然後就成功貼出程式碼了XD

我是範例程式碼
int main()
{
   printf("hello world");
   return 0;
}
我是範例程式碼

主要步驟記錄一下:
1. Blogger後台選擇〔版面配置〕→〔修改HTML〕→勾選〔展開小裝置範本〕
2. 把以下這段CSS貼到裡面,貼哪裡不知道可以看網頁原始碼
.post pre {
background: #F0F0F0 url(http://klcintw.images.googlepages.com/Code_BG.gif) repeat-y scroll left top;
border: 1px solid #CCCCCC;
color: #333333;
display: block;
font-family: Courier New;
font-size: 10pt;
line-height: 120%;
margin: 5px 0 0 20px;
max-height: 200px;
overflow: auto;
padding: 10px 10px 10px 21px;
width: 90%;
}
.CODE  {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) l\
eft top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
height:200px; // for IE6
line-height: 1.2em;
}

3. 麻煩的大於小於轉換:
HTML ENCODE網站去轉換

4. 在<pre class="code">和</pre>之間插入你的程式碼

不過blogger貼程式碼還是不太friendly阿~_~||

參考文章:
高登工作室
Forgot 同花打不打得過俘虜浩司
SeekING Bernie

2010年2月3日 星期三

[C++][STL] map如何使用一個struct當作key

拿來當key的struct,裡面有兩個variables:
struct S
{
        int x;
        int y;
};
由於map在insert時就會用KEY做排序,所以必須自己寫一個比較函式:
struct CmpFunction
{
        bool operator() ( const struct S s1, const struct S s2 ) const
        {
                return ( (s1.x < s2.x) || ((s1.x == s2.x) && (s1.y < s2.y)) );
        }
};
接下來就可以直接定義map的typedef,比較簡單好用:
typedef std::map<struct S, int value , CmpFunction> map_t;
宣告:
map_t mymap;
如此一來就可以用find去快速搜尋:
struct S mystruct;
map_t::iterator iter = mymap.find( mystruct );
if( iter == mymap.end() ) // not found
else // found