從 IP 取得 Country / City / 經緯度

使用的環境是 Ubuntu 16.04 + Django 2.2,先處理 geoip 資料庫。

sudo apt-get install geoipupdate

安裝完以後先填設定,編輯 /etc/GeoIP.conf ,這邊要注意 geoipupdate 版本,2.5 之前的話,AccountID 要改成 UserId,EditionIDs 要改成 ProductIds ,Ubuntu 16.04 用的是 2.5 之前的版本:

# The following AccountID and LicenseKey are required placeholders.
# For geoipupdate versions earlier than 2.5.0, use UserId here instead of AccountID.
# AccountID 0
UserId 0
LicenseKey 000000000000


# Include one or more of the following edition IDs:
# * GeoLite2-City - GeoLite 2 City
# * GeoLite2-Country - GeoLite2 Country
# For geoipupdate versions earlier than 2.5.0, use ProductIds here instead of EditionIDs.
# EditionIDs GeoLite2-City GeoLite2-Country
ProductIds GeoLite2-City GeoLite2-Country

執行 sudo -H geoipupdate,檔案會下載到 /var/lib/GeoIP

接著在 Django 環境下安裝 geoip2

pip install geoip2

然後先在 shell 裡試試看:python manage.py shell

from django.contrib.gis.geoip2 import GeoIP2
g = GeoIP2('/var/lib/GeoIP')  # 將路徑指過去
print(g.country('59.120.21.9'))
print(g.city('59.120.21.9'))
print(g.lat_lon('59.120.21.9'))

一般來說,用 city(“your_ip”) 就可以拿到足夠的資訊了

{'city': 'Taipei',
 'continent_code': 'AS',
 'continent_name': 'Asia',
 'country_code': 'TW',
 'country_name': 'Taiwan',
 'dma_code': None,
 'latitude': 25.0478,
 'longitude': 121.5318,
 'postal_code': None,
 'region': 'TPE',
 'time_zone': 'Asia/Taipei'}

參考資料

如何寫 Git commit message

主要是看 How to Write a Git Commit Message 這篇文章的紀錄,這篇文章是 2014 年的文,我可能有看過,印象中之前有看過介紹原則跟工具的文章。之前的印象,第一行要明確、簡單,不要太長。有細項,從第三行寫起,用 markdown 語法。

這篇一開始先講為什麼,作者不囉唆,直接要你看自己的 git log –oneline 輸出,看自己覺得 OK 不 OK。所以可讀性很重要,可以很快的看懂,那麼就可以不用費心再去看裏面改了什麼。

主要有7個原則:

  1. Separate subject from body with a blank line :第一行寫主旨,第三行開始寫內容。
  2. Limit the subject line to 50 characters :主旨不要超過 50 個字元
  3. Capitalize the subject line :主旨的第一個字元大寫
  4. Do not end the subject line with a period :主旨不要有句點
  5. Use the imperative mood in the subject line :主旨要用祈使句,就動詞+名詞
  6. Wrap the body at 72 characters :內容的每行不要超過 72 的字元
  7. Use the body to explain what and why vs. how :內容要儘可能描述做了什麼、為什麼這樣做跟如何做。

棄用 yaourt,改用 yay

原來 archlinux 的 yaourt 已經過時了,我參考這篇 Yaourt is Dead! Use These Alternatives for AUR in Arch Linux,換成 yay,用法跟 yaourt 差不多。最新的 AUR 替代品可以參考 Archlinux 維基:AUR_helpers ,只是官方不建議使用這些工具,還是希望大家熟悉手動建置套件的程序。

先移除 yaourt

$ sudo pacman -Rn yaourt package-query

再參考 yay 的安裝說明來安裝

git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

用法跟 yaourt 差不多

# 更新套件列表並更新目前已經安裝的套件 (包含 AUR)
yay -Syu
# 安裝套件
yay -S foo
# 尋找套件
yay -Ss foo
# 取得遠端套件資訊
yay -Si foo
# 目前系統套件狀況
yay -P --stats

搞定以後,參考 yay -P –stats 的建議,移除了 aur 沒在維護的套件。最後跟 yaourt 說聲再見,謝謝 yaourt 過去幾年的照顧。

電影流水帳(2019/09/01~2019/09/30)

Embed from Getty Images
  • Triple Frontier (IMDB, Wikipedia),台譯:三重邊界。
  • Godzilla (IMDB, Wikipedia),台譯:哥吉拉。
  • National Parks Adventure (IMDB, Wikipedia),台譯:美國國家公園探險紀行。
  • Tag (IMDB, Wikipedia),台譯:貼背戰。

