OmniAICreator/Qiita-1.07M huggingface dataset:
iosメモリ管理


社内のアプリ勉強会での資料で、メモリ管理の初歩的なところをキュッとまとめています。

##メモリ管理の方法はリファレンスカウンター方式
###リファレンスカウンター方式とは
インスタンスが何箇所から参照されているかのカウントを保存していて、
それが0になったタイミングでインスタンスをリリースする方式

昔は変数に代入するタイミングでretain(+1)やら
変数を使わなくなったタイミングでrelease(-1)と手動で操作していた。

その辺を自動でやってくれるARC(Automatic Reference Counting)なるものが出来たものの、どうやってARCが機能しているかは理解する必要がある。

勉強する順序としては、「リファレンスカウンターの仕組み」→「ARC」が良い

##注意ポイント2つ
ARCの登場により、殆どメモリ管理については考える必要がなくなったが、次の２つは意識する必要がある。
・循環参照
・for文の中で大きいインスタンスを生成してる場合

###循環参照
循環参照とは二つのインスタンスがお互いの参照を持っていてどっちもリリース出来無い状況。
親子関係にあるインスタンスで子供が親の参照を持ってしまうとこうなる。
自分でdelegateを実装するときに陥りがち。

これを回避する方法として、どちらか片方のインスタンスのプロパティをweak(リファレンスカウンタを増やさ無い)で宣言することで回避できる。

###for文の中で大きいインスタンスを生成してる場合
ARCではインスタンスに自動的にautorelease属性がつくのですが、これは文字どおり自動的に解放してくれるという意味なのですが、解放するタイミングがメインループを抜けるタイミングなので、for文内で作られるインスタンスは全てメモリに蓄積されてしまいます。

これを回避する方法は、以下の様にautoreleasepoolで囲めば良い

```sample
autoreleasepool {
 //～メモリを多く使用する処理～
}
```

##deinitでリリースされているかの確認
実際アプリを作っていく上で、「あれ？メモリが増え続けてるな」となることがあります。
その場合は怪しいなと思うインスタンスのdeinitにログを仕込んどいてインスタンス解放のタイミングでそのログが出力されるかを確認します。
deinitはいわゆるデストラクタ的なもので、インスタンス解放直前にシステム側から呼ばれるので、これが呼ばれていれば確実に解放されているのがわかります。

呼ばれていなければ解放されて無いので、循環参照が無いか等の確認の為に、このインスタンスの参照を保持している変数を片っぱしから調べに行くわけですね。
社内ハッカソンを開催した話 (サイバードクリエイティブカーニバル)

# 概要
社内向けのアイデアソン+ハッカソンを行った開催報告になります。
「社内でハッカソンをやりたい！」という企業さんなどの参考になれば幸いです。
※時系列順ではなく、開催概要から準備という流れになっています。

# アイデアソン: 2015/09/11 (金) 19:00 〜 21:00
テーマは当日発表で「職場を笑顔にするサービス」です。

進め方は下記を参考にさせていただきました。
※主催者が過去に参加したハッカソンで用いられたものです。
http://www.slideshare.net/hirokazuyabuki/code-for-japan4brigade

## 当日の様子
- バルーンアーチを作ってカーニバルの雰囲気を出しました。作成には下記のサイトを参考にさせていただきました。

http://www.yumefuusen.co.jp/makecolam.shtml

フレームはマイクスタンドに紐をつなぐことで実現しました。
![IMG_0401.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/83bedcd2-dfd2-f8ba-bea8-9e13e40deb9f.jpeg)

### マンダラート
- 普段から頭を使うことに慣れているかどうかで差がありそうでした。今回は初めてということもあり、最初の8個を埋める作業は2分間使いました(通常は1分間で行います)。
![IMG_0437.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/a290df64-106f-871d-8462-e1d25ec37ef3.jpeg)


### スピードストーミング
- 想定以上に白熱しました。普段話せない人とも話せるのでコミュニケーション促進の意味でも使えるかもしれません。
![IMG_0449.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/6c0e9015-861a-677b-7a8f-e238e60786c7.jpeg)

### アイデアレビュー
- 上位のアイデア発案者にはステージに上がって発表してもらいました。
![IMG_0521.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/a15a59c4-88ec-9d52-e172-5d84b076d35f.jpeg)

### アイデアソン表彰
- 上位のアイデアから気に入ったものを偉い人に表彰してもらいました。
![IMG_0538.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/a1b2c294-434c-51e5-4d77-54fdeb041219.jpeg)


- 上位のアイデアを実現すべく、チームビルディングを行い、AWS上に開発環境を作成し、この日は終了

# ハッカソン: 2015/09/12 (土) 10:00 〜 20:00
## 開発
- 前日決めたチームで開発しました。社外からも参加者があつまりました。
![DSC01875.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/35620291-b7b1-492d-f1f5-391bc3bd9a7c.jpeg)


## 発表
- デモとともに発表しました。こちらは普通のハッカソンと同様です。

