OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SAA-C03に合格できたのでやったことを書いてみる

先日受けたAWS SAA-C03に無事合格することができたので、
自分の勉強方法について書いていきます。何か参考になればと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/165bb7af-9588-0865-9d25-77c4fbe168ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/4ebd1eab-4cc8-e282-bd7e-27c6a8fa6931.png)

### 筆者の経歴
・バックエンドメインのシステムエンジニア3年目
・インフラ（AWS）の実務経験なし

### 受験した理由
趣味で個人開発をしているのですが、サイト管理をAWSでしてみたいなと思い
アカウント作成して触ってみるものの、何もわからず資格取得に手を出す。

### 勉強に使用したもの
前提：AWS CLFの合格
[Cloud License](https://cloud-license.com/ "Cloud License")だけ

参考書の購入もしましたが、1,2回読んだだけで使いませんでした。
### 勉強方法
勉強期間：2～3ヶ月
①Cloud Licenseのセクション#61~170を予習・復習する（約3週）
②Cloud Licenseの「AWS認定本試験モード」を6回くらい実施。間違えた問題は復習。
　1回目の実施は7割弱、試験前日には8割前後を回答できていました。

### 合否時間
自分は11時に試験を受けたのですが、当日の19時頃に合否メールが届いてました。

### 感想
Cloud License有料ではあるのですが、解説も分かりやすく大変助かりました。
アソシエイト系までは引続き勉強して取得を目指そうかなと考え中…。
VisualStudio Codeチートシート

## はじめに
主に自分向けの備忘録です。

## 置換系
### 重複行を排除したい
1. 重複行を排除したい箇所を選択する
1. `cmd` + `shift` + `P`　を押下、行を昇順に並び替え（Sort Lines Ascending)
1. `cmd` + `F`　を押下し、検索文字列、置換文字列を下記で入力する [^1] [^2]
    
    ```:検索box 
    (^.*$)\n(\1\n){1,}
    ```
    ```:置換Box
    $1\n
1.  置換する

<details><summary>画像</summary>
1.　の画像
1.　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577449/2e7b83a9-334b-c28e-0d23-629314870802.png)

</details>

### 特定の文字列を含まない行を検索したい
1. `cmd` + `F`　を押下し、検索文字列 に下記を入力する [^3]
```
^(?!.*特定の文字列).*\n
```
#### 例： URL（http）以外の行を削除したい
```
^(?!.*http).*\n
```
#### 例： URL（http）以外の文字で始まる行を削除したい
```
^(?!http).*\n
```



[^1]:正規表現の意味は `(^.*$)` ： 改行を除く1行分、`\n` ： 改行文字、`(\1\n){1,}`は同一文字列内の1つ目のグループ(`(^.*$)`)の1回以上の繰り返し。つまり、「最初から最後の文字+改行」が2回以上続いている文字列を指す。
[^2]:正規表現の意味は`$1` ： 　検索Boxの1つ目のグループ(`(^.*$)`)のこと。
[^3]:正規表現の意味は`^(?!.*特定の文字列)` ： 「「0以上の文字列+特定の文字列」で始まる」の否定
Arduino UNO R4 WiFi をUSB経由で接続してSerial Monitorだと繋がっているのにExcel Data Streamerだとデータの取り込みができないとき

Excel Data Streamerにおいて
Arduino UNO R3で問題なくデータを取り込めていたスケッチを、Arduino UNO R4 WiFiに書き込んで使ってみたらデータの取り込みができませんでした。
調べてみたところ、同じ症状の相談書き込みが
https://forum.arduino.cc/t/uno-r4-wifi-not-working-with-excel-data-streamer/1198001
にありました。
ようは環境によっては通信の開始時にdtr信号を送る必要があり、その場合は
```Arduino:test001.ino
#include<HID.h>
void setup(){
    Serial.begin(9600);
    Serial.dtr();
}
```
のように記述するとうまくいくかも
みたいなことが書いてあったのでこの通り試してみたところデータの取り込みに成功しました。
同じ症状で悩んでいる方は一度お試しあれ。
【丸亀製麺】ABC366 B で沼って4完が台無し【間違い探し】

## 問題（間違い探し）
にわかに話題の [AtCoder Beginner Contest 366 B問題](https://atcoder.jp/contests/abc366/tasks/abc366_b) 、
自信満々で出したC++コードが「WA」で慌てふためきました。

どこが間違っているでしょう？

### B問題の大意
与えられた複数行の文字列を、縦書きに見えるよう出力せよ。

### 入出力の比較（出題ページ / 提出コード）
※この入力例1も「WA」が出ています。
| - | 入力 | 出力 |
|:-:|:-:|:-:|
| 公式の入出力例 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/85dae698-971a-5dfc-b965-1730ba9cffa7.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/b2ccfb4c-9a8d-4702-d4f5-625c6bf824eb.png) |
| 提出コードで<br>コードテスト | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/614dea53-0261-ef17-dd88-e89bbbc17462.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/0d3ab8ac-c6e9-7ebf-5169-8ff4fd66195a.png) |

### 提出したコード
https://atcoder.jp/contests/abc366/submissions/56532064
#### ▼関係ない行を削除して整理したもの
```C++
#include <bits/stdc++.h>
using namespace std;
#define OVERLOAD_REP(_1, _2, _3, name, ...) name
#define REP1(i, n) for (auto i = std::decay_t<decltype(n)>{}; (i) != (n); ++(i))
#define REP2(i, l, r) for (auto i = (l); (i) != (r); ++(i))
#define rep(...) OVERLOAD_REP(__VA_ARGS__, REP2, REP1)(__VA_ARGS__)

int main() {
  int n;
  cin >> n;

  int max = 0;
  int sl;

  vector<string> s(n);
  rep(i, n) {
    cin >> s[i];
    sl = s[i].length();
    if (max > sl) {
      rep(j, max - sl) { s[i].push_back('*'); }
    } else {
      max = sl;
    }
  }

  rep(i, max) {
    for (int j = n - 1; j >= 0; j--) {
      cout << s[j][i];
    }
    cout << endl;
  }
}
```

## 答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/8fe69abc-2d3b-7973-8f39-a745bd0a7ea7.png)
答え. 末尾に余計なスペースが入っていた
（ぜんぜん気付かなかった。。。）

## 言い訳と日記のコーナー（C++のcout仕様など）
C++ `iostream`の`cout`は、文字列中の`char`が格納されてない要素にアクセスすると、半角スペースを返すようです。
segmentation fault 等のエラーになるとかでもない様子。
#### ▼検証用に色々出力したもの
```C++
int main() {
  vector<string> u();
  cout << u[0] << "←u[0]" << endl;
  cout << u[0][0] << "←u[0][0]" << endl;

  vector<string> u2(1);
  cout << u2[0] << "←u2[0]" << endl;
  cout << u2[0][0] << "←u2[0][0]" << endl;

  vector<string> s(3);
  s = {"Kamaage", "Udon", "Senmonten"};
  cout << s[0][5];
  cout << s[1][5];
  cout << s[2][5];
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/9711fb45-af97-d781-83e3-8241d8772e10.png)

▼コードテストの標準出力を、手元のVSCodeに貼り付けたとき、末尾のスペースが消失するのに気づかなかったのもツラめでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/fe937eee-dd02-9c6a-ec07-ef6e987a8eab.png)

▼D問題解き終わったとき（22時09分）、ようやくB問題の「WA」の文字に気づき、何が違うのか分からず半泣きでWAを量産した様子がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/a636dff2-7d97-7908-31b7-0cee9f0e8669.png)

▼早めにD問題を提出できて「入緑に近づいたかも」とホクホクしてから一転、蓋を開けたらレート下がってたのが結構ショック。美味しいもの食べて寝ます！さようなら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/a1581176-8058-db19-2dea-d4208b09093d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139560/418387ff-3d51-0ecd-6f2c-47b963d4d825.png)
自分がよく個人開発で使うターミナルコマンドまとめ(フレームワークなど)

## はじめに
初めましての人もそうでない人もこんにちは！
今回は自分がよく使うターミナルコマンドをまとめたいと思います！

皆さんは個人開発をよくしますか？
自分はコミュ障なのでなかなかチーム開発の機会なんてほとんどありません

まぁ自分がコミュ障なのは置いておいて個人開発する時って大抵Reactを使うためにnpx・・・と長いコマンドを使ったりしてませんか？

そんな長いコマンドを毎回のように入力することが大変面倒でChatGPTとかに毎回教えてもらっています！

コマンド用のテキストファイルを作成しましたが毎回のようにローカルファイルの海に漂っています・・・

なので今回は主に自分用という部分が大きいですが、皆さんにも共有できたらと思いこの記事を作成しました！

## React + TypeScript
```
npx create-react-app frontend --template typescript
cd frontend
npm start
```

