OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 20.04 Apache2 node.jsを動作させる(SSL対応)

Kagoya.js VPS（Virtual Private Server）を利用し、Ubuntu 20.04をセットアップ。
更にApache2及び、Nodeをインストール。
```
# apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
node -v
v20.17.0
```
を確認。
更に
proxy及びproxy_http moduleを有効にする。
 ```
 a2enmod proxy
 a2enmod proxy_http
 ```
 SSL対応は
 ```
 certbot --apache -d www.example.com
 ```
/etc/apache2/sites-enabled/下にwww.example.com.confが生成されるので、
 ```
 cd /etc/apache2/sites-enabled/
 vi www.example.com.conf
 <VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName www.example.com
        DocumentRoot /var/www/example
Include /etc/letsencrypt/options-ssl-apache.conf
ServerAlias www.example.com
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
    ###ここから追加###
    SSLEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    SSLProxyEngine on
    ProxyRequests off
    ProxyPass / http://www.example.com:5007/
    ProxyPassReverse / http://www.example.com:5007/
    ###ここまで###
</VirtualHost>
</IfModule>
```
後は、node.jsのapp下で、server.jp等起動jsを指定してforeverにてnodeアプリをdaemon化し、常駐させます。
```
forever start server.js
```
最後にcertbot利用の場合の自動更新をcorntabに設定。
```
crontab -e
37      1    *       *       *       root    certbot renew
systemctl restart cron
```
以上、自分覚書として、投稿。
参考サイト：
https://qiita.com/someone-said-so/items/ef7ff1751afb72bb6d6e
https://medium.com/@ralphbetta/setup-node-js-servers-with-apache-on-ubuntu-vps-9b53e1f34c06
Wandbで PermissionError: [Errno 13] Permission denied: '/tmp/wandb/...' が発生したときの対処法

## 対処法
システムのtmpディレクトリに他のユーザが先にwandbディレクトリを作成していた場合、書き込みが行えないので、パーミッションエラーが発生する。
したがって、他のディレクトリにログを出力するようにする。
また、wandb.init()を呼ぶ前にログを出力したいディレクトリを作成する。

## エラーの原因
システムのtmpディレクトリに他のユーザが先にwandbディレクトリを作成していた場合、書き込みが行えないので、

    PermissionError: [Errno 13] Permission denied: '/tmp/wandb/run-...

のようなエラーが発生する。

また、wandb.init()が呼ばれたときに、そのディレクトリが存在しない場合、システムのtmpディレクトリが利用されるようになっている。
そのため、wandb.init()を呼び出した後にそのディレクトリを作成したとしても、そこではなくシステムのtmpディレクトリにログを作成しようとするので、パーミッションエラーが発生する。
【Python】Github Actions でpylintで exit codeでエラー

## exit code でエラーが出る

Github Actions で workflowを下記のように書いて、pylint を実行してみます。.pylintというファイルは使っています。

```yaml
    - name: Analysing the code with pylint
      run: |
        sudo apt-get -y install graphviz
        poetry run pylint $(git ls-files '*.py')
```

下記のようなエラーが出て、Github Actionsが faillure になってしまいました。

```bash
-----------------------------------
Your code has been rated at 7.66/10

Error: Process completed with exit code 28.
```
### 対応1

実はpylint にexit-zero というオプションがあり、コマンドラインや.pylintrc で設定することができます。

```ini:.pylintrc
[MAIN]
# Always return a 0 (non-error) status code, even if lint errors are found.
# This is primarily useful in continuous integration scripts.
exit-zero=yes
```
下記で十分でした。

```yaml:my_workflow.yaml
    - name: Analysing the code with pylint
      run: |
        sudo apt-get -y install graphviz
        poetry run pylint $(git ls-files '*.py')  --exit-zero
```





### 対応2(過去のもの)

検索て同じ問題で悩んでいる方がいらっしゃいましたが、私は下記で通すことにしました。

```yaml:my_workflow.yaml
    - name: Analysing the code with pylint
      run: |
        sudo apt-get -y install graphviz
        poetry run pylint $(git ls-files '*.py')  || true
```

# まとめ

とりあえずGithub Actions で Status failure から Status success になれて良かったです。
(2024/11/9)

追記
- exit-zero を追記(2024/11/10)
[AI/ML] Model-based RLの利点

# 0. はじめに
Reinforcement Learning（RL）は、Model-BasedとModel-Free RLに大別される[1]。本記事では、自身の備忘録として**Model-Based RLの概要と利点**を簡潔に述べる。

# 1. Model-Free RL
Model-Free RLは**データから直接的にpolicy（stateからactionを決める関数）を学習するもの**である。RLという言葉を利用する際に、特段の断りがない場合は、こちらを指す場合が多い。

# 2. Model-Based RL
Model-Based RLでは、先ず**データから環境をModelとして学習**し、そのModelを利用してrewardを計算し、最適なactionを選択する。**ここでModelとは、Transition Probability（actionによって状態が遷移する確率）を指す**。

# 3. Model-Based RLの利点

## 3.1 分析や説明が容易
Transition Probabilityをモデル化しているため、状態遷移のフローを確率的に示せるため、分析や他者への説明が容易になる。例えば、action選択の根拠を説明する場合など分かりやすい。

## 3.2 再学習なしのReward計算のカスタマイズ
Model-Based RLの特徴は、**Rewardの計算と独立した形で環境をModel化する点**にある。従って、**再学習することなく、何らかの契機でRewardの計算方法を調整・変更すること**も可能になる。例えば、ユーザの属性毎にReward計算の方針が異なる場合でも、それぞれに合わせたRewardの計算を実施できる。

# 4. まとめ
本記事では、Model-Based RLの概要と利点を簡潔に紹介した。

# 参考文献
[1] https://en.wikipedia.org/wiki/Deep_reinforcement_learning
AWSのネットワーク周りをまとめてみた

## はじめに
最近、業務で、cloudformationを用いてAWSの環境を構築しているのですが、ネットワーク周りの自分の知識が弱くつまづいてしまうことが多いため、まとめてみようと思います。

## VPC
VPCとはVirtual Private Cloudの略で、AWSのアカウント内にプライベートな仮想ネットワーク環境を構築することができるサービスのことを言います。このVPCを用いることで、サーバー(EC2)やデータベース(RDS)といった他のサービスを利用することができます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html


## Internet Gateway
VPCとインターネット間の通信を可能にするためのものです。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html


## NAT Gateway
まず、NATとは、インターネット上で使われるIPアドレスを、プライベート内で使われる複数のデバイスで共有するための技術のことです。このNATという技術を使うことにより、インターネット上のサービスにアクセスする際、プライベートネットワーク内のデバイスのプライベートIPアドレスは、外部に公開されず、外部からは、NATにより共有された公開IPアドレスのみが見えます。
すなわち、NAT Gatewayを使うことにより、プライベート内のデバイスからインターネット上へのアクセスはすることができるが、インターネット上のデバイスからプライベート内のデバイスにアクセスすることはできないことになります。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html



## Public subnet
インターネットから通信することができるサブネットのことを言います。
インターネットから通信することができるようにするために、Internet Gatewayに接続されています。

## Private subnet
Public subnetとは逆で、インターネットから通信することができないサブネットのことを言います。
インターネットから通信することができないようにするためにInternet Gatewayには繋がっておらず、　ゲートウェイに接続されている場合は、外部からプライベートIPアドレスを隠すことができるNAT Gatewayに接続されています。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/configure-subnets.html


## さいごに
最後まで読んでくださり、ありがとうございます！
自分の中でのネットワーク周りのモヤモヤがスッキリしました！これで開発捗りそうです！
pickleが超便利だった件

ある```.py```ファイルにおいて、リストを作成した。そして、そのリストをその他の別の```.py```ファイルでも使用したい。こんな経験ありませんか？（僕は、クローリング・スクレイピングをしていてこのような状況を経験しました）
そんな時どうするか,,,,

➡```pickle```を使え！！！

## pickleとは ##
Python でデータを保存したり読み込んだりするためのライブラリです。
簡単に言うと、**「Python のデータ（リストや辞書、モデルなど）をファイルに保存して、後でまた使えるようにする」** ためのもの。

## 事前準備
```diff_python
import pickle
```
## ```pickle```ファイルを保存
今、```book_titles_list```にいくつかの本名が格納されているとしましょう。

```sample1.py
book_titles_list = ['嫌われる勇気', `限りある時間の使い方', `現代統計数理学の基礎']
```
そして、以下のコードを実行すると、```book_titles_list```が拡張子```.pickle```で自分のディレクトリ内に保存されます。
```sample1.py
# リストをファイルに保存
with open('book_0titles_list.pkl', 'wb') as f:
    pickle.dump(book_titles_list, f)
