OmniAICreator/Qiita-1.07M huggingface dataset:
Polarsの列削除（drop vs exclude）

Polarsで特定の列を削除するには、次のように`drop()`と`exclude()`が使えます。

```python
import polars as pl
from polars.testing import assert_frame_equal

df = pl.DataFrame({"A": [1], "B": [2], "C": [3]})

# 同じ結果になることを確認
assert_frame_equal(
    df.drop("C"),
    df.select(pl.exclude("C")),
)
```

最初、`select()`を使って列を削除することに違和感を覚えました。
これは、`exclude()`を「削除」と考えるから違和感が生じたのだと思います。

実際には、`exclude()`は「指定列以外の列」です。指定列以外の列を選択することで、指定した列が取り除かれることになります。

`drop()`は列を削除することしかできませんが、`exclude()`はエクスプレッションなので続けて加工ができます。
つまり、次のように使い分けるとよさそうです。

* 削除だけしたい場合：`drop()`
* 残りの列を加工する場合：`exclude()`

以上
時間効率UP：「ファイル名を指定して実行」で設定画面に即アクセスできるWindowsコマンド14選

## はじめに
仕事ではWindows PCを使っており、効率よく設定画面にアクセスすることが重要です。

私も以前、ヘルプデスク業務でPCのキッティングをしている際に、この「ファイル名を指定して実行」コマンドの便利さを実感しました。

:::note warn
**初心者の頃は設定を探すだけで時間がかかっていましたが、このコマンドを使いこなすことで、各種設定画面に素早くたどり着けるようになり、作業効率が大幅にアップしました。**
:::

本記事では、備忘録含めてこの時短テクニックを活用できるよう、コマンドの活用方法をご紹介します。

## まず、エンジニアは「時間」が命
エンジニアにとって、時間は最も貴重なリソースです。

多忙なスケジュールの中で、少しでも効率を上げることが求められます。

設定画面へのアクセスや日常のタスクを素早く行えることは、**すべての作業のベーススキルだと考えています。**

:::note
以下の記事も時間効率を上げる内容の記事になりますので、興味のある方は参考にしてみてください。
:::

https://qiita.com/free-honda/items/e58b6750dba27107889f

## ファイル名を指定して実行とは
「ファイル名を指定して実行」は、Windowsの設定画面やツールを直接開くためのショートカット機能です。

![スクリーンショット 2024-11-05 22.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c912c057-3f60-7383-74e2-6555b540ba09.png)


検索やクリックを省略して、設定画面に一発でアクセスできるため、日常的に使うと大幅に時間が節約できます。

:::note
以下に、実務で役立つ基本的な設定関連コマンドを紹介します。
:::

## 実務でよく使う基本的な設定関連コマンド
### システム関連

- ``sysdm.cpl``：システムのプロパティを表示し、コンピューター名やシステムの保護設定を確認・変更する

- ``compmgmt.msc``：コンピューターの管理画面にアクセスし、ディスク管理やイベントビューア、サービス管理ができる

- ``winver``：Windowsのバージョン情報とビルド番号を確認する

### ネットワーク設定
- ``ncpa.cpl``：ネットワーク接続一覧を表示し、接続の状態を確認・変更する

- ``firewall.cpl``：Windowsファイアウォールの設定画面を開き、セキュリティポリシーを調整する

- ``inetcpl.cpl``：インターネットオプションを開き、ブラウザの設定やプライバシー、セキュリティオプションを変更する

### デバイスとドライバー管理
- ``devmgmt.msc``：デバイスマネージャーを開き、デバイスやドライバーの状態を確認・管理する

### レジストリ関連
- ``regedit``：レジストリエディターを開き、Windowsの詳細設定やカスタマイズを行う

### システム構成
- ``msconfig``：システム構成画面を開き、スタートアップやブートオプション、サービス設定を行う

- ``services.msc``：サービス一覧を表示し、各サービスの状態を確認・管理する

- ``gpedit.msc``：ローカルグループポリシーエディター（Pro版以上）を開き、システムやユーザーに適用するポリシーを管理する

### その他便利なコマンド
- ``cmd``：コマンドプロンプトを開き、ファイル操作やシステム操作ができる

- ``powershell``：PowerShellを開き、高度なシステム管理やスクリプト実行が可能

- ``notepad``：メモ帳を開き、テキスト編集に利用する

## まとめ
「ファイル名を指定して実行」コマンドを活用することで、Windowsの設定にすばやくアクセスでき、無駄な時間を減らせます。

:::note warn
**日常的に使うコマンドを覚えておけば、設定や管理業務がスムーズになり、結果的に仕事の効率が向上します。**
:::

効率よく仕事を進めたいエンジニアにとって、これらのコマンドはぜひ使ってみてください！

## 参考文献

https://qiita.com/sta/items/4b70e6b130a1033dc2c5

https://qiita.com/youtoy/items/c840025d7d9a137fbe51
sailで作成したlaravel＋React＋Inertiaのプロジェクトをデプロイする②

## はじめに
2部の記事になります。
前の記事はこちら。
https://qiita.com/sota_sota/items/7a286a21e6d4261c20e5

そして
、、、、ここから本題ですｗ（2部なのに）

## sailをサーバーで立ちあげる
　
sailを使うにあたってvendorフォルダが必要になります。
そしてvendorフォルダを作成するのにcomposerが必要になります。
　
まずはcomposerが入っているか確認（入っていなければ2行目も）
```
composer -v
apt install composer (なければ)
```
　
composerのインストールができたら以下のコマンドでvendorフォルダを作成する。

```
compose install 
```
　
composer installがエラーになってしまう場合、２つチェックしてください。
まずconposerが最新ではない場合、最新化させる
```
composer update
```
　
もう一つはcomposer updateでもエラーになるはずですが
kelledと最後にでて途中で処理が中断されてしまってる場合。
```
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo mkswap /var/swap
sudo swapon /var/swap
```
↑この3つのコマンドは、Linuxサーバーにスワップ領域（仮想メモリ領域）を作成・設定するためのものです。
スワップ領域は、物理メモリが不足した際にディスク領域を一時的なメモリとして使用する機能
　

#### これをやってもkelledと出てしまう場合はcomposerを諦め↓

:::note alert
最終手段!!!
vendorフォルダごとpushしてサーバーでpullする。
（ローカルで作ったvendor使用する。)
:::

自分もこれで試しましたが、うまく稼働できました。
プロジェクト直下にある.gitignoreファイルの記述でvendorをコメントアウトする。
こうすることでpushの対象になるのでこのままpushし、サーバー内でpullする。

#### 最後に念願のsailコマンド
※migrateしないと初期画面エラー出るのでついでに
```
./vendor/bin/sail up -d　           コンテナ立ち上げ
./vendor/bin/sail artisan migrate　 テーブル作成
```

さくらのＶＰＳの基本情報のIPv４をコピーしてＵＲＬでアクセス！
画面が出る！はず！ｗ 
URLの場所　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/e0db2c20-f0fe-e98b-9e88-7bd9b5b3fbbe.png)


   　
  
permisionのエラーが出る際には
```
chmod +x ./vendor/bin/sail
chmod +x ./vendor/laravel/sail/bin/sail
```
　
## フロント側のpackerge.jsonでインストール

:::note warn
※reactやvueなどフロントのFWを使っていなければ必要ありません。
:::


　
まずnpmが必要になるのでインストールします
```
sudo apt install nodejs
sudo apt install npm
```
インストールが終わり、
プロジェクトの直下にpackerge.jsonがあるかを確認したら

```
npm -v (npmがインストールされているか確認）
npm install
```

多分kelledで止まります。
これはcomposerの方でも使用コマンド記載してますがこちらにも載せます。
```
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo mkswap /var/swap
sudo swapon /var/swap
```

これでインストールが完了したら
```
npm run build 
```


やっとsailで作ったプロジェクトデプロイできた！
お疲れ様でした。
トランプの素材を使いたいときに便利なリポジトリ

トランプを用いたアプリを作るときに便利だったリポジトリ↓

https://github.com/hayeah/playing-cards-assets



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/039fa69c-6161-ab7d-b099-9ce23bacc4dd.png)

このようにジョーカー含む54枚のトランプの素材が提供されている
嬉しいことにPNGのみならずSVGでも提供されている

![back.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/fd851ad8-b294-1318-213d-5ebb2321a29c.png)

カードの裏面もある丁寧さ
絵柄などのピクチャカードは80KBくらいで他の数字カードは10KB程度


マージされていないがプルリクで画像サイズを小さくした版も提供されている
https://github.com/hayeah/playing-cards-assets/pull/4
Nginxでリバースプロキシを構築する方法

## はじめに
リバースプロキシとは、クライアントからのリクエストを受け取り、内部のサーバーに転送する役割を持つサーバーのことです。Nginxは、高速で軽量なWebサーバーであり、リバースプロキシとして非常に人気があります。このガイドでは、Nginxを使用してリバースプロキシを構築する手順を解説します。

## 前提条件
- 基本的なLinuxコマンドの理解
- Nginxの設定ファイルの編集にアクセスできる権限
- Ubuntuであること
## Nginxのインストール
まず、Nginxをインストールします。以下のコマンドを実行してください。
```bash
sudo apt update
sudo apt install nginx
```
## Nginxの設定ファイルを編集する
Nginxの設定ファイルは通常、`/etc/nginx/sites-available/*`にあります。設定ファイルを開いて、リバースプロキシの設定を追加します。
```bash
sudo vi /etc/nginx/sites-available/<好き名前>
```
### 基本的なリバースプロキシ設定
以下のように設定を追加します。この例では、Nginxが受け取ったリクエストを`http://localhost:3000`に転送します。
```
server {
    server_name <自分のドメイン>;

    location / {
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:3000;
    }
}
```

### 設定ファイルを保存して終了
設定を終えたら、ファイルを保存してエディタを終了します。
### sites-enabledへのシンボリックリンクを作成
設定が完了したら、`sites-enabled`ディレクトリにシンボリックリンクを作成します。
```
sudo ln -s /etc/nginx/sites-available/<サービス名> /etc/nginx/sites-enabled/
```
## Nginxの設定をテスト
設定ファイルにエラーがないか確認するため、以下のコマンドを実行します。
```bash
sudo nginx -t
```
エラーがなければ、次にNginxを再起動します。

