ラベル サンプルコード の投稿を表示しています。 すべての投稿を表示
ラベル サンプルコード の投稿を表示しています。 すべての投稿を表示

2013年5月3日金曜日

ServletでBase64を扱う際に

BASIC認証がやりたくて調べていたのですが、サンプルコードにBase64をデコードするメソッドが大抵書いてあるのですが、そのメソッドがGAEではつかえない。。。

それ以外の部分は動きそうだったのでその部分だけ自分で書くかネットのを流用しよう。
と思った。

maru sourceさまの
http://blog.h13i32maru.jp/entry/20110116/1295187291
を使わせてもらった

ただ、デコードの部分にバグがありbyte配列に後ろに0が入っているのでnew String(byte[]);としたときに変な文字列が後ろにつくことになる。

方法としては、後ろの0がある配列を取り除く繰り返し文を書くか、0 byteの文字列を取り除くコードを書くか(幸いJAVAのStringとても便利だ!)
あとは、新しく自分で作るだがめんだくさい

今回はファイル操作などせずに単純に文字列をデコードしたいだけなので0 byteの文字列を取り除くことにする
もし、仮にmp3などをデコード、エンコードしたい場合は一度バイナリファイルを見てみるといいだろう
自分でつくるか他に探し出すという結果しか出てこないだろう、

   String result = decodeToString("エンコードされた文字列");
   byte[] zerobyte={0};
   result = result.replace(new String(zerobyte),"");

もしくは一番後ろの文字列
   String str = encode("abcde".getBytes());
   byte[] result=decode(str);
   int length=result.length-1;
   while(true){
      if(result[length]!=0){
         break;
      }
      else{
        length--;
      }
   }
   str=new String(result).substring(0,length+1);

あとは有効そうなのはもともとの文字列の長さを他に持たせておきそのサイズだけ取り出すとかかなあ

2013年3月28日木曜日

Google App Engine for Java

GAEを使いServletを動作させてみた。
Webアプリケーションが予想していたよりも、簡単にできたのはとても意外でありEclipseの偉大さも改めて感じた。

ちょこっとしか弄っていないがこれからどんどん弄ろうかなと思う。

サンプルとして

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class H0tcakeAP1Servlet extends HttpServlet {
 //GETで呼ばれたときに呼ばれる。
 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  resp.setContentType("text/plain");
  resp.getWriter().println("http://h0tcakeap1.appspot.com");
 }
 //データがポストされたときに呼ばれる
 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  resp.setContentType("text/plain");
  
  String para=req.getParameter("api");//POSTされたパラメータ(api)を取得
  resp.getWriter().println(selector(para,req));
 }
 //リクエストによってAPIを判別
 private String selector(String para,HttpServletRequest req){
  if(para==null){
   return "null";
  }
  String respons=null;
  if(para.equalsIgnoreCase("ipaddress")){
   respons=req.getRemoteAddr();//グローバルIPアドレスを取得
  }else{
   respons="null";
  }
  
  return respons;
 }
 
}


データをポストするとdoPostが呼ばれるんだと知った。
実際に公開してみたが目に見える範囲はほとんどHTMLファイル。。。。

http://h0tcakeap1.appspot.com

内容としてはグローバルIPアドレスを取得できるものを作った。

サンプルコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class H0tcakeAP1TEST {

 /**
  * @param args
  * @throws IOException 
  * @throws MalformedURLException 
  */
 public static void main(String[] args) throws MalformedURLException, IOException {
  URLConnection uc= new URL("http://h0tcakeap1.appspot.com/h0tcakeap1").openConnection();
  uc.setDoOutput(true);
  OutputStream os = uc.getOutputStream();
  PrintStream ps = new PrintStream(os);
  ps.print("api=ipaddress");
  ps.close();
  //受信
  InputStream is = uc.getInputStream();//POSTした結果を取得
  BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
  StringBuffer sb= new StringBuffer();
  String temp=null;
  while ((temp = reader.readLine()) != null) {
   sb.append(temp);
  }
  reader.close();
  
  System.out.println("IP Adress:"+sb.toString());
  
 }

}


