OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでTableViewいろいろ -> No.2

#はじめに
SwiftでUITableViewについて第2弾です。
今回は次の3点について書きます。
・タップ時のイベント処理の実装
・accessoryTypeを指定してセルの右側にチェックマークとかつける
・accessoryViewにUISwitchとかを入れる

ちなみにNo.1ではとりあえず表示することを目標に
・セクション分けして表示
・ヘッダー,フッターを表示
について書きました。（コードそのまま載せた感じになってしまったが、、）
[SwiftでTableViewいろいろ -> No.1](http://qiita.com/okudera/items/ea555c812bb4a25331ee)

#セルタップ時のイベント処理の実装
UITableViewDelegateのfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
を使います。

```
//MARK:UITableViewDelegate

    /**
     Cell選択された時に実行するメソッド
     */
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // セルの選択状態を解除
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        
        print("section:\(indexPath.section) row:\(indexPath.row)")
    }
```
このSampleではログ出力しただけですが
セルタップで画面遷移したりアラート表示したりと使う場面は多いと思います。

#accessoryTypeを指定してセルの右側にチェックマークとかつける
**accessoryTypeの種類**
1.UITableViewCellAccessoryType.None
2.UITableViewCellAccessoryType.Checkmark
3.UITableViewCellAccessoryType.DetailButton
4.UITableViewCellAccessoryType.DisclosureIndicator
5.UITableViewCellAccessoryType.DetailDisclosureButton

それぞれこんな感じ↓
<img width="279" alt="スクリーンショット 2016-04-28 2.36.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/265cfede-38a5-e265-f7f5-209b874ddf10.png"> 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellの中で
UITableViewCellのインスタンスを生成(cell)して
`cell.accessoryType = UITableViewCellAccessoryType.Checkmark`
のようにaccessoryTypeを指定します。



#accessoryViewにUISwitchとかを入れる
次は、accessoryType指定ではなくaccessoryViewに任意のUIを設定します。
accessoryTypeのケースと同じような感じですが、
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellの中で
UITableViewCellのインスタンスを生成(cell)して

```
if cell.accessoryView == nil {
    cell.accessoryView = UISwitch()
}
```
<img width="281" alt="スクリーンショット 2016-04-29 0.38.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/72532468-dbd5-49be-6b49-9f90e7f2e76a.png">


みたいな感じで設定できます。

if文でnilの場合のみにしているのは、TableViewをスクロールして
対象セルが一度見えなくなってから再度表示される際には
`cell.accessoryView = UISwitch()`は呼ばないでほしいので。

もちろんUISwitch以外も設定できます！！

#最後に
今回は、
・タップ時のイベント処理の実装
・accessoryTypeを指定してセルの右側にチェックマークとかつける
・accessoryViewにUISwitchとかを入れる
を記載しました。
次回は、
・スワイプで削除モードにする
・削除ボタンのテキストを編集する
について記載しようと思っています。
use-form_for-or-simple_form_for-methods-without-any-form-tag-in-rails

http://makandracards.com/makandra/808-use-form_for-without-the-enclosing-form-tag

http://solidfoundationwebdev.com/blog/posts/use-form_for-or-simple_form_for-methods-without-any-form-tag-in-rails

```html
<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="FxdGqJ/eCPczGrBXxSZ6ST+FcWsF1bKV4k1dvXrPY3E=" /></div>

  <div class="field">
    <label for="post_title">Title</label><br />
    <input id="post_title" name="post[title]" size="30" type="text" />
  </div>
  <div class="field">
    <label for="post_body">Body</label><br />
    <textarea cols="40" id="post_body" name="post[body]" rows="20"></textarea>
  </div>
  <div class="actions">
    <input name="commit" type="submit" value="Create Post" />
  </div>
</form>

  <div class="field">
    <label for="post_title">Title</label><br />
    <input id="post_title" name="post[title]" size="30" type="text" />
  </div>
  <div class="field">
    <label for="post_body">Body</label><br />
    <textarea cols="40" id="post_body" name="post[body]" rows="20"></textarea>
  </div>
  <div class="actions">
    <input name="commit" type="submit" value="Create Post" />
  </div>  
```

```html
<%= form_for(@post) do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

<%= fields_for(@post) do |f| %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>  
<% end %>
```
Goで全角英数字を半角にする


# 方法1: unicode.SpecialCase を定義して strings.ToLowerSpecial で半角にする

```go
package main

import (
	"fmt"
	"strings"
	"unicode"
)

var alphanumConv = unicode.SpecialCase{
	// numbers
	unicode.CaseRange{
		Lo: 0xff10, // '０'
		Hi: 0xff19, // '９'
		Delta: [unicode.MaxCase]rune{
			0,
			0x0030 - 0xff10, // '0' - '０'
			0,
		},
	},
	// uppercase letters
	unicode.CaseRange{
		Lo: 0xff21, // 'Ａ'
		Hi: 0xff3a, // 'Ｚ'
		Delta: [unicode.MaxCase]rune{
			0,
			0x0041 - 0xff21, // 'A' - 'Ａ'
			0,
		},
	},
	// lowercase letters
	unicode.CaseRange{
		Lo: 0xff41, // 'ａ'
		Hi: 0xff5a, // 'ｚ'
		Delta: [unicode.MaxCase]rune{
			0,
			0x0061 - 0xff41, // 'a' - 'ａ'
			0,
		},
	},
}

func main() {
	strs := []string{
		"０１２３４５６７８９",
		"ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ",
		"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ",
	}
	for _, s := range strs {
		s = strings.ToLowerSpecial(alphanumConv, s)
		fmt.Println(s)
	}
}
```


```text:出力
0123456789
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
```

# 方法2: normパッケージで正規化

```go
package main

import (
	"fmt"
	"golang.org/x/text/unicode/norm"
)

func main() {
	strs := []string{
		"０１２３４５６７８９",
		"ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ",
		"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ",
	}
	for _, s := range strs {
		s = string(norm.NFKC.Bytes([]byte(s)))
		fmt.Println(s)
	}
}
```


```text:出力
0123456789
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
```

normパッケージでの正規化では目的の全角英数字の半角への変換だけでなく、半角カナを全角にする（「ﾍﾟﾝｷﾞﾝ」->「ペンギン」）などの変換も行われるので用途に応じて方法を選択する

# 参考
- [Go言語で文字列の変換(全角・半角、ひらがな・カタカナ)をする : Serendip - Webデザイン・プログラミング](http://www.serendip.ws/archives/6307)
- [Go 言語と Unicode 正規化 — プログラミング言語 Go | text.Baldanders.info](http://text.baldanders.info/golang/unicode-normalization/)
4K モニタで PbP で Mac/Win/Linux の画面を集約して表示してクロスプラットフォームグラフィックアプリ開発の効率化を図る

漢なら Mac/Win/Linux のクロスプラットフォームグラフィックスアプリ開発ですよね!

しかし GPU を用いたグラフィックアプリ開発(OpenGL, Vulkan, OpenCL, etc)だと, リモートデスクトップや X11vnc で画面を飛ばすのは遅くて使いものにならないので, 基本ネイティブに画面を表示することになります. それゆえ, 3 つの 2K モニタで表示して開発という辛い日々が続いていました. また, 色味もモニタごとにことなるので, レンダリング画像の比較も難しい状況でした(毎回レンダリング画像を特定のモニタに転送して比較)

そんなとき, ふとしたことから, 最近の 4K モニタでは PbP(Picture by Picture)で 1 つのパネルに別々の画面(input source)を表示できるという噂を聞きつけましたので, PbP で画面を集約することで, クロスプラットフォームグラフィックスアプリ開発の効率化にチャレンジしてみました. また, 集約することで色味(カラープロファイル)を統一することもできると判断しました.

## 4K モニタを調達する.

最近は 4K モニタでも 10 万円を切っていて素晴らしいですね. ありがとうございます.
とりあえず IPS だと目に優しくてコーディング用に向いているらしいのと, 最新のもの(2016 年 4 月時点)ということで, フィリップスの 43 inch 4K モニタを調達しました.

http://kakaku.com/item/K0000867165/

## PbP 

Mac, Linux, Windows それぞれ 3 つのマシンがあって, それらから HDMI, DP or VGA でつなぎます.
(ちなみに, フィリップスのは, HDMI x 2, DP x 2, VGA x 1 があります)

フィリップスのは, PbP 2, 3, 4 分割をサポートしています. ただ, PbP 3 分割の場合は以下のような分割しかできないことがわかりました(左が一つ, 右が二つ).

```
+---+---+
|   |   |
|   |---+
|   |   |
+---+---+
```

右に Windows 画面を縦長で出したかったのと, Windows では 2K x 2K という画面解像度が検出できなかったので, PbP 4 分割にし, Windows では GPU からケーブル 2 本出して 2 画面構成にすることにしました.

```
+------+------+
| lin  | win1 |
+------+------+
| mac  | win2 |
+------+------+
```

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">40inch 4K monitor + Mac, Linux, Windows 2K screen PBP + synergy keybord/mouse share for the win! <a href="https://t.co/NuP4mn6p04">pic.twitter.com/NuP4mn6p04</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/725601329867984896">April 28, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


## Synergy

http://synergy-project.org/

すでに複数モニタ環境で Synergy でマウスとキーボードを共有していましたので, PbP 環境でもそのまま移行できました.

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">2K Linux/Mac/Windows PBP display in 40inch 4K monitor + synergy definitely hastes the graphics app development! <a href="https://t.co/HkLA9LU5KY">pic.twitter.com/HkLA9LU5KY</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/725662317120114688">April 28, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

これであたかも Mac/Win/Linux が一つのパネルに存在するかのように扱うことができます.

## まとめ

4K モニタで PbP + Synergy はすばらしい. 

## 問題点

やっぱり 43 inch は大きすぎました. 60 cm の奥行きの机に置いてみましたが, 見上げる形になってしまいます. 机の奥に別途土台をつくるか, 1m くらい奥行きのある机を調達するのがよさそうです.

## TODO

* 30 inch くらいの 4K モニタのほうが, 開発用にはちょうどよいかも?
dnsmesq

#dnsnesqとは
なんだか、/etc/hostsでdnsを構成するらしい

ubuntu 15=vividで/etc/resolv.confに
nameserver 127.0.1.1
なんてあるんでググルトどうも、そんな仕組みになっているらしい

このためなんだかよくわからんのだが
vmwereのvmnet8でapt-getがうまくいかないのだ。

#dnsを設定するとこ
1)ホスト側のvmnet8のプロパティで設定
2)vmwareのゲストであるubuntuのネットワークの設定
これはホスト側のvmnetに向けた（192.168.137.1)
3)上で設定しても/etc/resolv.confは
nameserver 127.0.1.1になる・・あれ？

