提神飲料成分比較

說到要加班, 除了要吃飽, 還會想到提神飲料. 不過公司的 “小昱" 只有賣咖啡, 沒有賣這種東西, 倒是旁邊的 7-11 裡面有.

順手把便利商店的提神飲料成分全拍下來, 比較一下買哪個比較夠力. 假如要靠咖啡因提神的話, 喝咖啡就好了, 所以跳過!

看起來主要差在牛磺酸 [5]. “牛磺酸能加速神經元的增生以及延長的作用。同時亦有利於細胞在腦內移動及增長神經軸突。另外在維持細胞膜的電位平衡方面,牛磺酸亦同樣重要。因為它能幫助電解質質進出細胞,從而加強腦部的機能。"

再來就是維生素 B [6] 與 C. 維生素 B 主要的作用是調節新陳代謝,維持皮膚肌肉的健康,增進免疫系統神經系統的功能,促進細胞生長和分裂. 特別是 B1/2/6/12.

至於糖、鈉應該是我們不太需要的. 至於 XX 酸, 會不會是 XX 酸鈉、XX酸鈣的離子就順便寫上去了?  胺基乙酸聽起來很像是牛磺酸 (2-氨基乙磺酸) 的親戚, 不過卻只是防腐用的. 羧甲基纖維素鈉則是增加黏稠度用的.

美國紅牛內的葡萄糖醛酸內酯, 據說有解毒功能. 台灣規定藥品才能添加它, 也使得台灣紅牛去掉這個成分. 美牛真的有比較厲害嗎? 很好奇! 總之, 放眼看過去, 要補牛磺酸就是日本大正製藥的力保美達.  肌醇就選蠻牛.

不過肌醇不如字面上好像可以增加肌肉, 而是以調整胰島素為主. “肌醇不僅可以與膽鹼在體內合成卵磷脂,負責脂肪及膽固醇的新陳代謝作用;亦可活化細胞內的鈣離子通道,藉由細胞內酵素的作用,使得減數分裂中的卵子細胞更為成熟。" [7] 這…男生加班好像不需要這附加功能…

 每 100 ml Red Bull 康貝特 200P Power-Bomb 蠻牛 馬力夯 力保美達
咖啡因 (mg) 32 20 30 20 30 20
牛磺酸 (mg) 400  V 533 V 433 1000
維生素 B1 (mg)  V V 0.56 0.57 V
維生素 B2 (mg)  V V V
維生素 B3 – 菸鹼酸, 菸鹼醯胺(mg) 8  V V 8.4 V
維生素 B5 – 泛酸 (mg) 2
維生素 B6 (mg) 2  V V 0.7 0.59 V
維生素 B8 (mg) – 肌醇 2 12.5 8.4 V
維生素 B12 (ug) 2 0.9 0.9
糖 (g) 10.6  13.4 12.2 14? 17 15
人蔘抽取液 V
葡萄糖醛酸內酯 (mg) 240 (台灣不含)
鈉 (mg) 82 52 70 100 88 6
維生素 C (mg)  V V 25
離胺酸 5.7
檸檬酸  V V V V V
蘋果酸  V V V
酒石酸 V
泛酸鈣 (mg) V 0.63
本多酸鈣  V V
胡蘿蔔素
胺基乙酸  V V
偏磷酸鈉  V V
羧甲基纖維素鈉 V
B-胡蘿蔔素 V  

 

[REF]

  1. https://zh.wikipedia.org/wiki/紅牛能量飲料
  2. 保力達蠻牛 與 白馬馬力夯 以及 金老虎牙子 等機能性飲料成份超級比一比
  3. 依需求 挑 能量提神飲料
  4. 提神飲料小心喝
  5. 牛磺酸
  6. 維生素B
  7. 葉酸及肌醇在受孕過程中的角色

家戶年收入小整理

103 年綜合所得稅的統計資料出爐了. 平均綜合所得總額在 200 萬以上的村里, 新竹縣市有 9 個之多.  特別是關新里大概是全國最均富的區域. 下面的單位都是千元新台幣, 資料來自財政部103年度綜合所得稅申報初步核定統計專冊 [1].

縣/市 里/區 平均數 中位數
新竹市 光明里 2,413 1,450
新竹市 科園里 3,265 1,218
新竹市 關新里 2,628 2,206
新竹市 湖濱里 2,321    771
新竹市 豐功里 2,162 1,576
新竹縣 寶山鄉三峰村 2,111    903
竹北市 鹿場里 2,243 1,690
竹北市 東平里 2,244 1,747
竹北市 中興里 2,135 1,578

