Python float和decimal

2   11391 轉為簡體

在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

10   14962 轉為簡體

準備把之前用的一套(山寨)cdn用到博客和其他一堆亂七八糟的站上面,用了yoooo.us(4個o)來做cname。主要現在的yooooo.us還依賴cloudflare的服務沒法搬,所以另外註冊了一個放到cloudxns上根據運營商區分解析。現在電信走的是idcf;聯通移動和港澳台小夥伴是vultr日本;國外是cc的lax。韓國kt用來做冗餘。

所以對於你們來說,每次打開我的博客的時候,可以至少省一個位元組的流量了。

被害妄想症如何保護服務器安全

15   14823 轉為簡體

自從有次過海關的時候電腦被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地理位置查詢

2   16428 轉為簡體

基於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 LLC

2607: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

通過bgp.he.net生成ASN數據庫

Read More

離線下載一條龍

9   10216 轉為簡體

因為怕死 遵紀守法,所以不在自家bt下新番和劇。目前的架構是這樣的,造福一下海外黨

  1. 一個offshore的DMCA不敏感的服務器。RSS爬取某兩個網站添加磁力鏈接到deluge。nginx添加一個下載目錄的location,記得要https,並且給default_server加上假證書,參見這篇博客
  2. 家裡一個樹莓派或者類似的硬件,運行aria2,開放aria2 rpc端口到公網,加上token。或者ssh轉發aria2的端口到一個跳板機。
  3. deluge使用execute插件,在Torrent Complete事件執行shell腳本添加到家裡的aria2,並且設置pause值為true。
  4. 樹莓派crontab半夜執行aria2.unpauseAll開始下載

用 OpenResty 寫了一個 SNI 代理

0   14123 轉為簡體

功能類似於dlundquist/sniproxy

推薦 OpenResty 加上 stream 模塊和 ngx_stream_lua_module 模塊。在 1.9.15.1 上測試通過。

示例配置:

A Lua table sni_rules should be defined in the init_worker_by_lua_block directive.

The key can be either whole host name or regular expression. Use . for a default host name. If no entry is matched, connection will be closed.

The value is a table containing host name and port. If host is set to nil, the server_name in SNI will be used. If the port is not defined or set to nil, 443 will be used.

Rules are applied with the priority as its occurrence sequence in the table. In the example above, twitter.com will match the third rule rather than the fourth.

If the protocol version is less than TLSv1 (eg. SSLv3, SSLv2), connection will be closed, since SNI extension is not supported in these versions.