OmniAICreator/Qiita-1.07M huggingface dataset:
便利なツール3：Awesome Screenshotの始め方と使い方

## どんなツール?
- スクショと動画が撮れるツール

### 他のスクショが出来るツールと何が違うの?
- スクショした画像にそのまま注釈（枠や矢印など）を入力できる
    -  Awesome Screenshotを知らなかった過去の自分は「スクショ→パワポに貼り付け→注釈を入れる→それをスクショ」という苦行をしていました。
- Webページ全体をスクショ出来る!!
    - 人生で1回は「Webページを1枚のスクショにしたい。」と思った事はあるはずです。
    - それができます。
- 動画も撮れる
    - Awesomeを知らない時、エンジニアの方から動画が送られた時は衝撃でした。


### 始め方
1. [ココ](https://chrome.google.com/webstore/detail/awesome-screenshot-and-sc/nlipoenfbbikpbjkfpfillcgkoblgpmj?hl=ja)をクリック
1. 赤枠をクリック![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/da8298cd-bb17-27a9-f9b0-bd67b08b237c.png)
1. 「拡張機能を追加」をクリック
1. おしまい（下記のような画像がでる）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/4457b8c7-362d-9569-3140-f91f5c9fa062.png)
1. 追加された事を確認する為、赤枠をクリックしてAwesome Screenshotがあるか見る![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/4da4e802-a3db-252a-2ee8-059ec6d55389.png)

### 使い方：スクショ編
1. 赤枠をクリックしてAwesome Screenshotを選択
    - Awesome Screenshotを固定（ピン止め）すると黄色の矢印みたいに出るので個人的におススメ![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/c526ed7f-9459-480b-d8dd-962e30a7479f.png)
1. 赤枠をクリックすると枠や矢印などの注釈入れや編集も出来ます!!![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/20d89092-d0ae-c2ab-37da-8c612090da8f.png)
1. 編集が終わったら状況によって使い分ける
    - すぐどこかへ貼り付ける場合「Copy」
    - 保存したい場合「Done」![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/d3772563-695b-c4f5-8389-07ae8b37625a.png)

### 使い方：Webページを全部スクショする編
1. スクショしたいページでAwesome Screenshotをクリック
1. 赤枠のフルページをクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/e01dffc8-55cc-a7f0-97bd-5236b428098b.png)
1. 読み込みが始まるので、じっと待つ
1. 読み込み完了!実際に読み込んだ画像![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/68a61850-ce1d-fb72-63fc-2782a2ad94ea.png)

### 使い方：動画編
1. 動画を撮りたいページでAwesome Screenshotをクリック
1. 「レコード」をクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/7bcb071d-21c3-d598-1216-f8e8dbffe527.png)
1. 「配信開始」をクリック

### 最後に
こんな素敵なツールを無料で使わせてもらい、ありがとうございます!
Max8【Bang / printオブジェクトにラベル】

初めまして。
前回に引き続き、しばらく放っておいたMax8を触っていきます。

Max8を起動　> help > reference > docs > tutorialでチュートリアルを見てみる。
※見る用はブラウザ（日本語に訳して）で、触る用はソフトウェアからの二つに分けるのがオススメ。

## Tutorial2:Bang!
![スクリーンショット 2022-10-22 22.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2165178/a36099a0-3c06-fe38-aadb-8d0c0d28523d.png)

①
一番左のパッチから、Bangボタンをprintオブジェクトに繋いでいます。
「<click me！」を押下し、MaxConsoleを確認すると、「print・bang」と表示されます。
Bangボタンにはイベントを発生させる機能があるみたいです。そして、printオブジェクトはMaxConsoleに結果を表示する機能があるので上記のような挙動が確認できます。

②
ひとつ隣のパッチです。このオブジェクトとオブジェクトを繋ぐひとつの組み合わせの事をパッチと呼ぶみたいです。
このパッチと先ほどのパッチの違いは中間にMessageボックスを挟んでいる事です。
挙動は想像通りで、Bangボタンを押下すると、MaxConsoleに「print・Gotcha!」と表示されます。

③
その隣のパッチです。Bangボタンが３つあります。それぞれの挙動を確認すると以下のようになります。
1.one・bang one・bang
2.one・bang
3.one・bang
一番上の、茶色いBangボタンを押下した時だけ、MaxConsoleには２回メッセージが表示されています。
これはBang2つを経由してprintオブジェクトに繋がっているためです。
（色は見やすくするためだけに色分けしているようです）
そして、printとオブジェクトには引数に「one」を設定しています。

④
その隣のパッチです。先ほど同様Bangボタンが３つありますが、配列が異なるだけで挙動が違います。
それぞれの挙動を確認すると以下のようになります。
1.several・bang several・bang several・bang
2.several・bang
3.several・bang
一番上の、茶色いボタンを押下した時だけ、MaxConsoleに3回メッセージが表示されています。
先ほどとの配列の違いをみてみると、一番上の茶色いBangボタンがprintオブジェクトに直結している点です。
これにより、printオブジェクトには３にBangイベントが送られます。

⑤
一番右のパッチです。ご想像通りの結果を確認できます
1.many・How
2.mane・do
3.mane・I
4.mane・love
5.mane・thee?
ここで重要なのは順番です。パッチャー内のオブジェクトの空間構成には規則があり、ひとつのオブジェクトが複数の宛先を持つ場合、右から実行されます。

## まとめ等
・パッチャー上でbを押すとBangボタンをショートカット入力できます。
・アウトレットが複数あり場合右から順に、インレットは入ってきた順に処理を実行します。
・Bangボタンはイベントを発生させます。
・printオブジェクトは引数を持たせることができます。
・引数がない場合、Bangがそのまま引数となります。
【未経験】ポートフォリオ開発記録 #01

# はじめに
はじめまして！
自分はweb系の自社開発企業への転職を目指しています。
これから転職活動を進めていくにあたってポートフォリオの開発をしていきます。
その際に、機能実装の流れや詰まったことなどを備忘録的な感じで記録していこうと思っています。

今回は、現在考えているサービスの簡単な概要と、使用技術についてまとめられたらと思います！

# サービス概要
早速ですがサービスの概要です。

現在アイデアとして考えているサービスは、音楽再生機能付きのポモドーロタイマーです。
開発しようと思った背景としては、自分はプログラミングの勉強にポモドーロタイマーを活用しているんですが、自分の好きな音楽とポモドーロタイマーを合わせようとすると、どうしても複数の操作が必要なってしまって地味に面倒でした。
この問題は僕の身の回りにも多いようでした。
これからwebエンジニアとしてやっていくなら勉強はずっとしていくと思いますので、ポートフォリオだけで終わらず長く使えるようなサービスにできればと思い考案しました。

イメージとしてはこんな感じです。


![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887087/7a8b4dcb-3ab2-207b-8d04-0e9b2675cee2.png)

ざっくりと以下のような機能を考えています。

- ポモドーロタイマー機能
- 音源選択機能（YouTubeやSpotifyを埋め込み形式かAPIでなんとかする）
- プレイリスト機能（タイマーの設定と音源の設定を保存）
- 統計機能（週ごとの作業時間の比較など）
- ランキング機能

# 使用予定技術
まだ決まっていませんが、使用したい技術を記載します。

### フロントエンド
- `React`
- `TypeScript`

### バックエンド
- `Ruby 3.1.2`
- `Ruby on Rails 7.0.4 ( APIモード）`

### インフラ
- `Docker`, `Docker-compose`
- `AWS ( ECS Fargate / ECR / ALB / RDS / S3 / CloudFront / Route53 )`
- `CircleCI（時間があれば）`
---

##### 使用技術はまた変わるかもしれません...


# 最後に
初めての投稿でしたので見づらい箇所や説明不足な点があるかもしれません...

かなり薄い内容になってしまいましたが、とりあえずはこんな感じでポートフォリオの開発を進めていきます！

次回は環境構築になりそう。

ご覧いただきありがとうございました！
React Hook Form+yupでフォームの値の重複チェック

Reactには[React Hook Form](https://react-hook-form.com/)というフォームのバリデーションやらを実装できるライブラリが存在します。これにyupを合わせることでバリデーションの定義をより簡単に実装することができます。

## やりたいこと
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/97145e84-d2d2-97a0-2f25-bc068b77177a.gif)

DBに存在する値の時もエラーを出したい。

## 実装
最初はこんなふうに実装していました。
```form.tsx
const onSubmit: SubmitHandler<FormInput> = async (data) => {
    const response = await GetAPI("http://localhost:8000/api/hoge", data)
    if(response.status === 400){
        //ここでエラー処理
    }else{
        //ここに正常処理
    }
}
```
ここでいうGetAPIはユーザー名やパスワードからユーザーマスタを検索するfetchやaxiosだと考えてください。
最初はやり方がわからなくて,submitの中でAPIを送信してバックエンドでバリデーションを行ってました。その結果をフロント側でレスポンスのステータスで判断してメッセージを表示していたりしました。これだとバリデーションを行い、通ったはずなのにもう一度バリデーションを行うという流れになってしまい気持ち悪いです。

