OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud9にて接続ができなくなった時の対処方法

### Cloud9にて接続ができなくなった時の対処方法

2025/2/10あたりから
以下のようなエラー文が出て、そこからCloud9のコンソール画面から接続ができなくなった

```tex:エラー文

This is taking longer than expected. The delay may be caused by high CPU usage in your environment, your T2 or T3 instance might be running out of burstable CPU capacity credits, or there are VPC configuration issues. Please check the VPC settings or the troubleshooting documentation for help with these issues.

```


## きっかけ

<br>対象のEC2のボリューム（EBS）の容量が足りなくなったので
EBSの容量を10GB→30GBに増やしたところ、上記のようなエラーが出た。

## 対処方法

Cloud9においてはどうトラブルシュートしてもつながらなかったので、諦めた。
参考記事：https://qiita.com/tk2Aprl/items/936d5aab5ba25e3de59d

データは消えてほしくなかったため以下の対応を実施。

1.Cloud9にアタッチされているEBSをデタッチ
2.新たに起動したLinuxのEC2にアタッチ　/dev/sdb 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927933/62631ea8-ca78-423e-98b4-de49d9bcd33b.png)


3.EC2に接続して、新たなボリュームを data領域としてマウント

マウント方法に関しては、以下の手順で実施。
ルートアカウントにて実施した。

マウント手順に関しては以下記事を参考にした。
https://qiita.com/centerfield77/items/6ab66cf39427164b16da

```tex:マウント手順

[root@ip-172-31-8-0 data]# mount /dev/xvdb /data
mount: /data: wrong fs type, bad option, bad superblock on /dev/xvdb, missing codepage or helper program, or other error.
[root@ip-172-31-8-0 data]# lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0  50G  0 disk
├─xvda1   202:1    0  50G  0 part /var/named/chroot/var/named
│                                 /var/named/chroot/usr/lib64/bind
│                                 /var/named/chroot/etc/named
│                                 /var/named/chroot/etc/services
│                                 /var/named/chroot/etc/protocols
│                                 /var/named/chroot/etc/crypto-policies/back-ends/bind.config
│                                 /var/named/chroot/etc/rndc.key
│                                 /var/named/chroot/etc/named.rfc1912.zones
│                                 /var/named/chroot/etc/named.conf
│                                 /var/named/chroot/etc/named.root.key
│                                 /var/named/chroot/etc/localtime
│                                 /
├─xvda127 259:0    0   1M  0 part
└─xvda128 259:1    0  10M  0 part
xvdb      202:16   0  30G  0 disk
├─xvdb1   202:17   0  10G  0 part
├─xvdb127 259:2    0   1M  0 part
└─xvdb128 259:3    0  10M  0 part
[root@ip-172-31-8-0 data]# mount /dev/xvdb1 /data


```

皆様も、Cloud9にて接続ができなくなった場合の対処方法などございましたら、コメントいただけますと幸いで
GrafanaをローカルのDocker環境で動かす

## Grafanaとは
[Grafana](https://grafana.com/docs/grafana/latest/introduction/)はリアルタイムでデータを可視化・モニタリングを行ってくれるツールです。

## デモ
GrafanaはOSSで、DockerHubで公開されているため、Grafanaのイメージを使用して構築します。
docker-compose.ymlに以下のコードを記載します。
```yml:docker-compose.yml
services:
  grafana:
    image: grafana/grafana:11.4.0
    container_name: grafana
    ports:
      - 3000:3000
```

以下のコマンドでコンテナを起動します。
```
$ docker-compose up -d
```

ブラウザで`localhost:3000`にアクセスするとGrafanaのログイン画面が表示されました。
初期ユーザー名とパスワードは共に「admin」です。これらを入力してログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689023/695cd354-b602-4826-9e91-617a8ba57f35.png)

ログインすると以下の画面が表示されました。
現時点ではデータソースは未設定のためダッシュボードは作成できませんが、Grafanaの初期画面を表示させることができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689023/34e16d1f-220f-458c-96b6-c52c7b5ee11e.png)
#0051（2024/02/18）プロキシと関連用語

# プロキシとは？

**プロキシ (Proxy)** とは、ネットワークにおいてクライアントとサーバーの間に位置し、通信の仲介役を担うシステムまたはソフトウェアのことです。  
プロキシを介してリクエストを送ることで、直接サーバーと通信するのではなく、プロキシが代わりに通信を行い、結果をクライアントに返します。

---

## 主なプロキシの種類

### 1. フォワードプロキシ (Forward Proxy)

- **概要:**  
  クライアント側に配置され、ユーザーがインターネットなどの外部ネットワークにアクセスする際に利用される。  
  ユーザーのIPアドレスを隠す（匿名化）や、アクセス制限・監視、キャッシュの利用などの目的で使用される。

- **利用例:**  
  - 企業や学校のネットワークで、外部サイトへのアクセスを管理する  
  - ユーザーのプライバシー保護のためにIPアドレスを隠す

---

### 2. リバースプロキシ (Reverse Proxy)

- **概要:**  
  サーバー側に配置され、外部からのリクエストを受け取り、内部にある複数のサーバーへ振り分ける。  
  セキュリティ、負荷分散、キャッシュ、SSL終端（SSLオフロード）などの目的で利用される。

- **利用例:**  
  - 大規模なウェブサービスでの負荷分散  
  - 内部サーバーのIPを隠蔽し、セキュリティを強化する  
  - キャッシュを活用してレスポンスの高速化を図る

---

### 3. オープンプロキシ (Open Proxy)

- **概要:**  
  インターネット上で誰でも利用可能なプロキシサーバー。  
  公開されているため、悪意のある利用やスパム、セキュリティリスクが伴う。

- **利用上の注意:**  
  個人情報や機密情報の送受信に利用するのは非常に危険であり、一般的には使用が推奨されない。

---

## プロキシの利点と用途

- **セキュリティ:**  
  リバースプロキシは、内部サーバーの実際のIPアドレスを隠し、不正アクセスから保護します。

- **負荷分散:**  
  リバースプロキシを用いることで、リクエストを複数のサーバーに均等に分散し、過負荷を防ぎます。

- **キャッシュ:**  
  プロキシサーバーは、頻繁にアクセスされる静的コンテンツをキャッシュし、レスポンス時間を短縮するのに役立ちます。

- **アクセス制御:**  
  フォワードプロキシは、ユーザーのアクセス制限やログの記録、フィルタリングなどに活用されます。

---

## まとめ

- **プロキシ**は、クライアントとサーバーの間で通信を仲介する役割を持つシステムです。  
- **フォワードプロキシ**は主にクライアント側で利用され、アクセス制御やプライバシー保護を目的とします。  
- **リバースプロキシ**はサーバー側に配置され、負荷分散、セキュリティ強化、キャッシュなどの機能を提供します。  
- **オープンプロキシ**は誰でも利用できるためセキュリティリスクが高く、注意が必要です。

これらのプロキシの種類と特徴を理解することで、ネットワークのセキュリティ向上やパフォーマンス改善のための適切な設計や運用が可能になります。
PHP trim

## trim()の説明
余分な改行や空白を取り除く
## 基本的な使い方
```php
$text = 'テストです ';
$trimmed_text = trim($text);
echo $trimmed_text;
```
出力値
``テストです``（スペースがなくなる。）
スペース以外にも改行やタブを表す``\n``や``\t``も取り除くことが出来る。

また、以下のように取り除きたい文字を第2引数に指定して、削除する文字を指定することもできる。
```php
trim(変数, '取り除きたい文字')
```
無線関連

# 無線が遅いときに考慮すること

最小ビットレートの設定を見直すと無線のパフォーマンスがよくなるらしい

https://documentation.meraki.com/%E6%97%A5%E6%9C%AC%E8%AA%9E/Architectures_and_Best_Practices/%E9%AB%98%E5%AF%86%E5%BA%A6Wi-Fi%E5%B0%8E%E5%85%A5

https://hantechnote.wordpress.com/2021/08/12/%E4%BD%8E%E3%81%84%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AB%E3%82%88%E3%82%8Awi-fi-%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E4%BD%8E%E4%B8%8B/

https://8hack.net/?p=1065

https://www.wlan-business.org/archives/12421

基本的に無駄なパケットを通信させないというのが正解のよう

そのため、AirPrint、mDNSなどの通信を無効にすることも効果があるらしい


>>WAPD無効化
https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/disable-http-proxy-auth-features#how-to-disable-wpad

>>LLMNR/mDNS/NetBIOS無効化
GPO
コンピュータの構成-管理テンプレート-ネットワーク-DNSクライアント
-NetBIOS設定の構成:有効/NetBIOS名前解決を無効にする
-マルチキャストDNS(mDNS)プロトコルの構成:無効
-マルチキャスト名前解決をオフにする：有効
サイトのログインページに言語選択を追加し、翻訳できるようにする

