OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】パターンマッチャー

# 作るもの
与えられたパターンに対して、文字列内の部分文字列の組み合わせを探し、一致する場合にその組み合わせを返す関数。

# 実装
```python:pattern_matcher.py
def patternMatcher(pattern, string):
    # パターンが空または文字列よりも長い場合は、マッチング不可能なので空のリストを返す
    if len(pattern) == 0 or len(pattern) > len(string):
        return []

    # パターンの最初の文字を取得
    firstLetterA = pattern[0]
    amountOfA = 0
    amountOfB = 0
    firstIdxB = -1

    # パターン内の各文字をチェックしてAとBの数を数える
    for i in range(len(pattern)):
        if pattern[i] == firstLetterA:
            amountOfA += 1
        else:
            # 最初のB文字のインデックスを記録
            if firstIdxB == -1:
                firstIdxB = i
            amountOfB += 1

    # Bが存在しない場合
    if amountOfB == 0:
        lenA = len(string) // amountOfA
        # stringをAの数で均等に分割できる場合、分割して返す
        if lenA * amountOfA == len(string):
            if firstLetterA == "x":
                return [string[:lenA], ""]
            else:
                return ["", string[:lenA]]
        return []

    # Bが存在する場合
    for lenA in range(1, len(string)):
        lenB = getLenB(lenA, amountOfA, amountOfB, len(string))
        if lenB == -1:
            continue

        idxB = firstIdxB * lenA
        stringA = string[:lenA]
        stringB = string[idxB : idxB + lenB]
        potentialMatch = "".join(
            [stringA if char == firstLetterA else stringB for char in pattern]
        )
        # パターンに対する文字列の一致をチェック
        if potentialMatch == string:
            if firstLetterA == "x":
                return [stringA, stringB]
            else:
                return [stringB, stringA]
    return []


def getLenB(lenA, amountOfA, amountOfB, totalLength):
    # B文字列の長さを計算して返す
    v = (totalLength - (amountOfA * lenA)) / amountOfB
    return int(v) if v.is_integer() else -1


# テスト
if __name__ == "__main__":
    pattern = "xxyxxy"
    string = "gogopowerrangergogopowerranger"
    print(patternMatcher(pattern, string))

```

# 参考
https://www.algoexpert.io
回文判定のプログラム（PHP）

「何に使うんだ？」と思いつつも、備忘録として書いておく。