## yup.test()
調べるとyup.test()を使うと動的なバリデーションが実装できるみたいでした。
```form.tsx
const schema = yup.object().shape({
    username:yup.string().required("必須入力です").test("バリデーション名", "バリデーションメッセージ", (input)=>{return true})
})
```

最終的にはこうなりました。

```form.tsx
const schema = yup.object().shape({
    username:yup.string().required("必須入力です").test("sameUsername", "既に使用されている名前です。", (input)=>{UsernameValidation(input)})
})
```

```validation.ts
export async function UsernameValidation(username: string | undefined){
    if (username === undefined){
        return true
    }
    const response = await GetAPI("http://localhost:8000/api/hoge", username)
    if (response.status === 200){
        return false
    } else {
        return true
    }
}

```

ユーザー名が存在しないときに返り値がtrueなのはこのバリデーションが重複の確認しか行わないためです。またレスポンスのステータスが200(正常終了)の時はユーザーが存在するためfalse。それ以外の時はユーザーが存在しないとみなしtrueを返しています。

## まとめ
yupは非常に便利でこのような重複チェックやパスワードの再入力の一致なども簡単に実装できます。今回のだとレスポンスのステータスが200の時に失敗するという直感とは逆になってしまったが少し不満ですが、動きとしては今のところ問題ないのでとりあえずこれでやっています
【Linux】よく使うブレース展開パターン

# ブレース展開について
Bash等でよく使われる便利な機能で、{}内で指定したパターンに沿ってリストを作成するものです。
ループ内でインクリメントしてファイルを生成しようとすると若干コマンドを作るのに時間がかかりますが、ブレース展開を使用する事で簡単にファイルを作成する事が出来たりします。

{}内で`,`や`..`を使用して、リストを作成します。便利な機能なので、覚えると使う場面は割とあるんじゃないかなと思います。

## 自分がよく使うパターン

自分がよく使うパターンをいくつか記載しました。
※業務で使うパターンが増えたら更新していこうと思います。

```shell_session:複数ファイル/ディレクトリの作成
[test_01@localhost tmp]$ touch test_{01..03}.txt
[test_01@localhost tmp]$ ll
合計 0
-rw-rw-r--. 1 test_01 test_01 0 10月 22 21:34 test_01.txt
-rw-rw-r--. 1 test_01 test_01 0 10月 22 21:34 test_02.txt
-rw-rw-r--. 1 test_01 test_01 0 10月 22 21:34 test_03.txt

[test_01@localhost tmp]$ mkdir test_{nyao,wan,gao}
合計 4
drwxrwxr-x. 2 test_01 test_01  6 10月 22 21:41 test_gao
drwxrwxr-x. 2 test_01 test_01  6 10月 22 21:41 test_nyao
drwxrwxr-x. 2 test_01 test_01  6 10月 22 21:41 test_wan
```

```shell_session:ファイルに書き込み
[test_01@localhost tmp]$ echo 070-2525-{0001..0030} > test_01.txt
[test_01@localhost tmp]$ cat test_01.txt | tr ' ' '\n'
070-2525-0001
070-2525-0002
070-2525-0003
070-2525-0004
070-2525-0005
070-2525-0006
070-2525-0007
070-2525-0008
070-2525-0009
070-2525-0010

略


```
ウディタで連番画像をつかったアニメーションを再生する方法

# という記事を書こうと思ったのですが...
ウディタ2.26で「動画再生機能」なるものが実装されたのですね。素敵です。
というわけで、この記事は10年くらい前のウディタ(2.0xとか)を使っていた筆者の、昔話を語る記事になります。
単に動画が再生したい方は、是非この素敵な機能を使ってみてください。
## とはいえ
何らかの要請で連番画像を連続で表示するような機会はあるかもしれませんし、
なによりウディタで連番画像を表示する機能を実装すると、ウディタの文字列の取り扱いに結構詳しくなれると思いますので、
われこそはと思われる方はこの記事とにらめっこしつつ是非自前で実装をしてみてください。
# さぁやっていくぞ
なにはともあれまずは全体像を把握するため、まずはコモンイベントの全体像をスクリーンショットしました。
私がだいぶ昔に実装したもので、実際に発売されているゲームで使用したイベントを、Qiita向けにいろいろと整形したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968407/5cb02eee-68a4-1881-08d5-afba03ad6784.png)
このままだとよくわからないと思うので、機能ごとに色分けしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968407/db94a23b-e8ff-acff-97d5-1c80d78e5cc1.png)
上から、
1.初期化処理(黄)
2.画像パスの作成処理(緑)
3.ピクチャの表示処理(青)
4.ループ終了処理(赤)
5.アニメーション終了処理(オレンジ)
の流れになっています。
それぞれ順に説明していきますよ。
ここまでですべてを理解できた方は、これ以上この記事から得られることは無いかとおもいますので、
「いいね」だけ押してからブラウザバックでよろしくお願いします・ｗ・
## 初期化処理
コモンイベントではセルフ変数は内容が破棄されるため、あえて初期化を行う必要は無いといえば無いのですが、
通常イベントではセルフ変数は保存されるので(なのでゲームのセーブができる)どちらでも初期化を行う癖を付けておいたほうが良いように思います。
また、コモンイベントでは変数にニックネームを付けることができ、ここではCSelf0にindexというニックネームをつけています。
セルフ変数使用状況ボタンを押下することでセルフ変数に名前を付けることができますので、コモンイベントが複雑化してきたら、コモンイベントを見返すことになる未来の自分のために、ぜひ使ってあげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968407/bc3296b8-f8e2-b190-bdb5-60e4a0aef9c0.png)
CSelf0にindexという名前をつけてあげたので、今回はCSelf0にループ回数を格納してあげることにします。
つまり、CSelf0が0であれば0枚目、CSelf0が100であれば100枚目の画像を表示することができればいいわけです。
## 画像パスの作成処理
通常イベントでは文字列をセルフ変数に格納することはできませんが、コモンイベントでは文字列をセルフ変数に格納することができます。
文字列が格納可能なセルフ変数はCSelf5~CSelf9までの5個です。
今回は連番画像をlogo_0000.pngからlogo_0205.pngまで用意しましたので、
CSelf0が0ならlogo_0000.png、CSelf0が100ならlogo_0100.pngを表示すればいいことがわかります。
文字列入力ボックスでコモンセルフ変数を埋め込みたければ、\cself[number]という特殊な文字列を使うことで実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968407/bc5e3788-c558-1102-9eb1-4bf09ae34352.png)
このやり方で、CSelf0が3なら、000\cself[0]と書くことで、0003になってくれるわけです。
ただし、単純にこのままだとCSelf0が333になったときに000\cself[0]だと文字列が000333になってしまうので、
桁数に応じで000\cself[0],00\cself[0],0\cself[0]となるように分岐を行っています。
## ピクチャの表示処理
ピクチャの表示はファイルパスを通じて行うことができます。
今回はCSelf5にパスを格納していますので、ピクチャ表示機能でファイルパスにCSelf5の文字列を代入すればいいわけです。
先程は文字列入力ボックスで\cself[number]という特殊な文字列を使ってコモンセルフ変数の内容を埋め込みましたが、
数値入力ボックスではそれとは別の1,600,000+numberという特殊な数値を使ってコモンセルフ変数の内容を埋め込みます。
(どの入力欄が文字列入力ボックスで、どの入力欄が数値入力ボックスなのかは・・・あんまり区別はよくわかりません!)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968407/318071f2-dca9-9a9d-2a4a-03ff1649ae8a.png)
今回CSelf5にパスが入っていますので、1,600,000+5=1,600,005をファイル欄に入力するわけです。
これで変数に格納したパスを用いた画像の表示ができました。

その後はアニメーションをするために1フレーム待ってあげて(待たないと、同一フレーム内にすべての画像が表示されてしまいますよ)最後の画像が表示されたらループを抜けるようにしてあげた後、ピクチャの表示を終了して連番画像を用いたアニメーションの再生は完了です！

