OmniAICreator/Qiita-1.07M huggingface dataset:
草莽Erlang ── 20. lists:filtermap

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## lists:filtermap

```
filtermap(fun((term) -> boolean | {true, term}), [term]) -> [term]
filtermap(要素を取り出す条件, リスト) -> 新しいリスト
```

[lists:filter](https://www.erlang.org/doc/man/lists.html#filter-2)の処理と[lists:map](https://www.erlang.org/doc/man/lists.html#map-2)の処理を一度に実行します。第一引数に渡す関数は`{true, 新しい値}`もしくは`false`を返します。

https://www.erlang.org/doc/man/lists.html#filtermap-2

```erlang
% リストから偶数のみを取り出して1000加算する関数
IsEvenThenAdd1000 = fun(X) -> 
  case X rem 2 of 
    0 -> {true, X + 1000}; 
    1 -> false 
  end 
end.
```

```erlang
> lists:filtermap(IsEvenThenAdd1000, [1, 2, 3, 4]).
[1002,1004]
```

[listsモジュール](https://www.erlang.org/doc/man/lists.html)には他にもリスト処理のための関数がたくさんあります。

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
草莽Erlang ── 19. lists:filter

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## lists:filter

```
filter(fun((term) -> boolean), [term]) -> [term]
filter(要素を取り出す条件, リスト) -> 新しいリスト
```

リストの各要素に対して同じ処理を適用して`true`と評価される要素のみを含む新しいリストを生成します。

https://www.erlang.org/doc/man/lists.html#filter-2

```erlang
% リストから偶数のみを取り出す
> lists:filter(fun(X) -> X rem 2 == 0 end, [1, 2, 3, 4]).
[2,4]

% 要素を取り出す条件の関数は真理値返さないとダメ
> lists:filter(fun(_X) -> "hello" end, [1, 2, 3, 4]).
** exception error: bad filter "hello"
     in function  lists:'-filter/2-lc$^0/1-0-'/2 (lists.erl, line 1383)
```

filter関数に馴染みのない方は[闘魂Elixirの図](https://camo.qiitausercontent.com/1c85d520e2c1caa632f69e7a5d754ababe2e162c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3133313830382f64306436373164312d323533642d383832332d616137622d3234383335633234383365632e706e67)を眺めてみるとなんとなく感覚が掴めるかもしれません。

https://qiita.com/torifukukaiou/items/f35aee5d252ec82fa459

[listsモジュール](https://www.erlang.org/doc/man/lists.html)には他にもリスト処理のための関数がたくさんあります。

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
草莽Erlang ── 18. lists:map

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## lists:map/2

```
map(fun((term) -> term), [term]) -> [term]
map(各要素に対して実行したい処理, リスト) -> 新しいリスト
```

リストの各要素に対して同じ処理を適用して新しいリストを生成します。

https://www.erlang.org/doc/man/lists.html#map-2

```erlang
%% 各要素を二乗する

> lists:map(fun(X) -> X * X end, [1, 2, 3]).
[1,4,9]
```

map関数に馴染みのない方は[闘魂Elixirの図](https://camo.qiitausercontent.com/67a2990b180bcb24370bac726ad014c86348ec9a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3133313830382f33376161623965312d623931352d366134662d653631612d6266616361343431303933612e706e67)を眺めてみるとなんとなく感覚が掴めるかもしれません。

https://qiita.com/torifukukaiou/items/ca58bf84041cd4b4a62d

## lists:keymap/3

```
keymap(fun((term) -> term), integer, [tuple]) -> [tuple]
keymap(値を変換する関数, タプルの要素の位置, タプルのリスト) -> 新しいタプルのリスト
```

タプルのリストに対して同じ処理を適用して新しいリストを生成します。値の変換はタプルの指定された位置の要素に対して行われます。値を変換する処理は関数として与えます。

https://www.erlang.org/doc/man/lists.html#keymap-3

```erlang
%% 各要素のキーをアトムから文字列へ変換

> L1 = [{name, "antonio"}, {name, "masa"}].

> lists:keymap(fun (A) -> atom_to_list(A) end, 1, L1).
[{"name","antonio"},{"name","masa"}]
```

要素の数え方は「１、２、３ぁっダー！」です。例えば最初の要素のインデックスは`1`となります。

https://youtu.be/AWxwmqzbOaw

https://youtu.be/FSz7N5hCltw

https://note.com/awesomey/n/n4d8c355bc8f7

[listsモジュール](https://www.erlang.org/doc/man/lists.html)には他にもリスト処理のための関数がたくさんあります。

## lists:flatmap/2

```
map(fun((term) -> term), [term]) -> [term]
map(各要素に対して実行したい処理, リスト) -> 各要素に対する処理の結果が連結された新しいリスト
```

リストの各要素に対して同じ処理を適用して、新しいリストに連結します。各要素に対して実行したい処理がリストを返す場合に最終結果が入れ子になって欲しくない場合に便利です。

https://www.erlang.org/doc/man/lists.html#flatmap-2

```erlang
> lists:map(fun(X) -> [X, X] end, [a, b, c]).
[[a,a],[b,b],[c,c]]

> lists:flatmap(fun(X) -> [X, X] end, [a, b, c]).
[a,a,b,b,c,c]

> lists:flatmap(fun(X) -> [[X]] end, [a, b, c]).
[[a],[b],[c]]
```

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
数学_利用ライブラリ

## sympy他、利用ライブラリ
importするライブラリ
```python
# library
from sympy import init_printing
import sympy

# 解
from sympy import factor       # 因数分解
from sympy import solveset     # solveではなくsolvesetを推奨とある、構文は同じ
from sympy import solve        # 代数方程式を解く
from sympy import simplify     # 式の簡略化
from sympy import apart        # 部分分数分解
from sympy import cancel       # 有理表現
from sympy import collect      # ベキ順に整理
from sympy import separatevars # 共通因子で括る
from sympy import expand       # 展開
from sympy import sqrtdenest   # ２重根号計算
from sympy.solvers.inequalities import reduce_rational_inequalities # 不等式
# ex. reduce_rational_inequalities([[f3>=0.8]], A)

# plotting
from sympy.plotting import plot
from sympy.plotting import plot_parametric
# ２変数関数のプロット
from sympy.plotting import plot3d

# 変数
from sympy import symbols
from sympy import var

# 三角関数
from sympy import sin
from sympy import cos
from sympy import tan
from sympy import asin
from sympy import acos
from sympy import atan
from sympy import sinh
from sympy import cosh
from sympy import tanh

# 指数関数
from sympy import exp

# 対数関数
from sympy import log

# 極限値
from sympy import limit
from sympy import oo
from sympy import Sum
from sympy import sqrt
from sympy import Function
from sympy import Max

# 微分
from sympy import diff
from sympy import powsimp

# 階乗
from sympy import factorial

# テイラー展開
from sympy import series
from sympy import poly

# 積分
from sympy import integrate
from sympy import lambdify  # sympy関数を積分可能な関数に変換する

# 合算
from sympy import summation # 対象の合計 factorと合わせて使う場合もある

# 連立方程式
from sympy import Eq

# 虚数
from sympy import I
from sympy import collect

# 定数
from sympy import pi
from sympy import E

# 絶対値
from sympy import Abs

# 表示
from sympy import latex

# 分数として扱う
from fractions import Fraction
from sympy import Rational

# 行列
from sympy import Matrix       # ベクトル、行列
from sympy import eye          # 単位行列
# det          # 行列式
# eigenvects   # 固有ベクトル
# eigenvals    # 固有値
# diagonalize  # 対角行列
# inv          # 逆行列
# adjugate     # 余因子行列
# transpose    # 転置行列

# 確率
from sympy.functions.combinatorial.numbers import nC  # 組み合わせ
from sympy.functions.combinatorial.numbers import nP  # 順列

# 最大、最小、範囲
from sympy import maximum
from sympy import minimum
from sympy import Interval
## minimum(expand(p_norm**2), k, Interval(-1, 3/2))

# 常微分方程式
from sympy.solvers import ode

# いつもの
import numpy as np
import pandas as pd
import japanize_matplotlib
import seaborn as sns
import matplotlib.pyplot as plt
from collections import OrderedDict

# 初期化
init_printing(use_latex='mathjax')

```
TeraTermマクロの第一歩（自動ログイン）

# 概要

TeraTermでよく使うコマンドをマクロ化したい。
マクロをダブルクリックして開くだけで実行されるように。

この記事では『TeraTermのマクロを全く使ったことない』な状態向けにマクロファイル作成の段階から書いてます。

# ttlファイル作成

まず、TeraTermのマクロは拡張子がttlのファイル。

『適当なテキストエディタでUTF-8のtxtファイル作成 ⇒ 拡張子をttlに変更』という作り方でOK。

```:ttlファイルの中身
;ログイン情報
USER_NAME = '名前'
USER_PASSWORD = 'パスワード'
;HOSTはIPアドレス or サーバー名のどちらでもOK。
HOST = 'ほすと'

;ログインコマンド生成
login_command_ = HOST
strconcat login_command_ ' /ssh /auth=password /user='
strconcat login_command_ USER_NAME
strconcat login_command_ ' /passwd='
strconcat login_command_ USER_PASSWORD

;ログイン実行
connect login_command_
```

先頭に ```;``` を付けるとコメントになる。
```strconcat``` で文字列結合ができる。

# ttlファイルを開くアプリの指定

右クリック ⇒ プロパティ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a7edad50-a791-b8da-c230-432a46e4c360.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/485f46f3-2ded-adb5-8502-eb0b80884814.png)

```:ttpmacro.exeがあるフォルダー
C:\Program Files (x86)\teraterm
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fa53a615-b0ee-5c5e-8b40-42bf14f77d9e.png)

これでttlファイルをダブルクリックで開くだけで、TeraTermのマクロが実行される。

# 自動ログインだけならショートカットでも可

https://qiita.com/waokitsune/items/4aa08c31ef0b8f87dc44

# 参考サイトさん

https://qiita.com/iguru/items/eed60bc1d969a6a0000c

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
TeraTerm 4.106
php artisan sail:install にてCould not open input file: artisan

```
php artisan sail:install
```
と打ち込むと
```
Could not open input file: artisan
```
とエラーが返ってくる。

ググったら
どうやらディレクトリが間違っていたみたい。
artisanファイルがあるディレクトリに移動して再度行うと動作しました。

メモとして残します。
Cognosの値のプロンプトで固定値を使用する


Cognosのレポート開発時にプロンプトを設定することがあると思いますが、その際の選択肢をプロンプトの機能で固定値を使用することができます。
固定値を使用すると、2個3個の固定の選択肢のためにクエリーを用意してDBに値を問い合わせに行くというような動作を省略することができます。

設定方法は簡単なので、必要に応じて活用ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/450b5d49-8810-655c-de75-9c41e6dbfd0a.png)


① 値のプロンプトのプロパティから、「Static choices (固定値の選択) 」をクリックします。

② 「Add (追加) 」ボタンをクリックします。

③ プロンプトで使用する値と表示する値を入力します。

必要な選択肢分、追加出来たら作業は完了です。
HTMLで実行すると確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/d1ddabca-d146-37c5-db45-bfbba97c54e1.png)
[Python]先頭・末尾からn文字を取得

スライスはいいぞ。

# 先頭からn文字
Pythonの文字列は**インデックスに対応している**ので、リストと同じように要素が取得できる。

先頭の一文字のみであれば以下の通り。
```py
>>> s = "hoge"
>>> s[0]
'h'
```

先頭からn文字を取得する場合はスライス表記を用いる。
このとき、**終点のインデックス番号は含まれない**点に注意する。

```py
>>> s[0:3]
'hog'  # 0-2の文字が取得される
```

# 末尾からn文字
末尾から1文字の場合、**負のインデックス表記**が有効である。
Pythonでは、インデックスに負の値を指定した場合、**後方から数えた要素を取得する**ことができる。

```py
>>> s = "hoge"
>>> s[-1]
'e'
```

末尾からn文字を取得したい場合、`s[-n:]`という表記で実装できる。
コロン`:`がない場合は「末尾からn文字目"だけ"を取得する」ため注意。

```py
>>> s[-3:]
'oge'
```
vueUseの概要と使い方

# vueUseとは
よく使う機能をロジック単位で切り取り、それを関数として簡単に利用できるようにしたライブラリ。

# vueUseの長点
- vue2もvue3でもサポート
- compositionAPIの使用が可能
- 安定したコミュニティが存在
- よく使う機能の関数を提供

# vueUseの特徴
- 関数の戻り値はrefのオブジェクトである。
- イベントを制御するためのフィルターが提供される関数もある。
    - 制御する際には、関数の引数として前もって定義されたプロパティを操作することでOK

# vueUseの使用
### 方法１：以下のコマンドでvueUseをインストールする。
```shell
npm i @vueuse/core
```
### 方法２：CDNを利用する。
```html
<script src="https://unpkg.com/@vueuse/shared"></script>
<script src="https://unpkg.com/@vueuse/core"></script>
```
# vueUseの主な関数
### １) useBreakpoints
メディアクエリのブレークポイントを設定できる。

```vuejs
<script setup lang="ts">
import { useBreakpoints } from "@vueuse/core"

const breakpoints = useBreakpoints({
  sm: 300,
  md: 600,
  lg: 900
})
const sm = breakpoints.smaller('sm')//より小さい
const md = breakpoints.between('sm', 'md')//間
const lg = breakpoints.between('md', 'lg')//間
const xl = breakpoints.greater('lg')//より大きい
</script>

<template>
<div>
    <div> sm: <p v-if="sm" >NOW</p></div>
    <div> md: <p v-if="md" >NOW</p></div>
    <div> lg: <p v-if="lg" >NOW</p></div>
    <div> xl: <p v-if="xl" >NOW</p></div>
  </div>
</template>
```
上記のようにブラウザのサイズを`useBreakpoints`をもってチェックすることができる。
上記のコードを実行すると以下のようになる。
![ezgif-4-4130f1b398.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785890/d6204ac5-ee09-3458-3559-672507efb752.gif)

### ２) useScroll
スクロールに関する様々な情報を取得できる。
```vuejs
<script setup lang="ts">
const el = ref<HTMLElement | null>(null)
const {
  x,  // 横方向のスクロール量
  y, // 縦方向のスクロール量
  isScrolling, // 現在スクロール中か
  arrivedState,  // 左右上下いずれかのページの端にいるか
  directions // スクロールの方向
} = useScroll(el)

//左右上下のそれぞれ端にいるかどうか、boolean
const { left, right, top, bottom } = toRefs(arrivedState)

//スクロールの方向
const { left: toLeft, right: toRight, top: toTop, bottom: toBottom } = toRefs(directions)
</script>

<div>
    <div style="display: flex;"> x: <p style="color: red;">{{ x }}</p></div>
    <div style="display: flex;"> y: <p style="color: red;">{{ y }}</p></div>
    <div style="display: flex;"> isScrolling: <p style="color: red;">{{ isScrolling }}</p></div>
    <div style="display: flex;"> left: <p style="color: red;">{{left}}</p></div>
    <div style="display: flex;"> right: <p style="color: red;">{{right}}</p></div>
    <div style="display: flex;"> top: <p style="color: red;">{{top}}</p></div>
    <div style="display: flex;"> bottom: <p style="color: red;">{{bottom}}</p></div>
  </div>
```
`useScroll`を使って、現在のスクロール量 / スクロール中かどうか / ページの一番上(右、下、左)にいるか / スクロールの方向などの情報を取得することができる。
上記のコードを実行すると以下のようになる。
![スクリーンショット 2023-01-10 9.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785890/5bcac34c-0a9b-1be4-a6db-db72317fca2f.png)


### ３）useNow
現在時刻を毎秒リアルタイムで取得できる。
controlsオプションを付けることで、時刻の一時停止やキャンセルも可能
```vuejs
<script setup lang="ts">
import { useNow } from '@vueuse/core'
const { now, pause, resume } = useNow({ controls: true })
</script>

<div>
  Now: {{ now }} <!--毎秒更新される-->
</div>
<div>
  <button @click="pause()">Pause</button>
</div>
<div>
  <button @click="resume()">Resume</button>
</div>
```
上記のコードを実行すると以下のようになる。
![ezgif-4-e908764849.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785890/d1e62aef-79c2-2af0-9e72-48b785475523.gif)
アクツクmvの情報リンク集

アクションゲームツクールMV（アクツクmv／PixelGameMakerMV）についてのノウハウを書いていきます。

このアクツクmv、セールで購入してまだ１か月ですが、サクッとゲームを作れて、個人的に気に入りました。ですが、公式・非公式含めて情報が少なく、上手くいかずに困ってもなかなか有用な情報にたどり着けません。孤独に試行錯誤していかなければならないので、軽い気持ちで購入した人には少々厳しい状況です。

というわけで、不肖ながら、私が知りえた情報を、こちらで共有していこうと思いました。

UnityやPythonなんかでもゲームを作って遊んだりしていたのですが、その際にQiitaさんの記事にはずいぶんお世話になったので、私もなにか情報発信して恩返ししようと思っていたので、こちらで発信させていただきます。

では、初回ですので、投稿テストもかねて、アクツクmvの情報リンクを紹介します。

公式ホームページ
https://rpgmakerofficial.com/product/act/
アクツクmvについての紹介から、マニュアルまで。一通り情報はあるのですが、ざっくり書いてあるけど、すべてではなく、アクツク講座というノウハウ記事もあるのですが、これも一部分の参考にとどまっていて、これだけで充分とはいえない感じです。とはいえ、必読であります。

初心者のためのアクションゲームツクールMV講座
https://aiantbear.hatenablog.com/
あいあんとべあ　さんによる入門講座。たぶんほぼ唯一といっていい、アクツクmvブログ。こちらも、公式同様、一通り目を通しておきたいページです。

アクツクMV情報局
https://twitter.com/pgmmv_jp
アクションゲームツクールMV の広報用twitter。こちらもTips情報などが流れてきます。

アクションゲームツクールMV まとめWiki / 参考になる記事・サイト
https://wiki.denfaminicogamer.jp/pgmmv/%E5%8F%82%E8%80%83%E3%81%AB%E3%81%AA%E3%82%8B%E8%A8%98%E4%BA%8B%E3%83%BB%E3%82%B5%E3%82%A4%E3%83%88
役立つ記事へのリンク集。まとめwiki自体は微妙なんですがリンク集は使えます。

Pixel Game Maker MV Tutorials
https://www.youtube.com/watch?v=w5lBA0zWEzk&list=PLjyKjxGVrnPWfJL_rXaiQDrdhhWEVg8Pt
海外では、Pixel Game Maker MVとしてsteamで販売されており、こちらはそのチュートリアル動画リストです。公式よりも突っ込んだ内容になっており、これを観れば、かなりのノウハウが身につくことでしょう。ただし英語です。

Scripting Made Easy
https://steamcommunity.com/sharedfiles/filedetails/?id=2566824894
上記のYouTubeと同じbazさんによる、スクリプト集。スクリプトを書こうと思ったら、ここをまずは見ましょう。

Action Text Plug-In For PGMMV
https://joewithoutme.itch.io/action-text-plug-in-for-pgmmv
Joeさんによる「テキスト素材を一文字ずつ表示したり、ダイナミックな演出を行うことが可能になる」プラグイン。

アクションゲームツクールMV用プラグインを作成してました
https://note.com/sexy_opants/n/n905b10c217f3
ぶりぶりはまち氏によるプラグイン集。方角や距離、四則演算などこういうのがあったらいいなという機能を実現するプラグイン。公式がアクションとして採用してほしいぐらい。一見の価値あり。

－－－－－－－－－－－－－－－－－－－－－－ーー
サンプルゲームプロジェクト
アクツクmvを起動すると、プロジェクトを選択する画面になりますが、そこで「サンプル」というタグをクリックすると、サンプルゲームのプロジェクトを開くことが出来ます。いろいろな種類のゲームのサンプルが用意されていて、実際に遊べるゲームがどんな仕組みなのか観ることができます。
![サンプルゲーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/1852172c-c3bf-eaa0-9ca1-0a60dc0d1a8c.png)

プロジェクトの「オブジェクト」タブをクリックして、「readme」とか「★★★このプロジェクトについて★★★」があれば、説明があったりします。（以下は「データベースサンプル」プロジェクト）

![このプロジェクトについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/c8526081-eeb1-78b9-96a9-3e747178667a.png)

とりあえず、こんなところでしょうか。
（新たに見つけたら、追加していこうかと思います）
ではまた。
mac usキーボード（外付け）でチルダ（~）バッククォート（`）をKarabinerショートカットに登録する

## 環境

macOS 13.1
USキーボード

## 目的
自分の使っているUSキーボード（[NiZ 静電容量無接点方式 パソコン用キーボード](https://amzn.to/3iu0oZZ "NiZ 静電容量無接点方式 パソコン用キーボード")）
では、左上のEscキーにチルダとバックコーテーションが割り当てられているが、
コマンドを使用する頻度が高くなってきて、今まで滅多に使わなかったチルダを使う機会が増えてきた。

従来のチルダ表示（Shist + fn + Esc）
従来のバッククォート（fn + Esc）だと、左手のショートカットとして不便なので、
Karabinerを使って変更する。

バッククォートは、TypeScriptで、文字リテラルとして囲むと、変数と文字列を同時に出せるので使うこともある。

# Karabiner　ルール
https://ke-complex-modifications.pqrs.org/?q=tilde

ここから、「shift + Esc Tilde to ~, command + Esc Tilde to」をインポート

complex Modificationsで、設定登録。

![スクリーンショット 2023-01-10 9.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224787/dd8b2f35-58ea-4340-8549-0308ad68a200.png)

## できたこと

command + Esc　でバックコーテーション（`)
shift + Escでチルダ（~）
楽ちん。
neovim で C# のスペルチェックをする

私は C# の開発エディタとして [neovim](https://neovim.io/) を使っています。
Vim で C# の開発を行うために必須といっても過言ではない [omnisharp-vim](https://github.com/OmniSharp/omnisharp-vim) を使いつつ、スペルチェックを行えるようにしたので記録しておきます。

## 方法

omnisharp-vim を使っている場合、 [ALE](https://github.com/dense-analysis/ale) も使っていると思います。スペルチェックを行ってくれる [cspell](https://cspell.org/) を使います。 cspell のチェック結果を ALE 経由で Vim 上に表示させるのが一番楽です。

1. cspell をインストール
   https://cspell.org/#installation のように npm 経由でも良いですし [mason.nvim](https://github.com/williamboman/mason.nvim) などを使って cspell をインストールしても良いです。 
1. ALE の設定で C# のときに omnisharp と cspell を有効にする
  vimrc や init.vim に下記設定を行います。
```init.vim
let g:ale_linters = { 'cs': ['OmniSharp', 'cspell'] }
```

設定後はこのようになります。ALE を v3.3.0 以上を使っていれば virtual-text 部分にも結果を表示してくれます。
![~_works 2023-01-10 09.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/26c36520-c879-f189-9e70-1e7f96ddc1e3.png)

ただし omnisharp-vim の README には
>  To limit ALE to only use OmniSharp (recommended), add this to your .vimrc
```init.vim
let g:ale_linters = { 'cs': ['OmniSharp'] }
```

とあるので cspell と併用すると何かしら不都合があるかもしれません。
不都合が出てきたら、そのときにまた手を考えることにします…
ライフサイクルについてのメモ

開発を行っていて、毎回ライフサイクルの呼ばれる順番を忘れてしまうので、メモを残す。

### 基本的なUIViewController内で呼ばれる順序
`viewDidLoad`→`viewWillAppear`→`viewWillLayoutSubviews`→`viewDidLayoutSubviews`→`viewDidAppear`→`viewWillDisppear`

### 複数個画面が存在する場合
例として、View AとView Bが存在した場合に、View Aをボタンをタップすると、View Bへ画面遷移し、View Bのボタンをタップすると、View Aに戻る。

  A画面読み込み `viewDidLoad` 
→ A画面読み込み `viewWillAppear`
→ A画面レイアウト処理開始`viewWillLayoutSubviews`
→ A画面レイアウト処理終了`viewDidLayoutSubviews`
→ A画面表示 `viewDidAppear`
→ B画面へ移動 `viewWillDisappear`
→ B画面表示 `viewDidDisappear`
→ A画面へ戻る `viewWillAppear`
→ A画面表示 `viewDidAppear`

### それぞれのライフサイクルの責務
#### viewDidLoad
- 基本的なsubViewのセットアップを行う

#### viewWillAppear
- 画面が表示されるたびに行いたい処理を記述

#### viewWillLayoutSubviews
- レイアウトの処理を行う

#### viewDidLayoutSubviews
- レイアウト処理を完了したのを確認してから、行いたい処理を記述

#### viewDidAppear
- 画面が完全に表示されてから行いたい処理を記述

#### viewWillDisappear
- 画面非表示となる直前で行いたい処理を記述

#### viewDidDisappear
- 画面が完全に非表示になってから行いたい処理を記述
M5Stackを接続出来ない場合の対処法

M5StackをPCに接続する際の注意点
---
Windows11がM5Stack FIRE(v2.6)を認識せず、スケッチ(プログラム)を書き込めなかった際に試したことなどを記載しておきます。
### USBドライバーのダウンロード
[開発環境のセットアップ手順](https://manual.iij.jp/iot/devices/42076478.html#id-%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97(M5Stack)-USB%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB "開発環境のセットアップ手順 USBドライバーのダウンロード")には下のように書かれていますが、私の環境ではCP2104のドライバーで書き込み出来ました。
公式サイトによると両方ダウンロードしてもいいようなので、接続出来なかったらとりあえずもう片方のダウンロードを試してみるといいと思います。

>現行バージョン（ver.2.6）の M5Stack Basic Core / Fire / Core2 をご利用の場合は、CH9102 のドライバーをご利用ください。
>上記以外の M5Stack Basic Core / Fire / Gray / Core2 をご利用の場合は、CP2104 のドライバーをご利用ください。

### ボードマネージャのダウンロード
最新のボードマネージャ(2.0.6)をダウンロードしようとしたところ、ダウンロードに失敗したので1つ古いバージョン(2.0.5-1.0)をダウンロードしました。(こちらはダウンロードに成功しました)
それでも動いたので、最新版のダウンロードに失敗してもとりあえず古いものをダウンロードしておくのがいいと思います。
なお、後日アップデートしたところ正常にダウンロード出来ました。
(追記)[こちら](https://twitter.com/mongonta555/status/1612388876345315332?s=20&t=gJr3fFX71UvSny3nbSP-kQ)によると、2023/1/9前後で修正がなされたようです。情報共有してくださった方、ありがとうございます！

### Arduino IDEのバージョン
書き込み出来た際のArduino IDEのバージョンは2.0.3でした。
他の要因もあるため何とも言えませんが、1.8の方はとりあえずアップデートしてみるのもいいと思います。

### USBハブの種類
これが一番大きい要因だと思います。(といっても原因がよくわかりませんが、、)
私のPCにはUSB Aのポートがないためハブを使っているのですが、そのハブを変えたところ書き込みが上手くいきました。
成功した際に使ったのは[Anker PowerExpand 3-in-1](https://www.amazon.co.jp/gp/product/B09CYS54BH/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)で、失敗した際に使っていたのは[エレコム USBケーブル](https://www.amazon.co.jp/gp/product/B00ZEN4M0C/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)です。
成功したのはUSB3.0のハブで、失敗したのはUSB3.1のケーブルです。なにか関係あるのでしょうか、、ご存じの方は教えていただけると幸いです。
JavaScriptのスプレッド構文まとめ




JavaScriptで使うスプレッド構文について、初心者なりに勉強したので使用方法をまとめました。
ES2015(ES6)を利用しています
これ、使いこなせたらとても便利なんだろうなあ。。。（初心者）

## スプレッド構文とは
「...」を使用し、配列やオブジェクトを展開できる便利な構文
配列に使用する場合の用途としては主に以下の2点があります
1. 配列の展開
1. 配列の結合

### 配列の展開
以下例に示すように、「...」の後に配列変数を記述することで、配列を展開してくれます
```javascript:例
const array1  = [1,2]
console.log(array1) //=>[1,2]
console.log(...array1) //=>1 2
```


また**配列をコピー**して利用したい際にも、スプレッド構文は利用できます
例えば以下のように「=」で代入してしまうと、代入先の変数の内容を変更した場合、代入元の内容も変更されてしまいます
```javascript:例
const array2  = [3,4]
const array3 = array2
array3[0] = 100
console.log(array2) //=>[100,4]
```

ここで使えるのがスプレッド構文です！以下例をみてみましょう
スプレッド構文を利用してコピーした変数は、修正を行ってもコピー元の変数に影響しないんですね。とっても便利。
```javascript:例
const array2  = [3,4]
const array3 = [...array2]
array3[0] = 100
console.log(array2) //=>[3,4]
```

### 配列の結合
続いては配列の結合です。
以下例では、分割代入とスプレッド構文を利用して配列内の3つの要素を新たに1つの配列にまとめています
```javascript:例
const array4  = [1,2,3,4,5]
const [num1,num2,...array5] = array4
console.log(array5) //=>[3,4,5]
```

こんな感じで、**配列利用するときに色々便利なのがスプレッド構文**と初心者なりに理解しました
まだまだ勉強は続く
世界一わかりやすい「パブリックサブネット」と「プライベートサブネット」

# 0.はじめに

「パブリックサブネット」「プライベートサブネット」というサブネットの分類というのは、そもそもそういった設定があるのではなく、各サブネットが持つ**役割**をベースとした概念の俗称です

また、記事内でも誤った認識がある、現在時点では既に解釈が変わっている可能性があるのでご注意ください。
その場合はコメントでご指摘頂けますと幸いでございます。
記事はAWSでの利用を前提とした内容となっています。ネットワーク全般としては誤った内容である可能性もあります。

# 1.パブリックサブネットの定義

**「パブリックサブネット」**
**ルートテーブル**で**デフォルトゲートウェイ**への通信が**インターネットゲートウェイ**へ接続されているサブネットの総称です

各用語についても解説していきます

**「ルートテーブル」**
ルートテーブルは、外への通信を行う際にどういった経路で通信を流すか定義したテーブルのことです。
どのIPアドレスへの通信に対して、どういった経路を用いて接続を試行するか定義する事ができます。

**「デフォルトゲートウェイ」**
宛先が分からない通信に対してルートされるゲートウェイの名称です。
個別でルーティングが設定されているルーティング（xxx.xxx.xx.xx宛てはyyy.yyy.yy.yyに飛ばす）以外の宛先の通信は全てデフォルトゲートウェイへ転送される事になります。

AWSの場合は「0.0.0.0」（すべてのトラフィック）というルートテーブルの設定を加える事でデフォルトゲートウェイの設定が可能となります。
一般大多数のドメインへの接続、プライベートネットワーク外、インターネット上への接続すべてがこの「0.0.0.0」のルートテーブルを用いてルーティングされる事になります。

**「インターネットゲートウェイ」**
VPCとインターネット間の接続を可能とするVPCコンポーネントです。AWSリソースの中でも可用性、冗長性が非常に高く、ネットワークトラフィックに帯域制限が掛けられることは無いとされています。
VPCネットワークとインターネットを接続する門のようなものだと認識して頂ければ大丈夫です。

つまりパブリックサブネットとは、**事前に定義されていない宛先への通信（外部への通信）に対して、インターネットゲートウェイへ接続するようにルートテーブルで定義されたサブネットの事**を指しています。

# 2.プライベートサブネットの定義

パブリックサブネットに対して、プライベートサブネットはデフォルトゲートウェイがインターネットゲートウェイに接続されていないサブネットの総称になります。

ただプライベートサブネット上にあるリソースでもインターネットへOUTの通信をする必要がある事は多々あります。

OUTの通信ができないのであれば、インターネットへの接続ができないため外部からデータを取得したり、外部ライブラリのインストール、リポジトリへの接続ができなくなります。

そこで**NATゲートウェイ**の出番となります。

**「NATゲートウェイ」**
NAT ゲートウェイは、ネットワークアドレス変換 (NAT) サービスです。 NAT ゲートウェイを使用すると、プライベートサブネット内のインスタンスは VPC 外のサービスに接続できますが、外部サービスはそれらのインスタンスとの接続を開始できません。

**NATゲートウェイ**はインターネットゲートウェイと違い、OUTの通信のみを通すため、外部への接続は可能とし、外部から内部への接続は受け付けません。

そのため、外部からの接続が想定されるサーバー（ロードバランサーや、FTPサーバー、直接的に接続を受けるウェブサーバー等）を除いて、基本的にはプライベートサブネットに配置するべきです（データベースサーバー、ロードバランサーのターゲットとなるウェブサーバー、バッチサーバー等）

# 3.まとめ
**パブリックサブネット**と、**プライベートサブネット**は**ルートテーブル**による接続先がインターネットゲーウェイである事、それ以外である事で分類されます。

また、**インターネットゲートウェイ**は、外部から内部への通信を許可するため、原則として**パブリックサブネット**に配置されたリソースはインターネット上からアクセスを受け付ける事が可能となります
（インターネットゲートウェイのネットワークACLを駆使して、トラフィックを制限する事は可能です）
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-network-acls.html

一方で**プライベートサブネット**で一般的に使用される**NATゲートウェイ**は、**外部へのトラフィックのみを許可する**ため、セキュリティ的な担保は可能ですが、**AWSの料金としては圧倒的にNATゲートウェイの方が高価となります**
（**インターネットゲートウェイが原則としてそのものに課金が発生しないため**）

リソースやセキュリティ要件によって、柔軟に配置する先のサブネットを切り替えましょう。
プライベートネットワーク内の Node-RED でもパレットマネージャを使いたい！

# プライベートネットワーク内の Node-RED でもパレットマネージャを使いたい！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604208/c738915d-6062-b498-fce2-d54c2c4a680a.png)

## 何故、困っているか？

パレットマネージャはブラウザ側でカタログを読み込んでいるため、ブラウザ側がインターネットに接続できなければ、パレットマネージャを使用できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604208/629e2257-323e-97d8-7507-56a53241e349.png)

もちろん、ポッド（コンテナ）がインターネットにアクセスできれば、直接 `npm install` コマンドを実行することでノードは追加できるが、Node-RED 利用者にポッドを直接操作して欲しくない。


## 前提条件
以下の環境を想定しています。
- プライベート Kubernetes クラスタ上で Node-RED が起動しており、ポッドはインターネットアクセスできる環境になっている。（DMZやプロキシなど）
- ブラウザ側(クライアント)からは Kubernetes クラスタのサービスにはアクセスできるが、インターネットアクセスはできない。


## セットアップ
### 公式カタログを読み込ませるフローを作成する

1. `http in`, `http request`, `http response` ノードを配置し、それぞれをワイヤで結びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604208/377d1340-3d9e-ee39-c831-28bd885a7bd1.png)

1. `http in` を開き、`GET` メソッドで `/catalogue.json` を受けられるように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604208/74caa162-fb06-7df4-d64e-cdf76b0bbd51.png)

1. `http request` を開き、`GET` メソッドで公式のカタログ URL を設定し、出力形式は、`JSON オブジェクト` に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604208/3961413f-7dd3-94b4-8bd9-2d116879b6d2.png)

1. デプロイします。

### パレットマネージャ カタログを API から読み込むように設定する
1. Node-RED の[公式ガイド](https://nodered.jp/docs/user-guide/runtime/configuration) のエディタテーマに沿って`settings.json` を編集します。

1. `editorTheme.palette.catalogues` に `/catalogue.json` を追加します。

    ```diff:settings.json
      palette: {
    +   catalogues: [   // Alternative palette manager catalogues
    +     '/catalogue.json'
    +   ]
      }
    ```
1. ポッド(コンテナ) を再起動して、パレットマネージャを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604208/67ef1e74-9d86-cb9c-7cff-faf9052e7cd8.png)

1. アクセスできるようになりました🎉
Databricksノートブックのサイドバーが新しくなりました

こちらのアップデートです。

[New left and right sidebars in Databricks notebooks](https://docs.databricks.com/release-notes/product/2023/january.html#new-left-and-right-sidebars-in-databricks-notebooks)

:::note
**注意**
2023/1/10 8時時点では米国リージョンでは新サイドバーを確認できましたが、日本リージョンはまだでした。数日中にロールアウトされると思います。
:::

以下のような構成に変わります。元々の構成から大きな変更がある訳ではなくボタンがより目立つようになっています。以下の配置となります。

- 左側のサイドバー: [目次](https://qiita.com/taka_yayoi/items/141e49b155f4cad1bb34#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E7%9B%AE%E6%AC%A1)
- 右側のサイドバー: [コメント](https://qiita.com/taka_yayoi/items/db5411d5862bfb01d1b9#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)、[MLflowエクスペリメント](https://qiita.com/taka_yayoi/items/ba0c7f46ff7c3dbf87bb#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88)、[ノートブック改訂履歴](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%B1%A5%E6%AD%B4)

実際に試してみます。ノートブックを開くと以下のようなGUIとなっています。
![Screen Shot 2023-01-10 at 8.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/78ee3702-9349-c45a-e885-36edad9f4606.png)

赤枠が新たなサイドバーです。
![Screen Shot 2023-01-10 at 8.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ea812edf-f03a-1bb8-8cb0-c7d546f8f41c.png)

左側に一つだけあるボタンを押すと目次が展開されます。目次の右上の×をクリックすれば閉じます。
![Screen Shot 2023-01-10 at 8.28.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/478a52ae-60a8-f8c7-5f23-073033d458ea.png)

右側はコメント。
![Screen Shot 2023-01-10 at 8.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/98ca5f93-e449-1244-3ac7-09602fdc9fe0.png)

MLflowエクスペリメント。
![Screen Shot 2023-01-10 at 8.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6540c05-50f4-c17b-54fe-dae5e05f8878.png)

ノートブックの改訂履歴となります。
![Screen Shot 2023-01-10 at 8.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9313209e-5094-5931-bfba-41b61dd8ce7e.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
AWS Lambda Node18.xでSystem Manager(Paramter Store)にアクセスする方法

### はじめに

AWS Lambda, Node.js(18.x), System Manager(Paramter Store)で簡単なサーバーレスバックエンドを構築した時、Node.js 16.x以前とParamter Storeにアクセスする記述が変わったので変更点をまとめます。

---

### 対象となる読者

- AWS Lambda初心者の方
- AWS System Manager初心者の方

---


### Lambda実行環境

- Node.js 18.x

---

### ポリシーの作成とLambda関数の実装

AWS LambdaのデフォルトではParamter Storeにアクセスする権限がありません。そのためParamter Storeにアクセスするにはポリシーを設定し、そのポリシーを対象のLambda関数にアタッチ(権限付与)する必要があります。以下はParameter Storeにアクセスするポリシーのサンプルです。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}
```

[AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3)ではv2と比べて少し記述方法が変更されています。v3ではパッケージ分割されたためSDKのサイズを小さくして使用することが可能となりました。

```
// import the Lambda client constructor in v2 of the SDK
const Lambda = require("aws-sdk/clients/lambda");

// import the Lambda client constructor in v3 SDK
const { Lambda } = require("@aws-sdk/client-lambda");
```

System Manager(SSM)で設定したParameter StoreにアクセスするLambda関数の参考例

```ssm.js
// CommonJS require syntax
const { SSMClient, GetParametersCommand } = require("@aws-sdk/client-ssm"); 
const ssmClient = new SSMClient({ region: "ap-southeast-1" }); //対象のregion指定
const input = { Names: ['paramter1', 'paramter2'], WithDecryption: true };
const command = new GetParametersCommand(input);
const init_promise = ssmClient.send(command);

exports.handler = async () => {
    const data = await init_promise; // await inside handler
    
    let paramter1 = '';
    let paramter2 = '';
    let ssm = {};
    
    for (const i of data.Parameters) {
        if (i.Name === '取得したいParameter') {
            paramter1 = i.Value;
            ssm['paramter1'] = paramter1
        }
        if (i.Name === '取得したいParameter') {
            paramter2 = i.Value;
            ssm['paramter2'] = paramter2
        }
    }
    
    return ssm;
};
```

```index.js
const ssmFunc = require('./ssm.js');

// ssmの処理
```

※複数のParameterを取得したいため、[GetParametersCommand](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-ssm/src/commands/GetParametersCommand.ts)としましたが、取得するParameterが1つであれば[GetParameter](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-ssm/src/commands/GetParameterCommand.ts)で良いです。

---

### 参考文献
- [Using Node.js ES modules and top-level await in AWS Lambda](https://aws.amazon.com/jp/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/)
- [aws-sdk-js-v3](https://github.com/aws/aws-sdk-js-v3)
- [lambda(nodejs)で機密情報を扱うには？](https://note.com/daharas/n/n5097bdd3b85b)
【実験中】UnityでAmiVoiceを試す⑤

AmiVoiceがOculusLinkで認識するものの、実機で実行すると
「音声ファイルどこ？」と言われてしまったので
Wavの生成含めて実装を行ってしまえばいいのでは？と思ったのですが
参照先のフォルダ指定について、記事が探せたのでもう一度だけ試してみようと思います。

https://blog.hiros-dot.net/?page_id=7456

https://docs.unity3d.com/ja/2022.1/Manual/StreamingAssets.html

https://qiita.com/kumi0708/items/53ef36cdcefc0a8aa2ba

上から順に実証していきます。

①「ms-appx:///Assets/」を指定
→ダメでした・・・

②こちらはストリーミングについての内容なのですが、詳細なフォルダ構成が載っているため
　参考にできないかと考えました。

:::note info
Android は、圧縮された APK/JAR ファイル "jar:file://" + Application.dataPath + "!/assets" 内の
ファイルを使用します
:::

この部分を活用してみます。

```csharp
            string serverURL = args[0];
            string audioFileName = "jar:file://" + Application.dataPath + "!/assets" + args[1];
            string codec = args[2];
            string grammarFileNames = args[3];
            string authorization = (args.Length > 4) ? args[4] : null;
```

こんな感じに埋め込んで実行してみます。

→ダメでした...

③パスを拾って実行する
→上手くいきませんでした...

## そもそもの参照先を確認
以下のサイトを参考に、実機の参照パスを確認してみました。

https://qiita.com/w_yang/items/8458cd790607d14b1b36

・「persistentDataPath」のときのログ
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/98f29241-52b8-bfee-b481-5e71ee32e493.png)

・「dataPath」のときのログ
![bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/a3e38d5e-d895-c3d5-5617-52cff6af0e9f.png)

使うとしたら「persistentDataPath」と思われますが
試しに以下のように変更して実行してみます。

```cs
    public void Test()
    {
        strings[1] = Application.persistentDataPath + "/" + strings[1];

        HrpSimpleTester.HrpSimpleTester.Main(strings);

        amiVoiceText.text = HrpSimpleTester.HrpSimpleTester.text;
    }
```

結果：上手くいきませんでした...


ファイルパスの問題なのか、上手く認識ができていないようなので
Voiceの収集（AuidoClip）→　Wav変換　→　システムへファイルを投げる　を試してみようと思います。
React + TypeScript – 子コンポーネントから親コンポーネントの関数を実行する 

# コード

## Parent.tsx

親コンポーネントでは子コンポーネントにpropsとして使う引数(？)を渡す

```tsx
import { useState, useEffect } from 'react'

import Child from "./Child";

function Example() {
  const [task, setTask] = useState("");

  const handleClick = () => {
    setTask("task");
  };

  return (
    <div>
      <Child handleClick={handleClick}/>
      <div>
        {task}
      </div>
    </div>
  );
}

export default Example;
```

## Child.tsx

子コンポーネントではprops経由で関数を実行する

```tsx
function Child(props: any) {
  return (
    <div>
      <button onClick={props.handleClick}>Click</button>
    </div>
  );
}

export default Child;
```

# 環境

react@18.2.0

# 表示例

<img width="468" alt="image" src="https://user-images.githubusercontent.com/13635059/211426459-72f5013c-c5bb-47a6-bbe0-b0de8c4f0753.png">


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
NetBSDで古いarm

NetBSD 10.99.2での古いarmのサポート状況です。

|conf|CPU|ver|arch/evbarm|arch/arm|
|:--|:--|:--|:--|:--|
|GEMINI|CPU_FA526|v4|gemini|gemini|
|ARMADILLO210|CPU_ARM9|v4|armadillo|ep93xx|
|ARMADILLO9|CPU_ARM9|v4|armadillo|ep93xx|
|INTEGRATOR|CPU_ARM9|v4||ifpga|
|INTEGRATOR_CP|CPU_ARM9|v4||ifpga|
|MINI2440|CPU_ARM9|v4||s3c2xx0|
|MPCSA_GENERIC|CPU_ARM9|v4||at91|
|SMDK2410|CPU_ARM9|v4||s3c2xx0|
|SMDK2800|CPU_ARM9|v4||s3c2xx0|
|TS7200|CPU_ARM9|v4||ep93xx|
|MARVELL_NAS|CPU_ARM9E|v5||marvell|
|MMNET_GENERIC|CPU_ARM9E|v5||at91|
|MV2120|CPU_ARM9E|v5||marvell|
|ORION|CPU_ARM9E|v5||marvell|
|IMX23_OLINUXINO|CPU_ARM9E|v5||imx|
|IMX31LITE|CPU_ARM11|v6||imx|
|INTEGRATOR|CPU_ARM11|v6||ifpga|
|INTEGRATOR_CP|CPU_ARM11|v6||ifpga|
|RPI|CPU_ARM11|v6||broadcom|
|RPI2|CPU_ARM11|v6||broadcom|

名前の付け方がぐしゃぐしゃです。おそらく動かなくなってるものも少なくないと思われます。

これ以外に私のレポジトリにはstar(v4)とralink(v5)とmindspeed(v6)があります。

なぜこれを調べたかというと、v5のポートをしようとして、どれを元にするのがいいかを考えるためでした。marvelはいろいろsocがあったので、evbarmのコードはifdefの嵐で見通しが悪いのですが、実績があるのでこれにしました。imx23などは放置されて、動かなくなってる可能性が高いです。動かないコードを元に始めると確実にはまります。

前世紀のワークステーションなどに比べると、お手軽なことと壊れにくいのでこのこの辺のSOCが好きです。

armbsd.orgというサイトがありますが、古いarmは相手にされてないようです。
[Python]二次元配列を平坦化する

# 前提
この記事ではあくまで**単純な二次元配列**に限って扱っていく。
もっと多次元の配列、また階層にムラがある配列に関しては対応していない。

# 平坦化とは
```py
[[1, 2], [3, 4]]
```

みたいな二次元配列があったとき、これを

```py
[1, 2, 3, 4]
```

のように一次元にすること。

## 方法
**itertool（外部ライブラリ）** の関数を使う。
非破壊処理。

```py
import itertools

l = [[1, 2], [3, 4]]
l = list(itertools.chain.from_iterable(l))
```

ここで返される値は`iterable`オブジェクトであるため、適宜キャストする必要がある。
オブジェクトのプロパティを動的に設定する

JavaScriptでは、計算プロパティ名を利用することでオブジェクトのプロパティを動的に設定することができます。

計算プロパティ名は下記のように使用することができます。
```javascript
let i = 0
const a = {
  ['foo' + ++i]: i,
  ['foo' + ++i]: i,
  ['foo' + ++i]: i,
}
console.log(a); // { foo1: 1, foo2: 2, foo3: 3 }
```
オブジェクト`a`にプロパティ`foo1` `foo2` `foo3`を動的に設定することができました。
このように、計算プロパティ名を利用することでオブジェクトのプロパティを動的に設定することができます。

動的に設定された値にアクセスする場合は、基本的にブラケット記法でアクセスします。
```javascript
const space = ' ';
const a = {
  [space]: 'space',
}
console.log(a)         // { ' ': 'space' }
console.log(a[space]); // space
console.log(a[' ']);   // space
}
```
## 参考
[オブジェクト初期化子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer#%E6%A7%8B%E6%96%87)
[プロパティアクセサー](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors)
Laravelのクエリビルダでデータ更新

## 結論
```laravel
DB::table('[テーブル名]')
    ->where('[カラム名]', [条件に指定したい値]) // 条件が必要な場合はwhere()など指定可能
    ->update([
        '[カラム名1]' => [更新値1],
        '[カラム名2]' => [更新値2]
    ]);
```
【React Native】Cloud Functions側の処理 expo-server-sdkとFirebaseで通知機能を実装！

#### expo-server-sdk
expoPushTokenを使ってクライアント側に通知を送ることができます。

https://www.npmjs.com/package/expo-server-sdk

#### firebase-functions
クラウドサービスの構築と接続に使用するサーバーレスのランタイム環境です。
シンプルで一義的な関数を作成できます。`関数の定期実行`が可能です。

https://firebase.google.com/docs/functions

## Cloud Firestoreに保存されているデータを読み取り通知
今回は`１時間毎`に通知を送る仕様で作成します。データ構造は以下のとおりです。
シンプルにするためコレクション名を`時間`に、ドキュメント内のデータは`expoPushToken`と`body`の２つとしています。
![スクリーンショット 2023-01-03 20.42 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2210588/14f2bdb6-f739-785d-f6bd-4fafb632ea20.png)
※クライアント側の`expoPushToken`の取得方法や設定は以下のリンクをご参照ください。

https://docs.expo.dev/versions/latest/sdk/notifications/

#### Cloud Functions
`かたまり`の意味を持つ`chunks`に通知の情報をまとめます。
その後、`expo.sendPushNotificationsAsync()`により通知を行います。
```tsx
    let chunks = expo.chunkPushNotifications(messages)

    ;(async () => {
      for (let chunk of chunks) {
        try {
          await expo.sendPushNotificationsAsync(chunk)
        } catch (error) {
          ...
        }
      }
    })()
  })
```
全体のコードです。
```typescript:index.ts
import * as functions from "firebase-functions"
import * as admin from "firebase-admin"
import { Expo, ExpoPushMessage } from "expo-server-sdk"

admin.initializeApp()

interface DATA {
  expoPushToken: string
  body: string
}

exports.scheduledFunctionPushNotifications = functions
// 場所
  .region("asia-northeast1")
// 頻度:毎時０分　 左から「分、時、日、月、曜日」
  .pubsub.schedule("0 * * * *")
// タイムゾーン
  .timeZone("Asia/Tokyo")
// 主処理
  .onRun(async () => {
    let expo = new Expo()
    // 現在の日本時間を取得
    const japanStandardTime = new Date().toLocaleString("ja-JP", {
      timeZone: "Asia/Tokyo",
    })
    const nowHour = new Date(japanStandardTime).getHours().toString()

    // 現在の時間と一致する時間名のコレクション内の全データを取得
    const snapshot = await admin.firestore().collection(nowHour).get()
    const firestoreDatas = snapshot.docs.map((doc) => doc.data() as DATA)
    
    // 通知情報を保存する配列を作成
    let messages: ExpoPushMessage[] = []

    // コレクション内のデータをfirestoreDataとして一つずつ取得
    for (let firestoreData of firestoreDatas) {
      let pushToken = firestoreData.expoPushToken
      let body = firestoreData.body
    // ExpoPushTokenの有効性を確認する
      if (!Expo.isExpoPushToken(pushToken)) {
        console.error(`Push token ${pushToken} is not a valid Expo push token`)
        continue
      }
    
    //　一人ひとりの通知情報を保存用の配列に格納
      messages.push({
        to: pushToken,
        sound: "default",
        body,
      })
    }

    // 通知
    let chunks = expo.chunkPushNotifications(messages)
    let tickets = []

    ;(async () => {
      for (let chunk of chunks) {
        try {
          let ticketChunk = await expo.sendPushNotificationsAsync(chunk)
          console.log(ticketChunk)
          tickets.push(...ticketChunk)
        } catch (error) {
          console.error(error)
        }
      }
    })()
  })

```
Dart でのオリジナル例外、エラーの実装と型判定について

# はじめに

オリジナルの例外やエラーをスローするにはどうすればよい？それを判定するにはどうすればよい？を確かめてみました。

# 分かったこと

1. `Exception` は `implements` する
1. `Error` は `extends` する
1. 型は `is` で判定
1. 型は `.runtimeType` で表示可能
1. 型判定メソッドの仮引数は `dynamic` にしておけばいい

# 検証

```dart
// オリジナルの例外 その１
class MyEx01 implements Exception {}

// オリジナルの例外 その２
class MyEx02 implements Exception {}

// オリジナルのエラー
class MyError extends Error {}

// 型判定メソッド
void _printEx(dynamic target) {
  if (target is MyEx01) {
    print('1. 「MyEx01」を検出');
  } else if (target is Exception) {
    print('2. 例外を検出 [${target.runtimeType}]');
  } else {
    print('3. 不明なオブジェクト [${target.runtimeType}]');
  }
}

void main() async {
  try {
    print('\n--- throw MyEx01(); ---');
    throw MyEx01();
  } catch (e) {
    _printEx(e);
  }

  try {
    print('\n--- throw MyEx02(); ---');
    throw MyEx02();
  } catch (e) {
    _printEx(e);
  }

  try {
    print('\n--- throw MyError(); ---');
    throw MyError();
  } catch (e) {
    _printEx(e);
  }

  try {
    print("\n--- throw 'Hello !!'; ---'");
    throw 'Hello !!';
  } catch (e) {
    _printEx(e);
  }
}
```

```
--- throw MyEx01(); ---
1. 「MyEx01」を検出

--- throw MyEx02(); ---
2. 例外を検出 [MyEx02]

--- throw MyError(); ---
3. 不明なオブジェクト [MyError]

--- throw 'Hello !!'; ---'
3. 不明なオブジェクト [String]
```

# 参考

https://www.cresc.co.jp/tech/java/Google_Dart2/language/exceptions/exceptions.html

https://zenn.dev/iwaku/articles/2020-12-19-iwaku

https://programming-dojo.com/%E3%80%90dart%E5%85%A5%E9%96%80%E3%80%91%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86%E3%81%AE%E8%AA%AC%E6%98%8E/

https://qiita.com/lacolaco/items/2d02c79e8591733cc346

https://qiita.com/hyukix/items/339d095c034d676a7413
node.jsでalexaスキル その3

# 概要
node.jsでalexaスキル、やってみた。
練習問題やってみた。

# 練習問題
「キヨシを開いて」で、zundokoを返せ。

# サンプルコード

```
const LaunchRequestHandler = {
	canHandle(handlerInput) {
		return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
	},
	handle(handlerInput) {
		let speakOutput = '';
		let j = 0;
		while (j < 4)
		{
			if (Math.floor(Math.random() * 2) < 1)
			{
				j++;
				speakOutput += "ズン ";
			}
			else
			{
				j = 0;
				speakOutput += "ドコ ";
			}
		}
		speakOutput += "ドコ キヨシ";
		return handlerInput.responseBuilder.speak(speakOutput)
			.reprompt(speakOutput)
			.getResponse();
	}
};


```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d48b8422-8458-6b76-b165-3b60086459b1.png)


以上。
VSCode ユーザースニペットの\\の謎

# 困った

```latex:test.tex
\newcommand{\foo}{\{bar\}}
```

上記のような `\` を含む出力を得たい場合，

```json:latex.json
{
    "bad": {
        "prefix": "test",
        "body": ["\\newcommand{\\foo}{\\{bar\\}}",],
        "description": "bad",
    },
}
```

のように `\` $\rightarrow$ `\\` とすれば良さそうだが，実際に得られる出力は

```latex:test.tex
\newcommand{\foo}{\{bar}}
```

となってしまう．

# 解決

```json:latex.json
{
    "good": {
        "prefix": "test",
        "body": ["\\newcommand{\\foo}{\\{bar\\\\}}",],
        "description": "good",
    },
}
```

と最後の `\` を `\\\\` とすれば良い．

# なんで？
全然わからん．
2023/1/10主にITとかセキュリティの記事

【日本】政府、企業等にサイバー攻撃時の情報共有・公表の指針案発表。パブコメ募集(1/8)
https://sustainablejapan.jp/2023/01/08/cyber-attacks-communication/80743

Amazonを騙るQRコード誘導型のフィッシング詐欺が発生(1/6)
https://www.tsuhannews.jp/shopblogs/detail/70412

CAPTCHA画像をコマンドの組み合わせで回避するサイバー攻撃グループに注意(1/8)
https://news.mynavi.jp/techplus/article/20230108-2556320/

「支払いがまだです！」 携帯電話、通販サイト、税務署名乗る「偽メール詐欺」横行、知らないうちに口座使われて...被害防ぐ5つの方法がコレ(1/7)
https://news.infoseek.co.jp/article/20230107jcastkaisha202210453434/?tpgnr=it

Rackspaceのサイバー攻撃、原因はExchange Serverのゼロデイ脆弱性だった(1/8)
https://news.mynavi.jp/techplus/article/20230208-2556305/

2023年、ReFiがメインストリームに【オピニオン】(1/9)
https://www.coindeskjapan.com/169993/

クルマが「人格」を持つ日　AIが生み出す価値とは
本社コメンテーター　中山淳史(1/9)
https://www.nikkei.com/article/DGXZQOCD050GT0V00C23A1000000/

データ民主化、新たな胎動　スプリンターネットを超えて
Next World 分断の先に 9(1/9)
https://www.nikkei.com/article/DGXZQOUF016360R01C22A2000000/

1969年、個をつなぐネット誕生　冷戦がゆりかご
Next World 分断の先に　歴史×データ(1/9)
https://www.nikkei.com/article/DGXZQOUC052FP0V01C22A2000000/

「かつ」や「または」の条件を自由に指定できる関数DSUM、DAVERAGE(1/9)
https://news.mynavi.jp/techplus/article/Excel_Function-8/

1組織につき毎週2000件！4社に1社が被害に！深刻化するサイバー犯罪の実態(1/9)
https://dime.jp/genre/1526221/

Windows 11 Insider Preview、ユーザーに嫌われていた新機能を削除(1/8)
https://www.zaikei.co.jp/article/20230108/704781.html

WhatsApp、政府による遮断に対抗してプロキシサポートを全世界で提供(1/8)
https://www.zaikei.co.jp/article/20230108/704780.html
puppeteerのpage.evaluate内でのlogをサーバーに出力する

# 問題
puppeteerのpage.evaluate内の結果などデバッグで見たいときにそのままconsole.logを記述すると操作しているChromeのconsoleにでるだけでGUIなしではみれない。
node.jsサーバーの出力で見たい。
# 解決
ブラウザを作成するときのオプションに**dumpio:true**をつける
一例として以下
```sample.js
const browser = await puppeteer.launch({
    headless: true,
    dumpio: true,
    args: ['--lang=ja']
})
```
こうすることでブラウザ上でのconsole出力もnode.jsの出力に転送してくれる。
puppeteerのpage.evaluateに引数を渡す方法

サーバーでChrome動かしてスクリーンショット撮ったり色々するnode.jsプログラムで少し詰まったため備忘録

# 結論
外のスコープから変数を一つ渡したい場合
```sample.js
const a = 100;
page.evaluate(a=> {
    console.log(a)
},a);
```
複数の引数を渡す場合
```sample.js
const a = 100;
const b = 200;
page.evaluate((a,b)=> {
    window.scrollTo(a,b);
},a,b);
```
以下の書き方見やすくておすすめ
```sample.js
page.evaluate(({a,b,c,d})=> {
    ~
},{a,b,c,d});
```
Makefile実行時に、「make: 'test' is up to date.」と出る



## メッセージ

```
make: 'test' is up to date.
```

## 原因
Makefileがあるディレクトリ内に、同様のコマンドかディレクトがあるとこのようなエラーが出る模様。

## 対処方法

`.PHONY`で指定してあげるとよい

```Makefile
.PHONY: test

install:
	bundle install

test:
	rails test
```
(備忘録)Java概要

# Java
* 私の住んでる地域では、Javaによる開発需要(求人)がとても高く、それに合わせてJava学習の必要性を感じた。
* Javaは、求人数でもJavaScriptと並ぶほど多く、今後開発者として学んでおく必要性が高い言語だと思う。（PAIZA基準）
* そのJavaの特徴を、Rubyと比較しながら、覚えていきたい。

# Ruby on Railsの特徴

* 短期間でプロダクトのリリースが可能
* 言語学習のコストが低い
* スタートアップでよく使われる（リリースが早い為）
※Ruby on Railsの開発者であるDHHは、Ruby on Railsに関して、"Javaの典型的なフレームワークより１０倍以上の生産性がある"とアピールしてた。

# Javaの特徴

* アプリケーションの仕様変更を行いやすい
* セキュリティが強固である
* 長期間にわたる保守・運用がしやすい
* 実行速度が速い
* 大手企業の基幹システムなど大規模開発に適した言語

# Rubyと比べてJavaが難しいと言われる理由

## ①覚えるルールやコードの記述量が多い
* Railsは、アプリケーション開発をパターン化することで開発者の負担を減らしている。
* Javaは、自前での実装が必要となるケースが多くあるが、それによって組織や案件ごとに異なる細かなニーズの違いを実装することができる。
* Javaのルールやコードの多さは、開発ツールの補完機能などの活用で省力化できる。
※ そのため、Java学習の際はコードの書き方だけでなく、ツールの効率的な使い方についてもしっかり習慣化することがが大切である。

## ② オブジェクト指向を理解していないとコードの書き方がわからない

* RubyもJavaもオブジェクト指向の言語であるが、開発者に求められるオブジェクト指向の理解度が異なる。

* 例えば、Railsで「コントローラーを作成」することは「ApplicationControllerクラスを継承したコントローラークラスを作成すること」になるが、Railsでは「インスタンスの作成やメソッドの呼び出し」を「自動的」に行なってくれてるので、「クラスやインスタンスを扱っていた意識」があまりない。

* Javaでは開発者がオブジェクト指向を意識してクラスを利用する必要がある。

## ③ 開発に着手する際やエラーが発生した時、必要な記事が見つけにくい
* Rubyでウェブアプリ開発の際に、使用するフレームワークはほぼRails一択であるが、Javaで使用される開発ツールの種類は多い。
* Javaではフレームワークやビルドツール（作成したコードやライブラリを、実行可能なファイルに変換するツール）の種類が数多くあり、また、ツールごとに使い方やコードの書き方が大きく異なる。
⏩よって、単にJavaの記事を検索してもツールが違えば自分の開発に適用することはできない。
* Javaに関する記事の検索は、使用している「ツールの名称」も検索ワードに必ず含むようにしないといけない。
クリスマスにHTML5プロフェッショナル認定 レベル2を取得しました

2022年10月にHTML5プロフェッショナル認定試験 レベル1(ver2.5)、クリスマスにレベル2(ver2.5)に合格したため、それぞれの試験を受けた感想や勉強法を記載します。

# HTML5プロフェッショナル認定試験 レベル1(ver2.5)

## 使用教材

以下の教材を利用しました。
- Ping-t　最強Web問題集（※有料コンテンツです）
- HTML5プロフェッショナル認定試験 レベル1 対策テキスト&問題集 Ver2.0対応版

勉強は8月ごろに開始したため、ver2.0対応版のテキストを購入しました。
現在はver2.5対応版のテキストが出版されているため、そちらの利用がおすすめです。
ただ、ver2.0とver2.5で出題範囲は大きく変わらないため、すでにver2.0を持っている場合、改めてver2.5対応版を購入する必要はないと思います。

## 勉強方法

最初に対策テキストを1周したのち、問題演習としてPing-tを利用しました。
Ping-tはヒット率が100%になるまで模擬問題を繰り返しやりました。

## 試験の感想

Ping-tの問題は実際の試験問題よりやや難しいかなという程度でした。
最初にPing-tの模擬問題を実施した際は、正答率は60%ほどでした。
レベル1の合格ラインは65点のため、テキストだけでも合格を目指すことは十分可能だと思います。

本番の試験では記述式の問題が出題されるため、恐々としていたのですが、実際に出題されたのは1問だけでした。
それも、CSSの内容を読み、対象の要素内容のフォントサイズを回答するものであるため、計算して数字を入力するだけでした。

# HTML5プロフェッショナル認定試験 レベル2(ver2.5)

## 使用教材

以下の教材を利用しました。
- HTML5プロフェッショナル認定試験 レベル2 対策テキスト&問題集 Ver2.0対応版
- HTML教科書 HTML5プロフェッショナル認定試験 レベル2 スピードマスター問題集 Ver2.0対応

レベル1と同様、対策テキストはver2.5対応版がすでに出版されているため、そちらの購入をお勧めします。
ver2.5ではES6(ECMAScript2015)以降の新機能が出題範囲に追加されおり、重要度（試験での出題率）も高いです。そのため、ver2.0対応版を持っている方でも、改めて購入するのはありだと思います。

スピードマスター問題集は各分野ごとの問題集+模擬問題が2回分という構成です。

## 勉強方法

最初に対策テキストを1周したのち、スピードマスター問題集を1周しました。
レベル2の総学習のうちおよそ半分はJSの文法+ES6以降の新機能に時間を費やしていました。

## 試験の感想
スピードマスター問題集の問題は実際の問題に近かったです。
ES6からの新機能については6問ほど出題がありました。実際にコーディングする際もアロー関数式やletなどは使用するため、しっかり勉強する価値があると思います

アロー関数式については以下のようなthisのバインドについても試験範囲のため、文法だけでなく特性についても抑えておく必要があります。
```javascript:アロー関数式によるthisのバインド例
<body>
	
	<div>
		<input type="button" id="input" name="mybutton" value="push me">
	</div>
	<img src="" id="output">

	<script>

		function myObj() {
			this.name  =  'myObj',
			this.onClickFunc1 =  function () {
				console.log(`this name is ${this.name}`);
			},
			this.onClickFunc2 =  () => {
				console.log(`this name is ${this.name}`);
			}
		}

		let myInstance = new myObj();

		const input = document.getElementById('input');
		input.addEventListener('click', myInstance.onClickFunc1);
		input.addEventListener('click', myInstance.onClickFunc2);

	</script>
</body>
```
ボタンを押したときのコンソールは、以下の表示内容になります。
```
this name is mybutton
this name is myObj
```

記述式の問題は2問ありました。レベル2と同様、出題の割合は低めのようです。
2問とも、windowオブジェクトのプロパティ名を記述する問題だった気がします。
npmの-saveオプションを惰性でつけてた話

# --svaeオプションはいらない
更新古い記事とかを鵜呑みにして**以下のコマンドを実行**とかをそのままやると無駄に--saveつけてることがありますよね。いままでなーーんにも考えてこなかったし、しかもさして実害がないから放置してたけどなんやろと思って調べたので備忘録。

# --saveオプションとは
npm initをすると以下のようなpackage.jsonが作成されますね。
```package.json
{
  "name": "Example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
  }
}
```
この中の"dependencies"にこのパッケージを使うのに必要なパッケージが記載されておりpackage.jsonがあるディレクトリで**npm install**をすると必要パッケージがinstallされます。
昔は
```
npm install　packageName
```
としただけではこの"dependencies"に記述を追加してくれなかったようで
```
npm install --save packageName
```
としていましたがnpm5.0.0からはオプションつけなくても記述してくれるようになったのでいらないらしいです。
VS Code のよく使うショートカット キー まとめ【Windows・Mac版】

<h1>概要（作成全体の流れ）</h1>
今回はVS Codeでよく使用されるショートカットキーを紹介になります。

Windows、Mac両方のコマンドをまとめていますので、ご参考になれば幸いです。
参考にした動画もありますので最後にのさたいと思います。

<h1>ショートカット一覧 【Windows・Mac】</h1>
今回ご紹介するのはよく使用されるショートカットには

「コピー/Cmd + C（Ctrl + C）」「切り取り/Cmd + X（Ctrl + X）」「貼り付け/Cmd + V（Ctrl + V）」
「やり直し/Cmd + Z（Ctrl + Z）」「全選択/Cmd + A（Ctrl + A）」「上書き保存/Cmd + S（Ctrl + S）」

などの皆さんが知っているであろうショートカットは省いていおりますのでご了承ください。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055577/96a9ff50-c59a-cbed-86a2-ff88873a23b1.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055577/2c3ebaa2-e51a-79cc-8509-da43d9e7eea2.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055577/c1569a2e-89b0-1c37-eb67-2075c6d78f40.png)


<b>参考動画</b>

https://www.youtube.com/watch?v=cNyvefTJOcM&t=1313s

<h1>まとめ</h1>

画像のつなぎめが切れて少し分かりづらいかもしれませんが、

Windows・Macでのショートカットをまとめさせていただきました。

ご参考にしていただけら幸いです。