60
パッチを書いてみよう masa 2011-07-23 Nseg 17 回勉強会

パッチを書いてみよう(第17回Nseg勉強会LT)

Embed Size (px)

Citation preview

Page 1: パッチを書いてみよう(第17回Nseg勉強会LT)

 

パッチを書いてみよう

masa

2011-07-23 Nseg 第 17 回勉強会

Page 2: パッチを書いてみよう(第17回Nseg勉強会LT)

自己紹介

はてな:http://d.hatena.ne.jp/masa141421356

(id:masa141421356)

Twitter : @masa141421356

ほぼプログラマ。仕様の打ち合わせから実装まで全部やります。

Page 3: パッチを書いてみよう(第17回Nseg勉強会LT)

Firefox のパッチって

どう書くの?

Page 4: パッチを書いてみよう(第17回Nseg勉強会LT)

第1部:パッチを書くのに必要なもの

・Firefox のバイナリをビルドできる開発環境

・bugzill.mozilla.org のアカウント

・ Firefox で使用している技術(C++, JavaScript,

HTML, CSS, XUL, HTTP, etc.)の知識

・ 「ある程度」の英語力

Page 5: パッチを書いてみよう(第17回Nseg勉強会LT)

・作業時間(これ重要)

・ 自分が気になったバグを追いかける根気

1. 開発環境

MDN 開発者ガイド   https://developer.mozilla.org/ja/Developer_Guide

Page 6: パッチを書いてみよう(第17回Nseg勉強会LT)

殆どのツールは OS 付属か

無料ダウンロードで揃う。

SDK 揃えるのが面倒?

ま、ビンゴ揃えるつもりで

 (By Benjamin Smedberg)

http://benjamin.smedbergs.us/blog/2008-04-16/microsoft-header-bingo/

Page 7: パッチを書いてみよう(第17回Nseg勉強会LT)

2. bugzilla.mozilla.org アカウント

メールアドレスがあれば OK

ログインしている人にはメールアドレスが見

えるので、英語 SPAM が嫌いな人は迷惑メー

ル対策の出来るアカウントでやるのがお勧め

Page 8: パッチを書いてみよう(第17回Nseg勉強会LT)

3. 技術の知識

Firefox のソースはコアの部分は C++

UI は XML/HTML + JavaScript + CSS など。

UI 系だと画像を作るだけでよいバグもある

Page 9: パッチを書いてみよう(第17回Nseg勉強会LT)

(bug 414243 誰かやりませんか?)

Page 10: パッチを書いてみよう(第17回Nseg勉強会LT)

そのほかには

Web に関わる各種の標準 (HTTP, HTML,

XML, ECMAScript, CSS 等)

OS の標準的なアプリケーションのガイドラ

インや API の知識

Page 11: パッチを書いてみよう(第17回Nseg勉強会LT)

あと、Mozilla のコーディングスタイルガイ

ドライン。大体周辺のコードのスタイルに合

わせれば OK。

技術を全部知っていなくてもパッチは書け

る。

Page 12: パッチを書いてみよう(第17回Nseg勉強会LT)

4. 「ある程度」の英語力

 bugzilla.mozilla.org のディスカッションは

基本的に英語

Page 13: パッチを書いてみよう(第17回Nseg勉強会LT)

技術的な話だけのディスカッションの

場合はそれほど難しい言葉は出てこない

(専門用語は別)。

簡単に直せるバグは説明や議論に使われ

る単語や言い回しも簡単なことが多い。

Page 14: パッチを書いてみよう(第17回Nseg勉強会LT)

仕様や設計思想に関わるディスカッション

  ↓難しい話や慎重な議論が必要なものは、

必然的に使われる言葉が難しくなる

Page 15: パッチを書いてみよう(第17回Nseg勉強会LT)

結論が明らか(直したほうが良いことが明

らかなバグ)

   ↓

大体使われている単語も簡単

Page 16: パッチを書いてみよう(第17回Nseg勉強会LT)

Typo は?

あっても大丈夫。でも、スペルチェッカーは有

効にしておくことは推奨。それだけでかなりミ

スが減る。