## カスタムラベル作成、翻訳追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/34c3430c-a6aa-463f-b871-41b443169ccc.png)

## 画面フローを作成し、カスタムラベルを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/10a67b15-3a16-4030-9905-55fded66fbe8.png)

## フローの
「デフォルト動作を上書きし、有効化されたプロファイルまたは権限セットにアクセスを制限します。」をON
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/4060fd34-b037-428a-87d9-c0c8d2ca29d3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/42d2c56d-40c4-4a58-ac8c-e5ab5246b0f0.png)

## ゲストユーザープロファイルにフローを権限を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/d9ee3d73-64f1-4cd6-9e95-e8ed99c1ef38.png)

## 言語ピッカーとフローをログイン画面設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/8d2764d5-cbbc-4736-858f-41eb6e4d874e.png)

## 切り替えて確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/974d1780-39a4-4fef-b528-69a2fb20334c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/147c7e49-1791-4c37-820c-dcbe85ed3747.png)
【Python3】スレッド処理の状況をプログレスバーで表示してみた(tqdm)

ファイルのダウンロードをする時にダウンロード時間残り5分と書かれているのに1分後には残り10分に増えることがあるので、
プログレスバーってPythonでどういう風に実装できるのかと気になりだしたため記事を書きます。

## tqdmライブラリ
ライブラリとして存在しているみたいですね。
自分、python初心者なので知らなかったです。


tqdm(スペイン語で「te quiero demasiado」の略)は処理の進捗状況を表してくれるプログレスバーを提供してくれる。
 進捗バーの状態（カウンタ、時間、メッセージ）を保持するだけなので基本メモリ消費は激しくないようです。
 
## 準備
tqdmをインストール
```
pip install tqdm 
```

## さっそくやってみよう
``` python3
#使うライブラリ
from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm
import time

#usersとintervalsのリストを作る(別に辞書でもいい)
users = ["Andy", "Bob", "Cameron", "David"]
intervals = [1, 2, 3, 4]

#処理内容
def count_interval(user, interval):
    time.sleep(interval)
    return f"{user}:done"

# 進捗バーを表示しながら並列処理
with ThreadPoolExecutor(max_workers=4) as executor: #max_workersは同時に処理するスレッド数を決める
    futures = {executor.submit(count_interval, user, interval) for user,interval in zip(users,intervals)} #ユーザの人数分スレッドを立てて処理を実行する
    with tqdm(total=len(users)) as pbar: total引数でバーの数を決める
        for future in as_completed(futures):
            result = future.result()# 計算結果を受け取る
            pbar.update(1)  # 処理が終わるごとに進捗バーを1つ進める

```

## 結果
```
 20%|██        | 1/5 [00:02<00:11,  2.97s/it]
↓
100%|██████████| 5/5 [00:09<00:00,  1.99s/it]

```
しっかりと5ユーザ分の進捗表示がされました！
しかし...

## プログレスバーの内容が理解し難いので自分流にカスタマイズする
bar_formatを使って自分の好きなように表示を変えることができます。
ついでにバーの長さも変えちゃいます。
詳しくは、[tqdmのサイト](https://tqdm.github.io/docs/tqdm/)を参照してください。
``` python3
with ThreadPoolExecutor(max_workers=4) as executor:
    futures = {executor.submit(count_interval, user, interval) for user,interval in zip(users,intervals)}
    with tqdm(total=len(futures), bar_format="{l_bar}{bar} [{n_fmt}/{total_fmt}|経過時間: {elapsed}]",ncols=100) as pbar:
        completed = 0
        for future in as_completed(futures):
            result = future.result()
            pbar.update(1) 
```

## 結果
```
 20%|██████████████▌                                                           [1/5|経過時間: 00:00]
 ↓
100%|█████████████████████████████████████████████████████████████████████████ [5/5|経過時間: 00:09]
 ```
 という感じでカスタマイズ性も兼ね備えてますね！(バーが長すぎた...)

## プレースホルダー紹介


| プレースホルダー | 説明 |
|--------------|------|
| `{l_bar}` | **左側の情報 (例: 50%)** |
| `{bar}` | **プログレスバー本体** |
| `{n}` | **現在の進捗数** |
| `{total}` | **合計数** |
| `{n_fmt}` | **現在の進捗数（フォーマット済み）** |
| `{total_fmt}` | **合計数（フォーマット済み）** |
| `{percentage}` | **進捗率（例: 50.0）** |
| `{elapsed}` | **経過時間（例: 00:10）** |
| `{remaining}` | **残り時間** |
| `{rate_fmt}` | **処理速度（例: 10it/s）** |

 ## まとめ
・時間計測する場合は精度が高いわけではないので厳密にテストする時に使うには力不足
・大雑把な進捗＋時間を把握するのに丁度よさそう
初めてのGoogle Cloud Platform (GCP)

# 【初めてのGoogle Cloud Platform (GCP)】

Google Cloud Platform (GCP) はGoogleが提供するクラウドサービスで、AWSやAzureと並ぶ主要なクラウドプラットフォームの一つです。

GCPを使うと、サーバーを立てなくてもアプリを構築できたり、データ分析をすぐに行えたりします。本記事では、初心者にむけてGCPの概要と使い始めるための手順を簡単に紹介します。

# 【GCPの主要サービス】

GCPには多くのサービスがありますが、初心者にとって特に重要なものを一部紹介します。

## 1. Compute Engine (GCE)

サーバーをレンタルすることができるサービス。AWSのEC2に相当。

## 2. App Engine (GAE)

サーバーを立てなくてもアプリを動かせるPaaS。

## 3. Cloud Run

コンテナーベースのアプリを運用できる。サーバー管理が不要で、すぐに動かせるのが特徴。

## 4. Cloud Storage

ファイルなどをサーバーに保存できるストレージサービス。

## 5. BigQuery

大量データを速く分析できるデータ分析サービス。SQLクエリを使って便利に判断出来る。

# 【GCPを無料で使い始める】

初めてGCPを使う場合、新規登録で$300のクレジットが付与されます。これを利用すると無料でGCPの多くのサービスを使うことができます。

### GCPの登録手順

1.[Google Cloudサイト](https://cloud.google.com/)にアクセス
2.グーグルアカウントでログイン
3.無料登録を完了させる
4.$300のクレジットを利用していろいろ試す

【実践: Cloud RunでHello World】

簡単なGCPの使い方の例として、Cloud Runに「Hello World」をデプロイしてみましょう。

### 実践手順
GCPコンソールからCloud Shellを開く

Dockerコンテナを構築する

```
echo -e "FROM alpine:latest\nCMD echo 'Hello, World!'" > Dockerfile
docker build -t hello-world .
```

Cloud Runにデプロイ
```
gcloud run deploy hello-world --image=gcr.io/<YOUR_PROJECT_ID>/hello-world --platform=managed
```

これで、Cloud Run上でHello Worldが動くようになります。

# 【おわりに】
ここまで読んでくださり、ありがとうございます。
最近、Firebaseを使ってチャット機能を実装中なのでGCPについて書いてみました:point_up:
【kintoneノーコード開発】同じような情報を持っているフィールドを整理してみた！

# はじめに
こんにちは、現在kintoneノーコード開発で日々試行錯誤しているばんちゃん（[@Banchan_k12](https://x.com/Banchan_k12)）です。
今回は、別のフィールドと同時に更新すべきところを更新し忘れて間違った情報のままで矛盾が起こり、不都合が生じてしまうという事象について考えてみたいと思います。

### 対象
- kintone項目を設定してから、改めて見直しをせずになんとなく運用している方
- 同じような条件でセットされている項目があり、一方の更新するのを忘れたときに情報差異や修正の手間などが発生した方

# 導入
フィールド情報を追加・更新をする際、同時に更新すべきフィールドがあるが、修正ミスや更新忘れをしてしまうと情報に矛盾が起こり後々修正や確認の手間が必要になったことありませんか？

そこで、架空会社の設定（〇△株式会社の営業部）で起こった出来事を例に検証してみようと思います。

:::note info
設定

- 〇△会社では、各部署ごとに入会・退会自由な部活動がある
- 営業部では、活動しているレクリエーション部を「営業部レクリエーション部」アプリで管理している
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/4fe40483-d2bc-4b11-8c44-d6db7f269d7f.jpeg)

次回レクリエーション大会を行うため「入会中一覧」リストをもとにメールを出したところ、田中課長から以下のような話しがあった

**ある日の〇△会社　営業部での会話**
田中課長：「佐藤さん、私はレクリエーション部を昨年3月に退会してるんだけど、次回のレクレーション大会のお知らせが自分にも来たから確認しておいてくれますか？」
佐藤さん：「え？は、はい。確認します！」
:::

### 確認
佐藤さんは「営業部レクリエーション部」アプリの田中課長の登録情報を確認してみました。

田中課長のレコード詳細画面を見ると、「退会日」に日付が入力されているのに「入会中」フィールドに「入会中」の表示が入っていました。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/4f53221d-38f3-442a-9a83-238838de755e.jpeg)

他の方は大丈夫だろうか？と一覧画面で確認してみると
「入会中一覧」では「退会日」に入力があり「入会中」にも入力があったのは田中課長のみでした。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/875d8169-416b-46ad-be54-5698c73b914c.jpeg)

