java8でラムダ式を始めてみて、
こりゃscalaも勉強しとかなきゃあかんな、
と思い、scalaをダウンロードしにいったら、
TypesafeActivatorもあったから、こっちでやることにした。
1.まずsbtをいれる
# port install sbt
2.次にeclipseのscalaプラグインを入れる
マーケットプレイスにもある。
3.そしてsbtをダウンロードして、パスを通す
# cd /opt
# curl -O "http://downloads.typesafe.com/typesafe-activator/1.3.6/typesafe-activator-1.3.6.zip"
# unzip typesafe-activator-1.3.6.zip
# ln -s /opt/typesafe-activator-1.3.6 /opt/typesafe-activator
# echo "export PATH=$PATH:/opt/activator-dist" >> /etc/profile
# source /etc/profile
これで、activatorコマンドが実行できるようになった。
4.eclipseプロジェクトへの変換
activator new
とかで新規プロジェクトの雛形をつくってくれるので、
そのプロジェクトに移動後、
$ sbt eclipse
ってやれば、eclipseへのインポートが可能になる。
なんか、
activator eclipse
とか、plugin.sbtに追加しろとかあるけど、
どれも不要だった。。
投稿日時:2015年10月29日 16:28
カテゴリー:
scala
ラムダ式が導入されて(java8)結構たちましたが、
あまりやる気がしなかったが、
重い腰を上げて、おれおれフレームワークに少しづつ適用中。
いろいろ例はあるが、やはりコレクションには適用しやすい。
二元ループをするケースで結構はまったので、
メモを残しておく。
(例)URLのBodyパラメータを手作業で分解する場合
Bodyパラメータはこんな感じを想定
hoge=1&fuga=2&piyo[]=1&piyo[]=2
ここではInputStreamから抜かないで、一度分解したのち、文字列に戻すということをやる。
これを従来の処理でやると以下になる。
Map<String, List<String>> paramsBody = new LinkedHashMap<String, List<String>>();
StringBuffer buffer = new StringBuffer();
// サーブレットリクエストからパラメータの情報をとる
Map<String, String[]> params = servletRequest.getParameterMap();
// 回しながら、List型に変換して、さらに文字列を構築する
String sep = "";
for (Iterator<Entry<String, String[]>> iterator = params.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iterator.next();
String name = entry.getKey();
String[] values = entry.getValue();
if (!paramsBody.containsKey(name)) {
paramsBody.put(name, new ArrayList<String>(Arrays.asList(values)));
}
for (String value : values) {
buffer.append(sep).append(name).append("=").append(WsUrl.decode(value, encoding));
sep = "&";
}
body = buffer.toString();
}
おなじことをラムダ式をつかうと、
Map<String, List<String>> paramsBody = new LinkedHashMap<String, List<String>>();
StringBuffer buffer = new StringBuffer();
// サーブレットリクエストからパラメータの情報をとる
Map<String, String[]> params = servletRequest.getParameterMap();
// 回しながら、List型に変換して、さらに文字列を構築する
String paramString = params.entrySet()
.stream()
.map(entry -> {
String name = entry.getKey();
return Arrays.stream(entry.getValue())
.map(value -> String.format("%s=%s", name, WsUrl.decode(value, encoding)))
.collect(Collectors.joining("&"));
})
.collect(Collectors.joining("&"));
buffer.append(paramString);
body = buffer.toString();
ここまでくるのに結構大変だった。。
投稿日時:2015年10月29日 16:28
カテゴリー:
java
td-agentはプラグインが豊富だけど、
結構品質(というか、どこまで想定して作られているか)がよくないものが多いように感じる。
OSS時代の申し子的な存在だけど、
意外にプラグインの品質が悪くて、修正してしまうケースもある。
本体はとても優れたプロダクトですが、
プラグインの品質は優劣が激しいので、
気をつけましょう。
・・・それに毎回設定で苦労してるから、
td-agentに代わるものを、akkaで作りたいな。。
投稿日時:2015年10月26日 17:09
カテゴリー:
server
MySQLでは、
・truncate
・load in file
・create
などの一部はトランザクションが効かないのね。。
また、load in fileは、
replaceキーワードを使えば、主キーが存在していれば、
updateを行ってくれるのね。。
基本的なことだろうけど、知らなかったわ。。
load in fileの例(RDSにて)
LOAD DATA LOCAL INFILE '${file_path}' REPLACE INTO TABLE ${table_name} FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
投稿日時:2015年10月08日 19:17
カテゴリー:
mysql
windowsのような右クリックキーがmacにも欲しい。
ということで、不要なCapsLockを、右クリックキーに割り当てましたので、
その手順を残しておきます。
1.CapsLockのキー割り当てを解除

2.「Seil」というソフトで、CapsLockにF19を割り当てる

