2019-07-23

Java Web Start(JWS)在JDK11的因應

由於JDk11開始就不會再支援Java Web Start(JWS),以下提供幾種做法:

1.利用JDK11的jlink,對應各平台產生獨立的run-time image,並對應各系統平台製作安裝檔(win->.msi, linux->.deb,.rpm, mac->.pkg蠻累人的)。

記得,你的應用程式如果要能正常的在JDK11跑,module-info.java記得要設定有用到的模組。

2.安裝JDK11後,再安裝icedtea-web:
https://icedtea.classpath.org/wiki/IcedTea-Web
https://github.com/AdoptOpenJDK/IcedTea-Web

github上的release有win跟linux平台的已編譯launcher,但就是沒有mac的,不過也不難處理,可以參照以下這個解法:
https://apple.stackexchange.com/questions/342943/in-macos-how-to-run-a-jnlp-file-with-openjdk-8?rq=1
或者直接在mac自已寫一個shell script launcher:
#!/bin/bash
if [ "x$JAVA_HOME" = "x" ] ; then
    JAVA="$( which java 2>/dev/null )"
else
    JAVA="$JAVA_HOME"/bin/java
fi
if [ "x$JAVA" = "x" ] ; then
    echo "Java executable not found"
exit 1
fi
if [ "x$1" = "x" ] ; then
    echo "Please provide JNLP file as first argument"
    exit 1
fi
$JAVA -Xbootclasspath/a:netx.jar net.sourceforge.jnlp.runtime.Boot $1

icedtea-web >=1.8的版本開始支援jdk11,但在1.8版+jdk11跑似乎有點bug,
譬如AWT視窗凍結,因此我又降回1.6版+jdk8就又恢復正常。
似乎真的是jdk11的bug:
https://icedtea.classpath.org/wiki/IcedTea-Web#Common_Issues
https://bugs.openjdk.java.net/browse/JDK-8204142

3.安裝JDK11後,再安裝OpenWebStart:
https://openwebstart.com/technical-details/

這專案是基於icedtea-web衍生而來,官網表示在jdk8或jdk11都可使用,
也有已編譯好的win/mac/linux/unix執行檔,可以試試看。

4.改用.NET core + GTK,製作跨平台的視窗程式,只是除了windows以外,其它平台都要先安裝.NET core;除了linux外,其它平台都要先安裝GTK library(當然也可以先打包在程式內)

Ubuntu 18.04上同時有jdk8及jdk11的JavaFX(OpenJFX)安裝問題

由於有同時開發java8及java 11的需求,因此裝了openjdk8跟openjdk11,
如果在ubuntu上二個jdk都要安裝javafx(openjfx),會是一件頭痛的事。

先來處理jdk8 + openjfx8:

為了jdk8能使用javafx,需強制降版安裝openjfx8:
sudo apt install \
  openjfx=8u161-b12-1ubuntu2 \
  libopenjfx-java=8u161-b12-1ubuntu2 \
  libopenjfx-jni=8u161-b12-1ubuntu2

sudo apt-mark hold \
  openjfx \
  libopenjfx-java \
  libopenjfx-jni

(當然也可以直接改用oracle jdk8,但oracle是個死要$的公司,你知道的)
改安裝zulu jdk也可以,jkd8直接就含openjfx,未來會連jdk11也一起包含openjfx。
https://www.azul.com/zulu-gets-graphical-with-openjfx/

=========================這裡可以跳過============================
也可以手動下載deb來裝:
https://ubuntu.pkgs.org/18.04/ubuntu-universe-amd64/libopenjfx-java_8u161-b12-1ubuntu2_all.deb.html
https://ubuntu.pkgs.org/18.04/ubuntu-universe-amd64/openjfx_8u161-b12-1ubuntu2_amd64.deb.html
https://ubuntu.pkgs.org/18.04/ubuntu-universe-amd64/libopenjfx-jni_8u161-b12-1ubuntu2_amd64.deb.html

比較怕死的,將這三個.deb手動解壓縮:
dpkg -x libopenjfx-java_8u161-b12-1ubuntu2_all.deb ./openjfx8
dpkg -x openjfx_8u161-b12-1ubuntu2_amd64.deb ./openjfx8
dpkg -x libopenjfx-jni_8u161-b12-1ubuntu2_amd64.deb ./openjfx8
再依解壓縮後的目錄結構放到系統對應的資料夾。

或直接下指令強迫安裝(注意,--refuse-overwrite=不覆寫舊檔):
dpkg --install --refuse-overwrite --force-depends --force-conflicts libopenjfx-java_8u161-b12-1ubuntu2_all.deb
dpkg --install --refuse-overwrite --force-depends --force-conflicts openjfx_8u161-b12-1ubuntu2_amd64.deb
dpkg --install --refuse-overwrite --force-depends --force-conflicts libopenjfx-jni_8u161-b12-1ubuntu2_amd64.deb
=================================================================