~~~
$line = trim(fgets(STDIN));
for($i=strlen($line);$i>=0;$i--){
    $kotae.=mb_substr($line,$i,1);
}
if($kotae==$line){
    echo "YES";
}else{
    echo "NO";
}
~~~
:::note info
コンソールから拾うため、trim(fgets(STDIN)としてある。
＄line:判定する文。
＄kotae:$lineをひっくり返した文。

※mb_substrだと日本語でも利用できる。
substrだと英文のみ対応。

半角＄が表示されない( ﾉД`)ｼｸｼｸ…。。
Node.jsバージョン管理ツール『Volta』を使ってみる

今回はVoltaのセットアップ方法について簡単に紹介します。

開発チームにおいて、Node.jsのバージョン管理が統一されておらず環境構築で各々が苦労する場面をよく見かけるので、統一したいなと思いその選択肢としてVoltaを使ってみました。

（これで何回目だろう、nodeのバージョン管理についての記事書くの。）


## Voltaの概要
Voltaは、Node.jsやJavaScriptのパッケージマネージャ（npm, yarnなど）のバージョンをシンプルに管理するためのコマンドラインツールです。

特徴については公式サイトで紹介されている3つの特徴を引用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472442/60c3755e-191f-a9f0-e50a-980cda64def6.png)


簡単にまとめると、

* **迅速なバージョン切り替え**: Voltaを使うと、コマンド一つで瞬時にNode.jsのバージョンを切り替えることができます。

* **プロジェクト毎のバージョン指定**: 各プロジェクトの設定ファイルにバージョンを指定することで、そのプロジェクト専用のバージョンを自動で使うことができます。

* **クロスプラットフォーム**: macOS, Linux, Windowsと、主要なOSでの利用がサポートされています。

## Voltaのインストール方法
Voltaのインストールは非常にシンプルです。以下に、各OS毎のインストール手順を説明します。

### macOS / Linux
以下のコマンドをシェルに入力するだけです。

```
curl https://get.volta.sh | bash
```
このコマンドは、公式サイトからスクリプトをダウンロードし、自動的にインストールを行います。

### Windows
Windowsユーザーは、公式サイトからインストーラをダウンロードし、それを実行することでインストールを行うことができます。(macユーザ＝の為今回は割愛します)




## Voltaを使ったNode.jsのバージョン管理
Voltaをインストールした後、実際にNode.jsのバージョン管理を行う方法について詳しく見ていきましょう。

### バージョンのインストール
新しいNode.jsのバージョンをインストールするには、以下のようなコマンドを使用します。

```
volta install node@latest
```
このコマンドは、最新のNode.jsのバージョンをインストールします。特定のバージョンをインストールしたい場合は、`@latest`の部分を目的のバージョン番号に置き換えてください。

```
volta install node@14.15.0
```

### インストール済みのバージョン一覧の確認
インストールされているNode.jsのバージョン一覧を確認するには、以下のコマンドを使用します。

```
volta list node
```
このコマンドにより、現在インストールされている全てのNode.jsのバージョンと、現在アクティブなバージョンが表示されます。

### バージョンの切り替え
特定のプロジェクトで使用するNode.jsのバージョンを指定したい場合、プロジェクトのルートディレクトリで次のコマンドを実行します。

```
volta pin node@14.15.0
```
これにより、そのプロジェクトでのみ指定されたバージョンのNode.jsが使用されるようになります。

:::note warn

volta pinはpackage.jsonにバージョンを記載するので、そもそもnpm initしてないと使えません。必要に応じてnpm initしてpackage.jsonを作成してください。
:::

グローバルに使用するバージョンを変更する場合は、以下のようにコマンドを実行します。

```
volta default node@14.15.0
```
DB関連の基本知識メモ（マスタ・トランザクションについて）

マスタとトランザクションについて、整理しました。

#### 前提
多分、マスタとトランザクションって何？と思い調べて、色々記事を読んだけど、
イマイチピンと来ないな…と思った方も多いと思います。（自分もそうなりました）
それは、業務内容やシステムの種類、DB設計方法によって、マスタとトランザクションを指すデータが違ってくるからです。
記事を書いた人が、どのようなシステムに携わってきたかによって具体例が異なるので
今自分の使っているシステムに対して、それを完全に当てはめるのは、難しいです。。

そんな訳で、今回は私から見たマスタとトランザクションの特徴を上げたいと思います。

## マスタデータ
#### マスタデータの特徴
　・システムの処理を通して、参照されることが多い
　・データの追加、更新、削除頻度は、トランザクションデータより少ない事が多い
　・企業が保有する資産であることが多い（商品、契約、ユーザー、etc...）
　・管理者が追加、更新、削除する事が多い
　・ユーザーが追加、更新、削除できることは少ない
　・他の概念に依存せず、単独で存在できるエンティティであることが多い

#### マスタデータの例
<dl>
  <dt>資産系</dt>
  <dd>商品情報</dd>
  <dd>契約情報</dd>
  <dd>顧客（ユーザー）情報</dd>
</dl>
<dl>
  <dt>組織系</dt>
  <dd>従業員情報</dd>
  <dd>社内部署情報</dd>
  <dd>支店情報</dd>
  <dd>取引先企業情報</dd>
</dl>
<dl>
  <dt>システム構成系</dt>
  <dd>画面上の選択項目</dd>
  <dd>内部コード定義</dd>
  <dd>カレンダー</dd>
  <dd>スキーマ、システム定義、メタ情報</dd>
</dl>

## トランザクションデータ
#### トランザクションデータの特徴
　・バッチ機能の処理結果として出力されることが多い
　・ユーザーによる画面操作で作成することが多い（計算実行ボタン、メッセージ送信、etc...）
　・企業が行う日次、週次、月次、年次業務の業務結果である事が多い
　・データの追加、更新、削除頻度は、トランザクションデータより多い事が多い
　・外部キー制約等、他の概念に依存するエンティティであることが多い

#### トランザクションデータの例
<dl>
  <dt>販売管理 業務系</dt>
  <dd>受注、発注情報</dd>
  <dd>仕入情報</dd>
  <dd>売上情報</dd>
</dl>
<dl>
  <dt>物流、在庫管理 業務系</dt>
  <dd>入荷、出荷情報</dd>
  <dd>在庫情報</dd>
</dl>
<dl>
  <dt>生産管理 業務系</dt>
  <dd>生産情報</dd>
  <dd>在庫情報</dd>
</dl>
<dl>
  <dt>人事管理 業務系</dt>
  <dd>勤怠情報</dd>
  <dd>人事評価、等級情報</dd>
</dl>
<dl>
  <dt>会計 業務系</dt>
  <dd>売掛、買掛管理請求情報</dd>
  <dd>入金、出金情報</dd>
</dl>
<dl>
  <dt>その他</dt>
  <dd>マスタの異動情報</dd>
  <dd>バッチ処理ログ履歴</dd>
  <dd>画面操作履歴</dd>
  <dd>外部システムから受領した情報</dd>
  <dd>一時テーブル</dd>
</dl>


## その他
マスタとトランザクションデータについて、理解を深めるには、
業務知識をまとめた本や、データモデリング関連の書籍を読むことが有用だと思います。
また、対象システムのDFD図やER図を眺めたりするのもいいかと思います。以上。

## 参考記事、本

https://www.shoeisha.co.jp/book/detail/9784798157382

https://www.shoeisha.co.jp/book/detail/9784798106458

https://www.katalog.tokyo/?p=1176

https://zenn.dev/dove/articles/c5672dda4c268e
HSP3.7β6 HGIMG4 で Vertex Texture Fetch

HSP3.7β4 で gpmatprmp が追加されました。
これによって gcopy 時だけでなく
オブジェクト描画時に buffer の内容を
テクスチャとして参照できるようになりました。
また最初の1回だけでなく毎フレーム自動で描画内容を適用してくれます。

この gpmatprmp と GLSL の texelFetch 関数を用いて
毎フレームごとに形状を変えるサンプルを紹介します。
buffer の各ピクセルの輝度に応じて高さを変えています。

_fetch.vert, _fetch.frag を sample/hgimg4/res/shaders フォルダに保存して，sample/hgimg4 フォルダに
texel.hsp ファイルを保存して HSP3.7β6 で実行します。
Windows 11 Home 64bit, Intel(R) UHD Graphics で動作しました。


```_fetch.vert
attribute vec4 a_position;
uniform mat4 u_worldViewProjectionMatrix;
uniform vec4 u_coeff;
uniform sampler2D u_infotexture;
varying vec3 v_pos;
void main() {
	vec4 col = texelFetch(u_infotexture, ivec2(int(a_position.x), int(a_position.y)), 0);
	float z = (col.r * 77.0 + col.g * 150.0 + col.b * 29.0) / 256.0;
	vec3 pos = vec3(a_position.x * u_coeff.x, a_position.y * u_coeff.y, z);
	v_pos = pos;
	pos = pos * 2.0 - 1.0;
	pos.z = z;
	gl_Position = u_worldViewProjectionMatrix * vec4(pos, 1.0);
}
```


```_fetch.frag
varying vec3 v_pos;
void main() {
	float level = v_pos.z;
	gl_FragColor = vec4(0.5, level, 1.0, 1.0);
}
```

```texel.hsp
#include "hgimg4.as"
#const BUF_ID 2
	w_tex = 256
	h_tex = 256
	w_num = 256
	h_num = 64
	gpusermat id_mtl, "res/shaders/_fetch.vert", "res/shaders/_fetch.frag"
	gpmatprm4 id_mtl, "u_coeff", 1.0 / double(w_num - 1), 1.0 / double(h_num - 1), 1.0, 1.0
// 情報バッファ
	buffer BUF_ID, w_tex, h_tex, screen_offscreen
	font "", 48
	gpmatprmp id_mtl, "u_infotexture", GPOBJ_ID_SRCFLAG + BUF_ID
// モデル作成
	gosub *make01
	setscale id, double(w_num) * 0.2, double(h_num) * 0.2, 8

	repeat
		getreq fps, SYSREQ_FPS
		getreq timer, SYSREQ_TIMER

		ang = double(cnt) * 0.004
// 情報テクスチャを描画する
		gsel BUF_ID
		redraw 0
		color 0, 0, 0
		boxf 0,0, w_tex, h_tex
// テクスチャ参照は下からなので下方へ h_tex - h_num だけオフセットする
		repeat 64
			x = cnt + 64
			y = (h_tex - h_num)
			lv = 192 * (cnt & 1)
			color lv, lv, lv
			boxf x, y, x, y + h_num
		loop
		color 128, 128, 128
		pos sin(ang) * 60 + 80, (h_tex - h_num) + 8
		mes "●"
		pos 8, (h_tex - h_num)
		color 255, 255, 255
		mes "" + fps + ", " + ((timer \ 1000000) / 100)
		redraw 1
// メイン3D描画
		gsel 0
		redraw 0
		setang id, -M_PI * 0.16, sin(ang) * 0.5, 0.0
		gpdraw
		redraw 1

		await 1000/60
	loop

*make01
	gpmeshclear
	nx = 0.0
	ny = 0.0
	nz = 1.0
	repeat h_num
		i = cnt
		repeat w_num
			j = cnt
			x = j
			y = i
			z = 0
			gpmeshadd index, x,y,z, nx,ny,nz
		loop
	loop

	repeat h_num-1
		i = cnt
		repeat w_num-1
			j = cnt
			v0 = i * w_num + j
			v1 = v0 + 1
			v2 = v0 + w_num
			v3 = v2 + 1
			gpmeshpolygon v0, v1, v2, v3
		loop
	loop	
	
	gpmesh id, , id_mtl
	return
```

|実行結果|
|:-:|
|![スクリーンショット 2023-08-11 140947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213145/ad927b9d-6ad7-8934-a606-6751fafc2b58.png)|
|buffer の明るいところほど飛び出します|
並列Lispでたらいまわしをした話（３）

# 前回までの整理
Easy-ISlispはver4.0で並列機能の追加を目指しています。手始めにコンカレントGCに入れ替えました。

![GC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/71475f85-d123-42ff-b788-5e38f07afd92.png)

Easy-ISLispは起動時に並列用のワーカースレッドとGCスレッドを起動しておきます。これらはキューに入れられて待機状態になります。

ワーカーは並列計算を担当します。計算の過程で空きセルが不足するとGCスレッドに起動するように通知を送ります。GCは通知を受け取るとコンカレントモードに入ります。どうしてもストップザワールドにしないといけない時間があるのでそのときにはコンカレントストップモードにはいります。この間セルの供給はストップします。スイープが終わるとストップモードは解除され通常動作になります。



![スレッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/77e38876-f772-574c-da6a-6335491eaeb2.png)


ワーカースレッドはキューに入れられて待機させられます。５コアのマシンでは３つ、６コアのマシンでは５つが生成されます。plet、pcall、pexecの並列構文が実行された場合には分割されたS式がワーカーに送られeval計算が開始されます。plet,構文などはそれらのワーカーのeval計算が全部を終わるのを待って制御をメインスレッドに戻します。計算が終わったスレッドはキューに追加されます。

# なんでインテルCPUよ、並列が遅い？
前回の投稿でたらいまわし計算を並列で行うとかえって遅くなることがわかりました。ところが不思議なことにarmを積んだラズパイ400では並列の効果がみられるのです。なぜ？

まだ推測段階ですが、どうもインテルのicoreシリーズはシングルスレッドでの高速性を重視しているようなのです。メインに比べるとサブのコアはそれほど計算速度は低速のようです。AMDのRYZENはインテルとは逆に並列性能の方を重視しているようです。科学技術技術計算にはRyzenの方が向いているという記事がみつかりました。並列プログラミングにおいてはRythenの方が向いているようです。

# 実証
中古のRyzenマシンを探してきましょうか。どこかに安いの転がってないかなぁ？

現在、ver3.40です。処理系はここに置いてあります。

https://github.com/sasagawa888/eisl
Rのヒストグラムでfreq=FALSEにした時の縦軸がおかしい

Rでヒストグラムを作成する際、縦軸を度数（頻度）ではなく相対度数にしたいという時が結構あると思います。

この時、freq=FALSEを指定してやればOKと思っていましたが、実はそうではなかったっぽいのでメモしておきます。



# 縦軸のデフォルトは度数（頻度）

タイトルのまんまです。何も指定しなければ縦軸は度数（頻度）になります。

```R
X <- rnorm(100, mean=0, sd=1) # サンプルデータの作成（正規乱数）
hist(X)
```

![hist_freqT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296113/aa1b8a72-613f-f85d-4fdf-c2e5e27da5ee.png)

もちろん `hist(X, freq=TRUE)` としても同じ図が出力されます。


# hist(data, freq=FALSE) の縦軸は相対度数ではない

Rのヒストグラムは `freq=FALSE` としても相対頻度（割合）にはなりません。
見た方が早いので早速。```freq=FALSE``` を指定してやります。

```R
hist(X, freq=FALSE)
```

![histgram_freqF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296113/067032a8-96cc-39ff-a650-4a0b3bbd729f.png)

もし、縦軸が相対度数を表しているなら棒[^1]の長さの合計は1になるはずですが、どう見ても1にならなさそうです（真ん中らへんの3つの棒を足すだけで1を超えている）

というわけで、`freq=FALSE` としても相対頻度が描画されないことが分かりました。

「じゃあこれってなんなんだよ」って思うと思いますが、これは確率密度関数を推定したものになっているようです。なのでヒストグラムの面積の総和は1になっています。

[^1]:たぶん普通は"bin"っていうと思いますが、この記事では誰にでもわかりやすく"棒"でいきます。


# 相対度数を描画するには

一旦、ヒストグラムを格納して中身を見てみます。

```R
H <- hist(X)
```

すると、

![histの中身.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296113/44523dbc-8764-bc41-5fcd-bfa8299b5bf9.png)

こんな感じで、ヒストグラムが色々なパラメータを持っていることが分かります（Rstudioで見ています）

`freq=FALSE` とした際の縦軸は `$density` を使っており、各棒の度数は `$counts` に入っているので、`$counts` をもとに相対度数を計算して `$density` を書き換えます。

```R
H$density <- H$counts / sum(H$counts)
plot(H, freq=FALSE)
```

![hist_相対度数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296113/c2ca3e9c-faf2-08b5-3f02-fb8030ff43d4.png)

この際、グラフの出力には上記のように `plot` を使います。
また、 `freq=FALSE` も書いてあげる必要があります。

これで無事に相対頻度を描画することができました。

めでたしめでたし。

---

ちなみにヒストグラムのパラメータがそれぞれ何を表しているかというと、

- `$breaks`：セル間の分割点（それぞれの棒の端の座標だと思えばOK）
- `$counts`：棒に含まれるデータの数
- `$density`：確率密度の推定値（たぶん `$mids` における確率密度の推定値[^2]）
- `$mids`：棒の真ん中の座標
- `$xname`：データの名前
- `$equidist`：`breaks` の間隔がすべて等しいか（等しい場合は `TRUE`）

[^2]: [histのドキュメント](http://127.0.0.1:21889/library/graphics/html/hist.html)のSee Alsoに[density](http://127.0.0.1:21889/library/stats/html/density.html)があり、これによるとどうやらカーネル密度推定をしているみたいです。

# ★参考文献★
[1] http://127.0.0.1:21889/library/graphics/html/hist.html （histのドキュメント）
[2] http://127.0.0.1:21889/library/stats/html/density.html （densityのドキュメント）
The Machine Learning Pipeline on AWS受講レポート

AWSが主催しているオンライン研修"The Machine Learning Pipeline on AWS"を受講しました。
その内容と感想を共有していきます。

https://aws.amazon.com/jp/training/classroom/the-machine-learning-pipeline-on-aws/

# 日程・費用
期間は4日間と長丁場です。
毎月第2週の火～金曜の4日間に開催しているようです。
（2023年8月は第2金曜が祝日だったため、月～木曜でした）
時間は9:30～17:30。

費用は28万円でした。(2023年8月時点)

# レベル

>ML の経験がほとんどないかまったくなく、Amazon SageMaker を使用して ML パイプラインについて学びたい人（公式から引用）

Pythonのコードを実行していくハンズオンがありますので、Python(特にPandas)の経験があるとより理解が深まると思います。

ML(機械学習)の経験がなくても大丈夫ですが、やはり多少は合ったほうがより理解が深まります。
（学習曲線(loss)やAcc/Precision/Recallなどの指標を見たことがあるけど、よくわかっていない人など)

私は商業高校の情報処理科卒で、数1Aを履修済み、3年生の後半に数2Bをちょっとやったけど、あまり理解できていない系ですが、ついていける内容でした。

# 内容
:::note info
講師に、目次レベルは公開してよいと了承をいただいています。
:::
* Day1
受講前の評価テスト(全26問)（理解度チェック）
機械学習とMLパイプラインの概要
Amazon SageMakerの概要
Amazon SageMakerの操作(ハンズオン)
プロジェクトを選択する(演習)※何をやったか思い出せない
問題の定式化
プロジェクトのビジネス上の問題を定式化する(演習)
* Day2
昨日の復習テスト ※解説なかった
データの前処理
データの前処理(ハンズオン)
モデルトレーニング
* Day3 ※講師交代
昨日の復習テスト＆解説
モデル評価
モデルのトレーニングと評価(ハンズオン)
プロジェクトのプレゼンテーション(演習)※やってない
特徴量エンジニアリングとモデルチューニング
* Day4
昨日の復習テスト&解説
特徴量エンジニアリング(ハンズオン)
モデルのデプロイ
MLパイプラインプロジェクト(ハンズオン)
受講後の評価テスト（Day1最初と同じテスト(全26問)を実施)

研修名にある"Pipeline"は、ビジネス課題から成功基準を定義(=定式化)し、それに向けてデータ収集、前処理、トレーニング、評価、チューニング、デプロイまでの一連の流れのことを指していました。
ですので、ビジネス上の最初から最後まで学ぶことができる研修でした。

各日の最初に、前日の内容確認テスト(6~10問程度)があり、終わった後に講師が解説してくれます。
(Day2は解説が無かった気がする)


ハンズオンはJupyterNotebookでの回帰タスク(売上などの数値予測)がメインです。
SageMakerのコンソールはあまり見ることがなく、SDKを使ってPythonコードからSageMakerの機能を呼び出します。
（詳しいログや成果物は、自分で管理コンソールを開いて確認していました）
SageMakerにハイパーパラメーターチューニング(探索)の機能があり、使うことができました。

使うモデルはSageMakerが標準で提供している線形回帰とXGBoostでした。
(Transformer言語モデルや、ResNetなどのCNNは使いません）

Day4の最後のハンズオンの中に、ハイパーパラメーターチューニング(探索)がありますが、1時間以上かかるジョブで、ハンズオンを最後までやり切れませんでした。
(ジョブ実行中は、受講後の評価テストを実施していました）
ハンズオン環境(AWS SageMaker)は受講後1か月は生きているそうなので、復習することができます。

本研修を受講後に「MLOps Engineering on AWS」を受講すると、SageMakerを使った実践的なCI/CDを体験できるとのことでした。(3日間, 21万円)

https://aws.amazon.com/jp/training/classroom/mlops-engineering-on-aws/

# 感想
機械学習についてググると難しい内容がたくさんHITします。
読んで理解できなかったとき、さらに自分で知りたいことが載っているページを検索しないといけませんが、講師がいる研修なので質問してすぐに教えてもらえるため、大変良かったです。

また、ネット上だとデータの前処理や特徴量エンジニアリングについて、あまり調べてこなかったので、その点を学習することができたのがよかったです。
（仕事で取り組んでいるのが画像関連のMLなので、機会がほとんどなかった）

受講前テストは44点(26問中11問正解)でしたが、受講後に同じ問題を解くと82点(26問中21問正解)でした。

休憩は1～1.5時間に1度は必ずあり、ハンズオンも時間的な余裕があって、ストレスなく受講できました。

仕事でMLをやっている身としては、受講して大変よかったと思える内容でした。
特に、train_lossのグラフやPrecision/Recallを雰囲気で見ていて、なんとなく学習率をイジっていたのが、この研修を通して意味がキチンと理解できるようになりました。
また、推論エンドポイントの選択肢を学ぶことができたので、業務でも十分に役に立ちそうです。
【メモ】brew goenv で最新のバージョンが取得できるようになっていた

# はじめに
久々にローカル開発環境の go のバージョンを更新したので備忘を兼ねてメモ
ローカルの go のバージョンが 1.17 で止まっていたので、1.21 に更新した時のメモ

# 前提
現在の go 環境は以下の内容で構築している

https://qiita.com/Ixy_194/items/656333289e463e24b4d8


当時（2021年9月頃）は、 brew で最新の goenv が取得できないって言うのでgit 公式から直接最新版を取得していた。
今も同じ状況なのか、確認も兼ねてローカルの開発環境アップデートに臨でみようと思います

# やったこと
## git clone で取得した goenv の削除
当時のインストール時のコマンド
```zsh
% git clone https://github.com/syndbg/goenv ~/.goenv
 ...
 ...
# インストールできたのでバージョンを確認
% goenv -v
goenv 2.0.0beta11
```
とりあえず、削除します
```zsh
% rm -rf ~/.goenv
```

## brew で goenv のインストール
```zsh
# インストール
% brew install goenv

# インストールされたバージョンの確認
% goenv -v 
goenv 2.1.4
```
これで、インストール完了
次に、 goenvで使用できる go のバージョン確認します
```zsh
% goenv install -l
Available versions:
  ...
  1.20.3
  1.20.4
  1.20.5
  1.20.6
  1.20.7
  1.21.0
```
お、ちゃんと最新版もしようできるようになってる！よかった
では、1.21.0インストールして使えるようにします

## go のインストール
まずは、1.21.0版をインストール
```zsh
% goenv install 1.21.0
Downloading go1.21.0.darwin-amd64.tar.gz...
-> go1.21.0.darwin-amd64.tar.gz
############################################################################################################# 100.0%############################################################################################################# 100.0%
Installing Go Darwin 64bit 1.21.0...
Installed Go Darwin 64bit 1.21.0 to /Users/mao/.goenv/versions/1.21.0

```
OK,インストールできたバージンを有効化して
```zsh
% goenv global 1.21.0
```
設定された go　のバージョンを確認
```zsh
% go version
go version go1.21.0 darwin/amd64
```
OK, 期待通り設定されていますね、よかった

# 最後に
今後、新しいバージョンが出てきた場合は、 brew をアップデート（`brew update && brew upgrade goenv`）すれば取得できるのだろうか。
次回、ためしてみよーと思います
【Tomcat】独自のエラーページをjspで表示する方法

# 概要
Tomcatで独自のエラーページを表示させる方法を調べて試して、
1日かけてようやく出来たので備忘録として残します。

# 問題
[参考サイト](https://atmarkit.itmedia.co.jp/ait/articles/0407/13/news100.html)の方法を試してもTomcatのエラーページが表示される。

1. webApps/**任意webアプリケーション**にエラーページを配置(今回は404)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528591/f2c8d116-562c-2989-8fdc-3bd4b9b9e257.png)

2. WEB-INFの**web.xml**でエラーページを指定する
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528591/e7bbd4c2-60be-234c-f704-bff7a728d606.png)
~~~web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>

##以下の内容を入れる
<error-page>
  <error-code>404</error-code>
  <location>/404.jsp</location>
</error-page>

</web-app>
~~~

3\. 存在しないページにアクセスしてもTomcatの標準エラーページが表示される。
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528591/bb278290-6646-3f16-f0fe-c4ed127e102a.png)



# 解決方法
jsp内に参照できないファイルがあると、
Tomcatの標準エラーページが表示されるようです。

## jsp内を見てみる
~~~java
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>title</title>
</head>

<body>
  <header>
    <h1>404エラー</h1>
  </header>
   <main>
    <section>
      <h2>ページが見つかりません</h2>
      <p>お探しのページは、移動または削除された可能性があります。</p>
    </section>
  </main>
  <jsp:include page="footer.jsp" />
</body>
</html>
~~~

 `<jsp:include page="footer.jsp" />'`の部分に問題がありました。

jspファイルはincludeアクションで、
指定の場所に別のjspファイルを反映させることができます。（[詳細はこちら](https://www.javadrive.jp/servlet/jsp_action/index4.html))

しかし、404.jspと同じ階層に**footer.jsp**は存在しません。

Tomcatからすると「**footer.jsp**ないよー、標準の404ページを表示するね」
という具合なのだと思います。

## jsp内を修正する
 `<jsp:include page="footer.jsp" />'`を消して試してみると、
独自のエラーページに飛ぶことができました。
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528591/78874a21-8cba-8d42-6951-96399016c4d1.png)

# 終わりに
どなたかの参考になれば幸いです。
Draft.jsについて整理する

# Draft.jsとは
:::note info
Facebookが開発したReact用のリッチテキストエディターフレームワーク、ライブラリのこと。
普通の<input>タグでは、例えばTwitterのツイート内で@や#を付けたら、自動でアカウントへのリンクやハッシュタグのリンクになるリッチな処理は実装が困難なため、Draft.jsが使用される。
:::


## 簡単に実装してみる
`create-react-app` コマンドを利用して React のプロジェクトの作成後、
`npm install draft-js`でライブラリをインストール。


```javascript:src/components/MyEditor.js
import { useState } from 'react';
import { Editor, EditorState } from 'draft-js';
import 'draft-js/dist/Draft.css';

function MyEditor() {
  const [editorState, setEditorState] = useState(() =>
    EditorState.createEmpty()
  );

  const saveContent = () => {
    console.log(editorState.getCurrentContent());
  }

  return (
    <div>
      <div>
        <button onClick={saveContent}>保存</button>
      </div>
      <Editor 
        editorState={editorState} 
        onChange={setEditorState}
        placeholder='ここから入力してください' 
      />
    </div>
  );
}
export default MyEditor;
```


```javascript:src/App.js
import logo from './logo.svg';
import './App.css';
import MyEditor from './components/MyEditor';

function App() {
  return (
    <div style={{ margin: '2em' }}> {/* 値2emは、相対的な単位での大きさを示す */}
      <h1>Draft.js</h1>
      <MyEditor />
    </div>
  );
}

export default App;

```

### ブラウザ上で入力が可能に
| 入力前 | 入力後 | 
|:-----------|------------:|
| ![入力前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/30884f57-37fc-8243-4da1-fe88986f5fb9.png)| ![入力後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/51c2160d-2332-b5e9-e3df-d2489f76eada.png)        |



# Draft.jsの構成
Draft.js では `useState` を用い、エディタの状態を示すイミュータブル変数 `editorState` および、状態変更関数 `setEditorState` でエディタ内部の状態を逐次変化させる。

`<Editor>` としてラップした子要素のなかに、`contenteditable="true"` かつ、 `role="textbox"` な `div` 要素を持ち、そのなかで直接テキストを入力していく。

contenteditable属性
👉https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/contenteditable

新たに行を作成しテキストを入力すると、ユニークなオフセットキーを持つ `div` 要素が生成され、その配下に実際のテキストを含む `span` 要素が入ります。つまり、ブロックごとに管理をしていくイメージになります。



参照したリンク
[ReactリッチテキストエディタDraft.jsを基礎から理解する](https://reffect.co.jp/react/draft-js/#react-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)
[React専用リッチテキストエディタライブラリ「Draft.js」の実践的Tips集](https://www.to-r.net/media/draftjs-tips/)
【Android】テキストサイズを自動的に調整する機能を使った時の落とし穴【Kotlin】


# はじめに
テキストサイズを端末の画面サイズに応じて自動調整してくれる機能なんてあるんだ！と思い、軽い気持ちで設定した機能で
```
android:autoSizeTextType="uniform" 
```
というものがあり　TextViewに設定しましたが、これを使った時にやりたいことができなかったという実体験を記事にします。

# android:autoSizeTextType="uniform" ってなに？
先述した通り、端末サイズに合わせてテキストサイズを自動で調整してくれる機能で、大きい画面では文字サイズを大きく 小さい画面では文字サイズを小さくといった感じで、横軸と縦軸で均一に拡大縮小してくれるものです。
"none"を設定することで　機能をオフにすることもできます。

# 問題点
結論から言うと、**動的にテキストサイズを変えようとした時に テキストサイズを変えることができなかった。**
と言うことです。
自動調整機能でのテキストサイズ変更が優先され、動的にテキストサイズを変えることができなくなっていました。
早めに気がついてよかったのですが、気がつけなかった時に見事にハマっていたなと思う内容でしたw

# 参考

https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview?hl=ja

https://buildersbox.corp-sansan.com/entry/2020/08/12/110000
Unityで作った自作ゲームの多言語対応

ネットの情報を調べてやってみた感じ、思ったより簡単にできそうだったので自分用の備忘としてもまとめておく。
まあググれば普通に出てくる内容です。
パッケージを追加でインストールする必要があるとはいえ、Unity公式が提供している機能だけで完結できるのはやや安心感はあるか。

・この記事を書いた時の実行環境
Unity 2023.2.0（Windows版）

# UnityとUnityエディタ上での設定・動作確認
自分で手順をまとめようかとも思ったけど、概ねこちらのサイトで説明されている通りに実施すればいいので省略。
サイト内で説明は無いが、後から他の言語も追加指定できる。
・https://robotcoders.net/2022/03/unitylocalization/

ただ、上記サイトの内容だけだとUnityエディタ上でしか言語変更できない。
「この機能を軽く試してみたい」程度ならここまででいいが、他の人に使ってもらう前提のアプリやゲームなら現実的ではない。
なので、実機の画面上から変更できるようにするためにスクリプトは作成しなければならない。

# スクリプト側の設定
例として、画面上にドロップダウンを配置し、そこで「日本語」や「英語」を選択できるようにする。
ゲームの設定画面とかでよく見るやつね。

事前にTextを2つCanvas上に配置、それぞれの表示文字を「決定」「キャンセル」とし、TextオブジェクトにはLocalize String Eventを設定しておく。
また、Localization側には各言語の「決定」「キャンセル」に相当する文言設定を済ませておく。

### 1．スクリプト作成
まずはCreateからC#スクリプトを作成。
内容は下記。
（変数やメソッドの命名はやや適当になってるので適宜いい感じに変更するように）
```
using System.Threading.Tasks; // ←追加
using UnityEngine;
using UnityEngine.Localization; // ←追加
using UnityEngine.Localization.Settings; // ←追加
using UnityEngine.UI; // ←追加(Legacy版ドロップダウンを使う場合)
using TMPro; // ←追加(TMPro版ドロップダウンを使う場合)

public class ChangeLanguage : MonoBehaviour
{
    [SerializeField] private TMP_Dropdown dropdown_tmp; // 画面上のドロップダウン
    [SerializeField] private Dropdown dropdown_lgc; // 画面上のドロップダウン

    // ドロップダウンの値が変更された時のイベントから呼び出す用
    public void ChangeSelected()
    {
        ChangeLang();
    }

    // 実際に使用言語を変更する処理
    private async Task ChangeLang()
    {
        // このまま使う場合、case内の言語指定とドロップダウン内の項目順は合わせておくこと
        switch (dropdown_tmp.value) // Legacy版ならdropdown_lgc.valueを指定
        {
            case 0: // 日本語
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("ja");
                break;
            case 1: // 英語
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("en");
                break;
            case 2: // 中国語(簡体字)
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("zh-Hans");
                break;
            case 3: // 中国語(繁体字)
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("zh-TW");
                break;
        }
        await LocalizationSettings.InitializationOperation.Task;
    }
}
```
### 2．ドロップダウンの配置とスクリプトの設定
スクリプトを保存したら、画面上（Canvas上）にドロップダウンを配置。
そしてドロップダウンのコンポーネントにこのスクリプトをAddする。

### 3．値取得対象のドロップダウン指定
このスクリプトは対象のドロップダウンをInspector上で設定できるようにしてあるので、このスクリプトをAddしたドロップダウンをdropdown_tmp（もしくはdropdown_lgc）に設定。
※もちろんAwakeやStartメソッドでdropdown_xx = gameObject.GetComponent\<XX\>();をやって自動取得するようにしても良い。

### 4．ドロップダウンのイベント設定
次にドロップダウンのOn Value Changedイベントで自身を指定、上記ChangeLanguageのChangeSelected()メソッドを指定する。

### 5．動作確認
後は実行してドロップダウンを変更し、文言や画像が想定通りに変更されるのを確認する。
（できればビルドして実機でも確認してみよう）
![20230811-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390733/dd273416-d593-31ac-7bbe-de3c9c57075c.gif)
以上。

# やってみた感じ
そこまで複雑ではないし、早いうちに使い方を覚えておけば、今後の作品でも気軽に自力である程度は多言語対応できそう。
少なくとも言語ごとに別プロジェクト作って～…とか、専用の複雑なローカライズ機能を別途作って～…みたいな対応はしなくて済むかと。
テキストとかに毎回Localization機能を追加するのは手間だけど、事前にテンプレート（プレハブ）化しておけば多少はその手間も軽減できそうだし…。

# 参考サイト
・https://robotcoders.net/2022/03/unitylocalization/
・https://anogame.net/unitypackage_localization/
SQLで簡単な条件分岐CASEを使う

## SQLで条件に合わせて値を変える

```sql
SELECT
    CASE
        WHEN 条件1 THEN 値1
        WHEN 条件2 THEN 値2
        ELSE 値3
    END AS 列名
```

### 例

```sql
SELECT
    CASE
        WHEN age < 20 THEN '未成年'
        WHEN age < 65 THEN '成人'
        ELSE '高齢者'
    END AS age_group
FROM
    users
```
【ChatGPT無】にCustom instructionsが開放されました！

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　ChatGPT（無料版）に
　　　Custom instructionsが
　　　　開放されたことを
　　　　　ご報告。
***
　まずは、
　　2023/08/10朝に発見！

　Web版にログインして、
　　Settingsと同列のメニューの
　　　トップに見慣れない文字。

　！

　Custom instructions、
　　無料版に来たぁ！

　えっ、本当に？

　でも、タップしたら
　　画面が、あちこちで見たもの。

　本物だ！
***
　とはいうものの、私は
　　Custom instructionsについて
　　　あんまり
　　　　ピンッときていません。
　　　　　オイw

　事前に設定しておくことで、
　　すべてのセッションで、
　　　Promptに含める
　　　　必要がなくなる、
　　　　　というのは理解してます。

　でも、逆に言えば、
　　Promptとともに
　　　Custom instructionsを
　　　　セットにしなければ、
　　　　　Prompt単体の公開を
　　　　　　するわけには
　　　　　　　いかないのです。

　公開を考えなければ、
　　いい機能だとは思います。
　　　いちいちPromptに
　　　　書かずに済むんですから。
***
　とにかく、
　　実際に使ってみました。

　上の欄に、事前情報。
>私は日本人。
あらゆることに興味を持つ。

　下の欄に、出力要望。
>・箇条書きやリストは、説明不要。
・プログラム作成は、不要。
・コードブロックは、不要。

　と入力して、
　　NewChatして、
　　　箇条書きを出してもらう。

　うん、確かに、
　　説明が出てこない。

　Custom instructionsを
　　オフにしてみると、
　　　説明が出る。

　なるほどなるほど。
***
　あっ、
　　いい使い道を
　　　思い付きました👍

　これは、
　　ここで語るには
　　　ちょっと、もったいない！

　実験して、
　　調整してから
　　　記事にしようと思います。

　うふふんうふん。
***
　OpenAIのリリースノートによると
　　Custom instructionsが
　　　無料版に開放されたのは、
　　　　2023/08/09かららしい。
　　　　　シリコンバレー時間ね。

　東京都の木曜日 9:00 は、
　　シリコンバレーの水曜日 17:00 。
　　　（By Google）

　とすると、
　　私が、見つけた日ですね。
　　　ラッキー！
***
　ちなみに、
　　上記の状態で、
　　　ChatGPTアプリを
　　　　操作してみたところ、
　　　　　出力がおかしくなった。

　中途半端に、
　　機能している感じです。

　Web版からログアウトして、
　　アプリでの操作をする際は、
　　　**Custom instructionsを
　　　　オフにしてからの
　　　　　ログアウト**を
　　　　　　推奨します。
【UE5】エディタを開くとクラッシュする　Assertion failed:WorldPartition->World == World 

# 原因

エディタを開くと以下のクラシュレポートが表示されたので原因を調べてみる

```
LoginId:3af87c3947e064c5f24064af86d10b24
EpicAccountId:26b4c5efa4084493b034af27b4fb3e95

Assertion failed: WorldPartition->World == World [File:D:\build\++UE5\Sync\Engine\Source\Editor\WorldPartitionEditor\Private\WorldPartition\SWorldPartitionEditor.cpp] [Line: 73]

```

Third Person TemplateのデフォルトMapをリネームし
Project Settings → Default Maps → Editor Startup Map
とのパスが切れていたのが原因

![スクリーンショット 2023-08-11 113834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/860aa2fe-d161-d207-30ce-e517a8dff027.png)


#  解決策

1. DefaultEngine.ini内のEditorStartupMap , GameDefaultMapに開きたいLevelのパスを通す
2. Project Settings → Default Maps → Editor Startup Map → Noneになっている所を変更

```
"プロジェクト名\Config\DefaultEngine.ini"
  → EditorStartupMap = "表示したいMapパス" 
  → GameDefaultMap = "表示したいMapパス"
```
![スクリーンショット 2023-08-11 114759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/745b4677-ff81-3ea2-3495-8308890d088e.png)

# 未検証
リネーム後にリダイレクターを行うと改善できるもしれない

https://historia.co.jp/archives/1028/


# 参考サイト
https://forums.unrealengine.com/t/assertion-failed-worldpartition-error-on-startup/234426
wslでelixir その37

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
jsonをインデントせよ。

# サンプルコード

```

defmodule Matt do
  @moduledoc """
  Documentation for `Matt`.
  """
  @doc """
  Hello world.
  ## Examples
      iex> Matt.hello()
      :world
  """
  def hello do
    :world
  end
	def run() do
		name = "ttt.json"
		name2 = "ttt2.json"
		Fa.start_link
		{:ok, file} = File.open name2, [:write]
		{:ok, str} = File.read(name)
		Enum.map(String.split(str, ""), fn s ->
			if s == "{" do
				Fa.add
				IO.binwrite(file, s)
				IO.binwrite(file, "\n")
				IO.binwrite(file, Fa.get)
			else
				if s == "}" do
					Fa.sub
					IO.binwrite(file, "\n")
					IO.binwrite(file, Fa.get)
					IO.binwrite(file, s)
				else
					IO.binwrite(file, s)
				end
			end
		end)
		File.close file
	end
end

defmodule Fa do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			0
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			cond do
			v == 0 ->
				""
			v == 1 ->
				"\t"
			v == 2 ->
				"\t\t"
			v == 3 ->
				"\t\t\t"
			v == 4 ->
				"\t\t\t\t"
			v == 5 ->
				"\t\t\t\t\t"
			v == 6 ->
				"\t\t\t\t\t\t"
			v == 7 ->
				"\t\t\t\t\t\t\t"
			v == 8 ->
				"\t\t\t\t\t\t\t\t"
			v == 9 ->
				"\t\t\t\t\t\t\t\t\t"
			v == 10 ->
				"\t\t\t\t\t\t\t\t\t\t"
			v == 11 ->
				"\t\t\t\t\t\t\t\t\t\t\t"
			v == 12 ->
				"\t\t\t\t\t\t\t\t\t\t\t\t"
			v == 13 ->
				"\t\t\t\t\t\t\t\t\t\t\t\t\t"
			v == 14 ->
				"\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
			:else ->
				" "
			end
		end)
	end
	def add() do
		Agent.update(__MODULE__, fn v ->
			v + 1
		end)
	end
	def sub() do
		Agent.update(__MODULE__, fn v ->
			v - 1
		end)
	end
end

```


以上。
Rancher Desktopが壊れた

環境：Intel Mac, Ventula 13.4.1

Container Engineをcontainerdからdockerdに切り替えてRancher Desktopを再起動したらエラーが発生するようになった

https://zenn.dev/shimo_s3/articles/de009ec4db106b

この記事と同じようなエラーだったので、containerdに戻してメモリ増やして再起動したけど解決せず
Rancher Desktopのバージョンを1.8から1.9に上げてみたけど変わらず

アンインストールしてゴミになってそうなディレクトリ消して再インストールしたら解決した
```sh
$ brew uninstall rancher

$ rm -rf /Users/xxx/Library/Application\ Support/Rancher\ Desktop
$ rm -rf /Users/xxx/Library/Application\ Support/rancher-desktop

$ brew install --cask rancher
```
さくっとthree.jsでドーナツを作る

# 概要
ドーナツ好きな皆様のために、three.jsでドーナツを作ります。
three.jsのインストール方法が[コチラ](https://qiita.com/penta-design-system/items/a21b5aefffbda25d3b41)


# 準備するもの
- MacOS
- Nodeの最新バージョン
- VSCode
- Svelteなど


# TorusGeometryを使う
three.jsの[公式サイト](https://threejs.org/docs/#api/en/geometries/TorusGeometry)にトーラスジオメトリが用意されているので、こちらを使います。
[前回](https://qiita.com/penta-design-system/items/a21b5aefffbda25d3b41)の立方体のジオメトリを、ドーナツのジオメトリに切り替えます（前回を参照）
newするときのコンストラクタに何も指定しないと、デフォルト値が適用されます。

コンストラクタの引数でデフォルトのサイズ
- radius(中央からの半径) - 1
- tube(チューブの半径) — 0.4
- radioSegments(断面円の分割数) — 12
- tubularSegments(芯の円の分割数) — 48
- arc(中心角(ラジアン)) — Math.PI * 2(360°)

```js:App.js
// 立方体のジオメトリ
// const geometry = new THREE.BoxGeometry(1, 1, 1);
// ドーナツのジオメトリ
const geometry = new THREE.TorusGeometry();
const material = new THREE.MeshPhongMaterial({
    color: 0xe9780a // ドーナツカラー
});

// メッシュを作成
const mesh = new THREE.Mesh(geometry, material);
// ドーナツのサイズ分、Y軸を上げる
this.torus.position.set(0, 1.4, 0);

```

# 指向性ライトを作る
太陽光と同じような並行な光を当てます。
ポイントライトから指向性ライトに切り替えます。

コンストラクタの引数でデフォルトのサイズ
- color(色) - 0xffffff
- intensive(強度) — 1
- distance(距離) — 0
- decay(減衰) — 2
```js:App.js
// ポイントライト
// const light = new THREE.PointLight();
// 指向性ライト
const light = new THREE.DirectionalLight(0xffffff, 3);
// 座標(x,y,z)
light.position.set(100, 130, 80);
```

# ガイドを表示する
無空間に設置するとイメージしにくいので、ガイドを表示しておきます。
AxesHelperとGridHelperを作成して、シーンに追加するだけです。
それぞれサイズやマスの数が指定できます。

```js:App.js
// xyz軸表示
const axes = new THREE.AxesHelper(100);
this.scene.add(axes);

// 座標表示
const size = 100;
const divisions = 20;
const gridHelper = new THREE.GridHelper(size, divisions);
this.scene.add(gridHelper);
```

# 結果
無事にドーナツが表示されました。
(pageは新しくtorus用に作っています)

![ドーナツ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522989/0e920999-de32-6439-24eb-e5e506eb70ad.png)
【Flutter】DurationやEdgeInsetsを簡単に記述できるパッケージを作った

こんにちは。広瀬マサルです。

簡単なパッケージを作ってみました。

`int`や`double`からエクステンションを介して`Duration`や`EdgeInsets`、`SizedBox`を作成するパッケージです。

使い方をまとめたので興味ある方はぜひ使ってみてください！

# katana_shorten

https://pub.dev/packages/katana_shorten

# はじめに

`Duration`や`EdgeInsets`などはFlutterを実装する上でよく使うクラスだと思います。

意外と記述するための文字数が多く自動補完があるとはいえ文字を入力するための手間がかかってしまいます。

そのため、それらを短縮できるようなエクステンションをまとめたパッケージを作りました。

下記のように簡単に書けます。

```dart
Padding(
  padding: 16.p, // EdgeInsets.all(16)
  child: Text("text")
);

Future.delayed(100.ms); // Duration(milliseconds: 100)
```

# インストール

下記のパッケージをインポートします。

```bash
flutter pub add katana_shorten
```

# 使い方

## Duration

下記で代用できるようになります。

```dart
100.ms // Duration(milliseconds: 100)
100.s  // Duration(seconds: 100)
100.m  // Duration(minutes: 100)
100.h  // Duration(hours: 100)
100.d  // Duration(days: 100)
```

## EdgeInsets（Padding / Margin）

下記で代用できるようになります。

```dart
100.p  // EdgeInsets.all(100)
100.px // EdgeInsets.symmetric(horizontal: 100)
100.py // EdgeInsets.symmetric(vertical: 100)
100.pt // EdgeInsets.only(top: 100)
100.pb // EdgeInsets.only(bottom: 100)
100.pl // EdgeInsets.only(left: 100)
100.pr // EdgeInsets.only(right: 100)
```

## Space（SizedBox）

下記で代用できるようになります。

```dart
100.sx // SizedBox(width: 100)
100.sy // SizedBox(height: 100)

Empty() // SizedBox.shrink()
```

# おわりに

自分で使う用途で作ったものですが実装の思想的に合ってそうならぜひぜひ使ってみてください！

また、[こちら](https://github.com/mathrunet/flutter_masamune)にソースを公開しているのでissueやPullRequestをお待ちしてます！

また仕事の依頼等ございましたら、私の[Twitter](https://twitter.com/mathru)や[Webサイト](https://mathru.net)で直接ご連絡をお願いいたします！

https://mathru.net/ja/contact

# GitHub Sponsors

スポンサーを随時募集してます。ご支援お待ちしております！

https://github.com/sponsors/mathrunet
デバックモードの使用方法

##デバッグモードの使用メリット
ブレークポイント時点での変数の中身を確認できる

## 手順
①Eclipseを開き、ソースコードが記載されているウィンドウの左側に見える数字を右クリック。


②ブレークポイントを選択

③Eclipseの画面の上側に見える虫のアイコンをタッチする
デスゲームのビジネスモデルを本気で考えてみた

中学1年生の娘と映画や小説の話をしている時にふと考えた。
デスゲームというジャンルは人気のあるコンテンツだが、裏舞台（運営側）が描かれることは少ない。
ビジネスであれば、ビジネスモデルもあるはずだ。
勉強ついでにさっそく考えてみよう。

:::note info
本記事は題材こそ過激ですが、「アイデアがあってもビジネスモデルがない」時など、どのように1→10を構築できるかを扱っているつもりです。
決して実運用しようとは思っていませんので、悪しからず。
:::

## WHO,WHAT,HOWを考える

まずは、それぞれの要素について考えてみる。
知識の源泉はマンガや映画や小説なので、浅い。とりあえずざっくり。

#### WHO(ターゲット)
- なんとなくのイメージでしかないが、お金持ち？かつダークな背景の方々？

#### WHAT(提供価値は何か)
- 普段なかなか見ることができないものを見れること？鑑賞すること自体に価値がある？

#### HOW(どのように提供するか)
- 鑑賞するための場所を提供する
- 参加するプレイヤーを集める

つまり、こういうことだろうか。
![ビジネスモデル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/78afd8ee-5774-5093-de47-697dcd7f07dd.png)


## 課題の発見

ブラッシュアップしていくために、今のビジネスモデルを眺めながら課題（つっこみポイント）を整理する。

**価値が弱い**

- 主に価値が弱いと感じるポイントは以下の通り。
  - <INS>ターゲットにフィットしにくい</INS>
「普段なかなか見ることができないものを鑑賞する」を価値にしているけど、
そりゃ、一般人はそうかもしれないが「ダークな背景の方々」にとってはそうでもないんじゃないか？（怖）
  - <INS>リピーターがつきにくい</INS>
  意外と飽きやすいコンテンツでは？
  鑑賞のみが目的の場合、リピーターになりにくいのでは？

**提供手段に現実味がない**
- 現実味がないと言えばすべてがそうだが、特に以下。
  - <INS>「参加するプレイヤー」集めの実現性について</INS>
「目が覚めたらここにいた…」みたいなシチュエーションが描かれることがあるが、あり得るのか？コナンくらい使い勝手のいい麻酔針がないと無理では？
  - <INS>鑑賞するための手段、場所の提供について</INS>
東京ドームで開催するわけにはいかないし、公的な場所はレンタルできない。
となると、開催場所は山奥の廃墟や無人島や船とかだろう。その場合、顧客に現地集合現地解散をお願いするのはキツい。


それぞれの課題を解決してみよう。


## 課題解決


本来の使用目的とは若干違うかもしれないが、整理しやすいので「問題解決シート」を使用する。

https://studyhacker.net/mckinsey-framework


課題「ターゲットにフィットしにくい」「リピーターがつきにくい」は一緒に考える。
![問題解決シート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/f3d09533-ac41-e6d3-b5c9-d1835d397f65.png)
課題を分析する。
すでに表面化した課題であれば「なぜなぜ分析（Where,Why,What）」が有効だが、
まだ実在していない課題の場合はロジカルシンキングやクリティカルシンキングが有効だと思う。
![問題解決シート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/9fcbf7ca-e741-a88c-83cf-cf4b55ca69f2.png)
課題を再定義し、解決策を書いていく。
![問題解決シート3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/f715cdf9-ef1c-0550-8a6e-560c448ecb8d.png)
いろいろすっ飛ばしているが、とりあえず解決はできたっぽい。
同じ方法で、残り２つの課題についても取り組む。
![問題解決シート4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/4342b946-34ea-1c2b-d38b-a21887785d0b.png)
![問題解決シート5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/c2ec7430-87cd-5ea0-7fd3-427b0eb6ff40.png)

課題が解決したところで、再度ビジネスモデルを描いてみる。

## １回目のブラッシュアップ

ブラッシュアップした結果がこちら。
![ビジネスモデル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173993/6d771fef-8b40-7898-87fa-b6d88e396a9f.png)
最初のモデルと比べて実現イメージが湧きやすくなった。
この状態で、次は収益構造を考える。
考えるにあたって、いろいろなテンプレートが用意されているので使ってみる。

・ビジネスモデルキャンパス
・VALUE DESIGN SYNTAX

https://scentbox.jp/business-model-canvas/

https://bizzine.jp/article/detail/8109

収益構造を整理すると、新たなコストや新たな収益手段を発見できるかもしれない。
都度ビジネスモデルをブラッシュアップしていく。
実際にテンプレートを使ったマネタイズも書きかったが疲れたんでここまでにします。

## 感想

「本気で考えてみた」という割に浅かった。やはり一人で考えるのは限界があるので、時間があればチームで考えたい。

自分と全く関わりのないサービスについて「あれってどんな収益構造なんだろう？ビジネスモデルなんだろう？」と考えるのは良い気分転換になるし、研修やワークショップの題材としても良いテーマなんじゃないかと思った。
防衛省サイバーコンテスト2023 Programming Mimic Unicode

他の方の Write Up 読んでもよくわからなかったので、自分でもやってみる。
最初 Take Byte しつつ、AND, XOR などビット演算いろいろやってみていたけど、そこまで必要なかった。

Charcode をビット列とみなせばよかったようだ。

Charcode に変換してそれぞれ、1、0 に変換してbinary を character に

```
https://gchq.github.io/CyberChef/#recipe=To_Charcode('Space',16)Find_/_Replace(%7B'option':'Simple%20string','string':'30b4'%7D,'0',true,false,true,false)Find_/_Replace(%7B'option':'Simple%20string','string':'30b3%203099'%7D,'1',true,false,true,false)Find_/_Replace(%7B'option':'Simple%20string','string':'%20'%7D,'',true,false,true,false)From_Binary('Space',8)
```

# 参考

https://qiita.com/kusano_k/items/4985775b1cfb87478479#mimic-unicode-20%E7%82%B9

https://blog.hamayanhamayan.com/entry/2023/08/06/220606?utm_source=dlvr.it&utm_medium=twitter#programming-Mimic-Unicode
野球部に継承について説明してみた

おはようございます！
今日もオブジェクト指向プログラミングシリーズで、「継承」と「オーバーライド」についての記事を書いていきたいと思います。

まずはそれぞれの言葉についての解説です。

#### 継承とは
継承とは、既存のクラス（親クラス）から新しいクラス（子クラス）を作成することです。
子クラスは親クラスの属性やメソッドを引き継ぎます。これにより、コードの再利用が容易になり、プログラムの整理や拡張がしやすくなります。
継承を利用する主な目的は、既存のコードの再利用と、新しいクラスの迅速な実装です。これにより、開発時間の短縮やコードの保守性の向上が期待できます。

#### オーバーライドとは
オーバーライドとは、サブクラス（子クラス）でスーパークラス（親クラス）のメソッドを再定義することです。これにより、親クラスで定義された挙動を、子クラスで特有の挙動に変更することができます。

例えば、親クラスに「自己紹介する」というメソッドがあるとします。子クラスでは、この自己紹介の内容を特定の役割に応じて変更したい場合があります。その際にオーバーライドを使用すると、親クラスのメソッドをそのまま利用しつつ、子クラスで必要な部分だけを変更することができます。

オーバーライドのメリットは、コードの重複を減らし、柔軟なプログラムの構造を作ることができる点にあります。親クラスのメソッドを基本として、子クラスで特定の挙動を追加・変更することで、効率的にコードを整理し、拡張性と保守性を高めることができます。


https://qiita.com/yangyooji1946/items/52f63fa4fc351edb20d0

以前に書いたこちらの記事では、選手クラスからインスタンス化して各選手のオブジェクトを作ることを考えてみましたが、今日は選手クラスから「継承」を使って投手クラスと野手クラスを作り、そこから各選手のインスタンスを作ってみたいと思います。

「継承」を理解することで、プログラムの設計やコードの読み書きがより効率的になります。
特に大規模なプロジェクトでは、これらの概念の適切な使用が非常に重要という事なので、頑張って理解していきましょう！

### パワプロで考える「継承」
パワプロの選手のパラメータを思い出して下さい。
野手はポジションに関係なくミートやパワーなどパラメータは同じですが、投手はコントロールやスタミナといった別のパラメータが必要になります。一方で選手の名前や背番号といった共通したパラメータも存在します。
このような場合に、継承が役に立ちます。

ここでは、選手から投手と野手に分かれて、そこから各選手に分岐するというような階層構造でオブジェクトを作成してみたいと思います。

また、オーバーライドを説明するために自己紹介を行うintoroduceメソッドを追加しています。
使うメソッドは1種類ですが、誰がいうかによって内容が変わります。（＝どのオブジェクトが使うかによって内容を変えることができます。）


```JavaScript
// 選手クラスを定義
class Player {
  constructor(name, number) {
    this.name = name; // 選手名
    this.number = number; // 背番号
  }

  // 自己紹介メソッド
  introduce() {
    console.log(`私の名前は${this.name}、背番号は${this.number}です。`);
  }
}

// 選手クラスを「継承」した投手クラスを定義
class Pitcher extends Player {
  constructor(name, number, stamina, control, speed) {
    // 名前と背番号は選手クラスから引き継ぐ
    super(name, number);
    // 投手クラス特有のプロパティを追加
    this.stamina = stamina; // スタミナ
    this.control = control; // コントロール
    this.speed = speed; // 球速
  }

  // introduceメソッドをオーバーライド
  introduce() {
    console.log(`私の名前は${this.name}、背番号は${this.number}で、コントロールは${this.control}です。`);
  }
}

// 選手クラスを「継承」した野手クラスを定義
class Fielder extends Player {
  constructor(name, number, meet, power, run, throwing, fielding) {
    // 名前と背番号は選手クラスから引き継ぐ
    super(name, number);
    // 野手クラス特有のプロパティを追加
    this.meet = meet;
    this.power = power;
    this.run = run;
    this.throwing = throwing;
    this.fielding = fielding;
  }

  // introduceメソッドをオーバーライド
  introduce() {
    console.log(`私の名前は${this.name}、背番号は${this.number}で、ミートは${this.meet}です。`);
  }
}

const ishiiKazuhisa = new Pitcher('石井一久', 1６, A, F, 15３);
const furuta = new Fielder('古田敦也', 27, B, C, D, A, A);

// 同じintroduceメソッドで違う処理ができる
ishiiKazuhisa.introduce(); // 私の名前は石井一久、背番号は16で、コントロールはFです。
furuta.introduce(); // 私の名前は古田敦也、背番号は27で、ミートはBです。
```

もちろんです！以下、まとめ部分の作成を行います。

### まとめ
今回の記事では、オブジェクト指向プログラミングの重要な概念である「継承」と「オーバーライド」について解説しました。

1. **継承**：親クラスの属性やメソッドを子クラスが引き継ぐことで、コードの再利用と整理、拡張が容易になります。例えば、野球の選手クラスから投手クラスと野手クラスを派生させることができます。

2. **オーバーライド**：子クラスで親クラスのメソッドを再定義することで、特定の挙動を変更することができます。これにより、コードの重複を減らし、柔軟なプログラムの構造を作ることができます。

最後に、この記事が皆さんの学びに役立つことを願っています。
もし役立ったと感じたら、いいねやフォローをお願いします！

それでは今日も学習をスタートします！
現場でよく使用するPostgresSQL

## SQL文
○Copyコマンド、カンマ区切り
Copy テーブル名 from 'ファイル名' (delimiter ',' format csv, header true)
ヘッダーがない場合は、header trueを削除

○Copyコマンド　タブ区切り
COPY users TO 'ファイル名' (delimiter e'\t' format csv)

○Update
update テーブル名　set カラム名 = value where 条件式;
他の方も見ているテーブルの場合、影響を最小限に留めるためにupdateをよく使用する

○truncate
truncate テーブル名;
サイズが大きいテーブルを削除する場合に使用。deleteと違い、検索せずにテーブルを削除できるため、処理スピードが速い

○revoke 
ユーザーから、テーブルへのアクセス権限を奪うときに使用
REVOKE SELECT ON テーブル名 FROM ユーザー名;

○grant
ユーザーにテーブルへのアクセス権限を付与するときに使用
grant SELECT ON テーブル名 to ユーザー名;


### ロールバック
実行中のトランザクションの処理を全て廃棄し、データをトランザクション開始前の状態にすること。
Begin;
update テーブル名 set カラム名 = 1 where 条件式;
rollback;

### ロック
トランザクションが実行され、あるレコードにアクセスしている際に、他のトランザクションから削除や更新できないようにすること
ex)
Select * from テーブル名 where 条件式 for upate;
select 文が実行された時点で、commit/rollbackが実行されるまで条件に一致した行にロックがかけられる。
typescript で let の変数宣言に型を割り当てる ( 例: let foo: number )

# 数値

```ts
let foo: number

foo = 1

// 型 'string' を型 'number' に割り当てることはできません。
// foo = 'AA'
```

# 数値または文字列

```ts
let bar: number | string

bar = 1
bar = 'AAA'
```

# 独自の型

```ts
type Params = {
  name: string
  age: number
}

let params: Params = {
  name: '',
  age: 0,
}

params.name = 'YYY'
params.age = 20
```


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
Databricksのユーザーグループ名を変更できるようになりました

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

https://docs.databricks.com/en/release-notes/product/2023/august.html#groups-can-now-be-renamed

マニュアルはこちら。

https://docs.databricks.com/en/administration-guide/users-groups/groups.html#change-group-name

![Screenshot 2023-08-11 at 10.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/085d5159-f29c-dda0-f673-98b315b0bdc5.png)

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
AWS JumpStart 2023 設計編 振り返り

## はじめに
AWSが開催するワークショップの「AWS JumpStart 2023 設計編 」に参加してきました。
AWSビギナーのエンジニアの方々を対象とした実践的な研修プログラムで、講義やハンズオンを通してAWSのサービスの理解を深めていく内容になっています。

※注:スライドや資料の掲載許可はいただいております。

https://pages.awscloud.com/jp-aws-jumpstart-architecture-reg.html

## 参加日
2023年8/8(火) - 8/9 (水)の二日間参加しました。
定期的に行われているようで、今回が4回目の開催の様です。

## スケジュール
下記のタイムスケジュールで進んで行きました。
各パートの詳細については後ほど記載していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/bb3347ff-d423-332a-2403-6d5e323c60f4.png)

## 使用ツール
- `Zoom`
オンライン開催なので、Zoomに参加して受講しました。
基本的に研修中は繋ぎっぱなしで、講義パートやアーキテクチャ解説時には画面共有して資料を映しながら進めました。
- `Slack`
講義内容に対する質問やハンズオンのトラブルシューティングは主にSlackで行いました。
- `Miro`
二日目の構成図を書くときに使用しました。
講師の方がAWSのアイコンや構成図のサンプルなどを事前に用意してくださったのでスムーズに取り組めました。

https://miro.com/ja/


## 事前学習動画
開催日までに下記２つの動画を事前に視聴しておく様にとの事でした。
AWSの基本的なサービスについての解説動画です。
AWS Certified Solutions Architect - Associate試験に向けての講義動画になっていました。

**はじめてのアーキテクティング (60分)**

 https://www.youtube.com/watch?v=cD870G8uqhY

**AWS入門 (3時間)**

https://youtu.be/Kb7ZEBwqUAI?t=2006

## プログラム
### 1日目

**講義パート(アーキテクティングのコツ)**

事前学習動画で学習した内容の振り返りや、規模やフェーズに合わせてたアーキテクチャのパターンを解説していただきました。構成を考える時に意識しないといけない箇所を学ぶ事ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/4a3ad548-c20a-6aad-dae3-2b601a9a48cd.png)


**EC2ハンズオン**

ハンズオンでAWSマネジメントコンソールから、VPCとサブネットを作成して、その中にEC2インスタンスを作成しました。(AWS側で講義用アカウントを用意してくれてました)
その後、立てたEC2インスタンスへSession Managerを使用してログインするところまで行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/102e562f-a677-0ea3-108c-6a0dd577ea96.png)


**ALB+ECS+RDSハンズオン**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/23d25f40-2c45-c6c1-5612-b70b3a3c55fa.png)

上記の構成でALB+ECS+RDSハンズオンを行いました。
ALBやRDSは業務でも使用したことがあったのですが、ECSは使った事がなかったので学びが多かったです。
RDSのフェイルオーバーの挙動確認や、ECSのタスクを一つ落とした場合の挙動なども確かめました。

### 2日目
- クイズ
２日目の最初は振り返りも兼ねてクイズ形式で数個問題を解きました。
基礎的な物から悩む物まであったので良い振り返りの機会になりました。

- 個人でのアーキテクチャ検討
とあるシステム会社の新規システムを作るという体裁でインフラの構成図を作ってみよう！と言う課題でした。
システムの規模、要件、機能などの説明があり、それらを満たせるような構成を考えるワークでした。
まずは個人で考えて、Miroで構成図を書きました。

- グループでのアーキテクチャ検討
個人で考えた後は、少人数のグループ(自分のグループは3人でした)に分かれて一緒に構成図を考えるグループワークを行いました。
各自考えた構成を説明してお互いの良いところを取り入れてグループで一つの構成図を作成していきました。

- 公開中間レビュー
途中で希望者はAWSの方に構成図の中間レビューをしてもらうことが出来ました。
自分たちのグループも立候補したのですが、抽選で外れてしましました。
３グループくらいのレビューを見て、後ほど自分たちの構成図にも良いところや考慮が漏れていたところを追加しました。

- 成果発表
最後に自分たちの作成した構成図の成果発表がありました。
抽選で選ばれた3グループくらいのチームメンバーが発表する形式でした。
グループによって構成図が少しずつ違ったり、自分が知らないサービスを組み込んでいたりしたので勉強になりました。

自分たちのグループが作成した構成図です。
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/f6502ad4-c897-4ff5-7338-65e01d6f97ea.png)

## ふりかえり
AWS公式のイベントには初めて参加しましたがとても学びが多かったです。
以前から疑問に思っていたことを、Slackの質問チャンネルで質問できたので、悩みを解消できました。
また、アカウントを提供してくださったので、料金などを気にせずハンズオンで学ぶことが出来ました。(自分のアカウントでやると結構料金かかるので...)

講師の方も研修中飽きないように工夫を凝らしてくれていましたので、楽しく受講できました。
#0015 同期処理・非同期処理

# はじめに
- 私はフロントエンド開発にAngularを利用している。
- Anugularの大きなメリットは「非同期処理」と聞いたことがある。
- 概念的にはわかるが、実際Angularの実装部分で非同期処理がどう効いているかがわからない。
- 正直、言われるがまま使っており、その恩恵を感じられていない。
- 改めて、同期処理・非同期処理を調べてみた。

# 同期処理（Synchronous）
- 「プログラム」を上から実行する。
- 今の処置が終わるまで次の処理が始まらない。
- シングルスレッドで一つのプログラムを実行する感じ。

# 非同期処理（Asynchronous）
- ある処理中、それを止めることなく、別の処理を実行する。
- JavaScriptではAjax（Asynchronous JavaScript and XML）という技術を用いた非同期処理が有名。
- 同時に実行しているわけではなく、**待ってる間に次を始める**というのが肝
- JavaScripの非同期処理は並列処理を使って並列処理のように振る舞っている。（おそらく）
    - 並行処理（Concurrent）：処理を一つ一つ実行する→高速に切り替えることで"同時に"行っているように見える。
    - 並列処理（Parallel）：処理を同時に実行する。

# 非同期処理の利点
- 非同期処理の最大の利点は、「ユーザビリティの向上」です。
- GoogleMapでは座標の移動、周辺情報の読み込みを非同期で行っているため、スムーズに動きます。
- Amazonではあるページを見ながら、リンクされたページを非同期で読み込んでいるため、スムーズに動きます。


# 終わりに
- 次回以降の記事で、非同期処理を実装を交えて語りたい。
- 解説できるようにしたいこと
    - promise
    - rxjsのObservable、BehaviorSubject
    - async, await (pythonでも扱いたい)
- 正直、非同期処理、並行処理、並列処理、マルチスレッドの区別をまだ上手く説明できない。
Intellij IDEAでGradleのキャッシュをクリアする方法。

## はじめに
Intellij IDEAを使用して開発を行っている最中にいきなりビルドが通らなくなったりすることがたま〜〜に発生します。

そのような時にGradleのキャッシュをクリアしてみると治る場合があるのですが、キャッシュクリアにはいくつか方法があるので紹介したいと思います。

- **IntellijのInvalidate Cashes**
- **キャッシュのディレクトリ削除**

## IntellijのInvalidate Cashes
こちらはIntellijから簡単に行えるキャッシュクリア方法。

File→Invalidate Cashesを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/6bd07962-7c06-bbb4-32da-ccf437ec3e94.png">　

キャッシュをクリアする項目を選択してから、IDEをRestart。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644766/169debc8-6cb5-be63-f0d3-0f9ff47c0ab5.png">

## キャッシュのディレクトリ削除
**IntellijのInvalidate Cashesよりもクリアされる項目が多いです。**

Gradleのキャッシュは以下ディレクトリに作成されています。
```
~/.gradle/caches/
```
このディレクトリごと削除してしませばGradleのキャッシュはすべてクリアされます。

```
$ rm -rf ~/.gradle/caches/
```

こちらはIntellijのInvalidate Cashesに比べて**時間が掛かる**ので注意してください。

## さいごに
Gradleのキャッシュクリアでお困りのときは一度試してみるといいかもしれません！
【Python】ナップサック問題

# 作るもの
再帰を使用してナップサック問題を解決する関数。内部関数 dfs は、現在のアイテムを選ぶか選ばないかを選択肢としながら、可能な組み合わせを試すことで最適解を探索する。関数 knapsackProblem は、最初に dfs を初期値で呼び出してナップサック問題を解決し、最終的な結果を返す。

※ ナップサック問題（Knapsack Problem）とは？
最適化問題の一つであり、与えられた一定の容量を持つナップサック（背負い袋）に、異なるアイテムの集合を入れていくことで、アイテムの価値の合計を最大化する問題。

# 実装
```python:knapsack_problem.py
from typing import List, Tuple

def knapsackProblem(
    items: List[Tuple[int, int]], capacity: int
) -> Tuple[int, List[int]]:
    # ナップサック問題を再帰的に解く関数
    def dfs(
        i: int, capacity: int, currValue: int, indices: List[int]
    ) -> Tuple[int, List[int]]:
        # ベースケース: アイテムのインデックスが最大値を超えたり、容量が0以下の場合
        if i >= len(items) or capacity <= 0:
            return currValue, indices  # 現在の価値と選ばれたアイテムの組み合わせを返す

        # 現在のアイテムの価値と重さを取得
        value = items[i][0]
        weight = items[i][1]

        # 現在のアイテムを選ばない場合の再帰呼び出し
        exclude = dfs(i + 1, capacity, currValue, indices)

        # 現在のアイテムを選ぶ場合の条件判定
        if capacity - weight >= 0:
            # 現在のアイテムを選んだ場合の再帰呼び出し
            include = dfs(i + 1, capacity - weight, currValue + value, indices + [i])

            # 選ぶ場合と選ばない場合の価値を比較し、高い方を選ぶ
            if include[0] >= exclude[0]:
                return include[0], include[1]
            return exclude[0], exclude[1]
        else:
            # 容量が足りない場合は、アイテムを選ばないで次のステップへ進む
            return exclude[0], exclude[1]

    # dfs関数を初期値で呼び出して、ナップサック問題を解く
    return dfs(0, capacity, 0, [])

# テスト
if __name__ == "__main__":
    capacity = 12
    items = [[1, 2], [4, 3], [5, 6], [6, 7]]
    print(knapsackProblem(items, capacity))

```

# 参考
https://www.algoexpert.io