Gerrit 帳號小註解

有些人應該也遇到過這個問題: 編 Android 的主機與 Gerrit 主機的帳號不一樣, 導致認證失敗. 前年我在 Gerrit 叫做 cashc, 但是我在編 code 的 Linux server 有時叫 cash, 有時叫 cashchou, 於是上述的冏事就發生了. 當時查了一些資料才搞定, 但這個痛過一年後就忘了, 連要用哪幾招都變生疏了. 最近公司也有人遇到, 我想我還是詳細地記錄下來比較好, 如此才能舉一反三 – 別人問一步, 我可以直接回答三步.

第一步就是在編 code 的 server 製作符合 Gerrit server 的 RSA 公鑰. 因為 gerrit 通常都是公司架設的, 就算是自己部門架設的, 也會引用公司 domain 的帳號密碼. 因此我們的 RSA key 要設成公司 email address. 假設您在公司的帳號是 username@companyname.com, Gerrit server 是 gerrit.companyname.com, port 是 29418.

ssh-keygen -C"username@companyname.com" -t rsa

此時把 ~/ssh/id_rsa.pub 貼到 Gerrit 接收的 key 的公鑰的欄位, Gerrit 就可以接受這把 key 的私鑰. 若設定都沒有錯誤, ~/ssh/id_rsa.pub 的最後一行就是 username@companyname.com.

第二步是對 Gerrit server 做 repo init. 舉例來說:

export MANIFEST_REPO=ssh://username@gerrir.companyname.com:29418/github/manifests

export MANIFEST_BRANCH=jb-dev

export MANIFEST_FILENAME=jb-20130405.xml

repo init -u ${MANIFEST_REPO} -b ${MANIFEST_BRANCH} -m ${MANIFEST_FILENAME}

第三步是 repo sync. 第一次做 repo sync 相當於 git clone. 由於 sync 的時候是用 .repo/manifest.xml. 所以要去手動修改這個檔案的內容, 把所有

<remote fetch="ssh://gerrit.companyname.com:29418" …

都改成  

<remote fetch="ssh://username@gerrit.companyname.com:29418" …

改完這三步就可以正確做完 repo sync.

不過, 故事還沒完. 因為您已經改過 manifest.xml 了, 下次再 repo sync, 系統就會提醒您有一個修改沒有 check in. 比較笨的方法就是每次都把原始的 manifest.xml 存起來 (rename 即可), 等到手動改的 manifest.xnl 做完 repo sync, 再回存舊版. 

一般來說, 如果 sync repo 失敗, 可以到有衝突的目錄做 git stash 保存現場. 等 repo sync 通過之後, 再 git stash pop 把自己的版本叫出來, 以便手動 merge code.

比較先進的 hack 方法是忽略掉我們對 manifest.xml 這個檔案的修改. 把永遠忽略的檔案加入 .gitignore, 以後 commit 就不會包含這個檔案, 但這不是這個狀況下所需要的. 我們現在只求忽略當前本地的 repository 就好, 因此可以把這個檔案加入 .get/info/exclude. 如此一來, 就不會失手把只適用自己的 manifest.xml 上傳到 git sever.

像我本身只編 code 來測試, 不改 code, 甚至可以忽略掉全部在本地端的修改. 此時可以用 git reset –hard HEAD 恢復到前一版.

[ref]

1. Repo 和 git 版本管理常用命令

2. 如何正确的repo sync?

MBP 不能安裝 dmg 檔的死循環

這個標題看起來有點冗長, 不過個人覺得還滿貼切的.

我在 Apple 的 MacBook Pro 上, 已經很久都不能用 Safari 下載 dmg 檔來安裝新的軟體了. 不過, 除了 dmg 檔之外的檔案, 倒是可以正常下載沒問題, 所以一度也懷疑過是否與防毒軟體或安全性之類的設定有關? 幾次上網爬文之後, 我發現這是個 “罕見疾病". 偶而看到一個同病相憐的人, 鄉民們總是三緘其口或顧左右而言他, 沒有人能對症下藥.

今天再次遇到這個問題時, 決定仔細看一下設定值是否有問題?畢竟改用 Opera 的時候是可以下載 dmg 的, 問題應該還是出在 Safari 的設定上. 其實, Safari 可以調整的地方還真是少, 滑鼠移來移去也找不出嫌疑犯. 好不容易才僥倖在 “輔助說明" 下面看瞄到 “已安裝的外掛模組" 這個名詞, 才想到或許有點玄機. 點進去之後, 果然看到下載 dmg 的功能原來已經被 igetter 這個 plugin 接管了.

