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

目次

ファイルの各行にある8桁の数字がある場合に出力して、カウントしてみました。 2007/10/30

ファイルの各行にある8桁の数字がある場合に出力して、カウントしてみました。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class T {

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

public static void a() throws IOException {
InputStream inputStream = T.class.getResourceAsStream("PID.log");
BufferedReader reader = new BufferedReader(new InputStreamReader(
inputStream));
String line = null;
int cnt = 0;
while ((line = reader.readLine()) != null) {

if (line.matches("^[0-9]{8}")) {
System.out.println(line);
cnt++;
}

}
System.err.printf("count:%d%n", cnt);
reader.close();

}

}

serverside javascript 2007/10/27
2007/10/31

serversideでjavascriptを動かす方法って何があるかな調べてて、jetty6で動作させるアプリケーションがありました。

Bluish Coder: Javascript on the Server
Bluish Coder: Server side Javascript

簡単に動作させることができそうなので、mac osxで試してみました。

javascript-server.tar.gz
をダウンロードします。

ターミナルから直接起動するのもいいのですが、xxxx.commandファイルを作成して起動するようにしてみました。



#!/bin/sh
DIRNAME=`dirname "$0"`
cd $DIRNAME
java -classpath .:servlet-api-2.5.jar:jetty.jar:jetty-util.jar:js.jar org.mozilla.javascript.tools.shell.Main


xxxx.commandファイルをターミナルでchmod 755して実行できるようにします。

HTTPサーバーの起動はjavascript側から行います。

参考
Server-side JavaScript - Wikipedia, the free encyclopedia

google gearsがbloggerに対応しているよという記事を読んでどう利用するのか考え中 2007/10/27

Google Data API第2段リリース - 今度はBloggerに対応 | エンタープライズ | マイコミジャーナル

google gearsがbloggerに対応しているよという記事を読んでどう利用するのか考え中です。

この記事を読むまえは、下の図のようなアイデアで、ブックマークレットを使って、ブックマークをブログにしていくアプリで実験していました。



それで実験的にブックマークしたのものをデイジーニュース2に記事としてあげていました。

google gearsが使えるなら、それを使ってみようと思うのですが、どう使えばいいのかが....

【ハウツー】"ブラウザ+Gears"でここまでできる! Google GearsのDB機能を使ってみよう (1) Gearsの持つ組み込みデータベース | エンタープライズ | マイコミジャーナル

Google Gears API Blog: Blog.gears: An offline Blogger client
Google Gears API Developer's Guide - Home

流れるようなインターフェイス 2007/10/27

はやりそうなのでチェック

Martin Fowler's Bliki in Japanese - 流れるようなインターフェース
Fluent Interface and Reflection for Object Building in Java at Stephans Blog
Seasar2 - S2JDBC

quicktimeのapiで鍵盤をだす。 groovyで。 2007/10/27
2007/10/27

quicktimeのapiを使って鍵盤をだすサンプルがあったので、それをgroovyにしてみました。といっても、ほとんどjavaですが。

必要なものquicktime for javaのライブラリ。
quicktimeがインストールされているだけでいいとは思うのですが、mac osx上でしか試していません。

もともとのサンプルは、Java QuickTime Sample Codeにあります。

参考
QuickTime for Java



import quicktime.*
import quicktime.std.music.*
import quicktime.std.StdQTException

try {
QTSession.open()
ToneDescription toneDesc = new ToneDescription ()
toneDesc.pickInstrument (NoteAllocator.getDefault(), "Choose an Instrument...", 0)
toneDesc.pickInstrument(NoteAllocator.getDefault(),
"Choose an Instrument...", 0)
toneDesc = new ToneDescription (25)

NoteChannel noteChan = new NoteChannel(new NoteRequest(toneDesc))
noteChan.playNote (60, 127)
Thread.sleep (2000)
noteChan.playNote (60, 0)
} catch(e){
//e.printStackTrace()
} finally {
QTSession.close()
}



mac osx上のeclipse上で実行した模様

J2SE 1.4.2 EOL - 1.4.2終了間近。 2007/10/26



そろそろ本格的に、java6(5)に移行ですね。

試験管のなかのコード :: J2SE 1.4.2 EOL プロセス開始
Java 2 Platform, Standard Edition (J2SE) 1.4.2

正直、怖いんですよね。java6に移るのには。だってジェネリックって?とかアノテーションって?ってなりそうで。

java proxyを利用して接続したい。URLクラスの初期化で行えます。 2007/10/23

javaです。

[JavaHouse-Brewers:39244] 動的なproxy 設定について

proxyを利用して接続したい。

システム環境変数を使わず接続するためには、

new URL(String protocol, String proxyHost, int proxyPort, String urlString);

でいける。

jsp 接続しているリモートアドレスの取得。 2007/10/23

接続しているリモートアドレスの取得。
tomcatとかについているサンプル(snoop)つかえば簡単だけど。

このリモートアドレスは、プロクシサーバ通して接続されれば、もちろん書き換えられたアドレスに変換されます。

<html>
<body>
<h1> your remote address </h1>
<font size="4">
<br>
Remote address: <%= request.getRemoteAddr() %>
<br>
Remote host: <%= request.getRemoteHost() %>
</font>
</body>
</html>


参考:
Servlet samples

poj 2726 Holiday Hotel 2007/10/22

2726 -- Holiday Hotel

参考:
ACM PKU 2726 Holiday Hotel - AClayton's ACM/ICPC Life 只切菜题 菜鸟乱飞 - C++博客
けこーん - 危ないRiSKのブ・ロ・グ

参考サイトを参考にしました。

ひっかかったのは、0が入力されるまで繰り返しテストケースを実行するというところでした。
わかってしまえばどうってことないのですが...

