ページ

2014年6月22日日曜日

GAEと戯れる 2 - サーブレット -

前回のHelloWorld表示だけのものを本に従って少しずつ改良。
「ゲストブック」ページの作成にチャレンジ。

まずは新規のHttpServletクラスを継承したクラスを作成。
本に従ってテンプレートは使わずにHTML直書き。


















GETリクエスト時の処理を記述。
war/WEB-INF/web.xmlを修正。
















/guestbookというパスでのGETリクエストに対してのサーブレットクラスを定義。
実際に起動して「http://localhost:8888/guestbook」をブラウザで表示。



















ん〜いい感じ♪。

次は送信した際の処理を追加。POSTリクエストに対応する実装。







入力された内容を取得しコンソール出力。
すぐさま、/guestbookへリダイレクトを行う。















コンソール出力結果。

2014年6月21日土曜日

Cent OSでOpenGL 5 - 描画処理 -

今回でやっとOpenGLのメイン部分を解読。
全体像は以下。

void DrawAQuad() {
 glClearColor(1.0, 1.0, 1.0, 1.0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-1., 1., -1., 1., 1., 20.);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.);

 glBegin(GL_QUADS);
  glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.);
  glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.);
  glColor3f(0., 0., 1.); glVertex3f( .75.75, 0.);
  glColor3f(1., 1., 0.); glVertex3f(-.75.75, 0.);
 glEnd();
}

上から順に・・・
void glClearColor(
 GLclampf red , GLclampf green ,
 GLclampf blue , GLclampf alpha
);
バッファを初期化する色情報を設定する。
float型で0.0〜1.0で指定する。
void glClear(GLbitfield mask);
実際のバッファを初期化。
以下定数の組み合わせで初期化対称を設定。
定数解説
GL_COLOR_BUFFER_BITカラー バッファ
GL_DEPTH_BUFFER_BITデプス バッファ
GL_ACCUM_BUFFER_BITアキュムレーション バッファ
GL_STENCIL_BUFFER_BITステンシル バッファ
※ステンシルバッファ
 ・・・ステンシルは型板という意味。塗料を塗る時に型板で塗らない箇所を作る
    ように、OpenGLでも点を描画するかしないかのマスクを設定する
※アキュムレーションバッファ
void glMatrixMode(GLenum mode);
OpenGLには3つの変換行列があり、操作対称の行列を指定
定数解説
GL_MODEVIEWモデルビュー変換行列
GL_PROJECTION投影変換行列
GL_TEXTUREテクスチャ行列
void glLoadIdentity(void);
行列の初期化。
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom
             GLdouble top, GLdouble near, GLdouble far);
現在の行列と正射影行列の乗算を行う。
void gluLookAt(///);
以下サイト参照。
void glBegin(GLenum mode);
頂点データの指定開始。モードは以下定数を指定。
定数解説
GL_POINTS各頂点を単独の点として扱う 頂点 n は、点 n を意味し n この点が描画される
GL_LINES2つの頂点をペアとし、それぞれのペアを独立した線分として扱う
GL_LINE_STRIP最初の頂点から最後の頂点まで、線分を連結して描画する
GL_LINE_LOOPすべての頂点を線分で連結する
GL_TRIANGLES3つの頂点をペアとし、それぞれ独立した三角形として扱う
GL_TRIANGLE_STRIP連結した三角形のグループを描画する
GL_TRIANGLE_FAN最初の頂点を軸に、連結した三角形のグループを描画する
GL_QUADS4つの頂点をペアとし、それぞれ独立した四角形として扱う
GL_QUAD_STRIP連結した四角形のグループを描画する
GL_POLYGON単独の凸ポリゴンを描画する
参考URL

GAEと戯れる 1 - 環境設定 & デプロイ -

以前から興味があったGAEに挑戦!!

以下の書籍を参考に進めていこうと思います。


開発環境の構築

何はともあれ、開発環境の構築。
本を見ながらEclipseのプラグインをインストール。

※使用するEclipse



新規ソフトウェアのインストール -> 作業対称に以下URLを設定
https://dl.google.com/eclipse/plugin/4.2







インストール完了->再起動。

とりあえずお約束のhello worldでもと思っていたら、色々エラーが?
どうやら、Javaのバージョンが6ではなく、7を使用するようにとの事でした。
JDK 7をインストール。



改めて、新規プロジェクト作成。


無事作成できました(^o^)/


フォルダ階層の説明
[src]
  Javaのソースコードやリソース類(propertiesファイル、XMLファイル)

[war]
  Webアプリケーション用のリソース類(HTML, JavaScript, 画像ファイルなど)
  実行時に必要なライブラリ、App Engine用の設定ファイル

[war/WEB-INF/lib]
  GAE用のライブラリ

起動と停止

さっそく起動してHello Worldを表示させてみる。

・起動
















プロジェクト右クリック->実行->Webアプリケーションで
localhost:8888で起動されます。

ブラウザで確認



無事ブラウザ上で動作できている事を確認。

・停止
停止方法はConsoleビューのツールバー上の赤い四角いアイコンをクリック。

デプロイ

実際にGAE上にデプロイしてみる。。がまずは準備(--;)
アプリケーション領域の作成。

今度はEclipseでデプロイする為の編集を行います。
war/WEB-INF/appengine-web.xmlを修正。<application>要素に
作成したアプリケーションIDを設定。

プロジェクト名を右クリック->Google->Appエンジンへデプロイ

とりあえずデプロイまで完成(^^)/

2014年6月12日木曜日

Cent OSでOpenGL 4 - XLib調査2 -

前回の続き・・

 cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);
