OmniAICreator/Qiita-1.07M huggingface dataset:
第2回：Pythonのデータ構造と関数

前回の記事 ⇒ <a href="https://qiita.com/mm02060116/items/55ac7350d60245c106e5">第1回：Pythonの基礎用語と文法</a>

第2回では、Pythonのプログラミングで頻繁に使用するデータ構造と、効率的にコードを組み立てるための「関数」の概念について解説する。
データ構造は、データを整理・格納・操作するための方法であり、Pythonにはさまざまなデータ構造が用意されています。これらのデータ構造と関数を理解することで、より効率的かつ柔軟なコードが書けるようになる。

目次

1.データ構造の基礎
　リスト（list）：リストの作成、アクセス、要素の追加/削除
　タプル（tuple）：リストとの違い、変更不可の性質
　辞書（dict）：キーと値のペアによるデータの管理
　集合（set）：重複しないデータの集合と操作
2.関数
　関数の定義と呼び出し：defキーワードと基本的な使い方
　引数と返り値：引数の指定方法と返り値の使い方
　スコープ：変数のスコープ（ローカルとグローバル）
3.ラムダ関数とリスト内包表記
　ラムダ関数：短い無名関数の作成方法
　リスト内包表記：forループを使わないリスト作成

1.データ構造の基礎
-
Pythonには、いくつかの主要なデータ構造があり、それぞれ異なる特徴と用途がある。
<strong>リスト（list）:</strong>
リストは、複数の要素を一括で管理できるデータ構造で、変更が可能です。要素にはインデックス（0から始まる番号）でアクセスできます。
```python:example.py
fruits = ["apple", "banana", "cherry"]
print(fruits[1])  # 出力: banana
```
<strong>要素の追加/削除:</strong>
要素を追加するには append() を、削除するには remove() または pop() を使います。
```python:example.py
fruits.append("orange")  # ["apple", "banana", "cherry", "orange"]
fruits.remove("banana")  # ["apple", "cherry", "orange"]
```

<strong>タプル（tuple）:</strong>
タプルはリストと似ていますが、要素を変更できないため、変更が不要なデータに向いています。
```python:example.py
coordinates = (10, 20)
print(coordinates[0])  # 出力: 10
```

<strong>辞書（dict）:</strong>
辞書は、キーと値のペアでデータを管理するデータ構造です。キーを使って要素にアクセスできます。
```python:example.py
student = {"name": "Alice", "age": 25}
print(student["name"])  # 出力: Alice
```
<strong>要素の追加/削除</strong>
新しいキーと値のペアを追加するには dict[key] = value、削除するには del dict[key] を使います。
```python:example.py
student["grade"] = "A"  # {"name": "Alice", "age": 25, "grade": "A"}
del student["age"]  # {"name": "Alice", "grade": "A"}
```

<strong>集合（set）：</strong>
集合は、重複しない要素を管理するデータ構造です。要素の順序は保証されません。
```python:example.py
unique_numbers = {1, 2, 3, 3, 4}
print(unique_numbers)  # 出力: {1, 2, 3, 4}
```

2.関数
-
関数は、特定の処理をまとめて再利用できるブロックです。繰り返し行う処理や、他の箇所でも使用する処理を関数として定義することで、コードをシンプルに保つことができます。

<strong>関数の定義と呼び出し：</strong>
def キーワードを使って関数を定義します。
```python:example.py
def greet():
    print("Hello, world!")

greet()  # 出力: Hello, world!
```

<strong>引数と返り値：</strong>
関数には引数を渡すことができ、処理の結果を返り値として返すことも可能です。
```python:example.py
def add(a, b):
    return a + b

result = add(5, 3)  # 出力: 8
```

<strong>スコープ（範囲）：</strong>
変数のスコープとは、変数が使える範囲のことです。関数内で定義された変数はローカルスコープに属し、関数外で定義された変数はグローバルスコープに属します。
```python:example.py
x = 10  # グローバルスコープ

def my_function():
    x = 5  # ローカルスコープ
    print(x)  # 出力: 5

my_function()
print(x)  # 出力: 10
```

3.ラムダ関数とリスト内包表記
-

<strong>ラムダ関数：</strong>
ラムダ関数は、短い無名関数を簡潔に書く方法です。特に一時的な関数が必要な場合に便利です。
```python:example.py
square = lambda x: x * x
print(square(5))  # 出力: 25
```

<strong>リスト内包表記：</strong>
リスト内包表記は、簡潔にリストを生成する方法です。通常のforループを使うよりも、シンプルで読みやすいコードが書けます。
```python:example.py
numbers = [1, 2, 3, 4]
squares = [x * x for x in numbers]
print(squares)  # 出力: [1, 4, 9, 16]
```

4.まとめ
-
第2回では、Pythonのデータ構造（リスト、タプル、辞書、集合）と関数について学びました。これらを組み合わせることで、プログラムが柔軟で再利用可能になり、効率的な開発が可能になります。
次回は、オブジェクト指向やモジュール、エラー処理など、より高度なPythonの使い方について解説します。
AWS Data Engineer Associate(DEA-01)受験に向けたメモ

# 最初に
AWS Data Engineer Associateの学習の際に気になった点をchat-GPT 4oに聞いた回答を下記にまとめています。もし、回答に不備・不足、誤りがあればコメントください。

## ①「aws のs3 queryとatheneって何が違いますか？どちらもSQLを使用して、ﾃﾞｰﾀを抽出するサービスで似ているサービスなのかなと思ったのですが。。」

### 主な違い

| **特徴**         | **S3 Query (S3 Select)**                      | **Amazon Athena**                                |
|------------------|-----------------------------------------------|--------------------------------------------------|
| **目的**         | 単一オブジェクトからデータを抽出              | 複数データセットを横断して分析                  |
| **対象**         | S3 に保存された単一ファイル                   | S3 に保存されたテーブルや複数ファイル           |
| **ユースケース** | 必要な部分データを効率よく取得                | 大規模データの分析                               |
| **パフォーマンス**| ファイル全体を読み込まないので高速            | 大規模なクエリを分散処理で効率的に実行          |
| **統合性**       | 個別データの取り出しに特化                    | BI ツールなどとの統合で高度な分析に対応         |

### どちらを選ぶべきか？
- シンプルなデータ抽出が目的で、**個別ファイル内の特定データを効率よく取得**したい場合は **S3 Select**。
- **大規模データ分析**や複数のデータセットを横断して分析を行いたい場合は **Athena** を選択するのが適しています。
KinoStlViewer で Three.js による 3D コンテンツを表示する

## はじめに

Three.js は HTML5 で 3D コンテンツを作成するためのライブラリです

https://threejs.org/

3D コンテンツのデータは STL (Standard Triangulated Language) という形式のファイルで扱います

KinoStlViewer は Livebook 上で STL ファイルを読み込み、コンテンツを表示します

https://github.com/bamorim/kino_stl_viewer/

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/kino/kino_stl_viewer.livemd

## セットアップ

セットアップセルで KinoStlViewer と、 Web 上から STL ファイルをダウンロードするための Req をインストールします

```elixir
Mix.install([
  {:kino_stl_viewer, "~> 0.1"},
  {:req, "~> 0.5"}
])
```

## 3D コンテンツの表示

3D コンテンツを表示するための viewer を用意します

```elixir
viewer = KinoStlViewer.new()
```

実行結果

![スクリーンショット 2024-11-17 11.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/24f81b2f-48a0-e34e-11c9-9d88c25cd82a.png)

この時点では灰色の四角形が表示されるだけです

次のコードで Web から STL ファイルを読み込んで `KinoStlViewer.load` に渡すと、 3D コンテンツが表示されます

```elixir
"https://raw.githubusercontent.com/Buildbee/example-stl/main/binary_cube.stl"
|> Req.get!()
|> Map.get(:body)
|> then(&KinoStlViewer.load(viewer, &1))
```

マウス操作でカメラ角度を変更できます

![kino_stl_viewer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6d88d4cc-e335-5a4f-354f-9437e97b74c4.gif)

STL ファイルはこちらのリポジトリーのものを使用しました

https://github.com/Buildbee/example-stl

## まとめ

KinoStlViewer で 3D コンテンツを表示することができました

JS と Elixir の間でデータをやり取りすれば、色々できそうですね
fishシェルのインストールと設定手順

この記事では、`fish`シェルをMacおよびWindows（WSL2 Ubuntu）にインストールし、デフォルトシェルとして設定する手順を説明します。  
`fish`は、直感的で使いやすいインタラクティブシェルです。従来のシェルと異なり、自動補完やシンタックスハイライトなど便利な機能が搭載されています。


## 開発環境
### Macの場合
- **OS:** macOS Sonoma 14.6.1

### Windows（WSL2 Ubuntu）の場合
- **OS:** Windows 11  
- **WSL:** Ubuntu 24.04


