ラベル java の投稿を表示しています。 すべての投稿を表示
ラベル java の投稿を表示しています。 すべての投稿を表示

2015年2月5日木曜日

Dropwizard-JAXWSのサンプルを動かす(メモ)

Dropwizard-JAXWSのサンプルを動かすまでにつまづいたのでメモ.

  1. ルートディレクトリに移動('dropwizard-jaxws', 'dropwizard-jaxws-example'が見える,githubからzip downloadした場合は'dropwizard-jaxws-master'ディレクトリ)
  2. mvn install -Djavax.xml.accessExternalSchema=all

'javax.xml.accessExternalSchema'の指定がない場合は'dropwizard-jaxws-example'の段階で以下の問題でと失敗する.
accessExternalSchemaプロパティで設定された制限により'file'アクセスが許可されていないため、スキーマ・ドキュメント'xjc.xsd'の読取りに失敗しました。
とりあえずこれで解決した.


ちなみにWSDLを表示するにはサービスに'?wsdl'をつける.
http://localhost:8080/soap/simple?wsdl

2015年1月20日火曜日

MacOSXのアプリのスタイルを使用してシェルスクリプトを実行します (例としてJavaApplicationStub劣化版)

タイトルの通りのプロジェクトをGitHubに作ってみた


注意

  • 環境 MacOSX 10.10.1 / Java 1.8.0_25
  • Finder上で,"〜.app"のフォルダ"入る際は,コンテクストメニュー(副(右)クリックで出るメニュー)の「パッケージの内容を表示」を用いる.
  • "ShellCommand_MacApp.app"をダブルクリックした際に「開発元が未確認のため開けません」とでることがある.コンテクストメニュー(副(右)クリックで出るメニュー)の「開く」で起動すると確認ダイアログで確認されたのちに起動させることができる.

作成

  1. build.xmlをエディタで開き,"javahome"のプロパティ値を環境に合わせて修正する.
  2. antを実行する.
    • ShellCommand_MacApp.app/Contents/Resources/Java/の下にShellCommand_MacApp.jarファイルができる
  3. ShellCommand_MacApp.appをダブルクリックして起動する.

動作

  • Windowが一つでる.
  • Dock内のアイコンを確認してみる.
  • Dock内のアイコン上のバッジを確認してみる.
  • メニューの"ShellCommand_MacApp / About ShellCommand_MacApp"を選択してみる.
  • メニューの"ShellCommand_MacApp / Preferences…"を選択してみる.
  • メニューの"ShellCommand_MacApp / Quti ShellCommand_MacApp"を選択してみる.

2015年1月19日月曜日

rJavaを用いたヒストグラム画像生成と,その画像によるパラパラ漫画

前回の「Rの作図によるパラパラ漫画」用のクラス(RBase)を用意して,それの拡張(RSample)で実行する形にしてみた.
実行のためのパラメータ類についてはrJavaを用いてJavaからRを動かしたPostと同様にR_HOME等を設定する.
(ファイルにPNG画像を書き出して読み込んで描画するを繰り返すので注意)



結果

2015年1月18日日曜日

math/R・rJavaでのPlot画像をJavaのPanelに貼り付ける

rJavaを用いてJavaからRを動かしたPostのRSampleと入れ替えてみる.
(ファイルにPNG画像を書き出して読み込んで描画するを繰り返すので注意)


結果

2015年1月11日日曜日

math/RでPlotをrJava経由でやってみる(SVG)

rJavaを用いてJavaからRを動かしたPostのRSampleと入れ替えてみる.


結果

<html><body>

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="504pt" height="504pt" viewBox="0 0 504 504" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z M 6.140625 -1.078125 "/>
</symbol>
…
<path style="fill:none;stroke-width:0.075;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(74.509804%,74.509804%,74.509804%);stroke-opacity:1;stroke-miterlimit:10;" d="M 59.039062 416.800781 L 473.761719 416.800781 "/>
</g>
</g>
</svg>

</body></html>


参考

math/RでPlotをrJava経由でやってみる

rJavaを用いてJavaからRを動かしたPostのRSampleと入れ替えてみる.


結果

<html><body><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAD8GlDQ1BJQ0MgUHJvZmlsZQA
…
IgAALGEUADbJzLUGAQAAEQAIEoEEADHAUvog4gAAIgAALGEfj/xnxImx+sxQYAAAAASUVORK5CYII="></body></html>


参考

2015年1月10日土曜日

math/Rで度数分布表をrJava経由でやってみる

前々回のRSampleと入れ替えてみる.


結果

R_HOME:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources
java.library.path:.:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources/library/rJava/jri
label=[0,6) freq=0.0 ratio=0.0
label=[6,12) freq=19.0 ratio=1.9E-4
label=[12,18) freq=1394.0 ratio=0.01394
label=[18,24) freq=12456.0 ratio=0.12456
label=[24,30) freq=36287.0 ratio=0.36287
label=[30,36) freq=35818.0 ratio=0.35818
label=[36,42) freq=12658.0 ratio=0.12658
label=[42,48) freq=1340.0 ratio=0.0134
label=[48,54) freq=28.0 ratio=2.8E-4
label=[54,60) freq=0.0 ratio=0.0
sigma1=0.72105
sigma2=0.97219
sigma3=0.99953

参考

math/Rでの関数モデルの当てはめをrJava経由でやってみる

前回のRSampleと入れ替えて,データファイル(dist.dat)を用意してみる.

src/rJava/RSample.java


dist.dat
0,22
1,25
2,28
3,19
4,20
5,18
6,18
7,12
8,15
9,11
10,22
11,16
12,19
13,22
14,18
15,10
16,16
17,11
18,11
19,11
20,10
21,15
22,12
23,10
24,10
25,11
26,12
27,10
28,7
29,8
30,10
31,11
32,9
33,6
34,9
35,10
36,11
37,6
38,5
39,6
40,8
41,10
42,15
43,7
44,5
45,3
46,4
47,2
48,5
49,9
50,3
51,7
52,6
53,5
54,5
55,1
56,7
57,5
58,5
59,4
60,3
61,2
62,2
63,7
64,4
65,4
66,9
67,5
68,7
69,6
70,6
71,2
72,2
73,2
74,3
75,2
76,1
77,2
78,4
79,1
80,3
81,1
82,3
83,3
84,4
85,2
86,4
87,6
88,0
89,7
90,3
91,3
92,3
93,2
94,8
95,0
96,0
97,2
98,3
99,3
100,4
101,5
102,1
103,3
104,3
105,1
106,3
107,3
108,0
109,3
110,4
111,1
112,2
113,0
114,3
115,2
116,0
117,2
118,2
119,0
120,1
121,1
122,2
123,1
124,2
125,2
126,3
127,3
128,0
129,1
130,3
131,1
132,4
133,2
134,0
135,1
136,1
137,1
138,2
139,1
140,1
141,0
142,2
143,0
144,0
145,0
146,2
147,0
148,0
149,0
150,2
151,0
152,0
153,0
154,0
155,4
156,1
157,0
158,0
159,1
160,1
161,1
162,1
163,0
164,0
165,0
166,1
167,1
168,1
169,1
170,1
171,0
172,0
173,0
174,0
175,1
176,0
177,0
178,0
179,0
180,0
181,2
182,1
183,0
184,1
185,2
186,0
187,0
188,0
189,0
190,0
191,0
192,1
193,2
194,0
195,0
196,1
197,0
198,0
199,0
200,1
201,0
202,0
203,1
204,1
205,0
206,0
207,0
208,1
209,0
210,0
211,0
212,1
213,0
214,0
215,1
216,0
217,0
218,0
219,0
220,0
221,1
222,0
223,0
224,0
225,0
226,0
227,0
228,0
229,0
230,0
231,0
232,0
233,0
234,0
235,0
236,0
237,0
238,0
239,0
240,0
241,0
242,0
243,0
244,0
245,0
246,0
247,1
248,1
249,1
250,0
251,0
252,0
253,0
254,0
255,0
256,0
257,0
258,0
259,0
260,0
261,0
262,0
263,0
264,0
265,0
266,0
267,0
268,0
269,0
270,0
271,0
272,0
273,0
274,0
275,0
276,0
277,0
278,0
279,0
280,0
281,0
282,0
283,0
284,0
285,0
286,0
287,0
288,0
289,0
290,0
291,0
292,0
293,0
294,0
295,0
296,0
297,0
298,0
299,0
300,0
301,0
302,0
303,0
304,0
305,0
306,0
307,0
308,0
309,0
310,0
311,0
312,0
313,0
314,0
315,0
316,0
317,0
318,0
319,0
320,0
321,1
322,0
323,0
324,0
325,0
326,1