package p2726_not_solved;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {

static class Node {
int D;
int C;

Node(int D, int C) {
this.D = D;
this.C = C;
}

public String toString() {
return "D:" + D + " C:" + C;
}
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
while ((n = scanner.nextInt()) != 0) {
Node[] nodes = new Node[n];
for (int i = 0; i < n; i++) {
int D = scanner.nextInt();
int C = scanner.nextInt();
nodes[i] = new Node(D, C);
}

Comparator comparator = new Comparator() {

public int compare(Node o1, Node o2) {
if (o1.D == o2.D)
return o1.C - o2.C;
return o1.D - o2.D;
}

};

Arrays.sort(nodes, comparator);
for (Node node : nodes) {
// System.out.println(node);
}

int total = 1;
int min = nodes[0].C;
// System.out.println(nodes[0]);
for (int i = 1; i <= n - 1; i++) {
if (min > nodes[i].C) {
min = nodes[i].C;
// System.out.println(nodes[i]);
total++;
}
}
System.out.println(total);
}
}
}

t.play - SuperColliderはスーパコライダー 2007/10/21



via.Xヶ所村: t.play



SuperColliderはスーパコライダー

音響合成作成に特化した言語だそうです。

SuperCollider

フィボナッチミュージックというのをみかけて、groovyで実現したかったので、再びチャレンジ 2007/10/21

やりかけてたことにチャレンジ。
フィボナッチミュージックというのをみかけて、groovyで実現したかったので、再びチャレンジ

