OmniAICreator/Qiita-1.07M huggingface dataset:
discord.js v14を使用した簡単な応答botの作り方

# discord.js v14を使用した簡単な応答botの作り方
## はじめに
どうもはじめまして、だらけ(darakeee)です。
今回はdiscord.js v14を使用して簡易的な返答Botを作っていこうと思います。

こちらは、JavaScript と discord.js を利用した Discord Bot 開発のチュートリアル記事を想定して書いております。

もし説明が間違っていたり、分かりづらかったら教えてください。


DeveloperPortalで必要な操作は別の記事を書いたので、こちらをご覧ください。

https://qiita.com/darakeee/items/bb923e1c0cde6c552f9f

## 動作環境
- npm 8.14.0
- node.js 18.4.0
- discord.js 14.1.2
- dotenv 16.0.1

※discord.jsは。node.js「16.9.0」以前は対応していないので注意。

## ファイル構成
> discordBot/
　├ node_module/
　├ src/
　│　 └ index.js
　├ .env
　├ package-lock.json
　└ package.json

## 手順＆各種コマンド
1. package.jsonの作成
    ```terminal
    npm init
    ```
2. discord.js、dotenvのインストール
    ```terminal
    npm install discord.js dotenv
    ```
    - discord.js→今回使うnode.jsのモジュール。
    - dotenv→.envファイルを読み込めるようになるモジュール。
     .envに記述されたキーをprocess.env経由で参照できます。

3. srcフォルダ、index.js、.envの作成
    上のファイル構成通りに作成してください。
    コードは下のものをお使いください。

4. 完成！

5. botを起動
    ```terminal
    node src/index.js
    ```
※node [起動したいjsの場所]で起動できます。

## コード(サンプル)
### index.js
```src/index.js
//dotenvの適用
require('dotenv').config();
//.envからtokenの呼び出し
const {token} = process.env;

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
	intents: [GatewayIntentBits.Guilds, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMessages]
});

//起動確認
client.once('ready', () => {
    console.log(`${client.user.tag} Ready`);
});

//返答
client.on('messageCreate', message => {
    if (message.author.bot) {
        return;
    }

    if (message.content == 'hi') {
        message.channel.send('hi!');
    }
});

//Discordへの接続
client.login(token);
```
※「hi」とチャットに書くと、「hi!」と返ってくるようになってます。

### .env
```.env
token=ここに自分のトークンをペースト
```
※「ここに自分のトークンをペースト」を消して、トークンをペースト。

## あとがき
ここまで見てくださり、ありがとうございます。
今回はdiscord.js v14でのBotの作り方をまとめてみました。
基礎的な部分しか今回は記載していないため、もし興味を持たれた方はぜひ公式サイトをチェックしてみてください！

https://discord.js.org/#/
Python,Ruby,PHP,Java,JavaScript,Perlの文字列処理の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの文字列処理の比較

# Python

https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887

# Ruby

https://qiita.com/kyohei-horikawa/items/b3308601931c20074c31

# PHP

https://qiita.com/chimayu/items/9b9cb14548aa7dd8da1b

# Java

https://qiita.com/suema0331/items/a3c947076ee1a0c6037a

# JavaScript

https://qiita.com/saka212/items/11ce1f1d6316c1fbf15b

# Perl

https://perlzemi.com/blog/20161003147558.html
【夏休み企画】#IT用語一問一答【毎朝投稿11日目】MIME

# この記事を読むと、、
- 「関連用語」を使って「MIME」を説明できるようになる
- 「MIME」がもっと好きになる(多分)

# 関連用語
ASCII / SMTP / Content-Type / base64

[**復習用**] 記事の内容を見る前に上記の言葉で「MIME」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/66a9b2d52e84927ba5da

# MIMEとは
MIME = Multipurpose Internet Mail Extensions = 非ASCII文字や画像・動画・実行プログラムなどなどのデータを電子メール上で表現する規格
- 「マイム」って読む
- 当初ASCII範囲内の文字しか扱えなかったSMTP上でも種々のデータを送れるように開発された
- SMTP, POP, IMAPといったプロトコルで使用される
- HTTPレスポンスのヘッダーにもMIMEの仕組みが使われている

**SMTP** = Simple Mail Transfer Protocol = 電子メールを送受信するためのL7プロトコル

**ASCII** = American Standard Code for Information Interchange = 数字や英字などを表す7bit文字コード

## MIMEヘッダーのフィールド
**Content-Type** = Media Type = MIME type
- `type/subtype; parameter`の形で書かれる
- 例えば`text/plain`, `application/octet-stream`, `image/jpeg`とかがこれ
- `multipart/mixed`などによって複数のMIME typeを複合して指定できる
    - このときboundary parameterによって本文をmultiple partsに分割する

Content-Transfer-Encoding = データの符号化方法を指定する
- 7bit, 8bit, binary, quoted-printable, base64が指定できる
- 7bitのテキストを転送するSMTPでは8bit, binaryは使えない
- **base64** = binary-to-text encodingの一種。1 octet x3を6 bits x4に解釈して各6bitにASCIIの64文字を割り当てる

# 参考資料
- https://en.wikipedia.org/wiki/MIME
- https://en.wikipedia.org/wiki/Media_type
- https://en.wikipedia.org/wiki/Base64
STM32G031と温度センサーS-8120Cで温度をPA_2シリアル出力(浮動小数点)


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)

x 過去ログを見よ
x PA_2をOBでGPIOに出来る人むけ
x STM32G031は、秋月で売っているSTM32G031J6M6の事


目的
安価に温度を測る。

v = -8.2 * t + 1705

式の変形

t = (v - 1705.0) / -8.2;





![o_con569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e68981bd-703f-6673-6a13-133c4429caab.jpeg)


![o_con690.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6ca83fb4-f902-ee4a-b7e0-97936924fc7b.jpeg)


![o_con691.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ed0ced5a-632a-f093-a6e2-a862d8164a7f.jpeg)



参考


https://qiita.com/caa45040/items/0b4838735301a7a26c88


https://qiita.com/caa45040/items/3686753c90e7e85ea7e4




```c++




//SER_S-8120C_float_031_1


#include "mbed.h"

//シリアルの定義
UnbufferedSerial serial_port(PA_2, PA_3); //031

//アナログ入力の設定
//AnalogIn adc_vbat(D0); //PB_7 ADC1/11
AnalogIn adc_vbat(PB_7); //PB_7 ADC1/11

//メイン関数
int main()
{

    //シリアルの初期化
    serial_port.baud(9600);
    serial_port.format(
        /* bits */ 8,
        /* parity */ SerialBase::None,
        /* stop bit */ 1
    );

    char data_read[256];  //バッファー

    //無限ループ
    while(1) {

        //ADCの読み込み 0から4096
        //int s = (adc_vbat.read_u16()>>4);

        //センサーのADC値を電圧に変換
        //float v = s * ( 3.3 / 4096.0 );
        //v = 1541;
 
        //センサーのADC値を電圧に変換
        float v = adc_vbat.read() * 3300;  
        

        //センサーの電圧を温度に変換
        // v = -8.2 * t + 1705  =>  t = (v - 1705.0) / -8.2;
        float t = (v - 1705.0) / -8.2;

        //整数と小数に分離
        int t_i = (int)t;
        int t_s = (int)(t*1000);
        t_s = t_s - (t_i * 1000);

        //数値の表示
        sprintf( data_read, "%3d", t_i );
        serial_port.write(data_read, 3);

        //ピリオドの表示
        serial_port.write(".", 1);

        //数値の表示
        sprintf( data_read, "%03d", t_s );
        serial_port.write(data_read, 3);

        //リターンの表示
        serial_port.write("\r\n", 2);

        //1秒待つ
        wait_us(1000*1000);

    } //while

} //main





```
SliP のご紹介

こんにちは SliP というコンピュータ言語を細々と作っているものです。最近この言語を使って複数の数式をコピペして一気に計算できる電卓サイトを作ったので紹介させて下さい。もしご意見等いただけたら幸いです。

アドレスは https://slip.828.tokyo になります。
![SS.Tutorial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/b9a76d1f-5e53-b86b-e1fe-78c8f92a1aef.png)


## 基本

まずはSliPの基本的なプログラムがどのような見た目かというと、数式そのものです。

```
4+2
```

このプログラムを評価すると6が出力されます。
同様に他の四則演算は以下のようになります。

```
4-2
4×2
4÷2
```

この3行は 2,8,2 と評価されて出力されます。
ちなみに掛け算の演算記号は`*`ではなく`×`、割り算のは`/`ではなく`÷`です。

上記の例でわかるように、SliP は中置記法で記述する言語です。



括弧にも対応しています。

```
2 × ( 3 + 4 )
```

は 14 になります。また、掛け算は省略することができて

```
2 3 4 
```
は 24 になります。
以下の定数があります。
```
π
e
∞
```
それぞれ、円周率、ネイピア数、無限大に対応しています。
変数を使うことができます。
```
'r = 2
2πr
```
とすれば、半径２の円周の12.566370614359172が得られます。
変数の名前は記号以外の大体の文字が使えます。
```
'hankei = 2
2πhankei
```
長い名前でも同じ結果になります。
但しギリシャ文字だけは１文字で使います。