# おわりに
連番画像をつかったアニメーションを実装しつつ、ちょっと不思議なウディタの文字列の取り扱いや特殊文字・特殊な数値の話でした。
もっと特殊文字、特殊な数値に興味がある方は、こちらも是非ご覧くださいませ。
[特殊文字 一覧](https://www.silversecond.com/WolfRPGEditor/Help/06specialword.html)
[変数呼び出し値　一覧](https://www.silversecond.com/WolfRPGEditor/Help/06valueget.html)
Webdataset のデータ(主に画像)を確認したいメモ

## 背景

LAION-400M(4 億枚の画像とテキストペアのデータセット)をダウンロードして管理したいメモ
https://qiita.com/syoyo/items/a224061b884378fb12fd

などで, webdataset 形式の画像データをぺろっとお手軽に目視(主に Linux で)したい...
(きちんとデータがダウンロードできているか, データが壊れていないかなどチェックしたい)

たとえば laion-face で. 顔画像だけのデータセットのはずなのに, ピーナッツの画像がありました :sweat_smile: 
(キャプションは `Boiled Peanuts Recipe — Dishmaps`)

あとはストックフォトなどの透かし入りの画像があったり... :sweat_smile: 

## 画像ブラウザ

サイズ合わせてサムネイルつくってくれる nomacs がよいでしょうか...

![Screenshot from 2022-10-22 21-59-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/292bfc6a-4b94-fbb1-229b-2cc28eea5eba.png)

画像比較など, ML に特化したものとしては, HandyView(GFPGAN の作者がつくっている)があります.

https://github.com/xinntao/HandyView

## tar 内の画像をブラウズしたい

tar を展開することなく, 直接 tar 内の画像をブラウズしたい...

現状ではいいツールはなさそうです...

一旦 tar 展開するしかなさそう. 

そのうち webdataset に対応した画像ビューアとかでてくるかもしれませんね.

### Parquet ファイルの内容確認

これは webdataset そのものではないですが, 最近の機械学習用のデータセットットのメタデータは parquet で提供されていることが多い気がします.

https://stackoverflow.com/questions/49367372/gui-tools-for-viewing-editing-apache-parquet

とりあえずは Tad がよさそうです!

https://www.tadviewer.com/


![Screenshot from 2022-10-22 22-18-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/54a07f47-acc9-5d39-a2f3-059f044ff0bd.png)


## 人力画像キュレーション

なにかしら専用ブラウザツールつくり, 1 人 1 枚 0.5 秒で判断(e.g. 単純に顔画像である, 顔画像でないなどの判断, NSFW かの半段)とすると...
1 時間で 7000 枚, 8 時間労働で 5.6 万枚/day いけます.

一日 1~2 時間であれば 1 ヶ月 10 万枚程度なら一人で人力目視できそうでしょうか...

実際は顔認識とか組み合わせしたもののとりこぼれを人力判断になるでしょうから, 学習用データセットの枚数が 100~1000 万枚なら, 一人でなんとかなるかも?
(10 人雇うか, 10 ヶ月(!)続けられれば 1 億枚はキュレーションできそう)
React,Vue.jsの前にJavaScriptを習得すべし！(三項演算子?:,と論理演算子&&||)

# 三項演算子
これは```ある条件?条件がtrueの時　: 条件がfalseの時```のような書き方をします。
実際に手を動かして色々組み替えて動かしてみてください！

```js
const val1 = 1 > 0 ? "trueだ" : "falseだ！";
console.log(val1);

//trueだ
```

```js
const val1 = 1 > 10 ? "trueだ" : "falseだ！";
console.log(val1);

//falseだ！
```
```js
const score = 2000;
console.log(score.toLocaleString());
//2,000 
```

```js
const score = 2000;

const Num = typeof score === "number" ? score.toLocaleString() : "数値を入力";  //typeofは型を判定
console.log(Num); 
//2,000 
```

```js
const score = "ゴルフ";
const Num =
  typeof score === "number" ? score.toLocaleString() : "数値を入力せよ";
console.log(Num);

//数値を入力せよ 
```

```js
const Sum = (score1, score2) => {
  return score1 + score2 > 1000 ? "1000を超えています" : "この範囲ならok";
};
console.log(Sum(400, 300));  //score1 + score2
//この範囲ならok 
```

```main.js
const A = true;
let result = A ? "true" : "false";

// if(A) {
//   result = "true";
//  } else {
//   result = "false";
//  }

console.log(result);

//true
```

```main.js
const A = 10;
let result = A ? 10 : -5;

console.log(result);
function resultA() {
  return A ? "true" : "false";
}

console.log(resultA());

//10
//true
```

```main.js
const A = 0;
let result = A ? 10 : -5;

// if(A) {
//   result = "true";
//  } else {
//   result = "false";
//  }
console.log(result);
function resultA() {
  return A ? "true" : "false";
}

console.log(resultA());

//-5
//false
```

# 論理演算子
論理演算子は```&&や||```を使います。

```js
const logic1 = true;

const logic2 = false;

if (logic1 || logic2) {
  console.log("1か2がtrue");
}

if (logic1 && logic2) {
  console.log("1か2がtrue");
}
//1か2がtrue
```


```js
const logic1 = true;
const logic2 = true;

if (logic1 || logic2) {
  console.log("1か2がtrue");
}

if (logic1 && logic2) {
  console.log("1も2もtrue");
}

//1か2がtrue 
//1も2もtrue
```

||について説明します。

```||は左側がfalseになる時に右側を返します。```
下のコードを例に見ていきます。

```js
const sum = null; //nullはfalseと見られる
const score = sum || "点数がない";

console.log(score);
//点数がない 
```

```js
const sum = 100;
const score = sum || "点数がない";

console.log(score);
//100
```

```js
const sum = 1000;
const score = sum && "得点が出た";
console.log(sum);
//1000

```

&&を見ていきます。```&&は左側がtrueなら右を返します```。
```js
const sum = 1000;
const score = sum && "得点が出た";
console.log(score);
//得点が出た
```

```js
const sum = null;
const score = sum && "得点が出た";
console.log(score);
//null
```



# 資料

https://www.udemy.com/course/modern_javascipt_react_beginner/

https://www.udemy.com/course/react-complete-guide/
sudo apt install cuda cuda-drivers でE: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing? がでちゃう問題を解決よ！

```
sudo apt install cuda cuda-drivers
```
機械学習やりたくてね、cudaをインストールしようとしたらこんなエラーが出てきたの。
```エラー 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  cuda-11-6 cuda-cccl-11-6 cuda-command-line-tools-11-6 cuda-compiler-11-6 cuda-cudart-11-6 cuda-cudart-dev-11-6
  cuda-cuobjdump-11-6 cuda-cupti-11-6 cuda-cupti-dev-11-6 cuda-cuxxfilt-11-6 cuda-demo-suite-11-6
.
.
.
.
.
.
10.47.03-0ubuntu1_i386.deb  File has unexpected size (50300 != 50298). Mirror sync in progress? [IP: 152.199.39.144 80]
   Hashes of expected file:
    - SHA512:28e0cbbbc6806301d1588144774277c327d8827b5a1051fd19a3e0dca62ec5600c128c1efa7373a8a1a0dcff232cb5ae539ea8d90385392196a610525d56bb24
    - SHA256:ba0eaf107d6186328425bf3899ae092e08af161bc3269755b8a946d2211a7ab3
    - SHA1:1f780b9c3fba70f2c6fe055366d1145c9aa1aed3 [weak]
    - MD5Sum:c9f2ddfbe94902d7f45e86b559036608 [weak]
    - Filesize:50298 [weak]
E: Failed to fetch http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/./libnvidia-gl-510_510.47.03-0ubuntu1_i386.deb  File has unexpected size (22995788 != 22995786). Mirror sync in progress? [IP: 152.199.39.144 80]
   Hashes of expected file:
    - SHA512:ca83093e2ac4c18df67132952662b8fdc61459c8f18ce4a4d84dad702780666de673c64b6b97185e3301bd1abf971527c087fabe239cc975fcbfab8aa5d2d4bc
    - SHA256:f2a9b1eb8e1e13703c55d1943325e3c76faf27bd1212b0b1e166cc40c1cbf900
    - SHA1:3832159ec3730958d7e518cd138ced3bfa59ff6f [weak]
    - MD5Sum:18e2e26f35897e06f64de0df4a49f9ab [weak]
    - Filesize:22995786 [weak]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

```
もうね、むきーっって感じよ。やんなっちゃうわよね。
でも安心して、解決策見つけたわ♡
なんかね、公開鍵が更新されてるのが原因らしいわぁ♡
だから下のコマンドで更新すればいいのよ！
```
sudo apt-key del 7fa2af80

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.0-1_all.deb

ここで、Ubuntu20.04とかの人は1804を2004とかに修正してね♡

sudo dpkg -i cuda-keyring_1.0-1_all.deb

sudo apt update
```
これでOKよ♡

ただ、私の場合はここで問題が発生しちゃってね…。こんなエラーが出ちゃったの。
```エラー
E: Conflicting values set for option Signed-By regarding source http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /: /usr/share/keyrings/cuda-archive-keyring.gpg != 
E: The list of sources could not be read.
```
だからこうしてやったわぁ！
```
sudo vi /etc/apt/sources.list
```
このコマンドで下のをコメントアウトすればいいわ！
```
deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /

↓

#deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /
```
viの使い方はお勉強してちょうだいね♡
あとはもう一度、
```
sudo dpkg -i cuda-keyring_1.0-1_all.deb

sudo rm /etc/apt/sources.list.d/cuda.list

sudo apt update
```
これを仕上げればいっちょあがり！もうね、ボコボコのボッコってかんじよ！
そんでもってこうよっ！
```
sudo apt install cuda cuda-drivers
```
終わりよ。
BTP Kyma Runtimeの初期設定

## はじめに
2022年9月20日から、BTPトライアルアカウントのKyma Runtimeで、クラスターの有効期限が2週間となります。2週間が過ぎると作成したクラスターは削除され、また新たに作り直す必要があります。

https://blogs.sap.com/2022/09/13/sap-btp-kyma-runtime-trial-clusters-lifespan-limited-to-14-days/

今後トライアル環境でKyma Runtimeを使う場合は頻繁に初期設定が発生するため、何をすればよいかメモしておきます。

## 前提
[kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl), [kubelogin](https://github.com/int128/kubelogin#setup)がインストール済みであること

## ステップ
1. kubeconfigの設定
1. 接続確認
1. namespaceの作成
1. Docker Hub接続用のシークレット作成
1. ドメインの確認（オプション）

### 1. kubeconfigの設定
以下のリンクをクリックして、kubeconfig.yamlファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/bd25fc3f-eeaa-8f51-87c4-75ecbce42338.png)
ダウンロードしたファイルを`C\Users\<userName>\.kube`に`config`とリネームして格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4c7fd650-f7a9-0d8a-7e71-5f33ea6787f5.png)

### 2. 接続確認
以下のコマンドを実行して、Kyma Runtimeへの接続を確認します。
```
kubectl config get-contexts
```

以下のように接続先のクラスター情報が表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/223a312b-4e78-fd11-8a0f-778410db8295.png)

