2018年2月16日 星期五

Kunernetes 與 Swarm 的選擇

參考选择焦虑症のKubernetes 与 Docker Swarm

最早,是很到 Kunernetes 的介紹,說有多強,很心動。其實,當時根本不知道 cluster 是什麼,而 Kunernetes 是我第一個知道的管理 Dockers 的東西。
然後,知道了 Swarm,但是看到書上的例子,要透過外部主機來建立,深深認為不可行。

可是,Docker 實在發展太快了。我幾天前查 Google,發現它已經內建 etcd。建立 cluster 變得非常簡單。另一方面,也聽說了Kunernetes的入門頗難。因此,完全打消學Kunernetes的念頭。估計自己單位內使用的規模,不會太大,就不折驣了。另外,隱約感覺,Swarm 應該會成為主流,即使現在Kunernetes一片看好。

只是,形勢變化實在太快了,我也後知後覺。在 2017 年底的 DocekrCon,Docker 已宣佈要整合 Kunernetes 了,只因為 Kunernetes 實在太強勢了。所以,我才剛下決心,要學 Swarm,馬上就又得重新考量。

可能,在還未完全整合 Kunernetes 之後,先用 Swarm 管理吧,以後再跳到 Kunernetes,聽說兩者在觀念上是類似的,但 Kunernetes 的學習和入門上比較難一些。

2018年2月7日 星期三

升級 CentOS 7

其實是在已灌 CentOS 6 的系統,要裝 CentOS 7,但想保留原有的 home 的分割區。最後是成功了,但頗費一番波折。

在安裝 CentOS 7 時,可以讓自己選擇 mount 已有的 partition。

使用 CentOS 7 的安裝 USB,開機時,假如不趕快按 Enter 鍵,很快就會從裝有 CentOS 6 的硬碟開機。

在 CentOS 7 系統,必須多一個 2MB 的分割區 bios_grub,而原先的 CentOS 6 沒有這個分割區。只好將 boot 分割區砍掉,多切一個分割區。可是 CentOS 7 的安裝界面,卻無法如願完成此工作。

我先用 Gentoo 的開機 USB,進去把分割區建好。可是,重開後,CentOS 7 的安裝 USB,看到有啟動的分割區,就會去找啟動的檔案,但是空的,就跳到 grub 的畫面,動不了。

後來,只好將 boot 分割區砍了,順利進入 CentOS 7 的安裝界面。可是,安裝界面,卻無法建立分割區。

然後,按 Ctrl-Alt-F2 切到文字模式,直接用 parted 建立 bios_grub 和 boot 分割區。然後,切回圖形安裝界面,重新掃描硬碟,再掛載各個對應的分割區。

建好的分割區,長得像這樣子。注意,這是 gpt 的分割表,雖然 boot 的磁區在前面,但編號變成第 3 個了。標示為 "Microsoft basic" 的磁區,是 LVM。

Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  3146kB  2097kB               grub  bios_grub
 3      3146kB  525MB   522MB   ext4         boot  boot
 2      525MB   3601GB  3600GB

最後,花了一整個下午的時間,才成功重灌 CentOS 7,資料也得以保持完整。只是,HP 的伺服器,重開一次,要等待漫長的好幾分鐘,整個過程,也就是在等它開機,看著它慢調斯理的顯示開機訊息,然後按鍵,然後再等待。

特別把它計時,完全進入系統,約3分鐘,大約要等2分鐘,才出現進 bios 的按鈕。

2018年1月31日 星期三

使用 XDMCP 的遠端登入

2021-05-28 補記: 使用 xrdp 好用多了,可以吏用 Windows 的遠端桌面登入。這篇文章就留著當紀念吧。

參考鳥哥的 X Window System 用在網路上的方式: XDMCP

以前都用 VNC 連上遠端的 Linux,它不用裝 X Window 就可以用,不過,用起來有點不順就是了。

直到最近,才開始學習如何用 XDMCP 來做遠端登入。自己的桌機,是用 Linux,本來就有 X Window server,所以遠端的電腦,用起來的效果應該就和用自己的電腦一樣。當然,要用到顯卡的加速功能,我就不清楚了。

 在 Gentoo Linux 安裝 x11-base/xorg-server 時,必須指定 xephyr 及 xnest 的選項。

我使用的 display manager 是 lightdm,要修改設定檔  /etc/lightdm/lightdm.conf,然後重新啟動 lightdm。
[XDMCPServer]
enabled=true
port=177