再來處理jdk11+ openjfx11:

要是apt強制降版裝openjfx8,那原本預設的openjfx11就會被移除,
因此只能手動處理。

先手動下載openjfx模組(JavaFX Linux jmods)放到:
/usr/lib/jvm/java-1.11.0-openjdk-amd64/jmods

再下載openjfx SDK(JavaFX Linux SDK),解壓縮後要放哪都行,譬如放到
/usr/lib/jvm/java-1.11.0-openjdk-amd64/openjfx

如果是用Jetbrains IntelliJ + JDK >=11,可以參考以下設定環境:
https://openjfx.io/openjfx-docs/#IDE-Intellij
(先新增專案的openjfx SDK library路徑,然後編輯module-info.class加入javafx對應模組,或直接在VM啟動選項新增模組路徑及對應模組)

=================================================================
別忘了裝scene builder:
https://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-1x-archive-2199384.html
https://docs.oracle.com/javase/8/scene-builder-2/installation-guide/jfxsb-installation_2_0.htm
=================================================================
ref:
https://stackoverflow.com/questions/49469941/netbeans-error-bundler-webstart-jnlp-bundler-jnlp-failed-to-produce-a-bundl
http://hongouru.blogspot.com/2015/09/solved-error-building-new-project-using.html
https://stackoverflow.com/questions/53744923/java-lang-unsatisfiedlinkerror-com-sun-glass-ui-gtk-gtkapplication-isdisplayva
https://bugs.launchpad.net/ubuntu/+source/openjfx/+bug/1799946

2019-07-18

Arch Linux 安裝在VirtualBox後,安裝Guest Additions

將Arch Linux安裝在VirutalBox(GUEST端)跟一般安裝一樣沒啥特別,不過安裝Guest Additions時會比較麻煩一點:

1.在VBox選單選擇「Devices/Insert Guest Additions CD Image...」

2.安裝build kernel必要的package:
#sudo pacman -S gcc make perl

3.找出kernel版本,再安裝headers:
#uname -r
<4.19.59-1-MANJARO>

#sudo pacman -Si linux419-headers
版本: 4.19.59-1

#sudo pacmam -S linux419-headers

4.安裝guest additions
cd /run/media/username/VBox_GAs_6.0.10/
sudo sh VBoxLinuxAdditions.run

5.重開機,可以調整解析度囉!別忘了還要在HOST端安裝Extension Pack,才能支援USB 2.0 and USB 3.0 devices, VirtualBox RDP, disk encryption, NVMe and PXE boot for Intel cards…等功能

6.以後要是有升級kernel,記得要
rcvboxadd quicksetup <version>
或直接
rcvboxadd quicksetup all
重建module

ref:
https://wiki.archlinux.org/index.php/VirtualBox#Installation_steps_for_Arch_Linux_guests
https://www.virtualbox.org/wiki/Downloads

2019-07-11

Visual Studio Code使用Remote-SSH套件遠端作業

由於常常需要ssh連到server修改檔案,之前是使用VSCode的remote workspace套件:
https://marketplace.visualstudio.com/items?itemName=mkloubert.vscode-remote-workspace

後來微軟又出了個Remote Development套件,裡面包含了:

  • Remote - SSH - Work with source code in any location by opening folders on a remote machine/VM using SSH. Supports connecting to x86_64 Linux SSH servers now, and more platforms are on the way.
  • Remote - Containers - Work with a sandboxed toolchain or container based application by opening any folder inside (or mounted into) a container.
  • Remote - WSL - Get a Linux-powered development experience from the comfort of Windows by opening any folder in the Windows Subsystem for Linux.
如果只有SSH遠端作業的需求,只要單獨安裝Remote - SSH即可:

目前該套件能正常連線遠端server有以下作業系統:
Full support: x86_64 Debian 8+, Ubuntu 16.04+, CentOS / RHEL 7+.
Experimental support: ARMv7l Raspbian 8+ (32-bit) in Visual Studio Code Insiders only.

果然我找了台CentOS 6就無法連線成功了...但其實如果你堅持要能在版本比較舊的server端使用,可以參照以下說明,在server端安裝缺少的一些library:
https://code.visualstudio.com/docs/remote/linux#_tips-by-linux-distribution

像CentOS 6可以照以下方法讓Remote-SSH套件能使用,安裝完重開機即可(注意,因為是升級library,可能會造成server某些服務不正常,如果是跑重要服務的server要升級library前請三思):
https://code.visualstudio.com/docs/remote/linux#_updating-glibc-and-libstdc-on-rhel-centos-6

