OmniAICreator/Qiita-1.07M huggingface dataset:
VScodeのJupyterでPython3.12を動かす

<　二番煎じかも　>
### 問題：brew installしたpython3.12.6をVScodeのJupyter Notebookで選んで、pip installすると下記のエラーになる。

'Python 3.12.6' でセルを実行するには、 ipykernel パッケージが必要です。
次のコマンドを実行して、'ipykernel' を Python 環境にインストールします。
コマンド: '/usr/local/bin/python3 -m pip install ipykernel -U --user --force-reinstall'

上記コマンドをターミナルで実行すると以下のエラーになる：
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.
 If you wish to install a Python library that isn't in Homebrew,
    use a virtual environment:
    python3 -m venv path/to/venv
    source path/to/venv/bin/activate
    python3 -m pip install xyz
    
ipykernel は Homebrewには無いので指示通り、仮想環境を作り、そこでpipでカーネルをインストールし、最後にJupyterへ登録する。

### 解決法：
```bash
~ $python3 -m venv myenv
~ $source myenv/bin/activate
(myenv) ~ $pip install ipykernel
(myenv) ~ $python -m ipykernel install --user --name=myenv --display-name "Python (myenv)"
```
Installed kernelspec myenv in /Users/tn/Library/Jupyter/kernels/myenv

次にVScodeで、
右上のPython3.12.6（選択しているPythonを表示している）をクリックし、「別のカーネルを選択」を選ぶと上記の --display-name "Python (myenv)"で
決めた「Python (myenv)」が現れるので選択する。
キャッシュされた`cv2.__version__` に注意

## 概要
バージョンの確認のために`cv2.__version__` を表示させることがある。
しかし、インストールしたはずのバージョンとは異なる表示をすることがあるので注意すること。

## 環境
Ubuntu 20
python3.8

## 動作例
バージョンの表示用のスクリプト
```sample.py:
import cv2

print(f"{cv2.__version__=}")
print(f"{cv2.__file__=}")
```

## pip による特定バージョンのインストールと表示用のスクリプトの実行
```
python3 -m pip install opencv-python==3.4.18.65
Collecting opencv-python==3.4.18.65
  Downloading opencv_python-3.4.18.65-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (37.3 MB)
     |████████████████████████████████| 37.3 MB 38 kB/s 
Requirement already satisfied: numpy>=1.14.5; python_version >= "3.7" in /usr/lib/python3/dist-packages (from opencv-python==3.4.18.65) (1.17.4)
ERROR: opencv-python 3.4.18.65 has requirement numpy>=1.19.3; python_version >= "3.6" and platform_system == "Linux" and platform_machine == "aarch64", but you'll have numpy 1.17.4 which is incompatible.
Installing collected packages: opencv-python
Successfully installed opencv-python-3.4.18.65
root@waragai-orin:~/check-opencv-python# python3 sample.py 
cv2.__version__='4.5.0'
cv2.__file__='/usr/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-aarch64-linux-gnu.so'
```

### 不具合
```
cv2.__version__='4.5.0'
```
と間違った値が返ってきた。
### 不具合の理由と対策
直前のインストールで4.5.0のバージョンのopencv-pythonをインストールしたことが影響したらしい。
以下のコマンドでキャッシュされた内容を削除すると、本来のバージョンが取得できた。
```
rm -r /usr/lib/python3.8/dist-packages/cv2/__pycache__
```
LuaLaTeXでフォントをいじる。

# はじめに

メモ書き程度なのであまり重要視しないでください。

# フォントの更新とリスト

`fonts_list.txt` にフォント名のリストを生成します。

```sh
# データベースの更新
$ luaotfload-tool --update

# インストールされているフォントの一覧を出す
$ luaotfload-tool --list=* > fonts_list.txt
```

# 使い方

游書体とTimes New RomanとArialで組んでみましょう。

```tex
\documentclass[fontsize=10.5bp]{jlreq}

\usepackage{luatexja-fontspec}
\setmainjfont[BoldFont=Yu Gothic Bold]{Yu Mincho Regular}
\setmainfont[BoldFont=Arial]{Times New Roman}
\setsansjfont{Yu Gothic Bold}
\setsansfont{Arial}

\begin{document}

\section{はじめに}
テストだよ～

\end{document}
```

## なぜこうなるか

和文は伝統的に本文と題名は明朝体で、章題と強調はゴシック体で組まれます。そのときセリフ体とサンセリフ体を合わせて組むとこうなります。`setmainjfont` の `BoldFont` は本文の強調書体、`setsansjfont` は章題の書体になります。

# コンパイル

`main.tex` ファイルがあったら、以下のようにコンパイルします。

```sh
$ latexmk -lualatex main
```

# 参考文献

- https://vraisamis.hatenadiary.jp/entry/2016/06/24/143245
- https://lualatexlab.blog.fc2.com/blog-entry-30.html
全てのモデルを列挙する

# やりたいこと

全てのモデルを列挙したい。

# 方法

```rb
# 開発環境だとクラスが自動読み込みされる。
# このままだと読み込み済みのモデルしか列挙できないので、明示的に一括読み込みしておく。
# 規模が大きい Rails アプリケーションだと時間がかかる。
Rails.application.eager_load!

# 全てのモデルを列挙する。
# ApplicationRecord のような抽象クラスは除外する。
ActiveRecord::Base.descendants.reject(&:abstract_class?)
```

# バージョン情報

※ 現時点での最新のバージョンではありません。

```rb
RUBY_VERSION
#=> "3.1.2"

Rails.version
#=> "7.1.4"
```
Deep Learning協会 E資格 受験報告&試験内容まとめ

日本Deep Learning協会 E資格 2024 #2の受験を行いました。
結果は合格でしたがここでは反省点のまとめです。

試験勉強のまとめは本記事下部に各ページへのリンクを貼っています。

## 出題内容

出題内容と言っても基本的に守秘義務がありますので、実際の問題を記載することはできません。
全体的な出題傾向として
- シラバスの範囲から忠実に出題された
シラバスにないな、と思ったのは1問のみ
- ちゃんと論文を読まないと(もしくはそれに準ずる情報を学習していないと)厳しい
例えばTransformerというモデルがあったとして、Transrormerはこういう時に使ってこういう特性があるよー
・・・だけではなく
どういう構造のモデルか、数式で表すとどうなるか、数式がどういう意味を持っているかを抑える必要があります。
- TensorflowとPytorch固有の記法はほぼ出題されない気がする
numpyやpythonの数式ライブラリの基本を押さえている方が大事

また、シラバスの更新による技術内容のアップデートも大きく、
よく受験レポートで「これをやっておけばいい」と紹介されている**問題集は現シラバスでは古くて試験範囲外です**

## 受験の感触

以下4分野に分かれています。
- 数学的基礎 : 統計・確率論を抑えておけば大丈夫
- 機械学習 : 概念だけでなく、論文で言及されるモデルの特徴や動きを把握する必要あり
- 深層学習 : 概念だけでなく、論文で言及されるモデルの特徴や動きを把握する必要あり
- 開発・運用環境 : 割と基礎。ただ出題数も少ない。

合格率は非公開ですが60%程と言われています。
ただこの合格率の数字以上に試験難度は高いです。
4択なので合格率が高いのかもしれませんし、受験者が35時間研修受講後の人たちなので猛者ぞろいというのもあると思います。

手前味噌ですが私は数学科出身でかつAIエンジニア(ユーザー側)でもありましたが、合格率10%台と言われている高度情報処理試験よりもはるかに勉強時間をかけています。

機械学習・深層学習分野においてはちゃんと理解して解けたのがギリギリ6割とどいたかとどいてないかという印象で、4択に救われたかもしれません。

## 試験対策

E資格は事前講習の受講が必須でしたが、正直受講した講座があまりよくなくあまり学習になりませんでした。(詳細は伏せます・・・)

2024 #2対応のシラバス更新後の初試験ということもあり周りに情報もないので、自分でシラバスの内容をまとめることにしました。
結果的に上記出題傾向の通りシラバスから忠実に出題されたので、かなり合格に寄与したのではないかと思います。

一方でこれも上記にある通り、出題は割と深いレベルで行われます。
シラバスの用語と概要を抑えた、くらいでは厳しいと思います。
下記まとめを見て頂くと概要レベルにとどまっているので、これを抑えたうえでもう一歩理解が必要だったなーと反省しております。

## シラバスまとめ

公開用というよりは学習メモに近いのですがシラバスのまとめを下記に記載しています。

https://qiita.com/hokutoh/items/4114c996ec0f82e4c8c0

https://qiita.com/hokutoh/items/c170d0c3447d01e57186

https://qiita.com/hokutoh/items/15a18d098b1d08892d3f

