OmniAICreator/Qiita-1.07M huggingface dataset:
僕の思う最強のwindowsを作ってみた！

PCのスペックを鬼ほど食うので、スペックが有り余っている方にはおすすめです。

# 目次
Wallpaper Engin
TranslucentTB
Rainmeter
Spicefy
BetterDiscord
ArcBrowser

# 実行
## TranslucentTB
Microsoft Store からバーを透明にする機能を取得します。

https://apps.microsoft.com/ja-jp/detail/9pf4kz2vn4w9

## バーを消す
下にあるバーを右クリックすることでバーの設定ができます。
私はバーをしまうように設定しました。

## デスクトップ上のアプリを消す
ホーム画面を右クリックし、表示からアプリを消すで消します。
とてもスッキリします！

## Wallpaper Engin
steamで購入できる動くホーム背景です。
500円程度で購入できるので安価で、品質もよいです。

https://store.steampowered.com/app/431960/Wallpaper_Engine/?l=japanese

## Rainmeter
windows用のウィジェットを追加することができます。

https://www.rainmeter.net/

上記のリンクからダウンロードを行えます。
また、今回は以下のMondをダウンロードしました。

https://visualskins.com/skin/mond

Rainmeterを使うにあたってGUIのクセが強かったので解説します。詳しい部分は自分で調べていただきたいです。
ウィジェットの追加を行うためには、スキン管理ファイルから操作を行う必要があります。

ウィジェットを右クリックし、Open skin menu...を選択
![スクリーンショット 2024-05-19 020745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769595/722a44ba-5bca-0f63-9d1d-044633d2eb5b.png)
スキンを管理を選択
![スクリーンショット 2024-05-19 020807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769595/45870d83-7bff-8b74-2b33-204dbb8d0da9.png)
すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769595/c0f94b18-c86f-8edb-8b9b-f694f8782d02.png)
自分のインストールしたファイルがここに表示されるので、好みのファイルを開き```.ini```ファイルを選択したところで**読み込む**を押します。
これで、ウィジェットの追加を行うことができます。

### error Mondのmusic barが正しく反応しない。
Mondtholomewをインストールし、そのmusic barを利用することで解決しました。

https://mondtholomew.rainmeter.skin/

これはRainmeter公式で見かけなかったので、githubからインストールしてください。

### Mondtholomewをカスタマイズ
Mondtholomewには色を変更するための設定がありません。
そのため、背景に合わせて色を変更させることができず、オレンジのままになってしまいます。

Rainmeterの.iniファイルの設定は ドキュメント>Rainmeter>skins の中に入っています。
そのため今回は、music barの歌手名を白に変換しました。

ドキュメント>Rainmeter>skins>Mondtholomew>player>Info.ini
から一番下の部分をこのように変更します。

変更前
```
Y=(5 * #Scale#)R
ClipString=2
InlineSetting=#PlayerInfoInline#
InlinePattern=#PlayerInfoInlinePattern#
```
↓↓↓変更後↓↓↓
```
Y=(5 * #Scale#)R
ClipString=2
```
2つの項目を消しました。

私のホーム画面は最終的に、この様になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769595/e2bf8c16-51b2-31d2-4333-bbdbad731105.png)

## Spicefy
Spicefy は spotify の改造ができるサードパーティーの拡張機能です。
カラーの変更や拡張機能の取得ができます。
**規約違反なので実行する際は自己責任で！！**

まずは普通のspotifyをインストールしてください。

https://www.spotify.com/jp/download/windows/

インストール後にログインとウィンドウを閉じてください。

powershellを開き以下のコマンドを入力してください。
**注意**
コマンドラインではなくpowershellです。iwrコマンドが使えなくて1時間ほど彷徨いました。
```
iwr -useb https://raw.githubusercontent.com/spicetify/spicetify-cli/master/install.ps1 | iex

iwr -useb https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/install.ps1 | iex
```

インストールが終わるとSpicefyが使えるようになっています。
私は以下の方を参考にして拡張機能をインストールしました。

https://qiita.com/leo_canada/items/96b84c7635a562b78e0b

# 注意
PCのスペックを鬼ほど食うので、スペックが有り余っている方にはおすすめです。
決定木と勾配ブースティング決定木でのCART分析

データサイエンスを使った意思決定の中でCART分析というものがあります。
簡単に言えば全体のデータをある基準で分割してある基準で分割してを繰り返してという決定木のやり方を使って分類過程から結果までを可視化しているものです。
そこで思ったのが決定木も勾配ブースティング決定木も同じく決定木でデータを最初の段階で分割していないという共通点があります。
しかし勾配ブースティング決定木は学習しながら最適な決定木を作っていくというところが違います。
そこで実際どのように違うかを見てみようと思います。
# 関数
## 勾配ブースティング決定木(アンサンブル)
```Python3
from sklearn.tree import export_graphviz as EG
from pydotplus import graph_from_dot_data as GFDD
def cart_analysis_ensemble(x, y, model, filename="CART"):
    y_data = list(set(y.values))
    for i in range(len(y_data)):
        y_data[i] = str(y_data[i])
    for i in range(len(model.estimators_[len(model.estimators_)-1])):
        dotdata = EG(model.estimators_[len(model.estimators_)-1, i], filled=True, rounded=True, class_names=y_data, feature_names=x.columns, out_file=None)
        graph = GFDD(dotdata)
        graph.write_png(filename+str(i)+".png")
```
## 決定木
```Python3
from sklearn.tree import export_graphviz as EG
from pydotplus import graph_from_dot_data as GFDD
def cart_analysis(x, y, model, filename="CART"):
    y_data = list(set(y.values))
    for i in range(len(y_data)):
        y_data[i] = str(y_data[i])
    dotdata = EG(model, filled=True, rounded=True, class_names=y_data, feature_names=x.columns, out_file=None)
    graph = GFDD(dotdata)
    graph.write_png(filename+".png")
```

# プログラム
## ライブラリのインポート
```Python3
from lightgbm import LGBMClassifier as LGBMC
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.ensemble import GradientBoostingClassifier as GBC
import pandas as pd

df = pd.read_csv("iris.csv")
y = df["category"]
x = df.drop("category", axis=1)
gbc = GBC()
gbc.fit(x, y)
cart_analysis_ensemble(x, y, gbc, filename="Gradient_boosting_Classifier")

dtc = DTC()
dtc.fit(x, y)
cart_analysis(x, y, dtc, filename="Dicision_Tree_Classifier")
```
この結果得られた決定木が
# 決定木
![Dicision_Tree_Classifier.png2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/0c534098-b22a-95b4-7df5-bce3d24bc812.png)

# 勾配ブースティング決定木
クラスごとなので複数(3つ)あります。
![Gradient_boosting_Classifier0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/963f27b2-37ca-bb03-78bd-688ce3b7d6eb.png)
![Gradient_boosting_Classifier1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/874a9912-76ce-349e-3946-87f766ae3fde.png)
![Gradient_boosting_Classifier2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/7a457961-a8a5-b589-78ac-0c54b76d1c73.png)
初期値で最大の深さが決められて過学習しないようになっていますね。それで恐らくクラス分作られて確率的(Softmax関数？)にやっているのかな？
# まとめ
分析には決定木、予測精度を上げるには勾配ブースティング決定木ですね。
力率改善用電力コンデンサと改善力率との関係

# はじめに
送電工学において一般に需要家の負荷とは遅れ力率のリアクトルがメインであると考えられる。しかし、重負荷の場合は遅れ力率が悪化してしまう。そこで、電力用コンデンサを系統に対して並列に接続することによって力率の向上を図ることができる。そこで、今回は電力用コンデンサを遅れ力率が悪い場合において接続した場合どの程度力率が改善されるのかをプログラムによる数値解析によってシミュレートしてみた。
# 前提条件
系統は3相であるが、簡略化のため1相での等価回路でまずは考える。
系統に接続された負荷と電力用コンデンサの1相等価回路を以下に示す。

![電力用コンデンサ１相分.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/0c06c3de-ada1-6ebf-4ae9-ae2d6429246b.jpeg)


つぎに、有効電力$P$を負荷に供給しつつ、力率角を電力用コンデンサによって$\theta_1$から$\theta_2$に改善したものとする。

ただし、$0<\theta_2<\theta_1$とする。

この場合において、電力ベクトルを書くと以下のようになる。
（電流のベクトルに電圧を掛けたものともみなせる）

![電力用コンデンサベクトル図.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/78759651-5c5c-809e-3612-a3fb7ccee023.jpeg)

ゆえに、電力用コンデンサに要求される無効電力分は、
```math
Q_c=P(tan\theta_1-tan\theta_2)
```
と表すことができる。

# プログラム
横軸$Q_c$、縦軸を変化前の力率、高さを変化後の力率としてコンター図を描くプログラムを書く。

```math
Q_c=P(tan\theta_1-tan\theta_2)
```

