OmniAICreator/Qiita-1.07M huggingface dataset:
Temenos Base Camp について



## 目次
はじめに
Visualizer に関する情報の記載場所
まとめ


## はじめに
Temenos Base Camp
https://basecamp.temenos.com/s/

今回は Temenos Base Camp について記載したいと思います。
Temenos Base Camp とは、Quantum Visualizer (Kony Visualizer) (以下、Visualizer と称する) を提供する Temenos 社が運営しているコミュニティサイトです。
このコミュニティサイトでは Temenos 社で提供している製品についてのフォーラムや新機能についての記事、製品についてのドキュメント等があります。
このサイトにはもちろん Visalizer についてのフォーラムやドキュメントも存在します。
この記事では、それらの Visualizer に関する情報の記載場所やよく使用するドキュメントの場所について記載します。
ちなみに、この記事は Visualizer 初心者向けです。


## Visualizer に関する情報の記載場所
まず、Temenos Base Camp (https://basecamp.temenos.com/s/) にアクセスします。
Visualizer に関する情報は以下の赤い線で囲んだところにあります。

![Basecamp TOPページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/03068ecf-e785-c05f-9018-1c443be644b1.png)

上記の赤線で囲んだ部分を押すと Visualizer の情報があるページへと飛びます。

![BaseCamp Visualizerページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/cd18f212-0fa0-4297-9336-cdc159a87dbd.png)


このページが基本的に使用する部分になると思います。

上記画像の赤い線で囲った部分がコンテンツとなります。
各コンテンツについては以下の通りです。

■Forums
Q&Aや Visualizer の新しい機能や更新情報についての記事があります。

■Getting Started
Visualizer 入門としてモバイルアプリや Web アプリ、フロントエンド開発、バックエンドサービス管理などについての入口となるような記事があります。

■Tutorials
Visualizer の機能に関してチュートリアルの各種記事があります。

■Documentation
Visualizer に関する各種ドキュメントがあります。

■What's new
Visualizer に関する最新情報が記載されています。

上記以外にも、検索窓から探したい情報を入力して検索することもできます。
ただ、見ての通りサイトは英語で記載されているので検索する場合も英語(英単語)で入力した方が情報が見つかりやすいと思います。


よく使うドキュメント
上記から探し出せない以下のドキュメントをよく使用するのでリンクを貼っておきます。
検索だと以下のように過去バージョンのドキュメントについても簡単に探せます。

■API Developers' Guide
V9
https://docs.kony.com/konylibrary/visualizer/viz_api_dev_guide/Default.htm

V8.4
https://docs.kony.com/8_x_PDFs/visualizer/viz_api_dev_guide.pdf
(こちらは PDF ファイルです)


## まとめ
今回はBase Camp について記載しました。
Base Camp にも色々な情報がありますので色々と見てみてください。
Elixirでuseされた時に全ての関数を移譲するというパワー系コードを書いてみました。

## 発端
RubyやRailsの使い慣れたEnumerableをElixirでも利用できるようにしようと思ったのが始まりです。 ※ 現在実装中

https://github.com/tashirosota/ex-rubenum

要件として、ElixirのEnum挙動を担保したかった為、全てのmoduleのfunctionsをそっくりそのままコピーする必要がありました。

## 実装
Elixirのメタプログラミングである `quote` や `unquote` を用います。

https://elixir-lang.org/getting-started/meta/quote-and-unquote.html

```elixir
defmodule AllFunctionsDelegator do
  def delegate!(mod) do
    enum_funs =
      mod.module_info()[:exports]
      |> Enum.filter(fn {fun, _} -> fun not in [:__info__, :module_info] end)

    for {fun, arity} <- enum_funs do
      quote do
        defdelegate unquote(fun)(unquote_splicing(make_args(arity))), to: unquote(mod)
      end
    end
  end

  def make_args(0), do: []

  def make_args(n) do
    Enum.map(1..n, fn n -> {String.to_atom("arg#{n}"), [], Elixir} end)
  end
end
```

参考: https://elixirforum.com/t/batch-delegate-functions-to-a-module/25046
## 使用例

```elixir
defmodule EnumFunctionsDelegator do
  defmacro __using__(_opts) do
    AllFunctionsDelegator.delegate!(Enum)
  end
end

defmodule ExtendedEnum do
  use EnumFunctionsDelegator
  def customized_map(enumerable, func) do
    map(enumerable, func) ++ [:customized]
  end
end
# 拡張がちゃんと行えている
iex(1)> [1, 2]                         
[1, 2]
iex(2)> |> ExtendedEnum.customized_map(&(&1*2))  
[2, 4, :customized]
# Enumの機能も担保している
iex(3)> [1, 2] 
[1, 2]
iex(4)> |> ExtendedEnum.map(&(&1*2))  
[2, 4]
```

## 終わりに
> 既存実装の挙動を担保したい

この要件は実務やLibrary制作でちょいちょい発生しそうです。
ちょっとゴリッとしたい時にとても便利そうです。
インスタンス変数の簡略化メモ


●インスタンス変数
3段活用
以下、全て出力結果は同じになる

```rb:①基本の書き方
class Test
  # セッター
  def name=(name)
    @name = name
  end

  # ゲッター
  def name
    @name
  end
end

```

```rb:②セッターとゲッターをそれぞれ簡略化

class Test
  # セッター
  attr_writer :name
  # ゲッター
  attr_reader :name
end

```

```rb:③全て簡略化

class Test
  attr_accessor :name
end

```
Raspi OSにopencv-pythonインストールできなかった件

## 動作環境
【環境】
・HW: RasberryPi 4
・OS: 2021-10-30-raspios-bullseye-armhf-full　イメージ
・Python バージョン 3.9.2

:::note info
ls /dev/video0
でカメラが認識されているのを確認しておいてください。
:::

## コマンド実行してみる
```某メーカサイトの手順
sudo apt-get install python-opencv
```
・・・Unable ですね。（この時はコマンドが違う事に気が付かず）

## いろいろ先生で調べてみる
・ビルドしてみたーーー＞どうもpythonとの紐づけができない模様。
・急ぎだったので、今一度opencv-pythonについて調べた
→piwheels のサイトでダウンロードするといいらしい。

## ●piwheels でopencv-pythonの適用可能なものを見つける
https://www.piwheels.org/project/opencv-python/#install

:::note warn
一覧をみると対応するpythonのバージョンが書かれていますが、
必ずしも動作しない事がある様です。
:::

・私は結局4.5.36のpython3.9版を選びました。
 -どうも3.9でもどちらのHow to install this versionを選んでも見た目同じっぽいですが、
　Installのウインドウを見ます。

```4.5.3.36
sudo apt install libaom0 libatk-bridge2.0-0 libatk1.0-0 libatlas3-base libatspi2.0-0 libavcodec58 libavformat58 libavutil56 libbluray2 libcairo-gobject2 libcairo2 libchromaprint1 libcodec2-0.9 libdatrie1 libdav1d4 libdrm2 libepoxy0 libgdk-pixbuf-2.0-0 libgfortran5 libgme0 libgraphite2-3 libgsm1 libgtk-3-0 libharfbuzz0b libilmbase25 libmp3lame0 libmpg123-0 libnorm1 libogg0 libopenexr25 libopenjp2-7 libopenmpt0 libopus0 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpgm-5.3-0 libpixman-1-0 librabbitmq4 librsvg2-2 libshine3 libsnappy1v5 libsodium23 libsoxr0 libspeex1 libsrt1.4-gnutls libssh-gcrypt-4 libswresample3 libswscale5 libthai0 libtheora0 libtwolame0 libudfread0 libva-drm2 libva-x11-2 libva2 libvdpau1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpx6 libwavpack1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwebpmux3 libx264-160 libx265-192 libxcb-render0 libxcb-shm0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxi6 libxinerama1 libxkbcommon0 libxrandr2 libxrender1 libxvidcore4 libzmq5 libzvbi0 ocl-icd-libopencl1

sudo pip3 install opencv-python==4.5.3.56
```
他のバージョンでは表示が微妙に変わるので、その辺りは実際のサイトで確認してください。


## 動作確認
```
python3
(略)
>>import cv2
ImportError:numpy.core.multiarray failed to import


```
エラーが出ない方もいるかもしれませんが、私の環境ではエラーが出ました。
ここを力業？で既存numpy1.19.5を上書き

```
pip3 install -U numpy
```

すると要件は満たしているけど、1.22.0をインストールするよみたいな表示が出て、インストールしました。

###　細かいエラーの修正等
当方の環境では import cv2をあらためて実行したところ、PATHが通ってないと怒られたので、
下記の通り、.bashrc　を編集しました。

```bashrc

# 最後の行に以下のパスを追加
PATH="$PATH":/home/pi/.local/bin
```

##無事動作
今度は無事に動作しました。

```
$ python
Python 3.9.2 (default, Mar 12 2021, 04:06:34) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.5.3'
>>> 
```
AtCoder Beginner Contest 015をやった(Java)

AtCoder Beginner Contest 015をやった。
C問題は追記予定です。
できるか正直自信がないところです。

##[A](https://atcoder.jp/contests/abc015/tasks/abc015_1)
問題文記述の**必ず違う数字**というところに注意

```Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        String A = scan.nextLine();
        String B = scan.nextLine();
        if(B.length() < A.length()){
            System.out.println(A);
        } else {
            System.out.println(B);
        }
    }
}
```

##[B](https://atcoder.jp/contests/abc015/tasks/abc015_2)
入力値で0は計算から除外して考えるらしい。

```Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int zeroCount = 0;
        double[] A = new double[N];
        for(int i = 0; i < N; i++){
            A[i] += scan.nextInt();
            if(A[i] == 0){
                zeroCount++;    
            }
        }
        
        double sum = 0;
        for(int i = 0; i < N; i++){
            sum += A[i];
        }
        sum = sum / (N - zeroCount);
        System.out.println((int) Math.ceil(sum));
    }
}
```

いつかC問題もJavaで解きたいな(n回目)。
Blenderで隣り合う面に異なる色を割当（四色問題）

## 隣り合う面に異なる色を割当

実用性は不明ですが、Blenderで面を色で区別する方法を紹介します。

平面で行う場合、四色問題と言われますが、この記事では順番に割り当てるだけなので、厳密に四色問題を解いてはいません。また、平面ではないので五色まで使うことにします。

## 完成図

スザンヌを例にして実行した画面です。オブジェクトはメッシュであれば何でも良いです。見た感じ四色までしか使ってませんね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/d14d4bfa-7771-58cd-4dd5-2d449f825ba1.jpeg" width="300">


## 手順

- 適当にオブジェクト（例：スザンヌ）を作成します。
- 編集モードに入ります。
- マテリアルのスロットを5つ用意します。
- 5つのマテリアルスロットに`Principled BSDF`を作成し、`Base Color`を変えます。
- 面ごとに隣り合う面と異なるように、色を若番から割り当てます。
- その色のマテリアルを面に設定します。
- オブジェクトモードに戻ります。

## Pythonプログラム

プログラムは下記です。オブジェクトを選択して、Scriptingワークスペースに貼り付けて実行してください。

```py
import bmesh
import bpy

colors = [
    (1, 0.1, 0.1, 1),
    (0.1, 0.2, 1, 1),
    (0.8, 0.8, 0, 1),
    (0, 0.8, 0.1, 1),
    (0.8, 0.2, 0, 1),
]

# スザンヌ作成
bpy.ops.mesh.primitive_monkey_add()
# 編集モード
bpy.ops.object.mode_set(mode="EDIT")
obj = bpy.context.edit_object
bm = bmesh.from_edit_mesh(obj.data)

# マテリアルのスロットを5つ用意
for _ in range(len(colors) - len(obj.material_slots)):
    bpy.ops.object.material_slot_add()

# 5つのマテリアルを作成
for i, color in enumerate(colors):
    material = f"M{i}"
    mat = bpy.data.materials.get(material) or bpy.data.materials.new(name=material)
    mat.use_nodes = True
    mat.node_tree.nodes["Principled BSDF"].inputs["Base Color"].default_value = color
    obj.active_material_index = i
    obj.active_material = mat

# 面ごとに隣り合う面と異なるように、色を若番から割当
n = len(bm.faces)
res = [0] * n
dj = [[] for _ in range(n)]  # 面ごとの禁止領域リスト
for edge in bm.edges:
    if len(edge.link_faces) == 2:
        i = edge.link_faces[0].index
        j = edge.link_faces[1].index
        dj[max(i, j)].append(min(i, j))
for i in range(n):
    res[i] = ({1, 2, 3, 4, 5} - {res[j] for j in dj[i]}).pop()

# 色のマテリアルを面に設定
for face, i in zip(bm.faces, res):
    if i:
        obj.active_material_index = i - 1
        bpy.ops.mesh.select_all(action="DESELECT")
        face.select = True
        bpy.ops.object.material_slot_assign()
bm.free()
# オブジェクトモード
bpy.ops.object.mode_set(mode="OBJECT")
```

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

以上
Vue.JSのカスタムdirectiveをIntelliJ(WebStorm)で補完が効くように

# 概要

Vue.JS のカスタム directive をプラグインとして IntelliJ で開発していると、補完が効かないし、利用部分で警告がでますよね。
これを解決する方法です。

下記のように警告がでる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/dfa355d4-1d2d-50e6-6c02-4364e9a00af3.png)



