No.4ベストアンサー
- 回答日時:
>例えば、ソースにファイルの参照先を埋め込んであったとします
>リビルドはSDKがなくてもできるのかな?
その場合、exeファイルのどこかにファイルの参照先が
テキストデータとして入っているわけですが
DPマッチングを利用して変更箇所を更新するしかないでしょう。
バイナリエディタでみれば、\\C\aaa.csvがどっかにみつかると
思うのでその部分を取り替えても動くかもしれません
(その場合文字列の長さが変わるのはまずいのであらかじめ固定長でとっておく。)
考えられる方法として
aaa.exe(旧バージョン)をコピー tmp.exeにし
tmp.exe とPacherのDPマッチングの情報を元に
aaa.exe(新バージョン)を作成することになります。
ただアルゴリズム的には可能ですが、実際そういう方式でパッチを配布したものを
私は知りません。実行ファイルが肥大化するようなら、
リソース(この場合「\\C\aaa.csv」のテキストデータ)を
別ファイルにした方が現実的でしょうし。
何度もありがとうございます。
バイナリエディタで確認して変更という手もあるんですね。
>実行ファイルが肥大化するようなら、
>リソース(この場合「\\C\aaa.csv」のテキストデータ)を
>別ファイルにした方が現実的でしょうし。
ふむふむ、そうですよね。という感じです。
こういうことを考えると(今回はたまたま気になっただけなんですが)、プログラミング段階での設計が後々に影響することを考えておかないといけないんですね。
なんか、今日は良いことを知った気がします。
まだまだ知り始めたばかりだけれども、勉強を続けてみます。
一日お付き合いくださり、ありがとうございます。
No.5
- 回答日時:
まず、パッチ当てというのは、20年以上前の組み込みの世界でROMのバイナリしかなかった時代、命令をちょっとJUMP命令に置き換え、ROM内の空いている部分に分岐して、そこで処理をしてから元に戻るとか、10年以上前のパソコン通信で回線が遅かった時代、差分だけを配布するとか、そういう時代の遺物です。
使うのはヤメましょう。パッチを当てると、そのうちに、どの様にあてたのか判らなくなります。
回線が速くなった現在、ソースコードの可読性が一番大事なので、最新版のExeを常に配布した方が良いです。
お礼が遅くなり失礼いたしました。
>回線が速くなった現在、ソースコードの可読性が一番大事なので、最新版のExeを常に配布した方が良いです。
確かにそうですね。
回線が繋がっていることにより、そのような運用にできますものね。
今回は、プログラムを作っていて、ふと疑問に思ったので質問したことでしたが、
質問して良かったと思います。
ありがとうございました。
No.3
- 回答日時:
CRCとはファイルの指紋といえばわかりやすいでしょうか。
ファイルが破損していないか調べたりするときにも使います。
CRCの検出方法にもいろいろ種類があり、CRC値は16bitだったり32bitだったりします。
もちろん16ビットは65536通りなので、違うファイルでも合致する可能性が少なからずあり
完璧ではありません。
http://page.freett.com/seaside/vip/crc/ErrDetCod …
次にDPマッチングの説明
DPはダイナミックプログラミングの略ですが
「あいうえお」という文字列と「あいくえお」と文字列を比較するなら
「う」の部分が「く」になっているとプログラム的に簡単に作成できると思います。
では「あいうえお」と「あいきお」のように違う長さの文字列ではどうでしょうか
この場合「うえ」の部分が「き」に置き換わっているのは
わかりますが、それをプログラムで組むとわりと
難しいと思います。
もちろん全パターンを検索すればいいのですが、文字数が増えれば
計算量が半端ではありません。
それを少ない計算量で「うえ」の部分が「き」に置き換わっていることを
調べるアルゴリズムのひとつを「DPマッチング」といいます。
http://sail.i.ishikawa-nct.ac.jp/pattern/dp/dp.h …
簡単な方法として あるソフト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がなくてもできるのかな?ということです。
理解力が低くて申し訳ありませんが、
再び回答を付けてくだされば幸いです。
No.2
- 回答日時:
ゲーム開発をしているものです。
パッチといっても方法は色々あります。例えばですが
・パッチサーバーなどに接続する場合ならCRCチェックを行い、違う箇所の修正を行う。
・開発者は変更箇所のファイルはわかっているわけですから、そのファイルのみ入れ替え。(差分パッチ)
・バージョン情報を保持しておき差分情報をプログラム内であらかじめもっておく。
※あまりやらないと思いますが、単一ファイルに関してもdiffのようにDPマッチングを行い
バイナリレベルで変更箇所を書き換えていくパッチも作ろうと思えば可能です。
簡潔にいえば旧バージョンとの変更箇所を入れ替えるプログラムがパッチです。
google等で「差分パッチ」で検索すればそのようなプログラムはいっぱいひっかかります。
>パッチの方が効率的ですよね。
必ずしもそうとは限りません。実行ファイルが100kにも満たないものに、Patcherをつくっても
Patcherのサイズの方が大きくなる可能性があります。
sha-girlさん、回答ありがとうございます。
パッチの仕方もいろいろあるのですね。
せっかく書いていただいたのですが、「CRCチェック」とはなんでしょう?
「DPマッチング」も今回はじめて聞きました。
NET上で調べても、なかなか難しい解説が載っていました(^_^;)
googleで「差分パッチ」も検索してみたのですが、
588件もHitしてしまい、最初の数ページで挫折しました。
でも、今回質問したおかげで、どういった方向性(単語?)について追いかけていけば良いかつかめた感じがしますので、参考になりました。
ひょっとしたら、「プログラムはどうやって動く?」ぐらいのところまで戻らねばならない気もしますが。。。
>Patcherのサイズの方が大きくなる可能性があります。
そういうものなのですね。
プログラムの世界もなかなか簡単にはいかない世界ですね。
ありがとうございます。
No.1
- 回答日時:
mihanoさん、回答ありがとうございます。
>diffで差分を取ってpatchで適用します。
参考URLも読みましたが、僕には少々難易度が高いようです。
Cygwinをインストールすれば、手っ取り早いと書いてありましたが、
Cygwinをインストールして、使えるようにするまでが大変な時間が必要な気がしています。
この機能(ソフト?)を使えば、差分ファイルができるということはわかりましたが、
まだ一度できてしまったexeにどうして適用されるのか、疑問が残っているので、
もうちょっと調べてみます。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
binファイルを解凍したいの...
-
コマンドプロンプトで作成日時...
-
Seasar2のdiconファイルの読み方
-
C言語---ファイルに出力したデ...
-
exeファイルの中身を見る方法は...
-
VBAからファイルをセル入力から...
-
reaper音声ファイルについて
-
特定のDLLを参照設定しているプ...
-
[tex] algorithmic.sty
-
Matlabで作成したmファイルをC...
-
iniファイル
-
ELFファイルを逆コンパイルした...
-
VBで「.tif」または「.pdf」...
-
mdsファイルが作成されない
-
既に開いているエクセルを閉じ...
-
exeファイルをデータ転送サービ...
-
「ブルーファイル」と「グリー...
-
ラッパーって何なんでしょう・...
-
コマンドプロンプトで、指定し...
-
Batファイルをバイナリ形式にす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
binファイルを解凍したいの...
-
アクセス 壊れた? 「ファイ...
-
jarファイル
-
コマンドプロンプトで作成日時...
-
.NETアプリを作ったときの .man...
-
exeファイルの中身を見る方法は...
-
#include <Windows.h>というヘ...
-
Seasar2のdiconファイルの読み方
-
自分で作成した重要ファイルを...
-
VBAでのicsファイル変換
-
C言語---ファイルに出力したデ...
-
コマンドプロンプトで、指定し...
-
公文書のxmlファイルの開き方が...
-
参照するファイルをワイルドカ...
-
Latexで図番号だけを「図1.1」...
-
バッチ処理で追記コピーしたい
-
ファイルが開かれているかどう...
-
warファイルをEclipseでプロジ...
-
VBSが起動しない
-
監視ツールを入れさせられまし...
おすすめ情報