OmniAICreator/Qiita-1.07M huggingface dataset:
virtualbox

# words
## VDI file
- VDI file is the virtual disk image file created by VirtualBox software. It stores all contents of virtual disk. It can be mounted as a hard disk on Mac, Windows, and Unix platforms.

# VBoxManage command
## VBoxManage createvm
- creates a new XML virtual machine definition file.
    - ```--name```: name of virtual machine
    - ```--ostype```: specifies the guest OS
    - ```--register```: register the VM with your Oracle VM VirtualBox installation.

```
VBoxManage createvm --name "$VM" --ostype "RedHat_64" --register
```

## VBoxManage storagectl
- this command attaches, modifies, and removes a storage controller. After this, virtual media can be attached to the controller with the storageattach command.
    - ```--name```: name of storage controller
    - ```--add```: type of tha system bus to which the storage controller must be connected
    - ```--controller```: enable a choice of chipset type being emulated.


```
VBoxManage storagectl "$VM" --name "SATA Controller" --add "sata" --controller "IntelAHCI"
```

## VBoxManage modifyvm
- changes the properties of a registered virtual machine which is not running.

## VBoxManage list

```
VBoxManage list vms
"boot2docker-vm" {fcfce1fc-4ac1-4060-8a43-3ccfc796add0}

# show only running vms
VBoxManage list runningvms
```

## VBoxManage unregister
- unregisters a virtual machine. If --delete is also specified, the related files will also be deleted.

```
VBoxManage unregistervm --delete <vm name>
```

# network
## bridged adapter
Recommended for ssh or http usage.
VirtualBoxを使用したAndroidエミュレータ Genymotion を導入

# Genymotion 
VirtualBox を使用したAndroidエミュレータで、色々なバージョン＆機種をエミュレートすることが可能。といっても全機種があるわけないのでそこらへんは割り切りです。
個人利用する分には無料ですが、商用利用する場合は有償となります。有償の部分は、開発に必要なAPIとかとかとか、まあお手軽に試すならまず無料でいいんじゃない？

Google Nexus, Galaxy, HTC, Xperia の 2.3, 4.1～4.4 

## 参考サイト

