MySQL 5.6 的 Index Condition Pushdown

MySQL 5.6 以前的 Multi-column Index,當位於 index 中間的 column(如下例的 j)需要進行 range query 的時候,只能利用到部分的 index,需要另外讀取資料列的內容來進行判斷。舉例來說,如果有一個 Table 結構是這樣:

CREATE TABLE mytable (
id int not null auto_increment primary key,
i int(11) NOT NULL,
j int(11) NOT NULL,
k int(11) NOT NULL,
val char(10) NOT NULL,
KEY ijk (i,j,k)
) ENGINE=InnoDB;

在 MySQL 5.6 之前,SQL Query 「SELECT sum(length(val)) FROM T WHERE i=1 AND j<100 AND k=100」 會把所有 i=1 的資料列拉出來,逐一比較 j 與 k 的值。MySQL 5.6 的 Index Condition Pushdown (ICP) 功能,把這個動作改為比較 Index tuple 而非資料列內容,可避免拉出整個資料列,降低磁碟 IO(因為資料列通常比 Index 大)。

詳細的說明可以看 MySQL 的官方文件:Index Condition Pushdown Optimization 與 Percona 的測試:Multiple column index vs multiple indexes with MySQL 5.6

Gmail 預設顯示 Email 內的圖片

上週的新聞,Gmail 會將 Email 內嵌的圖片,透過 Proxy 處理之後顯示出來。除了改進使用者體驗外,也可以避免惡意圖片攻擊使用者的電腦。

ThreatPost 上有人測試了這個功能,發現 Gmail 會在使用者開啟信件的時候,才會去抓取圖片並且進行處理,所以目前使用的開信追蹤技術,只要指定獨一無二的追蹤網址給每個用戶,還是可以正常運作。不確定 Google 是否有打算處理隱私問題?另外這篇文章也提到有可能可以利用 Google 的 Image Proxy 來作 DDoS…

也是一個值得繼續觀察的項目 XD

Amazon Web Services 進入中國

AWS 週三在官方部落格發表了與中國公司合作,伺服器位於中國境內的 Cloud Service。這個服務的帳號與其他地區的 AWS 服務帳號不同,需要另外申請,現有的 AWS 用戶也不能夠使用同一個帳號直接開通中國的 AWS 服務,看起來是直接把客戶資料的部份隔離開來…

等到 Public Beta 的時候再來看看狀況…

Amazon Web Service re:Invent 2013 發表的新產品

隨時更新。

新的 Instance Type

  • C3 Instance: 提供更高運算能力的 Instance。使用 Intel E5-2680 CPU,最高提供 32 核心,一小時收費 USD$2.40。
  • I2 Instance: 提供高 IO 效能的 Instance。使用 SSD 當作 Instance Storage。(預計於近期提供服務)

資料庫

Big Data

  • Kinesis: 處理即時 Stream 資料(如 Web Server Access Log,使用者行為 Log 等)的工具,目前需要申請才能試用。

其他

  • AppStream: 在 AWS 平台上跑應用程式,將結果(影像與聲音)輸出到使用者的設備上,並從設備上取得使用者輸入傳回應用程式裡。
  • Workspace: 在 EC2 上跑遠端桌面,提供給企業用戶方便複製、管理的工作環境。最便宜的方案是一個月每個人 USD$35。
  • CloudTrail: 紀錄 AWS 上使用 API 的狀況,可以丟到各種第三方服務或軟體(例如 Loggly 或 Splunk)進行分析。

Galera Cluster 的 gcache.size 設定

gcache.size 的大小會影響 Node 加入 Cluster 時,需不需要完整複製資料。如果資料更動程度過大,在 gcache 裡面已經找不到更動部份的話,就需要完整複製資料;反之則可以直接 apply gcache 裡面的變更。Understanding gcache in Galera 很詳細的說明了 gcache 的用途。

