發表文章

[ Nginx ] 微服務權限管理

最近被問到,微服務系統要怎麼管理權限。上網查了一下,發現這方面的文章好像不多,加上好久沒更新了,想說就來分享一下。 我傾向權限通通交給 server來管理,這樣不管是用什麼樣的方式來驗證用戶,都不影響其他微服務運作。 因為要依賴到 Nginx,所以就直接使用 Docker了,先建立一個 docker-conpose.yaml文件。 version: '3' services: web: build: context: ./web dockerfile: Dockerfile command: gunicorn -b 0.0.0.0:8000 src.wsgi ports: - "8000:8000" volumes: - ./web/src:/web/src - ./volumes/media-root:/web/media-root nginx: image: nginx ports: - "80:80" volumes: - ./volumes/media-root:/nginx/media-root - ./nginx/default.conf:/etc/nginx/conf.d/default.conf 這個 yaml檔目的是運行 Nginx,其中主要是將設定檔放入 container中。 接著建立一個資料夾,並在裡面建立一個文件 default.conf。 server { listen 80 default_server; location /protectedMedia { internal; alias /nginx/media-root; } location / { proxy_pass http://web:8000; } } 在 server的區塊中建立兩個路徑, "/" 和 "/protectedMedia" ,"/"將會作為 Django的 proxy,"/protectedMedia&quo

[ Gobot ] 在 ESP8266上使用 Go語言

圖片
才剛寫完 " 在 ESP8266上燒錄 MicroPyhton ",緊接著就寫 Gobot好像對 MicroPython始亂終棄的感覺。 其實最近寫 Django server碰到效能上的瓶頸,軟硬體的效能都已經很 TOUGH了,聽說 Go語言效能很接近 C語言, 考慮來學學 Golang來提升一下職場競爭力。剛好才寫了 MicroPython就順便試試 Gobot來學習 Golang。 使用 Golang開發 ESP8266可以透過 WiFi連線上傳代碼,非常方便,但起手式稍微有點複雜。 首先需要先依賴 Arduino IDE對 ESP8266進行基礎設定。 Arduino IDE若要對 ESP8266進行燒錄,需要安裝 ESP8266工具,但安裝之前需要先將 Arduino外部的資源位置告訴 IDE。 先將 "http://arduino.esp8266.com/stable/package_esp8266com_index.json" 加入 "額外的開發板管理員網址"。 接著安裝 ESP8266工具,到開發板管理員搜尋 "esp8266"並安裝。 接著需要依賴 Firmata Builder來建立 Gobot需要的 .ino文件。 建立文件前,需要安裝 .ino文件需要的套件 "ConfigurableFirmata"。 安裝後,到 Firmata Builder 的網站準備建立 .ino文件。 SSID就是 WiFi的名稱,密碼的部分則是從 .ino文件中進行修改。 其中 Network port是之後透過連線更新代碼時使用的 port。 若擔心找不到 ESP8266的 IP,可以透過 Local IP先直接設定。設定完 IP後,就會顯示 Subnet mask和 Gateway IP,請設定和即將連接的路由器一樣。 Core features的部分,是按照官網建議的選項選擇的。 接著移到網頁最下方,filename可以隨便取,接著點擊 Download按鈕下載。 最後利用 Arduino IDE開啟下載的文件,修改文件中的 WiFi密碼。當然也可以修改 SSID。 最後,在燒

[ MicroPython ] 在 ESP8266上使用 MicroPyhton

前陣子工作繁忙加上 Arduino玩得有點挫折,好不容易稍微有一點時間,嘗試一下自己比較熟悉的語言。 首先安裝燒錄的套件 Esptool pip install esptool 接著清除 ESP8266中的 flash esptool.py --port /dev/tty.usbserial-1420 erase_flash /dev/tty.usbserial-1420是我連接中的 USB設備,不知道怎麼查看的朋友可以參考之前分享的 " 檢查 Serial設備 "。 接著下載 MicroPython ,我下載的是 esp8266-20180511-v1.9.4.bin。 接著對 ESP8266進行燒錄。 $ esptool.py --port /dev/tty.usbserial-1420 --baud 460800 write_flash --flash_size=detect 0 esp8266-20180511-v1.9.4.bin $ $ esptool.py --port /dev/tty.usbserial-1420 --baud 460800 write_flash --flash_size=detect 0 esp8266-20180511-v1.9.4.bin -fm dio 第二行燒錄指令中添加了 "-fm dio" ,因為我的 ESP8266開發版是 NodeMCU的某種變體,需要加入額外指令才能燒錄成功。 燒錄成功後 MacOS和 Ubuntu的用戶可以透過 screen指令透過 serial對設備進行操作。 $ screen /dev/tty.usbserial-1420 115200 Windows的用戶則可以透過 PuTTY 對 COM port來操作。 順便就利用 MicroPython幫 ESP8266連上網吧。 >>> import network >>> sta_if = network.WLAN(network.STA_IF) >>> sta_if.active(True) # 啟動 WiFi設備 #6 ets_task(4020f474, 28,

[ Tor ] 架設暗網

圖片
沒事不要逛暗網,更別說是在暗網上架站了。 如果真的有什麼不可告人的秘密想要在暗網上架站分享,請務必遵守以下規則: 不要在這台服務器上運行或做其它事情。 在新服務器或VPS上進行全新安裝。 不要保留或運行來自VPS提供商任何服務。 用Paypal支付你的VPS服務,不過最好使用Bitcoin。 不要向VPS提供關於你的任何身份信息。 不要在這台服務器上運行Tor中繼,因為Tor中繼在真實世界的公開IP是公開的。 不要從這台服務器發送電子郵件。 不要運行討厭或卑鄙Web軟件。如果你的Web軟件有管理員登陸或管理員賬號,把密碼改成複雜的26個字符組成的密碼。很多Tor網站被攻破只是某人猜到了管理員登陸密碼。 避免使用任何JavaScript之類腳本的Web軟件。 確保你的Web應用不會洩露任何錯誤信息或身份信息,比如在錯誤信息中的真實公開IP。 審查Web前端代碼,確保它不會從jquery.com、Google Fonts或任何外部服務拉取資源。 及時做好VPS的安全更新。 以下只分享如何快速架站,安全的部分請自行拿捏。 首先先安裝 tor。 $ brew install tor # mac $ $ sudo apt-get install tor # ubuntu $ sudo update-rc.d -f tor disable # 關閉自動啟動 安裝 Tor後,找個位置建立一個 tor_server資料夾和一個 config檔,如下。 . tor_server └── torrc.in 接著編輯 torrc.in。 # torrc.in HiddenServiceDir /path/to/tor_server/hidden_service/ HiddenServicePort 80 127.0.0.1:8000 執行 tor,並等待 tor連接至洋蔥網路。 $ tor -f torrc.in Tor將會針對 HiddenServicePort上指定的網址( 127.0.0.1:8000)轉址為洋蔥網路的 port 80( http專屬的 port),官方說法是不需要特別用 SSL加密,tor有自己的加密機制。 Tor會在指定的路徑( HiddenServiceDir)建立 hidden_service資料夾

[ Selenium ] 偽造身份進行網路爬蟲

圖片
網路爬蟲做到這步,通常是在要大量訪問同一個網站,從事某些行為。這真的超不乖的,好孩子千萬別學。 訪問某些網站時,網站其實能因應不同的瀏覽器、作業系統等,提供不同的回應。例如下載軟體時會自動導向到適合的下載連結。這些訊息都藏在 header中的 user-agent中。 當大量訪問同一個網站,若 server端的警覺心比較強的情況下只依賴 Tor進行爬蟲,會發現每個訪問的用戶都來自一樣的瀏覽器和作業系統。 server端可能會使大量訪問的目的失效。 因此除了串改 ip外,最好也修改 user-agent,使 server端無法有效辨識。 Tor的部分可以參考之前分享的 " 使用 Tor進行網路爬蟲 " 和 " 多開 Tor client "。 >>> from selenium import webdriver >>> from selenium.webdriver.chrome.options import Options >>> >>> opts = Options() >>> >>> opts.add_argument("--incognito") # 使用無痕模式。用 selenium開瀏覽器已經很乾淨了,但疑心病重的可以用一下 >>> >>> proxy = "socks5://localhost:9050" >>> opts.add_argument('--proxy-server={}'.format(proxy)) # 讓 selenium透過 tor訪問 internet >>> >>> ua = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" >>> opts.add_argument("user-agent={}".format(ua)) # 使用偽造的 use

[ Arduino ] 使用 PyBluez對 Arduino發送訊息

圖片
第一次學寫 Arduino,先試個水溫使用 Pybluez對 Arduino發送訊息。 Arduino的部分 #include <liquidcrystal.h> #include <softwareserial.h> LiquidCrystal lcd(12,11,5,4,3,2); SoftwareSerial BT(9, 10); void setup() { lcd.begin(16,2); BT.begin(9600); BT.setTimeout(10); lcd.print("Hello, world!"); } void loop() { if (BT.available()) // if text arrived in from BT serial... { String cod=(BT.readString()); lcd.setCursor(0,0); // choose first line of LCD lcd.print(cod); } } 安裝 PyBluez 安裝前請先參閱各平台的 Requirement 。 Windows或 Linux應該是可以直接安裝 $ pip install pybluez 我使用的是 MacOS,但 Python的 Bluetooth packages中似乎對 MacOS沒有很好的支援,甚至無法直接使用 pip安裝。 不過 GitHub上都沒有提出這類 issues,有可能我是個案 :P $ pip install git+https://github.com/pybluez/pybluez.git 安裝後會在 packages中找到 lightblue資料夾,當中會有一個檔案 _bluetoothsockets.py。 class _BluetoothSocket(object): ... def send(self, data, flags=0): # if not isinstance(data, str): # raise TypeError("data must be string

[ Tor ] 多開 Tor client

圖片
之前 " 使用 Tor更新 IP位置 " 文中提到 Python要透過 Tor爬蟲前,須透過 Tor提供的 Socket port來連接 Tor。 最近因為朋友有需求,稍微花了一點時間研究了一下如何多開 Tor client和獨立更新 IP位置。 當要使用大量 IP同時訪問同一個網站,就有必要讓 Tor提供兩個以上的 Socket port來提供不同的 IP位置。 首先,我在桌面上建立了一個 tor_confs資料夾,內容大概是長下面這樣。 . tor_confs ├── torrc1.in └── torrc2.in 要多開 Tor需要為各個 Socket port建立各自的 conf檔。 # torrc1.in SocksPort 9050 ControlPort 9051 DataDirectory /Users/XXXXXXXX/Desktop/tor_confs/tor1 ExitNodes {tw},{jp},{kr},{hk},{sg} # torrc2.in SocksPort 9060 ControlPort 9061 DataDirectory /Users/XXXXXXXX/Desktop/tor_confs/tor2 ExitNodes {tw},{jp},{kr},{hk},{sg} DataDirectory需設定絕對路徑,設定相對路徑在更新 IP時會報錯。 ExitNodes則可有可無,因為個人需求需限制 Exit node的國家。各國的代碼可以點擊 這裡 查詢。 完成後只需要在 tor_confs資料夾內使用 terminal執行 $ tor -f torrc1.in & tor -f torrc2.in 兩個 Socket port會各自連上不同的 IP位置,這樣就算完成了。 執行後 Tor就會自動在 DataDirectory設定的路徑建立所需的檔案,資料夾結構如下。 . tor_confs ├── tor1 │   ├── cached-certs │   ├── cached-microdesc-consensus │   ├── cached-microdescs.new │   ├── lock │   └── state ├── tor2 │   ├── ca

[ PySerial ] 檢查 Serial設備

因為工作需求,需要使用 USB傳輸 Serial data。 之前都是用 Arduino IDE檢查 Port的位置,一直感覺手段不是很漂亮。 最近在 StackOverflow上看到有人分享一段代碼,能夠自動尋找電腦上 Serial的設備。 由於簡單給力,所以我就原封不動的 PO了。 Successfully tested on Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.x and Ubuntu 14.04 / 14.10 / 15.04 / 15.10 with both Python 2 and Python 3. import sys import glob import serial def serial_ports(): """ Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system """ if sys.platform.startswith('win'): ports = ['COM%s' % (i + 1) for i in range(256)] elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'): # this excludes your current terminal "/dev/tty" ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): po

[ Scikit-image ] 利用 SSIM篩選相似度過高的圖像

圖片
之前有提到過利用 Hamming distance對兩張照片進行相似度的比對, " 利用PhotoHash篩選相似度過高的圖像 "。 最近發現另一個相似度的方法,這個方法叫做 SSIM(Structural Similarity Index),有興趣的可以 維基 一下。 好在 Scikit-image 裡已經提供它的算法,參數的部份可以參考 這裡 。 from skimage.measure import compare_ssim import numpy as np import cv2 import os import glob def filter(member): img_list = glob.glob('./{0}/*.png'.format(member)) img_list.sort(key=lambda num: int(num.split('/')[-1].split('.')[0])) for img in img_list: img_path = img next_img = cv2.imread(img_path,0) if 'img_target' in locals(): s = compare_ssim(img_target, next_img) if s >= 0.8: if not os.path.isdir("./{0}/similar".format(member)): os.system("mkdir ./{0}/similar".format(member)) print("make dir ./{0}/similar".format(member)) os.system("mv {0} ./{1}/similar".format(img_path, member))

[ Tor ] 讓 Chrome透過 Tor連上網際網路

圖片
最近 WBSC在 YouTube上直播 U18的比賽,有效地消磨宅宅我 多餘的生命 空閒的時間,但只要是台灣的比賽通通限制 IP。 像我這種在外討生活,只靠網路過日子的宅宅,原則上是不會妥協的。 原本只打算用 VPN作跳板的,但免費的 VPN實在有夠不穩的。 打開 Tor Browser,浪費了我十分鐘多的生命在等待連線,仍然沒有連上。 只好拿出之前寫壞爬蟲安裝的 Tor。有興趣的話可以參考 " 使用 Tor更新 IP位置 ",裡面也稍微簡述了一下如何安裝 Tor。 首先打開 Chrome安裝 Proxy Helper 。 安裝完成後,右上角會出現一個像水晶球的 icon。 右鍵點擊 Proxy Helper,進入選項後,在 SOCKET PROXY的部分輸入 Tor預設的 Port " 127.0.0.1:9050 "。 接著打開 Terminal執行 Tor。 $ tor 左鍵點擊 Proxy Helper,選擇 SOCKET PROXY,Chrome就可以透過 TOR連上網際網路了。 想要直接連上網際網路時,就選擇 SYSTEM。 相較 Tor Browser連上網際網路的速度比較快,也比較節省記憶體。(個人感覺) 覺得連線速度不滿意或是 Google覺得異常時,可以開啟另一個 Terminal輸入下列指令更換 IP。 $ killall -HUP tor