OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Codespaceについてちょっと調べて作ってみるところまで

# 記事の主旨 / 前提 / 目標
Webブラウザベースの統合開発環境が最新式であると聞きました。合っているかは知りません。
その中で、Visual Studio Codespaceがあまりよくわからないので調べて試します。
ついでにAzureも使った事がないので使います。
今日の日付は2020/8/21です。僕のPCはMac/Chromeですが、なんでもいいです。

**前提：** MSのアカウントは持ってます。githubのアカウントは持ってます。まだAzureの登録してません(してても良い)
**目標:** なんとなくスタート地点行けそうだなというところまでを目指します。

# Visual Studio Codespaceとは

Microsoft、Webブラウザで動作する開発環境「Visual Studio Codespaces」発表　Visual Studio Onlineを名称変更、料金も値下げ
https://www.itmedia.co.jp/news/articles/2005/07/news059.html

- Webブラウザで動作する統合開発環境。VSCode。
- iPadのSafariでもできるらしい。
- Microsoft Azure上でサーバアプリケーションを実行するらしい。

リージョンとCPUとメモリを指定して、githubのリポジトリを指定するとインスタンスが起動し、その後はなんでもできるらしいです。

# 使い方

https://visualstudio.microsoft.com/ja/services/visual-studio-codespaces/

- 「お使いのブラウザーまたは Visual Studio Code で今すぐお試しください」という記載があります。
![スクリーンショット 2020-08-21 22.23.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37393/b02f1da4-689d-6e76-2678-85821211d2fd.png)

- 「開始する」を押します。
- MSアカウントでサインインします。
![スクリーンショット 2020-08-21 22.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37393/ba8028a4-7a78-bf92-4c6c-26088f1fbdec.png)
- 「Create codespace」を押します。
- 「Create a free Azure account」を押します。
　※僕は、Azure使ったことないので多分アカウント持ってません
- 「Start Free」を押します。
- なんとなく「githubアカウントでサインイン」を押す
- Githubの画面で「Authorize Microsoft-Corp」と出たので、そうします。
- Azureの登録画面が出てきます(Country/name)。クレジットカード、住所も入れる必要があります。本当のやつを入れました。
- Agreementします。
![スクリーンショット 2020-08-21 22.39.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37393/68e56c3b-85b3-f3cc-19e8-659b5e1ac387.png)
これで僕もAzureが使えるようになりました。
- 先ほどのCodespaceの画面に戻ると、「subscription」で「Free Trial」が選べるようになっています。
- 「Create」します。
- しばらくすると、名前とかgitリポジトリとかスペックとか要求されます。とにかく勘で入れます。
![スクリーンショット 2020-08-21 22.44.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37393/2c1b0423-7d35-1173-f21c-39fc161d6732.png)
- 「Create」すると。。
![スクリーンショット 2020-08-21 22.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37393/7db20125-80e0-16f9-d4e6-3f95d7e48d5c.png)
なんか出来ていました。これ金かかる？フリーだから大丈夫だよね？念のため今日は終わりということでDeleteしておきました。

# まとめ

Azureを使った事が無いケースでも、Codespaceを作るまでは簡単でした。あとはここからブラウザベースでアクセスできて、ソースもここから編集とかできるんでしょう。
Ruby 　簡易株の自動売買システム

初学者のアウトプットです。

株の売買システムを作ってみました。

下記コード

n_1 >= trade 株買取
n_2 <= trade 株全て売却

profit　・・・最終的な利益
配列の最後の値になると全て売却することにしています。

```ruby:qiita.rb
n,n_1,n_2 = gets.chomp.split(" ").map{|i| i.to_i}
i = 0
profit = 0
stock = 0
trade = []

n.times do 
  i = gets.to_i
  trade.push(i)
end

a = 0

while n > 0 do
  if n == 1
    profit +=  trade[a] * stock
  elsif n_1 >= trade[a]
      profit -= trade[a]
      stock += 1
  elsif n_2 <= trade[a]
      profit += trade[a] * stock
      stock = 0
  end
  a = a + 1
  n = n - 1
end

puts profit
```

やっぱり一番気になるのは最初に変数と配列の宣言をやりまくってしまうこと
いつみてもダサすぎる。。。。

個人的にロジックは結構うまく（あくまで私レベルの中では）組めたと思いました。

こうすると良いよーってあったらどんどんコメントください！
【Laravel】wasRecentlyCreatedはいつTRUEを返すのか

Modelのメンバ変数であるwasRecentlyCreated。
名前の通りのものなのですが，私の想像とは違う動き方をしたので，メモとして残しておきます。
おそらく一緒に使うことが多いのはfirstOrNew()であったり，firstOrCreate()だと思うので，併せてそちらについても記載しています。

##使い方
Userモデルを操作すると仮定します。
###firstOrCreate()
そのまま。
userをnameに与えた文字列で検索し，見つかればおしまい。
見つからなければ新しく作成（User::create）までやってあげますよ，というメソッド。

```php:user.php
// nameでUserを取得する。存在しなければ作成(create)まで行う
$user = User::firstOrCreate(['name' => 'hoge']);

// nameでUserを取得する。存在しなければ指定されたname,emailを含め作成(create)まで行う
$user = User::firstOrCreate(['name' => 'hoge'], ['email' = 'fuga@example.com']);

echo $user->id;
// createまで行っているので，先ほど作成したidの情報なども吐いてくれる
```

###firstOrNew()
ちょっと中途半端な子。
userをnameに与えた文字列で検索し，見つかればおしまい。
もし見つからなければインスタンス化までやりますね，というメソッド。

```php:user.php
// nameでUserを取得する。存在しなければインスタンス化まで行う。createはしない。
$user = User::firstOrNew(['name' => 'hoge']);

// nameでUserを取得する。存在しなければ指定されたname,emailを含めインスタンス化まで行う。こちらも同様，createはしない。
$user = User::firstOrNew(['name' => 'hoge'], ['email' = 'fuga@example.com']);

echo $user->id;
// インスタンス化までしかしていないので，idはnullで返ってくる
```
###wasRecentlyCreated
問題はこの子だった。
文字通り，先程Createされているかどうかを返してくれる。
それがどうも自分の中でピンときていなかった。
実際の動きを書いてみます。

```php:user.php
$user = User::firstOrCreate(['name' => 'hoge']);
echo $user->wasRecentlyCreated;
// TRUE。先ほどCreateまで行っているので。

$user = User::firstOrNew(['name' => 'hoge']);
echo $user->wasRecentlyCreated;
// FALSE。先ほどCreateはしていないので。
```
私はインスタンス化まで済んでいればTRUEが返ってくると思って処理を書いていたのですが，どうもうまく動かない。
これは多分やらかしてるな…と思った結果がこれでした。
名前の通りなのですが，ここまで詳しく書かれているのを見つけることができなかったので，私の備忘録として書き留めておきます。
ブループリントでパーティクルを操作する（Unreal Engine 4.25）

# 前提

身内用に書いたものを、暫定的に公開しているものです。何かおこったら閉じるかもしれません。

[前の記事](https://qiita.com/mml/items/5273a7699cdeb9ca21da)に書いた知識（ブループリントの最低限の知識）は持っている、という前提で書いてます。特に説明のない限り、Unreal Engine 4.25 で FirstPerson テンプレートで作成したプロジェクトのレベルブループリントのイベントグラフ上で操作をする前提です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/7689a532-411d-5340-427e-4fc497f9fa06.png)

# パーティクルをブループリントで操作する

パーティクルはアクターではないので、アクターとは少し違う方法で操作します。

## パーティクルをとにかく画面上に出す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/516c7f06-a5c0-f4e8-d392-3d6f47cdc2fb.png)

最も簡単な方法は、SpawnEmitterAtLocation か SpawnEmitterAttached を使う方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/b706dd15-6c66-a9f2-1577-5642054169e2.png)

Emitter Template のところで、設置したいパーティクルを選びます。スターター有りにしていれば、爆発などのいくつかのパーティクルがメニューから選べます。ここでは P_Explosion にしてみました。Location は 200, 0, 300 くらいにすると、プレイ直後の目の前あたりに出現します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/2eb1ca48-f4a5-645c-df2f-c3e158477088.png)

上記のコードで、Enter キーを押せばパーティクルが再生されます。再生が終わるとパーティクルは消滅します。（SpawnEmitterATLocation ノードの AutoDestory にチェックが入っている場合）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/3bd22382-fd41-797f-477b-01cd537db705.png)