雑記:
MacTypeというフォント関係のソフトをインストールしてみたが素敵だった。

2013年3月5日火曜日

壊れたMP3を少し治す

前に自作したダウンローダを利用して保存していたmp3データが壊れていた。

理由はダウンローダにバグがあり、ところどころに0が入っていてノイズになる。
mp3の構造を調べないといけないのかなと思いつつ、とりあえず0を除くプログラムを組んだ。
ちょっとだけましだった


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Repair {

 private File file;
 private int checkByte = 5;
 private int checkByte2 = 4;

 public Repair(File file) {
  this.file = file;
  if (!this.file.isFile())
   this.file = null;
 }

 public Repair(String file) {
  this.file = new File(file);
  if (!this.file.isFile())
   this.file = null;
 }

 public long execute() throws Exception {
  System.out.println("Repair");
  if (file == null)
   return -1;
  long start = System.currentTimeMillis();
  FileInputStream fis = new FileInputStream(file);
  File repair = new File(file.getAbsoluteFile() + ".repair.mp3");
  int d = 0;
  while (repair.isFile()) {
   repair = new File(file.getAbsoluteFile() + "." + Integer.toString(d++) + ".repair.mp3");
  }
  FileOutputStream fos = new FileOutputStream(repair);
  int ocount;
  int counter = 0;
  boolean skip = false;
  boolean wait = false;
  Integer ch;
  byte[] zerobuf = new byte[checkByte];
  byte[] buf = new byte[checkByte2];
  int zerosize = 0;
  int bufsize = 0;
  boolean first = true;
  while ((ch = fis.read()) != -1) {

   /////////
   if (first) {
    if (skip)
     if (ch != 0) {
      skip = false;
      first=false;
     }
    if (first)
     if (!skip) {
      if (ch == 0) {
       wait = true;
      } else {
       wait = false;
      }
      if (wait) {
       zerobuf[zerosize++] = 0;
       if (zerosize == checkByte) {
        //System.out.print("skip");
        skip = true;
        zerosize = 0;
       }
      } else {
       fos.write(ch);
       if (zerosize != 0) {
        fos.write(zerobuf, 0, zerosize);
        zerosize = 0;
       }
      }
     }
   }

   if (!first) {
    if (skip)
     if (ch != 0) {
      skip = false;
     }

    if (!skip) {

     buf[counter] = ch.byteValue();
     //System.out.println("byte"+buf[counter]);
     //System.out.println("\tInt->"+ch);
     //Thread.sleep(500);
     if (counter++ == checkByte2 - 1) {
      counter = 0;
      ocount = 0;
      for (int i = 0; i < checkByte2; i++) {
       if (buf[i] == 0) {
        ocount++;
       }
      }
      if (ocount == checkByte2) {
       //System.out.println("0 skipを見つけました");
       skip = true;
      } else
       fos.write(buf);
     }
    }

   }
  }
  fos.close();
  fis.close();
  return System.currentTimeMillis() - start;
 }

}

2013年2月26日火曜日

どっかの大学の課題

課題を拾ってきて適当にやってみた。
こういうのって結構、教授とか調べてると思うんだけど。。。
http://oshiete.goo.ne.jp/qa/7965391.html
魚拓
http://megalodon.jp/2013-0226-1945-34/oshiete.goo.ne.jp/qa/7965391.html
切れててか題名がわからないけど、たぶん「3桁のクジ引きプログラム」かな?


import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

//@author aki
//2013 - 02 - 26

//抽選アプリケーション 
//仕様
//・「抽選」ボタンを出すたびに0~999までの間の数値をランダムで画面に出力する。
//・「3つの数値」「抽選」ボタンは画面中央へ「リセット」ボタンはなるべく端へ設置する。

public class Kadai001 extends JFrame {
 private JLabel numLabel[];
 private JButton cyusenB;
 private JButton resetB;
 private int[] numbox;