新竹的成績和科學園區有關, 因為這裡是工程師的聚落. 從下圖 [2] 可以得知, 家戶所得主要來自薪資. 關新里 (表格最下方) 每戶整年的機會中獎所得只有 5 千元, 並不是致富的原因. 但關新里顯然又比別的里更容易中獎!!! 這公平嗎? 哈!

HsinchuEastIncome-1-768x313

新竹看起來好像很厲害, 不過天龍國還要高出一大截! 松山區最強的東昌里, 平均家戶所得上千萬元. 而大安區簡直是恐怖, 有 21 個里的平均所得都超過 200 萬. 看了都不想打字了. 

台北市 好野里個數 最強的里 平均數 中位數
松山區 7 東昌里 10,727 936
大安區 21 民輝里 4,307 940
中正區 4 東門里 5,431 887
中山區 7 新福里 4,096 624
內湖區 2 金湖里 2,538 1,183
士林區 12 菁山里 6,104 646
北投區 1 永欣里 2,039 1,033
信義區 5 興隆里 9,083 806

台北雖然有好野的里, 但里民間的貧富差距比新竹大. 證據是平均數雖然高, 但中位數就還好. 東昌里的平均上千萬是怎麼來的呢?根據 103-166-A.pdf (A 代表台北市), 這個里的股利收入有 36 億. 但薪資收入只有 8.3 億. 大約 4.3:1.

反觀郭董住的信義區安康里, 平均值是 415.4 萬, 中位數是 99.4 萬. 收入來源是股利收入 91.9 億, 薪資收入 45.6 億. 大約 2:1. 因此可以推出郭董住的里也有不少高薪上班族, 但東昌里主要是大股東, 領薪水的人相對少.

像內湖這樣的產業聚落, 就和新竹的分布很類似 – 連中位數的家庭也是年收入百萬以上. 至於萬華, 大同, 文山, 南港這幾區的平均所得剛好沒有超過 2 M, 是台北市的異數. 

走出台北市之後, 外面的世界很不一樣. 平均家戶年收入破 200 萬成了奢求. 很快掃過所有資料, 只有找到下面幾個區域. 其中比較均富的也只有大甲的孔門里, 台中西屯的惠來里和新北市的華城里. 板橋福丘里等地方的貧富差異算是尚可.

 縣市 村里 平均數 中位數
 台中市 大甲區 孔門里 2,641 1,051
 台中市 北區 新北里 2,115   639
 台中市 西屯區 惠來里 2,920 1,045
 台南市 中西區 郡王里 2,346   734
 台南市 中西區 天后里 3,144   521
 高雄市 鹽埕區 教仁里 2,365   541
 高雄市 鹽埕區 沙地里 2,242   598
 高雄市 苓雅區 林圍里 2,106   780
 高雄市 岡山區 壽天里 2,605   657
 新北市 三重區 龍門里 2,044   515
 新北市 三重區 錦田里 3,459   529
 新北市 新店區 下城里 2,980   857
 新北市 新店區 華城里 4,993 1,197
 新北市 板橋區 福丘里 2,042   964
 桃園縣 桃園區 明德里 2,028   854
 桃園縣 大溪區 永福里 3,478   556
 桃園縣 中壢區 中榮里 2,245   629
 彰化縣 彰化市 延平里 2,177   600
 彰化縣 鹿港鎮 頭南里 3,310   455
 彰化縣 員林市 三多里 2,724   625
 彰化縣 大村鄉 美港村 6,089   531
 屏東縣 恆春鎮 網紗里 2,560   506

台北以外的貧富差異更是明顯 – 平均數字即使比台北高, 但是中位數低很多 (如彰化大村鄉美港村). 當地的營利所得, 薪資所得和租賃所得都高於鄰村 [3]. 可以推測有賺錢的公司隱身其中 (查為正新輪胎, 美利達等), 但雇用的人數不足, 還不足以造福整個鄉里.

ChangHuaIncome-1-768x489

另一方面, 沒有任何村里平均所得超過 200 萬的縣市非常多, 像是: 基隆市, 宜蘭縣, 嘉義縣市, 苗栗縣, 南投縣, 雲林縣, 花蓮縣, 台東縣, 金門縣, 澎湖縣, 連江縣…等等. 難怪有如此大的聲浪抱怨低薪. 別的賺錢方法我沒把握說, 但是到新竹來試試工程師的工作似乎是個比下有餘的選擇.

