java 11 不支援java web start

公司電子表單為鼎新的easyflow GP版, 需安裝支援java web start版本的java, 但我寫程式, 電腦只安裝java11, 不支援java web start怎辦? 我們可以下載IcedTea-Web , 安裝後就可以屎用了.

javaws xxx.jnlp

若出現unsigned jar 問題, 可以找到jdk或是jre , 修改conf\security\java.security這個檔案(安全風險請自行評估), 跳過安全驗證.

jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024, DSA keySize < 1024

SmartGit令人驚豔的LFS鎖定功能

我用過幾種GIT客戶端程式, 從tortoiseGit, GitEye, gitkraken,SourceTree,GitHub Desktop, 都長期用過, 但老實說我只用基本功能,因此看不出來差異在哪, 也不在意哪種用戶端程式好或不好.

直到最近,公司有個需求,要版控”機構部門的圖檔”,這原本是PLM宏大系統的功能(整合ERP,文件管制), 但…廠商報價後,就GG了.

於是我想自己找解決方案, 能滿足版控, 又要能滿足檔案鎖定功能, 也參考過網路力推,能管控圖檔的 https://www.perforce.com,

perforce 能版控,也能鎖檔案, 甚至細心列出git,svn,與自身產品的差異(當然是老王賣瓜了)
https://www.perforce.com/blog/vcs/git-vs-svn-what-difference
如果有預算, 我也建議圖檔管控應當要用perforce.

但我個人還是想要用git這個比較熟悉,簡單,無複雜系統的工具.
那問題來了,雖說git的LFS可以進行大檔案版本控管與鎖定,但客戶端工具程式還沒找到好用上手的,

直到SmartGit(20.1版以上)現世,這工具能針對檔案進行直覺的”鎖定”, 就好像用檔案總管一樣,能讓麻瓜容易上手.
雖說tortoiseGit也可以在客戶端就鎖定檔案,但整合度實在差太多了, 很不推薦.

Git檔案被william鎖定了

不囉唆,寫心得

  • 確認Git伺服器是否援Git LFS 2.0
    我使用的gitblit 1.9.3 雖然支援LFS,但不是LFS 2.0就無法鎖定檔案,
    慘阿,只好先用吉茶測試
  • 建立/克隆專案Repository,並且確認那些要進行LFS管控
#執行cmd, 到專案Repository目錄執行
git lfs install
git lfs locks --local
git lfs locks --verify
## 設定那些檔案需要進行LFS管控
git lfs track *.exe --lockable
git lfs track *.zip --lockable
...
若執行 git lfs locks –verify 出現錯誤, 有可能是Git伺服器不支援LFS鎖定功能
  • 修改專案Repository設定
#修改.git\config 以下設定若沒有就自行新增
[lfs "https://server/repo.git/info/lfs"]
    ...
    locksVerify = true
#"https://server/repo.git/info/lfs" 為 remote URL,加上/info/lfs
  • 啟用LFS檔案鎖定功能,與背景自動更新LFS最新狀態
SmartGit->Edit->Preference->Low-level Properties
設定 
status.lfs.locks=true
status.lfs.locks=true
background.fetch.delay=30
background.periodicalRefresh.delay=30
backgroundTasks.idleDelay=30
SmartGit->Edit->Preference->Backgroup Command->detect remote changes
設定
當專案Repository沒使用的時候, 或是已設定我的最愛的專案Repository 需要定期檢查LFS狀態

#若沒有設定,則不會自動更新狀態, 會無法得知其他人是否鎖定檔案

**SmartGit 一套單機版最便宜約100美金左右

結論,這樣的設定很複雜,目前還不好用,若能安裝時就一件設定,那就很好了

android Git文字筆記APP更新版本

3年前我實作一個Git文字筆記app, 使用jgit套件, 可將github clone到android手機上, 然後進行編輯, 編輯完畢,直接版控到github上面,

最近play store要求target api在2022年11月前, 至少要設定31 , 於是我就編輯了一下, 實在有夠麻煩, 一大堆套件要升級, android studio也是大改版要求舊的專案也要跟著升級.

升級升級, 想說之前jgit只使用4.5.7版本, 趁這機會,改用jgit 6.3.x版, 後來發現6.3.x 使用outputstream類別中的一個函式”transferTo”, 造成android app 找不到該method,程式跳掉.

最後我發現 android 13才支援”transferTo”

另外我開發的這支app, 當初硬改成可以接受未正式簽章的SSL網站, 現在變成資安問題,上架失敗, 原因是X509相關類別,被我繼承改成一律安全 , 只好再改成原本的檢查方式,

也就是說以後這支app要使用遠端git網站, 必須是正式簽章HTTPS, 否則是不能使用的.


為何我的app要使用jgit 6.3.x , 因為jgit終於支援shallow(depth)功能, 可以讓我clone的時候快一點, 不然有些commit數量太多, 要clone很久,很麻煩, 而app本身只想用來做文字筆記, 不用clone太多commit版本下來,不然使用者會嫌棄的.