## Nginxを再起動
設定を反映させるために、Nginxを再起動します。
```bash
sudo systemctl restart nginx
```
## 動作確認
ブラウザを開き、設定したドメイン名またはIPアドレスにアクセスして、リバースプロキシが正しく動作しているか確認します。

## まとめ
以上が、Nginxでリバースプロキシを構築する基本的な手順です。Nginxを利用することで、トラフィックの負荷分散やセキュリティの向上など、多くの利点があります。ぜひ、実際に試してみてください。
Elixir NIFを使ってみる

# はじめに

NIFを実際に使ってみます
例として、C言語で整数の掛け算を行う関数を作成して、Elixirから使ってみます


# C言語ファイルを作成する

```C:multiply.c 
#include "erl_nif.h"

static ERL_NIF_TERM multiply(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
    int a, b;
    if (!enif_get_int(env, argv[0], &a) || !enif_get_int(env, argv[1], &b)) {
        return enif_make_badarg(env);
    }
    int result = a * b;
    return enif_make_int(env, result);
}

static ErlNifFunc nif_funcs[] = {
    {"multiply", 2, multiply}
};

ERL_NIF_INIT(Elixir.HelloNif, nif_funcs, NULL, NULL, NULL, NULL)
```

# Elixirモジュールを作成する

```Elixir:hello_nif.ex
defmodule HelloNif do
  @on_load :load_nif

  def load_nif do
    :ok = :erlang.load_nif(~c'./multiply', 0)
  end

  def multiply(_a, _b), do: :erlang.nif_error(:nif_not_loaded)
end
```

# Makefile の作成

```Makefile:Makefile
NIF_NAME = multiply
ERLANG_INCLUDE_DIR = $(shell erl -eval 'io:format("~s", [code:lib_dir(erl_interface, include)])' -s init stop -noshell)
ERTS_INCLUDE_DIR = $(shell erl -eval 'io:format("~s", [code:root_dir() ++ "/erts-" ++ erlang:system_info(version) ++ "/include"])' -s init stop -noshell)

all: compile

compile:
	gcc -o $(NIF_NAME).so -shared -fPIC -I$(ERTS_INCLUDE_DIR) $(NIF_NAME).c

clean:
	rm -f $(NIF_NAME).so
```

# mix に Makefile を組み込む

```elixir:mix.exs
defmodule HelloNif.MixProject do
  use Mix.Project

  def project do
    [
      app: :hello_nif,
      version: "0.1.0",
      elixir: "~> 1.17",
      compilers: [:elixir_make] ++ Mix.compilers(), # ElixirMake を追加
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:elixir_make, "~> 0.6"}
    ]
  end
end
```

# 実行してみる

```elixir
$ iex -S mix
Erlang/OTP 27 [erts-15.0.1] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

gcc -o multiply.so -shared -fPIC -I/home/masa/.asdf/installs/erlang/27.0.1/erts-15.0.1/include multiply.c
Compiling 1 file (.ex)
Generated hello_nif app
Interactive Elixir (1.17.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> HelloNif.multiply(2,3)
6
iex(2)> 
```

コンパイルも実行され、正しい結果が得られました。

試したコード

https://github.com/masahiro-999/hello_nif
【入門者向け】条件分岐を図解で学ぼう

:::note
私が教材として作る際は、以下内容は必ず網羅してますよ、という話です。要するに宣伝ですが、役に立つ話なので公開します。
:::

一気に見ると大変なので、学習状況によって一つずつ見てくださいね。
一気見すると一瞬ですが、きちんと学習しようとすると、半日＋半日以上かかるつもりで読み進めてください。