```
そして、実際カレントディレクトリに↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/3695e5e6-899f-4b5f-2d50-c306f64f08a6.png)
しっかりと保存されていることがわかると思います。

## pickleファイルの読み込み
さて、読み込みです。↓で```sample2.py```でも```bookd_titeles_list```を再利用できます！
```sample2.py
# 保存されたリストを読み込む
with open('book_titles_list.pkl', 'rb') as f:
    book_titles_list = pickle.load(f)
```

# ※追記 `with open()`の構文について
`with open(filename, mode)` は、任意のファイルを開き、作業が終わったら自動的にファイルを閉じる仕組みを提供します。

`mode`の種類は、↓
| mode | 説明 |
|:-----------:|:------------|
| 'r' | 読み取り専用。ファイルが存在しない場合はエラー。|
| 'w' | 書き込み専用。ファイルが存在しない場合は作成、存在する場合は上書き。|
| 'a' | 追記モード。既存ファイルの末尾にデータを書き込む。 |

- 例１(mode='r')
```python:example1_'r'
with open('example1.txt', 'r') as f:
    content = f.read()
    print(content)  # ファイルの内容を文字列として出力
```

ちなみに、バイナリデータ(`.txt`以外のファイル）を読み込むときは`'b'`をつけ足して`'rb'`, `'wb'`などとしましょう。

- 例２(mode='wb')
```python:example2_'wb'
data = b'Hello, binary world!'  # バイト列データ
with open('example2.bin', 'wb') as f:
    f.write(data)
