投稿したカテゴリーによっては、他のサイトに流したくないものがある。
特に、プログラム関連のメモ等は、ほとんど自分の為のメモなので、流さないほうがベターであると考えている。
ブログをカテゴリにわけて運用することも考えたがバックアップ等を考えると運用が複雑になってしまうので、(他にいいやり方があったかもしれないがGAEの学習をかねて)atom、rssフィルタープログラムを作成してみることにした。
処理概要は、クライアントからアクセスされたプログラムは、登録してあるURLからrssまたはatomを取得して、パースを行い、指定されたカテゴリ部分を抜き出しクライアント側に返すという処理。パース処理部分は、以前ある開発の仕事で、そのシステムのテストの為に、自前で作成したXMLパーサ(未完成)を使用することにした。あらゆるXMLフォーマットに対応していなかったのでXMLパーサをそれなりに対応させる必要があった。とりあえず問題ないレベルまで作成して、適応させてみた。他のサイトに登録してみたところなかなかおもしろい感じだ。
2010年3月24日水曜日
2010年3月23日火曜日
先週、ついに新VAIO Zがやってきた。
先週、ついに新VAIO Zがやってきた。
■スペック(適当に記述)
CPUはintel core i7
ビデオカードは、GeForce GT33M メモリ1G
メモリは、8G
ワイヤレスLANも表示上は130Mbpsでている。今までの3倍はある。
■よい点
・処理スピードが、今までのノートよりも速い。
・音が静かである。
・よりモバイルしやすくなった。
■悪い点
現時点の気に入らないところとしては、
赤とオレンジの発色に違和感がある。
(いろいろと調整 してみたが、好みの発色にするのは無理っぽい。)
■総評
いろいろと使える環境にするのに大体2日程度かかった。
(まだ50%程度だが、そこは徐々にということで)
た しか
お届け可能日 2010年04月中旬
だったはずなのだが・・・・・・
まあ、早く きてくれたことは、うれしい
ボディカラーは、確か黒を注文したはずなのだが
シルバーちゃんがきてくれました。
まあ、そ んなに本体の色に、こだわりをもっていたわけではないのでよしとしよう。
処理スピードは、速いのでかなり快適。
全体的にみれば、画面はキレイなのだが、
個人的に、(オレンジと赤の)発色が気に入らない。
発色は、前の PCのほうが好きだ。
仕事でも遊びでも長時間使用するので、この状態だと結構目に負担がきている。
現在、輝度を抑えて使用中ではある。
■スペック(適当に記述)
CPUはintel core i7
ビデオカードは、GeForce GT33M メモリ1G
メモリは、8G
ワイヤレスLANも表示上は130Mbpsでている。今までの3倍はある。
■よい点
・処理スピードが、今までのノートよりも速い。
・音が静かである。
・よりモバイルしやすくなった。
■悪い点
現時点の気に入らないところとしては、
赤とオレンジの発色に違和感がある。
(いろいろと調整 してみたが、好みの発色にするのは無理っぽい。)
■総評
いろいろと使える環境にするのに大体2日程度かかった。
(まだ50%程度だが、そこは徐々にということで)
た しか
お届け可能日 2010年04月中旬
だったはずなのだが・・・・・・
まあ、早く きてくれたことは、うれしい
ボディカラーは、確か黒を注文したはずなのだが
シルバーちゃんがきてくれました。
まあ、そ んなに本体の色に、こだわりをもっていたわけではないのでよしとしよう。
処理スピードは、速いのでかなり快適。
全体的にみれば、画面はキレイなのだが、
個人的に、(オレンジと赤の)発色が気に入らない。
発色は、前の PCのほうが好きだ。
仕事でも遊びでも長時間使用するので、この状態だと結構目に負担がきている。
現在、輝度を抑えて使用中ではある。
2010年3月13日土曜日
浮動小数点数 のビット構造が気になったので
AndroidのOpenGL ESプログラミングしていて
ふとJavaの浮動小数点数 (Floating point numbers)のビット構造が気になったので、
脱線して適当にテストプログラムを作成してみた。
【ソース】
public class FloatingPoint3 {
float val = 0;
String bits; //
String sign; // 符号
String exponent; // 指数
String mantissa; // 仮数
private static int floatsize = 32; // floatのビットサイズ
public String getBitStr() {
return bits;
}
public float getVal() {
return val;
}
public void setVal(float val) {
this.val = val;
int bitval = Float.floatToRawIntBits(this.val);
// System.out.println("i >>>" + i);
StringBuffer sbf = new StringBuffer();
// String str = Integer.toBinaryString(bitval);
sbf.append(Integer.toBinaryString(bitval));
int addlen = floatsize - sbf.length();
for (int i = 0; i < addlen; i++) {
sbf.insert(0, '0');
}
bits = sbf.toString();
}
public String getSign() {
return bits.substring(0,1);
}
public String getExponent() {
return bits.substring(1,9);
}
public String getMantissa() {
return bits.substring(9,32);
}
// 指数の値取得
public int getExponentVal() {
int exponent_maxsize = 8;
String src = getExponent();
int r = 0;
for(int i=0;i<src.length();i++){
if(src.charAt(i) == '1'){
r += 0x01 << ((exponent_maxsize-1) - i);
}
}
r = r - 127; // 指数部 は、0111 1111=127 で 0乗なので
return r;
}
}
package com.naozary.test.FloatingPoint;
import java.util.Formatter;
public class FloatingPoint4 {
float val = 0;
int bits; //
public int getBit() {
return bits;
}
public float getVal() {
return val;
}
public void setVal(float val) {
this.val = val;
bits = Float.floatToRawIntBits(this.val);
}
// 符号
public int getSign() {
return (bits >> 31) & 0x01;
}
// 指数
public int getExponent() {
return (bits >> 23) & 0xff;
}
// 仮数
public int getMantissa() {
return bits & 0x7fffff;
}
// 指数の値取得
public int getExponentVal() {
return getExponent() - 127; // 指数部 は、0111 1111=127 で 0乗なので
}
public String toString() {
StringBuffer sbf = new StringBuffer();
sbf.append(getFormatStr("%f = 0x%08X \n",val,bits));
sbf.append(getFormatStr("符号 : %d \n",getSign()));
sbf.append(getFormatStr("指数 : 0x%02X (=%d) \n",getExponent(),getExponentVal()));
sbf.append(getFormatStr("仮数 : 0x%06X \n",getMantissa()));
return sbf.toString();
}
// 固定小数点数(上位2バイト:整数部分 下位2バイト:少数部分)
public int getFixedPointNumber() {
int n = 0;
n = 0x800000 | getMantissa(); // ヒドンビットを付加
int e = 7; // 指数が0でも左に7シフトさせなければならない
e = e - getExponentVal();
n = n >> e; // 少数点位置を合わせる
n = getSign() == 1 ? -n : n; // 符号を考慮
return n;
}
public String getFormatStr(String arg0,Object... args) {
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
formatter.format(arg0,args);
return formatter.out().toString();
}
}
package com.naozary.test.FloatingPoint;
・
・
省略
・
・
public class TestFloat extends JApplet implements ActionListener {
・
・
省略
・
・
public void case001() {
printf("********** %s() ********** \n",Thread.currentThread().getStackTrace()[1].getMethodName());
FloatingPoint3 fp = new FloatingPoint3();
fp.setVal(10.75F);
disp(fp);
fp.setVal(-10.75F);
disp(fp);
fp.setVal(0.33333F);
disp(fp);
fp.setVal(0.66666F);
disp(fp);
fp.setVal(0.0F);
disp(fp);
fp.setVal(1F);
disp(fp);
fp.setVal(2F);
disp(fp);
fp.setVal(3F);
disp(fp);
fp.setVal(4F);
disp(fp);
fp.setVal(5.5F);
disp(fp);
fp.setVal(0.55F);
disp(fp);
}
public void case002() {
printf("********** %s() ********** \n",Thread.currentThread().getStackTrace()[1].getMethodName());
FloatingPoint4 fp = new FloatingPoint4();
fp.setVal(10.75F);
printf(fp.toString());
printf("\n");
fp.setVal(-10.75F);
printf(fp.toString());
printf("\n");
fp.setVal(0.33333F);
printf(fp.toString());
printf("\n");
fp.setVal(0.66666F);
printf(fp.toString());
printf("\n");
fp.setVal(0.0F);
printf(fp.toString());
printf("\n");
fp.setVal(1F);
printf(fp.toString());
printf("\n");
fp.setVal(2F);
printf(fp.toString());
printf("\n");
fp.setVal(5.5F);
printf(fp.toString());
printf("\n");
fp.setVal(0.55F);
printf(fp.toString());
printf("\n");
}
public void case003() {
printf("********** %s() ********** \n",Thread.currentThread().getStackTrace()[1].getMethodName());
FloatingPoint4 fp = new FloatingPoint4();
fp.setVal(1F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
// printf("固定少数点数:0x%08X \n",-fp.getFixedPointNumber());
printf("\n");
fp.setVal(-1F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(5.5F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(-5.5F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(0.33333F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(0.66666666F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
}
public void disp(FloatingPoint3 fp) {
printf("%f = %s \n",fp.getVal(),fp.getBitStr());
printf("符号 : %s \n", fp.getSign());
printf("指数 : %s (=%d)\n", fp.getExponent(),fp.getExponentVal());
printf("仮数 : %s \n", fp.getMantissa());
// printf("fp.getExponentVal() >>>%d \n", fp.getExponentVal());
printf("\n");
}
public static void main(String[] args) {
TestFloat t01 = new TestFloat();
t01.case001();
t01.case002();
t01.case003();
}
}
【実行結果】
ふとJavaの浮動小数点数 (Floating point numbers)のビット構造が気になったので、
脱線して適当にテストプログラムを作成してみた。
【ソース】
public class FloatingPoint3 {
float val = 0;
String bits; //
String sign; // 符号
String exponent; // 指数
String mantissa; // 仮数
private static int floatsize = 32; // floatのビットサイズ
public String getBitStr() {
return bits;
}
public float getVal() {
return val;
}
public void setVal(float val) {
this.val = val;
int bitval = Float.floatToRawIntBits(this.val);
// System.out.println("i >>>" + i);
StringBuffer sbf = new StringBuffer();
// String str = Integer.toBinaryString(bitval);
sbf.append(Integer.toBinaryString(bitval));
int addlen = floatsize - sbf.length();
for (int i = 0; i < addlen; i++) {
sbf.insert(0, '0');
}
bits = sbf.toString();
}
public String getSign() {
return bits.substring(0,1);
}
public String getExponent() {
return bits.substring(1,9);
}
public String getMantissa() {
return bits.substring(9,32);
}
// 指数の値取得
public int getExponentVal() {
int exponent_maxsize = 8;
String src = getExponent();
int r = 0;
for(int i=0;i<src.length();i++){
if(src.charAt(i) == '1'){
r += 0x01 << ((exponent_maxsize-1) - i);
}
}
r = r - 127; // 指数部 は、0111 1111=127 で 0乗なので
return r;
}
}
package com.naozary.test.FloatingPoint;
import java.util.Formatter;
public class FloatingPoint4 {
float val = 0;
int bits; //
public int getBit() {
return bits;
}
public float getVal() {
return val;
}
public void setVal(float val) {
this.val = val;
bits = Float.floatToRawIntBits(this.val);
}
// 符号
public int getSign() {
return (bits >> 31) & 0x01;
}
// 指数
public int getExponent() {
return (bits >> 23) & 0xff;
}
// 仮数
public int getMantissa() {
return bits & 0x7fffff;
}
// 指数の値取得
public int getExponentVal() {
return getExponent() - 127; // 指数部 は、0111 1111=127 で 0乗なので
}
public String toString() {
StringBuffer sbf = new StringBuffer();
sbf.append(getFormatStr("%f = 0x%08X \n",val,bits));
sbf.append(getFormatStr("符号 : %d \n",getSign()));
sbf.append(getFormatStr("指数 : 0x%02X (=%d) \n",getExponent(),getExponentVal()));
sbf.append(getFormatStr("仮数 : 0x%06X \n",getMantissa()));
return sbf.toString();
}
// 固定小数点数(上位2バイト:整数部分 下位2バイト:少数部分)
public int getFixedPointNumber() {
int n = 0;
n = 0x800000 | getMantissa(); // ヒドンビットを付加
int e = 7; // 指数が0でも左に7シフトさせなければならない
e = e - getExponentVal();
n = n >> e; // 少数点位置を合わせる
n = getSign() == 1 ? -n : n; // 符号を考慮
return n;
}
public String getFormatStr(String arg0,Object... args) {
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
formatter.format(arg0,args);
return formatter.out().toString();
}
}
package com.naozary.test.FloatingPoint;
・
・
省略
・
・
public class TestFloat extends JApplet implements ActionListener {
・
・
省略
・
・
public void case001() {
printf("********** %s() ********** \n",Thread.currentThread().getStackTrace()[1].getMethodName());
FloatingPoint3 fp = new FloatingPoint3();
fp.setVal(10.75F);
disp(fp);
fp.setVal(-10.75F);
disp(fp);
fp.setVal(0.33333F);
disp(fp);
fp.setVal(0.66666F);
disp(fp);
fp.setVal(0.0F);
disp(fp);
fp.setVal(1F);
disp(fp);
fp.setVal(2F);
disp(fp);
fp.setVal(3F);
disp(fp);
fp.setVal(4F);
disp(fp);
fp.setVal(5.5F);
disp(fp);
fp.setVal(0.55F);
disp(fp);
}
public void case002() {
printf("********** %s() ********** \n",Thread.currentThread().getStackTrace()[1].getMethodName());
FloatingPoint4 fp = new FloatingPoint4();
fp.setVal(10.75F);
printf(fp.toString());
printf("\n");
fp.setVal(-10.75F);
printf(fp.toString());
printf("\n");
fp.setVal(0.33333F);
printf(fp.toString());
printf("\n");
fp.setVal(0.66666F);
printf(fp.toString());
printf("\n");
fp.setVal(0.0F);
printf(fp.toString());
printf("\n");
fp.setVal(1F);
printf(fp.toString());
printf("\n");
fp.setVal(2F);
printf(fp.toString());
printf("\n");
fp.setVal(5.5F);
printf(fp.toString());
printf("\n");
fp.setVal(0.55F);
printf(fp.toString());
printf("\n");
}
public void case003() {
printf("********** %s() ********** \n",Thread.currentThread().getStackTrace()[1].getMethodName());
FloatingPoint4 fp = new FloatingPoint4();
fp.setVal(1F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
// printf("固定少数点数:0x%08X \n",-fp.getFixedPointNumber());
printf("\n");
fp.setVal(-1F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(5.5F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(-5.5F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(0.33333F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
fp.setVal(0.66666666F);
printf(fp.toString());
printf("固定少数点数:0x%08X \n",fp.getFixedPointNumber());
printf("\n");
}
public void disp(FloatingPoint3 fp) {
printf("%f = %s \n",fp.getVal(),fp.getBitStr());
printf("符号 : %s \n", fp.getSign());
printf("指数 : %s (=%d)\n", fp.getExponent(),fp.getExponentVal());
printf("仮数 : %s \n", fp.getMantissa());
// printf("fp.getExponentVal() >>>%d \n", fp.getExponentVal());
printf("\n");
}
public static void main(String[] args) {
TestFloat t01 = new TestFloat();
t01.case001();
t01.case002();
t01.case003();
}
}
【実行結果】
2010年3月12日金曜日
2010年3月11日木曜日
Androidプログラミングメモ
Androidプログラミングメモ(その都度、かなり適当に記述)
(1)コンポーネント
Androidアプリケーションは、複数の「コンポーネント」から構成されている。
コンポーネントには、
アクティビティ
サービス
ブロードキャストレシーバー
コンテンツプロバイダ
の4種類がある。
■それぞれの概要
・アクティビティ
ユーザーインターフェイスを持った実行単位。AndroidManifest.xmlに記録されている。
・サービス
ユーザーインターフェイスを持たない。バッググラウンド処理を行うコンポーネント。
・ブロードキャストレシーバー
ブロードキャストを受信して、処理を行うコンポーネント。ユーザーインターフェイスを持たないが、アクティビティを起動させることは可能。
・コンテンツプロバイダ
データを、他のアプリケーションからも使用できるようするコンポーネント。
(2)インテント
とりあえず省略
(3)アクティビティのライフサイクル
アクティビティの状態には
実行中
一時停止中
停止中
がある。
■状態の遷移に関連するメソッド
onCreate()
onStart()
onRestart()
onResume()
onPause()
onStop()
onDestroy()
Javaアプレットに結構近いと感じている -Naozary 10/03/10 16:18
■ライフサイクルのパターン
・全体のライフタイム
onCreate() ⇒ 全体のライフタイム ⇒ onDestroy()
・ビジブルなライフタイム
onStart() ⇒ ビジブルなライフタイム ⇒ onStop()
・フォアグラウンドのライフタイム
onResume() ⇒ フォアグラウンドのライフタイム ⇒ onPause()
とりあえずAndroidで3Dアプリが作成してみたいので
OpenGlEsで検索してみたら・・・・・
おもしろそうな動画をみつけた。
Android でリアルタイムゲームの開発方法 : Google Developer Day 2009 Japan
そのうち本業でも開発するようになるかもしれないのでとりあえずメモすることにした。
スレッドは3つ
・メインスレッド - AndroidのUIスレッド
・ゲームスレッド
・レンダリングスレッド
なぜこのようなスレッドにわけたかというと
もし単一のスレッドであれば、何らかの理由(重い処理etc)でレンダリング部分で、
とまってしまうと全ての処理が進まないが
分けた場合、レンダリングスレッドで止まってもゲームスレッドはそのまま処理をつづけられるということらしい。
うん、理解できる。androidに限らずゲーム開発の書籍には、そのようなことを考慮するようなことが記述されている。
今日はここまで -Naozary 10/03/11 21:34
(1)コンポーネント
Androidアプリケーションは、複数の「コンポーネント」から構成されている。
コンポーネントには、
アクティビティ
サービス
ブロードキャストレシーバー
コンテンツプロバイダ
の4種類がある。
■それぞれの概要
・アクティビティ
ユーザーインターフェイスを持った実行単位。AndroidManifest.xmlに記録されている。
・サービス
ユーザーインターフェイスを持たない。バッググラウンド処理を行うコンポーネント。
・ブロードキャストレシーバー
ブロードキャストを受信して、処理を行うコンポーネント。ユーザーインターフェイスを持たないが、アクティビティを起動させることは可能。
・コンテンツプロバイダ
データを、他のアプリケーションからも使用できるようするコンポーネント。
(2)インテント
とりあえず省略
(3)アクティビティのライフサイクル
アクティビティの状態には
実行中
一時停止中
停止中
がある。
■状態の遷移に関連するメソッド
onCreate()
onStart()
onRestart()
onResume()
onPause()
onStop()
onDestroy()
Javaアプレットに結構近いと感じている -Naozary 10/03/10 16:18
■ライフサイクルのパターン
・全体のライフタイム
onCreate() ⇒ 全体のライフタイム ⇒ onDestroy()
・ビジブルなライフタイム
onStart() ⇒ ビジブルなライフタイム ⇒ onStop()
・フォアグラウンドのライフタイム
onResume() ⇒ フォアグラウンドのライフタイム ⇒ onPause()
とりあえずAndroidで3Dアプリが作成してみたいので
OpenGlEsで検索してみたら・・・・・
おもしろそうな動画をみつけた。
Android でリアルタイムゲームの開発方法 : Google Developer Day 2009 Japan
そのうち本業でも開発するようになるかもしれないのでとりあえずメモすることにした。
スレッドは3つ
・メインスレッド - AndroidのUIスレッド
・ゲームスレッド
・レンダリングスレッド
なぜこのようなスレッドにわけたかというと
もし単一のスレッドであれば、何らかの理由(重い処理etc)でレンダリング部分で、
とまってしまうと全ての処理が進まないが
分けた場合、レンダリングスレッドで止まってもゲームスレッドはそのまま処理をつづけられるということらしい。
うん、理解できる。androidに限らずゲーム開発の書籍には、そのようなことを考慮するようなことが記述されている。
今日はここまで -Naozary 10/03/11 21:34
2010年3月7日日曜日
Googleドキュメントで数式入りのドキュメントが作成できるのでようなので試してみた。
以前OpenOfficeで作成した数式入りのドキュメントを
ブログで公開してみようかと考え
HTML変換してみたが、かなり表示がおかしい。
何とか数式、図をグループ化して修正してみたところ
なんとかHTML化でおよそ正常に表示されるように
なったがかなり面倒な作業であった。
また、数式や図の部分が画像変換されてしまうので
外出先から暇なときに少し修正とかはできない。
そこで、Googleドキュメントで数式入りのドキュメントが
作成できるのでようなので試してみた。
数式入りのドキュメントを作成しブログに公開した時の個人的見解としては
■良い点
・Web上に手直しすることなく簡単に公開できる。
・ネット上にあげたドキュメントを外出先からでも修正できる。
・一度Googleドキュメントで作成すれば、ダウンロード時に他のファイル形式に変換できる。
■悪い点
・ブラウザ内で作業エーリアが狭い為、少々作業効率が悪い。特にポップアップの一部が
画面外に表示されているのにはイライラさせられた。(広くできないのだろうか?)
・一度に長い数式が作成できないようだ。(正直これが一番困る)
・図の位置が自由に指定できない。
(長い数式が無理なので、細切れにして並べてみたが見栄えが良くない)
・無料の場合の容量制限が少し厳しい気がする。1Gもあれば十分かもしれん
・ブログ公開したドキュメントが時にfirefoxだと問題ないのだが、
なぜかIE7、スマートフォンであると数式が正しく表示されない。
(iframeで公開先をリンクしてやればIE7、スマートフォンでも正しく表示される。)
・TEXに慣れていない人(自分のこと)には、数式作成が難しいし、思考が中断されてしまう。
■総評
ドキュメント作成自体の作業効率は、良くないが
WEB公開が前提のドキュメント作成を考えると
個人が使う場合は、非常に良いように思える。
今後、少しばかり実験的に使用していきたい。
ブログで公開してみようかと考え
HTML変換してみたが、かなり表示がおかしい。
何とか数式、図をグループ化して修正してみたところ
なんとかHTML化でおよそ正常に表示されるように
なったがかなり面倒な作業であった。
また、数式や図の部分が画像変換されてしまうので
外出先から暇なときに少し修正とかはできない。
そこで、Googleドキュメントで数式入りのドキュメントが
作成できるのでようなので試してみた。
数式入りのドキュメントを作成しブログに公開した時の個人的見解としては
■良い点
・Web上に手直しすることなく簡単に公開できる。
・ネット上にあげたドキュメントを外出先からでも修正できる。
・一度Googleドキュメントで作成すれば、ダウンロード時に他のファイル形式に変換できる。
■悪い点
・ブラウザ内で作業エーリアが狭い為、少々作業効率が悪い。特にポップアップの一部が
画面外に表示されているのにはイライラさせられた。(広くできないのだろうか?)
・一度に長い数式が作成できないようだ。(正直これが一番困る)
・図の位置が自由に指定できない。
(長い数式が無理なので、細切れにして並べてみたが見栄えが良くない)
・
・ブログ公開したドキュメントが時にfirefoxだと問題ないのだが、
なぜかIE7、スマートフォンであると数式が正しく表示されない。
(iframeで公開先をリンクしてやればIE7、スマートフォンでも正しく表示される。)
・TEXに慣れていない人(自分のこと)には、数式作成が難しいし、思考が中断されてしまう。
■総評
ドキュメント作成自体の作業効率は、良くないが
WEB公開が前提のドキュメント作成を考えると
個人が使う場合は、非常に良いように思える。
今後、少しばかり実験的に使用していきたい。
2010年3月5日金曜日
GAE上での開発メモ
いちおうファイルアップロード管理システムができたので
今後の為にここでいくつかメモっておこうかと思う。
1.GAEjからデータストアにアクセスする場合、次の2つ方式がある。
・JDO(Java Data Objects)
・JPA(Java Presistence API)
今回は、JDO(Java Data Objects)の方式で作成してみた。
■サーバー側プログラム
(1)データクラスを定義するクラス
[fileMaster.java]
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class fileMaster {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String caption;
@Persistent
private String name;
@Persistent
private String deftag;
@Persistent
private Date date;
@Persistent
private String filename;
@Persistent
private String contentType;
@Persistent
private Blob binData;
・
・
省略(コンストラクター、セッターメソッド、ゲッターメソッドなど)
・
・
}
【説明】
・JDOで保存されたオブジェクトは、GAEデータストア内のエンティティになる。
データストアでのJavaクラスの永続化と参照等にJDOを使用できるようにするには、
クラスに@PersistenceCapableを付加する必要がある。
identityType = IdentityType.APPLICATIONは、主キー(PrimaryKey)の定義を
アプリケーション側で行うという宣言で、GAEでは必ずこの宣言にする必要がある。
detachable="true"はエンティティを永続化後、transientな状態に戻ってしまうのを防ぐ。
・永続化対象プロパティ定義
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String caption;
@Persistent
private String name;
@Persistent
private String deftag;
@Persistent
private Date date;
@Persistent
private String filename;
@Persistent
private String contentType;
@Persistent
private Blob binData;
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)は、システムで生成されたKeyを
使用するための記述
(2)永続化処理を実行するクラスファイル
[PMF.java]
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() {}
public static PersistenceManagerFactory get() {
return pmfInstance;
}
}
(3)永続化処理の基本パターン
// 永続化マネージャのインスタンス生成
PersistenceManager pm = PMF.get().getPersistenceManager();
// データクラスのインスタンス生成と値設定
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,filename, contentType, b);
try {
//永続化の実行
pm.makePersistent(fmas);
} finally {
//永続化マネージャのクローズ
pm.close();
}
(4)永続化処理の基本パターン(サーブレットの一部)
boolean adddata = false;
String registerno = futil.getParameter("registerno");
Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(),registerno);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
fileMaster echeck = pm.getObjectById(fileMaster.class, key); // キーでオブジェクトを取得
} catch (JDOObjectNotFoundException e) {
adddata = true;
}
if (uniq) {
// データ登録を行う
String caption = futil.getParameter("caption");
String name = futil.getParameter("name");
String filename = futil.getParameter("filename");
String contentType = futil.getParameter("contentType");
String deftag = futil.getParameter("deftag");
Date date = new Date();
byte[] b = futil.getFileData();
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,
filename, contentType,
auth.getAdmin_Email(),
"",
true, // User_r
true, // User_w
true, // User_x
false, // Group_r
false, // Group_w
false, // Group_x
false, // Other_r
false, // Other_w
false, // Other_x
b);
try {
pm.makePersistent(fmas);
// 登録成功処理記述
} catch (Exception e) {
// 登録失敗処理記述
} finally {
pm.close();
}
}
(5)永続化処理の基本パターン-削除(サーブレットの一部)
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.setCharacterEncoding("utf-8");
// ユーザチェック
・
・
省略
・
・
String registerno = req.getParameter("registerno");
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(), registerno);
fileMaster fmas = pm.getObjectById(fileMaster.class, key);
pm.deletePersistent(fmas);
resp.getWriter().println("削除成功 登録番号="+registerno);
}catch(JDOObjectNotFoundException e){
resp.getWriter().println("削除データなし エラー:"+e);
}catch (Exception e){
resp.getWriter().println("削除不成功 エラー:"+e);
} finally {
pm.close();
}
}
(6)トランザクション処理(いまのところどれくらいつかえるのか未検証)
・
・ 省略
・
Transaction tx = pm.currentTransaction();
try{
tx.begin();
pm.deletePersistent(fmas);
・
・ 省略
・
pm.makePersistent(fmas);
tx.commit();
・
・ 省略
・
}catch(Exception e){
// エラー処理
}
finally{
if(tx.isActive()){
tx.rollback();
}
pm.close();
}
・
・ 省略
・
今後の為にここでいくつかメモっておこうかと思う。
1.GAEjからデータストアにアクセスする場合、次の2つ方式がある。
・JDO(Java Data Objects)
・JPA(Java Presistence API)
今回は、JDO(Java Data Objects)の方式で作成してみた。
■サーバー側プログラム
(1)データクラスを定義するクラス
[fileMaster.java]
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class fileMaster {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String caption;
@Persistent
private String name;
@Persistent
private String deftag;
@Persistent
private Date date;
@Persistent
private String filename;
@Persistent
private String contentType;
@Persistent
private Blob binData;
・
・
省略(コンストラクター、セッターメソッド、ゲッターメソッドなど)
・
・
}
【説明】
・JDOで保存されたオブジェクトは、GAEデータストア内のエンティティになる。
データストアでのJavaクラスの永続化と参照等にJDOを使用できるようにするには、
クラスに@PersistenceCapableを付加する必要がある。
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
は、データストアでのJavaクラスの格納と取得にJDOを使用できるようにするidentityType = IdentityType.APPLICATIONは、主キー(PrimaryKey)の定義を
アプリケーション側で行うという宣言で、GAEでは必ずこの宣言にする必要がある。
detachable="true"はエンティティを永続化後、transientな状態に戻ってしまうのを防ぐ。
・永続化対象プロパティ定義
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String caption;
@Persistent
private String name;
@Persistent
private String deftag;
@Persistent
private Date date;
@Persistent
private String filename;
@Persistent
private String contentType;
@Persistent
private Blob binData;
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)は、システムで生成されたKeyを
使用するための記述
(2)永続化処理を実行するクラスファイル
[PMF.java]
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() {}
public static PersistenceManagerFactory get() {
return pmfInstance;
}
}
(3)永続化処理の基本パターン
// 永続化マネージャのインスタンス生成
PersistenceManager pm = PMF.get().getPersistenceManager();
// データクラスのインスタンス生成と値設定
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,filename, contentType, b);
try {
//永続化の実行
pm.makePersistent(fmas);
} finally {
//永続化マネージャのクローズ
pm.close();
}
(4)永続化処理の基本パターン(サーブレットの一部)
boolean adddata = false;
String registerno = futil.getParameter("registerno");
Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(),registerno);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
fileMaster echeck = pm.getObjectById(fileMaster.class, key); // キーでオブジェクトを取得
} catch (JDOObjectNotFoundException e) {
adddata = true;
}
if (uniq) {
// データ登録を行う
String caption = futil.getParameter("caption");
String name = futil.getParameter("name");
String filename = futil.getParameter("filename");
String contentType = futil.getParameter("contentType");
String deftag = futil.getParameter("deftag");
Date date = new Date();
byte[] b = futil.getFileData();
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,
filename, contentType,
auth.getAdmin_Email(),
"",
true, // User_r
true, // User_w
true, // User_x
false, // Group_r
false, // Group_w
false, // Group_x
false, // Other_r
false, // Other_w
false, // Other_x
b);
try {
pm.makePersistent(fmas);
// 登録成功処理記述
} catch (Exception e) {
// 登録失敗処理記述
} finally {
pm.close();
}
}
(5)永続化処理の基本パターン-削除(サーブレットの一部)
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.setCharacterEncoding("utf-8");
// ユーザチェック
・
・
省略
・
・
String registerno = req.getParameter("registerno");
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(), registerno);
fileMaster fmas = pm.getObjectById(fileMaster.class, key);
pm.deletePersistent(fmas);
resp.getWriter().println("削除成功 登録番号="+registerno);
}catch(JDOObjectNotFoundException e){
resp.getWriter().println("削除データなし エラー:"+e);
}catch (Exception e){
resp.getWriter().println("削除不成功 エラー:"+e);
} finally {
pm.close();
}
}
(6)トランザクション処理(いまのところどれくらいつかえるのか未検証)
・
・ 省略
・
Transaction tx = pm.currentTransaction();
try{
tx.begin();
pm.deletePersistent(fmas);
・
・ 省略
・
pm.makePersistent(fmas);
tx.commit();
・
・ 省略
・
}catch(Exception e){
// エラー処理
}
finally{
if(tx.isActive()){
tx.rollback();
}
pm.close();
}
・
・ 省略
・
登録:
投稿 (Atom)