## インストール手順(Mac)

### Homebrewを使用してインストールします。

```bash
brew install fish
```

#### fishがインストールできているか確認
以下のコマンドを実行し、fishが起動することを確認します。

```bash
fish
```

#### 結果:

```plaintext
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
```


### デフォルトシェルをfishに切り替え
デフォルトシェルをfishに変更する手順を説明します。

#### fishのインストール確認

```bash
fish -v
```

バージョンが返ってきたら成功です。

#### fishのパスを確認

```bash
which fish
```

例: `/usr/local/bin/fish` （この結果をメモしておきます）  

`/etc/shells`にfishを追加  


以下のコマンドを実行して/etc/shellsを編集し、上記のfishのパスを末尾に追加します。

```bash
sudo -e /etc/shells
```

#### デフォルトシェルを変更

```bash
chsh -s /usr/local/bin/fish
```


## インストール手順(Windows WSL2 Ubuntu)

### Ubuntuの公式PPAを追加してインストールします。

```bash
sudo apt-add-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish -y
```

#### fishがインストールできているか確認
以下のコマンドを実行し、fishが起動することを確認します。

```bash
fish
```

#### 結果:

```plaintext
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
```

### fishのパスを確認

```bash
which fish
```

例: `/usr/bin/fish`

デフォルトシェルを変更

```bash
chsh -s /usr/bin/fish
```

再ログイン後、デフォルトシェルがfishになっていることを確認します。

## fishコマンド使用例
fishは、従来の｀bash`や`zsh`と異なり、コマンドの構文や仕様が異なる場合があります。例えば、環境変数の設定方法やループ構文などが異なります。

以下のGitHubページに、他のシェルとfishのコマンド比較がまとめられていますので、参考にしてください。

[Shell Translation Dictionary](https://github.com/fish-shell/fish-shell/wiki/Shell-Translation-Dictionary)
動的なJSONに対するGlueスキーマの安定化

# 背景と課題

![スクリーンショット 2024-11-17 10.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/05bccb02-4525-6cda-400c-2df30f9f9d28.png)

上記の構成図は、バックエンドのデータがDynamoDBに保存され、それをS3へエクスポートし、Glue TableからRedshiftまでのETLフローを示しています。
Glue Crawler（以後クローラー）は、JSONフィールドを自動的に解析し、その構造に基づいて適切なデータ型（struct型やarray型）に変換します。しかし、この自動変換において以下のような問題が発生します。

**スキーマの不一致**
- JSONの構造が動的に変化する場合、Glueスキーマに影響が発生
- クローラー実行のたびにスキーマ定義が不安定になる

# 解決方法

この問題を解決するために、JSONフィールドを強制的にstring型として固定します。  
これにより、JSONの構造が変化した場合でも、Glueのスキーマは変更されず、安定したデータ処理が実現できます。

# 期待される効果

JSONフィールドをstring型として扱うことで、以下の効果が得られます

**スキーマ変更の防止**
- JSONの構造が変化してもGlueスキーマへの影響を防止
- クローラー実行時のスキーマ変更を回避
- 後続のETL処理（例：GlueからRedshiftへのデータロード）時のエラーを防止

# まとめ

JSONデータの型をstring型に固定することで、動的に変化するJSONデータ構造に対してもGlueスキーマを安定的に保つことができます。
これにより、後続のETL処理を含むデータ分析基盤全体の安定運用が実現できます。
paiza.ioでelixir その329

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/a389b4f79a87dcc2b8fd


# サンプルコード

```

defmodule Abc114.C.Main do
  def main() do
    n = IO.read(:line) 
        |> String.trim() 
        |> String.to_integer()
    digits = Integer.to_string(n) 
        |> String.codepoints() 
        |> Enum.count()
    numbers(digits)
    |> Enum.filter(&(&1 <= n))
    |> Enum.count()
    |> IO.puts()
  end
  defp numbers(digits) do
    1..digits
    |> Enum.reduce([[]], fn _, list_of_lists ->
      Enum.reduce(list_of_lists, [], fn list, acc ->
        [[3 | list], [5 | list], [7 | list], list | acc]
      end)
    end)
    |> Enum.filter(fn list ->
      Enum.any?(list, &(&1 == 3)) and Enum.any?(list, &(&1 == 5)) and Enum.any?(list, &(&1 == 7))
    end)
    |> Enum.map(fn list ->
      Enum.join(list) 
      |> String.to_integer()
    end)
    |> MapSet.new()
  end
end

Abc114.C.Main.main()


```

# 実行結果

```
4
```

# 成果物
 
https://paiza.io/projects/aXMljuU2Ou0gu1XmEOS_wg


以上。
Android Studio の AI アシストをあえて無効にする方法

Android Studio Jellyfish から有効になった Gemini ちゃんによるコーディングアシスト。

https://developer.android.com/studio/preview/gemini/ai-code-completion#get_started

わたしはこの機能に助けられたことが何度かあります。特に、スクラッチ開発している時はどんどんアシストしてくれるので、開発が楽になりました。

## 便利だけれども、オフにしたい場面

ただし、時にはどうしてもアシスト機能をオフにしたい場面が登場します。それは学習する時です。

わたしは現在 Jetpack Compose を Codelab という学習ページを使って学習しています。

その時に AI アシストがオンになっていると、本来は自分が打ち込むところだったところをすぐにサジェストされてしまいます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/4be0e383-a979-c77e-027b-3ce74f37ad4d.png width=500>

グレーのコードがサジェストされている部分です。

サジェストされている状態だと、 TAB キーを 1 回押しただけで一気にコードが書かれます。

プログラミングを学習する時は、自ら手を動かさないとなかなか覚えることができません。 AI アシストは便利ですが、 TAB キー押しただけで実装が終わってしまうのは、学習という面ではプラスになりません。

なので、ここは**自らの心にムチを打って AI アシストをオフに**しましょう！

## オフにする方法

画面下にあるキラーンマークをクリックして

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/b9dce067-3ff4-c008-cdb4-48d23a88c934.png width=500>



`Configure Gemini` をクリックして設定画面に行きます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/73ccf692-427d-9724-cc10-1b222874600e.png width=500>

Genimi 設定の `Enable AI-based inline code completions` のチェックマークをはずします。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/3ec91340-ea68-33ce-e9f0-0224f51ecd0e.png width=500>
これによって AI アシストをオフにできます。

今回の記事は短いですが、以上です。

**Have a nice coding !!!**
「Cannot find type definition file for 'firebase'」のエラー解消

## 状況
以下のDockerfileで、コンテナイメージのビルドをする際に、`npm run build`のステップで`「Cannot find type definition file for 'firebase'」`のエラーが出てしまう。

```Dockerfile:【誤】Dockerfile
FROM node:18 AS build

COPY ./package.json
RUN npm install

COPY . .
RUN npm run build 

WORKDIR /app

COPY --from=build  .next ./.next
COPY --from=build node_modules ./node_modules
COPY --from=build package.json ./package.json
COPY --from=build package-lock.json ./package-lock.json

EXPOSE 3000

CMD npm run start
```

## 解決法
`COPY ./package.json`のステップを`COPY ./package*.json`に変更する

```Dockerfile:【正】Dockerfile
FROM node:18 AS build

COPY ./package*.json
RUN npm install

COPY . .
RUN npm run build 

WORKDIR /app

COPY --from=build  .next ./.next
COPY --from=build node_modules ./node_modules
COPY --from=build package.json ./package.json
COPY --from=build package-lock.json ./package-lock.json

EXPOSE 3000

CMD npm run start
```

## 原因
`package.json`だけをコピーし、`package-lock.json`をコピーせずに、`npm install`を実行してしまったこと。

### 「package.json」とは
package.jsonは、プロジェクトの基本情報と依存関係を記述するためのファイル

### 「package-lock.json」とは
package-lock.jsonは、プロジェクトの依存関係の正確なバージョンとその依存関係のツリーを記録するファイル

### 違いと必要性
両方のファイルを管理することで、「ある環境ではうまくいき、ある環境ではエラーが出る」といった問題を防ぐことができる

1. バージョン指定の精度:
    - package.json: バージョン範囲を指定（例: ^1.2.3）
    - package-lock.json: 正確なバージョンを指定（例: 1.2.3）
1. 依存関係の範囲:
    - package.json: 直接的な依存関係のみを記録
    - package-lock.json: 全ての依存関係（孫依存モジュールも含む）を記録
1. 更新頻度:
    - package.json: 開発者が手動で更新
    - package-lock.json: npm install時に自動的に更新
1. 目的:
    - package.json: プロジェクトの基本情報と依存関係の管理
    - package-lock.json: 環境間の一貫性の確保と再現性の保証

## 感想
package.jsonとpackage-lock.jsonを何となくで使っていたツケが回ってきた。

これを機に違いや役割を知れてよかった。
paiza.ioでelixir その328

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/f27b1dbd101def5ecec0

# サンプルコード
abc355_c
```