我的解決方式是: 先用 Finder 找到 3 個 igetter 的檔案, 然後把它們全部丟進垃圾桶. 從此以後, Safari 就可以正常 download dmg 檔並且加以安裝了. 看起來這完全是 plugin 相容性的問題. 照理說, 只要到 igetter 的網站更新版本就可以解決. 不過 igetter 的更新檔也是個 dmg 的格式, 這就冏了 – 它是個死循環 (dead lock), 不把 igetter 砍掉還不行. 另一方面, 將它砍掉後, 應該沒有什麼副作用. 那麼, igetter, 我們就這樣掰了吧! 

ARM 的 Trust Zone 小註解

ARM 公司推了一個安全機制叫做 trust zone, 基本上它和一個跨平台的類似規範 Global Platform [1] 差不多. ARM 的基本資料都可以在 ARM 的網站免費下載, 但是進階的資料或是 global platform 的資料都需要註冊後才能取得.

ARM 的 trust zone 共分為三級, 其中最高的一級 tier 3 長這樣. 

圖片來自 http://www.arm.com/products/processors/technologies/trustzone.php

我們可以看到在記憶體的部分, 多數都用 TZMA (trust zone memory adapter) 或是 TZASC (trust zone address space controller)  的褐色方塊隔離起來. 除了 FLASH 這個框框, 被當作是沒有安全顧慮的模組之外 – 比方說使用者在手機上外接的 macro SD 卡. 而每個記憶體又都有自己的規範編號, 比方說 bus 的規範是 PL301, DMA 是 PL330, SDRAM 是 PL340, FLASH 是 PL350 等等.  在 trust zone security white paper [1] 裡面, 還提到 TZASC 是 PL380, GIC (generic interrupt controller) 是 PL390, TZMA 是 BP141 等等.

諸如 PL350 的規格, 裡面似乎都沒有特別強調加密或是保護的機制. 特別需要規範的硬體模組主要就是 TZMA 和 TZAC 了. 其中定址空間可以固定出保密與非保密地址空間的模組 (如 ROM) 以 TZMA 隔離; 保密與非保密資料可能儲存在任意地址空間的模組 (如 RAM) 以 TZASC 隔離.

[ref]

1. http://www.globalplatform.org/

2. Building a Secure System using TrustZone® Technology

Subtitle 時間格式小整理

以前有一陣子需要解字幕檔的問題, 所以稍微看了一下相關的東西. 根據網站上的說法 [1], 至少有這麼多種字幕格式存在.

  • Adobe Encore DVD (*.txt)
  • Advanced SubStation Alpha (*.ass)
  • AQTitle (*.aqt)
  • Captions 32 (*.txt)
  • Captions DAT (*.dat)
  • Captions DAT Text (*.dat)
  • Captions Inc. (*.txt)
  • Cheetah (*.asc)
  • CPC-600 (*.txt)
  • DKS Subtitle Format (*.dks)
  • DVD Junior (*.txt)
  • DVD Subtitle System (*.txt)
  • DVDSubtitle (*.sub)
  • FAB Subtitler (*.txt)
  • IAuthor Script (*.txt)
  • Inscriber CG (*.txt)
  • JACOSub 2.7+ (*.jss; *.js)
  • Karaoke Lyrics LRC (*.lrc)
  • Karaoke Lyrics VKT (*.vkt)
  • KoalaPlayer (*.txt) (equal to one of the variations of TMPlayer)
  • MAC DVD Studio Pro (*.txt)
  • MacSUB (*.scr)
  • MicroDVD (*.sub)
  • MPlayer (*.mpl)
  • MPlayer2 (*.mpl)
  • MPSub (*.sub)
  • OVR Script (*.ovr)
  • Panimator (*.pan)
  • Philips SVCD Designer (*.sub)
  • Phoenix Japanimation Society (*.pjs)
  • Pinnacle Impression (*.txt)
  • PowerDivX (*.psb)
  • PowerPixel (*.txt)
  • QuickTime Text (*.txt)
  • RealTime (*.rt)
  • SAMI Captioning (*.smi)
  • Sasami Script (*.s2k)
  • SBT (*.sbt)
  • Sofni (*.sub)
  • Softitler RTF (*.rtf)
  • SonicDVD Creator (*.sub)
  • Sonic Scenarist (*.sst)
  • Spruce DVDMaestro (*.son)
  • Spruce Subtitle File (*.stl)
  • Stream SubText Player (*.sst)
  • Stream SubText Script (*.ssts)
  • SubCreator 1.x (*.txt)
  • SubRip (*.srt)
  • SubSonic (*.sub)
  • SubStation Alpha (*.ssa)
  • SubViewer 1.0 (*.sub)
  • SubViewer 2.0 (*.sub)
  • TMPlayer (*.txt) (five different variations)
  • Turbo Titler (*.txt)
  • Ulead DVD Workshop 2.0 (*.txt)
  • ViPlay Subtitle File (*.vsf)
  • ZeroG (*.zeg)