SpawnEmitterAttached は、他のアクターにくっつけた状態で設置できます。ここでは、画面の目の前にあった EditorCube11 というアクターにくっつけてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/8c67e7fe-9aec-9d6e-19bf-fe477d8147f5.png)

こんな感じになります。Location でアクターとの相対的な位置を指定することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/ee80e7a0-5266-e634-57fe-8423d36ef21a.png)

アクターにくっつくので、弾を撃って箱をふっとばしても、パーティクルは箱にくっついていきます。

## パーティクルを消す

ループ再生になっているパーティクルを SpawnEmitter ノードで設置すると、永遠に再生され続けます。SpawnEmitter ノードで出したパーティクルの再生を止めたい場合は、DestroyComponent ノードを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/c7a101fe-2e3f-8598-5f13-56b75e22bd7b.png)

再生を止めるというより、パーティクルの存在を消去している感じです。

## パーティクルを移動、回転、拡大する

パーティクルを移動させたり拡大縮小するには、ブループリントクラス化（アクター化）します。しなくても SetRelativeLocation などを使ってコンポーネントを無理やり操作できますが、座標の管理が面倒になるので、特別な理由がなければアクター化したほうがよいでしょう（多分）。（移動させるだけなら、上で説明した SpawnEmitterAttached で別のオブジェクトにくっつけることでも実現できます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/d8648403-54b0-40f8-7f0a-76358114db4c.png)

こんなかんじで、アクター化したいパーティクルの上で右クリックメニューを出して、アセットアクションから「これを使用してブループリントを作成」を選びます。（ちなみに P_Fire は「コンテンツ」「StarterContent」「Particles」にあります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/cfe730a0-f3f8-90cf-7847-52baaa7e2310.png)

ブループリント化（アクタ化）すると、他のアクターと同様に開いてエディットできるようになります（ここでは、P_Fire_BP という名前にしてます）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/d2362bab-3cf7-0c31-86c9-c43e365c6ce0.png)

あとは、普通のアクターと同じように SpawnActorAtLocation などで設置できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/ca892556-29f7-f2cc-1480-d96a899ee4ab.png)

アクターを移動させれば、（コンポーネントとして含まれている）パーティクルも移動します。SetActorTranform で回転や拡大、縮小などもできます。

# 続くとしたら

レベル間移動、ファイル入出力、音声再生あたりです。
お前はどこ出身だよ

Pandasでデータを2つ読み込んで結合したときに、こんなことないですか？

- データの読み込み

```python
import pandas as pd

sample001 = pd.read_excel("sample_excel_001.xlsx")
sample001.head()
```
<img width="200" alt="89781cb2-5d55-73df-1acf-b17f433e7b07.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541501/89781cb2-5d55-73df-1acf-b17f433e7b07.jpeg">

```python
sample002 = pd.read_excel("sample_excel_002.xlsx")
sample002.head()
```
<img width="270" alt="a66b2cc7-69c6-4bf2-dc4e-5f6e304a0578.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541501/a66b2cc7-69c6-4bf2-dc4e-5f6e304a0578.jpeg">

2つのデータをデータフレーム（sample001, sample002）に読み込みました。
"data001"列で2つのデータを結合できそうです。

- データの結合（join）

```python
merge_data = pd.merge(sample001, sample002, on="data001", how="left")
merge_data.head()
```
<img width="350" alt="e1d8f492-631d-fa42-493e-26e091c9c4ed.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541501/e1d8f492-631d-fa42-493e-26e091c9c4ed.jpeg">
"data001"は結合のキーワード列、"data003"はsample002のデータであることはすぐ分かります。"data002_x"、"data002_y"ってなんやねんって話ですよ。「どこ出身のデータですか？」ってなっちゃいますよね？（いや本当はわかりますよ？mergeの第一引数で指定したデータフレームがx付き）見てくれが嫌なので、せめてどこ出身のデータなのかはパッと分かるようにしたいですね。

# 出身の名乗らせ方
suffixesオプションを使えば、結合キー以外でカラム名が重複したときに、新しいカラム名の末尾に加える文字列を指定することができます。

```python
merge_data_new = pd.merge(sample001, sample002, on="data001", how="left", suffixes=[".sample001", ".sample002"])
merge_data_new.head()
```
<img width="420" alt="a9c397c7-23ce-94aa-1a10-1af997cbe426.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541501/a9c397c7-23ce-94aa-1a10-1af997cbe426.jpeg">

おー、これでどこ出身のデータかパッと判別できるようになりましたね！

# 最後に
できたらなんですが、末尾じゃなくて先頭に文字列を付けれたらいいですね。（SQLっぽくできるので）
【忘備録】Java : 文字列連結の速さを計測

## はじめに
以前の現場で上長からString型の文字連結はStringBuilderのappendでやった方が速いということを教わってからずっと覚えていたのですが、今勉強している参考書でもそのことが触れられていたので実際どれくらい速いのか実践してみたいと思いました。

```stringBuilderTest.java
public class StringBuilderTest {
    public static void main(String[] args) {

        String name = "";
        long start = System.currentTimeMillis();
        for(int i=1; i<=1000; i++){
            name += "tanaka, ";
        };
        long end = System.currentTimeMillis();
        System.out.println("+連結 : "+(end - start)  + "ms");

        StringBuilder sb = new StringBuilder();
        long start2 = System.currentTimeMillis();
        for(int i=1; i<=400000; i++){
            sb.append("tanaka, ");
        };
        String name2 = sb.toString();
        long end2 = System.currentTimeMillis();
        System.out.println("StringBuilder.append連結 : "+(end2 - start2)  + "ms");
    }
}
```

```結果.java
        +連結 : 24ms
        StringBuilder.append連結 : 27ms
```

for文の回している回数をみてもらえるとわかりますが + で連結したのは1000回実行するのに`24ms`掛かってappend連結は`27ms`で40万回実行してますね。
数回しか実行しないならともかく、前の現場も万単位でfor文を回していたので覚えておいて損はないですね。
EC2でReactをhttpsでnpm startして外部からアクセスする

EC2上でReactアプリをhttpsでホストすることがあったので備忘録です。

AWSならACMとかELBとかRoute53とか使えるわけですが、
ちょこっとテスト的に動かしてみたいだけなのでできるだけ簡単にSSL化したいと思います。

結論から言うと
HTTPS=trueにしたnpm startでlocalhostでhttpsサーバーを立てて、
EC2外部からのアクセスはnginxでlocalhostにリダイレクトします。

# 環境
* EC2 (Amazon Linux 2)
* React
* nginx
* Node.js

# 1. EC2を立てる
EC2立てます。
http, httpsのポートをあけておきます。

# 2. nginxインストール・設定
## インストール
nginxインストールしますが、Amazon Linux 2ではnginxがyumでサポートされていないらしいので
以下のコマンドでインストールします。

```
$ sudo amazon-linux-extras install nginx1.12
```

## SSL化設定
SSL化するにあたって証明書を作ります。

```
$ cd ~ 
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 365 -req -signkey server.key < server.csr > server.crt
$ sudo mv server.* /etc/nginx/conf.d/
$ cd /etc/nginx/conf.d
$ sudo chown root:root server.*
```

nginx用の設定ファイルを新規に作成して、
localhostへのリダイレクトを設定します。

```
$ cd /etc/nginx/conf.d
$ touch ssl_redirect.conf
```
新規に作成したファイルに以下の内容を記述します。

```ssl_redirect.conf
server {
    listen       443 ssl;
    server_name  localhost;
    ssl_certificate      /etc/nginx/conf.d/server.crt;
    ssl_certificate_key  /etc/nginx/conf.d/server.key;
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}
```

これでnginxの設定が完了です。
nginxを起動、または再起動します。

```
$ sudo service nginx start
または $ sudo nginx -s reload
```

# 3. Node.js, Gitのインストール

```Gitインストール
$ sudo yum -y install git
$ vim ~/.ssh/id_rsa　（gitクローン用に鍵の内容をコピーしときます）
$ chmod 400 ~/.ssh/id_rsa
$ git clone https://github.com/~
```

```node.jsインストール
$ sudo su - root
$ curl -sL https://rpm.nodesource.com/setup_current.x | bash -
$ yum install -y nodejs
```

# 4. npm startでhttpsのlocalhostサーバをたてる
```
npm install
HTTPS=true npm start
```




以上で設定完了です。
EC2の外部からEC2のパブリックIPにアクセスすると、
EC2のlocalhostにリダイレクトされてhttpsでホストされたReactアプリの確認ができます。
C言語入門(FizzBuzz書いてみた)

# はじめに

こんにちは！ばーんです。
今回はC言語でFizzBuzz書いてみたのでその経緯などと、C言語初めて触った所感などを書いていきます。