https://qiita.com/hokutoh/items/4b6aa3483757a655c559

https://qiita.com/hokutoh/items/b691f91c7c1a84fbad59

https://qiita.com/hokutoh/items/d893449521abed0231e2

https://qiita.com/hokutoh/items/d58a4162f24ebac9dcc1

https://qiita.com/hokutoh/items/8d65f29f24a97df2579c

https://qiita.com/hokutoh/items/0a04cb703b8f6ea2d710

https://qiita.com/hokutoh/items/93f8f89d41792a7b6981

https://qiita.com/hokutoh/items/b5b53e28e2820631decc
【Excelアドイン】テキストボックスに書き戻し実行履歴を表示する

# はじめに #
今回は、書き戻し処理の実行履歴を既存のポップアップダイアログやシート上のセルではなく、テキストボックスに表示する方法を説明します。

# 書き戻し履歴オプションの設定 #
先ず、Sharperlightの書き戻し定義を持つExcelワークブックを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9498ffd0-f8a8-554f-d489-34cd893e7f81.png)

この書き戻しは、データベース内の区域テーブルにデータの挿入/更新を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/093e9b5f-3e22-984f-0a1f-b01cddccb6c8.png)

テキストボックスを挿入し、その名前を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d7c3e841-e5ed-2cb3-56b9-d3e05c300d8e.png)

既定の名を使用することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bbcc55c4-0032-dfba-17cf-76cd147dd2e3.png)

ギアアイコンをクリックして書き戻し定義を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ef3ceccf-0d6a-f773-11f2-08e9bfd7d72f.png)

書き戻し名フィールドのルックアップボタンをクリックして定義を表示します。 `区域`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4a925310-76ee-a892-080a-7a5e73c61d50.png)

定義がロードされたら、**処理オプション**タブに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8a58a007-c576-5d32-ed5c-819b04d81c7f.png)

テキストボックスの名前、つまり **=TextBox 1**を`履歴表示用のセル`オプションに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b1dcbe3b-9266-06ac-0bb3-e3bcfbf3ce51.png)

変更を保存し、書き戻し定義を閉じます。
`書き戻しの実行`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/82e42395-6776-aa5d-9791-040624a6afc9.png)

実行履歴はこのように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2626e0c0-35db-8bfc-eb5c-aa69380599ec.png)

# おわりに #
既定の履歴ダイアログやセルの利用だけでなく、レポート作成時、デザインの拡張性が高まりますね。
【Slack】slackへの通知機能の構築

## はじめに
ご覧いただいた方の中に、日々動いているシステムが正常終了しているか異常終了しているか毎回システムへアクセスして目視確認することが面倒だと感じている方もいらっしゃると思います。

本記事では、slackを用いてシステムの実行結果から正常・異常の状態を通知してくれるアプリケーションの作り方を記述したいと思います。

## 結論
+ slackの通知機能を用いた設定は可能となります
  対応に伴い、ご自身にてslackのアプリケーション作成が必要となるため、ご了承下さい

## 目次
1. slackのアプリケーションについて
1. アプリケーションの作り方について
1. おわりに
 
## slackのアプリケーションについて
slackには様々なアプリケーションが既に用意されております。
「zoom」や「teams」といったコミュニケーションアプリや「Gmail」や「outlook」などの日常で用いるアプリなど様々用意されています。

その中に、slackへ特定の文字列を外部から通知してくれるアプリケーションも存在しております。そのアプリケーション名は「Incoming WebHooks」と言います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/a76d5160-2a48-8d7c-f46d-5c5278c1c65e.png)

上記アプリケーションがあるのであれば、専用のアプリケーションを作成しなくてもいいと考えられますが、該当のアプリケーションは公式としても非推奨のものとなるため、使用しないようにお願い致します。

 ## アプリケーションの作り方について
既存で用意されているアプリケーションが使えない為、それに代わるものを個別に作成する必要がありますので、以下で手順を記載します。

1.https://api.slack.com/apps にアクセス

2.「Create New App」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/dc7fd9fa-03ba-272c-cca3-fcc551d3e5cb.png)

3.「Form a manifest」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/4253516c-2440-177b-a455-ee6e47582dbc.png)

4.対象のslackワークスペースを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/be488475-69f9-ba32-8bdd-a19b6836c4bd.png)

5.「name」を特定のアプリケーション名を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/1459865e-73a0-010c-8ea3-b8783f6f06b6.png)

6.「Create」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/421ae0b0-a286-468b-d618-c708b44ab2ff.png)

7.左目次の「Incoming Webhooks」を選択して右上の設定を「On」にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/d0762efe-91c3-0f60-96a2-2ac3d3905b74.png)

8.「Add New Webhook to Workspace」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/6dd0ba43-ddee-e756-e2d6-0d357372cfb3.png)

9.投稿先の選択を行った後、「許可する」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/5cf3d2e1-1ec9-a452-b74d-63968b6c40a7.png)

以上でslackへ通知するアプリケーションが作成完了となります。

## おわりに
本記事では、slackへの通知機能の構築を行うまでの対応方法を記述させていただきました。
今回作成したアプリケーションを用いてプログラムから呼び出すことでslackへ送りたいメッセージなどを送ることが出来るため、活用いただければと思います。
本記事が、どなたかの役に立てたのであれば幸いです。
拝見頂き、ありがとうございました。
Why Are ASTM A420 WPL 6 Pipe Fittings Used in Low-Temperature Applications?

ASTM A420 WPL 6 pipe fittings are widely utilized in industries where low-temperature conditions are common. These fittings are specifically designed to offer superior strength, durability, and resistance to brittleness in extreme cold environments. Let's take a look at why they are preferred and where they are used.

1. Excellent Low-Temperature Performance
The standout feature of ASTM A420 WPL 6 pipe fittings is their ability to function reliably in low-temperature environments. Made from carbon steel and tested to meet stringent standards, these fittings resist becoming brittle or cracking when exposed to freezing or subzero temperatures. This makes them ideal for cryogenic applications and cold storage systems.

2. High Strength and Durability
Industries like petrochemical, oil & gas, and chemical processing demand equipment that can handle extreme stress while maintaining structural integrity. ASTM A420 WPL 6 fittings provide high strength and durability, making them suitable for pipelines that operate under high pressure in low-temperature conditions.

3. Corrosion Resistance
Though not inherently corrosion-proof, ASTM A420 WPL 6 pipe fittings are treated or coated to offer corrosion resistance. This is important when they are exposed to moisture, chemicals, or other harsh environmental factors, helping to ensure a longer service life in both industrial and commercial applications.

4. Versatile Applications
ASTM A420 WPL 6 pipe fittings are used in a wide range of industries, such as:

Oil & Gas: For transporting oil and gas in cold regions or offshore platforms.
Chemical Processing: Where low-temperature pipelines are essential.
Cryogenic Systems: For transporting liquids at very low temperatures, such as liquefied natural gas (LNG).
These fittings come in various forms, including elbows, tees, reducers, and caps, offering flexibility for different piping system designs.

5. Compliance with Industry Standards
ASTM A420 WPL 6 fittings adhere to strict industry standards, ensuring that they meet the necessary mechanical and chemical requirements for low-temperature applications. Compliance guarantees that these fittings can handle the demands of critical infrastructure without compromising safety or efficiency.

Conclusion
ASTM A420 WPL 6 pipe fittings are essential for industries where low temperatures and high pressures come into play. With their strength, durability, and adaptability to harsh environments, they provide a reliable solution for industries requiring top-tier performance in cold climates. Their ability to maintain integrity in extreme conditions makes them a trusted choice for pipeline projects across a range of industries.
# Python の文字列操作一例

　Pythonでは、文字列はリストのような性質を持ち、**リストと同じようにインデックスを使用できます**。但し、リストと違って変更できません。