```
TEDxJP-10k のデータセットのwavをsegmentsに従って分割する

下記の再現のため、

https://www.ai-shift.co.jp/techblog/4512#:~:text=%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86,%E5%88%A5%E9%80%94%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%81%BE%E3%81%99%E3%80%82

>
> ディレクトリ直下のsegments というテキストファイルを用いて、長い音声ファイルをセグメント分割します。（この処理はリポジトリの指示に記載されていないので別途実行する必要があます。）
>

の部分、記載がなさそうなので、メモ

生成された TEDxJP-10K_v1.1/wav まで移動して

```bash
cat ../segments | while read o i s e; do echo sox ./$i.16k.wav ./$o.wav trim $s =$e; done | xargs -P 16 -I {} sh -c "{}"
```

もう少し時間がかかるかなと思ったけど、わざわざパラレルにする必要なかったかも・・・
まあ、xargsの別の使い方知れたから良しとするか。
初めて知ったscpコマンド【初心者気ままに】

最近、SQLの勉強をしているのですが、ローカル環境にあるCSVファイルを、UTF-8, 改行コードをLFに変更したうえで、リモート上で作成したテーブルにプッシュする、といったことをしました。

そこで、初めてCSVファイルをリモート環境のテーブルに移すのは初めてだったので、記しておきます。

## コマンドの解説
以下のコードを考えてみましょう、
```bash
\copy nation_test from './nation.csv' WITH CSV HEADER;
```
このコードでは、**nation.csv ファイルから nation_test というテーブルにデータをインポートする操作を行っています。**

## コマンドの動作
### ```\copy```: ###
psql クライアントのコマンドで、CSVファイルとテーブル間でデータのインポートやエクスポートを行います。```COPY``` コマンドと異なり、psql クライアント側で実行されるため、ローカルファイルへのアクセスが可能です。

### ```nation_test```: ###
データを挿入するテーブル名です。この場合、```nation_test``` テーブルにデータがインポートされます。

### ```from './nation.csv'```: ###
インポートするデータが含まれるファイルのパスです。この例では、カレントディレクトリ (```./```) にある ```nation.csv``` ファイルを指定しています。

### ```WITH CSV HEADER```: ### 
ファイルの形式を指定しています。
#### ```CSV```: 
ファイルがCSV形式であることを示します。
#### ```HEADER```: 
ファイルの最初の行が列名を含んでいることを指定しています。このため、最初の行はデータとして扱われず、列名として解釈されます。
CloudWatch Logs Insigt 自動パターン検出を使ってみた

# はじめに
11/1に目黒で開催された「AWS 秋のObservability祭り 2024」に参加しました。
とても学びの多いイベントでした。
ただ、これまでいろいろとイベントや勉強会に参加してきたものの、学ぶことが多過ぎてどんどん忘れてしまうので、アウトプットして記録を残していこうと思いました。

イベントではCloudWatch Logs Anomaly Detectionが紹介されていました。
今回は、CloudWatch Logs Anomaly Detectionの紹介の中で気になった CloudWatch Logsの自動パターン検出とQuery generatorについてまずは書きます。
（CloudWatch Logs Anomaly Detectionは追って試していきます）

# CloudWatch Logs 自動パターン検出
CloudWatch Logs Anomaly Detectionでログの異常検出をするのにあたっては、ロググループ内のイベントのパターン数が少ないとうまく検出できるとのこと（指標は300パターン以下）。

どうやってパターンを調べるのだろうかと思ったら、CloudWatch Logs Insightのクエリで準備されていました。

 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-Pattern.html


# 使ってみた
それでは、CloudWatch Logs Insigtで自動パターン検出をお試ししていきます。

CloudWatchのページでログのインサイトを選択
![cloudwatch01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/b57245aa-fe20-5824-d127-9c8aab5b25bf.png)

・ログのインサイトの画面で分析したいロググループを選択
・以下のクエリを入力
```pattern @message```
・クエリの実行をクリック
![cloudwatch02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/accffd59-bf4a-b7bc-c724-fb400dcd588a.png)
　
 
以上の操作だけでパターンの検出ができます。
※いつも使うログタブではなく、パターンタブを選択する必要があります

今回のお試しではパターンは1つだけでした。
![cloudwatch03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/6643f842-f187-881a-a563-72039e2eb37a.png)

パターン列のToken-Nをクリックすると、具体的な内容が確認できます。
以下の例はToken-4を選択したものです。

ログ内のHTTPメソッドの部分でした。
POST 63%、GET 37% といった比率まで見えました。
![cloudwatch04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/1ba950a9-900f-6929-22c0-a700e156956a.png)

その他、Token-5ではエンドポイントのパターン分析がされていました。
いろいろ使えそうです。

# CloudWatch Logs Insight の Query generator も使えそう
今回の操作を実施していて、クエリを入力するエリアの下にあるQuery generatorも気になって使ってみました。
プロンプト欄に抽出したい内容を記載して、新しいクエリをクリックするとクエリのエリアにクエリが生成されました。

”ERROR”を含むログを抽出。
5分間隔で発生回数を集約してカウント。
タイムスタンプの降順でソートして表示。
※英語で書かないと怒られましたので、Google翻訳で英語に翻訳したものを貼り付けました。

正直、Insigt用のクエリを覚えるのが億劫と感じていたのですが、これは便利だと思います。
![cloudwatch05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/27b5dbf7-3b55-26bf-92bf-666bdfcd1e97.png)

クエリの実行結果がこちら。うまく抽出できました。
![cloudwatch06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/6b8b57bb-c847-6792-1815-52c88d95dca3.png)

以上、今回はCloudWatch Logs Insigt の自動パターン検出をお試ししてみました。
【nkfコマンド】エンコーディングで時々見る、-w -sLu,と-wLuの違い

最近、SQLの勉強をしているのですが、ローカル環境にあるCSVファイルを、UTF-8, 改行コードをLFに変更したうえで、リモート上で作成したテーブルにプッシュする、といったことをしました。

その際、```cmd```にて、エンコーディングを設定するのは初めてでした。```-w```や```Lu```など初めて見る表記方法が出てきたので、記しておきます。

今回、2つの例を記しているので、皆さんもコードを見てそれぞれが何を意味しているのか考えてみてください。

※ nation.csvというcsvファイルを例にしています。

## 例１

```bash
$ nkf --overwrite -w -sLu nation.csv
```
```-s``` オプションが含まれているため、入力ファイル（```nation.csv```）を Shift_JISとして解釈 し、出力をUTF-8に変換します。
このコマンドは、**「Shift_JISからUTF-8へ変換」＋「改行コードをLFに変更」** を行います。

## 例２
```bash
$ nkf --overwrite -wLu nation.csv
```
```-s``` オプションが含まれていないため、入力エンコーディングを特に指定していません。nkf は自動的に入力ファイルのエンコーディングを推測し、UTF-8に変換します。
これは **「自動認識されたエンコーディングからUTF-8に変換」＋「改行コードをLFに変更」** を行います。
コミュニケーションにおける質問意図の重要性について

# はじめに

社会に出て最初の数年は「**質問をする側**」として多くの学びを得る期間でした。しかし、経験を積むにつれて「**質問を受ける側**」になることが増え、自分が質問される立場で感じたのは、**質問意図の明確さがコミュニケーションの質を大きく左右する**ということです。  

特にIT分野では、Slackのようなチャットツールが主流です。非対面のため、文脈や表情が伝わらず、質問意図を伝える難しさが目立ちます。 

質問意図を含めることは、回答を得るまでのやり取りを効率化するだけでなく、相手に余計な負担をかけず、スムーズなコミュニケーションを実現するために重要です。  

この記事では、質問意図を含めることの重要性とその具体的な方法についてまとめてみました。

## 質問意図を含めることのメリット:

### コミュニケーションコストの減少
まず、「コミュニケーションコスト」とは、**情報伝達や意思疎通にかかる時間や労力、精神的な負担**を指します。これは**ビジネス効率に直結する重要な要素**です。コミュニケーションコストが高いと、生産性が低下し、非効率な業務が発生する原因となります。

質問意図を含めることで、以下のメリットがあります。

- **回答者が答えやすくなる:** 質問の背景が明確になり、回答にかかる時間が短縮されます。  
- **質問者の効率向上:** 迅速な回答が得られるため、業務をスムーズに進められます。  
- **プラスアルファの回答を得られる:** 質問意図が明確だと、期待以上の有益な情報が付加されることがあります。


## 質問意図を含めた質問の例

以下は、質問意図を含めることでどのように質問が変わるかの例です。

### 質問意図が不明な質問
> 「〇〇ファイルの〇〇実装ですが、エラーで動かないんですけど、何が問題でしょうか？」

![質問意図重要さ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/2768591c-ae61-d041-3177-bbe7b70ff635.png)


回答者は「どんなエラーが出ているのか」「どのような状況で発生したのか」などを質問し返す必要があり、コミュニケーションが冗長になります。

### 質問意図を含めた質問
>「以下のコードでAPIからデータを取得しようとしていますが、タイムアウトエラーが発生します。ネットワークの問題かAPIの設定に問題があるのか分からず困っています。このエラーを解決するためにどの部分を確認すべきかアドバイスをいただけますか？」 

この質問では、状況の背景やエラー内容が示されています。これにより、回答者はすぐに適切なアドバイスを提供できます。

## 質問意図を伝える工夫

1. **背景を簡潔に説明する:** 質問がどのような文脈で発生したのかを共有します。  
2. **仮説や試した内容を含める:** 自分で考えた仮説や試行錯誤した結果を共有すると、重複した回答を避けられます。  
3. **具体的なゴールを示す:** 「最終的に何を知りたいのか」「どのような結果を目指しているのか」を明示します。  

例:  
「〇〇の設定を変更しようとしていますが、エラーが発生しています。公式ドキュメントを確認し、以下の方法を試しましたが解決できませんでした。他に試すべき方法があれば教えていただけますか？」

## まとめ  
今回の記事では、質問意図を伝えるメリットやその具体例を解説しました。  

時々、質問意図を明確にしないまま質問をする人を見かけることがあります。しかし、そうした質問に対して質問意図の大事さを指摘をしてくれる人は少ないのが現状です。  
そのため、自分自身が意識的に「相手にとって負担の少ない質問」を心がけることで、コミュニケーション全体が円滑になり、仕事の効率化につながります。

相手の立場に立ち、思いやりのある質問と回答を心がけながら、効率的な仕事を進めていきましょう！
Python開発: VSCodeでJupyter Notebookを利用する方法

# はじめに
## Jupyter Notebookとは
**Jupyter Notebook**は、MarkdownテキストとPythonコードを対話的にコードを実行・再実行して結果を即座に確認することができ、データサイエンティストや機械学習エンジニア、プログラマーなど、さまざまなバックグラウンドを持つ人々にとって非常に役立つツールです。

## 活用例
- データの探索的分析や可視化
- 機械学習モデルのプロトタイピングと実験
- コード教育
- ExcelやCSVのデータ操作、スクレイピングなど

## Jupyter Notebookを使用するメリット

- 実行環境を作るのが簡単
- セル単位で即座に実行・再実行できるため特定の処理や計算を試すのに効率が良い
- `%time`や`%memit`などのマジックコマンドで、処理の実行時間やメモリ使用量など様々なメトリクスや情報を簡単に確認できる
- Markdown のドキュメンテーションとコードの一体化
コードとその解説やドキュメントを同じファイルにまとめることができ、コードの理解や共有が容易になります。特に、データ分析の結果や機械学習モデルの解釈を他の人と共有, 説明する場合に有用です。
- 無償（フリーソフトウェア）

## 実行環境設定

### VSCodeの拡張機能からJupyterをインストール
VSCodeサイドバーの拡張機能から「**jupyter**」を検索しMicrosoftが提供しているJupyterをダウンロードする。

![拡張機能Jupyterのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/6c2eeb3d-f727-d20b-e6dc-4b4ca14aaecc.png)


### カーネルの選択
拡張子が`.ipynb`のファイルを作成後(今回はsample.ipynbを作成)に、
カーネルを選択 -> Python環境 -> Python環境の作成 -> Venv -> お使いのPCにPythonインストール済みのPythonインタープリターを選択

![カーネル選択.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/dbbdf18e-495a-5a24-425f-39cc1265658a.gif)

これでVSCode上でのJupyter Notebookを使用できる環境が出来ました。

## 実際に使ってみる
今回は[e-Statが提供している年齢（５歳階級），男女別人口－全国（大正９年～平成 27 年）](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tclass1=000001094741&stat_infid=000031524030&tclass2val=0)の国勢調査CSVデータをPandasで読み取るコードを書いてみます。

#### ライブラリのインストール方法
ライブラリのインストールはセル内に`%pip install [ライブラリ名]`で実行するとインストールが開始できます。

**※ コードの実行はShift + Enter**

![jupyter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/ad942792-fd49-b5e1-6057-ed81d0795f4f.png)


pandasでCSVデータを読み取り簡単に絞り込む対話的にコードを実行、結果を確認できている！

![jupyter3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/dd5f7988-83c9-fa80-ade1-1dd845eb93e8.png)


## 最後に
いかがだったでしょうか。今回は開発時に便利だな〜と思った**Jupyter Notebook**を**VSCode**上で利用する記事を書いてみました。
今後も便利なものを紹介していきたいと思います！ご覧いただきありがとうございました！
【Unity】すり抜けるオブジェクト


地図で歩ける範囲を制限するため、BoxCollidorでマップを囲ったのですが、うまくいきませんでした。
調べてみると、Collision Detectionを変えればうまくいくよ！という記事を見つけたのですが、これはうまくいきませんでした。
（いずれも判定の速度が上がり、すり抜け頻度が下がるだけで、すり抜けてしまう。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/a580680c-bd4a-2c94-1d75-697a2e833ddf.png)

そのため、キャラクターの移動処理のほうで、座標を見て、歩ける範囲を限定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/9e401c63-4796-c302-65ca-fe3ab20e9435.png)
python1年生(macOSにライブラリをインストールする方法)

pythob3 -m pip install scipy
python3 -m pip install scikit-learn
python3 -m pip install matplotlib
これをターミナル上で打つと

[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: pip3 install --upgrade pip
と出てくるので

pip3 install --upgrade pip
このコマンドを実行すると、pipが最新バージョン（24.3.1）に更新されます。
アップデートをすると教科書通り実行できる。
Pythonのデータ型についてまとめてみた

# はじめに

Pythonにはいろいろなデータ型があります。どれもプログラムを書く上で欠かせないもので、それぞれ独自の使いどころがあります。
データ型をうまく使いこなせれば、効率的でわかりやすいコードが書けるようになるはずです。
この記事では、Pythonの基本的な標準型にまとめてみました。

参考:

https://docs.python.org/ja/3/library/stdtypes.html#

## 数値型(int, float, complex)
### int
整数を表すデータ型です。
他言語のようなint32やint64の指定は不要で、非常に大きな値も扱えます。
```python
x = 42
y = -7
print(type(x))  # 出力: <class 'int'>
```

### float
浮動小数点数を表すデータ型。
```python
pi = 3.14159
print(type(pi))  # 出力: <class 'float'>
```

### complex
複素数を表すデータ型で、`a + bj`の形式で表現します。
```python
z = 3 + 4j
print(type(z))  # 出力: <class 'complex'>
```

## ブーリアン型(bool)

### bool
真偽値を表すデータ型です。
```python
is_happy = True
print(type(is_happy))  # 出力: <class 'bool'>
```

## イテレータ型
イテレータは、一度に1つずつ値を取り出せる仕組みを提供します。forループでよく使われます。
イテレータの性質として一度next()で要素を取り出すと、その要素はイテレータから「消費」され、再度アクセスすることはできません。
```python
numbers = iter([1, 2, 3])
print(next(numbers))  # 出力: 1
print(next(numbers))  # 出力: 2
print(type(numbers))  # 出力: <class 'list_iterator'>
# 再びリスト全体を取得しようとしてもできない
print(list(numbers))  # 出力: [3]
```

## ジェネレータ型
`yield`キーワードを使って値を一つずつ生成するイテレータ。
ジェネレータは、計算結果を逐次生成します。
遅延評価（lazy evaluation）によりメモリ効率に優れています。
```python
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