ちなみにC言語は

- 自身が低レイヤの学びを大切にしており、もっと学んでいきたい
- 基本情報午後で書くタイミングがある
- アルゴリズム大好きでC++はいつか覚えたいと思っていた

といった理由で今回取り組みました。
初めての言語はとりあえずhello world書いてFizzBuzz書けばふんわり掴めるでしょー！
という安易な発想で進めていきました。

## 準備

http://www9.plala.or.jp/sgwr-t/c/sec01.html

今回はこちらのサイトを中心に進めていきました。内部仕様にも触れられており大変参考になりました。

### 環境構築

Windowsはいくつか手順踏むみたいです。

Macは1工程のみなので優しいですね＾＾(僕はXcode元々入れてたので0でした)

こちらの記事(↓)が見易かったですね

https://qiita.com/N_Matsukiyo/items/464594d1fd3e6ef576a4

## 基本的な書き方(まずはhello world)

```c
#include <stdio.h> /* 関数ライブラリを使うための記述。requireみたいなもの */
int main(void) /* 関数の実行宣言 */
{
  printf("hello world\n"); /* hello worldの表示 */
  // \nは改行コード
  return 0; /* 正常終了の意味 */
}
// 実行結果
// hello world
```

### 実行方法

```
// sampleはファイル名です
// ccではなくgccでもOKです
// これはコンパイルして実行ファイル出力するだけ
cc sample.c

// こちらが実行コマンド
./a.out 
```

node.jsで慣れてたのでコンパイルの処理と実行の処理分かれてるのはビックリしました。
(最初何回もコンパイルしてましたw)

ccとgccの違いについてはこちら(↓)
(http://zorinos.seesaa.net/article/458565453.html)

## 本題のFizzBuzz

```c
#include <stdio.h>
int main(void)
{
  int i;
  for (i = 0; i <= 100; i++)
  {
    int FizzBuzz = i % 15;
    int Fizz = i % 3;
    int Buzz = i % 5;
    if (FizzBuzz == 0 && i != 0)
    {
      printf("FizzBuzz: %d\n", i);
    }
    else if (Fizz == 0 && i != 0)
    {
      printf("Fizz: %d\n", i);
    }
    else if (Buzz == 0 && i != 0)
    {
      printf("Buzz: %d\n", i);
    }
    else
    {
      printf("i: %d\n", i);
    }
  }
  return 0;
}
```

```c
// 実行結果
// (中略)
Buzz: 95
Fizz: 96
i: 97
i: 98
Fizz: 99
Buzz: 100
```

何箇所か詰まったのが、

- 変数の宣言の場所
- 改行コード
- 変換指定子

といったところです。下記でさらっと説明していきます。

## 所感

### 変数宣言

変数を宣言する際に型の指定が必要。
これによってメモリの確保領域を変更しています。
グローバル / ローカル変数の概念もありますが今回JSライクに書こうとしたら詰まりましたw
(forの外側で変数宣言したものが値変わらずにそのままだった)

### コンパイラの判断

コンパルした時にerrorだとコンパイルされません。
warningだと動きます。中の文章はどちらもちゃんと読む。

全部が全部型指定しなくても動いてくれます。が、一定のアルゴリズムで変換するので現代のモダンな言語みたいに「いい具合に」はやってくれませんでした

### 変換指定子 / エスケープシーケンス

`"FizzBuzz: %d\n", i `のところでは
`%d` が変換指定子
`\n` がエスケープシーケンスです。

https://webkaru.net/clang/variable-printf/

標準(入)出力を自分が理解し切れていないのでうまく説明できないのですが、
`\n`書かないと改行されないとは思ってなかった…

### VScodeの拡張機能

![Screen Shot 2020-08-21 at 21.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534071/2a7964d2-a057-fc91-0dde-715479a7f432.png)

これがおすすめ(らしい)です。エラーも書いてる段階で表示されるし、入力補完もあったので使い易かったです。

### ポインタ

入門サイトでもここがむずかしい！と書かれていたのですが、要は参照渡しなのか？値渡しなのか？ということかと(違ったらすいませんw)

### 構造体

変数宣言時に型を指定しますが、中に混ざっていてもOKというものみたい。
これもざっくりオブジェクトのようなもの(メソッドは入れれない)であってるはず…

### 標準ライブラリのinclude

JSでいうとこのrequireみたいなものですね(多分)。
C言語が低レイヤの言語なのでかなり簡単な処理でも関数の宣言が必要だったりします。
(例)文字と文字を結合する関数など

その数が中々多いので、使う関数をincludeする必要があります。

## さいごに

最後までみていただいてありがとうございましたm_ _m
全然ちゃうわ！みたいな自分の認識齟齬があれば言っていただけると大変助かりますm_ _m

次に何を作るか決めていないので「こんなのオススメやで」みたいなのあれば教えてください＾＾
ChromeのJSデバックでライブラリを見ないようにする。

Chromeの検証ツールでJavascriptのデバックをするときにブレイクポイントを貼って、自分が書いたJSの挙動を確認するかと思います。しかし、コードをステップで辿るうちに以下の画像のようにライブラリの中身まで見てしまい、支障をきたすことがあるかと思います。そこで、デバックの際にライブラリに侵入するのを避けるための設定をご紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/671f914a-80ea-c0d1-7f89-47816e19826f.png)



####１、 Chromeの検証ツールを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/671f914a-80ea-c0d1-7f89-47816e19826f.png)

####2、 右上の歯車マークを押すと以下の画面になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/b54e27d8-664c-2ed1-16fc-682051b3c7f0.png)


####3、 Blackboxingボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/896555b6-b9a9-d3a2-d7be-c2c9aee55039.png)


####4、 除外したいパターンを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/51d6614f-2739-1b94-d5dc-7a1822db3f7b.png)

npmで管理している場合、JSのライブラリはnode_modulesに入っているので大半は除外できると思います。また、cdnを利用している場合もあるのでそれも除外します。
kotlinとjavaでいろんな機能を実装したい！

# はじめに…

この記事は[6個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の7日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその6個前の記事をご覧ください！

- java版 : https://github.com/sato-na/guruwake_java

- kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語でいろんな機能を実装するには…

--目次--

1. textViewにコード上で文字列を入れる方法

2. editTextの実装と文字列を受け取って消す方法

3. listViewの実装方法

## textViewを実装してコード上で文字列を入れる方法

- javaの場合

```java
TextView textViewの変数名 = findViewById(R.id.textViewのid);
textViewの変数.setText(入れる文字列);
```

例)

```java:ResultActivity.java
TextView resultTxt = findViewById(R.id.result_txt);  // 30行目
String rTxt = "";
resultTxt.setText(rTxt);  // 49行目
```
- kotlinの場合

```kotlin
textViewのid.text = 入れる文字列 
```

例)

```kotlin:ResultText.kt
var rTxt = ""  // 22行目
result_txt.text = rTxt  // 40行目
```

文字列の入れ方も大きく違う

## editTextの実装と文字列を受け取って消す方法

```java
// editTextを実装して入力した文字を受け取る
EditText editTextの変数名 = findViewById(R.id.editTextのid);
String 変数 = editTextの変数.getText().toString();
// editTextに入力されている文字列を消す
editTextの変数.getEditableText().clear();

```

例)

```java:HowManyActivity.java
// editTextを実装して入力した文字を受け取る
EditText groupNumE = findViewById(R.id.group_num_et);  // 42行目
String groupNum = groupNumE.getText().toString();
```

```java:WhoActivity.java
// editTextに入力されている文字列を消す
EditText memberET = findViewById(R.id.member_et);  // 80行目
memberET.getEditableText().clear();  // 83行目
```

- kotlinの場合

```kotlin
// editTextを実装して入力した文字を受け取る
val/var 変数 = editTextのid.text.toString()
// editTextに入力されている文字列を消す
editTextのid?.text?.clear()
```

例)

```kotlin:HowManyActivity.kt
// editTextを実装して入力した文字を受け取る
val groupNum = group_num_et.text.toString()  //33行目
```

```kotlin:WhoActivity.kt
// editTextに入力されている文字列を消す
member_et?.text?.clear()  // 55行目
```

書き方は少し違うがコードの量はあまり変わらない

## listViewの実装方法

- javaの場合

```java
ListView listViewの変数名 = findViewById(R.id.listViewのid);
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, 入れるリスト);
listViewの変数.setAdapter(adapter);
```

例)

