OmniAICreator/Qiita-1.07M huggingface dataset:
8/22　今日の学習内容～Progate Ruby基礎編　シンボルまで　～

###今日の学習内容
***
今日は昨日に引き続きProgateを利用してRubyの学習を進めました(´-ω-`)
とはいっても、今日はあまり時間が取れなかったのでほとんど進められてないのですけれど...(;^_^A
これから一か月ほど忙しくなるので、どこまで学習を進められるか分かりませんが、少しづつでも時間を作って学習していきたいと思います(笑)
　
####ハッシュについて
***

昨日の続きからということですが、続きから始めてすぐに出てきた複数のオブジェクトを管理するハッシュのところでミスをしました(;´･ω･)

初心者の私が間違えたところを、同じように初心者の方や初学者の方も間違えてしまうのではないでしょうか？
ということで、ミスを見ながら配列との違いを簡単に説明していきたいと思います。

![progate screenshot3.png](https://qiita-image-store.s3.amazonaws.com/0/137880/5e96deab-b7cd-a82a-4dd2-9f0578c73245.png)

　

　
`words = {"apple"=>"りんご","dog"=>"犬","book"=>"本"}`

とするべきものを

`words = ["apple"=>"りんご","dog"=>"犬","book"=>"本"]`

としていたため、エラーとなりました。


配列では[　]を使うので、その流れでハッシュでも[　]を使ってしまったのでした(;´д｀)ﾄﾎﾎ
　

ハッシュとは**キー**に対応して**値**を返すもののことのようですね。
配列と同じように**複数のオブジェクトを扱うオブジェクト**で、連想配列とも言われているようです。

ハッシュは、

`ハッシュ名　= {"key1"=>"value1","key2"=>"value2",...}`

のような形式で書きます。
私のように**[ ]と書き間違えないように**お気を付けください(笑)

つづけてデータの取り出し方も簡単に説明させていただきます。

例えば`words = {"apple"=>"りんご","dog"=>"犬","book"=>"本"}`というハッシュがあったとしますと、値を取り出して`りんご`をputsするには、

キーとなる`apple`を入れて`puts words["apple"]`と書きます。

すると、`りんご`と表示されるわけですね。

同じように`dog`なら`犬`が、`book`なら`本`が取り出され、putsによって出力されます。

　
ハッシュを作るときは{ }を使いましたが、**値を取り出すときには [ ]を使う**ということを覚えておく必要がありますね(;´･ω･)


　
####シンボルについて
***
さて、Progateさんには、
>文字列を「"」や「'」で囲む代わりに頭に「:」をつけたものをシンボルといいます。 
シンボルはほとんどの場合、文字列と同様に使うことができます。 
シンボルと文字列の違いは難しいためここでの説明は省略します。
気になる人は**調べてみてください。**

とありました。
**「調べてみて」**とありましたので、調べてみました(-ω-)/

hp12c「Rubyのシンボルは文字列の皮を被った整数だ！」　http://melborne.github.io/2008/08/02/Ruby/

↑こちらの記事がとても分かりやすく書かれていましたので読んでいただけたらと思います(*- -)(*_ _)ペコリ

要点をまとめると、シンボルは**文字列と一対一で対応**するオブジェクトということですね。
注目すべきなのは、 **同じ内容のシンボルはかならず同一のオブジェクト**であるということです。

>等値性の検査

>シンボルは文字列と同じような感覚で用いることができる。ただし、等値性に関して、異なることに注意。

>例えば、文字列に対して、 2 つの等値性の検査をするためのメソッド、 == と equal? を試してみる。

>== は値が等しい場合に真となり、
>equal? はインスタンスが同じ場合に真となる。
>x = "hoge"
y = "hoge"

>puts x == y        #=> true
puts x.equal?(y)   #=> false
“○○○” と文字列を生成した場合、値は等しいけれど、インスタンスが異なっていることがわかる。

>同じ内容を、シンボルで試してみると、

>x2 = :hoge
y2 = :hoge

>puts x2 == y2      #=> true
puts x2.equal?(y2) #=> true
文字列の場合と違い、二つは同じインスタンスであり、一意性が担保されている。

>すぐに忘れる脳みそのためのメモ　Rubyのシンボル　
http://jutememo.blogspot.jp/2008/01/ruby.html

分かりやすく説明されていたので丸々引っ張ってこさせてもらいました(;´･ω･)

つまり、`name = "suzuki"`と`name2 = "suzuki" `において、二つの指す`suzuki`は、同名だけど実は別のオブジェクトで、`name = :suzuki`と`name2 = :suzuki `の指す`suzuki`は全く同じオブジェクトだよ、と私は解釈しました(´-ω-`)

　
　
####あとがき
***
シンボルについての説明がうまくできてないような気がします(;´･ω･)
リンクの記事を読んでいただいてご自身なりに理解して頂ければと思います(笑)
ここまで読んでいただきありがとうございましたm(__)m

文章の内容に誤りなどがございましたら指摘して頂けると嬉しいです(^^)/
　
　

####参考にさせていただいたサイト
***
Progate　 http://prog-8.com
るびま（Rubyist Magazine）　http://magazine.rubyist.net/?0004-FirstProgramming　
Ruby 2.0.0 リファレンスマニュアル　http://docs.ruby-lang.org/ja/2.0.0/class/Symbol.html
hp12c「Rubyのシンボルは文字列の皮を被った整数だ！」　http://melborne.github.io/2008/08/02/Ruby/
すぐに忘れる脳みそのためのメモ　Rubyのシンボル　http://jutememo.blogspot.jp/2008/01/ruby.html
iOSエンジニアのための英語

### この記事について

Appleが出している公式のドキュメントを読む時など、英単語の字引が素早くできるととても読みやすい。

この記事では、英語の文書を読む際に、私が使っている方法について記載してある。
主な対象はMacユーザーだ。


---

### 「調べる」で辞書をひく

デフォルトだと
Command + control + d
で実行できるmacの基本機能。
カーソルの合っている場所の単語の辞書を引いてくれる。

もしトラックパッドを使っているなら

システム環境設定>トラックパッド>ポイントとクリック
の「調べる&データ抽出」を有効にすれば、3本指でタップするだけで「調べる」が実行できるようになる。
トラックパッドから手を動かさずに単語が調べられるため、非常に楽。


![serachwithpointer.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/cc6e6d3c-1a8c-fb2b-43e2-129e0f1e532b.gif)



---

### Alfred活用
Alfredを使うことで、気になった単語やポインタでハイライトが出来ない単語などを調べることができる。
キーボードに手を載せたまま調べることができるため、手を動かす必要がい。

https://www.alfredapp.com/



#### Alfredで調べる

Alfredのデフォルト機能に辞書の呼び出し機能がある。
起動後、下記の様に打ち込めば、調べたい単語を辞書で引ける。

```
def {調べたい単語}
```

![alfred_def.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/199c1e1f-67d0-e6d6-86d7-646376eac7a2.gif)




#### Alfredで熟語を調べる。

上記の「調べる」だと、単語を調べることはできるが、熟語などを調べることができない。

それをカバーするために、外部サイトを使用する。
Alfredのpreference>Features>WebSearchに下記クエリを追加する。

```
http://ejje.weblio.jp/content/{query}
```