 //constructor
 public Kadai001() {
  super("抽選");//親クラスのコンストラクタ
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  setSize(300, 400);
  //仕様内容から出題者の意図を理解したところ、
  //Layoutの課題だと予測され、Layoutを多用したほうがいいと思われる。
  setLayout(new BorderLayout());

  JPanel content = (JPanel) getContentPane();
  JPanel center = new JPanel(new FlowLayout());
  content.add("Center", center);
  JPanel south = new JPanel(new BorderLayout());
  content.add("South", south);

  //variable
  Font font = new Font(Font.SANS_SERIF, Font.BOLD, 150);
  numLabel = new JLabel[3];
  for (int i = 0; i < 3; i++) {
   numLabel[i] = new JLabel(Integer.toString(i));
   numLabel[i].setFont(font);
   center.add(numLabel[i]);
  }
  cyusenB = new JButton("抽選");
  center.add("South", cyusenB);
  resetB = new JButton("Reset");
  south.add("West", resetB);

  //listener
  cyusenB.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    Random rnd = new Random();
    for (int i = 0; i < 3; i++) {
     makeNumBox(i);
     numLabel[i].setText(Integer.toString(numbox[rnd.nextInt(100)]));
    }
   }
  });
  resetB.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    for (int i = 0; i < 3; i++)
     numLabel[i].setText(Integer.toString(i + 1));
   }
  });
 }

 //遊び心
 private void makeNumBox(int count) {
  numbox = new int[100];
  int num1 = -1, num2 = -1;
  if (count == 1) {
   num1 = Integer.parseInt(numLabel[0].getText());
  } else if (count == 2) {
   num1 = Integer.parseInt(numLabel[0].getText());
   num2 = Integer.parseInt(numLabel[1].getText());
  } else {
   for (int i = 0; i < 100; i++) {
    numbox[i] = i / 10;
   }
   return;
  }
  Random rnd = new Random();

  //1回目,2回目に出た数字を出にくくする
  for (int i = 0, num = 0; i < 100; i++) {
   if (i / 10 == num1) {
    if (i - (i / 10) * 10 == 0) {
     num = i / 10;
    } else {
     num = rnd.nextInt(10);
    }
   } else if (i / 10 == num2) {
    if (i - (i / 10) * 10 == 0) {
     num = i / 10;
    } else {
     num = rnd.nextInt(10);
    }
   } else {
    num = i / 10;
   }
   numbox[i] = num;
  }
 }

 public static void main(String[] args) {
  // TODO 自動生成されたメソッド・スタブ
  new Kadai001().setVisible(true);
 }

}

JavaでMP3を再生(2013/02/26修正)

http://akis-i.blogspot.jp/2012/09/javamp3.html
のソースコードの修正です。

以下修正内容
・変数名が気持ち悪い
・BufferedInputStreamをつかいシークを実装しようと思えばできるようにした。

問題点&いつか直す
・メソッドがきもい
・音量の調節ができない
・メモ帳でいじったからもしかしたらバグがあるかも・・・
・修正とかいっときながら雑
・変数の使い捨て前提

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.net.URL;

import javazoom.jl.player.Player;
import frame.compornent.PlayerCompornent;

public class MP3Player extends Thread {
 // variable
 private Player player;
 private BufferedInputStream stream;
 private boolean run;
 private long filesize;

 public MP3Player() {
 }


 public void setFile(String file) {
  try {
   stream = new BufferedInputStream((new FileInputStream(file)));
   player = new Player(stream);
  } catch (Exception e) {
  }
 }

 public void setFile(URL url) {
  try {
   filesize = url.openConnection().getContentLength();//ファイルサイズ取得
   stream = new BufferedInputStream((url.openStream()));
   player = new Player(stream);
  } catch (Exception e) {
  }
 }

 public void start() {
  run = true;
  super.start();
 }

 public void stopMusic() {
  try {
   if (player != null) {
    player.close();
   }
   if (stream != null) {
    stream.close();
   }
   
  } catch (Exception e) {
   System.out.println("IOException");
  } finally {
   setStopper();
  }
 }

 public void setStopper() {
  player = null;
  stream = null;
  run = false;
 }

 public void run() {
  if (stream == null || player == null || !run) {
   stopMusic();
  } else {
   try {
    player.play();
   } catch (Exception e) {
    System.out.println("JavaLayerException");
   } finally {
    stopMusic();
   }
  }
 }

