OmniAICreator/Qiita-1.07M huggingface dataset:
pySerial 2.7 + CentOS 6.8 (+Python 2.6.6) > ループバックテストは成功 | readline()が遅い問題はある | ドライバのバージョンアップで動作しなくなるコード

```txt:動作環境
CentOS 6.8 (64bit)
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
pySerial pyserial-2.7-py2.6.egg-info
```

### 関連

- [(未解決) pySerial 3.* + CentOS 6.8 > Python 2.6は対応しない (ValueError: zero length field name in format) | Python 2.7は対応してそう > Python 2.7と3.6ではConnection timed out](https://qiita.com/7of9/items/e9c11a861ac21b6627c3)
- [(未解決) pySerial 3.* + Ubuntu 16.04 LTS > OSError: [Errno 5] Input/output error | RPi + Python 2.7.9 + pySerial 2.6-1.1では問題ない](https://qiita.com/7of9/items/d2c296b6222cd39a6fee)

**pySerialの3.*ではCentOSとUbuntuにおいてまともにシリアル通信ができない。**
というのが2018年1月19日現在の認識である。

Raspberry Pi(Raspbian Jessie)でpySerial 2.*ではシリアル通信ができていた実績がある。

### pySerial 2.7 + CentOS 6.8 

CentOS 6.8にpySerial 2.7をインストールしてみた。

https://pypi.python.org/pypi/pyserial/2.7
からtar.gzファイルを取得。

```
$tar xvzf pyserial-2.7.tar.gz
$cd pyserial-2.7
$sudo python2 setup.py install 
```

### code > ループバックテスト

```loop_test_180119.py
import serial
import time

def main():
    print("Hello")
    con1=serial.Serial('/dev/ttyUSB0', 9600, timeout=10)
    con2=serial.Serial('/dev/ttyUSB1', 9600, timeout=10)

    str1='from\r'
    con1.write(str1);
    str2=con2.readline()
    print("str1=", str1)
    print("str2=", str2)
    con1.close()
    con2.close()

if __name__ == '__main__':
    main()

```

### 実行

USBシリアル変換ケーブル2本をクロス接続して、USBに挿した状態で以下を実行した。
(ケーブルのドライバはProlific）。

```bash
$ sudo python2 loop_test_180119.py 
Hello
('str1=', 'from\r')
('str2=', 'from\r')
```

この処理を繰り返したが正常に処理されている。
（readline()の問題はあり、[こちら](https://qiita.com/7of9/items/02bd8dcc3238c73f84c9)に記載の対応は必要となりそう）。

### ドライバのバージョンアップで動作しなくなるコード

[Unityのシリアル通信はUnity4からUnity5になった時点で動作しなくなった経験](https://qiita.com/7of9/items/03bdc4f0fa939e9218f3)がある。

Gitのとあるクライアントソフトはv1.*からv2.*になった時点でバグだらけになった例も知っている。

pySerialは v3.*で調べた範囲ではいくつかのエラーが未解決のように見られる。

5年、10年のスパンで考えた場合、ドライバのバージョンアップで動作しなくなるコードがあると認識しておく必要があるかもしれない。
Stride APIを叩くときのCroudId、ConversationIdの調べ方(？)

Atlassian製チャットツールのHipchatを使っていたら
「Hipchatはもう使えマセーン。Strideに移行シナサーイ！」
というメッセージが表示されてメッセージ送信ができなくなってしまいました。

なんてこった。

<img width="360" alt="hipchat.png" src="https://qiita-image-store.s3.amazonaws.com/0/189759/0dd1ba5e-367a-dc26-e70d-cdfb66efc09d.png">


なし崩し的に新アプリのStrideに移行。
Google App ScriptからHipchat APIを叩いて定刻をお知らせするアプリも
使えなくなってしまいました。

なんてこった。

Stride APIを叩くために
公式ガイドを見ながら改修を試みたんですが
https://developer.atlassian.com/cloud/stride/learning/sending-messages/

エンドポイント内の変数

```
https://api.atlassian.com/site/{cloudId}/conversation/{conversationId}/message
```

* {cloudId}
* {conversationId}

この二つが分からなくて、ググっても情報が無くて困りました。


で、色々試してみた結果、APIからチャットを送信したいStrideの部屋で、
画面右上の「Meeting」を開いて「Meeting link」をクリックしてリンクを取得。

<img width="575" alt=" 2018-01-19 18.10.12のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/189759/2644666e-114c-1842-7587-f69c19516b2a.png">

そうすると取得できる文字列が

```
https://stride.video/{cloudId}/{conversationId}
```

となっていることが分かりました！

偶然の発見でした。
ちゃんとした調べ方を知っている人がいたら教えてください・・・。

あとは公式ガイド通り、

* 会話にアプリを追加
* APIからアクセストークンを発行
* API投稿

<img width="448" alt=" 2018-01-19 18.20.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/189759/2a538a33-9cbc-dbb4-fbbb-b6c33532e6ce.png">

することができました。

めでたしめでたし。
退職前にやっておくと良い6つのこと

# はじめに

- 私が務めている会社を先日退職したため、退職前に行っておくノウハウの載せておきます。

# 1. 優先度[高] コネクションを残す

- 社会からドロップアウトできるならまだしも、まだまだ社会とつながりを持って仕事に励まないといけない場合、重要な要素は自身のスキルやキャリア、経験よりもコネクションです。
- 人と人とのつながりが、自身にとっていい仕事を引き寄せたり、自身が苦しいときに助けてもらったりできる「きっかけ」になります。
- 飲み会やランチの予定を余裕をもってセッティングするため、開始時期は最終出社日の１ヶ月以上前のほうがよいとおもいます。

## 関わった人リストを作成する

- 社員にかかわらず、派遣や業務委託の方も含めて仕事で関わった人をリストアップしましょう。
- 一度でも顔を合わせて話したらリストに加えてよいとおもいます。
- シートのカテゴリは以下のようなものを作ってみてはいかがでしょうか。
- リストに加えるか迷った時は、「自身より優秀な人」かどうかで判断してみてはいかがでしょうか。
- 同時に名刺などの整理もしておきましょう。

|氏名|事前に退職の連絡をしたい|飲み／ランチにいきたい|連絡先を交換したい|
|:---|:---|:---|:---|
|田中太郎|◯|飲み|◯|
|山田花子|◯|ランチ|◯|

## 事前に退職の連絡をする

- 口頭だと周りの目が気になりますし、メールだと堅苦しい感じがあるので、チャットなどがあればそこで気軽に話してみてはいかがでしょうか。
- IT技術がいくら発展しても人同士の飲みニケーションなどはまだまだ健在です。気軽に誘ってみてはいかがでしょうか。お金や時間の都合もあると思いますので、まとめて誘うグループを作ってまとめて開催するというのもよいとおもいます。
- ついでに連絡先がほしければ、事前にFacebookのアカウントを探し出しておいて、友達登録の許可を取ってみるとよいかもしれません。
- 連絡先は、Facebook、LINE > メールetc...がよいとおもいます。
- この連絡の反応によって、相手との距離感が測れる場合もあります。お互いに気が合う形であれば、相手から飲み会やランチの誘いがくる可能性が高いです。
- 少しずる賢いですが、相手からの評価や親近感を上げるために、飲み会やランチでは少し突っ込んだ話や素を出していく感じが良いかもしれません。普段からはっちゃけている方は逆に聞き役になってみるのも良いです。

## 最終出社日に連絡をする

- リストの人全員に退職のメールをBCCで送りましょう。
- その際に自身のメールアドレスやFacebookなどを一応載せておくのがよいでしょう。
- お菓子を配ったりするのも通例かと思うので、事前に選んで購入しておきましょう。

## 退職後1〜3ヶ月後くらいに近況連絡や飲み会などを行う

- 話す中で、コミュニティが深まる可能性があります。
- 自身の現在と過去を照らし合わせて、仕事のやり方を見直すきっかけになるかもしれません。
- 思わぬキッカケで良い人材を引き抜くことができたり、面白い話が生まれるやもしれません。

# 2.  優先度[中] 次の仕事の勉強をする

- 事前に勉強できる技術や知識があれば聞いておきましょう。
- なるべく、技術や知識が現在とまったく異なる新規の部分を勉強しましょう。
- 例えば、Webアプリケーションの場合は、RestfulなAPIやCRUDアプリケーションを作れると良いと思います。
- 開始時期は最終出社日の１ヶ月以上前のほうがよいとおもいます。

# 3. 優先度[中] パソコンにインストールするソフトウェア情報や設定情報をまとめておく

- 会社のセキュリティ情報や個人情報は抜き出さないように注意しましょう。

# 4. 優先度[中] ソフトウェアの設定情報をまとめておく

- ZshやSSH、Gitなどの設定はどこでも同じ設定を使いまわすはずです。
- 会社のセキュリティ情報や個人情報は抜き出さないように注意しましょう。

# 5. 優先度[中] ドキュメントのテンプレート、プレゼン資料、コードTipsなどをまとめておく

- 会社のセキュリティ情報や個人情報は抜き出さないように注意しましょう。

## オープンにしてしまうのがオススメ

- ドキュメントはQiita
- ソースコードなどはGithub
- プレゼン資料はSlideShare
- その他はGoogleスプレッドシート、Dropboxなど

# 6. 優先度[低] 自身の痕跡を消すか委譲させておく

- 自身が持っているボールや成果物を削除するか他の人に委譲させておきましょう。

# 結論

- 結論、コネクションのためには時間とお金を惜しまないこと。
CSS備忘録

CSSの備忘録を記載していく。

# セレクタ

```css
/* クラス */
.class
/* id */
#id
/* >区切り → 子要素のみ適用。「A > B」の場合、Bの要素のみ適用 */
#main > p
/* カンマ区切り → 複数のセレクタにまとめて適用 */
p,td
/* 半角スペース区切り → 子孫に適用。「A B」の場合、Aの子孫階層のBに適用 */
div p
/* +区切り → 隣接する（直後の）要素に適用 */
#A+div
/* ~区切り → 後にある要素に適用 */
#A~div
/* *= → 前後方一致した要素に適用 */
class*='aa'
/* :not → E:not(s)の場合、sでないセレクタを持つE要素に適用 */
div:not(.top)
/* n番目のE要素に適用。nの部分は任意の数値以外に、奇数の場合「odd」偶数の場合「even」が指定可能 */
E:nth-of-type(n)

/* 指定した要素にカーソルを重ねたときに適用 */
:hover
/* カーソルを重ね、クリックしてから離すまで適用 */
:active
/* 指定した要素にカーソルを重ねたときに適用 */
:focus
```

# ボーダースタイル

```css
/* ボーダー非表示、太さも0 */
border-style: none
/* ボーダー非表示、太さも0 */
border-style: hidden
/* 1本線 */
border-style: solid
```

# width:autoとwidth:100%の違い
width:autoとpaddingを指定している場合、paddingを含んで横幅100%となる
width:100%とpaddingを指定している場合、paddingを含まずに横幅100%となる

# マージンとパディング

margin　要素の外側の余白
padding　要素の内側の余白

# position

```css
/* デフォルト値。位置を指定できない */
position: static
/* 基本的にstaticと同じ。top、right、bottom、leftで指定した位置の相対位置に配置される */
position: relative
/* ページがスクロールされても同じ位置に表示される */
position: fixes
/* 親要素からの相対位置に配置される */
position: absolute
```

# ブロックレベル要素とインラインレベル要素

##### ブロックレベル要素

h1、p、ul、ol、div、tableなど
要素の前後に改行が入る（縦に要素が並んで表示される）
width、height、margin、paddingを指定できる

##### インラインレベル要素

a、span、strongなど
要素の前後に改行がない。（横に要素が並んで表示される）
width、heightを指定できない
margin、paddingは左右のみ指定可能

# display

```css
/* ブロックレベル要素にする */
display: block
/* インライン要素にする */
display: inline
/* インライン要素だが、width、height、margin、paddingが可能 */
display: inline-block
/* ブロックレベルのflexコンテナボックスを生成。直下の要素が並列になる */
display: flex
```

# flexのスタイル

```css
/* 左から右に並ぶ */
flex-direction: row
/* 右から左に並ぶ */
flex-direction: row-reverse
/* 上から下へ並ぶ */
flex-direction: column
/* 下から上へ並ぶ */
flex-direction: column-reverse
/* 改行なし */
flex-wrap: nowrap
/* flexコンテナに入るよう改行して表示 */
flex-wrap: wrap
```

# float

```css
/* 指定した要素を左に寄せる */
float: left
/* 指定した要素を右に寄せる */
float: right
/* 初期値。なにもしない */
float: node
/* floatで左寄せ、右寄せした要素に対する回り込みを解除する */
clear: left
clear: right
clear: both
clear: none
```

# スタイルの強制適用

```css
!important
```

# overflow

```css
/* ボックスからはみ出して表示（初期値） */
overflow: visible
/* はみ出した場合、スクロール */　
overflow: scroll
/* はみ出した場合、表示しない */
overflow: hidden
/* ブラウザに依存 */
overflow: auto
```

# box-sizing

```css
/* パディングとボーダーを幅と高さに含めない */
box-sizing: content-box
/* パディングとボーダーを幅と高さを含める */
box-sizing: border-box
/* 親要素の値を継承する */
box-sizing: inherit
```

# テキスト表示関連

```css
/* 連続する空白を1つの空白として表示（改行あり） */
white-space: nomal
/* 連続する空白をそのまま表示 */
white-space: pre
/* 連続する空白を1つの空白として表示（改行なし） */
white-space: nowrap
/* テキストを切り取って省略記号を表示 */
text-overflow: ellipsis
```

# z-index

`z-index: 数値`
positionでstatic以外が指定された場合、適用される
整数値　重なりの順序を指定。値が大きいほど上になる
`z-index: auto`　親要素と同じ階層。初期値

# visibility

```css
/* ボックスを表示 */
visibility: visible
/* ボックスを非表示 */
visibility: hidden
/* テーブルの行、列に指定した場合、その部分を詰めて表示 */
visibility: collapse
```
Payload Too Large()のエラーについて

問題
-
初めてのQiitaに投稿します。よろしくお願いします。
投稿する際に`![Payload Too Large]()`のエラーのため、画像がアップロードできない問題が発生。

解決
-
記事を投稿前（何も投稿してない場合）はQiitaの画像に使える容量が月間**2MB**らしいです。
初めての記事投稿すると**100MB**まで増えることが分かりました。

参考記事
-
[Qiita初投稿時、![Payload Too Large]()のエラーがよく出る](https://qiita.com/genshun9/items/9e54325bf2dd3de2f99f)
計数工学科 LaTeX テンプレートについて

#計数工学科 LaTeX テンプレートについて
計数工学科[^keisu]の卒論・修論テンプレートの簡単な使い方をまとめました．
[^keisu]: 東京大学工学部計数工学科（数理情報工学コースとシステム情報工学コースがあります）．修論は東京大学大学院情報理工学系研究科数理情報学専攻及びシステム情報学専攻．

##とりあえずコンパイルしてみる
計数工学科ホームページの「[LaTeXテンプレート](http://www.keisu.t.u-tokyo.ac.jp/research/latex/)」から卒論用 $\rm\LaTeX$ テンプレートの ZIP ファイル「suribt-20141120.zip」をダウンロードします．（2020年1月24日追記：[システムの人はこちら](https://www.keisu.t.u-tokyo.ac.jp/research/latex-system)）
ZIP ファイルを展開し，中にある skeleton.tex をコンパイルしてみましょう．

**注意** 文字コードが「Shift-JIS」になっていますので適宜変更してください．

これで卒論が10ページ書けました！ やったね！！ [^rem]
[^rem]: 白紙のページ等を含みます．また，印刷の枚数とヘッダーに記載されるページ数は異なります．

##使い方
skeleton.tex をコピーしたものを「卒論.tex」(?) として書き始めても構いません．
すでに書き始めている場合は次のようにします．

- 卒論の TeX ファイルが入っているフォルダに，先ほど解凍した suribt.cls, ~~suribt.dtx, suribt.ins~~ をコピーする．
- 自分の TeX ファイルのプリアンブルを「`\documentclass{suribt}`」に変更するなど skeleton.tex を覗きつつ適宜修正する．

解凍したフォルダの中にある suribt.pdf や「[卒論クラス suribt とその周辺](http://www.misojiro.t.u-tokyo.ac.jp/suribt/)」に卒論用 $\rm\LaTeX$ テンプレートの説明が書いてあります.

##その他
気づいたことがあれば書いていきます．

###オプション
`\documentclass[hoge]{suribt}` とすることで，いくつかの機能が使えます．（2019年12月13日追記）

**例**
- `master`: 修士論文
- `english`: 英語論文
- `draft`: ドラフト（草稿）モード
- `ipc`: システム情報学専攻

###BibTeX
色々と便利なのでぜひ使いましょう．
使い方は，例えば『[BiBTeXとは](https://qiita.com/SUZUKI_Masaya/items/14f9727845e020f8e7e9)』にあります．（2019年12月20日追記）

杉原先生の資料にある参考文献の形式は情報処理学会のものだと思われます．
この形式にしたいというこだわりがある場合は[ホームページ](http://www.ipsj.or.jp/journal/submit/style.html)から BST ファイルをダウンロードしましょう．
（論文内で統一されていれば形式は自由なので，別の形式を使っても構いません．）

###upLaTeX
普段エンジンとして upLaTeX を使っている（普段，最初に `\documentclass[uplatex]{jsarticle}` と書いている）場合はクラスファイル (.cls) の82行目「`\LoadClass[a4paper,onecolumn,titlepage,11pt`」に `uplatex` オプションを追加して
`\LoadClass[a4paper,onecolumn,titlepage,11pt,uplatex`
に変更することで対応できます．
卒論のファイルのプリアンブルは `\documentclass{suribt}` のままで構いません．

###Overleaf
最近は Overleaf が流行っているようです．
以下の記事で詳しく解説されています．（2019年12月13日追記）

- 『[計数工学科卒論LaTeXテンプレートをOverleafでコンパイルする](https://qiita.com/yokotech/items/4e98f75caf7b52282b19)』
自動運転についての備忘録

#自動運転について
Computation Technologyによる人工知能システムの開発は現在多岐な分野にわたっています。ドローン、顔認識ゲートシステム、画像診断システム、ロボットによる対話システムなどこれらのシステムは人の介在を行うことなく、飛行、診断、判定などの行動を自律的に行うことができます。
Booze Allen Hamilton社のKirk Brone氏の[論考](https://mapr.com/blog/safe-driving-self-driving-enterprise/)を基調にして、自動運動について自分なりの備忘録を記述しておきます。

##自律システム(Autonomous system)の定義

　Kirk Brone氏は[Autonomous Manufacturing](https://www.epsrc.ac.uk/newsevents/pubs/autonomous-manufacturing-workshop-report)を引用にして自動化運転システムの概念を自律的システムに適用することで見解をまとめています。この中でAutonomous systemsは、イギリス工業生産の中で将来の潜在的成長を担う最重要Technologyの一つとして位置付けられており、学習、順応・習得、そして行動をコントロールし、生産性、信頼性、柔軟性や付加価値を高めることで先進的な生産プロセスの構築を行うものです。将来の生産と品質保持を維持するため持続性、効果性、柔軟性を備えたAutonomous Systemを融合するスマートシステムの実現を行うことが理想とされています。
　システム実現のために多くの課題が産業界の多岐にわたる分野で挙げられており、将来必要とされる具体的機能はそれぞれの分野で異なります。  
　一方で、__Autonomy(自律的)__はシステムでの自己認識、自己コントロールの能力を有し、__Autonomous Manufacturing Systems__がより先進的な認知機能を備えたシステムであることが述べられています。

##自律システム(Autonomous system)の特徴

ここで、自律システム(Autonomous system)の特徴は、

* 多岐にわたる外部からの入力が受信可能
* 意思決定、戦略的計画を自身で完結可能な機能を備え持っている
* 人の行動を代替かつ補完出来る機能を有すること
* 人と共存可能であり、かつハイブリッドな意志決定や通信・会話の確立、人の行動モデルの構築が可能であること
* 適切なロジックで自己学習、行動反応を行い、人に劣らない先進的な学習能力を有すること
* 外部からの変化する情報を受け取り行動し、より複雑なモデルを自身で構築可能であること
* インテリジェントなセンサーシステムを搭載することで感度(掴み方、組み立て方など)が調整可能である

と列挙されています。

##自動運転エンタープライズシステムの概念について

 自動運転システムでは、車が単体で稼働して走行することもありますが、基本的には車を全体的にコントロールするエンタープライズシステムの存在が必要になります。例えば、他人の車と情報を交換・交信したり、スマートシティにおける路上信号システムとの交信による自動交通制御、スマートグリッドとの連携においての電気自動車への電力供給の管理を行うことで、単体の車がより広域なエンタープライズシステムに内包化するべきであるとされます。  

 ここでは、自律システムの特徴を適用した後、自動運転エンタープライズシステムの特徴と定義がどのようになるのか簡潔に紹介されています。  

|特徴|内容  | アナリティクス  | 行動様式上での位置付け  | 
|:----------|:----------------|:------------|------------|
|センシング・ストリーミング |多数のセンサーからの情報入力  |     __Descriptive Analytics__(主に過去データからの分析)     | Passive(受動的な行動)  |
|反応 | 入力信号に対応した行動| __Diagnostics Analytics__(リアルタイムで入力されるデータに対応した分析)|Reactive(反射的な行動) |
|学習・アジャイル | 過去・現在、そして全体から取得したデータから学習を構築|  __Predictive Analytics__(次に何が起こるかについての分析)|Proactive(自発的行動) |
|連想最適化 | 最適な意志決定のための知見を深めるため多くのデータを取得 | __Perspective Analytics__(予想モデルを超えた領域からの行動予想) |Predictive Reactive(予見される反射行動) |
|意思決定・行動 | 意志決定のため全てのデータを活用、最小リスクと最大効果を求める|   __Coginitive Analytics__(Next Best Actionのための認知行動)     |Sense-Making for NBA(最善行動のめのセンシング) |
  
　近年では、Databaseや配信データなどを用いた従来のデータ分析を超えた先進的な分析手法が新たに開発されたことで、自動運転のエンタープライズシステム上で発生する事象の分析に大いに役立っています。特に__Perspective Analytics__は、過去データからデータパターンや行動様式を予想するばかりでなく、これらパターンからは予想不可能であった予想結果や、過去データにはかつて現れることのなかったデータパターンを取得することが可能になり、どのように行動することで最善の結果・結論を得ることができるかについて深い洞察力を備えることが可能となっています。  
　さらに,__Coginitive Analytics__では人工知能の領域に踏み込むことで、正確なタイミングで正確な意志決定の判断を下すことが可能となっています。Neural NetwrokおよびDeep Learningの分析手法を駆使することで正解で緻密な解を導き出すことが可能となっています。

　これら重要な要素を備えることで現在官邸が定義を行なっている自動運転システムのレベル４の実現に向かうことが可能となることでしょう。


# 参考文献
https://mapr.com/blog/safe-driving-self-driving-enterprise
https://www.epsrc.ac.uk/newsevents/pubs/autonomous-manufacturing-workshop-report/
https://www.digitalartsonline.co.uk/features/hacking-maker/humanising-autonomy-what-we-actually-need-from-self-driving-cars/
https://www.kantei.go.jp/jp/singi/it2/senmon_bunka/detakatsuyokiban/dorokotsu_dai1/siryou3.pdf
量子間ネットワークメモランダム

#はじめに
量子コンピュータを勉強するのに使った教材等の自分用メモです。

#量子コンピュータプログラムの基本

* スーパーポジション(量子重ね合わせの状態)
　→測定するまで0でもあり1でもある状態
　→測定すると0または1に固定される

* 量子のもつれ（entanglement/エンタングルメント）
　→別名「双子の量子」
　→２つペアのスーパーポジションの量子ビットのこと
　→どちらかを測定すると片方も最初に測定した結果と同じ値になる

* ベル状態（Bell state）
　→エンタングルメントになった状態のこと

* 量子ゲート（Q#でのoperation）
　→量子のベクトルを操作するオペレーターの名前
　→[Microsoft.Quantum.Primitive](https://docs.microsoft.com/en-us/qsharp/api/prelude/microsoft.quantum.primitive?view=qsharp-preview)

* 回転ゲート（X(), Y(), Z()）
　→X軸を回転させるオペレーター
　→NOTと同じ

* Xゲート
　→0と1を反転

* Zゲート
　→0か1はそのままで符号だけ反転


* 量子アダーマルゲート（H()）
　→Z軸とX軸の間の軸を中心に180度回転させるオペレーター
　→0と1が等しいスーパーポジションになる

* 制御NOTゲート（CNOT()）
　→２つの量子ビットを量子のもつれ（entanglement/エンタングルメント）の状態にする
　→IBMではCX()

* CCNOTゲート（CCNOT()）
　→３つの量子を使うゲート

* 量子の測定（M()）
　→量子は測定してみるまで0なのか1なのかはっきりしない
　→0または1を使う場合は初期化が必要

#チュートリアル
[はじめよう「Q#」で量子コンピューティング](http://ascii.jp/elem/000/001/615/1615203/)

[Microsoft Quantum Development Kit Samples and Libraries](https://github.com/Microsoft/Quantum)

[Writing a Quantum Program](https://docs.microsoft.com/en-us/quantum/quantum-writeaquantumprogram?view=qsharp-preview)

[IBM Quantum Computing で計算してみよう](https://www.ibm.com/developerworks/jp/cloud/library/cl-quantum-computing/index.html)


# 概念

[中学レベルの数学で量子テレポーテーションを理解してみよう](https://misatopology.wordpress.com/2012/10/14/quantum_transportation/)

# ショアのアルゴリズム（素因数分解のアルゴリズム）

[Shorのアルゴリズムのための効率的な量子回路](http://www.kecl.ntt.co.jp/openhouse/2008/quantum/doc/shor.pdf)

[量子コンピュータで因数分解が高速に解ける？〜 ショアのアルゴリズム 〜](https://qiita.com/kyamaz/items/eebd0f7734c8a33de2ad)
→量子コンピュータだけでは素因数分解ができないという解説がわかりやすい

[量子コンピュータで１＋１を計算する](https://qiita.com/kjtnk/items/8385052a50e3154d1022)


#開発環境

* VisualStadio 20017
* Q#
Flask-WTFとFlask-Bootstrapで、いい感じのFormを自動生成する

[こちら](https://qiita.com/msrks/items/88831fc265a93bd62e24)の記事の続きです。
[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/): Formの入力項目のvalidationや、CSRF対策済みのFormを作るためのFlask拡張

```bash:インストール
$ pip install flask-wtf flask-bootstrap
```

## Flask-WTFについて補足

1. いい感じのFormが簡単に作れる（formのhtml生成 `wtf.quick_form(form)` 、validation `form.validate_on_submit()`)

2. [CSRF対策](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html)が簡単にできる

> CSRFとは：
> リクエスト強要（CSRF：Cross-site Request Forgery）とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。
ブラウザが正規の Webコンテンツにアクセスした際には毎回、セッションを維持するために所定の Cookie、Basic認証データあるいは Digest認証データがブラウザから Webサーバ宛に送出されるという性質を、この攻撃は悪用する。

> CSRF対策：
> ユーザ本人以外の者が捏造したコンテンツに基づいて発せられたHTTPリクエストを Webアプリが受け付けないようにすること。
他者が推定困難なランダム値を フォームのhiddenフィールドとして埋め込み送信し、フォームを返信させる

## 簡単な使い方 (Flask-Bootstrapも利用)

```python:app.py
from flask import Flask

app = Flask(__name__)
app.config['SECRET_KEY'] = 'super secret' # CSRF対策でtokenの生成に必要
```

Formを作る

```python:app.py
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import Required

Class NameForm(FlaskForm):
    name = StringField('name:', validators=[Required()])
    submit = SubmitField('Submit')
```

Viewを作る

```html+jinja:form.html
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
```

Form Handlingの例:

```python:app.py
@app.route('/', methods=['GET', 'POST'])
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ''
    return render_template('index.html', form=form, name=name)
```

>
- [実装例](https://github.com/msrks/flask_booklist/blob/e86738479e731723cbc7753930656933b5aa69e4/app.py) (github repo)
- [WTFFormについて](http://flask.pocoo.org/docs/dev/patterns/wtforms/)(Flask 公式doc)
Raspberry Pi で OpenCV を使う環境を整える

「Raspberry Pi + Picamera でIoT体験を isaax でやってみよう」
https://qiita.com/xshell/items/e6199c101d1fa497be94
では、OpenCVを使った動体検知とmotionJPGでWebストリーミングを組み合わせて遊びました。


これをテキストにして、過去２回XSHELLにてワークショップを行いました。

- 「RASPBERRY PI + カメラで人物認識IOTをやってみた（勉強会レポート）」
 https://xshell.io/2017/12/iot-raspberry-pi-camera/



- 「2018/1/15勉強会開催しました」
https://xshell.io/2018/01/isaax-study-18115/‎

これらのワークショップでは既にインストールしたSDカードを配布させていただきました。参加者はアプリだけ書いて実行すれば遊べるようにしました。では、自分で同じことをするにはどうしたらいいでしょう？

今回、ワークショップで使用したSDカードと同じものを作成する方法を説明します。

# microSDカードにRaspbianを書き込む
1. こちらから、Raspbianのイメージをダウンロードします。
https://www.raspberrypi.org/downloads/raspbian/
「RASPBIAN STRETCH LITE」Release date:2017-11-29 のものを使いました。
1. ダウンロードできたらZIPファイルを解凍します。
1. SDカードをPCに刺します。PC本体付属のSDカードリーダでも外付けのSDカードリーダでもOK。
1. 書き込みソフトを使ってイメージを書き込みます。書き込みソフトの詳細、操作については各自検索してみてください。

# 初期設定

## ネットワーク関連の設定

### sshを利用可能にする
書き込んだSDカードの boot パーティションに「ssh」という名前の空ファイルを作っておきます。 
### 無線LANを利用可能にする
必要に応じて、無線LANの設定をします。
書き込んだSDカードの boot パーティションに「wpa_supplicant.conf」という名前のファイルを作り、中にESSIDなどを記述しておきます。 
詳しくは「Raspberry Pi 無線LAN」でWebで検索してみてください。

### ログインとはじめの設定

RaspberryPiを起動してログインします。
必要に応じて、

```

sudo raspi-config
```
を行うのがいいでしょう。

キーボード、マウス、ディスプレイを使ってログインしたときにはキーボードの設定を行っておかないと使いづらいでしょう。同時に、ロケールの設定、タイムゾーンの設定も行っておきます。
sshを使ってログインするときはキーボードの設定は必要ないので、ロケールやタイムゾーンを気にしなければ必ずしもsudo raspi-configは必要ありません。
sshを使ってログインするときにはRaspberyPiのIPアドレスを調べる必要があります。そのやりかたはこちら
「同じLAN内に接続したRaspberry PiのIPアドレスを調べる」
https://qiita.com/xshell/items/af4e2ef8d804cd29e38e
RaspberryPiを無線LANでネットワークに接続する場合は起動する前にアクセスポイントの設定をしておく必要があります。

### カメラを使用可能にする
```

sudo raspi-config
```
として、「5 Interfacing Options」を選びカメラをEnableにしrebootします。

# パッケージをインストールする

今回の主な環境は OpenCV2.4 + Python2.7 で構築しました。

## opencv および pythonに必要なライブラリをインストールします。
今回はopencvはパッケージをつかってさくっと。

```

sudo apt update
sudo apt install python-dev python-opencv libopencv-dev


```

## pipをインストールし、pipから必要なライブラリをインストールします。

```

wget https://bootstrap.pypa.io/get-pip.py

sudo python get-pip.py

sudo pip install --upgrade pip
sudo pip install imutils picamera[array] Flask 
  
```
Ruby,Rails,HTML,CSS,JSの概要

#HTML
HyperText Markup Language（ハイパーテキスト マークアップ ランゲージ）の略。
ハイパーテキストとは複数の文書を相互に結びつけたもの。テキストを超えるテキストの意からハイパーテキストと呼ばれる。マークアップとは素のテキストにタグを付与することで意味づけをしていくこと。
Webサイトの基本となるテキスト部分をこれで記述していく。
HTMLと後述のCSSはプログラミング言語ではなく、マークアップ言語である。

#CSS
Cascading Style Sheets（カスケーディング・スタイル・シート）の略
カスケーティングは原義的には「何段も連なった小さな滝」のこと。
WebデザインにおけるCSSはHTMLで作ったWebページを装飾するための言語。
HTMLで記述した文字の色やフォントのサイズ、背景色などのスタイルをCSSで定義する。

#JavaScript
プログラミング言語の一つ。Javaと名前は似ているがまったく関係ない。
Webページに組み込むことでプログラムをブラウザ上で動作させる。
HTMLとCSSで書かれたページに「動き」をつけることができる
エディタとブラウザさえあればすぐに実行できるので開発や学習のハードルが低い。

#Ruby
日本人のまつもとゆきひろさんによって開発された、サーバーサイドのプログラミング言語の一つ。
Webサイトはおおまかに、Webサイトを訪れた利用者の目に見える部分（クライアントサイド）と、利用者の目には見えない部分（サーバーサイド）に分けられる。
前述のJavaScriptはクライアントサイドの言語である。
サーバーサイドはクライアント（利用者のブラウザ）からのリクエストに応えてサーバー上でプログラムを実行し、実行結果をクライアントに返す。
Rubyは読みやすく、設計思想として「楽しく書ける」ことが重視されている言語である。

#Ruby on Rails
Rubyのフレームワークの一つ。フレームワークとは開発において頻繁に使う機能をまとめたもの。これを利用することで一から作る必要がなく、楽に開発ができる。
RubyのフレームワークはRuby on Rails以外にもあるが、実際に使われるのは大半がRailsである。
reduceの途中経過を使う

某質問サイトの質問で思いついたものなのですが、僕の中のreduceの有用性が大幅にアップしたので書いておきます。

**UIKitってよくわからないのでちゃんと動くのかわかりません**
雰囲気で！

#### 文字列の配列からラベルを作成し並べて表示する

```swift

let view = UIView()

["Label01", "Label02", "Label03", "Label04"]
  .map { title -> UILabel in
    let label = UILabel()
    label.text = "\(title)"
    label.font = UIFont.systemFont(ofSize: 15)
    label.textColor = UIColor.white
    label.textAlignment = .center
    label.sizeToFit()

    return label
  }
  .reduce(CGFloat(0)) { left, label in

    label.frame.origin = CGPoint(x: left, y: 40)
    view.addSubview(label)

    return left + label.frame.size.width
}
```
ESP-WROOM-02でサーボを動かすならサーボのコネクタピンを入れ替えると便利(小ネタ)

#はじめに
みなさんIOT楽しんでいますか？
[ESPr® Developer（ピンソケット実装済）](https://www.switch-science.com/catalog/2652/)
![](https://docid81hrs3j1.cloudfront.net/contents/large/IMG_0996_500.jpg)
ピンソケット実装済みだとプロトタイピングに便利ですよね。

[マイクロサーボ　ＳＧ９２Ｒ](http://akizukidenshi.com/catalog/g/gM-08914/)
オスオスのジャンパワイヤで繋いでいると、ふとしたことで外れてこの線どこにつなぐんだっけ？とソースコード眺めたり、第一見た目が雑然としていてイライラしたり、精神的に良くないですよね。
ESP-WROOM-02のピンソケットとサーボのJRタイプのコネクタを、ピンヘッダで直結する方法を考えてみました。

##ESP-WROOM-02のピンアサイン(電源側のみ抜粋
- GND
- IO16
- TOUT
- RESET
- IO5
- TXD
- RXD
- IO4
- GND
- VOUT

IO4からPWMを出力できればうまくいきそう。
メーカの諸元を見るとPWMとして使えるのは

>IO12 (R), IO15 (G),IO13(B)

とのことだが、IO4に繋いだら動いたので良し

##JRタイプのピンアサイン

![ＪＲタイプ](http://akizukidenshi.com/img/goods/2/M-08914.jpg)
(茶)GND,(赤)+V[電源]が逆なら良いのに・・・
ピンを入れ替えれば、行けそう。
QIタイプのコネクタと違って爪が小さくて辛い・・・

##完成

余ってるピンヘッダ3つ分切って、互いのピンソケットに程よい長さになるように調整して完成

![20180119132854_noexif.jpg](https://qiita-image-store.s3.amazonaws.com/0/188540/212209d5-4f30-5b2d-0f9e-6ccb531f2834.jpeg)
Project Euler Q65 【e の近似分数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$2$の平方根は無限連分数として書くことができる.

```math
\sqrt{2}=1+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+・・・}}}}
```

無限連分数である $\sqrt{2} = [1;(2)]$ と書くことができるが, $(2)$ は$2$が無限に繰り返されることを示す. 同様に, $\sqrt{23} = [4;(1,3,1,8)]$.

平方根の部分的な連分数の数列から良い有理近似が得られることが分かる.$\sqrt{2}$の近似分数について考えよう.

```math
1+\frac{1}{2}=\frac{3}{2} \\
1+\frac{1}{2+\frac{1}{2}}=\frac{7}{5} \\
1+\frac{1}{2+\frac{1}{2+\frac{1}{2}}}=\frac{17}{12} \\
1+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2}}}}=\frac{41}{29}
```

従って, $\sqrt{2}$の近似分数からなる数列の最初の10項は：

$1, \frac{3}{2}, \frac{7}{5}, \frac{17}{12}, \frac{41}{29}, \frac{99}{70}, \frac{239}{169}, \frac{577}{408}, \frac{1393}{985}, \frac{3363}{2378}, ...$

もっとも驚くべきことに, 数学的に重要な定数,
$e = [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...].$

$e$ の近似分数からなる数列の最初の$10$項は：

$2, 3, \frac{8}{3}, \frac{11}{4}, \frac{19}{7}, \frac{87}{32}, \frac{106}{39}, \frac{193}{71}, \frac{1264}{465}, \frac{1457}{536}, ...$

$10$項目の近似分数の分子の桁を合計すると$1+4+5+7=17$である.

$e$ についての連分数である近似分数の$100$項目の分子の桁の合計を求めよ.

## アプローチ
$[2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...]$を$\\{b_n\\}$とおき、
$b_0=2$、$b_1=1$、$b_2=2$、$b_3=1$、$b_4=1$、$b_5=4$...とする。
$e$の近似分数表記を数列$\\{a_n\\}$で表記する。

```math
a_1=b_0+\frac{1}{b_1}=2+\frac{1}{1}=\frac{3}{1} \\
a_2=b_0+\frac{1}{b_1+\frac{1}{b_2}}=b_0+\frac{b_2}{b_1b_2+1}=2+\frac{2}{3}=\frac{8}{3} \\
a_3=b_0+\frac{1}{b_1+\frac{1}{b_2+\frac{1}{b_3}}}=b_0+\frac{b_2b_3+1}{b_3(b_1b_2+1)+b_1}=2+\frac{3}{4}=2+\frac{3}{4}=\frac{11}{4} \\
a_4=b_0+\frac{1}{b_1+\frac{1}{b_2+\frac{1}{b_3+\frac{1}{b_4}}}}=b_0+\frac{b_4(b_2b_3+1)+b_2}{b_4(b_3(b_1b_2+1)+b_1)+b_1b_2+1}=2+\frac{5}{7}=\frac{19}{7} \\
a_5=b_0+\frac{1}{b_1+\frac{1}{b_2+\frac{1}{b_3+\frac{1}{b_4+\frac{1}{b_5}}}}}=b_0+\frac{b_5(b_4(b_2b_3+1)+b_2)+b_2b_3+1}{b_5(b_4(b_3(b_1b_2+1)+b_1)+b_1b_2+1)+b_3(b_1b_2+1)+b_1+1}=2+\frac{23}{32}=\frac{87}{32} \\
・・・ \\
```

以上より$3<=n$に対して、

```math
a_n=b_0+\frac{b_n*(a_{n-1}-b_0の分子)+(a_{n-2}-b_0の分子)}{b_n*(a_{n-1}-b_0の分母)+(a_{n-2}-b_0の分母)}
```

であることが分かる。

上記を$a_1$、$a_2$にも適応できるように下記を定義する。

```math
a_0=b_0+\frac{0}{1} \\
a_{-1}=b_0+\frac{1}{0}
```

この法則に従い、$a_{99}$を求めればよい。

## 解答

```bash
time seq 99 |
awk 'a=($1+1)%3==0{print $1,2*($1+1)/3} !a{print $1,"1"}' |
awk -M 'BEGIN{s[-1]=1;b[-1]=0;s[0]=0;b[0]=1}{s[$1]=$2*s[$1-1]+s[$1-2];b[$1]=$2*b[$1-1]+b[$1-2];print $1,s[$1]+2*b[$1],b[$1]}' |
awk '$1==99{print $2}' |
awk -v FS= '{for(i=1;i<=NF;i++){s+=$i};print s}'
272

real    0m0.125s
user    0m0.015s
sys     0m0.229s
```

この問題はアプローチにかなり時間がかかりましたが、なんとか自力で解けました！
よかったです。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/065.html
【PostgreSQL】別DBのテーブルのレコードをコピーする

別DBのテーブルのレコードをまるっとコピーしたかったので、以下でやりました

```
$ PGPASSWORD=パスワード psql -h ホスト名 -U ユーザ名 -p ポート番号 -d コピー元のDB名 -c "COPY (SELECT * FROM コピー元のテーブル名 WHERE ~ ) TO STDOUT" | PGPASSWORD= パスワード psql -h ホスト -U ユーザ名 -p ポート番号 -d コピー先のDB名 -c "COPY コピー先のテーブル名 FROM STDIN"
```


注意すべきは以下の2点

* コピー先のテーブルは先に作っておく
* カラムの順番も含めて、テーブルの定義はコピー元と同一にする必要がある

自分は後者の方でエラーが出たりなどしました。コピーの時はカラム名などは特に考慮せずに、順番そのままにinsertしようとするようです。
Django2.0以降の変更点で気づいたポイント:引数つきのpath設定

###転載元ブログ情報

この記事は自分のブログの転載です。是非遊びに来てください〜
Django2以降の変更点で気づいたポイント:引数つきのpath設定
http://k-mawa.hateblo.jp/entry/2018/01/18/235310

#本編

Django2になり、path設定が変わりましたが、今回は引数付きのurl設定です。

Django1.10
api/urls.py

```
from django.conf.urls import url
from .views import (
    ○○DetailAPIView,
)

url(r'^(?P<pk>[0-9]+)/$', ○○DetailAPIView.as_view(), name='detail'),
```
↓
Django2
api/urls.py

```
from django.urls import path
from .views import (
    ○○DetailAPIView,
)

path('<int:pk>', ○○DetailAPIView.as_view(), name='□□')

```
参考記事
[https://docs.djangoproject.com/en/2.0/releases/2.0/:title]
Django2.0以降の変更点で気づいたポイント:path設定 "path"を使ったinclude

###転載元ブログ情報

この記事は自分のブログの転載です。是非遊びに来てください〜

http://k-mawa.hateblo.jp/entry/2018/01/10/004238

#本編

###エラーが出たところから報告
もしかしたら、Django2系特有じゃないかもしれないのですが、Django2系扱って「あれ？」と思ったところが同じ人には役立つかもです^^ とりあえず下記は通った設定です。

###変更点:urls.pyのパスの指定の仕方が変わった"path"を使ったinclude

Django1.8  
settings.pyのあるディレクトリのurls.py

```python
from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('<アプリ名>.urls', namespace='<アプリ名>')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
Django2.0

settings.pyのあるディレクトリのurls.py

```python
from django.contrib import admin
from django.urls import include, path
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('<アプリ名>.urls')),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
Django1系と2系でpathという新しい指定の仕方が登場しています。includeとpathの組み合わせは上記でエラーなく行けました。一方でstaticファイルの指定方法は一緒でした。

###参考記事
https://docs.djangoproject.com/en/2.0/releases/2.0/
IngressのスキャナのVer.upを誰よりも速く知る方法 v2

#はじめに
過去に[IngressのスキャナのVer.upを誰よりも速く知る方法](https://qiita.com/nuwaa/items/53e51fe5e81509e7f900)を公開していました。
が、2018/01/19の日本時間の06:30頃でしょうか。iOSアプリのダウンロードサイトのレイアウトに大幅な変更があったようです。
これに伴い、ずーっと問題なく動作していたスクリプトに不具合が発生したため、修正版をリリースします。

#していたこと

・cronで15分毎に以下のWebページをチェックしていました
　・Android版
　　　https://play.google.com/store/apps/details?id=com.nianticproject.ingress&hl=ja
　・iOS版
　　　https://itunes.apple.com/jp/app/ingress/id576505181?mt=8

つまり、
```0,15,30,45 * * * * /home/nuwaa/scanner_chk/go
```ってことです。

で、goの中身はというと、

```
cd /home/nuwaa/scanner_chk

wget -q -O ANDROID "https://play.google.com/store/apps/details?id=com.nianticproject.ingress&hl=ja"
AV=`cat ANDROID | sed "s/</\n</g" | grep "softwareVersion" | sed -e "s/<[^>]*>//g"`
echo `date +"%Y/%m/%d %H:%M:%S "`$AV >> android
OLD=`tail -n 2 android | head -n 1 | awk '{print $3}'`
NOW=`tail -n 1 android | awk '{print $3}'`
if [ $OLD != $NOW ]; then
  echo "Android" | mail -s "Scanner Update" **自分のメールアドレス**
fi

wget -q -O IOS "https://itunes.apple.com/jp/app/ingress/id576505181?mt=8"
IV=`cat IOS | grep "バージョン" |  sed -e "s/<[^>]*>//g"  | awk '{ sub("{\"data\".*$",""); print $0; }' | awk '{print $2}'`
echo `date +"%Y/%m/%d %H:%M:%S "`$IV >> ios
OLD=`tail -n 2 ios | head -n 1 | awk '{print $3}'`
NOW=`tail -n 1 ios | awk '{print $3}'`
if [ $OLD != $NOW ]; then
  echo "iOS" | mail -s "Scanner Update" **自分のメールアドレス**
fi

rm ANDROID IOS
```
となります。
上記スクリプトは前半がAndroidアプリのパーションの差異を、後半がiOSアプリのバージョンの差異をチェックして、差異があったらメールするようにしていますので、仕組みに興味がある方は、[過去の記事](https://qiita.com/nuwaa/items/53e51fe5e81509e7f900)と見比べてみてください。
Switch Embedded Teamingの設定方法

Hyper-V上に作成する仮想スイッチはタグVLANを処理できるが、WindowsServer2012R2から搭載されたOS標準のチーミング機能を利用してチーミングしたアダプターを介するとタグVLANを処理できなくなる。（チーミングアダプタがVLANタグを消してしまい、仮想マシン処理側で認識不能になる。）
そこで、Switch Embedded Teaming(以下、SET)を用いてチーミングすることにする。


## SETを有効にした仮想スイッチを作る

```ps1:PowerShell
New-VMSwitch -Name {仮想スイッチ名} -NetAdapterName {NIC名1},{NIC名2...} -EnableEmbeddedTeaming $true
【例】
New-VMSwitch -Name "trunk-setup" -NetAdapterName "NIC2","NIC3" -EnableEmbeddedTeaming $true
```

コマンドで作成した仮想スイッチは管理用アクセス(ホストと共用)インタフェースとして作成されるが、不要であればHyper-V管理マネージャーから外してしまっても良い。
仮想マシン上でVLANタグを設定する方法に変更はない。


## 管理用インタフェースのVLANタグを指定する

```ps1:
Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName {仮想スイッチ名} -Access -VlanId {VLAN-ID}
【例】
Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName "trunk-setup" -Access -VlanId 1
```


## 参考:
http://d.hatena.ne.jp/ogawad/20161130/1482576719
http://d.hatena.ne.jp/ogawad/20170116/1484526504
http://d.hatena.ne.jp/ogawad/20120611/1339368688
Django REST Framework でのCRUD実装時の基本構成 UpdateAPIView

###転載元ブログ情報

この記事は自分のブログの転載です。是非遊びに来てください〜

Django REST Framework メモ :: CRUD :: UpdateAPIView
http://k-mawa.hateblo.jp/entry/2018/01/19/021346

参考：公式リファレンス
[http://www.django-rest-framework.org/#api-guide:embed:cite]

Django REST Framework の基本構成メモです。
CRUDのうちのUpdateの構成です
個別のインスタンスを呼び出すので引数つきのURLになります。

 - Django2
  
###api/urls.py
```
from django.urls import path
from .views import (
    □[クラス名]□UpdateAPIView,
    )

urlpatterns = [
   path('detail_articles/<int:pk>/editing', □[クラス名]□UpdateAPIView.as_view(), name='updating')
]
```
※引数とpath設定がDjango1系とは異なります



[http://k-mawa.hateblo.jp/entry/2018/01/18/235310:embed:cite]



###api/serializers.py
```
from rest_framework.serializers import (
    ModelSerializer,
    )


from □[アプリ名]□.models import *

class □[クラス名]□DetailSerializer(ModelSerializer):
    class Meta:
        model = □[クラス名]□
        fields = [
            '■[フィールド名]■',
            '■[フィールド名]■',
        ]
```
※Detailの表示のときにつかったSerializerを共用できるのがポイントあたらしくSerializerつくらなくてOK

###api/views.py
```
from rest_framework.generics import (
    UpdateAPIView
（もしくはRetrieveUpdateAPIViewでもOK）
    )

from □[アプリ名]□.models import *

from .serializers import (
    □[クラス名]□DetailSerializer, 
    )

class □[クラス名]□UpdateAPIView(UpdateAPIView):
    queryset = □[クラス名]□.objects.all()
    serializer_class = □[クラス名]□DetailSerializer
    lookup_field = 'pk'

```

基本構成はこんな感じです。
Android おぼえがき①

自分用Androidメモ

### Calendar: 古いAPIだと使えない
- java.util.Calendar を使う

### Calendar: 月の最後の日を取得したい
```java
Calendar cal = Calendar.getInstance();
int max_day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
```

### アプリ終了後も変数を保存したい
- SharedPreferencesを使う

http://android.roof-balcony.com/shori/strage/preference/
http://androidhacker.blog94.fc2.com/blog-entry-89.html

c.f. Activityのライフサイクルについて
https://qiita.com/m2mtu/items/ac0d61e884519a4c61bb

### ActionBarを非表示にしたい(簡単に)
```java
getSupportActionBar().hide();
```

### BottomNavigationView: itemの選択がおかしい
- Activityで書かない、Fragmentを使う
- Activityで書いちゃったら、switchの各caseのreturnをfalseにする

### TableLayout: 同じ行の他のセルを取得したい
- getParent(), getChildAt(int position)を使う

```java
TableRow parentRow = (TableRow)view.getParent();
String p_day = ((TextView)parentRow.getChildAt(0)).getText().toString();
```

### SQLite: なぜか不具合が起きる
- いったんアプリをアンインストールする

### SQLite: 複数条件指定したい
```java
db.update("records", cv, "ym = ? AND day = ?", new String[]{p_ym, p_day})
```

### SQLite: レコードがあればupdate、なければinsertしたい
- db.updateの戻り値(=更新されたレコード数)を使う

```java
res = db.update("records", cv, "ym = ? AND day = ?", new String[]{p_ym, p_day});
if (res < 1){
   // record doesn't exist
   cv.put("ym", p_ym);
   cv.put("day", p_day);
   db.insert("records", null, cv);
}
```

### SQLite: データベースの中身を見たい
- Android StudioのTerminalを使う

```
> cd c:\Users\<ユーザー名>\AppData\Local\Android\sdk\platform-tools
> adb shell
> su
> cd data/data/<パッケージ名>.<アプリ名>/databases
> sqlite3 <データベース名>
> <SQLを入力>
```
### TextView: テキストサイズをspで設定したい
```java
TextView tv;
// tvを取得
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20)
```

### EditText: 改行できないようにしたい
```java
editText.setInputType(InputType.TYPE_CLASS_TEXT);
```

### EditText: Doneキーをつけたい
```java
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
```

### EditText: Doneキーが押されたらなんかしたい
```java
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE){
        // 何かする

        // キーボードを閉じる
        InputMethodManager manager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
    }
    return true;
}
```

### TimePickerDialog: 3つ目のボタンをつけたい
```java
TimePickerDialog tpg = null;
// tpgを初期化する
tpg.setButton(DialogInterface.BUTTON_NEUTRAL, "DELETE", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        // 何かする
    }
});
```


### dp→pxに変換したい
```java
private int dpToPx(int dp){
    int px = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()));
    return px;
}
```
(未解決) pySerial 3.* + Ubuntu 16.04 LTS > OSError: [Errno 5] Input/output error | RPi + Python 2.7.9 + pySerial 2.6-1.1では問題ない

```txt:動作環境
Ubuntu 16.04 LTS desktop amd64
Python 3.5.2
Python 2.7.12
```

前回: [pySerial + CentOS 6.8 > Python 2.6は対応しない (ValueError: zero length field name in format) | Python 2.7は対応してそう > Python 2.7と3.6ではConnection timed out](https://qiita.com/7of9/items/e9c11a861ac21b6627c3)

CentOS6.8ではpySerialの動作がうまくいかなかった。
Ubuntu 16.04ではどうか。

### 概要

pySerialでのテキスト送信時に以下のエラーが出る。

> OSError: [Errno 5] Input/output error

### code

```write_test_180119.py
import serial
import time


def main():
    print("Hello")
    con1 = serial.Serial('/dev/ttyUSB0', 9600, timeout=10)
    str1 = b'from0\n'
    con1.write(str1)
    con1.close()

if __name__ == '__main__':
    main()

```

### 発生

上記のスクリプトを何回か実行していると発生する。
一度エラーが出ると、それ以降の送信はすべて失敗する。

USBを抜き差しすることで送信可能状態に戻るが、送信を繰り返すうちに同じ症状に陥る。


### Raspberry Pi

Raspberry Piで使っていたpySerialを確認してみた。

```
python-serial 2.6-1.1
```

Python 2.7.9からループバックテストコードを実行すると問題なく動作した。
Django REST Framework でのCRUD実装時の基本構成 CreateAPIView

###転載元ブログ情報

この記事は自分のブログの転載です。是非遊びに来てください〜

Django REST Framework メモ :: CRUD :: CreateAPIView
http://k-mawa.hateblo.jp/entry/2018/01/19/014627

参考：公式リファレンス
[http://www.django-rest-framework.org/#api-guide:embed:cite]

Django REST Framework の基本構成メモです。
CRUDのうちのCreateの構成です

 - Django2
  
###api/urls.py
```py
from django.urls import path
from .views import (
    □[クラス名]□CreateAPIView,
    )

urlpatterns = [
   path('creating_api', □[クラス名]□CreateAPIView.as_view(), name='creating_api')
]
```
※引数とpath設定がDjango1系とは異なります



[Django2以降の変更点で気づいたポイント:引数つきのpath設定 - まわ](http://k-mawa.hateblo.jp/entry/2018/01/18/235310)

###api/serializers.py
```py
from rest_framework.serializers import (
    ModelSerializer,
    )


from □[アプリ名]□.models import *

class □[クラス名]□CreateSerializer(ModelSerializer):
    class Meta:
        model = □[クラス名]□
        fields = [
            '■[フィールド名]■',
            '■[フィールド名]■',
        ]
```

###api/views.py
```py
from rest_framework.generics import (
    CreateAPIView
    )

from □[アプリ名]□.models import *

from .serializers import (
    □[クラス名]□CreateSerializer, 
    )

class □[クラス名]□CreateAPIView(CreateAPIView):
    queryset = □[クラス名]□.objects.all()
    serializer_class = □[クラス名]□CreateSerializer
```

基本構成はこんな感じです。
FuelPHPのmonologでメモリ使用量が増え続けたお話

##tl;dr
FuelPHPを用いたバッチ処理が遅いので調べて見たら、Monolog\Logger::\$processorsにログ出力内容を全て配列に保持しててメモリ食いつぶしてた
⇒保持したものを定期的に消すようにしたら解消した

というお話です

##環境
- 言語：PHP5.6
- フレームワーク：FuelPHP 1.8

##きっかけ
以下のような案件（処理内容は割愛）

- 対象は「DBから取得したレコードをループで回し、とある条件にヒットしたものをファイルに出力する」というPHPで作成されたバッチ
- 上記バッチが、最初はサクサク処理されるが、数分で目に見えてパフォーマンスが落ち、その後も処理速度がどんどん遅くなっていくため、このままでは大量件数を処理できない可能性がある
- 実装に簡単に目を通したところ、ループ内でDBから取得してきたデータを配列にずっと追加・保持しており、それを最後にファイル出力しているのが原因そう
- なので、適宜ファイル出力しちゃって配列にデータ保持しないようにして改善してくれ

##調査経緯

###1. メモリ使用量、処理速度の調査
まずは配列に溜め込んでいるところが本当にボトルネックになっているのかを確かめるため、メモリ使用量と1件ごとの処理速度をログに出力するようにした
⇒メモリ使用量は右肩上がりで増え続け、1件ごとの処理速度もどんどん遅くなっていった

###2. 配列格納処理の削除
今度は配列に格納しつづけているのが本当に原因なのかを確認するため、1件ごとのデータを配列に格納・保持せず随時ファイルに出力していくよう変更して実行してみた
⇒メモリ使用量、処理速度ともにほぼ変化なし（0.1％単位ではマシなったかも？）

＃FuelPHP側でメモリを解放せずに掴んだままにしている可能性がある？と疑い始める

###3. メモリ使用量増加タイミングの調査
メモリ増加原因のアテが外れて、何の処理でメモリが増え続けているのかを断定する必要がでてきたので、バッチのビジネスロジックのステップごとにログを出力してメモリ増加の様子を確認
⇒なぜかメモリ使用量が倍近くまで増える

＃ここでFuelPHPのログ出力周りが怪しいことに気が付く

###4. FuelPHPのmonologを継承したloggerの処理内容を確認
このバッチではLTSV形式のログを出力しており、
Monolog\Logger::pushProcessor()で
出力するTLSVの項目と値を作成する関数をMonolog\Logger::\$processorsに格納していた

```php5:monologを継承したlogger
class Logger extends \Monolog\Logger
{
    public function log($level, $message, array $context = array())
    {
        $this->pushProcessor(function ($record) {
            $record['$ログ項目$'] = $値$;
        });
        return parent::log($level, $message, $context);
    }
}
```

このMonolog\Logger::pushProcessor()で格納された関数は、この後削除されている様子がなかったため、メモリが増加していくのではないかと踏んだ

###5. processorの削除
Monolog\Logger::popProcessorというメソッドで先頭1件のprocessorが削除できるようなので、ログ出力の度にそれを行うよう修正

```php5:monologを継承したlogger（修正後）
class Logger extends \Monolog\Logger
{
    public function log($level, $message, array $context = array())
    {
        if (!empty($this->processors)) {
            $this->popProcessor();
        }

        $this->pushProcessor(function ($record) {
            $record['$ログ項目$'] = $値$;
        });
        return parent::log($level, $message, $context);
    }
}
```
⇒メモリが増加しないようになり、処理時間も経過時間によって遅くなっていく現象は起きなくなった

##考察・結論
- monologのpushProcessorを使うときは、ログを大量に出すような処理は使わないようにするか、もしくは逐一popProcessorで出力済みの内容を削除しよう
- そもそもFuelPHP（というかPHP）自体、バッチ処理ではなくWebページのサーバ側の処理でリクエスト単位にプロセスが終了するプロダクトに適した言語なので、
　学習コストがかからないからといって全部PHPで済まそうというのはやめた方がいいかも…
- このprocessorを溜め込まないようにする設定値などがあるか調査してみたが、有益な情報は得られず…
　というかそもそもログ内容溜め込んでいくことについて記載のあるページが見当たらないので、もし誰か知っていたら教えてください

以上
フェードイン・フェードアウトをcssのみで実装

 フェードイン・フェードアウトは、JQueryで実装されていますが、cssアニメーションを含めたクラスの付け替えのみで行う方法がありましたので、投稿いたします。


## 事前知識
display: none; → display: block 
この遷移をさせる要素に対して、transitionをかけることは、できません。
（transition: display 1s ease 0sの指定は動作しません。）
 恐らく、レンダリングツリーからの削除が影響していると思われます。
（レンダリングにおいて、レンダリングツリーの生成・変更が先に行われてから、位置や色の調整が行われるため）

## モーダルの表示・非表示
検索すると、opacityを使用してアニメーションを行う方法をよく見かけると思いますが、<font color="red"> opacity: 0</font>だけでは、クリックできてしまいます。そこで、<font color="red">pointer-events: none</font>を使用してクリックを防ぎます。

```scss
.modal {
  pointer-events: none;
  position: fixed;
  opacity: 0;
  transition: opacity 1s ease 0s;
  z-index: 0; 
	&.is-active {
		opacity: 1;
		pointer-events: auto;
     }
}
```
あとは、表示させたい時に、is-activeクラスを付与、非表示にしたい時に、is-activeクラスを削除することで、アニメーションをしながら表示・非表示が可能になります。

## スライドショーの表示・非表示
上記を応用することで、スライドショーをクラスの付け替えのみで作成することができます。

```scss
 ul {
	position: relative;
	height: 100%; /* 場合によっては不要かも  */
	li {
		opacity: 0;
		pointer-events: none;
		transition: opacity 1s ease 0s;
		position: absolute;
		z-index: 0;
		&.is-active {
			opacity: 1;
			pointer-events: auto;
			z-index: 1;
        }	
	} 	
}  
```
 active状態の要素のみz-indexを高めることで、表示させています。


## jQueryでのモーダル
jQueryのfadeInメソッド・fadeOutメソッドでは、アニメーションの終了を待たずして、次々と処理が実行されていくため、
アニメーションが止まった後に処理を実行させるなどの対応が必要になります。
また、チラつきも起こることがあります。

## 懸念点
非表示コンテンツを使用しているため、スパムと捉えられてしまう可能性が考えられます。 

## 所感
pointer-eventsプロパティ1つで問題を解決できたのは驚き。
pointer-eventsについての記述が少ないのが不思議
windowsの.batバッチファイルで文字列を置換する

windowsの.batバッチファイルで文字列を置換する

# 論よりコード

```bat:replace.bat
echo off
set tikan1=りんご
set tikan2=みかん
echo 置換開始
setlocal enabledelayedexpansion
for /f "delims=" %%A in (C:\copy_base\hoge.txt) do (
    set line0=%%A
    set line1=!line0:copy_base1=%tikan1%!
    set line2=!line1:copy_base2=%tikan2%!
    echo !line2!>>C:\after\hoge.txt
)
endlocal
echo 置換完了
pause
```

```C：\copy_base\hoge.txt
Hello World
私はcopy_base1よりもcopy_base2が好きです
```

```C：\after\hoge.txt
Hello World
私はりんごよりもみかんが好きです
```

### 解説
C:\copy_base\hoge.txtのファイルの中の
copy_base1をりんご
copy_base2をみかんに置換して
C:\after\hoge.txtとする

やってることはファイルを読み込んで１行ずつ置き換えて
echoで新規ファイルに書き込む。
echo off　は必須

### 注意点
これだけのコードだと
echoの都合で
・空行はなかったことにされる
・半角スペースしか無い行は　echo off が出力される
それらをどうにかするにはifなどで制御が必要かと思われる
今回は割愛

また、enabledelayedexpansionより
!マークが遅延演算子になるため無視され
!マークで囲まれていると消えてなくなる

つまり以下のようなjavaScriptコードだと

```C：\copy_base\hoge.js
var a = 100
var b = 200
var c = 100
if (a !== b && a !== c){
 alert("true")
} else {
 alert("false")
} 
```

```C：\after\hoge.js
var a = 100
var b = 200
var c = 100
if (a == c){
 alert("true")
} else {
 alert("false")
} 
```

となってしまう。!== b && a !が演算子となって消えてしまう。
たちの悪いことに上記例だとシンタックスエラーにはならないから気が付きづらい

こういう場合もとのファイルにかかれている！マークを^でエスケープしておくのが一番楽そうである

```C：\copy_base\hoge.js
var a = 100
var b = 200
var c = 100
if (a ^!== b && a ^!== c){
 alert("true")
} else {
 alert("false")
} 
```

### 文字化けしてしまう時
コンソールの設定がデフォルトの932(Shift-JIS)で
コピー元のファイルが65001(UTF-8)である時にありがち
chcp 65001
で文字コードを変えてしまえば良い

```bat:replace.bat
echo off
set tikan1=りんご
set tikan2=みかん
echo 置換開始
chcp 65001
setlocal enabledelayedexpansion
for /f "delims=" %%A in (C:\copy_base\hoge.txt) do (
    set line0=%%A
    set line1=!line0:copy_base1=%tikan1%!
    set line2=!line1:copy_base2=%tikan2%!
    echo !line2!>>C:\after\hoge.txt
)
endlocal
chcp 932
echo 置換完了
pause
```
JMockit使い方 自分のtest

1.marven install 

jmockit website : http://jmockit.github.io/gettingStarted.html


2.code demo

```java:CDY52177Test_021.java
package CDY52177;

import java.sql.SQLException;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;

import jp.co.toyota.py35401.dba.CDY52177;
import jp.co.toyota.pzd0001.CFZD0002;
import jp.co.toyota.pzd0001.CFZD0003;
import mockit.Mock;
import mockit.MockUp;
import mockit.integration.junit4.JMockit;

//@RunWith({PowerMockRunner.class})
@RunWith(JMockit.class)
@PowerMockIgnore({ "javax.management.*" })
@PrepareForTest({ System.class})
public class CDY52177Test_021   extends CDY52177_TestBase{

	/**
	 *
	 * @throws SQLException
	 * @throws CFZD0002
	 * @throws CFZD0003
	 */
	//@Test//(expected=CFZD0002.class)
	@Test(expected=ExceptionInInitializerError.class)
	public void runTest227() throws SQLException, CFZD0002, CFZD0003
	{
		System.out.println("テストプログラム実行"+this.getTestClass());
		this.commonMock1();

		new MockUp<System>()
	    {
	        @Mock
	        public String getenv(String string) {
	            return "/gsms/localenv/y5env.dat";
	        }
	    };

		CDY52177.y5sys_EnvSet();
		//assertThat(ret, CoreMatchers.instanceOf(int.class));
	}

	@Override
	public void setUpParameters() {
		System.out.println("setUpParameters");
		super.setUpParameters();
        //select  no data
		try {


        } catch (Exception e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

	}
}
```

重要なcomment:
@RunWith(JMockit.class)
@PrepareForTest({ System.class})
Windows Server2012R2 intel CPU脆弱性対応

1.サーバハードウェアでCPU脆弱性問題に対応したBIOSをインストール

修正プログラムインストールで再起動が走るので、BIOS適応時は再起動は実施しない。

2.Windows Updateの更新履歴でKBkb4056898が適応済みか確認する
WindowsUpdateで適応できない場合、下記サイトからMicorsofut Updateカタログよりインストーラをダウンロード
https://support.microsoft.com/ja-jp/help/4056898/windows-81-upMidate-kb4056898?tduid=(f4734a0a05fb640207c4879f35dedcac)(256081)(2457211)(C4kK9Npmq74-tkzNejmURRb6ObsuUo6_Eg)()

3.レジストリを変更　コマンドプロンプトを管理者として実行
修正プログラムを有効にするには

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v FeatureSettingsOverride /t REG_DWORD /d 0 /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization" /v MinVmVersionForCpuBasedMitigations /t REG_SZ /d "1.0" /f 

4.サーバ再起動
パワーシェルを管理者で実行
PS　C:\>Get-SpeculationControlSettings

5.
ステータスを確認
結果が緑文字でTrueとなっていれば適応済み

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/232243/32c8a34c-01f8-a4e7-ab77-58e3a449c675.jpeg)
SpamAssassin の HELO_LOCALHOST 警告の意味

SpamAssassin の HELO_LOCALHOST 警告の意味について調べました

* 公式サイトをみたが、記載が見当たらない
* OSS なので GitHub を調査
  * [L138 - spamassassin/20_basic.cf at f2d8880958d5912505beb4c61c2396386d0ef7f0 · apache/spamassassin](https://github.com/apache/spamassassin/blob/f2d8880958d5912505beb4c61c2396386d0ef7f0/rulesrc/sandbox/jm/20_basic.cf#L138)

```perl
# HELO as localhost.  we should really be rejecting this at MTA, but hey.
# it seems most of us let these slip through our MTA configs; 3% of spam, no FPs
header HELO_LOCALHOST   X-Spam-Relays-External =~ /^[^\]]+ helo=localhost /i
```

名前のままですが、 helo が localhost のときの警告でした。

## 関連情報
* [SpamAssassin: Welcome to SpamAssassin](http://spamassassin.apache.org/)
【勉強会まとめ】サービスを Ruby / Rails で成長させるためにやったこと

# はじめに
[「サービスを Ruby / Rails で成長させるためにやったこと」](https://mwed.connpass.com/event/74613/)に参加して来ました。
そのときのまとめを留めておきます。

今回、勉強会を開催してくださった会社：[メドピア株式会社](https://speakerdeck.com/fukumura/rails-decheng-chang-saserutameniyatutakoto) / [株式会社みんなのウェディング](https://www.mwed.jp/)

ハッシュタグ：#medpeer_mwed

# テーマ

- どうやってチームで開発力をつければいいのか悩んでいるがどうしたらいいの？
- サービスの改善をどうやってスピーディーに行うの？
- Ruby on Rails へのシステム移行（や、その周辺システムとの接続部分）はどうしたらいいの？

とあったんですけど、実際に参加してみたら話の内容として、
他の言語からRuby(Rails)へ移行するときに困ったことってのが多かった気がします。

# 内容
勉強会の詳しい中身は、タイムテーブル通りです。

## 新卒研修の OJT で学んだこと
新卒一年目の方が、[Mobasif](http://d.hatena.ne.jp/keyword/MobaSiF)からRailsへ移行するときに、DB周りの改修で困ったことを発表

- テーブル、カラム名に略語が使用されていて、それが何を表すのかわからなかった
- 使用されていないカラムが多かった
- マルチカラムアトリビュートアンチパターンの解消

またデータ移行に関しては、
SQL直書き + Railsで頑張ったとのこと。
反省として、`ActiveRecord::Base.connection`を使えばよかったと。

[当日の資料](https://speakerdeck.com/kiyokuro/xin-zu-gaminnafalseuedeingude-mobasifworailsniyi-xing-sitemita-teburushe-ji-bian)がアップされました。

## [Webpacker](https://github.com/rails/webpacker)導入時におさえておきたい設定
- webpackを扱うためのラッパーgem
- rails5.1から導入(5.1じゃなくても使える)

### あったほうがいい設定&忘れがちな設定
３つ紹介されました。

#### ① CommonsChunkPlugin
複数のエントリーポイント間で利用している共通モジュールをバンドルしたファイルを出力するプラグイン

メリットとしては、

- 全体のファイルサイズが小さくなる
    - 複数のエントリーポイントが1つの共通ファイルを利用するため

- ファイルの読み込み速くなる
    - 共通ファイルなのでキャッシュを活用できる

[こちらの記事](https://qiita.com/soarflat/items/f8212434c4c3cb8ee00d#commonschunkplugin%E3%81%A8%E3%81%AF)にも詳細載ってました。

#### ② babel-polyfill と babel-plugin-transform-runtimeについて

- babel-polyfill
    - エントリーポイントの先頭にimportしないといけない
    - グローバルスコープの汚染

- babel-plugin-transform-runtime
    - 複数エントリファイルから呼び出していても問題無い
    - グローバルスコープ汚染をしない
    - ただ、インスタンスメソッドの`[1,2,3].inclues(3)`とかは変換出来ない（なかなかつらそう）

他に参考になりそうな記事

- [babel-polyfillとbabel-runtimeの使い分けに迷ったので調べた](https://qiita.com/inuscript/items/d2a9d5d4daedaacff924)


#### ③ rails-ujs

- ajax通信のget以外をよしなにやってくれる

参考記事は[こちら](https://blog.tai2.net/webpacker3.html#rails-ujs)

<be>
上記3点の詳細のコードは[こちら](https://github.com/pipopotamasu/medpeer-mwed)に載っているそうです。
[当日の資料](https://speakerdeck.com/pipopotamasu/medpeer-x-minnafalseuedeinguhe-tong-mian-qiang-hui)がアップされました。

# メドピアの輪読会
発表の中でとくによかったなーと個人的に思ったのは、
本を読んでいくなかで、チームの「決めの問題」の部分を事前に議論できたというところでした。

ex)
Railsのcontrollerのonly/exceptどっち使う？などなど

[当日の資料](https://speakerdeck.com/motsat/metohiafalselun-du-hui)がアップされましたので、載せておきます。

# Rails移行のレキシ

[スライド](https://speakerdeck.com/matsuhisa/mobasif-to-ruby-on-rails2017)はこちらになります。
また、[こちらのスライド](https://speakerdeck.com/matsuhisa/mobasif-to-ruby-on-rails)は当日の発表では使用されていませんでしたが、関連しているので貼っておきます。
gcc 7.2.0 をソースからビルドする

手元のgccが古かったので、新しいものをソースからビルドしました。

基本的に [このページ](https://qiita.com/liveralmask/items/6ed4a98ebb3bf6b7f707)の内容をなぞっただけ。

```
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.2.0/gcc-7.2.0.tar.xz
tar xf gcc-7.2.0.tar.xz 

cd gcc-7.2.0/
./contrib/download_prerequisites 
cd ..

mkdir obj
cd obj

../gcc-7.2.0/configure --enable-languages=c,c++ --prefix=/usr/local --disable-multilib
make -j4 |& tee make.log
sudo make install
```

```
$ which gcc
/usr/local/bin/gcc
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-7.2.0/configure --enable-languages=c,c++ --prefix=/usr/local --disable-multilib
Thread model: posix
gcc version 7.2.0 (GCC) 
```

gccをビルドするには、いろいろ付随するライブラリも必要なのですが、contrib/download_prerequisites を実行すると自動で必要なものをダウンロードしてくれるのが便利でした。

configure のときに--disable-bootstrap をつけなかったので、3回ビルドしてテストしています。これだと時間はかかるものの、最終的にインストールされるものは、自分自身(=最新のgcc)でビルドしたものになるというメリットがある。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ノートPC上の仮想マシンの中でgccのビルドをうっかり始めてしまったら、全然終わらない。ファンが全開に回っているのは仕方ないとして、ビルドの進み方が遅いのは熱のためにクロックを大幅に下げているっぽい。ぐぬぬ。</p>&mdash; 組み込みの人。 (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/954233776074182656?ref_src=twsrc%5Etfw">2018年1月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

結局1時間くらいかかりました。