想要每個都搞懂, 難度有點高. 當時整理了一小部分就放棄了. 不過今天把它挖出分享給大家. 或許我會有動力把它補到完.

格式名稱 副檔名 格式 說明
txt .txt 02:04:32:The End 起始時間(時:分:秒:毫秒) + 內容
sub

.sub

.txt

{4387}{4433}Bye! {起始時間}{結束時間} + 內容
Subripper srt

45

00:02:52,184 –> 00:02:53,617

慢慢来

順序

起始時間 —> 結束時間 

內容

時間的格式 = 00:00:00,000 (時 :分 : 秒: 毫秒)

SubStation Alpha ssa Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Start or End 的格式 = 0:00:00:00(時:分:秒:百分秒), 注意:小時只有一位數
Advanced SubStation Alpha ass
PSB(Power Divx) psb {0:00:47}{0:00:51}Hello, world!

{起始時間的時:分:秒}{結束時間時:分:秒} + 內容

DVD Subtitle
圖形, 以 run-length 壓縮存在碼流中.
Subtitle ID為 0x20 + 0~31, DVD 可以有 32 個 subtitle [4].

[ref] 

1. http://www.divx-digest.com/software/subtitle_workshop.html

2. http://www.6psp.cn/20100714/ssa-ass字幕格式全解析.html

3. http://www.allsubs.org/

4. http://sam.zoy.org/writings/dvd/subtitles/

TDLS 小註解

此處的 TDLS 是指 Tunneled Direct Link Setup, 中文名稱叫做隧道直接鏈結設置. 

它有什麼用處呢?它能夠讓兩個 WIFI devices 不透過 AP (access point) 就能互傳資料. 畢竟裝置 A 傳給 AP, AP 再傳給裝置 B 這條路徑還是有點長; 如果省掉中間人, 效率就會增加. 這原理跟直銷差不多!   

好!那麼兩個裝置怎麼互相認識對方呢?一般來說, 他們還是需要先上 facebook 交朋友, 透過 AP 當介紹人才行. 此時由 TDLS 的裝置 A 發起 discovery, 再由 AP 牽線找到 TDLS 裝置 B. 裝置 A 可以比較究竟是透過 AP 傳? 還是直接對裝置 B 傳比較有效率?不過, TDLS 裝置 A 也可以跳過 "比較" 這一步, 直接進到下一步 TDLS 設置 (setup).

TDLS 建立 link 時, 由裝置  A 發出訊息給裝置 B (TDLS setup), B 如果接受這個 link, 就會回覆 confirm frame. 雙方加密用的 key 的交換就發生在 setup 的階段. 如果任何一方想要斷線, 可以逕自送出 teardown frame. 萬一裝置間失聯了, 他們也可以把訊息送給 AP 代為轉達.

比較複雜的案例是某個裝置休眠了, 或是他們想切換通訊頻道 (5GHz 切到 2.4GHz 或反之). 若 AP 不希望它的 client 私下透過 TDLS 傳東西, 可以禁用 TDLS. 

若是有了 TDLS, 偷偷攻擊麥當勞裡面坐在旁邊的外行的客人相對就容易多了, 此時還是禁用掉比較不會出事. 客人們想要用 TDLS 分享資料的話, 拿一台手機出來當 AP 就可以自行解決了.

[ref]

1. Wi-Fi CERTIFIED™ TDLS – Wi-Fi Alliance