OmniAICreator/Qiita-1.07M huggingface dataset:
rails test で発生する LoadError (cannot load such file -- bcrypt) を解決する (Railsチュートリアル 6章)

自分がrailsチュートリアルを進めていく上で、発生したエラーを記録していきます。
ハードはMacBook Air, 開発環境はVScodeを用いています。

#Rails チュートリアル 6章 6.3 セキュアなパスワードを追加する

####LoadError (cannot load such file -- bcrypt)　のエラーが発生するまでのあらすじ

add_password_digest_to_usersというマイグレーションファイルを生成し、データベースでマイグレーションを実行します。

```
$ rails generate migration add_password_digest_to_users password_digest:string
$ rails db:migrate
```
Gemfileにbcryptを記述し、$ bundle install を実行します。

```:Gemfile
gem 'rails',          '5.1.6'
gem 'bcrypt',         '3.1.12'
```
```
$ bundle install
```
次にUserモデル内にhas_secure_passwordを追記します。

```:app/models/user.rb
class User < ApplicationRecord
  ~省略~
  has_secure_password
end
```

ここで

```
$ rails test
```
を実行すると、has_secure_password によって追加されるバリデーションによってエラーが発生するはずです。

####しかし次のようなエラーが発生しました。

```
$ rails test
LoadError: cannot load such file -- bcrypt
〜省略〜
```
試しに、rails consoleをして、User.newを実行すると、、、

```
$ rails console

Running via Spring preloader in process 18909
Loading development environment (Rails 5.1.7)

WARNING: This version of ruby is included in macOS for compatibility with legacy software. 
In future versions of macOS the ruby runtime will not be available by 
default, and may require you to install an additional package.

>User.new
You don't have bcrypt installed in your application. Please add it to your Gemfile and run bundle install
Traceback (most recent call last):
        3: from (irb):1
        2: from app/models/user.rb:1:in `<top (required)>'
        1: from app/models/user.rb:10:in `<class:User>'
LoadError (cannot load such file -- bcrypt)
```

インストールしたはずのbcryptが全然読み込まれない......(泣)


