ようこそゲストさん

Kerosoft : Modus Operandi

2009/09/23(Wed) Windows Live Messenger 8.1.0178 延命パッチ

はてブ情報 はてブに登録 はてブ数 2009/09/23 6:49 Software::Windows
Windows Live Messenger 8.1.0178でサインインできないで書いた問題、とりあえずは互換性の変更で対処していたが、ファイルのバージョンを書き換えると良いよ!というコメントを頂きましたので、早速パッチを作ってみました。

パッチ

▼Windows Live Messenger 8.1.0178 延命パッチ
WLM8.1.0178_patch.exe (205KB)
(規制対象の中途半端なバージョンに書き換えていたので差し替えました。)

WLM8.1.0178_patch2.exe (205KB)

パッチ内容
Windows Live Messenger 8.1.0178のmsnmsngr.exeに対して、ファイルバージョンを8.1.0178から、現在時点の最新版のWindows Live Messenger 2009である14.0.8089.726に書き換えます。
ただ表面上書き換えるだけなので、機能は8.1.0178と全く変わりません。
ちなみにパッチ箇所のdiffはこちら
かなり大量なので、手動だと大変だと思います。*1


上のパッチはオリジナルに対してのみ有効なパッチですが、上記を適用した後さらに、転送制限やシェイク・IE限定制限の解除を行った場合でも動作することを確認しています。
それに関しては、こちらを参考に。

なお、Live Messenger Plusを導入されている方は、上記パッチを適用すると、Plusメニューが消えてしまうようです。
そう言う場合には引き続き互換性設定を行う方が良いでしょう。

*1 : バージョン情報の書き換え自体はResource Hackerでやったので、必要ないところも書き換えてると思われます。

追記: 今更ながらニュース 16:39

[メッセンジャー] 最新版をご利用ください - Windows Live
Windows Live Messengerの強制アップデート計画発表 -INTERNET Watch
Microsoft、Windows Live Messengerの強制アップグレードを実施 - ITmedia News

これによると脆弱性のための強制締め出しというわけですね。
> バージョン14.0についても、バージョン番号が「14.0.8089」以下のユーザーに対してアップデート推奨メッセージが表示される
ということは、それ以上のバージョン番号にしておかなきゃまずかったかなあ…と今更思ってみたり。
→ 今パッチを差し替えました。(9/23 16:53)

しかし、オフィシャルブログのコメント欄では不具合の嵐ので、イマイチ乗り移りたくないな。
攻撃される危険性といっても、Microsoft Security Advisory (973882): Vulnerabilities in Microsoft Active Template Library (ATL) Could Allow Remote Code Executionを見る限り、以前のようにプロトコルを変更するような緊急を要するようには見えないしなあ。

うーん… 16:57

色々やってたら互換性設定を行わないまま、v8.1.0178でログイン出来てしまった。
レジストリに何か書いているのだろうか?ちょっと様子見。

英語版 2009/10/01

コメントで英語版が欲しいとのことで、急遽作りました。
一応動作確認済みです。

WLM8.1.0178en_patch.exe (202KB)
参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクはてブしていただけると助かります…。 コメントも歓迎です。

1: 2009大嫌い 2009年10月01日(Thu) 午前9時10分

英語版のWindows Live Messenger 8.1.0178だとやはり書き換える部分が変わってくるのでしょうか?パッチをあてることができません。なぜ、英語を使うのか?ただインテリぶりたいだけです・・・。現在XPを使っているんですが、互換モードでexeを実行しようとすると、XP又はそれ以降のOSじゃないと使えませんといわれてしまいます。2009にして重くなっただけじゃなく、オフラインからのビデオコール、音声通話などができなくなったのでなんのためのオフライン機能かと思っています。なんとか英語版でもできるようにしていただけませんでしょうか?

2: Keroberos 2009年10月01日(Thu) 午前11時24分

作りましたので、試してみてください。

3: 2009大嫌い 2009年10月01日(Thu) 午前11時28分

立て続けにすみません。英語版でのインストールできました。8.1の日本語版で、こちらのパッチをあて、そのまま英語版messenger8.1をインストールしますと、言語は英語にかわりサインインすることもできました。
が・・・、愛用してきたMSNshellがつかえませんでした。messenger plusもだめでした(広告消しは有効)。2009の不満といえば、動作が重い。オフラインからの音声通話ができない。ということなので、ここはいさぎよく2009にしてmsnshellと一緒に使うということにしようとおもいます。2009でパッチをあてて、オフラインからの通話招待、シェイク制限解除などがでるのをまったほうが早いかもしれませんね。

4: 2009大嫌い 2009年10月01日(Thu) 午後0時04分

>Keroberos様
早速の対応(ものの数時間!!)本当に感謝いたします。お陰さまで、余計なことをしなくても英語版のメッセンジャーのみでパッチ対応ができるようになりました。
1.英語版メッセインストール→パッチ対応→msnshell→メッセ起動→失敗
2.英語版メッセインストール→msnshell→パッチ対応→メッセ起動→失敗
上記の二つを試しましたが無理でした。右下常駐トレイにアイコンは表示されるのですが、サインイン画面があがってきません。マルチも機能しているようで、アイコンだけなら右下にいくらでもでてきますが、メッセンジャーのサイイン画面が上がってきません。
msnshellのマルチ機能、広告除去、スナップ(キャプチャー)機能、ラジオ機能、音楽ストリーム機能、など大変魅力的な機能だっただけに本当に今回のアップデートには困りはててます。msnshellも最新版だとラジオ機能がなくなってて、どうしても8.1と一緒に旧バージョンのmsnshellを使わなければいけなかったので、もう今回のアップデートでこの環境とはサヨナラですね。
Keroberos様、迅速な対応に感謝いたします。貴重なお時間をありがとうございました。