超越関数も使うことができます。
```
cosπ
```
は-1になります。

## グラフィックス拡張

Web 版のSliP は [Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API) をラップしています。これを使って Canvas に図形を描くことができます。

```
[ 300 300 ]:canvas:rect[ 100 100 100 100 ]:fillStyle "red":fill:stroke
```
このプログラムは 300 x 300 の大きさの Canvas エレメントを作り、そこにラップされたAPI を使って四角形を描きます。
作られた Canvas エレメントはマウスのドラッグで動かすことができ、ダブルクリックで消すことができます。 

![SS.Graphics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/cfff21b8-5321-c250-940d-a94099844457.png)

ラップした名前には Canvas API のオリジナルの名前と違うものがいくつかあります。

* setTransform は transform に変えています。
* setLineDash は lineDash に変えています。
* fill の引数（塗りモード、パス）があるものは fillWith に変えています。
* stroke の引数（塗りモード、パス）があるものは strokeWith に変えています。
* clip の引数（塗りモード、パス）があるものは clipWith に変えています。
* path2D の引数（パス）があるものは path2DWith に変えています。

## 行毎モードとプログラムモード

SliP は Node.js や Python などの言語と同じように REPL(Read Eval Print Loop)で動きます。特に Read は行毎モードとプログラムモードの２種類を持っています。上記プログラムは行毎モードでのもので１行を１つのプログラムとして評価します。プログラムモードでは複数行にまたがるプログラムを書くことができます。上記サイトでプログラムモードで評価するためには、Option area の　'Programming mode' チェックボックスにチェックを入れます。

プログラムモードでは行毎モードで書いた式を括弧で括ります。例えば
```
2 × ( 3 + 4 )
```
は以下のようになります。
```
( 2 × ( 3 + 4 ) )
```
またこれを複数行に分けることもできます。
```
(
   2 × ( 3 + 4 )
)
```

Canvas にテキストを書いてちょっとクリップしてブラーをかけるサンプルです。

```
(   [ 300 50 ]:canvas
    :rect[ 0 10 300 35 ]
    :clip
    :filter "blur( 1px )"
    :globalAlpha 0.5 
    :font "bold 48px serif"
    :fillText[ "Hello world!" 0 50 ]
)
```


![SS.Text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/febc7d74-21bc-05ff-74cf-8e29829830a5.png)

## 最後に

ちょっと駆け足でしたが、SliP の紹介でした。直感的に使えると思うので、少し使ってもらえると喜びます。

また SliP の実装に関しましては以前に書いた記事がありますので、興味のある方はご覧ください。


https://qiita.com/Satachito/items/74878459a0efcba6d2d0

それではここまでお読みくださりありがとうございました。
[0から始めるQISKIT#2]Pycharmで量子回路を表示させてみる

# 概要
PycharmでQISKITを学習していく
今回は簡単な量子回路を実際に表示させてみる
# 学習書籍
IBM Quantumで学ぶ量子コンピュータ
著者	湊 雄一郎 （著）,比嘉 恵一朗 （著）,永井 隆太郎 （著）,加藤 拓己 （著）
# 端末
何年前のかわからないMacBookAir（メモリ４GB）
# やったこと
学習書籍P66に掲載されているコードを実装し、実行してみる
```Sample.py
from qiskit import QuantumCircuit
import matplotlib.pyplot as plt

qc = QuantumCircuit(2)

qc.h(0)
qc.cx(0, 1)

qc.draw('mpl')
```
# 問題
このまま実行しても、回路図が表示されなかった...
ログを見る限り実行には成功していそう
##### 実行ログ
```
/Users/******/PycharmProjects/QISKITPractice/virtual/bin/python /Users/******/PycharmProjects/QISKITPractice/QISKITArgorithm/Sample.py 

プロセスは終了コード 0 で終了しました
```
##### Python コンソール
```
/Users/******/PycharmProjects/QISKITPractice/virtual/bin/python /Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pydev/pydevconsole.py --mode=client --host=127.0.0.1 --port=56299 
import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend(['/Users/YutaSaito/PycharmProjects/QISKITPractice', '/Users/******/PycharmProjects/QISKITPractice', '/Users/******/PycharmProjects/QISKITPractice'])
Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18) 
Type 'copyright', 'credits' or 'license' for more information
IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.
PyDev console: using IPython 8.4.0
Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18) 
[Clang 6.0 (clang-600.0.57)] on darwin
プロセスは終了コード 0 で終了しました
```

# 解決策
matplotlibを使用するとどうやら表示できるみたいなので、実装してみた
```Sample.py
from qiskit import QuantumCircuit
import matplotlib.pyplot as plt

qc = QuantumCircuit(2)

qc.h(0)
qc.cx(0, 1)

qc.draw(output='mpl')
plt.show()
```
##### 実行結果：Pythonが起動し、別ウィンドウで回路図が表示されるようになった。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1785809/a737047d-357d-3903-1e8f-4e37beb4e1f9.png)


# 参考
まさに同様の問題について質問している人がいたため、参考にさせていただきましたmm
https://github-com.translate.goog/Qiskit/qiskit/issues/579?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc
文章もカプセル化することでわかりやすくなる~その①~

今日マーケティングチームの方と打ち合わせをしていて、
文章を書く上でもモジュールを作るうえでも大切だなと感じたことを手短に書かせていただきます。

結論から言うと、
関係性の高いものは１つに近くにまとめて、そうでないものは近くに置かないこと。
すなわちプログラミングでいうところの【カプセル化】です。
これ、文章を書くうえでも心がけると劇的に読み手に伝わりやすくなります。


もちろんその文章の内容のカプセル化を行うには、
なにをもって高い関係性というのか、事前に読み手となりうる人の立場に立つ
もしくは、事前に読み手に近い人、読み手本人からヒアリングしながら行う必要があるかと思います。


しかしながらこの考え方を意識してるかしてないかで、
だいぶ伝えたい内容が相手に伝わるように感じました。

そして１つの内容のカプセルと　ほかのカプセルとが結びついて、
普段われわれのお話しているストーリーができていると考えてみるといかがでしょうか？


「え？何を言ってんだこの女は？」って思った方のために、図を用意しておきました。


　
　↓　こんな風にはしないってことです。
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781175/5b5aee04-90e8-609c-a018-7c557aa417ff.png)
こんな風に赤でまとまっててほしい所に青が混ざってる状態、
それが　読みづらい何言ってんのかよくわからない文章　のことです。


反対にまとまってて読みやすいのはこんな感じです。↓の図を参照
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781175/acaf5f7e-fa2b-783b-c432-44a8b7fb65c0.png)


赤は赤だけに関係するものだけをまとめたもの。
青は青だけに関係するものだけをまとめたもの。
この関係性の高いものだけにまとめる作業がカプセル化といっても過言でないと思ってます。
これを目指すとマジでめっちゃ読みやすいんです。



こうやって絵にしてみたらだいぶ伝わりましたか？

おススメは具体例とかから入っても「え？」てときはこんな風に絵にして理解してみることです。
絵にすると本質部分だけくくりだした抽象的な状態になるんで、トップダウン式(抽象から入って徐々に具体に)の理解が向いている人はすぐに理解しやすいと思います。
（実際わたしもそちら側の人間です　コソ）


では、カプセル化されてる状態とそうでない状態の状況を把握したところで、
次回はそのカプセル化のための実現方法について記載したいと思います。
D言語でBrainfuxk処理系を作ったので、コンパイラを変えてベンチしてみる

# はじめに
処理系作成のチュートリアルでおなじみのBrainfu*kの処理系をD言語で作りました。

https://github.com/PenguinCabinet/Brainfuxk-D

# ベンチマーク
これを使って何かしたいので、コンパイルオプションやコンパイラを変えこの処理系をコンパイルして、マンデルブロ集合のBrainfuxkを実行し処理時間を見ます。

https://github.com/PenguinCabinet/Time-Brainfuxk-D