defmodule Main do
  def main do
    [n, _m] = IO.read(:line) 
        |> String.trim() 
        |> String.split(" ") 
        |> Enum.map(&String.to_integer/1)
    turns = IO.read(:line) 
        |> String.trim() 
        |> String.split(" ") 
        |> Enum.map(&String.to_integer/1)
    solve(turns, n)
    |> IO.puts()
  end
  def solve(turns, n) do
    turns
    |> Enum.with_index(1)
    |> Enum.reduce_while({0, 0, 0, %{}, 0, %{}}, fn {value, cnt}, {diagonal_1, diagonal_2, max_row_cnt, row_cnts, max_col_cnt, col_cnts} ->
      i = div(value - 1, n)
      j = rem(value - 1, n)
      new_diagonal_1 = if i == j, do: diagonal_1 + 1, else: diagonal_1
      new_diagonal_2 = if i + j == n - 1, do: diagonal_2 + 1, else: diagonal_2
      current_row_cnt = Map.get(row_cnts, i, 0)
      new_row_cnt = current_row_cnt + 1
      new_row_cnts = Map.put(row_cnts, i, new_row_cnt)
      new_max_row_cnt = if new_row_cnt > max_row_cnt, do: new_row_cnt, else: max_row_cnt
      current_col_cnt = Map.get(col_cnts, j, 0)
      new_col_cnt = current_col_cnt + 1
      new_col_cnts = Map.put(col_cnts, j, new_col_cnt)
      new_max_col_cnt = if new_col_cnt > max_col_cnt, do: new_col_cnt, else: max_col_cnt
      if new_diagonal_1 >= n or new_diagonal_2 >= n or new_max_row_cnt >= n or new_max_col_cnt >= n do
        {:halt, cnt}
      else
        {:cont, {new_diagonal_1, new_diagonal_2, new_max_row_cnt, new_row_cnts, new_max_col_cnt, new_col_cnts}}
      end
    end)
    |> do_solve()
  end
  defp do_solve({_, _, _, _, _, _}), do: -1
  defp do_solve(cnt), do: cnt
end

Main.main()


```

# 実行結果

```
4
```

# 成果物

https://paiza.io/projects/o8vuzmdmVGHwJ7_dL7JQGg

以上。
AWSの勉強をはじめた話 - VPCについて

## はじめに

AWSのVPC等の基礎について学び、その内容をまとめました。この記事が参考になれば幸いです。

最初に図を今回の全体像を乗せておきます。
![スクリーンショット 2024-11-19 19.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933685/834d6bd7-569f-3636-b66d-b3bc050e3ebb.png)


## リージョンとは？

AWSは、世界中の様々な地域でクラウドサービスを提供しています。これらの地域は「リージョン」と呼ばれ、「東京」や「オレゴン」などがその例です。リージョンを選ぶことで、ユーザーは物理的に近いサーバーを使用でき、ネットワークの遅延を抑えることができます。また、各国の法的要件への対応にも役立ちます。

## アベイラビリティゾーン (AZ)

各リージョンには、複数の「アベイラビリティゾーン (AZ)」があります。AZは1つまたは複数のデータセンターで構成されており、物理的に独立しています。複数のAZにまたがってリソースを配置することで、1つのAZが障害で停止しても、他のAZでシステムを稼働させることが可能です。これにより、高可用性を実現できます。

## VPC (Virtual Private Cloud)とは？

VPCは、AWS上に構築できる仮想的なネットワーク環境です。VPCを使用することで、AWS内のリソースをセキュアに管理し、運用できます。VPCは、選択したリージョン内に作成され、複数のAZにまたがって構築することができます。

## VPC内の構成 - サブネット

VPCの中でリソースを整理し、異なる用途に応じて分けるためには、「サブネット」を作成します。たとえば、公開されるWebサーバーと、非公開のDBサーバーを分けて配置する際に、異なるサブネットに配置することが一般的です。これにより、セキュリティや運用の効率が向上します。

## ベストプラクティス

サブネットは、複数のAZにまたがって配置するのが推奨されています。これにより、AZの一部に障害が発生しても、他のAZに配置されたリソースが稼働を続けることができ、高可用性を維持することができます。

## インターネットゲートウェイの役割

インターネットゲートウェイ (Internet Gateway) は、VPCがインターネットにアクセスできるようにするためのAWSサービスです。具体的には以下のような役割を担います：

- **インターネット接続の提供**：インターネットゲートウェイをVPCにアタッチすることで、そのVPC内のパブリックサブネットに配置されたリソースは、インターネットにアクセスしたり、インターネットからアクセスされたりすることができます。
- **双方向通信**：VPC内のインスタンスがインターネットを介して通信できるようにし、インターネットからの応答を受信することを可能にします。

## ルートテーブルの設定

インターネットゲートウェイを使用するためには、パブリックサブネットに対してルートテーブルを設定する必要があります。ルートテーブルには、VPC内の通信を制御するためのルートが含まれています。

1. **ルートテーブルの作成と紐づけ**：パブリックサブネットに対応するルートテーブルを作成し、パブリックサブネットに紐づけます。
2. **0.0.0.0/0のルート追加**：すべての通信を受け入れる0.0.0.0/0のルートを追加し、そのルートにインターネットゲートウェイを指定します。これにより、パブリックサブネット内のリソースはインターネットと接続できるようになります。

このように、インターネットゲートウェイとルートテーブルを適切に設定することで、VPC内のパブリックサブネットからインターネット接続が可能になります。

以上が、VPCの基本的な理解を深めるために学んだ内容です。これからAWSをさらに活用していく中で、VPCをより効果的に使っていきたいと思います。
paiza.ioでelixir その327

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/54ec41d12a4f84dd1773

# サンプルコード
abc350_c
```

defmodule Main do
  def main do
    n = IO.read(:line) 
        |> String.trim() 
        |> String.to_integer()
    list = IO.read(:line) 
        |> String.trim() 
        |> String.split(" ") 
        |> Enum.map(&String.to_integer/1)
    indexes = 0..(n - 1)
    index_map = list |> Enum.with_index(fn element, index -> 
            {index, element} 
        end) 
        |> Map.new()
    value_map = list 
        |> Enum.with_index() 
        |> Map.new()
    db = :ets.new(:example_db, [:ordered_set, :named_table])
    solve(indexes, index_map, value_map, db)
    |> IO.puts()
  end
  def solve(indexes, index_map, value_map, db) do
    indexes
    |> Enum.reduce({index_map, value_map, 0}, fn i, {acc_index_map, acc_value_map, cnt} ->
      value = acc_index_map[i]
      expected_value = i + 1
      if value == expected_value do
        {acc_index_map, acc_value_map, cnt}
      else
        index = acc_value_map[expected_value]
        new_acc_index_map = %{acc_index_map | i => expected_value, index => value}
        new_acc_value_map = %{acc_value_map | expected_value => i, value => index}
        :ets.insert(db, [{cnt, "#{expected_value} #{value}"}])
        new_cnt = cnt + 1
        {new_acc_index_map, new_acc_value_map, new_cnt}
      end
    end)
    |> elem(2)
    |> format()
  end
  defp format(0), do: "0"
  defp format(k) do
    str_operations = ((k - 1)..0)
    |> Enum.reduce("", fn i, acc ->
      [{_, operation}] = :ets.lookup(:example_db, i)
      "#{acc}\n#{operation}"
    end)
    "#{k}#{str_operations}"
  end
end

Main.main()



```

# 実行結果

```
2
2 4
1 3

```

# 成果物

https://paiza.io/projects/mhhuYkSVKCnf17fNBOjF3A

以上。
paiza.ioでelixir その326

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/3454a1425e677524fbff

# サンプルコード
abc349_c
```

defmodule Main do
  def main do
    s = IO.read(:line) 
        |> String.trim() 
        |> String.to_charlist()
    t = IO.read(:line) 
        |> String.trim() 
        |> String.downcase() 
        |> String.to_charlist()
    solve(s, t)
    |> IO.puts()
  end
  def solve(_list, 'x'), do: "Yes"
  def solve(_list, []), do: "Yes"
  def solve([], _target), do: "No"
  def solve([head | tail], [head | remain]) do
    solve(tail, remain)
  end
  def solve([_head | tail], target) do
    solve(tail, target)
  end
end

Main.main()




