OmniAICreator/Qiita-1.07M huggingface dataset:
React Componentのライフサイクルのまとめと利用用途

# React Componentのライフサイクルのまとめ&利用用途
利用用途については雑です。


# マウント時
- componentWillMount
- componentDidMount

マウントされるときに1度だけ実行される。以降は実行されない。

## void componentWillMount()
`render()`直前の処理。
ここで`this.setState()`を行うと、`render()`は更新されたstateを参照する。


## void componentDidMount()
実際のDOMが存在するので、DOM触り放題。
`this.setState()`はできる。


# 更新時
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate

## void componentWillReceiveProps(object nextProps)
新しいpropsを受け取ると実行される。
propsによってstateを変更する場合はここで`this.setState()`を行う。
更新時ライフサイクル内で`this.setState()`を使える場所はここだけ。
この関数内の`this.setState()`がさらなる`render()`を呼ぶことはない。


## boolean shouldComponentUpdate(object nextProps, object nextState)
パフォーマンス・チューニング時に触る。
returnでbool値を返さなければならない。
falseを返すと、以降の`componentWillUpdate()`, `render()`, `componentDidMount()`の処理がスキップされる。
`this.setState()`は呼んではいけない。呼ぶと無限ループに入り、スタックを食いつぶして止まる。


## void componentWillUpdate(object nextProps, object nextState)
`render()`前に何か準備する。
`this.setState()`は呼んではいけない。
`componentWillUpdate()`と`render()`の間のタイミングで`this.props`, `this.state`で参照できる値が更新される。


## void componentDidUpdate(object prevProps, object prevState)
新しいDOM触り放題。
`this.setState()`は呼んではいけない。


# アンマウント時
## void componentWillUnmount()
後始末を書くところ。