そうか、/etc/hostsを見ればよかったのか？
ということは自分自身(192.168.137.2)の方がよかったのか？

うーん。わからんなあ、また明日調べよう
BeagleBone BlackにDebian Jessieをインストール

BeagleBone Blackを買ったのでDebian JessieをSDカードにインストールしました。

# 使ったもの
* BeagleBone Black Rev.C
* SDカード 4GB以上
* Mac OS X Yosemite 10.10.5
* [最新Debian 8.3 2016-01-24](http://beagleboard.org/latest-images)
* [Mac OS X用USBドライバ](http://beagleboard.org/getting-started)  
  Network, Serial用共にインストールしておく
* [The Unarchiver](https://itunes.apple.com/jp/app/the-unarchiver)  
  

# 手順
1. 最新Debianを任意の場所にダウンロードする  
   2016年4月27日ではbone-debian-8.3-lxqt-4gb-armhf-2016-01-24-4gb.img.xz
2. 上記でダウンロードしたファイルをThe Unarchiverで解凍する
3. SDカードを入れ無い状態でデバイスを確認する  

    ```shell-session
$ df -h
Filesystem      Size   Used  Avail Capacity  iused     ifree %iused  Mounted on
/dev/disk0s2    999G   364G   636G    37% 88814565 155166177   36%   /
devfs           194k   194k     0B   100%      654         0  100%   /dev
map -hosts        0B     0B     0B   100%        0         0  100%   /net
map auto_home     0B     0B     0B   100%        0         0  100%   /home
/dev/disk1      100M    69M    31M    69%      512         0  100%   /Volumes/BEAGLEBONE
```
4. SDカードを入れ、再度デバイスを確認する

    ```shell-session
$ df -h
Filesystem      Size   Used  Avail Capacity  iused     ifree %iused  Mounted on
/dev/disk0s2    999G   364G   636G    37% 88814565 155166177   36%   /
devfs           194k   194k     0B   100%      654         0  100%   /dev
map -hosts        0B     0B     0B   100%        0         0  100%   /net
map auto_home     0B     0B     0B   100%        0         0  100%   /home
/dev/disk1      100M    69M    31M    69%      512         0  100%   /Volumes/BEAGLEBONE
/dev/disk2s1    1.2G   1.1G    98M    92%        0         0  100%   /Volumes/RECOVERY
/dev/disk2s6     66M    20M    45M    32%      512         0  100%   /Volumes/boot
```
5. SDカードを入れて増えたデバイスをunmountする  
  上記の例では`/dev/disk2s1`と`/dev/disk2s1`をunmount

    ```
$ sudo diskutil unmount /dev/disk2s6
Volume boot on disk2s6 unmounted
$ sudo diskutil unmount /dev/disk2s1
Volume RECOVERY on disk2s1 unmounted
```
6. SDカードに書き込む  
  デバイスは`/dev/rdisk2`と最後２文字を取り、最初に`r`を付ける。

    ```
$ sudo dd bs=1m  if=./bone-debian-8.3-lxqt-4gb-armhf-2016-01-24-4gb.img of=/dev/rdisk2
3400+0 records in
3400+0 records out
3565158400 bytes transferred in 322.413927 secs (11057706 bytes/sec)
```
7. SDカードをMacから取り外し、電源を切ったBeagleBone Blackに刺す
8. Bootボタンを押しながらMacとUSBケーブルで繋ぐ
HDMI, マウス、キーボードを直接繋いでも良い
Bootボタンは[ここ](http://www.elinux.org/Beagleboard:BeagleBoneBlack#Revision_C_.28Production_Version.29)を参照し、LEDが4つとも点燈するまで押しっぱなし
9. 小一時間待つ
  内臓Flashに書き込んでいるらしい。
  何が起こっているのか見え無いのでHDMIを繋がなかったことに少し後悔、、、
10. sshでログインする

    ```
    $ ssh debian@192.168.7.2
    Debian GNU/Linux 8
    
    BeagleBoard.org Debian Image 2016-01-24

    Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

    default username:password is [debian:temppwd]

    debian@192.168.7.2's password: 
    debian@beaglebone:~$
```

# おしまい

この後は煮るなり焼くなりお好きなように！
Docker上のMySQL稼働情報をmuninで見る

適当にmuninのプラグインを入れれば `localhost` の MySQL を見てくれて、あんまり苦労しないが、 `docker run -d mysql` 的なことをやっている場合、ちょっと一手間かかるよな、と思ったのでやったことをメモ。

# 参考URL

- [Server Monitoring with Munin and Monit on Ubuntu 14.04 LTS](https://www.howtoforge.com/tutorial/server-monitoring-with-munin-and-monit-on-ubuntu-14-04/)
- [Muninの監視項目を設定してみる - yk5656 diary](http://d.hatena.ne.jp/yk5656/20140529/1402822603)
- [Rookie Tech Info: Mysqlの接続について【localhost】と【127.0.0.1】の違い](http://rookie-teck-info.blogspot.jp/2015/02/mysqllocalhost127001.html)

# 1. プラグイン、MySQL Client のインストール

```shell-session
ubuntu@mysql-docker:$ sudo apt-get install mysql-client munin-plugins-extra
ubuntu@mysql-docker:$ cd /etc/munin/plugins
ubuntu@mysql-docker:$ sudo ln -s /usr/share/munin/plugins/mysql_ mysql_
ubuntu@mysql-docker:$ sudo ln -s /usr/share/munin/plugins/mysql_bytes mysql_bytes
ubuntu@mysql-docker:$ sudo ln -s /usr/share/munin/plugins/mysql_queries mysql_queries
ubuntu@mysql-docker:$ sudo ln -s /usr/share/munin/plugins/mysql_slowqueries mysql_slowqueries
ubuntu@mysql-docker:$ sudo ln -s /usr/share/munin/plugins/mysql_threads mysql_threads
```

# 2. 接続ユーザーの作成

`mysql -h localhost` とやると、`.sock` を使った接続になってしまうのでちゃんと `127.0.0.1` を指定すること。

```shell-session
ubuntu@mysql-docker:$ mysql -u root -p -h 127.0.0.1 
```

接続にいくのは、Dockerコンテナの外からIP経由になるので、とりあえず接続元は `'%'` と `'localhost'` にしてあるが、適切なファイアウォール設定などで本当の外部から接続できないことを確認したほうがよい。

```mysql
mysql> CREATE DATABASE munin;
mysql> GRANT SELECT ON munin.* TO munin@'%' IDENTIFIED BY '<munin_no_password>';
mysql> GRANT SELECT ON munin.* TO munin@'localhost' IDENTIFIED BY '<munin_no_password>';
mysql> FLUSH PRIVILEGES;
```

# 3. munin-node の設定

設定ファイルを編集し、ユーザーや接続先を書き込む。

```shell-session
ubuntu@mysql-docker:$ sudo vim /etc/munin/plugin-conf.d/munin-node
```

編集するのは`[mysql*]`セクションのみ、既存のはコメントアウトしてしまっていいようだ。

```munin-node.conf
...(中略)...
[mysql*]
user root
env.mysqlopts -u munin --password=<munin_no_password> -h 127.0.0.1
# env.mysqlopts --defaults-file=/etc/mysql/debian.cnf
# env.mysqluser debian-sys-maint
# env.mysqlconnection DBI:mysql:mysql;mysql_read_default_file=/etc/mysql/debian.cnf
...(中略)...
```

# 4. 確認

それぞれ値が表示されれば成功。

```shell-session
ubuntu@mysql-docker:$ sudo /usr/sbin/munin-run mysql_queries
ubuntu@mysql-docker:$ sudo /usr/sbin/munin-run mysql_slowqueries
ubuntu@mysql-docker:$ sudo /usr/sbin/munin-run mysql_threads
ubuntu@mysql-docker:$ sudo /usr/sbin/munin-run mysql_bytes
```

# 5. 反映

`munin-node` を再起動させてやればよい。

```shell-session
ubuntu@mysql-docker:$ sudo /etc/init.d/munin-node stop
ubuntu@mysql-docker:$ sudo /etc/init.d/munin-node start
```

# 6. 結果確認

これで `munin` の画面にいろいろでてる「はず」。

![スクリーンショット 2016-04-28 23.50.22.png](https://qiita-image-store.s3.amazonaws.com/0/50220/e355c12d-fe61-150b-73e5-a76fef679bff.png)

# 反省

んん？？いま思えば、どうせデータのディレクトリをマウントして実行してるんだから、その `.sock` 指定してやればはやいんじゃ・・・。それはまた今度やってみよう。
python 3.x のコードをpython2.xに直す

#　背景
ずっとpython3を使っていたが、新しく入った開発で、python2で開発されていることしり、自分は3で書いてしまったが、最終的には、2に統一が必要となったので、調べた。

# 3to2をインストール

1. https://pypi.python.org/pypi/3to2 から、zipをダウンロードする
2. zipをあけ、`cd 3to2-x.x.x`
3. `python setup.py install`

# 3to2を試す
ターミナルで以下のコマンドを打つと、Optionを確認できる

```
3to2 --help
```

```
Usage: 3to2 [options] file|dir ...

Options:
  -h, --help            show this help message and exit
  -d, --doctests_only   Fix up doctests only
  -f FIX, --fix=FIX     Each FIX specifies a transformation; default: all
  -j PROCESSES, --processes=PROCESSES
                        Run 3to2 concurrently
  -x NOFIX, --nofix=NOFIX
                        Prevent a fixer from being run.
  -l, --list-fixes      List available transformations (fixes/fix_*.py)
  -v, --verbose         More verbose logging
  -w, --write           Write back modified files
  -n, --nobackups       Don't write backups for modified files.
  --no-diffs            Don't show diffs of the refactoring
```

とりあえず、（Branchを切って、）直接 `-w`を使って書き込むことにする。そうでないと、ただ、3から2に変更する部分だけが表示されて終わる。

```3to2 -w aaaa.py ```

を実行して、成功！

# その他

ただ、これだけではまだエラーが出る可能性がある。

##1. 文字コード関係

```
SyntaxError: Non-ASCII character '\xe6' in file aaaa.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
```
この場合は、URLないの支持に従い`# coding=<encoding name>`を一行目に書く。
Encoding nameの部分には、`utf-8`とか書けばいい

##2. 全てのStringの前に、`u`がついて、エラーの原因となる
```
TypeError: "delimiter" must be string, not unicode
```

例えば、pandasのdataframeを変換すると：


変換前(python3)
`df.to_csv('aaa.tsv', sep='\t')`

変換後(python2)
`df.to_csv(u'aaa.tsv', sep=u'\t')`

となり、`TypeError: "delimiter" must be string, not unicode`と言われるので、
sep='\t'の前の`u`を取り除く

##3. 同じく`to_csv`部分でなぞのエラーが出る
```
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
```
Python2では、csvで、unicodeに対応していないらしいので、

`encoding='utf-8'`を追加して、

```
df.to_csv('aaa.tsv', sep='\t', encoding='utf-8')
```

とすれば解決する

##4. cld2がインストールできなくなった

python 2.7.6にしてから、

`pip intall　cld2`が、失敗し、`No package 'libffi' found`というエラーが出る

macの場合は、
`brew install libffi`でインストールする。→成功

Ubuntuの場合はやってないので不確かですが、`apt-get install libffi` とか`libffi-dev`でいいのか。。？

##5. Unicode関係のなぞのエラー2

```
TypeError: initializer for ctype 'char *' must be a str or list or tuple, not unicode
```
上のcld2に渡しているものが、unicodeだったので、以下のように変更

変更前
```
reliable, _, lang = cld2.detect(name)
```

変更後
```
reliable, _, lang = cld2.detect(name.encode('utf-8'))
```


# エラーからの結論

Python2は、Unicodeで出るエラーがおおいので、気をつける！


# おまけ

##バージョン管理
Python2と3を両方使うことがある人は、`pyenv`というのを使って、Localでわけて使うことが便利だと考えられる。

###持ってるバージョンを確かめる
```
pyenv versions
```

###必要なバージョンはインストール
```
pyenv install 2.7.10
```

###ローカルで設定する
```
pyenv local 2.7.10
```

こうすると、.python-verionというファイルができて、中身にバージョンがかかれている。このファイルを削除すれば、globalのpython versionを利用できる。


## 3to2の実行Pythonバージョンに注意
インストールしたのが、python3だったので、pyenvでlocal version python2にしてしまった場所では、`3to2`のコマンドがないと言われる。なので、複数のファイルを変更するときは、python3で`3to2`を実行し変更してから、python2に切り替えるか、python3,2ともにインストールするかなど考える必要がある。
GitKraken 1.2 の新フィーチャー マージツールを試用する

![new_feature.png](https://qiita-image-store.s3.amazonaws.com/0/43480/1b372504-1a5a-4e36-e638-4a8b9c71074a.png)

GitKraken 1.2 の新フィーチャーとしてマージツールが追加されました。

こんな感じです。

## <i class="fa fa-flask" style="font-size:1em;"></i> 試行
テスト用のbranchを用意します

```bash
$ git branch
  gitkraken1-2test
* master
```

### <i class="fa fa-file-text" style="font-size:1em;"></i> hoge.txt
merge時にこんな感じの差分になっている状況でマージツールで編集してみます。

```
2hoge1
hige
<<<<<<< HEAD
fuga
hage
=======
2fuga
>>>>>>> gitkraken1-2test
```

![gitkraken_merge.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/e0d2d092-dc0c-4461-e200-207149918fb8.gif)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <a href="https://www.gitkraken.com/release-notes" target="_blank">GitKraken Release Notes</a> <i class="fa fa-external-link" style="font-size:1em;"></i>
Pacemaker のログの行き先

CentOS 7 のリポジトリからサクッとインストールできる下記で試しています。

- corosync-2.3.4-7.el7_2.1
- pacemaker-1.1.13-10.el7_2.2
- resource-agents-3.9.5-54.el7_2.9

pacemaker のログ設定は `/etc/sysconfig/pacemaker` で環境変数を設定します。
以下のようなものが設定できます（ファイルに書かれていたコメンドをざっくり意訳＋動かして気づいたこと）。

## PCMK_debug

```sh
PCMK_debug=yes|no|crmd|pengine|cib|stonith-ng|attrd|pacemakerd
```

グローバルに、または、サブシステムごとにデバッグログを有効にします。
複数のサブシステムはカンマで区切って指定できます。

eg.) `PCMK_debug=crmd,pengine`

この設定は `PCMK_logfile` によるファイルへの出力にデバッグログも含めるかどうかであって、syslog への送信には影響しませんでした（syslog はこの環境変数の値に依らず `PCMK_logpriority` で決まる）。

## PCMK_logfile

```sh
PCMK_logfile=/var/log/pacemaker.log
```

指定されたファイルに INFO 以上のメッセージを送ります。
デフォルトでは corosync.conf で指定したログファイルを継承します。

corosync.conf でログファイルへの出力が無効ならデフォルトは `/var/log/pacemaker.log` のようです。

下記のように設定すればログファイルへの書き込みを行わないようにすることができました。

```
PCMK_logfile=none
```

## PCMK_logfacility

```sh
PCMK_logfacility=none|daemon|user|local0|local1|local2|local3|local4|local5|local6|local7
```

syslog のファシリティを指定します。
`none` を指定すると無効になります（非奨励）。
デフォルトは `daemon` です。

デフォルトは `daemon` らしいんですけど、、、未設定だと起動時に下記のメッセージが送られた後、syslog への送信は行われませんでした。

```
notice: Additional logging available in /var/log/pacemaker.log
```

## PCMK_logpriority

```
PCMK_logpriority=emerg|alert|crit|error|warning|notice|info|debug
```

指定したプライオリティ以上のログが syslog に送られます。
`info` だとものすごい冗長になります。`debug` だともっとひどいことになります。
デフォルトは `notice` です。

## PCMK_trace_XXX

他にも `PCMK_trace_XXX` みたいな環境変数がたくさんありましたが、ソースファイルの名前や関数名をログに追加するもののようなので、通常は使わないだろうと思います。
いつも忘れるherokuコマンド

自分用メモです


# デプロイ

gitのリモート設定

```
heroku git:remote -a アプリ名 #既にあるリポジトリに設定する場合
git clone git@heroku.com:APPNAME.git #herokuからcloneする場合
```


# Gem


Gem設定

```
group :production do
  gem 'pg', '0.15.1'
  gem 'rails_12factor', '0.0.2'
end

group :development do
  #sqliteをdevelopmentに移動しておく
  gem 'sqlite3' 
end
```

# DB

migration

```
heroku run rake db:migrate
```

Seedデータを入れる

```
heroku run rake db:seed
```

データベースのリセット

```
heroku pg:reset DATABASE
```

#情報

herokuで管理しているアプリ一覧を見る

```
heroku apps
```

アプリの詳細を見る

```
heroku info --app ○○○←上記で出てきたアプリ名を入れる
```

# 環境変数

ステージング環境の環境変数を登録する

```
heroku config:set RAILS_ENV=staging --app アプリ名
```

環境変数の確認

```
heroku config
heroku config:get 環境変数名 #環境変数名を指定して確認したい時
```

環境変数の削除

```
heroku config:unset 環境変数名
```

# ログ

リアルタイムでログを見る

```
heroku logs --tail
```

# メンテナンス

メンテナンス画面に切り替える

```
 heroku maintenance:on --app アプリ名
 heroku maintenance:off --app アプリ名
```


# Basic認証
**Railsの場合**

```
#application_controller.rbに書く(ステージング環境の場合)

http_basic_authenticate_with :name => ENV['BASIC_AUTH_USERNAME'], :password => ENV['BASIC_AUTH_PASSWORD'] if Rails.env == "staging"

#環境変数の設定
heroku config:set BASIC_AUTH_USERNAME="admin" BASIC_AUTH_PASSWORD="password"
```
Stateモナド @Swift


[@kazu_yamamoto](https://twitter.com/kazu_yamamoto)さんの[Stateモナド解説記事](http://d.hatena.ne.jp/kazu-yamamoto/20080604/1212573964)をSwiftで書くとこんな感じというメモ。


```Swift
indirect enum List<A> {
	case Nil
	case Cons(A, List<A>)
}

typealias Counter = Int

struct State<S, A> {
	let runState: S -> (A, S)
	
	static func pure(x: A) -> State {
		return State(runState: { (x, $0) })
	}
	
	func bind<B>(g: A -> State<S, B>) -> State<S, B> {
		return State<S, B>(runState: {
			let (a, s) = self.runState($0)
			let s2 = g(a)
			return s2.runState(s)
		})
	}
}

infix operator >>- {
	associativity left
	precedence 100
}

func >>- <S, A, B>(f: State<S, A>, g: A -> State<S, B>) -> State<S, B> {
	return f.bind(g)
}

func cons0<A>(x: A) -> List<A> -> State<Counter, List<A>> {
	return { xs in
		return State(runState: { (.Cons(x, xs), $0 + 1) })
	}
}

func run<A>(state: State<Counter, A>) -> Counter -> (A, Counter) {
	return { state.runState($0) }
}

let incr1: State<Int, Int> = State(runState: { (999, $0 + 1) })
func cons1<A>(x: A) -> List<A> -> State<Counter, List<A>> {
	return { xs in
		return incr1 >>- { _ in .pure(.Cons(x, xs)) }
	}
}

let incr2: State<Counter, Counter> = State(runState: { ($0, $0 + 1) })
func cons2<A>(x: A) -> List<(Counter, A)> -> State<Counter, List<(Counter, A)>> {
	return { xs in
		return incr2 >>- { .pure( .Cons(($0, x), xs) ) }
	}
}

func get() -> State<Counter, Counter> {
	return State(runState: { ($0, $0) })
}

func put(x: Counter) -> State<Counter, Counter> {
	return State(runState: { ($0, x) })
}

func cons3<A>(x: A) -> List<(Counter, A)> -> State<Counter, List<(Counter, A)>> {
	return { xs in
		return get()
			>>- { put($0 + 1) }
			>>- { .pure(.Cons(($0, x), xs)) }
	}
}

run(cons3("a")(.Nil) >>- cons3("b") >>- cons3("c"))(0)

```


何かに使えないものだろうか。おとなしく変数に入れろって話かもしれませんが。。。
Deep Learning を徹底的に勉強してみる [DW 0日目]

# Deep Learningを勉強しまくるという企画
この記事は2016年4月28日に書かれている。つまり明日からゴールデンウィークが始まる。飛び石連休と有給を合わせれば10日間の大型連休ということになる。絶好の勉強の機会というわけだ。私はこの10日間で、Deep Learning系の技術を徹底的に勉強していこうと思う。この10日間をDeep Weeks (DW)と名付け、DL関連の記事を1日1記事書いていくことにする。このページでは、それらの記事へのリンクと目次を掲載していく。

# 環境
なお、DWでは一貫して以下の環境で作業する。Chainerを使うので、他のフレームワーク使いの方には悪しからず。

- OSX 10.11.4 (El Capitan)
- NVIDIA GeForce GT 750M
- メモリ 16GB
- python 2.7.11 (with pyenv)
- Xcode 7.2
- CUDA 7.5.20
- cudnn 7.0
- chainer 1.8.0
- Cython 0.24
- gensim 0.12.4
- numpy 1.11.0
- pip 8.1.1
- scikit-learn 0.17.1
- scipy 0.17.0

# もくじ
- [RNN + LSTMで自動作曲してみた [DW 1日目]](http://qiita.com/komakomako/items/9ba38fc38f098c0e8b9b)
- [Recursive Auto Encoderで単語を合成してみた [DW 2日目]](http://qiita.com/komakomako/items/4b76a83656599355e88b)
- [【深層学習】畳み込みニューラルネットの各関数の使い方を調査 [DW 3日目]
](http://qiita.com/komakomako/items/365bae67a440d96855c5)
- [【深層学習】畳み込みニューラルネットで画像分類 [DW 4日目]
](http://qiita.com/komakomako/items/a6fa14bc6a2bdaaab5c7)
- [【深層学習】再帰ニューラルネットワークに関する良ページまとめ [DW 5日目]
](http://qiita.com/komakomako/items/0d138e885bc8ba79c1cd)
- [深層学習で自動作曲（Stacked LSTM編） [DW 6日目]
](http://qiita.com/komakomako/items/de5077efa344a8689fa0)
GoでGracefulにShellスクリプト実行できるツールを作った

## これなんだ
インフラやるならGo書けると色々嬉しいことあるよと聞くので挑戦してみました。
今回作った理由は、AWSでサーバ台数減らす時にAutoScalingだと、いきなりシャットダウンされるので
td-agentとかに残ってるバッファが飛んでしまうのを対応したかったため作りました。

ツール名は `exodia` です
https://github.com/a4t/exodia

## 何故Goなのか？
Rubyとかでこういったツールを書いてたこともあるのですが、Rubyのバージョンであったりgemのバージョンとかで動かなくなることがあります。
その辺りの管理が全く必要なく、バイナリ一つで動くGoは非常に使いやすいです。

## exodiaの使い方
yamlもそれほど項目ないのと、先ほどの説明とサンプルのyaml見れば大体どんなことができるかわかると思います。

```
wait: 30      # check の項目に移動するまでの待機時間
interval: 5   # check で失敗した場合のリトライまでの待機
checkretry: 5 # check で失敗した場合のリトライ回数
scripts:
  pre:
    - service nginx stop
    - service td-agent stop
  check:
    - ps aux | grep [t]d-agent && exit 1 || exit 0
    - ps aux | grep [n]ginx && exit 1 || exit 0
  post:
    - shutdown -h now
```

*pre* で 事前に何か実行して
*check* で *pre* で実行したことが失敗することなく実行されているか確認し
*post* で本当にやりたかったことを実行する

といった感じになっています。

## 使い道
結構色々な用途に使えるようになっているかと思っています。
よくあるパターンはプロセスをチェックして、ちゃんと終了してからpostを実行するというパターンだと思います。

今回はサーバの停止なので実際のフローは以下のような形になると思います。

```
何らかの方法でサーバの台数を減らすという状態を取得
↓
何らかの方法で停止するサーバへ通知
↓
exodiaを実行
```

## 最後に
webhook受け付けるようにしたらもっと便利になったりするんだろうかと思いつつも、機能をシンプルにしたいという思いがあり付けてません。
Goの作法全然把握してないのでプルリクお待ちしてます！

https://github.com/a4t/exodia
Kotlinにおける型T!について

Kotlinでは[Null Safety](https://kotlinlang.org/docs/reference/null-safety.html)にあるように、NullableとNon-Nullが定義できる。

```kotlin
var nullable: String?
var nonNull: String
```

これはコンパイル時にNullチェックができ、NPEを未然に防げる。

```kotlin
nullable.length // コンパイルエラー
nonNull = null // コンパイルエラー
```

これだけではなく[Null-Safety and Platform Types](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types)にあるように、両方の状態を併せ持つ定義もある。

以下のようなJavaクラス定義があったとする。

```java:JavaObject.java
public class JavaObject {
  public String string;
  @Nullable public String nullableString;
}
```

Javaコードから返却される型は`T!`の様に表現され、`T`または`T?`の意味になる。

```kotlin
val javaObject = JavaObject()
var either = javaObject.string
```

両方の状態を持てるため、アクセスしてもコンパイルエラーとはならないが、NPEが発生する可能性はある。

```kotlin
either.length // NPEが発生するかもしれない
```

`null`を代入することも可能だが、`null`を代入した直後は`T?`になるため、アクセスするとエラーとなる。

```kotlin
either = null
either.length // コンパイルエラー
```

明示的に`T!`を定義することはできない。
そのため、Javaのメソッドをオーバーライドするときは、引数を明示しなくてはならない。

```kotlin
var either: String! // 不可能
override fun onCreate(savedInstanceState: Bundle?) {}
override fun onSaveInstanceState(outState: Bundle) {}
```

Javaのメソッドをオーバーライドしたときの引数は、指定を間違えるとNPEが発生する可能性がある。

```kotlin
override fun getView(position: Int, convertView: View, parent: ViewGroup) {
  // throws NPE (convertView is null)
}
```

（メジャーな）`@NonNull`や`@Nullable`アノテーションはコンパイル時にチェックしてくれる。

```kotlin
javaObject.nullableString.length // コンパイルエラー
```

まとめ
---
* Kotlinは基本的にNull Safetyだが、Javaが絡むとそうとはいえない。
* Java側は積極的にアノテーションを付けるようにする。
* [Calling Java code from Kotlin](https://kotlinlang.org/docs/reference/java-interop.html)をよく読む。
Docker コマンドメモ


```
#イメージ一覧 利用できるイメージ
docker images

httpd2              latest              sha256:32586        2 days ago          1.1 GB
httpd               latest              sha256:fc87c        2 days ago          528.9 MB
centos              httpd               sha256:7c643        2 days ago          497.4 MB
docker              latest              sha256:3c926        13 days ago         75.72 MB
centos              latest              sha256:778a5        3 weeks ago         196.7 MB
hasedon/centos6.5   latest              sha256:46a60        22 months ago       407.2 MB
```


```
#起動
docker run -itd --name [名前] -v $(pwd)/html:/var/www/html -p 80:80 [イメージ] /bin/bash


run オプション
-v [ホストpath]:[コンテナpath]：シェアするフォルダを指定
-p [ホストport]:[コンテナport]:ポートを指定
--name: 名前指定
-d：バックグラウンド実行
-i：コンテナの標準入力
-t：tty
--link: [接続コンテナ名]：[エイリアス名] 別コンテナで起動しているmysqlに接続するなど
```

```
#下記オプションを付けてリンクしてrunした場合の環境変数
#ipアドレスがわかる
--link mysql:orenoSQL 

/ # env
env
ORENOSQL_ENV_MYSQL_ROOT_PASSWORD=root
ORENOSQL_ENV_GOSU_VERSION=1.7
no_proxy=*.local, 169.254/16
ORENOSQL_PORT_3306_TCP_PORT=3306
ORENOSQL_PORT_3306_TCP_PROTO=tcp
HOSTNAME=d07119670434
SHLVL=1
HOME=/root
composer_hash=e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae
ORENOSQL_ENV_no_proxy=*.local, 169.254/16
ORENOSQL_PORT=tcp://172.17.0.2:3306
ORENOSQL_ENV_MYSQL_VERSION=5.6.32-1debian8
ORENOSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
ORENOSQL_NAME=/test_container/orenoSQL
fpm_conf=/etc/php5/php-fpm.conf
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
php_conf=/etc/php5/php.ini
PWD=/
ORENOSQL_ENV_MYSQL_MAJOR=5.6
ORENOSQL_PORT_3306_TCP_ADDR=172.17.0.2
```


```
#プロセス コンテナ一覧 オプション無しで今動いているコンテナのみ
docker ps -a
```

```
#コマンドを実行する
docker exec [コンテナ名] [コマンド]

#dockerコンテナ内を操作する
docker exec -it [コンテナ名] /bin/bash
```


```
#名前で接続
docker attach def

#抜ける場合 ctrl+p, ctrl+q。
#exitするとコンテナ終了
```


```
#コンテナ操作

# 削除
docker rm [コンテナ名]

# スタート
docker start [コンテナ名]

# ストップ
docker stop [コンテナ名]

# ホスト間でのファイルコピー
# ホストからコンテナ内へ
docker cp <ローカルファイルパス> <コンテナID>:<コンテナファイルパス>

# コンテナからホストへ
docker cp <コンテナID>:<コンテナファイルパス> <ローカルファイルパス>

```


```
#イメージ操作
#defaultというコンテナをwebという名前のイメージとして保存
docker commit default web

#メッセージ付き
docker commit -m "コミットメッセージ" default web

#ログ
docker history [コンテナ名]

＃タグ付き
docker commit default centos:web

#イメージの削除
docker rmi [image id]
```


```
#メインのIP確認
docker-machine ip default

192.168.99.100

#イメージのポート確認
docker port sample3

80/tcp -> 0.0.0.0:10080
```

```
#docker hubにプッシュ
docker login
docker push [アカウント名]/test
```
IE11が起動しない(セキュリティソフトのせい!?)

#IE11がまったく起動しない。
program files配下のexeを直接叩いても、セーフモード起動でも立ち上がらないWin7機が搬送されてきました。
>HP pavillion p6-2220jp
>Windows7 Home 64bit

コントロールパネルから「インターネットのプロパティ」は開くので、設定の初期化や、アドオンの停止・削除をしてみたがダメだった。

ふと**IBM Security Trusteer Rapport**というセキュリティソフトが入っているのに気づく

※IBM Security Trusteer Rapportとは
[http://www-03.ibm.com/software/products/ja/trusteer-rapport](http://www-03.ibm.com/software/products/ja/trusteer-rapport)
銀行がネットバンキングの際にPCにインストールを推奨するIBM社製のネットバンクに特化したエンドポイント保護ソフト。

停止して、IEをクリックするとすんなり起動する・・・。
こいつかっ！！
と言う事でアンインストール。
Amazon Prime Musicのコーデック／ビットレート

Web版ではMPEG2-TSに入ったAACで、
* 低=HE-AAC 130k
* 中=HE-AAC 149k
* 高=LC-AAC 342k
と推測されます。
曲によって違うかもしれないのでABR/CVBRかもしれません。

※最近見ると MPEG-DASH に入った HE-AAC でした。

ソース
* https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html
> AAC-LC "mp4a.40.2"
> HE-AAC "mp4a.40.5"

![amazonlow.PNG](https://qiita-image-store.s3.amazonaws.com/0/19148/9ec58f36-931e-d1f7-0af0-5ad0e09ae06c.png)
![amazonmed.PNG](https://qiita-image-store.s3.amazonaws.com/0/19148/f5d42846-99c3-fe3c-03e7-630907b4bb34.png)
![amazonhigh.PNG](https://qiita-image-store.s3.amazonaws.com/0/19148/ddad6b40-311e-8101-b450-55c69a2a3573.png)

# おまけ
まだ聴いていますか？みたいなのが出た時に自動で押してくれるスクリプト。

```js
amazon_intv = setInterval(function(){
//document.querySelector("#inactivityView > .infoContainer > button");
document.querySelector("#inactivityView").querySelector(".button").click()
},60000);
```
iOSの申請に必要な全サイズのアイコンを作成する


```

sips -z 29 29 icon_1024.png -o icon_29.png
sips -z 58 58 icon_1024.png -o icon_29_2x.png
sips -z 87 87 icon_1024.png -o icon_29_3x.png
sips -z 40 40 icon_1024.png -o icon_40.png
sips -z 80 80 icon_1024.png -o icon_40_2x.png
sips -z 120 120 icon_1024.png -o icon_120.png
sips -z 180 180 icon_1024.png -o icon_60_3x.png
sips -z 76 76 icon_1024.png -o icon_76.png
sips -z 152 152 icon_1024.png -o icon_76_2x.png
sips -z 167 167 icon_1024.png -o icon_167.png

```
YAGNI は何の略？

YAGNI 原則というのは，おおむね「本当に必要かどうか分からないようなものをあれこれ考えすぎて設計・実装したりするのはやめたほうがいい」というようなものだと思う。

で，YAGNI が何の略か調べると，以下の二とおりが出てくる。

* You Ain’t Gonna Need It.
* You Aren’t Gonna Need It.

どっちが正しいのだろう？

# ain’t って何だ?

「aren’t」が「are not」の短縮形なのは知ってる。

じゃ「ain’t」って何？

英和辞典によると，「ain’t」は「エイント」と読み，「am not」の短縮形に由来するそうだ。

アムノットぉ？　えっ，じゃあ「You」に続くことはあり得ないわけ？

おっと，辞典をよく見たら，説明があった。由来はそうでも，「am not」のほかに，「are not」「is not」「have not」「has not」「do not」などなどの短縮形としても使われるのだそうだ。

いずれにしても，普通の表現ではないらしい（口語的？）。

というわけで，YAGNI が何の略かという点では「ain’t」でも「aren’t」でも，どっちでもいいようだ。

言い出した人がどっちで言ったか，までは調べる元気がなかった。

# gonna って何だ？

「gonna」もよく知らんので，英和辞典を引いてみる。

「going to」を米国の口語で [ɡɔ́ːnə] とか [ɡənə] のように発音するらしい。その発音から作られた綴りが「gonna」。

「ゴンナ」じゃないんだね。英語には [nn] とか [mm] のような音は無いらしい。

# 文全体の意味は？

「You Ain’t Gonna Need It.」はとても口語的な表現のようだ。

これを学校的な英語に機械的に置き換えると

> You are not going to need it.

になるのかな。

ええと，英語ダメ生の知識では，「be going to (do)」は「～しつつある」だったような気がするんだけど，それだと意味が通じない気がする。

そこで英和辞典。えーと，「going」で引くのか「be」で引くのかと思ったら，「go」で引かないといけなかった。

「go」で引くとすさまじい量の説明が書いてあって，途方に暮れていたら，ふと「be going to do」という子見出しが見つかった。

それによると，確かに，人が何かをしようとしている意味（主語である人の意志や予定など）も書いてあったけど，それ以外に二つの意味が書いてあった。

そのうちの一つが，「～になる（であろう）」。ええと，これは近い未来についての**話者の推量**なのかな。

おお，これなら意味がつながる。要するに話者は近い未来について，「You need it.」（あなたはそれを必要としている）を否定する予測を立てているわけだ。

だから，「あなたはそれを必要としないでしょう（必要になったりはしないでしょう）」ってことか。

口語的に訳すと「それ要らなくね?」。

これでようやく意味が分かった。ふう。

英語は苦手なのでマサカリ歓迎。

# あぐに？

どうでもいいけど，「ヤグニ」って耳で聞くと，どうしてもインドの火の神「アグニ（Agni，अग्नि）」を連想してしまう。

火の神アグニはインドの弾道ミサイルの名前にもなっているので，YAGNI と聞いただけで，何か烈しい原理のような気がする。

さらにどうでもいいけど，英語で「点火する」の意味の ignite はラテン語の「ignis」（火）から来ていて，これはインドのアグニと同源なのだそうだ。

# 2016年4月29日追記

当初，「You Ain’t Gonna *to* Need It.」のように誤って余計な「to」を入れてしまっていたので直しました。テキトーなサイトからコピペしたのが失敗のもと。
EC2インスタンスのbashプロンプトに便利情報を表示する

EC2インスタンスにssh接続して作業する際、デフォルトだとこんな感じで、

```shell-session
[ec2-user@ip-10-10-11-123 ~]$ sl
```

どのインスタンスにログインしているか分かりづらいですよね。でもhostnameを変えるのは色々副作用もあるし、なんだか微妙です。

そこで！

```shell-session:set_prompt.sh
instance_id=$(curl -s 169.254.169.254/latest/meta-data/instance-id)
az=$(curl -s 169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az%?}
tagged_name=$(aws ec2 describe-instances --region $region --instance-ids $instance_id --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value]' --output text)

if [ $? -eq 0 ]; then
  export PS1="[\u@\h (\[\e[1m\]$instance_id\[\e[m\], \[\e[1m\]$tagged_name\[\e[m\]) \W]\$ "
else
  export PS1="[\u@\h (\[\e[1m\]$instance_id\[\e[m\]) \W]\$ "
fi
```

こんなスクリプトを `/etc/profile.d/` 以下に置くなり、 `~/.bashrc` に追記するなりしてみましょう。

```shell-session
[ec2-user@ip-10-10-11-123 (i-1234567890abcdef1, oreno_instance) ~]$ sl
```

インスタンスのIDと、`Name` タグに設定している値が表示されました。これなら分かりやすいですね！

# 余談

`sl` はAmazon Linuxの標準リポジトリにもあります。必ずインストールしましょう。

```shell-session
[ec2-user@ip-10-10-11-123 (i-1234567890abcdef1, oreno_instance) ~]$ sudo yum install sl
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                                                         | 2.1 kB     00:00
amzn-updates/latest                                                                                                                      | 2.3 kB     00:00
amzn-updates/latest/updateinfo                                                                                                           | 307 kB     00:00
amzn-updates/latest/primary_db                                                                                                           | 375 kB     00:00
8 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package sl.x86_64 0:5.02-1.6.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================================================
 Package                         Arch                                Version                                       Repository                              Size
================================================================================================================================================================
Installing:
 sl                              x86_64                              5.02-1.6.amzn1                                amzn-main                               13 k

Transaction Summary
================================================================================================================================================================
Install  1 Package

Total download size: 13 k
Installed size: 15 k
Is this ok [y/d/N]:
```
[OSS調査] 使える！フォームやLPを構築するためのOSSライブラリ調査まとめ

どうも開発室所属の @mk2 です。フォームやLP(ランディングページ) をブラウザ画面上で構築するような仕組みを作ろうとした時に、色々と調査した結果をまとめます。

# フォームエディターOSSライブラリと、LP(ランディングページ)構築用OSSライブラリの調査結果まとめ

## フォームエディター
フォームエディターは結構種類があります。WYSIWYGでフォームを作る需要が結構あるのだろうなーと思います。サンプルサイトがあるものは、記載してあります。

### https://github.com/minikomi/Bootstrap-Form-Builder
- WYSIWYG
- DnDでできるので良さそう
- http://minikomi.github.io/Bootstrap-Form-Builder/

### https://github.com/christianalfoni/formsy-react
- コード書く系
- react系、コード書かないとだめ

### https://github.com/shlomnissan/formbuilder
- WYSIWYG系
- 動作が違和感、こなれていない感あり
- http://www.1bytebeta.com/projects/formbuilder/

### https://github.com/shalotelli/form_builder
- WYSIWYG系
- 使いやすそう、ただレイアウト周り弱い
- http://shalotelli.github.io/form_builder/

### https://github.com/formly-js/formly-builder
- WYSIWYG系
- Angularと組み合わせて使うもの、完成度高そう
- http://www.spengineeringltd.com/Pages/FormBuilder.aspx#/FormDesign

### https://github.com/tonytan4ever/Bootstrap-Form-Builder-V3
- WYSIWYG系
- minikomiベース、Bootstrap V3に対応させたもの
- http://formbuilder.tdjangoy.webfactional.com/

### https://github.com/vlio20/angular-material-form-builder
- WYSIWYG系
- angularベース、かつmaterialデザイン適用可能
- http://vlio20.github.io/angular-material-form-builder/

### https://github.com/NaturalSolutions/NS.UI.FormBuilder
- WYSIWYG系
- backbone用のフォームを出力できる？
- エラー多発するのですぐには使え無さそう
- http://naturalsolutions.github.io/NS.UI.FormBuilder/

### https://github.com/aiop/Bootstrap3-form-builder
- WYSIWYG系
- 相変わらずのbootstrap用、機能的に似てる部分あり？（他のBootstrap用とくらべて）
- http://minikomi.github.io/Bootstrap-Form-Builder/

### https://github.com/knipknap/SpiffForm
- WYSIWYG系
- ものすごいシンプル

### https://github.com/cihad/formbuilder
- WYSIWYG系
- すごい、アニメーションもあるし、デザインも崩れ無さそう
- http://cihad.github.io/formbuilder/

### https://github.com/json-schema-form/json-schema-builder
- WYSIWYGっぽい
- 完成度高い
- DnDでさくさくではないものの、現実的に使いやすいもの
- http://ralphowino.github.io/schema-form-builder/#/builder

### https://github.com/Webanywhere/form-builder
- WYSIWYG系
- 完成度は高くないものの、グリッドレイアウトとWYSIWYGが高いレベルで融合していて使いやすい
- その分前提知識も必要になる
- http://webanywhere.github.io/form-builder/

**結論**

- https://github.com/minikomi/Bootstrap-Form-Builder が安定感ある
- https://github.com/tonytan4ever/Bootstrap-Form-Builder-V3 がBootstrapV3対応したもの
- https://github.com/shalotelli/form_builder が次点か

## LP構築
LP構築用のライブラリはかなり数が少ないです。というかプロダクトに使えそうなものはないです。サンプルサイトがあるものは、記載してあります。

### https://github.com/ziggi/builder
- WYSIWYG
- すごいけど、ロシア語…
- http://ziggi.org/builder/

### https://github.com/ziggi/loppy
- WYSIWYG
- 未完成、しかし思いは伝わってくる(ボタンを色々移動できることとか)
- http://loppy.ziggi.org/

### https://github.com/philipnewcomer/page-builder-ui
- `this code should not be considered production-ready`とあるのでプロダクションで使うのはやめたほうが良い

### https://github.com/OllieTerrance/BootPolish
- WYSIWYGっぽい
- キーボード操作可能
- よくできてる
- http://sandbox.t.allofti.me/boot-polish/

**結論**

- LP構築を行うという場面が普通はほぼないので、あまり種類がない
- 本気でやるなら自分で構築すべき(LP自体はシンプルなので、そこまで難しくない…はず)
rails runnerの実行で詰まる

バッチを実行(DBを変更するメソッドを実行)しようとした際に、エラーがでたので整理しておく。

具体的には、Batchクラスのupdate_master!メソッドを引数"mmm"を与えて実行する。
以下で正しく実行できた
~/xxxxxx@bundle exec rails r 'Batch.update_master!("mmm")'

つまずいた箇所とそこからの修正ポイントは以下です

・bundle exec rails -r 'Batch.update_master!("mmm")'
rails -r の部分がおかしい。rails rはrails runningを略したもので、オプション設定ではない。。

・bundle exec rails -r Batch.update_master!("mmm")
上記だと、エラー「-bash: !: event not found」がでる。
理由は、!がシェルの特殊文字でヒストリ置換の機能を持っているので、解釈が間違ってしまいます。
なので、''で囲むことでその効果を無効にしました。
yumのセキュリティアップデートコマンドはCentOSでは効果がない

yum経由でセキュリティアップデートをしようと`yum-plugin-security`をインストールし、
`yum --security upgrade-minimal`を実行しました。
しかし、セキュリティパッチが存在するにも関わらず、
何度実行しても`No Packages marked for minimal Update`というメッセージしか出ません。

これはCentOSのリポジトリにセキュリティ情報が存在しないためです。
RHELやAmazon Linuxでは問題なく利用できるようです。

どうしてもCentOSでセキュリティアップデートしたい場合は、
https://github.com/vmfarms/generate_updateinfo
を利用しましょう。
CentOS用にセキュリティ情報を更新しているサイトからデータを取ってくることで、
セキュリティアップデートが可能になります。

## 関連記事

* [opensslのversion確認はCentOS系ではコツが必要 - Qiita](http://qiita.com/yoshi-taka/items/512cdc64d6a4b03b8c1b)
bower-rails 導入メモ



Gemfile

```Gemfile
gem "bower-rails"
```

Install 

```sh
bundle install
```

Create Bowerfile

```sh
rails g bower:initialize
```

Bowerfile と bower_rails.rb が作成される

```sh
      create  Bowerfile
      create  config/initializers/bower_rails.rb
```


Bowerfile に使いたいライブラリを記述

```Bowerfile
asset 'bootstrap'
asset 'fontawesome'
```

Install 

```sh
rake bower:install
```

```vendor/assets/bower_components``` 配下にライブラリが配置される

js,css に記載

```application.js
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require turbolinks
//= require_tree .
```

```application.css
/*
 *= require fontawesome
 *= require_tree .
 *= require_self
 */
```
OpenSSHで特定のディレクトリにのみアクセス出来るSFTPユーザーを作成する


通常、OpenSSHの設定がされていれば、ssh/scpと同様にsftpが利用可能となります。
しかし、この状態だと`cd`コマンドでどこへでも移動可能なので、外部の人にデータ授受の目的でユーザーアカウントを提供するのに適していません。

そのような場合、特定のユーザーアカウントにはssh/scpを禁止するとともに、sftpでホームディレクトリ以外への移動を抑制する事ができるChroot機能を使います。

ここでは、その設定について記載します。

# OpenSSHの設定

まずはOpenSSHの設定を編集し、特定のユーザーをChroot機能の対象となるようにします。
以下の例では、ワイルドカードを利用して`sftp-`で始まるユーザーは、Chroot機能の対象となるように設定しています。

```
su - 
cp /etc/ssh/sshd_config{,.YYYYMMDD}
vi /etc/ssh/sshd_config
diff /etc/ssh/sshd_config{,.YYYYMMDD}
```

```text:/etc/ssh/sshd_configの変更内容
133,134c133
< #Subsystem	sftp	/usr/libexec/openssh/sftp-server
< Subsystem sftp internal-sftp
---
> Subsystem	sftp	/usr/libexec/openssh/sftp-server
143,146d141
< 
< Match User sftp-*                 # `sftp-`で始まるユーザーはChroot機能対象
<   ChrootDirectory ~               # ホームディレクトリ(`~`)以外は利用不可
<   ForceCommand internal-sftp
```

# 対象となるユーザー作成

実際に対象となる`sftp-`で始まるユーザーを作成してみます。

```
useradd sftp-user00001
passwd sftp-user00001
```

Chroot機能を使う場合、ホームディレクトリの所有者を`root`にする必要があります。
以下の設定では、アクセスは`/home/sftp-user00001`以下、書き込みは`~/upload`以下のみにしています。

```
chown -R root:root /home/sftp-user00001
chmod 755 /home/sftp-user00001                                  # 755にしないと`ls`とか出来ない
mkdir /home/sftp-user00001/upload
chown -R sftp-user00001:sftp-user00001 /home/sftp-user00001/upload  # 書き込めるように
```


# 動作確認

以下の動作確認は別サーバから行った。
(対象サーバ: `target-server` / ポート: `10220`)

```text:接続できること
sftp -oPort=10220 sftp-user00001@target-server

sftp> 
```

```text:各種コマンドが実行できること
sftp> cd upload
sftp> ls
 upload

sftp> put test.txt
test.txt
```

```text:他のディレクトリに移動できない事
sftp> cd /var
Couldn't canonicalise: No such file or directory
```
【rails】初期データにseed_fuで画像を入れたいときの解決法

seed_fu実行時に画像を入れたいときってありますよね
そんなときにはこんな感じに書いてます

## ①まず入れたい画像をdb/fixtures/imagesディレクトリあたりに用意する

<img width="302" alt="スクリーンショット 2016-04-28 18.35.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/11c7802d-52da-8eaa-5911-35fda27f6080.png">

まあぶっちゃけ場所はどこでもいい笑

## ②作成したいシードデータを作成する

`Rails.root.join`を使用してして、さっき用意した画像のあるフォルダを指定し、openする

```rb:db/fixtures/development/image.rb
Image.seed do |s|
  s.id = 1
  s.content = Rails.root.join("db/fixtures/images/photo1.jpg").open
end

Image.seed do |s|
  s.id = 2
  s.content = Rails.root.join("db/fixtures/images/photo2.jpg").open
end

...

```
これだけ！簡単！

ただこのままだとえんえんと新しい画像が作り続けられてしまうので

## ③保存先のディレクトリのなか見を毎回削除する

```rb:db/fixtures/development/image.rb

# 前回のシード画像を削除
require 'fileutils'
Dir.chdir 'public/uploads/photos/' #僕はここに保存しているだけなので適宜変更
FileUtils.rm(Dir.glob('*.*'))

Image.seed do |s|
  s.id = 1
  s.content = Rails.root.join("db/fixtures/images/photo1.jpg").open
end

Image.seed do |s|
  s.id = 2
  s.content = Rails.root.join("db/fixtures/images/photo2.jpg").open
end

...

```

#　完成や！

## 参考URL

Ruby:ディレクトリ内のファイルの削除
http://fuwakukara.seesaa.net/article/376399708.html
「オブジェクト指向入門」読書録

名著としての誉れが高い Bertrand Meyer著[「オブジェクト指向入門」](http://www.amazon.co.jp/dp/4756100503)（第１版）が、本棚の肥しになりかけていたので、頑張って読むことにしました。といっても、たんに読むだけではすぐ忘れること請け合いなので、簡単な要約を作っていきます。

今回の範囲は、第１章「ソフトウェアの品質とは」と、第２章「モジュール性」です。

「オブジェクト指向プログラミング」という言葉がバズワード化して消費されていってしまった（ように見える）のは「何のためにそれがあるのか？」がいまいち共有されていなかったからではないかと私は考えています。

その意味で、好ましいソフトウェアとはどのようなものか？　何を目指すべきか？　を議論するこの２章は重要です。

# １章　ソフトウェアの品質とは

## １．１　外的品質要因と内的品質要因

実行速度や使いやすさのように、ユーザから見える品質を外的品質要因という。対して、プログラムがきれいかどうかといった、ユーザから見えない品質を内的品質要因という。

ソフトウェアが成功したかを評価する上で、最終的に問題になるのは、外的品質要因だけだ。しかし、内的品質要因こそが、外的品質要因を満足させるためのカギだ。

この本の大部分は、内的品質要員について述べることになる。ただし、内的品質要因は外的品質要因を実現するためにあることを忘れてはいけない。

## １．２　外的品質要因

外的品質要因のうち、最も重要なものを紹介する。

### １．２．１　正確さ

正確さとはソフトウェア製品が要求および仕様によって定義された通りに確実に仕事を行う能力である。

### １．２．２　頑丈さ

頑丈さとは異常な状態においても機能するソフトウェアシステムの能力である。

正確さを目指すより、頑丈さを目指すことのほうがずっと曖昧だ。頑丈さは仕様にって明確にされていない場合の動作を問題にする。

### １．２．３　拡張性

拡張性とはソフトウェア製品が仕様の変更に容易に適応できる能力である。

拡張性を向上させるカギは次の２つ。

・簡明さ：簡単なアーキテクチャのほうが変更に対応しやすい。
・非集中性：モジュールが独立していれば、変更が発生した場合の影響を小さくできる。

### １．２．４　再利用性

再利用性とは、あるソフトウェア製品の全体または一部分が、どの程度新しいアプリケーション構築に再利用できるかを示すものである。

### １．２．５　互換性

互換性とは、あるソフトウェア製品相互の組み合わせやすさである。

例えば、バイナリファイルよりもテキストファイルを使おう、という考え方。

## １．３　ソフトウェアの保守について

統計によれば、ソフトウェアにかかる費用の70%は保守に費やされている。

ソフトウェアの保守が困難な原因は、ソフトウェア製品が変更を受け入れにくくなっていること、プログラムがデータの物理構造に依存しすぎていることである。

## １．４　５大要因

先に述べた５大要因は、２つのグループに分類される。

拡張性、再利用性、互換性：
柔軟で分散化された設計を生み出す技術を必要とする。

正確さ、頑丈さ：
要求および制約の詳細な仕様に基づいて行われる。

# ２章　モジュール性

拡張性、再利用性、互換性を達成するには、「ソフトウェアのモジュール性を高めなければならない」。

しかし、モジュール性とはなんだ？

モジュール性が高いということは何を意味するかを評価するために、５つの「基準」と５つの「原則」を紹介する。

## ２．１　５つの基準

モジュール性という観点から、設計手法を評価するための基準を紹介する。

### ２．１．１　モジュールの分解しやすさ

１つの問題を互いに独立した小さな問題に分割することができるかどうか？　という基準。

分解によって作られた小問題を、それぞれ独立した仕事として異なる人に割り振ることが出来なければいけない。

### ２．１．２　モジュールの組み合わせやすさ

最初の環境とは全く違った環境においても自由にソフトウェアの要素を組み合わせて新しいシステムを作ることができるか？　という基準。


### ２．１．３　モジュールのわかりやすさ

モジュール１個１個を取り出して個別に見てもわかりやすいかどうか？　という基準。

いくつかのモジュールがあって、それらが特定の順序で実行されなければ正しく動作しない、といった場合、個別のモジュールを取り出しても理解できなくなってしまう。

### ２．１．４　モジュールの連続性

小さな変更を加えた場合、その変更がわずかなモジュールにとどまるか？　という基準。

数字定数や文字定数を使わず、シンボル定数を使うなどは賢明な方法だ。

### ２．１．５　モジュールの保護性

あるモジュール内で発生した異常条件の影響が、わずかなモジュールにとどまるか？　という基準。

例外処理はモジュールの連続性を損なう傾向がある。第７章では、保護性を損なわない規則的な例外処理のメカニズムについて考える。

## ２．２　５つの原則

モジュール性を確保するために守らなければならない原則を紹介する。

### ２．２．１　言語としてのモジュール単位

モジュールは使用する言語の構文単位に対応していなければならない。

### ２．２．２　少ないインターフェース

モジュールはできるだけ少ないモジュールと対話すべきである。

### ２．２．３　小さいインターフェース（弱い結び付き）

２つの対話するモジュールがある場合、それらが交換する情報の量はできる限り少なくなければならない。

### ２．２．４　明示的なインターフェース

モジュールＡとＢが対話する場合、その対話は必ずＡあるいはＢ、もしくはその両方のテキストから明らかにならなければならない。

### ２．２．５　情報隠ぺい

特に公にすると宣言されていない限り、モジュールに関する情報は全てそのモジュールのみに属する非公開の情報である。

機能と実現方法とを分離する。実現方法が変わっても、そのモジュールを使えなければならない。

### ２．３　解放/閉鎖原則

・モジュールがまだ拡張可能ならば、そのモジュールは解放されているという。

・モジュールが他のモジュールから使用できるならば、そのモジュールは閉鎖されているという。

モジュールの分解しやすさを満足させるには、モジュールは開放的であると同時に閉鎖的でなければならない。つまり、モジュールに対する機能追加などの拡張はいつでも可能だが、拡張してもそれまでに書かれた部分は変更しなくてもすむといったことが求められる。

古典的な設計アプローチやプログラミング方法では、開かれていると同時に閉じているモジュールを書くことは不可能である。このジレンマを解決できるのは、オブジェクト指向的な手法によって得られる継承だけである。
Sketch3でAndroid用の画像を切り出す

# Sketch Toolboxをインストールする

以下のサイトからインストールしてください
http://sketchtoolbox.com/

# Sketch Better Android Export プラグインをインストールする

- github: https://github.com/nickstamas/Sketch-Better-Android-Export

Sketch Toolboxを起動して、検索ボックスに「Sketch Better Android Export」と入力してライブラリを表示し、インストールします。

![スクリーンショット 2016-01-19 16.42.21.png](https://qiita-image-store.s3.amazonaws.com/0/9875/c69d7a7d-62ac-5819-5b70-f67dbb5fb60d.png)


# Sketchで画像を切り出す。
1. Sketchを起動し、画像データ(.jpg,.png,.ai等)をドラッグ&ドロップする
2. Slice Layerで画像を選択する
3. Sketchトップメニュー > Plugin > Sketch Better Android Export > Better Android Export > Export Selected Layers(@1x Base)
 * @1x Baseはmdpiサイズを基準として画像を書き出します。
4. 各解像度毎に画像が作成されます。

![スクリーンショット 2016-01-19 17.16.58.png](https://qiita-image-store.s3.amazonaws.com/0/9875/d2bbf669-bb04-318b-14ba-a01e7d5fff29.png)


# Android Studioにimportする

あまりいい方法がみつからなかったのですが、比較的マシな方法としては、「Android Drawable Importer」というAndroid Studioのプラグインを使ってimportすることが出来ます。

## インストール

- AndroidStudio > Preferences > Plugins > Browse Repositories... > 検索窓に「Android Drawable Importer」と入力し、インストールする
- プラグインを有効にするためにAndroidStudioを再起動する

## 使い方

- プロジェクトツリーでres/drawableディレクトリを右クリック > New > Multisource-Drawable
- MDPI AssetsからXXHDPI Assetsまでの画像のパスを指定し、OKを押す。