OmniAICreator/Qiita-1.07M huggingface dataset:
ATOM 1.2からCJKのSoft Wrapが公式対応されたのでjapanese-wrapのパッケージが必要なくなりました。


Atom1.2がリリースされて、公式がCJK(Chinese, Japanese, Korean)のSoftwrapに対応しました。

【参考】[Atom 1.2](http://blog.atom.io/2015/11/12/atom-1-2.html)

**1.2にアップデートした状態でJapanese-wrapのパッケージが入っていると日本語のSoft Wrapにバグが発生するので、アンインストールまたはDisableにすると解決されます。**

申し訳程度にその他のアップデートの内容も列記。

+ Electron0.34.0 にアップデート
+ パッケージのテスト環境をJasmine以外も選べるようになった
+ 特定の状況で起きていたクラッシュのバグ修正
+ Tree Viewの速度向上とAPIの改善

*1.3.0ベータ版については割愛。*

--------

japanese-wrap制作者の方には本当に感謝しています。今まで重宝させていただきありがとうございました。
Apache全プロセスの総利用メモリ量がしきい値を超えるとApacheプロセスを再起動させる

# 概要
Apache全プロセスの総利用メモリ量がしきい値を超えるとApacheプロセスを再起動させる

## ご用意頂くもの
- epelのリポジトリ
- メール送信をするためのSMTPサーバー

# 準備
## epelリポジトリの追加
```bash:コマンド
rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# x86_64 CentOS 6 の場合
```
## monitのインストール
```bash:コマンド
yum install monit
```

# 設定
## monit全体の設定
```bash:/etc/monit.conf
set daemon 60
# monitの監視間隔（秒）

set logfile /var/log/messeges
# ディフォルトではSyslogが指定されていますが、私の環境ではうまく出力されなかったので明示的に記載
# logrotateの設定も忘れずに

set mailserver 127.0.0.1
# メール送信に利用するSMTPサーバーを指定
set alert hoge001@hogehoge.co.jp
set alert hoge001@hogehoge.co.jp
# アラート送信先メールアドレス
# 複数の通知先へメールを送信する場合は列挙する

set mail-format {
from: monit@hogehoge.com
# メール送信元アドレス
subject: $HOST : $SERVICE - $EVENT
message: Monit
ACTION  : $ACTION
SERVICE : $SERVICE
at $DATE on $HOST.
DESCRIPTION : $DESCRIPTION
}
```
## プロセス監視の設定
```bash:/etc/monit.d/httpd
check process httpd
    with pidfile "/var/run/httpd/httpd.pid"
    # httpdのPIDファイルの指定
    start program "/etc/init.d/httpd start"
    # 対象プロセスのスタートコマンドの指定
    stop program "/etc/init.d/httpd stop"
    # 対象プロセスのストップコマンドの指定
    if totalmem > 1000.0 MB for 3 cycles then restart
    # httpdのトータルメモリが1GBを3度こえると、httpdの再起動を実施
    if 5 restarts within 5 cycles then unmonitor
    # httpdの再起動に3回失敗したら、監視の停止
```

# 出来上がったものがこちらになります
```bash:サンプルメール
Monit 
ACTION : restart 
SERVICE : httpd 
at Thu, 05 Nov 2015 11:13:00 on [$HOSTNAME]. 
DESCRIPTION : total mem amount of 2.0 GB matches resource limit [total mem amount<1.5 GB] 
```

このように事前に設定した閾値を超えるとApacheのプロセスが再起動されました。

サーバー内でのプロセスの自動復旧や、
ログ中にある特定の文字列があるとプロセスの再起動など、お手軽に割と複雑な処理が自動化できます。
Unix v6 on Qemu setup guide


# Pre Requirements
- Ubuntu 15.04 on VMware fusion

# install

```bash
$ sudo apt-get install qemu gcc make libc6-dev-i386
$ git clone clone git://pdos.csail.mit.edu/xv6/xv6.git
$ cd xv6
```

git cloneはなぜか失敗するので、クローンサイトを探してきてそっちを利用。

このままmake qemu-noxしようとすると、エラーが出るので下記の通り編集

```bash
$ vim Makefile

コメントアウト
QEMU=/usr/bin/qemu-system-x86_64

```


```bash
make qemu-nox
```

以上！
SHA-2でSANsな自己発行証明書の作成

#はじめに

いよいよSSL証明書のSHA-2への移行に皆さん本腰入れ始めたのか、APIやWebサービスなど各所からSHA-1からSHA-2へ切り替える旨の連絡が届く毎日です。

SSL証明書の署名アルゴリズムをSHA–1からSHA–2へと変更したり、証明書を再発行すること自体は難しいことではありませんが、SHA-2での自己発行証明書のつくり方ってあまり見かけない気がするので、ちょうど最近作成したのでその手順を書いておきます。

自己発行証明書は開発環境での使用が主となると思いますが、ECサイトの構築案件などをやっていると、特に1台のWEBサーバで複数のドメインをホストするケースが出てきがちです。
名前ベースのバーチャルホストでは、基本的に1つのIPにつきひとつのSSL環境しか作れませんので、複数のIPを用意したりポートを変えるかなどする必要がありますが、SANs(Subject Alternative Names)とSNI(Server Name Indication)を使うことによって、1つのIPで複数ドメインに対応したSSL環境を1つの証明書で作ることができます。

簡単に言うと、
SANs ... 1つの証明書で複数ドメインに対応することができます。
SNI ... 1IPで複数ドメインのSSLが可能になります。

SANsに関しては、あまりメリットがないかもしれませんが、しいて言えば、あらかじめ複数のドメインに対応した証明書を作成する必要があるとわかっているときに、一度の証明書作成で全ドメインに対応したものが作れることでしょうか。
今更ながら、ワイルドカード証明書のほうが使い勝手がいいかもしれないと思い始めましたが、そちらはまた別の機会に。

#環境
CentOS 6.7
openssl-1.0.1e-42

#自己発行証明書の作成準備
/etc/pki/tls/openssl.cnf をコピーして
/etc/pki/tls/openssl_san.cnf を作成

[req]セクションで

```openssl_san.cnf
x509_extensions = v3_req
req_extensions = v3_req
```

[ v3_req ]セクションで

```openssl_san.cnf
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
```
といった箇所を探し、その下に以下を追加する。

```openssl_san.cnf
subjectAltName          = @alt_names

[alt_names]
DNS.1   = www.example.com
DNS.2   = hogehoge.example.net
DNS.3   = humuhumu.example.jp
```

[alt_names] のところはSSL対応させるドメインを列挙していきます。

#秘密鍵と証明書の作成
/etc/httpd/conf/ssl.key 以下に秘密鍵を、
/etc/httpd/conf/ssl.crt 以下に証明書を保存することにします。
これらのディレクトリは予め作成しておいてください。

    $ openssl genrsa -out /etc/httpd/conf/ssl.key/server.key 2048

これで秘密鍵が作成されました。
次は証明書の作成です。正規のSSL証明書を作成する際は、csrを生成しますが、自己発行証明書はいきなりcrtを作成しちゃいます。

    $ openssl req -config /etc/pki/tls/openssl_san.cnf -new -sha256 -x509 -key /etc/httpd/conf/ssl.key/server.key -out /etc/httpd/conf/ssl.crt/server.crt -days 1000

これで、期限1000日間の自己発行証明書となります。

#たとえばapacheでのhttpd.confの設定

SNIを有効にするために、以下のような記述がまず必要です。

```httpd.conf
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
NameVirtualHost *:443
```

VirtualHostの設定は、以下のように名前ベースで。

```httpd.conf
<VirtualHost *:80>
ServerName www.example.com
...
</VirtualHost>

<VirtualHost *:443>
ServerName www.example.com
...
</VirtualHost>
```

#対応ドメインの追加方法

上記のopenssl_san.cnfの[alt_names]にドメイン追記して、その後、証明書の作成を実行。あとはhttpd.confでVirtualHostを追加・編集するなどして、apacheを再起動。
ECMAScript 仕様の重箱の隅をつつく 1

仕様書を読んで見つけた、変な仕様を紹介していくコーナーです。
せっかくなのでクイズ形式で。

今回は関数の再帰呼び出しに関する仕様です。

# 問題

以下のコードでは、最後の [`console.log`](https://developer.mozilla.org/en-US/docs/Web/API/Console/log) でなんと出力されるでしょうか?

```js
// 1回だけ再帰的に foo を呼び出し、"foo"を返す。
function foo(check) {
    if (check) return "foo";
    else return foo(true);
}

// 1回だけ再帰的に bar を呼び出し、"bar"を返す。
var bar = function bar(check) {
    if (check) return "bar";
    else return bar(true);
};

// 上書きする
var hoge = foo;
var fuga = bar;
foo = bar = function() { return "none"; };

console.log(hoge(), fuga()); // ???
```

# 選択肢

1. `foo bar`
2. `foo none`
3. `none bar`
4. `none none`

ヒント: http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions-runtime-semantics-evaluation

# 答えと解説

https://gist.github.com/mysticatea/a1ff4dce55c7d3dbe50b
機械学習ライブラリTensorFlowで学習しない〜フィボナッチ数列


機械学習とかよくわからないけど、なんか理解できる範囲で計算してみたいという人向けに、TensorFlowでフィボナッチ数列をしてみましょう。

# 基本
フィボナッチ数列
$$ a_{n+2} = a_{n+1} + a_n, \\
a_1 = 1, \\
a_0 = 0 $$

を計算するために、例えば、

```python

u = 1
v = 0
for i in range(100):
	print i, v 
	u = u + v
	v = u - v

```

のようにすればできるでしょう。

# 準備
TensorFlowは

```python
import tensorflow as tf
```
で読み込むとします。

# Variable
まず、uとvという変数をTensorFlowの変数に直しましょう。それには、次のようにVariableを使いましょう。

```python
u = tf.Variable(1, "int64")
v = tf.Variable(0, "int64")
```

int64にしたのはオーバーフロー対策ですが、残念ながら、第93項でオーバーフローが発生します。これを省略したらint32として扱われます。

# 表示
`print u`で表示すれば良いように思えますが、残念ながら、期待したものが得られないでしょう。TensorFlowでは変数や関数・手続きを定義するフェーズと、実際にデータを処理していくフェーズに分かれています。

実際にデータを処理するにはtf.Sessionを使います。セッションの最初に変数を初期化する必要がある。これには、tf.initialize_all_variablesを使う。そして、次のようにすれば、uやvの値が取れます。

```python
init = tf.initialize_all_variables()
with tf.Session() as sess:
	sess.run(init)
	print sess.run(v)
```

sess.runにより値を取ったり、手続きを実行したりします。

# 更新
残りは値の更新の部分ですね。代入にはtf.assignを使う。足し算引き算には、tf.addとtf.subを使う。そして、代入という手続きを定義しよう。

```python
update_u = tf.assign(u, tf.add(u, v)) # u = u + v
update_v = tf.assign(v, tf.sub(u, v)) # v = u - v
```

# まとめ
以上の話をまとめると、

```python
import tensorflow as tf

u = tf.Variable(tf.cast(1,"int64"))
v = tf.Variable(tf.cast(0,"int64"))

update_u = tf.assign(u, tf.add(u,v))
update_v = tf.assign(v, tf.sub(u,v))

init = tf.initialize_all_variables()

with tf.Session() as sess:
	sess.run(init)
	for i in range(100):
		print i, sess.run(v)
		sess.run(update_u)
		sess.run(update_v)

```
実行すると、何やらCPUがどうとかといがIで始まるログが表示されるが、Infoなので気にしなくていいと思う。

まだTensorFlowを触っていない人も何かやってみましょう。
Swift初心者メモ

XcodeでRunしてビルドって取り合えずするなって感じなんだな。
Bridging-Headerファイル作ってないから、まぁXcodeで良いかなと考えてやっていたらずっとエラーでひどい目にあった約2時間。(戒めのために書いておきます。)

取り合えずこのメモが初心者の人の目に届くといいですね・ー・
brew cask list ＋バージョン表示

こんにちは。
```brew list```および```brew cask list```のバージョン表示を行ってみました。後者は一手間必要でした。

```console
% brew list --versions | awk '{printf("%-18s %s\n",$1,$NF)}'
autoconf           2.69
boost              1.59.0
glib               2.46.2
% brew cask list | cut -d' ' -f1 | xargs -I % bash -c "echo -n %' '; ls -C /opt/homebrew-cask/Caskroom/%" | awk '{printf("%-18s",$1);$1="";print}'
alfred             2.8_414
coteditor          2.1.5
qlmarkdown         1.3.3
```
Gradient Boostingについて - 準備編 -

基本、個人的に勉強した内容を書き留めていくつもりです。間違っている箇所があれば指摘して頂けると、とてもうれしいです。

# 1. Boostingとは何ぞや
Boostingとは弱学習器をたくさん集めて強学習器を作ろうという話が出発点で、PAC Learningと呼ばれています（PAC Learning:強学習器が存在するとき弱学習器は必ず存在するが、弱学習器のアンサンブルが存在する場合、強学習器と同性能の学習器を作れるかという話です）。他方、J.H.Friedma先生[1]が損失関数を最小化する枠組みでも議論できるんでない？という（おそらく）疑問から、なんと機械学習の枠組みでBoostingを説明してしまいました。**損失関数を最小化する問題として再定義し、損失を最小化する方向を探すのに勾配情報を使っているので、Gradient Boosting**と呼ばれています。
で、この方法が昨今のデータコンペで猛威を振るっています（今更、言われなくてもおわかりだと思いますが）。そろそろ応用問題にも機械学習を適用してみようかと思っていたので、勉強してみました。

# 2. Boostingの歴史
Boostingが猛威を振るっている疑問として、なんでそんなに上手くいくの？というです。素人でも不思議なのですが、機械学習の理論の先生方もおそらくまだわかっていないはず（実用性というより汎化誤差の上限バウンドの話です）で、個人的には密かなフロンティアなのではないかと注目しています。
流れとしては、Adaboost -> Gradient Boosting -> Stochastic Gradient Boosting -> Stochastic Parallel Gradient Boosting かなと思ってます。最初はPAC Learningの枠組みで理解され、現代では機械学習の枠組みで定式化されている流れ。
肝心の疑問ですが、ここに歴史を感じるのです。**AdaboostからGradient Boostingに移行するまで、経験的に性能が高かったBoostingの汎化誤差**について深く議論されています[2]。Adaboostにかぎらず、Boostingは訓練データに思いっきりfittingしていきますので、汎化誤差は悪いんでないの？と思っていて、多くの方が同様に考えていたはず[3]です。しかし、**経験的には汎化誤差があまり悪化しない**のです。
そこで、理論の先生が考えました。**答えはL1-Margin**です。SVNはMarginという量を最大化する問題で、このMarginはL2-Margin

```math
\begin{eqnarray}
||\overrightarrow{\rm x}||_2^{2}
\end{eqnarray}
```

でした。つまり、Marginをユークリッド距離として解釈できたわけです。他方、Boostingは式をよく見るとL1-Marginと考えられることに先生が気づきました([2]のP18-19)。あ～Marginか～と多分先生は思いついて定式化し、理論的な汎化誤差を導出[3]しました。
しかし、**経験的に達成される汎化誤差と理論的に導出される汎化誤差には大きな乖離があるようで、依然、謎のまま**のようです（このあたり、理解が間違っていたらご指摘をお願いします）。

# 3. AdaboostとGradient Boosting
2章で書きましたが、大学で勉強する多くがAdaboostなのではないでしょうか。PAC Learningの枠組みで教科書も書かれています。これをGrdient Boostingの枠組みで理解すると、**AdaboostはExponential Loss**で理解できます。その他、Logit-Boost(Logistic Loss)、L2-Boost(Square Loss)などが有名どころです。

# 4. 勾配情報は何に使われるのか
詳細は5章に書きますが、ここでは、勾配情報とアンサンブル学習の関連性は何なんだという話です。答えは**損失関数を最も下げる様に、弱学習器を追加する**[1]という話です。
Boostingは加法モデルと呼ばれる手法で、時刻t-1までに学習したアンサンブルに、時刻tにさらに弱学習器を追加するモデルです。

# 5. Gradient Boostingのアルゴリズム
![Invalid file type: application/pdf]()
アルゴリズムの概要です。図は[1]から引用しました。順に書いていきますと

- 1行目:損失関数(プサイ)の初期化
- 2行目:mが弱学習器の添え字.
- 3行目:これポイントです。損失関数を前回(m-1)までのアンサンブル学習器の予測で偏微分しています。**yチルダは予測ではなく、サンプルデータiに関するnegative gradient**です。
- 4行目:hが弱学習器なのですが、4で述べた通り、追加する弱学習器は損失関数を最も下げる様に振舞ってほしいのです。そこで、**negative gradient(yチルダ)を正解データとして弱学習器(h)を最小二乗近似**し、弱学習器hのパラメータaを求めています。
- 5行目:3-4行目で求めたのは、勾配を下げる弱学習器で、学習率は別途求める必要があり、それをline searchで求めている。
- 6行目:m-1までのアンサンブル学習器に3-5行目で求めた弱学習器を追加。

# 6. Gradient Boosting Decision Tree（GBDT）
非常に長くなってきました。やっと流行っているGBDTです。決定木がどこで使われるかといえば、追加する弱学習器を決定木にしています。

# 7. 次回以降
以上がBoostingの概要です。次回以降は具体的な実験をscikit-learnでやってみたり、正則化の話、最後に滅茶苦茶はやっているXgboostについてコメントしてみたいと思います。
いきなりネタバレしておきますと、boostingの正則化はいわゆる正則化の理論でいう正則化ではなく、学習率をいじっているだけです。結果、boostingでは学習率の数列の優劣で汎化誤差が良くなったり悪くなったりしています。しかし、Xgboost[4]は損失関数を2次の項までテイラー展開しているよう（実際のコードを確認していませんが、[4]ではそのようになっています）です。正則化といえばL1・L2ですから、2次の項まで解析的に求まれば、従来の意味で正則化可能なのです。だから、Xgboostの予測精度がよいのではないかと思っています。

# 8. 参考文献
[1] J.H.Friedma, Greedy Function Approximation_A Gradient Boosting Machine
[2] M.Mohri, Introduction to Machine Learning Lecture 11
[3] L1-Marginの導出論文忘れた・・・
[4] Tianqi Chen, Introduction to Boosted Trees https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
python > stringにintを足す > print "comdelay," + `g_setting.getComdelay()`

```txt:動作確認
CentOS 6.5
```

文字に数値を足そうとして以下を実行したらエラーになった。
getComdelay()はint型数値を返す関数。

```
print "comdelay," + g_setting.getComdelay()
```

以下を見ると"`"で囲うといいようだ。
http://stackoverflow.com/questions/2847386/python-string-and-integer-concatenation


以下は実行できた。

```
print "comdelay," + `g_setting.getComdelay()`
```
s3に圧縮ファイルがアップされた際に、解凍して要素をCloudWatchLogsに出力するLambda Function（python版）



Lambdaのお勉強がてらに。
s3バケットにアップロードされたgzファイルを展開して、CloudWatchLogsに出力する。


```python:analyze_s3logs
from __future__ import print_function

import json
import urllib
import boto3

import gzip

print('Loading function')

s3 = boto3.client('s3')

def lambda_handler(event, context):
    print("[LambdaLog] Received event: " + json.dumps(event, indent=2))

    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
    try:
        s3.download_file(bucket, key, '/tmp/file.dat')

        if ('.gz' in key):
            f = gzip.open('/tmp/file.dat', 'rb')
        else:
            f = open('/tmp/file.dat', 'r')
        content = f.read()
        f.close
        print(content)

        return 0
    except Exception as e:
        print(e)
        print('[LambdaLog] Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e
```
AWSとスパコンを比較する方法-スパコン用ベンチマークソフトを動かしてみる

前に、[お手元のマシンとスパコンを比較する方法](http://qiita.com/shibacow/items/753e1d46882152e46757)と言うなんともアホっぽい記事を書いた。更に思った。Amazon EC2の最もCPUが高いマシンと、比べてみたらどうだろうか？
実際のスパコンは、メモリーやストレージ性能も段違いなので、あまり真に受けないように。

# AWS c4.8xlarge でLINPACK ベンチマークを動かす。
という訳で、AWSで最もCPUが早そうなマシンを使って、スパコンと性能の比較をしてみる。

今回使用したマシンはこちら

c4.8xlarge

|モデル|vCPU|メモリ|
|:--:|:--:|:--:|
|c4.8xlarge|36core|60GB|

ベンチマークソフトの入手は、前回の[実験](http://qiita.com/shibacow/items/753e1d46882152e46757)を参考。

# LINPACKベンチ実行

```
$ ./runme_xeon64
```

 と実行すれば、ベンチマークが走る

# 実行結果

```shell-session

ubuntu@ip-*-*-*-*:~/l_mklb_p_11.3.1.002/benchmarks_11.3.1/linux/mkl/benchmarks/linpack$ ./runme_xeon64
This is a SAMPLE run script for SMP LINPACK. Change it to reflect
the correct number of CPUs/threads, problem input files, etc..
./runme_xeon64: 37: [: -gt: unexpected operator
Fri Nov 13 11:26:24 UTC 2015
Intel(R) Optimized LINPACK Benchmark data

Current date/time: Fri Nov 13 11:26:24 2015

CPU frequency:    3.126 GHz
Number of CPUs: 2
Number of cores: 18
Number of threads: 36

Parameters are set to:

Number of tests: 15

中略

Performance Summary (GFlops)

Size   LDA    Align.  Average  Maximal
1000   1000   4       111.9889 130.8526
2000   2000   4       238.4829 241.5401
5000   5008   4       339.5006 343.8180
10000  10000  4       504.4043 507.6466
15000  15000  4       561.8308 568.8488
18000  18008  4       605.1949 607.6225
20000  20016  4       612.9355 612.9947
22000  22008  4       616.1507 618.2845
25000  25000  4       625.9232 626.5519
26000  26000  4       629.0290 629.1309
27000  27000  4       629.0215 629.0215
30000  30000  1       630.3005 630.3005
35000  35000  1       631.0244 631.0244
40000  40000  1       642.6358 642.6358
45000  45000  1       634.4839 634.4839

Residual checks PASSED

End of tests

Done: Fri Nov 13 11:38:43 UTC 2015
```

長いので省略した。全部の結果は[こちらのgist](https://gist.github.com/shibacow/51c3085d19e539946f1c)にある .


結果を見ると、630GFlops位になりそうだ。

ちなみに、その時にCPUの使用率はこんなもん。

![aws_cpu.png](https://qiita-image-store.s3.amazonaws.com/0/26986/8d6fdcb0-207b-ee9b-6457-c4f68e9f543b.png)

効率的に各CPUを使えているみたいだ。

#スパコンと比べると

先の[記事](http://qiita.com/shibacow/items/753e1d46882152e46757)を参考にすると、京コンピュータの実効性能は、10510TFlopsだそうだ。

10,510TFlopsは10,510,000GFlopsなので、10,510,000/630より約16682倍になり、**約16000倍**くらいの性能のようだ。

[こちら](http://www.top500.org/lists/1996/11/)によると、1996年の11月のTOP1よりは性能が良いようだ。Rmaxを見れば良いらしい。

|システム名|rMax(GFlops)|
|:--:|:--:|
|Center for Computational Sciences, University of Tsukuba Japan|368.2|
|aws c4.8xlarge|630|

次の[ランキング](http://www.top500.org/lists/1997/06/)では、Sandia National Laboratories United Statesが突如、**1,068.0**GFlopsを叩きだした。


ちなみに、先の程の[記事](http://qiita.com/shibacow/items/753e1d46882152e46757)で、MacBookPro(core-i5-2.5GB)の性能を計測しており、その性能は37GFlops位なので、630/37は17倍位になり、aws c4.8xlargeは17倍くらい高性能だと考えられ、まあそんなもんかなと言う気がする(小数演算の性能しか比べていないので本当の性能比較はもっと複雑です・・)。
TensorBoardが動かず絶望した人へのメモ


TensorFlowには可視化ツールTensorBoardが付いています。pipでインストールした人ならコンソールで`tensorboard`とすると、何らかの反応があると思います。

なにやら、`tensorboard`としただけじゃダメだよー、logdirを指定してねって言われます。で、「じゃあ、ここをlogdirとする！」と、`tensorboard --logdir=.`のようなことをすると失敗します。

localhost:6006を開くとなにやら、GUIっぽいものが登場します。コンソールの方では、アクセスを見てガーっとログが流れると思います。しかし、ちょっと触ると、「で、これでなにするの？」ってなるでしょう。

例えば、[このチュートリアル](http://tensorflow.org/tutorials/mnist/tf/index.md)を、自分の環境に合わせたり一箇所間違いを修正したりしながら、読み進めると、TensorBoardを利用してプログラムを可視化する話が出てきます。これに当たるようなことまで進むとどうやらTensorBoardがすぐにでも使えて動くはずです。けど、動かない・・・なにかがおかしい・・・

[ここ](http://stackoverflow.com/questions/33639123/i-can-not-understant-why-tensorboard-doesnt-work-properly?s=1|1.3857)にとてもわかりやすく、簡単な答えが書いてありました。

#結論
`tensorboard --logdir=${PWD}`
とする。つまり、`.`なんてのは使えなくて、絶対パスを書かなくてはいけないということでした。
ということで、グラフが出てきました。（Firefoxでは動かなかい。chromeでは動く。）めでたしめでたし。
Clojure1.7から入ったvolatile!とは？

Clojure 1.7からVolatileを扱うための関数`volatile!`, `vswap!`, `vreset!`, `volatile?`が導入されました。
Volatileはtransducersの実行性能を上げるために導入した、アトミック性をなくしたAtomのようなもののようです。

使い方もAtomと似てます。

```volatile-sample.clj
(def v (volatile! {:a 1}))
(vswap! v assoc :b 2)
(vreset! v {:c 3})
```

実装としてはJavaのvolatileそのものです。なので`deref`や`vreset!`はアトミック操作になりますが、`vswap!`は違うので複数スレッドから同時に`vswap!`するのはダメです。

Javaのvolatileも使いどころが難しいので、Clojureでも有効に使うのは難しいかもしれません。
スレッドローカルなところでお手軽なミュータブル変数としては使えるかもしれないです。
※ローカルなら`with-local-vars`でもいいけど・・・
python > string > 改行を消す > work=src.replace("\n", "")

pythonで改行文字を消したい。replace()というのがあるようだ。

参考
http://orangain.hatenablog.com/entry/20100503/1272900555

http://ideone.com/PEqqqL

```test.py
src="set,mon,192.168.10.8,6000\n"
work=src.replace("\n", "")
print "[", src, "]"
print "[", work, "]"
```

```txt:結果
Success	time: 0.03 memory: 44680 signal:0
[ set,mon,192.168.10.8,6000
]
[ set,mon,192.168.10.8,6000 ]
```
python > string > split(",")の結果の個数を得る > cmds="set,mon,192.168.10.8,6000".split(",") してから count = len(cmds)

pythonでsplit(",")した後に取得した要素数を得たい

参考 http://stackoverflow.com/questions/22101086/split-and-count-a-python-string

http://ideone.com/PiAL7h

```test.py
cmds="set,mon,192.168.10.8,6000".split(",")
count = len(cmds)
print count
```

```txt:結果
4
```
お手元のマシンとスパコンを比較する方法-スパコン用ベンチマークソフトを動かしてみる

#スパコンと自分のマシンを比べてみる

最近、スパコン周りの話題が人気だ。
[またもスパコンにメス　「見合った成果説明できず」](http://news.tv-asahi.co.jp/news_politics/articles/000062367.html)
京速コンピューターが、予算にあった成果があるかという突っ込みが入ったそうだ。
そのニュースをぼーっと見ながら、疑問に思った。自分の手元にあるマシンに比べてどの位、京速コンピュータは速いのだろう？

ということで、スーパーコンピューターでよく使われるベンチマークソフト　LINPACKを手元で動かしてみて、どの位違うものなのか比べてみることにする。

実際のスパコンは、メモリーやストレージ性能も段違いなので、あまり真に受けないように。

#　ベンチマークソフトを入手

スーパーコンピュータの準位比較としては[TOP500](https://ja.wikipedia.org/wiki/TOP500)というランクが有名だ。そこではLINPACKベンチマークというベンチマークが使われているようだ。LINPACKについては[こちら](https://ja.wikipedia.org/wiki/LINPACK)。

書いてあることはよくわからないが、世の中よくしたもので、ベンチマークソフトを配っている企業がある。INTELにLINPACKベンチマークソフトがあった。

こちらの[サイト](https://software.intel.com/en-us/articles/intel-math-kernel-library-linpack-download)から、アプリをダウンロードすれば、実行バイナリーを入手できるようだ。本来であればソースコードからコンパイルするらしいが、めんどくさいので、バイナリーを利用する(Linux,windows,osx版がある)。

macで試したので、osx版をダウンロードして、解凍した。

解凍後 ```m_mklb_p_11.3.1.002/benchmarks_11.3.1/mac/mkl/benchmarks/linpack```と深いフォルダーに、```runme64```とか```runme32```というプログラムがある。```linpack_cd64```がプログラムの本体で、```runme64```がそれを簡単に呼び出すスクリプトになっている。

#ベンチマーク実行

```
$./runme64
```
を実行すれば、ベンチマークが始まり、終了後実行結果が表示される(5分くらいかかる)。
実行する環境は、macbookpro mid 2012 Core-i5 2.5GHz-2core メモリー8GBだ。

# 実行結果

```shell-session
This is a SAMPLE run script for SMP LINPACK. Change it to reflect
the correct number of CPUs/threads, problem input files, etc..
2015年 11月13日 金曜日 20時21分05秒 JST
Intel(R) Optimized LINPACK Benchmark data

Current date/time: Fri Nov 13 20:21:05 2015

CPU frequency:    3.091 GHz
Number of CPUs: 1
Number of cores: 2
Number of threads: 4

(中略)

Performance Summary (GFlops)

Size   LDA    Align.  Average  Maximal
15000  15000  4       33.6330  33.6330
14000  14008  4       36.3750  37.2843
13000  13000  4       36.3239  37.4845
12000  12008  4       32.0855  33.6463
11000  11000  4       35.4210  35.5010
10000  10008  4       37.1876  37.4411
8000   8008   4       35.5023  37.2433
6000   6008   4       35.5924  36.1413
1000   1000   4       17.0286  17.2889

Residual checks PASSED

End of tests

-n Done:
2015年 11月13日 金曜日 20時30分36秒 JST
```

途中省略した。全文は[こちら](https://gist.github.com/shibacow/122043e43a158780349f)

Performance Summaryを項目を見ると大体33GFlopsから37GFlops位出ているようだ。

#スパコンと比べてみると。

実際に、京速コンピューターと較べてみる。

手元のmac book proが約37GFlops,[こちら](https://ja.wikipedia.org/wiki/TOP500)によると、京のLINPACKの実効性能(Rmax)は、10510TFlopsだそうだ。

10,510TFlopsは10,510,000GFlopsなので、10,510,000/37より約284,054倍になり、**約28万倍**くらいの性能のようだ。

ちなみに、[こちら](http://www.top500.org/list/1999/11/?page=5)を調べたら、1999年の400位くらいと、手元のmacbookproは同じ位のようだ。15年ほどすると、手元のマシンも、スパコン並になるのだな。

## 追記

AWSのEC2でCPUが速いマシンと比較してみた。

http://qiita.com/shibacow/items/08490ac51aeb0d131d2e
macでの開発始めました

# mac始めました
その際にやったことなど
追記型です
2018/03/03
wineについて追記

## sshを手軽にする
http://nauthiz.hatenablog.com/entry/20100919/1284892108

## bashよりはzshがいいな
https://github.com/robbyrussell/oh-my-zsh

## installならbrewが便利です
http://brew.sh/index_ja.html
一緒にcaskもinstallしたほうがいいかも

### brewでインストールしたものをaliasに登録しましょう
tomcatの場合ですが他にも使える

```
alias tomcat="$(brew --prefix tomcat)/bin/catalina $1"
```

### installしたらupgradeとかupdateとかもしましょう
http://glass5er.hatenablog.com/entry/20121208/1354983531

## wineを入れる
windowsにしかないアプリケーションを動かす必要があるとき

```
brew install wine
```
ってやったらうまくいくかと思いきや、 ```Error: SHA256 mismatch```といわれてinstallできず。代わりに

```
brew cask install wine-stable
```
とするとinstallできた。wine stableがアプリケーションとして登録されたので、以下を叩いてwineのコンソールを開く

```
/Applications/Wine\ Stable.app/Contents/MacOS/wine
```
立ち上がったコンソール上で必要なものをまたダウンロードしていくために以下を実行する。

```
winecfg
```

## shortcutを覚える
<dl>
<dt>terminal</dt>
<dd><a href="http://dashkards.com/terminal">http://dashkards.com/terminal</a></dd>
<dt>idea</dt>
<dd><a href="http://qiita.com/yoppe/items/f7cbeb825c071691d3f2">忙しい人のためのIntelliJ IDEAショートカット集（´-`）</a><dd>
<dt>excel</dt>
<dd><a href="http://qiita.com/matsu911/items/6e47c00265ab74ae7ae7">macのexcelのショートカット一覧</a></dd>
</dl>

## その他
### clipboard管理
[clipy](http://bamka.info/clipy)
上のリンクのものだと起動できない可能性がある（僕の環境だと信用できる元から取得されて〜〜とか言われた）のでcaskでインストールする
revelをインストールしたいのだけど失敗？

iMacのターミナルに
```$ go get github.com/robfig/revel
```
と入力すると
```package github.com/robfig/revel: cannot download, $GOPATH not set. For more details see: go help gopath``` が表示されます。

この方のブログ　https://twitter.com/tutuming
http://blog.wacul.co.jp/blog/2014/08/22/go/ を拝見しましたが$GOPATHの設定がイマイチよくわかりませんでした。
助けてください。
python > string > 文字列のsplit > cmds = rcvd.split(",")

","区切り文字列を分解したい。

参考
http://python.civic-apps.com/string-split-join/

http://ideone.com/23vUfy

```test.py
rcvd = "set,mon,192.168.10.3,9000"
cmds = rcvd.split(",")
print cmds[0]
print cmds[1]
print cmds[2]
print cmds[3]
```

```txt:結果
Success	time: 0.03 memory: 44680 signal:0
set
mon
192.168.10.3
9000
```
Bash覚え書き


ただのループ
```
for i in `cat /etc/hosts` ; do echo ; done
```

/etc/hosts から、ホスト名だけを取得する

```
for i in `cat /etc/hosts | grep "searchhostname" | awk '{print $2} ; do echo $i ; done
```

日付のフォルダを作成する

```
mkdir `date '+%Y%m%d'`
```

dfのノード名、日付、フォルダのファイルを作成する

```
df -kh > df_`uname -n`_`date +%Y%m%d_%H%M%S`.txt
```

teeコマンド使い方
（コマンド実行＆結果出力 ＋ ファイルに保存が同時にできる。追記したいなら -a）

```
ls -l | tee -a test.txt

ls -l | tee `date +%Y%m%d`.txt
```
goでDotenvを使用する

サーバー情報やパスワードは外部にもらしたくない場合などRuby、Pythonの場合はdotenvを使用するケースが多いですがGoにもdotenvに対応したライブラリーはあります

goの場合はgodotoenvを使うのがポピュラーみたいなのでこれを使用します

##使用法

下記のライブラリーをインストールしてください。

```
go get github.com/joho/godotenv
```

- .envファイルを作成してください

```.env
USER_NAME=root
PASSWORD=password
```

```hello.go
package main

import (
    "os"
    "fmt"
    "log"
    "github.com/joho/godotenv"
)

func Env_load() {
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }
}

func main() {
    Env_load()
    message := fmt.Sprintf("user_name=%s password=%s", os.Getenv("USER_NAME"), os.Getenv("PASSWORD"))
    fmt.Println(message)
}

// => user_name=root password=password

```


- アプリケーションの開発などで固有の環境で使用したい場合  

開発環境用とテスト用を想定して.env.developmentと.env.testを作る

.env.developmentを作成

```
USER_NAME=root
PASSWORD=password
DATABASE_NAME=hoge_development
```

.env.testを作成

```
USER_NAME=root
PASSWORD=password
DATABASE_NAME=hoge_test
```


```hello.go
package main

import (
    "os"
    "fmt"
    "log"
    "github.com/joho/godotenv"
)

func Env_load() {
　　　// 環境変数GO_ENVは適当につけました
    if os.Getenv("GO_ENV") == "" {
        os.Setenv("GO_ENV", "development")
    }

    err := godotenv.Load(fmt.Sprintf(".env.%s", os.Getenv("GO_ENV")))

    if err != nil {
        log.Fatal("Error loading .env file")
    }
}

func main()  {
    Env_load()
    message := fmt.Sprintf("dbname=%s user=%s password=%s",
            os.Getenv("DATABASE_NAME"),
            os.Getenv("USER_NAME"),
            os.Getenv("PASSWORD"),)

    fmt.Println(message)
}

```

実行してみる

```
$ go run hello.go
//=> dbname=hoge_development user=root password=password
```

```
$ GO_ENV=test go run hello.go
//=> dbname=hoge_test user=root password=password
```
CentOSでSparkを試してみる（2015年秋）


CentOSでHadoopとHiveを試してみるの続き。
よく、SparkがHadoopの機能の１つみたいに紹介されているが、全く違うもの。どちらかというとscalaの拡張機能と考えた方が近いか。もちろん、Hadoopの処理結果をHDFS経由で利用はできます。

##インストール

###scala

まずはScalaのインストールから。

```bash
wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
tar zxfv scala-2.11.7.tgz
mv scala-2.11.7 /usr/
```

###spark

```bash
wget http://ftp.riken.jp/net/apache/spark/spark-1.5.2/spark-1.5.2-bin-hadoop2.6.tgz
tar zxfv spark-1.5.2
mv spark-1.5.2 /usr/
```

###SCALA_HOME,SPARK_HOME,PATHの設定

.bashrcに下記を書く。

```bash
export SCALA_HOME=/usr/scala-2.11.7
export SPARK_HOME=/usr/spark-1.5.2
export PATH=$SCALA_HOME/bin:$PATH
```

spark（コンソール）の起動

```bash
cd $SPARK_HOME
bin/spark-shell
.
.
.
scala>
```
となれば、一応動いている。
インタラクティブシェルを抜けるには、

```bash
scala> :q
```
とする。
>sacla> :quiteでもよい。



##Hadoopとの連携？

何もHadoopと連携しなければいけないものでも無いが、HDFS上のファイルを処理してみる。
ファイルとしては、前にHiveで生成したファイル（/outpu/000000_0)を利用してみる。

```bash
scala> val hdfs_file = sc.textFile("hdfs://127.0.0.1:9000/output/000000_0")

scala> hdfs_file.count()
res4: Long = 5

scala> hdfs_file.filter(line => line.contains("新")).foreach(println)
新橋店100
新宿店340
```

###Spark SQL

Sparkでは標準？でSQLインターフェースを利用することもできる。
以下の例では、

```text
新橋店,100
新宿店,340
池袋店,874
渋谷店,400
```

という内容の/root/data.csvファイルがあることを前提とした操作。

```bash
cd $SPARK_HOME
bin/spark-sql

spark-sql>
spark-sql> show databases;
spark-sql> create database testdb;

create table sales(shop string,sales int)
row format delimited fields terminated by ','
stored as textfile;

load data local inpath "/root/data.csv" into table sales;

select * from sales where shop like '新%';
```
なぜか、上記data.csvファイルをHDFSコピーして、

```bash
load data inpath “/input/data.csv" into table sales;
```
とすると、

```bash
15/11/17 04:01:37 INFO ParseDriver: Parsing command: load data inpath “/input/data.csv" into table sales
MismatchedTokenException(15!=313)
	at org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(BaseRecognizer.java:617)
.
.

```
といったエラーになる。これについては、引き続き調査します。たぶん初歩的な何か。
OmniAuth OAuth2 1.4.0 以降で `Invalid Credentials` エラー


## 現象

最近作り始めた Rails のアプリケーションで [OmniAuth OAuth2](https://github.com/intridea/omniauth-oauth2) を使おうとしたら、なぜか、ずっと `Invalid Credentials: invalid_grant` のエラーになってしまっていました。

Doorkeeper で作った別の Rails アプリが OAuth2 のサーバだったのですが、前に作った Rails アプリからは問題ない……ほとんど同じ作り方のはずなのに。


## 調査

おかしいと思って調べたら、どうやら 1.4.0 に入り込んだ変更のためらしいです。

[1.4.0 makes my rails app unable to sign in with facebook · Issue #81 · intridea/omniauth-oauth2](https://github.com/intridea/omniauth-oauth2/issues/81)

に書いてある [このコメント](https://github.com/intridea/omniauth-oauth2/issues/81#issuecomment-151281907) によると、[OAuth 2 のこの仕様](http://tools.ietf.org/html/rfc6749#section-3.1.2) を実装したところ、いろんな OAuth2 のプロバイダが壊れてしまったようです。

つまり、自分で OAuth2 のプロバイダを書いているようなプロジェクトが被害を受けたようです（自分のプロジェクトもそうでした）。


## 対策

対策は大きく2つあります。

### 1. Gem のバージョンを下げる

1.3.1 に下げれば回避できます。

```ruby
gem 'omniauth-oauth2', '~> 1.3.1'
```

### 2. `callback_url` をオーバーライドする

軽く説明をすると、本来コールバックで URL を変更してはいけないところを、今までの OmniAuth プロバイダはそれをしてしまっており、1.4.0 の変更がそれをチェックしてしまっていることがことの原因です。
なので、プロバイダの `Strategy` 側も callback_url を仕様通り、変更しないまま返せばいいわけのようです。

```ruby
module OmniAuth
  module Strategies
    class YourOAuth2Strategy < OmniAuth::Strategies::OAuth2
        :
      def callback_url
        full_host + script_name + callback_path
      end
```

参考： [fix broken backward compatibility (callback_url) by zmajstor · Pull Request #82 · intridea/omniauth-oauth2](https://github.com/intridea/omniauth-oauth2/pull/82)
残念（？）ながら、こちらのプルリクエストは取り込まれませんでした。


個人的には、いずれ gem のバージョンを上げるときが来る点と仕様に沿っている点から、後者を選ぶべきかとは思います。
CakePHPのプラグインのテスト実行方法

CakePHPのプラグイン実行時にcakeコマンドでのテストコード実行方法が通常と異なったため、そのメモ書き。

## テストコードの配置場所

以下のように配置。

> app
> 　/Conifg
> 　/Controller
> 　/Model
> 　　/SampleApp.php
> 　/Plugin
> 　　/Demo 
> 　　　/Conifg
> 　　　/Controller
> 　　　/Model
> 　　　　/DemoApp.php
> 　　　/Test　　　　　　　　　　// ← プラグインの場合のの配置場所
> 　　　　/Case
> 　　　  　/Model
> 　　　　　　/DemoAppTest.php
> 　　　　/Fixture
> 　　　  　/Model
> 　　　　　　/Default
> 　　　　　　　/DemoAppFixture.php
> 　　　/View
> 　　　/webroot
> 　/Test　　　　　　　　　　　// ← 通常の配置場所
> 　　/Case
> 　　　/Model
> 　　　　/SampleAppTest.php
> 　　/Fixture
> 　　　  /Model
> 　　　　　/Default
> 　　　　　　/SampleAppFixture.php
> 　/View
> 　/webroot

## テストコードからの参照パス
core.phpなどの設定ファイルで、App::buildにプラグイン内のパスを設定していない場合は、以下のように参照。

```DemoAppTest.php
App::uses('DemoApp', 'Demo.Model');
```

Fixtureのパスは以下のようにして設定すると参照可能です。

```DemoAppTest.php
public $fixtures = ['plugin.Demo.Default/DemoApp'];
```

## テスト実行
cakeコマンド実行する場合は以下でOK。

> cake test demo Model/DemoApp
RailsアプリにオレオレRackアプリをマウントする

# なにをしたいか
`/example`みたいなパス以下のリクエストを根こそぎ処理する。

# 簡単にマウントしてみる

適当なRailsアプリを作る

```shell-session
$ rails new mount_rack_example
```

`lib`以下をロードするようにする

```rb:config/application.rb
module MountRackExample
  class Application < Rails::Application
    config.autoload_paths += %W(#{config.root}/lib)
  end
end
```

Rackアプリを適当に作る

```rb:lib/rack_example.rb
module RackExample
  def self.call(env)
    p env
    [200, {}, ["#{env}"]]
  end
end
```

※ `call`メソッドはクラスメソッドで定義しないといけない。


　　
マウントする

```rb:config/routes.rb
Rails.application.routes.draw do
  mount RackExample, at: '/example'
end
```

試しに見てみる

```shell-session
$ bundle exec rails s
$ open http://localhost:3000/example
```

# 知見

- `env["PATH_INFO"]`には、prefixである`/example`が無く、http://localhost:3000/example へのアクセスであると`"/"`になる

- `mount`メソッドは https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb#L600 にある


# あわせて読みたい

[Ruby - Rack解説 - Rackの構造とRack DSL - Qiita](http://qiita.com/higuma/items/838f4f58bc4a0645950a)
smallbasicでビット操作

smallbasicは、ビット操作の演算子が無い。
0～255を使って、なんとかする。
以下は、２進数表示。

# サンプルコード
```
a = 255
If a - 128 < 0 then
  TextWindow.Write(0)
Else
  TextWindow.Write(1)
  a = a - 128 
endif
If a - 64 < 0 then
  TextWindow.Write(0)
Else
  TextWindow.Write(1)
  a = a - 64 
endif
If a - 32 < 0 then
  TextWindow.Write(0)
Else
  TextWindow.Write(1)
  a = a - 32 
endif
If a - 16 < 0 then
  TextWindow.Write(0)
Else
  TextWindow.Write(1)
  a = a - 16
endif
If a - 8 < 0 then
   TextWindow.Write(0)
Else
   TextWindow.Write(1)
   a = a - 8 
endif
If a - 4 < 0 then
  TextWindow.Write(0)
Else
  TextWindow.Write(1)
  a = a - 4 
EndIf
If a - 2 < 0 then
  TextWindow.Write(0)
Else
  TextWindow.Write(1)
  a = a - 2 
EndIf 
TextWindow.Write(a)
TextWindow.WriteLine("")
```
Excelで選択セル内容をGoogle検索するショートカット

'ショートカットに登録すると人によっては便利です。
'選択セル内容をgoogle検索する
Sub Google()
    Dim myword As String
    Dim myurl
    myword = Selection(1).Value
    'urlの時はそのまま表示
    If Left(Trim(myword), 4) = "http" Then
        myurl = Trim(myword)
    'それ以外はGoogle検索
    Else
        myurl = "https://www.google.co.jp/search?q=" & UrlEncodeUtf8(myword)
    End If
    CreateObject("wscript.shell").Run myurl
End Sub

'URL文字列をUtf8でエンコードする関数
Function UrlEncodeUtf8(ByRef strSource As String) As String
    Dim objSC As Object
    Set objSC = CreateObject("ScriptControl")
    objSC.Language = "Jscript"
    UrlEncodeUtf8 = objSC.CodeObject.encodeURIComponent(strSource)
    Set objSC = Nothing
End Function
[Eclipseプラグイン開発] UIスレッド判定とダイアログ表示


# 目的

- デバッグ中あるいは問題発生時など、何らかのダイアログを表示したいことはあります
- でも、バックグラウンドスレッドの場合には単純にダイアログを表示することはできないです
- 実行中のスレッドが UI スレッドかどうかを判定して、ダイアログの表示の仕方を切り替えるユーティリティを作ってみました

# UI スレッド判定

Eclipse で UI スレッド以外から、画面関係の操作をすると例外が発生します。

該当のチェック場所は `org.eclipse.swt.widgets.Widget#checkWidget()` だと思います。

この処理を見ると、Widget オブジェクトが持っている Display オブジェクトとくくりついているスレッドと、現在のスレッドが一致しているかを確認しているようです。

これと同じ判定をすれば、現在のスレッドが UI スレッドかどうかの判定ができると思います。
ただ、該当のロジックでは Thread オブジェクトだけではなく、OSレベルのスレッドIDもチェックしているようです。

```java:Widget.java
// 省略

protected void checkWidget () {
	Display display = this.display;
	if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
	if (display.thread != Thread.currentThread ()) {
		/*
		* Bug in IBM JVM 1.6.  For some reason, under
		* conditions that are yet to be full understood,
		* Thread.currentThread() is either returning null
		* or a different instance from the one that was
		* saved when the Display was created.  This is
		* possibly a JIT problem because modifying this
		* method to print logging information when the
		* error happens seems to fix the problem.  The
		* fix is to use operating system calls to verify
		* that the current thread is not the Display thread.
		* 
		* NOTE: Despite the fact that Thread.currentThread()
		* is used in other places, the failure has not been
		* observed in all places where it is called. 
		*/
		if (display.threadId != OS.GetCurrentThreadId ()) {
			error (SWT.ERROR_THREAD_INVALID_ACCESS);
		}
	}
	if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
}

// 省略
```

コメントを見る限りだと、IBM の JavaVM 1.6の JIT のバグらしきものの対策のように思います。
残念ながら、OSレベルのスレッドIDを取得することはできないので、無視してしまいます。

# ダイアログを表示するメソッド

そんなわけで、以下のようなメソッドを作りました。

```java
public static void openMessageDialog(final String message) {
	IWorkbench workbench = PlatformUI.getWorkbench();
	Display display = workbench.getDisplay();
	if (display == null || display.isDisposed()) {
		// Display がない
		return;
	}
	IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
	if (window == null) {
        // IWorkbenchWindow がない
		return;
	}
	final Shell shell = window.getShell();

	if (display.getThread() == Thread.currentThread()) {
		// UI スレッドの場合
		MessageDialog.openInformation(shell, "Message", message);

	} else {
		// バックグラウンドスレッドの場合
		display.syncExec(new Runnable() {
			@Override
			public void run() {
				MessageDialog.openInformation(shell, "Message", message);
			}
		});
	}
}
```

ダイアログの出し方の詳細は好みがあると思いますし、エラーダイアログ(ErrorDialog)を出したいケースもあるかと思います。
また上記では同期(syncExec)でダイアログを表示していますが、ケースによっては非同期(asyncExec)で表示したいこともあるかもしれません。
実装の詳細についても Optinal が使いたいとか、ラムダが使いたいとかありますが、今回は Java7 以前でも動くように匿名クラスを使ってみました。

とりあえず、UIスレッドでもバックグラウンドスレッドからでも簡単にメッセージダイアログが表示できるようになりました。
PHP から Go の関数を呼び出す

libffi を使って PHP から Go の関数を呼び出して速度を計測しました。

参考記事
-------

[RubyからGoの関数をつかう → はやい](http://qiita.com/grj_achm/items/679b3f3af2cf377f0f02) の記事に触発されて書きました。

システム要件
----------

 * PHP 7.0
 * Go 1.5

libffi のインストール
-------------------

Mac OS X の homebrew では次のコマンドでインストールできます。

```
brew install libffi
```

MFFI のインストール
-----------------

PHP 7.0 であれば、[MFFI](https://github.com/mgdm/MFFI) を使うことができます。

```bash
git clone https://github.com/mgdm/MFFI.git
cd MFFI
phpize
./configure
make
make install
echo extension=mffi.so > /usr/local/etc/php/7.0/conf.d/ext-mffi.ini
```
mffi エクステンションが読み込まれているか確認しましょう。

```bash
php -m | grep mffi
```

うまく読み込まれていない場合、設定ファイルを確認してみましょう。

```bash
php --ini
```

Go のコードから共有ライブラリ (so) を生成する
---------------------------------------

フィボナッチ数列を再帰関数で定義してみましょう。

```go:fib.go
package main

import "C"

//export fib
func fib(n uint) uint {
    if n < 2 {
        return n
    }

    return fib(n-1) + fib(n-2)
}

func main() {}
```

`go build` コマンドで so ファイルを生成しましょう。

```bash
go build -buildmode=c-shared -o fib.so fib.go
```

PHP から呼び出す
---------------

PHP でフィボナッチ数列を再帰関数で定義してみましょう。PHP 7.0 から引数と戻り値に `int` の型を宣言できるようになりました。

```php:fib.php
function fib(int $n): int {
    return $n < 2 ? $n : fib($n - 1) + fib($n - 2);
}

echo fib(10), PHP_EOL;
```

今度は so ファイルを読み込んで、go の関数を呼び出してみましょう。MFFI エクステンションのチュートリアルは[こちら](http://mgdm.net/weblog/mffi/)をご参照ください。

```php:go-fib.php
use MFFI\Type;

$library = new MFFI\Library('fib.so');
$fib = $library->bind('fib', [Type::TYPE_INT], Type::TYPE_INT);

echo $fib(10), PHP_EOL;
```

C 言語から呼び出す
---------------

せっかくなので、C 言語からも呼び出してみましょう。

```c:fib.c
#include <stdio.h>
#include "fib.h"

int main(void) {
    printf("%llu\n", fib(10));

    return 0;
}
```

ビルドして実行してみましょう。

```bash
gcc -pthread fib.c fib.so -o fib
./fib
```

簡易ベンチマーク
--------------

n を10ごと増やしてベンチマークをとってみました。n = 20 まではほとんど代わらず、n = 40 で急激に大きな速度の差が生まれるようになりました。

### n = 10

```bash
time php fib.php
55

real	0m0.054s
user	0m0.037s
sys	0m0.012s
```

```bash
time php go-fib.php
55

real	0m0.060s
user	0m0.038s
sys	0m0.017s
```


### n = 20

```bash
time php fib.php
6765

real	0m0.060s
user	0m0.042s
sys	0m0.013s
```

```bash
time php go-fib.php
6765

real	0m0.059s
user	0m0.036s
sys	0m0.017s
```

### n = 30

```bash
time php fib.php
832040

real	0m0.365s
user	0m0.346s
sys	0m0.013s
```

```bash
time php go-fib.php
832040

real	0m0.066s
user	0m0.045s
sys	0m0.016s
```

### n = 40


```bash
time php fib.php
102334155

real	0m39.840s
user	0m39.177s
sys	0m0.145s
```

```bash
time php go-fib.php
102334155

real	0m1.237s
user	0m1.209s
sys	0m0.020s
```
SVGをjQuery・JavaScriptで操作する

## HTMLにSVGを埋め込む

```svg.html
<object id="svg-obj" data="/images/sample.svg" type="image/svg+xml"></object>
```

`img`タグではなく`object`タグで表記する。
## JavaScriptでSVG読み込み

```svg.js
// SVGオブジェクト
var $svg;
// SVG読み込み
var loadSvgObject = function() {
    if (!$svg) {
        var svgTag = document.getElementById('svg-obj');
        if (!svgTag) return;
        var svgDoc = svgTag.contentDocument;
        $svg = $(svgDoc).find('svg');
    }
};
```

こんな感じで関数化する。
SVGファイルをちゃんと読み込んでいるか確認する場合は、

```js
console.dir($svg);
```
とかデバッグで中身をチェック。
重要なのは、ちゃんとページ読み込み後に実行すること。

```js
$(document).ready(function() {
    // NG:読み込まれない!
    loadSvgObject();
});

$(window).on('load', function() {
    // OK
    loadSvgObject();
    //...処理
});
```

ただ、これだとブラウザの戻るボタンで戻った時にちゃんと読み込んでくれなかったりするから、
リロードするなり対策する。

以上。
GitlabとRedmineを連携させる方法の覚書。

# 追記（2016/1/20）
タイポしてたみたいですね、すみません。
「Redmineに Redmine Github Hook Pluginをインストールする。」の項目で、redmine_github_hook.gitのurlをミスっていたようです。
指摘してくれた方、ありがとうございます。


#前提
* RedmineとGitlabが別サーバで用意されている。
* Gitlabへgitユーザが存在し、developerグループへ所属している。
* ファイルパスなどはデフォルトのものを利用しているので、適宜読み替えてください。

#Redmineに Redmine Github Hook Pluginをインストールする。
次のコマンドを実行。

```bash
cd /opt/redmine/plugins
git clone git://github.com/koppen/redmine_github_hook.git
touch /opt/redmine/tmp/restart.txt
```

ブラウザでredmineにアクセスするとredmineが再起動され、プラグインがインストールされる。

#プロジェクトにリポジトリを設定
Redmineの対象プロジェクト（Sampleプロジェクトとする）の設定 > リポジトリから新しいリポジトリを設定する。
※ここでは、bareかつローカルなリポジトリしか設定できない。そのため、redmineとgitlabのサーバが別々に存在する場合、以下の作業をする必要がある。

##Gitlabサーバからアクセスするためのユーザを用意
useradd -m redmine-git 

rsa鍵認証により、Gitlabサーバのgitユーザからこのユーザに対しパスワードなしでログインできるようにしておく。 

##対象プロジェクトをRedmineサーバにクローン

```bash
mkdir -p /var/git/repos/
cd  /var/
chown redmine-git:redmine-git git -R
su redmine-git
cd /var/git/repos
git clone git@gitlab-server.com:sample.git
```

##プロジェクトにリポジトリを設定
プロジェクトに対し、2.2でクローンしたリポジトリを設定する。
Redmineのプロジェクトページにリポジトリの項目があるので、そこで指定する。

##Gitlabへコミット > Redmineのリポジトリへ反映
このままではGitlabにあるリポジトリとRedmineのリポジトリが連携されないので、pushされたらRedmineサーバの方へ反映させてやる必要がある。
Gitlabサーバの方で、custom githookを利用しコミット直後にRedmineサーバの方へpushしてやるようにする。

```bash
cd /var/opt/gitlab/git-data/repositories/sample.git
mkdir custom_hooks
touch custom_hooks/post-receive
chown git:developer custom_hooks
chown git:developer custom_hooks/post-receive
chmod +x custom_hooks/post-receive
vi  custom_hooks/post-receive
```

post-receiveの中身は以下

```bash
# すべてのブランチをredmineサーバへpush
git push ssh://redmine-git@myredmine.com/var/git/repos/sample.git refs/heads/*:refs/heads/*
```
以上の行程で、別サーバに存在するGitlabのリポジトリとRedmineのリポジトリの連携はできた。

#GitlabへRedmineとの連携を設定する。
Sampleプロジェクトの Settings > WebHooks へRedmineのWebhookを設定する。
URLは以下のようにする（{project_id}はRedmineでリポジトリを登録する時に設定した識別子）。

```
http://myredmine.com/github_hook?project_id={project_id}
```
 
また Settings > ServiciesのRedmineを設定する。項目はそれぞれredmineのトップ、ticketページ、新しいticketを発行するページを指定してやる。

#ticketとコミットが即座に連携されるようにする。 
ここまでの状態で連携設定は完了。しかし、このままコミットしても、一旦Redmineのリポジトリタブにアクセスしないとticketとの紐付けがされない。そのためコミット直後にその反映を行う必要がある。
 Gitlabサーバでcustom git hookに追記する。

```
cd /var/opt/gitlab/git-data/repositories/sample.git
vi  custom_hooks/post-receive 
```

以下の行を末尾へ追加。（{api_key}は、Redmineの管理  > 設定 > リポジトリ のAPIキー）

```
wget -q -O /dev/null https://myredmine.com/sys/fetch_changesets?key={api_key}&id={project_id}
```
 

以上で連携設定は完了。
日本語プログラミング語は「なでしこ」より「プロデル」の方が良い

初めまして、荒テックです。
最近は日本語プログラミング言語「プロデル」でツールソフトを作っています。
今までは似たようなソフト「なでしこ」を使っていましたが、正直言って
**プロデルの方が使いやすいです。**
その理由をいくつか紹介します。

#その1 デザイナーが超便利
プロデルには、強力なデザイナーツールが付属しています。

![temp2.png](https://qiita-image-store.s3.amazonaws.com/0/100507/2eb8e728-e033-5d47-450b-b74c98a53be7.png)

メニューやカレンダー、ブラウザ等をグラフィカルに配置できます。
制作したソフトのUIは即座にプログラムに反映されます。

![temp2.png](https://qiita-image-store.s3.amazonaws.com/0/100507/eb41bc62-116b-f40e-6cfd-4553140ef115.png)



#その2 実行が高速
なでしこは、ミドルクラスのPCでも実行に時間がかかりますが、
プロデルなら**一瞬で実行され**ます。ストレス無くテストが可能です。

#その3 覚えやすい文法
なでしこより若干複雑ですが、それでも他言語に比べれば遥かに覚えやすいです。
.NETの機能を簡単に使えるのは非常に嬉しいです。

#その4 実行ファイルが小さい
なでしこのExeファイル→平均2.2MB
プロデルのExeファイル→平均1MB
GUIアプリ、CUIアプリ、DLLが作成できます。

#最後に
日本語プログラミング言語には個人差があります。
是非なでしこ、プロデル共にダウンロードし、好きな方を使ってみてください!

[プロデルの公式](http://rdr.utopiat.net)
[なでしこの公式](http://nadesi.com)
Ruby on Rails で簡単な infoScoop ガジェットを作ってみる

Ruby on Rails で簡単な infoScoop ガジェットを作ってみました

# 作ってみたもの
## IOCJ 加盟団体一覧ガジェット
### 概要

[IOCJ 加盟団体一覧のサイト](https://www.infoscoop.org/iocj/member-list/)から加盟団体一覧をスクレイピングして表示するガジェットです。

<img width="413" alt="スクリーンショット 2015-11-23 15.33.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/5622/c12816a0-0b5b-77c4-99b6-940e9082c908.png">

### ガジェットURL
https://iocj-companies-gadget.herokuapp.com/gadget.xml

### ソースコード
https://github.com/teppei-tosa/iocj_companies_gadget

## Qiita の infoScoop タグがついた記事一覧を取得するガジェット

### 概要

Qiitaで infoScoop タグが付いている記事をとってくるガジェットです
単純に[API](http://qiita.com/api/v2/items?query=tag:infoscoop)の内容を表示しているだけです。

<img width="413" alt="スクリーンショット 2015-11-23 16.04.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/5622/f3a69d29-a2ee-c9ca-c9a5-0a48d82ef019.png">

### ガジェットURL
https://qiita-infoscoop-entries-gadget.herokuapp.com/

### ソースコード
https://github.com/teppei-tosa/qiita_infoscoop_entries_gadget

# Ruby on Rails で infoScoop ガジェットを作る際の注意点

infoScoopガジェットは `<Module/>` タグから始まるXMLを返す WEB サービスとして作るのですが、infoScoop はガジェット側に対して何故かXMLとしてリクエストを飛ばしてくれないため、respond_to を使っていると、UnknownFormat となってしまいます。

なので、erbも、`**.html.erb` として、アクション側も html を返す処理として実装してあげる必要があります。

詳しくは上述のふたつのガジェットのソースを参照してください。
#jQuery イベント実行時に任意の引数を渡す

## <i class="fa fa-comment"/> `trigger()`を使う

http://semooh.jp/jquery/api/events/trigger/type,+%5Bdata%5D/

## <i class="fa fa-code"/> コード

### 受け手側

```javascript:jQuery
$(document).on('click', '#button', function(event, p1, p2){
    
});
```

- 第一引数にはイベントオブジェクト(`event`)が渡ってくるので、第二引数以降(`p1, p2`)を用意。
- 他の方法としては、`arguments` で取り出すなど。

### 呼び出し側

```javascript:jQuery
$('#button').trigger('click');
$('#button').trigger('click', ['パラメータ1']);
$('#button').trigger('click', ['パラメータ1', 'パラメータ2']);
```

- `trigger()` の第二引数に配列で渡す。

### Example

```html:html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>Example</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

<script>
$(function(){
    $(document).on('click', '#button', function(event, p1, p2){
        console.log(arguments);
        console.log(p1);
        console.log(p2);
    });
    $(document).on('click', '#button1', function(){
        $('#button').trigger('click', [$(this).text()]);
    });
    $(document).on('click', '#button2', function(){
        $('#button').trigger('click', [$(this).text(), 'ほげほげ']);
    });
});
</script>

</head>
<body>

<button id="button">BUTTON</button><br/><br/>
<button id="button1">ボタン1</button><br/><br/>
<button id="button2">ボタン2</button><br/><br/>

</body>
</html>
```

### Result

Windows 7 64 bit Google Chrome バージョン 46.0.2490.86 m で実行。

|このボタンをクリック|arguments|p1|p2|
|---|---|---|---|
|BUTTON|[m.Event]|undefined|undefined|
|ボタン1|[m.Event, "ボタン1"]|ボタン1|undefined|
|ボタン2|[m.Event, "ボタン2", "ほげほげ"]|ボタン2|ほげほげ|
React.jsでローディング表示

React.jsをちょこちょこ触り始めました。
重いデータを非同期で取得してると、ローディング画面が欲しくなりますね。
というところで、React.jsでローディング画面実装の備忘録。
~~React.jsを上手く使えてないのはほっといて~~
## サンプル
* データの取得：AWSのS3のバケットを読み込み
* ローディングアイコン：[Font Awesome](https://fortawesome.github.io/Font-Awesome/)

1. 初回レンダリング時にはローディングを表示
2. データ取得が終了するとローディングを消す

### サンプルコード
```javascript
// ローディング用コンポーネント
var Loader = React.createClass({
    render: function() {
        //loadingプロパティにより処理分け
        if(this.props.isActive){
            return (
                //ローディングアイコン
                <i className="fa fa-refresh fa-spin fa-5x"></i>
            );
        } else{
            return null;
        }
    }
});

var Contents = React.createClass({
    //初期状態でloadingをtrue
    getInitialState: function() {
        return {
            loading: true,
            data: {}
        };
    },
    componentWillMount: function() {
        AWS.config.region = "REGION";
        AWS.config.update({accessKeyId: 'ACCESS_KEY_ID', secretAccessKey: 'SECRET_KEY'});
        var s3 = new AWS.S3();
        var s3ListRequst = s3.listObjects({
            Bucket: 'BUKET_NAME',
            Prefix: ''
        });

        var reactObj = this;

        //S3よりバケット内の一覧を非同期で取得
        s3ListRequst.
            on('complete', function(response) {
                //非同期通信が終わったところでloadingをfalse
                reactObj.setState({
                    loading: false,
                    data: response.data.Contents
                });
            }).
            send();
    },
    render: function() {
        var dataObj = this.state.data;
        var content = Object.keys(dataObj).map(function (key) {
            return (
                <div>{ key }</div>
            );
        });
        return (
            <div>
                //ローディング用コンポーネントにloadingを渡す
                <Loader isActive={this.state.loading} />
                { content }
            </div>
        );
    }
});

ReactDOM.render(
    <div> <Contents /> </div>,
    document.getElementById('loading')
);
```
### こんな感じになるはず
![capture.gif](https://qiita-image-store.s3.amazonaws.com/0/74129/f0368e7e-a684-2999-db17-03bc25466c57.gif)

## まとめ
[Font Awesome](https://fortawesome.github.io/Font-Awesome/) 便利すぎぃぃぃぃぃぃぃぃ
「PHP5.6.xとApache2.4.xをMacでバージョン指定(phpenv)で環境構築したメモ」を使って構築したメモ

#参考
基本これでいけます
https://pgcolony.com/entry/3239

#つまづいたとこ
###rbenvのパスを優先して設定する
.bashrcか.zshrcに以下を追記

```bash

export PATH="$HOME/.rbenv/bin:$HOME/.phpenv/bin:$PATH"
```

##libiconvのインストール
blogではliviconvはソースからインストールしてますが、僕の端末ではうまくいきませんでした。brew install liviconvいたら問題なく入っちゃいました。

##phpコマンドでエラー
```bash
~ % php
rbenv: gem: command not found
/usr/local/Cellar/rbenv-gemset/0.5.8/etc/rbenv.d/exec/gemset.bash: line 33: : command not found
```

該当箇所をみてみると、rbenv which gemをしている。コマンドラインだと普通に実行できる。なんか面倒なので、パスを直接書き換えました。

```bash
~ % rbenv which gem
/usr/bin/gem #<- このパスを使う
```


```bash
vim /usr/local/Cellar/rbenv-gemset/0.5.8/etc/rbenv.d/exec/gemset.bash

31 IFS="$OLDIFS"
32
33 # GEM_PATH="$GEM_PATH:$("$(rbenv which gem)" env gemdir)"
34 GEM_PATH="$GEM_PATH:/usr/bin/gem" <- ここに入れる
35
36 if [ -n "$GEM_HOME" ]; then
```

あとは普通にいけました。
IoTをやってみたいからソラマメ、改め「エンドウマメ」育ててみる

どうも、レプラホーンのw-matsumotoです。
自社では主にサーバーサイドのエンジニアやってます。
早速ですが、こんなタイトルで初めてみます。

# タイトルの意味
若い社員が「IoTとか興味あるんですよね～」と。
じゃー折角だから、ということで、俺もやったことのない分野だし、手を出してみることにしました。
というわけで、目的は「IoTっぽいことをしてみる」というお勉強的なお話です。
で、何でソラマメなの？ってのは、以下参照。

## そもそもの発端
若：Raspberry Piとかやりたいっす。
俺：じゃーなんか植えて、温度観測とか、自動水やりとか考えてみる？
若：いいっすねー
俺：何か、作るなら食べたりできると良いよね。んー、コーヒー豆とか、日本で作れるんかねぇ？
⇒でも[UCC](https://www.ucc.co.jp/enjoy/sukusuku/)さんのサイトによると、めっちゃ大変らしい
　収穫までに4年とか・・・
俺：これはいきなりハードル高過ぎw
若：じゃー手軽なやつで
俺：今豆まきできるのって、何だろう？
⇒ぐぐった結果、いけそうな[やつら](https://www.iris-saien.com/qa/lfx-QA001-ID-54.htm)
### ◇葉や茎を食べる野菜
* コマツナ
* ミズナ
* ミツバ
* サンチュ
* チンゲンサイ
* ホウレンソウ
* エンダイブ
* レタス

### ◇土の中の部分を食べる野菜
* カブ
* ダイコン
* ニンニク
* ビート
* タマネギ

### ◇実や種を食べる野菜
* エンドウ
* ソラマメ

俺：この中でぐっときたのにするかねぇ～
若：良いんじゃないですかねぇ～
俺：じゃーソラマメで！！
俺：なんかググっても、割と育てやすい野菜みたいだし、良さそう♪
若：じゃーそれで！！

こんな経緯で始まりました。

# どこで育てるん？
社長に相談したら、「事務所で良いよ～」とのお言葉を。
というわけで、自社の日当たり良さそうな場所を間借りすることに。

# 今後の指針
* とりあえずプランターとかソラマメの種とか、必要な物を買う
* 最低限必要なシステム構成を考える
* まずは枯らさないように日々の成長を楽しむ（こんな感じで）  
![BsRCeHvCIAAD_zy.jpg](https://qiita-image-store.s3.amazonaws.com/0/64121/9bbd5696-a9e8-37ef-6ceb-25c432b79091.jpeg)

# いきなり方向転換
* ソラマメ⇒エンドウマメになりました（は？）
* 理由：若いやつが間違えて買ってきたから
* 証拠写真  
![image](https://qiita-image-store.s3.amazonaws.com/0/64121/b7c58a73-b470-767d-8d9c-4f3a5eac0a6d.png)  
めっちゃエンドウ:expressionless: 
* 季節的に問題無いようなので、このまま進める方向で


# 要約

* 目的はRaspberry Piで温度管理や水やりなどを自動化したい
* 本当はコーヒー豆を育てたいけど、ちょっとハードル高過ぎたからソラマメで  
⇒エンドウマメに方向転換
* とりあえず園芸スキルゼロな俺と若手社員の2名で見切り発車してみる
* システム構成とか、まだなーんにも考えていない