print(type(gen))  # 出力: <class 'generator'>
```

## シーケンス型(list, tuple, range)

### list
複数の値を順序付けて格納する可変長のデータ型です。
```python
fruits = ["apple", "banana", "cherry"]
print(type(fruits))  # 出力: <class 'list'>
```

### tuple
リストに似ていますが、要素が変更できない（イミュータブル）データ型です。
```python
coordinates = (10, 20)
print(type(coordinates))  # 出力: <class 'tuple'>
```

### range
整数の範囲を表すイミュータブルなデータ型です。
```python
r = range(5)
print(type(r))  # 出力: <class 'range'>
```

## テキストシーケンス型(str)

### str
テキスト型で、Unicodeをサポート。
```python
text = "Hello, World!"
print(type(text))  # 出力: <class 'str'>
```

## バイナリシーケンス型(bytes, bytearray, memoryview)

### bytes
バイト列を表すデータ型です（変更不可）。
```python
b = b"hello"
# b[0] = 72 変更不可のため変更しようとするとTypeErrorがRaiseされる
print(type(b))  # 出力: <class 'bytes'>
```

### bytearray
バイト列を表しますが、変更可能です。
```python
ba = bytearray(b"hello")
ba[0] = 72  # 変更可能
print(type(ba))  # 出力: <class 'bytearray'>
```

### memoryview
バイトデータへのビューを作成します。
```python
mv = memoryview(b"hello")
print(mv[0])  # 出力: 104 (ASCIIコードが出力される)
print(type(mv))  # 出力: <class 'memoryview'>
```

## 集合型(set, frozenset)

### set
一意の要素を順序なしで保持するデータ型です。
```python
numbers = {1, 2, 3, 3}
print(type(numbers))  # 出力: <class 'set'>
```

### frozenset
`set`と同様ですが、変更できない（イミュータブル）データ型です。
```python
fs = frozenset([1, 2, 3])
print(type(fs))  # 出力: <class 'frozenset'>
```

## マッピング型(dict)
キーと値のペアを保持するデータ型です。
```python
person = {"name": "Alice", "age": 25}
print(type(person))  # 出力: <class 'dict'>
```

## 特殊型(None)

### None
値が存在しないことを表すデータ型です。
```python
x = None
print(type(x))  # 出力: <class 'NoneType'>
```

# まとめ
今回はPythonのデータ型についてまとめてみました。
実装の中で型をチェックしたり、型ヒントを記述することが度々あると思うので参考になれば嬉しいです！
LeetCodeを1日1題解いてみる (day11)

11日目に取り組んだ問題はこちら！

# 67. Add Binary

https://leetcode.com/problems/add-binary/description/

## 問題文
Given two binary strings a and b, return their sum as a binary string.


## 僕の回答

```py
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a_reversed = a[::-1]
        b_reversed = b[::-1]
        a_size = len(a_reversed)
        b_size = len(b_reversed)
        i = 0
        carry = 0
        result = []
        while i < max(a_size,b_size) or carry:
            a_disit = int(a_reversed[i]) if a_size > i else 0
            b_disit = int(b_reversed[i]) if b_size > i else 0
            total = a_disit + b_disit + carry
            carry = 0
            if total >= 2:
                carry = 1
                total %= 2
            result.insert(0,total)
            i += 1

        return ''.join(map(str,result))

```
## より効率の良い回答例
```py
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a_reversed = a[::-1]
        b_reversed = b[::-1]
        a_size = len(a_reversed)
        b_size = len(b_reversed)
        i = 0
        carry = 0
        result = []
        
        # 桁ごとに計算
        while i < max(a_size, b_size) or carry:
            a_digit = int(a_reversed[i]) if i < a_size else 0
            b_digit = int(b_reversed[i]) if i < b_size else 0
            total = a_digit + b_digit + carry
            
            # 桁の値とキャリーの更新
            carry = total // 2
            result.append(total % 2)
            i += 1

        # 結果を逆順にして文字列に変換
        return ''.join(map(str, result[::-1]))

```


## もっとも効率の良い回答例

```py
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        return bin(int(a, 2) + int(b, 2))[2:]
```

`int(a, 2)`で`a`を2進数の数字に変換する。
`bin()`で整数を２進数の文字列に変換する。
'bin()'の結果は、例えば`bin(5)`なら`0b101`のように先頭に`0b`がつくので、`[2:]`で先頭２文字を除去する。

### コメント
とても簡単に実装できることを知れた。しかし、アルゴリズムでの実装も改善点が沢山あった。
`insert()`で先頭に追加するより、`append`で末尾に追加して最後に反転する方が計算効率が良い。

### 次の問題はこちら!
https://qiita.com/h_y_s_d/items/1abb102bf97e640623ba
【超基礎】ProgateでJSを学んでこれは覚えとかなきゃなって思ったこと

## 前提
この記事はPython,C,C++がちょっとだけ書ける、読める筆者がProgateでのJS学習を通して、はえ～と思ったことをまとめたものになります。ちなみに生成AI頼りの個人開発をした際，JavaScriptを使いましたのである程度はわかっているつもりですが、自分で書かないと気づけない厳密な部分は何もわかっていないです。

記憶定着用のアウトプットに近いものになりますので、誤っている部分があれば訂正していただけると幸いです。。

https://prog-8.com/courses/es6

 ### 筆者の技術力
 - C,Python (基礎文法~ポインタ、アルゴリズムの授業、研究での使用など)
 - HTML,CSS,JS (大半を生成AIに支援してもらったため読めるが書けない)
 - C++ : (AtcoderのD問題をたまにギリギリ完答できる程度)
 - ~~React : (ハンズオン形式の教材で一度だけ学びました)~~
 
 https://qiita.com/Sicut_study/items/a27fb53468e14216d6fb

 ## JSについて新しく学んだこと
 ### 大体同じ
for文やif文、四則演算や変数の更新などはPythonやCと同じであり、ここから固有の表現等で用途が枝分かれしていくんだろうなという印象。

 ###  letとconst
宣言の際はletやconstを使い、値を変更できる"変数"として宣言するか、変更できない"定数"として宣言するかを選択する。c++の様に型の制約は厳しくないが、変数か定数どちらとして扱うかを明示的にする必要がある。ちなみにc++ではconst修飾子を使い変数を書き換えないようにすることができる。

### セミコロンについて
C++と同じように各行末につける。ただしなくても基本的にコードは動作するが予想外のバグを生むことがあるため、基本的には付けるようにすることが推奨される。

### 変数の命名規則
- 英単語であるべき。ローマ字は△
- 2語以上の場合は2つ目以降の単語の先頭の文字を大文字とする(キャメルケース)　
    例 : `friendName`,`isLoggedIn`など
- 先頭の文字が数字だとエラー

### 真偽値
Pythonだと`True`/`False`の真偽値が`true`/`false`になる。先頭が小文字。
（この様な、各言語間の細かい文法の違いを比較、変換できるサービスがあればなと思いました。まあChatgptでもいいんですけどね)

### 厳密演算子
演算子(`==`や`!=`)と、より厳密な比較をする厳密演算子(`===`，`!==`)が存在する。
```JavaScript
const number = "46"; //numberに文字列の「46」を代入

console.log(number == 46); //true : 文字列"46"が数値の46に変換されて真となる。
console.log(number ===46); //false : 型についても厳密に等しいかを比較するため偽となる。
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality

### オブジェクトという概念
- CやC++における構造体の様なもの。構造体より柔軟性に富む。
- 下記コードのようにオブジェクトの中にオブジェクトを含めることもできる。
- よく目にするJSONはこれをテキストにしてデータのやりとりに使用されるものである。
- nameやgenderはプロパティと呼ばれ、各プロパティに対応する値が格納されている。
- オブジェクト名.プロパティ名で各値を取り出せる
```JavaScript
const student = {
    name: "Taro",      
    gender: "Male",
    favorite: {
        animals: "cat", 
        food: "coke"    
    }
};

//値の取り出し方
console.log(student.name); //"Taro"
console.log(student.favorite.animals); //"cat"
```

### undefined
直訳すると未定義。配列の存在しないインデックスや、オブジェクトの存在しないプロパティにアクセスすると返ってくる。

### constと配列、オブジェクト
constで定数として宣言した配列やオブジェクトについて、再代入はできないが、中身の変更は可能である。