系統間資料複製

連接遠端桌面的指令如下
Xephyr -query 10.161.81.183 -ac -screen 1024x768 -br -reset -terminate -title 'if183' :6
要與遠端之間做 copy and paste,要繞一個彎。先在遠端 select and copy 資料,然後再自己的桌面按中間鍵貼上,將選取的資料放入剪貼簿的指令如下。
xsel --clipboard --display :6 | xclip -d :0

游標解鎖

假如滑鼠的游標被鎖在遠端桌面,可以按 Ctrl-Shift 來解鎖。

大概就如此吧


2018年1月21日 星期日

使用 Kindle

買了一台 Kindle 來看電子書,開始測試那種格式比較合適,發現 pdf 很難用。
後來找到網頁,What is The Best eBook Format For Kindle?。看來,最佳格式是 mobi,epub 也可,它會被轉成 mobi。

使用轉檔程式,calibre,可將 pdf 轉成 mobi,轉檔指令如下
ebook-convert document.pdf .mobi

其實,用 calibre 管理 Kindle 很方便。

另外,要挑那一台來用,可以參考 Kindle 有三種,價格大不同!到底該怎麼在三兄弟中選一個帶回家呢? 我是買最便宜的啦,沒用過,要試過才知道好不好用。

要將 pdf 轉成 .mobi 檔失敗,縮小試試看
How can I reduce the resolution of images in an epub or mobi file?

2018年1月19日 星期五

打造可在 Win 2003 的 PHP 7.0

需的工具是 MinGW,其為
MinGW is a collection of windows development tools including compilers such as GCC and G++.
下載 mingw-get-setup.exe
https://null-byte.wonderhowto.com/forum/set-up-mingw-kali-using-wine-0159622/

用 WINE 來安裝
$ WINEARCH=win32 WINEPREFIX=~/wine-mingw winecfg
$ export WINEPREFIX=~/wine-mingw
$ wine /path/to/file/mingw-get-setup.exe

依照說明,安裝 mingw32-base。

設定環境變數 PATH
https://forum.winehq.org/viewtopic.php?f=8&t=19457
https://wiki.winehq.org/Useful_Registry_Keys

執行,出現錯誤,待解決。
$ wine c:\\MinGW\\bin\\gcc.exe iatpatcher.cpp
gcc.exe: error: CreateProcess: No such file or directory

解決方法,要裝 mingw32-gcc-g++
http://pclevinblog.pixnet.net/blog/post/314560381-mingw---錯誤(createprocess%3A-no-such-file-or-directory)(五

然後,新的錯誤
iatpatcher.cpp:67:35: error: 'ARRAYSIZE' was not declared in this scope
 #define PATCHCOUNT ARRAYSIZE(patch)

只要把程式中,ARRAYSIZE(A) 定義前的註記拿掉即可
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))

執行下列指令,即可成功編譯執行檔
$ wine gcc -s -o iatpatcher.exe iatpatcher.cpp -lstdc++ -static

patch 後的 php-7.0.27,在命令視窗執行 php -i,會出現 "找不到 api-ms-win-crt-convert-l1-1-0.dll" 的錯誤。安裝 Visual C++ Redistributable for Visual Studio 2015 即可。

嗯,最終,phpinfo() 可以正常輸出結果了,但是我要用 sqlsrv 的 driver,還是沒辦法在 win 2003 面跑。

問題

可以跑,顯示 phpinfo(),但是 extension_dir 永遠都是 c:\php\ext,因此無法載入 extension。就算把所有的 extension 都 copy 到該目錄下,也無法載入。只好等有空再來處理了。

2018年1月7日 星期日

下載 HLS (m3u8) 影片的方法

m3u8 為 Http Live Streaming (HLS) 串流的副檔名,目前在小鴨影音看到此格式。小鴨影音的說明,在瀏覽器上觀看此影片,需要有 flash 的支援。若瀏覽器不支援 flash,只會出現串流的網址。

ffmpeg -i http://n.bwzybf.com/20171126/qtPkXl6h/index.m3u8 -c copy Kingsman2.mkv

使用上述指令,能夠在下載的同時,即可觀看,慢個十分鐘看,就比在瀏覽器上看還順。
曾碰到的問題是,下載到一半,就停了,重新下載,又沒辦法指定開始時間,必須重頭開始。這問題,也許能找到解決方法吧。

