OmniAICreator/Qiita-1.07M huggingface dataset:
PyPDF2を調べた


# PyPDF2を調べた
- PDFを連結したしたいと思い調べてみた。
- 検索するとPyPDF2がでてきた。
- 2023．02.15日現在、バージョンが3.0.1になっていた。
- バージョンアップにより、クラス名、関数、メソッド等の名前の変更があった。以下の内容はクラス名などが古い記述となっている。

## インストール
- インストールは以下のように行った。
-  ```pip install pypdf2```

# インポート
```python
import PyPDF2
```

# PDFの連結
## まずは連結するpdfファイルをリストにする
- 以下ではglobでpdfファイルを検索している

```python
# PDFファイルを検索
# globで検索
import glob
pdffiles=glob.glob('*.pdf')
```
## ファイル連結
```python
merger=PyPDF2.PdfFileMerger()

for f in pdffiles:
    merger.append(f)

merger.write('merge.pdf') #連結したファイルを出力
merger.close()
```

# PDFの分割
## 分割元を読み込み


```python
source_pdf = open('merge.pdf', 'rb')
source = PyPDF2.PdfFileReader(source_pdf, strict=False)
```

## 分割元からページを指定して，出力先に追加する。


```python
output = PyPDF2.PdfFileWriter()
output.addPage(source.getPage(0))
output.addPage(source.getPage(1))
```

## ファイル出力


```python
output_pdf = open('output_pdf.pdf', 'wb')
output.write(output_pdf)
output_pdf.close()
```
【変更後】Oracle Master Silver 12c 黒本対応表

Silver 12c の参考書は未だに黒本しかないが、試験範囲が変わったので一応対応表を作りました。

これで無駄なところは飛ばしましょう。

※ 2017年11月時点のメモです

# Oracle 試験内容メモ

* Oracle Databaseのアーキテクチャの確認
  * Oracle Databaseのアーキテクチャ・コンポーネントを列挙する
  * メモリー構造について説明する
  * バックグラウンド・プロセスについて説明する
* Oracle Databaseの管理ツール
データベース管理ツールを使用する
* Oracle Databaseインスタンス
  * 初期化パラメータ・ファイルについて理解する
  * Oracleデータベース・インスタンスを起動および停止する
  * アラート・ログを表示する。動的パフォーマンス・ビューにアクセスする
* Oracleネットワーク環境の設定
  * Oracle Net Servicesを設定する
  * Oracleネットワークを設定および管理するためのツールを使用する
  * クライアント側ネットワークを設定する
  * データベース間の通信を設定する
* データベース記憶域構造の管理
  * 表の行データをブロックに格納する方法について説明する
  * 表領域を作成および管理する
* ユーザー・セキュリティの管理
  * データベース・ユーザー・アカウントを作成および管理する
  * 権限の付与と取消しを行う
  * ロールを作成および管理する
  * プロファイルを作成および管理する
* 領域の管理
  * Oracleデータベース・サーバーが自動的に領域を管理する方法について説明する
  * 圧縮を使用して領域を節約する
  * セグメント・アドバイザを使用する
  * セグメント縮小機能を使用して表と索引で浪費されている領域を再利用する
* UNDOデータの管理
  * DMLおよびUNDOデータの生成について説明する
  * UNDOデータを監視および管理する
  * UNDOデータとREDOデータの違いについて説明する
  * UNDO保存を設定する
* データの並行性の管理
  * ロック・メカニズムとOracleによるデータ並行性の管理方法について説明する
  * ロック競合を監視および解消する
* Oracle Database監査の実装
  * 標準的なデータベース監査と統合監査を有効にする
* バックアップとリカバリの概念
  * チェックポイント、REDOログ・ファイルおよびアーカイブ・ログ・ファイルの重要性について説明する
* バックアップとリカバリの設定
  * 高速リカバリ領域を設定する
  * ARCHIVELOGモードを設定する
* データベースのバックアップの実行
  * 一貫性のあるデータベースのバックアップを作成する
  * データベースを停止せずにデータベースをバックアップする
  * 増分バックアップを作成する
  * データベースのバックアップを自動化する
  * バックアップを管理する
* データベースのリカバリの実行
  * リカバリを実行する必要があるかどうかを判断する
  * Recovery Manager（RMAN）とデータ・リカバリ・アドバイザを使用して制御ファイル、REDOログ・ファイルおよびデータ・ファイルのリカバリを実行する
* データの移動
  * データの移動方法について説明する
  * SQL*Loaderを使用して非Oracleデータベースからデータをロードする
  * 外部表を使用して、プラットフォームに依存しないファイルによるデータの移動を行う　　
  * Oracle Data Pumpの一般的なアーキテクチャについて説明する
  * Data Pumpのエクスポートとインポートを使用してOracleデータベース間でデータを移動する
* データベースのメンテナンスの実行
  * サーバーが生成したアラートを使用する
* パフォーマンスの管理: SQLチューニング
  * SQLチューニング・アドバイザを使用する
* Oracle Schedulerの使用によるタスクの自動化
  * Oracle Schedulerを使用して管理タスクを簡素化する
  * ジョブ・チェーンを使用して一連の関連タスクを実行する
  * リモート・システムでスケジューラ・ジョブを使用する
  * スケジューラの高度な機能を使用してジョブの優先度を指定する
* DBCAの使用によるOracle Databaseの作成
  * DBCAを使用してデータベース作成スクリプトを生成する
  * DBCAを使用してデータベース設計テンプレートを管理する
* Oracle Databaseソフトウェアのアップグレード
  * データ移行方法について説明する
  * アップグレード・プロセスについて説明する
* DBAASの概要
  * DBaaSインスタンスを理解する
  * マイ・サービス・ダッシュボードからのナビゲート
  * ユーザー認証とロール
  * 接続プロトコルとポート



# 対応表テーブル版

| 試験範囲 | 黒本対応箇所 |
|------|----------|
|Oracle Databaseのアーキテクチャの確認|1章(1-3除く)|
|Oracle Databaseの管理ツール|2章|
|Oracle Databaseインスタンス|3章|
|Oracleネットワーク環境の設定|4章|
|データベース記憶域構造の管理|6章|
|ユーザー・セキュリティの管理|5章|
|領域の管理|7章|
|UNDOデータの管理|8章|
|データの並行性の管理|9章|
|Oracle Database監査の実装|10章|
|バックアップとリカバリの概念|11章(11-1のみ)|
|バックアップとリカバリの設定|11章(11-2のみ)|
|データベースのバックアップの実行|11章(11-3のみ)|
|データベースのリカバリの実行|11章(11-4のみ)|
|データの移動|12章|
|データベースのメンテナンスの実行|13章|
|パフォーマンスの管理: SQLチューニング|14章(主に14-3)|
|Oracle Schedulerの使用によるタスクの自動化|16章|
|DBCAの使用によるOracle Databaseの作成|18章|
|Oracle Databaseソフトウェアのアップグレード|20章|
|DBAASの概要|無し|
デバイスドライバとは

## デバイスドライバとは
周辺機器(デバイス)をOSによって制御するためのプログラム。

## メリット
デバイスドライバのおかげで、OSがあらかじめデバイスに対応する必要がなくなる。

## プラグアンドプレイ
マウス、キーボード、USB、プリンタなど、OS側にあらかじめデバイスドライバが用意されており、デバイスを接続することで自動的にドライバがインストールされるもの。

※ OS側ですべてのデバイスドライバを用意するのは不可能のため、ハードウェア製品には、それぞれのOSに対応したドライバが付属している。
EDINETのXBRL用のPythonライブラリを作った - ダウンロード編