3.「BetterTouchTool」というソフトで、F19に右クリックを割り当てる

F19は当方がフルサイズキーボードで、
使用していないので割り当てただけで、
使用していないければ、どのキーでもOK。
あとは、「BetterTouchTool」を、
ログイン時に起動しておくようにしておけばよい。
投稿日時:2015年09月09日 14:47
カテゴリー:
mac
macのターミナルがデフォルトだと非常に使いづらいので、
/etc/profileを以下のように変更した。
# System-wide .profile for sh(1)
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
# color
PS1='[\[\033[36m\]\u\[\033[0m\] \[\033[32m\]\w\[\033[0m\]]\[\033[33m\]\$\[\033[0m\] '
# git
source /etc/git-completion.bash
# ssh
if [ -f ~/.ssh/config ]; then
complete -o default -o nospace -W "$(grep -i -e '^host ' ~/.ssh/config | awk '{print substr($0, index($0,$2))}' ORS=' ')" ssh scp sftp
fi
# alias
export LSCOLORS=gxfxcxdxbxegedabagacad
alias ls='ls -G'
alias ll='ls -l'
alias la='ls -al'
# java
export JAVA_HOME=`/usr/libexec/java_home`
export MAVEN_HOME=/opt/apache-maven
export ANT_HOME=/opt/apache-ant
# path
export PATH=$PATH:$MAVEN_HOME/bin
export PATH=$PATH:$ANT_HOME/bin
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
.bash_profileを変更してもよいが、
どうせなら、/etc/profileを変更しちゃう方がいいかなと。
portのインストールは済ませておきましょう。
また、git-completion.bashは公開されている方のものを拝借させていただいた。
これで、結構快適になった。
投稿日時:2015年09月09日 13:55
カテゴリー:
mac
最近、macに移行した。
慣れ親しんだwindowsに別れをつげて、
macに移行したものの、キーボードがスムーズに打てない。。
windowsではcygwin生活だったが、
macに移行して、ターミナル生活になった。
macはやはりターミナル極めてなんぼだなという感じがする。
1つ失念していたことで、
macはwindowsと違い、
ファイルパスの大文字小文字を区別するんだった。。
javaファイルがコンパイルできなくて、はまりました。。
macにtipsもいろいろ書いていきたいっす。
投稿日時:2015年09月01日 13:38
カテゴリー:
mac
javaでwebsocketクライアントをやろうとしたら、
websocket-apiライブラリでは動かなかった。
なんでも、meta-infのserviceのところに何かを配備する必要があるらしい。
そこで、いろいろ調べたら、glassfishのライブラリを導入すれば、
一発で済むことがわかった。
pom.xmlは以下を書くだけ。
<dependency>
<groupId>org.glassfish.tyrus.bundles</groupId>
<artifactId>tyrus-standalone-client</artifactId>
<version>1.11</version>
</dependency>
あとは、
WebSocketContainer cont = ContainerProvider.getWebSocketContainer();
URI uri = URI.create("ハンドシェイクのURL");
cont.connectToServer("websocketのインスタンス", uri);
で接続できる。
検証したのは、JDK8だが、JDK7でも大丈夫でしょう。
以上
投稿日時:2015年08月18日 09:29
カテゴリー:
java,
websocket
ORマッパーを作成して、
INDEXの存在確認方法を調べたのでまとめておきます。
【PostgreSQL】
select indexname from pg_indexes where tablename = ‘テーブル名’;
【MySQL・MariaDB】
SELECT INDEX_NAME FROM information_schema.STATISTICS WHERE table_name = ‘テーブル名’;
→whereに「TABLE_SCHEMA」を追加すれば、データベース名も条件に加えられる。
【SQLite3】
select name From sqlite_master where type = ‘index’;
→インデックス名の一覧がとれるから、そこから検索すればよい。
【H2】
select index_name from information_schema.indexes where table_name = ‘テーブル名;
→大文字小文字を区別している場合、テーブル名は大文字にする必要がある。
→大文字小文字を区別している場合、結果セットは大文字になるので、注意する。
→CREATE INDEX IF NOT EXISTS index_name ON table_name (column_name1, column_name2);
という形で、IF NOT EXISTS構文もサポートしている。
以上
投稿日時:2015年08月14日 16:08
カテゴリー:
rdb
websocketで、回線を抜くなどの切断をしたとき、
即座にcloseハンドラで受け取れないみたい。
TCP自体の仕様を細かく確認してみる必要はあるが。。
ライブラリによっては、
再接続時に一旦closeハンドラを呼び、
滞留中のコネクションを破棄したうえで、
openハンドラをコールするものもあるようにみえる。。
なので、再接続時にcloseが呼ばれるケースもある、
ということを考慮しておいた方がよい場合もあると思います。
投稿日時:2015年08月03日 15:42
カテゴリー:
websocket