　例えば、入力されたアルファベットが何番目かを出力するプログラムは次のようになります。**アルファベットの文字数は決まっているので後から変更する必要はありませんね**。(*もともと英語にJとかWがなかったように後から追加されるかもしれませんが...*）
 
 下のコードでは、アルファベットの大文字以外が入力された場合は、エラーメッセージを出力するようにしています。
~~~Python:alphaindex.py

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

a = input("アルファベットの大文字を1文字入力してください")

if a in alphabet:
    print(alphabet.index(a) + 1)
else:
    print("入力されたのはアルファベットの大文字ではありません！！")
~~~

検索にはfindメソッドを使います。該当文字列が見つからない場合は「-1」が返されます。
~~~Python:alphafind.py
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
index = alphabet.find('L') # Lがアルファベットの何番目か調べる
print(index + 1)
~~~
Python3: GATT をスキャン

## Ubuntu 24.04 にライブラリーをインストール

```bash
sudo apt install python3-bleak
```

## バージョンの確認

```text
$ python
Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from importlib.metadata import version
>>> bleak_version = version("bleak")
>>> print(bleak_version)
0.21.1
```

## プログラム

```py:ble_scan.py
#! /usr/bin/python

import asyncio
from bleak import BleakScanner

async def run():
    devices = await BleakScanner.discover(return_adv=True)
    for device, adv_data in devices.values():
        print(f"address: {device.address}, name: {device.name}, uuid: {adv_data.service_uuids}")

if __name__ == "__main__":
    asyncio.run(run())
```

## 実行結果

```text
$ ./ble_scan.py 
address: 49:C4:23:DE:A4:F8, name: 49-C4-23-DE-A4-F8, uuid: []
address: 08:3A:F2:66:04:4A, name: BatteryMonitor, uuid: ['00001101-0000-1000-8000-00805f9b34fb']
address: FE:C0:60:7D:A3:B8, name: FE-C0-60-7D-A3-B8, uuid: ['0000fd3d-0000-1000-8000-00805f9b34fb']
address: 5E:B4:1D:9D:11:EC, name: 5E-B4-1D-9D-11-EC, uuid: ['0000fef3-0000-1000-8000-00805f9b34fb']
address: D9:16:26:43:E4:D4, name: D9-16-26-43-E4-D4, uuid: ['0000fd3d-0000-1000-8000-00805f9b34fb']
address: 0E:98:0C:72:A6:E4, name: 0E-98-0C-72-A6-E4, uuid: []
address: 54:B7:E9:55:FF:57, name: 54-B7-E9-55-FF-57, uuid: []
address: E5:D7:17:7C:E3:46, name: E5-D7-17-7C-E3-46, uuid: ['0000fd3d-0000-1000-8000-00805f9b34fb']
```
ビジュアルプログラミングで高位合成 その11

# 概要
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
全加算器の高位合成を実装しました。
ここまでで、考察します。

# 浮かび上がった、問題点
問題と言うか、能力が足りないというか、
論理デバイスを組み合わせて、ビジュアルプログラミングで、回路を組み立てる必要があるわけですが
そもそも、それができるのかが、課題というか、問題です。

# その対策
それは、すでに開発しています。
ビジュアルプログラミングでは、ありません。
こちらです。

https://qiita.com/ohisama@github/items/b9b29d632cd57d05e175

真理値表を表示する、インタープリターのコマンドで高位合成します。
論理デバイスは、使いません。

以上。
Python list related utilities

Often in Python you work with lists and often you will be doing tasks like finding difference between two lists or intersection between two lists or their union. These are all set operations and all of these operations can be achieved with python sets. In addition you perform tasks like searching for items matching certain patterns within the list. Below are utilities that help with such tasks.

```python
import itertools


def flatten_list_of_lists(list_of_lists):
    return list(itertools.chain.from_iterable(list_of_lists))


def get_list_from_string(the_string_of_lines):
    the_list = the_string_of_lines.split("\n")
    the_list = [item.strip() for item in the_list]
    if "" in the_list:
        the_list.remove("")
    return the_list


def get_chunked_list(original_list, chunk_size: int = 400):
    chunked_list = [original_list[i:i + chunk_size] for i in range(0, len(original_list), chunk_size)]
    return chunked_list


def generate_comma_separated_text(item_list, with_quote=True):
    str_item_list = [str(item).strip() for item in item_list]
    if with_quote:
        comma_seperated_text = ','.join(f"'{item}'" for item in str_item_list)
    else:
        comma_seperated_text = ','.join(str_item_list)
    return comma_seperated_text


def search_list(_list, _text):
    """
    Get elements of a list that contain certain text
    :param _list:
    :param _text:
    :return:
    """
    return [item for item in _list if _text in item]


def get_intersection(list1, list2):
    """
    Get intersection of two lists
    This returns elements that are both in list1 and list2
    :param list1:
    :param list2:
    :return:
    """
    return list(set(list1) & set(list2))


def get_list_diff(list1, list2):
    """
    Get difference between two lists
    This return elements form list1 that are not in list2
    :param list1:
    :param list2:
    :return:
    """
    return list(set(list1) - set(list2))


def print_list_items(mylist):
    for item in mylist:
        print(item)
```
GX-IH受験記

# はじめに
GX-IHは昨年から始まったGIACのApplied Knowledge Certifications（応用試験）の1つであり、GCIHの上位資格とされています。出題範囲は公式サイトをご参照ください。

https://www.giac.org/certifications/experienced-incident-handler-gxih/

対応するトレーニングコースは以下となっており、SEC504がPrimary fit courseとなっています。
SEC504, SEC450, SEC501, SEC503, SEC560, SEC505, FOR610, FOR508, FOR500 
Primary fit courseは最も出題範囲に近いというだけで、実際にはSEC504より応用的な問題が出題されます。

試験時間は4時間で25問のCyberLive（ハンズオン）を解答します。スキップして後から解答可能な問題数は10問です。一度解答した問題には戻れません。
試験中は2回まで、合計15分間の休憩が取れます。GIACは以前とは異なり、休憩前にスキップした問題をすべて解答する必要はなくなりましたので、いつでも取れます。

# 事前調査
事前調査として、いつものとおり出題範囲の確認と、受験者の感想を収集しました。ただ正直大した情報はなく、受けてみないとわからないことが多いと思いました。
先駆者の記事として以下があります。また、英語のサイトやLinkedInなどで合格者の感想を見ることができます。
いずれも共通して、「難しい」「時間足りない」というような内容がほとんどで、簡単だったという人は見かけませんでした。

https://qiita.com/taka_masa/items/9d0763f393341bf2c6ff

# 受験1回目（不合格）
実は昨年、GX-IHが始まってすぐに受験していました。自分なりに準備したつもりですが、1回目は不合格でした。
振り返ってみると、一番の敗因は準備不足以上に途中で諦めてしまったことだと感じています。普段の試験ではそういったことはまずないのですが、この時はあまりの難しさに諦めてしまいました。諦めずに最後まで粘っていれば結果は違っていたかもしれません。星の数からは推定2～3割程度の正答率でしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/6f93dac8-eeaf-e745-8c55-6827ffd634fd.png)

# 受験2回目（合格）
2回目までは1年以上空いてしまいました。単純に難しすぎて今の私には合格できないと感じ、コツコツと勉強していました。1回目の受験で何となくこういうテクニックが必要だろうということはわかっていたので、ある程度ポイントを絞った対策ができたのは大きかったと思います。
また、1回目はGCIHをトレーニングなしで合格していたため、SEC504の教材がありませんでした。
今回は以前に取得したGSPにより教材が手元にあったことも大きな違いでした。

過去にGX-IA、GX-CS、GX-FEに合格していたため、最後まであきらめないことを念頭に、時間ギリギリまで解いたところ、無事に合格できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/13cb9d01-4eed-926f-eb23-8ae002996fec.png)

# 勉強方法
Applied Knowledge Certificationsは基本的にどれも事前の準備以上に本番でどれだけ頑張れるかが重要になるように思います。別記事にてApplied Knowledge Certifications全般の対策を記載したいと思います。

# GSE獲得
これでGSEの条件を満たしたため、GSEに認定されました。そしてすべてのGIAC資格が更新されました。
後日GIACのDirector of Operationsの方から頂いたメールによると、日本で3人目のGSE認定者だったようです。また、世界で377人目の認定者でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/9ae3e0a3-f2f2-08ff-587d-ef11bd4f814f.png)

# 次の目標
実はCCSPやCISA、CISMを未取得なので、これらを攻略していきたいと思います。
Djangoでデータを加工して取得する : SerializerMethodField

## はじめに
Django REST Framework (DRF) を使ってAPIを作成するとき、通常のモデルフィールドだけでなく、**データを加工したり**、**関連モデルからデータを取得したり**したい場合があります。そんなときに便利なのが **SerializerMethodField** です。本記事では、このフィールドの使い方について詳しく解説します。

## SerializerMethodFieldで実現可能なこと

1．モデルのデータを加工して取得する
2．指定したモデル以外の**関連するモデル**からもデータを取得する

<br>
これだけでは何のことかさっぱりだと思うので、以下に具体例を示します。ただし、ここではコードによる実装は行いません。
<br>

#### 1.モデルのデータを加工する

以下のようなフィールドを持つ**User**モデルを仮定して考えます。
苗字(**myoji**) フィールド
名前(**namae**) フィールド

ここで、**フルネーム**を取得したいとき、
**SerializerMethodField**を使えば、**苗字フィールド**と**名前フィールド**を結合（加工）することで実現できる。


#### 2．指定したモデル以外の関連するモデルからもデータを取得する