「入会中」フィールドの絞込みで田中課長が表示されてしまっています。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/3d42a38a-d01c-4efc-8a24-3e74e81f3539.jpeg)

### 改修
今回の出来事で「退会日」を入力する際に「入会中」のチェックを外し忘れる可能性があると思った佐藤さん。
「営業部レクリエーション部」アプリを改修することにしました。

:::note info
条件
- 入会日が入力されていて、かつ退会日が空欄であれば「入会中」
- 入会日が入力されていて、かつ退会日も入力されていれば「退会済」
:::

日付フィールドで上記の条件を設定できるので、日付のみの入力でよいのでは？と考え、「入会中」チェックフィールドをやめて「入会日」と「退会日」の設定のみにしました。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/d8018404-e313-402b-a37b-e824cdd59754.jpeg)

「退会日」が空欄であれば「入会中」なので「退会日」が空欄ならばの設定で絞り込み一覧を作成しました。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/024dc781-610e-42c0-bb05-aa8be8ef9a6b.jpeg)

### 結果
- 余計なフィールドがなくなり、入力・編集項目が減った
- 修正変更し忘れなどのミスが削減された

:::note info
「入会中」の項目が必要な場合、以下のような設定をすることも検討できる
- 文字列（1行）フィールドの自動計算
    - 入会日が未入力ではなく、かつ退会日が未入力：「入会中」を表示する
    - そうでなければなにも表示しない
```rb
IF(AND(入会日 !=" " , 退会日 = " "),"入会中"," ")
```
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/f55e27a6-0118-46e8-b975-5b45d607d182.jpeg)
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/e0268b42-ebd1-42fc-abfd-bea97d3c775a.jpeg)

:::


# まとめ
今回の事例に限らず、よくよく考えると他のフィールドとダブった情報なのでは？というフィールドがあったりするので、設定したフィールドが持つ情報の役割をきちんと把握しておくことで、必要なフィールドかどうかの精査することができ、整理することで編集箇所が減り、更新し忘れの可能性などが少しでもなくなるようになるかなと思います。
データエンジニア初心者日記（０）

## 自己紹介
はじめまして、ひろと申します。
社会人歴10年目のアラサーです。
#### 簡単な経歴
大学時代は経済学部で計量経済や数理経済学などを学びデータ分析に興味を持ち、システムエンジニアとして就職。
IT知識やプロジェクトマネジメントスキルを身につけつつも、データ分析に関わるプロジェクトがあまりない部署だったため、2024年にデータエンジニアリングの分野を中心とする企業からの転職の内定を承諾。
資格は応用情報処理まで取っています。

## Qiitaアカウントを作ったきっかけ
転職を機にSQLやDB関連の勉強をし始めたので、アウトプットを目的に記事を書くことにしました。
Kaggleコンペ参加も目指しています。

## データ分析関連で今まで学んできたこと
#### progateで勉強
ProgateでPythonの勉強を2020年に一度始めました。
しかし、当時のプロジェクトが炎上気味で中々継続できませんでした。
2022年は海外赴任があり、学習を継続できなかったのですが、つい最近全レッスンの履修を完了しました。

#### Kaggleコンペのtitanicに参加
転職が決まってから、はやたすさんのサイトを元に勉強を始め、
progate履修後は下記の動画を参考に、Kaggleコンペに参加。

https://www.youtube.com/watch?v=Wb2uLMOsZsg&t=913s

モデルの作成は意外とシンプルで、それまでのデータの理解や前処理の方が重要だと実感しました。
また、seabornやmatplotlibといったライブラリが登場し、
処理の書き方も自力では難しく、勉強が必要だと痛感しました。

## 今後の勉強内容
転職先からはSQLについての知識は必須になると言われているので、
Pythonの勉強を継続したいところですが一時中断してSQLの勉強を始めます。
具体的には「おうちで学べるデータベースのきほん」という本を読んでMySQLで実践してみます。

https://www.amazon.co.jp/おうちで学べるデータベースのきほん-ミック-ebook/dp/B00TTRZFDC/ref=sr_1_5?__mk_ja_JP=カタカナ&crid=1E8VY2QEXQAGC&dib=eyJ2IjoiMSJ9.z1bMyMVHosdLt-mrM8fdSkeZI6kodEaLtzmNLWl6WPy7wHXlyikZQhL17IHiLf2f73wb5jG7vyK6-CtrQ0zpV8cj-ALyZ-j5HRVpK2W2JeSwgGCXKnSxZam5kTqd2ykx3G_Wz69ygNqwoRBlplsnZe6emp0ZB-siZYhIovz-5T6ZyRYKb9yb83R_P5CKSkYah0kj2pnIjRu29c7H-0Ajt4z9ukPZszrnOh-zuHiIsKs89UAVlZbnxm_csgKGbsuDlUsZXVKvfdM5vfzOAA4BBe-fpeiUUe-ZJ1myW3S3LBFvcRQHYCLQehMQpKrKUHP5YXbYY8Xh7wg84V4E9OvbBNaTeoMVtESAxkOr_YfRnOholYtECf-NwJ96ncJd67mWi07RgOJ-ttlDmWGkP6xm9BLkrzT3ecElL6aw2yKVYr9UmeaQ3iv2gXjJ3fJq-k0k.EdkzQ6AFoyeWYnTTfvLhjf1rIflpsnqTE0ZsNviqY38&dib_tag=se&keywords=データベースの基本&qid=1739883395&sprefix=データベースのきほん%2Caps%2C188&sr=8-5

## 終わりに
あまりSNS等で交流するのが得意ではありませんが、勉強されている方々やすでにお仕事にされている先輩方と繋がって交流していきたいと考えています。
私自身も皆さんにとって有益な記事を書いていきたいと思いますので、よろしくお願いします。
ここまで読んでいただきありがとうございました。
Git : コミットメッセージ

# はじめに
Gitをつかってバージョン管理をしているとき、コミットメッセージのルールを統一した方が良いです。いろんな人がコミットするので、ある程度チーム内でコミットメッセージのルールを統一していると、参照性が上がると思います。

# フォーマット
フォーマットは以下とします。
```
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```

# Type
タイプを以下とします。
```
feat: 新しいfeature
fix: バグ修正
docs: ドキュメントのみの変更
style: コードに影響のない変更
refactor: バグ修正や新featureの追加に影響を与えないコードの修正
test: 不足しているテストの追加や既存のテストの修正
chore: ビルドプロセスやドキュメント生成などの補助ツールやライブラリの変更
```

# 参考文献
[angular.js/DEVELOPERS.md](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type)
[Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)
FlutterアプリのApp Store審査でリジェクトされた話 - アプリアイコン設定方法とデバッグバナー削除方法

## はじめに

先日、FlutterアプリをApp Storeに提出したところ、審査でリジェクトされてしまいました。主な原因はアプリアイコンが設定されていないことでした。この記事では、その解決方法と正しいアプリアイコンの設定方法について共有したいと思います。

## リジェクトの詳細

App Store Connectから以下のような内容で審査結果が返ってきました。

### Guideline 2.3.8 - Performance - Accurate Metadata

> The app or its metadata does not appear to include final content. Specifically, the app icons appear to be placeholder icons.
> 
> Next Steps
> To resolve this issue, please ensure all the app icons are finalized and similar enough to each other to avoid creating confusion. When users search for the app on their devices, they should be able to recognize it.

（和訳）
アプリまたはそのメタデータに最終的なコンテンツが含まれていないようです。具体的には、アプリアイコンがプレースホルダーアイコンのようです。

次のステップとして、すべてのアプリアイコンを完成させ、混乱を避けるために互いに十分に類似したものにしてください。ユーザーがデバイスでアプリを検索する際に、認識できるようにする必要があります。

### Guideline 2.3.10 - Performance - Accurate Metadata

また、デバッグバナーに関する指摘も受けました：

> We noticed your submission includes irrelevant references to your app's development process. Specifically, your screenshots includes debug banners.

（和訳）
提出されたアプリに開発プロセスに関する不適切な参照が含まれていることに気付きました。具体的には、スクリーンショットにデバッグバナーが含まれています。
![debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/34c06557-1abf-4608-90c0-3b7f02320b6e.png)
上図のように画面右上にdebugという文字列が含まれてしまっています。