## 1. はじめに
### [前回](https://qiita.com/shoe116/items/dd362ad880f2b6baa96f)の話
前回のエントリ『[EDINETのXBRL用のPythonライブラリを作った - Parser編](https://qiita.com/shoe116/items/dd362ad880f2b6baa96f)』では、「そもそもEDINETとかXBRLって何なのか」と、XBRLのファイルをparseしてPythonのオブジェクト化し、財務数値をいい感じに取得する方法について述べた。

**下記の方法でのxbrl取得は、[有報キャッチャー ウェブサービス AtomAPI](http://resource.ufocatch.com/) サービス終了に伴い、実行不可能となりました。**

### 今回
今回は、[有報キャッチャー ウェブサービス AtomAPI](http://resource.ufocatch.com/)という、EDINET（TDNETも）のデータに便利にアクセスできるREST APIを利用して、特定銘柄のXBRLをダウンロードする方法を紹介する[^1]。

## 2. EDINETのXBRLをPythonでダウンロードする
0.2.0以降の[edinet-xbrl](https://pypi.python.org/pypi/edinet-xbrl)は、ダウンロード用のモジュールも備えている。

```bash
$ pip install edinet-xbrl
```

でinstall後、こんな感じでダウンローダーに取得したい銘柄コード（ticker）文字列を渡せば、指定されたディレクトリにEDINETに存在するXBRLファイルがダウンロードできる。

```py3
from edinet_xbrl.edinet_xbrl_downloader import EdinetXbrlDownloader

## init downloader
xbrl_downloader = EdinetXbrlDownloader()

## set a ticker you want to download xbrl file
ticker = "1234"
target_dir = "a target directory path"
xbrl_downloader.download_by_ticker(ticker, target_dir)
```
[中身](https://github.com/BuffetCode/edinet_xbrl)を見れば一目瞭然だが、有報キャッチャーのAPIをラップしただけである（ありがたやありがたや）。

## 最後に
これを使って大量のXBRLと格闘して[バフェット・コード](http://www.buffett-code.com/)というウェブサービスを作ってるので、興味があればのぞいてみてください。条件検索（いわゆるスクリーニング）とか、わりと頑張って作ったので、[edinet-xbrl](https://pypi.python.org/pypi/edinet-xbrl)でダウンロードする銘柄を探したりに使ってください。あ、bug報告とかpull requestとかは[GitHub](https://github.com/BuffetCode/edinet_xbrl)にお気軽にどうぞ。ダウンロードしたXBRLは[parser編](https://qiita.com/shoe116/items/dd362ad880f2b6baa96f)を参考にして頂ければ、いい感じにゴニョゴニョできるはず。
ライブラリの使い方がわからない、XBRLについて相談したいことがある等については[Twitter](https://twitter.com/shoe116)からお気軽にご連絡いただければと思います（DMでも大丈夫です）。

## 注釈等
[^1]: XBRLは仕様が決まっているXMLなので必ずしもダウンロードする必要はないのだが、parseしてゴニョゴニョするにはやっぱり手元に落として期待のが人情というものだと思う
シェル変数と環境変数

## シェル変数
シェル内でのみ有効

例）シェルから起動したシェルスクリプトでシェル変数を参照することはできない

## 環境変数
シェルから起動したプロセス(子プロセス)にも引き継がれる

子プロセルで定義した変数をシェルに反映させるためには、sourceコマンドを利用する

[シェル変数と環境変数の違いをコマンドラインで確認する](https://qiita.com/kure/items/f76d8242b97280a247a1)
(だいたい)Node-REDでWatsonとジャンケンする

組込み屋さんは組込みだけでは食っていけない、という風潮があるので、別ジャンルに挑戦します。
Node-REDを使って、リアルタイムでWatsonとジャンケンします。
後述の技術不足により、Node-REDだけで完結しませんでした！
リアルタイムと言いながら、かなりの遅延があります。2秒くらい（もっと？）後出しされます。

## 完成品

環境は、ラズパイ＋USBカメラです。

1秒に1回の頻度で、カメラから取り込んだ写真をWatsonで解析にかけ、勝てる手を写真の下に表示しています（いらすとやさんから素材を拝借しました）。

![Rock.PNG](https://qiita-image-store.s3.amazonaws.com/0/204676/fb981623-407e-8074-7457-e863a0482dd6.png)

画像だけだとわかりにくいですが、ギリギリリアルタイム感が出ています。
上の写真更新後、2～3秒程度で、下の勝てる手が更新されます。

学習データがグー、チョキ、パー各20枚ずつしかないため、背景を白くしないと全然精度が出ません。背景が白くても精度はイマイチです…。

## Node-REDのフロー

![node-red.PNG](https://qiita-image-store.s3.amazonaws.com/0/204676/e5cf9637-a696-3ba9-676a-04d4958e7489.png)

ダサいポイントが2つあります！

### 1. カメラ制御がpython scriptだ！

start cameraノードからpython scriptを起動しています。
中身は、opencvでカメラから画像を取り込み、1秒に1枚Node-REDのhttp inノード(camera)にpostします。
（1秒に1枚としているのは、Watson Visual Recognitionの無料枠をすぐ使い果たしてしまうから、というトホホな理由です）
この部分をなんとかNode-REDだけでやりたいところです（ヘルプミー！）。
C言語に直せ、というなら簡単なのだが…。

### 2. ページの静的コンテンツを無理矢理更新している

お気づきでしょうか。下の方に並んだexecノードに。
ここで、解析結果に基づき、ページの静的コンテンツをcpコマンドで置き換えています。
このダサさは↑の比ではありません！
うまくTemplateノードで結果を返せるようにしたいところです。
Websocketで結果を通知してあげれば、何とかなる、という感じのことはわかっているのですが、勉強不足です…。

## 感想

動かすところまで楽しみながらできました。
が、やはりWebフロントエンドの技術不足に悩まされました。
最終的な見た目も最低限、という感じです。
これでは、ユーザーさんも買ってくれなさそうです。

クラウドで解析していることもあり、遅延時間がかなり気になりました。
組込み屋さんとしては、このあたりが食いっぱぐれないための道の1つなんだろうなぁ。

ブラウザで、解析開始も、結果閲覧もできるので、ラズパイ＋テザリング用Androidがあれば、気軽に試せるのは良いです。
普段は、シリアル繋いだり、sshで繋いだりなので。
Mysqlを操作した後にfound unpermitted parametersエラーがおきた場合の対処

##起こったこと
Rails　Webアプリを作成中に、Strong Parameterやコントローラーを変更していないのにfound unpermitted parametersのエラーが発生した。

##ログの確認
-コントローラーに送ったパラメータには問題がない
-ログを見ると、Internal Server Errorという文字があった

##Internal Server Errorについて
こちらのサイトを参考にした。
http://blog.livedoor.jp/kibounoki0715/archives/64839258.html
ユーザーがrootではないため、アクセス権がない事により発生しているとのこと

##やったこと
正直内容は理解できなかったが、rootってMysql関連かなーと考えてみる。
そういえば直前にMysqlの中身みるために少しいじった。その時に変な設定になったのかな
と思い、Mysqlを再起動。

そしたら無事にエラー消えました。
initコマンド動作

|initコマンド|動作|
|---|---|
|init 0 | シャットダウン|
|init 1 | シングルユーザモードへ移行|
|init 2 | ＮＦＳを使用しないマルチユーザモードへ移行|
|init 3 | ＮＦＳを使用するマルチユーザモードへ移行|
|init 6 | シャットダウン後、リブートし、標準のマルチユーザモードへ|
Python製のBotでslackbotとErrbotを使ってみた感想と使い所

Hubotに大変疲れたのでPython製のBotを触ってみていたのですが、Errbotは前回触ったので、Slackbotを触ってみました。
どちらもGitHub Star数は結構な数があって、どちらを使おうか悩んでいたところです。

* [Hubotに疲れた人のPython製bot"Errbot"入門](https://qiita.com/tkit/items/c78188b262c7533467b0)

今後、PythonでBotを作ろうと考えている方の参考になればと思います。

# TL;DR

そもそも比較すること自体がおかしかったです。
以下は、特にどちらに優劣をつけるものではなく、そういう特徴がある、ということで捉えていただければと思います。

* Slackだけに対応するなら機能が豊富なのはslackbot、逆に複数のチャットツールに対応しているのはErrbot
* Slackとしてのチャット機能が充実しているのはslackbot、チャット機能としてではなくチャットツールとして機能が豊富なのはErrbot

# slackbotとErrbotの特徴

## slackbot

https://github.com/lins05/slackbot

### 特徴

* 純粋にSlackのみが目的(名前からしてシンプル)
* Slack用途においてのみであれば機能はかなりある(thread, reaction, upload ...)
* Slackのattachmentsにも対応

### メリット

#### Slack向けの機能は大抵ある

特徴の通りなのですが、純粋にSlack向けに開発されているので、ことSlackだけで使うのであれば申し分ないかと思います。

* thread
* reaction
* upload

ただ、slackbot自体にwebサーバ機能はデフォルトではないので、Webhookは使えません。つまり、Interactive Messagesは実現できません。
結局はPythonなので、書けばもちろん対応できます。

### デメリット

#### チャット以上の機能は大抵作り込む必要がある

Hubotも同じといえば同じなのですが、例えば以下のような場合は自前で仕組みを作る必要があります。

* プラグインのデプロイやアップデートを行う仕組み
* Bot自体の管理(シャットダウンしたり)
* アクセス制御(例えばAさんが管理者で、Aさんだけが特権的な命令を送ることができる、など)
* Webhook(Slackのinteractive Messageで使う)

要はJenkinsやCircleCIみたいなものがいるってことですね。デメリットというか、むしろErrbotがよく出来てるなぁという印象。

#### 未対応の機能があることはある

例えば、Hubotでいう永続化(`robot.brain`相当)機能。
ただ、HubotはRedisでそれを実現しているし、コア機能として持つべきではないとして以下でrejectされています。

https://github.com/lins05/slackbot/issues/80

なので、デメリットというよりツールのポリシーとして持ちませんってことですね。

#### ドキュメントが少なめ

公式のREADMEだけ見てもそこまで情報は充実していないので、ソースコード見たり他の文献を見たりする必要はあるかもしれません。
ただ、そもそもツール自体がシンプルなので、そこまで語るべき内容があるわけでもなく、大抵は「あぁ、作る必要があるんだな」と分かる感じではあります。

#### 名前...

名前が汎用的すぎて検索に引っかかりません。Errbotといい勝負です。なぜこんなことに…。

### 使い所

以下のような人たちに向きそうです。

* そもそもチャットツールはSlackだけ
* 豊富な機能よりもシンプルなものを使いたい、シンプルなものから必要なものだけ組み上げていきたい

## Errbot

http://errbot.io/

### 特徴

* XMPPにも対応している通り、そもそもSlackだけがカバー対象ではなく、主要チャットツールに幅広く対応
* それ故に、チャットツール独自機能をカバーしない(Slackでいうthread,reaction,attachmentsの細かい部分 など)
* チャットツールとしての機能が非常に充実していて、Webhookやプラグイン"管理"機能、Botのリスタートやログ閲覧、Botのアクセス制御など大抵の欲しい情報はある
* 公式ドキュメントも充実している

### メリット

#### プラグイン管理がBotだけでできる

メリットでもありデメリットでもある気もしますが、プラグインをBot自体が管理するため、Botに命令を送ることで特定のプラグインをアップデートしたりできます。
従って、プラグインを更新したからといってBot自体を再起動…みたいなことは不要で、プラグイン更新→Botに取り込み命令だけで済みます。

#### 他にもBot総体としての機能が充実

* 命令のアクセス制御
* Bot自体のリスタートやログ閲覧

などができます。

#### 公式のドキュメントが充実

公式のドキュメントを見れば、大抵のことが書いてあります。

[Plugin development](http://errbot.io/en/latest/user_guide/plugin_development/index.html)

とりあえず一通り読んでみると、その充実っぷりがわかるかと思います。

### デメリット

#### チャットツール独自の機能には未対応

Slackだけしか見ていませんが、ことSlackに関しては機能はそれほど多くはありません。これは、Errbotの志向もあるようで、他のツールと汎用的に使えることを目指している(と思う)ので、Slack独自の機能は大抵使えません。
基本的にプラグイン形式で動きますし、公式のドキュメントも揃っているので、作ろうと思えば作れるとは思います。

従って、チャットツールがSlackだけであり、かつ凝ったことをしたいのであれば、そもそもまずSlackの機能を拡張させる必要が生じるため、初動が重い、というのはあると思います(ただし、逆に他のチャットツールとの互換性はなくなるでしょう)。

#### 名前…

前回も述べましたが、Errbotという名前もまた検索しづらい…。

### 使い所

以下のような人たちに向きそうです。

* Slack、Skypeなどさまざまなチャットツールが混在している
* できるだけ多くのツールを使いたくない。CI/CDなどを別途組むくらいならこれだけで完結させたい
* 厳密なアクセス管理が求められる

## 結局どちらがいいのか

用途に応じて、選択にしどころは変わるかなと思います。まだBot自体不慣れなのであれば、最初はslackbotから触ってみると直観的で分かりやすいかなと思いますし、Botの面倒を見るのに疲れてくるのであればErrbotの方がいいかもしれません。
opencvの画像回転で、はみ出した部分が切り取られないようにする方法

## 単純な回転
pythonのopencvで画像を回転させようと思い「python opencv 回転」で検索すると、
回転した後の画像がクロップされてしまっているものが多くヒットする。
<img width="600" alt="lena_rot.png" src="https://qiita-image-store.s3.amazonaws.com/0/141797/6595a58d-0efa-13f3-9a67-a969af008603.png">
画像参考: [PythonでOpenCVを使う (画像変形編)](https://qiita.com/supersaiakujin/items/3a2ac4f2b05de584cb11)

## このように回転する方法
![042.jpg](https://qiita-image-store.s3.amazonaws.com/0/141797/55fc5a53-10b8-0b89-eb28-41f9e3350ba4.jpeg)
元の画像内に収まらない部分も残す。

ポイントは以下の２点。
- **回転後の画像サイズを計算し指定する**
- **指定したサイズにうまく収まるように回転・平行移動させる**

こんなイメージ。
![lena_rot.gif](https://qiita-image-store.s3.amazonaws.com/0/141797/9f400f77-469d-b972-62e2-e522defdc12b.gif)

```python:no_crop_rotation.py
import cv2
import numpy as np

# 画像読み込み
img = cv2.imread("lena.png")
h, w = img.shape[:2]
size = (w, h)

# 回転角の指定
angle = 40
angle_rad = angle/180.0*np.pi

# 回転後の画像サイズを計算
w_rot = int(np.round(h*np.absolute(np.sin(angle_rad))+w*np.absolute(np.cos(angle_rad))))
h_rot = int(np.round(h*np.absolute(np.cos(angle_rad))+w*np.absolute(np.sin(angle_rad))))
size_rot = (w_rot, h_rot)

# 元画像の中心を軸に回転する
center = (w/2, h/2)
scale = 1.0
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

# 平行移動を加える (rotation + translation)
affine_matrix = rotation_matrix.copy()
affine_matrix[0][2] = affine_matrix[0][2] -w/2 + w_rot/2
affine_matrix[1][2] = affine_matrix[1][2] -h/2 + h_rot/2

img_rot = cv2.warpAffine(img, affine_matrix, size_rot, flags=cv2.INTER_CUBIC)

cv2.imshow("img_rot", img_rot)
cv2.waitKey(0)
```

angleを変化させてもうまく回転している。
![cv_rot.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/141797/2b400175-858e-45b5-fdaa-b1c1d2fef5a4.gif)
MySQLの複合インデックスを貼るコツ

ちょうど業務で大量のデータが入っているMySQLのパフォーマンスチューニングをやる機会があったので、備忘録として残しておこう。経験則なので、間違っている部分があるかもしれない。

- MySQLは１テーブルにつき１つのインデックスを使用するのでWHERE条件とORDER BY条件が異なる場合はいずれか一つが使われる（実行計画のKeyとPossible keyをみるとわかる）
- 複合インデックスの対象カラムはWHERE条件、ORDER BY条件の順に定義する
- カーディナリティの高いカラムを複合インデックスに含めるのが良いが、WHERE条件、ORDER
 BY条件にあるカラムすべてを含めずともそれなりに性能は向上する
- 複合インデックスはカラムが定義された順に検索されるので、１番目のカラムにはもっとも使用頻度の高いカラムを設定する

検索・一覧表示画面は一般的にWHERE条件とORDER BY条件が複雑に組み合わさっているので、複合インデックス前提で設計するのが良いと思った。

ここに答えがあった。さすが日本男児だ。
http://nippondanji.blogspot.com/2008/12/2008.html
Chainerで胃カメラの画像を自動生成する

# 概要
- Chainer の DCGAN で、胃カメラ(上部消化管内視鏡）の画像を自動生成しました。
- 内視鏡医のみなさんも本物としか思えないリアルな画像が生成されました。


![image03984000.png](https://qiita-image-store.s3.amazonaws.com/0/217196/a97e2bc5-ce05-624b-3b31-ecd67f482b58.png)



# 使用したデータ
エルサルバドルの消化器内科医 Julio Alejandro Murra-Saca さんが、Webサイト [El Salvador Atlas of Gastrointestinal Video Endoscopy](http://www.gastrointestinalatlas.com) で4000以上の内視鏡ビデオを公開されています。今回は、そのデータを使用して学習しました。


# 環境
- Ubuntu 16.04
- GeForce GTX 1070
- Chainer 3.3.0

# 準備
1. 胃カメラのビデオをダウンロードします。
 - 正常・胃がん・胃潰瘍など 287 本のビデオダウンロードしました。
 - `wget` などのツールは使わずに、一つ一つ手作業でダウンロードしました。
2. FFmpeg で 1 秒につき 2 フレームずつ png 形式の画像を切り出します。 
3. ImageMagick で画像を 32×32 ピクセルに crop ＆ resize します。
 - Chainer の examples の DCGAN をそのまま使うためです！
 - ファイル数が多すぎると `ls` や `mogrify *.png` は動作しなくなるので注意。
4. グレイスケールPNGを取り除く。
 - Chainerで行列の次元の要素数が合わないというエラーが発生しました。`pnginfo` コマンドでチャンネル数が3以外の画像を検出して、取り除きました。
5. 輝度・彩度の分散が少ない画像を取り除く。
 - それぞれの画像のピクセルについて輝度と彩度の分散を計算しました。輝度・彩度ともに分散が小さい画像は低品質とみなして除去しました。このやり方がよかったかは不明です。
6. 最終的に、約40万枚の画像を学習に使いました。

# 実装と実行
非エンジニア勢なのでコードを完全に理解してガリガリ編集するのは現実的ではありません。
おとなしく[chainer](https://github.com/chainer/chainer) のサンプルコードの[DCGAN](https://github.com/chainer/chainer/tree/master/examples/dcgan)をそのまま実行しました。
学習の様子です。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Chainerで生成した内視鏡画像 <a href="https://t.co/ZWbbBbgY3I">pic.twitter.com/ZWbbBbgY3I</a></p>&mdash; axha (@axha0838) <a href="https://twitter.com/axha0838/status/960817366450909184?ref_src=twsrc%5Etfw">2018年2月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 結果

![image03984000.png](https://qiita-image-store.s3.amazonaws.com/0/217196/e04d9be1-bc68-0341-89ee-3234d7cb6829.png)
![image03984000.png](https://qiita-image-store.s3.amazonaws.com/0/217196/a97e2bc5-ce05-624b-3b31-ecd67f482b58.png)

　私が画像を見て病名をつけてもよさそうだと感じた所見の一例を示します（あくまで一例です）。正常画像のほか、胃がん・胃潰瘍などの病変画像がうまく生成されていますね。一方で、なんだかよくわからない画像もあります。図には直接示しませんでしたが、生検鉗子のようなものが再現されている画像もありますので、よかったら探してみてください。輝度・彩度による画像選択をしているため、全体的に画像がドラマチックになりすぎている印象もありますね。
　そのほか、少ない画像枚数で学習を続けてみたところ、学習が進行しすぎると、generatorが似たような画像ばかり集中的に生成するようになる傾向が出現するようでした。その時々のエポックにおけるdiscriminatorが苦手とする画像なのでしょうか。

# おわりに
　コンピュータを用いてきれいな胃カメラの画像を自動生成できることを示しました。また症例画像空間を学習させることで、潰瘍、腫瘍など、病変の画像も自動生成させられることがわかりました。
　2018年現在、Deep Learning で高精度な画像認識が可能であることが広く知られるようになりました。画像認識を利用して、レントゲン、CT、内視鏡などの画像から病変を検出したり、医師の業務を代行する試みが広く行われています。
　けれども実際のところ Deep Learning は、もっと自由な発想で取り組むと、さらに幅広い応用の方法が隠されているのではないでしょうか。
　この記事はChainerのサンプルコードを実行したに過ぎません。しかしエンジニアの皆さんが医療について関心を持ってくれたり、医療サイドの皆さんがIT技術について考えるきっかけになると幸いです。
InvalidOperationException: Cannot override system-specified headersが出た時の対処法

UnityでInvalidOperationException: Cannot override system-specified headersというエラーが出てしまったときの対処法です。

# 原因
Unity5.6からUnity2017にアップデートされた際にWWWの仕様が変わり、自動的に設定されるheaderが増えたのが原因です。
自動的に設定されるheaderを追加してWWWインスタンスを生成しようとするとエラーになります。

```C#
Dictionary<string, string> headers = new Dictionary<string, string>();
headers["Content-Length"] = data.Length.ToString();
WWW www = new WWW(url, data, headers); //エラー

```

# 対処法
該当するheaderを削除します。
エラー情報に表示されないため、どれが該当するheaderなのかは一つずつ調べていくしかありません。
自分が調べた限り、Content-Lengthは該当するheaderです。

# 参考
https://forum.unity.com/threads/www-exception-in-2017-1-but-not-5-6.476528/
IntelliJ Ideaを快適に使うためのおすすめJVMオプション

IntelliJ IdeaがGCが走ると画面が固まってカクつくので、GCのアルゴリズムをG1GCに変えてみたところ快適でした。

# 設定変更

## IntelliJ IdeaのJVMオプションを開く

![貼り付けた画像_2018_02_06_19_58.png](https://qiita-image-store.s3.amazonaws.com/0/6680/38bc23a0-1a52-d7dd-2e51-52c4ea726817.png)

## JVMオプションのファイルが開かれるので編集する
こんな感じにしました。メモリサイズはお好みで。

```
# custom IntelliJ IDEA VM options

-server
-Xms128m
-Xmx2400m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=300
-XX:ReservedCodeCacheSize=280m
-XX:+UseCompressedOops
```

## IntelliJ Ideaを再起動する
終了してから起動するだけです。
PHP 7.2からPHPのWindowsビルドのやり方が変わった話

PHP 7.2以降のWindowsビルドの手順は下記ドキュメントに記載があります。

- https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2

以前とは手順が少し変わっており、以前はビルドに必要な実行バイナリを `deps-7.1-vc14-x86.7z` のようなファイルから取り出していたのですが、代わりに `phpsdk_deps.bat` を実行してその中で必要なバイナリをダウンロードするようになりました。

7.1以前のビルド方法は下記のドキュメントに書いてあります。

- https://wiki.php.net/internals/windows/stepbystepbuild

ちなみに、PHP 7.0と7.1は新旧どちらの方法でもビルド可能です。PHP 5.6以前は後者でしかビルドできません。また、PHP 7.2は新しいやり方でないとビルドできません。自動ビルドしているような場合は難儀です。
いろいろなGAN

# DCGAN
Input,z(ランダムなベクター）からdiscriminator,D（画像がデータセットからかどうか判定）を騙すような画像を作る。GANは訓練が大変なため、Dropout, BatchNormalization, LeakyReLUの使用が必要。

論文：https://arxiv.org/abs/1511.06434

# LAPGAN
低解像度な画像を生成するGANを訓練することはもっと簡単なとき、LAPGANは使用される。低解像度と高解像度の画像の差を学習し、画像を高解像度にする。訓練時、Generator,Gに低解像度の画像を入力し、低解像度と高解像度の画像の差を生成し、Discriminatorが本物か生成されたものか判定。

論文：https://arxiv.org/abs/1506.05751

# Conditional GAN　
Conditional vector（ラベルや画像など）を入力と、Dropoutからのノイズで画像を生成する。通常のGANの訓練方法(大きな特徴を学習）に加え、PatchGAN、L1 loss（小さな特徴）を使う。Conditional vaectorと画像がペアであるデータセットが必要。

論文：
https://arxiv.org/abs/1611.07004
https://arxiv.org/abs/1411.1784

以下を参考に[DCGAN、LAPGAN、Conditional GAN　の実装](https://gist.github.com/mami-t/f3eff836a62a0f9d14e2016261d490b0)
https://elix-tech.github.io/ja/2017/02/06/gan.html
https://qiita.com/miyamotok0105/items/8ed0a8943f5318e826e0

# Cycle GAN
画像変換を行うためのGAN。画像AからB、BからAを生成するgenerator, G1, G2と画像が生成されたものか判定するdiscriminator, D1, D2を訓練しながら、G２（G１（A))がAに戻るように訓練（PatchGAN)。画像AとBがペアである必要はない。

https://qiita.com/itok_msi/items/b6b615bc28b1a720afd7

# Conditional Cycle GAN
低解像度の画像とconditional vectorから高解像度な画像を生成するgenerator, G1と高解像度から低解像度の画像を生成するG2を使い、Cycle GANのように訓練する。Conditional vaectorと高解像度の画像はペアである必要がある。

[Conditional Cycle GAN の実装](https://gist.github.com/mami-t/bdb8aaa468870280e27c9077d586a34b)
論文：https://arxiv.org/abs/1705.09966
# Info GAN
ランダムな入力ベクターの一部（隠れ符号c）に意味を持たせるGAN。DCGANに画像から隠れ符号を推測するQを加える。Discreteな隠れ符号の場合、クロスエントロピーを使い、continuousな場合、gaussian lossを使う。教師なしで生成する画像を操作できる。

以下を参考に[Info GAN の実装](https://gist.github.com/mami-t/071c42517e3eec66663f4a858a4bdbf2)
http://akmtn.hatenablog.com/entry/2017/05/29/204414
https://github.com/tdeboissiere/DeepLearningImplementations/blob/master/InfoGAN/src/model/train.py
論文：https://arxiv.org/abs/1606.03657
AtomでProcessingを実行する

AtomでProcessingを実行するため、PackagesからProcessingで検索し、そのいくつかで実行するまでを確認した。*Script*で実行する方法のみ工夫が必要だったが、他の実行方法も合わせて記録しておく。


#環境
- macOS Sierra (Version 10.12.6)
- ATOM 1.23.3 x64
- Processing 3.3.6


#3つの実行方法
下記3つの方法のいずれも Processing-java をインストールする必要がある。
その方法は、https://atom.io/packages/processing がわかりやすい。

## Packages *processing*

- *processing* (https://atom.io/packages/processing) 
 
実行時の Processing IDE の console にあたる Pane が閉じられない問題がある。

ショートカットキー：ctrl+alt+b


## Packages *build* + *build-processing* 

- *build* (https://atom.io/packages/build) 
- *build-processing* ( https://atom.io/packages/build-processing )

この2つのパッケージを入れれば、build にて実行できるようになる。
実行を停止するとコンソールが自動的に閉じるので、コンソールログの確認で不便なことがある。

ショートカットキー：command+alt+b


## Packages *script*

- *script* ( https://atom.io/packages/script ) 

1. Command Palette から`Script: Run Options`
2. Command Arguments: に `--sketch={FILE_ACTIVE_PATH} --run` と入力
3. 必要であれば Save as profile をして Run

<img width="500" alt="Screen Shot 2018-02-06 at 17.38.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/98322/924ea47f-fa7d-e930-169e-7b1872d1e370.png">

ショートカットキー：command+shift+i　もしくはprofileに保存していれば、command+shift+k
【Azure】セキュリティグループをApplication Gatewayに適用しアクセス制限をしたい

#はじめに
Azureのロードバランサー（Application Gateway）へのアクセスを制限したい！
ということでセキュリティグループをApplication Gatewayに適用しようとしたら、Azureポータル上でぽちっとして設定できない！


#結論
###Application Gatewayが所属しているサブネットに、セキュリティグループを関連付ける。


#手順
###前提
- Application Gateway用のサブネット作成済み
- Application Gateway用のセキュリティグループ作成済み

####1.ネットワークセキュリティグループ画面に移動



####2.Application Gatewayに適用するネットワークセキュリティグループを選択する。
>
![01.png](https://qiita-image-store.s3.amazonaws.com/0/168635/b43eb0c0-1f83-a610-602f-c6f24147e7ca.png)


####3.サブネットを選択すし関連付けをする。
>
>①画面左側の[サブネット]を押下する
![02.png](https://qiita-image-store.s3.amazonaws.com/0/168635/16f839f8-907e-3a21-a06b-7b2dccdfc092.png)
>
>②画面中央上の[関連付け]を押下する。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/168635/c1362d6b-84d1-52e2-c4db-69734285fe83.png)


####4.Application Gatewayに適用するサブネットをプルダウンから選択し適用する。
>①サブネットが所属しているVnetを選択する。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/168635/180b22cf-0af2-428e-e786-58167dc6540f.png)
>
>②サブネットの一覧からサブネットを選択する。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/168635/ecafce4d-d7e6-c324-63c7-a6cb60348b1e.png)
>
>③画面下部の[OK]を押下する。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/168635/d6c788f5-7f09-a446-a88f-9295bd0c7561.png)



**適用後に動作確認して完了！！**
AWS SES で検証済のドメインとメールアドレスが競合しているときのカスタム MAIL FROM での書き換え

次のようにドメインとメールアドレスをバリデーションしていて、

- ドメイン
    - example.com
- メールアドレス
    - 001@example.com
    - 002@example.com

かつ、このそれぞれにカスタムの MAIL FROM を設定しているときに、下記のような送信メールの Return-Path/From のパターンで、どの検証済ドメイン/メールアドレスのカスタム MAIL FROM の設定で書き換えが行われるかのメモ。

| Return-Path      | From            | 使用されたカスタム MAIL FROM の設定 |
| ---              | ---             | ---                                 |
| 001@example.com  | 001@example.com | 001@example.com                     |
| 002@example.com  | 002@example.com | 002@example.com                     |
| 001@example.com  | 002@example.com | 002@example.com                     |
| 002@example.com  | 001@example.com | 001@example.com                     |
| xxx@example.com  | 001@example.com | 001@example.com                     |
| 001@example.com  | xxx@example.com | example.com                         |
| xxx@example.com  | xxx@example.com | example.com                         |

つまり、Return-Path ではなく From に対して SES の設定が適用されて、ドメインとメールアドレスで検証済の設定が競合するときはメールアドレスの方が優先される。

Return-Path ではなく From に基づいて MAIL FROM （つまり Return-Path）が書き換えられるのが意外。
いいね機能の実装と仕組み

#今や当たり前のいいね機能
いいね機能がないwebサービスはかなり少ないと思います。。。
自分でwebアプリをつくっていると、どうしても取り入れたくなります。ですが、どのように実装するのかのやり方と、
仕組みの理解があまり自分なりに整理できていなかったので、まとめます。
最初にやり方、仕組みは下の方に書きますので、仕組みまで気になる方は是非。

※もちろん様々な仕組みがあるとは思いますが、自分が現時点で理解しているもので投稿します。

#いいね機能実装

いいね機能の実装をMVCで書いていきます。
特定の食べものをいいねするという機能を作ります。

##Model
```food.rb
has_many :likes
has_many :users, through:likes
belongs_to :user

#特定のユーザーが特定のfoodをすでにいいねしているかを判別するメソッド
def liked? (like_user_id, like_food_id)
 likes.where(user_id: like_user_id, food_id: like_food_id).exists?
end
```

```user.rb
has_many :likes
has_many :foods, through:likes
belongs_to :food

```

```like.rb
belongs_to :food
belongs_to :user 
```

##View
```show.html.erb-food
#foodの一つ一つの個別ページでいいね数がどれくらいあるかをみれるようにする
<%= @food.likes.count%>

#すでにいいねされていれば、"いいねを消す"ボタン、いいねされていなければ"いいね"ボタンを出す
<% if @food.liked?(current_user.id, @food.id) %>
 <%= button_to 'いいねを消す', unlike_user_comic_path(user_id: current_user.id, id: @ food.id) %>
<% else %>
 <%= button_to 'いいね',like_user_comic_path(user_id: current_user.id, id: @food.id) %>
<% end %>
```


##Controller
```likes_controller.rb
#いいね機能
def create
 food_will_be_liked = Food.find(params[:id])
 food.likes.create(user_id: params[:user_id]) 
 redirect_to controller: "foods", action: "index"
end
#いいねを消す機能
def destroy
 food_will_be_unliked = Like.find(food.id: params[:id])
 food_will_be_unliked.delete
end
```
```foods_controller.rb
#個別ページ出力メソッド
def show
@food = Food.find(params[:id])
end
```
コードとしてはこんな感じのはず。。。。
間違ってたら教えてください。。

#いいね機能仕組み

##一番最初に詰まったのは。。。。いいねという事実の表現
自分の中でいいね機能を作る際に詰まったのは、いいねしたという事実をどう表現するんだ？ってことです。。。（初心者なんですみません。）
likeテーブルに下のようなレコードが存在していれば、いいねをしたということになります。

![スクリーンショット 2018-02-05 16.55.54.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/3451a48e-7664-62d4-5278-6c1556247ffc.gif)

上の図で言えば、２というuserは１というfoodと２というfoodにいいねをしていることになります。
３というユーザーは１というfoodにしかいいねしていませんね

##特に重要だなと思ったメソッド

###def liked?
まあこれは自分で作ったものなので、メソッド名はなんでも構いませんが。。。。
いいねしたかどうかを判別するというのもなかなか想像ができずに困っていましたが、上の事実表現が理解できれば簡単です。
要は上の例で言えば、food_idが１で、user_idが２のレコードが存在していればuser2はfood1をいいねしているといことになります。逆にdeleteしてしまえば　このレコードが消滅するのでいいねはなかったことになります。




こんな形でいいね機能はできるはずです。
Outlook OAuth 2.0 認証を使ったログイン手順

## 概要

ローカル開発環境のサンプルWebアプリで、Outlook OAuth 2.0 認証して、Outlookのメール、カレンダーを取得できるようにすることがゴールの記事です。

## ログイン手順

### 1. テストアカウント作成

Microsoft アカウントを以下URLから作成する

https://signup.live.com/signup?uaid=7e034002c1c045838109b82657bc257c&lic=1

### 2. アプリ ID / クライアント IDの作成と設定

1. https://apps.dev.microsoft.com/#/appList
1. `アプリの追加`
    - ![スクリーンショット 2018-02-06 18.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/112294/29579e0f-4f9d-c272-76d1-0965e44307d6.png)
1. Application生成
1.`アプリケーション シークレット > 新しいパスワードを生成`
    - 新しいパスワードを生成
    - パスワードをメモしておく
1. `プラットフォーム > プラットフォームの追加 > Web`
    - リダイレクト URL: 
        - http://localhost:8080/authorize.html
    - ![スクリーンショット 2018-02-06 18.58.56.png](https://qiita-image-store.s3.amazonaws.com/0/112294/507bbdc4-0f88-6d24-653f-ac8adf5aba45.png)
1. 権限の付与
    - 以下、カレンダー、メールについて権限を付与する
    - ![スクリーンショット 2018-02-06 19.00.33.png](https://qiita-image-store.s3.amazonaws.com/0/112294/f3e543fa-deec-5b9f-1df6-a660b3a13fec.png)
1. 保存する

### 2. サンプルソースのcloneと設定

https://github.com/jasonjoh/java-tutorial

以下、auth.propertiesファイルに上記、取得したアプリ IDとパスワードを設定する

```bash
$ git clone git@github.com:jasonjoh/java-tutorial.git
$ vi java-tutorial/src/main/resources/auth.properties
appId=YOUR_APP_ID_HERE
appPassword=YOUR_APP_PASSWORD_HERE
redirectUrl=http://localhost:8080/authorize.html
```

### 3.サンプルの起動とログイン

```bash
$ mvn -q jetty:run
```

http://localhost:8080/index.html

![スクリーンショット 2018-02-06 19.10.39.png](https://qiita-image-store.s3.amazonaws.com/0/112294/666416cc-28cd-63b9-8ff7-d48e900a95c6.png)

`Click here to login` をクリックするとOutlookに認証される。

## 参考記事

[OAuth 2.0](https://msdn.microsoft.com/ja-jp/library/hh243647.aspx)
[OAuth 2.0 を使った認証のガイドライン](https://msdn.microsoft.com/ja-jp/library/dn440163.aspx)
[スコープとアクセス許可](https://msdn.microsoft.com/ja-jp/library/hh243646.aspx)
ruby3行で輝夜月ちゃんがslack通知



```rb:slack
require 'net/http'
require 'uri'
require 'json'

slack_webhook_key = URI.parse("https://hooks.slack.com/services/hogehhogeasdfafdajkdshfalksfh")

send_data = {
  text: "おはよおおおお！こんにちわああ！こんばんわああああ！おきてえええええ！" ,
  channel: "hoge",
  username: "輝夜月",
  icon_emoji: ":kaguya_runa:"
}.to_json

Net::HTTP.post_form(slack_webhook_key, { payload: send_data })
```
Option<T>を拡張して xor()を追加する

rust 1.22.1 時点での話。

コメントを頂いてできることがわかったのでバチッと書き換えました！（[コメント1](https://qiita.com/yajamon/items/33e2db0782ec8f08bdcb#comment-bd55ed45590ef23a4061)、[コメント2](https://qiita.com/yajamon/items/33e2db0782ec8f08bdcb#comment-7dfb960a9864baae4089)）

書き換え前の記事は[こちら](https://qiita.com/yajamon/items/33e2db0782ec8f08bdcb/revisions/1?type=preview)

# こうする

```rust
trait Xor {
    fn xor(self, other: Self) -> Self;
}

impl<T> Xor for Option<T> {
    #[inline]
    fn xor(self, optb: Option<T>) -> Option<T> {
        match (self, optb) {
            (Some(v), None) => Some(v),
            (None, Some(v)) => Some(v),
            _ => None,
        }
    }
}

fn main() {
    let (some, none): (Option<u32>, Option<u32>) = (Some(1), None); 
    assert_eq!(some.xor(none), Some(1)); 
}
```

@JunSuzukiJapan, @tatsuya6502
本当にありがとうございます！
Coursera Machine Learning WEEK2の宿題でエラー（set: unknown line property MarketSize）になった時の対処法

#はじめに
Courseraの[Machine Learning](https://www.coursera.org/learn/machine-learning/home/welcome)  WEEK2で、初めて宿題を出そうと思っていたら、はるか前段でエラーになったので、対処方法のメモです。

#エラーになったコード
「2.1 Plotting the Data」に記載のあるコードで、コピペすれば動くはずの内容になっています。

```octave:plotData.m
plot(x, y, 'rx', 'MarkerSize', 10); % Plot the data 
ylabel('Profit in $10,000s'); % Set the y−axis label 
xlabel('Population of City in 10,000s'); % Set the x−axis label
```
#エラーメッセージ
```octave
error: set: unknown line property MarketSize
error: called from
    __line__ at line 120 column 16
    line at line 56 column 8
    __plt__>__plt2vv__ at line 502 column 10
    __plt__>__plt2__ at line 248 column 14
    __plt__ at line 113 column 17
    plot at line 223 column 10
    plotData at line 19 column 1
    ex1 at line 47 column 1
```
`property MarketSize`がunknownと言われているので、そこを修正してあげれば良さそうです。

#修正方法
Octaveのドキュメントをのぞいてみます。

- [GNU Octave: Two-Dimensional Plots](https://www.gnu.org/software/octave/doc/v4.2.0/Two_002dDimensional-Plots.html)

>Multiple property-value pairs may be specified, but they must appear in pairs. These arguments are applied to the line objects drawn by plot. Useful properties to modify are "linestyle", "linewidth", "color", "marker", **"markersize"**, "markeredgecolor", "markerfacecolor". See [Line Properties](https://www.gnu.org/software/octave/doc/v4.2.0/Line-Properties.html#Line-Properties).

正しいプロパティ値は全て小文字で`markersize`のようです。

#修正したコード
```octave:plotData.m
plot(x, y, 'rx', 'markersize', 10); % Plot the data 
ylabel('Profit in $10,000s'); % Set the y−axis label 
xlabel('Population of City in 10,000s'); % Set the x−axis label
```
無事にエラーが解消しました。
Github の pull request のページで Go のテストファイルを折りたたむブックマークレット

```javascript
javascript:document.querySelectorAll('.file-header').forEach((header)=>{name=header.querySelector('.file-info a').innerText;if(!/_test.go$/.test(name))return;button=header.querySelector('button.js-details-target');button.click();});
```

Go のコードレビューをするとき、テストは後で見るから いったん実装部分だけ一覧したいよ、というときがある。

そういうときはテストファイルの差分が邪魔なので、テストファイルを全部折りたたむブックマークレットが上記。

折りたたんでるときにもう一度実行すると、元に戻る。
初心者がmongoose公式 勉強するメモ Document 編

# mongoose Document
## 今回のお題はこちらです。
## http://mongoosejs.com/docs/documents.html
* 英語ですので、chromeの翻訳を使って下さい。
* 検証結果は、掲載しませんので、実際確認してみてください。

* document.js

``` js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

const Schema = new mongoose.Schema({ name: 'String', size: 'String'});
const Tank = mongoose.model('Tank', Schema);

const id = "5a795cdc536527304721283a"

// 更新されず
// Tank.findById(id, function ( err, tank ) {
//   if (err) return console.log(err);
//   tank.size = 'small' ;
//   tank.save( function ( err, updatedTank ) {
//     if (err) return handleError(err);
//     // res.send(updatedTank);
//     console.log(updatedTank)
//   });
//   mongoose.disconnect();
// });

// 更新されず
// Tank.findById(id, function ( err, tank ) {
//   if (err) return handleError(err);
//   tank.set({ size: 'small' });
//   tank.save( function ( err, updatedTank ) { 
//     if (err) return handleError(err);
//     console.log(updatedTank);
//   });
//   mongoose.disconnect();
// });


// Tank.update({_id: id}, { $set: {size: 'small'}}, (err) => {
//   if (err) console.error(err);
//   console.log('update')
//   mongoose.disconnect();
// })


// Tank.findByIdAndUpdate(id, { $set: { size: 'small' }}, { new : true }, ( err, tank ) => {
//   if (err) return handleError(err);
//   // res.send(tank);
//   console.log(tank)
//   mongoose.disconnect();
// });

// 上書き未検証
// Tank.findById(id, function ( err, tank ) {
//   if (err) return handleError(err);
//   otherTank.set(tank);
// }); 

```
* findById は、二個とも表示はされますが、updateがうまくいかないです。
  - なにか、抜けているかもしれないですが今のところ不明です。
  - Question 03
* update OK
* findByIdAndUpdate OK

* 今回は、ここまです。
* updage関係は、あまり理解できていない印象があります。　また判ったら更新したいと思います。
TypeScript 2.7.1 以降での import の書き方

https://qiita.com/karak/items/29ff148788f5abb15331 の続編。

結局、どの CommonJS モジュールをどうやって import すればいいんだときかれたので回答。
export のパターンごとに対応する import を列挙するので参考にしてほしい。必要に応じて型定義ファイルも示してある。

はじめにES6流儀のモジュールの書き方をおさらいする。

## Named export 型

条件：
export default 以外の export _member_ 文のみで構成されている。

モジュール

```js:fs/index.mjs
export function readFileSync() { ... }
```

アプリケーションコード

```ts:app.ts
import * as fs from 'fs';

fs.readFileAsync();
```

`import { readFileAsync } from 'fs'` ももちろん可。

## Default export 型

条件：
export default が使われている。

```js:material-ui/components/Button.mjs
var Button = ...;

export default Button;
```

アプリケーションコード

```ts:app.ts
import Button from 'material-ui/components/Button';

React.createElement(Button);
```

### バリエーション

export default とそれ以外の export _member_ 文が混在する場合は、下の記法を使う。

```js:material-ui/components/Button.mjs
var styles = ...;
var Button = ...;

export styles;
export default Button;
```

```ts:app.ts
import {
  default as Button,
  styles,
} from 'material-ui/components/Button';

React.createElement(Button);
```

ES6 Modules の仕様を熟知していれば言わずもがなだが、念のため。

以下は CommonJS 型で書いてあるパターン。

## 名前空間型-A

条件：
exports._member_ = （または module._member_ =） だけで書かれている。
※ ただし、_member_ に "default" がない前提。

モジュール

```js:fs/index.js
exports.readFileSync = function() { ... }
```

アプリケーションコード

```ts:app.ts
import * as fs from 'fs';

fs.readFileAsync();
```

## 名前空間型-B

条件：
exports = （または module.exports =）で書かれ、かつ exports されたものが、関数でもクラス（コンストラクタ）でもないオブジェクトである。

モジュール

```js:fs/index.js
var fs = { };
fs.readFileSync = function() { ... }
exports = fs;
```

型定義

```ts:@types/fs/index.d.ts
export function readFileSync(): void { ... };
```

アプリケーションコード

```ts:app.ts
import * as fs from 'fs';

fs.readFileAsync();
```

## Callable 型

条件：
exports = （または module.exports =）で書かれ、かつ exports されたものに、関数かクラス（コンストラクタ）である。あるいはその要素を含む。

モジュール

```js:jquery/index.js
var jQuery = function () { ... }
jQuery.each = function (array, cb) { ... }
...
exports = jQuery;
// module.exports = jQuery; も同じ
```

型定義

```ts:@types/jquery/index.d.ts
interface jQueryStatic {
   (selector: string): jQueryStatic;
   each<T>(array: T[], cb: (x: T, i: number) => any): jQueryStatic;
   ...
}
declare var jQuery jQueryStatic;
exports = jQuery;
```

アプリケーションコード

```ts:app.ts
import jQuery = require('jquery');

jQuery('#app');
```

## 終わりに

すべてのモジュールがES6形式で書かれる日がくることを切に願う。
Processing - 09 - lineとforを使った描画

<img width="600" alt="スクリーンショット 2018-02-06 18.33.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/53333e9d-25c0-5d0c-28d3-bc87fcdbf529.png">

```java:
void setup () {
  size (600, 300);
  smooth ();
  background (255);
  strokeWeight (25);
  noLoop ();
}

void draw () {
  for (int i = 1; i < 9; i = i + 1) {
    stroke (20*i, 155, 155);
    line(i*50, 100, 150 + (i-1)*50, 200);
  }
}
```
プログラムのネーミングに迷ったとき Alfred Workflows を使って、もっと手軽に GitHub でコード検索する

素晴らしい記事を見つけました。

[プログラムのネーミングに迷ったら GitHub でコード検索すると参考になる説 - Qiita](https://qiita.com/kyoshidajp/items/c5d4f060df636ea20cbb)

> みなさん、コードを書いていて変数やメソッド名のネーミングって迷いますね。
>
> こんな時に自分たちはチームを横断して「こういう名前考えたんだけど、これってどうかな？」という確認を Slack 上で行っています。先日、この Slack チャンネルを見ていて考えました。
> 
> 「GitHub で検索すれば世の中のコードでどのぐらい使われているかざっくり分かるので参考になるのでは？説」

というアイデアを実現するため、CLIでサクッとキーワードの件数を検索できるツール `ghkw` を作られたとのこと。

> ```
% ghkw ninja samurai bushi sensei senpai kohai
| RANK | KEYWORD |   TOTAL   |
|------|---------|-----------|
|    1 | ninja   | 3,374,938 |
|    2 | samurai |   730,748 |
|    3 | sensei  |   213,917 |
|    4 | senpai  |    26,786 |
|    5 | bushi   |    25,493 |
|    6 | kohai   |     2,195 |
```

うん。良いですね。
ただ…ターミナル立ち上げるのも時々億劫なんだよなあ…。

# Alfredと連携させてみよう

さて、Macのランチャーアプリ Alfred には、強力なコマンド呼び出し機能「Workflows」があります。（有料）
[Alfred Workflows - Extend Alfred and Boost Your Productivity](https://www.alfredapp.com/workflows/)
これを使って、ランチャー内で結果を確認できたら最高なのでは？

ということで、ターミナルを使わなくてもいいようにしてみました。

## 手順

簡単です。

### 1. Alfred の Preference で、①Workflowsを表示し、②新規作成し、③を配置して開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/7aa178b4-d91d-f419-d367-d4d72fdee8c3.png)

### 2. スクリプトを書く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/3b4c57be-cc58-32eb-f03b-66f0db88c85e.png)

zsh の知識もあまりないですが、ほかの Workflow や参考サイト[^1][^2][^3]を見ながら、見よう見まねでなんとかなりました。

[^1]: [Alfred Workflowのシェルで追加コマンドが利用できない理由とその対策 | 豆腐メンタルは崩れない](http://wbtmiu.herokuapp.com/2014/10/30/b6a2f20af2e75e89c1a52ccde3b182ec/)
[^2]: [zsh の配列操作の基本から応用まで - Qiita](https://qiita.com/mollifier/items/f897b3fddd2d10369333)
[^3]: [Split string with zsh as in Python - Stack Overflow](https://stackoverflow.com/questions/2930238/split-string-with-zsh-as-in-python)

```zsh
PATH=$PATH:/usr/local/bin  # 環境変数を設定しないと brew でインストールしたコマンドが使えない
zmodload zsh/regex  # zsh で正規表現を使うために必要

result=$(ghkw {query})  # {query} でユーザー入力値が取得できる
arr=( ${(@f)result} )  # ghkw の出力結果を行ごとの配列へと変換

cat<<EOB
<?xml version="1.0"?>
<items>
EOB

for i in $arr; do
	cols=("${(@s/|/)i}")  # 結果が `|` で区切られているので分割。ちなみに index は 1 始まり
	keyword=$(echo $cols[3] | tr -d '[:space:]')
	population=$(echo $cols[4] | tr -d '[:space:]')

	if [[ $cols[2] -regex-match "[0-9]" ]]; then  # 結果(= cols[2] が数字) 以外の行を雑にフィルタ
		cat<<EOB
		<item uid="$population" arg="$keyword">  # item は uid の順にソートされる
		<title>$keyword</title>
		<subtitle> hits: $population</subtitle>
		<icon>icon.png</icon>
		</item>
EOB
	fi
done

cat<<EOB
</items>
EOB
```

### 3. (Optional) 選択時に GitHub の検索結果を開くようにする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/3a42205e-8c13-2d7b-24e0-c3beec84cfb2.png)

ブロックをつなげて…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/58804ea4-b219-78a4-3a7d-45d36872bac4.png)

`https://github.com/search?utf8=%E2%9C%93&q={query}&type=` と設定。

## できた！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/2109b64a-9dc3-0dc7-fd6b-ff47e4d49f8f.png)

いいでしょー。
VPPでカスタムB2B Appを配信する際について

#はじめに
カスタムB2Bアプリケーションをお客様に提供することになるということで、VPPを利用してアプリの配布を行う方法について調べたので、その内容のメモ書き。

#概要
[Volume Purchase Program（VPP）](https://www.apple.com/jp/business/programs/#vpp)とは、

- 組織がAppやブックを一括購入して組織内のユーザに配布できる
- サードディベロッパが専用に開発したカスタムB2BアプリケーションをVPPストアからプライベートな方法で入手できる
- アプリの使用権を回収できるため、再配布等に有用である
- VPPはApple Development Programsの一部（Apple Development Programsアカウントを作成し登録する）である
- クレジットカードやVPP Creditで購入可能である


#事前準備
VPPを利用するために、
　1. Apple Deployment Programアカウントの作成
　　[登録サイト](https://deploy.apple.com/qforms/open/register/index/avs)にアクセスしてVolume Purchase Programへの登録を行います。
　　登録時は以下の情報が必要になります。
　　　・ 会社の電話番号とEメールアドレス
　　　・ 会社のDUNS（Dun & Bradstreet）ナンバー（未取得の場合は[取得する](https://developer.apple.com/program/enroll/dunsLookupForm.action)）
　　　・会社の住所
　　　・免税資格についての情報

　　※既にDevice Enrollment Program（DEP）に登録している場合は、同じApple IDを使用できます。
　　※ここで登録したApple IDはApple Deployment Program専用のものになります。他のサービスでは使用できません。
　　※他のApple IDを作成した際に使用したメールアドレスでは登録できません。

　2. アカウントの設定
　　Apple Deployment Programウェブサイトにサインインして管理者アカウントを作成します。

　3. 管理者の追加
　　管理者には管理者アカウント（VPPストアからアプリや書籍を購入できる）の追加を行うことが可能です。
　　新しい管理者を作成するには管理者の名前とメールアドレスが必要となります。

#アプリケーションの配布について
　アプリケーションの配布方法は、管理配布と引き換えコードによる配布のいずれかが選択できます。

- 管理配布の場合

　　・ アプリケーションの配布にはMDMまたは[Apple Configurator 2](http://help.apple.com/configurator/mac/1.4/)を利用できます。
　　・ コンテンツを以下の方法で配布できます。
　　　　　アプリケーションをデバイスに対して割り当てることができます。（この場合、Apple IDの取得不要）
　　　　　アプリケーションをユーザに対して割り当てることができます。（Apple IDの取得必須）
　　・ アプリケーションを無効にして別のユーザに割り当て直すことができます。

- [引き換えコード](https://support.apple.com/ja-jp/HT202995)の場合

　　・ 使用端末１つにつき１つApple IDが必要
　　・ 購入した数量分だけスプレッドシートの形式でコードが提供されます。
　　・ コードの所有権はコードを引き換えたApple IDに移行します。
　　・ コンテンツを以下の方法で配布できます。
　　　　・サードパーティ製のMDMソリューション
　　　　　　MDMを利用して、VPPによって提供されたスプレッドシートをMDMサーバにアップロードして配布
　　　　・Eメール
　　　　　　引き換えコード URLをユーザに送信。ユーザは各自のモバイルデバイス、またはMacやWindowsパソコンで、各アプリケーションや本のURLをクリックまたはタップするだけ。自分のApple IDで認証した後、すぐにコンテンツの使用が可能
　　　　・社内のウェブサイト
　　　　　　専用の社内Webページにアクセスさせてダウンロードさせる
　　　　・Apple Configurator 2
　　　　　　アプリケーション引き換えコードのスプレッドシートを読み込んで、管理を行うことが可能

#アプリケーション提供側について
　iTunes Connectでアプリの公開を行う際の設定を変更することで、個別向けに公開を行うことができます。

　1. iTunes Connectの登録について
　　概要については[iTunes Connectワークフロー](https://help.apple.com/itunes-connect/developer/?lang=ja-jp#/dev300c2c5bf)を参照ください。
　　iTunes ConnectへはApple Developer Programに登録した際のApple ID（チームエージェント）でサインインできます。
　　チームエージェントには自動でiTunes Connectのアカウントが付与されます。
　　ユーザとして追加する場合にデベロッパアカウントやApple IDは必要ありません。

　2. 非公開で企業へAppを配信する設定について
　　[非公開で企業へAppを配信する](https://help.apple.com/itunes-connect/developer/?lang=ja-jp#/dev275598f16)のリンク先を参照ください。	

　設定時には配信対象のユーザのVolume Purchase Program用（Apple Deployment Programアカウント作成時）のApple IDが必要となります。
　※Apple IDがVolume Purchase Program用に作成されたものでない場合、エラーが表示され、そのApple IDは一覧から削除されます。

　※ [iTunes Connectレコードの作成](https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Chapters/CreatingiTunesConnectRecord.html#//apple_ref/doc/uid/TP40014483-CH13-SW3)についてはリンク先を参照ください。



#おわりに
後日追記修正の可能性があります。
あくまで、メモということで。
《非プログラマー向け》Ruby/Railsアプリ作成の効率的な学習方法

![スクリーンショット 2018-02-06 18.20.25.png](https://qiita-image-store.s3.amazonaws.com/0/199441/2f9f8105-dc50-41b6-7086-f34668211a18.png)

## 共有すること
Ruby/Railsアプリ作成の効率的な学習方法（非プログラマー向け）

## 学習方法
下記の流れで学習すると、非プログラマーでも効率的に学習できる。

### 1. [Progate](https://prog-8.com/) でRuby/Railsを学習
《Ruby》
基本的な文法・オブジェクト指向に基づいたプログラミング（クラスの定義・継承）

《Rails》
ログイン・ログオフ機能・いいね！機能を持ったSNSの作り方


最終的には、**Progateのサイトを見ずに一人でSNSを実装できる**まで何度もコードを書く。


### 2. Railsチュートリアルで学習
Progateよりも高度なログイン機能・パスワード再設定・アカウントの有効化・Herokuを使った本番環境へのローンチ・Gitの使い方などを学習可能。


## この学習方法のメリット・デメリット
### メリット
・学習コストが低い
・自分のペースで学習可能
・わからないことをネットで調べて自力で解決したいと思う人には向いている。

### デメリット
・プログラミングを詳しい人から直接教わりたいと思う人には向いていない。

##この方法でローンチしたサイト
TokyoMetro API × Ruby on Rails
https://tokyometroapi-and-rubyonrails.herokuapp.com/
![スクリーンショット 2018-02-06 18.16.01.png](https://qiita-image-store.s3.amazonaws.com/0/199441/90b887ae-140c-d8b0-96d9-e7bcb31af769.png)


顧客管理アプリ
https://customer-management-20180120.herokuapp.com/
![スクリーンショット 2018-02-06 18.16.35.png](https://qiita-image-store.s3.amazonaws.com/0/199441/5ff44d4d-150b-a989-5a43-7557d91debd1.png)



SNS by Ruby on Rails
https://sns-20171220.herokuapp.com/
![スクリーンショット 2018-02-06 18.15.31.png](https://qiita-image-store.s3.amazonaws.com/0/199441/3ed97be7-b317-1d60-c599-4907cc5804d0.png)
Rails5.1 + WebpackerでReactを導入

## はじめに
最近ではRailsでフロントエンド開発をする際はWebpackではなく、`Parcel`を使うという手もあります。
ですが趣味で触った際にうまく動作しなかったのとissuesが多めだったので、今回は素直にWebpackerを使用して`React`を導入するようにしました。
今回はその手順を簡単に残しておこうと思います。

## 環境
Rails : 5.1.4
Webpacker : 3.2.1

## まずはWebpackerの導入
まずはWebpacker の導入から

```.rb:Gemfile
gem 'webpacker'
```

`bundle install`でgem導入

```
bundle install
```

Railsプロジェクトにwebpakerをインストール

```
bin/rails webpacker:install
```

これでwebpackの導入は完了となります。

## Reactの導入

以下のコマンドを実行

```
bin/rails webpacker:install:react
```
これでReactが導入されました。
また`javascript/packs`以下に`hello_react.jsx`というファイルが生成されていると思います。

## view側の準備
`application.html.haml(またはerb)`の`javascript_include_tag`を`javascript_pack_tag`に変更します。

```.haml:app/views/layouts/application.html.haml
= javascript_pack_tag 'application'
```

## 確認
`javascript/packs/application.js`に生成されたhello_react.jsxを読み込ませるようにする

```.js
require('./hello_react.jsx')
```

以下のコマンドを実行してRailsサーバーとWebpackサーバーを起動

```
bin/rails s
bin/webpack-dev-server
```
起動したら`http://localhost:5000`にアクセス
ブラウザに`Hello React!!`と表示されていて、コンソールに以下のような表示がされていたら成功です！(Reactのバージョンによってはコンソールに表示される文言は違うようです)

![スクリーンショット 2018-02-06 18.11.48.png](https://qiita-image-store.s3.amazonaws.com/0/191598/93329652-0e15-7e02-5f8f-f40974217273.png)


表示されない場合は`hello_react.jsx`が読み込まれているか確認してください。

これでRailsでreactが使えるようになりました！

##
エンジニアの新人教育 〜メンターとビギナーの日々是セッション〜

# 現チームの構成

- アジャイル開発をしている。少人数のチーム。
- 業務で扱う範囲が非常に広い。

ここでは教わる側を「ビギナー」。
教える側の代表を「メンター」と呼ぶことにする。

# デイリーセッション (ミニ朝会) を開くようにした

チームでは毎日、ホワイトボード前で朝会をおこなっている。
これは立ちながらの短時間のミーティングで、各メンバーがそれぞれ、自分の進めるストーリーを話したり、実装の相談をしたりする時間だ。

この朝会のすぐ後に、メンターとビギナーで、毎日必ずセッションを開くようにした。
ビギナーが分からないこと、気になることや、逆にメンターが気になっている点などを、何でも話し合って、質疑応答する時間だ。
(僕たちはこれを「ミニ朝会」と呼んでいる)

## やり方

- ビギナーが何か、朝会で気になることがあれば、メンターに質問する。メンターがそれに答える。(後述するが、このやり方はその後改善した)
  - 毎回「今日の朝会で、何か気になることはありましたか？」というような言葉で始めている。
  - 小さなホワイトボードを使って、絵や図を使って説明することが多い。
- トピックは、実装や技術的分野に関してだけではなく、たとえばプロジェクトの状況について、基本的な仕事の仕方や、Slackなどのツールの使い方などの範囲に及ぶ。
- メンターでも分からないことや、理解が曖昧な部分は、他のメンバーの力を借りて教える。(これはメンター自身の理解強化にもつながる)
- ここでは「ミニ朝会」という方法を書いたが、メンターとビギナーがセッションするタイミングを、適切なタイミングで、定期的に取れるならば、どんな形式でも良いと思う。
  - 毎日のスケジュールに組み込むことが重要だと思う。
  - 「何もトピックがない時」があっても良いけど、1秒でも良いので、必ずセッションの時間は作って、それを習慣にする。(「必要になったらやる」「思いついたらやる」のでは、いずれ忘れてしまう)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6c4fb5c8-4815-3ca8-a9e0-7953946bc398.png)



## 問題点

- ビギナーからの質問を待ち受けるだけだと、理解の取りこぼしが多いことに気づいた。
- 「気になることはありましたか？」「ありません」で終わってしまう日が多かった。

## 改善 - メンターがトピックを用意する

メンター側から、アクティブにトピックを用意するようにした。

- セッションを始める前に、ビギナーに投げてみたいトピックをいくつか用意しておく。
- 「Aさんの話してた、ストーリーBの、Cという部分は、どんな風に受け取りましたか？」などと聞いてみる。
- 自分が担当しているストーリーをトピックにすると、特にやりやすい。(なぜなら、よく理解しているから)
- メンターが直接教えていない部分に関しても、ビギナーに自由回答形式で答えてもらう形も試している。
  - たとえばサーバー構成を説明したあとに「この1個サーバーでだけ、データベースが存在しないのは、なんでだと思いますか？」など。
  - まったくの推測で良いので答えてもらって、推理する習慣、思考習慣をつけるきっかけにしてもらおうとしている。

# コツ

個人的に心がけていること。

- メンターとしても、チームとしても、自分たちの「教える力」を上げるつもりで取り組む。
  - たとえば、ひとつの問題が生じた時、メンターやチームに原因があったのか、ビギナーに原因があったのかを考えてみる。(その両方ということもあるし、どちらでもない場合もある)
  - チームとして改善できるところがあれば、そうする。
  - いちどチームで土台を作ってしまえば、それが今後も、文化として受け継いで行ける可能性がある。
- ビギナーの話をよく聞く。
  - たとえば実装やドメインに対して、ビギナーの理解が間違っていた時、どこがボトルネックになっているかが分かるまで、じっくりと話を解きほぐす。
  - なぜなら「つまづいた理由が分からない」状態では、問題を解決するのは難しい。
- 褒めるべきところを褒める。
  - ビギナーから見習いたいところを探してみる。
  - どちらかというと「褒めるところを頑張って見つける」というより「褒めることが思い浮かんだ時に、それを言うのをやめない」という感覚。
  - 長所は、理系的な頭のキレの良さとか、確認の丁寧さとか、勉強熱心さとか、人の良さとか、相手によってそれぞれ。
  - 人間はそれぞれ性格的な長所が違うので、武器も違う。メンターにはない武器をビギナーが持っている。

# あわせて読みたい？

- [エンジニアのチーム開発 〜1on1ミーティング始めました〜 - Qiita](https://qiita.com/YumaInaura/items/98458e47ba2b328a42a1)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
リストの中から指定した要素をすべて取り除く

よく使うけどいつも忘れるのでメモ

```python:
target_list = ['削除しない', '削除しない', '削除する要素', '削除する要素', '削除しない', '削除する要素']

list(filter(lambda element: element != '削除する要素', target_list))
# return ['削除しない', '削除しない', '削除しない']
```

はい