## venv + Python
### MacOS/Linuxの場合
```
python -m venv venv
source venv/bin/activate
```
### Windowsの場合
```
python -m venv venv
venv\Scripts\activate
```
### venv環境の非アクティベート
```
deactivate
```
### パッケージを一括インストール
```
touch requirements.txt
pip install -r requirements.txt
```
### 現在使っているライブラリをrequirements.txtに出力するコマンド
```
pip freeze > requirements.txt
```

## Go
```
go mod init backend
touch main.go
```

## EXPO + TypeScript or JavaScript
```
npm install -g expo-cli
expo init mobile_project
cd mobile_project
npm start
```

## おわりに
今回は自分が主に使っている環境構築で使っているコマンドです！
この記事を通して使っていただけると幸いです！

もしこのコマンドも追加して！という意見があればぜひ遠慮なくコメントください！
なるべく早く記事に追加します！

今回の記事はいかがだったでしょうか？
またどこかの記事でお会いしましょう！
Kaggle Masterに学ぶ機械学習実践アプローチ 写経 04

```python
# src/train.py
import argparse
import model_dispatcher
import config
import joblib
import pandas as pd
from sklearn import metrics
from sklearn import tree

def run(fold, model):
    # read the training data with folds
    df = pd.read_csv(config.TRAINING_FILE)
    # training data is where kfold is not equal to provided fold
    # also, note that we reset the index
    df_train = df[df.kfold != fold].reset_index(drop=True)
    # validation data is where kfold is equal to provided fold
    df_valid = df[df.kfold == fold].reset_index(drop=True)
    # drop the label column from dataframe and convert it to
    # a numpy array by using .values.
    # target is label column in the dataframe
    x_train = df_train.drop("label", axis=1).values
    y_train = df_train.label.values
    # similarly, for validation, we have
    x_valid = df_valid.drop("label", axis=1).values
    y_valid = df_valid.label.values
    # initialize simple decision tree classifier from sklearn
    clf = model_dispatcher.models[model]
    # fit the model on training data
    clf.fit(x_train, y_train)
    # create predictions for validation samples
    preds = clf.predict(x_valid)
    # calculate & print accuracy
    accuracy = metrics.accuracy_score(y_valid, preds)
    print(f"Fold={fold}, Accuracy={accuracy}")
    # save the model
    joblib.dump(clf, f"{config.MODEL_OUTPUT}dt_{fold}.bin")
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--fold", type=int)
    parser.add_argument("--model", type=str)
    args = parser.parse_args()
    run(fold=args.fold, model=args.model)
```

```python
from sklearn import tree 
from sklearn import ensemble

models = {
    "decision_tree_gini": tree.DecisionTreeClassifier(criterion="gini"),
    "decision_tree_entropy": tree.DecisionTreeClassifier(criterion="entropy"),
    "rf": ensemble.RandomForestClassifier()
}
```

```python
TRAINING_FILE = "../input/mnist_train_folds.csv"
MODEL_OUTPUT = "../models/"
```

```bash
#! /bin/bash

for fold in {0..4} 
do
    python train.py --fold $fold --model rf
done
```
iOSDC 2024 ノベルティボックス開封してみた

# はじめに
本記事では、iOSDC 2024のノベルティボックスに入っていたノベルティについて紹介していきます。

なぜ紹介するのかというと、
昨年自分がノベルティボックス付きのチケット購入ができず、
ノベルティボックスにはどういったものが入っていたのか気になったといったことがあったためです。

今年ノベルティボックス付きのチケットが購入できなかった人向けに記事投稿します。

# iOSDCとは
そもそもiOSDCとは何かについて、言及しておこうと思います。
引用になりますが、下記に記載します。

> iOSDC Japan 2024はiOS関連技術をコアのテーマとしたソフトウェア技術者のためのカンファレンスです。今年もリアル会場とオンライン配信のハイブリッド開催を予定しています。
日本中、世界中から公募した知的好奇心を刺激するトークの他にも、パンフレットに掲載された技術記事、自分のペースでゆっくり参加できるポスターセッション、気持ちを盛り上げるネイルアートやフェイスペインティング、オープニングパーティ & 懇親会などなど、初心者から上級者まで楽しめるコンテンツがみなさんを待っています。
8月22日（木）〜 8月24日（土）はお祭りです！お楽しみに！！

https://iosdc.jp/2024/

# ノベルティボックス開封

ノベルティボックスの中身を写真で撮りました。
下記にまとめて載せています。

|正面|背面|左側面|右側面|
|:---:|:---:|:---:|:---:|
|![IMG_3429.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/37f3b537-54a1-971e-2f8d-68b9c8e6a61a.jpeg)|![IMG_3427.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/6ae79ab5-3fdc-40e5-f053-e9d5d8b5789a.jpeg)|![IMG_3428.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/590183cf-5745-c7e7-140b-6ef5d90f5487.jpeg)|![IMG_3426.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/97249099-9a73-0609-4bc4-a38e6d150e57.jpeg)|

|開封後|上段 1|上段 2|下段|
|:---:|:---:|:---:|:---:|
|![IMG_3430.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/6dba41c1-b63b-e775-382d-9433054ad04f.jpeg)|![IMG_3431.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/ba59b5c6-2bc8-12b3-1a9e-17c56b877651.jpeg)|![IMG_3435.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/8ffbc18d-3813-c381-c723-73d708e79b9a.jpeg)|![IMG_3437.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/23c30959-be85-3fc8-5bbc-3086eb6568fc.jpeg)|

下記は、個人的に良いなと思ったノベルティです。

|コースター|手さげ|クールタオル|
|:---:|:---:|:---:|
|![IMG_3439.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/df7a0c1b-c596-d800-f1b9-c307d5b0268e.jpeg)|![IMG_3441.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/e0d73240-df76-d594-c1da-7bdd56f61d95.jpeg)|![IMG_3443.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/cf90e2a4-31ba-16ab-a2ee-da97c3d07218.jpeg)|

# さいごに
iOSアプリを趣味で開発している身として、
iOSDCでは、iOS開発における面白い話や、役に立つような話などを聞けることを期待しています。
iOSDCの開催まで残り２週間ほどになりましたが、ワクワクしながら待ちたいと思います！

※記事投稿時点では、まだチケット販売しているようですので、
　興味のある方はご購入されると良いと思います！


以上。
JavaScript: 圧縮とかLogistic Mixing

<p>P<sub>i</sub>(1) を i 番目のmodelが予測する次のbitが 1 である確率とする。このとき、Logistic Mixingによる最終的な予測確率 P(1) は以下のように計算される。
<ul>
<li>x<sub>i</sub> = stretch(P<sub>i</sub>(1))
<li>P(1) = squash(Σ<sub>i</sub> w<sub>i</sub> x<sub>i</sub>)
</ul>
<p>ここで
<ul>
<li>stretch(x) = ln(x/(1-x))
<li>squash(x) = 1/(1+exp(-x)) (stretch の逆演算).
</ul>
<p>それぞれの予測の後、Dataを符号化する計算量を最小化するように重みが調整される。
<ul>
<li>w<sub>i</sub> ← w<sub>i</sub> + η x<sub>i</sub> (y-P(1))
</ul>
<p>ここでηは学習率(典型的な値は 0.002 から 0.01)、y は予測bit、(y-P(1))は誤予測。