結果

R_HOME:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources
java.library.path:.:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources/library/rJava/jri
a*x+b: a=-0.03550333158708252, b=8.498046248230285  (AIC 1712.5095155708004)
a*x^b: a=39.75900134122691, b=-0.5633965054825036  (AIC 1550.0470141120295)
a*b^x: a=21.2572188567732, b=0.9751177432706232  (AIC 1240.9971794263668)

参考

math/R 3.1.2 をJava 1.8.0_25 から使う (MacOSX 10.10.1 + Homebrew 0.9.5 + Eclipse 4.4.1)

  • Homebrew/r-command
    • $ brew tap homebrew/science
    • $ brew install r
    • $ R CMD javareconf JAVA_CPPFLAGS="-I/System/Library/Frameworks/JavaVM.framework/Headers -I/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk"
  • Eclipse
    • Java Projectを作る
    • BuildPathに追加する
      • /usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources/library/rJava/jri/JRI.jar
    • コードを追加する
      • src/rJava/RSample.java

    • 一度RSampleをJavaApplicationとして実行してしまって,JavaApplicationの実行パネルを作ってしまう
    • RunConfigureから上記で作成されたJavaApplicationのConfigureを選択し,以下を追加する
      • Argumentsタブ > "VM arguments:"
        • -Djava.library.path=.:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources/library/rJava/jri
      • Environmentタブ > "Environment variables to set:"
        • Variable:
          R_HOME
        • Value:
          /usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources
    • 再度RSampleを実行.

参考

2013年11月14日木曜日

Grails 2.3.2 + GGTS 3.4 環境でgenerate-allしてできたi18nのlang=jaが,上手く表示できなかったのを対応してみたのでメモ

  • Grails 2.3.3では文字化けしない.

tumblrにも書いたけど,こちらにもメモ.

  • 動機: こちらを参考に作業をしていたら,Grailsのバージョン違いのためか,i18nの関連で文字化けに出会って修正したのでメモ
  • 環境: Grails2.3.2+Eclipse4.3(Workspace内の文字コードはUTF-8)+GGTS3.4
  • 流れ?:
    1. Menu/File/New/Grails Project
      Project Name: GrailsApp
    2. ContextMenu/Grails Tools/Create Domain Class
      name: FileEntry
    3. 編集 'grails-app/domain/grailsapp/FileEntry.groovy'
      参考: ' http://www.ntts.co.jp/publish/column/tec/java_02/index_03.html '
    4. ContextMenu/Grails Tools/Open Grails Command Prompt
      grails > generate-all grailsapp.FileEntry
    5. ContextMenu/Grails Tools/Open Grails Command Prompt
      grails > run-app
  • 結果1: ' http://localhost:8080/GrailsApp/fileEntry/index?lang=jp 'にアクセス→文字化け
    • responseのheaderに'Content-Type : text/html;charset=ISO-8859-1'という指定がでている
  • 対応:
    1. メソッドを一つ追加 'grails-app/controllers/grailsapp/FileEntryController.groovy'
      package grailsapp
      …
      class FileEntryController {
       …
       def beforeInterceptor = {
        response.setCharacterEncoding("UTF-8")
       }
       …
      }
      
  • 結果2: ' http://localhost:8080/GrailsApp/fileEntry/index?lang=jp 'にアクセス→改善
    • responseのheaderに'Content-Type : text/html;charset=UTF-8'で正しい指定になってる
アレコレやってみたが上手くいったのはこれ.
もっと賢い設定があるようにも思う.

2013年10月12日土曜日

先のPOST( SADI service の hello )をTomcatで動かしてみる

参考:
先のPOST

結果:
webapps以下にsaid-servicesを用意して配置


手順:
  1. ${TOMCAT_HOME}/webappsに'sadi-services'ディレクトリを用意(${TOMCAT_WEBAPPS_SADI-SARVICES}とする)する
  2. Eclipseのsadi-servicesプロジェクト(${ECLIPSE_SADI-SARVICES}とする)から
    'said-services'ディレクトリ(${TOMCAT_WEBAPPS_SADI-SARVICES})に以下を持ってくる
    • ${ECLIPSE_SADI-SARVICES}/src/main/webapp/index.jsp
      → ${TOMCAT_WEBAPPS_SADI-SARVICES}/index.jsp
    • ${ECLIPSE_SADI-SARVICES}/src/main/webapp/WEB-INF
      → ${TOMCAT_WEBAPPS_SADI-SARVICES}/WEB-INF
    • ${ECLIPSE_SADI-SARVICES}/target/classes
      → ${TOMCAT_WEBAPPS_SADI-SARVICES}/WEB-INF/classes
  3. 'sadi-services'ディレクトリ(${TOMCAT_WEBAPPS_SADI-SARVICES})に
    'lib'ディレクトリを用意( ${TOMCAT_WEBAPPS_SADI-SARVICES}/lib )する
  4. 'lib'ディレクトリ( ${TOMCAT_WEBAPPS_SADI-SARVICES}/lib )に上記画像にある各jarを複写する
    • それぞれのjarは,先のPOSTを実行しているのであれば,$HOME/.m2/repositoryの下に入っています.
    • commons-httpclient-*, xlightweb-*-taverna, xSocket-*は'/sadi-services/hello?xsl'にアクセスしなければ(Firefoxで開かなければ)いらない(かも)

もっと簡単な手順:
  1. Eclipseのsadi-servicesプロジェクト(${ECLIPSE_SADI-SARVICES}とする)に移る.
    $ cd ${ECLIPSE_SADI-SARVICES}
  2. mavenのpackageコマンドを実行する
    $ mvn package
  3. targetディレクトリにプロジェクト名のwarができてる.
    $ ls target/sadi-services.war
  4. このwarをTomcatのwebappsにおけばTomcatが展開するので,動かせる
    (EclipseのJavaとTomcatのJavaのヴァージョンの差異に注意)
    $ cp -p target/sadi-services.war ${TOMCAT_HOME}/webapps/


もっとちょっと簡単な手順:
  1. Eclipseのメニューから'Run > Run Configureations …'を選択
  2. ダイアログ中,左ペインで'Maven Build'を選択
  3. ダイアログ中,左ペイン,上部の左隅アイコン('New launch configuration')を押す
  4. ダイアログ中,左ペイン,'Maven Build > New_configuration (1)'が追加されたので選択
  5. ダイアログ中,右ペインを編集

  6. 'Run'を押す
  7. メニューから'File > Refresh'を選択
  8. targetディレクトリにプロジェクト名のwar( 'sadi-services.war' )ができてる.
  9. このwarをTomcatのwebappsにおけばTomcatが展開するので,動かせる
    (EclipseのJavaとTomcatのJavaのヴァージョンの差異に注意)