例えば、**Profile** モデルと **User** モデルが1対1のリレーションを持っているケースを考えましょう。**Profile** モデルにユーザーの年齢（age）フィールドが存在するとします。しかし、APIでこの age を User モデルのシリアライズ時に一緒に取得したい場合、 SerializerMethodField を使用することで、 **Profile** モデルから **User** の情報に紐付いた年齢を取り出すことができます。


## SerializerMethodFieldの基本的な書き方
次に、実際に **SerializerMethodField** をどのように定義するかを見てみましょう。まずはシンプルな例から始めます。

#### 例1: モデルのデータを加工する
```python:user_serializers.py

from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['myoji', 'namae', 'full_name']

    # データの加工部分
    def get_full_name(self, obj):
        return f"{obj.myoji} {obj.namae}"

```


上記のコードでは、 **User** モデルの **myoji** と **namae** フィールドを結合して **full_name** として取得しています。

:::note info
データを加工する関数の名前は、「**get_<フィールド名>**」にしてください。
システム側が、勝手にこの関数を探して実行してくれます。
:::

:::note info
引数の**obj**には、Metaクラス内で定義したモデルのオブジェクトが格納されています。ここでは、Userオブジェクトですね。
:::


#### 例2: 関連モデルのデータを取得する

```python:models.py
class User(AbstractUser):
    email = models.EmailField(unique=True)
    myoji = models.CharField(max_length=30)
    namae = models.CharField(max_length=30)
```
        
```python:models.py
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    age = models.IntegerField(null=True, blank=True)
```
以上の２つモデルを仮定して考える。

```python:user_serializers.py
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    age = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['username', 'email', 'age']

    def get_age(self, obj):
        return obj.profile.age

```


ここでは、 **User** モデルのシリアライザ内で、関連する **Profile** モデルから **age** を取得しています。これにより、 **User** オブジェクトに直接含まれないフィールドをAPIレスポンスに含めることができます。


## まとめ

**SerializerMethodField** を使うことで、Django REST Framework のシリアライザに柔軟性を持たせることができます。単純なデータだけでなく、必要に応じて加工したり、関連モデルからの情報を取得したりすることで、より高度なAPI設計が可能になります。


## 最後に


少しでも参考になれば嬉しいです。
また、個人的に手書き機能を搭載したアプリを開発したいと考えているのですが、手書き機能の実装経験のある方やおすすめの方法等あれば、教えていただきたいです！！（UIkit, SwiftUI）

最後までお読み頂きありがとうございました！！
サマーインターンシップに参加した時のお話

## はじめに

初めましての人も、そうでない人も、こんにちは！
今回は、私が夏のインターンシップに参加した時の話をしたいと思います！

## インターン先

- ニフティ株式会社
- 株式会社ジェイ・エス・エス
- その他3社

夏は、合計5社の企業にインターンシップに参加させていただきました！
その他の部分は、実際に開発をするのではなく会社説明会や開発とは関係のない内容なので、今回は割愛します。

## それぞれのインターンシップの参加者

### ニフティ株式会社

感想をざっくりまとめると、

- 学歴がすごい
- 技術力もある
- めちゃくちゃいい人

この3点が印象深かったです！

さすが大企業です！学歴、技術力、人柄、どれをとっても自分が勝てる要素なんて微塵もありませんでした。
それでも追いつこうと頑張って足掻いていたのが、今でも覚えています！

あと、インターン中に友達になった人とラーメン食ったり、変な蕎麦を食べたりと、学び以外にも結構エンジョイできてとても楽しかったです！
いつか一緒にまたチームを組んでハッカソンに出場したいな（ボソッ）

### 株式会社ジェイ・エス・エス

ここでの感想は、

- 技術力がニフティ参加者よりすごい
- 地元トップ大学が集まっている

この2点かなと思っています。

このインターンシップには友人と一緒に参加しましたが、口を揃えて「あの人の技術力すげぇ」みたいなことを言い合いましたね。
実際、ニフティでは直接多くの人と関わっていなかったり、使用言語も違っていたりなど、一概に比較することはできませんが、直感的にニフティよりもすごいかもとはちょっと思いました。

## インターンシップの内容

### ニフティ

ここでは、大体6人1チームになって、HTMLとPythonを用いたサービスの開発をするものでした！
自分は主にフロント側を担当して、バックエンドと連携させやすいようにいつも以上にコードを見やすくするように心がけました！

普段は個人開発が多いので「自分がわかればいいから適当にしよ」と思って、あまり見やすさというものを意識していませんでしたが、意識をしようとすると普段考えていないことを考えなければいけないので、結構疲れました...

### ジェイ・エス・エス

ここでは個人開発がメインでした。技術はVB（Visual Basic）をメインに開発を行いました！
VBは存在こそ知っていたものの、実際にコードは見たことがなく「何やこれ」が第一印象でした。それでも時間をかけることでそこそこ扱えるようになったとは思います！

## インターンを通しての課題

### ニフティ

Gitコマンドやチーム内連携があまりうまくいかなかった印象があります。
自分も含め多くのメンバーはGitコマンドを使えていましたが、特定のエラーが発生した時どう対処すればいいかわからず、全体的に見て多くの時間をロスしてしまっていたと思います。

チーム内連携でも、誰がどれをやっているのか、進捗表にはよく見ると同じようなことが書いてあったりなど、反省点が多くありました。

ニフティに限らず、チームで開発する時はメンターがいる場合はどんどん頼って開発した方が絶対に良いと感じました！あとは、進捗表を作成して開発を進める場合、絶対に書いてあることの確認はした方がいいです。

### ジェイ・エス・エス

ここでの課題らしい課題って、正直そこまでないんですよね...
事前にどんな技術を使うのか教えてもらっていないし、出社時間が午後からで開発にかける時間が短すぎたというのが主な原因ですね。インターン中は構文エラーがでたからメンターに教えてもらったり、自分でさっと終わらせたりなど、自分の技術力でもある程度なんとかなってよかったです。強いて課題をあげるなら、VBを触っておけばよかったなぁーくらいな気がします。

## おわりに

今回の記事はいかがだったでしょうか？
自分は最初とても緊張しました！ただ、それは他の参加者も同じ気持ちです！
悪い人なんてなかなかいません！

技術力の違いから「自分なんて...」と思ってしまうかもしれません。
でも、真剣に技術に向き合ってコミュニケーションを取れば、周りの人たちは助けてくれます！（ソースは私）

「インターンは自分との戦い」とはよく言われたものですが、これは少し言い過ぎな部分があります。
私としてはそんなに孤独な感じではなく、インターンで与えられた課題を参加者一丸となって戦うレイドバトルって表現された方が、結構しっくり来るんですよね。

なので、これから参加する方々は過度に不安がらず、いつも通りの実力が出せるように頑張ってください！

今回の記事はいかがだったでしょうか？またどこかの記事でお会いしましょう！
Oracleの性能分析機能

Oracle Enterprise Editionには、性能分析を行うためのさまざまなデフォルト機能が用意されています。主なものは以下の通りです。

**1. Automatic Workload Repository (AWR)**
Oracleデータベースのパフォーマンスデータを自動的に収集し、レポートを生成します。AWRレポートを用いることで、データベースのパフォーマンスの変化や問題の兆候を把握できます。

**2. Automatic Database Diagnostic Monitor (ADDM)**
AWRデータをもとに、データベースのパフォーマンスに関する診断を自動で行い、問題の原因と推奨される解決策を提供します。

**3. SQL Trace/10046イベント**
SQL実行の詳細なトレースを行うことで、クエリの実行計画やリソース消費を詳細に分析できます。これを使うことで、特定のSQL文がどのようにリソースを消費しているかを分析できます。

**4. SQL Performance Analyzer (SPA)**
SQLの変更がパフォーマンスに与える影響を事前に評価できます。これにより、SQL文の最適化やチューニングの結果を評価するのに役立ちます。

**5. Real-Time SQL Monitoring**
実行中のSQL文の進行状況とリソース消費をリアルタイムで監視します。これは、長時間実行されているSQLのボトルネックを特定するのに役立ちます。

**6. ASH (Active Session History)**
現在アクティブなセッションの詳細をリアルタイムで把握することができ、データベース内のリソース消費や待機イベントをリアルタイムに監視できます。

これらの機能を活用することで、Oracleデータベースのパフォーマンス問題の診断、チューニング、および最適化を効率的に行うことができます。
CodeWars オススメ問題 #4

# はじめに

個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。

週1くらいのペースで、全10回を目指す予定。