Triple Frontier

Pope 是個在哥倫比亞打擊毒梟的軍事顧問,他透過臥底得知了毒梟的一切,於是他打算找舊日的好伙伴一同去搶劫毒梟。於是他回到美國,找了舊日的伙伴,一一說服他們。然後,他們就行動了。計劃是這樣的,毒梟一家人會在星期日舉家出門去做禮拜,這時候家裡只有兩三個人看守,趁這個機會進去裏面,找到錢,接著夥同 Pope 的臥底,帶著錢逃走。到了定點,再轉搭直昇機越過安第斯山到海邊,搭船到安全的地方。

計劃趕不上變化,他們在毒梟家裡花了一點時間才找到被當作牆壁的錢,接著 Redfly 起了貪念,想把所有的錢帶走,這花了不少時間。他們帶著一堆錢離開時,恰好又遇到回來的毒梟一家人,差點就曝光了。趕到搭直昇機的地點,Pope 給了臥底們一筆錢跟假身份,要他們先離開,搭飛機到澳洲去。然後一行人帶著一堆錢搭著直昇機一路慢飛到安第斯山,可是啊,紙鈔是很重的,直昇機飛不過高聳的安第斯山,引擎負荷過重,過熱起了火,只好迫降在附近的田裡。他們跟村子裡的人起了衝突,後來用銀彈跟子彈壓制了村子裡的人,並取得了能載運錢的牲口,接著就改用步行方式要越過安第斯山。爬了一兩天以後,好不容易要越過安第斯山了,卻被攻擊,是村子裡的人!原來之前在村子發生衝突時,有些人的家屬死了,所以不放過他們。一場槍戰下來,Redfly 掛了,Pope 等人也是筋疲力盡。此時,他們決定派 Benny 先下山去找接應的船,畢竟已經晚了預定時間兩三天的時間,怕沒船接應。隔天,Benny 回來,說已經找到接應的船。但這個時候,他們面臨了抉擇,錢很重要,但好兄弟 Redfly 的屍體也很重要,經過了一番爭執,終於決定拋下大部分的錢,帶著 Redfly 屍體下山。下山當然少不了槍戰,畢竟毒梟勢力不可小覷,不過他們還是順利的帶著 Redfly 屍體跟所剩無幾的錢搭上船回去。

回去以後,Pope 找了律師,將錢平分。Ironhead 很有義氣的放棄了自己的那一份要給 Redfly,其他人見到這情況,也紛紛聲明放棄。電影的最後,就在眾人空手回去,Ironhead 給了 Pope 丟錢的座標以後結束。從這結尾看來,似乎是會有續集,再看看吧。

看完這部電影是真心覺得惋惜,如果他們能夠依照計劃只帶夠用的錢,是不是就不會遇到回來的毒梟一家人而能隱密的搶劫了呢?如果他們能夠當機立斷的在搭直昇機時決定只帶走足夠的錢,是不是就能順利越過安第斯山呢?但故事就是因為這些意外才有轉折。我是覺得整體來說還不錯啦,不能說特別好看,但也不會太難看就是。

Godzilla

衝著 Elizabeth Olsen ,就把這部電影看完了,故事、特效、選角還蠻不錯的。Elizabeth 在這部電影裡出場並不是很多,主要還是在講怪獸的事情。

Ford 的父母在日本核電廠工作,某天,怪獸突然來襲,Ford 的媽媽因此罹難。Ford 跟爸爸相依為命,可是爸爸的心一直留在核電廠那兒,他認為媽媽的死是自己的錯,也因此冷落了 Ford。Ford 長大以後,離開父親從軍去了,也在美國跟 Elle 成家,心裡還是有點責怪父親。

Ford 放假回到家,本想好好陪妻女,可是卻接到日本來的電話,父親被拘捕了。Ford 只好匆匆跟妻子告別,趕到東京去。到了東京接父親出來後,到父親的公寓,他勸父親跟他回美國,一方面可以看孫子,一方面也可以好好的生活,不要再沈浸在過去。但父親不聽,他說,核電廠那兒一定有著什麼祕密,最近開始有些活動了,我一定要進去看看。Ford 拗不過父親,只好陪著進核電廠管制區。到了管制區,兩人先回到老家,父親看到媽媽的照片,不禁淚流滿面。旋即,兩人就被軍方逮捕了。「怎麼會呢?這裡不是應該是荒廢的核電廠嗎?果然這裡有著什麼祕密,父親沒說錯!應該要相信父親的。」Ford 這樣想著。核電廠的確藏著祕密,當年造成核災的怪獸仍然藏在這裡,軍方在這裡設置據點監控怪獸,也同時進行研究。有時候就是這樣,來的好不如來的巧,這個時候怪獸甦醒了,軍方壓制不住怪獸,怪獸飛走了。接下來軍方跟 Ford 開始追查怪獸與哥吉拉的動向,哥吉拉追著怪獸,而怪獸則是飛往美國。那為什麼怪獸要飛往美國呢?原來美國也有一隻怪獸,為了繁衍後代,所以要飛過去。

