スポンサーサイト
2015.06.20 Saturday

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - | - | pookmark |
移転のお知らせ
2012.07.08 Sunday
今回、このブログをBloggerのほうへ移転することにしました。
新しいURLはこちらです↓
これまでの記事は良質なものをBloggerのほうへ移転していく予定です。
引き続きこのブログをよろしくお願いします。
| moge32 | - | comments(0) | - | pookmark |
どうでもいいAPI
2012.06.24 Sunday
星の数ほどある大量の関数群、
Win32API


メモリの確保からネットワークいじりまでいろいろなことができるWin32APIですが、
なかには超しょーもないものが混じっているのです。

今回は本質的なコードだけを提示するために、サンプルの言語にHSPを使用しています。

超しょーもないWin32APIの旅へ Let's go!





1. DrawFocusRect関数(user32.dll)
 MSDN
「フォーカス四角形を描画する」。「なんや?」と思われるかもしれませんが、これは

ボタンをクリックしたときに現れる点線を描画する関数です。
コントロールで使われる点線を描画するだけです。マジで。

これを実行してみるとよくわかります。
#include "user32.as"
    dim s, 4
    r.0 = 0
    r.1 = 0
    r.2 = 300
    r.3 = 300
    DrawFocusRect hdc, varptr(r)
    redraw


2. PathCompactPathEx関数(shlwapi.dll) MSDN(英語)
文字数を指定してパスを省略する関数です。

つまりどういうことか というと、
C:¥Windows¥system32¥kernel32.dll
というパスを20文字に省略すると
C:¥...¥kernel32.dll
みたいな感じで適当なところで「...」で省略される、というわけです。

ファイルパスを省略するだけです。
こんなの要るのかね。


たまにツールチップなんかで省略されているパスを見かけますが、きっとこの関数を使っているんでしょうね。

実際にこうなるかどうかは自分の目で確かめてみてください。
#uselib "shlwapi.dll"
#cfunc PathCompactPathEx "PathCompactPathExA" sptr, str, int, int
    sdim a, 512
    sdim b, 512
    a = "C:¥¥Windows¥¥system32¥¥kernel32.dll"
    b = ""
    ret = PathCompactPathEx(varptr(b), a, 20, 0)
    mes : mes a
   
mes : mes "¥tを20文字に省略すると..."
   
mes : mes b

ちなみに指定文字数を小さくしすぎると変な結果になります。





今のところ確認できているしょうもないAPIはこれだけですが、見つけしだい気が向いたら追加していく予定です
ほかにも「こんなAPI知ってるぜ」という方がいらっしゃいましたら、お気軽にコメント欄にどうぞ。もしかしたらこの記事に追加するかもしれません。


新しいWindowsが出るたびに増えていくWin32API
広大さにはいろいろなものが存在していることを感じさせてくれる一つの世界なのでした。
| moge32 | プログラミング | comments(0) | - | pookmark |
機械生成したポエムがハンパじゃない
2012.03.20 Tuesday
前から人工知能や自然言語処理が気になっていたので、いろいろと調べてみて
「電脳の詩人」
を作ってみました。

構造はこんな感じになっています。


1. 文の並びを決める
まずは文の並び方を決めます。
これはあらかじめ登録しておいた並び方からランダムに選ぶようにしています。

AA BCD EFEF AA BCD.

指定のしかたはこんな感じです。
アルファベットは文の生成規則をあらわしています。
「A」が指定されれば タイプA の文を、「B」が指定されれば タイプB の文を、という風に選びます。
またスペースは空行、ピリオドは終端を表しています。

2. 文を生成する
文の並びが決まったら、指定された文の生成規則にしたがって一文を作り出します。
今回は一行一文のスタイルをとりました。