2013年10月11日金曜日

先のPOST( SADI service の hello )のクライアントをJavaで作ってみる

参考:
先のPOST

Build Path周り:
を,含むプロジェクト全体の図.
  • それぞれのjarは,先のPOSTを実行しているのであれば,$HOME/.m2/repositoryの下に入っています.
  • 面倒なら先のプロジェクトに居候してしまえばパスは通っているので簡単かもしれません.
  • コードをパッと見るとsadi-clientとjenaがあればよさそうですが,依存関係の都合で色々いれなくてはなりませんでした.


("slf4j-api-*.jar"だけでなく, "slf4j-log4j12-*.jar"が必要な場合もあるようです)

コード(Client.java):

package sample;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import ca.wilkinsonlab.sadi.SADIException;
import ca.wilkinsonlab.sadi.client.ServiceImpl;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;

public class Client {

 public static void main(String[] args) throws SADIException, IOException {
  Model inputModel = ModelFactory.createDefaultModel();
  if (true) {
   Resource type = ResourceFactory
     .createResource("http://sadiframework.org/examples/hello.owl#NamedIndividual");
   Resource s = inputModel
     .createResource(
       "http://sadiframework.org/examples/hello-input.rdf#1",
       type);
   s.addProperty(
     inputModel.createProperty("http://xmlns.com/foaf/0.1/name"),
     "Guy Incognito");
  } else {
   inputModel.read(new FileInputStream(new File("./hello-input.rdf")),
     "", "RDF/XML");
  }
  inputModel.write(System.out, "RDF/XML");

  String serviceURI = "http://localhost:8080/sadi-services/hello";
  ServiceImpl service = new ServiceImpl(serviceURI);

  Model outputModel = service.invokeServiceUnparsed(inputModel);
  outputModel.write(System.out, "RDF/XML");
 }
}

結果:
当たり前だけど, service側が動いている前提です.

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://xmlns.com/foaf/0.1/"
    xmlns:j.1="http://sadiframework.org/examples/hello.owl#" > 
  <rdf:Description rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
    <j.0:name>Guy Incognito</j.0:name>
    <rdf:type rdf:resource="http://sadiframework.org/examples/hello.owl#NamedIndividual"/>
  </rdf:Description>
</rdf:RDF>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://sadiframework.org/examples/hello.owl#" > 
  <rdf:Description rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
    <j.0:greeting>Hello, Guy Incognito!</j.0:greeting>
    <rdf:type rdf:resource="http://sadiframework.org/examples/hello.owl#GreetedIndividual"/>
  </rdf:Description>
</rdf:RDF>

先のPOST( SADI service の hello )から真似っこだけで,数値2入力の足し算サービスを追加してみる

Owlを用意( ./sample.owl ):
てきとーに書いてみた(後の行程からみて間違ってるかも).

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:owl="http://www.w3.org/2002/07/owl#">

  <owl:Ontology rdf:about="">
  </owl:Ontology>

  <owl:Class rdf:ID="inputValues">
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:onProperty rdf:resource="#number1"/>
        <owl:someValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#int"/>
      </owl:Restriction>
    </owl:equivalentClass>
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:onProperty rdf:resource="#number2"/>
        <owl:someValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#int"/>
      </owl:Restriction>
    </owl:equivalentClass>
  </owl:Class>
  
  <owl:Class rdf:ID="outputValue">
    <owl:equivalentClass>
      <owl:Restriction>
        <owl:onProperty rdf:resource="#result"/>
        <owl:someValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#int"/>
      </owl:Restriction>
    </owl:equivalentClass>
  </owl:Class>

</rdf:RDF>



サービスのコードを生成する:
やり方は先のPOST参照のこと.パラメータは以下の通り.

serviceName : add
serviceClass: com.example.AddService
inputClass  : file:./sample.owl#inputValues
outputClass : file:./sample.owl#outputValue
contactEmail: your-email-address (そのままでも実行できる / エンドポイントにて連絡先として公開される)


サービスのコードを修正・実装する:
AddService.java中の'static final class Vocab {'を修正する.
  • 'public static final Resource int ='と変数名が型になってしまったので'int'を'intType'と変更

 static final class Vocab {
  private static Model m_model = ModelFactory.createDefaultModel();

  public static final Property result = m_model
    .createProperty("file:./sample.owl#result");
  public static final Property number1 = m_model
    .createProperty("file:./sample.owl#number1");
  public static final Property number2 = m_model
    .createProperty("file:./sample.owl#number2");
  public static final Resource outputValue = m_model
    .createResource("file:./sample.owl#outputValue");
  public static final Resource intType = m_model
    .createResource("http://www.w3.org/2001/XMLSchema#int");
  public static final Resource inputValues = m_model
    .createResource("file:./sample.owl#inputValues");
 }

AddService.java中の'public void processInput(Resource input, Resource output)'を実装する.

 public void processInput(Resource input, Resource output) 
 {
  int n1 = input.getProperty(Vocab.number1).getInt();
  int n2 = input.getProperty(Vocab.number2).getInt();
  int result = n1 + n2;
  output.addProperty(Vocab.result, result + "");
 }


サービスを起動する:
やり方は先のPOST参照のこと.

