- ベストアンサー
パッチの作り方
おはようございます。 ふと疑問に思ったのですが、 パッチ(patch)って、どうやって作るのでしょうか? 今、C#でプログラムを書いているのですが、 修正が必要になった場合、パッチの方が効率的ですよね。 ただ、その作り方がまったく検討がつきません。 ソースコードは自分で持っている場合、相違点・追加点はわかるとは思いますが、 それをどうやってパッチのファイルにして、適用させるのでしょうか? その仕組みとか載っているサイトはないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>例えば、ソースにファイルの参照先を埋め込んであったとします >リビルドはSDKがなくてもできるのかな? その場合、exeファイルのどこかにファイルの参照先が テキストデータとして入っているわけですが DPマッチングを利用して変更箇所を更新するしかないでしょう。 バイナリエディタでみれば、\\C\aaa.csvがどっかにみつかると 思うのでその部分を取り替えても動くかもしれません (その場合文字列の長さが変わるのはまずいのであらかじめ固定長でとっておく。) 考えられる方法として aaa.exe(旧バージョン)をコピー tmp.exeにし tmp.exe とPacherのDPマッチングの情報を元に aaa.exe(新バージョン)を作成することになります。 ただアルゴリズム的には可能ですが、実際そういう方式でパッチを配布したものを 私は知りません。実行ファイルが肥大化するようなら、 リソース(この場合「\\C\aaa.csv」のテキストデータ)を 別ファイルにした方が現実的でしょうし。
その他の回答 (4)
- rot-N
- ベストアンサー率27% (118/432)
まず、パッチ当てというのは、20年以上前の組み込みの世界でROMのバイナリしかなかった時代、命令をちょっとJUMP命令に置き換え、ROM内の空いている部分に分岐して、そこで処理をしてから元に戻るとか、10年以上前のパソコン通信で回線が遅かった時代、差分だけを配布するとか、そういう時代の遺物です。使うのはヤメましょう。 パッチを当てると、そのうちに、どの様にあてたのか判らなくなります。 回線が速くなった現在、ソースコードの可読性が一番大事なので、最新版のExeを常に配布した方が良いです。
お礼
お礼が遅くなり失礼いたしました。 >回線が速くなった現在、ソースコードの可読性が一番大事なので、最新版のExeを常に配布した方が良いです。 確かにそうですね。 回線が繋がっていることにより、そのような運用にできますものね。 今回は、プログラムを作っていて、ふと疑問に思ったので質問したことでしたが、 質問して良かったと思います。 ありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
CRCとはファイルの指紋といえばわかりやすいでしょうか。 ファイルが破損していないか調べたりするときにも使います。 CRCの検出方法にもいろいろ種類があり、CRC値は16bitだったり32bitだったりします。 もちろん16ビットは65536通りなので、違うファイルでも合致する可能性が少なからずあり 完璧ではありません。 http://page.freett.com/seaside/vip/crc/ErrDetCod.htm 次にDPマッチングの説明 DPはダイナミックプログラミングの略ですが 「あいうえお」という文字列と「あいくえお」と文字列を比較するなら 「う」の部分が「く」になっているとプログラム的に簡単に作成できると思います。 では「あいうえお」と「あいきお」のように違う長さの文字列ではどうでしょうか この場合「うえ」の部分が「き」に置き換わっているのは わかりますが、それをプログラムで組むとわりと 難しいと思います。 もちろん全パターンを検索すればいいのですが、文字数が増えれば 計算量が半端ではありません。 それを少ない計算量で「うえ」の部分が「き」に置き換わっていることを 調べるアルゴリズムのひとつを「DPマッチング」といいます。 http://sail.i.ishikawa-nct.ac.jp/pattern/dp/dp.html 簡単な方法として あるソフトver1.00があったとして それを1.01にするpacherを作るとするなら 1.00と1.01の変更点のあるファイルをまとめ 1.00のフォルダに上書きするだけです。 パッチが1.00→1.02と1.01→1.02では違うpacherである ソフトもよくみかけます。 当然1.00→1.02の方が1.01→1.02と比べ 変更部分が多いのでサイズも大きくなります。
お礼
sha-girlさん、再びの回答ありがとうございます。 各参考URLありがとうございます。 チェックディジット(サム)と同等のものがプログラミングするときにも出てくるんですね。 バーコードとかでも使われていますよね?確か・・・ DPマッチングの方は、参考URLに算数が出てきたので、一瞬ひきましたが、sha-girlさんの説明でわかりました。 >簡単な方法として あるソフトver1.00があったとして >それを1.01にするpacherを作るとするなら >1.00と1.01の変更点のあるファイルをまとめ >1.00のフォルダに上書きするだけです。 ファイル単位で差分があった場合は、これで大丈夫とわかるのですが、 ソースの内部レベルでの変更だとどうなるのかな? ということで、まだ疑問が残ります。 例えば、ソースにファイルの参照先を埋め込んであったとします。(\\C\aaa.csv) この参照先が変わった場合(\\C\hoge\aaa.csv)、どうなるのかな?ということです。 .Netですと、ソリューションをビルドしてexeとなった中間ファイルをクライアントが利用することとなりますが、リビルドはSDKがなくてもできるのかな?ということです。 理解力が低くて申し訳ありませんが、 再び回答を付けてくだされば幸いです。
- sha-girl
- ベストアンサー率52% (430/816)
ゲーム開発をしているものです。 パッチといっても方法は色々あります。例えばですが ・パッチサーバーなどに接続する場合ならCRCチェックを行い、違う箇所の修正を行う。 ・開発者は変更箇所のファイルはわかっているわけですから、そのファイルのみ入れ替え。(差分パッチ) ・バージョン情報を保持しておき差分情報をプログラム内であらかじめもっておく。 ※あまりやらないと思いますが、単一ファイルに関してもdiffのようにDPマッチングを行い バイナリレベルで変更箇所を書き換えていくパッチも作ろうと思えば可能です。 簡潔にいえば旧バージョンとの変更箇所を入れ替えるプログラムがパッチです。 google等で「差分パッチ」で検索すればそのようなプログラムはいっぱいひっかかります。 >パッチの方が効率的ですよね。 必ずしもそうとは限りません。実行ファイルが100kにも満たないものに、Patcherをつくっても Patcherのサイズの方が大きくなる可能性があります。
お礼
sha-girlさん、回答ありがとうございます。 パッチの仕方もいろいろあるのですね。 せっかく書いていただいたのですが、「CRCチェック」とはなんでしょう? 「DPマッチング」も今回はじめて聞きました。 NET上で調べても、なかなか難しい解説が載っていました(^_^;) googleで「差分パッチ」も検索してみたのですが、 588件もHitしてしまい、最初の数ページで挫折しました。 でも、今回質問したおかげで、どういった方向性(単語?)について追いかけていけば良いかつかめた感じがしますので、参考になりました。 ひょっとしたら、「プログラムはどうやって動く?」ぐらいのところまで戻らねばならない気もしますが。。。 >Patcherのサイズの方が大きくなる可能性があります。 そういうものなのですね。 プログラムの世界もなかなか簡単にはいかない世界ですね。 ありがとうございます。
diff/patch Tips http://www.sip.eee.yamaguchi-u.ac.jp/kou/diff-patch.html diffで差分を取ってpatchで適用します。
お礼
mihanoさん、回答ありがとうございます。 >diffで差分を取ってpatchで適用します。 参考URLも読みましたが、僕には少々難易度が高いようです。 Cygwinをインストールすれば、手っ取り早いと書いてありましたが、 Cygwinをインストールして、使えるようにするまでが大変な時間が必要な気がしています。 この機能(ソフト?)を使えば、差分ファイルができるということはわかりましたが、 まだ一度できてしまったexeにどうして適用されるのか、疑問が残っているので、 もうちょっと調べてみます。 ありがとうございます。
お礼
何度もありがとうございます。 バイナリエディタで確認して変更という手もあるんですね。 >実行ファイルが肥大化するようなら、 >リソース(この場合「\\C\aaa.csv」のテキストデータ)を >別ファイルにした方が現実的でしょうし。 ふむふむ、そうですよね。という感じです。 こういうことを考えると(今回はたまたま気になっただけなんですが)、プログラミング段階での設計が後々に影響することを考えておかないといけないんですね。 なんか、今日は良いことを知った気がします。 まだまだ知り始めたばかりだけれども、勉強を続けてみます。 一日お付き合いくださり、ありがとうございます。