• ベストアンサー

パッチの作り方

おはようございます。 ふと疑問に思ったのですが、 パッチ(patch)って、どうやって作るのでしょうか? 今、C#でプログラムを書いているのですが、 修正が必要になった場合、パッチの方が効率的ですよね。 ただ、その作り方がまったく検討がつきません。 ソースコードは自分で持っている場合、相違点・追加点はわかるとは思いますが、 それをどうやってパッチのファイルにして、適用させるのでしょうか? その仕組みとか載っているサイトはないでしょうか?

  • kenton
  • お礼率74% (110/148)

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

>例えば、ソースにファイルの参照先を埋め込んであったとします >リビルドはSDKがなくてもできるのかな? その場合、exeファイルのどこかにファイルの参照先が テキストデータとして入っているわけですが DPマッチングを利用して変更箇所を更新するしかないでしょう。 バイナリエディタでみれば、\\C\aaa.csvがどっかにみつかると 思うのでその部分を取り替えても動くかもしれません (その場合文字列の長さが変わるのはまずいのであらかじめ固定長でとっておく。) 考えられる方法として aaa.exe(旧バージョン)をコピー tmp.exeにし tmp.exe とPacherのDPマッチングの情報を元に aaa.exe(新バージョン)を作成することになります。 ただアルゴリズム的には可能ですが、実際そういう方式でパッチを配布したものを 私は知りません。実行ファイルが肥大化するようなら、 リソース(この場合「\\C\aaa.csv」のテキストデータ)を 別ファイルにした方が現実的でしょうし。

kenton
質問者

お礼

何度もありがとうございます。 バイナリエディタで確認して変更という手もあるんですね。 >実行ファイルが肥大化するようなら、 >リソース(この場合「\\C\aaa.csv」のテキストデータ)を >別ファイルにした方が現実的でしょうし。 ふむふむ、そうですよね。という感じです。 こういうことを考えると(今回はたまたま気になっただけなんですが)、プログラミング段階での設計が後々に影響することを考えておかないといけないんですね。 なんか、今日は良いことを知った気がします。 まだまだ知り始めたばかりだけれども、勉強を続けてみます。 一日お付き合いくださり、ありがとうございます。

その他の回答 (4)

  • rot-N
  • ベストアンサー率27% (118/432)
回答No.5

まず、パッチ当てというのは、20年以上前の組み込みの世界でROMのバイナリしかなかった時代、命令をちょっとJUMP命令に置き換え、ROM内の空いている部分に分岐して、そこで処理をしてから元に戻るとか、10年以上前のパソコン通信で回線が遅かった時代、差分だけを配布するとか、そういう時代の遺物です。使うのはヤメましょう。 パッチを当てると、そのうちに、どの様にあてたのか判らなくなります。 回線が速くなった現在、ソースコードの可読性が一番大事なので、最新版のExeを常に配布した方が良いです。

kenton
質問者

お礼

お礼が遅くなり失礼いたしました。 >回線が速くなった現在、ソースコードの可読性が一番大事なので、最新版のExeを常に配布した方が良いです。 確かにそうですね。 回線が繋がっていることにより、そのような運用にできますものね。 今回は、プログラムを作っていて、ふと疑問に思ったので質問したことでしたが、 質問して良かったと思います。 ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

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と比べ 変更部分が多いのでサイズも大きくなります。

kenton
質問者

お礼

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)
回答No.2

ゲーム開発をしているものです。 パッチといっても方法は色々あります。例えばですが ・パッチサーバーなどに接続する場合ならCRCチェックを行い、違う箇所の修正を行う。 ・開発者は変更箇所のファイルはわかっているわけですから、そのファイルのみ入れ替え。(差分パッチ) ・バージョン情報を保持しておき差分情報をプログラム内であらかじめもっておく。 ※あまりやらないと思いますが、単一ファイルに関してもdiffのようにDPマッチングを行い バイナリレベルで変更箇所を書き換えていくパッチも作ろうと思えば可能です。 簡潔にいえば旧バージョンとの変更箇所を入れ替えるプログラムがパッチです。 google等で「差分パッチ」で検索すればそのようなプログラムはいっぱいひっかかります。 >パッチの方が効率的ですよね。 必ずしもそうとは限りません。実行ファイルが100kにも満たないものに、Patcherをつくっても Patcherのサイズの方が大きくなる可能性があります。

kenton
質問者

お礼

sha-girlさん、回答ありがとうございます。 パッチの仕方もいろいろあるのですね。 せっかく書いていただいたのですが、「CRCチェック」とはなんでしょう? 「DPマッチング」も今回はじめて聞きました。 NET上で調べても、なかなか難しい解説が載っていました(^_^;) googleで「差分パッチ」も検索してみたのですが、 588件もHitしてしまい、最初の数ページで挫折しました。 でも、今回質問したおかげで、どういった方向性(単語?)について追いかけていけば良いかつかめた感じがしますので、参考になりました。 ひょっとしたら、「プログラムはどうやって動く?」ぐらいのところまで戻らねばならない気もしますが。。。 >Patcherのサイズの方が大きくなる可能性があります。 そういうものなのですね。 プログラムの世界もなかなか簡単にはいかない世界ですね。 ありがとうございます。