:::note
CodeWarsはいいぞ！の紹介は[こちら](https://qiita.com/kohki_takatama/items/2ae2808b931e943262b8)

CodeWarsの始め方は[こちら](https://qiita.com/javacommons/items/7c473cda7825ab99e08c
)
:::
# オススメ問題

https://www.codewars.com/kata/55908aad6620c066bc00002a/javascript

### 問題
与えられた文字列に`x`と`o`が同数含まれているかを返す問題です。
含まれていない場合は`0`としてカウントします。

```
XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false
```
### 難易度
分類は 7kyu です。
アルゴリズム問題に慣れてきた方にオススメです。

# オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。

:::note
<details><summary>オーソドックスな解法</summary>

```js
const XO = str => {
  str = str.toLowerCase().split('');
  return str.filter(x => x === 'x').length === str.filter(x => x === 'o').length;
}
```
- アロー関数`const XO = str => {}`という記法が用いられています
`function XO(str) {}`と意味はほぼ同じです
- `filter`を使って、`'x'`に一致するもの、`'o'`に一致するものの数を出し、比較しています
</details>
:::

:::note
<details><summary>オーソドックスな解法（正規表現）</summary>

```js
function XO(str) {
  let x = str.match(/x/gi);
  let o = str.match(/o/gi);
  return (x && x.length) === (o && o.length);
}
```
- `/x/gi`は、`x`に一致する全て（`/g`）に、大文字小文字の区別無し（`/i`）でマッチします

</details>
:::

:::note
<details><summary>個人的に好きな回答</summary>

```js
function XO(str) {
    var a = str.replace(/x/gi, ''),
        b = str.replace(/o/gi, '');
    return a.length === b.length;
}
```

先程の正規表現との違いは、`match`ではなく`replace`メソッドを使用していることです。

`match`の場合、マッチしたものが存在しない時、存在しないものに対し`length`メソッドが使用されエラーになります。

`replace`を使用することにより、マッチしなくとも元の文字列に対し`length`が使用されるため、エラーにはなりません。

よって、よりスマートなコードになっています。

ただし、`replace`はパット見何をしているかわかりません。意図の伝わりやすさという点で`match`を使用するのが一般的でしょう。

</details>
:::

# おわりに
以上、CodeWarsオススメ問題でした。
ESP32: GATT で String を送信

こちらのプログラムを改造して、String を送信するようにしました。
[ESP32: GATT通信 (ArduinoBLE.h)](https://qiita.com/ekzemplaro/items/bf368e232b2c3bac0172)

## プログラム

```text:string_send.ino
// ---------------------------------------------------------------
/*
	string_send.ino

					Sep/24/2024
*/
// ---------------------------------------------------------------
#include <ArduinoBLE.h>
#define	PROGRAM	"string_send.ino"
#define	VERSION	"2024-9-24 PM 14:49"

BLEService batteryService("180F");

BLECharacteristic batteryLevelChar("2A19", BLERead | BLENotify,
		"012345678901234567890123456789");

int icount = 0;
// ---------------------------------------------------------------
void setup() {
	Serial.begin(115200);
	while (!Serial);

	if (!BLE.begin()) {
		Serial.println("starting BLE failed!");
		while (1);
	}

	BLE.setLocalName("BatteryMonitor");
	BLE.setAdvertisedService(batteryService); // add the service UUID
	batteryService.addCharacteristic(batteryLevelChar); // add the battery level characteristic
	BLE.addService(batteryService);

	// 初期値を設定
//	batteryLevelChar.writeValue("Battery: 0");

	BLE.advertise();

	Serial.println("Bluetooth® device active, waiting for connections...");

	delay(2000);
	Serial.println(PROGRAM);
	Serial.println(VERSION);
	Serial.println("*** setup end ***");
}

// ---------------------------------------------------------------
void loop() {
	if ((icount % 200) == 0)
		{
		Serial.print("*** loop *** ");
		Serial.println(icount);
		}
	icount++;
	delay(10);
	// wait for a Bluetooth® Low Energy central
	BLEDevice central = BLE.central();

	// if a central is connected to the peripheral:
	if (central) {
		if (central.connected()) {
			updateBatteryLevel();
		}
	}
}

// ---------------------------------------------------------------
void updateBatteryLevel() {
	int batteryLevel = 25 + icount;

	// 文字列を作成して送信
	String str_out = "Battery: " + String(batteryLevel);
	batteryLevelChar.writeValue(str_out.c_str());
}
// ---------------------------------------------------------------
```

## Android の LightBlue で受信
> Data format を UTF-8 String にします。

![LightBlue_sep24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/816d0b44-a899-139b-47f4-1882ec9d0651.png)

## 参考
[Assigned Numbers](https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf)

次のように定義されています。
> Battery Service 0x180F
>Battery Level    0x2A19
yfinanceで米国有価証券報告書のurlを取得

yfinaceは財務データや株価等を取得するライブラリですが最近更新があってsecfilling(有価証券報告書)も取得できるようになってました。

https://github.com/ranaroussi/yfinance/pull/2009

試しにaapl(アップル)の有価証券報告書のurlを取得してみました。

```python
import pandas as pd
import yfinance as yf

# 企業のティッカーシンボルを指定してオブジェクトを作成
apple = yf.Ticker("AAPL")

# SECフィリングデータを取得
sec_filings = apple.get_sec_filings()

# データの整理：必要な情報をリストに格納
data = []
for filing in sec_filings:
    # exhibits のそれぞれを別行にする
    for key, value in filing['exhibits'].items():
        entry = {
            'date': filing['date'],
            'type': filing['type'],
            'title': filing['title'],
            'edgarUrl': filing['edgarUrl'],
            'document_type': key,
            'document_link': value
        }
        data.append(entry)

# DataFrameに変換
df = pd.DataFrame(data)

# CSVに出力
df.to_csv('sec_filings_exhibits_separated.csv', index=False, encoding='utf-8-sig')

print("データが sec_filings_exhibits_separated.csv に保存されました。")


```
url一覧を取得できました。
下記では取得したurlをダウンロードしてます

```python
import requests

# ダウンロードするURL
url = "https://cdn.yahoofinance.com/prod/sec-filings/0000320193/000032019324000081/aapl-20240629.htm#i399fc64bbe494642a709f5ddee803e6a_13"

# 取得するファイルの名前を指定（任意）
filename = "aapl-20240629.htm"

# URLからコンテンツをダウンロード
response = requests.get(url)

# ダウンロードが成功したかをチェック
if response.status_code == 200:
    # ファイルを書き込みモードで開き、コンテンツを保存
    with open(filename, 'wb') as file:
        file.write(response.content)
    print(f"ファイル {filename} が正常にダウンロードされました。")
else:
    print(f"ファイルのダウンロードに失敗しました。ステータスコード: {response.status_code}")

```
3D スキャナーとメタバース: 仮想世界への橋を築く

テクノロジーの進歩に伴い、メタバースはテクノロジーの世界で注目を集めています。この仮想世界を構築する過程で、3D スキャナーは重要な役割を果たし、現実のオブジェクトやキャラクターを仮想世界に正確にマッピングすることができ、より現実的な体験と無限の可能性をメタバースにもたらします。

メタバースとは何ですか?
メタバースとは、仮想現実 (VR)、拡張現実 (AR)、ブロックチェーンなどのテクノロジーを統合した没入型の仮想世界を指します。メタバースでは、ユーザーは交流、娯楽、学習ができるだけでなく、ビジネス活動を行ったり、現実のさまざまなシナリオをシミュレートしたりすることもできます。そのビジョンは、現実世界と仮想世界をシームレスに接続し、共有のデジタル エコシステムを構築することです。

![4caef481e1e892f0336720e38e08f80c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/eeb1c1bd-7bfd-8181-634c-962532dd89cc.png)
3Dスキャナーの技術原理
3D スキャナーは、レーザー、光学、またはカメラ技術を使用して、スキャンを通じて物体の形状、質感、色の情報を取得できる、物体の 3 次元データを取得できるデバイスです。
![4a13f30614146bc825f0f7df86d008bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/f4500e01-eaa7-3d3c-eb26-f95343fa3c50.png)

https://www.revopoint3d.jp/

3D スキャナーはメタバースにどのような影響を与えるのでしょうか?
現実のオブジェクトのデジタル化: 3D スキャナーを使用すると、現実のオブジェクト、建物、さらには人物さえも正確にデジタル化し、メタバースに導入できます。これにより、仮想世界の現実性が高まるだけでなく、よりインタラクティブで没入型の体験がユーザーに提供されます。たとえば、ユーザーは自分の体をスキャンしてパーソナライズされた仮想イメージを生成し、メタバース内のアクティビティに参加できます。

仮想アセットの作成: 3D スキャン テクノロジーは、仮想商品、建物、アートワークなどの高精度の仮想アセットの作成に役立ちます。これらの資産はメタバース内で取引でき、ユニークなデジタル コレクティブル (NFT) としてタグ付けすることもできるため、メタバース内の経済活動が増加します。
![e9ad5bfa417355a7701cc29b8a03b250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/c10b3953-2631-e023-f6cb-47a67c35ae1d.png)


仮想シーンの信頼性の向上: 3D スキャンを通じて、現実のシーンを仮想世界に忠実にコピーできるため、ユーザーはメタバースで非常に現実的な環境を体験できます。これは、仮想観光、教育、ゲーム、その他の分野にとって非常に重要です。

3D スキャン技術が発展し続けるにつれて、メタバースはより豊かで現実的なものになります。将来的には、ユーザーは現実世界の要素を仮想世界に簡単に持ち込んで、仮想と現実の統合を実現できるようになります。さらに、5G、AI、エッジ コンピューティングなどのテクノロジーの発展により、3D スキャナーのリアルタイム パフォーマンスと精度がさらに向上し、メタバースがインターネットの次の革新的なプラットフォームになることが促進されます。
pythonプロジェクトをバイナリ配布(Linux)

# 目的
SBCに何らかの付加価値をつけた(pythonで作成した)ものを
配布するときにソースコードをそのまま渡すことが
何らかの都合で出来ない場合に
cythonを利用してバイナリで配布する。

# 確認環境
- raspi 4
- ubuntu 22.04

# 手順
基本的には以下だが、Linux版で失敗と記載があるので
こちらで成功した手順を記載

https://qiita.com/kanedaq/items/c4e5cf5060748bd6d7e1

## こちらで実行に成功した手順

### soファイルの作成

main以外のコードをsetup.pyに記載してビルド  

setup.py  
```python
from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([
        Extension(
            "sub_module1",
            sources=["sub_module1.py"],
        ),  
        Extension(
            "sub_module2",
            sources=["sub_module2.py"],
        ),  
    ...
    ]), 
)
```  

```shell
python3 setup.py build_ext --inplace
```

### mainファイルを変換
```shell
cython --embed -o main.c main.py
```

### mainファイルをコンパイル
```shell
aarch64-linux-gnu-gcc -c main.c $(python3-config --cflags)
```
※コンパイラは当該環境で使用可能なもの

### リンク

```shell
aarch64-linux-gnu-gcc -o [実行ファイル名] main.o -L. -l:sub_module1.cpython-310-aarch64-linux-gnu.so -l:sub_module2.cpython-310-aarch64-linux-gnu.so $(python3-config --ldflags) -lpython3.10 -Wl,-rpath=. -Wl,-rpath=/usr/lib/aarch64-linux-gnu
```

ポイントは以下
1. pythonのバージョンを指定してpythonライブラリのリンクを行う
2. ライブラリはlinuxのライブラリの命名規則に則っていないので直接ファイル名で指定をする(:を使う)
3. soファイルのある場所をライブラリパスに含める

※`-Wl,-rpath`は念の為つけたが多分要らない
→PYTHONPATHしか見ていない？

### 実行
```shell
PYTHONPATH=${PYTHONPATH}:. ./[実行ファイル名]
```
【Java Silver11】体験記

# ⓪はじめに
先日、Java Silver11に合格しました！今回は、①申込方法、②試験当日の流れ、③意識したことを残します。
②と③の最初の2点は、他の資格試験でも参考になる部分があるかもしれません。
※全て2024年9月時点の情報になりますので、ご了承ください。

# ①申込方法
初めての受験でしたので、以下のサイトを参考に、
- Oracle社のサイト
- CertViewのサイト
- PearsonVUEのサイト

に登録しました。

なぜ3つも登録が必要なの？！と思いますが、それぞれ、
- Oracle社の資格を受けるため
- 保有資格や受験予定の資格を管理・確認するため
- どの資格をどの会場で受験するかを選択するため

という理由だと思います。

https://manabiya-sakura.com/information_technology/id=1554/#:~:text=%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E7%99%BB%E9%8C%B2%E3%82%84%E5%88%9D

# ②試験当日の流れ
会場によって異なる部分もあると思いますので参考程度になさってください。

会場に到着後、
- 受付をする
- 名前と申し込んだ受験の時間を聞かれる
- 確認が取れると、身分証明書**2点**を求められる
- 確認が取れると同意書が渡され、近くの椅子に座って確認するように促されるので、読んでからサインする
- サインが出来たら受付に戻りスタッフの方に渡す
- カウンターに置いてある署名パッドに署名する
- カウンターに置いてあるカメラの前に立ち、顔写真の撮影をされる(ここで撮影した写真は、試験終了後に渡されるスコアレポートに載る)
- ★（下部に記載）
- 番号付きのロッカーのカギが渡されるので、**ロッカーのカギと身分証明書1つのみ**を手に持ち、指定された椅子に座って待つ
- ホワイトボード1枚とマジックペン2本が渡される
- ロッカーのカギについている番号の座席に案内される(卓上にはPCとマウス以外に、呼び鈴、コード付きヘッドフォン(おそらく別の試験で利用するため)、ノイズキャンセリングのヘッドフォン(私は使用しました)が置いてある)
- 最初に撮影した自分の顔写真と名前があっているかを確認する
- 確認できたら、椅子に座らせてもらえるので、自分のタイミングで試験開始する

試験開始直後、

- ちょっとした試験の説明や同意書などのページが表示される(確認できる時間は10分)

試験終了後、
- ロッカーのカギ、身分証明書、試験前に借りたホワイトボードとマジックペンを持ち、受付に戻る
- スタッフの方からスコアレポートを受け取り、名前とスコアと顔写真が自分のものだと確認できたら、サイン用紙にサインする


★：会場に早めに到着した場合、先にここまで済ませておける。会場の外で最後の確認をし、受験時間が近づいたらまた会場に戻ってくることができる。


だいたい上記のような流れです。

# ③意識したこと
試験内容以外で意識したことは、2点です。

- 羽織るものを持参した

ほとんどの資格試験で共通することかもしれませんが、この時期の受験会場は冷房で会場がキンキン冷えています。寒すぎて試験に集中できないことになると非常にもったいないので、念のため羽織ものを持参することをお勧めします。

- 試験時間30分前に会場に到着できるように家を出た

15分前には到着しておくよう、受験案内メールに書いてあります。が、ハプニングを想定して30分前到着し、受付だけ済ませておくと心に余裕ができます。会場の外にはなりますが、試験までの時間まで少し復習できます。
ハプニングというと、私が会場に到着した時、他にも受験者の方がいらっしゃったのですが、「名前が見つからない」と言われており、その方もスタッフの方もバタバタしておられました。本当に何が起きるか分からないので、早めの行動が大切だと思います。


次に、試験内容に関することで意識したことですが、こちらも大きく2点です。

- アクセス修飾子を確認する

問題のソースを読む前に、ざっと、クラス、メソッド、フィールドなどのアクセス修飾子を確認するように意識していました。アクセスできないものにアクセスしている箇所があれば、コンパイルエラーだとわかるので、ソースを読む時間が短縮できると思います。

- 変数が、フィールド・定数フィールドorローカル変数か、さらに初期化されているかを確認する

変数宣言時に初期化されていない場合、フィールドであればデフォルト値が入っています。定数フィールドであれば、全てのコンストラクタで初期化されていないと、コンパイルエラーになります。ローカル変数であれば、参照しようとするとコンパイルエラーになります。これらのことを踏まえて、変数を確認し、コンパイルエラーになる箇所があれば、ソースを読む時間が短縮できると思います。

# ④さいごに
初めてIT系の資格にチャレンジしましたが、エンジニアのスタート地点に立てた気がします！
また、資格試験には合格というゴールがあり、定着度が目に見えやすいので、それが日々の学習のモチベーションアップに繋がると思いました。
今回、黒本を使って学習しましたが、勉強方法や各章の抑えておきたいポイントは、また別の記事で紹介したいと思います。
【初ハッカソン】技育CAMP2024 ハッカソン vol.14に出場しました！

# はじめに

こんにちは。RyutaroMです。

タイトルにもあるように、9月14〜15日にオンラインで開催された「技育CAMP2024 ハッカソン vol.14」に出場してきたので、そこで得られた知見をまとめます。

https://talent.supporterz.jp/events/6f769c37-5709-4ddc-804e-4c4ff38d2112/

テーマは「祭り」で、プログラミングで作っていればなんでもOKというルールでした。

夏休みで時間があるし何かみんなで作ってみないと研究室で話していたことをきっかけに、研究室の1つ上の先輩と2人で出場しました。

# 自分の中での出場のモチベーション
出場のモチベーションとして、何かを作ってみたいという思いももちろんありましたが、それよりも他の人と関わることで刺激を受けたいという思いの方が強かったです。

自分は長期インターンをしていて始めてから1年半くらい経っていたため、このタイミングで新しい視点を取り入れ、さらなる自身の成長のきっかけにつなげたいと思っていました。

# 作ったもの

ハッカソン前に2人で話していく中で、「Reactを使ってかっこいい・ワクワクするようなWebサイトを作りたい」ということになりました。

テーマの「祭」をどう消化しようかと話し合った時に、「祭→夏→夏の終わりの懐かしさ・切なさ」という話になり、レトロ感のあるゲームができるWebサイトを作ろうということになりました。

最終的にこのようなWebサイトを形にするところまでもっていくことができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/efe5cd66-138a-96f2-2caa-9eb41932732a.png)

https://geek-camp-30a2f.web.app/

https://github.com/yope7/Geekcamp

# 工夫点
## CSSを使った自然なコンポーネント埋め込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/efe5cd66-138a-96f2-2caa-9eb41932732a.png)

この画像のように、コンポーネントをテレビの枠に自然に埋め込みました。
埋め込みにはCSSのperspectiveプロパティを用いました。

## タイプライター風アニメーションを用いたレトロコンピュータの表現

タイプライター風アニメーションを使ってレトロコンピュータを表現しました。
アニメーションには[`react-simple-typewriter`](https://www.npmjs.com/package/react-simple-typewriter)のReactライブラリを使いました。

## Firebaseへのデプロイ
今回はFirebaseへデプロイしました。
思ったよりも簡単にデプロイできました。以下の記事を参考にしてデプロイしました。

https://qiita.com/hiroki-harada/items/ca22ac177db68e3c3796

テスト版を動かす時にはとても便利だなと思いました。

# 新たに学んだこと・身についたこと

まず大前提として他の人と何か1つのものを作り上げるのは大変だということを学びました。
その上で、誰かと協働するときには自分の中で何を作りたいのか・どうしたいのかを固めておく必要があるなと思いました。

# 反省点
アイディアが固まらずに迷走した感じがありました。

アイディアが固まらないと役割分担もできないため、今度出場するときはどんなものを開発するかをもっと早めに決めたいなと思いました。

# さいごに

とても大変でしたが、当初の目標通り刺激になってよかったです。

もっと他人のアイディアに触れることでアイディアの生み出し方に慣れていけそうな気がしたので、これからもハッカソンに参加していきたいなと思います。

最後まで読んでいただきありがとうございました。
なぜWord2Vecで単語の演算が可能なのか？〜深層学習の数理に迫る〜

### イントロダクション
- Word2Vecは、自然言語処理において非常に重要な技術の一つです。特に単語間の「ベクトル演算」が可能である点で注目されています。例えば、「King - Man + Woman = Queen」といった単語の計算が成り立つのはなぜでしょうか？
- この記事では、Word2Vecの背後にある数理モデルを簡単に解説し、この計算がなぜ成り立つのかを説明します。

### 1. Word2Vecとは？
- Word2Vecは、単語をベクトル（数値の並び）に変換する技術であり、単語間の類似度を数値的に表現することができます。
- 単語をベクトルにすることで、自然言語処理の様々なタスクに応用できるようになります。これにより、単語間の関係性や類似性を解析することができます。

### 2. 単語のベクトル演算が成り立つ理由
- **線形モデルに基づいているため**
  - 単語は高次元のベクトル空間上に配置され、各単語の意味を数値的に表現しています。Word2Vecでは、ある単語が他の単語と共に出現する頻度を元に、文脈に応じた意味を学習します。このため、単語の「意味の差異」がベクトルの差異として現れます。
  
- **具体的な例**
  - 動画でも紹介されている「King - Man + Woman = Queen」という計算は、各単語が持つベクトルがそれぞれの意味に対応しているために可能となっています。「King」から「Man」を引くことで、男性の意味を削ぎ落とし、そこに「Woman」を加えることで、女性の意味を持つ「Queen」が得られるという理屈です。

### 3. Word2Vecの学習モデル
- **CBOW（Continuous Bag of Words）とSkip-gramモデル**
  - Word2Vecには主に2つのモデルがあります。CBOWは文脈から単語を予測し、Skip-gramは単語から文脈を予測します。これにより、単語の意味を効率的に学習することができます。
  - CBOWの仕組みは、動画での説明にもある通り、文の前後にある単語を使って中央の単語を予測することで、その単語のベクトルを更新していきます。

### 4. ベクトル演算の数式解説
- **ベクトルの内積**
  - ベクトル同士の類似性は、主にベクトルの内積を通じて測定されます。類似する単語ほど、ベクトルの角度が小さく、内積が大きくなります。
  
- **線形代数の応用**
  - 動画内でも図示されていたように、単語ベクトルの差を取ることで、意味の差異を表現し、さらに加算することで新たな意味を持つ単語を計算できることが示されました。この仕組みは、線形代数に基づいています。

### 5. まとめ
- Word2Vecは、単語をベクトルとして数値化し、そのベクトル間の演算を可能にする技術です。これにより、文脈に応じた単語の意味を学習し、単語同士の関係性を数式的に表現できます。
- ベクトル演算が成り立つ理由は、Word2Vecが線形モデルに基づいており、類似する意味の単語が似たベクトルとして表現されるためです。
- 今後、Word2Vecをさらに応用していくことで、自然言語処理のさまざまな問題に解決策を見いだせるでしょう。

---

### 参考文献
- 動画：[【深層学習】word2vec の数理 - なぜ単語の計算が可能なのか](https://youtu.be/jlmt4nY0-o0?si=4rBZzBIglyacLkI8)
お店の売場にフォトスポットを作って集客しよう

こんにちは、私は小売業で戦略担当をしています。

昨今、ネット販売や競争環境の激化で、ただ商品を並べて販売するだけでは、価格や数量だけが優先され、コストカットや効率化も影響し、お買物をする楽しさを訴求する機会が失われてきています。
そんな状況を少しでもDXを活用して、解決出来ないか取組んでみました。





# 使用したもの

<font color="HotPink"> •palanAR</font>
<font color="HotPink"> •cgtrader</font>
<font color="HotPink">GPTS image-generator</font>
<font color="HotPink">•canba</font>

販売する場所に、関連する商品の3D画像を配置したフォトスポットを作る。
楽しさと、関連販売を同時にしてみようと考えました。

<font color="HotPink">完成版がこちらです。

https://x.com/6PepWVdwKJ61291/status/1836598493747778057

こちらはpalanARで作成しています。

https://palanar.com/mypage

今から準備して、各お店で取組みできそうな、いちご売場でのケーキをモチーフしたサンプルを作っています。
詳しい作り方は下記ページをご参照ください。

https://palan-ar.zendesk.com/hc/ja/articles/10448461504665-Q-%E3%83%97%E3%83%AC%E3%83%9F%E3%82%A2%E3%83%A0%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%B9%B3%E9%9D%A2%E8%AA%8D%E8%AD%98AR%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B

# 手順

<font color="HotPink">①cgtraderで素材を探す</font>
浮かび上がるケーキ🍰は、<font color="HotPink">cgtrader</font>のサイトから探しています。
探し方は　<font color="HotPink">gltf , glb</font>ファイルで条件指定、無料の素材、英語で検索した方が、比較的多くでてきます。
気に入った素材をダウンロードしておきます。


https://www.cgtrader.com/

会員登録後、キーワードを入れて検索できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/d06e5421-dded-a2bb-3bc9-0a7e9af96453.png)

検索条件に従って画像が表示されます。最初はいちご🍓売場なので、いちごの画像で作ったのですが、同質化したり、関連販売を起因できないため、ケーキ🍰に変更しました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/90bf5e59-19e8-db3c-3d65-d05af0cd3b7f.png)

<font color="HotPink">②palanARの操作</font>

ファイルから追加部分に売場画像ファイルを選択しています。
素材から追加部分に先程cgtraderからダウンロードした素材を入れます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/2d1354c0-fc41-cc66-3097-1c93f5db99a3.png)

