OmniAICreator/Qiita-1.07M huggingface dataset:
Amazonエンジニアの年収上限が4000万円にアップした背景まとめてみた

![pasted image 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456084/0073f1e8-5257-e7f4-1e8a-4a853b3e8a23.png)
https://oceans.tokyo.jp/article/detail/36460

2022年2月からアメリカのAmazonで働くエンジニアや管理部門で働くスタッフの基本給の上限が4000万まで引き上げされたのなんで？と思ってまとめています！！

しかもこの4000万に引き上げられたのは、マネージャー、ディレクターなどの管理職を除く一般社員だというから驚きです。。
基本年収の他にも、入社時の一時金や譲渡制限付株式ユニットなども含まれるため、実際の支給額はさらに増える見込みで、改善前と比べると約2倍の給料増額になっています。。

Amazonすごい！ってなるところですが、実はこれでも他Apple、Googleなどのライバル企業に比べると若干劣勢になるのだとか。
他大手の企業も特別賞与を支給したりしているそうです。

## なぜそんなにも年収が引き上げられたのか？

その理由は
<strong>「エンジニアを中心とした人手不足」</strong>
<strong>「Amazon退職したい理由が賃金の低さ」</strong>

アマゾンは誰もが知る大手であるのにもかかわらず、2021年、技術職の給与が多い上位7社に入らなかった。他社ではトップの技術職で1億5000万を超える社員がいるそうです。

他社と比べた時に、賃金が市場の水準以下であると転職や退職を考える社員が多くいることが社内アンケートから判明しました。
現在世界でAIを中心としたIT分野へ向かっており、色々な店がインターネット通販に参入してきています。
Amazonはアメリカの本社でシステムを開発して、商品の管理や発送に至るまで、AIやロボットで自動制御しています。
またVRやARを駆使し、現実を超越した世界をデジタル空間やメタバースに生み出そうとする企業が急増してきています。
そのため、プログラミングやIT技術者には、賃金を大幅にあげても優秀なエンジニアを確保したい、優秀な人材の流出を防ぎたいのが、賃金アップの背景です。

今後も世界の大企業の中で専門人材の取り合いや囲い込みが熾烈になっていくことは間違いないでしょう。


## そんな年収上げて大丈夫なの？
そんなに年収上げて大丈夫なのかな、、、と思ったので決算資料というものを見てみました。
ちょっとよくわからないけど、全体で見ると右肩上がりなのでAmazonなら大丈夫そうと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456084/d3054a39-4c74-1362-adbc-a6ddd684509b.png)
■引用元
Amazon決算：大規模解雇など効率化推進、AWSは短期収益より「顧客志向」を優先 | Strainer
https://strainer.jp/notes/7857

給与上げたい！みたいな時には決算資料見て業績とかも確認すると良かったりするという話を聞いたので今後は見ていきたいと思います。
▼決算読むとかわからないエンジニアの人向けに頑張ってまとめてTwitter発信していきますね！（フォローお願いします🙇‍♂️）
https://twitter.com/issueissue4

## じゃあ日本はどうなのか？

日本では賃上げ問題が深刻化してきています。
日本の賃金は、ここ25年先進国の中で唯一のマイナス成長で低迷しています。
このままだと日本国内の優秀なエンジニアは海外の企業に転職していき、気が付けばさらにマイナス成長にとなりかねない危険な状況であると言えます。

▼Twitterでも発信しています
https://twitter.com/issueissue4
▼エンジニア向け案件獲得プラットフォーム
https://i-ssue.com/users/signup

参考文献

https://jbpress.ismedia.jp/articles/-/68786

https://bestcarweb.jp/feature/column/397789https://news.tv-asahi.co.jp/news_international/articles/000244163.html
レゴブロックで作ったエレベーターの組立図 書いてみた　その2　カゴ編

 # カゴ編
## 全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/9fc499d0-0436-f733-c889-09c392290619.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/09f576fb-2fca-9415-b752-95b9a1e493da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/df11146e-c5ac-934a-697a-8e3cc8a4550b.png)

## 小分け分解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/532d8615-56f2-b4cf-fed0-75df5be02e5f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/d69e228f-4b86-ae63-0ad3-a2ed4390ada7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/cbf3727e-7de3-88b2-6742-d069b16f8199.png)

## 機構部


- 扉センサー取付のテクニックプレートはVR取付の為、削ります。
- ツマミ先端にレゴのシャフト用十字孔を開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/cd25772b-33c8-d855-350c-50d0f6254ca2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/b3ee6dad-62e8-c575-c461-edd5a8f3b308.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/195007f8-39e3-e608-3b84-da0efea3e176.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/cdc724a1-a305-6e82-f23e-7960f313f06a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/06f5cd74-da82-94bf-14b6-996f67e58f0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/0a411cef-65e5-0b5b-042c-bce721c9b712.png)

### 最後に
部品名等が小さ過ぎるためこの冊子には記載しておりませんが、
「秋葉原ロボット部」のサイトにて公開したいと思います。
詳細はこちら　https://akbrobot.gitlab.io/blockelevator/
useContextについての学習メモ

前回はuseReducerについて書きましたが、今回はuseContextについての備忘録です。

https://qiita.com/makoto-ogata@github/items/132f0a6b8b3707d90c13

# useContextとは

通常propsを渡す歳に、親から子、子から孫みたいなコンポーネントツリーをバケツリレーで渡すのですが、useContextを使用すれば親から直接孫へpropsを渡すことができます。

## 使い方

以下の様なディレクトリ構造があるとします。
```
.
├── App.jsx
└── components
    ├── Child.jsx
    └── Grandchild.jsx

```

まず親要素に`createContext`で関数を作成します。

```App.jsx
import { createContext } from "react" // インポートでcreateContextを読み込む
import { Child } from "./component/Child";

export const helloContext = createContext("Hello World"); // helloContextを作成。初期値は「Hello World」


export default function App() {
  return (
    <div className="App">
      <h1>useContextの練習</h1>
      <Child /> {// ここで子コンポーネントが呼び出されている}
    </div>
  );
}

```

次に渡したいコンポーネントに`useContext`で渡します。
今回はGrandchild.jsxにuseContextを書いていきます。

```Grandchild.jsx
import { useContext } from "react"; // useContextを読み込む
import { helloContext } from "../App"; // App.jsxで作成したhelloContextを読み込む

export const Grandchild = () => {
  const value = useContext(helloContext); // useContextの引数としてhelloContextを渡してそれを代入
  return (
    <div style={{ backgroundColor: "skyblue", color: "white" }}>
      <h3>孫コンポーネントです</h3>
      <p>渡ってきた値は {value} です</p> {// 代入された値を表示する}
    </div>
  );
};
```

ChildコンポーネントにGrandchildコンポーネントを読み込ませます。

```Child.jsx
import { Grandchild } from "./Grandchild";

export const Child = () => {
  return (
    <div style={{ padding: "10px", backgroundColor: "blue" }}>
      <h2>子コンポーネントです</h2>
      <Grandchild />
    </div>
  );
};
```

### DEMO
App→Child→GrandchildではなくApp→Grandchildで値が渡っているのが分かるかと思います。

https://codesandbox.io/embed/test-context-vnq2c7?fontsize=14&hidenavigation=1&theme=dark

## 任意の値を渡したい場合
上記のコードでは初期値の「Hello World」が表示されていますが、違う値を渡したい場合は`Provider`コンポーネントを使用します。

```diff_javascript
import "./styles.css"
import {createContext} from "react"
import {Child} from "./component/Child"

export const helloContext = createContext("Hello World")

export default function App() {
  return (
    <div className="App">
      <h1>useContextの練習</h1>
+     <helloContext.Provider value={"こんにちは世界"}>
        <Child />
+     </helloContext.Provider>
    </div>
  )
}
```

### DEMO

https://codesandbox.io/embed/test-context-provider-ywxxk2?fontsize=14&hidenavigation=1&theme=dark

## Providerコンポーネントを親と子で両方で使用した場合

以下Childコンポーネント
```diff_javascript
import { Grandchild } from "./Grandchild";
+ import { helloContext } from "../App";

export const Child = () => {
  return (
    <div style={{ padding: "10px", backgroundColor: "blue" }}>
      <h2>子コンポーネントです</h2>
+      <helloContext.Provider value={"Good Bye"}>
        <Grandchild />
+      </helloContext.Provider>
    </div>
  );
};
```

### DEMO

https://codesandbox.io/embed/test-context-use-child-6frz3d?fontsize=14&hidenavigation=1&theme=dark