noname#9119
noname#9119
回答No.1

diff/patch Tips http://www.sip.eee.yamaguchi-u.ac.jp/kou/diff-patch.html diffで差分を取ってpatchで適用します。

kenton
質問者

お礼

mihanoさん、回答ありがとうございます。 >diffで差分を取ってpatchで適用します。 参考URLも読みましたが、僕には少々難易度が高いようです。 Cygwinをインストールすれば、手っ取り早いと書いてありましたが、 Cygwinをインストールして、使えるようにするまでが大変な時間が必要な気がしています。 この機能(ソフト?)を使えば、差分ファイルができるということはわかりましたが、 まだ一度できてしまったexeにどうして適用されるのか、疑問が残っているので、 もうちょっと調べてみます。 ありがとうございます。

関連するQ&A

  • solarisへのパッチ適用

    solarisへのパッチ適用ですが、良い方法を検討してます。 ・オーソドックスに、Recommended Patch を手動で適用 ・smpatchを利用する の2つの方法がありますが、メリット、デメリットを教えてください。 また、上記以外に良い方法はありますでしょうか?

  • ServicePack適用後の修正パッチ適用について

    よろしくお願いします。 長い間修正パッチの適用がされないまま運用されていたWindows2003Serverがあります。 (詳細な状態としては、サービスパックは適用されておらず、  2006年7月頃までは修正パッチが個別に適用されています。) セキュリティを最新の状態にしたいのですが、 サービスパックと修正パッチの関係がいまいち理解できておらず、 適用手順について悩んでいます。 最新のServicePack2を適用すれば、ServicePack2リリース以前に公開された修正パッチは適用する必要は無いのでしょうか?  →yesの場合   1.既に適用されている修正パッチをアンインストールする必要は無いのでしょうか?  →noの場合   1.どのような順番でインストールすれば良いのでしょうか? また、サーバーへのサービスパック適用に関して アドバイス等ありましたら教えていただけると助かります。

  • .NETFramework4のパッチの適用確認

    【環境】 OS:WindowsServer 2008 R2 SP1 DB:SQL Server 2008 R2 Standard Edition SP2(x64) .NetFramework3.51 .NetFramework4 【状況】 .NET Framework 3.51のセキュリティパッチ(KB3074543)を適用した場合は、「プログラムと機能」-「インストールされた更新プログラムを表示」に表示されます。 しかし、 .NET Framework4のセキュリティパッチ(KB3074547)を適用した場合、「プログラムと機能」-「インストールされた更新プログラムを表示」に表示されません。 「WindowsUpdate.log」にも「systeminfo」にも「KB3074547」の文字列はありません。 【ご教示頂きたい点】 この状態で「KB3074547が適用されているかどうかは、適用した直後に「イベントビューアー」-「アプリケーションログ」に出る下記のような メッセージを確認する以外に方法はないでしょうか。 ---------------------------------------------------------------------------------- レベル:情報 ソース:MsiInstaller イベントID:1035 説明:Windowsインストーラーにより製品が再構成されました。製品名:Microsoft .NET Framework 4 Client Profile、製品バージョン4.0.30319、 製品の言語:0、製造元:Microdoft Corporation、最高性の成功またはエラーの状態: 0 ------------------------------------------------------------------------------------ これしか方法がない場合、適用した直後に「イベントビューアー」で適用された.NET Framework 4パッチの情報を控えておかなければ、後で確認する方法はなくなる可能性があるということでしょうか。イベントビュアーのログは循環する設定のため、インストールしたログが消えてしまう可能性があると考えております。 また、複数の.NET Framework 4のパッチを適用する場合、1つのパッチを適用したら、「プログラムと機能」-「プログラムのアンインストールまたは変更」で.NET Framework 4のコンポーネントのバージョンがいくつになったかを確認して、次のパッチを適用ということを繰り返さなければならないのでしょうか。

  • 追奏のオーグメントの修正パッチの不具合

     地雷ソフトが2012年に発売した「追奏のオーグメント」の修正パッチ(aug_patch_101.exe 58.9MB)なんですが、Windows7でパッチを当てると「いくつかのインストールファイルが正しくありません。新しくダウンロードをしなおしてからインストールを再度実行してください」というメッセージが出て、指示されたように再ダウンロードしても同様のメッセージが出て修正できません。  この場合、どのように対応すればよいのでしょうか。  メーカーのサイトはすでに閉鎖されているようなので、新しいバージョンのパッチも見当たりません。

  • PC内の更新プログラムを確認するには?

    WIN98のサポートが終了するに当たって不測の事態に備えて事前の準備をしておこうと考えてます。 そこで、今現在、PCに適用されているWindowsの更新プログラムや修正パッチの詳細・何が適用されているのかを確認するにはどうすればいいのでしょうか? 『アプリケーションの追加と削除』の一覧に記載されていないプログラム・修正パッチもあるようなので現状で適用されている全ての更新プログラム・修正パッチを知るには、どうすればいいのでしょうか? OSの再セットアップをしてupdateをかけて更新プログラム・修正パッチの一つ一つを確認・メモするのが確実で最善・最良かもしれませんが、そこまでするのは無理な状況ですので、よろしくお願いします。

  • 修正パッチ適用済みセットアップディスク

    Microsoftのサイトには、たくさんの修正パッチが出ていますが、わざわざひとつづつ適用するのはメンドウです。 特に、Win95なんかは、サポートすら打ち切られてるわけですから、全部のパッチを適用したディスクを作っておけば、簡単に再セットアップできそうです。 Win2000の場合は、簡単にSP3適用済みディスクを作れますけど、同様にWin95でも作れないですかね?

  • QOH'99SecondEditionのパッチ

    久し振りに「THE Queen of Heart'99 SecondEdition」をプレイしたいと思って QOH'99 → Second Edition の流れでインストールしました。 その後、配布されたSEの修正パッチ(坂下・コリン追加など)をダウンロードして適用しようと思ったのですが、パッチの配布元の渡辺製作所が無くなってしまい、後継のフランスパンでも配布はしていませんでした。 これらのパッチをダウンロードできる方法はありますか? よろしくお願いします。

  • ユーザ認証の必要なWindowsセキュリティパッチのKBxxxxが知りたい

    WinXP pro 現在、SUSを使ってWindowsのセキュリティパッチを当てています。 それ自体は正常に動作しているようです。 ただ、1点心配なことがあります。 通常のWindowsのセキュリティパッチ適用を行うとき、  Windowsのセキュリティパッチの中にたまに ユーザに同意を求めるパッチがあります. そういったセキュリティパッチがSUSどのように動作するのか?といったことです。 そこで一度、そのようなWindowsのセキュリティパッチを 実際に当ててみようと思うのですが、 どのWindowsのセキュリティパッチで試したらよいかで困っています。 「プログラムと追加と削除」の中にある更新プログラムのうち ユーザに同意を求めるパッチの番号(KBxxxxx)を教えていただけないでしょうか?

  • MS14-021 IE6パッチ バグ?

    XP-IE6用も特例ということで、早速適用してみました。 メッセージ上は、順調に適用が完了したのですが・・・。 結果は ・web mail(iexplore.exe)が動きません(問題が発生したため終了します・・・)。 ・レジストリ汚されのがいやなので、復元で綺麗に戻そうとしたら、今度は復元(rstrui.exe)が動きません。 どなたか、XP-IE6にMS14-021適用して問題なかった方がいらしたら、ヒントなどご教示ください。 多分、4月13日までのパッチを全て適用した後、MS14-021を適用すれば、うまくいくのかも知れません。(あまりにパッチエラーが多くて当方それは無理です。以前、パッチ当てたらhelpの一部が表示できなくなったり、数ヵ月後パッチのパッチ(のパッチ・・・)で正常になったりで、STAPに限らず最近は何が本当でどこまで検証して(信頼できないので見てませんがNHKまでも)報道しているのか、疑問だらけのように思います)。XPのパッチエラーの修正パッチは無いぞ、もうXP使うな!のイヤガラセ?は考えすぎでしょうか) また、 https://technet.microsoft.com/ja-jp/library/security/ms14-021.aspx にある、削除に関する情報もデタラメです(フォルダー$NTUninstallKB2585542$は存在しない,KB2964358の転記ミスか?) 「すべてのサポートされているエディションの Windows XP 用の Internet Explorer 6: [コントロール パネル] の [プログラムの追加と削除] または %Windir%\$NTUninstallKB2585542$\Spuninst フォルダーの Spuninst.exe ユーティリティを使用します。」 コントロールパネルからの削除はできたので、幸運でした。 パッチ削除後はシステム復元も正常に戻り、レジストリ・ドライブごと綺麗にもどしました。 環境: XP-SP3, IE6-XPSP3 パッチ:WindowsXP-KB2964358-x86-custom-JPN.exe ←http://www.microsoft.com/en-us/download/details.aspx?id=42591 以上

  • パッチを当てたコマンドのビルド

    https://gist.github.com/hamano/573753 上記サイトのビルド手順に従い、コマンドのソースにパッチを当ててビルドしたのですがパッチが適用された動きをしませんでした。 ビルド後、何か特別な作業(例えばインストールなど)が必要だったりするのでしょうか。インストールする場合はどのようなコマンドを打てばよいでしょうか?

専門家に質問してみよう