プログラマメモ2 - programmer no memo2

たとえば,ダーツマシンのPHOENIXのカウントアップの平均値からレーティングを求めてみたら。 2008/06/29
2008/07/01

最近、ダーツにはまっています。うまくなりたいのですが、なかなか上達しません。



僕がプレイしているダーツマシンはフェニックスというマシンです。
ダーツの上達具合でいろいろとクラス分けされています。

カウントアップというゲームで、平均のスコアからPPD(points per darts dart)を求めて、どれぐらいの平均でクラスがわかるか計算してみました。
どうでしょ、あたってますかね。もちろん、目安としてね。



ave:100 RATING:1 CLASS:C1 PPD:4.167
ave:288 RATING:2 CLASS:C2 PPD:12.000
ave:336 RATING:3 CLASS:CC3 PPD:14.000
ave:384 RATING:4 CLASS:CC4 PPD:16.000
ave:432 RATING:5 CLASS:B5 PPD:18.000
ave:480 RATING:6 CLASS:B6 PPD:20.000
ave:528 RATING:7 CLASS:BB7 PPD:22.000
ave:576 RATING:8 CLASS:BB8 PPD:24.000
ave:624 RATING:9 CLASS:A9 PPD:26.000
ave:672 RATING:10 CLASS:A10 PPD:28.000
ave:720 RATING:11 CLASS:AA11 PPD:30.000
ave:768 RATING:12 CLASS:AA12 PPD:32.000
ave:816 RATING:13 CLASS:AA13 PPD:34.000
ave:864 RATING:14 CLASS:AA14 PPD:36.000
ave:912 RATING:15 CLASS:AAA15 PPD:38.000
ave:960 RATING:16 CLASS:AAA16 PPD:40.000


Bフライトになるためには、大体カウントアップで平均が、432点ないといけないようです。
つぎにAフライトになるためには、平均624点
※もちろん実際のクラス分けは、カウントアップでなされるわけではないです。

以下、プログラム

package d;

import java.util.TreeMap;

public class TestDarts1 {

static class CLASS {
final static String[] CLASS = { "C", "C", "CC", "CC", "B", "B", "BB",
"BB", "A", "A", "AA", "AA", "AA", "AA", "AAA", "AAA" };

protected int R;
protected double ppd;
protected String s;

static CLASS CREATE(double ppd) {

CLASS class1 = new CLASS();
int base = 10;
class1.ppd = ppd;
ppd -= base;

if (ppd < 0) {
class1.R = 1;
class1.s = CLASS[0];
return class1;
}
int p = (int) (ppd / 2);
if (16 <= p) {
class1.R = 16;
class1.s = CLASS[15];
return class1;
}
class1.R = p + 1;
class1.s = CLASS[p];
return class1;

}

private CLASS() {

}

public int getRATING() {
return R;
}

public String getCLASS() {
return s + R;
}

public String toString() {
return String.format("RATING:%d CLASS:%s PPD:%.3f", R, getCLASS(),
ppd);
}
}

public static void main(String[] args) {

a();

}

static void a() {

TreeMap<Integer, CLASS> hashMap = new TreeMap<Integer, CLASS>();
double darts = 8 * 3;
final int ave = 100;
for (int i = ave; i < ave + 1000; i++) {
double ppd = i / darts;
CLASS class1 = CLASS.CREATE(ppd);
if (!hashMap.containsKey(class1.getRATING())) {
hashMap.put(class1.getRATING(), class1);
System.out.println("ave:" + i + " " + class1);
}
}

}

}

FQCNは、Fully Qualified Class Name 2008/06/26

FQCN - Fully Qualified Class Name
Javaのクラスをパッケージ名を含んだ名前(FQCN)で記述してあること、あと、完全修飾クラス名ともいったりするみたい。

ちょっと参考

jruby-complete.jarには必要なライブラリが含まれている。 2008/06/26
2008/06/27

同僚の方に教えてもらったのですが、jruby-complete.jarには必要なものが全部ふくまれているそうです。

参考



さらに教えてもらったのは、jruby-complete.jarの新しいバージョンだけど、
jrubyのhttp://dist.codehaus.org/jruby/にない場合はmavenのリポジトリ(レポジトリ)にあるかもよ。

正規表現の練習 - CVSでダブルクォーテーションを囲むための条件 2008/06/23

Javaです。
正規表現の練習です。
Wikipedia曰く、
CVSでダブルクォーテーションを囲むための条件は、


フィールドがコンマ、ダブルクォート、改行を含む場合は、かならずダブルクォートで囲む。
Comma-Separated Values - Wikipedia

だそうです。この条件にマッチしているか正規表現で調べてみます。

package c;

import java.util.regex.Pattern;

public class Test2 {
public static void main(String[] args) {

Pattern pattern = Pattern.compile(".*[,|\\n|\"].*");

a(pattern, "");
a(pattern, "aaaaaaa");
System.out.println("==============");
a(pattern, "PPPPPPPPPPPPPPP,P");
a(pattern, ",");
a(pattern, "aaaa,aaa");
a(pattern, "aaaa\naaa");
a(pattern, "aaaaaaa\"");
a(pattern, "\"aaaaaaa");
a(pattern, "aaaaaaa\",");
a(pattern, "aaaaaaa\"");
a(pattern, "\"aaaaaaa");

}

static void a(Pattern pattern, String s) {
System.out.println(s + ":" + pattern.matcher(s).matches());
}

}

