OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】sympyのcoeffは式を展開(expand)してから利用する【sympy】

# 前書き
繰り返し計算練習ができるサイトを作っているのですが、ある関数の動作で少し詰まったので備忘録代わりに書いておきます。

# coeff
coeffはsympyに備え付けられた関数です。
[(Polynomials Manipulation Module Reference)
](https://docs.sympy.org/latest/modules/polys/reference.html)

かなり広い使い方ができるようですが、自分はもっぱら多項式を用意して、指定した次数の係数を返してもらうのに使っています。

```python: coeff_sample1.py
import sympy as sy


x = sy.Symbol("x", real=True)
expr = x ** 2 - 5 * x + 6
print(expr.coeff(x, 2))
print(expr.coeff(x, 1))
print(expr.coeff(x, 0))
```

```: 出力
1
-5
6
```

何かと便利なのでよくお世話になるのですが、実はこのcoeffメソッド、式の与え方によって挙動が変わることがあります。私が引っ掛かったのはここですね。具体的には因数分解された形で計算すると、ごろっと挙動が変わります。

```python: coeff_sapmle2.py
import sympy as sy


x = sy.Symbol("x", real=True)
# expr = x ** 2 - 5 * x + 6
expr = (x - 2) * (x - 3)
print(expr.coeff(x, 2))
print(expr.coeff(x, 1))
print(expr.coeff(x, 0))
```

```: 出力
0
0
0
```

これを防ぐためには、expandをかませればokです。

```python: coeff_sample3.py
import sympy as sy


x = sy.Symbol("x", real=True)
# expr = x ** 2 - 5 * x + 6
# expr = (x - 2) * (x - 3)
expr = sy.expand((x - 2) * (x - 3))
print(expr.coeff(x, 2))
print(expr.coeff(x, 1))
print(expr.coeff(x, 0))
```

```: 出力
1
-5
6
```

これに気付かず半日くらい苦労しました。

# 後書き
ネット上であまり情報が見つからなかったので、結構苦労しました。思うに、もっともっと高度で複雑な計算のために利用している人が大半で、私のようにあらゆる数や式をLaTeX形式で出力してくれることの恩恵を一番重視しているユーザーがそこまで居ないのではないでしょうか。高校数学まででやるような初歩的な計算はあまり資料がないことも少なくありませんからね。

以上、短い上にニッチですが、どなたかの助けになれれば幸いです。
PythonとLightGBMを使った予測モデルの精度向上：ベイジアン最適化によるパラメータチューニング

こんにちは、今日はPythonのLightGBMモデルの学習におけるパラメータチューニングの一例として、ベイジアン最適化を用いた方法を紹介します。ここでは、Kaggleの「Titanic: Machine Learning from Disaster」というコンペティションを利用したサンプルコードを共有します。

まず、モジュールとデータを読み込みます：
```
import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.model_selection import cross_validate, GroupKFold
from bayes_opt import BayesianOptimization
from sklearn.metrics import mean_squared_error

train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
```
次に、LightGBMのパラメータを設定します：
```
lgb_params = {
    'objective': 'binary',
    'learning_rate': 0.01,
    'max_depth': 6,
    'num_leaves': 31,
    'min_child_samples': 20,
    'reg_alpha': 1,
    'reg_lambda': 1,
    'n_estimators': 1000,
    'colsample_bytree': 0.7,
    'subsample': 0.8,
    'random_state': 0
}
```
続いて、ベイジアン最適化のための関数を定義します：
```
def lgb_cross_val(learning_rate, num_leaves, max_depth, min_child_samples, reg_alpha, reg_lambda, n_estimators, colsample_bytree, subsample):
    params = {
        'objective': 'binary',
        'learning_rate': learning_rate,
        'max_depth': int(max_depth),
        'num_leaves': int(num_leaves),
        'min_child_samples': int(min_child_samples),
        'reg_alpha': reg_alpha,
        'reg_lambda': reg_lambda,
        'n_estimators': int(n_estimators),
        'colsample_bytree': colsample_bytree,
        'subsample': subsample,
        'random_state': 0
    }
    model = lgb.LGBMClassifier(**params)
    results = cross_validate(model, X, y, cv=5, scoring='accuracy', return_train_score=True)
    return results["test_score"].mean()
```
そして、ベイジアン最適化を実行します：
```
optimizer = BayesianOptimization(lgb_cross_val, {
    'learning_rate': (1e-4, 1e-2),
    'num_leaves': (10, 100),
    'max_depth': (2, 15),
    'min_child_samples': (5, 100),
    'reg_alpha': (0, 10),
    'reg_lambda': (0, 100),
    'n_estimators': (500, 3000),
    'colsample_bytree': (0.1, 1),
    'subsample': (0.1, 1)
}, random_state=0)
```

```
optimizer.maximize(init_points=10, n_iter=15)
```
最後に、最適化されたパラメータを使ってモデルを訓練します：
```
lgb_params.update(optimizer.max['params'])
lgb_params["max_depth"] = int(lgb_params["max_depth"])
lgb_params["num_leaves"] = int(lgb_params["num_leaves"])
lgb_params["min_child_samples"] = int(lgb_params["min_child_samples"])
lgb_params["n_estimators"] = int(lgb_params["n_estimators"])

model = lgb.LGBMClassifier(**lgb_params)
model.fit(X_train, y_train)

preds = model.predict(X_test)
accuracy = (preds == y_test).mean()
print('Accuracy:', accuracy)
```
以上がPythonのLightGBMモデルを学習する際にベイジアン最適化を使用してパラメータチューニングを行う方法の一例です。モデルの精度はデータセットやタスクによりますので、この方法が必ずしも最良の結果をもたらすとは限りません。それでも、このアプローチはパラメータ探索を効率的に行う一つの手法として、試す価値があると思います。
【Unity】手ごろかつ適度にパフォーマンスよさげなスクロール探し

深夜、余力があった時に覚え書き程度にメモしている内容です。
あんまり信用しないほうがいいかも。

# 0.Scroll Viewが重い、というのはある程度有名な話
> Unity標準のスクロールビューは、要素の数が増えるほど処理負荷とメモリの使用量が大きくなるため、スケール可能にするためには工夫が必要です。
例えば表示範囲外のGameObjectを非アクティブにしたり、オブジェクトプールを使って使い回したりすることが考えられます。
https://light11.hatenadiary.com/entry/2022/05/16/201949

この話は結構界隈で知られている（主観基準）話だろうと思うので、詳細は省くが、まあドローコールが云々みたいな話である。
この問題について、自分の手が届く範囲で、いろいろと検証しようというのが今日のお話。

:::note info
当方、Unity 2021.3.16f1環境にて進めてまいります
:::

# 1.準備
雑いが、とりま一列縦にスクロールする系のUnity標準スクロールビューを準備。
スクリプトからFPSとメモリだけ出しておく。
とりまプレファブを一つだけ表示してたら、まあこのへん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/fa946c4a-d98d-c364-0e68-c9a59cb97255.png)


https://note.com/extrier/n/n2b55ba09856f

# 2.Unity標準のScroll Viewのみの場合
プレファブを300個生成。ほぼ大半のボタンが画面に描画されていない状態。
FPSめっちゃ食われているが、目的のメモリも、少し右から左に削られてるわね。
ちなみに、このボタン生成はゲーム起動時から3秒後、と少しラグを敢えて作っている。
実際のスクロールビュー実装は、要素を後で足したくなることもあるもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/e4a0fbd6-07a9-cc99-f4b0-1ebe9b0584bc.png)

# 3.自分で頑張って非表示、はきっつい
まあ、この話は結局、見えていない部分を非表示にしたらいいんでしょってことがわかりきっているため、何かしらのアセットに頼るまでもなく自分で実装するのも悪くない。

https://www.stmn.tech/entry/2017/08/22/034350

まあ悪くないのだが、実際の開発現場では例外というやつがつきものである。
最初想定していなかった使い方が増発するため、正直コストに見合ってるかわからん。
とりま即時的な手としてはありだが、個人開発ならむしろ悪手では？
自分よりも幾ばくか長い時間、この問題に取り組んでいる諸氏の力を借りたほうが、断然クオリティも向上するというものである。

# 4.EnhancedScroller
この問題を調べると、絶対におすすめされるアセット。

https://assetstore.unity.com/packages/tools/gui/enhancedscroller-36378?locale=ja-JP