```java:CheckActivity.java
final ArrayList<String> memberL = new ArrayList(intent.getStringArrayListExtra("MEMBER_L"));  // 26行目
ListView memberCheckLV = findViewById(R.id.member_check_lv);  // 39行目
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, memberL);
memberCheckLV.setAdapter(adapter);
```

- kotlinの場合

```kotlin
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, 入れるリスト)
listViewのid.adapter = adapter

```

例)

```kotlin:CheckActivity.kt
val memberL = intent.getStringArrayListExtra("MEMBER_L")  // 17行目
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, memberL)  // 31行目
member_check_lv.adapter = adapter
```

書き方は大きく違うがコードの量はあまり変わらない

# 最後に…

今回はjavaとkotlinでいろいろな機能を実装しました。
全体的にコード自体は違うけど、コードの量は変わらない印象でした。

これで7日間毎日記事投稿終了になります！ありがとうございました！
特定のLambdaからのアクションをS3バケットポリシーで拒否したい時

# 概要
S3バケットポリシーで、あるLamdba関数からのアクセスを拒否しようとした際に詰まったところをメモ。

# 設定したいこと
Lambda関数 `function-a` からの、S3バケット `bucket-a` へのReadアクションを拒否する。

ケースとしてあまりないと思うが、今回は、S3へのアクセスが何らかの理由で失敗したという想定をテストしたいためにこの方法を取ることとした。