親と子の両方で値を定義したら、表示させる一番近いコンポーネントが優先されるようです。
この場合は子コンポーネントである`Child.jsx`に記述されたProviderが優先されました。

## 参考サイト

https://dev.classmethod.jp/articles/react-i-checked-again-how-to-use-usecontext/

https://reffect.co.jp/react/react-usecontext-understanding/
GitHubActionsでPullRequestが必要なワークフローを作ろうとした時にハマった事

## はじめに
個人で作っているReactアプリの変更をpushした際、GitHubActionsを使って自動でビルドしてGitHubPagesにデプロイするまでを自動化しようとした際、エラーが発生したのでその解決までをメモする

## 発生したエラー
```sh
/usr/bin/git push origin gh-pages
remote: Permission to xxx/yyy.git denied to github-actions[bot].
fatal: unable to access 'https://github.com/xxx/yyy.git/': The requested URL returned error: 403
Error: Action failed with "The process '/usr/bin/git' failed with exit code 128"
```
エラーから読み取れるのは
* pushする際に403エラーが出ている
* リポジトリの認証周りに問題がありそう？

## 仮説
初めに怪しいと思ったのは、どこからともなく入っているトークン周りで、一体どこから出てきたんだと言わんばかりのここが怪しいと思い、調べたところ問題ないらしい
```shell_session
github_token: ${{ secrets.GITHUB_TOKEN }}
```
> 各ワークフロー実行の開始時に、GitHub によって、ワークフローで使用する一意の GITHUB_TOKEN シークレットが自動的に作成されます。 GITHUB_TOKEN はワークフロー実行での認証に使用できます。

正式らしくて便利としか。すばらしい。

## 解決方法
結局、GitHubActions用のパーミッションをGitHubの設定から変更すれば解決した。
デフォルトだと`Read repository contents and packages permissions`にチェックがついていてRead権限のみなので、Writeも許可するように変更する。するとpushが完了した。
```sh
/usr/bin/git push origin gh-pages
Everything up-to-date
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473989/c28df5a9-a780-8354-cca2-798c48345b6f.png)
## おわりに
CI/CDの構築はいろんな罠が潜むので、しっかりエラーログを見ることが大切。それと、デフォルトはRead権限のみだと覚えておく。

## 参考
https://docs.github.com/ja/actions/security-guides/automatic-token-authentication
タスク管理　スケジューリングアルゴリズム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/32bd5dd8-0aca-3531-5501-d9b585646d63.png)
１：　スケジューリングアルゴリズムとは
　スケジューラが実行可能状態のどのタスクを選ぶのかを決める手順をスケジューリングアルゴリズムと言います。
　優先度順：タスクに優先度をつけ、優先度の最も高いタスクを選ぶ方法である。

　ラウンドロビン：タスクに待ち時間（タイムイライす）を設定し、待ち時間が経過すると次のタスクに順番を回す方法である。
タスク①→タスク②→タスク③→と順番にタスクを選ぶ。

　到着順：実行可能状態になった順にタスクを選ぶ方法である。
Windowsのコマンドプロンプト（bat）でユーザーアカウント画面を開く

# 概要

この画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5905b5c6-e0fa-7ccc-8e98-eae15307277d.png)

# やり方

```bat:
control userpasswords
```

# 参考サイトさん

https://1-notes.com/powershell-cmd-control-user-passwords/

# バージョン

Windows 10 Pro 22H2 19045.3208
Qiitaからブログへ移行しました。～JPPGBゲーム作成コンテスト#0 で大賞・デザイン賞を受賞～


## ゲームコンテストで大賞をいただきました！

先日開催されたコルネさん主催の【JPPGB】ゲーム作成コンテスト #0　にて
栄えある大賞をいただきました！

https://jppgb.connpass.com/event/282845/


* サンプル動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自分のブログを立ててパチスロの記事と動画載せましたー！<br>ブログは作成・移管中なのでリンクだらけですが今後記事増やしていこうと思います。<a href="https://t.co/6Tw6zOXpc3">https://t.co/6Tw6zOXpc3</a><br>7/15日のイベントまでまだあるので、ぜひDLして遊んで投票へのご参加よろしくお願いしますー😄<a href="https://twitter.com/hashtag/JPPGB?src=hash&amp;ref_src=twsrc%5Etfw">#JPPGB</a> <a href="https://t.co/fwnCpBugqi">https://t.co/fwnCpBugqi</a> <a href="https://t.co/mWvzQsK9W3">pic.twitter.com/mWvzQsK9W3</a></p>&mdash; ヨウセイ (@youseibubu) <a href="https://twitter.com/youseibubu/status/1676822111296552962?ref_src=twsrc%5Etfw">July 6, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

* 大賞・デザイン賞
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">投票いただいたみなさま、開催いただいた運営のみなさまのおかげで、映えある大賞、およびデザイン賞をいただきました‼️🏆🎉<br>身に余る光栄です！今後は初代チャンピオン（0代目）に恥じぬよう精進いたします☺️<a href="https://t.co/fwnCpBugqi">https://t.co/fwnCpBugqi</a> <a href="https://twitter.com/hashtag/JPPGB?src=hash&amp;ref_src=twsrc%5Etfw">#JPPGB</a> <a href="https://t.co/Af0JQn14YA">pic.twitter.com/Af0JQn14YA</a></p>&mdash; ヨウセイ (@youseibubu) <a href="https://twitter.com/youseibubu/status/1680444134140817410?ref_src=twsrc%5Etfw">July 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## ブログを立ち上げ新しい記事はそちらに投稿しています。
Qiitaや自社ブログに自分のゲームについてあれこれ記事を書くのもあれなので、これを機にブログを立ち上げました。
ゲームアプリについてや、今後の新しい記事はそちらへ投稿しております。

https://youseibubu.com
【SwiftUI】Listのセパレーターの長さを調節する

# はじめに
セパレーターの長さを変更する方法を調べたので記事にしました。

# サンプルアプリ
ランダムでセパレーターの長さを設定しています
![simulator_screenshot_DDE335AF-F694-41E8-944F-9BDF1A4D68BD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9f58737b-de1a-2c3a-2ceb-c671b9efc821.png)

# 実装
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        List {
            ForEach(0..<50) { _ in
                Text("テスト")
+                   .alignmentGuide(.listRowSeparatorLeading) { viewDimensions in
+                       return CGFloat.random(in: 0.0...100.0)
+                   }
            }
        }
    }
}

```

# おわり
UIKitでいう`separatorInset`ですね

# 参考記事
https://sarunw.com/posts/swiftui-list-row-separator-insets/
【Windowsバッチ】配列のような変数を扱う

Windowsバッチでは他の言語でいうところの配列のような機能はサポートされていないが、環境変数名に「[]」のカッコは使用できるため、見かけ上は配列のような環境変数を扱うことができる。
```test.bat
set test[0]=5
set test[1]=10
set test[2]=15

for /l %%i in (0,1,2) do (
    echo test[%%i]
)
```

```text:出力結果
5
10
15
```
当然だが配列ではないのでソート等の機能は利用できず、見かけ上配列「っぽい」というだけである。
Redshift Serverless RPUスケールの挙動

Redshift Serverlessを使用して気づいたポイントについて記す

# 負荷をかけても期待通りにスケールしない  
Serverlessであり、負荷に応じて自動的にスケールするなら、Base RPUは8(最小値)で良いと考えて設定した。
しかし、実際にQueryを実行すると、非常に実行が遅く、実際に実行時のCloudwatchを見ると全くRPUがスケールしていないことがわかった。
この挙動が疑問に思えたため、以下の試行を行い、挙動を確認した。 (ちなみに試したのは2023年の3月なのでまた挙動は変わっている可能性もある)

まず、十分な負荷のかかるようなデータとSQLを準備するのはそれ自体が工数がかかるので、AWSのブログで紹介されているTPC-DSベースのRedshift用のDWHベンチマークを使用することとした
https://github.com/awslabs/amazon-redshift-utils/tree/master/src/CloudDataWarehouseBenchmark/Cloud-DWB-Derived-from-TPCDS

処理するデータ量にバリエーションがあったが、料金があまりかからないように1TBでBase RPUと並列度を変えながらスケールするか試してみることとした。
※画面はAWSコンソールのRedshift Serverlessのモニタ画面


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/5659d708-b843-4a96-5b14-881322a795fd.png)

