OmniAICreator/Qiita-1.07M huggingface dataset:
【Salesforce】条件分岐で動的SOQLを作成してみよう！

# 動的SOQLとは？
>動的 SOQL は、Apex コードを使用して、実行時に SOQL 文字列の作成を参照します。動的 SOQL によって、さらに柔軟なアプリケーションの作成が可能になります。たとえば、エンドユーザの入力に基づいた検索を作成したり、さまざまな項目名のレコードを更新したりできます。
[動的 SOQL](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dynamic_soql.htm)

# テストデータ
<img width="955" alt="コメント 2020-04-11 080310.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/fcc012a9-65a5-4338-9a8f-90c83cbba76e.png">
「Warm」が3件、「Hot」が2件、「Cold」が2件で全部で7件存在する状態。

# テストコード
```apex:test.cls
// パラメータから取得してきた値から条件分岐することを想定
String flag = '1';

String selectPart = 'SELECT Id, Name, Rating ';
String fromPart = 'FROM Account ';
String wherePart = 'WHERE ';

if(flag == '1'){
    wherePart += 'Rating = \'' + 'Hot' + '\'';
}else{
    wherePart += 'Rating = \'' + 'Cold' + '\'';
}

String soql = selectPart + fromPart + wherePart;
System.Debug('★★ 変数 soql ： ' + soql);
List<Account> accList = Database.query(soql);

for(Account acc : accList){
    System.Debug('★★ 変数 acc ： ' + acc);
}
```

# 実行結果
<img width="575" alt="コメント 2020-04-11 081951.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/27384ab2-e3d5-8ad4-ea3f-ac0b7a557ec7.png">

もし渡したフラグが「2」であった場合は以下のとおりです。
<img width="618" alt="コメント 2020-04-11 082144.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/b3526ab9-5153-4ec5-3988-83981ac99b96.png">
TermiusでConoHaにSSH接続する方法

お疲れさまです。

ConoHaにTermiusを使ってSSHで接続するための手順をまとめました。

1. [「サーバー」を選択](# 1.「サーバー」を選択)
2. [「ネームタグ」を選択](# 2.「ネームタグ」を選択)
3. [「IPアドレス」を確認](# 3.「IPアドレス」を確認)
4. [「NEW HOST」を選択](# 4.「NEW HOST」を選択)
5. [「Edit HOST」にIPアドレスとアカウント情報を入力](# 5.「Edit HOST」にIPアドレスとアカウント情報を入力)
6. [「Hosts」からSSH接続するサーバーを選択](# 6.「Hosts」からSSH接続するVPSを選択)
7. [コンソールを表示](# 7. コンソールを表示)

# 1.「サーバー」を選択

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/cce673c1-7f31-de4d-8386-ea30dd2fd61f.png)

左側のメニューから「サーバー」を選択します。

# 2.「ネームタグ」を選択

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/13eae481-bb3c-47ce-b2d3-bd9f032eca25.png)

「サーバーリスト」から接続するサーバーの「ネームタグ」を選択

# 3.「IPアドレス」を確認
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/3c92860d-c8f3-1fe0-d08d-88d585e08f18.png)

「ネットワーク情報」メニュー内から、接続するサーバーのIPアドレスを確認

# 4.「NEW HOST」を選択

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/fd77860f-5e4f-47c0-1e51-aed1d5234663.png)

画面左上の「NEW HOST」ボタンのクリック

# 5.「Edit HOST」にIPアドレスとアカウント情報を入力

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/d01f054b-ea4c-2068-bdc2-99d2d432f03e.png)


画面左側に「Edit HOST」が表示されるので、IPアドレスとConohaのアカウント情報を入力して、「Save」ボタンをクリック

# 6.「Hosts」からSSH接続するVPSを選択

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/3728fcb8-a4fd-2f86-3070-ac518e4ff5e1.png)

「Hosts」からSSH接続するVPSを選択します。

# 7. コンソールを表示

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33984/c1141f80-33de-4d57-611c-37e2dfde961f.png)


SSH接続したVPSのコンソールが表示されます。

以上になります。

お疲れさまでした。
今来た手を動かしたい人のための UNVT 案内 Early 2020

創設3年目の国連ベクトルタイルツールキット (UNVT) に、今入ってみたいけど何をすればいいのというスタンスの Raspberry Pi ユーザのためのとりあえずの案内です。