「宣言」とはメモリアドレスの割り当てを行う行為であるため、一度宣言されたものについて、再代入を行うと新たにメモリアドレスが割り当てられることになるが、これはconstでは許されていないため出来ない。

逆に既に割り当てられたメモリアドレスに存在する配列、オブジェクトについてその中身を変更する行為は、**宣言時に割り当てられたアドレスを参照してその内容を変更する**ため特に問題はない。

言い換えると**constで宣言された定数はメモリアドレスの再割り当てができない**ということである。

https://qiita.com/NoobieGull/items/11d8c2bdcd82a01e8146
```JavaScript:配列
const number = [1,2,3];

//NG
number = [4,5,6]; // Error
//OK
number[0] = 4; // [4,2,3]
```
```JavaScript:オブジェクト
const friend = {name : "Sota" , gender : "Male"};

//NG
friend = {name : "Hanako" , gender : "Female" }; //Error
//OK
friend.name = Kumi;
```
## まとめ
受講したコースは初歩の初歩、超基礎コースでしたが、意外と新しい知識が多かったです。やはり初学者が何もわからないまま生成AI頼りの開発をすると抜ける知識が多く、"なぜか動いてしまう"ものが爆誕してしまうのだなと痛感しました。😿
【React】RechartsのPieChartでラベルを付与したり色を変えたりしてみる

## 概要
グラフを描画できるライブラリRechartsの機能で、いわゆる円グラフを生成できるのがPieChartです。PieChartでラベルを付与したり、データごとに色を変えたりしてみましたのでそのメモ書きです。完成イメージは以下のような感じです。

![スクリーンショット 2024-11-10 0.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/46b195fa-2cac-317f-195f-3e5a19880cd3.png)

## 前提
* 使用したRechartsのバージョンは`2.13.3`です。