誤解を生むような typo はすぐに訂正を入れれ

ばよい(コメントを取り消せないことはみん

な知っているので)。

Page 17: パッチを書いてみよう(第17回Nseg勉強会LT)

今の自分の目標

 1つも typo をせずにバグ登録か

ら修正完了までの処理を完了する

こと

Page 18: パッチを書いてみよう(第17回Nseg勉強会LT)

5. 作業時間

自分の場合は夜と休日の空き時間。

家庭も大事。休みの日全部をつぎ込むと理解が

得られなくなる。

実質的には土日で合計半日が限界。

Page 19: パッチを書いてみよう(第17回Nseg勉強会LT)

でも、何もしないのと少しでも手を動かすのは

全然違う。

Page 20: パッチを書いてみよう(第17回Nseg勉強会LT)

6. 気になったバグを追いかける根気

興味を持った分野のバグか自分の見つけたバ

グが追いやすい。

Page 21: パッチを書いてみよう(第17回Nseg勉強会LT)

興味のある分野・主力分野を突付く。

・Windows の High Contrast で UI 部品の色が周囲と同じ

になって見えないバグ

・URL に変な文字を突っ込むとブラウザが誤動作する

・実質的に Web アプリと見なせるもののセキュリティ

Page 22: パッチを書いてみよう(第17回Nseg勉強会LT)

第 2 部:実際に直してみよう

 実例(bug 660612)を参考に

Page 23: パッチを書いてみよう(第17回Nseg勉強会LT)

1.直すべき場所の見当をつける

・ 機能から想像される変数名でソース検索

