OmniAICreator/Qiita-1.07M huggingface dataset:
【Geopandas】国土交通省の鉄道データを解析する

# はじめに
友人たちとの新宿集まりが千葉県民には遠い...
そこで、鉄道データの解析に着手しました。国土地理院のオープンデータを活用し、全員の最寄駅から等距離の駅を探すために、GeoPandasの学習を進めています。

現在、中間駅の最適な算出方法はまだ見つかっていませんが、しばらく時間が取れなくなりそうなので一旦途中経過を共有させていただきます。

また、紹介するコードは以下のサイトを参考にさせていただきました。

https://qiita.com/c60evaporator/items/ac6a6d66a20520f129e6#%E5%87%A6%E7%90%861%E5%BA%A7%E6%A8%99%E5%A4%89%E6%8F%9B

# 本記事からわかること
- gisデータの簡単な扱い方がわかる
- 駅と路線を日本地図上に描画することができる。

# 環境
- google colab

今回使ったデータ

https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v3_1.html


## ライブラリインストール

    !pip install -U japanmap

## インポート

    import geopandas as gpd
    import matplotlib.pyplot as plt
    from shapely.geometry import Point, Polygon
    from japanmap import pref_names, get_data, pref_points
    

## shpファイルを読み込む
あらかじめ、国土交通省の鉄道データをダウンロードしてください。
国土交通省の鉄道データをどこに配置するかや各ファイルをどのように管理するかはお任せします。

```
root_dir_path = {YOUR_DEVELOPEMENT_PATH}

# 入力ファイル
# 対象のshpファイルはエンコードがshiftjisの物を使用
LINESECTION_PATH = f"{root_dir_path}/linesection_geodata_shiftjis/N02-22_RailroadSection.shp"
STATION_PATH = f"{root_dir_path}/station_geodata_shiftjis/N02-22_Station.shp"
    
# shpファイル読込
gdf_linesection = gpd.read_file(LINESECTION_PATH, encoding="cp932")
gdf_station = gpd.read_file(STATION_PATH, encoding="cp932")

```

取得したデータはこんな感じ

- 路線データ
```
gdf_linesection.head()
```
![スクリーンショット 2023-11-02 17.37.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694345/c438c6c2-781c-ec45-4b8d-06b9c2cbac5f.png)


- 駅データ
```
gdf_station.head()
```

![スクリーンショット 2023-11-02 17.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694345/b7d6b69f-26e1-d085-f48b-53e5678d3fa1.png)



## 路線データのプロット

```
fig, ax = plt.subplots(1, 1, figsize=(8, 8))

pref_poly = [Polygon(points) for points in pref_points(get_data())]
gdf_pref = gpd.GeoDataFrame(crs = 'epsg:4612', geometry=pref_poly)
gdf_pref['prefecture'] = pref_names[1:]

gdf_pref.plot(ax = ax, color = 'gray')

gdf_linesection_trans = gdf_linesection[["N02_001", "N02_003", "geometry"]]
gdf_linesection_trans = gdf_linesection_trans.rename(columns={"N02_001": "路線コード", "N02_003": "路線名"})
gdf_linesection_trans.plot(ax = ax, color = 'blue')
```

![スクリーンショット 2023-11-03 10.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694345/7ef94dbe-18e0-2523-8811-c9126997e891.png)

## 駅データのプロット

```
fig, ax = plt.subplots(1, 1, figsize=(8, 8))

pref_poly = [Polygon(points) for points in pref_points(get_data())]
gdf_pref = gpd.GeoDataFrame(crs = 'epsg:4612', geometry=pref_poly)
gdf_pref['prefecture'] = pref_names[1:]

gdf_pref.plot(ax = ax, color = 'gray')

gdf_station_trans = gdf_station[["N02_005", "N02_005g", "geometry"]]
gdf_station_trans = gdf_station_trans.rename(columns={"N02_005": "駅名", "N02_005g": "駅コード"})
gdf_station_trans.plot(ax = ax, color = 'blue')
```

![スクリーンショット 2023-11-03 10.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694345/af1f352c-e72c-d73f-2d58-48ad1de1892a.png)

# まとめ

参考サイトをもとにとりあえずデータを日本地図にプロットするところまではできました。
目標である、等距離の中間駅を算出するために全ての駅間の距離を算出できたらいいなと思ったんですが、なかなか手こずっています。

案としては、路線が通る座標から隣接する２駅の座標を特定し、その２駅間の座標から距離を算出。。。とかできたらいいなとは思っています。

今後進捗があれば更新します。
オブジェクト指向とコンポーネント指向の違い

# オブジェクト指向とコンポーネント指向の違い

ソフトウェア開発において、オブジェクト指向とコンポーネント指向は2つの重要なアーキテクチャスタイルです。それぞれ異なるアプローチを取り、プログラムの設計や保守性に影響を与えます。この記事では、オブジェクト指向とコンポーネント指向の違いについて詳しく説明します。

## オブジェクト指向

オブジェクト指向は、ソフトウェア設計のパラダイムで、システムをオブジェクトとしてモデル化します。オブジェクトはデータとそれに関連するメソッド（関数）をカプセル化したもので、それぞれが独自の状態を持ち、他のオブジェクトと相互作用します。

主な特徴として次の点が挙げられます：

- **クラスとオブジェクト**: クラスはオブジェクトの設計図であり、オブジェクトはその実体です。オブジェクトはクラスに基づいて作成され、クラスは属性（データ）とメソッド（振る舞い）を定義します。

- **カプセル化**: データとメソッドはオブジェクト内でカプセル化され、他のオブジェクトから隠蔽されています。これにより、データの隔離と安全性が向上します。

- **継承**: クラスは他のクラスから派生でき、新しいクラスを作成することができます。これにより、コードの再利用と階層構造の構築が可能です。

- **多態性**: オブジェクトは異なるクラスのメソッドを呼び出すことができ、同じメソッド名で異なる振る舞いを示すことができます。

## コンポーネント指向

コンポーネント指向は、ソフトウェアを独立した再利用可能なコンポーネントに分割し、それらを組み合わせてシステムを構築するアプローチです。コンポーネントは機能的にまとまったユニットで、他のコンポーネントと協力してシステム全体を構築します。

主な特徴として次の点が挙げられます：

- **再利用性**: コンポーネントは独立して設計および開発され、他のプロジェクトで再利用できます。これにより、開発効率が向上し、コードの重複が減少します。

- **結合度と疎結合**: コンポーネント間の結合度を最小限に抑え、疎結合性を実現します。つまり、各コンポーネントは他のコンポーネントとの依存性を最小限に抑えるように設計されます。

- **明示的なインターフェース**: 各コンポーネントは外部からの呼び出しに対する明示的なインターフェースを提供します。これにより、コンポーネント間のコミュニケーションが明確になります。

- **コンポーネントベースの開発**: システムは複数のコンポーネントから構築され、これらのコンポーネントは独立して開発およびテストされます。システムの変更は、関連するコンポーネントに影響を与えにくくなります。

## 違いの要約

オブジェクト指向とコンポーネント指向の違いは以下のようにまとめることができます：

- オブジェクト指向はオブジェクトとクラスに焦点を当て、データと振る舞いをオブジェクト内にカプセル化します。一方、コンポーネント指向はシステムを独立したコンポーネントに分割し、再利用性と疎結合性を重視します。

- オブジェクト指向はクラスとオブジェクトの継承、カプセル化、多態性などの概念を使用します。コンポーネント指向は再利用可能なコンポーネントの定義とそれらの結合を強調します。

- オブジェクト指向は、特定のオブジェクトの振る舞いを変更するためにクラスを拡張することが一般的です。コンポーネント指向は、システム全体を機能ごとに再構築せずにコンポーネントを交換または追加することが容易です。

どちらのアプローチもソフトウェア開発において重要であり、プロジェクトの性質に応じて適切なアーキテクチャを選択すること
M5StickC Plus で温湿度センサ DHT20 を使う(おそらくM5StickCやM5Stickも)

## はじめに
- VSCode と拡張機能の PlatformIO を使って実装しました
- M5StickCPlusで動作確認しています

## ライブラリ
https://github.com/multifeb13/M5StickCPlus_DHT20/tree/main

zipファイルはこちらにあります
https://github.com/multifeb13/M5StickCPlus_DHT20/releases

## ライブラリのコピー場所
### PlatformIO
プロジェクト内 lib フォルダ内に DHT20 フォルダと、その中に DHT20.cpp, DHT20.hpp をコピーしてください
![lib_path_platformIO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34605/50130980-2f48-64cf-87cb-745a785dd272.png)

## サンプルコード
```main.cpp
#include <M5StickCPlus.h>
#include <Wire.h>

#include "DHT20.hpp"

TFT_eSprite sprite(&M5.Lcd);
DHT20 dht20(32, 33);

void setup() {
  M5.begin();

  M5.Lcd.setRotation(1);
  sprite.createSprite(M5.Lcd.width(), M5.Lcd.height());
}

void loop() {
  delay(500);

  float tp;
  float hu;
  dht20.read(tp, hu);

  sprite.fillScreen(BLACK);
  sprite.drawString("T=" + String(tp) + "'C", 0, 30, 4);
  sprite.drawString("H=" + String(hu) + "%", 0, 60, 4);
  sprite.pushSprite(0, 0);
}
```