まずはBase Capacity=16、10並列で試行
15分程度処理を流したところで、RPU48までスケールしたことが確認できた。
私見ではあるが、想定よりスケールしないという感想。  
負荷がかかったらもっと迅速に、かつリニアに上がってほしいと感じた。
またRPUが48までしかあがらないことも疑問であった。  
***
今度はスケールしなそうなケースを試行する 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/67580566-c992-1605-0dca-09e947cb54ac.png)
Base Capacity=16 並行度1で試すとやはり全くスケールしない結果となった。少なくとも並列クエリが必要に見受けられる。
***
もう少し並列度をあげて試行する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/5c4a0195-149f-57c4-9579-cdace315de98.png)
Base Capacity=16 並行度5
この程度の処理だとやはりスケールしない。
スケールの閾値はこのベンチマークの場合並行度5ー10の間ではないかと推測された。

# 現時点のServerlessで確認できた挙動のまとめ  

- ある程度の数の並列処理を実行しないと全くスケールしない。
- スケールするにしてもすぐにはスケールしない、しばらく経ってからスケールするのである程度長時間の処理が必要。
- スケールするときも大きくはスケールしてくれない。(今回はRPU=16->48までしかスケールしなかった)

# 結論  
スケール頼みにすると使い方で思ったようにスケールしないため、処理が遅くなってしまう可能性がある
その場合はBase Capacityを多めに設定しておく必要がある。
(ただしそうすると少量のRPUで十分な処理であっても、必要な料金が大きくなってしまう)

もう少し負荷にリニアに追従してくれると使いやすと感じたため、今後のアップデートに期待します。
テーブル結合についてまとめてみた

# はじめに
SQLでテーブル結合する動作についてまとめてみました。

# サンプルテーブル
以下のテーブルを用いて説明していく
### employeeテーブル
|id  |name  |
|---|---|
|1  |鈴木  |
|2  |高橋  |
|3  |木村  |
|4  |田口  |

### departmentテーブル
|id  |department_name  |
|---|---|
|1  |開発部  |
|2  |営業部  |
|5  |人事部  |

## データ流し込み用
オンラインのSQLエディタなどを使いお試しください
```sql
create table employee(id integer, name varchar(100));
insert into employee(id, name) values(1, "鈴木");
insert into employee(id, name) values(2, "高橋");
insert into employee(id, name) values(3, "木村");
insert into employee(id, name) values(4, "田口");


create table department(id integer, department_name varchar(100));
insert into department(id, department_name) values(1, "開発部");
insert into department(id, department_name) values(2, "営業部");
insert into department(id, department_name) values(5, "人事部");
```

# `INNER JOIN` -内部結合-
`INNER JOIN`は、結合するテーブルのデータのうち、条件に指定したカラムの値が一致するデータのみを結合します。

```sql:例
SELECT * FROM　テーブルA INNER JOIN テーブルB ON 結合する条件 WHERE 抽出する条件;
```
### サンプルテーブルでデータ抽出をする
```sql
SELECT * FROM employee INNER JOIN department ON employee.id = department.id;
```

```zsh:抽出結果
id	name	id	department_name
1	鈴木	    1	開発部
2	高橋	    2	営業部
```
`id`が一致しないものは除外される

# `LEFT OUTER JOIN` -左外部結合-
`LEFT OUTER JOIN`は、左側のテーブルを全て取り出し、その右側のテーブルのうち、条件に指定したカラムの値が一致するデータのみ結合します。なお、右側に結合するテーブルに一致するカラムが無い場合は、`NULL`が入ります。

```sql:例
-- テーブルAが左側のテーブル、テーブルBが右側のテーブルに当たる
SELECT * FROM　テーブルA LEFT OUTER JOIN テーブルB ON 結合する条件 WHERE 抽出する条件;
```

### サンプルテーブルでデータ抽出をする
```sql
SELECT * FROM employee LEFT OUTER JOIN department ON employee.id = department.id;
```

```zsh:抽出結果
id	name	id	    department_name
1	鈴木	    1	    開発部
2	高橋	    2	    営業部
3	木村	    NULL	NULL
4	田口	    NULL	NULL
```
employeeテーブルのデータは全て出力されているが、`id`が一致しない`4 田口`のデータには`null`が入る


# `RIGHT OUTER JOIN` -右外部結合-
`RIGHT OUTER JOIN` は、右側のテーブルを全て取り出し、その左側のテーブルのうち、条件に指定したカラムの値が一致するデータのみ結合します。なお、左側に結合するテーブルに一致するカラムが無い場合は、`NULL`が入ります。

```sql:例
-- テーブルBが右側のテーブル、テーブルAが左側のテーブルに当たる
SELECT * FROM　テーブルA LEFT OUTER JOIN テーブルB ON 結合する条件 WHERE 抽出する条件;
```

### サンプルテーブルでデータ抽出をする
```sql
SELECT * FROM employee RIGHT OUTER JOIN department ON employee.id = department.id;
```

```zsh:抽出結果
id	    name	id	department_name
1	    鈴木	    1	開発部
2	    高橋	    2	営業部
NULL	NULL	5	人事部
```

# 参考したもの
[【INNER JOIN, LEFT JOIN , RIGHT JOIN】テーブル結合の挙動をまとめてみた【SQL】](https://qiita.com/ngron/items/db4947fb0551f21321c0)
[SQLの基本とも言えるテーブル結合、その種類と使い方について解説](https://style.potepan.com/articles/17010.html)
【PowerAutomateDesktop】日付の変換・活用方法について



日付の変換・活用方法について書いてきます！

今回はテキストとして取得した日付をdatetime型に変換し、加工してExcelのファイル名として使用する例を作成していきます。

## 事前準備

最終的にExcelのファイル名として使用するので、最初に[Excelの起動]で名前を付けて保存するためのファイルを開きました。(新規で作成しても大丈夫です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/3b327f48-be66-7150-4b79-8b4a52d44f98.png)

また、本来はテキストとして外部から取得してくる想定の値ですが、手順省略のためにPAD内でべた書きして準備しました。今回はこちらの日付を変換して活用していきたいと思います！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/d62f57ef-c5e6-945b-dfad-e92d4af9d855.png)


## 日付の変換・活用方法について

テキストとして取得されている`2023年7月24日`を活用するために、日付を変換しましょう。

日付の変換には、アクション─テキストタブにある、[テキストをdatetimeに変換]を使用します。

使用したい値を選択して、保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/7ba7c87a-b99f-3106-59d0-1d4f3e8028e6.png)

変数`TextAsDateTime`が自動生成されます。

一度実行して変数の中身を見てみましょう。

右側の変数タブから変数の中身を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/2ee848ae-a308-a7ef-30a2-339090d0d7f9.png)


無事に日付が変換されました！

しかし、なぜか元の値にはなかったはずの時間まで追加されています。
datetime型に変換すると、時間も取得されてしまうんですね…。

Excelのファイル名は「:」を使うことはできないですし、情報として時間までは必要がないことが多いですよね。

変数から、年月日のみを取り出してみましょう。

[Excelの保存]アクションから、ドキュメントパス名を命名します。.xlsxという拡張子の前の部分がファイル名にあたります。ここに変換した日付をそれぞれ設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/de153ddc-9237-4a61-8e20-14164cc92079.png)

{x}ボタンを押下すると、ドロップダウンリストが表示され、変数`TextAsDateTime`を展開すると、それぞれ.Year、.Manth、.Dayが作成されていると思うので、クリックしてファイル名に追加してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/67211768-2c49-2f3d-fa17-fd79435086b2.png)
このように追加してみました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/f8f336c1-2c36-65bd-1170-33ac5a9a4f3a.png)

フローを実行すると……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/d459317d-e73c-94e4-37eb-217c75b79c0b.png)

無事に年月日のみを使用し、ファイル名を設定することができました！

%で囲われている変数の外に文字を追加してファイル名とすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/b058c749-496c-be69-bff4-7b6ef231f444.png)
↓↓↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/713cf257-267d-1376-601e-cea19fdb7040.png)



## おまけ

逆に、datetimeの値をテキストに変換することもできます。
先程と同じ、アクション─テキストタブにある、[datetimeをテキストに変換]を使用します。

テキストに変換することで、自由に日付の形式を作成することが可能になります。

使用する形式をカスタムを選び、カスタム形式にyyyy-MM-ddと記入し、日付の変換を好きな形に指定してあげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/c17dfcb1-7c67-6ece-7b1d-ce51681c412d.png)
変換された値を格納した変数をファイル名に指定してあげると……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/1b5c5d29-dcf6-01ff-fb55-5a0b9fcae02e.png)
無事に出力されました！


## おわりに

読んでいただきありがとうございました！
お役に立てれば幸いです。
【Windowsバッチ】iniファイル形式のテキストファイルを読み込む

iniファイル形式のテキストファイルを読み込み、パラメータを環境変数に設定する。

