メイン

Programming アーカイブ

2004年07月27日

Win32APIでツールバ~

を作ろうとしてんだけど,激しくめんどくさい。
特にMFCをやったすぐ後にAPIを使いはじめたというのもあり...
ツールバーはメニューと違って,子ウインドウとして扱われるんですよ.(コントロールと考えれば当然?)だから今までつくってたクライアント領域をツールバー分ずらさなきゃいけないわけなんですよ...でもそれは気持ち悪いから,描画部分も子ウインドウとして定義したほうがいいような...MDIなんかつくろうとしたら一体どんなコードになるんだ...おそろしや...
ウインドウプロシージャはどんどん肥大化してるし...(分割すべきなの??)
かといって,MFC使ったところで機能貧弱→API呼び出すのも汚いと思うんですよね.全然OOPにならないし.
オブジェクト指向でやるなら,元からWinMainもクラスになってるC#(というか.NET)使ったほうがいいの??
でもそれこそ周りの誰も読めないコードになるんだろうな...

on_

そのうち,ちゃんとカテゴリで覚書きつづろうかな

2004年08月03日

ビットマップの表示

MFCでは外部のビットマップファイルを読み込むものが用意されてないし、DIB形式の表示すらない。
ってことで自分でDIB形式の構造体を用意して、DIBを表示するAPIを呼び出す必要があります。

1. ファイル読込
CFILE使ってオープンする場合。


pDib = (BYTE*)new char[file.GetLength()];
file.Read(pDib, file.GetLength());

pBmfh = (LPBITMAPFILEHEADER)pDib;
pBmih = (LPBITMAPINFOHEADER)(pDib + sizeof(BITMAPFILEHEADER));
pData = pDib + pBmfh->bfOffBits;

2. 表示
表示するAPIは他にもあるけど、hdcの取得にはGetSafeHdc()を使いましょう。


::StretchDIBits(pDC->GetSafeHdc(),
0, 0, pBmih->biWidth, pBmih->biHeight,
0, 0, pBmih->biWidth, pBmih->biHeight,
pData, (LPBITMAPINFO)pBmih, DIB_RGB_COLORS, SRCCOPY);

2004年08月11日

Hello C# World.

C#の開発環境って、やっぱ VS .Netとか買わなきゃいけないのかな~とか思ってたけど、コンパイラだけなら標準でついているらしい!
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
というフォルダの csc.exe がそれ。もしなければ、WindowsUpdateの.Net Framework 1.1 とかいうのをインストールすれば無料で手に入るっぽい。
ってことでやってみよ~。

続きを読む "Hello C# World." »

2004年08月16日

ビットマップ

WindowsAPIの関数は本当にごちゃごちゃしている・・・
描画に関する関数にしても、似たような名前が多くて、かなり混乱します。
で、わかる範囲でまとめていこうかと・・・

・DC→DC
BitBlt()
StretchBlt() // 伸縮
設定:StretchBltMode()
TransparentBlt() // 透過色の設定
AlphaBrend() // 半透明処理
PlgBlt() // 回転(平行四辺形への転送)

・DCの生成
CreateComaptibleDC()
削除:DeleteDC()

・DDB(HBITMAP)の生成
CreateBitmap()
CreateBitmapIndirect() // BITMAP構造体を利用
(↑通常は、1ピクセル1ビットのモノクロビットマップの作成)
CreateCompatibleBitmap() // DC互換ビットマップ

・DCとDDBの関連付け
SelectObject()
⇔DeleteObject()

・ファイル(リソース)→DDB
LoadImage()
LoadBitmap() // リソース

・DIB→表示(DC)
SetDIBitsToDevice()
StretchDIBits() // 伸縮

・DIB→DDB
CreateDIBitmap()
値セット:SetDIBits()

・DDB→DIB
GetDIBits()
(情報は失われている可能性がある)

・ピクセル→表示(DC)
SetPixel()

・DIB と DDB の相互参照
CreateDIBSection() // ??

2004年10月08日

Shading

