2013年9月26日木曜日

privateなコンストラクタをリフレクションで呼び出す

どうも僕です。

技術系のネタです。サクッとprivateなコンストラクタをリフレクションで呼びだす方法をまとめておきます。

コンストラクタの呼び出し方です。

Class clazz = Class.forNmae(hoge.Piyo);

Constructor constructor = clazz.getDeclaredConstructor(null);

constructor.setAccessible(true);

Piyo bean = (Piyo)constructor.newInstance(null);


軽く説明を入れておくとclazzはPiyoクラスのClassオブジェクトを取得しています。constructorはPiyoクラスのコンストラクタを取得しています。setAccessible(true)でアクセスの許可を行います。あとは取得しているインスタンスをPiyoクラスにキャストしてインスタンスを生成するといった流れになっています。
privateなコンストラクタを呼び出せなくて困るってことがなくなってみんなハッピーですね。

僕から以上。

2013年8月12日月曜日

[java]形態素解析ライブラリ lucene-gosen 使ってみた

どうも僕です.

形態素解析なんて使うのかよって言うのは置いといてもらって,lucene-gosen使ってみたので紹介です.

まず,形態素解析ってなんぞやってとこはwikiによると

対象言語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い、自然言語で書かれた文を形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの品詞を判別する作業を指す

だそうです.要するに文章とかを決められたルールによって単語にバラしますよって話です(間違ってたらごめんなさい).

なんぞやってとこはこれぐらいにして,
導入法.

ここから以下の2つを落としてきてクラスパス通すだけでいいみたいです.辞書も用意してくれてるとか僕を甘やかしていいのかってぐらい簡単に使えます.
現在(2013/8/12)の最新版です.
lucene-gosen-4.4.0.jar(本体)
lucene-gosen-4.4.0-ipadic.jar(辞書)


 実際に使ってみた.コードはほぼここからのコピーです.

package jp.mwsoft.sample.lucene.gosen;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import net.java.sen.SenFactory;
import net.java.sen.StringTagger;
import net.java.sen.dictionary.Token;

public class StringTaggerSample {

public static void main(String[] args) throws IOException {

// この3行で解析できる
StringTagger tagger = SenFactory.getStringTagger(null);
List tokens = new ArrayList();
tagger.analyze("解析したい文字列", tokens);

// 解析結果
for (Token token : tokens) {
System.out.println("==============================");
System.out.println("surface : " + token.getSurface());
System.out.println("cost : " + token.getCost());
System.out.println("length : " + token.getLength());
System.out.println("start : " + token.getStart());
System.out.println("additionalInformation : " + token.getMorpheme().getAdditionalInformation());
System.out.println("basicForm : " + token.getMorpheme().getBasicForm());
System.out.println("conjugationalForm : " + token.getMorpheme().getConjugationalForm());
System.out.println("conjugationalType : " + token.getMorpheme().getConjugationalType());
System.out.println("partOfSpeech : " + token.getMorpheme().getPartOfSpeech());
System.out.println("pronunciations : " + token.getMorpheme().getPronunciations());
System.out.println("readings : " + token.getMorpheme().getReadings());
}

}
}

他にもいろいろ機能があるのでJavaDocを覗くといいかもしれないです. 辞書追加とかもあるらしいので時間がある時に触ってみます. 僕から以上.

2013年7月6日土曜日

[ゲーム][Java]キャラクターの動作部分ができたので晒すことにしました

どうも僕です.

ぶっちゃけ4月ぐらいに思い立ったけど忘れててました.

仕様としては
・自分のキャラクターがいる.
→矢印キーで自分のキャラクターを動かせる.
→スペースで弾が撃てる.

・敵キャラクターがいる.
→自動で動く
→なんパターンか動きを入れる.
→弾は撃ってこない.

・パワーアップアイテムがある.

・スコアとか付けたい.

今回は自分のキャラがいるとこまで作り終えたのでコード晒しておきます.

後々敵キャラクターを作ることを考えてキャラクター用のクラスを作って見ました.以下です.

package core.Character;

import java.awt.Graphics;
import java.awt.Image;

import core.MainGame;

//キャラクタークラス
public abstract class Character {
 public static MainGame display;    //画面取得
 protected Image img;     //画像
 protected int x;     //座標
 protected int y;
 protected int w, h;     //幅,高さ
 private boolean dead;     //死亡判定

 //コンストラクタ
 protected Character(Image img){
  this.img = img;     //キャラクターの画像設定
  w = img.getWidth(display);   //画像の幅取得
  h = img.getHeight(display);   //画像の高さ取得
  dead = false;     //死亡判定を生きてるにする
 }

 //死亡判定
 //戻り値 死亡判定
 public boolean isDead(){
  return dead;
 }