另外,使用 VLC 播放器,也可以將影片 [轉換/儲存],但是必須在儲存後,才能觀看,比較麻煩。

假如你使用 Linux 的話,也懂 PHP 的話,請參考這作法 d93921012/Download-HLS-Files,在中斷之後,可以重新下載,比較方便。

並且,在下載的同時,將已下載的檔串起來i成一個大的 ts 檔,因此可以邊下載邊看。我在 Linux 下,是以 mpv 來觀看,算蠻方便的。

併行下載

有時候伺服器反應很慢,久久才下載一個 segment,使用 PHP 的 curl_multi_func 功能,改進程式,可以同時下載 5 個 segment。當然,只要修改變數值,即可更多個 thread 同時下載。

另外,在 curl 的連線參數加上 keep-alive,不關閉 connection,可以進一步提升下載速度。

原本一次下載一個 ts 檔案,有些網站反應較慢,會來不及即時觀看。經過改進後,短短 10 幾分鐘就可以下載完一個檔案,可以很舒服的觀看。

檔案簡要說明

從小鴨影音找到影片的連結,長得像這樣
http://youku163.zuida-bofang.com/20180505/4747_5bd4685f/index.m3u8

用 mpv 或 vlc 程式可以直接播放。用 curl 取得的內容如下
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608
800k/hls/index.m3u8

這代表它只有一個解析度的影片,自己組合新的 url 如下
http://youku163.zuida-bofang.com/20180505/4747_5bd4685f/800k/hls/index.m3u8

用 curl 取得的內容
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.170000,
9aaa1ce7281000.ts
#EXTINF:4.170000,
9aaa1ce7281001.ts
 ....
#EXTINF:4.128300,
9aaa1ce72812015.ts
#EXTINF:4.170000,
9aaa1ce72812016.ts
#EXTINF:2.126700,
9aaa1ce72812017.ts
#EXT-X-ENDLIST

每一段影片的 url 長得這樣下
http://youku163.zuida-bofang.com/20180505/4747_5bd4685f/800k/hls/9aaa1ce7281001.ts


把這些資料一段一段接回去,就成為完整的影音檔了。



2018年1月1日 星期一

PhpStorm 的 OpenGL 支援


參考
OpenGL Pipeline in Oracle Solaris, Linux and Windows
improving_text_antialiasing_and_gui_performance_in_intellij_idea_on_openjdk_8.md

Minimum Requirements

The OpenGL pipeline will not be enabled if the hardware or drivers do not meet the minimum requirements. If for some reason one of the following requirements is not met, Java 2D will fall back and use the default pipeline (X11 on Oracle Solaris/Linux, GDI/DirectDraw on Windows), which means your application will continue to work correctly, but without the OpenGL acceleration.

The minimum requirements for Oracle Solaris and Linux operating systems are the following:


  •     Hardware accelerated OpenGL/GLX libraries installed and configured properly
  •     OpenGL version 1.2 or higher
  •     GLX version 1.3 or higher
  •     At least one TrueColor visual with an available depth buffer
設定檔 /opt/phpstorm/bin/phpstorm64.vmoptions 加上
-Dsun.java2d.opengl=True

或者在  $IDEA_HOME/bin/idea.properties,加上
##---------------------------------------------------------------------
## Enable the OpenGL-based pipeline, which provides hardware acceleration.
##---------------------------------------------------------------------
sun.java2d.opengl=true


注意: 每次更新後,此設定會被覆蓋,需重新加入此設定

