OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでSioriを開発した体験記


[![SIORI（1_39ページ）.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/db0bf94a-0068-3672-21b2-3b916ff06234.jpeg "SIORI（1_39ページ）.jpg")](http://www.slideshare.net/susieyy/swiftsiori)



じげんさん、Pixivさんの勉強会で登壇したプレゼン[「SwiftでSioriを開発した体験記」](http://www.slideshare.net/susieyy/swiftsiori)を公開しました。Swiftで作られたアプリはまだ少ないので、どのように開発をしたのかを中心にお話しました。iOS8のリリースにあせて開発を行い、UIUXにこだわった開発の裏側をお見せします。
kobito2.0.0へデータを移行した時の作業めも


たまたまMacを取り替えるタイミングで発生した作業のためメモを残します。
メジャーバージョンがあがってDBのパスがかわったところがはまりどころでした。


### backupを取得する。

移行元

```bash
tar zcvf kobito.tar.gz ~/Library/Kobito/Kobito.db
``` 

### ファイルを転送する。

mac同士のため、AirDrop実施しました。
転送時間は数秒です。


``` bash
cp ~/Dropbox/local/Kobito.db ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
```


###解凍

```bash
tar zxvf ~/Downloads/kobito.tar.gz
```

### 移動
解凍されたファイルをコピーします。
Kobito1.X系とはパスが異なります。

```bash
cp Kobito.db ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
```

### 完了後作業

Kobitoを起動して移行が出来る事を確認します。
AWSのPOODLE脆弱性の対応

2014年10月14日　SSLv3のPOODLE問題のセキュリティ脆弱性が発表された。

##ec2での対策

SSLの設定ファイル（/etc/httpd/conf.d/ssl.conf)でSSLProtocolを以下のようにしリスタートする。

```
SSLProtocol All -SSLv2 -SSLv3
```

```
sudo /etc/rc.d/init.d/httpd restart
```

参考：http://dev.classmethod.jp/cloud/aws/cve-2014-3566-poodle-issue/
Elastic Beanstalkで動的に生成されるインスタンスをsensuで監視する（其の①）



まずは、実験環境を構築する。
ちなみに作業環境はmac(10.9.5)。

今回はAWSドキュメント(※)を参考に、Elastic BeanstalkでSinatraアプリケーション環境を構築してみる。
(※) http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby_sinatra.html

ほぼほぼドキュメント通り。

```
# mkdir HogeHogeApp
# cd HogeHogeApp/
# git init .
# eb init
# eb start
# git add .
# git commit -m "Initial commit"
# git aws.push
# eb status --verbose
```

途中、botoがなくて怒られたので以下で対応。

```
# easy_install boto
```

ほぼほぼドキュメント通りで環境は作れた。
ここまでは、まずまず順調(*´꒳`*)
インスタンスも立ち上がった。

立ち上がったインスタンスにssh接続しようとするが繋がらない。
Security Groupを確認したところ、tcp:80しか開いていない。

ここでポイントの豆知識！
Elastic Beanstalkのssh接続は、Elastic Beanstalkの"Config"を変更することで可能になる。
"Instances"の"EC2 key pair:"を設定してやる必要がある。
![AlertMailChecker-env_-_Configuration_1.png](https://qiita-image-store.s3.amazonaws.com/0/51320/442a52b5-00f3-a153-fffb-a7139c9da8f2.png "AlertMailChecker-env_-_Configuration_1.png")



設定してやると、Security Groupにtcp:22が開いたインスタンスが起動し直された。
（接続元IPアドレス制限がないのが気になるが。。。）

これで実験環境の準備が整った。
次回はsensuクライアントを設定する。

（おまけの豆知識）
Beanstalkは、Bean-stalk（豆の茎）である。
Beans-talkではない。
![mame.png](https://qiita-image-store.s3.amazonaws.com/0/51320/19e12b53-e091-4701-ed3e-1dd29ee36610.png "mame.png")
Elastic Beanstalkを一時停止する


Elastic Beanstalkの豆知識。

コスト削減のため、インスタンスをstopしておきたい。
でも、設定できるElastic BeanstalkのScalingに設定できるインスタンス数の最小値は’１’。
インスタンスを停止しても、ありがた迷惑にも最低１個は自動で起動し直してくれる。。。


そんなときは、以下のコマンドを使う！

```
# eb stop
```

再開は

```
# eb start
```


なお、Management Consoleからは、上記の操作はできない模様。
Rubyでsed -i的なことをやる

シェルからワンライナーじゃなくて、rubyスクリプト内で実行したいです。

fileutilsに追加しちゃいます。

```rb
require 'fileutils'

module FileUtils
  def self.sed_i(file, pattern, replacement)
    File.open(file, "r") do |f_in|
      buf = f_in.read
      buf.gsub!(pattern, replacement)
      File.open(file, "w") do |f_out|
        f_out.write(buf)
      end
    end
  end
end

# usage
FileUtils.sed_i("test.txt", /abc/, "ABC")
```
5K iMacでのiPhoneデザイン 〜 アプリ起動用の画像素材を秒速で！

#はじめに
5K iMacを購入する資料として作成しはじめて
ついでにLaunchImageのアウトプット用にまとめています。

アプリをAppleへ転送するときになって

**起動画像が足りません**

と怒られます。
作るのにデフォルトの画像を用意するの面倒です。

サイズいくつだっけー？
何倍にするんだっけー？

って言ってたら

PhotoShopCC
>https://creative.adobe.com/ja/plans?store_code=jp

秒速で生成できます。

#制作環境
>Photoshop CC 2014
Mac OS X Marvelicks

#画像アセット

Node.jsサーバを含んだ画像生成機能です。adobeがGithubでソースを公開しています。
>http://www.atmarkit.co.jp/ait/articles/1310/28/news065.html

拡張（SVG対応などのTipsもあり）も自分でできる。
>http://stocker.jp/diary/photoshop-generator-svg/

#画像Assetを使って生成

（１）グループ別にLaunchImageを作成
![スクリーンショット 2014-10-17 9.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/9fda563a-7d95-6d7d-781d-f0e251c8a0d3.png)

（２）ファイル > 生成 >画像アセット
![スクリーンショット 2014-10-17 9.16.49.png](https://qiita-image-store.s3.amazonaws.com/0/12362/c144206f-bea5-12a5-2a78-6472fe5f9405.png)

（３）PSDファイルの置き場所と同じ階層に一式が作成
![スクリーンショット 2014-10-17 9.18.21.png](https://qiita-image-store.s3.amazonaws.com/0/12362/2fb893ca-2906-9b95-cc47-e8bf62b3ce40.png)

##github
今回作ったものはここに置きました。
https://github.com/fu-yu/iOS_Resources
置いた時点では、iPad用のAssetsを追加しています。

今のXcode6だとiOS8よりの前のバージョンでiOS7用の画像を用意することが
考慮されているとはいいがたいので
そのまま当てに使ったり、グループ分けした設定を再利用して
起動用画面作成に利用していただけるとうれしいです。

#参考URL

iOS Human Interface Guidelines 〜 Launch Images
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/LaunchImages.html#//apple_ref/doc/uid/TP40006556-CH22-SW1

iPad全シリーズ比較
http://www.ipad-hikaku.com/series.html

Appleからの試練が俺を強くする デザイン編
http://blog.makotokw.com/2013/10/02/appleからの試練が俺を強くする-デザイン編/

#さいごに
Appleは5K iMacを売るためにiPhone6 Plusを用意したんじゃないかと・・・
でも高いです。この画像で開発環境の充実に説得力をもたせられたらな思惑もありで作っています。
今回も`PhotoShopCC` から画像アセットの機能を使うことで、解像度別の画像作成が楽にできました。
AndroidアプリでSSL証明書を適切に検証しない脆弱性を作らない

AndroidアプリSSL証明書を適切に検証しない脆弱性を作らない - 「Androidアプリのセキュア設計・セキュアコーディングガイド」より

# Android アプリ SSL証明書を適切に検証しない脆弱性
* https://www.ipa.go.jp/about/press/20140919_1.html
* http://blog.tokumaru.org/2014/09/androidkindlesslcve-2014-3908.html
* https://jvn.jp/vu/JVNVU90369988/index.html

# この脆弱性を作らない方法
『Androidアプリのセキュア設計・セキュアコーディングガイド』【2014年7月1日版】
https://www.jssec.org/report/securecoding.html
の「5.4. HTTPSで通信する」(P.336) に説明がある
特に「5.4.2. ルールブック」(P.349) 
具体的には

* TrustManagerを変更しない、独自のTrustManagerを作らない
* HostnameVerifierを変更しない、独自のHostnameVerifierを作らない
* SSLExceptionに対し適切な例外処理をする（間違ってもhttpにフォールバックしない）

が守られていれば問題ない。
TrustManagerとHostnameVerifierがちゃんとしていればAndroidのHTTPSライブラリ内部で必要な検証がちゃんと行われる。検証に失敗したらSSLExceptionが発生する。


※「5.4.3.3. 証明書検証を無効化する危険なコード」(P.357) に駄目な例が書いてある
(覚え書き) col MySQL5.6のセットアップ

2013/03/21 頃の作業

# サービス起動

すでに公式のrpmをインストール済みの状態

```bash
$ sudo service mysql start
```

5.6からはrootの初期パスワードが乱数で自動生成されるようになり /root/.mysql_secret に記述されます。

```
$ sudo cat /root/.mysql_secret
# The random password set for the root user at Thu Mar 21 20:57:22 2013 (local time): KBqBTS82
```

ということでさっくりパスワードを変更するのとクライアントの動作確認を行います。

# rootパスワードの設定

```bash
$ mysql -u root -p
Enter password: (上記パスワード入力)
Welcome to the MySQL monitor.  Commands end with ; or \g.
...(略)
> SET PASSWORD FOR root@localhost=PASSWORD('new_passwd');
> exit
$ mysql -u root -p
Enter password:
```

新しいパスワードでログインできることを確認したらOKです。
続いてセットアップ用の推奨（？）コマンドを実行します。

# MySQLセットアップ

```
$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.


Enter current password for root (enter for none):
OK, successfully used password, moving on...


Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.


You already have a root password set, so you can safely answer 'n'.


Change the root password? [Y/n] n # 既に先ほど変更したので n
... skipping.


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.


Remove anonymous users? [Y/n] Y # 匿名ユーザを削除
... Success!


Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.


Disallow root login remotely? [Y/n] Y # root ユーザでのリモートからのログインを禁止
... Success!


By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.


Remove test database and access to it? [Y/n] Y # test データベースを削除
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!


Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.


Reload privilege tables now? [Y/n] Y # 権限テーブルをリロード
... Success!


All done! If you've completed all of the above steps, your MySQL
installation should now be secure.


Thanks for using MySQL!


Cleaning up...
```

確認してみます。

```bash
$ mysql -u root -p
Enter password:
> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
```

(インデントがずれるのが悲しいが)testDBがないのが分かります。
ちなみに5.6からは my.cnf の初期位置は /usr/my.cnf になってしまっ
たようです。

本当はさらにmy.cnfの設定を変更するのですが、面倒なので放置。
AngularJSでHelloWorld!を表示しました

AngularJSでHelloWorld!をやるのにどの段階が相応しいかわかりませんが、inputタグにng-modelを指定して表示するのがいいのかなと考えました。

```html:AngularJSでHelloWorld!
<!doctype html>
<html ng-app>
  <head>
    <meta charset="UTF-8">
    <script src="angular.min.js"></script>
    <!--<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.1/angular.min.js"></script>-->
  </head>
  <body>
    <div>
      <label>名前:</label>
      <input type="text" ng-model="yourName" placeholder="HelloWorld!を入力してください">
      <hr>
      <span>こんにちは {{yourName}}</span>
    </div>
  </body>
</html>
```
angular.min.jsのファイルはローカルに置いてあります。

実際にブラウザで表示して、inputタグに入力すると、以下画像のように表示されます。

![スクリーンショット 2014-10-17 8.48.20.png](https://qiita-image-store.s3.amazonaws.com/0/1624/f41b7860-774d-5256-ee46-62e026c1063c.png)

AngularJSの動きを見せるのはスクリーンショットだとわかりづらく動画のほうがいいかも
docker buildのRUNのログも保存

* `/root/build.log`にログが保存される。

```bash:Dockerfile
FROM centos:centos7

RUN \
  exec >& /root/build.log ;\
  set -eux ;\
  yum -y install epel-release ;\
  yum -y update ;\
  yum -y install PyYAML python-jinja2 python-httplib2 python-keyczar python-paramiko python-setuptools git python-pip ;\
  yum clean all ;\
  mkdir /etc/ansible/ ;\
  echo '[local]\nlocalhost\n' > /etc/ansible/hosts ;\
  mkdir /opt/ansible/ ;\
  git clone http://github.com/ansible/ansible.git /opt/ansible/ansible

WORKDIR /opt/ansible/ansible

ENV PATH /opt/ansible/ansible/bin:/bin:/usr/bin:/sbin:/usr/sbin
ENV PYTHONPATH /opt/ansible/ansible/lib
ENV ANSIBLE_LIBRARY /opt/ansible/ansible/library
```

```bash:
docker build .
```

## Build Error時の対応

* 長いRUNを１つづつのRUNに分割する。
* 手元でbuildする場合は、`--no-cache`オプションをつける。
  * docker build --no-cache .
* `&`でバックグラウンドにしたい場合、`\&`と書く。
BOF対策

C/C++でBOF(バッファオーバーフロー)を引き起こさないようにするための方法を表にまとめました。

※{}で囲ってある部分については、適当な整数に置き換える

|BOFを引き起こす可能性がある関数|代替案/対策|
| :-: | :-: |
|gets( dest )|fgets( dest , sizeof( dest ) , stdin )|
|strcpy( dest , src )|memset( dest , 0 , sizeof( dest ) ) -> strncpy( dest , src , sizeof( dest ) - 1 )|
|strcat( dest , src )|strncat( dest , src , sizeof( dest ) - strlen( dest ) - 1 )|
|sprintf( dest , ”%s” , data )|sprintf( dest , ”%.{B}s” , data )<br>snprintf( dest , sizeof( dest ) , ”%.{B}s” , data )<br>({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1)|
|scanf( "%s” , dest )|scanf( ”%.{B}s” , dest )<br>({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1)|
|sscanf( str , "%s” , data )|sscanf( str , ”%.{B}s” , data )<br>({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1)|
|fscanf( fp , "%s” , data )|fscanf( fp , ”%.{B}s” , data )<br>({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1)|
|getchar()<br>fgetc( fp )<br>getc( fp )|使用する際にバッファ境界チェックを行う。|
boot2docker 1.3に更新手順と共有フォルダについて

## 更新

```bash:更新
# brewリポジトリのパッケージ一覧を更新
brew update
# boot2dockerコマンドの更新
brew upgrade boot2docker
# boot2dockerのisoイメージを更新
boot2docker upgrade
```

## 起動

```bash:
mkdir container1 && cd container1
boot2docker init
boot2docker up
boot2docker ssh
docker -v
```

## 共有フォルダを確認

> docker -h
> ...
>       --vbox-share=[]: (defaults to '/Users=Users' if no shares are specified; use 'disable' to explicitly prevent any shares from being created) List of directories to share during 'up|start|boot' via VirtualBox Guest Additions, with optional labels

```bash:
ls /Users
```

/Users以下がバインドされていることを確認。


# macのdockerコマンドから操作

```bash:
To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/owner/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
```

とのことなので、環境変数を設定。

```diff:~/.zshrc
+ export DOCKER_HOST=tcp://192.168.59.103:2376
+ export DOCKER_CERT_PATH=~/.boot2docker/certs/boot2docker-vm
+ export DOCKER_TLS_VERIFY=1
```

```bash:
source ~/.zshrc
docker search tukiyo3
```

操作できた！

## figを使ってみる

```bash:
brew install fig
```
Vimのドットコマンドが便利っぽい


[実践Vim 思考のスピードで編集しよう!](http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86-Drew-Neil/dp/4048916599)を買ってみた。
素のVimの機能をとことん掘り下げる本で、Vimmerの間では人気っぽい。
まだ全部読んでないけど、この中で真っ先に紹介されるドットコマンドが便利な気がするのでまとめてみる。

## 日本語ドキュメント
http://vim-jp.org/vimdoc-ja/repeat.html#single-repeat

これには、
> 最後の変更を繰り返す。

としか書かれていない。

**最後の変更**ってなんぞや？

## 最後の変更とは
### ノーマルモードの場合
最後の変更 = テキストに変更を及ぼすコマンド1個分

たとえば、

* `x` : 1文字削除
* `p` : ペースト
* `dd` : 1行削除
* `>G` : 現在の行からファイルの末尾までインデントを一段深くする
* ...などなど。

なお、１手戻るコマンド`u`は含まれない。

たとえば行頭を1文字ずつ削除する場合。

```
#Line1
^
#Line2
--------------------
Line1             [x]
^
#Line2
--------------------
Line1             [j]
#Line2
^
--------------------
Line1             [.]
Line2
^
```

`j`はカーソル移動なので変更にはカウントされない。
なのでこの場合は、最後の変更 = `x` となる

### 挿入モードを挟む場合
最後の変更 = 挿入モードに入った瞬間からノーマルモードに戻るまでの間の操作

ただし、挿入モードでカーソルキーを使うと、変更がリセットされる。
なぜなら、これらは一旦ノーマルモードに戻って、`h`,`j`,`k`,`l`コマンドで移動して、再度挿入モードに入ったことになるから。

ノーマルモードでの「変更」も、一度挿入モードに入ってゴニョゴニョしてノーマルモードに帰って来ていると考えたら、一貫性があるようにに思えるなー。

たとえば行末に`;`を付け加える操作を繰り返す場合。

```
var foo = 1
^
var bar = 100
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [A;<ESC>]
           ^
var bar = 'a'
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [j]
var bar = 'a'
           ^
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [.]
var bar = 'a';
             ^
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [j.]
var bar = 'a';
var foobar = foo + bar;
                      ^
--------------------------------------
```

## ドットコマンドの理想的な使い方

理想としては、移動に1ストローク、ドットコマンドで1ストローク。
移動用のキーと`.`を交互に打つだけで作業が完了すれば最強。

そのために考えなければならないポイントは大きく２つ。

* 挿入モードへの入り方
* 移動の方法

### 挿入モードへの入り方を考える

最後の変更 = 挿入モードに入った瞬間からノーマルモードに戻るまでの間の操作

そしてここでのポイントは、「挿入モードに入った瞬間から」という部分。
Vimには何かしらの操作をしつつ挿入モードに入るコマンドがたくさん用意されている。
これを使って挿入モードに入ると、「何かしらの操作」も一緒に繰り返してくれる。

挿入モードに入るコマンドには、以下のものがある。

* `i` : カーソル位置の左から挿入開始
* `I` : 行頭から挿入開始 = `^i`
* `a` : カーソル位置の右から挿入開始
* `A` : 行末から挿入開始 = `$a`
* `o` : カーソル位置の下に1行開けて挿入開始 = `A<CR>`
* `O` : カーソル位置の上に1行開けて挿入開始 = `ko`
* `c` : 削除して挿入開始。単体だと機能しないけど、このあとに続く文字で削除するものが決まる。
 * `cw` : カーソル位置の単語を削除して挿入開始
 * `cf{検索文字}` : カーソル位置から、{検索文字}の位置までを消して挿入開始
 * ...など
* `C` : カーソル一から行末までを削除して挿入開始 = `c$`
* `s` : カーソル位置の文字を削除して挿入開始 = `cl`
* `S` : カーソル位置の行を削除して挿入開始 = `^C`,`cc`

先の例では、`A`コマンドを使うことで行末までの移動も繰り返し処理の中に含めていた。

この他にも、例えば`cw`を使うと、カーソル位置の単語を別の単語に置き換える繰り返し処理を作れたり、いろいろできるはず。

### 移動の方法を考える

移動の方法は`h`,`j`,`k`,`l`だけではない。
検索による移動方法を知っておくと便利。

#### `f{検索文字}`の後の`;`/`,`コマンド
`f{検索文字}`は、行内で文字を前方検索するコマンド。
一度このコマンドを実行しておくと、`;`で同じ方向に検索、`,`で逆方向に検索が繰り返される。

ちなみに`F{検索文字}`だと後方検索。`;`/`,`の検索方向も逆転する。

#### 文字列検索の後の`n`/`N`コマンド
`/{検索文字列}`や、`*`コマンド(カーソル位置の単語を検索)でドキュメント内での前方検索を行なった後、
`n`で同じ方向に検索、`N`で逆方向に検索が繰り返される。

ちなみに`?{検索文字列}`だと後方検索。`n`/`N`の検索方向も逆転する。

## まとめ
あとは慣れるだけ！
jQueryのカスタムデータ属性(data-*)の設定/取得の挙動が思ったのと違った件


jQueryでカスタムデータ属性(data-*)の設定/取得を行うメソッドには`data()`と`attr()`があるけど、全く別物だったのでメモ。

## 結論から言うと

* `attr()`
 * HTMLのカスタムデータ属性(data-*)を読み書きする
 * 値は常に文字列として扱われる
* `data()`
 * jQuery内のキャッシュのデータを読み書きする（ただし、取得時に該当キャッシュが無ければカスタムデータ属性を取得する）
 * 値には自動で型が設定される（文字列、数値、Bool値、オブジェクト、配列）


## たとえば

```
<div id="fruit" data-number="01">りんご</div>
```

とあった場合、`attr()`と`data()`を混在させると想定通りにならないことがある。


例その１

```
// まずキャッシュを見に行くけど最初は'number'が存在しないので、カスタムデータ属性を見に行って"01"を取得する
// そしてついでにデータをキャッシュする
$('#fruit').data('number')

// attr()を使ってカスタムデータ属性を変えてみる
$('#fruit').attr('data-number', '02')

// キャッシュを見に行くと前回取得時に作ったキャッシュがあるので、そこから "01" を取得する
$('#fruit').data('number')
```

例その２

```
// キャッシュに'number'の値として "02" を登録
$('#fruit').data('number', '02')

// attr()を使ってもカスタムデータ属性を見に行くので、"01" を取得する
$('#fruit').attr('data-number')		// "01"

// data()を使うと、設定した値である "02" が取得できる
$('#fruit').data('number')			// "02"
```


jQuery ver.1.11.0 で試してみたけど、`"02"`は文字列として解釈されるっぽい。
以前のバージョンだと`"02"`は`2`になってたみたいだけど…。どのバージョンから変わったかは未確認。
`"2"`なら`data()`を挟むことで数値型になった。
文字列を2進数として解釈して数値に変換する


あったらいいなと思って探したら本当にあって嬉しかったので。小ネタ。

`String#to_i` には実は引数があって、基数を指定できる。○進数で解釈してくれー、と。
デフォルトでは10が入るので特に意識しなくても自然な形で変換してくれるけど、10進数以外で解釈してほしい時には引数を与えてやればOK。

```
"00010100010100110110001100011000110001001".to_i(2)
# => 174596698505
```

ちなみに逆もできる。

```
174596698505.to_s(2)
# => "10100010100110110001100011000110001001" 
```

これでjsonから２進数として書かれた文字列受け取ったりしても大丈夫！
Apple Special Event October 2014 まとめ

イベントの様子は[公式サイトで録画を見る](http://www.apple.com/apple-events/2014-oct-event/)ことが出来ます。

* iPod touch の発表はなし
* 来月AppleWATCH用開発キットを配布開始
    * Apple Watch　2015年初期発売（Eary2015） 予定に変更なし。
* iOS8の普及状況　4週間で48%の端末がiOS8に移行。
    * iOS7は現状で46％。その他が6%。
* アメリカではApplePayが来週月曜から開始
* 更に薄くなったiPad Air 2、iPad mini 3、iMac 5K Display、Mac miniを発表
    * iMac Retina 5KディスプレイモデルとMac mini は、本日より販売開始。
    * 「iPad Air 2」「iPad mini 3」のオンラインでの注文は2014年10月18日（土）からです。
    * [「iPad Air 2」「iMac with Retina 5K display」の紹介ビデオ公開]((http://blog.livedoor.jp/applebrothers/archives/52400289.html))

* Mac OS X 新OSの Yosemiteが公開
    *（日本のApp Storeではまだ！？インストール出来ない）

* iOS8.1(｢Apple Pay｣や｢iCloudフォトライブラリ｣をサポート)10月21日未明にリリース

* Apple、｢iPad Air｣や｢iPad mini 2｣の整備済み品を値下げ

* ｢iPad Air 2｣の価格は下記の通り。
    * 【Wi-Fiモデル】
        * ・16GB：53,800円　・64GB：64,800円　・128GB：75,800円
    * 【Wi-Fi＋Cellularモデル】
        * ・16GB：67,800円　・64GB：78,800円　・128GB：89,800円
* ｢iPad mini 3｣の価格は下記の通り。
    * 【Wi-Fiモデル】
        * ・16GB：42,800円　・64GB：53,800円　・128GB：64,800円
    * 【Wi-Fi＋Cellularモデル】
        * ・16GB：56,800円　・64GB：67,800円　・128GB：78,800円

* エンタープライズパートナーのIBMはアプリ開発をSwiftで行っている

* iWorkはiOSもMacも無料に
parse.com の無料プランは 30 requests/sec だけど、超えるとどうなるの？いきなり請求きちゃうの？ (x_x) という話

# Parse.com について

parse.com はとても便利なMBaaS (Mobile Backend as a Service) の一つです。いろいろ便利です。秒間30リクエストまで可能です。リクエスト数に関してはそれ以外は無制限。月内100万とかそういうのはありません。（※価格の改定で無くなりました）

## 無料の範囲

30 requests/sec, 20GB のデータベース容量, 20GB のファイル容量, 2TB の転送容量

## 秒間30リクエスト超えるとどうなるの？

### APIリクエストでエラー

「API呼びすぎだから自重しろ！」というエラーメッセージが戻ります (x_x)ひえー

### メールで通知が届くよ

こんな感じの通知がメールで届きます。Gmailで受信したら目立つラベルとかつけるフィルタ設定しておくといいかもしれません。

Your Parse App HogeHoge is Getting Close to Exceeding its Request Limit

### 請求されるの？

秒間30リクエスト超えた分は無視され、請求はされません。ウェブ上のグラフにはしっかり証拠が残ります。

## というわけで

請求されないので、とりあえずは安心です ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい
Ruby で複数枚の画像を一枚にタイル状にまとめた画像をつくるよ - RMagick の mosaic 使います - ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

Ubuntu は 12.04系です。Rubyで簡単な画像処理ができるRmagickの導入については↓の投稿を見てください。

:laughing: Ruby で簡単な画像処理できるRMagickを導入する ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい - Qiita - http://goo.gl/BpXZIM

はい。ゲーム実況動画に毎日時間を取られてます。マイクラ、パズドラ、楽しいですね。最近は特にマイクラの動画がおすすめです。マイクラはマインクラフト（Minecraft）という箱庭ゲームで、LEGOブロックのような感じです。

さて、今回は、YouTube のプレイリストにサムネイルが無いのでプレイリストに登録されている動画のサムネイルからプレイリスト用のサムネイル画像をつくろう、という趣旨です。下のような画像をつくる。

![サムネイル](http://gameranking.scleen.com/images/thumbnail/playlist_2014-10-16.png)

10月15日に人気のあったゲーム実況動画のプレイリストをつくってみました。マックスむらいのAppBank系の動画が人気すぎ・・・小学生に大人気♪

[【ゲーム実況動画】10月15日の人気ゲーム実況動画](https://www.youtube.com/playlist?list=PL5UieISk9Qioi5OpmsALDJA2R5T2TKfa_)

前置きが長くなちゃったけど書いていくよ。

# RMagick を使って複数の画像から1枚のタイル状の画像をつくる

ImageList#mosaic というメソッドを使うのがポイントです。

## 複数枚の画像の読み込み

最新のRMagickはURLからの読み込みにも対応しているよ♪4枚でやってみます。

```ruby:hoge.rb
imageUrls = ["http://img.youtube.com/vi/e6xuxo6Xrs0/mqdefault.jpg",
			"http://img.youtube.com/vi/BCgUx8kdwY4/mqdefault.jpg",
			"http://img.youtube.com/vi/NNpOTng4b40/mqdefault.jpg",
			"http://img.youtube.com/vi/Pse_-UTWFlM/mqdefault.jpg"]
images = Magick::ImageList.new 
imageUrls.each do |url|
  images.read(url)
end # imageUrls.each
```

こんな感じで、ImageListをnewした後に read で画像を読み込みます。new の引数に複数書けるんだけど、<del>Arrayは渡せないのが少しはまりポイントです</del>、Arrayは参照わたしにする必要があります（whiteleaf7@github さんに教えていただきました、ありがとうございます）。


```rb
Magick::ImageList.new("hoge.png","huga.png")
```

はOK

```rb
images = ["hoge.png","huga.png"]
Magick::ImageList.new(*images)
```

もOK

```rb
images = ["hoge.png","huga.png"]
Magick::ImageList.new(images)
```

は駄目よ

### 補足：YouTube動画のサムネイル画像のURL

いくつか形式があるけど↓のような感じで[videoId]が動画ID

http://img.youtube.com/vi/[videoId]/mqdefault.jpg

## タイル状の画像をつくる

うまいこと page で位置を指定した上で、mosaic を呼んで画像をつくるのがポイントです。

```rb:hoge.rb
tile = Magick::ImageList.new
page = Magick::Rectangle.new(0,0,0,0)
images.scene = 0
		
2.times do |i|
  2.times do |j|
    tile << images.scale(0.7)
    page.x = j * tile.columns
    page.y = i * tile.rows
    tile.page = page
    (images.scene += 1) rescue images.scene = 0
  end
end
image = tile.mosaic
image.write("tile.png")
```

できたかな？ images.scale(0.7) は1辺の長さが半分になるように縮小しているのです。Googleの計算機で 0.5^0.5 とかしてうまいことルートを計算して出します。

できた！ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

ヾ(・д・｀)いい歳して「わぁい」とかガキ

## さんこう

RMagick example: mosaic.rb - http://goo.gl/jcSqpt
https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=0.5%5E0.5
[翻訳]なんでGoってみんなに嫌われてるの？


原文：http://npf.io/2014/10/why-everyone-hates-go/

酔っぱらった勢いで訳出してるので、違ってたら修正リクエストください。

## 訳者の１行でわかるサマリ

それって、Goのシンプルな言語哲学が、ML系言語好きのアイデンティティを挑発しちゃってるからじゃないの？

# なんでGoってみんなに嫌われてるの？
いや、実際みんなって訳じゃないんだろうけど。最近、なんてGoをみんなそんなに批判的なのかって言う[quoraの質問](https://www.quora.com/Why-does-Go-seem-to-be-the-most-heavily-criticised-among-the-newer-programming-languages?srid=uCiY&share=1)が出たもんで。（わるい、普段はquoraへのリンクを張らないんだけど、それがこの記事のきっかけだからね。）この質問への回答を見るまえにもう、僕には、次みたいなことが書かれていることがわかってた：

* Goは70年代に立ち往生した言語だ
* Goは40年間に及ぶプログラミング言語研究の成果を無視してる
* Goはブルーカラーの凡夫のための言語だ
* Go使いはJava1.0で仕事しても大丈夫なんだろう。

残念なことにこれらの回答は、Goがいかに悪いかは説明していても、なんでこんなにいろんな人の逆鱗に触れるのかについては説明していない。

これらの回答を読んでいて、はっとする瞬間があった。僕にはなんでそうなのかわかった。
ここに僕の同じ質問についての回答を記そう。「なんで、Goはこんなにも激しく批判されるのか？」Goがなんでダメかじゃなくね。

僕の回答を伝えるすばらしい２つの記事を紹介しよう。

Paul Grahamの「[アイデンティティを小さく保つということ](http://www.paulgraham.com/identity.html)」についての記事と、Kathy Sierraの「[クールエイド（信じ込んでいるのを馬鹿にしやすい）ポイント](http://seriouspony.com/trouble-at-the-koolaid-point)」（訳注：Kool-Aidを飲むは「妄信する」というスラングらしい。新興宗教の集団自殺で粉ジュースのkool-aidに青酸カリを混ぜて信者が飲んだことに由来するとのこと）についての記事だ。これら二つの記事はぜひ読んでほしい。これらはとても示唆に富んでいる。

ウーマンオンラインにおこった恐ろしい出来事と、些細なプログラム言語のフレーム戦争を比較するのは気が引けるけど、「クールエイドポイント」は、この記事とつなげたくなる適切なメタファだと思っている。


Paul曰く：
> 人は、その人のアイデンティティの一部となっている事について、実りある議論はできない。

これすなわち、自分のホームに近い話題ほど論理よりも感情が優先されてしまうということ。

Kathy曰く：
> 他の人が夢中になるほど、そのプロダクトやブランドへの憎しみは強くなる

これはつまり、彼らはクールエイドを飲んでしまってるということだ。

Goは、前述した４０年に及ぶプログラミング言語研究の成果を窓から放り投げた近年では唯一の言語だ。他の新しい言語は、少なからず他の言語と張り合って機能を足そうとしている。
Clojure、Scala、Rust、全部が「モダンなプログラミング理論」を言語設計に取り入れようとしている。

Goは積極的にそうはしなかった。パターンマッチングはないし、ボローイングもない、純粋関数型プログラミングはないし、不変変数もない。オプショナル型もなければ、例外もない。クラスもなければジェネリクスもない。Goにはないものがたくさんある。

そして、これは最初に馬鹿にするには十分なことだ。
これは僕も同罪だ。最初にGoを見たときに、「え、例外がないの？やめとくわ」って思ったしね。

でも、そしたら、何がおこったか。人々がGoを使い始めたんだ。好き好んで。
さらには大きなプロジェクトもこしらえるようになった。これが、クールエイドポイント -- 人々がクールエイドを飲み出して、Go はいい言語だと騙された瞬間 -- だ。そして、これがGoへの軽蔑が、使っている人への人格批判や嘲笑に変わった瞬間だった。

ほとんどのGoを声高に批判する人はML由来の言語を書いている開発者だ。（Haskell,Rust,Scalaなどなど。）彼らは、すばらしいプログラミング言語と自身のアイデンティティを結びつけてしまっている。Goがただ存在するということがもはや「お前の良いプログラミングを構成するものは間違ってる」と言われているように感じるのだ。そして、多くの人がGoを使い、好むほどにお前の言語選択は、つまりはお前自身は　間違っているのだと言われているように感じてしまうのだ。

言っておくと、Goコミュニティのだれもそんなことは実際には言っていない。でも、Goの実用性とシンプルさを他のなによりも優先する哲学は、それらの言語が採用してきたもの(コードの正確性に寄与するのであれば、言語の複雑さはかまわないという考え)と対極に位置する。これが、言語とアイデンティティを紐づけた人々からすれば口汚く罵られているように思えるのだ。Goについての記事が、ハッカーニュースの一面を飾るときはいつでも、彼らが信じ、愛したすべてを傷つけている。そして、だからこそ彼らは、Goは時代遅れで、ブルーワーカーだけの言語だとコメントしてしまうのだ。


そう、これが僕の考えるところの「なぜGoを嫌う声は大きくなったのか」という答えだ。それは、他の人がGoに夢中になっているのを見ると自身の尊厳を傷つけられているように感じるからだ。


これは同時に、なんでGo言語を批判する多くの記事がGoogleに言及し、Googleが作ったのでなければGoはどんな風に死ぬはずだったか語ることについての答えでもある。

グーグルはいまや、クールエイドの自動販売機だ。

Googleが実際とは異なり優れた人材の宝庫であると一般に考えられているという事実により、よりいっそう彼らが人々を欺いていることが許しがたく、またGoがML由来の言語と対立することが侮辱的になるのだ。
(訳注：自信なし)

更新：パンティの束の件は削除した。性差別的だとおこられてしまった、プロフェッショナルでないので、言及すべきでなかった。傷つけてしまった人に謝罪を。
Ruby で簡単な画像処理できるRMagickを導入する ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

# Ruby に画像加工させたいので RMagick を入れます

Ubuntu は 12.04系です。まず、Imagemagickをインストールします。画像加工できる他の選択肢って何があるんでしょう？

## Imagemagick のインストール

```
$ sudo apt-get install imagemagick
```

```
$ sudo apt-get install libmagickwand-dev
```

## RMagick のインストール

RubyのRMagickモジュールをインストールします。

```
$ sudo gem install rmagick
```


## さんこう

ruby - Installing rmagick on Ubuntu - Stack Overflow - http://goo.gl/iEm8SL
Windowsのバッチファイルにjjs scriptを書く

Java8からJavaScriptを実行するjjsというコマンドが追加されました。
jjsには通常のJavaScriptの機能に加え、シェルスクリプトの機能も使えるようにする -scripting というオプションがあります。
[Nashorn and Shell Scripting](http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html#sthref24)
さて、参照先にあるようにUNIXの場合は `#!/usr/bin/jjs` や `#!/usr/bin/env jjs` といったshebangで書き始めればシェルスクリプト機能を持ったJavaScriptを書けるようになります。
これをWindowsのバッチファイルでも同じようにバッチファイルの中にJavaScriptを書ける方法をお伝えします。

### jjsバッチの書き方

ファイルの拡張子はbat、もしくはcmdとします。
改行コードはWindowsのCRLF、文字コードはUTF-8で作成します。
下記の例ではJavaのインストールフォルダを環境変数のJAVA_HOMEにセットしています。

```bat:jjs1.bat
rem:/*
@"%JAVA_HOME%\bin\jjs" -scripting "%~f0" %*
@exit /b %ERRORLEVEL%
*/

# ここからJavaScriptのコードを書く
print("こんにちは, Nashorn!");
```

`"%JAVA_HOME%\bin\jjs"`の部分はPATHが通っていれば`jjs`だけでOKです。
1行目は出力されてしまいますが（JavaScriptで@を先頭につけてもエラーにならない方法があれば教えて下さい）、他の行はエラーにならないはずです。

jarをクラスパスに追加したい場合は2行目を

```bat
@"%JAVA_HOME%\bin\jjs" -scripting -cp \...\a.jar;\...\b.jar "%~f0" %*
```

と-cp(-classpath)オプションで指定できます。

### Java FX

Java FXを使う場合は、jjsに-fxオプションを付けます。
http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/javafx.html#CEGGACGH のExample 3-4をバッチファイルにしてみます。

```bat:fxsample.bat
rem:/*
@"%JAVA_HOME%\bin\jjs" -fx -scripting "%~f0" %*
@exit /b %ERRORLEVEL%
*/

# Example 3-4 JavaFX Script Application with Loaded Scripts
load("fx:base.js");
load("fx:controls.js");
load("fx:graphics.js");

$STAGE.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World'";
button.onAction = function() print("Hello World!");
var root = new StackPane();
root.children.add(button);
$STAGE.scene = new Scene(root, 300, 250);
$STAGE.show();
```

実行するとボタンが１つあるウィンドウが開きます。

### まとめ

実はこれで何かすることは何も思いつきませんし、素直にjsファイルをjjsで呼び出せばいい気もしますが、１つのバッチファイル内でJavaのクラスをJavaScriptで呼び出したい（奇特な）方がいましたらぜひお試しください。
俺得Gitチートシート


### 最初

```
$ git init
//README.mdと.gitignore作成
$ git add .
$ git commit -m”init”
//githubでレポジトリ作成
$ git remote add your_repo
$ git config branch.master.remote origin
```
### remoteコマンド

参照しているremoteのURLと名前を確認・作成などができる

`remote名 URL` のような表記

- 参照
`$ git remote -v`

* 追加
`$ git remote add your_repo`

### remoteのブランチと同期系

- remoteの最新情報を取得、remoteで削除されたものはlocalでも削除する
`$ git fetch --prune`

- masterブランチが進んでいるときに追従する
`$ git pull -r`

- featureブランチが進んでいるときに追従する
`$ git pull remote名 branch名`

- すべてのremoteブランチ確認
`$ git branch -a`

- remoteをコピーしてローカルに作成
`$ git checkout -b local_branch_name origin/remote_branch_name`

### Stash
* 保存
`$ git stash`

* メッセージ付き保存
`$ git stash save "メッセージ"`

* 一覧
`$ git  stash list`

* 確認
`$ git diff HEAD..stash@{num}`

* 復元
`$ git stash pop stash@{num}`

* 削除
`$ git stash drop stash@{num}`

* 天変地異
`$ git stash clear`

### 取り消しとか

* ファイルの変更を取り消す(Revert的な)
`$ git checkout -- your_file`

* addしたファイルをステージングから取り消す
`$ git reset —-soft your_file`(localはそのまま)
`$ git reset --hard your_file`(localも戻る)

* commitやり直し
`$ git commit --amend -m "new comment"`

* pushの上書き
`$ git push -f origin your_branch`(あかん)

### branch

* リモートブランチ確認
`$ git branch -r`

* 全部のブランチ確認
`$ git branch -a`

* ブランチの削除
`$ git branch -d delete_branch`

* ブランチ名の変更
`$ git branch -m old-name new-name`

* ブランチの上書き
`$ git branch -f old-branch`


### コミットの順番を入れ替える
`$ git rebase -i HEAD~num`
コンフリクトしたら、内容を修正して
`$ git rebase --continue`

### リモートのコミットを巻き戻す(取り扱い注意)
`$ git push -f origin commit:remote_branch`
戻ったら新しいcommitを
`$ git push origin local_branch`

### 既に管理しているファイルを無視したい

[参考](http://d.hatena.ne.jp/hkobayash/20130416/1366129434)

####変更を保持しない（cloneすると再度ファイルを読み込む）

* 無視
`$ git update-index --assume-unchanged your_file`

* 無視解除
`$ git update-index --no-assume-unchanged your_file`

#### 変更を保持する（cloneしても上書きされない）

* 無視
`$ git update-index --skip-worktree your_file`

* 無視解除
`$ git update-index --no-skip-worktree your_file`

この辺の設定を確認
`$ git ls-files -v`


### tag

* 一覧表示
`$ git tag`

* 注釈付きタグの作成
`$ git tag -a v1.0.0`

* タグ情報の確認
`$ git show your_tag`

### rebaseのときのアレ

cherry-pick（コミットを採用）
reword（コミットを採用するが、コミットメッセージを変更）
edit（コミットを採用するが、ファイルを修正する）
squash（一個前のコミットと合体させる）
fixup（コミットメッセージを変更しない点以外、squashと同じ）
exec（shellでコマンドを実行する）
はじめてのパターン認識　第2章

#第2章　識別規則と学習法の概要
####学習内容
* 識別規則と学習法の概要
* 学習データを用いて汎化能力を推定する方法

##2.1　識別規則と学習法の分類
###2.1.1　識別規則の構成法
　代表的な識別規則の構成法を以下に紹介する。
(a)事後確率による方法(代表例: ベイズの最大事後確率法)
　パターン空間に確率分布を仮定し、事後確率が最大のクラスに分類する。事後確率に関しては後章で解説。
(b)距離による方法(代表例:最近傍法)
　入力ベクトル$x$と各クラスの代表ベクトルとの距離を測定し、最も近い代表ベクトルクラスに分類する
(c)関数値による方法(代表例:サポートベクトルマシン)
　$f(x)$の正負あるいは最大値でクラスを決める。識別のために用いられる$f(x)$を識別関数と呼ぶ。
(d)决定木による方法
　識別規則の真偽を順次適応し、決定木の形でクラスを決める。
###2.1.2　教師付き学習
　識別規則は入力データからクラスへの写像を$y=f(x)$で表す。識別規則の学習はこの写像の性質を、学習データを用いて決める必要があり、その学習により変化するパラメータを$w$で表す。学習の目的は、入力データが正しいクラスに対応する関数値を出すよう、$w$を調整することである。
識別規則が学習をするためには、入力データとそのクラスを指定したデータを対にした**学習データ**が必要になる。クラスを指定したデータを**教師データ**という。
教師データは２クラスの場合 $t$ $\in$ \{ $-1,+1$ \} 、３以上ある場合は$t=$ {  $0,1,0,0,0,0,0$ }$^T$のように表し、これらの学習に必要な全てのデータの対の集合を**学習データセット**といい$D_L$で表す。
前述したが、学習の目的は学習データを正しく識別できる$w$を求めることである。学習は学習データセットを用いて識別関数の出力と教師データの誤差が小さくなるよう$w$を調整することで行われ、調整の終わった識別関数は学習に使用しなかったテストデータセット($D_T$)を用いて性能評価を行う。
###2.1.3　教師付き学習と線形回帰
教師付き学習では、識別関数$f(x)$は教師データとして与えられた関数値に近似させる能力を保つ必要があり、この能力は識別関数の複雑さに対応する。この問題を関数近似と呼び、**線形関数**で近似する場合は線形回帰と呼ばれる。線形回帰は経済分野などで活躍している。
###2.1.4　教師なし学習
教師がいない学習も存在しており、この場合は入力データ間の距離や類似度によって自動的に**クラスタリング**することが主目的になる。このような学習は、**教師なし学習**、あるいは**自己組織型学習**と呼ばれる。
最近では、一部のデータのみに教師データをつけて学習を行う**形質導入学習**という学習法も提案されている。この手法は、教師を一部のデータのみに付与し、そのデータからデータの持つ共通した特徴を手がかりに教師の形質を導入する手法で、コストが低い。
##汎化能力
* 汎化能力:未知のデータに対する識別能力
* 汎化誤差:未知のデータに対する識別の誤差

###2.2.1　学習データとテストデータの作り方
#####前提条件
* 全てのデータの集合を母集団と呼び、母集団を分割して学習データセット$D_L$とテストデータセット$D_T$を作成する。それぞれのデータセットの特徴ベクトルの分布を$p_L$, $p_T$とし、$D_L$を用いて設計し、$D_T$を用いてテストした際の誤り率を$\varepsilon(p_L, p_T)$と表すことにする。
* 母集団を用いた$d$次元特徴の分布を真の分布とよび、$p$で表すことにする。$p_L$や$p_T$は真の分布からランダムにサンプルされたもので、各特徴の平均や分散が$p$とおなじになるとは限らない。このズレを**バイアス**という。
* **真の誤り率**$\varepsilon(p, p)$は真の分布$p$を用いて設計し、$p$を用いてテストした時の誤り率を表す。
* 母集団からサンプリングした同じデータを学習とテストに用いた際の誤り率を$\varepsilon(p_L, p_L)$とし、**再代入誤り率**と呼ぶ。

母集団を分割して学習とテストを行う手法の代表的なものとして以下のものがあげられる。
(1)ホールドアウト法
母集団を分割して一方を学習に使い、他方をテストのために置いておき、誤り率の推定に使用する。これによって求められる誤り率を**ホールドアウト誤り率**という。**学習精度と性能評価がトレードオフの関係**にあるため、手元に大量のデータがない場合は良い性能評価を行うことができない。
(2)交差確認方
母集団を$m$個のグループに分割し、$m-1$個のグループを用いて学習を行う。そのあと残りの1つのグループでテストを行う。これを全グループがテストに用いられるよう$m$回繰り返し、その誤り率の平均を性能予測値とする。$i$番目のグループの誤り率を$\varepsilon_{-i}$とすると、誤識別率の予測値は$\varepsilon = \sum _{i=1} ^{m} { \varepsilon{-i} }$と予測される。分割によってグループごとのデータのバイアスがかかる可能性があるので、分割方法を変えて交差確認法を繰り返す必要がある。
(3)ジャックナイフ法
交差確認法においてデータ数とグループ数を等しくして行う。組み合わせが1つなので1回だけやればよい。
(4)ブートストラップ法
再代入誤り率バイアスを補正するために使用される。総数N個の母集団に対して、N個のデータを用いて設計し、N個のデータでテストすることで再代入誤り率を求め、真の誤り率との差分をとることでバイアスを明らかにする。最低でも50回程度のリサンプリングを繰り返して施行を重ねてバイアスの精度を高めていく。

###2.2.2　汎化能力の評価法とモデル選択
学習データによってパラメータ調整を行い、誤り率を評価しても、目標以上の精度が出ない場合は識別関数を変える必要がある。誤り率が最も小さくなるパラメータを選択する方法を**モデル選択**という。
Vagrantで構築したCentOSにJenkinsを入れた時の手順メモ

#構成とか
##ホストOS
Windows7

##ゲストOS
CentOS 6.5.3

##ほか
- ゲストOSに Jenkins を入れて、 8080 ポートで起動。
- ホスト OS から `http://locahlsot:18080/` でゲスト OS の Jenkins にアクセスできるようにする（諸事情により、外から見れる IP アドレスをゲスト OS に割り当てられないので）。
- Vagrant と VirtualBox はインストール済みの前提。

#Vagrant でゲスト OS 構築
```bat:Boxのインストール
> vagrant box add CentOS_6.5.3 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

> vagrant init CentOS_6.5.3
```

`Vagrantfile` を以下のように修正。

```diff:line.20-23
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
-  # config.vm.network "forwarded_port", guest: 80, host: 8080
+  config.vm.network "forwarded_port", guest: 8080, host: 18080
```

```bat:VM起動
> vagrant up

> vagrant ssh
```

#下準備
##wget のインストール
```bash:
$ sudo yum -y install wget
```

- なんか、最初の方はミラーサイトへのアクセスに失敗しまくるけど、十数回リトライしているうちにアクセスできるようになって、正常に動くようになった。

##java のインストール
```bash:
$ sudo yum -y install java-1.7.0-openjdk.x86_64
```

- jenkins 動かすのに必要。


##Jenkins 用の yum リポジトリを追加する
```bash:
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
```

#Jenkins のインストール
##インストール＋起動
```bash:
$ sudo yum -y install jenkins

$ sudo service jenkins start
```

##動作確認
ホスト OS でブラウザを立ち上げて、 `http://localhost:18080` にアクセス。
Jenkins のトップページが見れたらOK。

#参考
- [CentOS/RedHatにJenkinsをインストールする手順 (yum, RPM)  |  OSCALOG](http://oscasierra.net/2013/05/jenkins-to-redhat/)
【js】論理演算子を使って変数を代入する

論理演算子を使って変数代入する時のまとめ

【例】
var c = a && b;				
var d = a || b;				

【意味】&& のaが真ならばbを代入。|| のaが真ならばaを代入。

【注意】これを使う時はaやbの型に注意。例えばNumber型で偽とは0の時といったように。

こうすることで変数を二つ書くことを省略できてソースが簡略化できる。
Kobito Widgetを発明した


任意のウェブページの情報をKobitoに表示します。
以下のようなフォーマットを編集中のウィンドウに貼り付けます。

```js
<script>
widget(url, selector);
function widget(url, selector) {
  var req = new XMLHttpRequest();
  req.onload = function() {
    var el = document.createElement('div');
    var base = url.replace(/(^https?:\/\/.*?)\/.*$/gm, '$1');
    el.innerHTML = this.responseText;

    var result = el.querySelector(selector);
    var h = result.innerHTML;
    h = h.replace(/ src="\//gm, ' src="' + base + '/');
    h = h.replace(/ src="[^\/(http)]/gm, ' src="' + url + '/');
    result.innerHTML = h;

    var container = document.createElement('div');
    container.appendChild(result);
    document.body.insertBefore(container, document.body.firstChild);
  }
  req.onerror = function(){ console.error("error"); }
  req.open('GET', url);
  req.send();
}
</script>
// <link rel="stylesheet" href="http://weather.livedoor.com/css/weather.css" type="text/css">
```

url: 埋め込む対象のURLです
selector: 切り出す範囲のCSSセレクタです

cssが必要なら必要に応じてタグを追加します。

## 天気予報

![スクリーンショット 2014-10-16 11.03.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/01bd4cd3-496e-e8c1-69c5-139632cc8ee7.png "スクリーンショット 2014-10-16 11.03.40 PM.png")

## 株価

![スクリーンショット 2014-10-16 11.48.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/72148da7-d0c4-2b33-f46d-2653bb4f84b0.png "スクリーンショット 2014-10-16 11.48.40 PM.png")


## おまけ: Twitterタイムライン

![スクリーンショット 2014-10-16 11.39.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/ceb8810e-1c4e-cebe-85b4-1414e87b13a6.png "スクリーンショット 2014-10-16 11.39.57 PM.png")

これはTwitterから提供されるコードそのままです。
Nginxでupstreamにhttpsなホストを設定する時の注意点

NginxのバックエンドにhttpsなURLを指定する時のお話。 

# proxy_pass を使う

こんな感じ？これは問題なく動作する。

```
server {

  ...

  location / {
    proxy_pass https://himitsu.no.site/;
  }

  ...
}
```

<br>


# upstream を使う

しかし、深遠なる理由（別エントリにする予定）でupstream化したい。
その場合、このように書けば動きそうだが。。。

```
upstream backend {
    server himitsu.no.site;
}

server {

  ...

  location / {
    proxy_pass https://backend/;
  }

  ...
}
```

しかし、実際はこんなエラーでうまく動かない。

```
2014/10/07 09:30:58 [error] 10661#0: *1 SSL_do_handshake() failed (SSL: error:140770FC:SSL 
routines:SSL23_GET_SERVER_HELLO:unknown protocol) while SSL handshaking to upstream, client: 127.0.0.1, 
server: 0.0.0.0, request: "GET / HTTP/1.1", upstream: "https://xx.xx.xx.xx:80/", host: "localhost"
```

ログをよく見ると、80番ポートにアクセスしようとしているらしい。
upstreamのserverで、きちんとポートまで指定してあげると問題なく動いた。

```
upstream backend {
    server himitsu.no.site:443;
}

server {

  ...

  location / {
    proxy_pass https://backend/;
  }

  ...
}
```


※ちなみに、ログをよく見ずにだいぶハマってしまったのは内緒
高負荷サイトのボトルネック対応

### 記事
[DSAS開発者の部屋:高負荷サイトのボトルネックを見つけるには](http://dsas.blog.klab.org/archives/51977201.html "DSAS開発者の部屋:高負荷サイトのボトルネックを見つけるには")

### 結論

`net.core.somaxconn` に気を付ける。

コマンドラインからだと

```
$ sysctl net.core.somaxconn
net.core.somaxconn = 128
$ sysctl -w net.core.somaxconn=1024
```

ファイルだと

```
$ vim /etc/sysctl.conf
...
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096
...
$ sysctl -p
```
CentOS4 Shellshock対応ワンライナー

# 前提

`yum`が走るので`vault.centos.org`リポジトリが登録できていなければなりません。
初期状態から登録させるには以下。

```bash
sed -ri.bak -e 's/^mirrorlist/#mirrorlist/g' -e 's/#baseurl=http:\/\/mirror\.centos\.org\/centos\/\$releasever/baseurl=http:\/\/vault\.centos\.org\/4\.9/g' /etc/yum.repos.d/CentOS-Base.repo
```

# ワンライナー

```bash
sudo sh -c 'export _ARCH=$([ `arch` = "x86_64" ] && echo x86_64 || echo i386); curl -ko /tmp/bash-3.0-27.0.3.el4.src.rpm https://oss.oracle.com/el4/SRPMS-updates/bash-3.0-27.0.3.el4.src.rpm && yum install -y gcc bison texinfo libtermcap-devel rpm-build && rpmbuild --rebuild /tmp/bash-3.0-27.0.3.el4.src.rpm && rpm -Uvh /usr/src/redhat/RPMS/"${_ARCH}"/bash-3.0-27.0.3."${_ARCH}".rpm && rm -f /tmp/bash-3.0-27.0.3.el4.src.rpm'
```

`i386`/`x86_64`、ログインシェルが`{sh,bash}`以外でも対応します。
ちなみにビルドの前後で`sh --version`は`3.00.15(1)`のまま変わりません。
以下でチェックできます([hannob/bashcheck](https://github.com/hannob/bashcheck))。

```bash
curl -ko /tmp/bashcheck.sh https://raw.githubusercontent.com/hannob/bashcheck/master/bashcheck && sh /tmp/bashcheck.sh
```

---

対応前：

```
Testing /bin/bash ...
Bash version 3.00.15(1)-release

Variable function parser active, maybe vulnerable to unknown parser bugs
Vulnerable to CVE-2014-6271 (original shellshock)
Vulnerable to CVE-2014-7169 (taviso bug)
Vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)
```

対応後：

```
Testing /bin/bash ...
Bash version 3.00.15(1)-release

Variable function parser pre/suffixed [(), redhat], bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Found non-exploitable CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)
```

# 参考URL

- [RHEL4/CentOS4向けのbash RPM(10/07 12:00修正) | OSAKANA TAROのメモ帳](http://blog.osakana.net/archives/5561)
- [CentOS4でbashをアップデートする（ShellShockの件、あるいは、CentOS4でもう一度yumをつかう件） - uzullaがブログ](http://uzulla.hateblo.jp/entry/2014/09/26/172516)
parse deploy が cron からうまく実行されない (x_x) よー

みなさん、cron 使ってますか？いつも書式を忘れてググってばかりおりますが、もし Ruby を使っているなら whenever とかいう便利なツールがあるそうですよ。

さて、parse.com 便利ですね。Hostingという機能で静的なウェブサイトにも使えるので重宝してます。

cron で、定期的に parse deploy して、静的コンテンツをアップロードしようとしたときにはまったので、その話。parse に限らず、cron 一般の話。

Ubuntu 12.04 です

## コマンドラインから期待通り動くのに

コマンドラインからは期待通り動くのに cron に設定すると動かないってことが時々あります。たいてい、パスの設定とか環境変数とかの問題であることが多いです。ただ、cronの実行時の標準出力とかエラー出力がどこにいっちゃうのかわからなかったんです。

```
0 * * * * /hoge/parsedeploy.sh
```

```bash:parsedeploy.sh 
cd /my/parse/app/path/
parse deploy
```

↑ のように書いても期待通り動かなかったのです。もちろんコマンドラインからの

```
$ parsedeploy.sh 
```

は問題無し。

## パスの問題でした

実行時の標準出力とエラー出力を出すようにして、parse not found みたいな感じだったので原因がわかってフルパスで実行すれば動きました。

```bash:parsedeploy.sh 
cd /my/parse/app/path/
/path/to/bin/parse deploy
```

## 原因のしらべかた

```bash:parsedeploy.sh 
cd /my/parse/app/path/
parse deploy >>bokustd.log 2>>bokuerror.log
```

のようにして標準出力と標準エラーがファイルに出力されるようにして、原因がわかりましたということでございます。

では
Tomcatのトラブルシューティング

Tomcatのトラブルシューティングにとても参考になる記事
### 記事インデックスページ

[現場から学ぶWebアプリ開発のトラブルハック - ＠IT](http://www.atmarkit.co.jp/fjava/index/index_troublehacks.html "現場から学ぶWebアプリ開発のトラブルハック - ＠IT")

### 注目記事

##### [現場から学ぶWebアプリ開発のトラブルハック（7）：【トラブル大捜査線】失われたコネクションを追え！ (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0709/25/news149.html "現場から学ぶWebアプリ開発のトラブルハック（7）：【トラブル大捜査線】失われたコネクションを追え！ (1/3) - ＠IT")
実際に同様の障害発生。
スレッドダンプ大事。

```
$ kill -3 [プロセスID]
```

`-3`は`-SIGQUIT`か。

##### [現場から学ぶWebアプリ開発のトラブルハック（1）：Webアプリの問題点を「見える化」する7つ道具 (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0703/22/news138.html#00 "現場から学ぶWebアプリ開発のトラブルハック（1）：Webアプリの問題点を「見える化」する7つ道具 (1/3) - ＠IT")
トラブル切り分けフロー。
老害のための画像処理ツール

いまさら gimpとか画像処理ツールの使い方覚えたくないけど、ちょっと alpha値をいじりたいんだ、とかいう老害おっさんのためのための onelinerです。

たとえば、以下のコマンドで max 80% alphaになってる Androidのアイコンを 100% alphaに変更できます:

```
convert drawable-hdpi/ic_action_refresh.png txt:- | perl -pe 's/\((\d+,\d+,\d+,)([\d\.]+)\)/sprintf "(%s%d)", $1, $2 * 1.25 * 255/e; ' | convert txt:- a.png
```
変換後は < ![a.png](https://qiita-image-store.s3.amazonaws.com/0/28133/4ac5a686-bdf2-de00-c228-7004bdcdab92.png) > これです。白いんで alpha 100%にしてもここでは見えませんが、saveしたりスタイルシート変えたりすれば見えるはずです。。

キモは [txt](http://www.imagemagick.org/Usage/files/#txt) フォーマットにしてるだけです。 rgbaが一行ごとに入ってくるので、色を変換したり、90度回転させたりがコマンドラインしか使えない老害おっさんにも簡単にできます。
ただ、convertからの出力は alphaが 0.0〜1.0なのに、入力させるときは 0〜255にしなきゃいけないのはバグの気がします。はまりました。

ちなみに perlも使ってより老害臭さをだしてみました。

まあ、頑張れば簡単な画像処理 (輪郭抽出) とかもできたりしそうなんで参考になれば幸いです。
MySQL  utf8(mb4)の照合順序(collation)たち

MySQLで文字列を比較するとき、照合順序を変更すると、
大文字小文字を区別できるようになったり、ソート順を設定できたりします。
よく使われる文字コードであるutf8とutf8mb4には、以下のような照合順序があります。

## utf8とutf8mb4で使える照合順序

|名前|概要|
|:--|:--|
|utf8(mb4)\_bin|大文字小文字を含めて、すべて異なる文字として扱う|
|utf8(mb4)\_general_ci|大文字小文字を同じ文字として扱う。デフォルト|
|utf8(mb4)\_unicode_ci|上記に加え、同じような文字を厳密に照合する。UCA 4.0を利用|
|utf8(mb4)\_unicode_520_ci|同上。ただしUCA 5.2.0を利用|

UCAとは[Unicode照合アルゴリズム](https://ja.wikipedia.org/wiki/Unicode%E7%85%A7%E5%90%88%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)のことです。
今後UCAのバージョンが上がるごとに新しい照合順序ができるようです。

utf8(mb4)照合順序は他にも多数ありますが、厳密な国際化を考えてない限りは関係ないでしょう。
言語や地域によって文字(列)の照合方法が若干変わるので、それをサポートしたものです。

##確認方法

各文字コードにおける照合順序の一覧は以下の方法で確認できます。

```mysql
SHOW COLLATION LIKE 'utf8mb4%'
```
例はutf8mb4です。
よく使うポート番号

# メール系
|protocol|port number|
|--------|-----------|
|POP3|110|
|POP3s|995|
|IMAP4|143|
|IMAP4s|993|
|SMTP|25/587|
|SMTPs|465|

# ウェブ系
|protocol|port number|
|--------|-----------|
|HTTP|80|
|HTTPS|443|
|webmin|10000|
|usermin|20000|

# データベース系
|protocol|port number|
|--------|-----------|
|postgres|5432|
|mysql|3306|
|Oracle SQL*Net Listener|1521|
|Oracle Connection Manager|1630|
|Oracle Management Agent|3938|
|Oracle Enterprise Manager Database Control(http)|1158|
|Oracle Enterprise Manager Database Console(TCP)|5520|
|SQL Server デフォルトインスタンス|1433|
|SQL Server Browser サービス|1434|
|Transact-SQL デバッガー|135|
Android StudioでAndroid Annotationsを使う方法

app/build.gradle の内容を次のように書き換えて、GradleのSyncを行います。

```groovy
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // Androidプラグインに使用しているバージョンに書き換える
        classpath 'com.android.tools.build:gradle:0.12.+'
        // Android Gradle プラグイン0.11から、android-apt 1.3以上を使わなければいけない
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.+'
    }
}

repositories {
    mavenCentral()
    mavenLocal()
}

apply plugin: "com.android.application"
apply plugin: 'android-apt'

dependencies {
    apt 'org.androidannotations:androidannotations:3.1'
    compile 'org.androidannotations:androidannotations-api:3.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // その他の必要な依存ライブラリー
    // compile 'com.android.support:support-v4:20.0.0'
    // compile 'com.android.support:appcompat-v7:20.0.0'
    // ...
}

apt {
    arguments {
        androidManifestFile variant.processResources.manifestFile
        resourcePackageName android.defaultConfig.applicationId

        // 追加のアノテーションプロセッシングオプションを下記のように指定可能
        // logLevel 'INFO'
        // logFile '/var/log/aa.log'
    }
}

android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId 'アプリのパッケージ名'
        minSdkVersion 14
        targetSdkVersion 20
        versionCode 1
        versionName '1.0'
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'build/generated/source/apt/${variant.dirName}']
        }
    }
}
```
ライブラリーのバージョンなど、必要に応じて書き換えてください。

これで`@EActivity`などが使えるようになります。
なお、Make Project (Ctrl+F9)をしないとクラスが生成されないので、AndroidManifest.xmlに_付きのActivity等を宣言する際は初回のみエラーが出るかも。
CVE-2014-3566 POODLEの対応

# 対応方針
SSLv3 を非対応にする

# 確認方法
ポート番号を変えれば、443以外でも確認可能

> openssl s_client -connect example.com:443 -ssl3


# apache2.2系
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/ssl.conf

> SSLProtocol ALL -SSLv2 -SSLv3

VHの設定も忘れないように。

# postfix2.5系
/etc/postfix/main.cf

> smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3

# dovecot2.1系
/etc/dovecot/conf.d/10-ssl.conf

> ssl_protocols = !SSLv2 !SSLv3
Swift / 画面サイズより大きい画像をスクロールで表示できるようにする

※2014/10/18　一部文言を修正。flashScrollIndicatorsについて追記。@takabosoft さん有り難うございます。

画像のスクロール表示はUIScrollViewを使う
-

画像の表示はUIImageViewにUIImageを埋め込むことで出来る。
　`UIImageView > UIImage`
スクロールはUIScrollViewに任意のViewを埋め込むことで出来る。
　`UIScrollView > View`

この二つから下のような親子関係にすれば画像をスクロール表示することが出来る。
　`UIScrollView > UIImageView > UIImage`

また、下記の２点を設定しないとうまくスクロール出来ませんでした。

1. UIImageViewのフレームサイズをUIImageに合わせること
    - UIImageViewのイニシャライザでUIImageのサイズに合わせてくれるのであまり意識する必要はない
2. UIScrollViewのcontentSizeプロパティをUIImageViewのフレームサイズと合わせること


UIScrollView表示時のスクロールバーをフラッシュ
-

UIScrollViewを表示する際はスクロールバーをフラッシュさせるflashScrollIndicators()を呼び出すべき。

>Discussion
>You **should** call this method whenever you bring the scroll view to front.

>https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instm/UIScrollView/flashScrollIndicators

サンプルコード内では下記に記述

```swift:スクロールバーのフラッシュ
    override func viewDidAppear(animated: Bool) {
        //UIScrollBar表示時にスクロールバーをフラッシュ表示
        scroll.flashScrollIndicators()
    }
```

サンプルコード
-

```swift:画像をスクロール表示
class ViewController: UIViewController {

    //StoryBoardからスクロールビューとイメージビューを関連づけ
    @IBOutlet var scroll: UIScrollView!
    @IBOutlet var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //UIImageに画像をセット
        let img:UIImage = UIImage(named: "hoge.jpg")
        
        //UIImageViewにUIImageをセット。UIImageViewのフレームサイズは
        //UIImageの画像サイズに自動的に合わせてくれる
        self.imageView = UIImageView(image: img)
                
        //画像の元サイズのままUIImageViewの左上に表示
        self.imageView.contentMode = UIViewContentMode.TopLeft
        
        //UIScrollViewにUIImageViewをセット
        self.scroll.addSubview(imageView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewDidAppear(animated: Bool) {
        //UIScrollBar表示時にスクロールバーをフラッシュ表示
        scroll.flashScrollIndicators()
    }

    override func viewDidLayoutSubviews() {
        //ScrollViewのサイズをImageViewに合わせる
        self.scroll.contentSize = self.imageView.frame.size
        
        //おまけ：ScrollViewの最下部にデフォルトの表示位置をセット
        self.scroll.contentOffset = CGPointMake(0, self.scroll.frame.height)
    }
}

```
scrollのcontentSizeをviewDidLayoutSubviews()で指定しているのは、AutoLayoutを使用した場合ここで記述しないとスクロールしてくれないという記事を見かけたからなのですが一応viewDidLoad内に記述してもスクロールしてくれました。
ただ後々詰まりそうなのでここに記述しています。そのあたりの細かいロジックは今後勉強していきたいなぁ。

これで想定動作はしているのですが、ただ何とも泥臭いやり方な気がします。(もはやストーリーボードがお払い箱というか...)
もっとスマートに出来る方法ないですかね〜。
npmでエラーおきたらとりあえず、 npm cache clean


メモです。

##モジュールインストールでこけました

```
npm WARN package.json nw-demo@ No description
npm WARN package.json nw-demo@ No repository field.
npm WARN package.json nw-demo@ No README data
npm ERR! Failed to parse json
npm ERR! Unexpected end of input
npm ERR! File: /Users/ryousuke/.npm/readable-stream/1.0.33-1/package/package.json
npm ERR! Failed to parse package.json data.
npm ERR! package.json must be actual JSON, not just JavaScript.
npm ERR! 
npm ERR! This is not a bug in npm.
npm ERR! Tell the package author to fix their package.json file. JSON.parse

npm ERR! System Darwin 13.4.0
npm ERR! command "/Users/ryousuke/.nvm/v0.10.29/bin/node" "/Users/ryousuke/.nvm/v0.10.29/bin/npm" "install" "request"
npm ERR! cwd /Users/ryousuke/Sites/offside/hellonodewebkit
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.14
npm ERR! file /Users/ryousuke/.npm/readable-stream/1.0.33-1/package/package.json
npm ERR! code EJSONPARSE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/ryousuke/Sites/offside/hellonodewebkit/npm-debug.log
npm ERR! not ok code 0
```

###一度`npm cache clean`したらいい感じになってくれました。

```
$npm cache clean
$npm install
```