不過遠端server要先做一些設定,修改 /etc/ssh/sshd_config,將 AllowTcpForwarding設定為yes,然後記得restart ssh demon:
sudo systemctl restart sshd

sudo service sshd restart
這樣本機端才能對server端建立 SSH tunnel,因為Remote - SSH必須靠建立tunnel才能使用(有點雷...)。

還有幾個設定比較需要注意的:

"remote.SSH.useLocalServer": true/false -> 讓vscode視窗共用單一連線,這會讓開啟vscode更快且不用一直輸入密碼,但有時候會造成無法正常連線(譬如timeout),此時設為false試試。一般來說我是設為false,但有些人須設為true才會沒問題。

"remote.SSH.listenOnSocket":true/false -> 如果remote server上有很多使用者的話(MacOS/Linux),那麼讓遠端的vscode server改用socket模式監聽,這樣可以增加安全性,同時sshd的AllowStreamLocalForwarding設定也要設為yes,這樣才能把tcp給forward到socket上。

接下來就是安裝Remote - SSH套件,連線ssh的方式較常見有key based authentication,或輸入password的方式、還有就是同時key+password,個人是習慣每次連線只輸入密碼,
至於網路一些教學說只能用key的方式,我覺得這些人也是東抄西抄不求甚解,這套件是基於ssh使用的,當然是可以直接輸入密碼認證。

先修改本機 ~/.ssh/config 檔案,加入以下設定:
Host server1
    HostName server1.com.tw
    User username

Host server2
    HostName server2.com.tw
    User username

#避免要多次輸入密碼,加入以下ControlMaster設定
Host *
    ControlMaster auto
    ControlPath  ~/.ssh/sockets/%r@%h-%p
    ControlPersist  24h

#防止timeout,每120秒就向server發送keep-alive封包,超過60次無回應斷線
ServerAliveInterval 120
ServerAliveCountMax 60


建立 ~/.ssh/sockets 資料夾:
mkdir -p ~/.ssh/sockets

之後就可以開始連線了,連線過程中會出現prompt要你輸入密碼,完成。




2019-07-09

Linux MInt 19 (Ubuntu 18.04)安裝Mednafen

Mednafen是另一套支援多種遊戲機的模擬器,當然在RetroArch也已包含Mednafen的遊戲核心(beetle開頭的都是),所以一般來說安裝RetroArch就不需要安裝Mednafen了,除非是習慣使用Mednafen,隨君喜好。

還有一套叫higan,但因此作者的設計理念是「精準模擬」,所以跑起來影像或聲音很可能會有卡頓的情形,不建議拿來玩遊戲,但要學習如何寫模擬器倒是可以參考。

由於Ubuntu上的Mednafen套件版本太舊,以下為自行compile & install的步驟:

1.下載mednafen的source code:
https://mednafen.github.io/releases/
此次下載的是 1.22.2版:
https://mednafen.github.io/releases/files/mednafen-1.22.2.tar.xz

2.安裝編譯時需要的工具及函式庫:
sudo apt-get install build-essential pkg-config libasound2-dev libsdl2-dev libsndfile1-dev zlib1g-dev

3.解壓縮並開始compile(建議用gcc)及安裝,譬如解壓縮到 ~/TEMP/mednafen後:
cd ~/TEMP/mednafen
./configure & make
sudo make install

4.下載前端介面mednaffe:
https://github.com/AmatCoder/mednaffe/releases
此次下載的是0.8.8 (注意:mednafen 1.xx開始需配合mednaffe >= 0.8.7使用)

5.解壓縮並開始compile(建議用gcc)及安裝,譬如解壓縮到 ~/TEMP/mednaffe-0.8.8 後:
cd /TEMP/mednaffe-0.8.8
./configure & make
sudo make install

6.啟動mednaffe,第一次可能會詢問mednafen路徑,使用 whereis mednafen 指令查詢後,指向正確執行檔路徑。

7.若要移除,進到原本compile的資料夾,make uninstall即可。

2019-07-07

Linux MInt 19 (Ubuntu 18.04)安裝Retroarch

因為Ubuntu上的Retroarch版本太舊了,想安裝新版Retroarch可照以下步驟:

1.加入RetroArch官方PPA:

穩定版:
sudo add-apt-repository ppa:libretro/stable

nightly build最新版:
sudo add-apt-repository ppa:libretro/testing

因為穩定版跑起來覺得有些問題,個人是安裝每日會自動commit & build的最新版,
目前最新版本的是1.7.7

2.先把舊的RetroArch移除:
sudo apt-get purge retroarch*
rm -rf ~/.config/retroarch

