メイン

2006年04月18日

ふぁいるでぃすくりぷた - プログラム

今日は目覚めたら久々の快晴。
布団干し日よりだと判断した俺は、すでに遅刻気味の時間だったのに布団を干しました。
結果、1時間目は欠席と判断されるレベルの遅刻時間になりました。

どうせ出席にならないならー・・・っと、親が他の部屋の布団干すのを手伝ってたんですが、思いの他時間を食って、2時間目も40分遅刻となりました。
残念な事に、担当がちょっときびしめの講師で、欠席扱いになりました(´・ω・`)

天気のばかやろー。

午後のPSⅡAとゲーム理論は、授業内容は面白いんだけど、担当講師の話が脱線しすぎるのが鬱。
しかも、1週間に9時限(時間にすると13時間半!)もこの人の授業があるわけで、同じ話を数回聞くはめになる('A`)
脱線話は適当に聞き流して、来週あたりはPS用のライブラリでも作りたいなぁ。
画像描画系が、API関数そのまま使ってたらだるすぎるので(´・ω・`)
C++使えたら楽なんだけど、C言語しか提供されてないのも激しく鬱。


ライブラリといえば、ネットワークプログラミングの授業で作るソケット用のクラスを、今後も使って行ける汎用的なものに仕上げたい。
ソケット関係を掘り下げて学ぼうとしてる事を知った、バイト先の上司様から助言をいただいた。
「forkとpipeとfile descriptorを使うと良いよ」

まったくわからなかったので、即座に検索してみました。
fork()ってのは、自分とまったく同じ子プロセスを生成する関数で、戻り値で親側と子側を判断する、便利で面白い関数でした。

pipeってのは要するにプロセス間のリダイレクトの事のようです。
今まで知ってたリダイレクトってのは、コマンドラインとかで『ls > buf.txt』とかするように、プロセスの結果をファイルにリダイレクトしてました。
それとは違って、片方のプロセスの標準入力と、もう片方のプロセスの標準出力を連結したりするのが、文字通りパイプです。

file descriptorってのは、ファイルや標準入出力を判断する識別子(ハンドル)の事。
標準入出力とエラー出力で、0,1,2を使ってて、新たに取得されるハンドルは3から割り振られる。
身近なものだと、fopenなどで返されるファイルハンドル(ファイルポインタ)なんかがそれにあたる。


socketが返すハンドルもファイルディスクリプタで識別されているので、ファイルと区別無くread・writeでシームレスに読み書きができるようです。
プロセス間通信のioもソケット通信のioも、ファイルディスクリプタで識別されるので、selectでまとめて監視する事が可能です。


若干の問題があるとすれば、fileとsocketの扱いをファイルディスクリプタで纏めてるのはLinux環境だけの話で、Windows上でのsocketはfileと別扱いです。
振り出しに戻るかと思いきや、Winsock2ではsocketハンドルもfileハンドルも扱いが同じなので、_open_osfhandleを使うことで解決できそうです。
ただ、これだとWinsock2が入ってない環境だと、DLLつけないといけないわけだけど・・・。
ReadFileAPIには、ソケットハンドルも渡せるみたいなんだけどWinsock2が入って無くてもいけるってことなんだろうか?

たぶん、何も教わることなく実装してたら、汎用性のかけらも無いものになってたんじゃないかってくらい、色々学ばせていただきました。
元々、プロセスではなくスレッドを使ってマルチスレッドを実装しようとしてたり、
サーバークライアント型がめんどくさそうだったので、接続数が数人でもP2Pで全部つないでしまおうかとか考えてたので( ´-`)


ってか1時半には寝ようと思ってたのに、こーゆーこと調べだすと、時間とか見なくなるなorz




参考URL
・68user's page「ネットワークプログラミングの基礎知識」
http://x68000.q-e-d.net/~68user/net/

・ショウソフトのHomePage「プログラム講座 シニア編」
http://hp.vector.co.jp/authors/VA003991/kouza/senior/index.html

・ 筑波大学情報学 講義「システムプログラム」 授業内容メモ
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2004/

