OmniAICreator/Qiita-1.07M huggingface dataset:
Django マイグレーションの作成・削除

# モデルの作成からマイグレーションの作成・削除までの流れ

・モデルの作成〜マイグレーション
・マイグレーションを一つ前の状態に戻す
・マイグレーションを全て初期化

## モデルの作成
~~~python:User/models.py
from django.db import models


class User(models.Model):
    name = models.CharField(max_length=20)
~~~
## マイグレーションファイルの作成
~~~python:ターミナル
# python manage.py makemigrations アプリ名 --name マイグレーションファイル名
python manage.py makemigrations User --name add_user
~~~
`--name`を付けることでマイグレーションファイルの名前を指定する事ができる

## マイグレートしてデータベースに反映
~~~python:ターミナル
# python manage.py migrate アプリ名
python manage.py migrate User
~~~

## マイグレーションの状況確認
~~~python:ターミナル
python manage.py shoemigrations User
User
  [X] 0001_add_user
~~~
`showmigrations`コマンドを実行するとマイグレーションの状況が確認できます。
マイグレーションファイル名の左にある角カッコの中がXとなっている場合はデータベースに反映された状態です。([X])
角カッコの中に何も表示されていない場合はデータベースに反映されていません

## マイグレーションを一個前の状態に戻す場合
Userアプリに新しくPostテーブルのモデルを作成し、データベースに反映させた後、Postテーブルを反映させる前の状態に戻す方法
~~~python:User/models.py
from django.db import models


class User(models.Model):
    name = models.CharField(max_length=20)

#Postテーブルを追加
class Post(models.Model):
    title = models.CharField(max_length=30)
~~~
マイグレーションを作成し、データベースに反映
~~~python:ターミナル
#マイグレーションファイル作成
python manage.py makemigrations User --name add_post
User/migrations/0002_add_post.py

#マイグレート
python manage.py migrate User
Applying User.0002_add_post... OK

#マイグレーション状況確認
python manage.py showmigrations User
[X] 0001_add_user
[X] 0002_add_post
~~~
この状態からPostを反映させる前の状態に戻すには、`migrate`コマンドのアプリ名の後に一つ前のマイグレーションファイル名を指定します。
~~~python:ターミナル
python manage.py migrate User 0001_add_user

#マイグレーション状況の確認
python manage.py showmigrations User
[X] 0001_add_user
[ ] 0002_add_post
~~~
0002_add_postのXがなくなっていると思います。
この状態でmigrationsフォルダの中にある「0002_add_post.py」を削除します。

## マイグレーションを全て初期化
マイグレーションを全て初期化するには`python manage.py アプリ名 zero`とします。
~~~python:ターミナル
#マイグレーション状況確認
python manage.py showmigrations User
[X] 0001_add_user

# 0001_add_userをマイグレート前に戻す
python manage.py migrate User zero

#マイグレーション状況の確認
python manage.py showmigrations User
[ ] 0001_add_user
Ubuntu20.04で外部モニターが映らないのでドライバーを入れたらOSが起動できなくなった

# はじめに

[前回](https://qiita.com/Sicut_study/items/f29c337785b35f658ff5)、WindowsをクリーンアップしてUbuntuを導入しました
うまく行っているかと思いきや、外部ディスプレイが映らない問題が生じたのでまとめます

# 問題

Ubuntuをインストールしたところ外部ディスプレイにつないでも片方が映らないという問題が発生しました

そこで以下の記事を発見して試したところ再起動してUbuntuが起動しなくなりました

https://hirooka.pro/nvidia-driver-ubuntu-20-04/

社内で同じ事象が発生しており調べたところ

```
sudo apt install -y nvidia-driver-525-open
↓
sudo apt install -y nvidia-driver-525
```

としたところうまく行ったとの話があったので、`open`を取り除いたところ、再起動でずっと黒い画面から画面が変わらなくなりました(エラーは表示されていないようだった)


# 解決方法

Ubuntuを再インストールして以下の記事を参考に設定したところ、うまくいきました

https://qiita.com/y-vectorfield/items/72bfb66d8ec85847fe2f

ただこの記事と違うところとしては、再起動したときに起動せずにずっと黒い画面のままで電源を落として起動したところ起動に成功しました

またこの事象は2回目のシャットダウンでも起こりました。以降は発生していません

# おわりに

他の記事の引用にはなってしまいましたが、電源を完全に落として治ったのでその地検だけでも残しておきたかったので記事にしました

本当にLinuxはむずかしいで

# 参考

https://hirooka.pro/nvidia-driver-ubuntu-20-04/

https://qiita.com/y-vectorfield/items/72bfb66d8ec85847fe2f
【PlantUML】フォントサイズを変更する方法

## デフォルトのフォントサイズ

```
@startuml 
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```


```plantuml
@startuml 
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```

## 全体のフォントサイズを変更する
```:sample.pu
@startuml 
skinparam ClassFontSize 30
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```

```plantuml
@startuml 
skinparam ClassFontSize 30
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```

## 部分的に変更する


```:sample.pu
@startuml 
hide circle

entity "<b><size:30>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```


```plantuml
@startuml 
hide circle

entity "<b><size:30>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```
win11toastを使おう！！

# 前書き
そもそも、win11toastとはpythonでデスクトップ通知を出すために作られたもです。

最初はwindows10でもwin11toastは動くのかを検証するつもりで始めたのですが、
案外はまってしまったのでそのままのノリで書いていたりします。

ですので、間違い等ございましたらご指摘のほうお願いします。

# win11toastのここがスゴイ
・名前に"win11"と書いてあるので、windows11に対応している！！
・win10環境でも普通に動く！！
・前作のwin10toastと比べ、書きやすさがアップ！！

# 環境
言わずもがなだとは思いますがpythonが必須です。
名前にある通りOSはwindowsで行います。

・windows 10 Pro (64bit)
・python 3.11.1 (多分3.6ぐらいあれば動きます)
・win11toast 0.32

win11toastはpipでインストールできます
```:cmd
pip install win11toast
```
これで準備ができました。
早速作っていきましょう！！

# 実際に使ってみる

まずは、普通にHelloと表示させてみる

```python:index.py
from win11toast import toast

toast('Hello')
```
これを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088564/c7c421f6-b89f-a544-a193-a5c55350d301.png)
こんな感じの通知が出ると思います。

## 指定したページに飛ぶようにする
さっき作った通知をクリックしたらどこかのリンクに飛ぶようにしたい場合は、

```python:index.py
from win11toast import toast

toast('Please click!!','ここを押すとKuroliumのQiitaのプロフィールに飛びます',on_click='https://qiita.com/Kurolium')
```
このように<B>on_cick="(飛ぶリンク)"</B>を,で挟んで入れると、
指定したページに飛ばすことができる。

## 通知にアイコンを付ける
やっぱり、通知にアイコンがないと寂しいというときには
```python:index.py
from win11toast import toast

toast('わからない',icon='アイコンのリンク')
```
と書くとアイコンが出てきてくれます。

# まとめ
最近pythonはCを簡単にした言語なのではと思い始めるほどできる範囲が広がっている気がします。