文を生成するときは、動詞や形容詞や名詞など事前に用意しておいたデータベースの単語を組み合わせていきます。
たとえば 生成規則A
感動詞 , [スペース] 形容詞 もの [スペース] 時間詞 [から] 副詞
というものだったら、ここにデータベースから単語をランダムに当てはめていきます。
感動詞→ああ
形容詞→赤い
もの→りんご
時間詞→昨日
副詞→ずっと

これを 生成規則A に当てはめると
ああ, 赤いりんご 昨日からずっと
という文が完成します。

こんな風にしてどんどん文を生成していき、組み合わせていけば電脳ポエムの完成です!


一見すると簡単そうですが、「動詞の活用」という大きな難関があるのです。
よくわからん方のために説明しておきます。たとえば「見る」という動詞は、
見ません
見ます
見るとき
見れば
見ろ
という風に形が変わっていきます。これを「活用」といいます。
一つ一つの活用のデータベースを作ってしまっても良いのですが、これだとデータが肥大化してしまう上に、登録が ('A`) マンドクセ ので工夫が必要です。
今回はデータベースに登録するとき、

照らs5(子音がsで五段活用)
r!(子音がrで下一段活用)
ji(子音がjで上一段活用)

というように活用の種類を指定して登録させて解決しました。(もっといい方法がある気もします。。。)



で、この電脳詩人にその辺にあったCDアルバムの歌詞から引用した単語や書籍「宙の名前」から引用した447個の単語からポエムを生成させます。
歌詞から引っ張ってきた、というのもあるのかポエムというよりも歌詞になっちゃってます。



さてと、Let's ポエム!
C:¥Poet>poet
oh 初めて抱きしめてた地球
胸の中からずっとあふれる欲望
君は姿に冷えた
「どこかで夕凪だね」と浮かびながら

yes いつも微笑んでたオーロラ
夢のなかからゆっくり夢見る女神
君は暗闇に感じた
「いつか月影だね」と囁きながら

熱気の地球は立ちすくんでた
ゆっくり
君は天使に傾いた


ああ いつもつながってた天使
防波堤から突然暖めるお互い
君は流れ星に探った
「かならず二人だね」と踊りながら

ああ いきなり見てた刹那
夢から初めて眠る月明かり
君は夕映えに喜んだ
「遠く世界だね」と送りながら

刹那のお互いは月に明かしてた
今にも
黄昏時の静寂は薄明の頃を願って

ああ もう駆け巡ってた新月
心の奥からまだ探す愛
「退屈な新月だね」と切り裂きながら

C:¥Poet>

おおおおお!!

ちょっと変なところもありますが、なんかすごいのキターーー!
プログラムで生成するんだし機械っぽいのかな、と思ったら結構すごいじゃないですか。

ちゃんと見える理由は詩ではあいまいで抽象的な表現が許されるからだと思われます。


ココからは完全なる妄想なのですが、このプログラムに思考とか感情、記憶なんかを搭載し、入力として周りの環境をインプットすれば「性格をもった詩を書く人工知能」ができるのではないでしょうか?

うむ、なんかすごい人工知能作れる気がしてきたぞ。(`・ω・´)



評価:
林 完次
¥ 2,625
コメント:モノゴコロ付く前から家にあり、いつも読んでいました。紹介されている写真が引き込まれそうなほど美しいです。

| moge32 | プログラミング | comments(0) | - | pookmark |
Windows 8 開発者プレビュー版をインスコしてみた
2012.01.14 Saturday
最近巷で噂の Windows 8 のデベロッパープレビュー版をインストールしてみました。
配布元はここです。ちなみに英語版のみとなっています。
英語版ですがちゃんと日本語のページも見れますし、MS-IME(日本語変換)も使えます
http://msdn.microsoft.com/en-us/windows/apps/br229516

「開発者向けのプレビュー版」なので安定性は保証されていません。
今回はVirtualBoxにx86版をインストールしてみました。



起動直後は「Start Screen」というタイル型UIでお出迎えです。
アカウントは設定せず、Windows Live アカウントでログインします。

この画面の下のほうにある「Desktop」をクリックするとデスクトップに移動できます。
タッチパッドでポン、とやりやすそうですがほとんどキー操作する私にとってはちょっと操作性に欠けるような感じがします。
また、今までのWindowsと違い全体的に緑が多いような印象を受けました。

デスクトップはこんな風になっています。

壁紙がWin7のログイン画面のものに置き換わり、スタートボタンがフラット感あふれる(?)ものになっていました
スタートボタンをクリックするとタイル型UI「Start Screen」に戻ります。

また、エクスプローラがリボンになりました。(画面は Aero Lite)

Vista以降から消えてしまった「一つ上のフォルダに移動」が戻ってきました。
ただ個人的にはリボンになったことで見づらくなってしまった、という感じもします。


今回のWindows 8 は噂通りタブレットPCへの工夫がところどころ見られます。
ですが、マウスをほとんど使わない私にとってはそれが逆に使いにくく感じました。


2012年中に製品版が出るようなので最終的にはどうなるのかが楽しみですね!
| moge32 | OS | comments(0) | - | pookmark |
zlib使ってみた2
2011.12.08 Thursday

前回の続きの「zlib使ってみた」です。

3.いろいろ書いてみる
ではテストとしてプログラムを書いてみます。
丁度zlib.netのほうにサンプルプログラムがあったのでそれをコピペして書いてみることにします。
http://zlib.net/zpipe.c



コンパーーーーーィル!
C:¥>make
gcc -Iinclude -Llib main.c -lz

実ーーーーーーー行!
C:¥>a.exe

ごーん!



・・・・・・、
どうやら zlib1.dll というzlib用のDLLが必要なようです。
探しているとzlib.netからコンパイル済みDLLが貰えるようなので、ダウンロードしてみます。
http://www.zlib.net/


「The current release is publicly available here:」
「zlib compiled DLL」からDLLをもらってきました。


これで「a.exe」と入力すると…。
おおおおおお、実行できました!
なかなかすごいですねぇ。



4.実際に使う
zlibはGZip形式のファイルを扱うためのライブラリです。
ですからファイルを圧縮したり解凍したりできるわけです。

ココからは実際にzlibを使ってみましょう!

まずは関数の説明です。
普通にstdio.hで宣言されているファイル関連の関数は、
  ・ファイルポインタは「FILE*」型
  ・ファイルオープンはfopen関数
  ・ファイルクローズはfclose関数
    :
    :
など、簡単に扱うことができますよね。

で、zlibはなんとGZip形式のファイルをそのまんまfopen()する感覚で扱うことができる最強ライブラリです。

まずファイルポインタは「gzFile」型になります。
ですから「FILE *fp;」と書いていたところはzlibを使うと「gzFile fp;」になります。

また、fopen関数は「gzopen関数」になります。
fwrite関数は「gzwrite関数」、fclose関数は「gzclose関数」など普通の標準ライブラリとほとんど変わりません。

#include <zlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
    char *s = "The quick brown fox jumps over the lazy dog.";
    gzFile fp;
    if ((fp = gzopen("out.gz", "wb9")) == NULL) {
        puts("あぬーん");
    }
    gzwrite(fp, s, strlen(s));
    printf("%dバイト出力しました。¥n", strlen(s));
    gzclose(fp);
    return 0;
}

ちなみに「あぬーん」はmoge32がよく使うエラー時の表現です。
普通に標準ライブラリに使えて簡単ですねぇ。


ではmakeでGo!

C:¥>a.exe
44バイト出力しました。

作成されたout.gzのサイズを見てみると・・・。
-------------------------------------
種類: GZ ファイル
サイズ: 63 バイト
更新日時: 2011/12/08 20:16
-------------------------------------

むむう。
13バイト→63バイトと増えてしまいました。
あんまりサイズが小さすぎると圧縮ファイルのデータの分などもあるので増えてしまうことがあるんですね〜。

じゃあもうちょっとでかいものでやってみますか。

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.



「Lorem ipsum」という例文です。
Wikipediaからもってきました。

コレに書き換えて実行!

・・・やりました!446バイトから282バイトになりました!圧縮成功です!


満足したところで今回はおしまいです。
では〜。

| moge32 | ライブラリ使ってみた | comments(0) | - | pookmark |
zlib使ってみた
2011.12.03 Saturday

今回もライブラリ使ってみたシリーズです。

今回はこれまた有名なライブラリ、「zlib」を使ってみます。

zlibでは主に「gzip」形式のファイルを圧縮・解凍したりすることができます。


1.ライブラリファイルの入手
今回もMinGWを使用します。
まずはSourceForge.netのGnuWinから zlib の Windows版ライブラリファイル をもらってきます。

http://sourceforge.net/projects/gnuwin32/files/zlib/

2011年12月3日現在では最新バージョンが1.2.3だったので、今回はバージョン1.2.3を頂きます。
1.2.3」→「zlib-1.2.3-lib.zip」と行き、ダウンロードしたファイルを解凍します。


2.コンパイルを通してみる
解凍したフォルダに「include」「lib」「manifest」という3つのフォルダがあると思うので、このうち
include」と「lib」をソースファイルのあるフォルダにコピーしておきます。


ではMakefileを書いていきます。お粗末です。

default:
 gcc -Iinclude -Llib main.c -lz

ふむ、なかなか短いですな。

これで make。おお、コンパイル通ったぞ!

今回はこんなところで終わりにしておきましょう。
次回では実際に使って遊んでみましょう!

次へ

| moge32 | ライブラリ使ってみた | comments(0) | - | pookmark |
DxLib使ってみた。
2011.12.02 Friday

唐突ですが今回から「○○ライブラリ使ってみた」シリーズをはじめようと思います。

今回はかなり有名な「DXライブラリ」MinGWでつかってみようと思います。

Visual C++を使っている方は他のサイトを参考にしてくださいね。






1.ライブラリファイルの入手

まずはDXライブラリ本体を入手します。
http://homepage2.nifty.com/natupaji/DxLib/

ここの「DXライブラリのダウンロード」から「DXライブラリ GnuC++版」というのをダウンロードし、解凍します。


ダウンロードしたファイルを実行して解凍すると、デスクトップにこのような内容のフォルダができていると思います。









2.ちょっとやってみる

で、この作成されたファイルの中にある
            「プロジェクトに追加すべきファイル_GCC(MinGW)用」
というフォルダの中身を、DxLibを使いたいC言語ファイルのあるフォルダに「dxlib」フォルダを作成し、その中に入れておくことにします。



次にMakefileとソースを書いてみます。(とってもお粗末だけど気にしたら負け。)

[Makefile]

default:
    g++ -Idxlib -Ldxlib main.c ¥
        -lDxLib ¥
        -lDxUseCLib ¥
        -ljpeg ¥
        -lpng ¥
        -lzlib ¥
        -ltheora_static ¥
        -lvorbis_static ¥
        -lvorbisfile_static ¥
        -logg_static ¥
        -lbulletdynamics ¥
        -lbulletcollision ¥
        -lbulletmath ¥
        -mwindows

[main.c]
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  ChangeWindowMode(TRUE);
  if (DxLib_Init() == -1) return 1;
  WaitKey();
  DxLib_End();
  return 0;
}


これで make してみます。

In file included from dxlib/DxLib.h:52:0,
                 from main.c:1:
dxlib/DxDirectX.h:5437:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:5580:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:5658:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:5787:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:5870:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:6378:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:6553:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]
dxlib/DxDirectX.h:6898:2: 警告: 'novtable' 属性指示が無視されました [-Wattributes]

なんだか警告が出てしまいましたねぇ。
ファイル名を見ると、DxLib のヘッダファイルのせいで警告が出ているようです。

というわけでdxlib/DxDirectX.hの5437行目を見てみます

 class
#ifndef DX_GCC_COMPILE
    __declspec( novtable )
#endif
     D_CUnknown : public D_INonDelegatingUnknown, public D_CBaseObject

DX_GCC_COMPILE」が定義されていないため、GCCでのコンパイルでは不要な「__declspec( novtable )」というものが入ってしまい、警告が出てしまっているわけです。
宣言されていないなら、「DX_GCC_COMPILE」を宣言すればいいじゃない。(マリーアントワネット調)


[main.c]
#define DX_GCC_COMPILE        // 追加
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  ChangeWindowMode(TRUE);
  if (DxLib_Init() == -1) return 1;
  WaitKey();
  DxLib_End();
  return 0;
}

修正したら make してみます。

できたーっ!!!

(クリックで拡大)




というわけで今回は無事に終わりました。
次回は何にしようかなぁ。


要望・感想などがございましたらコメント欄までどうぞ。
| moge32 | ライブラリ使ってみた | comments(0) | - | pookmark |
C言語main関数の隠された第三引数に迫る!!
2011.11.22 Tuesday

題名の通りです。
ではまず、普通のmain関数を思い浮かべてください。

main()
{
}

int main(void)
{
}

void main(void)
{
}

int main(int argc, char **argv)
{
}

int main(int argc, char *argv[])
{
}


皆さんが知っているのはこんなもんだと思うんです。

しかしッ!!!

なんと、あともうひとつあるんです!
それが「第三の引数」というやつです。

こんな感じのものです。


int main(int argc, char *argv[], char *envp[])
{
}





えええええええ!?
これだけか!
envpのサイズを教えてくれる「argc」みたいなやつはないのか?!

………、これだけですし「argc」みたいにenvpのサイズを教えてくれる心優しい引数はありません。


で、何をするやつかといいますと「Enviroment ナントカ、つまり環境変数が中にはいっているんですね。

で、仕様的にはNULLへのポインタがあった場合にそこで終了、という感じらしいです。


#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
  int i;
  for (i = 0; envp[i] != NULL; i++) {
    printf("%d: [%s]¥n", i, envp[i]);
  }
  return 0;
}


こんな感じのプログラムを書いてみて、そいつを実行してみます。


0: [ALLUSERSPROFILE=C:¥ProgramData]
1: [APPDATA=C:¥Users¥moge¥AppData¥Roaming]
2: [CommonProgramFiles=C:¥Program Files¥Common Files]
3: [COMPUTERNAME=moge-PC]
4: [ComSpec=C:¥Windows¥system32¥cmd.exe]
5: [FP_NO_HOST_CHECK=NO]
6: [HOMEDRIVE=C:]
7: [HOMEPATH=¥Users¥moge]
8: [LOCALAPPDATA=C:¥Users¥moge¥AppData¥Local]
9: [LOGONSERVER=moge-PC]
10: [NUMBER_OF_PROCESSORS=2]
11: [OS=Windows_NT]
12: [Path=C:¥Program Files¥Common Files¥Microsoft Shared¥Windows Live;C:¥Windows
¥system32;C:¥Windows;C:¥Windows¥System32¥Wbem;C:¥Windows¥System32¥WindowsPowerSh
ell¥v1.0¥;c:¥Program Files¥Microsoft SQL Server¥90¥Tools¥binn¥;C:¥MinGW¥bin¥;C:¥
Program Files¥GnuWin32¥bin;C:¥Program Files¥Windows Live¥Shared;C:¥Program Files
¥TortoiseSVN¥bin;C:¥Program Files¥Java¥jdk1.7.0¥bin;C:¥Program Files¥Java¥jdk1.7
.0¥bin;]
13: [PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC]
14: [PROCESSOR_ARCHITECTURE=x86]
15: [PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 6, GenuineIntel]
16: [PROCESSOR_LEVEL=6]
17: [PROCESSOR_REVISION=1706]
18: [ProgramData=C:¥ProgramData]
19: [ProgramFiles=C:¥Program Files]
20: [PROMPT=$P$G]
21: [PSModulePath=C:¥Windows¥system32¥WindowsPowerShell¥v1.0¥Modules¥]
22: [PUBLIC=C:¥Users¥Public]
23: [SESSIONNAME=Console]
24: [SystemDrive=C:]
25: [SystemRoot=C:¥Windows]
26: [TEMP=C:¥Users¥moge¥AppData¥Local¥Temp]
27: [TMP=C:¥Users¥moge¥AppData¥Local¥Temp]
28: [USERDOMAIN=moge-PC]
29: [USERNAME=moge]
30: [USERPROFILE=C:¥Users¥moge]
31: [VBOX_INSTALL_PATH=C:¥Program Files¥Oracle¥VirtualBox¥]
32: [VS90COMNTOOLS=c:¥Program Files¥Microsoft Visual Studio 9.0¥Common7¥Tools¥]
33: [windir=C:¥Windows]

こんな感じになりました。
ちゃんと環境変数がでてますね。




ちなみにVC++でもGCCでもでちらでもできました。
Linuxでもできるそうです。


知っておいて損はないですが、あんまり意味ないですね
| moge32 | PCその他 | comments(0) | - | pookmark |
MOGEX0.04をリリースしました
2011.11.02 Wednesday

MOGEXVersion 0.04をリリースしました。

Ver.0.03と比べるとずいぶん変わりましたねぇ。

ちなみにコマンドがちょっと追加されてます。

create (ファイル名)    -    ファイル作成
exist (ファイル名)       -    ファイル存在確認
mgxv                       -    バージョン情報(ウインドウ)

http://mogex.ifdef.jp/index.html
http://mogex.ifdef.jp/download.html

こちらからどうぞ。

| moge32 | OS | comments(0) | - | pookmark |
MOGEXにデスクトップアイコン実装
2011.10.06 Thursday

MOGEXにデスクトップアイコンを実装してみました。



画面右上にデスクトップアイコンを設置しました。
スタートボタンのときと同じで、動かないようにしたシートを透明化してそれを貼り付けています。
スタートボタンの処理を流用して簡単にできました。




あとz+editの「一旦入力した行の途中で改行するとキャレットが崩壊する」というバグも修正しました。ただ、画面がすごくちらつくのでどうにかしたいとおもっています。

ヘルプの実装もちょっとしました。まだ完全ではありません。

スクショをみてもわからないと思いますが、「fsfatimg」という自作ツールを使ったディスクイメージの作成に切り替えております。



課題は簡単にメニューを編集したり、とかですね。
テキストファイルとかに保存して読み込ませたいです。。。



まあ、なんか頑張ります。。。
では〜。
| moge32 | OS | comments(0) | - | pookmark |
←back 1/4 pages next→
Search
Profile
Category
Archive
Latest Entry
Recent Comment
  • 昔のパソコン MSX ・・・
    moge32 (07/27)
  • 昔のパソコン MSX ・・・
    go15 (07/25)
  • INT 0x18 - ROMBASIC起動!?
    moge32 (05/27)
  • INT 0x18 - ROMBASIC起動!?
    mikerosss (05/23)
  • Vistaアクセサリを7で動かすとどうなるだろうか。
    moge32 (04/16)
  • Vistaアクセサリを7で動かすとどうなるだろうか。
    x (04/16)
  • Vistaアクセサリを7で動かすとどうなるだろうか。
    moge32 (03/29)
  • Vistaアクセサリを7で動かすとどうなるだろうか。
    25 (03/28)
  • 日本人は恥ずかしくて使えない壁紙
    moge32 (03/27)
  • 日本人は恥ずかしくて使えない壁紙
    25 (03/26)
Links
Admin
Calendar
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< March 2024 >>
イケ麺時計
グリムス
MOGESYSTEMのPixiv
釣りみくじ

コリント占い
Sponsored links
Mobile
qrcode
無料ブログ作成サービス JUGEM