OmniAICreator/Qiita-1.07M huggingface dataset:
LEARN REACT のコードを TypeScript で学習できる環境を作ってみた

# はじめに
React 公式ドキュメント にある、「チュートリアル：三目並べ」や REACT を学ぶ 以下の項目「UI の記述」などのコードを、TypeScript で実行できる環境を作ってみました。

せっかく学習するなら TypeScript で学習したいな〜と思った自分自身のニーズを実現したものになります。

もし、同じニーズの方がいましたら、ぜひ！使ってみてください☆

# 使い方
1\. 下記ページからコードを `Use this template > Create a new repository` で自分の Repository に保存する or `Code > Download ZIP` で PC にダウンロードする

https://github.com/b-yuko/LearnReact-TypeScript

　<img width="740" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/4d195c26-0e90-a4fb-2632-a6fef3636adf.png">

　<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/3808a95d-5ba0-2970-63b7-516f62ad5663.png">

2\. VSCode などで開く

3\. package.json と同じ階層で `npm i` を実行する

4\. `npm run dev` を実行して、Top ページを開く

　<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/e3dc199d-b16a-b61d-d990-2fc0fbc80a78.png">

5\. Top ページから学習したいページを開く

6\. `src > component` から学習したい項目のファイルを開く

7\. 6 で開いたコードを編集しながら、5 で開いたページを確認する


# コードの構成
`src > component`: 各項目に対応するファイルが入っています
`src > css`: 各ファイルに対応した css ファイルが入っています

# おまけ
Prettier を入れているので、`npm run lint` を実行すると、コードがフォーマットされます(設定はデフォルトのままです)。
ESLint は、Vite を入れたときの状態から変更していません。

# 作ってみた感想
考えてることがうまくコードに落とせなくて、色々と試したので勉強になりました。
特に、Topページに戻るリンクを、各学習用ページにはリンクのコードを入れたくないが、Topページ以外の全てのページで表示したい というのを、どうコードで表現すればいいのか試行錯誤しました。chatGPT に早々に聞いてもよかったのだけど、自力で解決したかったので、今ある知識を総動員して書いてみました。
ただ、Topページ以外でリロードしちゃうと戻るリンクやタイトルも消えちゃうので作りが甘いな〜って感じです・・・。
とはいえ、１年前の自分だったらきっと出来なかったので、ちょっとずつできることが増えていることが実感できました☆

# おわりに
学習環境を作って満足してる感が否めない😅
三目並べはコードを育てるタイプだけど、それ以外はコードを育てるタイプじゃなさそうだからあんまり役に立たないかも〜。コードをコピペしてみてエラーになったとこを直すくらいでしか使えないかも？？まぁいっか😋
まだ「UI の記述」の学習途中だけど、今のところほとんど Web ページだけで事足りてる〜。サジェストがでなかったり、所々書いても動作しないよってところがあったり、不便に感じるところはあるから、そのときだけ作った環境にコピペして動作確認してます☆
初学者が遭遇しがちな機械学習モデルの推論時エラーと解決策

機械学習モデルをトレーニングして推論タスクに適用する際、特に異なるコンピューティング環境(トレーニングはGPU、推論はCPU)を利用する場合に推論がうまくいかないことがよくありました(2クラス予測で0と1を交互に推論するなど)。

そのときにやってしまっていたこととその解決策を簡単にまとめます。

# 1. モデルのロードミス
推論エンドポイントをCPU(`ml.m5.large`)で構築したところ、GPU(`g4dn.2xlarge`)でトレーニングしたモデルが期待通りの推論結果を出力しませんでした。

ログを開いたら以下のWarningがでていました。

```
2024-04-25T05:47:04,365 [WARN ] W-9000-model_1.0-stderr MODEL_LOG - Some weights of the model checkpoint at /opt/ml/model/code/pytorch_model.bin were not used when initializing BertModel...
```

Fine-Tuningされた`PredictionModel`で出力された`pytorch_model.bin`ファイルを`BertModel.from_pretrained`を用いて直接ロードしようとしたことで発生しました。

`BertModel.from_pretrained`メソッドは、基本のBERTモデルの構造を前提としているため、`PredictionModel`に追加されたLSTM層や線形層のパラメータが考慮されず、結果的にこれらの重要なパラメータが無視されていました。

```py
pretrained_config = path.join("/opt/ml/model/code/", f"config.json")
pretrained_model = path.join("/opt/ml/model/code/", f"pytorch_model.bin")
config = BertConfig.from_pretrained(pretrained_config)

model = PredictionModel(config=config, pretrained_model=pretrained_model)
```

モデルの全パラメータを含む`fine_tuning_model.pt`から適切に状態をロードすることで問題が解決しました。

```py
model = PredictionModel(config=config, pretrained_model=None)
model_path = path.join("/opt/ml/model/code/", "fine_tuning_model.pt")
model.load_state_dict(torch.load(model_path))
```

# 2. モデルのデバイス割り当て
モデルがデフォルトでCUDAデバイスを使用する設定になっており、CUDA非対応の環境でエラーが発生しました。

```
2024-04-28T06:59:31,905 [INFO ] W-9001-model_1.0-stdout MODEL_LOG - Exception in model fn Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False...
```

CPUのみの環境でモデルをロードする際は、適切なデバイスにモデルを割り当てる必要がありました。

```py
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
```

# 3. 勾配計算の無効化
推論時には、モデルの入力データがテンソルとして与えられる際に、勾配計算を無効にすることが推奨されるとのことでした。

推論結果への影響はない(と思う)のですが、無駄なメモリ使用と計算時間の増加を招くとのことで直しました。

```py
with torch.no_grad():
    model_input = torch.tensor([preprocessed_data.getitem()], dtype=torch.long).to(device)
    model_output = model(model_input)
```
最低限vimを使えるようにする

# コマンド
今回使用するコマンドの概要です
|コマンド|できること|
|--|--|
|mkdir|ディレクトリを作成|
|cd|ディレクトリを移動|
|touch|新規ファイルを作成|
|vim|ファイルの編集|
|cat|ファイルの中身を確認|


```terminal
mkdir docker
cd docker
touch dockerfile

vim dockerfile
```

上記でvimが起動したら、iキーを押下。
ファイルがINSERT状態になるので、何かしらコードやコメントなどを入力

今回はサンプルとして以下のコードをコピペしています。
```text
FROM python:3.9

WORKDIR /app

RUN apt-get update && \
    apt-get upgrade -y
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install --upgrade wheel
RUN pip install gradio
```

編集が終わったら、escキーを押下。
ファイルを保存したい場合は「:wq」を入力する。(普通に終わりたい場合は「:q」)

```terminal
cat dockerfile
```
無事に保存できているかは、catコマンドで確認できます。

# まとめ
1. 覚えておきたいLinuxコマンド

    |コマンド|できること|
    |--|--|
    |mkdir|ディレクトリを作成|
    |cd|ディレクトリを移動|
    |touch|新規ファイルを作成|
    |vim|ファイルの編集|
    |cat|ファイルの中身を確認|
1. vimが起動した後の手順
    1. [i]キーでinsertモードに移る
    1. 好きなテキストをうったら、[esc]キーでinsertモードを終了
    1. [:wp]で保存してvimを終了
Commandパターンについて勉強

## Commandパターンとは？

命令を実行するオブジェクトと命令の内容のオブジェクトを分離するパターン。

## CommandパターンをJSで実装

```jsx
class Invoke {
  execute(command, ...args) {
    return command.execute(this.operations, ...args);
  }
}

class SelectCommand {
  constructor() {
    this.execute = () => {
      console.log("slect");
    };
  }
}

class InsertCommand {
  constructor() {
    this.execute = () => {
      console.log("insert");
    };
  }
}

const invoke = new Invoke();

invoke.execute(new SelectCommand());
invoke.execute(new InsertCommand());
```

## Commandパターンの使いどころ

- 命令をオブジェクトをとして宣言したい際に使用
- 取り消し操作を実装する際

## Commandパターンの利点と欠点

### 利点

- 操作を実行するオブジェクトとメソッドを切り離せる（単一責任の原則）
- 単純なコマンドを組み合わせて複雑なものを作成可能
- コードの詳細を知らなくても、命令を実行可能

### 欠点

- コードが複雑になる(命令が増えるとクラスがいっぱい。)
opencv をtarget arm64  でビルドする

## 概要

opencv をtarget arm64 でビルドして、
それをカスタムのパスにインストールする時のコマンドについてです。


## 方法

opencv/CMakeLists.txtに

```opencv/CMakeLists.txt
set(CMAKE_OSX_ARCHITECTURES "arm64")
```

を追加します。

その後、


```bash
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/opencv-arm64 -DOPENCV_EXTRA_MODULES_PATH=/Users/xxx/Documents/opencv_contrib/modules
```


