OmniAICreator/Qiita-1.07M huggingface dataset:
ログサービスの作成まで

# 概要
AlibabaCloud触っていてまだログサービス使用してなかったのでやってみたのですがいまいち分かってないのでとりあえず作成まで

## 導入手順

まずサービス有効化の画面、何もないのでプロジェクト作成しましょう。
![スクリーンショット_0030-03-30_11_45_00-2.png](https://qiita-image-store.s3.amazonaws.com/0/234379/0548028a-4026-d157-605d-f9cae5c03f9d.png)

プロジェクト名だけなのでぱっぱといれましょう。名前は全体で一つみたいです。「sample」で入れたら弾かれた。
プロジェクト名: ハイフンとアンダースコアは許可されてるメッセージが出てきましたがアンダースコアは拒否されます。（bug?）

![スクリーンショット 0030-03-30 11.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/234379/74720cd2-975c-3402-cf7c-e8d5ae3739cf.png)

リージョン選択の幅狭くないですか？もっと広くしたほうがいいと思いましたけど東京リージョンを選択しましょう。
![スクリーンショット 0030-03-30 11.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/234379/c9a775b9-89fc-8ac0-b7f0-dcb5d239ca85.png)

次はログストア作成する必要があります。  ![スクリーンショット 0030-03-30 11.47.18.png](https://qiita-image-store.s3.amazonaws.com/0/234379/38cf5e7a-cea4-1f12-4e4f-f17a26d39874.png)

画面が遷移してデータソースの選択画面です。クラウドサービス、サードパーティー製のソフトウェア、その他のソースから選択できます。SDKを使用したことがあったのでSDKを選択しました。
![スクリーンショット_0030-03-30_11_48_35.png](https://qiita-image-store.s3.amazonaws.com/0/234379/ac043602-0b7d-9373-cb73-ca3795252487.png)

この画面は選択するものがないので次をクリックします。
![スクリーンショット 0030-03-30 11.49.02.png](https://qiita-image-store.s3.amazonaws.com/0/234379/7a4b8873-3e08-ef3a-a714-1038e99aeb45.png)

この地点では出力ログなど何も設定していないのでプレビューをクリックしても何も起こりません。次へをクリックしましょう。
![スクリーンショット 0030-03-30 11.50.17.png](https://qiita-image-store.s3.amazonaws.com/0/234379/57d756e2-1ee5-2d60-5aa4-da1f03897876.png)

最後の画面になりますがここでOSSのバケットの設定をすることができますが今回は省略します。確認をクリックします。
![スクリーンショット 0030-03-30 11.50.36.png](https://qiita-image-store.s3.amazonaws.com/0/234379/b9d4b995-5793-4785-ee92-bb6905ef8b08.png)

作成完了した画面になります、ここから各設定することができます。次回は色々と設定していきます。
![スクリーンショット 0030-03-30 11.51.53.png](https://qiita-image-store.s3.amazonaws.com/0/234379/abb16892-64c6-2848-d696-0bb8396b4563.png)
iPhoneの実機テストで仮想マシン内のAPIを叩こうとした話


初投稿です。
swiftを触り始めて２週間程度の初心者が、業務の都合で仮想マシンに置いてあるAPIを叩こうとしてハマった話です。

もともとPHP + Vagrantで作成していた開発していたサービスを
iOSアプリ化したいとのことだったので、満を辞してxcodeを導入して
華麗なswiftデビューを飾る予定でしたが…

**「あれ？どうやってDBにアクセスすんの？」**

予定は未定と言いますが、あまりにも無様なデビューを飾りました。
とりあえず、PHPでAPIを書いてjson形式でデータを返すのが一般的との
ことだったので、status = 200を返すだけのAPIを仮設置。

これでswift側からurlにアクセスすればいけると思ってましたが、
人生そんなにうまく行かないご様子。
　　
　
結果から先に言うと**ホスト側から仮想マシンにアクセスできてなかった**と言うオチです。
　
　
言われてみれば、iPhone側からしたらVagrant内の設定など知ったこっちゃないのです。
と言うことなので、ちまちま調べているとようやくお目当の記事を発見。
この記事に全てが書かれてました。

http://maku77.github.io/vagrant/port-forward.html

仮想マシンのWebサーバのHTTP通信のポートは80なので、仮想マシンのHTTP通信をホスト側のポート8080でマッピングするよう~/.Vagrant.d/Vagrantfileに以下を追加。

```
config.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
```

これでやっとアクセスできた。
ここまで来るのにほぼ丸一日かかった。
しかし、iOS開発をしている人はみんなこんなことしているのかと思うとゾッとします。
3 分で作る無料の翻訳 API  with Google Apps Script

## 概要

Google 翻訳 API を無料で使えないかと思ってたところ、 Google Apps Script の LanguageApp クラスを発見し、「これは！」と思ったので早速 GAS から使って無料の翻訳 API 作ってみた話です。 GAS のシンプル設計のおかげで実装は非常に簡単なので、 3 分でサクッと作れます。

## 1. GAS にアクセス

https://script.google.com にアクセスし、 `+ 新規スクリプト` を選択。GAS エディタが立ち上がる。

![スクリーンショット 2018-03-29 20.52.21.png](https://qiita-image-store.s3.amazonaws.com/0/19698/c1056ff2-8b6e-7737-7daa-435b117cfda3.png)


## 2. 実装

GAS プロジェクトに適当に名前をつけて、コーディング開始。コードは以下の 5 行で完成（エラーハンドリングサボってます）。

![スクリーンショット 2018-03-29 20.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/19698/cc4b823c-82b1-e125-5dda-16773b2bfd2d.png)

コードは以下。リポジトリはこちら > https://github.com/tanabee/google-translation-api

```JavaScript
function doGet(e) {
  var p = e.parameter;
  var translatedText = LanguageApp.translate(p.text, p.source, p.target);
  return ContentService.createTextOutput(translatedText);
}
```

### コードの説明

- 1, 5 行目: function 定義。ウェブアプリケーションとして公開する時に GET メソッドを受け付ける時のお約束の function 名。
- 2 行目: Event Objects からクエリストリングのオブジェクトを取得
- 3 行目: LanguageApp で翻訳実行
- 4 行目: 翻訳した文字列を return

## 3. デプロイ

以下ポチポチ作業でデプロイ。

![スクリーンショット 2018-03-29 20.50.45.png](https://qiita-image-store.s3.amazonaws.com/0/19698/235c8876-1495-8f02-a97d-a54465ba898d.png)

`公開` > `ウェブアプリケーションとして導入` を選択。

![スクリーンショット 2018-03-29 20.51.00.png](https://qiita-image-store.s3.amazonaws.com/0/19698/08110b0c-1f1f-d9be-78b1-00cef6ac67ed.png)

`新規作成` のところにバージョン番号（今回は初めてのバージョンなので 1 ）を設定。実行ユーザーは自分のメールアドレスを選択し、アクセス制限は `全員（匿名ユーザーを含む）` を選択して `導入` ボタンをクリック。

![スクリーンショット 2018-03-29 21.07.42.png](https://qiita-image-store.s3.amazonaws.com/0/19698/dc7e8fb7-d056-4424-e2f0-a506a1baef26.png)

すると URL が表示されるので、ここにアクセスすれば OK。

## API 叩いてみる

今回デプロイしたのはこちらの URL。

https://script.google.com/macros/s/AKfycbweJFfBqKUs5gGNnkV2xwTZtZPptI6ebEhcCU2_JvOmHwM2TCk/exec

アクセス方法は、 exec の後に ?text=`翻訳したい文字列`&source=`翻訳前言語`&target=`翻訳後言語` を指定して　GET リクエストする。試しに以下にアクセスするとレスポンスが適切に返ってくるはず（なにかしらの制限で落ちてる場合はすみません）。

`こんにちわ` を `英語` に翻訳: https://script.google.com/macros/s/AKfycbweJFfBqKUs5gGNnkV2xwTZtZPptI6ebEhcCU2_JvOmHwM2TCk/exec?text=こんにちわ&source=ja&target=en

`こんにちわ` を `中国語` に翻訳: 
https://script.google.com/macros/s/AKfycbweJFfBqKUs5gGNnkV2xwTZtZPptI6ebEhcCU2_JvOmHwM2TCk/exec?text=こんにちわ&source=ja&target=zh-cn

## まとめ

以上、サクッと翻訳 API を作れました。 GAS 最強ですね！

## 他の GAS ネタ

- [毎月 500 時間の社内ルーティンワークを GAS を使って自動化した話](https://qiita.com/tanabee/items/ce9c3cf9403c4f3f14a9)
- [GAS ビギナーが GAS を使いこなすために知るべきこと 10 選](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4)
- [社内メンバーの Qiita 新着投稿を Slack で共有するスクリプトを GAS で作った話](https://qiita.com/tanabee/items/665917d9ab976661115c)
- [GAS で Qiita Organizations のランキング作りました](https://qiita.com/tanabee/items/314fde5be566b93322e8)
Key Management Service について（各ベンダー）

#　概要
各ベンダーのサービス名

- AWS Key Management Service(KMS)
- GCP Cloud Key Management Service(CKMS)
- Azure Azure Vault
- Alibabacloud Key Management Service(KMS)

Azureだけサービス名が違うけどhashicorpから名前取ったのかな。
どのベンダーも使用方法は同じですね
ベクトル場の見やすい可視化（Python）

# 二次元定常流の見やすい可視化をPythonで使いたい
![all.gif](https://qiita-image-store.s3.amazonaws.com/0/146259/7404f342-ea48-9c73-60b7-b67d51e46047.gif)

# 元ネタ
* こちらのMatlabで書かれた記事を直接参考にしました https://ichiro-maruta.blogspot.com/2017/09/blog-post.html?m=1
* このグループが2012にやったのが初出のようだ http://hint.fm/projects/wind/

# 仕組み
* まずnl個の仮想粒子を置いて、それぞれについて与えられたベクトル場に基づいて流線(streamline)を計算し、(nt + 1)ステップ分の座標を保存します(get_streamlines)
  * 湧出し点でスカスカにならないよう、(nt + 1)ステップのうち真ん中を乱数で与えました
* nl個の流線それぞれについて、nt個のセグメントを時刻の関数で色付けします(plot_snap)
* ループで表示します（plot_anime、トップ画）
  * わずかnt = 30枚のループですが、ループしているようには見えないのではないでしょうか？nl個の流線それぞれについて、時刻をズラしているのがミソのようです
  * (x, y) = (-0.3, -0.3)辺りから生えてる流線を追ってみるのが分かりやすいと思います

# コード
https://gist.github.com/ysdtkm/007e39824992f0b5085f37e487c6cdd4
注意: rm -rf imgを含みます。何もない場所で実行してください

# 発展
* 非定常流への拡張
* Cartopy等と連携して地図上の曲がった座標系でプロット
gitの設定に関して


----
ユーザ単位で影響
~/.gitconfig
~~~
[user]
        name = "名前"
        email = 通知先のメールアドレス
[core]
        autoCRLF = false
~~~
`[user]`はcommitする際などに記録されるので推奨
`[core]`の`autoCRLF = false`はclone時に自動的にCRLFに変換されてしまうため
Rのforは遅いと誰が言った？ (data.frameの高速演算には列ごとならlapply、行ごとならReduceを使おうの補足)

先日の

[data.frameの高速演算には列ごとならlapply、行ごとならReduceを使おう](https://qiita.com/Atsushi776/items/176426e2195b18eb65b4)

がTwitter上で予想以上のLike, Retweetを頂いております。
軽い気持ちで書いた記事だったのでもう少し踏み込みます。

# 先日の記事について

matrixを行ごとの和を求める場合、100行100列なら

rowSums < apply < for

であることを示しました。
また、data.frameの場合は、

Reduce < rowSums < apply < for

であることを示しました。

そして、rowSumsやapplyはmatrixに特化しており、data.frameをmatrixに変換するオーバーヘッドが発生するのに対し、Reduceはdata.frameをそのまま扱うことが可能なことが一因と説明し、データごとに最適な計算を考えましょうと訴えました。

しかし、以下の疑問が浮いてきました。

- Reduceに入力された変数は、要素を順々に処理するので、行が増えた場合、rowSumsやapplyより遅くなるのでは？
- forならdata.frameに最適なコードを記述すれば、matrix用の関数(rowSumsやapply)より速くなってもいいのでは？
    - しかもイマドキ(R > 3.4.0)ではJITがforも加速する

# 実験

先日のコードの修正したものをもとに、100行100列のdata.frameを始めとして、100行10万列までテストデータを巨大化しつつ、ベンチマークします。

```r
library(microbenchmark) # ベンチマークようのパッケージ
set.seed(123) # 乱数を固定
nr <- 100 # テストデータの行数
nc <- 1e+2 # テストデータの列数

x <- as.data.frame(matrix(runif(nr*nc), nr, nc))
# テストデータの生成

plot(microbenchmark(
  Reduce = Reduce(`+`, x),
  rowSums = rowSums(x),
  apply = apply(x, 1, sum),
  "for" = {
      y <- numeric(ncol(x2))
      for(i in 1:nrow(x2)) y <- y + x[[i]]
      y
  }
), xlab = '', ylab = 'nano sec', log = 'y')
```

## 100行100列

![000005.png](https://qiita-image-store.s3.amazonaws.com/0/149890/7abf670b-812c-f293-6645-dc2fcc821cd4.png)

Reduce速い！
forおっそ！

## 100行1,000列

![000009.png](https://qiita-image-store.s3.amazonaws.com/0/149890/8ce08dfe-de36-61e1-1030-c81eb3022271.png)

Reduce速い！
やはりforおっそ！

## 100行10,000列

![00000b.png](https://qiita-image-store.s3.amazonaws.com/0/149890/b740f7b3-c86b-93cb-2a6f-8f1177207e92.png)

Reduce速いけど、あ、あれ？！ for頑張ってる？

## 100行100,000列

![00000d.png](https://qiita-image-store.s3.amazonaws.com/0/149890/bab42d0d-b926-023c-1f4c-49fed739a9a0.png)

おおお？！ forはええ！！

# 結論

先日結論した通りデータに最適なコードはやはり大事。
data.frameの行の和を求める場合

Reduce < rowSums < apply

の関係は少なくとも100行100列から100行10万列までは変わらない。

forは列数(すなわち繰り返し回数)が少ない時は遅いが、多い時は最速にすらなりうる(最適化は大前提として)。
多分、forの場合、繰り返し回数が少ないとJITコンパイルの所要時間が相対的に長いのだと思う。

# おまけ

100行100,000列のmatrixもforが速い！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/be04b607-13fb-15b8-8d16-f45a60a4857e.png)


# Enjoy!!
ボーレートのチェック

baudrate.pyというボーレートをチェックするプログラムがあることを知って試してみたのだが、自分の環境ではうまく動かなかったので、FTのbitbangを使って作ってみた。

https://github.com/yamori813/FTBRD

環境はMacの雪豹です。

```
bash-3.2$ ./ftbrd 
Detectied baudrate : 57600
```

ロジックはbitbangで拾った128Kのデータの2ビット目で一番小さいパルス幅を確認して、その幅が3回続けて拾えた場合1パルスとして、ボーレートを算出しています。

信号線が不安定だとうまく動きません。

もっと良いロジックがありそうですが、とりあえず。

# 信号線の見分け方

以下のようなパターンがあったとします。4ピンのタイプが多いのですが、これは5ピンです。

![写真（2018-03-04 19.42） #2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/70eec690-a344-aa74-e1a5-b7ccacdb3c04.jpeg)

右から2番目がベタのパターンにつながっているので、GNDと推測されます。また右端のパタンが太い事と隣との間にコンデンサー(C184)が入っているのでVCC(3.3V)と考えられます。

左の2つにパターンがつながれているので、TX/RXと推測されます。後はFTのRXとGNDだけを接続してターゲットを起動してはボーレートが確認できればそちらがTXになります。
Amazon Sumerianでfbxファイルをインポートする

# はじめに
* ここ半年くらい、UnityでVR開発をしています。
* AWSでもVR開発ができるSumerianが登場したと聞いて、うずうずしてます！
* Unityでも使っていた3DオブジェクトをSumerianでも使いたいと思い、その方法を備忘録程度にメモっておきます。
* 細かい説明は省いておりますので悪しからず。

# Amazon Sumerianとは？
- AWS上でVR、AR、3Dのコンテンツを作れる。
- ブラウザ上で完結する。(UnityやUnreal Engine4のようなゲームエンジンをダウンロードしなくても良い！)
- Oculus Rift、HTC Vive、ARKit(iOS)に対応。(ARCore(Android)は近日中に対応予定とのこと)
- WebVRにも対応。(ただし、スマホのWebVR対応は別途自分でいじらないといけなさそう)


- ユーザーガイドはこちら(内容はどちらも同じ)
    - https://docs.aws.amazon.com/ja_jp/sumerian/latest/userguide/amazon-sumerian.html
    - https://docs.aws.amazon.com/sumerian/latest/userguide/sumerian-guide.pdf

# 2018年3月現在、プレビュー期間中
- つまり、AWSのアカウントを持っていれば無料で使える！
- これは触ってみなきゃ！

# Sumerianを触ってみた
## Scene作成
- SumerianのDashboardを開き、 **Create New Scene** をクリック。
![sumerian1.png](https://qiita-image-store.s3.amazonaws.com/0/200334/6919aea1-522b-ae22-410d-1430079c0830.png)

- Scene名を入力。ここでは「SampleScene」とします。
![sumerian3.png](https://qiita-image-store.s3.amazonaws.com/0/200334/da6e3709-6f40-90e7-8087-41821b5a5a7e.png)

- エディタ画面はこんな感じ。Unityっぽい。
![sumerian4.png](https://qiita-image-store.s3.amazonaws.com/0/200334/bec1e009-a4c3-faaa-eb31-dc2df81e93eb.png) 

## fbxファイルをインポート
- 今回はボーリングピンのfbxファイルをSumerianにインポートしてみます。
- エディタの左下にある **Assets** の枠内に、インポートしたいfbxファイルをドラドラ。そうすると、Assetsの中にfbxファイルが表示される。
![sumerian_pin_import.gif](https://qiita-image-store.s3.amazonaws.com/0/200334/09c8861f-1b08-b47f-feb9-b4ed7651d60f.gif)
- インポートされたfbxファイルの中の、Entityマーク(六角形)を中央のScene画面にドラドラ。
    - 私は最初、その上のAsset Packごとドラドラして、上手くインポートができず。詰まりましたw
    - UnityでいうGameObjectが、SumerianではEntityに該当するようです。
![sumerian_pin_import2.gif](https://qiita-image-store.s3.amazonaws.com/0/200334/a0d2e868-89ab-99bb-4549-6a12ea5d67e2.gif)
- あれ、表示されたのは、真っ黒なボーリングピン。左上の **Entities** にあるピンEntityをクリックし、Lightをアタッチしましょう。(Light Entityを追加するのでもOK)
![sumerian_pin_light.gif](https://qiita-image-store.s3.amazonaws.com/0/200334/9695f016-f433-18fe-4d63-51d910b63825.gif)

- ボーリングピンを表示できました！

## Publish
- エディタ上部にある、SceneからPubulishをクリック。
![スクリーンショット 2018-03-30 10.49.31.png](https://qiita-image-store.s3.amazonaws.com/0/200334/8392af37-3c6f-353c-7072-105bced20606.png)
- Publishをクリック。
![sumerian6.png](https://qiita-image-store.s3.amazonaws.com/0/200334/d8f787b9-2008-ddf8-5c9b-9dd4447851ac.png)
- バックアップを取っておいた方が良いですよーみたいなことが書いてあるので、ここはOKをクリック。
![sumerian7.png](https://qiita-image-store.s3.amazonaws.com/0/200334/bb51aeb8-1275-1abe-ab28-217568f38305.png)
- Pubulishに成功すると、ブラウザ上で作成したSceneを見れる。
- Publishしたものはこちら。
    - https://d1tsyd7599mesx.cloudfront.net/b325f7daae1e43bcbd9796776fa2edaa.scene/

# 感想
- インポート自体はとっても簡単！objファイルでもインポートできるそうです。
- エディタの画面はUnityに似ているので、Unityを使ったことがある人はすんなり使えそうな印象。
- 後々は、UnityプロジェクトをSumerianにインポートして使えるそうなので楽しみ。
- そして、もっとSumerianを触りたい欲が出てきた！！！
- プレビュー期間中に皆さんもぜひSumerianを触ってみて欲しいです！
「.」が入っているcookieが取得出来ない

こういうクッキーがあったとする(GTMで作成する時はこういうクッキーで投げられる事がある？)

```
hoge.fuga
```

その場合PHPの「$_COOKIE」を使った場合いつもどおり

```php
$_COOKIE['hoge.fuga']
```
で取得しようとすると、undefinedになる。

中身を確認すると

```php
$_COOKIE => ['hoge_fuga']
```
と「.」の部分が「_」に変更されている事がわかるので
取得する時は


```php
$_COOKIE['hoge_fuga']
```

で取りましょう。

PHP以外では試してないので他の場合はどうなるかは未検証！！
取得出来ない場合は先入観捨てて、さっさと全取得等でどう書けば取得出来るか確認しよう！
インドネシア語対応してたらgolintとgo-i18nに怒られた。

# TL;DR
インドネシア語はISO639言語コードで表すと"id"だが、go-i18nでは"in"で代用可能

# golintに怒られた。
インドネシア語のリソースを追加するため言語コードを調べたらまさかの"id"
とりあえずやるだけやってみようと思いリソース追加の対応を開始。

カラムの命名がよくないと言ってしまえばそれまでだが、

```
HOGE_TITLE
HOGE_TITLE_EN
```
このようにカラムを作っているため、Entity等は

```
hogeTitle
hogeTitleEn
```
のようにしていた。
そのためインドネシアの"id"を付与したカラムを追加すると以下のようになった。

```
hogeTitleId
```
lintでチェックしてみたら当然

```
struct field hogeTitleId should be hogeTitleID [go/golint]
```
**知ってた。**

# go-i18nに怒られた。
"id"がだめなら仕方ない統一感はなくなるが3文字で"ind"にしてみよう。

```
hogeTitleInd
```
lintチェック問題なし。よしよし。
問題なさそうだしリソースファイル追加しよう。

ind.all.json を追加してビルド！

```
panic: no language found in "ind.all.json"
```
**なん・・・だと・・・**

どうやらgo-i18nではもともと決められた言語コードしか対応していないようだった。適当に作ってもだめなんですね。そりゃそうか。

# 回避策
ドキュメントを読み進めているとgo-i18nのREADMEに

```
Supports pluralized strings for all 200+ languages 
in the Unicode Common Locale Data Repository (CLDR).
```
こんな記述がだいぶ上のほうにあった。先にREADME見ましょうってことですよね。
Unicode Common Locale Data Repositoryの[リンク先ページ](http://www.unicode.org/cldr/charts/28/supplemental/language_plural_rules.html)を確認すると
Indonesianの所にこんなことが書いてあることを発見。

| Code | Type |
|:-:|:-:|
| <font color="Red">in</font>  |  =<font color="Red">_id_</font> |

inで定義すればidと同義として受け取ってくれるということだと思い、ためしてみます。

in.all.json のリソースファイルを追加してビルド
今回はビルド成功しました！
リソースファイルの方が問題なかったのでEntity等も

```
hogeTitleIn
```
として追加していきます。
こちらのlintチェックも問題ないことを確認して無事解決。

# 教訓
ドキュメントはちゃんと読みましょう。
TypeScriptで関数にプロパティを定義する

# 問題

JavaScriptでは、関数もオブジェクトなので、こんなことができます。

```ts:func.ts
function func() {
  return "FUNCTION"; 
};
func.prop1 = "property 1";
func.prop2 = () => { 
  return "PROPERTY2";
};

func(); // -> FUNCTION
func.prop1; // property 1
func.prop2(); // -> PROPERTY2
```

では、このような場合、どうやって型定義するのでしょうか。

# 答え
functionとnamespaceでそれぞれ定義してあげます。

```ts:func.d.ts
declare function func(): string;
declare namespace func {
  let prop1: string;
  function prop2(): string;
}
```

以上です。よろしくお願いいたします。
Android Gradle Plugin 3.0移行でやったこと

公式ドキュメントも充実してもう書くことはないんじゃないかってぐらいだけど
理解しきれていない部分があるのでAndroid Gradle Plugin 3.0でやったことをメモ。

## 1. gradle-wrapper.propertiesの更新

```groovy
distributionUrl=
  https\://services.gradle.org/distributions/gradle-4.1-rc-1-all.zip
```

## 2. build.gradleの修正

```groovy
-- compile 'com.hogehoge.age:hoge:1.0.0'
++ implementation 'com.hogehoge.age:hoge:1.0.0'
```

configurationは不要

```groovy
-- degubCompile project(path':hogelib', configuration: 'debug')
++ debugImplementation project(':hogelib')
```
appが依存しているモジュールはappのBuildVariantを引き継ぐから上記でいけるという理解。

以前はconfigurationでbuildTypeを指定するところを意識することなく設定できる。

### :point_up: flavorが設定されていたら
下記のように書ける

```Groovy
flavor1Implementation project(':hogelib')
```

### :point_up: 依存モジュールを取り除く

```
flavor1Implementation (project('hogelib')) {
   exclude group:'com.xxx.xxx' module:'hoge'
}
```

## 3. google()の追加とgradleの更新
```
buildscript {
    repositories {
        google()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}

```

## 4. ProductFlavor時の設定
productFlavorsが設定されている場合、`flavorDimensions`を設定する必要がある。

- app側

```groovy
    flavorDimensions "environment"

    productFlavors {
        flavor1 {
            dimension "environment"
        }
        flavor2 {
            dimension "environment"
        }
    }
```

- 依存モジュール側

```groovy
    flavorDimensions "environment"

    productFlavors {
        flavor1 {
            dimension "environment"
        }
        flavor2 {
            dimension "environment"
        }
        flavor3 {
            dimension "environment"
        }
    }
```
### :point_right: アプリ側にのみ存在するBuildTypeがある場合
これはアプリと依存モジュールに同じflavorDimensionsが存在する場合
でもflavorはお互い設定が違うよって時に使用します。

- app側

```Groovy
android {
  ~ ~ ~ ~
    productFlavors {
        flavor1 {
            matchingFallbacks = ['flavor3', 'flavor4']
        }
        flavor2 {}
    }
}
```

- 依存モジュール側

```Groovy
android {
  ~ ~ ~ ~
    productFlavors {
        flavor3 {}
        flavor4 {}
    }
}
```

### :point_right: 依存モジュール側にのみ存在するflavorDimensionsがある場合

依存ライブラリのflavorDimensions名、再優先の依存ライブラリのflavor名、次に優先するflavor名を指定する。

- app側

```
android {
    defaultConfig{
    　　missingDimensionStrategy [flavorDimensions名], [flavor1], [flavor2]
    }
}
```
背景色に対して文字色は白か黒か、判定する。

### コントラストによって判定する。
https://www.w3.org/TR/AERT/#color-contrast 

```js
is.dark(hex);
```
```js
let is={}
;
is.dark=(d)=>{
 //https://www.w3.org/TR/AERT/#color-contrast 
 let c=d,f=(c)=>{return ((c[0] * 299 + c[1] * 587 + c[2] * 114) / 1000)}
 if(c.charAt(5)=='') return; 
 c=c.replace('#','').match(/.{2}/g).map(d=>parseInt(d,16))
 return (f(c)<128)
}
```
### 全部
```html
<input></input><label>is.dark(hexColor)</label>
<style>
label{padding:0 0.5rem}
.white{color:#fff}
.black{color:#000} 
</style>
```
```js
let fn={},is={}
fn.q=(d=>document.querySelector(d))
;
is.dark=(d)=>{
 //https://www.w3.org/TR/AERT/#color-contrast 
 let c=d,f=(c)=>{return ((c[0] * 299 + c[1] * 587 + c[2] * 114) / 1000)}
 if(c.charAt(5)=='') return; 
 c=c.replace('#','').match(/.{2}/g).map(d=>parseInt(d,16))
 return (f(c)<128)
}
;
fn.q('input').oninput=function(ev){
 let c=this.value,el=fn.q('label')
 el.style.backgroundColor=c;
 let cls=is.dark(c)?'white':'black';
 el.classList.remove('black')
 el.classList.remove('white') 
 el.classList.add(cls)
}

```
将棋盤の星(4点の黒丸)をCSSで表現

# まず将棋盤を table タグで表現

```sass:sass
table
  background: black
  border-collapse: separate
  border-spacing: 1px
  width: 80vmin
  height: 80vmin
  td
    background: white
```

`border-collapse: separate` で作ると簡単です。

# td タグの中に●を作る

次の、任意のクラスの背景に任意の画像を差し込むイディオムがあります。
これを知っているとだいたいなんでもできます。

```sass:sass
.foo
  position: relative
  &:after
    position: absolute
    z-index: -1
    content: ""
    background-image: url("path/to/image.png")
    background-position: center
    background-size: cover
    opacity: 1.0
    top: 0
    left: 0
    width: 100%
    height: 100%
```

上を応用して次のように角を50%丸めた四角形をtdに埋め込みます。

<p data-height="423" data-theme-id="0" data-slug-hash="XEZedd" data-default-tab="css,result" data-user="akicho8" data-embed-version="2" data-pen-title="Japanese Chess Board Star CSS Sample" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/XEZedd/">Japanese Chess Board Star CSS Sample</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# ●の位置調整

```sass:sass
top:  calc(-4vmin / 2)
left: calc(-4vmin / 2)
```

4vmin は width, height にも指定している大きさ(直径)でこの半分(半径分)を左上にずらします。

これで交差点に●が乗ります。

本当は `calc(width / 2)` とか `50%` とか書きたかったんですがそんな都合良くは書けないようなので妥協しています。

# 特定の位置だけにする

tr と td に `nth-child(3n+4)` を指定すると中央の4点だけが残ります。

```sass:sass
tr:nth-child(3n+4)
  td:nth-child(3n+4)
```

# 色や大きさを調整して完成

<p data-height="438" data-theme-id="0" data-slug-hash="ZxrJJP" data-default-tab="css,result" data-user="akicho8" data-embed-version="2" data-pen-title="Japanese Chess Board Star CSS Sample" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/ZxrJJP/">Japanese Chess Board Star CSS Sample</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
azure 仮想マシン シャットダウン 課金を防ぐための確認方法

メモ代わりに書いています。Azureの停止しているつもりが課金状態だったということがあったので、人はミスをするものという考え方で確認する方法をまとめてみました。
月、週に１回程度回したほうがいいのかなと思って探してみたのですが、リソースグループを指定する方法しかなかったので
Azureのサブスクリプション毎の仮想マシンの状態確認方法をまとめました。

#止まっている仮想マシン一覧
Azureで課金状態になってしまう仮想マシン名を出力します。これがしたくて調べました。
az vm list -d --query "[?powerState=='VM stopped'].{name:name}" --out table

#完全停止し、課金対象ではない仮想マシン一覧
まあ、確認用ですね。
az vm list -d --query "[?powerState=='VM deallocated'].{name:name}" --out table

#稼働中の仮想マシン一覧
停止している仮想マシンが無い時の確認用です。
az vm list -d --query "[?powerState=='VM running '].{name:name}" --out table
データ分析

・クエリを書く前に何の目的でどう使われるのか、またどのくらいの数字になるのか見当をつける。

・結果データを見て、業界水準などから見てどうなのかを考える。

・やってきた作業を元に自分が今どれくらいのことが、どのくらいのスピードで出来るかを考える。

・仕事をする前に、どのくらいの期間で終わらせられるか見当をつけ、結果的に掛かった期間を比べる。
　＞＞このギャップを小さくしていく

・パッケージを使う前に、そのパッケージの中身をコードで書いて見る
・線形代数。。
Java9 調査メモ

Java9で新しく追加された機能について知識を深めるために
チームメンバー各自で調査を実施し、調査結果を下記にまとめました。

【1】Project Jigsaw
　Javaをモジュール化できるもの。
　複数クラスを一つのパッケージとしてまとめることができ、
　Javaの依存関係をすっきりさせることができる。
　公開できるクラスの制限も便利。
　コーディング作業には直接影響しなさそう。

【2】Javadoc
　HTML5で書けるようになった
　└今迄は4までしか対応していなかったが5に対応して文法がシンプルになった。
　└モバイル機器の画面に対応できるようになった。

　Javadoc用の検索窓の追加
　└今迄はAPIの中身は検索窓がなかったためGoogleで検索していたが、
　　検索窓ができたことでAPIの調査が楽になりそう。

【3】変更不可能なコレクション要素が作りやすくなった
　具体例：List, Map, Set
　今迄はfinalを使っても.addなどで要素の追加ができるため、
　Collections.unmodifiableというメソッドを使って変更不可能なものに設定していたが、
　一文が長くなりコードが見にくいという問題があった。
　Java9ではList.ofメソッドを使うことで変更不可能なリストを簡単に作れるようになった。
　（コードが見やすくなる）
　Mapはいわゆる不変マップ。英語では"Immutable Map"。
　Listと同様、こちらも従来よりも簡単に書けるようになった
　（初期化の段階でMapに格納したい要素を羅列するだけで作成できる）。

【4】jshell
　JavaをShellのように実行できる。
　REPL（リプルと読む。Read-Eval-Print-Loopの略）の仕組み。
　コンパイルをする必要がなく、1行毎に実行可能なため動作確認や調査がちょっと便利になりそう。
　Javaを知らないけど他の言語を知っている人だとお試しでサクッと動かせるから便利かも。
　開発環境が必要ないので、開発環境自体の操作に不慣れな人でもJavaのコーディングを体感できる。
　(入門用に最適かも)
　大規模なコードの一部のみ実行するときに役立つかもしれない。
　jshellでは文末のセミコロンは不要らしい。
　jshell上でもMapが使える。新機能で新機能を試すことができるからちょっと楽しいかもしれない。

※全体的に感じたこと
　jshellやMapやその他もろもろなどの実装により若干使いやすくなったので
　開発者の負担が減るかもしれないバージョンアップでは？と思った。
　ただし完全新規のプロジェクトなどでしか使われないかも・・・？

以上
Windowsの便利機能とか持ち寄ってみた

Windowsを日常で使う際に知っておくと便利な知識をチームメンバーで持ち寄ってみました。
各項目ごとに、下記の定義で数値付けしています。
便利だと思った人数（最大５）：知ってた人数（最大５）

【1】ショートカット系
・エクセルのタイムスタンプ　５：３
　Ctrl+'＋'で日付、Ctrl+'＊'で時間が表示される
・Ctrl+Wで今いるタブだけ閉じる　５：２
・ウィンドウズ＋Tabでウィンドウ選択ができる　０：５
・ウィンドウズ＋矢印キーでウィンドウを寄せられる　０：３
・Ctrl+Alt+矢印キーで画面の向きを変えられる　０：３
・フォルダ内の移動　５：２
　Alt+矢印左右キーでの移動（ブラウザでの動作と同じ）

【2】裏技系
・ゴッドモード　５：０
　フォルダの名前を「Godmode.ED7BA470-8E54-465E-825C-99712043E01C」とするとウィンドウズの
　設定を一つの画面で管理することができる
・ウィンドウを激しく動かした時にすべてのウィンドウが最小化しないようにする　５：１
　コンピュータの簡単操作→キーボード動作の変更→ウィンドウの管理を簡単にしますのチェックを外す
　（エアロシェイクの無効化）

【3】便利機能
・付箋機能　５：５
　付箋を出したままシャットダウンしても次起動したときに表示されたまま
・スニッピングツール　５：２
　画面の共有が簡単にできる（スクショ）
・ショートカットの整理（頻繁に使うもの）　５：３
　スタートメニューに置く
　お気に入りに置く（目障りな場合はウィンドウの整理からレイアウト→ナビゲーションウィンドウを消す）
　クイックアクセスツールバーに置く

【4】その他
・ファイルサーバに接続がうまくできないときの解決法　５：１　
　コマンドプロンプトから「start/explorer {path}」を入力するとすんなりいける
・メモ帳のタイムスタンプ　５：２
　.LOGをメモ帳の一行目に書くとメモ帳を開くたびにメモ帳内にタイムスタンプが表示される
　（メモ帳を開きながらF5でも表示される）
・呼び出したいパスを指定して表示する　２：３
　ウィンドウズ＋Rで「シェル :{path}」で表示することができる
　スタートメニューの検索窓にパスを張り付けて飛ぶ

以上
PHPStormでnamespaceを一括変更

PSR-4に準拠してPHPのコードを書いている場合、ディレクトリー名を変更する際にnamespaceも変更しなければ行けません。

PHPStormでは、PHPStorm側にnamespaceを設定しておくことで、ディレクトリー名の変更と同時にnamespace名も変更するということができます。

# PHPStormの設定
<img width="1024" alt="namespace.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/10e7a840-132e-3d33-712d-863806a5a39e.png">

PreferenceのDirectoriesを開いて、
1. ディレクトリを選択
2. SourcesのところをクリックしてSourceFoldersに追加
3. pのところを押してSourcesFoldersにnamespace名を指定

この設定は、ちょうどcomposer.jsonの設定と対応するはずです。

```json:composer.json
     "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Domain\\": "domain/",
            "Infra\\": "infra/"
        },
    },

```

# ディレクトリをRename
SourceFolderとして設定されているディレクトリ以下のディレクトリでは、ディレクトリ名を変更する時にnamespaceも一緒に変更されます。

<img width="445" alt="スクリーンショット 2018-03-30 10.07.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/a033ffb0-db10-6929-0fa3-6b52a8fcfc50.png">

設定されていないディレクトリの場合は以下のようになるので、表示が違いますね。
<img width="316" alt="スクリーンショット 2018-03-30 10.06.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/c0f629a9-6bbb-0f19-fa36-6878a960bf40.png">
nodejsでES6を使うときのbabelメモ

nodejsでES6を利用する場合にBabelでのトランスパイラが必要になってくるので最低限の環境整備の仕方。

#必要なもの
* モジュール
    * babel-cli
    * date-utils
* ファイル
    * sample_es6.js ※ES6で書かれたjs
    * .babelrc

#概要
nodejsでes6(import/export)をそのまま使おうとしてターミナルから `node sample_es6.js` を実行すると `Uncaught SyntaxError: Unexpected token import` となって実行できないのでそれの解決メモ。

#検証
検証用にES6で書かれたjsファイルを作成。

```javascript:sample_es6.js
import 'date-utils';

const now = new Date();
console.log(now.toFormat('YYYY年MM月DD日 HH24時MI分SS秒'));
```

これを何も用意せずにnodeコマンドで実行すると

```
$ node sample_es6.js
...\sample_es6.js:1
(function (exports, require, module, __filename, __dirname) { import 'date-utils';
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3
```

というように`SyntaxError`が発生します。これを解決します。

#解決手順
これを解決するにはBabelというES6をNodeが理解してくれうようにES5に変換するツールをインストールします。

まずは必要なモジュールをインストールする。

```
$ npm install babel-cli
```

親のディレクトリに`.babelrc`を作成して、中身に↓を書く。

```json:.babelrc
{
    "presets": [
        [
            "env", {
                "targets": {
                    "node": "current"
                }
            }
        ]
    ]
}
```
※`"node":"current"` はnode側で自動的に利用するものは判別してくれるらしい？

あとは`ES6`で書かれたファイルを以下のコマンドで実行するのだが、その前に`babel-cli`をグローバルインストールする必要がある。

ということで実行

```
$ babel-node sample_es6.js
2018年04月06日 00時15分53秒
```

無事にSyntaxErrorも出ずに実行できました。
Android Studioでbuild.gradleやsetting.gradleの変更がうまく反映されないときの対処法

1. android studio の当該projectを閉じます。 
 ![androidstudio2.png](https://qiita-image-store.s3.amazonaws.com/0/245217/72accfa9-0a0c-639f-7c41-28633ac98f08.png)


1. project直下とうまく反映されないappフォルダやライブラリフォルダ直下の、.ideaフォルダと、.imlファイルを削除します。
 ![gradleの整え方.png](https://qiita-image-store.s3.amazonaws.com/0/245217/571f528e-3076-a560-1047-d2f965260a15.png)
![gradle整え方2.png](https://qiita-image-store.s3.amazonaws.com/0/245217/7cd07118-eaf8-2a76-8f88-b18c4abe4778.png)

1. android studioでprojectを開きなおします。

1. これで大体うまくいく。

-  欠点
  - .ideaフォルダ以下のファイルや.imlファイルがすべて作り直されるのでソースをgit管理してる場合は.ignoreにそれらを足しておかないと大量のdiffが生まれてしまう。
Explicit Invocation＋Action invocation phrase

GoogleHomeではExplicit Invocationを使用して↓のような少し高度な呼び出しが可能って噂は知っていたのですが、自身が作成したアプリでは動作しなかったので「なんか開発者が設定しないといけないのかな〜？よく分からないな…」位に思ってたのですが、実は特に何もする必要が無かった。
教えてくださった@ymotongpoo さんありがとうございました。:bow_tone1:
同じく開発者が何かしないといけないと思ってる方がいるかもしれないので投稿しておきます。(そんな人いないか？)
※以前動かなかったのは何だったんだろう…？たまたま？シュミレーターだったから？

![explicit-invocation-grammar.png](https://qiita-image-store.s3.amazonaws.com/0/200860/33176bbe-f209-ceae-d477-9c32201af58e.png)

さらには[GoogleHomeアプリ](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app&hl=ja)のショートカット機能と組み合わせるとかなり便利になることまで教えて貰いました。

#ショートカット設定方法
GoogleHomeアプリを起動し、「その他の設定」を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/200860/a40cb759-89cc-e2d6-79d9-7a7d661f78bb.png" width=40%>
<br><br>

「ショートカット」を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/200860/a133682d-e68e-5b30-a355-328b2caa2816.png" width=40%>
<br><br>

任意の値を設定
<img src="https://qiita-image-store.s3.amazonaws.com/0/200860/1ee6ed31-bfa3-a8f7-babc-ae5fa8536ef1.png" width=40%>
<br><br>

電車って言うだけで最寄り路線の情報にアクセスできた！
<img src="https://qiita-image-store.s3.amazonaws.com/0/200860/8d754df0-584d-9f14-2f03-c501940199eb.png" width=40%>

#参考
https://qiita.com/soundTricker/items/1d9d6bbe52caba5302af
https://developers.google.com/actions/discovery/explicit
https://docs.google.com/presentation/d/1uisVtlrBxOrlB4E1j3sFjJ3CgW_xJDFOzQpp5gK-1AA/edit#slide=id.p
｢Google Home｣でいろいろやってみた。 -IFTTT編-

話題のGoogle Homeで音声認識でメール送信までやってみた。

#準備するもの
1．googleアカウント
2．GoogleHome

#手順
###1．Google Home miniを電源に接続する

###2．IFTTTにログイン
Googleアカウントを使用して、IFTTTにログインする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/b04b5715-9fa1-ad63-ee6e-c43df983392d.png" height=50%; width=50%;>

###3. レシピ作成
1．IF This Then ThatのトリガーとなるThisの部分を選択する。
下図でthisをクリック。

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/0e518ae0-3a69-a198-e1db-b0149ec89c6a.png" height=50%; width=50%;>

2．Google Assistantを選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/fccde1dc-c596-7f40-8ae1-346f4aa38542.png" height=50%; width=50%;>

3．Google　Homeに話しかける内容を選択する。
内容は左から
・グーグルアシスタントに指定のフレーズを言った時
・グーグルアシスタンスに指定のフレーズを言った時
　(数字をアクションに使える)
・グーグルアシスタンスに指定のフレーズを言った時
　(テキストをアクションに使える)
・グーグルアシスタンスに指定のフレーズを言った時
　(数字、テキストをアクションに使える)

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/0fa376eb-fbbf-fea0-0769-e4698fb06ab1.png" height=50%; width=50%;>

今回は、
グーグルアシスタンスに指定のフレーズを言った時
　(テキストをアクションに使える)
を使用。

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/ace7e0e6-1570-5e7d-bfc5-2abe9504ebf9.png" height=50%; width=50%;>

4．呼びかけフレーズを作成
$がアクションで使用されるテキスト
ex)ジーメールで"おはよう"と送信する
※ トリガー作成の際には$の前後に半角スペースが必須

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/6f96454f-7537-6aa7-8b49-2e6abffe5b78.png" height=50%; width=50%;>


5．成功時のGoogle Homeの返答と使用言語を設定

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/b2eed42d-e05b-fe01-4f13-6c41a507bcf5.png" height=50%; width=50%;>

6．IF This Then ThatのトリガーとなるThatの部分を選択する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/51464c2d-e8f0-54d8-d2e4-78f5be57e2b0.png" height=50%; width=50%;>

7.Gmailを検索し、"Send an email"を選択する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/608ecf2d-d8bc-7480-8d01-fd20f25181f4.png" height=50%; width=50%;>

8．送信するメールの内容を設定

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/8f8e1d4b-6ce9-249c-00a2-4d175cd5789d.png" height=50%; width=50%;>

下図のようなレシピが作成される。
Finishボタン押下で完成する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/190792/f471d4b2-f24f-5f4b-4700-a669d724ad8a.png" height=50%; width=50%;>


###4. Google Homeに問いかけ

いざ、問いかけ！！
OK　Google　ジーメールでこんにちはと送信する！！！！！（全力）

Google　Home　「……」(沈黙)


#失敗

え？無反応？
Google　Homeさん不機嫌…？

Gmailも送ってくれていない…

どうしてなの…

#なぜ失敗した？

単純に申し上げますと、
AndroidのバージョンがGoogle Assistantに非対応でした。

○Google Assistantの対応バージョン
　・Android5.0以上
　・iOS10以上

まさかバージョンが対応していないなんて…
最新の技術を使用するなら、スマートフォンも最新ではないといけないということなのか…

#所見

ちなみに後日、Google Assistant対応バージョンの機種で同じ手順を踏んだところ…

無事成功しました！！

対応バージョンのことはGoogleのGoogleアシスタント ヘルプに載っていますが、
確認してから実践してみるのがよいかと思います。
Laravel/Goutteで映画タイトルをクローリングする

映画好きの悩みとして「映画館をハシゴする時のスケジュール調整がアナログ」というものがあります。
例えば、「今日はリメンバー・ミーとシェイプ・オブ・ウォーターを見るぞ！」と鼻息を荒くしても、Google先生はそれぞれの映画がどこで何時に上映されるかは教えてくれますが、どういうルートでハシゴすればスムーズに移動できるかは教えてくれません。
ならば自分で作るしかない。ということでまずは映画の上映情報を網羅するために、クローリングを始めようと思います。

[このページ](https://github.com/dweidner/laravel-goutte)を参考にまずは自分のLaravelプロジェクトのディレクトリに移動し、laravel-goutteを入れます

```bash
$ cd ~/Sites/goutte-sample //自分のLaravelプロジェクト名のディレクトリに移動
$ composer require weidner/goutte
```
コマンドを打ってからしばらく待つ。成功したら「Package manifest generated successfully.」というメッセージが出てきます。

その後、Laravelプロジェクトのディレクトリ内にあるcomposer.jsonファイルに下記のように追記

```json:composer.json
{
    "require": {
        "php": ">=7.0.0",
        "fideloper/proxy": "~3.3",
        "laravel/framework": "5.5.*",
        "laravel/tinker": "~1.0",
        "weidner/goutte": "^1.0" // ここです
    },
```
同様にconfig/app.phpにも追記

```php:config/app.php

return [

    'providers' => [

        // ...

        /*
         * Package Service Providers...
         */
        Weidner\Goutte\GoutteServiceProvider::class, // ここと

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

    ],

    // ...

    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,

        // ...

        'Goutte' => Weidner\Goutte\GoutteFacade::class, // ここです
        'Hash' => Illuminate\Support\Facades\Hash::class,

        // ...
    ],

];
```
これで準備ができました。laravel-goutteのGithubページのreadmeには下記のサンプルがあります。
ファイルはroutes/web.php

```php:routes/web.php
Route::get('/', function() {
   $crawler = Goutte::request('GET', 'https://duckduckgo.com/html/?q=Laravel');
   $crawler->filter('.result__title .result__a')->each(function ($node) {
      dump($node->text());
   });
   return view('welcome');
});
```
今回は映画の情報を取得したいので、アップリンク渋谷で2018年3月30日時点で上映中の映画のタイトルを取得するコードを書きました。

```php:routes/web.php
<?php
   // アップリンクで現在上映されている映画を取得する
   $crawler = Goutte::request('GET', 'http://www.uplink.co.jp/movie-show/nowshowing');
   $crawler->filter('article.post h2 a')->each(function ($node) {
     echo $node->text();
     echo '<br/>';
   });
   return view('welcome');
});
```

結果は下記の通りになりました。無事に取得できているようです。
![スクリーンショット 2018-03-30 8.36.50.png](https://qiita-image-store.s3.amazonaws.com/0/210985/8217e753-4f25-b7dd-abcb-600e697f810a.png)

今回はクローラーを動かした程度の記事ですが、今後は下記の対応が必要になります。
①ページを遷移して取得
②映画ごとの上映時間の取得
③取得したデータのDB保存

検索していても日本語でドンピシャな記事があまり無かったので、下記の記事を参照に進めて行こうと思います。
[FriendsOfPHP/Goutte](https://github.com/FriendsOfPHP/Goutte)
Goutteにてもっと情報ほしければ下記を読めと記載あり
[BrowserKit component](https://symfony.com/components/BrowserKit)
[CssSelector Component](https://symfony.com/doc/current/components/css_selector.html)[DomCrawler Component](https://symfony.com/doc/current/components/dom_crawler.html)
↑名前的にこれが一番参考になりそう
[Guzzle Documentation](http://docs.guzzlephp.org/en/stable/)
kerasでautoencoder

#概要
kerasでautoencoderやってみた。


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2
keras2.0

#写真

![auto2.png](https://qiita-image-store.s3.amazonaws.com/0/18104/07ed3f22-f10f-f965-f873-1907a7650272.png)

#実行

```
Epoch 10/10

  
59136/60000 [============================>.] - ETA: 0s - loss: 0.1711
59904/60000 [============================>.] - ETA: 0s - loss: 0.1710
60000/60000 [==============================] - 4s - loss: 0.1710 - val_loss: 0.1672

```

#サンプルコード

```
from tensorflow.contrib.keras.python.keras.layers import Input, Dense
from tensorflow.contrib.keras.python.keras.models import Model
from tensorflow.contrib.keras.python.keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt

(x_train, _), (x_test, _) = mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1 : ])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1 : ])))

input_img = Input(shape = (784, ))
encoded = Dense(32, activation = 'relu')(input_img)
decoded = Dense(784, activation = 'sigmoid')(encoded)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer = 'adadelta', loss = 'binary_crossentropy')
autoencoder.fit(x_train, x_train, epochs = 10, batch_size = 256, shuffle = True, validation_data = (x_test, x_test))

decoded_imgs = autoencoder.predict(x_test)
n = 10
plt.figure(figsize = (20, 4))
for i in range(n):
	ax = plt.subplot(2, n, i + 1)
	plt.imshow(x_test[i].reshape(28, 28))
	ax = plt.subplot(2, n, i + 1 + n)
	plt.imshow(decoded_imgs[i].reshape(28, 28))
plt.savefig("auto2.png")
plt.show()
```

以上。
Nuxt.jsのパフォーマンス向上テクニック

Nuxt.jsのプロジェクトで使用しているパフォーマンス向上のためのテクニックです。

## .nuxt/dist と static ディレクトリはNginxから直接配信する

静的ファイルはNuxt.jsのサーバを使わずにNginxから配信します。CDNなどを使うともっと効果的でしょう。

```nginx
location / {
    root /path/to/nuxt/static;
    try_files $uri @proxy;
}
location @proxy {
    proxy_pass http://127.0.0.1:3000;
}
location /_nuxt {
    alias /path/to/nuxt/.nuxt/dist;
}
```

## APIエンドポイントをサーバーとクライアントで分ける

SSRのサーバとAPIサーバが同一LAN内の場合は、余計なネットワークコストを発生させないように、SSR時はLAN内で通信が閉じるエンドポイントを使うようにします。

```js
const config = {
  api_host: 'http://example.net/api/v1/',
  api_host_local: 'http://localhost/api/v1/',
}
```

```js
if (process.server) {
  axios.defaults.baseURL = config.api_host_local
} else {
  axios.defaults.baseURL = config.api_host
}
```

## デバイス種別を判断してDOMレンダリングを抑制する

デバイス種別ごとに表示内容を変化させたい場合、CSSフレームワークのレスポンシブの機能を使う場合が多いと思いますが、この方法だとDOM自体は生成されてしまいます。
デバイス種別を判断して`v-if`などでDOMのレンダリングを抑制することで、DOMのレンダリング量を減らしています。

こちらの例では[nuxt-device-detect](https://github.com/dotneet/nuxt-device-detect)というNuxtモジュールを使用しています。自前のモジュールですがnpmで公開していますので良かったら使ってみてください。

```vue
<div v-if="$device.isMobile">
  モバイル
</div>
<div v-else>
  デスクトップ
</div>
```

## API呼び出しは並列にする

Nuxt.jsは関係ないですが、asyncData()内などで複数の独立したAPI呼び出しがある場合に、毎回awaitせずにPromise.all()などを使うと並列にAPI呼び出しできるので高速になります。

```js
async asyncData({app}) {
  let [hogeResult, piyoResult] = await Promise.all([
    app.$axios.get('http://example.com/api/v1/hoge'),
    app.$axios.get('http://example.com/api/v1/piyo'),
  ])
}
```

## PWAモジュールを入れる

Nuxtの公式モジュールに[pwa-module](https://github.com/nuxt-community/pwa-module)というものがあります。これはモジュールを入れるだけでサービスワーカーなど、PWAに必要な機能を導入してくれる優れものです。
PWAモジュールは複数のモジュールの詰め合わせで、PWAモジュールに含まれるworkboxモジュールによってサービスワーカーが導入され、より強力にキャッシュが効くようになります。

```bash
yarn add @nuxtjs/pwa
```

```js
// nuxt.config.js
{
  modules: [
    '@nuxtjs/pwa'
  ]
}
```

## その他

以前書いたこちらの記事の「JSのサイズを小さくするために」の内容も初回レンダリングのパフォーマンス向上に役立つ場合があると思います。
[Nuxt.jsの本格導入で遠回りしないためのTips v1.1](https://qiita.com/devneko/items/afe12b8acaf9648ccbb6#tips-5-jsのサイズを小さくするために)
Kindle Cloud Reader > Error > この本はKindle Cloud Readerでは開けません。無料のKindle アプリをご利用ください。

```txt:動作環境
Ubuntu 16.04 LTS desktop amd64
Google Chrome バージョン: 64.0.3282.140（Official Build） （64 ビット）
Amazon Cloud Reader
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/de484948-3314-e942-084a-208cefd22457.png)

以下の本を開こうとしたら、上記のエラーとなった。

- 禅とオートバイ修理技術(下) by [ロバート M パーシグ](https://en.wikipedia.org/wiki/Robert_M._Pirsig)
- 人生計画の立て方 by 本多 静六
- たった一人の熱狂 by 見城徹

以下の本は開くことができた。

- The Wright Brothers as Engineers, an Appraisal and Flying with The Wright Brothers, One Man's Experience by Quentin R. Wald
- DWAN OF THE CLANS: WARRIORS, THE SUN TRAIL by ERIN HUNTER
- Introduction to Bessel Functions by Frank Bowman
- 銀の匙 Silver Spoon 14
- バイナリ畑でつかまえて by 山田胡瓜

他にも日本語フォントを含む電子書籍だけ上記のエラーになる。

英語フォントや画像となった漫画では問題はない。


Amazon Cloud Readerで読めない本(購入済)を確認するために、アカウントサービスからたどる方法も検索で見つかる。
アカウントサービスから調べるよりも、直接Kindle Cloud Readerで開くと確認が早いように思われる。
必ず成功する（はずの）Raspberry Piを使ったRTMPによるストリーミング配信の手順

# はじめに

ストリーミングで動画を配信する必要がでてきて、テストしたら思いのほか簡単にできたのでその手順を以下にまとめます。

# nginxでRTMPサーバを構築

以下のURLのとおり実行。

[nginxでストリーミングサーバを立ててライブ配信する。](https://qiita.com/hagane5563/items/842afe6d6e7100db3a28)

ちなみに、nginxの設定ファイルの中にあるhttpのserverのlocationの場所に以下の項目を追加しないと外部からの読み出しができず、Windowsのブラウザでストリーミングを再生できません。

```
add_header Access-Control-Allow-Origin *;
```

...これがわかるまでに何時間もかかってしまった(-_-;)

# Raspberry Piの環境構築

1. OSをインストール
2. ネットワークに接続
3. USBカメラを接続

以上。

# FFMpegのインストール

以下のコマンドを実行。

```
sudo apt update
sudo apt install -y ffmpeg
```

もし気になる方は再起動。

```
sudo reboot
```

# ストリーミング配信

## 音声なし

以下のコマンドを実行。
なお、「your ip」はRTMPサーバのIPアドレス、「your key」は任意の英数文字列に変更して下さい。

例：「your ip」は「192.168.1.10」、「your key」は「sample」など

```
/usr/bin/ffmpeg \
-f v4l2 -thread_queue_size 8192 -input_format yuyv422 -video_size 640x360 -framerate 8 -i /dev/video0 \
-c:v h264_omx  \
-f flv "rtmp://[your ip]/live1/[your key]"
```

## 音声あり

USBカメラにマイクが内臓されている場合、以下のコマンドで音声つきで配信できます。

```
/usr/bin/ffmpeg \
-f alsa -ac 1 -thread_queue_size 8192 -i hw:1 \
-f v4l2 -thread_queue_size 8192 -input_format yuyv422 -video_size 640x360 -framerate 8 -i /dev/video0 \
-c:v h264_omx -b:v 768k -bufsize 768k -vsync 1 -g 16  \
-c:a aac -b:a 128k -ar 44100 \
-f flv "rtmp://[your ip]/live1/[your key]"
```

できた！

# 備考

USBカメラの機種によっては、コマンドを終了させた後に再度実行するとエラーになるものがあるようです。その場合はUSBカメラを取り外し、再度取り付けてからコマンドを実行すると配信できるようになります。
TeX(LaTeX)で虫食い算を作る方法(6)（musikui.styの説明）

# はじめに
タイトルは「TeX(LaTeX)で虫食い算を作る方法(6)」です。つまり、割り算だけではなく、掛け算についても言及します。
2018/04/29にCTANに上がり、TeXLive2018に取り込まれました。

#さっそく本題
[前回の記事](https://qiita.com/NASAofJAXA/items/83149456b226fd60d785)では、割り算のパッケージを作成したことについて説明していましたが、今回、掛け算のパッケージと統合することに成功しました。
それが[こちら](https://github.com/puripuri2100/musikui.sty)です。

#構成に関するコマンド等
`musikui.sty`では`musikui`環境を提供しています。これは虫食い算一つにつき一回ずつ使います。

そして`\kake`・`\wari`・`\musi`・`\sen`の系4つの表現に必要なコマンドを提供しています（穴に関するコマンドは後述します）。
以下、その説明を行いますが、このパッケージが提供するいくつかのコマンドにわたす引数の特徴として、要素を表の`&`でつなぐ必要があります。注意してください（例としては`{1&2&3}`などです）。

##`\kake`
`\kake`コマンドには3つの引数をわたしてください。前から順に`掛けられる数``掛ける数``積`です。

##`\wari`
`\wari`コマンドには`\kake`コマンドと同様に3つの引数をわたしてください。前から順に`割られる数``割る数``商`です。

##`\musi`
`\musi`コマンドには2つの引数をわたしてください。前から順に`一つの段の穴``右端からのマス数`です。

##`\sen`
`\sen`コマンドには引数はいりません。これを書いたら横線が引かれます。

## `\bubunsen`
`\bubunsen`コマンドには引数が2ついります。前から順に`線の長さ``右端からマス数`
#穴のコマンド
`musikui`パッケージでは穴に関して6つのコマンドを提供しています。それは以下のとおりです。

- `\eaten`
- `\noneaten`
- `\halfeaten`
- `\halfnoneaten`
- `\hhalfeaten`
- `\hhalfnoneaten`

`\hhalfeaten`と`\hhalfnoneaten`以外のコマンドには引数は一つで、その穴の中に入れたい数ないし文字です。

機能について説明すると、`\eaten`は普通の穴です。わたした引数の中身が穴の中央に出ます。この穴は[ここ](https://qiita.com/NASAofJAXA/items/758253527f231a2cedca#%E6%99%AE%E9%80%9A%E3%81%AE%E7%A9%B4)に書いてある内容と基本的に同じです。`\noneaten`は線が無い`\eaten`です。

`\hhalfeaten`と`\hhalfnoneaten`は[前の記事](https://qiita.com/NASAofJAXA/items/758253527f231a2cedca#12%E7%A9%B4)で書いた`\halfeaten`です（紛らわしくてすみません）。つまり、縦にながり長方形が2つ並んだ形の穴が出て、その中にわたした引数が入ります（穴が2つなので当然引数も2つ）。

`\halfeaten`と`\halfnoneaten`は、`\hhlafeaten`の縦に長い長方形の穴が1つだけ出ます。使いみちは`1\halfeaten{}`みたいなものを予想しています（n進法虫食いでしか使わないかな？）。

（余裕があれば後で実例を加筆しておきます。）

#描き方
`musikui`環境の中には`\kake`か`\wari`を必ず一番最初に書いてください。
後は上から順に`\musi`と`\sen`を書いていくだけです。

#オプションとかとか
`musikui`パッケージでは、いくつかの数値を`\renewcommand`によって変えることができます。

変えられる数値とその意味は以下のとおりです。

- `\musiwidth`-穴の幅
- `\musiheight`-穴の高さ
- `\musidepth`-穴の深さ
- `\musihgap`-穴と穴の横の距離
- `\musivgap`-穴と穴の縦の距離
- `\musirule`-線の太さ

デフォルトでは上の数値は以下の通り

- `\musiwidth` 1.2em
- `\musiheight` 0.96em
- `\musidepth` 0.24em
- `\musihgap` 0.4em
- `\musivgap` 0.4em
- `\musirule` 0.4pt

#例
少しばかり例を書いてみます。
結果は後で加筆するかもしれませんがコンパイルしてみてください。

~~~latex
\begin{musikui}
\wari{\eaten{}&\eaten{}&\eaten{}&\eaten{}&\eaten{}&\eaten{}&\eaten{}&\eaten{}}
{\eaten{}&\eaten{}&\eaten{}}
{\eaten{}&7&\eaten{}&\eaten{}&\eaten{}}
\musi{\eaten{}&\eaten{}&\eaten{}&\eaten{}}{4}
\sen
\musi{\eaten{}&\eaten{}&\eaten{}}{3}
\musi{\eaten{}&\eaten{}&\eaten{}}{3}
\sen
\musi{\eaten{}&\eaten{}&\eaten{}&\eaten{}}{2}
\musi{\eaten{}&\eaten{}&\eaten{}}{2}
\sen
\musi{\eaten{}&\eaten{}&\eaten{}&\eaten{}}{0}
\musi{\eaten{}&\eaten{}&\eaten{}&\eaten{}}{0}
\sen
\musi{0}{0}
\end{musikui}
~~~

# おわりに
これでようやく快適にLaTeXで虫食い算を表現することができるようになりました。
嬉しい限りです（さあCTANにあげるための英語の勉強の始まりです）。
CentOS 7 OpenSSL 1.1.0hのソースファイルからのインストール

# 動作確認環境
事情によりバージョンをダウングレードしました。新しいバージョンでも動作するはずです。

- 仮想環境 VMware Workstation Player 12.5.9
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# 前提条件
- gcc 8.1.0
- cmake 3.11.4
- MySQL 5.7.22

# ダウンロード・展開
最新バージョンの確認
[OpenSSL](https://www.openssl.org/)

必要なパッケージをインストールする。

````
yum install perl
````


`/usr/local/src`ディレクトリ移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar xvzf openssl-1.1.0h.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd openssl-1.1.0h
````

コンパイル・インストール

````
./config --prefix=/usr/local/openssl shared zlib
make
make install
````
バージョン確認しようと`/usr/local/openssl/bin/openssl version`を実行すると、エラーが表示される。

````エラー内容
/usr/local/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
````
エラー対策を行う。
# エラー対策
`libssl.so.1.1`の場所を探し、`libssl.so.1.1`が見つかるように対策を行う。

````
find /usr -name "libssl.so.1.1"
/usr/local/src/openssl-1.1.0h/libssl.so.1.1
/usr/local/openssl/lib/libssl.so.1.1
````

`libssl.so.1.1`は`/usr/local/openssl/lib/`に保存されているので、対策する。

````
echo "/usr/local/openssl/lib/" > /etc/ld.so.conf.d/lib64.conf
ldconfig
````
これでバージョン表示される。
# バージョン確認

````
/usr/local/openssl/bin/openssl version
````
バージョンが表示される。

````
OpenSSL 1.1.0h  27 Mar 2018
````

# 参考
[OpenSSLをビルドしてApacheで利用する：仕事で使える魔法のLAMP（17） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1108/05/news122.html)
[サービスに使えるapache/opensslの構築方法 - LinuxとApacheの憂鬱](http://d.hatena.ne.jp/hiroppon/20081122/1228069519)
[How to fix Python Installation Error while loading shared libraries: libssl.so.1.0.0? Solved - Techglimpse](https://techglimpse.com/python-openssl-installation-error-solution/)
[OpenSSL - ネットワーク関連 - Linux ClockUpMemo](http://linux.clock-up.jp/contents/network/openssl)

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
Submitting the program of "Area on the cross-section diagram" with PHP

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_D&lang=jp
http://judge.u-aizu.ac.jp/onlinejudge/introduction.jsp

こちらのAIZU ONLINE JUDGEのプロコンに提出しようとしたものだが、なんかうまく採点されなかったので、ここに記しておこう（というかそもそもPHPで提出している人をほとんど見かけることができない）。
もしくはこのプログラムが想定できていないパターンがあるかもしれない。

なお、大分冗長です。

```PHP
/*
$st = microtime(true);
$sm = memory_get_usage();
*/

//$arr = file($argv[1]);
$arr = str_split($stdin = trim(fgets(STDIN)));

$d = 0;
$sd = 0;
$areas = array();
$ds = array();
//print(count($arr)."\n");
for($i=count($arr)-1,$is=count($arr)-1,$continue=false;$i>=0;$i--,$continue=false) {
	//print($arr[$i].",d:$d,sd:$sd\n");
	switch($arr[$i]) {
		case "\\":
		//	print("are\n");
			$d++;
			break;
		case '/': 
		//	print("sore\n");
			$d--;
			break;
		case "_":
			if ($d==$sd) {
				//print("hoge2:sd:$sd,d:$d\n");
				$sd = $d;
				$is = $i -1;
				$continue = true;
			}
			break;
	}
	if ($continue) continue;
	if ($is >0 && $d > $sd) {
		//print("hoge:is:$is,d:$d,sd:$sd\n");
		$sd = $d;
		$is = $i-1;
		continue;
	}
	if ($i<count($arr)-1 && ($d==$sd || $i==0)) {
		//print("cond:d:$d,sd:$sd\n");
		$dorg = $d;
		$d = $sd;
		$_d = $sd;
		$area = 0;
		$b = ($dorg!=$sd)? false : true;
		//print("is:$is,i:$i\n");
		for($j=$is;$j>=$i;$j--) {
			switch($arr[$j]) {
				case "\\": $d++; break;
				case '/': $d--; break;
			}
			if (!$b) {
				if ($dorg==$d) {
					$b = true;
					$d = 0;
				}
				$_d = $d;
				continue;
			}
			//print("calc:".$arr[$j].",d:$d,_d:$_d,area:$area\n");
			if ($_d==$d) $area += abs($sd-$d)*1;
			else $area += 0.5 + (max(abs($sd-$_d),abs($sd-$d))-1)*1;
			$_d = $d;
		}
		$d = 0;
		$sd = 0;
		array_push($areas, $area);
		$is = $i-1;
		//print("====is:$is====\n");
	}
}

/*
$et = microtime(true);
$em = memory_get_usage();
echo "time:".($et-$st).",memory:".($em-$sm)."\n";
*/

$out = "";
for($i=count($areas)-1;$i>=0;$i--) {
	if ($out) $out .= " ";
	$out .= $areas[$i];	
}
$out = array_sum($areas)."\n".count($areas)." ".$out;
print($out);
```

ポイントはいくつがあるが、基準の深さと現在の深さとの比較、水たまりの計算のために基準の高さからで計ることとか、水たまりは必ず囲いの中で測られるものを考慮することなど。
statsmodelsのapiをsklearn likeなwrapper経由で呼び出す

#はじめに

GLM（一般化線形モデル）などstatsmodelsにしかない機能を使いたいことがありますが、scikit-learnのapiと切り替えて呼び出そうとすると、呼び出しの順序や引数を渡すタイミングが異なっていて不便です。

そこでstatsmodelsのapiをscikit learn風に呼び出せるwapperクラスを作りました。

# wapperの定義
```py 
class SMWrapper():
    def __init__(self, base_cls, fit_intercept=True, **params):
        self.base_cls = base_cls
        self.fit_intercept = fit_intercept 
        self.params = params
        
    def fit(self, x, y, sample_weights=None):
        _x = sm.add_constant(x) if self.fit_intercept else x
        self.base_instance = self.base_cls(y, _x, freq_weights=sample_weights, **self.params)
        self.results = self.base_instance.fit()
        return self

    def score(self, x, y, sample_weights=None):
        self.fit(x, y, sample_weights)
        return self.base_instance.score(self.results.params)
    
    def predict(self, x):
        _x = sm.add_constant(x) if self.fit_intercept else x
        return self.base_instance.predict(self.results.params, _x)
```
#使用法

```py
import numpy as np
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm

x = np.arange(0, 20)
y = np.random.poisson(x+1, x.shape[0])

# regressor = LinearRegression()
regressor = SMWrapper(sm.GLM, family=sm.families.Poisson())
regressor.fit(x, y)
pred_y = regressor.predict(x)
```