Firefoxでアクセスすると( http://localhost:8080/sadi-services/add ):



curlを使ってアクセスしてみる:

$ cat add-input.rdf 
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:sample="file:./sample.owl#">

 <sample:inputValues rdf:about="file:./sample.owl#1">
  <sample:number1>1000000000</sample:number1>
  <sample:number2>20</sample:number2>
 </sample:inputValues>

</rdf:RDF>
$ curl -d '@add-input.rdf' http://localhost:8080/sadi-services/add
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="file:./sample.owl#">
  <j.0:outputValue rdf:about="file:./sample.owl#1">
    <j.0:result>1000000020</j.0:result>
  </j.0:outputValue>
</rdf:RDF>

SADI (Semantic Automated Discovery and Integration) の service skeleton (Java) を試す(Eclipse+m2e環境で)

参考:
Generating the SADI service code / BuildingServicesInJava / Tutorial: building a SADI service in Java.


環境:
  • Mavenを使えるようにした(m2eプラグインだったと思う)Eclipse(Kepler/4.3)
  • m2eupdate site情報


ダウンロード:


プロジェクトを作る:
  1. メニューから'File > Import'を選択
  2. ダイアログ中から'Existing Projects into Workspace'を選択
  3. ダイアログ中の'Select archive file:'にdownloadした'sadi-service-skeleton-*.zip'を設定
  4. ダイアログ中の'Finish'ボタンを押す.



サービスのコードを生成する:
  1. メニューから'Run > Run Configurations …'を選択
  2. ダイアログ中,左ペインから'Maven Build > generate sadi service'を選択


  3. ダイアログ中,右ペインのパラメタを修正
    
    serviceName : hello
    serviceClass: com.example.HelloWorldService
    inputClass  : http://sadiframework.org/examples/hello.owl#NamedIndividual
    outputClass : http://sadiframework.org/examples/hello.owl#GreetedIndividual
    contactEmail: your-email-address (そのままでも実行はできる / エンドポイントにて連絡先として公開される)
    (コピペ等で最初や最後に空白が入っていると失敗します)
    



  4. ダイアログ中の'Run'ボタンを押す
  5. 生成ファイルを確認するためにメニューから'File > Refresh'を選択
  6. ファイルを確認
    src/main/javaにcom.exampleパッケージのHelloWorldService.javaができている.
    src/main/webapp/WEB-INF/web.xmlが作られ(無い場合),hello Servletの設定が追加されている.
    src/main/webapp/index.jspが作られ(無い場合),“./hello”へのリンク(サービスのエンドポイント)が追加されている.
    



  7. ちなみに http://sadiframework.org/examples/hello.owl の中身はこんなの
    
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
        xmlns:owl="http://www.w3.org/2002/07/owl#">
        
      <owl:Ontology rdf:about="">
      </owl:Ontology>
      
      <owl:DatatypeProperty rdf:about="http://xmlns.com/foaf/0.1/name">
       <rdfs:isDefinedBy rdf:resource="http://xmlns.com/foaf/0.1/index.rdf"/>
      </owl:DatatypeProperty>
      
      <owl:DatatypeProperty rdf:about="#greeting"/>
      
      <owl:Class rdf:ID="NamedIndividual">
        <owl:equivalentClass>
          <owl:Restriction>
            <owl:onProperty rdf:resource="http://xmlns.com/foaf/0.1/name"/>
            <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int">1</owl:minCardinality>
          </owl:Restriction>
        </owl:equivalentClass>
      </owl:Class>
      
      <owl:Class rdf:ID="GreetedIndividual">
        <owl:equivalentClass>
          <owl:Restriction>
            <owl:onProperty rdf:resource="#greeting"/>
            <owl:someValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
          </owl:Restriction>
        </owl:equivalentClass>
      </owl:Class>
      
      <owl:DatatypeProperty rdf:about="#lang"/>
      
      <owl:Class rdf:ID="SecondaryParameters">
        <owl:equivalentClass>
          <owl:Restriction>
            <owl:onProperty rdf:resource="#lang"/>
            <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int">1</owl:minCardinality>
          </owl:Restriction>
        </owl:equivalentClass>
      </owl:Class>
      
    </rdf:RDF>
    


サービスのコードを実装する:
HelloWorldService.java中の'public void processInput(Resource input, Resource output)'を実装する.

 public void processInput(Resource input, Resource output) 
 {
  String name = input.getProperty(Vocab.name).getString(); 
  output.addProperty(Vocab.greeting, String.format("Hello, %s!", name));
 }


サービスを起動する:
  1. メニューから'Run > Run Configurations …'を選択
  2. ダイアログ中,左ペインから'Maven Build > run sadi services in Jetty'を選択


  3. ダイアログ中,'Run'ボタンを押す
これでサービスの開始.

Firefoxでアクセスした場合( http://localhost:8080/sadi-services/hello ):


Safariでアクセスした場合はRDFが返ってくる:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="?xsl" ?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:mygrid="http://www.mygrid.org.uk/mygrid-moby-service#"
    xmlns:j.0="http://protege.stanford.edu/plugins/owl/dc/protege-dc.owl#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <mygrid:serviceDescription rdf:about="">
    <mygrid:hasOperation>
      <mygrid:operation>
        <mygrid:outputParameter>
          <mygrid:parameter>
            <mygrid:objectType rdf:resource="http://sadiframework.org/examples/hello.owl#GreetedIndividual"/>
          </mygrid:parameter>
        </mygrid:outputParameter>
        <mygrid:inputParameter>
          <mygrid:parameter>
            <mygrid:objectType rdf:resource="http://sadiframework.org/examples/hello.owl#NamedIndividual"/>
          </mygrid:parameter>
        </mygrid:inputParameter>
      </mygrid:operation>
    </mygrid:hasOperation>
    <mygrid:providedBy>
      <mygrid:organisation>
        <mygrid:authoritative rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean"
        >false</mygrid:authoritative>
        <j.0:creator rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
        >your-email-address</j.0:creator>
      </mygrid:organisation>
    </mygrid:providedBy>
    <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >hello</rdfs:label>
    <mygrid:hasServiceNameText rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >hello</mygrid:hasServiceNameText>
  </mygrid:serviceDescription>
</rdf:RDF>


比較テストがあるのでやってみる:
  1. メニューから'Run > Run Configurations …'を選択
  2. ダイアログ中,左ペインから'Maven Build > test sadi service'を選択


  3. ダイアログ中,右ペインのパラメタを修正
    
    serviceURL: http://localhost:8080/sadi-services/hello
    input     : http://sadiframework.org/test/hello-input.rdf
    expected  : http://sadiframework.org/test/hello-output.rdf (比較対象/予定されている出力(を,
    Modle.write()で書き出し直したモノ)
    



  4. ちなみにhello-input.rdfの中身はこんなの

    
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:foaf="http://xmlns.com/foaf/0.1/"
        xmlns:hello="http://sadiframework.org/examples/hello.owl#">
    
     <hello:NamedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
      <foaf:name>Guy Incognito</foaf:name>
     </hello:NamedIndividual>
    
    </rdf:RDF>
    

    さらにちなむと,これをcom.hp.hpl.jena.rdf.model.Modelのreadメソッド読み込んでwriteメソッドで書き出すと以下のようになる.
    
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:foaf="http://xmlns.com/foaf/0.1/"
        xmlns:hello="http://sadiframework.org/examples/hello.owl#" > 
      <rdf:Description rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
        <foaf:name>Guy Incognito</foaf:name>
        <rdf:type rdf:resource="http://sadiframework.org/examples/hello.owl#NamedIndividual"/>
      </rdf:Description>
    </rdf:RDF>
    
  5. ちなみにhello-output.rdfの中身はこんなの

    
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:j.0="http://sadiframework.org/examples/hello.owl#" > 
      <rdf:Description rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
        <j.0:greeting>Hello, Guy Incognito!</j.0:greeting>
        <rdf:type rdf:resource="http://sadiframework.org/examples/hello.owl#GreetedIndividual"/>
      </rdf:Description>
    </rdf:RDF>
    
  6. ダイアログ中,'Run'ボタンを押す
上手く行けばConsoleに'[INFO] BUILD SUCCESS'と出ている.


curlを使ってアクセスしてみる:

$ cat hello-input.rdf
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:foaf="http://xmlns.com/foaf/0.1/"
    xmlns:hello="http://sadiframework.org/examples/hello.owl#">

 <hello:NamedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
  <foaf:name>Guy Incognito</foaf:name>
 </hello:NamedIndividual>

</rdf:RDF>
$ curl -d '@hello-input.rdf' http://localhost:8080/sadi-services/hello
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://sadiframework.org/examples/hello.owl#">
  <j.0:GreetedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
    <j.0:greeting>Hello, Guy Incognito!</j.0:greeting>
  </j.0:GreetedIndividual>
</rdf:RDF>

2回分並べて入力してみる:

$ cat hello-input2.rdf
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:foaf="http://xmlns.com/foaf/0.1/"
    xmlns:hello="http://sadiframework.org/examples/hello.owl#">

 <hello:NamedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
  <foaf:name>Guy Incognito</foaf:name>
 </hello:NamedIndividual>

 <hello:NamedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#2">
  <foaf:name>Gal Incognito</foaf:name>
 </hello:NamedIndividual>

</rdf:RDF>
$ curl -d '@hello-input2.rdf' http://localhost:8080/sadi-services/hello
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://sadiframework.org/examples/hello.owl#">
  <j.0:GreetedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#2">
    <j.0:greeting>Hello, Gal Incognito!</j.0:greeting>
  </j.0:GreetedIndividual>
  <j.0:GreetedIndividual rdf:about="http://sadiframework.org/examples/hello-input.rdf#1">
    <j.0:greeting>Hello, Guy Incognito!</j.0:greeting>
  </j.0:GreetedIndividual>
</rdf:RDF>

2012年9月28日金曜日

別のRDFS推論を試す(三段論法?) / openrdf-sesame 2.6.9のjar

前々回参考サイトにある別のRDFS推論(3段論法的?)を試す.
RDFS推論 以下のN3ファイルから
@prefix kb:  <http://knowledgebooks.com/ontology#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/#> .

foaf:Person rdfs:subClassOf foaf:Agent .
kb:KnowledgeEngineer rdfs:subClassOf foaf:Person .

<http://www.markwatson.com/index.rdf> a kb:KnowledgeEngineer .
次のSPARQL Queryを実行して
PREFIX foaf:  <http://xmlns.com/foaf/0.1/#>
   SELECT ?subject ?predicate WHERE { ?subject ?predicate foaf:Agent . }
foaf:Agentとして以下を得る.
 http://xmlns.com/foaf/0.1/#Person http://www.w3.org/2000/01/rdf-schema#subClassOf
 http://xmlns.com/foaf/0.1/#Agent http://www.w3.org/2000/01/rdf-schema#subClassOf
 http://knowledgebooks.com/ontology#KnowledgeEngineer http://www.w3.org/2000/01/rdf-schema#subClassOf
 http://www.markwatson.com/index.rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#type
下記のような関係を見つけることになる.
コード
ファイル読み込みではなく,途中トリプルを一つ一つ入れて(赤い部分)みた.
import java.io.File;
import java.io.IOException;
import java.util.List;

import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.query.BindingSet;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.sail.SailRepositoryConnection;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFParseException;
import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer;
import org.openrdf.sail.memory.MemoryStore;

public class Sesame_Test {

 /**
  * @param args
  * @throws RepositoryException
  * @throws IOException
  * @throws RDFParseException
  * @throws QueryEvaluationException
  * @throws MalformedQueryException
  */
 public static void main(String[] args) throws RepositoryException,
   RDFParseException, IOException, MalformedQueryException,
   QueryEvaluationException {
  MemoryStore ms = new MemoryStore();
  ForwardChainingRDFSInferencer fci = new ForwardChainingRDFSInferencer(
    ms);
  SailRepository myRepository = new SailRepository(fci);
  myRepository.initialize();
  SailRepositoryConnection con = myRepository.getConnection();
  
  if (true) {
   {
    Resource s = new URIImpl("http://xmlns.com/foaf/0.1/#Person");
    URI p = new URIImpl(
      "http://www.w3.org/2000/01/rdf-schema#subClassOf");
    Value o = new URIImpl("http://xmlns.com/foaf/0.1/#Agent");
    con.add(s, p, o);
   }
   {
    Resource s = new URIImpl(
      "http://knowledgebooks.com/ontology#KnowledgeEngineer");
    URI p = new URIImpl(
      "http://www.w3.org/2000/01/rdf-schema#subClassOf");
    Value o = new URIImpl("http://xmlns.com/foaf/0.1/#Person");
    con.add(s, p, o);
   }
   {
    Resource s = new URIImpl("http://www.markwatson.com/index.rdf");
    URI p = new URIImpl(
      "http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
    // The 'a' in Notation3 format means the
    // 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' in URI;
    Value o = new URIImpl(
      "http://knowledgebooks.com/ontology#KnowledgeEngineer");
    con.add(s, p, o);
   }
  } else {
    File file = new File("rdf_files/class_example.n3");
    con.add(file, null, RDFFormat.N3);
  }
  
  String sparql_query = "PREFIX foaf:  <http://xmlns.com/foaf/0.1/#>";
  sparql_query += " SELECT ?subject ?predicate WHERE { ?subject ?predicate foaf:Agent . }";
  TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL,
    sparql_query);
  TupleQueryResult result = tupleQuery.evaluate();

  try {
   List<String> bindingNames = result.getBindingNames();
   while (result.hasNext()) {
    BindingSet bindingSet = result.next();
    int size2 = bindingSet.size();
    for (int i = 0; i < size2; i++) {
     System.out.print('\t' + bindingSet.getValue(
       bindingNames.get(i)).stringValue());
    }
    System.out.print('\n');
   }
  } finally {
   result.close();
  }
 }
}
jarは前々回を参照してもらうか,めんどくさければopenrdf-sesame-2.6.9-sdk.zip展開後のlibフォルダにあるの全部.

2012年9月27日木曜日

openrdf-sesae 2.6.9のjarを用いてRDFS推論の例を真似してみた(だけ).

参考 Java/JRuby開発者のためのセマンティックWeb入門
参考サイトのRDFS推論の例の実行をopenrdf-sesame 2.6.9のjarで試みる
news.n3を読み込み次のsparql queryによって結果を得る
sparql query
PREFIX kb:  <http://knowlegebooks.com/ontology/#> SELECT ?subject ?object WHERE { ?subject kb:containsPlace ?object . }
news.n3 (参考サイトのサンプルソース内ファイル.以下は参照サイトのリスト5にある同ファイルの最初の数行)
@prefix kb: <http://knowledgebooks.com/ontology#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

kb:containsCity rdfs:subPropertyOf kb:containsPlace .
kb:containsCountry rdfs:subPropertyOf kb:containsPlace .
kb:containsState rdfs:subPropertyOf kb:containsPlace .

<http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 /> kb:containsCity "Burlington" , "Denver" , "St. Paul" , "Chicago" , "Quincy" , "CHICAGO" , "Iowa City" ;
  kb:containsRegion "U.S. Midwest" , "Midwest" ;
  kb:containsCountry "United States" , "Japan" ;
  kb:containsState "Minnesota" , "Illinois" , "Mississippi" , "Iowa" ;
  kb:containsOrganization "National Guard" , "U.S. Department of Agriculture" , "White House" , "Chicago Board of Trade" , "Department of Transportation" ;
  kb:containsPerson "Dena Gray-Fisher" , "Donald Miller" , "Glenn Hollander" , "Rich Feltes" , "George W. Bush" ;
  kb:containsIndustryTerm "food inflation" , "food" , "finance ministers" , "oil" .

上記部分だけではあるが,図示すると以下の2つの図のようになる.
(ただし,
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX kb: <http://knowledgebooks.com/ontology#>
)


( predicateとしてkb:containsPlaceというURIは,このnews.n3ファイルにはない.)

やったこと
1. Eclipse内にJava Project('Sesame_Test')を作成.
2. openrdf-sesame-2.6.9/libをImport.
3. lib/sesame-query*.jar, lib/sesame-repository-*.jar, lib/sesame-rio-*.jar, lib/sesame-sail-*.jar, lib/sesame-util-*.jar, lib/slf4j-api-*.jarをBuild Pathに追加.
4. 参照サイトのサンプルソース内'rdf_files/news.n3'をImport.
5. Sample_Test.javaクラスを作成.
import java.io.File;
import java.io.IOException;
import java.util.List;

import org.openrdf.query.BindingSet;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.sail.SailRepositoryConnection;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFParseException;
import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer;
import org.openrdf.sail.memory.MemoryStore;

public class Sesame_Test {

 private static SailRepository myRepository;
 private static SailRepositoryConnection con;

 /**
  * @param args
  * @throws RepositoryException
  * @throws IOException
  * @throws RDFParseException
  * @throws QueryEvaluationException
  * @throws MalformedQueryException
  */
 public static void main(String[] args) throws RepositoryException,
   RDFParseException, IOException, MalformedQueryException,
   QueryEvaluationException {
  MemoryStore ms = new MemoryStore();
  ForwardChainingRDFSInferencer fci = new ForwardChainingRDFSInferencer(
    ms);
  myRepository = new SailRepository(fci);
  myRepository.initialize();
  System.out.println(myRepository);
  con = myRepository.getConnection();

  File file = new File("rdf_files/news.n3");
  con.add(file, null, RDFFormat.N3); //the news.n3 file doesn't require the 'baseURI'. (?)

  String sparql_query = "PREFIX kb: <http://knowledgebooks.com/ontology#> SELECT ?subject ?object WHERE { ?subject kb:containsPlace \"Japan\" . }";

  TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL,
    sparql_query);
  TupleQueryResult result = tupleQuery.evaluate();
  
  try {
   List<String> bindingNames = result.getBindingNames();
   while (result.hasNext()) {
    BindingSet bindingSet = result.next();
    int size2 = bindingSet.size();
    for (int i = 0; i < size2; i++) {
     String val = bindingSet.getValue(bindingNames.get(i))
       .stringValue();
     System.out.print('\t');
     System.out.print(val);
    }
    System.out.print('\n');
   }
  } finally {
   result.close();
  }
 }

}

