Hatena::ブログ(Diary)

めざせ!細マッチョ このページをアンテナに追加 RSSフィード Twitter

id:quitada
リーン・スタートアップワークショップ with Pivotal Labshttps://codechrysalis.connpass.com/event/60365/
Spring
Spring Data Gemfire の cache-config.xml ファイルにおける PDX 設定http://d.hatena.ne.jp/quitada/20170605/p1
Geode
Apache Geode で gfsh 使って積極的に JSON 形式のデータを扱ってみるhttp://d.hatena.ne.jp/quitada/20170520/p1

2017-06-05 今日の些末な IT 技術的アウトプット

[] Spring Data Gemfire の cache-config.xml ファイルにおける PDX 設定

Pivotal GemFire 9.0.3 を Spring Data Gemfire 2.0.0 M3 で弄る機会がありまして、ちょっと個人的にはまったことについてメモです。

Spring Data Gemfire + Spring Boot で Spring Bootable な cache-config.xml なしのアプリ記述するのがクールかもしれないけど、とりあえず Pivotal GemFire の cache.xml 設定を Spring Data Gemfire の cache-config.xml移植してみようと思いまして、PDX 設定でちょっとまりました。

cache.xml で以下の感じで、ReflectionBasedAutoSerializer を使って何も考えずにパッケージが io.quitada.* なクラスから生成されたオブジェクトシリアライズ・デシリアライズする設定がありがちですね。

    <pdx read-serialized="false">
        <pdx-serializer>
            <class-name>
                com.gemstone.gemfire.pdx.ReflectionBasedAutoSerializer
            </class-name>
            <parameter name="classes">
                <string>io.quitada.*</string>
            </parameter>
        </pdx-serializer>
    </pdx>

これを Spring Data Gemfire の cache-config.xml表現したいと思ったわけです。Spring Data Gemfire の場合はまず、cache の設定の属性として PDX 関連の設定をして、シリアライザークラスは別途 Bean を定義して pdx-serializer-ref に当該 Bean ID指定シリアライズ対象クラス定義した Bean の constructor-arg指定しておくと良いみたいです。

    <gfe:client-cache id="client-cache" properties-ref="client-properties" pool-name="myPool"
                      pdx-read-serialized="false" pdx-serializer-ref="pdxAutoSerializer" />

    <bean id="pdxAutoSerializer" class="org.apache.geode.pdx.ReflectionBasedAutoSerializer">
        <constructor-arg value="io.quitada.*" />
    </bean>

はまったのはシリアライズ対象クラスの設定方法です。これ、ドキュメントに書いてますかねー?ぐはぁ…。こちらに設定例ありますが…。

対象クラス指定複数行う場合(GemFire の cache.xml はカンマ区切りでこれもあまりドキュメントにきちんと書いてないような…)、以下のように array を使ってやると良いみたいです。

    <bean id="pdxAutoSerializer" class="org.apache.geode.pdx.ReflectionBasedAutoSerializer">
        <constructor-arg>
            <array>
                <value>io.quitada1.*</value>
                <value>io.quitada2.*</value>
                <value>io.quitada3.*</value>
            </array>
        </constructor-arg>
    </bean>

2017-05-20 今日の IT 技術アウトプット

[] Apache Geode で gfsh 使って積極的JSON 形式データを扱ってみる

Apache Geode に gfsh というコマンドラインツール付属してますが、ドキュメントによると以下のようなイメージJSON 形式でのデータ投入ができるようなんですよね。

put --key=1 --value=('name':'quitada','title':'Inchiki Developer','age':44) --region=/MyRegion

JSONフォーマット使用する、ダブルクォートとか波括弧は gfsh のコマンドラインでは別の意味もつ記号なんで、代わりにシングルクォートと括弧に置き換えてますが、ようするに以下の JSON 形式データApache Geode に作ってあるであろう MyRegion というリージョンに対して "1" というキーに対するバリューとして投入するイメージです。

{
  "name":"quitada",
  "title":"Inchiki Developer",
  "age":44
}

キーにもバリュー同様、JSON 形式指定することできますが、まー、普通キー・バリューストア系のデータベースキーに複雑な構造指定することはないでしょう。

