OmniAICreator/Qiita-1.07M huggingface dataset:
CS61A: Homework1 - self printing programs in python

[宿題](http://cs61a.org/hw/hw01/)をやっていたらこんな問題を見つけた。

#設問

>
_Write a function that takes three positive numbers and returns the sum of the squares of the two largest numbers. Use only a single expression for the body of the function._

引数として3つの値をとり、その中で1番目と2番めに大きい数字をそれぞれ2乗して互いを足しあわせた数値を返すという関数を一行で作る。

```lang:hw01.py
def two_of_three(a, b, c):
    """Return x*x + y*y, where x and y are the two largest members of the
    positive numbers a, b, and c.

    >>> two_of_three(1, 2, 3)
    13
    >>> two_of_three(5, 3, 1)
    34
    >>> two_of_three(10, 2, 8)
    164
    >>> two_of_three(5, 5, 5)
    50
    """
    "*** YOUR CODE HERE ***"
```

最初の一番大きい数ってのは`(max(a,b,c)**2)`で出せるんだけど2番めの大きい数の出し方が分からなかった。

##1st attempt
最初に考えていたのはリストに全部放り投げて`if`と`for loop`かけて順番をdescending orderにし最初の2つの数字を取る。数字がダブらないように一周目のループで`maximum`を取ったら`newList`にいれて`oldList`から消す。残った`oldList`からまた同じループ実行するという流れ。
参考: <a href="http://www.pythontutor.com/visualize.html#code=def+two_of_three(a,b,c%29%3A%0A%09oldList+%3D+%5Ba,b,c%5D%0A%09newList+%3D+%5B%5D%0A%09while+oldList%3A+%23+as+long+as+you+have+oldList%0A%09%09maximum+%3D+oldList%5B0%5D%0A%09%09for+n+in+oldList%3A%0A%09%09%09if+n+%3E+maximum%3A%0A%09%09%09%09maximum+%3D+n%0A%09%09newList.append(maximum%29%0A%09%09oldList.remove(maximum%29%0A%09return+pow(newList%5B0%5D,2%29+%2B+pow(newList%5B1%5D,2%29%0A%0Atwo_of_three(1,2,3%29&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=3&rawInputLstJSON=%5B%5D&curInstr=0" target="_blank">Online Python Tutor</a>

```
def two_of_three(a,b,c):
	oldList = [a,b,c]
	newList = []
	while oldList:
		maximum = oldList[0]
		for n in oldList:
			if n > maximum:
				maximum = n

		newList.append(maximum)
		oldList.remove(maximum) # can be commented out
	return pow(newList[0],2) + pow(newList[1],2)

```

ただ設問では一行で書けと言っているのでボツ。two largest #sってことはfirst largestとsecond largestを取ればいい。first largestは`max(a,b,c)`で取れるがsecond largestをどうやって取るかが悩みどころ。

##2nd attempt

[他にも`sorted`も使えると発見した](http://stackoverflow.com/questions/9758959/python-how-to-sort-a-list-of-numerical-values-in-ascending-order)がわざわざリストに入れないと行けない時点で俺には一行では書けなさそうだったので他の方法を考えることに。色々試行錯誤したらたまたまできたのだが、なぜそうなるのか（というか概念的な背景）が理解できない。そういうアルゴリズムなんですと言われたら「はい、そうですか」としか言えない。

```
return (max(a,b,c)**2) + (max(min(a,b), min(a,c), min(b,c))**2)
```
実際に書いてシュミレーションをしてみると分かりやすかった。確かに言われてみれば3つのparameterそれぞれを二組に分けて小さい数を取ると必ず`min(second_largest, the_largest)`という組が出来上がるので言われてみればそのとおりだった。


#参考にしたリンク

[Self Printing Program](http://blog.amir.rachum.com/blog/2012/08/05/self-printing-programs-in-python/)
VirtualBoxで作成したCentOSにOpenStackを構築する(Dashboard編)

[環境編](http://qiita.com/tk3fftk/items/76d696a874d829ea9fe4)
[Identity編](http://qiita.com/tk3fftk/items/546ab241ac7b89a1c3c2)
[Image編](http://qiita.com/tk3fftk/items/7899758d14cde4a9b2db)
[Compute編](http://qiita.com/tk3fftk/items/810e70533466c9307a93)
[Networking編](http://qiita.com/tk3fftk/items/07e384933eb12591b731)
の続きです。

[公式ドキュメント](http://docs.openstack.org/liberty/ja/install-guide-rdo/horizon.html)に従ってやっていきます。

# OpenStack Dashboard
> OpenStack dashboard は horizon としても知られ、クラウド管理者やユーザーがさまざまな OpenStack のリソースやサービスを管理できるウェブインターフェースです。
> Dashboard を使うと、OpenStack API 経由での OpenStack Compute クラウドコントローラーとやり取りを、ウェブベースで行えます。

- ダッシュボードは、Identity service、Image service、Compute、Networking (neutron) に依存 -> これらの後にいれるべき

## インストールと設定@コントローラノード
- インストール
  - `# yum install openstack-dashboard`

- `# vi /etc/openstack-dashboard/local_settings`

```properties:local_settings
# controllerノードのOpenStackのサービスを利用するように設定する
OPENSTACK_HOST = "controller"

# すべてのホストからダッシュボードへのアクセスを許可する
ALLOWED_HOSTS = ['*', ]

# memcachedを使用するように設定する
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}

# ダッシュボード経由で作成するユーザーのデフォルトロールとして user を設定
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

# ネットワークオプション 1 を選択したので、レイヤー 3 ネットワークサービスのサポートを無効にする
OPENSTACK_NEUTRON_NETWORK = {
...
'enable_router': False,
'enable_quotas': False,
'enable_distributed_router': False,
'enable_ha_router': False,
'enable_lb': False,
'enable_firewall': False,
'enable_vpn': False,
'enable_fip_topology_check': False,
}

# タイムゾーンを日本にしてみる
TIME_ZONE = "Asia/Tokyo"
```

- 起動設定
  - `# systemctl enable httpd memcached`
  - `# systemctl restart httpd memcached`

## 確認
- http://192.168.12.11 にアクセス
  - controllerを解決できるならそっちでもおk
- admin/root++でログイン
VMWare vSphere 6へのアップグレードでのハマり事 2

さてvCenterはアップグレードできたので、次はESXiをアップグレードする。
順番を間違えるとうまく以降できないので注意。

自分は同一の世代のCPUを積んだサーバで行ったので、以下で大丈夫でしたが世代がまちまちだとvMotionができないかも…

## 1.まずはじめに
使ってるサーバベンダーのサポートサイトを見てなんか依存関係とかが無いか確認する。
うちのサーバだとCNAのファームウェアを更新しないと駄目って書いてあった。
割と細かいことがいろいろ書いてあるので、読んでおいたほうがいい。

今回はCNAのファームウェア更新のついでにBIOSなども上げました。

## 2.新規vCenterに移行用クラスタを作成する
新しいvCenterにクラスタを作成します。この時点ではまだHAもEVCも無効にしておきます。

## 3.既存vCenterから該当ESXiを切断する
メンテナンスモードに切り替えてから、該当ホストをインベントリから削除しましょう。

## 4.ESXiをアップグレードする
1台目は一番古い世代のCPUを積んだサーバで行いましょう。
これは手順通りにやれば大丈夫ですね。
サーバベンダーのCIM Providerがインストールされていたら、アップグレード前にアンインストールし、v6対応版をアップグレード後にインストールします。
アップグレード後ipv6を使わないなら無効にしましょう。

## 5.新規vCenterに組み込む
アップグレードしたESXiを新規vCenterに組み込みます。
ライセンスキーをMy VMWareでアップグレードするのをわすれずに。
なお、ライセンス的にはアップグレードすると既存のライセンスが失効しますので、上げた後に1台ずつ作業しましょう。

## 6.アップグレードしていないESXiも既存vCenterから切断する
vMotionで極力無停止で移行するためにはこれが必要です。
ライセンスキーを入れ直す必要があるので、メモをとっておきましょう。
まあMy VMWareにありますけど。

## 7.新規vCenterにアップグレード前ESXiを組み込む
新規vCenterの移行用クラスタに組み込みます。
組込時にライセンスキーを入れる必要があります。

## 8.アップグレード前ESXi上にいるサーバをアップグレード済みESXiにvMotionする
アップグレード前サーバを空にしましょう。

## 9.2台目をアップグレードする
これは1台目と同じですが、アップグレード前に新規vCenterのインベントリから削除しておきます。
インベントリから削除しておかないと、アップグレード後に組み込みできません。

## 10.新規vCenterに本番用クラスタを作成する
このクラスタはEVCを有効にしておきましょう。
世代の設定を適切にするのを忘れずに。一番古い世代のCPUに合わせます。
HAは最初の段階ではリソース不足になるので無効にしておきます。

## 11.本番用クラスタに2台目を組み込む
本番用クラスタ1台目となります。

## 12.移行用クラスタにいる1台目ESXiから本番用クラスタのESXiへvMotionする
設定がうまく行っていれば、vMotionできるはずです。
全台vMotionして1台目のサーバを空にします。

## 13.全部アップグレードできるまで6〜12を繰り返す
最終的には移行用クラスタに空のESXiが残るはずです。

## 14.最後に残った1台目を本番用クラスタに組み込む
組み込んだら忘れずにVMWare HAを有効にしましょう。

移行用クラスタを作っておくのが大事っぽい。
httpsでリクエストをするとslab cacheが増えて解放されない

# httpsでリクエストをするとslab cacheが増えて解放されない

他にも記事があるけど自分もハマったので。

## apiで運用していると直面する問題

* 他のサイトからデータを収集しているサーバー
* マイクロサービスアーキテクチャでapi連携しているサーバー
* 内部のAPIサーバをhttpからhttpsに切り替えると起きる
* 常駐するデーモンやcronで叩かれるコマンド、プログラムが終了しても残るのが特徴

## リソースモニタ

* 以下のグラフのように黄色のslab cacheがジリジリ増えてきて最終的にメモリ不足になる

![memory-day.png](https://qiita-image-store.s3.amazonaws.com/0/9834/d3a7298c-ece8-e0fa-e3db-9918eec34c1c.png)

## 対応方法

* 二つの方法がある

### ジリジリ増えるならcronで1日一回以下のコマンドを実行

```
/bin/echo 2 > /proc/sys/vm/drop_caches
```

### 一気に増えるなら環境変数を設定する

やり方は２パターンあるらしい

```
export NSS_SDB_USE_CACHE="yes"
```

```
export TMPDIR=/dev/shm
```

# おまけ

## slabの中身の確認

slabtopコマンドでどのくらいの容量になっているかわかります

```:slabtop
115563 115410  99%    0.19K   5503	 21     22012K dentry
```

# ps

httpsリクエストでのslabキャッシュの影響はlibcurl使ってるphpやapacheでよく起きます。他にはクラウドを操作するコマンドなど。
nodejsはlibcurl使っていないので起きない。

# 参考

[アプリケーション内でhttpsによる外部APIを叩いているサーバのメモリ使用量が増加し続ける件について](http://s-tajima.hateblo.jp/entry/2015/02/20/233615)
[slab肥大化とdentry_cacheに辿り着くまでの話](http://qiita.com/joe_hrmn/items/f0fb72b4598607403f2f)
[aws sdkを使っているとslabキャッシュが増大化していく](http://qiita.com/kentaost/items/a2e882d2978fba9e17d3)
[サーバーのメモリが少しずつ圧迫される原因と対策を調べてみた](http://qiita.com/bezeklik/items/7e1ac9e5da39261be7bd)
ruby2.x.xのインストール方法

こんにちは
今回は、CentOS6 についての Ruby 2.x.x系についてのインストール方法について説明したいと思います。

私はよくサクラインターネットのVPSサーバーを借りるのですが、
そこのデフォルトのOSがCentOS6なのです。
それで、Ruby2.x.xについてインストールしようと思った時、
yumリポジトリのあったRubyのバージョンは2016/2/5現在、version:1.8.7でした。

少し、時代遅れなので、Ruby2系についてのインストール方法についてまとめます。

インストールには ```rbenv```を使いたいと思います。
rbenv は Ruby を同一コンピュータ上で管理する GitHub 提供のツールです。2.x に限らず 1.x も含めた複数バージョンの Ruby を同じマシンにインストールし、実際に利用するバージョンを管理しながら使えるようにできます。

ちなみに、あるサイトを大いに参考にしてます。
本家が見たい方は、下記のURLを参照ください。

それでは、始めます。

install
---

まず、```rbenv```は GitHub から提供されていることもあり、gitが必要になります。
ですので、まず最初にインストールをします。

```sh
yum install git
```

git を使って GitHub から rbenv をチェックアウトします。今回は /opt/ 以下に Ruby をインストールするという前提にします：

```sh
cd /opt
git clone git://github.com/sstephenson/rbenv.git
```

続けて ruby-build プラグインを rbenv の plugins フォルダにインストールします：

```sh
mkdir /opt/rbenv/plugins
cd /opt/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
```

最後に /etc/profile に以下の３行を追加して、rbenv を初期化＆実行するための環境設定を行います：

```sh
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

これで、rbenvの導入は完了です。
順調にいけば、ここまでの所要時間は5分です。

では、ここからRubyのインストールに入ります。

次に、rubyのインストール時に必要になるパッケージをあらかじめインストールしておきます。

```sh
yum install gcc make openssl-devel libffi-devel readline-devel
```

```rbenv install -l``` でインストールできるrubyの一覧を見ることができます。

```sh
[root@xx-000-00000 bin]# rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  ...

  2.3.0-preview2
  2.3.0
  2.4.0-dev
  ...

  jruby-1.5.6
  jruby-1.6.3
```

今回は、最新の安定版は2.3.0みたいなので、これをinstallします。

```sh
[root@xx-000-00000 bin]# rbenv install 2.3.0
Downloading ruby-2.3.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.bz2
Installing ruby-2.3.0...
Installed ruby-2.3.0 to /opt/rbenv/versions/2.3.0
```

これで、ruby2.x.x系の導入は終了です。


----

補足
---

ちなみに、今回はrubyのinstallに必要なパッケージを事前に導入しました。
私は必要なパッケージを入れないまま```rbenv install 2.3.0```を実行したため、こんなエラーが出ました。

```sh
[root@xx-000-00000 bin]# rbenv install 2.3.0
Downloading ruby-2.3.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.bz2
Installing ruby-2.3.0...

BUILD FAILED (CentOS release 6.7 (Final) using ruby-build 20160130-6-g9e57fb0)

Inspect or clean up the working tree at /tmp/ruby-build.20160205150825.24936
Results logged to /tmp/ruby-build.20160205150825.24936.log

Last 10 log lines:
installing rdoc:              /opt/rbenv/versions/2.3.0/share/ri/2.3.0/system
installing capi-docs:         /opt/rbenv/versions/2.3.0/share/doc/ruby
The Ruby readline extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `yum install -y readline-devel` to fetch missing dependencies.

Configure options used:
  --prefix=/opt/rbenv/versions/2.3.0
  LDFLAGS=-L/opt/rbenv/versions/2.3.0/lib
  CPPFLAGS=-I/opt/rbenv/versions/2.3.0/include
```

もし、こんなのが出たら

```sh
yum install -y readline-devel
```

をしてあげてください。



参考サイト
---
http://dotnsf.blog.jp/archives/1020034700.html
android sdkの`zipalign`をインストールする方法

Android SDK Build-toolsの番号を確認する

```bash
$ android list sdk -a
...
Packages available for installation or update: 160
   1- Android SDK Tools, revision 24.4.1
   2- Android SDK Tools, revision 25.0.4 rc5
   3- Android SDK Platform-tools, revision 23.1
   4- Android SDK Build-tools, revision 23.0.2  ← これ
   5- Android SDK Build-tools, revision 23.0.1
...
```

Android SDK Build-toolsをインストールする

```bash
$ android update sdk -a -u -t 4
```

zipalignがインストールされたことを確認する

```bash
$ find . -name "zipalign"
./android-sdk-linux/build-tools/23.0.2/zipalign
```


sym linkを貼る

```bash
$ ln -sf /home/hoge/android-sdk-linux/build-tools/23.0.2/zipalign /usr/bin/zipalign
```

# 参考

- [Android SDKのコマンドラインオプション (android update sdk)](http://qiita.com/tsubu-mustard/items/7ee9b0f6d9adddaf6b36)
- [How to install Android SDK Build Tools on the command line?](http://stackoverflow.com/questions/17963508/how-to-install-android-sdk-build-tools-on-the-command-line)
Android 版 Google 日本語入力 のユーザー辞書をインポートする方法

# はじめに

[Google 日本語入力辞書を Google スプレッドシートで管理する - Qiita](http://qiita.com/makietan/items/f02896e779cfcc0b49c0)

という記事を書いたが Android 版の Google 日本語入力へのインポート方法については記載していなかった
で調べた結果、こちらに書いてました

<a href="http://googledevjp.blogspot.jp/2012/07/android-google-1511223.html">Android 版 Google 日本語入力をアップデートしました。（1.5.1122.3） - Google Developers Japan</a>

# 1. Google Drive アプリを用意する

<a href="https://play.google.com/store/apps/details?id=com.google.android.apps.docs">Google ドライブ - Google Play の Android アプリ</a>

# 2. Google 日本語入力を用意する

<a href="https://play.google.com/store/apps/details?id=com.google.android.inputmethod.japanese">Google 日本語入力 - Google Play の Android アプリ</a>

# 3. 辞書を用意する

> テキストファイルと、それを ZIP 形式で圧縮したものが扱えます

今回は圧縮せずに Google Drive に置きました

![スクリーンショット 2016-02-05 15.08.54.png](https://qiita-image-store.s3.amazonaws.com/0/30241/b2e7b7f8-537d-a898-9613-5650c1c62344.png)

中身はこんな感じです

![スクリーンショット 2016-02-05 15.17.51.png](https://qiita-image-store.s3.amazonaws.com/0/30241/37c93ddc-c3f5-7ae8-c3de-35e02239d5ad.png)

どう見ても酷い辞書です

# 4. Android で Google Drive アプリを起動する

![スクリーンショット 2016-02-05 15.19.40.png](https://qiita-image-store.s3.amazonaws.com/0/30241/d490d067-6aff-51bd-9e04-d89faff6d3a5.png)

アプリを起動して、用意した辞書をタップします

<img src="https://qiita-image-store.s3.amazonaws.com/0/30241/046f6454-8456-6653-1ae6-36d1329fecb0.png" width="240px">

すると、選択肢がにょきっと生えてくるので辞書ツールをタップします

<!-- ![スクリーンショット 2016-02-05 15.20.41.png](https://qiita-image-store.s3.amazonaws.com/0/30241/6a8ef40b-3169-4463-d444-1aeaf21a977a.png) -->

<img src="https://qiita-image-store.s3.amazonaws.com/0/30241/a6430ed8-71e6-4ba9-d658-c6af9e11488b.png" width="240px">

次にインポートを行うかどうかを聞かれるので OK を押します

<img src="https://qiita-image-store.s3.amazonaws.com/0/30241/4c388c41-b8b5-2432-7edc-9b0066772855.png" width="240px">

インポート完了

<img src="https://qiita-image-store.s3.amazonaws.com/0/30241/abd81a0a-c5bb-1e90-e97c-cfa7f76fc838.png" width="240px">

# おわりに

結構分かりづらいのですが簡単に辞書をインポートできました
1年くらいインポートの方法を探していたのは内緒
[EC2 Linux] 初回ログイン

EC2 Linux のインスタンス作成後の初期接続と初期設定をメモ

1.TeraTerm でホスト名にパブリックDNS名を入力
![TeraTerm ログイン.png](https://qiita-image-store.s3.amazonaws.com/0/111347/6af1da2e-0932-6b1c-8832-284ddf139be5.png)

2.SSH認証ダイアログでユーザー名にデフォルトユーザー名の **ec2-user** を入力、RSA/DSA/ECDSA鍵を使うを選択、「秘密鍵」ボタンをクリックしてインスタンス起動時に指定または作成したキーペアを選択
![スクリーンショット 2016-02-05 14.00.41.png](https://qiita-image-store.s3.amazonaws.com/0/111347/e6f0af8d-2c84-478f-ada7-99075e5edc52.png)


3.「OK」をクリックで接続ができる![スクリーンショット 2016-02-05 14.05.33.png](https://qiita-image-store.s3.amazonaws.com/0/111347/950a3330-03db-e829-324d-0fe79dc9cdca.png)
脱Android Annotationsのために、onActivityResultの処理を楽にするライブラリを作った

Androidアプリ開発を楽にするため、View Injectionとかスレッド制御としてAndroid Annotationを使っていたのですが、下記の問題のため別なライブラリに移行することにしました。

## Android Annotationsの問題点

 * クラス数が増える
    * Multi Dex限界が近くなる
 * ビルド時間が長い
    * APTで自動生成されるので、その分非力な環境でのビルドが長くなる
 * Android NDKとマトモな方法では組み合わせられない
    * Plugin構成が変わるので、aptが正常に動かなかった
 * ライブラリプロジェクトでは一部のAnnotation利用が制限される
    * APTで静的にIDが解決されるので、ライブラリプロジェクトはView系機能とかが使えない

特に[Andriders Central Engine](https://play.google.com/store/apps/details?id=com.eaglesakura.andriders)ではビルド時間のあまりにも長くなり、マトモに開発を継続できる状態じゃ無くなってしまいました。ついでに、ライブラリプロジェクトの制限とかで設計の制約も煩わしくなってきました。

## 既存の移行先ライブラリ

そこで脱Android Annotationsするために移行先のライブラリを探しました。幾つかは非常に優れたライブラリがありました。

 * ViewById/Click系アノテーション（View取得）
  * [Butter Knife](http://jakewharton.github.io/butterknife/)
 * InstanceStateアノテーション（ステート保存）
  * [Ice Pick](https://github.com/frankiesardo/icepick)
 * Background/UiThreadアノテーション（スレッド制御）
  * 無理なので諦めた
 *  [OnActivityResultアノテーション](https://github.com/excilys/androidannotations/wiki/OnActivityResult)（OnActivityResult自動振り分け）
  * いいのがない

結局ググッてもOnActivityResultアノテーション（自動的にonActivityResultで処理の振り分けをする）というライブラリは見つかりませんでした。移行する上で必要なのは少なくとも下記の機能。

 * 特定シグニチャのメソッドにアノテーションをつけるだけで使える
 * クラスを生成せず、Runtimeで解決してくれる

## OnActivityResultの移行

ないものはなんとか作るしか無いので、自作したのが[OnActivityResult-invoke](https://github.com/eaglesakura/onactivityresult-invoke)です。

Android Annotationsと互換性（というか、旧コードからの移行もあるので）を保持するため、アノテーションの使い方は本家と同じにしてあります。自動呼び出しは不可なので、onActivityResult時にActivityResult.invoke()を呼び出すという点が異なります。

BaseActivityのようなものを作っておいて、そっちで呼び出せば継承先は自動で呼び出しが行われるはずです。

本家より高機能な点として、"ChildFragmentを再帰的に呼び出し可能"と、"Activity/Fragment以外の型でもInvokeできる"という機能があります。

```lang:Java

public class MainActivity extends AppCompatActivity {
    static final int REQUEST_REQUEST_PICK1 = 0x0001;
    static final int REQUEST_REQUEST_PICK2 = 0x0002;
    static final int REQUEST_OTHER = 0x0003;

    // いろいろ処理...

    @OnActivityResult(REQUEST_REQUEST_PICK1)
    void resultPickImage1(int resultCode, Intent data) {
        Toast.makeText(this,
                String.format("resultPickImage1 code(%d)", resultCode),
                Toast.LENGTH_SHORT
        ).show();
    }

    @OnActivityResult(REQUEST_REQUEST_PICK2)
    void resultPickImage2(int resultCode, Intent data) {
        Toast.makeText(this,
                String.format("resultPickImage2 code(%d)", resultCode),
                Toast.LENGTH_SHORT
        ).show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!ActivityResult.invoke(this, requestCode, resultCode, data)) {
            // handle failed
            Toast.makeText(this,
                    String.format("failed request(%d) result(%d)", requestCode, resultCode),
                    Toast.LENGTH_SHORT
            ).show();
        }
    }
}

```

## 最後に

Background/UiThreadアノテーションを移行できるライブラリがあったら教えてくれるとありがたいです。
Gitで変更のあったファイルだけRuboCop, Rspec, etcする

コミットする前の最終確認で作業分のコーディングチェックするとき、`git diff`で変更差分があるものを確認してから、

```bash
$ rubocop file_1 file_2 file_3
```
と実行してるのだが、これがなかなか面倒で結局ファイル指定せず全ファイル対象に実行していたりする。
ただ小さなプロジェクトなら問題ないが、ファイル数や規模が大きくなったりするとその時間もバカにならない。

どうにかならないものかと思って、早速、スクリプトを組み合わせるといい感じに。

## 差分のあるファイルのみRuboCopする
```bash
$ rubocop $( git diff --name-only --diff-filter=AMRC | grep -e ".*\.rb" | paste -s - )
```

いままでpushのタイミングでまとめてコーディング直してたりしてたんだけど、
これならpre-commitとかにいれるとかなりコーディングが強制されていい感じになりそう！
そのときは、`git diff`に`--cached`のオプションをつけるのを忘れずに。
シェルスクリプト　その７

私にとって８章は実用性が低かったので興味を持ったところだけをメモします。

・exprは通常シェルで処理できない数値を扱うためのコマンド。

・符号として+、-。expressionとして+、-、*、/、%がつかえます。
　注：\*は特殊文字として認識されるのでクォーティングかバックスラッシュで回避。

・浮動小数点を含む計算は、scaleで小数点何位までを出力するか指定してパイプラインでbcコマンドとつなぐ。
　例：echo "scale=n; #1 + #2 " | bc

・16進数を10進数にコンバートするコマンドはdcだがよく使い方がわからない。逆も可能。

・変数内の文字列を連結するには、ただ変数を並べるだけ(\$F\$O\$O)、直接文字列を繋げたいときは変数の境目を認識させるため{}で変数名を囲う(\${F}oo)。

・"　\$expr　"string"　:　'.\*'　"の":"は先頭から何文字が同じかパターンマッチングしてくれる。'.*'はどのような文字列でも先頭から最後まで正しくマッチングしてくれるため文字列の長さを測れる。ただし１文字のときはエラーになるのでケース文で回避する。

・cutコマンドは文字列のn番目からm番目までを取り出してくれる。

参考資料：入門UNIXシェルプログラミング　改訂第２版　第８章（発行所：SBクリエーティブ株式会社）

余談：８章は先にも書いたように今のところあまり重要ではないです。もう少しシェルスクリプトを書く機会が増えれば復習のために読みたいと思っているので、この投稿もアップデートするかもしれません。

[シェルスクリプト　その１](http://qiita.com/woolon/items/7bcfa18320f0abd74ca0)
[シェルスクリプト　その２](http://qiita.com/woolon/items/c69482474ba1564d5057)
[シェルスクリプト　その３](http://qiita.com/woolon/items/59c26dcb040adefae0f3)
[シェルスクリプト　その４](http://qiita.com/woolon/items/514db422f8ccea0ca94c)
[シェルスクリプト　その５](http://qiita.com/woolon/items/6366dd6dac12387d84b7)
[シェルスクリプト　その６](http://qiita.com/woolon/items/6e89c67220b9095a6414)
第4話 敵が現れた！

**敵は本能寺にあり！（謎）**

[持ち物](http://qiita.com/tkymgr/items/c47157f81b774118f087)が準備出来た太郎と次郎が街中を歩いているときに、攻撃的な人に遭遇してしまった状況をコード化しました。

マイブームなPhalconとMongoDBな環境で実装します。

Item同様にモデルとしてEnemyクラスを実装します。

```php:Enemy.php
<?php

use Phalcon\Mvc\Collection;

class Enemy extends Collection
{
    public function getSource()
    {
        return "enemy";
    }
}
```
誰と遭遇するのわからないのが世の常。ランダムでMongoDBからEnemyを読み出してみます。
Enemyには、こんな感じの情報が入っているとして、

```php:moga.php
$teki1 = new Enemy();
$teki1->name = '角刈り';
$teki1->rank = 1;
$teki1->weapon = '朽ち木';
$teki1->save();

$teki2 = new Enemy();
$teki2->name = 'リーゼント';
$teki2->rank = 1;
$teki2->weapon = '小石';
$teki2->save();

$teki3 = new Enemy();
$teki3->name = 'バンダナ';
$teki3->rank = 1;
$teki3->weapon = 'ハサミ';
$teki3->save();

$teki4 = new Enemy();
$teki4->name = 'グラサン';
$teki4->rank = 2;
$teki4->weapon = '竹ぼうき';
$teki4->save();
```
まだまだ、この兄弟は、駆け出しの悪童なので、ランクが1までのEnemyが遭遇対象とします。
まずは、このランク1までのEnemyの件数を数えます。

```php:soga.php
// rank BETWEEN A AND B 的な条件
$query['conditions'] = array(
	'rank' => array(
		'$gte' => 1, // A
		'$lte' => 1  // B
	)
);
$kensu = Enemy::count($query);
```
この件数を使って乱数を生成し、ランダムレコードをスキップします。検索結果もとりあえず1件にします。

```php:zoga.php
$query['skip'] = mt_rand(0, $kensu - 1);
$query['limit'] = 1;
```
Enemyが登場します。

```php:boga.php
$enemy = Enemy::findFirst($query);
echo $enemy->name . "が、手に" . $enemy->weapon . "を持って現れた！！";
```

兄弟の運命や、いかに！！
VR SupportされてるUnity 5.xでOculusのフェードイン、フェードアウト

# VR SupportされてるUnity 5.xでOculusのフェードイン、フェードアウト

使用環境 : Unity 5.3.2f1

趣味でUnityでVRしてます。
Oculusでシーンの移動でフェードイン、フェードアウトしたいのですが、調べてもOVRなんとかを使った古いものばかりで、VR Supportのチェックを入れてお手軽に遊んでる私にとってはコンパイルエラーです。

なので、忘備録もかねてシーンをフェードするスクリプトです。

### 1. 使い方
Main Cameraにスクリプトを入れます。
シーンが呼ばれた時（Main Cameraがenableになったとき）フェードインします。

違うシーンに移動する時は

```csharp
Camera.main.GetComponent<SceenFade>().LoadSceenWithFade("Sceen1");
```

こんな感じでシーンを呼び出すと、フェードアウト後、シーンをロードします。
（なので、呼び出すシーンのMain Cameraにこのスクリプトを入れるとフェードアウト後、シーンをロードしてフェードインします）

うん、メインカメラに入れるので、Findしなくて良いのでらくちん

### 2. スクリプト

```csharp
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class SceenFade : MonoBehaviour {

    public float fadeTime = 2.0f;
    public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1.0f);
    public Shader fadeShader = null;

    private Material fadeMaterial = null;
    private bool isFading = false;

    void Awake()
    {
        fadeMaterial = (fadeShader != null) ? new Material(fadeShader) : new Material(Shader.Find("Transparent/Diffuse"));
    }

    void OnEnable()
    {
        StartCoroutine(FadeIn());
    }

    public void LoadSceenWithFade(string sceenname)
    {
        StartCoroutine(FadeOut(sceenname));
    }

    void OnDestroy()
    {
        if (fadeMaterial != null)
        {
            Destroy(fadeMaterial);
        }
    }

    IEnumerator FadeIn()
    {
        float elapsedTime = 0.0f;
        Color color = fadeMaterial.color = fadeColor;
        isFading = true;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            color.a = 1.0f - Mathf.Clamp01(elapsedTime / fadeTime);
            fadeMaterial.color = color;
        }
        isFading = false;
    }

    IEnumerator FadeOut(string sceen)
    {
        float elapsedTime = 0.0f;
        fadeColor.a = 0f;
        Color color = fadeMaterial.color = fadeColor;
        isFading = true;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            color.a = 0.0f + Mathf.Clamp01(elapsedTime / fadeTime);
            fadeMaterial.color = color;
        }
        SceneManager.LoadScene(sceen);
        isFading = false;
    }

    void OnPostRender()
    {
        if (isFading)
        {
            fadeMaterial.SetPass(0);
            GL.PushMatrix();
            GL.LoadOrtho();
            GL.Color(fadeMaterial.color);
            GL.Begin(GL.QUADS);
            GL.Vertex3(0f, 0f, -12f);
            GL.Vertex3(0f, 1f, -12f);
            GL.Vertex3(1f, 1f, -12f);
            GL.Vertex3(1f, 0f, -12f);
            GL.End();
            GL.PopMatrix();
        }
    }
}
```

### 3. Shader.Findの注意点

スクリプト内でShader.Findを使ってますが、Unity Editorとビルド後では動作が異なるので注意してください。

Unity Editor →　Build-in Shaderも問題なく検索してくれる
ビルド後の環境　→ HierarchyにあるShaderのみ檢索

なので、Editor上では問題ありませんがビルド環境ではHierarchy内に【Transparent/Diffuse】のシェーダを使ったマテリアルがアタッチされてるObujectがないと動きませんので注意です。
Theanoでcudaを使うとき

# TheanoでCUDAを使うとき

今後はまりそうだからメモ

## Ubuntuの場合

$PATH=/usr/local/cuda-7.0/bin:$PATH
$LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64
ってする。

## Macの場合

$PATH=/Developer/cuda-7.0/bin:$PATH
$DYLD_LIBRARY_PATH=/Developer/local/cuda-7.0/lib64

ってする。

つまりDYLDかLDかの違い
boostの一部のみを使う



一部分だけコピーして使いたかったが，依存関係が複雑で困ったので備忘録


ちゃんとそれ用のツールが準備されていました．

#### 実行環境
* MacOSX El Capitan(10.11.3)
* boostはhomebrewでインストール(boost 1.59)

  
### インストール
今回はhomebrewで，

```bash:install
brew install boost-bcp
```


### 使い方
#### 例）boost/regex.hppとその依存関係をホームディレクトリへコピー

##### 基本
```bash:例１
cd /usr/local/Cellar/boost/1.59.0/include/
bcp boost/regex.hpp ~/

```

```bash:例２
cd /usr/local/Cellar/boost/1.59.0/include/
bcp regex ~/
```

こっちはテストのソースなんかもコピーするらしい

##### boostの場所を指定する

```bash:例３
bcp --boost=/usr/local/Cellar/boost/1.59.0/include/ regex ~/
```

##### 自作のcppファイルなどに必要なものを引っ張る
```bash:例４
bcp --scan --boost=/usr/local/Cellar/boost/1.59.0/include/ myfile.cpp 
```

#### オプション
* `--boost=path` 場所を指定
* `--namespace=newname` ネームスペースを変更（boostの部分）
* `--namespace-alias` 上とセットで使うっぽい．（上で指定した名前がboostにエイリアスされる）
* `--scan` ファイルのincludeをスキャン

他にもいくつかありますが使わなそうなので保留


### 参考にしたとこ（というか本家）
[BCP-1.60.0](http://www.boost.org/doc/libs/1_60_0/tools/bcp/doc/html/index.html)
Android Studioでコードの折りたたみ

 Android Studioでのコードの折りたたみと展開のショートカットキーについて自分の備忘録として書いておきます。
## コードの折りたたみと展開

* [CTRL] + [SHIFT] + "+"・・・・コードを折りたたむ
* [CTRL] + [SHIFT] + "-"・・・・コードを展開する
* [CTRL] + "."・・・・・・・・・ カーソル箇所のコードの折りたたみと展開のトグル
リモートサーバーからログアウト、切断した後もコマンドを実行し続ける

リモートサーバー等で、ターミナルを終了させたり、切断、ログアウトしてしまうと、実行中のコマンドも終了してしまいます。
帰りがけにコマンドを実行したい時や、コマンドの実行時間が予想以上に長い場合は、以下の通りコマンドを入力すると、ログアウト、切断した後にも、コマンドが終了せず実行し続けます

`nohup [実行したいコマンド] &`

例: `nohup sleep 10000 &`
t2.microだとBerkshelfのビルドはできない

t2.micro（Ubuntu Server 14.04 LTS）だとBerkshelfが依存するライブラリのビルドができないらしい。
スペックが足りていないっぽい。

簡単にやるには一旦t2.microを使いたい場合、t2.smallあたりでビルドしてからt2.microに落とす必要がある。

ビルドできない関連ライブラリを全てapt-getなりでインストールしてからならビルドできるという情報もあるが、そんな面倒なことやりたくない。
ざっくり画像命名ルール

プログラミング学習サービスやら、ペットサロン予約サービス、風俗検索サービスなど色々とやっている「かずきち」です。
■運営サービス一部
http://crazy-wp.com/
http://webukatu.com/
新宿のホストから不動産・保険の営業を経て、HTMLって何？という状態から３ヶ月独学でプログラミングやデザインを学び、IT業界で１年間実務経験を積んで年収は１本超え。現在は起業家としてサービス運営やら不動産運営をしています。
Qiita内にそれ系の記事も書いてます。
<a href="http://qiita.com/kazukichi/items/7379b75fba2f90d3cf45" target="_blank">エンジニアで稼ぐために大切な１３のコト</a>
<a href="http://qiita.com/kazukichi/items/aeba286c2a750081e5c0" target="_blank">WEBサービスで起業したい人に読んで欲しい１８のコト</a>


# 画像ファイル名の付け方

## ファイル名をつける時の前提条件
１．画像ファイル名だけで画像内容の想像がつくこと
２．流用箇所が増えてもファイル名を変更する必要がないこと

## 命名規則
```
モジュール名_機能名_状態名.拡張子
```

##モジュール名
モジュール名は「どんなオブジェクトか」を表す。イラストが描かれた画像なのか、ボタンの画像なのか、タブの画像なのか、など。「何に使うものなのか」など。
ただし、写真やイラストなどは色々な箇所で使われる可能性があるため、そのまま写真・イラストとすること。

```
・イラスト → ilst
・図 → figure
・アイコン → icn
・バナー → bnr
・ロゴ　→　logo
・ナビ　→ nav
・背景 → bg
・線 → line
・ボタン → btn
・タブ → tab
・写真 → photo
・ポップアップ　→　popup
```

##機能名
機能名はモジュールをもうちょい具体的にしたもの。ボタンであれば「どういう時に使うものなのか」、アイコンであれば「何を表しているのか」など。

```
・矢印　→　_arrow_
・人　→　_men_  , _women_ , _family_　など
・ドット柄　→　_dotte_
・都会　→　_city_
```

##状態名
動きや何かしらの状態がある場合につける。状態は複数連なる場合がある。
矢印アイコンなら「どこを向いているのか」、人なら「何をしているのか」、背景や線なら「何色なのか」など。

```
・手を上げている　→　_handsUp
・説明している　→　_explain
・押されている　→　_pushed
・反転している　→　_reverse
```

##画像名の例
イラストの場合

```
illust_man_handsup.png
```

登録ボタンの場合

```
btn_register.png
btn_register_pushed.png
```
[ionic] controllerでページ遷移する際にトランジションをコントロールする方法

リンクでの画面遷移ではなく、コントローラーで画面遷移(location.href)をする際にトランジションをコントロールする方法です。

# リンクの場合のトランジション
nav-transitionで設定する

```hage.html
<a nav-transition="none" href="#/huga">Huga</a>
```

# コントローラーでの画面遷移方法
$ionicViewSwitcherで設定する

```hage-ctrl.js
controller.controller('HageCtrl', function ($scope, $ionicViewSwitcher) {

  $scope.move = function(){
    $ionicViewSwitcher.nextTransition('none');
    location.href = '#/huga' 
  }

}
```
Corona SDKインストール、環境設定を行い、 Coronaを少しさわってみた

## 環境構築に必要なもの
- 本体
- JDK　（なぜかJDK7をインストールしようとしたらログインを求められた）
- Editor　Sublimeなど
- Sublimeの場合、Package Control からパッケージをインストール
　　
  
## 各インストール
  1. 本体
　 [Corona 公式](https://coronalabs.com/products/corona-sdk/)サイトページの右上にDownloadボタンがあるのでクリックします。
  
  　ログインページが表示されるので、サインインする。登録していない場合はRegister覧にメールと設定したいパスワードを入力します。
   
   ダウンロードページが表示されるので、パソコンのＯＳを選び、Downloadボタンを押すと本体のダウンロードが行えます。
   
  ![coronaSDKIS00.png](https://qiita-image-store.s3.amazonaws.com/0/34658/d390631b-c2ed-1fde-ba31-5ed7c146594d.png)
   
   インストールはダウンロードしたものを実行して、インストーラーに従ってインストールすれば問題ないです。
   
   起動するときにも、ログインポップアップが表示されるので、アカウントでログインする必要があります。
   
   ログインすれば本体の準備は完了です。
　
　2. JDK
  　 インストールガイドの [Installing Corona SDK — Windows](https://docs.coronalabs.com/guide/start/installWin/index.html)では[JDK7](http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html)をインストールするとのことですが、[JDK8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)でも問題ありませんでした。
    また、現在JDK7だとログインを求められました。

　3. Editor
    ここではSublimeをインストールして使う方法をご紹介します。
    
　[Sublime公式](http://www.sublimetext.com/)の下の方にダウンロードがあるので、クリックしてダウンロードします。
    こちらもインストーラーに従ってインストールすれば問題ないです。

　4. プラグインのインストール
 　少し複雑なので、こちらを参考に
  http://d.hatena.ne.jp/xyk/20131001/1380610973
  　SublimeにプラグインをインストールするためのPackage Controlをインストール、設定します。
   
   そして、Package Controlをインストールできれば、「Prefelence > Pacage Control」または「Ctrl + Shift + p」で「Command Palette」を起動します。
   そこで、「Package Control: Install package」を入力して「Package Control」を起動して、
   
　![coronaSDKIS07.png](https://qiita-image-store.s3.amazonaws.com/0/34658/8f167306-00b6-0acd-ee2a-bd8696bc94db.png)
  
   「Corona Editor」すれば、「Corona Editor」があるので、インストールします。

　 5. CoronaSimulatorとEditorの関連付け
 　最後に CoronaSimulatorとEditorの関連付けを行います。
  　CoronaSimulatorを起動、NEW PROJECT、アプリ名とプロジェクトの保存場所を指定して、OKをクリックします。
   
  「File > Open in Editor」をクリックして、関連付けるEditorのEXEを選択して、開くをクリックすると関連付けされます。
  
![coronaSDKIS06.png](https://qiita-image-store.s3.amazonaws.com/0/34658/e6a0627c-28ec-5aea-b18c-607e08dbe1a8.png)

  これにて環境構築は完了です。

## 少し使ってみる
　[Corona in 5 Minutes](https://docs.coronalabs.com/guide/start/helloWorld/index.html)を参考に最初の一歩、Hello Worldを画面に表示してみました。
 
![coronaSDKIS08.png](https://qiita-image-store.s3.amazonaws.com/0/34658/16cf974d-e0b9-9f04-3770-8b626e913f41.png)

## 少し使ってみて良かったと思ったところ
- すぐに結果が表示される
  Editorでセーブを行うとシミュレーターで実行するかポップアップが表示される。(初期)
  実行ショートカットでの実行もできる。

- 入力補助が良い
　入力途中に候補の表示、スニペットが登録してある。
 
## Coronaに興味を持ったきっかけ
 http://www.slideshare.net/sterai1/coronasdk
 便利、開発しやすそうと思いました。
[Bitbucket]リポジトリを最初にpushする方法

##やりたいこと
Bitbucketにリポジトリをあげたい

##やったこと
1. AndroidStudioでプロジェクト作成
2. Bitbucketで
リポジトリ->作成->名前入力->作成
3. Command line （どちらなのかで迷う）
 - 私はゼロからスタートします。
 - I have an existing project
4. I have an existing projectだろうと思い、進める

##エラー
`git push -u origin --all`としたところで

```
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
Everything up-to-date
```
もう一度pushしてみると

```
error: src refspec master does not match any.
error: failed to push some refs to 
```

##解説
```
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
Everything up-to-date
```
これはリモートリポジトリ上にまだmasterブランチが作成されていないというエラー
初めは省略しないでブランチ名を書く

>参考
逆引き Git TOP > トラブルシューティング
http://www.backlog.jp/git-guide/reference/trouble-shooting.html

```
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
Everything up-to-date
```
これはコミットしてないというエラー
commitをしてからpushする

>参考
解決: src refspec master does not match any. failed to push some refs to.
http://d.hatena.ne.jp/nishiohirokazu/20110304/1299229916

##最終的にやったことまとめ

```
git init
git remote add origin https://-----
echo "アカウント名" >> contributors.txt
git add contributors.txt
git commit -m "first commit"
git push -u origin master
```
結局
「私はゼロからスタートします。」を選択すれば良かったのでした。
テキスト選択→コンテキストメニューでリマインダに登録


リマインダ使ってますか? 必要にして十分て感じだし iOS と同期取れるし結構使えますよね。

ところで私はやることを箇条書きにしてメールでやり取りすることがよくあります。これはリマインダに登録すべきですが、一発で登録する方法がありません。実のところ、テキストを選択してコンテキストメニュー[共有]→[リマインダ]で登録できるのですが、複数行あっても一項目に押し込められてしまいます。私がやりたいのは一行につき一項目にしたいのです。

Automator や AppleScript を使えばできそうな気がしたので少し調べてみたら出来ました。

## 作る

まず Automator を起動してください。![スクリーンショット 2016-02-05 13.14.04.png](https://qiita-image-store.s3.amazonaws.com/0/5459/4075bde7-2ca7-d0ae-8258-a15a955a59df.png "スクリーンショット 2016-02-05 13.14.04.png")
「サービス」をダブルクリックしてください。

ライブラリから「シェルスクリプトを実行」「AppleScriptを実行」を順にダブルクリックします。![スクリーンショット 2016-02-05 13.17.57.png](https://qiita-image-store.s3.amazonaws.com/0/5459/e62c4edc-a377-5a1a-f281-c99a22696086.png "スクリーンショット 2016-02-05 13.17.57.png")
こんな感じの画面になります。

「シェルスクリプトを実行」は「シェル」を `/usr/bin/ruby` にして以下のように入力します。

```ruby:
# coding: utf-8
STDIN.read.force_encoding("UTF-8").split(/[\n\r]+/).each do |f|
	line = f.sub(/^[*・]\s*/, '')
	next if line.empty?
	puts line
end
```

これは各行の頭から「*」や「・」を取り去っています。プレーンテキストで箇条書きをするときはこれらの文字を行頭につけることが多いですが、リマインダに登録するときは邪魔だからです。

そして「AppleScriptを実行」には以下のように入力します。

```AppleScript:
on run {input, parameters}
	set ListName to "Import"
	set entries to input
	tell application "Reminders"
		if (not (list ListName exists)) then
			make new list with properties {name:ListName}
		end if
		set mylist to list ListName
		tell mylist
			repeat with i in entries
				make new reminder with properties {name:i}
			end repeat
		end tell
	end tell
	return input
end run
```

そして保存してください。名前は「リマインダへimport」とかでもしてください。

## 使う

適当にテキストを選択してコンテキストメニューを表示 (右クリックや二本指クリック) すると「リマインダへimport」があるはずです。それを選択してください。

リマインダを開くと「Import」というリストがあるはずです。そこに先ほど選択したテキストが一行一項目として登録されているはずです。あとは適当なリストに振り分けてください。

とりあえずテキストを選択してリマインダに登録、その後リマインダ上で整理というワークフローを想定しています。

以前は一行ずつリマインダへコピペしていた作業がたいへん楽になりました。

## Automatorについて
いろいろ便利なんですが各行ごとにループして処理とか複雑なことはできません。ですがサービスやらアプリケーションやらを簡単に作れてシェルスクリプトとの受け渡しをしてくれるので、これに外側の処理を任せると osx の GUI を使った便利な機能が比較的簡単に実現できます。

今回はアプリケーションの操作があったので AppleScript を使いましたが、いろいろ癖がある文法で大変でした。30年近く前に HyperTalk をいじくっていたから楽勝かと思っていたらそんなことありませんでしたw そうか[HyperCard](https://wirelesswire.jp/yomoyomo/201403190930.html) の衝撃からもう30年近く経っちゃったんだ…。
Sabel: Formを使ったModelの追加保存方法

```php:controllers/User.php
  public function save()
  {
    $form = new Forms_Person(); // ... 1
    $form->submit($this->POST_VARS, ['name', 'email']); // ... 2
    $form->save(); // ... 3
  }
```

1. フォームをnewする。
2. `POST_VARS`を使って入力値を渡すとともに、フォームで扱う入力値を第二引数で明示する
3. 保存。DB関連のエラーは例外になるので、コントローラではエラーをハンドルしなくていい。
ケバブケース（kebab-case）について調べた

# 動機

キャメルケース（*CamelCase*）は知っていたが、HTMLやCSSなどで使われているハイフン（-）で単語を区切ることを何というのか気になったので、調べてみた。

# 調べた結果

**ケバブケース**（*kebab-case*）というらしい。Lispでも使われるので *lisp-case* とも。

# 疑問

何故 **ケバブ** ？
理由を探したが見つからなかった…。

→ **「串刺し」** だからだそうです（コメントより）。@riocampos @__hage さん、ありがとうございます！ :smile:

# まとめ

| 名称           | 用例       | 主な言語                |
| -------------- | ---------- | ----------------------- |
| キャメルケース | camelCase  | Java, JavaScript        |
| スネークケース | snake_case | PHP, Python, Ruby       |
| ケバブケース   | kebab-case | HTML, CSS, Lisp         |

# 参考にしたサイト

- http://stackoverflow.com/questions/11273282/whats-the-name-for-hyphen-separated-case
- https://en.wikipedia.org/wiki/Snake_case
- https://en.wikipedia.org/wiki/CamelCase
- https://en.wikipedia.org/wiki/Naming_convention_(programming)
- https://ja.wikipedia.org/wiki/ケバブ

*lodash.js* にはケバブケースに変換する関数がある。

- https://lodash.com/docs#kebabCase

本文に関係ないけど、Web系の命名規則の推奨されるやり方が載っていたので、メモしておく。

- http://www.w3schools.com/html/html5_syntax.asp
Slackで簡単スケジュール調整！！（要設定、プラグイン不要）

@smd8122さん が書いた[5秒でできる！slackで簡単スケジュール調整（設定・プラグイン不要）](http://qiita.com/smd8122/items/3dc1e8b9b6446cdc095c)から進化しました。

# 百聞は一見に如かず

<img width="640" alt="スクリーンショット 2016-02-03 17.31.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/93918/654cd58b-c998-8e60-17c9-0e24469b69cc.png">


# 設定内容
Slackに自分(各自)のアイコン画像のEmojiを登録するだけです。
<img width="209" alt="スクリーンショット_2016-02-05_13_46_11.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/93918/bcfaea0b-d64c-a03e-f177-8c6c787c4016.jpeg">

投票以外にもｳｨｯｽ ｵﾅｼｬｽ みたいな軽い返事にも使えるのでお勧めです！

なお決まったボドゲ会は[こちら(2016/02/11(木))](http://tiger.connpass.com/event/26666/)から申し込みできます。お食事会になるかは不明！！

先着順ですので、ぜひぜひ。
vimで編集中のテキストファイルにシェルの実行結果を貼り付けるには

## 実現したいこと

Vimで編集中のテキストファイルにシェルの実行結果をマウスを使わず貼り付けたい

## 実現方法および解決方法

* まずvim で ノーマルモードに入リます。
* 次に :read ! シェルで実行したいコマンド を入力します。

## 実行コマンド

* まずvim で ノーマルモードに入リます。
* 次に :read ! シェルで実行したいコマンド を入力します。

### 例

```
:read ! /bin/date
```

または、

```
:read ! date
```

![output01.gif](https://qiita-image-store.s3.amazonaws.com/0/49795/8c8c7ec2-df59-d4c0-dd38-9d1460bd0fa6.gif)


## 情報源

なし

## 補足

なし
初めてgruntを使ってみた

※ウインドウズでやってます

## よくわからない説明多すぎる。

> タスクランナーです。

日本語をしゃべってほしい。

##ざっくりいうと、制作の補助をしてくれるみたい。

例えば
・cssファイルを複数作ったのをひとつにファイルにまとめてくれる。
・jsファイルを圧縮してくれる

cssファイルまとめるのは

header.css
main.css
footer.css

で作って、min.cssっていうのにまとめてくれる機能がある。みたいな感じ。もちろんhtmlからの参照はmmin.cssだけで、header.cssとかはサーバーとかにもあげない。

##とりあえず、インストール

**node jsは最新を入れるとこから始める。**
※古いリファレンスで、古いバージョンをインストールして動かなかった

node.jsをインストールしたらgruntのインストール

```lang:コマンドプロンプト
npm i -g grunt-cli
npm i -S grunt
```
これでインストールできる。

```lang:コマンドプロンプト
npm --version
```

でgrunt-cli、gruntの2つのバージョンを確認できればインストールできてる。


* * *
##ここから下は各プロジェクト毎で行う

ワークスペースを作ったら（フォルダでも/htdocsみたいな）

```lang:コマンドプロンプト
npm install -g grunt-cli
```
で、そのフォルダの中でgrunt動きますよーって設定ができる。項目は適当でどうでもよければエンターでスキップ。名前とかいろいろ。

package.jsonってファイルが出来ているのだけど、ここに記述が追加されてるだけ。あんまり説明もしなくてもいいかな。今回は。

Gruntfile.jsを自分で用意します。新規ファイルを作って配置します。下記を一応コピペしておいても大丈夫です。

```lang:Gruntfile.js
module.exports = function(grunt) {
  grunt.initConfig({
   
  });
};
```

　
* * *
ここまででgruntを使う準備が出来ました。
##各プロジェクト毎で異なるプラグインを入れたりする。

　
**grunt-contrib-watch**
ファイルを監視してgruntを実行してくれる（ファイルの変更の毎とかでできる）


```lang:コマンドプロンプト
npm install grunt-contrib-watch --save-dev
```

を実行するとインストールされる。


次に今回はcssをまとめる、プラグインをいれる

**grunt-contrib-cssmin**
cssをまとめるプラグイン

```lang:コマンドプロンプト
npm install grunt-contrib-cssmin --save-dev
```

で使うものをGruntfile.js内に記述する

```lang:Gruntfile.js
module.exports = function(grunt) {
  grunt.initConfig({
   cssmin: {//cssフォルダ内の.cssを結合してstyleフォルダの中のmin.cssに変換
      compress: {
        files: {
          './style/min.css': ['css/*.css']
        }
      }
    },
    watch: {//cssのフォルダ内の.cssを変更するとcssminを実行
      files: ['css/*.css'],
      tasks: ['cssmin']
    }
  });
　//プラグインを使う宣言（他言語でいうところのimportみたいな）
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-contrib-watch');


  //grunt実行の時に、利用するプラグイン名を毎回いれなくちゃいけないのだけど
　//その作業を割愛してくれる。
  grunt.registerTask('default', ['cssmin', 'watch']);
};
```

##これで準備は完成しました

ワークスペース内でコマンドプロンプトで

```lang:コマンドプロンプト
grunt
```

を実行すると、動き出すので、そのままウインドウを閉じないで

css/test1.css
css/test2.css

みたいなのを作ると、

style/min.css

が出来ます。（Gruntfile.js内を参照）


で作業終えたら、コマンドの画面で
ctrl+C

でやめる？って聞かれるのでYで終了

##この後何をすればいいの

何ができるの？っていうのは下記がよくまとまっていました。

[Webサイト制作に便利なGruntプラグイン1](http://qiita.com/megurock/items/54872c26e45017cd36a1)
[Webサイト制作に便利なGruntプラグイン2](http://qiita.com/megurock/items/4b0988374df0caa822fd)


今後のフローとしては、

自分の毎回使うプラグインが決まったら、Gruntfile.jsもほぼ固定で、プラグインのインストールもコピーの貼り付けで環境を作るのかな。という印象でした。
Office365 > Outlook > 勝手に迷惑メールと認識する機能を切る

Outlook web appを開いたら、以下のタイトルのメールが含まれていた。

「低優先メール機能が今までにない新しいメッセージを....」

内容としては、<font color=red>outlookが勝手に迷惑メールを認識して迷惑メールフォルダーに移していている</font>とのこと。重要なメールも一緒に。。。

### 認識機能を切る方法

1. 上記のタイトルのメールを開く
2. メール最下部の「低優先メールとして識別されたアイテムの仕分けを停止する場合は[オプション]に移動します」という記載の下線付きをクリックする。
  - 低優先メールの設定に飛ぶ
3. 以下のチェックをはずす
  - 低優先メールとして識別されたアイテムを分離する
4. 保存を押す
windows 10 > 日時がおかしくなる症状(数時間ずれる) > Windows Time設定をAutomaticにしておく

気づいたらWindows10の日時がまったく違う日付になっていた。

以下の例では数時間ずれていて、その対策が記載されている。

https://www.organicweb.com.au/20209/general-technology/windows10-time/

キーワード

- services.msc
- Windows Time
  - Automaticにしておく
Upverter > PiZeroの外形を描こうとしたが失敗

Upverterで以下の外形だけの図を作成できないかと試した。

[PiZeroのサイズ pdf](https://www.raspberrypi.org/documentation/hardware/raspberrypi/mechanical/rpi-zero-v1_2_dimensions.pdf)


https://upverter.com/7of9/55c9c2a9aba3214a/PiZeroOutline/

Scheme-itでは用意されているただのダイアグラム(四角やただの線などの)描画機能がUpverterにはない。回路部品に特化しているというのは一つのいい考えではある。
Upverter > フォントサイズは変更できないようだ

Upverterでフォントを記載する機能がある。

フォントが小さいので拡大する機能を探しているが見つからない。

https://forum.upverter.com/t/how-to-control-text-size-and-font-type-in-symbol-editor/22832

> There are no text/font options for symbol text.

2016年1月29日の回答。

フォントサイズはそのままで使うことになる。

a feature request ticketが切られたようだが、優先度は不明。


上記のやりとりで気になったのは、「フォントサイズ変更の機能はないの?」という問い合わせに対して、向こうのエンジニアが「標準のフォントサイズでは十分でないの?」と回答している点。
Michael Abrash Interview 6

http://qiita.com/7of9/items/63150c42fb2022292138
の続き

Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)

(2:54-)
I never listened what <font color=red>XXX1 (youに聞こえるがDick Hawordのはず)</font> actualy says. But that was a lot of fun. And then I took an assembly class that summer. 

(3:00-)
And, suddenly, there was a <font color=red>XXX2</font> remember, there was a point which I realized that this wasn't another language. This was how the computer works. That was quite revolution.

(3:06-)
All the skills I had 10 years ago, <font color=red>XXX3 XXX4</font> thirty, they are not really usefull except how to analyze the problem. I mean ...

5分のリスニングとタイピング終わり。


赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。


雑になってきている今日この頃。
ボタンをタップした時にTabBarの表示タブを切り替えたい


ボタンをタップした時にTabBarの表示タブを切り替えたい！
という欲のままNavigationControllerとかstoryboardIDとか使ってごちゃごちゃ書いてみたけど出来ず。

結局これだけでした。１行かーい。

```
-(IBAction)buttonPushed {
   self.tabBarController.selectedIndex = 0;
}
```
数字はTabBarのインデックスで、左から0,1,2,3...と設定されています。

はい解決。
CakePHP2→3の変更ポイントまとめ

個人用のメモですが、CakePHp2系しか使ったことがなく、新たな案件で初めてCakePHP3系を使うので、変更点をまとめてみました。
何かあれば、随時更新する予定です。

## フォルダ構成
* app → src
* app/Test → tests
* app/Plugin → plugins
* app/tmp → tmp
* app/Vender → vender
* app/Webroot → webroot
* app/View　→　src/template

##Controller
### Modelオブジェクトの取得
```
// CakePHP2
$posts = ClassRegistry::init('posts');
// CakePHP3
$posts = TableRegistry::get('posts');
```

## Model
* Modelクラスではなく、TableとEntityの各オブジェクトでORMを実現する

### Table
* 単一行のデータ取得

```
// CakePHP2
$posts->id = $id;
$post = $posts->read();
// CakePHP3
$post = $posts->get($id);S
``` 

### Entity
* TBD

### バリデーション
* Modelクラスのvalidateプロパティではなく、Validaterクラスで完全に独立している
* TableクラスのvalidationDefaultメソッドの引数に渡されるValidatorクラスのオブジェクトに設定する
* エラーはEntity::errorsメソッドで取得可能

## View
* TBD

## シェルの実行方法
* Console/cake 【シェル名】 → bin/cake 【シェル名】

## 参考
* [CakePHPのフォルダ構成](http://book.cakephp.org/3.0/ja/intro/cakephp-folder-structure.html)
* [データベースアクセス & ORM](http://book.cakephp.org/3.0/ja/orm.html)
* [テーブルオブジェクト](http://book.cakephp.org/3.0/ja/orm/table-objects.html)
* [エンティティ](http://book.cakephp.org/3.0/ja/orm/entities.html)
* [バリデーション](http://book.cakephp.org/3.0/ja/core-libraries/validation.html)
テキストをカジュアルに暗号化したい

ちょっとした機密情報(変な日本語)を渡すときみなさんどうやってるんでしょうか。
いろいろなやり方や思想があると思いますが、一様に手間だなーって思ってました。

まあセキュリティと運用はトレードオフなので、しかたないような気もするんですが、
もっとカジュアルに機密情報やり取りしたいぜ！と思って下記の暗号化のコマンドを作ってみました。

https://github.com/ngc224/txtmsk

インストール
-----
    $ brew install ngc224/txtmsk/txtmsk

brewで入れられます
カジュアルですね

使い方
-----
    $ txtmsk -p

上記のオプションでまずキーチェーンにパスワードを登録します
暗号化も復号化もこの設定したパスワードで行います
なのでもうパスワードを打ち込む手間がかかりません！とてもカジュアルですね
というわけで、今のところはMacOSXでしか使えません！

暗号化する
-----
    $ echo "aaaaaaaaaaaaaaaaaaaa" | txtmsk
    GFKm0AD9g0yyUdCc6cq44sX+D6CAyWnqzoxa4jU0rZdC4ZOc

単に標準入力でテキストを渡すと暗号化してくれます

ただこれだとヒストリに残るのでこんな感じでつかうといいかも

    $ cat database.yml | txtmsk > database.yml.msk

復号化する
-----
    $ echo "GFKm0AD9g0yyUdCc6cq44sX+D6CAyWnqzoxa4jU0rZdC4ZOc" | txtmsk -d
    aaaaaaaaaaaaaaaaaaaa

-d オプションをつけると復号化されます

-----

暗号化の方式はAESです
golangにはビルドインで入っていました

詰まったところはパイプで使うコマンドとして作っていて、

    $ txtmsk

とかしたときに標準入力の入力待ちでブロックされるのでどうしたもんか悩んでたのですが、
下記パッケージを使ったら

https://godoc.org/golang.org/x/crypto/ssh/terminal

    if terminal.IsTerminal(0) {
        ...
    }

とかやって取れました。
すげー便利
JavaScriptのsetMonthについて

### JavaScriptで日付（主に月）の加算・減算をしたい人必見！！！

やり方をググると、色々なページで解説がありますね。
僕もググりました。殆どがsetMonthを使ってますね！

```lang:javascript
var date = new Date('2015/1/31');
date.setMonth(date.getMonth()+1);
```

**「「「しかし、、、コレちょっと危険なんです！！」」」**

上記のコードを実行して、dateの中身をみてください。

期待した結果：2015/02/28
実際：2015/03/03

おそらくですが、
2月31日（あり得ない）　－　2月28日（現実）　＝　3日
2月28日（現実）　＋　3日（あまった日数）　＝　2015/3/3（結果）
このような計算が行われていると思われます。
今回は加算でしたが、減算でも起こり得ます。

なぜこうなったのか。。。ヒントはwikiにありました。

> JavaScriptという言葉は狭義にはMozillaが仕様を策定し実装しているスクリプト言語を指す。このスクリプト言語はEcmaインターナショナルでECMAScript (ECMA-262) として標準化されており、多くのWebブラウザー等はこの標準化されたECMAScriptを実装している。(https://ja.wikipedia.org/wiki/JavaScript)


上記の文にあるECMAScriptのリファレンスを読んでみると。。。。。
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.5.38
ここにしっかりと書いてあるっぽい。

### 気をつけて
きっと知らずに使っている方はいっぱいいらっしゃいます。
みなさん気をつけてくだせぇ！！！

ライブラリを使って解決したり、月初でsetMonthやったりと、
対策もたくさんあります！
一番良いのは何かを考えながら実装するのも楽しいですね！
JAVA サーブレットクラスでHTMLを出力

##サーブレットクラスでHTMLを出力

```java
response.setContentType("text/html; charset=HTMLの文字コード");
PrintWriter out = response.getWriter();
out.println("…");
```
<font color="ff0000"><重要></font>
※「java.io.PrintWriter」をインポートする必要がある。
※「response」はHttpServletResponseのこと。

▪️Test06Servlet.java

```java
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Test06Servlet")
public class Test06Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter testPrint = response.getWriter();
		testPrint.println("<html>");
		testPrint.println("ServletでHTMLを出力テスト");
		testPrint.println("</html>");
	}

}
```

▪️Test06Servlet.java 実行結果
![スクリーンショット 2016-02-10 18.18.20.png](https://qiita-image-store.s3.amazonaws.com/0/95187/fb4546b5-69e6-6247-1b07-6de327c1e78b.png)
監視ツールのDataDogが便利だった

今更ですが、サービスで使ってみて便利だったので簡単にまとめます。
本家はこちら
https://www.datadoghq.com/lpg/

便利だった部分としては「メトリクスにタグを付けてドリルダウンで分析」とシンプルにここなんですが、諸々の設定とかも楽でした。

# Datadogの概略
## Datadogとは
サーバなどのモニタリングサービスをSaaS形式で提供してくれる。
ホストの監視はもちろんアプリ側からもユーザー動向等を飛ばしてログ化できるなど広くサポート。
グラフの描画が綺麗なのと、tagを使った多次元解析が便利です。

## 基本用語

### Metrics
サーバーなど各種ホストから送られてくる情報。key value＋タグの構造。とれるvalueの形式は限られている模様（参照：http://docs.datadoghq.com/ja/guides/metrics/ )

### event
テキスト形式の監視状況等を伝える情報。タグ付け優先順付けコメントなどで、対応完了までをウォッチできる

### Monitor
Metricsを監視し、dataがこない、閾値を超えたなどの情報をもとにeventやメールなどで通知を飛ばす。Chatworkなど外部サービスとの連携も可能

## 初期設定
### サーバーへのインストール
agentをinstallするコマンドを管理画面から取得し、サーバー上で叩くとインストール・起動まで完了する
※トップ→Integration→Agentに行くと以下の様なスクリプトが準備されている

```
DD_API_KEY=xxxxxxxxx bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/xxxxx.sh)"

```
### タグの付与
各サーバーごとにタグを付与し、タグごとにまとめてグラフ表示、モニタリングが可能。
運用では、必要に応じてAPIの役割ごとや、本番/Stageなどの環境ごとにタグをつけています

### 諸々の監視設定（例 サービスの死活監視設定)
サーバーのメモリ使用量などなど基本的なことはデフォルトでやってくれますが、
サービスの死活監視等をやりたいとなると設定が必要です。

例としてUnicronのプロセス監視の方法を載せてみます（もっといい方法があるのかもしれませんが。。）
Datadogのagent check機能を使い、Unicornのmaster process数を監視する
checks.d/api_unicorn.pyとconf.d/apiunicorn.yamlの2ファイルを作成し、dd-agentをリスタートする

```yaml:/etc/dd-agent/conf.d/api_unicorn.yaml
init_config:

instances:
    [{}]
```

```py:/etc/dd-agent/checks.d/api_unicorn.py

from checks import AgentCheck
import subprocess
class ApiUnicornCheck(AgentCheck):
  def check(self, instance):
    cmd = "ps aux | grep '[u]nicorn master.*xxxxxx' | wc -l"
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out,err = proc.communicate()
    self.gauge('your.metrics.name', out)

```



dd-agentのリスタートすることで監視がスタートします
`sudo /etc/init.d/datadog-agent restart`

その他にも「ELB経由でのhttpアクセスの監視」などなど監視していますが、
設定は簡単でした。



## その他
### Datadogとchatworkの連携
chatworkと連携して、イベントを通知することもできます。
トップ→integrations→chatwork configure
ガイダンスに従って設定する
Room NameはDatadog内での呼び名。chatworkのroom名と一致している必要はない
Room idはchatworkのページurlの#!rid以降
例:https://www.chatwork.com/#!rid12345678　なら 12345678


# 今回便利だったこと
前置きが長くなりましたが、

Railsアプリであるモデルのafter_createでhas_manyのinstance数分だけsidekiqのプロセスが走って、値を集計するようなプログラムが有り、
どいつかわからんけど集計されていない（sidekiqのプロセスは死んでいない）ということがあったんですが、
Datadogのincrementログを仕込んで、必要情報はタグでペタペタつけていったら、
あとから分析が一発でした。
アプリ側のログ的な使い方もできるようです。

グラフはこんな感じで出せます
モザイクばかりでなんのことかわかりにくいですが、
対象のメトリクスに対して、tagで絞り込み、さらに別のtag毎にグラフを描画したりできます。
tagの絞り込みも複数で来たり表示の仕方もいろいろ選べるので、柔軟性が高そうです。

![mdスクリーンショット 2016-02-04 17.02.20.png](https://qiita-image-store.s3.amazonaws.com/0/66072/64b46838-cb39-f301-105a-a5cf16aeba5e.png)
CSV.tableでゼロ埋めされてる数値を読みこめない罠


RubyからCSVファイルを読み込む時にCSV.tableメソッドが大変便利で愛用していたのですが、
データによっては正しく読み込めないことがあったので原因と対処をまとめます。

## 起きた問題
以下のようなCSVをCSV.tableで読み込んだところ、emp_noが正しく読み込まれませんでした。

```sample.csv
emp_no, name
010, 栗山英樹
```

```ruby:sample.rb
csv = CSV.table('./sample.csv', {:encoding => 'UTF-8'})
csv[:emp_no][0] #=> 8

```

勘の良い方ならおわかりかと思いますが、'010'という文字列が８進数の数値だと思われてしまっているようです。

## 原因
なんでこんなことになるかわからないので、CSV.tableのソースを見てみたら以下のようになっていました。

```ruby:csv.rb
  #
  # A shortcut for:
  #
  #   CSV.read( path, { headers:           true,
  #                     converters:        :numeric,
  #                     header_converters: :symbol }.merge(options) )
  #
  def self.table(path, options = Hash.new)
    read( path, { headers:           true,
                  converters:        :numeric,
                  header_converters: :symbol }.merge(options) )
  end
```

要はCSV.tableは、より一般的なCSV.readに良い感じにオプションを渡しているだけのラッパーなんですね。

で、問題になるのはこの```converters: :numeric```の部分です。
リファレンスマニュアルのcovertersの部分を読むと以下のような記述が

>:integer
>Kernel.#Integer を使用してフィールドを変換します。
>:float
>Kernel.#Float を使用してフィールドを変換します。
>:numeric
>:integer と :float の組み合わせです。

```Kernel.Integer``` は数値と判断できる文字列を整数に変換しますので、
"010"は8進数だと判断されて数値の8に変換されてしまっていた、ということです。

## 対処法

convertersにnumericを使わないようにオプションを指定してあげます。

```ruby:sample.rb
csv = CSV.table('sample.csv', {:encoding => 'UTF-8', :converters => nil})
```

これで直りました。