・「C++:language&libraries」ML 非公式ライブラリ
http://www.tietew.jp/cppll/archive/5844

投稿者 tyoro : 02:41 | コメント (202)

2006年04月17日

WEBメモ帳 - プログラム

今日は高校のメンバーで集まって世界遺産展→遊ぶ・・・予定だったんだけど、もともと3人の予定なのに1人欠けたので、2人行動でした。
世界遺産展→ステーキ丼→ビリヤード→ダーツ→カラオケ→本屋→吉野家。

ステーキ丼が、1年前に食った時と比べ物にならないくらい美味くなってて驚いた。
また行こう。

タイトルと書き出しがぜんぜん関係ないわけだけど、ここからはタイトル通りの話。

最近、別のPCで作業する事が増えた。
家の中でも、デスクPC1とノートPCでの作業で別だというのに、会社での作業と学校での作業が増える。
その上、学校で使うPCは何百台の中からその都度変わるので、データ共有がめんどくさい。

特に、授業関係のメモみたいなのと、作成中のゲームのメモがいろんなPCで作られて、ひとつのまとめるのも面倒(´・ω・`)
最初の頃はUSBフラッシュメモリを使ってて、前はFTPで共有してて、最近はBLOGの下書きをメモ代わりに使ったりしてる。

今回はメモに限った事なので、それを管理するようなWEBシステムを、ちゃちゃっと作れないかと妄想。

考え出すと、なかなか便利そうなアプリが脳内で完成したわけで、実装には夕方から夜を使って2日くらい。
でも、作るのがめんどくさい。
それに夕方から家でプログラム組める日もほとんど無い(´・ω・`)