```bat:test.bat
for /f "tokens=1,* delims==" %%a in (.¥test.ini) do (
    set %%a=%%b
)
```

「=」を区切り文字とし、その前後をそれぞれ環境変数名と設定値としてset文により環境変数に設定する。厳密にiniファイル形式として認識しているわけではないので、セクション等は考慮されていない点に注意。
UnityWebGLでjslibへ画像を受け渡すときの設定値


# はじめに
UnityWebGLでWebフロント側(jslib)へ画像を受け渡す際に、利用環境によっては他プラットフォームとは異なるTextureImportSettingsの設定を行う必要があるため記録を残します。

# ブラウザで発生するエラー
> 0eb1ab06-f608-4dcb-8095-9eb7ea0d9174:11 ArgumentException: Texture '*****' is not readable. For this reason, scripts cannot access the memory allocated to it. You can make this texture readable in the Texture Import Settings.
> Unsupported texture format - Texture2D::EncodeTo functions do not support compressed texture formats.
> 572ee783-4478-493c-b7bd-2064007ecf57:11 ArgumentNullException: Value cannot be null.
Parameter name: inArray

要約すると以下の内容になっています。
* 読み込み可能になってない
* 圧縮テクスチャが使えない

# 設定例

TextureImportSettings　で対象のファイルを開き、以下の設定を行うとエラーが発生しなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/687afaa6-f6ae-dcd9-d035-baa2b5f7ce4b.png)

以上
ZIOについて

# ZIOのメリット
[What is ZIO?](https://scalac.io/zio/)にZIOの良さが網羅的に書かれていますが、私の主観としては以下の点がメリットであったと感じています。

- 学習コストの低さ
    - 一般的に関数型言語は難しいものですが、ZIOを使った開発では圏論に由来する関数型プログラミングの知識をあまり必要としないため、ZIOの導入はScalaの学習コストを下げる働きがあると感じました。
        - Springフレームワークと比較した場合、暗記する量、覚える量は少ないと感じました。
- コード設計の容易さ
    - ZIOを使用する場合、関数の返り値は自ずとZIO型となるため、使用しない場合に比べ関数の返り値や関数同士の合成が統一的になり、Scalaでの実装経験があまりない場合でも取り組みやすいと感じました。
        - しかしながら上記のメリットを得るためには関数の返り値はZIO型を基本的に返すものとするといったコーディング規約を設ける必要はあると考えています。

ZIOを使うことにより全体的にキャッチアップし易くなる効果があると思いました。

# ZIOのデメリット
また、主観が含まれますが、デメリットは以下の点が挙げられると感じました。

- 他関数型言語への移行の難化
    - ZIOを使った開発では本来関数型言語での開発に当たって知っていた方が良い知識があまりない状態でも開発を進めることが出来るため、もしScalaからZIOのようなライブラリがない他の関数型言語への移行が必要となった場合に移行コストについては上がってしまうことが予想されます。
- ディレクトリ構造を設計する必要があること
    - 他のある程度ディレクトリ構造が定まっているフレームワークと比べ、ディレクトリ構造の自由度が高いため、使用者が設計する必要があります。

最初の点についてはZIOに関する評判はScala界隈で以下のアンケート結果より高いということがわかっているため、今後は他の関数型言語においてもZIOに相当するライブラリ、フレームワークが作られる可能性もある程度高いかと考えております。
[※13ページ(13. ZIO ecosystem)](https://scala-lang.org/resources/img/blog/survey-2022-results/scala_survey_2022_results.pdf)

# 終わりに
ZIOの紹介としてZIOを使った際の個人的な経験に基づくメリット、デメリットについてお話してきました。
以降では大きくバッチ開発とバックエンド開発に分けてZIOについて見ていきます。
まず次章では典型的な``Hello, World!``出力プログラムの作成から始めます。

目次:[ZIOまとめ](https://qiita.com/wc_sangen/private/ae1086b92d97969b61ce)
次章:[Hello, World!](https://qiita.com/wc_sangen/private/cc713cbad4bb604a345d)
NginxでURLエンコードされたパスを含むURLをデコードしないでバックエンドのAPIサーバーにプロキシしたい

NginxでURLエンコードされたパスを含むURLをデコードしないでバックエンドのAPIサーバーにプロキシする話。デコードしないままパスの一部を書き換えてプロキシする方法の解説。

# 背景

NginxでReactのページを返しつつAPIへのリクエストは`http://172.17.0.1:8080`で動くAPIサーバーにプロキシしたいという状況で、`/api/~~~`というフロントからのリクエストをNginxで受けて`/~~~`のように先頭の`/api`を削除してプロキシしたいという状況です。

今回、URLは`/api/aaa/bbb%2Fccc/ddd`のようにURLエンコードされたパスを含むことがあります。この場合、

```
server {
    # HTTPSを利用する設定
    listen       80;
    server_name  localhost;
    location / {
        # Reactを返す方の処理
        root /usr/share/nginx/html;
    }

    location /api/ {
        # APIサーバーにプロキシする処理
        proxy_pass http://172.17.0.1:8080;
    }
}
```

のように普通にプロキシした場合Nginxにデコードされ`/aaa/bbb/ccc/ddd`のように`%2F`をデコードした状態でAPIサーバーに送られてしまいます。

今回はこのデコードされる処理を回避する方法を紹介します。


# デコードしない方法
`$request_uri`にはデコードする前のクエリパラメータ付きのオリジナルのURIが入っています。今回は先頭の`/api`を削除したいので`$request_uri`から先頭の`/api`を削除し`$stripped_uri`に格納しproxy_passに渡しています。

```
server {
    # HTTPSを利用する設定
    listen       80;
    server_name  localhost;
    location / {
        # Reactを返す方の処理
        root /usr/share/nginx/html;
    }

    location /api/ {
        # APIサーバーにプロキシする処理
        set $proxy_uri $request_uri;
        if ($request_uri ~ ^/api(.*)$) {
            set $proxy_uri $1;
        }
        proxy_pass http://172.17.0.1:8080$proxy_uri;
    }
}
```

これで`/api/aaa/bbb%2Fccc/ddd`は`http://172.17.0.1:8080/aaa/bbb%2Fccc/ddd`にプロキシされます。


終わり。
python maya current camera

```python
import maya.cmds as mc

def camLock():
    currentMP = mc.playblast(activeEditor =True)
    currentMP = currentMP.split("|")[-1]
    currentCam = mc.modelPanel(currentMP, q=True, camera=True)
    currentCamShape = mc.listRelatives(currentCam)
    print(currentCamShape)
    focalLength = mc.getAttr("{}.focalLength".format(currentCam))
    print(focalLength)
    aperture = cmds.getAttr(currentCam + '.cameraAperture')
    print(aperture)

camLock()
```
stable diffusion で 画像を学習させる

参考
https://resanaplaza.com/2023/06/18/__trashed-3/

# 今回はLoraを作る

LoRAとは、Low-Rank Adaptationの頭文字を取った略語で、追加学習の際に必要となるメモリと計算量を大幅に削減し、かつ数十枚という少ない画像データでも良好な結果が得られるという、画期的な手法

# 準備

# traning フォルダを作成

・sozai
・outputs
・seisoku
・commandline.txt
・datasetconfig.toml (文字コード utf-8)

traningフォルダを右クリック
-> ターミナルで開く

以下をコピペ

```
git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts
python -m venv venv
.\venv\Scripts\activate
python.exe -m pip install --upgrade pip
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
pip install --upgrade -r requirements.txt
pip install -U -I --no-deps https://github.com/C43H66N12O12S2/stable-diffusion-webui/releases/download/f/xformers-0.0.14.dev0-cp310-cp310-win_amd64.whl
copy .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\
copy .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py
copy .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py
```

`OK`

# 設定

ターミナルより以下を入力

```
accelerate config
```

入力後、

・エンター 2回
・no を 3回
・エンターを1回
・最後にfp16と入力しエンター
（選択式じゃないのでカーソルを押すとエラーになる。）

# Taggerをインスコ

Taggerは画像に埋め込まれたタグ（プロンプト）を参照しているのではなく、画像の中身を認識して適切なタグを生成してくれるため、stable diffusion で生成されていない、普通のデジカメで撮影した画像でもOKです。

stabldediffusion ui を起動
Extensions > installfromurl に以下を入力し、再起動

```
https://github.com/toriato/stable-diffusion-webui-wd14-tagger
```

# 画像を学習させる

ぱくたそから画像をぱくたそ
https://www.pakutaso.com/20120704195post-1718.html

ゆかたの女の子Sサイズを取得

sozaiフォルダに01.jpg として保存
（学習素材は、必ず連番にする。）

Tagger を選択
Batchfrom directroyを選択
Input directory に 素材フォルダのパスを入力
C:\Users\h\OneDrive\デスクトップ\traning\sozai

Outputdirectoryにも上記と同じ内容を入力

Additional tags に yukata と入力

Interrogate を押す

# 結果

01.txt が生成される。
テキストエディタで開き、 "学習させたいキーワードを削除"

今回は kimono を 削除

もし、女性として学習させたいなら、1girl を、人物の顔を学習させたいなら、smile や looking at、grin など顔に関するキーワードを、髪型なら blonde hair などを削除します。

commandline.txt　を開き、以下をコピペ

```
accelerate launch --num_cpu_threads_per_process 1 train_network.py
 --pretrained_model_name_or_path=****モデルファイルのパス****
 --output_dir=****LoRAファイルの出力先フォルダのパス****
 --output_name=FILE_NAME_HERE
 --dataset_config=****datasetconfig.tomlファイルのパス****
 --train_batch_size=1
 --max_train_epochs=10
 --resolution=512,512
 --optimizer_type=AdamW8bit
 --learning_rate=1e-4
 --network_dim=128
 --network_alpha=64
 --enable_bucket
 --bucket_no_upscale
 --lr_scheduler=cosine_with_restarts
 --lr_scheduler_num_cycles=4
 --lr_warmup_steps=500
 --keep_tokens=1
 --shuffle_caption
 --caption_dropout_rate=0.05
 --save_model_as=safetensors
 --clip_skip=2
 --seed=42
 --color_aug
 --xformers
 --mixed_precision=fp16
 --network_module=networks.lora
 --persistent_data_loader_workers
```

datasetconfig.toml

```
[general]
[[datasets]]
[[datasets.subsets]]
image_dir = '****学習ファイル（素材ファイル）を格納したフォルダのパス****'
caption_extension = '.txt'
num_repeats = 10
```

traningフォルダ
-> sd-scripts を選択し右クリック
-> ターミナルで開く

```
.\venv\scripts\activate
```

を実行

commandline.txt をメモ帳で開いて、各行の改行コードを削除し、１つの長い文字列に編集してから、全選択（Ctrl＋A）し、コマンドプロンプトに 貼り付け(Ctrl+V)して、エンターキーを押します。

traning out puts フォルダに lora ができるので、
リネームして完成
Next.jsで本番モードと開発モードで変数の値を変えたい

# Next.jsで本番モードと開発モードで変数の値を変えたい

## 動作環境
- Linux
- Node.js
- Next.js

## 本番モードと開発モードの違い

<details>
<summary>ソースマップ</summary>
開発モードではソースマップが有効になり、
デバッグ時に元のソースコードと対応するようになる。 <br />
これにより、エラーやデバッグ情報の読み取りが容易になる。 <br />
一方、本番モードではソースマップは無効になり、ファイルサイズの削減やセキュリティの向上が図られる。
</details>

<details>
<summary>ホットリロード</summary>
開発モードではホットリロードが有効になる。 <br />
ファイルの変更が自動的に反映され、ブラウザをリロードする必要がない。 <br />
これにより、開発プロセスが迅速かつ効率的になります。本番モードではホットリロードは無効になる。

</details>

<details>
<summary>クリティカルCSSのインライン化</summary>
本番モードでは、クリティカルCSS（ページの表示に必要な最低限のCSS）がインライン化される。<br />
これにより、ページの表示速度が向上します。開発モードではこの最適化は適用されない。
</details>

<details>
<summary>エラーページ</summary>
開発モードではエラーページにデバッグ情報が表示され、エラーの原因を特定しやすくなる。<br />
本番モードではエラーページに詳細な情報は表示されず、シンプルなエラーページが表示される。
</details>

これらの違いにより、開発モードと本番モードで異なる挙動を持つことで、開発中に便利なツールや機能を提供し、本番環境ではパフォーマンスやセキュリティを最適化することが可能になる。
これにより、開発と本番でのスムーズな運用が実現される。

## packege.jsonを確認
package.jsonファイルを確認してコマンドが使えるか確認する
```json:package.json
 "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
```
scriptに`dev`,`build`,`start`の記述があるか確認


## 変数の値を変えたい
`str`の変数を用意して、値を本番モードと開発モードで変えてみる

```typescript:index.tsx
import Image from 'next/image'
import { Inter } from 'next/font/google'
import { NextPage } from "next";

const Home:NextPage = () => {
  let str;
  // 本番モードと開発モードの判断
  if(process.env.NODE_ENV === 'development'){
    // 開発モード
    str = 'hoge'
  }else {
    // 本番モード
    str = 'fuge'
  }
  return (
    <>{str}</>
  )
}

export default Home;
```

開発モードからやってみる
```
npm run dev
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325724/abd8a007-cfe5-3814-3613-f4f67471c18e.png)
`hoge`と表示された。

次に本番モード
```
npm run build
npm run start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325724/52a1d79d-fcab-c915-1c62-a0ba11931954.png)
`fuga`と表示された。

### 結論

`process.env.NODE_ENV === 'development'`で判断できるみたい
Windowsのコマンドプロンプト（bat）でリモートデスクトップ許可設定（Firewall設定についても）

# やり方

レジストリーを更新するので **管理者権限が必要** です。

```bat:
rem リモートデスクトップ有効化
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "fDenyTSConnections" /t REG_DWORD /d 0 /f
```

# やり方（実行後の結果確認もしたい）

```bat:
rem リモートデスクトップ有効化
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "fDenyTSConnections" /t REG_DWORD /d 0 /f

rem リモートデスクトップの設定画面開く（有効化されたかの確認用）
start ms-settings:remotedesktop
```

下記の画面が開いて、『設定が反映されているか』の目視確認もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5fa3d4aa-8c73-bf12-d7b3-2872d9ee3870.png)

# batファイルはローカルで実行する必要あり

ファイルサーバーなどに置いてあるbatを実行しても **レジストリーは更新されません。**
ローカル上のbatファイルで実行する必要があります。

TODO:regコマンドを含むbatは必ずローカルに置く必要があるかどうか確認。

# リモートデスクトップが有効にならない場合がある

前述で行っているレジストリー変更を行っても下記のままの場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/53021ec3-df25-9094-a059-d5e71f4264ff.png)

こうなってしまう原因はFirewallです。

上記の『リモートデスクトップを有効にする』のトグルをマウスで有効⇔無効をすると…

有効の時は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cf97b735-6621-fadd-96aa-5bc7e001ba39.png)