# 備考
以下のリンクのライフサイクルの図を合わせて見ると理解が捗ると思います。
[React component ライフサイクル図](http://qiita.com/kawachi/items/092bfc281f88e3a6e456)
windows 8.1環境で言語バーがどうしても表示されない場合の対処

regedit.exeを起動させます。
下記のパスを開いてください。
`HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run`

CTFMonという文字列値があれば_C:\Windows\system32\ctfmon.exe_という値が入っていることを確認してください。
なければ新しくCTFMonという文字列値を作成して値を入力してください。
コンピュータの再起動が必要となります。
phpinfo()がなぜか表示されず真っ白のページが表示される

先日Apache(2.4)サーバでphp(5.4)の動作確認したときに下記のようなコードを書きました。

```php
<? phpinfo(); ?>
```

するとphpの情報が表示されず真っ白でした。
ブラウザからソースコードを見るとphpコードがコメントアウトされているようです。

原因はphp.iniの設定で省略形のphpコードはデフォルトで使えなくされているからのようです。
short_open_tagの設定をOnにしてやると動作するようになります。

```diff
- short_open_tag = Off
+ short_open_tag = On
```

もしくは省略形を使わずにphpを書くこと。

```php
<?php phpinfo(); ?>
```

php.iniの設定を変更した後はApacheの再起動をお忘れなく。
Ruby講習前期内容 #2


前回の続き。[(Ruby講習#1)](http://qiita.com/take-sei/items/8ab1b014a02d0564d74a)
プログラムの構成まで話した気がする。

## プログラムを構成する3つ

- keyword
- 識別子
- object



以上3つががプログラムを構成することはさっきも言った通り。

keywordは構文を表すもので、識別子は変数名とかメソッド名の自分で定義できる系、んで、objectっていうのは英語のままでプログラミングで使うサムシング、つまり物、データを指す。

```ruby:ruby.rb
	honya = "morake"
	puts honya
```


このコードの場合
	1. keyword:: puts
	2. 識別子  :: honya
	3. object ::"morake"

って言った感じ。ま、ぶっちゃけ識別子は大抵自分で作るし、keywordは構文だから覚えるべきはobject。

というわけで、object入る前に一つ
##変数とは
変数ってのは、オブジェクト(プログラムで使うデータ)を後で使いたい時に一時的に保存する方法

name = object
ってかく

```ruby
var = 10 #10っていうオブジェクトをvarっていう、入れ物に保存
puts var #あ、一応putsは右にあるのを出力するやつ
```
とやると、10が返ってくる。まぁ、この通りかなw

ついでに、変数って言われてるから、varの内容はいつでも入れ替えることができるから

```ruby
var = 10
puts var #10
var = "honya"
puts var #honya
```
って感じで、中身を変えられるんだよねw

ついでに、"var = 10"みたいに、10をvarにぶち込むことを代入といいます。
こんなもん、ついでに、この時の変数名が、識別子な

##objectについて

objectはこの通り具体的なデータを表す。

そして、ご存知の通りobjectには種類がある、この時この種類のことを **"型"**っていう

	1.整数を表す系:: Intager
	2.少数を表す系:: Float
	3.文字を表す系:: String
	4.真偽を表す系:: Boolean
	---
	5.データを番号管理する:: Array
	6.データを名前管理する:: Hash
	7.プログラム内で使う文字::Symbol
	8.処理を管理する:: Proc


 めんどくさいやつで区切りましたw
 
 プログラムを読むには、その一つ一つの構成を見ていくべきなので、objectの種類、とりまここに書いてあることは覚えましょう。
 
 次回はそれぞれの働きについて説明。
Ruby講習前期内容 #1


学校で教えているrubyの講習のまとめ。

続きs
[講習#2](http://qiita.com/take-sei/items/53968d7088be87bb29f6)
##プログラミングをするにあたり
パソコンは計算、入出力しか基本できないことを確認。
どんなことがパソコンにできるか、それをパソコンにやらせるべきかはプログラマーが考えるべき。

結局プログラミングはパソコンにやらせる仕事をパソコンができる低レイアーの次元まで落とす、分解すること。

パソコンが何でもできるとか思っちゃダメダメよ

というわけで、プログラミングを教えるに先立ち、パソコンができる最低次元の動きと仕事を分解する方法を教えまし

##プログラミングに必要なやつ
プログラミングを始めるにあたって用意して欲しいのは３つ

1. テキストエディター
2. ターミナル　　　  (c.f.shellコマンド
3. インタプリタ　　(c.f.構文木

##最初のプログラミング

```ruby:first.rb
	
	message = "honyamorake"
	puts message

```
"honyamorake"が出力されたはず。

rubyに置いて、プログラミングの構造はこうなっている

	アルゴリズム(プログラムの塊)→文→キーワード、識別子、object

アルゴリズムっていうプログラム論理の塊、とどのつまり一つのプログラムは一つ一つの文からなっていて、さらにそいつらは3つの物からできている。

- keyword...putsとかifとかのあらかじめプログラミングで使う言葉たち
- 識別子.....変数とかの名前
- object....プログラミングで使う物、すなわちデータ。(本当は+methodだから少し違うでござる)

とりま、すべてのプログラム(rubyの)はこの3つからなる文からできているのを頭に入れておいてほしい。

##用語確認←今更w
インタプリタ(描いてあるプログラムを理解して実行するやつ)は、1文づつプログラムを読み込むのは教えた通り。

そのため、rubyでは面白いことにインタプリタが一文を読み込むごとにそれの結果を排出する。
で、この時インタプリタがプログラムを理解する(読み込む+理解)することを **評価する**って言ったりする。

それと、変数(とあるデータを後からも使えるようにするために一時的に名前付けて保存するやつ先みろw)をインタプリタが評価すると、一時的に保存している先のメモリから値、データを引っ張ってくる。このことを **参照する**って言ったりなんなり。


---

続きはまた後ほど
iPhone6s Plus + AWS で世界のどこにいても Rails の開発をする【SSH接続編】

# はじめに
前回の記事「[iPhone6s Plus + AWS で世界のどこにいても Rails の開発をする【環境構築編】](http://qiita.com/tomohiko37_i/items/f851e52098adc1fe797b)」ではiPhone6s+を使用してAWSのインスタンスへ接続してモバイル開発環境を作る流れをRailsのインストール中心に書きました。

モバイル開発環境と言いながらも基本的にはRails環境の構築手順になりましたので、今回はiPhone6s+のSSH接続用のアプリからAWSのEC2インスタンスへ接続する際の手順をまとめます。鍵を作る必要があるのでやり方は整理しておいたほうがよいと思います。

## 前提
* AWSのEC2インスタンスが起動していること。
* macやWindowsなどのパソコンからSSH接続ができていること(すなわち鍵は作成済みであること)

前提条件の部分がまだの方は、Qiitaの別の方の記事に詳しく解説されていますので参考にしてください。ここでは割愛します。

# iPhone6s+からのSSH接続
アプリは前回の記事で紹介したServerauditorを使います。

## 鍵のコピー
セキュリティ的な是非はともかく、SSH接続で使用した鍵をテキストエディタで開き中の文字列をコピーしておきます。その文字列を何とかしてiPhone側へ持ってきてください。

Dropboxとかメールとかいろいろ。

## アプリの設定
次にServerauditorを起動します。以下のような画面が表示されますが、私の場合はすでにEC2へ接続しているので接続済みのホスト名が表示されます。

<img width="414" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/53285/8bbb0a34-cfd6-c3b3-bdc0-e3799a539fd7.png">

左上の三の形のアイコンをタップします。

<img width="414" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/53285/676b5af9-ac30-1347-6494-72636e35aa74.png">

左側にメニューが出てきますので、Keychainを選択します。

<img width="414" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/53285/15e21476-b66a-2fbc-b0a6-e3c52cb7f321.png">

Keychainの画面の右上にある↑のアイコンをタップすると、下からメニューが出ます。ここでNew Keyを選択してください。

<img width="414" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/53285/4daaa712-a8e3-4a17-6083-bdab75491c44.png">

画面上部のPasteタブを選択して、任意の名前を入れます。あとはPasteボタンを押すと事前にコピーしておいた鍵が張り付きます。これでSSH接続に必要な鍵が登録できたので、あとはこの鍵を使ってEC2へ接続するだけです。

# 番外編 EC2の接続が切れる
実際にアプリからEC2へ接続して作業をしているとすぐに気づくと思いますが、EC2のSSH接続はかなり短い時間で切れます。要はしばらく通信が発生しないからなのでしょうが、ちょっとした調べ物をしている間にも切れるので不便です。

macとかでつないでいる場合は、`~/.ssh/ssh_config`を編集して、

```
ServetAliveInterval = 30
```

と追記しておけば良いのですが、あいにくアプリから接続するとその設定が書けないのでサーバ側に設定します。

`/etc/ssh/ssh_config`へ上の設定を追記します。その後、

```
service sshd restart
```

でsshサーバを再起動します。これで頻繁に切れることは無くなると思います。
python > 8という数字を008として表示したい > print "{0:0>3}".format(8) または  "{value:0>3}".format(value=8) または "%03d" % 8 または format(8, "03d") または str(8).zfill(3) または(Python3.6以降)f"{8:0>3}"


参考
http://python.civic-apps.com/string-format-function/

```151125d.py
print "{0:0>3}".format(8)
```

```txt:実行
[toLearn]$ python 151125d.py 
008
```

### 教えていただいた事項

@shiracamus さんの[コメント](https://qiita.com/7of9/items/62051d106c031e0f5b96/#comment-1a1cc1f4a7404b8e9a51)にて様々な書き方を教えていただきました。

検索で見つかるようにタイトルに追加しました。
Xcodeで言語指定して実行

localizeの対応をしていて端末の言語設定を変更せずに確認出来ることを知ったのでメモ

SchemaのOptionsのApplication Languageの設定を確認したい言語にして実行すれば良い。確認したい言語毎にSchemaを準備しておけばかなり楽。端末の言語設定を変えると再起動が入るので大分確認が楽になりました
python > IPアドレスの４つ目の数値を取得する実装

```txt:動作環境
CentOS 6.5
```

http://qiita.com/7of9/items/2224c2e12bc521f02763
にてIPアドレスを取得できた。

ここからやりたいのは４つ目の数値を取得すること。

以下を使う。
http://qiita.com/7of9/items/1f049a82c169106040f2

```151125c.py
import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

def IPADR_getLastDigits(ipadr):
	ipadrs = ipadr.split(".")
	return ipadrs[3]

ipadr = get_ip_address('eth0')  # '192.168.xxx.xxx'
print ipadr

last = IPADR_getLastDigits(ipadr)
print last
```

```txt:結果
[toLearn]$ python 151125c.py 
192.168.10.8
8
```
line monitor > 情報表示部分 (151125) > IPアドレスを取得するpython実装

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

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

IPアドレスの４つ目の３桁を７セグLEDで表示したい。そのため、pythonからIPアドレスを取得する。

## try1 

参考
http://qiita.com/fukkyy/items/8872944406c6dedfe34b

```151125a.py
import socket

ipadr = socket.gethostbyname(socket.gethostname())
print ipadr
```

上記を実行してみると

```txt:結果
[toLearn]$ python 151125a.py 
127.0.0.1
```

ループバックの方が取れてしまった。
タイトルが「ローカルのipアドレスを取得」で納得。

欲しいのは192.168.の方。


## try2

参考 [SO](http://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python)

```151125b.py
import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

ipadr = get_ip_address('eth0')  # '192.168.xxx.xxx'
print ipadr
```

```txt:実行結果
[toLearn]$ python 151125b.py 
192.168.10.8
```

他に`import netifaces`を使う方法もあるが、CentOS6.5で試したところエラーが出た。
パッケージが不要の上記の方法でできるので、こちらのほうがいい。
技術英語 > He went to school. / He went to a school. > 習慣行為の場合は無冠詞

引用: 冠詞マスター教本 by 石井隆之さん

> 習慣行為を表す
He went to school.
...
習慣行為を表す表現が無冠詞になるのは、習慣的なことだけに、この表現の使用頻度が極めて多くなったことにより、＜簡略化＞という現象が起きたからです。

<hr>

対比して紹介されている例文として

> He went to a school.

上記の場合は、習慣的ではない。「(その時に）"ある"schoolに行った」という意味になるだろう。

<hr>
C++テンプレートの関数及びクラスの明示的特殊化の例


関数の明示的特殊化
boolの時だけ挙動を変える

```
using namespace std;
template <typename T>
void testFunc(T arg){
    cout << arg << endl;
}

template <>
void testFunc(bool arg){
    cout << (arg ? "yes":"no") << endl;
}

int main(){
    testFunc(30);
    testFunc(false);
    return 0;
}
```



クラスの明示的特殊化
boolの時だけprintの挙動を変える

```
#include <iostream>
using namespace std;
template <typename T>
class TestClass {
    public:
    TestClass (T data):data(data){};
    void print() const{
        cout << data << endl;
    }
    protected:
    T data;
};

template <>
class TestClass<bool> {
public:
    TestClass (bool data):data(data){};
    void print() const{
        cout << (data ? "yes" : "no") << endl;;
    }
protected:
    bool data;
};

int main(){
    TestClass<int> t(30);
    t.print();
    
    TestClass<bool> u(true);
    u.print();
    return 0;
}
```
apt-getでSetting locale faildが出た時のメモ

リモートでraspberry piにvncサーバーをインストールしようとした際に気がついたのでメモ。

## 環境
- ログイン元：Mac OSX 10.10.5 Yosemite
- ログイン先：Raspberry Pi 1 model B Linux raspberrypi 3.2.27

## 状態

vncサーバーをインストールしようとして

```
$ sudo apt-get install tightvncserver
```

apt-getがこんなログを吐いていました。

```
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = "en_US:",
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
```

ん？？
LANGが"en_US"になっている？

調べると[ここが出てきた](http://sweep3092.hatenablog.com/entry/2014/12/15/105515)

ここでローカルの$LANGをechoしてみましょう。

```
$ echo $LANG
ja_jp.UTF-8
```

oh...
では早速OSX側のssh_configを見てみます。

```
$ cat /etc/ssh_config
```

発見。

```
 Host *
   SendEnv LANG LC_*
```

ここがログイン時にリモート側に環境変数を送っているっぽいのでコメントアウト。

```
 Host *
 #  SendEnv LANG LC_*
```

そしてapt-getでも問題なくインストールできました。


### 参考サイト

http://sweep3092.hatenablog.com/entry/2014/12/15/105515
Rasberry Pi2にEthereumクライアントをインストールしてJSON-RPCにトライ


##モチベーション
* 新しくなったRasberryPi2というスペックが結構よさ気なハードウェア


###最近流行りのIoT？とかに使えるらしい。
- Ethereumをインストールすれば、なんかすごいことに使えるんじゃないか？

###Macだとなんか容量が取られてしんどい
- RasberryPiなら持ち運びも楽だ。

ということでトライしました。

#RasberryPi2購入
買ったもの
* Raspberry Pi2本体（ケース付き）；Amazonで６０００円くらい
* マイクロSDカード16GB（これくらいないと足りなくなるらしい）:1000円
* MacBookAirとインターネット共有：LANをUSBに変換するケーブル1300円
<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/B002IT5ZPG/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B002IT5ZPG&linkCode=as2&tag=feynman123-22">BUFFALO 10/100M USB2.0用 LANアダプタ (Wii、Wii U、MacBookAir動作確認済み) LUA3-U2-ATX</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=feynman123-22&l=as2&o=9&a=B002IT5ZPG" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


##流れ
1. Raspbain OSインストール
2. go-thereumインストール
https://github.com/ethereum/wiki/wiki/Raspberry-Pi-instructions
http://raspnode.com/diyEthereumGeth.html

3. ethereumブロックチェーンと同期（時間かかった）


4. RPCサーバーとして起動
consoleにて

```
>admin.startRPC("192.168.2.2（LAN内でのローカルIP）",8545,"*","web3,db,net,eth")
```



5. Macからcurlコマンドで確認
API一覧はこちら
https://github.com/ethereum/wiki/wiki/JavaScript-API

入力
```
curl -X POST http://192.168.2.2:8545 --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}
```

出力
```
{"id":67,"jsonrpc":"2.0","result":"Geth/v1.3.1-f75becc2/linux/go1.4"}
```

とりあえずうまく呼べた。



次
EthereumをMeteorフレームワークで動かす

http://qiita.com/satons/items/357f187bc3318b8c9612
Git を zip として扱う

```bash
function git_as_zip() (
    local OUT_FILE=$1; shift
    mkdir tmp
    cp "$@" tmp
    cd tmp
    git init
    git config user.email "you@example.com"
    git config user.name "Your Name"
    git add -A
    git commit -m "An Commit"
    git archive --format=zip -o $OUT_FILE HEAD
    mv $OUT_FILE ..
    cd ..
    rm -rf tmp
)
```

使い方:

```bash
git_as_zip hoge.zip file1 file2 ...
```
potatotips #23 (Android ブログまとめ枠)


株式会社FiNCで開催されたpotatotips #23にAndroid ブログまとめ枠で参加した。
すごく勢いのある勉強会ですぐ埋まってしまうし、あまり発表することもなくて少し抵抗があったのだけど、やはりLTベースの勉強会はとても良いものだと思った。

http://connpass.com/event/21750
https://github.com/potatotips/potatotips/wiki/potatotips-23

# AppIndexing API
## shaunkawano氏
https://speakerdeck.com/shaunkawano/intro-to-app-indexing-api

ディープリンク用のAPIの説明。
(Android上のChromeで?)特定のキーワードやページを開こうとしたときに、アプリを候補にできるみたいなやつらしい。
基本的にはonStart/onStopで設定する。簡単だしSEO上も重要らしいので設定しましょうとのこと。(アプリの実装だけではないみたい)

# 隕石という名のスクリーンショットをSlackに落下させる話
## operandoOS氏
http://www.slideshare.net/shinobuokano7/slack-55455661

タイトルかっこいい。
隕石は高度によって呼び名が違い、宇宙からやってきたMeteoroidがMeteorとして落下してMeteoriteになるらしい。
一手間減らす系のとても良いライブラリ。Mavenから取れるのもすばらしい。

### Meteorite
https://github.com/operando/Meteorite
通知領域をタップすると、指定のViewのスクリーンショットを取得してSlackに投下する
### Meteor
https://github.com/operando/Meteor
通知領域をタップしてスクリーンショットを取得するライブラリ
### Meteoroid
https://github.com/operando/Meteoroid
ファイルをSlackに投げるライブラリ

# "Predictable state container" and Data Binding
## izumin5210氏
https://speakerdeck.com/izumin5210/predictable-state-container-and-databinding
https://github.com/izumin5210/Droidux

(JavaScriptの)ReduxをAndroidでやってみるDroiduxの試作版。RxJavaと@Bindableを活用。
DroidKaigi CFPに出しているとのこと。
immutableなActionオブジェクトを伝搬させるので、(ローカルで完結しているものなら)undoとかredoの実装がシンプルになるっぽかった。パズルゲームに良いかも。

# 手軽にHTTPでJSONにアクセスできる環境を用意する
## hkusu氏
http://www.slideshare.net/hiroyukikusu/potatotips-23httpjson

手軽にJSONサーバ(またはサーバとして見えるもの)を用意する方法。いつか役に立ちそう。
1. Android Studioから右クリックするとlocal serverとして起動できる(知らなかった)
2. 右クリックからgistにアップできる(クラウドっぽい!)
3. express-generatorを使ってNode.jsでお手軽サーバを立てる(これはよくある)
4. S3にJSONを置く(s3fsとかでコピーするのかな?)

# Design Support Libraryをいじる際に気をつけていること
## woshidan氏
https://speakerdeck.com/woshidan/design-support-librarywoiziruji-niqi-wotuketeirukoto

- Support Libraryは基本的にSupport Libraryのことだけ考えているので、それに合わせる
- 細かい挙動はソースを読む(いいね!)

# Androidでライブラリを作る
## heki1224氏

愛妻家(えらい)
Androidのライブラリ開発が仕事。特有のトピックの共有など。
ライブラリを作ると標準APIに詳しくなるとのこと。

- 古いバージョンのOS(実機が手に入らないその他)
- メソッド数65k制限問題(特にtestビルドであふれる)
- 非同期処理の決定打がない問題(HandlerとHandlerThreadでがんばる)

# Don't Reinvent The Wheel ~ For All Android Beginners ~
## Kenju氏
https://speakerdeck.com/kenju/dont-reinvent-the-wheel-for-all-android-beginners

「ライブラリを使えるエンジニアになろう」おっしゃる通り...

# UI optimization for night
## KeithYokoma	氏
https://speakerdeck.com/keithyokoma/ui-optimization-for-night

夜かどうかを自動判定して、まぶしくしなくする方法の提案。
緯度経度から日の出・日の入りの時刻は計算できる。頭いい!
ActivityのonCreate前ならテーマを変更できるとのこと。
Windows用高機能sshクライアント Xshell

追記：2016年4月よりライセンス形態が変更になりました https://www.netsarang.com/download/free_license.html
個人・家庭ユーザーは無償で使用できるようになりました。

----

Windows用sshクライアントで使い勝手のよいものはないかなと探していたのですが、海外のサイトの紹介で見つけた[Xshell](https://www.netsarang.com/products/xsh_overview.html)というソフトウェアが高機能・高カスタマイズ性で使いやすかったので、紹介したいと思います。（日本語の紹介記事はたぶんこれが初めてかも）
![メイン画面](https://www.netsarang.com/images/p-products-xsh-screenshot1.png)
（ただし商用利用は有償です）

## 背景
- Linuxサーバーの構築・管理が仕事
    - 作業用Linuxサーバーにsshでログインしてから作業
    - Cygwin上から管理サーバーにsshログインすることもあり
- これまで使用したWindows用sshクライアント
    - Poderosa 4.3.8b (メイン)
    - Cygwinのsshクライアント
    - putty (予備)
    - RLogin (Poderosaからの乗り換え前提で試しに使用)

## 特徴
- ssh以外に、sftp, telnet, serial接続に対応
    - CygTermを使えばCygwinも利用可能
    - パスワード・パスフレーズの保存
    - ログイン時の自動テキスト送信（○○を受信したら△△を送信）
    - ssh-agent同梱
    - X11 Forwarding
- タブに対応
    - 画面の分割もOK
    - キー入力を複数のタブに送出できる
    - xtermならプロンプトの名前をタブ名に表示
    - タブの色を青・赤・黄・紫に変更できるので、本番環境などと区別がつきやすい
- VBScript, Javascript, Python言語によるマクロ
    - サーバーへ接続をしたり、ターミナルに文字を送ったり、受信した文字を変数で受け取れる
    - CreateObjectが使えるので、ローカルファイルを読み書きしたり、Excelを操作することも可能
- ほぼ全てのキーをカスタマイズ可能
    - ソフトウェアの機能を呼び出す、文字列の送信、マクロの実行、アプリの実行が指定できる
    - クイックコマンドという機能で、画面上に表示されたボタンのワンクリックで呼び出すことも可能
    - ターミナル画面のスクロールもキーだけでできる
- 接続先指定
    - フォルダ分けできたり、メイン画面に"リンクバー"としてショートカットを配置できる
    - 一覧上でキーを押せば、該当の先頭文字の項目が選択される
- その他アプリ特徴
    - 日本語表示対応（ターミナル上で日本語入力も可）
    - 背景を透明に
    - ターミナル画面の文字列検索や、テキストエディタへの出力ができる   

## スクリーンショット
※メニューが英語ですが、日本語にもできます
※ツールバーの項目や配置は自由に変えられます
![メイン画面](https://www.netsarang.com/images/p-products-xsh-screenshot2.png)
![ショートカットキー設定](https://www.netsarang.com/images/p-products-xsh-screenshot5.png)

## マクロサンプル
```js:sample
function Main()
{
	xsh.Session.Open("C:\...\NetSarang\Xshell\Sessions\New Session.xsh");
	xsh.Screen.Synchronous = true;
	xsh.Session.Sleep(1000);
	
	//*** WaitForString ***
	xsh.Screen.WaitForString("aaa");		// input "aaa" in Terminal
	
	//*** Send ***
	xsh.Screen.Send("cat /etc/passwd");
	xsh.Screen.Send(String.fromCharCode(13));
	xsh.Session.Sleep(1000);
	
	//*** Get, Clear ***
	var ScreenRow, ReadLine, Items;
	
	ScreenRow = xsh.Screen.CurrentRow - 1;
	ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
	Items = ReadLine.split(":");
	xsh.Dialog.MsgBox(Items);
	xsh.Screen.Clear();
	
	//*** Property ***
	xsh.Screen.Synchronous = false;
	var MsgProp;
	MsgProp = "Col:" + xsh.Screen.CurrentColumn + ", ";
	MsgProp = MsgProp + "Row:" + xsh.Screen.CurrentRow + ", ";
	MsgProp = MsgProp + "TermCol:" + xsh.Screen.Columns + ", ";
	MsgProp = MsgProp + "TermRow:" + xsh.Screen.Rows; 
	xsh.Dialog.MsgBox(MsgProp);
}
```
ちなみに自分は、サーバー内のファイルをBase64でエンコードして画面上に出力、それを受け取ってテキストファイルとしてローカルに保存し、Base64デコードすることで、ファイルを受信するマクロを書きました。
いちいちsftp/scpでやりとりしたり、踏み台を経由した先のサーバーだったりするときはお手軽で便利！

## 欠点
- 設定ファイルが分散している
    - アプリケーションのディレクトリ
    - マイドキュメント
    - レジストリ
- vimで開いてる時にスクロールすると、Vim起動前のターミナル表示が見れちゃってしまう
- マクロからアプリの各機能を呼び出せない
    - 機能をキーボードショートカットに割り当てておき、マクロからSendKeysを呼び出すことでできなくはない

~~商用利用時 $89/yearなのでちょっとお高いですが、その分高機能で様々なカスタマイズができるので、適宜試してみてください。~~
jqgrid が商用freeで使えるバージョン

#結論だけ簡単に
4.7.1は[MIT](https://osdn.jp/projects/opensource/wiki/licenses%2FMIT_license)/[GPLv2](https://osdn.jp/projects/opensource/wiki/licenses%2FGNU_General_Public_License)デュアルライセンスなので商用で利用可能
4.8.0から[Creative Commons Attribution-Non-Commercial 3.0](https://creativecommons.org/licenses/by-nc/3.0/deed.ja)

確認方法は、ダウンロードしたファイルの jqgrid.jquery.json の licenseに書いてある。
出来るだけ、ライセンス購入して開発者の支援してあげましょうね。

##4.7.1
```lang:jqGrid.jquery.json
	"licenses": [
		{
			"type": "MIT",
			"url": "http://www.trirand.com/blog/?page_id=87"
		},
		{
			"type": "GPLv2",
			"url": "http://www.trirand.com/blog/?page_id=91"
		}
	],
```


##4.8.0
```lang:jqGrid.jquery.json
	"licenses": [
		{
		  "type": "Creative Commons Attribution-Non-Commercial 3.0 License",
		  "url": "http://guriddo.net/?page_id=103334"
		}
	],

```

###最終判断はご自身でお願いします。
Run `bundle install` to install missing gems. エラーの対処

環境：Mac OS 10.11.1(El Capitan)
現象：何回'bundle install'してもエラーが出まくる!!
エラー：
Could not find bcrypt-3.1.10 in any of the sources
Run `bundle install` to install missing gems.

対処：
よく見たら
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
というのが書いてあった。
先日Xcodeをアップデートしたまま、一回も開けていなかったので
規約にAgreeしてXcodeを閉じ、
再び'bundle install'すると無事に bcrypt (3.1.10)も入りました。

なんでXcode関係あるんだろう。。。


めでたし。
S3でBucketまるごとコピーする方法

S3でBucket引っ越ししたい時とかに使えます。「Bucket名のアルファベットミスってた恥ずかしい！」とか「ドメイン割り当てようと思ったけどBucket名変えないと出来ないじゃん！」とかの時にご利用ください。

## 前準備
* AWSCLIをインストール（http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/kinesis-tutorial-cli-installation.html）
* IAMでS3をコントロールできるユーザーを用意 (http://blog.fenrir-inc.com/jp/2013/01/amazon-s3-iam.html)
* 上記ユーザーでアクセスキーを作成
* aws configure で上記アクセスキーを設定（http://qiita.com/takechika/items/c430bf633eada3aaa82f）
* 移動先のBucketを作っておく

## 一回Localに落としてからアップロード
引っ越しついでに念のためローカルに落としてバックアップしときたいとかの場合はこっちで

```
# ダウンロード
aws s3 cp --region ap-northeast-1 s3://[移動元バケット名]/ . --recursive

# アップロード
aws s3 cp --region ap-northeast-1 hoge s3://[移動先バケット名]/  --recursive
```


## 直接Sync
普通はこっちでいいと思う

```
aws s3 sync --region ap-northeast-1 s3://[移動元バケット名] s3://[移動先バケット名]
```

* 東京リージョン以外で使ってる方は適宜regionの部分書き換えてくださいね
[機械学習で推奨タグ付け #1]　はてなブログの記事のスクレイピング 

Hi, this is Bython Chogo. I have to learn English so I try to post article both English and Japanese :(

Now studying Machine Learning and practicing test scripting with Bayesian filtering. my plan is to estimate tag from web posted contents after learning several posts and tags. 
Bayesian sample script can be got from Gihyo web page, I'll introduce later, before that today's topic and problem to talk is scraping contents from post. 

I found good slide to describe what I'd like to say however I've lost ... orz. Will add it later. 
Regarding the article, there is two way to scrape body contents. One is using characterized format of each contents. I don't need header or footer date for learning words because it may not useful for identifying the tag. 

As a example, I try to scrape only article on Hatena Blog, the article is between the below tags. 

        <div class=entry-contents>
        CONTENTS to SCRAPE!
        </div>

this case, I wrote below code. 

        soup = BeautifulSoup( html, "lxml" )
        soup.originalEnoding
        tag = soup.find("div", {"class": "entry-content"})
        text = ""
        for con in tag.contents:
            p = re.compile(r'<.*?>')
            text += p.sub('', con.encode('utf8'))


Looks not cool.. but it works :( 
Also I have to prepare all format I will scrape. This is very tired. So second way is to use learning method! But this looks difficult for me. 

To be continued... 



どうも梅村長後と申します。よろしくお願いいたします。英語の学習も兼ねているので英語と日本語で書いていますが、英語の不細工さには目をつむっていただければと思います。
現在機械学習のお勉強をしておりまして、その実践経験の一環でベイジアンを使った記事に対する自動タグ付けシステムを製作中です。ただ行うにあたって新たに覚えることが多く、千里の道も一歩からといったところで、こつこつとおこなっている次第でございます。

で、本日のお題は学習や判定に使う記事の抜出し、いわゆるScrapingってやつです。こいつもいまホットなテーマでいろいろなところで記事をみつけることができます。先日そうやって探した良記事があったのですが、うっかりしたことに失念してしまいました。あとで張りなおしたいと思います。
で、その記事の内容は対象ページのヘッダとかフッタとかを無視して、記事の本文のみを抽出する方法を２つ紹介していました。

一つはかくサイトのフォーマットに合わせてこつこつと記事本文の囲みタグを登録して抜き出すこと。例えばはてなブログの場合はいかになります。



        <div class=entry-contents>
        CONTENTS to SCRAPE!
        </div>

で、こいつから中身を抽出するために以下のスクリプトを書いてみました。


        soup = BeautifulSoup( html, "lxml" )
        soup.originalEnoding
        tag = soup.find("div", {"class": "entry-content"})
        text = ""
        for con in tag.contents:
            p = re.compile(r'<.*?>')
            text += p.sub('', con.encode('utf8'))


たぶん、コードも不細工だろうなとおもいつつこれが精いっぱいです。
で、この方法だと各サイトの特徴的な囲みを登録しなくてはいけない、それが面倒な場合に２つ目の方法の学習を使う、と前述の記事にはかかれていたような気がします。ただ、現時点での実力ではなかかな難しいところです。

このスクリプトについては完成までシリーズ化していきたいと思います。
Angular2 Http


Angular2 & TypeScriptを勉強して分からなかったところや自分用メモをまとめていきます。
バージョン：alpha39とかその辺り

Angular2のビルトインライブラリにはHttpが含まれないため自分でインジェクトする必要がある。

```JavaScript:app.ts
import {HTTP_PROVIDERS} from 'angular2/http';
  ...
bootstrap(MyAppComponent, [... HTTP_PROVIDERS]);
```

> 公式マニュアルには[HTTP_BINDINGS](https://angular.io/docs/ts/latest/api/http/HTTP_BINDINGS-const.html) [HTTP_PROVIDERS](https://angular.io/docs/ts/latest/api/http/HTTP_PROVIDERS-const.html)の2通り記載がある。
[Http](https://angular.io/docs/ts/latest/api/http/Http-class.html)の説明ではHTTP_PROVIDERSを使っているのでこっちを使う事にする。

# 呼んでみる

```JavaScript:SampleClass
class SampleClass {
	constructor(http:Http) {
		http.get('sample.json');
	}
```

jsonが返ってこない...。

`console.log()`してみるとこんなやつがいる。

```
e {_isScalar: false}
```

誰？

# Observable

Angular2のHttpのレスポンスは`Observable`を返す。
`Observable`はMicrosoftのライブラリ **RxJS** のオブジェクトで、Angular1系で採用していた`$q`に比べて柔軟で便利な機能が用意されている。

* メソッドチェインがthenだらけにならない
* チェイン内でキャンセルできる
* リトライなど便利そうなメソッドを持っている

[RxJSのメソッド](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators)

# jsonが欲しい...

```JavaScript:SampleClass
class SampleClass {
	public list:string[];
	
	constructor(http:Http) {
		http.get('sample.json')
			.map(res => res.json())
			.subscribe(res => this.list = res)
		;
	}
```

`.map(res => res.json())`

map()を使ってパース。
json()のほかにtext() blob()などが使える。

`.subscribe(res => this.list = res)`

subscribeは3つの関数を引数に取る。(success, error, complete)
ここではリクエストが成功した場合(第一引数)の処理を渡し、listプロパティに値を保存している。

# 何が入っているか見たい...

map() subscribe()のようにヘルパー関数を渡す場合は、関数内にデバッグ処理を入れる事ができる。

```JavaScript:SampleClass
.map(res => {
	console.log(res);
	res.json();
})

// e {_body: "[{"no":1,"name":"ferret"}...
```

# 終わり

`Observable`が何者なのかよく分からなくて、ただのGETにとんでもなく時間がかかった。このサイトで導入のメリットから使い方まで親切に解説されている。

[Angular2 Observables, Http, and separating services and components](http://chariotsolutions.com/blog/post/angular2-observables-http-separating-services-components/)

上記サイトに記載されているリンク。
公式マニュアルでサンプルが足りないと思った時は頼りになりそう。
[angular playground](https://github.com/angular/angular/tree/master/modules/playground/src)
cvSolveをつかってY=AXを満たすXを最小二乗法で求める

最近研究で最小二乗法を用いる機会がありました．今回はその際に用いたopenCVのcvSolveの使い方を説明したいと思います．

#解きたい問題
よくある最小二乗法で解きたい問題は以下のような線形方程式になります．

$Y=AX$

ここではYとAが固定されており，この条件下でのXが必要になってきます．私の場合は以下のような問題でした．

$
\begin{equation}
\begin{pmatrix}
x_{1}' &\ldots & \ldots &x_{n}' \\\\
y_{1}' &\ldots & \ldots &y_{n}' \\\\ 
z_{1}' &\ldots & \ldots &z_{n}' \\\\ 
1 &1 &1 &1 
\end{pmatrix}
= \begin{pmatrix}
a &b &c &tx \\\\
d &e &f &ty \\\\
g &h &i &tz \\\\
0 &0 &0 &1 
\end{pmatrix}
\begin{pmatrix}
x_{1} &\ldots & \ldots &x_{n} \\\\
y_{1} &\ldots & \ldots &y_{n} \\\\ 
z_{1} &\ldots & \ldots &z_{n} \\\\ 
1 &1 &1 &1 
\end{pmatrix}
\end{equation}
$

みたらわかる人も行くかもしれませんがアフィン変換ですね．ある座標からある座標への変換行列の演算を行いました．では，実際のソースコードを以下に示します．

```
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <opencv\cv.h>

#define SIZE 4
#define COUNT 6

int main(void)
{
	CvMat *mA,*mX,*mY;

	mA = cvCreateMat(SIZE, SIZE, CV_32F);
	mX = cvCreateMat(SIZE, COUNT, CV_32F);
	mY = cvCreateMat(SIZE, COUNT, CV_32F);

	cvSet(mA, cvScalar(1.0f));
	cvSet(mY, cvScalar(2.0f));

	// SVDを用いた最小二乗解
	cvSolve(mA, mY, mX, CV_SVD);

	// 出力
	for (int i = 0; i < SIZE; i++)
	{
		printf("(");

		for (int j = 0; j < COUNT; j++)
		{
			printf("%f ", cvmGet(mY, i, j));
		}

		printf(") = (");

		for (int j = 0; j < SIZE; j++)
		{
			printf("%f ", cvmGet(mA, i, j));
		}

		printf(") (");

		for (int j = 0; j < COUNT; j++)
		{
			printf("%f ", cvmGet(mX, i, j));
		}
		printf(")\n");
	}

	cvReleaseMat(&mA);
	cvReleaseMat(&mX);
	cvReleaseMat(&mY);

	return 0;
}
```

見て分かると思いますが A = mA , X = mX  , Y=mY　となっており，AとYを指定し```cvSolve```の引数に入れてあげることでXに結果が代入されるという仕組みになっています．以上です．

#参考サイト
http://hp.vector.co.jp/authors/VA025246/opencv/101.html
Word for Mac で小学生が読める漢字だけに文書校正する方法



## [Word]-[環境設定]-[文書校正]を選択
![01_Word_環境設定.png](https://qiita-image-store.s3.amazonaws.com/0/11476/c839764f-d78c-f62e-0412-fb7f12bc796b.png "01_Word_環境設定.png")

## 文書校正ダイアログの[文書校正]-[詳細設定…]を押下
![02_文章校正.png](https://qiita-image-store.s3.amazonaws.com/0/11476/d2383a56-aee6-fa1b-0570-ceca774b65c9.png "02_文章校正.png")


## 文法設定ダイアログの[必要条件]-[漢字レベル]を選択
![03_文法設定.png](https://qiita-image-store.s3.amazonaws.com/0/11476/4db8cc35-3d61-4149-109b-59c269b20c12.png "03_文法設定.png")


以下の内容から選択できます。

- チェックなし
- 常用漢字
- ６年生
- ５年生
- ４年生
- ３年生
- ２年生
- １年生

## [ツール]-[文書校正]を選択
表示された文書校正ダイアログで[開始]を押下すると、漢字レベルで選択した学年では読めない漢字を修正することができます。
![04_文章校正__日本語.png](https://qiita-image-store.s3.amazonaws.com/0/11476/8d325475-63a5-5443-3b6e-8e5a0e42cbed.png "04_文章校正__日本語.png")



## まとめ
小学生向けの文章を作成するときは重宝しそうです。
でも、対象学年の途中まで習った漢字まではチェックできません。そこは、割り切る必要がありますね。
zipコマンドで圧縮後に元ファイルを削除する

`zip -r` オプションだけだと元ファイルが残ってしまう。

```bash
$ ls
hoge
$ zip -r hoge.zip hoge
$ ls
hoge hoge.zip
```

この場合のhogeは圧縮後消えて欲しい。そんなあなたに。


### コマンド

mオプションつければいいと思うよ。

```bash
zip -rm hoge.zip hoge
```

```bash
$ ls
hoge
$ zip -rm hoge.zip hoge
$ ls
hoge.zip
```

やったね！
[iOS 9]あれ？日本語の表示が出ないぞ...そういう時にチェックするNSLocale周りの実装について


## はじめに
自作アプリの改修時に気付いた。
なんか英語の設定ばかりひいてるなーって。
NSLocale の取得値が iOS 9 から変わったらしい。
見事に else を通ってました。以下備忘録。


## [[NSLocale preferredLanguages] objectAtIndex:0] の値

ユーザが使用している現在の表示言語を NSLocale で取得できる。
言語ごとに表示を変えたいときなどに使用する。下記のようになる。

```Objective-C:Objective-C
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
```

この値が，iOS 8 までは， **"ja"** や **"en"** だったのだが，
iOS 9 からは， **"ja-JP"** や **"en-JP"**
など地域の情報も込みになっている。

つまり言語情報をもとに場合分けしていた場合 else に抜けてしまう。

```Objective-C:Objective-C
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

if ([language isEqualToString:@"ja"]) {
	// 日本語の処理
	// iOS 9 はここを通らない
} else {
	// 英語の処理
}
```

それを防ぐために

```Objective-C:Objective-C
// iOS 9 以上
if ([Util isIOS9Over]) {
	if ([language isEqualToString:@"ja-JP"] ||
		[language isEqualToString:@"ja-US"] ||
		[language isEqualToString:@"ja-GB"]) {
		// どこまで条件に入れるか・・・
		// 日本語の処理
	} else {
		// 英語の処理
	}
	
} else {
	// iOS 9 未満 
	if ([language isEqualToString:@"ja"]) {
		// 日本語の処理
	} else {
		// 英語の処理
	}
}
```

みたいな感じで書くといいのかな。
直書きはあれなんでもちろん定数にしておくのが好ましい。

ちなみに，日本語環境でも他地域を選択している方もいることだろう。
カレンダーの曜日を赤くするためなど。私みたいに曜日を英語に，
さらに赤文字にするための設定をしてるユーザもいるかもしれない。
日本語，英語周りだとこの辺くらい見ておけば十分でしょうか。
3 つ以外は else で英語で逃がすとか？

|言語|地域|表示|カレンダーの曜日|
|:--:|:--:|:--:|:--:|
|日本語|日本|"ja-JP"|漢字＆黒|
|日本語|アメリカ|"ja-US"|漢字＆赤|
|日本語|イギリス|"ja-GB"|漢字＆赤|
|英語|日本|"en-JP"|英語＆黒|
|英語|アメリカ|"en-US"|英語＆赤|
|英語|イギリス|"en-GB"|英語＆赤|

やっぱ曜日赤字の方がバランスいいですよね〜

![calendar.png](https://qiita-image-store.s3.amazonaws.com/0/88266/1ffe61c2-0b30-957c-e485-44331a349186.png "calendar.png")


## おわりに
今回は，iOS 9 から取得値が変わった NSLocale について書きました。
"ja-JP" だけで済ますのかも少しパターンを考慮するのか難しいところ。
もっといい言語情報の取得方法があるかもしれない。
もっとこうした方がいいとか，こういうのもあるよー的なものがありましたら
コメントでご教授いただきたいです。よろしくお願いいたします！！

ご覧いただきありがとうございました！！
Spring Boot + Thymeleaf による画面表示を行うまで(プロジェクトの新規作成→画面表示まで)

#目的
htmlによって書かれたテンプレートファイルが、コントローラから呼び出されるまでの最小の手順を確認する

#環境
Spring Boot 1.3.0.RELEASE
IDE STS
Java 8


#手順

##Spring Bootプロジェクトを作成する
##pomファイルへの追記
依存性を追記する

```XML:pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
```

##テンプレートを追加
sorce/main/resources
以下に、templatesディレクトリを追加
その下に、
test/test.html
ファイルを作成

```HTML:test.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
test
  <p th:text="${msg}" /> 
</body>
</html>
```

##コントローラを追加
com.example.webパッケージを作成し、
CustomerControllerクラスを作成する

```Java:CustomerController.java
package com.example.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/test")
public class CustomerController {
	
	@RequestMapping(method = RequestMethod.GET)
	public String test(Model model) {
        model.addAttribute("msg","サンプルメッセージ！");
        return "test/test";
    }

}

```
##起動


![スクリーンショット 2015-11-24 23.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/57455/84195eb6-89b4-796d-ed59-a8d7994dc319.png)

![スクリーンショット 2015-11-24 23.35.56.png](https://qiita-image-store.s3.amazonaws.com/0/57455/eca53d96-3f27-6ccf-0dd6-9f3f8e4c5cbd.png)

##
http://localhost:8080/test
よりブラウザで表示

以下のように表示されたことを確認
![スクリーンショット 2015-11-24 23.36.50.png](https://qiita-image-store.s3.amazonaws.com/0/57455/7a9b7ab3-298a-71f5-2303-8949352f7a17.png)

#最終的なディレクトリ構成
![スクリーンショット 2015-11-24 23.43.49.png](https://qiita-image-store.s3.amazonaws.com/0/57455/59f36e2d-d0ff-4d08-8828-a054385eb0f3.png)

mvnw
mvnw.cmd
というファイルは、プロジェクトを作成時点では存在していなかった。
起動後に生成されたよう

#今後
Thymeleafでの画面作成
コントローラの内容等は個別にまた追記する。
yumコマンドのCheat Sheet

yumコマンドのオプションは良く忘れるのでCheat Sheetが無いものかと探していたら、Red Hat社のサイトに置いてありました。英語版と日本語版です。
(リンクは日本語ページへのリンクです)

[yumコマンド - Cheat Sheet](https://access.redhat.com/ja/articles/1354533 "yumコマンド Cheat Sheet")

PDF版もあるので、これはいただきでしょう。
[Linuxbrew] uninitialized constant OS_VERSION (NameError)

# 症例

brew update を実行すると、以下のようなエラーがでて失敗する。

```
$ brew update
/home/hoge/.linuxbrew/Library/Homebrew/global.rb:30:in `<top (required)>': uninitialized constant OS_VERSION (NameError)
  from /home/hoge/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/hoge/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/hoge/.linuxbrew/Library/brew.rb:15:in `<main>
```

# 解決方法

linuxbrew をインストールしたディレクトリで、以下のコマンドを実行し最新版を取り込む。

```
git fetch && git reset --hard origin/master
```

# 参考

https://github.com/Homebrew/linuxbrew/issues/650
Heroku上でHubotを動かす

まあ前回の続き
http://qiita.com/manabukk/items/6d047097a945250138d0

#DynoプランでのSleep問題の解決
HerokuでHubotを指定の時間に寝かせる
http://sota1235.hatenablog.com/entry/2015/06/10/130000
を参考にした。そのまんま。

#時刻を取得しての定期的な発言を実装する
Heroku+HubotでCodeDeployのデプロイをSlackから実行する
http://qiita.com/toshihirock/items/7598ab59b2c687b77cb6
を参考にする。

GUIからRedis To Goのnanoプランを追加。
`heroku apps:info`で確認したらちゃんと追加されてた。

上記でWebURLとなっている部分を環境変数`HUBOT_HEROKU_KEEPALIVE_URL`で設定する。
`$heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=https://still-springs-3531.herokuapp.com/`

herokuのTZを東京にする。
`$ heroku config:add TZ=Asia/Tokyo`

```json:package.json
"hubot-shipit",
"hubot-cron"
```
```json:external-scripts.json
"hubot-slack": "^3.3.0",
"hubot-cron": ">=0.1.0"
```
を追記。
`npm install`
でインストールが行われる。
`
$ ./bin/hubot -a shell -n manabukk
$ manabukk new job 0 45 22 * * * "Good Evening!"
`
を実行してみると、ちゃんと22時45分に`Good Evening!`って言ってくれた。

これをadd,commit,pushする。

#問題

やはりHerokuがSleepしてしまう。
とりま起こしてからslackから`new job 0 45 22 * * * "Hi!"`と実行すると受け付けてもらえた。

Heroku 上で動く Hubot をうまく休ませる
http://qiita.com/misopeso/items/8cde2ecbb82e7bfc01b4
HubotをHerokuのFree dynoに対応させる
http://blog.spacemarket.com/code/hubot-on-heroku-free-dyno/

を参考にWAKEUPとSLEEPの環境変数を設定してみる。最悪上の参考ソースをまるまるコピーしてみようか。

あとは、
HerokuのFreeプランでアプリを最大限起動しっぱなしにする方法(1日18時間まで)
https://iimuz.github.io/2015/11/11/hubotKeepalive.html
というのもある。

(11/25)
HerokuのFreeプランでアプリを最大限起動しっぱなしにする方法(1日18時間まで)
https://iimuz.github.io/2015/11/11/hubotKeepalive.html
を完全にまねてみた。

#解決！？
Can't set night owl schedule
https://github.com/hubot-scripts/hubot-heroku-keepalive/issues/17

ここにあるように、sleeptimeは朝２時なら26:00と表記する必要があるぽい
これでしばらくは満足に動作した。

次回
CentOS6でSNMPの設定をするとき最低限必要なもの


#前提
・CentOSでsnmpをしゃべらせてみたいなと思ったとき
　最低限これだけすればできるとというものをまとめてみた
・アカウントはすべて管理者としています


#インストールするもの

```ruby:コマンド
# yum -y install net-snmp net-snmp-utils
```

#/etc/snmp/snmpd.confを以下のように記載
```ruby:confの中身
 15 ###############################################################################
 16 # Access Control
 17 ###############################################################################
 18
 19 # As shipped, the snmpd demon will only respond to queries on the
 20 # system mib group until this file is replaced or modified for
 21 # security purposes.  Examples are shown below about how to increase the
 22 # level of access.
 23
 24 # By far, the most common question I get about the agent is "why won't
 25 # it work?", when really it should be "how do I configure the agent to
 26 # allow me to access it?"
 27 #
 28 # By default, the agent responds to the "public" community for read
 29 # only access, if run out of the box without any configuration file in
 30 # place.  The following examples show you other ways of configuring
 31 # the agent so that you can change the community names, and give
 32 # yourself write access to the mib tree as well.
 33 #
 34 # For more information, read the FAQ as well as the snmpd.conf(5)
 35 # manual page.
 36
 37 ####
 38 # First, map the community name "public" into a "security name"
 39
 40 #       sec.name  source          community
 41 com2sec local  default       home_public
 42
 43 ####
 44 # Second, map the security name into a group name:
 45
 46 #       groupName      securityModel securityName
 47 group   local_group v1           local
 48 group   local_group v2c           local
 49
 50 ####
 51 # Third, create a view for us to let the group have rights to:
 52
 53 # Make at least  snmpwalk -v 1 localhost -c public system fast again.
 54 #       name           incl/excl     subtree         mask(optional)
 55 view    view_all    included   .1
 56
 57 ####
 58 # Finally, grant the group read-only access to the systemview view.
 59
 60 #       group          context sec.model sec.level prefix read   write  notif
 61 access  local_group ""      any       noauth    exact  view_all none none
 62
 63 # -----------------------------------------------------------------------------
```
41、47、48、55、61行目をそのままコピペでOK
※各項目は後日説明したいかと思う


#コマンド実行
```ruby:qiita.rb
# service snmpd start
# service snmpd status
```

#snmpwalkで値が帰ってくるか確認
出力結果が文字列と数字の混在

```ruby:コマンド
# snmpwalk -c home_public -v2c localhost .1
```


出力結果がOID

```ruby:コマンド
# snmpwalk -On -c home_public -v2c localhost .1
```

#参考サイト
[Net-SNMP のインストールと設定 〜 CentOS6](http://easyramble.com/install-and-setup-net-snmp.html)
docker stopコマンド

##| はじめに

ここでは[公式リファレンス](http://docs.docker.com/v1.7/docker/reference/commandline/stop/)を参考に説明しています。
ただ、バージョンや環境等により若干挙動が異なるかもしれませんが、その点についてはご容赦ください。
また、その他のdockerサブコマンドについては[こちら](http://qiita.com/kooohei/items/8acb82c6c0bf00bfb9bb)に記載していますので、もしよければ参考にしていただければと思います。

##| 使い方

起動しているコンテナを停止させます。

```:使い方
使い方： docker stop [OPTIONS] CONTAINER [CONTAINER...]
```

CONTAINERに入る値は"CONTAINER ID"または"NAMES"のどちらを指定しても実行できます。


```bash:デフォルト
$ docker stop 4a53495e7036
4a53495e7036

または

$ docker stop sick_archimedes
sick_archimedes
```

###・-t

-t="数字"で指定した時間(秒)待った後にコンテナが停止されます。

```bash:-t="数字"
$ docker stop -t=10 sick_archimedes
sick_archimedes
```

今回の場合は10秒後にコンテナを停止されます。

また、コマンド実行後は停止が完了するまでコマンドは返ってきません。
その場合は"control + c"で抜けることができ、コンテナも指定した秒数後に停止します。


以上です。
Java(JFace, SWT)とJava Web Startでマルチプラットフォームクライアントアプリを作った件のメモ


Javaで業務向けのマルチプラットフォームアプリを作ろうと思ったのが2013年、当時はRIAという言葉もすっかり死語になっていた頃になぜこのようなことをやろうとしたかというと、Javaで作られた既存の遺産が使えるからというだけで、今ならElectron(イマイチ流行ってないか？)やJava FX(死語か？)も選択肢に入ってくるのだろうが。
GUIはさすがにAWT, Swingはないだろうと思っていたので、Eclipseで実績があり、割と動作が機敏なJFace, SWTを使用した。
また要件として自動アップデート付きネット配信、exeでの単体配布も可能というものもあったので、JWS(Java Web Start), Launch4jも使用した。
すでに断片的情報しか覚えていないのできっとあまり役に立ちません。

- 役に立ったwebページ(日本語サイトは少ない)

[(Java)Java Web Startを使ってみた](http://jehupc.exblog.jp/11939745/)

[JNLP ファイルの構文](http://docs.oracle.com/javase/jp/6/technotes/guides/javaws/developersguide/syntax.html)

[Enhancing Security with Manifest Attributes](http://docs.oracle.com/javase/tutorial/deployment/jar/secman.html)

[Unofficial Java Web Start/JNLP FAQ](http://lopica.sourceforge.net/faq.html#update-running)

[Java SE 7徹底理解　第12回 デプロイメントの強化](http://itpro.nikkeibp.co.jp/article/COLUMN/20120426/393701/)

[Eclipse RCP application using Java web start not starting up](https://stackoverflow.com/questions/10204126/eclipse-rcp-application-using-java-web-start-not-starting-up)

[SWTアプリケーションを配布する方法](http://tech.cm55.com/wiki/java/jws)

[How to Use File Choosers](http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html)

jnlpファイルの書き方（特にアップデート周り）
複数Jarをどうやって置くか
## jar in jar loader
なぜだか忘れたが、複数のjarを一つのjarにまとめなければならず、EclipseでExportするときに何かを選択するとJar-in-jar-loader.zipが生成され、jarの中にjarを内包することができるようになる

## antでビルドする
あとから一部Gradleにしたが、当時はEclipseからant.xmlを吐き出して作成した。

## Launch4jによるexeの作り方
iconを用意する必要がある

参考サイト
[JavaアプリをExe化するLaunch4jの使い方と仕組み](http://d.hatena.ne.jp/seraphy/20130810)

# Javaセキュリティ設定の外し方
正規の方法ではアプリ証明書を使えば余計なダイアログは出なくなるはずだが、ここでは試作なのでオレオレ証明書でjarのsigningをし、クライアント側のJava設定にDL元のURLを入力してダウンロード&インストールを可能にする。それでも毎回ダイアログはでた気がする。
keytoolでオレオレ証明書を作成し、jarsignerをビルド時に実行するようにしておく。

# アプリ証明書をどうするか
GMOが提供しているコードサイニング証明書が一番安そうだが1年間¥57,000(当時)でバカにならないので保留。
社内利用だけで商用ではないのに警告ダイアログを出ないようにするだけで年間万単位の支払いはないでしょということ。

参考サイト
[コードサイニング証明書(GMO)](https://jp.globalsign.com/service/codesign/objectsigning.html)

# Chromeでの注意
Chromeはjnlpをダウンロードするだけで自動実行してくれないのでユーザが自分でクリックしないといけない。

# Macでの実行

そのままでは起動せず、なにか引数みたいなものをつけた記憶があるが、忘れた。
ECMAScript6 ~ MapとSet ~


先日、ES6のMapを使っての実装をする機会があったので、改めてMapとSetを学んでみようと思います。

# Map
他のプログラミング言語では通常サポートされているようなのですが、Javascriptでは初めて。データを格納するためのデータ構造です。

```
// Mapの生成
let map = new Map();

// 値の設定
map.set('key1', 'value1');

// 値の取得
let key = map.get('key1'); // 'value1'

// 格納したデータ数
map.size; // 1

// 存在確認
map.has('key1'); // true

// データの削除
map.delete('key1');
map.clear(); // 全削除

// keyを取得
let keys = map.keys(); // => MapIteratorが取得できる

// valueを取得
let values = map.values(); // => MapIteratorが取得できる

for (var key of keys) {
    console.log(key);
}

// 値の取得（forEach）
map.forEach(function (value, key, map) {
    console.debug(value, key, map);
});

```

objectでデータを格納するよりも、map.keys()やmap.has()にて取得ができるので、使いやすいかと思います。

# Set
Setのインスタンスには同一の値は追加できません。


```
// 初期化
let set = new Set();

// 値の追加
set.add('val1');

// 値の存在確認
set.has('val1'); // true

// 値の削除
set.delete('val1');

// 格納してあるデータ数
set.size; // => 1

// 値の取得（values）
set.values()

// 値の取得（entities）
set.entries()

// 値の取得（forEach）
set.forEach(function (val1, val2, set) {
    console.debug(value1, value2, set);
});

```

オブジェクトを操作をする際には、MapやSetを使って、うまく値を格納できるようになりたいと思います。

## 参考
[[JavaScript] ECMAScript6のMapとSetを使ってみよう](http://www.yoheim.net/blog.php?q=20140902)
Node.jsで配下ファイルを含めフォルダを削除

Node.jsでフォルダのみを削除したい場合、fs.rmdir(またはfs.rmdirSync)を使用する。

「[Node.js v0.4.12 Manual & Documentation](http://nodejs.jp/nodejs.org_ja/docs/v0.4/api/fs.html#file_System)」を見ると配下ファイルを含めてフォルダを削除する関数はなさそうだった(見逃してるだけかもしれません)。


なので、以下の３ステップで配下ファイルを含めてフォルダを削除する。

1. fs.readdirSyncで該当のフォルダ内のファイル名を取得
2. for in文 で削除したいフォルダにあるファイル(1で取得したものに削除するファルダパスを足したもの)を、fs.unlinkSyncを使用して削除
3. 最後にrmdirSyncを使用して該当のフォルダを削除

※fs.unlinkはファイルを削除する場合に使用する関数
※Syncがつくものは同期的に処理される



```js:removeDirectory.js
var fs  = require('fs');


// targetRemoveDirectoryPathに消したいディレクトリを指定
// まずは消したいフォルダの配下ファイルを削除
var targetRemoveFiles = fs.readdirSync(targetRemoveDirectoryPath);
for (var file in targetRemoveFiles) {
  fs.unlinkSync(targetRemoveDirectoryPath + targetRemoveFiles[file]);
}

// 消したいフォルダを削除
fs.rmdirSync(targetRmDirPath);
```

ただし、これだと配下のファイル、フォルダを含めて再帰的に削除できないので、コマンドでいうrm -rfを実現できる手段が分かる人がいたら教えて下さい。
Leap Motionアプリをバックグラウンド(ウィンドウが非アクティブな時)でも動作するようにする

MacでLeap Motionアプリを書いていた時に、ウィンドウがバックグラウンドになるとLeap Motionの処理が止まってしまうので原因を調べたところ、Leap Motionの開発サポートページに回避方法が書いてありました。

[Testing Background Leap Applications](https://support.leapmotion.com/entries/39981046-Testing-Background-Leap-Applications)

要点を抜粋すると、初期化の一環として下記のポリシーフラグをセットすれば良いそうです。

C++:
```controller.setPolicyFlags(Controller::POLICY_BACKGROUND_FRAMES);```
C#:
```controller.SetPolicyFlags(Controller.PolicyFlag.POLICYBACKGROUNDFRAMES);```
Java:
```controller.setPolicyFlags(Controller.PolicyFlag.POLICY_BACKGROUND_FRAMES);```
Python:
```controller.set_policy_flags(Leap.Controller.POLICY_BACKGROUND_FRAMES);```
Objective-C:
```[controller setPolicyFlags:LEAP_POLICY_BACKGROUND_FRAMES];```
JSビルドツールをRakeで組むことにした

フロントエンドでいろいろ組むWebサイトを作ることになったのですが、いちいち手動ビルドしていては日が暮れるので、ビルドツールも用意することにしました。ただし、よく使われるようなGruntやgulpではなく、Rakeを選択しました。

# フロントエンド側のビルドツールの必要性
JavaScriptを補助的にしか使わないようなWebサイトであれば、jQueryを読み込んでちょこちょこ、程度で済むのですが、フロントエンドフレームワークを使うとか、あるいはフロントエンド側でバリバリ計算させるような形で作るとなると、とたんに困ることが出てきます。いちばん大きなこととしては、JavaScriptにモジュール化やその依存管理の機能がないので、そのままではファイル分割すら複雑になってしまう、ということがあります。

また、直接JavaScriptで書くのでなくAltJSで書くとか、あとはファイルの結合・ミニファイなど、ブラウザで使うJavaScriptを生成するためには、前後にいくつかのプロセスが必要となっています。

ということで、手動でやるには混沌としすぎるので、効率的な開発にはこれらの自動化が欠かせなくなってきます。

# はやりのツール…でも、疑問が
そんなWebまわりのビルドツールを回すためのツールとして、Gruntやgulpなどが最近はよく使われています。自分自身も使おうとして調べてみたのですが、2つほど「これでいいのかな？」と思う点が出てきました。

## 枯れていない
去年はGruntがもてはやされていたところが、今年はgulpに移っているというように、開発ツールとして使うには世代交代が速すぎる印象を受けました。もちろん、「新たなAltJSである`HogeScript`を使うために、そのコンパイラの`hogec`を入れる」というような変化は必要かもしれませんが、「`hogec`が現在使用中のビルドツールに対応していないので、つなぐ部分を自分で作る or ビルドツールを乗り換える」というような、本質的でない手間はできれば事前に回避したいものです。

## 掛け合わせで増えていくプラグイン
Gruntやgulpで何かしらの処理系を使うには、それ用のプラグインが必要になってきます。となれば、「使うツール×使われるツール」の掛け算でプラグインが増えていくわけですが、そのように増え続けたプラグインの中には、保守が不十分なものや、ひどいときには組み合わせとして存在しないこともあります。これまた、エコシステムを不安定化させる要因となってしまいます[^1]。

# 古い問題に、枯れ果てたツール
このような、「ビルド時の依存関係を解決する」という問題は昔からあるのですが、そのためのツールとして`make`があります。たしかに、`make`のようなファイル単位での処理管理というのは悪くはないのですが、`Makefile`はお世辞にも書きやすいものではなく、また本体での機能で足りない部分はシェルを呼ぶことになるので、これまた慣れていないと極端に使いづらいものです。

# 適度に枯れて、でも活発なRake
そこで注目したのが、Rubyに付いてくるRakeです。Rakefileは通常のRuby+Make的な依存関係処理のためのDSLからなっていて、もともとRubyistであればすんなりと書けるものでした。そこで、

0. 生成するJavaScriptは、一時フォルダのJavaScriptから`browserify | uglifyjs`で生成する。
1. 一時フォルダのJavaScriptは、（あれば）ソースフォルダの`*.js`ファイルから`babel`で生成する。
2. 一時フォルダのJavaScriptは、（あれば）ソースフォルダの`*.coffee`ファイルから`coffee`で生成する。

というように、「このファイルを生成するのに何が必要」ということを宣言的に書けば、あとはRakeが処理してくれます。また、すべてコマンドラインツールを呼び出して処理して、パイプあるいはファイル生成して次のステップに渡すので、「プラグインガー」なんてことも起きません（さすがに、コマンドラインから呼べないツールが生まれることは考えづらいですし）。そして、タイムスタンプを見て必要な処理だけを行う、Make譲りの判定機能も健在です（いざとなれば `rake clean`もできるようにしてあります）。

[^1]: BrowserifyにもCoffeeifyやBabelifyのように他ツールと連携するプラグインがありますが、同様の理由で使わないことにしています。
CloudTrailログをElasticsearch Serviceへ投入する

# はじめに
CloudTrail→Elasticsearch Serviceへ投入する方法を調べてみると２つあるようなので、メモとしてまとめてみる。

# 1. CloudTrail→S3→Lambda→Elasticsearch Service
S3にgz形式で保存されてるファイルをLambdaで処理してElasticsearch Serviceに登録するパターン。
検索すればサンプルコードが見つかるが、Lambdaファンクションを１から作成する必要がある。

## Lambda(NodeJS)ファンクション作成の参考
S3からElasticsearch Serviceに登録するLambdaのサンプルがawslabsのGithubで公開されている。
https://github.com/awslabs/amazon-elasticsearch-lambda-samples/blob/master/src/s3_lambda_es.js
上記をベースにして、gzファイルの解凍部分を下記サイトのコードを参考にすればOK。
[Lambdaを使って、CloudTrailログをCloudSearchに入れて検索する](http://c9katayama.hatenablog.com/entry/20141124/1416789876)

## Lambdaの実行ロール設定
Elasticsearchのアクセスポリシーで全開放にしているなら特に気にしなくてもいいが、IAMやIPで制限している場合はLambda→Elasticsearch APIでアクセスできるように、Lambdaの実行ロールにes:*やes:ESHttpPostなどの許可を与えてあげる必要がある。
※未検証だが、Elasticsearch ServiceのアクセスポリシーにLambdaの実行ロールを追加でもいけるはず？

アクセスポリシーの設定についてやActionに設定できる値などは下記参照。
[Creating and Configuring Amazon ES Domains](http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomains-configure-cluster)

# 2. CloudTrail→CloudWatch Logs→Lambda→Elasticsearch Service
CloudTrailからCloudWatch Logsへ登録させ、それをLambdaで処理してElasticsearch Serviceに登録するパターン。
下記サイトに手順があるが、1.と異なり画面からポチポチやって設定することができる。
[【運用】CloudTrailで取得した監査ログをElasticSearch Serviceで活用する【簡単設定】](http://dev.classmethod.jp/cloud/aws/cloudtrail-to-elasticsearch-service/)
簡単ですごく便利！！

これも結局はLambdaを使うので、作成されたコードやロール設定を見てみるといいと思う。
※こちらはElasticsearchへの登録にBulk APIを利用している

# 考察
画面から簡単に設定できるので、2.の構成で利用するのがとても簡単。
しかし、料金面でみると2.はS3とCloudWatch Logsの両方に保存してるので、その分お金かかる感じですね。


# 余談
次のLambdaのサポート言語は、Go言語 or Rubyのどっちがいい？というアンケートがあるらしいです。
私はRubyがいいなー。

<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr">We want to hear from you - what language do you think AWS Lambda should support next <a href="https://twitter.com/hashtag/Golang?src=hash">#Golang</a> or <a href="https://twitter.com/hashtag/Ruby?src=hash">#Ruby</a>?</p>&mdash; Amazon Web Services (@awscloud) <a href="https://twitter.com/awscloud/status/659795641204260864">2015, 10月 29</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
line monitor > プログラムの自動起動

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:動作確認
Raspberry Pi2 + raspbian
```

line monitorとして使うにおいて、電源起動後にプログラムが自動起動して欲しい。

自動起動はinit.dを使う方法もあるようだが、簡単そうな/etc/rc.localを使う方法を試した。

参考
http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/auto-running-programs

使用プログラムは以下。

```151124a.py
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(3, GPIO.OUT) # GPIO02
while True:
    GPIO.output(3, True)
    time.sleep(3)
    GPIO.output(3, False)
    time.sleep(3)
```

実行権限を付けておく。
`$chmod +x 151124a.py`

次に`rc.local`に追記する。

```
$ sudo vi /etc/rc.local
```

追記は`exit 0`の上に以下を足した。

```
# for auto start
cd /home/pi/linemonitor/toLearn
nohup ./151124.py &
```

これでRPi2を再起動すると、7セグメントLEDの点滅が確かに動いていた。

ps auxで確認すると、確かに151124a.pyが動いている。

```
pi@raspberrypi ~ $ ps aux | grep 15
...
root       501  0.0  0.5  10096  5652 ?        S    22:06   0:00 python ./151124a.py
...
```