## 実装
[roadroller](https://github.com/lifthrasiir/roadroller)というprogramにしっかりちゃっかりうっかり組み込まれております(sparse modelと組み合わせる)。その[体験版](https://lifthrasiir.github.io/roadroller/)で威力を堪能してみる事をおすすめします。
よそ様に丸投げする訳にもいかないので、私家版のようなものをしっかりちゃっかりうっかりcodepenに仕込んでみました。本家との大きな違いはrange coderを利用している点とfile処理にも対応している点。ただし圧縮文に復号噐は含まれない。

<p class=codepen data-height="300" data-default-tab="result" data-slug-hash="eYwRydO" data-pen-title="Logistic Context Mixing compressor" data-user="xezz" style="height:300px;box-sizing:border-box;display:flex;align-items:center;justify-content:center;border:2px solid;margin:1em 0;padding:1em"> <span>See the Pen <a href="https://codepen.io/xezz/pen/eYwRydO">Logistic Context Mixing compressor</a> by xezz (<a href="https://codepen.io/xezz">@xezz</a>) on <a href="https://codepen.io">CodePen</a>.</span></p><script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## その他の実装例
[LPAQ5](https://qiita.com/mashuel/items/be9f983cc8a919842601)
[LPAQ1](https://qiita.com/mashuel/items/051fbaf4b03762c32ea1)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（86/100）

【86日目】
トピック 9：SAPS/4HANAでの簡易製造（3/9）

≪問題86≫
繰返生産におけるレポートポイント確認の目的は何ですか。
（２つ選択）
□生産ラインで複数の異なる構成品目を同時に供給すること。
□生産ラインに沿って仕掛品を設定すること。
□供給された構成品目に対する在庫管理を適時更新すること。
□長い生産ラインで生産リードタイム合計を短縮すること。

≪解答≫
□生産ラインで複数の異なる構成品目を同時に供給すること。
■生産ラインに沿って仕掛品を設定すること。
■供給された構成品目に対する在庫管理を適時更新すること。
□長い生産ラインで生産リードタイム合計を短縮すること。

≪解説≫
◆繰返生産では、生産ラインに沿って使用される構成品目は、最終確認時にバックフラッシュされるため、リードタイムが長い場合、構成品目の出庫が実際の物理的な払い出しよりも大幅に遅れて転記される可能性があります。
◆作業が正常に完了した後の早い段階でレポートポイントバックフラッシュを使用することで、構成品目（および生産活動）の払い出しを転記し、在庫管理を適時に更新することが可能になります。また、仕掛品の確認も可能となります。
ABC366をPythonで（A～D）

AtCoder Beginner Contest 366の解答等のまとめ

https://atcoder.jp/contests/abc366



# A問題
https://atcoder.jp/contests/abc366/tasks/abc366_a

大きいほうを2倍して比べる
```python:A
n, t, a = map(int, input().split())

print("Yes" if max(t, a) * 2 > n else "No")
```

# B問題
https://atcoder.jp/contests/abc366/tasks/abc366_b

100行用意して入れていく
出力する順番と逆になっているので反転させて、余計な*を消す
```python:B
n = int(input())
t = [[] for _ in range(100)]
for _ in range(n):
    s = input()
    for i in range(100):
        if i < len(s):
            t[i].append(s[i])
        else:
            t[i].append("*")

for t_i in t:
    T = "".join(t_i[::-1]).rstrip("*")
    if T:
        print(T)
```

# C問題
https://atcoder.jp/contests/abc366/tasks/abc366_c

セットと辞書で対応する
```python:C
s = set()
d = [0] * (10 ** 6 + 10)

for _ in range(int(input())):
    com = list(map(int, input().split()))
    if com[0] == 1:
        x = com[1]
        s.add(x)
        d[x] += 1
    elif com[0] == 2:
        x = com[1]
        d[x] -= 1
        if d[x] <= 0:
            s.discard(x)
    else:
        print(len(s))
```

# D問題
https://atcoder.jp/contests/abc366/tasks/abc366_d

３次元の累積和と包含関係を利用する
```python:D
n = int(input())
a = [[list(map(int, input().split())) for _ in range(n)]for _ in range(n)]

for i in range(n - 1):
    for j in range(n):
        for k in range(n):
            a[i + 1][j][k] += a[i][j][k]

for i in range(n):
    for j in range(n - 1):
        for k in range(n):
            a[i][j + 1][k] += a[i][j][k]

for i in range(n):
    for j in range(n):
        for k in range(n - 1):
            a[i][j][k + 1] += a[i][j][k]


def get(x, y, z):
    if x >= 0 and y >= 0 and z >= 0:
        return a[x][y][z]
    else:
        return 0


for _ in range(int(input())):
    lx, rx, ly, ry, lz, rz = map(lambda x:int(x) - 1, input().split())
    lx -= 1
    ly -= 1
    lz -= 1
    print(get(rx, ry, rz)
          - get(lx, ry, rz) - get(rx, ly, rz) - get(rx, ry, lz)
          + get(lx, ly, rz) + get(lx, ry, lz) + get(rx, ly, lz)
          - get(lx, ly, lz))
```
Docker : ホストからコンテナにファイルコピー

# はじめに
はじめに、dockerコンテナをビルドしたときに、ホストからファイルをコピーしたいときありますよね。そんな時の手順を示します。


# 手順
以下コマンドで実効可能。
```
docker cp <コピー元のパス> <コンテナ名>:<コピー先のパス>
```
MySQLコンテナにコンテナ間接続できない時

## 問題

    Error connecting to MySQL: (2003, "Can't connect to MySQL server on 'db_server' ([Errno 111] Connection refused)")

docker環境に上記のエラーが出てしまってコンテナ間でデータベースのテストができなかった

## 結論

色々 docker-compose.yml を操作して頑張っていましたが、結論としては
「DBコンテナが立ち上がる前に、別コンテナがアクセスしようとしてエラーとなって落ちていること」

が原因でした。以下のテストコードで接続が成功するかを試してコンテナ間の問題ではないことをチェックしてみてください。5回のリトライ試行を導入したコードになります。

```python

import time
import pymysql
from cryptography.fernet import Fernet

retries = 5  # Number of retry attempts

while retries > 0:
    try:
        conn = pymysql.connect(
            host='db_server',
            user='authoperator',
            password='authoperatorpass',
            database='authdb'
        )
        print("Connected to MySQL")
        break  # Exit the loop if connection is successful
    except pymysql.err.OperationalError as e:
        retries -= 1
        print(f"Error connecting to MySQL: {e}")
        print(f"Retrying... ({5-retries}/5)")
        time.sleep(5)  # Wait 5 seconds before retrying

if retries == 0:
    print("Failed to connect to MySQL after 5 attempts")

```
oracleDB よく使うコマンドまとめ

実務でoracleDBを使用する案件に遭遇したため、自分用の備忘録です。
なお、自分の案件で使用したoracleのversionは 

v18.0.0 ExpressEdition

となります。


# ログイン
まずはDB接続するログインコマンド
```bash
sqlplus ユーザー名/パスワード@ホスト名:port番号/oracleSID
```

設定項目が多いですが、コマンド例は以下のような感じ。
```bash
sqlplus admin/adminpass@localhost:1521/ORCL
```

oracleのポート番号のデフォルト値は、基本的に「1521」です。
oracleSIDのデフォルト値は基本的に「ORCL」のようです。
なお、oracleSIDの値は 「listener.ora」 というファイルに記述されているので確認が可能。
基本的に以下のディレクトリにあります。

### Macの場合
```bash
cat $ORACLE_HOME/network/admin/listener.ora
```

### Windowsの場合
```bash
type %ORACLE_HOME%\network\admin\listener.ora
```

ファイルの中を確認すると、以下のような形式で記述されています。

```bash
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = XE)
      (ORACLE_HOME = /PCのユーザー名/app/oracle/product/18.0.0/...)
    )
  )
```

ちなみに、 使用するoracleDBが「ExpresssEdition」の場合、デフォルトのoracleSIDの値はORCLではなく、「XE」が設定されます。（自分はこっちだった）


## ユーザー指定なしのログイン
「/nolog」 を加えることで、ユーザー指定せずにログインが可能です。
```bash
sqlplus /nolog
```

# DDL系コマンド 
データベース一覧の表示
```sql
show pdbs;
```

## テーブル作成 ［create table］
idのカラムには主キーと自動採番の設定を追加していいます。
「GENERATED BY DEFAULT AS IDENTITY」で自動採番設定にできます。
```sql
CREATE TABLE customer (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name VARCHAR2(50),
    age NUMBER,
);
```

## カラムの追加 ［ALTER TABLE ... ADD ］
```sql
ALTER TABLE customer ADD (email VARCHAR2(32));
```

### カラムの型変更 ［ALTER TABLE ... MODIFY ］
```sql
ALTER TABLE customer MODIFY (email VARCHAR2(64));
```

## テーブル削除 ［DROP TABLE］
```sql
DROP TABLE customer;
```

# DML系コマンド
基本mysqlなどと変わらないですが、一応メモ。

## レコード取得 ［select］
```sql
SELECT * FROM
  customer
WHERE
  id = 1;
```


## レコード挿入 ［insert］
```sql
INSERT INTO customer
  (name, age)
VALUES
  ('澁谷', 30);
```

## レコード更新 ［UPDATE］
```sql
UPDATE
  customer
SET
  name = '遠藤'
WHERE
  id = 1;
```


## レコード削除 ［DELETE］
```sql
DELETE FROM
  customer
WHERE
  id = 1;
```

## テーブル一覧の確認
テーブル一覧の確認コマンドはMysqlなどと比較すると、そこそこ異なります。

### 特定のスキーマのテーブル一覧を確認する
```sql
SELECT table_name FROM dba_tables WHERE owner = 'スキーマ名';
```
Mysqlの show tables; などと比較すると結構長い...


### 現在のユーザーが所有するテーブルの一覧を表示
```sql
SELECT table_name FROM user_tables;
```


簡単ですが以上です。
今後も追記していく予定です。
`pnpm dlx tsc`は使うべからず

`npx tsc` の代替として `pnpm dlx tsc` を呼び出すと意味不明なエラーが返ってきます:

```terminal
$ pnpm dlx tsc

                                                                               
                This is not the tsc command you are looking for                
                                                                               

To get access to the TypeScript compiler, tsc, from the command line either:

- Use npm install typescript to first add TypeScript to your project before using npx
- Use yarn to avoid accidentally running code from un-installed packages
```

これは`npx`がローカルを探索した後に必要であればレジストリからダウンロード[してくる](https://docs.npmjs.com/cli/v10/commands/npx#description)のに対し、`pnpm dlx`は**ローカルを探索せずに**レジストリから同名のパッケージをロードして実行するからです。
では、`pnpm dlx typescript` はどうでしょうか。実はこれも失敗します。

```terminal
$ pnpm dlx typescript
Packages: +1
+
Progress: resolved 1, reused 1, downloaded 0, added 1, done
 ERR_PNPM_DLX_MULTIPLE_BINS  Could not determine executable to run. typescript has multiple binaries: tsc, tsserver

Try one of the following:
pnpm --package=typescript dlx tsc
pnpm --package=typescript dlx tsserver
```

というわけで、`$ pnpm --package=typescript dlx tsc`を使うのは一つの正解です。

あるいは、すでにdevDependenciesに加えている場合は`pnpm exec tsc`でも良いです。
ただし、`pnpm exec`は先に`pnpm install`を走らせていないと失敗します。

## 参考
* https://docs.npmjs.com/cli/v10/commands/npx#description
* https://pnpm.io/ja/cli/dlx
* https://pnpm.io/ja/cli/exec
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（85/100）

【85日目】
トピック 9：SAPS/4HANAでの簡易製造（2/9）

≪問題85≫
繰返生産で計画テーブルを使用して、マニュアルで計画手配を生産ラインに割り当てると、どのような結果になりますか。
□計画手配によって能力所要量が生成される。
□計画手配の構成品目利用可能状況がチェックされる。
□計画手配の構成品目がピッキングリストにコピーされる。
□計画手配が製造指図に変換される。

≪解答≫
□計画手配によって能力所要量が生成される。
■計画手配の構成品目利用可能状況がチェックされる。
□計画手配の構成品目がピッキングリストにコピーされる。
□計画手配が製造指図に変換される。

≪解説≫
◆繰返生産におけるライン負荷（生産ラインへの計画手配の割り当て）の計画は、計画テーブルを使用して手動で行うことができます。
◆この場合、計画手配が生産に転送される前に、最終製品の組立品目（構成品目）の利用可能在庫がチェックされます。
web会議ツール「bellFace」について解説

昨今はリモートワークが普及し、会議や面談もオンラインで実施されることが多くなっています。その際に必ず必要になるのがweb会議ツールです。主流なものだと、Zoom、Google meet、Teamsなどがあるかと思います。
そのweb会議ツールの中で最近シェアを伸ばしているのがbellFaceです。bellFaceがどのような特徴を持った製品なのかについて解説していきます。

## bellFaceとは
bellFaceは、2015年に設立されたベルフェイス株式会社が提供するweb会議ツールです。リリースされてからまだ10年も経っていないですが、国内3000企業以上の導入実績があり、大手企業の導入実績も多数持っています。また、金融業界で大きなシェアを持っていることも特徴的です。金融業界は多くの個人情報を取り扱う性質上、セキュリティにはとても繊細な企業が多く、製品のセキュリティ面の安全性が高く評価されていることが見て取れます。

## 製品の特徴
### 電話面談に特化
bellFaceは電話面談に特化しています。音声は電話を使用し、ビデオや画面共有等の電話だけでは実現できない機能を補った製品です。
音声は電話を使用するので、オンラインでもお互いのネット環境に左右されることなく安定した会話を実現することができます。
また、電話は誰でも持っている環境ですし、使い方がわからない人もおそらくいないでしょう。そのため、どんなお客様に対しても容易にオンライン面談や商談を実施することができます。

### 接続がとても簡単
bellFaceの接続にはお客様側でのアプリのインストール等は一切不要で、簡単に接続ができます。
お客様の接続端末がスマートフォンであれば、スマートフォン宛にSMSを送信し、記載されているURLにアクセスしてもらうだけで接続ができます。
お客様の接続端末がPC、タブレットの場合は、まずお客様にbellFace公式HPにアクセスしていただき、そこに記載の4桁の接続番号を共有してもらいます。その後、ホスト側のbellFace画面に接続番号を入力すれば接続完了です。とても簡単ですし、お客様が戸惑う場合でも電話越しに簡単に説明できる手順なので、誰でもスムーズに接続することができます。

### 豊富な機能
bellFaceには、他のweb会議ツールには備わっていない機能がたくさん備わっています。
#### 画面共有
画面共有はどのweb面談ツールにも備わっている機能ですが、bellFaceならではの機能もあります。
まず、自分が画面共有するだけでなく、ホスト側による操作でお客様に画面共有を依頼することができます。お客様はそれを許可するだけで画面共有をスタートすることができます。
他のツールだと、お客様はツールに慣れていないので画面共有を依頼しても方法がわからないという場合が多くあると思います。bellFaceではこちらから操作ができる分、お客様による操作の負担が少なく、スムーズに画面共有を依頼することができます。
また、画面共有の機能の制限も柔軟に設定することができます。例えば、全画面共有はできないようにして、アプリケーションウィンドウやブラウザタブ単位の共有のみに設定することができます。全画面共有は意図しない画面を見せてしまったり、メールやチャットの通知が映り込んでしまったりと情報漏えいのリスクが高く、敬遠する企業も多くあると思います。
このようにセキュリティリスクに対して対策をできる点が、個人情報を多く取り扱う金融業界で評価されている一因ではないかと思います。

#### 資料共有
bellFace管理画面であらかじめ保存した資料を画面共有で見せることができます。それだけでなく、資料のURLを共有したり、ダウンロードしてもらうこともできます。ダウンロードは、画面共有のようにこちらがダウンロードを依頼するボタンを押下し、お客様は依頼に対してOKするだけでダウンロードができるので、お客様の操作負荷は軽くなっています。
事前保存した資料は他のユーザーにも共有されるので、営業担当者が定常的に使用する資料を保存しておくことで、すべての営業が同じ資料をもとに商談ができる環境を用意することができます。

#### 商談記録
bellFaceの接続が完了すると、商談記録の入力画面が表示され、記録を残すことができます。それによって、商談の内容を後で見返すことができたり、手応えを記録しておくことができます。またお客様へのアンケートを設定している場合、お客様からのフィードバック内容も商談記録に記録されます。
会議の録画も残すことができ、商談のあらゆる情報をbellFace上に記録として残すことができるのは非常に便利です。

#### 写真撮影
お客様がスマホで接続している場合、写真撮影機能を使用することができます。この機能を使用すると、bellFaceを接続しながらお客様のスマホでカメラを起動し、撮影した写真を共有してもらうことが可能です。必要書類情報の共有等に利用することができます。
このようなことは別のメールやチャットサービスと組み合わせれば実現できる事かもしれませんが、写真の撮影から共有までの一連の流れをbellFace上で行うことができるのは非常にシンプルで効率的です。

今回ご紹介する機能は以上ですが、他にもbellFaceならではの機能がたくさん備わっているので、気になった方は詳しく調べてみてください。


## おわりに
いかがでしたでしょうか。
bellFaceは他のweb会議ツールとは一味違った魅力があります。電話商談をもっと便利にしたいという方にはもってこいのサービスではないかと思います。
これからもっとシェアを伸ばしていくのではないかと思いますので、気になる方はチェックしてみてください。
begings_with:Godotの１番嫌いな所と聞かれたら、文字列の開始がbegins_withな所

たしか、godotはpythonに似せてるはずなのに、文字列の開始文字を調べるのに、**begins_with**を採用してます。普通は、**starts_with**だろうと

## Godotはbegins_with です。
今日は、Web Exportを試していました。

以下のコードがなぜか、trueにならなくて悩んでましたが、メソッド名間違えてました。

```
func _is_image_url(url):
	return url.starts_with("http") #web export not check grammer at all
```

しかも、WebExportのJavaScriptだとエラーにもならないので、原因特定まで時間かかってしまいました。

## 他に気をつけたいこと
あと、これには関係なく、文字の先頭に、改行やスペースが混じっていることがあるので、```url.strip_escapes()```も必要です。もちろん、urlのnull チェックも必要になります。
Google Home MiniとGoogle Nest Miniが使用できない件について

# はじめに
いやはや，もうこんな日になってしまい．お盆というところです．
僕はというものの，母方の実家を訪れとある依頼をさばいていました．

**「それはGoogleHomeが動かない」** というものでした．

これを解決するべく，僕はちょっくらイロイロやってました．

# 作業内容
- 現象再現
- WiFi接続確認
- 初期化
- Google Nest Miniを準備し再現
- WiFi接続確認
- 初期化
- 結論を推測

## 現象再現
とりあえず声をかけてみることにした．
「OK Google」と声をかけるも，

「エラーが発生しました。数秒後にお試しください。」

と帰ってきた．
何を声掛けしても，電源を入れなおしてもこの状態なので，現象は再現できたということにした．

 ## WiFi接続確認とルータのファームアップ
WiFiに接続できていないがこの手の問題の原因であると僕の中での経験が教えてきたため，とりあえず検証をすることに．設定をしたGoogleアカウントにログインしているHomeアプリより検証．
WiFiの状態を見るも，無事つながっている．そもそも，デバイスが見えている時点で大丈夫なのではないのかなと思う．
一応，Spotifyでのキャストができるかも確認しダブルチェックを行う．

無論，問題はない．

ここでルータのファームアップがうまくいってないからでは？と疑った．
Baffalo製だったため，192.168.11.1にアクセスし，ログイン．続けてファームウェアのバージョンを確認するも，最新版であることが判明．念のため，もう一度アップデートを行うものの，結果は変わらなかった．
    （ここだめの話，非常に腹立つ設定GUIであったため，後程たまたまカバンに入っていたIX2105に交換，APはお得意のソフバンエアーで対処．）

この時点で，ネットワーク起因の問題ではないと判断．

## 初期化
HomemMiniの底面についているボタンを長押しリセットを行う．
この時点でもうなにも情報は残らないので，初めからセットアップを行う必要がある．

セットアップを行い，前項現象再現と同様の試験を行うも，結果は変わらず．

どうしたものか．

この時点で，現時点で使用していたファームウェアによる（破損などの）何らかの異常ではないことを判断．

## GoogleNestMiniを準備し再現
急遽近所のハードオフでGoogleNestMiniを調達．2200円也．
僕がGoogleHomeを実家に置いた時には5台まとめて1万円で買い，1台あたり2000円ほどで購入したものの，もう今となってはNestMiniの2ndGenですらこの値段ということに，実は少々驚いていたのは秘密の話である．

とりあえず，セットアップを行い，再現を行う．
同じような症状が出て，残る疑いはファームウェアなのではないのか，とここら辺からあたりをつけてはいた．

## WiFi接続確認
とはいえ，確認を怠ることはミスを見落とす可能性でしかないため，同じようにWiFiの接続を確認．
Homeアプリからも問題なく確認，Spotifyのキャストも問題なく可能であった．

HomeMiniとまったく変わらない症状であることを確認した．

## 初期化
初期化も行った．
NestMiniの場合は少々面倒であり，

- ボリューム最小にする
- マイクをオフにする（サイドのボタンで行う）
- 再生・停止ボタンを長押しする．
- 初期化完了

という順で行う必要がある．正直，この初期化に関してはHomeMiniのほうが使い勝手が良かったのではないのかなあと感じている．

初期化を行い，先ほどと同様に試験をするも，結果は変わらなかった．

## 結論の推測
結論を推測するというのは非常によろしくないことであるとは思いますが，推論をする．

明らかに環境の問題ではないと今回の検証で感じていた．
そのため，同じような利用者がいるのではないのかと思いXを調べていた．

・・・と，すると同じような症状を持った人が多くみられることを知った．

よくよく調べると
「Google Home Mini/Nest Miniが正常に動作しない」

という投稿が多く見受けられた．
多くのエンジニアが解決に取り組んでいるものの，解消しないそうだ．

ただ，一部の解決策としてIPv6を無効化すれば解消するという投稿もあったのだが，うちは諸事情でv6を無効化できないため，この解決策はパスしている．

いずれにしろ，Googleにより配布されたファームがダメであると今回は推測による断定をした．

# まとめ
近日中にアップデートファームが上がることを期待している．
なんでか知らないのですが，実家で飼育しているGoogle Home Miniは元気に動いていますが・・・
初心者向けCloudTrail入門(コンソールログイン編)

# 初心者向けCloudTrail入門(コンソールログイン編)

## 1. CloudTrailとは
- AWSアカウントの活動記録サービス
- 誰が、いつ、何をしたかの情報保存

## 2. CloudTrailの主な機能
- すべてのAWS操作の記録
- API呼び出しの追跡
- コンソールログインの監視

## 3. コンソールログインの記録
- イベント名：「ConsoleLogin」
- 成功・失敗両方のログイン試行を記録
- ユーザータイプ別の記録場所：
  - ルートユーザー：us-east-1
  - IAMユーザー
      - シドニー（ap-southeast-2）
      - オハイオ（us-east-2）
      - ストックホルム（eu-north-1）
      のいずれか
  - IAM Identity Centerユーザー：IICを有効化したリージョンで作成される
      - 東京リージョンで有効化すれば東京リージョンのCloudTrailの証跡に記録される

## 4. ログに含まれる主な情報
- ログイン時刻
- ユーザー識別情報
- ログイン元IPアドレス
- ログイン結果（成功/失敗）
- MFA使用有無
- etc...

## 5. CloudTrailの重要性
- セキュリティ強化：不審なアクセスの検出
- コンプライアンス対応：活動の詳細な記録
- トラブルシューティング：問題の迅速な特定と解決

## 6. 初心者向けCloudTrail活用
1. すべてのリージョンでCloudTrail有効化
3. 定期的なログ確認の習慣化
4. 重要な変更に対するアラート設定
4. EventBridgeなどで、コンソールログインの検知(rootユーザー等）

## まとめ
- コンソールログイン監査で不正アクセスを早期発見
- 適切な設定と定期的な確認が重要
- コンソールログインの証跡が見つからない時はリージョンを変えて探してみましょう
Typescriptでアプリを作成してみた【 Chat Application 】

(1)index.htmlを作成する

```index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>IO Chat</title>
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
    />
    <script
      src="https://code.jquery.com/jquery-3.7.0.js"
      integrity="sha256-JlqSTELeR4TLqP0OG9dxM7yDPqX1ox/HfgiSLBj8+kM="
      crossorigin="anonymous"
    ></script>
    <script src="/socket.io/socket.io.js"></script>
    <style>
      body{
        margin-top: 30px;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <div class="col-md-4">
          <div class="well">
            <h3>Online Users</h3>
            <ul class="list-group" id="users"></ul>
          </div>
        </div>
        <div class="col-md-8">
          <div class="chat id" id="chat"></div>
          <form id="messageform">
            <div class="form-group">
                <label for="message">Enter Message</label>
              <textarea class="form-control" id="message"></textarea>
            </div></br>
            <input type="submit" class="btn btn-primary" value="send message"/>
        </div>
      </form>
      </div>
    </div>
    <script>
$(function(){
  const socket=io.connect();
  const $messageForm=$("#messageForm");
  const $message=$("#message");
  const $chat=$("#chat");

  $messageForm.submit(function(e){
    e.preventDefault();
    socket.emit("send message",$message.val());
    $message.val("");
    console.log("submitted")
  })

  socket.on('message', function(data) {
        $chat.append(`<div class="well">`+data.msg+`</div>`);
      });
    });
    </script>
  </body>
</html>
```
(2)server.jsを作成する

①　Socket.IO をインストールする
```
npm install socket.io
```
② express パッケージをインストールする

```
npm install express
```

```server.js
const express = require('express');
const { listen } = require('socket.io');
const app = express();
const server = require('socket.io').ceateServer(app);
const io = require('socket.io')(server);
users = [];
connections = [];
server.listen(3000);
app.get('/', function (req, resp) {
  resp.sendFile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
  connections.push(socket);
  console.log('connected: %s socket connected', connections.length);
  socket.on('disconnect', function (data) {
    connections.splice(connections.indexOf(socket), 1);
    console.log('Disconnected: %s socket connected', connections.length);
  });

  socket.on('send message', (data) => {
    console.log(data);
    io.emit('message', { msg: data });
  });
});

console.log('server is listening');
```

## 参考サイト
[Typescript Project - Chat Application | How to Build a Chat Application? | TypeScript | Simplilearn](https://www.youtube.com/watch?v=7yngRdsKc4U&t=1055s)
WSL 2とDockerを活用したRuby開発環境の構築

# はじめに
Windows上でネイティブのLinux環境を提供するWSL 2と、コンテナ技術であるDockerを組み合わせることで、軽量かつ効率的なRuby開発環境を構築できることを説明します。

Windows Subsystem for Linux (WSL) のセットアップはこちら

https://qiita.com/oharu121/items/9acaf1e700aea80323c1
# Ubuntuを起動する
Ubuntuを起動して、WSL環境が正しく動作していることを確認します。

1.Windowsの検索バーから「ターミナル」と入力して、ターミナルを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/4a6d5787-d1c9-4e57-b370-b5a3aa1856aa.png)

2.ドロップダウンメニューから「Ubuntu」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/8f5159fb-6f86-884f-f6a5-e853507155c6.png)

3.Ubuntuが正常に起動していることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/1657ba48-04cf-30f5-2bcb-930e4e9c3eaf.png)

# Ruby環境の構築
次に、Dockerを利用してRubyの開発環境を構築します。以下の手順で進めてください。

### 1.「ruby_test」ディレクトリを生成
まず、プロジェクト用のディレクトリを作成します。
```
mkdir ruby_test
cd ruby_test
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/97d5a1e9-5dfb-4a5c-7374-0d797a92d4b3.png)

### 2.Dockerfileの作成
次に、Ruby環境のベースとなるDockerfileを作成します。
```
touch Dockerfile
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/f89bc7e5-483c-d089-ca2f-01c5d3d2edb1.png)

編集するために下記コマンドでVScodeを開きます。
```
code .
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/df13102c-ec18-dabd-f6a7-9d9ac79acbd4.png)

VSCodeで以下の内容をDockerfileに追加します。
```
FROM ruby:3.2.3
WORKDIR /app
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/b5056ee5-8f11-6ffe-5a3f-b47c79894b4e.png)

### 3.compose.ymlの作成
次に、Docker Compose用の設定ファイル docker-compose.yml を作成します。
```
touch compose.yml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/488094ed-44cf-12cf-9d61-d505a5e1cb2a.png)

VSCodeで以下の内容を docker-compose.yml に追加します。
```
services:
  app:
    build: .
    volumes:
      - .:/app
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/3991df61-1c0a-c4a1-a9ac-a3027656badf.png)