5: Mikki 2009年11月07日(Sat) 午前11時11分

今現在8.1をパッチで書き換えて見たのですが、相変わらず最新版いれろと言って来ます、ヘルプからversionを確認してみるとちゃんと14.08089726になっています、今は互換性モードで起動していますが、もしかしたらもう対策されてしまってのでしょうかね

6: azusa 2009年11月09日(Mon) 午後2時18分

最新入れて言われますね。互換性モードってどうやるのですか?

7: Keroberos 2009年11月15日(Sun) 午後6時53分

状況がよく分からないまま私も使っていますが、パッチ無しの状態で互換モード起動もオフで、何故か普通にサインインできてしまっています。(@8.1.178.0 Windows XP x64 Edition)

ちなみに互換モード起動は、C:\Program Files\MSN Messenger\msnmsgr.exeのプロパティの互換性タブから設定できます。

色々試してみてください。


名前:  非公開コメント   

  • TB-URL  http://mo.kerosoft.com/0139/tb/

2009/09/23(Wed) UTF-8な文字列をsubstrする

はてブ情報 はてブに登録 はてブ数 2009/09/23 5:10 Languages::Perl
ずいぶん以前からPerlで物を書くときには、文字コードをUTF-8にし、use utf8をしないで書いている。
で、その際、substrなどで文字列を切り出したいとすると、UTF-8は1文字あたりの長さが可変長であるため、入力文字列によっては変な文字が切り出されてしまうことになる。
これを正しく切り出すときに色々調べてみたメモ。

use utf8について

Perl 5.8.x Unicode関連に記されているように、
1.ソースコード中の文字列がUTF8になる。
2.マルチバイトの変数名なども使える。
なことがウリらしく、表面上の意味は、PerlにscriptがUTF-8で書かれていることを教える事が目的らしいので、次のようなコードも通ります。*1
#!/usr/local/bin/perl

use utf8;
my $あいうえお = "x";
print $あいうえお;
で、このときにsubstrを使うと、use utf8;されていることによってsubstrはバイト数ではなく文字数で切ってくれるので何も問題ありません。
#!/usr/local/bin/perl

use utf8;
binmode STDOUT, ":utf8";
# 上の2行又は use encoding 'utf8';
print substr("123あいうえお", 0, 5)."\n";
binmodeの変更も行っているのは、use utf8だけではただUTF-8で書かれているという事を示すだけで、Perl IOレイヤまでUTF-8エンコーディングが適用されないらしいので。*2

しかし、自分的には
  1. use utf8;と、いちいち書くのが面倒
  2. use strict;等と違い、もしeuc-jpで保存し直したらうまく動かなくなる
  3. 意図的にShift_JISやeuc-jpで出力させたいとき、動かない
特にCGIとして動作させるとき3つ目がネックで、例えば次のようなコードは
#!/usr/local/bin/perl

use Encode;
use utf8;
my $x = "あいうえお";
Encode::from_to($x, "utf-8", "cp932");
print $x;
次のようなエラーで動きません。
Cannot decode string with wide characters at /usr/lib/perl5/5.10.0/i386-linux-thread-multi/Encode.pm line 182.
use utf8;を外せば出力可能なので、これはちょっと面倒です。
ゆえに、use utf8;は自分の流儀的には書かない主義です。

*1 : しかし、クオートなどで囲ってマルチバイト変数名を使用する際、セパレータを使わないと遅いらしいです。→cf. use utf8 したときは、変数名境界を明示的に指定しないと死ねる件 - TokuLog 改めB日記

*2 : binmode変更を忘れると、Wide character in print at ...のようなエラーが出ます。 cf. use utf8; と use encoding;

で、どうするか

話が逸れましたが、utf8を正確に数えてやるには、一度UTF-8でエンコードされた状態をデコードしてやれば出来るようです。→cf. substr関数を使用したときの文字化け対策 (Perl / UTF-8) - substrの文字化けの対策 - マイブーム
#!/usr/local/bin/perl

my $a = "123ABCあいうえお";
utf8::decode($a);
foreach(0 .. 11){
    my $x = substr($a, $_, 1);
    utf8::encode($x);
    print qq|[$x]|;
}
print "\n";

↓

[1][2][3][A][B][C][あ][い][う][え][お]
Encode.pmを使うとさらに短く書けます。
#!/usr/local/bin/perl

use Encode;

Encode::decode_utf8($a);
foreach(0 .. 11){
    print qq|[@{[Encode::encode_utf8(substr($a, $_, 1))]}]|;
}
print "\n";

まあ、上記のサンプルは、1文字ずつを[ ]で囲って出力しているので、decode_utf8を外側に出していますが、実際に使うときは
#!/usr/local/bin/perl

use Encode;

my $text = "すごく長い長い文字列があったとします";
my $short_text = Encode::encode_utf8(substr(Encode::decode_utf8($text), 0, 10));
print $short_text;
1行で書けるのでスマートです。


別の解としては、Encode::encode_utf8の代わりに、
binmode STDOUT, ":utf8";
という手もありますが、これの場合は、ワンタイムのエンコーディングではなく、以降のSTDOUTが全てエンコーディングされてしまうので注意が必要です。
局所的にエンコーディングしておいた方がスマートである、と私は思います。
参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクはてブしていただけると助かります…。 コメントも歓迎です。

1: とおりすがり 2011年11月21日(Mon) 午前9時51分

私も use utf8; を使わないで書いています。問題の多いutf8
プラグマは失敗作です。
この記事はとても参考になりました。ありがとうございました。


名前:  非公開コメント   

  • TB-URL  http://mo.kerosoft.com/0138/tb/