跳到主要內容

發表文章

目前顯示的是 2016的文章

JavaScript Events Calendar component

最近工作上寫的,目的是想弄個功能接近Google Calendar的東西
原本想拿個開源的專案回來改,不過查了比較流行的幾個專案都是用jQuery、react來寫的
而且坦白說都還滿大包的,好幾個複合需求湊起來就是這樣的大小
反而沒有看到單純用JavaScript刻的 Events Calendar
這下只好自己動手做了
gist link

See the Pen VmRZJo by veni (@veni_vi) on CodePen.
不是什麼了不起的code,不過寫起來也花了一些時間
雖然說大部分的時間可能在觀察Google Calendar的行為(笑
使用上應該還算好拿來改的

CalendarEvent 依照自己的需求決定要多帶哪些數據
至少要有個顯示的內容跟一個日期

EventCalendar.requireEventData([{
"content": "test2",
"date_init": "2016/12/16 11:30:00",
"info": "test 2"                 // 這是示範用來作客製化行為的額外資料
}
]);

EventCalendar.setEventRenderFunction、EventCalendar.setEventMoreFunction可自訂事件處理

如果想做其它天期的顯示模式則可以參考 CalendarView 的繼承寫法自行撰寫

var calendar = EventCalendar.render();  // 畫出calendar

接著把畫完的calendar貼到想用的地方就可以了

歡迎改寫跟回報bug

八重山的台灣人 讀後雜感

作者 松田良孝

我會知道這本書、這個題材的起源還滿有趣的
起頭是有人在PTT上分享土鳳梨相關的文章(連結可能之後會失效)
https://www.ptt.cc/bbs/Gossiping/M.1474100971.A.1A4.html
https://www.ptt.cc/bbs/Gossiping/M.1474125887.A.E9B.html

之前想過到八重山群島旅遊過,有查過相關資訊
不過從沒想過島上有這麼多台灣裔的島民
雖然移民在台灣歷史的過去、現在甚至是未來都會一直是重要的一部份
不過那種艱辛的早期第一代移民情境已經不是現在台灣主體一代的生活經驗
從八重山移民的經驗可以反思過往離鄉背井來台灣的人們的想法、感受
甚至哪天自己在現在全球化的狀況成了移民第一代
也可以從移民經驗找到心靈上的參考、或是對第二代以後的影響參考

除了書之外,我也查到了一些相關資訊可以一併閱覽:
2015.12.20【台灣演義】八重山 台灣移民血淚史
2016台北電影節 台北電影獎 |海的彼端 After Spring, the Tamaki 

Android 製作簽名擷取View

前一陣子有個 Android 開發需求是做一個簽名擷取的component
查詢了Android文件後沒看到可以直接用的相關套件
原本以為應該是商用上不罕見的功能才是?
看了一下SEO排前的類似專案,大概有style另外設定、UI固定格式等等我不喜歡的因素
所以決定寫一個簡單又比較容易跟其他自訂 component 整合的View

跟Dialog整合的成果圖如下:

Mac版 Java 7 取得檔案 MIME type 的方式

現行 Java 取得檔案 MIME type的標準方式是透過 Files.probeContentType(Path path) 取得 最近處理同事回報的問題才發現這個方式在Mac版的 Java 7 有bug 官方錯誤列表:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7133484 而且應該只會修正Java 8以後的版本
目前測試改用 URLConnection.guessContentTypeFromName(String fileNmae) 也是一種可行的方式 如果MIME type相關的程式有可能部署在 Mac環境的 Java 7的話,需要注意這個問題

Java Nashorn Engine 的 setTimeout 使用方式

之前想透過 Java 的 Nashron 執行 setTimeout 這個定時執行的 JavaScript 函式碰到問題
看起來 Nashorn 並沒有實作關於非同步的 JavaScript 機制
我並沒有花太多時間查閱相關規格,只能猜想也許他鼓勵設計者使用 Java 的 async 機制

不過有時候需要執行的JavaScript Code 沒辦法排除 setTimeout 而改寫成 Java code
查到的相容寫法如下:

var setTimeout, clearTimeout, setInterval, clearInterval;

(function () {
    var timer = new java.util.Timer();
    var counter = 1;
    var ids = {};

    setTimeout = function (fn,delay) {
        var id = counter++;
        ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn});
        timer.schedule(ids[id],delay);
        return id;
    }

    clearTimeout = function (id) {
        ids[id].cancel();
        timer.purge();
        delete ids[id];
    }

    setInterval = function (fn,delay) {
        var id = counter++;
        ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn});
        timer.schedule(ids[id],delay,delay);
        return id;
    }

    clearInterval = clearTimeout;

    setTimeout(function(){ [your function code] }, [delay]);

})()