素材を配置して、携帯電話でpalenARアプリをダウンロード。



<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/8035a202-4aca-bd7d-215a-d6ff2b141656.png">

携帯のアプリを起動すると画面上に立体画像が表示されます。

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/bb4b9278-a18e-e5b0-c6e4-e7d0391db315.png">


# 販売促進広告の作成

各店舗で開催する為に、プロモーション用のデジタル広告、店頭用の告知広告になるチラシも作ってみました。
作成は<font color="HotPink">canba</font>を使っています。開催日や開催場所の案内を入れて完成です。

https://www.canva.com/


![いちごデジタルちらし.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/594989da-65fb-06c2-57c1-ad05c20a77c1.jpeg)

チラシの中にある挿絵は、ChatGPTのGPTSにあるimage-generatorを使って描いています。


https://chatgpt.com/g/g-pmuQfob8d-image-generator

今回の取組みを実施してみて、好評であれば展開場所を増やそうと思います。
お菓子の売場にキャンディ🍬の3D画像、玩具の売場に車🚗•人形🧸•恐竜🦖などを表示できると面白そう！
従業員が慣れてきたら、子供向けのイベントとして、3D画像の作成体験として開催してみたいと思います。


以上です。
最後までお読みいただきありがとうございました。
chatgpt解約したい,領収書欲しいが、マイプランが出ない。