 //死にたくなった時
 public void dead(){
  dead = true;
 }

 //移動
 //抽象メソッドとしておく.
 public abstract void move();

 //当たり判定
 //引数 判定したいキャラクター
 //戻り値 当たり:true ハズレ:false
 public boolean checkHit(Character character){
  if(x > character.x - w && x < character.x + character.w
    && y > character.y - h && y < character.y + character.h){
   return true;
  }
  return false;
 }

 //キャラクターの座標取得
 public int getX(){
  return x;
 }
 public int getY(){
  return y;
 }

 //描画
 //引数 描画したいグラフィック
 public void draw(Graphics g){
  g.drawImage(img, x, y, display);
 }
} 

こいつを継承する形で自分のキャラクターを作ります.

package core.Character;

import core.Key;

//自機クラス
public class MyCharacter extends Character{
 private int bulletIntervalCount;    //弾の発射間隔
 private int power;      //弾の強さ
 private int invincible;      //無敵時間
 private static int[][] bulletVecter= {    //弾の向き
  {0,-8},       //前方へ
  {-7,-7, 7, -7},      //左右の斜め前へ
  {-7, -7, 0, -8, 7, -7},     //前方と左右の斜め前へ
  {-7, -7, 0, -8, 7, -7, -7, 7, 7, 7}   //前方と左右の斜め前後へ
 };

 public MyCharacter() {
  super(display.imgMyCharacter);    //imgのセット
  bulletIntervalCount = 0;    //弾の発射間隔を初期化
  power = 0;      //弾の強さの初期化
  invincible = 0;      //無敵時間の初期化
  x = (display.getW() - w) / 2;    //初期座標X
  y = display.getH() - h - 16;    //初期座標Y
 }

 @Override
 public void move() {
  // 左移動
  if (Key.left) {
   x -= 4;
   if (x < 0){
    x = 0;
   }
  }
  // 右移動
  if (Key.right) {
   x += 4;
   if (x > display.getW() - w){
    x = display.getW() - w;
   }
  }
  // 上移動
  if (Key.up) {
   y -= 4;
   if (y < 0){
    y = 0;
   }
  }
  // 下移動
  if (Key.down) {
   y += 4;
   if (y > display.getH() - h){
    y = display.getH() - h;
   }
  }

  //弾の発射処理
  if(bulletIntervalCount > 0){
   bulletIntervalCount--;
  }
  if(Key.space){
   if(bulletIntervalCount <= 0){
    for(int i = 0; i < bulletVecter[power].length; i += 2){
     display.addList(new Bullet(
       x + w / 2,
       y,
       bulletVecter[power][i],
       bulletVecter[power][i + 1])
     );
    }
    bulletIntervalCount = 7;
   }
  }
 }
}

さらっとBulletクラスが出てきたのでそれも晒します.

package core.Character;

//弾クラス
public class Bullet extends Character{
 private int vx, vy;  //速度

 //コンストラクタ
 public Bullet(int x, int y, int vx, int vy){
  super(display.imgBullet);
  this.x = x - w / 2;
  this.y = y - h / 2;
  this.vx = vx;
  this.vy = vy;
 }

 @Override
 public void move(){
  //弾の移動
  x += vx;
  y += vy;

  //画面外に出たとき
  if(x < -w || x > display.getW() || y < -h || y > display.getH()){
   dead();  //消滅
  }
 }

 @Override
 //当たり判定を行わない
 public boolean checkHit(Character character){
  return false;
 }

}

ゲームのメイン画面ができたのでそっちもどうせだから晒しとく.

package core;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.util.Vector;

import core.Character.Character;
import core.Character.MyCharacter;

@SuppressWarnings("serial")
public class MainGame extends Applet implements Runnable{
 private Vector characterList, characterListTemp;   //キャラクターリスト, 仮キャラクターリスト,htmlタグと読まれるのでエスケープ
 private volatile Thread gameThread;      //ゲーム用スレッド
 private Image offImage;        //オフセット画面
 private Graphics gv;        //グラフィックオブジェクト
 private int scene;        //シーン
 private final int SCENE_INIT = 0;      //シーン:初期化
 private final int SCENE_TITLE = 1;      //シーン:タイトル
 private final int SCENE_MAINGAME = 2;      //シーン:メインゲーム
 private final int SCENE_GAMEOVER = 3;      //シーン:ゲームオーバー
 private int score;        //得点
 private Font scoreFont;        //得点用のフォント
 private int width, height;       //画面幅,高さ
 private MediaTracker mt;       //画像読み込み用
 private int enemyInterval;       //敵出現間隔
 private int enemyIntervalCount;       //敵出現間隔用カウンタ
 private int itemIntervalCount;       //アイテム出現間隔カウンタ
 private MyCharacter myCharacter;      //マイキャラクターオブジェクト保存用
 public Image imgMyCharacter;       //マイキャラクター用の画像
 public Image imgBullet;        //弾用の画像