[REF]

  1. 103年度綜合所得稅申報初步核定統計專冊
  2. 上述資料主要來自[1] 網頁裡面的 103-PDF-3.zip. 解開後的 103_165-X.PDF (X = A~Z) 描述各村里的所得數字. 至於分類的收入來自 103_166-X.PDF, 這張圖來自 zip 檔裡面的 103_166-O.PDF. O 代表新竹市.
  3. 本圖來自103_166-N.PDF. N 代表彰化縣.
  4. 原始檔案下載 103- PDF-3.zip

WAI-ARIA 小註解

所謂 WAI-ARIA 是指 Web Accessibility Initiative’s Accessible Rich Internet Applications, 究竟何謂也?WAI 的部分指 “無障礙網頁倡議" 或是 “可訪問性倡議”.  就字面上來看, 就是一種讓網路使用變簡單的提案.

根據 [1],  W3C 在  WCAG 2.0 裡將無障礙定義為: “縱使使用者能力不一,也能輕易使用網頁所提供的資訊和服務。 (Web Content Accessibility Guidelines (WCAG) 2.0 defines how to make Web content more accessible to people with disabilities. [2])

舉例來說, 網頁上放了一張圖, 那麼也要有文字說明. 如果使用顏色來區隔, 那麼也要有顏色以外的替代方案. 考慮到這些, 至少對於視障或是色盲的人上網比較方便. 同樣也有人行動不便, 那麼易於瀏覽或是輸入就對他們很重要.

WCAG 2.0 已經把可以用的招數分為 4 個 原則, 每個原則底下又有 guideline. 主要就是讓使用者可以容易感知, 操作, 了解, 並且穩固.
Perceivable – Information and user interface components must be presentable to users in ways they can perceive.
Operable – User interface components and navigation must be operable.
Understandable – Information and the operation of user interface must be understandable.
Robust – Content must be robust enough that it can be interpreted reliably by a wide variety of user agents, including assistive technologies.

