OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressのプラグイン開発のときに使うPluginsや役立つサイトなど

# はじめに
　[cloud9](https://c9.io/)便利です。php7.0以上の環境を作るのに一手間ありますが、ブラウザ上で開発環境が揃ってしまうのは素敵です。今回、プラグイン開発をするにあたり、使用したWordPressのPluginsをメモしておきます。

## プラグインとPlugin(s)

　文中に幾つかプラグイン/Plugin(s)の言葉が出てきますが、下記のように使い分けてます。

- プラグイン：自分が開発をした、便利になるはずのツール。
- Plugin(s)：WordPressのプラグインディレクトリで公開されている、使うと便利になるツール。

# 使用した標準機能

```php:wp-config.php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true ); // Turn forced display OFF
define( 'WP_DEBUG_LOG',     true );  // Turn logging to wp-content/debug.log ON
define( 'WP_POST_REVISIONS', true ); // Disables revision functionality
```

- `WP_DEBUG` : デバッグモードON。通常の状態はOFF。各種デバッグ機能が使えるようになる。
- `WP_DEBUG_DISPLAY` : デバッグ情報を画面に出力する。phpのNoticeなどの細かいエラーとか表示されるようになります。
- `WP_DEBUG_LOG` : ログを出力してくれます。「リダイレクトが発生して画面にログが残らない！どうしよう！？」`save_post`のアクションの実行時、重宝します。`error_log("ログに残したい文言");`とすることで記録されます。
- `WP_POST_REVISIONS` : 記事のリビジョン管理を止めます。

# 使用したPlugins

## [Query Monitor](https://github.com/johnbillion/query-monitor)

　SQLクエリの実行時間が実行したページで確認することができる。他のPluginで[Debug Bar](https://wordpress.org/plugins/debug-bar/)もありますが、確認できる項目はQuery Monitorのほうが多いです。

　呼び出されるフック(Hook)も確認できます。

## [Easy Query – WP Query Builder](https://wordpress.org/plugins/easy-query/)

　WP_Queryのオプションを生成してくれるPlugin。細かいオプションの指定は有料版を購入するか、自分でマニュアルを参照しながら書いていく必要がありますが、大まかなオプション指定はできるのでマニュアルを紐解きながらWP_Queryのオプションを書かなくていいので便利です。

## [WP Crontrol](https://wordpress.org/plugins/wp-crontrol/)

　WordPressのcronの設定状況が確認できるPlugin。登録済みcronの即時実行ができたり、削除したりすることができる。追加することもできるが、実行内容を`functions.php`にコードを書く必要がある。

# 役立つサイト

## [WORDPRESS PLUGIN BOILERPLATE GENERATOR](https://wppb.me/)

- プラグイン名
- プラグインのスラッグ
- プラグインの紹介URL
- 開発者名
- 開発者メールアドレス
- 開発者ホームページ

　これらを入力するだけで、あっというまにプラグイン開発に使えるテンプレート(ボイラープレート)が生成されます。生成されるファイルが多いので最初は戸惑いますが、機能ごとでファイルが別けてあることに気づくことができれば、きれいなプラグインを作ることができると思います。

## [GenerateWP - User friendly tools for WordPress developers](https://generatewp.com/)

　マニュアルを読みながらコードを書くより、穴埋め項目に記入していくだけで該当するコードを生成してくれるサイト。ただ、ちょっとパラメータが多すぎ＆意味分からない時があって、マニュアルを確認しながらコードを書くことになることも しばしば。ただ、ゼロの状態から作るよりは楽なので便利。

# さいごに

## [if link is 404(broken), then set to private.](https://wordpress.org/plugins/if-link-is-404broken-then-set-to-private/)

　宣伝です。今回、開発したプラグインです。記事ごとに指定できるURLを、定期的にクロールします。指定URLがエラー(404, 503など)だったとき、その記事を非公開にします。

　開発をしてるWebサービスのポートフォリオを整理して公開しようと思ったのですが、なんらかの理由で公開停止したWebサービスがポートフォリオから自動的に消えるといいなと思っていたのですが、Laravelでポートフォリオ用のサイトを作るのも時間コストがかかりすぎるし、WordPressで久しぶりにプラグイン開発をしようと思い、[if link is 404(broken), then set to private.](https://wordpress.org/plugins/if-link-is-404broken-then-set-to-private/)が出来上がりました。

## もっともっと楽できるはず！
　もっともっと楽に開発できると思うので、「WordPressのプラグイン開発してるとき、コレ使ってます」とかあれば教えてください！
jQuery Mobileメモ

jQuery Mobileを使う作業が発生したのでメモ。

- [jQuery Mobile](http://jquerymobile.com/)
- [jQuery Mobile逆引きリファレンス](http://www.buildinsider.net/web/jquerymobileref)
- [ThemeRoller](http://themeroller.jquerymobile.com/)



作業用メモ

```
^.*[\s\S]\<header.*[\s\S].*<h1>(.*)</h1>.*[\s\S].*<a.*>(.*)</a>.*[\s\S].*</header>
  <header data-role="header">\n    <h1>$1</h1>\n    <a href="" class="ui-btn ui-btn-icon-left ui-icon-home" data-ajax="false">$2</a>\n  </header>

^.*[\s\S]<.*navbar">.*[\s\S].*.*[\s\S].*<a.*href=\"(.*?)\".*>(.*)</a.*[\s\S].*<a.*href=\"(.*?)\".*>(.*)</a.*[\s\S].*.*[\s\S].*</div>
  <nav class="c-pager">\n    <ul class="ui-grid-a">\n      <li class="ui-block-a"><a href="$1" class="ui-btn ui-btn-icon-left ui-icon-carat-l">$2</a></li>\n      <li class="ui-block-b"><a href="$3" class="ui-btn ui-btn-icon-right ui-icon-carat-r">$4</a></li>\n    </ul>\n  </nav>
```
Macでマウントしたdmgからインストールできないとき


dmgをマウントして、ご指示の通りpkgをダブルクリックした後。

![VirtualBox.jpg](https://qiita-image-store.s3.amazonaws.com/0/25240/ea8bc8f7-0bcb-7c76-5aec-14e82193a309.jpeg "VirtualBox.jpg")

検証中で止まってしまい、全く先に進まない。

ターミナルからsudo使ってインストールするような情報があったけど、ターミナルなしでもいけるんじゃないかと思って調べてみた。


Finderから

```
Macintosh HD > システム > ライブラリ > CoreServices
```

を開き、

![CoreServices.jpg](https://qiita-image-store.s3.amazonaws.com/0/25240/07cb7f9b-1bd6-09ef-8fd4-fc3eca916475.jpeg "CoreServices.jpg")

インストーラをクリック。
pkgがある場所まで移動して、pkgをダブルクリック。

![Open.jpg](https://qiita-image-store.s3.amazonaws.com/0/25240/ba1d19c5-6fdd-e9d6-9f39-39b515fe21e4.jpeg "Open.jpg")


![Oracle_VM_VirtualBox.jpg](https://qiita-image-store.s3.amazonaws.com/0/25240/20b7aa1c-fde5-1c41-6b6b-9c63a3871356.jpeg "Oracle_VM_VirtualBox.jpg")

無事インストーラが起動するところまでたどり着きました。
partykitによる回帰木の可視化の調整

# はじめに
この記事では、Rで葉の多い回帰木を描画する際の工夫を記録しておきます。
使用するパッケージは決定木の計算でrpart、描画でpartykitを想定しています。

勉強のため、ご指摘等いただけると助かります。

(参考：partykitのドキュメント https://cran.r-project.org/web/packages/partykit/partykit.pdf)

# 動機
決定木で分析する際、木をある程度成長させたほうが良い示唆が得られることがあります。
過学習の問題とはうまく付き合う必要がありますが。

決定木の可視化を行うパッケージpartykitは、特に投入変数にカテゴリー変数が含まれる場合にとてもわかりやすいため、私はよく使っています。

ただ回帰木で葉が多いときの出力結果は、時折イマイチなことがあります。
探してもあまり良い記述がなかったため、ここに記録しておきます。

# 決定木の計算
ここではボストン市の住宅価格(Boston)を用います。
不動産価格を多くの投入変数から説明することを試みます。

データセットの中身は次のページがわかりやすく解説しています。 
[The Boston Housing Dataset](http://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html "scikit-learn に付属しているデータセット")

## ライブラリ

```
library(MASS)
library(rpart)
library(partykit)
```

## 実行

```
>tree <- rpart(medv ~., data=Boston, method='anova')
>print(tree)


n= 506 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 506 42716.3000 22.53281  
   2) rm< 6.941 430 17317.3200 19.93372  
     4) lstat>=14.4 175  3373.2510 14.95600  
       8) crim>=6.99237 74  1085.9050 11.97838 *
       9) crim< 6.99237 101  1150.5370 17.13762 *
     5) lstat< 14.4 255  6632.2170 23.34980  
      10) dis>=1.5511 248  3658.3930 22.93629  
        20) rm< 6.543 193  1589.8140 21.65648 *
        21) rm>=6.543 55   643.1691 27.42727 *
      11) dis< 1.5511 7  1429.0200 38.00000 *
   3) rm>=6.941 76  6059.4190 37.23816  
     6) rm< 7.437 46  1899.6120 32.11304  
      12) lstat>=9.65 7   432.9971 23.05714 *
      13) lstat< 9.65 39   789.5123 33.73846 *
     7) rm>=7.437 30  1098.8500 45.09667 *

```

決定木が得られました。

## 可視化
rpartでも可視化できますが、ここではpartykitを使用します。

```
> plot(as.party(tree))
```
![図１.png](https://qiita-image-store.s3.amazonaws.com/0/189855/49b6fbeb-8c1b-7657-083a-615c015957f7.png)

部屋数（rm）が多いほど価格が高いことがわかります。
この場合はbox chartでもわかりやすいです。

ただし実務上では、よりわかりやすく平均値を表示することがあります。
このためにplot関数に`type='simple'`を渡します。

```
> plot(as.party(tree), type='simple')
```

![図２.png](https://qiita-image-store.s3.amazonaws.com/0/189855/bf42310a-e966-7705-f1fc-f8f5ba61580b.png)

重なって見づらくなってしまいました。。
葉を少なくすれば重なりは解消されますがここでは木をある程度成長させる場合を考えます。

## 修正
さきほどの葉の重なりを解消するため、葉に記載する情報を整理することを考えます。
まず有効数字は幅を取りすぎているため、減らします。
また誤差の出力をやめることでも、スペースを確保できそうです。
無視して良いということではありませんが。

partykitのplotにおいて、tp_argsに値を渡すことで、ターミナルノードの出力を制御できます。
ここでは平均値とN数を、指定した桁数で、それぞれ y = , n = の形で返す関数を渡します。

```
plot(as.party(tree), type='simple',tp_args = list(FUN = function(info)
  c(paste('y = ',format(round(info$prediction, digits=1), nsmall = 1), sep=''),
    paste('n = ',format(round(info$n)), sep=''))
  ))
```

![図３.png](https://qiita-image-store.s3.amazonaws.com/0/189855/a46d6df6-826f-9185-51a5-79b0b7343566.png)

重なりは解消されました。葉同士の平均値の上下関係も見やすいです。

# おわりに
決定木はとても便利ですが、この便利さは結果の解釈の簡単さに起因しています。
よりわかりやすく可視化すれば、自分が見つけた示唆がより他人に伝わると考えています。

より良い方法がありましたら、ご教授いただけると幸いです。
ネイティブアプリの不都合な真実

# 

10周年記念iPhoneも発表されてAppleは調子が良さそうです。実際そうでApp Storeの収益も順調に伸びているとかなんとか。

そんな話もありながらユーザーのアプリの使い方がかなり偏ってきているというデータが集まってきたので紹介します。

**スマホユーザーがアプリをダウンロードしなくなった**

![](https://cdn-images-1.medium.com/max/1000/1*la9JZYJJl7ysKUuX9CpwDw.png)
<span class="figcaption_hack">[qz.comの出典元](https://qz.com/253618/most-smartphone-users-download-zero-apps-per-month/)</span>

アメリカのスマホユーザーの65%は過去一ヶ月に一個もアプリをダウンロードしていません。2014年のデータですので、今はもっとひどいかもしれません。

**いつも使うアプリしか使わない**

![](https://cdn-images-1.medium.com/max/1000/1*HT-HFglzfBw7dEwH0kZ1Mg.png)
<span class="figcaption_hack">[marketingland.comの出典元](about:invalid#zSoyz)</span>

この2016月6月に作られたグラフを見るとスマホ内の時間の45%がトップのアプリに費やされているのが分かります。実に84%(45+18+10+7)がトップ5のアプリの中で費やされているんです。

**いろんなアプリを起動してない**
![](https://cdn-images-1.medium.com/max/1000/1*n2b4rP3fg6taAitYJrzCgA.png)
<span class="figcaption_hack">[recode.comの出典元](https://www.recode.net/2017/9/11/16273578/smartphones-google-facebook-apps-new-online-traffic)</span>

アプリのローンチ数が2016年1月から比べてスマホで22%落ちています。タブレットはもっとひどくて49%落ちている。タブレットはYoutube再生専用デバイスになってしまったんでしょうか。<br>
多分いつも使うアプリを開けっ放しにしてそればっかり使っているからこうなっているんでしょう。

**結論：ネイティブアプリなんか作っても誰も使ってくれない**

よくAppleのプレゼンとかで出てくるいろんなアプリがあるというスライドですが実際赤で囲ったものくらいしか使われてないみたいですね。

![](https://cdn-images-1.medium.com/max/1000/1*hoY-a38AZXlcj3hIzGKGLQ.jpeg)

[Mediumの元の記事](https://medium.com/@takeshiamano/%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%B8%8D%E9%83%BD%E5%90%88%E3%81%AA%E7%9C%9F%E5%AE%9F-38c62d9628cd)
PWA化したことで各KPI改善が分かるPWA Stats

PWAの事例は[GoogleのCase
Studies](https://developers.google.com/web/showcase/2017/)のページに多く紹介されています。

[PWA Stats](https://www.pwastats.com/)
は各PWAのコンバージョン率増加などのKPIの変化がリストアップされていて分かりやすく整理されています。

![](https://cdn-images-1.medium.com/max/1000/1*TB5RmDw3itd1sC_F1lNDIA.png)

注意：<br>
PWAを導入してコンバージョン率がxx%あがったという事例はほとんどの場合既存のPWAでないwebアプリとの比較です。断りが無い限りネイティブアプリとの比較ではありません。<br>
ある会社がネイティブアプリを開発・運営していてwebアプリにはそんなに力をいれていなくwebアプリをPWA化した場合は当然コンバージョン率アップなどでいい数字がでます。<br>
ネイティブアプリとPWAを比較したものでは無い事が多いので注意してくださいね。

いくつか事例を紹介してみましょう。

[購入物件検索サイトのSettled](https://www.thinkwithgoogle.com/intl/en-gb/advertising-channels/mobile/settled-reduces-mobile-page-load-times-nearly-3x/)
SettledのPWAは既存のwebサイトに比べページロードが3倍速くなり、コンバージョン数が23%あがり、コンバージョン毎のコストが14%下がりました。

[航空券購入サイトのWego](https://www.youtube.com/watch?v=_pmjBZi5zY0)
PWA導入後訪問者数が26%増え、95%コンバージョン数が増えました。iOSだけみてもコンバージョン数が50%増え、セッション時間が35%アップしています。

[インドのタクシーアプリOla](https://developers.google.com/web/showcase/2017/ola)
この事例はネイティブアプリとの比較の様です。<br>
PWA導入後モバイルへのトラッフィクが68%増えました。PWAを使って予約したユーザーの20%が以前ネイティブアプリをダウンロードして消していました。<br>
PWAのアプリサイズは約200KBなので、これはAndroidアプリの1/300、iOSアプリの1/500のサイズです。

[Lancome USAのECサイト](https://developers.google.com/web/showcase/2017/lancome)
PWA後コンバージョン数は17%増え、モバイルセッション数が51%増えました。iOSだけみてもセッション数が51%あがっています。

PWAに完全対応してないiOSでもKPI改善が見られているいい事例です。

Androidで一度PWAをホームボタンに保存したユーザーにはpush通知が送れます。そんなユーザーに対し１ヶ月に4,5回push通知を送ったところ、push通知を開いた8%のユーザーが購入しました。<br>
カートに商品を入れて購入まで行かなかったユーザーに対してpush通知を送ったところ18%のユーザーがpush通知を開き、一度カートに商品を入れた後のコンバージョン率が8%増加しました。

[Forbes](https://www.youtube.com/watch?v=JmC0xkCMFCE)
モバイルサイトをPWA化したことで、ユーザ毎のセッション数が43%増加し、広告を見た数が20%増え、エンゲージメントが100%増加しました。

PWAの事例は特に業態は関係なく様々なKPIが改善されているのが分かりますね。

Service WorkerなどPWAへの対応が遅れているiOSでもWegoやLancome
USAの事例からも改善が見られているのでネイティブアプリの様なユーザー体験を提供するだけでiOSでもKPIの改善が十分期待できますね。

[Mediumの元の記事](https://medium.com/@takeshiamano/pwa%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%81%8C%E6%95%B0%E5%80%A4%E5%8C%96%E3%81%95%E3%82%8C%E3%81%A6%E3%82%8Bpwa-stats-f901b9d364ae)
webサイト制作時の画像処理・表示方法

#**＜webサイトを製作する際には、画像の最適化と再圧縮を行う＞**
 *参考書籍：「マルチデバイス対応サイト構築　/ エ・ビスコム・テック・ラボ（著）」*
##●JPEGやPNGフォーマットの画像は、符号化処理の最適化や、カラープロファイルといったメタデータ（マーカ）の削除などにより、画質に影響を与えずにデータ量を削減できる。
この処理は「最適化」や「ロスレス圧縮」と呼ぶ。
※元の画像を作成したツールによっては最適化処理によってデータが多きくなる場合もあるので要注意。

【画像の最適化するツール】
・jpegtrain
・jpegoptim
・OptiPNG
・PNGOUT

##●さらに見た目の品質を維持しながら、再圧縮することで、よりデータ量を減らすことができる。
【画像の最適化 & 再圧縮するツール】
・media4x
・OPTIMIZILLA




#**＜レスポンシブサイト作成時の画像表示方法＞**
##●img要素を表示サイズで変化させる
【html】
\<img src="img/header.jpg" alt="" class="photo"\>

【css】
.photo{
	width: 100%;
	height: auto;
	vertical-align: bottom;
}

※ vertical-align: bottom　は画像の下に余白を入れないように指定。


##●背景画像を可変サイズでトリミングさせる
backgroun-color: cover にすることで、背景画像は表示サイズの変化に応じて、ボックス(div)の大きさでトリミングされる。
この時に、トリミングの中心となるポイントをbackground-positionで指定する。
【html】
`<div class="photo></div>`

【css】
.photo {
	width: 100%;
	height: 200px;
	background-image: url(img/header.jpg);
	background-size: cover;
	background-position: 50% 50%;
}



##●picture要素で画像の切り替えを行なう
CSSやjavascriptを使用しなくても、下記のコードのようにsource要素のmedia属性でブレイクポイントを設定して、
画面サイズに合わせて画像が拡大縮小される。注意点としては、最後にimg要素を記述することを忘れないようにする。
【html】
`<picture>
  <source media="(min-width: 768px)" srcset="images/picture_l.gif">
  <source media="(min-width: 321px)" srcset="images/picture_m.gif">
  <img src="images/picture_s.gif" alt="###">
</picture>
`
Splunkの実行結果をPythonを使って処理、ファイルに保存する

　Pythonを使って、Splunkの実行結果を処理する方法を紹介します。

#Splunkの実行結果を受け取る
　Python上でSplunkの実行結果を受け取るには以下のメソッドを使用します。

```py:
  splunk.Intersplunk.getOrganizedResults(input_str = None)
```

このメソッドは実行直前のサーチ文の結果を辞書のリスト形式にして返します。例えば、下図の実行結果であれば、
![スクリーンショット 2017-09-18 15.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/201618/03567bb3-f70f-c156-1d25-cc7e716718c2.png)

メソッドが返す形は以下になります。フィールド名が辞書のキーになるというわけです。

```text:
[{'_time':'2017-09-01 05:05:14', 'MAC':'66:22:33:44:55:66'}
 {'_time':'2017-09-01 05:13:16', 'MAC':'11:22:33:44:55:66'}
 {'_time':'2017-09-01 05:13:19', 'MAC':'11:22:33:44:55:66'}]
```

#Pythonでの処理結果をSplunkに渡す（表示させる）、ファイルに書き出す
　上とは反対に、PythonからSplunkにデータを渡すには以下のメソッドを使用します。

```py:
splunk.Intersplunk.outputResults(results, messages = None, fields = None, mvdelim = '\n', outputfile = sys.stdout)
```

　必要な引数の"results"は、"getOrganizedResults"が返す"results"と同じく辞書のリストです。また、引数"outputfile"にファイルオブジェクトを指定することで、ファイルへの書き出しも可能です。

#使用例

　使用例として、Splunkから受け取った結果の"MAC"フィールドが"11:22:33:44:55:66"であれば、"decision"フィールドに"known"を、違う場合は"unknown"をセットし、その結果をCSVファイルに保存、Splunkに表示させるカスタムサーチコマンドを作成します。

　なお、SplunkでのPythonを用いたカスタムサーチコマンドの作り方は以下で紹介していますので、ご存じない方は参照いただければと思います。
[カスタムサーチコマンドの作り方（Splunk）](http://qiita.com/myogada/items/c5a2985882c4b3f30e31)


　ログのサンプルとして、以下の無線LAN APのログを使用します。
　（STAの後ろにMACアドレスが記載されています。）

```text:
2017/09/01 09:13:51  LAN  WLAN(STA_DEAUTH): STA(11:22:33:44:55:66) is deauthed!
2017/09/01 09:13:34  LAN  WLAN(RSN_CONNECT): STA(11:22:33:44:55:66) is associated!
2017/09/01 09:04:29  LAN  WLAN(STA_DEAUTH): STA(11:22:33:44:55:66) is deauthed!
2017/09/01 09:04:23  LAN  WLAN(RSN_CONNECT): STA(11:22:33:44:55:66) is associated!
2017/09/01 08:34:09  LAN  WLAN(STA_DEAUTH): STA(11:22:33:44:55:66) is deauthed!
2017/09/01 08:34:01  LAN  WLAN(RSN_CONNECT): STA(11:22:33:44:55:66) is associated!
2017/09/01 08:03:48  LAN  WLAN(STA_DEAUTH): STA(11:22:33:44:55:66) is deauthed!
2017/09/01 08:03:42  LAN  WLAN(RSN_CONNECT): STA(11:22:33:44:55:66) is associated!
2017/09/01 07:36:51  LAN  WLAN(STA_DEAUTH): STA(33:22:33:44:55:66) is deauthed!
2017/09/01 07:36:35  LAN  WLAN(RSN_CONNECT): STA(33:22:33:44:55:66) is associated!
2017/09/01 07:34:18  LAN  WLAN(STA_DEAUTH): STA(11:22:33:44:55:66) is deauthed!
2017/09/01 07:34:10  LAN  WLAN(RSN_CONNECT): STA(11:22:33:44:55:66) is associated!
```

Pythonのコードはこのようになります。

```py:check_mac_address.py
import splunk.Intersplunk

#Splunkのサーチの結果を受け取る
results, dummyresults, settings = splunk.Intersplunk.getOrganizedResults()

#MACアドレスを見て判定する
for result in results:
    if result['MAC'] == '11:22:33:44:55:66':
        result['decision'] = 'known'
    else:
        result['decision'] = 'unknown'

#処理結果をCSVファイルで保存する
splunk.Intersplunk.outputResults(results, outputfile = open("result.csv","w"))

#処理結果をSplunk上で表示する
splunk.Intersplunk.outputResults(results)
```

　以下のサーチ文で、Splunkの処理結果を作成したカスタムサーチに渡します。

```shell-session:
index=ap_idx
|rex field=_raw "STA\((?<MAC>.*)\)"
|table _time MAC
|run check_mac_address
```
　下図のようにSplunk上に表示、また、スクリプトと同じディレクトリに"result.csv"という名前で結果が保存されます。
![スクリーンショット 2017-09-18 21.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/201618/5fb8c2dc-5420-6863-6b10-9faf3dcb5072.png)
RecyclerView.Adapterのライフサイクル

# はじめに
RecyclerViewのAdapterのライフサイクルを調べてみました。
僕のメモ書き程度に残してますので参考までに確認してください。

# ログ

以下にAdapterを回した時のログを記載します。

```
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemCount
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemCount
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemCount
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemViewType position:0
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter onCreateViewHolder parent:android.support.v7.widget.RecyclerView{e836243 VFED.... ......ID 0,42-720,1130 #7f0d0091 app:id/my_recycler_view2} viewType:0
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter onBindViewHolder vh:ViewHolder{20c8d53e position=0 id=-1, oldPos=-1, pLpos:-1 no parent} position:0
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemCount
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemViewType position:1
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter onCreateViewHolder parent:android.support.v7.widget.RecyclerView{e836243 VFED.... ......ID 0,42-720,1130 #7f0d0091 app:id/my_recycler_view2} viewType:0
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter onBindViewHolder vh:ViewHolder{30e274b5 position=1 id=-1, oldPos=-1, pLpos:-1 no parent} position:1
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemCount
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter getItemViewType position:2
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter onCreateViewHolder parent:android.support.v7.widget.RecyclerView{e836243 VFED.... ......ID 0,42-720,1130 #7f0d0091 app:id/my_recycler_view2} viewType:0
D/HomeStarHorseRecyclerAdapter: HomeStarHorseRecyclerAdapter onBindViewHolder vh:ViewHolder{13697d8 position=2 id=-1, oldPos=-1, pLpos:-1 no parent} position:2
```

# 処理の流れ
ListViewのAdapterとほぼ変わりませんね。
違う部分としては「ViewType」部分ぐらいかなぁって思ってます。
(すべてのメソッドをオーバーライドしてないので適当)

| No | メソッド | 処理内容 |
|:-----------------|------------------:|:------------------:|
|1|getItemCount|RecyclerViewで表示するアイテムの個数|
|2|getItemViewType|アイテムのViewTypeを設定する。引数に「position」があるので個数で判断する|
|3|onCreateViewHolder|Layoutを設定する|
|4|onBindViewHolder|Layoutの画像や文字を設定する|

# 所感
RecyclerViewをカスタムしていくを考えるとNo2の「getItemViewType」をうまく作っていく必要があると感じました。
Nim で random モジュールを用いた結果が常に同じになってしまったとき

# 本日は

Nim　で random　を使っててハマってしまったところを紹介．

## ご注文は乱数ですか？
乱数を10個生成します．

```nim
#genrand.nim 
import random

for i in 1..10:
  echo random(max=1.0)
```

```shell-session
$ nim c genrand.nim
$ ./genrand.nim
0.2326961497609559
0.8228467011541094
0.3333379470197706
0.9894961846897405
0.4437264946689483
0.07581602342631522
0.5936563635008223
0.195534693152861
0.5258890850057507
0.8244128746481869
```

10個の乱数ができました．　もう一度 `genrand` を実行すると同じ数列が出力されます．
再コンパイルしても同じで．．．ヒェーーー．

## 乱数にご乱心したので

落ち着いでNimのドキュメントを参照してみましょう．
[Module random](https://nim-lang.org/docs/random.html)　から一部抜粋してみましょう．

```nim
proc random(max: float): float {..}
```
> Returns a random number in the range 0..<max. The sequence of random number is always the same, unless randomize is called which initializes the random number generator with a "random" number, i.e. a tickcount. 

```
proc randomize() {..}
```
> Initializes the random number generator with a "random" number, i.e. a tickcount. Note: Does not work for NimScript.

## 乱数再発注

つまるところこういうことだ．

```nim 
import random

randomize()

for i in 1..10:
  echo random(max=1.0)
```

```shell-session
$ nim c genrand.nim
$ ./genrand.nim
0.8730925582458222
0.2717319308796913
0.8367480284442272
0.1616825795184484
0.2546855257830949
0.8427564445426505
0.147968638127552
0.7476435288245504
0.6530976086050888
0.7046490393646303
$ ./genrand.nim
0.8730924651135425
0.3166539843298275
0.2743673308862937
0.2369934840519743
0.1255450520630028
0.2318429282381587
0.2717629031305997
0.1153961653748192
0.1651257085422351
0.6958431871449779
```

以上です．
HerokuでRailsアプリケーションの画像が表示されなかった時の解決法


##事象
Herokuに作ったポートフォリオをデプロイしたら、背景だけが真っ白だった。


##解決策

###consoleから`heroku run rake assets:precompile`
```
~/w/r_portfolio ❯❯❯ heroku run rake assets:precompile                                                                                                    master
Running rake assets:precompile on ⬢ tsuuumi-portfolio... up, run.9433 (Free)
Error waiting for network: Resource temporarily unavailable
~/w/r_portfolio ❯❯❯ heroku run rake assets:precompile                                                                                                    master
Running rake assets:precompile on ⬢ tsuuumi-portfolio... up, run.7788 (Free)
```

変化なし。しかも怒られた。
うまくいってないのは環境指定してないから・・・？
ググったけど`Error waiting for network: Resource temporarily unavailable`が何かはわからなかった。英弱。
今の私には解決できない。

###configの設定を変更する

`config/environments/production.rb`を開き、
`config.assets.compile`を`true`に書き換える。

うまく行きました。

たまにしかやらないから忘れそう…
SmartGit > .dllファイルはFilesペインに表示されない

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.5 #10143
```

Filesペインに変更があったファイル一覧が表示される。
しかしながら、.dllファイルに関しては表示されない。

**.gitignoreで設定しているわけでもない。**

Filesペインのタブの右側にあるアイコンのうち、以下のヘルプが表示されるアイコンがある。
> If selected, ignored files will be shown. Ctrl + 3

このアイコンをチェックした状態にすると、.dllファイルがFilesペインに表示された。

何かの設定で.dllがignoredに認識されてしまっているようだ。
[Survey] Kaggle - Quora 23位解法まとめ

Kaggle - Quora Question Pairs[^1]の23位解法[^2]の調査記事です．

Author: AhmetErdem
Title: 24th Place Solution Repo
Kaggle https://www.kaggle.com/c/quora-question-pairs/discussion/34534
Code: https://github.com/aerdem4/kaggle-quora-dup

## サマリ

- コードがシンプル
- 全ての特徴量は質問の順に依存しないようにした．(例: 質問1と2の頻度を特徴量とする代わりに，質問順に依存しないmin_frequenceyとmax_frequenceyとした)
- 特徴量の値の範囲を必要に応じて制限した．(例: 過学習を防ぐため，近傍の数の上限を5とした)
- LSTMによる特徴量も質問1と2の順に依存しないよう同じLSTMを利用.
- LSTMの出力値も差や和の平方を取ることで，順序間の依存をなくした．
- 出現頻度の低い単語はLSTMの前にプレースホルダーに置き換えた．
- ニューラルネットワークのサイズはそんなに大きくなく，ドロップアウトとガウシアンノイズを入れてる．
- 最後に様々なニューラルネットを合算して最終予測結果を作成．
- 検証データの重みについてはフォーラム[^3]を参照

## References

[^1]: Kaggle, [Quora Question Pairs](https://www.kaggle.com/c/quora-question-pairs), 2017.
[^2]: AhmetErdem, [24th Place Solution Repo](https://www.kaggle.com/c/quora-question-pairs/discussion/34534), 2017.
[^3]: sweezyjeezy, [Statistically valid way to convert training predictions to test predictions](https://www.kaggle.com/c/quora-question-pairs/discussion/31179)
railsでaリンクでurlに変数を入れる場合のやり方

```ruby:rei
<%= link_to("編集", "/posts/#{@post.id}/edit") %>
```

と言うかたちでlink_toで出していたものもaリンクだけで出力したいこともある。そういう場合、<%=%>で囲まないと変数として認識されないので下記の様に記述

```ruby:rei
<a href="/posts/<%= @post.id %>/edit">
```
Pepperに肩たたきさせてみた

MashupAwards 2017 福井予選で [生産管理部業務効率課 進捗課長](http://hacklog.jp/works/50565) というアプリを
作りました。

## 担当箇所
- Pepper　に 肩たたきさせるBoxを作成
- Pepper内部から Square API を叩くBoxを作成


肩たたきさせるだけでも少し苦労したので、
その方法を備忘録として残して起きます

Pepper用のIDE?である Choregrphe を使って行きます

## 1. ポーズライブラリ の表示

デフォルトでは表示されていない `ポーズライブラリ` というタブを表示させます

上のメニューから `表示 > ボックスライブラリ` を選択します

<img width="549" alt="スクリーンショット 2017-09-18 15.24.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/47b692d4-6caa-d340-d385-932c0ada1b6b.png">

そうすると右のビューにポーズライブラリというタブが表示されます

<img width="491" alt="スクリーンショット 2017-09-18 15.31.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/aee3b34d-c4f8-bb48-6194-df2d47ed8374.png">

このポーズライブラリはPepperのポーズを保存/呼び出しすることができます

## 2. 肩たたきポーズの作成

肩たたきのポーズを作っていきます

ロボットビューで見ながら腕をあげたときとおろしたときのポーズを作成します

|▽腕をおろしたときのポーズ|▽腕をあげたときのポーズ|
|:-----------------:|:-----------------|
|<img width="298" alt="スクリーンショット 2017-09-18 15.45.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/ab5c70a2-ac1b-e70e-f17b-6afffbf8564b.png">|<img width="288" alt="スクリーンショット 2017-09-18 15.40.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/bbf5c2ac-cdd6-beab-dfb9-296a999dfded.png">|


ポーズをとらせたらポーズライブラリの `+` マークで現在のポーズを
ポーズライブラリに追加します

<img width="872" alt="スクリーンショット 2017-09-18 15.41.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/0ff307fd-aa7d-7d66-cd2a-a15c3e2c4992.png">

画像のところのスクリーンショットボタンを押すことで現在のポーズの
スクリーンショットをサムネイルにすることができます。

追加できたらポーズライブラリから追加したものをダブルクリックして
Pepperがそのポーズをとるか確認します

## 3. 肩たたきアニメーションの作成

左下のボックスライブラリから `Timeline` ボックスを選択します

<img width="444" alt="スクリーンショット 2017-09-18 15.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/bbd34c81-4469-b3f7-8ca6-65563b2ab71e.png">

Timeline ボックスを追加したらダブルクリックしてタイムラインビューを開きます

<img width="1359" alt="スクリーンショット 2017-09-18 15.52.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/bcda26bd-2c4b-4948-c7d7-33e679bdc330.png">

ポーズライブラリの先程追加した `katatataki_up` をダブルクリックして
Pepperのポーズを変更します。

その状態でタイムライン上で右クリックでメニューを開き
`キーフレーム中に保存された関節 > 全身` を選択します

<img width="572" alt="スクリーンショット 2017-09-18 15.55.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/3d1b7f9d-805d-9a0f-65cf-fdb4188876b2.png">
 
これでタイムラインに特定のポーズを挿入することができました
同じように `katatataki_down` もタイムラインに挿入します

<img width="1351" alt="スクリーンショット 2017-09-18 15.58.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/0b554aaf-2734-5ce4-d045-df799b67ceaf.png">


25, 75 : katatataki_up
50, 100 : katatataki_down

を追加しました。

この状態で `モーション` のところの再生ボタンを押すとアニメーションを確認することができます

![pepper_katatataki_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/55219/b9562865-5c59-c411-de73-4d720d864fb5.gif)

## 4. 実際に動かす

ここまでで`肩たたきボックス`は作成できたので
あとは onStart のところに線を繋ぎ、実行すればOKです

<img width="323" alt="スクリーンショット 2017-09-18 16.03.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/19c6f015-79df-60af-a255-7bec0ac24046.png">


# まとめ

Choregrapheはちょっとハマりどころもありますが
Pepperを動かすだけでもすごい楽しいですね:laughing:

2nd Stageに向けてこれから頑張っていきたいと思います！！
完全準同型暗号まとめ

IT技術とは切っても切れない関係にある暗号技術ですが、しっかりと理解しているエンジニアはあまりいないのではないでしょうか。(私もまだまだです……)
先日、最新の暗号技術である完全準同型暗号を少々齧ったので、簡単にまとめてみます。

# 完全準同型暗号とは
一言で言ってしまえば暗号文のまま、加法と乗法の演算が可能な暗号方式です。

```math
E\left(5\right)=E\left(2\right)+E\left(3\right)
```

```math
E\left(6\right)=E\left(2\right)×E\left(3\right)
```

※E(a)はaの暗号文です

# 完全準同型暗号でできること
上記の性質によって何ができるかというと……
情報の漏洩等の観点から社内でしか扱えなかったデータをクラウドの潤沢なリソースを使って分析する、といったことが可能になります。

# 完全準同型暗号の課題
- 鍵や暗号文のサイズが非常に大きいこと
- 処理に時間がかかること  

などがあげられます。  
このあたりは盛んに研究されているので、近い将来実用的なレベルになるかもしれません。

# 完全準同型暗号の実装
2009年に「[A FULLY HOMOMORPHIC ENCRYPTION SCHEME](https://crypto.stanford.edu/craig/craig-thesis.pdf)」という論文がGentry氏らによって発表されました。
この論文や、その後に発表された他の論文を読んで実装することが可能です。

可能ですが、やりたくはないです。
完全準同型暗号の雰囲気を味わうだけであれば、IBMによって公開されている「[HELib](https://github.com/shaih/HElib)」というライブラリを使ってみるとよいでしょう。
(実装がC++なので、多少その周辺の知識が必要になります)

使い方は[公式のドキュメント](http://shaih.github.io/HElib/)や以下のスライドが参考になると思います。
https://www.slideshare.net/ssuser4c5f79/h-elib
Rubyの引数を理解する(できるだけわかりやすく)

引数がとても苦手だったのですが、引数を使えるといろんなことの幅が広がりそうな気がしたし、苦手なままでいるのはやばい感じがしたので、克服するために勉強をしました。それの備忘録として書き残します。

わかんなかったらコメントください。わかる範囲で答えます。


rubyではメソッド内で定義していないものを使うことはできない。従ってこんな感じのものはエラーになる。

```ruby:ruby
def hoge
  puts huga
end

huga = "眠い"

hoge    #エラーになる
```

hogeメソッドはhugaをputsしたいわけなんですが、hugaはhogeメソッドの中で定義されたものではありません。もちろんhugaの定義をhogeの中ですればOKです。が、それだと引数の説明にならないのでこのまま引数を使ってエラーを解決します。

引数には本引数と仮引数があるみたいです。
本引数は・・・・・・・
書くより見た方がいい気がするのでとりあえずコード。。


```ruby:ruby
def hoge(仮引数)
  puts huga
end

huga = "眠い"

hoge(本引数)
```


こんな感じです。
本引数は、多分メソッドを呼ぶ方に書きます。仮引数は呼ばれて飛びでるメソッドの方に書きます。

実際に本引数と仮引数を入れてみます

```ruby:ruby
def hoge(huga)
  puts huga
end

huga = "眠い"

hoge(huga)
```

今回のhogeメソッドはputs hugaをしたいわけですが、hugaがメソッド外で定義されているせいでエラーが起きていましたので、メソッドを呼び出す方の本引数にhugaを入れて、仮引数の方にもhugaを入れました。これによって最終行の引数の全てにhugaが入った状態になります。なのでエラーが出ずにターミナルには「眠い」と表示されます。


ここまでは、本引数と仮引数を同じ名前にしましたが、名前が異なっていても使えます。
例えばこんな感じ

```ruby:ruby
def hoge(kotoba)
  puts kotoba
end

huga = "眠い"

hoge(huga)
```

本引数 : huga
仮引数 : kotoba

本引数と仮引数の名前が異なるようにしました。これに伴ってもう一つ変わったところがあります。
hogeメソッドないのputsの右側が「kotoba」に変わりました。
これは、メソッドの中で引数として渡ってきたものを使うためには仮引数と同じ名前でないと使えないからです。
例えば以下のようにするとエラーになります。

```ruby:ruby
def hoge(kotoba)
  puts huga
end

huga = "眠い"

hoge(huga)    #エラーになる
```

仮引数はkotobaなのにputsの右側がhugaになってます。やっぱりhugaはhogeメソッドの中で定義されていないのでエラーです。
当然ながらこれもダメです。

```ruby:ruby
def hoge(huga)
  puts kotoba
end

huga = "眠い"

hoge(huga)    #エラーになる
```

相変わらずputsの右側のkotobaはhogeメソッドで定義されていません。

ってなわけでおさらいをすると

1.メソッドで使いたいメソッド外部の変数名など本引数の名前が一致していること
2.仮引数とメソッド内において仮引数で渡されたものを使いたいところの名前が一致していること

上記2点が守れていれば、本引数と仮引数の名前が異なっていても問題なく動きます。

念押しするとこういうこと


```ruby:ruby
def hoge(name2)
  puts name2
end

name1 = "眠い"

hoge(name1)
```

name1同士は同じ名前
name2同士も同じ名前

こうなっていればOKです。

以上です。

追記
1.本引数は実引数ということの方が多いようです。

2.本引数の中にはローカル変数だけでなく式を書くこともできます。なので何か変数名をいれなくても仮引数を書いたメソッドで使いたいものを本引数の部分に式として書いても使えます。例えば以下のように。

```ruby:hoge.rb
def hoge(name)
  puts "私の名前は#{name}です"
end

puts hoge("ヤマダ")

```
```ruby:ターミナル
ruby hoge.rb
私の名前はヤマダです
```

本引数の部分には変数名などではなく文字列をそのままいれていますが、　問題なく結果が出ています。
fastTextを用いた競馬血統のベクトル化

#概要
fastTextはFacebookが自然言語処理を行うために公開しているツールです。高速に自然言語処理を行うことができます。
[GitHub fastText](https://github.com/facebookresearch/fastText)

仕組みについては、解説サイトを参照お願いします。
[Facebookが公開した10億語を数分で学習するfastTextで一体何ができるのか](https://deepage.net/bigdata/machine_learning/2016/08/28/fast_text_facebook.html)

今回、そのfastTextを利用して、自然言語処理ではなく、競馬の血統をベクトル化したいと思います。
fastTextを利用して自然言語処理以外のことを行うというアイデアは、下記の記事に触発されたものです。
[fastTextを使って単語じゃないものの分散表現を獲得する](http://qiita.com/bokeneko/items/2208d2b625d37e0a7820)

# 実行結果
githubにベクトルファイルとhowto用のjupyter notebookファイルをアップロードしています。
[github keiba_ketto_vec](https://github.com/KTaskn/keiba_ketto_vec)

# 作成方法

## データセット
血統過去３代をfastTextのフォーマットに落とし込みます。

競走馬サトノダイヤモンドの場合の血統表です。

| 血統 | 馬名 |
|:-:|:-:|
| 子 | サトノダイヤモンド |
| 父 | ディープインパクト |
| 母 | マルペンサ  |
| 父父 | サンデーサイレンス |
| 父母 | ウインドインハーヘア |
| 母父 | Orpen |
| 母母 | Marsella |
| 父父父 | Halo |
| 父父母 | Wishing Well |
| 父母父 | Alzao |
| 父母母 | Burghclere |
| 母父父 | Lure |
| 母父母 | Bonita Francita |
| 母母父 | サザンヘイロー |
| 母母母 | Riviere |


上記の表の馬名を半角スペース区切りで１行に変換します。
他の競走馬についても同様です。

``` input.csv
サトノダイヤモンド ディープインパクト マルペンサ サンデーサイレンス ウインドインハーヘア Orpen Marsella Halo WishingWell Alzao Burghclere Lure BonitaFrancita サザンヘイロー Riviere
サイモントルナーレ ゴールドアリュール ユーモレスク サンデーサイレンス ニキーヤ アフリート アリーウイン Halo WishingWell Nureyev ReluctantGuest Mr.Prospector PoliteLady Alydar FleetVictress
ウォータールルド ウォーターリーグ ウォーターエナン Dehere Solo BostonHarbor Scrape DeputyMinister SisterDot Halo MineOnly Capote HarborSprings Mr.Prospector File
...
```

## ベクトル化

ベクトル化にはfasttextのskipgramコマンドを利用します。
実行すると、binファイルとvecファイルが生成されているはずです。

```
$fasttext skipgram -input input.csv -output ketto_model -minn 50
```

* inputオプション
インプットファイルを指定します
* outputオプション
アウトプットとなるモデル名を指定します
* minnオプション
文字列を文字に分解する際の最小サイズを指定します。

minnオプションについてですが、fastTextの仕組みとして、スペース区切りした単語に加えて、単語ひとつひとつをさらに文字レベルで分解して分析を行っているようです。
[fastTextの実装を見てみた](https://www.slideshare.net/shirakiya/fasttext-71760059)

この機能は、例えば"ゴールドアリュール"と"ゴールドシップ"という馬を"ゴールド"で一括りにしてしまいます。
今回は、名前そのものには意味は無いので、機能を無効化するためにminnオプションを利用して文字レベルへの分解を防ぎます。

## 結果確認
gensimを利用してベクトル化したファイルを読み込み、ベクトル演算を実施してみます。

サトノダイヤモンドからベクトル演算を利用して、父違いの妹であるリナーテを算出できるかチェックします。

* サトノダイヤモンド（父：ディープインパクト）
* リナーテ（父：ステイゴールド）

ですので、 

```
サトノダイヤモンド + ステイゴールド - ディープインパクト = リナーテ 
```

という式が成り立つはずです。

``` howto.py
import gensim

# gensimを使ってベクトルデータを読み込み
model = gensim.models.KeyedVectors.load_word2vec_format('ketto_model.vec', binary=False)

# most_similarメソッドを使って演算
# positiveに足し合わせるデータをリストで渡し、negativeに差し引くデータをリストで渡す。

model.most_similar(
    positive=["ステイゴールド", "サトノダイヤモンド"],
    negative=["ディープインパクト"]
)
```

gensimの利用方法については下記をチェックしてください。
[gensim models.word2vec](https://radimrehurek.com/gensim/models/word2vec.html)

``` result.
[('ポーレン', 0.8220623731613159),
 ('マルケッサ', 0.8190209865570068),
 ('マルペンサ', 0.814713716506958),
 ('リナーテ', 0.80884850025177),
 ('シャピーラ', 0.8080180287361145),
 ('ムーンライトナイト', 0.8041872382164001),
 ('Semplice', 0.7995823621749878),
 ('OnAir', 0.7940067648887634),
 ('フュージョンロック', 0.7933699488639832),
 ('Orpen', 0.7927322387695312)]
```

母父Orpen系のポーレンが一番似ているという結果になってしまいましたが、 母のマルペンサ、半妹のマルペンサ（父オルフェーヴル、父父ステイゴールド）につづき、 リナーテもしっかり演算結果に出現したので、ベクトル化は成功しているといえるのではないでしょうか。

以上。
[swift] 区間について

swift --version

```
Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
Target: x86_64-apple-macosx10.9
```

# 区間 in Swift

|区間 | 型 | オペレーター |
|:----|:---|:-------------|
|半開区間 [start, end) | Range\<Bound\> | start ..< end |
|閉区間 [start, end] | ClosedRange\<Bound\> | start ... end |

---
**NOTE**

* Int型における *..<* オペレーターはデフォルトではCountableRange\<Int\>になるので注意
* CountableRange\<Bound\>は、Rangeというサフィックスが付いているが、区間というよりSequenceと考えたほうが実用的  
* Collectionのsubscriptメソッドで受け取る型はRange\<Bound\>


# 区間の定義

* 開区間  
  * 両端を含まない
  * ( )で囲む  
    ex: (0,1) = 0より大きく、1未満
* 閉区間
	* 両端を含む
	* [ ]で囲む  
	  ex:  [0,1] = 0以上、1以下
* 半開区間
	* どちらか一方を含む
	* 始端を含む場合 [ )で囲む  
	  ex: [0, 1) = 0以上、1未満
	* 終端を含む場合 ( ]で囲む  
	  ex: (0, 1] = 0より大きく、1以下

参照 

* [wikipedia 区間#用語](https://www.wikiwand.com/ja/%E5%8C%BA%E9%96%93_(%E6%95%B0%E5%AD%A6)#/.E7.94.A8.E8.AA.9E)
SmartGit > remote情報の変更 > メニュー > [Remote] > [Properties] | .gitは外す < クローンして別リポジトリにする

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.5 #10143
```

[unity > github / sourcetree > cloneして別リポジトリにする](http://qiita.com/7of9/items/d8677c0991628c79e15a)

上記はSourceTreeでの手順である。

> `3. SourceTreeにてリモートリポジトリの設定を変更する

SmartGitで同様のことをする場合、remote設定はどこで変更をするのか確認した。

メニュー > [Remote] > [Properties]がある。
ここでURL or Path設定を変更すれば良い。

**ただしURL or Pathで指定するのは「.gitを外したパス」のようだ**

例: `https://auser@bitbucket.org/auser/linemonitor`

以下にするとエラーになる。

例: `https://auser@bitbucket.org/auser/linemonitor.git`

> Remote Properties: repository 'https://auser@bitbucket.org/auser/linemonitor.git/' not found: remote: Not Found

.git付きにすると、その下のフォルダとしてPushしようとして、失敗する。

clone直後は.git付きの設定になっており、設定変更時には.gitなしにする、というのは分かりにくい。
マハラノビス距離で識別する

例えば、いくつもの測定結果があって一定の範囲内に分布するものだけを製品としたい場合に、一つづつ確認してもいいけど、ざっと計算して基準内にあるかどうか統計的に求め方法があるよというのがマハラノビス距離。

また、同種類だったり同じものだけど測定結果が諸条件で変わるときに、同じものか違う種類かを統計的に判断する方法としても使える。極論言えば、慣れた人間の判断力にはかなわないわけだが、統計的にという安心材料を追加できることは間違いない。

ここではアヤメのデータを使って説明していこうと思う。ざっと概要を説明するとアヤメの花びらとがくそれぞれの長さと幅を50個ずつ3種類測定したデータでsetosaとversicolor、virginicaという3種類ある。これ以上詳しい話はググればだれか書いてると思う。

絵的に説明するためとりあえず2変量で話を進める、花弁の長さと幅をそれぞれx軸とy軸として、プロットしとみると、下の図のようになる。

![Maha_center.png](https://qiita-image-store.s3.amazonaws.com/0/201158/7e1c5888-99e5-d4ca-387f-4efc923fe604.png)

今回は例としてアヤメデータから種類毎に10個ずつ取り出して○点でプロットしてみた、setosaか否かを判別することにしたので、setosa群の平均点を×点で示している。また、確率分布のイメージを青のグラデーションで示してみた。マハラノビス距離はこの中心(×点)から各○点までの距離を計算する。

で、計算した結果を横軸を距離、縦軸を度数としてヒストグラムにプロットすると次のようになる。

![maha_hist2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/201158/867b236e-7ef2-9f61-3378-901561b2be2c.jpeg)

Rのプロットが大変なんでこの手のプロットをすると一部データが表示されていない時もあるけど、小さな値の部分に赤で示したsetosaが分布しており、距離が増えるにしたがってそれ以外のものが分布している。2変量だとこんな感じ、結果としてはいまいちだね～。

マハラノビス距離では、この分布の中心からに距離を、分散状況を踏まえ計算する。そのため、マハラノビス汎距離とも呼ばれているが、そんなことはどうでもいい。ユークリッド距離との違いはこの分散を考慮して計算する点で異なる。で、ここからは4変量で計算する。


```R:mahalanobis.r
> ## create test and training set
> train_index <- c(1:10)
> train <- iris[train_index,]
> test <- iris[-train_index,]
> 

> ## Training (setosa)
> center <- apply(train[,1:4], 2, mean)
> covar <- cov(train[,1:4])
> 

> ## Calculate distance
> mahalanobis( test[1,1:4], center, covar ) #setosa
     11 
4.85708 
> mahalanobis( test[41,1:4], center, covar ) #versicolor
      51 
1424.809 
> mahalanobis( test[91,1:4], center, covar ) #virginica
     101 
3176.181 
```


上の例では,setosaの最初の10個が基準データとしてそれぞれの種類でどのように距離が変わるのかを示している。

ちなみこれをヒストグラムで表すと以下のようになる。

![mahara_hist.jpeg](https://qiita-image-store.s3.amazonaws.com/0/201158/932cd3bd-4507-e6c2-66ad-81107fd4dc11.jpeg)


基準としたものと同じ種類のもの方が、0の付近に分布していることがわかる。つまり、似たよう測定結果のものは同じところに集まるわけで、一定以下の値を取るようにすれば、大量のデータを比較する必要がなくなるわけだ。

4変量にするとだいぶはっきり分かれてくれたけど、最近流行りのビッグデータで注意しないといけないのは、いわゆる「次元ののろい」というやつ何でも多けりゃいいってもんじゃないよって話。

ま、こんな感じ
Watson SpeechToText - 結果JSONからtranscriptだけ抜き出す（Mac）

# コマンド
Watson STTから文章だけ抜き出すには、Terminalでこれを実行すればOK。

```
grep '"transcript"' speech_to_text_result.json \
 | sed -e 's/^[ ]*//g' \
 | sed -e 's/^"transcript": "//' \
 | sed -e 's/"$//' \
 | sed -e 's/D_[^ ]*//g' \
 | sed -e 's/ //g'
```

「speech_to_text_result.json」は、STT結果を保存したJSONファイル名を指定してください〜。
(※2017.09.18時点。JSON解析してるわけじゃないので、フォーマットが変わったら動かなくなるかも。)

# 本文
Watson Speech to Text（音声認識）サービスは、会話などの音声からテキストに文字起こししてくれるサービスです。

今回はここの記事を見て、mp3ファイルから音声認識させてみました。
https://www.ibm.com/think/jp-ja/watson/ai-transcription/

## 何を解決しているか
* JSON形式で出力されるけど、テキストだけ抜き出したい（確信度の情報とか）
* 「D_アノー」などの相槌(?)も文字起こししてくれるので消したい
* 語の区切りにスペースが入ってくるので消したい

# 最後に

スミマセンが、ほぼ自分向けのメモです。
備忘録: 最小限の労力でサブコマンド付きのシェルスクリプトが書きたい

なるべく労力をかけずにサブコマンド付きのシェルスクリプトを書きたい、ということがあった。

労力をかけないことに力点をおいたので、 POSIX 準拠ではなく、 Bash 限定の要素が入っている。

## コマンドをそのまま実行するとヘルプ表示

```shell-session
$ some-command
Usage:
  some-command --help
  some-command sub-command1
  some-command sub-command2
```

## `--help` オプションでもヘルプを表示

```shell-session
$ some-command --help
Usage:
  some-command --help
  some-command sub-command1
  some-command sub-command2
```

## `sub-command1`, `sub-command2` でそれぞれ違った処理を実行する。

※ 下記の例示はただの echo 

```shell-session
$ some-command sub-command1
1
$ some-command sub-command2
2
```

## 存在しないサブコマンドにもヘルプ表示
また、エラー扱いとして exit code 1 で終了したい。

```shell-session
$ some-command wrong-command
Usage:
  some-command --help
  some-command sub-command1
  some-command sub-command2
$ echo $?
1
```

# どう書く

サブコマンドをシェルスクリプトの関数として対応関係にあれば、そこそこ可読性が高く、と追加や制御の手間が最小限になると考えた。

```bash:some-command
#!/usr/bin/env bash
sub-command1() {
  echo 1
}

sub-command2() {
  echo 2
}

--help() {
  echo 'Usage:'
  compgen -A function \
    | xargs -I % echo ' ' "$(basename "$0")" %
}

main() {
  unset -f -- "${FUNCNAME[0]}"
  ! declare -F -- "$1" >/dev/null && --help && exit 1
  "$@"
}

main "$@"
```

# テクニック解説

## テクニック1. main をサブコマンドから消す

```bash
unset -f -- "${FUNCNAME[0]}"
```

`${FUNCNAME[0]}` で自身の関数名が取得できるので、 unset すると名前空間から main が消えてくれる。後々の `compgen -A function` でサブコマンドを得るときに main がない方が良い。

## テクニック 2. 簡易ヘルプ

本来は入力補間を実現するのための組み込みコマンドとして `compgen` というものがある。これをヘルプの表示につかう。具体的には、関数を列挙してサブコマンドとして表示する。

大本の実行コマンドは `$(basename "$0")` から得る。

```bash
compgen -A function \
    | xargs -I % echo ' ' "$(basename "$0")" %
```

## テクニック 3. 関数名の存在チェック

`declare -F` を使って関数名の存在チェックをしている。なければヘルプ表示

```bash
  ! declare -F -- "$1" >/dev/null && --help && exit 1
```

## テクニック 4. `"$@"`

シェル関数を先頭で消費しつつ、残りを引数として関数に渡せる。
なので例えばもし `sub-command1` を

```bash
sub-command1() {
  echo "$@"
}
```

のような定義にすれば、

```shell-session
$ some-command sub-command1 A B C
A B C
```

となる。
サブコマンドで、実際の処理は他のコマンドに委譲する場合に便利になる。

# まとめ

`--help` から 最後の行まではボイラープレートとして捉えて、コピペすると楽でしょう。

```bash:ここはコピペ
# http://qiita.com/kitsuyui/items/4b204963e0ebec53fe3c

--help() {
  echo 'Usage:'
  compgen -A function \
    | xargs -I % echo ' ' "$(basename "$0")" %
}

main() {
  unset -f -- "${FUNCNAME[0]}"
  ! declare -F -- "$1" >/dev/null && --help && exit 1
  "$@"
}

main "$@"
```
vue.js構築

macにvueをインストールします。

###homebrewでnodeを落としてきます。  
```
$brew install node
==> Installing dependencies for node: icu4c
==> Installing node dependency: icu4c
==> Downloading https://homebrew.bintray.com/bottles/icu4c-59.1.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring icu4c-59.1.el_capitan.bottle.tar.gz
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local,
because macOS provides libicucore.dylib (but nothing else).

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/icu4c/lib
    CPPFLAGS: -I/usr/local/opt/icu4c/include

==> Summary
🍺  /usr/local/Cellar/icu4c/59.1: 246 files, 65.4MB
==> Installing node
==> Downloading https://homebrew.bintray.com/bottles/node-8.5.0.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring node-8.5.0.el_capitan.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/8.5.0: 4,152 files, 48MB

```

```
$node -v
v8.5.0
```

###vue.jsをインストール
```
# vueインストール
$npm install vue
+ vue@2.4.4

# vue-cliインストール
$npm install --global vue-cli

```

###プロジェクトの生成
E2EはいらないのでそれだけNoにしてます

```
$vue init webpack front

? Project name front
? Project description A Vue.js project
? Author takumi 
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Setup unit tests with Karma + Mocha? Yes
? Setup e2e tests with Nightwatch? No

vue-cli · Generated "front".
```

必要パッケージをインストール

```
$cd front
$npm install
```

実行してみる

```
$npm run dev
```

![スクリーンショット 2017-09-18 14.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/99555/902f2c18-ed3f-83c9-5dfe-5788900a2130.png)
備忘録: nginx でアクセス元 IP レンジに応じて Web アプリケーションを切り替える

あるイントラネット用の Web アプリケーションのアップグレードを試していて、次のようなことをしたい場合があった。

1. 特定の IP からのアクセスでは次バージョンのサイトに接続する (試験ユーザ)
2. それ以外の IP からのアクセスは現バージョンのサイトに接続する (通常ユーザ)

ローカルホストで試験するという手段もあるが、

A. ホスト名に依存する処理がある (外部の認証機構からリダイレクトする、など)
B. HTTPS 限定のサイトである (このために証明書等をローカルホストに移すのは手間かつセキュアでない)
C. 複数人のアクセスを想定している (ので人数分の /etc/hosts を書き換えるのも容易ではない)

といった条件もあり「リバースプロキシ側 (nginx) でアクセス元の IP レンジに応じて Web アプリケーションを切り替える」という方針で進めることにした。なおかつ、なるべく手軽にやりたかった。

内容はとてもシンプルだけど、すぐ忘れそうなので、備忘録として残しておく。


# こう書いた

今回の要旨と関係のないディレクティブは全て省略した。
登場人物は 3 つ。

- [ngx_http_geo_module](http://nginx.org/en/docs/http/ngx_http_geo_module.html)
- [if](http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if)

- [set](http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set)

- [proxy_pass](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass)


普通のユーザに見せたい方のサイトを `usual_server`, 試験者のサイトを `testing_server` と定義した。

```nginx:/etc/ngnix/sites-available/site.example.com.conf
upstream usual_server {
  server 127.0.0.1:8080;
}

upstream testing_server {
  server 127.0.0.1:8081;
}

geo $maintenance {
  default 0;
  # 許可したい IP レンジ
  192.168.100.105/32 1;
}

server {
  if ($maintenance = 0) {
    set $target_proxy_server "usual_server";
  }

  if ($maintenance = 1) {
    set $target_proxy_server "testing_server";
  }

  location / {
    proxy_pass http://$target_proxy_server;
  }
}
```

あとは

```shell-session
$ sudo service nginx configtest && sudo service nginx reload
```

# なぜこのような書き方にするか

[If Is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/) にも書かれているように、 nginx では `location context` 内での if はうまく処理できない問題がある。

下記は動作しない。

```nginx:だめな例
if ($maintenance = 1) {
  location / {
    proxy_pass http://$testing_server;
  }
}
if ($maintenance = 0) {
  location / {
    proxy_pass http://$usual_server;
  }
}
```

また、 nginx の `if` には `else` に対応するものがない。
「複雑なことは `if` で制御しようとせず、なるべくなら使わない、使っても `set` くらいにする」と捉えておけば問題ないはず。
Spring+Seleniumでファイルアップロード画面をテストする方法

Springbootで作ったアップロード画面に対してseleniumでテストコード書いてみると、
ファイル選択ダイアログが操作できずにテストが出来なかったのでそれを解消する方法を下記に記載します。

※もし他にいい方法があればご意見お待ちしております！


# 実現方法
seleniumでは`<input type='file'>`の操作が難しいため、
サーバ側（Java側）でfile属性に対して自動的にファイルを設定するようにした。


# 実装ポイント
1. ControllerAdviceCustomクラスで画面から受け取るパラメータに対しての拡張ポイントを追加
1. MockFileEditorクラスを作成してMockMultipartFileを生成して設定する処理を追加
1. テスト実行時にControllerAdviceCustomクラスの拡張ポイントに対して、型がMultipartFileの場合はMockFileEditorクラスを通すように設定

これでselenium側で`<input type='file'>`の操作に悩まされることがなくなって一安心！


```ControllerAdviceCustom.java
@ControllerAdvice
public class ControllerAdviceCustom {
    @InitBinder
    public void initBinderMock(WebDataBinder dataBinder) {
        // Mock拡張ポイント（実装はテスト側でMockUpを使用）
    }

    // 以下省略
}
```

```MockFileEditor.java
public class MockFileEditor extends PropertyEditorSupport {
    @Override
    public void setValue(Object obj) {
        // パラメータ（Multipart）対してMockMultipartFileを生成して反映
        String textFile = "dummy text file";
        MultipartFile mockFile = new MockMultipartFile("file", textFile.getBytes());
        super.setValue(mockFile);
    }
}
```

```SeleniumTest.java
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class SeleniumTest {

    @Before
    public void setup() {
        // ControllerAdviceCustomクラスのモック拡張ポイントを実装
        new MockUp<ControllerAdviceCustom>() {
            @Mock
            @InitBinder
            public void initBinderMock(WebDataBinder dataBinder) {
                // 型がMultipartFileの場合はMockFileEditorクラスを通すように設定
                dataBinder.registerCustomEditor(MultipartFile.class, new MockFileEditor());
            }
        };
    }

    @Test
    public void ファイルアップロードを含む画面のテスト() {
        // 以下省略
    }
}
```

# 補足
調べてみるとseleniumでも`<input type='file'>`の操作は可能らしいです。
ただしその手段が全てのブラウザで可能かどうかが怪しい＆ブラウザのバージョンアップ（セキュリティ対策）によって使えなくなる可能性があったので今回の実現方法にしました。
Semantic UI の Grid レイアウトをレスポンシブにしました

Semantic UI で Gird レイアウトのクラスを反映しただけでは、レスポンシブ対応されませんでした。これよく忘れるのでメモします。

# Gird レイアウト
Semantic UI の Grid レイアウトは適用するだけではレスポンシブにはなりません。

```html:２カラムレイアウト
<div class="ui grid">
  <div class="eight wide column">
    <a class="ui button" href="#">東京都</a>
  </div>
  <div class="eight wide column">
    <a class="ui button" href="#">神奈川県</a>
  </div>
</div>
```
上記のような２カラムレイアウトは、モバイルでも２カラムになります。

# stackable クラスでレスポンシブ対応
クラスに `stackable` を追加します。

```html:２カラムレイアウト
<div class="ui　stackable grid">
  <div class="eight wide column">
    <a class="ui button" href="#">東京都</a>
  </div>
  <div class="eight wide column">
    <a class="ui button" href="#">神奈川県</a>
  </div>
</div>
```
`stackable` クラスを付与すると自動で Grid がレスポンシブ対応されました😄

# 参考
https://semantic-ui.com/collections/grid.html#stackable
TableauでGoogleAnalyticsのセッション数がおかしい時


# はじめに

ECサイトのGoogleAnalytics（以下GA）の分析に、Tableauを使ってみたのですが、セッション数の値がGA上に比べてとても少ない問題が発生しました。

試行錯誤して解決した内容をまとめておきます。

# 現象
日別や、誘導元別、キャンペーン別、デバイス別、商品カテゴリ別で、セッション数・購入件数・CVRを分析してみようと思い、データソースを以下のように設定しました。

![ブログ TableauでのGAのセッション数問題.png](https://qiita-image-store.s3.amazonaws.com/0/202857/cd176225-842b-a3ea-db46-4f45e7307107.png)

使いそうなディメンションとして、

- キャンペーン
- 日付
- デバイスカテゴリ
- 商品カテゴリ
- 参照元/メディア

メジャーとして、

- 数量
- 商品の収益
- セッション
- 固有の購入数

を設定しています。

ワークシートでこんな感じで設定してみると、一見、正しく数字が表示されているようですが、セッション数がGAと違い明らかに少ない。

![ブログ TableauでのGAのセッション数問題 (1).png](https://qiita-image-store.s3.amazonaws.com/0/202857/f1cc8e08-aebf-3a01-ac80-ad9fb099a3b3.png)

# 原因
Tableau はGoogle Analyticsに接続する際にGAのAPI経由でアクセスしています。
このAPIに関連して、以下の記載がありました。

 [Google Analytics 抽出とポータル番号が一致しない](http://kb.tableau.com/articles/issue/google-analytics-numbers-not-same?lang=ja-jp)


> [セッション] の正しい結果を取得するには、すべてのイベント関連ディメンションをクエリから削除する必要があります。


これがおそらく原因のようでした。

# 解決策
以下のように、ディメンションから、商品カテゴリを削除してみると、

![ブログ TableauでのGAのセッション数問題 (2).png](https://qiita-image-store.s3.amazonaws.com/0/202857/86f33440-8971-aeac-a36d-2454eef762fd.png)

GAと同じセッション数になりました。

![ブログ TableauでのGAのセッション数問題 (5).png](https://qiita-image-store.s3.amazonaws.com/0/202857/8783ae78-7fda-2045-d02e-0133399d2d47.png)


**セッション数がGAと違っている場合は、ひとつのウェブサイト（GA）でも、分析したい内容によってデータソースを分けて作成するしか解決策はないようです。**

# 応用編

例えば、以下の二つのグラフを作ってひとつのダッシュボードに表示したい場合、

①参照元別のセッション数・CVR
②商品カテゴリごとの購入件数、購入金額

それぞれ、別々のデータソースに接続して作成し、ダッシュボードに①②に表示し、「日付」で相互にフィルターがかかるようにすることで、流入元と、売れた商品の内訳を可視化するダッシュボードを作成することができました。

Tableauというより、Google AnalyticsのAPIの制約だと思いますが、把握しておくと、より効率的にレポート作成ができそうです。
MacでQiitaに投稿するときに便利なツール


Qiitaへの投稿を習慣にしてみようと始めましたが、スクリーンショットを撮ったり、文章を書いたりと意外と手間です。効率的に記事を書くためのツールをまとめてみました。

# 記事を書く。
## 記事を書く(kobito）
qiitaにアップすることを前提にしたらkobitoが当然便利です。

http://kobito.qiita.com/

## コードを書く（Atom）
それ以外の普段のエディタは、ATOMを使っています。
https://atom.io/
		

## スクリーンショットを保存する（Monosnap）

画面キャプチャーを簡単に保存、編集が行えるアプリ。
画面の動画を撮るスクリンキャプチャーの機能も備えています。

https://itunes.apple.com/jp/app/monosnap/id540348655?mt=12&ign-mpt=uo%3D4


## 図を書く（keynote）
図を書くときは、Keynoteを使っています。

https://itunes.apple.com/jp/app/keynote/id409183694?mt=12


# 普段の操作を便利に

## クリップボードを保存する（Clipy）
https://clipy-app.com/

画像も含めてクリップボードを保存できる。
スニペットも保存できるので、文章作成には欠かせない。

## 書式なしでペーストする（FormatMatch）
書式なしでテキストをペーストできるようにするアプリ。
Evernoteに貼り付けるときにプレーンテキストにできて便利

https://itunes.apple.com/jp/app/formatmatch/id445211988?mt=12&ign-mpt=uo%3D4

## アプリを起動しやすくする（Alfred）

アプリやファイルを素早く探すアプリ。

https://itunes.apple.com/jp/app/alfred/id405843582?mt=12&ign-mpt=uo%3D4

詳しい使い方はこちら。
https://pc-karuma.net/mac-app-alfred/


# 参考サイト
- https://mukutto.com/mac-apps/
- http://itea40.jp/matome/mac-blog-tools-matome-2014/
Galera cluster でDB不整合が起きた場合

不整合となってしまったサーバのDBが起動しなくなってしまったそんな時。

次のデータを削除して再起動することで復旧できる。。。

```
cd /var/lib/mysql
rm -rf ibdata*
rm -rf ib_logfile*
```

でも、お作法的に、正しく無いような気がする。。。
GitHubでPR内のcommitに、commit単独にコメントされるとあまり見ない表記になる

あまり見ない表示だったのでメモ

このようにコメントが繋がって表示される
<img width="790" alt="スクリーンショット 2017-09-18 12.40.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/df91cf67-610e-9238-8ae7-e58d7fc8d597.png">
https://github.com/robbyrussell/oh-my-zsh/pull/2616

これはコミット単独にコメントがついているのが表示されているため。
<img width="808" alt="スクリーンショット 2017-09-18 12.47.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/dbc10b19-ba45-3ea1-7957-6d798e068962.png">
https://github.com/robbyrussell/oh-my-zsh/commit/baf2ab1bf1096b954a759739cc41c587fb0cf5b2
Cannot describe テーブル名. It has 0 columns.

表題のエラーが出る場合は、Model/TableのbelongsToの記述が正しいか確認してみてください：

```ng.php
        $this->belongsTo('OwnerUsers', [
            'class'  => 'Users', // ここをclassNameと書くべき！
            'foreignKey' => 'owner_user_id',
            'joinType'   => 'INNER'
        ]);
```

上記のサンプルコードのようにclassNameと書くべきところを間違えている可能性が大です。