OmniAICreator/Qiita-1.07M huggingface dataset:
【C++】STLコンテナの特徴一覧

STLコンテナの特徴一覧

|コンテナ|特徴|- |- | 
|:-:|:-:|:-:|:-:|
|vector|要素を挿入する順番に意味がある|ランダムアクセス可能 |末尾への挿入・削除のみ高速 |
|deque|要素を挿入する順番に意味がある|ランダムアクセス可能 |先頭・末尾への挿入・削除のみ高速 |
|list|要素を挿入する順番に意味がある|ランダムアクセス不可|任意の位置に挿入・削除が高速|
|stack|要素の挿入と取り出しのみを行う|後から入れた要素を先に取り出す(FILO) ||
|queue|要素の挿入と取り出しのみを行う|先に入れた要素を先に取り出す(FIFO) ||
|priority_queue|要素の挿入と取り出しのみを行う|優先度の高い物から先に取り出す||
|set|要素を挿入する順番には意味がない|値のみを持つ |値の重複を許さない |
|multiset|要素を挿入する順番には意味がない|値のみを持つ |値の重複を許す |
|map|要素を挿入する順番には意味がない|キーと値を持つ|キーの重複を許さない |
|multimap|要素を挿入する順番には意味がない|キーと値を持つ|キーの重複を許す|
強化学習４０　Colaboratory+Atari+chainerRL　GPGPU小まとめ

中学生から大学生のAI初学者を対象にしています。

今回の結論は、PPOです。

　OpenAIのAtariを用いての強化学習（深層強化学習）では、PPOが一番です。
強化学習を行うときの入力データであるobservationで、画像出力を用いるのが流行りのようです。細かい設定無しで、ディスプレイに映し出される画面のデータです。
　これを用いると、手書き文字などの認識と同じような畳み込みニューラルネットワークの出番になります。すると、GPGPUを使うことになります。

　どこが面倒かというと、GPGPUの部分です。その中で、最強なのがPPOです。とにかく速い。ステップの処理も速いし、学習も速い。
Breakout２時間位（５５１９秒）で、こんな感じです。

```
steps   episodes  elapsed mean median stdev  max  min
2000000 16394     5519    36.8 33.5   18.41  61.0 2.0
```
同じstep数2000000を実行するならば、
PPO　　　　　　　５５１９秒（９２分）
DQN　　　　　　１９２００秒（３２０分）
DQN-batch　　　６９００秒（１１５分）
DRQN　　　　　　８９００秒（１４８分）
categorical　　１２８５５秒（２１４分）
となります。
９０分ルールがある以上は、PPOがいいのは一目瞭然です。

PPOはOpenAIのデフォルト手法になっているそうです。
こちらに詳しく書いてあります。
https://shiropen.com/2017/07/21/26889/

chokozainerrlに、aleシリーズは、それぞれ入れておきました。
【PHP+SQLite3】ping-tのコマンド問題ライクなページ１ --ボタン表示切り替えに難問が！！--

###1.コマンド問題選択画面{改修前}


下記のようなカテゴリー毎に、問題が選べる画面を作る。


![linux_command_test1_cate2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/cfe66fd9-d997-9980-ee5b-d197cd158f88.jpeg)

前回、下記の記事を作成した。