## テストするD言語コンパイラの皆様
|名前|概要|
|---|---|
|[dmd](https://dlang.org/dmd-windows.html)|公式のD言語コンパイラです|
|[ldc](https://dlang.org/download.html)|LLVMベースのD言語コンパイラです|

## 計測用のコード
```d
module measure;
import std.stdio,std.process,std.datetime.date,std.datetime.stopwatch;

void measure_time(string v1,string v2){
    executeShell(v1);
    writeln(v1);
    float time;
    auto sw = StopWatch(AutoStart.yes);
    sw.start();
    foreach (i; 0..10)
    {
        executeShell(v2);
    }
    auto t1 = sw.peek();
    auto temp=t1;
    auto temp2=temp.total!"seconds"/10;
    writefln("time:%d Second",temp2);
}

void main(){
    measure_time("dmd Brainfuxk-D/source/app","app Brainfuxk-D/test/Correct-Cases/mandelbrot.bf");
    measure_time("dmd -O -release -inline Brainfuxk-D/source/app","app Brainfuxk-D/test/Correct-Cases/mandelbrot.bf");
    measure_time("ldc2 Brainfuxk-D/source/app","app Brainfuxk-D/test/Correct-Cases/mandelbrot.bf");
    measure_time("ldc2 -O3 Brainfuxk-D/source/app","app Brainfuxk-D/test/Correct-Cases/mandelbrot.bf");

}
```
各コンパイラでコンパイルした後、10回実行して計測しています。
## 計測結果
実行した環境はWindows11です。
```text:実行環境
OS: Windows11
CPU: Core i7-12700
RAM: 32GB
```

|処理系をコンパイルしたコンパイラ|Brainfuxkのマンデルブロ集合の処理時間|
|---|---|
|dmd(v2.100.0-dirty) デフォルト|68s|
|dmd(v2.100.0-dirty) -O -release -inline|34s|
|ldc2(1.30.0) デフォルト|69s|
|ldc2(1.30.0) -O3|30s|

# まとめ
dmdもldcもちゃんと最適化オプションかけるかかけないかで、だいぶ違いますね。
リリースする時は気を付けたほうがいいです。
セマンティックバージョニング(ほぼ)理解した

毎度調べては忘れるセマンティックバージョニング。
忘備録の意味も兼ねてまとめてみた。

## セマンティックバージョニング[^1]とは
ソフトウェアのバージョンをどう管理するかについての決めごと。
具体的には、`メジャーバージョン` `マイナーバージョン` `パッチバージョン` の3パートから構成され、それぞれを x, y, z とすると `x.y.z` と表記される。
`メジャーバージョン` は、後方互換性のないAPIを変更した場合
`マイナーバージョン` は、後方互換性を保ちつつAPIを変更・追加した場合
`パッチバージョン` は、APIに影響を及ぼさないバグを修正した場合
にそれぞれバージョンアップされる。
**「どのバージョンを上げるかを意識するのは API 提供側のため、単に API を利用するのみの場合は、続けて記載するバージョン指定方法を理解した上で適切なバージョンを指定して開発を進めていくことになる」** と認識している。

[^1]: 本家: https://semver.org/lang/ja/

## npm におけるパッケージのバージョン指定
`npm install <package>` により npm パッケージをインストールすると、`package.json` ファイルにインストールしたパッケージ名とセマンティックバージョンが追記される。

```package.json
  ...
  "dependencies": {
    "hoge": "^1.2.3"
  },
  ..
```

この時、多くのパッケージに対して `^(キャレット)` や `~(チルダ)` がバージョンの前に付与されていることがわかる。
これは、単に指定されたバージョンをインストールするのではなく、以下のルールに従うことを意味する。

- `^`: 一番最初のゼロでないバージョンを固定し、それ以下は指定されたバージョン以上が対象となる。
- `~`: 
    - メジャーバージョンのみ指定されている場合: マイナーバージョン以下は、それらより大きなものが対象となる(メジャーバージョンのみ固定)。
    - マイナーバージョン以下も指定されている場合: パッチバージョンは指定したものより大きなものが対象となる。


#### `^` と `~` を伴うバージョン指定によりインストールされることが想定される例をいくつか示す。


| バージョン指定 | 想定インストールバージョン | 備考 |
|:-:|:-:|:-:|
| 1.2.3  |  1.2.3 | `^` や `~` がない場合は単一バージョンが対象 |
| ^1.2.3  | 1.y.z(y>=2, z>=3) で一番大きいの | メジャーバージョン `1` が固定、マイナー以下は任意 |
| ^0.2.3 | 0.2.z(z>=3) で一番大きいの  | マイナーバージョン `2` が固定、パッチは任意|
| ^0.0.3  |  0.0.3 | パッチバージョン `3` 固定|
| ^1.2 | 1.y.z(y>=2, z>=0) で一番大きいの  | ^1.2.0 と同義。マイナーバージョン以下は任意 |
| ^1  | 1.y.z(y>=0, z>=0) で一番大きいの  | ^1.0.0 と同義。マイナーバージョン以下は任意|
| ^0.2  | 0.2.z(z>=0) で一番大きいの  | ^0.2.0 と同義。パッチバージョンは任意|
| ~1.2.3  | 1.2.z(z>=3) で一番大きいの  | パッチバージョンは任意|
| ~0.2.3  | 0.2.z(z>=3) で一番大きいの  | パッチバージョンは任意|
| ~0.0.3  | 0.0.z(z>=3) で一番大きいの  | パッチバージョンは任意|
| ~1.2  | 1.2.z(z>=0) で一番大きいの  | ~1.2.0 と同義。パッチバージョンは任意|
| ~1  | 1.y.z(y>=0, z>=0) で一番大きいの  | ~1.0.0 と同義。マイナーバージョン以下は任意 |
| ~0.2  | 0.2.z(z>=0) で一番大きいの  | ~０.2.0 と同義。パッチバージョンは任意|

`npm install` によるパッケージのインストールの結果、`package.json` では特に `^` によるバージョン指定が多いが、これは **「後方互換性のないAPIを変更するメジャーバージョンアップ」を避ける範囲において最新のバージョンにする**という挙動となっており、make sense である。

#### ツールによる確認

なお、指定したセマンティックバージョンでどのバージョンが対象となるかは、こちらのサイトで確認できる。

https://semver.npmjs.com/

##### 例1)lodash: `^1.1.1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/511d1461-b013-db7a-03fa-fe234f6c2b19.png)

##### 例2)lodash: `^4.3`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/b9cfabd2-7cec-4085-b4e2-a026d9437e8b.png)

##### 例3)lodash: `~4.3`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/08ed255e-5ebc-8ed7-7210-999f1ed6f1b7.png)

## 参考にさせていただいたページ
https://qiita.com/takayukioda/items/359ed79e881ea7578291

https://qiita.com/sotarok/items/4ebd4cfedab186355867
Domino(フリーウェア)でMIDIキーボードの打ち込みをする

## 1. はじめに

数十年ぶりにピアノの練習をしようと2015年にキーボードを購入したところ、製品知識が何もないところに安易に「PCに繋がるものがいい」とMIDIキーボードを購入したら、音源がなく単独で音が鳴らず、PC等に接続しないと音が鳴らないものでした。
Windows PCにMusic Studio Producerを入れて音が鳴るようにして、たまに使用していました。(でも弾けない)

ふと、作曲をするという小学生の姪にあげれば有効活用してくれるのではないかと思い、作曲ソフトを探し、設定方法をまとめました。

## 2. 使用機材

## 2-1. MIDIキーボード

Amazon | M-Audio USB MIDIキーボード 88鍵 ピアノ音源ソフト付属 Keystation 88 PC, IOSデバイスとの接続により音楽制作や演奏が可能 | 楽器・音響機器 | 楽器・音響機器
https://www.amazon.co.jp/dp/B00IWTS58A
[<img src="https://images-fe.ssl-images-amazon.com/images/I/71omhf5UOfL.__AC_SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B00IWTS58A)

今は後継機種が安く売られています。

## 2-2. キーボード用スタンド

Amazon | Dicon Audio KS-020 Keyboard Stand X型キーボードスタンド ダブルレッグ | 楽器・音響機器 | 楽器・音響機器
https://www.amazon.co.jp/dp/B00ICXN3O2
[<img src="https://images-fe.ssl-images-amazon.com/images/I/51g3bBCXavL.__AC_SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B00ICXN3O2)

## 3. 使用ソフト(Windows)

## 3-1. Domino

MIDI音楽編集ソフト「Domino（ドミノ）」 | TAKABO SOFT
https://takabosoft.com/domino

## 4. Domino初期設定

1) Windows PCにMIDIキーボード(Keystation 88)を接続する。
2) Domino.exeを実行する。
3) 環境設定(F12)
4) MIDI-INをクリック
5) MIDI-INデバイス1を「Keystation 88」にする。
6) MIDI-OUTをクリック
7) ポートAの「MIDI OUTデバイス」を「Microsoft GS Wavetable Synth」に、
   音源（音源定義ファイル）を「GSm（Microsoft GS Wavetable SW Synth）」にする。
8) 「OK」をクリックする
9) 「音源（音源定義ファイル）が設定されました。[新規作成]を行うと、
   その音源専用の初期データが用意されます。今すぐ新規作成しますか？」
   と表示されたら、「はい」をクリック

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/7c470b09-4f4a-678d-8b2d-5450144c7a49.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/fd7832b5-fd0b-2d28-dd48-f5e657a33a6c.png)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/d612e733-b5a3-9200-dc00-9736d2c3ee4d.png)

## 5. DominoでMIDI打ち込み

「リアルタイム録音」または「ステップ録音」を選び、MIDIキーボードのキーを押していく。