ここまでのプロジェクトの状態(Package Explorer)


結果(最初の数行)
 http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 / Burlington
 http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 / Denver
 http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 / St. Paul
 http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 / Chicago
 http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 / Quincy
…

news.n3でなく,rdfs.ntとnews.ntをそれぞれ読み込んむ場合は上記コードの赤色部分を以下のように変更する.
(rdfs.nt, news.nt内では'knowledgebooks.com/ontology'に関するURI先頭が'http://'でなく'http:://'となっているのでsparql queryも変更)
  File rdfs_file = new File("rdf_files/rdfs.nt");
  con.add(rdfs_file, null, RDFFormat.NTRIPLES); //the rdfs.nt file doesn't require the 'baseURI'. (?)
  File news_file = new File("rdf_files/news.nt"); 
  con.add(news_file, null, RDFFormat.NTRIPLES); //the news.nt file doesn't require the 'baseURI'. (?)

  String sparql_query = "PREFIX kb: <http:://knowledgebooks.com/ontology#> SELECT ?subject ?object WHERE { ?subject kb:containsPlace ?object . }";


2010年6月30日水曜日

NyMmdに影行列をやってみる

追記(2010/07/05): ARTK_MMDのコードではrenderForShadowってのがあって影行列適応時はこっちで描いてた.