無効の時は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8363da10-2fdf-6b56-2e96-3ad3647a8f0c.png)

# やり方（Firewall有効化と実行後の結果確認の両方も行う）

```bat:
rem リモートデスクトップ有効化
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "fDenyTSConnections" /t REG_DWORD /d 0 /f

rem Firewall有効化
netsh advfirewall firewall set rule name="リモート デスクトップ - シャドウ (TCP 受信)" new enable=yes
netsh advfirewall firewall set rule name="リモート デスクトップ - ユーザー モード (TCP 受信)" new enable=yes
netsh advfirewall firewall set rule name="リモート デスクトップ - ユーザー モード (UDP 受信)" new enable=yes

rem リモートデスクトップの設定画面開く（有効化されたかの確認用）
start ms-settings:remotedesktop
```


# 参考サイトさん

https://long-distance.jp/sb/log/eid47.html

https://atmarkit.itmedia.co.jp/ait/articles/0505/14/news016.html

https://qiita.com/waokitsune/items/88fddb015ef4db41f994

https://tooljp.com/qa/F073BAE8D9247BE149257286005937E6.html

# バージョン

Windows 10 Pro 22H2 19045.3208
【備忘録】AWS EC2 起動テンプレートからインスタンスを起動する時にボリュームが表示されない

## 背景
起動テンプレートを作成したインスタンスを起動する際にあれ？ということがあったため、備忘録として記載しておく。

## 1.起動テンプレートからインスタンスを起動しようとすると・・・
起動テンプレートからインスタンスを起動しようとすると、ストレージには下記のようなコメントが表示され、起動テンプレート通り設定されているか分からない状態になった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/5699d25b-77fd-af97-a5b2-eb3c262578eb.png)

## 2.起動テンプレートの設定確認
下記画像のようにストレージの設定が存在する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/5348df7f-385e-e48e-58d1-0707517039b0.png)

## 3.そのまま起動してみた
起動テンプレート通りの設定で起動できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/67c91b42-145d-676b-e7f3-c9c363ca6f49.png)