chatgptの解約、領収書や請求書ほしいが、右上マイプランが無い！

* キャッシュ削除
* シークレットモードなど
したが駄目だった...

chatgptのpricingから入り、現在のプランをクリックし...下記画面まで辿り着いたら"サブスクリプションを管理する"をCLICKしたらやっと画面出てきた。しかし、ここまでしないと解約できないとは問題だな...

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/a6ddc6f2-4f05-6e40-5ce5-3f4ca21242ce.png)
LSTMを用いたRNNに記憶をもたせる

## はじめに
RNN（Recurrent Neural Network）は、時系列データや自然言語処理など、順序を持つデータに適したニューラルネットワークです。しかし、標準的なRNNは短期的な依存関係の学習には適している一方で、**長期的な依存関係**を捉えることが苦手です。  
この問題を解決するために、LSTM（Long Short-Term Memory）が提案されました。LSTMは、**長期記憶**と**短期記憶**の両方を保持し、必要に応じて忘れることで、長期的な依存関係を扱うことができます。

本記事では、RNNの問題点を振り返りつつ、LSTMの構造とその動作について解説します。

---

## 1. Simple RNNの課題
### RNNとは？
RNNは、時系列データに対して時間ステップごとに入力を処理し、内部の**隠れ状態（hidden state）**を更新していくモデルです。RNNでは次のような数式でモデルが表されます。

