OmniAICreator/Qiita-1.07M huggingface dataset:
RailsをMySQL対応した方法

## Gemfileの書き換え
sqliteがデフォルトなのでmysql2に変更

```ruby:Gemfile
#gem 'sqlite3'
gem 'mysql2'
```

```
$ bundle install
```

## MySQL接続用のアカウントを作成する
（参照した記事：　https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288）
MySQLはホスト名、ユーザー名、パスワードの指定が必要なので、MySQLを起動し、作成する。

```terminal
$ mysql -u root
```

```sql
mysql> create user 'ユーザー名'@'localhost' identified by 'パスワード';
```

作成されているかどうかを確認する。

```sql
mysql> select User,Host from mysql.user;
```

問題なければ作成したアカウントに権限を付与する。

```sql
mysql> grant all on *.* to '[ユーザー名]'@'localhost';
```

## config/database.ymlの書き換え
Gemfileを書き換えるだけではMySQLは繋がらないのでdatabase.ymlも対応させる。

```ruby:/config/database.yml

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [アプリ名]_development
  pool: 5
  username:設定したユーザー名
  password:設定したパスワード
  host: localhost

test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [アプリ名]_test
  pool: 5
  username:設定したユーザー名
  password:設定したパスワード
  host: localhost

production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [アプリ名]_production
  pool: 5
  username:設定したユーザー名
  password:設定したパスワード
  host: localhost
```

## databaseを作成する
```sql
mysql> create database database名
```

以上
[自分用]linuxコマンド辞典

自分用メモとして都度更新

#ディレクトリ作成
```sh:
#ディレクトリが存在しなければ作る
mkdir -p ディレクトリ名
```

#なんとなく汎用で使えそうなシェルスクリプト

##tar

```sh:
#解凍
tar -xzvf /tmp/ファイル名.tgz
#圧縮
tar zvcf /tmp/圧縮されるファイル名 圧縮するファイル名
```



#ファイル検索系
##find
**ファイル名検索したい場合**

```sh:
$ find "検索対象ディレクトリ" |grep ファイル名
sample
$ find . |grep abc 　→カレントディレクトリをabcで検索
```

##grep

@hirohiro77さんの記事がとても詳しい　https://qiita.com/hirohiro77/items/771ffb64dddceabf69a3

**一つのファイルを対象にする場合**

```sh:
$ grep -l '置換する文字列' 置換するファイル | xargs sed -i.bak -e 's/置換する文字列/置換したい文字列/g'
```

**カレントディレクトリのファイル全てを対象にする場合**

```sh:
$ grep -l '置換する文字列' ./* | xargs sed -i.bak -e 's/置換する文字列/置換したい文字列/g'
```

**ファイル名に正規表現を使う場合**

```sh:
$ grep -l '置換する文字列' ./* | xargs sed -i.bak -e 's/置換する文字列/置換したい文字列/g'
```

**ファイルの中身の文字列を、ディレクトリの下層まで検索したい場合(nは行番号([n]umber))**

```sh:
$ grep -rn '検索したい文字列' *
```

#権限変更

```sh:
#ユーザ・グループをapacheに変更
#-Rでディレクトリ以下全てを変更する
sudo chown -R apache:apache ディレクトリ名
#パーミッション変更 SCPからアクセスも考慮し755,655
sudo find ディレクトリ名 -type d -exec chmod 775 {} \;
sudo find ディレクトリ名 -type f -exec chmod 675 {} \;
```

#ホスト接続系

##ssh

**指定ユーザ名でホストに接続する場合**

```sh:
$ ssh ユーザ名@ホスト名
sample rootユーザで接続する
$ ssh root@XXX.XXX.XXX.XX
```

#SQL接続

##MySQL

**ユーザ名指定でDBに接続する場合**

```sh:
$ mysql -u ユーザ名 -p
sample パスワード入力(-p)ありでrootユーザで接続する
$ mysql -u root -p
Enter password:パスワード入力
```

※sql構文は別途作成予定

##PostgreSQL

**ユーザ名指定でDBに接続する場合**

```sh:
$ psql -h ホスト名 -p ポート -U ユーザ名 -d DB名
Enter password:パスワード入力
```

CSV形式のデータを投入する

```sh:
\copy テーブル名 from '/tmp/CSVファイル名.csv' with csv
```

#なんとなく汎用で使えそうなShellScript

###tarに固めるsh（やっつけ

```sh:
mkdir -p 格納用ディレクトリ名
today=$(date "+%Y%m%d")
sudo cp -ar ファイル名 ./tgz_dir/. #格納用ディレクトリにコピー
sudo tar zcvf "格納用ディレクトリ/ファイル名${today}.tgz" ファイル名
```

###解凍するsh（やっつけ
※ファイルがなかった時とか考慮していないので要メンテ

```sh:
mkdir -p backup
today=$(date "+%Y%m%d")
#ディレクトリ_当日日付でバックアップ
echo "BackUp Older Version -> ./backup/"
sudo cp -pr バックアップファイル名 ./backup/バックアップファイル名_${today}
#解凍先に解凍する 引数はYYYYMMDD
echo "Delete Temporaly Apply File"
rm -rI 前回のtmpファイル削除_
echo "作業ディレクトリ移動"
cd 作業ディレクトリ/
echo "tar zvxf"
tar -xzvf /var/www/作業ディレクトリ/ファイル名_${today}.tgz
echo "rename"
mv /var/www/一時バックアップ /var/www/一時バックアップ_
echo "DocumentRootにセット"
mv /var/www/tgz_dir/解凍したファイル /var/www/.
#権限を●に変更
echo "Change Owner ●"
sudo chown -R ●:● /var/www/ファイル名
#パーミッション変更
echo "Change Mode 775 / 655"
sudo find /var/www/ファイル名 -type d -exec chmod 775 {} \;
sudo find /var/www/ファイル名 -type f -exec chmod 655 {} \;
```
Gmailの開封率を計測する方法

# やりたいこと

Gmailで送ったメールがどれくらいのユーザーに開封されているのかを知りたい。

先日私が所属する新規事業チームでメルマガを登録済みユーザーへ送る機会がありました。

そこで、せっかくならどれくらいのユーザーに開封されているのかを知って、メルマガについてもしっかりとPDCAを回していこうよ。という話になり計測してみることになったのです。

どのようにすれば計測できるのか。使うのはGmailのリッチテキストとGoogleAnalyticsです。

# 実装方法

Gmailの計測にはMeasurement Protocolという通信仕様を利用します。なお、<img>タグを利用してトラッキングするため、HTMLメールでのみ、開封測定が可能です。

HTMLメールである必要があるのでリッチテキストを使う必要があるのですね。

では実装方法を手順化しますのでこの順にやってみてください。なおそれぞれの手順の詳しいやり方については他の方の記事を貼っておきますのでそちらを参考にしてください。

## ①リッチテキストでメールを作成する
https://www.webdlab.com/labs/html-mail/

## ②下記記事を参考にbodyの一番下に計測用のコードを仕込む
https://blog.siteanatomy.com/2017/11/email-open-analytics.html

# まとめ
GoogleAnalyticsはすごい。
UI > 「xxxを削除しますか?」ダイアログ > デフォルトボタン > キャンセル (破壊的なコマンドの安易な実行を避ける)

### UI

「xxxを削除しますか？」というダイアログが表示され、ダイアログ内にOK, Cancelボタンが表示されるUIはよく使われる。

ここで、OK, Cancelボタンのどちらをデフォルトボタン(*1)にするか?

*1) Enter入力で実行される方

破壊的なコマンドを実行する可能性がある場合は、非破壊をデフォルトとする、というのを本かWeb資料で読んだことがある。
(資料を失念中)

上記の例では、「Cancel」をデフォルトにするのが良いだろう。

### 関連

#### 破壊的なコマンド