普通に高機能なScrollなので、パフォーマンスを置いておいても買っておくのはあり。
まあ、今回はパフォーマンスに絞って、このアセットを評価してみよう。

ってことで、手持ちで購入してあるものがあるので流用します。

適当にこれに書いてあるのをそのまま写して...

https://light11.hatenadiary.com/entry/2019/06/23/214020

300個生成した結果がこちら。
うん？なんかボタン君、前面に出てるな？調整ミスったんだろうけど、まあ本題じゃないし無視で。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/ab1b489a-202a-d723-d3a0-4d4aea34a0d5.png)

スクリプトが全然違うので、まあ純粋な比較はできないけど、FPSすごく向上してますね。
メモリも、初期状態より何なら最適化されているような。
さすが、界隈でもてはやされてるだけある。

# 5.Loop Scroll Rect & オブジェクトプール
まあここまではある程度既知の内容なのだが、今回満を持して比較検討させていただきたいのがこれ。

https://light11.hatenadiary.com/entry/2022/05/16/201949

『Loop Scroll Rect』というOSSと、Unity2021以降から標準実装のオブジェクトプールとの組み合わせ。
『Loop Scroll Rect』は日本語の参考資料が少なく、あとはこの記事くらいになると思われる（2023年5月時点）。

https://baba-s.hatenablog.com/entry/2019/01/10/150000

なので、好奇心から楽しみではある。早速やってみる。

まずは、オブジェクトプールつけてない版。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/4b9f5ba5-d546-f130-230f-4f9c19b7e935.png)

あれ、もうこの時点でEnhancedScrollerといい勝負してね？

じゃあ、オブジェクトプールつけた版。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/351d76e8-d2d4-7279-aa3f-e04ee7c02d4f.png)

おおう、FPS。
まあ、平均値とか厳密にはとらないとだから難しいが、そこまで悪い値ではないのでは？
これでOSSなのか、すっげー。

# 6.まとめ
EnhancedScrollerと比べ、Loop Scroll Rectのほうがより体感的に使えるような気がした。
ああ、深夜深夜と言ってたのに、いつの間にか夜が明けてる...（眩しい朝の光）。

# 7.ほかの参考にしたほうがいい記事
https://qiita.com/mogmet/items/38b2b34298180488b440
IIAS(Db2)のテーブルサイズ/テーブルスペース/物理ストレージの違いについて

# はじめに

世間ではDb2がリリースされて30年経ちますが、まだまだ私自身の知識や理解が追いついていない所となります。。。
テーブルのレコードを削除したのに何故、物理ストレージやテーブルスペースが減らないんだろう？という事があったため物理ストレージ、テーブルスペース、テーブルサイズについて記事にしたいと思います。



# 概要について

それぞれの領域の簡単な概要については以下の通りとなります。

物理ストレージ：DBの様々なデータ(テーブルスペース)群が格納される一番大枠となる領域。
テーブルスペース(表領域)：DBのシステムやデータをまとめて保管する領域。
テーブル：データ(レコード)を格納する領域。

# イメージ図

物理ストレージ、テーブルスペース、テーブルのイメージとしては以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3404025/e2e0338f-1c2b-46a4-220d-4c0ece95af24.png)

# データを削除した際の挙動について
テーブルのレコードを削除した際の各領域の変化についてまとめていきます。
以下のイメージではテーブルCとテーブルFのレコードをdeleteコマンドにより削除したイメージとなります。

deleteコマンドによりレコードを削除した場合は論理削除となり、物理的にはレコードまだ残っている状態となります。
(つまりテーブルとしては削除前のレコードも持った状態となります。)

そのため、delete後にselect countコマンドによるレコード件数結果が減ったように見えてもテーブルサイズは変わらないのは、論理削除レコードが残っているからとなります。

論理削除レコード削除してテーブルサイズを小さくするためにはreorgコマンドによるテーブルの再編成をすることで論理削除レコードを解放し、テーブルサイズを縮小することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3404025/671feeab-a97b-061c-5e17-f86f7dadadb3.png)



reorgによりテーブルサイズが小さくなったので、テーブルスペースや物理ストレージが合わせて小さくなるかというと、ならないようです。

以下のイメージ図のようにテーブルサイズが小さくなってもそのスペースはテーブルスペース内のフリースペースとして再利用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3404025/91fd08d6-4654-e3f3-bdd1-93a8a502c804.png)


テーブルスペース、物理ストレージも併せて縮小したい場合はalter tablespaceコマンドで縮小できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3404025/b4d04987-b57d-4ccf-63bb-2069f9ef399d.png)



なので、テーブルのレコードをdeleteしただけではテーブルのサイズも変割らない為、
目的に応じてdeleteコマンドで削除した後は、reorgやalter tablespaceコマンドで使われなくなった領域を解放してあげる必要があります。
antiX linuxで無線LANアダプタを使うために。

昔のMac mini活用ということでようやくたどりついたantiX。その軽妙な挙動に喜ぶのもつかの間。オンボードの無線LANデバイスが不調のため、放置していたGW-USmicroNというUSBデバイスを指したのだけれど、wifi接続できない。その試行錯誤。

lsusbコマンドで確認すると、ハードウェア的にはUSBを認識しているのがわかった。
```
Bus 001 Device 004: ID 2019:ed14 PLANEX GW-USMicroN
```

ただ、この段階でifconfigコマンドでネットワークインタフェースを確認しても、
USB無線LANアダプタを使った接続はできていなかった。

さて、GW-USmicroNの中に使われているのはRalinkTechnologyのRT2870というチップ。
antiXインストーラはRT2700USB関連モジュールもインストールしていたようだが、
それをOSが使えるようにするにはひと手間が必要だった。

(1) Ralinkファームウェアのインストール
Ralinkのファームウェアが入っているパッケージを調べたところ、
https://packages.debian.org/search?suite=bullseye&section=all&arch=any&searchon=names&keywords=Ralink
「firmware-misc-nonfree」だった。

```
$ sudo apt intall firmware-misc-nonfree
```

(2) RT2700USB関連モジュールを読み込むための定義ファイルを作る。
ファイル名「/etc/modprobe.d/gw-usmicron.conf」

ファイルの内容
```
install rt2800usb /sbin/modprobe --ignore-install rt2800usb; /bin/echo "2019 ed14" > /sys/bus/usb/drivers/rt2800usb/new_id
```
「2019 ed14」は(1)のlsusbコマンドで調べたハードウェアID。

(3) モジュールをロード
```
$ modprobe rt2800usb
```
これによって、ようやくifconfigでネットワークインタフェースが追加されているのが確認できた。


(4)起動時にモジュールをロードするように設定
/etc/modulesに「rt2800usb」行を追加。



▼参考ページ
https://unskilled.site/linux%E3%81%A7usb%E7%84%A1%E7%B7%9Alan%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/


...とはいったけど、linuxインストーラに入っているフリーウェアの？rt2800usbはいまいちらしい。
https://stejp.blogspot.com/2010/10/ralink-rt2870.html
UnrealEngine5.2.0でOpenCVを使ってみる

UnrealEngine5.2.0でEngine付属のOpenCVプラグインを利用してOpenCVを使ってみました。