# 解決方法

## 1. package.json

package.json に下記追加

```json
  "web-types": "./web-types.json"
```

## 2. web-types.json

package.json と同じ階層に web-types.json 追加。

```json:web-types.json
{
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/v2-preview/web-types.json",
  "name": "プロジェクト名",
  "framework": "vue",
  "version": "1.0.0",
  "contributions": {
    "html": {
      "vue-directives": [
        {
          "name": "hoge"
        }
      ]
    }
  }
}
```

- `"name": "hoge"` のところで `v-hoge` というカスタム directive を登録しています。

これだけ！


# 参考

- [JetBrains/web-types](https://github.com/JetBrains/web-types)
- [web-types example](https://github.com/JetBrains/web-types/blob/3c4e824064b70445248356b1b27ac7083632a88c/v2-preview/vue%403.0.0.web-types.json#L635)
- [Vue3 directives registered through the plug-in method cannot be recognized](https://youtrack.jetbrains.com/issue/WEB-52800)
djangoでmigrateをしたらtableがないと言われた件


# 目的
djangoでmigrateを行い、models.pyの変更を反映させようとしていたが、```django.db.utils.OperationalError: table "テーブル名" already exists```と言われてエラーが出てしまったため、何とかしたい。

# 結論

マイグレーションを最初の状態に戻し、マイグレーションファイルも削除し、もう一度マイグレーションをし直すことで解決した。

# 実施環境
### ハードウェア環境
| 項目 | 情報 |
|:-:|:-:|
| OS  |macOS Catalina(10.15.7)   |
|ハードウェア   |  MacBook Air (11-inch, Early 2015) |
|プロセッサ   | 1.6 GHz デュアルコアIntel Core i5|
|メモリ   |  4 GB 1600 MHz DDR3 |
|グラフィックス   |  intel HD Graphics 6000 1536 MB |
### ソフトウェア環境
| 項目 | 情報 |
|:-:|:-:|
| homebrew  | 3.3.8 |
| mysql | Ver 8.0.27 for macos10.15 on x86_64 |
| python  | 3.8.12 |
| django  | 3.1.2 |
| anaconda  | 4.10.1 |
| pip  | 21.2.4 |



# 経緯
詳細は覚えていないが、Djangoプロジェクトのmodels.py周りを触っていると、

```
django.db.utils.OperationalError: table テーブル名 already exists
```
と表示された。

テーブルが被ってしまうのか、なら消してみよう。
と無心でmysqlログインしてテーブルを削除してみた。

```
drop table テーブル名;
```
そしてもう一度migrateしてみると

```
django.db.utils.ProgrammingError: (1146, "Table 'DB名.table名' doesn't exist")
```
と表示されてしまった。。

# 原因究明
どうやらエラーを見てみるとテーブルが存在していないと言われているようだ。
確かに手動で削除したからテーブルはないが、models.pyでそのテーブルも書いているから勝手に作ってくれるのではないのか。。。。？？？

**マイグレーションは前回との差を反映するためのもので、今回もモデルを一部変更しようとしたが、変更する前のものがないため、エラーとなっているようだ。**

# 解決
マイグレーションを最初の状態に戻し、マイグレーションファイルも削除し、もう一度マイグレーションをし直すことで解決した。

```python manage.py migrate --fake アプリ名 zero```で全てのマイグレーションを無効にすることができる。
showmigrationでmigrationが反映されていないか確認する。

```
$ python manage.py migrate --fake アプリ名 zero
$ python manage.py showmigrations
アプリ名
 [ ] 0001_initial
 [ ] 0002_auto_20211219_1625
 [ ] 0003_auto_20211223_1038
 [ ] 0004_auto_20211225_1224
```
[X]ではないため、マイグレーションが反映されていないことがわかる。

次に/migration/配下のmigrationファイルを削除する。
これでリセットが完了。

もう一度いつも通り

```
$ python manage.py makemigrations
$ python manage.py migrate
```
で無事、エラーが出なくなっていることが確認できる。


# 参考
[Djangoでmigrateしたのにテーブルが作成されない](https://chuna.tech/detail/45/)
数式の練習①一次ローパス・フィルタ

　数式の練習です。

#一次ローパス・フィルタ
|　　　　　　　　　 一次ローパス・フィルタ　回路図　　　　　　　 |
|:------------:|
|<img width="250" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/9e95eea9-9e03-d491-5482-f53eea232060.png">|
|　　**伝達関数**　　　|
|　　　　　$T(s)=\frac{1}{1+sT_{C1R1}}$　　　　|
|　$(  T_{C1R1}は時定数。  s はラプラス変数。  jω はsとする ) $|
|　　　　　**TeXの記述**　　　|
|　　　　　``$T(s)=\frac{1}{1+sT_{C1R1}}$``　　　　|


###matlab

```matlab
numerator = 1;
C1=0.0001;
R1=1000;
denominator = [C1*R1,1];
sys = tf(numerator,denominator)

h = bodeplot(sys);
p = getoptions(h);
p.FreqUnits = 'Hz';
setoptions(h,p)
grid on

stepplot(sys);
h = nyquistplot(sys);
```
　実行例です。

![2022-01-04 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/732532f4-552d-1c57-6371-5e052a2ae863.png)

![2022-01-04 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/8e132c48-4ad4-551e-e3bb-749b0765f073.png)


###LTspice

<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0c32f3b8-640b-cb9e-50ba-5785297d5840.png">











####環境
matlab　R2021b update1（ホームライセンス）、tr関数はControl System Toolboxが必要。ラプラス関数のSymbolic Math Toolboxはホームライセンスでは購入できない。
OpensCADのアニメーション化する備忘録

OpensCadのアニメーション化
しばらくしないと忘れるので簡単な備忘録しておきます。


##変更点
　動かしたいものに*$tを付け加える

サンプルプログラム　今回は直方体が９０度回転するプログラム
![cap260.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51752/ca139465-3bff-ef3b-962e-77e5b7b62d5e.jpeg)

##手順
１．viewをクリックしAnimateをクリックする
![cap258.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51752/af819a80-21ce-6040-2136-9ff306857ce4.jpeg)

右下にTime、FPS、Stepsが表示される
![cap259.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51752/5c4b8660-51c2-d7b3-d40f-615100140ffb.jpeg)

２．Animate設定
FPSとStepsの設定を行う
FPSとStepsの値を小さくすると速い動きとなり
大きくすると遅くなる
※Timeは自動計算される

入力後動き出す
tensorflow_cloudを動かそうとしてgoogle cloudの権限にはまったので自己メモ

# 対処
<!-- 発端や概要を記載 -->
serviceAccountに次のコマンドでroleを設定
※[ ]鍵カッコ内は自分の環境に合わせて打ち換えてください。

```
# for windows command prompt

gcloud projects add-iam-policy-binding ^
[Your project ID] ^
--member="serviceAccount:[your service account]" ^
--role="roles/ml.serviceAgent"

gcloud projects add-iam-policy-binding ^
[Your project ID] ^
--member="serviceAccount:[your service account]" ^
--role="roles/cloudbuild.serviceAgent"
```

google cloud platform から Cloud Build API を検索して有効化
【React】propsとstateについて

## はじめに
　本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## propsとstateについて

### propsとは

propsとは親コンポーネントから子コンポーネントに渡すことができる属性値です。
具体的には以下のように使用します。

```.js
import React from 'react';

// 親コンポーネントであるApp.jsに以下のように記述
const App = () => {
  return <Greeting name="Taro"/>
}


// 子コンポーネントであるGreeting.jsに以下のように記述
const Greeting = (props) => {
  return <div>Hi!{props.name}</div>
}

export default App;

```

上記の例では、親コンポーネントであるAppにおいてGreetingを使用しています。
Appに記述されているGreetingに対して`name="Taro"`という値を設定し、設定した値を子コンポーネントであるGreetingにおいて`{props.name}`と記述することで受け取っています。
結果、画面上にはHi!Taroと表示されます。

propsの値は変更不可です。
値を変更する場合には親コンポーネントにstateを設定しsetStateで変更する必要があります。

### stateとは
stateとはコンポーネントの内部で状態を管理する変数です。
クラスコンポーネントでのみ利用可能でしたが、現在はuseStateを使うことで関数コンポーネントでも使用することができます。
以下は、クラスコンポーネントでの使用例です。
useStateの使用例は[【React】React Hooksについて](https://qiita.com/P-man_Brown/items/1b06fdaa59ff7eec3fa9)をご参照ください。

```.js
// 親コンポーネントであるCounter.jsに以下のように記述
class Counter extends React.Component {
  // stateの設定
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  // stateの値の変更
  handlePlusButton = () => {
    console.log('click')
    this.setState({count: this.state.count + 1});
  }

  render() {
    // propsの設定
    return <CounterBox count={this.state.count} counterPlus={() => this.handlePlusButton()}/>
  }
}

// 子コンポーネントであるCounterBox.jsに以下のように記述
const CounterBox = (props) => {
  return (
    <div>
      {/* propsの受け取り */}
      <div>counfsaast: { props.count }</div>
      <button onClick={()=> props.counterPlus()}>Click</button>
    </div>
  )
}

export default Counter;

```
値を変更したい場合には、上記の例のように親コンポーネントにおいてstateを設定し、setStateを用い値を変更する記述をし、変更した値をpropsとして子コンポーネントに受け渡せるように設定します。
その後、子コンポーネントでpropsを受け取ることで、値を変更した上で表示することができます。


## まとめ

- propsは親コンポーネントから子コンポーネントに渡すことができる属性値
- propsの値は変更不可。親コンポーネントにstateを設定する必要がある。
- stateはコンポーネントの内部で状態を管理する変数
- setStateを使用し、stateの値を変更する。
JavaScript　チートシート

## for...of

```javascript
const array1 = ['a', 'b', 'c'];

for (const element of array1) {
  console.log(element);
}
```

let を const の代わりに使用しても、ブロック内で変数が再割り当てされます。

```javascript
var arr = document.getElementsByTagName("input");
for (let elem of arr) {
    if (!elem.disabled)
        elem.value = ""
}
```

[for...of - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of)

## if...else

```js
if (condition)
   statement1
[else
   statement2]
```

JavaScript に elseif 構文はありませんので注意してください。 else と if の間に空白を置いて記述します。

```js
if (x > 50) {
  /* 何かを行う */
} else if (x > 5) {
  /* 何かを行う */
} else {
  /* 何かを行う */
}
```

[if...else - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else)

## 真偽

### 真

```js
if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
```

[Truthy (真値) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Truthy)

### 偽

```js
if (false)
if (null)
if (undefined)
if (0)
if (-0)
if (0n)
if (NaN)
if ("")
```

[Falsy (偽値) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Falsy)
【デザインの4原則】近接・整列・反復・対比

# 概要
Webデザインについて勉強していた際に、教材やWeb上の記事で「デザインの4原則」というテクニックが扱われていることが多く、この機会に理解を深めるためアウトプットしておく。

※各画像はAdobe XDで作成しました。

# 4つの基本原則
デザインを通して情報を伝える手段には以下の4つの基本原則が存在する。

* 近接
* 整列
* 反復
* 対比

## 近接
* 関係する情報と情報を近くに配置することで、直感的にそれらが同一グループの情報であることを伝えられる。
* 他のグループ間との距離を大きく取ることで情報同士の境界が明確になる。
* 大事なポイントは「`余白`」をうまく使うこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/eb4af01f-98fe-900a-9b2d-745448ef19f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/0d7df997-e45d-a1f0-aabc-4de9a961f590.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/69b83c1a-e05c-f91e-d7f7-6bceef6d8472.png)

## 整列
* 要素を揃えて配置し、レイアウトを整えることで情報の構成が理解しやすくなる。
* 左右の整列は「`左揃え`」「`中央揃え`」「`右揃え`」に分けられる。
* 上下の整列は「`上揃え`」「`中央揃え`」「`下揃え`」に分けられる。
* 必要に応じて`近接`と組み合わせる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/f4226d1b-a8b4-c0ef-ffe1-11969284a818.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/c19b3e54-5020-62c4-9bba-d4147b2f2a0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/b6862221-3338-eaef-76ec-9f3fd38c88ba.png)

## 反復
* ある特徴を繰り返し`一貫性`、`統一感`を持たせる。
* 統一感を持つことで、`グループ化`をさらに分かりやすくできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/f916f7de-9830-bd52-2374-96ae77e1bdbf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/19bf9d7c-b095-e7a7-e546-3efa9012b1d2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/276b7599-c7a4-8f91-392d-a3e7ea98fd73.png)


## 対比
* 情報の優先度を付けたい時や、異なる要素・情報であることを伝えられる。
* フォントの色や大きさなどに変化をつけることで優先度に差を付けることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/5f2f3a05-692f-f88a-d47a-a9b6fdbb6d9c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/7139ca0b-769a-67a0-8942-d0a9ce226f36.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/d17fe647-c8f0-069a-26c7-845cda074b78.png)
【Laravel】マイグレーション実行時エラー  SQLSTATE[HY000] [1045] Access denied〜

## はじめに
利用環境
PC：Applesilicon搭載 Mac
PHP：7.4.27
Laravel Framework：6.20.43


## エラー内容：SQLSTATE[HY000] [1045] Access denied for user〜〜

マイグレーションファイルを作成し、編集完了。

その後マイグレーションを実行するために下記を実施

```terminal:ターミナル
php artisan migrate
```

そうするとこのようなエラーが出ました。

```terminal:ターミナル
SQLSTATE[HY000] [1045] Access denied for user　〜個人の設定情報含むため割愛〜
```

MAMPからphpMyAdminにアクセスし、情報に相違がないか確認

phpMyAdminのサーバーが `8889` に対して、VScodeで起動しているファイルにある `.env` では `DB_PORT:3306` に設定されていた。

`DB_PORT:8889`に変更し、再度下記を実施


```terminal:ターミナル
php artisan migrate
>Migration table created successfully.
```

無事にマイグレーションの実行に成功しました。


## 終わりに
謝った記載や、修正情報または追加情報などがあればその都度ご指摘お願いいたします。
Ubuntu 20.04 LTS で NIC（ネットワークインターフェース）を2つ同時に使用する方法

# はじめに
今回は、Ubuntu で NIC（ネットワークインターフェースカード）を2枚使用する方法を紹介します。
Linux ではネットワークインターフェースを複数同時に使用する場合は割とハマりやすく、スタティックなネットワークの設定などはあったのですが、私の欲しかった単に Ubuntu で NIC を2枚同時に使用するのというのは他にやり方を紹介している良いサイトが少なかったので紹介します。

# 構成
今回の構成としては、NIC の IP アドレスがそれぞれ 192.168.0.3/24 と 10.11.2.6/24 であるとします。enp1s0 に 192.168.0.3、enp0s31f6 に 10.11.2.6 を割り当て、通常のアクセスでは 192.168.0.3 を使用したいが、10.11.2.6/24 のネットワーク間のアクセスでは 10.11.2.6 の IP アドレスを使用したいという設定です。
![nic-wlan2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1652242/e80524c8-d41b-bc37-622b-a13597e6d452.png)

# 現状の設定の確認
ネットワークルートテーブルを確認します。現状は enp1s0 のみに LAN ケーブルを挿している状況だとこんな感じです。

```sh
$ route -n
カーネルIP経路テーブル
受信先サイト     ゲートウェイ     ネットマスク     フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.0.254   0.0.0.0         UG    100    0        0 enp1s0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 enp1s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp1s0
```

# 設定方法
Ubuntu では /etc/netplan/ の yaml ファイルを編集します。

1. まずは、はじめに入っている yaml ファイルを適当なディレクトリにコピーしておいてください（不具合のときのバックアップ）。
2. Ubuntu では /etc/netplan の yaml ファイルは辞書順の名前の優先順位ですべて読み込むような仕様ですので、上記の yaml ファイルを削除して、以下のような yaml ファイルを作成します。yaml ファイルですので、インデントは tab は使用しないでスペースキーを使用してください。またデフォルトのものは一度削除していますので、私はデフォルトのものが 01-network-manager-all.yaml だったので、02-network-manager-all.yaml などの名前にしていますが、yaml ファイルの名前は適当で OK です。

```yaml:/etc/netplan/02-network-manager-all.yaml
network:
    ethernets:
        enp1s0:
            addresses:
            - 192.168.0.3/24
            gateway4: 192.168.0.254
        enp0s31f6:
            addresses:
            - 10.11.2.6/24
            nameservers: # アドレス解決できない場合は、お使いのネットワークにおいて適切な DNS サーバを指定してください。
                addresses: [8.8.8.8, 8.8.4.4]
    version: 2
   ```

最後にコマンド `$ sudo netplan apply` を実行し、何もエラーが発生しなければ設定完了です。

```sh
$ sudo netplan apply
$ route -n
カーネルIP経路テーブル
受信先サイト     ゲートウェイ     ネットマスク     フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.0.254   0.0.0.0         UG    0      0        0 enp1s0
10.11.2.0       0.0.0.0         255.255.255.0   U     0      0        0 enp0s31f6
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 enp1s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp1s0
```

# 参考文献

- [Netplanの使い方 - komeの備忘録](https://www.komee.org/entry/2018/06/12/181400)
- [Linux(Ubuntu) で複数NICを指している場合に、ネットワーク経路の優先度を指定する](https://pcvogel.sarakura.net/2021/01/15/32107)
- [2枚のNICに同じセグメントのIPを割り振ったら、片方しか使われなかった話](https://ameblo.jp/syuu0822-gm/entry-12255324444.html)
- [Ubuntu18.04 LTSでネットワークの設定方法](https://tyanogi.hatenablog.com/entry/2018/06/10/154525)
- [Ubuntu Server 18.04 LTSで複数のNIC(ネットワークカード)を使える様にする](http://sheepdogjam.cocolog-nifty.com/blog/2018/05/ubuntu-server-1.html)
- [【Linux】 NIC（インターフェース）が複数ある場合の設定方法](https://go-journey.club/archives/1134)

# 更新履歴
- May 16<sup>th</sup>, 2025
  Markdown の表示が崩れていたので対応（Qiita 側 Markdown パーサー仕様変更）
【Java文法】変数

こんにちは、コイキングです。

本記事では'変数'について、説明したいと思います。

***

# 1.変数とは?
![変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862601/6b26df30-4a95-f141-babd-d43fb7ebf895.png)


変数は値を入れるための、箱のような役割をするものと言えます。
Javaでは数字・文字のようなデータタイプを指定し、変数を宣言します。
こちらは実生活で物を片付ける際に　**同じ種類の物同士を箱に入れて整理する** と思ってもらうとオッケーだと思います。

# 2. 変数の宣言
変数を宣言する方法は以下のようです。

```
// [データタイプ] [変数名];
int var_int_1;
```

変数が宣言だけされている状態では変数に値が入っていないため、変数の値を出力するなどのコードを作成すると、コンパイルエラーが発生します。

# 3. 変数の初期化
変数を宣言だけした場合、変数がつかえないため、変数に値を入れる必要があります。
 **変数に値を入れる行為を'代入'と言い、'='(イコール)演算子を使って** 、変数に値を代入します。

**※ ← 右側から左側に値が入ります。** 
変数に値を代入する方法は以下のようです。

```
// [変数] = [値];
var_int_1 = 10;
```

変数の **'初期化'とは変数の宣言の後初めて値を変数に代入** する行為を言います。
上の例では"変数の宣言と初期化を別々にしたもの"です。
変数の初期化は宣言と同時に行う事ができます。
変数の宣言と同時に初期化をする方法は以下となります。

```
// [データタイプ] [変数名] = [値];
char var_char_1 = 'a';
```

# 4. 変数に値を代入の応用
## 1) 変数内の値を変更する。
変数は'変更する数'とも言えます。
変数内の値を変更する方法は"変数に再度値を代入することで"変数内の値を変更することができます。

```
System.out.println(var_int_1); // 10が出力されます。
var_int_1 = 20;
System.out.println(var_int_1); // 20が出力されます。
```
上記の例では格納された値が10の変数にまた20を代入することで、
変数に格納された値が20に変わり、変数の値を出力すると20が出力されます。

## 2) 変数に変数を代入する
上記の例では値を直接変数に代入しましたが、変数に変数を代入する事もできます。

```
// [変数] = [変数]  // 変数のデータタイプは一致する必要があります。
int var_int_2 = var_int_1;
System.out.println(var_int_2); // var_int_1値は現状20のため、20が出力されます。
```

## 3) 変数に戻り値があるメソッドを代入

まだ説明してないけど、Javaには数学の関数のような機能をするメソッドがあります。
メソッドを呼出す時、戻り値をリターンするメソッドの場合、
メソッドの戻り値を変数に代入する事ができます。

```
// [変数] = [メソッド()];
int var_int_3 = makeTwice(var_int_2);
System.out.println(var_int_3); //値を二倍にしてくれるmakeTwice()メソッドに値が20の変数var_int_2を渡したので, 40が出力されます。 

public static int makeTwice(int var) {
	return var * 2;
}
```

**※例示コード**
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_02_Variable.java﻿


※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/74?category=1068655
Ruby技術者認定試験Silverで実際に出題された内容(ほんの一部)

# 最初に

2020/6にRuby技術者認定試験 Silverを受けて、合格しました。
自分的には、めちゃくちゃ簡単だった記憶です。
問題は貰えないですが、出題された内容の中で印象的なのを少し覚えて、当時メモしました。
せっかくなので、そのメモを元に記事で残すことにしました。

今は2022年の年始ですが、2020年のRubyのアドベントカレンダーPart2がスカスカで、せっかくなので登録しておきます！！ どうせなら、この記事がちょっと目立つように！

# 実際に出題された内容

## Arrayのgrepメソッドの理解

### 問題

下記は、どのような出力がなされるか。

```ruby
a = ["foo", "foo", "bar", "foo", "baz"]

p a.count("foo")
p a.grep(/f/)
p a.grep(/f/).count
```

(実際は選択肢問題でしたけど、詳細は覚えてません。
確かなのはArrayのcountやgrepのメソッドの理解を問われるものでした。)

### 正解と雑感

正解は、

```ruby
a = ["foo", "foo", "bar", "foo", "baz"]

p a.count("foo") #=> 3
p a.grep(/f/) #=> ["foo", "foo", "foo"]
p a.grep(/f/).count #=> 3
```

`Array`の`grep`は、引数の条件に当てはまるもの全てを列挙する配列を返すメソッドでした。
しかし、試験を受けた当時、`grep`の理解が浅く、最初に条件に当てはまる要素を1つ返すメソッドと勘違いして間違えました。
ちなみに、引数ではなくブロックですが、最初に条件に当てはまる要素を1つ返す`Array`のメソッドは、`find`です。エイリアスで`detect`です。

ちなみに、`grep`の使い方として、`methods`メソッドと組み合わせて、メソッドを調べるときに便利です。
例えば、文字列クラスのインスタンスにはどんなeach系メソッドがあるんだろうって思ったときに、次のような感じでgrepと正規表現を組み合わせて調べられます。

```ruby
p ''.methods.grep(/each/).sort
#=> [:each_byte, :each_char, :each_codepoint, :each_grapheme_cluster, :each_line]
```

## Arrayのインスタンスメソッド

### 問題

出力が`[130, 70, 100]`となるように、
`__(1)__`に該当する選択肢のうちどのメソッドか。(複数選択)

```
a = [130, 50, 10, 70, 100]
a.__(1)__{|t| t < 70 }
p a #=> [130, 70, 100]
```

- reject
- reject!
- delete_if
- delete_if!
- slice
- slice!

### 正解と雑感

`reject!`と`delete_if`です。
これは、しっかり勉強してるところで、エイリアスなのもわかっているので、簡単でした。

条件に当てはまる破壊的メソッドを選ぶ問題。
なお、`delete_if`は破壊的メソッドで、`delete_if!`は存在しません。
`reject!`と`delete_if`がエイリアス。

## 文字列のsplitメソッドの挙動などの理解

### 問題

以下の出力は、どうなるか。

```
s = "str1\tstr2\tstr3"
p s.split
p s.split(//)
```

(全ての問題が選択式ですが、この問題も選択肢等の詳細は覚えてません)

### 正解と雑感

合格教本かRExあたりの練習問題でも出題されてたはずですが、
実際の試験問題はシンタックスハイライトが効いてなかったので、少し難しく感じました。

正解は、次の通り。

```ruby
s = "str1\tstr2\tstr3"
p s.split #=> ["str1", "str2", "str3"]
p s.split(//) #=> ["s", "t", "r", "1", "\t", "s", "t", "r", "2", "\t", "s", "t", "r", "3"]
```

Stringの`split`は、引数がなかったときに、改行や半角スペース・タブで区切ります。
実際の試験問題はシンタックスハイライトが効いてないので、特殊文字`\t`によるタブの存在が希薄。
希薄なタブの存在を見抜いた上で、`split`の引数なしが何で区切るかを把握しておく必要がありました。
区切りが`//`や`''`のときは、1文字ずつに区切られます。

## ？Aの意味

### 問題

次のコードは、何が出力されますか。

```
p ?A
```

- `"A"`
- `65`
- `?A`
- 例外が発生する。

### 答えと雑感

```ruby
p ?A #=> "A"
```


合格教本(RExでも)の練習問題と全く同じ問題で、知ってるか知らないかだけの知識問題です。
本番で見たときは｢サービス問題だ｣と思った記憶があります。
普通の業務コードには出てこないと思いますが、Rubyのゴルフのコードの知見がある方には常識的な問題です。

1文字の文字列は、`？`始まりの特殊なリテラルがあります。
`?A`は、`'A'`と同じ文字列です。

なお、Ruby技術者認定試験は未だ2.1ですが、
Rubyの文字列などの仕様が大幅に違ったさらに昔の1.8時代において`?A`は文字コード`65`を返していました。

# 最後に

当時のメモを読む限り、次のような問題もでたようです。

- 例外処理 rescue
- ファイルの指定(a, a+, w, w+, r, r+)

大半が練習問題ででるような問題で、Rubyのバージョンは2.1のままだし試験の問題も変わらなそうなので、合格教本やRExといった有名な問題を解けるように目標を設定してしっかり対策しておけば簡単に合格できる印象です。

以上です。読んでいただいて、ありがとうございました。
AWS データレイクハンズオン - Lab6 -

# 背景

データ分析を勉強する一環で、データレイクハンズオンに取り組む。
(そろそろ課金が大きくなってきたので、ひと段落したらシステムはばらす予定)

# ハンズオンに取り組む

## Lab6: サーバーレスでデータの ETL 処理

主に使用するサービス:

- Glue
- Athena

### Section1: Glue の ETL 処理

#### Step1: IAM ロールにポリシーを追加

#### Step2: Glue Crawler を使ったスキーマの自動生成

Lab4 実施済みのため、スキップ。

#### Step3: Glue で ETL ジョブ作成と実行

#### Step4: Glue クローラの作成と実行

#### Step5: Athena でクエリ比較

#### Step6: Glue ジョブで Parquet とパーティショニングを実行

#### Step7: Athena でクエリ比較

これで、一通りのハンズオンが終了したわけだが・・・。

- AWS はやたらお金がかかる (特に EC2, OpenSearch)
- 個人開発のデータ分析では、ちょっと過剰スペックな気がする
- とはいえ、大容量のデータを捌くには有用なサービス (要お金)
- ハンズオンだと、ポチポチしてたら終わってしまうので、きちんと自分で理解し、応用できるように学習が必要

今回の学びは以上かな。

### Section2: 後片付け

お金の流出をストップしたいので、さっさと環境を削除します。

結局、削除だけで 1時間ほどかかってしまった・・・。
M1 Mac環境にネイティブ版GNU Arm Embedded Toolchainをインストールする

# はじめに

xPack の Arm Embedded GCC (arm-none-eabi-gcc) にて Apple Silicon版が追加されたようです 👏

**xPack Arm Embedded GCC 10.3.1-2.3 released (2021/12/07)**
https://xpack.github.io/tags/arm-none-eabi-gcc/

# インストール

* 前提
 * homebrew がインストールされていること
 * npm がインストールされていること

* xpm インストール (参考:https://xpack.github.io/xpm/install/)

```shell-session
$ npm install --global xpm@latest
```

* arm-none-eabi-gcc インストール (参考:https://xpack.github.io/arm-none-eabi-gcc/install/)

```shell-session
$ xpm install --global @xpack-dev-tools/arm-none-eabi-gcc@latest --verbose
```

### 使い方

デフォルトで次の場所にインストールされています。

```shell-session
$ ~/Library/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/10.3.1-2.3.1/.content/bin/arm-none-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=/Users/mario/Library/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/10.3.1-2.3.1/.content/bin/arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/Users/mario/Library/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/10.3.1-2.3.1/.content/bin/../libexec/gcc/arm-none-eabi/10.3.1/lto-wrapper
Target: arm-none-eabi
Configured with: /Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/sources/gcc/configure --prefix=/Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/install/arm-none-eabi-gcc --infodir=/Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/install/arm-none-eabi-gcc/share/doc/info --mandir=/Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/install/arm-none-eabi-gcc/share/doc/man --htmldir=/Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/install/arm-none-eabi-gcc/share/doc/html --pdfdir=/Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/install/arm-none-eabi-gcc/share/doc/pdf --build=aarch64-apple-darwin20.6.0 --host=aarch64-apple-darwin20.6.0 --target=arm-none-eabi --with-pkgversion='xPack GNU Arm Embedded GCC arm64' --enable-languages=c,c++ --disable-mingw-wildcard --enable-plugins --enable-lto --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-newlib --with-headers=yes --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/Users/ilg/Work/arm-none-eabi-gcc-10.3.1-2.3/darwin-arm64/install/arm-none-eabi-gcc/arm-none-eabi --with-native-system-header-dir=/include --with-multilib-list=rmprofile --disable-build-format-warnings --with-system-zlib
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 10.3.1 20210824 (release) (xPack GNU Arm Embedded GCC arm64) 
```

PATH を通せばOK。

```shell-session
$ export PATH=~/Library/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/10.3.1-2.3.1/.content/bin:$PATH
```

# 参考

何か困ったときのサポートなどはこちら
https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack
[初心者向け]Nuxt.js NestJS Next.js早見表

めちゃくちゃ紛らしくないですか？この三つ。
なので備忘録も兼ねてざっくり早見表でまとめました。
もし間違いがあればご指摘していただけると幸いです。


|  |  st | xt  |
| --- | --- | --- |
| Ne | ① Node.jsのフレームワーク | ② Reactのフレームワーク |
| Nu | - | ③ Vue.jsのフレームワーク |


① NestJS (ネストジェイエス) 
https://nestjs.com/

[公式]
https://nestjs.com/

[Wiki]
404 not found



② Next.js (ネクストジェイエス)　

[公式]
https://nextjs.org/

[Wiki]
https://en.wikipedia.org/wiki/Next.js


③ Nuxt.js　(ナクストジェイエス)

[公式]
https://nuxtjs.org/

[Wiki]
https://en.wikipedia.org/wiki/Nuxt.js



※ちなみにNustでググるとパキスタンの国立科技大学(National University of Sciences Technology)がヒットしました。

これもまたエンジニアリングと近そうな名前で興味深いですね。

https://nust.edu.pk/
『エラトステネスの篩』の記述例（Scratch版）

[元記事](https://qiita.com/ytaki0801/items/40060bdad04edcd1bd3c)とは別にしました．趣旨は元記事と同じく『「[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)」だとこれだけ速く[素数](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)が求まる！』ですが，言語仕様・処理系によっては大きな制約があることから，他の言語との比較を避けるため，個別記事としている次第です．~~Scratchと比較する人がいるとも思えませんが．~~

# 実行環境および記述・実行例

[公式サイトで公開しているプロジェクトページ](https://scratch.mit.edu/projects/624164617)を御参照下さい．
<iframe width="560" height="315" src="https://www.youtube.com/embed/YSTPMK9GLWk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
最初に上限`x`を入力すると，処理終了後，変数`c`に1〜`x`までの素数の個数，変数`r`にその中の最大の素数が格納されます．なお，[Scratch 3.0](https://ja.scratch-wiki.info/wiki/Scratch_3.0)の配列（リスト）は[二十万まで](https://ja.scratch-wiki.info/wiki/%E3%83%AA%E3%82%B9%E3%83%88#Scratch_3.0.E3.81.AE.E3.82.B5.E3.82.A4.E3.82.BA.E5.88.B6.E9.99.90)であり，`x`に`200001`以上を入れても，`200001`以降のふるい処理は行われません．

# 備考

## 更新履歴
* 2022-01-06：実行例をYouTube動画に変更
* 2022-01-06：初版公開
法人税(国税)の納税証明書を電子で得るメモ

法人税(国税)および法人の地方税(法人住民税など), eTax および eLTax で電子申告と納付できるけど, 
納税証明書は電子で得られんの辛かった...
(領収書とか出ないため, 電子申告の控えなど自体は納税証明書としては使えない)

## 国税(法人税)

オンラインで納税証明書のリクエストして, 後日受け取りや郵送というのはあったが, 1~2 週間かかりめんどい...

2021 年 7 月から PDF で納税証明書得ることができました!

PDFファイルによる電子納税証明書の発行等について
https://www.nta.go.jp/taxes/nozei/denshi_nouzei/index.htm

## 地方税は?

たとえば東京都であれば法人事業税と法人都民税.
これは自治体によるのですかね... 
少なくともオンラインで交付申請して郵送はあるようですが, 国税のように PDF 発行はまだっぽい.

## その他(地方法人税)

地方法人税は, 名前がややこしいですが国税のほうになります.
また, 法人税も含め地方の主税局では国税のほうの納税証明書発行は対応していないので注意です!
(したがって法人の税の納税証明書を一式得るには, 税務署と地方の主税局と二か所から納税証明書取得が必要)
Rust製のシェルNushellを使ってみる

Macを新調したついでに`zsh`や`fish`とは違うシェルはないかと探していたところ、Rust製のシェル`nushell`を見つけたので試してみました。

- [Nushell](https://www.nushell.sh)  A new type of shell.

## インストール

`homebrew`でインストールできます。

```sh
brew install nushell
```

## 起動

`nu`コマンドで起動します。

```sh
nu

Welcome to Nushell 0.41.0 (type 'help' for more info)
> 
```

nushellはまだ開発中のため`tcsh`で標準shellにするのは[お勧めしない](https://www.nushell.sh/book/installation.html#setting-as-your-login-shell)とのことで、標準シェルにするのはやめておきます。

## 多くのunix系コマンドがnushell組込み

macOSで`ls`の結果を日付で昇順にソートしてわかりやすいサイズ表示にするには`ls -ltrh`オプションが必要です。しかしながら、nushellでこれを実行すると

```sh
> ls -ltrh

error: ls unexpected -ltrh
   ┌─ shell:15:7
   │
15 │ ls -ltrh
   │       ^ unexpected flag (try ls -h)
```

と表示されエラーになります。標準の`ls`じゃないの？と思って`which ls`すると、

```sh
> which ls

───┬─────┬──────────────────────────┬─────────
 # │ arg │           path           │ builtin 
───┼─────┼──────────────────────────┼─────────
 0 │ ls  │ Nushell built-in command │ true    
───┴─────┴──────────────────────────┴─────────
```

と表示されます。

そうです、nushellでは他のShellで標準的なコマンドが**組込みかつ独自仕様**となっています。

## ツール化されたコマンドライン引数

`ls -h`でヘルプを見ると

```sh
> ls -h
略
Flags:
  -h, --help: Display this help message
  -a, --all: Show hidden files
  -l, --long: List all available columns for each entry
  -s, --short-names: Only print the file names and not the path
  -d, --du: Display the apparent directory size in place of the directory metadata size
```

とオプションが５つしかありません。

`ls -ltrh`のようにソートするには、オプションではなく`sort-by`コマンドを使います。

```
> ls | sort-by modified

───┬───────────┬──────┬────────┬────────────────
 # │   name    │ type │  size  │    modified    
───┼───────────┼──────┼────────┼────────────────
 0 │ Music     │ Dir  │   96 B │ 2 days ago     
 1 │ Desktop   │ Dir  │   96 B │ 2 days ago     
 2 │ Public    │ Dir  │  128 B │ 2 days ago     
 3 │ Pictures  │ Dir  │  128 B │ 2 days ago     
 4 │ Movies    │ Dir  │  128 B │ 2 days ago     
 5 │ Library   │ Dir  │ 2.4 KB │ 3 hours ago    
 6 │ Downloads │ Dir  │  128 B │ 3 hours ago    
 7 │ mydev     │ Dir  │   64 B │ 23 minutes ago 
 8 │ Documents │ Dir  │  128 B │ 18 minutes ago 
───┴───────────┴──────┴────────┴────────────────
```

同じような結果が得られました。

## 型のついた出力結果

さらに出力結果を以下のように内容によって絞り込むことが可能です。

```
> ls | sort-by modified | where size > 1KB
───┬─────────┬──────┬────────┬────────────
 # │  name   │ type │  size  │  modified  
───┼─────────┼──────┼────────┼────────────
 0 │ Library │ Dir  │ 2.4 KB │ 3 hours ago
───┴─────────┴──────┴────────┴────────────
```

nushellはコマンド実行結果に[型がついて](https://www.nushell.sh/book/types_of_data.html#integers)いるため、このような処理が簡単に行えます。

通常のshellコマンドだと結果は全てテキストであり、結果を操作したい場合はawkなどでテキスト処理するしかありませんでしたが、nushellではこのようなことが行えます。

割愛しますがJSON、Toml、CSVなどの処理も簡単です。

## ローカルのlsを使うには

```
^ls
```

のように`^`をつければnushell組み込みだけでなくローカルのコマンドも使えます。

## その他

他にも以下のような機能が色々と用意されていて、[nushell book](https://www.nushell.sh/book/)にまとめられています。

- Pluginシステム
- CSVなどの構造化データを高速処理するための[Dataframe](https://www.nushell.sh/book/dataframes.html#benchmark-comparisons)

## まとめ

- 標準shell化は非推奨
- unix系コマンドは組み込みかつ独自仕様
- 結果に型がありawkなどでテキスト処理する必要がない

というわけで、常用するかというと微妙ですが何かの機会に使ってみようかと思います。
【Laravel】同じ部品だけど参照URLに応じてリダイレクト先を変えたい

#やりたかったこと
画面１と画面２に同じ機能（カウント＋１など）を持つ「ボタン」を置きたいけど、

 + 「URL１のボタン→URLa」
 +  「URL２のボタン→URLb」

にリダイレクトするようにしたい

#結論
ヘッダーの「referer」で解決しました

```buttonControler.php
public function button(Request $request){
    //ヘッダーのreferer(参照先)取得
    $referer = $request->headers->get('referer');

    if(strpos($referer, 'URL1')){
        return redirect()->route('URLa');
    }
    if(strpos($referer, 'URL2')){
        return redirect()->route('URLb');
    }
}
```

#経て
こんなことかと思うかもしれませんが、１時間弱うんぬん悩んでました。。。
もしもっといい方法等あればご指摘ください！
C++(Visual Studio)でUTF-8を扱うための試行錯誤のメモ

# 目的

Visual Studio(Windows)を使ってC++のコンソールアプリケーションを開発する際、

- ソースファイルの文字コード
- 出力するときの文字コード
- プログラム内で扱うデータの文字コード

全てを`UTF-8`で扱うための試行錯誤をまとめてみることにします。

2022/01/16 :
記事の公開当初は、`ISO C++ 20 標準 (/std:c++20)`(`u8string`)を使う予定でした。
しかし、検証した結果、`ISO C++ 20 標準 (/std:c++20)`は使わずに`ISO C++ 17 標準 (/std:c++17)`を使う事にしました。
なぜならば、`mbrtoc8`(`char -> char8_t`) および `c8rtomb`(`char8_t -> char`)が実装されていないからです。 

# 環境

```:VisualStudio
Microsoft Visual Studio Community 2022 (3)
Version 17.0.4
VisualStudio.17.Release/17.0.4+32014.148
Microsoft .NET Framework
Version 4.8.04161

インストールされているバージョン:Community

Visual C++ 2022   00482-90000-00000-AA281
Microsoft Visual C++ 2022

Microsoft Visual C++ ウィザード   1.0
Microsoft Visual C++ ウィザード

Microsoft Visual Studio VC パッケージ   1.0
Microsoft Visual Studio VC パッケージ

...
```

```:WindowsTerminal
Windows Terminal
バージョン: 1.11.3471.0
```

```:OS
エディション	Windows 11 Pro
バージョン	21H2
インストール日	‎2021/‎10/‎24 ‎日
OS ビルド	22000.376
エクスペリエンス	Windows 機能エクスペリエンス パック 1000.22000.376.0
システムの種類	64 ビット オペレーティング システム、x64 ベース プロセッサ
```

# WindowsのコンソールのコードページをUTF-8にする

設定->時刻と言語->言語と地域->管理用の言語設定->システムロケールの変更->`ベータ: ワールドワイド言語サポートで Unicode UTF-8を使用`にチェックを入れます。
こうする事でコンソールのデフォルトコードページが`UTF-8`になるようです。

もしくは、main関数の先頭あたりに以下のコードを記述すれば、出力コンソールのコードページが`UTF-8`になります。
そして、`setvbuf()`で`stdout`にバッファを設定します。
文字列が`UTF-8`の場合は、バッファを設定しないと正常に出力されない事があるらしいです。
また、バッファを設定すると`printf_s()`の後などで`fflush(stdout)`を用いてバッファをフラッシュする必要が出てくることがあります。


```cpp
#include <Windows.h>
#include <stdio.h>

int main() {
  SetConsoleOutputCP(CP_UTF8);
  setvbuf(stdout, nullptr, _IOFBF, 1024);
  return 0;
}
```

# `.editorconfig`を用意する

`.editorconfig`を使うとソリューション毎に文字コードを制御できます。
ほぼ全てのソリューションに対して設定したい場合は、Visual Studioのデフォルト設定の場合は、`C:\Users\<UserName>\source\repos`に`.editorconfig`を作成します。
その内容は、以下のようにします。

````:.editorconfig
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
```

# Visual Studioのテキストエディターの設定

ツール -> オプション -> テキストエディター -> 全般 -> `シグネチャなしの UTF-8エンコードを自動検出`をチェック
これでソースファイルが`UTF-8`でも扱えるようになります。

# Visual Studioのプロジェクトテンプレートを作成する

Visual Studioで`新しいプロジェクトの作成`を実行し、`空のプロジェクト`を作成します。

1. デバッグ-> <SolutionName>のデバッグプロパティを開く
2. 構成 -> `全ての構成`に変更する
3. **必要に応じて** 構成プロパティ-> 全般 -> C++ 言語標準 -> `ISO C++ 17 標準 (/std:c++17)`に変更する 
4. 構成プロパティ-> 詳細 -> 文字セット -> `Unicode 文字セットを使用する`に変更する
5. 構成プロパティ-> リンカー -> コマンド ライン -> 追加のオプションに`/utf-8`を追加する

デフォルトのソースファイルやヘッダーファイルが要らない場合は、このままプロジェクトテンプレートを作成します。
この記事では、`UTF-8`が有効になっているか確認の意味を込めて以下のファイルをプロジェクトに追加してからテンプレートを作成することにします。

1. ソリューション エクスプローラー -> ソースファイルを右クリック
2. 追加 -> 新しい項目 -> C++ ファイル

```cpp:main.cpp
#include <Windows.h>
#include <vector>
#include <string>

int main()
{
  std::string u8str = u8"尾も白い猫";
  std::string str = "尾も黒い猫";

  printf_s("%d\n", GetConsoleOutputCP());
  printf_s("start\n");
  printf_s(u8"動物: %s\n", u8str.data());
  printf_s("動物: %s\n", str.data());
  printf_s("end\n");

  return 0;
}
```

最後にプロジェクトテンプレートを保存します。

- プロジェクト-> テンプレートのエクスポート

# 動作確認

作成したプロジェクトテンプレートを用いて新しいプロジェクトを作成すれば、ソースファイルと出力と扱うデータ全て`UTF-8`になっているかと思います。

標準ライブラリだけで`UTF-8`を楽に扱えるようになってもらいたいものです。
PULL_REQUEST_TEMPLATEをorganization共通で管理したい

# モチベーション

PullRequest作成時のコメントテンプレートを個別のリポジトリで管理していたが、
テンプレートの修正が必要になった時リポジトリごと対応をしなければならずコストが高い。。。

同じテンプレートであれば１箇所で管理できればと思った

# 方法

「.github」リポジトリを作成し、「.github/PULL_REQUEST_TEMPLATE.md」を置いておけばOK！

> 「.github」リポジトリはpublicで作成すること
シェル学習 sortとuniqによる集計

####sortとuniqによる集計

「sortで並び替えてuniqで数える」


```
$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}'
奇数
偶数
奇数
偶数
奇数

$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort
奇数
奇数
奇数
偶数
偶数

$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort | uniq -c
  3 奇数
  2 偶数

~$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort | uniq -c | awk '{print $2,$1}'
奇数 3
偶数 2

```

sortは入力された行を辞書順に並び替える。
uniqは重複する行を消す。ただし、消したい行はsortの出力のように連続して並んでいる必要がある。
python loggingモジュール

#1 概要
既存システムのロギングの改修
## (1) 既存システム
  (ⅰ) WEBアプリケーション　　
  (ⅱ) 同一ソースコードで２つのプロセス（workerではない）が動いている
  (ⅲ) 2つのプロセスは同じログファイルに出力される。
  (ⅳ) ログローテートされていない。

## (2) 改修ポイント
①[(1) 既存システム]の(ⅲ)について
　⇒別々のログファイルに出力する。

②[(1) 既存システム]の(ⅳ)について
　⇒ログローテーションを実施。

## (3) 実装
[(2) 改修ポイント]の①について
　⇒プログラム起動時に別々の設定ファイルを読み込む設定を処理に修正。

[(2) 改修ポイント]の②について
　⇒ログローテート間隔のバックアップ数はログ設定ファイルで対応可能
　⇒圧縮処理は別途実装が必要となる。

使用するロギングクラス
TimedRotatingFileHandler
https://docs.python.org/ja/3/library/logging.handlers.html?highlight=logging%20handler#timedrotatingfilehandler
【Flutter】iOSのdSYMをアップロードする

dSYMのアップロードで少しハマったので書き残します。

# dsymを生成してパスを取得
1.Xcodeを開き、メインのTARGETSを選択
2.Build Settings、Allを選択
3.Build OptionsのDebug information FormatをDWARF with dSYM Fileに変更する。
![スクリーンショット 2022-01-05 23.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086494/0cc605c5-1ea2-ac00-6a91-6c0bdc3d5659.png)
4.iOS版をビルドする

```
$ flutter build ios
```

5.Xcodeを開き、Product→Archiveを選択し、処理が完了するまで待つ。

6.ターミナルでプロジェクトのiosディレクトリまで移動
```
$ cd /プロジェクトディレクトリまでのパス/ios
```

7.コマンドを入力
```
./Pods/FirebaseCrashlytics/upload-symbols -gsp GoogleService-info.plist -p ios /プロジェクトディレクトリまでのパス/build/ios/Release-iphoneos/Runner.app.dSYM
```

8.Successfully uploaded Crashlytics symbolsが表示されればアップロード完了
Google ColaboratoryでファイルアップローダとURLローダ両方に対応した画像読み込みフォームを作る。

# ノートブック
>ファイルアップローダとURLローダ両方に対応した画像読み込みフォーム

https://colab.research.google.com/drive/1zeEw4b8-eX_7wYOwKWoN-fvCkwRTLz0u

# 使い方
jpgとpngのみ。

TARGETに画像URLを入れてセルを実行すると、画像URLから画像を読み込みコードセルへ出力（一枚）。


>![スクリーンショット_2022-01-05_23-43-0112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459843/e0e3ac5e-b0b2-cb78-dbd6-840fea57b949.jpeg)


TARGETを空にしたまま実行すると、アップロードフォームを表示させローカルから読み込み、コードセルへ出力（複数可）。

>![スクリーンショット_2022-01-05_23-43-011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459843/2d5c93a4-e95a-b2c7-b9df-931b3159e22f.jpeg)



# ソース

```python:コードセル
#@title 画像URLから読み込む。
TARGET = "" #@param {type:"string"}

import requests
from IPython.display import Image,display_jpeg,display_png
from io import BytesIO

from google.colab import files

if not TARGET:
    TARGET=[]
    uploaded = files.upload()
    for fn in uploaded.keys():
        TARGET.append(Image(fn))
else:
    img_obj=Image(BytesIO(requests.get(TARGET,timeout=15).content).getvalue())
    img_obj.filename=TARGET
    TARGET=[img_obj]

print("Images: \n")
for fo in TARGET:
    print(fo.filename)
    if fo.format=="jpeg":
        display_jpeg(fo)
    elif fo.format=="png":
        display_png(fo)
    print("")
TARGET=""
!rm -f *.jpg *.png
```

https://qiita.com/gudapys/items/5d8a24292e6d5729ca45

# 実用例

https://qiita.com/gudapys/items/1405846c6ed16c8c0d28
VPS（仮想専用サーバー）環境でXvfb (X virtual framebuffer)を使いたい

## VPS（仮想専用サーバー）環境でXvfb (X virtual framebuffer)を使いたい

> Xvfb (X virtual framebuffer) は X Window System の仮想ディスプレイを作ることのできるソフトウェア

VPS上で画像表示を伴うアプリを動かそうとした際に以下のようなエラーメッセージが出た場合の解決策

```
Traceback (most recent call last):
  File "game_manager/game_manager.py", line 5, in <module>
    from PyQt5.QtWidgets import QMainWindow, QFrame, QDesktopWidget, QApplication, QHBoxLayout, QLabel
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
```

```
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.
```

```
qt.qpa.xcb: could not connect to display localhost:10.0
```

以下を実行して解決

```
sudo apt install -y libgl1-mesa-glx
sudo apt -y update && sudo apt install -y ffmpeg libsm6 libxext6
sudo apt install -y libxkbcommon-x11-0
sudo apt -y install libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0
sudo apt install -y xvfb
```

```
export DISPLAY=:1
Xvfb -ac ${DISPLAY} -screen 0 1280x780x24 &
```



# 参考
[ImportError: libGL.so.1: cannot open shared object file: No such file or directory](https://stackoverflow.com/questions/55313610/importerror-libgl-so-1-cannot-open-shared-object-file-no-such-file-or-directo)
[PyQt5をUbuntuで使うときにGUI周りでエラー (WSL2)](https://qiita.com/momomo_rimoto/items/83917d3f9f5dd35457e1)
照明用スイッチ　M5stackで照明を動かす　M5Stack＋UIFLOW＋Node-RED+Hue


使用機材
---------
Raspberry Pi 3 Model B
M5Stack Basic
M5atom lite
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)　mac　os　11.6


概要
----

照明はスマホから調光操作しているんですが、やはり壁スイッチのような物理スイッチで押したい場合もあって、温度湿度計測に使用しているM5stack coreとM5atomをスイッチ兼用にしてみました。
M5からボタンが押されたら、MQTT経由でHue APIを叩くようにしてます。

リビングは、シーンとして朝/昼/夜の3シーンがメインなのでM5stackのボタンを使って、寝室はフル点灯か常夜灯なのでm5atomliteのボタンで運用してます。


![Instagram post - 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/707dceb4-68db-77b4-a80e-9c01a5b1979f.png)

![Instagram post - 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/a2594606-f671-e6c8-f13c-8823937def23.png)

![Instagram post - 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/30f0b0cb-e588-dbef-f722-110fcad163e5.png)

Node-RED構成
----------
![Instagram post - 19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/d3da63d8-b2f8-aa4e-ebb4-bd8ecf3f619b.png)


M5Stack　Aボタンの誤動作
----------------


動作してみるとAボタンを押してないのに入力される事象が発生し、ぐぐってみるとバグみたいで、80nsecのパルスが入力されるようで、下記の記事が参考になりました。
対策としては、ワンショットのトリガーでなくメイクする時間を0.2msecとしたら、誤動作は無くなりました。
https://macsbug.wordpress.com/2021/05/02/buttona-on-m5stack-does-not-work-properly/

↓公式
https://www.espressif.com/sites/default/files/documentation/eco_and_workarounds_for_bugs_in_esp32_en.pdf

![スクリーンショット 2021-12-30 22.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/79d5cf94-89f1-05ff-841c-dcd87dd889d0.png)


Aボタンの入力を長押しにすることでご動作は現時点起きていません。200msec押したら入力されるようにしています。
200msecであれば違和感のない押し具合だったので一旦200msecにしています。


動作
-----------

![7AF5C351-D606-45B6-A65F-5CDB6DA213A3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/e92801b8-8e82-faed-2fa5-fad79f304d0c.gif)

![C4E915DA-684E-4787-87F0-7D0180BF1D94.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/5299e030-3f75-1423-4bda-bc7a540142b7.gif)