- [UI > Guildelines > Windows > Guidelines > Confirmations 意訳 / 抜粋](https://qiita.com/7of9/items/4f3f907b88479c886895)
 
> 意訳「間違いを防ぐ。重大な間違いを偶然的に実行することが難しくなるようにタスクをデザインしなさい。例として、複数の破壊的なコマンドを物理的に離して配置しなさい。そして、複数の行動により完了するように要求しなさい。」

#### 右と左の配置

- [アラートのOK、Cancelボタンは右と左、どちらにおくべきか？](https://qiita.com/eKushida/items/90c8cd861b65427e466b)

上記の記事にある翻訳部分

- > 最も自然なボタンのアクションが非破壊的であれば、2つボタン型アラートの右側に置いてください。アクションを取り消すボタンは左側にします。
- > 最も自然なボタンのアクションが破壊的であれば、2つボタン型アラートの左側に置いてください。アクションを取り消すボタンは右側にします。

### 変更されたUI

- [(2015-11-09) Sourcetree > リリースノートへのリンク / コミットとキャンセルボタンの左右入替](https://qiita.com/7of9/items/94603d1035f9897abfd1)
Ionic CLI本体にマージされなさそうな機能を実装するCLI「Ionic-sub」をつくって公開した話。

タイトルでほぼすべてですが、CLIをつくってnpmパッケージとして公開しました。Ionic v3/v4対応です。使って、フィードバックいただけますと喜びます。

https://www.npmjs.com/package/@rdlabo/ionic-sub



## 使い方
現在のところ、機能は2つだけです。シンプル！まずはインストール。普通のパッケージと同じようにnpm iでインストールしてください。

```bash
$ npm install @rdlabo/ionic-sub -g
```

そうすると、`ionic-sub` コマンドが使えるようになります。そうしたら、Ionicプロジェクトのカレントディレクトリに移動してください。いつも `$ ionic serve` を打つ場所です。これで準備完了です。

### tslintの自動設定
Ionicのプロジェクトを複数人で開発してたら、人によって記述ルールが異なるということありませんか？Aさんはダブルクオーテーションを使うけど、Bさんはシングルだ、改行位置が違うetc...それを防ぐためにコーディング規約をつくったりしますが、新しくチームに入った人はルールを習得していないのでレビューで指摘受けまくったり・・・。

そういうことを防ぎ、自動的に「この記述は違うよ」とエディタが教えてくれるようにするためにlintルールというものがあります。Ionicもデフォルトでtslint（TypeScriptのlintルール）があるのですが、そのルールは初期では設定されていません。

そこで、自動的にtslintを強化するコマンドをつくりました。これを実行すると、tslintルールが設定され、チームで統一したコードを書く助けになります。

```bash
$ ionic-sub set lint
```
なお、このコマンドで行われる処理は以下の通りです。

- npm install codelyzer --save-dev
- tslint.json の上書き（AngularをベースにIonic用にカスタマイズしたlintです）

### prettierの自動設定

ところが、tslintを走らせていると、いちいちルールに従って修正することが面倒になってきます。ひたすらシングルクォーテーションに修正したり、セミコロンをつけたりする作業って生産性ないですよね・・・。

そこで、すべてのファイルを自動的に修正してくれるprettierを導入できるコマンドもつくりました。以下のコマンドを実行ください。

```bash
$ ionic-sub set formatter
```

これを実行すると、Ionicプロジェクトにprettierが設定されるだけではなく、一回いっかいコマンドを叩かなくてもいいように「Gitにコミットする度に」すべてのファイルがチェック・修正されます。

なお、このコマンドで行われる処理は以下の通りです。

- npm install prettier @kaizenplatform/prettier-config pre-commit --save-dev
- prettier.config.js という設定ファイルの追加
- package.json に 'formatter' と 'pre-commit' のスクリプトの追記

## なぜ作ったか
https://www.rdlabo.jp をご覧いただければいいのですが、弊社ではIonicのコードレビューをお仕事でしております。いろいろなIonicプロジェクトに接することができてとても嬉しいのですが、多くの場合上記みたいな問題が起きていて「まずはlintとprettierを入れよう」からプロジェクトをスタートしてて、これってIonicをはじめてつかうプロジェクトでは共通した課題なんだなと最近、実感してます。

ですので、この設定方法についてまとめようと思ってたところ、ちょうど昨日、@kuwahara_jsriさんが「Tips for OSS」というタイトルでLTをしてきた話をしてて「CLI自作楽しい」ということなのでつくってみようかなと。

思いつき突貫でつくったのですが、確かにCLIを自作するって楽しい。Ionic CLIのコントリビューターしているのでCLIの機能拡張や不具合の修正はやっていたのですが、やっぱりIonic teamの方針とCLIにあるべき機能を考えながら提案していってるので、好き勝手つくれて楽しかったです。ですので、本記事のタイトルが「Ionic CLI本体にマージされなさそうな機能を実装するCLI「Ionic-sub」をつくって公開した話。」なのです。

ちなみにCLI Frameworkとしてoclif使ってます。TypeScriptでつくれる雛形探してたのでちょうどよかった。

## これからIonic-subをどうするか
あまり考えていないのですが、Ionic CLI本体にマージされなかった機能をここで再実装して公開すると楽しいなぁとか考えています。欲しい汎用機能ありましたら、プルリクなりIssues立てなどしてください。

https://github.com/rdlabo/ionic-sub-cli

また、Ionicについての社内研修やコードレビューのお仕事も募集しております。

それでは、また。
RailsでのCSVデータ投入

### CSVデータの登録
開発の現場では大量のデータを取り扱うため、ExcelでCSVデータを作成し、それをデータベースに一気に投入するという方法がよく使用されています。汎用性の高い技術なので、ぜひ自分で実装できるようにしましょう。

新規に以下の名前のアプリを作成しましょう。

```
rails new csv_data
```

次に、データ投入のコードを記述するためのmodelを作成します。

```
rails g model data_test
```

modelと同時に作成されたマイグレーションファイルを、以下のように編集しましょう。今回は、name,age,addressの３つカラムを作成し、データ投入を行います。そのため、nameをstring、ageをinteger、addressをstringで作成します。

```ruby
class CreateDataTests < ActiveRecord::Migration[5.2]
  def change
    create_table :data_tests do |t|
      t.string :name
      t.integer :age
      t.string :address
      t.timestamps
    end
  end
end
```

マイグレーションファイルを実行し、データベースにテーブルを作成します。

```
bundle exec rake db:migrate
```

`lib/tasks/import.rake`にCSVデータをインポートするためのコードを追記します。

```ruby
require 'csv'

# rake import:users
namespace :import do
  desc "Import useers from csv"

  task users: :environment do
    path = File.join Rails.root, "db/csv/csv_data.csv"
    puts "path: #{path}"
    list = []
    CSV.foreach(path, headers: true) do |row|
      list << {
          name: row["name"],
          age: row["age"],
          address: row["address"]
      }
    end
    puts "start to create users data"
    begin
      User.create!(list)
      puts "completed!!"
    rescue ActiveModel::UnknownAttributeError => invalid
      puts "raised error : unKnown attribute "
    end
  end
end
```

次に、データを投入するためのCSVファイルを保管するディレクトリを作成しましょう。`db`ディレクトリの中に`csv`ディレクトリを作成し、その中にCSVファイル`csv_data.csv`を用意します。CSVファイルは初回配布データからコピー&ペーストで配置しましょう。CSVファイルには以下のような記述がされています。

```
name,age,address
hogehoge1,11,hogehoge1
hogehoge2,22,hogehoge2
hogehoge3,33,hogehoge3
hogehoge4,44,hogehoge4
hogehoge5,55,hogehoge5
```

以下のコマンドを実行

```
rake import:users
```

これでデータベースへの登録ができれば、実装は完了です。
Bitbucket Pipelines で Laravel IDE helper を実行して、差分があったら PR も作成する

[barryvdh/laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper) は、PhpStorm などの IDE における補完機能を活用するために欠かせないものになっている。

また、[Phan](https://github.com/phan/phan) や [PHPStan](https://github.com/phpstan/phpstan) などの静的解析を行う際にスタブとして読み込ませる、という使い方もできる。

ただし、クラスの追加・削除等を行うたびに `ide-helper` のコマンドを実行し、差分をコミットするのはやや煩雑であり、チーム開発ではコンフリクトが発生したりもする。

そこで、CI（今回は Bitbucket Pipelines）でコマンド実行 + PR 作成を自動化した。

## 設定内容

下記設定では master ブランチの変更がトリガーになっているが、`custom` に書いて任意のタイミングで実行できるようにしても良い。

```yml:bitbucket-pipelines.yml
pipelines:
  branchs:
    master:
      - step:
          image: <利用するイメージ名>
          caches:
            - composer
          script:
            # `ide-helper-<直前のコミットハッシュ>` という名前でブランチを切る
            - BRANCH_NAME=ide-helper-`git rev-parse --short=8 master`; FILE_CHANGED=''
            - git config user.name "Laravel IDE Helper"
            - git config user.email "test@example.com"
            - git checkout -b $BRANCH_NAME
            # 事前に .env.pipelines を作っておき、DB 接続情報などを記載しておく
            - cp .env.pipelines .env
            - composer install -n -o -a
            # `ide-helper:generate` を実行し、差分があれば git commit
            - php artisan ide-helper:generate
            - 'test `git diff --name-only | wc -l` -ne 0 && git commit -am "ide-helper:generate の実行" && FILE_CHANGED=changed || echo no changes'
            # `ide-helper:model` を実行し、差分があれば git commit
            - php artisan ide-helper:model --write --reset
            - 'test `git diff --name-only | wc -l` -ne 0 && git commit -am "ide-helper:model の実行" && FILE_CHANGED=changed || echo no changes'
            # どちらか一方でも git commit していれば、git push して PR を作成する
            - 'test $FILE_CHANGED && git push origin $BRANCH_NAME && curl -X POST --user $BITBUCKET_USERNAME:$BITBUCKET_PASSWORD -H "Content-Type: application/json" -d "{\"title\": \"<PR タイトル>\", \"source\": {\"branch\": {\"name\": \"$BRANCH_NAME\"}, \"repository\": {\"full_name\": \"<リポジトリ所有者ユーザ名>/<リポジトリ名>\"}}}" https://api.bitbucket.org/2.0/repositories/<リポジトリ所有者ユーザ名>/<リポジトリ名>/pullrequests || echo nothing to push'
```

## 注意点

* `git push` を行うため、Bitbucket Pipelines 用の SSH 鍵の設定が必要
* それとは別に、PR 作成の API を叩くために環境変数として Bitbucket の username と password を設定しておく必要がある
* `ide-helper:model` は DB のテーブル定義の情報も参照するため、別途 DB の sevice を定義しておく必要がある

## 参考にしたページ

* コミットハッシュ値の取得
    * https://qiita.com/quattro_4/items/55e99a2c008c6875f267
* PR を作成する Bitbucket API
    * https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/pullrequests
SAS Viyaとは？

[SAS](https://www.sas.com/ja_jp/home.html)というと同名の統計解析ソフトウェアが有名です。そんなSASは現在ではビッグデータ解析、マーケティング分析、リスク管理などといった分野に対してもサービスを提供しています。実際、[SAS Institute - Wikipedia](https://ja.wikipedia.org/wiki/SAS_Institute)によれば60以上の製品群が存在します。

そんなSASがAI、機械学習分野に対して提供するのが[SAS Viya（サス・ヴァイヤ）](https://www.sascom.jp/viya/)になります。今回はそのSAS Viyaを開発者視点で見た時の特徴を挙げてみます。

![Screenshot_ 2018-05-18 21.57.57.png](https://qiita-image-store.s3.amazonaws.com/0/197026/36007b1f-678d-0f66-2625-c756b5b9b594.png)

## システム

SAS Viyaはプライベートやパブリッククラウドに加えて、SASクラウド、オンプレミスでも利用できます。インメモリーの並列分散により、データ量やユーザ数に合わせて自由にスケールアップ、ダウンができます。

## 言語

元々のSASに加えて、Python/R/Java/Lua向けにライブラリも提供されています。Pythonであれば[Jupyter Notebook](http://jupyter.org)からも利用できます。Rはもちろん[R Studio](https://www.rstudio.com)から利用できます。

その他、REST APIも公開されていますので、システム連携や自動化も可能です。

## インタフェース

ビジュアルインタフェースと、プログラミングインタフェースが用意されています。マーケティングや経営層など、開発者でない人たちはビジュアルインタフェースを、開発者はプログラミングインタフェースを使って分析ができます。

## 利用できる機能

SAS Viyaが提供する機能は幾つかのカテゴリに分かれています。

- [AI/機械学習](https://ja.wikipedia.org/wiki/機械学習) ： SAS Visual Data Mining and Machine Learning
- [画像解析](https://ja.wikipedia.org/wiki/画像解析) ： SAS Visual Analytics
- [テキスト解析](https://ja.wikipedia.org/wiki/テキストマイニング) ： SAS Visual Text Analytics
- フォアキャスティング ： SAS Visual Forecasting
- [計量経済分析](https://ja.wikipedia.org/wiki/計量経済学) ： SAS Econometrics
- [最適化](https://ja.wikipedia.org/wiki/最適化問題) ： SAS Optimization
- 不正検知 ： SAS Visual Investigator

不正検知というのは不良品や不正な取引などを発見するための仕組みです。画像解析は通常の画像の他、医療用画像解析も用意されています。

## 入力ソース

データを逐次解析するストリーミングに対応しています。その他、Hadoopであったり、データベースからの入力も可能です。

----

SAS Viyaはエンタープライズ企業や大学などで採用されており、より本格的にAI/機械学習をはじめるのにあたって必要な機能が揃っています。[無償体験版](https://www.sas.com/ja_jp/software/viya.html#preview)もありますので、ぜひ使ってみてください。

[オープンなAIプラットフォーム SAS® Viya®](https://www.sascom.jp/viya/)
SAS Viyaで使える機械学習・データマイニング手法

機械学習・データマイニング手法は多数ありますが、[SAS Viya（サス・ヴァイヤ）](https://www.sas.com/ja_jp/software/viya.html)が対応しているモデリング、アルゴリズムについて挙げてみました。

## 回帰

回帰とはYが連続値の時にデータに `Y = f(X)` というモデルを当てはめることです。つまりXとYの関係性（モデル）を見いだすことです。Xは独立変数、Yは従属変数と呼びます。

### 線形回帰モデル

データの傾向を一つの直線によって導き出す分析法です。大量のデータがあった時に、直線（比例、反比例）的な傾向が見いだせることで、予測が立てやすくなります。

### ロジスティクス回帰モデル

線形回帰モデルの一種です。企業の過去のデータをもとに信用リスクを推定するのに使われたり、ダイレクトマーケティングの反応を推定するのに使われたりします（via [ロジスティック回帰 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%9B%9E%E5%B8%B0)）

### ノンパラメトリック回帰

統計のパラメータについて一切の前提を設けない回帰です。母集団の分布など前提を必要としないため、幅広く適用できます。事前に詳しいことが分かっていない場合などに用いられます（via [ノンパラメトリック手法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E6%89%8B%E6%B3%95)）。

### 一般化線形/加法モデル

Yがバランスの取れた正規分布ではない（湾曲している）際には一般化線形モデルを用います。加法モデルはより複雑な現状を回帰するものになります。

### 非線形回帰モデル

線形回帰モデルではない、つまり直線で示されない回帰モデルということになります。多くは式で示されたり、曲線で示されます。

### 分位点回帰モデル

指定したパーセンテージにおける値を予測するモデルです。分位点の変化を見ることで、関係性が見いだせる場合があります。

### 部分最小二乗法

偏最小二乗回帰または部分最小二乗回帰とも呼ばれます。相関関係のある複数の予測子変数が含まれているデータに対して使用されます。観測された応答値を考慮しつつ、信頼できる予測力をもつモデルを作成します。

## 木

### ディスジョン・ツリー

取り得る選択行動と、不確実性の発生確率の分岐が多岐に渡る際、すべての選択行動と発生確率を階層的に描きます。そして、それらの結論と期待値を算出し、最も大きな効用が得られる経路を選択します。

### ランダムフォレスト

ランダムなサンプリングによって、サブサンプルを形成します。そしてトレーニングデータの説明変数の内、m個をランダムに選択します。トレーニングデータを最もよく分類するものと、その閾値を用いて相関の低い決定木群をを作成します。

### 勾配ブースティング

ブースティングはアンサンブル学習の一つです。アンサンブル学習とは、弱い学習器を組み合わせて複雑な問題に対応するものです。ブースティングはこの学習器の結果を次の学習器に用いるものです。前のステップで間違った分類になったものは重み付けを増して、正しく判断されるようにします。この損失関数を最小化を勾配降下法を用いて実現するのが勾配ブースティングになります。

## モデル

### ニューラルネットワーク

脳に見られる特性をシミュレーションによって表現したモデルです。教師あり学習と教師なし学習の二つがあります。

### ベイジアンネットワーク

因果的な特徴を有向グラフ（矢印を用いたリンク）によるネットワーク（重み付けグラフ）として表し、その上で確率推論を行うことで、複雑でかつ不確実な事象の起こりやすさやその可能性を予測することができます。これまで蓄積された情報をもとに、起こりうる確率をそれぞれの場合について求め、それらを起こる経路に従って計算することで、複雑な経路を伴った因果関係の発生確率を定量的に表すことが可能となります。

### K-最近傍探索

機械学習アルゴリズムの中でも単純なものです。あるオブジェクトの分類は、近傍のオブジェクトの投票によって決定するという仕組みです。オブジェクト群が奇数になっていれば、いずれかに分類されます。

### サポートベクターマシン

教師あり学習を用いるパターン認識モデルの一つです。認識性能が優れた学習モデルの一つといわれています。未学習データに対する高い識別能力があります（via [サポートベクターマシン - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3)）。

### ファクタリゼーション・マシン

汎用的な分類アルゴリズムで、複数のコンテキストを用いた分類が実現できます。Netflixから出ていることからも、高いレコメンデーション能力を用いています。

## まとめ

筆者がまだ学習中なので、説明はかなり間違っている可能性があります。SAS Viyaで試しつつ & 学習しつつ適宜アップデートしていきます。

[SAS Viya | SAS](https://www.sas.com/ja_jp/software/viya.html)
SAS Viyaで使えるディープラーニングの機能

[SAS Viya（サス・ヴァイヤ）](https://www.sas.com/ja_jp/software/viya.html)はクラウド、オンプレミスなど幅広く使えるAIプラットフォームになります。今回はそのSAS Viyaで使えるディープラーニング（深層学習）機能について紹介します。

機能がかなり豊富なので、その洗い出しと各項目の学習だけでも必死です。個人用メモです。

## ディープラーニングの機能

### DNN

脳神経回路をモデルとしたアルゴリズム（ニューラルネットワーク）を多層構造化したもの。

via [ディープラーニング（Deep Learning）とは？【入門編】 | LeapMind BLOG](http://leapmind.io/blog/2017/06/16/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%EF%BC%88deep-learning%EF%BC%89%E3%81%A8%E3%81%AF%EF%BC%9F%E3%80%90%E5%85%A5%E9%96%80%E7%B7%A8%E3%80%91/)

### CNN

Convolution Neural Networkの略。DNNがベースです。畳み込み層とプーリング層という二つの層を繰り返すことで、画像のような複雑なオブジェクトを分析します。手書き文字や顔認識などで用いられています。

via [定番のConvolutional Neural Networkをゼロから理解する - DeepAge](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

### RNN/LSTM

RNNは再帰型ニューラルネットワークのことです。入力データを連続的に処理することで、長文解析などに向いています。LSTMは最もよく使われているRNNの一つです。

via [再帰型ニューラルネットワーク: RNN入門 - Qiita](https://qiita.com/kiminaka/items/87afd4a433dc655d8cfd)

### 転移学習

すでに学習済みのモデルを別な学習に利用することで、少ない入力データからでも効率的な学習モデル作成ができます。

via [水増しと転移学習 (Vol.7)](https://products.sint.co.jp/aisia/blog/vol1-7)

## テキスト解析

特異値分解によるトピックモデリングなど、テキスト解析に使えます。トピック抽出はSVD（Singular Value Decomposition）、LDA（Latent Dirichlet Allocation）が利用できます。形態素解析も用意されていますので日本語でも扱えます。他、テキストサーチやセンチメント分析が可能です。

## 画像解析

テンプレートになる画像を使ったマッチングであったり、画像のカテゴライズができます。特徴点を用いた画像マッチングによって、回転や縮小/拡大を行っていても検知することができます。

フィルタ処理を行ったり、画像比較機能があります。一般的な画像比較に加えて、医療用画像解析にも特化した機能を提供しています。

## 最適化

経路や流量などを最適化するためのアルゴリズムです。組み合わせ最適化と呼ばれます。

### 線形計画法

いくつかの1次不等式および1次等式を満たす変数の値の中で、ある1次式を最大化または最小化する値を求める方法。

via [線型計画法 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E8%A8%88%E7%94%BB%E6%B3%95)

### 非線形計画法

制約条件群と未知の実変数群から成る一連の等式と不等式で、制約条件または目的関数の一部が非線形なものについて、目的関数を最小化または最大化するような解を求めるプロセス。

via [非線形計画法 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%9D%9E%E7%B7%9A%E5%BD%A2%E8%A8%88%E7%94%BB%E6%B3%95)

### 二次計画法

いくつかの変数からなる二次関数を線形制約の下で最適化（最小化ないしは最大化）します。非線形計画法の代表例。

via [二次計画法 - Wikipedia](https://ja.wikipedia.org/wiki/%E4%BA%8C%E6%AC%A1%E8%A8%88%E7%94%BB%E6%B3%95)

### 混合整数線形計画法

整数値を取る変数、実数値を取る変数が混じっている線形問題において最大化、または最小化する値を求める方法。

### ネットワークフロー最適化

フローで通過する頂点にコストや距離と言った情報が追加されており、それらを条件として最大化または最小化する値を求める方法。

## フォーキャスティング

### 時系列分析

時間に沿って記録されているデータを分析します。

### 時間 - 周波数分析

時間によって変化する周波数データを分析するのに適しています。

## 計量経済分析

### コピュラ

多変数の分布関数とその周辺分布関数の関係を示す関数のこと。

via [コピュラ (統計学) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%A5%E3%83%A9_(%E7%B5%B1%E8%A8%88%E5%AD%A6))

### パネル分析

同一の個人、地域、事業所などを複数期間において記録したデータを分析します。

via [パネルデータ分析 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%8D%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90)

----

[SAS Viya | SAS](https://www.sas.com/ja_jp/software/viya.html)
SAS ViyaをPython（Jupyter Notebook）から試す

[SAS Viya（サス・ヴァイヤ）](https://www.sas.com/ja_jp/software/viya.html)はクラウド、オンプレスミス環境で使えるAIプラットフォームです。Webブラウザ上からビジュアル的に操作することもできますが、開発者やマーケター向けにはより使いやすいREST APIも用意されています。

REST APIはそのまま触れることもできますが、それでは面倒です。そこで使えるのが各種プログラミング言語用に用意されているSDKです。SASはPython/R/Java/Luaから利用しやすいSDKを提供しています。今回はAI、機械学習系としてはよく使われるPythonを使ってSAS Viyaを手軽に体験する方法を紹介します。

## 申し込みから開始

デモを体験するためには [SAS Viya Developer Free Trial](https://www.sas.com/en_us/trials/software/viya-developer/form.html) にて申し込みを行う必要があります。申し込み前に[SASプロファイル](https://www.sas.com/ja_jp/home.html)を作成しておく必要があります。そして必要事項を入力後、 Sign me upボタンを押します。

<img width="1329" alt="Screenshot_ 2018-05-24 14.53.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/197026/a856646b-3498-b732-a23c-cf5159fdbdd2.png">

そうするとYour SAS Viya reservation is readyというメールが送られてきます。このメールをクリックするとログインが求められます。この時のID、パスワードはSASプロファイルのIDとパスワードになります。

## デモはJupyter Notebook

デモのページです。デモはJupyter Notebookなので、PythonとR、そしてSAS言語で提供されています。Pythonをクリックします。

![Screenshot_ 2018-05-24 14.33.27.png](https://qiita-image-store.s3.amazonaws.com/0/197026/42b1d71a-5f81-2285-2467-4b9b32f2a136.png)


幾つかデモのノートブックが登録されています。例えばTitanicPipefilterをクリックします。

![Screenshot_ 2018-05-24 14.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/197026/00117beb-1b63-a4df-37db-c30341a746ab.png)


順番に実行していくことで、タイタニックの生存者における決定木生成までを試せます。

![Screenshot_ 2018-05-24 15.40.03.png](https://qiita-image-store.s3.amazonaws.com/0/197026/d80dcec1-ce8d-bee7-c6f4-6457ffa570ce.png)

![Screenshot_ 2018-05-24 15.40.18.png](https://qiita-image-store.s3.amazonaws.com/0/197026/ebc041f2-580c-582c-d9f3-7946db80f8ec.png)


途中 **WARNING: License for feature 'Threaded Kernel Extensions for CAS' has expired and will stop working in 31 days. Contact your installation representative to obtain a renewal.** といった警告が出るかも知れません。これはデモ版のために出ているメッセージなるので気にしないでください。

## 注意点

デモ版ではデータのアップロードはできません。あらかじめ用意されているものをお使いください。コードは自由に変更できます。

## まとめ

Jupyter Notebookを使うことで、環境のセットアップなど不要ですぐにSAS Viyaを試すことができます。あらかじめデータも用意されていますので、Pythonを使ったAI/機械学習をすぐに体験できるでしょう。

ぜひSAS Viyaを体験してみてください！

[SAS Viya | SAS](https://www.sas.com/ja_jp/software/viya.html)
(2018-08-07) 連絡先 > Gmailのバグ、Chromeのバグ

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 68.0.3440.84（Official Build） （64 ビット）
```

### 関連

2018年8月7日現在、GmailとChromeの組合せでラベル関連のUIのバグが発生している。

- [(2018-08-02) Gmailのバグ? > ラベル選択ペインが左下に表示 (ラベルアイコンアクセス不可) > Chromeのバグ?](https://qiita.com/7of9/items/d1e58097e576ef33576d)

### Gmailバグの連絡先?
Gmailのバグの連絡先は不明だ。

下記の「ヘルプセンターに関するご意見をお送りください」から送信したが、ここではないかもしれない。
https://support.google.com/mail/answer/7074871?hl=ja

### Chromeバグの連絡

ブラウザ右側の縦３つマーク(Google Chromeの設定) > ヘルプ > 問題の報告
(<kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>I</kbd>)
からバグ報告できる。

### Chrome forum
(追記 2018/08/08)

Google Chromeのforumがあるようだ。
https://productforums.google.com/forum/#!forum/chrome
さくらVPS（CentOS）にGoの1.10系をインストールしてみた。

さくらVPS使ってて、Goを試してみたいなと思ったところ、最新版が入らず少し苦労したので、記事に記します。

# Goのインストール

```
$ yum update
$ yum install golang
```
この場合、簡単にGoをインストールできるのですが、なぜか1.9系が入ってきてしまい、1.10系が使えません。

今回はライブラリの依存関係で1.10が必要だったために、この方法をあきらめます。

一度入れてしまってじゃまなGoは消しておきます。

```
$ yum remove golang
```

# 最新版のGoをインストールする
記事執筆時点でCentOS上で動くものは以下なので、
https://storage.googleapis.com/golang/go1.10rc2.linux-arm64.tar.gz

これをwgetで持ってきます。

```
$ cd /usr/local/src
$ wget https://storage.googleapis.com/golang/go1.10rc2.linux-arm64.tar.gz
```

その後、ファイルを/usr/local配下に解凍しておきます。

```
$ sudo tar -xzf go1.10rc2.linux-amd64.tar.gz -C /usr/local
```

Goのパスを通します。

```
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$GOPATH/bin
```

出来上がり。
簡単なことをちょっと手間取ってしまいました。
LogstashからElasticsearchへの連携でNested datatypeを扱う

# はじめに

Logstash -> Elasticsearchへ連携する場合、ネストされたデータはデフォルトでArray datatypeになります。

このArray型は、例えば下記のclientデータのuserを検索する場合、 `users.first == "山田" AND users.last == "花子"` という条件でもマッチしてしまいます。
要するに、Array型のネストされたデータはkeyとvalueの組み合わせでインデックスすることが出来ないんです。

```json:clientデータサンプル
  "client_name" : "テスト商社"
  "users" : [ 
    {
      "first" : "山田",
      "last" :  "太郎"
    },
    {
      "first" : "鈴木",
      "last" :  "花子"
    }
  ]
}
```


||データ型|条件|結果|
|---|---|---|---|
|1|Array|first == "山田" AND last == "花子"|true|
|2|Nested|first == "山田" AND last == "花子"|false|
|3|Nested|first == "山田" AND last == "太郎"|true|

上記表の3のように、名字と名前が一致したときのみマッチするようにしたい！…
ということで次の章でNested datatypeにする方法を説明します。


# やり方

Elasticsearchの機能であるインデックステンプレートを使います。Logstashでは下記のようにtemplateでインデックステンプレートが設定できます。

```conf:logstash.conf


...


output {
  elasticsearch {
    hosts => ["${ES_HOSTNAME}"]
    index => "%{type}"
    document_id => "%{type}_%{id}"
    template => "/home/apps/logstash/customers_mapping.json"
    template_name => "customers"
    template_overwrite => true
  }
}
```

customers_mapping.jsonのusers typeにnestedを指定します。

```json:customers_mapping.json
{
  "index_patterns": ["*"],
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "_default_": {
      "_source": {
        "enabled": true
      },
      "properties": {
        "users": {
          "type": "nested",
          "properties": {
            "first":  { "type": "keyword"  },
            "last":  { "type": "keyword"  }
          }
        }
      }
    }
  }
}
```

以上、簡単にNested型に出来ました！
Qiitaに記事を書くコツは「自分を読者にする」に限る


## 自分が一番の読者

- アウトプットすることで「自分自身の理解が深まる」のが実は最大の利益
  - [個人的な良い記事のガイドライン = 2ヶ月前の自分が泣いて喜ぶような記事を書く - Qiita](https://qiita.com/jnchito/items/5c3eb3640ad57b3edc6c)
- 情けは人の為ならず
  - 単に人のために記事を書くというよりは、『自分の理解を深めるために「人が見ている」という環境を利用する』感覚
  - いくら「自分のためだけに書く」という意識でも、ソーシャルに書く以上「他の人が読む」という意識は必ず働き、必然的に記事の内容に影響を与える (自分だけのメモに書くのとはまるで違う)

## トピックは感情で選ぶ

自分が読者なのだから「読者の感情を動かさないもの」書いても仕方がない。

- いま一番分からないこと
- いま一番困っていること
- いま一番興味があること

などを選ぶ。

- 食指が動かないものは選ばない。
- 義務感で選ばない。
- 気が進まないものは選ばない。

結局は自分が興味のないことを書いても仕方がないし、人の役に立つ情報にもならない。
(いや、ちょっと役に立つしれないが必然的にインパクトは弱くなるし、何より自分が続かない)

## 未完成でも公開する

- 「エンドユーザー」=「自分という読者」に貢献するには、まずは記事公開することが大前提
  - 発行されない雑誌は読まれない、ドリップされないコーヒーは飲まれない、炊かれない米は食えない
  - 下書きのまま腐らせても、途中までの勉強にはなるかもしれないが、少なくとも「将来の自分」には役に立たない
- 勇気というか思い切りが必要なことではある
- ソフトウェアと同じで、記事にも100%の完成はない
  - 8割完成していれば表に出したほうが良い
  - 「あとで書こう」と思った下書きは確実に腐って死ぬ
  - 誤字脱字や訂正や表現のブラッシュアップなら、あとからいくらでも出来る
- まったく表に出ないよりは、公開してから間違いを修正したり、ツッコミを受けたりした方が良い
  - 公開してすぐに間違いを自分で見つけて修正することもままある
  - Qiitaの他の人からツッコミ込みを受けて「間違い」+「訂正」という形で、記事全体が完成するように思われることもある
  - 「どんな間違いをしたか」「どんな訂正がおこなわれたか」というのも実は有益な情報(なので、ツッコミを受けても本文には「本文の間違いに気付ける」ような最小限の訂正しかしない場合もある)

## あわせて読みたい？

- [Qiitaの記事は「ググりやすさ」を基準に書こう - Qiita](https://qiita.com/YumaInaura/items/09a6dfae85d8b4c4f2d8)
- [拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。 - Qiita](https://qiita.com/YumaInaura/items/4d2c602d59c62daa9344)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
mbed NUCLEO-L432KC にMac OS  から書き込みができない場合の対処法

#[mbed NUCLEO-L432KC](https://os.mbed.com/platforms/ST-Nucleo-L432KC/) にMac OS High Sierra から書き込みができない場合の対処法
新しいMacを購入して使っていたところ、mbedへの書き込みができない問題を見つけた。コンパイルしたデータは転送されるが、mbed側のLEDが点滅せず、プログラムが更新されない。

同じ問題に当たっていた人がいたため、こちらのサイトを参考に解決できた。
http://ytkyk.info/blog/2018/01/13/macos-sierraからnucleoに書き込みできないとき/


 
##手順


1. 新しいファームウェアのダウンロード
 契約書にAcceptしてメールアドレスを登録すると、ダウンロードURLが送られて来ます。
https://www.st.com/content/st_com/ja/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stsw-link007.html#getsoftware-scroll

2. Javaのインストーラーのため、Javaを入れておく必要があります。
私はhome brewからインストールする必要があったことと、インストーラーで必要なライブラリが足りなかったため、すべての手順を記載します。
・home brew はHPの通り1行でインストールできます。 https://brew.sh/index_ja
`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
・javaをインストール
`brew cask install java`
・関連ライブラリをインストール
`brew install libusb`

3. ファームウェアの書き込み
インストーラーをダブルクリックすることで、起動します。


ファームウェアの更新後、書き込めるようになりました。
【Illustrator】1つのショートカットにロックとロック解除のコマンドをまとめる【ショートカット拡張】

- オブジェクトの選択がされていない場合 ・・・ 「ロック解除」
- オブジェクトの選択がされている場合 ・・・ 「ロック」

```
var select = app.activeDocument.selection;
var items= app.activeDocument.pageItems;
var locked = false;

// オブジェクトが選択されている場合
if (select.length > 0){
	app.executeMenuCommand('lock'); // ロック
}
// オブジェクトが選択されていない
else{
	app.executeMenuCommand('unlockAll'); // ロック解除
}
```
正規表現の \A \ z は 英語の「A to z」と覚えよう

Aは最初でzは最後だ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f4c3d365-54ed-3dc9-49c0-222d20b33bfd.png)

僕も最初は「この分かりにくいアルファベット表現は何だ！」と思ったが、これなら忘れないはず。

(なんなら「ABCの歌」をうたってもいい)

## 副題 ( Google検索用 )

- バックススラッシュA と バックスラッシュz で完全一致させる正規表現
- 複数行モードで全体にマッチさせる正規表現

## 参考

- [正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう | 徳丸浩の日記](https://blog.tokumaru.org/2014/03/z.html)
- [Railsの正規表現でよく使われる \A \z って何？？ - Qiita](https://qiita.com/jnchito/items/ea7832df6f64a9034872)

## リンク

- [Reglar expression — How to remember \A \z match? ( remember Alphabet A to z )](https://gist.github.com/YumaInaura/e6b8237045b1ac38d7fc62a4ad86edbf)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DockerでSelenium-Grid動かすまでのメモ

# この文章

自分がDockerでSelenium動かすまでのメモ。

# 本体の取得

https://github.com/SeleniumHQ/docker-selenium
からGit cloneして取得。

# 起動

Read me に基本書いているが、複数コンテナ立ち上げのために以下のサイトを参考にした。
https://qiita.com/takayamag/items/cca4b85e75f1fcc2ab1a

# ブラウザで接続

local hostではつながらなかった、理由はよくわからないがdockerのアドレスにアクセスしないとダメらしい。
以下のコマンドでチェック。

```console
docker-machine ip
```

わかったらhttp://[IP]:4444/grid/consoleで接続。

# VNC接続

イメージのなかでもDebugが付いているものはVNC接続ができる、 VNC のポートを取得し、接続。

```console
docker port <コンテナID> 5900
```

後は上記のIPを使って接続。

参考：http://blog.cybozu.io/entry/8113

# テスト

早速テスト、ドライバーのインスタンス作成時に以下を加えれば接続可能。

```python
driver = webdriver.Remote(
    command_executor='http://[IP]:4444/wd/hub',
    desired_capabilities=DesiredCapabilities.CHROME)
```

あとはdriverに対して任意の作業を行う。

# これから

もう少しテストを実施し、何がどこまでできるのか確認。
EPS現代アート先輩

## はじめに

初投稿です。

今回はこの現代において「EPSのソースを直書きする」という方法を用いて[この動画](http://www.nicovideo.jp/watch/sm28861211)を元に「**現代アート先輩.eps**」を作成しました。なお着色は諦めました。

## 描いてみた

普段Tex等で図表を張り込むときにお馴染み**EPS(Encapsulated PostScript)**形式の画像が「**実はgnuplotの様に直書きでも描画可能**」とたまたま知ったのでいろいろ調べて描いてみました。

参考にしたサイト(古め)は参考文献にまとめたので各自読んでください。全部神サイトってはっきりとわかりますね。

結構綺麗な図が出来たので満足しました。

```EPS:現代アート先輩.eps
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0  620 413 %パスサイズの指定(値はパスとなる長方形の左下頂点x,yと右上頂点x,y)

newpath             %新規パス
%%%背景色
1 1 1 setrgbcolor	%背景色にする色(白)の指定
clippath fill		%背景色塗り
gsave               %パス状態の保存

%%%線の描画
0 0 0 setrgbcolor	%線の色指定（ここでは黒）
0.1 setlinewidth	%線の幅指定

310 413 moveto		%野獣頭頂
310 331 lineto		%線を描画

0 27 moveto		    %野獣左方
203 144 lineto		%線を描画

620 27 moveto		%野獣右方
417 144 lineto		%線を描画

435 206 moveto		%野獣顔面描画開始地点へ移動
310 206 125  0 360 arc	%野獣顔面(円)描画
stroke			    %描画実行
gsave		       	%パス状態の保存


%%%文字列(配色コード)の書込・表示
/FixedSys-italic findfont 50 scalefont setfont
33 329 moveto
(#95A098) show
380 329 moveto
(#C9BFB6) show
200 217 moveto
(#A1726A) show
222 43 moveto
(#3F3540) show


%%%着色（挫折）
%%%(おそらく色ごとに4つの閉じた図形に分割して各々fillすればいいと思うけど面倒臭)
%33 329 moveto
%7 0 5 37 setcmykcolor
%fill
%400 329 moveto
%0 5 9 21 setcmykcolor
%fill
%238 217 moveto
%0 29 34 37 setcmykcolor
%fill
%222 43 moveto
%2 17 0 75 setcmykcolor
%fill

%%EOF               %終了処理(showpageでもいいらしい)
```

## 出来上がった画像(.jpg)

![6437176.png](https://qiita-image-store.s3.amazonaws.com/0/278919/ab85beef-c2fa-c0df-9315-ad7909820351.png)
申し訳程度の色コードくん

## まとめ

色がついてないと味気ないってはっきりとわかりました。

## 参考

- Postscript ファイルの書き方入門
http://denki.nara-edu.ac.jp/~yabu/soft/ps.html

- PostScript Tutorial(tutorials1~5)
http://pscript.dubmun.com/

- PostScript入門
https://oku.edu.mie-u.ac.jp/~okumura/ps/

- Postscript プログラミングメモ
http://ruby.kyoto-wu.ac.jp/~konami/Documents/ps/psmemo.html

- PostScript 実習マニュアル
http://www.umekkii.jp/college/syllabus/06_report/citation/postscript.pdf
hg-gitを使ってMercurialでGithubにアクセスする

Mercurial を使って、Githubにアクセスしたいときに使うのが `hg-git`。

でも `hg-git` のインストールで、

```
'module' object has no attribute 'ignore'
```

のエラーでかなり詰まったので、メモしておきます。

# Mercurial のインストール

かなりしょぼい公式サイトを参考にすると事故ります。
http://hg-git.github.io/

## インストール
公式サイトで https://bitbucket.org/durin42/hg-git のサイトから `hg-git` をインストールすると書いてあるので、レポジトリを見てみます。

ここの `Makefile` を見て、 ちゃんと動く `Mercurial` のバージョンを見ておく必要があります。
私がこの記事を書いている時点では、 `4.5` でした。

https://bitbucket.org/durin42/hg-git/src/bbad9283f80f733f39025cab93c6ec7bfa12434f/Makefile?at=default&fileviewer=file-view-default

普通に `pip install mercurial` としてしまうと、 `4.5` よりも高いバージョンの `Mercurial` がインストールされてしまいますので、バージョン指定してインストールしましょう。

mercurialをインストール

```
pip install mercurial==4.5
```

次に、適当な場所に `hg-git` をクローンします。

```
cd coding/lib
hg clone https://bitbucket.org/durin42/hg-git
```

`~/.hgrc` に設定を書きます。

``` ~/.hgrc
[ui]
username = xxx <yyy@zzz.com>
[extensions]
hgext.bookmarks =
hggit = /Users/zzzz/coding/lib/hg-git/hggit
```

`hggit` のパスは自分がクローンしたところに変更してください。

## Githubにアクセス

普通に `.git` のURLをクローンできるようになります。

```
hg clone git@github.com:test/aaaaa.git
```
Python3でプログラムの途中経過を改行なしで出力する

Python3でプログラムの途中経過をで表示したい。
でも毎回改行して画面を埋め尽くしたくない。

#解決策1
改行なしで出力する場合print文のオプションに`end=''`を付けます。
これだけではfor文が終了した後に一気に出力されてしまうので、`sys.stdout.flush()`で毎回標準出力します。

```
import sys

for x in range(10):
    print(x, '', end='')
    sys.stdout.flush()
```

#解決策2
print文のオプションに`flush=True`をつけることで毎回標準出力します。

```
for x in range(10):
    print(x, '', end='', flush=True)
```
スタイルガイドジェネレーターFractal導入フロー

# Fractal導入

## 環境構築

```
$ mkdir patterns

$ npm init

$ npm install --save @frctl/fractal

$ npm i -g @frctl/fractal
```

## ディレクトリ例

```
StyleGuide
├── src
│   ├── components
│       └── headings.hbs
│   └── docs
│       └── index.md
├── fractal.js
└── package.json
```

## 表示させる(自動コンパイル)

`$ fractal start --sync`

## 静的ファイルを書き出す

---

### fractal.js に追記
`fractal.web.set('builder.dest', __dirname + '/build');`

### コンパイル
`$  fractal build`


---

## Fractal UIカスタム

- CSS場所
- `/node_modules/@frctl/mandelbrot/dist/css/xxx.css`
- 今回はwhite.css使用

---

## HTML
- Slimの取扱はFractalは非推奨
- 実装時コンバートする時は、エディターやコマンド、オンラインツールなど使用

### オンラインSlimコンバーター参照
- http://erb2slim.com/
- https://html2slim.herokuapp.com/
文字コードについて

#まずはじめに
今まで文字コードについて、なんとなく理解しているつもりであったが、全く理解していないことに気づいたので復習も兼ねて文字コードについてまとめます。

##文字集合
文字コードについて話す前に、**文字集合**について。
今まで聞いたことなかったが、**文字集合**という定義がある。

文字集合とはコンピュータで扱う対象となる文字をとにかく列挙して集めたもの。

英語圏の人たちであれば、
・英字（a, b, ・・・　x, z）
・数字（1, 2, 3, ・・・）
・記号（{, }, <, >）

などあれば問題はないが、私たち日本人の場合は

・漢字（日、月、火・・・）
・ひらがな（あ、い、う・・・）
・カタカナ（ア、ｱ、イ・・・）
なども必要であるため、必要な文字集合はそれぞれ環境によって異なる。

##文字符号化集合
**文字符号化集合**とは、上記にある「文字集合」に対してそれぞれの文字を特定できるように１つずつに番号を振っておき、１バイトや２バイトでのビット組み合わせと対応させている。
簡単にいえば符合の振られた文字集合のこと。

符号化文字集合として代表的なものは以下の通り。
・JIS X 0201
・JIS X 0208
・Unicode

##文字符号化方式
**文字符号化方式**とは、普段我々が文字コードと読んでいるもの。
文字符号化方式として代表的なものは以下の通り。
・UTF-8
・Shift_JIS
・EUC_JP

例えば、Unicodeの文字符号化方式として、UTF-8があるということ。
同じようにJIS X 0208の文字符号化方式として、Shift_JIS、EUC_JPがあるということ。

#まとめ
普段文字コードと呼んでいたものに、Unicodeもあったが、正確に言えばUnicodeは文字コードではなかった。奥が深く意外と面白いなと思いました。余裕あればもうちょっと踏み込みたいです。
ラズパイ３の解像度設定を変更する

#はじめに
ラズパイ3でVGAディスプレイに出力される画面の解像度がおかしい。。

Google先生に聞いてみたら同じような人がたくさんいたので、対処方法は簡単に分かりました。
※[参考ページ](http://kamuycikap.hatenablog.com/entry/2015/02/19/012349)

##対処方法
1.「/boot/config.txt」のバックアップとる
cp -p /boot/config.txt /boot/config.txt.org

2.「/boot/config.txt」の修正
**!!設定間違えると、画面が黒くなって表示されなくなるようなので気をつけてください!!**

```vim

【修正前】
     27 # uncomment to force a specific HDMI mode (this will force VGA)
     28 #hdmi_group=1
     29 #hdmi_mode=1 

```

```vim

【編集後】
     27 # uncomment to force a specific HDMI mode (this will force VGA)
     28 hdmi_group=2
     29 hdmi_mode=35
```
※"hdmin_group"と"hdmi_mode"の値は、以下のリンクから適切な値を選択する必要があります
※[参考](http://elinux.org/RPiconfig)



3.ラズパイを再起動
sudo shutdon -r now

画面の解像度が正常に表示されるようになりました！
ご注文は行き先を尋ねることですか？

[前回の記事](https://qiita.com/Riliumph/items/4fe9cb958a6f56864e9f)でpecoを導入しました。
まぁ、114514番煎じの記事だったので、ちょっと違う形でpecoを使っていきたいと思います。

# 第5羽：ココア先輩の優雅なpecoチュートリアル
前回pecoを使っただろって？
あんなパクリ記事はチュートリアルですらないってことで


## コマンドがユーザーに尋ねる
2回目の記事で、「引数がないcdコマンドはエラーにする」ことを実装しました。
この時はpecoを入れていなかったのでエラーにしましたが、ただエラーにするだけではもったいないです。
引数なしでcdコマンドを実行すると、「どこに行くか」を尋ねてくれるようにしましょう。

``` bash:bashrc
custom_cdls()
{
  local -r argc=$#
  local destination=$*
  case ${argc} in
    0)if ! type peco &> /dev/null; then
        # Don't move $HOME
        echo 'Missing args';
        return 1;
      fi
      local asc_order='sort -f'
      destination=$(find ./ -maxdepth 1 -mindepth 1 -type d 
                    | eval $asc_order
                    | peco)
      ;;
  esac
  # \cd => builtin cd
  \cd ${destination}
  if [ $? -ne 0 ]; then
    return $?
  fi
  clear && ls
}
alias cd='custom_cdls'
```

### スクリプト解説
引数の数で処理を分岐します。
現状、0個の場合しか考えてません。

- **! type peco &> /dev/null**
まず、pecoを持っているかどうかを確認しています。
`type`はビルトイン関数なので、`which`よりこっちを使うと色んな環境でエラーにならなくていいですね。

- **asc_order**
候補をアルファベット順に並べるための処理です。

- **-maxdepth 1**
findコマンドの検索範囲を絞るオプション。
カレントディレクトリだけを検索してほしいので、深さには1を指定する。

- **-mindepth 1**
findコマンドを使用すると`.`だけのディレクトリも検索してしまう。
`.`はカレントディレクトリを示すため、結局「移動しない」。それはスゴイ無駄なモノを表示しているので、含めないようにしたい。
maxdepth/mindepthの両方に階層１を指定して、検索範囲を対象ディレクトリのみに制限することで実現している。
`../`（一つ上に戻る）も表示されないようなのでちょっと不便……？

- **-type d**
findコマンドで検索するモノを絞るオプション。
dを指定するとDirectoryだけを検索してくれる。
fを指定するとFileだけを検索してくれる。

これを組み合わせて実現しています。

## 最後に

pecoはかなり色々とフィルターできて便利ですね。

まだ大きな変更が一つありますが、それはまたの機会ということで。
今回は、パクリ出ないチュートリアルでした。

## 追記
使ってたら問題に遭遇したのでスクリプトを改修します。

**pecoで行き先を選択しなかったらホームに戻る**とは思わなかったです。
考えてみりゃそうですよね。
pecoをc-cでキャンセルした場合は変数には空文字が入っているようです。
それをcdコマンドに渡してるわけですから、私が嫌ったホームに戻るcdが再現してしまっています。

少し考えてみましたが、**行き先が空文字になること**と**引数の数が0であること**は特に関係はありません。
闇雲にpecoの実行後にケアコードを導入すると色んなところにケアコードが出てきてメンドクサそうです。
そこで、以下の修正を加えます。

- **引数0の場合からMiising argsなどのエラー部を除去する**  
よって、pecoの有無の判断は<font color=red>**持ってなかったら**</font>から<font color=red>**持ってたら**</font>に変更する。  
pecoを用いて今のパスからディレクトリを検索する実装は<font color=red>**引数の数に依存する**</font>ため、この変更に問題ない。
- **新たに行き先不明のケアコードを導入する**  
ただし、当然ながら引数の数を判定する箇所ではない場所にすること  
できるだけエラーはデフォルトのcdコマンドに任せるつもりでしたが、デフォルトではエラーでは無い訳ですから仕方ありません。英語のエラーメッセージを使いましょう。

``` bash:bashrc
custom_cdls()
{
  local -r argc=$#
  local destination=$*
  case ${argc} in
    0)if type peco &> /dev/null; then
        local asc_order='sort -f'
        destination=$(find ./ -maxdepth 1 -mindepth 1 -type d
                      | eval $asc_order
                      | peco)
      fi
      ;;
  esac
  
  # Don't move $HOME
  if [ -n $destination ];then
    echo 'Missing args';
    return 1;
  fi

  # \cd => builtin cd
  \cd ${destination}
  if [ $? -ne 0 ]; then
    return $?
  fi
  clear && ls
}
alias cd='custom_cdls'
```

とりあえず、これで$HOMEへ戻ってしまう既存動作を塞ぐことができました。
プロジェクトリーダーが進捗報告でよくする2つの質問

# はじめに

今年の4月からプロジェクトリーダーという役割を任されるようになりました。
毎日、朝会で「昨日の進捗と今日の予定」を聞いています。（できない時も多々ありますが。。。）
そこで、報告もらった後によく質問することをまとめました。

気になることは人それぞれだと思いますが、必要なことだと思うので報告の参考にしてもらたら嬉しいです。

# 1. 結局、オンスケなの？

**「前倒してます」、「オンスケです」、「遅れています」が最初に欲しいです**

- XXXをやりました。
- YYYを途中まで進めました、今日か明日終わります。
- ZZZは他の作業待ちで進んでません。

よくこんな報告があるのですが、結局進捗がわかりません。。。
「XXX」はスケジュールのどのタスクなのか？ 「やった」とは完了(100%)なのか？ 昨日終わる予定だったのか？

なので、こんな感じで言ってくれると嬉しいです。

- オンスケです
- スケジュールのNo10のタスクが完了しました、100%です。
- ZZZが他作業待ちで進みませんでしたが、No20のYYYを先に進んでいるので問題ありません。
- YYYの進捗は25%ぐらいです。

これであれば、報告内容をスケジュールに反映させることができます。
まず、スケジュールを見て報告してもらうことからスタートですね。

# 2. 後どれぐらいかかるの？

**「オンスケです！！」って言われても気になっちゃいます**

各タスクの進捗率(%)より残りの作業時間が気になります。
「8時間のタスクが50%です」という報告もらった後、「あとどれぐらいで終わるの？」と聞き返すと「今日中には終わる(1日かかる)と思います」って返ってくることが多いです。
これを聞くと、**「残り半分(50%)を8時間かけて終わらせるのだから、元々16時間のタスクだったのでは？」**と思います。
極論ですけどね。



スケジュールが良くない、生産性が良くない、何かトラブルがあった、どのパターンでも遅れてしまいます。
タスク分解をきっちりやって(してもらって)、自分の居場所(進捗率)がわかるようすることで、再発させないようにしています。

ちなみに、3日かかるタスクを1日やって、あと1日で終わります。という逆のパターンもあります。
それも、タスク漏れ、品質が低い、などの可能性があるので注意してください。
（早く終わった！ラッキー！ぐらいに思っていると痛い目見ることがあります・・・）

# おわりに

言いたいことはこの2点。この2つを意識して報告してもらえると、すごく楽になります。

- **スケジュールに沿った報告**
- **時間(残作業)を意識する**

と色々書きましたが、管理のやり方は人それぞれあると思うので、
**「管理者がどんなことを気にしているか？」**
を意識して報告できるのがベターだと思います。

その人がいつも言っていることを意識すると、お互い幸せになれると思います。
【javascriptでカウントダウンタイマーを作る】part.4 忘備録

# 完成形のイメージ
以下訂正させてもらいやす・・。

訂正前)
日本人の平均**男性**が80歳ぐらいまで生きると想定し、
自分の年齢を入力して余生を日数ではなく時間単位でカウントダウン表示する
 
訂正後)
日本人の**平均**が80歳ぐらいまで生きると想定し、
自分の年齢を入力して余生を日数ではなく時間単位でカウントダウン表示する

#実装したい機能を言語化しよう
**"１日の睡眠時間と選択した年齢から余生を〜時間で出力する"**

# 今日の課題は「~時間を〜ミリ秒単位に変換して、カウントする時間として出力させる」
前回まで使用してた 「 new Date( ) 」メソッドを使うと想定している挙動にならないので
以下のようにしたい。



想定している出力形式)
**350400時間00分00秒**



前回(part.3)で既に〜時間単位での出力ができたので以下のような感じでミリ秒単位に分解する

```javascript:life_timer.js
//残り時間を表示するためにミリ秒を渡すと分とか秒に直してくれる関数を作る
    function updateTimer(ms){

    var h = String(Math.floor(ms / 3600000));
    var m = String(Math.floor((ms - h * 3600000)/60000));
    var s = String(Math.floor((ms - h * 3600000 - m * 60000)/1000));
    timer.textContent = h + '時間' + m + '分' + s + '秒';
}
```



きちんと1000ミリ秒単位で計算できていることが確認できましたとさ。




<img width="348" alt="スクリーンショット 2018-08-07 1.20.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/254495/cdd31c5e-a6f6-f6c0-842f-b2fad5daa140.png">
# 次回の課題
何かしらの動画を時間と共に連動させるようにする。
GASをAPIとして公開したときのpostとgetのデータの受け取り方の違い

# コード

```js
function doGet(e) {
  console.log(e.parameter)
}


function doPost(e){
  console.log(e.postData.contents)
}
```

# 叩く

## GET

```
curl  -X GET 'https://script.google.com/macros/s/hoge/exec?key1=value1&key2=value2'
```

## POST
```
curl  -X POST 'https://script.google.com/macros/s/hoge/exec'  \
-H "Accept: application/json" -H "Content-type: application/json"  \
-d '{"key1":"value1","key2":"value2"}'
```

# ログ
両方とも

```json
{"key1":"value1","key2":"value2"}
```

を得る。

ただ、GETの方はjsonで受け取るのに対し
POSTの方は文字列なので `JSON.parse()` シテヤル必要あり

# 因みに
doPost(e)はparameterも受け取れるので

 ```js
function doPost(e){
  console.log(e.postData.contents)
  console.log(e.parameter)
}
```

```
curl  -X POST 'https://script.google.com/macros/s/hoge/exec?key3=value3'  \
-H "Accept: application/json" -H "Content-type: application/json"  \
-d '{"key1":"value1","key2":"value2"}'
```

とすれば両方受け取れる。
webhookとして使うときに重宝するのでぜひ。
プログラミング日誌始めました

# やっていくこと

今回からプログラミングについて初心者ながら気づいたことを書いていこうと思います。

# 勉強していく言語

Java, JavaScript, C#, android
今のところはこれくらいでしょうか。
また簡単なゲームを作りたいのでその環境としてprocessingを利用しています。

# 今後について
最初は自分の好きなことからやっていきたいと思います。その合間に別の勉強もやっていこうと思います。
初回はプログラミングと関係ない内容ですが、よろしくお願いします。

きょうはここまで！
書き込み権限のないディレクトリにリダイレクト出力できない場合の対応

## 現象

* ユーザー書き込み権限のないディレクトリ`/example`を対象として、sudoを用いて以下のコマンドを実行したら権限エラーで書き込めなかった。

```bash 
sudo ls -al > /example/out.txt
```

* どうやらsudoによる権限付与がリダイレクト後のファイル出力には効かないらしい。

## 対策

以下のコマンドで正常に出力できた。

```bash
sudo sh -c 'ls -al > /example/out.txt'
```
link_to で戻るボタン実装するときReferrer設定されてなかったらどうなるのか調べた

Rails の `ActionView::Helpers::UrlHelper#link_to` についてのtipsです。
戻るボタンを実装するとき、

`link_to '戻る', :back`

のようにシンボルで `:back` と渡すとReferrerを読みに行きリンクを生成します。
しかしReferrerが設定されていない場合どうなるんだろうと思いました。

そこでドキュメントを見ると
https://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/UrlHelper.html

> Using a :back Symbol instead of an options hash will generate a link to the referrer (a JavaScript back link will be used in place of a referrer if none exists).

つまりReferrer が設定されていないときは自動的にJavaScriptのback link `javascript:history.back()` が呼ばれるようです。

該当コードはこの辺です。
https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/url_helper.rb#L45-L48
RailsでRSpecの初期設定を行う際のテンプレートを作ってみる


## はじめに

RailsでRSpecを導入する際に、毎回初期設定を忘れがちになるので、テンプレートとしてまとめてみます。

また、この記事はこの記事はTwitterで人気のハッシュタグ#100DaysOfCodeをつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した46日目の記録です。

## `.rspec`

```ruby
# 出力結果を色分け
--color
# rails_helperの読み込み
--require rails_helper
# 出力結果をドキュメント風に見やすくする
--format documentation
```

`rails generate rspec:install`を実行すると作成されるファイル。

デフォルトだと`--require spec_helper`となっているが、RailsでRSpecを使う場合は、`--require rails_helper`を使うのがベター。

理由としては、後述する`rails_helper.rb`で既に`require spec_helper`を行なっているため。

混乱しそうなのでまとめると、次の通り。

`.rspec`の設定 | シュチュエーション
|:-:|:-:|
|--require rails_helper | RailsでRSpecを使う時
|--require spec_helper| Ruby単体で使用するとき

## `config/application.rb`

```ruby
config.generators do |generator|
  generator.test_framework :rspec,
                   fixtures: true,
           controller_specs: true,
               helper_specs: false,
              routing_specs: false
  generator.fixture_replacement :factory_bot, dir: "spec/factories"
end
```

ここで設定しているのは、generatorを使う際に生成されるファイルたち。

テストフレームワークにrspecを指定することで、`rails g ~`を実行した際、自動的にspecファイルも作成してくれるというもの。

この辺はプロジェクトや開発者によって設定方法が異なるので、それぞれに合わせるのがいいかと。

## `spec/rails_helper`

```ruby
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'factory_bot'
require 'faker'
 Dir[Rails.root.join("spec/support/**/*.rb")].each { |file| require file}
 begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
 RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
  # arbitrary gems may also be filtered via:
  # config.filter_gems_from_backtrace("gem name")
  config.inculde FactoryBot::Syntax::Methods
end
```
RSpec用の設定ファイルの一つ。

このファイルではRails固有のspec設定を行う際にいじるものですね。

基本的にはRSpecのドキュメント通りに設定しておけば問題ない。

## `spec/spec_helper`

```ruby
RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end
   config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
   config.shared_context_metadata_behavior = :apply_to_host_groups
end
```

`rails_helper.rb`と同様に、RSpec用の設定ファイル。

こちらも、基本的にはRSpecのドキュメント通りに設定しておけば問題ないですね。

## まとめ

`spec/rails_helper.rb`と `spec/spec_helper.rb`はプロジェクトや人によって設定が違うから多種多様で面白いですねー。

細かい設定ファイルとかあるので、色々と調べてみると面白いかもしれません。
curlでpost送信にリダイレクトがかかってしまうときの対処法

# やれなかったこと

パラメータ付きのpost送信で
`-X POST` と `-L` って一緒に使えないんか...？

# いけるやろって思ったやつ
```
curl -X POST 'https://hoge.com?key=value'  \
-H "Accept: application/json" -H "Content-type: application/json"
```
postデータはないけどもちろんpost送信になる。
ただこれだとリダイレクトに対応できない。
(まあ、こんな事態になるってことはおそらくAPI側の設計が悪いんですが)

# とりあえずこれでリダイレクト対処しつつpost送信
```
curl -L 'https://hoge.com?key=value'  \
-H "Accept: application/json" -H "Content-type: application/json"  \
-d '{"aaa":"a"}'
```

`-X　POST` 書かなくても`-d`で適当なポストデータ書けばpost送信してくれる！
サンキューゴッド。

他にいい方法あれば教えてください。。。
Linux ( docker (PHP + Apache + Xdebug ) )<-> Windows + VS Code メモ

タイトルのような環境でPHPの開発をするときのメモ。
## 1行でまとめると
xdebug_break()を入れたテスト用phpファイルを作る＆Docker側のxdebugのログをチェックしましょうね。

## Dockerfileとかソースとかを一緒に管理したかった
なのでWindowsのフォルダ構成を
c:\project    VScodeのプロジェクトフォルダ
c:\project\   docker Dockerfileとか
c:\project\www\html ソース
みたいにした。このプロジェクトフォルダを深くしたのが迷う元でした。
## 環境
Ubuntu 16.04
・Docker
- apache+PHPのイメージにXdebug用設定を入れたもの（後述）
Windows
・VS Code
## DockerfileにXdebug用設定を入れる
Dockerfile

```
FROM php:7.0-apache
RUN apt-get update \
&& apt-get -y install git apt-utils \
&& docker-php-ext-install pdo_mysql mysqli mbstring \
&& pecl install xdebug
:
# for Xdebug
COPY zend.ini  /usr/local/etc/php/conf.d/zend.ini
:
```

zend.iniじゃなくてもいいんですが、Dockerfileと同じ場所にzend.iniを置くことと、Linux側のパスに注意。

zend.ini

```
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so

[XDebug]
xdebug.remote_autostart=1
xdebug.remote_enable=1
# WindowsマシンのローカルIP
xdebug.remote_host=192.168.254.123
♯ 9000でもいいです
xdebug.remote_port=9001
xdebug.remote_log=/tmp/xdebug.log
xdebug.remote_mode=req
# VS Codeのnameと違っててもよさげ
xdebug.idekey=xdebug
xdebug.remote_handler=dbgp
```
これで `docker build ・・・` して、`docker run -p 80:80 -d www`などで動かしましょう。**9001番のポートはdocker側からのアクセスなので -p で指定する必要はありません**。

### VS CodeのXdebug設定
launch.json

```
{
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "xdebug1",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}\\www\\html"
            }
        }
    ]
}
```

ポイントは`port`と`pathMapping`。`port`はzend.iniに書いたのと同じにしましょう。ここまではよくある話。もう1つの`pathMapping`ですが、`${workspaceFolder}`が指すのは、c:\projectなので注意。（トラブルシューティングのテスト用phpでチェックできます）

## トラブルシューティング
- ルーターのファイアウォール設定
 - ローカルマシン同士の通信ができるように。
- Linuxのファイアウォール設定
    -  ufwとかで9001番のアウトバウンドを閉じないように（色々やっててインバウンドと間違えて閉じてませんか？私は略）
- Windowsのファイアウォール設定
    - ググってね。
- /tmp/xdebug.logをチェック。

```
<- context_names -i 53 -d 0
-> <response xmlns="urn:debugger_protocol_v1"
:
```
とか出ていたら、とりあえずdockerからWindowsは見えてます。これでブレイクポイントで止まらないときは`pathMapping`が間違えているので、後述のテスト用phpで確認しましょう。

```
Log opened at 2018-08-06 ....
I: Connecting to configured address/port: 192.168.254.123:9001.
E: Time-out connecting to client (Waited: 200 ms). :-(
Log closed at 2018-08-06 ...
```
とか出ていたら、ポート番号間違えてます。

- /tmp/xdebug.logが作成されない？
    - そもそもxdebug入ってない or 入れ損ねている。
    - VS Codeでデバッグモードにして、デバッグしたいファイルにブレイクポイントつけて、ブラウザで当該ファイルにアクセスしたときに作られるぽいので、焦らないｗ

- テスト用php。xdebug_break()に到達したとき、`pathMapping`が間違っていたらVS Codeにダイアログが出て教えてくれます。

```
<?php
xdebug_break(); // ここで止まるはず。止まらない時はWindowsファイアウォール設定でブロックされています。
phpinfo();
```

May the 'debug' force be with you...