ただ、上述の例だと String 型の文字列としてリージョンに入ってしまい、クエリーとかもナイスにできないのです。ドキュメントに詳しく書いてないのですが、どうやら --value-classデータマッピングを行う対象ドメインクラス名を指定すると、対象ドメインクラスのフィールド変数指定した値を割り当てドメインオブジェクトを生成、リージョンに格納してくれるようです。そうすると、表向き JSON 形式データを取り扱い、Java オブジェクトとして扱うことで Apache Geode のクエリー機能とかも使えるようになります

例えば、上述の例だと以下のように、Javaドメインクラス記述ます。そして、コンパイルしてキャッシュサーバークラスパスに入れます(あるいは、jar でかためて gfsh deploy コマンドサーバー配備)。

package quitada;

/**
 * Created by quitada on 17/05/20.
 */
public class MyData {
    private String name = null;
    private String title = null;
    private Integer age;

    public MyData(){}

    public MyData(String name, String title, Integer age){
        this.name = name;
        this.title = title;
        this.age = age;
    }

    public String getName(){
        return this.name;
    }

    public String getTitle(){
        return this.title;
    }

    public Integer getAge(){
        return this.age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return new String("[MyData(name = " + name + "/title = " + title+"/age = " + age.toString() + ")]");
    }
}

で、以下のコマンドを実行すると、フィールド変数 name に quitada、title に Inchiki Developer、age に 44 と代入してリージョンに投入してくれるわけです。

put --key=1 --value=('name':'quitada','title':'Inchiki Developer','age':44) --region=/MyRegion --value-class=quitada.MyData

ドキュメントに詳しく書いてなくて、ソースコードよくみてないのでよくわからないのですが、配列とかネストした JSON 形式データからドメインオブジェクトへのマッピングは無理っぽかったです。少なくとも、RDBMS のようなフラットなテーブルみたいな構造マッピングできます(値は、文字列とか数値に限定されますが)。

そうなってくると、クライアント Java アプリケーションからJSON 形式前提でデータの出し入れとかクエリーをしたくなりますApache Geode では、org.apache.geode.pdx.JSONFormatter というクラスが用意されていて、JSON 文字列から Apache Geode に格納するための Java オブジェクト、あるいはその逆の変換が可能です。それを使ってやりましょう。

せっかくなんで、gfsh で一通りの環境を作ってみましょうか。

まずはロケーターとサーバー x2 を起動しますサーバー x1 でももっと多くでもどうでもいいんですが、この例では Partitioned リージョン使うのでなんとなく)。gfsh を使って起動できますが、それは割愛ますドキュメントみましょう。

次に、クライアントアプリケーションで JSONFormatter を使うということは、対象リージョンは PdxInstance でオブジェクトを扱うことが前提となるので PDX の設定にて --read-serialized=true、また上述の例ででてきた quitada.MyData というクラスを PDX による自動シリアライズ対象にするため --auto-serializable-classes も設定します。以下、gfsh コマンドインタラクティブモードからコマンド実行例です(リージョンデータと PDX メタデータ永続化してあります)。

create disk-store --name=pdx --dir=pdx
configure pdx --read-serialized=true --disk-store=pdx --auto-serializable-classes=quitada.*
create region --name=MyRegion --type=PARTITION_REDUNDANT_PERSISTENT

#ちなみに、上述の MyData クラスですが、シリアライズする必要がありますが、implements Serializable とかつけてません。PDX のオートシリアライザー(?)が自動的によろしくやってくれます

#ちなみに、configure pdx コマンドの設定内容は、起動中のサーバーには反映されないようなので、上述のコマンドラインにて PDX やリージョン設定したら、サーバー再起動して configure pdx コマンドの設定内容を反映させる必要があるようです。gfsh からキャッシュリージョンの設定内容はロケーターの方に永続化され、サーバー再起動時にはその設定内容を読み込みます

それでもって、上述の --value-class=quitada.MyData を付与した put コマンドを実行し、get コマンドを実行すると値が取得できるのがわかります。以下、実行例です。

gfsh>get --key=1 --region=/MyRegion
Result      : true
Key Class   : java.lang.String
Key         : 1
Value Class : org.apache.geode.pdx.internal.PdxInstanceImpl

 name   |       title       | age
------- | ----------------- | ---
quitada | Inchiki Developer | 44

read-serialized=true 設定なので、バリュークラスが実際には PdxInstanceImpl となっていることがわかります

クエリーもできますよー。以下、実行例です。