より、これを$\theta_2$について解くと以下のようになる。

```math
\theta_2=tan^{-1}(\frac{Q_c}{P}+tan(\theta_1))
```
これを考慮して以下のようなプログラムを書いた。

``` python pf_c.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math 
n=100
P=1.0

theta1=np.linspace(0,math.pi/3,n)
Q=np.linspace(0,2,n)

theta1,Q = np.meshgrid(theta1,Q)

theta2=np.arctan((-Q/P)+np.tan(theta1))

plt.contourf(Q,np.cos(theta1),np.cos(theta2))
plt.xlabel("コンデンサの容量")
plt.ylabel("改善前の力率")
plt.colorbar(label="改善後の力率")
plt.savefig("力率改善電力用コンデンサ.png")
plt.show()
```
これを実行することで得られる画像を以下に示す。

![力率改善電力用コンデンサ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/b13eaf23-d4d2-7101-7bc7-1b0a422a5d2a.png)

グラフを見てわかるように、遅れ力率を改善しすぎると今度は進み力率になってしまうということに注意したい。

# まとめ
一般の遅れ力率の負荷の力率を改善するために電力用コンデンサを用いることが多い。ただしこれは段階的に制御することしかできない。そこで今回は電力用コンデンサの容量を変化させることで、力率がどのように改善されるのかをプログラムで示した。すると、電力用コンデンサを系統に対して投入しすぎると、力率が進み担ってしまうということがわかった。

# 参考文献

https://jeea.or.jp/course/contents/06201/

https://www.amazon.co.jp/%E9%AB%98%E5%9C%A7%E5%8F%97%E9%9B%BB%E8%A8%AD%E5%82%99%E7%AD%89-%E8%A8%AD%E8%A8%88%E3%83%BB%E6%96%BD%E5%B7%A5%E8%A6%81%E9%A0%98-%E6%94%B9%E8%A8%823%E7%89%88-%E3%82%AA%E3%83%BC%E3%83%A0%E7%A4%BE/dp/4274230228/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=M085MC06ODBQ&dib=eyJ2IjoiMSJ9.djP_ilxcG8GuHlqehA7T0RjwFV5MDw8BgosR1xDvaxKmEMWi8cVSmiIUTQl2aztQJMroPd4vHtGCSyDKgLO4T_m0PATqJp_yXNNBk5rcnUtGdtcFEWtDLwpoj8dGtqjiqG0lkM1vCKPslXIHatm7E4ZVUeKhdKMedAFS2jM0MVkn93HoRmEI2gVFf46RMAJuN6znr18fpvtdL9m8mTRaSA.B1bgwCRnBlp2aazJ-fuavbBW_0yuIMtciDoSN3YmHgw&dib_tag=se&keywords=%E9%AB%98%E5%9C%A7%E5%8F%97%E9%9B%BB%E8%A8%AD%E5%82%99%E7%AD%89&qid=1715957566&sprefix=%E9%AB%98%E5%9C%A7%E5%8F%97%E9%9B%BB%E8%A8%AD%E5%82%99%E7%AD%89%2Caps%2C236&sr=8-1
【TailwindCSS】heightにtransitionを設定する方法

heightにtransitionを設定するには`tailwind.config.js`に以下を追記します。


```js:tailwind.config.js

module.exports = {
  theme: {
    extend: {
      transitionProperty: {
        'height': 'height',
      }
    }
  }
}

```

すると`transition-height`が使用可能になります。

```html
<div class="transition-height">
  <!-- ... -->
</div>
```


繰り返し使用しない場合には以下のように記述することもできます。

```html
<div class="transition-[height]">
  <!-- ... -->
</div>
```
noUncheckedIndexedAccessについて理解する

:::note
概要
noUncheckedIndexedAccessをtsconfigでtrueにすると、インデックスシグネチャのような型内で宣言されていないフィールドの型推論にundefinedが追加されます
:::