MXR で検索できる( http://mxr.mozilla.org/ )

  例:フォントの高さがウィンドウサイズより高い場合にページ

スクロールの量が極端に少ない(bug 383267)

    → fontHeight でソース検索

Page 24: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 25: パッチを書いてみよう(第17回Nseg勉強会LT)

・ 問題となる箇所に固定文字列があればそれでソースを検索する。

・ UI 系は DOM Inspector で見当をつけて、userChrome.css で試

してみる。

・ 国際化された文字列なら、リソースを検索してリソース名からあ

たりをつける

・ 自分が過去にパッチを書いたことがある部分は想像がつく

・ ディスカッション中にヒントが見つかることも

Page 26: パッチを書いてみよう(第17回Nseg勉強会LT)

・ bug660612 の場合

bug660612 : Utf8ToOneUcs4Char passes invalid UTF-8 octets '%ED%A0%80', so decodeURIComponent('%ED%A0%80') doesn't throw

知ったきっかけは @Constellation さんのつぶやき

Page 27: パッチを書いてみよう(第17回Nseg勉強会LT)

後日バグの詳細がはてなへ

http://d.hatena.ne.jp/Constellation/20110530/1306759498

Page 28: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 29: パッチを書いてみよう(第17回Nseg勉強会LT)

問題のコード http://hg.mozilla.org/mozilla-central/file/e0ca895fde7e/js/src/jsstr.cpp#l5977

Page 30: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 31: パッチを書いてみよう(第17回Nseg勉強会LT)

何故特定できたか?

 →以前パッチを書いた場所

Page 32: パッチを書いてみよう(第17回Nseg勉強会LT)

http://hg.mozilla.org/mozilla-central/annotate/e0ca895fde7e/js/src/jsstr.cpp#l5977

Page 33: パッチを書いてみよう(第17回Nseg勉強会LT)

2. 直してビルド

  手元のソースを修正してビルドする。

  

元の改行コードと文字コードを維持できる

エディタが必要(LF改行対応必須)

Page 34: パッチを書いてみよう(第17回Nseg勉強会LT)

3.意図どおりに直ったかテスト

 どうやってテストする?↓

バグに添付されたテストケースで試す。

  ↓

良質なテストケースが無いと検証不能

  ↓

良いテストケースを書ける人は高評価

Page 35: パッチを書いてみよう(第17回Nseg勉強会LT)

4.リグレッションのチェック

他の機能へ影響が大きそうな場合は慎重に。

 

自動テストがある機能はテストを走らせて見る

Page 36: パッチを書いてみよう(第17回Nseg勉強会LT)

5.可能なら自動テストも書く

・自動テストが書いてあると話が早い

・リグレッションがあった時に Tinderbox が

炎上してすぐにわかる

   ↓

 テストを書いて通るのを確認!!

Page 37: パッチを書いてみよう(第17回Nseg勉強会LT)

6.パッチをアップロード

・自動テストの配置するべき場所に自身が無

・なぜか hg diff で追加ファイルのパッチが出

ない

    ↓

jsstr.cpp は修正パッチとして登録

Page 38: パッチを書いてみよう(第17回Nseg勉強会LT)

テストは単独ファイルで添付

Page 39: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 40: パッチを書いてみよう(第17回Nseg勉強会LT)

テストは長いので省略

Page 41: パッチを書いてみよう(第17回Nseg勉強会LT)

7.レビュー

レビュワーは誰にするか

・ガイドラインは MDN に書いてある

・CVS Blame や Hg Blame で自分が直した

場所にその前に手を入れたバグを探して、パ

Page 42: パッチを書いてみよう(第17回Nseg勉強会LT)

ッチのレビュワーを探す

Page 43: パッチを書いてみよう(第17回Nseg勉強会LT)

 今回は、前にパッチを書いたときと同じ

Jeff Waldenさんにした

Page 44: パッチを書いてみよう(第17回Nseg勉強会LT)

8.指摘事項のある r+とコメント

Page 45: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 46: パッチを書いてみよう(第17回Nseg勉強会LT)

9.指摘対応その1

指摘事項

・自分なら2つの if を1つにまとめるね

・テス ト は decodeURIComponent("%ED%A0%80") が

URIError を投げることのチェックだけにして、余計なもの

を削って、js/src/tests/ecma_5/Global に置いてください。

Page 47: パッチを書いてみよう(第17回Nseg勉強会LT)

 相変わらず hg diff で追加ファイルがパッチに

出ないので、仕方なくテストは手作業でパッチ

に変換。

 パッチは変換ミスがあったので後で差異アッ

プロード

Page 48: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 49: パッチを書いてみよう(第17回Nseg勉強会LT)
Page 50: パッチを書いてみよう(第17回Nseg勉強会LT)

10.指摘対応その2と 3

 だいたいそのままなので日本語訳省略

Page 51: パッチを書いてみよう(第17回Nseg勉強会LT)

ここでようやく

をしないとパッチに新規ファイルが乗らないことに気づく

(MDN に書いて欲しい)

hg add ファイル名

Page 52: パッチを書いてみよう(第17回Nseg勉強会LT)

書き直した部分

Page 53: パッチを書いてみよう(第17回Nseg勉強会LT)

ここで 1 つミスをした。

指摘内容と比べてみよう

Page 54: パッチを書いてみよう(第17回Nseg勉強会LT)

( )の数がコメント内容と違ってます…orz

この指摘と修正を経てようやくコメントなし

Page 55: パッチを書いてみよう(第17回Nseg勉強会LT)

r+がつきました。

Page 56: パッチを書いてみよう(第17回Nseg勉強会LT)

11.チェックインへ

コミッタじゃない人はチェックインできない

ので誰かにチェックインしてもらう

Page 57: パッチを書いてみよう(第17回Nseg勉強会LT)

このコメントと一緒に

checkin? をセット

この間で checkin+ になった

Page 58: パッチを書いてみよう(第17回Nseg勉強会LT)

12.フォロー・セキュリティホールなど、現行バージョンの

修正を検討するべきバグだった場合

    ↓

フラグやコメントで現行バージョンへの投入

が必要かどうか相談する

同じパッチが使えない場合は、各ブランチ用に

パッチを書く。

Page 59: パッチを書いてみよう(第17回Nseg勉強会LT)

・Seamonkey も気にする。

 ブラウザ固有機能のバグなどでは、Firefox と

ほぼ同じコードが Seamonkey にも存在す

ることも多いので、そちらのケアもする。

   

・Rhino も気にする

Page 60: パッチを書いてみよう(第17回Nseg勉強会LT)

JavaScriptエンジンの場合は Rhino もチェ

ックしておく

  Question?