## M5StickC / M5Stack対応
M5StickC および　M5Stackの実機を持っていないのでイマジナリーなコードを書きます。
実機をお持ちの方はコメントで情報をいただけると嬉しいです

### M5StickC
1. include変更
```C
#include <M5StickCPlus.h>
```
を
```C
#include <M5StickC.h>
```
で動くのではないかと

### M5Stick
- include変更
```C
#include <M5Stack.h>
```
を
```C
#include <M5Stack.h>
```

- 初期化変更
```C
DHT20 dht20(32, 33);
```
を
```C
DHT20 dht20();
```
で動くのではないかと
Powershellでhistoryコマンドが打ちたい！！

# はじめに
Powershellのコマンド履歴をコマンドで取得したくないですか？
コマンド履歴をテストファイルとしてWindows上に保持していることはほとんどのユーザが知っていると思いますが、それだと物足りないですよね。
ということであなたのPowershellライフを豊かにしましょうs！！

# Powershellでhistoryを打つ。

### Powershellの過去の実行コマンド履歴を保持している
下記コマンドを打つ履歴を保持しているテキストのパスを取得できる。
```powershell
PS C:Users> (Get-PSReadlineOption).HistorySavePath`
C:\Users\hogehoge\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
```

## あいまい検索する

```powershell
Get-Content -Encoding UTF8 (Get-PSReadlineOption).HistorySavePath  | Where-Object {$_ -like '*git*'}
```

## 過去100コマンドを取得する

```powershell
# 最古の100コマンド取得
Get-Content -Encoding UTF8 (Get-PSReadlineOption).HistorySavePath  | select -first 100

# 最新の100コマンド取得
Get-Content -Encoding UTF8 (Get-PSReadlineOption).HistorySavePath  | select -last 100

```


## 組み合わせる
ex) gitコマンドで、最新を100個取得する
```powershell
Get-Content -Encoding UTF8 (Get-PSReadlineOption).HistorySavePath `
| Where-Object { $_ -like 'git*' } | select -first 100
```

# 最後に
あなたのPowershellライフが豊かになること間違いなし。
Powershellしか使えない制約でいかに幸せになれるかを追求していきましょう！！！！
酒田でJJY ST1

東京で使っていたJJYなNTPD ST1モジュールを酒田に持ってきて使ってみました。

プライベートネットワークアドレスが違うので、ZRouterでビルドして焼いて持ってきたのですが、設定に失敗していてVPNで東京の自宅に入って、WOLでサーバを叩き起こして、ビルドしてバイナリをダウンロードして焼直しました。

ところが東京で使っていたまったく同じ構成で動かしてみたのですが、JJYを受信しません。

福島の送信所までは東京より近いので楽勝かと思ったらそうは問屋が卸しません。

接続を外して受信モジュールだけで動かすとLEDが点滅して、受信します。

本体をつなぐとLEDが点滅しなくなります。

受信モジュールとデコーダー([JJYS](https://github.com/yamori813/JJYS))はフォトカプラーで絶縁しているのですが、どうもそれを超えるノイズがあるようです。

東京での試行錯誤のノウハウで、受信モジュールの電源は別にしてあります。

受信モジュールを[ゴミ捨て場で拾った電波時計](https://qiita.com/yamori813/items/f6ea419659212973c4f4)のもので、手巻きの大型バーアンテナにしてあるものに換えてみたのですがダメです。

いろいろ試したところMIPSモジュールのACアダプタをもともとのスイッチングな電源からトランスを使ったもに変更したところ、やっと受信できるようになりました。デジタル回路であっても、ACアダプタに影響されてる事があるようです。

![IMG_20231103_103319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d728494f-d937-f2be-9987-981a8e553cda.jpeg)

商用電源のノイズの影響なのではないかと思われます。

2024/10追記 ノイズ元はVlueStarでLANケーブルで流れてしまっているようです。ValueStarのLANケーブルを抜くと受信でき、つなぐと受信できなくなります。

あと、目の前に大きな建物があるので電波状態がよくないのかもしれません。

1秒間に一回の点滅なのでLEDの点滅でだいだいの受信状況が分かります。いろいろ試して、バーアンテナが送信所の方向ではないほうがよかったです。近隣の建物の影響かもしれません。

当初、同じ時間のclockstatsのpollの失敗が酒田21で東京0でした。

送信所からほとんど平地の250kmと山間部の200kmでは山間部の電波の減衰が大きいのかもしれません。

受信強度が弱いため、商用電源のノイズの影響が顕著にでるのかもしれません。

またバーアンテナを触ったり近づくだけでも、影響があるようです。

FreeBSDをインストールしてある、ValueStar(PenIII)の電源を入れると受信しなくなります。少し離して置いてあるのですが。

酒田の家の二階には東側と西側に部屋がありその真ん中にValueStarを置いてあります。西側の部屋に受信モジュールを置いてるとValueStarの電源ONで受信できなくなりますが、受信モジュールを東側の部屋に移したところValueStarの電源をONにしても受信できるようになりました。

酒田からおおたどや山は152度の方角にあり、思いのほか南で、バーアンテナの向きをしっかり合わせたらちょっと安定しました。

深夜帯は安定しているのですが、朝方にエラーになることがあるので、近隣のノイズの影響もあると思われます。

YBCラジオは同一周波数放送で、これは内陸方面から庄内に電波がとどきにくいため、出来ているのかもしれません。

電界強度の伝導率は山岳地帯を1とすると平野は5というデータがあり、距離の二乗に反比例するので、ざっくり酒田では東京の三分の一くらいしか電界強度がないようです。

地理院タイルで線引いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/168e2216-ea3d-a63b-ae4a-c6c7939a000a.png)

60KHzは今のところデコードできなさそうです。

JJYSは全ビットチェックしていますが、必要のないビットもあるのでエラーリカバリーのような事をすればよいのかな？

JJY ST1を始めた最初の頃も結構苦労した記憶があり、JJY ST1は難易度高いです。

いろいろ対策してみてもやっぱりエラー多いです。電波が弱いので、環境のノイズに影響されやすいのかもしれません。

```
# cd /var/db/ntp
# grep -c '0$' clockstats.20231111
50
# grep -c '1$' clockstats.20231111
1300
```

DebianをインストールしたPCを同期させてみました。Debianのntpクライアントは独自実装のようです。

```
$ sudo vi /etc/systemd/timesyncd.conf
NTP=192.168.0.51
$ systemctl restart systemd-timesyncd
$ timedatectl timesync-status
       Server: 192.168.0.51 (192.168.0.51)
Poll interval: 8min 32s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 1
    Reference: JJY
    Precision: 31us (-15)
Root distance: 11.032ms (max: 5s)
       Offset: -17.193ms
        Delay: 648us
       Jitter: 6.938ms
 Packet count: 5
    Frequency: -79.763ppm
```

PC-9801FA2をTEENのSNTPGETで合わせてみました。

![IMG_20231105_163909.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c88812ae-ad5b-8fa0-50d5-da0873300983.jpeg)

環境変数のTZを設定する必要があります。

Aptiva(FreeDOS)も合わせてみました。

![IMG_20231106_074318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/750a801d-b366-b61e-4205-48ca1b0d267c.jpeg)

追記：GPSのNTP ST1も試したところ、すこぶる安定しています。なにか特殊な事情がない限りNTP ST1はGPSを使うほうが良いと思います。(2024/5)
SIGNATE-STUDENT-CUP2023-Review

# 問題概要
SIGNATE主催の学生限定コンペ
内容はテーブルデータから中古車価格を予測するというもの。

# I/O
訓練：27532
テスト：27537
評価指標：MAPE

| Index | Column        | note                |
|-------|---------------|---------------------|
| 0     | region        | 車を販売する地域    |
| 1     | year          | 車の製造年          |
| 2     | manufacturer  | メーカー名          |
| 3     | condition     | 車の状態 |
| 4     | cylinders     | シリンダー数 |
| 5     | fuel          | 燃料タイプ |
| 6     | odometer      | 走行距離             |
| 7     | title_status  | タイトルの状態 |
| 8     | transmission  | トランスミッションタイプ |
| 9     | drive         | 駆動方式 |
| 10    | size          | 車のサイズ           |
| 11    | type          | 車のタイプ           |
| 12    | paint_color   | 車の塗装色           |
| 13    | state         | 販売州               |


# 結果

順位は奮わず101/379人であった。
しかし、努力賞として以下のものを頂いた。
- モデリング部門特別賞
- Slackアクティブ賞

# EDA
## 価格の高い組み合わせ
トラックが平均して価格が高く黄色のトラックが最も高い組み合わせ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/5e6d3a8c-494f-cbc8-73e9-f7b5f7b17767.png)

新品の後輪駆動が価格が高い傾向にある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/ad2564a0-54a9-801b-0946-6ab04e51d1c8.png)

しかし、データ数を確認すると極端に数が少なく平均価格が引っ張られたに過ぎなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/e5a5ff4b-7501-c18f-8259-03e9921d519b.png)

## 存在し得ないハイブリッドカー
1997年10月に初めてハイブリッドカーをトヨタが発表したとのこと。
しかし、ハイブリッドカーの製造年の最小値を確認すると1975年となっていた。
これはデータ拡張をすでに行ってデータを作成したことに起因するのだと考えるが、具体的にどう対処すればよいのかはわからなかった。

# 使用したモデル
- LightGBM
- TabNet
- 最近傍法