## 解決手順

### 1. Flutter プロジェクトでのアイコン設定

#### 1.1 flutter_launcher_icons パッケージの追加

まず、アイコン生成を自動化するためのパッケージを追加します。

```bash
flutter pub add flutter_launcher_icons --dev
```

注意: `flutter_launcher_icons`は開発時にのみ必要なパッケージなので、`dev_dependencies`として追加します。

#### 1.2 設定ファイルの作成

プロジェクトのルートディレクトリに`flutter_launcher_icons.yaml`を作成します：

```yaml
flutter_launcher_icons:
  ios: true
  image_path: "assets/icon/app_icon.png"
  remove_alpha_ios: true
```

#### 1.3 アイコンの生成

以下のコマンドを実行して、アイコンを生成します：

```bash
flutter pub get
flutter pub run flutter_launcher_icons
```
これでアイコンが設定されます。
### 2. デバッグバナーの削除

デバッグバナーを非表示にするため、`main.dart`で以下のように設定します：

```dart
void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,  // デバッグバナーを非表示
      home: MyApp(),
    ),
  );
}
```
![notdebug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/b503e142-7c3c-4abe-ac6a-d9c604c16621.png)

この状態でアプリケーションを動かしてスクリーンショットを撮ると上図のようなdebugという文字列が含まれない画像を取得できます。こちらの画像をApp Storeに提出しましょう。


## まとめ

今回の経験から、以下のポイントが重要だと分かりました。

1. App Storeの審査では、アプリアイコンの設定は必須要件
2. デバッグバナーを非表示にした画像を提出する

これらの手順を踏むことで、アプリアイコンとデバッグバナーに関する審査は問題なくパスできるはずです。
【前提知識の確認】AtCoder Beginner Contest 362_D問題(競技プログラミング)

# 問題
https://atcoder.jp/contests/abc362/tasks/abc362_d

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# 優先度付きキュー基本操作
```python:sample.py
from heapq import heappush, heappop

def priority_queue_operations():
    heap = []
    heappush(heap, (5, 'A'))
    heappush(heap, (3, 'B'))
    heappush(heap, (7, 'C'))
    
    result = []
    while heap:
        result.append(heappop(heap))
    return result

print(priority_queue_operations())  # [(3, 'B'), (5, 'A'), (7, 'C')]

```


# ダイクストラのメインループ
```python:sample.py
from heapq import heappush, heappop

def dijkstra_step():
    graph = [
        [(1, 10), (2, 5)],    # ノード0の隣接
        [(3, 8)],             # ノード1の隣接
        [(3, 3)],             # ノード2の隣接
        []                     # ノード3の隣接
    ]
    
    dist = [0, 10**18, 10**18, 10**18]
    heap = [(0, 0)]
    
    while heap:
        d, v = heappop(heap)
        if d > dist[v]:
            continue
        for u, w in graph[v]:
            if d + w < dist[u]:
                dist[u] = d + w
                heappush(heap, (dist[u], u))
    
    return dist

print(dijkstra_step())  # [0, 10, 5, 8]

```
![2502151841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/d4227bfa-12c7-4da8-a18b-1201ffc34b3d.png)


# ノードの重み計算
```python:sample.py
def calculate_node_weight():
    A = [0, 3, 5, 2, 4]  # 各ノードの追加重み
    edges = [(1, 2, 10), (2, 3, 5), (1, 3, 8)]
    
    weighted_edges = []
    for u, v, b in edges:
        weighted_edges.append((u, v, b + A[v]))
        weighted_edges.append((v, u, b + A[u]))
    
    return weighted_edges

if __name__=="__main__":
    print(calculate_node_weight())  # [(1, 2, 13), (2, 1, 10), (2, 3, 10), (3, 2, 8), (1, 3, 13), (3, 1, 8)]



```
![2502151842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/d274c719-8ce2-4afb-b855-6eb1884bb1b3.png)


# 距離計算
```python:sample.py

def final_distance_calculation():
    A = [5, 3, 2, 4]
    dist_from_dijkstra = [0, 8, 5, 10]
    
    final_dist = [d + A[0] for d in dist_from_dijkstra]
    return final_dist

print(final_distance_calculation())  # [5, 13, 10, 15]


```
OCI Architect Professionalに合格したので難易度と対策について書きました。

# 初めに
昨年OCI Architect Professional(以下OAP)に合格しました。
以下難易度や対策について簡単ではありますが書いていきます。

# 合格基準
実技と選択問題ともに65%以上

# 試験形式
試験は監視付きのオンライン形式で実施されます。受験日は平日のみとなっています。
# 問題数
実技試験 2シナリオ
選択問題 25問
# 実技試験について
リソースを作成し、その ID を指定のフォームに貼り付けたり、コマンドを実行する必要があります。指示やヒントも用意されているので、過度に心配する必要はありません。

# 難易度
実技試験は学習コンテンツをしっかりとこなせば十分に対処できます。
一方、選択問題は模擬試験と異なる問題が多く、単純な丸暗記では対応しづらいです。やや癖のある問題も含まれており、回答に時間がかかる場合があります。難しい問題は早めに見切りをつけ、時間配分に注意しましょう。

# 勉強時間
1日の勉強時間は正確には覚えていませんが、Associate 試験合格後、約1か月で受験しました。
# 対策
[OAP学習コース](https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-architect-professional-2024-/141191)

実技試験：上記の学習コースのサンプルシナリオをスムーズに実行できるまで練習することが重要です。IAM などの細かい設定も理解しておくと良いでしょう。

ハンズオン環境は、自身のアカウント（Free Tier）や約4,000円のサブスクリプションであるself-paced-labを利用すると便利です。

選択問題：模擬問題や各章のスキルチェック問題を繰り返し解きましょう。Associate レベルの問題も合わせて取り組むと効果的です。

共通して言えるのは、学習コンテンツの動画をしっかりと視聴することです。

