[macOS] 更新後登入畫面變成英文的解決方法

幾天前更新 High Sierra 10.13.3 補充更新後,重開機登入畫面變成英文的了。隨手搜尋了一下好像沒看到有人遇到一樣的問題。

解決方法是到「系統偏好設定」→「語言與地區」新增英文語系,並把英文設為預設後(拉到最上面)重開機。重開機回來以後再到一樣的地方把繁體中文設為預設,再重開機就好了。

Caddy + gunicorn + django

前言

目前這個部落格是放在東京 Linode 主機上,最近遇到的問題是 nginx 每天都會自動死掉,每天都得要 ssh 進去 restart nginx service,實在有夠麻煩。再加上我有用 Let’s Encrypt,每 90 天都要更新憑證。乾脆一不做二不休的把 web server 換成會自動更新憑證的 caddy,以下這篇記錄轉換的過程。

安裝 caddy

以下參考這份文件

安裝 caddy 很簡單,直接在 shell 下執行:

curl -s https://getcaddy.com | bash -s personal

使用 personal license 來安裝 caddy

然後建立必要的目錄

sudo mkdir /etc/caddy && sudo chown -R root:www-data /etc/caddy

建立空白的 caddy 設定檔

sudo touch /etc/caddy/Caddyfile

建立給 caddy 使用的 ssl 目錄

sudo mkdir /etc/ssl/caddy
sudo chown -R www-data:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

安裝 Caddy 系統服務

從官方 repository 下載 caddy.service

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

讓 systemd 發現新下載的 caddy.service

sudo systemctl daemon-reload

Enable caddy.service

sudo systemctl enable caddy.service

(Optional) 檢查 Caddy 是否有正確運作

建立 /var/www/index.html

echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html

編輯 /etc/caddy/Caddyfile 設定檔

http:// {
    root /var/www
    gzip
}

然後啟動 Caddy server

sudo systemctl start caddy

設定 gunicorn

之前用 nginx 當作 web server 的時候,是搭配 uwsgi 來把 request 傳到 django 內。而 Caddy 雖然有 plugin 可以支援 uwsgi,但是需要自己編 Caddy,所以在這裡我改用 gunicorn。

安裝 gunicorn 和 runit

sudo apt install -y runit
sudo -H pip install gunicorn
sudo service runit start

設定 runit,${project_name} 為您的專案名稱

mkdir /etc/sv/${product_name}/
touch /etc/sv/${project_name}/run
chmod u+x /etc/sv/${project_name}/run
vim /etc/sv/${project_name}/run

編輯 /etc/sv/${project_name}/run

#!/bin/sh

# gunicorn 執行檔位置
GUNICORN=/usr/local/bin/gunicorn
# Django 專案位置
ROOT=/var/www/my_django_project
# 執行時的 pid 位置
PID=/tmp/my_django_project.pid

# Django 專案的 wsgi.py 位置
APP=my_django_project.wsgi

if [ -f $PID ]; then rm $PID; fi

cd $ROOT
exec $GUNICORN -c $ROOT/gunicorn.conf.py --pid=$PID $APP --group www-data

再來設定 django 專案,在專案根目錄中新增 gunicorn.conf.py,內容如下

# 用本機的 8000 port
bind = "127.0.0.1:8000"
# gunicorn 的 pid file,和前面 runit 設定檔內相同
pidfile = "/tmp/my_django_project.pid"
# 設定要用幾個 worker 來執行
workers = 1
timeout = 90

再來讓 runit 把 gunicorn 跑起來

ln -s /etc/sv/${project_name} /etc/service/${project_name}

如果到這邊都有做對,當你建立好 symbolic link 後執行 ps -aux | grep gunicorn,就會看到 gunicorn 的 process 跑起來了

設定 Caddy

最後設定 Caddy 把 request 丟給 gunicorn 處理,編輯 /etc/caddy/Caddyfile,加上

my_django_project.fykuan.tw {
    root /var/www/my_django_project
    proxy / 127.0.0.1:8000 {
        transparent
        except /static
    }
    tls ${your_email_address}
}

然後重新啟動 Caddy

sudo service caddy restart