# 間違ったバケットポリシーの設定
Lambda関数からのアクセスを拒否するということで、以下のように、Conditionに該当のLambda関数をSourceArnとして設定した Deny ルールを書けばいいと考えた。


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": *,
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::bucket-a",
            "Condition": {
                "ArnLike": {
                    "AWS:SourceArn": "arn:aws:lambda:ap-northeast-1:111111111111:function:function-a"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": *,
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-a/*",
            "Condition": {
                "ArnLike": {
                    "AWS:SourceArn": "arn:aws:lambda:ap-northeast-1:111111111111:function:function-a"
                }
            }
        }
    ]
}
```

しかし、これでは動作しない。

# 正しいバケットポリシーの設定

以下を読んで理解。

[Lambda 実行ロールに Amazon S3 バケットへのアクセスを許可するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-execution-role-s3-bucket/)

Lambda関数からS3などの他リソースへのアクセスは、Lambda関数から直接ではなく、アタッチされている「IAMロール」を通して行われる。

よって、S3バケットポリシーには、そのIAMロールからのアクセスを拒否するようにルールを書かなければならない。

IAMロール名を `role-a` とすると、以下のように記載する。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/role-a"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::bucket-a",
        },
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/role-a"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-a/*",
        }
    ]
}
```

Principalに該当のIAMロールを入れて、Denyルールを記載する。

これで、やりたかったことが実現できた。


# まとめ
Lambdaに限らずEC2やECSなど他のコンピューティングリソースについても、同様のことを気をつける必要がある。

試行錯誤している時はわからないけど、言われてみれば確かになと理解できる。
discord.jsで１からBOTを作る

こんばんは～。レミリアです。
今回は、、、**1からBOT作ってみたいと思います**
まずは、
https://discord.com/developers/applications
に、入って```NEW application```をタップ！
次に、botの名前を決めてね。
```APP ICon```で、アイコンをきめてね。そして、セーブしたら、
```BOT```をタップしてね
そうしたら、```Add bot```をタップして、よくわからないけど、
とりあえず、Yes,なんとかなんとかをタップ()
次に、
https://glitch.com/~pumped-chopper
に、入り右下の Remix your own をタップ。
最初に .env を選択します。
DISCORD_BOT_TOKEN にBotのTokenを設定します。
DiscordのBotアカウントを作成したページ（Discord Developer Portal）に戻ります。
SETTINGS の Bot にある TOKEN の Copy ボタンをクリックします。
そして .env の DISCORD_BOT_TOKEN に貼り付けます。
次に、BOT PERMISSIONS の 管理者 にチェックを入れます。
（Botに管理者権限を渡したくない場合はチェックを入れなくて良いですが、各権限を厳密に設定しておかないと、Botの権限が足りなくて動かないという事態に陥りますので、そのあたりは注意が必要だよ。）
チェックを入れ終わったらURL横の Copy ボタンをクリックします。
そして、コピーしたURLにアクセスするとBotの招待ページに飛べるはずです。
招待するサーバーを選択して 認証 ボタンをクリックします。
あなたがロボットではないことを証明してね。
**BOTのプログラムのソースコードを書く**
main.js を選択します。

```
client.on('ready', message =>
{
  console.log('bot is ready!');
});
```

この部分に一行付け足して、

```
client.on('ready', message =>
{
  client.user.setPresence({ game: { name: 'この部分の文字がプレイ中に表示されるよ。' } });  
});
```
にしてください。
Discordで確認するとプレイ中がちゃんと表示されています。
詳しい中身を作る場合は、
https://qiita.com/hakureireimu111/items/1a840104bb29375e5011
を見てね。
では。
AnimatorとAnimation

基本的にAnimationの全ての機能はAnimatorが全部実現できます。
AnimatorとAnimationの違いが何点がありますが、
一番重要な違いは以下の２点があります。
①対象ViewはBackgroundの状態になると、
Animationの場合、アニメーションを動かないです。
(もっと詳しい言うと、アニメーションが動きますが、開始と終了のイベントが来ないです。
つまり、アニメーション開始と終了後の処理が実行されない。)
Animatorの場合、対象ViewをBackgroundに移動しても、アニメーション開始と終了のイベントが来られます。


②Animationを実行中、見た目たけを更新されました。対象の本番の状態が更新されないです。
Animatorの場合、アニメーション更新中、対象の状態をアニメーションと一緒に更新されます。

例えば、ViewはAからBに移動、BからCに移動するっというアニメーションが実行しています。
・Animationの場合
アニメーションが終わる後、ViewはまたAの地点に戻る。
アニメーション実行中Viewの本番の地点はずっとAです。見た目はちがいますけれど、
・Animatorの場合
アニメーションがB地点に移動する時、Viewの本番地点はBの所です。
アニメーションが終わる後、Viewの地点はCになります。
アニメーション中、Viewの地点は随時更新中です。
つまり、Animationの場合、対象Viewの状態を保持しません、
Animatorの場合、対象Viewの状態をずっと自動的に保持されます。

もちろん、Animation使用の場合、アニメーションが終わる後、状態保持のAPIがありますが、
ただ、アニメーション中は状態保持ができない。


具体のプロジェクトでの運用
①Dialogの表示と消去でアニメーションを行います。
消去の仕様はアニメーション(例えば、透明になるアニメーション)が終わる後、Dialogのdismissを実行します。
Animation使用場合、Dialogがどんどん透明になります。完全の透明になる後、一瞬間にDialogが見えます。
Animator使用すれば、この問題がないです。

②同じ透明のアニメーション使用する場合、
Dialog消去後、同じインスタンスのDialog再表示します。(newしないで、直接にshowを呼ぶ)
Animatorの場合、Dialogが見えないです。(実はDialogはもう表示している)
この現象の原因は前回の消去アニメーションでDialogは透明になりました。
次回表示するとき、Dialogはまだ透明の状態です。
Dialogは明確に非透明の状態に設定しないとDialogが見えないです。
Tensorflow-2.3でのGPUおまじない（メモリ必要分確保、デバッグログ非表示）


# 実行確認環境

- Windows 10, 2004
- python 3.6.10
- tensorflow 2.3
- CUDA 10.1 update 2
- cuDNN 7.6.5

# メモリの必要分確保

TF-1ではGPUのメモリはあるだけ確保する仕様がデフォルトでした。
そのため、GPUを必要な分だけ確保するおまじないを書くのが通例でした。

そのおまじないもTF-2.3で以下のように変わりました。
`gpu_number`番目のGPUについて、必要な分だけのメモリを確保します。

```python
import tensorflow as tf

def allocate_gpu_memory(gpu_number=0):
    physical_devices = tf.config.experimental.list_physical_devices('GPU')

    if physical_devices:
        try:
            print("Found {} GPU(s)".format(len(physical_devices)))
            tf.config.set_visible_devices(physical_devices[gpu_number], 'GPU')
            tf.config.experimental.set_memory_growth(physical_devices[gpu_number], True)
            print("#{} GPU memory is allocated".format(gpu_number))
        except RuntimeError as e:
            print(e)
    else:
        print("Not enough GPU hardware devices available")
```

また、[tensorflow2.0 + kerasでGPUメモリの使用量を抑える方法](https://qiita.com/studio_haneya/items/4dfaf2fb2ac44818e7e0) によると、

> tensorflow2.3からはset_memory_growthが不要になったようです。ドキュメント読んでないので詳しくは分からないですがモデル作って学習してもメモリを全部もっていったりはされなくなっていました。

とのことですが、残念ながら私の環境では上記内容は再現できませんでした。
確かに、デフォルトで複数枚のGPUメモリ全てを確保することはなくなりましたが、1枚のGPUメモリは全て確保されてしまいました。
さらに、全部のGPUメモリを数百MBくらい、薄く確保していました。
詳しい方、どなたか教えてください。

# デバッグログ非表示

TF-2.xではGPU関係のログが大量に出てきます。
以下のようなログが最初に数十行くらいパーッと出てきて正直鬱陶しいです。

```bash
2020-08-21 21:57:32.240995: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudart64_101.dll
2020-08-21 21:57:34.374408: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library nvcuda.dll
2020-08-21 21:57:34.453727: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties:
....
```

以下のようにすれば TF-2.3でログが全く表示されなくなりました。
TF-1.xでのログ非表示方法は使えなくなってますのでご注意を。

```python
import os
import warnings
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.simplefilter(action='ignore', category=Warning)

import tensorflow as tf
tf.get_logger().setLevel('INFO')
tf.autograph.set_verbosity(0)

import logging
tf.get_logger().setLevel(logging.ERROR)
```

（21/7/2追記）
`silence_tensorflow` というTF2ログを消すためだけのライブラリがあるようです。
こちらの方が簡単ですね。
TF2.3, 2.4で動作確認しました。
https://pypi.org/project/silence-tensorflow/

```bash
$ pip install silence-tensorflow
```

```python
from silence_tensorflow import silence_tensorflow
silence_tensorflow()
import tensorflow as tf
```


# TF-2.0 ~ TF-2.2 は使わない方がよい？

きちんと調査したわけではありませんが、TF-2.0 ~ TF-2.2はメモリリークの噂があるようです。
よほどの理由がない限りは TF-2.3 を使った方が無難でしょう。
cf. [Memory leak - Issue #33309](https://github.com/tensorflow/tensorflow/issues/33009)

# 参考

- [Use a GPU | Tensorflow Core](https://www.tensorflow.org/guide/gpu)
- [Memory leak - Issue #33309](https://github.com/tensorflow/tensorflow/issues/33009)
- [tensorflow2.0 + kerasでGPUメモリの使用量を抑える方法](https://qiita.com/studio_haneya/items/4dfaf2fb2ac44818e7e0)
- [3_multiprocessing.ipynb](https://colab.research.google.com/github/araffin/rl-tutorial-jnrr19/blob/master/3_multiprocessing.ipynb#scrollTo=QvDDJztVkKvL)
[rails]deviseを用いて作成したモデルのpasswordの文字数制限を変える方法


この記事では<strong>rails5.2.3</strong>を使用しています
<h1>概要
<p>プログラミングスクールでログイン機能付きのフリマアプリを作成した際に、deviseのデフォルトの文字数制限（パスワードの最小文字数）を変更しなければならなかったので、備忘録として記録します。

私が調べて見つけた方法は２種類です。

<h1>1.deviseのデフォルトの設定を変える

config/initializers/devise.rb
のファイルに、deviseのデフォルトの設定が記載されています。
<pre><code>
config.password_length = 6..128
</code></pre>
この部分がpasswordの最小~最大文字数（デフォルトでは6~128文字）を制限している部分なので、ここの数字をいじれば変更できます。

<h1>2.deviseを使用するモデルに記述する

モデルファイルにバリデーションをかけて文字数を制限する方法です。
<pre><code>
rails g devise モデル名
</code></pre>
で作成したモデルファイルに
<pre><code>
devise :validatable, password_length: 最小数..最大数
</code></pre>
と記載することで文字数を制限することができます。<br>
他にも方法はあるようですが、この二つはとても簡単だったので参考にさせていただきました。

<h1>参考
<p>https://qiita.com/hirokihello/items/862284c60429be5e01cd
【Ruby】ハッシュの中にハッシュがある時の出力方法（値の指定など）

自分用のメモとしてハッシュの中にハッシュがある時の出力方法をここに記載します。

ちなみに私は２０２０年８月２１日現在、Rubyの学習を開始して２１日程度の初学者です。この記事に辿り着いた方は、私のわかる範囲で記述しているということを踏まえて参考程度にご覧ください。

##「ハッシュの中にハッシュがある時」とは？
```
data = { user: { name: "satou", age: 33 } }
```
↑これのことです。
初心者からしたら、「何じゃこれ！？」って感じですよね。私も「俺が知っているハッシュじゃない・・」と困惑しました。

こういう状態のハッシュのことを多次元（２次元、３次元）とかって呼ぶそうですよ。

##ハッシュの中にハッシュがある時（多重）の出力方法
```
data = { user: { name: "satou", age: 33 } }

【出力】
p data
push data
```
とりあえず data に格納された情報全てを出力するなら、と思い上の２つを試したところ、以下のような結果となりました。

```
p data => {:user=>{:name=>"satou", :age=>33}}
push data => error
```
予想通りの結果ですね。
続いてキーを指定しての出力について紹介します。

###ハッシュの中にハッシュがある時のキーを指定した出力方法
```
data = { user: { name: "satou", age: 33 } }

【出力】
p data[:user] => {:name=>"satou", :age=>33}
p data[:name] => nil
p data[:age] => nil
```
多重ではない普通のハッシュの時の出力方法と同様に、　p data[:] で出力したところ、[:name], [:age] の時は何と nil が返ってきました。

普通に出力したのではダメのようですね。

コードを見てわかる通り、user: の中のnameやageという状態となっているため普通には出力させてくれないようです。

ということで、いろいろとググった結果、下記の方法で name と age の値を指定して取り出すことができました。

```
data = { user: { name: "satou", age: 33 } }

【出力】
p data[:user][:name] => "satou"
p data[:user][:age] => 33
```
考え方としては、「キー:user の中の キー:name,age 」なので、先頭にあるキーを先に記述して、次の{}内にあるキーを指定すると上手く指定したキーの値を取り出すことができるようです。

私と同じように「この場合、特定の値を取り出すにはどうすればいい！？」とお困り方は参考程度に試してみてください＾＾
【大トラブル｜ピンチ 503 エラー】Amazon EC2 Auto Scaling でやってはいけない設定ミス

# 概要

顔面蒼白、大トラブルを起こしてしまいました。
同じようなことを他の方にも起こされないようにメモとして残しておきます。


# 何があったか

1. アラートが大量にでている、サイトに 503 エラーでサイトが開けない！
2. な、何が起きているのか AWS コンソールから EC2 インスタンスを確認 

    
    ![スクリーンショット 2020-08-21 20.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/3980ada9-9a6b-808b-5bd8-b4e340b2682d.png)


3. 恐怖！！！！ インスタンスが起動しかけて、すぐに終了して、起動しかけて、すぐに終了して、、無限ループ。。。。深呼吸。落ち着こう（キャプチャ見て分かるとおり、スクロールバーが表示されて、隠れるぐらい terminated のインスタンスがいます)
4. まず、急遽接続ができる状態にする最短の対策を考える
5. EC2 Auto Scaling がなぜ、起動しては失敗するような挙動になっているか調べる

# 対応

## 4. 急遽接続ができる状態にする最短の対策を考える

そして、急遽、AMI からインスタンスを単独で立ち上げ、最新のソースコードを反映し、ALB にアタッチした

これでひとまず、接続ができない問題は免れた

ここでさらに落ち着いて対応をするためにコーヒーを飲みました （どうでもいい）

## 5. EC2 Auto Scaling がなぜ、起動しては失敗するような挙動になっているか調べる

まず色々簡略化した図だが以下のようなサーバ構成図となっている (EC2は最小2台の構成)

![HN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/d41affbe-ac3d-e258-d63e-ef6bbb60ad15.png)

まず、最初にSTATUSチェック faild となっているインスタンスが2台存在していた。
そこから、EC2 Auto Scaling がインスタンスを最小2台構成に戻そうと頑張りだした。

ただ、起動しては起動しきれずに、すぐに終了してを繰り返している。
これの原因を見るために、Auto Scaling グループ のアクティビティを確認したところ以下のようなログを大量に確認した

![スクリーンショット 2020-08-21 20.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/307e386f-a549-e229-88b4-240bdcac6129.png)

```
Cancelled
Launching a new EC2 instance: i-xxxxx. Status Reason: Instance failed to complete user's Lifecycle Action: Lifecycle Action with token 8xxxxxx was abandoned: Lifecycle Action Completed with ABANDON Result
```

どうも Lifecycle Action が失敗しているようだ


Lifecycle Action で動いているのは最新のソースコードを反映するために、 CodeDeploy だ。
ログを見てみよう。


![スクリーンショット 2020-07-29 11.53.27 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/a5937492-2857-1e61-5b1c-ab1e242fa3bd.png)

なんということでしょう。大量の失敗の嵐が。

もう個々のログの中身を少し詳しくみてみると。


![スクリーンショット 2020-08-21 21.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/75fc67b9-cd3b-1818-450d-f21d2d72f193.png)

CodeDeploy の DownloadBundle イベントで UnKnownError

![スクリーンショット 2020-08-21 21.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/64564d00-4054-c175-b261-889aa09724c5.png)

さらに
The specified key does not exist.
と、表示されている。

CodeDeploy は以前デプロイした最新のソースコードを S3 から取ってくるのだが、存在しないよってことのようだ。

たしかに URL 開いたら、ソースコードファイルが S3 に存在しない。。。

![スクリーンショット 2020-08-21 21.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/7efdb351-196f-2fef-c84c-177ca68186f7.png)

ちょっと待てよ。
俺、CodePipeline のソースコードの S3 のバケット、GitHub で管理しているから、30日前のソースコードなんていらないと、
ライフサイクルルールで削除するように設定していたぞ。。
このサイトでデプロイしたの2ヶ月以上前だし、それだー！！！

ということで、ライフサイクルルールを消して、オートスケーリンググループを作り直すことで解決。

----

ちなみに、同じファイル名で最新のソースコードをS3に配置すれば動くんじゃね？って試してみたところ

![スクリーンショット 2020-08-21 21.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218682/11906b75-fe77-67eb-98b8-39d373fd81ee.png)

etag が一致しませんとエラーがでました。その通りですね。ちゃんとバリデーションしていただいて素晴らしいです。

# 結論

トラブルが起きたときは ~~コーヒーを飲む~~ 、じゃなくて、ひとまず落ち着いて、考える。
Amazon EC2 Auto Scaling で Lifecycle Action に CodeDeploy を定義している場合は、S3 に保存されるソースコードはライフサイクルルールで削除しては駄目。
PyCharmをインストールしたけど文字が入力できない！

#はじめに
解決策までの時間 30秒
解決策の作業時間 10秒
私のPyCharmのバージョン:2020.2


#解決策
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694093/f965ed42-b79a-6ded-215a-0de37e180c60.png)

上部Toolsタブから Vim Emulatorのチェックを外せ。
そうしたら慣れ親しんだWindowsのメモ帳と同じ動きをするだろう。
Ctrl+A も Ctrl+Cも使えるよ。

なに？　まだ入力できない？　そのキーボード壊れてるんじゃない？





#何が起こっていたのか知りたい人向け
この記事に来た人はたぶんPyCharmをインストールしたときに間違ってVim Emulatorをインストールしてしまったんだろうと予測した。一応この件に関して検索したがプラグインをアンインストールしろという記事が引っ掛かり、それってめんどくさいしもったいないよねと思ってこの記事を書いた。


Vimってなに？　という話だけどVimはコーディングを効率よく行うことのできる（そういう設計がされた）テキストエディタだ。



おめでとう。これで今日から君もVimmerだ。



冗談は置いておいてVimはめちゃくちゃ癖が強いので慣れるまで相応の時間が必要。というか私も使いこなせていない。ただしVimの特徴としてキーボードから手を放すことなく（マウスを使わずに）欲しいところを2行だけコピーして選択したところに張り付けたりとか、100個近い半角スペースで作られた空行を一発で消したりとかできる。便利でしょ？


さっきのチェックボックスを再度チェックしたらVimに切り替わるので興味のある人は調べてみてほしい。そして最初の一時間はキーボードを叩き割りたくなり、一年後にはVimを誰かに勧める困った人になっているはずだ。
Zend frameworkについて

#プログラミングの勉強日記
2020年8月21日
Zend Frameworkをこれから扱っていくが、そのうえで仕組みをよく理解できていないのでまとめる。

#Zend Frameworkとは
　PHPのオープンソースオブジェクト指向アプリケーションフレームワーク。使い方が自由で、他のフレームワークほど規約を使わない。なので、妥当なデフォルト設定して、アプリに応じてそれを上書きすることを推奨している。

　閲覧者がリクエストされたページはサーバ側で処理されたうえで返す。なので以下の図のようになる。この処理をZend Frameworkで書いていく。
![0821-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/29f440fe-b309-6784-cfd2-fbb4b4c54b1f.png)


#ビューの基本
　ビューファイルに関するファイルは下のようになっている。
![0821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/2b9a6083-d182-dbaf-be7e-ea33a4d1ce68.png)
　このようにビューファイルの拡張子は`phtml`でphtmlはHTMLに変換される。

　ページ全体のレイアウトを共通化するためには、共通テンプレートを用いる。`/layouts/scripts`の中にファイルを起き、設定ファイルに以下のように記述すると今日つのテンプレートを読み込む。(デフォルトの共通テンプレートのファイル名は``layout.phtml`)

```ini
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
```

```php3:具体例
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <p>ヘッダー</p>
    <?php echo $this->layout()->content ?>
    <p>フッター</p>
  </body>
</html>
```

#MVC設計モデル　
　MVCはModel-View-Controllerの頭文字であるように、Modelは処理をViewは表示、Controllerは制御といったお互いの処理範囲を明確にしている。
　ViewはZend_ViewコンポーネントがControllerはZend_Controllerが担当する。（Zend_Modelは存在しない）

![0821-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/a590904b-54fe-c793-df81-15b4339a9742.png)

　フロントコントローラではアプリケーションコントローラの置き場所を教えている。
　アクションコントローラは、クラスとして作成する。 
　ビュースクリプトでは、アクションコントローラ側で代入された変数値を反映させたうえで処理を行う。

#参考文献
[PHPフレームワーク「Zend framework」とは](https://nal-hr.co.jp/tech-2016-05-01-348)
[ビュー(テンプレート)の基本](http://pentan.info/php/zend_fw/view.html)
[Zend Framework まとめ](http://doremi.s206.xrea.com/zend/)
RPGツクールMZ発売！TypeScript用の型定義ファイルを作ろう

「RPGツクールMZ」が発売されましたね！めでたい

今回もMVに引き続き、Javascriptで書かれたコアスクリプトが提供されています。というわけで、コアスクリプトに対するTypeScript用の型定義ファイルを**さわりだけ**、本当に最低限だけ作ってみました。

最低限なのであまり使いこまないでね。めちゃ使いづらかったりバグも出るだろうし、いつの間にかぼくのコミットが続いて完全に別物になってるかもしれないので……

https://github.com/NumAniCloud/RMMZ_TypeDefinitions

これはRPGツクールMZのコアスクリプト(javascript)を元に、 `dtsmake` を使って型定義ファイルを生成し、エラーの無いように一部修正したものです。

## dtsmakeの実行をラクにしたかった

本題は、とりあえず `dtsmake` で最初の型定義ファイルを作るところまでをやってくれるソフトウェアを作ったので、みんなも型定義書いてみてね(そしてぼくが合流する)、というところです。

最初の型定義ファイルまでやってくれるアプリのリポジトリがこれです:

https://github.com/NumAniCloud/rmmz-dtsmake-run/tree/master

こちらはC#で書かれています。

完全にRPGツクールMZ用で、dtsmakeを使用するような別のシナリオで使えるものではないです。

### つかいかた概略

READMEにも書いてありますが、実行の際には以下のものをインストールしておく必要があります。

* RPGツクールMZ (体験版でもいけるかも)
* [.NET Core 3.1](https://dotnet.microsoft.com/download)
* TypeScript
* `dtsmake` (と、そのために必要な `tern`)

TypeScript, dtsmake, tern は npm (node.jsのやつ) 経由でインストールできます。

まずはREADMEの手順に従って型定義ファイルを作っていただいたとして、その型定義ファイルは不完全で実用には耐えないため、手動で整えてあげる必要があります。

そうしたら、適切な場所に型定義ファイルを配置します。 `<ゲームフォルダ>/node_modules/@types` フォルダに、生成された `*.d.ts` ファイルたちを配置します。これにより型定義ファイルどうしで型定義を互いに参照するようになってくれます。

その後はとにかく手書きで型定義を整えてあげます。頑張ってください！ぼくも頑張ります。

## おわりに

まだ誰も型定義ファイルを作っている様子が無かったので(そりゃそうだ)、とりあえず最初の一歩を踏み出すためのソフトを作った次第です。

ここで紹介した `rmmz-dtsmake-run` を使うもよし、自前で型定義を生成するもよし、ともかくTypeScriptでガリガリとプラグインを書ける日を目指して誰か頑張ってくれないかな～と思っています。

ぼくも自分のリポジトリにて型定義ファイルをガリガリ書いていきますが、なにぶんTypeScript初心者なので、TypeScriptに慣れている方が同じことをしている最中だったらそちらに合流したいところです……。　やってるよ！という方がいらっしゃれば頑張ってコミットしてみたいので、ぜひご一報ください。
マニフェストの修正にはkubectl edit

# kubectl editとは
kubernetes上のオブジェクトを直接編集できる

# 何が便利
~~~shell
# マニフェストを編集して保存
$ vi manifest.yaml

# 編集したマニフェストを適用
$ kubectl apply -f manifest.yaml
~~~
このようにマニフェストの編集とapplyという2段階の手順を踏む必要があったものが

~~~shell
$ kubectl edit config-map manifest
# ここで、エディタが起動するので編集して保存
~~~
という感じで、`kubectl edit`を実行すると起動してくるエディタで編集して保存するだけで修正内容がすぐに反映されるので、設定をちょこちょこ修正して、動きを見るような時に重宝する

# 使い方
`kubectl edit <オブジェクト種別> <オブジェクト名>`

~~~shell
kubectl edit svc/docker-registry                      # docker-registryという名前のサービスを編集します
KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # エディターを指定します
~~~


# editのほかにpatchもある
`kubectl patch`もあり、こちらはエディタでリソースを編集せずに、コマンドのみでダイレクトにリソース変更を完結することができる


~~~shell
# ノードを部分的に更新します
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
~~~

# 公式ドキュメント
## kubectl edit
https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E7%B7%A8%E9%9B%86

## kubectl patch
https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%B8%E3%81%AE%E3%83%91%E3%83%83%E3%83%81%E9%81%A9%E7%94%A8
CSSの属性セレクタの書き方

【概要】
----------------------------------------

<b>1.属性・セレクタとは何か</b>

<b>2.CSSの属性セレクタの書き方</b>

<b>3.ここから学んだこと</b>



1.属性・セレクタとは何か
----------------------------------------
<b>属性</b>：
タグの中の要素と一緒に含まれており、要素に情報を付け加える役割をもちます。属性に名前がついているものが”属性値”と言われます。

<b>セレクタ</b>：
CSSで使う言葉で、どのHTMLの属性に適用するかを示す役割です。

なのでclass属性とclassセレクタの違いは、
class属性は<b>”HTML”</b>、classセレクタは<b>”CSS"</b>を示しています。

```css:例
<link rel="stylesheet" href="abc.css>

<>:タグ
link:要素
rel,href:属性
stylesheet,abc.css:属性値
```
<br>
2.CSSのセレクタの書き方
----------------------------------------

では実際に、CSSをHTMLに反映する仕方をここに記載します。意外と知らないやり方もあるかもしれません。
<br>
❶-(1)要素に反映する

```css
div{
 color: red;
}
".（ピリオド）"無しで反映できます。
```
<br>
❶-(2)要素の複数に反映する

```css
div.name,div.gender{
 color: red;
}

<div class="name"></div>
<div class="gender"></div>
に反映します。
```
<br>
❷-(1)一部分の名前に反映

```css
.name{
 color: red;
}

"name"がついている属性は全て反映されます。
<div class="A name"></div>
<div class="B name"></div>に適用されます

また
*.name{
 color: red;
}
でも同じ意味になります。
```
<br>
❷-(2)一部分の名前に反映（要素）

```css:
前方一致
div[class^="na"]{color: red;}
後方一致（スペース、ハイフンがあっても後方一致の意味であれば反映）
div[class$="me"]{color: red;}
"m"が入っていれば一致（スペース、ハイフンがあっても反映）
div[class*="m"]{color: red;}
"name"が入っていれば一致（スペースがあっても反映、ハイフンがあると反映されない）
div[class~="name"]{color: red;}

属性の場合は、❶や❷-1で行っています。
```


<br>
❷-(3)完全一致（要素）

```css:
div[class] {color: red;}
div[class="name"]{color: red;}（スペース、ハイフンがあると反映されない）


<div class="name"></div>
に反映されます。

属性の場合は、❶や❷-1で行っています。
```
<br>
❸両方一致に対して反映or複数の属性にかけたい

```css:
.name.gender{
 color: red;
}


or


.name{
 color: red;
}
.gender{
 color: red;
}
であれば、
<div class="name gender"></div>
に反映されます。



.name{
 color: red;
}
.gender{
 color: red;
}

or

.name,gender{
 color: red;
}
であれば
<div class="name"></div>
<div class="gender"></div>
or
<div class="**** name"></div>
<div class="**** gender"></div>
に反映されます。
```
<br>

3.ここから学んだこと
----------------------------------------
よく".(ドット)"を抜けることがよくありました。
”検証”で反映できていないことを確認し、class名や記述ミスがないかをよく探していました。
【CSS】文中のアイコンが上下にズレてしまう問題

# 現象
Googleが提供する[Material Design Icons](https://material.io/resources/icons/?style=baseline)を使用しています。
文中にリンクを設置し、合わせて新規タブで開くことを示すこのようなアイコンを使用した際、

<img width="600" alt="スクリーンショット 2020-08-19 23.18.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/a4f7986e-ed40-617a-4314-0cb376d4dde2.png">


意識しないと少し上にズレてしまう現象が起こりませんか？
今回は解決したときの備忘録として記します。

# 解決法

2パターンご紹介します。

## コードとイメージ図

<p class="codepen" data-height="420" data-theme-id="dark" data-default-tab="result" data-user="yousukesasaki" data-slug-hash="eYZBbqR" style="height: 420px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="【CSS】文中のアイコンを上下に揃える">
  <span>See the Pen <a href="https://codepen.io/yousukesasaki/pen/eYZBbqR">
  【CSS】文中のアイコンを上下に揃える</a> by YousukeSasaki (<a href="https://codepen.io/yousukesasaki">@yousukesasaki</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### 前提
- 赤枠は通常の`p`タグ、青枠はリンク部分の`a`タグです。
- 文字とアイコン共に`font-size: 24px`
- `line-height: 24px`で文字の大きさと統一

## ①アイコンに対して`vertical-align: ◯◯px`で微調整

垂直方向の位置を調整するなら真っ先に思いつくのが`vertical-align`プロパティですよね。
真ん中に揃えたいのだから`vertical-align: middle`でいいのでは？と私も思ったのですが、

英字・ひらがな・漢字・アイコンなど…
様々な物を1つの文章の中に載せようとすると
**基準となる中央が揃わなくなってしまう**みたいです…

こちらのサイトでわかりやすく図で紹介されているので気になった方はご覧ください。
[理解しておきたい、CSSによるインラインレイアウトの仕組み（font-size／line-height編）Inline Layout─Frontrend Conference | HTML5Experts.jp](https://html5experts.jp/takazudo/13339/)

　
　
なので`middle`を使うのではなく、面倒ではありますが
`vertical-align`を何も指定しない場合の初期値`baseline`から
**上下に微調整する方法**として、`◯◯px`などの**具体的な値**を入力します。

冒頭の画像は文字とアイコン共に`24px`で揃えておりますが、
アイコンが上に`3px`ズレていたので今回は`-3px`として下方向にズラしました。

`baseline`の詳細はこちら
[vertical-align－スタイルシートリファレンス](http://www.htmq.com/style/vertical-align.shtml)

## ②リンクに対して`display: inline-flex`と`align-items: center`の組み合わせ

青枠の`a`タグに

- `display: inline-flex`と
- `align-items: center`

を付けています。

## inline-flexとは

> 「inline-block」の性格を持ちながら、尚且つ「flex」の性格を持ちます。

[FlexBoxの使い方（４）〜display:inline-flexについて（動画あり） | IT工房｜AI入門とWeb開発](https://itstudio.co/2016/09/15/6209/)

**Flexboxをinline要素の中で使うことができる**んですね。これは便利！
なので青枠のリンク全体をFlexboxとしてしまい、
Flexboxの中で`align-items: center`で垂直方向に中央寄せにする方法です。

# 補足
冒頭のイメージ図をご覧になっていただいておわかりの通り、
両者の1番の大きな違いは

`p`タグが**borderを含んだ高さとなるかならないか**です。

イメージ図では視覚的にわかりやすくするためにあえてボーダーを（しかも太めに）設定していますが、
通常は文章中にborderを設定することはないのであまり気にしなくても大丈夫かと思います:thumbsup_tone2:

また、文字とアイコンの`font-size`が同じでも、
隣り合う文字とアイコンの組み合わせによっては必ずしも見た目が揃うとは限らないので、
適宜アイコンの方のサイズを調整してください。

以上です！
【TF】Terraform 0.13 GA

`modules` の機能改善 と `terraform login` で Terraform Cloud との連携強化 は一番の目玉となります。

## modules の機能改善

一番悩まされた `module` の **`depends_on`** と **`count`** 機能が追加されました。:beer::beer::beer:
それ以外に `for_each` も追加され、もっと簡潔に書くことができます。

```terraform:foreach
variable "project_id" {
  type = string
}

variable "regions" {
  type = map(object({
    region            = string
    network           = string
    subnetwork        = string
    ip_range_pods     = string
    ip_range_services = string
  }))
}

module "kubernetes_cluster" {
  source   = "terraform-google-modules/kubernetes-engine/google"
  for_each = var.regions

  project_id        = var.project_id
  name              = each.key
  region            = each.value.region
  network           = each.value.network
  subnetwork        = each.value.subnetwork
  ip_range_pods     = each.value.ip_range_pods
  ip_range_services = each.value.ip_range_services
}
```

## Third-Party Providers の自動インストール

```
terraform {
    required_providers {
        # HashiCorp's dns provider
        hdns = {
            source = "hashicorp/dns"
        }
        # A hypothetical alternative dns provider
        mydns = {
            source = "mycorp/dns"
        }
    }
}
```

## Custom Variable Validation
0.12 もできますが、もっと簡潔になった。

```terraform
variable "ami_id" {
  type = string

  validation {
    condition     = can(regex("^ami-", var.example))
    error_message = "Must be an AMI id, starting with \"ami-\"."
  }
}
```

## 参考資料
https://www.hashicorp.com/blog/announcing-hashicorp-terraform-0-13/
J社との想ひ出

「J社の着メロのダウンロード数の監査あるから、この日のアクセスログ用意しておいて」

「アクセスログですか？　分割ダウンロードとかもありますから、アクセスログからダウンロード数集計するの大変ですよ？　集計結果とかじゃダメなんですか？」

「監査だから生ログじゃないとダメなんだと。向こうで集計プログラムでも作るじゃない？　だから、集計アルゴリズムの設計書も用意しておいて。」

〜〜〜提出後、J社から電話〜〜〜

J「送ってもらったファイルなんですが、**秀丸**で開けないんですが・・・」

秀丸・・・？

「1日分でも数ギガあるんで無理でしょうね。集計プログラムとか作らないと無理ですよ。」

J「小さくできないんですか？」

「必要な部分だけ抜き出せば小さくなりますが、それだともうログ加工してしまっているので、監査の意味がなくなっている気がしますが・・・。」

J「ああ、そうなんですね・・・。ちょっと考えます・・・。」

それきりJ社から電話がかかってくることはなかった
【TouchDesigner】セカンダリディスプレイを活用する

#はじめに
TouchDesignerのNetworkViewerを広々と使うためにその他のよく使うペインをセカンダリディスプレイに移動させましょう。

##方法

####1.ペイン右上の下矢印マーク(Pane Options)をクリック
####2.Duplicate Paneをクリック
####3.ペインがポップアップするので任意のサイズに変更してセカンダリディスプレイに移動
![pane.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152366/2754c4f8-728a-cc23-90e7-de09d367eccb.gif)
ShogunAPIからチケットを投稿する方法

# やりたい事
ShotgunAPIだけで画像のようなチケットを投稿したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/d3dcd065-e3bf-4b56-7fe3-923bfbc03175.png)



# コード
APIキーなどは各環境に合わせて変更してください。

```python
import shotgun_api3
SERVER_URL = 'https://tanuki.shotgunstudio.com'
SCRIPT_NAME = 'tanuki_API'
SCRIPT_KEY = 'hondotanuki'

_sg = shotgun_api3.Shotgun(SERVER_URL, SCRIPT_NAME, SCRIPT_KEY)
data = {
    'project':{"type"  : "Project","id" : 1},
    'title' : u"テストチケットの投稿"
    }
sg_Ticket = _sg.create('Ticket', data)

sg_reply = {
                'entity':{
                    'type':'Ticket',
                    'id':sg_Ticket["id"]
                },
                'content':u"テスト"
}

_sg.create("Reply",sg_reply)
```

_sg.create('Ticket', data)からチケットを作成して、_sg.create("Reply",sg_reply)で詳細をリプライ形式で書き込んでいきます。

チケット作成には最低限プロジェクトの指定が必要です。
リプライは紐づける先となるチケットのIDが必要です。

# 結果
出来ました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/97ccb7eb-9e59-e659-fa80-9ca8528aa9d2.png)

# 参考にしたもの
https://support.shotgunsoftware.com/hc/ja/community/posts/209486248-Reply-Note-with-API-this-is-possible-
gitに関するメモ書き

【GitHub】Privateリポジトリの作成から、EC2からの既存ディレクトリpush処理まで
https://qiita.com/hisayuki/items/1f608f70a212982b23d5

EclipseからGitlabへのPush
https://www.gwtcenter.com/using-gitlab-1

git flow
https://qiita.com/KosukeSone/items/514dd24828b485c69a05

git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう
https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html
JavascriptでWindowsアプリがインストールされているかを確認する方法

スマホでURLスキームを使った「指定のアプリが入ってるか判定するJS」があるけど、
Windowsアプリでも使いたかったので色々調べたけど出てこなかった。

スマホと同じで行けるかな？と思って試したけど駄目だったので、別の方法を考えててみた。
やってることは難しくはないけど、この手があったかと思ってやってみたらいい感じに動いたのでメモ。
// なんかもっといい方法がある気もするなぁ…


```html:
<script language="javascript">
var _is_blur = false;
$(function() {
	$(window).on("blur", function(){
		_is_blur = true;
	});

	document.location = "URLスキーム";
	setTimeout(function(){
		if (_is_blur) {
			// installed
			alert("インストールされてるはずだよ");
		} else {
			// not installed
			alert("インストールされていないよ");
		}
	}, 500);
});
</script>
```
Windowsの場合、
URLスキームを叩いたときにWindows側から「プログラムを起動」のダイアログが出て
ブラウザからフォーカスが外れるので、それを利用。

アプリによって500msではフォーカスが移らない可能性もあるので適宜調整したほうがいいかも。
PHPのDocコメントとやら

上司のコードを見ていて、`@params`などの記述を見つけました。たまに見つけてはスルーしていたのですが、今日はなぜか気になったので調べてみました。

参考→https://qiita.com/motoyan-qwt/items/ee973666f1105435822c

型や返り値をわかりやすくするためのようです。

言われてみれば、PHPは他の言語に比べると型の縛りがあいまいです。（定義しなくても勝手にうまいことやってくれます）
今後はできるだけ書いていこうと思います。
rails tutorial 第2章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。


#第2章 Toyアプリケーション

##2.1.1 ユーザーのモデル設計
Q..モデルって?

モデルとは…
科学や工学、ビジネス、IT関連では特にシステム設計やシミュレーションなどの分野において、取り扱う対象から目的に照らして不要な側面を捨象して、その構造や構成要素、対象間の関係や互いに及ぼす作用などを模式的に表した模型（モデル）を作り、図表や数式、データ集合、データ構造、人工言語（モデリング言語）などを用いて定義することをモデリングという。(引用:http://e-words.jp/w/%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0.html)


A..抽象的な概念ですけれどつまりデータなどの構成要素を模式的に表した模型といったところでしょうか。

---
integerとは
整数を入れられる関数のこと。

stringとは
文字列のこと。

string型とtext型の違い
stringはmax255文字、textはそれ以上も可。


##2.2.2 MVCの挙動
Q..リソースって?

A..以下の記事が参考になりました。
https://qiita.com/katsutakashima/items/47977b9e7d18cf816734
つまりはwebインターフェース(URL)で扱うことができる操作対象のデータということのようです。
https://github.com/yochiyochirb/meetups/issues/124
URIで指し示されるものといった表現も何となくわかりました。
凄いざっくりリンクって理解してもよいかもしれません。



##2.3.2 マイクロポストをマイクロにする
Q..ActiveRecordって?

A..以下の記事が参考になりました。
https://qiita.com/ryokky59/items/a1d0b4e86bacbd7ef6e8

図で分かりやすく解説されていてよくわかりました。
ざっくり言うとrubyでDBを操作するための仕組みのようです。

#終わりに
今回の章では、概念的な部分を理解するため色々な記事を参考にしました。