気付いたとき、気が向いたとき。by ykhr このページをアンテナに追加 RSSフィード

2014-07-15 ねむい

[]JavaでSCP 00:47 JavaでSCPを含むブックマーク

とりあえずやってみたってだけで、あってるかは不明。

ちゃんと使うには、もっと中身を覗いていかないとだめかも。

ライブラリ

ganymed-ssh-2 というのを使ってみる。

https://code.google.com/p/ganymed-ssh-2/

バージョンは(Mavenであがってた)262というもの。

ドキュメントがあまりなさそう(古いのはリソースがけっこうある?)で、妄想だけで作ってくのは辛いです・・・

サンプル

public static void main(String[] args) {
    
    Connection conn = null;
    try  {
        conn = new Connection("xxx.xxx.xxx.xxx");
        conn.connect();
        
        boolean auth = conn.authenticateWithPassword("hoge", "foo");
        if (!auth) {
            System.err.println("auth error.");
            return;
        }
        
        File file = new File("C:/tmp/sample.txt");
        SCPClient scp = conn.createSCPClient();
        
        try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
            SCPOutputStream out = scp.put(file.getName(), file.length(), "/home/hoge/", null);) {
            IOUtils.copy(in, out); // Commons IOを使う手抜き
        } 
        
    } catch(IOException e) {
        e.printStackTrace();
    } finally {
        if (conn != null) {
            conn.close();
        }
    }
}

ConnectionクラスはAutoCloseableを実装してない・・・Java7からだしね・・・

トラックバック - http://d.hatena.ne.jp/ykhr-kokko/20140715

2013-12-29 トラックポイント病

[][]Spring Batchでエラー時だけ特定の処理をする設定 14:28 Spring Batchでエラー時だけ特定の処理をする設定を含むブックマーク

こんな感じ?

<batch:job id="testJob">
	<batch:step id="test1">
		<batch:tasklet ref="hogeTasklet" />
		<batch:end on="*" />
		<!-- 次のstepがある場合は以下
		<batch:next on="*" to="test2" />
		-->
		<batch:next on="FAILED" to="errorStep" />
	</batch:step>
	<batch:step id="errorStep">
		<batch:tasklet ref="errorTasklet" />
	</batch:step>
</batch:job>

でも、今後stepが増えた際に、すべてのところでこういう風に書くのめんどいような。

StepListener使ったほうがいいのかなー。

トラックバック - http://d.hatena.ne.jp/ykhr-kokko/20131229

2013-12-19 まだ生きる

[]ジェネリクスむずかしい 11:32 ジェネリクスむずかしいを含むブックマーク

ちょっと悩んだメモ。

あくまでイメージコード

public void hoge1(List<? extends Serializable> list) {
	// List<List<? extends Serializable> では受け取れない
	List<?> list2 = foo(list);
}

public void hoge2(List<String> list) {
	List<List<String>> list2 = foo(list);
}

public <T extends Serializable> void hoge3(List<T> list) {
	List<List<T>> foo = foo(list);
}

public <T> List<List<T>> foo(List<T> list) {
	List<List<T>> result = new ArrayList<>();
	result.add(list);
	return result;
}

何を悩んだのかというと

インタフェースの定義としてどちらにしておくべきなのか?

public interface Foo {
	void hoge(List<? extends Serializable> list);
	<T extends Serializable> void hoge(List<T> list);
}

使う側からすれば変わらないような気がするけど・・・


これだと使う側に影響はある

なので意味はある。

public interface Foo {
	List<? extends Serializable> bar1(List<? extends Serializable> list);
	<T extends Serializable> List<T> bar2(List<T> list);
}
public void use() {
	Foo foo = ・・・
	List<String> list = new ArrayList<>();
	
	// List<String>で受けられない
	List<? extends Serializable> bar1 = foo.bar1(list);
	// List<String>で受けられる
	List<String> bar2 = foo.bar2(list);
}

bar1は、引数の?と戻り値の?が一緒の型であるって定義はしていない・・・から?

トラックバック - http://d.hatena.ne.jp/ykhr-kokko/20131219

2013-06-25 パズドラが忙しい

[][]riak-java-clientを使う 17:52 riak-java-clientを使うを含むブックマーク

RiakにJavaからアクセスするためのライブラリ https://github.com/basho/riak-java-client

をちょっと触ったのでメモ。

LowレベルとHighレベルの2種類のAPIがあるけど、今回は手軽に試せるHighレベルの方で。

つっこむデータの定義

アノテーションで色々指定できる。

IDはアノテーションでなくても指定するインタフェースがあるけど、とりあえずお試しなので。

デフォだとJSON形式で保存されて、マッピングなどは勝手にやってくれる。

基本的な型だったりネストとかしても、とりあえず大丈夫。

public class User {
    @RiakKey // Key
    public String id;
    
    @RiakIndex(name = "age") // Secondary Index
    public long age;
    
    @RiakLinks // Link
    public Collection<RiakLink> links;
}

処理

色々とはしょってるけど、まぁイメージってことで。

IRiakClient client = null;
try {
    client = RiakFactory.pbcClient("host", port);
    Bucket bucket = client.fetchBucket("test").execute();
    
    User user = new User();
    // ・・・略
    bucket.store(user).execute();
    
    // 1件取得
    User fetchUser = bucket.fetch("1000", User.class).execute();
    // 複数件取得
    List<MultiFetchFuture<User>> list = bucket.multiFetch(Arrays.asList(new String[]{"1000", "1001"}), User.class).execute();
    // indexで取得
    List<String> ids = bucket.fetchIndex(IntIndex.named("age_int")).from(30).to(50).execute();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    client.shutdown();
}

というわけで

  • けっこう簡単に使えていい感じ。マッピングとか勝手にやってくれて素敵。
  • IRiakClientは内部でPoolを持ってたりして設定などでPool数などを変更できる。
トラックバック - http://d.hatena.ne.jp/ykhr-kokko/20130625

2013-02-01 一応生きてます

[]ログ設定ファイルの環境変数での指定 10:06 ログ設定ファイルの環境変数での指定を含むブックマーク

いっつも忘れてぐぐるのでメモ。

-Dlogback.configurationFile=・・・
  • Log4j2
-Dlog4j.configurationFile=・・・
-Dlog4j.configuration=・・・

Log4j1と2で違うんかい

トラックバック - http://d.hatena.ne.jp/ykhr-kokko/20130201