美國軍方原本打算阻擋,但是怪獸破壞力驚人,根本阻擋不了。日方的芹澤博士推測,怪獸是要繁衍後代,而哥吉拉則是為了要獵殺這些怪獸,所以建議軍方引導怪獸到海上去,讓怪獸們自行解決。美國軍方在無法消滅的情況下,也只能接受芹澤博士的建議,改變策略。後來在一番兵荒馬亂之下,終於引導怪獸們到海邊去,減少了許多傷亡。而結果也如同芹澤博士所推測的,哥吉拉是要獵殺這兩隻怪獸。經過打鬥之後,哥吉拉消滅了這兩隻怪獸,可是自己也受了重傷,故事在這裡「暫時」畫下了句點。

National Parks Adventure

Robert Redford 配音的紀錄片,主要是通過 Conrad 一家人暑假拜訪每個國家公園的旅行來介紹美國的國家公園以及其歷史。然後特別提到John Muir 與羅斯福總統 (老羅斯福) 的露營對談,John Muir  影響了總統,所以後來羅斯福總統任內成立了許多國家公園,保護了許多美麗的自然環境。整部電影拍攝的非常自然又樸實,再加上 Robert Redford 的敘述,心裡會很自然的想要飛過去看看。這部紀錄片蠻值得一看的。

Tag

這是根據真人真事改編的電影,電影的最後有放上這些人的照片,這樣的情誼很讓人感動。

一群好友從小時候就開始玩鬼抓人的遊戲,被抓到的就要當鬼抓下一個,但是 Jerry 從來沒有被抓到過。很快的,這群小男孩長大了,然後有個記者不知怎麼地看到了他們的故事,就跑來採訪 Hogan。Hogan 也就開始,順藤摸瓜的去找以前的這些好友,開始邊玩起鬼抓人,然後他們決定這次一定要讓 Jerry 當鬼。找到 Jerry 時,發現他要結婚了,礙於婚禮,他們跟Jerry還有新娘約法三章,只能在非婚禮的時候玩。不過經過一番努力,他們還是沒能讓 Jerry 當鬼。最後婚禮當天,Hogan 實在是忍不住,他想,既然Jerry違背了約定,利用了妻子假流產來躲過被抓,他也決定在婚禮當天抓 Jerry。豈料,還是被 Jerry 躲過了,不過 Hogan 倒在地上,大夥趕緊送他去醫院。原來 Hogan 會想起這個頭,主要是因為他身體有了狀況,擔心明年再也玩不到了,所以才想趁這次機會讓 Jerry 當鬼。大夥就在醫院把事情談開,Jerry 說自己不想當鬼,其實是心裡有個疙瘩,覺得 Hogan 等四人感情比較好,自己比較孤立。但 Hogan 說,玩鬼抓人並不是在乎當不當鬼,而是希望你可以跟我們打成一片。Jerry 明白了大夥的苦心,終於放開心裡的堅持,跟大夥打成一片。

Ansible – 版本判斷條件句

執行之前寫好的 Ansible 腳本,卻有錯誤,奇怪,明明之前是好的啊?看了錯誤訊息,發現是找不到 /proc/sys/net/ipv4/tcp_tw_recycle 這個檔案的關係。怎麼會沒有這個檔案呢?使用 SSH 連上主機去看,還真的是沒有,上網找了之後,發現是 Linux Kernel 在 4.12 以後移除掉這檔案了(連結)。

好吧,因為腳本還有機會在較低版本的 Linux kernel 使用,必須得使用條件式來處理。在 Ansible 腳本裡,可以用 when 來做條件判斷,但是要怎麼取得 Linux kernel 版本以及做條件判斷呢?在 StackOverflow 上看到這篇:How to compare kernel (or other) version numbers in Ansible

從這篇得知:

  1. 可以使用 ansible_kernel 就可以取得 Linux kernel 版本
  2. 可以使用 version_compare 來比較版本