TabNetと最近傍法はあまり効かず、モデルに採用したのはLightGBMのみであった。

残差接続をイメージしてスタッキングを行った。
以下に処理の流れを示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/6584b337-7496-7fe8-6af1-c28aedbd9fc9.png)

# 工夫した点
欠損値と外れ値の処理方法を工夫した。
- 走行距離が欠損の場合、車年齢と年平均走行距離から線形に補完
- regionからstateを特定しstateを補完
- 走行距離が100万の単位のものは桁の打ち間違いと考え1/10した
- 製造年が3000年代のものは-1000した
- 新車かつ廃車のようなデータは廃車に揃えた

 また、特徴量エンジニアリングとして、カテゴリ変数については可能な限り順序尺度に変換した。
 
# 他参加者から吸収したこと
学生部門1位
- MAPEは相対誤差の為、下に外すことを少なくするようにモデリングする

社会人部門2位
- ダミー変数をつける場合に順番を意識することでランクエンコーディングにする
- メタモデルを作成し、モデルを使い分けることで目的変数の多峰性に対応する

社会人部門1位
- ユニーク数が多いカテゴリ変数にはターゲットエンコーディングを行う

# ソースコード

https://github.com/rakawanegan/signatestudentcup2023_portfolio
Seleniumを使ってGoogle検索：キーワードを入力から結果の表示まで。

Seleniumを使ってキーワード検索をする方法。
ここではMicrosoftのEdgeを使っています。

流れとしては、キーワードを入力するとGoogleからそのキーワードに沿った検索結果が返ってくるということろまでです。

今回は完全なコピペでOKです。

## コード

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.by import By
    from selenium.webdriver.edge.service import Service
    from webdriver_manager.microsoft import EdgeChromiumDriverManager
    import time
    
    def main(input_data):
        # EdgeのWebDriverを自動でインストールし、起動
        service = Service(EdgeChromiumDriverManager().install())
        driver = webdriver.Edge(service=service)
    
        try:
            # Googleのウェブページを開く
            driver.get("http://www.google.com")
    
            # 検索ボックスを見つける
            search_box = driver.find_element(By.NAME, 'q')
    
            # 入力されたキーワードを検索ボックスに入力して、検索を実行
            search_box.send_keys(input_data)
            search_box.send_keys(Keys.RETURN)
    
            print("検索結果のページを開いたままにします。")
            time.sleep(600)  # 600秒 = 10分
        finally:
            # ウェブドライバーを終了する
            driver.quit()
    
    # このスクリプトが直接実行された場合のみ以下のコードを実行
    if __name__ == "__main__":
        input_data = input("検索したいキーワードを入力してください: ")  # ユーザーに入力を促す
        main(input_data)  # メイン関数を呼び出す
mros2のネットワーク設定備忘録

mros2-mbedのネットワーク設定に詰まったので備忘録として。
# 環境
Ubuntu 22.04 & Humble
NUCLEO_F767ZI

# やること
IPアドレスを毎回設定することは面倒なためGUIを使ってサンプルのプログラムのIPアドレスで固定する。

# やり方
1. 「setting」→「Network」の中のWiredの歯車ボタンを押す。　　
1. 「IPv4」タブに移動して「IPv4 Method」を「Manual」に変更。
1. 「Addresses」に使うIPアドレス（サンプルと同じで問題ない）を入力。
入力例↓
![入力例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593053/821ff0fe-8954-b46c-261e-33eaccaa7b05.png)

# 参考 
https://github.com/mROS-base/mros2-mbed
Windowsで各フォルダサイズを爆速で計測する方法(Powershell)

# はじめに
「各フォルダサイズがどのくらいのサイズか測っといて」とよく言われることがあります。
手段として、Explorerから一個一個確認するのは面倒ですし、Explorerの設定をいじって表示させるようにしたりすると時間がかかり重くなるので、Powershellでスクリプトを作成することにしました。


# フォルダサイズ計測スクリプト
## カレントディレクトリの合計
```powershell

# ディレクトリのパスを指定します。現在のディレクトリを指定しています。
$dirPath = "./"

# 合計サイズを保存するための変数を0で初期化します。
$totalSize = 0

# Get-ChildItem コマンドを使って、指定したディレクトリ内のすべてのアイテムを取得します。
Get-ChildItem $dirPath -File -Recurse | ForEach-Object {
    try {
        # ファイルのサイズ（$_Length）をMB単位で取得し、それを合計サイズに加算します。
        $totalSize += $_.Length / 1MB
    } catch {
        # エラーが発生した場合の処理です。
        if ($_.Exception -is [System.UnauthorizedAccessException]) {
            Write-Host "-Error: Access is denied $($_.FullName)"
        } elseif ($_.Exception -is [System.IO.IOException]) {
            Write-Host "$($_.FullName) -Error: The directory is in use."
        } else {
            Write-Host "$($_.FullName) -Error: An unexpected error occurred."
        }
    }
}

# 桁数2で丸め
$totalSize = [Math]::Round($totalSize, 2, [System.MidpointRounding]::AwayFromZero)
# 合計サイズを出力します。
"$totalSize MB Total size"
```

## サブフォルダの合計
```powershell
$dirPath = "./"  # カレントディレクトリを指定

$parentPath = (Get-Item -Path ".\").FullName  # 親ディレクトリのパスを取得

$sizeInfo = Get-ChildItem -Path $dirPath -Directory | ForEach-Object {
    # サブディレクトリのサイズを計算するための変数を初期化
    $subDirSize = 0
    # サブディレクトリのパスから親ディレクトリのパスを除いた結果を取得
    $subDirPath = $_.FullName.Replace($parentPath, "").TrimStart("\")
    # サブディレクトリ内のファイルを再帰的に取得し、サイズを計算
    Get-ChildItem $_.FullName -File -Recurse | ForEach-Object {
        $subDirSize += $_.Length / 1MB
    }
    # サイズを桁数4で丸める
    $subDirSize = [Math]::Round($subDirSize, 4, [System.MidpointRounding]::AwayFromZero)
    # サブディレクトリのパスとそのサイズをカスタムオブジェクトに格納
    [PSCustomObject]@{
        SubDirectory = $subDirPath
        Size = $subDirSize
    }
}

# サブディレクトリの情報をテーブル形式で出力
$sizeInfo | Format-Table -AutoSize

```

### 結果
上記のコードをPowershellにコピペするか、ps1にして実行するとこんな感じで出てきます。
```powershell
PS C:\Users\hoge> & .\11_PowerShell\sizeCal3.ps1
87.81 MB Total size

SubDirectory         Size
------------         ----
00_DevelopMind     2.9315
01_work            0.0105
02_Article         0.0174
03_Excel           0.0003
04_MS_Graph        0.0679
06_ExchangeOnline  0.0446
07_Architecture    0.0021
08_dotnet          0.0017
09_MS              0.0033
10_Test            2.0159
11_PowerShell      0.0109
12_Tools           2.3041
13_Vim                  0
14_DevOps          0.0861
15_git             0.0015
16_C#             80.2899


```


最後に
Shellが一番良いのは理解していますが、PowershellでWindowsを自動化するのも結構ありなのでは、と最近は思っています。（Windowsを使用していてwslを使用できない環境の場合）
整列

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/25b9ab92-9b97-85a5-f846-698447f2a963.png)
１：交換法
　交換ほうは、隣同士を比較して順序関係が逆転していたら位置を入れ替えるという作業を繰り返し行なって、データを並べる方法です。
※試験の出題例：「隣り合う要素を比較し、逆順であれば交換して、整列を行う」方法は交換法である。

２：選択法は、未整列部分から最小値（あるいは最大値）を順次取り出して整列部の末尾に追加する、という作業を繰り返し行なって、データを並べる方法です。
※試験の出題例：「対象集合から最も小さい要素を順次取り出して、整列を行う」方法は選択法である。

３：挿入法
　挿入法は、未整列部の先頭データを整列部の適切な箇所に入れるという作業を繰り返し行なってデータを並べる方法です。
 ※試験の出題例；「対象h数号から要素を順次取り出し、それまでに取り出した要素の集合に順序関係を保つよう挿入して、整列を行う」方法は挿入法である。
【kintone】ちゃんとトークン隠してますか？

こんにちは。イデペンジンです。
普段kintone開発に携わる中で気になったことがあったので記事にしました。

# はじめに
kintoneってノーコード・ローコードで申請管理や問合せ管理ができる便利なPaaSシステムなんです。
ローコードなので便利にしたくてJavascriptでの開発作業(カスタマイズ)するなんてことあると思うんです。
カスタマイズするにあたって記事が結構あったり、ドキュメントも充実しているので**ちょっとプログラムかじった人であればできちゃうと思う**んです。
外部連携したくてSlackとかLINEとかに通知飛ばしたり、kintone内でアプリトークン作成してカスタマイズすることも簡単にできちゃうと思うんです。
その時に**ちゃんとトークン隠してますよね？**
というのもトークンを隠すことに関する記事や記載が少ないんです(ちょっとプログラムかじった人ってトークンを隠さなきゃいけないこと知らないんじゃない？？)。だから、ソースコードにそのまま書いちゃってるんじゃないか？と思ったんです。
ドキッとした人はぜひ最後まで読んでってください。