[公式ドキュメント](https://docs.oracle.com/en/)
こちらも目を通すことをお勧めします。

私は受講しませんでしたが、オンラインで試験対策セミナーが開催されているようです。そちらも活用してみてはいかがでしょうか。

# 補足
実技試験の練習環境でself-paced-labを使用する場合、一部のサービスが OAP 学習コースのラボでは使用できないため、他のコースからラボを申し込む必要がありました。

# 終わりに
試験料金は4万円を超える高額なものなので、しっかりと準備して臨みましょう。
この記事が少しでも皆さんの合格の助けになれば幸いです。最後までお読みいただき、ありがとうございました。
【電脳少女 プログラミング2088 Bランク】 ギャングのアジト PowerShellによる

今回は、こちらの[プログラミングゲームの解答コードを投稿しよう！](https://qiita.com/official-events/efe957f155af900604b3)の公式イベントの記事になります。

具体的には、paizaの新作プログラミングゲーム「電脳少女プログラミング2088 ─壊レタ君を再構築─」の
「ギャングのアジト」
という問題をPowerShell 5.1で解いてみたいと思います。


# 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_b_02

# 答え

```


# 入力例
$N = [int]::Parse((Read-Host "Enter the size").Trim())
$b = @()
for ($i = 0; $i -lt $N; $i++) {
	$row = (Read-Host "Enter row $($i + 1)").Trim().Split(" ") | ForEach-Object { [int]$_ }
	$b += ,@($row)
}

function IsSymmetric($pixels) {
	for ($i = 0; $i -lt $pixels.Length; $i++) {
		for ($j = 0; $j -lt [math]::Floor($pixels.Length / 2); $j++) {
			if ($pixels[$i][$j] -ne $pixels[$i][$pixel_art.Length - $j - 1]) {
				return $false
			}
		}
	}
	return $true
}

# 判定
if (IsSymmetric $b) {
	Write-Output "Yes"
} else {
	Write-Output "No"
}


```

最初に入力値を受け取ります。PowerShellの場合、この時点で疲れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427659/e897b4ca-32f9-489b-97a9-97355d2ca86c.png)

シンメトリックの判定はループを回して判定しています。
PaizaのスキルチェックのBランクだそうですが、ちょっと簡単ですね、Cランク相当だと思います。


# 最後に
このようなイベントをPowerShellでやる人は珍しいと思います。
PowerShellに興味を持った方は応援してね

下のリンク先でも記事を書いています

https://note.com/mahalo_/m/m421b17a881c8
Goでjson配列を受け取る方法

## はじめに

Postgresから取得したjson型の配列をGoで受け取る必要がありましたため
手順などまとめました。

## 結論

- postgresに登録するjson配列の型はjson型またはjsonb型を指定する
- Go側でデータ取得する際、byteスライスで受取。その後json.Unmarshalを行う

## 確認した環境

DB: Postgresql:16.2-alpine3.19(Docker)
Go: v1.23.6

## 確認手順

### DBデータ

json型で確認を行っていますが、jsonb型でも同様です。
- 以下のカラムとデータを作成

カラム名: users
型: json

データ
```sql
'[{"user_id": 1, "user_name": "test1", "height": 170.5}, {"user_id": 2, "user_name": "test2", "height": 165.0}, {"user_id": 3, "user_name": "test3", "height": 180.2}]'
```

### Go側の処理

1. DBよりデータ取得（この際usersは[]byteで受け取る）
2. json.Unmarshalで構造体へバインドする

```go
type User struct {
    ID int64 `json:"user_id"`
    Name string `json:"user_name"`
    Height float64 `json:"height"`
}

type Row struct {
    Hoge string
    Users []byte
}

// 1.DBよりデータ取得
// 戻り値rowは、上記Row型の想定
row := FetchUserWithHoge()

// 2.json.Unmarshalで構造体へバインドする
var users []User
if err := json.Unmarshal(row.Users, &users); err != nil {
    return err
}

```

### 個人的にハマったポイント

- DBへのカラム登録時、初めは、json[]型でデータを登録していたため、うまくバインドができなかった
- Unmarshal時、指定した構造体にjsonタグとは違うタグを指定していた
(ORM用のタグを指定していたため、うまくバインドができていませんでした。)

## さいごに

アンチパターンと言われるjson型を取り扱う機会がいままでなかったため、
調べた内容を記録として記事にさせていただきました。
【電脳少女 プログラミング2088 Cランク】 ネオン街のクラブ PowerShellによる

今回は、こちらの[プログラミングゲームの解答コードを投稿しよう！](https://qiita.com/official-events/efe957f155af900604b3)の公式イベントの記事になります。

具体的には、paizaの新作プログラミングゲーム「電脳少女プログラミング2088 ─壊レタ君を再構築─」の「ネオン街のクラブ
」という問題をPowerShell 5.1で解いてみたいと思います。


# 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_c_01


# 答え

```

$n = read-host
$s = read-host

$unique = ""

foreach ($char in $s.ToCharArray()) {
    if (-not $unique.Contains($char)) {
        $unique += $char
    }
}

Write-Output $unique.Length

```


これは最初の2行で入力値を受け取り
ループして重複を除外
最後に除外した文字列の長さを出力しています。

ポイントは
``foreach ($char in $s.ToCharArray()) {``
ここで``$s.ToCharArray()``こうすると文字列が格納されている``$s``の中身を１文字づつ取り出せます。
取り出された文字列は``$char``に代入され、
ループの中のIF文で変数``$unique``に含まれるかどうか判定して、含まれていなかったら``$unique``に継ぎ足しています。
最後に``$unique``の長さを出力。

# 最後に
このようなイベントをPowerShellでやる人は珍しいと思います。
PowerShellに興味を持った方は応援してね

下のリンク先でも記事を書いています


https://note.com/mahalo_/m/m421b17a881c8
オフライン環境でRHEL9マイナーアップデート(ISO)

RHELインストールメディアを使ってマイナーアップグレードする方法をメモします。
マイナーアップグレードとは RHEL9.2 から RHEL9.4 にバージョンを上げるなどを指します。

また、RHEL9.4のインストールメディア(ISO)を使って実施することを想定しています。

1. アップグレード前のバージョンを確認する
```bash:bash
cat /etc/redhat-release
Red Hat Enterprise Linux release 9.2 (Plow)
```
　
2. RHEL9.4 のインストールメディア(ISO)を使って dnf を実行できるようにする。
　（ここでは手順を省略しますが、
 　　ISOフィアルのマウントと /etc/yum.repos.d/配下に repoファイル作成です）
　
3. dnfキャッシュをクリアする（ここ重要）
```bash:bash
　dnf clean all
```
:::note info
ポイント
次の手順でインストールメディアを RHEL9.2からRHEL9.4に入れ替えたのに 
dnf upgradeしても何も起きないぞ、って時はこれで解決すると思うよ。
:::

 
4. アップデートを実行する
```bash:bash
dnf upgrade
```
　
5. OS再起動する
```bash:bash
reboot
```
　
6. アップデート後のバージョンを確認する
```bash:bash
cat /etc/redhat-release
Red Hat Enterprise Linux release 9.4 (Plow)
```
以上
JavaScriptメカニズム（定数、関数、オブジェクト）

# 参考
[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence)

# あらすじ
現場でrailsを触ってlaravelを触って今はtypescriptとreact-routerで実装することが多くなってきたが、今までJavascriptをがっつり勉強してなかったので復習も兼ねて上記講座を受けてみようと思った。

とある先輩から「エンジニアじゃない人間が聞いてもわかる程度の説明にしろ」という言葉をいただいたので、できるだけ頑張る。

# そもそもの確認
### 変数
箱。入れ物のイメージ。主に以下３つを使って宣言
- var(非推奨。使わないで)
- let
- const

varは現在非推奨。
letは再代入可能（let A = hoge, letA = fugaが可能）。
constは再代入不可能。

varが非推奨の理由は「再宣言」、「再代入」、スコープを飛び越えるため。
`var A = hoge`をした後に`var A = hoge`も可能だし
`var A = hoge`の後に`var A = fuga`が可能なこと。
また、実装してるとここだけしか使いたくない！って場面（ブロックだったりスコープ）をvarは突き破ってくる。
また、`var A (イコール書かない、代入なし)`でもundefinedになる。これがエラーとして出ないから怖い。

現状、今は`const`でなんでも定義してしまうのがいい。
constは再宣言、再代入ができない、巻き上げ（最初に宣言してるふうに見せる）ができないようになっているので、ガッチリ書かないといけない。

`let`は再代入可能なので使うとしたら今はfor文くらいな印象
```javascript
let A = hoge;
A = koushinsitayo;
console.log(A) //koushinsitayoになる
```
```javascript
for (let i = 0; i < 3; i++) {
    console.log(i); // 0, 1, 2
    // iを繰り返し代入してる
}
```
また、let、constはブロックスコープが適応される。（解説は後ほど）
結論、constを使おう。

### 関数
一連の手続き（処理）を実行する文の集まり。
```javascript
function fn(A){
  console.log(A);
  return A + 1;
}

fn(A);
```
Aが仮引数。関数に変数を渡すときに使う。
下のfn(A)のAが実引数という。
これはconsole.logというログに出力するコマンドとA+1の内容が返ってくる。これを戻り値という。
fn(A)はA+1が出力されるということ。

## オブジェクト
一言で言うとキーとバリュー。
キーが値札みたいなもので、バリューが売り物みたいなイメージ。
ドット記法（obj.prop1）またはブラケット記法（obj['prop1']）でアクセス可能
```javascript
const obj = {
    prop1: 'value1',
    prop2: function() {
        console.log('value3');
    },
    prop3: {
        prop4: 'value5'
    }
}

obj.prop2();           // 'value3'と出力
obj.prop6 = 'value6'; // 新しいプロパティを追加（constでもプロパティの追加は可能）
console.log(obj.prop3.prop4); // 'value5'と出力
console.log(obj) //prop1: 'value1',prop2....のように全て取得できる
```

基本はドット記法で書きたいが、ブラケットで書く場面もごく稀に。
- キーに空白がある場合
- for文でプロパティ名を作る場面（まだ１回くらいしか体験がない）
```javascript
const obj = {
    'first-name': 'John',
    'my age': 30
};

console.log(obj['first-name']);  // "John"
console.log(obj['my age']);      // 30
```
```javascript
for(let i = 1; i <= 3; i++) {
    const propertyName = `item${i}`;
    obj[propertyName] = `value${i}`;
}
// 結果：
// {
//   item1: "value1",
//   item2: "value2",
//   item3: "value3"
// }
```
Db2: 大文字小文字を意識してSQLを実行する方法

通常、Db2に作成されたオブジェクトは大文字小文字の区別なく利用可能で、select文のfrom句に指定するときは通常、大文字で指定しても小文字で指定しても問題ないです。

ただ以下のような特殊なケースは例外となります。

* クォーテーションで囲み、明示的に小文字を指定してオブジェクトを作成したとき
* Db2のADMIN_MOVE_TABLEでソース表を別名保管するオプションを利用し、ソース表を参照したいとき
    * ソース表は大文字小文字混在、Case sensitiveな名前にリネームされる
        * (正直やめてほしい)

#### ■ 方法 (1) db2コマンドプロンプトでダブルクォーテーションを使う

```
$ db2 connect to testdb

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 12.1.0.0
 SQL 許可 ID            = V12INST
 ローカル・データベース別名 = TESTDB

$ db2
(c) Copyright IBM Corporation 1993,2007
DB2 クライアント 12.1.0.0 コマンド行プロセッサー

コマンド・プロンプトからデータベース・マネージャーのコ
マンド、 および SQL ステートメントを呼び出せます。 例:
    db2 => connect to sample
    db2 => bind sample.bnd

一般ヘルプには ? をタイプしてください。
コマンドのヘルプには ? command をタイプしてください。
command には、データベース・マネージャー・コマンドの
最初のいくつかのキーワードを入力します。 例:
 ? CATALOG DATABASE は CATALOG DATABASE コマンドのヘルプです。
 ? CATALOG          は全 CATALOG コマンドのヘルプです。

db2 対話モードを抜けるには、コマンド・プロンプトで QUIT
とタイプしてください。
対話モード以外では、すべてのコマンドに接頭語 'db2'
を付ける必要があります。
現在のコマンド・オプションの設定をリストするには、
LIST COMMAND OPTIONS とタイプしてください。

詳細は、「オンライン・リファレンス」を参照してください
。

db2 => select * from "T1AAAAVxo"

C1          C2
----------- --------------------------------
          1 A
          2 B
          3 あいう

  3 レコードが選択されました。

db2 =>

```


#### ■ 方法 (2) シングルクォーテーションとダブルクォーテーションの合わせ技

```
$ db2 connect to testdb

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 12.1.0.0
 SQL 許可 ID            = V12I
 ローカル・データベース別名 = TESTDB

$ db2 'select * from "T1AAAAVxo"'

C1          C2
----------- --------------------------------
          1 A
          2 B
          3 あいう

  3 レコードが選択されました。

$ 

```


#### 参考
Db2マニュアル

https://www.ibm.com/docs/ja/db2/11.1?topic=SSEPGG_11.1.0/com.ibm.swg.im.iis.db.found.conn.fw.configgen.doc/topics/rlspln05.htm


Db2のバイブル的なblog

https://db2.jugem.cc/?eid=2601#gsc.tab=0
10th,円周率を三角関数を使わず計算する【C言語】

正三角形をしきつめたり、
素数を使ったり色々やって
第10段目。
<h3>平行四辺形を埋めて計算する</h3>

```pai10.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void now(void)
{
	time_t t = time(NULL);
	struct tm *local = localtime(&t);
/*
	printf("%04d/", local->tm_year + 1900);
	printf("%02d/", local->tm_mon + 1);
	printf("%02d", local->tm_mday);

	printf(" ");
*/
	printf("%02d:", local->tm_hour);
	printf("%02d:", local->tm_min);
	printf("%02d\n", local->tm_sec);
	fflush(stdout);
}

double yret(double x)
{
	return sqrtf(1.0f - x*x);
}

int main(int argc,char *argv[])
{
	unsigned long long	nnn = time(NULL),o=0;
	double n=10.0f;
	if(argc > 1 )
	{
		n=atof( argv[1] ) ;
	}
	printf("---START---");	now();//時刻表示
	//--- --- --- ---
	
	double ksns;
	double x ,y ;
	double s ;
	int m=10;

	while(m)
	{
		s=0.0f ;
		ksns = 1.0f / n ;
		for(x=ksns ; x <=1.0f ; x += ksns)
		{
			y = yret( x ) ;
			s += ksns * y ;
		}

		nnn = time(NULL);
		if ( nnn >= o)
		{
			o = nnn + 3 ;
			printf("%.12f ,e%.2f割",s*4.0f,log10f(n));
			now();
		}
		
		n *= 1.03f;
//		m--;
	}
	return 0;
}
```

中々優秀で1分もしないうちに、
3.141592まで正解出来た
```log.log
---START---20:16:08
2.904518324137 ,e1.00割20:16:08
3.141592438298 ,e6.97割20:16:11
3.141592540680 ,e7.25割20:16:14
3.141592577478 ,e7.42割20:16:17
3.141592597510 ,e7.55割20:16:20
3.141592603984 ,e7.64割20:16:23
```

正三角形埋めの時は5時間掛けても
3.1415までしか近づかなかった。
半群・モノイド・群・環・体の定義

自分用に、基本的な代数的構造の定義をメモしておきます。

# 代数系

集合 $A$ に２項演算 $\*:A\times A \rightarrow A$ が定義されているとき、これらをペアで考えた系 $(A\ ;\*)$ を**代数系**という。

また、$\*$ が $A$ の２項演算であるとき、$A$ は２項演算 $\*$ について**閉じている**、または２項演算 $\*$ が定義されているという。

基本的な各性質

- 交換律：$\forall a, b \in A, a\*b=b\*a$
- 結合律：$\forall a, b, c \in A, a\*(b\*c)=(a\*b)\*c$
- 単位元の存在：$\exists e \in A, \forall a \in A, a\*e=e\*a=a$
- 逆元の存在：$\forall a \in A, \exists x_a, \in A, a\*x_a=x_a\*a=e$

を踏まえ、以下の条件を満たした代数系はそれぞれ**半群**、**モノイド**、**群**と呼ばれる。

## 半群

- 結合律が成立する


## モノイド

- 結合律が成立する
- 単位元が存在する


## 群

- 結合律が成立する
- 単位元が存在する
- 逆元が存在する


## （可換群 または アーベル群）

- 結合律が成立する
- 単位元が存在する
- 逆元が存在する
- 交換律が成立する


--------------------------------

つぎに、集合 $A$ に２つの演算 $+$ と $\times$ が定義された代数系 $(A\ ;+,\times)$ を考える。

- 分配律：$\forall a, b, c \in A,$
```math
\begin{align}
a \times (b + c) = a \times b + a \times c \\
(a + b) \times c = a \times c + b \times c \\
\end{align}
```

として、以下の条件を満たす代数系をそれぞれ**環**、**体**と呼ぶ。

## 環

- $(A\ ;+)$ は可換群である
- $(A\ ;\times)$ は半群である
- 分配律が成立する


## 体

- $(A\ ;+)$ は可換群である（加法単位元 $o$）
- $F^* = A \setminus \lbrace o \rbrace$ として、$(F^*\ ; \times)$ は群である
- 分配律が成立する


# 参考文献

1. 石村園子（2007）『やさしく学べる離散数学』共立出版株式会社
Jenkinsジョブの作成方法

## 新規ジョブを作成する方法

新規ジョブを作成する方法
ジョブ名入力するテキストボックスに**任意**の名前を入力
ここでは「job」と入力

「Select an item type」の部分に関して「フリースタイル・プロジェクトのビルド」を選択します。

![スクリーンショット 2025-02-18 192202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/884e0392-4d15-4463-a377-af341d6b6561.png)

General部分以下に値を入力する

![スクリーンショット 2025-02-18 195234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/cc69a63f-947b-4aa5-a4a6-28f7d3045e07.png)
DBテーブルを複製するコマンド - Create Table as Select

既存のテーブルの構造も中のデータもまるごとコピーして、名前だけ違うテーブルを作りたい。
というとき、Create Table as Select文(CTAS)が便利です。
しかし標準のSQLではないということなのか、RDBごとに構文が異なります。
(といっても2種類しか確認できていませんが)

### 【Oracle 23ai の場合】
```text:T1表の複製としてA表を作成
SQL> create table A as select * from T1;

Table created.

SQL> 
```

### 【Db2 12.1 の場合】
データの複製を行うか(WITH DATA)、テーブル定義のみコピーするか(WITH NO DATA)を指定するオプションが必要。
さらに、as select部分をカッコで囲まないと構文エラーとなります。

```text:T1表の複製としてA表を作成
$ db2 "create table A as (select * from T1) with data"
DB20000I  SQL コマンドが正常に完了しました。
```
これで、上のOracle 23aiと同じくデータごと表をコピーできました。



#### 補足（１）エラー例
Db2でOracleと同じ構文でCTAS実行するとこうなる、という例。
##### 1) WITH DATA または WITH NO DATA オプション欠落
```
$ db2 "create table a as select * from t1"
DB21034E  コマンドが、有効なコマンド行プロセッサー・コマ
ンドでないため、 SQL
ステートメントとして処理されました。  SQL
処理中に、次のエラーが返されました。
SQL0104N  "as select * from T1" に続いて予期しないトークン
"END-OF-STATEMENT" が見つかりました。 予期されたトークンに
"WITH DATA, WITH NO DATA" が含まれている可能性があります。
SQLSTATE=42601
```

WITH DATA, WITH NO DATA どちらかがデフォルトで選択されるわけでない点は、良心的なのかもしれないです。

##### 2) カッコ指定忘れ
```
$ db2 "create table a as select * from t1 with data"
DB21034E  コマンドが、有効なコマンド行プロセッサー・コマ
ンドでないため、 SQL
ステートメントとして処理されました。  SQL
処理中に、次のエラーが返されました。
SQL0104N  "elect * from t1 with" に続いて予期しないトークン "data"
が見つかりました。 予期されたトークンに "END-OF-STATEMENT"
が含まれている可能性があります。  SQLSTATE=42601
```


#### 補足（２）オンラインで表をコピーする方法？
Db2ではオンラインで更新がかかっている状態のテーブルを別の表スペースに移動したいとき、ADMIN_MOVE_TABLEプロシージャーが使えます。
元表を別名で残して置けるオプション(KEEP)もあるため、表の複製にも使えそうではあります。
ただし、コピー先が別の表スペースとなります。
統計情報も一緒にコピーできるなど単純な表移動、コピー以上のことをしてくれますが元表の名前は維持されず、別の表名に変更されてしまいます。このためrenameコマンドでターゲット表をリネームし、Db2に自動名称変更されてしまった元表を元の名前に戻し、という手間が生じます。
単純に表をコピーしたいだけならCTASのほうがシンプルだと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/b2b12c58-38e2-48c9-903f-f8ff398c6cb0.png)
Xcode15において、App Extensionsを含むビルドでCycle inside Runner（循環依存）が起きる

## エラー
「Custom Keyboard Extension」を追加した際、Xcode のビルドサイクルで 循環 (Cycle) エラー が発生。
``` zsh
Could not build the precompiled application for the device.
Error (Xcode): Cycle inside Runner; building could produce unreliable results.
Cycle details:
→ Target 'Runner' has copy command from '/Users/x/dev/xxxxx/build/ios/Debug-iphoneos/xxxxx.appex' to
'/Users/x/dev/xxxxx/build/ios/Debug-iphoneos/Runner.app/PlugIns/xxxxx.appex'
○ Target 'Runner'
○ That command depends on command in Target 'Runner': script phase “Thin Binary”
○ Target 'Runner' has process command with output '/Users/x/dev/xxxxx/build/ios/Debug-iphoneos/Runner.app/Info.plist'
○ Target 'Runner' has copy command from '/Users/x/dev/xxxxx/build/ios/Debug-iphoneos/xxxxx.appex' to
'/Users/x/dev/xxxxx/build/ios/Debug-iphoneos/Runner.app/PlugIns/xxxxx.appex'
```

## 原因
Xcode の ビルドシステムの依存関係 と コピー処理の順序 に問題があり、適切に xxxxx.appex が処理されず、循環エラーが発生。

発生時の順序
![スクリーンショット 2025-02-18 19.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/61b78cbf-3630-4e29-a628-329be7108094.png)

Xcode のビルドシステムでは、以下の順序で処理が実行される。


`1.ターゲットのコンパイル（個々のターゲットの Swift / Objective-C ファイルをコンパイル）`
`2.Thin Binary（スクリプト処理）（不要なアーキテクチャのバイナリを削除）`
`3.CP Embed Pods Frameworks（CocoaPodsのフレームワークをコピー）`
`4.Embed App Extensions（アプリ拡張機能の埋め込み）`

通常、この流れで問題なくビルドされるが、「Custom Keyboard Extension」などの特殊な拡張機能 がある場合、次の問題が発生する。

「Thin Binary」や「CP Embed Pods Frameworks」の段階で xxxxx.appex を参照しようとするが、まだ xxxxx.appex が埋め込まれていない。
存在しない拡張機能を参照しようとしてビルドエラーが発生する。

## 解決策
「Build Phases」の順番を調整し、「Embed Foundation Extension」を「Thin Binary」や 「CP Embed Pods Frameworks」の前に配置 する。
![スクリーンショット 2025-02-18 19.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/9d192f3b-23da-49a4-8ce6-1d026afcdb44.png)



### 修正のポイント
xxxxx.appexを先にビルドし、適切に Runner.app にコピーされるようにする。
その後 Thin Binary や CP Embed Pods Frameworks が xxxxx.appex を正しく参照できる状態にする。
この調整により、Xcode の「Cycle inside Runner」エラーが解消され、正しくビルドできるようになる。
Elmer Virtual Machine Scripts を組み込んだWSL (Debian 12ベース)をフォーラムに公開しています

## 狙い
以下のことが改善されるので、wsl版を作って公開しました。
**VirutualBoxやVMPlayerよりも起動が速い**
**上記仮想化方法の場合、カーネルや仮想化ソフトのバージョンアップを行ったときに手間取ることがある**
**Elmer Virtual Machineは、20GBのストレージで作成しており、本格的に使用するにはストレージの拡張が必要[1]**
**フィンランド語から英語もしくは日本語環境への変更（特にキーボードレイアウト）**
**Windowsとの連携がWSLの方がよい**
**Windows版のバイナリは導入が簡単であるが、MUMPSやMMGなどが使えないのでElmerの機能を十分活かせない**

[1]ストレージの拡張は、仮想化ソフトによりドライブを増やした後、ISOメディアからUbuntuなどのライブLinuxからGpartedにより操作することで可能です。
[詳細はこちら](https://www.howtogeek.com/124622/how-to-enlarge-a-virtual-machines-disk-in-virtualbox-or-vmware/ "How to Enlarge a Virtual Machine's Disk in VirtualBox or VMware")

## 作成条件
"elmerdeps.sh"や"buildelmer.sh"を動作させるための依存パッケージは、わかるものはバイナリ、見つからなかったものはソースコードからビルドしました。
Ubuntuよりも自由なDebianが好きなので、Debian 12としました。 
wsl版を作成した2024年4月時点でUbuntuのElmer Virtual Machineは、paraviewが起動しなくなる問題を起こしましたが、Debianでは問題ありませんでした。
GridDataReader、OCC (Geometry viewer)、VTK(ElmerVTK)の機能はオフにしています。

## ダウンロード先
拙い英語ですが、簡単な説明文を書いています。Intel MKLのPardisoソルバーを動作するようにビルドすると、熱放射のView Factorsが動作しなかったので、最後（15 Apr 2024, 11:52）のファイルが良いと思います。
[wsl版debian-elmer](https://www.elmerfem.org/forum/viewtopic.php?t=8266 "Elmer WSL Debian 12 with Elmer Virtual Machine Scripts")

## 解析モデル例
会社に勤めていた時に電場解析を行っていました。ブッシングの碍管の笠（Shed）の電界が高いと劣化するので、この部分を見るためにMMGによりメッシュを細かくしました。
[MMGを用いたブッシングの電場解析](https://www.elmerfem.org/forum/viewtopic.php?t=8269 "Electric field analysis: high voltage transformer bushing")

![Bushing-Elmer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/3672d754-2eed-4bcc-8498-982e33a9fe7c.png)
自分の人生のテーマ みたいなものが言語化できたので書いてみる

僕の人生のテーマは「何かを良くすること」だと思う

きっかけは「自分の取扱説明書」を作ったこと。その時にこんなことを書いた。
>「質が良い」状態と、そこに至るまでのプロセスが好きです。
（部屋が片付く、モノがきれいになる、健康的な体になる、プロダクトが正常に動く等）
だからQAをやっています。

平たく言うと「何かを良くすること」が好きなんだなぁと。
そして、この軸で自分が普段やっていることを振り返ると、
どれも何かを良くする活動だと言えそう、ということに気づく。

【やっている事】
- QAという仕事
    - テスト業務においては、プロダクトやプロセスを良くすること
    - マネジメントにおいては、メンバーのスキルやマインド、そしてチームを良くすること
- 筋トレ
    - 重量や回数を伸ばす。体つきを良くすること
- 習慣作り：年間で1つ習慣を作る活動
    - 人生そのものを良くすること
        - 「良い習慣が良い人生を作る」と言う学生時代の教えに基づいている
        - ちなみに実績は以下
            - 2022年：ストレッチ
            - 2023年：読書
            - 2024年：英語学習
            - 2025年：ランニング＆家計簿をつける

余談だけど、革やデニムのエイジングが好きだったり、
錆びたナイフや時計、機械などを修理してピカピカする動画を頻繁に見るのも
何かが良くなっていくことが好きだから、なのかもしれない。

「何かを良くする」というのは、アクションや行動に結びつけやすい具体性、
かつあらゆる場面に適用できる汎用性があり、我ながらいい塩梅だと思っている。


というわけで自分の人生をいま言語化するなら「何かを良くすること」である。
このテーマも、どんどん見直して良いものにしていきたいところ。
Swift(Storyboard)でインターネットの接続を確認する

1.はじめに
iOSアプリでデータベースなどの外部と連携したアプリを作成することがあると思いますが、その際インターネットに接続されていないと不都合な場合があると思います。その際に必要なコードを書いておこうと思います。



2.実装
1つ目のコードは、常にインターネットに接続を確認して、確認できない場合にアラートを表示するものです。（アラート部分で他の処理を追加することもできます！
```swift
import UIKit
import Network

class ViewController: UIViewController {
    let monitor = NWPathMonitor()
    let queue = DispatchQueue.global(qos: .background)

    override func viewDidLoad() {
        super.viewDidLoad()
        startNetworkMonitoring()
    }

    func startNetworkMonitoring() {
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                if path.status != .satisfied {
                    self?.showNoInternetAlert()
                }
            }
        }
        monitor.start(queue: queue)
    }

    func showNoInternetAlert() {
        let alert = UIAlertController(title: "ネットワークエラー",
                                      message: "インターネットに接続されていません。",
                                      preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default))
        present(alert, animated: true)
    }
}
```




2つ目はボタンが押された場合にインターネットへ接続されているかを確認するものです。常に監視する必要がない、データベースに登録する場合などに使用できます!
```swift
import UIKit
import Network

class ViewController: UIViewController {
    let monitor = NWPathMonitor()
    let queue = DispatchQueue.global(qos: .background)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let button = UIButton(type: .system)
        
        button.setTitle("接続を確認", for: .normal)
        button.addTarget(self, action: #selector(checkNetworkConnection), for: .touchUpInside)
        
        button.translatesAutoresizingMaskIntoConstraints = false
        
        view.addSubview(button)
        
        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            button.widthAnchor.constraint(equalToConstant: 200),
            button.heightAnchor.constraint(equalToConstant: 50)
        ])
    }
    
    
    @objc func checkNetworkConnection() {
        let monitor = NWPathMonitor()
        monitor.start(queue: queue)
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                if path.status != .satisfied {
                    self?.showNoInternetAlert()
                } else {
                    print("接続されています")
                }
            }
            monitor.cancel()
        }
    }
    
    func showNoInternetAlert() {
        let alert = UIAlertController(title: "ネットワークエラー",message: "インターネットに接続されていません。",preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default))
        present(alert, animated: true)
    }
}
```


![Simulator Screenshot - iPhone 16 Pro - 2025-02-18 at 19.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791320/562d5d54-d757-4d42-b325-2baac40b2bea.png)

3.おわりに
できるだけ毎日、現在働いている自社開発会社のアプリの修正した機能を公開していくのでよろしくお願いします。
合わせて私がiOS,Androidアプリを開発したIDNectというゲームのIDを友達などと共有できるアプリをよろしくお願いします。
https://idnect.com
型 'string[]' の引数を型 'SetStateAction' のパラメーターに割り当てることはできません。の解決方法について

# はじめに
検索機能を実装していて下記のようなエラーが表示されました。
こちらの解決方法について共有させていただきます。

:::note warn
型 'string[]' の引数を型 'SetStateAction<string>' のパラメーターに割り当てることはできません。ts(2345)
const matchedSkills: string[]
:::


下記のように記述していました。
```.tsx
function App() {
  const [users, setUsers] = useState<Users[]>([]);
  const [userSkill, setUserSkill] = useState<UserSkill[]>([]);
  const [skills, setSkills] = useState<Skills[]>([]);
  const [searchUserId, setSearchUserId] = useState<Users["user_id"]>("");
  const [resultSkills, setResultSkills] = useState<Skills["name"]>("");


// 検索機能
const handleSearch = () => {
  if (!searchUserId) {
    console.warn('検索するuser_idを入力してください');
    return;
  }

  // ユーザーが持つスキルのIDを取得
  const matchedSkillId = userSkill.filter((us) =>  us.user_id === searchUserId).map((ui) => ui.skill_id);
  
  // スキルIDに該当するスキル名を取得
  const matchedSkills = skills.filter((skill) => matchedSkillId.includes(skill.id)).map((sk) => sk.name);

  setResultSkills(matchedSkills); // ← エラーが出ている箇所
  console.log(matchedSkills);
}
```

それぞれの型は下記のように記述しています。
```.types.ts
export interface Users {
  user_id: string;
  name: string;
  description: string;
  github_id?: string;
  qiita_id?: string;
  x_id?: string;
}

export interface UserSkill {
  id: number;
  user_id: string;
  skill_id: number;
}

export interface Skills {
  id: number;
  name: string;
}

```

# 解決方法
型指定の記述をstringで配列にする
```tsx
const [resultSkills, setResultSkills] = useState<Skills["name"]>("");
```
下記のように修正
```tsx
const [resultSkills, setResultSkills] = useState<string[]>([]);
```

# 終わりに
データ取得が１つだけだという先入観でnameを指定していました。
２つのデータを取得する場合もあり、配列にする必要がありました。
<br>
[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
サーペノイド曲線(Serpenoid Curve)

# はじめに
ケーキのクリームがうねうねしてる、あの曲線を数学的に知りたかった。
以前、たどり着いたのは、エラスティカ(Elastica)。

https://qiita.com/hextomino/items/8f91c9a163adc0c7305b

今回取り組むのは、サーペノイド曲線(Serpenoid Curve)。

# サーペノイド(serpenoid)
意味は、
serpent...宗教等で登場する蛇(アダムとイブや神話など)
snake...一般的な蛇
viper...毒蛇

serpenoid...蛇のような
英辞書にもなく、
英語のwikiもなく、serpenoid curveは一般的でない？
snake curveというのもない。
代わりに、Serpentine Curve(サーペンタイン曲線)が出てきたけど、これは違う。クロソイド曲線と関連深そう。後で要確認。

https://en.wikipedia.org/wiki/Serpentine_curve

#### ChatGPTによると

ChatGPT的には蛇状曲線や、蛇行曲線を訳として提案してきた。
```
Serpenoid curve（サーペノイド曲線）は、蛇のように波打つ形状を持つ曲線のことを指します。
数学的に明確に定義された特定の曲線ではなく、
一般的には「蛇のようにうねる形状を持つ曲線」を指すことが多いです。

特徴
　周期的な波形
　　サイン波や余弦波のように波打つ性質を持ちますが、特定の数式に限定されません。
　スムーズな連続性
　　曲線がなめらかに変化し、尖った部分が少ないのが特徴です。
　ジグザグではなく、連続的にうねる形状
　　例えば、蛇が進む際の軌跡のような動きをイメージできます。
```

# プログラム
ChatGPTによる定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/1cdca320-99b3-4717-92b8-52b6aa1e600e.png)
ChatGPTのコードを元に、マウス操作と表示系を修正しました。
```java:Processing
int numPoints = 800; // 曲線を描く点の数
float ds = 2.0;      // 弧長方向の増分
float A = 0.1;       // 曲率の振幅
float B = 0.05;      // 曲率の周波数

void setup() {
  size(800, 400);
  fill(0);
  stroke(0);
}

void draw(){
  background(255);
  A = mouseX*0.001;
  B = mouseY*0.0005;
  text("A = "+A,50,100);
  text("B = "+B,50,120);
  drawSerpenoidCurve();
}

void drawSerpenoidCurve() {
  float x = width / 2;
  float y = height / 4;
  float th = -0.05; // 初期角度

  for (int i = 0; i < numPoints; i++) {
    float kappa = A * cos(B * i * ds); // 曲率の定義
    th += kappa * ds; // 角度の更新
    
    // 座標の更新（オイラー積分）
    float dx = ds * cos(th);
    float dy = ds * sin(th);
    
    float newX = x + dx;
    float newY = y + dy;
    
    line(x, y, newX, newY); // 線を描画

    // 座標の更新
    x = newX;
    y = newY;
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/16c48afd-bf94-490e-97db-b3d7038f2fca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/3ffd05be-bc3e-4d29-b3d3-a60d054e86b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/c0373206-19a2-47ac-bd37-2b8908ad1d6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/3329f5d9-4ff5-4823-8adc-3dd4d994255e.png)


アニメーションもできるというので、生成してもらいました。（イマイチです）
```java:Processing
int numPoints = 500; // 曲線を描く点の数
float ds = 2.0; // 弧長方向の増分
float A = 0.1; // 曲率の振幅
float baseB = 0.05; // 基本の曲率周波数
float t = 0; // 時間パラメータ

void setup() {
  size(800, 600);
  background(255);
}

void draw() {
  background(255, 10); // 軌跡を残すために少し透明度を持たせる

  float x = width / 2;
  float y = height / 2;
  float theta = 0; // 初期角度

  float B = baseB + 0.02 * sin(t); // 時間とともに曲率周波数を変化

  for (int i = 0; i < numPoints; i++) {
    float kappa = A * sin(B * i * ds); // 曲率の定義
    theta += kappa * ds; // 角度の更新

    // 座標の更新（オイラー積分）
    float dx = ds * cos(theta);
    float dy = ds * sin(theta);

    float newX = x + dx;
    float newY = y + dy;

    stroke(0, 100, 255); // 青色の曲線
    line(x, y, newX, newY); // 線を描画

    // 座標の更新
    x = newX;
    y = newY;
  }

  t += 0.05; // 時間を進める
}
```