OmniAICreator/Qiita-1.07M huggingface dataset:
Power BI Tips - Webサイトに転がっているExcelファイルをデータソースにする

#概要
マーケティングのために、北九州市さんが出している保育園、幼稚園、小学校の情報を
集計・分析する画面をPower BIで作成しようと思い立って、いろいろ調べた内容の備忘録。

タイトルの通り、WebサイトからダウンロードできるExcelファイルを
Power BIのデータソースにする方法が、パッとわからなかったのです・・・（汗）。

今回も普段使いの人には初歩的すぎる内容でごめんなさい。

#データソース
北九州市 [学校基本調査 統計諸表](https://www.city.kitakyushu.lg.jp/kyouiku/file_0071.html)のページを開きます。
ここからダウンロードできる「市立小学校　学級数（Excel形式：72KB）」を
データソースにしたい。

URLは[https://www.city.kitakyushu.lg.jp/files/000803382.xls](https://www.city.kitakyushu.lg.jp/files/000803382.xls)となっています。

#方法
1.　Power BIを起動します。
2.　ホームタブにある「データを取得する」をクリックします

![ExcelをWebから取得017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/809ab79c-10b5-5d4b-c7b5-2168d51ecdcd.png)

3.　以下のようなダイアログが表示されるので、「その他」の「Web」を選択します。

![ExcelをWebから取得018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5ce2123b-5e74-de12-1824-595ff453cddd.png)

4.　以下のようなダイアログが表示されるので、前述のURLを指定し、OKをクリックします。

![ExcelをWebから取得019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d73e002b-ca89-c1a6-f748-39ab067bbabe.png)

5.　自動的にデータを取ってきてくれます！ナビゲーター画面が表示されたら、取り込みたいシートを選択して、「読込み」または「編集」をクリックしてください。

![ExcelをWebから取得020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/37eaf034-76ef-3c13-18eb-05b9582e5ff0.png)

あとはお好みで編集すればOK！

#接続できませんと言われた場合の対処
以下のような画面が表示された場合、追加でインストールが必要になります。
![ExcelをWebから取得001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/45734fc5-d648-4954-97b4-d0adf37aa7e0.png)

上記のメッセージ内のURLにアクセスすると、以下のようなページが表示されます。
![ExcelをWebから取得002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/50dfb8de-b1b4-382d-3dc2-e22c041dd63e.png)

ワタシ、英語得意でないので、迷わずLanguageをJapaneseに変更（笑）
以下のような画面になるので、ダウンロードボタンをクリックします。
![ExcelをWebから取得003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f673b419-8733-48d8-c5cd-ed59870d28bb.png)

お使いの環境（CPUアーキテクチャー）にあったプログラムを選択し、
ダウンロードしてインストールします。
![ExcelをWebから取得004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d3c60468-0b3a-3f3e-439d-372bfcf89fcf.png)
webとネットワーク技術 ~TCP/IP アプリケーション層~

## アプリケーション層
webアプリケーションやメールソフトなどアプリケーション毎のやりとりの仕方を決めた層。ここでは扱うデータをネットワークで転送するのに適した形式に変換したり、逆にネットワーク越しに送られてきたデータを私たちに理解できるように変換してくれる仕組みがある。

## 代表的なプロトコル一覧

| プロトコル | 用途 |
|:---------:|:---------:|
| HTTP |webページのデータのやりとりをする仕組み|
| SMTP |メール送信に関する仕組み|
| SSH |ネットワークから安全性の高い方法で他のコンピュータを遠隔操作するための仕組み|
| SSL |データのやりとりを暗号化して安全性を高くする仕組み|
| DHCP |IPアドレスを自動で割り当ててくれる仕組み|
| DNS |IPアドレスとドメイン名を対応付けしてくれる仕組み|

### IPアドレス
インターネットを使っているときにコンピュータに割り当てられたコンピュータ用の一意な番号(住所)のこと。IPアドレスがあるからインターネット取得したwebページのデータを届けてもらうことができる。
例: 192.168.1.1

### ドメイン名
IPアドレスがコンピュータ用に対し、ドメイン名は人間向けの名前。ただしコンピュータはドメイン名を認識できない。
例: example.com

### DNS
インターネットで通信するには送信先を特定する必要があります。その際、IPアドレスがコンピュータ向けのネットワーク上での住所に対し、ドメイン名は人間向けつけたIPアドレスの名前となっています。
しかしIPアドレス数字の羅列でしかないため人にはわかりにくく、コンピュータはドメイン名を理解できません。そこでIPアドレスと対応したドメイン名を教えてくれる仕組みが作られました。それがDNSです。
[Ruby]Line通知を使う

都内でエンジニアとしている[@emono](https://twitter.com/emono_dev)といいます。
仕事では主にrubyを書いてます。
botの実行結果をlineび通知したいなあ〜と思ってgemを作ったので、使い方をメモっときます。
作ったときの話は[こちら](https://qiita.com/emono/items/899190fcad3cfa38d634)。
Gemは[こちら](https://rubygems.org/gems/line-notify-client)

## 事前準備

- https://notify-bot.line.me/ja/
- token発行する

## 使い方

```bash
# Gemを追加
gem install 'line-notify-client'
```

```ruby
irb(main):005:0> require 'line-notify-client'
=> true
irb(main):006:0> token = "hoge1234" # irb(main):007:0> message = "hogehoge" # send_message
irb(main):008:0> Line::Notify::Client.message(token: token, message: message)
=> {"status"=>200, "message"=>"ok"} 
```
以上、ありがとうございました〜。
STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(7) 　割り込みを使ってみよう

STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(6) 　UARTを使ってみよう(2)の続きです。
シリアル通信で操作できるが、ボタンを押しても動きません。
今度は、シリアル通信で数字を入れても、ボタンを押しても動くようにしてみましょう。

そのためには、割り込みというのを使います。
割り込みとは、作業中に別の緊急案件を対応することを指します。

今回は、シリアル通信で数字を入れたら対応する。
ただ、ボタンを押しても対応するよ
というプログラムを作ります。

HAL_GPIO_EXTI_Callbackが割り込みになります。
これを今回入れたいところに記述しようと思います
が・・・うまく認識されないですね。

![62-1-1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8894280c-20bd-5218-7531-fa3912ea7452.jpeg)

なので、mainの中で書いてみましょう。

![62-1-1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/99e31e1a-d700-df39-8ede-012fed2da1d0.jpeg)

すると、認識されます。
このままプログラムを作っていきましょう。

GPIO_PinにボタンであるGPIO_PIN_13を割り当てます。
そのうえで、以前書いた「もし、ボタンが認識されたらLEDが反転する」プログラムをを入れます。
![62-1-1-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d2fc36fe-e26a-db98-6d1e-b7ad91807265.jpeg)

最後に、このプログラムを、適切な場所である「/* USER CODE BEGIN 4 */」に移動させます。

そのうえで、これをプログラムとして動くように、頭に「void」、お知りに、「uint16_t」と入れます。
これでプログラムを関数化したことを意味します。
関数ってなんだろう？？
関数は、モジュール化して、簡単に使えるようにするとわたしは思っており
void ~()
{}
これで一つのモジュールを作っています。

![62-1-1-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/313e80b1-0f33-97e5-6cf7-077f50abadff.jpeg)

```
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_13){
		HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
	}
}

/* USER CODE END 4 */
```

これで、ボタンを押したら、LEDが反転するし、シリアル通信で数字を打ってもLEDが点灯、消灯しますね。
Power BI Tips - 結合したセルがあるExcelを取り込んだ時の前処理

#概要
マーケティングのために、北九州市さんが出している保育園、幼稚園、小学校の情報を
集計・分析する画面をPower BIで作成しようと思い立って、いろいろ調べた内容の備忘録。

Excelを取り込んでみたはいいものの、
結合されたセルの箇所の、左上セル以外はすべてnull詰めになるので、
その際の対処方法

普段使いの人には初歩的すぎる内容でごめんなさい。


#データソース
北九州市 [学校基本調査 統計諸表](https://www.city.kitakyushu.lg.jp/kyouiku/file_0071.html)のページ内にある、
市立小学校　学級数（Excel形式：72KB）

Excelで開くとこんな感じ
![ExcelをWebから取得015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/b56d8e72-5912-d0bf-b68c-1cd714322dc5.png)


#起こった現象
Power BIで取り込むと、こんな感じ（※いらない行を削除したり、列タイトルを変更してます）
![ExcelをWebから取得013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8528c923-f490-1162-2147-ab9d7a49f2de.png)

Excelでは行政区のデータがセル結合されていて、
見た目は大積小学校や小森江西小学校などは門司区というのがわかるんだけど、
こうやって取り込んだデータは、null詰めとなります。

こちらとしては、nullとなっているところは、上の行に入っているデータが自動的に入ると嬉しい。

#対応方法
実はそんなことを簡単にやってくれる機能がありました。
⇒もっと早く知りたかった・・・。これ知るまで、手作業でデータ埋めてた・・・。

その方法がこちら
![ExcelをWebから取得014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/2466fe64-379d-2537-d61a-8ae6d94d6af4.png)

対象の列を選択して、Queryエディターの変換タブにある「フィル」を選ぶと、
空のセルは隣接するセルの値で埋められます。
「下」を選ぶと、上に隣接するセルの値で埋められます。

結果はこちら![ExcelをWebから取得016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/e0c8bc5c-245f-4769-1543-2516fcb9d412.png)


行政から出てるExcel形式のオープンデータって、結構こういうことあるから、
これは必須で覚えておかねば・・・・。
range関数の使い方と例外処理

##range関数を使うと
while文に比べて少ない記述で同じ内容を実行できる


【While文で書いた場合】

```python
n = 0

while n < 5:
    print(n)
    n += 1
```

【for文 + range関数で書いた場合】

```python

for i in range(5):
    print(i)
```



rangeは引数を3つまで取ることができる

`for i in range (x, y, z)`とあった場合

x = 始まりの値
y = 最後の値
z = 増加量

```python
for i in range(1, 10, 2)
    print(i)
```

とあった場合、「１から(10-1)までの行列が2間隔で出力される」ので実行結果は

```
1
3
5
7
9
```

行列の中に文字列があった場合は、tryexcept文で例外処理を行う

```python
L = [1, "あ", 4, 2]
for i in L:
    try:
        print(i/10)
    except:
        print("Oh...")
```


※参照元: [Pythonによる教育データ分析入門：Pythonの基礎から回帰分析・項目分析まで](https://www.udemy.com/intro_educational_data_analysis_with_python/learn/lecture/)
Mattermostジャンケンプラグイン作った


## はじめに

「チームメンバー何人かとMattermost上でジャンケンしたい」と会社の先輩が言ってたのでプラグインを作りました。

https://github.com/yiwkr/mattermost-plugin-janken

プラグインの作成は[こちら](https://qiita.com/kaakaa_hoe/items/f65e995eca8a1eff39c7)の記事とMattermostのドキュメントなどを参考にしています。

## 動作環境

Mattermost Server: 5.6.0以上

## 使い方

下記から`com.github.yiwkr.mattermost-plugin-janken_*.tar.gz`をダウンロードしてMattermostサーバーにアップロードします。

https://github.com/yiwkr/mattermost-plugin-janken/releases

Mattermostサーバーへのアップロード方法は[こちら](https://qiita.com/kaakaa_hoe/items/f65e995eca8a1eff39c7)の記事で紹介されています。

プラグインを有効化すると`/janken`コマンドが使えるようになります。
`/janken`コマンドを実行すると下記のような投稿が表示されます。

![screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419802/190e8401-eaa4-e5a8-f75c-59f87e6f3ba6.png)

「参加」ボタンを押すとダイアログが出てくるので、ジャンケンで出す手を5手目までの選択します。

![screenshot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419802/f87a1cf0-ad8d-b1c0-3914-1c01205fda44.png)

ダイアログの「保存」ボタンを押すと、参加が確定し「参加者」に名前が表示されます。

![screenshot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419802/46b8c6bf-6148-d266-fda5-daf6db337790.png)

他のメンバーにも同様に参加してもらいます。

![screenshot4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419802/789b5db2-f5bf-26f5-9a0a-ab2626472b01.png)

`/janken`コマンドでジャンケンを始めた人が「結果」ボタンを押すと結果が表示されます。
（順位確定後の手は表示されません）

![screenshot5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419802/0ff082ff-1f16-82d2-0f8e-cbcd7f25be25.png)

上記のaliceとcarolのように、5回戦目までに順位が決まらなかった場合は同じ順位になります。
デフォルトでは最大5回戦までですが、「設定」ボタンから最大ジャンケン回数を変更することで1回勝負から最大10回戦まで変更できます。

## さいごに

とりあえず動くものを作ることができてよかったです。

## 参考

### ドキュメント

- https://docs.mattermost.com/index.html
- https://developers.mattermost.com/extend/plugins/

### プラグイン

- https://github.com/mattermost/mattermost-plugins

### 解説記事

- https://qiita.com/kaakaa_hoe/items/f65e995eca8a1eff39c7
bash + Awk > csv形式の文字列に列を追加する > 固定の文字列

```txt:動作環境
Bash (bash 4.4.5) on ideone.com
```

### 処理概要

```
AAA,BBB,CCC
111,222,333
444,555,666

```

上記の文字列を以下とする処理を実装する。

```
AAA,BBB,DDD,CCC
111,222,777,333
444,555,777,666

```

### 関連

- [Echo newline in Bash prints literal \n](https://stackoverflow.com/questions/8467424/echo-newline-in-bash-prints-literal-n)
- [Add column to middle of tab-delimited file (sed/awk/whatever)](https://stackoverflow.com/questions/11950641/add-column-to-middle-of-tab-delimited-file-sed-awk-whatever)
- [Add Column to end of CSV file using 'awk' in BASH script](https://stackoverflow.com/questions/9506810/add-column-to-end-of-csv-file-using-awk-in-bash-script)

### 実装

https://ideone.com/RFnOHN

```bash
#!/bin/bash

inp1="AAA,BBB,CCC\\n111,222,333\\n444,555,666\\n"

echo -e $inp1 | awk -F"," '
{
    OFS = ","
	if(NR == 1) {
		$2 = $2 FS "DDD"
		print $0
	} else {
	    if ($0 != "") {
	    	$2 = $2 FS "777"
			print $0
		}
	}
}
'


```

### 結果

```
AAA,BBB,DDD,CCC
111,222,777,333
444,555,777,666
```

### 備考

- もっときれいにかけるかもしれないが、今はそれを必要としていない
WebページをIEで見たときは他のブラウザで見るよう誘導する（CSS使用、JavaScript・PHP等使わずに）

例えば、[CodePen](https://codepen.io/)にIEから入ろうとすると、下のように警告される。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358159/62d7fd31-1848-451d-1502-1f4e2c993d81.png)

こんな感じのをJavaScriptやPHPなどを使わずにCSSだけでやってしまおうというのがこの記事の主題です。

##何がしたいか
WebページをIEで表示させたときのみ、警告文のようなものを出して他のブラウザで見るよう誘導させる。その際、本来そのWebページで表示されるものは表示されないようにする。

##とりあえずコードを
```html:HTML
<div class="ieOnly">
  <!-- IEで見た際に表示させたい内容を記述 -->
</div>

<div class="otherIEonly">
  <!-- IE以外で見た際に表示させたい内容を記述 -->
</div>
```

```css:CSS
/* IE以外で表示されるページのスタイル */
.ieOnly {display: none;}

/* IEで表示されるページのスタイル */
_:-ms-input-placeholder, :root .ieOnly {display: block;}
_:-ms-input-placeholder, :root .otherIEonly {display: none;}
もしくは
_:-ms-lang(x)::-ms-backdrop, .ieOnly {display: block;}
_:-ms-lang(x)::-ms-backdrop, .otherIEonly {display: none;}
```

##仕組み
**CSSハック**を利用して、IEだけにCSSを指定しています。CSSハックについては、[CSSハックとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11296.html)が簡単に解説しています（ちなみにこのページのソースコードにはアスキーアートが組み込まれているよ）。

- IE以外で見たときは、下のコードの指定のおかげで、警告文を構成する要素が表示されません。

```css:CSS
/* IE以外で表示されるページのスタイル */
.ieOnly {display: none;}
```
- IEで見たときは、下のコードのAの指定のおかげで、警告文を構成する要素が表示されます。また、Bの指定のおかげで、本来ページに表示される要素が表示されなくなります。


```css:CSS
/* IEで表示されるページのスタイル */
_:-ms-input-placeholder, :root .ieOnly {display: block;}  /* A */
_:-ms-input-placeholder, :root .otherIEonly {display: none;}  /* B */
もしくは
_:-ms-lang(x)::-ms-backdrop, .ieOnly {display: block;}  /* A */
_:-ms-lang(x)::-ms-backdrop, .otherIEonly {display: none;}  /* B */
```

##実際に作ってみた
[こちら](https://ryoo.info/prototype/ignoreIE.html)のページを確認してみてください。僕がテストした限りだと、IE以外では左の表示に、IEでは右の表示になりました。
![フッター新デザイン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358159/94d48b3c-c7ea-a969-3e8c-ac24b26f15bd.png)
###テストしたブラウザのバージョン
| ブラウザ|バージョン |
|:-----------------|:------------------|
| Chrome（PCとスマホ）|74.0.3729.157|
| Firefox|66.0.5|
| Edge|42.17134.1.0|
|safari|不明|
|IE|11.0.125|
なお、画像右側の「change your browser!!」のページのコードは[こちらのCodePen](https://codepen.io/Mryoo/full/EJRbGV)に載せています。

##注意
- CSSハックを推奨しない声もあるため、使うときは注意してください。
- 間違いや改善点などがあれば教えてください。
#django + factory_boy で create してもレコードが保存されない問題

`factory.Factory` ではなく `factory.django.DjangoModelFactory` を使おう。

# e.g

```
class UserFactory(factory.django.DjangoModelFactory):
  ...
```

# ref

[A simple MyFactory.create() actually not saving in DB? (Django) · Issue #329 · FactoryBoy/factory_boy](https://github.com/FactoryBoy/factory_boy/issues/329#issuecomment-263035946)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1915








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
kaggleに役立つ機械学習の本・サイト

#サイト
- kaggle 初心者ガイド
https://kaggler-ja-wiki.herokuapp.com/kaggle%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89

- pandasの使い方
https://note.nkmk.me/

# 書籍
実装が学べるもの

- ［第2版］Python機械学習プログラミング 達人データサイエンティストによる理論と実践

- 東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~


数式に依らずに理論が学べるもの

- 戦略的データサイエンス入門

文系出身の方でも機械学習の数学が学習できるもの

- 人工知能プログラミングのための数学がわかる本
Laradockの環境構築

環境
Macbook / OS High Sierra 10.13.6
※参照している記事は 2019/5/19 のものです。

# 1. dockerのinstall

[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)


1. Docker のアカウントを持っていなければ新しく作ります
https://id.docker.com/

2. Docker for Macをダウンロードしてインストールします
https://docs.docker.com/docker-for-mac/install/

3. Mac側で Docker.app を起動します

4. ターミナルで以下のコマンドを実行できればOK
`docker version`



# 2. Laradockのinstall

こちらのページの①までやったときの、個人的につまったポイント
[Laradockでの環境構築方法２パターンを細かめに説明](https://qiita.com/wajima/items/69fad6c2b42c52928e82)


#### [11.hostsファイルの編集]
`vi /etc/hosts`
で編集できます。
権限によっては、
`sudo vi /etc/hosts`
の場合もあります。


#### nginx が立ち上がらない
[Laradockが上手く動かなくて困った話](https://qiita.com/skmt719/items/a296d81150fd7319e71a)
を参考に、portsの設定を変えたら動きました。


#### http://myapp/ にアクセスできない
myapp/.env の DB_PASSWORD が 'secret' になってるなら 'root' に変更します。
下の状態です。

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=root
```

DB_DATABASEは[4.MySQLの設定]で指定したデータベース名にしてください。

再度 `docker-compose restart` をすると入れました。
pdfminerでPDFファイルの中身を解析して、PyPDF2でファイルを集約する

仕事でPDFの中身の特定のIDごとにPDFを集め直す必要がありまして、とはいえ、仕事時間中にプログラムを作ってる時間もなく、休みを利用してプログラムを作ったので、GitHubの勉強も兼ねてMITライセンスでGitHubで公開することにした。

GitHubのレポジトリ: [pdfassort (PDFの盛り合わせ)](https://github.com/katsuya1128/pdfassort)

振り返ってみれば結構汎用的な物ができたような気がする。

## Usage

```text
usage: pdfassort.py [-h] [-v] [-o OUTPUT_DIR] [-ns] [-nf] CSV PDF [PDF ...]

pdfassort.py -- PDFの盛り合わせ v0.1a (2019/05/15)

        CSVによるリストとPDFの内容に基づきPDFファイルを仕分けする。

positional arguments:
  CSV                   CSVによるキーと出力ファイル名のリスト
  PDF                   PDFファイル

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         処理の進捗表示を詳細にする
  -o OUTPUT_DIR, --output-dir OUTPUT_DIR
                        出力ディレクトリ, default: '.'
  -ns, --no-skip-csv-header
                        CSVファイルのヘッダ行 (1行目) をスキップしない
  -nf, --no-fast-mode   ファイル名にキーが含まれていても無視する
                        default: ファイル名にキーが含まれていたらファイル全体を追加し
                        ファイルの内容は見ない
```

## 設計メモ

pdfminer.sixでテキストを解析して、PyPDF2で連結・出力する。

### 解析

PDFを解析して以下の構造に組み立てる。

```
{key1:
    {in_file1: [p1, p2, ...]},
    {in_file2: [p1, p2, ...]},
    ...},

{key2:
    {in_file1: [p1, p2, ...]},
    {in_file2: [p1, p2, ...]},
    ...},
...

```
UnicornでRailsアプリケーション起動時「master failed to start, check stderr log for details」

普段Unicornはゴリゴリ触らず、エラーを見て一瞬「うっ」となってしまったため、作業ログ的に残しときます。

# 環境
- AWS EC2環境(CLI接続)
- Unicorn(5.5.0)
- Rails(5.2)
- Ruby(2.4.1)

# 起きたこと
EC2の本番環境でUnicornを起動しようと、以下のコマンドをコピペして実行したらエラーが出て起動できなかった。

```terminal:aws-cli
[name]$ unicorn_rails -c /var/www/rails/hogehoge(アプリ名)/config/unicorn.conf.rb -D -E production
master failed to start, check stderr log for details
```

# ログを見る
Unicornのログを見ると、怪しげなエラー発見。
引数エラーっぽいが、コマンドは間違っていないはず。

```terminal
[name|shared]$ tail log/unicorn_error.log
ArgumentError: wrong number of arguments (given 0, expected 2)
```

# 原因
Unicornの最新バージョン(5.5.0)でメソッドの仕様にアップデートがあったため、発生したエラー見たいです。以下のコマンドで環境下のUnicornのバージョンが分かります。

```terminal:local
$ bundle exec gem list | grep unicorn
```

# 対応
GemfileでUnicornのバージョンを固定し `bundle install` しました。

```rb:Gemfile
# バージョンを指定
gem 'unicorn', '5.4.1'
```

```terminal:local
$ bundle install
$ bundle exec gem list | grep unicorn
unicorn (5.4.1)
```
Ansible実行手順と、簡単なチュートリアル


#Ansibleの実行処理

1,インベントリの中からターゲットノードを見つける
2,コントロールノードでプレイブックをpythonのコードに変換
3,コントロールノードからターゲットノードへssh接続、pythonのコードを送信
4,ターゲットノードでpythonのコードを実行、出力結果をコントロールノードに返す
5,コントロールノード、ターゲットノードにあるpythonのコードを削除

という手順を踏んで実行されます。
ここで、プレイブックとインベントリはそれぞれ以下のような意味になりませす。

##プレイブックとインベントリ


・**プレイブック・・・処理の流れを定義したファイル。Chefでいう、recipe,
Puppetでいう、manifestに相当するファイル**

**YAML形式で書かれるため、コーディング経験がない人でも容易にかける
・インベントリ・・・ターゲットノードの情報が書かれたファイル**



![スクリーンショット 2019-05-11 22.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/bbe7e0ee-2e85-1512-dc47-e4d4b74ddc20.png)



では、簡単なサンプルを実行してみます。
まずは、vagrantで3つの仮想環境を立ち上げましょう。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.define "host" do |node|
    node.vm.box = "bento/centos-7"
    node.vm.hostname = "host"
    node.vm.synced_folder "host", "/vagrant"
    node.vm.network :private_network, ip: "192.168.33.11"

    node.vm.provision "shell", inline: <<-SHELL
      sudo yum -y install epel-release
      sudo yum install -y gcc python-pip python-devel openssl-devel libffi-devel
      sudo pip install --upgrade pip setuptools
      sudo pip install ansible
    SHELL

  end

  config.vm.define "web" do |node|
    node.vm.box = "bento/centos-7"
    node.vm.hostname = "web"
    node.vm.synced_folder "web", "/vagrant"
    node.vm.network :private_network, ip: "192.168.33.12"
  end

  config.vm.define "db" do |node|
    node.vm.box = "bento/centos-7"
    node.vm.hostname = "db"
    node.vm.synced_folder "db", "/vagrant"
    node.vm.network :private_network, ip: "192.168.33.13"
  end

end

```

ここからは、host(192.168.33.11)がコントロールノード、web(192.168.33.12)とdb(192.168.33.13)がターゲットノードという形です。

```shell
$vagrant up
$vagrant ssh host
```
でhostに入ります。
ここで、hostからweb,dbにそれぞれsshで接続するために、鍵の設定をしていきます。

###鍵の設定
<仮想環境hostで>

```shell
#秘密鍵、公開鍵の作成
$ssh-keygen -t rsa
#全てにenterでok
#仮想環境host(コントロールノード)に公開鍵登録
$ssh-copy-id localhost
#パスワード vagrant

#(ターゲットのーど)仮想環境web(192.168.33.12)に公開鍵登録
$ssh-copy-id 192.168.33.12
#パスワード vagrant

#(ターゲットのーど)仮想環境db(192.168.33.13)に公開鍵登録
$ssh-copy-id 192.168.33.13
#パスワード vagrant
```
これで,hostから
「ssh 192.168.33.12」や「ssh 192.168.33.13」のような形で接続可能になったはずです。
（つまり,「3,コントロールノードからターゲットノードへssh接続、pythonのコードを送信」の段階を踏めるようになったということ）


hostの中で、/vagrant以下に行って、

```
$cd /vagrant
```
sample_inventory.iniを作成

```sample_inventory.ini
[host]
localhost

[web]
192.168.33.12

[db]
192.168.33.13
```

ここまでで設定は終了です。

以下のコマンドを実行し、sample_inventory.iniで定義した各ノードに対してpingコマンドを実行し、値が帰ってくるか確認します。

```shell
$ ansible all -i sample_inventory.ini -m ping

192.168.33.12 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.33.13 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

```
上記のようになっていればOKです。
Node.jsで絵文字を扱うための、node-emojiライブラリの使い方

# はじめに
slackのEvent APIを使用して、Lambda(Node.js)で処理する際に絵文字が文字列に変換されてしまいました。
`こんにちは😎` → `こんにちは:sunglasses:`

再度、文字列を絵文字に変換する必要があります。幸いNode.jsには`node-emoji`というライブラリがあり、簡単に変換できたので使い方の紹介です。
※GitHubのREADME.meがとても分かりやすいです。

公式GitHub:https://github.com/omnidan/node-emoji

# 使い方
`npm install --save node-emoji` でインストールする

```javascript
const emoji = require('node-emoji');

// 文字列→絵文字に変換
console.log(emoji.get('sunglasses')); // 😎

// 絵文字→文字列に変換
console.log(emoji.which('😎')); // sunglasses

// 全ての絵文字文字列を絵文字に変換
console.log(emoji.emojify('I :heart: :coffee:!')); // I ❤️ 😎!

// ランダムな絵文字を作成
console.log(emoji.random()); //{ key: 'spoon', emoji: '🥄' }

// 検索にヒットする絵文字を取得
console.log(emoji.search('cof'));　//[ { key: 'coffee', emoji: '☕' },{ key: 'coffin', emoji: '⚰️' } ]

// 全ての絵文字を絵文字文字列に変換
console.log(emoji.unemojify('I ❤️ 🍕')); // I :heart: :pizza:

// 絵文字から検索
console.log(emoji.find('🍕')); // { emoji: '🍕', key: 'pizza' }

// 文字列から検索
console.log(emoji.find('pizza'));　// { emoji: '🍕', key: 'pizza' }

// 絵文字が存在するかの確認
console.log(emoji.hasEmoji('🍕')); // true

// 絵文字を削除
console.log(emoji.strip('⚠️🍕low 🍕disk space')); // low disk space

// 絵文字を置換する
console.log(emoji.replace('⚠️🍕low 🍕disk space', (emoji) => `${emoji.key}:`)); // warning:pizza:low pizza:disk space
```
FtDのLua用に開発環境を構築する

## はじめに
* この記事は「From The Depths」というゲーム（以下FtD）で使用できるLuaに関する記事です。
* Luaに関心のあるFtDプレイヤーを対象としています。
* 筆者の環境であるWindows 10を前提としていますがFtDが動くなら何でも大丈夫。多分。

## LuaBoxでのコード編集
LuaBoxをQキーで開いて使用するゲーム内エディタは、エディタとしての機能は最低限となっています。
例えば、

* Undo、Redoが効かない。
* 自動インデントが無い。
* 検索も無い。
* 長文だと全文を表示できない（ことがある）

などなど。割とストレスを感じます。
別途コーディング環境を用意した方が100倍くらい捗ります。

## Visual Studio Codeを導入する
というわけで環境を用意するわけですが、私はVisual Studio Code(以下VS Code)を使用しています。
Microsoftが提供している無料のテキストエディタです。
下記サイトにて配布していますのでダウンロードしてインストールしましょう。
https://code.visualstudio.com/

## VSCodeの拡張機能
VSCodeでLuaを書くにあたって、入れておくと便利な拡張機能があります。

### Luaのスニペット
まず、Luaのスニペット。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/64fa3fd4-6e1a-a8a6-1902-d5ad82906357.png)
Luaの構文を補完してくれます。
MarketplaceでLuaで検索すると出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/3dba1e58-b743-d33c-f301-6f1267381e21.png)
上記画像の上から2番目、0.0.9とあるkeyringさん？のやつですね。
gccfeliさんのは未使用なため不明ですが多分似たようなものかと思います。

### Luaのlint
次に、Luaのlint。構文エラーなどを検知してくれます。
FtDのLuaBoxは、最近エラーログが出なくなったので、割と重要です。（そのうち直る気もしますが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/f9220bda-5521-4f07-74fc-0c629c2cd930.png)
「lua lint」で検索すると出てきます。satorenさんのを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/733af1b0-e376-b988-29a4-896df41afe24.png)
こんな感じに問題のある箇所を強調表示してくれます。

### FtD Lua用のスニペット
最後に、FtD Lua用のスニペット。
筆者の自作です。Marketplaceに公開していないので、GitHubから持ってきてください。
https://gist.github.com/tvagames/9c7c29ec749c85ecab87cc74624dd34b

VSCodeに適用する方法はググってもらうとして、lua.jsonの内容を上記GitHubから持ってきたjsonの内容で上書きすればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/22cc5ce0-f3bf-6f4d-5d6f-0fac978174fc.png)
luaファイル上で（または言語モードをluaにして）ftdと入力すると、FtD用のAPIが出てきます。
現状、v2.4.5.6に対応しています。

以上。
pymongoで取得したデータをJson形式で確認する方法

#はじめに

機械学習やら色々な新しい事を実践的に試すべく
エロサイトを開発中。[モトダチ](http://motodachi.me/)
開発実践用にオープンしているので広告は入っておりませんのでお気軽にどうぞ。
色々工夫したアプリケーションの作りになっているのでレスポンスは速いはず。

#概要
python、mongoでの開発でmongodbから取ってきたオブジェクトの確認方法についてです。

```
# mongodbからデータ取得
related_videos = db.videos.find(where).sort(sort).skip(skip).limit(10)

# データ出力
print(related_videos)
-> <pymongo.cursor.Cursor object at 0x7f01e601cd30>

```

上記のようにmongoから取ってきたデータを確認したい場合、 `print(related_videos)` ではpymongo.cursor.Cursor オブジェクトなるものとして出力され、中身が確認できず少し詰まったのでメモです。

#結論
json_utilの `dumps` を使えば、
pymongoカーソルをjsonに変換し、json形式として出力してくれます。

```
# dumpsのimport
from bson.json_util import dumps
.
.
# mongodbからデータ取得
related_videos = db.videos.find(where).sort(sort).skip(skip).limit(10)

# データ出力
print(dumps(related_videos))
```

これで下記のようにJson形式で出力されます！

```
[
  {
    "view": 17,
    "created_at": {
      "$date": 1558212054384
    },
    "report_flg": 0,
    "deleted_at": "",
    "_id": {
      "$oid": "5cdfef46653644e9f61438eb7"
    },
    "updated_at": "",
    "movie_kind": "av",
    "like": 2,
    "comment": 0,
    "tags": [
      "マッサージ",
      "セクシー",
      "無修正",
      "デカチン"
    ],
    "idx": 1,
    "length": "12:41",
    "title": "【無】セクシーなマッサージ師がデカチンに興奮してハメさせてくれた"
  },
.
.
.
]
```
プライマリキーって何ですか？

データベース（MySQL）のテーブル設計について、
私の転職先（仮称：ＸＸ社）での体験を紹介します。

---

###【 主キーが１０カラム以上 】
社員マスタを例にします。ふつうは「社員番号」を
プライマリキー（以下、主キー）にすると思います。
ところがＸＸ社では、社員番号 ＋ 名前 ＋ 住所 ＋ ・・・ を組み合わせて、
１０カラム以上で主キーにしていたのです。

＞
＞ **私**「なぜ こんなにたくさん・・、名前や住所も主キーに含めているんですか？」
＞
＞ **Ａ氏**「え？ だって名前で検索することがあるから。」
＞

Ａ氏は主キーを「何となく検索が速くなるもの」と思っていたようです・・・。
それで複数のカラムを主キーに投げ込んでおいたのでしょう。

正しく設計するなら、「社員番号」のみを主キーにします。
名前での検索が多ければ、「名前」のみで別のインデックスを付加します。

主キーは、カラムを「どんぶり」で設計できるものではありません。

---

###【 主キーが無い 】

電話番号テーブルを例にします。ふつうは「電話番号」を主キーにして、
名前 や 固定携帯区分 などをデータに持つと思います。

ところがそのテーブルに、主キーやインデックスが無かったのです。

＞
＞ **私**「なんで主キーが無いんですか？
＞ これじゃ同じ電話番号が２件 入ってしまいますよ？」
＞ 
＞ **Ｂ氏**「はぁ・・・。」
＞ 
＞ **私**「いやいや。同じ電話番号が２件 入ったら困るでしょ？
＞ ２件の内どっちを参照／更新するんですか？ バグの元ですよ？」
＞ 
＞ **Ｂ氏**「・・・プログラムでユニークにできますが それじゃダメですか？」
＞ 

Ｂ氏の言い分ですが、例えば「03-1234-XXXX」を登録する場合、
いったんそれで検索して、レコードがあれば UPDATE, 無ければ INSERT する。
そうすればユニークにできるので、重複キーが登録されることはない、と。

確かにこの方法でユニークにできます。
しかし厳密にいうと以下の問題があります。

・プログラムにバグがあれば、重複キーが登録される可能性がある。
・そうなると検索で２件以上ヒットしてしまう。（１件のみヒットしてほしいのに。）

どうもＢ氏は、テーブルをエクセルのようなものと思っていたようです。

---

###【 マスタの主キーが AUTO INCREMENT 】

果物マスタを例にします。
主キーとして、例えば果物の英単語を使うと思います。（APPLE, ORANGE など。）
ところがＸＸ社では、こともあろうに AUTO INCREMENT の数値が設計されていたのです。

1,りんご
2,みかん
3,ぶどう
　　:

例えばみかんを検索したいときは、KEY=2 で検索します。

ここで問題は、主キーが AUTO INCREMENT だということです。

人が画面上でみかんを明確に選んでいる場合はともかく、
人を介さないバッチ処理で、みかんのデータを検索／更新するためには、
キーで指定しなければなりません。

上記の場合、プログラム中で KEY=2 と記述すればよさそうですが、
みかんが２になる保証はないのです。

テスト環境では、

1,りんご
2,みかん（＝２）
3,ぶどう
　　:

かもしれませんが、本番環境では登録順などで、
数値（キー）が以下のようにズレるかもしれないのです。

1,いちご
2,りんご
3,みかん（＝３）
4,ぶどう
　　:

AUTO INCREMENT なので、果物に対する数値（キー）を指定できません。
これでは極端な話、テスト／本番環境で、
プログラムソースを分けないといけないのです。

この機能はリリース前だったので、設計しなおす最後のチャンスでした。
私は猛抗議しました。

＞ 
＞ **私**「なんでマスタで AUTO INCREMENT 使うんですか！
＞ 履歴テーブルやキューとは違うでしょう！？」
＞ 
＞ **Ａ氏**「テーブルには AUTO INCREMENT を付けるんです（？？？）」
＞ 
＞ **私**「AUTO INCREMENT を外してキーを固定にしてください！
＞ これじゃソースを分けないといけないでしょう！？」
＞ 
＞ **Ａ氏**「テスト環境と同じ順番でマスタ登録してください。そうすればズレません。」
＞ 

・・・まるで話になりませんが、私はＡ氏に従いました。
テスト環境と同じ順番で、本番環境にマスタ登録しました。
これにより、ソースの２重管理は避けられました。

それにしても なぜＡ氏は、私の意見を聞き入れなかったのでしょうか？

想像するに、Ａ氏は Oracle の rowid のようなものを
付加したかったのかもしれません。
（MySQL には元々 rowid に相当するものがないので、
AUTO INCREMENT で代用したかった？？？）

ちなみに前記の社員マスタ「主キーが１０カラム以上」も同じＡ氏設計で、
社員番号が AUTO INCREMENT でした。
AUTO INCREMENT（社員番号）にさらに別カラムを付加して、主キーとしていたのです。

---

###【 意外な背景 】

以上のように、私が中途入社したシステムでは、
無意味で危なっかしいテーブル設計がされていました。

さらに、その無意味な設計を、知識のない新入／中途社員が
「正しい設計」と思って学習し、社内全体に広がっていたのです。
（一般に知識が無い場合、先輩のサンプルを真似ると思います。）

ただ「無意味」ではありますが、「台無し」にするわけではありませんでした。
それが直接バグを引き起こすことはなく、それなりに動いていました。
（収益も上げていました。）

このシステムは、厳密な設計を必要としないものでした。
データの出し入れができれば それでよかったのです。
データベースの知識の欠如を、プログラムでカバーしていたのです。

（もちろん、データ量が増えれば、現在の設計では耐えられず、
設計を見直す必要がありますが。）

---

###【 教訓 】

以上の体験で得た教訓は・・・
転職先では、今までの常識が通用しない人達がいて、
簡単には変わらない、ということでしょうか。

じっさい私は、テーブル設計の基本、いわば「常識」を何度も言い伝えました。
でも なかなか理解してもらえませんでした。

よくタイムスリップで過去へ行き、現在の知識を教え伝え、
過去の世界で称賛される、という映画ドラマがあると思います。

しかしそれは、映画ドラマだからです。

過去の人の立場からすると、今までのやり方を
簡単に変えられるものではありません。
（人は最初に習ったことを正しいと思い込む「刷り込み」があるようです。）

自分の常識を強引に押し付けるのは、必ずしも成功しません。
少なくともＸＸ社では収益を上げていたのだから、
テーブル設計は結果的に「正解」だったのです。
それを否定するのは、収益に貢献するシステムを否定することになり、
きっと「生意気な奴」と思われるでしょう。

まずは社内で実績を作ったうえで、自分のテーブル設計（サンプル）を
時間をかけて浸透させるしかないでしょう。
現在は、私が設計をチェックする立場なので、無意味な設計は無くなりました。
PostgreSQL ロール追加と権限付与

##概要
PostgreSQL にロールを追加する方法です。

本記事でやること
1. ロールを追加する
2. 権限を付与する

##実行環境

PostgreSQL 11.1
CentOS 7.6
## 操作手順
### ロールの追加
```
CREATE ROLE <ロール名> WITH LOGIN PASSWORD '<パスワード>'
```

### 存在するDBに対して権限を付与
```
GRANT ALL PRIVILEGES ON DATABASE データベース名 TO ユーザ名 WITH GRANT OPTION;
```

以上で作成したロールで特定のDBを操作できる。

pg_hba.confをmd5認証にしていない場合は変更し、再起動する必要があります。


##終わりに
ユーザのことをロールということを知りました。(すみませんただの感想です)

##参考
PostgreSQLでユーザー（ロール）を追加してテーブルにアクセスする
https://qiita.com/wb773/items/248e6e083b2fe12e820a
現役エンジニアがおすすめするUnity系のメディア・ブログ

はじめまして。あむです。仕事ではUnityを使っています。

今回はおすすめのUnity系の記事を投稿しているサイト・ブログをおすすめしますわ。

#テラシュールブログ

＞http://tsubakit1.hateblo.jp/

#凹みTips

＞http://hecomi.hatenablog.com/


#うら干物書き

＞http://www.urablog.xyz/


#踊るプログラマー	

＞http://waken.hatenablog.com/



#ゴマちゃんフロンティア
＞http://gomafrontier.com/



#渋谷ほととぎす通信

＞http://www.shibuya24.info/



#ユニシャー

＞https://miyagame.net/



#Unityを使った３Dゲームの作り方

＞http://gametukurikata.com/


どこも記事の質が高いです。いつも感謝してますわ。
あむでした。ごきげんよう〜〜
DNNのモデル毎の処理量(GOP)をまとめる

#目的
DNNのモデル毎の処理量（GOP = Giga Operations)をまとめる。
1画面（フレーム）あたりの処理量の意味。
正確な情報が必要な場合は、**「情報5」**とかを見られるのがいいと思う。
（「情報1」～「情報4」に比して）

:memo:
GOP(Giga Operations)
GOPS(Giga Operations per Second)


#DNNのモデル毎の処理量

## 情報1
[文献『AN ANALYSIS OF DEEP NEURAL NETWORK MODELS FOR PRACTICAL APPLICATIONS』を読む。](https://qiita.com/enoughspacefor/items/ea5a3225c6c54c469326)

|model|Gop|備考|
|:---:|:---:|:---:|
|MobileNet-v1 |1.4|※目分量の精度悪し|
|MobileNet-v2 |0.7|※目分量の精度悪し|
|AlexNet |2.2|※目分量の精度悪し|
|GoogleNet |2.5|※目分量の精度悪し|
|ResNet-50 |8.0|※目分量の精度悪し|
|VGG19 |39|※目分量の精度悪し|
|VGG16 |31|※目分量の精度悪し|

## 情報2
[資料『JETSON AGX XAVIER AND THE NEW ERA OF AUTONOMOUS MACHINE』を読む](https://qiita.com/enoughspacefor/items/fa825bf907604b2eb9b8)

|model|Gop|備考|
|:---:|:---:|:---:|
|Image Recognition|||
|MobileNet |0.6|224x224,<br>17GOPS@30Hz|
|AlexNet |0.7|227x227,<br>22GOPS@30Hz|
|GoogleNet |2|224x224,<br>60GOPS@30Hz|
|ResNet-50 |4|224x224,<br>120GOPS@30Hz|
|VGG19 |20|224x224,<br>600GOPS@30Hz|
|Object Detection |||
|YOLO-v3 |65|416x416,<br>1,950GOPS@30Hz|
|SSD-VGG |91|512x512,<br>2,730GOPS@30Hz|
|Faster-RCNN |172|600x850,<br>5,160GOPS@30Hz|

## 情報3
[文献『From Model to FPGA: Software-Hardware Co-Design for Efficient Neural Network Acceleration』を読む。](https://qiita.com/enoughspacefor/items/7de477dc3c1a50d36f2e)

|model|Gop|備考|
|:---:|:---:|:---:|
|VGG16<br>Image classification|30.68|13 Conv layers|
|YOLO Tiny<br>General object detection |5.54|9 Conv layers|
|Customized Network<br>Face alignment|0.1046 ※1|9 Conv layers|
※1 資料では、104.6 Mop と記載。

## 情報4
[文献『Machine learning for embedded deep dive』を読む](https://qiita.com/enoughspacefor/items/d9c015eddb0d48d5128f)

|model|Gop|備考|
|:---:|:---:|:---:|
|Inception v1|3.2||
|Tiny Yolov3|5.6||
|Tiny Yolov2|7||
|ResNet50|7.7||
|VGG16|30||
|Yolov2|36||
|Yolov3|65||
|SSD|117||

## 情報5
以下などに沢山情報があります。

https://github.com/opencv/open_model_zoo/blob/master/models/public/index.md

#まとめ
特に、なし。

#今後
まだ、単に、情報を集めているレベルです。
コメントなどあれば、お願いします。:candy:

#関連(本人)
[文献『AN ANALYSIS OF DEEP NEURAL NETWORK MODELS FOR PRACTICAL APPLICATIONS』を読む。](https://qiita.com/enoughspacefor/items/ea5a3225c6c54c469326)

[資料『JETSON AGX XAVIER AND THE NEW ERA OF AUTONOMOUS MACHINE』を読む](https://qiita.com/enoughspacefor/items/fa825bf907604b2eb9b8)

[文献『From Model to FPGA: Software-Hardware Co-Design for Efficient Neural Network Acceleration』を読む。](https://qiita.com/enoughspacefor/items/7de477dc3c1a50d36f2e)

[文献『Machine learning for embedded deep dive』を読む](https://qiita.com/enoughspacefor/items/d9c015eddb0d48d5128f)
Linux Mint にROSをインストール



#1.Linux Mintのバージョンの確認
・Terminalを開き以下のコマンドを実行

```
$ cat /etc/issue
```

すると、Linux Mint 19.1を使用している場合は


```
Linux Mint 19.1 Tessa \n \l
```

このような結果が得られる。



#2.ROSのインストール

[ROS Melodicインストールサイト](http://wiki.ros.org/melodic/Installation/Ubuntu)へ行くと、

![Screenshot from 2019-05-19 12-42-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/d00b7273-e0c4-8804-7548-44560007405a.png)


このようなページが表示される。
###1.1 Configure your Ubuntu repositories
基本的にこのステップはデフォルトの設定で満たされているはずなので、飛ばして大丈夫。

###1.2 Setup your sources.list
このステップではPCがpackage.ros.orgからのソフトウェアを受け付けるように、sources.listを編集する。

```
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

**Linux Mintではなく、Ubuntuをつかっている場合はこのまま次のステップへ進むことができるが、Linux Mintの場合は/etc/apt/sources.list.d/ros-latest.list へ書き込まれた情報の一部を訂正する必要がある。**

1. 好きなテキストエディタで　/etc/apt/sources.list.d/ros-latest.listをひらく
(例)

```
$ sudo emacs /etc/apt/sources.list.d/ros-latest.list
```
2. そうすると、

```
deb http://packages.ros.org/ros/ubuntu tessa main
```
という文が現れる。ここで、**ubuntu Tessa**となっているが、TessaはUbuntuのバージョン名ではなく**Linux Mint**のバージョン名なので、以下の写真
を参考に**Tessa**から**Bionic**に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/5fc10419-7572-87a2-f342-b175a20e7c76.png)

＊画像にある以前のバージョンを使用している場合は[ここ](https://en.wikipedia.org/wiki/Linux_Mint_version_history)を参照。


3.このように変更が完了したら保存する。

```
deb http://packages.ros.org/ros/ubuntu bionic main
```

###1.3 Set up your keys
以下のコマンドをコピーして、Terminalへ貼り付け、実行する。

```
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
```

###1.4 Installation
1.まず、Debian package indexを最新状態にする。

```
$ sudo apt update
```
2.ROSのインストール
ROSにはたくさんのライブラリやツールが含まれており、必要に応じてインストールするものを選ぶことができる。
・**Desktop-full install**
これはROS,rqt,rviz,robot-genetic libraries,2D/3D simulatorsと2D/3D perceptionというROSをGUI環境で使う上で基本的なソフトウェアをインストールしてくれる。

```
sudo apt install ros-melodic-desktop-full
```

・**Desktop install**
これはROS,rqt,rviz,robot-genetic librariesを含むソフトウェアをインストールしてくれる。

```
sudo apt install ros-melodic-desktop
```


・**ROS-Base install**
これはROS package, buildそしてcommunication librariesインストールしてくれる。GUIツールは含まれない。

```
sudo apt install ros-melodic-ros-base
```

・**Individual package install**
ROSの特定のパッケージをインストールしたい場合は、

```
sudo apt install ros-melodic-PACKAGENAME
```
**ros-melodic-** + **パッケージ名**でインストールすることができる。

#3. まとめ
以上でROSのインストールはおわりです。
重要な点としてはインストール手順1.2で/etc/apt/sources.list.d/ros-latest.listの内容を書き換えたところです。ここさえできれば、インストールは問題なくできると思います。
また、基本的に他バージョンのROS(kineticとか)も同じ手順でインストールすることができます。
VBSからPowerShellへ　(3)反復処理

VBSで書かれたプログラムをPowerShellに置き換える場合、反復処理については以下のようになる。

```
'VBSでループ

'forによるループ
for c = 1 to 5
　・・・
　（処理）
　・・・
Next

'whileによるループ(1)
dim i
i =0
do while i < 6
　・・・
　（処理）
　・・・

　i = i + 1
loop


'whileによるループ(2)
dim j
j =0
do
　・・・
　（処理）
　・・・

　j = j + 1
loop While j < 7
```

```
#PowerShellでループ

#forによるループ
for($c=1; $c -le 5; $c++) {
　・・・
　（処理）
　・・・
}

#whileによるループ(1)
$i = 0
while ($i -lt 6) {
　・・・
　（処理）
　・・・

　$i++;
}

#whileによるループ(2)
$j = 0
do {
　・・・
　（処理）
　・・・

　$j++;
} while ($j -lt 7)

```


・参考にさせていただいたページ
【PowerShell】繰り返し文(While, For)について 
[https://soma-engineering.com/coding/powershell/loop-while-for/2018/06/09/]
メニューちゃんねる（仮）の会議メモ


# サイト名候補
- メニューちゃんねる
    - ちゃんねる は 2ちゃんやガルちゃんのように略しやすいし、書き込む（参加する）場所としての認識をしてもらえそう。
    - ひらがな　＋　カタカナ　というのも見やすくてよい。
- ちぇーんメニュー
    - チェーン要素を入れるなら。
    - 鎖メニューとかにしてもいいが、鎖＝腐りを連想させる上に、意味が伝わりにくい。
- おすすメニュー
    - オススメのメニューがわかるというサイトの利便性を押し出すのはこれ。
- レコメニュー
    - レコメンドからとった
- メニューナビ
    - ナビゲーションからとった

# 技術的な問題について
サーバーはロリポップサーバー（契約中）
ドメインはムームードメイン
WPを使うか使わないか
言語はPHPでいいか
MYSQLとの接続は問題ないか

# メニューの取得情報について
Debian 10 で Brother DCP-J552N を使って印刷

Debian 10 (x86_64) で Brother DCP-J552N というプリンタを使って印刷できるようにしました。

プリンタを USB で PC に接続すると、自動的に DCP-J552N が CUPS に登録されますが、ドライバが汎用ドライバになってしますため、CUPS の管理画面で削除します。

Brother の Web サイトから、LPR プリンタードライバーと、CUPSwrapper プリンタードライバー (deb package)をダウンロードします。

http://support.brother.co.jp/j/b/downloadtop.aspx?c=jp&lang=ja&prod=dcpj552n

i386 のパッケージなので i386 のパッケージをインストール可能にして、 libc6 もインストールします。

~~~
$ sudo dpkg --add-architecture i386
$ sudo apt update
$ sudo apt install libc6:i386
~~~

lpd はインストールしていないのですが、lpd 用のスプールディレクトリが必要なようなので、作成します。

~~~
sudo mkdir /var/spool/lpd
~~~

パッケージをインストールします。

~~~
$ sudo apt install ./dcpj552ncupswrapper-3.0.0-1.i386.deb ./dcpj552nlpr-3.0.0-1.i386.deb
~~~

パッケージをインストールすると、自動的に、DCPJ552N というプリンタが CUPS に登録されます。

プリンタをPCに接続して、しばらく待つと、印刷可能になります。
一般ユーザで anacron を使って、毎日実行する JOB を作成


Debian 10で動作確認をしています。

まず、ディレクトリを作ります。

~~~
$ midir .anacron
$ mkdir .anacron/spool
$ mkdir .anacron/cron.daily
~~~

.anacron/anacrontab を作成します。次のような内容にします。

~~~
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
RANDOM_DELAY=5
MAILTO=user1
HOME=/home/user1

1 5 cron.daily nice run-parts ${HOME}/.anacron/cron.daily
~~~

crontab -eを実行して、次の行を追加します。

~~~
*/10 * * * * /usr/sbin/anacron -t ${HOME}/.anacron/anacrontab -S ${HOME}/.anacron/spool
~~~

anacron/cron.daily にスクリプトを置くと、毎日、1回実行されます。

ファイルのバックアップに使えます。
PHPで競技プログラミングをしてみる(ABC067 C - Splitting Pile)



競技プログラミングの問題をPHPで解いてみたときにわかったことを整理した。

普段、競プロはc++11で解いているが、業務でPHPを使うため、PHPの勉強がてらAtCoderの問題をPHPで解いてみた。
競技プログラミングでPHPを利用している人が少ないので、この記事を期にPHP競プロerが増えたら幸いである。(ちなみに、ICPCではPHPを利用できないので注意が必要である)


[ABC067 C - Splitting Pile](https://atcoder.jp/contests/abc067/tasks/arc078_a) を試しに解いてみた。
実行環境は、PHP7 (7.0.15)
まず、acceptされたコードを。


```php:SplittingPile.php
<?php 
$N = intval(trim(fgets(STDIN)));
$tmp = trim(fgets(STDIN));
$a = array_map("intval", explode(" ", $tmp));

$l = 0;
$left = [];
$left[0] = 0;
foreach($a as $value){
    $l += $value;
    array_push($left, $l);
}

$r = 0;
$right = [];
$right[0] = 0;
$r_a = array_reverse($a);
foreach($r_a as $value){
    $r += $value;
    array_push($right, $r);
}
$right = array_reverse($right);

$ans = abs($right[1] - $left[1]);
for($i = 2;$i<count($right)-1;$i++){
    if($ans > abs($right[$i] - $left[$i])){
        $ans = abs($right[$i] - $left[$i]);
    }
}

echo $ans . PHP_EOL;
```


コードの解説を。


目的は、O(N^2)にならずに、左からi番目(1<=i<=N-1)のまで総和から、右からN-i番目までの総和を引いた差の最小値を求めるというもの。
累積和を使えば良さそう。



まず、標準入力で躓いた。

入力した文字列をsplit(explode)したものを配列化して、$aに格納しようとしたところ、splitしたままでは、数字が文字列として扱われてしまうから、すべて整数化しなければならなく、array_mapという関数を用いて、入力値をすべて整数化した。

このように、型指定がないため入力した文字列を整数化する必要がある。


次に、左からの累積和と右からの累積和をとった。これだと、実行時間がO(N)で間に合う。

最後に、right-leftの絶対値が、ansよりも小さいなら、ansにその絶対値を代入、みたいなことを繰り返せば、ansが求まる。

入力以外は、他の言語とやっていることが余り変わらなかった。
是非PHPで競技プログラミングを試していただきたい。
愛するPhpStromでCodeigniterをいじいじするとき、 autoloadしたmodelやlibraryをオートコンプリートする方法

phpstorm愛してる！！！！！

というわけで、CodeigniterをPhpstormをコーディングしているときに、get_instanceしたciがオートコンプリートできない問題でうぐうぎしておりました。


``` php
	public
	function __construct(){
		$this->ci =& get_instance();
		$this->ci->model_config->set_config('gm_access', 'hogehoge');
	}

````

こういう奴。

最新のphpstormだと、ある程度はオートコンプリートで追いかけてくれるのだけれど、事前にロードしたモデルとかはオートコンプリートしてくれない。悲しい。

そこで、Ci_controllerを継承したMy_controllerをつくって、そこでmodelを定義しつつ、$ciにMy_controllerを紐付けると、オートコンプリートしてくれます。

``` core/MY_Controller.php 
/**
 * Class App
 * @property Model_config model_config
/***
class MY_Controller extends CI_Controller{
	function __construct(){
		parent::__construct();
````

```` php
	/**
	 * @var $ci MY_Controller
	 **/
	private $ci;
````

これでオートコンプリートできます！！　やったー！！
一般ノートPCでSolidWorksを動かすには（とても初歩的）

身内によく聞かれるので記事にしました。最終的には自己責任でよろしくね。
まぁ学校でSolidWorksを使うのって、高専と大学ぐらいなのでは？（知らんけど）

##一般PCでもSolidWorksとイチャコラしたい人へ

#####本記事が対象とする人
・ノートパソコンは家電量販店で買うって人
・学校などでSolidWorksを使うことになった人

の中でもうちょっと詳しく知りたくなった人

#####対象にしてない人
・QuadroかFireProってワードを聞いてピクってする人
・Macの人（すまんがWindowsをBootCampしてくれ）
・業務でSolidWorksを使う本業の方（業務ならWS買ってください）


###一般PCの定義
　家電量販店で店員さんが、「これ性能いいですよ！」「パソコンをよく使うならオススメです！」って言ってくるパソコンのことです。さらに言うと8の字マークがエレガントなF社とか〼っぽいマークが強そうなN社のパソコンのことです。

#####もうちょっと詳しくいうと
　とは言え上記の項目だけではどのくらいのPC性能か断言できません。もうちょっと詳しく見ていきましょう。
量販店でPCのパームレスト（キーボードタイプするときに手のひらを置くとこ）にラベルが貼ってあります。
![intel i7 8th.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319453/6359fcdd-14e8-7233-9526-11b82a401e5c.jpeg)
このラベルです。
これはPCの脳みそ（＝CPUっていう）の性能を示したラベルです。Core i7と書いてありますね。これがCPUのグレードを表していて、一般的なノートPCだとCore i7が最上位のグレードになります。その下にCore i5 ,Core i3と続きます。SolidWorksとイチャコラしたいならCore i7かCore i5を選ぶことをお勧めします。脳みその性能は大事、いいね。
![intel inside.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319453/d1a490f7-687e-76db-c062-b08ac39524fb.jpeg)
ちなみにこのラベルのPCはやめときましょう。Core i3よりさらに格下のCPUちゃんのラベルです。

###SolidWorks社の推奨

https://www.solidworks.co.jp/sw/support/SystemRequirements.html

こちらのリンクがSolidWorks社が示しているSolidWorks推奨スペックです。
すげぇ要約すると以下のようになります。

・Windows10を使おうね
・CPUはCore i5以上のやつにしとこうね
・メモリは16GBくらいほしい
・Graphics Cardは認定したやつを使ってね
・SSD推奨だお
・PCの空き容量が20GBくらいほしい
・MicrosoftのOfficeもほしい

といった具合になります。

このスペックのPCを家電量販店で探しても見つからないです。確実にGraphics Cardの項目ではねられます。
SolidWorks社推奨のGraphics CardはNVIDIA社のQuadroとAMD社のFireProっていう製品が主なのですが、これが一般向けのPCに載ってないです。（一般ユーザーにはまぁまず必要ないからです）
あと、メモリ16GBのノートPCもあんまり置いてないです。

###じゃあどうすんのさ
推奨Graphics Cardは無くてもSolidWorksは一応動作します。
メモリも16GBなくても一応動きます。ただ8GB以上は欲しいです。4GBじゃ確実に厳しいです。
以前SolidWorksを使ってるいろんな学生のPCを見る機会がありましたが、SolidWorks社の推奨要求満たしてるPC持ってる人は片手で数えるくらいしか見たことないです。
200パーツ以下くらいの小規模のアセンブリなら性能の良い一般ノートPCで十分SolidWorksとイチャつけます。
もちろん、1パーツ毎の複雑さにも関連するのであくまで感覚です。


###メモリについての補足
SolidWorksは毎年多くの機能の追加があり、年々便利になっていきますが同時に要求スペックもじわじわ上がっています。（時代は進歩してるんで当然といえば当然）
そのため、SolidWorksのバージョンによっても要求されるスペックは変わってきますが、SolidWorks2018についていえばメモリは最低でも8GBは必要です。
Windows10は起動しただけでメモリ3GBくらいを必要とします。環境にもよりますがだいたいそのくらいです。メモリ4GBだと残りの1GB分でSolidWorksを動かすことになるので、非常に厳しいことになります。



###要約するとこう
・intel i7 のCPU
・8GB以上のメモリ
・256GB以上のSSD
が載ってるノートPCを買っときなさい。
だいたい、10～15諭吉くらいのお値段になると思います。
どうせSolidWorks以外でも使うんだから悪い投資じゃないでしょう？

さぁみんなPC買って、SolidWorksとイチャつくんだ。

一応、本職のCADマンとかが使ってそうなノートPCもリンクにしときます。が、とても高いよ。
[Lenovo ThinkPad P72](https://www.lenovo.com/jp/ja/think-workstations/oil-gas-and-energy-industry/ThinkPad-P72/p/22WS2WPWP72)
[Dell Precision 7730](https://www.dell.com/ja-jp/work/shop/%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB-%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/precision-7730/spd/precision-17-7730-laptop)
[HP ZBook 17 G5 Mobile Workstation](http://jp.ext.hp.com/workstations/zbook17g5/)
資料『JETSON AGX XAVIER AND THE NEW ERA OF AUTONOMOUS MACHINE』を読む

#目的
資料『JETSON AGX XAVIER AND THE NEW ERA OF AUTONOMOUS MACHINE』を読む。
資料は、以下です。
http://info.nvidia.com/rs/156-OFN-742/images/Jetson_AGX_Xavier_New_Era_Autonomous_Machines.pdf

この記事記載の最初の目的は、上記の資料には、DNNのモデル毎の処理量(GOPS)が記載されているので、その量を参照することです。

:memo:
GOP(Giga Operations)
GOPS(Giga Operations per Second)

#DNNのモデル毎の処理量(GOP)

引用ページ：VISION NETWORKS Compute Demand

|model|Gop|備考|
|:---:|:---:|:---:|
|Image Recognition|||
|MobileNet |0.6|224x224,<br>17GOPS@30Hz|
|AlexNet |0.7|227x227,<br>22GOPS@30Hz|
|GoogleNet |2|224x224,<br>60GOPS@30Hz|
|ResNet-50 |4|224x224,<br>120GOPS@30Hz|
|VGG19 |20|224x224,<br>600GOPS@30Hz|
|Object Detection |||
|YOLO-v3 |65|416x416,<br>1,950GOPS@30Hz|
|SSD-VGG |91|512x512,<br>2,730GOPS@30Hz|
|Faster-RCNN |172|600x850,<br>5,160GOPS@30Hz|

# performance

(図　出典: http://info.nvidia.com/rs/156-OFN-742/images/Jetson_AGX_Xavier_New_Era_Autonomous_Machines.pdf )
<img width="583" alt="resnet-50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/59ad831c-927e-020a-9eed-84e5139cd09a.png">


(図　出典: http://info.nvidia.com/rs/156-OFN-742/images/Jetson_AGX_Xavier_New_Era_Autonomous_Machines.pdf )



<img width="671" alt="vgg19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/30815821-3cb3-a31b-037b-d483d05f2723.png">



(図　出典: http://info.nvidia.com/rs/156-OFN-
742/images/Jetson_AGX_Xavier_New_Era_Autonomous_Machines.pdf )



<img width="587" alt="resnet50-watt.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/d95dbb8c-06b1-bd7d-9ff5-10eb0c8fa744.png">



(図　出典: http://info.nvidia.com/rs/156-OFN-742/images/Jetson_AGX_Xavier_New_Era_Autonomous_Machines.pdf )


<img width="670" alt="vgg19_watt.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/211e1ed7-2f14-ce5e-0954-d4d23bbc7d83.png">

#性能限界値との比較
## TX2 ResNet-50
グラフより、目分量で、32batchの場合、110images と読んだ。
1 image で　4 G-op なので、1秒 440 G-op となる。
TX2の場合、半精度ならば、1.333　TOPSなので、性能限界の1/3出ていることになる。
単精度ならば、もっと、出ていることになる。どっちなんだろう:question:

#まとめ
DNNのモデル毎の処理量(GOPS)を整理する一環として、NVIDIAの資料を確認した。

#今後
適宜、追記する。
コメントなどあれば、お願いします。:candy:

#関連（本人）
[DNNのモデル毎の処理量(GOP)をまとめる](https://qiita.com/enoughspacefor/items/83a9eac69f6209daf424)
図で理解！”学習”の基盤：ニューラルネットワークの”逆伝搬”と”更新”

#ネットワークの逆伝搬とは？
これまでの記事では、
・ニューラルネットワークとは何者で、どんな処理をしているのか（[図で理解！ニューラルネットワークとは？](https://qiita.com/NagisaOniki/items/a5ba48af2c42a5fd3439)）
・各ネットワーク層での処理を一部紹介しました。
Affine層：[図で理解！ニューラルネットワークとは？](https://qiita.com/NagisaOniki/items/a5ba48af2c42a5fd3439)
Convolution層：[図で理解！畳み込み処理？Convolution層？畳み込みニューラルネットワーク（CNN）の基礎](https://qiita.com/NagisaOniki/items/e073a56ea14e56d90a6c)


しかし、”入力になんらかの計算処理を加えて出力を得る”だけでは何の意味もありません。

重要なのは”逆伝搬”です！！！（以下図）

![逆伝搬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/3627c427-9340-f0e5-c701-275e2fe6d00d.png)

↓↓↓↓↓もっと詳しく↓↓↓↓↓

![Affine計算グラフ逆伝搬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/e1b7a925-6d08-1227-e024-43314da3d137.png)


勘がいい方はもう分かりました？

”誤差を小さくするように各ネットワーク層のパラメーターをそれぞれ更新”を”繰り返す”　＝　”学習”

です。

###パラメーターとは？
・Affine層で言うW（重み）とb（バイアス）
・Convolution層で言うK（カーネル）

つまり、”入力に対して掛けたり足したりする値”のことです。

###ハイパーパラメーター　（←重要）
パラメーターを適当に変えるわけではありません。
Wをどれだけどう変更するか、の調整をしてくれるのが”ハイパーパラメーター”です。

ハイパーパラメーターを使ってパラメーターを更新することを総称して
”ネットワークの更新”や”パラメーターの更新”と言います。

この更新方法は複数あるので、別途記事にします。
＜更新方法の種類＞
・SGD
・Momentum
・AdaGrad
・Adam  
（[ゼロから作るDeepLearning](https://www.oreilly.co.jp/books/9784873117584/)　にも載っています。）

が、イメージを付けてもらうためにコードを乗せておきます。

```
//SGDでAffine層のWを更新
var ep = 0.001 //学習率　//（余談）任意の値だが、大体0.1,0.01,0.001辺りが多い
W = W - dW * ep //パラメーターWを更新　//dW:以下に説明 
```

ep と言うのがハイパーパラメーターの一種で”学習率（epsilon）”と呼ばれるものです。

”一種”と言いましたが、
更新方法によって、それぞれで使用するだけのハイパーパラメーターが存在します。

#逆伝搬の計算
上のコードのコメントアウトにしれっと”dW”と書きましたが、
逆伝搬の計算方法をAffine層の処理を例に記載します。

![Affine計算グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/fccbab31-c778-add3-bdac-ba6376d8cce4.png)

![Affine計算グラフ逆伝搬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/eafeacbb-ef2e-cbef-2769-74cdbe4fcebe.png)


#まとめ：学習の基盤：ニューラルネットワークの”逆伝搬”と”更新”
要は、入力を渡し、得た結果と期待する出力との”差異”を逆伝搬するだけなんですが、
それだけでは値が行ったり来たりしているです。

誤差をなるべく小さくできるようにパラメーターを更新してあげることで、
”計算結果の出力を、本来期待する出力に近づけよう”という訳で、
これが”学習の概念”です。

長々とありがとうございました。
mb_send_mail()で文字化けしてしまう時の対処法

# mb_send_mail()で文字化けが発生
Webページ制作でお問い合わせフォームを作成した際に、PHPの`mb_send_mail()`を使ってメール送信を実装した。
しかし、受信したメールを確認すると以下のキャプチャのように文字化けをしていた。

<img width="848" alt="スクリーンショット 2019-05-19 12.55.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/94309a2d-0167-6576-ef46-446c77e235cb.png">

phpへはajaxでフォームデータを送信していて、その部分については問題がなかった。
php側でのcharset周りで問題があると考え、ひたすらwebで調べる→試すを行った。


# ヘッダに Content-Type などを設定する必要があった

下の記述で文字化けは解決する的な記事が多く試したが、改善しなかった。  

```php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
```

試行錯誤重ねるうちに、ヘッダにContent-Typeなどを設定して、`mb_send_mail()`の引数としてオプションパラメタにヘッダの情報を渡すと文字化けが解決した。

```php
// ヘッダ情報設定
$headers = "MIME-Version: 1.0\r\n"
         . "Content-Transfer-Encoding: 7bit\r\n"
         . "Content-Type: text/plain; charset=ISO-2022-JP\r\n";

// メール送信
mb_send_mail( 'to', 'subject', 'body', $headers );
```

<img width="846" alt="スクリーンショット 2019-05-19 12.44.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/9d3ea7e7-3772-92aa-de26-c4107fd129d2.png">



## メールが文字化け  
追記：メール送信/受信はできたが、受信したメールが文字化けしていることがあった。
下記の参考記事でもあるが、ヘッダで文字コード設定などして安心して`mb_language("Japanese");`や`mb_internal_encoding("UTF-8");`の記述を消してしまった。  
  
すると、サーバによって文字化けする場合が出てきた。
<img width="363" alt="スクリーンショット 2019-05-31 22.25.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/b6c0966b-e9db-8df4-5370-6392cd922d8f.png">


以下を再度記述することで解決できた。

```php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
```

>参考：[UTF-8で文字化け](https://qiita.com/Hitomix_k/items/5574cca4c9f05fb300ec)


## php勉強しようかな
phpの経験がなく調べながら見よう見まねで実装していたが、基本的な書き方くらいはドットインストールで勉強しておこうと思う。

Laravelも人気のようだし、php案件はリモート可も多いと聞いたので、学習する価値はありそう。
KerasでOne-Hotエンコーディングする方法

備忘目的で書いています。
参考にしたのは=> https://github.com/fchollet/deep-learning-with-python-notebooks

1) サンプルデータをインポート
   ここではMNISTをKerasからインポートします。

```python3
from keras.datasets import mnist

(train_images, train_labels) , (test_images, test_labels) = mnist.load_data()

# >print(train_labels[:3])
# [5 0 4]
```


2) One-hotエンコーディング
   kerasに実装されたto_categoricalを使います。
   [0 ~ 9]の10個の数字が存在するのでone-hot結果の次元数が10になっています。

```python3

from keras.utils import to_categorical
train_labels_onehot = to_categorical(train_labels)

#> print(train_labels_onehot[:3])
# [[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
#  [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
#  [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]
```
Otto Group Product Classification Challenge メモ

# Ottoとは
ドイツに本社。通販会社。

- wikipedia
https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%83%E3%83%88%E3%83%BC_(%E4%BC%81%E6%A5%AD)

- Otto japan
http://www.service-ottojapan.com/company/

# 問題の種類 
商品のクラス分けを正しく行う。
クラス分類問題

# 提出形式
どのクラスに所属するかを確率で予測する。
- クラス１ 0.5
- クラス2　0
- クラス3　0.4
- クラス4  0.1

# 評価
Log Lossが使用されている。
Log Lossとはクロスエントロピー。
Deeplearningなどのクラス分類アルゴリズムの評価に使われているらしい。（正解ラベルの確率をどのような確率で予想したかを評価。）

- Log Lossの参考記事
http://wiki.fast.ai/index.php/Log_Loss

- クロスエントロピーの参考記事
http://www.zeroprog.com/2017/06/11/9-deep-learning-%E6%90%8D%E5%A4%B1%E9%96%A2%E6%95%B0-%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%E8%AA%A4%E5%B7%AE/

# kernelで使用されているアルゴリズム

分類系のアルゴリズムが使用されている。
- xgboost
- newral network
- GBM
- Random Forest
- knn

# 参考になりそうなkernel(python)
- beginner
https://www.kaggle.com/pratik2901/otto-product
- 日本語のkernel
https://www.kaggle.com/kernels/scriptcontent/6919936/download



# 他
- keggleのページにベンチマーク用のスクリプトがあったようだが、現在は削除されている。

- kaggle初心者ガイド
https://kaggler-ja-wiki.herokuapp.com/kaggle%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89