同じような事を考える人は居るだろうと、WEBメモソフトを探すと、やっぱりあった。
とりあえず最初に見つけたのはninjinさん作のRandomNoteってソフト。
コレには便利機能が拡張された派生系ソフトが山のようにあるようで、自分にあったのを探せば使えそう。
(最悪、Basic認証かけたWiki使うってのもありだけど。

ついでにプログラムソース管理やら、ゲームに使う画像の管理やらも出来たらいいなぁなんて考えてたら・・・。
結局CVS(今ならSubversionか?)なり使って、バージョン管理すんのが開発には一番いいじゃんって事に行き着いた。
でもそれじゃ手軽さが無い・・・。


あくまでもテキストファイルと画像ファイルだけを、共有管理するWEBシステム、これをゴールデンウィークにでも作ろうかなぁ。

この手のを、SNSにでもつけてくれれば便利なんだけどなぁ・・・。
ってか、mixiがただのSNSじゃなく、サイボウズみたいなグループウェアならいいのになぁ・・・。

投稿者 tyoro : 01:49 | コメント (202)

2005年12月01日

プログラムコンテスト in ハル研 - プログラム

今年もとうとうこの時期がやってまいりました。
毎年恒例のハル研究所主催のプログラムコンテスト

すっかり忘れてて、今日ふと思い出して何時ごろから始まるのかとHP行ったら今日からだったという偶然の出会い。
目指せ優勝賞金1万円・・・じゃなくて、ハル研究所への入社への第一歩としてがんばろう。

って息巻いたのはいいものの、部活のHPが優先なのです(´・ω・`)
掲示板は一通りできたので、部員管理システムの実装。

こちらも、画像ファイルをデータベースにバイナリとしてUPするところに少々躓いたものの、掲示板よりはすんなり完成。
後はデザイナーさんからのデザイン待ち。
ってことで、今回のプログラムコンテストにやっと参加できると思ったらもう朝だったりします。


全ての橋を1ずつ全部通るのが目的。
平成教育委員会の給食の時間の問題に出てきそうな傾向の問題。
問題を一通り理解して少しアルゴリズムを考えてみた感じだと、けっこう組み方が色々あって難しい。
去年の通称「焼肉プログラム」は比較的単純だったんだけどなぁ・・・。

グラフ理論の応用的な問題なんだけど、一方通行の橋が最大2つ存在するってのがややこしい限りの問題にしてる。
しかも去年は1月半ばまでだったのに、今年は12月19日までなので、けっこう短期決戦。


みんなも、勉強にもなるし腕試しにもなるので、ぜひやってみてくださいな(´-`)

投稿者 tyoro : 09:31 | コメント (202)

続・ツリー型掲示板 - プログラム

昨日作った掲示板にいろいろ追加実装&バグとり。

●追加実装
・トップページには最新5件を表示して、ページをめくる形に変更。
・新着メッセージが書き込まれたときに、スレッドをageる機能実装。
・メール欄にsageと書いている場合、スレッドがageられないようにする機能実装。
・管理者ページのログイン(中身はほとんど未実装だけどネ

●バグ取りとか変更
・クッキーの存在しないユーザーが新規スレッドを立てれないバグ修正。
・内部的な事だけど、スレッドトップのメッセージも完全に他のメッセージと同じ扱いになるように修正。


他にどんな機能があったらいいんでしょうか?
なんか「コレはつけとけYO」みたいなのあったら、コメントよろす。

結局学校行ってないので、デザイナーのfaaくんとは会えなかった・・・。
納期今日だったんだけどなぁ・・・。

投稿者 tyoro : 03:31 | コメント (202)

2005年11月30日

ツリー型掲示板 - プログラム

お友達のぐみくんが掲示板を作ったりしてました。
がんばってるなぁと思って見てて、何かひっかかることが・・・けいじ・・・ばん・・・?

あーーー、11月末までに部活のHP作るんだったよ。
しかも月末1日前だよ。

ってことで、とりあえず一番めんどうなツリーBBSを今日中に作る事にしました。

とりあえず3分間クッキングよろしく結論を先に出すと、出来上がったのがこちらになります。
正直、一晩で作ったにしては力作。

サンプルぱくってくるとかセコいことはせず、完全自作。(ってか自分以外の作者のソースをいじる方が精神的に負担)。
デザインは部活に所属してるデザイナーさん、ってかfaaくんがやってくれるので、中身だけの製作。


とりあえず、現在のデザインでの機能を書いておくと。
・一般的なツリー式掲示板。
・●の部分のリンクからスレッド全体のページへ飛ぶ。
・題名のリンクからメッセージ毎のリンクへ飛ぶ。
・返信のリンクは返信書く所の頭に飛ぶためにあるけど、結局メッセージ画面が短いので意味ナス。

後は、感覚でわかるだろ(´-`)


未実装ってか未対応の部分として、削除済みのメッセージが見れるという段階です。
スレッドトップのメッセージを削除した場合に到っては、画面に何の反映もされないです。
つまり未完成です。
でももうねもいので寝ます。


けっこう無駄に実装で凝ってるので、中身の解説とかしてみたかったりしてウズウズしてます。
((o(゙ε゙)o))ウズウズ


明日バイトだけど、HP完成すんのかなぁ・・・。
ってか、デザイナーのfaaくんが風邪っぽかったけど、デザインは回ってくるんだろうか・・・。

まぁ、無理しないでほしいし、気長に待とう。

投稿者 tyoro : 06:03 | コメント (202)

2005年08月27日

2時間プログラミング - プログラム

今日の部活で、部長が後輩に30分でテトリスを作れといいおった。
実際、作れんのかということで、俺と部長が別々に実装してみることに。

それが悲劇の始まりだった・・・。

ひとり、またひとりと減っていく部員・・・。
消えていく電灯・・・。
降りるシャッター・・・。

部活終る予定時刻より大幅に遅くなってしまって、部員は3人しか残らず、電気も消えちゃったっつー話。


ってか、自分がいつも使うプログラムのフレームワーク(雛形)を使えば、30分で実装できる自信はあるんだけど。
今回はコンソールのプログラムで、しかも何も無いところから全部手打ち。マンドクセ('A`)

どうせ途中で終るだろうと、やる気無くカタコト打ってたら、向こうの方からすげーパワフルな打キー音が聞こえてくる。
ぶ・・・部長はやる気だ!

ってことで、俺もやる気だしてパワフルなキーボード破壊音を炸裂。
2時間程度の格闘の末、とうとう完成。いちおう遊べるだけ。点数とかOP画面とか一切なし。

そのソース(2htet.cpp)


特にキー入力に手間取りました。
普段、自分の昔作ったフレームワークに頼ってるので、キー入力系の記憶は完全に失われてました。
しかも、押しっぱなしだと反応し続けるという辛さがあります。
フレームワークのキー入力周りは変化(キーが押された・放された)を検出してますが、今回のは押されているかという状態のみで判断してるもんで・・・。


230行テトリスと7行テトリスには遠く及ばないけど・・・。
同じような処理が5箇所にもわたって書かれてるのもあるし、関数化すれば200行は切るだろう。

もっと、最初に考えてから組まないと、グダグダな結果になるなぁ。


しかし、この簡単なパズルゲームを2時間程度で実装するってのは、プログラムのリハビリに最適かもな。
覚えとこう。

投稿者 tyoro : 06:13 | コメント (202)

2005年05月21日

ゲーム音楽 - プログラム

自作ゲームプログラム用の音楽を6つほど頂きました。
ほんと、これがTVゲームで普通に使われてても違和感が無いと思えるくらいレベル高いんだけど、
RPG向けなサウンドなので、タクティクス系の戦術シミュレーションを作ってる自分としては、使いどころが難しいところ。

しかしながら、OP用の曲、ED用っぽい曲、戦闘用の曲といろいろあったので、その辺はカッチリはまりそうです。
あとの3曲もちゃんと生かせる雰囲気にしないとね。

音楽を貰ってやる気が出たので、プログラムに取り組みました。
いつも、金曜日の部活の時間に進めているけど、今週は部活無かったから。
しかし、設計は決まっていくのに、実装するために手が動かない。

もうちょっとモチベーション整えるべきかな。


続けてコツコツとプログラムできる人がうらやましい。
一気にぐわーってやらないと、集中力が持続できません。

情熱が足りない。

投稿者 tyoro : 01:38 | コメント (202)

2005年05月10日

プログラムのコンテンツ - プログラム

そういえば、そんなコンテンツを考えてたり、書いてたりしたけど、うやむや化している。
友達に「見てた」といわれて初めて思い出したわけですが、前に書いた内容には実は問題があった。
でも放置してた。

だめだなぁ・・・まぁいいか。

問題ってのは、位置検出の実装部分なんだけど、タスクバーのサイズを使って位置を検出していた。
でも、実はXPのタスクバーは +2だとか-2だとかのWindowサイズとのズレが存在しないらしい。
開発は2000でやってたから、気づきませんでした。

ってことで、修正しようと思って直し方を悩んでたら、とてつもなく簡単な方法があった。
というよりも、見落としてた。

SHAppBarMessageという関数で、APPBARDATA構造体にタスクバーの座標位置情報をセットさせていたわけだが、その際に上下左右の位置情報までセットされていたというのだ。
Ω ΩΩ<な、なんだってー!?

リファレンスが英語だったので、微妙に流し読みしてたのがまずかった。
APPBARDATA構造体にはuEdgeというメンバがあって、そいつの説明が。
Value that specifies an edge of the screen. This member can be one of the following values:
ABE_BOTTOM Bottom edge.
ABE_LEFT Left edge.
ABE_RIGHT Right edge.
ABE_TOP Top edge.

ということだったのです!!!ってコピペしたけど読めてねぇよ。

えーと、要するに画面の端を保持するもんで、下の4つのどれかの値を持ってます。ってことらしい。
だから、これを使えば位置情報の取得なんてお茶の子さいさいへのカッパ(古い)です。

無理やり、変なルゴリズムで実装しようとせずに、機能が提供されていないかしっかり調べるべきなようです。
まぁ、マイナーな機能の場合、提供されてるAPIがバグってたりして怖いんだけど。

投稿者 tyoro : 02:00 | コメント (0)

2005年04月21日

メッセンジャー - プログラム

プログラムのことを前から書こうと思ってたけど、Blogでやるより、そういうページ作るべき だなんて考えが先行してた、でも実際ネタがない。

調べればどこかですぐ見つかるような事を書いても意味がないし、調べても見つからないようなモノはあまり作ってない。
でも、なんか作り出したので書いていこう。
(C++のWindowプログラムで作りたいソフト開発出来る人対象。そんな人は現状で読んでいない。)

メッセンジャーというソフトがある。
MSNやらYAHOOやらあるけど、あの通知のシステムは結構便利だと思う。
タスクバーに常駐して、通信があればメッセージを表示する。

いずれ、今つくってるネットワークが関わるゲームに、ユーザーのオン・オフだけでも見れる機能をつけたいと思っていたけれど、それの片鱗に触る機械があったので、忘れないうちに書いていこう。

タスクバーに常駐するなんてのは、どこにでも解説されてることなので割愛するとして、メッセージはどうだろう。
タスクバーの各位置から、にゅにゅにゅっと出てくるアレは何で作るべきなのか。

結論から言うと、自分はアレをウィンドウとして作った。
ただウィンドウを作るだけだと、周りの線があったりして邪魔。
ウィンドウを作る時に指定するパラメータをちょちょっといじれは、真っ白で四角いウィンドウが作れる。

そのパラメータが『WS_POPUP』だ。
MSDNの記載では「ポップアップ ウィンドウを作成します。WS_CHILD スタイルと一緒に使うことはできません。」とある。
このポップアップウィンドウってのは、ユーザーに情報をッパっと表示するためのウィンドウで、枠もタイトルバーも×ボタンも無い。
このパラメータを、CreateWindowやCreateWindowEXのスタイルとして指定してやれば、まっしろで四角いウィンドウを表示できる。

どんなウィンドウを表示すればいいのかわかった。ニュニュって出るのもサイズを変更すればいいわけだから、SetWindowPosか何かを使えばいい。
じゃぁ、コレで完成かといえば、重要な作業が残っている。
表示する場所の指定だ。

一般的な人のPCならタスクバーは下にあるけど、みんながみんな下に設定しているわけじゃない。
特にマカー出身だと上にタスクバーを置く人だって居るし、横にだって出せる。
それに、タスクバーはXPとクラシックでは厚みが違うし、2段や3段にしてる人もいる。
何がわかれば、ちゃんとした位置に表示ができるのか?
答えはタスクバーの位置とサイズだ。

それを得るためにはSHAppBarMessage関数を使う。
これにABM_GETTASKBARPOSというタスクバーのポジションを得るためのオフセットと、入手したポジションを記憶するためのAPPBARDATA構造体のポインタをわたす。
すると、APPBARDATA構造体の中にあるRECT構造体に位置がセットされる。
タスクバーの各座標がそのまま構造体の要素になる。

そして重要なのが、タスクバーのサイズは2ドットはみ出ているということ。
見えない部分に2ドットはみ出ているので、例えば
top=924,bottom=1024,left=-2,right=1026 ってな感じ。
この特性を使えば、topが0であればタスクバーが上にあるという単純計算で位置が算出できる。
その関係は以下の通り。

・leftが0よりも少なければ、左右がはみでているので上下のどちらか。
  ・topが0ならば上、そうでなければ下。
・leftが0未満でなければ、左右。
  ・leftが0なら左、そうでなければ右。

方法はこれ以外にもあるので、決定的な関連情報じゃないけど、まぁ十分判定できるのでこれを使う。

上に書いてきたことを使えば、ニュニュっと出てくるWindowが作れる。
気をつけないといけないのは、生成したWindowがメッセージの表示を終えて見えなくなったとき、プログラムからウィンドウを削除してやらねばならない。
タイトルバーについている×ボタンが無いのでユーザーが閉じる作業ができない。
もし、×ボタンをつけたけば、CreateWindowのスタイルを0にすれば、タイトルバーが出るので使うことも出来る(はず。)

あとは、タスクバーのアプリケーションの表示にウィンドウがでないようにすることくらいか。
その辺は、ツールバー化するスタイル使うとか、非表示のウィンドウの子にするとか方法はあるようだけど、まだ試して無いので後日。


しかし、やっぱりBlogだと自由度に限界があるな。
結局、HTMLに書き直すことになりそう。
専用ページを作ったらソースをアップするつもり。

投稿者 tyoro : 03:33 | コメント (0)