 public void init(){
  width = getSize().width;      //widthに画面サイズを代入
  height = getSize().height;      //heightに画面サイズを代入

  scene = SCENE_INIT;
  scoreFont = new Font("Arial", Font.BOLD, 12);    //得点用フォント生成
  setBackground(Color.black);      //背景色を黒に設定
  setForeground(Color.white);      //前景色を白に設定
  offImage = createImage(width, height);     //仮想画面の生成
  gv = offImage.getGraphics();
  addKeyListener(new Key());      //キー操作受付オブジェクト生成
  Character.display = this;      //Characterクラスにアプレットを渡す
  mt = new MediaTracker(this);      //メディアトラッカー生成
  characterList = new Vector();    //キャラクターリスト生成,htmlタグと読まれるのでエスケープ
  characterListTemp = new Vector();    //仮キャラクターリスト生成,htmlタグと読まれるのでエスケープ

  //画像読み込み+メディアトラッカーに登録
  imgMyCharacter = getImage(getDocumentBase(), "./data/MyCharacter.gif");
  mt.addImage(imgMyCharacter, 0);
  imgBullet = getImage(getDocumentBase(), "./data/Bullet.gif");
  mt.addImage(imgBullet, 0);
  requestFocus();        //フォーカス要求
 }

 //ゲームスレッドの開始
 public void start() {
  if(gameThread == null) {
   gameThread = new Thread(this);
   gameThread.start();
  }
 }

 //ゲームスレッドの停止
 public void stop() {
  gameThread = null;
 }

 @Override
 public void run() {
  //メインループ
  while (gameThread == Thread.currentThread()) {
   //裏画面の消去
   gv.clearRect(0, 0, width, height);
   //各シーン処理
   switch (scene) {
    case SCENE_INIT: gameInit(); break;   //準備画面
    case SCENE_TITLE: gameTitle(); break;   //タイトル画面
    case SCENE_MAINGAME: gameMain(); break;   //ゲーム画面
    case SCENE_GAMEOVER: gameOver(); break;   //ゲームオーバー画面
   }

   repaint();       //再描画

   //20ミリ秒待つ
   try {
    Thread.sleep(20);
   } catch (InterruptedException e) {
    break;
   }
  }
 }

 //ゲーム初期化処理
 private void gameInit(){
  drawCenter("Loading...", 180);      //画面描画

  //画像が完全に読み込まれるまで待つ
  if (mt.statusAll(true) == MediaTracker.COMPLETE) {
   ready();       //準備処理
   scene = SCENE_TITLE;      //タイトル画面へ移行
  }
 }

 //ゲーム開始準備処理
 private void ready(){
  score = 0;        //得点初期化
  enemyInterval = 50;       //敵出現間隔初期化
  enemyIntervalCount = enemyInterval;     //敵出現間隔カウンタ初期化
  itemIntervalCount = 0;       //アイテム出現間隔カウンタ初期化
  characterList.setSize(0);      //キャラリスト初期化
  characterListTemp.setSize(0);      //仮キャラリスト初期化
  myCharacter = new MyCharacter();     //マイキャラクターの生成
  addList(myCharacter);       //マイキャラクターの追加
 }

 //ゲームタイトル時処理
 private void gameTitle(){
  //エンターキーが押された時
  if(Key.enter){
   System.gc();       //リプレイするときにゴミを消す
   scene = SCENE_MAINGAME;      //ゲーム画面へ移行
  }

  //タイトル画面の描画
  gv.setFont(new Font("Arial",Font.BOLD, 20));    //フォント設定
  drawCenter("GAME START_", 80);      //ゲームスタートを中央表示
  drawCenter("HIT ENTER KEY", 180);     //エンター叩いてを中央表示
 }