これは一体何をしているのか?

概要:カラーマップと色構造体の生成
引数:Display *         ・・・    Xサーバの接続を指定
            Window           ・・・    カラーマップを作るスクリーンに属するウィンドウ
            Visual *           ・・・    スクリーンがサポートするVisual 
            int                    ・・・     割当られるカラーマップのエントリー

XSetWindowAttributes    swa;

 swa.colormap = cmap;
 swa.event_mask = ExposureMask | KeyPressMask;

 win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa);
XCreateWindow

概要:ウィンドウの生成

 XMapWindow(dpy, win);
 XStoreName(dpy, win, "VERY SIMPLE APPLICATION”);

XMapWindow
   Xサーバーとウィンドウとのマッピング

XStoreName
  Window名の設定

ここからOpenGLの初期化
 glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
 glXMakeCurrent(dpy, win, glc);


 glEnable(GL_DEPTH_TEST); 

glXCreateContext

概要:GLXレンダリングコンテキストの作成
引数:Display* Xサーバー
            XVisualInfo* コンテキストが利用可能なフレームバッファリソースの定義
            GLXContext 共有するコンテキスト
            Bool レンダリングをグラフィックシステムと直接接続で行う(GL_TRUE)か
                      サーバー経由で行うか(GL_FALSE)

glXMakeCurrent

概要:GLXコンテキストをウィンドウ又はGLXピックスマップ(Bitmap)に割り当てる
引数:Display* Xサーバー
            GLXDrawable XウィンドウIDかGLXピックスマップID
            GLXContext コンテキスト

glEnable
概要:有効な描画方法を設定
参考:http://www.westernvillage.co.jp/openglprogram.htm

 while(1) {
        XNextEvent(dpy, &xev);

        if(xev.type == Expose) {
                XGetWindowAttributes(dpy, win, &gwa);
                glViewport(0, 0, gwa.width, gwa.height);
                DrawAQuad();
                glXSwapBuffers(dpy, win);
        }

        else if(xev.type == KeyPress) {
                glXMakeCurrent(dpy, None, NULL);
                glXDestroyContext(dpy, glc);
                XDestroyWindow(dpy, win);
                XCloseDisplay(dpy);
                exit(0);
        }
    } /* this closes while(1) { */

} /* this is the } which closes int main(int argc, char *argv[]) { */

XNextEvent
概要:イベントを型によって選択
参考:http://xjman.dsl.gr.jp/man/man3/XNextEvent.3x.html

XGetWindowAttributes
概要:ウィンドウの現在の属性を取得
参考:http://xjman.dsl.gr.jp/man/man3/XGetWindowAttributes.3x.html

glViewport
概要:ビューポートの設定
参考:http://wisdom.sakura.ne.jp/system/opengl/gl13.html

glXSwapBuffers
概要:ブッファの入れ替え
参考:http://manpages.ubuntu.com/manpages/gutsy/ja/man3/glXSwapBuffers.3x.html

2014年6月2日月曜日

Cent OSでOpenGL 3 - XLib調査 -

前回のサンプルプログラムを紐解いてみる

まずはメイン関数で最初に呼び出される以下関数。
dpy = XOpenDisplay(NULL);

名前からしてXLibの関数だな。
詳細:Xサーバーへの接続。
引数:char *display_name
            ハードウェアのディスプレイ名を指定。
            NULLの場合は環境変数DISPLAYの値を使用。
