tag:blogger.com,1999:blog-33156323598572318582024-03-06T05:40:32.961+08:00昨日東風Do the right things.Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.comBlogger230125tag:blogger.com,1999:blog-3315632359857231858.post-55354848239569117652022-04-15T17:22:00.000+08:002022-04-15T17:22:37.799+08:00尋找DS Audio的替代方案<p>家裡有Synology NAS的人,可能都用過DS Audio(手機APP)與<a href="https://www.synology.com/zh-tw/dsm/feature/audio_station">Audio Station</a>(Server),用來播放音樂算是還可以用,但這麼多年都沒什麼改進,缺乏一鍵加到最愛的功能,網頁跟手機APP把音樂加到播放清單的功能也不好用,給音樂評分的功能看起來也沒什麼用處。尋找替代方案,大多都會提到Plex Media Server,可是這個軟體太過臃腫(bloated),不符合我的需求。除此之外就是各種相容Subsonic的方案。</p><p>Server部份,目前使用<a href="https://www.navidrome.org/">NAVIDROME</a>,運作起來相當輕量且迅速,網頁界面也比較現代化。安裝方式使用Docker,說明文件建議不要用root啟動程式這點就要特別注意設定檔貯存位置與音樂檔案儲存位置的存取權限,否則程式會無法啟動或存取音樂檔案。</p><p>Android手機APP部份先測試了<a href="https://substreamerapp.com/">substreamer</a>,看起來很漂亮但是ui會因為io存取卡住,使用體驗打折扣。除此之外還試了<a href="https://github.com/ultrasonic/ultrasonic#readme">Ultrasonic</a>與<a href="https://github.com/austinried/subtracks#readme">Subtracks</a>,都相當順暢,不過在Play Store的安裝量很少,比不上substreamer。這三個App都有一鍵加到最愛與下載離線收聽的功能,基本上符合我的需求。不過從界面上來看,substreamer跟Subtracks比較符合我的喜好(跟Spotify很相似),應該會優先使用Subtracks。</p>Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-6172516312907603722022-01-01T19:12:00.006+08:002022-01-03T09:09:56.864+08:00Sonoff Basic R2 1.3刷Tasmota<p>從網拍上買兩個Sonoff Basic R2,想要接臥室的嵌燈。使用ESPhome透過網頁界面把韌體刷入後,接上電源發現沒動作,LED也不會亮,改用Tasmota用網頁界面刷韌體也是同樣的情況。</p><p>之後在網路上搜尋<a href="https://www.rigacci.org/wiki/doku.php/doc/appunti/hardware/sonoff_basic?utm_source=pocket_mylist">找到有人使用同樣硬體版本的R2</a>刷入韌體可以使用,他是用esptool這個指令界面工具去刷,參數部份特別指定刷入模式使用<a href="https://docs.espressif.com/projects/esptool/en/latest/esp32/advanced-topics/spi-flash-modes.html#spi-flash-modes">dout (Dual Output)</a>,我也用同樣的指令刷入後就可以正常運作了。</p>Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-29464161108394443522021-08-23T11:01:00.001+08:002021-08-23T11:01:31.590+08:00讓Win10在連入Samba 4 Server時,會出現登入身份驗證畫面<p>這次的情況是使用者用Windows 10去連安裝在Ubuntu 20.04上頭Samba 4,不會出現身份驗證畫面,這樣就無法使用Samba分享的家目錄。如果是換成Windows 7以前的版本則會。</p><p>在網路上搜尋許久,最終找到這個問題的解答。</p><p>Ubuntu版本的Samba設定檔,預設會把map to guest指定為Bad User,只要改成never或註解這行,就會強制驗證使用者。<br /></p>Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-9164082309060592732020-01-27T01:09:00.000+08:002020-01-27T01:09:14.941+08:00解決使用IPv6時,無法連上isthereanydeal.com的問題(EdgeRouter X)使用環境:中華電信光世代100M/40M,使用Ubnt EdgeRouter X(ER-X)設置IPv6 Dual Stack<br />
症狀:<a href="https://isthereanydeal.com/">isthereanydeal.com</a>可以正確解析到正確的v6 IP,Ping也沒有問題,但是用瀏覽器開啟總是會顯示連線失敗,查Google得到<a href="https://www.reddit.com/r/Ubiquiti/comments/9mcsbt/edgerouter_lite_mtumss_clamping_issue_im_at_my/">以下結果</a>。<br />
<br />
建議使用SSH登入ER-X,然後修改防火牆設定<br />
<blockquote class="tr_bq">
admin@er-x:~$ configure<br />[edit]<br />admin@er-x# set firewall options mss-clamp6 mss 1432<br />[edit]<br />admin@er-x# commit<br />[edit]<br />admin@er-x# save<br />Saving configuration to '/config/config.boot'...<br />Done<br />[edit]</blockquote>
<br />
以上設定僅適用家用型光世代,如果是固定制光世代,可能會有不同的mss值。<br />
<br />
參考來源:<br />
<a href="https://community.ui.com/questions/IPv6-mss-clamp6-setting-optimization/dfa1b7e1-e92e-4ab9-902f-580725d2e653">https://community.ui.com/questions/IPv6-mss-clamp6-setting-optimization/dfa1b7e1-e92e-4ab9-902f-580725d2e653</a><br />
<a href="https://community.ui.com/questions/BUG-REPORT-Mss-clamping-creates-buggy-IPtables-rules/f373f88f-ff35-4984-b879-63f114f2b6ad">https://community.ui.com/questions/BUG-REPORT-Mss-clamping-creates-buggy-IPtables-rules/f373f88f-ff35-4984-b879-63f114f2b6ad</a>Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-86998301640163658722019-11-13T10:32:00.002+08:002019-11-13T10:40:06.985+08:00如何在Django正確使用ManifestStaticFilesStorage這個功能<br />
假設Django專案目錄在/home/myproj。在settings.py要設定<br />
<blockquote class="tr_bq">
# 靜態檔案對應的URL<br />
STATIC_URL = '/static/'<br />
# 靜態檔案放置的位置,這裡就等於/home/myproj/static<br />
STATIC_ROOT = os.path.join(BASE_DIR, 'static')<br />
# 放置其他靜態檔案的路徑,把css/js等檔案放在這,以下的設置等於/home/myproj/staticfile<br />
STATICFILES_DIRS = (<br />
os.path.join(BASE_DIR, "staticfile"),<br />
)<br />
# 使用ManifestStaticFilesStorage作為靜態檔案處理方式<br />
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'</blockquote>
<br />
在正式運行的伺服器執行<br />
<blockquote class="tr_bq">
./manage.py collectstatic -v 3</blockquote>
會看到css跟js等檔案都複製到static目錄,並產生附加hash值的檔案。<br />
<blockquote class="tr_bq">
...<br />
Post-processed 'css/bootstrap.min.css' as 'css/bootstrap.min.a15c2ac3234a.css'<br />
...</blockquote>
每次更動這些檔案後都要執行collectstatic,否則會出錯。 <br />
<br />
在基礎樣板<a href="https://docs.djangoproject.com/en/2.2/intro/tutorial06/">載入靜態檔案</a>要使用{% load static %}與{% static 'css/bootstrap.min.css' %}來載入靜態檔案。<br />
<br />在Nginx關於靜態檔案目錄的設置 <br />
<blockquote class="tr_bq">
...<br />
location /static {<br />
alias /home/myproj/static;<br />
}<br />
...</blockquote>
<br />
如果把css/js等檔案放在STATIC_ROOT裡頭,那麼執行collectstatic就不會產生附加hash值的檔案,瀏覽網站就會跳出500錯誤。錯誤Log會有ValueError: Missing staticfiles manifest entry for .... 的訊息。 <br />
<br />Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-42845594670000142572019-08-19T14:59:00.000+08:002019-08-19T15:00:13.152+08:00使用pytz為datetime物件加上時區的注意事項使用Python的datetime產生的物件是不會包含時區資訊的,在網路上搜尋加上時區的方式,一般都是建議用pytz,大概類似以下的作法。<br />
<blockquote class="tr_bq">
import datetime<br />
import pytz<br />
<br />
mytz = pytz.timezone('Asia/Taipei')<br />
mytime = datetime.datetime.now().replace(tzinfo=mytz)<br />
<br />
print(mytime)</blockquote>
2019-08-19 14:56:50.450396+08:06<br />
結果的確會顯示時區,不過好像哪裡怪怪的?台北所在的時區應該是+08:00,怎麼會變成+08:06,多加了六分鐘?<br />
<br />
<a href="http://pytz.sourceforge.net/">pytz的文件</a>在開頭有提到,因為與Python內建的tzinfo API有實做上的差異,如果要顯示當地的時區,需使用localize()這個方法,範例如下。<br />
<blockquote class="tr_bq">
import datetime<br />
import pytz<br />
<br />
mytz = pytz.timezone('Asia/Taipei')<br />
mytime = mytz.localize(datetime.datetime.now())<br />
<br />
print(mytime)</blockquote>
<br />
2019-08-19 14:56:50.450396+08:00<br />
這樣就會顯示正確的時區。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-39652929221609444192019-05-21T17:09:00.002+08:002019-05-21T17:09:58.626+08:00在Linux使用Ricoh多功能事務機,無法輸入使用者代碼的問題<b>使用環境</b><br />
Kubuntu 18.04<br />
Ricoh Aficio MP C3300<br />
<br />
<b>使用情境</b><br />
印表機有設定使用者代碼來統計各部門的使用量,並限制彩色列印功能。<br />
<br />
在Windows的印表機設定很容易設定使用者代碼,在Linux上頭並不是…好吧,現在可以看到設定選項,但是會發現怎麼設定都沒有效果,永遠都會選擇預設的選項,而且沒辦法改變預設的代碼。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaVBpEtsuT_oZWZLdoE440KxBfRhze2WAYM_Ii0iw4rySBIkjRSpHmbQrYHE3FG5apBQBPJIi7S9aBV-d_Kvp1TVzuxkmog_AWf4_JCEZImynuCkCSAgzsoSZBTRHTovemuXfOVsBgsaU/s1600/Screenshot_20190521_165220.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="772" data-original-width="889" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaVBpEtsuT_oZWZLdoE440KxBfRhze2WAYM_Ii0iw4rySBIkjRSpHmbQrYHE3FG5apBQBPJIi7S9aBV-d_Kvp1TVzuxkmog_AWf4_JCEZImynuCkCSAgzsoSZBTRHTovemuXfOVsBgsaU/s320/Screenshot_20190521_165220.png" width="320" /></a></div>
搜尋網路找到<a href="https://my-random-solutions.blogspot.com/2013/08/how-to-set-default-user-code-using-linux.html">這一篇</a>,但是沒有效果。這篇文章裡頭有提到OpenPrinting網站的<a href="https://wiki.linuxfoundation.org/openprinting/database/ricohfaq#What_are_UserCodes.3F_How_do_I_use_UserCodes_under_Linux.3F">FAQ</a>,可是裡頭的說明不是很清楚。 <br />
<br />
我最後解決的方式是從OpenPrinting網站下載PPD檔案修改,以<a href="https://www.openprinting.org/printer/Ricoh/Ricoh-Aficio_MP_C3300">C3300為例</a>,網站上提供三種版本分別是PDF、Postscript、pxlcolor,PDF的版本按下列印就會被取消,我是用Postsciprt版本。<br />
<br />
要修改以下兩行<br />
<blockquote class="tr_bq">
*DefaultUserCode: <span style="color: red;"><b>None</b></span><br />*UserCode <span style="color: red;"><b>1001/1001</b></span>: "/usrcode(<span style="color: red;"><b>1001</b></span>)def\n"</blockquote>
修改上面三個紅色的部份,填入正確的使用者代碼(這邊是用1011為例子)<br />
<blockquote class="tr_bq">
*DefaultUserCode: 1011<br />*UserCode 1011/1011: "/usrcode(1011)def\n"</blockquote>
結果如下圖 <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaQXyIGVrhDZJtTiCfwDAH7wzaCNFcCqw4QwSeKOZt0RZnfrIUS2IhiOLyxIr5hkdOLXefAH-GaQw4f70xVcghi_wWeBt8BlWCE9KkXjzqbaU2PVck2Gm8eZdWIGWalo0AADc1escpl9I/s1600/Screenshot_20190521_170136.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="611" data-original-width="770" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaQXyIGVrhDZJtTiCfwDAH7wzaCNFcCqw4QwSeKOZt0RZnfrIUS2IhiOLyxIr5hkdOLXefAH-GaQw4f70xVcghi_wWeBt8BlWCE9KkXjzqbaU2PVck2Gm8eZdWIGWalo0AADc1escpl9I/s320/Screenshot_20190521_170136.png" width="320" /></a></div>
存檔,然後安裝印表機,要選擇用這個檔案安裝。安裝完成後進入設定選項應該會如同第一張圖,紙張大小與列印顏色也要改成正確的設定,不然還是無法列印。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-28954100311118425562019-01-18T10:50:00.001+08:002019-01-18T10:50:37.279+08:00Linux桌面多使用者登入,類似LTSP的作法 rev.2<a href="https://blog.pastwind.org/2018/10/linuxltsp.html">上一篇</a>是古早時代的作法,lightdm早就內建支援VNC,中間不需要透過XDMCP,這樣穩定性也比較好,而且還是支援多使用者。<br />
<br />
作法:<br />
<ol>
<li>安裝tigervnc-standalone-server</li>
<li>編輯/etc/lightdm/lightdm.conf,加上<br />[VNCServer]<br />enabled=true<br />command=Xvnc -SecurityTypes None<br />port=5900<br />listen-address=0.0.0.0<br />width=1024<br />height=768<br />depth=24<br />SecurityTypes設定None代表不使用VNC的內建驗證方式與加密,但是在lightdm還是要輸入帳號密碼登入。<a href="https://www.suse.com/zh-tw/documentation/sled-12/book_sle_admin/data/vnc_encrypted.html">參數的詳細說明</a>。</li>
<li>(可選)把SecurityTypes改成TLSNone使用連線加密,或者使用SSH或VPN提昇安全性</li>
<li>重新啟動lightdm</li>
<li>使用vncviewer連入 </li>
</ol>
Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-13901194716883839152018-12-04T10:23:00.001+08:002018-12-04T10:23:14.897+08:00試用WireGuard我只用過IPSEC與OpenVPN,其他的沒用過,所以不確定其他VPN軟體的架構與設計理念如何,不過<a href="https://www.wireguard.com/">WireGuard</a>與前兩者相比的確有明顯的差異。<br />
<br />
在Linux上頭的WireGuard是核心模組加上用戶端工具軟體,核心模組包含網路卡界面與整個VPN功能實做,用戶端工具是設置VPN與檢視狀態用。IPSEC或OpenVPN在運作時都需要在背景運行必要程式,WireGuard不需要。不過<a href="https://www.wireguard.com/xplatform/">在非Linux平台</a>,還是需要執行背景程式。<br />
<br />
使用者管理也和其他VPN實做不同,是使用非對稱金鑰,伺服器與用戶端都需要產生非對稱金鑰並交換公鑰,如果要解除某個用戶的權限,只需要從設定檔把對應的設定刪除。其他實做使用<a href="https://zh.wikipedia.org/zh-tw/%E8%AF%81%E4%B9%A6%E9%A2%81%E5%8F%91%E6%9C%BA%E6%9E%84">CA</a>產生使用者的公鑰,要解除用戶權限需要撤除(revoke)對應的金鑰,不直覺也不方便。<br />
<br />
性能部份因為沒有做測試所以不評論,不過WireGuard網站上的<a href="https://www.wireguard.com/performance/">測試結果</a>都顯示更高的Throughput與更低的延遲。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-1236706592364054362018-10-30T12:10:00.001+08:002018-10-30T13:12:59.445+08:00Linux桌面多使用者登入,類似LTSP的作法LTSP就是Linux版本的Terminal Server,可以讓多個使用者共用一台伺服器的資源去使用桌面環境,但是Client端OS必須也要是Linux是缺點。<br />
<br />
之後找的方案是在Ubuntu Mate 18.04中啟用LightDM的XDMCP功能,在Linux上使用Xephyr連線非常順暢,但是在Windows上試了好多種軟體(包含Xming),都會出現畫面顯示異常或卡住,程式啟動當掉的問題,只能放棄。<br />
<br />
再來則是XDMCP + VNC,網路上許多文章都會提到這個替代方案,我參考<a href="https://417cybersec.org/content/multi-user-x-server-using-ssh-lightdm-xdmcp-and-vnc">這一篇</a>做設定,但是不透過SSH連線。設定完成,連上去看起來都沒什麼問題,直到我發現fctix的選字框無法顯示。 Orz<br />
<br />
根據Ubuntu社群WIKI關於<a href="https://help.ubuntu.com/community/VNC/Servers#TigerVNC">VNC Server</a>的文章,其中提到只有TigerVNC支援compositing window managers像是Gnome Shell,原本我安裝的是vnc4server,換成tigervnc-standalone-server問題就解決了。而且換成TighterVNC Server還有個好處,Client也使用TigerVNC的話,就支援動態變更桌面尺寸,變更TigerVNC Viewer視窗的尺寸就會連帶變更Linux桌面的尺寸。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-12554749995810729842018-10-03T10:29:00.000+08:002018-10-03T10:29:11.267+08:00Supermicro的IPMI Virtual CD-ROM功能最近要把某些機器重裝OS,要使用IPMI提供的虛擬光碟機,沒想到沒辦法把映像檔掛載上去。<br />
<br />
把SAMBA Server的log debug功能開啟,出現 NTLMv1 passwords NOT PERMITTED for user 這個訊息。經查詢後發現,SAMBA較新的版本(4.5.10以後?)預設關閉NTMLv1驗證方式,這是因為這個驗證方式不安全。<br />
<br />
解決的方式很簡單,只要在SAMBA設定檔的 global 區塊加上 ntlm auth = yes 這個設定即可。不過之前有說到這個驗證方式不安全,如果要使用要多注意。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-37040584787085049762018-07-09T11:58:00.000+08:002018-07-09T14:15:42.580+08:00SSL憑證購買在<a href="https://www.gandi.net/zh-hant">管地</a>購買進階型SSL憑證碰到一些問題,根據<a href="http://wiki.gandi.net/zh-tw/ssl/documents/pro">該網站wiki</a>的資料:<br />
<ol>
<li>需要公司登記證明與公司代表人的身份證明<br />這個沒什麼問題,但是我碰到的情況是Gandi的每個帳號下面可以建立組織,組織名稱必須與公司登記證明的名稱相符,我當初填寫公司資料是用英文,客服來信要求提供與中文名稱相符的相關證明。</li>
<li>要進行電話驗證<br />在台灣的電話驗證是透過<a href="https://www.dnb.com.tw/">鄧白氏</a>(Dun&Bradstreet)電話資料庫,<strike>但是我沒法確定我們公司的資料有登錄在他們的資料庫中</strike>肯定沒有登錄,鄧白氏企業認證D&B D-U-N-S® Registered ™服務基本版費用16800,有效期一年,每年都需要重新認證。</li>
</ol>
因此我取消訂單,應該會跟<a href="https://www.twca.com.tw/Portal/Portal.aspx">TWCA</a>詢價與採購吧。<strike>不過價錢真的差蠻多的,管地的兩年期進階版單一網域SSL憑證包含25萬美元擔保的價格是3490,台灣任何一家SSL CA的價格都超過10000。</strike>把鄧白氏企業認證的費用加進去之後,台灣本地業者還比較便宜?Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-31624368169141521422018-06-07T10:16:00.001+08:002018-06-07T10:16:52.078+08:004G連線裝置的遠端管理最近碰到一個情況是需要在特定地點放置網路設備,上面建置的服務需要連外,但又無法連接有線網路,看起來比較簡單而且立即可用的方案就是租用4G網路。<br />
<br />
上網的問題解決了,但是又冒出其他問題。因為IPv4的IP可用數量不足的關係,4G網路大多是採用<a href="https://en.wikipedia.org/wiki/Carrier-grade_NAT">Carrier-grade NAT</a>的技術去解決IP不足的問題,但這也代表著無法在遠端主動連入這個4G連網裝置進行管理。<br />
<br />
為了解決遠端管理的問題,我最後想到使用SSH Tunnel,讓這些裝置主動開啟<a href="https://www.howtoforge.com/reverse-ssh-tunneling">逆向SSH Tunnel</a>連線到我的主控端伺服器,那我就可以從主控端伺服器連入這些設備進行管理。 <br />
<br />
不過之後發現SSH Tunnel建立一段時間之後就會沒有回應,看起來應該是4G不穩定,連線已經中斷,但是主控端的ssh server沒有把連線關閉。因此我在<a href="http://go2linux.garron.me/linux/2011/02/limit-idle-ssh-sessions-time-avoid-unattended-ones-clientaliveinterval-clientalivecoun/">ssh server加上keep alive的設置</a>,每30秒會發送封包給client進行檢查,如果連續三次都無回應就會關閉連線。設置此設定後連線都正常。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-68548033354220248852018-04-03T15:12:00.000+08:002018-04-10T09:45:28.564+08:00VSFTPD的安全性設定<br />
更新:為了符合PCI DSS的要求,通訊協定只能支援TLS 1.2以上版本,須把ssl_ciphers設定為TLSv1.2,<a href="https://serverfault.com/a/833054/91299">參考來源</a>。 <br />
<br />
<br />
<br />
這年頭還會用FTP服務就是為了滿足B to B的需求吧…。<br />
<br />
<br />
chroot_local_user=YES<br />
#把使用者關在自己的家目錄<br />
rsa_cert_file=/etc/ssl/private/vsftpd.pem<br />
rsa_private_key_file=/etc/ssl/private/vsftpd.pem<br />
#ssl金鑰一般用自我產生的就好了,長度至少要在2048bit以上<br />
ssl_enable=YES<br />
#啟用FTP over TLS/SSL<br />
ssl_ciphers=HIGH<br />
#加密演算法使用HIGH,演算法是128位元以上的都會使用,這裡也可以自訂想要使用的加密演算法。<br />
implicit_ssl=YES<br />
#預設值是NO,使用FTPES,啟用此選項會改成FTPS<br />
pasv_min_port=30000<br />
pasv_max_port=31000<br />
#明確指定pasv模式使用的port範圍,比較容易設定防火牆<br />
<br />
強制開啟FTP over TLS/SSL後,有時會很難做troubleshooting,建議可以先關掉,然後就會出現<span style="color: red;"><b>明確的</b></span>錯誤訊息。<br />
<br />
啟用chroot_local_user後用Filezilla去連,會出現ssl交握錯誤這種不明確的訊息,但是把ssl模式關閉後,就會出現500 OOPS: vsftpd: refusing to run with writable root inside chroot()這樣的訊息。<br />
<br />
關於500 OOPS: vsftpd: refusing to run with writable root inside chroot()這個錯誤,網路上大多數的解法都是在設定檔加上<code>allow_writeable_chroot=YES</code>這個設定,但是這個作法有<a href="https://serverfault.com/questions/743949/vsftp-why-is-allow-writeable-chroot-yes-a-bad-idea">潛在安全性問題</a>,所以後面的版本就把這個設定拿掉,在manpage裡頭也看不到此設定選項的說明。(經實測Debian 9的vsftpd有此選項,但是manpage裡頭一樣看不到)正確的作法是把使用者家目錄的寫入權限拿掉,在新增使用者後在使用者的家目錄中設置一個上傳專用的目錄。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-88478533939451297132018-01-12T14:27:00.001+08:002018-01-12T14:27:27.657+08:00使用Redis之後碰到的一些地雷雷雷...(Orz最近開始嘗試使用Redis Sentinel建置高可用性服務,在測試的時候碰到一些問題。我在一個由三個Redis實體組成的Master-Slave Cluster倒入約4GB的資料,然後在Master下KEYS *把所有鍵列出來,沒過幾秒在Sentinel出現Master down然後重新推舉Master的訊息。<br />
<br />
我在Sentinel裡頭設定Master在5秒內無回應就會判定為down,那也就是說我做了列出所有鍵的操作阻擋了後續所有連線的作業,這是怎麼回事?<br />
<br />
回想一下Redis的特性,大概是:<br />
<ul>
<li><span style="color: red;"><b>單執行緒、單行程</b></span></li>
<li><span style="color: red;"><b>所有操作是以atomic方式進行,因此確保了資料的一致性</b></span></li>
<li>雖然運作時資料是存放於記憶體中,但是可回存為檔案,確保資料的持久性</li>
<li>因為資料是存放於記憶體,所以速度很快</li>
</ul>
Redis不像一般的RDBMS有實做Transaction Isolation,<span style="color: red;"><b>任何操作都要等到前一個操作執行完才會進行,無法平行處理</b></span>,Redis才能保證資料的一致性。因此非常不適合使用Redis進行以下操作:<br />
<ul>
<li>列出所有鍵:KEYS *<br />如果存入的鍵很多,就得花很多時間處理。以我測試的情況,4GB的資料有將近1500萬個鍵,列出操作就花了183秒。</li>
<li>搜尋特定鍵:KEYS *name*<br />跟前一個是同樣的情況,列出了154個卻花了9秒多來處理。</li>
</ul>
我本職是系統管理者不是程式開發人員,所以有可能有其他的情況不適合使用Redis。如果要更有效率的使用Redis,那就盡量不要使用KEYS指令來列出或搜尋鍵。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-84997225292541339952017-12-13T18:04:00.002+08:002017-12-13T18:04:56.914+08:00GCE的TCP Health Check不支援換行符號我打算在Google Compute Engine上建置Redis Slave個體群組,並使用GCP的負載平衡服務來連接,但是碰到一個問題,Health Check永遠都是失敗,導致個體群組裡頭的VM一直被重建。<br />
<br />
檢查了許多地方,確認Health Check的IP可以連進VM,從netstat -an也可以看到連線。使用nc -l -p 6379的確也能看到Health Check送進來的要求字串 PING\r\n,但是透過redis-cli下monitor指令卻沒看到。<br />
<br />
我在Health Check設置的要求字串是 PING\r\n,檢查字串是 +PONG,用nc的確是看到傳進來的是PING\r\n....等等,換行字元應該不會顯示?然後又用PYTHON參考別人寫的範例做了一個TCP SOCKET SERVER,結果顯示出來的是 PING\\r\\n...... Orz。redis一定要接收到換行符號才算接收到指令,否則就會停在那裡。看起來GCE的Health Check會過濾特殊符號。<br />
<br />
Google Groups上的GCE論壇也有人有相同的問題,Google的人回答都指向stackoverflow上的某個連結: <br />
<a href="https://stackoverflow.com/questions/43228878/health-check-to-detect-redis-master-from-google-tcp-load-balancer">https://stackoverflow.com/questions/43228878/health-check-to-detect-redis-master-from-google-tcp-load-balancer </a><br />
下面回答得很長,其實結論是在同一台VM裡頭去跑另一隻程式來處理Health Check請求與回傳結果,我最後是用PYTHON寫了一個TCP SOCKET SERVER,當Health Check傳入PING,就使用subprocess去跑redis-cli PING,然後把結果回傳。<br />
<br />
<br />Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-16752853274422748202017-12-11T17:27:00.000+08:002017-12-11T17:27:02.246+08:00在mora.jp買音樂最近在玩人中之龍 極2的酒店經營部份,在編輯酒店小姐的裝扮時,總是會播放歌曲『As You Like』,還蠻好聽的。這首歌曲有收錄在 <a href="http://mora.jp/package/43000033/A39879/">人中之龍 零 OST Side A </a>裡,查了一下只能買CD或者數位檔案,像KKBOX跟Spotify都沒有提供。整張專輯(Side A)要1500日圓,可是我只對這首歌有興趣,搜尋一下發現mora.jp有在賣單一曲目,便想試看看購買,果然一按下結帳就出現不開放日本以外購買的警告。<br />
<br />
不過最後我還是購買成功了,我使用了以下的步驟:<br />
<ol>
<li>把瀏覽器的語言改成日文優先(這個可能不需要)</li>
<li>使用日本的IP進入mora.jp(VPN)</li>
<li>付款方式使用Amazon Pay(需要有日本Amazon帳號)</li>
</ol>
我就是這樣購買並成功下載,其他的支付方式都需要日本當地的地址,不太可能成功。Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-85308036376036838852017-11-11T15:04:00.000+08:002017-11-11T15:05:12.789+08:00UAP接在MikroTik RB750Gr3後無法透過DHCP獲得IP的問題最近借到一台RB750Gr3,想要取代我原本使用的ASUS RTN-56U。我的無線網路是使用UniFi UAP AC Lite。把RB750設置好之後,把UAP接上去卻發現手機平板都無法連接上,UniFi Controller也顯示adoption failed,而UAP的IP也跟DHCP設置的網段不同。<br />
<br />
花了些時間搜尋資訊,發現三月就有人碰到同樣的問題,解法是在RouterOS的橋接設定,把STP改成none。<br />
<a href="https://forum.mikrotik.com/viewtopic.php?t=116963&start=50">https://forum.mikrotik.com/viewtopic.php?t=116963&start=50</a> Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-31858916411082462952017-10-30T11:58:00.002+08:002017-10-30T11:58:36.893+08:00說好的ZeroCat原始碼<a href="https://bitbucket.org/ryanho/zerocat">https://bitbucket.org/ryanho/zerocat</a>Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-35391285027526572312017-10-26T12:49:00.001+08:002017-10-26T15:16:06.737+08:00ZeroCat用Django寫的仿雙葉系統的貼圖討論板,程式碼預計會在近日內公開。<br />
Demo: <a href="https://zerocat.pastwind.org/">https://zerocat.pastwind.org/</a> <br />
<br />
系統設置:<br />
<ul>
<li>Ubuntu 16.04.2 @ Linode</li>
<li>NGINX</li>
<li>uwsgi </li>
<li>virtualenvwrapper</li>
<li>Python 3</li>
<li>Django</li>
<li>Bootstrap 4 </li>
<li>Sqlite</li>
</ul>
目前的功能:<br />
<ul>
<li>貼文者識別</li>
<li>張貼文章</li>
<li>張貼回覆</li>
<li>刪除文章與回覆</li>
<li>灌水限制</li>
<li>上傳檔案大小限制</li>
</ul>
預計未來會實做的功能:<br />
<ul>
<li>依照設定的空間限制,自動刪除較舊的文章與圖檔</li>
<li>reCaptcha</li>
<li>...還沒想到 </li>
</ul>
Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-7417276271862327912017-10-05T15:10:00.002+08:002017-10-06T09:19:51.182+08:00ssh登入緩慢的問題放個假回來系統又怪怪的... Orz<br />
<br />
今天一進公司就發現要使用SSH連到伺服器變得很緩慢,要等很久才會顯示登入提示,輸入密碼後又要等很久才會到登入後的畫面,比較嚴重的情況還會出現連線逾時。<br />
<br />
連線的client有Windows跟Linux,無論連線用的軟體都有一樣的情況。Server的部份主要是Debian 8跟Centos 7有這種情況,Ubuntu 14.04跟16.04都不會。比較有趣的是在Server端在同一個網段互相連線也不會有連線緩慢的情況,這讓我懷疑是DNS解析問題。<br />
<br />
可是那些連入緩慢的設備,仔細檢查過DNS解析完全沒有問題,本來認為跟軟體更新有關,但是其中有一台已經五個月沒更新,安裝Centos 7的設備也有同樣的問題。<br />
<br />
詢問Google大神後,其他人碰到這種情況就是去修改openssh server的設定檔,把UseDNS改成no(預設為yes),我試著這樣修改並重啟ssh後就恢復正常。<br />
<br />
跟DNS有關聯的問題應該是這幾天的dnsmasq漏洞,可是我的Server是直接查詢Hinet DNS啊...。UseDNS選項是去反查連入IP的網域名稱,經測試Hinet DNS的IP反解析功能並沒有問題。 Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-23078708954588947112017-09-22T15:12:00.000+08:002017-09-22T15:17:32.020+08:00foobar2000使用usb dac播放音樂因為最近買了KECES的<a href="https://www.rakuten.com.tw/shop/tddisk/product/7zn4oyamm/">DA151MK3</a>,想研究一下怎樣的設置才能得到最好的效果。<br />
<br />
軟體需求<br />
<ul>
<li>Windows 7以後的作業系統(其實是Vista以後,但是誰還用Vista?)</li>
<li><a href="http://www.foobar2000.org/">foobar2000</a>最新版</li>
<li><a href="http://www.foobar2000.org/components/view/foo_out_wasapi">WASAPI plugin</a></li>
</ul>
foobar2000的設置說明<br />
<ol>
<li>在Preference/Playback/Output/Device裡選擇『WASAPI (event):喇叭 (USB DAC)』。選擇DS (Direct Sound) 的話有可能會受Windows Mixer與Resampler影響,而WASAPI則是直接輸出未更動的位元流給USB DAC。WASAPI支援兩種模式:push跟event,音效裝置可能只支援其中一種方式,大多數裝置都支援event,如果不支援再改用push,可參考WASAPI plugin的<a href="http://wiki.hydrogenaud.io/index.php?title=Foobar2000:Components_0.9/foo_out_wasapi#WASAPI_plug-in_version_3.0:_two_output_modes:_push_and_event-driven">文件</a>。</li>
<li>下面的Output data format要依照硬體規格設置,否則會出現無法播放,格式不支援的錯誤。以DA151MK3為例,最大支援到16-bit。至於Dither是否要啟用,如果播放的音樂需要轉換,如24-bit->16-bit則可以開啟,但是HydrogenAudio的<a href="http://wiki.hydrogenaud.io/index.php?title=Dither">Wiki</a>上則認為,大多數人其實聽不出來差異,是否需要開啟則是依照喜好決定。</li>
<li>在Playback/DSP Manager/Active DSPs裡,如果播放的音樂檔案格式硬體不支援,則需要啟用Resampler做轉換。以DA151MK3為例,播放格式為24bit/96kHz的檔案,就需要使用Resampler並設置為44或48kHz,否則同樣會出現音訊裝置無法支援的問題。以內建的Resampler來說,SSRC的品質比較好但是硬體需求較高,PPHS雖然比不上SSRC但是也比Windows的Resampler好太多。這部份也是依照喜好決定。如果不須轉換則無須使用,減少Resampler所帶來的影響。</li>
</ol>
Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-66284497430946169692017-08-24T15:36:00.000+08:002017-08-25T14:06:01.686+08:00[筆記] 從docker轉換到rkt<b>※下文完全是個人筆記,不保證其正確性與完整性。 </b><br />
<br />
<b>docker images -> rkt image list </b><br />
<br />
<b>docker pull -> rkt fetch</b><br />
example: rkt --insecure-options=image fetch docker://nodered/node-red-docker<br />
如果要指定tag可以用 name:tag 的格式,如 rkt --insecure-options=image fetch docker://ubuntu:16.04 <br />
<br />
<b>docker run -> rkt run</b><br />
example: rkt run --port=1880-tcp:1880 registry-1.docker.io/nodered/node-red-docker:latest<br />
在docker上,如果要做容器到主機的埠對應,是用-p HOSTPORT:EXPOSE,rkt的話則是看EXPOSE的設置加上通訊協定,像nodered使用tcp 1880,就會寫成--port=1880-tcp:1880,格式是--port=EXPOSE-PROTOCOL:HOSTPORT。<br />
<br />
<b>docker run -d -> systemd-run --slice=machine rkt run</b><br />
example: systemd-run --slice=machine rkt run --port=1880-tcp:1880 registry-1.docker.io/nodered/node-red-docker:latest<br />
因為rkt沒有實做daemon管理,沒辦法像docker一樣把服務放到背景執行,須使用作業系統的init daemon來管理。對於一般的開發者來說學習的成本比較高,但對於系統管理者來說有著穩定、易於管理與一致性的優點。如果要為執行的服務命名,而不是使用自動產生的名字,可加上--unit參數。如systemd-run --slice=machine <b>--unit=nodered</b> rkt run --port=1880-tcp:1880 registry-1.docker.io/nodered/node-red-docker:latest<br />
<br />
<b>docker ps -> machinectl list</b><br />
在Ubuntu上要先安裝systemd-container才會有machinectl這個指令。有個奇怪的情況,安裝完後執行的pod才會列出,安裝前已經執行的pod不會列出。<br />
<br />
<b>docker ps -a -> rkt list</b><br />
<br />
<b>docker rm -> rkt rm</b><br />
example: rkt rm e77323df<br />
rm後面帶的是UUID,可以從rkt list看到。rkt的rm會把pod徹底刪除,不像docker只是從列表上隱藏。<br />
<br />
<b>docker stop -> rkt stop</b><br />
example: rkt stop e77323df<br />
stop後面帶的是UUID,可以從rkt list看到。<br />
<br />
<b>docker exec -> rkt enter</b><br />
example: rkt enter e77323df /bin/bash<br />
<br />
Q: 在rkt list看到已經啟動過的pod,可以像docker start一樣的方式再次啟動嘛?<br />
A: 目前沒有實做此功能,但有考慮 <a href="https://github.com/rkt/rkt/issues/2087">issue:2087</a>。<br />
<br />
Q: 在pod裡頭掛載host的目錄?<br />
A: 使用--volume與--mount,<a href="https://coreos.com/rkt/docs/latest/subcommands/run.html#mounting-volumes">參考</a><br />
example: rkt run --port=1880-tcp:1880 <b>--volume data,kind=host,source=/tmp/123,readOnly=false --mount volume=data,target=/tmp/123</b> registry-1.docker.io/nodered/node-red-docker:latest<br />
先用volume export一個目錄給pod,然後再用mount把volume掛載到特定目錄<br />
<div class="itanywhere-activator bounceIn" style="display: block;" title="Google Translator Anywhere">
</div>
<div class="itanywhere-activator bounceIn" style="display: block; left: 267px; top: 781px;" title="Google Translator Anywhere">
</div>
<div class="itanywhere-activator" style="display: block; left: 171px; top: 1215px;" title="Google Translator Anywhere">
</div>
Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-39954957506241200552017-08-23T11:09:00.001+08:002017-08-23T13:39:56.260+08:00為什麼PS4下載遊戲這麼慢?(以及可能的改善方式原文:<a href="https://www.snellman.net/blog/archive/2017-08-19-slow-ps4-downloads/">https://www.snellman.net/blog/archive/2017-08-19-slow-ps4-downloads/</a> <br />
很多PS4玩家都有一個疑惑,為什麼從PSN下載遊戲超慢,但是使用Local Proxy卻會變快?有人對此做了實驗,得到以下結論:<br />
<ul>
<li> 作業系統本身會依照正在執行的遊戲或APP調整網路細部設置,這些調整只針對PSN下載,最少會慢5倍,最多會慢100倍,不管那些程式是跑在前景或背景都一樣。</li>
</ul>
<ul>
<li>休眠模式是否會全速下載要看是否在休眠時關閉遊戲與APP。</li>
</ul>
<ul>
<li>在下載PSN遊戲時關閉所有執行的程式,能夠確保系統以最高速度下載。但是PS4的界面不太容易讓使用者確認哪些程式跑在背景裡。</li>
</ul>
使用Local Proxy會變快的原因,是因為被調整的網路設置其中一項變數就是網路延遲,延遲越低下載越快。速度的調整當然是有意為之的,目的是避免PSN下載影響遊戲或APP。但是作者也挑明說SONY的作法很爛,而且都已經四年了居然沒有任何改善。<br />
<div class="itanywhere-activator" style="display: none; left: 65px; top: 0px;" title="Google Translator Anywhere">
</div>
Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0tag:blogger.com,1999:blog-3315632359857231858.post-7194302968734412422017-08-16T10:34:00.003+08:002017-08-16T10:36:17.134+08:00更新到Firefox 55反而變慢的情況如果更新到Firefox 55之後出現開網頁停滯或變慢的情況,試試調整『偏好設定/一般』的效能選項,預設是使用推薦的效能設定,建議關閉並修改內容處理數量限制跟CPU核心數一致,如果是4核心CPU就選4。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXP2R3NUzVBjlwLaVq80wjPXsvCppELRsGqBJlXCA3waNqw7xqblaDa8J6CwRkojprRZFwCy8hyphenhyphen3cyiTEnwvxM_c0HBOhNaqIXIKYp8WgCcOTSKqof3p5EhT9unD3Qp5G4ORgxmpXM-a0/s1600/Screenshot_20170816_102940.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="705" data-original-width="1366" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXP2R3NUzVBjlwLaVq80wjPXsvCppELRsGqBJlXCA3waNqw7xqblaDa8J6CwRkojprRZFwCy8hyphenhyphen3cyiTEnwvxM_c0HBOhNaqIXIKYp8WgCcOTSKqof3p5EhT9unD3Qp5G4ORgxmpXM-a0/s400/Screenshot_20170816_102940.png" width="400" /></a></div>
Ryan Hohttp://www.blogger.com/profile/00678904484712055422noreply@blogger.com0