[【Rails】bcryptインストール時の"cannot load such file -- bcrypt_ext"エラー対応【Windows】](https://qiita.com/totto357/items/1741da83bf642dab99df)

この解決策が一番それっぽかったけど、これでも全然解決しない、、、、というような状況の人は、次の解決策を試してみてください。

#解決方法 Rubyをアップデートする

まず、

```
$ rbenv versions
```
でrubyのバージョンを確認します。
次に、そのrubyをuninstallsimasu

```
$ rbenv uninstall 確認したバージョン
```
次に、新しいバージョンを指定して、インストールします。(ここでは2.6.5)

```
$ rbenv install 2.6.5
```
インストールが完了したら次を実行します。

```
$ rbenv global 2.6.5
$ rbenv rehash
```
これでrubyのバージョンが変わっているはずです。($ ruby -vで確認できる)

>参考：[rbenvの使い方と仕組みについて](https://qiita.com/Kodak_tmo/items/73147ed4f0eec54d6e94)



最後に、Gemfileの内容を変更・確認します。

```
source 'https://rubygems.org'

ruby '2.6.5'  ←追記
gem 'bcrypt'　←バージョンも指定しなくて良い（bcrypt-rubyとかもmacOSならいらない)
```
▲ここでは、rubyのバージョンを指定し、bcryptをバージョン指定なしで最新版をインストールできるように記述します。



>$ gem list bcrypt
を実行し、bcryptが入っていたら、
$ gem uninstall bcrypt)
を実行して削除しておく。

bundle installをして、bcryptをインストールします。

```
$ bundle install
```

すると、$ rails consoleを実行したときの、WARNINGが解消され、**無事エラーが解決します。**


---
役に立ったら**是非LGTMボタンをポチッと押していただけると嬉しいです。**
一緒に Rails学習 頑張りましょう！:raised_hand_tone1:
【STUDY：NO.1】「AWS H4B ハンズオンはじめの一歩：AWSアカウントの作り方 & IAM基本のキ」をやってみた【PART１】

## 資料

下記ハンズオンをやってみました。
[AWS H4B ハンズオンはじめの一歩：AWSアカウントの作り方 & IAM基本のキ](https://pages.awscloud.com/event_JAPAN_Ondemand_Hands-on-for-Beginners-1st-Step_LP.html)

## はじめに）AWS H4B（Hands-on for Beginners）とは

- 初心者向けAWSサービスのハンズオン（オンデマンド）
- 実際にAWSサービスを動かすので、各AWSサービス無料枠を超える可能性もある点に注意

「これからAWSをはじめるよ」って人向けのチュートリアル動画集ですね。
下記のページに動画がまとまっているみたいです。
[AWS ハンズオン資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)

## ゴール

- ハンズオン用AWSアカウントの作成
- IAMの基礎知識の習得
- IAMリソースの作成

今回は、アカウント作成についてのハンズオンですね。
それにしても、ここまで丁寧なハンズオンは見たことがないので、
なにかAWS独特な考え方があるのかも…ですね。。

## AWSアカウント作成に必要なもの

- メールアドレス
- 携帯電話番号
- クレジットカード

アカウントを作る時点でクレジットカードがないといけないのが少しハードル高いです…

## AWSアカウント作成ハンズオン…

実際にアカウントを作成するところまでは問題なくできたのですが、
作成したアカウントがアクティベートされるまで少し時間がかかりましたね…

<img width="965" alt="スクリーンショット 2020-07-21 17.30.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678150/3dfc89b9-4c3f-b979-6e5f-70a57e7719c1.png">

メールアドレスを間違ったのかなと思って、
再登録を試したところ、メールアドレスは合っていそうでした…

<img width="1018" alt="スクリーンショット 2020-07-21 17.35.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678150/d3d80aef-9726-7d40-4e78-efe42ed1c698.png">

AWSサポートに問い合わせしつつ、なんやかんや情報を探していると、
10分後くらいには無事にログインできるようになっていました。

ちなみに、パーソナルユースで登録しているにも関わらず、
しっかりとサポートしてもらました！ありがとうございます！！

<img width="959" alt="スクリーンショット 2020-07-22 23.48.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678150/532d52f6-4509-6563-60ed-bc119cf0998e.png">

## さいごに

Qiita、というか、公の場へのアウトプットが初めてなので、
「どのようなクオリティのモノを出せば良いかな？」とか色々考えたんですが、
ひとまずは深く考えず、インプット→アウトプットをやってみます！まずは行動！

こんな感じでゆるーい投稿が続くかもしれませんが、
同じ分野のことをしている方がいれば仲良くしてもらえると嬉しいです:relaxed:
yukicoder contest 258 参戦記

# yukicoder contest 258 参戦記

## [A 1119 Division 3](https://yukicoder.me/problems/no/1119)

Python の場合、X×Y×Z を素直に計算して3で割れるか確認すればいいです. 言語によっては X,Y,Z≤10<sup>9</sup> の制限から 64bit の範囲を超えて死にそうです.

```python
X, Y, Z = map(int, open(0).read().split())

if X * Y * Z % 3 == 0:
    print('Yes')
else:
    print('No')
```

## [B 1120 Strange Teacher](https://yukicoder.me/problems/no/1120)

N = 2 の場合は簡単. N > 2 の場合、合計が N - 2 づつ減っていくので、「操作回数の最小値を求めよ。」といいつつ、操作回数は (sum(A) - sum(B)) / (N - 2) 固定となる. あとはその操作回数で B が実現できるかを考えるだけ. A<sub>i</sub> と B<sub>i</sub> の差の絶対値が操作回数より大きい場合はおかしい. +1 操作を適用した場合、その回数の2倍だけ B<sub>i</sub> が増えるので、B<sub>i</sub> と A<sub>i</sub> から操作回数を引いた数の差が2の倍数じゃないとおかしい. これら2つのありえないパターンを弾いたら AC した.

```python
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

if N == 2:
    if sum(A) == sum(B):
        print(abs(A[0] - B[0]))
    else:
        print(-1)
elif N > 2:
    if sum(B) > sum(A):
        print(-1)
    elif (sum(A) - sum(B)) % (N - 2) == 0:
        t = (sum(A) - sum(B)) // (N - 2)
        for i in range(N):
            if abs(A[i] - B[i]) > t or (B[i] - (A[i] - t)) % 2 == 1:
                print(-1)
                break
        else:
            print(t)
    else:
        print(-1)
```
PowerShell でcurlを使いたい。JSONをエスケープせずに。

今までcurlのためだけにWSLのUbuntuを起動するということをやっていたのですが、最近発見した方法がこちら。

1. PowerShell 7.x をインストールする。
2. PowerShell 7.x 上でcurlを実行する。
3. POSTリクエストを投げる時は、JSONボディ全体をダブルクォートでくくり、中身の引用符にシングルクォートを使う。

## PowerShell 7.xをインストールするとcurlを実行できる理由
- Windows10の1803以降では、標準でcurlコマンドがインストールされており、コマンドプロンプトを使えば普通にcurlが使えます。
- しかしながら、個人的にコマンドプロンプトは好きじゃないので、PowerShellを使いたい。
- しかしWindowsに標準インストールされているPowerShell (2020/7/22現在のバージョンは5.1)でcurlを呼ぶと、Invoke-WebRequest というコマンドが実行されてしまいます。curlがInvoke-WebRequestのエイリアスになっているためです。[^1]
- そこで、Windows標準インストール版PowerShellの後継版(7.x)を利用します。こちらはクロスプラットフォーム化された後継版です。[^4]
- この後継版(以下pwsh)では、Invoke-WebRequestへのエイリアスが削除されています。

[^4]: PowerShell Coreとも呼ばれているようですが、PowerShell Core だったのは 6.x 系だけで、最近正式リリースされた 7.x系では単純に「PowerShell」と呼ばれているようです。[Microsoftの説明](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-windows?view=powershell-7 "Windows への PowerShell のインストール")のページにて「PowerShell Core」ではなく「PowerShell」と書かれているのを見て、私もちょっと混乱しました。


ちなみに PowerShell 7.x のインストール方法ですが、[Microsoftの説明](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-windows?view=powershell-7 "Windows への PowerShell のインストール")を参照してください。とは言ってもGitHubからmsiファイルをダウンロードして実行するだけです。
普通にインストールしても、PowerShell 5.1を上書きしたりはしないので大丈夫です。
今回は本日2020/7/22時点でのLTS最新版、7.0.3を使いました。

[alias を削除する](https://devadjust.exblog.jp/22690878/)という方法もあるみたいですが、PCを引っ越したりしたときに忘れそうなので、今回は別の方法で試しました。

(2020/7/23追記)コメントで指摘いただきましたが、PowerShell 5.1でも"curl"ではなく"curl.exe"と書くだけで Invoke-WebRequestのエイリアスを回避できます。

## JSONボディの送り方
PowerShell上でcurlを使う際、POSTでJSONデータを送りたいことがあります。Linuxでやるように

```PowerShell
-d '{"query": "hogehoge"}'
```

と書くと、"BadArgument"と怒られてしまいます。
[Windows 環境における curl コマンド利用のまとめ (平成最終版)](https://qiita.com/yamachan360/items/8c928738289cd518eec8)によると、どうやら下記のようにエスケープする必要があるようです。

```PowerShell
-d '"{\"query\": \"hogehoge\"}"'
```

……面倒ですね。面倒だと思ったので、単純に中身をシングルクォートにしてみました。つまりこうです。

```PowerShell
-d "{'query': 'hogehoge'}"
```
動きます。
RFCによると、JSONの文字列は本来ダブルクォートでくくる必要があるらしいのですが、通ります。
少なくとも私がテストしたサーバーでは通りました。
個人的にcurlを使うのはちょっとしたテストだけなので、当面これで行こうと思います。

## 上記で動かないサイトがあったらどうする？
ごーばっくとぅー WSL

[^1]: 単純なGetならともかく、-H も -X も使えない仕様にしたの、なんでなん……？
Linux（Bash）とWindows（Powershell）のキーバインド対応表

とりあえずメモしておきます。

# 環境について

* Linux
    * ディストリビューションは<font color="red"><b>何でもOK</b></font>です。
        * 例（**私が確認したもの**）
            * Ubuntu
            * CentOS
            * TinyCoreLinux
            * Bash on Windows（Windows10で使えるbashのこと）
    * シェルは、以下のもので確認ができました。
        * Sh
        * Bash

* Windows 10
    * Powershell
    * コマンドプロンプト

# 注意

## <font color="red">Teratermをお使いの方へ</font>

私はよくTeratermを愛用していますが、
どうやら、**Teratermのキーバインドが優先**されるっぽくて、
これから記載するキーバインド対応表は<font color="red">一部使用できないです</font>。

私は使ったことが無いので分かりませんが、他のターミナルソフト（MobaXtermとか）なら可能<font color="red">かも</font>しれません。

ですが、おとなしく標準のターミナルやPowershellを使った方がいいかも。。。

# キーバインド対応表

| <font color="Magenta">動作</font> | <font color="Magenta">Linux（Bash）</font> | <font color="Magenta">Windows（Powershell）</font> |
| --- | --- | --- |
| **中断** | `[Ctrl] + [C]` | `[Ctrl] + [C]` |
| **画面クリア** | `[Ctrl] + [L]` | `[Ctrl] + [L]` |
| **直前の単語１つの削除** | `[Ctrl] + [W]` | `[Ctrl] + [BackSpace]` |
| **次の単語に進む** | `[Ctrl] + [→]` または `[Alt] + [F]` | `[Ctrl] + [→]` |
| **前の単語に戻る** | `[Ctrl] + [←]` または `[Alt] + [B]` | `[Ctrl] + [←]` |
| **カーソル位置から先頭まで削除** | `[Ctrl] + [U]` | `[Ctrl] + [Home]` |
| **カーソル位置から末尾まで削除** | `[Ctrl] + [K]` | `[Ctrl] + [End]` |
| **カーソル位置を先頭にする** | `[Ctrl] + [A]` または `[Home]` | `[Home]` |
| **カーソル位置を末尾にする** | `[Ctrl] + [E]` または `[End]` | `[End]` |
| **コマンドを実行せずに改行** | 存在しない<br>（`$ command \ # コマンドの末尾に \ を付ける`） | `[Ctrl] + [Enter]` |
| <font color="red">他に何かあったら随時追記します</font> | `` | `` |
Railsの/users/:id/を/{ random_srting }にする: Routingを脱デフォルト

# やりたいこと

- できるだけ#Showアクションへのpathを短縮したい
- pathにidが含まれるのはデメリットが多いと感じた
- /users/:id/に`:id`を使うのをやめたい

備忘録的に残しておきます

# /users/:id/の:idをid以外の属性にする

## model: to_param を使う

url_tokenにSecureRandom.urlsafeでURL-safeなランダム文字列を生成し、
idの代わりに用いる例

現在日時 + 乱数とかをエンコードするようにすると衝突の可能性は低くなるかも

```ruby
class Article < ApplicationRecord
  attribute :url_token, :string, default: -> { SecureRandom.urlsafe_base64(8) }
.
.
.
  def to_param
    url_token
  end
end
```

uuidなら以下の通り
（以下uuidを採用して説明を残します、URLを短縮したいという目的には合わないと思います）

```ruby
class Article < ApplicationRecord
  attribute :uuid, :string, default: -> { SecureRandom.uuid }
.
.
.
  def to_param
    uuid
  end
end
```

## Controller

あとはコントローラーで`params[:id]`を使っている部分をparams[:uuid]に書き換える

## Routing: `param: :uuid`

```ruby
Rails.application.routes.draw do
  resources :users, param: :uuid
.
.
.
end
```

`param: :uuid`と書き加えるだけ
これで`/users/:id`が`/users/:uuid`に置き換わる



# /users/:uuidを/:uuidにしたい

## Routing: `param: :uuid`

`path: '/'`を追加する

```ruby
Rails.application.routes.draw do
  resources :users, param: :uuid, path: '/'
.
.
.
end
```

このときのroutingを`Rails routes`で確認すると

```
       users GET    /                        users#index
             POST   /                        users#create
    new_user GET    /new(.:format)           users#new
   edit_user GET    /:uuid/edit(.:format)    users#edit
        user GET    /:uuid(.:format)         users#show
             PATCH  /:uuid(.:format)         users#update
             PUT    /:uuid(.:format)         users#update
             DELETE /:uuid(.:format)         users#destroy
```

`users_path`はGET '/'でroot_pathと重複するし、
`POST /`も`Routing Error: No route matches [POST] "/users"`となりうまくいかない

よって暫定的な対応として、index, new, create以外のアクションのみをルートベースなpathとすることにした

実際の`routes.rb`は

```ruby
Rails.application.routes.draw do
  resources :users, only: [:index, :new, :create]
  resources :users, param: :uuid, path: '/', only: [:show, :edit, :update, :destroy]
  .
  .
  .
end
```

なんだかブサイクだけととりあえずこれでやってみます

# 参考

rails で /users/:id ではなく /:username な routing にする方法 · Yuichi Takada https://blog.takady.net/blog/2015/11/29/rails-routing-with-username-instead-of-id/
Raspberry Pi OSにはNode-REDがインストールされていない？

Raspberry Pi OSにはNode-REDがインストールされていないようなので、インストール方法についてメモしておくことにした。

## インストール

※参考：[Raspberry Piで実行する : Node\-RED日本ユーザ会](https://nodered.jp/docs/getting-started/raspberrypi)

1. Node-REDのインストーラをダウンロードし、実行する。

    ```shell
    bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
    ```

    ```text
    Running Node-RED install for user pi at /home/pi on raspbian

    This can take 20-30 minutes on the slower Pi versions - please wait.

      Stop Node-RED                       ✔
      Remove old version of Node-RED      ✔
      Remove old version of Node.js       ✔
      Install Node.js LTS                 ✔   Node v12.18.2   Npm 6.14.7
      Clean npm cache                     ✔
      Install Node-RED core               ✔   1.1.2
      Move global nodes to local          ✔
      Install extra Pi nodes              ✔
      Npm rebuild existing nodes          ✔
      Add shortcut commands               ✔
      Update systemd script               ✔


    Any errors will be logged to   /var/log/nodered-install.log
    ```

    ```text
    All done.
      You can now start Node-RED with the command  node-red-start
      or using the icon under   Menu / Programming / Node-RED
      Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

    Started  Thu Jun 21 12:34:44 UTC 2018  -  Finished  Thu Jun 21 12:48:37 UTC 2018
    ```

1. X Windowの場合、デスクトップから[Menu]-[Programming]-[Node-RED]を開く。

    1. 自ユーザのみの場合、次のコマンドで起動/停止する。

        ```shell
        $ node-red-start
        $ node-red-stop
        ```

    1. デーモンとして扱う場合、次のコマンドで起動/停止する。

        ```shell
        $ sudo systemctl start nodered.service
        $ sudo systemctl stop nodered.service
        ```

1. ブラウザでNode-REDにアクセスする。

    http://example.com:1880/

## 設定

1. システム起動時に自動起動する場合、次のコマンドで設定/解除する。

    ```shell
    $ sudo systemctl enable nodered.service
    $ sudo systemctl disable nodered.service
    ```
初心者によるプログラミング学習ログ 378日目

#100日チャレンジの378日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
378日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●就寝前筋トレ5分、キンドル読書 10分<br>●ブログ1記事作成<br>●プログラミング学習378日目 2h<br>・メンターの課題<br>・背景画像のスライドショー<br><br>あまり捗らず。<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%E3%81%A4%E3%81%AA%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><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></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1285666705260371969?ref_src=twsrc%5Etfw">July 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Win版Docker Desktop「The command 'docker' could not be found in this WSL 2 distro.」の対処法

 

##前提条件　
WSL2がインストールされていて利用できる。

##Docker desktopインストールの手順

URL:http://docs.docker.jp/desktop/toc.html

##本題
Microsoft StoreからLinux app（筆者はUbuntu 20.04 LTS）をダウンロード

appを起動してdocker commandを入力すると、、、

![2020-07-21 (4)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/a01a446f-a653-720a-5743-c9e787e9abaa.jpeg)

このようにdocker commandが見つからないと表示される。

##解決方法
Docker Desktopのsettingsをいじったら解決した。
灯台下暗し。
![2020-07-22 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/1fc9cc45-cb7a-16e1-e2a9-000a0378fd29.jpeg)
え。こんなに簡単なの！？ Azure Static Web Apps

# Azure Static Web Apps プレビュー版
同じ様な名前のサービスがたくさんあって困惑しているので、実際に触ってみて理解しようと思う。
■［Azure App Service］課金プランの名前
┣　［Azure Web App］課金プランに紐づいて作成する、動的WEBアプリを動かす環境
┗　［Azure Static Web App］同じく、静的WEBサイトを公開する環境

公式サイトに [Web App Service]だったり、[WebApps]だったりするんだよね。どれが正式名称なんでしょう...。

**プレビュー期間中は無料。正式リリース後もFreeプランが登場することを期待しつつ**

## Azure管理ポータルで Static Web App と Github を統合
リソースグループ、WEBアプリの名前、リージョンを入力します。ソースはGithubアカウントで連結します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/c0e5d0a1-9578-7266-560f-8fbe2ad60f0e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/6400bdb3-6026-2f12-0f8e-ea5c85ebec46.png)

## 静的WEBアプリの準備が整ったら
Github の Actions に "Azure Static Web Apps CI/CD"が作成されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/316dc200-789b-e016-8fd2-81f36c68c886.png)

## そして約90秒経過すると、WEBサイトにアクセスできるようになりました。
HTML x 1個だけのテストサイトだけど、APIサーバーからJSONデータを読み込んでgoogle.visualization.ColumnChart()を使ってグラフ描画を書き換えできました。GitHub Pages みたいな使い方なのかな。

- HTTPSでのアクセス（httpでアクセスするとhttpsに置き換えられる）。
- 独自FQDNで公開したい場合は、Azureにカスタムドメインを設定すればよい。
- バックアップは無い。障害あったらGithubから再デプロイすればいいですね。
- ステージング用のURLも用意があるようです。
- 本番用のURLは https://purple-glacier-***.azurestaticapps.net/ 。
- SSLサーバー証明書は[Go Daddy Root Certificate Authority -G2]でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/9a38860a-0761-b51c-0b69-169165efe4ab.png)

## まとめ
あらかじめGithubに公開するWEBサイトのHTMLが保存されている前提で、Azure Static Web App を設定したら、たぶん数十分、すぐにWEBサイトを公開、アクセスできるようになりました。仮想サーバーやサーバーOSが無いので、脆弱性やウィルス対策が不要ですね、たぶんWebApp同様に障害あっても自動復旧してもらえるだろうし、静的WEBサイトを公開するなら、このサービスがいいですね。もうIISとかApacheのWEBサーバーを準備してインフラを運用する時代じゃないんですね...。
AWSとGCPの違い

#AWSとは?

- Amazonが提供するクラウドサーバーのサービス名。**A**mazon **W**eb **S**ervicesの略。

- AWSのメリット
    - サービスのメニューが豊富にある。
    - ドキュメントが豊富で日本語情報も充実している。

- AWSのデメリット
    - サービスが多様である為、設定ノウハウが複雑で専門的な知識と経験が必要になる。

#GCPとは?

- Googleが提供するクラウドサーバーのサービス名。**G**oogle **C**loud **P**latformの略。

- GCPのメリット
    - 検索エンジンで培ったビックデータ解析能力により高速でビッグデータを処理できる。
    - コスト面でAWSより安い。


- GCPのデメリット
    - 日本語情報が少ない。

参考サイト：https://business.ntt-east.co.jp/content/cloudsolution/column-07.html
競プロで使うための GO 入門 ～ASCII変換～

# Index

- [はじめに](https://qiita.com/CamouflageSix/items/ab004a1078f491bd15ef)
- [Hello World](https://qiita.com/CamouflageSix/items/05e5a0f9616e28d6fca4)
- [標準入出力](https://qiita.com/CamouflageSix/items/f53e047eda80df03548a)
- [変数・定数]
- [型変換](https://qiita.com/CamouflageSix/items/1c52bf9705a3627fa5db)
- [制御構文]
- [配列～](https://qiita.com/CamouflageSix/items/41d901b9b170d5565895)
- [ソート](https://qiita.com/CamouflageSix/items/dbc2017504571e5a65aa)
- [関数](https://qiita.com/CamouflageSix/items/afb42d399a27f5ca3cf8)
- [ASCII変換](https://qiita.com/CamouflageSix/items/283655027e6581a79b4b)
- [math パッケージ](https://qiita.com/CamouflageSix/items/bdfe5440d230d5c18458)

# ASCII変換
```GO:
package main

import (
	"fmt"
)

func main() {

    // 文字からASCII
    s := "ABC"
    fmt.Println(s[0], s[1], s[2]) // ->64 65 66

	// ASCII から文字
    s = string(97) + string(98) + string(0x63)
    fmt.Println(s) // ->abc
}
```
E資格合格体験記

# はじめに
まさか自分がこんなのを書くことになる日が来ようとは、、、

普通に資格取得が大変だったので、今後受ける人のために虎の巻を残す

新型ウイルスの影響で試験が中止になってしまったので、受験者の皆さんはそろそろモチベーションがさがっているのでは？

# 1. E資格基本情報

## 1.1 そもそも「E資格」とは

「E資格」とは、一般社団法人日本ディープラーニング協会(JDLA)が創設した、ディープラーニングの実装技能を認定をするためのAIエンジニア向けの資格

## 1.2 受験料と会社からの奨励金

受験料：30000円＋税(2020/3/5時点)

## 1.3 受験日程

2回/年（2月と8月）

## 1.4 出題範囲

- 一般的なAIの知識
- 応用数学
- 機械学習
- 深層学習
- python(ライブラリはnumpyとpandasのみ)を使ったプログラミング

## 1.5 受験資格

**JDLA認定講座を修了**する必要あり

認定講座一覧ページ

[E資格とは](http://202.32.159.129/certificate/engineer/#certificate_No04)

# 2. ここから合格体験記

## 目次

- 2.1 2020年2月の出題傾向
- 2.2 合格者それぞれの合格までの詳細
- 2.3 おすすめ勉強方法

## 2.1 2020年2月の出題傾向

### 全体感
- JDLAが出している公式例題そのままであったり、少し改正しただけの問題が多い
- ディープラーニング用語の意味を直接聞く問題は少なく、その用語が持つ特徴を深堀りしてくる問題が多い
- 問題文が長く解説調のため、うろ覚えであっても、理屈を考えれば正しい答えにたどり着ける問題が多い
- 合格点を公式が公表しているわけではないが、合格者の声を聞くと、6割程度取れていれば合格できる模様(つまり捨てる分野を作るのもあり)
- 統計的には下3分の1に入らなければ合格できる
- 数学と機械学習については年々減少傾向にあるよう
- 公式例題からの出題が多いが、こちらも年々減少傾向にあるようだ
- 2019年8月は5割程度の問題が公式例題からの出題だが、2020年2月は例題からの出題が3割程度に減少

### 分野別詳細
- **数学**

- 基礎統計
    - ガウス分布・二項分布・ベルヌーイ分布

        それぞれの公式と期待値、分散あたりが出題。そこまで難しいことは聞かれないと思う（多分出題者が知らない）

    - ベイズ

        出題されず

    - 最尤法

        出題されず

- KL情報量

    数式を覚えておけば解けるレベルの問題が出題

- 特異値分解

    簡単な固有値問題しか出題されなかったが、年によっては出題されているらしい

- ラグランジュの未定乗数法

    出題されず

このあたりの基本ができていれば、問題ない

応用問題はきっと出題されない

**機械学習**

- 評価指標

    ACC、混合行列、ROC曲線など

- 非線形変換関数

    シグモイド関数については必ず出題される

- Lnノルム

    L1、L2ノルムについてかなり出題された

- SVM

    あまりイメージはないが軽く出題されてるはず

- 一般的なAIの知識

    過学習とはなにかなど

    我々にとっては常識か？

**深層学習**

- 深層学習のアルゴリズムについて
    - 誤差逆伝播

        pythonでの実装(axisの向きレベルまで詳細)や計算グラフでの計算が出題

    - 最適化手法

        Adamの数式が出題(理論が簡単なため数式の暗記よりも、理論理解の方が勉強効率が良い)

        バッチノーマライゼーションなど出題されなかったものもあるが、AIブームの火付け役(ブレイクスルー)については出題されやすい傾向にある

    - 目的別アルゴリズム
        - 時系列

            LSTMよりもGRUについて詳しく聞かれる問題が出題

        - 自然言語処理

            Attentionについて詳しく聞かれる問題が出題

        - 画像処理

            R-CNN,Fast R-CNN,Faster R-CNNの違いなど、物体検知については必ず出題

        - 生成モデル

            VAE,GANと言った基本的なものだけでなく、DCGANなどの派生まで出題されている

        - 強化学習

            このアルゴリズムは方策ベースか価値関数ベースか？といったアルゴリズムはもちろん、そのアルゴリズムの特性を聞く問題が出題

            また、Q学習についてはDQNの特徴などが出題

    - 有名モデル

        VGG16などの過去の有名モデルについての各特徴を問う問題が出題

- 最新アルゴリズムについて

    公式例題の改定以外については、捨て問


## 2.2 合格までの道のり

- 講座（AVILEN）修了に費やした時間：90時間程度

    授業時間：60時間(対面36時間,オンライン24時間)

    課題時間：25時間

    修了テスト時間：5時間

- 講座修了後、試験勉強に費やした時間：30時間程度

    復習動画：18時間

    講座で用意された対策問題集：8時間

    JDLAが出している公式例題：4時間

- 振り返り
    - 授業時間が長いため、その時間に理論をしっかり理解することを推奨する
    - 課題がめんどくさすぎて、放置気味になってしまった
    - 講座で用意された問題集で勉強していたが、そちらの勉強を減らし、JDLAが出している公式例題を多めにやったほうが良かったと感じている(なぜなら公式例題からたくさん出題されるから)

## 2.3 おすすめ勉強方法

- JDLA公式例題を何周もする
- 講座で提供された問題集はそこまで躍起になってやらなくてよい
- 数式や手法の暗記は、なぜそのようにするのか？というストーリー仕立てで理解をすると暗記しやすい
- courseraで開講されている、スタンフォード大学のAndrew Ng先生の機械学習講座を見るとより数式の理解が深まる
- 特に未知のゾーン(私の場合は生成モデル、強化学習)が来たときにはモチベーションが全然保てなかったので、冗談抜きでモチベーションを上げる秘策を準備しておいたほうが良い
- 私はとくに本とかは買っておらず、講座の資料だけで勉強した

# 3. まとめ
２０２０年６月開催は新型ウイルスの影響で中止されてしまったため、勉強のモチベーションが下がっていると思うので、その人達に是非勉強のモチベーションを上げていただきたく、応援の意味を込めてこの記事を書いた。
本格四足歩行ロボットを作ろう 0.完成までの手順

## はじめに
私は四脚ロボの開発を初めて2年目になります。
ボストン・ダイナミクスが四足歩行ロボットブームの火付け役となり、ここ数年でまたたく間に世界各国で四足歩行ロボット開発が発展してきました。

今日、中国や韓国などボストン・ダイナミクスと肩を並べるレベルまで開発が進んできています。
日本も福島原発事故を受け、東◯が四足歩行ロボットを開発しましたが非常に動作が遅く、正直、諸外国と比較対象にもならないです…。

日本の四足歩行ロボット技術が向上してほしいと思い、この記事を書きます。
ロボット開発歴は浅く、未熟な点は多いと思いますがご容赦ください。

## 開発手順
ざっと考えて、最低限以下のプロセスが考えられますが想定しないトラブルにより変更があるかもしれません。

0.　完成までの手順

### ハードウェア編
１．ロボット仕様を考える
２．アクチュエータの設計
３．ロボットの設計
４．アクチュエータの製作
５．アクチュエータの性能評価
６．ロボットの製作

###　ソフトウェア編
１．ロボットのURDFを書く
２．ロボットをRviz上で歩行させる
３．Gazeboの仮想環境でロボットを歩かせよう
４．ROSでハードウェアを制御
５．歩行させる！！


## 開発環境
CPU：Intel Corei7-1065G6 
GPU：Nvidia Geforce GTX1650 with Max-Q
OS：windows10(ハード開発)、Ubuntu18.04(ソフト開発)
CAD：SolidWorks2019
【第2回_もくもく会_超初心者】Vue.jsを学習する_公式サイト参照

本日も隔週水曜に実施される「もくもく会」でした！
今日はvue.js実装の経験がある人も一緒にもくもくしてくれました ヾ(*´∀｀*)ﾉｷｬｯｷｬ

# 公式サイトから学習する
公式サイトにいくと、「[Vue Masteryで無料の動画コースを見る](https://www.vuemastery.com/courses/intro-to-vue-js/vue-instance/)」という無料で学べるようなので、ここからやってみる。

## (1)動画を進める
### chromeの拡張機能"Vue.js devtools"をインストール
[Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd/reviews?hl=ja&authuser=2)をインストール
そして....すぐに学習を続けられなくなった.....|ω·`)

## (2)index.htmlが読み込まれず調査を開始する
index.htmlのファイルをいじっても何も変わらなかった。
どうやらHelloWorld.vueのtemplateから読み込まれていると知った。

#### とりあえずVSCodeの拡張機能"Vue VSCode Extension Pack"をインストール
[Vue VSCode Extension Pack](https://marketplace.visualstudio.com/items?itemName=sdras.vue-vscode-extensionpack)をインストール

#### とりあえずsassを使えるようにする

```
npm install sass-loader node-sass --save-dev
```


調べるのが止まって、救いを求めることにしました。

# 経験者に助けを求める(涙)
index.htmlの中身が、App.vueの中身を読んでる事がわかったけど、どういう作りなのでしょう。と、経験者に聞くことにしました。

## 構成について気にし始める
先輩「CLIを使っているんですね？ 」と言われて、私は「はっ」としました。
使っていますけれど、どういうものか分かっていない.....

各々が部分テンプレートみたいにして作成してるんだよ。という事を言っていただいて、今後はそこらへんを深堀りしていきたいと思いますが、そもそも作りについてとか、実装しているものについてを振り返りたいと考えました。


### Vue CLI では何をしているのでしょう？
> vue.jsアプリ向けのCLIベースの開発ツール

ということでした。[参照したページ：[Vue.jsの開発体験を次の次元へ CLIが苦手でも使える「Vue CLI」のすすめ](https://logmi.jp/tech/articles/302348)]
この、コマンドを入力するだけでVue.jsの環境やプロジェクトのテンプレートファイルが一式で揃えられる「vue-cli」を"どうやら便利らしい"という理由で、私はインストールしています。

## 生成されたファイルの構成について考える
### どう紐づいているのだろうか
最初に`create vue`した時に、連動していたのは"index.html","components/HelloWold.vue","App.vue"あたりを最初にいじると練習が出来そうだとは認識をしました。
<img width="250"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20742/789a8aec-708a-284d-4a41-327b42278aa6.png">

以下の14行目にある`<div id="app"></div>`は削除すると画面にエラーは出なくても何も表示されなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20742/dffae873-9b77-196f-fd54-d0c7000aa859.png)

#### App.vueから読み込んでいる
importしているのは9行目の記述と教わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20742/b7a1ef02-f47a-b625-a677-61f2fa9b6bf8.png)

#### 動画でやりたかった事を実践してみる
13行目から17行目の実践をしたかったのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20742/94d6b94b-8b6a-5247-4f78-f6d96af58e29.png)

動画では、以下のコードでした。

```vue.js
var app = new Vue({
  el: '#app',
  data: {
    product: 'Socks'
  }
})
```

実装するのが、chromeのconsoleだったから、この記述になっていたようです。
難しいですね。

とりあえず、Socksというもじに変更しました。
あとは画像が欲しかったので、「V」マークは残しておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20742/aeee5f5f-33b7-6bbb-fed4-0b2276d51155.png)

今日はここまでにしました。
引き続き、頑張ります.....
Elixirをキメると気持ちがいい

Rubyistはしばしば `Rubyをキメると気持ちがいい`という言葉を使います。
私もRubyが好きなのですが同じか、近頃はElixirをキメるともっと気持ちがいいと感じます。
マイナーな、仕事も少ない言語なのになぜか？
ポエムです。ですが自分がこんなに素晴らしい言語を触っているという事実を認めたかったこと、そして知らない人がElixirに興味を持つきっかけとなったら嬉しいのでまとめます。

## Why Elixir?
僕が思うElixirの好きなところは以下の通り。
多分もっとあるはずですからこれが好き！みたいなのがあれば教えてほしいです :pray: 

1. `|>`で処理を繋げられるのが気持ちいい
2. 再帰を書きやすいのが気持ちいい
4. ASTを書けるのが気持ちいい
5. 新雪を踏む感触が気持ちいい

です。
順番に書きますねぇ？


### `|>`で処理を繋げられるのが気持ちいい
プログラミングElixirには「プログラミングは値をどんどん変換して行くことだ」と書かれていました。
プログラマとして働く中でプログラミングとはなにか？という問いに一つの答えを与えてくれた一文で私にとっては一つの転換点となった言葉です。
Elixirでは与えられた値を `|>`を用いて別の値に変換していきます。
ちょっと例を見てみましょう。

```elixir
def count_each_word_size(str) do
  str
  |> String.split(" ")
  |> Enum.map(fn (word) -> 
    length(word)
  end)
end
```

↑の例では引数 `str`を `|>`の右側に書かれている関数に渡して値を変換していきます。
次の行の `|>`では上の行の戻り値が(第一)引数として与えられます。
`|>`があることでデータが段々と変わるさまを簡単に表現できます。
一切変数を使うことなく引数を期待する値に変換したときの気持ちよさは他の言語では味わえない快感なのでまだの人は是非キメていただきたい。


### 再帰を書きやすいのが気持ちいい
「ループは人の技、再帰は神の技」という言葉を聞いたことがあります。
Elixirにもfor文もありますが私はほとんど使うことはありません。なぜなら再帰を書きたいからです。
どこにでもある再帰の書き方としては以下のような感じかな？

```ruby
def sum(list)
  return 0 if list.empty?

  head = list.first
  tail = list.drop(1)
  head + sum(tail)
end
# 実用性は...ないです。
```

再帰のお約束は関数の最初の方に終了条件を書くこと。これがないと無限ループしちゃう。
その後に実際にやりたい処理を書く。
他の言語ではどうしても一個の関数に終了条件と期待する処理を書くことになる。
ただしElixirだとこれをきれいに解決できる。
上のコードならこんな感じになる。

```elixir
def sum([]) do
 0
end

def sum([head|tail]) do
  head + sum(tail)
end
```
↑のような書き方ができる。
他の言語に慣れていると気持ち悪いと思うかもしれませんね。でも大丈夫。すぐに良さに気づきますから。
ご覧の通りElixirでは同じ名前の関数を引数違いで複数実装できます。
例の場合は引数が空配列の場合と値がある場合で書いてます。
さらに配列は `[head|tail]`と書くことで `head`に配列の先頭が、 `tail`に先頭以外の値が勝手に代入(Elixir的には束縛という)されます。なので複雑になりがちな再帰関数を完結に記述できるんですねぇ。
再帰をキメるとそれはもう気持ちいいことこのうえないですよ！


## ASTを直接書けるのが気持ちいい
AST、抽象構文木ですね。
多くのプログラミング言語では `eval`という関数が存在すると思います。文字列を評価してくれる関数ですね。
Elixirの場合はこのEvalが解釈する部分をElixirで実装することができます。
これができると何ができるか？ということですが、オレオレif文とかオレオレfor文とか書けたりします。

重要なのは `quote`（評価する部分）と `unquote`（意図的に評価しない部分）です。
Elixirスクールから[オレオレunless](https://elixirschool.com/ja/lessons/advanced/metaprogramming/)を実装した素晴らしい例をお借りします

```elixir
defmacro unless(expr, do: block) do
  quote do
    if !unquote(expr), do: unquote(block)
  end
end
```

基本的には `quote do ~ end`の中に書きますが後で処理したいところだけは `unquote`しておきます。
こうすることで `unless`に渡された `do ~ end`部分はunlessが評価された後に実行されます。
ただのevalではこの芸当はなかなか難しいはずです。
このマクロ機能は他の言語のマクロとは一線を画しLISPより受け継がれてきた古の秘技をキメられます。

## 新雪を踏む感触が気持ちいい
Elixirは比較的新し目の言語で2012年から歴史に登場します。
言語の洗練さに対して歴史は浅く(Go言語などと比べれば)かゆいところに手が届くと言えるほどエコシステムは整っていません。
逆説的に言えば、プログラマが新雪を踏める多くの機会があるということでもあります。
誰にも触れられていないそれを自分たちで踏みしめ切り開く感覚はすでに多くが開拓された他の言語ではなかなか味わいにくいところがあると思います。
ここで一つElixirに飛び込んでコントリビュートしてみるのも楽しいかもしれません。

--- 
## おきもち
以前Elixirのドキュメントの修正で小さいPRを投げたことがあるのですが、joseさん(Elixirの作者)はすぐにマージしてくれたりとコミュニティはとても開かれていると思います。

決して情報が多い言語ではありませんが、Phoenix(RubyでいうRails的なWebフレームワーク)やmix(RubyのRakeとbundlerの合体版みたいなCLI)など本当に必要なところはしっかり固められています。
またErlangVMで動くためErlangの資産へのアクセスも可能でGoやRubyほどなんでも揃うことは無いですが何もない言語ではありません。

これからの発展のためになにかできることがあればなぁと思いつつElixirを書いて楽しんでます。
異なったDocker ComposeのAPIクライアントとサーバのネットワークをDocker Networkを使って接続する方法


# はじめに

APIクライアントとAPIサーバを別Docker Composeで管理している場合、両者をDocker Networkでつなげる方法を記載します。

# 環境

* MacOS Version 10.15.5
* docker desktop Version 2.2.0.0 (42247)
* docker-compose version 1.25.2, build 698e2846

# 設定例

## APIサーバ側のDocker Compose yaml

```yaml
version: '3'
services:
  api:
    container_name: my-api-server
    build:
      context: ./
      dockerfile: ./Dockerfile
    ports:
      - "5000:5000"
    env_file:
      - ./.env
    environment:
      - DB_HOST=db
    depends_on:
      - db
    networks:
      - db-net
      - api-net 

  db:
    image: mysql:5.7.22
    container_name: my-api-mysql
    command: mysqld --character-set-server=utf8mb4
    volumes:
      - ./db/init:/docker-entrypoint-initdb.d
      - ./db/mysql/conf.d:/etc/mysql/conf.d
    restart: always
    hostname: db
    environment:
      - MYSQL_ROOT_PASSWORD=mysql
      - MYSQL_DATABASE=mydb
    networks:
      - db-net

networks:
  db-net:  # APIサーバ<=>MySQL間用ネットワーク
  api-net: # クライアント<=>APIサーバ間用ネットワーク
```

上記Docker Composeを立ち上げてAPIサーバ側のDockerネットワーク名を確認します。

```
$ cd my-api-server
$ docker-compose up -d
$ docker network ls
NETWORK ID          NAME                                    DRIVER              SCOPE
7f07cc870f0a        bridge                                  bridge              local
22b2cc052945        host                                    host                local
77efc533d609        my-project_api-net                      bridge              local
5d75d3a0f46c        my-project_db-net                       bridge              local
```

## APIクライアント側のDocker Compose yaml

クライアント側では下記のようにAPI側で設定したDocker Networkを`default:`, `external:`, `name:`で指定します。

```yml
version: '3'
services:
  bff:
    container_name: my-client-app
    build: .
    ports:
      - "3000:3000"
    env_file:
      - ./.env

networks:
  default:
    external:
      name: my-project_api-net # 確認したAPI側のDockerネットワーク名を指定
```

## 接続

クライアント側コンテナ内からAPIサーバを叩くとき、API側で`container_name`に指定した名前をドメインにすることでアクセスすることができます。

```
$ cd my-client-app
$ docker-compose up -d
$ docker exec -it my-client-app /bin/bash
$ curl http://my-api-server:5000/path
```

# 参考

* https://docs.docker.com/compose/networking/
* https://qiita.com/kai_kou/items/d568fe94ee92f837e274
G検定とE検定

# G検定2020#2合格記->E検定2021#1に向けて
## G検定
### G検定2020#2勉強したこと
よく言われている白本と黒本を使って~~勉強した.~~
勉強時間は6時間程度(総計)という勉強時間で合格した.参考にしてほしくないためにいうが,勉強時間がここまで少なかったのは学生のためオンライン授業の課題で時間が削られ勉強できなかった.だが,大学の授業とゼミで機械学習と人工知能に関して学んでいたため合格できたと考える.しかし、実際の試験ではAIや機械学習のおおまかな構造について聞かれるため,大学で学んだ深すぎる知識のみでは太刀打ちできなかったと思う。具体的に次回のG検定を受ける人に向けてアドバイスを書こうと思う.
### G検定受験者向けアドバイス

#### 参考書(実際に買った本)
- [白本][1](深層学習教科書ディープラーニングG検定(ジェネラリスト) 公式テキスト)
- [黒本][2](徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集)
#### 参考書(実際には買ってないが買えばよかった本)
- [AI白書][3]:多分最新の知見や法令などに関してはこの本から出ていると考えられる.厚すぎて読む気にはならないからおおまかにされえればいいと思う.買わなかった理由は高いから

**本を買う場合は絶対に電子書籍(特にPDF版)が良い**

- 理由は電子版だと試験中にど忘れした部分を検索(Ctrl+f)をかけれるからである.
- 実物の本だと場所を取るのと,重いから嫌い(個人の思想ｗ)

多分,初学者(AI)だと白本を3周しっかり読み理解できるようになって,黒本を2周程度解けば合格できると思う.
G検定の問題は白本から5割,黒本から1割程度である.残り4割は最新知見や**法令**(意外と点数を稼げる)である.

### 試験中の注意

- 戻るボタン(Alt+←)を押さない →あとで見直す問題にフラグを立てることができるが戻るとすべてのフラグが消えるため
- Googleで検索するが,絶対あってるものを20問作るより,多分あっているものを50問作ったほうがいい→検索する優先順位をつけろ
- 絶対に解けないような問題がでる→マイナーすぎてググっても出ない
- できる限り早く解く→おおまかに説いてからググると良い

### 2020#2G検定に関して

- 法務系の問題が多く出たように感じた
- 自分は半分くらいわからなかった
- 数学系の問題はほぼ出ない
- 後半はAIの話が多かった

### 総括
G検定を受験して浅い知識だがAI,人工知能に関して体系立てて学べたのは良かった.特に,白本はしっかり体系立てられて書いてあったので人工知能や機械学習を学びたい人にはおすすめな本!!黒本より本番でた問題は難しかった気がする.

## E検定(今回話したかったのはこっち)
実は,学生向けではあるがE検定が安く受験できる.
E検定の受験資格は過去2年以内に認定講座の受講修了している必要がある.
今回2020#2のE検定が中止とされたため,修了資格が2年半に延長された.でかつ,2020/8/28までに修了した人は次回のE検定を半額で受講できる.
学生だと認定講座の一つにラビットチャレンジ(StudyAI)がやっているものがあり,受講料が無料である.(社会人は10万円とか普通にする)
E検定は通常,学生だと22,000円のため半額の11,000円のみで資格取得できる可能性があるのは強いと考える.社会人だと資格取得費用が13万前後になることを考えると暇な学生はとりあえずラビットチャレンジのみを8/28までに修了させておいてから受験するかどうかを考えるのはありな気がする.

余談だが自分は2021#1のE検定を受験しようと思う.

[1]:https://www.amazon.co.jp/dp/4798157554/
[2]:https://book.impress.co.jp/books/1118101076
[3]:https://www.amazon.co.jp/dp/4049110342/
油絵風のフィルターをTouchDesignerで使う



TouchDesignerでシェーダを使ってみたかったので、自分のアウトプット用に理解できたところを書こうと思います。
違うところがあればご指摘いただけると嬉しいです、、


###こちらの記事を参考にしました
https://baba-s.hatenablog.com/entry/2018/08/21/170000




#完成したもの
![movieout.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561474/537b5be7-9958-a61f-8175-3bf521e5d38f.gif)



#プログラム
	vec2 texelsize = vec2(1.0 / resolution.x,1.0 / resolution.y); 

	float n = (_Radius+1) * (_Radius+1);

	vec3 m0 = vec3(.0),m1 = vec3(.0),m2 = vec3(.0),m3 = vec3(.0),
		 s0 = vec3(.0),s1 = vec3(.0),s2 = vec3(.0),s3 = vec3(.0);

	//左下
	for(int i=-_Radius;i<=0;++i){
		for(int j=-_Radius;j<=0;++j){
			vec3 col = texture(sTD2DInputs[0],uv + vec2(j,i)*texelsize).rgb;
			m0 += col;
			s0 += col * col;
		}
	}

	//左上
	for(int i=-_Radius;i<=0;++i){
		for(int j=0;j<=_Radius;++j){
			vec3 col = texture(sTD2DInputs[0],uv + vec2(j,i)*texelsize).rgb;
			m1 += col;
			s1 += col * col;
		}
	}


	//右上
	for(int i=0;i<=_Radius;++i){
		for(int j=0;j<=_Radius;++j){
			vec3 col = texture(sTD2DInputs[0],uv + vec2(j,i)*texelsize).rgb;
			m2 += col;
			s2 += col * col;
		}
	}

	//右下
	for(int i=0;i<=_Radius;++i){
		for(int j=-_Radius;j<=0;++j){
			vec3 col = texture(sTD2DInputs[0],uv + vec2(j,i)*texelsize).rgb;
			m3 += col;
			s3 += col * col;
		}
	}

	float sigma_min2 = 1e+2f;
	m0 /= n;
	s0 = abs(s0 / n - m0 * m0);

	float sigma_2 = s0.r + s0.g + s0.b;
	if(sigma_2 < sigma_min2){
		sigma_min2 = sigma_2;
		color = vec4(m0,1.);
	}

	m1 /= n;
	s1 = abs(s1 / n - m1 * m1);
	sigma_2 = s1.r + s1.g + s1.b;
	if(sigma_2 < sigma_min2){
		sigma_min2 = sigma_2;
		color = vec4(m1,1.);
	}

	m2 /= n;
	s2 = abs(s2 / n - m2 * m2);
	sigma_2 = s2.r + s2.g + s2.b;
	if(sigma_2 < sigma_min2){
		sigma_min2 = sigma_2;
		color = vec4(m2,1.);
	}

	m3 /= n;
	s3 = abs(s3 / n - m3 * m3);
	sigma_2 = s3.r + s3.g + s3.b;
	if(sigma_2 < sigma_min2){
		sigma_min2 = sigma_2;
		color = vec4(m3,1.);
	}


	fragColor = TDOutputSwizzle(color);




油絵風のフィルターを実装するために、「kuwahara filter」という空間フィルタリング処理を行いました。

#kuwabara filterとは
下記の記事が参考になりました
https://qiita.com/Cartelet/items/5c1c012c132be3aa9608

簡単に手順を説明すると  
######①各画素毎の周辺を４つの領域に分ける
######②それぞれの領域で分散を求める
######③４つの領域の中で最も小さい分散の領域を求める
######④その領域の平均値を中心の色に適用する


といった感じですかね、、
上記の手順をそのまま順番に適用させていけば出来たので、他の空間フィルタリングも試してみようと思います！！
Raspberry PiでMinecraftプログラミングやろうとした

# 環境

* [Raspbian Stretch](https://www.raspberrypi.org/downloads/raspbian/)
* [Minecraft Pi Edition v0.1.1](https://www.minecraft.net/en-us/edition/pi/)
* [Python3(IDLE)](https://docs.python.org/ja/3/library/idle.html)
* [Scratch2MCPI](http://scratch2mcpi.github.io/)
* [Scratch 1.4](https://scratch.mit.edu/)

# トラブルシュート

## 現象

Minecraft-piは起動されず、何も起こらない。試しに、minecraft-piコマンドを手動実行すると、次のエラーが表示された。

```
error while loading shared libraries: libGLESv2.so: cannot open shared object file: No such file or directory
```

## 原因と対策

次のサイトの記事を参考に、Raspberry Piのファームウェアをアップデートすることで解消した。
※参考：[Games that uses libGLESv2.so doen't work in raspbian stretch](https://www.raspberrypi.org/forums/viewtopic.php?t=191857)

```
sudo rpi-update
```
Spacemacsでファイル履歴の列幅を伸ばす

Helmのバッファ履歴一覧 ( `Space b b`)は、ファイル名の幅が短いのでScalaなどで長いファイル名をつけていると `...`で隠れてしまう。

ウィンドウ的には全体の幅に余裕があるので、ファイル名の列幅を伸ばしたい。

`.spacemacs`の `user-config()`で `helm-buffer-max-length`を設定したらいけた :tada: 

```emacs-lisp:.spacemacs
(defun dotspacemacs/user-config ()

  ;; SPC b bで表示されるファイル名の列幅を伸ばす
  (setq helm-buffer-max-length 60)

)
```

cf. https://github.com/emacs-helm/helm/issues/514#issuecomment-418015625 ("How to adjust helm-mini filename column width?")
overflowプロパティ【残54日】

overflowプロパティについて覚えたので備忘録

値は主に４つ
1. [visible] ボックスからはみ出した要素がそのまま表示される、初期値
2. [hidden] ボックスからはみ出した要素は表示されない
3. [scroll] ボックスからはみ出した要素は表示されないがスクロールすることで表示される
4. [auto] はみ出した要素の処理がブラウザに依存する、基本的にはスクロールすることで表示される

補足として
1. overflow-x: scroll;
x軸（横方向）にのみスクロールさせる
2. overflow-y: scroll;
y軸（縦方向）にのみスクロールさせる

文字列が横に長いが折り返しさせたくない　＋　項目がボックス内に収まらない
上記のような場合に使用検討できる
【ポートフォリオを作成する方へ】chartkickの使い方

chartkickはとても簡単にグラフを作ることができるライブラリです
<img width="621" alt="スクリーンショット 2020-07-20 21.54.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/c4ec6632-4890-31cc-12c7-d2d92184e3ca.png">

##環境
Ruby 2.5.3
Ruby on Rails 5.2.4
chartkick 3.3.1

##手順
#####1.インストール
``` ruby:Gemfile
 gem "chartkick"
```
```
 $ bundle install
```
#####2.javascript読み込み

```app/javascripts/application.js
//= require chartkick
//= require Chart.bundle
```
準備完了です。
一度サーバー落としてrails sやり直した方がいいかもしれません。
###オプション
ID,幅,高さ

```
<%= line_chart data, id: "users-chart", width: "800px", height: "500px" %>
```

軸のタイトル

```
<%= line_chart data, xtitle: "Time", ytitle: "Population" %>
```

これらを組み合わせるとこのような感じになります。

<img width="643" alt="スクリーンショット 2020-07-20 21.51.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/7c788d1d-5eb7-981f-9206-5c1f31051ace.png">

managemantに売上(result),売上日(result_date)を用意し、

```app/controllers/managemants_controller.rb
def index
    @managemants = Managemant.all
  end
```
```app/models/managemant.rb
# chartkick用データ
  def self.chart_date
    order(result_date: :asc).pluck('result_date', 'result').to_h
  end
```
```app/views/managemants/index.html.erb
<%= column_chart @managemants.chart_date, xtitle: "日付", ytitle: "売上(円)", width: "600px", height: "200px" %>
```

ビューのcolumn_chartの部分を変えるだけで色々なグラフに変えることができます。
・折れ線グラフ-line_chart
<img width="621" alt="スクリーンショット 2020-07-20 21.54.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/c4ec6632-4890-31cc-12c7-d2d92184e3ca.png">

・円グラフ-pie_chart
<img width="542" alt="スクリーンショット 2020-07-20 22.26.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/837ab122-9559-fd7b-8470-721af9e59fd4.png">
・棒グラフ-pie_chart
<img width="630" alt="スクリーンショット 2020-07-20 22.26.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/fa0ba9b1-f97d-9d18-fb26-31c7246f99db.png">

・面グラフ-area_chart
<img width="604" alt="スクリーンショット 2020-07-20 22.26.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/1bd6673d-0bd9-3054-31c6-e1879b0ced3b.png">

簡単にきれいなグラフが作れるのでぜひ試してみてください。

##参考
https://chartkick.com/
Ubuntu 18 -> 20 upgrade時に消えたGnome上のアイコンを復元させる

![2b911aea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177/2da2a7b1-7eb2-648c-f7b4-b07daa2ac52b.png)

Ubuntu 18から20へのupgrade時に自分が遭遇した不具合。
gnome-shell-extension-desktop-iconsをインストールすれば解決する。

```sh
sudo apt install gnome-shell-extension-desktop-icons
```

Alt+F2 rでGnomeはリロードが可能。

## references

[18.04 - Ubuntu 20.04 desktop files and icons missing - Ask Ubuntu](https://askubuntu.com/questions/1231994/ubuntu-20-04-desktop-files-and-icons-missing)
Magenta の Drums RNN を使用してドラムトラックを自動生成する

Google が研究の一貫で開始した Magenta の Drums RNN を使用して、機械学習の結果からドラムトラックを自動生成させます。学習済みのモデルも公開されていることから、python 環境があれば比較的簡単に実行することができます。

# Magenta と Drums RNN
## Magenta とは
* アートや音楽を生成するプロセスにおける機械学習の役割を調査する
* Google Brain チームの一部の研究者とエンジニアが開始した
* GitHub は[こちら](https://github.com/magenta/magenta)

という、プロジェクトです。

## Drums RNN とは
* Magenta の一部
* LTSM を使用して ドラムトラックを Midiデータとして生成してくれる
* 学習済みのモデルもある

という、モデルです。

# 前提
Name      | Version
----------|------------------------
Mac       | Catalina(10.15.6)
Python    | 3.6.10 :: Anaconda, Inc.


# セットアップ
## 1. Magenta セットアップ
Python のインストールからやる方法もありますが、自分の場合すでに Python が入っていたので、 `Manual Install` しました。 `pip install magenta` したら終われるかと思いきや、以下エラーに遭遇したので、一個ずつ潰して行きました。

### エラーと対応方法
環境がすでにある程度出来上がっていたため、必要なライブラリのバージョンが合わないというエラーが出ました。

```
ERROR: tensorflow 1.15.0 has requirement gast==0.2.2, but you'll have gast 0.3.3 which is incompatible.
ERROR: google-api-core 1.21.0 has requirement protobuf>=3.12.0, but you'll have protobuf 3.11.3 which is incompatible.
ERROR: tensor2tensor 1.15.7 has requirement tensorflow-probability==0.7.0, but you'll have tensorflow-probability 0.10.1 which is incompatible.
ERROR: apache-beam 2.22.0 has requirement dill<0.3.2,>=0.3.1.1, but you'll have dill 0.3.2 which is incompatible.
ERROR: apache-beam 2.22.0 has requirement oauth2client<4,>=2.0.1, but you'll have oauth2client 4.1.3 which is incompatible.
```

ここは、愚直に合致するバージョンをインストールしていきました。以下はサンプル。

```
pip install tensorflow-probability==0.7.0
```

## 2. Magenta のリポジトリをクローン
```
git clone https://github.com/magenta/magenta.git
```

## 3. 学習済みのモデルをダウンロード
以下リンクからポチッとします。
<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/2d8a7fac-be82-ee92-9781-cfeb80e3e6a4.gif"/>

## 4. Drums RNN の実行
1. python コードがあるディレクトリ（ /magenta/magenta/models/drums_rnn ）に移動
2. 実行（オプションは色々ありますが、READEME に詳細があるのでここでは割愛）

```
python drums_rnn_generate.py --config='one_drum' --bundle_file='~/Downloads/drum_kit_rnn.mag' --output_dir=/tmp/drums_rnn/generated --num_outputs=10 --num_steps=128 --primer_drums="[(36,)]"
```
3. ↑ /tmp/drums_rnn/generated に midi データが生成されているはずなので、移動して確認
自働化とは

TPSでの**自働化**は単なる自動化とは違います。
動が人辺が付ているからです。
**人間の知恵を機械に与える**という意味です。
例えば、
１．デプロイメントパイプラインのコミットステージにおいて、コミットステージが妥当な時間内で完了する。このために、コミットステージは5分以内で終わることが理想で10分以上は異常であるとし、予め決められた時間以上かかる場合は、コミットステージを失敗させる。
２．分析ツールを使用して、コードそのものの保守性・セキュリティ上の脆弱性をしらべ、各メトリクスに対して事前に定められた閾値に達していなかった場合、コミットステージを失敗させる。
のような**デプロイメントパイプラインの設計は、この自働化を実施している**と評価できます。

上記のような**ルールは最初の内は厳格にすることで、開発の躾ができます。**
最初は厳しく緩めようとするかもしれませんが、コードを正しく書く（自工程完結を狙う）ように強制力を発揮します。
この様なデプロイメントパイプラインの設計は進化（洗練化）させることを前提とします。チームの力量が上がって切ることによって、デプロイメントパイプラインのメトリックするルールも進化（洗練化）させていきます。
外部から決めるのではなく、開発チームメンバーが話し合って進めて行くことが望ましいです。
Dockerでubuntuイメージを取得してきてコンテナ起動する

https://hub.docker.com/_/ubuntu を起動する時のコマンドメモ。
ふとlinuxコマンドを動かしたくなった時にさっと使えるようにメモです。

イメージの取得

```
docker pull ubuntu
```

コンテナをバックグラウンドで起動

```bash
docker run --name <container_name> -it -d <image_name> /bin/bash
```
```bash
# 例
docker run --name ubuntu -it -d ubuntu /bin/bash
```

シェルに入る

```bash
docker exec -it <container_name> /bin/bash
```
```bash
# 例
docker exec -it ubuntu /bin/bash
```


## おまけ

### コンテナ名をつけ忘れたり間違えてしまったら

`docker rename` でコンテナ名を変更できる。

```bash
docker rename <current_name> <new_name>
```

### manを使いたい
シェル内からman読もうと思ったらミニマムな構成とのことでそのままだと使えなかった(コンテナってこういうものだよね…)

```bash
root@10b70c6ce5aa:/# man mount
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, including manpages, you can run the 'unminimize'
command. You will still need to ensure the 'man-db' package is installed.
```
`unminimize` 叩いてみた

```
root@10b70c6ce5aa:/# unminimize
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
<snip>
```
2回くらい[y/n]聞かれるので `Y` 押す

リトライ

```bash
root@10b70c6ce5aa:/# man mount
bash: /usr/bin/man: No such file or directory
```
そもそもいなかった(コンテナってこういうものd)

更新＆インストール(いつもの)

```bash
root@10b70c6ce5aa:/# apt update
root@10b70c6ce5aa:/# apt install -y man
```

パッケージ一覧確認

```bash
root@10b70c6ce5aa:/# dpkg -l | grep man
<snip>
ii  man-db                  2.9.1-1                 amd64        tools for reading manual pages
<snip>
```
`man-db` が増えた

```bash
root@10b70c6ce5aa:/# man mount
```
今度はman見れるようになりました！
scaffoldについて(Ruby on Rails)

# プログラミングの勉強日記
2020年7月22日　Progate Lv.213
Ruby on RailsⅧ
Progateではscaffoldを扱わないが、学校の授業で勉強したので自分でも調べてみた。

# scaffoldとは
　scaffoldは「スキャフォールド」と読みRuby on Railsのコードを自動生成する便利なものの1つである。Railsアプリケーションの開発をする際にはモデル、コントローラ、ビュー、ルーティングを作成する必要がある。この作業をまとめて行う機能がscaffoldである。なので、scaffoldを使うことでRailsのアプリを早く作ることができる。

# 使い方

```terminal
$ rails generate scaffold モデル名

$ rails generate scaffold モデル名 カラム名:データ型
```

このコマンドによって以下のファイルが生成される。

1.マイグレーションファイル、モデル（データベースのテーブルやカラムを変更できるファイル）
db/migrate/YYYYMMDDHHMMSS_create_モデル名.rb
app/model/モデル名.rb

2.ビュー（コントローラで定義されたアクションに対応するビューファイル）
app/views/モデル名/index.html.erb
app/views/モデル名/edit.html.erb
app/views/モデル名/show.html.erb
app/views/モデル名/new.html.erb
app/views/モデル名/_form.html.erb

3.コントローラとルーティング
test/controllers/モデル名_controller_test.rb
　このファイルの中に`index,show,new,edit,create,update,destroy`のアクションが自動的に定義されている。
config/routes.rb
　ルーティングの設定ファイルの中で`resources :モデル名`と追加される。

4.その他
app/helpers/モデル名_helper.rb
test/helpers/モデル名_helper_test.rb
app/views/モデル名/index.json.jbuilder
app/views/モデル名/show.json.jbuilder
app/assets/javascripts/モデル名.js.coffee
app/assets/stylesheets/モデル名.css.scss
app/assets/stylesheets/scaffolds.css.scss

# scaffoldで作成したファイルの削除
　scaffoldを用いて作成したファイルはコマンドで削除することができる。


```terminal
 scaffolsで作成したファイルをすべて削除
$ rails destroy モデル名

Modelに関するファイルのみ削除
$ rails destroy model モデル名

コントローラのみ削除
$ rails destroy controller モデル名

ビューのみ削除
$ rails destroy view モデル名
```
phpにおけるオブジェクト指向まとめ

#はじめに
この記事はphpにおけるオブジェクト指向を簡単にまとめたものです。
オブジェクト指向ってなんぞや？
phpで開発を行っているがメソッドとかクラスとはよう分らんって人向けの記事で、新卒2年目のペーペーエンジニアが書いています。

#そもそもオブジェクト指向って？

>オブジェクト指向とは、コンピュータプログラムの設計や実装についての考え方の一つで、互いに密接に関連するデータと手続き（処理手順）をオブジェクト（object）と呼ばれる一つのまとまりとして定義し、様々なオブジェクトを組み合わせて関連性や相互作用を記述していくことによりシステム全体を構築していく手法。

上記説明で分からない場合は、
「各処理を分割、共通化し管理する。そして複数の処理を組み合わせてシステムを構築しよう」
と考えてください。たぶん合ってます。たぶん。。

念のため上記をphpで説明するとこんな感じ。

まずはオブジェクト指向ではない書き方。

```
<?php

class Controller_Tanaka
{
  public function action_name()
  {
    echo 'Tanaka';
  }
  public function action_occupation()
  {
    ecjp 'teacher':
  }
  public function action_walk()
  {
  }
  public function action_eat()
  {
  }

<?php

class Controller_Yamada
{
  public function action_name()
  {
    echo 'Yamada';
  }
  public function action_occupation()
  {
    ecjp 'president':
  }
  public function action_walk()
  {
  }
  public function action_eat()
  {
  }

```
うむ。
class_Tanakaとclass_Yamadaでおんなじ様なメソッドが複数存在していますね。
これを書き直すとこう。

```
<?php

class Controller_Human
{ 

 public $name;
 public $occupation;

  public function action_name($name)
  {
    $human = new Human();
    $human->name = $name
    echo $human->name;
  }
  public function action_occupation($occupation)
  {
    $human = new Human();
    $human->occupation = $occupation
    echo $human->occupation;
  }
  public function action_walk()
  {
  }
  public function action_eat()
  {
  }
```

人間の行動（メソッド）、特徴（プロパティ）を共通化、分割し取り扱っています。
多分これがオブジェクト指向。間違っていたらご指摘ください。。

#以下用語解説

##Class
大雑把に言うと「関数（メソッド）と変数（プロパティ）の塊」です。
「プログラムの処理をまとめた設計図」だと考えれば分かりやすいかも知れません。
上記の例だともちろんこれ。

```
class Controller_Human
{ }
```

##メソッド
メソッドとはクラスが持っている処理のことです。上述の例ですとこいつらですね。

```
public function action_name($name)
  {
    $human = new Human();
    $human->name = $name
    echo $human->name;
  }
  public function action_occupation($occupation)
  {
    $human = new Human();
    $human->occupation = $occupation
    echo $human->occupation;
  }
  public function action_walk()
  {
  }
  public function action_eat()
  {
  }
```

##プロパティ
クラスが持っているデータのことです。
上記の例だとこいつら。

```
 public $name;
 public $occupation;
```

ちなみに、メソッドと関数、プロパティと変数は基本的には同じものと考えてよいです。
呼び方が違いますが同じ働きをします。
ほんとややこしい子。。

##アクセス修飾子
メソッドとプロパティの前についている**public**。
こいつはどこからそのメソッドやプロパティにアクセスできるかを指定するもの。

```
public     クラス内、クラス外のどこからでもアクセス可能
private    同じクラス内からのみアクセス可能
protected  同じクラス、及び子クラスからアクセス可能
```
とりあえず全部publicで書いてました気を付けます。。

##カプセル化
オブジェクトが持つデータや処理のうち、別のオブジェクトから直接利用される必要のないものを隠すことを言い、利用する場合は外部から操作するために作られた処理を設けることを言う。

##継承
特定のクラスを他のクラスに引き継いで、同じメソッドを使えるようにしちゃいましょう、的なやつです。
例えば上記で作成したClass_Humanも他のクラスに継承することで同じメソッドが使えるようになります。

##おわりに
とりあえず30分で調べた知識を書き殴りました。
間違っている部分等あればご一報ください。
修正するかは分かりません。
疲れたマン。
180日でWeb開発者になるための備忘録（HTMLのHeadについて）2/180

#はじめに
こちらは
[180日でWeb開発者になる方法(コンピューターサイエンスの学位なしで)](https://qiita.com/baby-degu/items/a06bddd1a61b7d907a55)
を参考にSESエンジニアがWeb開発できるまでの備忘録です。
夏ですね。私は夏休み3日しか与えられないですがまあ頑張っていきます。
今回は[Head](https://developer.mozilla.org/ja/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML)についてより知ることができたらと思います。
ソースは基本[atom](https://atom.io/)で書いています。

#何を学べたか？
- h1タグとtitleの違い
- 文字コードの設定（UTF-8とかありましたね）
- 作成者の記載を組み込む（SEOとかこれが該当していると知れました）
- ウェブページのソースを見ること（mata name以外にもリンク等大量にソースがあって参考になりました。）
- atomのブックマーク登録方法(ctrl+ALT+F2)とブックマーク表示(ctrl+F2)
【Android】またversionCodeインクリメントし忘れた！【Play Store】

# 背景
**ぼく**「Google Play Consoleにapkファイルアップロードしたぞー！（versionCode: 3）」
**ぼく**「あっ！修正しわすれてる！修正して、と。」
**ぼく**「expoのビルドだとBuild queue消化まで長いんだよな・・・また数十分待ちだよ」
**ぼく**「やっとビルドできた！アップロードだ！（versionCode: 3）

**GooglePlayConsole**「既にversionCode:3はライブラリにアップロードされて・・・」

**ぼく**「ま、また数十分待たされるのー！？」

# Tips
それ、**アーティファクト ライブラリ**から削除できます！![artifact-lib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/be686b0e-42ea-7ab9-477a-294fe50840cf.png)

1. リリース管理 > アーティファクトライブラリ
2. 対象のバージョンコードのゴミ箱ボタン > 押下 => 削除！
leadingAnchor/trailingAnchorとleftAnchor/rightAnchorの違いと使い分け

コードベースで書いていて少し気になりました。知っている人も多いと思いますが、僕は知らなかったので書いておきます。

##結論
どっちでも良いことが多く、そこまで神経質にならなくていい。

##はじめに
Anchor：錨。Swiftでは、**端っこ**という認識で大丈夫です。
constraintについては、以下では**制約**と言います

##本題

leadingAnchorのlead：**先頭**
trailingAnchorのtrailing：**末端**

察しのいい人ならわかるかもしれません。

####フォーム（LabelやTextField）をつくる場合

英語は左から右に読むので、
leading：**先頭**は **左** 　trailing：**末端**は **右**
ということになります。

逆に、右から左に読むヘブライ語は、
leading：**先頭**は **右** 　trailing：**末端**は **左**
ということになります。


##Appleの公式の見解

**基本的には、leftAnchor/trailingAnchorを使うべし。**

絶対的な左と右の指定がない限りは、**leading/trailing** を使うべきだそうです。
例えば、右から左に進んでいくアプリを作るときなどに、ボタンがどうしても左に必要な場合は、leftAnchor/rightAnchor の制約を使うようにしましょう。


**2020 7/26　追記**
英語圏の方のソースコードを拝見したところ、絶対に固定しなければならないケースでは無いのに**leftAnchor/rightAnchorのほうが使われている**場合もありました。
神経質になる必要もないのかもしれません。

##終わりに
コードベースで書いていたときに気になったので、調べて忘れないようにアウトプットしておきました。間違いや気になる点がありましたら、コメントにておねがいします！