このページは内部リンク用雑記ファイルです。外部からの雑記へのリンクは note{yy}_{mm}.php に張ることを推奨します。
以前の
2003 : 5 6 7 8 9 10 11 12
2004 : 1 2 3
コメント機能は暫定実装なため予告なく投稿が削除される可能性があります。
米Microsoftは次期Windowsの「Longhorn」リリースに先立ち、Windows XPのアップデート版提供を検討中だ。
SP1 の時見たく単に SP2 が適用された XP で、 Windows XP SP2 とかでは?時期的に見て付属ソフトウェアの強化はともかく、中身(コア部分)を弄ることは無いでしょう。(Longhorn の中身は Win32 のソレとは異なるので)メーカー製パソコン等に初期から入っているぶん(つまりは新規購入、ただパッケージで出しても次のとおり売れるか疑問)にはよいかもしれませんが、現行から乗り換える人がいるかは Longhorn が見えているだけにそこまでいないかと。
.NET Framework の PropertyGrid コントロールの高度な活用というのを発見したのでメモ。現行みら〜じゅの設定ダイアログは、TabControl を使っていますが煩雑な感があるので、将来的にはOperaの設定ダイアログ風に Listview/TreeVeiw + 自作の切り替えコントロールに移行する予定。で、この自作コントロールの製作(特にRAD対応)に手間がかかるのですが。
SharpDevelop0.99が公開されてますね。ちょっと弄ってみた感じではどのあたりが変わったのかよく分かりませんでしたが。とりあえずアセンブリビューでやたら例外が発生する問題は顕在のようです。
これといったネタが無いのでみら〜じゅのバグ情報でも。Rev.9の設定ダイアログで「ページ数」を変えても、再起動するまで適用されません。これはRev.10で修正されます。
今回もめんどくさいのでスクリーンショットなし、Rev.9です。ダウンロード
シンプルな仮想ディスクトップユーティリティです。.NET作り直しってことで抜けてる機能があります。
設定ダイアログがつきました。例によってフィーリングで。
登録禁止設定が拡張されています。「アプリケーション」は\を含まない場合ファイル名と見なしパスにかかわらずファイル名が一致した場合対象となります。\を含む場合フルパスで判定します。相対パスはサポートしていません。(必要ないでしょうし)また名前判定に大文字・小文字をを区別しないように変更しました。
SSTP通信により(無視できる範囲の)エラー情報を通知します。
Frameworkページと共にこっちも模様替えする予定だったのですが、トップ絵が間に合いませんでした。とはいえデザイン的に似ているのはよろしくないので、トップ絵を省略するか、手抜き塗りでの公開になるでしょう。
あー、1日あいてしまいましたね。まぁそれはいいとして、みら〜じゅでデバッグ情報を SSTP で流すようにしてみた(ちょっとした情報を出す場合は途中で処理が中断しないためダイアログよりも便利。)のでC#で SSTP 通信を行ううサンプル。
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
class SSTP {
private static Socket GetSSTPSocket( string server, int port ) {
Socket sstpSocet = null;
IPHostEntry hostEntry = null;
hostEntry = Dns.Resolve(server);
foreach(IPAddress address in hostEntry.AddressList) {
IPEndPoint ipe = new IPEndPoint(address, port);
Socket tempSocket =
new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if(tempSocket.Connected) {
sstpSocet = tempSocket;
return sstpSocet;
}
}
return null;
}
private static string Send( string sendMessage ) {
Encoding sjisEnc = System.Text.Encoding.GetEncoding("Shift_JIS");
byte[] bytesSent = sjisEnc.GetBytes(sendMessage);
Socket sstpSocet = GetSSTPSocket( "127.0.0.1", 9801 );
try {
int bytes = 0;
Byte[] bytesReceived = new Byte[256];
string result = "";
sstpSocet.Send(bytesSent, bytesSent.Length, 0);
do {
bytes = sstpSocet.Receive(bytesReceived, bytesReceived.Length, 0);
result += sjisEnc.GetString(bytesReceived, 0, bytes);
} while (bytes > 0);
return result;
}
finally {
if( sstpSocet != null ) {
sstpSocet.Shutdown( SocketShutdown.Both );
sstpSocet.Close();
}
}
}
static void Main() {
Console.Write( "Sakura Script : " );
string msg = "SEND SSTP/1.1\r\n"
+ "Sender: SSTP Sample Client\r\n"
+ "Script: "+ Console.ReadLine() +"\r\n"
+ "Charset: SJIS\r\n"
+ "\r\n";
Console.WriteLine( Send(msg) );
}
}
例外処理は省いています。適宜追加してください。
SSTP が何か分からない人はうさださくらとかSSP BUGTRAQとかCROWあたりを参照してください。なお、 CROW にこのコードで SSTP 通信を行うとフリーズすることがあります。詳しく調査していないためどちらに原因があるか分かりません。
とりあえず作成までは成功しました〜。クラススタイルにCS_GLOBALCLASSを指定すればよかった模様。とりあえずサンプル。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class MyForm : System.Windows.Forms.Form {
[ StructLayout( LayoutKind.Sequential )]
struct WNDCLASSEXW {
public int cbSize;
public uint style;
public IntPtr lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public IntPtr hInstance;
public IntPtr hIcon;
public IntPtr hCursor;
public IntPtr hbrBackground;
public IntPtr lpszMenuName;
[ MarshalAs( UnmanagedType.LPWStr )]
public string lpszClassName;
public IntPtr hIconSm;
}
[DllImport("user32.dll")]
static extern IntPtr RegisterClassExW( ref WNDCLASSEXW lpwcx );
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary( string f );
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress( IntPtr hdll, string f );
[DllImport("user32.dll")]
static extern IntPtr GetClassName(
IntPtr hwnd, System.Text.StringBuilder str, int size );
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ClassName= "MyFormClass";
return cp;
}
}
public MyForm() {
System.Text.StringBuilder str
= new System.Text.StringBuilder( 64 );
GetClassName( Handle, str, 60 );
this.Text = "クラス名 = " + str.ToString();
}
[STAThread]
static void Main() {
const uint CS_GLOBALCLASS = 0x4000;
WNDCLASSEXW wcl = new WNDCLASSEXW();
wcl.cbSize = 48;
wcl.style = CS_GLOBALCLASS;
wcl.lpszClassName = "MyFormClass";
wcl.lpfnWndProc = GetProcAddress(
LoadLibrary( "user32.dll" ),
"DefWindowProcW" );
RegisterClassExW( ref wcl );
Application.Run( new MyForm() );
}
}
とりあえず作れたというだけで一切運用していませんので思わぬ問題があるかもしれません。使用する際はそのあたりをしっかり調べてから行うようにしてください。プロシージャにDefWindowProcW()を使用していますが、これは .NET のウィンドウプロシージャが Unicode であるため、こちらのほうがよいであろうという判断です。9x ではDefWindowProcA()を指定しなくてはいけません。また、RegisterClassEx()周りの文字コードも Anisi 文字コードにマーシャリングする必要があります。
本当は .NET Window のプロシージャを取れればいいのですが、取得方法がいまいち分からないのでまた今度ということで。またWNDCLASSEX.hInstanceも自分のインスタンスを割り当てたほうがよいでしょう。(.NET でのインスタンスハンドルのとり方が分からないので保留)
ContecxtMenu.MenuItems[n].Dispose()
を行うと、そのMenuItemはコレクションから削除されるため、MenuItems.RemoveAt()は不要というか行ってはいけない。ほかのコレクションでは不明。
みら〜じゅにこれ使ってますが、この部分は現在通らないため(再初期化時に使用するのですが、それを呼び出す機能は実装されていないので。)大丈夫なはず。非常によろしくない状況(まぁ近辺の人なら分かるでしょう)になってきましたのでしばらく更新頻度を下げます。(今も十分下がってますが。とりあえず近日中にRev.9(バグ修正+設定ダイアログ)を公開予定、でその後は未定。
今回はめんどくさいのでスクリーンショットはなし、Rev.8です。
シンプルな仮想ディスクトップユーティリティです。.NET作り直しってことで抜けてる機能があります。
mirage.ini でページ数を変更できるようになりました。System セクション Page キーを変更することで変更することができます。
PageView で初回表示時にサイズが乱れる問題を修正しました。それに伴い、枠の部分を自分で描画するように変更。色はコントロール(暗)が使用されます。
mirage.pageview.ini で PageView 周りの設定ができます。現在実装されているのは System セクション Show キーで PageView の表示を設定(0=非表示, 1=表示)、System セクション System セクション TextShadow で文字に影を使用するか設定(0=使わない, 1=使用) Wallpaper で壁紙表示(0=非表示, 1=表示)を設定できます。ただし壁紙はアクティブディスクトップには対応していません。Wallpaper が 1 の場合強制的に TextShadow の値にかかわらずテキストは影付で描画されます。また、PageView は一部にシステムカラーを使うように変更されています。
見た目的にはあまり代わってませんが、acl.dllのini周りを大幅に変更したので設定周りにバグがでるかもしれません。
実は、この日のクライマックスは、イベント終了後の報道陣向け囲み取材だった。宮村優子さんが、妊娠していることを明らかにしたのだ。9月に出産を控えており、3月にも式を挙げるという。
お相手は、宮村さんの所属事務所であるジャパンアクションエンタープライズの、スタントマン、関隆行さん。宮村さんが31歳、関さんが25歳であるため、姉さん女房となることが判明した。
今後は、無理のない範囲で声優の仕事を続けるという宮村さん。会場では、報道陣からも祝福の拍手が贈られた。
というかこの人最近何に何に出てるのでしょう?(←調べろ)
食い逃げしてみたりポルターガイストを操ってみたり(微妙に古いか)してることぐらいしか知らないのですが。
β3でもまだ HSP エディタのコモンコントロール問題が健在なようなようなので手抜き実装ですが、 XP スタイルを外す manifest ファイルを生成するツール。文字コードが UTF-8 なので .NET のほうが楽だろうということで C# 製ですが、よく考えると Ascii 文字だけなので別に HSP で組んでもかまわなかったり。
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
class Form : System.Windows.Forms.Form {
private const string manifest
= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n"
+ "<assembly "
+" xmlns=\"urn:schemas-microsoft-com:asm.v1\" "
+ "manifestVersion=\"1.0\">\r\n"
+ "<description></description>\r\n"
+ "<dependency>\r\n"
+ "\t<dependentAssembly>\r\n"
+ "\t</dependentAssembly>\r\n"
+ "</dependency>\r\n"
+ "</assembly>";
public Form() {
Label label = new Label();
label.Text = "exe をドロップしてください";
label.Dock = DockStyle.Fill;
label.TextAlign = ContentAlignment.MiddleCenter;
this.Controls.Add( label );
this.Text = "XPStyle Eraser";
this.AllowDrop = true;
this.TopMost = true;
}
protected override void OnDragDrop( DragEventArgs e ) {
if( e.Data.GetDataPresent(DataFormats.FileDrop) ) {
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach( string filePass in files ) {
StreamWriter stream= null;
try {
stream = File.CreateText( filePass+".manifest" );
stream.Write( manifest );
}
// TODO: 必要なら例外処理を実装してください
finally {
if( stream != null ) stream.Close();
}
}
}
}
protected override void OnDragEnter( DragEventArgs e ) {
if (e.Data.GetDataPresent(DataFormats.Bitmap) ||
e.Data.GetDataPresent(DataFormats.FileDrop) )
{
e.Effect = DragDropEffects.Copy;
} else {
e.Effect = DragDropEffects.None;
}
}
[STAThread]
static void Main() {
Application.Run( new Form() );
}
}
コンパイル方法が分からない人は、.NET Framework(Runtime で可)をインストールした後小野さんのコンパイルツール辺りを使用すると分かりやすいかと思います。作成されたexeの使い方は窓内にファイルをドロップするだけです。
クラス登録に失敗していた原因は RegisterClassExA() に WNDCLASSEXW構造体 を指定していたためでした。で、クラス登録は成功(プロシージャには DefWindowProcA/W を指定してみた)したのですが、やっぱりクラスが無効と言われ(CreateWindowEx() でウィンドウが作れたのでクラス登録は失敗していない筈)ます。さて、もう少し調べてみますか。
そして今問題となっているのは、陪審がいつの時点におけるWindowsという言葉の使い方と商標を検討するべきかだ。MicrosoftはWindowsという言葉の今現在の使われ方に焦点を当てるよう求めてきたが、裁判所はWindows製品のリリース前(1983〜1985年)の時期の使われ方を検討するべきとの判決を下した。
まぁ商品に一般的な名前をつけるなってことですね。私が言えたことではないかもしれませんが。というか .NET , COM 等検索で不利になる(.NET , COM は google で検索できない)名前付けはやめて欲しいです。
このコードを実行すると、
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
class MyForm : Form {
public MyForm() {
Text = "透過、透過♪";
Button button = new Button();
button.Text = "テキスト";
button.BackColor = Color.FromArgb( 128, 255, 255, 255 );
button.Dock = DockStyle.Fill;
Controls.Add( button );
}
static void Main() {
Application.Run( new MyForm() );
}
protected override void OnPaint( PaintEventArgs e ) {
Brush brush = new LinearGradientBrush(
this.ClientRectangle, Color.Red,
Color.Black, 135f, false );
e.Graphics.FillRectangle( brush, this.ClientRectangle );
}
}
ボタンが半透過で描画されます。ってレイヤードウィンドウでさえまともに使われていないのに、こんなの誰が使うのでしょう。普通のUIに使うとユーザビリティを下げまくりな気が。
ウィンドウの登録禁止が設定できるようになりました。
シンプルな仮想ディスクトップユーティリティです。.NET作り直しってことで抜けてる機能があります。
mirage.pagemane.ini で登録禁止を設定できるようになりました。設定ダイアログは用意されていないため手動で設定することになります。見ればわかると思いますが、System セクション Item キーに設定するアイテムの数を指定します。ItemX セクション ClassName キーに登録禁止クラスを、WindowText に登録禁止ウィンドウテキストを指定します。省略した場合はこのキーは無視されます。現在はそれぞれフルネームで指定する必要があるため、メモ帳のようなウィンドウテキスト部が可変のウィンドウを登録禁止にする場合問題が出る場合があります。これは将来的に修正予定です。ItemX セクション Type キーはこのセクションの登録禁止方法を定義します。0=登録するが移動しない、1=そもそも登録しない の2つとなっています。
あとは左クリックメニュー項目を増やしています。バージョン情報しか使えませんけど(ぉ)。バージョン情報ダイアログはそれなりに気合を入れて作ったのですが誰も見ないだろうって事で今回のスクリーンショットに。
設定周りでは後は、ページ数とページビュー周り。それ以前に設定ダイアログをどうにかしないと、、、
C系言語の goto ってブロックの最後におくことはできないのですね。
for( int i=0; i<10; i++ ) {
if( 分岐) {
// 何かの処理
goto label;
}
// ここにも何か処理
label:
// ここに ; がないとコンパイルエラー
}
まぁこの例だと else とか conninue 使えばいいのですが。
.NET仕切りなおし人柱版。
シンプルな仮想ディスクトップユーティリティです。.NET作り直し初版ってことで結構抜けてる機能があります。
アンマネージな部分を操作するコードが殆どなため、そのうちまたC++で作り直すかもしれません。というか同じコードを何回も書き直してる気がするのは気のせいでしょうか。
ContextMenu 処理終了時に ContextMenu.Dispose() / MenuItem.Diapose() してはいけません。MenuItem.Click イベントが正しく発生しなくなります。(MenuItem.Diapose() で MenuItem.Index が おかしくなる、 ContextMenu.Dispose() でそもそもイベントが投げられない)
ContextMenu contextMenu = null;
try {
contextMenu = new ContextMenu();
// contextMenu にアイテム追加
// 本来は Form なりに関連付けるべき
contextMenu.Show( ... );
}
finally {
if( ContextMenu != null ) {
for( int i=0; i<contextMenu.MenuItems.Count; i++ )
contextMenu.MenuItems[i].Dispose();
contextMenu.Dispose();
}
}
で、これでうまくいかないとなるとどこで Dispose() すればよいのでしょうか。設計から見直すべき?
.NET Framework 2.0 って Whidbey でサポートされるのですね。Longhorn かと思ってました。Office XP スタイルのメニューがサポートされるなどそこそこ魅力的ではありますが、その次の年に Longhorn が出ることを考えると微妙。ところで標準コンポーネントに検索/置換ダイアログが無い気がするのですが、ここでサポートされたりするのでしょうか?先日使う当てもないのに自作したのですが、ここでサポートされると悲しすぎます。
Control.CreateParams をオーバーライドして CreateParams.ClassName に適切なクラス名を与えると、Form のクラス名を変更することができます。この時、指定したクラスは WindowsForms10.{クラス名}.appX というクラスに変更されるようです。
using System;
using System.Windows.Forms;
class MyForm : System.Windows.Forms.Form {
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ClassName = "Button";
return cp;
}
}
static void Main() {
Application.Run( new MyForm() );
}
}
一応再定義されていない CoboLbox クラスでも試したので間違ってはないと思います。これを使って独自クラス名を定義できないかと画策しているのですが、C#でクラス定義がうまくできないので保留中。
ここでいうリアルタイム処理は遅延が発生するとクリティカルな影響を与えるもの――主にアクションゲームやシューティングゲーム等の類――です。
C#はガーベッジコレクタを備えているため delete 等の明示的な開放を行うことはできません。つまり処理中にガーベッジコレクタが動いてしまい、処理落ちする可能性がでてきます。これを回避するためには無駄な参照されないオブジェクト――つまりはローカル変数――の生成を避ける必要があります。また要所要所でガーベッジコレクタを明示的に動かすことも効果的でしょう。
もうちょっとまとめてから公開するつもりだったのですが、某所で話してしまったので稚拙ながらあげておきます。というか言語的に delete を実装するかそれに相当する明示的な開放を行なえるようにと。
調べきっていないので公開できず。そもそも本当にうまくいくのか怪しいところなので。
掲示板のほうに書いたとおり携帯からだとリファラがなくて雑記を更新できませんでした。まぁとりたてて書くこともないので補完する必要がない気も。
あと数日。
どなたか知りませんがウィルスチェックをお願いします。
しかし、The message cannot be represented in 7-bit ASCII encoding and has been sent as a binary attachment.
で添付ファイルが.scrとか.exeだと怪しいといってるようなものだと思うのですが。
ここ数日間はプログラムらしいプログラムを書いていないためそれ系のネタがないので。逸般系ならそこそこあるのですが、文章をまとめる気力がないのでやっぱり駄目。
そんなことは関係なくサイトメンテナンス。一部(横に長いページ)IEとネスケでレイアウトが崩れるので、cssをいじってみた(.Textと同じくleftmenuを絶対座標にしてた)のですが、別の問題(縦に短いページでレイアウトが重なる)が発生したので元に戻しました。結果、今回の修正はrefererer.phpと100.php,comment.phpに NOINDEX, NOFOLLOW を指定、notes.phpにNOINDEXを指定しただけと。
今回は、今流行の.Text(日本語Skin)風レイアウト。ただこれを全ページにわたって行うと見づらい感もあるので、次回模様替え時に元に戻ってるかも(この部分はPHPで生成しているため、修正が容易)しれません。今回の目的はまたinclude周りを変えたので、Frameworkページが更新できなくなるのを防ぐため。(あずまや。から切り離せという意見もあるでしょうが、時間がなくて。)細かいところではトップページの雑記が新しいものから並ぶようになっています。ただ、このおかげで雑記システム内に似たような描画関数が4つもあるのでいい加減ここも何とかしたいところ。まぁ外から見る分にはなんら問題はないですが。
Another HTML-lintでチェックかけると、<meta> に指定されているメディアタイプ text/html は XHTML1.1 には指定しないようにしましょう。
などという警告が出てくるのですが。以前は出てなかった気が、、、弄った後でまた弄るのもあれなので次回に。
リリースされていますが、これを入れると記憶したはずのユーザー名とパスワードが表示されなくなるという別の問題が発生します。成りすましから身を守るか利便性をとるかですか。まだ入れてない方は参考に。
明日時間が取れれば模様替え(仮バージョン)を慣行します。←自分の首を絞める言動
依然仮がついていますが、今回も前ページにわたって仕様変更を行ってるので早めに行っておかないと。
とりあえずちゃんと月が切り替わるかのテスト。ちなみに現時点で note2004_02.php は用意していません(模様替え中でアップできない)ので、月一覧に 2004/2 がないのは仕様です。
Copyright(C)方位記号