ログを読んで日付行からカレンダーをオブジェクトをつくる 2008/06/17

Javaです。
たとえば、2008-02-29 00:22:01,177とかなんとかのログ行を読んでカレンダーオブジェクトをつくってみます。

正規表現でマッチさせて、Calendarにセットしていきます。

package l;

import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestA {

static int toint(String s) {
// System.out.println(s);
return Integer.parseInt(s);
}

public static void main(String[] args) {
aa("2008-01-01 23:22:01,484");
aa("2008-02-01 08:22:01,921");
aa("2008-02-29 00:22:01,177");
aa("2008-03-01 00:22:01,003");
}

static void aa(String s) {

Pattern pattern = Pattern
.compile("^(\\d{2,4})-(\\d{1,2})-(\\d{1,2}) (\\d{1,2})\\:(\\d{1,2})\\:(\\d{1,2}),(\\d{1,3}).*");
System.out.println();
Matcher matcher = pattern.matcher(s);

Calendar calendar = Calendar.getInstance();
if (matcher.find()) {
int pos = 0;
System.err.println(matcher.group(pos++));
calendar.set(Calendar.YEAR, toint(matcher.group(pos++)));
calendar.set(Calendar.MONTH, toint(matcher.group(pos++)) - 1);
calendar.set(Calendar.DAY_OF_MONTH, toint(matcher.group(pos++)));
calendar.set(Calendar.HOUR_OF_DAY, toint(matcher.group(pos++)));
calendar.set(Calendar.MINUTE, toint(matcher.group(pos++)));
calendar.set(Calendar.SECOND, toint(matcher.group(pos++)));
calendar.set(Calendar.MILLISECOND, toint(matcher.group(pos++)));
}
System.out.println(calendar);
System.out.println(calendar.getTime().toGMTString());
System.out.println(calendar.getTime().toLocaleString());
}
}

getOwnerlessWindows()メソッド 2008/06/16

Javaです。
アプリケーションから自アプリケーションから生成された画面にアクセスするのに、わざわざインスタンスを知らないといけないのは面倒だなぁと思っていました。

Java6のJavadocをみると、java.awt.WindowにgetOwnerlessWindows()メソッドが追加されていました。

このメソッドはユーティリティメソッドになってますので、自アプリケーションからどこからでもアクセスできるので便利そうです。

ちなみに、public static Window[] getWindows()がありますが、このメソッドはgetOwnerlessWindows()をくるんだもののようです。

JavadocにはWarningも書いてありました。なんでもかんでもとれるからなのでしょう。
ダイアログとかもとれそうなので、外部からダイアログの操作も楽になりそうです。

Java 画面のイベント全部ひろう 2008/06/12

Javaです。つくったアプリケーションの画面で発生するイベントを全部ひろいたいと思いました。

Toolkitを使うとぽこぽことれました。
とれすぎて困りました。

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent awtevent) {
System.out.println(awtevent);
}
}, 0xffffffff);


マスクによってとりたいイベントを制御できます。

Image Processing 台形変形への道 - へたれなので。 2008/06/02

Javaです。
画像を変形させて台形の形にしたくて試行錯誤してます。
そんなのがりがり書けよといわれそうですけど...

前回、JAI( Java Advanced Imaging)を使ってチャレンジしてたのですが、なんかいまいちでした。ぎざぎざが目立ったので。なんかいい方法がないのかしら。
プログラマメモ2: PerspectiveTransformを使ってみる - 台形変形に向けて

灯台もとくらしで、以前使った、Filters.jarに含まれていたのでそれを使ってみました。



ぎざぎざがあまりでない感じがしますね。



以下コード。参考にならないけど...
package pers;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

import com.jhlabs.image.PerspectiveFilter;

public class Test5 {

static class Panel extends JPanel {

@Override
protected void paintComponent(Graphics g) {

Graphics2D g2d = (Graphics2D) g;
p(g2d);

}

void p(Graphics2D g2d) {

BufferedImage image;
try {
image = c();
g2d.drawImage(image, 30, 30, null);
g2d.drawImage(a(image), image.getWidth() + 30, 30, null);
} catch (IOException e) {
e.printStackTrace();
}

}

}

static BufferedImage c() throws IOException {
BufferedImage org = ImageIO.read(Test5.class
.getResourceAsStream("zzz.png"));
BufferedImage image = new BufferedImage(org.getWidth(),
org.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D g2d = (Graphics2D) image.getGraphics();
g2d.drawImage(org, 0, 0, null);
g2d.dispose();
return image;
}

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Panel());
frame.setSize(1000, 600);
frame.setVisible(true);

}

public static BufferedImage a(BufferedImage image) {

int w = image.getWidth();
int h = image.getHeight();
PerspectiveFilter perspectiveFilter = new PerspectiveFilter();
perspectiveFilter.setCorners(0, 0, w, 100, w, h - 100, 0, h);
BufferedImage image2 = perspectiveFilter.filter(image, null);

return image2;
}

}