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月16日日曜日

Qosmio AV Centerにてエラー

Qosmioで8000354dや8000363cのエラーが起きたときにやること。

1つ目は電源プランを高パフォーマンスに。

2つ目は、管理者権限でQosmio AV Centerを起動。

3つ目は、最新のQosmio AV Centerをインストールすること。

たぶんこれでいける

TOSHIBAさんへのリンク
http://dynabook.com/assistpc/download/hist/hist_upd_index.htm

2012年12月6日木曜日

Androidのプログラムを作っていて思った事

苦手意識を持っていても、なんとなく慣れればなんとかなると思う。

xmlとかでレイアウトとかなれなかったけどなせば成るよね。

Eclipseで作成していたのですが、Javaのプログラムをコンパイルするノリで、xmlを最前面に表示してコンパイルをしようとしたら、xmlのエラーがでて焦ったことかな。



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);
 }
}

最近、プログラミングをしていて、、、

CでもJavaでも、アルゴリズムを考えるにあたり、数学や物理の知識があることの大切さを改めて気づいた。

いままでのらりくらりと交わしてきたのだが、そろそろ勉強しなくては。。。

極限あたりからやりなおそうかねえ。

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年10月15日月曜日

チャットを作る予定なので思考メモ

チャットを作る

動作

起動
上から処理していく

自分 相手
SocketのHOSTとPORTを入れる ServerSocketを立ち上げてaccept()を使い待ち
Socketのconnect()を使い要求
->エラー出たら失敗->もう一度
->成功でaccept()を使い待ちで相手のターン
待機
待機 accept()の戻り値をSocketに入れて
そのSocketからgetInetAddress()とgetPortで
アドレスとポートを取得する
待機 新しいSocketを作りconnect()を使い要求
->エラー出たら失敗
->成功相手もメッセージ

待機
別メソッドでaccept()を使いループしてアクセス待ち
DataOutputStreamを使いメッセージを送信

メッセージが届くので別メソッドでaccept()を使いループして常にアクセス待ち
別メソッドにてconnect()で常にアクセス
別メソッドにてconnect()で常にアクセス
メッセージの送受信 メッセージの送受信

終了

汚い流だけれどこんなものかな。

理解が浅いから全然だ


ああ、ミス
設定として最初から自分も相手もアクセス待ちだ