としてビルドして、

```bash
make install
```

をすると、この場合だと

/opt/opencv-arm64

にインストールされるので、他のライブラリからこちらにリンクしたりインクルードします。



 ちなみにboostは

 ```bash
 (myenv) ➜  boost_1_75_0 sudo ./b2 install --prefix=/opt/boost-arm64 cxxflags="-arch arm64" linkflags="-arch arm64" --with-serialization
 ```
Rails 7.2をちょこっと試す（query and cached ログ編）

# はじめに

rails 7.2beta2 がリリースされたので、ちょっと試してみました。

rails 7.2 では、Rails のログに、実行されたSQLの数が表示されるようになりました。

## ログの確認

Rails 7.1 では、以下のようなログが出力されます。
Rails 7.2 で変るのは、最後の `Completed` の行の `ActiveRecord: 2.2ms` の部分です。

```sh
Started GET "/books" for 172.25.0.1 at 2024-06-09 08:27:47 +0900
Cannot render console from 172.25.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
  ActiveRecord::SchemaMigration Load (0.1ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Processing by BooksController#index as HTML
  Rendering layout layouts/application.html.erb
  Rendering books/index.html.erb within layouts/application
  Book Load (0.3ms)  SELECT "books".* FROM "books"
  ↳ app/views/books/index.html.erb:6
  Rendered books/index.html.erb within layouts/application (Duration: 21.2ms | Allocations: 4137)
  Rendered layout layouts/application.html.erb (Duration: 110.5ms | Allocations: 37526)
Completed 200 OK in 129ms (Views: 111.8ms | ActiveRecord: 2.2ms | Allocations: 47264)
```

## Rails 7.2
では、Rails 7.2 で試してみます。

```sh
rails new sandbox
cd sandbox
rails g scaffold Book title
bin/rails db:create db:migrate
bin/rails s
```

`http://localhost:3000/books` にアクセスすると、以下のようなログが出力されます。

最後の行が `ActiveRecord: 0.1ms (1 query, 0 cached)` となっているのがわかります。

```sh
Started GET "/books" for 172.26.0.1 at 2024-06-09 08:36:38 +0900
Cannot render console from 172.26.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by BooksController#index as HTML
  Rendering layout layouts/application.html.erb
  Rendering books/index.html.erb within layouts/application
  Book Load (0.2ms)  SELECT "books".* FROM "books"
  ↳ app/views/books/index.html.erb:8
  Rendered books/index.html.erb within layouts/application (Duration: 3.5ms | GC: 0.0ms)
  Rendered layout layouts/application.html.erb (Duration: 6.8ms | GC: 0.0ms)
Completed 200 OK in 10ms (Views: 8.0ms | ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms)
```

せっかくなので、コントローラーで複数のクエリを実行するようにしてみます。

```ruby
  def index
    Book.where(title: "foo").first # 追加
    @books = Book.all
  end
```

`http://localhost:3000/books` にアクセスすると、以下のようなログが出力されます。
`2 queries` に変わりました。

```sh
Completed 200 OK in 10ms (Views: 4.4ms | ActiveRecord: 0.2ms (2 queries, 0 cached) | GC: 0.2ms)
```

ついでに、`cache` を増やしてみます。


```ruby
  def index
    Book.where(title: "foo").first
    Book.where(title: "foo").first # 追加。cached が増えるか確認
    @books = Book.all
  end
```

`http://localhost:3000/books` にアクセスすると、以下のようなログが出力されます。
`3 queries, 1 cached` になっているのがわかります。

```sh
Completed 200 OK in 42ms (Views: 24.7ms | ActiveRecord: 1.3ms (3 queries, 1 cached) | GC: 8.6ms)
```

## まとめ

Rails 7.2 では、ログに実行されたSQLの数が表示されるようになりました。
パフォーマンスチューニングの際に、実行されたSQLの数を確認するのに使えそうですね。

