OmniAICreator/Qiita-1.07M huggingface dataset:
Redshiftテーブル設計で知っておくべきこと　分散キーとは？　

# 1.Redshiftのアーキテクチャ（簡易説明）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/ba663570-4e8a-4221-0d82-1dbfc4ece194.png)


クライアントとCPUとの橋渡しをする役割として、マネージノードというものが存在します。
Redshiftはいくつものコンピューティングにデータを分散させて計算させ、
マネージドノードがそれらの計算結果を集約して、クライアントに返します。

１つのコンピューティングにデータを振り分けてしまったらどうなるでしょうか？
サーバーへの負荷分散と同じように、全体のスループットが低下してしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/a6da1cc3-9e04-57a0-9533-ba28c447e585.png)


そのため、複数の計算ノードに対して、均等にデータを送るようにテーブルを設計する必要があります。

それに関係してまず覚えていかなければいけないことが、『Dist Key（分散キー）』になります

# 2.分散キーとは

先ほど、ノード間に均等にデータを分散させないといけないという話をしました。
それに大きく寄与するのが、Dist Keyになります。

これは、テーブル１つにつき１つしか登録ができません。

分散の仕組みは、EVEN、KEY、ALLの3つがあります。
プラスアルファでAUTOというものも存在します。

## 2.1 ALL分散
ALL分散は、テーブル全体のコピーを全ノードに分散させます。
EVEN分散または KEY分散によってテーブルの一部の行のみが各ノードに配置されている場合、ALL分散を行うと、テーブルが関与しているあらゆる結合で全行が確実に併置(コロケーション)されるようになります。
注意点としては、クラスタ内のノードの数だけ必要なストレージが増えるため、データをロードまたは更新したり、複数のテーブルに挿入したりするのに時間が掛かる点が挙げられます。

よって、①更新頻度が低く、②更新範囲が狭く、③データ量が少量で、④別テーブルと頻繁に結合されるテーブル（≒ディメンションテーブル）に適切な分散スタイルです。

## 2.2 KEY分散
KEY分散は、分散キー(DISTKEY)に指定されたカラムに含まれている値に従って行の分散を行います。
複数の一致する値が同じノードスライスに配置されるため、結合キーに基づいてテーブルのペアを分散する場合、結合するカラムに含まれている値に従って行をスライスに併置(コロケーション)します。
これによって、共通のカラムで一致する値が物理的にまとめて格納されるようになります。

適用するカラムの例としては、日付カラムなどがあります。

ORDER BYなどで、日付ごとにどの商品が売れたかなどを知りたい場合などは
KEY分散のカラムには日付カラムを設定したりします。

Transactionテーブルなどは基本的にデータ量が増大するため、キー選定には先にこの
KEY分散が選ばれる傾向があるかもしれません。

## 2.3 EVEN分散
EVEN分散は、特定のカラムの値に含まれている値にかかわらず、ラウンドロビン方式によって複数のスライス間で行を均等に分散させます。
テーブルが結合に関与していない場合や、KEY分散と ALL分散のどちらを選択すべきかが明確でない場合に適切な分散スタイルです。


## 2.4 AUTO分散
テーブル設計の際に、特に指定しない場合は、AUTO分散となります。
AUTO分散を指定すると、Redshiftはテーブルのデータ量に基づいて最適な分散スタイルを自動的に割り当てます。
例えば、データ量が少量のときにはALL分散が割り当てられ、その後データ量が増大したタイミングで、EVEN分散に変更されます。
Jenkins PipelineのTips

# 当記事の概要
当記事では、Jenkins Pipeline（Declarative Pipeline）を作成するうえで「これどうすればいいんだっけ？」と個人的に迷うことのあったポイントについて、Tipsとしていくつか紹介していきます。


# ジョブ実行時に与えたい環境変数の設定
Jenkinsサーバ全体で利用可能なグローバルな環境変数は、Jenkinsのメニューの「Jenkinsの管理」→「System」→「グローバルプロパティ」で設定することができます。

また、ジョブ単位で使用する環境変数は、Jenkinsfile内の`environment` ディレクティブで設定できます。

