OmniAICreator/Qiita-1.07M huggingface dataset:
PHPからMYSQLにつながらない。OLD_PASSWORDが原因だった。

# 現象

古いシステムをベースに機能追加していると、WebサーバからMySQLに接続できない問題にぶつかりました。

【環境】
接続元： PHP 5.3　新規
接続先： MySQL 5.0.96 運用中

# 調査
調べてみるとこんな記事が。
http://www.ninton.co.jp/?p=1198

この記事によると、MySQLユーザーが古い16バイトのパスワードフォーマットであることが原因みたい。
PHP5.3から、mysqlドライバ部分がmysqlndライブラリに変更されて、41バイトのパスワードフォーマットを使用しないといけないとな。
対応としては、
１.my.cnfのold_passwords=0に変更してMySQL再起動。そしてユーザーのパスワードを設定する。
２.別のMySQLサーバをたててmy.cnfのold_passwords=0にして、そこでパスワード生成。それを本番のユーザーパスワードにコピー。

うーん、どっちも障壁が高いなあ。
my.cnfの設定を変えないままパスワード設定できないものだろうか？



# できた



そうだ、今限りで設定を一時的に変更しよう。
```
SET @@session.old_passwords = 0;
```

OLD_PASSWORD関数でパスワード生成してみます。
```
SET PASSWORD FOR 'testuser'@'localhost' = OLD_PASSWORD('mypass');
```
セットしたら下記SQLで結果確認。
```
SELECT * FROM `mysql`.`user`;
```
→6f8c114b58f2ce9e

これがダメな16バイトハッシュのパスワードです。
では、本題の41バイトハッシュで。PASSWORD関数を使います。
```
SET PASSWORD FOR 'testuser'@'localhost' = PASSWORD('mypass');
```
→*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4



41バイトハッシュでパスワードを生成できました。
PHPからMySQLに接続できるようになりました。
PayPalエクスプレスチェックアウトの決済方法（販売、承認、注文）の違い

エクスプレスチェックアウトには、以下の3つの支払いオプションがあります。

 - 承認
 - 注文
 - 販売

各オプションの説明は次のとおりです。

###  承認
承認オプションは、資金の保留に使用します。承認オプションを送信すると、PayPalに対して、資金が利用可能かどうかを確認し、利用可能な場合は、72時間保留するように請求することになります。承認の回収期間は最長29日です。請求した場合、資金は3日間のみ保留されます。29日間の最初の72時間は「保証期間」と呼ばれます。これは、PayPalが、資金が利用可能であることを保証することを意味します。

 - カード発行銀行、またはデビットカードなどのACH取引における銀行によって異なりますが、ほとんどの場合は、保留期間は3日間です。場合によっては、3日間の保留が免除される、あるいは、最長30日間または次回の請求サイクルまでカードで保留される場合もあります。
 - お客さまが29日間の最後の3日間に資金を回収することを決定した場合、資金は、通常の3日ではなく、29日目の終わりまで保留されます。
 - 元の承認額より少ない金額、元の承認額全額、元の承認額の最大115%または$75を加算した金額のいずれか少ない金額、のいずれかを回収できます。

#### 例:

 1. 月曜日に、買い手が、お客さまのサイトで買い物をします。
 2. 買い手は、在庫がある商品をショッピングカートに追加し、PayPalエクスプレスチェックアウトを介して支払いを行います。
 3. PaymentAction フィールド(SetExpressCheckoutとDoExpressCheckoutPaymentの両方のAPIコール)をAuthorizationに設定します。
 4. 承認IDが返ります。これは、取引が正常に終了したこと、承認IDを回収するのに最長29日間あることを示します。
 5. 水曜日に、商品の発送を計画し、最初にDoCapture APIコールを使用して支払いを回収します。
 6. 回収金額と承認IDをPayPalに送信します。「保証期間」内であるため、実際の資金が、買い手の資金源からお客さまのPayPalアカウントに移動します。
 7. お客さまはSuccessレスポンスを受け取り、その後、商品を発送します。

注: 資金の回収を木曜日まで待った場合、PayPalは、ユーザーの資金源に資金があることを保証しません。
 
### 注文
買い手のショッピングカートの商品がすべて、在庫がある場合、または在庫がない場合、すぐに入手できる場合は、注文オプションを使用します。承認と同様、注文は29日間有効ですが、注文では資金の保留を行わない点が大きく異なります。代わりに、お客さまが、後で承認を行うことにより、資金を保留することができます。

 - 注文を使用する利点は、承認を行うことにより、発行銀行に応じて、特定の期間、資金を保留する点です。
 - 比較的長い期間、商品を配送しない可能性がある場合、顧客のクレジットカードに影響を与えたくない場合があります。
 - デフォルトでは、注文の有効期間は29日です。この期間を延長するには、ビジネスサポートまたはアカウントマネージャーに連絡して申し込む必要があります。ビジネスサポートの電話番号については、PayPalアカウントにログインして、[お問い合わせ]をクリックして確認してください。

#### 例:

 1. 買い手が、お客さまのサイトを訪問して、2つの商品をショッピングカートに追加し、PayPalエクスプレスチェックアウトを使って買い物をします。
  - 商品Aの価格は$15で、在庫があります。
  - 商品Bの価格は$25で、3週間の入荷待ちです。
 2. 買い手が支払い処理を行い、$40の注文を設定します。
 3. PaymentAction フィールド(SetExpressCheckoutとDoExpressCheckoutPaymentの両方のAPIコール)をOrderに設定します。
 4. 商品Aは在庫があるため、翌日の商品発送前に$15の承認を行って、注文の一部を処理します。$15の注文でDoAuthorizationを実行して、その金額を保留します。翌日の発送の前に、$15の承認IDを取得します。
 5. 3週間後、商品Bが入荷します。$25のDoAuthorizationを実行し、その金額を保留して、注文の残りの処理を開始します。
  - 承認が成功した場合、商品Bを翌日発送する前に、支払いを回収して、注文の内部処理を続行します。
  - 承認が失敗した場合、PayPalで選択された買い手の資金源の資金が使用できないことを意味します。問題を解決するには、買い手に連絡する必要があります。
 6. $40が回収された後、注文が終了になります。注文では、資金が保留されないため、最終的に注文金額より少ない金額を回収した場合、保留についての顧客からの問い合わせを心配する必要がありません。

注: 1つの注文に複数の承認を行うには、アカウントマネージャーまたはPayPalのビジネスサポートに連絡して、この機能を申し込む必要があります。ビジネスサポートの電話番号については、PayPalアカウントにログインして、[お問い合わせ]をクリックして確認してください。

 
### 販売
販売オプションでは、資金を保留せずに、支払いが処理されます。資金は、買い手の資金源からPayPalアカウント残高に即座に振り替えられます。

 - デジタルグッズや、注文を受け付け次第発送する商品など、商品を迅速に発送する場合に販売オプションを使用します。
 - 資金は、買い手の資金源から即座に引き落とされ、お客さまのPayPalアカウント残高に入金されます。


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
2016年のPayPalセキュリティ計画 - Classic APIのGETメソッドの使用中止

2016年のPayPalセキュリティ計画 - Classic APIのGETメソッドの使用中止の詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1927&viewlocale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
Re:dashのVisualizationで何ができるかがパッと見分かりづらかったので自分なりにまとめてみた