 public boolean isRun() {
  return run;
 }

 public BufferedInputStream getStream() {
  return stream;
 }

 public long getFilesize() {
  return filesize;
 }

}


}
a

2012年12月25日火曜日

C言語でsplit関数もどき

mallocの練習に、
文字列を指定した1文字で分割する関数を作りました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char **split(char *str,char c,int *len);
void splitFree(char **str,int len);

int main(){
 int len; 
 char **str=split("hello\nworld!",'\n',&len);
 printf("%s %s\n",str[0],str[1]);
 splitFree(str,len);//mallocを使っているので、開放する必要がある。
 return 0;
}
//str:分割する文字列,c:分割するときに使う区切り,*len:配列の数を取得するために
//戻り値は多重配列
char **split(char *str,char c,int *len){
 char **strings;//文字列配列
 char *str2;
 int i,fc,j,first;
 strings=(char**)malloc(sizeof(char*));
 //文字列のコピー
 str2=(char*)malloc(sizeof(char)*strlen(str));
 strcpy(str2,str);
 //探す
 for(i=0,fc=0,first=0;str2[i]!='\0';i++){
  if(str2[i]==c){
   fc++;//cを見つけた回数
   str2[i]='\0';//cをNULL
   //メモリ確保
   strings=(char**)realloc(strings,sizeof(char*)*fc);
   strings[fc-1]=(char*)malloc(sizeof(char)*strlen(str2));
   strcpy(strings[fc-1],(str2+first));
   first=i+1;//次の文字列が始まる位置
  }
 }
 //最後の文字列の確保
 if(str2[first]!='\0'){
  fc++;
  strings=(char**)realloc(strings,sizeof(char*)*fc);
  strings[fc-1]=(char*)malloc(sizeof(char)*strlen(str2));
  strcpy(strings[fc-1],(str2+first));
 }
 *len=fc;//要素数
 return strings;
}

void splitFree(char **str,int len){
 int i;
 for(i=0; i < len ; i++){
  if(str[i]!=NULL){
   free(str[i]);
   str[i]=NULL;
  }
 }
 if(str!=NULL){
  free(str);
  str=NULL;
 }
}

2012年12月24日月曜日

動的な配列の確保


C言語の配列では要素数を変更できません。
なのでポインタを使い、動的な配列の確保を行います。

使う関数は、mallocとreallocでstdlib.hをインクルードする必要があります。

はじめはmallocの使い方。
mallocの戻り値はvoid型ポインタなので、キャストしてあげます。
引数は、確保したいメモリのバイト数なので、sizeof(型)*要素数を渡してください。
なので、今回は(char**)malloc(sizeof(char*)*要素数)としてます。
mallocの注意点としては、メモリを確保できなかった時はNULLを返すところです。
なのでif(pp==NULL)とかいれて対処するとよいでしょう。
今回は特にNULLの時の処理は入れていません。
mallocがNULLを返すときはOSがメモリを渡してくれないときなので、プログラムを終了させる処理でも入れとけばいいと思います。
それと、最後にfree()を使い確保したメモリを開放しましょう。
#include <stdio.h>
#include <stdlib.h>