```

# 実行結果

```
Yes
```

# 成果物

https://paiza.io/projects/cH6zywI6Zc2guYCgf9xQnA

以上。
atcoderで好きな問題

最近競プロもう少しできるようになりたいと思いatcoderの過去問を解いたりコンテスト参加をしています。
その中で、回答が面白かった・綺麗で感動した、という問題を保存用として残していきます。随時更新です。
※解答例は最適化等されておらず、acしたもの、という基準で記載しています。

## AtCoder Beginner Contest 380 - D Strange Mirroring
与えられた文字列の末尾に反転した文字列を追加していき、得られる文字列における指定番号目の文字を出力するというもの。
bitを利用することでとても簡単に実装できる、良い問題な気がする。（解けなかったけど。）
また、思考は難しいのにコードが短くシンプル、という点が好き。

https://atcoder.jp/contests/abc380/tasks/abc380_d

（ruby参考回答）

```ruby
S = gets.chomp
Q = gets.chomp.to_i
K = gets.chomp.split(' ').map(&:to_i)
s_len = S.length

result = []

K.each do |k|
  bit_one_count = ((k - 1) / s_len).to_s(2).count('1')
  if bit_one_count.even?
    result << S[(k % s_len) - 1]
  else
    result << S[(k % s_len) - 1].swapcase
  end
end

puts result.join(' ')
```

## AtCoder Beginner Contest 313 - B Who is Saikyo?
何人かの人がいて、誰は誰よりも強い、ということを表す入力がされる。
その中で、ただ一人一番強い人を決められるかという問題。
例：3人、入力1: 1 2、入力2: 2 3
→ 1は2よりも強い、2は3よりも強い = 1は3よりも強い
よって1が最強の一人、とわかる。みたいな。

https://atcoder.jp/contests/abc313/tasks/abc313_b

初めて対峙した際は、1 2, 2 3と入力された際1,3の関係をどのように判定していくか？と思ったが、そのように力関係をすべて残していくのではなく、「**最強であれば誰にも負けていない && ただ一人と決まる場合、最強以外の人は必ず誰かに負けている**」と見ると、単純に各人ごと、自分を負かした人を記録していけば良くなる。

そして、誰にも負けていない（負かした人が0人）という人が1人だった場合、それを出力すれば良い。
うーん、賢い。

ruby 解答例
```ruby
N, M = gets.chomp.split(' ').map(&:to_i)
arr = Array.new(N) { [] }
M.times do
  st, we = gets.chomp.split(' ').map(&:to_i)
  arr[we - 1] << (st - 1)
end
result = []
arr.each_with_index do |a, i|
  result << (i + 1) if a.length == 0
end
if result.length == 1
  puts result[0]
else
  puts -1
end
```
paiza.ioでrust その15

# 概要
paiza.ioでrustやってみた。
練習問題やってみた。

# 練習問題
AtCoderをHashSetで解け。

# 方針
- proconioは、使わない。

# 参考にしたページ

https://note.com/kenquichi/n/nfbaeaf6d7e72

# サンプルコード
ABC085B
```
use std::io;
use std::collections::HashSet;

fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed read line");
    let n:usize = input.trim().parse().unwrap();
    let mut list:Vec<usize> = Vec::new();
    for _ in 0..n
    {
        input.clear();
        io::stdin().read_line(&mut input).expect("Failed read line");
        let n:usize = input.trim().parse().unwrap();
        list.push(n);
    }
    let res:HashSet<usize> = list.into_iter().collect();
    println!("{}", res.len());
}

```

# 実行結果

```
3
```

# 成果物

https://paiza.io/projects/REEahqsDWJGyZ2lvvTcUgg

以上。
Orale virtualbox マネージャーでのメモリの割り当て変更について

# 環境
Windows 10
windows 11
iMac(2017)　intel Core i5

# 記録した訳
>「７日間でハッキングを始める本」（野溝のみぞう著）のDay6で記載のある通りの「Device #1: Not enough allocatable device memory for this attack.」というエラーが表示されてhashcatが実行できませんでした。
Windows10では本の通り、
<font color="brown">「Kileのシャットダウンタウン」ーOracle VirtualBoxで「設定」ー「システム」</font>で割り当ての変更はすんなり行きましたが、**Windows11並びMac（intel）については手こずった**ので記録しました。

## Windows11の場合
><font color="brown">「仮想マシン」ー「保存状態を破棄」ー「設定」ー「システム」ー「メインメモリ」</font>で割り当ての変更が出来ました。
（「保存状態を破棄」で注意文言が出ましたが破棄にしました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/00fb8075-34ed-58e3-779f-5ecb0fe8b0f2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/434ba0db-9ab0-7b63-445c-ff97ca4d6981.png)


## iMac（intel）の場合
>Chat-GPTに確認ところ、以下により、システムのメインメモリの操作ができるようになりました。
<font color="brown">名前のところにある「スナップショット（私の場合は　７日間ハッキングDay1終了時点）」をクリックしてから「破棄」をクリック</font>

操作の仕方がそれぞれ違ったのと、ネットを調べても解らなかったので記録します。
【Mantine】CSS modules を利用する

# はじめに
この記事では、React 向けコンポーネントライブラリである Mantine のスタイル手法のひとつである CSS modules の利用方法を記載します。

https://mantine.dev/styles/css-modules/

Mantine のスタイル手法は複数ありますが、CSS modules がパフォーマンス面で最もよいとされています。

https://mantine.dev/styles/styles-performance/

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Next.js 14.2.4
- React 18.3.1
- TypeScript 5.5.2
- @mantine/core 7.13.2
- @mantine/hooks 7.13.2

# 事前準備
Next.js で Mantine を利用できるようにしておきます。
詳しい手順は以下の記事で記載しています。

https://qiita.com/Yasushi-Mo/items/3167fb2392e2e557d24b

# `className` prop を利用する
まず、`className` prop を利用した CSS modules のスタイル手法を試します。

`*.module.css` ファイルを作成し、スタイルを定義します。

```Button.module.css
.button {
  color: red;
}
```

`Button.module.css` をコンポーネントをレンダリングするファイルでインポートして `className` prop に渡します。

```page.tsx
import { Button } from "@mantine/core";
import classes from "./css_modules/Button.module.css";

export default function Demo() {
  return <Button className={classes.button}>Button</Button>;
}
```

テキストカラーが赤色のボタンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/f3e0ed2b-1f4b-3843-e94e-d46e36d81f76.png)

# `classNames` prop を利用する
次は `classNames` prop を利用してコンポーネント内部の要素（inner element）をスタイルする手法を試します。

inner element の selector は各コンポーネントのドキュメントで確認ができます。
今回は Button コンポーネントの `root` と `label` をスタイリングします。

https://mantine.dev/core/button/?t=styles-api

先ほどと同じく`*.module.css` ファイルを作成し、スタイルを定義します。

```Button.module.css
.root {
  background-color: pink;
}

.label {
  color: red;
}
```

`Button.module.css` をコンポーネントをレンダリングするファイルでインポートして `className` prop に渡します。

```page.tsx
import { Button } from "@mantine/core";
import classes from "./css_modules/Button.module.css";

export default function Demo() {
  return (
    <Button
      classNames={{
        root: classes.root,
        label: classes.label,
      }}
    >
      Button
    </Button>
  );
}

```

テキストカラーが赤色で背景色がピンク色のボタンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/dc849bfd-5795-3b5b-54dc-56c812ea3359.png)


また、テキストカラーが赤色であることは先ほどと同じですが、CSS 上では、button タグではなく、その内部の span タグで赤色が指定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/dd523a35-8e83-4556-2eb4-0eec572d5248.png)


# 参照
- [CSS modules](https://mantine.dev/styles/css-modules/)
- [Styles overview](https://mantine.dev/styles/styles-overview/)
- [Styles performance](https://mantine.dev/styles/styles-performance/)
WordPressのセキュリティ向上！正しいパーミッション設定ガイド

WordPressのディレクトリとファイルの適切なパーミッションを設定することは、セキュリティ上重要です。以下に、推奨されるパーミッションの設定手順を説明します。

---

### **推奨されるパーミッション設定**
1. **ディレクトリのパーミッション**:  
   ディレクトリは **`755`** に設定します。
   ```bash
   chmod 755 [ディレクトリ名]
   ```

2. **ファイルのパーミッション**:  
   ファイルは **`644`** に設定します。
   ```bash
   chmod 644 [ファイル名]
   ```

3. **重要ファイルの特別な権限設定**:  
   `wp-config.php` は特に機密性が高いため、**`600`** または **`640`** に設定します。

---

### **設定手順**
以下のコマンドでWordPress全体に適切なパーミッションを一括設定します。

#### 1. **ディレクトリに`755`を設定**
```bash
find /path/to/wordpress -type d -exec chmod 755 {} \;
```

#### 2. **ファイルに`644`を設定**
```bash
find /path/to/wordpress -type f -exec chmod 644 {} \;
```

#### 3. **`wp-config.php`のパーミッションを制限**
```bash
chmod 600 /path/to/wordpress/wp-config.php
```
または、Apacheユーザー（通常は`www-data`）がアクセスする必要がある場合は:
```bash
chmod 640 /path/to/wordpress/wp-config.php
```

---

### **所有権の設定**
WordPressが正しく動作するには、適切なユーザーとグループが所有権を持つ必要があります。通常、ApacheやNginxの実行ユーザーに設定します。

#### 1. **所有権を確認**
```bash
ls -l /path/to/wordpress
```

#### 2. **所有者を`www-data`に変更**（UbuntuのApacheの場合）
```bash
sudo chown -R www-data:www-data /path/to/wordpress
```

---

### **例: 現在のディレクトリでWordPressに適用**
あなたのディレクトリ構造が以下のようになっているとします：
- WordPressのパス: `/home/ubuntu/wordpress`

#### コマンド例:
```bash
# ディレクトリに755を設定
find /home/ubuntu/wordpress -type d -exec chmod 755 {} \;