「リアルタイム録音」では、「入力と同時に録音開始」と「即座に反映」にチェックを入れています。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/3f12a3d8-2d27-2ec2-6a75-35bfc9ea4686.png)
![スクリーンショット (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/64c88c5f-be15-b55d-d232-fc4801d60806.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/da107818-dadb-d137-051e-8dc1d33f2e5a.png)

## 6. 使用ソフト(iPad)

## 6-1. GarageBand

Apple製です。

## 7. iPadとMIDIキーボードの接続

USBケーブルにLightning-OTGケーブルを繋ぎ、接続します。

## 8. キーがずれた場合(ドを押しているのにレやシが鳴る等)の対処

1) MIDIキーボード(Keystation 88)のAdvancedボタンを押す(上のランプが点灯する)
2) RESETの下の黒鍵(C#4)を押す(Advancedボタンの上のランプが消灯する)

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/d0b03f2a-f2a7-5285-9dc7-fe19dd870396.jpeg)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/7200f6de-3f3c-d030-c642-70e6c4907b4f.jpeg)

## 9. 全く音が鳴らず、ノート(音符)の入力もできなくなった場合の対処

1) MIDIキーボード(Keystation 88)のAdvancedボタンを押す(上のランプが点灯する)
2) CH1の下の白鍵(D2)を押す(Advancedボタンの上のランプが消灯する)
   ※Domino.exeで通信チャンネルをデフォルトの1にしているため、
     何かの拍子で2～16にずれたら、1に戻さないと音が鳴らなくなる。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/22dc798c-3ec0-15b9-a817-9f4b957d9b54.jpeg)
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/db2ab21b-e399-9cc4-564b-46568b781c37.jpeg)
公開鍵暗号方式を利用したアクセス管理

# SSHでの接続
マシンスペックの上げ下げやバックアップなど、サーバー全体の操作はマネジメントコンソールを使って処理をする。一方で、
サーバーにインストールしたソフトウェアの操作には**SSH**という仕組みを使う。
そのためには、サーバーがわでSSHを使用するためもプログラム(デーモン)を動かし、
**クライアント側には操作するためのソフトウェアをインストールする必要がある**。
**サーバー側では、SSHを使用するためのプログラムはインストールせずとも、すでに入っていて、起動している**。
クライアント側には**Putty**(パティ)や**Tera Term**（テラターム）というソフトウェアがよく使われる。
# キーペアとは
キーペアとは**ログインする際の認証に使用する**「**公開鍵**」**と**「**秘密鍵**」**のペア**をいう。
公開鍵方式・・・鍵をかけるキーと鍵をあけるキーを公開鍵と秘密鍵の組み合わせで行う方法。
自分以外に公開する鍵を**公開鍵**(パブリックキー)
自分だけが知っている秘密の鍵を**秘密鍵**（プライベートキー）
この２つが１セットで、AWSではこの２つが１ファイルとして扱われる。
SShでサーバー（インスタンス）に接続するとき
インスタンス側でキーペアに含まれる「公開鍵」を指定しておき、
クライアント側でソフトウェアにダウンロードした「キーペアファイル」を秘密鍵として設定して使う。
※キーペアは作成した時だけダウンロードでき、再発行できない。
紛失した場合、サーバーを作り直すことができる。
M5Core2×VSCode×PlatformIO シリアル通信で文字化けが起こったら

# シリアルモニタの文字化けを解決する方法

M5Core2の開発をVS CodeとPlatformIOで進めていると、シリアル通信でのデバッグ中に文字化けが発生することがよくあります。本記事では、その原因と解決方法を詳しく解説します。

## 文字化けが引き起こす問題

シリアル通信の文字化けが発生すると、エラーやログが判読不能になるため、作業効率が低下してしまいます。

## 文字化けの原因
1. **通信速度の不一致**
   送信側と受信側の通信速度が異なると、データが正しく解釈されず文字化けが発生します。

2. **ケーブルとの接続の問題**
   低品質なUSBケーブルや接続ポートの不具合が原因になることがあります。

3. **COMポートの設定ミス（Windowsの場合）**
   COMポートの設定が正しくない場合に問題が発生します。

## 解決方法

文字化けを解消するには、以下のファイルを設定します：
- **`src/main.cpp`**
- **`platformio.ini`**

さらに、ケーブルの接続、COMポートの設定の確認も行います。

---

### STEP1: 通信速度を一致させる
- `src/main.cpp` と `platformio.ini` で通信速度を一致させます。
- 以下の通信速度のいずれかを試します：
  **300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200**

#### ① `src/main.cpp` の設定
以下のコードを記述し、通信速度を設定します：
```cpp
void setup() {
    Serial.begin(19200); // 通信速度を19200bpsに設定
}

void loop() {
    // デバッグ用コードを書く
}
```
- `Serial.begin()` を使って通信速度を設定します。
- `setup()` 内で通信速度を指定してください。