WCAG 2.0 將符合規範的程度 (Conformance Level) 分為 3 級: level A~ level AAA. 不過, 即使是到了最高級的 AAA, WCAG 2.0 也說不能保證沒問題. (“Note that even content that conforms at the highest level (AAA) will not be accessible to individuals with all types, degrees, or combinations of disability, particularly in the cognitive – 認知 language and learning areas.")

至於 ARIA 有 1.0 和 1.1 [3] 兩個版本, 他們描述了如何具體實踐 WAI. 根據 [4], [5], ARIA 最明顯的實現方式在於加入 role 屬性 (landmark roles). 所謂的 role 就是角色, 在既有的 HTML 網頁當中, 額外描述這段 HTML 的功能. 例如: 

  • role=”banner”
  • role=”navigation” (e.g., a menu)
  • role=”main” (the main content of the page)
  • role=”complementary” (e.g., a sidebar)
  • role=”contentinfo” (meta data about the page, e.g., a copyright statement)
  • role=”search”
  • role=”form”
  • role=”application” (a web application with its own keyboard interface)

如果一個網頁中有兩個同樣的 role, 就要進一步用不同的 (aria-)label 來區隔.

  • <div role=”navigation” aria-label=”Main menu”>
  • <div role=”navigation” aria-label=”User menu”>

除了 role 之外, 另外一個特色是多了 state (狀態) 和 property (屬性). 重要的有下面這些:

state 的好處是, 讓使用者可以知道這個控制項的狀態, 例如 aria-checked 的狀態有 true, false, mixed 三種, 我們就知道 checkbox 點了沒有? 至於 propoerty 可以描述一個欄位允許的最大值, 最小值. 這的確也是很重要. State 和 property 的細節, 以及略過不提的其他特點等等, 可多參考中文的 [5], 這裡就先略過了.

最後來看一眼和我們工作有關的部分. 增加了 WAI-ARA 的支援之後, 它需要強大的底層支援, 如果要把文字敘述唸出來給視障的人聽, 系統就要具備文字轉語音 (TTS – Text to Speech) 的能力. 這些基礎建設相當於下圖 (來自[2]) 最右邊的方塊, 這個 Assistive Technology 就是系統要提供的了.

ARIA-Model-1-768x464

[REF]

  1. 建置 無障礙網頁 的小秘訣
  2. WCAG 2.0
  3. Accessible Rich Internet Applications (WAI-ARIA) 1.1
  4. ARIA Landmark Roles
  5. WAI-ARIA 介紹之二
  6. Roadmap for Accessible Rich Internet Applications (WAI-ARIA Roadmap)

FDE 小破解

此處的 FDE 是指 Full Disk Encryption.

根據 [1] 這篇文章, 他在 Qualcomm 的系統中找到了 FED 的漏洞. 下面我把這篇文章的重點摘要出來, 細節就略過了.

首先我們都知道加密需要密碼, 因此好用的方式就是把硬體上的唯一密碼 (unique HW key) 和使用者輸入的密碼 (Passcode key) 做運算, 得到一個沒有人知道的新密碼. 下圖是 Apple iOS 用的方法. (KDF = key derivation function)

Apple’s FDE KDF

試想, 如果我把整個 FLASH (eMMC or SD Card) 裡面的資料都加密了. 那我換了密碼之後, 是否要把整個資料重新加密一遍? 當然不可能, 新的密碼只能用來加密 “File key", 而加密真正資料 (file contents) 的 key 是不變的.

Android 的做法也類似 [2].

Androids-FDE-1-768x487
Android FDE’s KDF
  1. 首先裝置隨機產生一個 16 byte 的 master key (Device Encryption Key – DEK), 然後準備一把鹽巴調味 (16 byte = 128 bit random-generated salt).
  2. 用 user password 加鹽巴 scrypt 出 32 byte (=256 bit) 的中間 key 1 (IK1 = intermediate key 1).
  3. 把 IK1 前面加一個 zero byte, 後面加 233 個 zero byte 墊成 256 bit (padded IK1) , 這是因為裝置上的 key (hardware-bound private key = HBK) 就是 256 byte.
  4. 用 HBK 去sign padded IK1. 產生 256 byte IK2.
  5. 用 IK2 加鹽巴 scrypt 出 32 byte IK3.
  6. 用 IK3 的前 16 byte 當 KEK (key encryption key), 後 16 byte 當 IV ( initialization vector).
  7. 把 DEK 用 AES-CBC 加密, 其中 KEK 和 IV 取材自上一步.

除了這些複雜的 key, iOS 和 Android 都有防止嘗試錯誤的軟體機制, 錯愈多次就要休息愈久. 所以破解方法就要用外部的硬體來做, 這也就是 Android 網頁上 [2] 所說的, 把產生 key 的方法複雜化, 以對抗 off the box 的破解. “In order to make the key resilient against off-box attacks, we extend this algorithm by signing the resultant key with a stored TEE key." 然而, 這樣還是被破了.

在 [1] 當中提到, 破壞的關鍵在於 key master module. 在 TEE (Trusted Execution Environment) 架構裡面, 有安全顧慮的動作, 都會由 REE (rich execution environment, non-secure world) 送到 TEE (secure world), 然後再把結果回傳 REE. Key master 本身長在 secure world, 理論上夠安全才對.

access-to-keymaster

不過, 畢竟 TEE 需要 SW 實作, 所以從 binary code 可以被反組譯, 再搭配公開的 data structure, 就可以找出 HMAC (Keyed-Hash Message Authentication Code) [7]. 下圖中間的 QSEE 就是 Qualcomm Secure Execution Environment. 破解的流程如下:

  • Enable the DACR (ARM 裡面的 Domain Access Control Register) in the TrustZone kernel to allow us to modify the code cave.
  • Write a small shellcode stub in the code cave which reads the keys from the KeyMaster application.
  • Hijack the “qsee_hmac" system-call and point it at our shellcode stub.
  • Call the KeyMaster’s key-generation command, causing it to trigger the poisoned system-call and exfiltrate the keys into the shared buffer.
  • Read the leaked keys from the shared buffer.

All-Android-System

作者認為 FDE 雖然已經被公認是安全可靠加密方式, 但是在 Android + QSEE 的組合之下, 還是被找到了漏洞. QSEE 使用 SHK (hardware key) 衍生的 key 來加密, 作者認為不如直接用 SHK 比較好, 因為 SHK 反而保證是 SW 不能讀取的. 不過在其他的使用案例, 這樣又會有別的問題 [1].

[REF]
1.  Extracting Qualcomm’s KeyMaster Keys – Breaking Android Full Disk Encryption
2.  https://source.android.com/security/encryption/
3.  Nikolay Elenkov’s blog, “Android Explorations"
4. Dan Guido’s superb post about the technical aspects of Apple v. FBI,
5. Matthew Green’s great overview on Apple’s FDE
6. iOS Security Guide
7. https://en.wikipedia.org/wiki/Hash-based_message_authentication_code