以上
warpでカスタムテーマを作ってみよう

# そもそもwarpとは

https://www.warp.dev/

新世代のターミナルと言われている
コマンド履歴を確認できたり、AIを活用してコマンド補完してくれたりする
ここではあまり解説しないので詳しくは他のQiita等で

# カスタムテーマ
公式ドキュメント
https://docs.warp.dev/appearance/custom-themes

warpでは自分でテーマも作れる

![スクリーンショット 2023-07-24 16.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249281/7b91a930-6929-c019-6892-2f099e58fa5e.png)
文字色・背景色の変更や、背景画像の設定ができる

# カスタムテーマの作り方

以下のコマンドを実行し、テーマをgitからcloneする

```
mkdir ~/.warp/
cd ~/.warp/
git clone https://github.com/warpdotdev/themes.git
```

カスタムテーマ用のディレクトリを作成しておく

```
cd ~/.warp/themes
mkdir custom
cd custom
```
カスタムテーマ用のyamlファイルを作成

```
details: "darker"
accent: "#a9a3e0"
foreground: "#ffffff"
background: "#191830"
background_image:
  path: custom/makino_mysterious.jpg
  opacity: 15
terminal_colors:
  bright:
    black: "#5c5c61"
    red: "#f5b2ac"
    yellow: "#fad000"
    cyan: "#80fcff"
    green: "#00ff7f"
    blue: "#6943ff"
    white: "#ffffff"
    magenta: "#B8062C"
  normal:
    black: "#000000"
    green: "#00ff7f"
    blue: "#7857fe"
    red: "#f5b2ac"
    yellow: "#fad000"
    cyan: "#80fcff"
    magenta: "#B8062C"
    white: "#ffffff"

```
### 各項目の説明
- accent： WarpのUIでハイライトに使われる色。
- background： 背景の色
- foreground： 前景の色
- background_image: 背景画像（jpgファイルのみ使用可能）
    - path: 画像パス（~/.warp/themes/ からの相対パス）
    - opacity: 透過率（0~100 で指定）
- details: 詳細オプションの色
- darker： ダークテーマに使用される色
- lighter： ライトモードのテーマに使われる色
- terminal_theme： 他のターミナルテーマ (アンシカラー) で知られているノーマルカラーとブライトカラーのコレクション (合計 16)

accentは以下のように設定することで、上下もしくは左右にグラデーションをかけることが可能

```
accent:
  top: '#a9a3e0'
  bottom: '#ffffff'
```

```
accent:
   left: '#a9a3e0'
   right: '#ffffff'
```

![スクリーンショット 2023-07-24 16.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249281/85c52f8f-eef5-d953-bb3f-943657982d52.png)

- - -
gitからcloneした中から好みのものを見つけて、ちょっとずつ修正してみると手軽に試せそう
正弦定理の隣の?「正接定理(英:Law of tangents)」を調べてみたい。