動機
前回の続き.


やってみた
0. 以前の状況からスタート.


1. jp.nyatla.nymmd.test.MmdTest.javaの編集
1.1 MmdTestクラスにフィールドの追加
private float[] ShadowMatrix_ary = new float[16]; //影行列4x4


1.2 MmdTestクラスにメソッド追加
 private static void CalcShadowMatrixf(float[] planeAry, float[] lightPosAry,
float[] shadowMatrixAry) {
float dot = 0.0f;
for (int i = 0; i < 4; i++) {
dot += planeAry[i] * lightPosAry[i];
}

for (int loopY = 0; loopY < 4; ++loopY) {
for (int loopX = 0; loopX < 4; ++loopX) {
shadowMatrixAry[loopY * 4 + loopX] = -planeAry[loopY]
* lightPosAry[loopX];
if (loopX == loopY) {
shadowMatrixAry[loopY * 4 + loopX] += dot;
}
}
}
}

1.3 MmdTestクラス'public void init(GLAutoDrawable drawable);'メソッドの最後, 'return;'直前に以下を追加.
  {
_gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
float plane_ary[] = { 0.0f, 1.0f, 0.0f, 0.0f };
_gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, fLightPos, 0);
fLightPos[2] *= -1.0f;
CalcShadowMatrixf(plane_ary, fLightPos, ShadowMatrix_ary);
}

1.4 MmdTestクラス'public void display(GLAutoDrawable drawable):'メソッドの'this._render.render();'直後に以下を追加.
   {
_gl.glDisable(GL.GL_LIGHTING);
_gl.glDisable(GL.GL_LIGHT0);
_gl.glPushMatrix();
_gl.glMultMatrixf(ShadowMatrix_ary, 0);
_gl.glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
//_gl.glColor4f(0.4f, 0.4f, 0.4f, 1.0f);
this._render.render();
_gl.glPopMatrix();
_gl.glEnable(GL.GL_LIGHTING);
_gl.glEnable(GL.GL_LIGHT0);
}


2. 実行
2.1 “VM arguments:に'-Djava.library.path=./lib'を入れる”を忘れずに.
2.2 pmd, vmdの順でファイルを指定する.


結果
できた(pmd: '初音ミク'(MMD添付モデル),vmd: '【MMD】みくみくにしてあげる♪【してやんよ】【Project DIVA】' 感謝).


モデルによっては明るめの色(0.4, 0.4, 0.4)を影に指定しても問題なさそう.テクスチャの有無が問題かしら?影に色がついてしまうモデルもあった.
内部で指定しているのだろうか?'_gl.glDisable (GL.GL_TEXTURE_2D);'とかは意味なかったな.はて?


追記
jp.nyatla.nymmd.MmdPmdRenderGL.javaのMmdPmdRenderGLクラスにあるrenderメソッド内でテクスチャの有無でgl.glEnable(GL.GL_TEXTURE_2D);を呼び出している箇所があった.
そこでこのメソッドの呼び出し時のGL_TEXTURE_2Dの状態に応じて,実行するかどうか判定するようにした.
で.影の描画時にはコード側でglDisable(GL.GL_TEXTURE_2D)としてからrenderメソッドを呼ぶようにしてあげた.
これで前述の影に色がついてしまうモデルでも色がつかず,指定した影の色での描画となることができた(pmd: '初音ミクmetal'(MMD添付モデル),vmd: '【MMD】みくみくにしてあげる♪【してやんよ】【Project DIVA】' 感謝).


jp.nyatla.nymmd.MmdPmdRenderGL.java MmdPmdRenderGLクラス renderメソッド内
   boolean b = gl.glIsEnabled(GL.GL_TEXTURE_2D);
if (条件 && b == true) {
// テクスチャあり

} else {
// テクスチャなし

}
…描画他…
if (b) {
gl.glEnable(GL.GL_TEXTURE_2D);
}



jp.nyatla.nymmd.test.MmdTest.java MmdTestクラス displayメソッド内
   {
_gl.glDisable(GL.GL_LIGHTING);
_gl.glDisable(GL.GL_LIGHT0);
_gl.glDisable(GL.GL_TEXTURE_2D);
_gl.glPushMatrix();
_gl.glMultMatrixf(ShadowMatrix_ary, 0);
//_gl.glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
_gl.glColor4f(0.4f, 0.4f, 0.4f, 1.0f);
this._render.render();
_gl.glPopMatrix();
_gl.glEnable(GL.GL_LIGHTING);
_gl.glEnable(GL.GL_LIGHT0);
_gl.glEnable(GL.GL_TEXTURE_2D);
}


影行列をJOGLでやってみた

動機
これに影とかつけたいなー.
OpenGLでどうやるんだろうー.影行列っていうのをつかうみたいだなー.
解説サンプルが載ってる.
JOGLでやってみよう!.


感謝
解説サンプル掲載ありがとうございます!



やってみた
JOGLの環境については以前のモノ等を参照してください.

上記サイトのサンプルの設定
光源位置(7, 5, 5)、平面の方程式 y + 1 = 0とした時に、
物体を描画し、平面「y + 1 = 0」に影を描画せよ。

これをJOGLでやってみたい.


ただここでは描画対象を球に変更し,光源を高さ(y)5の平面上の半径8の円周上でグルグル回しています.
tの上限とか見てないぐらい'てきとー'

コード
import java.awt.Frame;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.FloatBuffer;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.GLUquadric;
import com.sun.opengl.util.FPSAnimator;

