OmniAICreator/Qiita-1.07M huggingface dataset:
フロントエンドエンジニアがrssで情報をチェックしているメディア

情報収集の参考になればと
また、こんなのもいいというのがあればコメントにて教えていただければ。

私の関心は現状こんなところです。

普段使っている言語

- php (主に使っているのはlaravel5)
- javascript

興味あること

- react, redux周り
- golang

なので上記に関係するようなメディアが多くなっています。

__国内と国外__の二軸で分けて紹介します。

## 国内

### クラスメソッドさんのブログ

http://dev.classmethod.jp/

aws関連の記事で一度は見たことがあるのではないのでしょうか。

私も少しawsいじることがあったので、新着newsは
目を通しておこうかなと思って見ています。

実践してみた系の記事が多いのがうれしいところ。

### エウレカさんのブログ

https://developers.eure.jp/

apiをgoで書いているらしいエウレカさんはgoのtipsが豊富なので
ちら見させてもらっています。

前に上がってたsql系のtipsも両記事だったと思います。
こちら↓

https://developers.eure.jp/tech/mysql_tips1/

### POSTD

http://postd.cc/

リクルートさんが運営しているメディア。
翻訳依頼も投げられるみたいです。
webに関わるみんなが興味ありそうな海外記事和訳を載せてる感じでしょうか。
大体はてブtopに上がってくるイメージなので登録不要かもしれませんね笑

### メルカリさんのブログ

http://tech.mercari.com/

php, goなどの記事があれば見させていただいてます。
あと、モバイル領域にも手を出しそうなのでそこで
何か参考になりそうなものがありそうなので。

### Jser.info

https://jser.info/

名前の通り、jsの情報を配信するブログ

## 国外

### phpstorm blog

https://blog.jetbrains.com/phpstorm

phpstorm使っているものとして一応。

### github blog

https://github.com/blog

会社は、githubなので一応。

### Toptal Engineering Blog

https://www.toptal.com/developers/blog

海外の実力あるエンジニアの方々がtipsを上げているらしいです。
最近知ったのでとりあえず様子みてます。

### sitepoint

https://www.sitepoint.com/

web系のtipsが掲載されています。
これも最近知ったのでとりあえずphpカテゴリのものを登録しています。

### scotch.io

https://scotch.io/

scotchboxというvagrantイメージから知ったサイト。
今はdockerを使っているが当時はお世話になりました。
reactやphp、laravelのtipsを扱っているのでフォロー。

### laravel News

https://laravel-news.com/

本家laravelのブログ

新機能のリリース等はここが一番早いのでチェックしています。
余談ですが、次のlaravelはphp7必須なのがいいですね、楽しみです。

### Echo js

http://www.echojs.com/

jsの最新情報やtipsが集められているメディア。
更新頻度はかなり高いと思います。


## まとめ

これらは、暇なときに目を通す程度で
朝はhatenaのITトップをみることが一番多いです。汗

ただ、今回の記事を書くに当たって各rssを見返してみると
国外mediaのtipsに興味があるものが多かったですね。
特にlaravel当たりはよく目にした気がします。

githubやphpstormの新機能などもhatenaには上がって来づらいと思うので
定期的に週一くらいではチェックしておこうかなと思います。

ただ、プログラマーに一番大事なのは手で動かして理解して使えるように
することだと思うので、オッと思ったものは検証してみないとですね、、、
Jqueryで div 全体をクリックしたときにチェックボックスがクリックされたようにする。

rails で<div>タグ全体をチェックした時にチェックボックスを有効にしたい時。ハマったので。

```rb

<div class="col-sm-4 checkbox-row">
    <%= check_box_tag "medicine_request[#{i}]", medicine, cold_add_question_boolean(@medicine_request,medicine) %>
    <%= label_tag "medicine_request[#{i}]", medicine %>
</div>


```

```js

//check_boxの行全体クリック処理
$('.checkbox-row').on('click', function(e) {
//td要素からチェックボックスを探す
    var c = $(this).children('input[type="checkbox"]');
    if (e.target != c[0]) {
      if(c.prop('checked')){
          c.prop('checked','').change();
      }else{
          c.prop('checked', 'checked').change();
      }
    }
});
```

下記の実装をしていたら、チェックボックス自体と、coflictを起こしてしまった。

```
//checkboxで、列(div)ごと押すとチェックされるように実装
$('.checkbox-default').on('click', function(){
    if ($(this).attr('checked',false)){
       $(this).find('input[type=checkbox]').attr('checked', true); 
    }
});

```
Gitの履歴を振り返るgit recall

Gitのコミット履歴を手軽に振り返れるツールが作られていたので備忘がてらに。

[githubはこちら](https://github.com/Fakerr/git-recall)

### インストール

npmでインストールします

```bash
$ npm i -S git-recall
```

もしくはソースをcloneしてきて、path通ってるところに。git-recallファイルを置いてもいけます。

### 使ってみる 

```bash
$ git recall
9371d99 - (HEAD, origin/master, origin/HEAD, master) lintチェック修正 (48 minutes ago) <tko>
65ff091 - hogehogeなおした (87 minutes ago) <tko>
```

こんな感じで履歴が表示されて、カーソルで移動できます。
どれか一個選択すると、差分が表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/105934/54779e60-3d37-1df7-3f98-43c5f9ed73ca.png)

こんな感じですね

qキーで閉じます。

### オプション

以下のオプションがあるみたいです。

|オプション|機能|
|:---:|:---|
|-d|n日前までの履歴を検索|
|-a|authorを指定|
|-f|コミットをfetch|
macからCentOSにsshで接続しようとするとLC_CTYPE: cannot change localeのエラーが出る


メモ：ワードがおかしかったりしたらすみません。


vagrantで作ってる環境にsshした時に起こった内容


```
Welcome to your Vagrant-built virtual machine.
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```

言語設定いろいろ変えてたらvagrant ssh(CentOS)した時にwarning出てしまうようになっていたので、忘れないようにメモ

itermを使用しているのでitermの話し
`Environment` 部分の `Set locale variables automatically` にチェックが入ってしまっているのダメだったようなので、そのチェックを外す