> ・[超高速なAndroidエミュレータ「Genymotion」を試す](http://www.teradas.net/archives/13895/)
> ・[【追記アリ】Genymotion – PCでAndroidを起動してKindleも読める♪ インストールから「Google Play」導入方法までまとめ](http://mogi2fruits.net/blog/os-software/windows/1557/)
> ・[GenymotionがVirtualBoxのネットワークが原因で起動しなかったときの対処法](http://www.absolute-keitarou.net/blog/?p=1115)
> ・[超高速なAndroidエミュレータ「Genymotion」を試す](http://www.teradas.net/archives/13895/)


# ダウンロード方法
まずユーザ登録（必須）。ユーザ登録をしてログインしないとダウンロードできません。それぞれのプラットフォーム（Windowx, Mac, Linux）用に提供されている Genymotion 本体をダウンロードします。
注意点として既に VirtualBox がインストールされている場合は、途中で「Oracle VirtualBox インストールする？」と聞いてきてもインストールしないこと（英語で聞いてくるよｗ）。上書きされ痛い目みるすｗ

# インストール
はいはい、ってインストールすればよろし。初回起動すると「You have no virtual device availabe yet.」とあるので「Yes」を押下する。
![genymotion_01.png](https://qiita-image-store.s3.amazonaws.com/0/44540/285199b8-645c-5c57-6d27-d0b2df6eabd5.png)

# イメージのダウンロード
Andoridエミュレータのイメージのダウンロードには、ログインが必要。「Add」ボタン⇒「Connet」でログイン情報を入れるとイメージファイルの一覧が表示されるのでそこから選択する。だけｗ
![genymotion_04.png](https://qiita-image-store.s3.amazonaws.com/0/44540/17b6e4e8-c435-2e47-5ba6-6bc78253081f.png)

# イメージを実行したときエラーが表示されるとき
「You have no virtual device availabe yet.」とあるので「Yes」を押下してもすでに複数のネットワークアダプタが設定されている場合は、正しくアタッチされないときがあるようです（私がそうでした）。また「no」押下した場合、ネットワークアダプタが無いし・・・まあ、追加すればいいだけなんだけどね。
![genymotion_07.png](https://qiita-image-store.s3.amazonaws.com/0/44540/9cc23ffb-dfa2-27f5-7a28-5f41bc78948a.png)

VirtualBoxの[ファイル] - [環境設定]からネットワークを選択しアダプタを確認する（無い場合は、追加する）。

```
アダプター
　IPv4アドレス：192.168.56.1
　IPv4ネットマスク：255.255.255.0

DHCPサーバ
　サーバーアドレス：192.168.56.100
　サーバーマスク：255.255.255.0
　アドレス下限：192.168.56.101
　アドレス上限：192.168.56.254
```

![genymotion_09.png](https://qiita-image-store.s3.amazonaws.com/0/44540/07b466a7-da39-96f1-8924-ae4b978c117f.png)

あとは、起動に失敗している vm の設定で正しいネットワークアダプタを指定してあげるだけ。
![genymotion_10.png](https://qiita-image-store.s3.amazonaws.com/0/44540/078b3941-d2a0-4c0a-1e93-84e864c7718c.png)

> [Genymotionを導入してみた　エミュレータが起動しない対策](http://hamuhamuengineer.blogspot.jp/2013/12/genymotion.html)

# 起動できたら 、Google Play を導入
初期の状態では「Google Play」がインストールされていないので、[【追記アリ】Genymotion – PCでAndroidを起動してKindleも読める♪ インストールから「Google Play」導入方法までまとめ](http://mogi2fruits.net/blog/os-software/windows/1557/)さんの記事を参考にしながら必要な野良pkgをインストールするべし。ただ置いてあるサイトの広告がひどいので間違ってもADに引っ掛からないようにしてください。

ちなみに Android 4.3 で必須なpkgは、以下の２つ。

* gapps-jb-20130813-signed.zip
* Genymotion-ARM-Translation_v1.1.zip

# あとは
日本語の設定したり, Google Play使うためにアカウント同期したり・・・。
すると。
![genymotion_08.png](https://qiita-image-store.s3.amazonaws.com/0/44540/1d3cb8f7-adab-c05a-41ee-a69dd0f0db7f.png)
PHPで日付を表示する

#まず日付をオブジェクトとして生成する
今の日付とか
`$date = new DateTime();`
特定の日付とか
`$date = new DateTime('2014-07-20');`
今日から3ヶ月後とか
`$date = new DateTime('+3 months');`
今月の月末とか
`$date = new DateTime('last day of today')`
詳しくは[マニュアル](http://php.net/manual/ja/datetime.formats.php)を見る。

そのまんま
`echo $date;`
とかやると、このまんまじゃ文字列にできないよって言われる。

#そのあと整形して表示する
2014-07-01 00:00:00　と出力
`$date = new DateTime('today');
echo $date->format('Y-m-d H:i:s');`
14年7月1日　と出力
`$date = new DateTime('today');
echo $date->format('y年n月j日');`
今月は31日ありますよ　と出力
`$date = new DateTime('today');
echo $date->format('今月はt日ありますよ');`
その他の書式は、「[PHPBook 日時を取得する(time, date)](http://www.phpbook.jp/func/date/index1.html)」がわかりやすかった。
31 days とか表示するにはエスケープすればよいと書いてあって助かりました。
Polymer 未サポートブラウザのための CSS セレクタの書き方



Polymer の スタイルをSafariなど polyfill 環境で動作させる方法がよくわからなかったので、調べてみました。

## polyfill-next-selector

Shadow DOM 配下の要素に対する CSS セレクタとして、Polymer では `polyfill-*` という独自のセレクタを提供している。  
これを使用することで、Safari などのブラウザでも Shadow DOM 配下の要素に CSS を適用することができる。

## polyfill-next-selector 使い方

+ `polyfill-next-selector {}` を polyfill したい箇所に書く
+ `polyfill-next-selector` の中に `content` プロパティを定義する
+ `content` の値には、通常の CSS セレクタの書き方にだいたい従ってセレクタを記述する

「だいたい」とか意味わからないので、具体例。

```css
polyfill-next-selector { content: ':host .bar'; }
::content .bar {
  color: red;
}

polyfill-next-selector { content: ':host > .bar'; }
* ::content .bar {
  color: blue;
}

polyfill-next-selector { content: '.container > *'; }
::content * {
  border: 1px solid black;
}
```

上記のような polyfill-next-selector を定義すると、chrome で表示する場合など、ネイティブな Shadow DOM 環境では、何も起きない。  
そして、Polymer をサポートしていない、polyfill 環境では、表示される際以下のように書き換えられる。

```css
x-foo .bar {
  color: red;
}

x-foo > .bar {
  color: blue;
}

x-foo .container > * {
  border: 1px solid black;
}
```

## その他にも使えそうなスタイリングルール

### polyfill-rule

polyfill 環境下でのみ、適用したいスタイルを記述するのに使用できる。

```css
polyfill-rule {
  content: '.bar';
  background: red;
}
```

こう書いておけば、Polyemer をサポートしている ネイティブな Shadow DOM 環境では、何も起きない。  
polyfill 環境では、以下のように書き換えられる。

```css
x-foo .bar {
  background: red;
}
```

### polyfill-unscoped-rule

`polyfill-rule` の逆で、ネイティブな Shadow DOM 環境にのみ適用するルール。

```css
polyfill-unscoped-rule {
  content: '#menu > .bar';
  background: blue;
}
```

こう書いておけば、ネイティブ Shadow DOM 環境でのみ、以下のように書き換えられる。

```css
#menu > .bar {
  background: blue;
}
```


--

参考：[Polyfill CSS selectors](http://www.polymer-project.org/docs/polymer/styling.html#directives)
データインポートとDATASETとTABLEと。

#はじめに
某ノンアルコール梅酒のCM。おっしゃる通り。ごめんなさい。

と、いうことでデータインポートとDATASETとTABLEについて。
とにかく安いんでぼこぼこデータ追加しちゃえばいいんですけど、私なりの考えをまとめてみました。

#前提
CloudSDKは入れておきましょう。
https://developers.google.com/cloud/sdk/
まぁ、webの管理コンソールでも全部できちゃいますけどね。

サイオスさんも詳しく書いてくれていますよ。
http://sstd-bigdata.blogspot.jp/2013/07/google-bigquery-bq-command.html

#データ準備
さて、どんなデータ入れるかな？実務のデータを入れると速さを肌で感じることが出来ますね。
ただし、こういうものの特徴でデータ追加は出来るけど、更新・削除はできません。
そんな時のことを考えると以下のようなところに気を付けてデータを作ると良いと思います。
私自身なんども泣きましたから。（笑）

<b>①ユニークな値を入れておく。</b>
元データに持っているユニークな値を入れておきましょう。
例えば伝票番号とか、レコード番号とか。入れる時に付与するんじゃなくて、あくまで元データのものを入れておいてください。

<b>②データを入れ込んだ時間（もしくは元データに持っているならそれ）を入れておく。</b>
『更新した時間』を持っていると良いです。秒単位まで。TIMESTAMPで持たせます。
①と組み合わせて重複レコードもユニークに見せることが出来ます。
また、BigQueryはフルスキャンが売りですが、WHERE句などでTIMESTAMPの範囲を指定するときちんと見てくれる気がする。
ちなみにTIMESTAMPがNULLだと怒られます。そんな時はSTRINGにしちゃえば良いです。

<b>③出来るだけ非正規化する。</b>
『この項目使うかなぁ？』と思ったら入れちゃいましょう。
BigQuery上の結合（JOIN）も速いけど、やっぱり入れておくと後で『しまったぁ！』と思いません。
レコード数にもよりますが、多少データ量増えても月に10円ぐらいしか変わんないと思いますよ。
でも、①②を入れておくとあとで追加も工夫次第で簡単にできます。

<b>④その他</b>
・文字コードはUTF-8
・『'』、『"』、『半角スペース』は全角に変換。（意外とある。半角スペースでどハマりしました。）
・作ったデータはgzipで圧縮

#先に言っておく！
ここからDatasetとかTableとかFieldとかのお話をしますが、先に言っておきます。
<b>名前の先頭に数字は使っちゃダメ！</b>
例えば7days_dataなど。先頭以外だと問題ないです。Day7_dataは大丈夫。
警告も無しに作れます。でもね、JOINとかすると『そんなテーブルなど無い！』と怒られます。単独だと大丈夫なんだけどなぁ。サポートに聞いたら『あ、ホントだ！』と言われました（笑）
理由？そんなもの知らない。そういうもんなんです。気にするな！

#DATASET
簡単にいうとOracleのスキーマみたいなもの。
データセット単位で共有設定が出来ます。ユーザーだけじゃなくGoogleグループ単位でも共有可能です。
（※Apps For Businessのドメインと紐づけている場合は、そっちのグループじゃないとダメっぽい？）
うちではVIEW専用とか商品マスタ専用とか注文専用とかに分けたりしてます。
移動（コピー）も楽なんで最初のうちは考えなくても大丈夫です。

#TABLE
うちの場合は更新するものが多いので『データインポート用』と『参照用』に分けてます。
『元データ』⇒『データインポート用』⇒『参照用』って感じで入れてます。
（理由とかやり方はのちほど）
TABLE_WILD_CARDが使えるようになったので、日付単位でテーブルを分けるってのも良いですね。
データリカバリが楽になりますし、クエリで見るデータ量も削減できます。ただし、TABLE_WILD_CARDは色々と制限があるので注意が必要です。
TABLE_WILD_CARD使うとJOINが出来ないとか、VIEWが作れないとか。そのあたりは工夫しだいですけどね。

FIELDの種類はこちらに。
https://developers.google.com/bigquery/query-reference?hl=ja#castingfunctions
（こんなページのど真ん中じゃなくて、最初に書こうよ（笑））
文字列はSTRING、整数値はINTEGER、小数点がある数値はFLOAT、日付はTIMESTAMPで。あとは使ったことない！すんません。
準備のところでも書きましたが、もし日付のFIELDにNULLのデータがある場合はSTRINGで指定しちゃいましょう。時間（日付）で計算させたければ、あとでSELECT文のところでTIMESTAMPと型変換すりゃいいです。

#データインポート
さて、準備が出来たら入れちゃいましょう。
やり方は色々あります。が、バルクインサートしか書きません。（笑）
Googleの人が見たら、『いやいや、StreamingInsertもウチの売りなんですけど』と言われそうですが、それは別の機会に。今回はこっちに焦点を当てます。

bqコマンドやブラウザからローカルデータを指定して、アップロードも出来ますが時間かかります。
gsutilコマンド使ってGoogleCloudStorageに準備したgzipのデータをアップロードして、bqコマンドでデータインサートするのが楽だし速いと思います。

コマンドなどはこちら。
https://developers.google.com/bigquery/bq-command-line-tool?hl=ja

うちの場合はこんな感じ。
```bq load --source_format=CSV testset.day7_data gs://testdata/test.csv.gz "PRODUCT:STRING,DATAYMD:TIMESTAMP,AMNT:INTEGER,DIVID:FLOAT"
```

bqはコマンド、loadでデータ読み込み指定、DATASET名.TABLE名でロード先を指定、gs://~でGoogleCloudStorageのファイルパスを指定、"PRODUCT:STRING~"でField名と型を指定。
この時にTABLEが無い場合は勝手に作ってくれます。

慣れるまではloadの後に--max_bad_records 1000とかでエラー行を無視する限界を指定すると良いかと。
指定しない場合は1つでも見つかるとそこで全部ロールバックされます。これを指定するとwebの管理コンソールで『Job History』を見るとダメなデータのパターンが見えてきますよ。1回ずつのトライ＆エラーは辛いですよ。1回で言えよ！ってなりますから。

#最後に
すいません、ざっくりで。
もし、わかんないこととか『こう書けば良い』とかご意見いただければです。
うちの子たちも見ているんで。（笑）
tcpdump でパイプに渡すときは -l する

下記のようなコマンドを打って見ていたら通信のタイミングと tcpdump の出力のタイミングが合わなかった。が、表示された時刻は合っていた。

```console:-lしない時
# (tcpdump -nn -i eth0 port 53 | grep qiita) &
# date; dig +short qiita.com.; while :; do echo -n . ; sleep 1; done
Thu Jul 17 23:06:15 JST 2014
54.238.54.221
......................................23:06:15.253345 IP 192.168.37.250.53967 > 192.168.37.10.53: 13341+ A? qiita.com. (27)
.....^C
```

これはバッファリングだろうと TCPDUMP(8) を見ると以下のように書かれている。

```_:TCPDUMP(8)
-l     Make stdout line buffered.  Useful if you want to see the data while capturing it.  E.g.,
       ''tcpdump  -l  |  tee dat'' or ''tcpdump  -l   > dat  &  tail  -f  dat''.
```

line buffer してくれるのようになる。という訳で -l をつけたら行単位でさっさと渡してくれるようになったようだ。

```console:-lした時
# (tcpdump -nn -l -i eth0 port 53 | grep qiita) &
# date; dig +short qiita.com.; while :; do echo -n . ; sleep 1; done
Thu Jul 17 23:11:54 JST 2014
23:11:54.571012 IP 192.168.37.250.50944 > 192.168.37.10.53: 34052+ A? qiita.com. (27)
54.248.227.194
.....^C
```
Rail3 + kaminari の画面を selenium webdriver を使ってテストする例の試作

# 課題

* kaminari でつくったページネーション機能を 実際のブラウザをつかって自動テストする。
* デグレードを早期発見できるようにする。
  
# デザインゴール

* selenium webdreiver  を使って firefox を自動操縦する。
* 各テストで  スクリーンショット、html ソースを保存してエビデンスとする。
* 以前のテスト実施時のスクリーンショットと 最新のテスト実施時のスクリーンショットの差分を抽出する。
* html ソースの  html5 妥当性チェックもおこなえるようにする。

# 成果 (実装例)

https://github.com/katoy/rails3-files/ にアップした。
スクリーンショットの例 [./selenium-screenshots-prev/0015-sample001_16.png](https://raw.githubusercontent.com/katoy/rails3-files/master/selenium-screenshots-prev/0015-sample001_16.png)

    $ bundle install
    $ bundle exec rake db:migrate

別端末で rails アプリを起動する。

    $ bundle exec rails s

元の端末で テストを実行する。

    $ bundle exec rake spec          # テストの実施 ( firefox が自動起動する)
    $ bundle exec rake tidy          # html チェックの実施
    $ bundle exec rake diff-images   # スクリーンショットの差分チェックの実施


# 残件

* travis-ci でテスト実施できるようにする。  
* jenkins でテスト実施できるようにする。  
* コードカバレッジ計測をする。  
 
# 備考

    rake rubocop   # rubocop で ruby ソースコードのチェックを行う。
    rake stats     # ソースの行数カウントを行う。
    rake erd       # DB の ERM 図を  ./erb.pdf として出力する。 
    rake metrics   # metricfu を実行する。
    yard           # ドキュメント (./doc/index.html) を生成する。
Android学習ノート_140719（Androidアプリ開発基礎）

基礎というか、Androidアプリの概要に触れて、開発関連のソフトウェアをインストールした。

# Android アプリの基礎知識

## Androidのアーキテクチャ

アーキテクチャ（基本設計）はアプリケーション、アプリケーションフレームワーク、ライブラリ、Androidランタイム、Linuxカーネルに分類される5つのレイヤーに分かれたコンポーネントで構成されている。

## Android アプリの構成要素

Android アプリは、**アクティビティ、ブロードキャストレシーバ、サービス、コンテンツプロバイダ**の4つで、これらの組み合わせ（複数利用もある）で構成される。

* アクティビティ : アプリ内の画面（UI、イベント処理など）
* ブロードキャストレシーバ : ブロードキャストインテントの受信（ほかアプリやOSからのメッセージの受信）
* サービス : バックグラウンドで動作するプロセス
* コンテンツプロバイダ : 他のアプリとのやりとりで利用するデータベース

インテントは、アクティビティやサービスがやりとりをする際に利用されるメッセージオブジェクトのこと。アクティビティにはライフサイクルがある。

## Android アプリ制作の流れ

ソースコードの.javaファイルを作成、画像やサウンドなどのリソースファイルを用意する。Android アプリの属性ファイル（アプリ名、バージョン番号、セキュリティ情報が含まれる）であるAndroidManifest.xmlを作成する。EclipseではAndroidアプリの実行ファイルである.apkファイルに変換する。端末でアプリを実行する場合は署名の.keystoreファイルも必要になる。

## Android アプリのクラスライブラリ

Javaの標準APIのサブセットとAndroidの独自のAPI（端末のUI関連のクラスなど）がある。Androidのクラスライブラリは、Google のAPIリファレンスを参照する。

* [Package Index | Android Developers](http://developer.android.com/reference/packages.html)

# 開発ツールの準備

* JDK（Java Development Kit）
* Eclipse
* Android Development Tool（ADT）
* Android SDK

JDKとEclipseはインストール済なので、そこは割愛。

今回はAndroid Development Tool（ADT）のインストールから。ADTとADK（Accessory Development Kitだから全然違うんだけど）がごっちゃになる。さらにAndroid SDKとADTの違いもよくわかってないから余計混乱した。

Macの場合は、ヘルプ→ソフトウェアの追加から[Android Development Kit(ADK)](https://dl-ssl.google.com/android/eclipse/)を追加して、しばし待っていると、インストールが開始される。このへんはEclipseに新規でソフトウェアをインストールする際の手順と同様。

その後、Android SDKを自動でインストールするか？など聞かれるが、今回はSDKをダウンロードして（なんとなく教科書にしたがってバージョンの異なるSDKをカスタムインストールしたいからなのかもしれないが）、手動でインストールしてみた。ADTが予め同梱されてるEclipseも配布されてるみたいだし、そっちつかえばかなり至れり尽くせりな感じはする。

[Android SDK | Android Developers](http://developer.android.com/sdk/)

上記URLの「VIEW ALL DOWNLOADS AND SIZES」から、該当OSのSDKのみをダウンロードする。ダウンロードして解凍したSDKファイルを、自分の場合はすでにインストールしていたEcliseのフォルダに置いて、環境設定から、Androidの項目へ移動して、先ほど置いたSDKファイルのロケーションを指定する。

SDKマネージャは再起動後に、ウィンドウから、Android SDKマネージャから呼び出せる。書籍で指定されている、「2.3.3」、「3.2」、「4.0」、「4.2.4」のライブラリ、あとはToolsをインストール。

次はAndroid Virtual Device（AVD）を追加する。エミュレーション用の設定のようだ。指定の項目で起動してみた。Nexus5用の設定も作ってみたのだが、そっちもしばらく待ってたら起動した。AndroidのCPUは古くからARM、2012からIntelのx86があるようだ。まだよくわかってないけど割とARMがメジャーらしい。

コマンドライン用のパスの設定、まだあるのかー。これ開発環境構築だけで放り出す人もいるレベルじゃなかろうか。.bash_profileがなかったので作成して、以下の内容を自分の場合記述した（Android SDKをEclipseのフォルダにバージョンを記載したままコピーしている状態）。

っと、その前に、Terminal.appから.bash_profileにアクセスするために（あるか確認くらいの意味なんかな）不可視ファイルを表示するコマンドを入力した。終わったらTRUEをFALSEにして再度不可視に。

````shell-session
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder
```

```shell-session:.bash_profile
export PATH=$PATH:/Applications/eclipse\ 4.4/Android_SDK_r23.0.2/platform-tools:/Applications/eclipse\ 4.4/Android_SDK_r23.0.2/tools
```

パスが通っているか、`printenv PATH`で確認。OK。
小学生でもわかるRuby on Rails入門のメモのおさらいにブックマーク登録ページ作った


## 追加機能 
* 削除 (destory)

![スクリーンショット 2014-07-20 12.31.07.png](https://qiita-image-store.s3.amazonaws.com/0/25728/745c884a-2241-e927-74f8-c1dc25014435.png "スクリーンショット 2014-07-20 12.31.07.png")

![スクリーンショット 2014-07-20 12.31.15.png](https://qiita-image-store.s3.amazonaws.com/0/25728/df59df9f-f3ef-5440-3519-cb112cca49fe.png "スクリーンショット 2014-07-20 12.31.15.png")



# おさらい始め

```ruby:
rails g controller bookmarks index show new create destroy
rails g model bookmark title:string url:string
rake db:migrate
```

## routes

```ruby:config/routes.rb
  get 'bookmarks/index'
  get 'bookmarks/show'
  get 'bookmarks/new'
  get 'bookmarks/destroy/:id' => "bookmarks#destroy"
  post 'bookmarks' => "bookmarks#create"
```

## new

```ruby:app/views/bookmarks/new.html.erb
<%= form_for Bookmark.new do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title %>
  <%= f.label :url %>
  <%= f.text_field :url %>
  <%= f.submit %>
<% end %>
```

## Controller

```ruby:app/controllers/bookmarks_controller.rb
class BookmarksController < ApplicationController
  def index
    @bookmarks = Bookmark.all
  end

  def show
  end

  def new
  end

  def create
    @bookmark = Bookmark.new
    @bookmark.title = params[:bookmark][:title]
    @bookmark.url = params[:bookmark][:url]
    @bookmark.save
    redirect_to '/bookmarks/index'
  end

  def destroy
    Bookmark.find(params[:id]).destroy
    redirect_to '/bookmarks/index'
  end
end
```

## index

```erb:app/views/bookmarks/index.html.erb
<a href="/bookmarks/new">登録</a>

<ul>
<% @bookmarks.each do |bookmark| %>
<li><a href="<%=bookmark.url%>"><%=bookmark.title%></a>
  | <a href="/bookmarks/destroy/<%=bookmark.id%>">削除</a>
<% end %>
</ul>
```

* [補足 (小学生でもわかるRuby on Rails入門) | OpenBook](http://openbook4.me/projects/92/sections/503)今度使ってみる
SECCON 2014 writeup  〜No技術編〜

# SECCON 2014
SECCON、CTFを知らない方へ
http://www.seccon.jp/p/seccon.html

いわゆるセキュリティの大会です。

# 本write up
パソコンの技術力はなくても何問かは解けるんですよという話
・unknown 100(詰め将棋)
・programming 300(あみだくじ)

## 詰め将棋(unknown 100)
```
 詰将棋（読み方：つめしょうき）を解け！
 13手目を打った時点で、駒が乗っているマスの番号を,（カンマ）
 区切りで書いたものがフラグとなる。
 
 例：
 1に王、8と9に金がある場合「詰み」となる（8に金を打つことで詰んだ）。
 この状態で、それ以外のマスには駒がない場合、FLAG{1,8,9}となる（1,8,9のみ駒がある）。
```
![shoki.png](https://qiita-image-store.s3.amazonaws.com/0/37393/b72eb2a7-0c06-ad7a-1396-7bc41abdd622.png)

【解法】
将棋部なので、解きました(どや顔)
とはいえ、13手詰と書いていたので13手で解いたのですが、
どうやら11手詰の手順があるらしく、そこまでは深読みしませんでした。ポイントは、24に逃がさないことと、金をどちらかといえば温存するのが本詰将棋です。
[13手詰の解]
22銅 12王 5特 同王 10平 12王 11平(銀を取る) 同王 4銀打 16王 15金 23王 29金

変則的ですが、手数が増えたら(21手以上ぐらい？)独力で解くのは１時間以上かかると思うので、普通の将棋の詰め将棋のソースを取ってきて、改変する形になると思います。

## あみだくじ(programming 300)
```
本文無し(ファイルが一つあるのみ)
```
これは地獄を見た問題です。

$ file
amida: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, stripped

ubuntu殿のPCをひっぱりだして起動して実行

No.1
1 2 3 4 5 6 7 8
|-| |-| | | |-|
| | | | | |-| |
| | | | | | |-|
|-| | |-| | | |
| | |-| |-| |-|
|-| | |-| | | |
| |-| | |-| |-|
|-| |-| | | | |
| | | | |-| | |
| | |-| | | |-|
|-| | | |-| | |
| | |-| | |-| |
| | | | |-| | |
| |-| | | |-| |
| | |-| | | |-|
| | | | | |-| |
| |-| | |-| |-|
|-| |-| | | | |
| | | | | |-| |
              *
? 

あみだくじですね。*から数字までたどり着くところの数字を入力します。１秒以内ぐらいで入力しないと、「TooSlow」と言われて終了しますし、間違えると「Wrong」といわれて終了します。解くとNo2。解くとNo3。

問題はランダムではないようなので、最初は、以下のように進めていました。

$ echo 4 1 6〜(略)〜〜|./amida

10問、20問と独力で解いて行く中で、あみだくじが上下反転したり、左右の棒の幅が広がったりとしてました。

途中、メンバーが、「date -s　〜」コマンドをwhileで叩くとtooslowと言われないことが判明したので、そこからは、時間を止めてひたすらあみだくじを解いて行きました。

【解法】
時間を止めて１０００問解くとflag。

600問といたぐらいから、普通にあみだくじ解法スクリプト書くほうがよかったと思いました。
GrowthForecast をCentOS6.5（Vagrant）に導入 Supervisor してみた、その２

# Supervisor って
適当なスクリプトをデーモン化するための便利プログラム。```/etc/init.d/``` 以下に起動用スクリプトを書く手間が無くていい！！ あと Supervisor は、プロセス監視もしてくれるのでプロセスが死んだら自動的に再起動（設定次第ですけどね）してくれる。
※自分で管理してる（できる）サーバじゃないとこういうプログラム入れさせてくれないけどねｗ

> [適当なスクリプトをデーモン化するのにSupervisorが便利](http://d.hatena.ne.jp/anatoo/20120310/1331321778)

# Supervisor のインストール
easy_install からインストールできますが epel リポジトリからインストールします。[epel リポジトリ](http://qiita.com/muniere/items/6c4923a070cbbd824f39) の追加は、ここをみて設定するとよいです。

```
# yum --enablerepo=epel install -y supervisor
```

Supervisor 設定ファイルの編集します。```/etc/supervisord.conf``` を開いて下記の内容を追加します。

```/etc/supervisord.conf
[program:growthforecast]
command=/home/growthforecast/perl5/perlbrew/perls/perl-5.20.0/bin/perl /home/growthforecast/perl5/perlbrew/perls/perl-5.20.0/bin/growthforecast.pl --port=5125 --data-dir /var/log/growthforecast/dataprocess_name=%(program_name)s
stdout_logfile_maxbytes=1MB
stderr_logfile_maxbytes=1MB
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
user=growthforecast
autostart=true
autorestart=true
```

# Supervisor を起動してみる
起動に失敗している場合は ```/var/log/supervisor/supervisord.log``` を見てみる。

```
# service supervisord start
supervisord を起動中:                                 [  OK  ]
# supervisorctl status
growthforecast RUNNING    pid 7716, uptime 0:00:07
# ps aux | grep supervisorctl 
ずらずらｗ
```

# Upstart で supervisord を起動
始めから GrowthForecast を Upstart で起動すればよいのですが、supervisord も便利なので継続して使います。supervisord 自身がお亡くなりになった場合はどうしようもないので、Upstart が再始動してくれるように定義します。
ちなみに Upstart は、RHEL/CentOS 6.0 以降に導入されたデーモンツールです。

> [Upstart を使ってお手軽 daemon 化](http://heartbeats.jp/hbblog/2013/02/upstart-daemon.html)

```/etc/init/supervisord.conf
description "supervisord"
 
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/bin/supervisord -n
```

Upstart のコマンドで supervisord を起動します。

```
# service supervisord stop
# initctl start supervisord
```

# GrowthForecast の使い方…
環境回りばかりで、GrowthForecast の使い方を失念してました汗
Maximaでマンデルブロ集合のGIFアニメーション作成

# はじめに

[R言語でマンデルブロ集合のGIFアニメーション作成](http://qiita.com/ryosy383/items/da43e85224506ee89f33)をちょっと前に見かけ、Maximaでやってみようと思い、やってみました。

```text
for k:1 thru 15 do
mandelbrot ([iterations, k], [x, -2, 1], [y, -1.2, 1.2], [grid,400,400],[legend,false],[palette, [gradient, green, cyan, blue, violet]],[png_file,concat("mandel",sreverse(substring(sreverse(concat("0",k)),1,3)),".png")])$
```

```
system("convert -delay 10 ~/mandel*.png ~/mandel.gif")
```

```
system("open -a safari ~/mandel.gif")
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/3458/2e8574eb-62df-f090-1032-fb91c5a9a3d1.gif">

# まとめ

ゼロ付きでファイル名作るのにadd_zeroesなる関数を見つけるも、現状、何故か動かず、かなり回りくどい方法で0付きの数字を生成する羽目になりました。

R言語のそれの結果に近づけたかったのですが、力不足のようでした。!

# 関連投稿

- [ローレンツアトラクタをPOV-Rayで動画にする - Qiita](https://qiita.com/kjunichi/items/4ad474c7ccdcff71cb8f)

# 関連記事

- [「プログラムでシダを描画する」をMaximaで描画する](https://abrakatabura.hatenablog.com/entry/2014/07/18/061534)
- [Maximaでリーマン予想のゼータ関数をプロットした](https://abrakatabura.hatenablog.com/entry/2012/10/12/112958)
- [wxMaximaをMavericksでビルド出来た](https://abrakatabura.hatenablog.com/entry/2013/11/20/103631)
- [YosemiteでwxMaximaがmaximaと通信できない件](https://abrakatabura.hatenablog.com/entry/2014/10/19/203214)
- [OSXのMaximaでlapackを使うには](https://abrakatabura.hatenablog.com/entry/2015/09/07/073948)
- [Maximaで2018年のセンター試験、数学I・数学Ａの第1問を解いてみた](https://abrakatabura.hatenablog.com/entry/2018/01/30/204125)

## Maximaとは直接つながりはないけどその他関連記事

- [東大の過去問をPerlに解かせようとしたらbignumとbigintの違いを知った](https://abrakatabura.hatenablog.com/entry/2014/11/27/073543)
- [東大の入試問題をNode.jsに解かせてみた](https://abrakatabura.hatenablog.com/entry/2014/11/28/175853)
- [node.jsで大きな数を扱う](https://abrakatabura.hatenablog.com/entry/2014/05/20/072903)
- [Homebrewで--without-docsなしでOctaveをインストールしたい](https://abrakatabura.hatenablog.com/entry/2014/02/18/070521)
- [複素数版のコラッツの問題](https://abrakatabura.hatenablog.com/entry/2012/06/04/072248)
- [[Octave]gset parametricが使えない！](https://abrakatabura.hatenablog.com/entry/2008/04/27/232828)
- [Octaveのソースコードからのインストール](https://abrakatabura.hatenablog.com/entry/2004/09/27/215606)
- [[JavaScript]x^2ってMath.pow(x,2)ってやるんだ](https://abrakatabura.hatenablog.com/entry/2011/11/23/213728)
- [#イクメン #2011aug_baby フーリエ記述子を息子のお絵かきソフトに](https://abrakatabura.hatenablog.com/entry/2012/03/06/232411)
- [Javaによる連続体力学の有限要素法](https://abrakatabura.hatenablog.com/entry/2005/02/19/225329)
- [mimetex.html](https://abrakatabura.hatenablog.com/entry/2005/02/19/151650)
- [DockerでIPython Notebookを動かして、数え上げおねえさんを救う](https://abrakatabura.hatenablog.com/entry/2014/11/30/214133)
第2回 Swift勉強会で登壇してきました


HatchUpさんが主催されている[第2回 Swift勉強会](http://atnd.org/events/51944)で登壇してきました。
どうも、Qiitaで色々Swiftについて書いていたのがきっかけで声を掛けて頂いたようです。

話した内容は「Swift (with SceneKit) で簡単な3Dゲームを作ってみた」です。
発表したスライドは[SlideShareにアップ](http://www.slideshare.net/hirumakazuya/swift-with-scenekit-3d)してありますので、よかったらご覧ください。

[![Swift (with SceneKit) で簡単な3Dゲームを作ってみた](http://image.slidesharecdn.com/swift-study-140718094759-phpapp02/95/swift-with-scenekit-3d-1-638.jpg?cb=1405694906)](http://www.slideshare.net/hirumakazuya/swift-with-scenekit-3d)


## 次世代のHello World - Flappy Bird

どうも、次世代のHello Worldなんて呼ばれ方をされている様子のFlappy Bird。
ご多分にもれず、今回の簡単な3DゲームもFlappy Bird風のものを作成しました。
ゲーム画面はこんな感じ↓

![cap](https://qiita-image-store.s3.amazonaws.com/0/5616/9a9a9f18-eeb6-fbe5-8fe9-71d0d428b1b6.png "cap.png")


ゲームはFlappy Birdと同じように、画面をタップすると少しだけ跳ねて、オブジェクトの間を通って行く、というもの。
今回はタイトルとゲーム部分だけなのでスコアとかそうした細かいところは実装していませんが、だいぶSceneKitが分かりました。


## 参考記事

スライド内で出てくるQiita記事は以下のものです。

* [[Swift] 「!」、「?」マーク（Optional）についてのメモ](http://qiita.com/edo_m18/items/ca8c9c21049c280d3328)
* [[Swift] SwiftとObjective-Cで相互に連携する](http://qiita.com/edo_m18/items/861d090a5471f4f0eeae)


## サンプルコード

また、勉強会ではライブコーディングを行いました。
その際に作成したものの完成版をGitHubに上げてあります。

[HelloScene - GitHub](https://github.com/edom18/HelloScene)

ちなみにこんな感じのデモです。

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/68cee736-aea4-4e81-3edf-c8b08b9b0a92.png "cap.png")


勉強会でLTをされた方が、勉強会の様子と感想を書いてくれました。
[第2回 Swift 勉強会@TechBuzz でLTしてきた #swiftjp](http://shoken.hatenablog.com/entry/2014/07/19/081624)


## Lobi Rec SDK

![Rec SDK](https://lobi.co/img/recsdk/feature-intro.png)

スライドの最後のほうで紹介していますが、今自分が開発しているLobiアプリとは別に、色々と[ゲームを面白くするSDK](https://developer.lobi.co/ja)を配布しています。
その中でも、[Rec SDK](https://lobi.co/recsdk)はゲームを録画する機能を持ったSDKで、さらに実況機能もついています（インカメラで撮影しながらプレイ動画が撮れる）

今回の勉強会のためにSceneKitで簡単なゲームを作ってみましたが、SceneKit自体はGLKitのラッパーなので、GLKitに対応しているRec SDKも問題なく動きました。（ **あくまで個人で試したものなので公式の見解ではありませんが** ）

Lobi Rec SDK自体はiOS／Androidに対応していて、Cocos2d-xやUnityなど各種フレームワークなどにも対応しているので、興味ある方はぜひ試してみてください！（ステマ）
UITabBarItemのタイトルのセットについて

UITabBarItemをStoryBoardとかでセットしていて、そのタイトルをコードからセットしている場合。例えばローカライズが必要で、Storyboardでのローカライズが嫌なのでコードでやりたいときなどに、`viewDidLoad`に書いてしまうと、初めてその他部がタップされた時にしかセットされず、悲しい気持ちになる。涙こらえて瞳閉じたくなる。

```objc
self.tabBarItem.title = NSLocalizedString(@"TABBAR_TITLE_HOME", "");
```

そこでUIViewControllerにawakeFromNibをオーバーライドして書いてやると、まあ想定した挙動になる。

```objc
- (void)awakeFromNib
{
    self.tabBarItem.title = NSLocalizedString(@"TABBAR_TITLE_HOME", "");
    [super awakeFromNib];
}
```

ただし[落とし穴](http://www013.upp.so-net.ne.jp/tanken/Tanken/no4_PitfallOfNib.html)があるようなので注意。
Laravelで共通のビュー変数を複数のルートで共有する

たとえば特定の一連のURIにおいて同じビュー変数を設定したいときなどは`View::share()`を使う。

```php
View::share("name", "foobar");
```

指定する場所としては、`App::before`とか、特定のフィルタなんかが考えられる。同じ処理を何度も書きたくないとか、フィルタで一度引っ張ったデータをコントローラで再度引っ張ってて無駄っぽいと感じた時などに使うと幸せになれるかもしれない。

```php
App::before(function($request)
{
  View::share('something', Something::find(1));
});
```
Blenderの操作をUnity風にする

Windowsの設定になります。

ファイル - ユーザ設定 - 入力
![blender_input.png](https://qiita-image-store.s3.amazonaws.com/0/17192/eb017dd8-29aa-2dc4-39fa-52e1aa0f2985.png)
まず変態、変態いわれている右クリックの選択を左クリックにする。
3Dカーソルは以下の設定で誤動作するため切る。必要なら別に割り当ててください。

![blender_input2.png](https://qiita-image-store.s3.amazonaws.com/0/17192/ff2e1cf0-26b9-63bc-b5b4-5f018944c1e7.png)
ビューを回転を右クリックを押したままにする。
ビューを移動をshiftなしにする。
HTMLでヘッダがコンテンツの端までいかない場合の対処法

少しわかりにくいですが、こういう状態のことです。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/42193/d12842dc-1ae3-e0ac-8484-a6da3885d66e.png)
この画像を見るとヘッダの背景色がコンテンツの端まで届いていないことがわかると思います。

#原因
この現象はブラウザに横スクロールバーが出るときに発生します。
横スクロールバーはbodyの幅よりbodyの中の要素の幅の方が大きい時に発生します。
これはDeveloper Toolsで調べるとわかりやすいと思います。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/42193/84c50fab-a676-8eb2-5aaa-98ab6164ec35.png)
(青い部分がbodyの位置と大きさを示している)
この場合bodyの幅自体がコンテンツの端まで存在しないためヘッダにwidth:100%を指定してもコンテンツの端までの幅にならないのです。

#対処法
* bodyにmin-widthを指定する
* コンテンツの横幅がbodyの横幅より大きくならないようにする
* ヘッダを追従タイプにする

##bodyにmin-widthを指定する
bodyの幅は何も指定しない場合はブラウザの横幅と同じになります。
body内のコンテンツの幅以上の値をbodyのmin-widthに指定することでこの問題に対処できます。
たとえばQiitaの場合だと内部のコンテンツの幅は大体1000pxより少し大きいぐらいですので、bodyにmin-width:1020pxを指定すると問題を解決できます。
ただしこの方法は内部のコンテンツの幅がわからないと使うことができません。
また、この対処法ではブラウザの幅を小さくしていくと横スクロールバーがでてきてしまいます。
(最近のサイトでは横スクロールバーを出さないことが主流?好みの問題かも。)

既存のサイトの問題を手っ取り早く解消するにはこれが一番楽だと思います。

##コンテンツの横幅がbodyの横幅より大きくならないようにする
そもそも横スクロールバーを出さないようにするという解決方法です。
横スクロールバーが出てくるのはbodyの幅よりbodyの中の要素の幅が大きい場合が原因でしたので、これをどうにかして解決します。
そもそもなぜbodyの幅よりbodyの中の要素の幅が大きくなるかというと原因は以下のようなものです。

* widthを%以外で指定したブロック要素がありそのwidthがbodyの幅より大きい
* サイズの大きい画像(imgタグ)が存在する
* 途中で改行できない単語が入った文章がある

###widthを%以外で指定したブロック要素がありそのwidthがbodyの幅より大きい
基本的にwidthを%以外で指定する(pxなどで指定)と横スクロールバーのでる原因になります。
どうしてもwidthを%以外の数値で指定しなければいけないときはbodyにmin-widthを付けるようにしましょう。
アイコンやボタンなどの小さいサイズならpxなどで指定しても問題になることは少ないと思います。

###サイズの大きい画像が存在する
画像(imgタグ)のwidthは画像本来の幅と同じになってしまいます。
これは上記のwidthを指定した場合と同じような問題です。
widthに%で値を指定すると解決できますがそれだといろいろと面倒なので、max-widthに100%を指定しておくとうまくいくことが多いです。

###途中で改行できない単語が入った文章がある
これは長い英単語やurlを文章内に使った場合に置きます。
具体的な例は以下のようなものです。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/42193/406fcece-fac0-d0be-d855-8f89e49c402f.png)

```html
<h1>途中で改行できない例</h1>
<div style="width:50px; border:1px solid black">
	http://qiita.com/
</div>

<h1>途中で改行できる例</h1>
<div style="width:50px; border:1px solid black">
	We Are The World
</div>
```

解決策はword-wrapにbreak-word;を設定することです。
参考:[word-wrap－スタイルシートリファレンス](http://www.htmq.com/style/word-wrap.shtml)
ただしbreak-wordを指定すると、英単語が途中で改行してしまって読みにくくなることがあるので注意してください。

##ヘッダを追従タイプにする
ヘッダをブラウザのスクロールに追従するタイプにすればそもそもこの問題は発生しません。
ヘッダのpositionにfixedを指定し、本来のヘッダの位置(ページの一番上)にヘッダの高さと同じ高さに指定したプレースホルダを置いておけば実装できます。

#まとめ
PC向けのサイトを作るならbodyかヘッダにmin-widthをつけるのが一番手っ取り早く解決する方法だと思います。
実際PC版のgoogleの検索ページのヘッダにはmin-widthが設定されています。(この記事の編集時に確認)
しかし、スマホ向けで横にスクロールができてしまうというのは個人的に好きではないので、min-widthを指定する以外の方法で解決した方がいいと思います。
このほかにも解決方法としてJavaScriptを使うことでも対処できます。
autosshでsshを永続化(?)

fuseモジュールが必要のため、OpenVZでは使えません。

## rpm

* [公式](http://www.harding.motd.ca/autossh/index.html)
* [Assorted RPMS for Centos 7](http://www.melvilletheatre.com/articles/el7/)

## mac

* [SSH - VPNを使わず支店間でファイルサーバの共有フォルダに接続 - Qiita](http://qiita.com/tukiyo3/items/84b718574b5f95d3e9fd)にも使えそう
* windowsの人は[PuTTY で切れないトンネルを](http://blog.cles.jp/item/6312)で紹介されているpfwdを使うと良さそう。

```bash:
brew install autossh
```

```bash:
autossh -M 0 -f \
 -NL 8080:localhost:8080 remotesrv
```

* -f : バックグラウンド
* -M : モニタポート(理解していないが0指定)
* 後はいつもの。

## 動作テスト

1. PCをネットから切断。
1. sshが絶対に切れたと思う時間だけ待って再度ネットに接続。
1. 10秒後位にsshがつながっていることを確認。

## 終了方法

```bash:
killall autossh
```

# 便利に使うために

```bash:autoconnect.sh
#!/bin/sh

killall -9 autossh
killall -9 ssh
AUTOSSH="autossh -M 0 -f -o Compression=yes"

# alminium
$AUTOSSH -NL 8081:localhost:8081 remotesrv
# rdp1
$AUTOSSH -NL 3391:192.168.11.11:3389 remotesrv
# rdp2
$AUTOSSH -NL 3392:192.168.11.12:3389 remotesrv
# icinga
$AUTOSSH -NL 8082:localhost:80 remotesrv2

open -a "Google Chrome.app" $HOME/autoconnect.html
```

```bash:autoconnect.html
<style>
* {
  line-height: 2em;
}
</style>
<ul>
  <li><a href="http://localhost:8081/projects/myproject/issues?per_page=100">8081: remotesrv alminium</a>
  <li><a href="http://localhost:8081/jenkins/">8081: remotesrv jenkins</a>
  <li><a href="http://localhost:8082/cgi-bin/icinga/status.cgi">8082: icinga remotesrv2</a>
  <li>3391: rdp1</a>
  <li>3392: rdp2</a>
```

* autoconnect.sh を実行。

# モバイル環境で使ってみた

autosshが勝手に再接続してくれない(?)ので手動で`./autoconnect.sh`を実行しています。
複数のportfowardingをやってくれる点で便利。
量子コンピュータと量子通信 I 演習 3.15 解

# 演習 3.15（「比較と交換」を基礎にしたソーティングの下界）
$n$ 個の要素を持つリストに対して、何か一連の「比較と交換」演算を適用してソーティングを行うとする。リストの最初の配列には $n!$ 個の可能な配列がある。「比較と交換」演算を $k$ 回適用すると最初の可能な配列のうちでたかだか $2^k$ 個が正しい順序に配列されることを示せ。すべての可能な初期配列を正しい順序にソーティングするのに必要な「比較と交換」演算の回数は $\Omega(n\log n)$ である、という結論を導け。

# 解
## k 回適用すると 2^k 個がうんたらかんたら
- 簡単のため、$n = 6, k = 3$ の場合を考える。
- 「比較と交換」は、第1引数と第2引数、3と4、5と6 という組み合わせに対して、適用する。
- リストの最初の配列には $n! = 720$ 通りもの可能な配列があるが、この3回の適用によって正しい順序に並び替えられるのは次の $8 = 2^k$ 個だけである：

```
1: (1,2,3,4,5,6)
2: (2,1,3,4,5,6)
3: (1,2,4,3,5,6)
4: (2,1,4,3,5,6)
5: (1,2,3,4,6,5)
6: (2,1,3,4,6,5)
7: (1,2,4,3,6,5)
8: (2,1,4,3,6,5)
```

これはかなりうまくいった場合で、実際は1回目の適用の第1引数と 2回目の適用の第1引数がかぶっている場合などもあり、$2^k$ 個に満たないかもしれない。大事なのは、正しい順序に並び替えられるような最初の状態が、$2^k$ という値で抑えられたことである。

## 全ての可能な初期配列を正しい順序にうんたらかんたら

では、$n! \le 2^k$ を満たす最小の k はいくつだろうか。$k$ がこれより小さい場合は、 $n!$ 通りの場合のどれかは絶対に正しい配列に並べ替えることは出来ない。 $k$ が $n! \le 2^k$ を満たしていれば、ソーティングが出来るかもしれない。
これはスターリングの公式によって、$n$ が十分に大きければ次のように近似できる：

```math
n^ne^{-n}\le2^k \\
n\log n-n\le k\log 2 \\
\frac{1}{2}n\log n \le n(\log n - 1) \le k\log 2 \\
\frac{1}{2 \log 2} n\log n \le k
```

従って、全ての可能な初期配列を正しい順にソーティングするのに必要な「比較と交換」演算の回数 $k$ は、$\Omega(n\log n)$ である
フォント"M+"をインストール


プログラマ御用達のフォントらしいので、
ミーハー気分でインストールしてみる事にした。
一応、Vimで使用する事を目的としている。

## ダウンロード

> [M+ OUTLINE FONTS](http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/download/index.html "")

こちらの公式サイトを参考に作業する。

といっても、手動でフォント出力するつもりはないので特に難しい事は何も無い。

* DOWNLOADのところにある"Latest Release"横のリンクを踏んで最新版の`.tar.xz`ファイルをダウンロード、解凍。
* 出来たフォルダ"mplus-TESTFLIGHT-XXX"の中へ移動して、`.ttf`ファイルを全選択し、ダブルクリック。
* `フォントをインストール`ボタンをクリック。

ここからは人によって異なると思われる。
私の環境の場合、Vimのフォントを変えようと思ったら、
ターミナル(bash)のフォントを変更すれば良い。

以上
test-kitchenでsshに接続するポートを複数の候補から自動決定する

Chefレシピの中でsshdのポートを変更した時、プロビジョニングやloginの際に、変更前後で`test-kitchen`などの設定を都度変えないといけない。
めんどくさいので、複数のsshポートの候補から接続可能なポートを探しだして決定する機構がないか探したが、ちょっと探した感じだと見当たらなかったのでモンキーパッチ当てて逃げた。


## 実装

`sshd`の`listen`ポートが

- `22` => `2222`

と変わる場合に、

```yaml:.kitchen.yml
driver:
  name: vagrant
  network:
    - ["forwarded_port", {guest: 22, host: 2200}]
    - ["forwarded_port", {guest: 2222, host: 2201}]

provisioner:
  name: chef_solo

platforms:
  - name: centos-6.4
```

と変更前後のポートフォワーディングを共に設定した上で

```rb
# -*- encoding: utf-8 -*-
module Kitchen
  class SSH
    def login_command
      args  = %W{ -o UserKnownHostsFile=/dev/null }
      args += %W{ -o StrictHostKeyChecking=no }
      args += %W{ -o IdentitiesOnly=yes } if options[:keys]
      args += %W{ -o LogLevel=#{logger.debug? ? "VERBOSE" : "ERROR"} }
      args += %W{ -o ForwardAgent=#{options[:forward_agent] ? "yes" : "no"} } if options.key? :forward_agent
      Array(options[:keys]).each { |ssh_key| args += %W{ -i #{ssh_key}} }
      args += %W{ -p #{port}}
      args += %W{ #{username}@#{hostname}}

      LoginCommand.new(["ssh", *args])
    end

    private

    def establish_connection
      logger.debug("[SSH] opening connection to #{self}")
      Net::SSH.start(hostname, username, options.merge(port: port))
    end

    def port
      rescue_exceptions = [
        Errno::EACCES, Errno::EADDRINUSE, Errno::ECONNREFUSED,
        Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH,
        Net::SSH::Disconnect
      ]

      @__port ||= candidacy_ports.find do |port|
        retries = 3

        begin
          Net::SSH.start(hostname, username, options.merge(port: port))
          true
        rescue *rescue_exceptions => e
          if (retries -= 1) > 0
            logger.info("[SSH] connection failed, retrying (#{e.inspect})")
            sleep 1
            retry
          else
            logger.warn("[SSH] connection failed, terminating (#{e.inspect})")
            false
          end
        end
      end

      if @__port.nil?
        raise SSHFailed.new('not found enable ssh ports')
      end

      @__port
    end

    def candidacy_ports
      yaml = YAML.load(
        ERB.new(
          open(yaml_path).read
        ).result
      )
      @_candidacy_ports ||= yaml['driver']['network'].map {|config| config[1]['host'] }
    end

    def yaml_path
      File.expand_path(
        File.join(
          Dir.pwd,
          ENV['KITCHEN_YAML'] || '.kitchen.yml'
        )
      )
    end
  end
end
```

このパッチをロードすると、候補となるポートをフォワードポートの中から探索していき、成功すると以後全てのssh接続で成功ポートを使用するようになる。

```bash
$ kitchen login centos-64
       [SSH] connection failed, retrying (#<Errno::ECONNREFUSED: Connection refused - connect(2) for "127.0.0.1" port 2200>)
       [SSH] connection failed, retrying (#<Errno::ECONNREFUSED: Connection refused - connect(2) for "127.0.0.1" port 2200>)
$$$$$$ [SSH] connection failed, terminating (#<Errno::ECONNREFUSED: Connection refused - connect(2) for "127.0.0.1" port 2200>)
Last login: Sat Jul 19 17:01:24 2014 from 10.0.2.2
[vagrant@centos-64 ~]$ 
```

明らかに内部実装に追従できないし、パッチにすべきではないではないんだけどとりあえず動かすことを優先でやった。
なので、`test-kitchen`のバージョンによって動かない可能性が高いので注意。
写真の登録で離脱させないためにもGravatarから写真をGET


ソーシャルログインした際に顔写真を取ってくるのはよくやるけどメールから登録の場合でもGravatarから写真が取得可能。写真のファイルからのアップロードはコンバージョンが低いので取れるものはできるだけ取りたい。

Gravatarの写真は下記URLにアクセスする事で取得可能。

```
http://www.gravatar.com/avatar/HASH
```

参考: https://ja.gravatar.com/site/implement/images/

### HASHの作り方
* メールアドレスから空白文字を消す
* メールアドレスを小文字に変換
* md5ハッシュ変換


### コードサンプル

こちらに各言語でのコードサンプルが用意されてます。親切ですね。
https://ja.gravatar.com/site/implement/

rubyの場合だと下記

```ruby
# include MD5 gem, should be part of standard ruby install
require 'digest/md5'
 
# get the email from URL-parameters or what have you and make lowercase
email_address = params[:email].downcase
 
# create the md5 hash
hash = Digest::MD5.hexdigest(email_address)
 
# compile URL which can be used in <img src="RIGHT_HERE"...
image_src = "http://www.gravatar.com/avatar/#{hash}"
```

カンタン！
量子コンピュータと量子通信 I 演習 3.7 解

# 演習 3.7（停止オラクル）
負でない整数 $x$ を入力とし、$h(x)$ の値を出力とするブラックボックス（black box）が使えるとする。ここで $h(\cdot)$ はコラム 3.2 で定義する停止関数である。このタイプのブラックボックスを停止問題に対するオラクル（oracle）と呼ぶ。オラクルを呼び出す能力を備えた通常の Turing 機械があるとする。これを実現する 1 つの方法は 2 テープの Turing 機械を使い、オラクルを呼び出して Turing 機械に付加的なプログラムを追加し、第 2 テープ上の現在の内容 $x$ に対する $h(x)$ の値を第 2 テープに書き込むようにすればよい。この計算モデルは停止関数を計算できるので、明らかに従来の Turing 機械モデルより強力である。この計算モデルの停止関数は決定不能であるか？換言すれば停止問題のオラクルの支援を受けた Turing 機械は、オラクルを持つ Turing 機械に対するプログラムが特定の入力で停止するかどうかを決定するか？

# 解
決定できない。

コラム 3.2 の議論は、よくよく読んでみると、`TURING(x)` や `HALT(x)` がどのような計算モデルに属しているかを問題にしていない。どのような計算モデルであっても、$h(x)$ を仮定して `HALT(x)` を構成し、`TURING(x)` を作って矛盾を導くことが出来る。
Using screen

Using screen on my raspberry pi so that I don't lose sessions when disconnected.

Found a good tutorial:
http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/

Install screen:
sudo apt-get install screen

Start screen:
screen

New window:
Ctrl+a, c

Previous/next window:
Ctrl+a, p/n

Detach screen:
Ctrl+a, d

Reattach to screen:
screen -r

Help:
Ctrl+a, ?
SublimeTextパッケージ紹介：AutoFileName

# 本家
AutoFileName
[GitHub - BoundInCode/AutoFileName](https://github.com/BoundInCode/AutoFileName)

# 使い方
hrefやsrcの指定の際に、自動でディレクトリ内のファイル一覧を表示してくれるパッケージです。
また、画像を選択した場合は自動でwidth、heightを補完入力してくれます。
補完候補に出るのは、プロジェクトのフォルダ内にあるもののみになります。

# スクリーンショット
![64WcTRXMsb.gif](https://qiita-image-store.s3.amazonaws.com/0/36099/689845b4-da76-7449-414f-f9ae521771b4.gif)


![AutoFileName-2.gif](https://qiita-image-store.s3.amazonaws.com/0/36099/d424b2f2-d224-70a9-a53b-dfca5c0285a6.gif)


## キーバインド
`ctrl`+`space`と本家には書いてあるが、パス入力時に自動で起動して補完候補をリストしてくれます。
はじめに：BigQueryとおれさま。

#はじめに
こんにちわ。satoru_magと申します。
さて、BigQueryを使い始めて半年ぐらいが経ちました。
最初は海のものとも山のものともわかりませんでしたが、使っていくうちにいかに便利かということがわかってきました。
でもね、でもね、<b>ほとんど情報が無い！</b>
『インチキな速さ！』とか『安い！』とか『fluentdにも連携できる！』とか、技術的なお話しとかはよく聞くわけですよ。
でも、『こんな感じで使ってるよ』とか『このあたりは要注意！』とか『こういう工夫がいるよね？』みたいなものが一切ない！
まぁ、それぐらい簡単に使えるということなんですけどね。

と、いうわけで私が使っていてこんなのあるよって感じのTipsとかを書いていきたいと思います。

#BigQueryとの出会い
出会いってほどのもんじゃないんですけどね。
社長から『BigQuery使ってみろ！』って言われただけなんですけど（笑）
最初はすんごい懐疑的でした。『BigDataなんてものはうちに無いよ』ってね。RDBMSしか使ったこと無かったから、『更新出来ないのはうちに合わない』とも思っていた。

でもね、ちょっと使ってみるだけで凄さがわかった。
サンプルデータ（wikipedia?）でも分かるかもしれないけど、実際の業務で使っているデータを放り込んでみると<b>『GoogleのBigQueryはバケモノか！』</b>となったわけです。

#BigDataなんて言葉に恐れるな！
みんな『凄すぎ！』って言葉にビビッて『うちでは使いこなせないっすよ、恐縮です！』って思ってるのかな？ここまで情報が少なすぎるとホントそう思う。もしくはセキュリティとか？クラウドだし・・・。などなど。
しかも、結構素敵な技術者の人たちが専門用語バリバリで記事書いてくれていたり。

『BigData』『データサイエンティスト』『テラバイト級のデータが一瞬で！』『高速分析！』

<b>知るか！そんなもん！わしゃ運用やっとるんじゃ！（おれ）</b>
と、いうことでそういう人ほど使ってみてください。現場の声を一番知ってるんじゃないですか？
『こんなデータを出して欲しい』と言われても『そんなSQL投げたらDB止まっちゃう！』なんてことなかったですか？で、細切れでSQL投げてExcelでちまちま加工して。どんだけ工数かけてデータ作っても、『やっと出たのかよ』と言われて、結局会議で一回使うだけとか。

もう、うちの子（部下）たちにそんな悔しい思いさせない！
むしろドヤ顔で『あぁ、BigQueryで出ますよ』って言ってやりますよ！

#と、いうことで。
おっと、半分愚痴になっちゃいましたね。
ということで色々書いていきたいと思います。包み隠さず、『そんなこと知ってるよ』ってところまで書いていきます。
誰かの参考程度になれば幸いです。
emacs 設定メモ

## 参考設定

#### [Emacsの基本設定 - メメメモモ](http://memememomo.hatenablog.com/entry/2013/03/17/182626 "Emacsの基本設定 - メメメモモ")  

基本的な必要最小限の設定に共感。ディレクトリ構成も。

##### 日本語設定

Windows だと Shift-JIS と UTF-8 がややこしい。
[Emacs における日本語文字コードの設定 | プログラマーズ雑記帳](http://yohshiy.blog.fc2.com/blog-entry-273.html "Emacs における日本語文字コードの設定 | プログラマーズ雑記帳") から引用。
Windowsだと以下の２行だけでいいかも。会社の設定を確認したら少し違ってた、こっちに変更してしばらく運用してみる。

```emacs:
;; ベースは Shift-JIS のまま
(set-language-environment "Japanese")
;; ファイルのデフォルトを HTML や C++ 用に BOM 付き UTF-8 
(setq default-buffer-file-coding-system 'utf-8-with-signature)
```
今は、以下の設定Windowsだと必要ないらしい。（会社の設定ではcp932が設定されてた）

|設定関数|対象|
|:--|:--|
|set-file-name-coding-system|ファイル名|
|set-keyboard-coding-system|キーボード|
|set-terminal-coding-system|ターミナル(コンソール)|
emacsちょっとした便利操作

## 式評価

`C-j` eval-print-last-sexp

式を評価してその結果を下の行に表示

`C-x C-e` eval-last-sexp

情報元：[Emacs設定講座 その3「scratch バッファと eval(評価)」。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20090215/1234692209)

結果はミニバッファに表示

## 文字コード指定してバッファ再読み込み

`C-x RET r utf-8 RET`

情報元：[emacsの文字化け対策まとめ - プログラミングのメモ](http://konbu13.hatenablog.com/entry/2014/01/11/234940)

`C-x RET c utf-8 RET C-x C-v RET`

情報元：[[emacs] バッファが文字化けした場合 - 綾小路龍之介の素人思考](http://za.toypark.in/html/2010/06-20.html "[emacs] バッファが文字化けした場合 - 綾小路龍之介の素人思考")

## バッファ再読み込み

`C-x C-v RET`
`M−x revert` よりもキーストローク少なくて済むので速い。

## 選択範囲を重複削除して出力

1. 処理したいテキストの範囲を選択。
2. `C-u M-| sort | uniq`

情報元：[Emacs: 重複する行を削除する sort, uniq: Akatsukiの備忘録](http://akatsukix.seesaa.net/article/342028102.html "Emacs: 重複する行を削除する sort, uniq: Akatsukiの備忘録")

## タブ幅変更

1. `M-x set-variable`
2. tab-width
3. タブ幅を入力

もの凄くオーソドックスなんだけど、すぐ忘れるので。

## grep 結果ジャンプ

``C-x ` ``
  grep の結果について1つ1つジャンプ

`C-c C-c`
  grep の結果バッファ内でカーソル合わせてジャンプ
Docker事始め - ハンズオン勉強会+α

# はじめに
「[クラウドを渡り歩け！さくら×ニフティ合同ハンズオン勉強会！！](http://www.zusaar.com/event/14467015)」に参加してきました。「家に帰るまでが遠足」という言葉があり、「アウトプットするまでが勉強会」という言葉もあったはずなので自分の整理も兼ねて記載します。
\# 最近あんまり聞かなくなった…？

# やったこと
ハンズオン内容は[こちら](http://qiita.com/zembutsu/items/3a396dd1e9d16193b0ba)を参照してください。
基本的には記載内容通りの手順を行えばDockerの一通りの操作はできると思います。
\# 実際に手を動かして試してみるがコンセプトのようなのでDockerの技術要素とか知らなくてもできるのが良いですねー。

コレ+感想だけだと内容が無いので…+αで試したことを記載します。

# ぷらすあるふぁ
さくらインターネット様よりさくらのクラウドの期間限定無料クーポンをいただいた&さくらのクラウドがCoreOSに対応したということなので以下を試してみました。
1.オンプレのVMwareESXi上にDocker on CentOSをセットアップし、CentOSコンテナを構築する
2.CentOSコンテナ上で静的コンテンツを返すイメージを作成しexportする
3.さくらのクラウド上にDocker on CoreOSをセットアップする
4.2でexportしたコンテナイメージを3にimportする
5.importしたコンテナイメージから起動する
6.静的コンテンツが想定通りに出力されるかどうか確認する

# やってみる
## バージョン構成
### オンプレ上のDocker on CentOS

```
# uname -a
Linux hostname 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 19 21:14:45 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/issue
CentOS release 6.5 (Final)
# docker version
Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.2
Git commit (client): 63fe64c/1.0.0
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.2
Git commit (server): 63fe64c/1.0.0
```

### さくらのクラウド上のDocker on CentOS

```
CoreOS Version : CoreOS 379.3.0
$ uname -a
Linux hostname 3.15.5+ #2 SMP Wed Jul 16 02:42:54 UTC 2014 x86_64 Intel(R) Xeon(R) CPU E5-2640 0 @ 2.50GHz GenuineIntel GNU/Linux
$ docker version
Client version: 1.1.1
Client API version: 1.13
Go version (client): go1.2
Git commit (client): dc62f3c
Server version: 1.1.1
Server API version: 1.13
Go version (server): go1.2
Git commit (server): dc62f3c
```

## 静的コンテンツを返却するコンテナ作成とエクスポートとアップロード
ハンズオン資料の7を参考にコンテナを作成する。
ハンズオン資料の8、9を参考にコンテナ変更内容をコミット、エクスポートしCoreOSにアップロードする。
\# /tmp/配下にsakura-static.tarという名前でアップロード

## CoreOS側作業
サーバ作成時にアーカイブ選択->CoreOS、任意のパスワードを指定するだけでOKです。
ユーザ名:core パスワード:任意で指定したものでログイン可能
\# CoreOSの場合、標準でDockerがインストールされているため何もしなくても使えます。

```
$ cat /tmp/sakura-static.tar | docker import - static:sakura
c64feefc1370445231786ae82ca8eba7e9e63897f5a8e2a2e3242a21a5f38806
$ docker images
REPOSITORY  TAG       IMAGE ID      CREATED              VIRTUAL SIZE
static      sakura    c64feefc1370  About a minute ago   266.4 MB
$ docker run -p 80:80 -t -i static:sakura /bin/bash
bash-4.1#
bash-4.1# service httpd start
# Ctrl+p、Ctrl+qで抜ける
# 想定通りの静的コンテンツが出力されることを確認する
$ curl http://localhost/
sakura
```

# 雑感
- オンプレ-クラウド間、クラウド-クラウド間で問題なくコンテナのexport/importができた
- 移行に関してP2V、V2Vに比べると格段にC2C(Container To Container)のが簡単
- C2Cが簡単ということはアプリのデプロイ等にも恩恵がある（ポータビリティ）
- ハイパーバイザー上に構築からハイパーバイザー上のコンテナ上に構築という流れになりそう
- 上記のような流れになれば基本的な機能についてのクラウドロックインは考えなくてもよくなりそう
- DBサーバ用途には向かないと思うので、DBサーバは各クラウドのDBサーバ専用サービスを利用すればよい
- コンテナの配置について考える必要がある（リソース/パフォーマンス）
- 監視方法は考える必要がある
- ログ取得方法は考える必要がある
- 複数Dockerを一元的に管理できるようなものがあると今以上に加速するはず
- CoreOS、etcd、fleet、systemdなどの知識も必要になってくる

\# 全体的に既に言われていることではありますが。。。

# 最後に
このような勉強会を企画していただいたニフティ様、さくらインターネット様、クリエーションライン様ありがとうございました。
CoreDataエンティティクラスのプロパティの型 in Swift


SwiftでCoreDataを扱う場合でも、Entityに対応したクラスを定義することに変わりはない。

```
import CoreData

// このクラスはObjective-C側から読み込まれるため、@objcをつける。
// ref. https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

@objc(ToDo)
class ToDo: NSManagedObject {
    
    @NSManaged var title: NSString
    @NSManaged var created: NSDate
    @NSManaged var modified: NSDate
    @NSManaged var repeat: NSNumber
}
```

ただ、この時に注意しなければいけないのが変数の型。
以下のように定義した場合、Stringは問題ないが、Intは0以外の値を保存しようとすると例外終了する。(現状、根本原因は分からず)

```
import CoreData

@objc(ToDo)
class ToDo: NSManagedObject {
    
    @NSManaged var title: String
    @NSManaged var created: NSDate
    @NSManaged var modified: NSDate
    @NSManaged var repeat: Int
}
```

Objective-Cから扱われるクラスは型もObjective-C側に寄せた方が安全かも?
Swiftで現在地を取得してみた


Swiftで現在地を取得するのにかなり手間取ったので、メモを残しておきます。

現在地の緯度と経度を画面に表示させています。

```ViewController.swift

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
    
    var lm: CLLocationManager! = nil
    var longitude: CLLocationDegrees!
    var latitude: CLLocationDegrees!
    

    @IBOutlet var lonLabel: UILabel
    @IBOutlet var latLabel: UILabel
    
    @IBAction func nowButton(sender: AnyObject) {
        //現在地取得
        lm.startUpdatingLocation()
    }
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var url = NSURL(scheme: "http", host: "xxxxxxx.herokuapp.com", path: "/1.0/users")
        var request = NSURLRequest(URL: url)
        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
        var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: nil) as NSDictionary
        
        for (key, value) in json {
            println()
        }

        longitude = 0.0
        latitude = 0.0
        lonLabel.text = String(longitude)
        latLabel.text = String(latitude)
        
        
        lm = CLLocationManager()
        lm.delegate = self
        //位置情報取得の可否。バックグラウンドで実行中の場合にもアプリが位置情報を利用することを許可する
        lm.requestAlwaysAuthorization()
        //位置情報の精度
        lm.desiredAccuracy = kCLLocationAccuracyBest
        //位置情報取得間隔(m)
        lm.distanceFilter = 300
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /** 位置情報取得成功時 */
    func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!){
        longitude = newLocation.coordinate.logitude
        latitude = newLocation.coordinate.latitude

        self.lonLabel.text = String(longitude)
        self.latLabel.text = String(latitude)
    }

        /** 位置情報取得失敗時 */
    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
        NSLog("Error")
    }

}


```

これだけでいけると思っていたんですが、iOS8からだと、info.plistに以下のkeyが存在しないとlocationManagerメソッドが呼ばれないようです。

```
<key>NSLocationWhenInUseUsageDescription</key>
<string>The spirit of stack overflow is coders helping coders</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>I have learned more on stack overflow than anything else</string>
```

参考：
http://stackoverflow.com/questions/24062509/ios-8-location-services-not-working

Stack Overflow様々ですm(_ _)m