### 4.Dockerコンテナをビルドする
Docker Desktopが起動していることを確認します

:::note warn
Docker Desktopが立ち上がっていないと、エラーになります。
:::

以下のコマンドでDockerコンテナをビルドします。
```
docker compose build
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/eed6b54f-6c61-debc-5378-bb15dfc1a503.png)

# Rubyコマンドの実行
コンテナ内でRubyを実行し、開発環境が正常に動作しているか確認します。
### 1.Docker コンテナの環境に入る
以下のコマンドを実行し、Dockerコンテナのシェルに入ります。
```
docker compose run --rm app bash
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/be7acee8-251d-d98c-7dfb-5237a4944bbe.png)

### 2.Rubyのコマンド実行
コンテナ内でRubyを実行し、動作を確認します。
```
ruby -e "puts 'hello world'"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/bc049c2e-8ab2-347c-a7fd-8099ce9ffc96.png)
### 3.Docker コンテナから離れる
```
exit
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/048aa1d7-0170-6979-66e7-cfa46c43b3be.png)

# まとめ
この手順により、WSL 2とDockerを使用した軽量かつ効率的なRuby開発環境が構築できます。Windows環境でもスムーズにRubyを使用できるため、開発作業が快適に行えるようになるでしょう。
ubuntu 24.04 LTSで自宅サーバー構築（Apache2の設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install apache2
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/conf-enabled/security.conf
#12行目 : 変更
ServerTokens Prod
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/mods-enabled/dir.conf
DirectoryIndex index.html index.htm
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/apache2.conf
#70行目 : サーバー名追記
ServerName ご自身の自宅サーバーのドメイン名
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/sites-enabled/000-default.conf
#11行目 : 管理者のメールアドレスを変更
ServerAdmin メールアドレス
taisuke@ubuntuserver:~$ sudo systemctl restart apache2
ローカルホスト または任意のクライアントコンピューターから Web ブラウザーで [http://(サーバーのホスト名 または IP アドレス)/] にアクセスします。 以下のようなページが表示されれば OK です。
![apache.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/00d8f413-3bdc-80f6-d655-db35ad8fc43a.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
IntelliJ IDEAで差分表示が別ウィンドウになったのをタブに戻す

差分表示の画面を開いて、歯車アイコンから`Show DIff in Editor Tab`で戻ります。

ちなみに日本語化したら`エディタータブで差分を表示`でした。

![diff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/8fb130d6-3991-51de-96ee-9fc3a9571268.png)

たぶんJetBrains系のIDEで共通の動作だと思いますが、私がこの動作を確認したのは`IntelliJ IDEA 2024.1.2 (Community Edition)`です。
Next.js14でtailwind.cssを導入したが、設定が反映されない

# はじめに
基本的に**公式ドキュメントの手順に沿って導入すればよいのですが、いくつか見落としていた点があったのでシェア**させてもらいます。

https://tailwindcss.com/docs/installation

# 注意点１
**tailwind.cssのインストール時にpost.cssも一緒にインストール**してあげる。

理由は不明ですが、**公式ドキュメントにあるコマンドでインストールをしても設定が入りませんでした。**
```
npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
```
# 注意点２

**layout.tsxでglobals.cssをインポートしておく**

これをやらないともちろん設定が反映されませんが、意外と忘れがちです。
```tsx:layout.tsx
//忘れずに
import "../globals.css";

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}

```

# おわりに
Next.jsであればプロジェクト作成時にtailwind.cssを使用するかどうか聞かれるので、その時点で「はい」を選択するのが一番楽だと思います。
Flutter iOS Module xxx not found の対処法

Flutter iOS でビルドすると「Module xxx not found」とうエラーが出ます。
何回もハマっています。そのいくつかの対処法をまとめます。

# ① flutter clean を試す
いったんこれを試しましょう。
flutter clean .
flutter pub get 

# ② XCodeで開いてみる
Runner.xcodeproj ではなく Runner.xcworkspace なのがポイント。

# ③ pod install
ios/Podfile の２行目のバージョンを変えてみます。

platform :ios, '14.0'　← このコメント＃を外してバージョンを色々変える

Podfile を更新
cd ios
pod install    ← Podfile.lockを参照
pod update     ← Podfile.lockも更新

# ここで理由を整理してみよう
Pods/Target Support Files 以下にあるモジュールを
参照できない、もしくは、動かないのが原因です。

# ④ パスが違う
XcodeのRunner.xcworkspace
Flutter/Release.xcconfig

#include "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
↓↓↓
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

# ⑤ Flutterのバージョンを上げる
今回の私はこれで治りました。
ARM NEONを使ってAESの復号をする

暗号化手順はよく紹介されていますが、復号手順はなかなかないのでまとめました。

# 復号するときのポイント
基本は暗号の手順と逆のことをすればいい。ただ、ラウンドキーに対して、AESIMC(vaesimcq_u8)を行う必要がある。


# コード
```
#define ADD(a, b)              vreinterpretq_u8_u32(vaddq_u32(vreinterpretq_u32_u8((a)), (b)))
#define KEY_EXP_256_1(k, i, r) XOR3(TSHIFT_ADD((k)[(i)]), SUBWORD(ROTWORD((k)[(i) + 1])), RCON((r)))
#define KEY_EXP_256_2(k, i)    XOR(TSHIFT_ADD((k)[(i)]), SUBWORD(NOROTWORD((k)[(i) + 1])))
#define NOROTWORD(a)           vqtbl1q_u8((a), vreinterpretq_u8_u32(vdupq_n_u32(0x0f0e0d0c)))
#define RCON(a)                vreinterpretq_u8_u32(vdupq_n_u32((a)))
#define ROTWORD(a)             vqtbl1q_u8((a), vreinterpretq_u8_u32(vdupq_n_u32(0x0c0f0e0d)))
#define SHIFT_ADD(a)           veorq_u8((a), vextq_u8(vdupq_n_u8(0x00), (a), 12))
#define SUBWORD(a)             vaeseq_u8((a), vdupq_n_u8(0x00))
#define TSHIFT_ADD(a)          SHIFT_ADD(SHIFT_ADD(SHIFT_ADD((a))))
#define UINT32x4_C(a)          vextq_u32(vdupq_n_u32((a)), vdupq_n_u32(0x00000000), 3);
#define XOR(a, b)              veorq_u8((a), (b))
#define XOR3(a, b, c)          veorq_u8((a), veorq_u8((b), (c)))


void generate_dec_roundkey256(uint8_t* key, uint8x16_t* roundkey)
{
    // ラウンドキーを作る(暗号と同じ流れ)
    roundkey[0] = vld1q_u8(key);
    roundkey[1] = vld1q_u8(key + 16);
    roundkey[2] = KEY_EXP_256_1(roundkey, 0, 0x01);
    roundkey[3] = KEY_EXP_256_2(roundkey, 1);
    roundkey[4] = KEY_EXP_256_1(roundkey, 2, 0x02);
    roundkey[5] = KEY_EXP_256_2(roundkey, 3);
    roundkey[6] = KEY_EXP_256_1(roundkey, 4, 0x04);
    roundkey[7] = KEY_EXP_256_2(roundkey, 5);
    roundkey[8] = KEY_EXP_256_1(roundkey, 6, 0x08);
    roundkey[9] = KEY_EXP_256_2(roundkey, 7);
    roundkey[10] = KEY_EXP_256_1(roundkey, 8, 0x10);
    roundkey[11] = KEY_EXP_256_2(roundkey, 9);
    roundkey[12] = KEY_EXP_256_1(roundkey, 10, 0x20);
    roundkey[13] = KEY_EXP_256_2(roundkey, 11);
    roundkey[14] = KEY_EXP_256_1(roundkey, 12, 0x40);

    // 復号の場合、以下の処理が必要
    for(int i= 1; i<14; i++)
    {
        roundkey[i] = vaesimcq_u8(roundkey[i]);
    }
}

void decrypt256(uint8_t* key, uint8_t* crypt_text, uint8_t* plan_text)
{
    uint8x16_t roundkey[15];
    generate_dec_roundkey256(key, roundkey);

    uint8x16_t state = vld1q_u8(crypt_text);

    for(int i = 14; i>1; i--)
    {
        state = vaesdq_u8( state, roundkey[i] );
        state = vaesimcq_u8( state );
    }
    state = vaesdq_u8( state, roundkey[1] );
    state = veorq_u8( state, roundkey[0] );

    vst1q_u8(output, state);
}

```


# 参考
ARM NEON使って復号できない質問とその答え。
https://stackoverflow.com/questions/75581296/aes-encryption-do-not-work-on-arm-processor
ARM NEON使った実装と復号。
https://github.com/line/aes-gcm-siv/blob/master/lib/src/arm64/aes_arm64.c
https://github.com/microsoft/SymCrypt/blob/main/lib/aes-neon.c
ラウンドキー作るときに、復号の時はvaesimcq_u8を行っているのがわかる。
https://github.com/microsoft/SymCrypt/blob/171f6973dab9b76f0dc61d966d3e977021325bc1/lib/aes-key.c#L187
「AIと著作権に関する チェックリスト＆ガイダンス」（令和6年7月・文化庁）を読んだ


こんにちは！今回は、生成AIと著作権について、提供者としての視点と作品を作るクリエイターとしての視点の両面から解説します。以前のブログ記事[「文化庁「AIと著作権に関する考え方について」（令和６年４月）を読んで気になったところ」](https://qiita.com/izumi_kadoya/items/484d24416b259a7674fc)では主に著作権侵害の定義について取り上げましたが、今回はさらに進んで、AI提供者としてのガイドラインやクリエイターとしての対応策について詳しく紹介します。この資料は、文化庁がまとめた[「AIと著作権に関するチェックリスト＆ガイダンス」（令和6年7月31日発行）](https://www.bunka.go.jp/seisaku/bunkashingikai/chosakuken/seisaku/r06_02/pdf/94089701_05.pdf)を参考にしています。

法律に関しては詳しくないので、あくまで私の解釈ということでご注意お願いします。詳しくは本文を参照し、専門家に相談してください。

-------
資料では、生成AIに関わるステークホルダーを以下の4つのカテゴリに分類しています。

- **AI開発者**: システムやアルゴリズムを開発する人
- **AI提供者**: 開発されたAIをサービスとして提供する人
- **AI利用者（業務利用者）**: 事業でAIを利用する人
- **業務外利用者（一般利用者）**: 個人的にAIを利用する人

今回は、この中から「AI提供者」と「AI利用者（一般利用者）」に焦点を当てて解説します。
![ai_nakayoshi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676131/c55a41f4-e9d2-b4b5-575d-7a86c3101853.png)

## 1. 「AI提供者」としての視点

### 1.1 類似生成物の防止
生成AIが著作物に類似したコンテンツを生成することを防ぐための技術的措置を導入することが推奨されます。例えば、学習データの出所を明確にし、生成物が特定の著作物と高い類似性を持たないようにするフィルタリング技術の実装が考えられます。これにより、法的リスクの低減が図れます。一定の場合にAI提供者も責任を問われる可能性があるため、注意が必要です。

### 1.2 情報提供と透明性
AIサービスを提供する際には、利用者に対して透明性のある情報提供を行うことが求められます。どのようなデータが使用されているか、アルゴリズムの基本的な仕組みを説明することで、利用者の安心感を高めることができます。また、利用者が著作権侵害を行わないよう、適切な使用方法を示すことも重要です。

### 1.3 利用規定での明文化
生成AIを利用させるに際して、利用者による著作権侵害行為を抑制するための利用規約を整備することが必要です。例えば、「著作権を侵害する可能性のあるコンテンツの生成を禁じる」といった利用規約を明示し、ユーザーが違反行為を行わないようにすることで、AI提供者が侵害の責任を問われる可能性を低減できます。

## 2. 「AI利用者」としての視点

### 2.1 利用前の確認事項
AI利用者としては、利用する前に生成AIの仕組みや特性を理解し、提供された学習済みモデルや利用規約を確認することが重要です。特に、著作権侵害のリスクを避けるためには、使用されている学習データやモデルに関する情報をしっかりと確認し、適正な利用方法を理解しておくことが求められます。

### 2.2 生成物の著作権確認
生成されたコンテンツが既存の著作物に類似していないかを確認することも重要です。特に商業利用を考えている場合は、生成物が著作権を侵害しないように注意する必要があります。インターネット検索などを行い、類似性のチェックを行いましょう。また、他の作品に依拠していないことを示すために、生成の過程や使用したプロンプトを記録しておくと良いでしょう。

### 2.3 著作物の入力に関する注意
AIに既存の著作物を入力して生成を行う場合、「その著作物を複製して使用する意図がある」と見なされる可能性があります。したがって、著作権法の制限内での利用かどうかを確認し、必要であれば権利者の許諾を得ることが重要です。

### 2.4 問題発生時の対応策
万が一、生成物が著作権を侵害している疑いがある場合には、すぐに利用を停止し、提供者や関係者に報告することが必要です。「まさか自分が！？」にならないよう、生成AIを使う人は問題が起きる可能性まで考慮しておきましょう。

## おまけ：クリエイター（AI利用者）としての視点

### 3.1 自身の作品の保護
クリエイターとして、自身の作品が無断でAI学習データとして使用されないよう、権利管理を徹底することが重要です。発見した場合は、適切な対応を取りましょう。

### 3.2 類似生成物の発見と対応
自身の作品と類似したAI生成物を発見した場合、類似性と依拠性を確認し、必要に応じて法的措置を取ることができます。差止請求や損害賠償請求の手続きを行うことも考慮しましょう。

### 終わりに

AI提供者として、適法なデータ利用、技術的な安全策の導入、透明な情報提供、そして問題発生時の迅速な対応は、著作権侵害のリスクを最小限に抑えるために不可欠です。AI利用者も、適切な利用方法を理解し、問題が発生した際には迅速に対応することで、生成AIを安全に活用できます。皆さんも、これらのガイドラインを参考に、生成AIの活用を楽しんでください！
Windows Subsystem for Linux (WSL) のセットアップとDocker統合

# WSLとは？
WSLとは、Windows上でネイティブのLinuxバイナリを実行できる機能です。これにより、仮想マシンやデュアルブート環境を構築することなく、WindowsでLinuxのコマンドラインツールを利用できます。WSL 1はLinuxカーネルを模倣する軽量な互換レイヤーですが、WSL 2では完全なLinuxカーネルが使用されており、より優れたパフォーマンスを提供します。

# Dockerと統合するメリット？
Docker DesktopはWSL 2とシームレスに統合されており、Windows上でLinuxコンテナを簡単に管理・操作できます。これにより、WindowsとLinuxのファイルシステム間のデータのやり取りもスムーズになります。

# WSLの有効化
WSLを有効化するための手順は以下の通りです。

1.コントロールパネルを開き、「プログラムと機能」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/ab46932a-502b-85f7-1357-76e6da16676d.png)

2.左側のメニューから「Windowsの機能の有効化または無効化」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/92f0c270-bf84-a577-bc56-9302aa74b7e5.png)

3.リストから「Windows Subsystem for Linux」を探し、チェックを入れて「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/b0a352ac-7a7a-da8c-7efe-15246e801cc0.png)