# 1. 背景
先日の [TSKaigi](https://tskaigi.org/) で [noUncheckedIndexedAccess](https://www.typescriptlang.org/tsconfig/#noUncheckedIndexedAccess) を知ったので復習します！

:::note
まずインデックスシグネチャについて説明し、その後noUncheckedIndexedAccessについて説明します。
:::

# 2. インデックスシグネチャ（インデックス型,index signature）とは

https://www.typescriptlang.org/glossary/#index-signatures

事前にわからないプロパティの型を定義することができます。

```ts
type MathConstants = {
  pi: 3.14159;
  phi: 1.61803;
 
  [key: string]: number;
};
 
interface ModernConstants {
  taniguchi: 0.6782344919;
  raabe: 0.9189385332;
 
  [key: string]: number;
}
```

[playground](https://www.typescriptlang.org/play/?#code/JYOwLgpgTgZghgYwgAgLIHsAm0QGF0gDOYc4hyA3gFDLIkjADmArggBbABcyADAHQA2AOwAOAEwBmACxSAnAEZZAbhrIocOACMI3fgpGyJIgKwSJYlaoDaAawgBPbsSihGAXW4hmAW21QVAL5UAPTByAC0kQjMYJHhVNgIADZwUCgIBMTI3lg4+ET0YITcGNhQeJmFhJahyAAqHOQA7nDk2DCgEJjIEKlJwNBUOWUVBaRFfOpaECq1tPMLCwB6APxUIWENwOQdEEndLeQg6GDI7Z3dWugAbhAANMiE6MjAp9vIAFbMWQAGXr7QH5DXLlfLEcaEPhJCDaQgsGYbRZI+arIA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/2848dbd2-642f-35cb-26a0-33ce522c3413.png)

このlebesgueプロパティは存在するか分からないですが値はnumber型になっています。


# 3. noUncheckedIndexedAccessとは

[tsconfigのdoc](https://www.typescriptlang.org/tsconfig/#noUncheckedIndexedAccess)

trueにするとインデックスシグネチャのような、型内で宣言されていないフィールドの型推論にundefinedが追加されます。

## この設定がfalseの時

[playgrpund](https://www.typescriptlang.org/play/?#code/JYOwLgpgTgZghgYwgAgKIgG7CgexAWwnADU4oBnZAbwChlkA5AQQFlUAuZcsKUAcwDcdZAHkAyp268QgmsID085AFUQAaxA4A7iGQAHXHuhhgESmRQIcGaBAAmyAEYBPZGAAWwSqDsQAHlzAfCBwYACuUBAAdMIA2gY4egxwhJI8-AC6adKyAL5yvggANhbIViDcyEQYnOhYuAREYKQUQjSKyAAiEMUWDnCU-l4mMjTlleTO5MmEyAC8VZhRzGxC42DIOJQL1VHiQh30yAB6APxyHQw4G4UlkXYANE5hG449cGHkKDgwbu4oPn87SU5CCIXCkSeHiIyGAGy8ZTwoN892QcC46VG62Qml8dXmiwwyxEnVQAH1UAxiAclEczkA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/c8560c0f-41d8-288a-ad11-23320400877e.png)

NODE_ENVという実際に存在するか分からないプロパティの値がstring型になっています。

## この設定がtrueの時

[playground](https://www.typescriptlang.org/play/?noUncheckedIndexedAccess=true#code/JYOwLgpgTgZghgYwgAgKIgG7CgexAWwnADU4oBnZAbwChlkA5AQQFlUAuZcsKUAcwDcdZAHkAyp268QgmsID085AFUQAaxA4A7iGQAHXHuhhgESmRQIcGaBAAmyAEYBPZGAAWwSqDsQAHlzAfCBwYACuUBAAdMIA2gY4egxwhJI8-AC6adKyAL40isgAApqqCO4QCGr2AJIgvn72TAhI5OQFSgC03QhhYN2dNL4IADYWyFYg3MhEGJzoWLgERGCkFEIdyAAilWORDnCU-l4mMjST0+TO5MmEyAC8M5hRzGxCF2DIOJSPs1HiQkK9GQAD0APxyQoMHCfYZ7ewAGicfSclTgYXIKBwMDcFWQPn8m3IQRC4UiSI8RHxny8EzwxN8+2QcC46TOH2Qml8CweTwwLxEW1QAH1UAxiIClMDwUA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/4e1c3416-b40d-3038-b6e8-562baa6c31ce.png)

NODE_ENVという実際に存在するか分からないプロパティの型推論にundefinedが追加されています！

# 4. 最後に
TypeScriptの便利な機能を活かせるようにこれからも勉強していきたいです！

# 5. 参考
- [インデックス型 (index signature)](https://typescriptbook.jp/reference/values-types-variables/object/index-signature)
- [TypeScriptの型推論(type inference)を理解する](https://qiita.com/tonio0720/items/6ab9ac56ae0406aad9dc)

本記事を読んで頂き、ありがとうございました。
いいねいただけると記事執筆の励みになりますので、参考になったと思われた方は是非よろしくお願い致します🙏
hyakuvba 複数セルbody


Sub CreateOutlookMail()

    Dim OutlookApp
    Dim OutlookMail
    Dim rngTo As Range
    Dim cell As Range
    Dim recipient As String
    Dim subject As String
    Dim body As String
    Dim rngBody As Range
    Dim cellBody As Range

    ' Outlookアプリケーションを起動または取得
    On Error Resume Next
    Set OutlookApp = GetObject(, "Outlook.Application")
    If OutlookApp Is Nothing Then
        Set OutlookApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0

    ' メールアイテムを作成
    Set OutlookMail = OutlookApp.CreateItem(olMailItem)

    ' 宛先範囲の指定
    Set rngTo = Range("A1:A10")

    ' 宛先の取得
    recipient = ""
    For Each cell In rngTo
        If cell.Value <> "" Then
            recipient = recipient & cell.Value & ";"
        Else
            Exit For
        End If
    Next cell

    ' 件名の取得
    subject = Range("B1").Value

    ' 本文の取得
    Set rngBody = Range("C1:D3")
    body = ""
    For Each cellBody In rngBody
        body = body & cellBody.Value & vbTab
        ' 行の最後のセルのときに改行を追加
        If cellBody.Column = rngBody.Columns(rngBody.Columns.Count).Column Then
            body = body & vbCrLf
        End If
    Next cellBody

    ' メールのプロパティを設定
    With OutlookMail
        .To = recipient
        .subject = subject
        .body = body
        .Display ' メールを表示
    End With

    ' オブジェクトを解放
    Set OutlookMail = Nothing
    Set OutlookApp = Nothing
End Sub
ArduinoでCH32X035をHID Keyboardとして使えるようにする

Arduinoで __CH32X035__ の __HID Keyboard__ を使えるようにします。

__arduino_core_ch32__ にUSBのサンプルプログラムが存在しませんでした。
__Github__ の __Issue__ にてサンプルプログラムがありましたのでこちらを弄ってみます。
### A simple demo for USB Keyboard with CH32X033 #61

https://github.com/openwch/arduino_core_ch32/issues/61
# プログラム
__CH32X033__ 用のプログラム __CH32X033USBKB.zip__ をダウンロードします。

https://github.com/openwch/arduino_core_ch32/files/14252713/CH32X033USBKB.zip

__WWW.LAB-Z.COM Ch32x033 Arduino 环境USB 键盘开发__

https://www.lab-z.com/ch32usbkb/
# 実行する
最初にそのまま動かしてみましょう。
__Serial2__ でエラーが出ますので __Serial__ に直します。
# 主にUSB Keyboardで使うコード
USB キーボードを作る際に主に以下3つの動作が行われます。
## Press
押し続ける
## Release
離す
## Write
一度だけ入力する

今回のサンプルプログラムは __USBFS_Endp_DataUp__ の1コードのみとなっていることと
__Write__ は __Press__ と __Release__ を1つにして構成されているようなので今回は、こちらを加工して作ってみます。
# USBFS_Endp_DataUp
__USBFS_Endp_DataUp__ は __ch32x035_usbfs_device.c__ において以下のようなプログラムになっています。
```
 * @fn      USBFS_Endp_DataUp
 *
 * @brief   USBFS device data upload
 *
 * @return  none
 */
uint8_t USBFS_Endp_DataUp(uint8_t endp, uint8_t *pbuf, uint16_t len, uint8_t mod)
{

    /* DMA config, endp_ctrl config, endp_len config */
    if( ( endp >= DEF_UEP1 ) && ( endp <= DEF_UEP7 ) )
    {
        if( USBFS_Endp_Busy[ endp ] == 0 )
        {
            USBFS_Endp_Busy[ endp ] = 0x01;

            /* copy mode */
            memcpy( USBFS_EP1_Buf, pbuf, len );
            USBFSD->UEP1_TX_LEN = len;
            USBFSD->UEP1_CTRL_H = ( USBFSD->UEP1_CTRL_H & ~USBFS_UEP_T_RES_MASK ) | USBFS_UEP_T_RES_ACK;
        }
        else
        {
            return NoREADY;
        }
    }
    else
    {
        return NoREADY;
    }
    return READY;
}
```
# 記述例
3つの動作を以下のようにしてみます。
キー入力は、チャタリングがあるので、__delay__ を入れます。
これにより、__Press,Release,Write__ となります。

## Press
        Buffer[2] = 0x04; //"A"
        USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
        Serial.println("Send pressA");
        delay(50);
## Release
        memset(Buffer, 0, sizeof(Buffer));
        USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
        Serial.println("Send ReleaseA");
        delay(100);
## Write
        Buffer[2] = 0x04; //"A"
        USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
        delay(50);
        memset(Buffer, 0, sizeof(Buffer));
        Serial.println("Send pressA");
        USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
        Serial.println("Send ReleaseL");
        delay(50);    
# 最後に
Serial.printlnは最終的に外して問題ありません。
USBSerialが使えていませんが、いずれ、アップデートされる事でCH55xの代わりのマイコンとして使用できるのではと期待しています。
RESTについて

# はじめに
今回はRESTについて勉強したのでまとめようと思います。

# RESTとは
`Representational State Transfer`の略で、シンプルなWEBサービスの設計思想の1つです。
WEBサービスとはインターネット上で情報を提供するシステムのことです。例えばQiitaなどもWEBサービスの1つです。

# REST APIとは
RESTのルール(RESTの4原則)に従ったAPIのことです。

# RESTの4原則とは
### ①アドレス可能性 (Addressability)
WEB上の全てのリソースが一意なURLでアクセスが可能なこと
例)`https://test.com/profiles/tarou_tanaka`と検索すると、田中太郎さんのプロフィール画面にアクセスすることができる

### ②統一インターフェース(Uniform Interface)
あらかじめ定義・共有された方法でやり取りを行うこと。
情報の操作は全てHTTPメソッドを利用すること。

| メソッド名 | 役割 |
|----------|----------|
| GET | 何かしらのデータを取得する時に使う |
| POST | クライアントからサーバにデータを送信する時に使う(主に新規登録) |
| PUT | クライアントからサーバにデータを送信する時に使う(更新) |
| DELETE | 既存データを削除したい時に使う |

### ③ステートレス性(Stateless)
サーバーがクライアントの状態を持たないように設計するため、やりとりが1回ごとに完結する。

### ④接続性(Connectability)
情報の内部に、別の情報へのリンクを含めることができること。
<br>
これらの4つを満たすシステムを`RESTfulなシステム`と言います。

# movieをリソースとして CRUD操作のURI、HTTPメソッドを定義してみよう
上記の情報を踏まえて、実際にmovieをリソースとしてURL・HTTPメソッドの定義をしてみましょう。

| URL | HTTPメソッド | 何をしているか |
|:---------|:---------|:---------|
| /movies | GET | 映画の一覧を取得 |
| /movies/1 | GET | id:1の"アナと雪の女王"の映画情報を取得 |
| /movies | POST | 新規登録 |
| /movies/{id} | PUT | idの情報を更新 |
| /movies/{id} | DELETE | idの情報を削除 |

# さいごに
RESTは調べつつ書いていても、概念を把握しきるのは難しいと感じました。
WEBサービスを作成する際には、RESTfulな設計を心がけていきたいと思います。

# 参考文献
https://www.youtube.com/watch?v=rEGmSRZ-dWY
git stash の使い方の紹介

現在、feature/a branchで開発を進めていて、同僚がfeature/b branchでcode reviewを必要とするpull requestを送ってきたとします。まだコミットしていないテスト中のコードがあり、それはまだ実験中のためです。
この状況では、次のように使えます：
```bash
git stash
```
一時的に変更を保存します。
あるいは、次の方法も使えます：
```bash
git stash push -m "add feature A"
```
後で識別しやすくするために、このスタッシュに説明を追加します。
コマンドを実行すると、コードは前のコミットの状態に戻ります。

その後、スタッシュしたコードを復元したい場合は、まず次のコマンドを使用します：
```bash
git stash list
```
どのスタッシュが利用可能かを確認します。
その後、特定のスタッシュをポップせずに復元したい場合は、次のコマンドを使用します：
```bash
git stash apply 0
```
（番号はスタッシュを適用する順番を表し、0 が最新、以降の番号が過去のスタッシュに対応します。番号を指定しない場合、デフォルトで0になります。）

特定のスタッシュを復元してポップしたい場合は、次のコマンドを使用します：
```bash
git stash pop 0
```
（番号はスタッシュを適用する順番を表し、0 が最新、以降の番号が過去のスタッシュに対応します。番号を指定しない場合、デフォルトで0になります。）

リストから特定のスタッシュを削除するには、次のコマンドを使用します：
```bash
git stash drop 0
```
（番号はスタッシュを適用する順番を表し、0 が最新、以降の番号が過去のスタッシュに対応します。番号を指定しない場合、デフォルトで0になります。）

スタッシュリストを全てクリアしたい場合は、次のコマンドを使用します：
```bash
git stash clear
```

以上が紹介したかった内容です。
ご意見やご提案がありましたら、ぜひお聞かせください！

参考文献:

1. [Git STASH Explained in Simple Words](https://www.youtube.com/watch?v=DeU6opFU_zw) by Academind
p5.js の noise() で遊ぶ

# はじめに
たくさんのパーティクルが連続的に、かつそれぞれ独立して動くようなものを作りたいと思います。
`Math.random()` のような関数を使って、パーティクルの座標を動かしていってもいいのですが、それぞれの動きがバラバラすぎて、パーティクルの数を増やしていくと目にうるさくなってしまいます。

# 方法
Processing に用意されている `noise()` というメソッドを使います。
これは、パーリンノイズと呼ばれる、人間にとって自然なゆらぎに見える連続した数値を与えてくれるものです。

# 環境
[editor.p5.js](https://editor.p5js.org/)
p5.js: v1.9.3

本プロジェクトにIDEを使う利点が見出だせなかったので、今回は Processing (Java) ではなく p5.js で実装しました。

# コード例
```js:sketch.js
class DriftingPoint {
  constructor() {
    this.seed = random() * 10;
    this.noiseLevel = width >= height ? width : height;
    this.noiseScale = 0.0002;
  }
  
  draw() {
    this.update();
    point(this.x, this.y);
  }
  
  update() {
    this.x = this.noiseLevel * noise(frameCount * this.noiseScale + this.seed);
    this.y = this.noiseLevel * noise(frameCount * this.noiseScale + this.seed + 10000);
  }
} // class DriftingPoint


const pointList = [];

function setup() {
  createCanvas(400, 400);
  strokeWeight(10);
  
  for(let i=0; i<100; i++) {
    pointList.push(new DriftingPoint());
  }
}

function draw() {
  background(220);
  pointList.forEach(p => p.draw());
}
```

**実行結果**
![20240517-214033.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494074/c94bcfe4-27bb-89bf-b879-3d7812699960.gif)
この程度の散らばり具合だと、じつはランダムではないということがわかると思います。

-----

上記のコードの3行目を以下のように変えて散らばり具合を大きくしてみます。
```js
this.seed = random() * 1000;
```

結果は以下のとおりです。
![20240517-214000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494074/2b2e8656-9422-1276-72c9-39486a3c3874.gif)
それぞれが連続的に、とはいえいくらかの不規則性を持って動いているのがわかります。

# 余談
p5.js の実行画面を簡単に録画できる [p5.capture](https://github.com/tapioca24/p5.capture) というライブラリがとても便利で感動しました。
今後積極的に使っていきたいです。

あと、 `class DriftingPoint` 内で `noiseScale` を static プロパティとして宣言したかったのですが、
`Class properties must be methods. Expected '(' but instead saw 'noiseScale'.` と怒られてしまいました。クラスもスタティックプロパティを持つことができるという認識だったので、どうすればいいか調べてみましたが理由がよくわかりませんでした。
ファイルツリー生成

初めてコードレビューをしていただいた際に、教えていただいた感激機能を共有:sparkles:



# Ascii Tree Generator
#### 階層構造テキストを生成してくれる機能
階層構造テキストとは...
README.mdに記載したりするコードのファイル構造のこと。
```
├── Main
│   ├── hello.py
│   └── test.py
└── Text
    └── world.txt
```
・ディレクトリ構成図
・ファイルツリー
など色々な呼び方があるみたい:thinking:


上記のものを作成する際に便利なのが __Ascii Tree Generator__
![スクリーンショット 2024-05-17 212351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/6d0ee476-5a1b-540d-f55a-26d841209428.png)


# 使用方法
.txtファイルに下記のように入力
```
#Main
##hello.py
##test.py
#Text
###SubMain
###subText.txt
##world.txt
```
Mainディレクトリの中にhello.pyとtest.pyが存在する
Textディレクトリの中にあるworld.txt
Textディレクトリの中にあるSubMainディレクトリ
また、SubMainディレクトリ中にあるsubText.txt

文字やとわかりづら...

#### 記述したテキストをドラッグし、右クリック
#### Format Text to Tree Stringを選択
![スクリーンショット 2024-05-17 213626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/8929c8df-513c-fc48-8551-db68fa610bb3.png)

<br></br>
すると、このように変換される
```
├── Main
│   ├── hello.py
│   └── test.py
└── Text
    ├── SubMain
    │   └── subText.txt
    └── world.txt
```

ありがたい機能:sparkles:

# 参考記事
[VS Code でファイルツリー風の階層構造テキストを生成する方法](https://kaleidot725.medium.com/vs-code-%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%84%E3%83%AA%E3%83%BC%E9%A2%A8%E3%81%AE%E9%9A%8E%E5%B1%A4%E6%A7%8B%E9%80%A0%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-b904cd7c7e1f)
はじめてのWebサーバで常時SSL化(https)にする（さくらのWebサーバ、nginx、tomcat)

# はじめてのWebサーバで常時SSL化(https)する

## 1. 前提条件
既に導入が済んでいるもの
- さくらのVPS[サーバ申込]
- CentOS Stream 9[さくらのVPS上にインストール済]
- Tera Term 5 [インストール済]
- ドメイン導入[お名前.com利用しました]
- JavaEE 11
- tomcat 9.0.88
これらの設定については、[はじめてのWebサーバ構築（centOS Stream 9, Java 11, tomcat 9, サーブレット)](https://qiita.com/modgoodluck/items/fb1f481c616824aa1bbc)で記事にしましたので、良かったら参考にしてください。
- MySQL 8.0.36
MySQLのインストールについては、[はじめてのWebサーバでデータベースを利用①(さくらのVPS, CentOS Stream 9, MySQL, Java 11, Tomcat 9, サーブレット&JSP)](https://qiita.com/modgoodluck/items/f8b1d6382b3b93149512)で記事にしましたので、こちらも良かったら参考にしてください。

:::note info
今回特に影響があったのは、自分がnginxをリバースプロキシとして、tomcatにアクセスする設定を行っていた部分です。
このために他の常時SSL化の方法と合わない部分がありました。同様の設定を行っている方に対しては、役に立つと思います。
:::

このページで設定するもの
- 常時SSL証明書
- [自分のHP](http://svw.modgoodluck.com/selfIntroduce/)の常時SSL化

今回はCopliot先生にお世話になりました。
# 1\. Aレコード、AAAAレコードの設定
これまでIPV4しか扱ってこなかったが、設定を強く勧めるもののようだった。
さらには、ホスト名として使用していたsvw.modgoodluck.comのみならず、modgoodluck.comに対してもAレコード、AAAAレコードの登録が必要とのこと。本当に必要かどうかの検証は行っていないが、上手くいったケースとしてそのまま載せておく。計４件の登録となった。
※AAAAレコードは、IPv6版のAレコード。さくらのVPSならログインした最初の画面でIPv6を確認できる。

No. ドメイン名 レコード名
①　modgoodluck.com Aレコード
②　modgoodluck.com AAAAレコード
③　svw.modgoodluck.com Aレコード
④　svw.modgoodluck.com AAAAレコード
これらを「お名前ドットコム」で登録。

# 2\.SSL証明書のインストール、SSL証明書の自動更新設定

以下を実行。
```ruby
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx
```
```ruby
certbot --nginx
```
上手くいくと、以下のような表示が出る。
```ruby
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: svw.modgoodluck.com 
#ここは、/etc/nginx/conf.d/tomcat.confに記載されたドメイン名が表示される。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for svw.modgoodluck.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/svw.modgoodluck.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/svw.modgoodluck.com/privkey.pem
This certificate expires on 2024-08-15. #証明書期限が表示される
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
#ウラで自動更新が設定されました、とのこと

Deploying certificate
Successfully deployed certificate for svw.modgoodluck.com to /etc/nginx/conf.d/tomcat.conf
Congratulations! You have successfully enabled HTTPS on https://svw.modgoodluck.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```

# 3\.確認
実際に、https:/\/でURLを入力して、アクセスできることを確認。

# 4\.おわりに
調べる時間はそれなりに必要だったが、やってみたらとてもシンプルだった。
誰かのお役に立ちますように。
【AtCoder】備忘録344-B

## 問題

https://atcoder.jp/contests/abc344/tasks/abc344_b

PHPで解いています。

## 解答

```php
<?php

$inputs = [];

while (fscanf(STDIN, "%d", $number) == 1 && $number !== 0) {
    $inputs[] = $number;
}
echo 0 . "\n";

$reversed = array_reverse($inputs);

foreach($reversed as $value){
    echo $value.PHP_EOL;
}

```

## つまづいたポイント

:::note info
**0の入力、出力の理解**
:::

すべての整数配列に追加してから逆順に出力していたため、0 が最後に出てこなかった。<br>
私は**0も含めて逆順にする**構文を書いていました。<br>しかし要件には**0を最初に出力し、残りを逆順に出力する**と書いてあります。<br>これらは一見結果が同じように見える場合もありますが、要件に明示された通りに処理を行うことが正しい方法です。<br>
<br>

:::note info
**fscanf の動作**
:::

fscanf 関数は、標準入力（STDIN）からデータを読み取り、指定された形式（ここでは "%d" という整数形式）に従って変数に格納します。

```php
while (fscanf(STDIN, "%d", $number) == 1 && $number !== 0) {
    $inputs[] = $number;
}
```

この場合、1つの整数を読み取るので、正常に読み取れれば 1 を返します。
読み取りに失敗した場合（例えば、入力が終了した場合や形式が合わない場合）は 0 あるいは EOF を返します。
拡張子変換バッチ

```bat

@echo off
setlocal enabledelayedexpansion

rem 対象のディレクトリを指定
set "target_dir=C:\path\to\your\folder"

rem カレントディレクトリを変更
cd /d "%target_dir%"

rem ファイルの拡張子を大文字に変更
for %%f in (*.csv) do (
    set "filename=%%~nf"
    ren "%%f" "!filename!.CSV"
)

endlocal
```
Uncaught ReferenceError: process is not definedが表示される

## 初めに
元医療職 → WEB制作者がReact開発で詰まった箇所を日々発信しています！
現在はJISOUというコミュニティに所属してReact開発を学習中。
今回はsupabaseのデータを取得する際に、タイトルのエラーが出たのでまとめます。

## 問題点
supabaseからデータを引用する際にsupabase URLとsupabase API KEYを用いるかと思います。
そこで.envファイルを作成して以下の内容を記述
```
VITE_SUPABASE_URL = supabaseのURL
VITE_SUPABASE_ANON_KEY = supabaseのAPI KEY
```

supabaseのファイル内に以下を記述
```typescript
import { createClient } from '@supabase/supabase-js';

const SUPABASE_URL = process.env.VITE_SUPABASE_URL as string;
const SUPABASE_ANON_KEY = process.env.VITE_SUPABASE_ANON_KEY as string;

export const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
```

これでローカル環境でページを確認するとコンソールにエラーが出ています。
「**Uncaught ReferenceError: process is not defined**」

直訳でprocessが定義されていないと出ています。
これはviteでは.envファイルが利用できない？ことが原因だそうです。

## 解決方法

.envファイルを利用するには以下の手順を踏みます。

1\. 以下をターミナルに入力
`npm i vite-plugin-env-compatible`

2\. vite.config.tsファイル内を以下の記述に変更
```typescript
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import env from "vite-plugin-env-compatible";

export default defineConfig({
    plugins: [react(), env({ prefix: "VITE", mountedPath: "process.env" })],
});
```

## 終わりに
今まで何度も動画講義でやっていたのですが、いざ自分でやるとなると全く覚えていませんでした。
やはり動画の講義だけだと頭に残らないですね...
自分の手を動かして初めて自分が理解できていないところを理解しました。
**アウトプット大切！！！**
【Nextjs・SSG】リロードすると404 Not foundになった

# はじめに
NextjsでSSGとしてビルドしたものをfirebase hostingにデプロイした際に問題が発生したのでまとめたいと思います。

# 問題
特定のページをリロードすると404not foundと表示されてしまう(最初にクリックした際には可能)

# 解決策
以下のように追加した
```ts
/**
 * @type {import('next').NextConfig}
 */
const nextConfig = {
  output: "export",
  trailingSlash: true, // ここを追記
};

module.exports = nextConfig;
```

# 原因
***https:\//example.com/about***というページを作るとします。
next buildでビルドしたときに生成されるのは、***about.html***というhtmlファイルですが、firebase hostingにデプロイすると***https:\//example.com/about/index.html***に***about.html***が割り当てられてしまいます。

この<font color="red">**パスのずれ**</font>が今回の問題を発生させる原因となりました。

# 終わりに
検索に引っ掛かったので今回は解決が早く済みました。リダイレクトの仕組み等を理解していないなと思ったのでまた後で確認したいと思っています。
4バイト文字を使った量子コンピュータアーキテクチャ


class 量子ビット:
    def __init__(self):
        self.状態 = np.array([1, 0], dtype=complex)

    def 𝐗(self):
        self.状態 = np.dot(np.array([[0, 1], [1, 0]]), self.状態)

    def 𝐘(self):
        self.状態 = np.dot(np.array([[0, -1j], [1j, 0]]), self.状態)

    def 𝐙(self):
        self.状態 = np.dot(np.array([[1, 0], [0, -1]]), self.状態)

    def 𝐇(self):
        self.状態 = np.dot(np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2), self.状態)

    def 測定(self):
        確率 = np.abs(self.状態) ** 2
        結果 = np.random.choice([0, 1], p=確率)
        self.状態 = np.array([int(結果 == 0), int(結果 == 1)], dtype=complex)
        return 結果

class 量子回路:
    def __init__(self, 量子ビット数):
        self.量子ビット列 = [量子ビット() for _ in range(量子ビット数)]

    def 𝐗(self, ターゲット):
        self.量子ビット列[ターゲット].𝐗()

    def 𝐘(self, ターゲット):
        self.量子ビット列[ターゲット].𝐘()

    def 𝐙(self, ターゲット):
        self.量子ビット列[ターゲット].𝐙()

    def 𝐇(self, ターゲット):
        self.量子ビット列[ターゲット].𝐇()

    def 𝐂𝐍𝐎𝐓(self, コントロール, ターゲット):
        if self.量子ビット列[コントロール].測定() == 1:
            self.量子ビット列[ターゲット].𝐗()

    def 測定(self):
        結果 = [量子ビット.測定() for 量子ビット in self.量子ビット列]
        return 結果


    graph TD
    A[量子ビット] --> B(量子回路)
    B --> C{量子ゲート}
    C --> D[単一量子ビットゲート]
    D --> E[X]
    D --> F[Y]
    D --> G[Z]
    D --> H[H]
    D --> I[RX]
    D --> J[RY]
    D --> K[RZ]
    C --> L[複数量子ビットゲート]
    L --> M[CNOT]
    L --> N[SWAP]
    L --> O[CZ]
    B --> P[量子状態]
    P --> Q[ベクトル表現]
    P --> R[密度行列表現]
    B --> S[測定]
    B --> T[回路操作]
    T --> U[複製]
    T --> V[結合]
    T --> W[逆操作]
    T --> X[深さ計算]
    B --> Y[可視化]

    こんな感じでUTF-8が4バイト可変長という特徴を活かして、
    pythonのライブラリにしてみたいのですがどうでしょう？
Azure: Bicep の設定を Azure Portal から調べる

# 背景

bicep で、やりたい事の 設定を探す時に、ドキュメントから探すのに時間がかかっていたので、その対策的な備忘録

# 概要

1. 現状の設定をエクスポートする
1. Portal で設定変更をする
1. 更新後の設定をエクスポートする
1. あとは比較して、設定変更した内容を確認して、bicep へ反映させるだけ。設定が分かれば、Document を探すのも簡単。

# 利用例

Cosmos DB の 合計スループット制限 の設定を探していた際の例です。

当初、autoscaleSettings.maxThroughput だと思っていて変わらなかったので悩んでました・・

## 設定のエクスポート

- オートメーション -> テンプレートのエクスポート で行う。

![2024-05-13_16h43_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/6ca984f7-5bba-b543-99d7-da53a87a1443.png)

- 設定を変更して、保存

今回の場合はココ 

![2024-05-13_16h45_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/6deef81b-1f6e-ba07-f9af-4636237386aa.png)


- で、実際に比較してみたところ、こんな感じ 

![2024-05-13_15h11_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/ee930ab0-c2db-da0e-cc86-aceb40a04ac5.png)

# あとがき

テンプレート確認をすることも大切ですね。
<code>enableFreeTier: true</code> も見つけられたし
諦めずに、色んなことを学んで繋がりだせば、あとは楽しくなるだけ
VirtualBox上のUbuntuで容量が足らなくなったら。。。

### 1. 仮想のハードディスク容量をあげる
ツール -> メディアから、対象のハードディスク容量をあげる

### 2. Ubuntu上でパーティションを拡張する

```
$ sudo parted
(parted) print free
```
で拡張したいパーティションの番号と空き領域があることを確認

```
(parted) resizepart
# 対象番号を聞かれるので入力
# サイズを聞かれるので「100%」と入力
```
終わったらprint freeで空き領域が消えてパーティションのサイズが増えたことを確認

### 3. ファイルシステムに認識させる

```
df -h
sudo resize2fs /dev/sda3
```
対象のFilesystemを指定してresize2fsを実行すればOK


ただのメモ
緯度経度からメートル座標系へ変換（ヒュベニの公式）

# メートル変換
方法は色々ありますが、今回は計算量の少ないヒュベニの公式を使います。

## ヒュベニの公式
ヒュベニの公式は、２つの緯度経度の差をメートル座標系で求める公式です。
そのため、絶対座標は求まりませんが、
基準点を一点に定めることにより、１つの座標系内での位置を求めることが可能です。

### 公式
```math
\begin{align}
a:&=長半径 &
F:&=逆扁平率 \\
e:&=第一離心率
=\frac{\sqrt{2F-1}}{F} \\
\\
\phi:&=緯度&
\lambda:&=経度 \\
\phi0:&=基準緯度&
\lambda0:&=基準経度 \\
\\
\Delta \phi&=\phi-\phi0 &
\Delta \lambda&=\lambda-\lambda0 \\
\\
\mu&=\frac{\lambda+\lambda0}{2} \\
\\
W&=\sqrt{1-e^2 \sin^2 \mu} \\
N&=\frac{a}{W} &
M&=a \left( \frac{1-e^2}{W^3} \right) \\
\\
\Delta X&=\Delta \lambda \cdot N \cdot \cos \mu &
\Delta Y&=\Delta \phi \cdot M
\end{align}
```

### 実装
```cs
/// <summary>ラジアン変換</summary>
const double DEG2RAD = Math.PI / 180;

/// <summary>長半径[GRS80,WGS-84]</summary>
const double a = 6378137;

/// <summary>逆扁平率[GRS80]</summary>
const double F = 298.257222101;

/// <summary>第一離心率の二乗</summary>
const double e2 = (2 * F - 1) / F / F;

/// <summary>メートル座標を求める</summary>
/// <param name="lat">緯度（Degree）</param>
/// <param name="lon">経度（Degree）</param>
/// <param name="lat0">基準緯度（Degree）</param>
/// <param name="lon0">基準経度（Degree）</param>
public static (double X, double Y) Convert(double lat, double lon, double lat0, double lon0)
{
    var nlat = (lat + lat0) / 2 * DEG2RAD;
    var dlat = (lat - lat0) * DEG2RAD;
    var dlon = (lon - lon0) * DEG2RAD;

    var (s, c) = Math.SinCos(nlat);

    var w = Math.Sqrt(1 - e2 * s * s);
    var n = a / w;
    var m = a * (1 - e2) / (w * w * w);

    return (dlon * n * c, dlat * m);
}
```

# まとめ
公式と定数さえ分かっていれば結構簡単です。
長半径と扁平率は使う座標系によって変わりますが、他の計算式はそのまま使えます。
Reflexライブラリのプロジェクトのストラクチャーについて

お疲れ様です。

今日は「Reflexライブラリのプロジェクトのストラクチャーについて」について部分いたします。

英語版は下記ページをご覧ください。

https://reflex.dev/docs/getting-started/project-structure/

## Directory Structure

helloという新しいアプリを作成しましょう。

```
mkdir hello
cd hello
reflex init
```

これにより、次のようなディレクトリ構造が作成されます。

```
hello
├── .web
├── assets
├── hello
│   ├── __init__.py
│   └── hello.py
└── rxconfig.py
```

それぞれのディレクトリとファイルについて見ていきましょう。

### .web

こちらがコンパイルされたJavaScriptファイルが保存される場所です。このディレクトリには触れる必要はありませんが、デバッグに役立つことがあります。

各Reflexページは、`.web/pages`ディレクトリ内に`.js`ファイルとしてコンパイルされます。

### Assets

`assets`ディレクトリは、公開したい静的アセットを保存する場所です。
画像やフォント、その他のファイルが含まれます。
例えば、`assets/image.png`に画像を保存した場合、下記のコードで表示できます。

```
rx.image(src="image.png")
```

## Main Project

プロジェクトを初期化すると、アプリの名前と同じ名前のディレクトリが作成されます。ここに、アプリのロジックを書き込みます。

Reflexは、`hello/hello.py` ファイル内にデフォルトのアプリを生成します。このファイルを編集して、アプリをカスタマイズすることができます。

## Configuration

`rxconfig.py`ファイルは、アプリを設定するために使用できます。デフォルトでは、次のような内容になっています。

```
import reflex as rx

config = rx.Config(
    app_name="hello",
)
```

下記ページで、コンフィギュレーションについて詳しく説明しています。

https://reflex.dev/docs/getting-started/configuration/

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
【入門/初心者向け】Db2運用の基本的な概念を理解できる一連の記事


# はじめに
Db2 LUW (Db2 for Linux, NIX and Windows) を初めてご利用される方でも、Db2運用の基本的な概念が理解できるような、一連の記事が公開されました！

入門、初心者向けの読み物として、わかりやすい内容になっています。

# 「これだけはおさえたい Db2 の運⽤」シリーズ

- [これだけはおさえたい Db2 の運⽤:Db2運用管理_概要編](https://www.ibm.com/support/pages/node/7129884)
- [これだけはおさえたい Db2 の運用: パフォーマンス維持のための運用 (REORG と RUNSTATS) 編](https://www.ibm.com/support/pages/node/7129890)
- [これだけはおさえたい Db2 の運用: Db2 を「見える化」するためのモニタリング運用](https://www.ibm.com/support/pages/node/7130794)
- [これだけはおさえたい Db2 の運用: 障害回復のためのバックアップ・リカバリー](https://www.ibm.com/support/pages/node/7129982)

# 「簡単! Db2の運用」シリーズ
- [簡単! Db2の運用: セルフチューニング・メモリー](https://www.ibm.com/support/pages/node/7142171)
- [簡単! Db2の運用: ログと回復管理](https://www.ibm.com/support/pages/node/7130795)


# その他の運用関連記事
- [Db2 の自動メンテナンス機能でここまでできた](https://www.ibm.com/support/pages/node/7129975)

# 記事の内容の概要

- [これだけはおさえたい Db2 の運⽤:Db2運用管理_概要編](https://www.ibm.com/support/pages/node/7129884)

こちらの記事では、Db2 の運用において必要な作業の全体像について解説されています。
<br>


- [これだけはおさえたい Db2 の運用: パフォーマンス維持のための運用 (REORG と RUNSTATS) 編](https://www.ibm.com/support/pages/node/7129890)

RUNSTATS と REORG の運用方法が解説されています。RUNSTATS と REORG はどのようなもので、どのような目的で実施するのか、おさえておきましょう。
<br>

- [これだけはおさえたい Db2 の運用: Db2 を「見える化」するためのモニタリング運用](https://www.ibm.com/support/pages/node/7130794)

基本のモニタリングと応用編に分けて Db2 のモニタリング手法について解説されています。
<br>

- [これだけはおさえたい Db2 の運用: 障害回復のためのバックアップ・リカバリー](https://www.ibm.com/support/pages/node/7129982)

データベースに障害が発生した場合にデータを復元するために必要なバックアップ運用について解説されています。
<br>

- [簡単! Db2の運用: セルフチューニング・メモリー](https://www.ibm.com/support/pages/node/7142171)

こちらの記事ではDb2のチューニングを自動化するSTMMについて解説されています。
<br>

- [簡単! Db2の運用: ログと回復管理](https://www.ibm.com/support/pages/node/7130795)

データの整合性と回復可能性を保証する仕組みについて解説されています。
<br>

- [Db2 の自動メンテナンス機能でここまでできた](https://www.ibm.com/support/pages/node/7129975)

Db2 における自動メンテナンス機能概要、構成方法、考慮点について解説されています。
<br>

# 補足）
これらの記事は、基本的にDb2のバージョンに依存しない内容となっていますが、最新の情報に関しては、Db2製品マニュアルにてご確認ください。


#  [Db2 11.5 マニュアルのトップページ]
- 日本語
    - https://www.ibm.com/docs/ja/db2/11.5
- 英語
    - https://www.ibm.com/docs/en/db2/11.5
    - 最新情報は英語で更新されていますので英語で確認するのがお薦めです

# [Db2 11.5 システム要件]
稼働環境の前提要件等の確認はこちらでおこないます（英語）
- [System requirements for IBM Db2 for Linux, UNIX, and Windows](
https://www.ibm.com/support/pages/system-requirements-ibm-db2-linux-unix-and-windows)

## 日本のサポート部門によるFAQ集

こちらのサイトには、IBMのソフトウェア・テクニカル・サポートによく寄せられる質問 (FAQ) の一覧があり、非常に有用な情報が数多く記載されています。

[[Db2] Db2 サポートによく寄せられる質問](https://www.ibm.com/support/pages/node/471995)
vmwareにkakli2024をインストール

(2024-05-17)
### 1, vmwareのセットアップ
Windows向け仮想マシンアプリ「VMware Workstation Pro」が無償化されたのでインストールしました。

[参考にしたgigazinのサイト](https://gigazine.net/news/20240516-vmware-workstation-fusion-pro/)

### 2, kaliのセットアップ
#### 2-1,kaliのインストール
[kali Linuxの公式サイト](https://www.kali.org/get-kali/#kali-platforms)からVirtual Machinesを選択し、vmware64をインストール

#### 2-2, vmware上でkaliを展開
ダウンロードしたkaliをPC上で展開
vmwareを開き、仮想マシンを開く（O）を選択
先ほど展開したkaliを選択

### 3, kaliの起動
vmwareで仮想マシンを再生を選択し、
ユーザー名：kali
パスワード：kali
を入力してkaliを起動する

### 4, kaliの設定
キーレイアウトを日本語配列にする
タイムゾーンを変更する
などなど

[こちらを参考](https://qiita.com/v_avenger/items/c85d946ed2b6bf340a84)
libgcc_s.1.1.dylibがロードできない

## 症状
突然、Emacsが起動しなくなった。Homebrewでインストールしたemacs-macで、/Applicationsにエイリアスが置いてあるのだが、クリックしてもウインドウが現れない。ちなみに環境は以下の通り：
- Mac mini (intel core i7)
- MacOS Sonoma 14.4.1
- Homebrew 4.3.0
- Emacs 29.1 (railwaycat/emacsmacport/emacs-mac)

「突然」とか「何もしてないのに」とか言っても原因はあるはずなので、思い返してみると、Homebrewでいくつかパッケージをアップグレードしたのが原因っぽい。
## 調査
GUIではエラーメッセージが見えない（「Emacsが異常終了したのでAppleに通知します」というダイアログは出てくるが、それ以上の情報はまったくない）ので、ターミナルで実行してみる。
```
% cd /usr/local/Cellar/emacs-mac/emacs-29.1-mac-10.0/Emacs.app/Contents/MacOS 
% ./Emacs
dyld[10158]: Library not loaded: @rpath/libgcc_s.1.1.dylib
  Referenced from: <C93A88B4-A5C5-3C6F-9F9B-CB9D58FF003E> /usr/local/Cellar/libgccjit/14.1.0/lib/gcc/current/libgccjit.0.dylib
  Reason: tried: '/usr/local/Cellar/libgccjit/14.1.0/lib/gcc/current/libgcc_s.1.1.dylib' (no such file), '/usr/local/lib/libgcc_s.1.1.dylib' (no such file), '/usr/lib/libgcc_s.1.1.dylib' (no such file, not in dyld cache)
zsh: abort      ./Emacs
```
`libgcc_s.1.1.dylib`が無いのが原因とわかった。

## 解決策
ググってみたが、なぜ無くなったのかはよくわからない。`gcc`パッケージに含まれているようなのだが、`gcc`はすでにインストール済み。念のため再インストールしてみたが変化なし。
探してみると、`/usr/local/Cellar/gcc/14.1.0/lib/gcc/14/libgcc_s.1.1.dylib`はちゃんと存在しているので、`LD_LIBRARY_PATH`に入っていないのが問題のようだ。エラーメッセージを見ると`/usr/local/lib`に置けばよさそうなので、シンボリックリンクを作って解決。
しかし、なぜ今まで動いていたのが動かなくなったのかわからないのが気になる…。
[Google Cloud Speech-to-Text API(V2)] Javaでコンフィグレーションを更新する

Cloud Speech-to-Text API V2(Java)を使用して、
Speech-to-Textのコンフィグレーションを更新する方法についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Cloud Speech-to-Text API(V2)] JavaでSpeech-to-Text APIを使ってみる](https://qiita.com/doran/items/8e4ef896588229c4fed3)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[コンフィグを更新](#1-コンフィグを更新)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. コンフィグを更新
Speech-to-Textのコンフィグレーションを更新します。

### 1.1. スコープ
OAuth2.0でこのAPIを実行するには、以下のスコープを指定してください。
サービスアカウントで実行する場合はスコープの指定は不要です。
```
https://www.googleapis.com/auth/cloud-platform
```

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(SpeechClient client = getSpeechClient()){
        Config.Builder config = Config.newBuilder();
        config.setName(String.format(
                    "projects/%s/locations/%s/config", 
                    "プロジェクトID","ロケーションID"));
        
        UpdateConfigRequest.Builder builder = UpdateConfigRequest.newBuilder();
        builder.setConfig(config.build());
        
        Config response = client.updateConfig(builder.build());
        System.out.println(response);
    }
}
```

#### 1.2.1. HTTPリクエスト
PATCH:　https:\//speech.googleapis.com/v2/projects/{プロジェクトID}/locations/{ロケーションID}/config
が実行されます。

#### 1.2.2. クエリパラメータ
UpdateConfigRequest.Builderのsetメソッドにより、クエリパラメータを追加できます。
build()メソッドでUpdateConfigRequestインスタンスを取得し、
updateConfig()に渡します。

|メソッド|引数|説明|
|---|---|---|
|setConfig|[Config](#configset)|コンフィグ|
|setUpdateMask|FieldMask|更新するフィールド|

#### Config(Set)
|メソッド|引数|説明|
|---|---|---|
|setName|String|【必須】リソースの名前<br>形式："projects/{プロジェクトID}/locations/{ロケーションID}/config"|
|setKmsKeyName|String|オプションのKMSキー名<br>形式："projects/{プロジェクトID}/locations/{ロケーションID}/keyRings/{key_ring}/cryptoKeys/{crypto_key}|


### 1.3. レスポンスの内容
#### Config
|メソッド|戻り値|説明|
|---|---|---|
|getName|String|構成リソースの名前<br>形式："projects/{プロジェクトID}/locations/{ロケーションID}/config"|
|getKmsKeyName|String|オプションのKMSキー名<br>形式："projects/{プロジェクトID}/locations/{ロケーションID}/keyRings/{key_ring}/cryptoKeys/{crypto_key}|
|getUpdateTime|Timestamp|このリソースが最後に変更された時刻|

<br>
<br>
おしまい。。
JavaScriptのtry...catch構文について

# はじめに
JavaScriptには、コードの実行中に発生する可能性のあるエラーをキャッチして適切に処理するためのtry...catch構文があります。この構文を使用することで、エラーが発生してもプログラムがクラッシュせずに処理を続行できます。
## 基本的な構文
```ts
try {
    // エラーが発生する可能性のあるコード
} catch (error) {
    // エラーが発生した場合に実行されるコード
} finally {
    // （オプション）エラーの有無にかかわらず常に実行されるコード
}
```
- **tryブロック**：エラーが発生する可能性のあるコードを記述します。
- **catchブロック**：tryブロック内でエラーが発生した場合に実行されるコードを記述します。発生したエラーを引数として受け取ります。
- **finallyブロック**（オプション）：エラーの有無にかかわらず常に実行されるコードを記述します。

# 基本的な使用例
```js
try {
    let result = someFunction(); // ここでエラーが発生するかもしれない
    console.log(result);
} catch (error) {
    console.error("An error occurred:", error.message); // エラーが発生した場合に実行される
} finally {
    console.log("This will always run regardless of an error."); // 常に実行される
}
```

## try ブロック
tryブロック内には、エラーが発生する可能性のあるコードを記述します。例えば、外部APIの呼び出しやファイルの読み込みなど、エラーが発生するリスクがある処理をここに記述します。
## catch ブロック
tryブロック内でエラーが発生した場合、このブロックが実行されます。catchブロックの引数として渡されるerrorオブジェクトは、発生したエラーの情報を含んでいます。一般的に、error.messageプロパティを使用してエラーメッセージを取得します。
## finally ブロック（オプション）
finallyブロックは、エラーの有無にかかわらず常に実行されます。リソースのクリーンアップなど、必ず実行したい処理がある場合に使用されます。

# ネストされた try...catch
try...catchブロックはネストして使用することもできます。これは、異なるレベルでのエラー処理が必要な場合に便利です。
```js
try {
    try {
        // ここでエラーが発生する可能性がある
        someFunction();
    } catch (innerError) {
        console.error("Inner error:", innerError.message);
    }
    // ここで別のエラーが発生するかもしれない
    anotherFunction();
} catch (outerError) {
    console.error("Outer error:", outerError.message);
}
```
# まとめ
1. try...catchは、コードのエラー処理を行うための強力なツール
2. tryブロック内にエラーが発生する可能性のあるコードを配置し、catchブロックでエラーを処理
3. finallyブロックを使用して、エラーの有無にかかわらず常に実行される処理を記述できる
4. ネストされたtry...catchブロックを使用して、異なるレベルでのエラー処理を行うことができる
Fedora 40 brave ブラウザのアップデートでエラー

さて、Fedora 40 のアップグレードでもしようかな、と思って、次のコマンドを実行しました。

```
$ sudo dnf update
```

ところが、brave のアップデートでエラーになってしまいます。

```
[SKIPPED] brave-browser-1.66.110-1.x86_64.rpm: Already downloaded                                                                                                                                             
/usr/bin/rpmkeys で rpmkeys 実行可能ファイルを使用して、署名を検証します
brave-browser-1.66.110-1.x86_64.rpm の公開鍵がインストールされていません
ダウンロード済みのパッケージは、次の正常なトランザクションまでキャッシュに保存されました。
'dnf clean packages' を実行することでキャッシュパッケージを削除できます。
エラー: GPG の確認に失敗しました
```
まず、rpm -e で brave-browser をアンインストールしておき、次のコマンドを実行して、再インストールしました。

```
$ sudo rpm --import https://brave-browser-rpm-release.s3.brave.com/brave-core.asc
$ sudo dnf --verbose install brave-browser
```

（参考）
 https://discussion.fedoraproject.org/t/fedora38-public-key-for-brave-browser/87875
マルチアーキテクチャーでのコンテナデプロイワークショップを受けてきて

# 経緯
会社の人がGravitonがこの後重要になってくるからGraviton勉強してきてとAWSのアーキテクトの人にお願いした結果、
このワークショップを案内されて受けてきました。

受ける前の私
- GravitonってEC2みたいなAWSのサービスか何かか？って認識
- マルチアーキテクトって何がいいのか、流行ってるのかな

でてくる用語すらわかってない何もわかってない状態がスタート時点だった。

# Gravitonからマルチアーキテクトの必要性について
## Gravitonとは
GravitonはAmazonが設計したarmベースのプロセッサ
AWSのサービスで最適化されるように設計してるそう。

Appleが独自のプロセッサを作ったりしてるように
Amazonも他社に振り回される要素を減らしたいので、推してる。
てことは、Intelのx86系よりGravitonを搭載してるインスタンスの方を安く、性能もでるようになっていきそう。
使える状態にしていった方が受けれる恩恵はありそうである。

詳細は以下の資料に記載してあります。
[https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-Graviton_0430_v1.pdf]

## CPUの差の影響
PCゲームなどで聞きますが、RyzenのCPUだとラグが発生するなどが起きます。
アプリケーションも同じでCPUがx86かarmかで動作が変わってきます。

今後使っていった方がいいGravitonはarm。
それに対して、2024/5時点でメインとなるCPUはIntelのx86。
CPUに差分があっても移行できるOR動作するアプリになっていけるのがベストになっていきそうです。

## マルチアーキテクトとは
Dockerなどのコンテナサービスは以下をまとめてイメージ化してました。
- アプリケーション
- ライブラリ
- OS

マルチアーキテクトではこれにCPUが追加され、以下がセットになってます。
- アプリケーション
- ライブラリ
- OS
- CPU

ワークショップでは、CPUの種類ごとにNodePoolを定義しておくことによって、
たてるインスタンスがx86だったら、x86用の定義をもとにコンテナをたちあげてくれるようになります。

## マルチアーキテクトに対応した場合のメリット
１番はスポットインスが有効に使えること
2024/5時点ではx86系のインスタンスの方がAWSのリソースは潤沢だそうです。
つまり、スポットインスタンスに割り当てられやすいです。
それに対して、オンデマンドインスタンスはarmの方が安いそうです。
そのため、マルチアーキテクト構成にすることによって、費用を抑えることができます。

CPUの移行検証ができること、性能最適になるかの検証ができること
armに移行していく際、過渡期に複数のCPU構成で動かしてくことによって、影響を少なくしながら検証ができます。

# ハンズオンの概要
1. 各CPUによるDockerイメージによるビルド
x86と異なり、armのイメージはどのように作るのかを実践できた
1. CPUの種類を指定したコンテナをそれぞれ立ち上げ
1. 各CPUを定義するためのNodePoolsを作成
CPUごとのテンプレに依って、差分を吸収していると捉える
1. x86でもarmでも同じようにコンテナが立ったり、割合を決めて両のCPUが共存するクラスターを作る

全体でarmとx86が共存した環境を立ち上げるためのやり方を、ハンズオンで試していくことができます。
どのような定義をいれることによって、インスタンスを使い分けたり、差異を吸収したりできるのかを
作った環境で見比べながらできたので、差分から理解をしやすいワークショップでした。
Reactでのパフォーマンス最適化

[UdemyのReact講座](https://www.udemy.com/course/react-complete-guide/?couponCode=LEADERSALE24B)の中でパフォーマンス最適化について学習したのでまとめてみました。

# レンダリングの最適化
### 前提知識
#### Reactが画面を更新する流れ
トリガー：何らかの契機にレンダリングを予約すること
レンダリング：コンポーネントを実行すること
コミット：DOMへの更新を行うこと

#### レンダリングがトリガーされるタイミング
1.初回レンダリング
2.stateの値が変更されたとき

本記事では、2のケースでの最適化を考える。

### 不要なレンダリングとは？
Reactでは、親コンポーネントのレンダリングが走ると自動的に子コンポーネントもレンダリングされる。
つまりデフォルトでは、

親コンポーネントでstateの値が変更される
↓
親コンポーネントのレンダリング
↓
子コンポーネントで使用しているstateの値が変わっていなくてもレンダリング(不要)

の無駄なレンダリングが発生するケースがある。

### 防止策
Reactの標準関数のmemoの引数に子コンポーネントを設定する。
```javascript:Child.jsx
import { memo } from "react";

// stateであるcountの値が変更されたときのみレンダリング
const Child = memo(({ count }) => {

  return (
    <div className="child"
    >
      <h2>子コンポーネント領域</h2>
      <span>ボタンクリック回数：{count}</span>
    </div>
  );
});

export default Child;
```
上記のコードでは
##### 自コンポーネント内のstateの値に変更があった場合のみレンダリングし、無ければレンダリングをしない
ことにより、不要なレンダリングの回避を実現している。


# まとめ
プロジェクトで扱うアプリケーションの規模が大きくなるほど、パフォーマンスの観点は重要になってくる。個人で学習する際にもパフォーマンスを意識する癖をつけていきたい。

------------
追記
パフォーマンス最適化関連は引き続き調査し、随時更新していきます！
補足やご指摘ございましたら、ぜひお知らせいただけますと幸いです。
機械学習 学習まとめ: 教師なし学習

# 教師なし学習
- 教師となるラベル(もしくは目標値)なしで何らか(データの特性や確率分布等)の学習をするアルゴリズム
- タスクとしてはクラスタリングや次元削減など

# k平均法(k-means)
- 教師なし学習
- クラスタリングの手法
    - 与えられたデータをk個のクラスタに分類する
- 手順
    1. 各クラスタの中心の初期値を設定
    1. 各データ点に対し、各クラスタ中心との距離を計算し、最も距離が近いクラスタを割り当てる
    1. 各クラスタの平均ベクトル(中心)を計算する
    1. クラスタの最割り当てと中心の更新を繰り返す
- kの値を変えるとクラスタリング結果も変わる
- 初期値が近いとうまくクラスタリングできない
    - 改良版であるk-means++は最初の中心点を距離が遠いほど確率的に選ばれやすくするアルゴリズムを採用する

# 主成分分析(Principal Component Analysis)
- 教師なし学習
- 主成分(複数の変量を、相関のない少数で全体のばらつきを最も表すもの)を組み合わせて次元削減を行う
    - 類似する(=相関性の高い)複数の説明変数を合成し、主成分とすることで次元削減を行う
    - 特徴量を組み合わせて新たな特徴量を生成するのであり、既にある特徴量から一部を選択するという訳ではない
- 分散が最大になる(データの散らばりが残っている)ような次元圧縮を行う
    - 分散が大きい順から第1主成分、第2主成分、…となる
- 主成分はノルム(長さ)が1になるように正規化する
- 主成分は互いに直交する
- 計算例: TBF
- ちなみに、因子分析も次元削減に利用される
    - 因子分析とは、変数の背後にある潜在的な要因を発見する分析手法
    - 変量間に存在する潜在要因を探し出して次元削減する

# その他の教師なし学習
## ウォード法
- k-meansと異なるクラスタリング手法としてウォード法がある
    - k-meansと異なり、クラスタの階層構造を求めるまで行う
    - 結果は樹形図(デンドログラム)として表される

## 協調フィルタリング
- リコメンデーションに用いられる手法
- ユーザー間の類似度を定義することで、類似度が高いユーザーが購入済みの商品を推薦する
    - ただし、事前にある程度データがないと機能しないというコールドスタート問題がある
- 逆に商品側に特徴量を付与し、特徴が似ている商品を推薦するのはコンテンツベースフィルタリング

## トピックモデル
- クラスタリングを行うが、トピックモデルでは複数のクラスタにデータを分類する
    - 代表的なのが、潜在的ディリクレ配分法(LDA, Latent Dirichlet Allocation)