## 目次[^目次]
- 条件分岐編（ここ）
- [繰り返し処理編](https://qiita.com/nomurasan/private/871f4be9410451dd9143)
- [配列・連想配列・オブジェクト編](https://qiita.com/nomurasan/private/ec01ba58ba295a4fa80f)

[^目次]: 【目次いる？】Qiitaに慣れていると右側を見ますが、想定読者は非Qiita民のため設置してます。

### if文を理解する前に、フローチャートの話からする
まずは分からないなりにコードを見てみます。
ここでは、アルゴリズム学習でよく採用するJavaScriptを例にしましたが、言語知識は不問です。

```js
let i = 1
if(i <= 10){
  console.log('OK');
  console.log('次の処理はここにかく');
}
console.log('その後の処理');
```

これを、フローチャートにします。

```mermaid
graph TD
    A[i ← 1] --> B{i <= 10}
    B -->|"True"| C[OKと出力する]
    C --> D[次の処理はここにかく]
    D --> E
    B -->|"False"| E[その後の処理]
```

- ifが菱形
- ifのカッコ内｛｝に書いた処理だけやる。ここでは2つの処理を書いている
  - その後の処理も実行する
- ifの菱形の条件を満たさない場合は、その後の処理だけやる

### if-else文
説明のコツは「if文とif-else文は似ている別の処理」と指導する事です。
そうしておくと、if-elseif文のバイアスが消せます。
なお、先にif-elseifを教えてから、if-elseを教える方法も有効ですが、教材によってはそうなっていないかも。

:::note warn
個人的には「if」と「else-if」が仲間で、これらに当たらない条件全てをelseと考えてもらう方が教えやすいと思っていますが、賛否あります。
:::

```js
let i = 1
if(i <= 10){
  console.log('OK');
} else if(i <= 5)
  console.log('NG-OK');
}
console.log('その後の処理');
```

```mermaid
graph TD
    A[i ← 1] --> B{i <= 10}
    B -->|"True"| C[OKと出力する]
    C --> D[True/Falseそれぞれの続きの処理]
    B -->|"False"| E{i <= 5}
    E -->|"True"| F[NG-OKと出力する]
    F --> D
    E -->|"False"| D
```

このように処理が実行されます。
この時、変数iにどのような数値を入れればNG-OKになるでしょうか？

<details>
<summary>答え</summary>

---

:::note
答えは「ない」です。
ぱっと見、`i <= 5`が見えるので、5以下を入れたくなりますが、先に`i <= 10`の条件に当たってしまいます。
そして、`i <= 10`の条件に当たらないケースは、iが10より大きいため、絶対に`i <= 5`の条件はFalseになります。
:::

このように、フローチャートを使えばこのようなミスも図を見ながら流れを追いやすくなりますので、プログラミングに慣れないうちはフローチャートを書く・読む癖をつけると良いでしょう。

---

</details>

なお、else-ifは省略できます。先ほどのコードでもエラーにならずに動いていましたね？

### else-if文からelseを外すとどうなるか？
```js
let i = 1
if(i <= 10){
  console.log('OK');
}

// else if文からelseを外してみる
if(i <= 5)
  console.log('NG-OK');
}
console.log('その後の処理');
```

```mermaid
graph TD
    A[i ← 1] --> B{i <= 10}
    B -->|"True"| C[OKと出力する]
    C --> D{i <= 5}
    B -->|"False"| D
    D -->|"True"| E[NG-OKと出力する]
    E --> F[その後の処理]
    D -->|"False"| F
```

NG-OKの意味が変わってしまいましたね。
このように書き直すと、`i = 1`の場合はOKとNG-OKが出力されます。
`i = 7`であれば、OKのみが出力されます。

:::note warn
「if-elseif文」のelseif文からelseを取ると、全く意味の違う図になります。
:::

### if-else文
```mermaid
graph TD
    A[i ← 1] --> B{i <= 10}
    B -->|"True"| C[OKと出力する]
    B -->|"False"| D[NGと出力する]
    C --> E[True/Falseそれぞれの続きの処理]
    D --> E
```



```mermaid
graph TD
    A[let i = 1;] --> B{if（i <= 10） }
    B -->|"True"| C[console.log（'OK'）;] 
    B -->|"False"| D[console.log（'NG'）;]
    C --> E[ console.log（'True/Falseそれぞれの続きの処理'）; ]
    D --> E
```

```js
let i = 1;
if(i <= 10) {
  console.log('OK');
} else {
  console.log('NG');
}

console.log('Yes/Noそれぞれの続きの処理');
```

:::note
最初のif文と見比べてみると良いでしょう。
:::

## 次の章へ
- 条件分岐編（ここ）
- [繰り返し処理編](https://qiita.com/nomurasan/private/871f4be9410451dd9143)
- [配列・連想配列・オブジェクト編](https://qiita.com/nomurasan/private/ec01ba58ba295a4fa80f)

### 注釈
Deep Walkをしっかり理解する

# Deep Walkとは


## スキップグラム
自然言語処理の分野で用いられる、1つの単語は複数の意味をもつと、いった理論をもとに提案されました。そもそもスキップグラムは周辺の単語を用いて単語そのものの表現を学習するというものです。

例）
1.This light is good.
2.This bag is light


ここで[light]は同じlightでも「ライト」と「軽い」という２つの意味を持ちます。これは前後の文を見れば一目瞭然でどちらがどちらの意味か分かります。このように、周辺の単語を用いてその単語の表現を学習する手法がスキップグラムです。

## Deep Walk概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656436/036d77de-275e-e79d-6255-25bf08ce1f17.png)
参考文献[https://acervolima.com/deepwalk-algorithm/]

グラフも単語だと捉えて、スキップグラムの考え方を応用することができます。
This    is      a       pen.
ノード1 ノード2  ノード3 ノード4
といったように、順番に歩く(Walk)するようにたどれば単語と同じような意味合いで解釈することができます。

### Deep Walk 詳しく
ここでの頂点の列を以下のようにあらわします。

$$w_1, w_2,...,w_L\in V$$

ランダムでWalkしているときに通過する頂点を$$Z_i \in R^d$$と表すようにします。ランダムWalkしている途中に、頂点vが頂点uの前後Tステップ以内に登場する確率を以下のようにあらわします。
$$p_\theta(v|u) = \frac{\\exp(Z_u^TZ_v)}{\Sigma_{k \in V}\exp(Z_u^TZ_k)}$$

難しそうな式に見えナンスが、頂点uが通ったときに頂点vが通った確率の式です。Tは前後ステップではなく転置です。ここで式がexpをとり、ソフトマックスのようになっているのは大規模なグラフでは計算に時間がかかりすぎるためです。

よって最適化する目的関数はここの確率が合うように学習します。つまり、実際に頂点vがTステップ内に頂点uを通った確率と、表現学習によって学習された確率が等しくなるように学習するというわけです。

ここで確率分布を一致させるのですから、目的関数にはKLダイバージェンスが用いられます。



$$-E_{u~p(u)}[KL(p^*(v|u) || p_\theta (v|u))]+const.$$

実際の確率分布pと予測の確率分布p*の分布を近づけるように学習します。

# 参考文献
書籍：グラフニューラルネットワーク　・佐藤　竜馬
YAMAHA RTX1200ルータの初期設定ガイド(minicom)

YAMAHAさんのルータは初めて触ったので、記事として残そうと思います。
すこし戸惑ったので・・・

# 必要なもの
- USB-シリアル変換ケーブル
- 設定用PC(Ubuntu)
- minicom
- YAMAHAルータ (RTX1200)

# 接続
設定用PCとルータをコンソール接続します。
USB側は設定用PCに接続してください。

![S__26402826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/83b7797d-5a19-dd43-563c-8613ed4d04ba.jpeg)


# 初期設定の実施
- minicomを起動し、設定を行います。
設定方法はこちらを参照してください。
https://qiita.com/kawano-y/items/acce35b0a9702721b2bf

- minicomが起動したら``Password``を求められるので、何も入力せずにEnterを押してください。
![minicom設定１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/4b1126d1-cbd8-c62d-77b3-ebbcc9fa36fd.png)

- ``administrator``と入力し、``Password``は何も入力せずにEnterを押してください。
- ``The administrator password is factory default setting. Please change the passwo.
``とパスワードの変更を推奨されるので変更を行います。
- ここで変更を行いたいのですが、文字化けが発生しました。
![文字化け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/2b5d8969-63fa-235b-1d0d-60d4891e0c72.png)
 ``console character ascii``コマンドを実行します。
- 文字化けが解消されたら、``login password ``と入力し``Old_Password``に何も入力せずにEnterを押してください。
``New_Password``を求められるので任意のパスワードを設定してください。
``administrator password``と入力し同様に設定を行ってください。
- ``save``で保存を行い、ルータを再起動して設定が適用されていることを確認します。
![文字化け解消.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/18444821-f948-b98f-d209-e539817d1bd8.png)

# 最後に
やはり、初めて触れる物には戸惑いが付きものですね〜
「とにかく動かしてみる！」これが今の私には必要だと感じています。
設定が終了したので、色々と遊んでみようと思います！
[数学 / 代数学] 3次方程式の判別式の証明

```math
\begin{align}

3次方程式　x^3 + a&x^2 + bx +c = 0・・・①　の解を　\alpha, \beta, \gamma　とおく。\\
\\
このとき、この3次&方程式の判別式を　D = (\alpha - \beta)^2(\beta - \gamma)^2(\gamma - \alpha)^2　とする。\\
\\
\\
ここで、\alpha, \beta, \gamma　は&①式の解であるので、\\
\\
x^3 + ax^2 + bx +c &= (x - \alpha)(x - \beta)(x - \gamma)\\
&= x^3 - (\alpha + \beta + \gamma)x^2 + (\alpha\beta + \beta\gamma + \gamma\alpha)x - \alpha\beta\gamma ・・・②\\
\\
\\
②式の最左辺と再右&辺を比較すると、\\
\\
a &= -(\alpha + \beta + \gamma)・・・③\\
b &= \alpha\beta + \beta\gamma + \gamma\alpha・・・④\\
c &= - \alpha\beta\gamma・・・⑤\\
\\
\\
更に、判別式 D を変&形すると、\\
\\
D &= (\alpha - \beta)^2(\beta - \gamma)^2(\gamma - \alpha)^2\\
&= -4\alpha\beta\gamma(\alpha + \beta + \gamma)^3 + (\alpha + \beta + \gamma)^2(\alpha\beta + \beta\gamma + \gamma\alpha)^2\\
&+ 18\alpha\beta\gamma(\alpha + \beta + \gamma)(\alpha\beta + \beta\gamma + \gamma\alpha) -4(\alpha\beta + \beta\gamma + \gamma\alpha)^3 -27(\alpha\beta\gamma)^2\\
\\
\\
この判別式の変形結&果に③、④、⑤を代入すると、\\
\\
D &= -4a^3c + a^2b^2 + 18abc -4b^3 -27c^2\\
\\
a &= 0　のときは、　D = -4b^3 -27c^2\\
\\
\\
ここから、Dによる&解の判別方法を導出する。\\
\\
(1)　解が、相違な&る3つの実数解　\alpha,\beta,\gamma \in R　かつ　\alpha \neq \beta \neq \gamma　の場合、\\

(\alpha - \beta)^2 > 0&,　(\beta - \gamma)^2 > 0,　(\gamma - \alpha)^2 > 0　であるので、\\
\\
D &= (\alpha - \beta)^2(\beta - \gamma)^2(\gamma - \alpha)^2 > 0\\
\\
(2)　解が実数の重&解　\alpha, \beta \in R　かつ　\alpha = \beta　と、\\
それとは異な&る実数解　\gamma \in R　かつ　\alpha \neq \gamma　を持つ場合、\\
(\alpha - \beta)^2 = &0　より、\\
\\
D &= (\alpha - \beta)^2(\beta - \gamma)^2(\gamma - \alpha)^2 = 0\\
\\
(3)　解が実数の3&重解　\alpha, \beta, \gamma \in R　かつ　\alpha = \beta = \gamma　を持つ場合、\\
(\alpha - \beta)^2 = &0　より、\\
\\
D &= (\alpha - \beta)^2(\beta - \gamma)^2(\gamma - \alpha)^2= 0\\
\\
(4)　解が、1つの&実数解　\alpha \in R　と、\\

虚部が0でな&い互いに共役な複素数　\bar\beta = \gamma　かつ　\renewcommand{\Im}{\operatorname{Im}}\Im \beta \neq0　を持つ場合、\\
\\
\beta = d + ei　&かつ　d,e \in R　とおくと、　e \neq 0　であり、\\
\\
D &= (\alpha - \beta)^2(\beta - \gamma)^2(\gamma - \alpha)^2\\
&= (\alpha - \beta)^2(\beta - \bar\beta )^2(\bar\beta - \alpha)^2\\
&= (\alpha - \beta)^2(d + ei - d + ei)^2(\alpha - \bar\beta)^2\\
&= (\alpha - \beta)^2(\alpha - \bar\beta)^2(2ei)^2\\
&= 4e^2(i)^2\{\alpha^2 -\alpha(\beta + \bar\beta) + \beta\bar\beta\}\\
&= -4e^2\{\alpha^2 -\alpha(d+ei + d -ei) + |\beta|^2\}\\
&= -4e^2(\alpha^2 -2\alpha d + |\beta|^2)\\
&= -4e^2(\alpha^2- 2\alpha d + e^2 + d^2 )\\
&= -4e^2\{(\alpha - d)^2 + e^2\}\\
\\
ゆえに、&　(\alpha - d)^2 > 0　かつ　e^2>0　であるので、\\
\\
D &= -4e^2\{(\alpha - d)^2 + e^2\} < 0\\
\end{align}
```
転職ドラフトを使って実感！エンジニアが感じた転職活動のメリット5選

## はじめに
転職活動を行う際、いくつかの不安を抱えている方が多いのではないでしょうか。
「**自分の市場価値がどれくらいなのか？**」や「**自分に合った企業はどこなのか？**」など、考えるべきことはたくさんあります。

私もそんな一人でしたが、今回「転職ドラフト」というサービスを利用してみて、転職活動の中で多くの学びと気づきを得ることができました。
この記事では、**転職ドラフトを通じて感じたメリットを5つ**ご紹介したいと思います。


### 本題のメリットの前に、実際に感じた所感をご紹介します
- 自社開発企業が多い
- レジュメはしっかり見てもらえる
- 求めらるポジションが異なる
    - オファーされる金額が600万円でも、企業によっては求められるポジションがリードエンジニアだったりメンバークラスだったりと異なる

特に、**レジュメをしっかり見てもらえている**という点が印象的で、企業が本気で採用に力を入れていることが伝わってきました。
では、本題のメリット5選についてご紹介します。

## メリット1：自分の市場価値がわかる

転職ドラフトでは、企業からのオファーを受け取ることで、**自分のスキルや経験がどれくらい評価されるのか、企業からオファーされる年収**を具体的に知ることができます。

**オファー内容には、給与提示や評価されたスキルが明記されている**ため、「自分のどのスキルが市場で求められているのか？」が明確になります。例えば、「〇〇の経験が評価されている」といった客観的な評価を受けられるのは、非常に貴重な経験です。

:::note info
自分の技術スタックやキャリアプランに対する給与レンジを把握することで
      将来のキャリアパスを考える材料にすることができます。
:::


## メリット2：多様な企業を知るきっかけに

転職ドラフトを利用することで、普段関わることのない様々な企業や業界に触れる機会が得られました。
私は受託開発企業のため、自社開発企業の会社を知るいい機会になり、SaaS系企業の会社やスタートアップの仕組みであったりを知ることができました。

また、企業ごとに異なる課題や求める人物像を知ることで、「自分のスキルがどう活かせるか？」や「解決したい課題は何か？」といった視点が養われました。これにより、自分にマッチする企業を探すだけでなく、「自分が貢献できる価値」にも気づくことができました。


## メリット3：技術スタックが広がる

企業からのオファーには、使用している技術スタックやプロジェクト内容が記載されていることが多く、現場で活用されている最新技術やトレンドを知ることができます。

具体例として、「〇〇のプロジェクトの使用技術」といった内容が含まれており、**今後学んでおきたい技術や業界のトレンド技術**を見つけるきっかけになりました。視野が広がり、技術的な好奇心を刺激される良い機会となりました。


## メリット4：カジュアル面談で直接話せる

転職ドラフトでは、カジュアル面談の機会が設けられ、CTOやエンジニアリングマネージャーなど、実際の現場のキーパーソンと直接話すことができます。

:::note info
普段話すことができないような、他企業のCTOやEM（エンジニアリングマネージャー）と会話することができたりします。
また、カジュアル面談を通じて企業のリアルな社内文化や働き方を感じることができ、自分に合うかどうかの判断材料にできました。ただ、企業によっては会社紹介がメインになることもありました。
:::


## メリット5：自己理解が深まる

転職ドラフトのプロフィール作成やカジュアル面談を通じて、「自分が本当にやりたいこと」や「将来のビジョン」が明確になりました。

特に、自分の経験を整理し、アピールポイントを言語化するプロセスは、転職活動だけでなく、日々のキャリアの見直しにも役立ちました。実際に話を聞くことで、**自分のスキルや価値観が企業側にどう映るかを再確認できたり**、自己理解が深まったと感じています。


## まとめ

今回、転職ドラフトを利用した転職活動を通じて、エンジニアとしての自分の立ち位置やスキルを見直す貴重な機会を得ることができました。
自分の市場価値を知りたかったり、転職を検討している人、していない場合でも非常に有益になると思います。少しでもご参考になりますと幸いです。

最後までお読みくださりありがとうございました！
Haskellでラムダ計算：論理関数編

論理値を以下の関数で定義します。
trueとfalseの値を関数で定義するなんて、何てミステリアス。
```math
\textbf{T} = \lambda x y.x
```
```math
\textbf{F} = \lambda x y.y
```
$\textbf{T}$は最初の変数に置き換え、$\textbf{F}$は二番目の変数に置き換える操作のようです。
論理積$\land$は$$\land=\lambda a b.ab\textbf{F}$$と定義します。


$$\land\ \textbf{T}\textbf{T}\longrightarrow_\beta\textbf{T}$$

$$\land\textbf{F}\textbf{T}\longrightarrow_\beta\textbf{F}$$

$$\land\textbf{T}\textbf{F}\longrightarrow_\beta\textbf{F}$$

$$\land\textbf{F}\textbf{F}\longrightarrow_\beta\textbf{F}$$

Haskellで確認すると、
```
t' x y = x   -- true
f' x y = y   -- false
and a b = a b f'

-- Evaluation
main = do
    print $ and t' t' 1 0
    print $ and f' t' 1 0
    print $ and t' f' 1 0
    print $ and f' f' 1 0

>ghci> main
1
0
0
0
```
式の評価で最後は`t'`や`f'`として出力したかったのですが、Haskellでは値がないと評価できないようです。`t'`ならば最初の価を、`f'`ならば二番目の値を取るので`1 0`のようにして右側に付けました。`1`は真、`0`は僞です。`t'`や`f'`などの形で出力できる方法をご存じでしたら教えてください。

## Exerecise 5
論理和$\lor$の式はどうなるか？最初は$\lambda a b.a b \textbf{T}$かと思いましたが、予想に反して$\lor\equiv\lambda a b.b \textbf{T}a$でした。全く、直観に反した答えでした。ちなみに、前の式は排他的論理和でした。$\textbf{xor}\equiv\lambda a b.a b\textbf{T}$

否定（NOT）論理演算子は、$\neg\equiv\lambda x.x\textbf{F}\textbf{T}$となります。

$\neg\textbf{T}\equiv(\lambda x.x\textbf{F}\textbf{T})\textbf{T}\rightarrow\textbf{T}\textbf{F}\textbf{T}\rightarrow\textbf{F}$
$\neg\textbf{F}\equiv(\lambda x.x\textbf{F}\textbf{T})\textbf{F}\rightarrow\textbf{F}\textbf{F}\textbf{T}\rightarrow\textbf{T}$


更に、条件式は$\textbf{if_then_else}\equiv\lambda x.x$となります。
$$\textbf{if_then_else}\ \textbf{T}MN\longrightarrow_\beta M$$

$$\textbf{if_then_else}\ \textbf{F}MN\longrightarrow_\beta N$$

Haskellでは以下のように書けますね。
```
or' a b = b t' a   -- orは予約語なのか通りませんでした。
xor a b = a b t'
not x = x f' t'
```
【自主学習】ひたすらコードで覚えるC++［#5］

# はじめに
今回は5回目ということで、大きなプログラムを書く場合に必要な知識を学んでいきます。

# 使用する環境
環境はVisual Studio 2022を使用します。

# スコープを知る
変数の名前が通用する範囲のことをスコープといいます。
変数a：関数の外に宣言したグローバル変数
変数b：main()関数内に宣言したローカル変数
変数c：func()関数内に宣言したローカル変数

```diff_c
#include <iostream>
using namespace std;

//func関数の宣言

void func();

int a = 3;

//main関数ではグローバル変数aとローカル変数bが使えます
int main() {
	int b = 5;
	cout << "変数aの値は" << a << "です。\n";
	cout << "変数bの値は" << b << "です。\n";

	func();

	return 0;
}

//func関数ではグローバル変数aとローカル変数cが使えます
void func() {
	int c = 10;
	cout << "変数aの値は" << a << "です。\n";
	cout << "変数cの値は" << c << "です。\n";
}
```

# 変数の記憶寿命を知る
通常のローカル変数は関数が終了するまでの記憶寿命しか持ちませんが、ローカル変数に```static```を指定することで、グローバル変数と同じ記憶寿命をもつようになります。

```diff_c
static int d = 100;
```

# 動的なメモリの確保
関数の開始・終了にかかわらず、記憶しておきたい値がある場合、ローカル変数は使えません。対してグローバル変数では実行中の値を保持することができますが限りあるメモリを無駄遣いすることにもなります。動的にメモリを確保する方法により、メモリを必要な時に利用することができるようになります。

```diff_c
#include <iostream>
using namespace std;

int main() {
	int* pA;

	pA = new int;

	cout << "動的にメモリを確保しました。\n";

	*pA = 5;

	cout << "動的に確保したメモリを使って" << *pA <<
		"を出力しています。\n";

	delete pA;

	cout << "確保したメモリを解放しました。\n";

	return 0;
}
```

# ファイルを分割する
一度作成した関数を再利用することができれば便利です。別のプログラムから利用するような関数は、main()関数と別のファイルに記述することでいろいろなプログラムから利用しやすくなります。

- myfunc.h
```diff_c
#pragma once

int min(int x, int y);
```

- myfunc.cpp
```diff_c
#include "myfunc.h"

//min関数の宣言
int min(int x, int y)
{
	if (x < y)
		return x;
	else
		return y;
}
```

- test.cpp

```diff_c
#include <iostream>
#include "myfunc.h"
using namespace std;

int main() {
	int num1, num2, ans;

	cout << "1番目の整数を入力してください。\n";
	cin >> num1;

	cout << "2番目の整数を入力してください。\n";
	cin >> num2;

	ans = min(num1, num2);

	cout << "最小値は" << ans << "です。\n";

	return 0;
}
```


# 参考文献

この記事は以下の情報を参考にして執筆しました。
[やさしいC++ 第4版 (「やさしい」シリーズ) ](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84C-%E7%AC%AC4%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797370998)
【Python/数値計算】モンテカルロ法で満足しない！高精度な円周率計算を簡単に実装する標準ライブラリdecimal

## 高精度な円周率計算がしたい
　プログラムで円周率計算をしようと思い、インターネットで記事を検索した時。見つかる記事の大半はモンテカルロ法、つまり乱数を使った精度の低いアルゴリズムではないでしょうか。
　モンテカルロ法でも確かに、円周率は求めることができます。しかし、コンピュータ乱数という完全な一様性がないものを使い、しかも何百何千とループさせて小数点以下数桁の精度しかありません。遊びならそれでも良いですが、数値計算に使うための円周率が欲しい人やちゃんとした円周率計算がしたい人からしたらモンテカルロ法は胡乱なアルゴリズムだと思います。
　でも高精度な円周率の計算アルゴリズムは難しそうだ、と考える人もいるかもしれません。しかし、実は数万桁程度の円周率計算でも意外と簡単にできるのです。
　この記事では数万桁の円周率を計算してくれる簡単なプログラムを紹介します。

## 使用するアルゴリズムについて
　私が紹介するプログラムでは、円周率計算用のアルゴリズムとしてガウス=ルジャンドルのアルゴリズムを使用します。これは計算式がそこまで煩雑でないにも関わらずしっかり円周率を計算してくれるとても良いアルゴリズムです。
　詳しいことはwikiを見てください。私もここを見ながらコードを書きました。
 
https://ja.wikipedia.org/wiki/ガウス＝ルジャンドルのアルゴリズム

## 高精度な数値計算用の標準ライブラリ「decimal」
　さて、ガウス=ルジャンドルのアルゴリズムを実装する前に一つ考えなければならないことがあります。それはPythonの(というかプログラミング言語の)サポートする有効桁です。Python触りたての人はともかく、触り始めて少しでも経っていれば円周率「数万桁」という点で引っ掛かりを覚えることでしょう。その引っ掛かりの通り、一般的なプログラミング言語の小数型変数では数万桁という膨大な値を処理することができません。それ専用のデータ型が必要になります。この対策には様々な方法があり、例えば文字列処理を利用するなどでも対処ができます。ですが、そこは充実のPythonライブラリに頼ればすぐに解決です。
　Pythonには標準ライブラリとして高精度な数値計算を実現する`decimal`というモジュールがあります。`decimal.Decimal`で数値を`Decimal`型に変換します。これは数万桁の小数も余裕で処理してしまう数値計算向けのデータ型です。円周率以外にも、桁数の多い計算は`Decimal`を活用しましょう。

## 実装
~~~python:pi.py
from decimal import *
import math

def calcPi(n:int) -> str:
    getcontext().prec=n+2
    a=Decimal(1)
    b=Decimal(1)/Decimal(2).sqrt()
    t=Decimal(1)/Decimal(4)
    p=Decimal(1)
    k=0
    kn=int(math.log2(n))
    while k<kn:
        aa=a
        a=(aa+b)/Decimal(2)
        b=(aa*b).sqrt()
        t=t-p*((aa-a)*(aa-a))
        p=Decimal(2)*p
        k+=1
    return str((a+b)*(a+b)/(Decimal(4)*t))[:-1]
~~~
:::note warn
ぶっちゃけ変数の名付けがすごい適当で見にくいかもしれませんが、そこはご勘弁ください。かなり昔に書いたコードなので……。
:::
:::note
戻り値は文字列(str型)です。桁数が大きいものはDecimalかstrでないと(このプログラムでは)処理できません。もしstr型よりDecimalが良い方はstrではなくDecimalのまま返すか、返り値を受け取る際にDecimalに変換し直してください。
:::
　`calcPi`の冒頭にある`getcontext().prec`というのは計算する桁数を示しています。このプログラムでは引数`n`が小数点以下の桁数を意味しており、`n+2`のうち`+1`は整数部分（つまり円周率の`3`）、もう`+1`は一番下の位が四捨五入されるっぽいので小数点以下`n+1`桁まで計算したあと`n+1`桁目を廃棄して`return`してるためです。
　~~この時一番下の桁しか捨てなくて精度は平気なのかと思うかもしれません。私もそのあたりは一度検証したのですが、おそらく数万桁程度であれば一桁捨てるだけで問題ないと思われます。ただ、保障はできないので一度`decimal`で書いたコードはご自分で精度を確認することを推奨します。~~
　私の環境では50,100,1000,10000桁で厳密値が出たのですが、指摘があり厳密値からずれてしまう桁もあるようです。有効桁を指定する`getcontext().prec=n+2`の`2`と、返り値を計算する`return str((a+b)*(a+b)/(Decimal(4)*t))[:-1]`の`-1`をそれぞれ`10`と`-9`とかまで変更すると余裕を持って計算できそうです。

## おまけ：自然対数の底と平方根
　`decimal`モジュールを利用して自然対数の底や平方根も計算することができます。これは円周率よりもはるかに簡単です。
~~~python:e.py
def calcE(n:int) -> str:
    getcontext().prec=n+2
    return str(Decimal(1).exp())[:-1]
~~~
~~~python:root.py
def calcRoot(n:int,a:int) -> str:
    getcontext().prec=n+2
    return str(Decimal(a).sqrt())[:-1]
~~~

## さいごに
　数万桁という桁数をメインにここまで述べてきました。しかし、私はこのプログラムで27万桁のπ、e、√2を計算しています。精度は未確認ですが。
　 これにかかった時間は大体二、三十分だったと思います。(記憶が曖昧なのでもしかしたら四十分くらいかかったかも)
　みなさんもぜひ一度はこんな感じで大きな桁数の数値計算をしてみてはいかがでしょうか。結果をファイルに書き出してローカルで保存すると、「俺のパソコンには〇〇桁の円周率が入ってるんだぜ〜」と自慢できるようになります。したことないですけど。
TypeScriptについて学んだことをまとめる

以下のUdemyの講座を受講したので、学んだことをまとめていく。

https://www.udemy.com/course/react_stepup/?couponCode=LEARNWITHUSNOW

### いろいろな型
```ts:
let bool: boolean = true;
let num: number = 1;
let str: string = 'abc';
let arr1: Array<number> = [0, 1, 2];
let arr2: number[] = [3, 4, 5];
let tuple: [number, string] = [1, 'aaa'];
let any1: any = false;
const funcA = (): void => {
  const test = 'TEST';
};
let null1: null = null;
let undefined1: undefined = undefined;
let obj1: object = {};
let obj2: { id: number; name: string } = { id: 1, name: 'aaaa' };
```

### 型指定
変数の型指定は、変数名の後に`: 型名`とする。
引数の型指定は、引数名の後に`: 型名`とする。
返り値の型指定は、引数指定の後に`: 型名`とする。
```ts
const calcTotalFee = (num: number): number => {
    const total: number = num * 1.1;
    console.log(total);
  };
```

### 型の定義
`type`で型を定義できる。
型毎にファイルを分けて、`import`するような形にすると良い。
```ts
type User = {
  name: string;
  age: number;
};
```

### Propsの型指定
`FC<Propsの型名>`を使用して以下のように記述する。
```tsx
import { FC } from 'react';

type Props = {
  color: string;
  fontSize: string;
};

export const Text: FC<Props> = (props) => {
  const { color, fontSize } = props;
  return <p style={{ color, fontSize }}>text</p>;
};
```

### 型の一部の要素のみ必要な場合
`Pick`または`Omit`を使う。
`Pick`は必要な要素を`Pick<型名, 要素1 | 要素2 | ...>`の形で列挙する。
`Omit`は不要な要素を`Omit<型名, 要素1 | 要素2 | ...>`の形で列挙する。
下記の例は、propsとして、`id`以外の要素が必要であることを記述している。
```tsx
import { FC } from 'react';

export type TodoType = {
  userId: number;
  id: number;
  title: string;
  completed?: boolean;
};

//Pickを使う場合
export const Todo: FC<Pick<TodoType, 'userId' || 'title' || 'completed'>> = (props) => {
  const { title, userId, completed = false } = props;
  const completeMark = completed ? '【完】' : '【未】';
  return <p>{`${completeMark} ${title}(ユーザー: ${userId})`}</p>;
};

//Omitを使う場合
export const Todo: FC<Omit<TodoType, 'id'>> = (props) => {
  const { title, userId, completed = false } = props;
  const completeMark = completed ? '【完】' : '【未】';
  return <p>{`${completeMark} ${title}(ユーザー: ${userId})`}</p>;
};
```
### オプショナルチェイニング
下記のコードにおいて、`user.hobbies.join(' / ')`の部分は、
`hobbies`が渡されていない場合、`join`が失敗してエラーとなってしまう。
`user.hobbies?.join(' / ')`と`?`を追記することにより、`hobbies`が渡されない場合、即座に`undefined`を返して以降の処理を実行しないようにできる。

```ts: User.ts
export type User = {
  name: string;
  hobbies?: string[];
};
```

```tsx: UserProfile.tsx
import { FC } from 'react';

type Props = {
  user: User;
};

export const UserProfile: FC<Props> = (props) => {
  const { user } = props;
  return (
    <dl>
      <dt>名前</dt>
      <dd>{user.name}</dd>
      <dt>趣味</dt>
      <dd>{user.hobbies.join(' / ')}</dd>
    </dl>
  );
};
```

### 外部パッケージの型指定
外部パッケージの型は、`@types`から始まるパッケージに集約されている場合がある。
`import`で読み込むことにより、各種補完やチェックが働くようになる。
ilasmでstack machine その29

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmでclassを書け。

# 方針
- floatを足すclassを作る。


# サンプルコード

```

.assembly oop {}
.class Calc extends [mscorlib]System.Object {
	.method public void .ctor() {
		ret
	}
	.method public float32 Sum(float32, float32) {
		ldarg.1
		ldarg.2
		add
		ret
	}
}
.class public Program extends [mscorlib]System.Object {
	.method public static void Main(string[] args) {
	.maxstack 3
	.entrypoint
		newobj instance void Calc::.ctor()
		ldc.r4 4.5
		ldc.r4 45.67
		call instance float32 Calc::Sum(float32, float32)
		call void [mscorlib]System.Console::WriteLine(float32)
		ret
	}
}

```

# 実行結果

```
>oop
50.17

```

以上
【初心者必見】初心者が深層学習モデルに3か月取り組んだら、すごい勉強になった話

※コードレベルのお話を期待される方はブラウザバック推奨です
# はじめに
　アクセスいただきありがとうございます。
　この記事では、「機械学習ってどうやって実装するんだろう、一旦作ってみるか」というノリで作った学習モデルを作って、ものすごい勉強になった経験を書きます。
　これに取り組み始めたときの私のスペックは、プログラミングを学び始めてから1年半ほど経っており、機械学習の事前知識は「教師あり学習とかあるんだなぁ」くらいでした。

　**「深層学習とか全然分からないけど、なんか作ってみたいなぁ」** という方は、ぜひ実際に取り組んでみることをおすすめします。

# 何をつくったのか
　**「楽器の音を入力すると、その楽器の画像が出力されるモデル」** をPythonで作りました(使ったライブラリはPytorch)。本当は「音声を入力したら、それが流れていそうな風景画像を出力するモデル」を作るつもりでした。画像から画像を生成するモデルや、テキストから画像を生成モデルはいっぱいあるのに、意外と **「音声」から「画像」を生成するモデル** ってないなと思ったからです。かなり壮大なテーマで初心者の私には取り組めるイメージが湧かなかったため、目標を下げました。
# 使ったデータセット

https://github.com/roudimit/MUSIC_dataset

　どうやらモデルの作成には大量のデータが必要らしい。ということで、ネットで大量のデータを配布してくれいているサイトを探しました。選んだのは、**「楽器を演奏しているYoutubeの動画のURLをJSON形式でまとめたデータセット」** です。[Kaggle](https://www.kaggle.com/ "Kaggle")で探したかなと思います。「音声」と「画像」の対応が取りやすいだろうと考えて選びました。
# 参考にした論文
 
 https://www.mdpi.com/2076-3417/13/19/10833

　実装したいけど、ニューラルネットワークのモデルを自分で定義しないといけませんでした。流石に知見がなさすぎるので、論文を頼ることに。ネットで見つけた数少ない「音声」から「画像」を生成するモデルを扱った論文を発見できました。これは[Google Scholar](https://scholar.google.com/ "Google Scholar")で探しましたかと思います。論文なんて1ミリも読んだことないですし、なおかつ英語だったので、[DeepL](https://www.deepl.com/ja/translator "DeepL")を使いながら少しずつ解読しました。主に参考にさせていただいたのは、元々困っていたニューラルネットワークのモデル部分です。このモデルを基に、GANという形で実装しました。
　音声データを「メルスペクトログラム」という画像データに変換し、それをさらに特徴抽出した「エンベディング」という1次元ベクトルの形にするという手法が用いられていました。音声データを扱う際には結構用いられる手法らしい…？
# 使ってみると
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804008/fb0e7a2d-8fad-c1d1-cc09-399ccc186d77.png)![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804008/d8b97455-51eb-00c0-17bc-d213dfa54db9.png)![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804008/838c8cf4-41cd-2371-f46a-0871d846cb20.png)
　うーーん、ぐにゃぐにゃ。左から、クラリネット、アコースティックギター、ドラムです。これらの画像はまだいいほう。9割の画像は黒くなってしまったり、何が何だかわからない画像になってしまいました。
　このレベルの画像が出力されるまで、何度もエポック数や学習率などのパラメータや、使用する損失関数を変えていました。機械学習って結構時間がかかるんですね…(取り組んだ3か月のうち2か月はモデル学習の実行時間だったように感じます)
　最終的にはあんまりうまくいきませんでした。
# 勉強になったこと
・コードレベルでの実装方法
・記事の探し方
・座学って大事
## コードレベルでの実装方法
　私の中でぼんやりとした理論が **「コードレベル」** で理解できました。実際にプログラミングすることでアウトプットするのは一番理解が速いですね。もともと、「どうやって実装するのか」という疑問がありましたが、実際に作ってみることでこの疑問は大いに解消できました。また、実装とは少し違いますが、コードのバージョン管理でGitを使ったので、そういうのもいい練習になりました。ネットワークモデルのコードは[ChatGPT](https://openai.com/ja-JP/ "ChatGPT")にも手伝ってもらいました。
## 記事の探し方
　とにかく関連しそうな単語を並べてGoogleで検索していました。だいたい[Qiita](https://qiita.com/ "Qiita")の記事を参考にさせていただいたと思います。ただ、どうしても日本語の記事が見つからないときもあります。そういうときは英単語で検索したり、学術論文検索エンジンというものがあると知ってからは、[Google Scholar](https://scholar.google.com/ "Google Scholar")とか[arXiv](https://arxiv.org/ "arXiv")とかで探すようにしました(そこで今回参考にさせていただいた論文を見つけました)。
## 座学って大事
　今回実装してみて一番感じたのは、 **「深層学習に対する知識がまだまだ足りない」** ということでした。「どのパラメータを変えたら、 **理論的に** どういう変化が期待できるのか」、「こういうパターンでは **数学的に** こういう損失関数を使うんだ」とかです。
 　先ほど「何度もエポック数や学習率などのパラメータや、使用する損失関数を変えていました」と述べました。この非効率な時間はもっと座学と向き合っていれば短縮できたように感じます…
# おわりに
　私の興味で深層学習モデルの実装を行った話を述べさせていただきました。これらの実装に要する「コード」と「理論」は **ネットにある情報のみ** で学習できました。
 
　　**「頑張れば初心者でもこのレベル感のモデルを作成できます。」**
  
　私の深層学習モデル実装の熱意とノリは、一旦燃え尽きました。初心者の自分としてはよく頑張ったほうだと思っています。座学とはもうちょっと向き合ったほうがよさそうです…

　最後まで読んでくださり、ありがとうございました。この記事が誰かのためになるかはわかりませんが、深層学習初心者の同志の何かになれば幸いです。
Elixir＋FPGAの可能性を妄想してみる

# はじめに

@piacerex さんの、[ElixirChipの記事](https://qiita.com/piacerex/items/b99baebf284243fb6d6b)に現在のPCやクラウドの仕組みでは、構造的な課題があって、これを乗り越えるものができたらいいなぁ。という話があります。CPUの処理能力も頭打ちです。

昔回路設計とかFPGA使ったりしていたので、Elixir＋FPGAでなにかできないか、妄想をしてみたいと思います。

この記事は、私の考えた妄想をChatGPTと話して、お手軽にできそうなことを文章化してみました。
事実とは異なる記述がある可能性もあるのでご了承ください。

# ザックリした話をしてみる

こんな問いからはじめてみました

**関数型の言語ElixirやBEAMの処理をハードウエアのオフロードする事を考えます**

これに対して、ずらずら返信を返してきました。

「NIF（Native Implemented Function）: ElixirはC言語などで書かれたネイティブコードを呼び出す機能を持つため、FPGAで実装された計算モジュールをNIF経由で呼び出し、ハードウェアオフロードが可能です。」

こんな文章がありました。NIFって使えそうかも。とおもったので、

**NIFについて学びたい**

概要を説明してもらいました。
あまりアイデアにつながるようなことはありませんでした。

NIFに関連して、無茶ぶりをしてみます

**XlinxのツールのC言語で書いたものを論理合成するのがあるよね。これとNIFをくっつけられるといいね？**

はい、その考え方は非常に興味深いです。Xilinxのツールには、C言語で記述したコードをFPGAの論理設計として合成するための **HLS（High-Level Synthesis）** ツールがあります。これを使用することで、C/C++コードをハードウェア記述言語（HDL）に変換し、FPGAで実行可能なハードウェアとして合成できます。

～～省略～～

このアプローチにより、Elixirアプリケーションで計算集約的な処理をハードウェアにオフロードし、パフォーマンスを大幅に向上させることが可能です。例えば、リアルタイム画像処理や暗号化プロセス、機械学習の推論などで有効です。

おお、何か褒められた感じ。

実際にハードウエアに落とす方法を模索したいので、関係しそうなところを攻めてみます。

**Zynq-7010にハードウエアとARMコアから同時にアクセスできるRAM的なものなかったっけ？**

はい、Zynq-7010には、FPGAロジックとARM Cortex-A9プロセッサの両方から同時にアクセス可能なPS（Processing System）- PL（Programmable Logic）間の共有メモリとして使用できるリソースが存在します。以下は、その詳細です。

OCM（On-Chip Memory）っていう名前なのね。もうちょっと深堀してみよう

**NIFで受け渡すデータをOCMに置く方針はどう？**

NIFを通じて受け渡すデータをZynq-7010の **OCM（On-Chip Memory）** に配置する方針は、非常に合理的なアプローチです。これにより、Elixir/ErlangアプリケーションとFPGAロジックの間で効率的なデータ共有と高速なアクセスが可能になります。以下にその利点と考慮点を説明します。

～～　省略　～～

合理的にできそうな感じになってきた。
さらに、無茶ぶりをしてみる

**一般化できないかな？**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/c28bd97c-9ec6-2179-37f5-013221561a36.png)

簡単な例を示して、具体的な自実装例にもっていこう。

**例えば、２つの32bit整数の掛け算を行う処理をFPGAで行い、ソフトウエアとしては、NIFを介在して、ハードウエアとしては、OCMを使ってやり取りする実装を考えてみて**

ハードウェア側の設計（FPGA）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/2a0c2532-57a7-f4e2-df44-b685ee06f51b.png)

ソフトウェア側の設計（Elixir/NIF）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/dfe14e27-c47d-53b7-0ba6-d31fe37eab5f.png)

Elixirコード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/1c801b3b-cd1b-9ece-56f0-3fc3490e4672.png)

# まとめ

- ElixirとFPGAの間でデータをやりとりする部分について、妄想をしてみました
- Zynq-7010の学習も兼ねて、試してみる価値はありそうなお題ができました
- これを参考にして、Elixir＋FPGAの可能性を試してみたいと思います
WSLでNerves.localの名前解決をできるようにする

# はじめに

NervesのターゲットではmDNSが動作しているので、```ssh nerves.local```で接続することができます。
しかし、WSLのコンソールでは、mDNSに対応していない為に、接続できません。

# 対応方法

WSLのネットワークモードをmirroredにする

```ini
[wsl2]
networkingMode = mirrored
```
変更後、wsl --shutdownでは変わらず、Windowsの再起動が必要でした。
wslのターミナルでifconfigを実行して、Windowsと同じIPアドレスが付与されていればmirroredになってます。

WSLのコンソールで、mDNSの名前解決パッケージをインストールする
'''
sudo apt-get install libnss-mdns
'''

```ssh nerves.local```で接続できるようになりました

'''
$ ssh nerves.local
Interactive Elixir (1.17.2) - press Ctrl+C to exit (type h() ENTER for help)
████▄▄    ▐███
█▌  ▀▀██▄▄  ▐█
█▌  ▄▄  ▀▀  ▐█   N  E  R  V  E  S
█▌  ▀▀██▄▄  ▐█
███▌    ▀▀████
test2_project 0.1.0 (4ebc6d62-0281-5183-ab70-6aa246da85e1) arm stm32mp135d
  Serial       : 0000
  Uptime       : 1 hours, 13 minutes and 20 seconds
  Clock        : 2024-11-03 13:14:04 UTC
  Temperature  : 87.8°C

  Firmware     : Valid (B)               Applications : 40 started
  Memory usage : 65 MB (14%)             Part usage   : 270 MB (2%)
  Hostname     : nerves-0000             Load average : 0.00 0.00 0.00

  eth0         : 192.168.0.100/24, 240f:68:4c37:1:9c45:c7ff:fea0:ac83/64, fe80::9c45:c7ff:fea0:ac83/64

Nerves CLI help: https://hexdocs.pm/nerves/iex-with-nerves.html

Toolshed imported. Run h(Toolshed) for more info.

'''

ただ、なぜか、名前解決に10秒くらいかかります。
これも何とかしたいですね。
解決できたら、記事更新します。
ilasmでstack machine その28

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmで関数を書け。

# 方針
- 数値が倍になる関数baiを作る。

# サンプルコード

```


.assembly bai {}
.method public static int32 bai(int32 n) {
.maxstack 3
	ldarg n
	dup
	add
	ret
}
.method public static void Main() {
.maxstack 3
.entrypoint
	ldstr "enter n: "
	call void [mscorlib]System.Console::Write(string)
	call string [mscorlib]System.Console::ReadLine()
	call int32 [mscorlib]System.Int32::Parse(string)
	call int32 bai(int32)
	call void [mscorlib] System.Console::WriteLine(int32)
	ret
}


```

# 実行結果

```
>bai
enter n: 10
20

```

以上
テスト用 RDS for PostgreSQL

# RDSインスタンスの構築
https://qiita.com/AkioMotoki/items/ac4f6dc9456c5d90c70e

当記事は、上記記事で使う環境の一部で、移行先DB(ターゲットDB)としてのRDS for PostgreSQLを構築した例。
## AWSの管理コンソールからのRDSメニュー
AWSのRDSのメニュー 「データベース」から「データベースの作成」を選択し、DBインスタンスを構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/6b4d085d-44d7-3d2e-f59d-f1bac9fcd241.png)

## データベースの作成
エンジンのタイプとしてPostgreSQLを選択。
その他は、テスト環境に合った設定を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/fe251f68-4ac1-1185-82f3-c6b4619dee67.png)
DBのサブネットグループやセキュリティグループは、他と連携が可能なものを設定。
(この画面ショットは作成前のもの。ここで作成する)


# PSQLによるコマンドライン管理操作
## PSQLによるDB接続 
デフォルトDB「postgres」に接続
```sql:PSQL ログイン 
psql -h localhost -p 5432 -U postgres -d postgres
```
## ユーザ作成
```sql:ユーザ作成 
CREATE ROLE apl WITH
LOGIN
CREATEDB
CREATEROLE
INHERIT
NOREPLICATION
CONNECTION LIMIT -1
PASSWORD '[パスワード]';
```
## データベース作成
```sql:データベース作成 
CREATE DATABASE pgdb01
    WITH
    OWNER = apl
    ENCODING = 'UTF8'
    LOCALE_PROVIDER = 'libc'
    CONNECTION LIMIT = -1
    IS_TEMPLATE = False;
```

## PSQLによるDB接続 
```sql:PSQL ログイン 
psql -h pgdb01.xxxxxxxx.ap-northeast-1.rds.amazonaws.com -p 5432 -U adminpg -d pgdb01
```
```sql:スキーマの作成
create schema apl
```
```sql:スキーマの切り替え
set search_path to apl; 
select current_schema;
```

## テーブル作成
予めテーブル作成のDDL(CREATE TABLE文)を準備して、PSQLで実行することでテーブルを作成できます。

# オプション Oracle高互換環境の設定
## Oracle互換ツール(orafce)の設定 
ORAFCEは、ORACLE DB固有の環境依存の機能の一部をPostgreSQLで実行できるツール。
以下の操作で実行できるようになります。
``` SQL:orafceの設定
 create extension orafce;
``` 
ORAFCEの動作確認
`\dx`コマンドで有効なextensionの確認ができます。(orafceが入っていればOK)
``` SQL:orafceの確認
\dx
```
スキーマ「oracle」を有効にすることで、ORAFCEの機能が使えます。
ここでは、サーチパスにoracleを追加。
```
SET search_path TO "$user",apl , oracle, pg_catalog;
select next_day(current_date, 'saturday');
```
サーチパスは、セッション毎に消えてしまうので、以下でユーザに対し固定化します。
``` sql:orafce実行パスの永続化
ALTER USER apl SET search_path TO "$user",apl , oracle, pg_catalog;
```
【C言語】配列

## 配列
**用途 : データを複数まとめて扱う**
### 宣言と定義
- 値を全て0で初期化する場合
```C
型　配列名[要素数(=データを格納する「箱」の数)] = { 0 };
```

- それぞれに代入する場合
```C
型　配列名[] = { 値1, 値2,...};
```

※利用時、配列名[要素番号(0 ~ 要素数 - 1)]で「箱」を指定する

## 多次元配列
**用途 : ステータス管理など**
- 値を全て0で初期化する場合
```
型　配列名[要素数(=「箱」を格納する「箱」の数)][要素数] = { 0 };
```

- それぞれに代入する場合
```C
型　配列名[][] = { {値1-1, 値1-2,...},... };
```

## char*を使わずに文字列を宣言・定義する方法
```C
char str[] = "Hello World"; // 例
```

ついでに...
- 文字列をコピーする
```C
// コピー元の文字列にフォーマット指定子が入っていない場合
strcpy_s(コピー先の文字列変数, sizeof(コピー先の文字列変数), コピー元の文字列);

// コピー元の文字列にフォーマット指定子が入っている場合
snprintf(コピー先の文字列変数, sizeof(コピー先の文字列変数), コピー元の文字列, 変数名...);
```
※**sizeof** : ここでは、配列全体が占めるメモリ領域の大きさを取得

## 配列とfor文
### 要素番号をi(仮)に置き換える
```C:example.c
#include <stdio.h>

int main(void)
{
    int numbers[] = {1, 2, 3, 4, 5};

    // 数字を順に出力
    for(int i = 0; i < 5; i++)
    {
        printf("%d\n", numbers[i]);
    }

    return 0;
}
```

### Range-based for loop(C++11以上)
`forとの違い : 処理の繰り返し処理を最初から最後まで実行でき、簡潔に記述できる`
```C++:example.cpp
#include <iostream>

int main(void)
{
    int numbers[] = {1, 2, 3, 4, 5};

    // 数字を順に出力
    for (int number : numbers)
    {
        std::cout << number << std::endl;
    }

    return 0;
}
```

### foreach文(C#)
`forとの違い : 処理の繰り返し処理を最初から最後まで実行でき、簡潔に記述できる`
```C#:example.cs
using System;

class Program
{
    static void Main()
    {
        int[] numbers = new int[]{1, 2, 3, 4, 5};

        // 数字を順に出力
        foreach (int num in numbers)
        {
            Console.WriteLine($"{num}");
        }
    }
}
```
チームリーダーに抜擢されたらまずはメンバーの振り返りを促そう

# はじめに
### 筆者
- 新卒でIT企業に入社し、スクラムの開発案件に配属
- 2年目に5~8名メンバーのいるチームのリーダーに起用
### この記事でわかること
- 初めてリーダーを経験し感じた、振り返りの効果
- 効果的なPDCAの回し方

# 目次
1. [どうして振り返り？](#どうして振り返り)
1. [振り返りのメリット](#振り返りのメリット)
1. [振り返りの促し方](#振り返りの促し方)
1. [まとめ](#まとめ)


# どうして振り返り？
チームリーダーの仕事は、大まかに分けて以下の2つだと思います。
- チームの成果上げる
    - 進捗管理
    - チームの意思決定 
    - 決断について上司（PMなど）と合意を取る
- 部下を成長させる
    - 技術力向上
    - キャリアアップ補助

これらの業務は、すべてのメンバーの状況を把握して指示するようなリーディングでは達成できないと考えます。
理由は、単純に時間がかかりすぎてしまうからです。昨今ほとんどの若手マネージャー・リーダーはプレイングマネージャーであり、自身も業務を行いつつリーディングを行うことになるので、業務とリーディングの両立のためにはメンバーに自分から動いてもらうことが必須になっています。
そのためには、PDCAを回すこと、特に業務の振り返りを適切に行ってもらうことが最重要だと考えています。


# 振り返りを促すメリット
PDCAサイクルを回すことには以下のようなメリットがあり、リーダー業務をスムーズにしてくれます。
そんなPDCAの中でも、一人で行うのが一番難しいのがC（振り返ること）です。
新人の時は経験や知識が浅いため、自身の反省点や問題点を一人で見つけるのが難しいです。
振り返りをサポートすることでPDCAが適切に回り始め、以下のような効果をもたらしてくれます。

### メンバーの自主性が育つ
自身の業務を定期的に振り返り、改善点を自ら発見することで、責任感・主体性をもって業務に取り組めるようになります。
- **主体性**...課題を自ら発見し、それに対して主体的に取り組むことで、自主的な行動が自然と促されます。指示を待つのではなく、自分から改善策を提案して実行することで、業務に対する主体性が育まれます。
- **責任感**...自らの業務を振り返る習慣を持つと、自分の行動や成果に対しての責任感が高まります。これは、業務に対する自己評価ができるようになるためで、結果についても他者に依存せず、自分自身で向き合う姿勢が身につきます。

責任感・主体性を持つと、メンバーが自ら意思決定できるようになっていき、自分のタスク管理や進捗確認を行うことができるようになるため、リーダーの負担が激減します。

### 技術力・開発プロセスが向上
改善点を常に意識することで、業務の効率化や成果向上を図ることができ、自分自身の成長を加速させることができます。

また、自分に足りない能力に気づき、それを改善しようという動きができるようになるため、個人の技術力向上にも役立ちます。


# 振り返りの促し方
上記のように、メンバーの振り返りを促すことで、チームの成果を上げること、メンバーの成長をサポートすることにつながります。
では、具体的にどのようにサポートすればよいでしょか。


### なぜなぜ分析
周期はプロジェクトによって様々ですが、朝礼や夕礼、週次や月次のミーティングなど、チームの進捗を確認する打ち合わせが定期的に開催されると思います。

その際、報告された進捗に対して、なぜそのような結果になったと思っているかを聞いてみてください。

- ○○時間遅れが出た　→　なぜ遅れたと思いますか？
- 計画通り言っている　→　うまく言った要因は何だと考えていますか？

そこで得られた返答に対して、今度はその理由を聞いてみる、というようにして、結果の根本原因を考えてもらいます。
このように、「なぜ？」を繰り返し聞く分析手法は「なぜなぜ分析」といい、振り返りの際に行うことで本質的な問題点や改善点を発見することをサポートしてくれます。
[5回の「なぜ」で導き出す「なぜなぜ分析」とは？](https://www.keyence.co.jp/ss/general/manufacture-tips/5whys.jsp)

なぜなぜ分析によって本質的な問題点が得られたら、次の定期ミーティングまでの目標として、問題点を解消するような目標を一緒に決めましょう。
そして次のミーティングでは作業の進捗と目標が達成できたかを、なぜなぜ分析をして振り返る、という作業を繰り返せば、効果にPDCAを回すことができます。

### 質問して考えてもらう
なぜなぜ分析を進めるうえで重要なのが、こちらがするのは「なぜ？」と問うことで、答えはメンバー自身に考えてもらう必要があるということです。
目的は自ら振り返ってPDCAを回してもらうことで、こちらが原因や目標を定めてしまっては主体性や責任感が育ちません。

また、「なぜ？」と質問して得られた答えがロジカルでないときは、それを指摘して正しい方向に分析することを促しましょう。
根本原因を探るのは難易度が高く、一人の視点では間違った結論に着地してしまうことが多いです。なので、そこをサポートすることでPDCAを回すことをサポートすることがとても重要だと、少しだけリーダーを経験してみて感じています。

# まとめ
下記のことを意識して振り返りをサポートすることで、チームリーディングを効率的に行うことができます
- 定期的になぜなぜ分析で問題点の洗い出し・目標設定を行いPDCAを回す
- なぜなぜ分析では「なぜ？」と聞くことと論理の破綻の指摘することで、振り返りのサポートをする
Djangoでアプリを作るときのディレクトリ構成について


# Djangoプロジェクトにおけるディレクトリ構成とテンプレートの追加

DjangoでWebアプリケーションを開発する際、プロジェクトとアプリケーションのディレクトリ構成を正しく理解することは非常に重要です。この記事では、`views.py` に対応するテンプレート（`templates`）をディレクトリ構成に追加する方法について説明します。

---

## 全体の流れ

1. **ユーザーリクエスト**: ユーザーがブラウザで特定のURLにアクセスします。
2. **URLディスパッチ**: `urls.py` で対応するビュー関数を呼び出します。
3. **ビュー処理**: `views.py` 内のビュー関数が処理を行い、テンプレートをレンダリングします。
4. **テンプレート表示**: テンプレート内でHTMLが生成され、ユーザーに返送されます。


## 更新されたディレクトリ構成

以下は、`views.py` に対応するテンプレートを含めたディレクトリ構成の例です。

```bash
myproject/          # プロジェクト名
├── manage.py
├── myproject/      # プロジェクト設定ディレクトリ
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── myapp/          # アプリ名
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations/     # マイグレーションファイルを格納
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    ├── views.py        # ビュー関数を定義
    ├── urls.py         # アプリケーションのURLパターンを定義
    └── templates/      # テンプレートファイルを格納
        └── myapp/      # アプリ名でディレクトリを作成
            ├── form.html       # フォームページのテンプレート
            └── results.html    # 結果ページのテンプレート
```


## 説明

### `templates/` ディレクトリ

- テンプレートファイルを格納するためのディレクトリです。
- アプリ名（`myapp`）のサブディレクトリを作成することで、複数のアプリ間でテンプレート名が衝突するのを防ぎます。
- テンプレートのパスは `templates/myapp/` となります。

### `form.html` と `results.html`

- `form.html`: ユーザーが国と指標を選択するフォームを表示するテンプレート。
- `results.html`: 選択されたデータの比較結果を表示するテンプレート。

### `views.py` とテンプレートの関係

- `views.py` で定義されたビュー関数が、対応するテンプレートをレンダリングします。

#### 例:

```python
from django.shortcuts import render

def form(request):
    return render(request, 'myapp/form.html')

def results(request):
    return render(request, 'myapp/results.html')
```


## 補足

### テンプレートディレクトリの設定

- Djangoはデフォルトで各アプリケーション内の `templates/` ディレクトリを検索します。
- 特別な設定を追加しなくても、上記の構成でテンプレートを認識します。

### テンプレート名の命名

- テンプレートファイルは、対応するビュー関数やページの役割がわかるような名前を付けると管理しやすくなります。

### 静的ファイルの配置

- CSSやJavaScriptなどの静的ファイルを使用する場合は、`static/` ディレクトリを作成し、同様にアプリ名のサブディレクトリを設けるとよいでしょう。

```bash
myapp/
└── static/
    └── myapp/
        ├── css/
        ├── js/
        └── images/
```
【自分用メモ】.wpress を解凍する方法

## 参考サイト

https://seory.co.jp/extract-all-in-one-wp-migration/

## 成功したやり方
Tractor（アプリ版）を使用する

https://traktor.wp-migration.com/


①open backup…をクリックして、解凍するファイルを選択
![スクリーンショット 2024-11-05 19.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/d5d41c4c-8851-162d-e6ba-fca732bba0f2.png)

②Extracto to…をクリックして、解凍場所を決める

③②で選択したフォルダを確認すると、解凍済みの該当ファイルがはいっています！
WebDriver を使用してChrome のシークレットモードでダイアログを出さずにファイルをダウンロードする方法

### 概要
やり方は、`chrome://policy/`にある`PromptForDownloadLocation`を `false`に設定する。
だけなのだが、レジストリ エディターで値の追加・編集を行う必要がある
Pythonで自動化するなら`subprocess`か`winreg`で対応するしか無さそう

:::note info
メリット
シークレットモードでファイルをダウンロードできるようになる
:::

:::note alert
デメリット
レジストリ エディターを編集できる権限が必要
WebDriverだけではなく、普段使っているブラウザにもポリシーが適応される
:::

参考URL
https://www.reddit.com/r/chrome/comments/15izrff/comment/kbgv0xe/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
<br>



### 試した環境
| アイテム | バージョン |
|:-|:-|
| OS| Windows 11 64bit |
| Python | 3.10.10 64bit |
| selenium | 4.26.0 |
| ChromeDriver | 130.0.6723.70 |



### 追加
```winbatch:管理者: コマンドプロンプト
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome" /v PromptForDownloadLocation /t REG_DWORD /d 0 /f
```

**言語化**
1. 左下のWindowsから `レジストリ エディター` を開く　または　Windowsキー + R で `regedit` と入力
2. 左列の折りたたみメニューから順に開いていく「コンピューター -> HKEY_LOCAL_MACHINE -> SOFTWARE -> Policies」
3. フォルダ名 `Policies` を「右クリック -> 新規 -> キー -> フォルダ名を`Google`」
4. フォルダ名 `Google` を「右クリック -> 新規 -> キー -> フォルダ名を`Chrome`」
5. フォルダ名 `Chrome` を「右クリック -> 新規 -> DWORD(32ビット)値 -> 名前を`PromptForDownloadLocation`」
6. 名前 `PromptForDownloadLocation` を「右クリック -> 修正 -> 値のデータを`0`」



### 削除
```winbatch:管理者: コマンドプロンプト
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome" /v PromptForDownloadLocation /f
```

**言語化**
1. 左下のWindowsから `レジストリ エディター` を開く　または　Windowsキー + R で `regedit` と入力
2. 左列の折りたたみメニューから順に開いていく「コンピューター -> HKEY_LOCAL_MACHINE -> SOFTWARE -> Policies -> Google -> Chrome」
3. 名前 `PromptForDownloadLocation` を「右クリック -> 削除」
<br>



### 各ブラウザのポリシー
Google Chromeで設定できたので、他ブラウザも同様に設定可能と思われる


#### Google Chrome
`HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome`

参考URL
https://chromeenterprise.google/policies/#PromptForDownloadLocation


#### Microsoft Edge
`HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge`

参考URL
https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies#promptfordownloadlocation


#### Mozilla Firefox
`HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Mozilla\Firefox`

参考URL
https://mozilla.github.io/policy-templates/#promptfordownloadlocation
WSL2にQt6をGitHubからインストールする手順

# はじめに
とあるプログラムを実行しようとしたらQt6が必要だったので、WSL2にインストールしようとしたら、aptが使用できず少し手間だったので手順を記しておきます。
事前にネットで調べたところ、aptでインストールできるようだったのですが(少なくともQt5は出来たようなのですが)、自分が試した限りではQt5もQt6もそんなパッケージが無いと言われてしまいましたので、何か変更になったようです。
QtはQtのホームページからインストーラを入手するのが公式の手順のようですが(補足参照)、Qtアカウントの作成とか必要だったので、GitHubからソースコードを取得し、ビルド、インストールしてみました。
とりあえず手近な3台のPCでは動作しています。

# インストール手順
ビルドするために以下のツールを事前にインストールします。一般的なものですので既に入っているかと思います。

`sudo apt -y install build-essential gcc g++ make cmake libtool texinfo dpkg-dev pkg-config`

以下はWSL2の環境に固有かも知れませんが必要です。
`sudo apt -y install libxcb-glx0 libglu1-mesa-dev libxcb-xinerama0 libxcb-cursor0`

準備が出来たら、以下の手順で、GitHubからソースコード一式を取得しビルド、インストールします。
```shell
cd /tmp
rm -rf qtbase
git clone https://github.com/qt/qtbase.git
cd qtbase
./configure --prefix=/usr/local -opensource
make
sudo make install
```

途中でエラーが出なければ成功です。

# MSYS2(MinGW)との干渉
前述の手順で、ビルド時にエラーとなるPCがありました。Makeの実行時に、Windowsネイティブ側のMSYS2(MinGW)を参照しようとして当然ながらエラーとなっていました。
どうやら、WindowsにMSYS2(MinGW)がインストールされていると、CMakeが環境を見誤ってmakefileを作ってしまうようです。WindowsからMSYS2(MinGW)をアンインストールしたところ正常に動作するようになりました。
試してませんが、アンインストールせずとも、PATHからMSYS2(MinGW)を外す、または、WSL2の設定でWindsowのPATH設定を引き継がないようにすれば大丈夫かと思います。先にMSYS2(MinGW)をアンインストールしてしまったので試せませんでした。

# 補足：Qtホームページからのインストール
以下のURLがQtのダウンロードページです。
`https://www.qt.io/ja-jp/download#eval-form-modal`

「すべての商用パッケージとコンポーネントを含む10日間の無料評価版」がどんとありますが、右側の「オープンソースについて」を選ぶと、オープンソース版のページに進み、下の方に「Download the Qt Online Installer」があります。Qtアカウントの作成が必要で、この時点で面倒になってGitHubから入手しました。
なお、Qtは商用ライセンスとオープンソース・ライセンス(GPL&LGPL)の選択がありますので、製品とか商利用を考えている方は良く調べましょう。本稿の手順はオープンソースです。ライセンス変更は出来ないようなので注意してください。

# 参考文献
[Qt のインストール（Ubuntu 上）](https://www.kkaneko.jp/tools/ubuntu/qt.html)