int main() {
 char **pp; //配列
 const int ele = 3; //要素数
 int i;
 //メモリを確保
 pp = (char**) malloc(sizeof(char*) * ele);

 for (i = 0; i < ele; i++) {
  //メモリを確保
  pp[i] = (char*) malloc(sizeof(char) * 15);
  sprintf(pp[i], "Hello - %d", i); //テストのために入れておく
 }
 //中身を確認
 printf("printf test\n");
 for (i = 0; i < ele; i++) {
  fprintf(stdout, "%s\n", pp[i]);
  free(pp[i]); //忘れないで
 }
 free(pp); //忘れないで
 return 0;
}
次にreallocを使い動的な配列をつくります。
reallocは割り当てたメモリを再度確保しなすのでその時にサイズを変えます。
reallocもメモリが確保できなかった場合にNULLを返すのでそれの処理を入れておくとよいでしょう。
#include <stdio.h>
#include <stdlib.h>
int main() {
 char **pp; //配列
 const int ele = 3; //要素数
 int i;
 //メモリを確保
 pp = (char**) malloc(sizeof(char*) * ele);

 for (i = 0; i < ele; i++) {
  //メモリを確保
  pp[i] = (char*) malloc(sizeof(char) * 15);
  sprintf(pp[i], "Hello - %d", i); //テストのために入れておく
 }

 //中身を確認
 printf("printf test\n");
 for (i = 0; i < ele; i++) {
  fprintf(stdout, "%s\n", pp[i]);
 }

 printf("メモリ再確保\n");
 //2倍のメモリを再確保
 pp = (char**) realloc(pp, sizeof(char*) * ele * 2);
 for (i = 0; i < ele; i++) {
  //メモリを確保
  pp[i + ele] = (char*) malloc(sizeof(char) * 15);
  sprintf(pp[i + ele], "Hello - %d", i + ele); //テストのために入れておく
 }
 printf("printf test\n");
 for (i = 0; i < ele * 2; i++) {
  fprintf(stdout, "%s\n", pp[i]);
  free(pp[i]);
 }
 free(pp); //忘れないで
 return 0;
}

最後に、ポインタって配列みたいな書き方ができるよ。
*(pp+i)とpp[i]は同じです。

2012年12月23日日曜日

Hello GUI (C言語 for Linux) part 1

C言語でGUIアプリケーションを作成してみようと思う。
使うのはX Window System

概要は以下URLをみてください。
http://xjman.dsl.gr.jp/X11R6/X11/

また、コンパイラはGCC

まだ、勉強している最中で、思考をまとめるために書いているので多数ミスがある可能性が高いので指摘していただきたいです。

ソースコードの内容としては、ただ真っ暗な画面で終了するとエラーが出るものです。

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include<stdio.h>

int main(){
 Display *display; //参照→http://xjman.dsl.gr.jp/X11R6/X11/CH02.html
 char *display_name;//ハードウェアのディスプレイ名
 GC gc;//グラフィックコンテキスト 参照→http://xjman.dsl.gr.jp/X11R6/X11/CH07.html
 Window window;//参照→http://xjman.dsl.gr.jp/X11R6/X11/CH03.html
 XEvent ev;//参照→http://xjman.dsl.gr.jp/X11R6/X11/CH10.html
 int width;
 int height;
 //Display情報
 display_name=NULL;
 display = XOpenDisplay(display_name);//ハードウェアのディスプレイ名,NULLだとDISPLAY環境変数の値が使われる。
 //横と高さの大きさ
 width = DisplayWidth(display,0)/4;//大きさを取ってくる、ディスプレイサーバとディスプレイの番号。
 height = DisplayHeight(display,0)/4;//大きさは1/4
 //画面作成
 //window=XCreateWindow(display,RootWindow(display,0),0,0,width,height,1,CopyFromParent,InputOutput,DefaultVisual(display, DefaultScreen(display)),0,0);
 //めんどくさい時はこっち
 window=XCreateSimpleWindow(display,RootWindow(display,0),0,0,width,height,1,0,0);
 //タイトル
 XStoreName(display,window,"Hello GUI");
 gc=XCreateGC(display,window,0,NULL);//グラフィック操作
 //本来なら使うマスクだけをいれる
 XSelectInput(display,window,ExposureMask|ButtonPressMask|ButtonReleaseMask|KeyPressMask|ButtonMotionMask|KeyReleaseMask);
 //画面の表示
 XMapWindow(display,window);
 //終了しないためのwhile(1)
 while(1){
  XNextEvent(display,&ev);//イベント待ち
 }
  
 return 0;

}


2012年12月6日木曜日

C言語でcatっぽいもの


久しぶりにC言語やりました。
入門編をかるく触った程度だからもっと勉強しなくてはいけない反面、奥が深すぎてしんどい。。。

今回、作ったのはUNIXとかLinuxにあるcatコマンドっぽいものを作ろうかなと思いました。
Windowsのプロンプトで操作をしていた時に思わずcat fileとやった時にこれを作ろうと。
ただ未完成だし、めんどくさくなって投げてしまった。