戻り値:Display構造体(Xlib.hで定義)
typedef struct
#ifdef XLIB_ILLEGAL_ACCESS
_XDisplay
#endif
{
        XExtData *ext_data;     /* hook for extension to hang data */
        struct _XPrivate *private1;
        int fd;                 /* Network socket. */
        int private2;
        int proto_major_version;/* major version of server's X protocol */
        int proto_minor_version;/* minor version of servers X protocol */
        char *vendor;           /* vendor of the server hardware */
        XID private3;
        XID private4;
        XID private5;
        int private6;
        XID (*resource_alloc)(  /* allocator function */
                struct _XDisplay*
        );
        int byte_order;         /* screen byte order, LSBFirst, MSBFirst */
        int bitmap_unit;        /* padding and data requirements */
        int bitmap_pad;         /* padding requirements on bitmaps */
        int bitmap_bit_order;   /* LeastSignificant or MostSignificant */
        int nformats;           /* number of pixmap formats in list */
        ScreenFormat *pixmap_format;    /* pixmap format list */
        int private8;
        int release;            /* release of the server */
        struct _XPrivate *private9, *private10;
        int qlen;               /* Length of input event queue */
        unsigned long last_request_read; /* seq number of last event read */
        unsigned long request;  /* sequence number of last request. */
        XPointer private11;
        XPointer private12;
        XPointer private13;
        XPointer private14;
        unsigned max_request_size; /* maximum number 32 bit words in request*/
        struct _XrmHashBucketRec *db;
        int (*private15)(
                struct _XDisplay*
                );
        char *display_name;     /* "host:display" string used on this connect*/
        int default_screen;     /* default screen for operations */
        int nscreens;           /* number of screens on this server*/
        Screen *screens;        /* pointer to list of screens */
        unsigned long motion_buffer;    /* size of motion buffer */
        unsigned long private16;
        int min_keycode;        /* minimum defined keycode */
        int max_keycode;        /* maximum defined keycode */
        XPointer private17;
        XPointer private18;
        int private19;
        char *xdefaults;        /* contents of defaults from server */
        /* there is more to this structure, but it is private to Xlib */
}
#ifdef XLIB_ILLEGAL_ACCESS
Display,
#endif
*_XPrivDisplay;



次にXOpenDisplayで取得したDisplay構造体を使って何やら行っている模様。
 root = DefaultRootWindow(dpy);

Xlib.hに以下のマクロとして定義されていました。
#define DefaultRootWindow(dpy)  (ScreenOfDisplay(dpy,DefaultScreen(dpy))->root)
#define ScreenOfDisplay(dpy, scr)(&((_XPrivDisplay)dpy)->screens[scr])
#define DefaultScreen(dpy)      (((_XPrivDisplay)dpy)->default_screen)

Screen構造体定義
typedef struct {
        XExtData *ext_data;     /* hook for extension to hang data */
        struct _XDisplay *display;/* back pointer to display structure */
        Window root;            /* Root window id. */
        int width, height;      /* width and height of screen */
        int mwidth, mheight;    /* width and height of  in millimeters */
        int ndepths;            /* number of depths possible */
        Depth *depths;          /* list of allowable depths on the screen */
        int root_depth;         /* bits per pixel */
        Visual *root_visual;    /* root visual */
        GC default_gc;          /* GC for the root root visual */
        Colormap cmap;          /* default color map */
        unsigned long white_pixel;
        unsigned long black_pixel;      /* White and Black pixel values */
        int max_maps, min_maps; /* max and min color maps */
        int backing_store;      /* Never, WhenMapped, Always */
        Bool save_unders;
        long root_input_mask;   /* initial root input mask */
} Screen;


XサーバーのルートバックグラウンドのWindow(X.h内でXID(unsigned long)として定義されている)を返している。

次はGLっぽい。
 vi = glXChooseVisual(dpy, 0, att);
詳細:グラフィックに必要な能力を要求する。GLサーバーはこれによって必要な
             Visualを選定する。

以下が必要な要件。
GLint                   att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
結構指定できるものが多数あるので詳しくは以下サイトを参照
http://lmb.informatik.uni-freiburg.de/people/reisert/opengl/doc/glXChooseVisual.html

typedef struct {
  Visual *visual;
  VisualID visualid;
  int screen;
  int depth;
#if defined(__cplusplus) || defined(c_plusplus)
  int c_class;                                  /* C++ */
#else
  int class;
#endif
  unsigned long red_mask;
  unsigned long green_mask;
  unsigned long blue_mask;
  int colormap_size;
  int bits_per_rgb;
} XVisualInfo;