# ファイルに644を設定
find /home/ubuntu/wordpress -type f -exec chmod 644 {} \;

# wp-config.phpに特別なパーミッションを設定
chmod 600 /home/ubuntu/wordpress/wp-config.php

# 所有者をwww-dataに設定
sudo chown -R www-data:www-data /home/ubuntu/wordpress
```

---

### **確認**
1. **パーミッションを確認**:
   ```bash
   ls -l /home/ubuntu/wordpress
   ```

2. **WordPressにアクセス**:
   ブラウザでWordPressサイトにアクセスして、正常に動作することを確認します。

---

### **補足**
- **キャッシュディレクトリ**: プラグインやテーマがキャッシュディレクトリ（例: `wp-content/cache`）を作成する場合、書き込み権限（`775`または`777`）が必要になることがあります。ただし、`777`は避けるべきです。
- **アップロードディレクトリ**: `wp-content/uploads` もApacheが書き込めるように所有権を設定してください。

---
Azure Static Web Apps に .NET 8 の Azure Functions を追加してみた

以前書いた下記の Azure Static Web Apps を参考に、Vite + Vue + Azure Functions を .NET 8 で試してみました。

https://qiita.com/mnrst/items/70f61d9a380b033afc03

## フロントエンドの Vite + Vue をローカルで動かす

```zsh:zsh
prefix=mnrswadev
region=eastasia

npm create vite@latest $prefix -- --template=vue-ts

cd $prefix

npm install

npm run dev

open http://localhost:5173/
```

## バックエンドの Azure Functions を追加

```zsh:zsh
func init api --worker-runtime dotnet-isolated --target-framework net8.0

cd api

func new --name Hello --template HttpTrigger

func start

cd ..
```

## フロントエンドからバックエンドの API を呼び出すコードに変更

```vue:HelloWorld.vue
<script setup lang="ts">
import { ref } from 'vue'

defineProps<{ msg: string }>()

const count = ref(0)
</script>

<template>
  <h1>{{ msg }}</h1>

  <div class="card">
    <button type="button" @click="count++">count is {{ count }}</button>
  </div>

  <p v-if="message">{{ message }}</p>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  data() {
    return {
      message: "" as string,
    };
  },
  async mounted() {
    try {
      const response = await fetch("/api/hello");
      if (response.ok) {
        const data = await response.text();
        this.message = data;
      }
    } catch (error) {
      console.error("API呼び出しエラー:", error);
    }
  },
});
</script>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>
```

## swa コマンドでフロントエンドとバックエンドを統合して動作確認

```zsh:zsh
swa start http://localhost:5173 -i api