4.変更を反映させるため、パソコンを再起動します。

# Linuxディストリビューションのインストール
WSLを有効化したら、次にLinuxディストリビューションをインストールします。Microsoft Storeを開き、Ubuntuを選んでインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/301e0e46-4029-863e-5ff2-db4fb13cb0db.png)

# WSL 2へのアップグレード
WSL 2にアップグレードすることで、Linuxカーネルの完全なサポートを受け、高速なファイルシステムやネットワーキングパフォーマンスが得られます。以下の手順でWSL 2にアップグレードしましょう。

1.PowerShellを管理者権限で開きます。
2.以下のコマンドを実行しWSL 2をデフォルトのバージョンに設定します。
```
wsl --set-default-version 2
```
3.以下のコマンドを実行しWSL2をインストールします。
```
wsl --install
```

# Dockerの設定
WSL 2の環境を利用して、Dockerを設定することもできます。以下の手順に従って、Dockerをインストールし、WSL 2との統合を行います。

### 1.Docker Desktopをインストールする
下記のリンクからダウンロードする

https://docs.docker.com/desktop/install/windows-install/

PCを再起動してDocker Desktopを起動
### 2.インテグレーションをオンにする
1.Docker Desktopの設定画面を開くため、右上の歯車アイコンをクリックします。
2.「Resources」タブを選択し、「WSL Integration」をクリックします。
3.「Enable Integration with my default WSL distro」にチェックを入れます。
4.「Ubuntu」など使用するディストリビューションもオンにします。
6.「Apply & Restart」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/7aa6ea45-3610-75bf-0827-a5d4a2f76b8e.png)