## 対応方針など
* データごとのラベルを付与したり色を変えたりする実装は[PieChartWithCustomizedLabel](https://recharts.org/en-US/examples/PieChartWithCustomizedLabel)が参考になります。色は`Cell`のタグを設定し、ラベルの設定は`label`プロパティにrenderの関数を設定することで実現できます。
* 真ん中にテキストを入れる実装は[Label in center of PieChart](https://github.com/recharts/recharts/issues/191)のissueが参考になります。`text`タグを別途設定して、真ん中に来るように位置調整します。真ん中を空洞にするには`innerRadius`を設定します。


## 実装サンプル
以下が実装のサンプルです。

```sample.tsx
import { Cell, Pie, PieChart, Tooltip } from "recharts";

const data01 = [
  {
    name: "Group A",
    value: 400,
    color: "aqua",
  },
  {
    name: "Group B",
    value: 300,
    color: "green",
  },
  {
    name: "Group C",
    value: 300,
    color: "red",
  },
  {
    name: "Group D",
    value: 200,
    color: "yellow",
  },
  {
    name: "Group E",
    value: 290,
    color: "orange",
  },
  {
    name: "Group F",
    value: 189,
    color: "gray",
  },
];

type PiChartsLabelType = {
  cx: number;
  cy: number;
  midAngle: number;
  innerRadius: number;
  outerRadius: number;
  percent: number;
  index: number;
};

const RADIAN = Math.PI / 180;

export default function Home() {
  const renderCustomizedLabel = ({
    cx,
    cy,
    midAngle,
    innerRadius,
    outerRadius,
    percent,
    index,
  }: PiChartsLabelType) => {
    // データのラベルを表示する箇所を位置調整する
    const radius = innerRadius + (outerRadius - innerRadius) * 0.5;
    const x = cx + radius * Math.cos(-midAngle * RADIAN);
    const y = cy + radius * Math.sin(-midAngle * RADIAN);

    return (
      <text
        x={x < cx ? x + 20 : x - 10}
        y={y < cy ? y : y + 10}
        fill="black"
        textAnchor={x > cx ? "start" : "end"}
        dominantBaseline="central"
      >
        {data01[index].name}
      </text>
    );
  };

  return (
    <div>
      <PieChart width={900} height={300}>
        <Pie
          data={data01}
          cx="50%"
          cy="50%"
          dataKey="value"
          outerRadius={130}
          innerRadius={70}
          labelLine={false}
          label={renderCustomizedLabel}
        >
          {data01.map((entry, index) => (
            <Cell key={`cell-${index}`} fill={entry.color} />
          ))}
        </Pie>
        <text x={450} y={150} textAnchor="middle" dominantBaseline="middle">
          真ん中のテキスト
        </text>
        <Tooltip />
      </PieChart>
    </div>
  );
}
```
並列プログラミング１　openMP

# はじめに
ご覧いただきありがとうございます。
このページは私が取り組んでいる研究で用いている並列処理のアウトプットとして
まとめさせていただきます。

今回はopenMPの使い方をまとめていきたいともいます。

# openMP
OpenMP(Open Multi-Processing)とは共有メモリ型マシンで並列プログラミングを可能にする API
であり,Architecture Review Board（ARB）によって規定されている業界標準規格です。共有メモリ型並列計算機用のプログラムの並列化を記述するための指示文、ライブラリ関
数、環境変数などが規定されています.

# openMPの特徴
並列プログラム（マルチスレッドプログラム）が簡単かつ短いコード量で記述できる。
・異なるシステム間でソースプログラムを共通化できるので移植性が高い。
・逐次プログラムから段階的に並列化していくことが可能である。
・同一のソースプログラムで並列環境と非並列環境を共存できる。
・コンパイラの自動並列化機能に比べてプログラムの高速化を達成し易い。

# 動作環境

M1 apple cilicon
gcc

# 使用言語
c言語
## コンパイル方法
コンパイル時には** -fopenmp**オプションをつけてコンパイルします。
test.cをコンパイルする場合
```
gcc test.c -fopenmp
```
-oを用いる場合
```
gcc test.c -o test -fopenmp
```
# 実行方法
test.cをコンパイルして実行ファイルtestを作成した場合
```
./test
```

# プログラム
openMP第１回目は基本的なコードを
## 並列化1

```
#include<stdio.h>
#include<omp.h>

int main(){
#pragma omp parallel
  {
    printf("Hello world\n");
  }
  return 0;
}
```
出力
```
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world

```
解説
Hellow worldを出力する処理をコア数ぶん実行する並列化プログラム
私の使用しているPCは10コアなので10回出力されています。

macbookでは以下のコマンドで物理コア数を確認できます。
```
#ターミナルでCPU 物理コア数を確認するコマンド
sysctl -n hw.physicalcpu_max

#出力
10
```
## 並列化２
for文の並列化
繰り返しの処理を並列化させます。
```
#include<stdio.h>
#include<omp.h>

int main(){
  int n=100,sum;
  #pragma omp prallel for
  {
    for(int i=0; i<=n;i++){
      sum+=i;
    }
    printf("結果 %d\n",sum);

     }
   return 0;
}


```
出力
```
結果 1497928635
```
解説
このプログラムは1から100までの和を計算するプログラムです。
1から100までの和は5050ですが出力は1497928635

答えが異なる理由
ランダムにsumに書き込んでしまっているため答えが誤っています。


## private節
コアごとの初期化を防ぐ

## reduction節
たし込み操作、集約の時に使う。

正しいプログラム
```
#include <stdio.h>
#include <omp.h>

int main() {
    int sum = 0;
    int i;

    #pragma omp parallel for private(i) reduction(+:sum)
    for (i = 0; i <= 100; i++) {
        sum += i;
    }

    printf("結果: %d\n", sum);

    return 0;
}
```
出力
```
結果: 5050
```

# 最後に
今回はopenMPの簡単な使い方を大雑把に解説しました。
次回はredction節とprivate句の詳しい使い方についてまとめて行きます。
Contextのメモ

DoroidKaigi2024年で発表された「Contextを理解する」の内容を復習をかねてアウトプットする。

### コンテキスト(Context)とは
アプリがアプリ内外の色々な情報や機能を取得、利用するための窓口


- 文字列リソースへアクセスする場合
端末の使用言語を取得することができ、それに合わせた文字列を返すことができる。

- 通知の作成＆表示を行う場合
Cotextを使用してNotificationManagerにアクセスして通知チャンネルや通知の表示を行える。
通知を作成する際に必要なリソースを取得するために使用される。


### Contextの種類と使いわけ
Contextを継承しているクラスはたくさんあるけれど2つだけメモする
- ActivityContext:
    - Activityのライフサイクルに依存
    - Activityの情報が必要な処理Activityの起動、テーマに紐づいたUIの表示

- ApplicationContext:
  - Workerを利用した通知処理
  - データベースへのアクセス

間違ったContextを指定するとエラーになったり想定通りの動作をしないので、その状況や用途に合った適切なContextを選択する

#### 参考
https://2024.droidkaigi.jp/timetable/694464/
Pythonのyieldわからないを解消してみる

# はじめに
Pythonには、関数の中で値を一度に全て返すのではなく、1つずつ「遅延して」返すためのキーワードとして`yield`があります。
`yield`を使うことで、**ジェネレータ**という特殊な種類の反復可能なオブジェクトを作成できます。

本記事では、以下を解説します
1. ジェネレーターの基本的な仕組み
2. メモリ効率の良さをCSV読み込みで比較検証

## `yield`とは？
通常の関数では、returnを使って値を返します。一方、yieldを使うと関数は値を「生成」し、その時点での状態を保存し、このような関数はジェネレータ関数と呼びます。
ジェネレータ関数は以下の特徴を持ちます
1. 一度に全ての値を計算しない（メモリ効率が良い）
2. 値を1つずつ取り出せる
3. 実行途中の状態を覚えていて、次回呼び出すと中断した場所から再開します

## 基本的な例

yieldを使用しない場合とyieldを使った実装を比較してみます。
### yieldを使用しない場合
```python
def get_numbers():
    return [1, 2, 3, 4, 5]

numbers = get_numbers()
for num in numbers:
    print(num)
```

### yieldを使ったジェネレータ関数
```python
def generate_numbers():
    for i in range(1, 6):
        yield i

numbers = generate_numbers()  # ジェネレータオブジェクトを作成
for num in numbers:  # yieldを呼び出し
    print(num)
```

## 実行の流れ
`yield`は関数を一時停止し、次に呼び出されたときに中断した場所から再開します。
1. 最初に関数を呼び出しても、実行は開始されません（ジェネレータオブジェクトを作成するだけ）
2. forループやnext()で値を取得するたびにyieldが呼び出されます
3. 最後の値を返した後、ジェネレータはStopIteration例外を発生させて終了します

```python
def simple_generator():
    print("開始")
    yield 1
    print("中間地点")
    yield 2
    print("終了")
    
gen = simple_generator()
print(next(gen))  # 開始, 1
print(next(gen))  # 中間地点, 2
print(next(gen))  # 終了, StopIteration例外
```

## 実際にメモリ効率が良いのか調べてみた

ジェネレータのメモリ効率を、5万行のデータが記載されたCSVファイルを処理する例で比較します。

### ジェネレーターを使用した場合のサンプルコード

```python
import csv
import os
import psutil

def memory_usage():
    """現在のプロセスのメモリ使用量をMB単位で返す"""
    process = psutil.Process(os.getpid())
    mem = process.memory_info().rss / 1024 / 1024  # MBに変換
    return mem

def read_large_csv(file_path):
    """CSVファイルを1行ずつ読み込むジェネレーター"""
    with open(file_path, mode='r', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            yield row  # 1行ずつ返す

# メモリ使用量を測定
print("ジェネレーターを生成前のメモリ使用量: {:.2f} MB".format(memory_usage()))
large_generator = read_large_csv("サンプル.csv")
print(next(large_generator))  # 1行目を取得
print(next(large_generator))  # 2行目を取得
print("ジェネレーターを生成後のメモリ使用量: {:.2f} MB".format(memory_usage()))
```

### リストを使用した場合のサンプルコード

```python
def read_large_csv(file_path):
    """CSVファイルをリストで読み込む"""
    with open(file_path, mode='r', encoding='utf-8') as f:
        reader = csv.reader(f)
        rows = list(reader)  # 全データをリストにロード
    return rows

# メモリ使用量を測定
print("リストを生成前のメモリ使用量: {:.2f} MB".format(memory_usage()))
large_list = read_large_csv("サンプル.csv")
print(large_list[0])  # 1行目を取得
print(large_list[1])  # 2行目を取得
print("リストを生成後のメモリ使用量: {:.2f} MB".format(memory_usage()))
```


## 結果

![スクリーンショット 2024-12-11 6.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/2272cdcb-1c30-86cd-6c54-474f4753a95f.png)

| **処理方法**         | **生成前のメモリ使用量** | **生成後のメモリ使用量** |
|----------------------|------------------------|------------------------|
| **ジェネレータ**     | 約27 MB               | 約28 MB                |
| **リスト**            | 約25 MB               | 約474 MB               |

ジェネレータすごい！

## まとめ
今回は**ジェネレータ**についてまとめてみました。
大量データを扱う時には、ぜひ**yield**を活用した**ジェネレータ**を試してみてください！
GitHub ActionsでDockerコンテナを自動ビルドし、ECRにデプロイする方法

## 始めに
バックエンドのプログラムをdocker buildし、コンテナをECRにアップロードする作業を、これまではコードの変更があるたびに手動で行っていました。GitHub Actionsを使って自動化することで作業を効率化できるのではないかと考え、実装してみたところ、まとまった情報が少なかったため、この記事に手順をまとめました。同じことを試みようとしている方に参考にしていただければと思います。

## AWS認証情報の設定
まず、GitHubからAWSを操作するには、認証情報（Credential）を設定する必要があります。方法としては以下の2通りがあります：
- IAMユーザーの固定キーを使用する方法
- IDプロバイダーを用いて一時的な認証情報を付与するIAMロールを使用する方法
セキュリティの観点から、今回は後者の方法を選択しました。以下の記事を参考にして、IDプロバイダーを用いた認証情報の設定を行いました。

https://zenn.dev/pyhrinezumi/articles/d020f6109db8c1

https://qiita.com/yh1224/items/2a8223201b48a5c41e7a

GitHubActionsのworkflowには以下の設定を追記しました。
※`your-role-arn`には自身のロールのarnを記入してください。
```
permissions:
  id-token: write
  contents: read

steps:
  - name: Configure AWS credentials
    uses: aws-actions/configure-aws-credentials@v4
    with: 
      role-to-assume: your-role-arn
      aws-region: ap-northeast-1
```

## ECRにアップロードする方法
ECRにコンテナをアップロードするためには、以下のコードをワークフローに記載します。（以下はECRプライベートリポジトリ用のコードです。パブリックリポジトリの場合は[公式ドキュメント](https://github.com/aws-actions/amazon-ecr-login?tab=readme-ov-file#login-to-amazon-ecr-private-then-build-and-push-a-docker-image:~:text=Login%20to%20Amazon%20ECR%20Public%2C%20then%20build%20and%20push%20a%20Docker%20image%3A)をご確認ください。）
※`your-ecr-repo`には自身のリポジトリ名を記載してください。
```
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Build, tag, and push docker image to Amazon ECR
        env:
          REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          REPOSITORY: your-ecr-repo
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
          docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
```
参考：

https://github.com/aws-actions/amazon-ecr-login?tab=readme-ov-file#login-to-amazon-ecr-private-then-build-and-push-a-docker-image:~:text=Login%20to%20Amazon%20ECR%20Private%2C%20then%20build%20and%20push%20a%20Docker%20image

## 最終的なコード
以下が最終的なworkflowのコードです。

```
name: Docker Image CI

on:
  push:
    branches: [ "main" ]
permissions:
  id-token: write
  contents: read

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout repo
      uses: actions/checkout@v3

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with: 
        role-to-assume: your-role-arn
        aws-region: ap-northeast-1

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v2

    - name: Build, tag, and push Docker image to Amazon ECR
      env:
        REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        REPOSITORY: your-ecr-repo
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
        docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
```

# 最後に
今回、GitHub Actionsを初めて使用しました。これまで手動で行っていた作業が自動化され、とても効率的になったことに感動しています。今後もGitHub Actionsは活用していきたいと思います。
Deviseを使ってログアウトボタンが押せなかった話

## はじめに
今回は、Railsで認証Gemをdeviseを使用したときに
ログアウトボタンを作成したときに,
**DELETE**リクエストが**GET**になっていたために
できませんでした。その時のメモを:frowning2:





## 開発環境
* Docker 27.3.1
* Ruby 3.3.6
* Rails 7.2.2
* PostgreSQL 17.2

## 解決方法
```bash:bash
$ yarn add @rails/ujs 
```
```ruby:application.js
import Rails from "@rails/ujs"; #この2行追加
Rails.start();
```
```bash:bash
$ docker compose up
$ docker compose down
```
これでログアウトボタンをDELETEでいけます。
```ruby:例)ログアウト link_to
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete, data: { turbo: false } %>
```

## Turboについて
Rails7以降で*Turbo*が使用され*Turbo*はフォームやリンクを AJAX 的に処理するため、通常のリクエストが無効化されることあります。ログアウトリンクで *Turbo* を無効にするため、次のようにdata: { turbo: false }をログアウトボタンに記載します。


## @rails/ujs が動作する仕組み

ページロード時に @rails/ujs がHTMLを監視。
data-method 属性を持つリンクがクリックされた場合、JavaScript で動的に <form> を生成し、指定されたHTTPメソッド（例：DELETE）でリクエストを送信します。
これにより、ブラウザが直接サポートしていない DELETE メソッドでもサーバーにリクエストを送ることができます

### なぜ@rails/ujsが必須なのか？
@rails/ujs を読み込まないと、data-method 属性を処理するJavaScriptが動作しないため、リンクをクリックしてもただの通常のリンク（GET リクエスト）として扱われます。
この結果、Railsのルーティングで期待されるHTTPメソッドが一致せず、エラーになります。


### 例
以下のコードで @rails/ujs がない場合の動作と、ある場合の動作を比較します。
```ruby:erb
<%= link_to "Logout", destroy_user_session_path, method: :delete %>
```
生成されるHTML
```html:html
<a rel="nofollow" data-method="delete" href="/users/sign_out">Logout</a>
```
#### @rails/ujs がない場合
ブラウザは data-method を無視。
GET /users/sign_out がサーバーに送信される。
RailsはDELETE /users/sign_outを期待しているため、エラーが発生。
#### @rails/ujs がある場合
data-method="delete" を検出。
JavaScriptが自動的に<form>を生成して DELETE リクエストを送信。
Railsは正しいHTTPメソッドを受け取るため、ログアウト処理が正常に行われる。
【HTML】脚注をつける方法

HTMLで脚注を作成するためには以下のように記述します。

```html
This is main body of my content. I have a footnote link for this line <a href="#footnote-1">[1]</a>. Then, I have some more content. Some of it is interesting and it has some footnotes as well <a href="#footnote-2">[2]</a>.

<h2>References</h2>
<ol>
    <li id="footnote-1">Here is my first footnote.</li>
    <li id="footnote-2">Another footnote.</li>
</ol>
```
小学生がまず直面する壁のために！Streamlit✖️Cursorでゲームを作ってみた！

# 概要

Cursorというエディタを利用してStreamlitでゲームを作ってみました。

うちの子はまだ、小学生ではないのですが最近の小学生はまず初めに直面する壁があるそうです。
その最初のハードルは自分の名前を自分で書けなきゃいけない！とか文字を読めなきゃいけない！
ではなく`タブレットに学校が用意したランダムなパスワードを入力できる様になること！！`
らしいです。

これって結構みんな大変なんじゃないかなーと思い、ランダムな文字列をパスワード入力のように入れてちゃんとあっているかを判定してくれるアプリを作成しました。
ゲームというよりも練習アプリという感じです。



# 利用したツール紹介
## Streamlit

Pythonで書けてHTMLとCSSを気にせずWEBアプリケーションを作成できるツール

https://streamlit.io/


## Cursor

VSCodeをベースに開発されたAIを利用できるエディタ

https://www.cursor.com/


# 作成はこんな感じ

Cursorに以下のようなスクリプを入れて実行していくだけでファイル自体も作成してくれます。

```pronpt
パスワードを練習するためにランダムな文字列を入力してそれに対して正解・不正解を表示するStreamlitのコードを新しく書いてください。
```

![Cursor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/5d9f0947-1418-3b9d-5374-57825b954b22.gif)

# アプリは無料で公開できる！

GitHubにスクリプトをPushすれば公開することもできます。
今回作成した「[Password Training](https://password-training-tanji.streamlit.app/)」というアプリも公開してあるのでぜひ使ってみてください。

https://password-training-tanji.streamlit.app/


# まとめ

思い立ってから２時間も立たずに作成、デプロイが出来てしまいました。
Streamlitの手軽さもそうですが、Cursorを利用することでファイル自体も作成してくれたりStreamlitの実行の初期セットアップまでフォローしてくれたりします。
まだまだ、CursorもStreamlitも使いこなせていないですがとっても手軽にできてとても楽しかったです！

ぜひ、お子様にタブレットで利用いただきフィードバック頂けると嬉しいです！
python パワポのテキストの特定の文字列の色を変える（ChatGPT協力)

python-pptxでパワポのテキストの特定の文字列の色を変える方法
ChatGPTに聞いたら一発だった
ちゃんとコードを見直してどうやってるのか見直さないと
考える癖なくなっちゃう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638856/d4d706d5-e1e8-0d5f-7228-df5b77271b21.png)

```ChatGPT質問.txt
python-pptx で一個のテキストボックスを作成して、指定したテキストデータを入力するものとします。

・テキストデータが複数行なら段落を分けて入力する関数
指定例
textsharp = textboxset(textsharp,textdata)

・指定したワードのフォント色を指定した色に変える関数
指定例
textsharp = setwordcolor(textsharp,word1,color1)
textsharp = setwordcolor(textsharp,word2,color2)
textsharp = setwordcolor(textsharp,word3,color3)
直列処理も可能とする

それぞれ作成してください
```

```ppt_textcolor.py
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor


def textboxset(slide, textdata, left, top, width, height):
    """
    テキストボックスを作成し、テキストデータを段落ごとに入力する。
    
    Args:
        slide: スライドオブジェクト
        textdata: テキストデータ（複数行の文字列）
        left: テキストボックスの左位置（Pt単位）
        top: テキストボックスの上位置（Pt単位）
        width: テキストボックスの幅（Pt単位）
        height: テキストボックスの高さ（Pt単位）
    
    Returns:
        text_box: 作成されたテキストボックスのオブジェクト
    """
    textbox = slide.shapes.add_textbox(left, top, width, height)
    text_frame = textbox.text_frame
    text_frame.clear()
    
    # テキストを段落ごとに分割して設定
    for line in textdata.splitlines():
        p = text_frame.add_paragraph()
        p.text = line
    
    # 最初の段落は既存の段落が利用されるため削除
    if text_frame.paragraphs[0].text == "":
        text_frame.paragraphs[0]._element.getparent().remove(text_frame.paragraphs[0]._element)
    
    return textbox


def setwordcolor(textbox, word, color):
    """
    テキストボックス内の指定ワードのフォント色を変更する。
    
    Args:
        textbox: テキストボックスオブジェクト
        word: 色を変更したい文字列
        color: 変更後の色 (RGBタプル形式: (R, G, B))
    
    Returns:
        textbox: 更新されたテキストボックス
    """
    for paragraph in textbox.text_frame.paragraphs:
        for run in paragraph.runs:
            if word in run.text:
                # ワードの位置を見つけて部分変更
                start_index = run.text.find(word)
                end_index = start_index + len(word)
                before = run.text[:start_index]
                target = run.text[start_index:end_index]
                after = run.text[end_index:]
                
                # 元の文字列を削除して、新しいフォーマットの文字列を挿入
                run.text = before
                if before:
                    run = paragraph.add_run()
                
                run.text = target
                run.font.color.rgb = RGBColor(*color)
                
                if after:
                    run = paragraph.add_run()
                    run.text = after
    return textbox


# 使用例
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# テキストデータ入力
textdata = """This is a test.
python-pptx is useful.
You can customize your slides."""

textbox = textboxset(slide, textdata, Pt(100), Pt(100), Pt(400), Pt(200))

# 指定ワードの色変更
textbox = setwordcolor(textbox, "test", (255, 0, 0))  # 赤
textbox = setwordcolor(textbox, "python-pptx", (0, 255, 0))  # 緑
textbox = setwordcolor(textbox, "slides", (0, 0, 255))  # 青

# プレゼンテーションを保存
prs.save("output.pptx")
```
Webアプリについて学ぼう(開発言語)

# 有名なWebアプリの開発言語
「食べログ」
開発言語：Ruby

https://tabelog.com/

「Google」
開発言語：C/C++、Java、JavaScript、Python、Go

https://www.google.co.jp/

プログラミング言語・フレームワークの調査しているサイトがありました。
2019年のものなので今は異なる可能性もありますが、これから学ぶ言語の参考になると思います。

[【46選】あのサービス・アプリのアーキテクチャ・プログラミング言語・フレームワークを大調査！〔2019年始版〕](https://en-ambi.com/itcontents/entry/2019/01/08/103000/)


# Webアプリ作成におすすめの言語
<strong>フロントエンドの開発</strong>
代表的な言語として「HTML」「CSS」「JavaScript」などが挙げられます。
その中でも「HTML」と「CSS」はWeb開発の基礎となる部分です。

| 言語 | 特徴 | 
|:-----------|:------------|
| HTML  | Webアプリでユーザーが直接目に触れる部分の骨組みの言語です。見出しや段落など文書の配置や、画像や動画の挿入などの組み合わせで構成されています。| 
| CSS    | HTMLで作った骨組みの見た目・デザインを整えるための言語です。文字の色や大きさ、背景などが設定可能です。| 
| JavaScript | JavaScriptは、Webページにアニメーションなどの動きをつけるための言語です。| 

<strong>バックエンドの開発</strong>
代表的な言語として「Ruby」「PHP」「Python」などが挙げられます。

| 言語 | 特徴 | 
|:-----------|:------------|
| Ruby | 日本人エンジニアが開発した言語です。日本発のプログラミング言語ということもあり、情報を仕入れやすく、ソースコードの記述量を減らせるシンプルな文法が特徴です。|
| PHP | 動的Webページを作成するために使用される言語です。Webアプリケーション全体やインタラクティブな要素を構築することができます。（WordPressでも利用）|
| Python | 統計処理やデータ分析、機械学習、AI関連のプロジェクトにも適しています。|
| Java | アプリ開発に必要なライブラリやサンプルが豊富です。OSへの依存度が低く、iOS、Androidなどで共通のプログラムを動作できるため、OSごとの制作にかかる費用や時間を抑えられます。|
| Go | GoはGoogle社からリリースされた言語です。高速性と安全性が求められるアプリ開発で用いられます。|

<strong>データーベース</strong>
代表的な言語が「SQL」が挙げられます。
| 言語 | 特徴 | 
|:-----------|:------------|
| SQL | SQLはオープンソースとして無料公開され、データの操作や定義を行うデータベース言語です。オープンソースとして無料公開されているうえ、ISOなどで標準規格として採用されており、多くの人が利用しています。

# まとめ
普段、身近なWebアプリですが、実際に作るとなったら、様々な言語を勉強しないといけないので大変そうなイメージですね。
開発をされている方々を尊敬します。

次回はモバイルアプリについて学びたいと思います。
【Markdown】脚注をつける方法


脚注をつけるには`[^1]`、`[^1]:`のように記述します。

```markdown
これは脚注のテスト[^1]です。

[^1]: これは脚注1です。
```

上記のように記述すると以下のように表示されます。

これは脚注のテスト[^1]です。

[^1]: これは脚注1です。
Javaを基礎から学ぶその1

この記事は、「[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)」の1日目の記事です。
Javaほとんど初心者です。まずはHello WorldからJavaの特徴を見ていきます。

---
## Javaとは
人気のプログラミング言語です。いろんなところで使われているようです。就活の時も割とこの言語を使う企業が多めの印象でした。
## Hello Worldを出力する
```
public class Main {
    public static void main(String[] args) {
        
        System.out.println("Hello World");

    }
}
```
私は昔からC#を使っているのですが、大体一緒でした。
参考までに、以下にC#のHello Worldを書いておきます。


```
using System;
public class Main{
  public static void main(){
    Console.WriteLine("Hello World");
  }
}
```
C#と似ていることがよくわかると思います。大きく違うのは3カ所で、using System;の有無、()の中にString[] argsが入っているかどうかとか、Hello Worldの出力の仕方が違うことくらいでしょう。ひとつづつ確認していきます。
### using System;の有無
C#では必要なものです。Javaでは、この程度では書かなくても動きます。が、書いてもエラーが出ませんでした。ただし、javaでは
```
import java.lang.*;
```
とかいうものがあるようです。
### String[] args
Stringは文字列が入るやつです。Javaではこれがないと動きません。ないまま動かそうとすると、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/56630ce2-956c-4783-ac38-5c3202fb7a10.png)
こんなエラーが出ました。
調べたところ、これはargという名前の配列のようです。実行する時この配列に入れたい文字をスペース区切りで入れられるようです。
```
public class Hello{
 public static void main(String[] args){

System.out.println(args[0]);

 }
}
```
実行時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/e5aa3293-2792-0248-6275-85b3cb27831b.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/24bc37af-c29f-253c-a9a8-099824fc1fce.png)
ちゃんとでました。
### System.out.println("Hello World");
Hello Worldはここから出力されます。一番最初のSystemは、きっと何かしらJavaのシステムを使うということでしょう。2つ目のoutは何か出力するときに使うそうです。逆に、入力するときはinを使うらしいです。
最後に、printlnで文字を出力するようです。printの後のlnには改行するといった意味があるみたいです。試しに、ただのprintを使ってみます。
```
public class Hello{
 public static void main(String[] args){
 //println
System.out.println("Hello ");
System.out.println("World");
//print
System.out.print("Hello ");
System.out.print("World");

 }
}

```
このように入力すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/762cdc91-cf7d-a5cc-68e7-b07a85813446.png)
printlnのほうは区切って表示されたのに対してprintのほうはつなげて1行で出力されました。こんな感じで、便利に使い分けることができるようです。