open http://localhost:4280
```

## 動作確認

下記赤枠に API 経由のレスポンステキストが表示されました。

![swa-functions-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e7de9bb8-9376-c96c-9673-061a0ea4aa7d.png)

## 参考

https://learn.microsoft.com/ja-jp/azure/static-web-apps/add-api?tabs=vanilla-javascript
目指せ認定心理士⑤＋卒業（産能通信）

<img width="400" alt="学位記" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/7805043d-9d7a-5ac3-3063-393db869ef0b.jpeg">

今回の記事では、2024年7月～11月の振り返りをしたいと思います。産業能率大学を無事に<b><font color="red">卒業</font></b>することができました。最終の修得単位数は、<b>182</b> 単位でした。スクーリングは、6月29日、6月30日に受講した社会心理学が最後でした。卒業研究は8月にS評価をいただけました。最終の GPA は<b>2.85</b>でした。

![GWidFo4XcAA9yZI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/3817619c-a47c-ff54-927a-2f042f31b3ea.png)

なお、心理学実験演習Ⅱの単位修得で<a href="https://qiita.com/skizaki/items/d216d6208d524cfb7609#%E8%AA%8D%E5%AE%9A%E5%BF%83%E7%90%86%E5%A3%AB">認定心理士</a>の要件を満たすことができたため、仮申請を行いました。

## 認定心理士の申請方法

電子申請もしくは郵送にて書類を送付して認定をしてもらいます。私の場合は、電子申請をしたので以下の流れになります。電子申請は、審査に必要な情報をウェブフォームに入力して申請します。別途、卒業証明書（卒業見込証明書）、成績証明書の郵送は必要になります。最初はログインID、パスワードの設定が必要になります。

### 電子申請の流れ
<ol>
<li>必要単位修得</li>
<li>申請情報入力</li>
<li>申請</li>
<li>審査料支払</li>
<li>事務局受付</li>
<li>審査</li>
<li>合否決定</li>
<li>認定料支払</li>
<li>資格取得</li>
</ol>

https://psych.or.jp/qualification/shinsei_shinrishi_densi

### 資格認定委員会
認定委員会は、申請者が提出した「心理学関係科目修得単位表」に記載された内容を中心とする書類審査によって認定の可否を決定します。通常は申請書類提出後2～3か月程度で結論が出ますが、再審査になると最終審査結果が得られるまでにさらに2～3か月かかることになります。書類の申請期間の〆切と資格認定委員会の日程は決まっているため、〆切に間に合うように書類を準備する必要があります。

https://psych.or.jp/qualification/iinkai_details/

### 費用について
電子申請を行う際に審査料がまずかかります。審査料は 11,000 円です。さらに認定料が 33,000 円かかります。合計で<font color="red"> 44,000 円</font>は必要になります。その他、卒業証明書（卒業見込証明書）、成績証明書を発行費用や郵送料などがかかります。

### 心理学実験演習Ⅱの合格から認定までの流れ（ご参考）

7/4に心理学実験演習Ⅱに合格したため、その日に電子申請を行いました。電子申請はウェブでポチポチしていきますが、学会に提出する成績証明書と内容が一致していないと書類不備で返されてしまいます。１科目ごとに合っているか確認する必要があります。なお、私は書類不備で２回も書き直しになってしまったので注意してください。

7/4　心理学実験演習Ⅱ　合格（5月、6月に受講した分）

7/4　電子申請を実施。申請審査料11,000円を支払い（クレジット払い）

8/9　申請内容不備（成績証明書に記載の年次と異なる）
※自分が履修した年度を記載してしまったため。成績証明書を確認して実際に修得した年度を書く必要がありました。例えば、消費者心理学は2023年の時点で履修しましたが不合格が続いたため、2024年に合格しました。⇒この場合、記載する年度は2024年になります。

9/4　申請内容不備（修正した科目のシラバスを添付せよ）
※8/9に手動で修正した分は、対象のシラバスが必要とのことでした。わかりずらい、というか前回指摘してほしかった。

9/26　申請データ受付

9/29　産業能率大学卒業

10/12　認定委員会において合格

10/17　合格通知および、申請認定料33,000円の支払い（クレジット払い）

10/30　仮認定証到着⇒認定申請書、卒業証明書送付

11/12　認定心理士証着

11/15　学位記着

<img width="400" alt="認定心理士認定証" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/0f593580-4bf4-d986-aa35-26e09156fd9b.jpeg">

### 感想
産業能率大学の３年次編入から卒業まで走り抜けた感じです。元々、認定心理士という資格自体を知らなかったところからスタートしましたが、大学で心理学系の科目や資格試験の合格を目指すことで、心理学についての基礎的な知識が身に付いたと思います。認定心理士を持っていると、基礎資格として取得が目指せる心理系の資格（例えば心理相談員など）もあります。さらに最近では、認定心理士でも求人もあるため、今後、この資格が役立つ可能性もあります。

## 過去の記事
### 心理学系の資格を目指す
https://qiita.com/skizaki/items/d216d6208d524cfb7609

### 目指せ認定心理士①（産能通信）
https://qiita.com/skizaki/items/56beab4e4abb9d6a15ea

### 目指せ認定心理士②（産能通信）
https://qiita.com/skizaki/items/ce1bef9a839b64e8a375

### 目指せ認定心理士③（産能通信）
https://qiita.com/skizaki/items/1f3d2921f08777ee00b3

### 目指せ認定心理士④（産能通信）
https://qiita.com/skizaki/items/d5870c5ec53750c32b9d

※随時、ブログを更新します。
pyinstallerで作成したexeからultralytics yolov8.ptをTensorRT（yolov8.engine）にどうしてもエクスポートしたい人

Ultralytics yolov8を利用したWindows向け物体検出アプリを作成しています。

https://qiita.com/calcMCalcm/items/178901c752f6cef481f1

先日、ultralyticsのDiscordでアドバイスを頂き、コードの修正をしました。

https://qiita.com/calcMCalcm/items/c6388a6df5fa66a56a3d

その時、処理速度の改善案として、TensorRTへのエクスポートと利用もアドバイス頂きました。
以前はコードがおかしかったのでTensorRTを利用しても性能がでませんでしたが、今回はより正しいコードになっているため、TensorRTの効果が発揮できるかもしれない！と思い、実装してみました。

## 結論
pyinstaller実行時に特にエラーは出ていませんでしたが、```\site-packages\tensorrt_libs```がexe側の```_internal```配下にコピーされていませんでした。
フォルダ配下のDLL、
nvinfer_10.dll
nvinfer_builder_resource_10.dll
nvinfer_plugin_10.dll
nvonnxparser_10.dll
をpyinstallerのspecの```binaries```に記載することで、コピーされるようになり、exeからtensorrtエクスポートが実行できるようになりました。
（但し開発環境での話で、他のcuda tool kitが入っていない環境でエクスポートが動くかは未確認）
```pyinstaller.spec（抜粋）
binaries=[('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvinfer_10.dll','.\\tensorrt_libs'),('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvinfer_builder_resource_10.dll','.\\tensorrt_libs'),('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvinfer_plugin_10.dll','.\\tensorrt_libs'),('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvonnxparser_10.dll','.\\tensorrt_libs'),],
```

## 但し弊環境では
上記の設定でexeよりTensorRTにエクスポートできるようになりますが、exeでyolov8.engineを利用して物体検出をしても、当方の環境では思っていたほど性能がでませんでした。
原因は細かく検証はできていませんが恐らく、
- torch-tensorrtによって、torchでもtensorrt並みに性能が出るようになっている
- pyinstallerによるexeでのオーバーヘッドが大きい可能性

あたりではないかと想像しています。

EXEアプリでの、.pt、.engineでの同じ動画の処理した結果は次の通りでした。
![スクリーンショット 2024-11-17 063507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/86baf8a2-b79a-9c99-1b36-11a9c95e51af.jpeg)
![スクリーンショット 2024-11-17 063535.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/e6b33756-1889-a376-d98b-6ed09279deb4.jpeg)

TensorRTエクスポート機能を追加するには、
- tensorrt 10.6.0
- onnx 1.17.0
- onnxslim 0.1.39
- onnxruntime-gpu 1.20.0

のライブラリを新たにexeに追加する必要があり、配布するファイルサイズが増大すること、
またTensorRTエクスポート処理が、初回に5分程度時間を要するということから、pyinstallerでのexeファイルにおいては、メリットよりもデメリットの方が大きそうなので、TensorRTエクスポート機能は実装しない方向になりそうです

## 環境
intel 11400F
geforce 4700tiSUPER
windows11 23H2
python 3.11
pyinstaller 6.10.0
ultralytics　8.2.82
tensorrt 10.6.0
onnx 1.17.0
onnxslim 0.1.39
onnxruntime-gpu 1.20.0

TensorRTへエクスポートするコード。imgszは学習や検出と同じに設定。
```
model.export(format="engine",imgsz=1280, half=True, dynamic=True)
```

## 20241118追記
pyinstallerで作ったexeではなく、Pythonで実行した時には、TensorRTの方が速かったです。
だいたいですが、
yolov8.pt　25FPS
yolov8.engine　28FPS
なので、ultralyticsやTensorRTは悪くないよ！
生産性を飛躍的に向上させる！？個人的に使ってみたいAIツール5選

# はじめに

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
今回はさまざまなAIツールが出ている中で、個人的に感動したもの、使ってみたいと思ったものを5つご紹介をしたいと思います。

最後まで読んでもらえると幸いです。


# Gamma

https://gamma.app/

**Gamma** は、AIを活用してプレゼン資料を自動生成するツールです。
テキストを入力するだけで、プロ顔負けのスライドを短時間で作成できるのが特徴です。
キーワードや箇条書きを入力するだけで、自動的に構成やデザインを提案する機能が優れており、視覚的に魅力的なスライドを簡単に生成できます。また、テーマやフォント、カラーパレットのカスタマイズが可能で、企業ブランドに合わせた資料作成も簡単です。


## v0

https://vercel.com/login/v0?next=%2Fapi%2Fvercel-auth%3FredirectUrl%3Dhttps%253A%252F%252Fv0.dev%252Fapi%252Fauth%252Fcallback%26qs%3D%26clientId%3Dv0

**Vercel** が提供するAIを活用したUIデザインおよびコード生成ツールです。ユーザーがテキストや画像で指示を入力すると、AIがそれに基づいてUIを自動生成し、Next.jsやTailwind CSSなどの技術スタックでコードを出力します。AIとコミュニケーションを取りながらUIを作成できます。また、生成されたUIに対してテキストプロンプトで変更や追加を行うことができ、細かな調整が可能です。

## GEAR.indigo

https://gearindigo.app/

AIを活用した開発支援ツールで、ソフトウェア開発の各工程を効率化します。主な特徴として、要件定義から設計などのドキュメント作成を一貫してサポートする点が挙げられます。**要件定義書や設計書の自動生成機能** により、手動でのドキュメント作成の手間を省けます。また、生成された機能リストと画面リストに基づいて、必要なプロジェクト構造と開発コストの見積もります。


## Replit Agent

https://docs.replit.com/replitai/agent

**Replit** が提供するAI搭載の開発支援ツールで、ユーザーが自然言語で指示を出すだけで、Webアプリケーションのフロントエンドからバックエンドまで自動的に構築します。プログラミングの専門知識がないユーザーでも、画面のデザインだけでなく、データベースの設定まで自動で対応してくれるため、本格的なWebアプリケーションの開発が可能です。

## Cursor

https://www.cursor.com/

AIを活用したコードエディタで、Visual Studio Code をフォークして作られているため、VSCode からのスムーズな移行ができます。そのため、Github Copilot も併用できます。Cursorは、コードの自動生成や補完、エラー検出と修正提案などの機能を備え、開発者の生産性を大幅に向上させます。

## まとめ

コード生成やプロジェクト工程の効率化といったAIツールの利点を最大限活かすことで、エンジニアはより重要な業務に集中できそうです。システム設計やアーキテクチャの選定、セキュリティ設計、パフォーマンス最適化など、人間の深い理解や判断が求められる業務はまだまだAIツールでは代替できない印象です。そのため、 **『業務の生産性を飛躍的に向上させてくれるサポートツール』** としてAIと向き合っていければと思います！

今後も良いAIツールがあれば、本記事に追加していく予定です！

# おまけ

弊社のご紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

### エンジニアリングの募集

https://www.wantedly.com/projects/1808638

### PM・Webディレクションの募集

https://www.wantedly.com/projects/1355235

### セールス・事業開発の募集

https://www.wantedly.com/projects/1792065

### コーポレート系の募集

https://www.wantedly.com/projects/1752874

### コンサルティングの募集

https://www.wantedly.com/projects/1794481

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
nRF52840のADCで電源電圧を読み出してみた。

## 要約
Nordic Semiconductor社製SoC nRF52840のAD変換器でVDDH電圧, VDD電圧を読み出す。

## コード
### prj.conf
```c
CONFIG_ADC=y
```

### app.overlay
```text
/ {
	zephyr,user {
		io-channels = <&adc 0>, <&adc 1>;
	};
};

&adc {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";
	channel@0 {
		reg = <0>;
		zephyr,gain = "ADC_GAIN_1_2";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,input-positive = <NRF_SAADC_VDDHDIV5>;
		zephyr,resolution = <12>;
	};
	channel@1 {
		reg = <1>;
		zephyr,gain = "ADC_GAIN_1_6";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,input-positive = <NRF_SAADC_VDD>;
		zephyr,resolution = <12>;
	};
};
```

### C
```c
#include <zephyr/drivers/adc.h>

#define DT_SPEC_AND_COMMA(node_id, prop, idx) \
  ADC_DT_SPEC_GET_BY_IDX(node_id, idx),

static const struct adc_dt_spec adc_channels[] = {
    DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, DT_SPEC_AND_COMMA)};

static uint16_t buf[ARRAY_SIZE(adc_channels)];
static struct adc_sequence sequence[ARRAY_SIZE(adc_channels)];

void adc_initialize(void) {
  int err;
  for (size_t i = 0U; i < ARRAY_SIZE(adc_channels); i++) {
    if (!adc_is_ready_dt(&adc_channels[i])) {
      return;
    }
    err = adc_channel_setup_dt(&adc_channels[i]);
    if (err < 0) {
      return;
    }
    sequence[i].buffer = &buf[i];
    sequence[i].buffer_size = sizeof(buf[i]);
  }
}