用上述方式就可以繼續執行 setTi…

從 Android device 取得App crash log

參考資料: https://wiki.cyanogenmod.org/w/Doc:_debugging_with_logcat

Android developer 大概都會有協助測試 app 執行狀況的需求
不過如果不是用 Android Studio build 的話,crash report 只能從 device本身拿出來才看的到

以 Windows 為例的取得方式如下:

1.Win+R 叫出執行後,輸入 cmd 啟用命令提示字元

2.切換到 Android SDK 底下的 platform-tools 目錄
C:\Users\vencil>D:
D:\SubPrograms\AndroidSDK\tools>cd D:\SubPrograms\AndroidSDK\platform-tools

3. 下指令 adb logcat *:E > [destination] 就可以將log輸出到目的檔案裡了
D:\SubPrograms\AndroidSDK\platform-tools>adb logcat *:E > D:\errlog.log


如果想在不移除app的狀況下清除累積的log,可以用 logcat  指令帶 -c flag
D:\SubPrograms\AndroidSDK\platform-tools>adb logcat -c

Java make SOAP call

參考文章
https://docs.oracle.com/cd/E19879-01/819-3669/bnbhw/index.html

SOAP的定義請參考wiki
雖然目前已經是過時的資料交換技術
不過像是在台灣只會 Microsoft (舊)技術的廠商還是不少
有時候還是只能跟著用這些方式配合

這次 sample code 的github連結
會寫這篇是因為Java的SOAP相關的 library 體積都滿龐大的
不過若工作上用不到太複雜的設定,靠 Java 本身的支援也能避免 library 的依賴及帶來的麻煩
因為跟SOAP搭配的回傳資訊大多是XML格式,所以下面的code示範將結果當成XML的處理方式

自製 Java BBCode Parser

BBCode 是常在論壇還是一些輕量級應用使用的標籤
他在實際執行時會從 [b]test[/b] 這樣的標籤轉譯成 HTML 標籤 <b>test</b>
開放讓使用者自行撰寫 HTML 內容時,容易有撰寫錯誤或XSS安全性問題
所以使用這種限定規格的標籤,對使用者來說是比較容易的,對網站方也是相對好處理的

不過在搜尋既有的 Solutions 時發現多數都是 JavaScript 用的 Library
Java使用者最常被推薦的可能是 kefirbb,只是查看了規格後我是不太想使用
因為我不需要其他的標籤轉換功能,例如 Markdown 之類的
我也不想維護一個並不是一目瞭然的格式轉換用的 XML,需要加入或修改標籤時會有困難

滿多人會選擇自行寫簡單的 regular expression 轉換
不過幾乎網路上查到的 pattern 都沒法處理好巢狀(nested) BBCode 結構
以及新的標籤要對應不同的 regular expression,我也覺得是一種負擔

後來我看到了 Extendible-BBCode-Parser 這個JavaScript Library
結構上我覺得不錯
能有彈性的新增、修改標籤行為,也能確實處理好 nested BBCode,所以動手改了個 Java 的版本
撰寫時考量還要支援Java 7,不能用 lambda 來寫真的很麻煩
不過目前應該調整到我覺得還可以的程度
改寫時我就只專注在我需要的部分,一些錯誤偵測我覺得沒必要就拿掉了
程式碼的長度覺得不適合整個貼上來,所以不貼code改貼程式碼 Gist 連結
跟參考的library一樣開放隨意修改、發佈