所以下面的腳本就可以在 Linux kernel 是 4.12 以後的版本印出 “foo”

tasks:
  - name: Display "foo" if kernel > 4.12
    debug:
      msg: "foo"
      when: ansible_kernel | version_compare('4.12', '>')

太好了。可是再仔細看,執行時有 deprecated 的警告耶,說在之後會把 version_compare 拿掉。上 Ansible 網站看了 Ansible 的文件之後,做了調整,新的語法要使用 “is” 來判斷,然後用 version() 來取代 version_compare。

tasks:
  - name: Display "foo" if kernel > 4.12
    debug:
      msg: "foo"
      when: ansible_kernel is version('4.12', '>')

好,收工。

變數的命名

看這篇 The art of naming variables 的紀錄
變數命名的藝術,好吧,對非英語系國家來說,的確是有些難度。作者整理了一些慣例讓大家參考:

  1. Arrays :名詞字尾加上 s ,當複數。
  2. Boolean:變數用 is/has/can 開頭,例如 isOpen/hasWrite/canOpen,函數就用 check 開頭,例如 checkHasPermission()。
  3. Numbers:試著使用 min/max/total 來描述,例如 minBugs / maxPugs / totalFruits
  4. Functions:要有動詞跟名詞,例如 getUser() / calculateTotal() ;轉換的話,可以用 to,例如:toUppser() 。

我本來以為會有講 dict / list 的,但沒有,嗯,順手找了一下

  • List:可以考慮後綴就用 List,例如 namesList ,也有人把 list 擺在前面,例如 listOfNames
  • dict:有找,但沒有特定的慣例,參考 List 的命名作法應該是可以。然後有人這樣用 email_to_contact / ip_to_hostname

寫到這邊想起 Clean code 這本書有一章就是在講這個,直接看別人的讀書筆記/心得吧:

Cronitor

網址:https://cronitor.io

今天在 hacker news 上看到 crontab.guru,網址名稱挺不錯的,詳細介紹 crontab 怎麼用。正在想說怎麼會有人這麼佛心的建這網站時,就看到建立網站的是 cronitor.io。去看了 cronitor.io 以後,發現這個服務很有趣,是監控主機上的 cron job 用的。

一般 cron 的工作,只能透過 SMTP 發送結果,或者是自己去寫 wrapper ,把執行結果送到 slack, telegram 等服務。cronitor 就等同於是 wrapper 的角色,幫你執行指令,再把結果送到 cronitor 網站上,然後你可以在網站設定要通知誰。在網站上也可以去看 cron job 的執行歷程或者是知道到底有沒有被執行。

cronitor 這個工具不管是用網站介面或是 CLI,都需要先行安裝。安裝很簡單,就一個執行檔,下載以後,複製到 /usr/local/bin 就行了。(安裝說明,同時頁面也會提供你的 api-key)

tar xf cronitor-stable-linux-amd64.tgz
sudo cp cronitor /usr/local/bin
sudo cronitor configure --api-key <your-api-key>

你可以直接用網站介面,只是用網站介面,要先在介面上建立 cron job monitor ,然後再自己去改自家的 crontab,稍嫌麻煩。

用 CLI 比較方便,基本上用 sudo cronitor discover 就跑完了。sudo cronitor discover 會掃描你的 crontab,然後逐一詢問你 job 的名稱,然後再去網站上建立對應的 cron job monitor。這邊要注意的是,sudo cronitor discover 會自動幫你改 crontab ,也就是 root 的 crontab、/etc/cron.d 下的檔案都會幫你改掉。如果你不想這樣的話,得之後手動還原。目前網站雖然可以建立多個 cron job monitor,但目前只有一個 monitor 能運作,要用更多,得升級。收費的資訊在這裡:https://cronitor.io/subscribe

Tor

這篇只講在 Ubuntu 16.04/18.04 上的安裝。

安裝

echo "deb https://deb.torproject.org/torproject.org/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/tor.list
curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
sudo apt-get update
sudo apt-get install tor tor-geoipdb torsocks deb.torproject.org-keyring privoxy

修改 /etc/privoxy/config ,檔案結尾加入

forward-socks5 / localhost:9050 .

然後重新啟動

sudo systemctl restart privoxy

privoxy 主要是為只支援 http proxy 的程式提供 http proxy,tor 主要只提供 sock proxy。執行程式時,用 torsocks your_command 即可。要查 IP ,可以用 torsocks curl ipv4.icanhazip.com

參考資料