# 表彰&懇親会
- 偉い人に表彰してもらいました。
- 親睦も深まったことでしょう。
![DSC01966.JPG](https://qiita-image-store.s3.amazonaws.com/0/89343/19434e6c-5219-8970-99e4-92dd629eb0ec.jpeg)


# 振り返り
振り返りでは以下ものが主に挙がりました。
### 参加者の人数が多い(非技術者もきた)
- 「ハッカソン」ではなくて「カーニバル」という名称にした
- アイディアソンとハッカソンを分けたので告知で非技術者でも参加できることをアピールした
- 運営にはエンジニア以外の方にも入ってもらえて, 参加者の幅を広げられた

### みんな笑顔だった
- バルーンアーチ, Tシャツ, ロゴ, うちわなどを用意したため、会場の雰囲気や運営の雰囲気が良かった
![COnUDX-UcAE1eKQ.jpg-large.png](https://qiita-image-store.s3.amazonaws.com/0/59261/3609944c-e2cc-c195-f0a7-bb029203dc4a.png)
![COnSk3mUwAAacd4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59261/9d885cf1-c467-8737-2355-80d6c28cd5d2.jpeg)


## 今後の展開
- 社内向けのサービスでしたがブラッシュアップして開発してよりよいものにしていければと思います。


## 開催までの流れ

### 前回開催
- 2013年7月に「サイバードハッカソン」を開催
- 休日1日を使って開発を行った。

### 前回の振り返りからの改善点

- アイデアソンとハッカソンを分けて開催、アイデアソンのみの参加も可にする

> アイデアソンがないため非技術者の参加者が少なかったため

- サイバードクリエイティブカーニバルというキャッチーな名前にして技術よりもお祭りのような雰囲気を強調

> ハッカソンという名前はハードルが高く感じるのではという仮説から
[Guard-Rspec] guard-rspec を使ってって　No such file or directory @ rb_sysopen - tmp/rspec_guard_result　なエラーが出た。

```rb:error
10:30:07 - ERROR - Guard::RSpec failed to achieve its <run_on_modifications>, exception was:
> [#] Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/rspec_guard_result
```

問題はguard-rspecのバージョンで、4.6.1以降では解決されているようです。

https://github.com/guard/guard-rspec/issues/326
【15.09.18:再編】MacでBOM付きファイルを抽出する

【150918:再編集】

MacでBOM付きファイルを探す方法を検索すると、
`file`コマンドで`(with BOM)`と表示されるファイルを検索する方法がいくつかありました。

```
$ file BOM.txt
BOM.txt: UTF-8 Unicode (with BOM) text
```

しかし、fileコマンドでは`(with BOM)`と**表示されない**BOM付きファイルがいくつも見つかったので、
別の方法を探しました。

そこで思いついたのが、`hexdump`でバイナリを直接確認する方法でした。

```
find . -type f -name '*.php' | xargs -n1 hexdump -C | grep "ef bb bf"
```

上記のコマンドは、確かにBOM付きファイルを見つけることはできるのですが、
ファイルのパスや名前などが全く分からないため、著しく使い勝手の悪いコマンドでした。

そこで、他の検索方法をこの記事で教えて頂きたい旨を書いた所、
コメントでたくさんのアドバイスを頂くことができました。

結果、私の結論は下記のコマンドになりました。

```
grep -lr --include="*.php" ^$'\xef\xbb\xbf' .
```

***

***解説***

* `-l`：検索条件にマッチしたファイル名を表示
* `-r`：ディレクトリ内を再帰的に処理する
* `--include`：検索対象のファイル名を指定
* `^`：正規表現で行の先頭を指定するメタ文字
* `$`：エスケープ・シーケンスを使用する宣言
* `\xef\xbb\xbf`：エスケープ・シーケンス`/x`により16進数でBOMを指定

それでは、皆様も良いBOM付きファイル検索ライフをお送り下さい。
VimでHaskellしよう

# はじめに

手続き型言語やオブジェクト指向言語でも関数型プログラミングっぽい要素が取り入れられるようになってきた昨今、より関数型プログラミングへの理解を深めようと思いHaskellを始めることにしました。

環境は以下の通りです。

* Mac OS X 10.10.4
* zsh 5.0.5

# Haskellをインストール

下記をインストールします。

```
$ brew update
$ brew install ghc
$ brew install cabal-install
```

* gch (Glasgow Haskell Compiler) 7.10.2
* cabal (Cabal build system) 1.22.6.0

# Vimをアップデート

後述するプラグインの中で、Vimが最新のものでないと動作しないものがあるのでVimをアップーデートします。

```
$ brew install vim
$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Sep 12 2015 10:18:48)
```

* vim 7.4

# Haskellの外部コマンドをインストール

Vimのプラグインと合わせて使用する外部コマンドをインストールしておきます。

* ghc-mod

その前にcabalをアップデートしておきましょう

```
$ cabal update
```

## ghc-mod

型情報を参照できる外部コマンドです。

```
$ cabal install ghc-mod
```

10分ほどかかります。

* ghc-mod 5.3.0.0

## Pathを通す

どうやら下記にインストールされているようなのでPathを通しておきます。

```
export PATH="$HOME/Library/Haskell/bin:$PATH"
```

# Vimのプラグインをインストールする

`.vimrc`にプラグインリストを追加します。
NeoBundleを使用します。

```
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'thinca/vim-ref'
NeoBundle 'kana/vim-filetype-haskell'
NeoBundle 'eagletmt/ghcmod-vim'
NeoBundle 'ujihisa/neco-ghc'
NeoBundle 'osyo-manga/vim-watchdogs'
NeoBundle 'ujihisa/ref-hoogle'
NeoBundle 'ujihisa/unite-haskellimport'
```

Vimで`NeoBundleInstall`します

```
:NeoBundleInstall
```

# さあはじめよう！

これで快適なHaskellライフが送れると信じて、頑張りましょう！
Safariのクッキー設定が「アクセス中のWebサイトのみ許可」の場合、facebookログインができない


特定の条件で、ユーザーがfacebookログインできない問題が起きているので調べました。

#条件

・Safari(Mac版、iOS版) 
・Cookieの設定が「アクセス中のWebサイトのみ許可」
・facebookにログインしていない

この条件で、facebookログインができない。
現象を確認したSafariのバージョン(Mac 8.0.8、iOS 8.4.1) 

#原因

この条件の時、SafariがCookieを送ってこない
Safariのバグ

Safari 8 cookie bug and OAuth redirects
https://github.com/zotonic/zotonic/issues/902

#対策

↑にも書かれているが、reloadをかけるとCookieが来る

あるいは

https://bugs.webkit.org/show_bug.cgi?id=139683

次のOSのリリースで治るそうなので、9/17のiOS9を待つ

#追記

9/17
iOS9がリリースされ、アップデートしたところ、このバグが修正されていることを確認しました。


#さらに追記

2016/06/20
同じ問題が以下の環境で再発しています。

Mac OSX 10.10.5 (現時点の最新版は10.11.5)
Safari 9.1.1 (現時点で最新版）

少なくとも、この組み合わせのときに、SafariのCookie設定が「アクセス中のWebサイトのみ許可」の場合、クッキーが送られてこない問題が起きることを確認しました。
OS Xのバージョン番号が似ているのと、**最新版のMac OSXでは起きない**ため原因追求にてまどりました。

この問題、Safariの今後のバージョンでも再発しないか心配ですね。

対策として、(iOSではすでにやっていましたが、) Mac版Safariでログインできなかった時のエラーメッセージを、以下のようにしておきました。

アカウントのログインに失敗しました。Safariの「環境設定」>「プライバシー」>「Cookie と Web サイトのデータ」の設定が「常に許可」または「アクセスした Web サイトは許可」になっていることをご確認ください。設定を変更後、Safariを再起動してからログインをお試しください。
コミットログの作者、メールアドレスなどをまとめて修正する方法

## まとめてコミットログを修正
ある程度コードを書いた後に、オープンソース化しようとした場合に、コミットログに個人を特定できてしまう情報(作者名やメールアドレス)などが残ってしまっていました。

下記のコマンドは、コミットログを壊さずに(***ハッシュ値は変わりますが***)それらの情報を修正することができます。

```bash
$ git filter-branch -f --commit-filter '
> if [ "$GIT_AUTHOR_EMAIL" = "before@example.com" ];
> then
> GIT_AUTHOR_NAME="after";
> GIT_AUTHOR_EMAIL="after@example.com";
> GIT_COMMITTER_NAME="after";
> GIT_COMMITTER_EMAIL="after@example.com";
> git commit-tree "$@";
> else
> git commit-tree "$@";
> fi' HEAD
```

> `if`文に、変更したいコミットの条件を記述し、
> `then`〜`else`の間に変更したい内容を記述して下さい。

### 補足
1. `GIT_COMMITTER_NAME`と`GIT_COMMITTER_EMAIL`も含めること。
    * `GIT_COMMITTER_NAME`と`GIT_COMMITTER_EMAIL`を指定しないで上記コマンドを実行した場合、`git log`コマンドでは確認できませんでしたが、`SourceTree`ではコミッターが変更されていませんでした。

## 参考
* [Git-のさまざまなツール-歴史の書き換え](https://git-scm.com/book/ja/v1/Git-のさまざまなツール-歴史の書き換え)
* [GitのCommit中のAuthor名およびCommitter名を変える](d.hatena.ne.jp/idesaku/20090908/1252419890)

以上
Mondrianのビルド@Windows

Mondrianのソースコードをビルドして動かしてみる。

おおざっぱに以下の流れ。
1. Java, Antの環境構築
2. ソースコード入手
3. ビルド

Mondrianのマニュアル（http://mondrian.pentaho.com/documentation/developers_guide.php）を読むと以下のように書いてある。
---------------------------------------------------
Building the code

Setting up your environment

Download and install a JDK for Java 1.5, 1.6 and 1.7. You can download the releases from Oracle
Mondrian requires all three versions to build correctly. When Mondrian creates JDBC connections, it creates JDBC version 3 connections with Java 1.5, version 4 connections with Java 1.6 and version 4.1 connections with Java 1.7. The factory classes that create JDBC connections(FactoryJdbc3Impl, FactoryJdbc4Impl and FactoryJdbc41Impl) need to be compiled with the matching JDK version.

Download and install Ant version 1.6 or later. You can download Ant from Apache
Setup environment variables JAVA_HOME_15, JAVA_HOME_16, JAVA_HOME_17 and ANT_HOME to point at the locations where you installed them. Set JAVA_HOME to your Java 1.5 JDK.

---------------------------------------------------

順番に実施していく。

1. Java, Antの環境構築
1.1 Javaのインストール
上記マニュアルによると、Mondrianでサポートしている最新のJDKは1.7なので、1.7をインストール。
Oracleのページ(http://www.oracle.com/technetwork/jp/java/javase/downloads/jdk7-downloads-1880260.html)からインストーラをダウンロードして実行しインストール。

JAVA_HOME_17を書く必要がありそうなので、それを定義。JDK 1.7のパスを指定。

下記のURLを見ながら、JAVA_HOMEを設定。
http://www.javadrive.jp/install/jdk/index4.html
今回は、JAVA_HOMEには%JAVA_HOME_17%と書いて、JDK1.7を間接的に指定。

1.2 Antのインストール
下記からダウンロード。
http://ant.apache.org/bindownload.cgi

下記のURLを見ながら、環境変数(ANT_HOME)とPATHを設定。
http://www.javadrive.jp/ant/install/index2.html

2. ソースコード入手
Githubにアカウントを作って、Mondrianのプロジェクトをfork。
gitのコンソールを触るのをサボって、SourceTreeというソフトをインストール。
SourceTree上で、Mondrianのプロジェクトを指定。勝手にダウンロードしてくれる。

3. ビルド
Mondrianのソースフォルダに移動して、antを実行。
なんかヘルプファイルの作成が始まったっぽい。。そうじゃない。
ant -projecthelp
と実行すると、どうも subfloor.XXX でソースのビルドが始まるみたい。なので、
ant subfloor.jar
を実行。
やった、ビルドされたみたい。Apache ivyというのを使っているみたいで、勝手に必要な（依存関係のある）ライブラリもダウンロードしてくれているよう。
[AWS]Amazon Management ConsoleのMFA Code入力の裏技に気づいた！

セキュリティ向上のために皆さん、AWSアカウントにはMFA設定していると思いますが、ログインするときに2回画面遷移があって面倒ですよね？

なんとパスワード入力フォームに「パスワード」＋「Authentication Code」を入れてポストすると1回の画面遷移でログインできるんです！

たまたま間違って入力したらログインできちゃって気づいたのでした。
Deviseとかメール認証使った時にSMTPのテストメールしたい場合に便利なやつ（Rails以外でもOK）

登録とかでメール認証を作りたいんだけど、テスト用にフリーメール登録してSMTP設定して・・・
とか面倒だなーってときに便利なサイト発見
[Mailtrap.io - Fake smtp testing server.Dummy smtp email testing](https://mailtrap.io/)

使い方は簡単。
無料登録してログインするとこんな画面が表示されるので、Demo indexのリンクをクリックすると、
![mailtrap.png](https://qiita-image-store.s3.amazonaws.com/0/70195/5b573ab3-b35d-8e76-77d5-34f36a41f8a6.png)
こんな感じで設定画面が表示されます。
![mailtrap2.png](https://qiita-image-store.s3.amazonaws.com/0/70195/6a658f60-03ef-1a30-976b-c676d34f1831.png)
あとはIntegrationsのところで言語を選べば、すぐ下に設定が表示されるので、それをコピペするだけ。

設定のところにこんな感じで書かれているので、そのファイルに追記してあげるだけ。

> In config/environments/*.rb specify ActionMailer defaults for your development or staging servers:

Rails開発環境だったらここかな。
config/environments/development.rb

あとは普通にアプリケーションで操作してメール飛ばすと、
この２つ目の画像の左側にメールがどんどん貯まっていきます。


とりあえず登録してから結構経つけど変なメールが届くようになったとかいうことはないです。
ios9 起動時にクラッシュでリジェクト


###※既存のアプリで以下の様な実装をしている場合、ios9にアップしたタイミングでアプリが起動しなくなる可能性が濃厚なので早めに対応したほうがいいかもです。

先日、申請に出していたアプリが起動時にクラッシュするということで、appleからリジェクトをくらいました。

そんなはずは無いけどなと思い再度確認するものの現象の再現が出来ず色々と調べておりましたら。
こんな記事を見つけました。
[iOS9でアプリが起動直後にクラッシュする場合の回避方法](http://qiita.com/peromasamune/items/716de6da66dd31faeba8)

これは[didFinishLaunchingWithOptions]でwindowのrootViewControllerに何も入れて無いとios9からクラッシュするよというものです。

今回提出していたアプリは起動時に通信を挟んでそのレスポンスを元にwindowのrootViewControllerに入れるViewControllerを分けていた為に、[didFinishLaunchingWithOptions]ではrootViewControllerには何も入れていませんでした。

そしてappleから頂いたクラッシュレポートを見た所
[OS Version:          iOS 9.0 (13A340)]
と記載があり、ios9でレビューしているようでした。

今回の対策としては[didFinishLaunchingWithOptions]でwindowのrootViewControllerにただのUIViewControllerのインスタンスを突っ込み再申請しました。

追記：またリジェクトくらいました。原因はまた起動時に落ちるということだったので、面倒だったのですが、原因究明のためXcodeを7.0にし、swift2.0の為にコードを修正して確認しました。
すると、データを保存しているフォルダの名前を日本語にしていたのですが、どうやらios9ではうまく読み込めていないようでした。
そこでフォルダ名を英語にし再申請しました。

更に追記：無事審査通りました。

#てかそもそも正式リリースしてないOSでレビューすんなよって話だよ!!
ま、ios9が公開されてクラッシュされるよりましだが…
Viで忘れがちな便利操作

# 一括置換
- ファイルの中の全ての検索語句を置換する

```
:%s/old/new/g
```

- 置換したい文字にスラッシュが含まれる場合
セミコロンで区切り文字を変更する

```
%s;/opt/bitnami;/opt/owncloud;g
```

## 複数行のコメントアウト/コメントアウト解除
- 複数行のコメントアウト

1. 選択を開始する行の一番上にカーソルを置き、```Ctrl+v```で矩形選択モード
1. `j (下方向)` で変更する行を選択
1. `I(iの大文字)Shift+i` で挿入モードへ
1. コメントアウト文字入力(1文字だけ入力されます)
1. `Esc`

- 複数行のコメントアウト解除

1. 選択を開始する行の一番上にカーソルを置き、`Ctrl+v` で矩形選択モード
1. `j (下方向)` で変更する行を選択
1. `d` を入力すると選択部分が削除されます。
Selective Hashing: Closing the Gap between Radius Search and k-NN Searchを読んだ

# KDD2015 Selective Hashing: Closing the Gap between Radius Search and k-NN Searchを読んだ
## どんなもの？
k-NN用のHashを提案。LSHと同様のrecallを達成できることを示した

## 先行研究と比べると？
LSHは固定半径の近傍検索には向いているが、k-NNには向いていない。

k-NN向けのハッシュも存在しているが、グローバルな構造を見ている。
提案法は全ての点のローカルな構造を考慮している。

## 技術や手法のキモはどこ？
近傍の大きさを少しづつ大きくしたインデックスを作る
まわりのデータ密度に応じて各インデックスに登録する
マルチインデックスによる検索を行う

## どうやって有効だと検証した？
- 理論的にLSHと同様のrecallを達成できることを証明
- 実データでrecallに対する検索時間やインデックスサイズの効率を示した

## 次に読むべき論文は？
- Similarity search in high dimensions via hashing
- Locality-sensitive hashing scheme based on p-stable distributions
- Lower bounds on locality sensitive hashing

## ref
- http://dl.acm.org/citation.cfm?id=2783258.2783284

## 参考
- ハッシュまわり： http://www.slideshare.net/pfi/pfi-seminar-20120315
[リンク切れ] onlineTool > JSON整形ツール

JSONのテキストを整形するツール。

~~http://www.ctrlshift.net/jsonprettyprinter/~~
(追記 2018/04/19 リンク切れ)

試しに以下から取得可能なJSONテキストを整形すると
http://weather.livedoor.com/weather_hacks/webservice

![jsonSample.png](https://qiita-image-store.s3.amazonaws.com/0/32870/65664828-45ee-3383-eae9-a080d7f51874.png)

<hr>
(追記 2016/11/06)

以下でJSON向けの他の良いツールが紹介されています。
http://qiita.com/sahn/items/94402771920e5a74260e
unity > Dictionary > .Add() / KeyValuePair > Keyの重複はだめ

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

参考: http://qiita.com/kwst/items/2cfd01b7f28daf0f495e

```dicTest.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for Dictionary

public class dicTest : MonoBehaviour {

	void Test_dictionary() {
		Dictionary <int, int> myDic = new Dictionary<int, int> ();

		myDic.Add (3, 1415);
		myDic.Add (2, 7182);
//		myDic.Add (3, 1234);

		foreach (KeyValuePair<int, int> pair in myDic) {
			Debug.Log(pair.Key + " : " + pair.Value);
		}

	}

	void Start () {
		Test_dictionary ();
	}	
}
```

![Main_unity_-_150915-dictionaryTest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/fd655f33-bf66-434d-c5d0-e956930c41b0.jpeg)

Keyが重ならない(3と2）場合は上記のように実行できる。

以下の行のコメントアウトを解除（アンコメント?）すると「同じキーの要素がすでに辞書にあります」というエラーになる。

```
//      myDic.Add (3, 1234);
```

![Main_unity_-_150915-dictionaryTest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/40aadc1e-252e-380e-c82e-ceff8da429d3.jpeg)

同じキーではValueが異なるものを扱う場合は、キーが重ならないようにするか、Dictionaryを使うのをやめて、Listを使う方がいいかもしれない。

しかし、Listの使い方がまだきちんと理解できてなく、1つのstringを保持するListは作成できるが、2つのstring型を保持するListの作るのに失敗している。
技術英語 > from person to person > 無冠詞

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

> Opinions may differ from person to person.
...
from a person to a personとするべきですが、冠詞の繰り返しを避ける意味で、無冠詞となっているのです。

<hr>

関連して思い出したのは

from coast to coast
from generation to generation
from country to country

codingに結びつけるとしたら以下のようなものだろうか?
> The coding rule may differ from language to language.
Pythonパッケージへのディレクトリ移動ツール (pycd)

ものすごくありそうなのに見つからなかったので、作りました。 → [**pycd: `cd` to python modules**](https://github.com/wkentaro/pycd)

Pythonのパッケージを書いていると他のパッケージから持ってくればすぐ終わりそうだな、と思うことが多々あります。
そういうとき、さっとそのパッケージのディレクトリへ移動して、`grep`したりエディタで見たりするためのツールが`pycd`です。

使い方
------

```
$ pycd requests

$ pwd
/usr/lib/python2.7/dist-packages/requests

$ grep 'def get(' *
api.py:def get(url, **kwargs):
cookies.py:    def get(self, name, default=None, domain=None, path=None):
sessions.py:    def get(self, url, **kwargs):
structures.py:    def get(self, key, default=None):
```

インストール方法
---------------

```
$ pip install pycd
```

以下を`~/.bashrc`(or `.zshrc`)へ追加．

```
source `which pycd.sh`
```

パッケージ名の指定方法に関して
---------------------------

このとき重要なのは、引数として`import`する名前を指定するか`pip`でインストールするときに指定する名前を指定するかになりますが、importの方が慣れている人が多いと思うのでそちらにしました。
そうなると`pip show PAKAGE`では実現できないので、別のツールを作ることになりました:

```
$ pip show sklearn  # does not work

$ pip show scikit-learn
---
Name: scikit-learn
Version: 0.16.1
Location: /usr/local/lib/python2.7/dist-packages
Requires: 
```


それが`pypack`ですが、もしかしたら役に立つかもしれないので、書いておきます:

```
$ pypack find numpy
/usr/local/lib/python2.7/dist-packages/numpy

$ pypack list
numpy
sklearn
scipy
...
```

最後に
------

再利用できるコードを探すだけでなく、依存しているパッケージのバグを探すのにもかなり重宝しているのでよければ使ってみてください。

[**pycd: `cd` to python modules**](https://github.com/wkentaro/pycd)

また，もっといいツールがあるという場合は教えていただけると嬉しいです。
REST APIのテストをChakramで行なう



はじめに
--
[Chakram](http://dareid.github.io/chakram/) はREST APIを実行するためのTestFrameworkです。記述方法はBDDが採用されているため、自然とテストの内容が解りやすいテストコードを記述することが出来ます。また、サイト上に掲載してある[Example](http://dareid.github.io/chakram/example/spotify/)はとても親切です。今回はそんなChakramを[Document](http://dareid.github.io/chakram/jsdoc/index.html)を確認しながら、インストールから実際に使用するところまでをQiitaのAPIを使用して行いたいと思います。


インストール
--
下記のコマンドを実行すればChakramのインストールが完了します。

```sh
# Chakramのインストール (--save-dev を付与するとpackege.jsonにchakramを追記してくれます。)
npm install chakram --save-dev

# 実行結果
chakram@1.0.1 ../node_modules/chakram
├── extend-object@1.0.0
├── chai-subset@1.0.1
├── chai-as-promised@5.1.0
├── tv4@1.1.12
├── q@1.4.1
├── chai@3.0.0 (assertion-error@1.0.1, type-detect@1.0.0, deep-eql@0.1.3)
└── request@2.57.0 (caseless@0.10.0, aws-sign2@0.5.0, forever-agent@0.6.1, stringstream@0.0.4, oauth-sign@0.8.0, tunnel-agent@0.4.1, isstream@0.1.2, json-stringify-safe@5.0.1, node-uuid@1.4.3, qs@3.1.0, combined-stream@1.0.5, bl@0.9.4, form-data@0.2.0, http-signature@0.11.0, mime-types@2.0.14, tough-cookie@2.0.0, hawk@2.3.1, har-validator@1.8.0)
```

Chakramで簡単なテストを書く ...φ(..)
--
早速、Qiitaの投稿一覧を取得するAPIを叩いて下記の内容をテストするChakramで書いてみました。

- レスポンスのステータスコードが200であるか
- レスポンスの構造に指定したkeyが含まれているか

```js
var chakram = require('chakram'),
    expect = chakram.expect;

describe("Qiita API", function() {
    var apiResponse;

    before(function () {
        apiResponse = chakram.get("https://qiita.com/api/v2/items");
    });

    it("should return 200 on success", function () {
        return expect(apiResponse).to.have.status(200);
    });

    it("should include rendered_body, body, title, user", function () {
        return expect(apiResponse).to.have.schema('[0]', {
            "required": [
                "rendered_body",
                "body",
                "title",
                "user"
            ]
        });
    });
});
```

テストの実行
--

Chakramで記述したテストを実行するには別途mochaが必要になります。
下記のコマンドを実行しmochaをインストールしましょう。

```sh
# mochaのインストール
npm install -g mocha

# 実行結果
/Users/kenya/.nodebrew/current/bin/_mocha -> /Users/kenya/.nodebrew/current/lib/node_modules/mocha/bin/_mocha
/Users/kenya/.nodebrew/current/bin/mocha -> /Users/kenya/.nodebrew/current/lib/node_modules/mocha/bin/mocha
mocha@2.3.2 /Users/kenya/.nodebrew/current/lib/node_modules/mocha
├── escape-string-regexp@1.0.2
├── supports-color@1.2.0
├── commander@2.3.0
├── growl@1.8.1
├── diff@1.4.0
├── mkdirp@0.5.0 (minimist@0.0.8)
├── debug@2.0.0 (ms@0.6.2)
├── glob@3.2.3 (inherits@2.0.1, graceful-fs@2.0.3, minimatch@0.2.14)
└── jade@1.11.0 (character-parser@1.2.1, void-elements@2.0.1, commander@2.6.0, jstransformer@0.0.2, clean-css@3.4.3, constantinople@3.0.2, with@4.0.3, uglify-js@2.4.24, transformers@2.1.0)
```

以上で準備は完了です。それではテストを実行してみましょう。

```sh
# テストの実行(テストファイル(qiita.js)のパスは各自の環境に合わせて下さい。)
mocha qiita.js

# 実行結果
  Qiita API
    ✓ should return 200 on success (559ms)
    ✓ should include rendered_body, body, title, user


  2 passing (605ms)

```

見事にテストに成功しました！とても簡単ですね！

つかってみて
--
現在、仕事でAPIを沢山書いているのですが、お恥ずかしながらテストが存在しません。。。１つも。。。
今後、毎回手動でテストを実行するのも継続的に見て宜しくないことは明らかなので、Chakram等のTestFrameworkを採用してより良い環境にしていきたいと思います！
gulp-typescript で --target es6 から babel に通しつつ Incremental Buildする


[ivogabe/gulp-typescript](https://github.com/ivogabe/gulp-typescript "ivogabe/gulp-typescript")

元々typescriptなんてtscを生で叩けばいいじゃん派だったのだが、--target es6 で吐いたのをさらにbabelに通す必要があって、一旦書きだしたものをさらにbabelを通そうとすると、tmpなディレクトリが必要になるし、ファイルIOに負荷がかかるので、gulpのストリームの中で変換したかった。

## やりたいこと

node / electron で走らせたかったので browserify せずに src -> lib に書き出す。lib は es5 仕様。

```
src/
    foo.ts
    bar.ts
lib/
    foo.js
    bar.js
```

ブラウザ用に書き出すときは必要に応じてbrowserifyする。debug中はElectronで走らせることでbrowserifyをスキップしたかった。

最初はbabelのrequire.extensions を拡張していたのだが、babel上での変形が重すぎた。

## やりたいこと2

インクリメンタルビルド

## gulpfile.coffee

- tsconfig.json に --target es6 とか諸々を書く。
- devDependencies に typescript: 1.6.0-dev.20150909 等を書く(async/awaitを使いたいのでnightly)
- gulpfileを書く

```js
ts = require 'gulp-typescript'
replace = require 'gulp-replace'
rename = require 'gulp-rename'
babel = require 'gulp-babel'
tsProject = ts.createProject 'tsconfig.json',
  typescript: require 'typescript'
  sortOutput: true

gulp.task 'build:ts', ->
  tsProject.src()
    .pipe ts(tsProject)
    .pipe rename (p) -> p.dirname = p.dirname.replace('src', ''); p
    .pipe babel()
    .pipe gulp.dest 'lib'
gulp.task 'watch:ts', ->
  gulp.watch('src/**/*.ts', ['build:ts'])
```

なんかこのままだと src -> lib/src に相対変換されたので、gulp-renameで無理やり書き換えた。もっと綺麗にやる方法はちゃんとありそう…

`$ gulp watch:ts` で監視を開始して、適当な src/index.ts を複数回保存してみて、自分の手元で最初は2.28s だったのが次は1.1s だったりしたのでたぶんインクリメンタルビルドできてると思う。

It works

## 参考

[gulp-tscとgulp-typescriptの利用方法の違いについて - Qiita](http://qiita.com/yuichiroharai/items/42e559e2c15e1e5ffa39 "gulp-tscとgulp-typescriptの利用方法の違いについて - Qiita")
Swift のゼロ除算

# これはなに
Swift のゼロ除算は型によって結果が異なることを知ったので共有させていただきます。
__環境： Xcode 7 GM seed (Swift2.0), Playground__

## ゼロ除算
以下の型で試しました。

- Int
    - 変数
    - 直接
- Float
    - 変数
- Double
    - 変数
    - 直接

`0.0` とか直接書くとデフォルトで `Double` になるので `Float` の直接はやりませんでした。

## 結果

- Int
    - 変数：実行時エラー `Execution was interrupted, reason: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0).`
    - 直接`1000/0`： 実行時エラー `Division by zero`
- Float
    - 割られる数によって結果が異なる、変数でも直接でも結果は同じ
- Double
    - 割られる数によって結果が異なる、変数でも直接でも結果は同じ

### Float, Double の計算結果

割られる数が 0 か 正 か 負 かで結果が変わります。

- `0.0 / 0.0 = NaN`
- `1000.0 / 0.0 = ∞`
- `-1000.0 / 0.0 = -∞` 

# まとめ

- `Float`, `Double` の場合は実行時エラーにならないので注意
- **Intの場合は**変数で計算するのと直接計算するのでは計算結果、エラーが異なる

# オーバーフロー演算子
ちなみに Swift にはオーバーフロー演算子という、オーバーフローしてもエラーにならない演算子というのがあります。
`&+`, `&-`, `&*` の三種類があります。
除算 `&/` と余剰 `&%` も昔はありましたが、なくなりました。

## 今回試した Playground
- https://gist.github.com/mokumoku/999eed7aad9441dff979

## 参考
- https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-ID37
Msys2 で導入した git で NTEmacs の magit が動かない問題をどうにかしてみる

Magit version 20151019.443 現在、シンボリックリンク以外の問題は修正されている模様

先日、Msys2 の git が version 2.5.1 にアップデートされて以降、NTEmacs で magit (https://github.com/magit/magit) が動かなくなってしまったので、どうにか動くようにしてみた。

以下の環境で検証

* Windows 7、NTEmacs 24.5.1、msys/git 2.5.1、magit melpa の最新版
* NTEmacs と msys/bash は連携済み

`init.el` あたりに以下の advice を設定するといいらしい
注) NTEmacs 24.3 以前を使用している場合 新 advice は動作しないので 旧 advice に書き直しが必要。

```el:init.el
;; read repository する際, シンボリックリンクが含まれると
;; うまく読み込めない問題を修正
(defun ad-magit-read-repository (orig-fun &rest args)
  (let ((ret_val (apply orig-fun args)))
	(if (file-directory-p ret_val) (file-truename ret_val))))
(advice-add 'magit-read-repository :around 'ad-magit-read-repository)

;; Magit version 20150925.821 現在 以下の問題は修正された模様
;; process-file で実行するコマンド中に quote されていない "{" "}" が
;; 含まれていると, それが勝手に削除されて,エラーになる問題を修正
;;(defun ad-magit-process-git-arguments (orig-fun &rest args)
;;  (mapcar (lambda (x) (replace-regexp-in-string "\\^\\({.*}\\)" "^'\\1'" x))
;;   (apply orig-fun args)))
;;(advice-add 'magit-process-git-arguments :around 'ad-magit-process-git-arguments)

;; Magit version 20151019.443 現在 以下の問題は修正された模様
;; "git --rev-parse --show-toplevel" で出力される
;; パスが unix 形式のため, NTEmacs で読み込めない問題を修正
;; (defun ad-magit-git-string (orig-fun &rest args)
;;	(if (and (string= (nth 1 args) "--show-toplevel") ret_val)
;;		(with-temp-buffer
;;		  (call-process "cygpath" nil '(t nil) nil "-am" (apply orig-fun args)
;;		  (unless (bobp)
;;			(goto-char (point-min))
;;			(buffer-substring-no-properties (point) (line-end-position))))
;;	  (apply orig-fun args))))
;;(advice-add 'magit-git-str :around 'ad-magit-git-string)
;;(advice-add 'magit-git-string :around 'ad-magit-git-string)
```
自分用railsスケルトン作った

更新しました→http://qiita.com/craftpaperbag/items/ecc396fcd6c46d4dbb15

---

![skelton.png](https://qiita-image-store.s3.amazonaws.com/0/69039/485dde20-618e-cbaf-d867-055dbe754dd0.png "skelton.png")


https://github.com/craftpaperbag/skelton

特徴は以下

- rspecとcapybara
- unicorn
- bootstrap
- slim
- CircleCIでビルドするためのcircle.ymlのひながた
- herokuで使うためのpostgres指定
- spec は Feature と Model だけ（ほかは自動生成しない）
- **揮発性メッセージのラクチン指定（後述）**


使い方
---

ファイルをコピー
ここはもっと賢いやり方があるはず

```
git clone https://github.com/craftpaperbag/skelton.git
rm -rf skelton/.git
cp -r skelton/ target/ && cd target/
```

エディタで編集

config/database.yml に Heroku PostgreSQL の情報記載
config/secrets.yml に rake secret で作ったものを投入
config/application.rb のモジュール名をアプリ名に変更
config/initializers/session_store.rb のキーをアプリ名に変更 
app/views/layout/application.html.slim の34行目を自身のコピーに変更

起動

```
bundle exec rspec
bundle exec rails s
```

とりあえずここまでで http://localhost:3000 うごきます。
Circle CI、Heroku　割愛


おまけ機能：揮発性メッセージのラクチン指定
---

views/shared/ に
表示したいメッセージのテンプレートを作る。
_hogehoge.html.slim など。

controller処理内でよぶ

```ruby
message 'shared/hogehoge'
```

flashに保存されてる。
viewで表示するときは

```ruby
= render 'shared/messages'
```

ちょっと適当すぎるので改善したい点
---

ruby 2.1.3 ...なぜ
Gemfile汚い
message機能を動的な感じに。
使い始めにエディタ使うのいけてないので別の方法使う
この記事を綺麗にする
ほかいろいろ
指定期間のLSNの差分(WALサイズ)を計算する関数

### 関数定義
- **walsize**は、「前回関数実行時のLSN」と「今回関数実行時のLSN」の差分を返却する関数
- 関数の初回実行時には0が返却
- 差分計算に使うLSNを引数指定可能。未指定時は```pg_current_xlog_location()```を使用
- PostgreSQL9.4以降で動作確認済(pg_lsnデータ型未サポートの古いバージョンでは動作NG)

```plpgsql
CREATE OR REPLACE FUNCTION walsize
  (currlsn pg_lsn DEFAULT pg_current_xlog_location())
  RETURNS NUMERIC AS $$
DECLARE
  sql TEXT;
  prevlsn pg_lsn;
  ret NUMERIC;
BEGIN
  BEGIN
    PERFORM current_setting('walsize.lsn');
  EXCEPTION WHEN undefined_object THEN
    sql := 'SET walsize.lsn TO ''' || currlsn::TEXT || '''';
    EXECUTE sql;
  END;
  prevlsn := current_setting('walsize.lsn')::pg_lsn;
  ret := pg_xlog_location_diff(currlsn, prevlsn);
  PERFORM set_config('walsize.lsn', currlsn::TEXT, false);
  RETURN ret;
END;
$$ LANGUAGE plpgsql;
```

### 関数の利用
```INSERT, UPDATE, ...```の一連のSQL群が生成するWALのサイズを調べたいとき

```sql
SELECT walsize();  -- 初回実行時は0が返却
INSERT ...
UPDATE ...
...
SELECT walsize();  -- 前回と今回のLSNの差分(WALサイズ)をバイト単位で返却
```
ListViewの最後の要素にだけマージンをつける


ListView(CardView)の最後の要素にだけマージンをつけたい場合がある。
意外とぐぐってもあまり出てこなかったので、自分なりの方法を書いておく。
(他に良い方法があればコメント頂けるとうれしいです！)

![Screenshot_2015-09-16-01-22-19.png](https://qiita-image-store.s3.amazonaws.com/0/41889/f481442b-51da-af0b-5639-f3615ee75b18.png)

例えば上のスクリーンショットのように、ListViewの最後の要素が画面下にピタッとくっついてしまって、気持ち悪い場合がある。xmlで``<ListView>``自体にマージンを入れるという方法もあるが、それだとListView全体に対してマージンがついてしまい、リストが途中で途切れてるような格好になってしまい、あまり良くない。

というわけなので、以下のスクリーンショットのように
ListViewの最後の要素にだけ、Bottomにマージンをつけてあげる。

![Screenshot_2015-09-16-01-22-23.png](https://qiita-image-store.s3.amazonaws.com/0/41889/bd71cbaf-6653-4092-cd38-91168b941965.png)

コードはいたって簡単。

```java:ListAdapter

private List<ListItem> list;

protected class ListAdapter extends ArrayAdapter<ListItem> {
...
  public View getView(int position, View convertView, ViewGroup parent) {
    ...
    CardView cardView = (CardView) convertView.findViewById(R.id.cardView);
    int lastLine = list.size() - 1;
    if (position == listSize) {
      ViewGroup.LayoutParams lp = cardView.getLayoutParams();
      ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) lp;
      mlp.setMargins(mlp.leftMargin, mlp.topMargin, mlp.rightMargin, 32);
      cardView.setLayoutParams(mlp);
    }
    ...
  }
}

```

以下のように、リストの最後の要素だけを処理してあげる。

```java

int lastLine = list.size() - 1; // positionは0からはじまるので1を引く
if (position == lastLine) {
  // TODO
}
```

動的にマージンをつけるには、`MarginLayoutParams`をつかう。いったん`LayoutParams`を取得してから、`MarginLayoutParams `にキャストするのがポイント。

```java

ViewGroup.LayoutParams lp = cardView.getLayoutParams();
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) lp;
// left, top, rightはそのままでbottomにだけマージンをつける(単位はdp)
mlp.setMargins(mlp.leftMargin, mlp.topMargin, mlp.rightMargin, 32); 

cardView.setLayoutParams(mlp);

```

おわり
「データサイエンティスト養成読本 機械学習入門編」（技術評論社, 2015）

「[データサイエンティスト養成読本 機械学習入門編](http://gihyo.jp/book/2015/978-4-7741-7631-4)」を、著者の福島真太朗さんからいただきました。ありがとうございます！

![表紙](http://image.gihyo.co.jp/assets/images/cover/2015/9784774176314.jpg)

福島さんとはプログラミング言語Juliaの集い「[JuliaTokyo](http://julia.tokyo/)」などで交流があり、彼の記事「機械学習ソフトウェアの概観」にてJuliaも紹介されていることから、今回書籍をいただけることになりました。

この記事では、昨今の機械学習を取り巻くソフトウェアの紹介で、R、Python、MLlibと並んで、Juliaでの予測モデルの構築・評価の実行例が述べられています。

出版前、福島さんが「Juliaを軽くdisってあるんで」と仰っていたので、どのような内容なのかビビっていたのですが（笑）、説明も非常に丁寧で、結論も至極納得のいくものでした。

いまだ情報が少なく、「検索してもヒントとなるページが見当たらず、ソースコードに立ち戻らないとならないことも往々にして発生」（p.85）というのは、まさにその通りだと思います（そこが面白いところでもある、とも私は思っていますが）。

第3章で述べられているように、プログラミングの経験があまりない場合はKNIMEやWeka、はたまた昨今台頭してきている各種クラウドサービスが良いでしょうし、プログラミングに抵抗がない場合でも、よく知られた手法をパッケージから使うのであれば、RやPythonをまず検討するべきでしょう。少なくとも現時点では、フルスクラッチで機械学習アルゴリズムを実装するのであったり、高負荷の処理が必要であれば、その時に、Juliaを検討するべきだと思います。

まだ書籍全部を読んではいないのですが、この記事以外も豪華な執筆陣で、どれも面白く、簡潔で、かなり新しい話題までカバーされていているように思えます。かつ、煙に巻くこともなく理論に寄り過ぎることもなく、ビジネス的観点の情報や、実際に手を動かしてみる記事もあり、バランスがとれていて、参考文献などその先へのポインターも多く、「機械学習入門編」の名に偽りがない、良い書籍だと思いました。

「[言語処理のための機械学習入門](http://www.coronasha.co.jp/np/isbn/9784339027518/)」という、比戸さんの記事でも紹介されている名著について、自然言語処理の先人たちが「我々が始めた時に、この書籍があればなあ」と言っているのを見聞きしたことがあります。今回の養成読本も同じように、後続へ向けて"知の高速道路"を提供するものではないでしょうか。機械学習にある程度以上興味がある方にとって、買って損することはないと思います。

ちょうど1年前に「[Machine Learning Casual Talks #2](http://mlct.connpass.com/event/8036/)」というイベントで、この書籍の著者でもある比戸さんが「機械学習は苦しい」という名言を残されていました。その苦しみは当分なくらないでしょうが、この本でそれが少しは和らぐことがあるかもしれません。


## 参考

* [機械学習の入門本を書きました（データサイエンティスト養成読本） - 随所に主と作れば、立処皆真なり](http://sla.hatenablog.com/entry/gihyo_mlbook)
* [「データサイエンティスト養成読本 機械学習入門編」を読んだ - once upon a time,](http://chezou.hatenablog.com/entry/2015/09/09/221409)
レスポンシブデザインにするためにやったこと


初めてのモバイル対応でやったことをまとめてみます。

#やったこと
##最新機種のサイズの確認
こちらのサイトを参考にしました。
http://mydevice.io/devices/
最新機種が出るたびに解像度は大きくなる傾向にあるので、随時気にしていかなければならないようです。

##viewportの設定

こちらのエントリで色々検証されてますが…→[もう逃げない。HTMLのviewportをちゃんと理解する](http://qiita.com/ryounagaoka/items/045b2808a5ed43f96607)
自分も色々試した結果、結局のところ下記の記述に落ち着きました。

```html:
<meta name="viewport" content="width=device-width,initial-scale=1.0">
```

### 失敗1: 縮小されたままになってしまった例
この設定はだめでした。

```html:
<meta name=”viewport” content=”width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no”>
```

### 失敗2: iPhoneのsafariでうまく表示されなかった例

```html:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
```
成功例との差がわかるでしょうか？
このコードではiphoneのsafariでうまく表示されませんでした。
正解はなんと`width=device-width, initial-scale=1.0"`と半角スペースが入っているということでした。
原因がなかなか突き止められずにすごい時間を食ってしまいました……。スペースにも気をつけましょう。

##メディアクエリの設定をmixinにした
メディアクエリの記述はどうしても色々な箇所ででてきました。
その時に何度も同じ記述を書いているとタイプミスがあったり、あとで更新した場合にも面倒だったので以下のようにmixinにしました。

```sass:
@mixin pc($width: 769px) {
  @media screen and (min-width: $width) {
    @content;
  }
}
@mixin smartphone($width: 768px) {
  @media screen and (max-width: $width) {
    @content;
  }
}
```
#この方法はできなかった！sassの書き方で気をつけたいこと

##メディアクエリで変数の分岐はできない

こんな感じでメディアクエリを使って変数の更新をしようと思いました。


```sass:
$header-height: 70px;
$footer-height: 100px;
@media screen and (max-width: 768px) {
	$header-height: 50px;
	$footer-height: 80px;
}
```
しかしこの方法だとスクリーンのサイズに関わらず、あとに書いた内容で変数が設定されていました。mixinを使っても同じです。
スクリーンサイズによって変数を変えることはできませんので、別の書き方をする必要があります。

参考：http://foundation.zurb.com/forum/posts/16411-sass-variables-not-working-in-media-queries
Ruby-Processing ブレゼンハムのアルゴリズム


[ブレゼンハムアルゴリズム](http://aidiary.hatenablog.com/entry/20050402/1251514618) を参考にさせていただいて、Ruby-Processing で実装してみました。

![bresenham.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/afcde4bb-c029-732c-cf37-c017771a9f54.gif "bresenham.gif")

```ruby:bresenham.rb
load_library :vecmath

# 参考
#
# プレゼンハムアルゴリズム
# http://aidiary.hatenablog.com/entry/20050402/1251514618

def setup
  size 400, 400
end

# プレゼンハムアルゴリズムを用いて
# fm から to へのラインを求める
def build_line(fm, to)
  next_x = fm.x
  next_y = fm.y
  delta_x = to.x - fm.x
  delta_y = to.y - fm.y

  step_x = delta_x < 0 ? -1 : 1
  step_y = delta_y < 0 ? -1 : 1

  delta_x = (delta_x * 2).abs
  delta_y = (delta_y * 2).abs

  line =[Vec2D.new(next_x, next_y)]

  if delta_x > delta_y
    fraction = delta_y - delta_x / 2
    while next_x != to.x
      if fraction >= 0
        next_y += step_y
        fraction -= delta_x
      end
      next_x += step_x
      fraction += delta_y
      line << Vec2D.new(next_x, next_y)
    end
  else
    fraction = delta_x - delta_y / 2
    while next_y != to.y
      if fraction >= 0
        next_x += step_x
        fraction -= delta_y
      end
      next_y += step_y
      fraction += delta_x
      line << Vec2D.new(next_x, next_y)
    end
  end
  line
end

def draw
  background 255

  translate width/2, height/2

  n = 15 # ドットひとつ分のサイズ
  rows = height / n
  cols = width / n

  rect_mode CENTER
  no_fill
  stroke 60
  for i in 0..rows
    for j in 0..cols
      rect (j-cols/2) * n, (i-rows/2) * n, n, n
    end
  end

  x = mouse_x - width/2 + n/2
  y = mouse_y - height/2 + n/2
  fm = Vec2D.new(0, 0)
  to = Vec2D.new(x / n, y / n)
  line = build_line(fm, to)
  if line
    fill(100)
    line.each {|v|
      rect v.x * n, v.y * n, n, n
    }
  end

  # マウスの位置まで line() で直線描画(ブレゼンハムアルゴリズムとの比較用)
  stroke 0x28, 0x28, 0xcc
  stroke_width 2
  line 0, 0, mouse_x - width/2, mouse_y - height/2
  stroke 0
  stroke_width 1
end
```

コマンドラインから次のように実行します。

```
$ rp5 run bresenham.rb
```

## リンク

- [Bresenham's Algorithm in JRubyArt](http://learning-ruby-processing.blogspot.jp/2015/09/bresenhams-algorithm-in-jrubyart.html?spref=tw)
PHPの配列構造

##はじめに
PHPの初学者中の初学者が備忘録として書いた中身の薄いものですので、拙さはご容赦ください。。。
また、間違っている所があればコメント等で指摘をお願いします。

##配列

###配列とは
[PHPの多次元配列と連想配列についてのサンプル。](http://qiita.com/mmusasabi/items/4b7d2f27bd4604bfc17f)
配列はphpにおいて極めて重要な役割を果たしているな、と感じました。
データベースにデータを保存するにも、配列の中身が連想配列となっているのかとか、多次元配列になっているのか、とか配列構造の色々なところに気を遣わなければなりません。
配列の構造について熟知していれば、一皮向けたと言ってもいいのではないでしょうか？

##連想配列
[連想配列](http://www.php-labo.net/tutorial/php/hash.html)
PHPにおいてはあまり普通の配列と違いはないようです。
違いとったら、キーの名前が数字か文字かといったところです

###多次元配列
[多次元配列](http://www.phpbook.jp/tutorial/array/index6.html)
[PHPの多次元配列と連想配列についてのサンプル。](http://qiita.com/mmusasabi/items/4b7d2f27bd4604bfc17f)
簡単に言ってしまうと、配列の値の中に更に配列が入っている、という感じです。

下のように構造が目で確認できるとわかりやすいと思います。
難しいものだと、2次元配列とか3次元配列以上の階層になってきますので、注意して中身を見ていきましょう。
※CakePHPだと、$this->log(変数, 'debug');で視認性がよく、配列の中身の構造図を見れるので、お勧めです！

![多次元配列](http://www.phpbook.jp/tutorial/array/img/p6-1.png)


引用元:[多次元配列](http://www.phpbook.jp/tutorial/array/index6.html)


##まとめ
簡単にまとめましたが、配列構造は初心者にとってこれが全てなのではとも思っています。
これより複雑なのは当然なのですが、経験とこの知識を持っていれば対応できるはずです！
JSのグラフライブラリHighcharts

JavaScpriptのグラフライブラリ「Highcharts」

#とりあえずデモ
http://www.highcharts.com/demo

##特徴
・なんかかっこよい。綺麗。
・商用利用は有料。
・最低限htmlとjsがあれば簡単に表示できる。
・動作にはjQueryが必要。
・Ajaxを利用して外部データを利用した動的なグラフ生成可能。


##インストール
[公式サイトのDownload](http://www.highcharts.com/download)ページから「Highcharts」を選択し、zipをダウンロード、解凍。
JQueryもインストールしておく。

##とりあえずグラフ表示
```
<!DOCTYPE html>
<html>
<head>
      <meta charset=utf-8>
      <script type="text/javascript" src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js'></script>
      <script type="text/javascript" src="js/highcharts.js"></script>
</head>
<body>
<div id='container'></div>

<script type="text/javascript">

var chart;

function draw() {

      // グラフオプションを指定
      var options = {
        // 出力先を指定
        chart :{renderTo : "container"},
        // データ系列を作成
        series: [{name: "pi", data: [3,1,4,1,5]}]
      }

      // グラフを作成
      chart = new Highcharts.Chart(options);

}

// ページがロードされた後に、グラフを出力する
document.body.onload = draw();

</script>

</body>
</html>
```
[test.html](http://yubais.net/doc/highcharts/demo/test1.html)

##いろいろなグラフ
上記html内の

```
chart :{renderTo : "container"},
```
の部分を

```
chart: {
      rendetTo: "container",
      type: "column"
}
``` 

にすると棒グラフ。

円グラフはtypeを"pie"、データ部分を下記のように指定。

```
chart :{
      renderTo : "container",
      type: "pie"
},
series: {
      name: "test",
      data: [
              ["好き", 50],
              ["嫌い", 30],
              ["普通", 20]
      ]
```

ちょっと調べるとオプション次第でいろいろできそうでした。
IE6からiPhoneまで対応してるらしい。
私は業務でちらっと触っただけなので、凝ったグラフを個人的に作るのも面白そうだなと。

####参考
http://yubais.net/doc/highcharts/
Objective-CのコードをSwift化するXcode7の新機能 "Generated Interface"


# 概要
Objective-CベースのプロジェクトをSwiftに移行している中で、Objective-CのコードをSwiftに変換する機能を発見したので記載します。
下の考察にも書いていますが、これはあなたが望むような夢のツールではありません。

# 環境
Xcode7 GM

# やり方
## 1. アシスタントエディターの上のドロワーボタンをクリック
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/11454/67cd349a-b5a1-256c-5734-ed2c2ba5da28.png "image1.png")

## 2. "Generated Interface" をクリック
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/11454/5dde2571-5af6-bb15-46b9-3595e14f91c6.png "image2.png")

## 3. クラス定義がSwiftのコードになって表示された！
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/11454/fe011ce8-9dba-d4f9-4d47-075640e30ab3.png "image3.png")


# 考察
- 変換できるのは".h"だけで、".m"は変換してくれません。
- Xcode6にも"Generated Interface"という項目は見えますがクリックしても何も見えませんでした。
- "Generated Interface" という名前からわかるように、外部のクラスからどう見えるか(インターフェース)をSwiftのコードで表示してくれる機能のようです。
- Swiftファイルに対して"Generated Interface"を選択すると、メソッドやプロパティの定義だけが表示されて、実装の中身がないSwiftコードが表示されました。
- これはObjective-CをSwiftに変換してくれる夢のようなツール **ではありません**。
- Objective-CコードをSwiftに移行するときに少しだけ手間を省く機能として使っても良いと思います。
TVMLのformTemplate

## はじめに
今日から何回かに渡り、TVMLのテンプレートを紹介していきます。

初回は、formTemplateです。
メールアドレスなどをユーザーに入力させることを目的としているようです。
https://developer.apple.com/library/prerelease/tvos/documentation/LanguagesUtilities/Conceptual/ATV_Template_Guide/FormTemplate.html#//apple_ref/doc/uid/TP40015064-CH29-SW1

### やること
1. タイトル用画像追加(title.pngという名前でPJフォルダに追加しました)
2. XMLにformTemplateタグを追加

```js:formTemplate
var firstXMLString =
`<?xml version="1.0" encoding="UTF-8" ?>
<document>
<formTemplate>
<banner>
// タイトル画像
<img src="http://localhost:8000/title.png" width="800" height="400"/>
// 説明文言
<description>Enter Password</description>
</banner>
// textFieldの初期文言
<textField>hirakegoma</textField>
<footer>
<button>
<text>Submit</text>
</button>
</footer>
</formTemplate>
</document>`
```

### 実装結果
![Apple TV 1080p - Apple TV 1080p _ tvOS 9.0 (13T5347l)-1.png](https://qiita-image-store.s3.amazonaws.com/0/91606/15e97c2e-e713-02b4-f140-40805c690787.png)

ソフトウェアキーボードは勝手に表示されます。
シミュレータのリモコンだとめちゃくちゃ押しづらいのが不安です。

ソース全文はgithubを参考にしてください
https://github.com/senseiswift/appleTVtutorial/commit/b6b716f7205ccdf7043a3c01a793d1fbeb1bba1c
ローカル環境を作る。

やり方は[ドットインストール](http://dotinstall.com/lessons/basic_localdev_mac)を参照 

[VirtualBox](https://www.virtualbox.org/wiki/Downloads)と[Vagrant](https://www.virtualbox.org/wiki/Downloads)をインストール

#コマンドメモ

##UNIXコマンド

| コマンド | 内容 | 
|:-----------|:------------|
|pwd|現在のディレクトリを表示|
|cd ディレクトリ名|指定したディレクトリに移動|
|cd|ホームディレクトリに移動|
|cd -|一つ前のディレクトリに移動|
|mkdir|ディレクトリを作成|
|vi　ファイル名|指定したファイルの編集|
|x|カーソル上の１文字削除|
|:wq|ファイルを保存して編集を終了する|
|exit|ログアウト|
|clear|画面クリア|

##Vagrantコマンド

| コマンド | 内容 | 
|:-----------|:------------|
|vagrant init|vagrant 初期化・Vagrantfileの作成|
|vagrant reload|Vagrantfileを修正後の再読み込み|
|vagrant up|起動|
|vagrant ssh|SSH接続でログイン|
|vagrant suspend|保留状態にする|
|vagrant halt|終了|


#Vagrantfileの作成

MyVagrant > mycentos とディレクトリを作成し、その中に vagrantファイル を作成。
vagrantファイルを編集。（192.~とある行で先頭の#をはずす)

コマンドはこんなかんじ

```
cd
mkdir MyVagrant
cd MyVagrant
mkdir mycentos
cd mycentos
vagrant init bento/centos-6.7
vi Vagrantfile
-- 編集開始
矢印キーで移動(192.~のある行へ)
#の上でxを押す
:wq
-- 編集終了

```

##CentOSの立ち上げ/停止の流れ

vagrantコマンドはいろいろあるけど、最低でもこの3つはよく使うので覚える。

```
CentOSを設定したディレクトリに移動後
vagrant up //起動
vagrant ssh //CentOSにログイン
vagrant suspend //一時停止
```


#CentOSの設定

Gitをインストール後、centos65.gitをインストール。その後./run.shを実行する

```
vagrant up
vagrant ssh
sudo yum -y install git
git clone https://github.com/dotinstallres/centos65.git 
cd centos65
./run.sh
exit
vagrant suspend
```


#Cyberduckの設定
新規接続からFTP(ファイル転送プロトコル)をSFTPを選択

- サーバー名
CentOSで 'ip a' と打てばIPアドレスを教えてくれる。
192.〜のやつをコピペすればOK 

- ユーザー/パスワード
どちらも vagrant

- パス
/var/www/html


#Hosts.prefpaneの設定
IPアドレスがいやな場合はHosts.prefpaneをインストールして設定すればOK
該当のIPアドレスに対して任意のhostnameを設定するだけ。
[Hosts.prefpane](https://github.com/specialunderwear/Hosts.prefpane/downloads)
PATHを通すとは？ (Mac OS X)

PATHの通し方が記されている記事はよく見かけますが
「そもそもPATHを通すってどういうこと?」状態だったのでそれに関しての備忘録です。

## PATHを通すとは?

**コマンド検索パス(コマンドサーチパス)** を追加すること。
※色々な言葉で説明されていましたが、自分はこれが理解しやすかったです。

## コマンド検索パスとは?
シェルが**コマンド実行ファイルを探しに行くパス**のこと。

たとえば、`ls`というコマンドの実行ファイルは/binディレクトリに格納されており(自分の環境では)
`/bin/ls`と入力すると実行される。しかし、パスを指定せずに`ls`だけ入力しても**`/bin/ls`と同じ実行がされる。**

```bash:コマンド
# どちらのコマンドでも同じ結果が出力される。
/bin/ls
ls
```

これは、コマンドがパスの指定なしで入力された時、シェルがそのコマンドに対応する実行ファイルを
`/bin`や`/usr/bin`などのディレクトリへ探しに行き、同じ名前の実行ファイルがあれば、それを実行してくれるからである。
今回、`ls`を入力された時に探しに行った`/bin`ディレクトリに同じ名前の実行ファイルが存在したため、それが実行された。

このように、コマンド入力時にシェルが実行ファイルを探しに行くパスをコマンド検索パスと言う。

## コマンド検索パスの確認方法
コマンド検索パスは環境変数$PATHに設定されており、`echo $PATH`で確認できる。
自分の環境で`echo $PATH`を入力してみると、以下が出力される。

```bash:コマンド
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin #実行結果
```
パスは`:`で区切られており、今回の例では下記のパスがコマンド検索パスとして設定されている。

```
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/sbin
```

## コマンド実行ファイルの格納場所の確認方法
`which`を利用すれば指定したコマンドの実行ファイルがどこに格納されているのか確認できる。
`ls`コマンドの実行ファイルが`/bin`ディレクトリに格納されている場合、以下が出力される。

```bash:コマンド
which ls
/bin/ls #実行結果
```
## 同じ名前のコマンド実行ファイルが複数のコマンド検索パスに存在する場合
コマンド検索パスには優先度があり、`echo $PATH`で出力された左が優先される。
先ほどの例だと`/usr/local/bin`が一番優先される。
そのため、`/usr/local/bin/ls`と`/usr/bin/ls`のような同じ名前の実行ファイルが
存在する場合、`/usr/local/bin/ls`が実行される。
コマンドは実行されるが、意図通りの実行がされない場合、パスの優先度が原因かもしれない。

## PATHを通す意味がわかったら
PATHを通しましたが、PATHを通すうえでよくわからないことがあったので投稿しました。

- [PATHを通すために環境変数の設定を理解する (Mac OS X)](http://qiita.com/soarflat/items/d5015bec37f8a8254380)

## お知らせ

Udemy で webpack の講座を公開したり、Kindle で技術書を出版しています。

Udemy:
[webpack 最速入門](https://www.udemy.com/course/practical-webpack/?couponCode=B6D5AE3897554CBBDAD7)（**~~10,800 円~~ -> 2,000 円**）

Kindle（Kindle Unlimited だったら無料）:
[React Hooks 入門](https://www.amazon.co.jp/gp/product/B08JTXQ2M6)（500 円）

興味を持ってくださった方はご購入いただけると大変嬉しいです。よろしくお願いいたします。
tmuxでペイン分割しつつ、複数ホストにいっぺんにsshする

メモ。

## やり方

新しいウィンドウを作成 →　ssh →　レイアウト調整  →　ssh →　繰り返し(ry



- シェルスクリプトにしてもいいし。

```shell-session

#!/usr/bin/env sh

PROG_TMUX=/usr/local/bin/tmux

${PROG_TMUX} new-window "exec ssh $1"
shift

for host in "$@"; do
  ${PROG_TMUX} split-window "exec ssh $host"
  ${PROG_TMUX} select-layout tiled > /dev/null
  # ${PROG_TMUX} select-layout even-vertical > /dev/null
  # ${PROG_TMUX} select-layout even-horizontal > /dev/null
done
```


- .zshrcに書いてもよし。

```.zshrc

function mssh() {
tmux new-window "exec ssh $1"
shift
for host in "$@"; do
  tmux split-window "exec ssh $host"
  tmux select-layout tiled > /dev/null
  # tmux select-layout even-vertical > /dev/null
  # tmux select-layout even-horizontal > /dev/null
done
}
```

タイルか縦分割か横分割は好みで、コメントアウトのところで調整。

## 使い方

```
mssh host1 host2 host3 ...
```

ぱっかー。
Docker + PHP7 + opcacheで速いWordpressを体験

# Dockerイメージの準備

## opcache付のPHP7イメージを作成

[Docker公式のPHP7イメージ](https://hub.docker.com/_/php/)は既にあります。
しかし、[opcache](http://php.net/manual/ja/intro.opcache.php)と呼ばれる高速化拡張が組み込まれていません。
そこで、公式のイメージにopcacheを追加したものを作成します。

ちょうど公式のPHPイメージには[拡張を簡単に追加する方法](https://github.com/docker-library/docs/tree/master/php#how-to-install-more-php-extensions)が用意されているので使いましょう。

具体的には以下のような`Dockerfile`を用意するだけです！

```docker:Dockerfile
FROM php:7-apache
RUN docker-php-ext-install opcache
CMD ["apache2-foreground"]
```

このDockerfileを `docker build` コマンドでイメージ化しましょう。
イメージの名前はとりあえず `castaneai/php7-apache-opcache` としましたが、自由に設定できます。

```zsh:ビルド実行コマンド
$ docker build -t castaneai/php7-apache-opcache .
```

## PHP7 + opcacheベースのWordpressイメージを作成

[Docker公式のWordpressイメージ](https://hub.docker.com/_/wordpress/)もあるのですが、2015/09/15時点では[PHP5.6ベース](https://github.com/docker-library/wordpress/blob/3447b0ea9c1eccf1e00feb8e2e70c311690763af/apache/Dockerfile#L1)になっています。

よってこの公式イメージの `FROM php:5.6-apache` を
`FROM castaneai/php7-apache-opcache` に置き換えましょう。

Wordpressの公式リポジトリをcloneして、該当箇所のみを書き換えます。

```zsh
$ git clone https://github.com/docker-library/wordpress/
$ cd wordpress
$ vi apache/Dockerfile # 1行目の php:5.6-apache を castaneai/php7-apache-opcache に書き換え
$ docker build -t castaneai/wordpress-php7 ./apache # ビルドしてイメージ化
```

# いざ実行

いよいよ生成した `castaneai/wordpress-php7` イメージを実行します。
MySQLも必要なので複数のコンテナ連携が必須ですが、[docker-compose](https://docs.docker.com/compose/)を使うと簡単です。

以下のような `docker-compose.yml` を用意します。

```yaml:docker-compose.yml
wordpress:
  image: castaneai/wordpress-php7
  ports:
    - 8080:80
  links:
    - db:mysql

db:
  image: mariadb
  volumes_from:
    - data
  environment:
    MYSQL_ROOT_PASSWORD: testpassword # 適宜変更する

data:
  image: busybox
  volumes:
    - /opt
```

`docker-compose.yml` が準備できれば、コマンド一つで実行できます。

```zsh
$ docker-compose up -d
```

起動後、http://localhost:8080 にアクセスするとWordpressが表示されます。

筆者の環境では 20ms 程度でWordpressのトップページが表示できました。速い！（感動）

# さらなる高速化へ・・？

今回Webサーバーは公式イメージに用意されているApacheを使用しましたが、ここを[h2o](https://h2o.examp1e.net/)などのHTTP/2対応サーバーに変更するとさらなる加速を体験できるかもしれません！

できればh2oでも実験したかったのですが、ちょっと複雑そうなので今回は断念・・
ArduinoでPWMサーボの速度をコントロールする

この記事ではArduinoでPWMサーボを回転させるときに、速度をコントロールする方法を紹介します。シリアルサーボ使えばいいんだけど、高いしね、、、

# はじめに
PWMサーボをArduinoを使ってコントロールするとき、多くの場合、標準のServoライブラリを使って`Servo.write`でサーボの角度をセットすると思いますが、この方法だと速度がコントロールできません。なのでゆっくりとサーボを動かしたい場合は、角度を少しづつ変えてループの中で`Servo.write`したりするのですが、サーボによってはぎこちない動きになったり、ループの他の処理に影響を受けてしまったりしていけてないです。

# VarSpeedServo.h
この問題を解決するライブラリが[VarSpeedServo.h](https://github.com/netlabtoolkit/VarSpeedServo)というArduinoのライブラリです。
これはArduino標準のServoライブラリを改造して、Arduinoのタイマー処理の中で速度を考慮した角度を設定するものです。タイマー処理で実装しているので、ループ内の他の処理にブロックされませんし、内部的に`Servo.write`よりも高い解像度で角度を処理しているので、より滑らかな動きになります。

簡単なサンプルコードです。

```cpp
#include <VarSpeedServo.h> 

VarSpeedServo myservo;

void setup() {
  myservo.attach(9);
} 

void loop() {
  myservo.write(180, 30, true); // サーボを180度まで速度30で動かし、完了まで待つ
  myservo.write(0, 30, true);        // サーボを30度まで速度30で動かし、完了まで待つ
}
```

上記のようにwriteの第二引数に速度値（1が最小、255が最大のスピード、0の場合は最大スピードになる）、第三引数（省略可）に完了まで待つかどうかを指定します。速度値はタイマーが呼び出されるごとに加算されていくPWMのtickの値に等しいので、絶対的な角速度ではなく、あくまで相対的なものとして捉えた方がよさそうです。

以下は実際に動かしているデモ動画になります。

[![VarSpeedServoのデモ動画](http://img.youtube.com/vi/t4KRksxjP6k/0.jpg)](http://www.youtube.com/watch?v=t4KRksxjP6k)

# VarSpeedServoSam（SAMプロセッサ用の修正バージョン）
さて、上記のVarSpeedServo.hには一点問題があって、プロセッサがAVRでしか動きません。筆者が使っている[Arduino Due](https://www.arduino.cc/en/Main/ArduinoBoardDue)はプロセッサがSAM(ARM)で、そのままでは動かないので、こちらでも動くバージョンを作りました。

githubで公開しています。
https://github.com/thorikawa/VarSpeedServoSam

もしArduino Dueを使っている方がいらっしゃったら是非使ってみてください。

# まとめ
VarSpeedServoもしくはVarSpeedServoSamを使うと、サーボを任意の速度で回転できていいね、という話でした！
VagrantでRStudioServer

Vagrantの仮想マシンでR Studio Serverを使う時のメモ

主にドキュメントそのまま
https://www.rstudio.com/products/rstudio/download-server/

# 前提
VagrantでCentOSの仮想マシンを作成済み

# Rインストール
epel-releaseというパッケージをインストールすると、拡張パッケージがインストールできるようになる。以下で最新版を確認して使用する。
http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/repoview/epel-release.html

```
$ wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum localinstall epel-release-6-8.noarch.rpm
$ sudo yum install R
```

# RStudioServerインストール
rpmパッケージをダウンロードしてインストール

```
$ wget https://download2.rstudio.org/rstudio-server-rhel-0.99.484-x86_64.rpm
$ sudo yum localinstall rstudio-server-rhel-0.99.484-x86_64.rpm
```

起動停止など

```
$ sudo rstudio-server start
$ sudo rstudio-server stop
```

# ポートフォワードの設定
hostの18787ポートに接続すると、guestの8787ポートに接続するように設定

いったん仮想マシンをシャットダウン

```
(仮想マシン上でOSシャットダウン）
$ sudo shutdown -h now
(ホストOSから仮想マシン停止)
$ vagrant halt
```

Vagrantfileにポートフォワードの設定を追加

```:Vagrantfile
config.vm.network "forwarded_port", guest: 8787, host: 18787
```

仮想マシン起動

```
$ vagrant up
```

# 起動確認
ブラウザで以下にアクセス

http://localhost:18787

![rstudioserver_login.png](https://qiita-image-store.s3.amazonaws.com/0/65186/a5e3924c-e973-d647-c7c5-21ccc5b3aecb.png)

仮想マシンのOSユーザでログイン（デフォルトはvagrant/vagrant）

![rstudioserver_firstview.png](https://qiita-image-store.s3.amazonaws.com/0/65186/67819ef4-728b-8629-fa7b-9431ce777efa.png)
MATLAB: subplot をあんまり使わずに一枚のウインドウでfigureを見たい

```
set(0,'DefaultFigureWindowStyle','docked')
```
すると良い．

こうしたり
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/28835/5b07e889-9ba7-ef24-0e1b-6a5eb0bfc381.png)


こうしたりも右上のボタン+ウインドウのドラックで簡単にできる
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/28835/d976acda-6b4d-56a9-678f-fd3fda480316.png)