なのになぜ公開したかというと、同学年の同じ学科の学生でC言語の授業を受けたのにかかわらず、
フラグやOR演算などの処理を理解してない人がちらほらいたので、そういう人向けにつくる問題の材料にされたらいいなーって
24行目のfile modeはコマンドライン引数が2個以上渡されたときにフラグがたちます。
cat printfile ow writefireみたいな使い方や
cat printfile e , cat printfile みたいにも使えます。
oは上書き、aは追加、cはコピー、wは手動で文字を書き込む、
eはファイルの中身を表示する時に一行ごとにEnterを押さないと表示しないようにする。

このプログラムで作れる問題は、AND演算を理解しているか、16進数から2進数に変換して考えることができるのか、
if文の基本的な使い方、コマンドライン引数を覚えているかなどを問うことができるので、初級向きだと思います。
また、とてもみにくいソースなので、コメント文を消して穴埋めをさせたりする、基本情報の午後試験の練習にもなるかもしれませんね。


#include 
#include 
//'12 - 12 - 01
//@auther Aki
//Emulate cat of unix
//this version : 0.1

int printnState(int nState);
void errCheck(int nErr,int nState);
void readFileAndPrintFile(int *pnState,int *pnErr,char *pcFname);

int main(int argc, char *argv[]){
	int nState=0x0;
	int nErr=0x0;
	if(argc==1){
		printf("open text viewer\n");
		printf("cat filename\n");
		nErr|=0x1;
	}
	if(argc>=2)
		nState|=0x2;//input file name 
	if(argc>=3)
		nState|=0x4;//option flag
	//file mode
	if(nState&0x4){
		if(strchr(argv[2],'o')!=NULL)
			nState|=0x8;//over
		if(strchr(argv[2],'a')!=NULL)
			nState|=0x10;//add
		if(strchr(argv[2],'c')!=NULL)
			nState|=0x20;//copy
		if(strchr(argv[2],'w')!=NULL)
			nState|=0x40;//write
		if(strchr(argv[2],'e')!=NULL)
			nState|=0x400;//line
		if(!((nState&0x8)||(nState&0x10)||(nState&0x20)||(nState&0x40)||(nState&0x400)))
			nErr|=0x80;
	}
	
	if((nState&0x2)&&!(nState&0x4)||(nState&0x2)&&(nState&0x400)&&nErr==0x0)
		readFileAndPrintFile(&nState,&nErr,argv[1]);
	if(((nState&0x2)&&(nState&0x40))&&nErr==0x0)
		printf("write process\n");
	if(nState&0x18&&nErr==0x0){
		if(nState&0x8)
			printf("over ");
		else if(nState&0x10)
			printf("add ");
		if(nState&0x20)
			printf("copy\n");
		else if(nState&0x40)
			printf("write\n");
	}

	errCheck(nErr,nState);
	return nErr;
}
void readFileAndPrintFile(int *pnState,int *pnErr,char *pcFname){
	char cBuf[512];
	FILE *fo;
	int enter=0;
	if((fo=fopen(pcFname,"r"))!=NULL)
			*pnState|=0x100;
		else
			*pnErr|=0x200;

	if(*pnState&0x100){
		while(fgets(cBuf,512,fo)!=NULL){
			if(*pnState&0x400){
				if(enter)
					getchar();
				else
					enter++;
			}
			printf("%s",cBuf);
		}
		fclose(fo);
	}
	return;
}
/*nState list
0x1:input size==0
0x2:input filename ok
0x4:option flag ok
0x8:over flag ok
0x10:add  flag ok
0x20:copy flag ok
0x40:write flag ok
0x80:option flag err
0x100:0x100 Can read
0x200:0x100 Can't read
0x400:0x100 Can't read
***********************/
int printnState(int nState){
	printf("--- print nState ---\nnState code 0x%X\n",nState);
	if(nState&0x1)
		printf("0x1 input size==0");
	if(nState&0x2)
		printf("0x2 input file name ok\n");
	if(nState&0x4)
		printf("0x4 option flag ok\n");
	if(nState&0x8)
		printf("0x8 over write flag ok\n");
	if(nState&0x10)
		printf("0x10 add write flag ok\n");
	if(nState&0x20)
		printf("0x20 copy flag err\n");
	if(nState&0x40)
		printf("0x40 write flag ok\n");
	if(nState&0x80)
		printf("0x80 option flag err\n");
	if(nState&0x100)
		printf("0x100 Can read\n");
	if(nState&0x200)
		printf("0x200 Can't read\n");
	if(nState&0x400)
		printf("0x400 line view\n");

	return nState;
}
//err list
//0x1:input size
//0x40:option flag err
//0x200:Can't read
void errCheck(int nErr,int nState){
	if(nErr>0){
		printf("--- err check ---\nerr code : 0x%X\n",nErr);
		printnState(nErr|nState);
	}
	return;
}