### 3. namespaceの作成
以下のコマンドでnamespaceを作成します。

```
kubectl create namespace <namespace>
kubectl label namespaces <namespace> istio-injection=enabled
```

### 4. Docker Hub接続用のシークレット作成
以下のコマンドでシークレットを作成します。（改行はPower Shell向けになっているので、Linux, Macの場合は`\`に変更）

```
kubectl create secret docker-registry registry-secret `
  --namespace <namespace> `
  --docker-server=docker.io `
  --docker-email=<email> `
  --docker-username=<username> `
  --docker-password=<password>
```

### 5. ドメインの確認（オプション）
アプリケーションの設定で自分のクラスタードメインを指定する必要がある場合は、以下のコマンドで確認できます。

```
kubectl get configMaps/shoot-info -n kube-system -o jsonpath='{.data.domain}'
```

例：c-209d1ec.kyma.ondemand.com
命名規則について

## 使用する単語の統一

使われている単語が異なる場合、読み手は異なる処理が行われることを考慮してコードを読む必要がある。
このような混乱を防ぐためにも、同じ意味合いの単語は統一する。

### 類似語例

- start、begin
- stop、end
- modify、update、change
- create、new、factory
- find、search
- done、finish、complete
- deliver、dispatch、send
- select、choose
- show、display


## 対比語を正確に使用する

反対の意味を持つ値の命名を、数字やその他適当なワードで埋めてしまうことがある。
正しく対比の単語が命名されていれば、処理内容の理解がぐっと向上する。

### 対比語例

- first <-> last
- next <-> previous
- create <-> delete
- source <-> destination
- add <-> remove
- show <-> hide
- min <-> max
- public <-> private
- success <-> failure


参考文献

[プログラミング中級者になりたい人のためのクリーンコード入門](https://www.udemy.com/share/107mKo3@bO3YjwahxvxJNsDkdKg4_XXWbeZOt8jLHrAr9DsJ_PAgWfXqWyGQPHHAhx3QNi8C/)
GCP: Memorystore

# Features

https://cloud.google.com/memorystore#all-features

- RedisかMemcachedを選べる
- マネージド
- スケーラブル
- VPCとプライベートIPによる隔離
- in-transit暗号化
- 高可用性
- 既存のインメモリストレージからの移行が容易

RedisとMemcachedで大きくサービスは変わらないと想定されるため、Redisの記事をベースにします

# Overview for Redis

https://cloud.google.com/memorystore/docs/redis/redis-overview

- 5つのリードレプリカを持てる
- プライベートIPで隔離されている
- in-transitで暗号化される
- 最大300GBストレージ
- 最大16Gbpsのネットワーク
- Cloud Loggingによるログ
- Cloud Monitoringによる監視
- 接続できる主なクライアント
    - App Engine
    - Compute Engine
    - Cloud Functions
    - Cloud Run
    - GKE

# Memory management

https://cloud.google.com/memorystore/docs/redis/memory-management-best-practices

- Maxmemory: eviction policyが働くメモリ上限
- システムメモリ使用率: システムメモリに対するインスタンスのメモリ使用率、高いとメモリ負荷が高い
- eviction policy: メモリ上のkeyを放逐するルール、デフォルトは`volatile-lru`
- キャッシュヒット率は基本的に高いほうがいい
# Exponential backoff

https://cloud.google.com/memorystore/docs/redis/exponential-backoff

Memorystoreへのリクエストが失敗した場合、クライアント側で指数的バックオフに基づいた待機時間を設けるべき

# CMEK

https://cloud.google.com/memorystore/docs/redis/cmek

- CMEKで暗号化できる
- at-rest暗号化
- メタデータはin-transitで暗号化 (...?)

# in-transit encryption

https://cloud.google.com/memorystore/docs/redis/in-transit-encryption

- TLSによる通信暗号化
- クライアントはCAが必要
- 通信負荷が上がるため、インスタンスを強化したり、接続を減らしたりするべき

# Network

https://cloud.google.com/memorystore/docs/redis/networking

- デフォルトでDirect Peeringが設定される
- より強いセキュリティ要件のためにPrivate services accessを利用できる

# Pricing

https://cloud.google.com/memorystore/docs/redis/pricing

- ティア
    - ベーシック: シンプルなユースケース向け
    - スタンダード: 高可用性やクロスゾーンレプリケーションやリードレプリカなどのとき
- キャパシティ: ストレージキャパシティに基づく
- 1時間単位の課金
- 異なるリージョンのクライアントからアクセスするネットワークに応じて課金
Rvizをフルスクリーンで起動する(rviz fullscreen)

rvizをフルスクリーンで立ち上げきたら,UIの作成に役立つことがありそう.

やり方を調べたところ,こちらのプルリクエストからその機能が追加されたことが判明．

https://github.com/ros-visualization/rviz/pull/1017/files

実行方法は簡単で`--fullscreen`オプションをつけるだけでokです.

```
rviz --fullscreen
```

![Screenshot from 2022-10-22 22-11-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/50d3c276-7138-97c0-8484-09d85a7044b0.png)
【VSCode】VSCodeでER図を作成する

## 拡張機能をインストール

VSCodeでER図を作成するために`Draw.io Integration`をインストールします。  

https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio

## 使用方法

### 基本的な使い方

以下のいずれかの拡張子でファイルを作成するとDraw.ioエディタで開けます。  

* `*.drawio`
* `*.dio`
* `*.drawio.svg`
* `*.drawio.png`

![C20713CB-EFA8-46EA-9572-23B09CC4FFF9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/33f34dbb-8926-bc36-294a-4b7c9a9473c9.png)

下画像の赤枠の箇所はデフォルトでは「一般」などが表示されていますがここに「ER図」の項目を追加できます。  

![1551C494-D7C0-4AB6-9475-0C94AE973D4Cのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a690bc7d-d421-ea6a-6f47-643d389de66b.png)

追加するにはエディタの左下にある「＋その他の図形」をクリックします。  

![C664837F-C0B2-411E-B9F5-308CFBF8924Dのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1e595621-50ea-b50a-2b70-5127c1927e5d.png)

表示されたリストの中から「ER図」にチェックを入れ「適用」をクリックします。

![3716975A-F0B0-4F3E-B44D-67C61921618D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/078c6a2b-a9b5-39a0-50a4-52739db3d360.png)

すると「一般」などが表示されていた箇所に「ER図」が表示されます。

![22B5BA04-3FB2-48C8-8BEB-3918207C3748のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e46756ea-d37b-4388-b7af-72206dcfc819.png)

「ER図」をクリックするとER図作成の際に使用する図形一覧が表示されるのでこれらの図形を使用してER図を作成します。  

![613EBF8D-37BB-4571-8576-EAA6048EAEA5のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1464b0db-ed4c-72ff-b481-c44f2c269898.png)

### テーブルの操作

たとえば「Table 1」をクリックまたはD＆Dすると以下のように「Table 1」が表示されます。  

![9B286F04-8960-4FE0-89BB-1618803C22D2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c388561c-192d-64c8-8ac5-1ad7a7f764a2.png)

カラムを挿入または削除するにはカラムを選択して以下の赤枠をクリックし表示されたアイコンで
操作します。  

![08F3672A-E873-4C5D-BE6E-AE1BCC46D87Eのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c69571a4-4c4b-c6b3-7a1b-7dff15f576e2.png)

またテーブルの枠（緑色の箇所）をクリックしてドラッグすると矢印を描けます。

![F10F7CA5-6F71-46FC-AE70-02EEDCE50467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/24db1b89-8092-bf7c-71ea-ac6f7947b4c6.png)

![CE8266D4-3363-4676-91C6-C821D44A06BD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/632179eb-be2f-2333-5ffb-e349b56b2636.png)

矢印の設定は右側の一覧で行います。


### エクスポート

「ファイル」→「Export...」でエクスポートできます。  

![62D618DB-0CC6-44A1-983A-26F8778CB5F7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2b269681-069c-2cb4-8970-eccd73ef7b16.png)

選択可能なファイル形式は以下のとおりです。  

![8BDE6C2D-3199-4486-96D5-FC2B89DBCD14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c3bf589f-fa21-bb63-ed92-8c618e35fc5f.png)

また`*.drawio.svg`や`*.drawio.png`でファイルを作成すれば`.svg`や`.png`ファイルとして扱えます。
.exファイルも作るところから！ Elixirでの"Hello, World!"-その2

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はElixirでの"Hello, World!"について、そういえば.ex/.exsファイル作るところからは誰も書いていない？！と思い、備忘録としてまとめておきます。

第1回目では.exsファイルで.exsファイルで"Hello, World!"を作りました。
→[第1回目はこちらから](https://qiita.com/Alicesky2127/items/4ba5d115373a203805e7)

今回は.exファイルで"Hello, World!"を作っていきたいと思います。

## 実行環境
<dl>
  <dd>・Windows 11 Home(バージョン 21H2, OS ビルド 22000.1098)</dd>
  <dd>・Ubuntu v18.04 ※WSL2環境下</dd>
  <dd>・Elixir v1.13.4 (compiled with Erlang/OTP 25) ※WSL2環境下</dd>
</dl>

# パターン1　 テキストエディタから.exファイルの作成
※以下コマンドはエディタとOSにより異なります。
コマンドプロンプトを開く
→ファイルを作成したいディレクトリまでcdコマンドで移動

```
$ nano hello.ex
```
で、テキストエディタが開きます。

その中に、
```elixir:hello.ex
defmodule Hello do
  def hello() do
    IO.puts("Hello,World!")
  end
end
```
と書いて保存し(Ctrl+S)、閉じます。（CTRL+X)

コマンドプロンプトに戻り、hello.exのあるディレクトリで、コンパイル(elixirc <ファイル名>.ex)します。
```
$ elixirc hello.ex #このコマンドでコンパイルする
```

コンパイルが完了しても特にコマンドプロンプト上で何か表示されるわけではありませんが、
実行するためのbeamファイル(Elixir.<モジュール名>.beam という名前のファイル)というものがカレントディレクトリに生成されています。
これが生成されていることを確認します。
```
$ ls -l  #このコマンドでファイル一覧を表示する
-rwxrwxrwx 1 alice alice    1400 Oct 22 21:20  Elixir.Hello.beam  #Elixir.Hello.beamが生成されていることが確認できる
```
beamファイルが生成されていることを確認できたら、いよいよ実行します。(elixir -e <モジュール名>.<関数名>)
```
$ elixir -e Hello.hello #このコマンドでbeamファイルのhello関数を実行する
Hello,World! 　　  #Hello,World!が返ってくる
```


# パターン2　 VSCodeから.exファイルの作成
コマンドプロンプトを開く
→ファイルを作成したいディレクトリまでcdコマンドで移動
```
$ code hello.exs
```

で、VSCodeが開きます。

その中に、
```elixir:hello.ex
defmodule Hello do
  def hello() do
    IO.puts("Hello,World!")
  end
end
```
と書いて保存し(Ctrl+S)、閉じます。（Alt+F4)

