
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で質問しましょう!
似たような質問が見つかりました
- 自転車修理・メンテナンス 先日、パンクしていた ショップオリジナルの700cで28cの タイヤをはめていたクロスバイクに 親が 15 2022/11/27 10:34
- その他(病気・怪我・症状) 口内炎 3 2022/05/18 10:05
- 病院・検査 会社員の義務の注射って採血だけですよね? 3 2023/07/21 13:07
- 薬学 【医学】薬がパッチから体内に吸収される薬がありますが、普通は皮膚の中に液体は入って行かな 3 2023/06/09 21:23
- システム 古いWEBシステム。もう追加プログラムは作れない? それともできる? 6 2022/06/08 13:41
- UNIX・Linux redhat enterprise Linuxなどの脆弱性の修正が出たときの「エラッタ」というものが 2 2022/04/15 13:44
- 歯の病気 歯医者、下手くそ? 子供、麻酔があるので今は痛がってないのですが 終わってみたらこんなことになってま 1 2022/07/26 19:34
- メンズ リーバイス501 2 2022/11/23 12:49
- スキンケア・エイジングケア 塗るとシミが消えてしまうお薬(軟膏やパッチ)がありますが、その効能効果は本当ですか。 1 2023/02/11 09:12
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
binファイルを解凍したいの...
-
隠しファイルの扱い
-
アクセス 壊れた? 「ファイ...
-
実行ファイル(.exeファイル)...
-
大容量のファイルをseek関数で...
-
.NETアプリを作ったときの .man...
-
ADODB.Streamで開いたファイル...
-
コマンドプロンプトで作成日時...
-
Oracleの使い方がわかりません
-
あるエクセルファイルの未読管...
-
アクセス禁止?のやり方
-
バッチファイル 月のmm表示とm...
-
Windowsのファイル関連付けにつ...
-
flaをswfにするわけは?
-
VBA : CSV、xlsファイルを内...
-
Matlab/ @の意味
-
複数のfunctionをonclickで実行...
-
ブラウザからExcelのスプレッド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
binファイルを解凍したいの...
-
.NETアプリを作ったときの .man...
-
リンクの張り付けかたを教えて...
-
公文書のxmlファイルの開き方が...
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
コマンドプロンプトで、指定し...
-
jarファイル
-
「ブルーファイル」と「グリー...
-
ファイルが開かれているかどう...
-
バッチ処理で追記コピーしたい
-
VBAでのicsファイル変換
-
CSSを1ページに1枚作るのって変...
-
監視ツールを入れさせられまし...
-
C#でログファイルにファイルパ...
-
exeファイルの中身を見る方法は...
-
自分で作成した重要ファイルを...
-
HTMLからのBATファイル実行
おすすめ情報