## 参考
- [Add queries count to template rendering instrumentation](https://github.com/rails/rails/pull/51457)
PowerShellで画像縮小スクリプト

# 処理内容
$folderPath 配下の全ファイルを再帰的に取得し、下記ルールに従って縮小する
・画像が横長かつ横幅が800px超過の場合、横幅が800pxになるように縮小
・画像が縦長かつ横幅が1200px超過の場合、横幅が1200pxになるように縮小

# ソースコード
```powershell
# アセンブリの読み込み
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# 画像ファイルの縮小処理を実行するフォルダパス
$folderPath = "C:\hoge"

#-----------------------------------------------------------
# 画像ファイルのサイズを変更
#-----------------------------------------------------------

# 画像ファイルの拡張子一覧を配列に格納して取得
$imageExtensions = @("*.jpg", "*.jpeg", "*.png", "*.bmp")

foreach ($extension in $imageExtensions) {
    Get-ChildItem -File -Path $folderPath -Filter $extension -Recurse | ForEach-Object {
        Write-Host $_.FullName

        $image = [System.Drawing.Image]::FromFile($_.FullName)
        try {
            # 画像がタテ長(Portrait)であるかを判別する変数 isPortrait
            $isPortrait = $image.Height -gt $image.Width

            # 画像がタテ長、かつ横幅が800pxより大きい場合
            if ($isPortrait -and $image.Width -gt 800) {
                $ratio = $image.Height / $image.Width
                $newWidth = 800
                $newHeight = [math]::Round($newWidth * $ratio)
            }
            # 画像がヨコ長、かつ横幅が1200pxより大きい場合
            elseif (-not $isPortrait -and $image.Width -gt 1200) {
                $ratio = $image.Height / $image.Width
                $newWidth = 1200
                $newHeight = [math]::Round($newWidth * $ratio)
            }
            #-------------------------------
            # 画像サイズを変更して上書き保存
            #-------------------------------
            $canvas = New-Object System.Drawing.Bitmap($newWidth, $newHeight)
            if($canvas){
                $graphics = [System.Drawing.Graphics]::FromImage($canvas)
                $graphics.DrawImage($image, (New-Object System.Drawing.Rectangle(0, 0, $canvas.Width, $canvas.Height)))
                $image.Dispose()
                # Resizeデータの保存
                $canvas.Save($_.FullName, [System.Drawing.Imaging.ImageFormat]::Jpeg)

                $graphics.Dispose()
                $canvas.Dispose()

            }else{
                echo "変数 canvas が存在しません。"
            }
        }

        finally {
            $image.Dispose()
        }
    }
}
```

# 作成時のメモ
・[System.drawing.Image] の GetThumbnailImage は画質が落ちたので、
　[System.Drawing.Graphics]オブジェクトを使用する方針に変更
Javaで「if文を使った条件分岐」の動作を確認してみた

# 概要

Javaで「if文を使った条件分岐」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/if/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String[] args){
    System.out.println("1から10までの数値で偶数を出力します");

    for (int i = 1 ; i <= 10 ; i++){
      System.out.print(i + " は");

      if (i % 2 == 0){
        System.out.println("偶数です");
      }else{
        System.out.println("奇数です");
      }
    }
  }
}
```

```JSample1_2.java
class JSample1_2{
  public static void main(String[] args){
    int[] point = {75,94,68};
    String[] name = {"鈴木","本田","遠藤"};

    for (int i = 0; i < 3; i++){
      System.out.print(name[i] + "さんは");

      if (point[i] > 90){
        System.out.println("判定Aです");
      }else if (point[i] > 70){
        System.out.println("判定Bです");
      }else{
        System.out.println("判定Cです");
      }
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
1から10までの数値で偶数を出力します
1 は奇数です
2 は偶数です
3 は奇数です
4 は偶数です
5 は奇数です
6 は偶数です
7 は奇数です
8 は偶数です
9 は奇数です
10 は偶数です
```

```
$ javac JSample1_2.java 
$ java JSample1_2 
鈴木さんは判定Bです
本田さんは判定Aです
遠藤さんは判定Cです
```

# まとめ

何かの役に立てばと。
Ubuntu22.04にFletをインストールした話

# fletって何！
fletはflutterをpythonから使うライブラリです。
flutterってJavaScriptの親戚言語のdartで使えるマルチプラッフォーム開発環境です。
それがPythonで使えるなら学習するコストがなくなるのでいいじゃんという話。

# まずはpipでインストール
pip install flet
でインストールできる。

ライブラリとしてimport fletはインポートできるが・・・

# fletの本家サイトに行ってサンプルコードをコピー
本家サイトの
https://flet.dev/docs/
にいってIntroductionを開いてサンプルコードをコピペして実行してみる
実行は

flet run counter.py

で実行できるらしい。

# 実行すると・・・
libmpv.so.1: cannot open shared object file: No such file or directory
と怒られた。

なので apt search libmpv でライブラリを含むパッケージを探すとどうも libmpv-dev　らしかったので

sudo apt install libmpv-dev

でインストール再び実行すると動いた。
ABC357回答メモ

# 0.はじめに
　レート807ともうほぼ茶色状態で臨んだコンテスト。
 C問題がややこしい感じでしたが、D以降もできる気がしなかったので
 時間をかけてなんとかAC。その時点で残り数分で終了。
 まぁ、Cはややこしいだけで回答できていた人は多く
 無事？レート778になり茶色コーダーに逆戻りしました・・・。

# 1.A - Sanitize Hands
　Aにしては複雑な問題。
 リストを先頭から見ていき、
 MからH[i]分マイナスしていき
 Mが0になったら、i+1を表示して終了
 0より小さくなったらiを表示して終了
 最後までMが0にならなかったらNを表示して終了と
 素直に場合分けしました。

　https://atcoder.jp/contests/abc357/submissions/54326008

# 2.B - Uppercase and Lowercase
　Aより簡単なくらいの問題。
 先頭から大文字と小文字の数を数えていき
 多い方に揃えて出力。と、isupper等の
 関数を調べるほうが手間がかかる感じでした。

　https://atcoder.jp/contests/abc357/submissions/54335210

# 3.C - Sierpinski carpet
　頭がこんがらがるタイプの問題。
 スマートにN＝0の時の黒タイルだけ用意して
 Nの分だけ、空白の周りにN-1の時のタイルを配置していく感じに
 したかったですが、ちょっとうまくいかず、N=1の時の
 2次元リストを用意して
 Nが1つ増えるたびに、N-1の2次元表を
 3つ並べる
 1つおいて、空白置いて1つおく
 3つ並べる
 と半ば力技で繰り返しました。
 トライアンドエラーを繰り返し、やっとできたころには
 22時半くらいになってました・・・。

　https://atcoder.jp/contests/abc357/submissions/54372938


以上
Databricksノートブックからクイックにカタログエクスプローラにアクセスできるようになりました

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

[Quickly access Catalog Explorer tables from notebooks](https://docs.databricks.com/en/release-notes/product/2024/june.html#quickly-access-catalog-explorer-tables-from-notebooks)

> ノートブックから容易にカタログエクスプローラのテーブルにアクセスできるようになりました。カラム、権限などの詳細を参照するために、カタログへのリンクを取得するためにノートブックセルのテーブル名の上にホバーします。

![Screenshot 2024-06-09 at 7.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/05eb70f8-20b4-84f4-d500-a20a089c8ac7.png)

**Catalog Explorer**のリンクをクリックすることで、詳細を確認できます。
![Screenshot 2024-06-09 at 7.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/58cd7c2a-0218-f9b6-47d0-74757ea39eed.png)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
エンジニア特化部門の管理職が考えるプログラミング教育　何をしたら実現できるか箇条書きで書き出す

1個目の記事でまず実装して、動かそうと言ったことを書きました。ただ、『そもそも何を実装したら良いか分からない。』と余程自分の作りたいものでもない限りこのような状態になります。
そのため、トレーニングでは簡単な問題を出して実装してもらっています。例えば、数字が並んでいるテキストファイルを読み込んで、それぞれ素数か判定する等。
実現する機能ができたら、次に考えることです。

## 考え方2
* 何をしたら実現できるか箇条書きで書き出す

設計書は、会社で求められない限り書かないのですが、要求/要件で何をしたら実現できるかは、メモ程度でまとめます。
上の例であれば、テキストの入力形式を確認したうえで、下記のようにまとめます。
1.テキストファイルの読込
2.入力データを取り出す
3.素数かどうかを判定する
4.出力する
2-4をデータがある限り繰り返す

その後、実装に落し込んでいく形とします。

箇条書きで記載した各項目は、検索したり、AIに質問したら出てくるでしょう。活用したら良いと考えてます。
ただ、出てくるにサンプルは良し悪しあるので、その点は留意しましょう。そのトピックもいずれ記載します。
【tbls】SQLiteのパス指定ミスでDBドキュメント生成がうまくいかなかった

## はじめに

この記事を書こうと思ったきっかけは、GitLab CI/CDの設定ファイルでSQLファイルから作成したDBファイル（.db）からtblsを使ってDBドキュメントを生成しようとした際に、ドキュメントらしきものは作成されるものの、テーブルが認識されず、正しいドキュメントが生成できなくて時間を費やしてしまったためです。
実行環境はWindowsです。

## .gitlab-ci.ymlに書いた間違ったtblsコマンド

ルートディレクトリにあるDBファイルを参照してドキュメントを生成できるようにしたつもりでしたが、以下のように記述していました。

```sh
tbls doc sqlite:///./path/to/database.db ./output_docs
```

## なぜうまくいかなかったのか

この記述がうまくいかなかった理由は、スキームの後にスラッシュが3つ続く形式は、URI形式において絶対パスを示す一般的な規則だからです。  
このことを知らずに私は相対パスでDBファイルを指定してしまっていました。
エラーにはならなかったものの、絶対パスを期待しているところに相対パスを指定すると意図した通りの動作にならないので注意してください。

## 正しい書き方

#### 相対パスの場合

```sh
tbls doc sqlite:./path/to/database.db ./output_docs
```

#### 絶対パスの場合

```sh
tbls doc sqlite:///absolute/path/to/database.db ./output_docs
```

## まとめ

エンジニア2年目に突入したのに、まだこのようなことでつまずいてしまうとは不甲斐ない限りです。:joy: 
しかし、まだまだ伸び代しかない！同じ境遇の方の参考になれば嬉しいです。
<br>

https://github.com/k1LoW/tbls

https://www.sqlite.org/uri.html
Unity Hubからプロジェクトが起動できない(未解決)

Unity Hubからプロジェクトが起動できない、え？この症状で悩んでるの俺だけ？
問題解決に至っていないが、症状と状況について記録しておく。

・UnityHubのバージョンは3.8.0
・Unity Editorのバージョンは2019.4.2f1
・Unity LisenceはPersonal

## 状況
1. ひさしぶりにPCを起動
1. UnityHubからUnityプロジェクトを起動
1. Unityプロジェクトが起動せず再びUnityHubが開く
1. `C:\Users\ユーザー\AppData\Local\Unity\Editor\Editor.log`にはライセンス認証でこけたようなエラーが吐き出されている(下記)

```
[LicensingClient] ERROR Error 10 while verifying Licensing Client signature (path: 11424, process Id: C:/Program Files/Unity Hub/UnityLicensingClient_V1/Unity.Licensing.Client.exe)
[Licensing::Module] LicensingClient has failed validation
[LicensingClient] ERROR Failed to connect to local IPC
[Licensing::Module] Failed to connect to channel: LicenseClient-User-2019.4.2
[Licensing::Module] Successfully launched the LicensingClient
[Licensing::Module] Successfully connected to LicensingClient on channel: LicenseClient-User-2019.4.2
[Licensing::Module] Successfully launched and connected to LicensingClient
Entitlement-based licensing initiated
[LicensingClient] Licenses Updated successfully in LicensingClient
```

**補足**
1. UnityHubを経由せずUnityを直接起動しようとしてもUnityは起動せずUnityHubが起動する
1. SceneファイルをダブルクリックするとUnityが起動する(現状唯一Unityを起動できる方法)

## 酷似した症例
調べてみると下記サイトのエラー報告が自分に起きた状況と酷似している。
https://www.reddit.com/r/Unity3D/comments/18si4az/bug_unity_licensing_errors_editor_will_not_open/?rdt=64124

Editor.logに吐き出されるエラーログの内容、試してみたこと
その結果何も改善しない点などおよそ100%一致している。

## 調査
・調べたところUnityHubからUnityプロジェクトを起動できないという現象はちらほら報告されている。
・解決したケースもあれば解決しないケースもある。

## 主な解決手段とされているもの
・ライセンス情報のC:\ProgramData\Unity\Unity_lic.ulfを削除し再度アクティベーションする
・UnityHubをアンインストールし、C:\Users\User\AppData\Roaming\UnityHubも削除し再インストールする
・PCを再起動する
・別のライセンスを取得しなおす

など

上記方法を試して解決したケースもあれば、解決していないケースもある。
当方も試せることはある程度試してみたが問題は解決せず。

## まとめ
・UnityHubで新規プロジェクトの作成は可能
・SceneファイルからUnityプロジェクトの起動が可能

上記の方法でかろうじてUnityを使える状態ではあるが根本解決はしていない。
困っている。
リスト操作

Kotlinでよく使用するリスト操作をメモする

```kotlin
val fruitList = mutableListOf("apple", "orange", "banana")
val first = listOf("strawberry", "grape")

// 1つ追加
fruitList.add("lemon")
fruitList
// [apple, orange, banana, peach, cherry, lemon]

// まとめて追加
fruitList.addAll(first)
fruitList
// [apple, orange, banana, peach, cherry, lemon, strawberry, grape

// インデックスを指定して削除
fruitList.removeAt(1)
fruitList
// [apple, banana, peach, cherry, lemon, strawberry, grape]

// 全てのリストをクリア
fruitList.clear()
fruitList
// []
```

```kotlin
val fruitList = mutableListOf("apple", "orange", "banana", "peach", "cherry")

// 配列数を返す
fruitList.size // 5
// 要素を持っているか確認する
fruitList.contains("orange") // true
// 指定したインデックスの要素を取得
fruitList.get(0) // apple
// 配列か空かどうか確認する
fruitList.isEmpty() // false
```

```kotlin
val numberList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
// 特定の条件の要素だけを取得する
numberList.filter { it % 2 == 0 }
// [2, 4, 6, 8]
```




#### 参考
https://qiita.com/kiririnyo/items/aee905225902d096f7c0

https://jp-seemore.com/app/15130/#toc7
2997. Minimum Number of Operations to Make Array XOR Equal to K の解き方メモ

https://leetcode.com/problems/minimum-number-of-operations-to-make-array-xor-equal-to-k/description

# 問題の概要

正の整数kと正の整数が格納された配列numsが与えられる。numsの値をすべてxorした値がkに等しくなるよう、次の処理を繰り返す。

「numsから任意の数字を選択し、任意のビット値を反転させる」

処理の最小回数を求めなさい。

# 解き方メモ

まずはxorの性質を考えます。具体例として、以下の条件を満たす正の整数A、B、C、D、Xがあるとします。

**X = A xor B xor C xor D**

それぞれのiビット目に着目します。

**Xのiビット目(1/0) = Aのiビット目(1/0) xor Bのiビット目(1/0) xor Cのiビット目(1/0) xor Dのiビット目(1/0)**

Xのiビット目が1になる条件、0になる条件をそれぞれ考えてみます

- 1になる条件 : A、B、C、Dのうち、iビット目が1になるものの個数が偶数のとき
- 0になる条件 : A、B、C、Dのうち、iビット目の1になるものの個数が奇数のとき

---

この性質をもとに問題を考えてみます。

numsについて、iビット目が1になるものが偶数個のとき、numsをすべてxorした値のiビット目は1になります。このとき、kのiビット目が1ならば、numsの値に何もする必要はありません。一方、kのiビット目が0ならば、numsの任意の値のiビット目の値を反転させる必要があります (iビット目が1になるものが奇数個になる)

逆もしかりで、iビット目が1になるものが奇数個のとき、numsをすべてxorした値のiビット目が0になるので、kのiビット目が1ならば、numsの任意の値のiビット目の値を反転させる操作を実行する必要があります。

```rust
impl Solution {
    pub fn min_operations(nums: Vec<i32>, k: i32) -> i32 {
        let mut ret = 0;
        for i in 0..25 {
            let count_one = nums.iter().filter(|&&num| (num >> i) & 1 == 1).count();
            let bit = ((k >> i) & 1) as usize;
            if count_one % 2 != bit {
                ret += 1;
            }
        }
        ret
    }
}
```
素数

素数を知りたいか？
yes : 1, no : 0
```c++
#include<iostream>
int main(void) {
	auto Prime = [](int value) {for (int i = 2; i < value; i++) if (value % i == 0) return false; return true; };
	int hoge;
	std::cin >> hoge;
	std::cout << Prime(hoge);
}
```
【MongoDB】aggregateのクエリでmatchのような感じで異なるフィールドでor条件を入れたい

## 概要
aggregateのクエリで、異なるフィールドを対象にor条件をかけたいと思います。
その際、or条件のブロックの中でmatch句が使えないようで、どのように書けば実現できるかのメモ書きです。


## 前提
* 使用したMongoDBのバージョンは`7.0.0`です。

## 対応方針
[MongoDB aggregation framework match OR](https://stackoverflow.com/a/76928622)のstackoverflowの回答にある通り、`$expr`句で値の比較を行うかフィールド名を指定して条件を設定するかになるかなと思います。

## クエリのサンプル
`user_id`フィールドの値が一致するか、`name`フィールドに指定した値が含まれるかで条件を設定したor句は以下の通りです。
クエリの該当の部分だけ記します。


```
{ $match: 
  { $or: [
    { $expr: { $eq: ["$user_id", "test_user_id"] } },
    { name: { $regex: "test_name", $options: "i" } }
  ]}
}
```
ダークモードの特性とトレンド状況を調べてみた

## 注目され始めているダークモード
近年、Webデザインにおいて**ダークモード**が注目を集めています。

https://bootcamp.uxdesign.cc/the-rise-of-dark-mode-a-design-trend-thats-here-to-stay-fdcacc28bd30

ダークモードは暗い背景色と白い文字色で構成されたUIデザインのことです。

![szabo-viktor--5mPsR-ZEg8-unsplash (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902958/ac9352ba-5a92-247f-ebe2-04fb19dce832.jpeg)

ディスプレイに表示される光量が少なくなるので、目に優しく、バッテリー消費を抑えられるなど、多くの利点があります。

iPhoneやWindowsなど主要な端末のOSでは、2019年頃から導入され始めました。

また、ダークモードに対応しているWebサービスには以下のようなものがあります。

* YouTube
* X
* Instagram

このQiitaも、2023年からダークモードを正式に導入されています。

https://blog.qiita.com/release-theme/

ダークモードの特徴について、具体的に見ていきましょう

## ダークモードのメリット
### 目の負担軽減
暗い画面は、明るい画面よりも瞳孔の収縮を抑え、目の疲労を軽減する効果があります。

### バッテリー消費の節減
ダークモードは、バッテリー消費を抑える効果があります。これは、有機ELディスプレイ搭載のデバイスの場合、黒い画面の方が白画面よりも消費電力が低いためです。

#### 米国パデュー大学による研究

2021年8月に発表された米国パデュー大学の研究によると、**有機ELディスプレイ**搭載のスマートフォンで、屋外など明るい場所で、ライトモードからダークモードに切り替えた場合、平均39%～47%　のバッテリー消費を節約できることが示されています。

参考↓

https://gigazine.net/news/20210802-dark-mode-save-phones-battery-life/

## ダークモードのデメリット
### 実装の手間
「文字を白く、背景を黒くする」とだけ聞けば、簡単そうに感じるかもしれませんが、大抵は細かいデザインの微調整が必要です。

例えば以下画像のように、ページ内に黒いアイコンを使用している場合、背景を黒くすることによってアイコンが見えなくなってしまう、もしくは見えにくくなってしまうことがあります。

![design.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902958/fb118460-1f47-e8ee-50fe-0329e9c787b9.jpeg)

これに対応するためには、ダークモード時に表示される画像を出し分けたり、どちらのモードでも見えやすいアイコン色に変更したりなどする必要があります。

こういったデザインのエラーを全ページ確認して修正していくとなると、なかなかに骨が折れる作業になるでしょう。

### デザイン性の悪化
背景色と文字色が変わるわけなので、ページの印象がガラリと変わります。

ダークモードに対応することで、本来意図したデザインと乖離してしまう可能性があります。

例えば、もともと明るい印象のページにしていたのに、ダークモードになると一気にその印象がなくなって、なんかどんよりとした雰囲気のページになってしまった...
これでは本末転倒ですね。

何でもかんでもダークモードに対応すればいいってもんじゃありません。

Webサイトを通してユーザーに提供したいことは何か、その本筋をしっかりと考え、実施の有無を判断するのが重要です。

## 日本のWebサイトにおけるダークモードの対応
このブログを書く上で、ダークモード対応されているWebサイトをリサーチしたのですが、意外とまだダークモード対応されているWebサイトは少ない印象でした。

特に日本のWebサイトでは、海外に比べてダークモードを採用しているWebサイトはまだ多くありません。

これは、文化的な背景や、Webデザインのトレンドの違いが影響しているのではないかと私は考えます。

## まとめ
「ダークモード」が最近のトレンドとは言われていますが、もともとPCは、真っ黒な画面に白文字でコマンドを打ち込んでいくものでした。

GUIの登場によって、画面は色鮮やかになり、その後「スキューモーフィズム」のようなリアルな質感がトレンドになり、そのアンチテーゼとして「フラットデザイン」が提唱されて、一周回って初期CUI時代のような、黒に白い文字が光るダークテーマがトレンドになっているのは、流行のサイクル性を感じて面白いなと思いました。

次回はダークモードを実装する方法を紹介していきます。
ABC357 D


https://atcoder.jp/contests/abc357

これのD問題です

https://atcoder.jp/contests/abc357/tasks/abc357_d

Nが10の18乗まであるため、2倍ずつ積み重ねることを考える。
2つの配列を作る

$Q[i]=N$を$2^i$個積み重ね
$P[i]=10^{Nの桁数*2^i}$
もちろん mod $998244353$ で計算する。

これを$2^i$が$N$を超えないところまでappend。

そして$N$の2進法表示で$2^i$の位が$1$の時に
$N$の$2^i$個積み重ねたものを連結して mod を取ればそれが答えとなる

```
#(ヘッダは省略)

MOD = 998244353

N=int(input())
	
def main():
	kt = len(str(N))
	#print(kt)
	Q = []
	P = [1]
	i = 1
	M = N
	while i <= N:
		if i == 1:
			Q.append(N % MOD)
			P.append(10**kt)
		else:	
			Q.append((Q[-1]+P[-1]*Q[-1])%MOD)
			P.append((P[-1]**2)%MOD)
		i *= 2
	#print(Q)
	#print(P)
		
	M = N
	j = 0
	ans = 0
	while M > 0:
		if M % 2 == 1:
			ans = (ans * P[j+1] + Q[j]) % MOD
		M //= 2
		j += 1
	print(ans)
				
			
if __name__ == "__main__":
	main()
```
OSSに初めてコントリビュートしてみた

# なぜコントリビュートしようと思ったか

- 元々OSSへコントリビュートしてみたかった
- 次の職場でCakePHPを利用するため、チュートリアルを一通りやっている中でドキュメントをもっとこうした方が良いのでは？と思ったから

# コントリビュートしたOSS

## リポジトリ
https://github.com/cakephp/docs

## PR
https://github.com/cakephp/docs/pull/7865

# コントリビュートまでの流れ

1. OSSのコントリビュート方法を確認する
    - https://book.cakephp.org/5/ja/contributing/documentation.html
2. リポジトリをForkする
3. ```5.x```ブランチから修正用のブランチを作成する
4. PRを作成する
5. Reviewerのチェック後にマージされる

# その他

- 今回はドキュメントに対するコミットでしたが、いずれはCakePHP本体にもコミットしていきたいなと考えている
- OSSにコミットしてからLaprasのスコアがだいぶ伸びていた
    - https://lapras.com/public/IZAVKJ2
python


open GPU

```python
torch.cuda.is_available() False

pip install torch torchvision -f https://download.pytorch.org/whl/torch_stable.html # GPU

import torch 
torch.__version__
```

----

import local source

``` setup.py

from distutils.core import setup

setup(
    name="query",
    version="0.1.0",
    description="",
    author="",
    packages=["query"],
    package_dir={
        "query": "../qqbot-search-ai",
    },
    package_data={
        "query": [
            "sub_dir/query.py",
        ]
    },
)
```

``` requirements.txt
-e .
```

```
pip install -r requirements.txt
```
fvmでFlutterをインストールする

## この記事の内容

- fvm で Flutter をインストールしてみました。asdf からインストールする方法や Flutter を直接インストールする方法もあるのですが今回は fvm を使用します

## fvm とは

- fvm とは Flutter のバージョン管理ツールです。 fvm を使用することで Flutter のバージョンの切り替えが容易にできるようになります。Python で言う pyenv、Node.jsで言う nodenv みたいなやつの Flutter 版です
- [Githubのリポジトリ](https://github.com/leoafarias/fvm)
- [fvm のドキュメント](https://fvm.app/)

## fvm をインストール
- curl でやる方法と brew からやる方法の２通りあるみたいです
- 自分はホームディレクトリで curl でインストールしました
```
curl -fsSL https://fvm.app/install.sh | bash
```
- fvm コマンドが実行できることと、ホームディレクトリに fvm というディレクトリができていることが確認できました
```
which fvm
/usr/local/bin/fvm

ls -ld fvm
drwxr-xr-x 5 test test 160  6  9 01:03 fvm
```

## fvm から Flutter をインストール

- fvm の help コマンドを打ってみると releases と言うのがありました。こちらがインストール可能な Flutter のバージョンリスト、 install が Flutter 自体のインストール、 global でグローバル設定っぽいのでこちらを実行していきます

```
fvm --help
Flutter Version Management: A cli to manage Flutter SDK versions.

Usage: fvm <command> [arguments]

Global options:
-h, --help       Print this usage information.
    --verbose    Print verbose output.
-v, --version    Print the current version.

Available commands:
  api        JSON API for FVM data
  config     Set global configuration settings for FVM
  dart       Proxies Dart Commands
  destroy    Destroy FVM cache by deleting FVM directory
  doctor     Shows information about environment, and project configuration.
  exec       Executes scripts with the configured Flutter SDK
  flutter    Proxies Flutter Commands
  global     Sets Flutter SDK Version as a global
  install    Installs Flutter SDK Version
  list       Lists installed Flutter SDK Versions
  releases   View all Flutter SDK releases available for install. 
  remove     Removes Flutter SDK Version
  spawn      Spawns a command on a Flutter version
  use        Sets Flutter SDK Version you would like to use in a project

Run "fvm help <command>" for more information about a command.
```

```
fvm releases
(中略)
Channel:
┌─────────┬─────────┬──────────────┐
│ Channel │ Version │ Release Date │
├─────────┼─────────┼──────────────┤
│ stable  │ 3.22.2  │ Jun 6, 2024  │
└─────────┴─────────┴──────────────┘
```

- 現時点では 3.22.2 が最新っぽいのでそちらをインストールします

```
fvm install 3.22.2
```

- すでにグローバルになっていたようでした
```
fvm global 3.22.2
Flutter SDK: SDK Version : 3.22.2 is now global
```

## Flutter コマンドを環境変数に登録

- 最後に Flutter コマンドを実行できるように設定します。自分はホームディレクトリ配下に Flutter をインストールしたので`fvm/default/bin/`をPATHに登録します
```
export PATH=$PATH:/Users/test/fvm/default/bin/
```

- 最後に Flutter コマンドが実行できれば完了です。

```
flutter --version
Flutter 3.22.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 761747bfc5 (3 days ago) • 2024-06-05 22:15:13 +0200
Engine • revision edd8546116
Tools • Dart 3.4.3 • DevTools 2.34.3
```

- それではさようなら
Rails のアップデートで、 new_framework_defaults_x_x.rb をコメントインし忘れてないですか？

tldr; Railsのアップデートするとき、`config.load_defaults x.x` に対応した `new_framework_defaults_y_y.rb` に書かれた内容をコメントインして有効にしないと意味ないので注意。

# たとえば Rails 7.0 -> 7.1 にアップデートするとき

```ruby:config/application.rb
config.load_defaults 7.0
```

して、7.1の新設定は `new_framework_defaults_7_1.rb` でひとつずつコメントインしていく、というのが[オフィシャルの手順](https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#configure-framework-defaults)だが、このコメントインしていく作業を忘れると、そのrailsは 7.0 のデフォルト設定で動いている。 7.1 の主にBREAKINGな設定は有効になっていない

これを忘れたまま 7.2 にアップデートしようとして `config.load_defaults 7.1` すると、そのときに初めて 7.1 の挙動が現れるので大変なことになる。


# `load_defaults` の実装を読んでみる


`config.load_defaults` の実装はシンプルで、 `new_framework_defaults_x_x.rb` に記載されてる内容をそのまま有効にするものとなっている。

rails 7.1 の load_defaults の実装
[railities/lib/rails/application/configuration.rb](https://github.com/rails/rails/blob/19eebf6d33dd15a0172e3ed2481bec57a89a2404/railties/lib/rails/application/configuration.rb#L92-L337)

```ruby
def load_defaults(target_version)
    case target_version.to_s
    # 省略
    when "7.1"
      load_defaults "7.0"
    
      self.add_autoload_paths_to_load_path = false
      self.precompile_filter_parameters = true
      self.dom_testing_default_html_version = defined?(Nokogiri::HTML5) ? :html5 : :html4
    
      if Rails.env.local?
        self.log_file_size = 100 * 1024 * 1024
      end
      # ...
```



[new_framework_defaults_7_1.rb.tt](https://github.com/rails/rails/blob/19eebf6d33dd15a0172e3ed2481bec57a89a2404/railties/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt) と比べてみると同じだとわかる
計測器と符号化についての考察

## 想定する読者
高い計測器を買ってはみたものの、固定資産タグデータ等の著作権管理等で困っているエンジニアは多いと思う。本記事はそういったエンジニア達に向けての記事である。

## 準備

ところで特定のデータに限っては著作権を主張しないと<a href="https://www.post.japanpost.jp/zipcode/dl/jigyosyo/readme.html">述べている</a>組織が存在する。

データベースは著作物ではないし、データに創作性があるかどうかの判断を行える機関は限られているものだが、事前にトラブルを避けることは素晴らしいし、7桁の番号で居所を特定できるからといって揉め事が起きるとは到底考えづらい。

なので今般、リンクを貼ることによって制約が課されることはないと解しリンクを貼った。

但しこの組織以外の第三者（例えば当該頁の読者）が主張等をするのかもしれないことには注意すべきかもしれない。しかし私個人が事前に判断を行えるものではない。

## 符号の規則例

ここで一般に開始符号（見かけ上2桁の正の整数記号）で始まり終止符号（見かけ上2桁の正の整数記号）で終わる符号について考える。

料金後納等一定の条件下で割引の効く<a href="https://www.post.japanpost.jp/zipcode/zipmanual/p11.html">バーコード</a>を作成してもこれには当たらない点には留意すべきである。

以上とは別に1桁あたり3つの整数で表された7桁の正の整数を考える。

また、7桁ではなく丁度20桁となるように、その後ろに14を示すわけではない3桁で表された記号を13桁付け加えてもよいかもしれないし、21桁となるように合計数を整えるようなチェックサムをもう1桁付け加えてもいいかもしれない。


このときの見かけ上の桁数は合計で`21*3+2*2`となるが、フォント等の制約から多くの場合に於いて23桁に見えると思われる。

## 符号化に向けて

チェックサムの仕様等の一部コードを定めれば可能かもしれませんが、どうなのでしょう。
ChatGPT-4oで模擬問題を作らせてみた~データサイエンティスト検定の勉強法~

第7回データサイエンティスト検定（2024年6月実施）を受けてみました。問題集を1冊だけやって、足りないところをChatGPT(GPT-4o)に問題を作ってもらって苦手を克服できたので、備忘録としてその方法を書いておきます。誰かの参考になれば嬉しいです。


# 勉強方法
まずは、無料で受けられる以下の講座を受けました。
【受講料無料】DS検定リテラシーレベル対応　データサイエンティスト基礎講座
https://www.skillupai.com/ds/

続いて、自分の理解度を確認するため、問題集を購入してやりました。
徹底攻略データサイエンティスト検定問題集 リテラシーレベル 対応
https://book.impress.co.jp/books/1121101053

G検定を受けた時に勉強し、機械学習の知識は-あったので、この段階で、
だいたい8割ぐらい問題が解けていました。
唯一解けなかったのが、SQLに関する問題。
SQL書いたことないので、全くわからない(泣)

# ChatGPT(GPT-4o)にSQLの問題を作ってもらった
問題集だけでは足りないので、とにかく問題数をこなそうと、賢くなったChatGPT(GPT-4o,有料版)に問題を作ってもらいました。
問題集のSQLに関する問題を画像にし、読み込ませて、まずは以下のプロンプトを

>添付はSQLに関するデータサイエンティスト検定の問題を示しています。添付のようなSQLクエリの多岐選択方式の問題を20問出力して。様々なコマンドを問題に含めて

得られた回答はこんな感じ。

# ChatGPT(GPT-4o)の回答

以下に、さまざまなSQLコマンドを含む多岐選択方式の問題を20問作成しました。

問題 1
次のSQLを用いて、employeeというテーブルを作成し、さらにcodeとnameというカラムを定義し、各レコードに値を代入することを考える。
```
(ア) TABLE employee (
code SERIAL NOT NULL,
name VARCHAR(255)
);
(イ) INTO employee (code, name)
VALUES
(0, 'Taro'),
(1, 'Ken'),
(2, 'Hanako'),
(3, 'Yui'),
(4, 'Yuki');
```
空欄ア、イに当てはまる字句の組み合わせとして適切なものを選べ。

A. (ア) CREATE (イ) INSERT
B. (ア) MAKE (イ) INSERT
C. (ア) CREATE (イ) JOIN
D. (ア) MAKE (イ) JOIN

# 改良
画像から、ちゃんと問題を読み取って、様々なコマンドの問題を20問生成してくれました！すごい！！
一つ問題があって、なぜか正解がすべてAになっている。
おそらく、例として与えた画像の問題の正解がAだったから、のようです。

そこで以下のプロンプト。
>さらにもう少し難しい問題を20問出題して。正解はできるだけA～Dにまんべんなく出現するように留意して

これで、正解がA～Dにまんべんなく出現するようになりました。

# ChatGPT(GPT-4o)にチェックリスト対応の問題を作ってもらった

続いて実施したのが、スキルチェックリストが漏れなく理解できているかどうかを確認するための問題を作ってもらうこと。

私が受験した第7回から「データサイエンティスト スキルチェックリストver.5」に基づき、検定範囲を更新する予定とのことだったのですが、購入した問題集はver.4までしか対応していなかったのです。

まず、以下より、リストがダウンロードできるので、ダウンロードしました。
スキルチェックリスト ver.5：https://www.datascientist.or.jp/common/docs/skillcheck_ver5.00_simple.xlsx
そして、検定範囲の「見習いレベル★」のマークのついているチェック項目だけフィルターをかけて・・・

>データサイエンティスト検定におけるデータサイエンス力のスキルは以下が定義されています。このスキルがあるかどうかを判断できるような多肢選択式の問題を40問出題して。

得られた回答はこんな感じ。

# ChatGPT(GPT-4o)の回答(生成AIに関する問題)
```
大規模言語モデル（LLM）でHallucinationが起こる理由の一つとして、学習に使われているデータの偏りが挙げられます。この偏りによって生じる問題点を説明してください。
A. モデルの学習が遅くなる
B. モデルの性能が向上する
C. 生成されるテキストが事実と異なる可能性がある
D. モデルの学習が不安定になる

生成AIを利用する際に、出力結果の多様性を調整するために利用されるAPIパラメーターとは何ですか？
A. Precision
B. Recall
C. Temperature
D. F1 score

データ分析やAIのモデリングにおいて、不均衡なデータセットを扱う場合に発生する問題を何と呼びますか？
A. データの偏り
B. データのスケーリング
C. データの正規化
D. データの欠損

生成AIにおいて、入力されたテキストに基づいて文を生成する際に、その文の生成確率を調整するために使われる技術は何ですか？
A. Attention mechanism
B. Beam search
C. Tokenization
D. Beam width

```
これを繰り返して、分かりにくかった内容についてさらにChatGPTに聞いて深堀することを繰り返して知識を定着させました。費用をかけずに効率的に勉強できたと思います。

# 結果
結果は、総合スコア88%でした。
（データサイエンス分野は93.4%、データエンジニアリング分野は85.7%)
問題に誤字や誤記が何か所かあったのと、別の問題にヒントや回答が含まれている問題がいくつかあったのが気になりました💦
問題の質、低い？
Next.js14を始める時の注意事項（最新版）

next.jsでインストール方法はさまざまあるが、時期によって違うため最新版App router
を使うインストール方法を備忘録として残しておく。

```
$ npx create-next-app
```

```
create-next-app@14.1.2
Ok to proceed? (y) 
✔ What is your project named? … todo-app #好きなプロジェクトを入れる
✔ Would you like to use TypeScript? … No / Yes #Yesを選択。
✔ Would you like to use ESLint? … No / Yes　#Yesを選択。
✔ Would you like to use Tailwind CSS? … No / Yes #Yesを選択。
✔ Would you like to use `src/` directory? … No / Yes #Noを選択。
✔ Would you like to use App Router? (recommended) … No / Yes　#Yesを選択。
✔ Would you like to customize the default import alias (@/*)? … No / Yes　#Yesを選択
```

この後なんだけど結構時間がかかる。
最初止まってしまったのかと思いました......
下記がでればOK!

```
133 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Success! Created my-app 
```

後は作成したプロジェクトに入り
```
npm run dev
```

で初期画面が出ます。
Synology DS218play の動作が不安定にならない範囲でコンテナを利用する。

## DS218play のスペックは以下の通り

- CPU: 1.4GHz クアッドコア（Realtek RTD1296）
- メモリ: DDR4 1GB

https://www.ask-corp.jp/products/synology/home/diskstation-ds218play.html

## 以下のアプリの組み合わせであれば、全て同時に稼働させてもギリギリ不安定にならずに動作した。

- [Portainer CE](https://docs.portainer.io/start/install-ce/server/docker/linux) (→ Docker コンテナの起動や監視を GUI で行えるようにしてくれる、超絶便利なツールです。)
- [Portainer Agent](https://docs.portainer.io/admin/environments/add/docker/agent) (→ Portainer の機能を他の Portainer デバイスから使えるようにするアプリです。)
- [Dozzle](https://dozzle.dev/guide/getting-started) (→ Docker コンテナの稼働状態やログを超絶見やすく可視化してくれます。)
- [Watchtower](https://containrrr.dev/watchtower/) (→ Docker コンテナのイメージを自動更新してくれるので、Portainer の更新も楽ちんです。)
- [Homepage](https://gethomepage.dev/latest/installation/docker/) (→ とても軽量なダッシュボードアプリです。)
- [MySpeed](https://docs.myspeed.dev/setup/linux/) (→ インターネットの接続速度を測定してくれるので、回線の状態を確認するのに便利です。)
- [Uptime-Kuma](https://uptime.kuma.pet/) (→ ネットワーク機器や Web サービスの死活状態を監視してくれる軽量なツールです。)

👉 ただし上記アプリの Web GUI を同時使用すると、NAS の反応が明らかに遅くなるため、同時使用する Web GUI は 2 つ以下に抑えることをお勧めします。

## 以下のコンテナを利用すると DS218play の反応が明らかに遅くなった。

- [Home Assistant](https://www.home-assistant.io/installation/linux#install-home-assistant-container)
- [Speedtest-Tracker](https://github.com/henrywhitaker3/Speedtest-Tracker)
- [Heimdall](https://heimdall.site/)
- [Dashy](https://dashy.to/docs/quick-start)

## 各コンテナのスクリーンショット

- Portainer CE

![Portainer CE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/4957b834-0539-e63d-72c4-458b8056ddd2.png)

- Dozzle

![Dozzle](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/9127f916-fb36-4dc7-dad8-2f5d5c5f5bd9.png)

- Homepage

![Homepage](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/9ae1becb-e9ca-ccaf-5bd8-8d1a1933acd6.png)

- MySpeed

![MySpeed](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/e4a00ed3-7657-b2e9-6163-24cee34f91ba.png)

- Uptime-Kuma

![Uptime-Kuma](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/29e4a8d7-f3d4-b7e6-add6-1454586d3520.png)
Azure OpenAI で gpt-4o を利用する際に 404 Resourse Not Found が記録される

## 原因
Azure OpenAI で gpt-4o の API バージョンをモデルのバージョン(2024-05-13)と混同していたため。

### 簡易な確認方法

Azure OpenAI のプレイグラウンドのソースコードを表示をクリックすると、API Version がベタ書きされているので、それを利用すれば安全そう。今回の場合は 2024-02-01。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124597/a71f2f32-d382-de08-b50c-ae3e42cea852.png)

### 公式ドキュメントの参照

[Azure OpenAI API プレビューのライフサイクル](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/api-version-deprecation#latest-ga-api-release) を見ると GA になっているバージョンがわかる。いまは 2024-02-01なので、やっぱりプレイグラウンドが正しい。

モデルと API バージョンを混同しないように注意が必要でした。

### その他補足

[The chat completion object](https://platform.openai.com/docs/api-reference/chat/object) を参考にして response の応答から model 値をみると以下のようになった。

```
> response.model
'gpt-4o-2024-05-13'
```

結論、API バージョンとモデルバージョンを混同すると痛い目に合う。

### 蛇足：ブラウザで直接エンドポイントにアクセスしても 404 になる

なお正常にデプロイできていても、エンドポイントに直接ブラウザでアクセスしても 404 になるので、サイトを見ても原因には思い当たらず。API バージョンは常に気を使ったほうがいいのかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124597/cdefeddc-8282-c2e9-dd4c-66201644ff18.png)
vscodeのTypeScript型チェックがどうしても動かない


# はじめに

TypeScript を用いた開発では外せなくなってきている VSCode ですがなぜか型チェックが動かない事象が生じました。
基本的な確認事項を実行したのですが復帰せず困り果てていた末に些細なことで解決しました。過ぎ去った時間への追悼として解決方法を記載します。
↓ この赤の波線が表示されないバグ
![動かない画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/dbe644f7-d987-9399-2357-19a2ba7ef412.png)

# 要約

GitHub Copilot の拡張機能を再インストールすることで解決しました

# 前提

- VSCode 1.90.0
- Mac
- tsc ではエラーになるが VSCode 上ではエラーにならない。

# 詳細

## 1. Restart TS Server

VSCode の TypeScript サーバーを再起動するコマンド。
とりあえず ts check が動かなくなったら試すものです。一日 10 回以上は打っている。

1. VSCode のコマンドパレットを開く(⌘ + Shift + P)
2. `TypeScript: Restart TS Server` を選択

:::note info
ちなみに TS Server が出てこない場合は builtin で入っている拡張機能がアンインストールされている可能性がある
(JavaScript and Typescript)[https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-next]
:::

## 2. Reload Window

その名の通り再起動コマンド

1. VSCode のコマンドパレットを開く(⌘ + Shift + P)
2. `Reload Window` を選択

## 3. VSCode を完全に閉じて再起動

## 4. PC の再起動

## 5. VSCode 自体を再 Install

## 6. setting.json や拡張機能を調整する

使っていない設定を消したり、Typescript が関連していそうな設定をデフォルトに戻していく作業

## 7. GitHub Copilot の拡張機能を再インストールする

ここまできてようやく治る。
なぜ copilot の拡張機能が今回の事象に関係していたかは不明(copilot 自体は問題なく動いていた)。

# まとめ

まとめ
VSCode の TypeScript 型チェックが動かない問題は、GitHub Copilot の拡張機能を再インストールすることで解決しました。他にもいくつかの試すべき手順がありますが、最終的には Copilot の再インストールが必要でした。なぜ Copilot の拡張機能が関係していたのかは不明ですが、困リ果てた時はこの方法を試してみてください。

# 参考文献

- https://stackoverflow.com/questions/57318553/vs-code-not-doing-type-checking-on-typescript-files
クロスバリデーション(交差検証)のモデル保存と精度確認関数

昨日書いた記事のアップグレードで、今度は回帰にも対応した関数を作ってみました。

https://qiita.com/murasaki1994/items/c44561f8dc6132e0190f


# 関数
```Python3
import pandas as pd
from sklearn.metrics import classification_report
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
def closs_val_model(model, x, y, cv=50, cla=True):
    ylist = list(set(y.values.astype("str")))
    models = []
    acc = []
    for i in range(cv):
        x_test = x.loc[int(i*len(x)/cv):int((i+1)*len(x)/cv)]
        y_test = y.loc[int(i*len(x)/cv):int((i+1)*len(x)/cv)]
        x_train = pd.concat([x.loc[0:int((i)*len(x)/cv)], x.loc[int((i+2)*len(x)/cv):]])
        y_train = pd.concat([y.loc[0:int((i)*len(x)/cv)], y.loc[int((i+2)*len(x)/cv):]])
        model = model
        model.fit(x_train, y_train)
        y_pred = model.predict(x_test)
        if cla:
            rep = classification_report(y_test, y_pred, output_dict=True)
            tmp = []
            for i in range(len(ylist)):
                try:
                    tmp.append(rep[str(ylist[i])]["precision"])
                    tmp.append(rep[str(ylist[i])]["recall"])
                    tmp.append(rep[str(ylist[i])]["f1-score"])
                    tmp.append(rep[str(ylist[i])]["support"])
                except:
                    tmp.append(None)
                    tmp.append(None)
                    tmp.append(None)
                    tmp.append(None)
                    print(rep)
            tmp.append(rep["accuracy"])
            acc.append(tmp)
            models.append([model, rep["accuracy"]])
            columns = []
            for i in range(len(ylist)):
                for col in ["precision", "recall", "f1-score", "support"]:
                    columns.append(ylist[i]+"_"+col)
            columns.append("accuracy")
            df_acc = pd.DataFrame(acc)
            df_acc.columns = columns
        else:
            tmp = []
            tmp.append(r2_score(y_test, y_pred))
            tmp.append(mean_absolute_error(y_test, y_pred))
            tmp.append(mean_squared_error(y_test, y_pred))
            tmp.append(mean_squared_error(y_test, y_pred)**0.5)
            acc.append(tmp)
            df_acc = pd.DataFrame(acc)
            df_acc.columns = ["R2", "MAE", "MSE", "RMSE"]
            models.append([model, r2_score(y_test, y_pred)])
    return df_acc, models, df_acc.describe()
```
関数の仕様としてクロスバリデーションは初期値50回で、分類になっています。
回帰を行う場合は関数の「cla」を「False」にすればできます。
## 使用例
```Python3
import pandas as pd
from lightgbm import LGBMRegressor

df = pd.read_csv("boston.csv")
y = df["PRICE"]
x = df.drop("PRICE", axis=1)
model = LGBMRegressor()
df_acc, models, df_dcb = closs_val_model(model, x, y, cv=50, cla=False)
df_dcb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/52241cc1-ede8-1144-9e9a-9480779a71bf.png)
R2でフィッティング具合を見てMAEで誤差を見てみると良いかもしれません。
また、回帰なので分類と違いラベルではなく具体的な値なのでサンプル数も必ずクロスバリデーションの数と同じになります。

# まとめ
これ使い道あるかなあ？
【Next.js + shadcn/ui】border-border クラスが存在しないときの対処方法

## はじめに

Supabase の公式ドキュメントを参考に、Supabase + Next.js のプロジェクトをセットアップしていたところ、 shadcn/ui の導入中にエラーが発生したので、その内容と解決方法を記しておきます。

https://supabase.com/docs/guides/getting-started/quickstarts/nextjs

## 問題

shadcn/ui のセットアップを行うコマンド
```
npx shadcn-ui@latest init
```

を実行した後、以下のようなエラーが出ました。

- app/globals.css

```
Syntax error: The `border-border` class does not exist. If `border-border` is a custom class, make sure it is defined within a `@layer` directive.

> 1 | @tailwind base;
    | ^
  2 | @tailwind components;
  3 | @tailwind utilities;
```

このエラーは、`border-border` という CSS クラスが Tailwind CSS には存在しないことを示しています。

## 解決方法

プロジェクトルートに `tailwind.config.js` ファイルが生成されていないかチェックしてください。


**`.ts` ではなく `.js` です！**

`tailwind.config.js` ファイルがあれば削除しましょう。

https://github.com/shadcn-ui/ui/issues/214

👆 このイシューを見る限り、同様のエラーがかなり発生しているようです。
（詳細な原因は分かりませんが、おそらく eslint によって引き起こされている？）

## 参考

- shadcn/ui リポジトリの issue

https://github.com/shadcn-ui/ui/issues/214

- shadcn/ui 公式ドキュメント（Next.js）

https://ui.shadcn.com/docs/installation/next

- Supabase 公式ドキュメント

https://supabase.com/docs/guides/getting-started/quickstarts/nextjs
課題進捗　続き

お疲れ様です。
前回の課題提出をいたしましたところ、やはり「再提出」を頂戴しましたので、AI先生に質問しながら改善に取り組んでいるところです:cold_sweat:

提出前にエラーが出ていたように、インストラクターの先生曰く、「画像の表示がされていません」とのことでしたので、相対パスの書き方、階層について再度勉強…

![2024-06-08 233342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/61113afe-b46e-cbfc-d22a-b51508fdc0d5.png)
![2024-06-08 220411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/d2d1524d-235c-67e4-f614-3f2624224bc3.png)

階層指定がされていなかったため、画像表示されていないのだろうと思い、書き直してみたところちゃんと表示されました！

../　が上の階層
/　　が下の階層　と…

これもメモに残しておかなければですね:sweat_smile:

上記のように書き直して、本日提出したところ、先生が確認する限りでは「画像が表示されません」とのことでしたので、再再提出を頂戴いたしました…
一体なにが…？
フォルダーの位置なのだろうか？
![スクリーンショット 2024-06-08 220320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/3376cf23-b6b6-32c4-b62e-48da67c0347a.png)


AI先生にコードのスクリーンショットを貼り付けて、相対パスの誤りだろうかと質問し、キャッシュクリアや絶対パスで書いてみて、接続がなされているかなど、いくつか改善点を提案していただき、やってみましたがやはり
img src="/images/sample.jpg" alt="サッカーボールの写真"
のコードでないと画像は表示されず…

いっそのこと、このファイルを削除し、新しく作り直した方がよいのでは…:thinking:

他の課題もあるので、そちらに手をつけつつ、しかしこちらのクリアも目指して課題に着手していきます！
Power Query workout - Table.Group

知っていれば知っているほど、できることが増える。ボタンポチポチにこだわるなら無理って話。

https://learn.microsoft.com/en-us/powerquery-m/table-group

```text:Syntax
Table.Group(
    table as table,
    key as any,
    aggregatedColumns as list,
    optional groupKind as nullable number,
    optional comparer as nullable function
) as table
```
- `key`は *text*, {*text*} どちらも受け入れるので *any*
- `aggregatedColumns`は Table.AddColumn 関数のパラメタ `newColumnName`, `columnGenerator`, `columnType`の *list* で {*nullable list*} も可
- `groupKind`は GroupKind.Global(既定値), GroupKind.Local のいずれか
- `comparer`は`key`列の値を比較する関数

```text:Example
Table.Group(
    SourceTable,
    {"区分名", "商品名"},
    {
        {"Count", each Table.RowCount(_), Int64.Type},
        {"Max", each List.Max([単価]), type nullable number}
    }
)
```
```:Example
let
    Source = Table.FromColumns(
        {
            {1,{1},type number,{1,2},1,{1,2},{1},type number}
        },
        type table [Column1 = any]
    ),
    GroupedRows = Table.Group(
        Source,
        {"Column1"},
        {"RowCount", each Table.RowCount(_), Int64.Type}
    )
in
    GroupedRows
```

# 動作を変更するパラメタ
## groupKind
### GroupKind.Global
- 既定値
- `key`列の値もしくはユニークな値の組み合わせで行をグループ化する(Buffering)
- 次の式は同じ結果になる
```text
Table.Group(
    SourceTable,
    {"Column1","Column2"},
    {}
)
```
```text
Table.Distinct(
    Table.SelectColumns(
        SourceTable,
        {"Column1","Column2"}
    ),
    {"Column1","Column2"}
)
```
### GroupKind.Local
- 先頭行から順に出現する`key`列の値もしくは値の組み合わせで行をグループ化する(Streaming)
- `key`列でソートが保証されているなら使うとよい
```text
let
    Source = Table.FromColumns(
        {{1,3,3,3,2,2,1,1}},
        type table [Column1 = Int64.Type]
    ),
    GroupedTable = Table.Group(
        Source,
        {"Column1"},
        {"RowCount", each Table.RowCount(_), Int64.Type},
        GroupKind.Local
    )
in
    GroupedTable
```
|Column1|RowCount|
|--:|--:|
|1|1|
|3|3|
|2|2|
|1|2|
## comparer
グループ化の基準となる行と現在の行を比較する関数(引数は2つ)
- 戻り値は整数のみ
- 0 : 一致する(基準となる行が維持される)
- 0 以外 : 一致しない(基準となる行が更新される)
- 参照できる列は`key`列のみ

```text
let
    Source = Table.FromColumns(
        {
            {1,3,4,3,2,2,3,1}
        },
        type table [Column1 = Int64.Type]
    ),
    GroupedRows = Table.Group(
        Source,
        {"Column1"},
        {
            "RowCount",
            each Table.RowCount(_),
            Int64.Type
        },
        GroupKind.Local,
        (ReferenceRow, CurrentRow) =>
            Number.From(
                CurrentRow[Column1] < ReferenceRow[Column1]
                or CurrentRow[Column1] - ReferenceRow[Column1] >= 3
            )
    )
in
    GroupedRows
```
|Column1|RowCount|
|--:|--:|
|1|2|
|4|1|
|3|1|
|2|3|
|1|1|

# その他
https://powerbi.connpass.com/

https://www.microsoft.com/en-us/power-platform/products/power-bi

https://www.microsoft.com/en-us/microsoft-fabric
DockerでMongoDB 6.x実行時「requires a CPU with AVX support」と出た際の対処

DockerでMongoDB 6.xを実行時、以下エラーが出て問題解決に時間を要した。備忘かねて対応メモを残しておく。
```
WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!
```
一般的なPCのCPUは通常、AVXをサポートしていると思うので出ないエラーだと思うが、当方がDockerを実行したミニPCはIntel Celeron N5100というものでAVXをサポートしていなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/ec6cf2e6-7a88-e421-fbd9-5a3159ab7cef.png)

AVXをサポートしていないPCの場合、arm64v8指定のmongodbをimage指定することでエラーを出さずに実行できた。
```yaml
services:
  mongodb:
    image: "arm64v8/mongo:6.0.15"
    platform: "linux/arm64/v8"
```
(参考)AVXをサポートするPCの場合は以下記載で問題なし
```yaml
services:
  mongodb:
    image: "mongo:6.0.15"
```
(参考)
https://stackoverflow.com/questions/71450663/can-we-run-avx-required-software-without-having-it
Run Xpenology as a Proxmox VM

Proxmox 上で Synology NAS を ~~使用~~ **試用** する方法を紹介します。

https://www.youtube.com/watch?v=vuj-Mu828-Iｓ

上の動画の英語は聞きやすいと思います。

下の動画は音声無しです。

https://www.youtube.com/watch?v=5yu_gId1f4g

---

https://github.com/AuxXxilium/arc

https://github.com/fbelavenuto/arpl

https://github.com/AuxXxilium/AuxXxilium/wiki

https://github.com/pocopico/tinycore-redpill