追記('12/11/11):
TCPじゃなくてUDPの方が楽そうだった。。。


2012年10月7日日曜日

JARファイルに画像


JARファイルに画像を埋め込むときに必要なこと

まず、画像の入っているフォルダを右クリック->ビルドパス->ソースフォルダとして使用。

そのあと画像を使う場面
例えばImageIconクラスの変数で
ImageIcon icon = new ImageIcon(getClass().getClassLoader().getResource("画像.jpg"));
と画像のファイル名のみを入れる

これでエクスポートすればよい

2012年10月1日月曜日

JAVAでCacheファイルを作るために


ネットワークを使ったプログラムを作りたいと思い立った。

ダウンロードとかキャッシュファイルの作成とかどうやるんだろう?思い調べてみることに。

参考にさせてもらったサイト様URL
http://634.ayumu-baby.com/javawork_downloader.html

なるほど!
URLクラスにはopenStream()というものがあるんですね!

あとBufferedInputStreamとInputStreamのAPIを見てきました。
http://docs.oracle.com/javase/jp/6/api/java/io/InputStream.html
http://docs.oracle.com/javase/jp/6/api/java/io/BufferedInputStream.html
参考にさせてサイト様で書いてあった通りリジューム機能が付けられそう

とりあえず、作ってみた。
家のネットワークがぼろぼろでダウンロード作業中に接続が切れファイルが壊れてしまった時に、これのリジューム機能が意外と使えて便利でした。

ソース

めんどうだからあとで

2012年9月30日日曜日

lastfm-javaでProxyの設定方法

Last.fmのクライアント作りで困ったことが一つありました。

Proxyの設定によってネットワークにつながらないという事態に。

Last.fmへの接続はlastfm-javaのライブラリを使っていたので、Proxyの設定がなんだかめんどくさそうだった。

なので、ライブラリのソースを少し弄らせてもらいました。

http://code.google.com/p/lastfm-java/downloads/list?can=1&q=

ここからソースコードを引っ張ってきて、Caller.javaを開きProxyクラスの変数とsetterをstaticにして、コンパイル。

これで、ライブラリを入れ替えるとProxyの設定が簡単にできるようになりました。

staticだから一括設定にもなるしすごく便利!

Proxyはjava.netのProxyでした。
http://docs.oracle.com/javase/jp/6/api/java/net/class-use/Proxy.html

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回目の再生行為でエラーが起きる。
対策方法はもう一度インスタンスを作るなどである。

2012年9月29日土曜日

Android App 開発メモ - 001 (開発環境)

とりあえず、雑記

Android SDK
Android SDK Managerを起動して、Android 4.0 API14をインストール
今回は4.1や4.0.3はとりあえず見送ることにする。

次にeclipseを起動してHelp->Install New Softwareで
https://dl-ssl.google.com/android/eclipse/を入力して、Developer Toolを全部入れておこう。

とりあえず、インストールがおわるまで待機。

2012年9月23日日曜日

マルチスレッドのメモ

これからプログラミングをやっていく上で、マルチスレッドを学んでいかないとまずいと思いメモをしるす。

http://ash.jp/java/sync.htm
を参考に今は見ています。(ing)

Thread.sleep((int))は終了までの時間なのかえ?
深く考えずにとりあえず今はソースを見るだけにしています。。。

よくわかんないけど、Thread を継承しとけばいいのかね?。。。。

新しい勉強は楽しくなるまでが長い!

あ、Thread.sleep((int))の int はミリ秒なのかオッケー!

読み進めると何となくつかめた賀茂

ただ、スレッドの終了にnullをなぜ入れるのかね....


とりあえず、現在の理解は

同期オブジェクトの生成

子スレッドのインスタンスを生成

子スレッドの起動

親スレッドの処理

親スレッドは子スレッドが終わるのを待つ{waitSync()をコメントアウトして比べるとわかりやすいかも}

子スレッドが終わった

親スレッドの残りがあるならその処理をやる

なんか理解できたかも。
CUIはサンプルみたから理解したし、とりあえずGUIでつくるか!

Twitterでアカウントを乗っ取られている人が

Twitterでアカウントを乗っ取られている人が結構いるんだなーと思っていたら

hey someone is making up shocking posts that are about you http://~

と言うダイレクトメッセージが・・・・

ついに友人にも被害が!

とりあえず、パスワードの変更をしたみたいですが、Twitterの設定にあるアプリ連携は見直して無かったみたいです。

アプリ連携の設定を見直さないともしかしたら、アカウントが不正利用されてしまうので危険です。

詳しくは(http://www.jweb-seo.com/blog/wordpress/2012/03/29/3224)

今回はフィッシングみたいだったので、このような事が起きないようにするためには、
どのようなサイトを作ればいいか考えてました。

・IDとパスワードを入力させる画面では事前にユーザが設定した言葉を表示させる

これさえあれば、被害にあわずに済む場合も多いのではないでしょうか?

2012年9月8日土曜日

単語帳の統一規格 企画#0001

これから英単語帳のようなアプリが色々でてくると思うので、統一規格を作った方がいいと思った。
また、インターネットで普及するために簡易的で誰でもその規格に沿って単語帳を作れるようにする。
以上よりタグで囲めばいいと思いましたので企画しました。

例:
<word>
 <spell>単語</spell>
 <pronunciation>発音記号</pronunciation>
 <syllable>音節</syllable>
 <mean>意味</mean>
 <phrase>熟語</phrase>
 <example>例文</example>
</word>
解説:
単語データを<word></word>で囲むこれは絶対ないといけない
単語のスペルを<spell></spell>で囲むこれも絶対
発音記号を<pronunciation></pronunciation>で囲むこれはなくてもいい
音節を<syllable></syllable>で囲むこれはなくてもいい
単語の意味を<mean></mean>で囲むこれも絶対
単語を使った熟語を<phrase><phrase>で囲むこれはなくてもいい
例文を<example></example>で囲むこれはなくてもいい

<word></word>内のデータは<spell></spell>以外は何個タグを使っても構わないとする。
また、していしたタグ以外は使わないとする。
※<example color=#909090.みたいな指定したモノが含まれる時にはもちろん利用する。

最後に
pronunciationは長いので
prに略そうかなと思うなので最終的に
<spell>→<sp>
<pronunciation>→<pr>
<syllable>→<sy>
<mean>→<me>
<phrase>→<ph>
<example>→<ex>
<word>はそのままにしようかなと思う。
とういうか決定。

またこの規格の利点はHTMLに書き込んで単語帳を配布できるので手軽なこと。
みんなで使っていればデータの相互利用が簡易化される。


2012年8月29日水曜日

Windows7でburp suite

なぜだか僕の環境(Windows7 Enterprise SP1)ではlocalhostでしか使えず、localなネットワークでは使えないという事故が起きた。

別のマシン(Windows Vista SP2?)ではローカルネットワークでも使えたのでOSか設定の問題かな・・・

一応、localhostでは使えたので他の方法を試してみた。

AN HTTPDを使い外部プロキシの所にburpのIP AddressとPortNumberを入れた。

これだったらローカルネットワークでAN HTTPDを通してburpが使えた。

2012年8月21日火曜日

JAVAでWebAPIの勉強をしてみるかも


最近いろいろな所で使われていそうなWebAPI。

これの勉強をしたらもっといろいろなものが作れそうな気がする。

とりあえず参考にしたいサイト様をメモ

基本的なことがわかる
http://d.hatena.ne.jp/celitan/20101219/1292750813
なんだか深そう
http://www.javainthebox.net/publication/200403JP35/google.html
サンプルが見やすい
http://pflow.csis.u-tokyo.ac.jp/sample.html
なんか教本みたいでわかりやすい
http://www.slideshare.net/yokmama/androidweb
add
http://www.atmarkit.co.jp/fjava/javatips/069java006.html

2012年8月5日日曜日

JAVAを使ってLast.fmのクライアント作り


なんだか色々な事に手を出しているけど、自分が何をやりたかったかを思い出すための備忘録

とりあえず、検索をしてでてきたこちらのサイト様のExampleを使ってみる
http://www.u-mass.de/lastfm

Download the newest version hereからlastfm-java-0.1.2.jarを保存して、eclipseのLast.fmのクライアントを作るプロジェクトにパスを通す。

あとは、test.javaなどを作りExampleのmethodを使い、週間トップを取得してみよう

他にも参考にさせてもらうサイト様
http://www.lastfm.jp/api/
http://code.google.com/p/lastfm-java/wiki/GettingStarted

追記:
自分のapi keyはhttp://www.lastfm.jp/api/accountから

2012年8月4日土曜日

JAVAでプロキシサーバを作りたい

JAVAじゃなくてもいいんだけど、検索したらわかりやすそうなのがあったからつくろうかね

参考にさせていただくサイト様は
http://d.hatena.ne.jp/onozaty/20071001/p1

Jettyというものを使うんだなとわかったところでダウンロード
http://jetty.codehaus.org/jetty/
のDownloads -> Codehaus downloads. -> jetty-6.1.20 -> jetty-6.1.20.zip
を保存 -> 解凍するとできる jetty-6.1.20 -> libにある
jetty-6.1.20.jar
jetty-util-6.1.20.jar
servlet-api-2.5-20081211.jar
をeclipseに外部JARの追加でついかする

http://d.hatena.ne.jp/onozaty/20071001/p1のソースをそのまま今回は流用させてもらい動作確認

これで、環境はできたかねえ。

JAVAよりもC#

JAVAよりもC#の方が将来性があるのかな?

どっちがいいとかまだわからないけど、C#もできるようにしときたいなと思い勉強する。

とりあえず、GUIを作れるようにするために、
http://ufcpp.net/study/csharp/lib_forms.html
こちらのサイト様を参考にしていこうと思う。

とりあえず、初めはお決まりのこれを

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StudyCS
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.Write("Hello World !");
        }
    }
}