![Screen Shot 2017-01-30 at 18.25.15.png](https://qiita-image-store.s3.amazonaws.com/0/3048/c8ba8def-4767-7ca9-4347-f1752cf55359.png "Screen Shot 2017-01-30 at 18.25.15.png")
docker-compose buildでno space left on deviceが出たときは

```
docker volume rm $(docker volume ls -qf dangling=true)
```

```
docker rmi $(docker images | grep "^<none>" | tr -s ' ' | cut -d ' ' -f 3 )
```

追記

#### コンテナの削除

```
docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm
```

#### イメージの削除

```
docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f
```

追記

```
# Delete all containers
docker rm $(docker ps -a -q)
# Delete all images
docker rmi $(docker images -q)
```
Go入門したときに開発環境を考えた話

続き書きました。 [続: Go入門したときに開発環境を考えた話](http://qiita.com/ababup1192/items/e989d279d2a32fc07847)

Goを初めて1時間の人間のメモです。ベストプラクティスやご指摘等あればよろしくお願いします。

Goを書き始めるにあたって以下のことがしたかったです。

- さっくり関数を書いて、単体テストを通すことでGoの勉強がしたい
- GOPATHに依存したくない
- 本コードとテストをキッチリ分けたい

まず、GOPATH自体には特に問題なく受け入れることができました。Goには、便利なCUIツールが多く存在するので、そう言った目的では、昔からGo(*go get*)を利用してきました。しかし開発時に、*$GOPATH/src*下にプログラムを書いていくのは、受け入れることができませんでした。常に本格的な開発をするならば、とてもいい機構だと思いますが、現状のような初心者ではグローバル空間を汚染しながらプログラムを書くのは気が引けます。もっと気軽に書いて消してを繰り返したいと考えました。

テストコードを書くに辺り公式マニュアルを漁っていたところ[How to Write Go Code](https://golang.org/doc/code.html)という素晴らしいリンクを発見しました。そこには、局所的にGOPATHとコマンドサーチパスを変更・追加する手法が載っていました。しかし、気軽に作って消してを繰り返したい自分としては毎回、環境変数の「状態」を意識するのはツライなあと思いました。

```
$ export GOPATH=$HOME/work
$ export PATH=$PATH:$GOPATH/bin
```

さらに、ビルドやtestの度にパッケージを指定するのは面倒です。

```
$ go build github.com/user/stringutil
```

そして見つけたツールが、[gb](https://getgb.io)でした。とっても良いツールです。トップページにはシンプルに以下のような一文が書いてあります。

A project based build tool for the Go programming language.

これで、GOPATHから解放されて、テストを楽に書く生活ができそうですね？

gbはプロジェクトベースのツールなので、ディレクトリ構造を強制されます。と言ってもすごい単純です。srcを掘ってファイルを配置するだけです。

<img width="241" alt="スクリーンショット 2017-01-30 18.25.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/48687/50b55689-2f08-d958-2911-3ef5ab20f3d7.png">

以下のように、依存ライブラリを管理することも出来るようです。

```
$ gb vendor fetch [依存ライブラリ]
$ gb vendor restore
```

配置が終えたら、テストを実行するだけです。特にテストの位置やbuildなどを気にすることなく、サクッと実行出来てしまいました。

```
$ gb test -v
stringutil
=== RUN   TestReverse
--- PASS: TestReverse (0.00s)
PASS
```

最後になりますが、一つ不満が残りました。本コードとテストコードを分けて書くことが出来ませんでした。以下が理想の書き方です。しかし、現状では大きなものは書かずに、細々としたものを書かないので問題ないかもしれません。ある程度大きなものを書こうとしたときは、どうするんでしょう？と疑問は残っています・・・。

```
$ tree .
.
└── src
    ├── main
    │   └── stringutil
    │       └── reverse.go
    └── test
        └── stringutil
            └── reverse_test.go
```
Reduxで使えそうなパッケージ（個人用）

#デバッグ用
##redux-logger
Reducerが動いたときに、「実行前のstate」 「渡したAction」 「実行後のstate」をコンソールログに表示する
デバッグ用のミドルウェア
![redux-logger_sample.png](https://qiita-image-store.s3.amazonaws.com/0/156086/66861bb0-22e3-dcb9-fcc6-fa58cc4a4741.png)

#HTTP リクエスト
##redux-promise
ActionCreatorで非同期通信させるミドルウェア
参考：[なぜ非同期通信にミドルウェアを使わないといけないのか](http://qiita.com/enshi/items/557dcd7df60e6128249e)
参考：[Reduxの非同期処理にどのMiddlewareを採用するか](http://qiita.com/enshi/items/f6df4485fb5690b06a60)
##axios
ReduxやReactにはAngularのようにHTTPリクエストする機能がない。
API通信するモジュールはいくつかあるが、その中でもaxiosはpromiseベースで作られており、上記のredux-promiseと相性が良い

```js:例
axios.get(url)
      .then(function(response){
        return response.data;
      })
      .catch(error => {
        return error;
      })
```
受信成功時には.then()の関数が実行され、
エラー時には.catch()の関数が実行される

#コード読みやすさの向上
##redux-actions
ActionCreaterやReducerの定型文をなくし、コードを見やすくするためのユーティリティ

```js:redux-actionsを使わずに書く
// ActionCreator
const ADDTAX = 'ADDTAX';
function addTax(value) {
  return {
    type: ADDTAX,
    value
  };
}


// Reducer
const initialState = {
  hoge: '',
};

function appReducer(state = initialState, action) {
  switch (action.type) {
    case ADDTAX:
      return (
        Object.assign({}, state, {hoge: action.value})
      );
    default:
      return state
  }
}
```

↑これが
↓こう書ける

```js:redux-actionsを使って書く
import { createAction, handleActions } from 'redux-actions';


// ActionCreator
const addTax = createAction('ADDTAX');


// Reducer
const initialState = {
  hoge: '',
};

const appReducer = handleActions({
  [addTax]: (state, action) => (
    Object.assign({}, state, {hoge: action.payload})
  ),
}, initialState);
```
#ルーティング
##react-router
「このURLのときはこのコンポーネントを表示させたい」といった処理ができるようにするモジュール。
stateで画面の切り替えを管理するのではなく、URLで管理できる。
##react-router-redux
上記のreact-routerをReduxで使うためのもの？
Swift3+URLSession+JSONSerializationで JSONなREST APIを叩いて表示まで

`https://your-rest-api/items` のレスポンスが以下の場合で。

```json:サンプルJSON
{
      "Items": [
          {
              "title": "森田一義",
              "id": "big1",
          },
          {
              "title": "北野武",
              "id": "big2",
          },
          {
              "title": "明石家さんま",
              "id": "big3",
          }
      ]
  }
```

```swift
enum SerializationError: Error {
    case missing(String)
    case invalid(String, Any)
}

let url = URL(string: "https://your-rest-api/items")

let task = URLSession.shared.dataTask(with: url!) { data ,response ,error in
       
    if let data=data, let response=response{
        do{
            let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:Any]
             // すべてのitemにアクセスする
             for case let item in (json["Items"] as? [[String:Any]])!{
                    guard let title = item["title"] as? String else {
                        throw SerializationError.missing("title")
                    }
                    guard let id = item["id"] as? String else {
                        throw SerializationError.missing("id")
                    }
                    print(id + " : " + title)
                }
            } catch{
                print("Serialize Error.")
            }
        }else{
            print(error ?? " Error")
        }
    }
```
postfixとshellで自動メール返信

## 条件

- ec2環境で、postfixを使ったメールサーバー
- .forwardとshellスクリプトだけで処理

## 補足

※vacationを使ってやりたかったけど、メール送信出来ているときとそうでないときがあり、
不安定だったため、仕方なく以下のようにスクリプトで対処した。

## スクリプト

### .forward

```
\{USER}, "|sh /home/{USER}/reply.sh"
```

### reply.sh

```bash
#!/bin/sh

# 実行ディレクトリ
dir=$(cd $(dirname $0) && pwd)

# fromアドレス
from="no_reply@example.com"

# subject
subject="自動返信メール件名"

# body
body=`cat << EOF
自動返信メール本文

※返信できません

EOF
`

# 自動返信をスキップするFromのアドレスを正規表現で記載
invalid_address="MAILER-DAEMON"

# テンプレート関数
mail_tpl () {
    # subject, bodyをnkfでエンコード
    subject2=`echo $subject | /usr/local/bin/nkf -Mj`
    body2=`echo "$body" | /usr/local/bin/nkf -j`

    mail=`cat << EOF
From: $from
To: $1
Subject: $subject2

$body2
EOF
`
    echo "$mail"
}

# 標準入力有無の判別
if [ -p /dev/stdin ]; then
    # 標準入力取得
    in=$(cat -)

    # Fromアドレスを抽出
    to=`echo "${in}" | egrep -i "^From:" | sed -e "s/From:\s*\(.*\)/\1/g"`

    # スキップ判別
    invalid_num=`echo $to | egrep -i $invalid_address | wc -c`
    if [ $invalid_num -gt 0 ]; then
        exit
    fi

    # メール送信
    echo "`mail_tpl \"$to\"`" | /usr/sbin/sendmail -it
else
    echo "no stdin"
fi


```
趣味用に安く深層学習PCを作った

趣味でディープラーニングで遊ぶためのPCを作ったので、メモ。

## 前提
趣味ならクラウドでいいじゃん、と思われるかもしれないが、AWSのGPUインスタンスだと1時間に100円くらい取られる。GAN系の画像の生成とかやりたい時は、様々なパターンを試してみて、いいものができるか試行錯誤するので、結構使う。  
  
AWS止め忘れて過大な請求くるのも怖い。あくまで趣味の範囲なので、のびのびと遊べるローカル環境の構築を行った。  
  
もともと使ってたPCは、

* Intel Core i7 4770
* メモリ8G
* GTX 750Ti

に、Ubuntu入れて使っていた。色々できないので、ディープラーニング専用機を構築しようと決意。
 
## GPU
まずはGPU。趣味用とは言え、GPUをケチるとやりたいことができない。特にメモリサイズは重要。モデルの読み込みに支障が出たり、学習時のバッチサイズに影響が出てくる。  
  
2016/1/30現在だと、  

* GTX 1080  (メモリ8G)
* GTX Titan X (メモリ12G)

の二つを検討した。
TITAN Xはメモリが12Gもあって、業務でも使っていて問題ないのだが、値段が高い。少なくとも20万くらいする。これは厳しい。  
  
そこで1080を採用。  
メモリは8Gあるし、ゲーム用途に量産されているから安い。  
NTT-Xstore　yahoo店で61,900円、Yahooプレミア会員特典やらなんやらで11,190円分のTポイントがつく。実質50,710円。コスパはとてもいい。  
http://store.shopping.yahoo.co.jp/nttxstore/qzx0013146.html 

  
## その他の要件
メインはGPUに計算させるので、CPUはi7まで要らないと判断。メモリはできれば16G欲しい。電源は600Wあれば十分。ということこんな感じ。 

* Intel Core i5クラス
* HDD 1TB
* メモリ 8~16G
* SSD不要
* 電源 600W以上

電源については、先人の検証によると、500W～600Wで十分らしい。
http://jisaku-game.com/archives/1644

## PC選定
これくらいの条件で検討すると、ゲームPCやBTOに行き着く。  

ゲームPCだと、GPUは搭載されているものの、ハイスペックなゲームを遊ぶために高性能なCPU(だいたいcore i7)とSSDが付いている。すると20万は超えてしまう。  

例：
GTune
http://www.g-tune.jp/desktop/nextgear_z270/#pa1dustel
税込 ¥229,824

ツクモ
https://shop.tsukumo.co.jp/bto/bto.php?BTO_SET_CODE=GA-J729&TYPE=64T
オプションでSSDなし、CPUをi7の下位モデルに変更
税込 ¥18,7704

GPUだけ豪華仕様、ができないので高くなる。
なので、GPUが付いていないPCを購入、GPUを自分で追加する作戦に移行。  
  

## BTOで乗せ代え作戦
BTOで見てみると、i5のHDD1TB, メモリ8GB構成で6~7万円くらい。

https://www.pc-koubou.jp/products/detail.php?product_id=585175
税込 ¥64,778

ツクモ
http://www.tsukumo.co.jp/bto/pc/aerostream/2017/RM5J-B91T.html
税込 ¥71,064


もっと安いのがないかと秋葉原に行くと、パソコン工房のアウトレット品を発見。  
![2017-01-29 08.07.03.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/60778f2e-0196-49d4-42c9-558dc9f65b62.jpeg)
税込¥53,784
メモリが4GBなので、積み替え必須だが、安いのでこれに決定。  
  
## パーツ組み替え
GPUを使えるようにするための電源の取り替え、16Gのメモリ増設を行う。  
  
* 電源 玄人志向 NEXTシリーズ 80 PLUS Bronze 600W ATX電源 KRPW-N600W/85+
    * https://www.amazon.co.jp/gp/product/B00XL7QMCE/
    * 税込 ¥6,300
* メモリ　DDR3 PC3-10600 8GBx2
    * 相性保障つきで税込 ¥12,000
* GPU 玄人志向 グラフィックボード Geforce GTX1080搭載 GF-GTX1080-E8GB/BLF
    * ポイント込みで実質 ¥50,710

以上を合算すると、実質¥122,794となった。  

## まとめ
性能としては、

* Intel Core i5-6500
* GeForce GTX 1080
* HDD 1TB
* メモリ 16GB
* 電源　600W

という深層学習特化PCを、¥122,794で構築できた。
業務だとこんなことできないが、趣味で使えるPCをそこそこ安く構築できた。  

なんだかんだPCショップやパーツ店を巡って、どれが安くなるか考えたり、組み立てたりするのが楽しかった。
これで今までハードの制約でできなかったディープラーニングのライブラリを試して遊びたい。

## 追記
GPUだけ豪華仕様に出来るBTOがあった。

iiyama
https://www.pc-koubou.jp/products/detail.php?product_id=584926
GTX1080搭載、Core i5-6400搭載で税込 ¥150,098
  
BTOだと多分これが一番いいのでは？
Beaconを用いて位置推定する時のメモ(GPS測量、RSSI→距離)

Beaconで位置推定するときにどうすりゃええねんって人の為に簡単にメモっておきます。
#　測量法
フィンガープリントとか三角測量とか三辺測量とかGPS測量とかいろいろな測量法があります。~~正直よくわかりません。~~
フィンガープリントは一般的に精度が高いっていうけど事前学習が面倒だったりするので、今回はGPS測量で使われている方式を利用します。
![tri.png](https://qiita-image-store.s3.amazonaws.com/0/149427/bdd6f738-a463-e45d-ceae-df1cc329addc.png)
GPS測量は座標が既知の3点(衛星)からの距離が分かれば、受信する端末の相対座標が分かるって原理です（実際は時刻同期の為に４機の衛星が必要ですが今回は考えません）。この衛星をBeaconに変えることで屋内での位置推定が可能です。
つまり以下の計算が出来ればおkです。

* Beaconからの距離
* 相対座標

Beaconからの距離は電波強度(RSSI)から求めることができます。
相対座標も座標が既知の3つのBeaconとRSSIから求めた距離を用いて求めることができます。公式とかは参考文献が分かりやすかったのでを参照してください。以下に実装例をメモっておきます。


#　実装

ここでは例としてObjective-cで表記しておきます。

**- RSSIを距離へ変換 -**

```Objective-C
/*RSSIを距離へ変換*/

-(CGFloat)value:(float)num power:(int)val{
    CGFloat ans,x,k;
    k = 2;  //フリスの伝達公式（自由空間では2くらい）
    x = (num+val)/(-10*k);
    ans = powf(10, x);
    return ans;
}
```
**- 位置座標を計算 -**

```Objective-C
/*位置座標を計算*/


- (CGPoint)manPoint:(CGPoint)a beaconB:(CGPoint)b beaconC:(CGPoint)c distanceA:(CGFloat)dA distanceB:(CGFloat)dB distanceC:(CGFloat)dC {
    
    CGFloat Va, Vb, x, y ;
    Va = ((powf(dB,2)-powf(dC, 2))-(powf(b.x, 2)-powf(c.x, 2))-(powf(b.y, 2)-powf(c.y, 2)))/2;
    Vb = ((powf(dB,2)-powf(dA, 2))-(powf(b.x, 2)-powf(a.x, 2))-(powf(b.y, 2)-powf(a.y, 2)))/2;
   
    y = (Vb*(c.x-b.x)-Va*(a.x-b.x))/((a.y-b.y)*(c.x-b.x)-(c.y-b.y)*(a.x-b.x));
    x = (Va-y*(c.y-b.y))/(c.x-b.x);
    
    return CGPointMake(x, y);
}

```

#　参考文献
[1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.684.6710&rep=rep1&type=pdf
[2] https://pdfs.semanticscholar.org/69b0/a4b23d06f5244975394542fd6829a0e92658.pdf
SwiftyJSONをインストールする際にModule compiled with Swift 3.0 エラーが起きる

SwiftyJSONをインストールしようとした際にエラーが起きたのでその解決法のメモ

# 環境
- Swift 3.0
- Xcode 8
- SwiftyJSON

# エラー内容

`$ carthage update` をするとSwftyJSON絡みで以下のエラーが発生

```
Module compiled with Swift 3.0 cannot be imported in Swift 3.0.1: Modules/SwiftyJSON.swiftmodule/arm64.swiftmodule
```


# 解決法

```
$ carthage update --no-use-binaries SwiftyJSON
```
pythonライブラリをアンインストールできない時。Can't uninstall 'hogehoge'. No files were found to uninstall.

pip installがちゃんとできなかった場合にuninstallが出来ないことがある。
pip listで出ない状態でインストールが止まった場合と、pip listはできるけど動かないパターンとある。

直接消す。
```sudo mv /usr/local/lib/python2.7/dist-packages/hogehoge /SOMEWHERE/backupDir
sudo mv /usr/local/lib/python2.7/dist-packages/hogehoge.egg-info /SOMEWHERE/backupDir```

ないことを確認
```pip list | grep hogehoge```
sftp接続の時にumaskをユーザ毎に設定する方法

sshd_configに以下のように記述してservice sshd restartする。以下の例ではhogeとfooユーザのumaskを000にしている。

```bash
Match User hoge,foo
        ForceCommand /usr/libexec/openssh/sftp-server -u 000
```
velocityで多段アニメーションを組む

はい、ダサいですよー。
多分もっとスマートな書き方ありますよー。
jsonとかで定義したらもっとスマートなんだと思うけど。。。
まず、素で書く

```js
$("#main").velocity("fadeIn", {
   duration: 5000,//アニメーションの処理秒数
                  //必要とあればイージングも定義できるぎゃ！
   complete: function () {
           $("#main #opening").velocity({opacity:0.4}, {
           duration: 2500,
           complete: function () {
             //次の処理
           }
);
```
という、書き方で目的は達成できるのではなかろうか。
とにかく描写が綺麗に動いてくれるので、すごくイイ！
Hadoop学習まとめ

##参考サイト
Hadoopの概要（軽い）
http://qiita.com/shiumachi/items/c3e609cb919a30e2ea05
Hadoopの概要（重い 13回から読み始めていいかも）
http://gihyo.jp/admin/serial/01/how_hadoop_works/0001
HDFSとは
http://itpro.nikkeibp.co.jp/article/Active/20120912/422326/

###宣言型プログラミングとは
https://thinkit.co.jp/article/157/3
http://qiita.com/jkr_2255/items/572d3b107f09d33acc8e
https://docs.oracle.com/cd/E49329_01/server.121/b71299/sqllangu.htm


###バッチ処理とは...
>バッチ処理とは、一定量(あるいは一定期間)の集計データを一括処理するための方法
>バッチ処理の対義語としてしばしば見聞きするのが“リアルタイム処理(あるいはインタラクティブ処理)”

####メリット
>・場所や時間に囚われずにデータ処理が可能
>・大規模データを効率的に処理

https://www.imkk.jp/blog/what-is-batch-processing.html
OpenSSH形式の鍵をPuTTYの鍵へ変換する


`ssh-keygen`(OpenSSH)で作成した鍵を、PuTTYの鍵に変換する方法を備忘録としてまとめました。

## アジェンダ

* HomebrewからPuTTYをインストール
* OpenSSHの秘密鍵をPuTTY形式へ変換
* PuTTYで作成された秘密鍵をOpenSSHへ変換

※ Homebrewをインストールしていない方は、[こちら](http://brew.sh/)

## HomebrewからPuTTYをインストール
* [Homebrew Formulas Putty](http://brewformulas.org/Putty)
* [PuTTY: a free SSH and Telnet client](http://www.chiark.greenend.org.uk/~sgtatham/putty/)


```
$ brew install putty
```

### バージョン確認

```
$ puttygen --version
puttygen: Release 0.64
```

### helpを表示

```
$ puttygen --help
puttygen: Release 0.64
Usage: puttygen ( keyfile | -t type [ -b bits ] )
                [ -C comment ] [ -P ] [ -q ]
                [ -o output-keyfile ] [ -O type | -l | -L | -p ]
  -t    specify key type when generating (rsa, dsa, rsa1)
  -b    specify number of bits when generating key
  -C    change or specify key comment
  -P    change key passphrase
  -q    quiet: do not display progress bar
  -O    specify output type:
           private             output PuTTY private key format
           private-openssh     export OpenSSH private key
           private-sshcom      export ssh.com private key
           public              standard / ssh.com public key
           public-openssh      OpenSSH public key
           fingerprint         output the key fingerprint
  -o    specify output file
  -l    equivalent to `-O fingerprint'
  -L    equivalent to `-O public-openssh'
  -p    equivalent to `-O public'
```

## OpenSSHの秘密鍵をPuTTY形式へ変換

※鍵ファイル名が「partner-private」だとした場合

```
$ puttygen partner-private -O private -o partner-private.ppk
```

## PuTTYで作成された秘密鍵をOpenSSHへ変換
※鍵ファイル名が「partner-private」だとした場合

```
$ puttygen partner-private.ppk -O private -o partner-private
```
Elasticsearchのindexに、@timestampに基づいた日本時刻の曜日フィールドを追加する方法


## 日本のしがらみ
UTCであれば、ScriptedFieldに
``` doc['@timestamp'].date.dayOfWeek```
を設定するだけで取れるんですが、今回欲しいのはJSTの曜日。

## Let's Painless
そこで、下記のようなPainlessスクリプトを書いてTimeZone変換してみました。

```
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(Calendar.YEAR, doc['@timestamp'].date.year);
cal.set(Calendar.MONTH, doc['@timestamp'].date.monthOfYear - 1);
cal.set(Calendar.DAY_OF_MONTH, doc['@timestamp'].date.dayOfMonth);
cal.set(Calendar.HOUR_OF_DAY, doc['@timestamp'].date.hourOfDay);
cal.set(Calendar.MINUTE, doc['@timestamp'].date.minuteOfHour);
cal.set(Calendar.SECOND, doc['@timestamp'].date.secondOfMinute);
cal.set(Calendar.MILLISECOND, doc['@timestamp'].date.millisOfSecond);
cal.getTime();

cal.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
return cal.get(Calendar.DAY_OF_WEEK);
```

これをScriptedFieldに設定してやれば、曜日フィールドとして使えます。
曜日ごとの集計とかしたいときに便利。

## しかしながら
取れたものの、曜日取るくらい1行で書けないもんか。
何かElasticsearchの設定をうまいことやってやれば、スクリプト側で頑張らなくても良いんでしょうか･･･
WPS / bash > WPS用のGRIBFILEのSymbolic link処理 > 2カ月までの対応

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
GNOME Terminal v2.31.3
```

関連 http://qiita.com/7of9/items/68827099a5444cae0794

WRF(Weather Research and Forecasting Model)関連。

WPSにおいて、気象データをGRIBFILE.XXXという名前でリンクするスクリプト(link_grib.csh)があるが、自分が行いたい月またぎ（年をまたぐ場合もある）のファイル処理の時に使い勝手が悪い。

無関係な10カ月のデータを含めてSymbolic linkする方法はあるが、bash scriptを作って処理することにした。

## v0.1

### code 

```bash:link_grib_170130_exec
#!/bin/env bash

#
# v0.1 Jan,30,2017
#   - set Symbolic links
#   - get file list using 1st and 2nd runtime parameters
# === branched from [26_26_26_exec] ===
#
# v0.3 Jan,30,2017
#   - add Test_ToAlphabets
# v0.2 Jan,30,2017
#   - move to function
# v0.1 Jan,30,2017
#   - implemented in main 
#

ToAlphabets(){
	NUM_ALPH=26 #  number of alphabet
	CHAR_A=65 #  ASCII character code for 'A'

	num_inp=$1 #  input

	num1=$((num_inp % NUM_ALPH + CHAR_A))
	num2=$(((num_inp / NUM_ALPH) % NUM_ALPH + CHAR_A ))
	num3=$(((num_inp / NUM_ALPH / NUM_ALPH) % NUM_ALPH + CHAR_A ))

#	printf '%x %x %x' {$num3,$num2,$num1}
#	echo # just for LF
	printf '%x %x %x' {$num3,$num2,$num1} | xxd -r -p
	echo # just for LF
}

Test_ToAlphabets(){
	for lines in `seq 31 41 592`;do
		echo "$lines:"
		ToAlphabets $lines
	done
}


#Test_ToAlphabets

#for debug
#echo $#

if [ $# -eq 0 ]; then
    echo "Usage:"
    echo "  [cmd] [target prefix1] ( [target prefix2] )"
    echo "  to make symbolic links for WPS"
    echo 
    echo " where ()  is optional"
    exit
fi

# 1. obtain list of files
if [ $# -eq 1 ]; then
	files=$(ls ${1}*)
fi
if [ $# -eq 2 ]; then
	files=$(ls ${1}* ${2}*)
fi

# 2. process for each file (Symbolic link)
PREFIX_FILENAME="GRIBFILE"

rm -f ${PREFIX_FILENAME}*

idx=0
for afile in $files;do
	suffix=$(ToAlphabets $idx)
	echo $afile $PREFIX_FILENAME.$suffix # for debug
	ln -fs $afile $PREFIX_FILENAME.$suffix 
	((idx++))
done
```

### 使い方 > 引数なし > 使い方の表示

```
$ bash link_grib_170130_exec
Usage:
  [cmd] [target prefix1] ( [target prefix2] )
  to make symbolic links for WPS

 where ()  is optional
```

### 使い方 > 1つの月だけリンク

```
$bash link_grib_170130_exec ~/NCEP_DATA/WORK/fnl_201612
```

こちらの環境では124個(1カ月分)のファイルがリンクされた。

### 使い方 > 2つの月をリンク

```
$bash link_grib_170130_exec ~/NCEP_DATA/WORK/fnl_201612 ~/NCEP_DATA/WORK/fnl_201701
```

こちらの環境では240個のファイルがリンクされた。
FNLファイルは数時間前にスクリプトで取得して1月29日までの分を取った状態。


### 3つ以上の月の対応

しない。

自分が処理したいデータが3カ月にまたがることがないため。

追加するのは、以下の部分に処理を追加すればいいだけ。

```
# 1. obtain list of files
if [ $# -eq 1 ]; then
	files=$(ls ${1}*)
fi
if [ $# -eq 2 ]; then
	files=$(ls ${1}* ${2}*)
fi
```

### チェック

http://qiita.com/7of9/items/50bd3af2704f0075e445
に記載の方法を用いて、リンクが正常に行われたかチェックする。
キーボード設定

Xからのkeyboad layoutの変更

Xから呼び出したブラウザ等のキーボードが英語ではなく日本語配列になってしまうというトラブル発生

まずキーボード設定の確認
```
$ xprop -root | grep XKB
```

"jp,us"という設定があったのでこれを"us"にしたい。
```
$ setxkbmap -layout "us"
$ setxkbmap -print -verbose 10
```

```
$ localectl set-x11-keymap us pc104
$ localctl status
```
UITableViewのセルの高さを自動で算出させる

↓のスクリーンショットのような感じで、UILabelの行数に依存して、UITableViewのセルの高さが自動で算出されるようにしてみます。

これをやると、 `tableView(_:heightForRowAt:)` を実装する必要がなくなります。

<img width="244" alt="螢幕快照 2017-01-30 17.03.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/15144/0c97fcac-3a83-ccfa-9f83-f0b0fc79dda1.png">

# TL; DR

* セルの中のすべてのUIパーツに対して正しいAutoLayoutを設定する
    * 一度UILabelだけのセルにしてみて、うまく伸縮するのを確認してから、1つずつUIパーツを増やしていくのが良い
* ViewController側で
    * `tableView.rowHeight = UITableViewAutomaticDimension` と指定する
    * `tableView.estimatedRowHeight = 44.0` などと指定する

# コードはこちら (Xcode 8, Swift 3)

keisei1092/UITableViewAutomaticDimensionExample
https://github.com/keisei1092/UITableViewAutomaticDimensionExample

# 参考

[iOS8~]セルの高さ可変UITableView(コードベース)
http://qiita.com/taku_oka/items/c3f9281c4a0c56218c2e

Self-sizing Table View Cells - Ray Wenderlich
https://www.raywenderlich.com/129059/self-sizing-table-view-cells
macでdotnetのSDKやmonoのバージョンをシステムレベルで変えたいときにやったこと

**正しいやり方ではおそらくないです**
**以下の方法を実行し起こったいかなる問題，損害に対して私は一切の責任を負いません**

外部のビルドスクリプトで dotnet コマンドや， mono を参照したり mcs コマンドを実行するライブラリを導入することがあった時，
そのライブラリのビルドはこのバージョンじゃないとエラーになるみたいなことがありました．
そのためどのようにシステムで指し示すバージョンを変えるかを調べてみました．

## dotnet の sdk の場合
dotnet の sdk をあるバージョンに固定したり，指定したりする場合はプロジェクトのルートディレクトリに global.json を置いて

```json
{ 
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
```
のようにすることでそのプロジェクトで使用するバージョンを固定したりすることができますが，ライブラリ側がそういった対応をしていなければシステムの sdk のバージョンを変えるのが一番手っ取り早いです．

mac ユーザで配布されているインストーラを使用してインストールいているのであれば， `/usr/local/share/dotnet/` 以下に dotnet 関連のあれこれがインストールされていると思います．
そのディレクトリの sdk というディレクトリを見ると，今までにインストールした各 sdk が以下のような状態で格納されています．

```
drwxr-xr-x  127 root  wheel   4.2K  1 25 12:06 1.0.0-rc4-004616
drwxr-xr-x   50 root  wheel   1.7K  6 22  2016 1.0.0-preview2-003121
drwxr-xr-x   50 root  wheel   1.7K 10 18 06:04 1.0.0-preview2-003148
drwxr-xr-x   50 root  wheel   1.7K 12  1 07:14 1.0.0-preview2-003156
drwxr-xr-x   51 root  wheel   1.7K 11 11 10:09 1.0.0-preview2-1-003177
```

この状態で dotnet のバージョンなどを調べるために `dotnet --info` を実行してみると

```
.NET Command Line Tools (1.0.0-rc4-004616)

Product Information:
 Version:            1.0.0-rc4-004616
 Commit SHA-1 hash:  56d8071361

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.11
 OS Platform: Darwin
 RID:         osx.10.11-x64
 Base Path:   /usr/local/share/dotnet/sdk/1.0.0-rc4-004616
```

最新の 1.0.0-rc4-004616 が読まれているようです．
この最新バージョンをどのようにして取得しているのかはまだ調べていませんが，このバージョンは先頭に何かしら文字列を加えてしまえば無効なものとみなされ無視されることがわかりました．

そのため少し前のバージョンである 1.0.0-preview2-1-003177 を使いたいという場合は，それよりもバージョンが上である 1.0.0-rc4-004616 をリネームしてしまえばいいのです．
私は `1.0.0-rc4-004616 -> _1.0.0-rc4-004616`のように，先頭にアンダースコアを入れる形で対策しています．

この状態で `dotnet --info` を実行すると

```
.NET Command Line Tools (1.0.0-preview2-1-003177)

Product Information:
 Version:            1.0.0-preview2-1-003177
 Commit SHA-1 hash:  a2df9c2576

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.11
 OS Platform: Darwin
 RID:         osx.10.11-x64
```

と目的のものに変えることができました．

ですが，さらに古いバージョンにしたいとなるといくつも上のバージョンをリネームする必要があって非常に面倒です．
というわけで簡単な変更スクリプトを書いたのでこれを使えばいいんじゃないかなと思います．
https://gist.github.com/yamachu/3cce558ee49e40a8c8ff7fd7da2793c7
要Python3.6 以上なのですが，3.6で導入された `f'1 + 1 = {1+1}'`みたいなフォーマット指定のものに使っているだけなので， そこを書き換えてPython3.5 以上であれば動作すると思います．

動作としてはこんな感じです．
![dotnet_switch.gif](https://qiita-image-store.s3.amazonaws.com/0/104085/27d40cdc-f781-75f1-1d27-c2d41c4edde7.gif)

## mono のバージョンに関して
以前 [Visual Studio for Macをインストールしてmono4.8+が無いと怒られた時の対処法](http://qiita.com/yamachu/items/3ba12a2191c5538533df)という記事で使った対処法と同じで，
`/Library/Frameworks/Mono.framework/Versions/Current`の指す先を変えてしまえばひとまずは問題なさそうだったので，この方法を採用しています．
[追記]
本当の正しいやり方はこれのようです
[Parallel Mono Environments](http://www.mono-project.com/docs/compiling-mono/parallel-mono-environments/)

これも面倒だったので上記と同じようなスクリプトにしました．
https://gist.github.com/yamachu/faec9bbe5bbe21ab814f1ad59e8cbb84

以下動作例
![mono_switch.gif](https://qiita-image-store.s3.amazonaws.com/0/104085/dee1fe65-814b-a48b-9aca-e5ff4b15c0d6.gif)


## 最後に
正しいやり方があれば教えていただけると幸いです．
リポジトリの一番初めのコミットを取得する

## リポジトリの最初のコミット
最新のコミットはHEADだが、一番初めのコミットを得るには `--max-parents=0`オプションを付けてrev-listやlogを呼び出す。
`--max-parents`オプションは、親コミットの数を指定することになるので、`--max-parents=0`は親のないコミット、始祖コミットを取得することが出来る。

Electronのリポジトリで `git rev-list --max-parents=0 HEAD`をするとこうなる
![image](https://qiita-image-store.s3.amazonaws.com/0/2341/af4522ea-b5b4-31dc-e5c0-062f11455e41.png)


`git log --max-parents=0`を行っても良い

![image](https://qiita-image-store.s3.amazonaws.com/0/2341/15c0d54a-71df-7989-a432-602f12239f07.png)


## 環境
git version 2.11.0
Vagrant(VirtualBox)のMACフィルタ設定

VirtualBoxのInternal networkではデフォルトでMACアドレスフィルタがかかっている。問題がある場合は、Vagrantでは[明示的に設定](http://qiita.com/paihu/items/a1cb995e4469dd17303b)する。

で、試していて気が付いたのは Vagrant 1.9.1 / VirtualBox 5.1.14 / Windows 10 では `VirtualBox` ではなく `virtualbox` でないとダメらしい。

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
 config.vm.box = "minimal/xenial64"
 config.vm.synced_folder ".", "/vagrant", disabled: true

 config.vm.define :bpW do |node|
  node.vm.network :private_network, ip: "192.168.1.2", virtualbox__intnet: "W"
  node.vm.provider :virtualbox do |vb|
   (1..node.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
    vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
   end
  end
 end
end
```

`vagrant up --debug 2>debug.log` して分かった。
畳み込みニューラルネットワークとは〜Convolution編〜

CNNにおける，畳み込み（Convolution）について書いていきます．
#Convolution
ニューラルネットワークの特徴は，人間が指定しなくとも特徴を見つけてくれることです．では，その特徴をどのように使って画像同士を比較したらよいのでしょうか？

例えばバツは次の特徴を持っています．

![cross_4.png](https://qiita-image-store.s3.amazonaws.com/0/28622/b23f6461-c430-0f85-166e-3f4bdba8e0b7.png)

ここで，このピクセルは白か黒なので，白を-1，黒を1とします．するとバツの画像は
![cross_5.png](https://qiita-image-store.s3.amazonaws.com/0/28622/36ad4f6a-787a-4951-3d17-4360080a115a.png)


特徴は
![cross_6.png](https://qiita-image-store.s3.amazonaws.com/0/28622/524a408c-d579-d78a-8c59-d0ed2e000d92.png)


と，表現することができます．

ここで，
![cross_4.png](https://qiita-image-store.s3.amazonaws.com/0/28622/ea0f9e17-57e6-6033-74bc-7fb734328e25.png)
この部分を比較計算してみます．
対応するセル同士を計算します．
つまり，
合致すれば
1(黒) × 1（黒） = 1
1(白) × 1（白） = 1
1になり，
合致しなければ
-1（白） × 1（黒） = -1
1(黒) × -1（白） = -1
-1になります．

計算した結果を表現すると，
![cross_8.png](https://qiita-image-store.s3.amazonaws.com/0/28622/cf995353-9b46-b818-98df-d4fa9be9ffa6.png)

最終的にそれぞれのセルの値を足したものをピクセルで割ります．つまり，合致すればするほど値が1に近づきます．
この場合，完全合致なので1です．
この一連の演算を「畳み込み演算」といいます．

今回の場合，画像のセルが9×9マス，特徴が4×4マスなので，パーツを1マスずつずらしくいくと，その計算結果は6×6マスになります．（計算結果はでたらめなので信用しないでください）
![cross_10.png](https://qiita-image-store.s3.amazonaws.com/0/28622/0492e025-6914-854a-1cc3-10a6daf3b7e0.png)


こうして得られたものを特徴マップといいます．

こうして画像がどれだけ特徴をもっているのかを数値的に測ることができます．
この演算自体はとても単純なものです．しかし，これが9×9の荒い画質ではなく，標準的な画質の画像となったとき，その計算量は膨大なものになります．GPUを使わないと学習にかかる時間が大変なことになるのはこのためです．

#おわりに
次は，Rectified Linear Unitsについて，書きます．

#参考
山下隆義
イラストでわかるディープラーニング 講談社

斎藤康毅
ゼロから作るDeep Learning

畳み込みニューラルネットワークの仕組み
http://postd.cc/how-do-convolutional-neural-networks-work/
bash > 0から17575(26の三乗-1)の値を[AAA...ZZZ]に変換する実装 > print '%x'とxxd使用

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
GNOME Terminal v2.31.3
```

WRF(Weather Research and Forecasting Model)関連。

関連 http://qiita.com/7of9/items/050bec2ecd6e0b790165

WPS処理時のlink_grib.cshファイルのSymbolic link対象ファイルの処理が使い勝手が悪いので、自作のスクリプトを用意しようとかと考えている。

bashで実装するか、Pythonで実装するか。

とりあえずbashで実装してみる。

## 実装内容

WPSの処理では、複数のファイルに対して`AAA, ..., AAZ, ABA, ..., AZA, ... AZZ, BAA, ... ZZZ`のsuffixを付ける。

その処理をbashで実装してみた。

- 引数: 0から17576-1 (26の三乗-1)
- 引数からアルファベットの数(26)に対する剰余と商を求める
   - %演算子とtruncating integer division使用
- xxdで置換
   - 参考: http://stackoverflow.com/questions/890262/integer-ascii-value-to-character-in-bash-using-printf

## v0.1

### code

```bash:26_26_26_exec
#!/bin/env bash

NUM_ALPH=26 #  number of alphabet
CHAR_A=65 #  ASCII character code for 'A'

num_inp=$1 #  input

num1=$((num_inp % NUM_ALPH + CHAR_A))
num2=$(((num_inp / NUM_ALPH) % NUM_ALPH + CHAR_A ))
num3=$(((num_inp / NUM_ALPH / NUM_ALPH) % NUM_ALPH + CHAR_A ))

printf '%x %x %x' {$num3,$num2,$num1}
echo # just for LF
printf '%x %x %x' {$num3,$num2,$num1} | xxd -r -p
echo # just for LF
```


```txt:結果
$ bash 26_26_26_exec 25
41 41 5a
AAZ
$ bash 26_26_26_exec 26
41 42 41
ABA
$ bash 26_26_26_exec 26
41 42 41
ABA
$ bash 26_26_26_exec 17576
41 41 41
AAA
$ bash 26_26_26_exec 17575
5a 5a 5a
ZZZ
```

print '%x'とxxdは初めて使ってみた。

num1,num2,num3の計算はスマートではない。

## v0.3 > 関数化+テスト関数

参考: http://qiita.com/ymdymd/items/271e403adc67f08c8d70

```bash:26_26_26_exec
#!/bin/env bash

# v0.3 Jan,30,2017
#   - add Test_ToAlphabets
# v0.2 Jan,30,2017
#   - move to function
# v0.1 Jan,30,2017
#   - implemented in main 
#

ToAlphabets(){
	NUM_ALPH=26 #  number of alphabet
	CHAR_A=65 #  ASCII character code for 'A'

	num_inp=$1 #  input

	num1=$((num_inp % NUM_ALPH + CHAR_A))
	num2=$(((num_inp / NUM_ALPH) % NUM_ALPH + CHAR_A ))
	num3=$(((num_inp / NUM_ALPH / NUM_ALPH) % NUM_ALPH + CHAR_A ))

	printf '%x %x %x' {$num3,$num2,$num1}
	echo # just for LF
	printf '%x %x %x' {$num3,$num2,$num1} | xxd -r -p
	echo # just for LF
}

Test_ToAlphabets(){
	for lines in `seq 31 41 592`;do
		echo "$lines:"
		ToAlphabets $lines
	done
}


#Test_ToAlphabets

ToAlphabets $1
```
ランダムに出てくる単語を数え上げるシェルスクリプト

# やること

```text:words.txt
abc
abc
123
xyz
123
xyz
abc
123
abc
```

こんなファイルがあったとします。１行に1個「単語」が書かれていて、ファイル内にどんな単語があるのか予めわかってはいません。

で、このファイルを見て
`123` -> 3個
`abc` -> 4個
`xyz` -> 2個
というふうに、出てきた単語全てについて何個出てきたかを数えたいのです。

# やってみたら以外と簡単だった(ノ´ー｀)ノ

```bash:counter.sh
#!/bin/sh
cat words.txt | sort | uniq | while read WORD
do
  echo "${WORD} "$(grep -c "${WORD}" words.txt)
done
```

こんな感じでした。

```
[]$ ./counter.sh 
123 3
abc 4
xyz 2
```
BootstrapのModal上にSelect2を配置するときの注意

## どうしたかったか
Bootstrap3のModal上にSelect2を使った選択項目を配置して、検索文字を入力させたかった。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/13109/c200c304-f2d8-51c8-5d92-4ec36eb17e2c.jpeg)
## どういう不具合があったのか
入力項目に文字が入力できない状態になってしまった。
## 何が原因だったか
Modalの``tabindex="-1"``が、どうやらSelect2の入力を遮っていたことを確認した。
## どう対処したか
```HTML
<div class="modal fade" id="dialog" tabindex="-1" role="dialog" aria-labelledby="dialog" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
・・・
```

これを下のように変えた。（``tabindex="-1"``を削っただけ。）

```HTML
<div class="modal fade" id="dialog" role="dialog" aria-labelledby="dialog" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
・・・
```

## 結果
狙い通りに動くようになった。
nodejsのAWS Lambda functionをビルド/アップロードするシェルスクリプトを書いてみた

# はじめに
AWS Lambdaのfunctionを更新するたびにコンソールやS3からアップロードするのが面倒だったので、nodejsのパッケージをビルドしてLambdaへアップロードするシェルスクリプトを書いてみました。
リポジトリはこちら: 
https://github.com/suhirotaka/utility/blob/master/shell/upload_node_lambda_function.sh

# 使い方
`upload_node_lambda_function.sh <SOURCE_DIRECTORY> <FUNCTION_NAME>`
SOURCE_DIRECTORYにソースが入っているディレクトリ、FUNCTION_NAMEにLambdaのfunction名を指定します。Lambdaのハンドラを指定しているファイルはsource_directoryの直下へ置いてください。

SOURCE_DIRECTORYのディレクトリ構成は以下のように、nodeのスクリプトとpackage.jsonを含めます。package.jsonに書かれた依存パッケージを`npm install`してから、jsファイルをzipで固めてLambdaへアップロードします。

```
source_directory - myFunction1.js
                   myFunction2.js
                   ...
                   package.json
```

# ちょっとハマったこと
- Lambdaへのアップロードでは、fileb://プロトコルを使用する必要があります。ずっとfile://を使ってアップロードできないなーと悩んでいたら、ちゃんとドキュメントに載っていました。binaryの"b"なんでしょうが、初めて見るプロトコルでした。。
- zipで固めるとき、`zip -r out.zip source_directory`のようにディレクトリごと固めてしまうと、Lambdaで"Module not found"のエラーになります。これも悩んだのですが、ハンドラをexportsしているファイルがパッケージのルートにないのが原因でした。`zip -r out.zip *.js node_modules`のように書かないといけません。
複数のAWS Lambdaを１つのイベントで同時実行させる方法

[AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)(以下Lambda)は実行時のみ料金の発生するサーバーサービスだ。

Lambdaの便利なところはS3やSQSなどのサービスへのデータ追加や変更などのイベントをトリガーに実行させられるところにある。

例えばS3に画像がアップロードされた時にイベントトリガーとしてサムネイルを生成するLambdaを登録しておくと、バッチサーバーを立てて常時起動しておかなくてもアップロード時のみ都度処理してくれるのでコストが抑えられるとか。用途は色々。

＊　＊　＊　＊　＊　＊　＊

今回は某案件にて複数のLambdaに対して1つのイベントで全て同時実行させる必要があったが少しはまったのでメモ。

自分の当初の計画ではS3にLambdaに渡したいデータの書かれたファイルがアップロードされたとき、トリガーとして対象となるLambdaを複数登録すればOkという目論見でいた。

ところがこれはうまくいかない。

例えばhoge bucketにprefixがbar、suffixが.csvのファイルをアップロードされるときイベントトリガーとしてLambdaを登録したいとする。

もちろんLambda１つであれば当然登録できる。

しかしながら、同じルールで2つめのLambdaを登録しようとすると以下のようなエラーが発生する。

>
There was an error creating the trigger: Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type.

要は同一bucketで同じルールのイベントトリガーとして登録できるLambdaは1つということらしい。

＊　＊　＊　＊　＊　＊　＊

じゃあどうすればいいかというと、DynamoDBのストリームベースモデルのイベントを利用する。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-ddb.html

先の例であれば、DynamoDBにLambdaに渡したいデータを挿入し、そのイベントのトリガーとしてLambdaを実行させるようにする。

このやり方だとDynamoDBへのイベントに対して複数のLambdaを紐付けることが可能なので、イベント発生->同時に複数Lambdaの同時実行が可能になる。

また、aws cliでは[create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html)を使うことでLambdaとDynamoDBのイベント定義が可能なので設定の自動化もできる。

```
aws lambda create-event-source-mapping \ 
--event-source-arn arn:aws:dynamodb:ap-northeast-1:XXXXXXXX:table/TABLE_NAME/stream/20XX-01-01T00:00:00.000 \
--function-name arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:FUNCTION_NAME \ 
--starting-position TRIM_HORIZON
```

注意としてはテーブル単位でlambdaが紐づくので、すべてのイベント(変更や削除)でlambdaが起動する。なのでlambdaのコード側でイベントの種類によってのハンドリングをしっかり行う必要がある。

またLambdaごとにイベントの処理が成功するまで定期的にイベントが再発生するのでそのハンドリングもコード側でしないといけない。

＊　＊　＊　＊　＊　＊　＊

ちなみにAWS Lambdaはデフォルトだと同一リージョンに最大100個登録することができる。

それ以上はAWSへの申請が必要。


### (参考)

- [Lambda 関数の同時実行](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/concurrent-executions.html)
- [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html)
drawImageを使ってトリミングする時の注意

HTML5のCanvasのapiにdrawImageがある。

その名の通り、Canvasに画像を描画するメソッドだ。

基本的な使い方は、以下の通り。

例) 100x100の画像を描画

```javascript
var canvas = document.getElemntById('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = "hoge.jpg";
img.onload = function() {
  ctx.drawImage(img, 0, 0, 100, 100);
}
```

またトリミングも引数を下記のように渡すことで簡単にできる。

例) 100x100の画像をx=10,y=10の地点から50x50のサイズでトリミングして描画

```
var canvas = document.getElemntById('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = "hoge.jpg";
img.onload = function() {
  ctx.drawImage(img, 10, 10, 50, 50, 0, 0, 50, 50);
}
```

では、x=-10,y=-10の地点から50x50のサイズでトリミングして描画してみるとどうなるか。

```
var canvas = document.getElemntById('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = "hoge.jpg";
img.onload = function() {
  ctx.drawImage(img, -10, -10, 70, 70, 0, 0, 70, 70);
}
```

Chrome

<img width="934" alt="スクリーンショット 2017-01-29 17.45.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/13609/98b84bca-afbf-5213-d327-035ae90d8c9c.png">

FireFox

<img width="925" alt="スクリーンショット 2017-01-29 17.45.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/13609/7d140cf9-bd49-e9e0-42f5-cb76c35c9634.png">

Safari

<img width="927" alt="スクリーンショット 2017-01-29 17.45.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/13609/0c174ea8-63f1-cf55-a135-da3fdde629a1.png">

このようにSafariだけ表示がされない。

これはどういうことかというと、HTML5の仕様ではこのように定義されている。

>The source rectangle is the rectangle whose corners are the four points (sx, sy), (sx+sw, sy), (sx+sw, sy+sh), (sx, sy+sh).
If the source rectangle is not entirely within the source image, or if one of the sw or sh arguments is zero, the implementation must raise an INDEX_SIZE_ERR exception.

[https://www.w3.org/TR/2010/WD-2dcontext-20100624/#images](https://www.w3.org/TR/2010/WD-2dcontext-20100624/#images)

つまり、トリミングする際の矩形の角は元画像内からはみだしてはいけないということ。

ということは、x=-10,y=-10をdrawImageに設定するとエラーとなり描画できないのは仕様通りとなる。

なので今回の場合、Safariの挙動が正しく、その他のブラウザの挙動のほうがむしろ独自仕様ということのようだ。

もしSafari(mobileも含む)を対象ブラウザとしていて、下記のようなトリミング機能を実装する場合は、トリミングの枠よりも元画像が小さくならないように制限する必要があるので注意が必要だ。

![f420af2c64c90743c30f2762b0fa78bd.gif](https://qiita-image-store.s3.amazonaws.com/0/13609/559df6ec-d1a3-0927-aed3-7d3a6e038cf1.gif)
KeyCDNでカスタムSSL設定をする

KeyCDNでカスタムSSLの設定をしたのでメモ。

といってもあまり特別なところはない。

手順としてはざっくり、

- SSL証明書を取得する準備
- SSL証明書の取得
- KeyCDNに設定

# SSL証明書を取得する準備

まずはSSL証明書を取得する。

そのためには申請に必要なCSRを作成しないといけない。

作成手順や意味解説は巷に沢山あるので詳しいことは省略するが、コマンドをまとめるとこんな感じで。

```
$ openssl md5 /var/log/messages > rand.dat

$ openssl genrsa -rand rand.dat -des3 2048 > private_key.pem
Enter pass phrase:
Verifying - Enter pass phrase:

$ openssl req -new -key private_key.pem -out csr.pem
Enter pass phrase:

Country Name (2 letter code) [AU]:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
  A challenge password []:
  An optional company name []:
```

# SSL証明書の取得

さっき作ったCSRを使って、証明書の取得申請を送る。

基本的には、ほしい証明書の公式サイトに行くか[https://www.ssl-store.jp/](https://www.ssl-store.jp/)のような代理店で購入するかどちらか。

代理店のほうが一部の証明書は公式より安かったりするので比較して検討するとよい。

CSR生成時に入力した情報とCSRの中身を購入時に入力し、しばらくするとメールが来て証明書をゲットできるという流れ。

自分はSSL StoreでComodoの証明書を取得したけど、最近は審査が厳しくなっているらしく発行まで2,3日かかった。

また、自分の場合はさらにメールの転送がどこかのルートで滞っていたようで代理店のサポートに催促のメールを何度か送ってやっとのことで手にいれた。

# KeyCDNに設定

KeyCDNに取得したSSL証明書を設定する。

- 1) まずは、設定時に必要となる秘密鍵を復号しておく。

```
$ openssl rsa -in private.pem -out private_dec.pem
Enter key phrase:
```
<br>
- 2) 次に[KeyCDN](https://www.keycdn.com/)にログインし、SSL設定をしたいzoneの設定ページへと移動し、"Show Advanced Features"のチェックボックスをクリックする
  - ※ **もしzonealiasを作成していない場合はあらかじめ作成しておくこと**
<br>
- 3) SSLという項目があるのでそこのセレクトボックスからcustomを選択する。すると下の写真のようなテキストボックスがでてくる。

![custom-SSL.jpg](https://qiita-image-store.s3.amazonaws.com/0/13609/7e420458-d1d6-8c10-2633-9326da4a6c47.jpeg)
(画像は[keyCDN](https://www.keycdn.com/support/how-to-setup-custom-ssl/)より)
<br>
- 4) Custom SSL Certificateのところに先程取得したSSL証明書を入力
  - ※もし中間証明書をなくしてた場合は[Certificate Chain Composer](https://tools.keycdn.com/certificate-chain)
に証明書を入力すると生成してくれる
<br>
- 5) Custom SSL Private Keyのところには先程復号した秘密鍵を入力

これで設定は完了。

あとは全台のCDNに反映されるまで待つ。5分ほどかかるようだ。

下記コマンドで確認するとよい。

```
echo QUIT | openssl s_client -connect cdn.yourdomain.com:443 -servername cdn.yourdomain.com -tls1 -tlsextdebug -status
```

## 参考リンク
- [csrの作成](https://www.ssl-store.jp/support/csr/ApacheOpenSSL/)
- [秘密鍵の復号](https://rms-digicert.ne.jp/howto/basis/decrypt_key.html)
- [How to setup Custom SSL](https://www.keycdn.com/support/how-to-setup-custom-ssl/)
AWS Lambda+Python 2.7でサクッとTwitter Botの開発環境をつくるスクリプトを書いた

最近Pythonで遊びはじめたので手始めにTwiiterBotを作りたい気持ちになった。

しかしただBotを動かすだけのためにサーバーとか管理するのはだるすぎるのでAWS Lambdaで作れるようにするやつを作った。

- [twitter-bot-lambda](https://github.com/YuheiNakasaka/twitter-bot-lambda)

```
$ tree .
.
├── README.md
├── deploy.py
├── event.json
├── lambda.json
├── lib
│   └── __init__.py
├── mezamashidokei_character.png
├── requirements.txt
├── setup.py
└── tweet.py
```

これを使うと、Hello Worldがてら30分置きに現在時刻をつぶやくTwitterBotを作成してくれる。

アップロードからスケジューリングの設定まで１コマンドでしてくれるようにしたので、いわゆるboilderplateみたいな感じ。

とりあえずこれをいじってればLambda+PythonでのBotの開発のいろはは学べるはず。

# 使い方

とりあえず一番面倒なのは最初のセットアップ。

- virtualenvで仮想環境作る
  - [この辺見て](http://qiita.com/H-A-L/items/5d5a2ef73be8d140bdf3)
- IAM作成(AWSLambdaBasicExecutionRoleを持ったやつ)
  - [この辺見て](http://qiita.com/yutackall/items/a4039b917cb8848c3c4d#lambda-%E5%AE%9F%E8%A1%8C%E7%94%A8%E3%83%AD%E3%83%BC%E3%83%AB%E4%BD%9C%E6%88%90)
- Twitter App作成
  - [この辺見て](http://qiita.com/yuki_bg/items/96a1608aa3f3225386b6#1%E6%BA%96%E5%82%99)
- aws cli設定
  - [この辺見て](http://qiita.com/n0bisuke/items/1ea245318283fa118f4a#cli%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

これらは残念ながら手作業でやらないといけない。ただ、AWSやVirtualEnvの設定とかはすでにやってる人多いと思うから実質TwitterAppのとこだけかな。

まあだるいが各種リンクを見ながらやってもらうことにして、そこで得たIDやアクセストークンなどを.envファイルに設定する。

- .envの例

```
# AWS settings
AWS_ACCOUNT_ID=12345678910
AWS_IAM_ROLE_NAME=lambda_basic_execution
AWS_REGION_NAME=ap-northeast-1

# Twitter account name
TWITTER_ACCOUNT_NAME=yamadatarou01234

# Twitter app consumer key, consumer secret
CONSUMER_KEY=hogehoge01234
CONSUMER_SECRET=fugafuga01234

# Twitter account tokens
ACCESS_TOKEN=nyannyan01234
ACCESS_TOKEN_SECRET=wanwan01234

# [Options] Virtualenv path
# ここは空でも良い
CUSTOM_VENV_PATH=
```

あとは,依存関係のinstallをやる。

```
$ pip install -q -t ./lib -r ./requirements.txt
```

ここまでくればあとはセットアップコマンドを打って、

```
$ python setup.py
```

デプロイしておしまい。

```
$ python deploy.py
Upload?(y/n):y
Shedule?(y/n):y
```

晴れてこんな感じのアカウントが作成される。

![kako-cWQSOOdiY3DhN8yM.png](https://qiita-image-store.s3.amazonaws.com/0/13609/01e09608-33f6-3cb5-61e5-7530807bd368.png)

# この後

最初のデプロイまで終わればあとはこれを改造しながら開発するのみ。

ローカルで開発するときは、下記のコマンドを打てばローカルでもlambdaと同様の環境の実行ができる。

```
$ python-lambda-local -f lambda_handler  ./tweet.py ./event.json
```

また、再度デプロイしたいときはdeployコマンドを打てば簡単にアップロードされる。

```
$ python deploy.py
Account Name:your_twitter_bot_name
Upload?(y/n):y
Shedule?(y/n):n
```

ライブラリはTweepyを使ってるので[API Reference](http://tweepy.readthedocs.io/en/v3.5.0/api.html)を読みながらBot作成に集中すると良い。

尚、Tweet・Retweet・Favorite・Refollowを行う機能についてはtweet.pyに関数を追加しておいたので参考までに。

デプロイとか各種設定で本来のやりたいことに集中できないのは良くないのでこういう簡単なスクリプトを書いて開発すると捗っていいかんじになる。
C++ Builder XE4, 10.2 Tokyo > **注意** > SaveToFile()の保存先フォルダ > カレントフォルダ > TDirectoryListBoxにより変更されてしまう

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

`SaveToFile("test.csv");`

こういう処理をしている場合の注意点を他の人のコードで気づいた。

SaveToFile()と関連して使うのはFileExists()。
https://msdn.microsoft.com/ja-jp/library/cc428041.aspx

## 環境と症状

- TDirectoryListBoxがある
- ButtonでSaveToFileを実行する

上記の環境に対して、以下の動作となる。

- TDirectoryListBoxによりフォルダを指定した後に、そのフォルダにSaveToFile()される。

## 上記を再現する環境

- TDirectoryListBoxを追加
- TButtonを追加

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String curDir = GetCurrentDir();

	OutputDebugString(curDir.c_str());
}
//---------------------------------------------------------------------------
```

```txt:結果
デバッグ出力: C:\Users\XXX\Documents\RAD Studio\Projects\00-work\Win32\Debug プロセス Project1.exe (2980)
デバッグ出力: C:\Users プロセス Project1.exe (2980)
```

1つ目の結果は、「TDirectoryListBoxで選択前」
2つ目の結果は、「TDirectoryListBoxで選択後」。

カレントフォルダがTDirectoryListBoxにより変更されている。
その後にSaveToFile()をすると、意図しないフォルダに保存してしまう。
Apex 

####カスタムラベル
`Label.xxx`  //xxxはラベル名

####カスタム例外
組み込み例外はthrowできないのでカスタム例外を宣言する。
`public class MyException extends Exception {}`
`new MyException('This is bad');`
`new MyException(e);`
`new MyException('This is bad', e);`

####割り算と小数点
Integerを割り算しても答えは0になる。[Decimal](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_decimal.htm)型で計算する必要がある

```java
Double a = 1/5;  //Integerのままでは a=0になる。0.2にはならない

Double a = Double.valueOf(1) / Double.valueOf(5); //a=0.2になる

//小数点第一位で四捨五入する
Double ratio = Decimal.valueOf(ansItems).divide(totalItems, 1, System.RoundingMode.HALF_UP);

//整数値として四捨五入する
ratio = ratio.setScale(0, System.RoundingMode.HALF_UP);

```
####数値を3桁区切りで表示する
`Decimal.valueOf(10000).format();  -> 10,000`
####カスタム設定からの値の取得
階層化しないカスタム設定のケース

```java
public with sharing class xxx_Properties {
    private static xxx_Properties__c props {get{
        return Ron_Properties__c.getValues('カスタム設定のnameの値');
    }}

    public static Integer xxxx {get{
        return Integer.valueOf(props.get('xxxx__c'));
    }}
    public static String xxxx {get{
        return String.valueOf(props.get('xxxx__c'));
    }}
    public static String xxxx {
        set{
            props.put('xxxx__c', value);
        }
        get{
            return (String)props.get('xxxx__c');
        }
    }
```
####URLエンコード/デコード
[ここを参照](http://qiita.com/TaigarAndDragon/items/ea703bfde22eaf1e5ed5#urlエンコードデコード)

####型の判定
instanceOfを使用する。

```java 
if (abc instanceof String){
 ...
if (amap instanceof Map<String, String>){
 ...
```

####try/catch/finally
```java
try {
    // Perform some database operations that
    //   might cause an exception.
} catch(DmlException e) {
    // DmlException handling code here.
} catch(Exception e) {
    // Generic exception handling code here.
} finally {
    // Perform some clean up.
}
```
####テスト実行時に特定のロジックを実行させないようにする
[こちら](http://qiita.com/TaigarAndDragon/items/343dad5ed06fd538a711#テスト実行時に特定のコードブロックを実行させないようにする)

###コレクション関連
[List](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_list.htm)
####>Mapからキーの一覧を取得
`Set<String> = colorCodes.keySet();`
####>Mapから値の一覧を取得
`List<Object> = colorCodes.values();`
####>リストが空かどうかのチェック
```java
XXX_c[] xxx = Database.query(soql);
if (xxx.isEmpty()){
    ....
}
```

####>Listの初期化
`String[] entries = new List<String>();`
`Integer[] nums = new List<Integer>{1, 2, 5, 7};`

####>List操作
`entries.size();  //要素数`
`entries.add('xx');  //要素を最後に追加`
`entries.add(0, 'xx');  //要素を先頭(index=0)に追加`
`entries.addAll(anList); //他のリストを追加`
`entries.remove(0); //指定されたIndexの要素を削除`
####>Mapの初期化
`Map<String, String> keys = new Map<String, String>();`
`Map<Integer, String> keys = new Map<Integer, String>{1=>'xxx', 2=>'rew'};`
`Map<ID, Account> accnts = new Map<Id, Account>([SELECT ID, Name FROM Account]); //sObjectのみ使える。`
####>Map操作
`map.put('key', 'value');   //要素の追加`
`map.remove('key');     //要素の削除`