在 docker 中使用 Elasticsearch 作為 django 的 search backend

目前手上的專案用了 django 作為網站的 Framework,而為了確保所有開發人員能夠在自己的開發機上用相同的環境進行開發,所以我們把整個 django 專案用 docker-compose 包裝成容器。

且為了未來專案正式上線時,可以放在 AWS 上,並盡量使用 AWS 的 managed service,所以選擇了 Elasticsearch 來作為 search backend。

這篇文章是把 Elasticsearch 加入 docker-compose 中的 django 專案的筆記。

閱讀更多在 docker 中使用 Elasticsearch 作為 django 的 search backend

新同文堂無法在 Firefox 使用後的簡繁轉換方案

2017-04-26: 新同文堂新版 release 了,這個版本在 Firefox 53.0 上使用沒有問題,所以就不再需要使用 workaround 了

新同文堂這個簡繁轉換套件,在開啟了 e10s 之後的 Firefox 中無法使用的問題困擾我有一陣子了。現在似乎也從附加元件中下架了。在這之後一直沒有找到順手的替代方案。今天稍微拜了一下 Google 才發現這個走 Greasemonkey 的替代方案。

  1. 如果 Firefox 沒有安裝 Greasemonkey 套件的話,請先到這裡安裝
  2. 安裝簡繁自由切換這個 Greasemonkey script

以後如果再遇到簡體中文網頁,就會自動轉換成正體中文。

數位機上盒奇怪的 UI/UX 設計

其實我不是 UI/UX 專家,不過因為家裡同時裝了中華電信 MOD 以及台灣大寬頻 CATV 的數位機上盒,正好可以比較一下這兩家應該是國內最大的數位電視供應商。

剛搬到現在住的地方時,和光世代一起裝了中華電信 MOD。但是以我個人的收視習慣來說,沒有緯來日本台和國興衛視兩個頻道,直接降低了讓我打開電視的誘因。所以這段期間我比較常用 Apple TV 看 Netflix。這樣撐了兩年,因為還是想看上述兩個頻道,所以又裝了台灣大寬頻 CATV

台灣大寬頻 CATV 和以前第四台的收視習慣比較接近,第四台有的頻道它都有,MOD 有些國外的頻道像是 FX、Comedy Central 也都有。所以馬上就變成看電視的主力了。中華電信 MOD 幾乎就不會打開了。

但老是覺得用起來不太對,這才發現台灣大寬頻 CATV 的遙控器有個很奇怪的設定。

因為數位電視的時代有即時節目表這種東西,所以循序換頻道(1→2→3→4)習慣會到節目表裡面用遙控器十字鍵的上、下鍵來換(如下圖綠色區),而且 MOD 的節目表很好用,在一個畫面內可以看到大量的節目資訊,所以這樣使用不會有什麼問題。

但是台灣大寬頻 CATV 這樣用就糟糕了,因為他的節目表「很不好用」,所以轉台時會變成要馬直接按數字,要馬直接用遙控器上的「選台」來循序換頻道。

於是這樣就撞牆了,在節目表中,循序增加頻道是按十字鍵的「下」,但是如果要用「選台」鍵來換頻道,卻是按「選台」的「上」。要是依照習慣按了「下」,頻道會變成遞減(4→3→2→1)

在中華電信的 MOD 上,遙控器其實也是這樣的行為。但是因為他節目表好用,所以不自覺的我就不再使用遙控器「選台」這個鍵了,用節目表選台更方便啊,於是也就避開了這個問題。在台灣大寬頻這邊我就是一天到晚按錯,頻率高到覺得困擾了。

其實我希望台灣大寬頻 CATV 這邊能強化節目表啦,現在的節目表在各個區塊都留了大片的空白,又醜又浪費空間。如果能做到接近 MOD 的資訊量,用起來肯定更方便吧。

[macOS] 重新安裝系統後自然輸入法無法輸入中文