OpenGLでシェイディング、つまり陰影付けなんだけど、パラメータが多くてちょっとやっかい。
どうやら物体の色は、光源と材質のパラメータによってきまるみたいです。
まぁそりゃ当たり前だけど、光と色ってのがあまり直感的につくれないんだよね。

光っていえば色と強さくらいしかない気がするけど、光の種類というものが存在する。
GL_AMBIENT  環境光。光が直接あたらない部分の照度 えっ(^-^; て思うけど、まぁ室内とかであちこち反射して当たる光を擬似的に表現。
GL_DIFFUSE  拡散光。光があたり、拡散する光。見る角度を変えても変わらない。
GL_SPECULAR  鏡面光。光があたり、反射する光。見る角度によって明るさが変わる。
GL_POSITION  光源の位置
GL_SPOT_DIRECTION  光源の方向
GL_SPOT_EXPONENT  輝度の分布(?)
GL_SPOT_CUTOFF  最大放射角度。スポットの範囲かな
GL_CONSTANT_ATTENUATION  一定減衰
GL_LINEAR_ATTENUATION  線形減衰
GL_QUADRATIC_ATTENUATION  二次減衰

んでもって物体の材質は
GL_AMBIENT  環境光
GL_DIFFUSE  拡散光
GL_SPECULAR  鏡面光
GL_EMISSION  放射輝度
GL_SHININESS  鏡面光の指数
GL_AMBIENT_AND_DIFFUSE  環境光と拡散光
GL_COLOR_INDEXES  環境光、拡散光、鏡面光のカラー指標

光源と材質両方で、光を指定しなきゃいけないのです。もちろん厳密に計算しようと思えばいくらでも理論はでているんだけど、それをPCに計算させるのは無謀。だから、まぁこんな風に誤魔化してつくるしかないわけ。
おそらく、光のパラメータと材質のパラメータの乗算っぽい計算で、拡散やら反射の色が決まってくるみたい。材質が暗くても、0でなければ強い光をあてることで明るくなる。

2004年10月27日

LocationMap : Station地図表示アプリ

私はvodafoneユーザなんですが、ステーションってご存知でしょうか?
まぁ簡単に言うと地域密着型情報発信って感じかな。
一番近い基地局から情報がどんどん送られてくるわけですが、そのときに基地局の簡易住所みたいのも手に入って、大体の現在地を得ることができるんですよ。まぁGPS携帯に比べれば精度は比較にならないほど低いですが。
そんな地点情報をログにとってくれるJavaアプリがあって、
それが、場所撮り(仮称)
なんですけど、数日前から使ってみたんです。データはtxt形式でメモリカードに保存されるんです。
ちょっと生データみてみると、時刻、経度、緯度、地点名が入ってました。経度緯度までわかってんなら地図まで表示しろよって思ったんですが・・・

そんなことを帰宅途中に考えていたら、OpenGLで書いちゃいました。
俺の通学路です。

ほんと大したこと書いてないのでソース載せてもいいくらい。
ただ、なにに苦労したかって・・・白地図の入手と今更ながらテクスチャの貼り付けに9割。
24bit BMPのくせになんかビット情報がうまく取得できてなかったり。
ようわからん。
もー色々時間余裕ないのにこういうこと思いつくとやってしまう・・・だめぽ。


追記。。。国土地理院の地図をフリーソフトつかって入手してんだけど、その明記が必要なようなので。

上記の地図には「白地図KenMap」を用いました。

白地図 KenMap Ver8.0       2004/11/01
国土地理院承認 平14総複 第149号 (2002/07/12)
http://www5b.biglobe.ne.jp/~t-kamada/

2004年12月12日

wsprintf と sprintf

数値を書式付の文字列に置き換えるのに便利なwsprintfとsprintfですが、どう違うんだっけ!?ってよく迷ってしまいます。

wsprintf
・Win32API
・UNICODEに対応
・浮動少数は表現できない!
sprintf
・標準ライブラリ
・浮動少数OK

基本的にwsprintfはUNICODEが扱えるsprintfの簡易版ということでよいのかな。

2004年12月26日

動画再生プログラミング

動画の再生をするのに、DirectShowのCOMやらなんやら難しい概念を利用しないと出来ないかと挫折気味でしたが、.NETなら簡単にできるっぽい。
Media Player コントロール。コード一行で埋め込めるとか・・・。
こういったときの開発効率って重要だよな。もちろん、中身の実装を知っていたほうがいいんだろうけど。

Visual C# による .NET Framework プログラミング入門

とりあえずSpokeでも早めに買っておこうか・・・

2004年12月27日

動画再生とか

なんとなく、C#.NETのフォームエディタで作ってたらさまになってきました。
というかVBだよなぁ。使ったことないけど雰囲気は。
勝手にメソッド書いてくれるし、ほとんどイベントに対して一行ずつコード増やしていくくらい。
いやぁ、これはC++&DirectShowで書いたらクエリインタフェースとか訳わかんない作業をひたすらしなきゃいけないんだよなぁ。
時間の計測とファイル選択ができればほぼ完成。素晴らしい。

ほんとは黒い四角で動画が再生されてんだけど、MediaPlayerとかプリントスクリーンしても写らないんだよねぇ。

2004年12月28日

[C#.NET]時間計測

時間計測の仕方が大体わかった。

DateTime.Now.Ticksで、現在時刻を0.0000001秒単位のlongで返すみたい。

だから↓みたいに書けばよいかな。

long lt = DateTime.Now.Ticks;
~処理~
double dt = (DateTime.Now.Ticks - lt)/10000000.0;
MessageBox.Show(dt.ToString() + "秒");

2005年01月05日

Regnessem Plugin...

ChataとRegnessemのプラグインつくったりしてんだけど、
本企画と別に名前変更メニュー追加とかしてみた。
こういうのって便利だと思うんだけどどう?

あ,のせてよかった?

2005年01月25日

処理速度

画像処理でちょっと重い処理があるんだけど,
関数で遠まわしに呼ぶようにしたら,30%くらい速くなった.
なんで!?計測する場所は変わらないのに,ダイアログボックスやメニューで呼び出すとそれぞれ時間が変わってくる.なんだよこれ!Windowsのせいか!?
わけわからん・・・。

2005年02月15日

('A`).dll

[4:30:55] Toki の発言:
うらなう
[4:30:58] Toki の発言:
運勢 : ('A`)

2005年12月06日

可変引数

標準ライブラリを暗記してるとかそういうわけじゃないが、今更C言語の文法にひっかかるとは思わなかった。

「可変個の引数」
printfの第二引数以降のあれです。

int printf(const char *format, ...);

ドット三つで表記します。ただし、必ず仮引数の最後で。
いくらでも引数をいれていくことができるわけです。
使い方は、

va_list list; /* va_list型の変数を用意*/
va_start( list, format ); /* ... の直前の引数をいれる */

として初期化をし、

va_arg(list, int); /* (次の)引数をint型で取り出す */

最後に、

va_end( list ); /* 可変個の引数リスト 使用終了 */

と記述する。
それぞれマクロなんだけど、なにしてるのやら。。。
printfとかはスイッチ文とかで型を決めてるんですかね。
こんなことを知ってるとprintfのトッリキーな使い方とか出来るかも。

職場でログをはくのに使ってましたのさ。

2006年02月01日

移動履歴マッピング

久々にプライベートPG。といってもほとんどコピペ。

以前、vodafoneのステーションというサービスを利用し、OpenGLを使った移動履歴表示ソフトを作成したことがある。
Google Maps API というサービスをご存知でしょうか?あのGoogleの地図のAPIが公開されていて、簡単に自分のサイトで利用できるのです。

Googleマップ+Ajaxで自分の地図をつくる本

んで、位置情報とグーグルAPIを足し合わせてみました。

今の通勤路
昔の通学路1
昔の通学路2
↑ ユーザ:ここの管理者の姓 / パスワード:ここの管理者の名

まだ工数2.5hくらいなのでプロトタイプもいいところです。
でも、なんかおもしろいこと出来そう。

以上

2006年08月18日

日付計算

アルゴリズムに悩み中。

ものすごく簡単なことなんだけど、計算オーダーの少なさと設計のシンプルさを重点したくて

概要:基準の日付、日数の差を指定した時の日付を知りたい。

入力: 日付、日数差(出来れば負も)←この数値はかなりでかい。
出力: 日付

※ 日付は { 年、月、日 } で構成。

ただ、これだけなんだけど、毎年ぐるぐるとうるう年計算して差を縮めるしか思いつかない・・・。

誰か、綺麗なモジュール設計を自慢してくれませんか?

(今、思いついたのは400年or100年or4年離れているか、で計算が有力・・・)

2007年01月24日

vi

※プログラマむけ

Cygwin環境を整備してた。

今一度、CUIの利便性を考えてみる。

最近、エディタをvi(vim) に移行気味。 ( CygWin -> CygTerm + TeraTerm 環境下)
昔(大学の頃)は、こんな気持ち悪い操作絶対習得しない!って思ってたけど、
一度、使わざるをえない状況になってみると、その操作性が手放せなくなってしまう。

①シェルに切り替わった時の操作がスムーズ。
  全部コマンドってのは、要するにいちいちソフトの場所探さなくていいってこと。
  ランチャは設定めんどくさいし。

②ctagsがかなり使いやすい(秀丸+htags でもいいんだけど、まだ惜しい感じ)

③マウスがいらない。キー入力も最低限。
  これが究極だとは思う。数行削除するのに、いちいちドラッグしなくてもいいとか。(数字+dd)
  ペーストも p だけだし。Ctrl との組み合わせ操作もいらん。

④正規表現に強い
  まだ、サクラや秀丸のくせが抜けないけど、検索・置換の強さといったら・・・

⑤速い

補足として、Cの構文のカラー表示もすんなり対応できたのが導入のきっかけかな。
折りたたみとかは、GUI(秀丸)のほうが使いやすい気がした。

でも、一番の理由はUNIXいじらなきゃいけない時に対応できないとまずいから。
しかし、なんで俺はIDE開発してないんだろう・・・。


あと、xyzzyとか試してみたいけど、viになれてからのemcas系は結構しんどそうだな

2007年01月25日

ばぐ


リリース(内部)した後に、自分で気づくバグって不快だね。
2文字打つだけなのに。
やっぱ単体テストは自動化しないとなぁ。。。

2007年01月26日

工程について

雑感

うちは基本ウォーターフォールなんだけど、

デザインとドキュメンテーションが混在してるなって思った。
どっちも大事だけど、やるなら

要求分析とか機能分析とか
  ↓
デザイン→実装→テスト→ドキュメンテーション では?って思った。

実装の前に設計書を一字一句修正するのは異常だよ。
まぁ、この辺、全部開発工程ともいえるんで、並行作業してりゃいいのかもな。
結局、実装ができない人間が設計はすんなって自己完結だ。

以上

2007年08月10日

コンパイル格闘

コンパイルが通らない。通らない。通らない。

2日間かけてやっと光が見えてきた。

なにをやってるかというと、WireShark(旧Ethereal)をソースから自力でコンパイル
ちょっといじれば独自プロトコルの表示プラグインが作れるみたいなんで挑戦してみました。

英語ドキュメントのコマンド入力のとこだけを流し読みして、
Subversion(実は初めて使った)でチェックアウトして、
Cygwinの足りないアプリをSetupして、
Windowsのコンパイラ(Visual C++ 2005)もいれなおして、
環境変数いじりまくって、
Makefileもいじりまくって、
よくわからない文字コードを無視して、
大量Warningに耐えて、

とにかくtry&error...

こんなことやってるの、大学時代のOpenGLの格闘以来な気がする。
業務では、時間かけて環境構築なんてなかなかやらせてくれないし
できる人任せなところはあるんだよね。

UNIX(Linux)環境とかまじめに手をつけておかないとやばいな・・・
ユーザレベルなら問題ないんだが。。。


ようやくフルメイクできたと思ったら、最後のリンクでなんか競合とかUndefとかしてる。
きっとコンパイラやライブラリパスを途中で変えまくったせいだろう。
プラグインだけならコンパイルできるからもういいかな。。。
気が向いたら一から手順見直す。


ひさびさにらしいことをしたので満足。(でも開発はこれから)
ねる。

2008年08月03日

PG_2008夏

夏の勉強。

遅延評価勉強でもするかってことで
目標を用意

 - もの テキストブラウザ
      ・by C# & by ruby
      ・プロキシ設定できること
 - じかん 8月中


とりあえずhttp関連のライブラリを一度さわっておくのが目的。
基本がわかりゃRSSリーダの展開とかもすぐできるだろうし

# web系PGに手をつけようとも思ってるけど、サバ立てする気力がまだない。。

[PG] http get

勉強。
とりあえず参考URLコピペ加工。

C#
// 参考 http://www.divakk.co.jp/aoyagi/csharp_winexe_05.html

using System;
using System.IO;
using System.Net;

class c
{
	public static void Main()
	{
		UrlOpen("http://chrono.s9.xrea.com/");
	}

	private static void UrlOpen(string url) {
		WebRequest req = WebRequest.Create( url );
		WebResponse rsp = req.GetResponse();
		Stream stm = rsp.GetResponseStream();
		if (stm != null) {
			StreamReader reader = new StreamReader(stm, System.Text.Encoding.GetEncoding("Shift_JIS"));
			string readText = reader.ReadToEnd();
			Console.WriteLine(readText);
			stm.Close();
		}
		rsp.Close();
	}

}
ruby
# 参考 http://www.ruby-lang.org/ja/man/html/net_http.html

require 'net/http'
Net::HTTP.version_1_2   # おまじない
Net::HTTP.start("chrono.s9.xrea.com", 80) {|http|
  response = http.get('/index.html')
  puts response.body
}

続きを読む "[PG] http get" »

[PG] http get proxy

proxyの設定

C#
// 参考 http://dobon.net/vb/dotnet/internet/useproxy.html


//// -----------------------------------------------------------------
//// プロキシの設定

string str_proxy = "http://localhost:8080";
string str_url = "http://www.yahoo.com";

//HttpWebRequestオブジェクトの作成
HttpWebRequest webreq = (HttpWebRequest) WebRequest.Create( str_url );

//プロキシの設定
//プロキシサーバーを指定
WebProxy proxy = new WebProxy( str_proxy );
webreq.Proxy = proxy;

//HttpWebResponseの取得
HttpWebResponse webres = (HttpWebResponse) webreq.GetResponse();

//受信して表示
Stream st = webres.GetResponseStream();
StreamReader sr = new StreamReader(st);
Console.WriteLine(sr.ReadToEnd());

//閉じる
sr.Close();
st.Close();


//// -----------------------------------------------------------------
//// Internet Exploreの設定
webreq.Proxy = WebProxy.GetDefaultProxy();

//// -----------------------------------------------------------------
//// プロキシを使用しない
webreq.Proxy = GlobalProxySelection.GetEmptyWebProxy();

//// -----------------------------------------------------------------
//// プロキシ認証
WebProxy proxy = new WebProxy( str_proxy );
proxy.Credentials = new NetworkCredential("name", "pass");
webreq.Proxy = proxy;

//// -----------------------------------------------------------------
//// すべてのWebRequestで使用するプロキシを設定する
WebProxy proxy = new WebProxy("http://localhost:8080");
GlobalProxySelection.Select = proxy;
ruby
# 参考 http://www.ruby-lang.org/ja/man/html/net_http.html
require 'net/http'
Net::HTTP.version_1_2   # おまじない

$proxy_addr = 'your.proxy.addr'
$proxy_port = 8080

Net::HTTP::Proxy($proxy_addr, $proxy_port).start( 'chrono.s9.xrea.com' ) {|http|
  response = http.get('/index.html')
  puts response.body
}

[PG] pukiwikiのバックアップ取得

勢いよくC# Mainのみでコーディング(--;
Wikiのバックアップをテキストベースで保存しておきたっかたので書いてみました。
汎用性は非常に低いので、必要に応じて改造。遅延評価。

rubyの移植も気が向いたらする。

続きを読む "[PG] pukiwikiのバックアップ取得" »

About Programming

ブログ「days」のカテゴリ「Programming」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはNetworkです。

次のカテゴリはProgramming(C♯)です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34