![](https://un-vector-tile-toolkit.github.io/signature/logo.png)

# コアコンセプト
国連ベクトルタイルツールキットは、公的機関でもベクトルタイルのウェブ地図を生産・配信・設計・最適化できるようにするための、サーバの中の人用のオープンソース・ソフトウェア集です。

そういったオープンソースソフトウェアは Linux で動くことが標準であることと、サーバの中の人が直面するサーバ環境は多様であることから、なるべく多くの Linux 環境で動くことを目標にしています。

他方で、実運用以前の技術移転の局面では、なるべく少ない手数で安価に多数揃えられる Linux 環境として、Raspberry Pi を使用します。

運用レベルで UNVT を使いたい人は、それぞれのサーバ環境に合わせて UNVT を据付けることになりますが、まずは UNVT を試してみたい人には、Raspberry Pi 上でトレーニングを行う、というコンセプトを持っています。

UNVT の開発はまだまだ継続中で、これまでもこれからも、コンパクトなソフトウェアを何度でも書き直すということをやっており、結果として今入りたいひとがとっつきづらい状況が生じていると思いましたので、このドキュメントを書いてみました。

今のところ、UNVT のデモという観点での一番コンプリートな一式は、[Misora](https://github.com/un-vector-tile-toolkit/misora-leaflet/blob/master/misora.pdf) ですが、Misora はある程度辿ってみた、あるいは Misora よりもシンプルな方法を考えているのであればそちらを知りたいという方には、このエントリは参考にしていただけると思います。

# Raspberry Pi の基本的取り扱い
## Raspbian のインストール
2020年3月にリリースされた [Raspberry Pi imager](https://www.raspberrypi.org/blog/raspberry-pi-imager-imaging-utility/) を使うと、 MicroSD カードへの Raspbian の導入が簡単です。

# Raspbian 用 UNVT インストーラ equinox 
Docker をまったく用いずに、素の Rapbian の上で UNVT を使うためのインストーラである [equinox](https://github.com/unvt/equinox) を2020年3月に開発しました。

今後、技術移転にはこちらを使っていくことになると思います。

equinox に含まれているソフトウェアの一覧は [equinox の README.md](https://github.com/unvt/equinox/blob/master/README.md) に記載しています。

なお、equinox と equivalent なツールキットを ubuntu:latest (amd64) 上で実現するための Docker コンテナイメージとして、[nanban](https://github.com/unvt/nanban) も並行維持しています。

# （参考） 今進めている開発は何か
技術移転モードで、UNVT の流れを辿っていただくための標準教材の開発を進めています。5月の連休明けには使えるものを作ればという観測を持ちながら、少しずつ進めています。プロダクトは、次の通りです。

- [Vector Tile Academy (VTA)](https://unvt.github.io/vta): こちらが作りかけの教材です。教材から作り始めるというアプローチだと、教材開発者の私が全体像をよく捉えられないという弊害があることに気がついたので、次の naru を作り始めています。
- [naru](https://github.com/unvt/naru): 上記 VTA のためのコードです。実行例ファーストで開発をはじめたところです。

VTA シリーズの開発と並行して、地理院地図 Vector タイルの速いスタイルである [toki](https://github.com/optgeo/toki) の開発も続けていますが、今週末あたりから、toki よりも naru に力を入れていきたいと思っています。

フィードバックやコラボレーションは、常に歓迎したいと思っています。フィードバックやコラボレーションをしてもらいやすくするための環境整備を行う必要があることも、意識はしています。
Microsoft Teams の授業での活用


#はじめに
本記事では、Microsoft Teams を授業で利用する際の Office 365 のテナント取得方法、アカウントの登録、Teamsの利活用までを解説していきます。週末に執筆していますので出来上がり次第順次公開していきますのでご活用ください。

#目次
## Office 365
- [Office 365 | 10分でできる Office 365 Education A1 の利用開始手続き](https://qiita.com/hisaho/items/74b6ba9ba9b4f501f74c)
- [Office 365 | 10分でできる Office 365 Education のユーザー登録](https://qiita.com/hisaho/items/58e4e4024ee73280ece7)

##Microsoft Teams
- [Microsoft Teams for Education | Education 特有の機能の紹介](https://qiita.com/hisaho/items/7268e3382e5d8803b048)
- [Microsoft Teams | 10分でできる 授業で利用するチームの準備する](https://qiita.com/hisaho/items/2667f3d8979aa92f79c2)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 教材の共有](https://qiita.com/hisaho/items/5e365ffb63ca9ab83f6c)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程を登録する #1](https://qiita.com/hisaho/items/fa57301d79b64ced3568)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程(定期開催)を登録する #2](https://qiita.com/hisaho/items/a9e1ae8c517543063a02)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンライン授業で失敗しないためのTips #1](https://qiita.com/hisaho/items/811831669c552417f8be)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンライン授業の準備(機材編)](https://qiita.com/hisaho/items/ae479728f007fd7d4130)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 課題の作成](https://qiita.com/hisaho/items/a356f98d25a743af3ba3)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 課題の提出](https://qiita.com/hisaho/items/db874220521528052e81)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 課題作成(マークシート方式)](https://qiita.com/hisaho/items/2ab63dbedd46bc64b096)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 遠隔授業と授業録画](https://qiita.com/hisaho/items/fcb4f9a7f563582ea559)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 録画した動画の公開](https://qiita.com/hisaho/items/83c72fd029720586a6a2)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | Microsoft Teams の仕様](https://qiita.com/hisaho/items/213dd1e029bcc32947be)
- [Microsoft Teams | Teams 設定のTips](https://qiita.com/hisaho/items/7e820c4d41fdb6a5472b)

##PowerPoint
- [PowerPoint プレゼンテーションでリアルタイム字幕を付ける](https://qiita.com/hisaho/items/847a75bb438cfa636e49)

## Microsoft Stream
- [Microsoft Stream | 10分でわかる はじめての Microsoft Stream | 動画配信](https://qiita.com/hisaho/items/445d8292f2abbe7a90b1)

## Azure Information Protection
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | コンテンツ(教材)の保護(Microsoft Office 編)](https://qiita.com/hisaho/items/0b85e97d5cad7c17d762)
Jetson nanoのケースを3Dプリントする(Ubuntu 18.04)

- Jetson nanoのケースを3Dプリントするまでにやったことをまとめました
- OSはUbuntu 18.04です
- モチベ：Jetson nano仲間、3Dプリント仲間を増やしたい
- 記事内容にプルリクがある場合はコメントいただけると嬉しいです


## ロードマップ
- 必要な物を購入する
- 必要なソフトウェアを入れる
- 3Dデータ(.stlファイル)をDLする
- 3Dデータ(.stlファイル)を3Dプリンター語(.gxファイル)に変換
- プリント

### 必要な物を購入する
- 3Dプリンター([FLASHFORGEのFinder](https://www.amazon.co.jp/FLASHFORGE-%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8-3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC-Finder-PLA%EF%BC%91%E3%83%AA%E3%83%BC%E3%83%AB%E4%BB%98%E3%81%8D/dp/B073PPJ9Y9)を使います)
- USBメモリ(容量は必要ありません。4G程度でも問題ないと思います)

### 必要なソフトウェアを入れる
- Flashprintというソフトをインストールします。
- zipを[公式のページ](https://flashforge.co.jp/support/)からDLして展開し、.debを実行すればOKです。

### 3Dデータ(.stlファイル)をDLする
- [yeggi](https://www.yeggi.com/)という、3Dデータの共有サイトで既存のデータを探します。
- 今回は[こちら](https://www.thingiverse.com/thing:3518410)のデータをお借りしました。(ライセンス : CC BY ecoiras)

### 3Dデータ(.stlファイル)を3Dプリンター語(.gxファイル)に変換
- Flashprintを開き、ツールバーの「file」→「load file」と進みます。
- .stlファイルを選択して開きます。

![EVRkfr7WsAAtxwV.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/f9c54002-4d31-c52e-f7d3-8c0d4a478787.jpeg)

- 「Print」を選択して.gxファイルに変換します。
- 設定は下記画像の様にしています。

![Screenshot from 2020-04-11 07-38-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/c30da5c9-1001-f5f7-3a2d-6765f6573903.png)


### プリント
- .gxファイルをUSBメモリにコピーし、プリンタへ接続します。
- ベースにノリを塗る等のセッティングをし、プリンタの手順に従ってUSBメモリのデータを選択、プリントします。
- 2〜3時間程度でプリント出来ます。

![EVRkgXYXQAIlROK.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/3e2d6d08-c5ce-6237-8509-11d73a816470.jpeg)


### 完成 !

![EVRkhydXgAcxy9B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/34de76b3-512d-041c-1d0e-5029a58454c5.jpeg)
![EVRkjJXWsAAfOKO.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/240a7576-bb86-5efe-faba-084ad28f623e.jpeg)

- (一部、カメラモジュール取り付けのために上部パーツを変更しています)
plunkerでd3 その5

#概要

plunkerでd3やってみた。
covid-19のjson読んで、table作ってみた。


#写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e683fd58-73e8-071f-b03c-672eaa1238b5.png)


#サンプルコード


```

d3.json("https://covid19-japan-web-api.now.sh/api/v1/positives", function(error, data) {
  var keys = ["id", "announcement_date", "diagnosis_date",
  "prefecture", "residence_prefecture", "age", "gender", "attribute", "prefecture_number", "travel_or_contact", "detail", "cluster", "src", "onset", "symptom", "death_or_discharge_date", "comment1", "outcome", "outcome_src", "comment2"];
  var table = d3.select("body").append("table").attr("border", "1")
  table.append("thead").append("tr").selectAll("th").data(keys).enter().append("th").text(function(d) {
    return d;
  });
  for (var i = 0; i < data.length; i++)
  {
    var rows = [];  
    keys.map(function(c) {
      rows.push(data[i][c])
    });
    table.append("tbody").append("tr").selectAll("td").data(rows).enter().append("td").text(function(d) {
      return d;
    });
  }
});
```

#成果物

https://embed.plnkr.co/plunk/caTo1ZJFwa6rqrfS

以上。
google で英語で検索する方法

# google で英語で検索する方法

よく忘れるのでメモ

https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0

## 情報源

https://www.suzukikenichi.com/blog/how-to-search-on-google-com-in-english-from-japan/
Ubuntu 20.04 で docker をインストールする

# Ubuntu 20.04 で docker をインストールする

[Ubuntu 19.10 では手順](https://qiita.com/m-tmatma/items/52aea7f73729df6c3411)がめんどくさいですが、ubuntu 20.04 だと簡単です。

## 手順

※ 2020/4/9 時点での daily build で確認

### docker と  docker-compose  のインストール

```
sudo apt install -y docker.io docker-compose
```

※ 以下手順は不要みたい

```
sudo systemctl start  docker
sudo systemctl enable docker
```

## docker を sudo なしで使用できるようにする。

### 現在のログインユーザーを docker グループに追加する。

※ docker をインストールしただけで docker グループは作成されている。

```
sudo usermod -a -G docker $USER
```

### 再起動する

※ 参考サイトでは docker デーモンの再起動だけで OK のような書き方だが、docker デーモンの再起動とログオフ/ログインでは反映されなかった。

```
sudo reboot
```

https://docs.oracle.com/cd/E39368_01/E75728/html/section_rdz_hmw_2q.html

## gist

https://gist.github.com/m-tmatma/802a8650b158925a26320cf2ab2c85ac



## Ubuntu 20.04 の入手先の情報

https://qiita.com/m-tmatma/items/4848532ca4c361c92f76
AWS educate S3で「Create bucket」する際に起きるエラーの解決方法

##エラーの内容
※AWS educateをクレジットカードの登録無しで使っている場合のみに起きるエラーだと思います。AWS S3で起きたエラーですが、他のAWSサービスでも同じエラーが起きるかもしれません。

AWS S3で「Create bucket」すると、「Failed to create bucket」というエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/2e8b7f55-b801-17db-891e-61572c03904a.png)
##エラーの解決方法
「Region」の項目を「N. Virginia」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/0cdc046f-867b-9969-01fb-e8a60c88eea6.png)
AWS educateでは、「Region」は「N. Virginia」にしか対応していないと、書かれていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/94ea7151-ca06-e821-8b1d-a5f3c445ada5.png)
間違えてregionをAsia pacific(Japan)にしてしまう方がとても多そうだな…と感じてしまいました。
それに、エラーの内容が全く関係のないものだったので、私は解決に結構時間がかかりました（笑）

##その他
teratailで質問したときのURLです。
https://teratail.com/questions/252816?modal=r-comp&reply=true

記事について間違えている部分などありましたら、教えていただければ幸いです。
【今日のアブストラクト】Memory Networks【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Memory Networks](https://arxiv.org/abs/1410.3916)

# Abstract

### 訳文

メモリネットワークと呼ばれる新しい学習モデルのクラスを説明する. メモリネットワークは, 推論の要素と長期記憶の要素を組み合わせて推論を行い, それらを共同で使用する方法を学習する. 長期記憶は読み書きが可能であり, 予測に利用することを目的としている. 本研究では, これらのモデルを, 長期記憶が (動的な) 知識ベースとして効果的に機能し, 出力はテキストによる応答で, ある質問応答の文脈で研究する. 本研究では, 大規模な QA タスクと, 模擬世界から生成された小さいがより複雑な玩具タスクを用いて, これらのモデルを評価した. 後者では, 動詞の意味を理解することを必要とする問題に答えるために, 複数の支持文を連結することで, このようなモデルの推論力を示す.




### 原文

We describe a new class of learning models called memory networks. Memory networks reason with inference components combined with a long-term memory component; they learn how to use these jointly. The long-term memory can be read and written to, with the goal of using it for prediction. We investigate these models in the context of question answering (QA) where the long-term memory effectively acts as a (dynamic) knowledge base, and the output is a textual response. We evaluate them on a large-scale QA task, and a smaller, but more complex, toy task generated from a simulated world. In the latter, we show the reasoning power of such models by chaining multiple supporting sentences to answer questions that require understanding the intension of verbs.
初心者によるプログラミング学習ログ 287日目

#100日チャレンジの287日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
287日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>287日目　2h<br>・xdデザインカンプからのサイト模写<br>・メンターさんからの課題<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><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1248702774876844032?ref_src=twsrc%5Etfw">April 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ウイルス感染の簡易シミュレーション

## はじめに

March 14, 2020 のワシントンポスト紙に、以下のような記事が掲載されました。

* ***Why outbreaks like coronavirus spread exponentially, and how to “flatten the curve”***<br>
https://www.washingtonpost.com/graphics/2020/world/corona-simulator/

日本語版は、下記にあります。

* ***コロナウイルスなどのアウトブレイクは、なぜ急速に拡大し、どのように「曲線を平らにする」ことができるのか***<br>
https://www.washingtonpost.com/graphics/2020/health/corona-simulation-japanese/

ボール同士の接触という簡単な原理を使って、
ウイルスの感染者数がどのように増えて、そして減少していくのかを紹介した記事で、
とても理解しやすかったかと思います。

ちなみに、Python(JupyterLab)で再現されている方もいらっしゃいます。

* ***JupyterLab で COVID19_simulator 作ってみた***<br>
https://qiita.com/yasubei/items/ca48528daac456e339d3

## 自分でも作ってみた

ちなみに、私の方ですが、、、、

いろいろとパラメータを操作して自分でもシミュレーションしてみたかったので、
処理が軽く済むように、ボールが衝突した際の跳ね返りは無視してボールの重なり合いを感染とみなすようにして、

***Python版(モジュールpygameを使用)***と***HTML&JavaScript版***を作ってみました。

* ***Python3版***
https://github.com/NobuyukiInoue/CountBallsOverlap_by_Python3

* ***HTML&JavaScript版***
https://github.com/NobuyukiInoue/CountBallsOverlap_by_JavaScript

どちらも基本的には同じ処理ですが、描画の仕組みの違いもあり、
Python版よりも、Webブラウザ上で動作するJavaScript版の方がかなり高速になっています。

乱数を使ってボールの初期位置や移動量を決めていますので、実行結果は毎回変わります。
最初に感染しているボールは、すべてのボールの中で一番左側に配置されているボールが１つだけ選ばれます。

デフォルトのパラメータ（ボール数300）であれば、
Python版は10～15秒程度、JavaScript版が5～10秒程度で収束します。

すべてのボールの１回の移動と描画をターンと呼ぶことにし、

* 画面の大きさ（幅、高さ）
* ボール数
* ボールの半径
* 表示ウェイト
* 回復までに必要なターン数
* 回復までのターン数
* 部屋を遮る壁(bar)の有無と大きさ（幅、高さ）
* 動かないで停止しているボールの比率

などを自由に指定できるようにしています。

実行中は、

* 未感染のボール・・・青色
* 感染中のボール・・・赤色
* 回復したボール・・・緑色

で表示しており、画面下部には、
感染中のボールの数と、回復したボールの数の推移を表すグラフが、
リアルタイムで表示されます。

ゆっくりと動きを見たいときは、表示ウェイトを増やしてみると良いでしょう。

同じ条件でも毎回異なる結果になりますので、
何度も実行を繰り返し、描かれるチャートの出現比率などを調べても面白いかもしれません。

## Demo

HTML&JavaScript版は、下記のURLにも配置しており、どなたでも実行できます。
いろいろとパラメータを変えて、遊んでみると良いでしょう。
（スマホからでも実行できます。）

* HTML&JavaScript版のデモページ(CountBallsOverlap)<br>
https://www.asahi-net.or.jp/~gx3n-inue/apps/CountBallsOverlap/index.html

![ScreenShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262326/8902b165-b0b2-4b47-3ae1-4245769d2b31.png)


## 2020/04/25追記
***IHASHI28 教育系ch.*** さんの動画でも、シミュレーション結果例が紹介されました。

* どうして自粛しなきゃいけないの？　新型コロナウィルス(COVID-19)感染拡大シミュレーションによる行動自粛の効果の検証<br>
https://www.youtube.com/watch?v=5iDxtLxb9Yw&feature=youtu.be&fbclid=IwAR0mSFd__yVD20t7h3VI5l_kVVaxXEntoAn1GJCopz4NsqDk3G76ia2Wkp4
AWS RDSでデータを管理する

# はじめに

- AWS上でリレーショナルデータベースを扱うには、以下の方法があります。

 - AWS EC2を構築して、DBを乗せる
 - AWS RDSを使う


# AWS RDS無料枠

- 無料枠は以下の内容
 
> - 750 時間/月の db.t2.micro データベース使用 (適用可能な DB エンジン)
> - 20 GB の汎用 (SSD) データベースストレージ
> - 20 GB のデータベースバックアップおよび DB スナップショット用ストレージ

# 簡単作成 - MySQL -

- [MySQL DB インスタンスを作成してデータベースに接続する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/faee68d5-578b-8582-f829-fc3f5c712033.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/78637dec-2310-2087-7655-1f873a845a27.png)

![aws_rds1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/e507d56e-6631-72b5-728c-ff64a4e4eff1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/4697fe7b-eea5-9534-4ce3-692e0772f1a6.png)

# EC2での作業（2020.05.02追記）

## mysql-clientのインストール

```sh
$ sudo apt install mysql-client-core-5.7
```

## EC2 -> RDSに接続する
```txt:
$ mysql -h RDSのエンドポイント -u RDSで設定したユーザ -p RDSで設定したパスワード
```

# mysql側での作業（2020.05.02追記）

## ユーザ・データベースの作成

```txt:
mysql> CREATE USER 'mysql'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> SET PASSWORD FOR 'mysql'@'%'='MyPassw0rd';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DATABASE awsfree;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON awsfree.* TO 'mysql'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE staff (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    staff_name VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT charset = utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO staff (staff_name) VALUES ('尼存 太郎');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO staff (staff_name) VALUES ('尼存 花子');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM staff;
+----+---------------+
| id | staff_name    |
+----+---------------+
|  1 | 尼存 太郎     |
|  2 | 尼存 花子     |
+----+---------------+
2 rows in set (0.00 sec)
```


# 動作確認（2020.05.02追記）

## pymysqlのインストール

```sh
$ pip install pymysql
```

## python -> mysql接続テスト

```py:rds_config.py
rds_host = 'RDSのエンドポイント'
db_user = 'mysql'
db_password = 'MyPassw0rd'
db_name = 'awsfree'
```

```py:rds_test.py
import pymysql
import rds_config as RDS

con = pymysql.connect(
        host=RDS.rds_host,
        user=RDS.db_user,
        password=RDS.db_password,
        db=RDS.db_name,
        cursorclass=pymysql.cursors.DictCursor
)

try:
    with con.cursor() as cur:
        sql = 'SELECT * FROM staff'
        cur.execute(sql)
        result = cur.fetchall()
        print(result)
except:
    print('Error !!!!')
```

```txt:staff追加
sql = 'INSERT INTO staff (staff_name) VALUES (%s)'
cur.execute(sql, ('尼存 次郎'))

con.commit()
```

```sh:接続テスト
$ python rds_test.py
```

```txt:実行結果
[{'id': 1, 'staff_name': '尼存 太郎'}, {'id': 2, 'staff_name': '尼存 花子'}]
```

# おわりに
- AWS RDSを使うとボタン、ポチポチで環境構築出来て便利。
- EC2->RDSへの接続テストを追記しました。（2020.05.02）
AKSでWindowsコンテナを動かす

※2020/04/11時点

意外とハマりました。
基本的にはドキュメントの通り
https://docs.microsoft.com/ja-jp/azure/aks/windows-container-cli

## .NETFrameworkで適当なコンソールアプリ作成

結論からいうと、ここのwindowsservercoreイメージの指定が悪くハマりました。
気軽に　mcr.microsoft.com/dotnet/framework/runtime:4.8
ではだめでした。

```dockerfile:Dockerfile
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8-20200211-windowsservercore-ltsc2019 AS runtime
WORKDIR /app
COPY bin/Debug .
ENTRYPOINT ["Docker48.exe"]

```

## ACR作成
sample1222　という名前
リソースグループはakstest という名前にしています。

```
az acr create -n sample1222 -g akstest --sku basic
```

## buildしてpush
--platform Windows　いります

```
az acr build --registry sample1222 --image dotnetapp48:v1.0 --platform Windows .
```

## AKSクラスター作成

```
az aks create --resource-group akstest --name myAKSCluster --node-count 2 --enable-addons monitoring --kubernetes-version 1.15.7 --generate-ssh-keys --windows-admin-password P@ssw0rd1234 --windows-admin-username azureuser --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --network-plugin azure  --attach-acr sample1222
```
--attach-acr でACRと紐づけ。 便利になりました。

`az aks create gives Could not create a role assignment for subnet. Are you an Owner on this subscription?`
というエラーでましたが、C:\Users\XXXXXX.azure\aksServicePrincipal.jsonを消して
何度か実行したら作成できました。

## Windows Server ノード プール追加

```
az aks nodepool add  --resource-group akstest --cluster-name myAKSCluster --os-type Windows  --name npwin  --node-count 1  --kubernetes-version 1.15.7
```

## クラスターに接続する

```
az aks get-credentials --resource-group akstest --name myAKSCluster
```

## マニフェスト作成してデプロイ

```yaml:sample.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample
  labels:
    app: sample
spec:
  template:
    metadata:
      name: sample
      labels:
        app: sample
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": windows
      containers:
      - name: sample
        image: sample1222.azurecr.io/dotnetapp48:v1.0
        resources:
        ports:
          - containerPort: 80
  selector:
    matchLabels:
      app: sample
---
apiVersion: v1
kind: Service
metadata:
  name: sample
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: sample
```

```
kubectl apply -f sample.yaml
```


最初に書いたとおりベースイメージ間違っているとpodが起動しないのですが、イメージのバージョン関連のエラーの後にunauthorized: authentication required　というエラーがでるのでACRの認証周りかと勘違いして時間を無駄にしました。

## 最後に

構築後からすぐにAzure Monitorでモニタリングできてログが見れるのはちょっとした検証に便利です。

![2020-04-11_01h29_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41243/8954f973-94b5-78fa-bcac-26aca95d37d9.png)
React Nativeでスクロールの方向や量に応じて何かをするHook (TypeScript)


## まえがき
ライブラリ作るほどでもないけど毎回コード書くのも面倒なので、リファレンス的な目的でcustom hookをべたっと貼りました。ScrollViewをラップしてRenderPropにしちゃってもOK。

用途は

- 下に一定スクロールしたら消え、上にスクロールすると戻るヘッダ（exampleはこれ）
- 下に一定スクロールするとXXする何か
- 一番下にスクロールしたら追加ロード
- などなど

## 結論
こんな感じで便利Custom hookを作って、、、

```react
import { useRef, useCallback } from 'react'
import { NativeSyntheticEvent, NativeScrollEvent } from 'react-native'

export function useScroll({
  onScrollUp,
  onScrollDown,
  onScrollRight,
  onScrollLeft,
  onScrollToBottom,
}: {
  onScrollUp?: (offsetY: number) => void
  onScrollDown?: (offsetY: number) => void
  onScrollRight?: (offsetX: number) => void
  onScrollLeft?: (offsetX: number) => void
  onScrollToBottom?: () => void
}) {
  const offset = useRef({ x: 0, y: 0 })

  const onScroll = useCallback(
    (event: NativeSyntheticEvent<NativeScrollEvent>) => {
      const { nativeEvent } = event
      const diffY = nativeEvent.contentOffset.y - offset.current.y
      const diffX = nativeEvent.contentOffset.x - offset.current.x

      if (onScrollDown && diffY > 0) {
        onScrollDown(diffY)
      }

      if (onScrollUp && diffY < 0) {
        onScrollUp(diffY)
      }

      if (onScrollRight && diffX > 0) {
        onScrollRight(diffX)
      }

      if (onScrollLeft && diffX < 0) {
        onScrollLeft(diffX)
      }

      if (
        onScrollToBottom &&
        nativeEvent.layoutMeasurement.height + nativeEvent.contentOffset.y >=
          nativeEvent.contentSize.height
      ) {
        onScrollToBottom()
      }
    },
    [onScrollDown, onScrollLeft, onScrollRight, onScrollToBottom, onScrollUp]
  )

  const onScrollBeginDrag = useCallback(
    (event: NativeSyntheticEvent<NativeScrollEvent>) => {
      const { nativeEvent } = event
      offset.current = nativeEvent.contentOffset
    },
    []
  )

  return {
    onScroll,
    onScrollBeginDrag,
  }
}

```

あとはScrollViewを使ってる画面で使うだけ。

```react

const THREASHOLD = 50

function SampleApp() {
  const [isHeaderActive, toggleHeader] = useState(true)
  const { onScroll, onScrollBeginDrag } = useScroll({
    onScrollDown: offsetY => {
      if (offsetY >= THREASHOLD) {
        toggleHeader(false)
      }
    },
    onScrollUp: () => {
      toggleHeader(true)
     },
  })
    
  return (
    <ScrollView
      onScroll={onScroll}
      onScrollBeginDrag={onScrollBeginDrag}
    >
      { isHeaderActive && <HeaderComponent /> }
    </ScrollView>
  )
}

```
IntellijのLightEdit Modeを使ってみる

2020.01がリリースされましたね。
新機能のひとつのLightEdit Modeを使うまでをメモ。

`idea`のコマンドで実行できるようにするために、PATH内の任意の場所にシェルスクリプトを作成する。
公式の例では下記に作るように記載してある。
`/usr/local/bin/idea`

```shell
#!/bin/sh

open -na "IntelliJ IDEA.app" --args "$@"
```

権限付与も忘れずに。

```shell
chmod +x /usr/local/bin/idea
```

あとは適当なファイルに対しこうしてあげると対象のファイルがLightEdit Modeで開きます。

```shell
idea /path/to/yourfile
```

## Toolboxを使っている場合はGUIから設定できるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125095/7ce25087-51a1-598a-9d02-75ad638fa295.png)

## 感想
開くまでのスピードはVSCodeには及ばないが、同じ感覚で使えて便利かな。
開くだけではなく、サブコマンドも用意されているので使ってみるのも良さそう。`idea diff file1 file2`とか

## 公式ドキュメント
https://www.jetbrains.com/help/idea/lightedit-mode.html
for文、if文について

※下記内容は、UdemyのURL教材を元に学習しております。
https://www.udemy.com/share/101Wu4AEIbd1ZRRHoF/

<h2>if構文を使った処理</h2>
ある条件を満たした場合に処理を実行したい場合使う関数。
基本の書き方は以下、

if(条件){
trueの場合に実行したい処理
}

また、falseの場合の処理の設定も可能。
その場合は以下

if(条件){
trueの場合に実行したい処理
}else{
falseの時に実行したい処理
}

<h2>for文</h2>
繰り返し処理を行える。
基本の書き方は以下、

for(初期値; 条件範囲; 変化式){
繰り返し処理したい内容
}

<h2>コードの反省点</h2>

偶数だけを二乗して出すと言う課題の処理で、以下のコードを書いた。
↓
for(i = 0; i <= 20; i++){
      if(i % 2 ==  0){
        System.out.printf("%d * %d = %d", i, i, i*i).println();
      }}
0 * 0 = 0
2 * 2 = 4
4 * 4 = 16
6 * 6 = 36
8 * 8 = 64
10 * 10 = 100
12 * 12 = 144
14 * 14 = 196
16 * 16 = 256
18 * 18 = 324
20 * 20 = 400

本来なら下記内容で済む
for(i = 0; i <= 20; i+=2){
         System.out.printf("%d * %d = %d", i, i, i*i).println();
       }
0 * 0 = 0
2 * 2 = 4
4 * 4 = 16
6 * 6 = 36
8 * 8 = 64
10 * 10 = 100
12 * 12 = 144
14 * 14 = 196
16 * 16 = 256
18 * 18 = 324
20 * 20 = 400

最適化されたコードで書けるようにする。

<h2>今日演習で書いた主なコード</h2>

<img width="1440" alt="スクリーンショット 2020-04-10 23.18.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615919/1ac638af-c1f9-2762-5e1a-1f35dee35133.png">
<img width="1440" alt="スクリーンショット 2020-04-11 1.37.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615919/df5ea0c6-596f-c446-c067-3ad10955963c.png">
<img width="1440" alt="スクリーンショット 2020-04-11 1.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615919/698276a2-b42f-ab39-e62c-a778bbecde20.png">
<img width="1440" alt="スクリーンショット 2020-04-11 1.37.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615919/b954f606-a967-fcb1-9466-010c228279b8.png">
混合ロジスティックモデル

```{r}

#mixed-logistic model 

#multi dimension

#見直し中

library(dplyr)

data=data.frame(num=1:20,y=c(0.20, 0.10, 0.49, 0.26, 0.92, 0.95, 0.18, 0.19, 0.44, 0.79, 0.61, 0.41, 0.49, 0.34, 0.62, 0.99, 0.38, 0.22,0.71,0.40),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56),x3=c(24.5,24,23,22.5,22,24,25,26,25,24,23,21,26,25.5,24,23,24,24,24,22),sign=0)

for(j in 1:nrow(data)){

data$sign[j]=ifelse(data$y[j]>0.49,1,0)

}

X=as.matrix(cbind(rep(1,nrow(data)),data[,colnames(data) %in% c("x1","x2")]))

Y=as.numeric(data$sign)




#Broyden Quasi-Newton Algorithm p.213

f=function(x){

pis=x[1:K];x=x[-c(1:K)];alpha=matrix(c(x),ncol=K)

pt=array(0,dim=c(K,nrow(X)));mat=array(0,dim=c(K,nrow(X)))

for(i in 1:K){
for(j in 1:nrow(X)){

pt[i,j]=pis[i]/(1+exp(-sum(alpha[,i]*X[j,])))

mat[i,j]=exp(-sum(alpha[,i]*X[j,]))/(1+exp(-sum(alpha[,i]*X[j,])))

}}

pt=t(t(pt)/apply(pt,2,sum))

vectors=array(0,dim=c(K,ncol(X)))

for(i in 1:K){

vectors[i,]=apply(X*c((pt*mat)[i,]),2,sum)

}

return(c(t(vectors)))

}

K=2

param=c(sample(seq(0.01,1,0.01),K),rep(0.01,K*ncol(X)))

XX=param

ite=10^7;

eta=10^(-5)

H=diag(f(XX))

for(l in 1:ite){

if(sum(abs(f(XX)))>10^(-9)){  

X_pre=XX  

XX[-c(1:K)]=XX[-c(1:K)]-eta*H%*%f(XX)  

s=XX[-c(1:K)]-X_pre[-c(1:K)]

y=f(XX)-f(X_pre)

H=H+((s-H%*%y)/as.numeric(t(s)%*%H%*%y))%*%t(s)%*%H

#print(sum(f(XX)))

ps=XX[1:K];XX=XX[-c(1:K)];a=matrix(XX,ncol=K)

Pt=array(0,dim=c(K,nrow(X)))

log_f=array(0,dim=c(K,nrow(X)))

for(i in 1:K){
for(j in 1:nrow(X)){

Pt[i,j]=ps[i]/(1+exp(-sum(X[j,]*a[,i])))

log_f[i,j]=-log(1+exp(-sum(X[j,]*a[,i])))

}}

Pt=t(t(Pt)/apply(Pt,2,sum))

ps=apply(Pt,1,mean)

Q=sum(Pt*log_f)+sum(Pt*c(log(ifelse(ps>0,ps,1))))

XX=c(ps,XX)

print(Q)

}

}  






```
作業ブランチを切り直してデプロイしようとした時に「error: some local refs could not be updated;」エラー


# 経緯
最初に作業ブランチとしてmasterからworkブランチを作成。
その後作業の関係でdevelopから同じworkという名前で
SourceTree上で作業ブランチを切り直したのがよくなかったみたいです。
（実はプッシュする時にもエラーが出たのでそれは余裕がある時に、、、）

見た目的には下記のブランチが存在してる感じ。
　・ *origin/work/master*
　・ *origin/work/develop*

#発生したエラー
で、 work/develop を origin/develop にマージして
デプロイコマンドを実行したときに下記のエラーが発生。

```
error: cannot lock ref 'refs/remotes/origin/work/develop': 'refs/remotes/origin/work' exists; cannot create 'refs/remotes/origin/work/develop'
From github.com:< gitRepository_url >
 ! [new branch]      work/develop -> origin/work/develop  (unable to update local ref)
error: cannot lock ref 'refs/remotes/origin/work/master': 'refs/remotes/origin/work' exists; cannot create 'refs/remotes/origin/work/master'
 ! [new branch]      work/master -> origin/work/master  (unable to update local ref)
error: some local refs could not be updated; try running
 'git remote prune origin' to remove any old, conflicting branches
```

#原因と解消方法
最初に origin/work を作っちゃったからそんなブランチないよ、と怒られてるようです。
詳しい原因は[こちら](https://qiita.com/N_Hidano/items/309e2864a97eb2748f02)の記事にわかりやすく説明されていました。

エラー文見ると
git remote prune originしてブランチのコンフリクト解消してよ〜ってことなので下記を実行。

```
# git remote prune origin
```
事象変わらず…( ；´Д｀)nazee

```
# sudo git remote prune origin
```
これでいけました！sudoってすごいんだな。。。

#参考
- [【Git】SourceTreeで階層構造のブランチ作成がエラーになる対処法](https://qiita.com/N_Hidano/items/309e2864a97eb2748f02)
- [ややこしいブランチ名をつけたらfetchできなくなった件](https://helen.hatenablog.com/entry/2016/04/04/142406)
Kotlin で List をマージして差分更新

Kotlin で List をマージして差分更新するメモ。

## Collections の groupingBy + reduce で解決

```kotlin
data class Person(val id: Int, val name: String, val age: Int)

val listA = listOf(
    Person(0, "foo", 10),
    Person(1, "bar", 20),
    Person(2, "baz", 30)
)

val listB = listOf(
    Person(0, "FOO", 15),
    Person(2, "BAZ", 35)
)

(listA + listB).groupingBy { it.id }
    .reduce { _, _, element -> element }
    .flatMap { listOf(it.value) }
    .forEach { println(it) }

// Person(id=0, name=FOO, age=15)
// Person(id=1, name=bar, age=20)
// Person(id=2, name=BAZ, age=35)
```

## 解説

### groupingBy

> If you want to group elements and then apply an operation to all groups at one time, use the function groupingBy(). It returns an instance of the Grouping type.

関数オブジェクトでグループ化し `Grouping<T, K>` を返す。これ自体はインタフェースを提供しているだけなので、実際の処理は後述の拡張関数が担う。

### reduce

> fold() and reduce() perform fold and reduce operations on each group as a separate collection and return the results.

各グループの要素に対して順次関数オブジェクトで処理し、その結果を `Map<K, S>` へと格納する。`fold()` が初期値を指定できるのに対し、`reduce()` は 1 番目の要素を初期値に取る。これにより戻り値の型が必然的に要素と同一になる。

| function | initial value | return type |
| -------- | :-----------: | :---------: |
| fold     |       O       |      O      |
| reduce   |       X       |      X      |

他にも `eachCount()` や `aggregate()` があるが、内容については ~~面倒なので解説しない~~ 是非自分たちで調べて欲しい。

## 参考

- [Grouping - Kotlin Programming Language](https://kotlinlang.org/docs/reference/collection-grouping.html)
【備忘録】Ruby on rails : partialの使い方 

参考記事：https://qiita.com/clbcl226/items/fe1b8e90b121332d1ca2


```ruby:boards_controller.rb
def show
	@object = Object.find_by(id: params[ :id ])
	@childObjects = Child_object.where(object_id: @object.id)
End
```

###localsに複数のデータを持つオブジェクトを渡した場合


```ruby:view/boards/show.html.erb
<%= render partial : `boards/childObject` , locals : { childObject : @childObjects } %>
```
パーシャル側で each で回さなくちゃならない

```ruby:view/boards/_childObject.html.erb
<% childObject.each do |childObject| %>
	<%= childObject.name %>
<% end %>
```

###collectionに複数データを持つオブジェクトを渡した場合

```ruby:view/boards/show.html.erb
<%= render partial : `boards/childObject` , collection : @childObjects } %>
```
パーシャル側で each で回さなくて大丈夫

```ruby:view/boards/_childObject.html.erb

	<%= childObject.name %>
```

###省略して記述
```ruby:view/boards/show.html.erb
<%= render @childObjects %>
```

```ruby:view/boards/_childObject.html.erb

	<%= childObject.name %>
```

省略して書けば渡すオブジェクトが複数データを持っていても単数のデータしか持っていなくても
同じ書き方で大丈夫
【Rails】seedファイル使い方

#はじめに
学習中の備忘録です。

#概要
* 通常のデータ登録
* ancestryを使用した際のデータ登録

#前提
Rails 5.2.4.2

#通常のデータ登録
今回は格言をランダムで表示する為に、messageテーブルにcontent,author,descriptionを登録する。

```ruby:seeds.rb
Message.create([{content: "自分自身を信じて~", author: "ゲーテ", description: "ドイツの詩人"},
{content: "たいていの人は~", author: "バーバラ・ブラハム", description: "米国の女性ビジネスコンサルタント"},
#~省略~
{content: "人間のほほえみ~", author: "マザー・テレサ", description: "カトリック教会の修道女、ノーベル平和賞受賞"}
])
```
rails db:seedを実行

```:ターミナル
% rails db:seed
```
seed後のmessageテーブル
<img width="1194" alt="60bda92c2d654cd223e8512216a6e2a1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/a5120f30-a37e-0703-db76-f5ffe2643918.png">

#ancestryを使用した際のデータ登録
以前フリマアプリを作成した際の多階層categoriesテーブル(親・子・孫)
※ancestryについては別記事で。先にインストールしてください。

```ruby:seeds.rb
#親カテゴリーのnameカラムを登録し、子カテゴリー登録のためにそれぞれ変数に代入。
lady, men, baby_kids, interior_housing, book_music_game, toy_hobby_goods, cosme_perfume_beauty, appliance_smartphone_camera, sports_leisure, handmade, ticket, car_motorcycle, others 
= Category.create([{name: "レディース"}, {name: "メンズ"}, {name: "ベビー・キッズ"}, {name: "インテリア・住まい・小物"}, {name: "本・音楽・ゲーム"}, {name: "おもちゃ・ホビー・グッズ"}, {name: "コスメ・香水・美容"}, {name: "家電・スマホ・カメラ"}, {name: "スポーツ・レジャー"}, {name: "ハンドメイド"}, {name: "チケット"}, {name: "自動車・オートバイ"}, {name: "その他"}
])

#"レディース"の子カテゴリーに"トップス"を登録し、孫カテゴリー登録のために変数に代入。
lady_1 = lady.children.create(name: "トップス")

#"トップス"の子カテゴリーに各カテゴリー登録。
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},
{name: "Tシャツ/カットソー(七分/長袖)"},
{name: "シャツ/ブラウス(半袖/袖なし)"},
#~省略~
{name: "その他"}])

#以下登録したいカテゴリーの数だけ続ける
lady_2 = lady.children.create(name: "ジャケット/アウター")
lady_2.children.create([{name: "テーラードジャケット"},
{name: "ノーカラージャケット"},
#~続く~
```
rails db:seedを実行

```:ターミナル
% rails db:seed
```
seed後のcategoriesテーブル
<img width="588" alt="93fbea2dac339993514d7e3f38619202.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/16e9ef7a-3f3e-0428-fbfb-c7fc55ee9f84.png">

#まとめ
別モデルのデータを一つのファイルにまとめて記述しても問題なく登録できます。
が、ファイルを分けた方が良いみたいですので、それはまた別の機会にします。
Pythonで毎日AtCoder #32

### はじめに
[前回](https://qiita.com/taxfree_python/items/ce5470607b74efe79bc7)

### #32
[問題](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_c)

**考えたこと**
本番で爆死した問題です。普通に計算すると精度がでなくてWAなのでdecimalを使って精度を上げるか、式変形して解くかの二択です。decimal使っても楽しくないので、式変形で解きます。といっても簡単な変形ですが。

<img width="494" alt="スクリーンショット 2020-04-11 0.25.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273421/314350f1-20aa-2157-aa58-411c25f00964.png">

上を実装すると、

```python
a, b, c = map(int,input().split())

f = c - a - b
if f > 0 and f ** 2 > 4 * a * b:
    print('Yes')
else:
    print('No')
```

### まとめ
簡単な数学の問題でした。ではまた、おやすみなさい
【Unity初心者】 GetComponentの使い方をテキスト変更を例に解説　おまけ：GetComponentの省略

#環境
Unity 2019.3.7f1

#対象の方
なんらかのUnityチュートリアルを終えて制作の雰囲気がわかっている方

#基本文
とりあえず知っておきたい基本文
コンポーネントを入れたい変数=コンポーネントを取得したいオブジェクトが入った変数.GetComponent<取得したいコンポーネント名>()

長っ！いやいやわかりにくいわっ！笑

以下、テキストをスクリプトから変更するときの内容で解説していきます。

###前提の作業内容
1.新規スクリプト作成(スクリプト名は"Test"にした)
2.テキストオブジェクト作成
3.空のオブジェクト作成
4.新規スクリプトを空のオブジェクトにドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/c51b5c99-a125-a9d0-8399-3be3b9ae8390.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/7cda7802-2db7-62ac-800d-d85945211165.png)

現状のテキストはこんな感じで表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/ecd315c8-6150-daad-a952-9ad993ff8d74.png)






####　スクリプト名"Test"の中身は次のように書く

```CSharp:Test
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//スクリプトでUI(テキストなど)扱うときはこれ必須！！

public class test : MonoBehaviour
{
    public GameObject a;//テキストオブジェクトを入れる変数aをGameObject型で宣言　インスペクター上でTextオブジェクトをアタッチする
    private Text b;//Text型の変数bを宣言

    //スタート関数
    void Start()
    {
        b = a.GetComponent<Text>();//bにテキストオブジェクトのTextコンポーネントを入れる
        b.text = "テキストかわったよん";//bに入っているテキストコンポーネントのテキスト変更        
    }
}

```
このまま実行すると「変数aに何も入ってないよ！！！！」とUnity先生に怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/802fd7bd-2f51-c9a8-444c-646b27c46ccd.png)

なので、

Textオブジェクトを空のゲームオブジェクトの変数aへドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/1fba114d-e400-3731-470b-6c93a6674802.png)

これで実行するとテキストが変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/94f02970-4018-8a37-ed0e-37cd236dd0d7.png)

#GetComponentの省略
ちなみに、
Text型の変数をpublicにして先程と同じように
"Textオブジェクトを空のゲームオブジェクトの変数へドラッグ＆ドロップ"
をしてやればゲットコンポーネントは不要です。

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//スクリプトでUI(テキストなど)扱うときはこれ必須！！

public class test : MonoBehaviour
{
    public Text b;//Text型の変数bを宣言　実行前にテキストオブジェクトをアタッチする必要有り

    //スタート関数
    void Start()
    {        
        b.text = "テキストかわったよん";//テキスト変更
    }

}
```

####じゃぁゲットコンポーネントいらないじゃん！！
はい！いりません！！
**ただし！あらかじめアタッチできるなら！！！！！！**

"ゲームの途中で出現させた敵" の "コンポーネントを取得したい時"なんかは
ゲットコンポーネントを使うことになります。

その手順については別記事で♡
Radiko再生アプリ

#1 モチベーション

作業中にBGMが聞きたい時、RadikoのWebサイトからラジオ日経第2の音楽チャンネルを垂れ流しにしております。Radikoの場合、過去1週間分の番組であれば好きな時間にアクセスしてラジオ番組を楽しむことができます。ただ残念ながらRadikoのWebページは<b>これでもかというくらいユーザビリティーが悪く、Webページ自体も重く応答性も悪い</b>と感じています。例えば今週火曜日19:00のラジオ日経第2の番組を聞きたい場合、再生までたどり着くのに１～2分程度かかってしまいます。
<b>そこで、ボタン1つで、聞きたい番組にアクセスできるようにしてユーザービリティーを改善したいと思いました。</b>

![65.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/2806ff0b-c51d-05d1-1fbd-b917e468793c.jpeg)

#2 作成したアプリ

ラジオ日経第2(21:15～、21:30～の番組はラジオ日経第2)の聞きたい時間帯をセレクトボタンで選択し、クリックするのみでWebページに自動でアクセスし、音楽をストリーミングします。このアプリを作ってからは、<b>わずか3クリックでラジオ日経第2の聞きたい番組のストリーミングができるようになり、ユーザービリティーが大きく向上しました。</b>

![66.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/805e76c6-3ab0-9960-195f-cb7c7d6e9ef5.gif)

#3 どうやって実現したか

ハードウエアは<b>ラズベリーパイ4</b>と<b>800円のUSBスピーカー</b>を組み合わせて作りました。

![66.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/bfa1bc12-3b3b-f226-eff4-7ae67e54adca.jpeg)

ソフトウエアは、フロントエンドはVue.js, バックエンドはpythonで実現しています。pythonのWebスクレイピングライブラリseleniumを使いRadikoのWebページから指定した番組データにアクセスし、番組音声を再生しています。また、環境を別のハードウエアに移動することも考え、仮想化アプリDockerの上で、フロントエンドを作成しております。

![67.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/672315b4-8127-027a-3a80-1b788933a6cd.jpeg)


#4 環境構築メモ

## 4-1 Vue-CLIのインストール

環境構築には、Vue-CLIのインストールが必要です。[Vue-CLIのインストールはこちらに記載しています。](https://qiita.com/NT1123/items/fda5c66f9ffdba878c8a#12-vue-cli%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

Vue-CLIのインストールが完了すると、ディレクトリ(下記図で説明すると第2階層と第3階層)が構成されているので、「Radiko.vue」「index.js」「radiko.py」「radikoend.py」「radikoendforce.py」を下記図記載のとおり所定のディレクトリに配置してください。

![70.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/ab178742-7c06-2d4d-4713-872eb41791b5.jpeg)



## 4-2 コードファイルの配置

[こちら](https://github.com/fdfpy/radiko)に必要ファイルをアップロードしました。
Radikoi.vueは、Vue-CLIの /scr/componentsに配置してください。
index.jsは、node.jsが動作する任意の場所にインストールしてください。
Vimでexpandtabの動作が拡張子ごとに異なっていたので対処

#1. 解決したいこと
vimのオプションでexpandtabを設定した際に期待する動作は、「TAB文字がどのような場合でも挿入されない」ことなのに、
rust言語のソースコード(.rc)編集を行おうとすると、以下のような状態になった。

- Insertモード中に\<TAB>、autoindentなどで挿入されるインデントに対し、移動/削除などの操作を行うとTAB文字分操作されてしまう（expandtab未設定時みたいな動作）
- Insertモードを抜けてみると挿入されているのは空白文字であり、1字ずつ操作できる。（expandtabが効いてる）

確かに結果的にはTAB文字は挿入されていない。。。が、
そもそも.cppファイルなどではInsertモード中でも1字ずつ空白として操作できるので、ファイルごとに操作が異なるのでは、
単純に編集しづらい。

#2. 解決策
さくっと解決策を書くため、前提となる環境条件などはあとで記載。

拡張子ごとの設定として.rc用の設定ではsofttabstop=4がデフォルトで設定されているが、これを0とすることで所望の操作となることが判明した。
恒久的な設定とするため、以下を.vimrcに記載することで解決。

```:.vimrc
filetype plugin on
filetype indent on
autocmd FileType rust setlocal sw=4 sts=0 ts=4 et
```

#3. 調査結果
参考文献の外部サイト2を参照すると、softtabstopの動作について以下の記載があった。


> 'softtabstop' オプションがゼロではない時、<Tab>は 'softtabstop' で指定されるタブ位置まで空白を挿入し、
\<BS>は 'softtabstop' で指定されるタブ位置までの空白を削除する。

今回の事象はsofttabstopオプションが代入時だけでなく代入個所に対して\<BS>による操作に対しても有効となるため、
見た目上、TAB文字操作と変わらない動作となっており、所望の動作となっていなかったことがわかる。

#4. 環境

###4.1 実行環境
CPU:x86系アーキテクチャ(x64)
OS:CentOS Linux release 7.7.1908 (Core)
Vim:Vi IMproved 7.4

###4.2 .vimrc(事象発現時)

```:事象発現時の.vimrc
set number
set numberwidth=5
set expandtab
set tabstop=4
set shiftwidth=4
set ai

set smartindent
set visualbell
```
#5. おわりに
Vimのインデント設定は分かりにくい。

#6. 参考文献
外部サイト1：[insert - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/insert.html#ins-expandtab)
外部サイト2：[Vim の 5 つのタブとスペース関連のややややこしいオプションをできるだけ簡単に解説するよ](https://yu8mada.com/2018/08/26/i-ll-explain-vim-s-5-tab-and-space-related-somewhat-complicated-options-as-simply-as-possible/)
Qiita参考記事：[Vim: 拡張子ごとにインデントを変更する方法 ~ 初心者 ~](https://qiita.com/locona_0810/items/5644af52da2469adce1a)
【react-native】error eperm operation not permitted unlink の解決

##解決 1
多くのサイトはこの方法を紹介しています

```
npm cache clear
```
(ちなみに私は失敗しました・・・)

##解決 2
タスクマネージャーから ```adb.exe```を停止してから ```npm install -g expo-cli```を試す

##参考
https://github.com/expo/expo-cli/issues/283#issuecomment-450942152
GCPのコンテナリポジトリの使い方

### コンテナレジストリへイメージをpush

コンテナレジストリが [HOSTNAME]/[PROJECT-ID]/[IMAGE]の場合

```
# gcpの認証ヘルパーを使う
gcloud auth configure-docker

# イメージ作成： docker build -t sample-image -f Dockerfile .
docker build -t [IMAGE]:[TAG] -f [FILE_NAME] [CONTEXT]
 
# 作成したイメージからコンテナリポジトリのタグ名（イメージ名）で作る
docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE]
# または
docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]

# 作成したイメージをプッシュする
docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]
# または
docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]

# イメージ一覧取得
gcloud container images list
 
# イメージのタグ情報を確認する
gcloud container images list-tags [HOSTNAME]/[PROJECT-ID]/[IMAGE]
```

### コンテナレジストリのイメージをpull

```
docker pull [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
# または
docker pull [HOSTNAME]/[PROJECT-ID]/[IMAGE]@[IMAGE_DIGEST]
```

詳しくは「[GCP-イメージのpushとpull](https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja)」を参照してください。


### k8sからコンテナを作成する
#### kubectlクライアントをインストール
`gcloud`コンポーネントからインストール

```
# コンポーネント一覧取得
gcloud components list
# kubectlをインストール（更新）
sudo gcloud components update kubectl
```

- `~/.zshrc`または`~/.bashrc`に下記を追加

```~/.zshrc
export PATH=$PATH:/usr/local/share/google/google-cloud-sdk/bin/
```

- 反映

```
# ~/.bashrc の場合は　source ~/.bashrc
source ~/.zshrc
```

#### 対象のクラスタを設定

```
# クラスタ一覧取得
gcloud container clusters list
# 一覧からクラスタをセット
gcloud container clusters get-credentials [CLUSTER_NAME] --zone=[ZONE_NAME]
# クラスタが切り替わったことを確認する
gcloud container clusters list
```
- namespaceをセット

```
# namespaceを取得
kubectl get namespaces
# なければ作成
kubectl create namespace [NAME_SPACE]
```

#### リソースオブジェクトを作成
これによりリソースオブジェクトがコンテナを作成してくれます

```
kubectl apply -f FILE_PATH
```

#### よくつかうコマンド
GKEを利用する際にはクラスタを指定したり、名前空間を利用したり、シークレットを利用したり、Podの状態を監視します。
そのようなよく使うコマンドを書きにまとめてみました。

```
# クラスタ関連
gcloud container clusters list
gcloud container clusters get-credentials [CLUSTER_NAME] --zone=[ZONE_NAME]

# 名前空間関連
kubestl get namespaces
kubestl get namespaces [NAME_SPACE]
kubectl create namespace [NAME_SPACE]
kubectl delete namespace [NAME_SPACE]
kubestl describe namespaces [NAME_SPACE]

# リソース生成
kubectl apply -f FILE_PATH
# リソース削除
kubectl delete -f FILE_PATH

#　状態を確認する
kubectl get [RESOURCE_TYPE] -n [NAME_SPACE]
# リソースを削除
kubectl delete [RESOURCE_TYPE] -n [NAME_SPACE]
# リソースの詳細情報を取得
kubectl describe [RESOURCE_TYPE] -n [NAME_SPACE]

# Podのログを取得する
kubectl get [POD_NAME] -n [NAME_SPACE]

# イベントを取得する
kubectl get ev -n [NAME_SPACE]

# シークレット関連
kubctl create secret [TYPE] [NAME] [DATA] -n [NAME_SPACE]
kubctl create secret generic my-secret-key --from_file=キー名=my-secret-key.json -n my-space
kubectl get secrets -n [NAME_SPACE]
kubectl delete secret [NAME] -n [NAME_SPACE]
kubectl describe secret [NAME] -n [NAME_SPACE]
```
【CSS】ブロック要素の周りに隙間があるならリセットCSS

#経緯

色々作って来たのはいいけど解決してなかったことが解決したので備忘録に

サイト作りの最初はどこにどう配置するかデザインはどうするか悩んで決まらなかったら勢いで作るんですけどタイトル通りの事が起こりました
<img width="1440" alt="2枚目.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29153/04048a40-e9d9-60b4-f6ed-a9ca48a7bdb8.png">
分かりやすく背景色を付けてます。

##何故こんな事が起こるのか
微妙に隙間が出来ていてなんで出来るのか考えてすぐ答えが出ました。
ブラウザにはそれぞれデフォルトでcssが用意されていて何もしていなければそのcssが適用されちゃうのでこんな事が起こっちゃうんです。なのでリセットcssというのを用意してあげてそっちを読み込んであげれば直ります。
リセットcss自体は色んな所に転がっているので調べてみてください。
<img width="1440" alt="4枚目.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29153/877e98da-5b87-a7b4-9a1b-d7cd82d9ec56.png">

#結論
最初からリセットcssを用意してあげましょう。
amazon/aws-cli イメージを CircleCI で使う

先日、待ちに待った [AWS 公式の aws-cli イメージ](https://hub.docker.com/r/amazon/aws-cli) がついに公開されました。
というわけで早速 CircleCI で使ってみたのですが、少しだけハマったので共有します。

## 結論から

CircleCI で `amazon/aws-cli` イメージを使う場合は環境変数 `AWS_PAGER` に空文字を設定しましょう。

```yaml
version: 2.1

executors:
  aws-cli:
    environment:
      AWS_DEFAULT_REGION: ap-northeast-1
      AWS_PAGER: "" # ここが重要
  docker:
    image: amazon/aws-cli

jobs:
  build:
    executor: aws-cli
    steps:
      - aws codebuild start-build --project-name myproject    
```

## 解説

もともと CircleCI Orbs の [`circleci/aws-cli@0.1.22`](https://circleci.com/orbs/registry/orb/circleci/aws-cli?version=0.1.22) を使っていたのですが、せっかく公式の Docker イメージが出たので乗り換えようと次のような設定を書いてみました。


```yaml
version: 2.1

executors:
  aws-cli:
    environment:
      AWS_DEFAULT_REGION: ap-northeast-1
  docker:
    image: amazon/aws-cli

jobs:
  build:
    executor: aws-cli
    steps:
      - aws codebuild start-build --project-name myproject   
```

`AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` は CircleCI コンソールからの設定で環境変数に入れる想定です。
CircleCI から AWS CodeBuild をキックするという回りくどいことをしていますが、故あって CircleCI で特定の Workflow を経た上で CodeBuild でのビルドを実行したかったのでこのような形となっています(Workflow 周りの設定は省略しています)。

この設定で CircleCI のジョブを実行してみると、CodeBuild は問題なくキックされましたが CircleCI 側のジョブが永久に終了せずタイムアウトするという問題が発生してしまいました。
ログを見ると以下のような感じです。

```console
aws codebuild start-build --project-name myproject
WARNING: terminal is not fully functional
-  (press RETURN){
... (以下略) ...
```

ユーザーからの入力を待っている感じですね。。。
CircleCI Orbs を使っていた時はうまくいっていたのに何故？

と考えると、怪しいのは AWS CLI のバージョンです。
`amazon/aws-cli` イメージは AWS CLI v2 のみをサポートしています。一方で、CircleCI Orbs の `circleci/aws-cli@0.1.x` は AWS CLI v1 のみをサポートしています(ちなみに 2020/03/31 にリリースされた [`circleci/aws-cli@1.0.0`](https://circleci.com/orbs/registry/orb/circleci/aws-cli?version=1.0.0) からは v1 と v2 の両方がサポートされるようになり、デフォルトは v2 となっています)。

というわけで AWS CLI v1 と v2 の違いを調べてみたら原因はあっさりと判明しました。

- [重要な変更 – AWS CLI バージョン 1 からバージョン 2 移行](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html)
  - [AWS CLI バージョン 2 では、デフォルトですべての出力にページングプログラムが使用されます。](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html#cliv2-migration-output-pager)

以下公式ドキュメントからの引用

> デフォルトでは、AWS CLI バージョン 2 はオペレーティングシステムのデフォルトのページャープログラムを介してすべての出力を返します。デフォルトでは、このプログラムは Linux および macOS では less プログラム、Windows では more プログラムです。これにより、出力を一度に 1 ページずつ表示することで、サービスからの大量の出力内を簡単に移動できます。

つまり、AWS CLI v2 からはページャーがデフォルトで有効になっているので実行時に入力待ちの状態となってしまってジョブが終わらなくなっていたわけですね。

再び公式ドキュメントからの引用

> ただし、スクリプトを実行しているときなどに、キーを押して各ページを取得することは不要で、すべての出力が必要な場合があります。これを行うには、別のページングプログラムを使用するか、まったく使用しないように AWS CLI バージョン 2 を設定できます。そのためには、~/.aws/config ファイルに AWS_PAGER 環境変数または cli_pager 設定を含め、使用するコマンドを指定します。
> 以下の例に示すように、変数を空の文字列に設定することで、外部ページングプログラムの使用を完全に無効にすることができます。

ということなので、(CircleCI に限った話ではありませんが) `AWS_PAGER` に空文字を設定してあげるとうまく動作します。

```yaml
version: 2.1

executors:
  aws-cli:
    environment:
      AWS_DEFAULT_REGION: ap-northeast-1
      AWS_PAGER: ""
  docker:
    image: amazon/aws-cli

jobs:
  build:
    executor: aws-cli
    steps:
      - aws codebuild start-build --project-name myproject    
```