2012年11月17日土曜日

Javaで等速円運動 Demo

GUIをこれから勉強しようとしている人へ


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.Timer;

/** 球の回転(座標軸の回転) */
public class BallRoll extends JFrame {
 /* costant */
 static final int BALL_W = 100;
 static final int BALL_H = 100;
 /* field */
 private Point axis;// 軸
 private double varX;// 変動値
 private double varY;// 変動値
 private double r;// 軸からボールまでの距離
 private Timer t;// アニメーションタイマー
 private double degrees;// 角度

 /* constructor */
 public BallRoll() {
  super("Ball Roll");
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  // パソコンの画面サイズ取得
  Rectangle screen = getGraphicsConfiguration().getBounds();
  setSize(screen.width / 2, screen.width / 2);
  // windowの位置
  setLocation(screen.x + screen.width / 2 - getWidth() / 2, screen.y
    + screen.height / 2 - getHeight() / 2);
  // variable
  axis = new Point(getWidth() / 2, getHeight() / 2);
  degrees = 0;
  r = getWidth() / 2 - BALL_W - BALL_H;
  // listener
  t = new Timer(5, new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    degrees += 0.1;
    rotation(degrees);
    if (degrees >= 360)
     degrees = 0;
    repaint();
   }
  });
 }

 /* Rotation */
 public void rotation(double degrees) {
  double rad = degrees * (Math.PI / 180F);
  varX = r * Math.cos(rad) - BALL_W / 2;
  varY = r * Math.sin(rad) - BALL_H / 3;
 }

 public void paint(Graphics g) {
  super.paint(g);
  boolean xRegular = varX + BALL_W / 2 > 0;
  boolean yRegular = varY + BALL_H / 3 > 0;
  int split = 7;
  int wLength = getWidth() / split;
  int hLength = getHeight() / split;
  // 格子
  for (int i = 1; i < split; i++) {
   g.drawLine(0, hLength * i, wLength * split, hLength * i);
   g.drawLine(wLength * i, 0, wLength * i, hLength * split);
  }
  // 座標によって色を変える
  if (xRegular && yRegular)
   g.setColor(Color.RED);
  else if (xRegular && !yRegular)
   g.setColor(Color.BLUE);
  else if (!xRegular && yRegular)
   g.setColor(Color.GREEN);
  else if (!xRegular && !yRegular)
   g.setColor(Color.YELLOW);
  // 球の表示
  g.fillOval((int) (this.axis.x + varX), (int) (this.axis.y + varY),
    BALL_W, BALL_H);
  if (!t.isRunning())
   t.start();
 }

 public static void main(String[] args) {
  new BallRoll().setVisible(true);
 }
}

2012年11月10日土曜日

Javaで等速運動 Demo

初めてJAVAでGUIを組むときのサンプル

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.Timer;

