Python float和decimal
在Windows上打包Python腳本時遇到一個需求,將浮點數轉成字符數組,比如輸入1.001,得到[‘1′,’0′,’0′,’1’]。
一開始想當然地用了:
version = 2.001
v = list(str(int(version * 1000)))
發現好像哪裡不對,得到的v是[‘1’, ‘0’, ‘0’, ‘0’]。想了一想應該是浮點數的精度問題,因為一看version * 1000 = 1000.9999999999999。
所以有這麼幾種解決方法:
v = list(str(int(round(version * 1000))))
或者:
v = list(str(version).replace(“,”, “”) + “000”)[:4]
或者用decimal模塊,decimal是固定小數點位數的,用的是十進制乘除法,所以(在設定的位數內)不會產生誤差:
from decimal import getcontext, Decimal
getcontext().prec = 4
v = list(str(Decimal(version) * 1000))
需要注意的是decimal會自動轉換科學計數法,可以用”%d” % Decimal(d)來得到原始值。
啟用yoooo.us
準備把之前用的一套(山寨)cdn用到博客和其他一堆亂七八糟的站上面,用了yoooo.us(4個o)來做cname。主要現在的yooooo.us還依賴cloudflare的服務沒法搬,所以另外註冊了一個放到cloudxns上根據運營商區分解析。現在電信走的是idcf;聯通移動和港澳台小夥伴是vultr日本;國外是cc的lax。韓國kt用來做冗餘。
所以對於你們來說,每次打開我的博客的時候,可以至少省一個位元組的流量了。
被害妄想症如何保護服務器安全
自從有次過海關的時候電腦被TSA開包檢查硬盤還掉下來了之後,我的被害妄想症就越來越沒救了。
這篇文章假設有人可以物理接觸你的電腦,以及你所在的網絡不可信,這種情況下應該怎麼保護你的服務器數據安全。
- 使用代理登錄SSH以隱藏服務器IP。如果有多台服務器,選擇一個位置最近的做跳板機,加密它的文件系統(OpenVZ再見)。設置另外機器的hosts.deny和hosts.allow為僅允許跳板機IP登錄;如果使用不支持tcpwrapper的服務如dropbear,需手動設置iptables。
- 登錄跳板機的方式要和登錄另外機器的方式不同。
- 使用密碼+google authenicator登錄跳板機,然後通過公鑰登錄別的機器。設置跳板機的sudo需要密碼,且設置為不同於當前賬戶的密碼;方法是在/etc/passwd中添加一行toor:x:0:0:root:/root:/usr/sbin/nologin,使用passwd修改toor的密碼,在/etc/sudoers中添加一行Defaults runas_default=toor, runaspw。
- 使用密鑰A登錄跳板機,使用另一個密鑰B登錄別的機器。密鑰B應保存在本地,通過ssh-agent轉發到跳板機。不同設備上的密鑰B可以設置不同的passphrase。dropbear不支持ed25519,而ecdsa據都市傳說可能存在NSA的後門。
- 每三個月更換一次密鑰。
- 保證密鑰的passphrase的強度;不使用任何雲服務保存密碼和密鑰;如果實在記性太差,在本地AES加密一次,然後做好偽裝(比如將二進制密文附到圖片文件之後或壓縮文件之前,[密文|!Rar…] 或 [\xFF\xD8…\xFF\xD9|密文])。
- 設置fail2ban。
- 監控跳板機/var/log/wtmp中的登錄IP。
- 如果沒有必要,關閉SSH和其他各類開放端口。
- 所有明文服務儘可能走tls。如果客戶端支持SNI,配置假證書以防止被猜測域名。可以使用lua-resty-sniproxy。
歡迎交流
cidr.me地理位置查詢
基於OpenResty ,MaxMind GeoIP數據庫和從bgp.he.net生成的ASN數據庫,因為沒有經緯度的需求所以沒有顯示。下文有源代碼的鏈接,如果需要可以自行修改加上經緯度或者將輸出變為JSON等。
這裡有chrome插件
使用方法
查詢當前IPv4地址
$ curl http://cidr.me/ip
x.x.x.x
查詢當前IPv6地址
$ curl http://ipv6.cidr.me/ip
x.x.x.x
查詢當前IP的PTR記錄(反向DNS),地理位置和ASN
$ curl http://cidr.me/
x.x.x.x
Country, City
ASN number
查詢當前IP的PTR記錄
$ curl http://cidr.me/rdns
x-x-x-x.com
查詢指定IP的地理位置
$ curl http://cidr.me/74.125.203.199
74.125.203.199 th-in-f199.1e100.net
United States, California, Mountain View
AS15169 Google Inc.
查詢域名的地理位置
$ curl http://cidr.me/www.google.com.hk
172.217.3.195 sea15s12-in-f3.1e100.net
United States, California, Mountain View
AS15169 Google LLC2607:f8b0:400a:809::2003 sea15s12-in-x03.1e100.net
United States
AS15169 Google LLC
查詢域名的IP
$ curl http://cidr.me/www.google.com.hk/ip
74.125.203.199
2607:f8b0:400a:809::2003
查詢域名的IP和CNAME(如果存在)
$ curl http://cidr.me/www.youtube.com/dns
youtube-ui.l.google.com 172.217.3.174
172.217.3.206
216.58.193.78
216.58.217.46
2607:f8b0:400a:808::200e
源代碼
在這裡https://gist.github.com/fffonion/44e5fb59e2a8f0efba5c1965c6043584
需要ngx_http_geoip_module, echo-nginx-module, lua-nginx-module,安裝libgeoip,並將maxmind的舊版geoip數據庫放在/usr/share/GeoIP
離線下載一條龍
因為怕死 遵紀守法,所以不在自家bt下新番和劇。目前的架構是這樣的,造福一下海外黨
- 一個offshore的DMCA不敏感的服務器。RSS爬取某兩個網站添加磁力鏈接到deluge。nginx添加一個下載目錄的location,記得要https,並且給default_server加上假證書,參見這篇博客
- 家裡一個樹莓派或者類似的硬件,運行aria2,開放aria2 rpc端口到公網,加上token。或者ssh轉發aria2的端口到一個跳板機。
- deluge使用execute插件,在Torrent Complete事件執行shell腳本添加到家裡的aria2,並且設置pause值為true。
- 樹莓派crontab半夜執行aria2.unpauseAll開始下載