Hatena::ブログ(Diary)

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

id:quitada
大きな組織における ボトムアップに変革を起こす方法https://www.meetup.com/CodeChrysalis/events/246562481/
id:quitada
PivotalジャパンのFBページが出来ました(*´ω`*)https://www.facebook.com/pivotaljapan/
id:quitada
コードクリサリス英語予備校β版http://mailchi.mp/bc8bedc46148/code-chrysalis-english-prep-bootcamp-beta-303307

2018-01-03 ひととおりの活動におけるまとめ

[] HHKB Professional BT デュアルキーボード構成 on macOS - オレの使用

なんかデュアルキーボード話題になっていたので、昨年末から私も、macOS にて HHKB Professional BT デュアルキーボード構成で死後賭してます。こんな感じですよ。

f:id:quitada:20171227182646j:image

HHKB Professional BTBluetooth キーボードなんで、1 台の PC に 2 台のキーボードペアリングすれば基本的に設定完了ですが、macOS場合ちょっと一手間必要です。というのは、macOS場合キーボードをまたいだキーの同時押しを認識しないようなんで。例えば、文字入力英語日本語切り替えに、私は Option + Command + Space を使っているのですが、デュアルキーボード構成場合だと左手キーボードで Option と Command を押して、右手用のキーボードで Space 押すとか普通にやりたいんですね。でも macOS場合は、左手用で Option と Command が同時押しされていて、右手用で Space が押されているなぁ、と認識してしまって、3 つのキーが同時押しされた!と認識されないんですよね、余計なお世話なんですが。ちなみに、Windows問題なくキーボードまたぎのキーの同時押しを認識ます

ググったらでてきますが、macOSキーボードまたぎのキー同時押しをさせるため、Karabiner-Elements というソフトウェアインストールしてやります特に追加設定も必要なくて、インストールすればよいです。

ただ、Karabiner-Elementsインストールしてもどうしてもキーボードまたぎのキー同時押し対応不可なやつが、HHKB にあります。ずばり、Fn キーです。多くの場合は省スペース化のため一部の専用キー排除されていてかわりに、Fn キーと同時押しすることで排除されたキーの代わりにしてますHHKB も省スペース化のため Fn キーが導入されています。例えば、ファンクションキー。最新の MacBook ではそもそもファンクションキー自体がなくなっているのはさておいて、HHKB場合Fn数字キーを同時押しすることで、F1F2F3...に対応してます。あとは、カーソルキーとか(Fn + / で↓とか)。

Fn キーは、本来キーボードにはないキーで、Fn キー単独で押しただけではキーコードPC送信されず、対応しているキーを同時押しすることではじめてキーコード送信されるんですね。なので、例えば、左手キーボードで「1」を押して、右手キーボードで「Fn」を押しても、「F1」にはならいんですよ。なぜなら、左手キーボードは「1」が押されてます!というキーコードを送るけど、右手キーボードは「Fnしか押されてないので何もキーコードを送らず、PC 的には「あ、1 が押されてるね」としか認識できなんですよね。これでは Karabiner-Elementsインストールしても、Fn キーが押されていることがわからないので、キーボードまたぎのキー同時押しは無理ですよね。

HHKB Professional BT場合、標準設定では Fn キーは Enter キーの下の一番右端にあるので、デュアルキーボード構成にすると右手キーボードで押すことになりますが、例えば F1入力したいとき右手キーボード内でキー同時押しを完結させる必要があって、でも右手だけで 「1」と「Fn」の同時押しは指が届かなくて無理なんですよね。F1F6 くらいは諦めろってこと?

PFU Happy Hacking Keyboard Professional BT 日本語配列/白 PD-KB620W

PFU Happy Hacking Keyboard Professional BT 日本語配列/白 PD-KB620W

対策としては以下の 3 つを考えました。

なんだかなー。

それはさておき、デュアルキーボード使用感ですが、ホームポジションにしっかりと指を置いた上でのタイピングたいままで以上に求められる感じです。慣れれば姿勢良くキー入力できるので、肩こりが解消されることにちょっと期待しております。私の場合は、特に右手ホームポジションがずれてしまうことが多くて、正確に左か右にキー 1 個分ずれた状態文字入力されてしまうことが多くて今のところやや大変。

2018-01-01 今年の抱負

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

同じようなことをしていてもアレなんで、昨年とは若干方針変更していこう。

その1:知識経験インプットの機会を優先する。

その2:知識経験アウトプット積極的に行う。

その3:知識経験を活かして、お金から自由になるための俺々システム構築を検討・実行へと積極的に行う。

以上

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

[] 年末反省

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

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

年の後半が特に無気力状態でしたー。ずっと、やりたいことを見つける探ししてた感じ…。

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

すぐやるときもあれば、だらだらと先延ばししたり、むらがありました。やりたいこととやりたくないことの区別がついてなかった気配というか、「これはやりたいことだ!」といいきかせていたら、なんだかやりたくなくなってきたとか。

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

はい、再始動してお金はかなり貯まるようになりましたが、俺々システムは壊滅しました。

 *  *  *

来年戌年ワンダフル人間になりたいです。

2017-12-17 今日のブランニュー体験

[] 居間シーリングライトLED

電球使った照明の LED 化は、比較的早い段階から進めていたのですが、蛍光灯系の照明は代替製品がでてくるのが電球に比べて後発で、トータルコスト的に見ても蛍光灯LED 照明に変更する積極的理由がなかったので未実施でしたが、本日実施しましたという個人的な報告です。

さてさておとといあたりから居間シーリングライトKOIZUMI の型番 GHN 535 381)の調子がおかしくなりました。スイッチいれたら 1 秒くらい点灯するのに、その後消えてしまう…。丸形の蛍光灯が 2 発(32 型/40 型)ついてるので、やや黒ずんでいた方を取り外したら照明がつきました!ということで、昨日蛍光灯を取り替えようと買ってきました(パルックプレミア FCL3240ECWH2KF)。

さて取り替えようと思ったら、生き残っていた方の蛍光灯も点灯しなくなりました。新しい蛍光灯に取り替えても点灯せず…。点灯する時に本体から鳴る「ピッ」という電子音もしなくなったので、あらら、本体故障ですか、ぐはー。本体製造年月が 2003 年 3 月なんで、あきらかに耐用年数を超えて使ってましたね。長い間ありがとうございます。まー、こんだけもったら、家電メーカーとか儲からないよな…。

ということで、昨日買ってきた蛍光灯は別の部屋の蛍光灯がきれたときのために塩漬けし、今こそ(居間こそ?)LED 化の時だ!ということで、本日 LED シーリングライトを買ってきたよ。

グループ各社がゴタゴタの極みですが、LED 照明といえば東芝、あと価格がお手頃(12,000 円ほど)なんで、東芝ライテックの LEDH0806A-LC を買いました。

なお、本商品(というか LED シーリングライトというカテゴリー全体的に?)は蛍光灯シーリングライトのように、発光部分が交換可能にはなってないです。蛍光灯照明器具本体より耐用年数が短いので、交換できるようになっているけど、LED になると照明器具本体耐用年数が同じになったので一体化してあって、壊れたらまるごと交換みたいな感じですかね。

わーい、明るいよ!♪あっかるいーい、ナッショ…。おっと、別メーカーの古い歌でした。

どうでもいいですが、シーリングライトの取り付け部分のデファクトスタンダードなやつは「カチットF」という名前なんですね。

2017-11-14 今日の時代の終わり

2017-07-29 今日の取得物

[] 三菱東京 UFJ-VISA デビットカードを入手した

f:id:quitada:20170729205411j:image:right

デビットカードというと、J-Debit のイメージが強くて、あまり使えるところがないなぁぐらいに思ってましたが、VISAビットはそれこそ VISA 付帯のクレジットカードが使えるところでは、おおむね使えるようなんですよね。

いいかえれば、見た目 VISA 付帯のクレジットカードで、決済は指定銀行口座から即座に行われるだけというか。ネットショップでのクレジットカード決済で、クレジットカードとして VISA デビットカード登録しておけば決済し放題というか。

なので、作ってみました。そして、本日届きました。

もちろん、3 倍決済が早そうな赤い券面ですね!

さっそく、モバイル Suica で、クレジットカードチャージでこのデビットカードの番号を指定してみました。普通にできました。そして、即時に私の口座からチャージした分が引き落とされてました。

ま、ちょっと他にも色々とこのカードでの決済を試してみて、ダメなやつは随時コメントに報告したいと思います。

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 今日のブログエントリー