# 従来の動きとトークンを隠す場合を解説
トークンを隠さずにハードコーディング(JavaScriptに直接トークン情報を書いている)とkintoneの利用者がその外部APIを実行する前にトークンを保持してしまうんです。トークンを悪用されるとデータの不正取得や改ざんに繋がる可能性があります。(><)
![従来の動き.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/d51d38f4-0c65-c046-d48f-2d1e5b1623dd.png)

ですので、外部連携(トークンなどを使用する場合など)にはトークンを秘匿することが望ましいです。幸いkintoneにはトークンをプラグインにて秘匿する機能があります。
手順としては以下となります。

①管理者によってトークンを事前にプラグイン画面から登録します。登録したデータはkintoneが用意しているプロキシサーバーへ保存されます。
②利用者から外部APIを実行する。この時、利用者はトークンを知りません。トークンの代わりにプラグインIDをプロキシサーバーへ送信します。
③プロキシサーバーは受け取ったリクエスト情報に①で設定しておいたトークンを付与します。
④プロキシサーバーからトークン情報を付与したAPIが外部サーバーへリクエストとして送信され、従来通り外部サーバーが適切な処理を実施します。
![秘匿した場合の動き.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/eba3de01-a51c-0ba3-8abf-a4cfea7da9a6.png)

このように設計することで利用者にトークンを知らせることなく利用者に外部連携機能を提供することができます。

# 参考資料
①のトークンをプラグインに保存するやり方は下記を参考としてください。
https://cybozu.dev/ja/kintone/docs/js-api/plugins/set-config-for-proxy/

②の利用者がプロキシサーバーへ投げるリクエストは下記を参考としてください。
https://cybozu.dev/ja/kintone/docs/js-api/plugins/kintone-plug-in-proxy/

cybozuの「kintone 開発 Tips」で本内容に触れている記事もありますので参考としてください。
https://cybozudev.zendesk.com/hc/ja/articles/360019834671-kintone%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-Part2-%E6%83%85%E5%A0%B1%E3%81%AE%E9%9A%A0%E5%8C%BF%E6%96%B9%E6%B3%95%E7%B7%A8-