設定 debug level
$ export J2D_TRACE_LEVEL=4
$ phpstorm
[I] GLXGC_FindBestVisual: scn=0
[I] GLXGC_InitGLX
[I] OGLFuncs_OpenLibrary
[I] OGLFuncs_InitPlatformFuncs
[I] OGLFuncs_InitBaseFuncs
[I] OGLFuncs_InitExtFuncs
[I] GLXGC_InitGLX: client GLX version=1.4
[I] GLXGC_InitFBConfig: scn=0 vis=0x0
[V]   candidate fbconfigs:
[V]     id=0x29 db=0 alpha=0 depth=24 stencil=0 valid=true
[V]     id=0xbf db=0 alpha=0 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x74 db=0 alpha=0 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x25 db=0 alpha=0 depth=24 stencil=8 valid=false (large depth)
[V]     id=0xbb db=0 alpha=0 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x70 db=0 alpha=0 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x27 db=1 alpha=0 depth=24 stencil=0 valid=false (large depth)
[V]     id=0xbd db=1 alpha=0 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x72 db=1 alpha=0 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x21 db=1 alpha=0 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x23 db=1 alpha=0 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x22 db=1 alpha=0 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x2a db=0 alpha=8 depth=24 stencil=0 valid=false (large depth)
[V]     id=0xc0 db=0 alpha=8 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x75 db=0 alpha=8 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x26 db=0 alpha=8 depth=24 stencil=8 valid=false (large depth)
[V]     id=0xbc db=0 alpha=8 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x71 db=0 alpha=8 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x28 db=1 alpha=8 depth=24 stencil=0 valid=false (large depth)
[V]     id=0xbe db=1 alpha=8 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x73 db=1 alpha=8 depth=24 stencil=0 valid=false (large depth)
[V]     id=0x24 db=1 alpha=8 depth=24 stencil=8 valid=false (large depth)
[V]     id=0xba db=1 alpha=8 depth=24 stencil=8 valid=false (large depth)
[V]     id=0x6f db=1 alpha=8 depth=24 stencil=8 valid=false (large depth)
[I] GLXGC_FindBestVisual: chose 0x29 as the best visual for screen 0
INFO: The version of libXrender.so is detected as 0.910
[I] GLXGraphicsConfig_getGLXConfigInfo
[I] GLXGC_InitFBConfig: scn=0 vis=0x29
[V]   candidate fbconfigs:
[V]     id=0x29 db=0 alpha=0 depth=24 stencil=0 valid=true
[E] GLXGraphicsConfig_getGLXConfigInfo: could not create shared context
Could not enable OpenGL pipeline for default config on screen 0
XRender pipeline enabled
Error parsing gtk-icon-sizes string: ''
Xrender: INFO: Jules library not installed.

測試,安裝 example
$ java -Dsun.java2d.opengl=True -jar /opt/oracle-jdk-bin-1.8.0.152/demo/jfc/Java2D/Java2Demo.jar

加入 video 的 group 之後。
[I] GLXGC_FindBestVisual: chose 0x29 as the best visual for screen 0
INFO: The version of libXrender.so is detected as 0.910
[I] GLXGraphicsConfig_getGLXConfigInfo
[I] GLXGC_InitFBConfig: scn=0 vis=0x29
[V]   candidate fbconfigs:
[V]     id=0x29 db=0 alpha=0 depth=24 stencil=0 valid=true
[I] OGLContext_IsExtensionAvailable: GL_ARB_fragment_shader=true
[I] OGLContext_IsExtensionAvailable: GL_ARB_multitexture=true
[I] OGLContext_IsExtensionAvailable: GL_ARB_texture_non_power_of_two=true
[I] OGLContext_IsExtensionAvailable: GL_ARB_texture_rectangle=true
[I] OGLContext_IsExtensionAvailable: GL_EXT_framebuffer_object=true
[I] OGLContext_IsExtensionAvailable: GL_ARB_depth_texture=true
[I] OGLContext_IsFBObjectExtensionAvailable: fbobject supported
[I] OGLContext_IsLCDShaderSupportAvailable: LCD text shader supported
[I] OGLContext_IsBIOpShaderSupportAvailable: BufferedImageOp shader supported
[I] OGLContext_IsGradShaderSupportAvailable: Linear/RadialGradientPaint shader supported
[I] OGLContext_IsExtensionAvailable: GL_NV_fragment_program=true
[I] OGLContext_IsExtensionAvailable: GL_NV_fragment_program2=true
[I] OGLContext_IsExtensionAvailable: GL_NV_texture_barrier=true
[I] GLXGraphicsConfig_getGLXConfigInfo: OpenGL version=4.6.0 NVIDIA 387.22
OpenGL pipeline enabled for default config on screen 0
Error parsing gtk-icon-sizes string: ''


$ glxgears
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  153 (GLX)
  Minor opcode of failed request:  3 (X_GLXCreateContext)
  Value in failed request:  0x0
  Serial number of failed request:  31
  Current serial number in output stream:  32

$ su ajax
密碼:
ajax@localhost ~ $ glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
303 frames in 5.0 seconds = 60.479 FPS

不曉得是否電腦太強了,不論 OpenGL 是否 enable,捲動文字時,並無明顯差別。

另外,
-Dawt.useSystemAAFontSettings=lcd
改成
-Dawt.useSystemAAFontSettings=on


網誌存檔