gcache.size 的預設值是 128MB。查了一下資料,是使用 MMAP 的方式來應用 ((http://www.percona.com/files/presentations/percona-live/nyc-2012/PLNY12-galera-cluster-best-practices.pdf)),所以可以盡量設定大一些。雖然 mysqld 看起來會很肥,但實際上是吃不到那麼多記憶體的。我們是設定成 8G。

Google 贊助的 uProxy

uProxy/ (( 由 University of Washington 與 Brave New Software 開發,Google 贊助。 ))是一個 Firefox 和 Chrome 的擴充套件,安裝之後,可以讓透過同樣安裝了 uProxy 的朋友電腦瀏覽網站。自己與朋友中間的連線是加密的。只要你信任朋友不會偷聽你的資料,就可以避免在公共場所使用 WiFi 的安全性問題。

不過在我看來,uProxy 會大大的降低 Proxy 架設與使用門檻。以後只需要在家中的電腦安裝 uProxy,在外面就能夠使用加密的連線,透過家中網路上網。就算不信任朋友不會惡搞你,自己在家裡放電腦(或是到 AWS 上開一台 Windows 跑瀏覽器 XD)就可以增強使用公共場所 WiFi 的安全性,避免被竊聽。

另外,如果在中國需要翻牆,或是某些日本限定的網站,也可以很簡單的透過這個套件來規避限制了。

最後我覺得這個專案的挑戰是,怎麼讓 uProxy 在行動裝置(智慧型手機、平板之類的)上面可以簡單的安裝與使用。我不確定 Firefox 的情形,但是 Chrome 與 Safari 都沒有擴充套件的機制…… 另外蘋果的 Walled Garden 也增加了很多不確定性,說不定連上架都會被拒絕。

目前這個專案還在 Closed Beta 階段,就等之後的發展了。

Firefox 27 將移除 Flash Plugin,改用 Javascript Flash VM “Shumway” 代替

Geek.com: Firefox 27 will kill the Flash plug-in on January 21 看到這個消息,就試著去裝了 Shumway 的 Extension

要跑起來花了一點功夫…

  • 要把 Flash Block 關掉
  • 要把 Flash Plugin 改為「啟用時詢問」
  • about:config 內要把 shumway.ignoreCTP 設成 true。原本沒有這個設定,要自己加上。

跑起來結果如下:

會看到下方出現 Shumway 的字樣,表示這個 SWF 檔案是用 Shumway 解析的。

另外測試了幾個影音網站,全部都不能動。YouTube 是直接強制用 Flash Plugin:

Vimeo 是黑色畫面:

ニコニコ動画也不會動:

距離 1/21 剩下三個多月了耶,這樣真的不會大爆炸嗎 😮

用 ETag 追蹤使用者

真可以說是道高一尺魔高一丈⋯⋯

警告:以下文長,如果只想知道 ETag 怎麼進行追蹤的,請直接從最後一段讀起。

為了瞭解使用者的行為,投放使用者喜歡的內容或是可能有興趣的廣告,網站會使用各式各樣的方法來紀錄使用者的瀏覽行為。例如 Amazon 會紀錄使用者看過哪些或購買了哪些商品,然後把使用者有可能有興趣的商品顯示出來,希望使用者能繼續在 Amazon 購買。對於廣告聯播網來說,如果能投放使用者喜歡的內容,進而提高點擊率,便能獲得更好的成效,增加收入。但是廣告聯播網並不像 Amazon 這類電子商務網站,強制使用者必須登入才能使用,而且廣告聯播網大多橫跨多個網站(例如很多站都會掛 AdSense),因此一般來說會採用 Third Party Cookies ((可參考 fcamel 的文章: Cookie 雜記)) 紀錄 User 的瀏覽紀錄。

這造成了一個問題:到底是誰可以擁有我們「看過的網站的列表」這個資料?相信沒有人願意讓大家知道自己在看某些害羞的網站吧。但如果這些網站有加入廣告聯播網,廣告聯播網便可以知道你瀏覽過這些網站,於是在其他一般的站台,便有可能出現令人害羞的廣告內容。這造成了隱私洩漏問題。

於是人們採用了各式各樣的反制方法:有的裝了 AdBlock 眼不見為淨,但免費的服務大多數依賴廣告為生,如果大家都排斥廣告,連 Google 都活不下去;有的人提出了一個 DNT (Do Not Track)的宣告,希望網站能夠遵守。不過這實在太理想化了,不知道要何年何月全世界的網站才會支援。

另外,瀏覽器廠商也推出了他們的解決方案,其中一個是「隱私模式」,也就是不紀錄任何的 Cookie,每次重開瀏覽器都需要重新登錄網站。但這對普羅大眾來說實在太麻煩了,因此又有另一個方案:禁止 Third Party Cookie。也就是說,只允許使用者主動連上的網站(例如使用者喜愛的社交網站,部落格,或是影音網站)設定 Cookie,而使用者沒有主動連過去的網站(例如廣告聯播網)則禁止設定 Cookie。這樣就避免廣告聯播網利用 Third Party Cookies 來紀錄使用者瀏覽紀錄了。iOS 上的 Safari 預設是禁止 Third Party Cookies 的 ((結果 Google 發現 Safari 有 Bug 可以繞開這個限制,也利用了這個 Bug,於是就被告了。)) ,而原本 Firefox 打算也改為預設禁止,不過現在延遲了這個計畫。

看起來,未來使用 Cookie 來追蹤的方法會越來越受到限制,於是有許多替代方案出現,像是利用 Flash,或是 HTML5 的 LocalStorage 等等,但都有一些缺點。今天看到有人提出用 ETag 來追蹤,想了一下發現沒什麼破綻,使用者更難防止追蹤了。

ETag 是用來避免使用者下載已經存在瀏覽器快取裡面的資料,進而加速使用者瀏覽網站速度的功能。大部分的網站並不會常常大改版,於是會有一些 CSS、Javascript、圖片是不常更動的,如果這些資料下載一次後就存在使用者電腦中,下次使用者拜訪網站時,就不需要重新向網站抓取,可以節省頻寬與時間。當瀏覽器第一次下載資料時,網站可以指定檔案的 ETag 值,瀏覽器會記住。下次訪問網站時,瀏覽器會先詢問網站同一個檔案的 ETag 值是否相同,如果一樣就不重新抓取。


ETag 示意圖,取自 http://lucb1e.com/rp/cookielesscookies/

因為瀏覽器會將記住的 ETag 值送回網站,因此網站只要在頁面中插入 1px * 1px 的 GIF,然後針對每個沒有傳 ETag 來的瀏覽器給定一個獨一無二的 ETag 值(並紀錄在資料庫中),下次使用者回訪時,便可以分辨出這個使用者曾經來過這個網站。對於廣告聯播網來說,只需要在每個站台加入這個機制,又可以爽爽紀錄使用者曾經瀏覽過的網站了⋯⋯

Reference: http://lucb1e.com/rp/cookielesscookies/