2012年7月28日土曜日

実行可能JARファイルの作り方

eclipseでも簡単にできますが、手動でやる方法

まずディレクトリMETA-INFを作成し、その中にMANIFEST.MFを作成します
MANIFEST.MFの中身は
Manifest-Version: 1.0
Class-Path: .
Main-Class: メインクラスのクラス(例:main.class)

META-INFとメインクラスやその他をコンパイルしたものをzipに圧縮します。

拡張子をzipからjarに変えればそのまま使用できます。

2012年7月27日金曜日

HTMLの取得に奮闘 - 1

世の中には、ネットで小説などを公開しているところがありまして

その中の小説家になろうというWebサイトではかなりの数の小説が公開をしています。

しかし、ブラウザで閲覧するには少しつらいというデメリットがありそれをどうにかして

ローカルに保存なりして専用ビュアーなりで読もうと思いました。

言語:Java

参考にさせていただいた、サイト様一覧
WebLab.ota様
核となるJavaでHTMLのソースを取得するのに参考にさせていただきました。
ほとんど、コピーしてしまったのですが、一部変更させていただきました。

変更点、Getter5クラスのフィールドにある

private String charset = "Shift_JIS";

private String charset = "UTF-8";
文字コードを変更しないと文字化けを起こしてしまいます。
また少し追加もさせていただきました。
Getter5クラスのフィールドに文章の始まりフラグと、この手の小説にありがちな過剰な改行避けです。
private int textFlag = 0;// 文章フラグ
private int enterCount = 0;// 改行をカウントして2回目の改行はパス
また、Getter5クラスのtryの中にある
while ((line = br.readLine()) != null) {
                htmlArea.append(line + "\n");
            }