public class Sample implements GLEventListener {

private final static int SCREEN_X = 640;
private final static int SCREEN_Y = 480;
float ShadowMatrix_ary[] = new float[16];
float plane_ary[] = { 0.0f, 1.0f, 0.0f, 1.0f };
float light_pos_ary[] = { 8.0f, 5.0f, 0.0f, 1.0f };
FloatBuffer light_pos = FloatBuffer.wrap(light_pos_ary);
float OffsetFactor = 1.0f;
float OffsetUnit = 0.0f;
float floorcolor_ary[] = { 0.8f, 0.8f, 0.8f, 1.0f };
FloatBuffer floorcolor = FloatBuffer.wrap(floorcolor_ary);
float red_ary[] = { 0.8f, 0.2f, 0.2f, 1.0f };
FloatBuffer red = FloatBuffer.wrap(red_ary);
private FPSAnimator animator;
private double t;

public Sample() {
Frame frame = new Frame("Sample JOGL");
frame.setVisible(true);
Insets ins = frame.getInsets();
frame.setSize(SCREEN_X + ins.left + ins.right, SCREEN_Y + ins.top
+ ins.bottom);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
GLCanvas canvas = new GLCanvas();
frame.add(canvas);
canvas.addGLEventListener(this);
canvas.setBounds(ins.left, ins.top, SCREEN_X, SCREEN_Y);
}

public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
{
gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_pos);
gl.glEnable(GL.GL_DEPTH_TEST);
}
CalcShadowMatrixf(plane_ary, light_pos_ary, ShadowMatrix_ary);
animator = new FPSAnimator(drawable, 60);
animator.start();
t = 0.0f;
}

public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
GL gl = drawable.getGL();
GLU glu = new GLU();
gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(30.0, (double) w / (double) h, 1.0, 100.0);
gl.glMatrixMode(GL.GL_MODELVIEW);
}

public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
GLU glu = new GLU();
light_pos_ary[0] = Double.valueOf(9.0 * Math.cos(t)).floatValue();
light_pos_ary[2] = Double.valueOf(9.0 * Math.sin(t)).floatValue();
t+= 0.01;
CalcShadowMatrixf(plane_ary, light_pos_ary, ShadowMatrix_ary);

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
glu.gluLookAt(6.0, 7.0, 8.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
float xAngle = 0f;
float yAngle = 0f;
gl.glRotated(xAngle, 1, 0, 0);
gl.glRotated(yAngle, 0, 1, 0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_pos);
{
// 床を描画
gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
gl.glPushMatrix();
gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, floorcolor);
gl.glPolygonOffset(OffsetFactor, OffsetUnit);
if (true) {
gl.glTranslatef(0, -1, 0);
gl.glRotatef(90, -1, 0, 0);
gl.glNormal3d(0, 0, 1);
gl.glRectf(-5, 5, 5, -5);
}
gl.glPopMatrix();
gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
}
{
// 通常の描画
gl.glPushMatrix();
gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, red);
if (true) {
GLUquadric qobj0 = glu.gluNewQuadric();
glu.gluQuadricDrawStyle(qobj0, GLU.GLU_FILL);
glu.gluQuadricNormals(qobj0, GLU.GLU_SMOOTH);
glu.gluSphere(qobj0, 0.8f, 20, 20);
// glutSolidTeapot(1);
}
gl.glPopMatrix();
}
{
// 影の描画
gl.glDisable(GL.GL_LIGHTING);
gl.glDisable(GL.GL_LIGHT0);
gl.glPushMatrix();
gl.glMultMatrixf(ShadowMatrix_ary, 0);
gl.glColor3d(0, 0, 0);
if (true) {
GLUquadric qobj0 = glu.gluNewQuadric();
glu.gluQuadricDrawStyle(qobj0, GLU.GLU_FILL);
glu.gluQuadricNormals(qobj0, GLU.GLU_SMOOTH);
glu.gluSphere(qobj0, 0.8f, 20, 20);
// glutSolidTeapot(1);
}
gl.glPopMatrix();
gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
}
}

void CalcShadowMatrixf(float[] planeAry, float[] lightPosAry,
float[] shadowMatrixAry) {
float dot = 0.0f;
for (int i = 0; i < 4; i++) {
dot += planeAry[i] * lightPosAry[i];
}
for (int loopY = 0; loopY < 4; ++loopY) {
for (int loopX = 0; loopX < 4; ++loopX) {
shadowMatrixAry[loopY * 4 + loopX] = -planeAry[loopY]
* lightPosAry[loopX];
if (loopX == loopY) {
shadowMatrixAry[loopY * 4 + loopX] += dot;
}
}
}
}


@Override
public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
//
}

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




結果


2010年6月9日水曜日

NyARToolkit + NyMmd をやってみた ( MacOSX 10.6 ( Snow Leopard ) / Eclipse )

追記(2010/06/13):'やってみた(2010/06/13 追加)'を追加

追記(2010/06/10):'やってみた(追加)'を修正



動機
元動画のようにARToolkit(前回(NyARToolkit)),とMMD(前々回(NyMmd))をくっつけたい!


感謝
各種リソース作者やマトメ等記事を書かれている方に感謝


やってみた
0. 前回前々回がそれぞれできていること.

1. NyARToolkit側の前回実行に用いたjp.nyatla.nyartoolkit.jogl.sample.JavaSimpleLite.javaを編集していくのでNyARToolkitプロジェクトにNyMmdプロジェクトのクラスパスを追加する.

1.a プロジェクトの'Properties'で'Java Build Path'タブを開き'Add Class Folder…'ボタンで選択ダイアログを出す.

1.b NyMmdプロジェクトのbinフォルダを選択し,追加する.


1.c NyMmdプロジェクト中のMmdフォルダ(pmd, vmdを入れたフォルダ)をNyARToolkitプロジェクトルートにDnD等で複写する.
1.c NyARToolkitプロジェクトルートにMmdフォルダを作成し,pmd, vmdファイル(およびテクスチャ)をDnD等で配置する.
 2.eのコードで調整してもらってもよい.


2. jp.nyatla.nyartoolkit.jogl.sample.JavaSimpleLite.javaを編集

2.a NyMmdプロジェクトのjp.nyatla.nymmd.test.MmdTest.javaより
 MmdTestクラス中のinit(GLAutoDrawable drawable)メソッドをJavaSimpleLiteクラスに複写する.
 ただし同名のメソッド名は既にあるので'mmd_'というprefixをつけて'mmd_init(…)'にする.

2.b NyMmdプロジェクトのjp.nyatla.nymmd.test.MmdTest.javaより
 MmdTestクラス中のdisplay(GLAutoDrawable drawable)メソッドをJavaSimpleLiteクラスに複写する.
 ただし同名のメソッド名は既にあるので'mmd_'というprefixをつけて'mmd_display(…)'にする.

2.c NyMmdプロジェクトのjp.nyatla.nymmd.test.MmdTest.javaより
 MmdTestクラス中の以下のフィールド定義をJavaSimpleLiteクラスに複写する.

  • animation_start_time

  • _pmd

  • _vmd

  • _player

  • _render

  • _data_io

  • prev_time



2.d NyMmdプロジェクトのjp.nyatla.nymmd.test.MmdTest.javaより
 FileIOクラスをJavaSimpleLiteファイルに複写する.