# Ubuntuを起動する
最後に、Ubuntuを起動して、WSL環境が正しく動作していることを確認します。

1.Windowsの検索バーから「ターミナル」と入力して、ターミナルを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/4a6d5787-d1c9-4e57-b370-b5a3aa1856aa.png)

2.ドロップダウンメニューから「Ubuntu」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/8f5159fb-6f86-884f-f6a5-e853507155c6.png)

3.Ubuntuが正常に起動していることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/1657ba48-04cf-30f5-2bcb-930e4e9c3eaf.png)

# まとめ
WSLを利用すれば、Windows上で手軽にLinux環境を構築でき、特にWSL 2ではパフォーマンスが大幅に向上しています。Dockerとの統合も簡単に行えるため、開発環境の柔軟性が高まります。ぜひこの手順に従ってWSLをセットアップし、快適なLinux環境を体験してみてください。

こちらの記事もご覧ください：

https://qiita.com/oharu121/items/90178a2a00d1bc397c4b
データーベースを確認したい

## はじめに
データベースを確認する場面はよくあることだと思いますが、私はここら辺をあまりじっくり取り組んだことが少ないことから、どのような手順でたどり着くことができるのか。アウトプットがてら投稿したいと思います。

## どういう状況だったのか
- 新規登録機能を作ったがデータベースにちゃんと反映されているのか確認したい
- PostgreSQLを使用している