元ネタ

  • L'eclat des jours(2007-08-07)
    http://arton.no-ip.info/diary/20070807.html#p01


  • ほとんど、そのまま、groovy + quicktimeにしてみました。

    勉強になったことはループのuptoという書き方。
    あと、rubyのputs。

    import quicktime.QTSession
    import quicktime.std.music.ToneDescription
    import quicktime.std.music.NoteChannel
    import quicktime.std.music.NoteRequest

    QTSession.open()
    NoteChannel noteChannel = new NoteChannel(new NoteRequest(new ToneDescription(1)))

    def fib(n){
    if(n<2) {
    return n
    }
    fib(n-2)+fib(n-1)
    }

    s = 1

    1.upto(30) { n ->
    x = fib(n)
    noteChannel.reset()
    println x
    x %= 19
    x += 40
    println x
    noteChannel.playNoteRaw(s as int, 60)
    s = x
    sleep(100)
    }
    QTSession.close()


    最後あたり再帰での計算が重くなります...Orz...

    参考
  • プログラマメモ2: groovyでmidi演奏の最初の一歩 - quicktimeを使って
    http://programamemo2.blogspot.com/2007/08/groovymidi-quicktime.html
  • del.icio.us APIでタグリスト取得 - httpclientを使ってみる 2007/10/21
    2008/01/20

    del.icio.us/help/api
    del.icio.us/help/api/tags

    del.icio.usからタグデータを取得するサンプルです。
    現時点(2007-10-21)の話です。ですので、今後変更されるかもしれないので注意が必要です。

    All del.icio.us APIs are done over https and require HTTP-Auth.


    とあります。SSLで、HTTP-Authされていることが条件になります。
    最初にブラウザで取得できることをためします。
    https://api.del.icio.us/v1/tags/get
    でためしてみます。

    認証用のダイアログがでて、適切な、ユーザID、パスワードを入れるとxmlデータで結果が返されます。

    次にjavaで取得してみます。
    HttpComponentsを使ってみました。

    HttpComponents - HttpComponents Overview

    httpclientとhttpcoreのバージョンの組み合わせは、
    httpcomponents-client-4.0-alpha1とhttpcore-4.0-alpha5です。

    現時点(2007-10-21)では、httpcore-4.0-alpha6がでているのですが、ためしたらhttpcomponents-client-4.0-alpha1と一緒に使えなかったです。

    java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpExecutionContext
    がでてしまいました。

    なにやらjarを覗いてみてもなかったので、alpha5からalpha6の間に大きな変化があるようです。と、ドキュメントを先に読んどけと怒られそうですが....

    コードは、httpcomponents-client-4.0-alpha1のサンプルコードを利用しています。
    別のバージョンで動作しない可能性があります

    ここでのミソは多分、SSL通信であること、HTTP-Authを使用していることです。
    SSLを使っているっていう意識がなくても動いてますね。

    package test;

    import java.io.BufferedReader;
    import java.io.InputStreamReader;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;

    public class DeliciousGet {

    public static void main(String[] args) throws Exception {
    DefaultHttpClient httpclient = new DefaultHttpClient();

    httpclient.getState().setCredentials(
    new AuthScope("api.del.icio.us", 443),
    new UsernamePasswordCredentials("ユーザ", "パスワード"));


    HttpGet httpget = new HttpGet("https://api.del.icio.us/v1/tags/get");

    System.out.println("executing request" + httpget.getRequestLine());
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();

    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    if (entity != null) {
    System.out.println("Response content length: " + entity.getContentLength());
    System.out.println("Chunked?: " + entity.isChunked());

    BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent(), "utf-8"));
    String line = null;
    while((line = br.readLine()) != null){
    System.out.println(line);
    }
    }
    if (entity != null) {
    entity.consumeContent();
    }
    }
    }

    groovyで別groovyファイルをインクルードもどき。 2007/10/21

    groovyで別groovyファイルをインクルードもどき。

    groovyでinclude 他のgroovyファイルができたらいいなと確かに思うときがあります。
    importではなくてです。

    もしかして、なんかいい方法があるかもしれない。調査が足りないか。

    RE: How do I include one groovy script w/ in another?

    で、過去のメーリングリストで、たしかにeval使えばいいのかということでためしてみたらできました。

    しかし、この方法だとファイルパスがちょっと嫌な感じします。

    試したコード。
    t_inc.groovyファイル


    evaluate(new File("./src/c.groovy"))

    println "i am t_inc"
    println ok


    c.groovyファイル

    ok = "ok ok ok "
    println "i am c.groovy ${ok}"


    t_inc.groovyを実行すると、c.groovyを読み込むって感じです。
    ファイルパスは工夫する必要がありますね。

    c.groovyで定義した変数を読み取ることができます。
    その際には定義もとでdefをつけるとローカル変数になってしまいますので、t_inc.groovyで読み取ることができなくなってしまいます。


    参考
    @IT:Groovyに触ってみよう
    のまとめの章

    jettyでJNDIからDataSource使いたい。できたらgroovletから。 2007/10/18

    civic site : Jettyの起動まとめ:JNDIからDataSourceを取得を参考にしました。

    jettyで起動時の環境ファイルをconfig.xmlとして、start.jarで読み込ませます。
    その時の起動ファイルは下記のような感じです。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">

    <Configure id="Server" class="org.mortbay.jetty.Server">
    <Call name="addConnector">
    <Arg>
    <New class="org.mortbay.jetty.nio.SelectChannelConnector">
    <Set name="port">8080</Set>
    </New>
    </Arg>
    </Call>
    <Array id="plusConfig" type="java.lang.String">
    <Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
    <Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
    <Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
    <Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
    <Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item>
    </Array>

    <New id="jnditest" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg>jdbc/jnditest</Arg>
    <Arg>
    <New class="org.hsqldb.jdbc.jdbcDataSource"> <!-- HSQLDB用のDataSource -->
    <Set name="Database">jdbc:hsqldb:hsql://localhost</Set>
    <Set name="User">sa</Set>
    <Set name="Password"></Set>
    </New>
    </Arg>
    </New>

    <Set name="handler">
    <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
    <Set name="handlers">
    <Array type="org.mortbay.jetty.Handler">
    <Item>
    <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
    </Item>
    <Item>
    <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
    </Item>
    <Item>
    <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
    </Item>
    </Array>
    </Set>
    </New>
    </Set>

    <Call name="addLifeCycle">
    <Arg>
    <New class="org.mortbay.jetty.deployer.ContextDeployer">
    <Set name="contexts"><Ref id="Contexts"/></Set>
    <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
    <Set name="scanInterval">1</Set>
    </New>
    </Arg>
    </Call>
    <Call name="addLifeCycle">
    <Arg>
    <New class="org.mortbay.jetty.deployer.WebAppDeployer">
    <Set name="contexts"><Ref id="Contexts"/></Set>
    <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
    <Set name="configurationClasses"><Ref id="plusConfig" /></Set>
    <Set name="parentLoaderPriority">false</Set>
    <Set name="extract">true</Set>
    <Set name="allowDuplicates">false</Set>
    <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
    </New>
    </Arg>
    </Call>
    <Set name="stopAtShutdown">true</Set>
    <Set name="sendServerVersion">true</Set>
    <Set name="sendDateHeader">true</Set>
    </Configure>


    次にweb.xmlでresource-refを指定します。
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <servlet>
    <servlet-name>Groovy</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>Groovy</servlet-name>
    <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>

    <resource-ref>
    <res-ref-name>jdbc/jnditest</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    </resource-ref>

    </web-app>


    hsqldbに、テーブルを作成しておきます。
    hsqldマネジャーでの接続は、


    groovletは
    import java.sql.*
    import javax.sql.DataSource
    import javax.naming.InitialContext
    import groovy.sql.Sql

    InitialContext ctx = new InitialContext();
    dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/jnditest");

    //println "ok? ${dataSource}"
    r = ""
    sql = Sql.newInstance(dataSource)
    sql.eachRow("select * from ttt"){ row ->
    r = row.sss
    }

    println r


    多分、こんな感じでいいと思う。

    osx上でhsqldbマネジャーをダブルクリックで動かしたい。 2007/10/18

    osx上でhsqldbマネジャーをダブルクリックで動かしたい。

    まず、demoディレクトリのrunManager.shをコピーして拡張子を変更します。
    つぎに、「このアプリケーションで開く」をターミナル.appに変更します。



    あと、JAVA_HOMEの設定をします。

    僕がとった方法は、スクリプトファイルに追加しました。

    export JAVA_HOME=/Library/Java/Home




    これでダブルクリックで起動するようにできました。

    同じ手順で、runServer.shをrunServer.commandにするとサーバーを立ち上げるのも楽そうです。

    groovyのeclipse pluginがgroovy1.0にしか対応していないようですが。 けど、開発最新版は対応している。 2007/10/17

    groovyのeclipse pluginがgroovy1.0にしかまだ対応していないようです。

    Groovy - ExpandoMetaClass - Dynamic Method Names
    にあるサンプルは1.0だと動かなかったです。

    eclipseのプロジェクトの参照ライブラリをgroovy1.1のものにかえれば、動作しました。




    ※こういう記事を書いたあとで、pluginが1.1に対応してたりするんですよね。

    と書いたあとで、よく調べると、開発版のプラグインがありました。




    1.0 - 1.1 の違いをまとめたサイトってないものでしょうか。

    Safe Navigation Operatorが用意されています。 2007/10/16
    2007/10/17

    Safe Navigation Operator (?.)
    Safe Navigation Operator (?.)
    グルービーはSafe Navigation Operatorが用意されていますね。

    これってNullPointerExceptionをさけるためのようです。

    ところでgroovy本家のサイトみていますと、
    Groovy - User Guide

    groovy自体が進化していて、自分の実行環境とのバージョンの違いに注意する必要があります。

    Groovy - Operators

    groovy1.0の環境(eclipseプラグイン)でためしています。

    def user = null
    def streetName = user?.address

    はOKのようですが、

    def user = ""
    def streetName = user?.address

    はだめなようです。

    そういったものなんでしょうか。

    メソッド、プロパティを所有しているオブジェクトがnullでも安全に使えるという趣旨ですね。

    実行中のgroovyの行番号を知るためのもうひとつの方法 - これだといいかも。 2007/10/15

    前回、 プログラマメモ2: 実行中のgroovyの行番号を知るためのもうひとつの方法 - でも、だめなようです。、のコードより正確になっています。

    H氏からのいただきものコードです。

    def getCurrentLineNumber() {
    def the_thisClassName = getClass().getName()
    def the_inThisObject = new Throwable().getStackTrace().findAll {the_stackTraceElement ->
    the_thisClassName.equals(the_stackTraceElement.getClassName())
    }
    return the_inThisObject[1].getLineNumber()
    }


    実行しているスクリプト自身でマッチさせていますね。

    使用方法は、スクリプトから上記のメソッドを呼び出せばその呼び出しした行がわかります。

    ちなみに、クロージャーの中から実行されいる場合、this.getClass()ではスクリプトのクラスがわかりませんが、そういう場合は、
    owner.class.name
    で実行しているスクリプトのクラスがみつけれるようですね。

    あとgroovyだとisというメソッドがありますね。
    #これってなんでしょうかね?

    ちょっと実験コード
    new Throwable().getStackTrace().each(){ s ->
    if(s.getClassName().is(owner.class.name)){
    println "o_o! ${s}"
    }
    }

    実行中のgroovyの行番号を知るためのもうひとつの方法 - でも、だめなようです。 2007/10/15
    2007/10/15

    以前、Hさんに実行中のjavaの行番号を知る方法を教えていただきました。
    下記のような感じです。


    new Throwable().getStackTrace()[0].getLineNumber()


    Java言語のすべてのエラーと例外のスーパークラスになるThrowableを利用しています。

    さて、groovyで同じようしようとすると、ちょっと工夫しないといけないようです。

    まずためしに例外を発生させて行の情報をみてみます。

    println "i am test script"

    new RuntimeException("i am test script").printStackTrace()


    を実行してみますと。


    java.lang.RuntimeException: i am test script
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.codehaus.groovy.runtime.MetaClassHelper.doConstructorInvoke(MetaClassHelper.java:562)
    at groovy.lang.MetaClassImpl.doConstructorInvoke(MetaClassImpl.java:1756)
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:758)
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:688)
    at org.codehaus.groovy.runtime.Invoker.invokeConstructorOf(Invoker.java:163)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:140)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeNewN(ScriptBytecodeAdapter.java:243)
    at t_linenumber.run(t_linenumber.groovy:3)
    at gjdk.t_linenumber_GroovyReflector.invoke(Unknown Source)
    at groovy.lang.MetaMethod.invoke(MetaMethod.java:115)
    at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:713)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:560)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:450)
    at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:131)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:111)
    at org.codehaus.groovy.runtime.InvokerHelper.runScript(InvokerHelper.java:408)
    at gjdk.org.codehaus.groovy.runtime.InvokerHelper_GroovyReflector.invoke(Unknown Source)
    at groovy.lang.MetaMethod.invoke(MetaMethod.java:115)
    at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:713)
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:664)
    at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:111)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:111)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:187)
    at t_linenumber.main(t_linenumber.groovy)

    真ん中あたりの出力で、3行目でランタイムエラーを発生させているのがわかります。

    この部分を抜き出してみればいいような感じです。

    それで、できあがったコードは下記のような感じ。

    new Throwable().getStackTrace().each{ s ->
    matcher = s =~ /run\(.*\:([0-9]+)/
    if(matcher.find()) println "line number: ${matcher.group(1)}"
    }


    とても楽観的なコードです。
    なんとなくうまくいっているようにはみえます。
    クロージャ使ってます。

    動作させて、ためした環境は、eclipse + groovy pluginです。

    動作の仕方によってはまったく役にたたないようです...Orz

    プログラマメモ2: 実行中のgroovyの行番号を知るためのもうひとつの方法 - これだといいかも。

    poj 2141 2007/10/15

    2141 -- Message Decowding

    「a simple substitution cipher. 」です。
    おもいつくままにコーディング。isUpperCaseできいているところがなんかいやだけど。

    この問題はショートコーダー本ですごいコードが載っていますね。



    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    String key = scanner.nextLine();
    String s = scanner.nextLine();
    dec(key, s);

    }

    static void dec(final String k, String s) {

    class Dec {

    char dec(final char c) {
    boolean isUpp = Character.isUpperCase(c);
    char c2 = Character.toLowerCase(c);
    if (!('a' <= c2 && c2 <= 'z'))
    return c;
    int idx = (int) ((int) c2 - (int) 'a');
    char d = k.charAt(idx);
    if (isUpp)
    return Character.toUpperCase(d);
    return d;
    }
    }
    Dec dec = new Dec();
    char[] cs2 = s.toCharArray();
    for (int i = 0; i < cs2.length; i++) {
    System.out.print(dec.dec(cs2[i]));
    }

    }
    }

    <!-- START -->ここの部分が欲しい<!-- END --> 2007/10/14

    正規表現はよく忘れます。場当たり的に使って、使い方をすぐに忘れてしまいます。
    linuxのコマンドもよく忘れます。eclipseのようなIDEがないとコードが書けなくなってしまってます...Orz...

    正規表現です。

  • 君ならどう書く? s///ge - Grな日々(uehajの日記)
    http://d.hatena.ne.jp/uehaj/20071010


  • という記事をみかけて、勉強がてらためしてみました。

    <!-- START -->ここの部分が欲しい<!-- END -->


    という文字列から「ここの部分が欲しい」を抜き取ります。

    コードはgroovyです。
    s = "<!-- START -->ここの部分が欲しい<!-- END -->"
    s = s.replaceAll(/.*<!-- START -->(.*)<!-- END -->.*/) { m0, m1 -> "${m1}" }
    println s


    クロージャーを使ってます。

    poj 2509 Peter's smokes - タバコは控えめに 2007/10/13

    2509 -- Peter's smokes
    POJ 2509 Peter's smokes - 路雪军 Carl - CSDNBlog

    実はこの問題の意味がわかってないです。Orz...
    簡単だとは思うのですが...

    package p2509_ref;

    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    while (scanner.hasNext()) {
    int n = scanner.nextInt();
    int k = scanner.nextInt();
    System.out.println(f(n,k));
    }
    }


    static long f(int n, int k){

    long sum = n;
    int a = n;
    for(;k <= a;){

    sum += a / k;
    a = (a / k) + (a % k);
    }
    return sum;
    }
    }

    JFileChooserが遅い 2007/10/13

    JFileChooser パフォーマンス問題 - Masaki Katakai's Weblog

    プライベートな開発環境が、osxとwin2000なので、チェックできてなかったのですが、職場のxpの環境でたしかにJFileChooserがものすごくおそいと場合がありました。何気に、スルーしていましたがバグなんですね...

    xmlが嫌われている - そうかもしれない。 2007/10/12

    XMLが嫌われている?:ITpro

    xml自体は悪くないと思いますが、
    僕が最近惹かれるのは、groovyとかjavascriptのjsonをevalして使ったほうが楽なのかなぁと。

    以外とXMLスキーマとか使われてないような気がするのですがどうでしょうか。なんかxmlの使い方って結構曖昧な感じ使われているような気がします。

    結局、xmlを処理する部分をいい加減に実装して、データがほぼ正しいだろうって感じで使ってますし。
    アプリケーションのそこらこちらに適当にxml定義をちりばめるのがいけないのかも。
    ネームスペースとかもなんか面倒。おっと自分が怠惰なだけか。

    オラクル to_char 謎のスペース 2007/10/12

    データベースオラクルのSQLについてです。

    以下、Aさんから教えてもらったことです。

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    出力文字列をフォーマットするときに、to_charをよく使ったりします。

    select to_char(8, '000') from dual


    とすると

    008

    と出力されることを期待します。
    そう出力されます。

    が、しかし、、実はこれですと、頭にスペースが入ってきます。

    select '"' || to_char(8, '000') || '"'from dual


    " 008"

    となります。
    スペースなので気づかないときがあったりするので注意が必要です。

    なので、知らない方なんとなく下記のようにしてしまいます(多分)

    select trim(to_char(8, '000')) from dual


    実は、この頭のスペースは符号が入っているんだよということらしいです。

    ためしにマイナスにしてみます。

    select '"' || to_char(-8, '000') || '"'from dual


    すると結果

    "-008"

    となってスペースが入ってないことが確認できます。
    デフォルトでは+の符号がつかないってことっぽいです。

    結果に符合を表示させるのはsをつけます。

    select '"' || to_char(8, 's000') || '"'from dual


    "+008"

    となります。

    では、スペースをとるための書き方は、fmをつけるそうです。

    select '"' || to_char(8, 'fm000') || '"'from dual


    "008"

    というふうになります。

    修飾子FMは、符号の表示を制御するためのもののようです。
    Fill Modeってことらしいです。

    知らない人が案外いるかもしれませんね。

    参考
    書式モデル(数値) - Oracle/オラクルをマスターするための基本と仕組み

    poj 2350 2007/10/12

    2350 -- Above Average

    自分がすぐに解けそうな問題をさがして、accept。
    自分の傾向として、WAがでる場合って、入力値が0で結果が最小の時とかが多そう。
    例えば、これでも一度、WAでたけど、結果を, 00.000% とださないといけないのを.000%とだしていたからだったり。


    package p2350_very_easy;

    import java.text.DecimalFormat;
    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    int N = scanner.nextInt();
    while (0 < N--) {
    int c = scanner.nextInt();
    int a = 0;
    int[] is = new int[c];
    for (int i = 0; i < c; i++) {
    is[i] = scanner.nextInt();
    a += is[i];
    }
    a(a, is);

    }
    }

    static void a(int a, int[] is) {
    int len = is.length;
    int ave = a /= len;
    int c = 0;
    for (int i : is) {
    c += ave < i ? 1 : 0;
    }
    double d = ((c * 1.) / (len * 1.)) * 100;
    DecimalFormat format = new DecimalFormat("#0.000");
    System.out.println(format.format(d) + "%");
    }
    }

    選択肢が多すぎると意欲が削がれる 2007/10/11

    WIRED VISION / 「選択肢が多すぎると意欲が削がれる」マルチコアの問題点

    なるほどなと思った次第。
    ひとつひとつの選択肢を吟味する時間も奪われるわけだし。
    はじめから筋のよいものを選べればよいが、環境や、インプットされる情報で偏りもでてくるわけだし。

    Erlangはよくはてな日記や、ブログ等で名前ぐらいは知っていたけど、しかし、世の中にはこんなに並列プログラミングのための環境があるとは...

    筋がいいプログラミング言語はなんだろう。

    poj 1519 digital roots 2007/10/10

    1519 -- Digital Roots

    寝る前に挑戦したので、ものすごく簡単そうな問題を選びました。
    簡単な問題をみつけるコツは、acceptedの数が多いものを選べばいいのかもしれません。

    文字列で処理しないと、Runtime errorがでるかもしれません。

    ちなみに問題タイトルのdigital rootsの意味がよくわかってないです。

    package p1519_very_easy;

    import java.util.Scanner;

    public class Main {


    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    while(true){
    String l = scanner.next();
    if("0".equals(l))break;
    a(""+l);
    }
    }

    static void a(String s){

    char[] cs = s.toCharArray();
    long i = 0;
    for (char c : cs) {
    i += Long.parseLong(c+"");
    }

    if(9 < i){
    a(""+i);
    return;
    }
    System.out.println(i);
    }

    }

    初期化手順 - またまちがった 2007/10/10

    このソースコードは問題なくうごくでしょうか。


    public class TestInit {

    public static void main(String[] args) {
    new A();
    }

    }

    class At {
    void print() {
    System.out.println("i am At...");
    }
    }

    class A extends SuperA {

    At at = new At();

    A() {
    super();
    }

    @Override
    public void initialize() {
    at.print();
    }

    }

    /**
    *
    * 抽象クラス
    *
    */
    abstract class SuperA {

    /**
    * 初期化メソッドを呼び出します。
    */
    public SuperA() {
    initialize();
    }

    /**
    * 初期化メソッド。 使用者は実装しないといけない。
    *
    */
    public abstract void initialize();

    }


    ヌルポインタを起こします。

    0で埋め文字 2007/10/10

    0で埋め文字して表示したい。

    すぐに思いついたのはDecimalFormat。あと、ジャカルタコモンズつかっていいならば、org.apache.commons.lang.StringUtilsにleftpadとかあります。

    あと、C言語のようなフォーマッター使えるなぁというのは思い出せたのですが、使い方忘れてました。

    System.out.format("%0桁数d", 15);

    が使えますね。


    参考:
    数値の0埋め

    poj 2309 2007/10/09

    2309 -- BST

    図を書いていろいろ試行錯誤して解いてみた。
    wrong answerがでて、奇数の場合はそのまま出力したらacceptedされました。

    package p2309;

    import java.util.Scanner;

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

    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    while (0 < n--) {
    long r = scanner.nextLong();
    c(r);
    }
    }

    static void c(long l) {

    if (l == 0 || l % 2 != 0) {
    System.out.printf("%d %d%n", l, l);
    return;
    }
    long l2 = l;
    long l1 = l;
    long r1 = l;
    long[] L = { 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096,
    8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576,
    2097152, 4194304, 8388608, 16777216, 33554432, 67108864,
    134217728, 268435456, 536870912, 1073741824, 2147483648L,
    4294967296L, 8589934592L, 17179869184L };
    int i = 0;
    for (; i < L.length - 1; i++) {
    l2 = l2 / 2;
    if (l2 % 2 != 0) {
    break;
    }

    }

    // System.out.println(">>>" + L[i]);
    l1 = (l - L[i]) + 1;
    r1 = (l + L[i]) - 1;

    System.out.printf("%d %d%n", l1, r1);
    }

    }

    jsp,gspのインスタンス 2007/10/09

    groovyのgspのインスタンスは毎回つくられるのか実験。

    まず、jspからためしてみる。
    実験環境はjettyでほとんど、設定ファイルはいじってない(と思う)。

    お遊び実験なので、特に深い意味はないです。

    a.jsp
    の実装は

    <%=this %>


    出力結果は、


    次にgspでおなじようにして、a.gspを作成します。
    出力結果、



    再読込みすると、jspは出力結果が変わりませんが、gspは変わります。
    ですので、リクエスト毎にインスタンスがつくられているっぽいです。

    jspはひとつのインスタンスを使いまわしているというのがわかりますね。

    参考
    @IT:事例に学ぶWebシステム開発のワンポイント(4)

    [実装編]スレッドセーフにすることを忘れてはいけない:ITpro

    poj 1579 2007/10/08

    1579 -- Function Run Fun

    素直に再帰のコードを使ったら、案の定、途中で計算しっぱなしで帰ってこなくなったので、いつものごとくdiscussをチラ見して、submit。


    package p1579_ref_i_cant_understand;

    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    int i, j, k;
    int a, b, c;
    int[][][] w = new int[21][21][21];
    for (i = 0; i < 21; i++) {
    for (j = 0; j < 21; j++) {
    w[0][i][j] = w[i][0][j] = w[i][j][0] = 1;
    }
    }
    for (i = 1; i <= 20; i++) {
    for (j = 1; j <= 20; j++) {
    for (k = 1; k <= 20; k++) {
    if (i < j && j < k) {
    w[i][j][k] += w[i][j][k - 1] + w[i][j - 1][k - 1]
    - w[i][j - 1][k];

    } else {
    w[i][j][k] += w[i - 1][j][k] + w[i - 1][j - 1][k]
    + w[i - 1][j][k - 1] - w[i - 1][j - 1][k - 1];
    }
    }
    }
    }
    Scanner scanner = new Scanner(System.in);

    while (true) {

    a = scanner.nextInt();
    b = scanner.nextInt();
    c = scanner.nextInt();

    if (a == b && b == c && c == -1)
    break;

    i = a;
    j = b;
    k = c;

    if (a <= 0 || b <= 0 || c <= 0) {
    i = j = k = 0;
    } else if (a > 20 || b > 20 || c > 20) {
    i = j = k = 20;
    }
    System.out.printf("w(%d, %d, %d) = %d%n", a, b, c, w[i][j][k]);

    }

    }

    }

    poj 2390 - int値を割るときdoubleで割らないと 2007/10/08

    2390 -- Bank Interest

    int値を割るときdoubleで割らないとdouble値にならないよ、ということ。

    package p2390;

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    // R, M, and Y
    Scanner scanner = new Scanner(System.in);
    int R = scanner.nextInt();
    long M = scanner.nextLong();
    int Y = scanner.nextInt();
    int pos = 0;
    double r = 1 + (R / 100.0);
    double a = M;
    while (pos++ < Y) {
    a = a * r;
    }
    System.out.println((long)Math.floor(a));
    }

    }

    疑問 MarkupBuilderってmetaタグのhttp-equivを表現できないのでは? 2007/10/07

    groovyのMarkupBuilderってmetaタグのhttp-equivを表現できないのでは?
    tokenエラーでコンパイルが通らないような。
    うーん。

    groovlet コードサンプル 2007/10/07

    groovlet コードサンプルです。

    request.getParameterを受けるときにnull値にならないようにparam関数を使用しています。

    CGI Programming
    がいろいろ参考になります。


    import groovy.xml.MarkupBuilder

    response.setContentType('text/html;charset=utf-8');
    def c = param('c')
    def t = param('t')
    def url = param('u')

    writer = new StringWriter()
    builder = new MarkupBuilder(writer)
    builder.p {
    h1('更新')
    form(action:'publish_post.groovy'){
    p('内容を入力')
    span('タイトル')
    input(type:'text', name:'c', size:70, value:c)
    br()
    span('内容')
    input(type:'text', name:'t', size:70, value:t)
    br()
    span('url')
    input(type:'text', name:'u', size:70, value:url)
    br()
    input(type:'submit')
    input(type:'button', value:'閉じる', onClick:"window.close()")
    }
    }

    println """
    <html><head>
    <title></title>
    </head>
    <body>
    <p>
    ${writer.toString()}
    </p>
    </body>
    </html>
    """
    def label(text) { b.span(text) }

    def param(name) {
    param(name, '')
    }
    def param(name, defValue) {
    def val = request.getParameter(name)
    if (val) return val else return defValue
    }

    blogger API 本日の投稿だけ取得 2007/10/07

    blogger APIです。

    Blogger Data API Developer's Guide

    記事の取得に関してのサンプルがほとんどサンプルないような気が...

    DateTimeにsetDateOnlyしたほうがよいようです。
    もっと他の方法知りたいところです。

    みつからないとnullを返すという仕様にしてみました。


    /**
    * <p>
    * 本日、発行されたpostを一件だけ取得します。ですので、目的のものがみつかるという保証はありません。
    * </p>
    *
    * @param myService
    * @param blogId
    * @return
    * @throws ServiceException
    * @throws IOException
    */
    public static Entry getTodayPublishedPost(GoogleService myService,
    String blogId) throws ServiceException, IOException {
    DateTime startTime, endTime;
    startTime = DateTime.now();
    endTime = DateTime.now();

    startTime.setDateOnly(true);

    URL feedUrl = new URL("http://www.blogger.com/feeds/" + blogId
    + "/posts/default");
    Query myQuery = new Query(feedUrl);
    myQuery.setPublishedMin(startTime);
    myQuery.setPublishedMax(endTime);
    Feed resultFeed = myService.query(myQuery, Feed.class);

    if (resultFeed.getEntries().size() == 0)
    return null;

    return resultFeed.getEntries().get(0);
    }


    追記
    本当に正しく動いているかどうか自信がない。
    で、下記のコードに変更

    /**
    * <p>
    * 本日、発行されたpostを一件だけ取得します。ですので、目的のものがみつかるという保証はありません。
    * </p>
    *
    * @param myService
    * @param blogId
    * @return
    * @throws ServiceException
    * @throws IOException
    */
    public static Entry getTodayPublishedPost(GoogleService myService,
    String blogId) throws ServiceException, IOException {
    DateTime startTime, endTime;

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);

    startTime = new DateTime(calendar.getTime());

    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    endTime = new DateTime(calendar.getTime());

    URL feedUrl = new URL("http://www.blogger.com/feeds/" + blogId
    + "/posts/default");
    Query myQuery = new Query(feedUrl);
    myQuery.setPublishedMin(startTime);
    myQuery.setPublishedMax(endTime);
    Feed resultFeed = myService.query(myQuery, Feed.class);

    if (resultFeed.getEntries().size() == 0)
    return null;

    return resultFeed.getEntries().get(0);
    }

    osx環境でjettyをダブルクリックで起動したい。 2007/10/07

    mac osx上でjettyをダブルクリック起動したいなと思いました。

    参考
    sh2command --- Asaoka Hiroko's Page

    xxx.commandといのがosx上で使えます。windows上でのxxx.batみたいなものだと思います。

    下記のようにしました。
    これでターミナルが起動してjettyを起動させることができました。
    しかし、下記のcommandだと、パスを書かないといけないのが気になりますね。

    #!/bin/sh
    cd /path_to/jetty-6.1.5/
    java -jar start.jar etc/jetty.xml


    あっそうかこういうときは、コマンドの位置がわかればいいわけで、修正。
    #!/bin/sh
    DIRNAME=`dirname "$0"`
    cd $DIRNAME
    java -jar start.jar etc/jetty.xml


    参考
    プログラマメモ2: goovy.sh かっこわるいけど、とりあえず

    スカラー scalar 2007/10/06

    perlでいうスカラー変数の意味がわからなかったので、簡単に調べてみても、よくわからなかったです。

    何でも入れられるものっていうイメージはわいたのですが、それ以上でもそれ以下でもなく。

    perlでは、数値でも文字列でも入れられるんですよね。

    参考
    スカラー scalar
    実数 - Wikipedia
    実数型 - Wikipedia
    404 Blog Not Found:perl - $scalarの中身が数値か否かを判定する

    カレンダーメーカー - 空想してばかり。 2007/10/05



    空想してばかり。
    何かあたってますね。

    仲若重人のカレンダー

    関連
    プログラマメモ2: 脳内メーカー - 興味深いです。

    コネクションはどこへいった!? 2007/10/04

    【トラブル大捜査線】失われたコネクションを追え! (1/3) - @IT
    【トラブル大捜査線】失われたコネクションを追え! (3/3) - @IT

    データベースのクローズ忘れてによって、アプリケーションサーバで生成されたスレッドがなくならないとかなんとか。

    クローズ忘れはとても最悪だが、dbcpのパラメータを知っているのも重要。

    自分のコード書きの腕前を過信しないこと。

    問題がおきているのであれば、それは事実として受け止めること。どんなに言い訳しても、遅いものは遅いし、メモリを食っているならそれはメモリを食っているのだ。だ。
    初心にもどるべしべし。

    poj 1317 2007/10/03

    1317 -- Do the Untwist

    package p1317;

    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (true) {
    int k = scanner.nextInt();
    if (k == 0)
    break;
    String line = scanner.next();
    char[] cs = line.toCharArray();

    int[] cc = new int[cs.length];
    for (int i = 0; i < cs.length; i++) {
    cc[i] = a(cs[i]);
    }
    int[] pc = decrypt(k, cc);
    for (int i : pc) {
    System.out.print(b(i));
    }
    System.out.println();

    }

    }

    static int[] crypt(int k, int[] pc) {

    int[] cc = new int[pc.length];
    int n = pc.length;
    for (int i = 0; i < pc.length; i++) {
    cc[i] = i == 0 ? pc[0] : (pc[(k * i) % n] - i) % 28;
    }

    return cc;
    }

    static int[] decrypt(int k, int[] cc) {

    int[] pc = new int[cc.length];
    int n = pc.length;

    for (int i = 0; i < pc.length; i++) {
    pc[(k * i) % n] = (cc[i] + i) % 28;
    }

    return pc;
    }

    static int a(char c) {

    if (c == '_') {
    return 0;
    }

    if (c == '.') {
    return 27;
    }

    if ('a' <= c && c <= 'z') {
    return c - 'a' + 1;
    }

    return c;
    }

    static char b(int c) {

    if (c == 0) {
    return '_';
    }

    if (c == 27) {
    return '.';
    }

    if (1 <= c && c <= 26) {
    return (char) ((c - 1) + 'a');
    }

    return (char) c;
    }
    }

    javafx スクリプトエンジンがないので 2007/10/02

    むーん、調べてみたところ、現時点でmac osxではjava6はまだまだっぽい。次のosxがでるときにあわせてでてくれたらいいなぁという希望をもってはいますが。

    osxでeclipseで、javafxをFXShellを使わず実行してみたいです。
    java5です。

    javaFXはどこからダウンロードするのだろうと、悩みつつ、
    openjfx: ホーム
    からおとしてきました。

    で、含まれているjarはみっつ。
    Filters.jar
    javafxrt.jar
    swing-layout.jar
    これをビルドパスに通します。

    jarを覗きますと、net.java.javafx.jsr223.JavaFXScriptEngineというクラスがあります。
    スクリプトエンジンぽいです。というかスクリプトエンジンです。

    しかし、java5では、これは実行できません。

    evalあたりのコードをみて、を拝借して実行すれば動くようです。

    というわけで、作成。

    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;

    import javax.swing.SwingUtilities;

    import net.java.javafx.type.Module;
    import net.java.javafx.type.Value;
    import net.java.javafx.type.ValueList;
    import net.java.javafx.type.expr.CompilationUnit;
    import net.java.javafx.typeImpl.Compilation;
    import net.java.javafx.typeImpl.TypeFactoryImpl;

    public class Test {

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

    InputStream stream = Test.class.getResourceAsStream("test.fx");
    final Reader reader = new InputStreamReader(stream, "utf-8");

    SwingUtilities.invokeLater(new Runnable() {

    public void run() {
    Object object;
    try {
    object = eval(reader);
    System.out.println(object);
    System.out.println(object.getClass());
    } catch (Exception e) {

    throw new RuntimeException(e);
    }

    }

    });

    }

    public static Object eval(Reader reader) throws Exception {
    Module module;
    Compilation compilation;

    module = (new TypeFactoryImpl()).createModule();
    compilation = new Compilation(module);

    CompilationUnit compilationUnit = compilation.readCompilationUnit(
    "script", reader);
    ValueList result = null;

    result = compilationUnit.execute();

    if (result == null)
    return null;
    Object arr[] = new Object[result.getSize()];
    for (int i = 0; i < arr.length; i++) {
    Value value = result.getValue(i);
    arr[i] = value.get();
    if (arr[i] == null)
    arr[i] = value;
    }

    if (arr.length == 1)
    return arr[0];
    else
    return ((Object) (arr));
    }
    }


    それで、適当にjavaFXのコードを作成。

    import javafx.ui.*;
    Frame {
    title : "JavaFXテスト"
    width : 420
    height : 240
    content: Label {
    text: "OK みえました?"
    }
    centerOnScreen: true
    visible: true
    };


    なんとか動きました。

    最終目標はjavaFXとして動かすのではなく、javaアプリからjavaFXを必要なときに実行したいのですが、今度は、javaFXのオブジェクトの操作、javaFX側からデータオブジェクトの操作とかしないといけないんですよね。。。。
    ゆっくり考えよう。

    java5 + scriptengine ? - よくわからない 2007/10/02
    2007/10/02

    mac osxでまだjava6が利用できないっぽいので、java5でscriptengineを動かせないかと模索中。

    java scriptのプロジェクトホーム
    scripting: Project Home Page

    The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 223

    apple script!!
    jasconn: Java-AppleScript-Connector

    openjfx: ホーム

    で、何がしたいかというと、osx上で、javaアプリケーションから、ScriptEngineを通して、javaFXを実行したいだけなんだけど。スクリプトとして実行したいのです。

    あと、groovyからさらにjavaFXの実行とか。

    poj 2853は2140とほぼ同じ 2007/10/02

    poj 2853終了
    この問題は、2140と同じですね。
    ようやく51問終了


    参考
    Programming Challenge -PKU- - 2140 Herd Sums
    Untitled Document

    google-collections - java界の有名人が、開発しているそうです。 2007/10/02

    google-collections - Google Code

    via オレンジニュース

    java界の有名人が、開発しているそうです。
    Multimapありますね。

    コレクション関係では、ジャカルタのcommonsを自分的にはよく使用していますが、気になりますね。

    合同 2007/10/02

    8桁の数25x22341が11で割り切れるという。xはいくらか。チャレンジ!整数の問題100


    プログラムで解くなら、単純に0~9の値を入れてみて、11で割った商が0な値を求めるという方法が思いつきました。

    で、合同の性質を利用するなら、全ての桁の数を足して、11で割れるものをみつける。

    コードにしてみました。
    String s = "25x22341";

    char[] cs = s.toCharArray();

    int a = 0;
    for (char c : cs) {
    if(Character.isDigit(c)){
    a += Integer.parseInt(""+c);
    }
    }

    System.out.println(22 - a);

    poj 2196 2007/10/01

    よくよく考えるとさほど難しくない問題なはずであるが、何度もwrong answerだった理由は、discussをみて、解答の先入観ができてしまったことなのですね。

    これで49問終了。


    package p2196;

    public class Main {

    public static void main(String[] args) {
    int t, j;
    for (t = 2992; t < 10000; t++) {
    int a = 0, b = 0, c = 0;
    j = t;
    //
    a += b(t, 10, 4);
    a += b(t, 10, 3);
    a += b(t, 10, 2);
    a += b(t, 10, 1);
    b += b(t, 16, 4);
    b += b(t, 16, 3);
    b += b(t, 16, 2);
    b += b(t, 16, 1);
    c += b(t, 12, 4);
    c += b(t, 12, 3);
    c += b(t, 12, 2);
    c += b(t, 12, 1);

    if (a == b && b == c)
    System.out.println(t);

    }
    }

    static int b(int t, int i, int a) {
    int b = 1;
    int d = 1;
    for (int j = 0; j < a - 1; j++) {
    b *= i;
    }
    d = b * i;

    return (int) ((t % d) / b);
    }
    }