void adc_update(void) {
  int err;
  for (size_t i = 0U; i < ARRAY_SIZE(adc_channels); i++) {
    (void)adc_sequence_init_dt(&adc_channels[i], &sequence[i]);
    err = adc_read_dt(&adc_channels[i], &sequence[i]);
    if (err < 0) {
      return;
    }
  }
}

int32_t adc_get(const uint8_t kIdx) {
  int err;
  int32_t val_mv;
  if (ARRAY_SIZE(adc_channels) <= kIdx) {
    return -1;
  }

  if (adc_channels[kIdx].channel_cfg.differential) {
    val_mv = (int32_t)((int16_t)buf[kIdx]);
  } else {
    val_mv = (int32_t)buf[kIdx];
  }

  if (0 == kIdx) {
    val_mv *= 5;  // VDDH DIV 5
  }

  err = adc_raw_to_millivolts_dt(&adc_channels[kIdx], &val_mv);
  if (err < 0) {
    return -1;
  } else {
    return val_mv;
  }
  return -1;
}
```

## 設計メモ
- 内蔵リファレンス電圧は0.6V。（余談: nRF54L15は0.9Vらしい）
- VDDの動作範囲は1.7V〜3.6Vなので、Gainは1/6倍を選択すればリファレンス電圧を超えない。
- VDDHの動作範囲は2.5V〜5.5V、AD変換器の入力時点で1/5されているので、Gainは1/2倍を選択すればリファレンス電圧を超えない。

## 今後の取り組み
- VDDHDIV5はインピーダンスが高いためか、直前のAD変換結果の影響を受けているような気がするので、アクイジションタイムを長くする、事前にサンプルホールドキャパシタを放電させる等の対策を実施したい。 

## 動作確認環境
- toolchains v2.6.2
- nRF Connect SDK v2.6.2
- MDBT50Q-DB-40 (raytac_mdbt50q_db_40_nrf52840)

## 参考文献
- https://academy.nordicsemi.com/courses/nrf-connect-sdk-intermediate/lessons/lesson-6-analog-to-digital-converter-adc/
- https://github.com/zephyrproject-rtos/zephyr/tree/zephyr-v3.5.0/samples/drivers/adc
DatabricksノートブックのSQLセルでも_sqldfが使えるようになりました

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

https://docs.databricks.com/en/release-notes/product/2024/november.html#reuse-sql-outputs-as-_sqldf-in-subsequent-sql-cells

**`_sqldf`を用いた後続のSQLセルでのSQLアウトプットの再利用**

> Databricksランタイム14.3以降では、DatabricksノートブックでSQLクエリーを実行すると、後続のSQLセルで利用できる暗黙的なデータフレーム(`_sqldf`)を生成します。これは、Databricks 13.3で導入されたPythonの`_sqldf`変数の活用に対する追加サポートとなります。[SQLセルの結果の探索](https://docs.databricks.com/ja/notebooks/notebooks-code.html#implicit-sql-df)をご覧ください。

試してみます。ちなみにサーバレスコンピュートでも使えました。

```sql
%sql
SELECT * FROM takaakiyayoi_catalog.ai_functions.blog
```

![Screenshot 2024-11-17 at 7.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/02eddeee-4e7d-34ef-6357-fb3c25aa4d88.png)

結果の下にSQLセルでも使える旨が表示されています。

まずは、Pythonセルで。こちらは以前からサポートされていた機能です。

```py
display(_sqldf)
```

アクセスできました。

![Screenshot 2024-11-17 at 7.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9ecf8087-3a73-f13d-0879-687ad7da573f.png)

次はSQLセルで。

```sql
%sql
SELECT * FROM _sqldf
```

こちらも動きました。

![Screenshot 2024-11-17 at 7.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4dadf5c9-b8bb-21a9-7fcb-e86e075b20fa.png)

地味なエンハンスではありますが、開発体験の改善に寄与するものだと思います。

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
「順番通りやる」の落とし穴 - 私がイテレーティブ開発に惚れた理由

## 始めに
お久しぶりです、るんるんです。

私は自社開発の会社で、 web サービスを開発しています。その中で様々なプロダクトにアサインされ、チーム開発の難しさに何度も直面しました。

ふと思い返すと、この難しさは「チーム開発手法」が原因ではと思い、プロダクトで採用されていた開発手法を調べてみました。
するとどうやら、我々は「インクリメンタル開発」とやらをやっていたそうです。そしてそれに似た概念として「イテレーティブ開発」とやらもあるそうです。

今回はこの2つの開発手法を比較して、どっちのが良いのかを判定したいと思います(短絡的)

## 結論
自社開発系のプロダクトには、

**イテレーティブ開発を導入すべし**

です。

なぜこのような結論になったのか、見て行ってくれればと思います！

## インクリメンタル開発 と イテレーティブ開発

インクリメンタル開発とイテレーティブ開発についてそれぞれどのような特徴を持つのかを説明していきたいと思います。(知ってる人は読み飛ばしてください)

![incremental-iterative.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518711/d7f0604f-fa7c-359b-b622-b16f93225b7e.png)


インクリメンタル開発は、いわゆる増分開発です。一つひとつ機能を足していき、完成系を目指す手法を指します。
**中間成果物に価値が認められないのが大きな特徴です。**

イテレーティブ開発は、イテレーション(=繰り返し)毎に開発目標を定め、機能を強化していきます。インクリメンタルに対して、 **最初から価値を作り出します。** 最初は最低限の機能しかありませんが、イテレーション毎に洗練されていくイメージです。


## インクリメンタル開発失敗事例紹介
冒頭で説明した通り、私の会社では自然に( ~惰性で~ )「インクリメンタル開発」が採用されていました。
ここではインクリメンタル開発手法による失敗例を紹介したいと思います

### チーム内で方向性が定まらない
私はサーバーサイドを担当しており、APIを開発したりします。
しかし次のようなことがよく起こりました。

- UI での動作確認をしたいが、フロント側はまだそこに手を付けていないので、待ちが発生する
- いざ UI が完成したら、サーバー側のバグが見つかり手戻りが発生する


### いざプロトタイプ化したら微妙だった
あるプロダクトでの出来事です。
3ヶ月程度のプロダクトだったのですが、フロントエンド担当とバックエンド担当(私)、デザイン担当で別れてそれぞれの完成系を目指して動いていました。
3者が完成した段階でマージして、プロトタイプを作成しました。

しかしいざそのプロトタイプを触ってみると、**デザイン・UIがあまりに微妙だった**のです。キックオフしてから3ヶ月立った段階で、デザイン・UIを1から作り直すことになりました。

2時間*2 のミーティングで話し合ったが正解は出ず、そのままそれぞれのメンバーが違うプロダクトにアサインされ、半お蔵入り状態になっています(現在進行形)。


## どうすれば良かったのか - イテレーティブによる攻略
これらの失敗をイテレーティブ開発で攻略してみようと思います。

### チーム全体の週次目標を立てる
チーム全体でこの1週間何をするのかを話し合い、実行することです。
大事なのは、「チーム全体での目標」であることです。「フロントエンドはこれやります、バックエンドはこれやります」ではなく(インクリメンタルな考え方)、**チームとして何をやるかを共通化する**ことです。

メリットは開発障壁を取り除きやすいことです。
例えば、「サーバー側のエンジニアが UI での動作を見たいが、 フロントの人がやってないから待ちが発生する」ということが起きません。API と UI を同時に開発して結合することで、手戻りも発生せず修正点もすぐに判明します。


### 週次でのアプトプット
チームでの目標を立てたら、**アウトプット**します。
アウトプットの方法としては、社内SNSにて更新内容をプレゼンしたり、開発用環境を公開してプロダクトメンバー以外の人に見てもらうなどです。
特に開発用環境を公開することで、考えもしなかったフィードバックを貰えます。

また一週間でアウトプットしないといけないという緊張感も発生します。やりすぎは注意ですが、あまり納期がない自社開発系のエンジニアには有効な緊張感だと思います。

キックオフして間もないと環境を公開は難しいと思うので、社内SNSで文面や画像だけでも公開すると良いと思います。

## 結び
如何だったでしょうか。
インクリメンタル開発で幾度も失敗してきたからこそ、イテレーティブ開発を取り入れるべきだという結論になりました。
これからはイテレーティブ開発を目指してチーム開発していきますが、もしかしたらインクリメンタル開発に戻ってくるかもしれません。
**まぁやってみないと分からない。** そういうことですね。

## 追伸
自分のブログサイト：runTech を開設しました。しばらく Qiita と同時更新しようと考えていますが、将来的にこちらをメインで運用したいと思います。ぜひチェックして頂けると幸いです。

https://runtech-blog.netlify.app/
UbuntuでFTPを使ったファイル転送を簡単に行う方法

UbuntuでFTP接続する方法を以下に説明します。

### **1. FTPクライアントをインストールする**
Ubuntuでは、FTPクライアントとして以下のようなソフトウェアを使用できます。

#### コマンドラインベース
1. **`ftp`コマンド**:
   - デフォルトでインストールされていますが、インストールされていない場合は以下のコマンドでインストールします。
     ```bash
     sudo apt update
     sudo apt install ftp
     ```

2. **`lftp`コマンド**（高機能FTPクライアント）:
   - 高機能なコマンドラインFTPクライアントを使用したい場合におすすめです。
     ```bash
     sudo apt update
     sudo apt install lftp
     ```

#### GUIベース
1. **FileZilla**（GUI FTPクライアント）:
   - 使いやすいGUIクライアントです。
     ```bash
     sudo apt update
     sudo apt install filezilla
     ```

---

### **2. FTPサーバーに接続する**

#### **方法1: `ftp`コマンドを使用**
1. ターミナルを開き、以下のコマンドを入力します。
   ```bash
   ftp [FTPサーバーのアドレス]
   ```
   例: 
   ```bash
   ftp ftp.example.com
   ```
2. ユーザー名とパスワードを入力します。

3. 接続後、以下のようなコマンドを使用できます。
   - ファイル一覧を表示:
     ```bash
     ls
     ```
   - ファイルをダウンロード:
     ```bash
     get ファイル名
     ```
   - ファイルをアップロード:
     ```bash
     put ファイル名
     ```
   - 接続を終了:
     ```bash
     bye
     ```

#### **方法2: `lftp`コマンドを使用**
1. 以下のコマンドでFTPサーバーに接続します。
   ```bash
   lftp [FTPサーバーのアドレス]
   ```
   例:
   ```bash
   lftp ftp.example.com
   ```
2. 接続後、ユーザー名とパスワードを入力します。
3. 基本コマンド（`ftp`と類似）を使用できます。
   - ファイル一覧を表示:
     ```bash
     ls
     ```
   - ファイルをダウンロード:
     ```bash
     get ファイル名
     ```
   - ファイルをアップロード:
     ```bash
     put ファイル名
     ```
   - 接続を終了:
     ```bash
     exit
     ```

#### **方法3: FileZilla（GUIクライアント）を使用**
1. **FileZillaを起動**します。
2. 上部の「ホスト」、「ユーザー名」、「パスワード」、「ポート番号」を入力して接続します。
   - ホスト: FTPサーバーのアドレス
   - ユーザー名: FTPユーザー名
   - パスワード: FTPパスワード
   - ポート番号: 通常21（FTPのデフォルトポート）
3. 接続後、ドラッグ＆ドロップで簡単にファイルをアップロード・ダウンロードできます。

---

### **3. 注意点**
- **セキュリティ**:
  - FTPは暗号化されていないため、可能であればFTPS（FTP Secure）またはSFTP（SSH File Transfer Protocol）を使用することをおすすめします。
  - SFTPを使用する場合は、`ssh`を有効化して`scp`や`sftp`コマンドを使用します。

- **ファイアウォールの設定**:
  - サーバー側のファイアウォールがFTP接続を許可していることを確認してください。
RealESRGANを使うとNo module named 'torchvision.transforms.functional_tensor'とエラーが出る件について

この記事にたどり着いたお前はそもそもRealESRGANの実装方法を間違えてる。
https://github.com/xinntao/Real-ESRGAN/tree/master
```
# Install basicsr - https://github.com/xinntao/BasicSR
# We use BasicSR for both training and inference
pip install basicsr
# facexlib and gfpgan are for face enhancement
pip install facexlib
pip install gfpgan
pip install -r requirements.txt
python setup.py develop
```

# やり方
上記のgitをどこでもいいのでクローンします。
次に上記のコマンドを打ちます。

終わり

# おまけ
pythonで動かし方を教えます。
```python
import cv2
from realesrgan import RealESRGANer
from basicsr.archs.rrdbnet_arch import RRDBNet