2014年6月1日日曜日

Cent OSでOpenGL 2 - GLX拡張 -

前回はとりあえずウィンドウを表示してみたが、今回は真面目にOpenGLについて勉強。


まずは公式サイトを見てみる。
OpenGLの公式サイトはこちら

公式サイトのGetting Started 〜を見てみる。
主要なOSにはOpenGLが既に入っているが、ドライバーは最新に〜という内容が書かれてあるっぽい。
以下それぞれのプラットフォーム毎の説明

・Linux
Linuxのグラフィックスはほぼ "X Window”だ。LinuxでOpenGLをサポートするという事は
X WindowのGLX拡張を使用する事になる。
Direct Rendering Infrastructure(DRI)は簡単にハードウェアアクセラレーションを使える
ドライバーのフレームワーク。
DRIはXFree86の4.0からのサポートされているが、現在はXFree86からXorg
主流となっている。
コンパイル時にはOpenGLのライブラリをリンクする為に「-lGL」を指定する必要がある。

・Windows
コンパイルする際は「OpenGL32.lib」をリンクする必要がある。

実際のプログラミング

1. 初期化
    各プラットフォールで異なった書き方で初期化する必要がある。
 初期化には2つのフェースがある。
    1)  OpenGL Context の作成
    2)  OpenGLを使用する為に必要な機能をロード

2. LinuxでのOpenGL Contextの作成


GLXContext glXCreateContext(Display *  dpy,
XVisualInfo *  vis,
GLXContext  shareList,
Bool  direct);

上記関数を使用しContextを作成。

以下簡単なウィンドウ表示サンプル
// -- Written in C -- //

#include<stdio.h>
#include<stdlib.h>
#include<X11/X.h>
#include<X11/Xlib.h>
#include<GL/gl.h>
#include<GL/glx.h>
#include<GL/glu.h>

Display                 *dpy;
Window                  root;
GLint                   att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo             *vi;
Colormap                cmap;
XSetWindowAttributes    swa;
Window                  win;
GLXContext              glc;
XWindowAttributes       gwa;
XEvent                  xev;

void DrawAQuad() {
 glClearColor(1.0, 1.0, 1.0, 1.0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-1., 1., -1., 1., 1., 20.);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.);

 glBegin(GL_QUADS);
  glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.);
  glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.);
  glColor3f(0., 0., 1.); glVertex3f( .75,  .75, 0.);
  glColor3f(1., 1., 0.); glVertex3f(-.75,  .75, 0.);
 glEnd();
} 
 
int main(int argc, char *argv[]) {

 dpy = XOpenDisplay(NULL);
 
 if(dpy == NULL) {
        printf("\n\tcannot connect to X server\n\n");
        exit(0);
 }
        
 root = DefaultRootWindow(dpy);

 vi = glXChooseVisual(dpy, 0, att);

 if(vi == NULL) {
        printf("\n\tno appropriate visual found\n\n");
        exit(0);
 } 
 else {
        printf("\n\tvisual %p selected\n", (void *)vi->visualid); /* %p creates hexadecimal output like in glxinfo */
 }


 cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);

 swa.colormap = cmap;
 swa.event_mask = ExposureMask | KeyPressMask;
 
 win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa);

 XMapWindow(dpy, win);
 XStoreName(dpy, win, "VERY SIMPLE APPLICATION");
 
 glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
 glXMakeCurrent(dpy, win, glc);
 
 glEnable(GL_DEPTH_TEST); 
 
 while(1) {
        XNextEvent(dpy, &xev);
        
        if(xev.type == Expose) {
                XGetWindowAttributes(dpy, win, &gwa);
                glViewport(0, 0, gwa.width, gwa.height);
                DrawAQuad(); 
                glXSwapBuffers(dpy, win);
        }
                
        else if(xev.type == KeyPress) {
                glXMakeCurrent(dpy, None, NULL);
                glXDestroyContext(dpy, glc);
                XDestroyWindow(dpy, win);
                XCloseDisplay(dpy);
                exit(0);
        }
    } /* this closes while(1) { */
} /* this is the } which closes int main(int argc, char *argv[]) { */

コンパイル
gcc -o test test.c -lX11 -lGL -lGLU
実行すると以下のグラフィックが表示される。

パン屋探索 2 - 福岡松崎にあるFull Full -

Full Full


パン屋さんのFull Fullに行ってきました。


購入したパンは、あんぱんとハムチーズとパンじゃないけどコロッケ。
ここのコロッケはマジうまいw。