公司有pixel手機, 趕緊升級到android 13

Github 程式存取必須使用PAT(Personal Access Token)

之前寫過 用戶端github commit需要改用token密碼 才可以使用,
(或是web browser認證),

也就是說, 使用程式例如 JGIT套件, 帳號密碼,也需要使用token密碼, (ps. 我有時候久了就會忘記,真是糟糕)

Setting->Developer setting

點選Personal access tokens -> 點選 Generate new token , 產生新的token密碼

輸入相關資料, 過期時間(可選永不過期), 與該token權限

將token密碼複製,就可以使用了

android 檢查play store是否安裝

java

public static boolean isPlayStoreInstalled(Context context){
    try {
        context.getPackageManager()
                .getPackageInfo(GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

kotlin

fun isPlayStoreInstalled(context: Context): Boolean {
    return try {
        context.packageManager
            .getPackageInfo(GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0)
        true
    } catch (e: PackageManager.NameNotFoundException) {
        false
    }
}

build.gradle

    implementation 'com.google.android.gms:play-services-base:18.0.1'

apache poi 資料庫匯出excel,中文自動排版

多年前自己寫一個函式, 透過poi 讓資料庫的資料匯出excel, 但是無法搞定中文排版, 最後終於找到解法, 罩門如下:

sheet.setRandomAccessWindowSize(-1);
sheet.autoSizeColumn(iCurrentCol);
sheet.trackAllColumnsForAutoSizing();

有興趣的可以參考我的函式

https://github.com/WilliamFromTW/Jakarta/blob/master/src/inmethod/jakarta/excel/CreateXLSX.java

裡面的 buildExcel()

上班打卡鐘資料格式轉換(java 8)

導入新系統最麻煩的就是: 新舊系統並行,

舊的考勤導出文件只有一種格式, 因此新系統必須能夠讀懂舊文件, 再導進新系統,

若無法讀取, 或是舊版打卡有缺陷, 例如2021沒有20,只有21, 那必須寫轉資料程式, 加上20, 反正就是把一份純文字, 再加工轉成另一份純文字文件.

JAVA 文件範例如下,請自行加工:

android取得藍芽裝置連線狀態

Java

public static boolean isConnected(BluetoothDevice device) {
    try {
        Method m = device.getClass().getMethod("isConnected", (Class[]) null);
        boolean connected = (boolean) m.invoke(device, (Object[]) null);
        return connected;
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

Kotlin

fun isConnected(device: BluetoothDevice): Boolean {
  return try {
    val m: Method = device.javaClass.getMethod("isConnected")
    m.invoke(device) as Boolean
  } catch (e: Exception) {
    throw IllegalStateException(e)
  }
}

[心得]自製虛擬幣$TMC

先說明一下,4月才發現加密貨幣很夯, 但不管是挖礦,或是買幣都只能投入一些些;
於是我玩起自製幣(非ERC20), 只是好玩, 無法跟所有網路連線, 也只能提供最低2個節點, 讓伺服器正常跑起來.

我自製幣的網址為: https://tmc.kafeiou.pw , 可以取得錢包,與註記碼
然後, 然後就沒有然後了,因為這系統是PoS,無法透過挖幣取得, 好無聊!
於是我想了想該如何發幣:

  1. 空投
    只要寫錢包,與公鑰 , 我看到就會轉TMC過去
    https://docs.google.com/forms/d/1X-NpykI6RlMwjW3gTkoWdobNmoAGiVr97m4BwIOd7rI
  2. 自己寫了類似遊戲的線上獎勵程式
    只要在線,每隔一段時間得到1塊, 到最低金額會統一發放
    客戶端程式(含源碼):
    https://github.com/WilliamFromTW/ToolManCoinAirDropClient/releases
    下載程式後, 修改錢包與公鑰,就能因在線時間越久而得到獎勵.
    這樣很像挖礦的感覺,靠自己努力取得錢幣

心得:
網路上搜尋如何自製屬於自己的錢幣, 無奈都太過複雜,
而且大部分都需要”挖礦”取得錢幣.
最後我終於找到NXT未來幣(PoS), 該組織也讓大家能夠自製虛擬幣
https://github.com/sandoche/Proof-of-Stake-Cryptocurrency-generator

我自己覺得虛擬幣的世界真的無限想像, 真棒.
TMC=Tool Man Coin 工具人錢幣

PS.
伺服器端程式(含源碼)
https://github.com/WilliamFromTW/ToolManCoinAirDropServer
加入TMC節點的方式,可以到這下載
https://github.com/WilliamFromTW/ToolManCoin

很簡單直覺,java限制雙開的程式寫法

private static final int PORT = 9999;
private static ServerSocket socket;    

private static void main() {
  try {
    //Bind to localhost adapter with a zero connection queue 
    socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
    // 正常流程
    //
  }
  catch (BindException e) {
    // 異常流程
    System.err.println("Already running.");
    System.exit(1);
    Runtime.getRuntime().halt(0);
  }
}
1 2 3 4 5