# 最後に
参考資料を読んでいくと「えー、プラグイン作らないといけないの？めんどくさー」となるかも？そんな時は[トークン秘匿プラグイン](https://idepenshop.stores.jp/items/6533f0897619fe1eed9d5b35)を頒布しておりますので是非確認してみてください。
[こちらの記事](https://note.com/idepenjin/n/n0d8b621b4ab8)でプラグインの紹介もしてますのでよかったら見てみてください！
Unity is running as administrator を消す方法

# 本題: Unity is running as administrator を解決する方法
※ Windows限定（筆者はWindows11 Home）

1. 左下の検索に `uac` と打ち、「ユーザーアカウント制御設定の変更」を開く
1. スライダを一番上の「常に通知する」に変更
1. PC 再起動
1. Unityを起動すれば、もう管理者権限で実行されなくなる。
1. ユーザーアカウント制御 (UAC) はもう戻してよい。

おそらく、プロジェクト作成時にこれをすれば、次から起動するときはユーザーアカウント制御設定を戻していても大丈夫（筆者はそうです）。

参考：
[Disable "Unity is running as administrator" popup warning](https://forum.unity.com/threads/disable-unity-is-running-as-administrator-popup-warning.1293657/#post-9018880 "Unity Forum")
[Unity is running as administrator fix 14/3/2023 (YouTube)](https://www.youtube.com/watch?v=ZG3FjmZKXxQ "YouTube")


# ちなみに
UAC設定は上から2番目が既定とされていますが、筆者は一番下の「通知しない」になっていました。
変更した覚えはないのですが。怖いですね。
Jupyter NotebookでOut Of memoryを回避するのに便利なマジックコマンド

本記事は、京都大学人工知能研究会KaiRAのAdvent Calender 6日目の記事です。
皆さんはPythonでOut Of Memoryで苦労したことはありませんか？
当然ながら私もOut Of Memoryに悩まされることがありまして、その度に何かOut Of Memoryを回避する良い方法がないかなと思っていました。
C++ではスコープを抜けたら勝手に変数のメモリ解放を行ってくれるので、こまめにスコープを波括弧を使ってやるとこまめにメモリ解放を簡単に行うことができるのですが、Pythonでは検索してもなかなか良さそうな方法が見つからず…
今回は、jupyter notebookでOut Of Memory対策に使える便利なマジックコマンドについて紹介したいと思います！

# 検索したら良く見かける方法
検索してよく見かけるのは明示的に変数を削除する以下の方法です。
```python
import gc
a = [0, 1, 2]

del a
gc.collect()
```

この方法を使うとメモリを解放してくれます。
ただ、この方法に前からずっと不満がありました。
不満というのは変数を明示的に削除しないといけない点です。
このようなコードだと、新しい変数を作ったときに削除し忘れたりとか、変数を無くした時にdelのところから消し忘れたりすることがあります。
機械学習だと$5$分、$10$分、場合によっては$30$分や$1$時間ぐらい無駄にしてしまってイライラすることになるわけですね。

# 今回初めて知った方法

Kaggleでチームを組んだ方がOut Of Memory対策に使える便利なマジックコマンドを教えてくださいました。
本当にありがとうございます。
それは以下のようなものです。
```python
%%python

a = [0, 1, 2]
```

%%pythonをセルの最初に付け加えるだけです。
簡単ですね。
こうすると、このセルを抜けたときに変数を全部勝手に解放してくれます。
ただし、注意点があって、**このセルの外でimportしたモジュールやこのセルの外で定義した変数は、このセルの中では使えません。**
この%%pythonというマジックコマンドは、セルを一つのPythonプログラムとして「完結」させてしまうようなマジックコマンドなわけですね。

# まとめ
delやgcを使ってメモリを解放することもできますが、Jupyter Notebookであればセルの先頭に%%pythonと書いておけばそのセルが終わったところでメモリを解放してくれます。
最後まで読んでくださり、ありがとうございました！
IPAの試験バッジ（非公式）を作った

- 会社や業界によってはあまり重視されないことでお馴染みのIPAの[情報処理技術者試験](https://www.ipa.go.jp/shiken/about/gaiyou.html)ですが、~~資格手当がつく~~　勉強した結果が明確に出るということもあって、個人的には結構好きです。

- で、せっかくなのでアピールしたくなるのが人の性なのですが、IPAさんはそういう方向には熱心ではないらしく、合格者がネット上でアピールするのに便利なバッジとかは作ってくれていません。
  - [情報処理安全確保支援士](https://www.ipa.go.jp/shiken/kubun/sc.html)だけは名称独占資格なので専用のロゴがありますが……。~~ずるい~~

- そこで、IPA試験合格バッジを表示するためのAPIを勝手に作りました。

## IPA試験バッジ（非公式）

https://github.com/kedama-t/Unofficial-IPA-Exam-Badges

- GitHubのプロフィールをモリモリにした経験のあるエンジニアなら一度は使ったことがあるであろう[github-profile-summary-cards](https://github.com/vn7n24fzkq/github-profile-summary-cards)にインスパイアされて作りました。

- 各試験の色は[Wikipediaのテンプレート](https://ja.wikipedia.org/wiki/Template:%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93)から拝借しました。
  - 公式のカラーは見つけられなかった。

- 星のアイコンは[Font AwesomeのStar](https://fontawesome.com/icons/star?f=classic&s=solid)を拝借しています。

## 使用例

こんな感じで使います。

```
https://unofficial-ipa-exam-badges.vercel.app/{en|ja}/{icon|card}/{EXAM_NAME}/{year}/{season}
```

基本情報技術者試験アイコン(2023年11月合格)

![FE](https://unofficial-ipa-exam-badges.vercel.app/en/icon/fe/2023/november)

```markdown
![FE](https://unofficial-ipa-exam-badges.vercel.app/en/icon/fe/2023/november)
```

データベーススペシャリスト試験カード(2023年春季合格)

![DB](https://unofficial-ipa-exam-badges.vercel.app/ja/card/db/2023/spring)

```markdown
![DB](https://unofficial-ipa-exam-badges.vercel.app/ja/card/db/2023/spring)
```

プロジェクトマネージャ試験カード(試験名英語/2023年秋季合格)

![PM](https://unofficial-ipa-exam-badges.vercel.app/en/card/pm/2023/autumn)

```markdown
![PM](https://unofficial-ipa-exam-badges.vercel.app/en/card/pm/2023/autumn)
```

- [サンプル全部見る](https://unofficial-ipa-exam-badges.vercel.app/)場合はこちら。
  - 流石にこれだけ並ぶときれいでいいですね。

## 仕組み

- [Next.js](https://nextjs.org/)の[Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)と[Dynamic Routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)でパスからパラメータを拾って、内容に応じてsvgを生成します。
  - この程度のことにNext.jsを使うのはどうなのかというのはありますが、使ってて楽しいのでついつい。
- SVGについては理解度がほぼ0だったので、調べながらやってたら随分手間取りました。

## 終わりに

- もっと情報処理技術者試験をアピールしていきましょう
  - IPAさん公式のバッジください

- GitHubのプロフィールとかで使ってもらえると嬉しいですが、デプロイ先が[Vercel](https://vercel.com/)のHobbyプランなので、万が一メチャクチャ使われたら止まる可能性あります。
  - 非公式のものですので、もしIPAさんに怒られたら止めます。
  - 非公式なので、このバッジは何かを証明するものでないことはご留意ください。

## ちなみに

- `year`と`season`はそのまま出してるので、和暦で書いてもいけます。

![SA](https://unofficial-ipa-exam-badges.vercel.app/ja/card/sa/令和5年/春期試験)

```markdown
![SA](https://unofficial-ipa-exam-badges.vercel.app/ja/card/sa/令和5年/春期試験)
```
SwiftUI使うなら重い処理はonAppearに入れとこう。。。

## とある日にキーボード入力が重いことに気づいた俺。

なんでだろうと、Viewの更新処理について学び直した。

```swift
struct ContentView: View {
	@State var inputValue = ""
	var body: some View {
		let _ = print("ContentView")
		TextField("なんか入力して", text: $inputValue)
	}
}
```

文字が入力されるたびにContentViewが再描画されているのがわかる。キーボードを入力するたびに再描画されるわけだから、ContentViewが重いViewだと危険だよね。

それってどういうViewなんだよと思う人のために用意してみた。

```swift

struct ContentView: View {
	@State var inputValue = ""
	var items: [String] {
		var res = [String]()
		for i in 1..<1000000 {
			res.append(i.description)
		}
		return res
	}

	var body: some View {
		VStack {
			let _ = print("ContentView")
			Text(items.count.description)
			TextField("あなたの名前", text: $inputValue)
		}
		
	}
}
```

これキーボード入力するたびにforループが走るので、てぇーへんなことになります。
めちゃくちゃ重い。エラーとか警告も表示されないので結構気づかない。

BigなJSONをダウンロードしてちょっとループさせて内部で変換するときとかに、たまにやってしまうんよ。

## onAppearで配列を初期化すればViewの再描画時に無駄なループ処理が走らなくなる。

```swift
struct ContentView: View {
	@State var inputValue = ""
	@State var items = [String]()

	var body: some View {
		VStack {
			let _ = print("ContentView")
			Text(items.count.description)
			TextField("あなたの名前", text: $inputValue)
		}
		.onAppear {
			print("onAppear")
			var res = [String]()
			for i in 1..<1000000 {
				res.append(i.description)
			}
			items = res
		}
	}
}

```

キーボード重くね？って思ったら疑ってみてくだされ
Stirlingで構造体編集 その7

# 概要
バイナリエディタStirlingで構造体編集、やってみた。
練習問題、やってみた。

# 練習問題
pngファイルの構造体を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1b5ca414-5dc6-05bf-8ac8-61b8559dae50.png)

# png構造体

```
struct PNG_HEADER {
	DWORD	Signature0;
	DWORD	Signature1;
	DWORD	Length;
	DWORD	ChunkType;
	DWORD	ChunkWidth;
	DWORD	ChunkHeight;
	byte	BitDepth;
	byte	ColorType;
	byte	BitDepth;
	byte	Compression;
	byte	Filter;
	byte	Interrace;
	DWORD	Crc;
};
```

以上。
自宅でのAWS認定試験を体験

最近、**AWS Certified Solutions Architect – Associate**の認定試験を受けました。試験言語は日本語を選びましたが、英語の問題文も表示可能。試験時間は基本160分(非英語母国語話者向けには通常追加30分を含む。特に申請はしなかったですが、自動付与されたみたいです)。

### 試験準備📚

試験の準備ではまず、onvueというアプリ(PC)をダウンロードしてインストールし、デバイスのチェックを行いました。この過程で、Zoomのバックグラウンドプロセスが動いていることが検出され、手動で終了させる必要がありました🚫。その後は、携帯で身分証明書の写真を撮ってアップロードし、試験環境の写真も撮影しました。

### 試験環境チェック🕵️‍♂️

試験官とのチャットボックスを通じて、カメラで周囲の環境を撮影するよう指示されました。腕時計は外すことになりました⌚、手が届かない場所に物を置くように言われました。面白かったのは、手を伸ばして物が届かないことを確認されました😄。

### 試験開始🚀

準備が整ったら、いよいよ試験開始です。何か問題があれば、チャットで試験官に質問することができます。カメラは試験中ずっとオンの状態を保たなければならず📷、画面から離れることはできません。

### 試験後のプロセス📝

試験後にはアンケートが出ますが、記入する必要はなく、スキップすることもできます。そして試験翌日の深夜には、もう結果が届いていました🎉。迅速な対応には驚かされました。

自宅でAWS認定試験を受けようと考えている方へ、私の体験が少しでも役立てば嬉しいです。自宅で受ける利便性は高いですが、試験環境の準備が重要です。
スプレッドシートでの自動でワークシート選択

# はじめに
Pythonの備忘録です。

# 内容
スプレッドシートのワークシートを値として、それぞれにKey設定することで選択ができる。またKeyを設定して、それに対してのセルを選択するようにする。


```python:main.py
import datetime
import calendar
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scopes = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']
service_account_file = '〇〇〇〇.json'

credentials = ServiceAccountCredentials.from_json_keyfile_name(service_account_file, scopes)

gs = gspread.authorize(credentials)

spreadsheet_key = '****'
spreadsheet = gs.open_by_key(spreadsheet_key)

# それぞれのワークシートを定義して辞書にする。
worksheets_dict = {
    "January": spreadsheet.worksheet("January"),
    "February": spreadsheet.worksheet("February"),
    "March": spreadsheet.worksheet("March"),
    "April": spreadsheet.worksheet("April"),
    "May": spreadsheet.worksheet("May"),
    "June": spreadsheet.worksheet("June"),
    "July": spreadsheet.worksheet("July"),
    "August": spreadsheet.worksheet("August"),
    "September": spreadsheet.worksheet("September"),
    "October": spreadsheet.worksheet("October"),
    "November": spreadsheet.worksheet("November"),
    "December": spreadsheet.worksheet("December")
}

# 週数からセルの値を指定するための辞書を作成。
cell_addresses = {
    1: 'B2',
    2: 'B3',
    3: 'B4',
    4: 'B5',
    5: 'B6'
}

# 今月の値を抽出
current_month = today.month

# 今月の名前を抽出（英語）
current_month_name = calendar.month_name[current_month]

# 辞書を使用して今月のワークシートを選択します
current_worksheet = worksheets_dict[current_month_name]

# week_of_monthで出された数値をcell_addressesからindexの値を抽出
cell_address = cell_addresses[week_of_month]

# acellでcell_addressで指定されたセルの値を出力
cell_value = current_worksheet.acell(cell_address).value

# 記載されてないことも考慮する。
if cell_value is None:
    print(f'今週分のスプレッドシートが記載されてません。')
else:
    print(cell_value)
```

## 押さえておくべき点
* 辞書型の左側は「Key」右側が「値（value）」になっている。
* 「Key」は自分で設定することができる。（コーテーションで囲う必要あり）
* 辞書の値を抽出する場合には[]を使う。
* acellは選択したセルの値を抽出できる。
【Linuc102対策】IPv4とIPv6の違い

# はじめに
Linuc102試験の中でも特にネットワークのところが個人的に難しく、IPアドレスの理解を深めようと奮闘中。

# そもそもIPプロトコルとは
コネクションレス型のプロトコル。(相手に通信データが正しく届いているかを確認せず一方的に送信する)

データパケット(分割されたデータ)がネットワークを経由して正しい宛先に到着できるよう、データパケットをルーティング及びアドレス指定をする。


# IPv4とIPv6の違い
|  TH  |  IPv4  |  IPv6  |
| ---- | ---- | ---- |
|  ビット数  |  32bit |  128bit  |
|  IPアドレスの数  |  2の32乗  |  2の128乗(枯渇問題解消)  |
|  表記方法 |  8bitごとに.で区切って10進数で表記  |  16bitごとに:で区切って16進数で表記  |
|  セキュリティ |  オプション  |  IPsecが標準搭載(IPv4よりセキュリティ強度は高い)  |
|  ブロードキャストアドレス  |  ある  |  ない  |
|  マルチキャストアドレス  |  ない  |  ある  |
|  接続方式  |  PPPoE接続  |  IPoE接続  |
|  回線速度  |  最大1Gbps  |  最大10Gbps  |

※ブロードキャストアドレス…特定のネットワークに繋がっている全ての機器に届くようになっているアドレス
※マルチキャストアドレス…特定のアドレスに紐づいた複数の機器に届くようになっているアドレス
※PPPoE接続…インターネット接続する際に「ネットワーク終端装置」を経由
※IPoE接続…装置を経由せず直接インターネットに接続

# おわりに
Linuxの勉強をする中で、IPアドレスあたりでかなり躓いたため、基礎的なところを勉強しようとまとめた。
ネットワークはエンジニアにとって基礎中の基礎だと考えているので、理解を深めていきたい。

# 参考
Linucレベル1 小豆本
https://wa3.i-3-i.info/diff280address.html
https://www.thn.ne.jp/blog_detail/id=30
https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_116.html
https://www.cloudflare.com/ja-jp/learning/network-layer/internet-protocol/#:~:text=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%EF%BC%88IP%EF%BC%89%E3%81%A8%E3%81%AF,%E6%96%AD%E7%89%87%E3%81%AB%E5%88%86%E5%89%B2%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
マクローリン展開のグラフ

# マクローリン展開
マクローリン展開は関数を多項式で近似することができる。では、その近似はどんな感じなのか、可視化してみた。

# sin(x)
項数が増えると、波の形状に沿って、先の方まで伸びていくことがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/7e047da1-98cf-0416-c41a-03bf18006682.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/a184ea60-0267-b5b8-0ae5-495657dbb734.png)

セルH5の式はこんな感じ
```
=G5+H$2*$A5^H$3/FACT(H$3)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/abd5b9f9-0d46-b9ad-8d5d-2500237d1454.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/4b379184-c0a1-7041-f939-49713330363c.png)

比較したかったので、とりあえず重ねた。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/0e558c3d-7a03-11b8-a9ae-1847a122bdc7.png)

# e^x

xが大きくなると、どんどん精度が悪くなる。
15!の項まで計算したとして、
x=4のとき、0.999995107
x=7のとき、0.99759342
x=10のとき、0.951259597
実際に、少ない多項式で近似式として使うことまで考えると、x=1以下が妥当？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/d3c33437-84b0-4493-ea6b-d824df91eaa9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/2e23d3a0-780a-9ade-189d-4362646f5515.png)

# log(1+x)
まず、エクセルで自然対数の底eでlogするときは、ln()をつかう。
中央のx=0付近では、誤差が小さいが、両端（x=-1, x=1）にいくほど、誤差が大きくなる。
また、x<0と0<xでは、収束の具合が異なる。右側では正値をまたぎながら収束し、左側では、徐々に近づく。

セルH2の式はこんな感じ
```
=G2-1/6*$A2^6
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/e0508d48-6e0e-1c63-3b4a-10476c99b194.png)

下、x<0の領域の拡大(点々が正値)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/454ea274-8555-9565-a67d-607c955e6719.png)

下、0<xの領域の拡大(点々が正値)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/832dfdd1-cae0-8da0-e862-70b44de6e330.png)



# 用途
算術関数ライブラリが用意されていない、ってミニマムな環境なら「０近傍において」近似式として使える。

# リンク
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B
クリックハウス®の使用例

<font color="Grey">*[Use cases for ClickHouse®](https://aiven.io/blog/use-cases-for-clickhouse)の翻訳です。*</font>

2022年9月15日

# クリックハウス®の使用例

Aiven for ClickHouse®は、非常に高速なオンライン分析処理のために設計されたフルマネージドのクラウドデータウェアハウスです。

## どういう意味？


つまり、Aiven for ClickHouseは大量のデータを長期保存するためのワンストップツールであり、分析データを扱うための理想的なツールキットを誇ります。これには膨大な数の関数、演算子、圧縮コーデックなどが含まれます。オンライン分析処理（OLAP）という言葉を聞いたことがあるだろう。それがOLAPです。


[オープンソースのClickHouse](https://aiven.io/blog/what-is-clickhouse)は、非常に高いスループットを提供するカラム型データベースです。ClickHouseを[Aiven for PostgreSQL®](https://docs.aiven.io/docs/products/postgresql/getting-started.html)または[Aiven for Apache Kafka®](https://docs.aiven.io/docs/products/clickhouse/howto/integrate-kafka.html)と統合することで、ビジネス推進に役立つ洞察のためのハイパフォーマンスな分析をお楽しみいただけます。


では、事例をご紹介しましょう。


### 運用データベースから分析をオフロードする


運用データベースとしてAiven for PostgreSQLをお使いですか？オンライントランザクション処理（OLTP）セットアップの一部として分析クエリを直接実行していますか？


**問題：*** 分析クエリを実行すると、何時間もかかることがあり、データベースを使用してデータの読み取り、更新、削除を行いたい他のユーザーのパフォーマンスが低下します。この OLTP データベースのパフォーマンスへの影響は相当なものです。


**ソリューション：**組み込みの統合機能を使用して、分析クエリをPostgreSQLからClickHouseにオフロードします。分析データをClickHouseに取り込むことで、クエリを高速化し、PostgreSQLのOLTPリクエストのパフォーマンスに影響を与えないようにします。


### リアルタイムの分析ダッシュボードとレポートの取得


メトリクスを収集するビジネスをしているとしましょう。*たくさんのメトリクスがあります。サーバー・メトリクス、IoTデバイス、コネクテッド・ビークル・フリート・データ、何でもありです。


**問題:** 既存のインフラストラクチャーでは増大する遠隔測定負荷に対応できず、現在のデータストアでは機能と集計機能に限界があります。


**解決策：*** データをリアルタイムで素早く集計し、最新の統計情報をダッシュボードにプッシュすることができます。効率的なストレージ・アルゴリズムにより、多くのデータを保存し、過去のデータと最近のデータを並べて見ることで、ユーザーが簡単にトレンドや比較を生成できるようになります。


### ストリーミングデータと時系列データの高性能な分析を実現します。


アプリケーションで頻繁に時系列データの集約が必要ですか？エンドユーザーに表示するためにビッグデータを迅速に保存、処理する必要がありますか？


**問題:** データ量やユーザー数が増加するにつれ、既存のスタックのパフォーマンスはそれに見合うように拡張されず、クエリは遅くなる一方です。


**解決策:** ClickHouseは大規模データセットの高速集計に最適です。ClickHouseのベクトル化されたクエリ実行と[圧縮](https://clickhouse.com/docs/en/about-us/distinctive-features#data-compression)が、パフォーマンスを大幅に向上させます。


## この中のどれかに心当たりはありませんか？


もしそうなら、始めましょう！クラスターのセットアップ、新しいノードのデプロイ、クラウドのマイグレーション、データベースのフォークが数クリックで行えます。さらに、シンプルなダッシュボードですべてを監視したり、[Aiven for ClickHouse with Grafana](https://developer.aiven.io/docs/products/clickhouse/howto/connect-to-grafana.html)を使ってデータウェアハウスに命を吹き込むこともできます。


Aiven for ClickHouseを使えば、10分以内に完全に管理されたクラウドデータウェアハウスをセットアップできます。新規のお客様は、まずAivenのトライアルアカウントを作成する必要があります。


1.[Aiven Consoleにログイン](https://console.aiven.io/signup).
2.新しいClickHouseサービスを作成します。
3.新しく作成したサービスにデータをロードします。
4.組み込みのクエリーエディターを使用して、分析クエリーを開発し、テストします。
5.お楽しみください！


詳細については、[Aiven for ClickHouse製品ページ](https://docs.aiven.io/docs/products/clickhouse.html)をご覧いただき、[製品ドキュメントはこちら](https://developer.aiven.io/docs/products/clickhouse/)をご確認ください。


フィードバックやご質問は、[Twitter](https://twitter.com/aiven_io) までお寄せください。


Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関するちょっとした情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)！
wslでelixir その91

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
Livebookでpng生成してみた。

# 参考にしたページ

https://blog.emattsan.org/entry/2023/07/31/070000

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4e9dfeb9-a075-8b4c-35be-eff49070e7ee.png)



# サンプルコード

```
defmodule Png do
	@file_header <<0x89, "PNG", 0x0D, 0x0A, 0x1A, 0x0A>>
	def generate(width, height, bitmap) do
		bit_depth = 8
		color_type = 2
		compression_method = 0
		filter_method = 0
		interlace_method = 0
		ihdr = <<width:: big - 32, height:: big - 32, bit_depth, color_type, compression_method, filter_method, interlace_method>>
		data = bitmap
			|> Enum.chunk_every(width)
			|> Enum.map(fn row ->
				[filter_method, row]
			end)
		idat = zip(data) 
    [@file_header, chunk("IHDR", ihdr), chunk("IDAT", idat), chunk("IEND", "")]
	end
	defp chunk(type, data) do
		length = IO.iodata_length(data)
		crc = :erlang.crc32([type, data])
		[<<length:: big - 32>>, type, data, <<crc:: big - 32>>]
	end
	defp zip(data) do
		z = :zlib.open()
		:ok = :zlib.deflateInit(z)
		compressed = :zlib.deflate(z, data, :finish)
		:ok = :zlib.deflateEnd(z)
		:zlib.close(z)
		compressed
	end
end


width = 512
height = 512
bitmap = for row <- 0..(height - 1), col <- 0..(width - 1) do
		[min(row, 255), min(col, 255), min(min(511 - row, 511 - col), 255)]
	end
png = Png.generate(width, height, bitmap)
IO.iodata_to_binary(png)


```


以上。
wslでelixir その90

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
Livebookで画像表示、どうすんだ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b37c1913-bc0e-b097-78c5-ba2af781951d.png)


# サンプルコード

```
cat = File.read!("1.png")
```

以上。
【Where is 需要】pythonで音声ファイルを逆再生

# はじめに
こんにちは。赤ジャージです。僕は最近、tkinterとpygameで耐久時間を曲ごとに設定してそのプレイリストを作ったりするメディアプレイヤーアプリを個人的に開発しました(誰得)。完成したアプリを友人Kに見せたら、**「これだとOSについているメディアプレーヤーと何ら変わりない。変な機能を追加するべきだ。例えば逆再生とか。」** と言及されて、**張り倒してやろうか**と思いましたが確かにそうなので、pythonで曲を逆再生する機能を探すと、ありました。

### python、微妙に使いづらい
pythonって色んなライブラリとかありますけどどれも完結してなくて長所と短所があるんですね...例えばpygameだとボタンの概念がないとかtkinterだと音声を再生できないとか...今回使うffmpegもその類です。強力だけど完全じゃない。

# 前提
・python、pygameの基礎知識がある
・お使いのPCは正常で、**osはWindows11(ここ重要)**
・pythonのバージョンは3.7.2(老害)

# 準備
☟とりあえずここにテレポ
https://www.gyan.dev/ffmpeg/builds/

![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3367669/5ef4d232-7f45-f989-2eff-75d8a1e21823.png)
この**ffmpeg-git-full.7z**というffmpegバイナリをダウンロード、解凍
![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3367669/af29f56a-14fd-e3a0-6b21-551c2a84c712.png)
このbinフォルダの中の**ffmpeg.exeとffprove.exeをコードと同じファイルに移す**(依存関係？シラン)。

一応コマンドプロンプトで`pip install ffmpeg`を実行することを推奨。

そして**逆再生させたい曲をコードと同じフォルダに入れる。**

これで準備は完了です。早速コードを見ていきましょう。

# ソースコード
```python:逆再生
import pygame
from pydub import AudioSegment
# 前準備
pygame.init()
AudioSegment.converter = "ffmpeg.exe"
AudioSegment.ffmpeg = "ffprobe.exe"
# 曲をロードして逆にしたものを保存
sound = AudioSegment.from_mp3('music.mp3')
reversed_sound = sound.reverse()
reversed_sound.export('reversed_music.mp3', format='mp3')
# それを再生
reversed_music = pygame.mixer.Sound('reversed_music.mp3')
reversed_music.play()
# 10ミリ秒ごとに曲が再生されているか判定
while pygame.mixer.get_busy():
    pygame.time.Clock().tick(10)
pygame.quit()
```
## 解説
単純だし短いですから少しだけ...
`sound = AudioSegment.from_mp3('music.mp3')`で.mp3ファイルを読み込みます。
`sound.reserve()`で曲を反転します。それを`reversed_sound.export('reversed_music.mp3', format='mp3')`で保存し、pygame.mixerが再生しています。

# 感想
いつ使うんだ...と思ったこのコードですが、案外ゲームとかで使ったりできそうですね...
https://www.youtube.com/watch?v=3c0rPmAWlug
こんな感じの
また友人Kからの変な機能のリクエストがあれば変な機能を調べるかもしれません。
ではでは～(o_ _)o

## 参考文献
https://www.kkaneko.jp/tools/win/ffmpeg.html
Dockerでサクッと検証環境を作成する方法

ローカル環境を汚さずに環境を作って挙動を試したいみたいなことが増えたのでそれを実現する

ディレクトリ構成
```
.
└── Dockerfile
```

```sh
docker build -t almalinux-practice
#-tオプションを使用してイメージに名前をつける
docker run -it almaliinux-practice /bin/bash
#一つまえのコマンドで作成したイメージからコンテナを作成してそのコンテナに入る
```
下みたいな画面になればOK
```
[root@xxxxxxxxxx /]# ls
afs  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```
あとはnode入れたり使ってみたいもの入れるとローカルは汚さずにいろいろ試すことが可能。

## まとめ
Docker使えばいろんな環境作成できてかなり便利。
ただOSを入れる場合最小構成が入ってしまうみたい（psコマンドがなかったり）少し不便なとこはあるのでこの辺テンプレにできたらいいなーとか思ったりした。
laravelでseederを一回だけ呼び出す抽象クラスを作成

laravelでwebサービスを開発中に`db:seed`で
偽データを作成する際に初めから
決まった値をテーブルに入れておきたいことが発生しました。

Init用にseedrを個別で用意していたが
毎回　引数でクラス名を渡すのがメンドイ！

初めの一回だけ呼ばれたときにseedrが実行される抽象クラスを作成した。

何か他に良いやり方があったらおしえてくださいmm


まずは下記のコマンドを実行
```
php artisan make:seeder AbstractOnceSeeder
php artisan make:migration create_seed_flags_table
```

 

中身を修正
```
abstract class AbstractOnceSeeder extends Seeder
{
    abstract public function runOnce();

    public function run()
    {
        $className = get_class($this);

        $isSeeded = DB::table('seed_flags')->where('name', $className)->first();

        if ($isSeeded) {
            return;
        }

        $this->runOnce();

        DB::table('seed_flags')->insert(['name' => $className]);
    }
}
```
```
return new class extends Migration
{
    /* 省略 */
    public function up(): void
    {
        Schema::create('seed_flags', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();
        });
    }
    /* 省略 */
};
```


一回だけ実行したいseederを作成するコマンドを実行。
※category用のモデルやテーブルは用意されている前提です
```
php artisan make:seeder InitCategorySeeder
```

```
class InitCategorySeeder extends AbstractOnceSeeder
{
    public function runOnce(): void
    {
        $InitCategories = [
            'HOGE',
            'FUGA',
            'PIYO',
        ];
        foreach ($InitCategories as $category) {
            Category::create(['name' => $category]);
        }
    }
}
```


そしたらDatabaseSeederにて下記のように呼び出すことで
一回だけ呼び出される。

```
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        /* 省略 */
        
        //default値が存在するseeder
        //seed_flagsをみて走るか来まる
        $this->call([
            InitCategorySeeder::class,
        ]);
        
        /* 省略 */
    }
}
```

あとはseederを実行。
```
php artisan db:seed
```

テーブルの中身は下記のような感じになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486455/d7b34925-2b45-aff2-e0a5-8e8e67ee9eb2.png)
squidでBasic認証に失敗したときの対処メモ

squidで立てたプロキシサーバでBasic認証設定に手こずったので症状と解決策をまとめます

## 環境

OS: Windows 10
squidバージョン：4.14 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/da2c553e-fa2b-efa9-1410-ab61c7a76152.png)

## 症状

1. ローカルPCにsquidをインストールし、以下のユーザ情報でBasic認証をする設定を行う。（[設定手順参考ページ](https://gist.github.com/skysan87/96c4f49f590ece35e6d2529afeff37b5) )
ユーザID: user
パスワード: pass123


2. ターミナルから以下を実行する

```shell
curl.exe https://www.google.com/ -x http://user:pass123@localhost:3128
```

↓
以下のエラーが出力される

```
curl: (56) CONNECT tunnel failed, response 407
```

このときログファイル(`C:\Squid\var\log\squid\cache.log`) には以下のエラーメッセージが無限に出力され続ける

```
2023/11/03 00:54:32| helperOpenServers: Starting 1/5 'basic_ncsa_auth.exe' processes
C:/squid/lib/squid/basic_ncsa_auth.exe: error while loading shared libraries: cygcrypt-2.dll: cannot open shared object file: No such file or directory
```

(このエラー出力はタスクマネージャからsquid.exeを強制終了することで止まった)

## 解決策

`cygcrypto-2.dll`を手動で`C:\Squid\lib\squid`に配置すると解決した

`cygcrypto-2.dll`はcygwinを使ってlibcyrpt2をインストールすることで入手できたので、以下その手順まとめ

1. cygwinのインストーラを実行 ([インストーラ配布ページ](https://www.cygwin.com/install.html))
2. Select Packages画面でlibcrypt2のバージョンを選択してインストールを進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/3a16dcb2-239e-038c-a7dc-bca723ad1b2c.png)
3.　インストール完了できたら `C:\cygwin64\bin\cygcrypt-2.dll`を`C:\Squid\lib\squid`にコピーする
文字列と10桁の採番された番号＋１の値を求めるSQL

# 準備

PostgreSQL 12
Windows 11

```sql
create table public.a (
  b character varying(14)
  , c character varying(15)
);

INSERT 
INTO public.a(b, c) 
VALUES ('RES_0000000001', 'ニワトリ')
, ('RES_0000000002', 'オカメインコ')
, ('RES_0000000003', 'ネコ')
, ('RES_0000000004', 'イヌ'); 
```

# SQL

・SUBSTRING関数と正規表現 'RES_(\d+)' を使って "RES_" に続く数値部分を抽出します。
・CAST関数で抽出した数値部分を bigint 型に変換します。
・MAX関数で最大値を求め、1を加えます。
・LPAD関数を使って得られた数値を10桁になるまで左側から0で埋めます。
・|| 演算子で新たな最大値の先頭に "RES_" を付けます。

```sql
SELECT
    'RES_' || LPAD( 
        CAST( 
            ( 
                MAX(CAST(SUBSTRING(b FROM 'RES_(\d+)') AS bigint)) + 1
            ) AS character varying
        ) 
        , 10
        , '0'
    ) AS Next_b 
FROM
    public.a;
```

SQL実行後の値

```sh
RES_0000000005
```
discord.Botはpycordのバージョン2.0.0でしか使えません

# 概要
pycordのver.2.00以外のバージョンで`discord.Bot()`を使うと、以下のエラーが発生する
```
AttributeError: module 'discord' has no attribute 'Bot'
```
[解決策]
以下のコマンドでpycordのバージョンを下げる
```
pip install py-cord==2.0.0rc1
```

# 参考文献
https://stackoverflow.com/questions/74749387/module-discord-has-no-attribute-bot-in-pycord-version-2-3-2
np.datetime64のUnix時間とその浮動小数について

np.datetime64の浮動小数としての扱いについて、[本家サイト](https://numpy.org/doc/stable/reference/arrays.scalars.html#numpy.datetime64)を見てもよくわからなかったので、挙動を確かめた。

# 結論
- 場合によって数値のオーダーが勝手に変化するので危険
- 第二引数でオーダーを強制的に指定するべし


# np.datetime64とは？
pythonでの時刻を取り扱う規則？の一種で、`numpy`パッケージに組み込まれているもの。他には組み込みモジュールの`datetime`という組み込みモジュールや`pandas`の`pd.Timestamp`などがある。

64は64bitなのだと思う。

`Numba`ではpandasはサポートされてないが、np.datetime64はサポートされている（ので使いたい）。

`pandas`ほど受け入れる文字列は柔軟ではなく、ハイフン"-"で年月日、コロン":"で時分秒ミリ秒...を区切ることで、時刻を指定する。

```python3
import numpy as np
# numpyのバージョンは1.24.1

np.datetime64('1970-01-01 00')
# -> numpy.datetime64('1970-01-01T00','h')

np.datetime64('1970-01-01 00:00')
# -> numpy.datetime64('1970-01-01T00:00')
```

上記の２例、分を書くか時で止めるかで出力結果が少し異なる。

# Unix時刻

上述の1970年1月1日0時UTC(世界標準時)はUnix時刻と呼ばれ、この時刻を基準に0と定義し、時間を相対的に表現する方法がある。この数値は`datetime`や`pandas`ではTimestampと呼ばれる。故に、Unix時刻を浮動小数型へ変換すると0になる。

型の変換は`numpy`においては`astype`メソッドが便利。

```python3
np.datetime64('1970-01-01 00').astype('float')
# -> 0.0

np.datetime64('1970-01-01 00:00').astype('float')
# -> 0.0
```
分まで書いても時まででも同じ結果となる。


このことにより、時刻を数列として扱いたいとき等に、このようにUnix秒へ変換すると、閏年の考慮や10進数/24進数/60進数の混在するプログラムを作らずに済むので便利。
（追記：これは別にUnix秒へ変換せずとも`datetime`や`pd.Timestamp`等をそのまま利用すれば良い。）

浮動小数（や整数）へ変換することで割り算など柔軟に使えるようになり、例えば時間内挿の計算に役立つ。

# 問題の処理
例えば、上記例より10時間ずらした値を見てみると、分まで書くか時までとするかで結果が異なる。（この仕様を知らず、泣かされた。。）

```python3
np.datetime64('1970-01-01 10').astype('float')
# -> 10.0

np.datetime64('1970-01-01 10:00').astype('float')
# -> 600.0
```

つまり、時間だけを指定すると単位は「時間」になり、分まで指定すると単位は「分」になる。10時間=600分。

1970年から遠ざかるほど、単位に比例してその差は増える。
```python3
np.datetime64('2024-01-01 00:00').astype('float')
# -> 28401120.0

np.datetime64('2024-01-01 00').astype('float')
# -> 473352.0

28401120.0/473352.0
# -> 60.0
```

特に`pandas`で生成したcsvファイルでは、フォーマットを指定しなかった場合、0時や0分など、最小単位が0となると省略されがちなので恐ろしい。

# 解決
一番最初の出力がヒントで、第二引数に`D`(日)や`h`(時)や`m`(分)や`s`(秒)を与えると、狙った時間単位を強制できる。それぞれUnix時間からの差分量を示す。

```python3
np.datetime64('2024-01-01 00', 's').astype('float')
# -> 1704067200.0

np.datetime64('2024-01-01 00', 'm').astype('float')
# -> 28401120.0

np.datetime64('2024-01-01 00', 'h').astype('float')
# -> 473352.0

np.datetime64('2024-01-01 00', 'D').astype('float')
# -> 19723.0

np.datetime64('2024-01-01 00', 'M').astype('float')
# -> 648.0

np.datetime64('2024-01-01 00', 'Y').astype('float')
# -> 54.0
```

大きい単位を選んだ場合、細かい時間の情報は失われるので注意。

```python3
np.datetime64('2024-01-01 00', 'h').astype('float')
# -> 473352.0

np.datetime64('2024-01-01 00:00:01', 'h').astype('float')
# -> 473352.0

np.datetime64('2024-01-01 00:59:59', 'h').astype('float')
# -> 473352.0
```
CheerpJ 3.0rc1を発表：テストと改善にご協力ください！

![rectangle_large_type_2_4dd6199b1fa4b96b1d836a2a998a4bd1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/44102ca2-b436-0c88-a172-a20f64193c4e.jpeg)
本日、最初のCheerpJ 3.0リリース候補、バージョン3.0rc1のリリースを発表できることを嬉しく思います。

過去何年もの間、私たちのチームは、Javaアプリケーション、アプレット、ライブラリをモダンブラウザ上で実行するためのソリューションであるCheerpJのために、全く新しいアーキテクチャの開発に精力的に取り組んできました。

# 主なハイライト
世界中の何百もの組織による長年のCheerpJ 2.xの実世界での利用を活用し、我々のブラウザベースのx86仮想マシンであるCheerpXの開発から学んだ多くの教訓を活用して、我々はCheerpJの全面的な書き直しを行いました。

* さようならAOT、こんにちはJITコンパイル： CheerpJ 3.0は、純粋なWebAssemblyであり、ブラウザ用JVMのJITベースの置き換えです。AOTコンパイラや.jar.jsファイルがないため、CheerpJ 3.0の統合とデプロイは、既存のHTMLページに数行を追加し、静的アセットコレクションをホストするだけです。

* 完全なJavaランタイム： CheerpJは現在、Javaアプリケーションとの完全な互換性を保証する、OpenJDKランタイム環境の完全で変更されていないビルドを備えています。

* 完全なクラスローダーのサポート： JVMが通常どのように動作するかを模倣する新しいJITアプローチのおかげで、アプリケーションから提供されたものを含め、クラス解決のために適切なクラスローダーに完全な制御を与えることができるようになりました。これにより、重複したクラスによって引き起こされる非互換性も完全に排除されます。

* 新しいスケーラブルなJNIアーキテクチャ： OpenJDKのネイティブ・コードの100%をWebAssemblyにコンパイルし、Javaの最新バージョンや、ユーザーが必要とする特定のポイント・バージョンをサポートするための実行可能なパスを提供します。

これらのアーキテクチャの進歩のおかげで、CheerpJ 3.0は、完全なOpenJDKランタイムを持つ、JVMに対する完全なWebAssemblyベースの置き換えです。

# 利用可能性とドキュメンテーション：
CheerpJバージョン3.0rc1のリリース候補には、ドキュメントからアクセスできます。

[ドキュメントを見る](https://labs.leaningtech.com/cheerpj3)

これはリリース候補であり、最終的な安定リリースではなく、テストとフィードバックを目的としたプレリリース版であることに注意してください。

# どのように協力できるか：

コミュニティの皆様には、テストとフィードバックのプロセスへの参加をお願いしています。

皆様のフィードバックは、潜在的な問題を特定・修正し、最終リリースが可能な限り安定し、洗練されたものとなるよう支援する上で非常に貴重です。ご協力いただける方法は以下の通りです：

* 今すぐリリース候補をお試しください。

* 実際のシナリオでテストしてください。

* 遭遇したバグや問題をDiscordサーバーで報告してください。

* 新機能や改善点についてのフィードバックを提供する。

[Discordサーバーに参加する](https://discord.gg/qBMHpK9Kqv)

# タイムライン
年内にもリリース候補（3.0rc2）を予定しており、一般リリースは2024年初頭を予定しています。

CheerpJを最高のものにするために、みなさんの継続的なサポートと参加にとても感謝しています。共に最終リリースを成功させましょう。

私たちのコミュニティの一員であることに感謝します！

https://leaningtech.com/legacy-modernisation-jp/

引用元：https://leaningtech.com/announcing-cheerpj-3-0rc1-help-us-test-and-improve/
【SwiftUI】Gestureの検知できる領域について

`DragGesture`や`onTapGesture`といった`Gesture`を使用して、スワイプ検知であったり、`TextField`のフォーカス解除といった場面で、画面全体を検知できる方法を調べてみました。

# どういった場合に機能しないのか
### VStackにそのまま記述
`VStack`に記述したら全体に反映されると思いきや、`VStack`内の`View`のサイズしか反応しませんでした。`VStack`の大きさを指定していないので、`Text`の大きさの中でしか検知できません。
##### ダメな例
```Swift
VStack {
    Text("SecondView")
}
.navigationBackButton()
.edgeSwipe()
```
`VStack`の大きさを指定して、`.contentShape()`を指定してあげると画面全体で検知できるようになります。
##### 正しい例
```Swift
VStack {
    Text("SecondView")
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.contentShape(Rectangle())
.navigationBackButton()
.edgeSwipe()
```
### 透明なViewに記述
透明な`View`を背景にすれば大丈夫かと思えばそうでもなかったみたいです。しかし`clear`ではなく色をつけると反応するようになります。SwiftUIでは透明の`View`に対しては反応しないようになっています。
##### ダメな例
```Swift
ZStack {
    Color.clear
    Text("SecondView")
}
.navigationBackButton()
.edgeSwipe()
```
##### 正しい例
`Color.clear`に対して、`contentShape`をつけることで正しく動作します。
```Swift
ZStack {
    Color.clear
        .contentShape(Rectangle())
    Text("SecondView")
}
.navigationBackButton()
.edgeSwipe()
```

# 終わりに
たったの`contentShape`ひとつだけで変わるので忘れないようにしたいです。記事を投稿してすぐにコメント下さった方に感謝します。