Javaの最近のブログ記事

cronで毎日とか毎時とかに指定したJavaを実行する時に注意しなきゃいけないのが、
PATHがすべてリセットされるということ。



なので、cronでは直接javaの実行コマンドを書かずに、
.shファイルに設定やjavaコマンドを記述し、その.shをcronで叩くようにする。



.shファイル
#!/bin/bash
PATH=/usr/java/latest/bin
JAVA_HOME=/usr/java/latest
CLASSPATH=.:/usr/java/latest/lib

#Linuxでjniを使う場合 LD_LIBRARY_PATH=/usr/lib
#Macでjniを使う場合 #DYLD_LIBRARY_PATH =/usr/lib java ・・・



javaコマンドの引数でパスを指定する場合は、
CLASSPATH -> -cp=ほげほげ
LD_LIBRARY_PATH -> -Djava.library.path=ふがふが

とすればおk



(追記)





前回は、JSONのデータをStringプリミティブにそのラッパー
そしてJavaBeansの命名規則にそったクラスのオブジェクトに
自動変換してくれるってとこまでやりました!!



今回は、JSONのキー名とJavaのフィールド名のマッピングや、
JSONのキー名の先頭を大文字にしたクラス名以外のJavaクラスへのマッピングの方法のメモだよ!!




・JSONのキーを、Javaの任意のフィールドにマッピングする
例えば、サンシャイン牧場では1つ1つの畑にインデックスが振られていて、
1: {
  畑の情報
}, 
2: {

みたいになってたのね。

でも、Javaのフィールド名に1とか2とか付けれないじゃん!!
なので、JSONの1の値をJavaのfarm1に代入する方法を書くよ!!


まずは、前回の復習で、String jsonにJSON形式のデータが文字列で入っていて、
それを、Hogeクラスのオブジェクトにマッピングするには、
とするよ!!


んで、本題のJSONのキー"1"をJavaのfarm1にマッピングするには、
JavaIdentifierTransformerクラスのtransformToJavaIdentifier()関数をオーバーライドして
条件式を記述する。
そしてそのインスタンスをJsonConfigクラスのsetJavaIdentifierTransformer()を使って、
JsonConfigオブジェクトにセットする。





・Javeのフィールド名を、任意のJavaクラスにマッピングする
デフォルトだと、Javaのhogeフィールドには、HogeクラスのオブジェクトやintやStringの値が
マッピングされるんだけど、

hogeもfooもBarクラスのオブジェクトに変換したいんだよー!!

という時のマッピング方法は、↑のようにJsonConfigを用いて


とすればおk



<参考>

JSONのフォーマットをした文字列をJavaのオブジェクトに変換するには、
JSON-libというライブラリを使えばおk


ただ、このJSON-libは、その他いくつかのライブラリに依存しているので、
そのライブラリもパスに通す必要がある。



なので、JSON-libを使うのに必要なのは、ココにいっぱい書かれてるけど、
とりあえず、↓を入れておけば動く

net.sf.ezmorph:ezmorph:jar




使い方は、簡単!

特に、データ型がプリミティブやStringなら超簡単!!
※JSONで値がない時に"NULL"が入る時は、intじゃなくてIntegerの用にラッパークラスにした方がいいかも


Beanクラスのフィールドがネスト(?)してても全然おk
ただしネストしてる場合は、デフォルトではフィールド名に対応したクラスのオブジェクトが入る。
例えば、フィールド名がhogeなら、プリミティブかHogeクラスのオブジェクトに変換される。




あ、読みやすさの為に載せてないけど、きちんと
toString()とかhashCode()とかequals()とかをオーバーライドした方がいいです。はい。



なんかどうでもいいネタかもだけど、
あとで忘れた時に調べ直すのめんどくさいからめもりんぐ

前にサンシャイン牧場のbotを作ろうとした時にはまったコト!!



Javaで、ウェブのクローンとかする時に、HTTPサーバーが空気を読んでトラフィックに優しいgzipでデータを送ってきた時に、そのままだとうまくデータを解析できない!!




でも、やり方は簡単♪
InputStreamとInputStreamReaderの間にGZIPInputStreamのクッションを挟むだけ!!



・Before


・After


以上でっす。


ジェネリクス対応のクラスやメソッドを作る時のためのメモ


・クラスで使う


・メソッドで使う




・クラス名を指定して、ArrayListで返す。


ここで、リストの要素として、T型のオブジェクトをnewしたい時に、
huga.add(nwe T());とすると、コンパイルエラー。


なので、
type.newInstance();
で作る!!


ただ、こいつは、
InstantiationExceptionとIllegalAccessExceptionを投げつけるので、
try ~ catchが必要。

毎回try ~ catchを書くのは面倒なので外だし




で、

とかする。

エラー出ても、とりあえず全力でスルーするけど、
そのあとにぬるぽになるから注意www


あと、<? extends Hoge>とかやると、Hogeとそのサブクラスはおk的なことができたり、
<? extends Object>や<?>なんかだと何でもありだったり、

あと、
(T[]) Array.newInstance(type, DEFAULT_LENGTH);
とかでTの配列がnewできたりするらしい。



メモ終わり。



<参考>
【コラム】ライトニングJava (24) Generic Java(5) - Genericを使ってAPIを作成する その2
http://journal.mycom.co.jp/column/java/024/index.html

【コラム】ライトニングJava (25) Generic Java(6) - Genericを使ってAPIを作成する その3
http://journal.mycom.co.jp/column/java/025/index.html

Java総称型メモ(Hishidama's Java Generics Memo)
http://www.ne.jp/asahi/hishidama/home/tech/java/generics.html

Javaの理論と実践: Generics、了解!
http://www.ibm.com/developerworks/jp/java/library/j-jtp01255/

404 shin1のつぶわき ないわー Not Found: Genericsにてnew T()できないのがキモイ
http://shin1o.blogspot.com/2008/02/genericsnew-t.html



P.S.
早く就活終わってほしい・・・
もっとプログラム書きたいよー涙(仕事以外で)

昨夜の第64回Flex3勉強会で、taigaさんがEclipse(FlexBuilder)でのソースコードをスクリーンに映す際に、
Elcpseのツールバー上のフォントサイズを拡大・縮小するボタンを使っていて、

プレゼンとかLiveCodingの時、めっちゃ便利そう!!


んで、taigaさんに、puluginの名前を聞いたら、

EclipseのWTPのAll in Oneに入ってるよ!!
名前は・・・、わからん!!


って言われたので、Google先生に教えてもらいました!!


このプラグインの名前は、


Font Size Changer!!!(そのままww



sourceforgeのココからダウンロードできるので、
落としてきたzipを解凍して、できたデータをeclipseのpluginフォルダと、featureフォルダに入れればおk


使い方は、EclipseのfocusされているViewに対し、
・A▲ボタンで、フォント拡大
・A▼ボタンで、フォント縮小
・Aボタンで、デフォルトサイズ

fontsizechanger.png



(追記)
EclipseがEcplisとなっていた、脱字バグを修正!!
All-in-Oneのところに、"WTPの"を追加!!

(追記2)
MacのEclipseや、FlexBuilderのスタンドアロン版でも動作を確認!!!


AS3はXMLを扱うのがとっても簡単で、
XMLのインスタンスを作る時も、
xmlファイルからでも、mxmlのタグからでも、xml形式のStringからでも、Httpのレスポンスからでも、
どれでも簡単!!!

[Flex][AIR] ActionScript3でXMLを操作する時に気をつけること
にもちょっと書いてるよ!!



んで、久々にJava書いてみたんだけど、JavaでXMLってチョーめんどくさい><


2分木とかN分木とかみたいなのを、↓のクラスみたいに、

文字列 valueと子供へのポインタ(配列)を持つデータ構造で作りたくって、

元となるvalueとかをString配列とかしちゃうと階層が深くなるにつれ、ツライ思いをしなくちゃいそうだから

JavaでXMLとかあんまり使ったことなかったけど、階層構造は扱いやすいと思ってXMLでやってみようと試みました!!

try 〜ingしました!!



そしたら、めっちゃだるかった(´・ω・`)

try 〜ingのつもりが、気がついたらtry to 〜になってたよ!!!



だから、次にやる時のためにメモする!!φ(..)メモメモ

でも、"次"は来ないことを心からお祈り申し上げますm(_ _)m



本格的にやる時は、xmlファイル作って、Fileオブジェクト作って、FileInputStreamを作って・・・ってなるんだろうけど、

そんなに大きいデータじゃないし、xmlファイル作るのめんどくさいし、1つの.javaファイルで完結したいし、try 〜ingだし、AS3みたいにStringから作ってみよー♪


ってことで、





AS3だったら、そもそもXMLのままでの簡単にいじれちゃうから、わざわざこんなEntityに変換しなくてもいいのに!!!



ブログ用にちょっとデータ変えたから、うまく動かなかったらごめんんさい!!!笑


Googleでtomcat eclipse pluginとかで検索すると上位のものがリンク切れで、毎回だるい思いをしてるのでメモ


ここにある
http://www.eclipsetotale.com/tomcatPlugin.html


それだけ笑
JNI(Java Native Interface)とかいうのを使って、JavaからC++の関数を呼ぶまでの手順。




①Javaでnative methodを持つクラスを作る。
public class Hoge {

    static {
        System.loadLibrary("Hoge");
    }

    public native String hogehoge();
}

②コンパイル
$ javac Hoge.java

③ヘッダファイルを作成
$ javah -jni Hoge

これでHoge.hが生成される。

④C/C++でhogehogeメソッドを実装
#include "Hoge.h"

JNIEXPORT jstring JNICALL Java_Hoge_hogehoge(JNIEnv *env, jobject obj) {
        return env->NewStringUTF("huga");
}

⑤コンパイルして、ダイナミックリンクライブラリを生成
$ gcc -fPIC -g -I/System/Library/Frameworks/JavaVM.framework/Headers -c Hoge.cpp
$ gcc -lstdc++ -bundle -o libHoge.jnilib Hoge.o

⑥Javaでmainを作る。
public class Bar {
        public static void main(String args[]) {
                Hoge jni = new Hoge();
                System.out.println(jni.hogehoge());
        }
}

⑦コンパイルして、実行
$ javac Bar.java
$ java Bar

 hugaって表示されればおk



<参考>
JavaでHello World JNI編
JavaでJNIを使ってみる(3) | サラトガIT日記




Windowsマシンから、同じくWindowsのファイルサーバにjava.io.Fileでアクセスすると、
Javaプログラムが走っているマシンにログインさせたユーザの権限で共有ファイルにアクセスする。

つまり、
ファイルサーバにAとBというディレクトリがあり、aさんでログインしたマシンではディレクトリAにアクセスでき、bさんでログインしたマシンからではディレクトリBにアクセスできるとする。

このとき、aさんでログインしたマシン上で動いてるJavaからはjava.io.FileでAにはアクセスできる。
ここで、aさんでログインした状態で、ディレクトリBにアクセスする方法のメモ



まず、java.io.Fileには認証機能が存在しないので、JCIFS(The Java CIFS Client Library)というライブラリをダウンロードし、クラスパスを通す必要がある。

jcifs.smb.SmbFileやjcifs.smb.SmbFileInputStreamなどは、java.io.Fileやjava.io.FileInputStreamと同じように扱える。


ここで、認証の仕方が2種類見つかったので、2つとも¢(. .。)メモメモ

<条件>
ディレクトリBのpath:¥¥fileserver¥B
fileserverのIP:192.168.0.1
bのユーザー名:hoge
bのパスワード:foo
   +
上の例の条件


<方法①>


以上(笑)

これ以降は、jcifs.smb.SmbFileを使って、java.io.Fileと同じように、ディレクトリ内のファイルのリスト(SmbFile配列)を取得したり、ファイル名とかファイルサイズを取得したりする。

ちなみに、アクセス権の内ディレクトリにアクセスしようとすると、Exceptionが投げられる
また、SmbFileを使ってユーザbを認証している間は、SmbFileではAにアクセスできない。Fileではできる。

<方法②>
jcifs.smb.SmbFileの他にjcifs.Configを使って




<参考>
java:jcifs [Paulownia.jp]
試験管のなかのコード :: JCIFSにチャレンジ

このアーカイブについて

このページには、過去に書かれたブログ記事のうちJavaカテゴリに属しているものが含まれています。

前のカテゴリはiPhoneです。

次のカテゴリはjava-jaです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.0