試してみたプロジェクトのサンプルは以下となります（SceneCapture2DでキャプチャしたARマーカーを認識をして書き出すだけです、[OpenCVArUcoDetectMarkers](https://docs.unrealengine.com/5.1/en-US/BlueprintAPI/OpenCV/ArUco/OpenCVArUcoDetectMarkers/)使った方が良さそう）。
https://github.com/mechamogera/UnrealEngineOpenCVSample

ここではそこで気付いた内容をメモしておきます。

![detect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/6037d749-230d-63e3-f530-47f05e480d80.png)

# やり方

直接プロジェクトで利用する場合は.uprojectファイルに、プラグインにする場合は.upluginファイルでEngineのプラグインを利用するために以下のように記述します。

```json
	"Plugins": [
		{
			"Name": "OpenCV",
			"Enabled": true
		}
	]
```

Build.csでは以下のようにOpenCVHelperとOpenCVモジュールを指定します。

```csharp
PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				...
                "OpenCVHelper",
                "OpenCV"
            }
```

C++コードでopencvのヘッダをincludeする場合は以下のように[PreOpenCVHeaders.h](https://github.com/EpicGames/UnrealEngine/blob/5.2/Engine/Plugins/Runtime/OpenCV/Source/OpenCVHelper/Public/PreOpenCVHeaders.h)と[PostOpenCVHeaders.h](https://github.com/EpicGames/UnrealEngine/blob/5.2/Engine/Plugins/Runtime/OpenCV/Source/OpenCVHelper/Public/PostOpenCVHeaders.h)で囲む必要があるみたいです。
読み込み時に出るwarningを無視したりとヘッダ読込に必要な処理を行っているようです。


```cpp
#include "PreOpenCVHeaders.h"
#include <opencv2/core/mat.hpp>
#include <opencv2/aruco/dictionary.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "PostOpenCVHeaders.h"
```
# OpenCVのバージョン

以下を見るとopencv_world455.lib/dllがあるのでOpenCVのバージョンは[4.5.5](https://opencv.org/releases/)のようです。
UE_5.2\Engine\Plugins\Runtime\OpenCV\Source\ThirdParty\OpenCV\lib\Win64

# OpenCVHelper

## メモリ確保と解放

素のままのOpenCVを使うとメモリ確保と解放がEngine側と異なるためにstd::vectorの受け渡しをしたりするとクラッシュする場合があります。
OpenCVHelperではOpenCVに独自に埋め込んだメモリ確保と解放方法の設定関数を利用して、UnrealEngineのメモリ確保と解放方法を指定してこの問題を解消しているようです。

[OPenCVでのメモリ確保と解放方法の設定関数部分](https://github.com/EpicGames/UnrealEngine/blob/5.2/Engine/Plugins/Runtime/OpenCV/Source/ThirdParty/OpenCV/UnrealModules/unreal/src/unreal.cpp#L17-L24)
[OpenCVHelperでのメモリ確保と解放方法の設定](https://github.com/EpicGames/UnrealEngine/blob/5.2/Engine/Plugins/Runtime/OpenCV/Source/OpenCVHelper/Private/OpenCVHelperModule.cpp#LL91C14-L91C30)

## 参考になりそうなコード

[OpenCVHelpr.cpp](https://github.com/EpicGames/UnrealEngine/blob/5.2/Engine/Plugins/Runtime/OpenCV/Source/OpenCVHelper/Private/OpenCVHelper.cpp)にcv::MatからUTexture2Dを作成するコードがあったり
[OpenCVBlueprintFunctionLibrary.cpp](https://github.com/EpicGames/UnrealEngine/blob/5.2/Engine/Plugins/Runtime/OpenCV/Source/OpenCVHelper/Private/OpenCVBlueprintFunctionLibrary.cpp)でChessboardやArucoの認識（+オプションでカメラ位置に対するマーカーの3D姿勢推定）する関数があるので参考になりそうです。

# UnrealEngine4.27での利用について

Engine付属の[OpenCVLensDistortionプラグイン](https://github.com/EpicGames/UnrealEngine/tree/4.27/Engine/Plugins/Compositing/OpenCVLensDistortion)を利用することで同じように利用できる感じです。
ただし、OpenCVのバージョンは3.3.1になります。
運用保守の仕事の特徴について

# はじめに
運用保守の仕事の特徴についてまとめてみました。
※運用監視と運用保守も仕事内容が異なります。

ここ記事は運用保守について記載しています。

現場によっては技術スキルというよりコミュニケーションという現場もありましたが、
お問い合わせ対応は知識が必要です。


## 時間に正確である必要があります。
1分でも遅れたら遅刻です。
作業開始時間と終了時間は正確である必要があります。

時間制限があるため、運用作業についてもどうしたら効率的に作業が完了できるかを
事前に頭の中で振り返りをして準備する必要があります。


## マルチタスクになります。
依頼の量が多くマルチタスクになることがあります。
定時内で終わらせるために優先順位付けが大事になります。
2名体制で作業する場合があるため、確認者を確保して時間調整の必要があります。


## コミュニケーションが多く発生します。
お客さんとチーム内でコミュニケーションが多く発生します。
運用作業は2名体制があるため、一人で仕事したい方はあまりお勧めしないです。
メールでも頻繁にやりとりするため、以前より文章の書き方が上手になりました。


## 技術的なお問い合わせもあります。
運用保守は簡単な仕事だと思われますが、技術的なお問い合わせも来て
調査する必要がある場合があります。
自身の担当分野は専門知識は必要な場合があります。

## 障害対応出来るための知識が必要
障害が上がった際に対応になります。
一度対応したものはナレッジになりますが初めてのアラートについては
スピードが求められてサーバーの知識が必要になります。
日頃から勉強が必要です。

## 良くない例として休日、定時後でもアラートが上がれば対応がある場合があります。
現場によりますが、アラートが発報したら休日や定時後でも急な対応があることがあります。
オンオフを仕事で付けたい方はあまりお勧めな仕事ではないです。
保守契約によってアラート対応時間が異なるそうなので、現場で定時後と休日にアラート対応が
必要かどうか確認した方が良いです。

## 作業手順書も定期的に見直しが必要です。
時間が変わるとサーバーの状態が変わるため手順書についても定期的な見直しも必要です。
手順書が揃っていて頭を使わずに作業できる環境は、私がいた現場ではあまりありませんでした。


# まとめ
運用保守は簡単な仕事だと思われますが、
柔軟に時間を調整できる方と時間に正確である必要があります。
また効率的に時間内で終わらせるにはどうしたら良いかも考える必要があります。

品質を良くしようとしたら普段から学習が必要です。

運用保守に役立つ知識を張りました。良かったら参考にしてください
https://qiita.com/gama1234/items/44d9ab15f85c7f6881b4
【Django】超最短で複数キーワード検索の制御をする

Djangoのフォーム制御は一癖も二癖もあり、細かい制御をしていくとなるとけっこう煩雑になります。そのたびに分岐したりするのはすごく面倒なので、最短で複数のキーワードに対応できる方法がないか調べてみたところそれを実現しているページがあり、実装してみてこれはかなり使えると思い、更に簡略化したものを記事にしてみました。

記事の要件定義はMstBooksという書籍マスターから該当する作品(book_nm)をキーワード検索したい場合です。

```py:py
from django.db.models import Q
from functools import reduce
from operator import and_

  def(request):
    #中略
    if form.is_valid():
      keywords =  [''] if form.cleaned_data['keyword'] is '' else form.cleaned_data['keyword'].split()
      result = MstBooks.objects.filter(
        reduce(and_,[Q(book_nm__icontains=q) for q in keywords]),        
      ).order_by("id")
```

### **おわりです**



## 解説
流石にこれでは記事としてあんまりなので、解説を加えます。テンプレートにはname=keywordとなったテキストボックスがあり、ここにフリーワードが入力されます。

そして、Pythonの三項演算子の公式に従って、文字が複数入っている、または単一文字列の場合はsplit()制御によってオブジェクト化されます。splitは引数を何も入れない場合\sが基準となるので、複数ワードが入っている場合はきちんと文字が分けられ、単一ワードの場合は入力文字一つがオブジェクト化されます。対して無記入の場合は空の値を代入しておきます。こうやっておかないと、検索条件のreduceでエラーが発生します。

:::note alert
**TypeError: Reduce() of empty sequence with no initial value**
:::

## クエリセットの式
そして、クエリ検索条件にセットしている式はこのようになっています。

**`reduce(and_,[Q(book_nm__icontains=q) for q in keywords])`**

まずQオブジェクトでないと条件式をループできません。そしてPythonのループ式を使って、検索キーワードを一つずつicontainsに与えています。icontainsはlike演算子と同じ働きをするQオブジェクト上のメソッドです。

またreduceはループ処理を再帰的に実行してくれるものなので、どんどんと計算式を追記してくれます。その際、結合条件としているのがand_なので、これによってand文を次々と追記してくれるわけです。検索条件が存在しない場合は空オブジェクトが渡されます。

また、こうやっておけば、フォームを追加して検索条件を足したい場合でもすぐに対応できます。

### 検証
クエリに対し、queryプロパティを付与するとSQLを出力できます。

**print(result.query)**

```
SELECT `app_mstbooks`.`id`, `app_mstbooks`.`book_nm`, 
`app_mstbooks`.`book_yomi`,`app_mstbooks`.`auth_no`, `app_mstbooks`.`published`, 
`app_mstbooks`.`publisher`, `app_mstbooks`.`files`, `app_mstbooks`.`jitai`,
 `app_mstbooks`.`kana` FROM `app_mstbooks`  
WHERE (`app_mstbooks`.`book_nm` LIKE %の% AND `app_mstbooks`.`book_nm` LIKE %に% )) 
ORDER BY `app_mstbooks`.`id` ASC
```

このようにすればテキストボックスに「の　に」と入力すると「～の～」、「～に～」が含まれる書籍タイトルが検索されます。

- 城**の**崎**に**て
- 恩讐**の**彼方**に**
- 死**の**影**の**下**に**

※参考までに、未入力の場合はこのようになります。

```
app_mstbooks`.`book_nm` LIKE %%
```

## 参考にしたサイト
[【Django】サイト内検索機能を組み込んで複数のキーワード入力に対応させる](https://zerofromlight.com/blogs/detail/59/)
GitHub プルリクエスト

# プルリクエストとは
GitHubが提供する機能の一つ。作業者が他者にソースコードのレビュー（確認）と、ブランチへのマージを依頼する機能のことである。
他者にソースコードをレビューしてもらうことにより、品質の改善につながる。
プルリクエストの機能として、
<ul>
<li>プルリクエストを作成するとレビュー担当者に通知が行くので、確認漏れを防止できる</li>
<li>ソースコードの変更箇所を分かりやすく表示する</li>
<li>レビュー担当者はソースコードの修正してほしいところにコメントを投げることができる</li>
<li>上記のコメントは修正が完了するまで残るので、開発担当者は指摘された箇所を忘れず修正することができる</li>
</ul>

# 実際にプルリクをやってみよう
あらかじめ`origin`に適当なリモートリポジトリを追加しておいてください。リモートリポジトリが空の場合は、ローカルの内容をプッシュしておいてください。
```terminal
# masterブランチにいることを確認する
$ git branch
* master
# masterブランチを最新の状態にする
$ git pull origin master
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/Kasumin0123/git_test
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
Updating 2d5ae52..6c2c72e
Fast-forward
 home.html | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 home.html
# 新しいブランチを切って、変更を加える
$ git checkout -b pull_request
Switched to a new branch 'pull_request'
$ echo 'pull request' > pull_request.txt
$ git add .
$ git commit -m 'Create pull_request.txt'
[pull_request 23a0d8a] Create pull_request.txt
 1 file changed, 1 insertion(+)
 create mode 100644 pull_request.txt
# 変更をプッシュする
$ git push origin pull_request
```
変更をプッシュするところまで終わったら、いよいよプルリクエストを作成していく。

ブラウザからGitHubのリポジトリを開いて、上のタブにあるPull requestsをクリックする。そして、New pull requestボタンをクリックする。そうしたら
![スクリーンショット 2023-05-18 085303.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/bb75368c-1bc0-92a4-cff7-a6708bc3be9b.jpeg)
上の図のように、baseに`master`、compareに`pull_request`を指定する。baseはマージを行うブランチで、compareはマージしてもらうブランチである。

次に、Create pull requestボタンをクリックする。タイトルには先ほど書いたコミットメッセージ「Create pull_request.txt」と表示されているはずだ。タイトルは書き替えてもよいしそのままでもよい。後は本文に適当なメッセージを入力しておこう。今回はこのようにした。
![スクリーンショット 2023-05-18 091113.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/8ba42be5-b7ee-8d77-6437-1a2e08f85610.jpeg)
そうしたら、Create pull requestボタンを押す。これでプルリクエストが作成できた。後は、

![スクリーンショット 2023-05-18 091956.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/c8ddcee5-3598-451d-0c55-6318f0e2f235.jpeg)

画面の右側にあるReviewersをクリックして、レビューをお願いしたい人の名前を入力する。そうすることで、その人に通知が送られる。
【迷子】docker mysql  InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size 704 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!


## やりたいこと

- railsを動かしたく、エラーを解決したい

## エラー内容

- エラー1

```
docker mysql  InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size 704 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
```

./ibdata1を消す

- エラー2

```
[ERROR] InnoDB: File ./ibdata1: 'open' returned OS error 71. Cannot continue operation
```

イメージ消して再ビルド, docker compose up

- エラー3

```docker
/usr/local/bundle/gems/activesupport-7.0.4.3/lib/active_support/message_encryptor.rb:209:in `rescue in _decrypt': ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
```

decryptがなんか言っとる

## 調査

調査の前に、バージョンを整理する

- ruby:3.2.2
- Rails: 7.0.4.3
- mysql2: 0.5
- docker desktop(win): 20

[https://stackoverflow.com/questions/58527015/activesupportmessageencryptorinvalidmessage-activesupportmessageencrypto](https://stackoverflow.com/questions/58527015/activesupportmessageencryptorinvalidmessage-activesupportmessageencrypto)

> 
> 
> 1. remove this file:
> 
> ```
> $ rm config/credentials.yml.enc
> ```
> 
> 1. re-generate this file:
> 
> ```
> $ EDITOR="vim" bundle exec rails credentials:edit
> 
> ```
> 
> then try again
> 

[https://github.com/rails/rails/issues/31397](https://github.com/rails/rails/issues/31397)

credentials.yml.encはrais newの時にのみmaster.keyとセットで作られるのかな？

ターミナルでこのコマンド打とうとするが打てない

```docker
$ EDITOR="vim" bundle exec rails credentials:edit
```

## 原因

- credentials.yml.encを一度削除したので整合性が取れなくなった？

[https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)

## 解決策

- 0から作り直す

最後の手段

- dockerのコンテナでrailsコマンドを打ってcredentialsの編集を試みる

再度config/credentials.yml.encを削除する

winでは以下のコマンドを打つと良さそう

```docker
> $env:EDITOR="code --wait"
> rails credentials:edit
```

[https://stackoverflow.com/questions/57402435/how-to-run-rails-credentialsedit-on-windows-10-without-installing-a-linux-sub](https://stackoverflow.com/questions/57402435/how-to-run-rails-credentialsedit-on-windows-10-without-installing-a-linux-sub)

エラー1

```docker
Could not find mysql2-0.5.5 in locally installed gems
Run `bundle install --gemfile C:/Users/kr117/Desktop/myapp3/Gemfile` to install missing gems.
```

似た話題がissueに上がってる

[https://github.com/brianmario/mysql2/issues/1210](https://github.com/brianmario/mysql2/issues/1210)

```docker
gem install mysql2 --platform=ruby -- --with-mysql-dir=c:/Ruby32/msys32/mingw32
```

打ってみた

もうあるよと言ってる

> Gem files will remain installed in C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/mysql2-0.5.5 for inspection.
> 

bundle install 

失敗

mkmf.logに書いてあるというので見る

それっぽいエラーはあったが

> **error:** 'rb_wait_for_single_fd' undeclared (first use in this function)
> 

一旦最後の手段を取ることにした。

理解が追い付いたら加筆する。
0から9までの偶奇判定 - 初級から上級まで -

## はじめに

0から10までの数字の偶数奇数を判定するコードを普通のforとifを用いた表現(5行)、Pythonの内包表記を用いた表現(3行)、joinメソッドを用いた表現(1行)で示します。実行結果は、全て以下のようになりますが、コードは5行、3行、1行と短くなっていきます。Python初心者で、実行環境がない方は[Google Colaboratory](colab.research.google.com)でPythonを体験してみてください。

```python
0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
```

## 初級編

まず初心者はこのように書くのではないかと思います。最初に思いつくシンプルなコードですね。

```python
for i in range(10):
    if i%2==0:
        print(f'{i} is even')
    else:
        print(f'{i} is odd')
```

## 中級編

Pythonを使っていると内包表記に出会うことがあると思います。その内包表記を使ってこのコードをより短くします。ちなみに可読性のために3行にしていますがこのコードは簡単に2行にできます。

```python
even_or_odd = [str(i)+' is even' if i%2==0 else str(i)+' is odd' for i in range(10) ]
for ans in even_or_odd:
    print(ans)
```

## 上級編

joinメソッドまで使ってこのプログラムを限界まで圧縮しましょう。ここまでくると、可読性最悪です。Pythonはその気になればいくらでもコードを圧縮できるということですね。

```python
print('\n'.join([str(i)+' is even' if i%2==0 else str(i)+' is odd' for i in range(10)]))
```

## おまけ

Chat GPTにより短くしてもらったコードが以下です。さすがですね、iとisをそれぞれ1回ずつ使うことでコードをより圧縮しています。

```python
print('\n'.join([f'{i} is {"even" if i%2==0 else "odd"}' for i in range(10)]))
```
初心者がお伝えするBizRobo!のその機能もっと早く知りたかった ～パターンの置き換え～


皆さんは、コンバータの中の１つの機能である「パターンの置き換え」を使用したことがありますか？
この機能「特定の文字列を変数に置き換えたい」「正規表現で該当する値をテキストに置き換えたい」という方にぴったりの機能なんです。

「パターンの置き換え」について、コンバータ内の類似機能である「テキストの置き換え」と比較しながら説明していきます。

# テキストの置き換え
指定した文字列を別の文字列に置き換えることができます。

【できること】
・テキストをテキストへ置き換え
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/69a4a188-bd81-13c4-8f62-6df4f591a297.png)
・特定の文字列をすべて削除
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/e24a564c-23f0-8bd2-24ee-0ad0338a4c82.png)
【できないこと】
・正規表現の使用
・変数への置き換え
・一度に複数種の文字列の置き換え


# パターンの置き換え
正規表現を使用して、指定した文字列を別の文字列もしくは変数に置き換えることができます。

【できること】
・正規表現に該当する値をテキストへ置き換え
![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/b7436889-2c12-0ecd-fd81-741f837d7d72.png)
・正規表現に該当する値を変数へ置き換え
・一度に複数種の文字列の置き換え
![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/4b111feb-c135-351f-db00-2aea7c577832.png)


# 
今回は定型文の一部を変数に置き換えるという内容だったので、パターンの欄に固定値であるテキスト（該当者や開始日）を記入して使用しました。

ただ、大元のテキストが定型文ではなく変動する可能性がある場合は、**固定値を除いた部分はすべて正規表現で表記**してください。
エラーの原因となってしまいます。


誰かのお役に立てれば嬉しいです。
最後までお読みいただきありがとうございました。
PyTorchのDataLoaderにおけるCPUメモリに乗り切らないデータ(h5)のハンドリング

# 前提とやりたいこと
- h5ファイルの1つの`dataset`に特徴量がドカッとまとめられている`(N, features)` 
- 特徴量は既にシャッフルされており、dataloaderでシャッフルし直す必要はない
- N個のデータセットはCPUメモリに一度に載せることができないぐらい大きく、一度にn個しか載せられない(N = O(1)*n ~ O(10)*n)
- `torch.utils.data.Dataset`を継承したカスタムデータセットクラスを作成することでindexを指定して1つずつh5ファイルから読み出すこともできるが信じられないぐらい遅い
- ので、一度にn個をドカっと読み込みたい

# 解決法
- カスタムデータセットクラスの`__getitem__`メソッドを変更する
- `DataLoader`の`batch_size`を1に設定し、`collate_fn`をカスタマイズして、`__getitem__`メソッドで取得したデータセットをそのまま返すようにする
- 一度に読み込む量は`preload_factor`で設定する
- 学習時に`batch_size`ごとに小分けして取り出す



```Python
import h5py
import torch
from torch.utils.data import Dataset

class H5Dataset(Dataset):
    def __init__(self, h5_file, preload_factor, transform=None):
        self.h5_file = h5_file
        self.preload_factor = preload_factor
        self.transform = transform

    def __len__(self):
        with h5py.File(self.h5_file, 'r') as f:
            return (len(f['features']) - 1) // self.preload_factor + 1

    def __getitem__(self, idx):
        with h5py.File(self.h5_file, 'r') as f:
            start = idx * self.preload_factor
            end = start + self.preload_factor
            features = f['features'][start:end]
            labels = f['labels'][start:end]


        if self.transform:
            features = self.transform(features)

        return torch.tensor(features), torch.tensor(labels)

def collate_fn(batch):
    return batch[0]

h5_file = 'your_h5_file_path.h5'
batch_size = 1000
preload_factor = 1000000

dataset = H5Dataset(h5_file, preload_factor=preload_factor)
dataloader = DataLoader(dataset, batch_size=1, shuffle=False, collate_fn=collate_fn)

for batch in dataloader:
    # バッチの処理
    for i in range(0, batch.shape[0], batch_size):
        mini_batch = batch[i:i+batch_size]
        # ここで深層学習モデルの学習を行う

```

# 注意
- h5ファイルの時点でシャッフルされている必要がある（されていない場合、通常の方法で作成したdataloaderでshuffle=Trueした場合と、この方法でshuffle=Trueした場合とで挙動が異なってしまう為）
【Flutter】Colorでカラーコード（Hex）を指定したい

# どういうことか

例えば `Colors.blue` ではなく `#0000FF` を指定したい。

## 指定する

```dart
Color(0xFF0000FF),
```

`Color(0000FF)` では反映されない。
**頭に `0xFF` を付ける必要がある**（どの色でも）。

## ちなみに

`FF` 部分を変更すると透明度を設定できる。

### 参考

https://qiita.com/sudo5in5k/items/5baf13619425a9ad3d28
react-router-domのLinkで遷移時に destroy is not a function TypeError: destroy is not a function のエラーが出る時のエラー回避方法


## 変更前

```javascript
    useEffect(async () => {
        setLoading(false);
        const res = await api.get('/clients');
        console.log('get clients');
        console.log(res);
        setClients(res.result);
    }, []);

```


## 変更後

```javascript
    const getClients = async () => {
        const res = await api.get('/clients');
        console.log('get clients');
        console.log(res);
        setClients(res.result);
    };

    useEffect(() => {
        setLoading(false);
        getClients();
    }, []);
```

でエラーを回避できた。
`useEffect` にasync は基本つけない方が良さそう、とだけ。
以前は何も考えずに書いていた気もしてる。
以上備忘録。
データサイエンスのための微分積分 第6回 一般的な関数の極限

:::note info
本記事は数学講座[2.5一般的な関数の極限](https://www.matongxue.com/lessons/583/parts/922)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# :sunny:まとめ

ここまでに、三つの極限を勉強しました。
- 数列の極限
- 無限大になる関数の極限
- 一般的な関数極限

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/6d122ea9-b805-6ad4-9f65-359eac8f6145.png)


# 一般的な関数極限

**定義：**

関数 $f(x) が \mathring{U}(x_0) $上で定義されているとします。もし、$\forall \epsilon > 0 、\exists \delta > 0 、\forall x\in\mathring{U}(x_0,\delta) $に対して以下が成り立つ場合：

```math  
|f(x) - L| < \epsilon
```


そのとき、$L$を関数$ f(x) の x が x_0 $に近づくときの**極限**と呼びます。また、$x が x_0 $に近づくとき関数$ f(x) が L$ に **収束** するとも言い、以下のように表します：

```math  
\lim_{x\to x_0}f(x)=L\quad \text{または}\quad f(x)\to L(x\to x_0)
```

もし、このような定数$ L $が存在しない場合、関数 $f(x) が x が x_0 $に近づくとき **極限 を持たない**と言い、または関数$ f(x) $が **発散** すると言います。また、$\displaystyle\lim_{x\to x_0}f(x) $が存在しないとも言います。

これも数列の極限、無限大になる関数と同じような定義です。
- 同じところ：まず極限$L$を推測してから検証
- 違いところは：$x$の定義範囲

```math  

\begin{array}{c|c|c}
    \hline
    \quad \text{数列の極限}\quad&\quad \text{無限大関数極限}\quad&\quad \text{一般的な関数極限}\quad \\
    \hline \\
    \text{数列}\ \{a_n\} &\quad\ |x|\ \text{> 某正数時}\quad&\ \mathring{U}(x_0)\ \quad\\\
    \exists N\in\mathbb{Z}^{+} & \exists X > 0 & \exists \delta > 0\\
    \forall n > N & \forall |x| > X & \forall x\in\mathring{U}(x_0,\delta)\\
    \\
    \hline
\end{array}

```

# 一般的な関数極限の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/c5d4635c-f5d2-2620-de19-bb8d189952c2.png)


# 左極限と右極限

左極限と右極限の定義は上の一般的な関数極限とほぼ同じで、違いところは$x$の範囲です。

```math  

\begin{array}{c|c|c}
    \hline
    \quad \text{一般的な関数極限}\quad&\quad \text{左極限}\quad&\quad \text{右極限}\quad \\
    \hline \\
    \ \mathring{U}(x_0)\quad&\quad \ (a,x_0)\ \quad&\quad \ (x_0,b)\ \quad\\\
    \forall x\in\mathring{U}(x_0,\delta) & \forall x\in(x_0-\delta,x_0) & \forall x\in(x_0,x_0+\delta)\\
    \\
    \hline
\end{array}
```

# 一般的な関数極限存在の充分必要な条件

これも無限大になる関数のと同じで、一般的な関数極限存在の条件が、左極限及び右極限も存在され、且つ等しいです。

```math  
\lim_{x\to x_0^-}f(x)=\lim_{x\to x_0^+}f(x)=L\iff\lim_{x\to x_0}f(x)=L
```


# 補足

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/63d31159-0ace-53f4-327f-e7a17c27972e.png)


# 参照

https://math-jp.net/2017/06/26/function-limit/
firebase storageにpython から画像をアップロードしようとした時のエラー備忘録

## 概要

Python のバックエンド（FastAPI)を通して
Firebase Storage に画像ファイルをアップロードしようとした時のこと。
以下のようなエラーになっていた。


## エラー

```
google.api_core.exceptions.NotFound: 404 POST https://storage.googleapis.com/upload/storage/v1/b/gs://xxxxxx.appspot.com/o?uploadType=multipart: Not Found: ('Request failed with status code', 404, 'Expected one of', <HTTPStatus.OK: 200>)
```


## 解決策

https://medium.com/@abdelhedihlel/upload-files-to-firebase-storage-using-python-782213060064

ここのFourth Stepにあるように、
gs:// は省略しておかなければならない。

```python
cred = credentials.Certificate("firebase.json")
firebase_admin.initialize_app(cred, {"storageBucket": "gs://xxx.appspot.com"})
```

ではなく、

```python
cred = credentials.Certificate("firebase.json")
firebase_admin.initialize_app(cred, {"storageBucket": "xxx.appspot.com"})
```

だと通る。
備忘録として残しておく。
Fortigateでルーティング

fortigateを挟んでswitchからPCへpingが疎通が出来る構成にします。

## 環境
* PC_Windows11
* FortiGate60D v6.0.7
* Catalyst3560

# イメージ図
<img width="700" alt="fortigate@ルーティングイメージ図.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/68cdddc8-0297-cb03-9e8b-ac1a2f02a5d7.jpeg">


# Catalyst設定

vlanを作成してipアドレスを設定。
今回はdmzにlanを接続するため、modeはtrunkにする。（Catalyst3560_123の設定）
セグメント跨いでの通信のため、スタティックルート、デフォルトルートの設定も忘れず。
accessモートでも通信可能。その場合は物理ポートにIPアドレスを設定。（Catalyst3560_456の設定）
```php:Switch123#show running-config 
Building configuration...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
interface GigabitEthernet0/8
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 30
 switchport mode trunk
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
interface Vlan30
 ip address 192.168.1.252 255.255.255.0
!
ip default-gateway 192.168.1.254
ip classless
ip route 172.16.30.0 255.255.255.0 192.168.1.254
ip route 192.168.1.0 255.255.255.0 192.168.1.254
```

# fortigate設定

* タイプを「ip範囲」に設定して各ノードのIPアドレスを設定。
 「サブネット」のタイプはセグメントを指定する時に用いる。
* インターフェースは「any」
* アドレスリスト表示にチェック
* スタティックルートはチェックしない

<img width="700" alt="fortigate@ルーティング追加1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/571c79bc-072e-06b5-19bf-d6f8f2dc981f.png">
<img width="700" alt="fortigate2(1).PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/17620b72-f7e8-a7f1-aac3-1e3870655f9c.png">


i/fに接続ノードのデフォルトゲートウェイとなるIPアドレスを設定。
vlanにIPアドレスをふったスイッチを接続するため、vlanのi/fを作成し、dmzに紐付けている。
※デフォルトからだと一つのハードウェアスイッチに物理ポートがまとめられているので、編集でi/fメンバーから物理ポートを切り離す。
* タイプを「VLAN」
* インターフェースは紐付けたいi/fを選択
* VLAN ID、ip/ネットワークマスク入力
* ロールはLANを選択。I/Fにロールを割り当てることで、GUI で設定できる項目が変わります。LANが一番設定出来る項目数が多い。
* 管理アクセスはFortigate60Dにアクセスするプロトコルを制限。

<img width="700" alt="fortigate@ルーティング追加2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/c3ca6c1d-e706-e43e-b07a-c76cb6730b8f.png">
<img width="700" alt="fortigate3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/a80708f5-3f66-a5de-d6c9-e0d3203da9aa.png">

異なるセグメント間のポリシーを設定。
* 入出力i/fは、物理か仮想i/fを指定。
* 送信元/宛先は、アドレス欄で作成したものを指定する。
* pingで疎通確認したいので、サービスのところでAll_ICMPを設定している。
* NATはチェックを入れたままにして、「送信インターフェイスのアドレスを使用」を選択。
  この場合だと、fortiからPCに向かう通信の送信元がNAT変換されるので、PCにスタティックルートを設定する必要が無くなる。
* FWログを確認したい場合は、編集からロギングオプションで「すべてのセッション」を選択。

<img width="700" alt="fortigate@ルーティング追加3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/28af79fb-0664-39ec-51ed-01033a5c8b30.png">
<img width="700" alt="fortigate1(1).PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/9b3552ed-a087-5f85-b65f-59ebf4e72ff1.png">

上から４つがスイッチからPCへpingしたときのFWログ。（この時設定したポリシー名と上のスクショにあるポリシー名だっけ変更してあるが同じ）
<img width="700" alt="fortigate log.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/c1f27014-435e-5021-a64e-79529cdbcbd1.png">
Pythonでディレクトリ・ツリーを表示してみました


## 概要

ディレクトリの指定位置からのその配下のディレクトリ＋ファイル構成を取得するプログラムです。

### 実行環境

macOS Ventura 13.0 
python 3.8.12

### 実行プログラム

```python:directory_tree.py
from pathlib import Path
import argparse
import time

DIR_PATH = './'


# ディレクトリツリーの表示
def print_directory_tree(dir):
    path = Path(dir)
    print(f'+ {path.absolute()}')
    for entry in path.iterdir():
        if entry.is_dir():
            print_directory_tree(entry)
        else:
            print(f'  - {entry.name}')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='ディレクトリツリーの表示')
    parser.add_argument('-d', '--dir', type=str, default=DIR_PATH, help='ディレクトリツリーを取得したいルートディレクトリの定義')
    args = parser.parse_args()

    # 経過時間の計測開始
    start = time.time()
    print_directory_tree(args.dir)
    generate_time = time.time() - start

    print("\n処理時間:{0}".format(generate_time) + " [sec]\n")
```

### プログラムの実行

```
## 為替レートの取得
$ python directory_tree.py                         
+ /Users/ituru/MyDevelops/ALog_ZiDOMA/HeaderEncryptionTest
  - directory_tree.py
  - sample01.txt
  - file_access.py
+ /Users/ituru/MyDevelops/ALog_ZiDOMA/HeaderEncryptionTest/wireshark
  - test100m_4096.pcapng
  - test1g_4096.pcapng
  - test100m_1024.pcapng
  - test1g_1024.pcapng

処理時間:0.0012269351959228516 [sec]
```

### まとめ

サクッとディレクトリ情報を取得したいときに必要になるかも、、、、
また、このプログラムを使用してファイルサーバにアクセスしたときのイベントログの確認に利用できそうです。
Pythonでファイルオープンのみしてみました


## 概要

純粋にファイルをオープンするためだけのプログラムです。そのときのイベントログの種類を確認したかっただけです。

### 実行環境

macOS Ventura 13.0 
python 3.8.12

### 実行プログラム

```python:file_access.py
import argparse
import time

FILE_PATH = './sample01.txt'


# ファイルオープン
def print_file_access(file_path):
    with open(file_path, 'rb') as f:
        pass
        print('\nオープンしたファイル名 : ', file_path)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='ファイルをオープンするだけのプログラム')
    parser.add_argument('-f', '--file', type=str, default=FILE_PATH, help='オープンしたいファイルの定義')
    args = parser.parse_args()

    # 経過時間の計測開始
    start = time.time()
    print_file_access(args.file)
    generate_time = time.time() - start

    print("\n処理時間:{0}".format(generate_time) + " [sec]\n")
```

### プログラムの実行

```
$ python file_access.py   

オープンしたファイル名 :  ./sample01.txt

処理時間:7.104873657226562e-05 [sec]
```

### まとめ

このプログラムを使用してファイルサーバにあるファイルをオープンしただけのときのイベントログの確認に利用できそうです。
Ruby on Railsの初心者が陥りやすいエラーとその解決方法

## 1. はじめに
この記事では、Ruby on Rails（以下、Rails）を学んでいる初心者が陥りやすいエラーと、それらの解決方法について解説します。Rails初心者や、エラーの対処方法に迷ったことのある方に向けて、エラーが発生する原因や対処方法を具体的に紹介します。

## 2. 初心者が陥りやすいエラー
### 2.1. NoMethodError (undefined method `xxx' for #Controller:... Did you mean? yyy)
#### エラーの説明
このエラーは、コントローラで定義していないメソッドを呼び出している場合に発生します。Railsが提案するメソッド名（Did you mean?の部分）を提示してくれることがあります。

#### エラーが発生する原因
-スペルミスや入力ミスがある場合
-対象のメソッドが定義されていない場合
-対象のメソッドがprivateまたはprotectedになっている場合
#### 解決方法
-スペルミスや入力ミスを確認して修正する。
-対象のメソッドを定義する。
-privateまたはprotectedになっているメソッドをpublicに変更する（必要に応じて）。

#### 実例
```
NoMethodError (undefined method `redirect_if_sold' for #OrdersController:0x00007f98e1620eb8 Did you mean? redirect_to)
```
この実例では、OrdersControllerでredirect_if_soldメソッドが定義されていないか、スペルミスが発生している可能性があります。対処方法として、OrdersControllerにredirect_if_soldメソッドを定義します。

```ruby```
```
class OrdersController < ApplicationController
  before_action :redirect_if_sold, only: [:create]

  # ...その他のコード...

  private

  def redirect_if_sold
    # ここにredirect_if_soldメソッドの処理を記述
  end
end
```

## 3. 珍しいエラー
### 3.1. Warning: already initialized constant XXX
#### エラーの説明
このエラーは、すでに定義されている定数を再度定義しようとした場合に発生します。重複した定数の定義がないか確認する必要があります。

#### エラーが発生する原因
-定数の重複定義がある場合
-他のライブラリやgemが定数の衝突を引き起こす場合
#### 解決方法
-重複している定数の定義を削除または変更する。
もしgemやライブラリが原因の場合、使用するgemやライブラリを変更するか、定数名を変更する。

#### 実例
```
warning: already initialized constant Net::ProtocRetryError
```

この実例では、Net::ProtocRetryError定数が既に定義されているため、警告が表示されます。対処方法として、重複している定数定義を削除または変更します。

### 4. まとめ
本記事では、Rails初心者が陥りやすいエラーと珍しいエラーについて取り上げました。エラーが発生したときに、原因と解決方法を理解し、効果的に対処できることが、今後の開発に役立つことでしょう。
[自分用]Next.jsのLinkについて

## なぜLinkを使用するのか
ページ遷移とかなら通常のHTMLのようにaタグで実装できる。
なのになぜLinkを使用するのか。それは、aタグを使用すると共通コンポーネントに関わらずページ全てを更新してしまうから。

例）index.jsとabout.jsの違いはタイトルが「index.jsなのか、それともabout.jsなのか」の違いだけ。
それなのにページ遷移をすると背景色まで変わってしまう。

といった感じで本来は更新してほしくない部分まで更新されてしまう。
さらには全体を更新することにより、パフォーマンス低下の原因にもなってしまう。

## Linkの使い方
上記を解決するのがLinkコンポーネント。
使うときはLinkをインポートしてから、Linkタグでaタグを囲うように記述する。

※厳密にはLinkがaタグに置き換わるので本来は記述しなくていいのだが、過去のバージョンではaタグを記述していたことが大きので合わせいる。
2023/05/18現在のバージョンでは`legacyBehavior`を記述しないとエラーになる。

aタグを記述しない方法も、公式で定義されているので問題なく使用していいはず。そこはチームで要相談してほしい。

```jsx
import Link from "next/link"

export finction Header(){
  return(
    <div>
      <Link legacyBehavior href="/about">
        <a>about.js</a>
      </Link>
    </div>
  )
}
```
こうすることでページ全体ではなく「必要な部分（変更された部分）だけの変更」のみを行うことができるようになった。
またprefetch機能（事前にページを取得する機能）が備わっているため、さらにaタグより良いパフォーマンスができる。
【解決方法】ActiveRecord::ConnectionNotEstablished とは？

Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
アプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
今回の記事では、ActiveRecord::ConnectionNotEstablishedというエラーの解決方法をお話しします。

![スクリーンショット 2023-05-18 6.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/590252c5-4eac-3507-650b-48f6b8432e91.png)


これはRailsアプリケーションがデータベースに接続できないことを示しています。
一般的に、このエラーはPostgreSQLデータベースに接続できない場合に発生します。

エラーメッセージによれば、接続しようとしたソケットファイル「/tmp/.s.PGSQL.5432」が存在しないため、接続に失敗しています。
これは、PostgreSQLサーバーが起動していないか、接続に使用するソケットパスが正しく設定されていない可能性があります。

手順は画像の通りに進めていきます。
![スクリーンショット 2023-05-18 6.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/8464cdd1-514d-3922-0616-0d205f7ae1e7.png)
このようにPostgreSQLサーバーが起動が起動していなかったために起こるエラーなので、サーバーを起動すればエラーは消えるはずです。

▼ターミナルで　rails s　をしていたならControl+cで閉じて、開きたいアプリのディレクトリにいることを確認し
![スクリーンショット 2023-05-18 6.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/1efb6b6b-a2a4-3575-9486-a5975707f37f.png)
▼ターミナルコマンドでサーバー起動のコマンドを入れる
![スクリーンショット 2023-05-18 6.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/065fae02-e216-ac07-390f-9e2b1b9ba3fd.png)

▼コマンドを入れるとサーバーがスタートする
![スクリーンショット 2023-05-18 6.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/26aa00f4-80e3-d2ee-da7c-034d8e7c4164.png)
▼その後 rails s でローカルホスト3000を立ち上げてあげれば起動します。
![スクリーンショット 2023-05-18 6.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/7ba941f3-af5b-96b1-7407-a146865eccaf.png)

いかがでしたでしょうか？
他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎です。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
Jupyter notebook を Windows 環境で実行する方法 3パターン

### JupyterNotebook を Windows 環境で実行する

Windows 端末に直接 Python や Anaconda をインストールせず
Docker や WSL を使って 環境構築するための手順です。

#### Docker を利用する方法

PowerShellで 以下のコマンドを実行します。

```
docker pull jupyter/scipy-notebook
docker run --rm -it -v $PWD\:/home/jovyan/work -p 8888:8888 --name jupyter jupyter/scipy-notebook
```

起動すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134762/f765861e-2aa3-8793-b04e-8db968e8b8c0.png)
のように起動URLが表示されるので

`http://127.0.0.1:8888/lab?token=＊＊＊＊＊`

のＵＲＬ を ブラウザで開きます。

プログラムを終了する場合は PowerShell の画面で `CTRL+C` を押すと

`Shutdown this Jupyter server (y/[n])?`

と聞かれるので `y` を入力して終了します。

#### WSL を利用する方法

https://www.anaconda.com/download#downloads から Linux 版をダウンロードしてインストールします。

```
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh
chmod +x Anaconda3-2023.03-1-Linux-x86_64.sh
./Anaconda3-2023.03-1-Linux-x86_64.sh
```

JupterLab をインストールします。

```
pip install jupyterlab
```

作業ディレクトリで

```
jupyter lab 
```

コマンドを打鍵すると Jupter Notebook 起動のURLが表示されるので
ブラウザで開きます。

#### Docker compose を利用する方法

`docker-compose.yml` `Dockerfile` ファイルを下記の内容で作成します。

``` docker-compose.yml
version: '3.7'

services:
  jupyter:
    image: jupyter
    build:
      context: .
    environment:
      JUPYTER_PORT: 8889
    ports:
      - "8889:8889"
    volumes:
      - .:/home/jovyan/work
```

`Dockerfile`
``` Dockerfile
FROM jupyter/scipy-notebook
```

コマンドプロンプトから

```
docker compose up
```

を打鍵します。

### まとめ

Jupyter Notebook を Windows 環境で実行する方法を簡単に説明しました。

一番おすすめは `Docker compose` を利用する方法ですね。

Windows 側の 環境を汚すことなく サクッと試してみる事が簡単にできます。
【Python】娘との会話シミュレーター「家族の正体編」

### 概要

3歳の長女が全知全能でした。急に家族の正体を語りだしたので、そのやりとりをPythonでやっつけプログラミングしました。

### コード

```python
def ask_shoutai():
    dict = {'私':'神様', 'お母さん':'奥様', 'お父さん':'忍者', '妹':'赤ちゃん'}
    keys = ''
    for key in dict:
        keys = keys + ' ' + key
    print(f'[{keys} ]')
    print('------------')

    person = input('「だれ？」：')

    try:
        return print(f'「{person}は、{dict[person]}！」')
    except:
        return print('「知らない」')

ask_shoutai()
```

### 実行結果

```
[ 私 お母さん お父さん 妹 ]
------------
「だれ？」：私
「私は、神様！」

[ 私 お母さん お父さん 妹 ]
------------
「だれ？」：お父さん
「お父さんは、忍者！」

[ 私 お母さん お父さん 妹 ]
------------
「だれ？」：お父さんは、黒以外の服も着た方がいいと思う？
「知らない」
```

変数名の付け方とか、デファクトスタンダードを知ってそれに合わせたい…
データサイエンスのための微分積分 第5回 無限大になる関数の極限

:::note info
本記事は数学講座[2.4無限に近づく関数の極限](https://www.matongxue.com/lessons/582/parts/919)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 離散から連続へ
関数は数学の中で最も研究されている対象ですので、このレッスンでは、**数列の極限**を無限に近づく**関数の極限**にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/04d34520-9f8e-e954-4b35-935fd4ec7c31.png)

# 無限大になる関数の極限

元々数列に関する定義では、正数の$N$なので、関数の極限定義になると、定義も変更が必要です。

**定義：**
$|x|$ が某正数より大きいときに、関数 $f(x)$があります。
もし、$\forall \epsilon > 0$ 、$\exists X > 0 $、$\forall |x| > X $に対して以下が成り立つ場合：

$|f(x)-L| < \epsilon,\quad L\in\mathbb{R}$

そのとき、$L $を関数 $f(x) の x $が無限大に向かうときの **極限** と呼びます。また、$x$ が無限大に向かうとき関数$ f(x) が L $に **収束** するとも言い、以下のように表します：

$\lim_{x\to\infty}f(x)=L\quad\text{または}\quad f(x)\to L(x\to \infty)$

もし、このような定数$ L $が**存在しない**場合、関数 $f(x) $が $x $が無限大に向かうとき **極限 を持たない**と言い、または関数 $f(x) $が **発散** すると言います。また、$\displaystyle\lim_{x\to\infty}f(x)$ が存在しないとも言います。

関数の極限定義は、数列と同じなのは、まず極限値$L$を推測してから、この$L$を検証します。

違うところは：

```math  

\begin{array}{c|c}
    \hline
    \quad \text{数列極限} \quad\quad&\quad x\to\infty\ \text{の関数極限}\quad \\
    \hline \\
    \text{数列}\ \{a_n\} &\quad \text{関数}\ f(x)\ \text{が}\ |x|\ \text{某正数より大きいとき存在}\quad\\
    \exists N\in\mathbb{Z}^{+} & \exists X > 0\\
    \forall n > N & \forall |x| > X\\
    \\
    \hline
\end{array}

```

# 無限大になる関数の極限例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/b4031947-77dd-38ec-aba3-4b5854e2e187.png)

# 正の無限大、または負の無限大になる関数の極限

正の無限大、または負の無限大になる関数の極限、無限大になる関数の極限、これら三つの定義がほとんど同じです。
違いところは、$x$の範囲です。
```math  

\begin{array}{c|c|c}
    \hline
    \quad x\to\infty\ \text{関数極限} \quad&\quad x\to+\infty\ \text{関数極限} \quad&\quad x\to-\infty\ \text{関数極限}\quad \\
    \hline\\
    |x|\ \text{＞某正数} & x\ \text{>某数} & x\ \text{<某数}\\
    \forall |x| > X & \forall x  > X & \forall x < -X\\\\
    \hline
\end{array}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/825f452e-14ea-bb62-1ab1-b44ba59cde5d.png)

# 無限大の極限が存在するための十分条件

無限大になる関数の極限が存在の充分必要な条件が：正の無限大、または負の無限大になる関数の極限が存在且つ同じです。

```math  
\lim_{x\to-\infty}f(x)=\lim_{x\to+\infty}f(x)=L\iff\lim_{x\to\infty}f(x)=L
```
以下の例を参照：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/b03a90ec-7a4b-74e7-7021-0934a362ce11.png)
Start up - node.js / JavaScript / TypeScript 

(日記) Typescriptのプロジェクトを用意するルーチンワーク

環境
---
- Raspberry PI 4
- Ubuntu 22.04 Server

node.js導入
---
```sh
sudo apt install npm -y
sudo -E npm -g i n
sudo -E n latest
# 最新node.jsを実行パスに通すためshell再起動
```

<details>
<summary>動作確認</summary>
簡単なJavaScript/TypeScript実行

```sh:Version確認
npm -v
node -v
```

```js:サンプル(index.js/index.ts)
console.log(`This is ${process.argv[1]}.`)
```

```sh:JavaScript実行
node index.js
# This is /.../index.js.
```

```sh:TypeScript実行
npx -y ts-node index.ts
# This is /.../index.ts.
```
</details>

JavaScriptプロジェクト作成
---
```sh:Javascriptプロジェクト
npm init -y
```
`package.json`が生成される。

<details>
<summary>依存モジュール追加</summary>

```sh:依存モジュール追加
npm i axios # 例:axiosを使用する場合
```

依存モジュールは`./node_modules`以下にダウンロードされ、`package.json`に記載される。
以降 `npm i`で`package.json`に記載済の依存モジュールをすべてダウンロードできる。
</details>

<details> <summary>(おまけ) 中間生成ファイルをコミットしたくない</summary>

```:.gitignore サンプル
/node_modules/
/package-lock.json
/build/
```
</details>

TypeScriptプロジェクト作成
---
```sh:Typescriptプロジェクト
npm init -y
npm i -D typescript @types/node
npx tsc --init --rootDir src --outDir build
```
`tsconfig.json`が生成される
好みでソースとビルドディレクトリを指定


TypeScriptのビルドと実行
---

```sh:Build & Run
npx tsc
node build/index.js
```
`src`ディレクトリ以下のtsファイルがビルドされ`build`ディレクトリ以下にjsファイルが生成される。


```sh:ts-nodeで実行する場合
npx -y ts-node index.ts
# This is /home/ubuntu/.npm/_npx/1bf7c3c15bf47d04/node_modules/.bin/ts-node.
```

バンドル/圧縮 - [Webpack](https://webpack.js.org/)
---
導入
```
npm i --save-dev webpack webpack-cli crypto-browserify child_process stream-browserify dgram-browserify net-browserify
```

```js:webpack.config.js(Webブラウザ向けサンプル)
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
};
```
```js:webpack.config.js(node向けサンプル)
module.exports = {
    target: 'node',
    mode: 'production',
    // mode: 'development',

    entry: './build/index.js',
    output: {
        path: __dirname + '/dest',
        filename: 'bundle.js'
    },
    resolve: {
        fallback: {
            // crypto: require.resolve("crypto-browserify"),
            // assert: require.resolve("assert/"),
            // stream: require.resolve("stream-browserify"),
            // dgram: require.resolve('dgram-browserify'),
            // net: require.resolve('net-browserify')
        }
    },
    externals: [
        // 'child_process'
    ]
};
```

バンドルと実行
```
npx webpack
node dest/bundle.js
```
MySQL 8.0.33    libmysqlclient.soの場所

### 【備忘録です】

:::note 
OS  : Linux Mint 21.1 Vera
SQL : Mysql 8.0.33
:::



C言語でMySQLをアクセスするソースを組んだとき、「libmysqlclient.so」の場所がわからんときがありますわな。
参考文献には、「/usr/lib64/mysql/」などのディレクトリを書かれていることがありますが、MySQL 8.0.33でそのようなディレクトリはなく、どこにあるんかなぁって思いでしょう。

調べてみました。あっさり見つかりました。



まず、

    find / -name "libmysqlclient.so"

でさがしてみます。

    結果
    /usr/lib/x86_64-linux-gnu/libmysqlclient.so

と、出てきました。


C言語で作ったソースをコンパイルするときは、

    gcc -o mytest mytest.c -libmysqlclient -L/usr/lib/x86_64-linux-gnu/

ってやるのだぁぁ！！！

そんなん、知っとるわい！って思う人ばかりでしょう。そういう人はこの記事をスルーするように。
しらん人は、参考にしてくれたらそれでよし！

明日仕事なのに、夜な夜な悩んでいた、ワタクシでございました。