2.e 以下のメソッドをに追加
 private void init_mmd_files() {
String pmd_file = "./Mmd/pmdfile.pmd";
String vmd_file = "./Mmd/vmdfile.vmd";
try {
this._pmd = new MmdPmdModel(new FileInputStream(pmd_file));
this._vmd = new MmdVmdMotion(new FileInputStream(vmd_file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MmdException e) {
e.printStackTrace();
}
this._player = new MmdMotionPlayer(this._pmd, this._vmd);
this._player.setLoop(true);
File f = new File(pmd_file);
this._data_io = new FileIO(f.getParentFile().getPath());
}


2.f JavaSimpleLiteクラスのdisplayメソッド中でdrawCubeメソッドを呼ぶところをコメントアウトする.
 直後に
  
mmd_display(drawable);

 を追加する.

2.g JavaSimpleLiteクラスのinitメソッド中最後のreturn直前にある
 _animatorフィールドへの値の代入と同フィールドインスタンスのメソッド呼び出しをコメントアウトする.
 直後に
  
mmd_init(drawable);

 を追加する.

2.h JavaSimpleLiteクラスのコンストラクタの中,
 最初に
  
mmd_init_files();

 を追加する.

2.i mmd_displayメソッド内で以下の修正を加える.

  • glClearメソッドを用いている行をコメントアウトする.

  • glLoadIdentityメソッドを用いている行をコメントアウトする.

  • glTranslatefメソッドを用いている行をコメントアウトする.

  • glScalefで1.0,1.0,1.0としているところをモデルに合わせて調整する.0.1, 0.1, 0.1など

  • 上記直後にx軸を90度まわしてやる.
    _gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);




2.j mmd_initメソッド内で以下の修正を加える.

  • 光源位置のZ軸を負にしてあげる



3.実行
前回同様VM引数として'-d32 -Djava.library.path=./library:./lib'を与えて実行



やってみた(追加)
カメラ目線モード(?)を実行するにはJavaSimpleLiteクラスmmd_displayメソッド中の
以下のコメントアウト行の下に
// this._player.updateNeckBone(100.0f,10f,10f);

次のコードを追加してみた.
   float x = (float) __display_wk[12];
float y = (float) __display_wk[13];
float z = (float) __display_wk[14];
this._player.updateNeckBone(-x, -y, -z);


それっぽく見えるときもあるんだけどやっぱり違うのかな,所々おかしな方向向いているきもする.


やってみた(追加)
モデル側座標系でみたカメラ(グローバル)側座標系の原点ということだろう.ということで以下のように訂正.

カメラ目線モード(?)を実行するにはJavaSimpleLiteクラスmmd_displayメソッド中の
以下のコメントアウト行の下に
// this._player.updateNeckBone(100.0f,10f,10f);

次のコードを追加してみた.
   NyARMat a = new NyARMat(4, 4);
double[][] a_ary = a.getArray();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
a_ary[j][i] = __display_wk[j * 4 + i];
}
}
a.matrixSelfInv();
float x = (float) a_ary[3][0];
float y = (float) a_ary[3][1];
float z = (float) a_ary[3][2];
this._player.updateNeckBone(x, y, z);


どうだろう?
(NyARMat aはフィールドにする方がよいかもね)


やってみた(2010/06/13 追加)
上のやつをちょっと書き換えてみた.
   float m[] = new float[16];
_gl.glGetFloatv(GL.GL_MODELVIEW_MATRIX, m, 0);
NyARMat a = new NyARMat(4, 4);
double[][] a_ary = a.getArray();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
a_ary[j][i] = m[j * 4 + i];
}
}

a.matrixSelfInv();

double[] o = { 0.0, 0.0, 0.0, 1.0 };
double[] v = { 0.0, 0.0, 0.0 };
//o[2] = 10 * Math.sin(iTime / 1000.0);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
v[i] += a_ary[j][i] * o[j];
}
}

float x = (float) v[0];
float y = (float) v[1];
float z = (float) v[2];

this._player.updateNeckBone(x, y, z);

2010年6月8日火曜日

NyARToolkit for Java 2.3.2 を MacOSX/Eclipse でやってみた.'再: NyARToolkit for Java: QtJavaで読み込んで JOGLで書き出す'

動機
二年ぐらい前の怪しいエントリーOpenCV/JNIを利用したのと合わせて前回ぐらい簡単に書き直せないかしら.


感謝
各リンク先リソースに感謝!


やってみた
0. EclipseにJavaプロジェクトを作成
0.a ファイルのエンコーディングを'UTF-8'にしておく.


1. OpenCV
1.a OpenCV.Frameworkの取得とインストール
こちらのサイトの'1. Begin by downloading and installing the implementation of OpenCV appropriate to your platform:'のFor MacOSXの通りに実行
1.b OpenCV.jarの取得
こちらのサイトの'2. Download, unzip, and move the OpenCV Processing Library into your Processing libraries folder, or for Java users copy the content of the library folder in one of your Java Extensions folder.'の'OpenCV Processing Library'部のアンカーからopencv_01.zipをdownload.
1.c OpenCV.jarの設置
展開した中にある'library'フォルダをプロジェクトルートへDnD等で設置
library/OpenCV.jarをbuild pathに追加


2. JOGL
2.a 取得
こちらのサイトのjogl-1.1.1-macosx-universal.zip)をdownload.
2.b 設置
展開した中にある'lib'フォルダをプロジェクトルートへDnD等で設置
lib/gluegen-rt.jar, lib/jogl.jarをbuild pathに追加


3. NyARToolkit
3.a 取得
こちらのサイトよりNyARToolkit for Java - NyARToolkit CoreのNyARToolkit-2.5.2.zipをdownload
3.b 設置
展開した中にある'Data'フォルダをプロジェクトルートへDnD等で設置
展開した中にある'src/jp'フォルダをソースフォルダへDnD等で設置
展開した中にある'src.util/qt/jp'フォルダをソースフォルダへDnD等で設置
jp.nyatla.nyartoolkit.qt.utils packgageの QtCameraCapture.java削除
展開した中にある'src.util/jogl/jp'フォルダをソースフォルダへDnD等で設置
展開した中にある'sample/jogl/jp'フォルダをソースフォルダへDnD等で設置
jp.nyatla.nyartoolkitjogl.sample packageのJavaSimpleLite.javaを除いて削除(この時点ではJavaSimpleLite.javaにはエラーが出ているはず.)

3.c 追加
こちらの'Eclipse/09. Create the 'test.CameraCapture.java' file.'と同じように'text.CameraCapture.java'という以下のファイルを追加作成する

3.d 編集
jp.nyatla.nyartoolkitjogl.sample.JavaSimpleLite.javaを編集

  • 'JmfCaptureListener'を'QtCaptureListener'へ置換

  • 'JmfNyARRaster_RGB'を'QtNyARRaster_RGB'へ置換

  • 'JmfCaptureDevice'を'CameraCapture'へ置換

  • 'JavaSimpleLite'クラスの'onUpdateBuffer'メソッドの引数の型を'Buffer'から'byte[]'へ置換

  • 'JavaSimpleLite'クラスの'onUpdateBuffer'メソッド内,QtNyARRaster_RGBインスタンスのsetBufferメソッドをwrapBufferメソッドに置換


  • ここまでで残るはキャプチャとラスタの準備部だけがエラーになっているはず


  • で該当部をザックリコメントアウトして以下の様に追加する
    _capture = new CameraCapture(SCREEN_X, SCREEN_Y, 30f);
    _capture.setCaptureListener(this);
    _cap_image = new QtNyARRaster_RGB(SCREEN_X, SCREEN_Y);


  • あとはCARCODE_FILEとCARCODE_FILEの相対パスを"../../Data…"から"./Data…"に置き換える


ここまでのプロジェクトの状態


4. 実行
jp.nyatla.nyatoolkit.jogl.sample.JavaSimpleLite.javaを実行
実行時にはVM引数として'-d32 -Djava.library.path=./library:./lib'をつける.