gfsh>query --query="select * from /MyRegion mr where mr.name='quitada'"

Result     : true
startCount : 0
endCount   : 20
Rows       : 1

 name   |       title       | age
------- | ----------------- | ---
quitada | Inchiki Developer | 44

クライアント Java アプリケーションからJSON 形式にてデータの出し入れができます。以下、コード抜粋です。

ClientCache ccache = new ClientCacheFactory()
    .set("cache-xml-file", "./xml/cache-client.xml")
    .set("log-level","config")
    .create();
Region<String, PdxInstance> myRegion = ccache.getRegion("MyRegion");

String key = "1";

// JSON 形式でデータ投入
myRegion.put(key,JSONFormatter.fromJSON("{\"name\":\"quitada\",\"title\":\"Inchiki Developer\",\"age\":44}"));

// PdxInstance オブジェクトを JSON 形式に変換・出力
System.out.println("get json string (key=" + key + ")=\n" + JSONFormatter.toJSON(myRegion.get(key)));

read-serialized=true 設定なので、get をすると必ず PdxInstance 型のオブジェクトがかえってきますJava アプリケーション内でデータを扱う場合は、わざわざ返り値を JSON 形式に戻すことはないと思うので、かえってきた PdxInstance 型オブジェクトから直接値を取り出すことになります。なので、フィールド変数の値を取り出すだけだったら、gfsh から JSONデータを投入して値をオブジェクトマッピングするため作成した quitada.MyData クラスはいらないんですね。PdxInstance の使い方について詳しくはドキュメント参照してみてください。

2017-04-04 今日の技術的活動

[] Apache Geode個別JMX マネージャーを起動する Java API

Apache Geode分散システム管理とか稼働状況監視のため、デフォルトでは一番最初に起動したロケーターが JMX マネージャーになります。

で、JMX マネージャーになっているロケーターがダウンしてしまうと、自動的に他のロケーターとかが JMX マネージャーになるのかと思いきや、ならないんですねー。ぐはぁ。つまり、JMX マネージャーがいない状態が続くわけで(ダウンしたロケーターを再起動したら、またそれが JMX マネージャーになりますが)。

JMX マネージャーがいない状態で、稼働中ロケーターのどれかを JMX マネージャーに任命するには、対象ロケーターに gfsh connect コマンド接続してやればよいようです。gfsh connect コマンドは、本来分散システム接続するコマンドですが、副作用として、対象分散システムJMX マネージャーがいなかったら接続ロケーターを JMX マネージャーにするようで。で、ふとこの "副作用" だけを実行する Java API とかないかなーと思って、Javadoc みたけどなくて、gfsh connect 周りのソースコードみたら JmxManagerLocatorRequest.send() が副作用みたいです。

特にキャッシュとか生成する必要もなく、以下のように JmxManagerLocatorRequest とかをインポートした普通Java プログラムから呼び出して、副作用享受できるようです。

package quitada;

import org.apache.geode.management.internal.JmxManagerLocatorRequest;
import org.apache.geode.management.internal.JmxManagerLocatorResponse;

import java.io.IOException;

/**
 * Created by quitada on 2017/04/04.
 */
public class GeodeJMXConnectionRequestTest {
    public final static String locatorHost = "192.168.1.21";
    public final static int locatorPort = 55221;
    public final static int msTimeout = 100000;
    
    public static void main(String[] args) {
        try {
            JmxManagerLocatorResponse response
                = JmxManagerLocatorRequest.send(locatorHost, locatorPort, msTimeout);
            System.out.println("The JMX Manager is running here: " + response.getHost()
                + " -> JMX Manager port=" + response.getPort());
        } catch (IOException ioe) {
            System.err.println("Can't connect to the target locator: " + locatorHost
                + "[" + locatorPort + "]");
            ioe.printStackTrace();
        }
    }
}

2017-02-14 今日のブログエントリー

2017-01-16 今日の IT 技術アウトプット

[] CLion を使いこなすには CMake を多少勉強しないとねという話

Java で何か開発するときには、JetBrains 社の IntelliJ IDEA 使っているのですが、死語賭でたまに C++ で何か作ることもありまして、以前は Eclipse CDT 使っていたんですけど、JetBrainsC/C++ IDE として CLion という IDEリリースしたんでそちらに乗り換えました。