之前我對於 regular expression 大概就是基礎使用的程度
程式裡的那些 pattern 我也沒懂到可以說出什麼詳細教學
一些處理細節也是邊刻邊體會,從這次經驗學到了些東西,感謝原 Project 提供的各種想法

Android Studio java.lang.OutOfMemoryError: GC overhead limit exceeded

參考文章

我在包裝 signed APK 時碰到這個問題
原本在包測試的APK時都沒狀況
大概是包入驗證時的加密、解密處理多用到的記憶體剛好超過上限

根據查詢的文章提到,Android的dex machine預設記憶體使用上限為1GB
解決方式是在 build.gradle 裡在 Android 相關的設定裡加入以下紅字部分
android {
    ....

dexOptions {
        javaMaxHeapSize "4g"
    }

}

有看到其他文章提到4G記憶體在大多數狀況可能是過剩,設定成 "2g" 就足夠的意見
實際設定就依個人需求調整吧

Windows版 SourceTree 啟用認證暫存的方式

參考文章

SourceTree 是Git的GUI輔助工具
坦白說比起 Command Line ,我還是比較喜歡有GUI的輔助操作介面
特別是看線圖以及一些複合操作我是認為比原生的Git Bash及GUI好用
不過 Windows 版的使用者在一開始大概都會碰到無法登入 Git server 的問題
SourceTree 的認證暫存預設應該是封閉的
如果Git server沒啟用 keyless,那就得開啟認證暫存機制囉

操作步驟為
Win + R 叫出執行後,輸入 cmd 開啟 Windows 的命令提示字元

接著下以下指令

C:\Users\xxx> D:                                 ::切換到SourceTree的安裝硬碟槽,示範是D槽

D:\>cd D:\SubPrograms\sourcetree\tools\putty  :: cd到SourceTree下的 tools\putty目錄

D:\SubPrograms\sourcetree\tools\putty> plink.exe git.yourSite.com
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048......
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) y  :: …

自動化重啟 Java Process

有些狀況下會碰到需要關閉 Java process 的狀況
不管是不可預期的,例如 OOM 導致 process crash
或是可預期的狀況,例如需要 Java程式、設定檔更新,而在系統內用 System.exit(0);
通常我們都會需要馬上再重開 Java process,將處理流程自動化會方便得多

Linux  bash 示範

  JPID=0
  while [ $JPID-eq 0 ]
  do

    eval "(java ...)"   # eval your own java process.
    JPID=$?       # set PID to status.

  done

用個迴圈監聽PID是否存在
Windows batch 寫法也是基於同樣概念

:exeLoop
set JPID=-1
for /F "tokens=1" %%i in ('jps -lv ^| find "%MAINCLASS%"') do ( set JPID=%%i )
if %JPID%==-1 (
echo %_EXECJAVA% %JAVA_OPTS% -classpath "%CLASSPATH%" -.... %MAINCLASS%
:: execute your own java process.

ping 127.0.0.1 -n 2 -w 1000 > nul    :: wait for 2 seconds before next loop.
)
goto exeLoop

Java 輸出 Exception 訊息到指定物件

Java 的 Exception 訊息預設會輸出到 Java Console
如果要將訊息另外紀錄在指定的文字檔案,可以採取的作法有兩種

1. 在作業系統下指令將 Java process 的輸出存到指定的文字檔
例如 Linux 環境下
eval \"$_RUNJAVA\" $JAVA_OPTS \ -classpath \"$CLASSPATH\"  >> "/log/err.txt" 2>&1

p.s.  上述的Java相關執行跟參數都是用另外指定的參數,所以請不要直接照抄


2. 將 Exception 存到 String 物件後,再另外用這個 String 做後續處理
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String errMsg = e.getMessage() + "\r\n " + sw.toString();