推薦系統的課程...

推薦系統已經是顯學了,如果不要太暴力的演算法 (太學術而導致相依性太高) 也都有現成的 Map-Reduce 類演算法可以處理大量資料。但如果要知從頭學起的話,資料反而不太好找?

然後... 也是上個禮拜看到的,現在在 Coursera 上有這樣一門課程:「Introduction to Recommender Systems」,在今年 (2013 年) 九月開課。有興趣慢慢學的當然可以去報名,不過我想說的是,這門課程的 Course Syllabus 列出了很多關鍵字,如果不想等九月開課的人,拿這些關鍵字搜尋資料也可以馬上學到不少東西。

另外一個入口是 Wikipedia:「Recommender system」,也算是導讀性質。

新的 HTTPS 攻擊:BREACH Compression Attack

也是一個禮拜前的消息,在 Slashdot 上看到對 HTTPS 的新攻擊,目前沒有好解法,NSA 應該開心到爆炸:「BREACH Compression Attack Steals SSL Secrets」。

說明可以參考「Vulnerability Note VU#987798 BREACH vulnerability in compressed HTTPS」這篇。

假設你的 ISP 想要抓出你的 Facebook (HTTPS) session id 或是 CSRF token (只要是有能力在中間攔截封包並修改資料的團體都可以,這邊以 ISP 為例),作法是針對 HTTP 頁面值入 script,讓你的瀏覽器對 https://www.facebook.com/ 發出大量 request,藉由觀察這些 HTTPS 的長度就有機會取得 session id (或 CSRF token)...

CERT 的 security advisory 上是寫:

With a token of length 32 and a character space of size 16 (e.g. hex), the attacker needs an average of approximately 1,000 request if no recovery mechanisms are needed. In practice, we have been able to recover CSRF tokens with fewer than 4,000 requests. A browser like Google Chrome or Internet Explorer is able to issue this number of requests in under 30 seconds, including callbacks to the attacker command & control center.

四千次就搞定了... 太!歡!樂!了!

John Carmack 加入 Oculus

上個禮拜的新聞,John Carmack 加入 Oculus:「John Carmack Joins Oculus as CTO」。

身為 id Software 創辦人 (以及電玩遊戲領域超重量級人物),另外也是 Open Source 的推廣者,近年來把心力放在 VR 技術上 (不論是軟體還是硬體),加入 Oculus VR 明顯是繼續往目前的理想邁進... (順便賺賺麵包錢),而這位大師能夠帶給 VR 領域什麼樣的刺激,接下來這幾年就很值得看看了...

喔對,每次提到 John Carmack,當然就要提 1995 年 28 吋 1920x1080 的螢幕:

FreeBSD 的 portconf 新功能...

1.5 版的 portsconf 只能處理等號形式:

lang/php5*: WITH_FPM=yes

前幾天發現這對於某些設定很難處理,所以就在 ports/181119 送出 patch,讓 portconf 可以處理 += 的用法,讓設定更彈性。

結果發現作者就順便把去年十月的 ports/172355 債也還掉... 去年十月這個 pr 早就處理 += 需求,還修正變數名稱需要支援 -+ 的問題。

MySQL InnoDB 與 PostgreSQL 的 Partial Index(es) 是不一樣的東西...

MySQL InnoDB 指的 Partial Index 是:

An index that represents only part of a column value, typically the first N characters (the prefix) of a long VARCHAR value.

PostgreSQL 指的 Partial Indexes 是:

A partial index is an index built over a subset of a table; the subset is defined by a conditional expression (called the predicate of the partial index). The index contains entries only for those table rows that satisfy the predicate. Partial indexes are a specialized feature, but there are several situations in which they are useful.

先講結論,PostgreSQL 可以做掉 MySQL InnoDB 的 Partial Index 想做的事情,而且還更多。

MySQL InnoDB 的 Partial Index 是設定對 prefix index (對字串前面的 n bytes),可能的情況是 CHAR(32) 只對前面 16 bytes 索引。

PostgreSQL 的 Partial Indexes 受益於許多方面而更強大。因為有 Indexes on Expressions,所以除了可以像 MySQL 對 prefix 索引外,也可以索引 suffix,甚至是索引透過 string function 得出來的值。

像是 PostgreSQL 可以設定「我只要索引一月一日出生的人的 username」:

CREATE INDEX test_index ON test_table (username) WHERE birth_month = 1 AND birth_day = 1;