同じ会社がだしているので、CLionIntelliJ IDEA と同じようなルックアンドフィールで、いわば "IntelliC" といったところで、IntelliJ IDEA比較的使い慣れている私としては、非常にとっつきやすいです。

IDE 使って C や C++ で何か作ってビルドして動作確認する際、悩ましいのはコンパイラ引数とか、リンカースイッチをどう設定するかだと思ってますVisual StudioEclipse CDT だと、コンパイラ引数リンカースイッチ設定項目一覧みたいな設定ウィンドウをだして、一つ一つばらばらと色々なところに設定していきますが、ま、お世辞にも使いやすいとはいえないですね。むしろ、コマンドライン引数スイッチを羅列した方がよっぽど設定しやすい。

と、CLion では私の気持ちを汲んでくれた(?)のか知りませんが、コンパイラ引数リンカースイッチをばらばらと所定の箇所に無駄GUI で設定することなく、バックエンドビルドシステムである CMake の CMakeLists.txt ファイルそのまま編集して設定するという極めてシンプルかつ、設定内容が 1 つの場所に集約されていて設定しやすくなってます。他方、CMake 自体の設定項目を知っている必要があり、本ブログエントリーも CMake を多少勉強しないとね、ということで…。

ではさて、死語賭でよく使う GemFire の Native Client という C++ モジュールを使う C++ アプリケーションビルドテスト環境CLion 上で作ってみたので、メモ書きします。以下のドキュメントの設定を CLion でやってみるというイメージです。

Developing C++ Programs on Linux

環境変数の設定

CLionメニューから、File > Settings...(Ctrl + Alt + s でも良いです)とたどりプロジェクト設定ウィンドウを開きますさらにそのウィンドウの左ペインで、Build, Execution, Development > CMake とたどると、右ペインビルド・実行・開発関連設定画面が表示されるので、Environment の項目の右端にある [...] をクリックます。そうすると、環境変数設定画面が開くので、右上の [+] を押して項目追加、以下のように GFCPP とか設定して、[OK] を押します

f:id:quitada:20170116155535p:image

なお、こちらによると現状の CLion(quitada は、2016.3.2 で動作確認)では設定済みの環境変数を参照するため以下のような記述はできないようです。既存環境変数に追加したい場合だけでも、既存の設定内容と追加したい内容と記述する必要があるみたいです。

${GFCPP}/lib:${LD_LIBRARY_PATH}

むむぅ、これは何とかならないかな…。

コンパイラ引数リンカースイッチの設定

プロジェクト作成すると、CMakeLists.txt自動生成されるのでそちらを CLion 上で開いて直接テキスト編集ます。C++コンパイラ引数設定のため、以下の感じのを追加します

set(CMAKE_CXX_FLAGS "-D_REENTRANT -m64 -I$ENV{GFCPP}/include")

リンカースイッチは以下の感じのを追加します