就可以用瀏覽器打開 https://my_django_project.fykuan.tw 試試看了

[Firefox 57+] 過濾 Google 搜尋來自內容農場的結果

原本在 Firefox 57 之前,有 Hide Unwanted Results of Google Search 這個 Firefox 附加元件可以用。但是在 Firefox 57 以後,因為不再支援傳統附加元件了,所以就得要找替代方案。

目前我在用的方案是用 Violent Monkey 附加元件加上 Google Hit Hider by Domain 這個 Script。

依照順序,先安裝好 Violent Monkey 後再到 Google Hit Hider by Domain 按「Install this script」,裝好以後打開 Google 搜尋結果頁面,就會在每筆搜尋結果的旁邊出現一個「block」按鈕,按下去之後,以後搜尋結果如果有這個站,就會自動隱藏。你就再也看不到騙點擊數的內容農場文在搜尋結果內了。

iPhone 6 Plus 螢幕破裂修復記錄

我的 iPhone 6 Plus 不小心把觸控螢幕面板摔破了,想說反正也用的夠久了,暫時先用備用機等到 iPhone X 發售就直接換新機,而且我有用 iCloud 隨時備份,直接從備用機拉備份應該可以直接無縫接軌到備用機上。

結果就爆炸了

Google Authenticator 並不會把 OTP 密碼資料備份到 iCloud 上,所以換了新機後從 iCloud 拉備份以後,打開 Google Authenticator 發現裡面是一片空白,同時我的臉也都白了。

那只能從螢幕爆掉的舊 iPhone 6 Plus 上想辦法了,這時候想到的解決方法是:

  1. 把 iPhone 6 Plus 接上電腦的 iTunes
  2. 用 iTunes 備份 iPhone 6 Plus 上的最新資料
  3. 把備用機接上 iTunes
  4. 用剛做的 iPhone 6 Plus 備份回復備用機

結果一接上電腦,隱隱約約可以從破掉的 iPhone 螢幕上看到要我輸入密碼解鎖螢幕才能進行備份,但是螢幕破了,數字九工格的右邊一半沒辦法點。努力的這邊壓壓那邊壓壓,看看會不會讓我硬點出一個數字,但試了一個晚上還是點不出來那唯一一個在右邊的數字。

要解決這個問題,就只好把螢幕修好、讓我可以解鎖手機用 iTunes 備份。於是跑去外面的維修中心、告訴對方我只需要能把螢幕解鎖備份資料就可以了,其他功能如果有問題沒有關係,然後我就跑到附近去等對方工程師幫我處理。

沒多久接到電話,對方表示換了螢幕面板以後,看起來應該沒問題了,可是如果要備份資料的話,因為之前(也就是前一天在想辦法按出密碼鎖數字的時候)密碼輸入太多次,螢幕顯示已鎖定,這樣就備不出來了,只能還原原始設定。

但是不信邪的我還是請他不要幫我還原,我回家再想辦法惡搞看看,於是我回家做了以下的事:

  1. 先進入 iPhone 的救援模式(關機後按住 Home 鍵以及電源鍵,直到螢幕顯示救援模式)
  2. 接上 iTunes
  3. 選擇「還原」清掉整台 iPhone 的資料,做完以後 iPhone 就不再是鎖定狀態了
  4. 再度用 iTunes 還原,這次用三月的備份檔還原,做完以後 Google Authenticator 就恢復到三月的資料了
  5. 再從 iPhone 還原設定,還原後第一次開機選擇從 iCloud 還原備份,這樣手機就恢復到兩天前的狀態了,並且第 4 步拉回來的 Google Authenticator 資料也還會在手機裡面

這次經驗給我幾個教訓:

  1. iCloud 備份不是完整備份,有些東西是不會備上去的(例如 Google Authenticator 的密碼資料)
  2. 平常還是要有定期用 iTunes 備份的好習慣,這次幸好我的 Google Authenticator 資料自三月後沒什麼新變動。如果可以的話最好開啟 iTunes wifi 備份,就不需要接線備份了
  3. 不要做多餘的事。像是一直 try 密碼,造成手機被鎖定
  4. 改用可以備份資料的 Authy,放棄 Google Authenticator