ただ、`environment` ディレクティブ内での設定では、環境変数をJenkinsfileで静的に設定することになり、Jenkinsでのジョブ定義時に環境変数を設定することができません。ジョブ定義時の環境変数の設定は、Jenkinsのデフォルトの状態ではできず、「[Environment Injector](https://plugins.jenkins.io/envinject/)」というプラグインを導入する必要があります。

プラグイン導入後、ジョブの設定画面で以下のような項目（「Prepare an environment for the run」）が表示され、環境変数設定が可能となります。Gitリポジトリに含まれるプロパティファイルを参照させたり（下記画面のProperties File Path）、Jenkinsのジョブ設定の中で直接設定する（下記画面のProperties Content）など、多様な設定方法が提供されています。

![2024-05-02 at 23.16.56@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/9a970161-8f33-4fd2-e9d4-ba73cab93996.png)


# ジョブパラメータの指定

以下のように `parameters` ディレクティブを使用することで、ジョブの実行を「パラメータ付きビルド」にすることができます。パラメータ付きビルドでは、ジョブの実行時にWeb画面上でパラメータの値を設定することができます。パラメータの型は、文字列、Boolean、選択リスト（choice）などを指定できます。また、デフォルト値の指定も可能です。

```groovy
pipeline {
    parameters {
        string(name: "PARAM1", defaultValue: "default value", description: "パラメータの説明")
        booleanParam(name: "PARAM2", defaultValue: true, description: "パラメータの説明")
    }
```


# パスワード、APIキーの取り扱い
パスワードやAPIキーといった秘匿情報はJenkinsfileに直接書くべきではなく、JenkinsのCredentialとして設定すべきです（Credentialは「Jenkinsの管理」→「Credentials」で設定）。

JenkinsfileでこのCredential情報にアクセスするには、`credentials()`というヘルパーメソッドを `environment` ディレクティブ内で以下のように使用します。

```groovy
SAMPLE_CREDENTIAL = credentials("sample-credential")
```

「sample-credentials」をJenkinsで「Secret text」として作成している場合、環境変数SAMPLE_CREDENTIALにその値が設定されます。

「sample-credentials」を「ユーザ名とパスワード」として作成している場合、以下のように値が設定されます。

| 環境変数 | 設定される値 |
|:-|:-|
| SAMPLE_CREDENTIAL  | ユーザ名とパスワードを「:」で連結した値  |
| SAMPLE_CREDENTIAL_USR  | ユーザ名  |
| SAMPLE_CREDENTIAL_PSW  | パスワード  |


# コンテナ上でのビルド
ソースコードをコンパイルするための環境（JavaではJDKなど）を用意する場合、Jenkinsのメニューの「Jenkinsの管理」→「Tools」で設定することが可能です（導入も自動導入が可能）。

ただ、必要とされる環境がジョブごとにまちまちであったり、定期的にバージョンアップなどの作業が必要であったりと、運用上不便な点もあります。

そこで、ビルド環境としてコンテナを利用することで、上記の不便さが解消されます。

Jenkinsでは、ジョブ全体、あるいはステージごとに実行環境を`agent`で指定することができ、そこで`docker`を指定することで、指定したイメージのコンテナ上での実行が可能となります。

以下は、「Java Build」というステージに対して、「eclipse-temurin:17-jdk」というイメージでの実行を指定したものになります。

```groovy
stage('Java Build') {
    agent {
        docker {
            image "eclipse-temurin:17-jdk"
        }
    }
```


# コンテナ上でのビルドでのキャッシュ保持
コンテナ上でMaven、Gradleなどでビルド処理を実行した場合の問題点として、（コンテナの揮発性ゆえに）Maven Centralなどから取得した依存ライブラリがキャッシュされず、2回目以降のビルドでも1回目と同じ時間がかかるという点があります。

これを解消するために、Maven、Gradleのキャッシュが保存されるディレクトリに対してJenkinsサーバ（ホスト）のディレクトリを割り当て、永続化されるようにします。

Gradleでは、依存ライブラリは `<実行ユーザのホームディレクトリ>/.gradle/caches` に保持されるため、以下のように設定することで永続化されるようになります。

```groovy
stage('Java Build') {
    agent {
        docker {
            image "eclipse-temurin:17-jdk"
            args  "-u root --privileged -v <Jenkinsサーバの任意のディレクトリ>/${env.JOB_NAME}:/root/.gradle"
            reuseNode true
        }
    }
```

ポイントとしては以下になります。

- 実行ユーザをrootとすることで、ホストに割り当てるディレクトリ（今回では`/root/.gradle/`）を固定する（rootでなくても任意のユーザでもよい）
- ジョブごとにキャッシュを分けるため、ホスト側のディレクトリにジョブ名（環境変数JOB_NAME）を含める
pipで--break-system-packagesの問題について

```
python3 -m pip install ultralytics 
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a Python library that isn't in Homebrew,
    use a virtual environment:
    
    python3 -m venv path/to/venv
    source path/to/venv/bin/activate
    python3 -m pip install xyz
    
    If you wish to install a Python application that isn't in Homebrew,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. You can install pipx with
    
    brew install pipx
    
    You may restore the old behavior of pip by passing
    the '--break-system-packages' flag to pip, or by adding
    'break-system-packages = true' to your pip.conf file. The latter
    will permanently disable this error.
```

が出る問題に対しては、

```~/.pip/pip.conf
[global]
break-system-packages = true
```

でとりあえず、過去の動作に戻せます。

brew installで入れば良いんですが、無いもの多いんで。

brew installで入るものが入ってしまった場合は、brew link xxxxxで、brew管理に戻せます。
ABC061 の問題を解いてみました

## A問題
https://atcoder.jp/contests/abc061/tasks/abc061_a

言われたとおりに実装しましょう。
~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

signed main(){
  int a, b, c;
  cin >> a >> b >> c;
  if(c >= a  && c <= b){
    cout << "Yes" << endl;
  }
  else{
    cout << "No" << endl; 
  }
}
~~~

## B問題
https://atcoder.jp/contests/abc061/tasks/abc061_b

それぞれの数字の出現回数を記録しておけばよいです。

~~~C++

#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

signed main(){
  int n, m;
  cin >> n >> m;
  vector<int> ans(n + 1, 0);
  //出現回数を数える配列を用意
  for(int i = 0; i < m; i++){
    int a, b;
    cin >> a >> b;
    ans[a]++;
    ans[b]++;
    //出現回数をカウント
  }
  
  //結果を出力
  for(int i = 1; i <= n; i++){
    cout << ans[i] << endl;
  }
}
~~~

## C問題
https://atcoder.jp/contests/abc061/tasks/abc061_c

制約を確認すると、愚直に整数を挿入していては、TLEになってしまいます。

なので、なんという整数がいくつあるかということを記録しておきます。
そして、記録した配列をソートします。

そうすると、ある整数n以下の整数がいくつあるかというのを高速に求めることができます。
$K$以上か$K$以下の境目がこの問題の答えになります。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

signed main(){
  long long n, k;
  cin >> n >> k;
  vector<pair<long long, long long> > vec(n);
  
  for(int i = 0; i < n; i++){
    cin >> vec[i].first >> vec[i].second;
    //記録しておく
  }
  
  sort(vec.begin(), vec.end());
  //ソートする
  
  long long a = 0; //ある整数以下の整数の数を記録する変数
  for(int i = 0; i < n; i++){
    a += vec[i].second;
    if(k <= a){ //境目を探す
      cout << vec[i].first << endl;
      return 0;
    }
  }
}
~~~

## D問題
https://atcoder.jp/contests/abc061/tasks/abc061_d
「Python 3.12.2 ドキュメント」を読んでみる　その３

# はじめに
プログラミングの勉強をしようと思っても何から始めたらいいかわからないので、とりあえずQiitaのリンクを辿って、公式リファレンス（ドキュメント？）に目を通すことにしました。この記事はそのメモですが、如何せんプログラミングの知識がほぼない人間の解釈ですので、勘違い、間違い、誤解等多数あるかと思います。

https://docs.python.org/ja/3/tutorial/index.html

# 「3. 形式ばらない Python の紹介」を読んでみる

https://docs.python.org/ja/3/tutorial/introduction.html#

#### 用語
トグル：
同じ操作（例：クリック）で２つの状態（例：ONとOFF、表示と非表示など）を切り替える
<details><summary>👈クリックすると下に説明が表示されるよ（トグルの例）</summary>

 もう１回クリックすると説明が非表示になるよ
</details>

#### 概要
~~~Python:example1.py
>>> ←行頭にこれがあるのは入力行（１行目）だよ
... ←行頭にこれがあるのは入力行（２行目以降）だよ
    ←行頭に何もないのは出力行だよ
~~~

~~~Python:example2.py
# ←「#(ハッシュ文字)」以降の入力はコメントになるよ(コードではないよ)≒Pythonインタプリタは実行しないよ)
spam = 1 # コードの後に#を入力すると#より右側がコメントになるよ
        # インデントとか空白の後に#を入力すると#より右側がコメントになるよ
text = "# これは二重引用符に囲まれているのでコメントじゃないよ（＝文字列だよ）"
~~~

## 「3.1. Python を電卓として使う」を読んでみる　その１
### 3.1.1. 数
#### 用語
int型：
整数型　「integer(インテジャー)」「Integral」の略

float型：
小数型　厳密に言えば「（単精度）浮動小数点数」　「floating-point number」の略

他の数値型：
Decimal、Fraction

#### 概要
~~~Python:example3.py
>>> 3 + 2  # 加法（Addition）は「+」
5
>>> 3 - 2  # 減法（Subtraction）は「-」
1
>>> 3 * 2  # 乗法（Multiplication）は「*」
6
>>> 3 / 2  # 除法（Division）は「/」　除算の結果はfloat型で返ってくるよ
1.5
>>> 50 - 5 * 6  # ３項以上の計算もできるよ
20
>>> 50 - 5 * 6 / 4
42.5
>>>(50 -5 * 6)/ 4  # ()丸括弧も使えるよ　除算の結果が整数でもfloat型で返ってくるよ
5.0

>>> 17 / 3　
5.666666666666667
>>> 17 // 3  # 整数除算（切り捨て除算；Floor division）は「//」、戻り値は整数部（商）int型だよ
5
>>> 17 % 3  # 除法の剰余は「%」
2
>>> 17 // 3 * 3 + 17 % 3  # 商 × 除数 + 剰余 ＝ 被除数
17

# 冪（べき）乗は「**」
>>> 5 ** 2  # 5の2乗　Excelだと5 ＾ 2　Excelで「5 ** 2」は5 * 10 ＾ 2 ＝ 500　
25
>>> 2 ** 7  # 2の7乗　Excelだと2 ＾ 7　Excelで「2 ** 7」は2 * 10 ＾ 7 ＝ 20000000
128

# 「＝」は変数に値を代入する（等号ではない）
>>> width = 20  # 代入しても結果は出力されないよ
>>> height = 5 * 9  # 数式を代入することもできるよ
>>> width * height  # 値を代入した変数で計算できるよ
900

>>> n  # 定義していない（値を代入していない）変数を使用しようとすると・・・
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined  # エラーになるよ：「n」という変数は定義されてないよ

>>> 4 * 3.75 - 1  # 入力に小数が混在したら（答えが整数でも）float型で返すよ
14.0

# _(アンダースコア)には直前の出力が代入されているよ
>>> tax = 12.5 / 100  # 税率12.5%　消費税だとしたら高い！
>>> price = 100.50  # 税抜き価格100.50
>>> price * tax  # 税抜き価格×税率なので
12.5625  # 税額 
>>>price + _  # 「_」には直前の出力である12.5625が代入されるので、price(=100.50) + 12.5625
113.0625  # 税込み価格
round(_, 2)  # 「_」には直前の出力である113.0625が代入される
　　　　　　　# round(引数,n)は引数を小数点以下第n位まで(n+1位を四捨五入して)表示かな？
113.06  # 小数点以下第2位までなら単位は＄かな

# 複素数は数字の後ろにj
>>> 1j ** 2  # 虚数単位iの2乗
(-1+0j)  # 実部が-1で、虚部が0ってことだから-1
~~~

#### 疑問
・「コード」と「プロンプト」って何が違う？　※前回「モジュール」と「コマンド」もどう違うのかわからなかった。

#### 後記
・本稿でMarkdown記法のCode blocks初挑戦！本来は入力と出力を書き分けるためのものではないんでしょうね。
・なるべく公式ドキュメントの記載例に沿ってます。説明がわかりやすくなるかなと思ったところは追記、修正をしています。
・簡単な計算は暗算でもできるからプログラミングする必要はないし、ほとんど公式ドキュメントに書いてある通りの数式ではあるけれども、自分が書いたコードがパソコンに解釈されて、思った通りの結果が返ってくるとそれだけで楽しい！
・次回は文字列
[数学 / 複素数平面] 2つの円の共通接線を求める

# 1. 概要


- **「複素数平面」で解く「図形と方程式」** という名前の書籍に取り組んでいた

https://www.amazon.co.jp/gp/product/B07SJRXS3S

- 上記書籍の **p.94 演習3.27 (2)** を解く際、同書籍中の情報だけでなく、ちょっとした思い付きやアイデアが必要だった
- この解き方をインターネットで調べてみたものの、私は見つけることができませんでした(´；ω；｀)

立ったこの1問を解くためだけに、私は数時間近く溶かしてしまったので、次にこの問題に直面する方々のために、解法を共有したいと思います！


# 2. 問題

以下の2つの円がある。

```math
\begin{align}
C_1&: |z|=3 \\
C_2&: |z-2i| = 2

\end{align}
```

上記2つの円の共通接線を求めよ。

# 3. 解法

## 3-1. C_1 と接線との接点を1つ決めることでわかること

```math
\begin{align}
共通接&線が C_1 に接する点を \beta とすると、\\
\\
|\beta|&=3 \\
\beta\bar{\beta} &= 9\\
\\
である。
\end{align}
```

## 3-2. 円 C_1 の接線の方程式を求める

テキストの「命題3.43 **円の接線の方程式**」を適用すると、

```math
\begin{align}
C_1 の接線の方&程式は次のように表せる。\\
\\
\bar{\beta} z + \beta \bar{z} &= 2 * r^2 \\
&= 2 * \{C_1 の半径\}^2 = 18・・・①\\
\end{align}
```

## 3-3. 「3-2」で求めた接線と、円 C_2 の中心との距離から方程式を作る

テキストの「定理3.29 点と直線の距離」で以下のような関係性があることが示されている。

```math
\begin{align}
直線l&の方程式が法線型一般型\\
\bar{v}z &+ v\bar{z} + c = 0\\
で表さ&れているとき、複素数 \alpha と直線lの距離dは次のように表せる\\
\\
d &= \frac{|\bar{v}\alpha + v\bar{\alpha} + c|}{2|v|}\\
\\
上記の&関係式を適用すると、\\
円C_2&の中心である複素数 \alpha = 2i と、直線①の距離を表す式は以下のようになる。\\
\\
d &= \frac{|\bar{\beta}\alpha + \beta\bar{\alpha} - 18|}{2|\beta|} \\
&= \frac{|\bar{\beta}*2i + \beta*\bar{2i} - 18|}{2|\beta|} = \{C_2 の半径\} = 2\\
よって&これを整理すると、\\
&|\bar{\beta}i + \beta * (-i) - 9| = 2|\beta| = 2 * 3 = 6 ・・・②
\end{align}
```

## 3-4. ②式の絶対値記号を外し、βを表す複素数を求める

```math
\begin{align}
②をさらに整理すると、&\\
\\
|(\bar{\beta} - \beta)i - 9| &= 6\\
\\
\\
ここで \beta = x + yi (x, y は&いずれも実数)とおいて計算すると、 \\
\\
|(\bar{\beta} - \beta)i - 9| &= |\{(x+\bar{yi}) - (x+yi)\}i - 9| \\
&= |-2y(i)^2 - 9|\\
&= |2y - 9| = 6 となるので、\\
\\
2y-9 &= \pm6 \\
y&=\frac{15}{2}, \frac{3}{2}\\

\end{align}
```

ここから、場合分けを使って、$β$の値を求める。

- (Ⅰ) $y = \frac{15}{2}$ ⇒ $\beta = x + \frac{15}{2}i$のとき

```math
\begin{align}
|\beta| &= 3\\
|x + \frac{15}{2}i| &= 3\\
x^2 + {\left(\frac{15}{2}\right)}^2 &= 9\\
x^2 &= 9 - \frac{225}{4}\\
x^2 &= -\frac{189}{4}\\
\\
しかし、x は実数値&であるので、この時は解を持たない。
\end{align}
```

- (Ⅱ) $y = \frac{3}{2}$ ⇒ $\beta = x + \frac{3}{2}i$のとき

```math
\begin{align}
|\beta| &= 3\\
|x + \frac{3}{2}i| &= 3\\
x^2 + {\left(\frac{3}{2}\right)}^2 &= 9\\
x^2 &= 9 - \frac{9}{4}\\
x^2 &= \frac{27}{4}\\
x &= \pm\frac{3\sqrt{3}}{2}\\
\\
よって、 \beta &= \pm\frac{3\sqrt{3}}{2} + \frac{3}{2}i\\
&= \frac{3}{2}(\pm\sqrt{3}+i)\\

\end{align}
```

## 3-5. βの値から、共通接線の方程式を求める

- (Ⅱ) $\beta = \frac{3}{2}(\pm\sqrt{3}+i)$ のとき

```math
\begin{align}
接線の方程式である①に&\betaを代入すると、\\
\\
\bar{\beta} z + \beta \bar{z} &= 18 ・・・①\\
\frac{3}{2}(\pm\sqrt{3}-i)z + \frac{3}{2}(\pm\sqrt{3}+i)\bar{z} &= 18\\
(\pm\sqrt{3}-i)z + (\pm\sqrt{3}+i)\bar{z} &= 12\\
\end{align}
```

# 4. 感想

この1問を解くために3~4時間はかかった\_(-ω-\`\_)⌒)\_
もうやりたくないっぴ...(´∩ω∩\`*)
[Python]プログラム実行時に出力する情報の範囲をコントロールしよう

※Pythonを利用している目線から書いています。

バックエンド開発をされている方が主な対象になるかと思いますが、プログラムを動かしているときに出力をこまめに行いたい場面も多いかと思います。

しかし、ミーティングなどで人に見せるときに毎回表示させると、それはそれで画面が情報で溢れかえり煩わしいかもしれません。

そこで、自分も最近まで知らなかったのですが、出力させたい情報をprint関数ではなくloggingパッケージのgetLogger関数で指示すると、
- プログラムを実行しているコンソールには最小限の情報を出力
- ログを書き込むファイルを別途生成して細かな情報を残しておく
といった一石二鳥が実現できます。
参考にしたQiitaの記事はこちらです。

[Pythonでprintを卒業してログ出力をいい感じにする](https://qiita.com/FukuharaYohei/items/92795107032c8c0bfd19)
MacでLLM

先日マイクロソフトから小規模言語モデルPhi-3ファミリの[発表](https://news.microsoft.com/source/features/ai/the-phi-3-small-language-models-with-big-potential/)がありました。
[Ollama](https://github.com/ollama/ollama)で使うことができるということなのでローカルLLMしてみました。

## Ollamaインストール
[ダウンロードサイト](https://ollama.com/download)からアプリケーションをダウンロードします。
zipを展開しアプリケーションを起動します。ウェルカムメッセージに表示される「Next」ボタンを押下し次にOllamaのコマンドをインストールするために「Install」ボタンを押下します。「Run your first model」が表示されたら「Finish」ボタン押下でインストール完了です。

## Phi-3-mini
Ollamaでの実行はコマンドラインからになるのでターミナル.appなどを開きコマンドを入力します。
```
$ ollama run phi3
...
verifying sha256 digest
writing manifest
removing any unused layers
success
>>> Send a message (/? for help)
```
プロンプト入力待ちになるので適当に入力してみます。
```
>>> あなたのお名前は？
私はMicrosoft Assistantです。オープンAIによって作られたアシスタントアプリケーションで、ユーザーが求める情報やサポートを提供します。あなたの名前は調べることができますが、現在は特定の名前を持っていません。

>>> Send a message (/? for help)
```
M1 MacBook Pro（16GBメモリ）で2秒くらいで結果が返ってきます。

Phi-3-miniは38億パラメータですが2倍のサイズのモデルよりも優れた性能を発揮するということなので使ってみようと思います。

## Swallow
Phi-3-miniは小規模なモデルなのでもう少し大きいモデルでローカルLLMが実用的か確認してみました。
[Swallow](https://tokyotech-llm.github.io/swallow-llama)はMetaが開発したLlama 2をベースに日本語ウェブコーパスと英語コーパスを混ぜたデータで継続学習を行い日本語能力を改善したものです。
同じようなライセンスで提供されているものは他にもありますがなぜSwallowで試しているかは置いておきます。

### モデルのダウンロード
[Hugging Faceで公開](https://huggingface.co/tokyotech-llm)されているのはベースとなるモデルと指示チューニングを施したものになります。ここではベースとなるもののうち7Bのモデルをダウンロードしてみます。
```
$ git clone https://huggingface.co/tokyotech-llm/Swallow-7b-hf
```
ファイルサイズが大きいためGit LFSで提供されています。macOSでHomebrewを使っている場合は以下のようにしてgit-lfsをインストールしておきます。
```
$ brew install git-lfs
```

Ollamaで使用するにはダウンロードしたモデルをGGUF形式に変換する必要があります。
変換はllama.cppと併せて提供されているpythonスクリプトで行います。

### llama.cppダウンロード
```
$ git clone https://github.com/ggerganov/llama.cpp.git
```
GGUF変換だけなのでビルドする必要はありません。
```
$ cd llama.cpp
$ pip3 install -r requirements.txt
```
### GGUF変換
```
$ ./llama.cpp/convert.py ./Swallow-7b-hf
...
INFO:convert:[291/291] Writing tensor output.weight                          | size  43176 x   4096  | type F32  | T+  29
INFO:convert:Wrote Swallow-7b-hf/ggml-model-f32.gguf
```
### GGUFインポート
インポートするためにモデルファイルを作成します。
```Swallow-7b-hf.model
FROM ./Swallow-7b-hf/ggml-model-f32.gguf
```
ollamaのコマンドを実行しインポートします。
```
$ ollama create Swallow-7b-hf -f Swallow-7b-hf.model
transferring model data
creating model layer
using already created layer sha256:3b194101458599a8bfed89f14d350c0d129c6c7ac78a09c10e6e293da5162fe3
writing layer sha256:7b2d99954c2557537e321249e1db37d55ab05e5474d9afb2646b3f88459a3ec6
writing manifest
success
```
インポートしたモデルを実行し、Phi-3-miniと同じプロンプトを試してみます。
```
$ ollama run Swallow-7b-hf
>>> あなたのお名前は？

100年後、あなたのお名前はどうなっていますか?
今の名前が変わらずに残っている可能性は低いと思いませんか?
「名は体を表す」という言葉があるように、名前はその人自身を表すものです。
100年後、あなたのお子様も同じことが言えるでしょう。
100年後の世界では、今の名前とは異なる形で呼ばれているかもしれません。
そう考えると、お子様にどのような名前を付けるか悩むところですね。
また、将来的に「子供の名前ランキング」が存在するかもわかりません。
そこで今回は、子供の名付けの基本について解説します。
昔から受け継がれた名前もありますが、今風の名前を付けたいと思う親御さんも多いですね。
その時の流行や時代に合った名前を付けることが重要です。
しかし、それだけではいけません!
...
```
3時間掛かってもまだ回答し切れていないようでした。
結果をどう判断したら良いか迷いますが結果を得られるまでの時間からは、M1 MacBook Pro程度で7Bのモデルを実行するのは難しそうです。
Raspberry Pi OS (Bookworm) でLAN-WH300NU2を認識させる手順

# 環境

- Raspberry Pi 3B
- Raspberry Pi OS (Bookworm) 64bit
- LAN-WH300NU2

# 手動

## 事前確認

`lsusb`でアダプタを認識しているものの、ドライバーが読み込まれていない。

    # lsusb -t
    /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
        |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M
            |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
            |__ Port 4: Dev 4, If 0, Class=Vendor Specific Class, Driver=, 480M

`lsmod`で確認すると`rtl8192cu`を読み込んでいない

    # lsmod

`iw dev` で確認すると、当然無線デバイスとしても認識されていない

    # iw dev
    (内蔵の無線LANしか表示されない)

## 手動で認識させる

モジュールを読み込ませる

    # modprobe rtl8192cu
    # lsmod
    (rtl8192cuが表示されたことを確認する)

デバイスとモジュールを紐づける

    # echo "0789 016d" > /sys/bus/usb/drivers/rtl8192cu/new_id

確認

    # lsusb -t
    /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
        |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M
            |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
            |__ Port 4: Dev 4, If 0, Class=Vendor Specific Class, Driver=rtl8192cu, 480M

    # iw dev
    (無線デバイスが増えたことを確認できる)

## 自動設定
以下のように設定ファイルを作成し再起動する
```
$ cat /etc/udev/rules.d/rtl8192cu.rules
SUBSYSTEM=="usb",ACTION=="add",ATTR{idVendor}=="0789",ATTR{idProduct}=="016d",RUN+="/sbin/modprobe -qba rtl8192cu"
```

```
$ cat /etc/modprobe.d/rtl8192cu.conf 
install rtl8192cu /sbin/modprobe --ignore-install rtl8192cu $CMDLINE_OPTS; /bin/echo "0789 016d" > /sys/bus/usb/drivers/rtl8192cu/new_id
```

```
# reboot
```
re.compileは何に使う？

# はじめに
re.compileが何のためにあるのかよくわからず使っていなかったが、正規表現のパターンを再利用するときに便利であることがわかったのでまとめる。

# 目次
+ [re.compileの使い方](#recompileの使い方)
+ [正規表現のパターンをオブジェクトを辞書にしてみる。](#正規表現のパターンをオブジェクトを辞書にしてみる)

## re.compileの使い方
```re.compile```は正規表現のパターンをオブジェクト化する手法。```re.compile```で定義した正規表現のパターンは、```re.XXX```で使用できる。reの部分を定義したオブジェクトに置き換えて使用する。例えば```P = re.compile(r'[0-9]+')```でPというオブジェクトを定義すると。

オブジェクト使う|オブジェクト使わない
---|---
P.search(string)|re.search(r'[0-9]+', string)
P.match(string)|re.match(r'[0-9]+', string)
P.split(string)|re.split(r'[0-9]+', string)
P.sub(repl, string)|re.sub(r'[0-9]+', repl, string)

```python:
import re

# a～zの文字列の正規表現パターンをオブジェクト化
alphabet_atoz = re.compile(r'[a-z]+')
print(f'# {alphabet_atoz=} / {type(alphabet_atoz)}')
# alphabet_atoz=re.compile('[a-z]+') / <class 're.Pattern'>

#オブジェクトを使って、 re.match()をする。
str_data = "ABCDEabcdeあいうえお01234"
print(f'# {alphabet_atoz.search(str_data)=}')
# alphabet_atoz.search(str_data)=<re.Match object; span=(5, 10), match='abcde'>
```
[戻る](#目次)

## 正規表現のパターンをオブジェクトを辞書にしてみる。
オブジェクトを辞書化することもできた。使い道はパッと思いつかないけど、よく使う正規表現パターンを辞書化しておいて、再利用すると便利かも。

```python:
import re

# パターンを辞書で定義。
P_char={
    "半角小文字":re.compile(r'[a-z]+'),
    "半角大文字":re.compile(r'[A-Z]+'),
    "半角英字"  :re.compile(r'[a-z|A-Z]+'),
    "半角数字"  :re.compile(r'[0-9]+')
}

str_data = "ABCDEabcdeあいうえお01234"

print(P_char["半角小文字"].search(str_data))
print(P_char["半角大文字"].search(str_data))
print(P_char["半角英字"].search(str_data))
print(P_char["半角数字"].search(str_data))

# <re.Match object; span=(5, 10), match='abcde'>
# <re.Match object; span=(0, 5), match='ABCDE'>
# <re.Match object; span=(0, 10), match='ABCDEabcde'>
# <re.Match object; span=(15, 20), match='01234'>
```
[戻る](#目次)

以上
ReactにBlenderオブジェクトを読み込み

## Blenderで作ったオブジェクトをReactで表示

### Blenderのお勉強
GWに時間があったので、下の本でBlenderのお勉強をしてました📖

https://book.impress.co.jp/books/1122101166

そして私にも下の微妙なクマさんを作れちゃいました🐻＜クマー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/bb76e72e-7ee4-6e1c-3091-2bfed9030ae1.png)

となると react-three-fiber で表示したいよね〜
したいよね〜
ということで、やってみたやってみた！

### Blenderから書き出し

まずはクマさんの各部品のモディファイアーを適用して  
 "A"で 全部品を選択  して ⌘-"J" で「オブジェクトを統合」を実行

 [ファイル]→[エクスポート]→[flTF 2.0(.glb/.gltf)] を選択して
 とりあえず "sample.glb" として保存。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/f3839ec4-dced-3f19-5372-9d5e6fffa16f.png)


### react-three-fiber への読み込み

調べてみると、useGLTF というフックが使えるらしい
色々試してみたら、以下コードで表示できました。
sample.glb は public 以下に配置

```react
import { OrbitControls, useGLTF } from '@react-three/drei'
import { Canvas } from '@react-three/fiber'

const GltfCanvas = () => {
  const LoadedModel = () => {
    const { scene } = useGLTF('sample.glb')
    return <primitive object={scene} />
  }
  return (
    <Canvas>
      <OrbitControls />
      <directionalLight />
      <ambientLight />
      <LoadedModel />
    </Canvas>
  )
}

export default GltfCanvas
```

### 表示結果
はいはい、こんな感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/6490e284-9caa-08b9-ea06-349e28d15726.png)

あとは自由にグリングリンできますね！

### 感想
とりあえず最低限の実装方法のサンプルコードが作成できたのと
基本的にBlenderの操作も判るようになったので
今後のサイト作りの小技として使えると楽しいかなぁ...
とりあえずGWをダラダラ消費ぜずに
Outputを作ることができた自分を褒めたいです。
個人開発投稿2週間分の振り返り

# どんな投稿をしてるか

個人開発を題材にして、毎日投稿が目標。
毎日投稿といいつつも、投稿できてない日もちらほら。。
今日時点で、投稿したのは8本。

### 個人開発の投稿

[個人開発記録](https://qiita.com/kare-pan/items/e661e350a58f5f356aa5)
[個人開発記録　2024/04/22](https://qiita.com/kare-pan/items/d9c8730f6f7e71433702)
[個人開発記録　2024/04/23](https://qiita.com/kare-pan/items/a52f7a5dc2f5d8e38ba0)
[個人開発記録　2024/04/24](https://qiita.com/kare-pan/items/41117f5bfe87feb785ad)
[個人開発記録　2024/04/25](https://qiita.com/kare-pan/items/9ee0d8d1d04de1b9a252)
[個人開発記録　2024/04/27~2024/04/29](https://qiita.com/kare-pan/items/26ab62e261bcb0b80f56)
[個人開発記録　2024/04/30~2024/05/2](https://qiita.com/kare-pan/items/2c699171b366adf7f733)

### 個人開発以外の投稿

[CodePipelineからliquibaseのコマンド自体を渡す](https://qiita.com/kare-pan/items/111e5fbb76687c6942e6)

# 毎日投稿をやってみての感想

### よかった点

* とりあえず投稿できたこと
* 毎日ではないにしろ、継続できたこと
* 投稿に対するハードルが落ちたこと
* 記事の質がちょっと上がってきた

今まで会社の目標とかでqiitaに記事をアップするといってもできなかった自分が、なんでもいいからとにかく毎日投稿すると決めて、個人開発しながら投稿できたのは大きな成長だと思う。
まだまだ質は低いが、ちょっとずつ記事の質が上がってきたのもでかい。

### わるかった点

* 記事の質が低い
    * 環境構築がほとんど別記事の写経
    * なぜこういう実装にしたか？が書けてない
    * 良し悪しを選択してコピペできてない
* スピード重視のため、理解せず実装している
    * chat-GPTや記事のコピペが多い
* view数があまりない
* 期限が決まってない

とにかく記事の質が低いのが悪い点。。
読む人のことが考えられてないし、自分の知識としても整理されてない。
また、期限が決まってないため、いつまででもだらだらやれてしまう。。

# 目的の再確認

目的としては以下を上げている。

* とにかくやりきることが一番の目的
* 毎日発信することで、発信する習慣作り
* 個人開発をやりきることで、実績作り

とにかく行動量を増やすことと、やりきることが目的だった。
そもそもなぜ行動量を増やしたかったかというと、今後のエンジニアとしてのキャリアを考えたときに社外向けに少しでも自分を知ってもらう必要があると思った。
知ってもらうことで、副業や、転職活動を有利にできると思ったため。
もっと効率的にクリティカルに行動できると思うが、やらない思考よりやる行動ということで、とにかく行動癖をつけるということで、目標に毎日投稿を掲げている。

# 次のアクション

### 継続すること

* 毎日投稿
* 毎日開発

目標の再確認で、**記事の質が低くても**とにかく行動癖をつけることが目標のため続けていきたいと思う。

### Tryすること

* 個人開発としての全体目標を作る
    * そこから一週間の目標を作る
    * 目標はqiitaに土日のどちらかに投稿
* 週1,2で記録記事ではなく、知識を整理した記事を書く
* Xに投稿する

そもそもロードマップができてないので、それを作る。
記事の質が悪い点については、週末に知識を整理した記事を書くことで改善。
大前提目標が対外アピールのため、Xでも自分をアピールする。
使えそうなadb command

# 目的
個人でAndroidアプリを作っているが、
デバック用のコマンドをいろいろ調べるのが面倒だな？
じゃあまとめてしまおう！
という完全自分用の備忘録が派生したもの。

そのため、コマンドに偏りがあるかもしれないが、そこはご了承をば。

随時更新予定

## adbコマンドとは
Android Debug Bridge　の略。
開発環境でAndroidデバイスと通信するためのコマンドラインツール。
Androidアプリを開発する場合、adbコマンドを使用してAndroidデバイスを操作することが可能。

## コマンド
- 接続されているデバイス表示
```
$ adb devices
List of devices attached
emulator-5555   device
```

- アプリのインストール
```
adb install <apkパス>
```
※※インストールオプション※※

-   testアプリのインストール(-t)
 :::note warn
 下記のエラーが出る場合のみ
 adb: failed to install debug.apk:
 Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
:::
 原因
 Android Studio のバージョンが3以上だと、
 Runボタンでビルドすると「testOnly="true"」になってしまい、テストアプリが生成されるようです。
 テストアプリの場合は、オプションに -t (
 ```
 adb install -t <apkパス>
 ```
-   アプリのダウングレード(-d)
新たにインストールするアプリが、デバイス内の既存アプリのバージョンより低い場合
```
 adb install -d <apkパス>
```
※※インストールオプション終わり※※

- アプリ起動
```
adb shell am start -n [パッケージのコンポーネント名]
```

- アプリのキャッシュ削除
```
adb shell pm clear [パッケージ名]
```
- キーイベントの送信
```
例：TABキー
adb shell input keyevent KEYCODE_TAB
```
- 文字列の入力
```
adb shell input text <任意の文字列>
```
- スクリーンショット
```
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png
```
#### 参考
https://developer.android.com/tools/adb?hl=ja
https://sakura-bird1.hatenablog.com/entry/2018/01/22/011649
https://qiita.com/misoca12/items/7772ad14223a6fa4273f
Elevate Your Look with Dazzle by Sarah

Dazzle by Sarah brings a range of exceptional shoes that can elevate any outfit, featuring everything from timeless classics to contemporary heels.
Khussa: Timeless Footwear with a Rich Heritage
Originating from Pakistan, [Khussa shoes](https://dazzlebysarah.com/
) are cherished for their comfort and stunning handcrafted designs, often adorned with vibrant colors and embellishments.
Historic Elegance: Khussas have been worn for centuries, gracing the feet of royalty.
Explore Dazzle by Sarah’s Collection: Their variety includes everyday styles to elaborate designs ideal for celebrations.
Kolhapuri Chappals: Stylish and Comfortable
These beloved sandals from India are known for their durability and comfort, available in a plethora of vibrant colors.
Artisan Craftsmanship: Each pair is meticulously handcrafted, ensuring uniqueness.
Dazzle by Sarah’s Selection: From traditional to embellished designs, perfect for complementing any ensemble.
Heels: Elevate Your Confidence
Heels not only add height but also bring an element of elegance to your attire, enhancing your confidence.
The Charm of Heels: Ideal for parties and special occasions or simply to add a touch of glamour to your day.
Discover Your Match: From timeless classics to modern styles, and varying heights, Dazzle by Sarah offers heels for every preference.
Why Choose Dazzle by Sarah
Commitment to Handcrafting: Promoting traditional craftsmanship through their selection of Khussas and Kolhapuris.
Diverse Range: From classic to contemporary, catering to all tastes.
Unmatched Quality: Dedicated to offering well-crafted footwear.
Customer Focus: Committed to providing a delightful shopping experience.
Supporting More Than Just Fashion
Purchasing from Dazzle by Sarah not only means acquiring stylish footwear but also supporting the skilled women artisans behind these creations, and a business that values traditional crafts.
Shop and Make a Statement
Visit Dazzle by Sarah’s website (https://dazzlebysarah.com/) to browse their exquisite selection of Khussas, Kolhapuris, heels, and more. Step into shoes that not only look beautiful but also make a positive impact.
amazonAdsで再確認したpostmanの有用性

## 君はポストマンを感じたことがあるか？
みなさんお馴染みのポストマン様ですが、ご存知ない方のためにざっくりご紹介。
簡単にいうとポストマンはコードを実装せずにAPIリクエストを行うことができ、そのレスポンスを受け取れるという素晴らしいサービス。

何が嬉しいのかというと、例えば「ドキュメントを読んだけどどんな形でレスポンスが返ってくるのか実際の値を見たい」「取得したい値があるんだけど、ほんとにこの値で合ってるのかな？」等々、実際に動かしてみないとイメージがつかない部分を実装前に手軽に確認できるという点。
APIを利用した実装を行なっているとこういうことよくありますよね。

自分は以下のようなシーンでよく使っています。
・クライアントから「このAPIを利用してこういうことがしたい(ふんわり)」という相談を受けたときに、
そのAPIでできること、できないこと、何が必要となるかなどを事前にポストマンで確認する
・実装を始める前にポストマンでレスポンスを確認して、その内容を基に後工程の実装を考える

## 具体的な使い方(AmazonAdsを例に)
・amazonAdsさんはとても親切なので[postman collection](https://advertising.amazon.com/API/docs/en-us/guides/get-started/using-postman-collection)という、ポストマンのリクエストテンプレートのようなものをご用意してくれています。
![amazonAds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/ae5cc1d0-7799-f95a-0403-ff7569a75197.png)
・「environment file」と「collection file 」から得られるURLをコピー
![quick_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/fe10360f-7787-84f3-2d7f-91319e08aa8d.png)
・ポストマンのimportボタンを押下し、表示された画面に上記URLを貼り付け
![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/3c759741-e2da-5c1b-9dc8-965fc169fc51.png)
![Import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/5db4dfaa-4832-ebf4-76e3-411117920582.png)
・するとこのようにamazonAdsのAPIリクエストテンプレートがずらっと表示されます
![Auth_grant_login_-_Team_Workspace-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/c93a7e48-b33b-720e-c64c-66b4b43baf6f.png)
・各ファイルの内容は各APIのリクエストに沿ったheaderやparamsが設定されたリクエストのテンプレートとなっており、赤色部分に必要な値を入れれば簡単にリクエストができてしまうというわけです。
![Auth_grant_login_-_Team_Workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/6cc73bfb-6829-3625-0917-93de890f6c9d.png)
※今回はamazonAdsのAPIを利用したpostmanの内容ですので基本的な部分は割愛させていただきます
JAWS-UG初心者支部#60 初心者向けLT大会　登壇してみた

https://jawsug-bgnr.connpass.com/event/316727/

こちらのイベントで初社外LTしてきました。
10分の持ち時間で14分喋り続けるというロングラン。
次は時間に収まるよう頑張ります…

登壇資料はこちらです
https://www.slideshare.net/secret/IsXYYexKqm2VeS

# 感想
緊張して何喋ったのか覚えてないです笑

スライド全画面共有しながら、カンペ見ながら、オーディエンスの顔を見る
ってどうやるの？？
とパニックになりながら、結局参加者の顔は見れずで登壇してきました。
（画面分割とかで出来るかな…）
【用語】VAE、Reparameterization Trick、変分下限

E資格用語の備忘録
シラバス2024 4.深層学習の応用 (2)生成モデル ⅱ.オートエンコーダー

# VAE
生成モデルの一種であり、ニューラルネットワークを使用してデータの潜在的な表現を学習するために用いられる。VAEは、エンコーダーとデコーダーという2つの主要な部分から構成されている。
エンコーダーは、入力データを潜在空間の確率分布（通常はガウス分布）のパラメータに変換する。
デコーダーはこの潜在表現から元のデータを再構築する。
潜在空間におけるデータの分布を学習し、新しいデータの生成やデータの圧縮表現を行うことができる。

# Reparameterization Trick
確率的勾配降下法などの最適化アルゴリズムを用いてVAEを学習する際に使用される手法。
はエンコーダーが潜在変数のサンプリングを行うが、このサンプリング操作は微分不可能であり、勾配の計算が困難。Reparameterization Trickは、このサンプリング操作を確率分布のパラメータを使って再パラメータ化することで、微分可能な操作に変換し、勾配の計算を可能する。

# 変分下限
真のデータ分布とVAEがモデル化する分布（エンコーダーとデコーダーによって生成される）の間の距離を定量化する。
変分下限を最大化することは、VAEが真のデータ分布に近づくように学習することを意味する。
変分下限は、KLダイバージェンスと再構築誤差の和として定義される。
KLダイバージェンスは、モデル化する分布と真の分布の違いを測定し、再構築誤差は、デコーダーが元のデータを再現する際の誤差を表す。
行列 パラメータ メモ



![IMG_6047.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/8dd726c0-f9bf-6676-6d2f-7ea0087a7e8a.jpeg)
Ｙパラメータ

![IMG_6048.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/42a1ffc2-b594-8cad-4d61-91ca7a1ad5b9.jpeg)
Zパラメータ
https://cluster-iperc.matrix.jp/wp/wp-content/uploads/2021/04/%E7%B7%9A%E5%BD%A2%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0CH-10-compressed.pdf


![IMG_6049.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/d680b445-86c1-48f7-c9dc-356ff4533e98.jpeg)
Fパラメータ
![IMG_6050.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/9ae523c5-db8a-6c80-81d5-b788cb688138.jpeg)
Hパラメータ

![IMG_6051.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/e6d1c38f-2129-935f-1d9d-baefa22ff481.jpeg)
Sパラメータ


https://zawa2.com/ZZsim/doc_twoport.html


{{出力1}, {出力2}} ={{a, b}, {c, d}}.{{入力1}, {入力2}}

入力1=
入力2=
a=
b=
c=
d=
出力1=
出力2=

https://www2-kawakami.ct.osakafu-u.ac.jp/omu-content/uploads/sites/1161/Lecture_Data/Electric_Circuit_II/01_Lecture/02_lecture_electric_circuit_II.pdf

![IMG_6105.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/be20df30-1f60-080c-fe24-e8ebd7e7e22b.jpeg)

![IMG_6106.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/70451c29-8e56-fbef-7ebe-3068821b3b6b.jpeg)

https://m.youtube.com/watch?v=qTyOcKNGaz8&pp=QAFIAQ%3D%3D
英語キーボードが接続されたWindowsからxrdpが動作するLinux環境へRDP接続する際、日本語キーボードとして誤って認識される問題へのとりあえずの対応方法

# はじめに

英語キーボード（USキーボード）が接続されたPC上のWindowsの「リモートデスクトップ接続」(mstsc.exe)からxrdpが動作するLinux環境へRDP接続する際、なぜか日本語キーボードとして誤って認識されることがあります。（Windows以外のMacやLinuxからRDP接続する場合は問題なく端末のキーボードと同じキーマップで認識される）

# 原因

RDP接続する際に、日本語キーボードのキーマップを参照していることが原因となります。Windowsからxrdpのログレベルをinfoにすることで、原因を確認することができます。

以下のログを見てみると、 `km-e0010411.ini` あるは `km-00000411.ini` がキーマップファイルとして参照されています。

```
[20240505-14:38:50] [INFO ] xrdp_load_keyboard_layout: model [] variant [] layout [us] options []
[20240505-14:38:50] [INFO ] Non-TLS connection established from ::ffff:192.168.1.46 port 52798: with security level : high
[20240505-14:38:50] [INFO ] xrdp_caps_process_pointer: client supports new(color) cursor
[20240505-14:38:50] [INFO ] xrdp_process_offscreen_bmpcache: support level 1 cache size 7864320 MB cache entries 100
[20240505-14:38:50] [INFO ] xrdp_caps_process_codecs: nscodec, codec id 1, properties len 3
[20240505-14:38:50] [WARN ] xrdp_caps_process_codecs: unknown codec id 5
[20240505-14:38:50] [WARN ] Cannot find keymap file /etc/xrdp/km-e0010411.ini
[20240505-14:38:50] [INFO ] Loading keymap file /etc/xrdp/km-00000411.ini
```

`/etc/xrdp/xrdp_keyboard.ini` を参照すると、当該キーマップファイルは日本語キーボードに対応するものであることがわかります。

```
; A list of supported RDP keyboard layouts
rdp_layouts=default_rdp_layouts
; The map from RDP keyboard layout to X11 keyboard layout
layouts_map=default_layouts_map

[default_rdp_layouts]
rdp_layout_us=0x00000409
rdp_layout_us_dvorak=0x00010409
rdp_layout_us_dvp=0x19360409
rdp_layout_dk=0x00000406
rdp_layout_de=0x00000407
rdp_layout_es=0x0000040A
rdp_layout_fi=0x0000040B
rdp_layout_fr=0x0000040C
rdp_layout_it=0x00000410
rdp_layout_jp=0x00000411
rdp_layout_jp=0xe0010411
rdp_layout_jp=0xe0200411
rdp_layout_jp=0xe0210411
rdp_layout_kr=0x00000412
rdp_layout_no=0x00000414
rdp_layout_pl=0x00000415
rdp_layout_br=0x00000416
rdp_layout_ru=0x00000419
rdp_layout_se=0x0000041D
rdp_layout_ch=0x00000807
rdp_layout_ch_fr=0x0000100C
rdp_layout_gb=0x00000809
rdp_layout_latam=0x0000080A
rdp_layout_be=0x00000813
rdp_layout_pt=0x00000816

; <rdp layout name> = <X11 keyboard layout value>
[default_layouts_map]
rdp_layout_us=us
rdp_layout_us_dvorak=dvorak
rdp_layout_us_dvp=us(dvp)
rdp_layout_dk=dk
rdp_layout_de=de
rdp_layout_es=es
rdp_layout_fi=fi
rdp_layout_fr=fr
rdp_layout_it=it
rdp_layout_jp=jp
rdp_layout_kr=kr
rdp_layout_no=no
rdp_layout_pl=pl
rdp_layout_br=br(abnt2)
rdp_layout_ru=ru
rdp_layout_se=se
rdp_layout_ch=ch
rdp_layout_ch_fr=ch(fr)
rdp_layout_gb=gb
rdp_layout_latam=latam
rdp_layout_be=be
rdp_layout_pt=pt
```


# 手順

あまり適切な手順ではありませんが、とりあえず当該環境へ接続時にUSキーボードとして認識させたい（強制的にUSキーボードとして認識させたい）場合は、次の方法で対応が可能です。例えば、常にUSキーボードしか使わないといった場合は、この方法でも困ることはないでしょう。

なお、本設定を行うと、日本語キーボードが接続された端末の場合も、当該環境に対するRDP接続時のキーマップはUSキーボードになります。このため、日本語キーボードで当該環境へRDP接続する際は設定を元に戻す必要があります。

## USキーボードとして強制的に認識させる

```
# cd /etc/xrdp
# mv km-00000411.ini km-00000411-org.ini
# ln -s km-00000409.ini km-00000411.ini
```

## 日本語キーボードを利用する（元に戻す）

```
# cd /etc/xrdp
# rm km-00000411.ini
# mv km-00000411-org.ini km-00000411.ini
```
JavaのNullハンドリング

- 環境
  Java 11以上
  
数年ぶりにJava(サーバーサイド)を使う機会があり、Nullチェックの方法についてのメモ。
以下のようなクラスのオブジェクトのGetterにアクセスしたいが、オブジェクトもフィールドもnullかもしれない場合の実装方法について、検討してみた。

```Java
	@Data
	@AllArgsConstructor
	@NoArgsConstructor
	class SampleClass {
		private BigDecimal bd;
	}
```

## よくある方法(やりたくない)
```Java
// ①nullだったら何らかの値にしたい場合
var str = (obj == null ? "" : (obj.getBd() == null ? "" : obj.getBd().toPlainString()));
System.out.println("str=" + str);

// ②nullだったら何もしたくない場合
if (Objects.nonNull(obj) && Objects.nonNull(obj.getBd())) {
	System.out.println("str=" + obj.getBd().toPlainString());
}
```
②については、`apache.commons.lang3`の`ObjectsUtil`を使えるかと思ったが、実行時例外が発生する。
```Java
if (ObjectUtils.allNotNull(obj, obj.getBd())) { // これは可変長引数の受け渡し時にNPE
	System.out.println("str=" + obj.getBd().toPlainString());
}
```

## Optionalを使用する方法
Kotlinだったら、`obj?.bd?.toPlainString()`とか`let`といったスコープ演算子で簡潔に対応できそうだが、現時点のJavaには存在しないためOptionalを使用。
```Java
// ①nullだったら何らかの値にしたい場合
var str = Optional.ofNullable(obj).map(SampleClass::getBd).map(BigDecimal::toPlainString).orElse("");
System.out.println("str=" + str);

// ②nullだったら何もしたくない場合
Optional.ofNullable(obj).map(SampleClass::getBd).ifPresent(bd -> {
	System.out.println("str=" + bd.toPlainString());
});


```
ウォーターフォール開発における見積もりの進め方

## 概要

ソフトウェア開発プロジェクトにおいて、適切な見積もりは成功への鍵となります。逆に見積もりに失敗すると、事業会社のビジネスに影響が出るだけでなく、受託開発をするベンダーにとっては大きな赤字や最悪の場合訴訟にも繋がってしまいます。

ビジネスを行う側としても、期日と予算に対してリリースすることを市場にコミットしている場合があります。何が何でも期日までに終わらせる必要がある場合は、ウォーターフォール開発が打ち手の一つになります。そこで本記事では、ウォーターフォール開発を採用する際にどのようなアプローチで見積もりをすれば良いかをまとめました。この記事が多くの人に役立てば幸いです。

本記事では、要件ややりたいことが定まっていない企画フェーズ（コンサルティングフェーズ）からの見積もりを想定しています。

## 想定読者

- 受託ベンダーのプロジェクトマネージャーないしコンサルタント
- 事業会社の情報システム部
- これからソフトウェア開発の発注を検討されている事業会社のプロダクトオーナー

## 1. プロジェクト開始前

プロダクトやシステムの導入金額が大体どれくらいなのか、あらゆるビジネス側の方々は気になるものです。しかしながら、世界中の優秀なエンジニアやコンサルタントを集めても、このフェーズで精緻な見積もりを出し切ることは難しいのが現実です。どうしてもざっくりで良いから大体の金額感を知りたい、もしくは求められた場合は、プロジェクトマネージャーまたはコンサルタントは過去の類似プロジェクトの事例を参考にしたトップダウン型の超概算見積もりや、想定する最小と最大の画面数から係数モデル見積もりを用いて、最小と最大の工数から金額を伝えてみると良いでしょう。より精緻な金額は以降のフェーズで出していくことをおすすめします。

## 2. コンサルティングフェーズ

要件が不明確な場合は、システムやサービスのソリューションや、方針、アーキテクチャやスコープを定義するためにコンサルティングフェーズを設けることを推奨します。その結果によっては、超概算見積もりも予算が大きく膨れてプロジェクトの中断も視野に入れたり、はたまたアジャイルで進めていく方がベストというソリューションになるかもしれません。

もしコンサルティングの結果、システムやサービスの方針、ソリューション、アーキテクチャが明確になったら、ファンクションポイント法やボトムアップ見積もり、係数モデル見積もりを用いて、現状想定している画面や機能に基づいた見積もりを行います。ただし、この段階ではまだ全ての必要な機能や画面が洗い出されていないため、見積もりには十分なバッファ（1.5倍程度）を積んでおくことが重要です。

## 3. 要件定義フェーズ

最後に、要件定義フェーズでは、もれなくダブりなく機能や画面を見積もる必要があります。この段階では、ボトムアップ見積もりやファンクションポイント法が適しています。ここでのバッファとしては途中で、要件獲得もれのリスクもあるため、気持ち一つ分のバッファは取っておくと無難かと思います（1.2倍増し）。

## まとめ

ウォーターフォール開発において、プロジェクトの各フェーズに合わせた適切な見積もり手法を選択し、十分なバッファを確保することが、プロジェクトの成功につながります。要件が明確になるにつれて、見積もりの精度を高めていくことが重要です。プロジェクト開始前、コンサルティングフェーズ、要件定義フェーズと段階的に見積もりを行うことで、プロジェクトの規模感を適切に把握し、スムーズな開発を進めることができるでしょう。見積もりは困難を極めますが、適切な手法を選択し、十分なバッファを確保することで、リスクを最小限に抑えながらプロジェクトを成功に導くことができます。
Windows環境でのInfluxDB構築

# 背景
InfluxDBをwindows環境で構築するサイトはいくつかあるが, DLページのUIが変わっていたりセットアップの方法が変わっていたりと少し迷ったので投稿.

# 手順
① [https://www.influxdata.com/downloads/](https://www.influxdata.com/downloads/)にアクセス

② Platformを"Windows Binaries(64-bit) using Power Shell"にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610270/70e4ddc4-d12d-5a17-8b60-ae05fba40372.png)

③ 生成されるコマンドをPower Shellにコピペ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610270/8144396b-e979-d394-1efd-38f866133270.png)

④ ZIPのDLが完了するまでしばらく待つ(2~3min)

⑤ ZIP解凍
(私の場合, commandで解答できなかった為手動で解凍した)

⑥ 解凍したディレクトリで.exe実行
```
~(保存したディレクトリ) > influxd.exe
```

⑦ http://127.0.0.1:8086/ にブラウザでアクセスしてセットアップ

おわり
ServiceNow＋ITSMを動画で解説

### 目的
対象は初学者向け。
ServiceNowで一番売れた製品はITSMです。ITSMを理解することはServiceNowを理解することと言っても過言ではないと思います。デモを通して「こんな感じなんだー」と理解してもらいたいです。

### 解説動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/jF32xQm1rAw?si=xNn4R2MmoTEhfL-3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

デモは別撮りの動画で行います。
データベース設計って難しいよねという話

# 初心者の私がデータベース設計（主に正規化）を学んで感じたこと
　データベースの入門書を読むなどすると第〇正規形や〇〇関数従属などの見慣れない言葉を目にする。最初は当然よくわからないが、しばらく勉強していると「言っていることはわかる」状態にはなれる。しかし、実際に上手くできるかは別であり、わかりやすい正解があるわけでもないので最初の段階で苦労することは避けられない。自分も「最初のテーブル設計ミスったら後が大変だよな・・・」と思ってなかなか手が動かなかった。
 　こういった困難はいずれ乗り越えなければならないのは当然としたうえで、本当の初学者の段階では過度に意識するのも良くないようにも思える。ミック著「達人に学ぶDB設計 徹底指南書」(p116)では下記のような指摘がなされている。
> 正規化を行なうためには、テーブル内部の従属性の関係を見抜く必要があります。

> こうした従属性はテーブルを形式だけ見ていてもわかりません。どの列がどのキーに従属しているか、ということは業務ロジック（ビジネスルール）で決まることなので、各列が業務上どのような意味と関係を持っているか、ということを調べなければなりません（業務分析の必要性）。

　また、初心者の私がデータベース設計を学ぶにあたって参照した[SQL攻略](https://sql.main.jp/norm07.html)においても、
> データベースの正規化は、顧客業務に通じたエンジニアの仕事であり、この理論を生かすためには長年の経験、継続的な業務の学習が大切だと思います。

との指摘がある。これらを踏まえると、テーブル設計の技術は一朝一夕で会得できるものではないことが分かるので、最初から気負い過ぎないのも大事な気がした。
# 余談
　データベースの設計ではなくSQLの話であるが、勉強になったのでメモ。直近の勉強でサブクエリをSELECT句に使うかFROM句に使うか悩む場面があったが、いまいち使い分けの方針が掴めずにいた。そこで、学習教材として利用させていただいたサイトである[TECH PROjinのSQL練習問題-問67](https://tech.pjin.jp/blog/2017/08/26/sql%e7%b7%b4%e7%bf%92%e5%95%8f%e9%a1%8c-%e5%95%8f67/)において、以下の記述があった。
 > SELECT句に副問合せを記述する場合には、その副問合せでは1件しかデータを返さないようにしないといけません。複数件のデータが返るようなデータ構造ならば、前問のようにFROM句での副問合せを使用しましょう。

　初歩的な知識かもしれないが、自分にとっては有益だったので誰かの助けになれば幸いである。
独学(？)を諦めてプログラミングのコーチングを受けることにしてみた

# 自己紹介
初めまして！
現在は中小のメーカーに勤めており
PC関連の雑務やシステムの管理、社内で使用するデスクトップアプリケーションの作成等を行なっております。

前職はドラッグストア店員で、IT系のスキルはほぼゼロでしたが、
インターネット検索でなんとかなってきました。
# JISOUに入会した理由
業務に使用するツールを直感的に使いやすくしたかったのですが、
自身の技術力にあまりにも自信が無くスクール的なもので学習を行いたいと考えているところに
JISOUに入会してアプリを作成されている方の記事が目に止まりました。

https://qiita.com/gantarooou_js/items/20505ec668b7cb27c222

学習の進め方なども詳細に書いてあり興味を持ったので、連絡をとりミーティングを行い、表現できる力を身につけられそうだなと感じ入会を決意しました。

# 目標
 - 3ヶ月後 
   - 社内用のアプリをReactで開発できるようになる
 - 1年後 
   - 社外でも通用するアプリをReactで開発できるようになる

実現できるようにこれから学んで進んでいきます。
[JavaScript]__proto__について図とコードで簡単紹介

## 紹介前に注意
現在は(2024/05)`__proto__`が[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/proto)において<font color="red">非推奨</font>とされています。だから、ここでは`__proto__`について学ぶためだけに述べており、実際の使用は控えるべきだと考えます。
## Property
簡単に説明すると、`__proto__`はJavaScriptにおけるプロトタイプの概念を具現化にしています。これを用いて、オブジェクトは他のオブジェクトからプロパティを継承し、`Object.prototype`にあるプロパティにアクセスすることができるようになります。

### \[\[Prototype]]

オブジェクトの間のプロトタイプチェーンを内部的に表すための属性です。
直接コードからアクセスすることができません。
### \_\_proto\_\_

外部アクセスが禁止されている`[[Prototype]]`にアクセスできるようにする属性です。

例を見てみましょう！
たとえば、以下のようないくつかの変数があります
```js
let dog = {
	foot: 4,
	bark: function () {
		console.log('woof!')
	}
}

let shibainu = {
	color: 'brown'
}
```
もし`shibainu`の`foot`を取得しようとすると.、`undefined`を表示されます。
```js
console.log(shibainu.foot) // undefined
```
これを実現するには、どうすればよいでしょうか？
この場合は、たった一行のコードを追加するだけ済みます。(もちろん`Object.create()`を使うなど、他にも方法はあります。)
```js
let dog = {
	foot: 4,
	bark: function () {
		console.log('woof!')
	}
}

let shibainu = {
	color: 'brown'
	__proto__: dog
}

shibainu.bark() // woof!
console.log(shibainu.foot) // 4
console.log(dog.color) // undefined
```

:::note alert
注意：`__propo__`を手動で設定することは、できる限り避けるべきです。
:::

## 図で理解
### hasOwnProperty

どんなオブジェクトも他のオブジェクトのプロパティを継承できます。継承すると、継承元のオブジェクトのプロパティを自分のものとして使用できるようになります。しかし、ここで疑問が生じます。継承したプロパティは本当に自分自身のものと言えるのでしょうか？

`Object.hasOwnProperty`を使用して、そのプロパティがオブジェクト自身に直接存在しているかを確認することができます。
```js
// dog
console.log(dog.hasOwnProperty('foot')) // true
console.log(dog.hasOwnProperty('bark')) // true
console.log(dog.hasOwnProperty('color')) // false

// shibainu
console.log(shibainu.hasOwnProperty('foot')) // false
console.log(shibainu.hasOwnProperty('bark')) // false
console.log(shibainu.hasOwnProperty('color')) // true
```

文字だけでは理解しづらいかもしてませんので、図を見てみましょう。

1. `shibainu`で`__proto__`を追加します

	![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1560883/0193461a-c450-182c-319b-6698067843e9.png)


2. `shibainu.bark() // woof!`の実行プロセス
	![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1560883/2117ff4b-5557-f874-412e-3535a4555e8e.png)




## 結論
`__proto__`は非常に強力な機能ですが、もともとECMAScriptの最初の仕様に含まれていませんでした。一部のブラウザによって導入され、徐々に普及しましたが、その後、ECMAScriptの2015仕様に正式に追加されたもかかわらず、現在はブラウザから徐々に非推奨とされています。できれば、使用を避けることが望ましいです。
代わりに`Object.setPrototypeOf`や`Object.getPrototypeOf`を使用が推奨されています。

これに関する質問や、追加、修正、削除すべき点があれば、コメント、メール、またはDMでお知らせください。

ありがとうございます！！！
行末改行と注意

自動改行の設定に癖があったので、メモします。
[こちらのサイトを参考に](https://www.codingfeline.com/2018/05/01/final-newline-androidstudio/)設定をすると、自動で行末改行させられます。新しいファイルを作成した時、余計な差分を乗せないために使用します。
`Preferences > Editor > General > Ensure line feed at file end on Save`
[別サイト](https://android.benigumo.com/20231017/add-new-line-at-end-of-file/)では
>Keep tarailing spaces on caret lineのチェックを外す

とありますが、私の場合はチェックを外さなくても自動改行できました。

### 注意
ただし、意図して改行したく無い場合もあります。例えば既存のプロジェクトでは、自動改行すると余計な差分が乗ることになります。一度行末改行すると、AndroidStudioからは元に戻せなります。その場合はSourcetreeのHunkを破棄から戻すようにします。

#### 参考
https://www.codingfeline.com/2018/05/01/final-newline-androidstudio/

https://android.benigumo.com/20231017/add-new-line-at-end-of-file/
HTTPリクエストしたファイル名が文字化けしてしまう

# 事象

- ファイル名に日本語を含む（概要.md）ファイルを"Content-Type": "multipart/form-data; charset=UTF-8"で HTTP 送信すると、サーバー側でリクエストを受け取ると、**ファイル名 が文字化けしてしまった**
    - 正しいファイル名：概要.md
  - 文字化けされたファイル名：æ¦è¦.md
- しかし、ファイルの内容（markdown の中身）自体は文字化けしていなかった

![2024-05-05-13-17-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601978/3ddbc07a-e217-d20f-225b-fe674e49d7c2.png)


# なぜ ファイル名 は文字化けして、ファイルの内容は文字化けしなかったか？

- ファイル名 は、HTTP ヘッダーに含まれて、<br>
- ファイル の内容は、HTTP ボディに含まれる<br>
  という違いがあります。

|            | HTTP ヘッダー    | HTTP ボディ                        |
| :--------- | :--------------- | :--------------------------------- |
| 扱えるもの | - ASCII 文字のみ | - 任意のデータ<br>- エンコード方式 |

## HTTP ヘッダー

**扱えるデータは ASCII 文字のみです。**<br>
日本語は非 ASCII 文字なので、これが原因で文字化けが発生しました。<br>
HTTP ボディと違ってエンコードはされません。

## HTTP ボディ

HTTP ヘッダーと違って、HTTP ボディでは、テキストデータとエンコード方式を扱えます。※<br>



データが HTTP リクエストのボディに含められる前に、エンコードされて、サーバーがリクエストを受信した後に、デコードされます。<br>

つまり、**HTTP ボディではエンコードとデコードが自動で処理されます**。<br>

HTTP ヘッダと HTTP ボディでこのような違いがあるため、HTTP ヘッダでは文字化けが起こり、HTTP ボディでは文字化けが起こらない、ということが発生しました。<br>

なお、デフォルトのエンコード方式は UTF-8 のようですが、header の Content-Type に明示的に charset=UTF-8 と指定することをおすすめします。<br>

※バイナリデータ（画像、ビデオ、オーディオファイルなど）も扱えますが、ここではシンプルにするためテキストデータのみで説明しました。<br>

# 問題の解決法

HTTP ヘッダでは ASCII 文字しか扱えないため、日本語などの非 ASCII 文字を ASCII 文字にエンコードする必要があります。

```js
const encodedFilename = encodeURIComponent(file.name);
```

encodeURIComponent()は下の文字以外を「% + 2 桁の 16 進法」という形式に変換します。

```
A-Z a-z 0-9 - _ . ! ~ * ' ( )
```

すると、すべて ASCII 文字になります。

で、サーバー側でリクエストを受信したあとで、デコードします。

```js
const decodedFilename = decodeURIComponent(req.file.originalname);
```

確認するとちゃんと日本語で表示されました。

![2024-05-05-13-29-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601978/06aecb4f-a479-a29a-e7b1-d55f9962bf95.png)
javascriptでyyyy/mm/ddゴルフ

## 概要
javascriptでyyyy/mm/dd。
年月日の各要素を別で取ってきて整形してガッチャンコしたり、toLocaleDateString()を呼んで分割してゼロ埋めしてまたくっ付けたりといったのがよくあるやり方だけれど、どうにも野暮ったいというかもっと短く書けんものかねと常々思っていた。
そこで業務中の暇にあかせて、じゃあどれだけ短く書けるんだという一人コードゴルフ大会を障害対応に追われる同僚を横目に敢行。

以下で動作確認済
●Microsoft Edge ver:124.0.2478.80
●Google Chrome ver:124.0.6367.119
## 結論
ワシの中での暫定キング
```javascript
const date = new Date().toLocaleString(NaN, {dateStyle:'short'});
console.log(date);
// ワンライナー
console.log(new Date().toLocaleString(NaN,{dateStyle:'short'}));
// 64bytes! shortをmediumとしても結果は同じになるようだ
// 本当ならちゃんとロケールに'JP'を指定してやる必要あるかな
```

## 試行錯誤
当初の戦略はtoLocaleDateString()を使ってのアプローチだった。
このメソッドはスラッシュ区切りの年月日を良い感じに返してくれるものだが、パディングされてないのがやや不満。
```javascript
const date2 = new Date().toLocaleDateString().split('/').map(i=>i<10?'0'+i:i).join('/');
console.log(date2);
// padStartを使った方が可読性的には優か
```
その後、そういえば引数にフォーマットとか指定できたっけと思い出し色々調べる。
```javascript
const options = {year:'numeric', month:'2-digit', day:'2-digit'};
const date3 = new Date().toLocaleDateString('ja-JP', options);
console.log(date3);
```
寄り道しつつ……
```javascript
const date4 = new Date().toLocaleDateString('SV').replaceAll('-', '/');
console.log(date4);
```
結論に至ったのである。

## 最後に
挑戦者募集、もっと短く書けるという者あれば。
フォーマットについては暇なときにもっと調べてみたい、"R6/5/5"みたいに元号返せるとか初めて知ったわ
> console.log(new Date().toLocaleDateString("ja-JP-u-ca-japanese"));// R6/5/5

しかしDate周りのメソッドはややこしいのが多い……
スプラの募集を行うdiscord botをpythonで作った

スプラトゥーンの募集をしたい際、参加情報や募集内容がまとまっていると募集するとき便利だなと思ったので、その機能を備えたdiscord botを作ってみた。

# botについて

 ### 環境
(開発)
- Python 3.10.8
- py-cord 2.3.2
- Pillow 9.3.0
- requests 2.28.1

### 中身
- 募集内容などの情報をどのように表示させるか
→見やすいように画像上に書き込むスタイルにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784325/00adf040-13d8-70ad-e606-40912563dca9.png)

###### こんな感じで
※画像はdiscord仲間に作ってもらいました。

### 参加者が出た時の処理
discord.Buttonを使いボタンが押されたときに、discord.Embedに参加者の名前を追加するようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784325/579cecd6-f8a4-f510-3d74-354ce99c7150.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784325/ceb1d08f-0c37-a443-3fed-bc313bd6bb73.png)


###### 他にも現在のステージ内容を確認できるボタンや、募集取り消し、募集〆などの機能も実装しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784325/9195221b-df89-85c9-bdf4-3718ef28fe15.png)

# 最後に
### これからやりたいこと
- 他の人にも公開する
oracleのARMインスタンスを獲得しているので、そこで常時動かす。

現在このbotは自分が運営しているサーバー、ikacordで稼働させております。興味がある方是非ご参加ください
https://discord.gg/jvyTbmhxDd
WSL2で始めるRust

# はじめに
こんにちは、@shuniiです
特に理由はないんですが、Rustという言語に興味を持ったので簡単に環境構築をしてみました。

# 動作環境
```
windows11 home
wsl version-2
ubuntu 22.04.4 LTS
```

# インストール
Rustの[公式ドキュメント](https://doc.rust-lang.org/book/ch01-01-installation.html)に従って必要なツールをインストールしていきます。

```
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```

# パスを通す
環境構築をそこまで経験していないのでcommand not foundのエラーで躓きましたが、パスを通していませんでした。今回の場合、home(~)ディレクトリにインストールされている前提で進めます。
```bash
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
```
> 自動的に.bashrcの末尾に追加されますので、お好みのエディタで編集してもらっても構いません。
vscodeの場合 => code .bashrc

:::note info
パスを通すって？
私たちは普段mkdirなどのコマンドでディレクトリを作成してファイルを保存しています。それはコマンドもまたしかりです。パスを通さずにコマンドを実行しようとするとフルパスを記述する必要があります。
フルパスを省略できるようなもの、とイメージすると簡単かなと思います。
> 個人的解釈であることをご了承いただければ幸いです。
:::

# 終わりに
Rustという名前になんとなく惹かれて始めてしまいました笑
まぁ一年に一度くらい他の言語を学習してみてもいいのかなぁ、と個人的に思ってます！いつかRustのOSSのコントリビュータとかやってみたいと思ってます(有識者の方いればコメントお願いします！！)。

# About Me
- X(Twitter)

https://twitter.com/shunii_hack