set(CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath,$ENV{GFCPP}/lib -L$ENV{GFCPP}/lib -lgfcppcache")

ポイントは、CMakeLists.txt では環境変数が参照できて、$ENV{[環境変数名]} と記述ます(ここでは、前手順で CLion 上で設定した環境変数 GCPP の内容を参照してます)。

2017-01-01 今年の抱負

[] 細マッチョ父さん的今年の行動指針設定

昨年に続き、同じような感じで。

その1:やりたいことを優先的にやる。

その2:やりたくないことは何も悩まずすぐやる。

その3:お金から自由になるための俺々システム構築を念頭におきつつも、再始動気持ちで。

以上

2016-12-31 年末の反省とか

[] 年末反省

2016 年 1 月 1 日に設定した、細マッチョ父さん的今年の行動指針設定反省をしたいと思います。

その1:やりたいことを優先的にやる。

1 年を通して特定問題を抱えていて、やりたいこともやる気がでない、そんな一年でした。ぐはぁ。

その2:やりたくないことは何も悩まずすぐやる。

悩むことが多かったなー。やりたいくないことが多かったなー。ぐはぁ。だめだー。

その3:お金から自由になるための俺々システム構築を念頭に行動。

お金継続して困り果ててしまって、2016 年には確実には解消され、システム構築ならず。引き続き構築したい…。

 *  *  *

来年酉年、一番鶏のようにいち早く行動を起こせるそういう人になりたい。

2016-12-18 今日までの遍歴

[] 「官足法ウォークマット II」を踏み始めて 10 ヶ月たちます

8 年前にパナソニックのフットマッサージャーを入手してからなんちゃって足裏マッサージ愛好家でして(どうでもいいですが)、ただ色々と物足りなくなってきまして、芸人とかの罰ゲームとかで走らされて超痛そうな、あれに手をだそうかと思ったのが、今年の 3 月でして。ほら、あれです。

色々ネットで評判を調べて、モノとしては「官足法ウォークマット II」が良いかなと思い、購入して始めたのが今年の 3/20 でした。

説明書によると、まず目標として、この上で 20 分間足踏みできるようにとのことでしたが、開始当初は超痛くて数秒も立っていられず。

なんとか継続して最近は、20 分以上でも何分でも足踏みできて、超痛い部位も無くて(左足小指の付け根と土踏まずはやや痛いけど)、余裕なのであります芸人とかがやっている罰ゲームで余裕ぶっこいて走ってみてー!

で、あらためて件の Panasonic フットマッサージャーを最強でやってみましたが、何も感じない…。もっと刺激がほしい。

さて「官足法ウォークマット II」をやり続けたことによる効果ですが、何か劇的に健康になったという感じはないですが、個人的には以下のような印象。

  • 足とか手にあったイボが消えた
  • 足の裏が超柔らかくなった
  • 長年悩まされている肩こりが軽減されたような気がするー

個人的には、中性脂肪値が極端に高いので、それに対する効果を期待していたのですが、どちらかというと同時並行的に行っているトライコアという薬の服用で中性脂肪値が下がっていると思われ、ウォークマットの効果は?です。

今後はウォークマット上でランダムに足踏みするだけでなく、説明書にあるルーチンを導入してみようかな…。

2016-11-03 今日のシェイクダウン

[] スリッポンシェイクダウン

ネットで注文して昨日届いた VANS スリッポン本日シェイクダウンです。

f:id:quitada:20161103152345j:image

型番的なものは、Classic Slip-On (Multi Stripes) BI/RdtOrcd VN-0ZMRFIB です。

まー、しめつけがきついんですけど履きやすくていいです。

2016-10-30 今日のダメージ

[][] APLUS T-CARD PLUS と Eye-Fi Explorer x2

アプラス発行のクレジットカードT カードプラス」が届いたので、早速券面を撮影してブログエントリーを書こう!と思って、デジカメ撮影した券面写真Eye-Fi Explorer x2 経由で PC転送使用と思ったら、いつまでたっても転送できない!PCファイヤーウォール機能とかのせいかと思って、オフにしても全然転送されず。もしやと思ってググってみると、Eye-Fi Explorer x2 も含む Eye-Fi製品2016 年 9 月 16 日をもってサービス終了していたではないかー!!

はいえもはや、ブログエントリー掲載用ごとき写真だとデジカメにこだわる必要もないし、スマフォ撮影してメール添付とかファイル共有クラウドサービス使って実質 PC への転送可能なので、Eye-Fi 製品にこだわる必要もないけど、カッ!となって、Eyefi Mobi Pro をポチりました。

これ、Eyefi クラウドサービス契約必須かなぁ…。ぼくは、Eye-Fi Explorer x2 でやっていたように、単にデジカメ画像を私の PC転送したいだけなんだが…。

いっちゃんええやつと思って、Pro にしたけど、Pro じゃなくても良かったような…。

日本メーカーにがんばってほしいので、東芝の FlashAir が良かったかも…。こっちの方が安いし…。

ともあれ、カッ!となってはいけません。冷静に。

Eyefi Mobi Pro 使ってデジカメ画像PC転送できるようになったら、後日 APLUS T-CARD PLUS の券面が画像を本ブログエントリーにアップしたいと思います。

ともあれ、アプラス T-CARD PLUS ですが、不動産投資物件購入のため ARUHI でローン組んだら、契約させられたんですが、こちらによると初年度年会費無料で毎年 1 度でもこのカードで決済すれば年会費が発生せず、実質年会費無料で T ポイントがつくというのが良いところですかね…。後は特に、オレ的にそそるものがないなぁ。ぐはぁ。

P.S.

で、以下が APLUS T-CARD PLUS の券面です。

f:id:quitada:20161102004539j:image

Eyefi Mobi Pro も届いたのですが、こちらの画像Eye-Fi Explorer x2 で撮影したものを、SD カードリーダー経由で救ったものです。