## まとめ
JavaはC#と似ている部分も多いが、String[] argsとか出力の仕方とか一部違うものも存在していた。また、printとprintlnを使い分けることができる。
余談ですが、Javaの環境を構築するのに結構時間がかかりました。VisualStudioCode単体だとうまく動かすことができず苦労しました。もっと簡単に導入できればいいのに...


## 参考文献

https://www.javadrive.jp/start/const/index9.html

https://oshiete.goo.ne.jp/qa/2446397.html#google_vignette
Webアプリについて学ぼう

# WEBアプリとは
正しくは「WEBアプリケーション」です。
GoogleやSafariなどのWebブラウザで操作可能なアプリケーションのことを、Webアプリと呼び、Webサーバー上で動作するため、インターネット環境さえあれば利用が可能です。

代表的なWebアプリケーションには動画再生・共有の「YouTube」、メールクライアントの「Gmail」、SNSの「X」などが挙げられます。

# Webサイトとの違い
WebサイトとWebアプリでは、「利用できる機能の幅」が異なります。

<strong>Webサイト</strong>
インターネット上にあるWebページを複数組み合わせて構成されています。
基本的な機能は文章や画像の閲覧などの一方通行（静的）な伝達であることが特徴です。

<strong>Webアプリ</strong>
コメント・メッセージの投稿や、予約、商品購入、マップの表示など、多様な機能があります。
これらの機能を活用して行う、ユーザーと情報提供者の間で双方向のコミュニケーション（動的）が特徴です。