コマンドプロンプトに戻り、hello.exのあるディレクトリで、コンパイル(elixirc <ファイル名>.ex)します。
```
$ elixirc hello.ex #このコマンドでコンパイルする
```

コンパイルが完了しても特にコマンドプロンプト上で何か表示されるわけではありませんが、
実行するためのbeamファイル(Elixir.<モジュール名>.beam という名前のファイル)というものがカレントディレクトリに生成されています。
これが生成されていることを確認します。
```
$ ls -l  #このコマンドでファイル一覧を表示する
-rwxrwxrwx 1 alice alice    1400 Oct 22 21:20  Elixir.Hello.beam  #Elixir.Hello.beamが生成されていることが確認できる
```
beamファイルが生成されていることを確認できたら、いよいよ実行します。(elixir -e <モジュール名>.<関数名>)
```
$ elixir -e Hello.hello #このコマンドでbeamファイルのhello関数を実行する
Hello,World! 　　  #Hello,World!が返ってくる
```



<br>

# ～Elixirの国のご案内～
※Elixirって何ぞや？と思ったらこちらもどぞ。未来がぎゅっと詰まった、Elixirは今年で生まれて10周年です:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/7bf8f9f4f5f576e597f5



[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^1]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。


まずは気軽に話しかけてみてください。[^10]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian




[^1]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。
[^2]: この時点での私はほぼGUIしか触れていませんので、「テキストエディタでhello.exsを作成し」と言われても「テキストエディタで編集したものは.txtにしかならないよ？？」という詰まり方をしていました...
[^3]: Elixir treats both files exactly the same way, the only difference is in intention. .ex files are meant to be compiled while .exs files are used for scripting. 
[^10]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
VBA　レコードセットどん詰まり

EXCEL VBAで詰まったので備忘録。
![スクリーンショット_20221022_214418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743765/c7f1c36c-3bd2-f5f9-f74d-82852dfc68ea.png)
辿った経緯は
①rs.Openで二つのクエリ文を実行しようとしてエラー。
②じゃあ閉じよう→rs.Close→"閉じているので操作は許可されません"→はあ？（半ギレ）
③神よりrs分けた方がよくね？とのお言葉
④rs2の中にrs1で取ったもんをぶっこむ（上記）
⑤キターーーーーー！！(ﾟ∀ﾟ)←イマココ

ホントに駆け出しなんです。生温かい目で見守ってやってください・・・
【Swift】CaseIterableを使って列挙型の配列を取得する

# 実装
```swift
enum WeatherCondition: String, CaseIterable {
    case sunny
    case cloudy
    case rainy
}

print(WeatherCondition.allCases)

// [プロジェクト名.WeatherCondition.sunny, プロジェクト名.WeatherCondition.cloudy, プロジェクト名.WeatherCondition.rainy]
```