どんなことができるんだろう、というのがいまいちよくわからなかったので自分なりに理解したふうにまとめてみます。
データ分析については素人である自分用メモ的な意味が多分にありますが、同じようによくわからないという人の参考になれば幸いです。
わかりづらいのは理解力が低いからだ！と言われたら元も子もないですが…。
参考にしたRe:dashのバージョンは0.10.1+b1836です。今後加筆修正するかも。
**ぶっちゃけた話、ほぼChartでできることのメモです。**
スクリーンショットは [Redashのデモサイト](https://demo.redash.io)のものです。

[こちらの記事](http://qiita.com/wapa5pow/items/1455222b519946dc16db)も参考になります。

# Boxplot
ごめんなさいあんまりよくわかりません。
Boxplot（箱ひげ図）ってものについてあんまりよく知らないので使ったことがなく…。
調べてみたら株価のチャートみたいなグラフなんですね
https://ja.wikipedia.org/wiki/%E7%AE%B1%E3%81%B2%E3%81%92%E5%9B%B3

# Chart

![スクリーンショット 2016-07-05 11.53.40.png](https://qiita-image-store.s3.amazonaws.com/0/53386/d90a9603-fca6-cf20-871e-913519062226.png)

選択項目ごとになにができるかを下記に。

## General
* 「Line,Bar,Aria,Pie,Scatter」を選択できる  
それぞれ線グラフ、棒グラフ、線グラフ（領域色塗り）、円グラフ、散布図、といった感じです。
* X軸、Y軸にどの値をセットするか（Y軸は複数可）、どれでグループ化するかをグラフ作成時に選べる
* Stackingでグラフを積み上げる形にするかしないか、する場合は数字か百分率かを選べる。  
円グラフ、散布図だと（意味が無いので）選べません。線グラフでも意味ない気がするんですが、なぜか選択できます（見た目の変化はなし）

## X　AXIS
* 軸を日付にするか、普通に線形にするか対数系にするか、項目をそのまま表示するかを選べる。
* ラベル付もできる。

## Y　AXIS
* 軸を線形にするか対数系にするかを左軸、右軸両方で行える。
* ラベル付もできる。

## SERIES
* それぞれの項目の個別に順番を入れ替えられる
* それぞれの項目を個別のい左右どっちの軸にするか選べる
* それぞれの項目のラベルを個別にデフォルトから編集できる
* それぞれの項目のグラフの形を個別に設定できる  
Pieとか設定したらどうなるか、と思ったら線グラフになったり、この辺の挙動はよくわかりません…。

それぞれの項目のラベルは、日付を表示した時にとても微妙な感じになるので、ラベルのフォーマット指定とかできたらいいのになあ、と思ってます。
方法あるのかな？

# Cohort
いわゆるコホート分析ってやつです。
これも自分は使っていないので細かくは割愛します。
一応、作ることができますよ、ということだけ。
きっと誰か詳しい人が書いてくれるでしょう（適当）
本当はこういうのもちゃんと使えるようになりたいんですがねえ…。

# Counter
指定列の指定行の値を表示させます。
ターゲット値として指定列の指定行の値を下に表示させることもできます。
くらいだろうか。
![スクリーンショット 2016-07-05 12.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/53386/2c5f931b-fe6e-5bac-2c0f-291c902eead3.png)

# Map
これは使ったことないんですが、設定項目にLatitude（緯度）とLongitude（経度）のカラムを指定できるところがあるので、その2つの値を元に地図に位置を表示してくれる図だと思います。

# Pivot Table
読んで字のごとくピボットテーブルです。
引っ張ってきたデータを元にピボットテーブルをRedash上に作成できます。
ただ、データ量が多いと重くなるんですかね…。
これをうまく使えると色々やりやすくなりそうです。
細かい使い方はあとでわかったら追記するかもです。

# その他
Redashのデモサイト見たら「Word Cloud」って項目があったんですが、どうやらリリースされたばかりの0.11.0で入ったようですね。
https://github.com/getredash/redash/releases/tag/v0.11.0.b2016

単語出現頻度を可視化できるってことですかね。
この辺も詳しい人の解説がほしいです…。


まだまだRedashは情報が少ないのですが、きちんと使えたら便利だなーと思うので、こんなんでも参考になったら幸いです。
Railsのバージョンを変更しようとしたら手こずりました

自分の意思とは裏腹にrailsの5.0.0をインストールしてしまったのでバージョンを変更しようと試みました！

しかし...

```:command
$ rails -v
Rails 5.0.0
```

まずい,,

```:command
$ gem uninstall rails
Successfully uninstalled rails-5.0.0
```

よしきた！！railsのコマンドが見つかりません！とかなるんだろうな〜

```:command
$ rails -v
Rails 5.0.0
```

あれ？消えてない...

railtiesというrailsのコアライブラリにある5.0.0を消さなきゃいけないそうです..

```:command
$ gem uninstall railties -v '5.0.0'
Remove executables:
	rails

in addition to the gem? [Yn]  Y
Removing rails
Successfully uninstalled railties-5.0.0
```

そして..

```:command
$ rails -v
-bash: rails: コマンドが見つかりません
```

成功しました！！！
2016年のPayPalセキュリティ計画 - セキュアFTPサーバーのIPアドレスの更新

2016年のPayPalセキュリティ計画 - セキュアFTPサーバーのIPアドレスの更新の詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1912&viewlocale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
2016年のPayPalセキュリティ計画 - API証明書の認証情報のアップグレード

2016年のPayPalセキュリティ計画 - API証明書の認証情報のアップグレードの詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1915&viewlocale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
Paypal本番環境とSandbox環境のPayPalサーバーのIPアドレス

ドメイン名サービス(DNS)の結果を使用して、PayPalサーバーのIPアドレスを決定することをおすすめします。PayPalでは、レコードの変更を事前の通知なく適宜行うことがあります。

DNSを使用していない場合は、定期メンテナンス中を除いて、以下のIPアドレスの少なくとも1つが常に本稼働し、各システムのトラフィックを処理する点に注意してください。このため、アプリケーションは、稼働しているアドレスが見つかるまですべてのアドレスを順に確認する手段を備えている必要があります。

本番環境のPayPalサーバーのIPアドレスは下記URLをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&id=FAQ1056&pmv=print&impressions=false&viewlocale=ja_JP
Sandbox環境のPayPalサーバーのIPアドレスは下記URLをご参考ください：
https://www.paypal-knowledge.com/infocenter/indexpage=content&widgetview=true&id=FAQ1157


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
2016年のPayPalセキュリティ計画 - HTTPSでのIPN認証のポストバック

2016年のPayPalセキュリティ計画 - HTTPSでのIPN認証のポストバックの詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1916&viewlocale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
2016年のPayPalセキュリティ計画 - TLS 1.2およびHTTP/1.1へのアップグレード

2016年のPayPalセキュリティ計画 - TLS 1.2およびHTTP/1.1へのアップグレードの詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1914&viewlocale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
2016年のPayPalセキュリティ計画 - SSL証明書のアップグレード

2016年のPayPalセキュリティ計画- SSL証明書のアップグレードの詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1766&viewlocale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
2016年のPayPalセキュリティ計画について

2016年のPayPalセキュリティ計画の詳細については、下記日本語版のガイドをご参考ください：
https://www.paypal-knowledge.com/infocenter/index?page=content&id=FAQ1913&expand=true&locale=ja_JP


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
Ruby | strftime って何の略？

**String Format Time** の略っぽい。
本当に合ってるかどうかは分からないが、とりあえず納得した。

# 問題

メソッドの命名が謎めいていると、それ使うことさえ敬遠している自分に気づいた。
メソッドひとつを使うのにも「納得」が必要だ。と僕は感じる。

# 参考

## [ジョジョの奇妙な冒険　名セリフBEST50](http://kajipon.sakura.ne.jp/art/jojo-meigen.html)

>オレは『納得』したいだけだ！
>『納得』は全てに優先するぜッ！！
>でないとオレは『前』へ進めねぇッ！

## [関数が何の略か調べる方法 - 続き](http://progengresearch.blog.fc2.com/blog-entry-4.html)

>例えば［strftime stands for］と Google 検索しても、
>結果は何だか微妙だったりします。
>
>そういう場合は、強引にクォートでくくっちゃいましょう！
>［"strftime stands for"］で検索するのです。










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CloudWatch Logsが見づらいのでawslogsを使う

#CloudWatch Logs
EC2にCloudWatch Logs agentを入れておくと、AWSに指定したログを送ってくれてAWSのコンソールで見ることができます。しかしながら、AWSのコンソールは非常に使いづらいです。

#awslogs
そこでawslogsの出番です。
Github
https://github.com/jorgebastida/awslogs
クラスメソッドさんの記事
http://dev.classmethod.jp/cloud/aws/show-cloudwatch-logs-with-awslogs-command/

```awslogs get "GROUP名" ```

というふうにコマンドラインに打つだけでログをゲットできます。
-wオプションを使うとtail -fと同じような使い方もできます。


#支援
"awslogs"でググっても全然ヒットしないため記事を書きました。
連続音声認識っぽくなったAndroid SpeechRecognizer速報

※追記: Googleアプリは日々アップデートされているので、最新版のGoogleアプリには本問題はありません。

Androidに必ずインストールされているGoogleアプリがバージョン６に上がってから、SpeechRecognizerの挙動が大幅に変わりました。

音声認識するdurationがかなり長くなり、認識途中経過をコールバックしてくれるようになったようです。
これは半ば連続音声認識のような挙動とも言え、ボイスコマンドとしてSpeechRecognizerを使うには非常にありがたいアップデートです。

しかし現状その弊害もあり（バグの可能性もある）、長めのメッセージ入力は不便になっています。
さすがに使いづらいので改善はされると思いますが

## 連続音声認識っぽい機能
startlisteningしてからその認識終了まで、スタンダードな使い方としてはonResultで結果、onErrorでエラーを受け取って終了するか、stopListeningを呼んで終了する使い方でしたが、partialResultの受け取りがonPartialResultできるようになりました。
とはいえ、これは新しく追加されたインターフェースでもなく、昔からあります。
しかしGoogleのdocumentにも「途中経過の認識結果返せるようだったら返す」みたいなやる気のないスタンスが定義されていたので、何もonPartialResultsに返さないことが多く（というか返ってきたのを見たことがない）、DeveloperたちはpartialResultに頼るなと言っていました。

最近ではかなり積極的に返すようになったようです。

```
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.getPackageName());
//これこれ
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(context);
recognizer.setRecognitionListener(new RecognitionListener() {
    //...略

    // これこれ
    @Override
    public void onPartialResults(Bundle partialResults) {
        List<String> recData = results.getStringArrayList(android.speech.SpeechRecognizer.RESULTS_RECOGNITION);
    }

    @Override
    public void onResults(Bundle results) {
        List<String> recData = results.getStringArrayList(android.speech.SpeechRecognizer.RESULTS_RECOGNITION);
    }
});
recognizer.startListening(intent);
```

これでどういうことができるかというと、認識結果の途中経過をユーザーにフィードバックできる他、ボイスコマンドとして利用する場合はかなり認識速度が早くなります。
フローとしては下記のような感じです。

【従来】
startListening
↓
室伏さん「私の」（認識中）
↓
認識終了、onResultsで「私の」という結果を受け取る

もしくは

startListening
↓
室伏さん「私のおじさんは鉛筆です」（認識中）
↓
認識終了、onResultsで「私のおじさんは鉛筆です」という結果を受け取る


【今】
startListening
↓
室伏さん「私の」（認識中）
↓
onPartialResultsで「私の」という結果を受け取る（認識中）
↓
室伏さん「おじさんは」（認識中）
↓
onPartialResultsで「私のおじさんは」という結果を受け取る（認識中）
↓
室伏さん「鉛筆です」（認識中）
↓
onPartialResultsで「私のおじさんは鉛筆です」という結果を受け取る（認識中）
↓
認識終了、onResultsで「私のおじさんは鉛筆です」という結果を受け取る


なのでonPartialResultsで受け取るコールバックは早いし頻度も高いので、ボイスコマンドのようなキーワード抽出するパターンだと非常に有用です。


## onResultが遅くなった・・・
これは仕様だとは思えないほど遅くなってます。
「まだ認識してたの！？」と思うほどに遅く、ユーザーの立場に立つと画面が止まったと思ってしまうリスクがあります。
多分改善されるだろうと思うのですが、現状partialResultsを無理やり使うなり工夫するのがいいかと思います。

あとこれは完全にバグですが、stopListeningを呼んでもstopされずに認識し続けることがたまにあったりします。はっきり言って不安定なのでこのあたりも改善されることを期待したいところです。

## あとなんかあったっけな？

```
　 |l､{　 　j}　/,,ｨ//｜　　　　　／￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
　 i|:!ヾ､_ﾉ／ u {:}//ﾍ　　　　　|　あ…ありのまま 今　起こった事を話すぜ！
　 |ﾘ u' }　 ,ﾉ　_,!V,ﾊ |　　 　 ＜　『おれは奴の前で階段を登っていたと
　 fト､_{ﾙ{,ィ'ｅﾗ　, ﾀ人.　　　　|　　思ったらいつのまにか降りていた』
　ヾ|宀| {´,)⌒`/ |<ヽﾄiゝ　　　|　催眠術だとか超スピードだとか
```

過去記事

[Android Speech Recognizerを使いこなす](http://qiita.com/KAKKA/items/d15cb9187fd1bcca8770)
【Python】Turtleでミッキーマウスを描く【初心者】

#Turtleとは？

PythonのTurtleモジュールは亀を前進させ、角度を変えながら描画します。
なんのこっちゃと思うかもしれませんが、詳細は以下がわかりやすいです**（メソッドの紹介もされています）**。
参照URL：http://www.ic.daito.ac.jp/~mizutani/python/using_turtle.html

#開発環境
試したIDEは以下となります。
・Xcode
・Pycharm
・ターミナル
※いずれもMacです。XcodeでPythonを実行するならば[こちら](http://qiita.com/Cremokoroah/items/1fe8396de291a8c12d08)をご参考に。


#まずはTurtleを試してみる。

簡単なコードでTurtleを試してみます。

```
from turtle import *

shape()
done()
```


すると、以下のようにウィンドウが表示されました。
![スクリーンショット 2016-07-04 18.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/124071/c23cc32f-8293-2509-53b9-2a47ae78d8c3.png)


初期値では矢印が右を向いているだけで、何も描画されていません。
少し亀っぽくしてみましょう。
shape()に**'turtle'**と入力します。

```
from turtle import *

shape('turtle')
done()
```

ウィンドウに表示されている矢印が亀さんになりました。ユニークですね。
![スクリーンショット 2016-07-04 18.33.57.png](https://qiita-image-store.s3.amazonaws.com/0/124071/764bea42-636a-c960-d9d2-925a3ddaed2a.png)


ちなみに、ターミナルで実行する場合はdone()は必要ありません、XcodeやPycharmでdone()を忘れると、画面が表示されたと思いきや一瞬で消えます……。一度試してみてください。

#亀に正方形を描かせる。
では亀を動かしてみましょう。

```
from turtle import *

shape('turtle')
forward(90)
done()
```

亀が少しだけ前進しました。
![スクリーンショット 2016-07-05 10.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/124071/023f1367-a900-7057-2335-5b15fe513093.png)


亀に正方形を描かせてみます。
cordの考え方は、n距離動いたら90°左に向いてn距離動くを繰り返すです。

```
from turtle import *

shape('turtle')
for i in xrange(4):
   forward(90)
   left(90)

done()
```

![スクリーンショット 2016-07-05 10.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/124071/c997c6d2-f493-2fd0-87e6-ee4174dbe00c.png)


#ミッキーマウスを描く
Turtleモジュールがどのようなものかわかってきたと思います。
では、本題です。ミッキーマウスを描くためのソースコードを共有しますので、
みなさんの環境でも試してみてください！！


https://github.com/Cremokoroah/Turtle_MM


もっと簡単に描ける方法があるはずなので、改良していきたいと思います。
ありがとうございました。
ディープラーニングの原理、ニューラルネットワークの原理の入門の入門



以下のような人向けの記事

・ニューラルネットワークの原理の基本中の基本を知りたい
・ニューラルネットワークを専門外の方にも簡潔に説明したい

http://nnadl-ja.github.io/nnadl_site_ja/chap1.html
ニューラルネットワークと深層学習
-ニューラルネットワークを用いた手書き文字認識

上の無料のオンライン書籍から抜粋し、自分なりによりわかりやすいよう必要最低限の変更を加えたものである。

　まず、ニューラルネットワークは人間の脳を模倣したものである。人間の脳の中にはニューロンという神経細胞が千数百億個あり、各ニューロンがシナプスと呼ばれる接合部位によって繋がっている。ニューロンは入力される電気信号の閾値がある一定の量を超えると発火し、シナプスによって次のニューロンに電気信号を出力する。この動作の連続により、脳は信号の伝達を行っている。このニューロンを模倣した人工ニューロンのモデルを図に示す。

![image001.png](https://qiita-image-store.s3.amazonaws.com/0/131965/445fc715-2de0-82fe-697d-bb5a882f7510.png)


　この人工ニューロンのひとつにパーセプトロンがある。パーセプトロンは入力が閾値を超えたら、1を出力する。超えなければ0を出力する。
　この人工ニューロンがどうやって処理をするのか。以下に例を出す。


　あなたが週末のチーズ祭りに行くかどうか(1か0か)、意思決定をしたいとする。そして、あなたの判断に影響を及ぼすファクターは３つあるとする。

　①天気は良いか？
　②あなたの恋人も一緒に行きたがっているか？
　③祭りの会場は駅から近いか？(あなたは自家用車を持っていない)

　これら3つのファクターは1か0で表現することができる。例えば、天気が良いなら1、天気が悪ければ0だ。同じく、恋人が行きたがっているなら1、そうでないなら0である。③についても同様である。

　次に、ファクターの重要度を「重み」として決める。
　あなたはチーズが大好物で、駅から遠かろうが恋人がなんと言おうが、喜んでチーズ祭りに行くつもりだとする。一方あなたはなによりも雨が苦手で、天気が悪かったら絶対に行くつもりがない。人工ニューロンは、このような意思決定を表現できる。ひとつの方法は、以下のような方法だ。

　①の重み：6
　②の重み：2
　③の重み：2

　そして、閾値を5とする。以上のパラメータ設定によってあなたの意思決定モデルを実装できた。もう一度、パーセプトロンのモデルを示すと…

![image102.png](https://qiita-image-store.s3.amazonaws.com/0/131965/18f80fbc-c0ae-c1af-9a9a-aec47744910e.png)


　このモデルは、

　①×(①の重み)＋②×(②の重み)＋③×(③の重み)　＞　5 ならば、1を出力する。

　ということだ。
　このパーセプトロンは天気がよければ必ず１を出力し、天気が悪ければ必ず0を出力する。あなたの恋人の意思や、駅からの距離によって結論が変わることはない。

　重みと閾値を変化させることで、様々に異なった意思決定モデルを得ることができる。例えば、閾値を5から3に変える。すると、「祭りに行くべき」と判断する条件は「天気がよい」または「会場が駅から近く、かつあなたの恋人が一緒に行きたがっている」となる。閾値を下げたため、あなたは「より」祭りに行きたがっていることになった。

　このように、人工ニューロンは異なる種類の情報を考慮し、重みをつけたうえで判断を下す能力がある。となれば、人工ニューロンを複雑に組み合わせたネットワークなら、かなり微妙な判断も扱えそうであるとわかる。

![image003.png](https://qiita-image-store.s3.amazonaws.com/0/131965/6bddf66d-4f1f-677d-e6e5-d6247f9e04e6.png)


より複雑なニューラルネットワークの原理についてはこちら
http://qiita.com/jintaka1989/items/3b70b5c5541620536fa2
TensorFlowのチュートリアルを通して、人工知能の原理について学習する
kibana 5.0.0-alpha4 CSVのアップロードを試す

# 概要

kibana 5.0.0-alpha4では、CSVのアップロードができるようになったとのこと。
csvをlogstashや自前のスクリプトで云々せずに、さっと取り込めてさっと確認できる、というのは助かるかも、ということで試してみた。

- [Kibana 5.0.0-alpha4 released / Import data from a CSV](https://www.elastic.co/jp/blog/kibana-5-0-0-alpha4)

# 試した環境

|app|version|remarks|
|:--|------:|-------:|
|elasticsearch|5.0.0-alpha4|dockerで動かす|
|kibana|5.0.0-alpha4|dockerで動かす|

dockerですぐに試せるのは良い時代になったものです。

テスト用にkibana向きではないけども、適当なCSVを以下から拾ってきた。以下、ひったくりデータを使う。

- [大阪市の犯罪発生情報](http://www.city.osaka.lg.jp/shimin/page/0000298810.html)

# CSVアップロードを試す

## IndexをCSVから作成する

Managementから　「Upload CSV」を選択する。アップロードできるファイルは1GBまで、と。

![Kibana_001.png](https://qiita-image-store.s3.amazonaws.com/0/111676/bbcc333d-5bf3-43bb-267d-61613fb2e154.png)


## ファイルアップロードする

アップロードすると、プレビュー画面が開きます。

プレビューは20列までしかされないので、20列を超えるCSVを取り込んだときは、警告がでますが、プレビューの制限であって取り込みの制限ではないので安心して、Nextを押せばいいと思います。

![Kibana_002.png](https://qiita-image-store.s3.amazonaws.com/0/111676/41cc3c9f-f16d-b4a1-29e4-b2b3f81ea712.png)

### 注意点

> FieldMismatch at line 9 - Too few fields: expected 28 fields but parsed 1

というエラーが出るとき。CSVの最終が改行コードだけの行で終わらないようにすると、エラーが消えました。


Excel使いが好むShift-JISのCSVファイルは、文字化けしてプレビューの時点でエラーになります。UTF-8にしましょう。

![Kibana_004.png](https://qiita-image-store.s3.amazonaws.com/0/111676/29f09859-dc2f-dce2-475d-d7edbc133aff.png)


## Step2 Review

この画面では、インデックス名、時系列データなのかどうか（time basedのチェックボックス）、時系列データの場合は、そのフィールドを指定したり、CSVから取り込んだフィールドの定義を行います。


![Kibana_005.png](https://qiita-image-store.s3.amazonaws.com/0/111676/da1b79f8-ee41-bdce-950c-da6ef8c4b0f0.png)


Typeでは、以下のものが選択できるようです。elasticsearch5からは、stringはtextやkeywordになっていると思うのですが、画面上はstringになっています。

|Type|
|--:|
|string|
|number|
|boolean|
|date|
|geo_point|
|ip|

![Kibana_006.png](https://qiita-image-store.s3.amazonaws.com/0/111676/3f21207f-c098-04e1-8bc6-073f323eba3f.png)

フィールドの定義を終えたら、次に進みます。

もし、既にあるインデックス名を指定すると、こんなエラーが出ます。CSV１ファイルで、１インデックスという認識なのかもしれません。

> Add Data: Error 409 Conflict: Cannot create an index pattern via this API if existing indices already match the pattern

## Step3 Upload

問題なく取り込めたら、こんな画面になりました。

![Kibana_007.png](https://qiita-image-store.s3.amazonaws.com/0/111676/dcc6d8cf-2e18-980d-e08c-ee436ead5bfa.png)

取り込み時にエラーがでるパターンとしては、こんな感じでしょうか。

- dateと指定しているのに、dateと解析される文字列ではなかった場合

Doneを押してアップロードを終了します。

## Discover画面

Doneを押したら、Discover画面に遷移します。さっき取り込んだものが表示されています。

![Kibana_008.png](https://qiita-image-store.s3.amazonaws.com/0/111676/7b97cc55-fe9b-3cc4-bd6b-9b39aaecd411.png)


## マッピングの確認

こうして取り込まれたフィールドがどんな定義になっているかをConsoleから確認

内部的には、textとkeywordと両方持つようになってました。

> GET インデックス名/_mapping

```json
{
  "hoge": {
    "mappings": {
      "_default_": {
        "properties": {
          "ひったくり区分": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "丁番": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
```


# 感想

- 事前にテンプレートを用意しておいたほうよさそうな感じ。
MacのLDAPクライアント設定

## Brew install

```
brew install openldap
```

## ldap.confのバックアップ

```
cd /etc/openldap
cp ldap.conf ldap.conf_backup
```

## LDAPサーバーのSSL Certificate取得

```
openssl s_client -connect SERVER_IP:PORT
```

*BEGIN CERTIFICATE*から*END CERTIFICATE*までコピー

```
pbpaste > ~/Desktop/mycert
sudo mv ~/Desktop/mycert /etc/openldap/
```

## ldap.confにSSL証明書追加

```
sudo vim ldap.conf
```
下記の値を最後の行に追加

```
TLS_CACERT /etc/openldap/mycert
```

私の場合、下記の値をAllowに変更

```
TLS_REQCERT	allow
```

##再起動

そして、ldapsearchなど問題なく使えるようになった。
AWSでWindowsのAMIを作る場合、スナップショットからやるとハマる

これまで何度か Windows インスタンスを作っては壊しを繰り返してきたが、その中で時々ライセンス認証が通らなくなるという謎の現象に悩まされてきていた。このたび、ようやく再現手順を特定してサポートに問合せることができ、やっと疑問が氷解した。

今回の原因は、以下のところに書いてあるとのこと。

[スナップショットからの Linux AMI の作成](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#creating-launching-ami-from-snapshot)

> インスタンスのルートデバイスボリュームのスナップショットがある場合、AWS マネジメントコンソールまたはコマンドラインを使用して、そのスナップショットから AMI を作成できます。

>Important
>Red Hat Enterprise Linux (RHEL) や SUSE Linux Enterprise Server (SLES) などの一部の Linux ディストリビューションは、AMI に関連付けられた Amazon EC2 の billingProduct コードを使用して、パッケージの更新に関するサブスクリプションのステータスを確認します。EBS スナップショットから AMI を作成すると、この請求コードが保持されないため、このような AMI から起動したそれ以降のインスタンスはパッケージ更新インフラストラクチャに接続できません。
同様に、スナップショットから Windows AMI を作成することはできますが、AMI からインスタンスを正常に起動することができません。
一般的には、AWS はスナップショットから手動で AMI を作成することをお勧めします。
Windows AMI の作成、または正常に機能する AMI 請求コードを保持する必要がある Linux オペレーティングシステム用の AMI の作成についての詳細は、「[インスタンスからの Linux AMI の作成](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#how-to-create-ebs-ami)」を参照してください。

「一般的には、AWS はスナップショットから手動で AMI を作成することをお勧めします。」とのところがちょっと文脈的にどうかと思うが、原文でもこうなっていた。ここは記述の順序をもう少し考えてほしいところ。

要は、「一般的な手順としては、AMI はスナップショットから作成するのが AWS としてのオススメ。ただし、Windows のように個別にライセンス認証が必要な OS については、スナップショットを経由すると請求コードの情報が失われるので、そこから派生したインスタンスではライセンス認証が通らなくなる。なので、インスタンスから直接『イメージの作成』で AMI を作成してね。」ということらしい。

Windows だけでなく、有償の Linux ディストロでも同じようになるらしいです。皆さん気をつけてください。
Railsの開発環境ですべてのログを出力して、時刻も出す

## 対応方法 
environments/development.rbに設定を追加

```ruby
 config.log_level = :debug
 config.log_formatter = Logger::Formatter.new
```

## 説明
#### ログレベルは以下の順で決まってる、一番低いレベルのdebugに設定すれば、すべてのログが出力される
```
fatal  # プログラムがクラッシュしたなどエラーハンドリングできないエラー
error  # エラーハンドリングできるエラー
warn   # 警告
info   # システム操作に対する一般的な役に立つ情報
debug  # 開発者向けの詳細な情報 
```

#### 開発環境でproduction環境と同じように時刻出すにはlog_formatterを設定すれば良い

```ruby
 config.log_formatter = Logger::Formatter.new
```
Chromeで拡張機能のアイコンが邪魔だけどたまに使うから非表示にできないときの小技

月に一回使うかどうか分からないような使用頻度低めの拡張機能を無効にせず綺麗にまとめておく

## 方法1(Windowsのみ)

ツールバー内の拡張機能のアイコンをドラッグしてChromeのメニューアイコンへ持っていき、
一番上の空白の部分へドロップしてやるとメニュー内にアイコン置き場が作られる

![SS.jpg](https://qiita-image-store.s3.amazonaws.com/0/72374/d7bf97de-fe47-15ac-1c2f-720ead059e5c.jpeg)


## 方法2(Windosws・Mac共通)

ツールバー内の拡張機能のアイコンを右クリック、「Chromeメニューで非表示」を選択するとメニュー内に格納される

![スクリーンショット 2017-02-14 10.16.16.png](https://qiita-image-store.s3.amazonaws.com/0/72374/5db8f888-063c-eb41-a17b-2117314d9dd5.png)

![スクリーンショット 2017-02-14 10.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/72374/a103ec1f-06f5-76b0-3da9-23cf288d672e.png)

@KanaSakaguchiさん情報提供ありがとうございました

## 確認済動作環境

**Windows**
バージョン 56.0.2924.87
**Mac**
56.0.2924.87 (64-bit)


これでスッキリ :dancers:
GitHub Desktop のインストール

# ダウンロード

* [公式のダウンロードページ](https://desktop.github.com/) からダウンロードしてください


# インストール

* ダウンロードしたインストーラーを起動し、インストールを開始してください
* インストールが完了したら初期設定のウィザードが出てくるので設定を行います


# GitHub アカウントの入力

* GitHub のアカウント情報を入力してください
* 入力すると GitHub とのひも付けが自動で行われます

![setup-log-in.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/b36d9ad6-631b-23b4-ac12-1778a52ec130.jpeg)


# Git のグローバル設定の入力

* Git 全体で利用するメールアドレスと名前の設定を行います
* GitHub にコミットした際に使用され、そのコミットがどのアカウントが行ったかの判定(Web画面での表示用)するために利用します

![setup-configure.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/24cf282c-df3f-6156-03d9-5dfa3104ab2b.jpeg)


# 既存のレポジトリの検索

* ソフトがローカルにある Git レポジトリを自動的に探してくれます
* GitHub Desktop で管理する場合は選択して追加してください
* 追加したくない場合は Skip 出来ます

![setup-local-repositories.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/df5a1632-7574-e536-368b-6e10cd7df42a.jpeg)


# 完了

* GitHub への キーの追加も自動でしてくれているので、そのまま使いはじめることが出来ます
angular2でページ読み込み後に処理を実行する方法

#困ったこと
Angular2で「全ての要素が読み込まれた後に特定の処理を行いたい」と思ったものの、要素が見つからない

具体的には
**id="video"の動画が再生終了したタイミングを検知して、動画の内容を入れ替えたい。しかし、要素が見つからないというエラーが出る。**
という状態でハマったので解決策をメモしておきます。
（調べつつ最初に見つけた解決策ですので、他に良い方法があるかもしれません）

#原因
javascriptではありがちなのですが、要素が読み込まれていない状態（DOMの構築待ち）でスクリプトを実行してしまっているのが原因みたいです。

#解決策
[公式ドキュメント](https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#hook-sequence)を見ると**AfterViewInit**というフックがあるようです。


[stackoverflow](http://stackoverflow.com/questions/34547127/angular2-equivalent-of-document-ready)では下記のように
1.importに追記
2.implementsに追記
3.Class内にngAfterViewInit()として処理を追記
と書かれています。

```
import {Component, AfterViewInit} from 'angular2/core';

@Component({
  selector: 'home',
  templateUrl: './components/home/home.html'
})
export class HomeCmp implements AfterViewInit {


    ngAfterViewInit() {
       //Copy in all the js code from the script.js. Typescript will complain but it works just fine
    }
```

##おまけ
今回やりたかった「id=videoの動画が再生終了したことを検知する処理」はこれです。

```
  ngAfterViewInit() {
    var mVideo = <HTMLVideoElement> document.getElementById('video');
    mVideo.addEventListener("ended", function(){
      console.log("動画が終了しました"); //ここに要素入れ替えのスクリプトを書く
    }, true);
  }
```
Windows PC に Kotlin をインストールする

# 概要
今日(2016/07/05(Tue))、 [Kotlin の勉強会](http://connpass.com/event/33584/)があるので、自分の PC で Kotlin を動かせるように準備をしておきます。

## 環境
| Java SE | 1.8.0_91
|:---|:---
| OS | Windows 10

---

# インストール
Android Studio も IntelliJ も入っていない PC なので、Kotlin のコンパイラを入れることにします。

## ダウンロード
Kotlin のコンパイラは GitHub Repository の [Latest Release](https://github.com/JetBrains/kotlin/releases/latest) から zip をダウンロードして自分でインストールするようです。この記事を書いている時点では 1.0.3 が最新でした。サイズは約21.2MBでした。

## 配置
ダウンロードした kotlin-compiler-<version>.zip を伸長し、生成された kotlinc を適切なフォルダに移動します。伸長後のサイズは約23.7MBでした。

## Path を通す
移動した kotlinc の bin フォルダに Path を通します。例えば、kotlinc を ```C:\Program Files```に移動した場合は ```C:\Program Files\kotlinc\bin``` を環境変数 Path に追加します。

---
# 確認
コンソールを立ち上げ、kotlin -version を実行します。

```:インストール確認
$ kotlin -version
Kotlin version 1.0.3 (JRE 1.8.0_91-b14)
```

おめでとう、Kotlin は正常にインストールされました。

```
$ kotlin -e "println 'hello,'"
error: evaluating expressions is not yet supported
```

お、残念ですね……

---

# 簡単なクラスでの動作確認
Hello.kt を作ります。

```kotlin:Hello.kt
fun main(args: Array<String>) {
    println("Hello world.")
}
```

そして ```kotlinc``` コマンドでコンパイルします。

```:コンパイル
$ kotlinc Hello.kt
```

何もなければ何も出ないで終わります。そして、上記の場合だと HelloKt.class というクラスファイルが生成されています。

```
$ ls -l Hello*
-rw-r--r-- 1 Toast kid 197121  65 Jul  5 09:29 Hello.kt
-rw-r--r-- 1 Toast kid 197121 952 Jul  5 09:31 HelloKt.class
```

これを kotlin コマンドで実行してみます。

```:実行結果
$ kotlin HelloKt
Hello world.
```

## FizzBuzz
以前書いた FizzBuzz もちゃんと動きます。

```kotlin:FizzBuzz.kt
fun main(args: Array<String>) {
    (1..100).forEach{print("${fb(it)},");}
}

fun fb(i: Int): String {
    when {
        i % 15 == 0 -> return "fizzbuzz";
        i % 5  == 0 -> return "buzz";
        i % 3  == 0 -> return "fizz";
        else        -> return "$i";
    }
}
```

```:コンパイル
$ kotlinc FizzBuzz.kt
```

```:実行結果
$ kotlin FizzBuzzKt
1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz,fizz,22,23,fizz,buzz,26,fizz,28,29,fizzbuzz,31,32,fizz,34,buzz,fizz,37,38,fizz,buzz,41,fizz,43,44,fizzbuzz,46,47,fizz,49,buzz,fizz,52,53,fizz,buzz,56,fizz,58,59,fizzbuzz,61,62,fizz,64,buzz,fizz,67,68,fizz,buzz,71,fizz,73,74,fizzbuzz,76,77,fizz,79,buzz,fizz,82,83,fizz,buzz,86,fizz,88,89,fizzbuzz,91,92,fizz,94,buzz,fizz,97,98,fizz,buzz,
```
指のストレス減らしませんか？　固定キーのススメ


## 固定キーとは？
修飾キー (一般的に Shift、Alt、Control、Meta) が別のキーを入力またはマウスボタンをクリックする間有効な状態に維持する機能[1]．MacやWindowsなどに標準搭載されている．
スティッキーキー（StickyKeys）とも言う．

### 機能
一回押した修飾キーは次のキーに反映される．

```text:Testの入力（固定キー無効時）
[Shift]+T, est
```
```text:Testの入力（固定キー有効時）
[Shift], test
```

2回押した修飾キーはもう一度その修飾キーが押されるまで固定される．

```text:TESTの入力（固定キー有効時）
[Shift], [Shift], test, [Shift]
```
## なんで固定キー？

### ホームポジションが維持される
修飾キー（例えばShiftキー）を押しながら入力する時，指がホームポジションからずれてしまうため，標準運指が使えなくなる．
固定キーを利用すると，修飾キーを押し続ける必要がなくなり，ホームポジションを維持できるため，記号や大文字であっても標準運指で入力することが出来る．
複数の修飾キーを同時押しする場合（ctrl+shift+N）にも有効．

![標準運指](http://taipingu.net/img/unshi.gif)
標準運指（参考[2]より引用）．

## 使い方
```text:UpperCamelCaseの入力
[Shift], upper, [Shift], camel, [Shift], case
```
単語の始まりに[Shift]キーを入力すれば良い．

```text:"SNAKE_CASE"の入力
[Shift], [Shift]（キーの固定）, snake-case, [Shift]（固定解除）
```
大文字を入力する前にキーを固定し，入力が終わったら固定解除すれば良い．
⇒CapsLockキーが必要なくなる．

```text:"!@#$%^&*()"の入力
[Shift], [Shift]（キーの固定）, 1234567890, [Shift]（固定解除）
```
※USキー配列の場合


モードを切り替えて入力するVimみたいな使い方が出来ると考えればいいかもしれないです．
スマホの入力も固定キーの場合があるので実は慣れ親しんだ入力方法であったりするわけです．
日本語で検索してもあまりヒットしないので今回投稿させていただきました．
無茶に修飾キーを押して指に負担をかけていると思った場合や，気づいたら手の位置がホームポジションからずれている，と思った場合に利用してみると改善されるかもしれません．

海外では一部で使われているようです（参考[4]）．

多くのOSで固定キー用意されているのがいい点と感じているのですが，Windowsではたまに固定キーが解除されない場合があり，結局OSを選んでしまうのかもしれません．

## 参考

[1] [スティッキーキー (StickyKeys) (OpenWindows ユーザーズガイド)](https://docs.oracle.com/cd/E19455-01/806-2860/accessxapp-20730/index.html)
[2] [標準運指（基本打ち）｜タイピング練習所](http://taipingu.net/kotu02.html)
[3] [命名規則 (プログラミング) - Wikipedia] (https://ja.wikipedia.org/wiki/%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)#.E5.A4.A7.E6.96.87.E5.AD.97.2F.E5.B0.8F.E6.96.87.E5.AD.97.E3.81.A8.E6.95.B0.E5.AD.97)
[4] [[TIP] How “sticky keys” can make key combinations easier to press | 9to5Apple](http://www.9to5apple.info/?p=766)
NVectorはVectorの80倍速い


rubyにはベクトルを扱うための、Vectorクラスがあります。Vectorクラスはrubyで実装されているので、正直遅いです。そこで、拡張配列クラス[NArray](https://github.com/masa16/narray)に含まれるNVectorを使ってみました。NArrayはCで実行されるので、すごく早いはずです。

https://masa16.github.io/narray/index.ja.html

# 速度比較：ベクトルの内積を求める

"1" もしくは "0"からなる要素数5000000のベクトルを2つ生成し、二つのベクトルの内積を求めるまでの時間を計測します。

## Vectorクラスの場合

```rb
# coding: utf-8

require 'matrix'

arrayA = []
arrayB = []

5000000.times do |n|
  arrayA << rand(2)
  arrayB << rand(2)
end

vectorA = Vector.elements(arrayA)
vectorB = Vector.elements(arrayB)

t = Time.now

p vectorA.inner_product(vectorB)

p Time.now - t
```

### 結果： 0.86 秒(862 ms)

## NVectorの場合

```rb
# coding: utf-8

require "narray"

vectorA = NVector.int(5000000)
vectorB = NVector.int(5000000)

5000000.times do |n|
  vectorA[n] = rand(2)
  vectorB[n] = rand(2)
end

t = Time.now

p vectorA * vectorB

p Time.now - t
```

### 結果： 0.011 秒(10.6 ms)


処理の内容次第だとは思いますが、今回は約80倍の速度差が出ました(当然ですが・・・)。
さくらのVPSにUbuntu16.04を入れて初期設定するまでのメモ


## インストール
[さくらのサポート情報](https://help.sakura.ad.jp/app/answers/detail/a_id/2581/~/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0os%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89---ubuntu-16.04)を読んでセットアップ。

`-bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)`というエラーが出る場合は、` sudo apt-get -y install language-pack-ja`でランゲッジパックを入れる。


## パッケージのアップデートなど　　


```
# パッケージを更新
$ sudo apt-get update && upgrade
# vimをインストール
$ sudo apt-get install vim
#.bashrc、.bash_profileを設定
$ vim ~/.bashrc
$ vim ~/.bash_profile
# gitをインストール
$ sudo apt-get install git
# 自分のGithubリポジトリからDotfilesをインストール
$ git clone xxxxx
```

Dotfilesの`.vimrc`, `.vim`にシンボリックリンクを張る   

```
ln -s ~/Dotfiles/.vimrc ~/.vimrc
ln -s ~/Dotfiles/.vim ~/.vim
```

ホスト名を変更
`/etc/hostname`の名前を変更。
`/etc/hosts`の名前を変更

### Githubへ接続するためのssh設定
```
# .sshディレクトリを作成
$ mkdir ~/.ssh
# 公開鍵、秘密鍵を作成。
$ ssh-keygen -t rsa
# id_rsa.pubの中身をコピー
$ cat id_rsa.pub
```
githubに公開鍵(id_rsa.pub)を登録

## 自分のPCからサーバーへ接続するためのssh設定

自分のPCの~/.ssh配下へconfigファイルをつくる

```~/.ssh/config
Host xxxxx
	HostName xxx.xxx.xxx.xxx
	Port xxx
	User xxxxx
```
pcのid_rsa.pubをサーバーに送る
`scp -P 22 ~/.ssh/id_rsa.pub xxx@xxx.xxx.xxx.xxx:/home/username`
serverのauthorizedkeysに登録
`cat ~/id_rsa.pub >> ~/.ssh/authorizedkeys`



## ファイヤーウォール設定
```
#現状確認
$ sudo ufw status
Status: inactive

#デフォルトで全てのポートを無効にする
$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

#ファイアウォールを有効化
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

# 許可するポートを指定
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow xxxxx #sshのデフォルトポート

#反映
$ sudo ufw reload
```



## 参考サイト
[CUBE SUGER STORAGE](http://momijiame.tumblr.com/post/70901914418/ubuntu-%E3%81%A7-cannot-change-locale-%E3%81%A3%E3%81%A6%E6%80%92%E3%82%89%E3%82%8C%E3%82%8B%E3%82%A2%E3%83%AC)
[Ubuntu14.04でホスト名を変更する](http://qiita.com/mogulla3/items/17b323f48846fa3f6dac)
[Ubuntu LTS 14.02をさくらVPSで立てたメモ](http://qiita.com/shinyatto/items/3c581f4d9d9fbabd4669)
leanback-v17-24.0.0 の変更点 (AndroidTV)


# leanback とは
* Android Support Library の1つ
* AndroidTV 向けアプリを作る際に Google のガイドラインに則した標準的な UI/UX を実現する

# 課題
* 拡張性が低くUIのカスタマイズが困難
* 例 BrowseFragment
  * 左カラムの1行が右カラムの1行に対応している
![screen_tv_sample01s.png](https://qiita-image-store.s3.amazonaws.com/0/112602/c24306ed-37a9-c199-0ee9-2fbec9abee2a.png)
<br>
![screen_tv_sample02s.png](https://qiita-image-store.s3.amazonaws.com/0/112602/295b813a-9c7b-0938-4eb5-4260f535a795.png)
<br>
* 一方で Youtube のように、左カラムの各行に対して右カラム全体を切り替える仕組みは BrowseFragment では実現出来ず、BrowseFragment 内部で使っている HeadersFragment, RowsFragment などを組み合わせ自分で BrowseFragment のようなものを作る必要があった 
![screen_tv_youtube01s.png](https://qiita-image-store.s3.amazonaws.com/0/112602/453ac460-44a0-34b0-e03b-dcf8a7bb190e.png)
<br>
![screen_tv_youtube02s.png](https://qiita-image-store.s3.amazonaws.com/0/112602/63f50455-ae4d-8577-62f8-880855c882a3.png)

# 24.0.0 での変更点
* GoogleI/O 2016 での AndroidTV のセッションで 24.0.0-beta の機能が紹介された (現在はbetaは取れている)
  * [An in-depth look at the Leanback Library - Google I/O 2016](https://www.youtube.com/watch?v=QFHIfQy8_Wc)
  * この中で今回例に挙げた BrowseFragment 右カラムの表現拡張についての言及があった 
    * 個人的には exciting だったのだがキーノートなどに比べ視聴数が余りに少ないのはお察し…
  * こちらで紹介されたサンプルコード
    * https://github.com/googlesamples/leanback-showcase
* 従来右カラムには1行を表現する ListRow を与える事を要求されていたが、PageRow という新しいコンポーネントを与えられる
* この仕組みを用いることで、左カラムの各行に対して右カラムを個別の Fragment で置換していくことが可能に
![screen_tv_showcase01dev.png](https://qiita-image-store.s3.amazonaws.com/0/112602/bd9722ad-7365-fb35-70ae-1d2dda187fe4.png)
<br>
![screen_tv_showcase02dev.png](https://qiita-image-store.s3.amazonaws.com/0/112602/dae76105-1dd4-1657-aba6-b0a38e85a1bd.png)

# 実装例と個別の掘り下げ
* 次回に続く
[Rescale Hands-on] OpenFOAMをRescale上で動かしてみよう！





OpenFOAM のサンプルモデル を Rescale で動かしてみましょう。
今回は、[本家のTutorial](https://support.rescale.com/customer/en/portal/articles/2254457-aerodynamics)をベースにして記事を書いています。


![モデル図](https://prod-rescale-resources.s3.amazonaws.com/en/advanced-tutorials/aero/airfoil2d.jpg)


はじめに
==========

　Rescaleとは SaaS タイプの Cloud HPC であり、いわゆるパブリッククラウドスパコンです。後ろで動いているシステムはAWS, Azure, 米国のスパコンなどであり、Webテクノロジーによってデータセンターが抽象化され同時にマルチクラウドを実現しています。

　ユーザはマシンを意識せず、自然と最適なシステムが使われるように設計されています。例えば、Deep Learning の フレームワークである Chainer を選択すると、自然とGPUインスタンスが選択候補として出てきます。

　AWSを始めとするパブリッククラウドは開発者のためのクラウドですが、Rescaleは製造業の設計者向けのクラウドを目指しています。アプリケーションもすでに120以上インストールされています。設計者はシミュレーションによる設計活動に集中できるよう配慮されています。

　はやりの Deep learning のフレームワークもインストールされており、NVIDIA の CUDAのインストールでユーザがハマることはもうありません。

事前準備
==============

まずは [Rescale](http://www.rescale.com) にアクセスして、アカウントを作成してください。

- http://www.rescale.com

2000円分のクーポンが始めからついており、Rescale をテストできます。



ハンズオン概要
==============

[Hands-on #1] ジョブの投入
--------------------------

### 基本的なジョブ投入方法を学ぶ

このハンズオンでは基本的なジョブ投入方法とジョブの共有・クローン方法を学びます。
http://qiita.com/daikumatan/private/48c5807a2ac909be848c



### 実験計画法で複数ジョブを投入する方法を学ぶ

このハンズオンでは、パラメータをスイープ方法し複数のジョブを投入する方法について学びます。またポスト処理として、各ジョブの計算結果からの値を抽出し可視化する方法について学びます。
http://qiita.com/daikumatan/private/8f6a3eabc15d4412f16f




[Hands-on #2] VDI環境の利用
-----------------------------------

このハンズオンではVDI環境の立ち上げ方とアプリケーションおよびデータのアタッチ方法
を学びます。
http://qiita.com/daikumatan/private/086b139d4f60467c7487



[Hands-on #3] プラットフォームの管理
-----------------------------------

現在コンテンツを作成中です。

- アプリケーションのフィルタリング
- インスタンスのフィルタリング
- バジェットの設定
- プロジェクトの設定
英単語のスペルチェックツール(python製)

自分が書いたパッチ(C言語)内のコメントに英語のtypoが多いのがずっと問題だったので、patch/diffを入力にしてそのコメント中にある英単語のスペルチェックをするようなツールを作ったのでそれのメモ。
CとかC++の`/* ・・・ */`形式のコメントなら対応可能。

ソースはgithubで公開していてリポジトリは[ここ](https://github.com/MasahikoSawada/Patch-Spell-Checker)。

# 使い方
* githubからリポジトリをclone

```bash
$ git clone git@github.com:MasahikoSawada/Patch-Spell-Checker.git
```

* 最低限の設定

```bash
$ export PATH=$PATH:/path/to/Patch-Spell-Checker/PatchSpellChecker.py
$ export WLIST_DIR=/path/to/Patch-Spell-Checker/wlist.d/
```

`WLIST_DIR`環境変数に入れたくない場合は、実行時に毎回`-d`で指定する。

* スペルチェック実行例(パッチに対して実行)

```bash
 $ git diff | PatctSpellChecker.py
"xl_heap_lock" might be wrong at line 13.
        "+               * needed before releasing buffer. we can reuse xl_heap_lock "
"pupose" might be wrong at line 14.
        "+               * for this pupose. it should be fine even if we crash midway "
"combocids" might be wrong at line 45.
        "+                       * for logical decoding we need combocids to properly decode the "
```

※"pupose"は"purpose"のtypo。"xl_heap_lock"や"combocids"は未定義の単語(詳細は後述)

* スペルチェック実行例(すでにあるソースファイルに対して実行)

```bash:-s(--source-file)オプションをつける
$ PatctSpellChecker.py -f src/backend/postmaster/postmaster.c -s
"subprocess" might be wrong at line 11.
        " *       operations, mind you --- it just forks off a subprocess to do them "
"lock-manager" might be wrong at line 18.
        " *       and so it cannot participate in lock-manager operations.  keeping "
```

※"subprocess"や"lock-manager"は未定義の単語(詳細は後述)

# 辞書ファイル(Dictionary File)
環境変数`WLIST_DIR`にある`*.dict`ファイルに単語が書くことで新しい単語を登録することが可能。専門用語等を登録することでスペルチェックの精度を上げることができる。
(ネット上にフリーの単語リストはあるので、ライセンスに気をつけて自分で登録する。)
辞書ファイルで受け付けられるフォーマットは以下の通り。

- 文書形式(フリーの英語文書をそのまま張ることができる)

```bash:文書形式
$ cat sentence.txt
PostgreSQL is a powerful open source object-relational database system.
It is fully ACID compliant, has full support for foreign keys, joins, views, triggers, and stored procedures.
```

- 単語形式(独自の専門用語を定義するときに便利)

```bash:単語形式
$ cat words.txt
PostgreSQL
is
a
ACID
database
system
```

既存ソースから単語を抽出したい場合は、`-s -w`オプションを使う。`sort`と`uniq`と組み合わせれば、そのまま単語データができる。

```bash
$ PatchSpellChecker.py -f src/backend/postmaster/postmaster.c -s -w | sort | uniq
activity_buffer
addr
am_syslogger
antivirus
archiver
archive_recovery
```
Ubuntu16.04でmysql4.0.30ビルド

* https://github.com/tukiyo/mysql4.0php5.2/

## 参考

* [CentOS6でmysql4.0.30ビルド - Qiita](http://qiita.com/tukiyo3/items/6f5ff12f58a229f7c1c2)
* [CheckInstall](https://help.ubuntu.com/community/CheckInstall)

## 手順

```bash:
sudo -s
apt-get install -y libncurses5-dev checkinstall
tar xzf mysql-4.0.30.tar.gz && cd mysql-4.0.30

# eucjpとsjisを有効化
./configure \
  --prefix=/opt/mysql \
  --with-charset=ujis \
  --with-extra-charsets=sjis
# mysqlclientだけでよいなら --without-server

make -s
make install
checkinstall -y -D --pkgname=opt-mysql4
```

* ./mysql_4.0.30-1_amd64.deb が生成される。

## インストール、アンインストール

```bash:インストール
dpkg -i mysql_4.0.30-1_amd64.deb
```

```bash:アンインストール
rmdir /opt/mysql/var/
dpkg --purge mysql
```

## インストール続き

```
sudo -s
adduser --system --group mysql

mkdir -p \
 /opt/mysql/var/ \
 /var/lib/mysql/db2/ibdata/ \
 /var/lib/mysql/logs/db2/ibdata/ \
 /var/run/mysqld/

chown -R mysql:mysql \
 /opt/mysql/var/ \
 /var/lib/mysql/ \
 /var/run/mysqld/
```

```bash:/etc/my.cnf
[client]
user	 = root
#password = xxxxxxxx
port     = 3306
socket   = /var/run/mysqld/mysqld.sock2

[mysqld]
user     = mysql
#bind-address = 192.168.xx.xx
port     = 3306
datadir  = /opt/mysql/var/
socket   = /var/run/mysqld/mysqld.sock2
# 200MB
max_binlog_size = 200000000
log-bin         = /var/lib/mysql/logs/db2/db2-bin
log-bin-index   = /var/lib/mysql/logs/db2/db2-bin.index

default-character-set=sjis

log=/tmp/query.log
log-long-format
```

## 起動、停止

```bash:初回起動
/opt/mysql/bin/mysqld_safe \
  --defaults-file="/etc/my.cnf" \
  --datadir=/var/lib/mysql/db2/ \
  --user=mysql

/opt/mysql/bin/mysql_install_db \
  --datadir=/var/lib/mysql/db2/ \
  --user=mysql
```

```bash:停止
/opt/mysql/bin/mysqladmin \
  -S /var/run/mysqld/mysqld.sock2 shutdown -uroot
```

* my.cnfの`[client]`で`default-character-set`を記述しているとmysqladminコマンドが実行できないので注意。

```bash:以後の起動方法
/opt/mysql/bin/mysqld_safe \
  --defaults-file="/etc/my.cnf" \
  --datadir=/var/lib/mysql/db2/ \
  --user=mysql
```

## 操作

```bash:文字コード指定して接続
/opt/mysql/bin/mysql -uroot --default-character-set=sjis test
```

```bash:dumpの取り込み手順とか
$ /opt/mysql/bin/mysql 
mysql> create database database1;

$ /opt/mysql/bin/mysql -uroot --default-character-set=sjis database1 < database1.dump
```
技術英語 > may be worse for your health [than previously thought] / Better late than never. / Better never late.

@ LOE > June 13, 2003
> http://loe.org/shows/shows.html?programID=03-P13-00024
may be worse for your health <font color=red>than previously thought</font>

<hr>
関連して思い出したのは

> Better late than never.

さらに思い出したのは

> Better never late.

thanしかかぶっていない。
gccでバイナリのマップファイルを生成する

>gcc -Wl,-Map=hoge.map -g -o hoge.out hoge.c

こんな風に使う
>$cat hoge.map | grep main
                0x00000000004003a8                __libc_start_main@@GLIBC_2.2.5
                0x0000000000400478                main
maven いろいろ

# 依存を含んだ jar 生成

pom の build に以下を記載

```xml:pom.xml

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
```

# プロファイルの使用

pom に以下を記載

```xml:pom.xml

    <profiles>
        <profile>
            <id>Local</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>STG</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>
    </profiles>
・
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
```

# プロパティ外だし　確認未

pom に以下を記載

```xml:pom.xml


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                          <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                          <Class-Path>./</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
```
レンタルサーバーロリポップでMeCabを使って形態素解析をする

#無理

結論から言うとできないので諦めてください。それが言いたかった。
(Google先生が「できない」って断言してくれなくて時間を無駄にしたww)

#代替案

## Igo-PHPを使う

Igo-PHPは、PHPで動く形態素解析プログラムなので、ロリポップのようなレンタルサーバーでも、PHPが動けば走ります。

IgoがもともとJavaで作られたものなので、最初に辞書データをつくる時だけJavaを使いますが、Windowsでもできるので大丈夫！ Javaはたいていインストール済だし。強いて言えば、tar.gz ファイルを展開するのがちょっとめんどくさいくらい。

## 参考サイト

[PHPで形態素解析とMySQLで全文検索](https://ptsv.org/2013/03/20/php%E3%81%A7%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%81%A8mysql%E3%81%A7%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2/)
詳しくはこちらのサイトに。
というより全く同じ目的のコンテンツです！
ありがとうございました!!

#できない理由（解決の糸口）

「できない理由を言うな！」と上司には怒られますが、下記の壁を突破できれば解決できると思います。著者はLinux初心者で大したことはしていませんし、どうか力ある先輩諸氏のお力を貸していただきたく……。

##gccがない

MeCabはコンパイル済のパッケージで配布されていないのでサーバーでコンパイルする必要があるのですが、lolipop にはgccが入っていません。

##インストールができない

もちろん、gccの追加インストールは出来ません。

##共有モジュールのリンクができない

ならばと、同じ環境の別サーバーでコンパイルしたファイルをアップロードしてみましたが、外部モジュール（libmecab.so ...など一連のファイル郡） を発見できず。ldconfig はインストールされてなくてパス設定を変更する権限はないし、デフォルトの /usr/lib にアクセスする権限もありません。
VagrantのVMに複数のディスクを追加する方法

Vagrantには[vagrant-persistent-storage](https://github.com/kusnier/vagrant-persistent-storage)という便利なプラグインがありますが、複数のディスク追加はまだサポートしてないようです。そんなことをしたい人はなかなかいないと思うのですが、ごく稀に、例えばCephやLustreを手元でテストしたい場合にはメタデータ用とオブジェクト用に複数のディスクが必要になります。

ということで似たような目的がある方は下記のVagrantfileをご参考にどうぞ。

## Vagrantfile

このVagrantfileは50GBの`/dev/sdb`と100GBの`/dev/sdc`を追加してVMを立ち上げてくれます。

```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  config.vm.box = "ubuntu/trusty64"

  config.vm.provider :virtualbox do |p|
    #
    # ディスクを１つ追加する
    #
    p.customize [
      'createmedium', 'disk',
      '--filename', "/tmp/sdb.vdi",
      '--format', 'VDI',
      '--size', 50 * 1024]
    p.customize [
      'storageattach', :id,
      '--storagectl', 'SATAController',
      '--port', 1,
      '--device', 0,
      '--type', 'hdd',
      '--medium', "/tmp/sdb.vdi"]
    #
    # portcountをディスクの数だけ増やす(例:2つ)
    #
    p.customize [
      'storagectl', :id,
      '--name', 'SATAController',
      '--portcount', 2]
    #
    # ２つ目のディスクを追加する
    #
    p.customize [
      'createmedium', 'disk',
      '--filename', "/tmp/sdc.vdi",
      '--format', 'VDI',
      '--size', 100 * 1024]
    p.customize [
      'storageattach', :id,
      '--storagectl', 'SATAController',
      '--port', 2,
      '--device', 0,
      '--type', 'hdd',
      '--medium', "/tmp/sdc.vdi"]
  end

end
```

## 補足

`--storagectl`の値は使うboxによって異なります。僕が知る限りでも`SATAController`、`SATA Controller`、`SATA`とさまざまですが、下記の手順で調べることができます。

```
# ひとまず追加ディスク無しでvmを立ち上げます。
vagrant up

# vmのidを調べます。
VBoxManage list vms

# 例えばidが"837b8fb9-3a03-4ca4-916d-d5481bb5141b"の場合、
# 下記のコマンドでコントローラの名前を表示することができます。
VBoxManage showvminfo 837b8fb9-3a03-4ca4-916d-d5481bb5141b|grep "Storage Controller Name"
```

## 参考リンク
- [Add a second disk to system using vagrant](https://gist.github.com/leifg/4713995)
GitLabを別サーバに移行した時一部プロジェクトが表示できなくなった時の対処法

# 環境
* 移行元: Fedora22上のソースからインストールしたGitLab 8.9.3
* 移行先: CentOS7 (1511)上のGitLab 8.9.3 (omnibus版)

# データの移行方法
移行先の環境に公式の手順通りGitLabをインストール後，`gitlab-ctl reconfigure`してから`gitlab-rake gitlab:backup:restore`で移行元の環境でバックアップしたデータをリストア．

(この辺はあまりちゃんと覚えてない)

# 現象
GitLabを別サーバに移行後，一部のプロジェクトページを開いた時に500エラーが発生してプロジェクトの情報が見れなくなる．

production.logには以下の様な内容が記録される．
<pre>
Parameters: {"namespace_id"=>"...", "id"=>"..."}
Completed 500 Internal Server Error in 71ms (ActiveRecord: 5.5ms)

OpenSSL::Cipher::CipherError (bad decrypt):
app/models/project.rb:456:in \`import_url'
app/models/project.rb:486:in \`external_import?'
app/models/project.rb:478:in \`import?'
app/models/project.rb:494:in \`import_in_progress?'
app/controllers/projects_controller.rb:93:in \`show'
lib/gitlab/middleware/go.rb:16:in \`call'
</pre>

# 対処法
移行前の環境から`db_key_base`をコピーして持ってくる．

1. とりあえず`gitlab-ctl stop`でGitLabを止める．
2. ソースからの移行の場合は移行元の環境の`/home/git/config/gitlab_secrets.yml`にそれっぽいキーがあるのでその値をメモする．(後述の通りomnibus版の場合は`/etc/gitlab/gitlab-secrets.json`にある)
3. 移行先の環境で`/etc/gitlab/gitlab-secrets.json`を開き，`gitlab_ci`の`db_key_base`の値を2.でメモした値に書き換える．
4. CE版であれば`gitlab-rails runner "Project.where.not(import_url: nil).each { |p| p.import_data.destroy if p.import_data }"`を実行して不要になったデータを削除する？ (あまりよくわかってない)
5. `gitlab-ctl start`でGitLabを起動する．

これでちゃんと表示されるようになるはず．

# 参考ページ
* https://gitlab.com/gitlab-org/gitlab-ce/issues/17873
iOS 9 でアクセス確認アラートが出ない時の対応方法

[ios9 - App does not have access to your photos or videos iOS 9 - Stack Overflow](http://stackoverflow.com/questions/32768012/app-does-not-have-access-to-your-photos-or-videos-ios-9/32880876) より

カメラやマイク入力などを行うとき、初回にプライバシーのアクセス確認アラートが出てきますが、iOS 9 で CFBundleDisplayName（Xcode上の表記だと Bundle Display Name）のキーがあり、その値がないと、__エラーログが出ずに__アクセス確認アラートが表示されません。

CFBundleDisplayName の値にアプリ名を追加するとアラートが表示されるようになります。