# Webアプリの仕組み
Webアプリは、ユーザーが「フロントエンド」で要求し、「バックエンド」でその要求を処理して「データベース」から情報を抽出する仕組みです。

と言われてもよくわからないと思うので、それぞれの機能を見ていきましょう。

<strong>フロントエンド</strong>
フロントエンドは、ユーザーが直接目に触れる部分を指し、「クライアントサイド」とも呼ばれています。
ユーザーが文字を入力したり、ボタンをクリックしたり操作できる部分でもあります。
(例：「食べログ」だとお店を検索、ネット予約、口コミの投稿など)

<strong>バックエンド</strong>
バックエンドは、ユーザーが直接触れない部分を指し、「サーバーサイド」とも呼ばれています。
Webサーバーで処理する部分を担当し、ユーザーがフロントエンドで入力した情報を処理したり、ユーザーの目に見えない部分で格納してあるデータを扱います。
（例：「食べログ」だとユーザーが入力した検索キーワードに基づき、該当するお店を検索結果として表示、見たお店を閲覧履歴として保存）

<strong>データベース</strong>
データーベースは膨大なデータを管理・保存し、バックエンドでの処理に応じてデータ抽出が可能です。
ユーザーの検索要求に応じて、保存されたデータから適切なものを検索結果として返します。
（例：「食べログ」だとお店の情報や予約のデーターを管理・保存している場所）

https://tabelog.com/

# Webアプリの開発手順
<strong>stap1.作成したいアプリ内容を決める</strong>
作成したいアプリの内容を決めます。
内容が曖昧だと作業の進捗に遅れが生じるので、アプリ内容の決定がとても大事です。

<strong>stap2.開発言語とフレームワークを選択</strong>
作りたいアプリが定まったら、開発言語とフレームワークを選択します。
開発言語にはそれぞれ特徴があり、作りたいアプリ内容に沿って決める必要があります。
また、アプリケーションを開発する際の土台として機能させるソフトウェアのフレームワーク（Angular、Vue、Reactなど）を利用すれば、簡略化したコードでスピーディーに開発できます。

<strong>Stap3.開発環境を作る</strong>
開発言語やフレームワークのインストールを完了させ開発環境を整えます。

<strong>Stap4.Webアプリを開発する</strong>
stap1.で決めた、作成したいアプリを開発していきます。

<strong>Stap4.完成したWebアプリを公開し動作確認する</strong>
完成したアプリをインターネット上に公開し、第三者のユーザー視点でのチェックをしてもらいましょう。

# まとめ
Webアプリの仕組みを知ったら、``ユーザーが「フロントエンド」で要求し、「バックエンド」でその要求を処理して「データベース」から情報を抽出する``というのに納得ですね。

次回はWebアプリの開発でどのような言語が使用されているのか調べてみたいと思います。