[【PHP+SQLite3】linuxコマンド登録ツール](https://qiita.com/knowledge87sun/items/bca093817fd5e224a77f)

コマンドとコマンドの解説を格納するデータベースを作成したので、このデータベースを利用して
問題を出題するページの作成にトライする。

(1)全てのカテゴリーを表示して、いくつ出題するかを選んで、スタートボタンを押す。
(2)選んだカテゴリーと、出題数分問題が入力欄付きで表示される。
回答に対して、確定ボタン(正答率を表示する頁に遷移)と戻るボタン(最初の画面に戻る)
ただし、選んだカテゴリーに対して問題や回答が登録されていない時は、戻るボタンのみ表示。


```php:linux_command_test1.php
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<form action="linux_command_test2.php" method="post">
<title>データ送信テスト</title>
<h1>データ送信テスト</h1>
カテゴリー:
    <select name="l_category">
        <option>1capacity_planning</option>
        <option>2Linux_Kernel</option>
         <option>3Boot_System</option>
        <option>4Device_FileSystem</option>
        <option>5Raid_Lvm</option>
        <option>6Network</option>
        <option>7Mentenance</option>
        <option>8DNS</option>
        <option>9WebServer</option>
        <option>10Samba_NFS</option>
        <option>11dhcp_ldap</option>
        <option>12mailService</option>
        <option>13SystemSecurity</option>
    </select>
    <br>
問題数:
    <select name="l_num">
        <option>5</option>
        <option>10</option>
        <option>15</option>
    </select>
    <br>  
<input type="submit" value="スタート" name="btn1">

<br>
</form>
</html>

```


###2.苦しみは突然に！！
これは、数十年前のトレンディドラマのタイトルではない。

前述の「確定ボタンの表示/非表示」の切り替えが、__今世紀最大の苦しみ__になってしまった。

+ submitボタンにパラメータによってdisabled属性をつけてみる。 

 ——->この属性があるだけで、非表示。

+ submitボタンにパラメータによってvisibility属性(none|visible)をつけてみる。

 ——->切り替えが上手くいかない。

JavaScriptでは、じゃんじゃん解決法が出ているが、
phpからではform部品の表示・非表示の切り替えが出来ないらしい事がわかった。


###3.どうすればいいのか。
どのカテゴリーに対して、問題やコマンドが存在するのか確認してみる。

__「SELECT DISTINCT category0 from tbl_linux」__

DBbrowserで上記sqlを投げると
2つのカテゴリーが表示された。
この２つのカテゴリーがselectboxに表示されるように
すればいいのだ。


![linux_command_test1_cate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/4d31bb8d-8edf-a851-b41a-b92e122b9f02.jpeg)

###4.改修後

```php:linux_command_test1.php 
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<form action="linux_command_test2.php" method="post">
<title>linuxコマンド問題(カテゴリー選択)</title>
<h1>linuxコマンド問題(カテゴリー選択)</h1>
<?php 
	//問題登録しているカテゴリーの種類
	$query_cate0 = "SELECT DISTINCT category0 from tbl_linux";
	
	$db_name='linux_quiz3.db';
	$db1 = new PDO('sqlite:'.$db_name);
	
    $result_a=$db1->prepare($query_cate0);
    $result_a->execute();
 ?>
カテゴリー:
    <select name="l_category">
		//カテゴリーを配列に格納し、セレクトボックスに表示
		<?php while($select_data=$result_a->fetch(PDO::FETCH_ASSOC)){ ?>
		<option><?php echo $select_data['category0']; ?></option>
		<?php } ?>
    </select>
    <br><br>
問題数:
    <select name="l_num">
        <option>5</option>
        <option>10</option>
        <option>15</option>
    </select>
    <br><br>
<input type="submit" value="スタート" name="btn1">
<br>
</form>
<?php 
	//データベースを閉じる。
	$db1=null;
 ?>
</html>
```
なんとか完成。
IBM Cloud paks for Automation を Experience 版で動作確認


IBM Cloud Paks シリーズは、Experienceでお試しができますが、
AI機能のFor Data に続き、第2弾として、Automationが出たので、試してみます。

以下のIBM Cloud paks Experience サイトに Automationが追加されており、ここから試せます。
https://www.ibm.com/cloud/paks/experiences/cloud-pak-for-automation

IBM Cloud paks for Automationの概要は以下の紹介ページを見て頂くとして、
https://www.ibm.com/jp-ja/cloud/cloud-pak-for-automation

アーキテクチャーは以下となり、コンテンツに対して、ワークフローを構成することが可能であり、
それで意思決定プロセスを実装し、自動化することができます。
この対象コンテンツには非構造化データも含まれこれを構造データとして解析（OCR）やAIに組み入れる仕組みまで実装されています。

![19026019usen-02_19026019USEN.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/0ce3a6df-3e29-2dc6-f6fa-b2b5b52f936e.jpeg)

IBM Cloud paks for Automationで認識されているコンテンツは文書で確認することできます。

![文書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/5f9594c6-7565-658e-66e6-06a56b79e31d.png)

非構造データ形式であるPDFの文書をテキストマイニングし、KVSの形で構造化している例でです。
個別の属性ごとに学習データとして組み込むことができます。

![KVS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/00e37f8f-2f0b-7ad7-abe0-c90f0adb3a55.png)

JSON化も可能です。

![JSON.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/d893a360-65a5-702d-d990-b1c6f8480bd7.png)

Watson Natural Language Understanding が内部にあり、AIデータとしても構造化できます。

![AI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/d8f88638-2d96-68a8-0947-efe15a25529e.png)


学首したデータをOntologyの構造化モデルとして表現することもできます。

以下の例では、トップ階層の文書クラスはコンテンツファイル単位ですが、
同じ階層にNLUという文書クラスを追加します。

![Ontology Management.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/8bef7155-4e8f-2811-4cf4-5e80994e051c.png)

追加すると、下の階層に学習したクラスが分岐で追加されます。

![Ontology Attribute Management.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/34d6eab4-06fa-71e7-2cc3-d6bd94a03e52.png)



Contens AnalyserのPythonサンプルは以下から確認できます。
https://github.com/ibm-ecm/content-analyzer-samples 


また、これらの操作はAPI操作が可能で、Swaggerも提供されています。

![API.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94200/36359938-8c02-70f8-a571-5a07919fe9e1.png)

ぜひ、IBM Cloud paks for Automation のお試しと実装を。
プロジェクトマネージャ試験　受験・合格体験記

###0. はじめに
- 私は合格するまで何度も受験したので、時間をかけて（かかった:sweat_smile:）取り組んでいます。そのため、寄り道・遠回りはしましたが、**「読む書く」**という生きていくため「術（すべ）」について最高のスキルが身に付いたと自負しています。

- 生きていくため・・・例えば、日常業務（設計書・報告書）、日常生活（銀行や役所などの資料）の**読解力と記述力というコミュニケーション能力**、そして**正確性や確実性**がレベルアップしたと体感しています。これは、論文試験（午後Iと午後II）を「採点者に伝わる様に読んでもらうんだ！」と言った気持ちで回答することに発展していくと思います。なお「正確」という点について[ドラゴン桜の5巻](https://note.com/mitanorifusa/n/n434b28927f27)に書いてあります。

- 一方で、PMBOOKや試験対策本などの**「専門知識」**に関しては、新しく学習する部分なので忘れない様に必要に応じて思い返す必要はあります。

- なお、効率的に一発合格を目指す人や、そもそも「読み書き」の能力が身に付いている人にとっては、不要な学習方法も以下には含まれているかもしれません。

###1. プロジェクトマネジメントに関する知識（専門知識）
- PMの理論＋実体験の実例、を意識して**「正確」**に理解する
    - 「正確」ということがとっても大切で、思いこみや誤認していると、試験問題の解答例より自分の解答が正しいのに:frowning2:・・・と思い上がった思考（負のスパイラル）に陥りました。柔軟性が大切です。
- テキストは一冊だけで良いので正確に理解する
    - 情報処理試験は自分に合う良本やセミナーがあった（ワクスタさん、みよちゃん）ので、それをものにできるかが時間の限られた人生にとっては大事だと思います（時間のある人は複数冊を利用すると良いと思います）。

- そんなこと知ってるよ！
    - SEやPMの業務をエンタープライズ系企業で経験していると、当たり前に思ってしまう内容が多々あるので、そんなこと知っているよ！なんて考えず、問題文や意図を理解して「正確」に読まないと理解したつもりになってしまいます。その結果、解答を腕がパンパンになって頑張って書いたのに、減点の連続だったと振り返って思います。
    - 出題者の意図、期待されている答えは何なのか、を考える癖をつける必要があります。

- 技術一つ一つの目的、コントロールできるリスクを理解する
    - 参考書や過去問を読むことに加えて、実務で問題解決できることを目指すことで、「正確」に理解できると思います

###2. 午後I
- 仮説：解答をイメージする（PMの何の知識を問われているのか？）
- 回答：対応する問題文の箇所を探す
- 検証：設問の意図に合っているか？（仮説の検証、例：クラッシング、ファストトラッキングなどの知識と合致しているか？）

###3. 午後II
- 採点者の方の立場や気持ちを想像し、できるだけ読んでいただける方々に分かりやすい文書にする（簡潔な文章が良いと思います）
- 工夫した点（困難・課題）を具体的にリアルに出来るだけアピールする（例：数字・名前（セキュリティに配慮）、評価シートで自己アピールする見たい感覚でしょうか）

###4. 試験問題を正確に読み，正確な答案を書く力（国語力）
参考にさせていただいた本を紹介します。

- [世界一やさしい問題解決の授業](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E6%8E%88%E6%A5%AD%E2%80%95%E8%87%AA%E5%88%86%E3%81%A7%E8%80%83%E3%81%88%E3%80%81%E8%A1%8C%E5%8B%95%E3%81%99%E3%82%8B%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F-%E6%B8%A1%E8%BE%BA-%E5%81%A5%E4%BB%8B/dp/4478000492)（この本のお陰で**論理の飛躍**がなくなったと思います）

- [出口汪さんの本](https://pub.jmam.co.jp/book/b360643.html)（たくさん本があって選ぶのが難しいのですが、出題者と採点者の気持ちを理解した**論理的な解答**ができるようになったと思います）
- [「超」勉強力](https://presidentstore.jp/category/BOOKS/004024.html)（この本を読んでみて、プロマネ試験を通じて習得した思考法が正しいと確信することができました）

###5. 最後まで決して諦めない気持ちでいく
- 合格するぞ！！！という強い気持ち（これは精神論ですが、頑張って勉強し、しかも受験しないことには栄冠を手に入れられる確率は0％です）

###6. 失敗例
 - 出題者の意図（問題文、知識）と異なる解答は、午後Ⅰ・Ⅱにおいて不合格
 - 自信のない解答or根拠のない自信だけがある回答（知識を総動員して別の解答がないか考え直すことが必要）
 - そもそも勉強方法が誤っていた（プロマネの知識はすぐに思い出せる状態にしておく）

これからも、試験勉強を通じて自分や周りが楽しくなり、社会の役に立つことを仕事をしたいと思います。:shinto_shrine:
GitHub Actions で Android アプリをビルドして apk ファイルをアップロードする

これは [ゆめみ その2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/yumemi2) の１９日目の投稿です。

今回はタイトルどおり、GitHub Actions で Android アプリのビルドを実行し、apk ファイルをアップロードするワークフローを紹介します！

## apk ファイルのアップロード先について

実際に仕事のプロジェクトでビルドを自動化する場合は、Firebase App Distribution なり DeployGate へ apk ファイルをアップロードした方が便利でしょう。

ただ今回は、それらのアカウントを用意するまでもないような小さなプロジェクトや個人プロジェクトを想定して、GitHub Actions の Artifacts へ apk ファイルをアップロードすることにします。（この方法であれば別途 Firebase 等のアカウントを用意する必要はありません。）

## ワークフロー

GitHub Actions の Ubuntu の環境は、Android アプリをビルドする為の SDK がはじめから導入されているので、とくに何もせずそのままビルドすることが出来ます。今回はビルドの前に、Android Lint で致命的なエラーが無いか、また Unit テストが通るかもチェックすることとします。このワークフローは次のようになります。

```yml
name: Android CI

on:
  push:
    branches:
      - master # masterブランチへのマージを契機にビルドする

jobs:
  build:

    name: Build on merge # GitHub上で識別しやすいのでジョブの名前をつけておく

    runs-on: ubuntu-latest

    steps:
      - name: Check out
        uses: actions/checkout@v1
      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Run Android Lint
        run: ./gradlew lintDebug
      - name: Run Unit Test
        run: ./gradlew testDebug
      - name: Build with Gradle
        run: ./gradlew assembleDebug
      - name: Upload apk file
        uses: actions/upload-artifact@v1
        with:
          name: apk
          path: app/build/outputs/apk/debug/app-debug.apk
```

上記のワークフローのとおり、Artifacts へのアップロードは https://github.com/actions/upload-artifact を利用しています。

ビルドが成功すると、GitHub Actions のジョブのページ に apk ファイルがアップロードされます。

<img width="600" alt="スクリーンショット 2019-12-21 21.17.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35733/725b4b76-7486-a80b-b999-53d1a334eda7.png">

## おわりに

いかがだったでしょうか。ビルドの成否を Slack へ等へ通知するともっと便利かもしれません。GitHub Actions については、次のような投稿もしていますので、よろしければご覧ください！

- [GitHub Actions でプルリクエストの自動アサインをする](https://qiita.com/hkusu/items/39eb92dbd4d6db8a14d8)
- [GitHub Actions で Slack に通知をお手軽に送る](https://qiita.com/hkusu/items/3dbf09f7fa83ba6d457c)
モジュールとアイテムの可視性1(Rustの基本構文-10-)

#はじめに
Rustの基本的な文法についてまとめてみた。第9回。
今回のテーマは「__モジュール__」について。__複雑なプログラムを書くときにはパッケージを複数のモジュールに分割したほうがプログラムの見通しがよくなる。__

###目的
Rustにおける基本的な構文の理解をする。

#Rustの基本構文シリーズ
第5回⇒[Rustの基本構文(5)](https://qiita.com/jin237/items/3fc3341effb3670e5865)　　URL：https://qiita.com/jin237/items/3fc3341effb3670e5865
第6回⇒[Rustの基本構文(6)](https://qiita.com/jin237/items/903e33226f93e7a4e5a0)　　URL：https://qiita.com/jin237/items/903e33226f93e7a4e5a0
第7回⇒[Rustの基本構文(7)](https://qiita.com/jin237/items/fcb5a05fb902dee1fc4d)　　URL：https://qiita.com/jin237/items/fcb5a05fb902dee1fc4d
第8回⇒[Rustの基本構文(8)](https://qiita.com/jin237/items/d544edcdfc7a08fa6998)　　URL：https://qiita.com/jin237/items/d544edcdfc7a08fa6998
第9回⇒[Rustの基本構文(9)](https://qiita.com/jin237/items/91eafe801d29d56c2cc2)　　URL： https://qiita.com/jin237/items/91eafe801d29d56c2cc2

#modキーワードとpubキーワード
プログラムを複数のモジュールに分割するために__modキーワード__を使用する。

例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.247)

```rust
mod server {
    //Server module in this
    fn echo() {
        //This is werver::echo function
        println!("Server");
    }
}

mod client {
    //Client module in this
    fn echo() {
        //Thie is client::echo function
        println!("Client");
    }
}

fn main() {
    //call "echo function in server module"
    server::echo();
    //call "echo funstion in client module"
    client::echo();
}
```
このように、中身がどうなっている状態かを示して、main関数にて呼び出すような使い方をする。pythonでのmodule簡易版みたいなイメージでいいのではないだろうか。しかし、この状態のプログラムでは実行することができない。
以下のようなエラーが引き起こされる。

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc [filename].rs && "c:\Users\[username]\rust\project1\"[filename]
error[E0603]: function `echo` is private
  --> module_function.rs:20:13
   |
20 |     server::echo();
   |             ^^^^

error[E0603]: function `echo` is private
  --> module_function.rs:22:13
   |
22 |     client::echo();
   |             ^^^^

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0603`.

[Done] exited with code=1 in _.___ seconds
```
__function 'echo' is private__と記されていることに注目。すなわち、この状態のモジュールはプライベート状態となっていて呼び出すことはできない。これをpublic的なものにすれば呼び出すことができる。そこで、__module内のfnの前に"pub"と入れる__ことで解消できる。

```rust
mod server {
    //Server module in this
    pub fn echo() {
        //This is werver::echo function
        println!("Server");
    }
}

mod client {
    //Client module in this
    pub fn echo() {
        //Thie is client::echo function
        println!("Client");
    }
}

fn main() {
    //call "echo function in server module"
    server::echo();
    //call "echo funstion in client module"
    client::echo();
}
```
このプログラムで実行してみると以下のようにprintln!の部分が表示される。

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc [filename].rs && "c:\Users\[username]\rust\project1\"[filename]
Server
Client

[Done] exited with code=0 in _.___ seconds
```
この構造は上手に使うことでしっかりと整理されたプログラムが書くことができる。
ただし、この場合、どこからのアクセスも受けられる状態となってしまうので、それに対してオプションを付けることで制限または一部に対してのみパブリック状態とできる。

###さいごに
パブリックオプションについては次回の記事で書こうと思っているが、正直まだ自分自身が理解できていなくcrateのところで問題が起こってしまっているので、解決したらまた次の記事を書きたいと思う。
製薬企業研究者がNumPyについてまとめてみた

# はじめに

NumPyは、ベクトルや行列計算を高速で行うためのライブラリです。
ここでは、NumPyでよく使うメソッドなどについて解説します。
Python3系の使用を想定しています。


# インポート

NumPyを使うには、まずライブラリを読み込む必要があります。
慣習的に、`np`とすることが多いです。

```python:NumPy_1.py
import numpy as np
```


# 1次元配列

NumPyでは、リストのような配列を作ることができます。

```python:NumPy_2.py
import numpy as np


np_arr_1 = np.array([1, 2, 5])

print(np_arr_1)
print(type(np_arr_1)) # ndarrayクラス
print(np_arr_1**2) # 各要素を2乗する。


np_arr_2 = np.array([3, 5, 7])

print(np_arr_1 + np_arr_2) # 要素ごとに足し算する。


np_arr_3 = np.arange(10)

print(np_arr_3)

np_arr_3[0:2] = 100
print(np_arr_3)
```

NumPyは要素同士の計算が簡単にできるのが特徴です。
NumPyを使わずに上記の処理を行おうとすると以下のようになります。

```python:NumPy_3.py
arr_1 = [1, 2, 5]

for i, num in enumerate(arr_1):
    arr_1[i] = num ** 2
print(arr_1)
```

NumPyの配列では、代入先の要素の値を更新すると、元の配列の値も更新されるので、注意が必要です。
元の配列が更新されないようにするには、`copy()`メソッドを使用します。

```NumPy_4.py
import numpy as np


np_arr_1 = np.array([1, 2, 5])
np_arr_2 = np_arr_1
np_arr_2[1] = 100
print(np_arr_1) # np_arr_1も変更されている。
print(np_arr_2)


np_arr_1 = np.array([1, 2, 5])
np_arr_2 = np_arr_1.copy()
np_arr_2[1] = 100
print(np_arr_1) # np_arr_1は変更されない。
print(np_arr_2)
```

ある条件を満たす要素のみを取り出すことも可能です。

```python:NumPy_5.py
import numpy as np


np_arr_1 = np.array([1, 2, 5])
print(np_arr_1[np_arr_1 % 2 == 1]) # 奇数の要素のみを取り出す。
```
NumPyでは「ユニバーサル関数」と呼ばれる、配列の各要素に対する演算結果を返す関数が用意されています。

```python:NumPy_6.py
import numpy as np


np_arr_4 = np.array([-1, 2, -3])
print(np.abs(np_arr_4)) # 各要素の絶対値

np_arr_5 = np.array([1, 9, 25])
print(np.sqrt(np_arr_5)) # 各要素の平方根
```
NumPyでは、乱数を発生させることもできます。

```python:NumPy_7.py
import numpy as np


np_arr_6 = np.random.randint(0, 10, 5) # 0から9の間の整数をランダムに5個発生させる。
print(np_arr_6)

np_arr_7 = np.random.randint(5) # 0から4までの整数をランダムに1個発生させる。
print(np_arr_7)
```

`import`の部分を書き換えることで、より短く簡単に記述することができます。

```python:Numpy_8.py
from numpy.random import randint


np_arr_6 = randint(0, 10, 5)
print(np_arr_6)

np_arr_7 = randint(5)
print(np_arr_7)
```

# 2次元配列

2次元配列に関するメソッドは以下のようになります。

```python:NumPy_9.py
import numpy as np


np_arr_8 = np.array([[1, 2, 3], [4, 5, 6]])
print(np_arr_8)
print(np_arr_8[1])
print(np_arr_8[1, 1])
print(np_arr_8.sum())
print(np_arr_8.sum(axis=0)) # 列ごとに計算
print(np_arr_8.sum(axis=1)) # 行ごとに計算
print(np_arr_8.shape)
print(np_arr_8.reshape(3, 2))
print(np_arr_8.T)
print(np.transpose(np_arr_8))
print(np_arr_8.mean()) # 平均
print(np.average(np_arr_8)) # 平均
print(np.max(np_arr_8)) # 最大値
print(np.min(np_arr_8)) # 最小値
print(np.std(np_arr_8)) # 標準偏差
print(np.var(np_arr_8)) # 分散
print(np.argmax(np_arr_8)) # 最大値の要素のインデックス番号
print(np.argmin(np_arr_8)) # 最小値の要素のインデックス番号
```

# まとめ

ここでは、NumPyでよく用いられるメソッドなどを紹介してきました。
マスターするには、実際に使ってみるのが一番の近道です。

# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)
「2Dのカメラの追尾と映したい範囲を映す」やってみた

## 概要
- 2Dで自機をカメラで追尾したい。
- 壁の向こうは映したくない。

## Unity version
2019.2.16f1

## 必要なAsset
Cinemachine

## やった事 
### 自機をカメラで追尾する

キャラクターが画面の外に消えてしまった。
追尾したい。

![movie3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/1bb99d0e-f493-35d5-4fbd-e64e61b3fd8d.gif)

CinemachineのVirtual Cameraを使う。

AssetであるCinemachineをimportし、
CinemachineでVirtualCameraを作成する。
<img width="430" alt="スクリーンショット 2019-12-21 20.46.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/9248bb93-0bc2-8f6f-16e8-34822eee5d0d.png">

VirtualCameraのFollowに追尾させるObjectをセットする。

<img width="387" alt="スクリーンショット 2019-12-21 20.45.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/1874c951-c904-a8dd-cfa0-ac18cf8c8926.png">


できた。

![movie2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/fa53b9f8-4406-d3c7-5b6e-62643a73f5a6.gif)


### 壁の向こうは映したくない。
地面の下と壁の向こうを見えないようにしたい。
カメラの表示範囲を指定する事で壁の向こうが映さないようにする。

Empty Objectを作成してPolygon Collider 2Dをつける。
物理演算は不要なのでRigidbody 2Dはつけない。
<img width="390" alt="スクリーンショット 2019-12-21 20.15.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/37b56654-b213-0a5e-2438-26b1099f2d17.png">

Polygon Collider 2Dの範囲を決める、この範囲がVirtual Cameraで表示したい範囲になる。
<img width="463" alt="スクリーンショット 2019-12-21 20.20.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/a75b1320-cf05-33da-a496-da71b2cdb2b7.png">

Virtual CameraにCinemachine Confinerをつけて、先ほど作成しCameraAreaをBounding Shape 2Dにセットする。

<img width="385" alt="スクリーンショット 2019-12-21 20.16.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/925d29fd-f18a-36c9-5d7a-5b25d88e8b4f.png">

できた。
![movie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387017/1a3a9b4e-e6bd-bced-6be0-4784a636ae75.gif)

## 感想
- カメラの表示範囲に対しての物理演算は不要なのでRigidbody 2Dはつけなくても、範囲指定はできる。
- MonoBehaviourのUpdate メソッドでカメラの追尾をさせる事より楽。

## 参考した記事
- http://tsubakit1.hateblo.jp/entry/2017/12/01/002143
- https://nopitech.com/2017/10/26/post-182/

## 利用したAsset
- Sunny Land
 - https://assetstore.unity.com/packages/2d/characters/sunny-land-103349?aid=1100l37E9&cid=1100l7y5sxIF&utm_source=aff
- Cinemachine
 - https://assetstore.unity.com/packages/essentials/cinemachine-79898
NeovimのBuiltin LSPを使ってみる

## はじめに
最近NeovimにLSPクライアントが入りました。
まだ入ったばかりの機能なので、今後使い方が変更される可能性があります。
Neovimのバージョンは NVIM v0.5.0-252-gee7ac469c, LSはtsserverを使用します。
環境はMicrosoft Terminal内のWSL(Ubuntu 18.04)です。
他の言語で試す場合は、適時読み替えてください。

## 設定

### nvim-lsp

[neovim/nvim-lsp](https://github.com/neovim/nvim-lsp)を使います。
このリポジトリは各LSの設定集です。
[vim-lsp](https://github.com/prabirshrestha/vim-lsp)における[vim-lsp-settings](https://github.com/mattn/vim-lsp-settings)と同じものですね。

deinを使っているのでTOMLファイルに追記します。

``` toml
[[plugins]]
repo = 'neovim/nvim-lsp'
```

### init.vim
NeovimのLSPクライアントはLuaで書かれているので呼び出しもLuaです。[^1]

``` vimscript
"基本的にこれだけでOK
lua require'nvim_lsp'.tsserver.setup{}

"omnifuncを設定
autocmd Filetype typescript setlocal omnifunc=v:lua.vim.lsp.omnifunc

"lsp.txtそのまま
nnoremap <silent> gd    <cmd>lua vim.lsp.buf.declaration()<CR>
nnoremap <silent> <c-]> <cmd>lua vim.lsp.buf.definition()<CR>
nnoremap <silent> K     <cmd>lua vim.lsp.buf.hover()<CR>
nnoremap <silent> gD    <cmd>lua vim.lsp.buf.implementation()<CR>
nnoremap <silent> <c-k> <cmd>lua vim.lsp.buf.signature_help()<CR>
nnoremap <silent> 1gD   <cmd>lua vim.lsp.buf.type_definition()<CR>
```

### tsserver

nvim-lspが入っていればvim内からコマンドでインストールできるみたいですが、今回はnpmでインストールしました。

`:LspInstall tsserver` or `npm i -g typescript-language-server`

### ディレクトリ
デフォルトではルートディレクトリの設定がpackage.jsonになっているので適当に作ります。

``` bash
npm init -y
npm -D i tyepscript
touch index.ts
```

## 使ってみる
準備が終わったので各機能を見ていきます。

### 補完
手動(`<C-X><C-O>`)のオムニ補完です。
実行と同時に新しいバッファが開きますが、なにも表示されずよくわかりません。
![補完.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/22eba410-dbcf-6ca2-2690-ac85f97f9774.gif)
virtual textが荒ぶってますが、ちゃんと候補が出てきます。

![補完できない.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/aaa5a6c9-724c-691a-1d25-ce8207bc822c.gif)
しかし、文字の途中で補完を呼び出すとうまく動きません。

### エラー表示
virtual textで表示されます。
![エラー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/f8344b8a-825c-f4ad-fe1a-43a200e4146e.gif)

### フォーマット
動きます。

`vim.lsp.buf.formatting()`
![フォーマット.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/73246eb2-c79a-5216-bf97-b2acf0f3f2ba.gif)

### ホバー
floating windowで表示されます。
ウィンドウが出ている間にもう一度呼び出すと（この場合`K`）floating windowにフォーカスが行きます。

`vim.lsp.buf.hover()`
![ホバー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/a66782f4-efbf-9170-5532-c7f652d03bfc.gif)

### シグネチャヘルプ
ホバーと同様に表示されます。
`vim.lsp.buf.signature_help()`
![シグネチャ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/adc41d5b-5f9d-5aff-3c5a-0ebe02982775.gif)

### ジャンプ
定義と実装それぞれに移動できます。

`vim.lsp.buf.implementation()`
![ジャンプ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/dfa13758-1a73-77c5-305c-a63297ba3b47.gif)

`vim.lsp.buf.definition` `vim.lsp.buf.type_definition()`
![型定義ジャンプ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183505/b1142c41-c07a-3bf4-7a4e-b8b37605b2d0.gif)

## おわりに
virtual textや補完周りが気になりますが、動くようにはなっていますね。
ドキュメント等にもTODOが目立つので今後に期待です。

## 備考
- [lsp.txt](https://neovim.io/doc/user/lsp.html)

[^1]: NeovimとVimとでは、Luaのvimモジュールに互換性はありません。
ラズベリーパイのイーサネット接続ができない

#目次
1.[はじめに](#anchor1)
2.[背景](#anchor2)
3.[やったこと](#anchor3)
4.[考察](#anchor4)

<a id=anchor1 ></a>
##1.はじめに
ある日突然ラズベリーパイのLANポートが使えなくなった話です。
原因解明ができず結局OSをインストールし直して解決策っぽいものを施しました。
有識者の方に原因・解決策をご教授していただきたいのと備忘録としてやったことを残しておきます。

<a id=anchor2></a>
##2.背景
Raspberry Pi3のLANポートを用いてイーサネット接続で使用していました。
ある日ラズパイをGUIで起動させ、ホーム画面からファイルマネージャーを開いたところ処理落ち。
不安に思い再起動させたところ処理落ちは一旦なくなったが、しばらくしてまた発生。
処理落ちだけでなく、イーサネットでの外部へのアクセスができなくなりました。(WLAN経由では問題なし)

<a id=anchor3></a>
##3.やったこと
とりあえず一番近いところにpingを打つとconnect:network unreachableのエラー。
routeテーブルを確認したところ何もなし。
であればと静的にターミナルからテーブルに追加させようとコマンドを打つと、network unreachableエラー。

DNSやIPアドレスなどいろいろ確認してみたが設定ミス等なさそう。
成すすべなくインターネットでとりあえずファイルマネージャーの処理落ちの原因を調べました。
[こちらのサイト](https://www.raspberrypi.org/forums/viewtopic.php?t=257460)を参照し実行してみたところ処理落ちはなくなりました。
pingが通らないのは継続しており、仕方なくOSを入れなおしました...

<a id=anchor4></a>
##4.考察
処理落ちして不安になって再起動したときに何かしらの設定ファイルが破損したのかなと思いました。
そのためOSを再インストール後上記のサイトでのinstallを行ってからは処理落ちもなく、イーサネットでの接続も今のところうまくいっています。

結局ファイルが破損していたならどのファイルが破損しているのかなど検討がつけられないあたり実力のなさを実感しました。
後学のためにもどなたかアドバイスご教授よろしくお願いします....
シェルスクリプト  リダイレクト先ファイル名に日付文字列

date コマンドの書式で大文字・小文字を間違えることがあります。

| 書式 | 表示 |
|---|---|
| %Y | 年（1970年以降の西暦を4桁で表示) |
| %m | 月（01月から12月を2桁で表示）|
| %d | 日（01日から31日を2桁で表示）|
| %H | 時（00時から23時を2桁で表示）|
| %M | 分（00分から59分を2桁で表示）|
| %S | 秒（00秒から59秒を2桁で表示）|

年月日-時分秒で出力させたい場合、`date +%Y%m%d-%H%M%S` と指定する。

```bash:log-with-date
# 2019年12月21日 10時20分30秒に実行した場合
$ ls > `date +%Y%m%d-%H%M%S`.log
-> 20191221-102030.log というファイルが作成されます
```

man date コマンドで書式を見てみると、上記以外にも %I (時間を12時表記) などがある。
また、そのOSにインストールされている date コマンドのバージョンによっても違う場合がある。
少なくとも、上記の表にある書式については、どの環境でも違いなく使用できる。

（追記）
また、crontab 上で指定する場合は、% をエスケープする必要があります。
例）`date +\%Y\%m\%d-\%H\%M\%S`
crontab(5)のマニュアルに記載されているように、% はエスケープされていないと、改行コードに置き換えられてしまいます。

```bash:man-crontab(5)
$ man 5 crontab
...(抜粋)...
Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters
```
【React練習問題】（回答）②カスタムhooksをつかって表示制御をしよう

# 課題の目的
カスタムhooksの基礎的な使い方を理解してもらいたかった。

# 回答
実装方法はそれぞれ違うと思うので、一つの例だと思って見てほしいです。

```jsx
import React, { useState, useCallback, memo} from "react";
import ReactDOM from "react-dom";
import "./styles.css";

function App() {
  const [isOpen, open, close] = useOpenComment();
  const [isOpen2, open2, close2] = useOpenComment();
  return (
    <div>
      <button onClick={open}>open!!</button>
      <button onClick={open2}>open2!!</button>
      <Comment isOpen={isOpen} close={close} comment="openしました！"/>
      <Comment isOpen={isOpen2} close={close2} comment="openしました！2"/>
    </div>
  );
};

const useOpenComment = () => {
  const [isOpen, setIsOpen] = useState(false);
  const open = useCallback(() => setIsOpen(true), []);
  const close = useCallback(() => setIsOpen(false), []);
  return [isOpen, open, close];
};

const Comment = memo(({isOpen, close, comment}) => (
  <>
  {isOpen ?  
    <div className="comment">
      <p>{comment}</p>
      <button onClick={close}>close</button>
    </div>
    : null
  }
  </>
));

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
```

## 仕様の実装
・useStateを１回だけ使う
・useCallbackを２回だけ使う
これをカスタムhooksをつかって解決している。

```jsx
const useOpenComment = () => {
  const [isOpen, setIsOpen] = useState(false);
  const open = useCallback(() => setIsOpen(true), []);
  const close = useCallback(() => setIsOpen(false), []);
  return [isOpen, open, close];
};
```
これをつくっておくことで、ボタンで利用する関数を毎回定義しなくても、useOpenCommentを呼び出すだけで必要な関数を呼び出すことだできるようになる。
1年実務でPythonを使って困ったところ - 2019年初アドベント投稿


今年も残すところあと10日
初のアドベントカレンダーで無事に2019年を締めたいと思います！ 

Pythonを使っていて困ったこと3つです。聞いてください。

## 君の型は

初心者（わたし）にありがちな事件です。

画像処理とかでNumpy使ったりOpenCVを使っていたんですが、
それぞれの関数での戻り値をちゃんと理解してなかったあの頃。

**intがfloat**になってることや、**listがint**になっているなどよくあることでした。

コード量が多くなってくると、型に関連するエラーがやっかいです。
途中でどう型が変化したのかわからなくなり、デバッグに手こずったのが今となっては懐かしいです。


手こずった時の呪文

**君の型は**

```python
print(type(you))
```


## 消えないremove

for文でリストを回し、不要な要素をremoveで消していた時の話

「あ、あれ、消えてない…！？」

どんなにprintしてデバッグしても、消したはずの要素が消えていない
リストから取り出される値がなんか変？

検索してみた結果答えはここにありました
https://www.haya-programming.com/entry/2018/06/02/163415

今となっては**内包表記**を使うことの方が多いですが
当時困った時はとりあえず **lst[:]** で凌いでいました。


## dict -> json, dict -> str

単純に変換にかなり手こずったというお話

```python
import json

dic = {"test":"てすと", "辞書": "慣れるまで大変だった"}
>> {'test': 'てすと', '辞書': '慣れるまで大変だった'}

str(dic)
>> "{'test': 'てすと', '辞書': '慣れるまで大変だった'}"

json.dumps(dic, ensure_ascii=False)
>> '{"test": "てすと", "辞書": "慣れるまで大変だった"}'
```

お分かり、いただけたでしょうか
どっちもtypeで確認すると **str** なんです

数ヶ月前の私はこれに戸惑い、悩み、困惑し、なんとか乗り切ったのでした。
これに関してはjsonとstrの違いがよくわからず、結局調べることもままならないまま
「そういうものである」という勢いだけで乗り切ってしまいました。

知見のある方お待ちしております！



## 最後に

アドベントは軽く読める読み物、というのをどこかで聞いたので比較的短い記事にしてみました。
（ま、間に合わなかったとかじゃなくて）

実際１年間実務でPythonを触ってみて、色々と困ることはたくさんありましたが、
Pythonだから困ったのか、エンジニアとして初学者だから困ったのか、と言われると後者であるパターンが多いように思います。

なのでここに載せるものを考えた結果、この3つにしかならなかったというのが本音だったり…。

ですがこの3つだけでも記事として表に出せてよかったです！
記事の構成や文章力は日々精進していきたいと思いますので今後ともよろしくお願いします！

では良いお年を！
初心者によるプログラミング学習ログ 190日目

# 100日チャレンジの190日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

190日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<a href="https://twitter.com/hashtag/190%E6%97%A5%E7%9B%AE?src=hash&amp;ref_src=twsrc%5Etfw">#190日目</a><br><br>UdemyでBootstrap<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1208114577642160129?ref_src=twsrc%5Etfw">December 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
メンテナンスが終了した公式 SendGrid モジュールをMagento2.3(ZF2)に対応させた

Magento2 の公式 SendGrid 拡張は、Magento2.2対応版でメンテナンスが終了しており、ZF2 を利用している 2.3, 2.4 では動作しません。

[SendGrid Email Delivery](https://marketplace.magento.com/sendgrid-email-delivery-simplified.html)

こちらをある程度まで動く形に改修したものが以下になります。

[kzkick2nd/magento2-sendgrid](https://github.com/kzkick2nd/magento2-sendgrid)

SendGrid 公式の GitHub リポジトリもすでにありませんので、自前リポジトリを用意しました。完全な動作を保証するものではありません。

## 有効化

### 1. `app/code`以下にモジュールを設置します
![スクリーンショット 2019-12-21 20.20.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752/70a2c970-3de8-5c25-f476-0fe379386383.png)

### 2. モジュールを有効化します
```
$ bin/magento module:enable SendGrid_EmailDeliverySimplified
$ bin/magento setup:upgrade
$ bin/magento cache:clean
```

### 3. 管理画面「システム」に SendGrid メニューがでます

![スクリーンショット 2019-12-21 20.26.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752/950f7f6b-1fa2-8a4d-11e8-91b2ac198904.png)

こちらの設定で SendGrid API キーペアを入力すると、テストメールが送信できます。
【React練習問題】②カスタムhooksをつかって表示制御をしよう

# 概要
これはReactを学ぶ上で、実際の現場で利用できる実装を取得するためのプログラム。
可読性、パフォーマンスなども求める。

# 課題仕様
コードサンドボックスを利用する
https://codesandbox.io/s/

## 画面
・commentを表示するためのボタンを２つ作る
・表示ボタンを押すと、コメントとその表示を消すボタンがコメントと同じ要素内に用事される
以下、私の実装結果の画面

![comment実装.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160041/adba828f-7771-d56b-4485-5a83b6bd6d91.gif)

## ルール
・FCでつくる
・useStateを１回だけ使う
・useCallbackを２回だけ使う
・memoを使う

## ヒント
・useStateを１回だけ使う
・useCallbackを２回だけ使う
これはカスタムフックスを使うことで解決できる

# 回答
https://qiita.com/takujiro_0529/items/564b0ac28a90df550d58
Queue

# Pythonで「キュー（Queue）」

## はじめに

ここでは[「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」][1]の中で取り上げられている[「AOJ (Aizu Online Judge」)][2]の問題を自分で解いた際に学んだことや、こう考えれば分かりやすいと感じたことなどを自分への整理も兼ねてまとめています。
このテキストはC++で書かれているので、私のようにpythonで勉強をされている初学者の方の参考になれば幸いです。また私自身も初学者ゆえ、至らない点が多々あると思いますので、ご指摘・ご助言頂ければ喜びます。よろしくお願いします。

## 問題詳細

[ALDS 1_3_B: Queue][3]
キューを使ってラウンドロビンスケジューリングをシミュレートする問題です。
問題詳細は上記リンクをご参考ください

## 考え方
・ラウンドロビンスケジューリングと呼ばれる処理方法ではCPUがプロセスを順番に処理していくのですが、各プロセスの所要時間がクオンタム（１回の制限時間みたいなもの）を越える場合、そのプロセスは待ち行列の最後尾に移動させられ、次のプロセスの処理が始まります。これはキューの先入先出しが利用できます。

## pythonコード

```python
from collections import deque

n, q = map(int, input().split())
listA = []
t=1
while t <=n:  # 変な書き方をしていると思います、、、
    try:
        listA.append(input().split())
        t +=1
    except:
        break

result=[]
qu = deque()
for i in range(n):
    qu.append(listA[i]) # プロセスを順番にキューに入れる

time = 0    # 処理を開始してからの経過時間を入れる
while True:
    try:
        task = qu.popleft()     # 今処理するプロセスを取り出す
        if int(task[1]) <= q:   # クオンタム内で処理が完了するかを判断
            time += int(task[1]) # 処理時間を加える
            result.append([task[0], time]) 
        else:
            time += q # クオンタム目一杯処理を行ったのでクオンタム分を加える
            task[1] = int(task[1]) - q # 残りの処理時間
            qu.append(task) # 待ち行列の最後尾に追加
    except:
        break

for i in range(n):
    print(*result[i])
```````

## ポイント
・キューとしてdequeを扱う場合には、先入先出しなので、popleft()とappend()を使用します


## まとめ
以上となります。間違いや改善点などございましたら、よろしくお願いいたします。


[1]:https://book.mynavi.jp/ec/products/detail/id=35408
[2]:https://onlinejudge.u-aizu.ac.jp/home
[3]:https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/all/ALDS1_3_B
WebStorm など JetBrains IntelliJ系エディタで、vueファイルの<script>タグ内の1段インデントをさせない (ESLint, TSLint 対応)

WebStorm で Vue.js の単一ファイルコンポーネントを書いているとき、デフォルトだと Command + Option + L の Reformat Code 時、


```vue
<script>
  import ....
  export default {
    ...
```

このように、`<script>` タグ内で1段階インデントしてしまいます。

こうなっていると、ESLint でも TSLint でも警告が出ます。

```
ESLint: Expected indentation of 0 spaces but found 2.(indent)
```

![torico-corp-nuxt____workspace_torico_torico-corp-nuxt__-_____layouts_default_vue__torico-corp-nuxt_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68302/497689a2-3c91-80dc-3b87-ac0af7bc5321.png)


インデントさせないようにするには、

Command+,(Preference) → Editor / Code Style / HTML の
Do not indent children of: に、script を追加します。

![Preferences.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68302/0bbbc531-1219-5cb8-1771-71156c7c69ae.png)

![Preferences.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68302/a61e3a2e-0057-a484-a360-29c7481df861.png)

これで、インデントは自動追加されず、すでにインデントされているものは Reformat Code時にアンインデントされるようになります。
Vue + jestでmarkdownのファイルをインポートする方法

Vueでjestを使ってmarkdownをimportした際の unexpected tokenのエラーに遭遇したのでその回避方法です。

```
$npm run unit
test/unit/specs/Markdown.spec.js
● Test suite failed to run
    Jest encountered an unexpected token
```
```vuejs:Markdown.vue
...
<script>
import marked from 'marked'
import md from '../assets/sample.md' //importでエラーが発生

export default {
  name: 'Markdown',
  computed: {
    compiledMarkdownText: function () {
      return marked(md.source)
    }
  }
}
</script>
```


原因は、markdownのファイルをimportした際に変換がかかりエラーになっています。
そこで、markdownの場合は変換の対象から除外し、モックファイルを読み込むようにjestのmoduleNameMapperに設定を追加します。
https://jestjs.io/docs/ja/configuration#modulenamemapper-objectstring-string
[https://jestjs.io/docs/ja/webpack#静的アセットの管理](https://jestjs.io/docs/ja/webpack#%E9%9D%99%E7%9A%84%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E7%AE%A1%E7%90%86)

```config:jest.config.js
  moduleNameMapper: {
    '\\.(md)$': '<rootDir>/test/mocks/file_mock.js'
  },
```

```js:file_mock.js
module.exports = {
    file: 'file_mock.js',
    source: 'stub' //ファイルのテキストをsourceに記載
}
```

テストコードでもモックファイルを参照する場合は
file_mock.jsをimportします。

```js:Markdown.spec.js
import { mount } from '@vue/test-utils'
import Markdown from '@/components/Markdown'
import md from '../../mocks/file_mock.js'

describe('Markdown.vue', () => {
  it('markdown should be html', () => {
    const wrapper = mount(Markdown)
    expect(wrapper.vm.compiledMarkdownText).toBe('<p>stub</p>\n') 
  })
})
```

markdownだけでなく他のアッセトファイルを参照する場合もmoduleNameMapperに拡張子を追加することで対処できます。
年末まで毎日webサイトを作り続ける大学生 〜64日目 入力文字をランダムな位置にランダムなサイズで表示する〜

##はじめに
こんにちは！@70days_jsです。

文字を入力したら、ランダムな位置にランダムな大きさで表示されます。gif↓
![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/59c5a317-e5a4-92b9-7b79-36145051d95e.gif)


64日目。(2019/12/21)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day64.html

##やったこと
キーダウンをイベントリスナーで捉えて、入力文字は一つずつオブジェクトを作っています。
50文字打ち込んだら全てのオブジェクトが消える仕組みになっています。

html↓

```html
 <body>
    <div id="countWrapper">COUNT: <span id="count"></span></div>
    <canvas id="canvas"></canvas>
  </body>
```
css↓

```css
body {
  height: 100vh;
  margin: 0;
  background-color: black;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

#canvas {
  border: solid 1px rgba(31, 227, 13, 1);
}

#countWrapper {
  color: rgba(31, 227, 13, 1);
  padding-bottom: 20px;
}
```

JavaScript(61行)↓

```javascript
let canvas = document.getElementById("canvas"),
  ctx = canvas.getContext("2d"),
  twidth = (canvas.width = 500),
  theight = (canvas.height = 500),
  chars = [],
  count = document.getElementById("count"),
  fontSize = Math.random() * 100,
  countNumber = 0;

function Character(ctx, e) {
  this.ctx = ctx;
  this.x = Math.floor(Math.random() * twidth);
  this.y = Math.floor(Math.random() * theight);
  this.size = fontSize;
  this.char = String.fromCharCode(e.keyCode);
}

Character.prototype.render = function() {
  this.draw();
};

Character.prototype.draw = function() {
  let ctx = this.ctx;
  ctx.beginPath();
  ctx.fillStyle = "rgba(31, 227, 13, .5)";
  ctx.font = this.size + "px Arial";
  ctx.fill();
  ctx.fillText(this.char, this.x, this.y);
  ctx.closePath();
};

//_________keydown_________;
document.addEventListener("keydown", logKey, false);

function logKey(e) {
  if (countNumber >= 50) {
    countNumber = 0;
    chars.length = 0;
    alert("Characters are not eternal.");
  } else if (e.keyCode < 65 || e.keyCode > 91) {
    return false;
  } else {
    let char = new Character(ctx, e);
    chars.push(char);
    countNumber++;
    count.innerHTML = countNumber;
  }
}

function render() {
  fontSize = Math.random() * 100;
  ctx.clearRect(0, 0, twidth, theight);
  for (var i = 0; chars.length > i; i++) {
    let char = chars[i];
    char.render();
  }

  requestAnimationFrame(render);
}

render();
```

> function Character(ctx, e) {...}

↑これはコンストラクターです。
位置、サイズ、文字を入れています。
色々詰め込んだ後に、コンストラクターの役割ってなんだっけと悩みました。
コンストラクターでオブジェクト固有の値を入れるのは、どうなんだろう・・・？

このオブジェクトはrender()メソッドを通して、draw()メソッドを実行します。
メソッドの数が増えたときのためにrender()メソッドを介しています。

render関数(メソッドの方じゃないよ）はfontsizeをランダムな値に再設定しています。
 
>  fontSize = Math.random() * 100;

（あれ、もしかしてこれもコンストラクターでやればよかった・・・？）

これはキャンバスをまっさらにしています。↓
>  ctx.clearRect(0, 0, twidth, theight);

for文で各オブジェクトのメソッドを実行しています。↓

>  for (var i = 0; chars.length > i; i++) {
    let char = chars[i];
    char.render();
  }

##感想
オレオレ流でやりすぎたのを反省した一日でした。
オブジェクト指向プログラミングの本をちゃんと読まなきゃな。

最後まで読んでいただきありがとうございます。明日も投稿しますのでよろしくお願いします。
入れたらテンション上がるかも？検証せずに選んだテキストエディタプラグイン4選

## ある日の朝

ここからは実話です。

後輩A「さっきDM送っといたんで見てくださーい」
私「......？はーい」

開く

**なんじゃこりゃあああああああああ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/e9c50c71-fcb9-64f6-158e-8941d7041123.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/a7662ef5-30ab-924c-58f0-17b232f95a0e.png)

私「何これ何これ何これ！！！！！！」

後輩A「入れてみてください＾＾何の役にも立たないかもしれないでs...」
私「すごーーーーーー！たのしーーーーーー！！！！きゃっきゃっきゃ！！！！！」

後輩A「入れるの早wwwwww」
私「まだないの？！カレー作るんやけどさ！！！まだないの？！？！？！」

というわけで少し探してみました。

意外とQiitaにまとまってなかったので、この機会に紹介します。

## ここで紹介する対象のテキストエディタ
以下のテキストエディタを対象に紹介します。
（タイトルにもあるように「検証せずに選んだテキストエディタプラグイン」なので、悪しからずmm）

* Atom
* VS Code

後輩A「なんでこの2つだけなんですか」
私「（時間がなかった）大人の事情だよ。」

## Atom
AtomはGitHubが開発しているテキストエディタです。
Atomで使用できるちょっとクスッときたプラグイン、2つ用意しました！

全国のAtom使いのみなさん、Atomを愛する者たち、Atomを憎む者たち、全てのAtom関係者に伝われ。

### sashisuseso
https://atom.io/packages/sashisuseso

こちらは特に設定は不要で、インストールするだけで使えます。
Enterを押すたびに、女の子が合コンのさしすせそを連呼してくれます。

<img width="1348" alt="スクリーンショット 2019-12-21 19.39.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/e129e812-c93f-1df2-6cda-b1c1857e04cc.png">


* さすが〜！
* しびれる〜！

等女の子が褒めてくれるそうです。
承認欲求がとても上がって気持ちのいいコーディングができるでしょう。

ちなみに後輩Aの反応はこうでした。

後輩A「笑いというか、ゾワっとしました。」

### ttaaaan Package
https://atom.io/packages/ttaaaan

こちらも特に設定は不要で、インストールするだけで使えます。

こちらはタイピングをするたびに「カタカタ」と擬音を表示してくれるものです。
擬音が実際に表示されながらコーディングすると充実度が違いますね！

VS Code使いの私「これ、Atomしかないの......？（涙）」

## VS Code
みんな大好きVS Codeです。
VS Codeは天下のMicrosoftさんが開発しています。
こちらも2つ紹介していきましょう！

### Sushi Buffet
https://marketplace.visualstudio.com/items?itemName=kcpoipoi.sushi-buffet

日本人、お寿司！大好き！！！！
ということで、コーディングしながらお寿司をみれるプラグインです。
こちらはダウンロードしたらお寿司が回転します。

> Windows 10 で動作確認済み、Macでは未確認です。ご容赦ください。

とあるので、ご注意を。。。

また、`Enable flow Sushi`にチェックを入れたら「workbench.main.css が Program Files 配下にあると、この拡張機能は使えません。」とアラートがでるので、`workbench.main.css`のコピーを`Program Files`と同列に置いたらうまくいくのではないかと思います。

いつでも回転寿司気分を味わうことができますね！！！

### Power Mode
https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-power-mode
冒頭に紹介したプラグインです。
こちらは少し設定が必要なので、これから入れる人、一緒に設定をしていきましょう。

#### 設定方法
##### 1. Power Modeの設定

ファイル > 基本設定 > 設定 > 拡張機能　> Power Modeの設定を開き、
`Enable to active POWER MODE!!!`にチェックを入れます。

<img width="1072" alt="スクリーンショット 2019-12-21 19.43.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/5e56fc87-588b-011d-a2a5-0c5c6a8f3ab0.png">



##### 2. Powermode: Presetsを変更
スクロールをしていき、`Powermode: Presets`の設定を以下から
好きな表現を選択できます。

<img width="1420" alt="スクリーンショット 2019-12-21 19.45.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/eaa26b20-b983-1164-da44-97df7fddeae7.png">


* particles
    * キラキラパリピぽいやつ
* fireworks
    * 花火舞うやつ
* flames
    * 火がぶわああああんるやつ
* magic
    * 爆発するやつ
* clippy
    * クリップでてくるやつ
* simple-rift
    * 青く光るやつ
* exploding-rift
    * なんかすげえSFぽいやつ

強くなった気がします。


## まとめ

今回はコーディングするときに少しテンションを上げてくれるプラグインを紹介しました。
紹介したのは以下です。

* sashisuseso
* ttaaaan Package
* Sushi Buffet
* Power Mode

私たちのテンションをきっと彼らは上げてくれるでしょう。
（私はPower Modeに助けられてます）

素敵なコーディングライフを！！！！！！

後輩A「僕は入れないんですけどね。」
elm-playgroundで素数ホッケー

今日は**12月21日**ですね。

ということで[Elm2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/elm2) **20日目** の記事です。[^1]

[^1]: 1日遅れで申し訳ありません。

この前の[ELMP1](https://y047aka.github.io/ELMP1/)というイベントで面白いゲームがたくさん紹介されていて、自分も簡単なゲームを作りたくなりました。
実際に作ったものの紹介と、製作に使用した[elm-playground](https://package.elm-lang.org/packages/evancz/elm-playground/1.0.3/)というパッケージのメリット・デメリットを挙げてみました。


## 作ったもの

素数ホッケー[^2]です。
PC専用です。スマホでも表示できますが動かしづらいです。

[^2]: 飛んでくる数が素数かどうか判定して弾き返したり受け入れたりするやつです。

[ソースコード](https://github.com/qnoyxu/elm-hockey)
[デモ](https://qnoyxu.github.io/elm-hockey/)

![hockey-demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239916/01f86e85-e290-14bd-ea14-9593714f31a3.png)

※読めば分かると思うのでソースコードの説明はしません。

## 感想

`elm-playground`ではThe Elm Architecture(TEA)ではない独自の仕組みで開発していきます。
これは素数ホッケーみたいな小規模ゲームを作る上でとても便利です。

### :o: 簡単にゲームが作れる

まず学習コストがめちゃくちゃ低く、

* `view`関数内で、一定のルールに従って図形を配置する
* `update`関数内で、時間経過とユーザーのアクションをもとにデータを更新する

この構造さえ理解すれば完了です。

素数ホッケーの製作期間は2日くらいでした。
**CSSを一切書かなくていい**のがとっても楽です。

### :o: 安全にゲームが作れる

Elm界ではありがちな話ですが、何も考えずに書いてるのに安全なプログラムが勝手に完成してしまいます。
データの更新が`update`というたった1つの関数だけで行われるので「訳わからんバグを産み出してテンションガタ落ち」を経験することなく作れました。

人々の不幸をぶち壊してくれるEvanさんはすごいです。

<br/>

一方で、`elm-playground`はTEA以上に**外界とのデータのやりとりがすごく制限されている**ため、次のような不便がありました。
たとえば、

~~### :x: ランダム要素を持たせることができない~~

~~ランダム要素はユーザーをゲーム中毒にして廃課金してもらうには必要不可欠なものと言えますが、`elm-playground`では**乱数を生成することができない**みたいです。~~
~~したがって、ゲーム製作でお金を儲けたい場合には向いてないと思います。~~

~~素数ホッケーでもランダムな値は当然使いたいのですが、今回に関してはソースにベタ書きした乱数のリストと時刻を数値化する関数の１つである`zigzag`を組み合わせて擬似的な乱数を作るようにしました。~~

訂正: 嘘でした。[Random.Seed](https://package.elm-lang.org/packages/elm/random/latest/Random#Seed)を使えば乱数を生成できます。

### :x: ストレージを使えない

TEAでは`Port`という機能を使ってLocal Storageにデータを保管して再利用することができますが、`elm-playground`ではそれにあたる機能がありません。
たとえばユーザーの自己ベストスコアを保存しておくみたいなことはできませんでした。

### :x: ユーザーのアクションが限定的になる

ユーザーの動きはElm上の`Computer`という型に渡されますが、マウスの位置やキーボードの上下左右など一部しか格納されていないため、それらのアクションのみで成立するゲームしか作れません。

この素数ホッケーをスマホでやろうとすると、スティック(赤い丸いやつのことです)をうまく動かせません。
これはスワイプアクションを拾えなかったことが原因です。

`Computer`という型名のとおり、PC上で動くゲーム開発を想定してるんだと思います。


## まとめ

`elm-playground`は

* 簡単にブラウザゲームが作れる
    * プログラミングの楽しさを知ることができる
    * Elmの初期学習に向いてそう
* 制約がかなり大きい
    * Elmで本格的なゲームを開発するならTEAのほうがいい
醤油でオブジェクト指向を理解する

ふと思いついた。醤油でオブジェクト指向を解説したくなった。

カバーしていること
クラスの継承とダックタイピング


```
#　全ての醤油の神
class 醤油

  attr_reader :saltiness, :sweetness, :thickness

  def initialize(attr)
    @saltiness = attr[:saltiness] || default_saltiness
    @sweetness = attr[:sweetness] || default_sweetness
    @thickness = attr[:thickness] || default_thickness
  end

  def default_saltiness
    raise "小クラスで定義してくださいまし"
  end

  def default_sweetness
    raise "小クラスで定義してくださいまし"
  end

  def default_thickness
    raise "小クラスで定義してくださいまし"
  end

  def describe_saltiness
    raise "小クラスで定義してくださいまし"
  end

  def describe_sweetness
    raise "小クラスで定義してくださいまし"
  end

  def describe_thickness
    raise "小クラスで定義してくださいまし"
  end

end

class キッコーマンの普通の醤油 < 醤油

  def describe_saltiness
    "すげーしょっぱい"
  end

  def describe_sweetness
    "全然甘くない"
  end

  def describe_thickness
    "めっちゃさらさら"
  end

  private

  def default_saltiness
    100
  end

  def default_sweetness
    10
  end

  def default_thickness
    5
  end
end

class キッコーマンの減塩の醤油 < 醤油

  def describe_saltiness
    "まぁまぁしょっぱい"
  end

  def describe_sweetness
    "全然甘くない"
  end

  def describe_thickness
    "めっちゃさらさら"
  end

  private

  def default_saltiness
    70
  end

  def default_sweetness
    20
  end

  def default_thickness
    10
  end
end

class どこかの甘い醤油(多分九州とかで愛用されてる系の醤油) < 醤油

  def describe_saltiness
    "全然しょっぱくない"
  end

  def describe_sweetness
    "めっちゃ甘い"
  end

  def describe_thickness
    "けっこうトロトロ"
  end

  private

  def default_saltiness
    10
  end

  def default_sweetness
    60
  end

  def default_thickness
    30
  end
end



普通の醤油 = キッコーマンの普通の醤油.new
減塩の醤油 = キッコーマンの減塩の醤油.new
甘い醤油 = どこかの甘い醤油(多分九州とかで愛用されてる系の醤油).new

普通の醤油.describe_saltiness
#=> "すげーしょっぱい"

普通の醤油.describe_sweetness
#=> "全然甘くない"

普通の醤油.describe_thickness
#=> "めっちゃさらさら"


減塩の醤油.describe_saltiness
#=> "まぁまぁしょっぱい"

減塩の醤油.describe_sweetness
#=> "全然甘くない"

減塩の醤油.describe_thickness
#=> "めっちゃさらさら"


甘い醤油.describe_saltiness
#=> "全然しょっぱくない"

甘い醤油.describe_sweetness
#=> "めっちゃ甘い"

甘い醤油.describe_thickness
#=> "けっこうトロトロ"
```
PoetryをFishで使う(Pipenvからの移行)

# はじめに
[2020 年の Python パッケージ管理ベストプラクティス](https://qiita.com/sk217/items/43c994640f4843a18dbe)がバズっていたので調べてみたところ、以前から気になっていた[Poetry](https://python-poetry.org)がかなり良くなっているということなので、Pipenvから移行してみた。

# 環境
OS: macOS 10.15 Catalina
Shell: [Fish](https://fishshell.com)

# Poetryのインストール

```bash
pip install poetry
```

# 環境変数設定
Pipenvでは、仮想環境がプロジェクトフォルダに作成されるように、以下のように設定していた。

```bash
export PIPENV_VENV_IN_PROJECT=true
```

Poetryでは以下のように設定すれば良いらしい。

```bash
poetry config --list
poetry config virtualenvs.in-project true
```

#Pipfile→pyproject.toml
Poetryではpyproject.tomlでライブラリを管理するため、変換が必要になる。
幸いにも、変換ツール[poetrify](https://github.com/kk6/poetrify)が公開されているので、それを用いることにする(詳しくは[作者のブログ](http://kk6.hateblo.jp/entry/2019/01/16/191452)を参照)。

```bash

pip install poetrify
cd example/
poetrify generate
```
試しにPipfileを変換してみるとうまくいった。

```Pipfile:Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
black = "==18.3a1"
mypy = "*"
pytest = "*"

[packages]
numpy = "*"
scipy = "*"
plotly = "*"
sklearn = "*"

[requires]
python_version = "3.7"
```

```toml:pyproject.toml
[tool.poetry]
name = "exampy"
version = "0.1.0"
description = ""
authors = ["ryoppippi <1560508+ryoppippi@users.noreply.github.com>"]

[tool.poetry.dependencies]
python = "^3.7"
numpy = "^1.17.4"
scipy = "^1.4.1"
plotly = "^4.4.1"
sklearn = "^0.0"

[tool.poetry.dev-dependencies]
black = "^19.10b0"
mypy = "^0.761"
pytest = "^5.3.2"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
```

# 仮想環境の構築
以下を実行すると仮想環境の構築、`poetry.lock`ファイルの作成が行われ、仮想環境が起動する。

```bash
poetry shell
```
![Dec-21-2019 19-44-51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96492/9ca56664-d053-3aaf-26eb-a1cbf74a6ce8.gif)


# Fish向けプラグイン
筆者はFishをシェルとして使用しているが、Pipenv時代には[fish-pipenv](https://github.com/sentriz/fish-pipenv)というプラグインを愛用していた。
このプラグインは、pipenvで構築したプロジェクトのディレクトリに移動した時に自動で仮想環境をactivateしてくれる優れものであった。
残念ながらPoetry用にはまだ同等のものがなかったので、今回自作した。是非とも活用して欲しい。
[fish-poetry](https://github.com/ryoppippi/fish-poetry)
![Dec-21-2019 19-55-32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96492/7ad3395d-6465-e486-7c85-678c664d06b5.gif)

# まとめ
Pyenvとの連携が若干微妙だったりと不満点もなくはないが、圧倒的にlockが早く終わるなど利点も多い。順次Poetryに移行していこうと思う。
dagger2入門 - basic(@Named &  @Qualifier)

# 概要
* [dagger2入門 - basic(@Module & @Provides)](https://qiita.com/alingogo/items/ad310f41eda3fec13ffa)にモジュールの使い方を紹介した
* 今回は、モジュールから提供するインスタンスの引数が違い場合の対応方法を紹介する

# @Namedを利用する
## コード
* https://github.com/fork-alin/study_dagger2_with_kotlin/blob/master/src/main/kotlin/named.kt

## 結果
```
Red
Blue

Process finished with exit code 0
```

## 説明
* @Injectで引数違いインスタンスを区別できないが、@Namedを利用して同じクラスのインスタンスを分けれる
* しかし、@Named("SelfType_red")に「SelfType_red」の定義が使いにくい


# @Qualifier
## コード
* https://github.com/fork-alin/study_dagger2_with_kotlin/blob/master/src/main/kotlin/qualifer.kt


## 結果
```
QualifierRed
QualifierBlue

Process finished with exit code 0
```

## 説明
* @Qualifierで新しいannotationを定義して文字列(SelfType_red)より使いやすい