### コンテナ内に入る手順
1. **コンテナの確認**    
    まず、現在稼働しているコンテナを確認します。以下のコマンドで、実行中のコンテナのリストを取得します。
    
    ```bash
    docker ps
    ```
    
    このコマンドで表示されたリストから、PostgreSQL が稼働しているコンテナのコンテナ ID をメモします。

   [![Image from Gyazo](https://i.gyazo.com/6495138f0446698712446fa6cf212541.png)](https://gyazo.com/6495138f0446698712446fa6cf212541)

   上記画面の場合は、PostgreSQL コンテナの ID は 9c53f5eeaa95 ですので、これを使ってコンテナ内にアクセスし、psql コマンドを使ってデータベースに接続できます。

   ### PostgreSQL コンテナにアクセスする手順

1. **PostgreSQL コンテナにアクセス**
    
    次のコマンドで PostgreSQL コンテナにアクセスします：
    
    ```bash
    docker exec -it 9c53f5eeaa95 psql -U postgres
    ```
    
    これで PostgreSQL のクライアントツールにアクセスできるはずです。
    
2. **データベースに接続**
    
    PostgreSQL コンテナ内で `psql` が起動したら、次のコマンドでデータベースに接続します：
    
    ```sql
    \c myapp_development
    ```
    
    これで `myapp_development` データベースに接続できます。
    
3. **データベースやテーブルの確認**
    
    接続したデータベース内で、テーブルやデータの確認を行います。例えば、テーブルの一覧を確認するには次のコマンドを使用します：
    
    ```sql
    \dt
    ```
    
    特定のテーブルの構造を確認するには、次のコマンドを使用します：
    
    ```sql
    \d users
    ```
    
    これで `users` テーブルの詳細が表示されます。


### 私の流れは下記のような感じでした
```
$ docker exec -it 9c53f5eeaa95 psql -U postgres
psql (16.3 (Debian 16.3-1.pgdg120+1))
Type "help" for help.

postgres=# \c myapp_development
You are now connected to database "myapp_development" as user "postgres".
myapp_development=# \d users
                                             Table "public.users"
      Column      |              Type              | Collation | Nullable |              Default
------------------+--------------------------------+-----------+----------+-----------------------------------
 id               | bigint                         |           | not null | nextval('users_id_seq'::regclass)
 email            | character varying              |           | not null | 
 crypted_password | character varying              |           |          | 
 salt             | character varying              |           |          | 
 created_at       | timestamp(6) without time zone |           | not null | 
 updated_at       | timestamp(6) without time zone |           | not null | 
 name             | character varying              |           | not null |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "index_users_on_email" UNIQUE, btree (email)
```

## さいごに
今回はデーターベースの確認についてまとめてみました。どのような構造化を把握するときに、少しでも参考になれば幸いです。
『常設ネタ作ろうか① -ネタ探し編-』(技書博10　フリーペーパー企画)

## 前書き
どもどもお久しぶりです～。モノ創りサークル『しょ～とらば～ず』のグッピーです。
2024年始まったばっかりだと思ったらもう半分終わって8月中旬、暑くて暑くて冷房つけっぱなしにしないと生きていけませんね。はぁ～～～～電気代が怖い。

と、まあそんなことは一旦部屋の隅に置いといて本題ですが、3ヶ月程前、東京で第10回技術書同人誌博覧会というイベントに参加してきました。
いわゆる『技術系同人オンリーイベント』というものでしてね。
元々コミケの端の方にかたまってた技術島の人たちとかニコニコ技術部出身とか本業エンジニアの方とかその他諸々が集まって集まってできたそれなりに大きめのオンリーイベントなんですが、もう凄いですね。参加者も運営さんも皆楽しい素晴らしいイベントでした。

で、その第10回技術書同人誌博覧会の企画、『技書博フリーペーパー』にて弊サークルが出したフリーペーパーをそろそろ公開しようかなと思います。
それではお待たせしました。連載記事『常設ネタ作ろうか① -ネタ探し編-』です。どぞ。

## 本編
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/2d8f10d3-ec99-3ac4-9c4e-7753728e9a70.png)
　ども、初心者向けのモノ創りサークル『しょ～とらば～ず』、サークル主のグッピーです。
 これまでは『技書博』や『技術書典』のような東京の技術系イベントに出展していましたが、最近では大阪や名古屋等、西日本のイベントにも手を出し始めているこの頃でございます。先日も名古屋で行われたモノづくりイベント『つくろがや』に出展してきたんですが、ちょっと気づいたんです。
 
:::note warn
$\huge{弊サークル、常設ネタ無くね？}$
:::

定期的に新しい本を執筆したり加筆したりしていくのは良いんですが、やはり『このサークルといえばこのネタだよね』という常設ネタがあってもいいのではないかなぁと、あと『つくろがや』みたいなメイカー向けイベントで使いやすい一般参加者体験型のネタを用意したいなぁと。

ということで、

このフリーペーパー企画とQiita記事で常設ネタを作っていく過程を連載していこうというのが今回の企画です。各イベントのフリーペーパーで記事を先行公開し、数ヶ月後に加筆修正してQiita記事としてアップしていきますのでよろしくお願いいたします。

### 1) 何を作ろうか
　で、何を作ろうかというところですが、そうですね～、企業でエンジニアしながら技術書を書いてると結構忙しいので、その状態で新ネタを用意してると1年どころか2年くらい経っちゃうので没ネタから発掘していくのが手っ取り早いかなぁと思ったんですが...。
どの没ネタも常設ネタとしては使いにくいんですよね。[(技書博9で公開したしょ～とらば～ずのFP企画を参照)](https://qiita.com/Guppy_T_Higuchi/items/577faab38790177385fb)

まあ一つぐらいはちょうどいいネタあるんじゃないかなと過去の記事をあさってみてたんですけど、
<img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/f5ee832f-f484-430d-b393-6dd6043df3a2.png>

 
$\huge{そういや自転車発電機も昔作ってたなあ...}$


学生時代、車にこれ積み込んで東京理科大のイベントに乗り込んでいった時もあったなぁ、なつかしいなぁ。
......これじゃね？サークル設立前に作ってたものだから実物手元にないし、でも回路周りも覚えてるし、一般参加者体験型のネタとしていろんなイベントに持って行っても飽きられそうにないし。


ということで、この連載記事のテーマは、

$\huge{『車用の発電機"オルタネーター"を使用した}$
$\huge{自転車発電機をつくろう』}$

となりました～。わ～。

### 2) まとめ
ということなので次の技書博か、もしくは別イベントかもしれませんが次回からは自転車発電機を復刻していく過程を執筆していきます。また、数か月遅れてQiitaにも載せますのでよろしくお願いします～。


### 3) 2024/08/10　追記
<img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/97de718a-67f9-2807-0507-bf898d69b762.jpeg>

とりあえず自転車発電の骨組みになる自転車スタンドはヤフオクで落としました。
次回は材料集め編になりそうです。