前陣子 clean install 了 2015 Macbook pro 的作業系統,結果裝完之後發現自然輸入法爛掉了。症狀如下:

  1. 首先先安裝自然輸入法 v11 for Mac
  2. 裝好之後依照指示登出/重新開機
  3. 按 cmd-space 切換到自然輸入法
  4. 開始打字,螢幕上會出現相對應的注音
  5. 按到 3 4 6 7(也就是聲調)時,正常應該是會直接輸出剛剛輸入的注音以及聲調所組成的中文字,但這邊會直接把數字輸出,打不出中文
  6. 然後自然輸入法就爛掉了,再按 cmd-space 把它叫出來也打不出注音了

但奇怪的是,家裡另外一台 Mac mini 一樣是跑 macOS Sierra 卻沒有問題。

遇到這個問題後多次從網站、從 Email 和自然輸入法的開發商網際智慧聯繫,全都石沈大海,完全沒有任何回覆。

只好暫時先改用小麥注音,每天都覺得不太順手。直到一天忽然靈機一動想到,我重新安裝 macOS 的時候有把整個分割區砍掉重做,當時是把它做成 HFS+ (Case Sensitive) 的格式,也就是區分大小寫的檔案系統。因為這樣的關係,自然輸入法在讀取檔案的時候可能就有些東西讀不到於是就爛掉了。

重新把檔案系統做成一般的 HFS+ 之後重新安裝 macOS,嗯,果然一切正常。

所以說凡事還是要靠自己,廠商如果不鳥你真的是拿他沒皮條。

至於在網路上大量搜尋解決方法時,翻到自然輸入法的一些黑歷史這件事嘛…以後應該不會再買他們家的產品了。

用 Raspberry Pi 3 從頭自幹電子看板

敝社從以前到現在都是很直覺的用 Windows Solution 來做一些事情。原本我們放在門市,用來播放一些宣傳影片的電子看板,前面的人是用這樣的方式做的:

  1. 用一台 PC,可能是小筆電或是 Atom 等級的機器,安裝 Windows 作業系統
  2. 安裝 KMP
  3. 要播放的影片以及 Playlist 用 Google Drive 同步到各門市的電腦
  4. 把播放清單檔設定成用 KMP 開啟,然後把播放清單檔案拉到「開始」→「啟動」裡面讓他開機自動執行
  5. 如果有新播放清單/影片,重開機後 KMP 才會載入新的檔案並開始播放

這樣的做法有幾個討厭的問題:

  1. 播影片的效率不好,如果丟 MP4、Full HD 格式的影片出去,門市人員常常回報播放起來會掉格,於是就只好再轉一份其他格式的檔案以後再做一次一樣的事情。
  2. 機器和作業系統的成本高了一點。以及到了中國,因為連不到 Google Drive,所以變成得要手動一台一台上傳、手動一台一台編輯播放清單。
  3. 用 Teamviewer 這爛東西 連到中國的速度非常慢,所以每次在做這個的時候都很想砍人
  4. 最討厭的就是 Windows 常常會跳出一些有的沒有的視窗要你更新 blahblahblah 的…

綜合以上,有幾個問題需要解決:

  1. Windows 機器成本較高、難以維護,而且之前的硬體根本播不動 MP4、Full HD 的影片
  2. 加上中國地區的話,維護既不直覺又麻煩

那麼我就拿 Raspberry Pi 3 + Raspbian 來自幹吧

先入手 Raspberry Pi 3

現在 PCHome 24H 都有賣了,入手難度幾乎等於沒有。

記得還要準備 Micro SD、USB 電源線和變壓器、以及 HDMI 線一條。這樣成本大約一台台幣兩千五左右吧

安裝 Raspbian

直接到 Raspbian 官網下載 image,然後在 OSX 下的作法會是

  1. 先把 Micro SD 加上轉接卡接到 Mac 上
  2. 打開 Terminal,執行 diskutil list,確認你 SD 卡的代號,例如 /dev/disk2
  3. unmount SD 卡,執行 diskutil unmountDisk /dev/disk2
  4. 把 Raspbian 映像檔寫入 SD 卡,執行 dd bs=1m if=${你的映像檔位置} of=/dev/rdisk2
  5. 映像檔寫入完記得要再把 SD 卡 unmount 掉:diskutil unmountDisk /dev/disk2

然後就可以把這張 Micro SD 卡插到 Raspberry Pi 上,接上電源開機了