 //ゲーム画面処理
 private void gameMain(){
  int i, j;        //計算処理用
  Character character, characterCheck;     //キャラクターの処理及び当たり判定用

  //全キャラクターの移動処理
  for(i = 0; i < characterList.size(); i++){
   character = (Character)(characterList.elementAt(i));  //リストからキャラクターの情報を取得
   character.move();      //それぞれの動きを実行
  }

  //全キャラクターの描画処理
  for(i = 0; i < characterList.size(); i++){
   character = (Character)(characterList.elementAt(i));  //リストからキャラクターの情報を取得
   character.draw(gv);      //それぞれの描画を実行
  }

  //全キャラクターの当たり判定処理
  for(i = 0; i < characterList.size(); i++){
   character = (Character)(characterList.elementAt(i));  //リストからキャラクターの情報を取得
   for(j = 0; j < characterList.size(); j++){
    characterCheck = (Character)(characterList.elementAt(j)); //リストからキャラクターの情報を取得
    character.checkHit(characterCheck);    //当たり判定
   }
  }

  //死亡判定処理
  i = 0;
  while(i < characterList.size()){
   character = (Character)(characterList.elementAt(i));  //リストからキャラクターの情報を取得

   //死亡していたら
   if(character.isDead()){
    characterList.removeElementAt(i);   //リストからキャラクターの削除
   }
   else{
    i++;       //次のキャラクターへ進む
   }
  }

  //キャラクターリストの更新処理
  for(i = 0; i < characterListTemp.size(); i++){
   characterList.addElement(characterListTemp.elementAt(i)); //キャラクターリストに仮キャラクターリストを追加
  }
  characterListTemp.setSize(0);      //仮キャラクターリストを初期化

  //スコアの描画処理
  gv.setFont(scoreFont);       //フォント設定
  gv.drawString("SCORE:" + String.valueOf(score), 10,20);   //スコア表示
 }

 //ゲームオーバー画面処理
 private void gameOver(){
  //エンターキーが押されたら
  if(Key.enter){
   ready();       //ゲーム開始準備
   scene = SCENE_TITLE;      //タイトル画面へ移行
  }

  // ゲームオーバー画面描画
  gv.setFont(new Font("Arial", Font.BOLD, 28));
  drawCenter("GAME OVER", 180);
  drawCenter("SCORE : " + String.valueOf(score), 350);
 }

 //アプレットの幅の取得
 public int getW(){
  return width;
 }

 //アプレットの高さを取得
 public int getH(){
  return height;
 }

 //マイキャラクターの座標取得
 int getMyCharacterX(){
  return myCharacter.getX();
 }
 int getMyCharacterY(){
  return myCharacter.getY();
 }

 //文字列を中央揃えで表示
 private void drawCenter(String str, int y) {
  FontMetrics fm = getFontMetrics(gv.getFont());    //フォント指定
  gv.drawString(str, (width - fm.stringWidth(str)) / 2, y);  //文字出力
 }

 //仮キャラクターリストにキャラクターを追加する
 public void addList(Character character){
  characterListTemp.addElement(character);    //仮キャラクターリストに追加
 }

 //スコア加算
 void addScore(int s){
  score += s;        //スコアに引数だけ加算
 }

 //ゲームオーバーへ移行用
 void goGameOver(){
  scene = SCENE_GAMEOVER;       //ゲームオーバー画面へ移行
 }

 //描画処理
 @Override
 public void paint(Graphics g){
  g.drawImage(offImage, 0,0,this);     //仮想画面から切り替え
 }

 //更新
 public void updata(Graphics g){
  paint(g);        //仮想画面を描画処理へ送る
 }
}

これから敵キャラも出すことを想定して敵の出現要素とかも入れてあります...
あとこの前書いたレンダリング処理入れてないです.あの処理思いついた時には書き終わってしまってたので…次の機会に使います.と言うかもっと綺麗に書くつもりでいたんですけどね...
メインがめちゃくちゃ読みにくい…

前に紹介したキー入力クラスと一緒に適当な画像ぶち込むと動くはず.AppletじゃなくてSwing使えばよかったと後悔しながら続きも作ると思います.

 おかしい処理とかあれば教えてください.

僕から以上.

2013年7月5日金曜日

[LaTeX]コードをそのまま表示したいときに便利な\begin{verbatim}~\end{verbatim}の紹介

どうも僕です.

今回はLaTeXについての話です.
しばらく使ってないので忘れ始めてるので書き留めておきます.

さて,本題.
LaTeXって便利なんですけどプログラムのソースコードを載せようと思うと死にそうな思いをして\書きまくった記憶があるんですけど僕がバカだっただけで,そのまま出力できない#<>{}\"が出力出来る方法が実はあったんですね.
サクッと書いちゃいます.

\begin{verbatim}
#include <stdio.h>

int main(void){

  printf("Hello World!!\n");

  return 0;
}
\end{verbatim}

こんなかんじです.
まあverbatimがなんて読むのかわからないので仮名としてヴァーベイティムって読むことにしますが,こいつは行単位で出力してくれるのでタブとかもしっかり反映してくれます.嬉しい.

ちょっとしたソースコード乗せる時に死ななくて良くなりました. 

余談
{Y}\llap{G}
重ね文字が作れるので面白いです. 

僕から以上.

2013年6月29日土曜日

[Java]repaint()を使わずに自前で描画処理をしよう

どうも僕です.
今回はゲームとかで描画処理する時のタイミングを自分で決められるようにするためにrepaint()を使わずに描画する方法をメモっとこうと思います.