- **入力**：\( x^{(0)}, x^{(1)}, \dots, x^{(T)} \)
- **隠れ状態**：\( h^{(t)} = f(x^{(t)}, h^{(t-1)}) \)
- **出力**：\( y^{(t)} = g(h^{(t)}) \)

しかし、RNNは次のような課題を抱えています。

- **勾配消失問題**：長い時系列データに対して、過去の情報が勾配消失により学習に寄与しづらくなる。
- **長期依存関係の捉え方が弱い**：遠い過去の情報が無視される傾向が強い。

この問題を解決するために、LSTMが登場しました。

---

## 2. LSTMの仕組み

LSTMは、RNNの構造に対して3つの「ゲート」を導入し、**情報の選択的な記憶、忘却、出力**を可能にすることで、長期的な依存関係を保持できるように設計されています。

### LSTMの基本構造
LSTMは、RNNと同様に時系列データを扱いますが、次の4つの状態とゲートを用います。

- **忘却ゲート**（Forget Gate）：過去の記憶をどれだけ忘れるかを決定します。
  \[
  f^{(t)} = \sigma(W_f \cdot [h^{(t-1)}, x^{(t)}] + b_f)
  \]
- **入力ゲート**（Input Gate）：新しい情報をどれだけ記憶するかを決定します。
  \[
  i^{(t)} = \sigma(W_i \cdot [h^{(t-1)}, x^{(t)}] + b_i)
  \]
  \[
  \tilde{C}^{(t)} = \tanh(W_C \cdot [h^{(t-1)}, x^{(t)}] + b_C)
  \]
- **セル状態**（Cell State）：長期記憶を保持します。
  \[
  C^{(t)} = f^{(t)} \cdot C^{(t-1)} + i^{(t)} \cdot \tilde{C}^{(t)}
  \]
- **出力ゲート**（Output Gate）：出力をどれだけ次の隠れ状態に反映させるかを決定します。
  \[
  o^{(t)} = \sigma(W_o \cdot [h^{(t-1)}, x^{(t)}] + b_o)
  \]
  \[
  h^{(t)} = o^{(t)} \cdot \tanh(C^{(t)})
  \]

### LSTMの数式

LSTMの数式は以下のように表されます。

- **忘却ゲート**：  
  \[
  f^{(t)} = \sigma(W_f \cdot [h^{(t-1)}, x^{(t)}] + b_f)
  \]
- **入力ゲート**：  
  \[
  i^{(t)} = \sigma(W_i \cdot [h^{(t-1)}, x^{(t)}] + b_i)
  \]
  \[
  \tilde{C}^{(t)} = \tanh(W_C \cdot [h^{(t-1)}, x^{(t)}] + b_C)
  \]
- **セル状態更新**：  
  \[
  C^{(t)} = f^{(t)} \cdot C^{(t-1)} + i^{(t)} \cdot \tilde{C}^{(t)}
  \]
- **出力ゲート**：  
  \[
  o^{(t)} = \sigma(W_o \cdot [h^{(t-1)}, x^{(t)}] + b_o)
  \]
  \[
  h^{(t)} = o^{(t)} \cdot \tanh(C^{(t)})
  \]

---

## 3. まとめ

LSTMは、従来のRNNが抱えていた長期依存関係の学習問題を克服するために、3つのゲート構造を導入しました。  
これにより、**長期記憶**と**短期記憶**を適切に制御し、時間的に遠い情報も効果的に保持・利用できるようになっています。

次回の記事では、LSTMを実際のタスクに応用する方法について解説していきます。

---

## 参考文献
- Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735–1780.
- Olah, C. (2015). Understanding LSTM Networks. [Blog post](http://colah.github.io/posts/2015-08-Understanding-LSTMs/).
- [【深層学習】LSTM - RNN に記憶をもたせる試みその2](https://youtu.be/oxygME2UBFc?si=0I_6AQMtJ10Y2OlP)

--- 

以上、LSTMの基礎について解説しました。質問やコメントがあれば、ぜひお寄せください！
[その3] Terraform Cloud Private Registory サブモジュール使ってみた

## これは何?
Terraform Cloud のサブモジュールの呼び出しについて解説します。

## サブモジュールについて

[前回](https://qiita.com/atw0_0w/items/58812c0baf1a0000b757)、Private Registryを登録して、メインモジュールを呼び出すことができました。
その際、プライベートレジストリから呼びだす際はsource句の部分のような内容になります。


```hcl
# メインモジュールの呼び出し
module "network-templates" {
  source  = "app.terraform.io/atsuw0w-test-terraform/network-templates/aws"
  version = "1.0.0"
}
```


上記のモジュールですが、サブモジュールを複数作成し呼び出すことも可能です。
例えば、VPCネットワークをメインモジュールと定義し、セキュリティグループやVPCエンドポイントについてはサブモジュールから呼び出すことが可能です。
(メインとしては作成したくないけど、必要な時に作成したいリソースとかをサブモジュール化すると使い勝手が良いと思います。)

次にサブモジュールを登録します。
[前回](https://qiita.com/atw0_0w/items/58812c0baf1a0000b757)作成したプライベートレジストリ下に`modules/<リソース名>`を作成し.tfテンプレートを作成します。
また、テンプレートは[こちら](https://github.com/atsw0q0/terraform-aws-network-templates/tree/main/modules/security_group)から是非参考にお願いします!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/3bf8639b-7a00-da94-ffed-8eac4aa4c4d6.png)

登録が完了して利用可能であるなら、以下のようにサブモジュールを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/456eb647-a47a-a898-d59b-bc8e58676316.png)


次に作成したサブモジュールを呼び出しましょう。
[以前のワークスペース作成](https://qiita.com/atw0_0w/items/6b55f671e1088cbc140e) を使用しても構いませんが、ディレクトリを「02_private_registory」に変更し、
呼び出す`./02_private_registory`下のテンプレートは[こちら](https://github.com/atsw0q0/test-terraform-cloud/tree/main/02_private_registory)になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/c1e8e419-7123-7088-d540-d07de5a1426d.png)



サブモジュールの呼び出しは以下の通りとなります。 
source 部分のレジストリの後ろに`//modules/<モジュール名>`と後付けすればサブモジュールを呼び出すことができます。
```hcl
# サブモジュールの呼び出し
# source = 
module "network-templates" {
  source  = "app.terraform.io/atsuw0w-test-terraform/network-templates/aws//modules/security_group"
  version = "1.0.0"
}

```

Terraform Cloud から呼び出してみましょう。
ワークスペース内の「+New Run」ボタンから手動でplan/applyを以下のように実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/ff527032-c062-ac9c-4741-ba79566514df.png)

実行することによって、plan/applyが成功するため、サブモジュールからも呼び出すことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/e01be455-4a34-439c-fe4a-18a2de8ba5d9.png)