3.安裝新版RetroArch及所有遊戲核心、BIOS:
sudo apt-get install retroarch libretro*

建立存放BIOS的資料夾:
mkdir -p ~/.config/retroarch/system
把下面這一包
http://www.mediafire.com/download/7d5tbargr0iq2x8/RetroArch_BIOS.zip
解壓縮到上面建立的system資料夾

4.修改設定檔:
若直接打開retroarch程式,很有可能選單顯示不正常,且會出現找不到assets的警告,因此必須先手動修改設定檔。基本上有二個設定檔,位於:
~/.config/retroarch/retroarch.cfg
/etc/retroarch.cfg

若找不到~/.config/retroarch/retroarch.cfg,才會找/etc/retroarch.cfg,接著會自動產生~/.config/retroarch/retroarch.cfg,因此主要修改設定~/.config/retroarch/retroarch.cfg即可。Ubuntu 18.04請照以下設定修改(不修改的話,預設(default)會去找~/.config/retroarch下對應的路徑,但因為是用套件管理程式安裝retroarch,所以assets及cores需手動設定成正確路徑):

assets_directory = "/usr/share/libretro/assets/"
audio_filter_dir = "/usr/lib/x86_64-linux-gnu/retroarch/filters/audio/"
libretro_directory = "/usr/lib/x86_64-linux-gnu/libretro/"
libretro_info_path = "/usr/share/libretro/info/"
video_filter_dir = "/usr/lib/x86_64-linux-gnu/retroarch/filters/video/"
menu_show_core_updater = "false" (不經由retroarch升級遊戲cores,而是由ubuntu更新,目前先設為true,第6頻驟建立遊戲清單完再設為false,不過有些遊戲核心如mame似乎ubuntu套件沒有提供,故也可以改用sudo retroarch執行後,再進retroarch去更新核心)
xmb_font = "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc" (指定中文字型,請依照自已喜好的字體)
system_directory = "~/.config/retroarch/system" (BIOS資料夾)

譬如想找Noto Sans CJK字型的位置,可用以下指令:
fc-match -a | grep CJK
locate NotoSansCJK-Regular.ttc

5.啟動retroarch,若不喜歡預設的XMB介面,可以按F5叫出windos介面做設定或載入遊戲


6.自動建立遊戲清單:
注意:自動建立的遊戲清單裡的遊戲名稱會變英文,不喜歡者請自行手動建立清單。

先在「主選單/連線更新器/更新核心訊息文件」更新各遊戲核心的遊戲資料庫,
再到「導入遊戲內容/掃瞄文件夾」直接掃瞄ROM所在位置,
會自動依各機種對應的遊戲清單,若自動掃瞄沒有找到再自行手動加入,
(由於RetroArch不一定能正確找出ROM所對應的機種遊戲,因此有時需手動加入ROM)
然後在「主選單/連線更新器/playlist thumbnails updater」去自動抓縮圖。


ref:

2019-07-01

linux mint(ubuntu)修改xfce視窗的邊框大小(為了能拖曳改變大小)

因為想換個mac like的佈景主題,於是安裝了McOS-MJV-Dark-XFCE-Edition這個主題:
https://www.gnome-look.org/p/1279806/

但這佈景主題有個缺點,就是右下角跟左下角無法拖拉改變大小,因為邊框厚度為0的話,無法拖曳,原作者說這是xfwm的bug,而且作者覺得增加邊框會不像mac主題(所以要犧牲正常功能??),不過只能從左右上角去拖曳,有時真的很麻煩...只好手動把邊框加回去。

當然,你也可以用熱鍵的方式拖曳大小,譬如 alt + 滑鼠右鍵,但有時就是不想二手一起動...)

1.下載Border Only這個主題:
https://www.xfce-look.org/p/1016214/

2.修改xfwm4內所有bottom*.xpm, left*.xpm, right*.xpm共10個檔案,內容全部改成
/* XPM */
static char * left_active = { <-- 此行依各檔名稱不同保留不改
"1 1 1 1",
"#      c #CECECE", <-- 顏色依個人喜好修改,此處為淺灰色
"#",
};

3.複製上述10個修改過的xpm檔案到佈景主題的xfwm4資料夾內(其餘未修改的檔案用不到),如~/.themes/佈景主題/xfwm4/

4.重新載入主題
xfwm4 --replace

ref:
https://superuser.com/questions/436541/how-do-you-increase-the-resize-border-thickness-in-xubuntu-12-04
http://sevkeifert.blogspot.com/2014/12/increase-window-border-size-in-xubuntu.html
https://wiki.xfce.org/howto/xfwm4_theme
https://xubuntu.org/news/window-resizing-in-xubuntu-and-xfce/