repaint()は再描画の要求であって実際に再描画するかどうか判断するのはJVMが決めます. JVMの判断ではスピードが要求されるゲームではきついので任意のタイミングで描画できるように自前で作る必要があります.

//スレッド使ってる前提で話し始める
public void run(){
 //ゲームループ
 while(true){
  //ゲームの処理を書く
  //例えばキャラの移動とか...

  //こっから本題
  render();
  paintScreen();

  //休憩
  try{
   Thread.sleep(10);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

サクッとサンプル書くとこんなかんじです.
休憩とかは実際は1ループが毎回同じ時間で終わるようにするために時間を測って休憩に割り振るのが良いと思うのですが今回は適当にします.

render()とpaintScreen()が自作メソッドになります.
render()はSwingコンポーネントで勝手にやっちゃうのであまり見なくなったダブルバッファリングってやつを使います.

やり方は,まずバッファ領域を作ります.今回はBImageって名前にしときます.こいつは初めてrender()を呼び出した時に生成されます.次にBImageに書き込むのに必要なGraphicsオブジェクトを作ります.今回はBGraphicsって名前にしときます.こいつも呼び出されたタイミングで生成されます.


//ダブルバッファリング
    private void render() {
        if (BImage == null) {
            BImage = createImage(WIDTH, HEIGHT);
            if (BImage == null) {
                System.out.println("イメージ取得ミス");
                return;
            } else {
                BGraphics = BImage.getGraphics();
            }
        }

        // バッファをクリアする
        BGraphics.setColor(Color.WHITE);
        BGraphics.fillRect(0, 0, WIDTH, HEIGHT);

        ball.draw(BGraphics);
    }

上で作られたバッファイメージを描画する処理がpaintScreen()になります.

//バッファを画面に描画
    private void paintScreen() {
        try {
            Graphics g = getGraphics();
            if ((g != null) && (BImage != null)) {
                g.drawImage(BImage, 0, 0, null);
            }
            Toolkit.getDefaultToolkit().sync();
            if (g != null) {
                g.dispose();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

ballって何だよとか言われたくないので動く形にまとめておきます.

Panelクラス
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JPanel;

public class Panel extends JPanel implements Runnable {
    public static final int WIDTH = 640;
    public static final int HEIGHT = 480;

    private Ball ball;

    private Graphics BGraphics;
    private Image BImage = null;

    private Thread gameLoop;

    public Panel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));

        ball = new Ball(10, 10, 10, 10);

        //ゲームループ開始
        gameLoop = new Thread(this);
        gameLoop.start();
    }

    //ゲームループ
    public void run() {
        while (true) {
            update();
            render();
            paintScreen();

            //休憩
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //描画情報の更新一覧
    private void update() {
        ball.move();
    }

    //ダブルバッファリング
    private void render() {
        if (BImage == null) {
            BImage = createImage(WIDTH, HEIGHT);
            if (BImage == null) {
                System.out.println("イメージ取得ミス");
                return;
            } else {
                BGraphics = BImage.getGraphics();
            }
        }

        // バッファをクリアする
        BGraphics.setColor(Color.WHITE);
        BGraphics.fillRect(0, 0, WIDTH, HEIGHT);

        ball.draw(BGraphics);
    }

    //バッファを画面に描画
    private void paintScreen() {
        try {
            Graphics g = getGraphics();
            if ((g != null) && (BImage != null)) {
                g.drawImage(BImage, 0, 0, null);
            }
            Toolkit.getDefaultToolkit().sync();
            if (g != null) {
                g.dispose();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ボールクラス
import java.awt.Color;
import java.awt.Graphics;

public class Ball {
    private static final int SIZE = 32;
    private int x, y;
    private int vx, vy;

    public Ball(int x, int y, int vx, int vy) {
        this.x = x;
        this.y = y;
        this.vx = vx;
        this.vy = vy;
    }

    public void move() {
        x += vx;
        y += vy;

        if (x < 0) {
            x = 0;
            vx = -vx;
        }

        if (x > Main.WIDTH - SIZE) {
            x = Main.WIDTH - SIZE;
            vx = -vx;
        }

        if (y < 0) {
            y = 0;
            vy = -vy;
        }

        if (y > Main.HEIGHT - SIZE) {
            y = Main.HEIGHT - SIZE;
            vy = -vy;
        }
    }

    public void draw(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(x, y, SIZE, SIZE);
    }
}


実行用テストクラス
import javax.swing.JFrame;

public class Test extends JFrame {
    public Test() {
        setTitle("動作チェック");

        Panel panel = new Panel();
        getContentPane().add(panel);

        pack();
    }

    public static void main(String[] args) {
        Test frame = new Test();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}


こんな感じです.適当に書きすぎてクラスにまとめろよってかんじですが,これで任意のタイミングで描画することができるよになります. もっといい方法があれば僕に教えてください. 僕から以上.

2013年6月15日土曜日

[php]htmlとかのチェックボックスの値保持について

どうも僕です.

チェックボックスの値を保持するのができなくて死んでたけどできて嬉しいからちょっとまとめときます.


$input = "";   //表示用
$count = 0;   //カウント用

//値セット
$const = array("hoge","piyo","huge","sine");
if(isset($_POST["checkboxs"])){
 $checkboxs = $_POST["checkboxs"];
}

//チェックボックスの値保持用
foreach($const as $element){
 if(isset($checkboxs[$count])){
  if($checkboxs[$count] == $element){
   $checked = "checked"; 
    $count++;
  } else{
   $checked = "";
  }
 }else{
  $checked = "";
 }
 $input .= "";

}
$input .= "";


//表示
print ( "<html>\n"
  ."\t<head>\n"
   ."\t\t<title>checkboxテスト</title>\n"
  ."\t</head>\n"
  ."\t<body>\n"
   ."\t\t<form method="post">
\n"
    ."\t\t\t$input\n"
   ."\t\t</form>
\n"
  ."\t</body>\n"
 ."</html>"
 );

こんな感じです.

もうちょい綺麗にできる気がするけど簡単に使うだけならこんな感じでやることにしました.
もっといい方法があったら教えてください.

僕から以上.

2013年6月1日土曜日

[java].jarから.exeの作り方

どうも僕です.

.jarまで作ることはよくあったんですけど,これって結局javaがインストールされてないと動かないので,ちょいちょい困ってたわけですよ.C言語使ってるときは,windows環境で動かすの簡単だったのに…とか思って.exe作れないかと探ったとこできるみたいだったのでメモしときます.

まず必要なものなのでexewrapってやつを拾ってきます.

次に.jarファイルを準備します.
 一応Window出たほうがかっこいいってだけでこんなかんじのソースを書きます.
import javax.swing.JFrame;

class SampleFrame{
  public static void main(String args[]){
    JFrame frame = new JFrame("タイトル");
    frame.setBounds(100, 100, 200, 160);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

コンパイルします.
javac SampleFrame.java

jarファイルを作るためにマニフェストを書きます.いろんなサイト見る限りMANIFEST.MFが流行ってるみたいですけどなんでもいいみたいです.試しにsample.txtにしました.
Main-Class: SampleFrame

最後に改行入れないといけないんで適当に入れてください.
またSampleFrameのとこにクラス名を入れれば他のやつでも使えます.

これでjarファイルを作る前段階ができました.後はコマンド叩くだけです.
jar cvfm frame.jar sample.txt *.class

.jar完成.さて,今回の本題に入れますね.
落としといたexewrapを.jarファイルがあるディレクトリに入れてコマンド叩きます.
exewrap -g frame.jar

引数にある-gはexeを起動するときにコマンドプロンプトを立ちあげないために入れるみたいです.
これでexeファイルが出力されてるのでjavaがインストールされてないwindowsでも起動できるようになりました.嬉しいです.

他の引数とかはexewrapのサイトに書いてるので参考にしてください.

本題の内容少ないですけど
以上僕からでした.

2013年5月26日日曜日

[java]javaのswitch構文について

どうも僕です.

java SE 7から,switch構文で文字列が使えるようになったのに気づいてたけど使ってなかったんでちょろっと使ってみました.

enum型で使う時からちょいちょいぬるぽが出て意味分からないって思ってswitchを調べたらわかった.式の中にnullがはいったらdefaultに飛ばずにぬるぽを返すらしい.
考えた結果,if-else switchイデオムを使うといんじゃね?ってことで試してみました.

//sはString型
if(s == null){
 System.out.println("Null");
}else switch(s){
 case "a":
  System.out.println("A");
  break;
 case "b":
  System.out.println("B");
  break;
 default:
  System.out.println("Other");
}


これであればInteger型やenum型でのswitchでも同じ方法が使えると思います.
安全なコードを書くときは基本使っておくべきだと思います.

僕から以上.

2013年5月19日日曜日

[java]JAX-WSでWebサービスが作れるらしいのでやってみた

どうも僕です.

Webサービスを公開するために特別なクラスを作ることなく,しかも適当なクラスにアノテーションで修飾するだけで公開できるらしいです.

そんなかっこいいJAX-WSで任意のJavaクラスをWebサービスにして公開できるものを試してみました.

まず,Webサービスを公開するために重要な点が2点あります.
1.必ずパッケージを設定すること.パッケージをつける理由としてスキーマの名前空間に対応するらしいので省略できないらしいです.
2.@WebServiceアノテーションでクラスを修飾することです.修飾されたクラスのpublicなメソッドがWebサービスとして利用可能になります.

必須じゃないんですけど公開するメソッドには基本@WebMethodアノテーションで修飾するといいですね.

さて,書いていきますか.

package jaxws.sample;

import javax.jws.WebMethod;
import javax.jws.WebService;

/**
 * Webサービスとして公開するクラス。
 */
@WebService
public class Hello {

    @WebMethod
    public String HelloWord(String name) {
        return "Hello, " + name + "!";
    }
}
ソースの説明はいらないですね.
コンパイルします.

javac jaxws/sample/Hello

次にWSDLを生成するために必要なファイルを準備します.
コンパイルしたクラスを引数で指定して,JDK付属の「wsgen」を実行します.クラスパスにも上でで作成したクラスを通しておく必要があります.通すの忘れて詰まった僕がいますので書いときます.

wsgen -cp . jaxws.sample.Hello

実行後,「./jaxws/sample/jaxws」以下に,「HelloWord.class」と「HelloWordResponse.class」が作成されてることが確認できると思います.

あとはHTTPサーバーを起動するランチャを書いてしまえばサーバー部分はおしまいです.
サクッと書いていきます.

package jaxws.sample;

import javax.xml.ws.Endpoint;

public class HelloServiceLauncher {
    public static void main(String[] args) {
        // Web サービスの公開
        Endpoint.publish(
            "http://localhost:8080/hello",
            new Hello()
        );
    }
}

Endpointクラスのpublishメソッドの第1引数がWebサービスを公開するアドレス,第2引数がWebサービスで公開するオブジェクトです.
これをコンパイルして実行すれば,「http://localhost:8080/hello」でWebサービスが公開されます.WSDLはEndpointクラスのpublishメソッドの中で自動生成されるので「http://localhost:8080/hello?wsdl」で参照可です.もし、8080ポートが使用中であれば、他のポートに変更してください。

あとは,Webサービスのクライアントを作成するだけですね.
まずWSDLからクライアント作成に必要なクラスを生成します.ここで使用するのがwsimportコマンドです.こいつを使うとWSDLを意識せずにクライアントを作成できます.

wsimport http://localhost:8080/hello?wsdl

wsimportの引数にはWSDLファイルを指定します.リモートにある場合でも,URLを指定すれば(試してないけど多分)大丈夫です.
もちろん,サーバを動作させていなくてはなりません.させてなくて詰まった僕がいますので一応書いときます.

import jaxws.sample.Hello;
import jaxws.sample.HelloService;

/**
 * クライアントクラス。
 */
public class HelloClient {
    public HelloClient() {
        //Webサービスのポートを取得
        HelloService service = new HelloService();
        Hello port = service.getHelloPort();
 
        //Webサービスの実行
        String result = port.HelloWord("World");
        System.out.println(result);
    }
 
    public static void main(String[] args) {
        new HelloClient();
    }
}

wsgenとwsimportを使用すれば,Webサービスの公開が簡単にできるのがわかりました.






2013年5月18日土曜日

bloggerでコードのハイライトがうまくいかない件

どうも僕です.

悲報です.と言うか知らなかっただけなんですけど,Bloggerってコードのハイライトがうまくいかないんですね.

適当にCode Prettifyとかいうやつでハイライトさせてたんですけど…
モバイル版で表示できない事がわかった.

代わりになるものないか探してたんですけど見つからない.というか表示できない.
SyntaxHighlighterとか言うやつ使ってもモバイル版でハイライトされない…

心が折れたので後日時間がある時に探すことにします.

以上.

2013年5月12日日曜日

[ゲーム]Javaでゲームを作る

どうも僕です.

Javaでゲームを作るってすごく大ざぱなこと言ったんですけど実際にはそれの部品となるものとか作って行くつもりです.と言うのも4月ぐらいにふと思ったシューティングゲームが作りたいと...

仕様としては
・自分のキャラクターがいる.
→矢印キーで自分のキャラクターを動かせる.
→スペースで弾が撃てる.

・敵キャラクターがいる.
→自動で動く
→なんパターンか動きを入れる.
→弾は撃ってこない.

・パワーアップアイテムがある.

・スコアとか付けたい.

こんなかんじです.

なんだかんだ全然進んでないんですけどとりあえず現在できてる部分を晒しておこうかと..
最初に自分のキャラクターを動かせることを目指してるので,
今回はキー入力用のクラスを作って起きます.
 
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Key extends KeyAdapter {
    //入力可能キー
    public static boolean left, right, up, down, space, enter = false;

    // キーが押されたときの処理
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_LEFT: left = true; break;    //←
            case KeyEvent.VK_RIGHT: right = true; break;  //→
            case KeyEvent.VK_UP: up = true; break;        //↑
            case KeyEvent.VK_DOWN: down = true; break;    //↓
            case KeyEvent.VK_SPACE: space = true; break;  //SPACE
            case KeyEvent.VK_ENTER: enter = true; break;  //Enter
        }
    }

    // キーが離されたときの処理
    public void keyReleased(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_LEFT: left = false; break;    //←
            case KeyEvent.VK_RIGHT: right = false; break;  //→
            case KeyEvent.VK_UP: up = false; break;        //↑
            case KeyEvent.VK_DOWN: down = false; break;    //↓
            case KeyEvent.VK_SPACE: space = false; break;  //SPACE
            case KeyEvent.VK_ENTER: enter = false; break;  //Enter
        }
    }
}


こんなかんじになりました.
使い方はif(Key.left)とか書いて判定したいところで使っていく形を考えてます.

もっと使いやすいキー入力判定があれば僕に教えて下さい..
 

2013年5月11日土曜日

[ロボコード]Javaの勉強用に便利な戦車ゲーム

どうも僕です.
タイトル通りロボコードについて忘れないように書いときます.

まずロボコードについてなんですが,IBMってとこが提供するフリーのゲームで,Javaを使ってプログラムした戦車ロボット同士を戦わせるものになってます.

要するに,ゲームしながら勉強ができるってわけですね.僕は,これにめちゃくちゃハマりました.
ただ最近は人気があまりないみたいなので残念です.

今回は人気でろよってことで,始め方とか書いていこうかと思ってます.
まずロボコードの本体をDLしてこないと始まらないのでDL(ver1.8.1.0)してきます.
その後実行したら良い感じにセットアップしてくれるので楽です(JDKを入れてること前提に話してます).

さて,セットアップできたらたちあげてみましょう.
初回起動時だけ突然戦い始めます.次から自分で戦わせるときは左上のBattle→Newを押すと戦いの設定ができます.

・戦い方
 戦わせたいロボットを選んで右の枠に入れてstartBattleで対戦が開始出来ます.いろんなサンプルが最初からいるので適当な奴を入れて対戦させるといいでしょう.

でもサンプル戦わせても楽しくないし自分のロボットを作りたくなりますよね.
そこでRobot→Editorを押すとロボコード専用のeditorが開きます.これだけで開発することができます.すごいお得ですね.

・ロボの作り方
 File→new→Robotを押すと新しいRobotを作ることができます.
 押したらまず名前をつけてその後所属グループみたいなものを決めます.
 最初から一応動くプログラムになってるのでコンパイルしてしまいましょう.
compiler→compileを押すとなんか画面出てきてCompiled successfully.とか出てたらOKです.
上手くいかなかったらcompiler→option→ResetcompilerでコンパイラをResetしてみてください(初期起動の時確かeditor開いた瞬間にコンパイラのパス通していいか聞かれた気がするのでなにか出たらOKしとけばだいたい動きます).

自分のRobotを戦わせましょう.

先ほどのeditorでどんな動きをするプログラムだったのか見て行きましょう.
・初期コードの説明(最初からコメントされてる部分を消してコメント入れてます)

//今回はRobotの名前をRoboにしてグループをroboにしてます
package robo;

//ロボコードのAPI
import robocode.*;

//ロボクラス
public class Robo extends Robot{

 //ロボットの動きを制御するメソッド
 public void run() {
  //常にこれを繰り返します
  while(true) {
   ahead(100);  //前に100進む
   turnGunRight(360); //砲台を360度右向きにまわす
   back(100);  //後ろに100進む
   turnGunRight(360); //砲台を360度右向きにまわす
  }
 }

 //イベント処理→レーダーで捉えたら呼び出されるメソッド
 public void onScannedRobot(ScannedRobotEvent e) {
  fire(1);   //弾のパワー1で打つ
 }

 //イベント処理→弾に撃たれた時呼び出されるメソッド
 public void onHitByBullet(HitByBulletEvent e) {
  back(10);   //後ろに10進む
 }
 
 //イベント処理→壁にぶつかった時呼び出されるメソッド
 public void onHitWall(HitWallEvent e) {
  back(20);   //後ろに20進む
 } 
} 


こんなかんじになります.英語が読めればだいたい意味はわかりますよね…読めなかった僕が悪いんですよね.
他にもイベント処理に現在のターンとか取得できたり相手のロボットの名前を取得できたりするので後日時間があったらちょいちょい書いていきますかね.

・まとめ
 ロボコードのセットアップから初期ロボットまでは作れるような感じになったはず.


方針的ななにか

とりあえずブログ始めました...
ということで方針的なもの書いとくことで僕自身こいつが何だったのか思い出すものにします.

記事にするもの
 1.僕のメモ書き
 2.プログラム言語の復讐

ということで結局僕のメモ書きですね.