あと、ここには載っていないですがもっとwin11toastでできることはあるので
参考にさせてもらった[サイト](https://pypi.org/project/win11toast/ "参考にした記事")を載せておきます。
設定用モーダルを実装するときは、モーダルを開くときにデータを読み込ませる。

いつも「そういえば！」と思うことが多いので、言語化して残しておく。

※初版のため、読みづらい点はご了承ください。

## シーン

- SPAやPWAなどで画面を実装する際、Modalを開いて設定等を入力させる画面を作るケース
    - 加えて、コンポーネント指向で開発する

## 良き設計

- モーダル開く用の「open()」関数の処理で、初期値や設定済みの値をモーダル用コンポーネントに読み込ませるのが良い

```javascript:ex. modal.vue
open(): void {
  this.param = props.param // 親からの値を取り込む
  this.isOpen = true // 自分自身を表示させる
}
```

コンポーネント指向で作った場合は、親コンポーネントから `open()` を呼ぶ形にする。

### なぜ

- 「開く」タイミングだけ処理を走らせるから、不必要な処理が走らない
- Vue.js 等でいう `watch` や `computed` で変更検知を行おうとすると、不必要なときにも処理が走って無駄
    - ライフサイクルの `mounted` や `updated` などで読み込むことも考えられる。しかし、前者は最新の値を取れないケースもあるし、後者は永遠に初期値が当てられるといったケースも考えられ、色々考えることが多い
バイトを表す

# 6.1 バイト
すべての数値は、以下のメソッドに応答します。

```bytes```
```kilobytes```
```megabytes```
```gigabytes```
```terabytes```
```petabytes```
```exabytes```
これらのメソッドは、対応するバイト数を返すときに1024の倍数を使います。

```2.kilobytes```   # => 2048
```3.megabytes```   # => 3145728
```3.5.gigabytes``` # => 3758096384
```-4.exabytes```   # => -4611686018427387904
これらのメソッドには単数形の別名もあります。

1.megabyte # => 1048576
定義はactive_support/core_ext/numeric/bytes.rbにあります。

# 出典
https://railsguides.jp/active_support_core_extensions.html#numeric%E3%81%AE%E6%8B%A1%E5%BC%B5:~:text=6.1%20%E3%83%90%E3%82%A4%E3%83%88,%E3%81%AB%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

# Numeric クラス
```数値を表す抽象クラス```です。
```Integer や Float などの数値クラスは Numeric のサブクラス```として実装されています。

```演算や比較を行うメソッド(+, -, *, /, <=>)は Numeric のサブクラスで定義```されます。Numeric で定義されているメソッドは、サブクラスで提供されているメソッド (+, -, *, /, %) を利用して定義されるものがほとんどです。つまり Numeric で定義されているメソッドは、Numeric のサブクラスとして新たに数値クラスを定義した時に、演算メソッド(+, -, *, /, %, <=>, coerce)だけを定義すれば、数値クラスのそのほかのメソッドが適切に定義されることを意図して提供されています。

# 出典
https://docs.ruby-lang.org/ja/latest/class/Numeric.html#:~:text=%E6%95%B0%E5%80%A4%E3%82%92%E8%A1%A8%E3%81%99%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9,%E6%8F%90%E4%BE%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# 感想
* バイトを表すことができるのは楽でよかった。
* Numeric クラスを知ることができてよかった。intの上のクラスがあるとは知らなかった。
セグメンテーションの評価指標Precision, Recall, Diceの意味

# はじめに
Deep learningのセグメンテーションタスクではたくさんの評価指標が使われますが，その本質的な意味がわかっていないと，ただ数字を眺めるだけで「高いから良い」「低いから悪い」になってしまいます．投稿主の勉強も兼ねてこのタイミングでまとめようと思いました．間違い・説明不足等ありましたらコメントください．

セグメンテーション結果を赤，正解（ground truth, GT）を青で表すことにします．
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420059/b78affe7-34f1-c905-0bb5-9e02fbf05de2.png)
赤：セグメンテーション結果（A）；青：正解（B）

セグメンテーション結果について，セグメンテーションされた領域（陽性，positive）とセグメンテーションされていない領域（陰性，negative）と，正解領域について，正解の領域（positive）と正解じゃない領域（negative）があり，下表のような関係になります．
|GT \ segmentation |positive |negative  |
|---|---|---|
|positive |TP  |FN  |
|negative |FP  |TN  |

- TP (true positive): 正解領域を正しくセグメンテーションできた（$A \cap B$）
- TN (true negative): 正解じゃない領域を正しくセグメンテーションしなかった（$\overline{A \cap B}$）
- FP (false positive): 正解じゃない領域を誤ってセグメンテーションしてしまった（$A \cap \overline{B}$）
- FN (false negative): 正解領域をセグメンテーションできなかった（見逃した）（$\overline{A}\cap B$）

![Picture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420059/6031fd24-73eb-1308-a315-e19d699944f3.png)

この投稿ではこの関係をもとに話を進めていきます．

# コンテンツ
1. PrecisionとRecall（適合率と再現率）
1. Dice (F値，F-measure) 
1. おわりに
1. 参考文献

# PrecisionとRecall（適合率と再現率）
Precision（適合率）の定義は次の数式です：
```math
Precision = \frac{TP}{TP+FP}. \tag{1}
```
分母はセグメンテーション領域（赤）なので，「セグメンテーションした領域はどのくらいあってるの？」という指標です．すなわち，でたらめにセグメンテーションして正解以外の領域を塗ってしまえばFPが増え，Precisionは下がるということになります．
__FPが増えれば値は下がり，無駄なセグメンテーションをしていなければ値は高くなります．__ 

次に，Recall（再現率）の定義は次の数式です：
```math
Recall = \frac{TP}{TP+FN}. \tag{2}
```
分母は正解領域（青）なので，「正解はどれくらい塗れた？」という指標です．すなわち，でたらめにセグメンテーションしても正解さえ塗れていればRecallは高くなります．
__見逃し（FN）が多いほど値は下がり，少ないほど上がります．__

ここで２つの極端な例を考えてみます（下図）．左はPrecisionは高いけどRecallは低い例，右がPrecisionは低いけどRecallは高い例です．こう見ると，それぞれセグメンテーション結果は正解領域とは大きく異なるのに，片方の指標だけに注目すると，高い値を示していて精度が高く見えてしまうことがありそうです．
![Picture3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420059/32c1dbc1-7a86-0a89-ccc2-7f1b45c0131a.png)
左：Precision高，Recall低の例；右：Precision低，Recall高の例

# Dice (F値，F-measure)
「Precision, Recallをバランス良く考えたい」ということで使うのがDiceです．DiceはPrecision, Recallの調和平均です：
```math
Dice = \frac{2}{1/Precision+1/Recall}. \tag{3}
```
調和平均はしばしば割合の平均として紹介されますが，今回の「Precision, Recallの調和平均」はどのような意味を持つでしょうか．
調和平均は作業効率の平均と言い換えることができます．例えば，
>Aさんは1分で卵を2つ割ります．Bさんは1分で卵を5つ割ります．いま二人で10個ずつ割って合計20個割りました．このとき二人合わせた作業効率は？

という問いがあったとき，作業効率を求める式は「仕事量÷時間」になります．すなわち，
```math
\begin{align}
二人の作業効率 &= \frac{20 [個]}{10/2 [分]+10/5 [分]}\\ \tag{4}
&= 2.85... [個/分]
\end{align}
```
となり，二人は約2.9 [個/分]割っていることになります．

話を戻してPrecision, Recallについて同様に「作業効率」として考えると，正解に対して， __Precisionは「どれだけ無駄なく塗れたか？」，Recallは「どれだけ隙間なく塗れたか？」という違った角度から見た作業効率を表します．__ これらの調和平均を取ることがDiceの表す意味になります．

# おわりに
Precision, Recall, Diceについてまとめました．それぞれの値からセグメンテーションと正解の位置関係がイメージできると，数字から多くの情報を得ることができると思います．