![スクリーンショット 2016-08-22 23.31.51.png](https://qiita-image-store.s3.amazonaws.com/0/37053/2883a3a5-52bf-9ec5-76a8-320f3fc4556f.png)


これによって、「調べる」などで検索できない熟語などもカバーできる


![alfred_dic.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/8bf0ccd0-db0a-33e8-dbf4-b3f94d67b5c5.gif)


---

### Chormeでweblioの拡張機能を使う

何らかの事情で上記で説明した方法が使えない場合、chromeユーザーであればweblioの拡張機能を使うこともオススメする。
特定のページ上の単語にポインタを合わせたり、選択するとその意味を自動で調べてくれるというもの。

![weblioextensiongif.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/e8455aaa-ce7a-e31c-5c79-0688d0e73c74.gif)


拡張機能はこちら
https://chrome.google.com/webstore/detail/weblio%E3%83%9D%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97%E8%8B%B1%E5%92%8C%E8%BE%9E%E5%85%B8/oingodpdjohhkelnginmkagmkbplgema?hl=ja


---


### 文法を学ぶ
蛇足かも知れないが、ある程度の文法を知らないと、単語を調べても文意がわからない時が多々ある。
そういう時は基本に立ち返って学ぶしか無い。

筆者のおすすめはこのサイト
https://www.englishclub.com/

文法の基礎について英語で記述されている、平な表現で書かれているため、文法の入門として良い。


---


英語を読みやすくする方法に関して、自分の知っている範囲で記載した。
もし他に良い手段をご存じの方がいれば、コメントや編集リクエストで教えてくださるとありがたい。
【Swift】UICollectionViewCellのカスタムセルをxibで作って使う

やたらハマったのでメモ程度に。
結局UITableViewCellと同じ使い方をすれば良かった。

1.customCell.xibを作成。
2.viewDidLoadに下記を記載する

```

override func viewDidLoad() {
        super.viewDidLoad()

        // nibNameにはxib名を記載
        let nib: UINib = UINib(nibName: "customCell", bundle: nil)

        // forCellWithReuseIdentifierには
        // "Collection Reusable View"のIdentifierで指定したものを設定
        collectionView.registerNib(nib, forCellWithReuseIdentifier: "cellId")
    }

```

後はstoryboardで作成した時と同じように使えた。
LinuxBeanでもmikutterを使いたい！！！

#過去の話
以前、キータに投稿したんだけど、自分で見てもうごかねえ！ってなったんで改めて。

#やること
```
sudo add-apt-repository -y ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install ruby2.1.X
```

#Rubyでやること
```
gem update --system
gem install bundle
bundle install
```

#Mikutter
解凍して起動すると良いゾ！！！
[iOS] XIBファイルからViewを生成する

UIViewのExtensionでメソッドを追加。

```
extension UIView {
    class func createFromNib() -> UIView? {
        let fullClassName = NSStringFromClass(self)
        let range = fullClassName.rangeOfString(".")
        let className = fullClassName.substringFromIndex(range!.endIndex)
        return UINib(nibName: className, bundle: nil).instantiateWithOwner(self, options: nil).first as? UIView
    }
}
```
[iOS] AutoLayoutでViewを上下中央配置にする。

AutoLayoutでViewを上下中央配置にする。
(※ self.view:親 self.fooview:子)

```
// AutoLayoutの自動変換をOFF
[self.fooview setTranslatesAutoresizingMaskIntoConstraints:NO];
    
// X方向の制約
NSLayoutConstraint *xConstraint =
 [NSLayoutConstraint constraintWithItem:self.fooview
                              attribute:NSLayoutAttributeCenterX
                              relatedBy:NSLayoutRelationEqual
                                 toItem:self.view
                              attribute:NSLayoutAttributeCenterX
                             multiplier:1.0                                            
                               constant:0];
// Y方向の制約
NSLayoutConstraint *yConstraint =
 [NSLayoutConstraint constraintWithItem:self.fooview
                              attribute:NSLayoutAttributeCenterY
                              relatedBy:NSLayoutRelationEqual
                                 toItem:self.view
                              attribute:NSLayoutAttributeCenterY
                             multiplier:1.0
                               constant:0];
[self.view addConstraint:xConstraint];
[self.view addConstraint:yConstraint];
RecyclerViewのスクロール位置を保存したいとき

 RecyclerViewのスクロール位置を保存したいとき

```kotlin

    var recyclerView: RecyclerView? = null
    var position: Int = 0 // リサイクルビューのPosition
    override fun onResume() {
        super.onResume()
        //setupRecyclerView() => 画面更新させる
        (recyclerView?.layoutManager as LinearLayoutManager).scrollToPosition(position)// =>　ポジションまで移動
    }

    override fun onPause(){
        super.onPause()
        position = (recyclerView?.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()// ポジション保存
    }
```
インストールされているアプリのAPKファイルを引っこ抜く

```
adb shell pm list packages
```

でパッケージ一覧が取得できる。

```
adb shell pm path com.king.candycrushsaga
```

で`package:/data/app/com.king.candycrushsaga-1/base.apk`のようなパスが取得できる。
これを`adb pull`で引っこ抜く。

```
adb pull data/app/com.king.candycrushsaga-1/base.apk
```

参考：http://stackoverflow.com/questions/2507960/does-android-keep-the-apk-files-if-so-where
アンダースコア_付のヘッダ情報を、mod_rewrite で修正する

Apache を新しくしたところ、一部のリクエストヘッダ情報が参照できない問題が発生。
https://httpd.apache.org/docs/trunk/new_features_2_4.html

リクエストヘッダのフィールド名にアンダースコアが含まれていると、不正なフィールドとして Apache が落とすとの事です。MY_VERSION みたいな感じ。

サーバ側で対処する方法。

```apache
RewriteEngine On
# ヘッダの MY_VERSION に1文字以上入ってたら
RewriteCond %{HTTP:MY_VERSION} .+ 
# 環境変数 HTTP_X_MY_VERSION に値を入れる ※1
RewriteRule ^ - [env=HTTP_X_MY_VERSION:%{HTTP:MY_VERSION}]
# ↑の環境変数から、ヘッダに X-MY-VERSION を入れる ※2
RequestHeader set X-MY-VERSION "%{HTTP_X_MY_VERSION}e" env=HTTP_X_MY_VERSION
```

（Rack サーバの場合、※1 が rack_request.env に入ってくるので、※2 は無くても同じです）

mod_rewrite は素人で苦しかったですが、↓サイトさんと、公式が参考になりました。

* http://koseki.hatenablog.com/entry/20090611/ModRewrite
* http://httpd.apache.org/docs/current/mod/mod_rewrite.html
* http://httpd.apache.org/docs/current/mod/mod_headers.html
Visual Studio 2015 で luabind 0.9.1 をビルドする

# はじめに

Visual Studio 2015 + Lua 5.1.5 + Boost 1.60.0 で luabind 0.9.1 のスタティックライブラリ（.lib）を作成する手順です。今回は 32bit 版を作成していますが、同様の手順で 64bit 版を作成する事も可能です。各ライブラリの配置先は環境に合わせて読み替えてください。

# 用意するもの

* Visual Studio 2015 Community
* [luabind](http://www.rasterbar.com/products/luabind.html) 0.9.1
* Lua 5.1.5 (LuaBinaries から [lua-5.1.5_Win32_dll14_lib.zip](https://sourceforge.net/projects/luabinaries/files/5.1.5/Windows%20Libraries/Dynamic/lua-5.1.5_Win32_dll14_lib.zip/download) をダウンロード）
    * `C:\lib\lua-5.1.5_Win32_dll14_lib` へ配置
* Boost 1.60.0
    * `C:\lib\boost_1_60_0` へ配置

# luabind/object.hpp の修正

最近のバージョンの Boost でコンパイルに失敗する箇所の修正を行います。

`boost::operator` を `boost::iterators::operator` へ置換します。

参考：[BoostLibrary1.57.0を用いてLuaBindをビルドする際の問題](http://cdecrement.blog.fc2.com/blog-entry-114.html)

# b2.exe を生成

Boost のフォルダで `bootstrap.bat` を実行すると `b2.exe` が生成されるので、これを luabind のフォルダへコピーします。

# luabind のビルド

「開発者コマンドプロンプト for VS2015」を起動し、luabind のフォルダへ移動して以下を実行すると、`stage` フォルダに `libluabind.lib` （リリースビルド版）と `libluabindd.lib` （デバッグビルド版）が生成されます。

```
SET LUA_PATH=C:\lib\lua-5.1.5_Win32_dll14_lib
SET BOOST_ROOT=C:\lib\boost_1_60_0
b2 --toolset=msvc-14.0 address-model=32 link=static runtime-link=static debug release stage
```
【GITHUB】Tシャツやグッズが欲しい！どうやって買うの？

##GITHUB公式ショップ

GITHUBには、グッズ販売ようの公式ショップがあり、通販をしています。
海外サイトですが、日本にいてもクレジットカードやPayPalがあれば、購入できます。

http://github.myshopify.com/

![pride-2016-2x.jpg](https://qiita-image-store.s3.amazonaws.com/0/117147/cb3912a8-be4d-dc6f-629d-0e5481293744.jpeg)

##商品は何があるの？
Macbook用のステッカーや、、、

![Decal_detail_1024x1024.png](https://qiita-image-store.s3.amazonaws.com/0/117147/9d12fdb2-3549-c652-a7b4-f47a6f64d4bf.png)

Tシャツなどが売られています。
Mens、Womensそれぞれ、複数サイズ揃っています！

![preview_313648_1024x1024.jpg](https://qiita-image-store.s3.amazonaws.com/0/117147/bc66c8d6-b7cc-4b36-05fd-b9fc1cf0badf.jpeg)

10以上の種類があり、Tシャツは20$（約¥2000）〜と、意外と安く購入することができます。
配送料に、数千円かかりますが、まとめ買いするとお得です。



##買い方をていねいに説明！
###①商品を選んだら、右上の「Add to cart」を押します。

![スクリーンショット 2016-08-22 21.42.09.png](https://qiita-image-store.s3.amazonaws.com/0/117147/3c3001b5-4d3d-4b41-9419-eceb3204915b.png)

###②買いたいものをすべてカートに入れたら、右下の「Checkout」を押します。

![スクリーンショット 2016-08-22 21.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/117147/1dab5063-64f1-08aa-b2f9-2d359aa96d30.png)

###③下記を例に、配送先情報を記載していきます。
![スクリーンショット 2016-08-22 21.49.19.png](https://qiita-image-store.s3.amazonaws.com/0/117147/64226fe4-ef1e-5771-8c99-d4f26f13bb86.png)

First name：名前をかきます
Last name：苗字をかきます
Address：住所をかきます
Apt,suite：マンション名があればかきます
City：都市名をかきます
Postal code：郵便番号をかきます

最後に「Continue to payment method」を押します。

###④「Continue to payment method」を押します。
![スクリーンショット 2016-08-22 21.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/117147/8f21e074-b530-6538-fb6d-d9fc79a3ecb9.png)

###⑤クレジットカードの内容を入力orPayPal内容を入力し、「Complete order」を押します。
![スクリーンショット 2016-08-22 21.54.37.png](https://qiita-image-store.s3.amazonaws.com/0/117147/20a570c0-6c33-964e-79cc-cc5fd5c9ac51.png)


これで購入手続きは完了です！

デンマークから発送の場合、インド、中国を経由するので１週間程度あれば、到着するでしょう。
楽しみですね！

![thumb_2354dfe5-30ea-457f-ac57-194dc2c3c057_1024x1024.jpg](https://qiita-image-store.s3.amazonaws.com/0/117147/d25b9800-3e27-a4cc-854b-813cbc8b8fca.jpeg)
PhpStorm(on Windows10) 基本設定メモ(2) - Editor設定+plugin

$sin^2x$番煎じのメモ
Editor設定とpluginインストール
(※2016/08/28時点)

 * [PhpStorm(on Windows10) 基本設定メモ(1) - php+xdebug環境](http://qiita.com/ckit_idle/items/8b0361f0eedc5d41c4f7)
 * PhpStorm(on Windows10) 基本設定メモ(2) - Editor設定+plugin(本記事)
 * [PhpStorm(on Windows10) 基本設定メモ(3) - SVN/Git設定](http://qiita.com/ckit_idle/items/35eb68d9eab8ba1876fa)
 * [PhpStorm(on Windows10) 基本設定メモ(4) - PHPUnit設定](http://qiita.com/ckit_idle/items/17b979f08c3d1d40a354)
 * vagrant+remote debug設定(書く予定)

| software   | version  |
|:-----------|---------:|
| PhpStorm   | v2016.02 |

# Editor設定

ツールバーのFile > Setting

## 行番号表示

デフォルト有効だった

## ホワイトスペース表示
### Editor > General > Appearance
 
Show whitespacesにチェック

## カラースキーマ設定
### Editor > Colors & Fonts

（お好みで）

```
Scheme: monokai
```
その他Editor設定も変更したいので、monokaiを選択した状態でsave Asで別名をつけて保存

## フォント変更
### Editor > Colors & Fonts > Font
（お好みで）

```
Primary font: Ricty Diminished for PowerLine
Size: 20
```

## Line separatorをLFに
### Editor > Code Style

```
Line separator(for new files): Unix and OS X (\n)
```

# プラグイン
## インストールの仕方
### Setting > Plugins
Browse repositiesからインストール

## plugin一覧
 * BashSupport
  * bash対応
 * Markdown support
  * Markdown記法対応
 * .ignore
  * 各種ignoreファイルをテンプレートから生成
Software Design 2016/8号のYUM/APT特集メモ

メモしとかないと付箋しはっただけの謎雑誌のままだ。

## APTを使いこなそうを楽しく読んだ

* p.75のDebianのリリースサイクルの表記はおかしい。testingから直接oldstableになるように見えるが、リリース当初はstableで途中からoldstableに変わる。（あとold-stableじゃなくてoldstableね）
* p.77「/usr/share/doc/パッケージ名の下にパッケージの更新履歴があるが、容量の都合上記録されてるのは最新の数バージョン」なのはUbuntuだけでDebianは違う
* 最新のキャッシュだけ残しとくの「apt autoclean」なんてのがあるのか。
* 依存関係の逆引きはapt-rdependsが楽なんだけど、もっときちんとやろうと思うとdctrl-toolsパッケージ入れてgrep-dctrl使って複雑げなことやらないといけなくなって面倒ではある。
* ソースコードの取得は「apt source パッケージ名」だと思ったでしょ？最新の状況を含めて落とすには「debcheckout パッケージ名」でVCSからとってくるのよ（あ、VCSからだから、git-buildpackageとかしないといけないけど。そのままビルドしたい場合にはapt sourceの方がよい）
* sources.listの書式が新旧２種類あるなんて初めて知った。新しい書き方してる人だれ？
* コンポーネント、セクションとか表記は結構揺れるのよ。正式名称？通じりゃええやん
* 「なおPPAは非公式なリポジトリなので、利用する場合は。。。」ってその鍵自体信用して良いのかなーどうなのかな―。信用する範囲を分解できないもんなのかね、でも運用が破綻しそうではある。


## あとひみつのLinux通信から拾う
これ、unarコマンド入れたら実はハッピーになったりするんじゃない？


## Yum 編は後日ね。
PhpStorm(on Windows10) 基本設定メモ(1) - php+xdebug環境

$cos^2x$番煎じのメモ
php+xdebug環境をローカルに構築(php同梱Webサーバ利用)
(※2016/08/22時点)

 * PhpStorm(on Windows10) 基本設定メモ(1) - php+xdebug環境(本記事)
 * [PhpStorm(on Windows10) 基本設定メモ(2) - Editor設定+plugin](http://qiita.com/ckit_idle/items/8df858d5b77135a440aa)
 * [PhpStorm(on Windows10) 基本設定メモ(3) - SVN/Git設定](http://qiita.com/ckit_idle/items/35eb68d9eab8ba1876fa)
 * [PhpStorm(on Windows10) 基本設定メモ(4) - PHPUnit設定](http://qiita.com/ckit_idle/items/17b979f08c3d1d40a354)
 * vagrant+remote debug設定(書く予定)

| software   | version  |
|:-----------|---------:|
| PhpStorm   | v2016.02 |
| php        | 5.6.25   |
| xdebug     | 2.4.1    |

# PHP install

[PHP windowsバイナリ](http://windows.php.net/download/)

 * VC11 x64 Thread Safe (2016-Aug-18 22:03:13)
 * php-5.6.25-Win32-VC11-x64

zipファイルの中身を例えば下記へ設置

```
C:\php56_25
```

# xdebug install

[xdebug windowsバイナリ](https://xdebug.org/download.php)

 * xdebug 2.4.1 > PHP5.6 VC11 TS(64bit)
 * php_xdebug-2.4.1-5.6-vc11-x86_64

phpインストール先のext以下に設置

```
C:\php56_25\ext
```

# php.ini設定
## php.ini設置
phpインストールディレクトリ直下にある php.ini-development を php.ini にリネーム

## timezone設定
```
date.timezone = Asia/Tokyo
```

## xdebug設定
profiler_output_dir には適当なディレクトリを設定

```
[xdebug]
zend_extension="C:\php56_25\ext\php_xdebug-2.4.1-5.6-vc11-x86_64.dll"
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.profiler_enable=1
xdebug.profiler_output_dir=<OUTPUT_DIR>
xdebug.idekey="PHPSTORM"
```

# PhpStorm Setting

ツールバーの File > Setting

## PHPインタプリタ設定
### Languages & Frameworks > PHP

interpreter: の横の ... をクリックしてphpインストールパスを追加
InterpreterにインストールしたPHPバージョンが表示されていることを確認

## PHPリモートサーバ追加
### Languages & Frameworks > PHP > Servers

+をクリックしてサーバを追加

```
Name: localhost
Host: localhost
Port: 80
Debugger: xdebug
```

## xdebug設定確認
### Languages & Frameworks > PHP > Debug

xdebugポートがphp.iniと同じことを確認

# ブラウザでのデバッグ用設定

ブックマークレットかエクステンション（アドオン）を用意

## ブックマークレット登録

[phpstormブックマークレット](https://www.jetbrains.com/phpstorm/marklets/)

  * IDE keyを"PHPSTORM"にしてGenerate
  * Start debugger/stop debuggerをブックマーク登録

## エクステンションインストール

chromeの場合

[xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=ja)

 * 拡張設定からidekeyを"PHPSTORM"に設定

# 実行
## Run Config

ツールバーのRun->Edit Configuration
左上の+をクリック

(1) PHP Built-in Web Serverを選択

(お好みで)

```
Name: Local Built-in
Document root: <DOCUMENT_ROOT>
```

(2) PHP Remote Debugを選択

```
Name: Local Xdebug
Servers: localhost
ide key: PHPSTORM
```

## Runしてみる
Local Built-in web serverを指定してRun

## Debugしてみる
Local Xdebugを指定して、右上の電話機のようなアイコンをクリック
ブレークポイントを指定しておいてブラウザで開き、
startdebuggerのブックマークレットをクリック、
またはxdebug helperのアイコンをクリックしてdebugを指定

ブラウザを更新
RundeckからSSH接続したサーバー内でsudoを実行する

## 主な方法

1. ログインユーザーにnopasswdを指定する
2. rundeckのoptionで指定して使う

2はうまく動かすの妙にハマった。

## ログインユーザーにnopasswdを指定する

### 手順

jobユーザーにログインするものとして、`/etc/sudoers`に以下の行を足す。

```
job ALL=(ALL) NOPASSWD: ALL
```

これだけだと`sudo: sorry, you must have a tty to run sudo`なんてエラーが出ることがある。端末がない状態でsudoが出来ない設定がオンになっているためで、今回追加したユーザーに対してのみsudo出来るように設定してやる。

```
Defaults:job    !requiretty
```

これで実行してやれば普通に動く。

### 気になる点

ただし、これだけだと『rundeckサーバー内に格納されている鍵情報を取ることが出来たら接続するリモートのサーバーに対して何でもできちゃう』という状態になってちょっと怖い。後述するけどKey StorageのGUIから鍵を保存すると644で保存される事象もあるので、潜在的に踏み台として使われるリスクを抱えてるシステムってあるんじゃないんだろうか。

## rundeckのoptionで指定して使う

### 手順

1. /rundeck/menu/storageから"Add or Upload a Key"でユーザーパスワードを登録する
1. パーミッションを600にする
1. JobのOptionsで『sudoPassword』という名前のものを作る
1. Input Typeでsecureを指定して1で作ったストレージをStorage Pathに指定する
1. Workflowで指定しているscriptに対して`echo @option.sudoPassword@ | sudo -S command`といった形式でsudoを実行する
1. `/var/rundeck/projects/{project}/etc/resources.xml`の対象サーバーに`sudo-command-enabled="true"`の項目を足す※

※2.6.9-1現在ではこれをやらなくてもsudoは通るが、ログに`[sudo] password for job: `なんてのが残って後味が悪い。

### 簡単な説明

この方法だと、rundeckサーバーの中にパスワードのファイルが格納されて、rundeckはそれを使用してスクリプト中の@option.sudoPassword@の文字列を置き換える。

サーバー上では`echo password | sudo -S ls`といったコマンドが実行されるが、ユーザーのログには残らない。rundeckサーバー内にあるパスワードが書かれた鍵を盗られなければ……

ってあれ？あんまりセキュリティ性向上してなくね？

### ハマった点

* option指定したら勝手にsudoにパスワード詰めてくれるものだと信じて失敗
* echo @option.sudoPassword@ | sudo lsとやって失敗
* usageに書かれてるbashのパターンを試して$RD_SUDOPASSWDとか試して失敗する


## 基本: rundeckにリモートのサーバーにログインする

一応基礎中の基礎だけどそもそもリモートのサーバーにSSHで入ってジョブを実行する方法についても書いておく。

1. リモートのサーバーにユーザー作って鍵作る
1. まずプロジェクトを立てる
1. /rundeck/menu/storageから"Add or Upload a Key"でSSH鍵を登録する
1. rundeckのサーバーにログインして`/var/lib/rundeck/var/storage/content/`内の登録した鍵のパーミッションを600にする※
1. `/var/rundeck/projects/{project}/etc/resources.xml`にログイン先のサーバーを登録する※
1. ジョブの`Nodes`から`Dispatch to Nodes`を選択、`Node Filter`から指定したサーバーを検索して当てる

※何故か2.6.9-1現在では644で保存される。rundeckで使ってるjschでは問題ないがセキュリティ的な面を鑑みて変更する。
※ノード例:

```xml
<
  node name="db"
  description="db server node"
  tags=""
  hostname="10.0.0.1"
  osArch="amd64"
  osFamily="unix"
  osName="Linux"
  osVersion="2.6.32-573.26.1.el6.x86_64"
  username="job"
  ssh-authentication="privateKey"
  ssh-key-storage-path="keys/db"
/>
```

## 参考

[Rundeck Documentation Tutorials/Jobs](http://rundeck.org/docs/tutorials/jobs.html#script-access-to-option-data)
Database Cloud ServiceにSSHアクセスしてみた


# 概要
Oracle Database Cloud Serviceの環境構築はわずかな時間で完了しました。

- [Oracle CloudでDatabase Cloud Serviceインスタンスを作ってみた](http://qiita.com/shinyay/items/2e7de9c1c3be3428818b)

この作成した環境にSSHでアクセスしてみます。

## 使用しているOracle Cloud環境

以下の手順で申し込んだトライアル環境を使用しています。

- [Oracle Cloudのトライアル環境を申し込んでみた](http://qiita.com/shinyay/items/c2739190a60cb5126a9d)

# Database Cloud ServiceインスタンスへのSSH接続手順
Database Cloud Service環境の利用手順を説明します。
流れは以下のようになります。

1. Database Cloud ServiceインスタンスのIPアドレスの確認
2. SSH秘密鍵を指定してSSHアクセス

## 1. Database Cloud ServiceインスタンスのIPアドレスの確認

Database Cloud ServiceインスタンスのIPアドレスは、サービス・コンソールに表示されます。

まず、Oracle Cloud ダッシュボード画面を表示します。

![dashboard](https://bytebucket.org/shinyay/images-for-blog/raw/9edb45c08efa2320ca7e28d739d3ac7fd9f00df7/qiita/160818_dbcs-instance-creation/myservices.us.oraclecloud.com_2016-08-15_13-05-23.png)

次にDatabase Cloud Serviceを選択して表示します。
![dbcs-services](https://bytebucket.org/shinyay/images-for-blog/raw/9edb45c08efa2320ca7e28d739d3ac7fd9f00df7/qiita/160818_dbcs-instance-creation/dbaas.oraclecloud.com_2016-08-15_14-29-20.png)

表示されているDatabase Cloud Serviceのインスタンス一覧の中から、IPアドレスを確認するインスタンス名を選択します。
するとサービス・インスタンス個別情報画面に遷移するので、そこでIPアドレスが確認できます。
![publip](https://bytebucket.org/shinyay/images-for-blog/raw/c995e6fe02de7dd16487e69e0966103306f0c8ea/qiita/160822_dbcs-ssh-connect/dbaas.oraclecloud.com_2016-08-22_12-34-12.png)

## 2. SSH秘密鍵を指定してSSHアクセス
Database Cloud Serviceのインスタンス作成時に登録したSSH公開鍵の鍵ペアを使用します。
インスタンスには公開鍵が登録されているので、それと対になる秘密鍵を指定してSSHアクセスします。

```bash
$ ssh -i ./privateKey opc@XXX.XXX.XXX.XXX
[opc@DB12c-EE ~]$
```

SSHアクセス完了です。
```bash
[opc@DB12c-EE ~]$ hostname
DB12c-EE.compute-xxxxxxxxxx.oraclecloud.internal
```

### Database Cloud Serviceインスタンス作成メニューで作成したSSH鍵ペア

上記の例で使用している**privateKey**は、以下の投稿記事内で作成したSSH鍵ペアの秘密鍵を使用しています。

- [Oracle CloudでDatabase Cloud Serviceインスタンスを作ってみた：SSH公開鍵](http://qiita.com/shinyay/items/2e7de9c1c3be3428818b#ssh%E5%85%AC%E9%96%8B%E9%8D%B5)

作成した鍵ペアは以下のようなZipファイルでダウンロードできます。

```bash
$ ls
sshkeybundle.zip
```

このファイルを展開すると、公開鍵と秘密鍵が入っています。

```bash
$ unzip sshkeybundle.zip
Archive:  sshkeybundle.zip
  inflating: privateKey
  inflating: publicKey

$ ls
privateKey  publicKey  sshkeybundle.zip
```

# SSHアクセス以降の操作
以下のユーザを利用して操作を行います。
- opc
    - Oracle Cloud作業用
- oracle
    - Oracle製品管理ユーザ

oracleを使用すると、通常のOracleインストール環境同様にSQLPlusなどDatabase提供ツールの利用ができます。

```bash
[opc@DB12c-EE ~]$ sudo su - oracle
[oracle@DB12c-EE ~]$ which sqlplus
/u01/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus
```

# まとめ
SSHでのアクセスは、普通のLinux環境同様に実施できますね。
22番ポートが開いているので、その他ツールからもSSHアクセスが可能です。
関数を置き換えてデバッグする小技


ちょっとしたスクリプトを書くときに、文字列を組み立てて実行するってあるよね？

こんなのとか（例だから`shutil`使ってないけど）

```Python
os.system('mv %(src)s %(dst)s' % locals())
```

こんなやつ

```Python
os.system('ssh %(user)s@%(host)s -p %(port)s hostname' % locals())
```

で、組み立てた文字列を確認したい場合にこうするの、やったことない？
面倒だよね

```Python
# os.system('mv %(src)s %(dst)s' % locals())
print 'mv %(src)s %(dst)s' % locals()
```

こういう風にデバッグするんだったら、`os.system`を置き換える方が楽

```Python
def out(s):
  print s

os.system = out
os.system('mv %(src)s %(dst)s' % locals())
```

これで`os.system`は実質`print`になっているので、実行すると組み立てた文字列が標準出力されて、楽にデバッグできるよ

ちなみに、python2系は`print`が文だから`def`使ってるけど、python3系は`print`が式になってるのでもっと楽

```Python
os.system = print
os.system('mv %(src)s %(dst)s' % locals())
```

第一級オブジェクト言語だったら応用効くから覚えておくと良いかも
iosdc japan 2016 参加メモ

# 参加感想

日本初のiOSConfに参加できて、ラッキーだと！内容はエンジニア向けないようだったり、デザイナー向け内容だったり、かなり色々でした。参加したいセミナーはタイトルで決めたんですが、レベルが分かるといいではないかと思いました。そして、ほぼ発表した後に公開されるので、いけなくてもチェックするべき内容がいくつありました。
今年ははやっているそうなRxSwiftやReactiveエンジンなどよりスムーズにoperformance処理することや、効率よく開発する方法というキーワードはあちこち聞きました。サーバ関連のところはあまりないなという感想でした。
来年またやって欲しいなと思いました！

![14074415_10154496715680956_859338646_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/18698/7a387d70-6a54-de78-649b-2a8d1a795918.jpeg)
看板！

![14087319_10154496715645956_462732974_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/18698/9a52846f-5c4e-1a4b-fc31-14256f79cd58.jpeg)
開発ノート！渡されたバッグに入っていました

![14123386_10154496715600956_1922524398_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/18698/fe8f0e7c-e069-2c3f-bae5-f4bd3d4e3d97.jpeg)
いい感じな会場B！

![14087531_10154496715595956_310089043_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/18698/e6cdd14c-a495-7ff8-1936-760a61f9053e.jpeg)
メイン会場、雨なのに人いっぱい！

# rxSwift

「rxSwiftは開発どう変えるか」

他言語でも注目されている開発方法。
紹介されたサンプルコード例：
　テキストをどうバインドする
　位置情報ベース天気デモが紹介されます
Full report: http://niwatako.hatenablog.jp/entry/2016/08/20/113714
参考：
https://github.com/ReactiveX/RxSwift
http://reactivex.io/


# VR ios アプリ作成について

* ヘッドマウント：amazon 3000で購入し、スマホでVRを試せる
* スマホアプリ: 臨場感＋適切感は要注意
* app の要求：ライブ、リアルタイム性
* 実装方法：
Google VR SDK :   実装簡単がカスタマイズは難しい
Unity: iphone生を引き出すのは厳しい
SceneKit: 動画生生は厳しい
OpenGL ES + GL Kit  -> 採用された

# Handslab POS app

POS app: point of sales
いつ？どの商品？どんな値段で？いくつ売れたか
主な情報：売り上げ登録＋決済＋情報提供
旧POSからiPadで作成しました

* AWS利用中、messenger機能
* プッッシュ通知を使って、silent pushでデータ更新を行いました：マスターと更新
 位置情報連携
 Swift2.2連携
* 実際運用の問題：
アップデート：プッシュ通知でアプリを閉じる、更新をさせる

# Reactive state Machine

http://niwatako.hatenablog.jp/entry/2016/08/20/133225

状態の流れで処理するプログラミング
状態を保存すると言う一時的に保留可能
状態変更をゲット・セットすることは可能
variable or Mutable property
FRP+ MVVM
React.js:
* View をstateless に扱うフレームワーク
* bottomup: difficult
-> 組み合わせRedux
* 問題点
非同期処理のところは完全ではない
→frpに任せた方がいい
→より設計方法がある
→Redux+FRP改善案


# dogfooding しやすい環境

自分たち作ったプロダクトをふだん自分で使い倒して、改善点を洗いだす
フィードバック機能を用意する
フィードバックしやすくすることで、１０件→１６００件になります。
チームのモチベーション向上、議論が活発
アプリ内のフィードバック機能はOSS中

# Memory管理

Ray Fixさんからの発表
スタックとヒープの違い：
* stack: fast, lockする必要がない
* heap: 参照型
→弱い参照・強い参照が０2なったら殺される
* unowned型
* weak pointerを消すべき

# designer にStoryboardを任せる

* LGTMアプリ作成者
* 導入の注意点
 - モチベーション確認
 - 環境構築
* 以下の概念をデザインナーさんに理解していただく必要
 InterfaceBuilder
 View?ViewController?AutoLayout?
UIKit User Interface Catalogがおすすめ
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/UIKitUICatalog/
ViewController  catalog
https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Introduction.html
 - Autolayout
 NSLayoutConstraint
 Priority
 Adaptivity
 

# 参考な資料

サーバサイドのSwift
https://speakerdeck.com/noppoman/swift3-framework-slimane-and-server-side-swift-ja

開発ツールのベストプラクティス
http://sssslide.com/speakerdeck.com/usamik26/iosdc-2016-talk

画像リソース：http://www.aflo.com/

ios app 学習するサイト
https://www.raywenderlich.com/
OS X(Elcapitan)でgdbを使う


OS Xでgdbを使ってデバッグを使いたい。

## インストール
```
$ brew install gdb
$ gdb -v
GNU gdb (GDB) 7.11
Copyright (C) 2016 Free Software Foundation, Inc.
(以下略)
```

## 使ってみる（エラー）
```
$ ./executable_file_name hoge < data/huga
```
をデバッグしたい。

```
$ gdb ./executable_file_name
(gdb) run hoge < data/huga
Starting program: path/to/executable_file_name hoge < data/huga
Unable to find Mach task port for process-id 49153: (os/kern) failure (0x5).
```
`Unable to find Match task...` と怒られてしまう。

## エラー対処
以下のどちらかを行えば、上と同じコマンドでデバッグできる。
### 一刻も早く動かしたい
```
$ sudo gdb ./executable_file_name
```

[stack overflowのこの回答](http://stackoverflow.com/a/21080727)を参考にした。

### 証明書を作る

[OS XでGDBを使う（ためにコード署名をする）](http://qiita.com/takahashim/items/204ffa698afe09bd4e28) 
に従って証明書を作るとsudoが不要になる。

## 参考
- http://stackoverflow.com/a/21080727
- http://qiita.com/takahashim/items/204ffa698afe09bd4e28
glob関数でディレクトリ配下にあるファイル名のみ取得する


初めてPerl書いたので自分用メモ
ディレクトリ配下にあるファイル名のみを取得したいとき

* 無理くりlsでファイル名取得すると、改行入るので、改行を削除する処理をかませる必要あり。
* だめな書き方

```perl
my @ls_result = `ls -1 $temp`;

foreach my $kaigyo_check (@ls_result){
  # 改行削除処理
  $kaigyo_check=~ s/[\r\n]//g;
}
```
  
<br />

  
* こちらのglob関数使えば改行入らないでファイル名とれるから、便利だね。
* こっちのがオススメ

```perl
my @ls_result = glob("$temp/*");
```

以上
patchコマンドでパッチ適用

ファイルの差分を適用するpatchファイルの作成、適用、戻しについて。

### patchファイルの作成（差分の書き出し）

```
diff -u file_old file_new > hoge.patch
```
-u はunified出力形式のオプション。

### patchファイルの適用

```
patch -u file_path < hoge.patch
```

### 変更内容の戻し

```
patch -R file_path < hoge.patch
```


---

省略とかいろいろできるみたいだけど、これが直観的でシンプルかと。

参考）
http://d.hatena.ne.jp/mrgoofy33/20101019/1287500809
LinkisBlock - Linkis.com blocker Chrome Extension


https://chrome.google.com/webstore/detail/fpaihcinmbhpoaiennofdgjldinfohac/

linkis.com。なんか、URLシェアのUX向上とからしい。
しかし、linkis経由で開けるとlinkisアプリをtwitter認証しないと中身が開けないし、普通にURLをシェアするとln.is経由に書き換えるウイルス的側面を持つ。これではUXは向上どころか低下である。

実際には本当のウェブサイトはiframeに隠されているだけなので、引っ張り上げれば良い。

入れておけば感染抑止に役立つ、はず。
Bluemix 関連のチュートリアル等サイト個人まとめ

# はじめに
完全の個人用メモ．

# Blumix 全般
## ドキュメント，記事
- [Bluemix コミュニティWiki](https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/Wdec01e50fbfa_493c_8a88_6dd85c4d983f/page/Bluemix%20%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3Wiki)
- [IBM Bluemix の Watson APIを使ってみた雑感, Qiita](http://qiita.com/knao124/items/60dc430fc31bf85b0e60)
- [Bluemix Hands-onまとめ, Qiita](http://qiita.com/mfujita/items/4d808c5648005e74b831)
- [Watson on Bluemixの始め方, Qiita](Watson on Bluemixの始め方)
- [Bluemix開発入門, ITPro](http://special.nikkeibp.co.jp/atclh/ITP/15/ibm1204/p2/index.html)

## サンプル
- [watson-developer-cloud/python-sdk, GitHub](https://github.com/watson-developer-cloud/python-sdk)

# Visual Recognition
## ドキュメント，記事
- [Watson Developer Cloud Visual Recognition](https://www.ibm.com/watson/developercloud/visual-recognition.html)
- [Watson Developer Cloud Visual Recognition Demo](https://visual-recognition-demo.mybluemix.net/)
- [Watson Developer Cloud Visual Recognition Document & Tutorials](https://www.ibm.com/watson/developercloud/doc/visual-recognition/)
- [Understanding the sample Visual Recognition application](http://www.ibm.com/watson/developercloud/doc/visual-recognition/sample.shtml)
- [Watson Developer Cloud Visual Recognition API Reference](http://www.ibm.com/watson/developercloud/visual-recognition/api/v3/)
- [Version UpしたVisual Recognitionで、Watsonをトレーニングして独自の画像判別モデルを作る！, Qiita](http://qiita.com/mfujita/items/a6bfcffae8097807f6a0)
- [IBM Bluemix と AlchemyAPI を使って画像認識アプリケーションを作る](https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Wdec01e50fbfa_493c_8a88_6dd85c4d983f/page/Bluemix%E3%81%A7%E7%94%BB%E5%83%8F%E8%AA%8D%E8%AD%98%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
- [Watson の画像認識 API を使う, まだプログラマーですが何か？](http://dotnsf.blog.jp/archives/1021477776.html)
- [AlchemyAPI の顔認識 API を使ってみる, まだプログラマーですが何か？](http://dotnsf.blog.jp/archives/1024251306.html)

## サンプル
- [watson-developer-cloud/visual-recognition-nodejs, Github](https://github.com/watson-developer-cloud/visual-recognition-nodejs)
- [watson-developer-cloud/python-sdk/examples/visual_recognition_v3.py](https://github.com/watson-developer-cloud/python-sdk/blob/master/examples/visual_recognition_v3.py)
- [alchemyapi_php_sample](https://github.com/dotnsf/alchemyapi_php_sample)

# Text to speech
## ドキュメント，記事
- [Text to Speech](https://nodejs-sample-app-20160821.mybluemix.net/)
c++ builder XE4, 10.2 Tokyo > TRichEdit > 文字列をドラッグできてしまう

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

関連 http://qiita.com/7of9/items/9c61467efe70cdf9f745

TRichEditについて以下のリンクを見つけた。
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=1163
> RichEditには、Drag&Dropによるカット＆ペーストが
ディフォルトで備わっていたんですね。

実際に試したところ、RichEdit1内の文字をドラッグで移動できた。

この機能は便利である一方、マウスだけでの誤操作を誘発する可能性もある。
個人的には切っておきたい機能だ。

TRichEditのプロパティで切れるというわけではなさそう。
http://stackoverflow.com/questions/3177802/how-to-disable-drag-drop-trichedit-or-trzrichedit

TMemoの方にはドラッグ機能はない（少なくともデフォルトでは)。
c++ builder > TEdit > 複数行にして表示 > TMemo / TRichEdit

```txt:動作環境
C++ Builder XE4
```

TEditの表示を複数行にしたい。
調べたところ、TEditにはwrapなどのプロパティはないようだ。

代わりのものとして、以下の選択肢がある。

- TMemo
- TRichEdit

二者の使い分けについては未消化。

TRichEditについては行間を変更できるようだ。
http://hiderin.air-nifty.com/delphi/trichedit/index.html

いずれを使用するにしろ、自分が作成した設定保存ライブラリにTMemo対応かTRichEdit対応が必要となる。
Pythonからコマンドを呼び出す（Windows編）


# 基本

os.systemを使うのが従来は一般的であったが，subprocessを使うのが現代的らしい．
参考： http://stackoverflow.com/questions/4813238/difference-between-subprocess-popen-and-os-system

```py
import subprocess

cmd = 'myprogram myargs'
returncode = subprocess.call(cmd)
```

簡単な呼び出しであればcallで十分だが，より汎用的かつ一般的にはPopenを使うのが良いらしい．
以下の参考文献によれば，Popenはコマンド実行をブロックしない（＝コマンドが終わるのを待たずに次の行に進める）という利点があり，callはPopenにコマンドブロックをつけた実装になっているようである．
参考： http://stackoverflow.com/questions/7681715/whats-the-difference-between-subprocess-popen-and-call-how-can-i-use-them

```py
import subprocess

cmd = 'myprogram myargs'
returncode = subprocess.Popen(cmd)
```

# 注意

しかしこれでは，dirやechoなどのWindows built-inコマンドを呼び出すことができない．
呼び出そうとしても，「指定されたファイルは見つかりません」というエラーが帰ってくる．
参考： http://stackoverflow.com/questions/19819417/how-to-use-subprocess-in-windows

解決策は，shell=Trueを付けること．

```py
import subprocess

cmd = 'dir .'
returncode = subprocess.Popen(cmd, shell=True)
```

先ほどの参考資料にも少しだけ記載があるように，Windowsでshell=Trueを付けると，実際にはコマンドプロンプト cmd.exe が呼び出されて，その上でコマンドが実行される．
このオプションを付けない場合 もしくは shell=Falseとした場合には，拡張子を含めた実際のファイル名を指定しないと呼び出しが発生しない．

# さらに注意

多くの人にはたぶん不要であるが，上記の通り，shell=Trueを付けて呼び出されるのはコマンドプロンプトであるため，Powershellの上で実行できる各種のシェルコマンドは，subprocessから呼び出すことはできない．
Bluemix：簡易ETLサービスDataConnectでジョブのスケジューラ実行を試してみた

**サービスの名前が変わったようなので、タイトルだけ名前変えてます**
**旧：DataWorks 
新：DataConnect**

Dataworks、いろいろクリックするといろいろオプションが出てくるので、便利そうだなと思いながら少しずつ試しています。

今回は、ETLジョブ（データコピーのジョブ）を即時じゃなくてスケジューラ実行してみました。

## 前提
即時実行したときの記録はこちら。
Dataworksの基本的な使い方もここに載せてますので適宜ご参照あれ。。
http://qiita.com/azzeten/items/a0b604c67d993387ff5e

## どうやってスケジューラ実行をする？

以下では「RUN」をすぐに選択してますが、
**今回はその左横の「SCHEDULE」をクリック！！**
![スクリーンショット 2016-08-22 18.44.34.png](https://qiita-image-store.s3.amazonaws.com/0/119378/27a6f290-1d51-1f28-d439-4073550c9eed.png)


## 何ができる？その１
**時刻を指定して、その時刻になったら自動でジョブ実行**
素直なパターンとしてはこちら。純粋に時刻を設定すればOK。
![スクリーンショット 2016-08-22 18.46.50.png](https://qiita-image-store.s3.amazonaws.com/0/119378/7439b1b8-dc40-f0ab-1305-be4e69469ce8.png)


## 何ができる？その２
**1分毎、など定期間隔でジョブを延々実行することが可能**
上記キャプチャの下のほうに、うすーく
**Schedule this activity to repeat**　と書いてあります・・（見つけづらい。。）
これをクリックすると以下のような画面が出現します。
![スクリーンショット 2016-08-19 10.50.34.png](https://qiita-image-store.s3.amazonaws.com/0/119378/2ed8c8dc-9dc9-91aa-97fc-3f84c262a4c8.png)



・何分ごとに実行しますか？
・いつまでそれを続けますか？
などを指定してあげることが可能です。

## これを活用して何が実現できるか考えてみた（個人の感想）

**・単純なバッチ的なデータ移動**
　→月１回、古くなったデータを移動する。
　→OLTP系のDBに集めたデータ（たとえばPostgreSQLに溜まったデータ）を、データ分析者が使うデータベース（たとえばdashDB）に毎日コピーしてあげる
　→日次でバックアップ的にデータを移したい

　などなど。

**・データベースのレプリケーション的に**
　→2つデータベースがあって、共通に使いたい表はレプリケーションさせたい。
　などなど。

　最短だと1分毎にジョブ実行できるようなので、1分のディレイはありますが、ゆるーいレプリケーションとしては要件によっては使えるかも？
テストコードって何を書けばいいの？検査網羅率（テストカバレッジ）とカバレッジ基準

- テストコードを書きたいけど、何を書けばいいのかわからない
- テストコードは書いたけど、テストケースにない不具合が見つかってしまった

等を防ぐため、テストケースを作る際の指標になる、検査網羅率（テストカバレッジ）とカバレッジ基準についてまとめました。

# 検査網羅率（テストカバレッジ）とは
カバレッジ基準に従ってどれだけのテストが実行されたかの割合のこと。


# カバレッジ基準とは
カバレッジを測定するための基準。
以下のサンプルで、それぞれのカバレッジ基準を解説していきます。

# サンプル
## 仕様
毎週水曜日はレディースデイ。
通常1,000円のところ、女性のお客様は500円で提供。

## コード

```rb
def price
  if lady? and wednesday?
    500
  else
    1000
  end
end
```

応用の利かないコードですが、わかりやすさのためこのまま解説します。

# カバレッジ基準
## 命令網羅

すべてのコードを実行する。

**テストケース作成観点**

- 1000を返すこと
- 500を返すこと

## 分岐網羅（判定条件網羅）
すべての分岐（if毎）のtrueとfalseを実行する。

**テストケース作成観点**

- `lady? and wednesday?`を満たす
- `lady? and wednesday?`を満たさない

今回のサンプルだと命令網羅と同じケースになるが、着目する観点が異なる。

## 条件網羅

すべての条件（ifの中の条件毎）のtrueとfalseを実行する。

**テストケース作成観点**

- `lady?`を満たす
- `lady?`を満たさない

- `wednesday?`を満たす
- `wednesday?`を満たさない


## 複合条件網羅

すべての条件の組み合わせを実行する。

**テストケース作成観点**

- `lady?`を満たすかつ`wednesday?`を満たす
- `lady?`を満たすかつ`wednesday?`を満たさない
- `lady?`を満たさないかつ`wednesday?`を満たす
- `lady?`を満たさないかつ`wednesday?`を満たさない


# まとめ
ここで説明した検査網羅率（テストカバレッジ）とカバレッジ基準は、ここまでテストすればOK、ここまでテストしなければNGというものではありません。ただ、自分の書いているテストコードが、何をテストし、何をテストしていないのかを把握し、チームやプロジェクトの時間の使い方や担保する品質と照らし合わせて、どこまでテストするかの基準にできればいいと思います。

以上、間違いがあれば教えてください。
Ubuntu16.04でNVIDIAドライバをインストールする方法（CUIが表示されない場合の対処法あり）

# まえがき
NVIDIAドライバをインストールするのに手間取ったので，ここにインストールまでの流れをまとめておきます．

# ドライバのダウンロード
まずは[NVIDIA公式ホームページ](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)からインストールしたいドライバをダウンロードします．
説明の都合上，ダウンロードしたファイルはダウンロードファイルにおいてください．(~/Downloads/NVIDIA-Linux-x86_64-367.35.run みたいな感じで)

# GUIからCUIへの変更＆CUIの表示確認
まずはUbuntuを起動させ，ログイン画面に行きます．その状態で Ctrl+Alt+F1 を押します．
ここで本来はCUIの画面が表示されるはずですが，私の場合，画面が真っ黒のままになってしまいました．

私と同じ状態の場合は Ctrl+Alt+F7 でGUIに戻ったあと，ターミナル上で以下のコマンドを実行して再起動してください．

```
sudo sed -i -e 's/#GRUB_TERMINAL/GRUB_TERMINAL/g' /etc/default/grub
sudo update-grub
```

再起動してログイン画面になったら再び Ctrl+Alt+F1 を押し，CUIがちゃんと表示されるか確認してください．

ちゃんと表示された場合は大丈夫です．

# インストール (CUI上)
まずはインストールするためにX window system を終了しなくてはなりません．次のコマンドを実行すると終了します．

```
sudo service lightdm stop
pkill Xorg
```

つぎにダウンロードしたドライバのrunファイルを起動します．

```
cd Downloads
chmod u+x NVIDIA-Linux-x86_64-367.35.run
sudo ./NVIDIA-Linux-x86_64-367.35.run
```

ファイル名は適宜変更してください．
あとは画面の指示に従っていけばインストールできます．

# 参考にしたページ
[とある理系院生の日記](http://blog.livedoor.jp/godepnikki/archives/38910903.html)
[Heijastin](http://9oe.me/distro/?p=413)
AndroidでTheta Sの360°画像からおっさんを消す

# 目的

1. Theta Sで撮った画像に写り込んだおっさんをSNSで共有できる程度にそこそこきれいに消す
2. 完全に、また作品として使えるほどきれいには消えないのでご注意を

# 事前準備

1. Theta S
2. [RICOH THETA Sアプリ](https://play.google.com/store/apps/details?id=com.theta360)
2. [THETA+](https://play.google.com/store/apps/details?id=com.thetaplus)
2. **[TouchRetouchアプリ](https://play.google.com/store/apps/details?id=com.advasoft.touchretouch)**
 → 有償ですが並のレタッチブラシではありません！！￥199なので買っておいて損はないです。
2. [Photosphere Xmp Tagger Free](https://play.google.com/store/apps/details?id=com.hirota41.photospheretagger&hl=ja)
3. マウス(スマホにつなげて使う。太いおっさんの指の場合必須。指でできる場合は不要)

# 手順

1. Theta Sでおっさんの頭が写った画像を撮る
2. THETA SアプリでAndroidに読み込んでおく
3. THETA Sアプリで、「THETA+で編集」してTHETA+アプリに読み込む(THETA+ではクロップ画像ではなく360°画像で読み込む)
4. そのまま、何もせず共有からギャラリーに保存する(THETA SアプリからPCなしで直接画像を吸い出す方法を知りたい！！)
5. TouchRetouchアプリで、保存した画像(Pictures/RICOH THETA以下にある)を読み込む(当然最大サイズで。ただし端末によっては最大サイズで読み込めないかも。その場合は泣く泣く小さいサイズで。)
6. TouchRetouchで消したい部分を投げなわやブラシで塗りつぶして、消す(ここでマウスが活躍)
7. 保存する
8. touchretouchフォルダに保存されているので、フォトアプリやその他のアプリで表示して、共有する
9. もし画像を明るくしたいなどの場合はここで修正する
9. Add Tagを選ぶと、自動的にメタデータが追加され、Picturesフォルダに保存される(メタデータを追加しなくてもRICOH THETA Sアプリだと360°画像として読み込めるが、facebookなどでは360°画像として認識されない)
10. 消したあとはこんな感じ(今回は影は消さなかったのでどこに立っていたかわかると思います)![Screenshot_20160822-172856.png](https://qiita-image-store.s3.amazonaws.com/0/78540/ecb47c8b-02cb-baf6-dc34-f4c012a722db.png)

# 終わりに

1. Androidでもぼかし機能が付けばこんなことをする必要はなくなるんだけど。。。。
2. 画像をリサイズするのがめんどうだったので、以下に。。。

![Screenshot_20160822-172346.png](https://qiita-image-store.s3.amazonaws.com/0/78540/a4bf0140-4fde-1757-9b7f-4028154b244e.png)
![Screenshot_20160822-172550.png](https://qiita-image-store.s3.amazonaws.com/0/78540/51d43fcd-13b7-1fe2-197b-0f6289343b2d.png)
![Screenshot_20160822-172735.png](https://qiita-image-store.s3.amazonaws.com/0/78540/44b5ef7a-3801-19b0-dab0-34767501bee8.png)
Homebrew でPHPのバージョンをあげる


PHPの勉強をしようと思い、使っているPHPのバージョンを調べたら古かったので、バージョンアップをしてみた。


```
# 確認
$ php -v
PHP 5.4.45

# リンクを解除
$ brew unlink php53
Unlinking /usr/local/Cellar/php53/5.3.29... 38 symlinks removed

# インストール
$ brew install php56
/usr/local/Cellar/php56/5.6.24: 331 files, 49.2M

# 確認
$ php -v
PHP 5.6.24 <= OK
```

簡単簡単。
nodebrew でnode.jsのバージョンを上げてみる


yoをアップデートしようとしたら

```
✖ Node.js version

Your Node.js version is outdated.
```
と怒られたのでアップデートしてみる

node.jsの管理にはHomebrewでインストールしたnodebrewを使ってます。

## 現在のバージョンを確認
```
$ node -v
v0.11.14
```

## nodebrewでリポジトリにあるバージョンを確認
```
$ nodebrew ls-remote
           :
           :
v4.4.0    v4.4.1    v4.4.2    v4.4.3    v4.4.4    v4.4.5    v4.4.6    v4.4.7
           :
           :
```

[node.jsのサイト](https://nodejs.org/en/)によると最新安定版は`v4.4.7`だということなので、それをインストール

```
nodebrew install v4.4.7
           :
           :
           :
           :
```
インストールまで結構掛かる・・・

## バージョンの切り替え
インストールが終わったら切り替える

```
$ nodebrew use v4.4.7

// 確認
$ node -v
  v4.4.7 <= 変わってる！
```

## npmのバージョンアップ
npmも一緒にあげときましょう

```
// 確認
$ npm -v
  2.9

$ npm install -g npm

// 再度確認
$ npm -v
  3.10.5 <= 上がってる
```

これで目的のyoのアップデートも問題なしです。
Lua初めの一歩


ちょっとした必要性から、概要は理解しておこうと思い、[Lua](https://www.lua.org/)という言語を少し触ってみました。言語自体は、Homebrewでインストールできますし（一瞬でダウンロードされる）、記法もシンプルなのでとりあえず始めようという場合にはハードルはすごく低かったです。

## Luaって？

公式HP: [The Programming Language Lua](https://www.lua.org/home.html)

Wikipedia: [Lua（日本語）](https://ja.wikipedia.org/wiki/Lua)

- いわゆる汎用スクリプト言語。Perl、Python、Rubyと比較して高速に動作する。
- 理念は、簡素、高効率、高移植性。
- 動的型付け言語。
- Pascalによく似た構文を採用している。
- コルーチンをサポートしている。
- 数値型は整数と浮動小数点数の区別がない。
- いろんな言語と組み合わせて使える。
- グルー（糊）言語と言われることもある。
- さまざまなプラットフォームで利用できる。
- リオ・デ・ジャネイロの大学で開発され、言語名はポルトガル語で「月」に由来する。
- メモリ管理を自動で行う。

## インストール

```bash
$ brew install lua
```

## Hello, World

```bash
$ lua
```

`lua`コマンドを打つとすぐに、対話的に書きはじめることができます。

例えばこんな感じですね。

```bash
> print("Hello World")
Hello World
```

## ファイル

ファイルを作りたい場合は、`.lua`とファイル名につけます。実行時には、`$ lua xxx.lua` とやるだけです。

最初に階乗を計算するコードを書いてみます。

```lua
#!/usr/bin/env lua

function fact(n)
  if n == 0 then
    return 1
  else
    return n * fact(n - 1)
  end
end

print("enter a numbrer: ")
a = io.read("*number")
print(fact(a))
```

シンプル！

## コメント

初めてですこの書き方。

```lua
--[[
コメント
]]
```

## 型

基本型は下記8種類。ちょっとした特徴も併記してみます。

- **nil**
	- 非値(non-value)をあらわす。変数を宣言した直後はnilとなっている。
- **boolean**
	- true/false. 0と空文字はtrue
- **number**
	- 実数（倍精度浮動小数点数)を表す。Luaに整数型はない。
- **string**
	- 文字列連結は`..` ex: `print('a' .. 'b') -> ab`
- **userdata**
	- Cの任意のデータをLuaの変数に格納することができる（どういうことだろう）。
- **function**
	- ファーストクラスの値なので、変数に格納したり、他の関数への引数として渡したり、返り値にすることができる。
- **thread**
- **table**
	- 可変長の連想配列。実質的にLuaの唯一のデータ構造化機構。
	- もっとも単純なコンストラクタ式は `a = {}`
	- 配列を表現するには整数をキーにする。 **配列のインデックスは1から始まるのが慣例** 。
	- `#` が要素の数を返す。 ex: `print(a[#a]) -- リストaの最後の要素を出力`

## Atomエディタ

エディタは、[Atom](https://atom.io/)を使っているのですが、とりあえず、[language-lua](https://atom.io/packages/language-lua)を入れておくと、シンタックスハイライトをしてくれるので便利です。

## 参考図書

[Programming in Lua プログラミング言語Lua公式解説書](http://amzn.to/2bbg4Ja)を使いました。ちょっと古いのですが、どんな言語かもわからないのに最新版の英語を読むのはちょっと僕にとってはハードルが高かったのでこちらにしました。

<a href="https://www.amazon.co.jp/Programming-Lua-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9ELua%E5%85%AC%E5%BC%8F%E8%A7%A3%E8%AA%AC%E6%9B%B8-Roberto-Ierusalimschy/dp/4048677977/ref=as_li_ss_il?ie=UTF8&qid=1471856224&sr=8-1&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9Elua&linkCode=li3&tag=morizotter0f-22&linkId=b26b5961b2a315343bc4c66dae00239f" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4048677977&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=morizotter0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=morizotter0f-22&l=li3&o=9&a=4048677977" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
ワイヤレスマウスを安価な物理ボタンとして使う

家の照明などを操作しようと思うと、やはりモバイルアプリよりも簡単な物理ボタンが欲しくなることは多いと思います。

流行に身を任せて、市販の[IoTボタン](https://www.amazon.com/dp/B01C7WE5WM/)を買ったり、Arduinoや[ESP8266](http://qiita.com/ie4/items/ae850cdb2c617f3fd6af)などで電子工作したりしてもいいですが、USBでつながる普通の無線マウスで実用的には十分なことがあったので紹介します。

ほかのIoTボタンと比べてこんなメリットがあります。

* 安い ([737円](https://www.amazon.co.jp/dp/B0079RLYG6)とか)
* どこでも手に入る
* 設定が不要
* 乾電池で動作して長持ち
* ホイールが使える

## マウスで電球スイッチ
今回は、家全体の電球を操作するボタンをつくるのを例に説明します。電球にはPhilips Hueを使って、HTTP API経由で電球を制御します。このようなものを使います。

* [USB接続のワイヤレスマウス](https://www.amazon.co.jp/dp/B0079RLYG6)
* Raspberry Pi (常時稼働のマシンならなんでもOK)
* 制御するもの (今回はHue)

マウスをクリックすると家全体の電球がON/OFFになって、スクロール用のホイールを上下にすると明るさを調整できるイメージです。

![image](https://qiita-image-store.s3.amazonaws.com/0/275/8d8f050d-0ea5-92be-6ca9-282babb53904.png)

## マウスのメッセージを読む
Unixにはデバイスファイルというものがあり、`/dev/input/mice`や`/dev/input/event0`などにマウスのボタンが押されたというようなメッセージが流れてくるので利用します。 
今回はNode.jsのモジュールを使いますが、大した処理ではないので言語は関係ないし、ライブラリがない場合でも調べればスッと書けるかと思います。

マウスがクリックされたときに何かをするにはこういう感じ。 `node-mouse`は `/dev/input/mice`　を読んでメッセージをパースしていい感じに呼んでくれる。

```js
const Mouse = require('node-mouse')
const mouseDevice = new Mouse()

mouseDevice.on('click', e => {
  const isLeftClick = e.button === 0
  if (isLeftClick) {
    updateLight()
  }
})
```

ホイールに関するメッセージは`/dev/input/mice`や`/dev/input/mouse0`には流れてこないので、`/dev/input/event0` などから読む必要があります。
できるだけコードを書きたくないのでここでは`input-event`というモジュールを使います。こういう感じ。

```js
const InputEvent = require('input-event')

const input = new InputEvent('/dev/input/event0')
const eventDevice = new InputEvent.Mouse(input)

eventDevice.on('wheel', e => {
  const direction = e.value === 1 ? 1 : -1
  updateLight({ bri: bri + direction * 10 })
})
```

実際にはホイールイベントが大量に発火して変にならないように、throttleしたりする。
https://github.com/uiureo/home/blob/master/mouse/index.js

## まとめ
僕は実際に便利に使っていて、自宅でベッド横の壁に養生テープで貼り付けて毎晩寝る前に利用しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/275/04af62c3-ebf2-88a2-72e8-6cefb8f18124.png)

内部はHTTP APIを叩いているだけなので、ボタンを押すたびにトイレットペーパーを注文したりとか電球の制御以外にもアイデア次第で色々使えるかと思います。

あと、接続先から少し遠くに離れた場合でも案外うまく動くようでした。部屋の下の階からでもうまくいったし、

デメリットとしては

* 見た目がマウスなのでかっこよさは低い
* 単独で動作しない

がありますが、安さを考えると、場合によっては許容できると思います。
IoT感がなくて興奮しないけど、見た目の割に案外実用的なので機会があればいかがでしょうか。

この記事の内容は、[Kyoto.なんか #2](https://atnd.org/events/79718) で発表したものです。
Pythonで<br>dictのキーに<br>文字列以外を使う

# dictのキーには文字列をよく使うけど...

```py3
stock = {
    "orange": 3,
    "apple": 1,
}
```

---
# 実は文字列以外も使える

```py3
d = {
    1: "数値",
    date(2016, 1, 1): "日付"
    (1, 2): "タプル",
    None: "None"
}
```

---
# キーの仕様
- ハッシュ可能でイミュータブルなオブジェクトならなんでも使える
- １つのdictに複数の型が混在していてもOK
- NoneでもOK

---
# キーに使える型の例

- str
- int
- date
- Enum
- tuple
- 関数

---
# 実践例

---
# 実践例
- タプルで複合キー
- リストの代わりに数値キーのdictを使う

---
## タプルで複合キー

```py3
stock = {
    ("東京支店", "orange"): 3,
    ("東京支店", "apple"): 1,
    ("名古屋支店", "orange"): 8,
}
stock["名古屋支店", "apple"] = 4
```

---
### リストの代わりに数値キーのdictを使う

- キーに欠落があっても大丈夫

```py3:
a = {
    1: "apple",
    3: "orange",
}
```

---
### リストの代わりに数値キーのdictを使う

- defaultdictと組み合わせれば効果的

```py3:
from collections import defaultdict
a = defaultdict(str)
a[1] = "apple"
a[3] = "orange"
l = max(l.keys())
for i in range(0, l + 1):
    print("%d: %s" % (i, a[i]))
```

```
0: 
1: apple
2: 
3: orange
```
Rails4　マイグレーションファイルを修正するときにやること

```shell-session
rails g model some_model
```

で作成されたマイグレーションファイル(db/migrate/20160816044025_create_some_models.rb)
を

```shell-session
rake db:migrate
```
して、__あ、やっぱりカラム増やしたいな、名前変えたいな__と思ったとき

```shell-session
rails g migration changeColumnsSomeModels
```

とするよりは、

```shell-session
rake db:rollback
```
でロールバックしてdb/migrate/20160816044025_create_some_models.rb　を書き換えて

```shell-session

rake db:migrate 
```

をやった方が、ファイルをふやさずにすむね！！！！
Docker環境でSonarQubeを構築する

# 概要

静的コード解析ツールである[SonarQube](http://www.sonarqube.org)をDockerを使って構築してみました。

# 手順

## MySQL設定&起動

MySQL用のデータボリュームコンテナを作成。

```bash
$ docker run -d \
-v /usr/local/data/mysql-sonarqube:/var/lib/mysql \
--name busybox-sonarqube \
busybox true
```

MySQL用の設定ファイルを作成。

```text:/usr/local/data/mysql-sonarqube-conf/custom.cnf
[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8
```

MySQL起動。

```bash
$ docker run -d \
--name mysql-sonarqube \
--volumes-from busybox-sonarqube \
-v /usr/local/data/mysql-sonarqube-conf:/etc/mysql/conf.d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=XXX \
mysql
```

MySQLのコンテナに入ってSonarQube用のDBを作成。

```sql
CREATE DATABASE sonar CHARACTER SET utf8;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
```

## SonarQube起動

```bash
$ docker run -d \
--name sonarqube \
--link mysql-sonarqube:mysql \
-p 9000:9000 \
-p 9092:9092 \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
-e "SONARQUBE_JDBC_URL=jdbc:mysql://mysql:3306/sonar?useUnicode=true&characterEncoding=utf8" \
sonarqube
```

## ブラウザから確認

「http://[サーバのアドレス]:9000/」にアクセスしてSonarQubeのDashboardが表示されたら成功です。
onlineTool > Gantt Diagram > mermaid

ガントチャートを描くツールを探した。

エディタ: http://knsv.github.io/mermaid/live_editor/
文法: http://knsv.github.io/mermaid/#syntax37


例

```
gantt
  title Interrupt of private project
 
  section Section
  FPGA study : a1, 2016-06-22, 30d
  MSC-MOD20 analysis : a2, after a1, 20d
  LinearDriver : a3, after a2, 10d
  Inventory : a4, after a3, 3d
  LinearDriver : a5, after a4, 5d
  MSC-MOD20 analysis : a6, after a5, 20d
  FPGA study : a7, after a6, 20d
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3c1055c9-9314-221b-d5c2-9a2c030e3c35.png)

FPGAの勉強に戻れるのは当分先のようだ。

## link to view

(追記 2016/12/06)
Link to Viewというリンクがあった。
[上記のチャートのリンク](http://knsv.github.io/mermaid/live_editor/#/view/Z2FudHQKICB0aXRsZSBJbnRlcnJ1cHQgb2YgcHJpdmF0ZSBwcm9qZWN0CgogIHNlY3Rpb24gU2VjdGlvbgogIEZQR0Egc3R1ZHkgOiBhMSwgMjAxNi0wNi0yMiwgMzBkCiAgTVNDLU1PRDIwIGFuYWx5c2lzIDogYTIsIGFmdGVyIGExLCAyMGQKICBMaW5lYXJEcml2ZXIgOiBhMywgYWZ0ZXIgYTIsIDEwZAogIEludmVudG9yeSA6IGE0LCBhZnRlciBhMywgM2QKICBMaW5lYXJEcml2ZXIgOiBhNSwgYWZ0ZXIgYTQsIDVkCiAgTVNDLU1PRDIwIGFuYWx5c2lzIDogYTYsIGFmdGVyIGE1LCAyMGQKICBGUEdBIHN0dWR5IDogYTcsIGFmdGVyIGE2LCAyMGQ)

このリンクはいつまで有効なのか未調査。

### 終了日の指定方法
(追記 2016/12/06)

3列目を終了日とする

```
gantt
  title Interrupt of private project

  section Section
  AAA : a1, 2016-06-22, 2016-07-23
  BBB : a2, after a1, 2016-08-15
```