public class UMotion extends JFrame {
 /* field */
 private Timer doAct;
 //Oval
 private double x_p,y_p;//coordinate
 private int o_wid=30,o_hei=30;//size
 //para
 private double velocity;
 private double time;
 //direction
 private int d=1;
 public UMotion(double s_velocity,double s_time) {
  //スーパークラスのコンストラクタ
  super("Uniform motion");
  //終了のオプション
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //Frameの大きさ
  setSize(600, 200);
  //Computerの画面の大きさ
  Rectangle screen = getGraphicsConfiguration().getBounds();
  //画面の位置
  setLocation(screen.x + screen.width / 2 - getSize().width / 2, screen.y
    + screen.height / 2 - getSize().height / 2);
  
  //10は10/1000秒間毎に実行と言う意味
  doAct=new Timer(10, new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    //端っこに行ったら向きを変える
    //switch
    if((d==1&&x_p>getWidth()-o_wid))
     d=-1;
    else if((d==-1&&x_p<0))
     d=1;
    //移動距離を足していくと移動したことになる
    x_p+=d*velocity*time;
    repaint();
   }
  });
  //coordinate
  x_p=0;
  y_p=120;
  
  this.time=s_time;
  this.velocity=s_velocity;
 }
 //表示
 public void paint(Graphics g ){
  super.paint(g); 
  g.setColor(Color.RED);
  //円,->x座標,y座標,横幅,縦幅
  g.fillOval((int)x_p, (int)y_p-80,o_wid, o_hei);
  //円,->x座標,y座標,横幅,縦幅
  g.fillOval((int)x_p, (int)y_p-40,o_wid, o_hei);

  g.setColor(Color.BLUE);
  //円,->x座標,y座標,横幅,縦幅
  g.fillOval((int)x_p, (int)y_p,o_wid, o_hei);
  //タイマーが動いているかの確認
  if(!doAct.isRunning())
   doAct.start();//タイマーを動作させる
 }
 
 public static void main(String[] args) {
  new UMotion(10,0.05).setVisible(true);//JFrameの表示
 }

}

2012年9月30日日曜日

JavaでMP3を再生


一時停止や音量調節などまだまだ実装していないが、とりあえず再生と停止だけできる。

今回はJLayerを利用させてもらった。
http://www.javazoom.net/javalayer/sources.html

プログラムを作るうえで参考にさせてもらったサイト様は
http://labs.unoh.net/2007/11/javamp3.html

修正しました
http://akis-i.blogspot.jp/2013/02/javamp320130226.html

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class AKIMPer extends Thread {
 // variable
 private Player player;
 private BufferedInputStream stream;
 private Boolean is_run;

 // constructor
 public AKIMPer() {
  setStopper();
 }
 public AKIMPer(String file) {
  setStopper();
  setFile(file);
 }

 // methods
 public void start() {
  is_run = true;
  super.start();
 }

 public void stopMusic() {
  try {
   if (player != null) {
    player.close();
   }
   if (stream != null) {
    stream.close();
   }
  } catch (IOException e) {
   System.out.println("IOException");
  } finally {
   setStopper();
  }
 }
 public void run() {
  if (stream == null || player == null || !is_run) {
   stopMusic();
  } else
   try {
    player.play();
   } catch (JavaLayerException e) {
    System.out.println("JavaLayerException");
   } finally {
    System.out.println("End");
   }
 }
 // setter & getter
 public void setFile(String file) {
  try {
   stream = new BufferedInputStream((new FileInputStream(file)));
   player = new Player(stream);
  } catch (IOException e) {
   // System.out.println("BUFFER ERR");
   System.out.println("IOException");
  } catch (JavaLayerException e) {
   // System.out.println("PLAYER ERR");
   System.out.println("JavaLayerException");
  }
 }

 public void setStopper() {
  player = null;
  stream = null;
  is_run = false;
 }

 public boolean getIs_run(){
  return is_run;
 }
}
使い方
コンストラクタにmp3のpathを入れる
start()で音楽を再生するこの時、音楽は別のメソッドで動いているので
例えば、画像のスライドショーとかも作れる。
stopMusic()で音楽再生を止める。

参考ソース
import java.util.Scanner;
public class Test {

 public static void main(String[] args) {
  AKIMPer akimper= new AKIMPer("mp3/test.mp3");
  Scanner in = new Scanner(System.in);
  int temp = 0;
  akimper.start();
  while(akimper.getIs_run()){
   System.out.print("(closing -> 1 ) >_");
   temp = in.nextInt();
   if(temp==1)
    akimper.stopMusic();
  }
 }

}

問題点:
ループさせたりするなどの2回目の再生行為でエラーが起きる。
対策方法はもう一度インスタンスを作るなどである。