このページは内部リンク用雑記ファイルです。外部からの雑記へのリンクは note{yy}_{mm}.php に張ることを推奨します。
以前の
2003 : 5 6 7 8 9 10 11 12
2004 : 1 2 3
コメント機能は暫定実装なため予告なく投稿が削除される可能性があります。
北九州市の末吉興一市長は二十八日、市職員から募ったソフト政策「明るい話題」のアイデアのうち、実現に向けて検討する主なものを発表した。実物大の「ガンダム」ロボットを作って街を歩かせ、ロボット先進都市をアピールする、といったユニークなアイデアも盛り込まれた。
ガンダムは、同市内のどこかを「スーパーロボット特区」とし、十八メートルの実物大ロボットを定期的に歩かせ、「ガンダムが歩く街」にしようというもの。
Dキャンセラーさん、もう老後は北九州に住むしかっ。
現在わかっているマネージ→アンマネージ型対応を列挙しておきます。HWNDやHDCなどはすべてHANDLEで。
C/C++/WIN32 | .NET |
---|---|
bool | System.Boolean |
char | 不明(System.Char?) |
unsigned char | 不明(System.Byte?) |
char * | System.Text.StringBuilder |
const char * | System.String |
short | System.Int16 |
unsigned short | System.UInt16 |
int | System.Int32 |
long int | |
int *(1配列) | ref System.Int32 |
int *(2配列以上) | 不明 |
int *(要素数不明) | System.IntPtr |
unsigned int | System.UInt32 |
unsigned long int | |
float | System.Single |
double | System.Double |
long double | |
struct | 不明(各メンバを分解?) |
struct * | ref struct |
const struct * | struct |
class | 不明(多分無理) |
class * | 不明(多分無理) |
関数ポインタ | 不明 |
WORD | System.UInt16 |
DWORD | System.UInt32 |
CHAR | 不明(System.Char?) |
LPSTR | System.Text.StringBuilder |
LPCSTR | System.String |
WCHAR | 不明(System.Char?) |
LPWSTR | System.Text.StringBuilder(要 MarshalAs 属性) |
LPCWSTR | System.String(要 MarshalAs 属性) |
HANDLE | System.IntPtr |
FARPROC(C言語) | 不明 |
FARPROC(C++) | 不明 |
VC7.1のbool型は1バイト以降にごみがつくのでSystem.Booleanでは取れないかもしれません。
配列サイズが不明な場合System.Runtime.InteropServices.Marshalクラスを用いて読み書きします。固定の場合System.Runtime.InteropServices.MarshalAs 属性で何とかできる思うのですが、うまくいかないので不明としています。
public static void ExportFunc( IntPtr ptr ) {
Marshal.WriteInt32( ptr, 0, 1 );
Marshal.WriteInt32( ptr, 4, 2 );
}
Unicode 文字列を渡す際は、System.Runtime.InteropServices.MarshalAs属性を付加して Unicode 文字列であることを明示します。C#は標準でAnsi文字列にマーシャリングするためSystem.Runtime.InteropServices.MarshalAs属性は必要ありませんが、他言語では明示的なマーシャリングが必要になるかもしれません。
public static void ExportFunc(
[MarshalAs(UnmanagedType.LPWStr )]
string str )
char が不明となっているのは単に調べてないからです。
前回の模様替えのときPHPがiniを扱えるのを見つけたので作ってみました。Framework のほうでUSKさんが汎用アンケートシステムが欲しいといっていたのでそのための習作。他の問題が山積みなので実際に作るかわかりませんが。
最終巻。この終わりかたは打ち切り?まぁ確かに一般にはうけない内容だと思いますけど。絵的にはどうかなと思う部分がありましたが、内容自体は好きだったので残念。
下のほうの回転座標を求める説明で、三角定理じゃなくて三平方の定理だったのを修正。後、微妙にnote.phpとcomment.phpを強化。
久々の更新。ダウンロード
Office メニューの選択色の作り方がわからないため、選択色周りは投げやりな処理をしてます。
今後しばらくは投げやりな内部実装の修正なので、機能追加予定はありません。
よく考えればすぐにわかることですが、MailChecker(仮称)に使っていてなかなか原因に気がつかなかったのでメモ。
ArrayListを使っている際、forループ内で特定のindexを削除する場合、
ArrayList array = new ArrayList();
// 何らかの処理
for( int i=0; i<array.Count; i++ )
if( [判定式] )
array.RemoveAt( i );
とするとArrayList.RemoveAt()を呼んだ時点で、ArrayList.Countがデクリメントされます。ということで、
for( int i=0; i<array.Count; i++ )
if( [判定式] )
array.RemoveAt( i-- );
このようにカウンタもデクリメントする必要があります。
ということでそろそろ余裕がなくなってきたり。
どーでもいいですけど、連続文字を略すとき何でn乗なんでしょ。
それはともかくよーやく納得のいく資料を発見。
日本にも似たような形式のサイトが数多くあり、「個人ニュースサイト」または単に「日記サイト」などと呼ばれているが、これはアメリカで産まれたWeblogを導入したものではなく、独自に発生・進化してきたものである。日本の一部のネットコミュニティでは、アメリカでWeblogが注目される以前から個人ニュースサイトが定着していたこともあり、「Weblog」と呼ばれることを嫌うサイトオーナーもいる。
やはりテキスト系サイト全般が含まれるみたいですね。しかし一般的に使われているブログとはブログツールにより自動生成されたものみたいです。なんというかブログって言ってる人の大半は、「これはC#で書いたプログラムだからオブジェクト指向のプログラムだ」とか言ってる人みたいな気が多々するのですが。「日記」と「ブログ」を併設してるとこもありますし。
で、どこかで聞いたなと思って調べてみるとGoogle 検索「東大 mesh blog」でした。この辺りからですかブログという「言葉」がはやり始めたの。
関連
カテゴリ機能を実装したほうがいいかも。ただ現在は月ごとにファイルを区切ってるので、カテゴリ機能を実装すると非常に重たくなりそうな予感。
とりあえず見切り発車の仮バージョン。理由としましては色々と変更点が多く(includeファイル名の変更)、ある程度まとまったところで出しとかないとFramework ページが弄れないからです。
主な変更点としては、概要の廃止と雑記デザインを夢幻泡影のものを使用できるように。ただ、デザインを少し弄ったら、みすじらさんに非常に似てしまったのでそのうち何とかする予定。
if( getenv("HTTP_REFERER") == "" ) {
// Form 設置
}
なことをやっていてリファラがあるとコメント書き込みFormが設置されない阿呆なバグを修正。
Webを使って公開する日記、もしくはそのような形式で綴った(Webページ制作者の)所感などを述べたWebサイトのこと。
Web日記はブログに入り、別にサイト全体ではなくても良いみたいですね。ということはここはブログといってよいようです。しかし、Web日記がありなら殆どのサイトはブログといってよいわけで。大体ブログなんて新しい言葉使わなくても昔からある(と思う)Web日記でよいと思うのですが。
サトシさんの掲示板に投げた正多角形を書くコード。全部のっけられなかったのでここで公開。やってることはある1点から 360/n角 回転して座標を求めてます。多分もっとよいアルゴリズムがあると思いますけど。回転に相変わらず複素数平面つかってますが、これは下で a さんが提示した行列変換の原理がいまいちわからないため。
using System;
using System.Drawing;
using System.Windows.Forms;
class a : Form {
// 角の数
private const int m_nPolygon = 5;
// 外接円の直径
private const int m_diameter = 180;
protected override void OnPaint( PaintEventArgs e ) {
PointF[] pt = new PointF[ m_nPolygon ];
double ang = 360/m_nPolygon;
// 座標初期化
for( int i=0; i<m_nPolygon; i++ )
pt[i] = CalcRotatePos( 0, -(m_diameter/2), ang*i );
using( Pen pen = new Pen( ForeColor )) {
// 外接円描画
e.Graphics.DrawEllipse( pen, 0, 0, m_diameter, m_diameter );
// (m_diameter/2, m_diameter/2) を原点におく
e.Graphics.TranslateTransform( m_diameter/2, m_diameter/2 );
// 正多角形描画
e.Graphics.DrawPolygon( pen, pt );
// とりあえずリセット
e.Graphics.ResetTransform();
}
base.OnPaint( e );
}
PointF CalcRotatePos( double x, double y, double angle ) {
double tx = (x < y) ? y : x;
double ty = (x < y) ? x : y;
double ang;
if( x == 0 ) {
ang = (y < 0) ? 270 : 90;
} else {
ang = System.Math.Atan2(tx, ty) * (180.0/Math.PI);
}
double rad = (ang+angle) * (Math.PI/180.0);
double r = Math.Pow( Math.Pow(x, 2)+Math.Pow(y, 2), 0.5 );
double xx = r * Math.Cos(rad);
double yy = r * Math.Sin(rad);
return new System.Drawing.PointF(
(float)xx, (float)yy );
}
public static void Main() {
Application.Run( new a() );
}
}
あずまや。って、あれブログですか?
という質問を受けたのですが、ブログの定義ってよくわからないのですよね。
ブログはWebLog(ウェブログ)の略語で、個人が日々の出来事や社会的な事象に関する記録や記事を時系列で書き連ねるWebサイトのこと。
という説明があるので、「Webサイト」全体を指すと思うのですが、最近は日記システムと等価になってる気もしますし。日本語になると「ホームページ」と同じく元の意味なんて、、、ってことですか?
ネタもそろそろ尽きてきたので製作中のものでも。とりあえず問題だったアイコンサイズ16x16が固定と、ショートカットキーの表示の問題をクリアしたので大体完成。残る問題は\tの処理を行ってない点ですが、実装方法がさっぱりわからず、しばらく保留。
こんな感じ。ちなみにこれはアイコンメニューのベースクラスで件のOfficeメニューもどきはこれから派生します。
復活だそうで。角川がスポンサーから消えたのでゲストコーナーが平凡。他は相変わらず。
最近のコメント、投稿に失敗しても登録されますね。現在手元のものは模様替え中なのでそれが終わってから。
HWND に変更を加えるとありますね。これはシステムネイティブなのか、Avalonを用いた場合だけなのかわかりませんが、後者だと既存のコードが殆ど使い物にならなくなる気が。HSP3.0では時期的に対応するのはまず無理なので、ここでもう一度大規模なバージョンアップですかね。
Graphics.RotateTransformメソッドの回転先座標を求めます。hsGdiplus.hpiのマニュアル用に用意したものもHSP3.0待ちで腐らせておくのもアレなので公開。何の参考になるのかまったくわかりませんが。
まず例として点p(120, 120)が原点O(0, 0)を中心に30度回転した(xx, yy)位置の求め方を考えます。
回転を扱うため複素数平面を用いる。
複素数a = r * (cos(45) + isin(45));
原点を中心に30度回転するため
複素数wa = r * (cos(45)+isin(45)) * (cos(30)+isin(30))
== wa = r*(cos(75)+isin(75));
r は原点Oから点pの距離である。点pとx軸が垂直に交わる点qをとると三角形opqは直角三角形になるため、三平方の定理より、
傾き r = (1202 + 1202)(1/2)
== r = 120*2(1/2);
求める値は x, y 座標なので
xx = 120*2(1/2) * cos(75);
yy = 120*2(1/2) * sin(75);
これを解くと
int(xx) = 43, int(yy) = 163 //
複素数平面がわかれば何のことはない式ですね。これをそのままC#のコードに落とすと次のようになります。Cも似たようなものなので説明は要らないと思います。HSPの標準命令で求めることは出来ません。
System.Drawing.PointF CalcRotatePos( int x, int y, int angle ) {
double ang = System.Math.Atan2(x, y) * (180.0/Math.PI);
double rad = (ang+angle) * (Math.PI/180.0);
double r = Math.Pow( Math.Pow(x, 2)+Math.Pow(y, 2), 0.5 );
double xx = r * Math.Cos(rad);
double yy = r * Math.Sin(rad);
return new System.Drawing.PointF(
(float)xx, (float)yy );
}
英語の試験でYumi and Gerry are making a homepage
はいけないと思います。
モジュールを名前空間ととるかクラスととるかでUSKさんと議論になったのでここに長々と書いておきます。
私はモジュールは名前空間でも、クラス(構造体)でもなく、あくまでモジュールであり、それらの代わりとしては働かないと考えます。ただ、この2つで比べた場合クラス側の立場をとります。モジュール定義命令はpublic staticであり、その他はprivate staticです。なぜ名前空間ではないかというと、名前空間は文字通り名前空間を用いシンボルの競合を避けるためのものです。しかしモジュール定義命令は global に定義され名前の競合に対してはなんら役に立ちません。モジュールをあくまで名前空間とするのならモジュール定義命令は実装せずラベルによるサブルーチンのみ提供すべきです。が、これはモジュール定義命令というインタフェースが用意されている以上、コードの可読性を考えあえてこれを採用するのは現実的ではありません。(モジュール命令呼び出しよりgosubで呼んだほうが速いのでその辺りにこだわる人は好きなように。ここでは一般論です。)
で、結局モジュールとは何と考えるかというと、モジュールは内部で使用されるシンボルに明示/暗黙的に接尾語をつけることにより競合を避け(競合を避けるためには暗黙的につけられることが望ましく、このあたりから無意味にモジュールに名前をつけるのは嫌い)処理を隠蔽するサブルーチンであり、それを利用するためのインタフェースがモジュール定義命令だと考えます。モジュール内部で定義される変数、ラベルはモジュール利用者側からは隠蔽されるべきであり、モジュール変数にアクセスする場合マクロにより抽象化するかget/setアクセサをモジュール定義命令として実装すべきです。(そもそもモジュール内に値が保持される変数を持つこと自体好きではないのですが、現状ここは仕方がない面もあります。)つまりモジュール利用者はモジュールが中でどのような処理を行ってるか、どのような変数を使っているのかなどは知る必要はなく、公開されるモジュール定義命令が利用者にとって全てだと考えます。
なおこれは今存在するモジュールをどのように運用するかについての考えでありモジュールはこうなって欲しいなどの類のものではありません。
使いづらいので何とかならないかと考えてみる。
gsel 32
としてデバッグウィンドウをカレントにした後BMSCR構造体から得ることが可能。実装としてはこの程度でたいした手間もかかりそうにないのですが、時間がないし3.0で仕様も変わるだろうからあまりやる気がなかったり。そもそも3.0の予定にデバッグモードを外部アプリケーションからリモートコントロール
とかありますし。
コメントがない場合表示を「コメントの追加」に変更。放置していた li のスタイルを設定。
ありがとうございます。夢幻泡影側は雑記がなくなってまともな更新をしていないのではやいところ移行したいのですが、時間が取れないので春になりそうです。
所用で作ったマウス直下の色を取得するツール。何かの参考になれば幸いです。
#include "Proj.API.as"
#include "Proj.API/winapi/gdi.as"
#define GetDC DeclBasicProc1 hUser, "GetDC",
#define ReleaseDC DeclBasicProc2 hUser, "ReleaseDC",
#define GetPixel DeclBasicProc3 hGdi, "GetPixel",
screen 0, 240, 240
gsel 0, 2
// TODO: Windows 2000 以降ではコメントをはずしてください
//#define _WIN32_WINNT 0x500
#ifdef _WIN32_WINNT
#if 0x500 <= _WIN32_WINNT
#const global WS_EX_LAYERED 0x00080000
#const global ULW_ALPHA 2
#define SetLayeredWindowAttributes \
DeclBasicProc4 hUser, "SetLayeredWindowAttributes",
// レイヤードウィンドウは無視されるため自分をレイヤードウィンドウにする
GetHspWindow : hwnd = stat;
GetWindowLong ptr_t(hwnd), int_t(GWL_EXSTYLE);
exStyle = WS_EX_LAYERED | iResult;
SetWindowLong ptr_t(hwnd), int_t(GWL_EXSTYLE), int_t(exStyle);
SetLayeredWindowAttributes ptr_t(hwnd), int_t(0), int_t(160), int_t(ULW_ALPHA);
#endif /* 0x500 <= WINNT */
#endif /* def(WINNT) */
repeat
await 0, 1;
ginfo 0;
if( (tx != prmx) | (ty != prmy) ) {
tx = prmx : ty = prmy;
GetDC ptr_t(0);
hDC = iResult;
GetPixel ptr_t(hDC), int_t(tx), int_t(ty);
r = GetRValue(iResult);
g = GetGValue(iResult);
b = GetBValue(iResult);
redraw 0
pos 0, 0;
color 255, 255, 255 : boxf;
color;
mes "R彩度 : "+ r;
mes "G彩度 : "+ g;
mes "B彩度 : "+ b;
redraw 1
ReleaseDC ptr_t(0), ptr_t(hDC);
}
loop
某書店で「あったかトリビア発見」とかいうスローガンを掲げていたのでひとつ。
トリビアの泉は本にすると電車の中で暇しない本系のマメチ本と大差ない。
だめですか?
HSP関連の掲示板ででよく"他のアプリケーションと同じく"Enterでボタンを押すには〜ってのがありますが、あれはダイアログの機能でウィンドウは(標準で)持っていません。また、このボタンは BS_DEFPUSHBUTTON スタイルを持ち、他のボタンとは別のものです。(クラシックスタイルで黒い淵を持つボタン)普通のボタンをEnterで押す動作は操作系の共通化といった観点からみると、どうかなと思います。
※.NETはウィンドウとダイアログの区別がないためこの際おいておきます。
地方紙の1ページの4/1のを使ってヲタ文化として海洋堂を上げたり、萌えを連呼するのは伺かと思います。
流石に時期はずれかと思い、トップ絵削除。代わりを書いてないのでしばらくトップ絵はありません。素直にメイド服にしておくべきでしたか?
Framework ページのほうで 777 のキリ番を踏みました。だからどーしたって話ですが。
1日だけだと、雑記が少ないときにさびしいので3日に戻してみる。問題は月またぎのことをまったく考慮していない点。よーやく雑記のほうも月単位に対応したところなのでぼちぼち対応していきますが、2月までの対応は多忙のため厳しいかも。
コメントのURIを変更して2月以降も対応できるように。新着コメント通知機能実装。
まず、普通にDllのコードを書きます。
// dll.cs
class a {
// HSP Dll なので int * 4
public static System.Int32 HspFunc(
System.Int32 p1, System.Int32 p2,
System.Int32 p3, System.Int32 p4 )
{
// 渡された引数をメッセージボックスで表示
System.Windows.Forms.MessageBox.Show(
""+ p1 +"\r\n" + p2 +"\r\n"
+ p3 +"\r\n" + p4 );
return 0;
}
}
普通にコンパイル(csc /t:libraty dll.cs
)してDllを作り、それを逆アセンブル(ildasm dll.dll /out:dll.il
)してILを修正します。
まず、アセンブリのマニフェストを編集します。マニフェストはclass宣言の前にあります。(編集部分は ins でマークアップ)
.module dll.dll
// MVID: {99A2C801-A191-4158-B0C9-DB3DA3C6A7BF}
.imagebase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000002
.data VT_01 = int32[1]
.vtfixup [1] int32 fromunmanaged at VT_01
.corflagsが0x1だとWindowsXPで読み込めないので0x2を指定、メソッドをエクスポートするためのvtfixupを定義します。[]に指定する値はエクスポートするメソッドの数です。
メソッドのILを修正します。(編集部分は ins でマークアップ)
.method public hidebysig static int32 HspFunc(
int32 p1, int32 p2,
int32 p3, int32 p4) cil managed
{
// コード サイズ 93 (0x5d)
.maxstack 3
.vtentry 1:1
.export [1] as _HspFunc@16
.locals init (int32 V_0,
object[] V_1)
.vtentry 1:n/.export [n]のnはエクスポートするメソッドの1から始まる通し番号です。_HspFunc@16がエクスポートされる関数名となります。編集が終わるとこれを再アセンブル(ilasm /Dll dll.il /out:dll.hpi
)します。ちゃんとメソッドが出力されているか確認してください。
Dllに渡された文字列はstringでとることが出来ます。文字コードは変換されるようなので気にする必要はありません。ただし[In]のみで[Out]には対応していません。文字列を返す場合、System.Text.StringBuilderを使用します。配列数値変数は固定ならば構造体を定義してrefで渡すことで対処できます。可変個の数値変数と文字列配列変数の操作はunsafeコードを使用すれば可能です、safeコードではわかりません。0x202規約は試していません。誰かやってください。
まぁ実際はリビルドのたびにこんなことをやってられないので、引数仕様を決めてそれを呼び出すだけのラッパDllを作るのが現実解で、そうするとMC++使ったほうが良いという結論になりますが。
トップページの雑記を1日だけにしてシンプルにしてみました。
Mozilla/4.0 (compatible;)のUAの人が定期的に同じリソースにアクセスしてるのですが、何してる?更新チェッカの類かもしれませんがMDI覚書を定期的にアクセスする理由がわかりません。
Ver7.1を入れると、とりあえずそれなりに見えるようになったので対応は保留。(7.01で確認していた)まだあずまや。の文字がずれてますがこれくらいなら良いだろうといことで。上のNaviはPHPで生成しているためUAを判別して分岐することは可能ではありますが、、、
この問題とは関係ないですけど上の水の絵をスタイルシートに変えてみました。
HSPでinput/mesboxを使用する場合、manifestファイルによりコモンコントロール6.0を使うべきではありません。HSPはinput/mesboxに文字入力があった場合、割り当てた変数と同期を取るためWM_GETTEXTを送信します。この時コモンコントロール6.0では扱いが異なります。
問題の検証コード
#include "Proj.API.as"
#const global WM_GETTEXT 0x000D
buf = "" : txt = "";
input buf;
GetHspObject 0, 0 : hObj = stat;
button "取得", *b
stop
*b
SendMessageA ptr_t(hObj), int_t(WM_GETTEXT), ptr_t(4), var_t(txt);
mes iResult;
mes txt;
stop
日本語文字列(あああ)を書き込んだ場合"ああ"が取得されます。バッファサイズに4を指定しているため"あ{0x82}"が取得されることを期待すると、終端nullがつぶされ、バッファオーバーフローする恐れがあります。またこの時の戻り値は、(wParama-1)文字、テキストを取得しそれをバイト単位に変換したものが返るためまったく参考になりません。("あいうえお"なら3文字は"あいう"なので6、"aあbいcう"なら3文字は"aあb"なので4が返ります。)
当然C/C++で組んだ場合も同じ問題は発生しますが、回避コードを書くことができます。HSPはそれをシステムがやってしまっているところに問題があります。
SetWindowTheme()を使用します。この関数は引数にUnicode文字列を要求しますが、""を渡すため変換する必要はありません。
#include "Proj.API.as"
ll_libload hUxTheme, "UxTheme.dll"
#define global SetWindowTheme DeclBasicProc3 hUxTheme, "SetWindowTheme",
button "Button", *d;
GetHspObject 0, 0 : hObj = stat;
SetWindowTheme ptr_t(hObj), str_t(""), str_t("")
*d
stop
WindowsXP以外をサポートする場合SetWindowTheme()が存在するか確認する必要があります。また、これはHSPでコモンコントロール6.0を使用した場合に発生する問題を回避するものではありません。
現在 notes.php と 2004/1 は同じものが表示されています。当初は10日間のみコメントを有効にするつもりでしたが、よい方法が思いつかないのでどうしようかといった感じ。
複数行書き込んだ際の<br>が2つ付加バグを修正〜。
後はクッキーに対応しないと。
雑記に投稿機能を実装(普通こちらが先な気もしますが)、これで出先からの更新が可能。それに付随して微妙にID振り当て規約などを変更してます。
そんなわけで予告どおりあずまや。側にも雑記追加です。ただ、コメント実装は間に合わなかったのでやってませんが。
n氏誕生月(日じゃないのは長々と掲載しておくから)おめでとう、ということでデジキャラットです。メイド服なんか描いてられるか!ってなわけで着物着せてます。ただ、手抜きなため浴衣に見えるのが残念。ちなみに写真屋だけで塗ってます。
意外と簡単で機能の実装自体は終わりました。例によって暫定実装なので予告なく削除される可能性があります。また、サイト内の文書構造(あずまや。のみh1だったのを変更して見出しもh1でマークアップ。)を変更したため一部で問題が出る可能性があります。ネスケで正しくレタリングされない問題は後日修正します。
2箇所の神社にいったのですが、両者とも「吉」で初めの詩から、願望、待人、、、等まで全く同じ内容。まぁおみくじなんてそんなものでしょうけど、しかし、、、
Copyright(C)方位記号