# Real-ESRGANの設定
model_path = 'Real-ESRGAN/weights/realesr-general-x4v3.pth'  # ダウンロードしたモデルのパス
scale = 4  # 拡大倍率

# デバイスの設定（GPUが使用可能な場合はGPUを使用）
device = 'cuda' if cv2.cuda.getCudaEnabledDeviceCount() > 0 else 'cpu'
print(f"デバイス: {device}")

# モデルの定義
model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64,
               num_block=23, num_grow_ch=32, scale=scale)

# RealESRGANerの初期化
upsampler = RealESRGANer(
    scale=scale,
    model_path=model_path,
    model=model,
    tile=0,
    tile_pad=10,
    pre_pad=0,
    half=True if device == 'cuda' else False,
    device=device
)

# 画像の読み込み
input_image_path = 'input_folder/input_image.jpg'
output_image_path = 'output_folder/output_image.png'

img = cv2.imread(input_image_path, cv2.IMREAD_COLOR)
if img is None:
    raise ValueError(f"画像 '{input_image_path}' の読み込みに失敗しました。")

# 超解像処理
output, _ = upsampler.enhance(img, outscale=scale)

# 画像の保存
cv2.imwrite(output_image_path, output)
print(f"超解像された画像が '{output_image_path}' に保存されました。")

```
読書感想文「ひとり情シス虎の巻　実話で学ぶITエンジニアの理想の仕事術」

# 書籍名「ひとり情シス虎の巻　実話で学ぶITエンジニアの理想の仕事術」
著者　成瀬雅光
日経BP社
初版

# 読もうと思った動機
・情シスの仕事内容を把握するため。
・表紙の「仮想環境とプログラミングスキルで実現」という言葉に釣られて


# 印象に残った部分

## p18-p21仮想環境とプログラミング
・クラウドで簡単に手に入るサーバーでは無く、仮想環境であることに注意する。
・自由にできる環境を手に入れたプログラマーは強い
・重要なのはサーバー側、特にデータベース
・クラウド活用には新たな予算が必要なのがネック
　　その点仮想環境だとコストは固定だから分がある。
　　再現の検証とかも容易。

・まず目指す姿をイメージし目標にする。
　自分が書いた図(自宅に仮想環境立てたいね)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/91ea6638-d66d-6520-d2db-a02a4d721eb8.png)



## p65　社内のIT環境とキーパーソンの掌握法

・経理担当者　業務担当者と仲良くなった方が良い
　仲良くなると
・著者はギブアンドテイクの関係で経理が便利になるようなツールやシステムを構築し、提供することで関係を良くしてきた。


## p74 課題解決に必要なスキル
１．仮想環境に関するスキル

２．業務システム構築スキル

自分パッケージ
システム基盤は同一にすべし
todo パッケージ図を描く


## p93_何かを解決するためにシステムを一人で作る
　・特定の領域言語に依存する必要
　・エンジニア以外にとって便利に使えるかコストはどれだけかかるのか、

## p153 環境構築を全部委託するより、教育費を出して自らも学べ
・ITベンダーにサーバを構築する際、一緒に作業させてもらいベンダーから環境構築、運用を学ぶ
・見積もりに教育費を含める。

# 実践できること or 感想

## 感想
・モチベーションの上がる内容が多く面白かったです。（小並感）
　ただ真似するのはチャレンジが必要な感じだと思いました。
 　これを再現できる人少ないのでは？
・インフラ、プログラミングを両方できる強さを再認識しました。
・当初の目的（情シスの一般的な業務内容を知る）から外れてますが、新しい発見ができたからとにかく良し！
・クラウドより仮想環境の方を力説してるのがようわからなかったです。（そもそも自分自身仮想環境をよく知らない…）
　とりあえず実際に仮想環境も構築してみないと判断できないです。触ってみればクラウド、仮想環境の得手不得手も理解できると思います。
## 実践できること
・行動心理学の本を買って読む。以下2点
　「図解　人の心と行動がわかる心理学」
　　https://www.daiwashobo.co.jp/book/b10039922.html
　「今日から使える行動心理学」
　 　https://www.natsume.co.jp/np/isbn/9784816358258/
・自宅に仮想化環境を立てる
　FW ヤマハルーター、ミニPCを用意して仮想化環境を作る。
　自宅でハードウェア持っていた方が色んな検証（セキュリティ、障害対応、パフォーマンス計測など）するときに便利そうです。
　
　下の投稿とかも読んだのですが、ハードウェア込みの検証環境は割と欲しい…
「ITエンジニアがホームラボを持つ理由」
　https://qiita.com/damepanda_supra/items/a3606cbe28c41508ec80

　でも構築するのに時間掛かりそうなんだよな　というか今SQLの勉強してるし....　来月の年末年始で一気にやるかも