在 MySQL 裡需要反正規化後下 index,或是拆出另外一個表格再下 index 的問題,在善用 PostgreSQL 這些功能就可以省下不少功夫...

用 Zerigo 的 GeoDNS 混合不同家的 CDN 服務...

兩年前就用過 Zerigo (在「用 Zerigo 的 GeoDNS 服務」這篇有提到),最近剛好有需求要用,又拿出來複習了。

在「Support - Zerigo DNS」頁面上可以看出支援哪些功能,以及設定的方法。GeoDNS 的部份可以支援幾個不同層級:

  • 美國可以再切成四個區域。
  • 依照國家與地區切割。
  • 依照洲別切割。
  • 最後,當然可以設預設值。

GeoDNS 需要 DNS Pro 的版本才能用,DNS Pro 4 的版本是 USD$20/month,包含了 4m DNS query,平均每天可以接受約 13 萬次的查詢。超額費用是 USD$4.9 (每 1m DNS query),如果你仔細算,如果只是為了 DNS query 而升級,更高階的方案反而比較貴 XDDD 所以,如果用不到那麼多 domain 以及 hosts 時,就乖乖用 DNS Pro 4,DNS query 超額部份再付費買...

這樣就可以混 domain 使用,像是把 AkamaiCDNetworks 以及 CloudFront 以及自家的 cache server 混在一起用。

因為在台灣有 server,所以台灣的使用者就導到自家 cache server 上,然後美西在 EGIHosting 有租 server 當 cache,所以就把美西導到 EGIHosting 的 server 上,然後非洲與南美上 Akamai,其他地區上 CDNetworks。

MySQL 對 VARCHAR 的 Index 空間佔用的問題...

之前不知道從哪邊學到錯的東西... 實驗後發現搞錯了。對 MySQL 的 VARCHAR 欄位下 index 所實際佔用的空間仍是實際大小,而非最大長度。

測試方法是建立表格,schema 是 CREATE TABLE test (id INT UNSIGNED PRIMARY AUTO_INCREMENT, data VARCHAR(255)) ENGINE=InnoDB;,在 inndo_per_file 打開的情況下測試。

這是 1M rows,其中 data 都是 "a",這是 OPTIMIZE TABLE 後的結果:(以下每個都有 OPTIMIZE TABLE)

-rw-rw---- 1 mysql mysql     8586 Jul 30 22:42 test.frm
-rw-rw---- 1 mysql mysql 37748736 Jul 30 22:42 test.ibd

這是 ADD INDEX (data) 後的結果:

-rw-rw---- 1 mysql mysql     8586 Jul 30 22:46 test.frm
-rw-rw---- 1 mysql mysql 50331648 Jul 30 22:46 test.ibd

一樣是 1M rows,但 data 都是 "a" * 100 (一百個 a) 的結果:

-rw-rw---- 1 mysql mysql      8586 Jul 30 23:14 test.frm
-rw-rw---- 1 mysql mysql 146800640 Jul 30 23:15 test.ibd

這是 ADD INDEX (data) 後的結果:

-rw-rw---- 1 mysql mysql      8586 Jul 30 23:21 test.frm
-rw-rw---- 1 mysql mysql 260046848 Jul 30 23:23 test.ibd

實驗可以看出來 MySQL 的確是依照內容的實際長度索引,而非用欄位的最大長度做。

AWS CloudFront 與 Route53 增加印度機房...

官方的公告在「Amazon CloudFront & Route 53 Expand to India」這篇,一次增加兩個點,孟買 (Mumbai) 與清奈 (Chennai)。

CDN 頻寬的部份比香港、新加坡、南韓還低... 被放在 Price Class All 與 Price Class 200。所以量很大?還是因為其他原因?澳洲也才放一個雪梨...

咦,俄羅斯好像一直被遺忘...

PostgreSQL 筆記...

純粹是筆記...

對於架設 server 的文件可以參考 Ubuntu 這份「PostgreSQL - Community Ubuntu Documentation」,雖然 Debian 官方也有一份「PostgreSql - Debian Wiki」,不過沒講到遠端這塊...

設定的部份:

  • 要讓遠端可以存取有兩個地方要開,一個是 postgresql.conflisten_addresses 改成 "*",另外一個是增加 pg_hba.conf 遠端連線的權限。
  • CREATE USER test WITH PASSWORD 'test_password'; 以及 CREATE DATABASE test WITH OWNER = test; 把基本的東西建好。

然後把 firewall 打開,接下來就可以從其他台連進去了。