# おわり
今回のサンプルは数が少ないのであんまり意味がないように思えますが、[TwitterAPIのエラーコード](https://qiita.com/SNQ-2001/items/604559ee38227cc134a3)のように大量にある場合は今回の方法が有効です。
Rvizからstd_msgs/Empty型メッセージの送信

`jsk_rviz_plugins`の`PublishTopic`というパネルを使用するとEmpty型のトピックを送信できる

https://jsk-visualization.readthedocs.io/en/latest/jsk_rviz_plugins/panels/publish_topic.html

1.jsk_rviz_pluginをインストール後,rviz上の`Panels`というボタンをクリック

![Screenshot from 2022-10-22 21-35-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/72db8f62-dc88-379b-6eca-0f45eb553f8d.png)

2.Panelsから`Add new Panel`に入り`jsk_rviz_plugin`の`PublishTopic`を選択

![Screenshot from 2022-10-22 21-37-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/1c13f888-e44d-d0db-4b54-8523b88ab241.png)

後は,トピック名をいれてあげればok
USJ の CM で "No Limit!" がどうしても "No Money!" にしか聞こえないので Whisper で音声認識させた

## 背景

時たま web 広告とかで流れてくる USJ の CM...
ながら作業して映像見ていないと,  "No money!" と聞こえてファっ！！！となります.

「ノーマネー」って言ってる？USJ「スーパーニンテンドーワールド」のCM
https://ducksfly.hatenablog.com/entry/usj-no-limit

## Whisper で認識させてみる

https://www.usj.co.jp/web/ja/jp/nolimit

まずは最後の部分だけ認識させてみます.

Whisper で large model で言語は英語で認識させます!

```
$ whisper input.mp3 --language English --model large
```

結果は...


```
[00:00.000 --> 00:01.000]  No, let it!
```

`No, let it!` になりました. 😮

## 全体を認識

最後だけだと情報量たりないのかもしれませんので, せっかくなので CM 全体を認識させてみます.



結果は...

```
[00:00.000 --> 00:04.000]  This is a place where everyone can get super-heated.
[00:05.000 --> 00:07.000]  Let's get fired up!
[00:09.000 --> 00:10.000]  Incendio!
[00:13.000 --> 00:14.000]  It's that easy, right?
[00:15.000 --> 00:16.000]  It's okay, it's okay.
[00:17.000 --> 00:18.000]  Let's scream in a loud voice!
[00:19.000 --> 00:22.000]  You need to have a crazy day in your life!
[00:23.000 --> 00:24.000]  Go crazy!
[00:25.000 --> 00:26.000]  This is Super-Heat Special!
[00:27.000 --> 00:28.000]  Universal Studio Japan!
[00:28.000 --> 00:29.000]  Go money!
```

日本語部分は英語に translate されました.

large model で AI の叡智で判断させたところ, "Go money!" でした. 
ありがとうございました :money_mouth: 
(たしかに Go money にもちょっと聞こえるよネ...)
NucleoF446REにプログラムを書き込めず、The interface firmware FAILED to reset/halt the target MCUというエラーが出る

# NucleoF446REにプログラムを書き込めず、The interface firmware FAILED to reset/halt the target MCUというエラーが出る

## 結論

ボードのRESETボタン（黒いタクトスイッチ）の下にJP5というのがあって、そこにジャンパピンが刺さっていると思います。JP5にはE5Vという文字とU5Vという文字があると思いますが、ジャンパピンをU5V側に挿すと、ボードにプログラムを書き込むことができました。

## 説明

このジャンパピンの位置によって、ピンから電源を取るか、USBから電源を取るのかが決まります。E5V側ならピンから電源を取り、U5V側ならUSBから電源を取ります。ジャンパピンをE5V（ピンから電源を取る）にしていると、PCとNucleo-F446REが接続できなくなり、プログラムを書き込めなくなります。

なので、逆に、ピンから電源を取りたいと思ったときには、ジャンパピンをE5V側にする必要があります。
サイバーエージェントさんのカンファレンスに参加してきた

先日サイバーエージェントさんと関西の学生IT団体との交流会が行われ交流会の概要とそこで感じたサイバーエージェントさんの印象的だったこと魅力的だったことをお伝えできればなと思いました。

### タイムテーブル
| 1 | 2 |
|:-:|:-:|
|  13:00 |  開会 | 
|  13:05 |    23卒の社員さんとWINTICKEのサービスで働いているフロントエンドエンジニアさんの話 
|  14:05 |  watnow代表のLT 
|  14:45 |  Tech.Uni代表LT 
|  15:05 |  Do're代表LT 
|  15:05 - 17:00| 交流会 学生同士の交流、CyberAgent社員との交流 

### 社員さんのお話

#### 【一人目】23卒Tさんの内定者バイトで感じたチーム開発

経験が浅いと感じていた開発経験が少ないと感じていたTさんが大規模開発ってどんな感じなの？ということをテーマにお話ししてくださりました。

##### Tさんが携わっている事業や開発内容


　既存機能のJava からGoに刷新する
   ・ログを機械学習にかけやすいように変換
   ・既存機能：広告配信の機械学習の特徴力作成
#### 印象的だったこと
Tさんが携わっているJAVAからGoに刷新する仕事ができた背景をお話しされていた中で技術的負債だけでなくGoには採用の力があると語っていたのが印象的でした。技術はただの開発する手段だけでなく採用に対しても強い影響を持っており、CAさんも採用の観点から技術力を取り入れているということにとても面白く思いました。それだけエンジニアが入社する基準の中に使用技術が大事であることがひしひしと伝わってきました。

またCAさんの社員さんがとても優しい方が多いのだなとも思いました。TさんがGo未経験で内定者バイトに挑んだため予定期日より大幅遅れた時にも面談で優しさ溢れる気遣いをいただいていたり、Tさんが仕事で取り入れたチェックシートに対してLGTMしてくださったりとCAさんの開発現場いい労働環境であることが十分に伝わってきました。

#### 【二人目】WinTicketでwebフロントエンジニアとして働いている社員さんのお話

現役エンジニアの視点からどういった人がCAさんで活躍しているか、学生は何をしたらいいのかというお話をしてくださりました。正直winticketというサービスを知らなかったのですがCAさんが競輪のサービスにも手がけていることを知れました。

#### 印象的だったこと

ABEMAのような大規模開発とWinTicketのような中規模開発の違いについて語っていただけました。

##### ABEMA
・ 全体で120名程度  
・エンジニア50名
・ 成熟フェーズ
・ 技術的負債との戦い　（ レガシーな点と戦いながら新しい技術に挑戦）

###### WINTICKET
・ 中規模組織 
・全体で30名強の人数
・20名エンジニア、フロントエンド4名
・ コード品質へのこだわり
・ グロースフェーズ




中規模と大規模でサイバーエージェントで求められるスキルが違ってくることも知れました。

ABEMA
・事業の過去・将来を加味した技術者目線での戦略提案→実行する能力がある人
WINTICKET
 ・自分の中の得意領域を持ちつつも、線引きをせずに新しくチャレンジできる人

### 学生IT団体の代表LT
学生IT団体の代表ということもありとても開発経験豊富で一人前のエンジニア、またみんなを導くリーダーのような印象を受けました。LTをきいて友達含めとにかく結果を出しているような学生エンジニアは積極的に殻を破って行動をしているような方が多いなと感じました。

### 交流会

交流会では他大学の学生や社員さんとお話しできる機会がありました。他大学の学生でもいろいろな経験をしている方がおりとても刺激的でした。個人開発で数十万DLや競プロ強者、ダブルスクールされている方などわかりやすくすごかったです。またエンジニア採用責任者の方とお話しできる機会がありとても良かったです。CAさんで求められる人というのを会社HPよりもっと深堀されたことが聞けました。


### 最後に
今回このような会を開催してくださったCAさんと関西IT学生団体の代表や副代表の皆様に感謝です。私も周りを巻き込んで関西のエンジニア団体に貢献したいとも思いました。
M1macでHadoop3.3.4を動かしたい．

タイトル通りM1macでHadoop3.3.4を動かそうと頑張ったらやっと動いたので記録．
Markdown書いたことないので調べながら書きます．自分用なので読みにくいと思います．

### 環境
- MacBook Pro(2021)
- macOSMonetery 12.6
- Apple M1 pro

最初は[このページ](https://blog.contactsunny.com/data-science/installing-hadoop-on-the-new-m1-pro-and-m1-max-macbook-pro)や[このページ](https://codewitharjun.medium.com/install-hadoop-on-macos-efe7c860c3ed)を見ながら全く同じようにやってみたけど，`start-all.sh`を入力すると`cannot set priority of...`が出てきてうまくいかない．

## やったこと
1. ***-site.xmlファイルをとにかくいじる．
    stackoverflowやqiitaなどで他の人の設定を探してそれをそのままコピペして改善するか確認した．
    →改善せず．
2. 他のマシンで動くか確認する．
    M1のmacはarmらしいので元々使っていたx86のmacで動くか確認する．また，ubuntu18.04でも確認する．
    →そっちでは動いた．ただ，この時はHadoopの***-site.xml以外の環境はあまりみてない．

## 改善した理由
改善した理由と思われるポイントがいくつかある．
1. 再起動
    namenodeとdatanodeの`cannot set priority of...`は，すでにnamenodeやdatanodeが動いている時に起きることがあった．
    `stop-all.sh`で止めようとしたがなぜか止まってくれないことがあり，このケースは無理やり止めるために再起動したらうまくいった．
2. `ssh localhost`のパスワードを無くす．
    エラー表示の内容は忘れたけどPermission deniedみたいなのが出る時とかとりあえずsshで詰まってるっぽい時は，`ssh localhost`でパスワードが設定されてるのも理由の一つとしてあるので，`ssh-keygen -p -f ~/.ssh/id_rsa`でEnter old passphraseに元のパスワードを入力して，Enter new passphraseはエンターキーのみ押す(何も入力しない)とパスワードをなしにできる．
3. Javaのバージョン確認．
    Java19を入れていたのもダメだった理由っぽい．nodemanagersとresourcemanagerの`cannnot set priority of...`はこれで解決した．色々ググったら「Java8がいい」みたいなのがいっぱい出てきたから，自分の場合はzulu-8.jdkを入れて，hadoop-env.shの55行目くらいにあるexport JAVA_HOMEのところを`export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/
`にした．ついでに~/.zshrcのJAVA_HOMEもそっちにしといた(どっちが原因なのか，どっちもなのかは確認してないからわからない)．

4. hdfs-site.xmlをいじる
    secondary namenodesで`hogehoge: ssh: Could not resolve hostname hogehoge: nodename nor servname provided, or not known`ってでて困ってたけど，よくみたらlocalhostじゃないところにつなげようとしてるのかなって思ったから
```
<property>
    <name>dfs.secondary.http.address</name>
    <value>hdfs://localhost:50090</value>
</property>
```
　って設定したらうまくいった．
[Delphi] TZipFile の使い方

# TZipFile

[TZipFile](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile) は [System.Zip](https://docwiki.embarcadero.com/Libraries/ja/System.Zip) ユニットに定義されている Zip アーカイブを操作するためのクラスです。

ですが！
具体的な使い方がどこにも書かれていないので、ここで簡単な圧縮と解凍方法ついて紹介します。

# 圧縮

## 単純なアーカイブ

[書き込みモード (zmWrite) ](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipMode)でファイルを [Open](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.Open) して [Add](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.Add) にファイル名を渡すだけです。

```pascal
// uses に System.Zip を追加しておきます

var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmWrite);
  try
    Zip.Add('Foo.png');
    Zip.Add('Bar.txt');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;
```

:::note info
モードによる違い
* zwWrite
ファイルを新規作成して上書きます。
既存のアーカイブの内容は削除されます。

* zwReadWrite
既存のファイルを修正します。
例えば Add を呼ぶと既存のアーカイブにファイルが追加されます。
:::

## ディレクトリ付きアーカイブ
ディレクトリを付けてアーカイブする場合は第２引数にファイル名を含んだ完全パスを指定します。

:::note warn
パスの区切りは必ず ```/``` を使います
:::

:::note warn
パスの先頭に ```/``` を付けると TZipFile で解凍するときにルートディレクトリに解凍されてしまいます。絶対パス指定ではない場合は先頭に ```/``` を付けないように気をつけて下さい。
:::

```pascal
var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmWrite);
  try
    Zip.Add('Foo.png', 'Baz/Foo.png');
    Zip.Add('Bar.txt', 'Baz/Quux/Bar.txt');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;
```

# 解凍

## 全部解凍

[読み込みモード (zmRead) ](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipMode)でファイルを [Open](https://docwiki.embarcadero.com/Libraries/Sydney/ja/System.Zip.TZipFile.Open) して、[ExtractAll](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.ExtractAll) を使うと全てのファイルをディレクトリ付きで解凍します。
引数は解凍先のディレクトリです（存在しなければ自動的に生成されます）。

```pascal
var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmRead);
  try
    Zip.ExtractAll('D:\Temp\test');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;
```

## 全部解凍2
ただ全部解凍するなら [TZipFile.ExtractZipFile](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.ExtractZipFile) というクラスメソッドを使うほうが簡単です。
最後の引数は[進捗用のイベント](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipProgressEvent)を渡します。

```pascal
// 一番簡単な呼び出し（進捗用イベントはデフォルトで nil）
TZipFile.ExtractZipFile('D:\Temp\test.zip', 'D:\Temp\test');

// エンコーディングも指定可能
TZipFile.ExtractZipFile('D:\Temp\test.zip', 'D:\Temp\test', TEncoding.UTF8, nil);
```

## １つ１つ解凍

１つ１つ解凍する場合は次のように [Extract](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.Extract) を使います。
第２引数は解凍先のディレクトリです。
第３引数に False を指定しない限りディレクトリは自動的に生成されます。

```pascal
var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmRead);
  try
    for var i := 0 to Zip.FileCount - 1 do
      Zip.Extract(Zip.FileName[i], 'D:\Temp\test');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;
```

ちなみに [FileInfo プロパティ](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.FileInfo) または [FileInfos プロパティ](https://docwiki.embarcadero.com/Libraries/ja/System.Zip.TZipFile.FileInfos) を使うとヘッダー情報が取得出来ます。
（ファイル名はヘッダー情報の１つです）

# 最後に
ExtractZipFile 以外は Open しないとどんな操作も受け付けないのですが、そういった事がどこにも書かれていなかったので記事にしました。
Zip を扱う際の一助になれば。
optunaで探索済みのデータをtrialに渡して重要度を評価する方法

表題の通りです．

具体的には，
1. `trial.create_trial`でデータからtrialを作成
1. `study.add_trials`で`study`にデータを追加

`create_trial`には各変数の分布型を指定する必要があります．（言い換えると分布型は探索空間を定義するものであり，当然ですが分布型によって結果が変わります．）

```python
import optuna
import numpy as np

LB, UB = -5, 5
study = optuna.create_study()

rng = np.random.RandomState(42)
samples = rng.random((50, 2)) * (UB - LB) + LB
study.add_trials([
    optuna.trial.create_trial(
        params=dict(x=x, y=y),
        distributions=dict(
            x=optuna.distributions.FloatDistribution(LB, UB),
            y=optuna.distributions.FloatDistribution(LB, UB),
        ),
        value=(x ** 2 + (y / 10) ** 2)
    )
    for x, y in samples
])
optuna.importance.get_param_importances(
    study,
    evaluator=optuna.importance.FanovaImportanceEvaluator(),
)
```

実際に実行すると以下のような結果が得られます．

```shell
OrderedDict([('x', 0.9508186441212698), ('y', 0.049181355878730224)])
```

与えたデータは $x^2 + y^2/100$であるため，$x$がより重要であるという情報は正しいです．
「ERROR [internal] load metadata for ..」が発生した時の対処法

# この記事でわかること
* 表題の問題の解決方法
* 深みにはまったときの解決方法

## 起こったこと
それは突然、やってきた。
WSL2でこんなことを言われたのだ。
``` code
ERROR [internal] load metadata for docker.io/library/hogehoge
```
思い当たることはあまりない。
なんかへんなことしたかなー、と考えて色々いじいじしたが変わらず。
ググって[ここ](https://shiimanblog.com/engineering/error-internal-load-metadata/)にたどり着きました。
そういや最近Dockerのサボってたアップデートをサボってたなーと。
ただ、なにが起こっているのか、なにをやっているか今イチわからなかったので、原因を追究してみることに。


## まずは最終的な対処方法
結局wslのdnsを8.8.8.8に固定した。

## 実際試したこと
https://zukucode.com/2021/11/wsl2-docker-nettwork.html
https://shiimanblog.com/engineering/error-internal-load-metadata/

### 一番参考になったサイト
https://qiita.com/kotauchisunsun/items/71fae973afa00ebb871a

## 結論
dnsが解決できなくなっているという状況はなんとなく把握できていました。
が、なぜ急に解決できなくなったかなどが気になって正しい対処方法を模索しました。
結果、半日くらい余分な時間がかかったので、dnsをいい感じに変更するだけで対応は十分でした。

ちゃんと把握することは大事ですが、Dockerのエンジニアなわけでもないし、ただ使うだけの立場ならそこまで把握する必要はなかったかなぁと。

どういう対応が一番いいというのはないですし、エンジニアとしては全て正しく把握することが将来の成長につながりますが、それのせいで本来やりたいことが時間がかかってしまうと本末転倒だなぁという備忘録。
UXを学ぶ(1).「使いにくい」がはじまり

UXを学ぶには、まず「<b>ユーザビリティ</b>」を理解する必要があるらしい。

ユーザビリティは<b>ユーザー視点</b>での製品の良さ(快適度)を推し量るための基準。
ユーザビリティの基準は、特定の利用者にとっての ……

<dl>
  <dt>有効さ</dt>
  <dd>正確さ、完全さ</dd>
  <dt>効率</dt>
  <dd>速さ、目的に費やす資源 の少なさ</dd>
  <dt>満足度</dt>
  <dd>不快のなさ、肯定的な態度</dd>
</dl>この3つで考えられる。
この3つを満たすほどよい製品。
この3つがどれかでも欠けたら「使いにくい」という違和感が生じる。

<b>「使いにくい」にも2種！</b>

<b>「使いにくい」</b>は下記の2点で区分けできる。

<dl>
  <dt>ユーザー起点のもの </dt>
  <dd>どこを押せばいいの？、どう見ればいいの？</dd>
  <dt>性能から生じるもの  </dt>
  <dd>解像度が低いとか</dd>
</dl>

「使いにくい」が生じたとき、それは何が起点になっていくのか切り分けて考えるのがよさそう。
DRP とは

## 勉強前イメージ

3文字ってよくありすぎてわからない・・・

## 調査

### DRP とは

Disaster Recovery Plan の略で、日本語では災害復旧計画になります。
DPRとは災害が発生した際のシステムの復旧手順を定めた計画のことを指します。

よくDRと言われますが、それはDisaster Recoveryでそれに計画を加えたものがDRPになります。
特に同時多発テロや東日本大震災などから注目が高まり
予期せぬシステムの停止やデータ損失に備えて対策が行われてきています。

### BCPという言葉もある

[こちら](https://qiita.com/miyuki_samitani/items/740fa9fc7cedad5a2860) に詳細は記載しておりますが
BCPという言葉があります。
DRPと似たような言葉で企業の事業継続計画のことを指します。
こちらは自然災害やテロなど緊急事態の際に最低限業務を継続しながら復旧を行うかという戦略をを記載しております。
緊急事態への対策というところでは似たような言葉です。

### DRP と BCP の違い

どっちも自然災害や緊急事態の対策という点では同様ですが、
特に違う点としては以下になります。

- DRP : 事業の継続に必要な ITシステムを復旧させるための計画
- BCP : 緊急事態の際に制約がされた状態でも事業を継続させて復旧につなげるための計画

DRPはBCPの一部として、特にITシステムを復旧させる計画担いrます。

## 勉強後イメージ

今回はあまり難しいところまではやってないけど
どっちかというとシステムに焦点を当ててどうやって復旧していくかっていうのを考えてるってことね。

## 参考

- [DRPとは？BCPとの関係から策定手順まで必要なポイントを解説](https://www.belfor.com/ja/jp/BCP/DRP)
- [BCP対策とDR対策の違いとは？違いをわかりやすく解説！](https://it-trend.jp/bcp/article/134-0019)
BCP とは

## 勉強前イメージ

3文字の略語・・・わからない。。。

## 調査

### BCP とは

Business Continuity Planning の略で災害時の企業の事業継続計画のことを指します。
自然災害やテロなど緊急事態の際に最低限業務を継続しながら復旧を行うかという戦略をを記載しております。
ちなみに事業継続のための戦略はBCMと呼ばれています。

### BCMの必要性

- 災害時の被害の緩和

災害時など緊急の際に使用される対策です。
地方各地に支社などがある際に地震などでその地域が稼働できなくなる可能性もあります。
その際にどれだけ被害を最小限に抑えられるかを考え、緊急時に使われます。

- 投資家からの信頼

BCPは東日本大震災や同時多発テロなどで特に注目を受けており、災害などいつ何時起こってもおかしくないと考えられています。
その為あらゆるリスクに対応できるように対応することで取引先などからの信用も得ることが出来ます。

- 従業員の不安の緩和

その会社で働く従業員もこのBCPの対象で
緊急事態が発生した際でも会社が存続できるように対策を行うことで安心して仕事に打ち込むことが出来ます。

## 勉強後イメージ

ITとは別だなーって思ってたけど、IT系の会社だったらどうやってDCを守るの？とかもあるのかな

## 参考

- [BCP（事業継続計画）とは？必要性は作成方法、とりくみ例をわかりやすく解説](https://go.chatwork.com/ja/column/work_evolution/work-evolution-083.html)
- [BCP(事業継続計画)とは? はじめてでもわかる策定・構築の手順と対応方法](https://www.ntt.com/bizon/bcp/planning-attention.html)
nuxt&vuetify専用 dark/light テーマチェンジComponent

ボタンを押すとdark/lightのテーマが変わるよ

```vuejs:themeChanger.vue
<template lang="pug">
section
  v-btn(small, icon, @click='change')
    v-icon(small) mdi-theme-light-dark
</template>
<script>
export default {
  computed: {
    isDark() {
      return this.$vuetify.theme.dark
    },
  },
  methods: {
    change() {
      this.$vuetify.theme.dark = !this.isDark
    },
  },
}
</script>
```
【2022年10月版】 macOS で node をインストールする

# はじめに

macOS で node をインストールするメモです。ここでは nvm と nodebrew を使います。 

# brew のインストール

まずは　brew をインストールします

```terminal
> /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

# nvm 版

## nvm のインストール

```terminal
> brew install nvm
> echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
> echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm' >> ~/.zshrc
> echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion' >> ~/.zshrc
```

## インストールできる node の確認

```terminal
> nvm ls-remote
```

## node の最新安定版をインストールする

```teminal
> nvm install stable
```

# nodebrew 版
## nodebrew のインストール

```terminal
> brew install nodebrew
> echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
```

## インストールできる node の確認

```terminal
% nodebrew ls-remote
```

## nodebrew が壊れている時の対策

```terminal
> nodebrew setup
```

## node の最新の安定版をインストールする

```terminal
> nodebrew install-binary stable
```

# 利用できる node のバージョン確認

```terminal
> node -v
```

# 最後に

かんたんでしたね
csvにSQL実行できるdsq

# はじめに
別の場所から取得したデータ同士をIDでJOINしたいけど、SQL使いたいためだけにDB入れるのも面倒だし、JOINだけのためにプログラム書くのも嫌だなという考えから、csvデータに対してSQLを実行する方法を調べ、使いやすかったものを記しておくに至りました。

# 方法
[dsq](https://github.com/multiprocessio/dsq) というツールを使うだけです。
`csv sql` とか`csv query` で検索すると他にもいくつか使えそうなライブラリが出てくるのですが、導入のしやすさや使い方のシンプルさから私的には `dsq`  が一番使いやすいなと感じました。
インストール方法は[README](https://github.com/multiprocessio/dsq#readme)をご参照ください。

# 使い方
SQLの構文は基本使えるようですが簡単なJOINだけ書いておきます。
<details> <summary>※ 使ったデータ(テキトーデータです)</summary>

```csv:product.csv
id,name
1,tomato
2,banana
(省略)
...
```
```csv:sales.csv
store_id,product_id,sales
1,1,123000
1,2,290000
1,3,310000
(省略)
```

```csv:store.csv
id
1
5
(省略)
```
</details>

## INNER JOIN
以下のように、引数もシンプルでわかりやすいです。
SQL内のFROMの後のテーブル名は、N番目に指定したcsvを`{N}`のように書くだけです。

```bash
dsq product.csv sales.csv \
	"SELECT product.id AS product_id, product.name AS product_name, sales.store_id AS store_id, sales.sales AS sales FROM {0} product JOIN {1} sales ON product.id = sales.product_id"
```

csvが3つ以上でもふつうに使えます。
```bash
dsq product.csv sales.csv store.csv \
	'SELECT product.id AS product_id, product.name AS product_name, sales.store_id AS store_id, sales.sales AS sales FROM {0} product JOIN {1} sales ON product.id = sales.product_id WHERE store_id IN (SELECT id FROM {2})'

```


## OUTER JOIN

[README](https://github.com/multiprocessio/dsq#readme)には特に何も書いてなかったのですが、OUTER JOINも使えました。

```bash
dsq product.csv sales.csv \
	"SELECT product.id, product.name, sales.sales FROM {0} product LEFT OUTER JOIN {1} sales ON product.id = sales.product_id"
```

　ただ、`RIGHT OUTER JOIN` を試してみたところ、`RIGHT and FULL OUTER JOINs are not currently supported` となってダメでした。`FULL JOIN`もダメのようです。エラーメッセージ的に中身はSQLiteなのかもしれないです。


# おわりに
SQLの練習にも使えるなと思いました。
Web上で気軽にSQLを試せるサービスもありますが、データをDDLで定義しなきゃいけなかったりすることが多い印象なので、こちらの方が手軽ではと感じます。
【初心者向】APIとは何？

# Application Programming Interface
- アプリケーション
- プログラミング
- インターフェース

他社が提供するサービス内の`情報や機能を扱えるようにする仕組み`

> 利用者がサーバーに質問をリクエストし
サーバーがリクエストに対してレスポンスを返す仕組みです。

## 実際にAPIとはどんなもの？

`Facebook` `LINE` `Twitter` `YouTube`などが無償で提供するものから
`銀行` `google`が提供する有償のまで様々あります。

それらの最大のメリットは開発を効率的に行えることにあります。

### LINEの場合
ボットを作成し、応答メッセージの送受信をしたり、ユーザーがビーコンの電波の受信圏に入ったときにLINE公式アカウントがユーザーとどう対話するか設定することができます

>ボットとは
一定のタスクや処理を自動化するための
アプリケーションやプログラムのことです

>ビーコンとは
端末固有のID情報などを一定時間間隔で発信している端末のことです


### YouTubeの場合
- 動画の再生数やいいね数などの「動画情報の取得」できます
- 再生数の推移など「動画の統計情報の取得」ができます。
UX。この世をもっと使いやすく

「とかく人の世は住みにくい」

そう書かれていたのは、明治時代を生きた夏目漱石の草枕。

漱石といえばみなさんご存知の通り、当時の暮らしの日常感を小説に落とし込んで人気を博した大文豪。当時の生活観を巧みに抽象化させ、軽妙な筆致で多くの共感を呼んでいます。

世の中の住みづらさ。生きる上でのビミョーにしっくりこない感触。作品から当時のそうしたものを垣間見ることができます。

明治時代と今のどちらが住みよいかというのは置いといて、住みづらさ、ひいては物事の諸々に対する違和感というのは、いつだろうと人を悩ませてきたのだなと思うわけです。

そして、その違和感をアイデアで解消するのは、快感ですよね。

使えなかったものが使えるようになる。
もっとイイ感じに使えるようになる。

世の中のいろんな物事がweb上でなされるようになった現代において、そんなWeb上の「違和感」が気になって仕方なかった自分が、学び始めたのがUIとUXです。

勉強にあたって書き残したメモを徒然と載せていきます。