# 参考文献
- [なぜF1スコアでは「調和平均」が使われるのか。調和平均の意味を考える。](https://datascience.nri.com/entry/2022/10/28/165630)
2023年1月後半 いいねいただいた記事16

2023年1月後半 いいねいただいた記事16

|番号|記事|views|いいね|stocks|
|:----|:----|:----|:----|:----|
|17|Requirements on Crypto Stack, AUTOSAR R22-11, CP, No.426 https://qiita.com/kaizen_nagoya/items/2ca1ee22a329ec2c8cf7|209|1|0|
|18|C言語教育はCコンパイラの写経で https://qiita.com/kaizen_nagoya/items/088a9906797559cd8b8a|12254|54|58|
|19|10歳児がサイバセキュリティの専門家になる https://qiita.com/kaizen_nagoya/items/fe3b0a7bdf8d35c40d0a|334|4|3|
|20|JIS 所蔵　図書館等一覧 https://qiita.com/kaizen_nagoya/items/77254e12257d3ac74226|980|1|0|
|21|技術を極める。近寄りたい人。近寄りたくない人。三分類、五集合。 https://qiita.com/kaizen_nagoya/items/aefd732bcd2518b93ae3|831|6|3|
|22|製造業における機械学習 https://qiita.com/kaizen_nagoya/items/fbe846de16f74bea1d6f|35855|211|249|
|23|データサイエンティストの気づき!「勉強して仕事に役立てない人。大嫌い!!」『それ自分かも?』ってなった!!! https://qiita.com/kaizen_nagoya/items/d85830d58d8dd7f71d07|19253|91|107|
|24|権利と義務の前に。仮説（147） https://qiita.com/kaizen_nagoya/items/47d4e992d0fd340403fd|1741|4|0|
|25|2022年Qiita振り返りレポート(2022/12/27 メールで来たやつ) https://qiita.com/kaizen_nagoya/items/0a4c99f75634e030efca|184|1|0|
|26|IT業界でやめるとよいかもしれない３つの習慣（年齢・学歴（大学名）・理系文系） https://qiita.com/kaizen_nagoya/items/f0d252d1e70ccea18efc|6699|11|7|
|27|アセンブラへの道 https://qiita.com/kaizen_nagoya/items/46f2333c2647b0e692b2|38023|342|368|
|28|フルスタックエンジニア　どこからどこまで https://qiita.com/kaizen_nagoya/items/d365e3f9e15d9b182dce|21686|32|27|
|29|なんでそんなに沢山記事を書くんですか？ https://qiita.com/kaizen_nagoya/items/e291196f9b692757f2cc|1209|7|1|
|30|Qiitaのいろいろランキング2022 @kaizen_nagoya https://qiita.com/kaizen_nagoya/items/9335f3c88571c4398742|2416|4|3|
|31|始めてのAndroid https://qiita.com/kaizen_nagoya/items/860ebfcf67f0e82a55ce|711|3|2|
|32|私を指導してくれた16人の学生 https://qiita.com/kaizen_nagoya/items/8127cd6542ac9396e925|195|3|0|
|合計| |142580|775|828|

# 参考資料

2023年1月　前半 いいねいただいた記事16

https://qiita.com/kaizen_nagoya/items/830e049a8cb557d6a906

# 文書履歴(document history)
ver. 0.01 初稿 20230203

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
ChatGPTを使って機械学習モデルを実装してみたい（遺伝的アルゴリズムによる変数選択編）

#### Human
遺伝的アルゴリズムを用いて、pythonで機械学習の説明変数選択を行うクラスを作成してください。　予測誤差の評価はcrossvalidationのr2を用い、回帰モデルはPLSRegressionを使ってください。　遺伝的アルゴリズムのライブラリはdeapを使ってください。　関数fitとtransformは必須です


#### ChatGPT
Here is a class implementation in Python that performs feature selection using a genetic algorithm, uses cross-validated R2 as the evaluation metric, and uses PLSRegression as the regression model:

```
class GeneticFeatureSelection:
    def __init__(self, population_size=100, generations=20, cxpb=0.5, mutpb=0.2):
        self.population_size = population_size
        self.generations = generations
        self.cxpb = cxpb
        self.mutpb = mutpb
        
    def fit(self, X, y):
        self.X = X
        self.y = y
        self.num_features = X.shape[1]
        
        # Create a fitness function to evaluate the feature sets
        def eval_features(individual):
            individual = np.array(individual) == 1
            if individual.sum() == 0:
                return 0,
            X_selected = X[:, individual]
            model = PLSRegression()
            model.fit(X_selected, y)
            r2 = model.score(X_selected, y)
            return r2,
        
        creator.create("FitnessMax", base.Fitness, weights=(1.0,))
        creator.create("Individual", list, fitness=creator.FitnessMax)
        
        toolbox = base.Toolbox()
        toolbox.register("attr_bool", np.random.randint, 0, 1)
        toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=self.num_features)
        toolbox.register("population", tools.initRepeat, list, toolbox.individual)
        toolbox.register("evaluate", eval_features)
        toolbox.register("mate", tools.cxTwoPoint)
        toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
        toolbox.register("select", tools.selTournament, tournsize=3)
        
        population = toolbox.population(n=self.population_size)
        self.hof = tools.HallOfFame(1)
        stats = tools.Statistics(lambda ind: ind.fitness.values)
        stats.register("avg", np.mean)
        stats.register("std", np.std)
        stats.register("min", np.min)
        stats.register("max", np.max)
        
        population, log = algorithms.eaSimple(population, toolbox, cxpb=self.cxpb, mutpb=self.mutpb, ngen=self.generations, 
                                             stats=stats, halloffame=self.hof, verbose=True)
        
    def transform(self, X):
        selected_features = np.array(self.hof[0]) == 1
        return X[:, selected_features]

```

基本的なコードは出来ているので、後は修正すれば使えそう
独自のバリデーションを定義する

# validate
### 説明
バリデーションを定義
### 使い方
```rb
validate(バリデーションメソッド名.., ブロック引数)
```
### 失敗したら例外発生
```rb
validate!(バリデーションメソッド名.., ブロック引数)
```

## 例
### バリデーションを定義
```rb
validate :must_be_friends
```

### ブロック
```rb
validate do |comment|
  comment.must_be_friends
end
```
# 出典
https://railsdoc.com/validation#validate:~:text=%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3,GitHub

# 感想
種類のないバイデーションを作成することができる。
```:バリデーションメソッド```を指定できることが勉強になった。
nodeのDockerイメージのタグについているalpineとかslimが意味するもの

## 概要

- nodeのDockerイメージのタグ名についているalpineとslimが意味する物を知らなかったのでまとめてみる。

## `node: バージョン名`のタグ

- このイメージが最も一般的なイメージらしい。「迷ったらこれ使っとけば万事オッケー」的なことが公式にも書いてあった。
- 「迷ったらバージョン名だけのイメージを選択する」は鉄則っぽい。

## `node: バージョン名-bullseye`もしくは`node: バージョン名-buster`のタグ

- bullseyeやbusterはDevian（Unix系ディストリビューションを作成しているプロジェクト）がリリースしているDebian GNU/Linuxディストリビューションのバージョンと紐づくスイーツコード（開発コードネーム）らしい。イメージがどのDebian GNU/Linuxディストリビューションをもとに作られているかがわかる。
- `node: バージョン名-bullseye`はDebian 11.0（bullseye）をもとにしている。
- `node: バージョン名-buster`はDebian 10.0（buster）をもとにしている。
- イメージに別途、パッケージをインストールして使いたい場合、この辺を使えばわざわざインストールしなくてもDebian GNU/Linuxのディストリビューションに入っているから手間が省ける。
- ちなみに余談だがDebian GNU/Linuxの開発コードネームはトイ・ストーリーの登場キャラクターから取っているらしい。（不安定番には無印トイ・ストーリーのおもちゃを壊す子供のシドになぞらえてsidとつけるらしい。）

## `node: バージョン名-alpine`のタグ

- 　Alpine Linuxをもとに作られているイメージらしい。
- 　超軽量、イメージサイズを小さくしたいならこのイメージを選択する。
- 　超軽量が故に、入っていないパッケージもあるのでDockerfileで自分でカスタムすることが基本必須となる。
- 　Dockerfileへの記載方法が分からない人は下記を読んでalpineのDockerイメージの説明を参考にすると良いらしい。

https://hub.docker.com/_/alpine/

## `node: バージョン名-slim`

- nodeの事項に必要な最低限のパッケージのみしか入っていない。
- よっぽどの理由（容量的問題）などが無い限りあまり選ばない。

## 謝辞

- 本内容は同僚の方が教えてくださった知見です。この場を借りてお礼申し上げます。本当にありがとうございます！

## 参考文献

https://hub.docker.com/_/node

上記の「Image Variants」に記載

https://www.debian.org/releases/stable/i386/index.ja.html

https://ja.wikipedia.org/wiki/Debian
OpenSSLのコマンドでタイムスタンプを検証する

以前、[Curl, OpenSSLを使って、無料のタイムスタンプサービスへ接続する](https://qiita.com/etaka/items/d32406e87d9aa2265cd7) で取得したタイムスタンプレスポンス、タイムスタンプトークンを検証します。

## TSA証明書、ルート証明書のダウンロード

[JNSA PKI SandBox Project - SandBox CA Repository](http://eswg.jnsa.org/sandbox/freeca/)からTSAのX509証明書とTSAの証明書を発行したCA証明書をダウンロードします。

* TSA証明書 [TSA Certificate 300001](http://eswg.jnsa.org/sandbox/freeca/freetsa.cer)
* Root証明書 [Root Certificate 2](http://eswg.jnsa.org/sandbox/freeca/root2.cer)

## DER形式のX509証明書をPEM形式へ変換

OpenSSLの検証コマンドで入力に指定するX509証明書の形式はPEM形式なので、ダウンロードした証明書をDER形式からPEM形式へ変換します。

コマンド例

```
openssl x509 -inform der -in DER形式の証明書 -out PEM形式の証明書
```

以下を実施して変換しました。

```
>openssl x509 -inform der -in freetsa.cer -out freetsa.cer.pem
>openssl x509 -inform der -in root2.cer -out root2.cer.pem
```

## タイムスタンプレスポンスの検証

タイムスタンプレスポンスを検証するときのコマンドは以下の通りです。

```
openssl ts -verify -queryfile タイムスタンプリクエスト -in タイムスタンプレスポンス　-CAfile PEM形式のルート証明書 -untrusted PEM形式のTSA証明書
```

実際に検証した結果です。
```
>openssl ts -verify -queryfile HelloWorld.txt.tsq -in HelloWorld.txt.tsr -untrusted freetsa.cer.pem -CAfile root2.cer.pem
Using configuration from C:\Program Files\Common Files\SSL/openssl.cnf
Warning: certificate from 'freetsa.cer.pem' with subject '/C=JP/O=JNSA/OU=ESWG/CN=JNSA PKI Sandbox FreeTSA 300001' is not a CA cert
Verification: OK
```

## タイムスタンプトークンの検証

タイムスタンプレスポンスの代わりにタイムスタンプトークンを検証することも出来ます。

コマンドは以下の通りです。

```
openssl ts -verify -queryfile タイムスタンプリクエスト -in タイムスタンプトークン　-CAfile PEM形式のルート証明書 -untrusted PEM形式のTSA証明書 -token_in
```


実際に検証した結果です。

```
>openssl ts -verify -queryfile HelloWorld.txt.tsq -in HelloWorld.txt.tst -untrusted freetsa.cer.pem -CAfile root2.cer.pem -token_in
Using configuration from C:\Program Files\Common Files\SSL/openssl.cnf
Warning: certificate from 'freetsa.cer.pem' with subject '/C=JP/O=JNSA/OU=ESWG/CN=JNSA PKI Sandbox FreeTSA 300001' is not a CA cert
Verification: OK
```
VSCode [WSL2:Ubuntu] のterminal.integrated.profiles.linuxについて

# はじめに
Windows11上のVSCode統合のUbuntuターミナル(bash)でEucJPネイティブアプリの文字出力を確認したいため、統合ターミナルの構成方法を調査しました。応急処置として[VSCode [WSL2:Ubuntu] をTeraTermで接続できるよう構成する](https://qiita.com/mylifewithviolin/items/8b6bb4b6b64fda6d3f19)により、EucJPネイティブアプリの文字出力を確認できています。

## この記事内容の作業目的
VSCode [WSL2:Ubuntu] のterminal.integrated.profiles.linuxを構成する。
EucJPネイティブアプリの文字出力をVSCode [WSL2:Ubuntu] で確認するため。

## この記事内容の作業環境
Windows11
Windows11WSL2（Ubuntu 22.04.1 LTS）
VSCode(Visual Studo Code)　VSCodeUserSetup-x64-1.67.2

## この記事内容の保証
※この記事には環境構築の手順的な情報が含まれます。本記事に書かれた手順の妥当性は保証されません

# settings.json
実行環境はVSCode [WSL2:Ubuntu] です。
設定情報のsettings.jsonは下記のパスに保存されます。

/home/{user}/.vscode-server/data/Machine/settings.json

## terminal.integrated.profiles.linux

このあたりの情報を参考にして
[Terminal Profiles in Visual Studio Code](https://code.visualstudio.com/docs/terminal/profiles)
settings.jsonを編集して下記の状態としますと、いちおうVSCode統合のUbuntuターミナル(bash)は起動成功します。

```json:settings.json
{
    "files.encoding": "eucjp",
    "terminal.integrated.profiles.linux": {
        "bash": {
            "path": "bash",
            "icon": "terminal-bash",
            "encoding": "eucjp",
            "args": [],
            "env": {},
            },
    },
    "terminal.integrated.env.linux": {
        "JLESSCHARSET": "japanese",
        "LANG": "ja_JP.eucJP",
    },
}

```
認識されない変なオプションを指定するとターミナルが起動失敗するようになりますから、この構成を認識しているのは確かです。

"files.encoding": "eucjp"は、ユーザー設定のUIからコードエディタの文字コードを変更した際に、出力された行です。当初はこの一行だけでした、

"terminal.integrated.env.linux"はこちらの記事
[VSCodeのターミナル/プロファイルの設定の詳細](https://qiita.com/take_me/items/47f192a126d75a9264a9)　
を参考にして.profileに記載した環境変数を追記してあります。

"terminal.integrated.profiles.linux"内の"env"に当初指定していましたが、こちらより適用されるスコープが広いようであるため、"terminal.integrated.env.linux"だけの設定としています。

# ターミナル起動
統合のUbuntuターミナル(bash)を追加起動してみます。
しかし、コマンドでEucJPネイティブアプリの文字出力を確認すると化けてます。

```bash:
$ ./main
EUC-JP���ܸ��VSCode����Bash�����ߥʥ뤫��ɽ�����Ƥߤ�
```

Tera Termで接続して実行した結果です。
```bash:
$ ./main
EUC-JP日本語をVSCode統合Bashターミナルから表示してみる
```

windows版の統合ターミナルのパワーシェルの場合は、起動オプションの引数argsに文字コード指定があり、それにより変更できるようですが、bashの場合その上にかぶさっている統合機能の文字コード構成方法が不明です。

# タスクの実行
タスクの実行で起動されたターミナルには下図のようなVSCode独自の日本語メッセージが出力されます。

```bash:
 *  実行するタスク: /home/puremind/pmind/src/qcc/main  

EUC-JP���ܸ��VSCode����Bash�����ߥʥ뤫��ɽ�����Ƥߤ�
 *  ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。 
```

このメッセージのエンコードは既定ではLanguage pack extension for Japaneseのエンコードに従っていると推察され、そっちのオプションの日本語の中になにか選択子はないか、確認してみましたが、UI上はConfigure Display Languageの日本語選択子はjaの一択でした。

下記はだめもとでEnglish(en)に戻した場合のエコーです。
```bash:
���ܸ�ץ�����ߥ󥰸��� �ͣ��� Version 8.07 for UNIX
          Copyright(C) 1985 Scripts Lab. Inc.
����ѥ����� .. ��λ
Coping.. /home/puremind/pmind/bin/mindex --> /home/puremind/pmind/src/qcc/main
 *  Terminal will be reused by tasks, press any key to close it. 
```


下記の記事にこのタスクの内容を書いてあります。
[VSCode [WSL:Ubuntu] で日本語プログラミング言語Mindのソースをビルドしてみた](https://qiita.com/mylifewithviolin/items/366d1e3b0fea9485acdb)

# 参考リンク

https://qiita.com/take_me/items/47f192a126d75a9264a9

https://qiita.com/tt4q/items/8a0e4c31f13279db0d65
【覚書】困ったらとりあえずExcelに数字を突っ込むSEのクイックツールバー設定

# 書いた人
キーボードで全部済めばいいのにと思っているPM兼SE（でもVimmerにはなれなかった）。
一時期開発対象もExcel（VBA）だったので浅からぬ付き合いではある。
パワポが多い人・場面には[姉妹記事](https://qiita.com/westdepth/items/22c65b3ea4f11e0e7662)あります。

# 設定内容
 - よく使う
 - ショートカットがない（覚えていない・押しづらいものも含む）
ものを中心に設定。


```XML
<mso:cmd app="Excel" dt="1" />
<mso:customUI xmlns:x1="http://schemas.microsoft.com/office/2009/07/customui/macro" xmlns:msox="http://schemas.microsoft.com/office/2006/01/customui/special" xmlns:mso="http://schemas.microsoft.com/office/2009/07/customui">
<mso:ribbon>
<mso:qat>
<mso:sharedControls>
<mso:control idQ="mso:AutoSaveSwitch" visible="false"/>
<mso:control idQ="mso:FileNewDefault" visible="false"/>
<mso:control idQ="mso:FileOpenUsingBackstage" visible="false"/>
<mso:control idQ="mso:FileSave" visible="false"/>
<mso:control idQ="mso:FileSendAsAttachment" visible="false"/>
<mso:control idQ="mso:FilePrintQuick" visible="false"/>
<mso:control idQ="mso:PrintPreviewAndPrint" visible="false"/>
<mso:control idQ="mso:Spelling" visible="false"/>
<mso:control idQ="mso:Undo" visible="false"/>
<mso:control idQ="mso:Redo" visible="false"/>
<mso:control idQ="mso:SortAscendingExcel" visible="false"/>
<mso:control idQ="mso:SortDescendingExcel" visible="false"/>
<mso:control idQ="mso:PointerModeOptions" visible="false"/>
<mso:control idQ="mso:SheetRename" visible="true"/>
<mso:control idQ="mso:BordersMoreDialog" visible="true"/>
<mso:control idQ="mso:WrapText" visible="true"/>
<mso:control idQ="mso:FontColorPicker" visible="true"/>
<mso:control idQ="mso:ShapeOutlineColorPicker" visible="true"/>
<mso:control idQ="mso:CellFillColorPicker" visible="true"/>
<mso:control idQ="mso:ShapesInsertGallery" visible="true"/>
<mso:separator idQ="msox:sep1" visible="true"/>
<mso:control idQ="mso:AlignTopExcel" visible="true"/>
<mso:control idQ="mso:AlignMiddleExcel" visible="true"/>
<mso:control idQ="mso:AlignBottomExcel" visible="true"/>
<mso:separator idQ="msox:sep2" visible="true"/>
<mso:control idQ="mso:AlignLeft" visible="true"/>
<mso:control idQ="mso:AlignCenter" visible="true"/>
<mso:control idQ="mso:AlignRight" visible="true"/>
<mso:separator idQ="msox:sep3" visible="true"/>
<mso:control idQ="mso:SelectionPane" visible="true"/>
<mso:control idQ="mso:ObjectsSelect" visible="true"/>
<mso:control idQ="mso:MergeCellsAcross" visible="true"/>
<mso:control idQ="mso:MergeCells" visible="true"/>
<mso:control idQ="mso:UnmergeCells" visible="true"/>
<mso:control idQ="mso:PictureCrop" visible="true"/>
<mso:control idQ="mso:Filter" visible="true"/>
<mso:control idQ="mso:RemoveDuplicates" visible="true"/>
<mso:control idQ="mso:ObjectAlignMenu" visible="true"/>
<mso:control idQ="mso:PowerQueryGetTransformDataLaunchQueryEditor" visible="true"/>
</mso:sharedControls>
</mso:qat>
</mso:ribbon>
</mso:customUI>

```
Ruby13

# 問題
以下のように、果物の名前と値段が入った配列があります。
この配列を用いて、果物の名前とそれぞれの合計額が出力される
コードを記述してください。

```Ruby
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
```

```Ruby:ターミナル
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です
```

<br>
<br>
<br>

# 模範解答
```Ruby:模範解答
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]

fruits_price.each do |fruit|
  sum = 0
  fruit[1].each do |price|
    sum += price
  end
  puts "#{fruit[0]}の合計金額は#{sum}円です"
end
```

# 【解説】
3行目
fruits_priceから["apple", [200, 250, 220]]という値を取り出す。変数fruitに代入します。

4行目〜7行目
fruitの1番目の値[200, 250, 220]から値を1つずつ取り出す。自己代入しながらsumを出力します。
以降、オレンジとメロンも順に取り出し処理は同様です。

補足として・・・添字１は金額、添字０は果物です。
メモ化再帰のrust実装

# 背景
https://atcoder.jp/contests/abc275/tasks/abc275_d

これが解けなかった。
メモ化再帰を知っていればあっさり解ける問題だったが軽く調べてみてrustでの実装が無かったので書いてみたという話

# 実装
こんな感じ.
何回再帰の底までたどり着いたかカウントするための
グローバル変数が入っている。あとは
メモにハッシュマップを使っている。elseの実装が汚いのなんとかならんか。if false　は上と入れ替えると単純な再帰だとどうなるかよくわかる。


```rust
static mut c:u32 = 0;

fn f(x:u64,h:&mut HashMap<u64,u64>) -> u64{
  if x == 0{
    unsafe{c+=1;}
    1
  }else{
    if h.get(&x) != None{
    //if false{
      *h.get(&x).unwrap()
    }else{
      let xx = f(x/2,h) + f(x/3,h);
      h.entry(x).or_insert(xx);
      xx
    }
    
  }
}

fn main() {
  input!{
 n:u64,

  }
let mut h:HashMap<u64,u64> = HashMap::new();
println!("{:?}",f(n,&mut h));
//unsafe{println!("{:?}",c);}
}

```
Ruby [eachメソッド] eachの入れ子を使ったプログラム

# eachの入れ子

```ruby
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
```
上記配列を利用して、apple, orange, melonそれぞれの合計金額を出力するプログラムを書きます。<br>

```ruby
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
fruits_price.each do |fruit|
  sum = 0
  fruit[1].each do |price|
    sum += price
  end
  puts "#{fruit[0]}の合計金額は#{sum}円です"
end
```

- fruits_price.each do |fruit|
["apple", [200, 250, 220]という値を取り出し、変数fruitに代入します。<br><br>
- その次の行〜endまではfruitの値をいつずつ取り出して、自己代入をしながらsumを出力します。
詳細に見ると以下の通りです。<br>

```ruby
# 1回目
sum = 0
#sum += priceはsum = sum + priceと解釈できる
sum = 0 + 200
# 返り値
sum = 200
#2回目 
#sumは1回目の200という値が返されます
sum = 200
sum = 200+ 250
sum = 450
#3回目 
#sumは2回目の450という値が返されます
sum = 450
sum = 450+ 220
sum = 670
```

というのを、残りのorangeとmelonでも同じように繰り返し処理をします。
ターミナルでは以下のように出力されます。

```
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です
```
【Java】オペランド とは　――――単語の意味

**Java**などの多くのプログラミング言語では、
```
a = b + 3
```
のような式の中で変数の「a」「b」や、値の「3」と
「=」「+」などの計算記号の**2種類**に分けることが出来ます。

ここで
*「a」「b」「3」の側を**オペランド(operand)***
*「+」「=」の方を**演算子(operator)***
といいます。
Ruby eachメソッド

# eachメソッドについて

eachメソッドは、配列や要素の１つひとつに対して、要素の数だけ名前をつけて取り出すことができる処理を行います。

例
```ruby
colors = ["赤", "黄", "青"]
colors.each do |color|
  puts "#{color}色"
end
```

```ruby
赤色
黄色
青色
# ターミナル出力
```
each doの後にブロック変数（　|[変数]|　）を記述します。
そうすることで、繰り返し処理が実行されるたびに、配列・ハッシュの値がそれぞれブロック変数に格納され、その値を処理の中で使用することができます。

# timesメソッドで配列の全ての要素に対して繰り返し処理を書くとどうなる？
例
```ruby
colors = ["あか", "あお", "きいろ"]
element_count = colors.length  # 要素数を変数に代入
element_count.times do |i|
   puts "色: #{colors[i]}"  # 添字0から要素を出力
end
```

```ruby
色: あか
色: あお
色: きいろ
```

ぱっと見、コードが長く読みにくいように感じます。
そのため、配列やハッシュの要素を全て取り出すときは、eachメソッドを使います。
tomcat catalina.out copytruncate not work

# tomcat のログが追記される。

## logrotate setting

```conf
/var/log/tomcat8/catalina.out {
    copytruncate
    daily
    rotate 10
    compress
    missingok
    dateext
    create 0644 tomcat tomcat
}
```
以下、今回はおそらく、copytruncate がうまく動いていないと思われる。

```text
copytruncate：コピー後、元のログファイルの内容を消去する
daily：1日1回ローテーションを実行する
rotate：残す世代数(ファイル数と考えてもらえれば...環境に合わせて変更してください。)
compress：最新世代以外は圧縮する
missingok：指定のログファイルが存在していなくてもエラーを出さない
dateext：ファイル名の末尾に日付をつける
create 0644 tomcat tomcat：ログファイルの権限
```

[参考1](https://unix.stackexchange.com/questions/676222/logrotate-not-able-to-truncate-catalina-out-actual-answer)

```conf
/log/apache-tomcat/catalina.out{
 su tomcat tomcat
 copytruncate
 daily
 size 256M
 rotate 8
 missingok
 maxage 7
}
```
Go案件を狙うなら他に何を学べばいいの？

# フリーランススタートでスキルをスクレイピング

[フリーランスエンジニア向けIT求人・案件サイト【フリーランススタート】](https://freelance-start.com/)

下記の絞り込み条件で検索。[スキル]をスクレイピングしカウントしてみた

- 絞り込み条件
    - Go言語
    - サーバーエンジニア
    - 単価¥700,000-¥1000,000+
    - 東京都

## 結果発表

| skill | count |
| --- | --- |
| Go言語 | 800 |
| TypeScript | 234 |
| PHP | 186 |
| JavaScript | 151 |
| Google Cloud Platform(GCP) | 138 |
| React | 135 |
| GitHub | 132 |
| Kotlin | 131 |
| Java | 131 |
| Python | 130 |
| MySQL | 126 |
| Git | 124 |
| Docker | 124 |
| Vue.js | 115 |
| Ruby | 105 |
| AWS | 91 |
| SQL | 84 |
| Next.js | 59 |
| Redis | 51 |
| Windows | 50 |
| AngularJS | 50 |
| Jenkins | 48 |
| CSS | 48 |
| HTML | 48 |
| ファイヤーウォール | 46 |
| Kubernetes | 45 |
| Ruby on Rails | 44 |
| Ansible | 38 |
| Perl | 34 |
| CircleCI | 34 |
| BigQuery | 31 |
| Nginx | 30 |
| Spring | 30 |
| Terraform | 29 |
| JIRA | 29 |
| PostgreSQL | 27 |
| Scala | 27 |
| C# | 26 |
| MongoDB | 25 |
| AWS RDS | 24 |
| Backlog | 21 |
| C++ | 21 |
| SQL Server | 20 |
| Linux | 20 |
| Node.js | 19 |
| Swift | 15 |
| DynamoDB | 15 |
| Laravel | 15 |
| Figma | 14 |
| Eclipse | 14 |
| Apache | 13 |
| Android | 12 |
| Lambda | 12 |
| Redmine | 12 |
| Chef | 12 |
| Oracle | 12 |
| Azure | 10 |
| Firebase | 10 |
| SpringBoot | 10 |
| WindowsServer | 9 |
| MVC | 9 |
| Datadog | 8 |
| UNIX | 8 |
| Sentry | 7 |
| Unity | 7 |
| CakePHP | 7 |
| Asana | 6 |
| Shell | 6 |
| Amazon EC2 | 6 |
| Django | 6 |
| CentOS | 6 |
| Fargate | 5 |
| Google App Engine | 5 |
| Revel | 5 |
| Ubuntu | 5 |
| Subversion | 5 |
| MacOS | 5 |
| iOS | 4 |
| Dart | 4 |
| Objective-C | 4 |
| Rust | 4 |
| C言語 | 4 |
| Flask | 4 |
| Memcache | 4 |
| MemcacheDB | 4 |
| Sass | 4 |
| jQuery | 4 |
| AWS CloudFront | 3 |
| AWS CodeBuild | 3 |
| Mackerel | 3 |
| Flutter | 3 |
| PHPUnit | 3 |
| Cocos2d-x | 3 |
| Solr | 3 |
| JSON | 3 |
| Elixir | 2 |
| Abstract | 2 |
| Amazon S3 | 2 |
| C#.NET | 2 |
| ReactNative | 2 |
| FreeBSD | 2 |
| Amazon SQS | 2 |
| Backbone.js | 2 |
| PhpStorm | 1 |
| FuelPHP | 1 |
| Redshift | 1 |
| SciPy | 1 |
| PlayFramework | 1 |
| Seasar2 | 1 |
| Wicket | 1 |
| JUnit | 1 |
| Bigtable | 1 |
| Haskell | 1 |
| AWS CloudFormation | 1 |
| RPG | 1 |
| re:dash | 1 |
| AndroidSDK | 1 |
| Sinatra | 1 |
| Hive | 1 |
| Zabbix | 1 |
| Hadoop | 1 |
| Unicorn | 1 |
| Sketch | 1 |
| RSpec | 1 |
| Bootstrap | 1 |
| LESS | 1 |
| Tomcat | 1 |
| CodePipeline | 1 |
| vi | 1 |
| Trello | 1 |
| Adobe XD | 1 |

# 感想

- Goと一緒にReact、TypeScriptは抑えておきたい
- 知らないものもあったのでしっかり勉強していきたい
- Javaとかあるのは、尚可欄にJavaなどのサーバーサイド言語の経験３年以上とかあるから
Castleライブラリから学んだC#で動的に型情報を生成する方法

# Castleライブラリから学んだC#で動的に型情報を生成する方法

## はじめに

前回記事の続きです。
<https://qiita.com/mngreen/items/f49b7c6b305f86d63e6d>

前回記事より、DynamicProxyでは動的に型を生成していることが分かりました。
本記事ではその動的に型を生成する処理について、見ていきたいと思います。

## 動的に型を生成する

実際に型を生成しているメソッドというのは、以下のリンク先のBaseInterfaceProxyGenerator.GenerateTypeメソッドの処理になります。
<https://github.com/castleproject/Core/blob/c6d7a165ac3050ebfc70debabe52ee6624a97bdf/src/Castle.Core/DynamicProxy/Generators/BaseInterfaceProxyGenerator.cs#L87>

上記の処理の中で、[ClassEmitter](https://github.com/castleproject/Core/blob/c6d7a165ac3050ebfc70debabe52ee6624a97bdf/src/Castle.Core/DynamicProxy/Generators/Emitters/ClassEmitter.cs#L25)クラスのBuildTypeメソッドが最終的に型情報を生成しています。
まずはClassEmitterのBuildTypeメソッドを探しにいきますが、存在しないためベースクラスである[AbstractTypeEmitter](https://github.com/castleproject/Core/blob/c6d7a165ac3050ebfc70debabe52ee6624a97bdf/src/Castle.Core/DynamicProxy/Generators/Emitters/AbstractTypeEmitter.cs#L26)を見にいきます。
その中には、確かに[BuildType](https://github.com/castleproject/Core/blob/c6d7a165ac3050ebfc70debabe52ee6624a97bdf/src/Castle.Core/DynamicProxy/Generators/Emitters/AbstractTypeEmitter.cs#L92)メソッドがありました。

BuildTypeメソッドの中身を見ていくと、最終的には[TypeBuilder.CreateTypeInfo](https://github.com/castleproject/Core/blob/c6d7a165ac3050ebfc70debabe52ee6624a97bdf/src/Castle.Core/DynamicProxy/Generators/Emitters/AbstractTypeEmitter.cs#L342)メソッドが呼び出されています。
TypeBuilderクラスのドキュメントは以下から参照できます。このような型があること自体を知らなかったので、勉強になりました。
<https://learn.microsoft.com/ja-jp/dotnet/api/system.reflection.emit.typebuilder?view=net-7.0>

正直、ドキュメントの例を見ても直感的にとらえられていないのですが、大体以下の手順を踏んでいるようです。

1. アセンブリを生成するためのビルダを生成する。
2. 1.のビルダからモジュールを生成するためのビルダを生成する。
    - アセンブリとモジュールの違いはマニフェストの有無ぐらいのようです。<https://atmarkit.itmedia.co.jp/fdotnet/technology/framework01/framework01_03.html>
3. 2.のビルダに型情報を定義する
4. 3.の型情報の中にコンストラクタやフィールド、プロパティ、メソッドなどの詳細を定義
5. 4.の型情報をビルドして型を生成。あとはCreateInstanceをすることでインスタンス化可能

比較的単純なこの例ですら複雑さを感じるのに、DynamicProxyではどのように上手く取り扱っているのでしょうか？

## おわりに

CastleライブラリからTypeBuilderクラスの存在を知り、サンプルを自分なりの理解で書き下してみました。
独力で作り上げようとしたらこのような複雑な処理を書かなければいけないところを、うまく抽象化してくれていて非常に助かりますね。
これで少しだけ仕組みが分かってきたので、さらにもう少し読み込んでいこうと思います。
WSL2で libcuda.so: cannot open shared object fileになる

# 概要
WSL2でStable diffisionの環境構築をしているときに
`libcuda.so.1: cannot open shared object file`といったエラーが出たので対処する。

# 何をしていたか
以下の記事のようにCUDAの環境を整えた後、

https://qiita.com/cacaoMath/items/65d6a76b545eb662f581

話題の[stable_diffision](https://github.com/runwayml/stable-diffusion)の実行環境を整え、イラストを生成しようとしていました。

すると、以下のエラーが出たので解決を目指しました。
```
could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: cannot open shared object file: No such file or directory
```

# 対処法
ちょうど同じような状況のissueがありました。

https://github.com/microsoft/WSL/issues/8587


どうやら、うまくパスが通っていないようなので[コメント](https://github.com/microsoft/WSL/issues/8587#issuecomment-1229170859)にあるように以下を`.bashrc`に追加します。
```.bashrc
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
```

追加したら、`source ~/.bashrc`を実行して、有効化しましょう。
データベースのカラム名を考える

# 1 . はじめに
* データベースのカラム名をある程度統一したルールで記述したい
* フラグなのにTRUE/FALSE, ON/OFF以外のものがある時に正しく説明したい

# 2. 命名規則
* 過去の経験や書籍などから自分なりに必要最低限のルールをまとめてみる
## 2.1. カラム名
* 下記種類のカラムについては接尾辞を追加する

| 接尾辞 | 種類 | 文字数 | 使用用途 (例) | 型 (例) | 説明 |
|:--------|:------------|:------------|------------|:------------|:------------
| Id      | ID          | 1～         | ユーザーID             | ※任意      |レコードを一意にに特定可能な項目|
| Code    | コード      | 2～         | 商品コード             | VARCHAR     |桁数ごとに意味を持つ項目|
| No      | 番号        | 1～         | シーケンス番号、表示順  | ※任意      |順番を表す項目|
| Kbn     | 区分        | 1～         | 商品区分               | VARCHAR     |複数の項目から値を紐づける項目|
| Flag    | フラグ      | 1           | 在庫区分               | BIT        |二者択一の項目(TRUE/FALSE, ON/OFF)|
| Num	  | 数          | 1～         | 在庫数                 | 整数       |特定のモノに関する数（数量、幅など）を表す項目|
| Date    | 日付        | -           | 登録日付               |  DATE     |年月日を表す項目|
| Dt	  | 日時        | -           | 更新日付               | DATETIME  |年月日時分秒を表す記録する項目|

* 上記以外の項目はドメインで名前、型を定義して管理する

## 2.2 WHOカラム
* 各テーブルの最後に必ず下記カラムを追加する
    * 登録ユーザーID
    * 登録日時
    * 登録プログラムID
    * 更新ユーザーID
    * 更新プログラムID
    * 更新日時

# 3. 参考文献
https://www.gixo.jp/blog/382/
入力、設定フォームを非同期でsubmitする（Laravel, jQery, Ajax）

## 始めに
設定フォームを非同期でsubmitする（Ajax付）実装を行ったのでメモとして残します。

## 開発環境
| 開発環境    |バージョン |
|-----------|------------|
| __Laravel__ | 8.83.19 |
| __PHP__     | 7.3.10  |
| __jQuery__  | 1.11.0  |

## 実装内容いってみよう
レイアウト、装飾関連はご自分で設定ください。
```PHP:form.blade.php
<form id="setting_form" class="form-group form-float" role="form" method="post" name="setting_form">
                                            // fileを送信する際は→必要（enctype="multipart/form-data"）
@csrf
    <ul class="ul-set">
        <li class="form_1">
            <label>登録欄１：</label>
            <input id="input_form_1" name="input_form_1" @isset($regist_1) value="{{ $regist_1 }}" @endisset>
        </li>
        <li class="form_2">
            <label>登録欄２：</label>
            <input id="input_form_2" name="input_form_2" @isset($regist_2) value="{{ $regist_2 }}" @endisset>
        </li>
        <li class="form_3">
            <label>登録欄３：</label>
            <input id="input_form_3" name="input_form_2" @isset($regist_3) value="{{ $regist_3 }}" @endisset>
        </li>
    </ul>
    <p><input type="submit" id="regist-btn" value="設定保存"></p>
</form>
```

```javascript:form.js
// 「 設定保存 」ボタン押下時
$('#setting_form').on('submit', function(e) {

  // 初期設定
  var arrayFormInfo = [];

  // 設定欄に入力された情報を取得する
  const formInfo = $('form');
  const fd = new FormData(formInfo.get(0));

  // フォームデータを配列に格納
  for(value of fd.entries()){
    console.log(value);
    arrayFormInfo.unshift(value);
  }

  $.ajax({
    url  : '飛ばし先のURL',
    type : "POST",
    data : fd,
    cache       : false,
    contentType : false,
    processData : false,
    dataType    : "json"
  })
  // 成功した時
  .done(function(json){
    var errorMessage = json.errorMessage;
    // エラーがある時
    if(errorMessage.length) {
      alert('登録に失敗しました。');
      or
      var errorMessage = errorMessage.join('\n');
      alert(errorMessage);
    // エラーがない時
    } else {
      alert('登録が完了しました。');
      location.reload();
    }
  })
  // 失敗した時
  .fail(function(jqXHR, textStatus, errorThrown){
    alert('登録に失敗しました。：' + textStatus + ':\n' + errorThrown);
    location.reload();
  });
  return false;
});
```

## 終わりに
閲覧ありがとうございました。
メモ程度なので、ご了承ください。
ご指摘、ご意見ありましたら、コメントよろしくお願いします。
【Swift】コードのみでTableViewを実装する

# はじめに
苦手意識のあるUIKitを克服しよう企画！
これからUIKitの記事も投稿します！
今回はコードのみで最小実装のTableViewを作成してみたいと思います。

https://qiita.com/SNQ-2001/items/d680d8bb4a73106bdefb

https://qiita.com/SNQ-2001/items/f010a0317734ec99bbdc

まずStoryboardを消します。
これは以前書いたので飛ばします。

# 完成サンプル
![simulator_screenshot_D6F38B34-27C3-4D07-BA91-A4B6BDD9DB55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/96425d99-ce65-7f3e-d8e8-392e175d401f.png)

# 実装
```swift
import UIKit

class ViewController: UIViewController {

    let avengers: [String] = ["ソー", "ドクター・ストレンジ", "アイアンマン", "キャプテン・マーベル", "スパイダーマン", "ハルク", "キャプテン・アメリカ"]

    private let tableView: UITableView = {
        let view = UITableView(frame: .zero, style: .grouped)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        setup()
    }

    private func setup() {
        tableView.delegate = self
        tableView.dataSource = self

        view.addSubview(tableView)

        tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
        tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
        tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        avengers.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        var content = cell.defaultContentConfiguration()
        content.text = avengers[indexPath.row]
        cell.contentConfiguration = content
        return cell
    }
}
```

# おわり
SwiftUIばっかやってると忘れるので基本形を記録しておきます笑
CnosDBでページネーションを行う方法

CnosQL では、次の場合に LIMIT\SLIMIT\OFFSET\SOFFSET を使用できます。

LIMIT <N> は、指定された測定から最初の N ポイントを返します。
SLIMIT <N> は、指定された測定の N シリーズからすべてのポイントを返します。
OFFSET <N> は、クエリ結果の N ポイントを改ページします。
SOFFSET <N> は、クエリ結果の N シリーズを改ページします。
SQL と比較すると、CnosQL と SQL には LIMIT\SLIMIT\OFFSET\SOFFSET の構文にいくつかの違いがあります。

SQL では、LIMIT <N> 句を使用して、返されるクエリ結果の数を制限します。ページ分割クエリによく使用されます。

SQL では、OFFSET <N> 句を使用して、N 個のデータをスキップし、クエリ結果を返します。 LIMIT <N> と同様に、OFFSET <N> はクエリのページネーションによく使用されます。

したがって、CnosQL と SQL の違いを理解するには、相対的な概念を明確にする必要があります。

CnosDB は時系列データベースであるため、復元されるデータは SQL データベースとは多少異なります。つまり、CnosDB は、大量の時系列データを格納し、それらのデータをリアルタイムで分析できるように作られています。

CnosDB のデータは、測定値、タグ、フィールド、およびタイムスタンプで構成されています。データ ポイントは、測定のフィールドの 1 つ、測定のすべてのフィールド、またはその間の任意の数を持つことができます。これらの概念は、SQL と比較することで理解できます。

CnosDB の測定は、SQL データベース テーブルに似ています。
CnosDB タグは、SQL データベースのインデックス付きの列に似ています。
CnosDB フィールドは、SQL データベースのインデックスのない列のようなものです。
CnosDB ポイントは SQL 行に似ています。
CnosDB には SQL に似た概念がいくつかありますが、CnosDB シリーズには新しい概念もあります。

シリーズは、共有測定、タグ セット、およびフィールド キーによって定義されるデータの論理グループを意味します。

SQL のデータにはシリーズの概念がないため、SQL は SLIMIT <N> 句と SOFFSET <N> 句をサポートしていません。

CnosDB データベースには多くのシリーズがあります。そのため、SLIMIT\SOFFSET 句を使用して、結果のシリーズを改ページします。
Google TestをCIで実行する

# 前記事
https://qiita.com/skkzsh/items/08ec6d2fd151ebc6d079

# CI で Google Test

https://github.com/google/googletest

CI で Google Test を実行するには, パッケージマネージャで Google Test がインストールできて,
インクルードパスにも自動で通してくれる Linux ディストリビューションを使うとラク. [^1]

[^1]: [リリースノート](https://github.com/google/googletest/releases/tag/v1.15.2) に書いているとおり, Google公式としては最新コミットからのビルドが推奨されています.


それは [**Arch Linux**](https://hub.docker.com/_/archlinux) だ.

たとえば [CircleCI](https://circleci.com/ja) の場合は, 下記のように書けばいい.

```yaml:.circleci/config.yml
version: 2.1
jobs:
  test:
    docker:
      - image: archlinux
    environment:
      GTEST_COLOR: yes # Google Test の出力が白黒にならないようにする
    steps:
      - checkout
      - run:
          command: pacman -Sy --noconfirm make clang gtest
      - run:
          command: make clean testall  # テスト実行
```

# 参考

`GTEST_COLOR` については下記を参照した

https://google.github.io/googletest/advanced.html#colored-terminal-output
Google Testを使うためのMakefile

# 前記事
https://qiita.com/skkzsh/items/f9a619a9084cbd88bf15

:::note
前記事の続きですが, いちおう単独で読めると思います.
本記事では Google Test を使うための `Makefile` を順を追って説明しながら完成させていきます.
:::

https://github.com/google/googletest

# Makefileにコンパイラとオプションだけを書く

まず下記のようにコンパイラとオプションを `Makefile` に書く.

```makefile:コンパイラとオプションだけのMakefile
CXX := g++
CXXFLAGS := -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread
```

これで `make` でコンパイルし, テストを実行できるようになる.

```console
$ make solution_7_1
g++ -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread   solution_7_1.cpp   -o solution_7_1

$ ./solution_7_1
Running main() from /tmp/googletest-20220910-4336-bl42bb/googletest-release-1.12.1/googletest/src/gtest_main.cc
[==========] Running 5 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 5 tests from Inst/TestSuite
[ RUN      ] Inst/TestSuite.Ex/0
[       OK ] Inst/TestSuite.Ex/0 (0 ms)
[ RUN      ] Inst/TestSuite.Ex/1
[       OK ] Inst/TestSuite.Ex/1 (0 ms)
[ RUN      ] Inst/TestSuite.Ex/2
[       OK ] Inst/TestSuite.Ex/2 (0 ms)
[ RUN      ] Inst/TestSuite.Ex/3
[       OK ] Inst/TestSuite.Ex/3 (0 ms)
[ RUN      ] Inst/TestSuite.Ex/4
[       OK ] Inst/TestSuite.Ex/4 (0 ms)
[----------] 5 tests from Inst/TestSuite (0 ms total)

[----------] Global test environment tear-down
[==========] 5 tests from 1 test suite ran. (1 ms total)
[  PASSED  ] 5 tests.
```

# Makefileにターゲットを書く

`make` にターゲットを渡さずにコンパイル, そして複数ファイルに対応させるには,
`Makefile` に下記のようにターゲットを書く. [^1]

[^1]: [`basename`](https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html#index-basename-1) は拡張子を取り除いた文字列を返す組込関数

```makefile:ターゲットを書いたMakefile
CXX := g++
CXXFLAGS := -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread

TARGETS := $(basename $(wildcard solution_[1-9]*_[1-9]*.cpp))  # ワイルドカードは適宜変更

.PHONY: clean

all: $(TARGETS)

clean:
	$(RM) $(TARGETS)
```

これで, `make` を実行するだけで複数のテストコードを一発でコンパイルできる. [^2]

[^2]: [`-j`](https://www.gnu.org/software/make/manual/html_node/Options-Summary.html#index-_002d_002djobs-1) オプションをつけると並列化できる (`-j`の後の数字は並列数)

```console
$ make -j4
g++ -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread    solution_7_1.cpp   -o solution_7_1
g++ -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread    solution_7_2.cpp   -o solution_7_2
g++ -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread    solution_7_3.cpp   -o solution_7_3
.
.
.
(略)
```

# 全テスト実行もできるMakefileにする

テストを一発で全部実行したい場合, `Makefile` やスクリプトを下記のように書けば,
`make testall` で実行できるようになる.

```makefile:全テスト実行もできるMakefile
CXX := g++
CXXFLAGS := -Wall -Wextra -std=c++20 -lgtest_main -lgtest -lpthread

TARGETS := $(basename $(wildcard solution_[1-9]*_[1-9]*.cpp))  # ワイルドカードは適宜変更

.PHONY: testall clean

all: $(TARGETS)

testall: $(TARGETS)
	./runall.sh $(TARGETS)

clean:
	$(RM) $(TARGETS)
```

```bash:runall.sh
#!/bin/bash

exit_code=0  # 初期化

for t in $@; do
  ./$t
  exit_code=$(( $exit_code | $? ))  # 1つでもexit codeが1となれば1を返す
done

exit $exit_code
```

# 続き
複数ファイルで使うアルゴリズムやデータ構造を, 共通のソースファイルとヘッダファイルに切り出すときの `Makefile` については以下の記事に続く.

https://qiita.com/skkzsh/items/056e88c1aaa5b68075bb

CIでの実行については, 以下の記事に続く.

https://qiita.com/skkzsh/items/254a22e5452ba3f8d854
WSL2 を入れようとした際に詰まったこと。Store使えなければ、--web-download オプションを

# 背景
めっちゃ簡単に入れられるようになったはずの WSL
にもかかわらず、新しい場所、新しい PC で入れようとしたらまた詰まったので

基本は以下読めばふつうは問題なし

https://learn.microsoft.com/ja-jp/windows/wsl/install

やっぱり会社環境は鬼門ですね :(

# 問題と対処
## MSStore が使えない環境で、インストールが止まる

<code>wsl --help</code> で出てくる以下のオプションを使う事で、回避可能

> --web-download
>                Microsoft Store からではなく、インターネットから　WSL の最新バージョンをダウンロードします。

## MSStore が使えない環境での、WSL Updateが出来ない

install と同様に

> --web-download

::: note 
systemd が使えない場合には、Update が必要
:::

## Ubuntu インストール時に止まる

.bashrc の Proxy 設定が不足していたくさい

小文字で http_proxy/https_proxy を設定していたが、大文字で追加してみたところいけた。
※念の為 ftp_proxy も入れたけど

## Internet Connection Sharing (ICS) が起動しなかった？

Internet Connection Sharing (ICS) を開始しておいた。

# あとがき
さて、これで、C++/libtorch を進めていける。

三か月 TypeScript / AWS をやってきて、まさかまた大きく方向転換することになるとは思わなかった :laughing:
【論文読み】意味的変換による非重複特徴量を用いたFederated Learning

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「意味的変換による非重複特徴量を用いたFederated Learning」という論文です。  

- タイトル： 【論文読み】意味的変換による非重複特徴量を用いたFederated Learning
- 出典： 森 毅, et al.; 人工知能学会、 2022   
- URL： https://www.jstage.jst.go.jp/article/pjsai/JSAI2022/0/JSAI2022_4Yin226/_article/-char/ja/


## 概要
連合学習のHFLを実行する前と比較して性能が向上した。
３つの提案手法のうち、集約特徴量、推定特徴量、が有用であった。

## 特徴
- 連合学習には、HFL, VFL, FTLの大きく３種類がある。本稿はHFL。  

- HFLを実行する３つの手法を提案  
    - 集約特徴量・・・非超福徳長量を１つの特徴量に集約して共通化する。  
    - 推定特徴量・・・重複特徴量から非重複特徴量を予測するモデルを構築し、それを他組織で推論に使って特徴量を揃えていく。  
    - 共通中間表現・・・中間表現へ変換する。各組織のエンコードした結果の中間表現を揃える。  

- PCAの次元圧縮による評価  
    - 推定特徴量を圧縮した結果が、２つの組織間で似た概形となった。   
    - 共通中間表現を圧縮した結果が、２つの組織間で似た概形とならなかった。   


## 想定される適用例
- プライバシー情報の利活用   
- 共通部分と異なる部分の特徴量があるデータセットで、異なる部分も有効活用し、モデル精度を上げる  


## 参考
- [意味的変換による非重複特徴量を用いたFederated Learning](https://www.jstage.jst.go.jp/article/pjsai/JSAI2022/0/JSAI2022_4Yin226/_article/-char/ja/)