wikipediaで誰も?見た事のない公式を見つけました。
[Tangent half-angle formula](https://en.wikipedia.org/wiki/Tangent_half-angle_formula)
(see tangent half-angle formula).

# wikipedia で

https://ja.wikipedia.org/wiki/%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86

https://en.wikipedia.org/wiki/Law_of_tangents

# WolframAlpha で
勉強中

# sympy で
＞証明
https://en.wikipedia.org/wiki/Law_of_tangents#Proof
```python
from sympy import *
from sympy.simplify.fu import TR8,TR9
a,b,d=symbols('a,b,d',real=True)
α,β=symbols('α,β',real=True)
f =(a-b)/(a+b)
f1=f.subs({a:d*sin(α),b:d*sin(β)}).simplify()
print("#",f1)
print("#",TR9(TR8(f1)).simplify())
# (sin(α) - sin(β))/(sin(α) + sin(β))
# tan(α/2 - β/2)/tan(α/2 + β/2)
```
？ https://www.deepl.com/ja/translator#ja/en/信じる者は救われる

# 過去問
"正接定理"の探し方を教えて下さい。見当たりませんでした。
＜大学入試数学問題集成

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%22%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86%22&oq=%22%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86%22&gs_l=partner-web.12..0i4i37i512j0i512l4j0i30j0i30i15j0i7i30l3.4440.10000.0.13251.32.18.0.0.0.12.138.1171.15j3.18.0.csems%2Cnrl%3D10...0....1.34.partner-web..31.1.39.R7uJjQgdZm0

一致する結果はありません

https://www.google.com/search?q=site%3Akamelink.com++%22%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86%22&rlz=1CAUHAM_enJP1038JP1038&ei=r-C9ZPC3NdbP2roP6f2u2Ao&ved=0ahUKEwiwy87tpKaAAxXWp1YBHem-C6sQ4dUDCA8&uact=5&oq=site%3Akamelink.com++%22%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86%22&gs_lp=Egxnd3Mtd2l6LXNlcnAiIXNpdGU6a2FtZWxpbmsuY29tICAi5q2j5o6l5a6a55CGIkjjV1DLCFjFUnABeACQAQCYAXGgAekFqgEDMC43uAEDyAEA-AEC-AEB4gMEGAEgQYgGAQ&sclient=gws-wiz-serp

site:kamelink.com "正接定理"との一致はありません。

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%22%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86%22&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%22%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86%22&aqs=chrome..69i57j69i58.938j0j9&sourceid=chrome&ie=UTF-8

site://mathmathmass.exblog.jp "正接定理"との一致はありません。

# 参考
＞正接とはタンジェントのことです。役に立つ公式ではありませんが，けっこうきれいです。
＞ただ，全く役に立たないので高校数学では習いません。

https://manabitimes.jp/math/1234

https://www.google.com/search?q=%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86&rlz=1CAUHAM_enJP1038JP1038&oq=%E6%AD%A3%E6%8E%A5%E5%AE%9A%E7%90%86&aqs=chrome..69i57j69i60.6270j0j1&sourceid=chrome&ie=UTF-8
新しくフォルダを作らずにNext.jsのWebアプリケーションを作成

# 新しくフォルダを作らずにNext.jsのWebアプリケーションを作成したい！！

## 動作環境
- Linux
- Node.js
- Next.js

## フォルダを作成してWebアプリケーションを作成する場合

exampleAppフォルダを作成してNext.jsのWebアプリケーションを作成する場合は次のコマンドを実行する

```
app# npx create-next-app exampleApp
```

```
app
 |- exampleApp
  |- .next 
  |- node_modules
  |- public
  |- src
  ...
```
exampleAppフォルダ作成後、アプリケーションが作成される


## フォルダを作成してWebアプリケーションを作成する場合

現在のディレクトリにWebアプリケーションを作成する場合は次のコマンドを実行する
```
app # npx create-next-app --use-npm .
```
```
app
 |- .next 
 |- node_modules
 |- public
 |- src
  ...
```
現在のディレクトリにアプリケーションが作成される
AlmaLinux9 ローカルPC にインストール

Almalinux9 の最新版(2023/7/24時点で9.2)をローカルPCにインストールする手順を記載。
仮想マシンの記事は色々ありますが、ローカルPCに用意するのは少ない気がしましたので記事を用意しました。

## 物理的に用意するもの

0. 作業用PC

1. インストール先PC
   ※Almalinuxインストール時にパーティションを設定できるため、
    既存のパーティション削除などはしなくても良い
 
2. USBメモリ (16GBあれば可能)

![IMG_20230724_154312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/41338069-5252-ed7d-ba34-43d926b9d9f9.jpeg)

## 必要作業

### 0. balena Etherインストール

USBメモリにisoファイルを書き込むソフトウェア 「balenaEther」を作業用PCにインストール

https://www.gigafree.net/system/os/Etcher.html

これはとても使いやすいソフトウェアです。

### 1. AlmaLinuxのisoファイルダウンロード

作業用PCにて以下からダウンロードできる。

http://ftp.iij.ad.jp/pub/linux/almalinux/9.2/isos/x86_64/

「AlmaLinux-9-latest-x86_64-dvd.iso」を選択するとインストールに必要なもの一式が入っている。

「boot-iso」でも可能だが、インストール画面でネットワーク設定やインストールメディアの設定が必要になってくる。

### 2. isoファイルをUSBメモリに書き込む

2-1. 作業用PCにUSBメモリを挿入
2-2. 作業用PCでbalenaEthcerを起動
2-3. 「Flash from file」でダウンロードしたisoファイルを選択
2-4. 「Select target」でUSBメモリを選択し「Flash」押下
2-5. 数分待つとUSBへの書き込みが完了している

### 3. USBブート

インストール先PCにUSBメモリを挿入し起動し、インストールウィザードが立ち上がらせる
※立ち上がらない場合はBiosを起動させブート順序を入れ替える等の設定を行う

### 4 AlmaLinuxインストール設定


インストールウィザードにて日本語設定や時刻を日本時刻にする(画像省略)

その他、インストールに必要な設定を行う（必要な場合注意マークが光ります）

4-1. ユーザー名、PWの設定
4-2. パーティション設定

問題なければ右下のボタンからインストールを実行→再起動を促されてインストール完了となります

## 5 その他設定

必須ではないが便利な設定などを追記する

### 5-1. キーボード設定

インストール直後ではWindowsのような使用感で
日本語入力ができない

Almalinux9 では Windowsなど多くの環境で慣れ親しんでいる日本語入力ソースである「Mozc」が導入されていないため。

Mozcを導入しなおすか、別の入力ソースを使うようにする必要がある。

Mozcを導入する手順については以下を参照(本記事では省略)

https://furuya7.hatenablog.com/entry/2022/06/23/142859


almalinux9に初期導入されている日本語入力ソースである(Anthy)を使うのが比較的簡単な手順である。


Almalinux の[設定]　→　[Keyboard] から入力ソースの [＋] を選択


![Screenshot from.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/faa0666b-8a21-2e84-1da5-6fa96da0b073.png)

入力ソースを追加する際に[日本語(Anthy)]を選択し追加

![Screenshot from 2023-08-23 12-45-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/a6740330-6eb5-18d3-cf77-1681be9b3578.png)

これで日本語入力/英語入力を切り替えられる。
※MozcとAnthyは違うためキーボードレイアウトでどのキーがどれに当たるは要確認

ただし、[半角/全角キー]で切り替えられるわけではないので、入力ソースの切り替えをどこのキーで設定するか設定が必要

Keyboardタブ最下部のキーボードショートカットから設定可能

![Screenshot 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/7157da09-a4c9-ce20-de78-ecd692f00132.png)

[Customize Shortcuts] から[タイピング]を選択し[次の入力ソースへ切り替える]

以下の際にどのキーで入力ソースを切り替えられるかを選択できる。

![Screenshot f3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/d9987a77-357b-7127-1cce-da1ad8412a27.png)


### 5-2. 拡張機能管理ツール

Extension Manager のインストール

あるととても便利

https://flathub.org/apps/com.mattjakeman.ExtensionManager

![Screenshot from Extension Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/7badae9a-2e7f-317b-f8b5-8a85d4d72dbf.png)

ヘッダーやフッターで使用アプリの管理などがとても楽になります。
VBAで、「1-1」などの文字列をセルに代入しようとすると、日付として認識されてしまう件を解決

# 結論
代入するセルに`.NumberFormat = "@"`の処理をいれます。これでセルの書式を文字列に設定してから代入することで日付と認識されずにセルに代入できます。

# 実際に起きたことを再現
エクセルVBAを使用して、エクセルのセルに「1-1」という文字列を代入したいとします。下記のようなコードを記述しました。
```vb
Sub 検証()
    ThisWorkbook.Worksheets(1).Cells(1, 1).Value = "1-1"
End Sub
```
上記のコードで実行すると、代入したセルには「1月1日」と表示されてしまいました。式も「2023/1/1」となり、日付として認識されています。
「1-1」を代入することができないか、調査しました。

# 調査
下記の記事が参考になりました。

https://www.diamondblog.jp/official/omura/2016/01/26/%E6%97%A5%E4%BB%98%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E5%80%A4%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%85%A5%E5%8A%9B%E3%81%99-2/

「1-1」のような文字列は、エクセルが自動で日付として認識します。それゆえ、エクセルの表示も変わってしまうというものでした。NumberFormatに文字列を意味する「@」を設定することで文字列として認識させることができるようです。

# 調査を踏まえての対策
NumberFormatに「@」を設定してから「1-1」を代入します。
```vb
Sub 検証()
    ThisWorkbook.Worksheets(1).Cells(1, 1).NumberFormat = "@"
    ThisWorkbook.Worksheets(1).Cells(1, 1).Value = "1-1"
End Sub
```

これで、エクセルでも文字式として認識され、「1-1」と表示されます。

以上です。

# 参考

https://www.diamondblog.jp/official/omura/2016/01/26/%E6%97%A5%E4%BB%98%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E5%80%A4%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%85%A5%E5%8A%9B%E3%81%99-2/
React Nativeでコンポーネントの位置を取得する方法と注意点


# はじめに

React Nativeは、クロスプラットフォームのモバイルアプリケーション開発フレームワークで、JavaScriptとReactの力を活用してiOSとAndroidのアプリケーションを開発することができます。この記事では、React Nativeでコンポーネントの画面上部と左側からの位置を取得する方法とその際の注意点について詳しく解説します。

# コンポーネントの位置取得方法

React Nativeでは、コンポーネントの参照（ref）を利用して `measure` というメソッドを使い、コンポーネントの画面上部と左側からの位置を取得することができます。具体的なコードは以下の通りです：

```jsx
import React, { useRef } from 'react';
import { View, Button } from 'react-native';

const MyComponent = () => {
  const myRef = useRef(null);

  const getPosition = () => {
    myRef.current.measure((fx, fy, width, height, px, py) => {
      console.log('Component width is: ' + width);
      console.log('Component height is: ' + height);
      console.log('X offset to frame: ' + fx);
      console.log('Y offset to frame: ' + fy);
      console.log('X offset to page: ' + px);
      console.log('Y offset to page: ' + py);
    });
  };

  return (
    <View ref={myRef}>
      {/* The rest of your component code */}
      <Button title="Get Position" onPress={getPosition} />
    </View>
  );
};

export default MyComponent;
```

この `myRef.current.measure` メソッドによって、コンポーネントの位置と大きさが取得できます。取得できるパラメータは以下のとおりです：

- `fx`: X軸のフレーム（親要素）からのオフセット
- `fy`: Y軸のフレーム（親要素）からのオフセット
- `width`: コンポーネントの幅
- `height`: コンポーネントの高さ
- `px`: X軸のページ（画面）からのオフセット
- `py`: Y軸のページ（画面）からのオフセット

# 注意点

Reactのレンダリングは非同期的に行われます。つまり、コンポーネントが描画されるまでの時間は決まっておらず、他のタスクによって遅延する可能性があります。そのため、`measure()` メソッドはレンダリングが完了した後、つまりコンポーネントがDOMに正しく描画された後にのみ正確な値を返します。

さらに、`measure()` メソッド自体も非同期的に動作します。したがって、その結果を待つためには、その結果を使用するコードを `measure()` のコールバック関数内に置く必要があります。

```jsx
// Correct usage of measure
componentDidMount() {
  this.myRef.current.measure((fx, fy, width, height, px, py) => {
    console.log('X offset to page: ' + px);
    console.log('Y offset to page: ' + py);
    // You can use the measurement results here
  });
  // But not here
}
```

以上が `measure()` メソッドの非同期性についての注意点です。

# まとめ

React Nativeでは、`measure()` メソッドを使用してコンポーネントの画面上部と左側からの位置を取得することができます。ただし、非同期的なレンダリングとメソッドの動作を理解し、正しく取り扱うことが重要です。今回の情報がReact Native開発に役立つことを願っています。
ZIOまとめ

ZIOについての現時点の知見をまとめる記事です。
本記事は[公式ドキュメント](https://zio.dev/reference/)を読むための取っ掛かりとなるような入門記事を目指しています。
そのため以下の点に気を付けました。

- 1章、1章につながりがあり、順序だてて読めること
- ZIOでの開発を始めるにあたり、必要十分な文量、情報量であること
- 記事が日本語であること

**また、以下の記事中のScalaコードはScala3系での実行を想定しています。**

対象読者は以下2点に当てはまる方です。
        1. ある程度Scalaを書ける人
        2. DI機能があるjavaフレームワークの使用経験のある方

情報に誤りがありましたら是非ご指摘ください。

# 目次
## Ⅰ. 前書き
### 1. [ZIOについて](https://qiita.com/wc_sangen/private/f428656234ce946448c3)
## Ⅱ. バッチ開発
### 1. [Hello, World!](https://qiita.com/wc_sangen/private/cc713cbad4bb604a345d)
### 2. [ZIOのDIについて](https://qiita.com/wc_sangen/private/38672e5fe7d651ff1533)
### 3. [ZIOのエラー処理](https://qiita.com/wc_sangen/private/44b57489319b01765a06)
### 4. [ZIOライブラリ利用(DB接続)](https://qiita.com/wc_sangen/private/37436c567f4015a02ba7)
### 5. [ZIOの並列処理](https://qiita.com/wc_sangen/private/5154da992e0fb67166fb)
## Ⅲ. バックエンド開発
### 1. [zio-http](https://qiita.com/wc_sangen/private/63d3d3957245b90d2012)
### 2. [外部Web APIアクセス](https://qiita.com/wc_sangen/private/a32012693458719deb17)
### 3. [Middlewareについて](https://qiita.com/wc_sangen/private/4bece28969a6a87ff9e0)
## Ⅳ. その他
### 1. [単体テスト](https://qiita.com/wc_sangen/private/0a7ae5ebbdaded369bdc)
enum

# enumのメリット
* データの整合性と可読性の向上
* データベースのスキーマの柔軟性
これはかなり大きいと思います。例えば、booleanで設定すると、今後の選択肢が増えた場合に変更できなくなってしまいます。しかし、enumで設定しておくと後からのデータベース変更を柔軟に行うことができます。（まあ可能な限り変更しないことが理想ではあるんですが、、、）

# マイグレーションファイルで列挙型を定義
```
rails g migration AddColumnStatusToUser
      invoke  active_record
      create  db/migrate/20230511075254_add_column_status_to_user.rb
```
```
class AddStatusToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :status, :integer, default: 0
  end
end
```

```
rails db:migrate
```

# モデルクラスで列挙型を定義
```user.rb
class User < ApplicationRecord
  enum status: {
    waiting: 0,
    start: 1,
    processing: 2,
    done: 3
  }
end
```

```
pry(main)> task = Task.new
=> #<Task:0x00007fcf87e51a88 id: nil, name: nil, status: "waiting", created_at: nil, updated_at: nil>

pry(main)> task.status = 1
=> 1

pry(main)> task.status
=> "start"

pry(main)> task.status = 2
=> 2

pry(main)> task.status
=> "processing"

pry(main)> task.status = 3
=> 3

pry(main)> task.status
=> "done"
```


数値として比較する場合は、メソッド[カラム名]_before_type_castが必要になるみたい
```
irb(main):080:0* task1.progress
=> "start"
irb(main):081:0> task2.progress
=> "waiting"
irb(main):082:0> task1.progress_before_type_cast > task2.progress_before_type_cast
=> true
```
rspec moduleのテスト

先日、rspecでテストを書いていて、moduleのテストって一体どうやるんだ？と思い調べていると
いろいろな情報が混在していたので忘備録として書いておきます。

結論としてはかなり単純で、
擬似クラスを作成して、それにmoduleをincludeするだけでした。

```
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe Hoge do
  let(:dummy_class) { Class.new { include FooBarModule } }

  it 'can register data in A tables' do
    dummy_class.method
  end
end
```
pythonライブラリEasyOCRをWindowsにインストールする

# EasyOCRとは
まずOCRとは(Optical Character Recognition/Reader)の略称で、文字をカメラや写真から読みとり、コンピュータが利用できるデジタルの文字コードに変換する技術のことである。
EasyOCRはGitHubで公開されているPython用のOCRである。
EasyOCRをインストールして実装まで何度かエラーが発生したのでメモ。

https://github.com/JaidedAI/EasyOCR

## EasyOCRの環境構築

環境
python 3.9.2
pyenvにて環境構築
windows 10 22H2

こちらのサイトをもとにインストール

https://camp.trainocate.co.jp/magazine/about-easyocr/

pipでインストール
~~~
pip install easyocr
~~~

上記のサイトではeasyocr\utils.pyの
~~~python
img_cv_grey = cv2.imread(image, cv2.IMREAD_GRAYSCALE)
~~~
をコメントアウトしないといけないとあるがコメントアウトを行うとエラーが発生するのでそのままでOK

~~~python
def cv2_readimg(filename, mode):
    img_date = np.fromfile(filename, dtype=np.uint8)
    img = cv2.imdecode(img_date, mode)
    return img
~~~
こちらの関数は追加する。

EasyOCRをインストールするとpillowも同時にインストールされるが、インストールされるバージョンがpillow10.0でありエラーの原因になるため、一度消してpillow9.5.0を再インストールする。
~~~
pip uninstall Pillow
pip install Pillow==9.5.0
~~~
これでEasyOCRの環境を構築が完了。
BigDecimal型のデフォルト四捨五入を変更する方法

# 書き方
書き方は単純なのですが、調べても全然出てこなかった！！
```models/Hoge.rb
class Hoge < ApplicationRecord
  BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_DOWN)

  belongs_to :foobar
end
```
https://docs.ruby-lang.org/ja/latest/method/BigDecimal/s/mode.html

# 例外処理
計算結果が非数(NaN)やゼロによる除算になったときの処理を定義することができます。
```
flag = false # デフォルト値
f = BigDecimal::mode(BigDecimal::EXCEPTION_NaN,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_INFINITY,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_UNDERFLOW,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_OVERFLOW,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_ZERODIVIDE,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_ALL,flag)
require 'bigdecimal'
flag = false # デフォルト値
f = BigDecimal::mode(BigDecimal::EXCEPTION_NaN,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_INFINITY,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_UNDERFLOW,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_OVERFLOW,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_ZERODIVIDE,flag)
f = BigDecimal::mode(BigDecimal::EXCEPTION_ALL,flag)

BigDecimal::EXCEPTION_NaN は結果が NaN になったときの指定です。
BigDecimal::EXCEPTION_INFINITY は結果が無限大(±Infinity)になったときの指定です。
BigDecimal::EXCEPTION_UNDERFLOW は指数部がアンダーフローするときの指定です。
BigDecimal::EXCEPTION_OVERFLOW は指数部がオーバーフローするときの指定です。
BigDecimal::EXCEPTION_ZERODIVIDE はゼロによる割り算を実行したときの指定です。
BigDecimal::EXCEPTION_ALL は、可能な全てに対して一括して設定するときに使用します。
flag が true のときは、指定した状態になったときに例外を発行するようになります。 flag が false(デフォルト)なら、例外は発行されません。計算結果は以下のようになります。

BigDecimal::EXCEPTION_NaN のとき、非数(NaN)
BigDecimal::EXCEPTION_INFINITY のとき、無限(+ or -Infinity)
BigDecimal::EXCEPTION_UNDERFLOW のとき、ゼロ
BigDecimal::EXCEPTION_OVERFLOW のとき、+Infinity か -Infinity
BigDecimal::EXCEPTION_ZERODIVIDE のとき、+Infinity か -Infinity
BigDecimal::EXCEPTION_INFINITY、BigDecimal::EXCEPTION_OVERFLOW、 BigDecimal::EXCEPTION_ZERODIVIDE は今のところ同じです。戻り値は、設定後の値です。「値」の意味は、例えば BigDecimal::EXCEPTION_NaN と「値」の & が ゼロ以外ならば BigDecimal::EXCEPTION_NaNが設定されているという意味です。
```

# 丸め処理指定
計算途中の丸め操作の指定ができます。
```
BigDecimal::ROUND_UP 全て切り上げます。
BigDecimal::ROUND_DOWN 全て切り捨てます(truncate)。
BigDecimal::ROUND_HALF_UP 四捨五入します(デフォルト)。
BigDecimal::ROUND_HALF_DOWN 五捨六入します。
BigDecimal::ROUND_HALF_EVEN 四捨六入します。5の時は上位1桁が奇数の時のみ繰り上げます(Banker's rounding)。
BigDecimal::ROUND_CEILING 数値の大きい方に繰り上げます(ceil)。
BigDecimal::ROUND_FLOOR 数値の小さい方に繰り下げます(floor)。
```
Windowsのコマンドプロンプト（bat）で設定の各画面を開く

# 設定の各画面とは

ここの…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/deff2a41-7886-a618-4fde-5ea352c88485.png)

こういったメニューの画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/64f6f040-b6c0-4851-ad83-a11469b866fe.png)

# やり方

```bat:サンプル
rem 設定の詳細情報を開く
start ms-settings:about
```

* 設定の各画面には名前が付いている。
* ```start ms-settings:``` で画面名を指定。

# よく使う画面

```bat:
rem 設定の詳細情報を開く
start ms-settings:about
```

```bat:
rem 設定のリモートデスクトップを開く
start ms-settings:remotedesktop
```

```bat:
rem 設定のbluetoothとその他のデバイスを開く
start ms-settings:bluetooth
```

# 参考サイトさん

https://www.ipentec.com/document/windows-10-open-settings-window-using-command

# バージョン

Windows 10 Pro 22H2 19045.3208

TODO:この記事に全画面名を網羅。