**参考:** [Arduinoリファレンス](https://cdn.arduino.cc/reference/jp/language/functions/communication/serial/begin/)


#### ② `platformio.ini` の設定
`platformio.ini` はPlatformIOプロジェクトの設定ファイルです。以下のように設定します：

```ini
[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = arduino
monitor_speed = 19200
lib_deps =
    m5stack/M5Core2@0.1.2
```
- **`monitor_speed`**: シリアルモニタの通信速度を設定します。
  `src/main.cpp` と同じ値に設定してください。

---

### STEP2: ケーブルとの接続の確認
- 接続ポートが正しく差し込まれているか確認します。
- ケーブル自体の不具合の可能性もあるので、他のケーブルでも試すことをオススメします。

---

### STEP3: COMポートの確認（Windows）
- デバイスマネージャを開き、使用中のCOMポートを確認します。

---

## まとめ
シリアル通信の文字化けは、通信速度の不一致やケーブルの問題、COMポート設定のミスなどが主な原因です。問題を一つずつ確認し、適切な設定を行うことで解決できます。

---

### 参考資料
- [Arduinoリファレンス](https://garretlab.web.fc2.com/arduino.cc/www/reference/ja/language/functions/communication/serial/)
- [PlatformIO設定ガイド](https://docs.platformio.org/en/latest/projectconf/index.html)




### 補足事項
- `platformio.ini` の `platform`、`board`、`framework` はプロジェクト作成時に自動で設定されます。
- 必要なライブラリを追加すると、`lib_deps` に自動反映されます。
resources :~, only: %i[index] の"%i"は何者なのか

はじめに
--
ポートフォリオ作成で参考にしたコードで、ルーティングの設定を記述する際に"%i"という文字列が出てきて、どんな意味が分からなかったので調べたものを備忘録として残そうと思います。


%iとは何者なのか
--
どうやら、"%i"は「％記法」（パーセント記法）という形式の記法の中の一つのようです。

%iを使用することによって、シンボルの配列を作成してくれます。

https://railsdoc.com/page/symbol_info

例を見た方がイメージが湧くかもしれません。

~~~rb
# 例：
%i[red blue yellow white black]
# 下記の配列が作成される
[:red, :blue, :yellow, :white, :black]
~~~

%iを使用することにより、":"を記述せずに配列を作り使用することができるということでした。

なので、今回の最初に疑問を持った式を使用すると、下記のようになります。
"："を書く手間を省いたと言うことですね。

~~~rb
resources :~, only: %i[index]
# 下記を書いていることと同義
resources :~, only: [:index]
# 複数のアクションを指定するときはさらに便利そう
resources :~, only: %i[index new create delete]
~~~

最後に
--
%記法には他にも色々あるみたいなので、まとめて調べてみてもいいですね。
"%"とか、"/"とか"\"を見るとウッ、、ってなるので正規表現についても理解したいなぁと思ってます。
なるべくお金をかけずにAWS11冠する方法

# 概要
半年前に一緒にAWSの資格を取ろうぜと誘われたことをきっかけにAWSを11冠(※)を目指して、
2022年8月14日に無事達成できたので記事を書こうかなという気になった次第です。
で、私は会社に所属してはいますが、資格を取ったとしても報奨金も出ない身です。
そのため、なるべくお金をかけずに取る方法を残しておきたいと思います。
※当時SAP on AWSは正式な試験は無かったため、11冠が最高でした。

# 筆者のレベル
- 業界7年目
- 基本的にオンプレで動く既存システムのコード解析・プログラム改修を行っている
- インフラの知識は応用情報技術者試験、CCNA、LPIC Lv1　を取ったレベル
- クラウドの知識はほぼ無し

# 結論
早速ですが、以下結論です。
**[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)** (以下、koiwaclub)をひたすら擦りましょう。
また、以下の無料で利用できる問題集、学習サイトをも併せて使うと合格率がアップすると思います。
- 各AWS資格のページにあるサンプル問題
- Exam Readiness
- Skill Builderの公式模擬試験

# かかったお金
結局のところ試験代含めていくらかかったかというと以下の通りです。
|サービス|かかったお金|備考|
|--|--:|--|
|試験代金(プラクティクショナー)|12,100円||
|試験代金(アソシエイトレベル)|49,500円|16500円*3資格|
|試験代金(プロフェッショナル・スペシャリティ)|115,500円| 33000円/2(半額バウチャー) * 7資格|
|koiwaclub|10,960円|5480円*2回分|
|Udemyの模擬試験(Machine Learning)|2,200円|セール期間中に購入|
|Udemyの模擬試験(Data Analytics)|1,720円|セール期間中に購入|
|Udemyの模擬試験(Database)|6,100円||
|Udemyの模擬試験(Solutions Architect Professional)|1,840円|セール期間中に購入。結局使わなかった|

|内訳|総額|
|--|--:|
|勉強代金|22,820円|
|試験代金|177,100円|
|合計|**199,920円**|

## 所感
この記事書くまでいくらかかったとか計算してなかったですが、意外とお金使っているなという感じです。
大体が試験代金ですね。
全部一発合格でしたので、不合格による余計な出費はありませんでしたが、それでも試験代金はかなりかかってます。
アソシエイトの試験代金に半額バウチャーを使うことも出来たのですが、もしプロフェッショナル・スペシャリティで連続で落ちて半額バウチャーが無くなったら大ダメージなので、ビビって使いませんでした。
また、Udemyの模擬試験を買っていますが、これは**koiwaclub**の問題数が少なく、
合格するにはもう少し勉強する必要があるかなと感じて追加で購入しました。

## さらにお安くするには
素直に合格時だけでも試験代金を出してくれる会社に所属することをオススメします。
上記よりさらに切り詰めるには**koiwaclub**を3カ月だけ契約してその期間に取り切る。ぐらいでしょうか。

# 資格取得方法
## 資格の取得順序
以下の記事を大いに参考にしました。
[【最速】既婚子持ち社会人のクラウド初心者でも、1ヶ月半でAWS資格11冠制覇できる方法](https://qiita.com/mrpepper/items/64039b828c82e12ad35f)
上記の記事の通り、CLFから始まり、アソシエイト→DOP→SAP→スペシャリティ
と取るのが効率が良いです。
スペシャリティに関して言えばDBSを取れていればDASが、DASを取れていればMLSが2～3割くらいはすでに解けるような感じになっています。

## 勉強方法
こちらも[【最速】既婚子持ち社会人のクラウド初心者でも、1ヶ月半でAWS資格11冠制覇できる方法](https://qiita.com/mrpepper/items/64039b828c82e12ad35f)を参考にしつつ、ひたすら**koiwaclub**の問題集を解いて、解説を読んで理解するを繰り返しました。これでプロフェッショナルまではいけました。
スペシャリティまで行くと**koiwaclub**だけでは足りないものも出ます。
特に「Machine Learning」「Data Analytics」「Database」は問題数が少なく少し厳しいかと思います。
上記3資格はUdemyなどで追加の問題集を買って解くのがよいかと。
**koiwaclub**はもういいかなと感じたところで、公式で用意されている以下の問題を順に解いていきます。
- 各AWS資格のページにあるサンプル問題
- Exam Readiness
- Skill Builderの公式模擬試験

これを資格分繰り返せばOKです。

## 勉強方法補足
**koiwaclub**を解けばよいと書きましたが、Solutions Architect Associateだけは問題数が膨大なため
全て解く必要はないかもしれません。ここらへんは**koiwaclub**の合格記あたりを参考にして
解く問題を決めてから解くとより効率よく勉強できるかと思います。

# 蛇足
以下、参考までに私の取得した順序と取得日付、点数を記載しておきます。
本腰入れてAWSの資格を取ろうと考えたのが2月中旬あたりで、そこからkoiwaclubの問題集を解きまくっていた
記憶があります。ですので、およそ半年ぐらいで11冠という感じですかね。

|No|略称|取得日付|点数|備考|
|--|--|--|--|--|
|1|CLF|2022-01-22|820|問題集未使用|
|2|SAA|2022-04-03|844||
|3|SOA|2022-04-23|754||
|4|DVA|2022-04-30|866||
|5|DOP|2022-05-28|852||
|6|SAP|2022-06-18|790||
|7|SCS|2022-06-25|797||
|8|DBS|2022-07-02|798||
|9|ANS|2022-07-09|780||
|10|DAS|2022-08-06|842||
|11|MLS|2022-08-14|803||

## 終わりに
先人の知恵をお借りしつつ、自分なりには効率的に資格取得できたかなという印象です。
現時点でAWSを使った仕事は全くしていないため、このままAWSに触らずにいると多分半年後には勉強した内容があやふやになるので、出来ればなんかしらでAWS関われる仕事に携われたらなぁと考える今日この頃です。
マネジメントコンソールとダッシュボード

# マネジメントコンソールとは
Webブラウザ上でAWSのサービスを管理する画面（ユーザーインターフェース）
サービスごとに固有の画面(ダッシュボード)が用意されていて、サービスの設定やリソースグループ（リソースとは各種インスタンスなど稼働中のサービスや、容量を確保したサービスなど利用中のもの一式）の検索と使用、AWSのドキュメントの参照などさまざまな管理ができる。
マネジメントコンソールによって、複雑なコマンド入力してサービスを操作する必要がない。
## マネジメントコンソールでできること
* AWSのアカウント管理
* サービスの利用
* サービスの設定
* ドキュメントの参照
* モバイルデバイスからの管理
* 請求の確認
# リージョンの選択
マネジメントコンソールは地域を表すリージョン単位で操作する。
同じAmazon EC2サービスでもリージョンが違うと別のものと扱われる。
※マネジメントコンソールは最初ログインするとデフォルト設定がバージニア州になっているので、使用したいリージョンに切り替える。
**リージョンによって使用できるサービスが異なる**
使用できないサービスを選択すると利用可能なリージョンに切り替えるようにアラートが出る。
# ダッシュボード
マネジメントコンソールにはサービスごとにメニューがあり、それぞれの画面で操作する。サービス操作におけるメイン画面を**ダッシュボード**という。
ex)EC2であれば、**EC2ダッシュボード**。S3であれば**S3ダッシュボード**が用意されている。
## ダッシュボードを開くまでの手順
1. AWSアカウントでログイン
1. リージョンを設定する
1. サービスを検索する
1. ダッシュボードを開く
# 余談
## AWS CLIとは
AWS CLIとはローカルのコマンド端末、またはサーバーからコマンドやスクリプトでAWSサービスの利用を迅速に行えるためのCLI。
AWSのサービス設定や操作は、マネジメントコンソールによって視覚的に行えるが、
スクリプトを書いて複数の操作を一括実行したり、より自動化・プログラム化された方法で行ったりする場合は**AWS CLI**が便利。
↓AWS CLIにおけるコマンドの例
```AWS CLI
//i-12345678という名前のEC2インスタンスを起動する
$ aws ec2 start-instances --instance-ids i-12345678
//S3のバケット一覧を表示する
$ aws s3 ls
```
エンジニア未経験が実務で活躍、または、爆速で成長するための能力とその能力の高め方を調べてみた２

今回の記事は、下記記事の続きです。
[エンジニア未経験が実務で活躍、または、爆速で成長するための能力とその能力の高め方を調べてみた１（能力は計６個）](https://qiita.com/niceboad2525/items/8b53d57955569206c2e6)

# 要約（上記記事）
爆速で成長するために必要な能力とは、
１、問題解決力
２、論理的思考力
３、プログラミング能力
４、技術知識（サーバー、ネットワーク、セキュリティ、OS）
５、読解力
６、逆算力
の６つ。
今回は、読解力と問題解決力を高める方法についてまとめました。

# 読解力を高める方法
１、語彙力を鍛える。
２、読書する（多読する）。
　　→１の語彙力も読書をすることで高めることができる。
３、要約する。
４、国語（現代文）の勉強
→読書で、要約するのがめんどくさい場合、本１冊に比べ、文章量が圧倒的に少ないので、 国語の問題で出てきた文章を要約することから始めるといいかもしれない（個人的な意見）。
 教材はただよび（無料）がおすすめ（講師は出口先生、個人的意見）。
短いし、動画も２０分程度だから手間もあまりかからない（倍速おすすめ）
以下、再生リスト：

https://www.youtube.com/watch?v=yR0GOytFIEk&list=PLt4g_MlAkmOr8KMK7cgw1TyAD6JRcaajW

問題解決力を高める方法
１、身近にいる人や本から学ぶ。
２、問題解決の考え方を学ぶ。
３、問題が起きた時原因を書き出してみる。
４、論理的思考力を高める（高め方は、前記事[エンジニア未経験が実務で活躍、または、爆速で成長するための能力とその能力の高め方を調べてみた１（能力は計６個）](https://qiita.com/niceboad2525/items/8b53d57955569206c2e6)に記載）
５、課題発見力を高める
    →課題発見力を高める方法
１、クリティカルシンキングを身につける。
２、現状を疑う。
    →現状をそのまま受け入れるのではなく、もっと良いやり方はないのか？
    （<b>改善点はないか？</b>）を考える。
    PDCAを回せば課題発見力は高まる気がします（個人的意見）
# 気づき（感想）
論理的思考を高めると、問題解決力が高まるというように、相関があるので、<b>１個ずつ高めるのではなく、まとめて高めていくとより効果が出る</b>と思った。

# 参考文献
（読解力編）
文章読解力を鍛える簡単な方法7選
https://jp.indeed.com/career-advice/career-development/reading-comprehension-improvement-strategies
読解力を鍛えるメリットと高めていく方法
https://mba.globis.ac.jp/careernote/1306.html
読解力を鍛える6つの方法｜豊かな人生を送ることができる
https://www.koov.io/column/1544
読解力がないとどうなる？読解力を鍛える4つの方法とは
https://syundoku.jp/speed-reading/reading-comprehension#1%E8%AA%9E%E5%BD%99%E5%8A%9B%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E3%80%8C%E5%A4%9A%E8%AA%AD%E3%81%99%E3%82%8B%E3%80%8D
では，どうやって読解力をつけるか
https://wakuwakustudyworld.co.jp/blog/archives/82/

（問題解決力編）
課題発見力を高める方法。潜在的な問題を見つけるための3ステップとは
https://mba.globis.ac.jp/careernote/1229.html
【社会人基礎力】課題発見力を身につけ効果的にアピールするには
https://internshipguide.jp/columns/view/syakaijinkisoryoku-kadaihakkenryoku
社会人に必須の問題解決能力を鍛える3つの方法
https://mba.globis.ac.jp/careernote/1227.html
VSCodeの実行をショートカットで完結させる

# :point_up:はじめに
VSCodeを使用している際、実行のたびに右上の再生ボタンから実行していました、、、
ショートカットないかなと調べ、見つけた方法を記載します！

# :point_up:方法
■結論：拡張機能「Code Runner」をインストールすることで解決。

1. 拡張機能タブで「Code Runner」検索し、インストール
1. インストール後、拡張機能のインストール済みに追加された「Code Runner」の歯車から拡張機能の設定を開く
1. 「Run In Terminal」のチェックをオンにする（しない場合はターミナル上でなく出力上に実行結果が表示される）
1. 実行したいクラスで「Ctrl + Option + N（Mac）」で実行（Windowsの場合は「Ctrl + Alt + N」）
1. `DONE`

# :point_up:まとめ
これでいちいち再生ボタン押さずに済みました！
↓拡張機能設定の補足画像
![スクリーンショット 2022-08-19 0.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382961/d8a24c20-6c6f-82ce-e95b-74d4df88ce42.png)
docker-compose設定：MySQLのクエリーログをターミナルに標準出力する

## バージョン
mysql:8.0
Docker:20.10.13
docker-compose:1.29.2

## docker-composeの設定
mysqlの設定にcommand以下の設定を追記する。

```yaml
  db:
    image: mysql:8.0
    ・・・中略・・・
    command:  >
      bash -c '
      touch /var/log/general.log &&
      chown mysql:mysql /var/log/general.log &&
      tail -f /var/log/general.log &
      /entrypoint.sh mysqld
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --general-log=true
      --general-log-file=/var/log/general.log
      '
    logging:
      options:
        max-size: "10k"
        max-file: "5"

```
docker-compose up -dでコンテナを起動時、mysqlのコンテナに入り、general.logファイルを作成。
作成したファイルの権限をmysqlに変更し、編集可にし、mysqlの設定で標準出力をonにしています。


## ターミナルでログを確認する。
```
docker logs -f  {$dbコンテナ名}

2022-08-18T23:59:48.904767+09:00           11 Prepare   insert into `users` (`name`, `email`, `email_verified_at`, `password`, `remember_token`, `updated_at`, `created_at`) values (?, ?, ?, ?, ?, ?, ?)
2022-08-18T23:59:48.905040+09:00           11 Execute   insert into `users` (`name`, `email`, `email_verified_at`, `password`, `remember_token`, `updated_at`, `created_at`) values ('aaa', 'email4991@email.com', '2022-08-18 14:59:38', '**********', 'GpDgHwVbAb', '2022-08-18 14:59:48', '2022-08-18 14:59:48')
2022-08-18T23:59:48.905950+09:00           11 Close stmt
```
ログファイルをマウントしてデータの永続化するまでもない時に便利です。

参考：
https://qiita.com/suin/items/95f15649a3ac39c8e9fb
【Selenium】よく使う処理についてまとめた

Webサイト情報を取得する際によくSeleniumを使用するため、
よく使うものをまとめました。

個人的よく使う場面は、ログインが必要なものです。

## Seleniumのインポート

基本的にSeleniumを使用する際は、以下をインポートしてます。
ChromeDriverManagerを入れることでChromeがアップデートされてもバイナリファイルをダウンロードしなくてよくなるので、入れてます。

```python
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
```

```python
from selenium.webdriver.common.by import By
```

上記については最新のSeleniumを使用する場合は必要になります。

## よく使うもの

### ブラウザ起動

以下でChromeブラウザを起動します。
この時、browserに格納されているものが現在ブラウザで表示されているものになります。

```python
browser = webdriver.Chrome(ChromeDriverManager().install())
```

### URLにアクセス

以下で引数のurlにアクセスします。

```python
browser.get(url)
browser.implicitly_wait(3)
```

### 要素取得

スクレピングをする際はここは多用するかと思います。

一つの要素を取得したい場合

複数の要素をリスト型で取得したい場合

同じclass名の文字を取得したい場合は、find_elementsで取得して
for文で1つずつ取り出します。

```python
a_tag_ele = broser.find_elements(By.TAG_NAME, "a")
for a_tag in a_tag_ele:
  print(a_tag.text)
```

アウトプット何にするか悩んでいるプログラミング初学者の方はスクレピングは、
よく使うサイトの情報を取得するスクリプトを作成するのが、
簡単で良いと思いますので、ぜひやってみてください！

また、Seleniumの細かいコマンドは以下サイトを参照ください
[Seleniumクイックリファレンス](https://www.seleniumqref.com/index.html)
【個人開発】企業の技術スタックをまとめてみれるサイトをアップデートしました！

1ヶ月ほど前に、企業の技術スタックをまとめてみれるデータベースサイト「[what we use](https://www.whatweuse.dev/)」のベータ版リリース記事を書きました。

https://qiita.com/mycndev/items/757cf6932b8687a06e36

おかげさまで多くの方に見ていただき、Twitterでも比較的ポジティブなフィードバックをいただくことが出来ました！あれからおよそ1ヶ月が経過し、いくつかアップデートを追加したので、それについて告知させてください。

## ツール[^1]で企業を検索できるように

初期リリースではなかったけど、最優先で実装したいと言っていた機能です。TOPページにいくつかアイコンを置き、そのツールを使う企業を見れるようにしました。（僕の独断でいくつかピックアップして置いています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731282/a80cccb2-1687-8681-a895-9a1f9b6738f7.png)
今流行りのMiroを使っている企業一覧です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731282/8658f8bd-41a9-d746-d316-38feb5a753ab.png)
企業ロゴとか使えるともう少し見た目がよくなりそうですが、利用規約の関係もあると思うので、載せるのは控えています。[OpenWork](https://www.vorkers.com/)は全企業のロゴが掲載されているけど、あれはどういう仕組みなんでしょうか？どうやってロゴ掲載許諾取ってるか知ってる方いたら教えてください。


## SSG (Static Site Generator)で高速化
そもそも、以前はデータを全てフロント側にJSONハードコードしていたのでページ遷移は高速だったのですが、ツールでの企業検索機能を追加する必要があったので、今回はバックエンドを開発しました。NestJS + Prisma + Postgresで作って、Herokuにデプロイしています。

データ量自体が少ないので、SPAとして都度APIを叩いてデータ取得してもそこまで遅くはならないと思うのですが、SSGに挑戦できる良い機会だと思ったので使ってみました。

まぁ結果としては元々読み込みは速かったので違いはそんなにわからないです笑

企業に使われていないツールの検索結果ページを予め生成しても無駄かなと思ったので、企業に使われているツール一覧を返すAPIを一本生やして、その数だけpathを生成しています。
```js
export async function getStaticPaths() {
  const res = await fetch("https://api.xxx.com/tools/used");
  const tools = await res.json();
  const paths = tools.map((tool: TypeTool) => ({
    params: { code: tool.toolCode },
  }));
  return { paths, fallback: false };
}
```
LightHouseの結果もいい感じじゃないでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731282/d7a49922-5860-d838-04bd-774615116865.png)
## ツールアイコンと企業データ追加
ちょっと増やしました。今後も地道に増やしていきます。技術スタック登録ページみたいな管理画面作るとしても自分だけしか使わないので、スプレッドシートのデータ入力規則に、ツールのマスターデータをぶち込んでサクサク入力できるようにしてます。

そこからSQLを生成して、DBに投入するという雑運用です。

## 今後の方針
コンテンツ拡充することで、ユーザー数を増やしていくことを最優先でやっていこうと思います。コンテンツというのは、企業の技術スタックもそうなんですが、それだけだとSEO的には弱い気がするので、もう少し読み物的なものも増やしてSEOからの流入とか増やせるといいかなーと。

あとは、各ページのPVから人気企業ランキングとか人気ツールランキングとか作れると面白いと思っています。ちなみに現状の企業ページPageviewランキングは、1位: CyberAgent 2位: Mercari 3位: ZOZOのトップ3でした。

--- 
ということで、このサービス面白い！と思った方は是非、LGTMと[Twitterアカウント](https://twitter.com/whatweuse)のフォローお願いします。Twitterでは、企業追加情報とかを発信していく予定です。たぶん、1週間に数回くらいしかツイートしないと思うので、タイムラインの邪魔にはならないかと・・・

[^1]: ところで、「技術スタック」とは、企業が採用している技術の集合体のことです。前記事では「技術スタックで検索」と記述していましたが、よくよく考えてみるとおかしいので「技術で企業を検索」と書いてみましたが、それも微妙かなと思ったので、「ツールで企業を検索」に着地させました。テーブル名やclass名とかもtoolを使ってます。
エラーメッセージの日本語化についての実装




①まず初めに、日本語の言語設定を行う
  

    # 日本語の言語設定
    config.i18n.default_locale = :ja

 # config/application.rb
     # 日本語の言語設定
      module Pictweet
       class Application < Rails::Application
      # Initialize configuration defaults for originally generated Rails version.
        config.load_defaults 6.0
        config.i18n.default_locale = :ja
         # 省略
       end
      end
②日本語に対応する"rails-i18n"というGemを導入します。

# Gemfile
　gem 'rails-i18n'
# ターミナル
　bundle install

⚠️この段階では、まだ完全に日本語化しきれていません。


③config/localesディレクトリに、devise.ja.ymlというファイルを作成します。
下記のサイトに記述内容が掲載されているので、丸ごとコピーして作成したdevise.ja.ymlの中に貼り付ける。
https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml

ymlファイルは、インデントにミスがあるとエラーが生じます。コードを貼り付けた後、インデントにミスがないか必ず確認する。

このままではモデルなど自分で名付けたものは英語表記のままになっている。

④config/localesディレクトリに、ja.ymlというファイルを作成します。

# config/locales/ja.yml　
    ja:　
       activerecord:
    attributes:
      user:
        nickname: ニックネーム
      tweet:
        text: テキスト
        image: 画像



・モデルのバリデーションでエラーメッセージのコメント指定をしている場合は、変更されない場合があるので注意する。

例）　　validates :item_name, presence: { message: "can't be blank" }


　　　　　　　　　Item name can't be blank   は英語の表記のままになる。
TeX の節見出しを「第n節」などにする

この記事は以下の記事と趣旨が同じですが方法の方向性が違うので別記事にしています。この記事の方法は toc を書き換えにいかなくてよいですが記述量が多いです。よい方法かはわかりません。何かありましたらご指摘ください。
[LaTeXの論文の目次に「第~章」だけでなく「第~節」まで入れる方法 - Qiita](https://qiita.com/aqua_ix/items/655528b7dc980eab3956)

## やりたいこと
本文中及び目次における節見出しを「第n節 ほげほげ」などにしたい（デフォルトでは「n ほげほげ」となる）。
- 以下の例では「第n話」にしています。
- カウンターをローマ数字にすれば「エピソード II」などもできると思います。
- 節でなくても章や小節でもよいです。

## 方法
自分で節番号を管理するカウンターを用意し、節を開始する度に、
- そのカウンターを進め（ `\stepcounter` ）、
- 見出しの文言を命令として定義/再定義し（ `\newcommand` / `\renewcommand` ）、
- まず目次に登録せずに節見出しを表示し（ `\section*` ）、
- 次に自分で目次に登録する（ `\addcontentsline` ）

ようにすれば実現できます。
見出しの文言を命令として定義しているのは本文中と目次の見出しを確実に同期するためです。
節を開始する度に4行消費しますが後半2行は全くコピペです。
```tex
\newcounter{mycounter}

\stepcounter{mycounter}
\newcommand*{\mysectiontitle}{クッキー、Spring Boot 開発に参加する}
\section*{第{\themycounter}話 \, \mysectiontitle}
\addcontentsline{toc}{section}{\numberline {第{\themycounter}話}\mysectiontitle}

ここに最初の節の内容をかく。

\stepcounter{mycounter}
\renewcommand*{\mysectiontitle}{クッキー、最大の謎に直面する}
\section*{第{\themycounter}話 \, \mysectiontitle}
\addcontentsline{toc}{section}{\numberline {第{\themycounter}話}\mysectiontitle}

ここに次の節の内容をかく。
```

ちなみにこれをやっている TeX 文書とコンパイル後の PDF が以下です。
- https://github.com/CookieBox26/notes/blob/f4f23273f22d6b43f9870d022fc979b5d40dbfc5/20211226_spring_boot/main.tex#L122-L126
- https://github.com/CookieBox26/notes/blob/main/20211226_spring_boot/main.pdf
【jQuery】ドロップダウンの開閉(クラスの変化)をトリガーにCSSの変更を動的に実装

# はじめに
ドロップダウンを開いた時に、cssを変更する操作を動的に行いたい。
railsのアプリ環境で行う。

# 環境
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   Mac     |
| 2  |       Ruby      |   2.6.3   |
| 3  |       rails      |      6.0.4 |
4|jquery-rails|4.5.0
# 実装
[こちら](https://ayaka-weblog.com/programming/html-css-programming/wai-area-accordion/)の記事を参考にjsファイルを書いた。

# jsファイル読み込み設定
全ページにjsファイルを読み込むように設定する。
```app/javascript/packs/application.js
// app/javascript　を起点に記載
require ('user/dropdown')
```
# jsファイルの設定
.dropdownクラスをクリックした時のイベントを起点に発火させる。
thisは.dropdownクラスを指す。
```js:app/javascript/user/dropdown.js
$(function(){
  // dropodownクラスがついている要素をクリックした時
  $('.dropdown').on('click', function(){
      // dropdownクラスから見て.navbar-rightクラスが付いている親要素を.parentsで取得する
      // (『this』は.dropdownを指します。)
      // 【確認】.dropdownのクラス属性がdropdownとopen(ドロップダウンが開いている状態)であればtrueを出力
      console.log('dropdown open?', $(this).attr('class')=='dropdown open');
      // 【CSS変更】.dropdownを開閉するたびに「.open」が追加・削除されるため、それをトリガーに背景色を変える
      if( $(this).attr('class') == 'dropdown' ) {
        // .dropdownのクラス属性がdropdownのみであれば.navbar-rightを青くする
        $(this).parents('.navbar-right').css('background-color' ,'blue');
      } else {
      // .dropdownのクラス属性がdropdownのみでない(dropdownとopen)場合、.navbar-rightを赤くする
      $(this).parents('.navbar-right').css('background-color' ,'red');
      }
  });
});
```
1. 【確認】.dropdownのクラス属性がdropdownとopen(ドロップダウンが開いている状態)であればtrueを出力
1. 【CSS変更】.dropdownを開閉するたびに「.open」が追加・削除されるため、それをトリガーに背景色を変える

これを実装すると、次のようにjsファイルが反応してくれる。
![jquery.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/4a6d3318-67b8-e8fc-df48-29cec40f1d10.gif)
・dropdown open?:false => background-color: blue
・dropdown open?:true => background-color: red


今回のHTMLファイルは下記のようになっている。
```html:header.html.erb
<!-- .navbar-rightを親クラスとして背景色を変えた -->
<div class="navbar-right">    
        <div class="search">
          <%= render 'shared/post_search' %>
        </div>
        <ul class="nav navbar-nav">
          <li><%= link_to "ホーム",   root_path %></li>
          <li><%= link_to "人気記事",   posts_path %></li>
          <li><%= link_to "人気ユーザー",  users_path %></li>
          <!-- log_in or !log_in -->
          <% if logged_in? %>
<!-- .dropdownをクリックされた時のイベントをjsファイルに書いた(ここがthisにあたる) -->
            <li class="dropdown">
              <a href="#" class="dropdown-toggle" id="js-tab" data-toggle="dropdown">
                アカウント <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
                <li><%= link_to "プロフィール", current_user %></li>
                <li><%= link_to "新規投稿", new_post_path %></li>
                <li><%= link_to "設定", edit_user_path(current_user) %></li>
                <li class="divider"></li>
                <li><%= link_to "ログアウト", logout_path, method: :delete %></li>
              </ul>
            </li>
          <% else %>
            <li><%= link_to "ログイン", login_path %></li>
          <% end %>
        </ul>
      </div>
```
# おわりに
jQueryを用いて、クラスの変化をトリガーに、cssのプロパティを操作することができた。
TP-Link WiFi 無線LAN 子機 AC600 433Mbps + 200Mbps Windows/Mac OS 対応 ナノ設計のドライバインストール方法備忘録

以下を購入するもドライバインストールが必要ということで色々記事を調べたところ、
私の環境（ubuntu２０.０４）では以下のようにドライバインストール＆USBドライバの認識ができた

#### 対象

TP-Link WiFi 無線LAN 子機 AC600 433Mbps + 200Mbps Windows/Mac OS 対応 ナノ設計
https://www.amazon.co.jp/TP-Link-433Mbps-Archer-T2U-Nano/dp/B07MXHJ6KB

#### インストール
> https://askubuntu.com/questions/1149117/tp-link-ac600-archer-t2u-nano-driver-for-ubuntu-18-04/1149288#1149288


```
sudo apt install git dkms
git clone https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au
sudo make dkms_install
```

USBをぬきさししたらLEDがチカチカした。これでOK

# 参考

https://qiita.com/orphiria/items/da639237bdc47792581a

https://askubuntu.com/questions/1149117/tp-link-ac600-archer-t2u-nano-driver-for-ubuntu-18-04/1149288#1149288
Cshellで複数のPYTHONPATHの設定

悩んだのは自分だけかもしれませんが、`csh`のランスクリプトである`.cshrc`で`$PYTHONPATH`を複数設定したかったが、はまった。

最終的には以下のようにして解決した。


```ShellScript
setenv PYTHONPATH /hoge/hoge/hoge:/huga/huga/huga
```

ただし、通常`setenv`を使って複数の変数を定義する場合は、以下のように、スペースで区切る必要がある。

```ShellScript
setenv PYTHONPATH "/hoge/hoge/hoge /huga/huga/huga"
```

筆者の環境のせいなのか、今回は`:`でつなぐことで`Python`をだます？ことができた。
Dockerfileの中で、jenkins pluginを以下のように`install-plugin`していると、突然`WARN: install-plugins.sh is deprecated, please switch to jenkins-plugin-cli`と言われるケースの備忘録

Dockerfileの中で、jenkins pluginを以下のように`install-plugin`していると、突然`WARN: install-plugins.sh is deprecated, please switch to jenkins-plugin-cli`と言われるケースの備忘録

例えば以下のようなものをさす

> https://github.com/jenkinsci/docker/issues/1005
>I am building own jenkins images with preinstalled plugins. In my Dockerfile, I used to execute the install-plugins.sh shellscript like this:
>
>```
>COPY ./plugins.txt /usr/share/jenkins/ref/plugins.txt
>RUN /usr/local/bin/install-plugins.sh < >/usr/share/jenkins/ref/plugins.txt
>```
>
>This works perfectly, but since some weeks, I warns me because of >deprecation:
>
>WARN: install-plugins.sh is deprecated, please switch to jenkins->plugin-cli
>This is why I wanted to switch to jenkins-plugin-cli today, so I >changed my Dockerfile:
>
>```
>COPY ./plugins.txt /usr/share/jenkins/ref/plugins.txt
>RUN jenkins-plugin-cli --verbose -f >/usr/share/jenkins/ref/plugins.txt
>```

> `WARN: install-plugins.sh is deprecated, please switch to jenkins->plugin-cli`の通り`jenkins->plugin-cli`を使おうとすると、
どうやら`I do not see any requests go to my proxy`となる様子

> Created cache at: /root/.cache/jenkins-plugin-management-cli
Cache miss for: update-center-2.263
io.jenkins.tools.pluginmanager.impl.UpdateCenterInfoRetrievalException: Error getting update center json
>I do not see any requests go to my proxy, so I guess that the jenkins-plugin-cli simply does not care about my http_proxy/https_proxy environment variables (which are used by the old, deprecated script).

この場合は、
以下のように`ARG _JAVA_OPTIONS`に`"-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport"`のようにオプションを渡せばOKの様子
（myproxyはプロキシサーバのホスト名(ex:proxy.xx.xx)、myportはポート(ex:8080)）

> ARG _JAVA_OPTIONS inside of your dockerfile
pass "-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport"

```Dockerfile
ENV _JAVA_OPTIONS "-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport"
RUN jenkins-plugin-cli -f "/var/jenkins_home/plugins.txt"
```

これで`proxy`経由で`jenkins-plugin-cli`を使えるはず。おそらく。。


# 参考

https://github.com/jenkinsci/plugin-installation-manager-tool/issues/450

https://github.com/jenkinsci/docker/issues/1005

https://github.com/jenkinsci/plugin-installation-manager-tool/issues/95
jenkinsのwarnings-pluginはwarnings-ng pluginに統合されているようであるという備忘録

jenkinsのwarnings-pluginはwarnings-ng pluginに統合されているようであるという備忘録

warnings-pluginは以下

[https://github.com/jenkinsci/warnings-plugin](https://github.com/jenkinsci/warnings-plugin)
> This plugin reached end-of-life.
All functionality has been integrated into the Warnings Next Generation Plugin and the Static Analysis Model and Parsers Library.


統合先となる、`warnings-ng plugin`は以下

[https://plugins.jenkins.io/warnings-ng/](https://plugins.jenkins.io/warnings-ng/)
> Warnings Next Generation
> The Jenkins Next Generation Warnings plugin collects compiler warnings or issues reported by static analysis tools and visualizes the results. It has built-in support for more than hundred report formats. Among the problems it can detect:

以上です

# 参考

https://issues.jenkins.io/browse/JENKINS-61937

https://srz-zumix.blogspot.com/2015/10/jenkins-warnings-plugin.html

https://plugins.jenkins.io/warnings-ng/

https://www.torutk.com/issues/20
`docker-compose up -d`時に`Creating network "xxx" with driver "bridge" ERROR: Pool overlaps with other one on this address space`が出て対策した際の備忘録

`docker-compose up -d`時に`Creating network "xxx" with driver "bridge" ERROR: Pool overlaps with other one on this address space`が出て対策した際の備忘録

以下のようなエラーが出た場合

```
$ docker-compose up -d
Creating network "xxx" with driver "bridge"
ERROR: Pool overlaps with other one on this address space
```

以下記事を参考にして`docker system prune`により解決
[docker-compose upしたら、Pool overlaps with other one on this address space というエラーが発生した](https://www.danroo.com/infra/post-108/)

```
$ docker system prune
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
```

# 参考

https://www.danroo.com/infra/post-108/
git lfs のインストール手順メモ

# git lfsについて

https://git-lfs.github.com/
> Git Large File Storage (LFS) replaces large files such as audio samples, videos, datasets, and graphics with text pointers inside Git, while storing the file contents on a remote server like GitHub.com or GitHub Enterprise.

オーディオやビデオ等のサイズが大きなデータをgitで管理する仕組み。
ファイル差分を管理するというよりは、ポインタで管理している模様。

# 手順
基本的に以下を参考にすればOK

> https://github.com/git-lfs/git-lfs/wiki/Installation

ubuntuの場合は以下を参照する

> Debian and Ubuntu
> Ubuntu 18.04, Debian 10, and newer versions of those OSes offer a git-lfs package. If you'd like to use that and don't need the latest version, skip step 1 below.
> ```
> curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
> sudo apt-get install git-lfs
> git lfs install
> ```

`Docker Recipes(For Debian Distros)`は以下を参照する

>Docker Recipes
>For Debian Distros, you can use
>```
>RUN build_deps="curl" && \
>    apt-get update && \
>    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ${build_deps} ca-certificates && \
>    curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \
>    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends git-lfs && \
>    git lfs install && \
>    DEBIAN_FRONTEND=noninteractive apt-get purge -y --auto-remove ${build_deps} && \
>    rm -r /var/lib/apt/lists/*
>```

過去バージョン(`tar.gz`形式)を取得する場合は以下のようにするとよさそう
https://github.com/git-lfs/git-lfs/releases

```
wget https://github.com/git-lfs/git-lfs/releases/download/v2.13.3/git-lfs-linux-amd64-v2.13.3.tar.gz
tar -xf git-lfs-linux-amd64-v2.13.3.tar.gz
bash install.sh
git lfs install  # 対象ユーザで実行
```

バージョン確認は以下のようにすればOK

```
git lfs --version
```

# 参考

https://support.circleci.com/hc/en-us/articles/360044671191-Git-LFS-Support-on-CircleCI-Provided-Images

https://github.com/git-lfs/git-lfs/wiki/Installation
jenkinsのJOBをAPI経由でたたいて`HTTP ERROR 403 No valid crumb was included in the request`の場合はapi tokenを発行する必要がありそう。という備忘録

jenkinsのJOBをAPI経由でたたいて`HTTP ERROR 403 No valid crumb was included in the request`の場合はapi tokenを発行する必要がありそう。という備忘録
（PASSWORD方式も過去には存在していたが、最近はサポートされていない？ためか少なくともdeprecatedとなっている）

https://www.jenkins.io/doc/book/system-administration/authenticating-scripted-clients/

```sh
curl -X POST -L --user your-user-name:apiToken https://jenkins.example.com/job/your_job/build
```

```sh
wget --auth-no-challenge --user=user --password=apiToken http://jenkins.example.com/job/your_job/build
```

jenkinsのapi token作成は以下が分かりやすい
（ログイン→ユーザ設定→アクセストークン）

https://iij.github.io/bootcamp/cicd_infra/jenkins/


# 参考

https://www.jenkins.io/doc/book/system-administration/authenticating-scripted-clients/

https://blog.kyanny.me/entry/2014/12/20/020700

https://www.jenkins.io/doc/book/using/remote-access-api/