設定 Raspberry Pi 環境

開機以後,用預設帳號 pi ,密碼 raspberry 登入系統(看你要接鍵盤螢幕,還是直接接網路線用 DHCP 取得 IP 後再 ssh 進去)然後做以下的事:

  1. 執行 sudo raspi-config
    1. expand-filesystem
    2. 然後 Change User Password
    3. Boot Options 進去選擇 B1 Console
    4. 然後選擇 Finish 後根據提示重開機
  2. 重開機後設定系統時區
    sudo dpkg-reconfigure tzdata(這邊我用 Asia/Taipei)
  3. 設定鍵盤
    sudo dpkg-reconfigure keyboard-configuration (基本上就都用預設值)
  4. 設定 locales
    sudo dpkg-reconfigure locales (用 en_US.UTF-8)
  5. 更新系統
    sudo apt-get update
  6. 安裝必要軟體
    sudo apt-get install omxplayer vim-nox xutils

自動播放影片設計

第一個遇到的問題是原本想用 VLC Player 加上播放清單來播放影片,但是 VLC player 沒有支援 Raspberry Pi GPU 硬體加速,所以根本播不動 Full HD 的 MP4。Google 了一下發現在 Raspberry Pi 上最多人用的是 omxplayer 這支播放軟體,但 omxplay 沒有播放清單功能。所以這是第一個要解決的問題。

第二個是我想要讓灑在外面各門市的 Raspberry Pi 自己來總部拉檔案,我就只需要維護總部裡某個地方的資料,外面的機器就會自動同步。不要再一台一台去處理了。這個我就用 rsync 來做。

自動播放影片作法

  1. pi 登入 Raspberry Pi,然後執行 ssh-keygen 產生一把 ssh 金鑰。這是因為以後我們要用 rsync over ssh 並用 key 來認證(也就是不要打 login 密碼)

  2. ssh-copy-id 把剛剛產生的公開金鑰複製到總部放檔案的帳號,例如 [email protected] (請依照您自己的環境調整)

    ssh-copy-id -i /home/pi/.ssh/id_rsa.pub [email protected]

  3. 總部的帳號建立一個 pops 資料夾,裡面有一個 play.sh ,這是讓 omxplayer 循環播放檔案的 shell script,資料夾裡面再建一個 videos 資料夾放影片
    所以會有這些東西:

  4. play.sh 內容如下

  5. 然後就可以用下面的指令(在 Raspberry 上執行)從總部的 video 這個 user 目錄下的 pops 子目錄把影片拉下來。當然也可以依照你想要的時間,寫進 crontab 內排程執行
    rsync -avP --progress --delete-after [email protected]:~/pops/ /home/pi pops/

  6. 再來要讓 Raspberry 開機自動執行 play.sh 播放影片,編輯 /etc/rc.local,在預設的 exit 0 前面加上這一行

  7. 關掉 Raspberry 的螢幕保護程式以及自動電源管理,不然播一播畫面就黑了…
    編輯 /etc/xdg/lxsession/LXDE-pi/autostart ,把裡面原本的東西 comment 掉,加上這三行(如果沒有進 X 環境的話,這一步應該可以省略)

  8. 編輯 /etc/kbd/config,找出原本下面這兩項設定,都改為 0

  9. 如果要預先設定 wifi,請編輯 /etc/wpa_supplicant/wpa_supplicant.conf,格式如下:

  10. 這樣就大概完成了。重新開機看看影片會不會直接開始自動播放吧。

已知缺點

  1. 目前設計的架構不能讓各地區播放不同的影片,到時候遇到再看要怎麼處理
  2. 中國尚未測試,不知道會不會因為連到台灣的速度太慢產生什麼奇怪的問題
  3. 沒辦法輪撥圖片,需要用 ffmpeg 把圖片轉成影片播放,可參考 這裡

常見問題

  • Raspberry Pi 的 HDMI 運作起來怪怪的?
    Raspberry Pi 因為要省電的關係,所以 HDMI 有些行為怪怪的。我是透過修改 /boot/config.txt 內和 HDMI 相關的設定來解決。可以參考 這裡