while ((line = br.readLine()) != null) {
    // 改行文字だけなら\nに変換
    //brをbrに変えてくださいhtmlの都合上こう書きました
    if ("<br />".equalsIgnoreCase(line)) {
     line = "\n";
     enterCount++;
    }
    else{
     enterCount=0;//改行カウントを0
    }
    //改行が多すぎるのでenterCount導入
    if (enterCount < 2) {
     // 文章が始まった
     if (line.contains("<div class=\"novel_subtitle\">"))
     textFlag = 1;
     // 文末
     if (line.contains("<!--novel_color-->"))
      textFlag = 0;
     line.trim();
     //末尾の<br />を取り除く
     //brをbrに変えてくださいhtmlの都合上こう書きました
     line=line.replaceAll("<br />","\n");
     // 文章を追加
     if (textFlag == 1)
      htmlArea.append(line);
     
    }
上記のはbr /を\nに変えて、改行カウントをインクリメントします。
そうしたら、改行のみの文字列が2回以上なければ文字列を追加します。
追加する条件としてtextFlagが1の時に追加します。

textFlagを1にするには"<div class=\"novel_subtitle\">を含んだ文字列を読み込みます
またフラグを下げるには<!--novel_color-->を含んだ文字列を読み込みます
また、なんこかいらないものがあるので

string.replaceAll()で置換して消してください。
その他に参考にさせていただいたサイト様url
http://www29.atwiki.jp/suffix/pages/149.html
http://sasuke.main.jp/javatikan.html

記事の内容が不適切、または消去、訂正を希望されましたら、コメント欄への書き込みをお願いいたします。

2012年7月16日月曜日

ロシアのクラッカー恐ろしあ


つい先日に、AppStoreをエミュレーションしたサーバをたててアプリ内課金をしないでも

課金商品を入手できるという報告がありましたね。

ソース:http://9to5mac.com/2012/07/13/apples-in-app-purchasing-process-circumvented-by-russian-hacker/

この事件はクラッカーたちがiPhoneユーザが増加しているので、MacやiPhoneなどの製品へ狙いを定めて来ていると感じられます。

いままでは、Macは特定のユーザにしか使われていなかったので、Windowsに比べてウイルスなどが少なかったのですが、

iPhoneが爆発的に普及して、これからMacを使用する人が増えてくると予想され、クラッカーが標的にし出したのでしょう。

今まではノーガード戦法だった人でもセキュリティに関心を示した方がよいでしょう。

また、iPhoneなどのスマートフォンでもセキュリティ意識を高めた方がよいでしょう。

推奨するわけでありませんが、脱獄やroot化などをして、パスワードを書き換えた方が安全な場合もあります。

コードのハイライト

を付けてみたのでそのテスト



始めはコードの書き方

<!-- code -->

Javaの表示テスト
public class Practice {
        public static void main(String[] args) {
                System.out.print("Test!!!!");
        }
 
}

利用したサイト様

まだなにも

書くことを決めていないが、何かプログラミングをするさいに調べたことをメモしていこうかと思います。