OmniAICreator/Qiita-1.07M huggingface dataset:
#0008（2024/01/08）iSCSIとはどんなプロトコルか？

# モチベーション
- AWS SAA の「AWS Storage Gateway」に関する勉強中にiSCSIプロトコルが出てきたので、調べてみた

# iSCSIプロトコルとは

## SCSIプロトコル
- Small Computer Systems Interfaceの略
- コンピュータがストレージデバイスにアクセスするための通信規約
- サーバー ↔ ローカルのストレージ

## iSCSIプロトコル
- Internet Small Computer Systems Interface)
- SCSIコマンドをTCP/IPプロトコルに乗せて送信し、ネットワーク経由でストレージにアクセス
- サーバー ↔ ネットワーク上のストレージ

## iSCSIプロトコルの構成要素
1. イニシエーター（Initiator）
    - ストレージにアクセスするクライアント側のデバイス（例: サーバー）
    - ソフトウェアイニシエーターとハードウェアイニシエーターが存在
1. ターゲット（Target）
    - ストレージデバイスやストレージサーバー
1. ネットワーク
    - TCP/IPネットワーク（LANやWAN）

## iSCSI の仕組み
1. イニシエーターがターゲットに接続リクエスト
1. 認証（CHAPなど）を通じてセッションを確立
1. イニシエーターは、TCP/IPを介してターゲットにSCSIコマンドを送信
1. ターゲットは、ストレージデバイス上のデータを読み書きし、イニシエーターに応答
1. OSから見ると、iSCSIで接続されたストレージはローカルディスクと同じように認識される

# iSCSIの特徴
## iSCSI の特徴
- 通信がTCP/IPネットワークに依存しているため、ネットワークの遅延や帯域幅不足がパフォーマンスに影響する
- ソフトウェアイニシエーターを利用すると、CPUに負荷がかかる
- ネットワークを介して通信するため、盗聴や不正アクセスのリスクがある。→解決策: CHAP認証、IPsec、専用ネットワーク（VLAN）の使用

## iSCSIとNFSの違い
| 項目                          | **iSCSI**                                         | **NFS**                                      |
|------------------------------|--------------------------------------------------|--------------------------------------------|
| **ストレージタイプ**           | ブロックストレージ                                   | ファイルストレージ                              |
| **操作単位**                  | ブロック単位                                      | ファイル単位                                   |
| **ファイルシステム管理**        | クライアント側が管理                                | サーバー側が管理                                |
| **用途**                      | データベース、仮想化環境、高速アクセスが必要なアプリケーション    | ファイル共有、バックアップ、アーカイブ用途             |
| **クライアントからの同時アクセス** | 複数クライアントからの直接利用には不向き（特殊な構成が必要）        | 複数クライアントからの同時アクセスが簡単                 |
| **通信プロトコル**             | TCP/IP                                           | TCP/IP または UDP                             |
| **パフォーマンス**             | 高パフォーマンス（低レイテンシ、高スループット）               | 高負荷時にパフォーマンスが低下しやすい                    |
| **設定の複雑さ**               | 比較的複雑（iSCSIターゲットやイニシエーターの設定が必要）         | 比較的簡単（NFSサーバーの設定とクライアントのマウントのみ） |
| **コスト**                    | 専用のソリューションが必要な場合は高コスト                 | 低コスト（特にオープンソースのNFSを利用する場合）          |

# 参考
- chatgptの回答を元に作成
付箋アプリの勧め

## はじめに
こんにちは。エンジニアの長谷川です。
今回は普段業務で使用している付箋アプリを紹介したいと思います。

## どんなアプリ？
Windowsにいつからか標準装備されていたアプリで、
その名の通り、画面上に付箋のようにメモが出来るアプリです。

すべてのアプリのは行に居ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/d7189cfb-5dc3-b145-97cc-cfda6180470f.png)

## どう使う？
起動すると一覧と付箋が1つ出てきます。
付箋にメモをするだけです。
一覧の内容も更新されて行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/b84045d9-2bfb-edd6-1573-067c095eb74a.png)

付箋左上にある＋をクリックすると新たに付箋が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/b629ad04-0e97-4dca-6fc7-095d3ee7b5cb.png)

付箋右上にある・・・をクリックすることで色を変えることも出来ます。
選べる色は下記の通り7種類です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/dc440705-2d72-2665-fc71-98675e97ae0b.png)

## 邪魔になったときは？
付箋右上の×で表示を消すことができます。
付箋の内容が空だと一覧からも削除されますが、
付箋に内容があれば一覧には残り、あとで必要になったときに一覧から復活できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/2fbb887c-d7d9-40bf-55f3-63215954de33.png)

## もう使わない
一覧からメモの削除を選択すれば一覧からも削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/172e3b94-f16f-4b90-911a-de844f44837e.png)

## どんな時に使用しているか
私の場合は繰り返し使うLinuxのコマンドを記載していたり、
休み明けなどに必ずしなくてはいけない作業がある場合に画面全体へ付箋を拡げてやることを記載しています。

## 終わりに
如何でしたでしょうか。
画面上に展開する付箋なのでPCのモニターも汚れませんし、
セキュリティ的にもログインできないとみることが出来ないので安心です。
以上、長谷川でした。
cli-kintoneを使ってkintoneアプリの内容の参照しよう。

## ■はじめに
サイボウズが開発するコマンドラインでkintoneのレコードデータを入出力できるツール「cli-kintone（クリキントーン）」を使って、kintoneアプリの内容を参照していきます。

## ■cli-kintoneとは
CLI（Command Line InterFace）でkintoneの処理を行う機能となっております。
【CLI】と【kintone】が合わさって【cli-kintone（クリキントーン】と呼ばれております。

## ■cli-kintoneのインストール
まず、cli-kintoneをインストールする必要があります。GitHubのReleasesページから、使用するOSに対応した実行ファイルをダウンロードしてください。

<font color="blue">**＜Releasesページ＞**</font>
https://github.com/kintone/cli-kintone/releases
Windows: cli-kintone-win.zip
macOS  : cli-kintone-macos.zip
Linux  : cli-kintone-linux.zip

## ■APIトークンの取得
①kintoneにログインします。
②対象のアプリの「アプリの設定」から「設定」タブ⇒「APIトークン」を選択します。
③上部にある【生成する】ボタンを押下する。
　※APIトークンには「レコード追加」「レコード編集」のアクセス権を付与します。
④生成されたAPIトークンを保存して、「保存する」ボタンを押下⇒「アプリを更新」します。

## ■コマンドラインツールの起動
Windowsの場合、「コマンドプロンプト」があります。
※Windows画面左下のタスクバーに「cmd」と入力すると「コマンドプロンプト」が表示されるので、クリックして起動できます。
　もしくは、Windowsのスタートメニューから「Windows システムツール」⇒「コマンドプロンプト」でも起動できます
起動すると下記画像のように表示されます。
![cmdpronpt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850060/e035e05c-e56d-bcff-ffbc-6e5b8deec5df.png)

上記でcli-kintoneをインストールしたフォルダに移動してください。
※「cd（chdir）：ディレクトリの移動」を使用して移動します。
　例）以下のファイル構成の場合
![ファイル構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850060/5940d704-ddac-8350-9e94-01ac7bc224ce.png)

【cd c:\users\cli-kintone】を入力することで指定したファイルに移動することができます。
![cmdpronpt2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850060/b2e09f3b-6634-cf1e-2bbe-76aafc3de49e.png) 

## ■対象アプリのレコード取得
試しに指定したアプリのレコードが取得できるかを確認していきます。
アプリ内容は以下になります。
![アプリ情報.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850060/5f19392f-25ae-f285-d358-289281559936.png)

以下のコマンドを実行していきます。
＜cli-kintone.exe record export --app @@@ --base-url https://@@@.cybozu.com --api-token @@@＞
※オプション名
　--app：アプリID
　--base-url：ドメイン情報
　--api-token：APIトークン
　@@@：それぞれの値を設定
![実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850060/22984552-010f-5409-5dfa-db899e36f47b.png)
上記の結果をファイルに書き出す場合、「--encoding sjis > sample.csv」を足すとフォルダ内にファイルが作成されます。
この場合、「users/cli-kintone」内にsample.csvファイルが追加されます。

## ■まとめ
今回はcli-kintoneのインストールからkintoneにアクセスして指定アプリの内容をコマンドプロンプト内に表示させました。
次回は、CSVファイルの内容をcli-kintoneを使って、特定アプリの内容を追加／更新させていきたいと思います。
エネマネX：エネルギーマネジメントで企業の脱炭素化を実現

持続可能な社会の実現が世界的に求められる中、エネルギー管理の重要性はますます高まっています。エネマネX（https://enemanex.jp/） は、企業のエネルギー使用を最適化し、環境に優しい経営を支援するエネルギーマネジメントのプロフェッショナルとして注目されています。本記事では、エネマネXの概要とその取り組み、さらにSDGs（持続可能な開発目標）達成に向けた挑戦について詳しく紹介します。

##エネマネXとは？

エネマネXは、エネルギーの"創る"、"蓄える"、"使う"を効率的に管理するためのエネルギーマネジメントサービスを提供しています。特に、工場、倉庫、店舗、事業所など幅広い施設向けに、太陽光発電や蓄電池システムの導入を通じて、電力の自給率向上や電気代削減を目指しています。

エネルギーマネジメントとは、施設や設備のエネルギー使用状況を可視化し、最適な形でエネルギーを活用することです。これにより、省エネ効果だけでなく、企業が持続可能な経営を実現できる点が大きな特徴です。エネマネXでは、設計から施工、運用、メンテナンスに至るまで、ワンストップでサービスを提供。10年以上にわたる豊富な実績に裏付けられた技術力で、多くの企業に選ばれています。
[EA億り人計画 第1章]FX自動売買プログラムの基本と設計

## 概要
FX自動売買プログラムを作るにあたって、知っておくべき基本的なことと、ベースの設計についてまとめた。

---
この記事は、ワイみたいなプログラミングがもともとできて、トレードを少しかじって、EA作ってみようという人を主にターゲットにしてるわよ。
いくつかトレードにおける基本知識が必要なこともあると思う。わからないことがあったら質問してもいいわよ。

## はじめに
[前回の記事 - [EA億り人計画 序章]自動売買プログラム（EA）を自作して、億り人になるために色々調べてみた](https://qiita.com/is3to4/items/a8d183889a6b060e1b45)において、FXの自動売買プログラムをMT5というソフトを使って、MQL5言語で作ることにした。

## MQLプログラムの種類
MQLプログラムには２種類ある。
- インジケーター／指標 （チャート上に時系列のデータを表示できる）
- EA （オブジェクトの描画やトレードができる）
このどちらかでしか作ることはないらしいし、どちらかにしかならないようになっているようだ。

## EAプログラムの基本

構文はほとんどC++に近いそうだ。（C++詳しくない）
基本的にオブジェクト指向かつ静的型付けのコンパイラー型言語である。モダンエンジニアな人たちはコンパイラーあんまり使ったことないかもね。

（ちなみにインジケーターは今のところ雰囲気でなんとなくは作れるものの、変数の扱いが独特過ぎてわけがわからないので、まだ詳細な記事は作りたくないぞ。笑）

EAのプログラムは、MT5を起動し、チャート画面に紐づける形で、起動できるようになっている。
そして、起動したEAは、所定の時間になったタイミングや、新たな価格配信を取得した時に処理をし、トレードを実行することができる仕組みとなっている。

そう、EAプログラムは、基本的にイベントベースで動く。

### 基本の流れ

最低限のEAプログラムは、下記の流れで動作する。

1. 起動後に初期処理
1. 新たな価格が配信された際の処理

#### 初期処理 [OnInit](https://www.mql5.com/ja/docs/event_handlers/oninit)

EAのテンプレートや既存のサンプルソースを開くと、OnInitというメソッドが最初から用意されているが、これが起動時に呼ばれるメソッド。俺達は明確にこれを呼ぶ必要はない。勝手にMT5が呼んでくれる。

ただし、EAをチャートに呼び出したときだけでなく、チャートの時間足を変更した際にも呼ばれるため、少し注意が必要。 

チャートの時間足の変更時などは、初期化解除処理 [OnDeinit](https://www.mql5.com/ja/docs/event_handlers/ondeinit) と対になって呼ばれる。

#### ティックイベント [OnTick](https://www.mql5.com/ja/docs/event_handlers/ontick)

最も使われるであろうイベント。価格が更新される毎に呼ばれるので、相場や取引所によっては、1秒間のうちに何度も呼ばれることがある。こちらもMT5が勝手に呼ぶので、俺達はこの中身を編集するだけで良い。

絶対に1秒や1分のうちに1回呼ばれるとは限らないので、その場合は [EventSetTimer()](https://www.mql5.com/ja/docs/eventfunctions/eventsettimer)と[OnTimer](https://www.mql5.com/ja/docs/event_handlers/ontimer)を使う。こちらは逆に、休場日なども呼ばれるため注意。

### トレードの流れ

次は、相場をEAで扱うにあたって、どのような処理となるか、ざっくり解説してく。

ちなみにトレードの大まか流れは、人間がどのようにトレードするかとほとんど同じ考え方だと思われる。

#### 大まかなトレードの流れ

まずは、人間の理解しやすいところで書くと次のような感じでトレードする。

1. 使うインジケーターがある場合、その設定などの準備をする。
1. チャートを監視し、買い・売りのシグナルがある場合、注文を実行し、ポジションを建てる。
1. 引き続きチャートを監視し、儲かったときに利益確定の決済をしたり、儲からなかったときに、損切りの決済をする。
1. 1に戻る

#### EAプログラムの処理の流れ

これを、先のEAプログラムの仕様に落とし込むと、こういった処理になる。

1. 初期処理
    1. インジケーターの初期化、変数の準備などを行う
1. ティックイベント
    1. すでにポジションがある場合
        1. ポジションの利益確定や損切りを行うかどうかの判断を行う
    1. 買い・売りの条件を判断
        1. インジケーターや現在価格などをみて、判断を行う

### EAのテスト

MT5には、EAを指定期間の過去データでテストする機能が用意されている。また、取引所が用意してくれている、デモ口座での実行もよりよいEAを作るためにおすすめする。

## 終わり

ある程度プログラミングができる方であれば、最低限これだけあればまずは作れると思われる。
次回は、相場環境についてなども交えて、もう1歩進んだEAの戦略を考えていきたい。
C#のUnitTestで、ILogger<T>のモックを簡単に作る方法（GenericHostで使える）

# 概要

UnitTest、書いてますか？

GenericHostやWebHostを使っている場合、テストコードを書くためには、必ず`ILogger<T>`のモックが必要になると思います。これを手軽に作成する方法を書きます。

# 最初に結論まとめ

こんな感じの共通クラスで`CreateLogger<T>`メソッドを用意しておいて呼び出すことで、コンソール出力するILoggerを簡単に作れます。あとはこれを、コンストラクタ等のDI部分へ渡せばOKです。

```csharp
internal class ILoggerToConsole
{
    private static readonly ILoggerFactory _factory = LoggerFactory.Create(builder =>
    {
        builder
            .AddConsole()
            .SetMinimumLevel(LogLevel.Trace);
    });

    public static ILogger<T> CreateLogger<T>()
    {
        return _factory.CreateLogger<T>();
    }

}
```

# 説明

そろそろ、GenericHostを使う人も増えてきたでしょうか。ASP.NET系のWebアプリならばWebHostをたぶん最初から使っていますね。それらでUnitTestを書こうとすると、最初に悩みどころになるのは、「`ILogger<T>`に何を渡そうか」ではないでしょうか。

Moqを使っているならば、ILoggerのインターフェースを満たすモックを作れば良い。それはその通りです。しかし、メソッドも多いし自力で書くのはちょっと面倒です。

NUnitの場合、ILoggerの内容をどこへ出力するモックを書きたいかというと、たぶんコンソール出力になると思います。

それならば、コンソール出力をする本物のロガーを作成してしまった方が、実のところモック作成よりも手軽です。その方法を書きます。

まず、どこへ何を出力するロガーを作るのかを決めて、ILoggerFactoryを作成します。

```csharp
var loggerFactory = LoggerFactory.Create(builder =>
{
    builder
        .AddConsole()
        .SetMinimumLevel(LogLevel.Trace);
});
```

こんな感じです。ここでは、「コンソールに出力する」「出力対象の最小レベルをTraceとする」という設定です。

必要なのは`ILogger<T>`で、Tは対象のクラスによって変わりますね。それに合わせ、次のようにインスタンスを作成します。作成したら、対象のクラスへ渡せばOKです。

```csharp
var logger = loggerFactory.CreateLogger<クラス名>();
```

クラスごと使い方を例示すると、こんな感じです。

```csharp
class TestTarget(ILogger<TestTarget> _logger){
}

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder
        .AddConsole()
        .SetMinimumLevel(LogLevel.Trace);
});
var logger = loggerFactory.CreateLogger<TestTarget>();
var instance = new TestTarget(logger);
```

はい、これだけです！これだけで、コンソールへのログ出力をしてくれる`ILogger<T>`のモックのできあがりです。（モックというか、本物ですが）

LoggerFactoryは使い回せるので、次のような共通化したクラスを作っておいて、必要な時に`CreateLogger<T>`を呼び出すと、使いやすいと思います。

```csharp
internal static class ILoggerToConsole
{
    private static readonly ILoggerFactory _factory = LoggerFactory.Create(builder =>
    {
        builder
            .AddConsole()
            .SetMinimumLevel(LogLevel.Trace);
    });

    public static ILogger<T> CreateLogger<T>()
    {
        return _factory.CreateLogger<T>();
    }

}
```

さっきと同じようにクラスでの使い方を例示すると、こんな感じです。

```csharp
class TestTarget(ILogger<TestTarget> _logger){
}

var logger = ILoggerToConsole.CreateLogger<TestTarget>();
var instance = new TestTarget(logger);
```

## ちなみにコンソール出力がいらない場合は

コンソール出力するロガーを作って渡す方法を紹介しましたが、コンソール出力も不要な場合は実はもっと簡単な「NullLogger」という方法があります。そういう組み込みの型があるので、newするだけで使えます。

こんな使い方になります。

```csharp
class TestTarget(ILogger<TestTarget> _logger){
}

var logger = new NullLogger<TestTarget>();
var instance = new TestTarget(logger);
```


# まとめ

UnitTestのコードを頑張って書こうとしても、最初に「ロガーのインスタンスはどうしようか」で引っかかって挫折してしまってはもったいない。そういう問題はこの記事の定型コードで解決して、どんどんUnitTestのコードを書いていきましょう！
爆速で簡単なページ（飲食店のメニュー表）をWeb公開する

# 経緯
 ツイッターで見かけたので試してみました(引用すいません）

https://x.com/songmu/status/1876845978617061846

# 成果物

https://docs.google.com/spreadsheets/d/e/2PACX-1vRdCU8ch44dCGCd_RYyEdx_-4_89qCf8MxBkQguW0pJ3FRSmEv3pFG0O2WnVToaf6ieURz83LKnGTpY/pubhtml?gid=0&single=true

# 手順

* google スプレッドシートにアクセスします

https://docs.google.com/spreadsheets/u/0/?ec=wgc-sheets-globalnav-goto

* 空白のスプレッドシートを作成します

* Gemini for Workspace(無料)を有効化済みなので適当にメニューを作ってもらいます

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383255/14465b43-4e5c-b192-1318-78b18b782542.png)

* ハンバーガーショップのメニューになりました
* 列の幅を調整して、罫線を非表示にしました
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383255/092d5feb-4875-0d46-b78a-2cb795e35868.png)

* ウェブに公開します
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383255/8fe51c4c-c964-9131-1748-de86e662743d.png)

* シートを選択して公開します
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383255/de390573-d98f-ef95-d003-f6bd8eb49cc9.png)

* 表示されたリンクにアクセスしてみます

https://docs.google.com/spreadsheets/d/e/2PACX-1vRdCU8ch44dCGCd_RYyEdx_-4_89qCf8MxBkQguW0pJ3FRSmEv3pFG0O2WnVToaf6ieURz83LKnGTpY/pubhtml?gid=0&single=true

* タイトルの変更をするのを忘れてたので更新しました
　５分位待つと変更が反映されていました
 ![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383255/edc74944-2929-cf6d-ac8b-a06246eed013.png)

 タイトル更待ちを除くと、５分も掛かりませんでした


 以上
報告する際に捨てなければいけない物 - 情報共有のジレンマ

上司から報告を求められて、正確に報告しようと思っていたら「早くしろよ！」と怒られて
次回は早く報告したら「全然情報足りてないじゃねぇか」と怒られて
次回は早く情報漏れがないように報告したら「間違いだらけじゃねぇか」と怒られて

・・・ってことありませんか？

早く、正確に、漏れなく報告を求められたらこれは無理ゲーというか、負けイベなんです。

## 情報共有のジレンマ

情報共有においては「早さ」「正確性」「網羅性」の内二つしか満たすことはできないということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/26194d75-cb97-8563-161b-eb5c94bde797.png)
27th Annual FIRST Conference (2015), Lightning Talk: “Four Easy Pieces”, Tom Millar (US-CERT, NIST) 

元々はセキュリティにおける情報の要素を述べたものですが、日本のセキュリティ団体であるISOG-Jが取り上げた際に「情報共有のジレンマ」と名付けたようです。
セキュリティインシデントにおける情報共有についての話題ではありますが、普段のホウレンソウにおいても同じことが言えると思います。

つまり報告を「早く」「正確に」「漏れなく」報告することは最初から無理なんです。

### 報連相における重要性

これは報告をする側(主に部下)も報告を受ける側(主に上司)も意識すべきことであると思います。

上司側は何を優先しているのかを明確にし「今は正確でなくてもいいから一次情報が欲しい」「時間が許す限り情報を集めろ」等、ケースによって要望を伝えるべきであり、
部下に対して「早く」「正確に」「漏れなく」報告しろ！ということ自体が愚かな行為ということを認識すべきです。

・・・ただ、現実問題そう物わかりのいい上司ばかりでもないし
部下から『情報共有のジレンマって知ってます？「早く」「正確に」「漏れなく」なんて無理なんですヨ！』とか上司に言える状況が必ずあるとは限りません。
というか全部上司のせいにするのも思考停止気味ではあります。

### 対策：返却値とコールバック

もちろん単純に「今って早さ正確性網羅性どれ求めますか？」とケースごとに聞くのも一つの手です。

ただソフトエンジニアサイトのQiitaっぽくいうと
報告する側としてはプログラムで言うところの返却値とコールバックを意識するようにすべきです。
プログラムにおいて主に時間がかかる長い処理においては関数を呼び出しても「わかったよ、あとで言うな」「今すぐわかる情報はこれな」とだけ返却値で返します。
そして非同期処理で「終わったよ。依頼されてた情報はこれな」あるいは「中間報告な、今はこの状況だよ」とコールバックで返します。

報告に置いても同じですよね。
早く、正確に、網羅的な情報は無理なので、正確に網羅的な報告に時間がかかりそうなときは
まずは早く
「不正確な情報ですが現時点ではこうです。ここの検証はXXまでに報告します」
あるいは
「途中経過ですがここまで終わった分を報告します。残りはXXまでに報告します」
と正確性か網羅性を捨てた一次報告を早くすべきです。（可能なら目途を添えて）
そして残りの一つが満たされた時点で残りの報告をすべきです。

## 似ている話

データベースにおいてCAP定理というものがあります。
以下の３つの内二つしか満たせないというものです。
一貫性 :Consistency
可用性 :Availability
冗長性(分断許容) :Partition-tolerance

分断耐性とはデータベースをひとつのサーバーだけではなくいくつかの分散サーバーを持った状態のことで、冗長性を保ち障害に耐えられるようにした構成のことです。

ここで高可用性はサーバーが楽観的排他制御などロックをしない状態とすると「早さ」と言い換えることもできる（？）と思います。
一貫性は全てのデータベースで統一された最新の情報を持っている状態、つまり「正確性」と言えるかと思います。
冗長性を情報が失われないような漏れがない状態を保つと捉えれば

最後は特にちょっと無理やりですが・・・
情報のジレンマの話を知った時、CAP定理に似ているなぁと思ったという次第です。
トークンって何？

## 読んで欲しい人
- 「トークンって何？」と聞かれても、答えられない人
- 上の質問をされて、黙り込んでしまった過去の自分
## トークンとは？
[トークンとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word110186.html)

天下無双のぴよぴよ先生は

> 分野や文脈次第で何を指しているか変わってくるから、一言で説明できるものじゃないよ。その分野ごとの意味を調べてね

と、おっしゃっていますが
IT、プログラム界隈におけるトークンとしては**暗号化された文字列**と表現しても差し支えないと思います

大体トークンって、セキュリティトークンとか認証トークンの脈絡で使用されるケースが多いと思うので、今回は「認証トークン」を説明します

## 認証トークンとは？

アクセス制御を目的としたデジタル形式の認証情報のことを言います
ユーザーが特定のアプリケーションにアクセスする際の通行証のようなものをイメージしてください

## 認証トークンの何が良いのか

- セキュリティの向上
  - 通常のログインIDやパスワードよりも複雑かつ漏洩しにくいので、悪い奴が入って来にくくなります
- ユーザー体験向上
  - アクセスするたびに「パスワードを入力してください」と言われると、めんどいです。トークンならユーザーはパスワードを入力する必要がありません

## 認証トークンの仕組み
### トークンの生成

ユーザーが最初にアプリにログインすると、サーバーはその人専用の「トークン」を発行してくれます。
トークンには、有効期限やアクセス権限などの情報が含まれています

### トークンの検証

ユーザーはパスワードを入力しない代わりに、このトークンをサーバーに見せつけてアクセスします。
サーバーはそのトークンが有効であればアクセスを許可して、無効であればアクセスを許可しません

有効期限が切れたり、トークンを削除した場合は再度パスワードでアクセスをして、トークンの再発行を行います（仕様によりますが）

## 感想

- 「いつも言ってるトークンってなんなの？」と質問されて回答できなかったのが悔しかったです。
- いつ何時でも人に話せて「理解」ですね

## 参考

https://cmc-japan.co.jp/blog/authentication-token/
AlmalinuxでCD/DVDデバイスを使えるようにする

# 0.本稿について
- 対象：サーバ用Linuxについて学習している初学者。
- 目標：AlmaLinuxでCD/DVDメディアを利用できるようになる。
- 想定：WindowsでDVDメディアを使った経験がある初心者を想定。

:::note warn 
#### 正確さの省略について
本稿では概念をわかりやすくするために、簡略化した表現を使用し、一部専門的な詳細を省略している事があります。
:::

# 1.はじめに
Linuxを運用している際に、CDやDVDメディア媒体に入っているファイルを利用したい場合があります。
Windowsの場合は、DVDドライブを接続してメディアを挿入したら、後はマイコンピュータなどから開けば利用できますが、Linuxの場合は手動でマウントを行う必要があります。

本稿では、AlmaLinuxでCD/DVDデバイスを使えるようになる事を目標としてその手順等を紹介します。

# 2.概要と説明

## 2.1デバイスファイルとは？
Linuxでは、マウスやキーボード、CD/DVDドライブやUSBメディア、内蔵ストレージなどの(ハードウェア)デバイスを、**デバイスファイル**という「1つのファイル」として扱われます。

CD/DVDドライブなどのストレージデバイスは**ブロックデバイス**に分類され、Linuxに接続されると、自動で以下のようなファイル名で表されます。
- 例: `/dev/cdrom`や`/dev/sr0`

:::note info
#### キャラクタデバイス
- キーボードやマウスなどのデバイスは**キャラクタデバイス**に分類されます。これらの違いは本稿では触れません。
:::

## 2.2マウントとマウントポイント
LinuxでCD/DVDを使うには、マウントポイントというディレクトリを作成し、そのディレクトリにデバイスファイルをマウントするという操作が必要です。

:::note info
#### マウントのイメージ
マウントというのは、既にあるLinuxの特定のディレクトリに、CD/DVDメディア等に保存されているディレクトリをくっつけるイメージです。本稿の場合では、`/mnt/cdrom`というマウントポイントに`/dev/sr0`というデバイスファイルをマウントしています。
:::


# 3.手順
ここから、実際にマウントする手順です。

## 3.1 デバイスファイルの確認
CD/DVDドライブが正しく認識されているか確認します。

```bash
$ lsblk -p
```
```
NAME                           MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
/dev/sda                         8:0    0 119.2G  0 disk
├─/dev/sda1                      8:1    0   600M  0 part /boot/efi
├─/dev/sda2                      8:2    0     1G  0 part /boot
└─/dev/sda3                      8:3    0 117.7G  0 part
  ├─/dev/mapper/almalinux-root 253:0    0    70G  0 lvm  /
  ├─/dev/mapper/almalinux-swap 253:1    0   7.7G  0 lvm  [SWAP]
  └─/dev/mapper/almalinux-home 253:2    0  39.9G  0 lvm  /home
/dev/sr0                        11:0    1  1024M  0 rom  ←これがCD/DVDドライブのデバイスファイル
```
このコマンドで、接続されたデバイス一覧が表示されます。
CD/DVDドライブは通常、`/dev/cdrom`または`/dev/sr0`として表示されます。

## 3.2 マウントポイントの作成
マウントポイントを作成します。

```bash
sudo mkdir -p /mnt/cdrom
```

:::note info
#### マウントポイントはどこにしたらいいの？
本手順では、`/mnt/cdrom`というディレクトリを作成してマウントポイントとしていますが、実際にはこのディレクトリでないとダメという事はありません。ただ、`/mnt`というディレクトリはマウントする際の場所として親切で用意されている場所のため、特に指定がなければこのディレクトリを使うと良いでしょう。
:::

## 3.3 マウント操作
以下のコマンドを使用して、CD/DVDメディアをマウントします。
```bash
sudo mount -t iso9660 -o ro /dev/sr0 /mnt/cdrom
```
- `-t iso9660`: CD/DVDメディアのファイルシステム形式（ISO9660）を指定。
- `-o ro`: 読み取り専用モードでマウント。

## 3.4 マウント確認
マウントが成功したかを確認します。成功していれば、CD/DVDメディアに入っているデータが一覧表示されます。
```bash
ls /mnt/cdrom
```

# 3.5 マウント解除
CD/DVDメディアの利用が終わったら、マウントを解除します。

```bash
sudo umount /mnt/cdrom
```

:::note info

#### マウント解除に失敗した場合
他のユーザーやプロセスが`/mnt/cdrom`を使用していると`umount: /mnt/cdrom: target is busy.`などという表示が出て解除できません。この場合、どのユーザ、プロセスが利用中か確認するには以下のコマンドを使用します。
```bash
lsof /mnt/cdrom
```
利用中のプロセスが表示されるので、それを終了してから再試行してください。
:::
Boxのフォルダ/ファイルをエクスプローラから表示する方法

# はじめに
クラウドストレージサービス「Box」は、多くの企業や個人に利用されています。Windows環境でBoxのフォルダやファイルをエクスプローラから直接操作できると、操作性や業務効率が向上します。本記事では、Box Driveという公式ツールを使って、Boxのフォルダやファイルをエクスプローラから表示する方法について解説します。

# 手順

(1) [Boxのウェブサイト](https://www.box.com/resources/downloads)にアクセスし、Box Driveのインストールファイルをダウンロードします。
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/d5d92115-eb80-b181-6b5f-ab110856cb87.png)

(2) ダウンロードが完了したら、インストーラを実行します。
(3) 「ログイン」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/742d3fe4-6ab2-80e2-31d3-7ffcf618172f.png)

(4) Boxアカウントのメールアドレスを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/152dca2c-ef4c-6e57-0f1b-ffe9d977b6fa.png)

(5) パスワードを入力し、「ログイン」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/e5c2a3a1-a7f0-0ffb-e60d-0eb03875e07c.png)

(6) 正常にログインできると、以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/7887a422-48ff-0a62-5822-9f38b35bfac2.png)

(7) しばらくすると、Box Driveが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/7a4371e4-8adc-3358-36b9-3f369a60e523.png)

(8) エクスプローラを開くと、Boxのクラウドフォルダがローカルドライブとして表示されます。
   - 通常、`Box`という名前のドライブとして表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/a726e6d6-e501-209f-313d-3c37af5e2a34.png)

### Box Driveのアイコンとファイルまたはフォルダのステータス
Box Driveのアイコンを見ると、ファイルとフォルダのステータスを一目で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/9d5d20ac-d6b5-e62d-2626-ddc276262114.png)

### 注意点

- **インターネット接続**が必要です。Box Driveはクラウドベースで動作しているため、オフライン環境ではアクセスできません。
- セキュリティポリシーによって、Box Driveの使用が制約される場合があります。企業のITポリシーに従って使用してください。

### まとめ

Box Driveを利用することで、Windows環境でもBoxのクラウドストレージをエクスプローラから直感的に操作することができます。この記事の手順に従って、Boxのフォルダやファイルをエクスプローラに表示し、業務効率を向上させましょう。
さくらのクラウドのVPCルータ&ルータ+スイッチ構成でIPv4逆引き設定をする

さくらのクラウドでVPCが構築できるVPCルータがあります。
これとルータ+スイッチを使用した構成時にIPv4逆引きの設定方法が分からなかったので、まとめます。

![スクリーンショット 2025-01-08 17.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/b1fc862b-352c-501d-218f-730941017e32.png)

# コントロールパネルでの設定方法
※事前にIPアドレスの正引きの設定をしてください。

1.VPCルータに接続されているスイッチの詳細画面を開く

VPCルータの詳細画面の「インタフェース」タブをクリックし、グローバルの接続先のスイッチをクリック。
※画像の場合は「VPCルータ」というスイッチ

![スクリーンショット 2025-01-08 18.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/f9a27902-169d-21b3-fd14-0c84dec6a039.png)

2.スイッチの詳細画面の「IPアドレス」タブをクリック、画面右端の編集ボタンをクリック。
![スクリーンショット 2025-01-08 18.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/4e980291-0fda-c78b-99f6-55470e254291.png)

3.逆引きホスト名の入力をして「更新」をクリック。
![スクリーンショット 2025-01-08 18.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/0b2f3f5b-8041-424b-0b45-92cd73ae885e.png)

更新が完了されると、ホスト名列に逆引きホスト名が表示されます。

# Terraformでの設定方法
sakuracloud_ipv4_ptrを利用することができます。
https://registry.terraform.io/providers/sacloud/sakuracloud/latest/docs/resources/ipv4_ptr

※事前にIPアドレスの正引きの設定をしてください。

```hcl
# ルータ+スイッチ
resource "sakuracloud_internet" "internet" {
  name        = "ルータ+スイッチ"
  description = "ルータ+スイッチ"
  netmask     = 28
  band_width  = 100
  enable_ipv6 = false
}

# 逆引き
resource "sakuracloud_ipv4_ptr" "test" {
  ip_address     = sakuracloud_internet.internet.ip_addresses[0]
  hostname       = "逆引きホスト名を入力"
  retry_max      = 30
  retry_interval = 10
}
```
NaCl型-GeSeのバンド構造

mp-10759(NaCl型-GeSe)をQSGW計算してみた。バンドプロットは
(0eVがフェルミエネルギーだが計算メッシュの関係で少しずれている。詳細は次）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/c8c88b5f-8380-9fe9-4679-e0a65e2bcebc.png)
（BZ: https://ecalj.sakura.ne.jp/BZgetsyml/BZ1.html )
定性的にLDA計算とさほど変わらない。これはいずれにせよQSGW$\sim$LDAが正しい準粒子構造を示しているという理論的根拠になる。

バンドギャップ近傍のみを書くと、左図（SOCなし）となり（図ではフェルミエネルギーがずれているが気にしなくて良い）、Lを含む境界面でリング状にフェルミエネルギーがあることになる（ポイントでなくラインになる）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/ebf4c4f0-add2-8a51-7195-df808dd084b6.png)

一方、SOCを入れると右図のようにL点で0.05eVレベルのバンドギャップができる。小さい。

<!--- 

GeにSbをデルタドープすることでオーミックコンタクトがとれるとのこと。
https://www.jstage.jst.go.jp/pub/pdfpreview/jsapmeeting/2012.2/0_2012.2_3365.jpg
デルタドーピングによる金属化（GeSb相を作ってやることでメタル相となる）というようなことがあるのかもしれない。単純な不純物ドーピングでなくバンド構造の金属化を考慮する、ということが必要かもしれない。

--->
【検証】【OpenMetadata】Snowflakeの日本語table・view・columnのテクニカルメタデータを取得してみる

## ごあいさつ

こんにちは。日鉄ソリューションズ株式会社のhayashitaniです。
私が所属している組織では製造業のお客様向けに、データ基盤構築、データガバナンスコンサルなどを支援させていただいております。

今回は、記事でコメントをいただいた
**Snowflakeの日本語ビュー・日本語カラムのテクニカルメタデータをOpenMetadataに取得できるのか？？** を検証したいと思います。
（コメントをいただきありがとうございます！）


　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/1d75a0da-7dbe-224a-b783-b131b75a31eb.png)


本記事は#1 テクニカルメタデータの取得の補足版となります。
これまでの投稿については以下のリンクをご参照ください。
| no | 概要 | 
| ------- | ------- | 
| # | データカタログ概要 |
| 1 | [Snowflakeのテクニカルメタデータをデータカタログに取得する](https://qiita.com/hayashi----00/items/29423c5969f6f5b4e94c) |
| 補足 |Snowflakeの日本語table・view・columnをクローリングしてみる★本記事|
| 2 | [Snowflakeの実データをサンプルとしてデータカタログに登録する](https://qiita.com/hayashi----00/items/0c3ced92ad29a02487f0) |
| # | ビジネスメタデータをデータカタログに登録する |
| # | データカタログの検索機能を触ってみる |
| # | リネージをデータカタログに登録する |
| # | Snowflakeの利用情報をデータカタログに登録する |
| # | 用語をデータカタログに登録する |
| # | プロファイリング情報をデータカタログに登録する |
| # | データカタログで品質テストを行う |
| # | データカタログで品質テストを行う |

:::note warn
本投稿の内容は私個人の意見であり、組織の見解を代表するものではありません。
:::


メタデータの概要については以下に投稿を行っています。
* [【入門】メタデータとは？テーブル定義書の内容を３つのメタデータに分類してみる](https://qiita.com/hayashi----00/items/82015d767b88f75151d9)



## 前提

* OpenMetadataがインストール済み（本記事では、１．６．１バージョンを利用）
* Snowflakeアカウントを利用可能
* ブラウザを利用可能（本記事では、Chromeを利用）

## 日本語table・view・column準備
Snowflakeで以下の日本語のカラムを持つ日本語のテーブル、ビューを作成します

```
-- 日本語テーブル作成

CREATE OR REPLACE TABLE DB_DATACATALOG_SOL.WORK."社員テーブル" (
    "従業員ID" INT NOT NULL,
    "職位" VARCHAR(50) NOT NULL,
    "採用日" DATE NOT NULL,
    "退職フラグ" INT NOT NULL,
    PRIMARY KEY ("従業員ID")
);
```
※必要なDB、スキーマは事前に作成が必要です

```
-- 日本語ビュー作成

CREATE OR REPLACE VIEW DB_DATACATALOG_SOL.WORK."社員ビュー" AS
SELECT
    BUSINESSENTITYID AS "従業員ID",
    JOBTITLE AS "職位",
    HIREDATE AS "採用日",
    CURRENTFLAG AS "退職フラグ",
FROM
    DB_DATACATALOG_SOL.DL.EMPLOYEE;
```

※必要なDB、スキーマ、参照元テーブルは事前に作成が必要です

## テクニカルメタデータ取得
[#1 Snowflakeのテクニカルメタデータをデータカタログに取得する](https://qiita.com/hayashi----00/items/29423c5969f6f5b4e94c) の方法でテクニカルメタデータの取得を行います



## 結果
### スキーマのページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/06e3478c-40c8-0773-ba82-78366dc6eb04.png)
Snowflakeのスキーマに追加した、日本語テーブル「社員テーブル」と日本語ビュー「社員ビュー」が追加されました


### テーブルのページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/03f97c77-efac-934d-b0c3-d7f679c718d6.png)
テーブルの日本語カラムも取得できました


### ビューのページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/758a2bed-733c-1d4a-31c1-33c279a31e4a.png)
ビューの日本語カラムも取得できました


## 最後に
**日本語のテーブル、ビュー、カラムについても、英語の時と同様にテクニカルメタデータを取得できることが確認できました。**
データカタログのためにテーブル定義やビュー定義を変更するのは現実的ではありません。そのため、日本語に対応していない場合、データカタログにテクニカルメタデータを登録するのを諦めることになるかもしれません。
しかし、OpenMetadataは日本語にも対応しているため、データベース上のテーブルやビュー、カラムの言語（日本語・英語）を気にせずに登録できそうです。


今回はいただいたコメントを参考に検証を行ってみました。
企業においては、テーブル名、ビュー名、カラム名が日本語で定義されているケースもあると思うので（特にビューは多いのではないでしょうか？？）、本検証の結果が多くの方々のご参考になれば幸いです。

本記事についてご不明点、ご質問事項等があれば、コメントをお願いいたします。
また、本分野に関してご興味を持っていただけた方がいらっしゃれば、お気軽にお問い合わせください。
Heap memory errorで行ったこと

## はじめに
node.jsを使用して開発していたら、急にbackend serverが heap memory errorで止まったのでその際の対処法をメモしておく。

## 結論、行ったこと
アクティビティモニタから、node を削除しました。
![Xnip2025-01-08_18-01-39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505912/757b9456-f344-d242-fa1e-0a19b775ebd9.jpeg)

## error内容
下記のエラーが表示され、npm run devができなくなった。
(最適な方法なのかは後日調査)
```
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
```
![Xnip2025-01-08_18-06-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505912/b85f7e18-acc2-72c6-8c11-9dcb18e82ab2.jpeg)

ヒープメモリを確認したところ、4119と高めだったため一度 アクティビティモニタから nodeを削除する対応を行った。

## 参考
https://zenn.dev/arsaga/articles/32a0c4d897ae1c
Pythonでヒストグラムを模様で可視化！白黒印刷に強い資料作り

# 今回行ったこと
- matplotlibのヒストグラム生成時に、**パターン(模様)** を使用して描画する方法を実装。
- **白黒の印刷** に対応できるよう、模様を使った視覚化を実現。


# 私の環境
- Python: 3.10.9
- matplotlib: 3.7.0
- numpy: 1.23.5


# matplotlib で使用可能なパターン一覧

`matplotlib` を使ったグラフ描画では、以下のパターンを `hatch` オプションで指定することができます。これにより、色だけでなく模様を使った視覚化が可能になります。

| パターン文字 | 描画される模様               |
|--------------|----------------------------|
| `/`          | 右斜線                   |
| `\\`          | 左斜線                   |
| <code>\|</code> | 縦線                     |
| `-`          | 横線                     |
| `+`          | 十字                     |
| `x`          | 交差                     |
| `o`          | 小さな円                 |
| `O`          | 大きな円                 |
| `.`          | 点                       |
| `*`          | 星                       |

## サンプルコード

以下は、模様を使ったヒストグラムを描画する例です。

```python
import matplotlib.pyplot as plt
import numpy as np

# ダミーデータ
data1 = np.random.normal(10, 15, 1000)
data2 = np.random.normal(50, 15, 1000)
data3 = np.random.normal(100, 15, 1000)

# ヒストグラムを模様付きで描画
fig, ax = plt.subplots()

# 各データに異なる模様を設定
ax.hist(data1, bins=20, color='white', edgecolor='blue', alpha=0.7, hatch='/', label='Pattern: /')
ax.hist(data2, bins=20, color='white', edgecolor='green', alpha=0.7, hatch='x', label='Pattern: x')
ax.hist(data3, bins=20, color='white', edgecolor='red', alpha=0.7, hatch='o', label='Pattern: o')

# グラフの設定
ax.legend()
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
ax.set_title('Histogram with Different Patterns')

# グラフの表示
plt.show()
```

## 出力結果
上記のコードを実行すると、以下のようなヒストグラムが描画されます。

- **青の右斜線 (`/`)**: 最初のデータセットを表します。
- **緑の交差模様 (`x`)**: 2つ目のデータセットを表します。
- **赤の小さな円模様 (`o`)**: 3つ目のデータセットを表します。

模様を使うことで、データセット同士の違いを色覚に依存せずに判別しやすくなります。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887299/03f02380-b22a-0314-fa5a-f7b512619d53.png)

## 実用例
白黒のレポートや論文用の資料を作成する際、色だけでは区別がつかない場合があります。この方法を使えば、模様でデータセットを区別できるため、印刷物にも対応可能です。
コードレビュー前のチェックリスト

## 目的
コードレビューを依頼する前に、自分で確認することで、レビューアの時間を節約し、指摘の質を高めることを目指します。また先輩エンジニアや稼働率の高いメンバーへの配慮となります！
新人エンジニア時代はレビュー数がとんでもないことになりがち。。。。
PJで許されているのであれば、先にChatGPTなどのAIに以下の項目をチェックしてもらうのも良いでしょう！

## チェックリスト項目

1. **コードのスタイル**
   - 不要な改行やスペースが含まれていないか。
   - コメントが適切に整理されているか（無駄が多すぎない、必要最低限で要点を押さえている）。
   - インデントが揃っているか。
　
2. **命名規則の確認**
   - 変数名や関数名が目的を的確に表現しているか。
   - 一貫性が保たれているか（例：CamelCase、snake_caseなど）。
   　

3. **コードの可読性**
   - 長すぎる一行のコードを適切に改行しているか。
   - 複雑な処理が簡潔に整理されているか。
   - 必要に応じて、ヘルパー関数やコメントで処理の意図が補足されているか。
　
4. **無駄なコードの排除**
   - 未使用の変数や関数が残っていないか。
   - デバッグ用のコード（print文やconsole.logなど）が削除されているか。
　
5. **動作確認**
   - コードが期待通りに動作するかローカル環境でテスト済みか。
   - 変更した箇所が、他の部分に影響を与えていないことを確認したか。



## リファクタリング例

### 改善前

以下のような長い一行コードは、可読性を損ないます：

```python
human_capitals = HumanCapitals.objects.select_related("position", "department__company")
data = [{"id": h.id, "name": h.name, "position": h.position.name, "department": h.department.name, "company": h.department.company.name} for h in human_capitals]
```
### なぜ読みにくい？？
1. **一行が長い**：
   - コードが一行に長く書かれていると、特に画面やエディタの幅によっては、全体を把握しにくくなる。一行が長くなると、横にスクロールしなければ全文を見ることができないため、コードの流れを追いにくくなってしまう。。。
　
2. **複数の要素が同じ行に詰め込まれている**：
   - 複数のデータ属性（`id`, `name`, `position`, `department`, `company`）が同じ行に並んでいるため、どの属性がどの変数に対応しているか一見して理解しにくくなっている。これにより、特定の情報を探す際に余計な時間がかかる可能性があり。。。。
　
3. **データ構造が直感的でない**：
   - リスト内包表記を使用している部分が、複数の属性を含む辞書を生成しており、その複雑さが一行にまとめられてしまっている。これにより、どのようなデータ構造を意図しているのかが一見して把握しにくくなっている。。。
　
4. **視覚的区切りが少ない**：
   - コード内に適切なインデントや空行が使用されていないため、各部分の区切りが明確ではない。視覚的な区切りがあると、コードの各部分がどのように機能しているかを素早く理解する手助けとなりそう。

### 改善後

次のように書き換えることで、読みやすさが向上します：

```python
human_capitals = HumanCapitals.objects.select_related("position", "department__company")
data = [
    {
        "id": h.id,
        "name": h.name,
        "position": h.position.name,
        "department": h.department.name,
        "company": h.department.company.name,
    }
    for h in human_capitals
]
return JsonResponse(data, safe=False)
```

**ポイント**
- 配列や辞書の中身を改行して整理。
- 適切なインデントを使用して構造を明確化。



## まとめ

コードレビューは、チームの知見を共有し品質を向上させる機会です。事前にチェックを行うことで、レビューアの負担を減らし、建設的なフィードバックを得られる可能性が高まります。
文字列の引数とブロックの引数を同時に渡させる

#### 文字列の引数とブロックの引数を同時に渡させる
```rb
irb(main):001* def greeting(hi)
irb(main):002*   puts hi + "おはよう"
irb(main):003*   yield
irb(main):004*   puts "こんばんは"
irb(main):005> end
=> :greeting
irb(main):006* greeting("hogehoge") do
irb(main):007*   puts "こんにちは"
irb(main):008> end
hogehogeおはよう
こんにちは
こんばんは
=> nil
````
```rb
irb(main):018* def greeting(hi)
irb(main):019*   puts hi + "おはよう"
irb(main):020*   yield "こんにちは"
irb(main):021*   puts "こんばんは"
irb(main):022> end
=> :greeting
irb(main):023* greeting("hogehoge") do |i|
irb(main):024*   puts "#{i}"
irb(main):025> end
hogehogeおはよう
こんにちは
こんばんは
=> nil
```
ABC387B問題の高速化

## [問題](https://atcoder.jp/contests/abc387/tasks/abc387_b)の概要 ##
九九の表の中で、$X$ ではない数の総和を求めなさい、というものでした。
[公式解説](https://atcoder.jp/contests/abc387/editorial/11822)では $9 \times 9$ の2重ループを回す、という解法だったのですが、この九九が十万十万だったらどうでしょうか。
計算量はグリッドの縦横の長さを $N$ として $O(N^2)$ となる(公式解説より)ので、もし $1 \le N \le 10 ^ 5,1 \le X \le N^2$ だったらTLEしてしまいます。今回はこの問題を高速に解く方法を考えます。
まず、一般的な九九の表を見てみましょう。
<table>
  <caption>九九の表</caption>
  <thead>
    <tr>
      <th></th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th>
    </tr>
  </thead>
  <tr>
    <th> 1 </th> <td>1</td> <td>2</td> <td>3</td> <td>4</td> <td>5</td> <td>6</td> <td>7</td> <td>8</td> <td>9</td>
  </tr>
  <tr>
    <th> 2 </th> <td>2</td> <td>4</td> <td>6</td> <td>8</td> <td>10</td> <td>12</td> <td>14</td> <td>16</td> <td>18</td>
  </tr>
  <tr>
    <th> 3 </th> <td>3</td> <td>6</td> <td>9</td> <td>12</td> <td>15</td> <td>18</td> <td>21</td> <td>24</td> <td>27</td>
  </tr>
  <tr>
    <th> 4 </th> <td>4</td> <td>8</td> <td>12</td> <td>16</td> <td>20</td> <td>24</td> <td>28</td> <td>32</td> <td>36</td>
  </tr>
  <tr>
    <th> 5 </th> <td>5</td> <td>10</td> <td>15</td> <td>20</td> <td>25</td> <td>30</td> <td>35</td> <td>40</td> <td>45</td>
  </tr>
  <tr>
    <th> 6 </th> <td>6</td> <td>12</td> <td>18</td> <td>24</td> <td>30</td> <td>36</td> <td>42</td> <td>48</td> <td>56</td>
  </tr>
  <tr>
    <th> 7 </th> <td>7</td> <td>14</td> <td>21</td> <td>28</td> <td>35</td> <td>42</td> <td>49</td> <td>56</td> <td>63</td>
  </tr>
  <tr>
    <th> 8 </th> <td>8</td> <td>16</td> <td>24</td> <td>32</td> <td>40</td> <td>48</td> <td>56</td> <td>64</td> <td>72</td>
  </tr>
  <tr>
    <th> 9 </th> <td>9</td> <td>18</td> <td>27</td> <td>36</td> <td>45</td> <td>54</td> <td>63</td> <td>72</td> <td>81</td>
  </tr>
</table>

これを見ると、対称であることが分かります。つまり、$i,j(1 \le i,j \le 9)$ の積 $ij$ は、$ji$ とも等しくなります(乗法の交換法則)。例を挙げると、$i=4,j=9$ 等です。$ij=ji=36$ となります。なので、この対称性について考えると、$9 \times 9$ ではなく、$1 \le i \le \sqrt{X}$ まで考え、$X$ と一致するかなどのカウント(以下: $cnt$ )をします。答えとして、$2025-2cnt \times N$ を出力すれば良いと思うかもしれません。
でも、この解法には実は抜け穴があります。それは、$X$ が平方数のときです。この時にこの解法を使ってしまうと、$(i,j)=(\sqrt{X},\sqrt{X})$ を二回数えてしまうので、少し改良しなければいけません。$\sqrt{X}$ 回ループすることで、$X$ が平方数か判定して、もしそうなら答えから $1$ を引いて正しい答えにすることができます。
時間計算量は $O(\sqrt{X})$ となり、$1 \le N \le 10 ^ 5,1 \le X \le N^2$ でも高速に答えを出せます。
コード
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

int main() {
  int X;
  cin >> X;
  int ans = 2025;
  for(int i = 1; i <= 9; i++) {
    if(i * i > X) {
      break;
    }
    if(X % i == 0 && X / i <= 9) {
      ans -= 2 * X;
    }
  }
  for(int i = 1; i <= 9; i++) {
    if(i * i > X) {
      break;
    }
    if(i * i == X) {
      ans += X;
    }
  }
  cout << ans << endl;
}
```
もし $1 \le N \le 10^5$ ならC問題くらいの難易度だったと思います。
面白い問題でした!
Module cloud_firestore not found の対処法 in Flutter

Flutterコマンドやvscodeからはビルドできるが、xcodeからiosビルドしようとするとタイトルのエラーが出る。

僕の原因。
**xcodeのコンフィギュレーションがRunnerになってた。**
xcodeの上の方のデバイスを選ぶところの左のところです。
これをdevelopなりproductionなりにすればビルドできた。

３０時間はこれに使ったね。
がんばろうね。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【生成AI学習ロードマップ】生成AIの世界を極めた人たちの成功の秘密

生成AIは今後の社会に大きな変革をもたらす技術です。この分野は単なる一過性のブームにとどまらず、確実に進化を続けており、研究者たちは数年内に「人間並みのAIが登場する」と予測しています。

「生成AIってよく耳にするけど、どこから始めたらいいのかわからない…」
「AIに興味があるけど、設定とかが難しそう…」

そんなあなたのために、初心者でも確実に生成AIを使いこなせるようになるための学習ロードマップを整理しました。これを読めば、生成AIの波に取り残されずに、最前線で活躍できる人材になれるはずです。

対象読者
生成AIを学びスキルアップしたい方
社内でAIを活用してさらに活躍したい方
市場価値を高め、AI時代を生き抜く人材を目指す方
記事の構成
本記事は、「入門編」と「発展編」の2部構成です。入門編では、ゼロから「AIを使える人材」になるためのステップを解説し、発展編では「AIアプリを作れる人材」になるための技術的なステップを紹介します。

入門編
超基礎編：生成AIの魅力やAIの歴史を学ぶ
基礎編：AI活用事例や生成AIツールを使いこなす基盤を学ぶ
実践編：「実務で生成AIを使いこなす」ためのスキルを習得
発展編
発展編：生成AIとwebアプリ開発に必要なスキル（AIエンジニアを目指す方向け）
筆者紹介（ニコラ）
東京大学で機械学習の研究を行い、その後AIスタートアップの設立やコンサルタントとして活動してきました。現在は、生成AIの活用を広めるため、省庁向けの提案や、高校の教師向け研修などを行っています。AIエンジニアとしての知識とビジネス視点を融合させ、生成AIを活用するための具体的な道筋を提供します。

それでは、学習ロードマップを見ていきましょう！

1. 超基礎編：生成AIの魅力とAIの歴史を知ろう
生成AIの勉強を始める際にまず重要なのは、AIの基礎知識と生成AIの特徴を理解することです。

なぜ今生成AIを学ぶべきか？
生成AIの登場により、世の中は急速に変化しています。例えば、ChatGPTを利用することで、業務の効率化やコミュニケーション能力の向上などが期待されています。

AIの歴史を学ぼう
AIは一朝一夕で生まれたものではありません。これまでのAIの発展を知ることで、生成AIがどのように生まれたのか、そして今後どのように進化するのかを理解できます。例えば、生成AIが登場する前に行われた「機械学習」の進展やAIブームの歴史を知ることが、今後の学びをより深くしてくれます。

実際にツールを使ってみよう
生成AIを学ぶ最良の方法は、実際にツールを使ってみることです。たとえば、ChatGPTを使って質問したり、プログラミングの補助をしてもらったりすることで、AIの実力を体感できます。

2. 基礎編：生成AIツールの活用方法を学ぼう
基礎編では、生成AIツールを実務で活用するためのスキルを習得します。プロンプト（指示文）の作成や、AIツールをビジネスにどう活かすかを学びます。

生成AI活用事例
生成AIはすでに多くの業界で活用されています。例えば、Microsoftの生成AI活用事例を学ぶことで、エクセルの自動処理や会議の議事録整理など、実務での応用が見えてきます。

ChatGPTを使いこなす
「超基礎編」でChatGPTを触ってみた方もいるでしょうが、ここではさらにその活用方法を深め、目的に応じて最適な指示を出すためのプロンプトテクニックを学びます。

3. 実践編：生成AIの実務活用
実際の業務で生成AIをどのように活用するかを学びます。効率化やアイデア創出のために、どのツールをどのように使うかのヒントを提供します。

AIに関する仕事を探す: https://job.skysolution.com/category/career/
「“Docker”は壊れているため開けません。」と言われた時の対処。

TL;DR
--

このアラートは、ブラウザからダウンロードされたアプリケーションに対するセキュリティアラートであるようです。
なので、アプリケーションの各ファイルに付与されているブラウザからダウンロードされたというメタ情報を削除することでこのセキュリティを回避できます。

```zsh
sudo xattr -rd com.apple.quarantine /Applications/Docker.app
```
[Terraform]Failed to load plugin schemas対応

# 概要

Terraformでplanを実行したときに以下エラーが発生しました。

```log
│ Error: Backend configuration changed
│ 
│ A change in the backend configuration has been detected, which may require migrating existing state.
│ 
│ If you wish to attempt automatic migration of the state, use "terraform init -migrate-state".
│ If you wish to store the current configuration with no changes to the state, use "terraform init -reconfigure".
```

エラーメッセージにあるとおりreconfigureすればいいのかなと思いreconfigureを実行

```hcl
terraform -chdir=environments/staging init -reconfigure
Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing modules...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Installing hashicorp/aws v5.82.2...
- Installed hashicorp/aws v5.82.2 (signed by HashiCorp)
Terraform has made some changes to the provider dependency selections recorded
in the .terraform.lock.hcl file. Review those changes and commit them to your
version control system if they represent changes you intended to make.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

再度planを実行したところ別のエラーになりました。

- エラー内容

```log
│ Error: Failed to load plugin schemas
│ 
│ Error while loading schemas for plugin components: Failed to obtain provider schema: Could not load the schema for provider registry.terraform.io/hashicorp/aws: failed to instantiate provider "registry.terraform.io/hashicorp/aws" to obtain schema:
│ Unrecognized remote plugin message: 
│ Failed to read any lines from plugin's stdout
│ This usually means
│   the plugin was not compiled for this architecture,
│   the plugin is missing dynamic-link libraries necessary to run,
│   the plugin is not executable by this process due to file permissions, or
│   the plugin failed to negotiate the initial go-plugin protocol handshake
│ 
│ Additional notes about plugin:
│   Path: .terraform/providers/registry.terraform.io/hashicorp/aws/5.82.2/darwin_arm64/terraform-provider-aws_v5.82.2_x5
│   Mode: -rwxr-xr-x
│   Owner: 501 [username] (current: 501 [username])
│   Group: 20 [staff] (current: 20 [staff])
│   MachO architecture: CpuArm64 (current architecture: arm64)
```

## 原因

わからない。。
terrafrom.lock.hclで指定されているバージョンを変更しても
状況変わらずでした。

## 対処方法

これで合っているかわからないですが、
`~/.terraform.d/plugin-cache/registry.terraform.io/hashicorp/aws`配下にある
該当のバージョンを削除し再度initすると成功するようになりました。
何かのときにすっと出したい、プログラミングに関する法則・原則一覧

エンジニア組織を強くするための本を出版しました。
Qiitaでエンジニアリングに関する様々なコミュニケーションの問題やその解決策について書いてきました。そのエッセンスをこの度書籍として出版しました。

エンジニアリング組織論への招待
～不確実性に向き合う思考と組織のリファクタリング

この書籍では、エンジニアリングを「不確実性を削減する」という第一原理で捉え直し、様々なエンジニアリングやその間のコミュニケーションに関連する現象を説明しています。

デメテルの法則
別名「最小知識の法則」。デメテルは豊穣の女神で、アスペクト指向などの研究であった「デメテルプロジェクト」に由来。
基本的な考え方は、オブジェクトが自分以外（サブコンポーネントを含む）の構造やプロパティに対して持つ仮定を最小限にするべきだという点です。

簡単に言うと、オブジェクトの「メンバーのプロパティやメソッド」を直接操作しないようにするということです。

js
Sao chép mã
// デメテルの法則に違反している
console.log(aStudent.class.grade)

// デメテルの法則に違反していない
console.log(aStudent.getGrade())
この法則は、サブコンポーネントに関する知識を持たずに実装することを推奨します。

ヴィルトの法則
「ソフトウェアは、ハードウェアが高速化するより急速に低速化する」という経験則。
計算資源が豊富になると、フレームワークなどが進化し、ハードウェアが進歩してもソフトウェアの速度はあまり変わらないという現象が見られます。

ブルックスの法則
「遅れているソフトウェアプロジェクトに要員を追加すると、プロジェクトがさらに遅れる」という経験則。
この背景としては、「プロジェクトへの習熟に時間がかかる」や「コミュニケーションコストの増大」などが挙げられます。

参加する https://cto.skysolution.com/our-team/

コンウェイの法則
「システムを設計する組織は、その組織のコミュニケーション構造を反映した設計を生み出す」という原則。
組織構造がバグの再現率に寄与するという研究結果もあります。

ホフスタッターの法則
「いつでも予測以上の時間がかかるものである — ホフスタッターの法則を計算に入れても。」
予測において、自己言及的な見積もりに関する法則です。

驚き最小の原則
インタフェースにおいて、矛盾や不明瞭な点があるとき、最も自然に思える動作（驚きが少ないもの）を選ぶべきだという考え方。

ボーイスカウトの規則
ボーイスカウトが来る前よりも帰った後の方が山をきれいにするという規則に由来し、ソフトウェア開発においては「モジュールをチェックインする際には、必ずチェックアウト時よりも美しくする」といった意味です。

YAGNI
"You ain't gonna need it"（必要にならないよ）という意味。XPにおける格言で、必要になるまで実装しないという考え方です。

DRY
"Don't Repeat Yourself"（繰り返しを避けよ）という意味。
システム内の変更が、論理的に関連のない他の部分に影響しないようにすることを目指します。

KISS
"Keep it simple, stupid"（シンプルにしろ）という意味。
シンプルさが重要で、余計な複雑さを避けるべきという原則です。

SOLID
オブジェクト指向設計の原則をまとめた言葉です。

頭文字	略語	コンセプト
S	SRP	Single Responsibility Principle（単一責務の原則）
「クラスを変更する理由は一つでなければならない」
O	OCP	Open/Closed Principle（開放閉鎖の原則）
「クラスは拡張に対して開き、修正に対して閉じていなければならない」
L	LSP	Liskov Substitution Principle（リスコフの置換原則）
「派生型はその基本型と置換可能でなければならない」
I	ISP	Interface Segregation Principle（インターフェース分離の原則）
「クライアントが利用しないメソッドへの依存を強制してはならない」
D	DIP	Dependency Inversion Principle（依存性逆転の原則）
「上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである。」
UUIDv7対応gen_random_uuidつくってみた

以前書いた記事でPostgreSQLでULID likeなUUIDを生成する関数を作成した。似たような生成を行うことができるUUID v7がいつの間にか定義されたのでPostgreSQLのファンクションを作成してみた。

https://qiita.com/soultoru/items/78a688e5b47d5e143858


```sql
  1 create OR REPLACE function gen_uuid_v7() returns uuid as $$
  2 select substring(
  3   (
  4     substring(
  5       decode(
  6         to_hex(
  7           -- b'0100000000000000000000000000000000000000000000000000000000000000'::bigint -- to_hexしたときに上位桁が0だと破棄される。必要な桁まで削除されてしまうのを防ぐ。
  8           int8'4611686018427387904' + (
  9             (
 10               extract(epoch from now()) -- create epoch time
 11               * 1000 -- ミリ秒化_
 12             )::bigint::bit(64) -- マイクロ秒を切り捨て
 13             & int8'281474976710655'::bit(64) -- 下位48bitのみを残すため。10889年まで枯渇しないので、今のところなくても良い
 14           )::bigint
 15         )
 16         , 'hex') -- byteaで扱う
 17       , 3) -- 上位16bitを削除
 18     -- decode(to_hex(('101010101111111100000000'::bit(24))::bigint), 'hex') AS bytea_result;
 19 
 20     -- randomの32bitの生成とversion/variantの追加
 21     || decode(to_hex(((('x' || encode(gen_random_bytes(4),'hex'))::bit(32) | '01110000000000001000000000000000'::bit(32)) & '01111111111111111011111111111111'::bit(32))::bigint), 'hex')
 22     -- randomの下位48bitの生成
 23     || gen_random_bytes(6)
 24   )::text
 25   , 3)::uuid; -- bytea -> textしたときの\xを削除しuuidにキャスト
 26 $$ language sql;
 27 
 28 \timing
 29 SELECT count(*) FROM (SELECT gen_uuid_v7() from generate_series(1, 100000)) t;
 30 SELECT count(*) FROM (SELECT gen_random_uuid() from generate_series(1, 100000)) t;
 31 SELECT count(*) FROM (SELECT gen_random_bytes(16) from generate_series(1, 100000)) t;
```

この関数はちょっと遅い。

またPostgreSQL Conference 2025のLTにあったとおり、次期バージョンでUUIDv7を生成する関数が入るらしい。
M1 Macにhomebrewを再インストールする

M1 Macで誤ってIntel Mac用のhomebrewをインストールしていたことに気づいたので、M1 Mac用のhomebrewをあらためてインストールした。
# 目次
1. 実施環境
1. 発生した問題
1. 解決策

# 実施環境
- 端末: MacBook Air M1, 2020
- OS: Sequoia 15.0.1
- 通信環境: UQ WiMax
- Ruby: 3.3.6

# 発生した問題
rbenvでRuby 3.3.6をインストールしようとした際にエラーが出た。
```
$ rbenv install 3.3.6
...
ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
-> ./configure "--prefix=$HOME/.rbenv/versions/3.0.1" --with-openssl-dir=/opt/homebrew/opt/openssl@1.1 --enable-shared --with-readline-dir=/opt/homebrew/opt/readline --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-ext=openssl,psych,+

BUILD FAILED (macOS 15.0 on arm64 using ruby-build 20240221)
```
# 解決策
調べたら下記のブログの状況（Intel Mac用のhomebrewをインストールしていた）が当てはまっていそうだった。

https://zenn.dev/nenenemo/articles/ccf95cafcd3d19

ブログの内容にしたがって下記を実施した。

## インストールされているhomebrewがIntel Mac用かApple Silicon用か確認
```
brew --prefix
```
```/opt/homebrew``` ならApple Silicon用。
```/usr/local``` ならIntel Mac用。
→ ```/usr/local``` だったので Intel Mac用がインストールされていることが判明。

## 使用しているhomebrewがIntel Mac用かApple Silicon用か確認
```
which brew
```
```/usr/local/bin/brew```ならIntel Mac用。
```/opt/homebrew/bin/brew```ならApple Silicon用。
→ ```/usr/local/bin/brew``` だったので Intel Mac用を使用していることが判明。

## 現在のシステムのアーキテクチャを確認
```
uname -m
```
```x86_64```ならIntelプロセッサ。
```arm64```ならM1チップ（Apple Silicon用）。
→ ```arm64```だったのでアーキテクチャはM1チップであることがわかった。

## 現在インストールされているパッケージをバックアップ
下記のコマンドで、インストールされているパッケージが~/.Brewfileに書き出される。
```
brew bundle dump --global
```
ホームディレクトリに.Brewfileができていることを確認。
```
ls ~/.Brewfile
```

## Intel Mac用のhomebrewをアンインストール

下記コマンドでアンインストールし
```
export PATH=/usr/local/bin:${PATH}
brew uninstall $(brew list)
```

アンインストールできたか確認。
```
brew list
```
何も表示されなければOK。

## Apple Silicon用のhomebrewをインストール
下記コマンドでhomebrewをインストール。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストールできたか確認。
```
brew --prefix
```
```/opt/homebrew```と表示されればOK。

## パスを通す
```~/.zshrc```に下記を追記。
```
export PATH="/opt/homebrew/bin:$PATH"
```

## バックアップしたパッケージリストからパッケージをインストール
```
brew bundle --global
```
先ほど書き出した```~/.Brewfile```にリストされているパッケージが順次インストールされる。

以上でApple Silicon用homebrewがインストールできた。
この後再度rbenvでRuby 3.3.6のインストールを行ったところ、無事に成功した。
API（BigDecimalクラス）の活用

```java:Ex1_15_1
import java.math.BigDecimal;
import java.math.RoundingMode;

class Ex1_15_1{
	public static void main (String[] args) {
		
		//(1) 0.2 * 83 - 10.6
		BigDecimal b1 = new BigDecimal( "0.2" );
		BigDecimal b2 = new BigDecimal( "83" );
		BigDecimal b3 = new BigDecimal( "10.6" );
		
		BigDecimal result1 = ( b1.multiply( b2 ) ).subtract(b3);
		System.out.println(result1);
		
		//(2) 0.2 * 83 - 10.6 / 3　※小数第4位までで表示（小数第5位以下は四捨五入）
		
		BigDecimal b4 = new BigDecimal( "3" );
		BigDecimal result2 = ( b1.multiply( b2 ) ).subtract( b3.divide( b4, 4, RoundingMode.HALF_UP));
		System.out.println(result2);
		
	}
}
```

今回は、API（BigDecimalクラス）を使用した計算を行った。厳密な小数の計算をする際に特殊な処理が必要になるためBigDecimalを使用する。

～～～BigDecimalを使うにあたって～～～
・classの前にimport文でBigDecimalを使えるようにする。
・BigDecimalで数字を定義するときに””を付ける。
└10進数の数字は2進数に変換するときに表現できない数字があるため。文字列として扱うことで、10進数の世界で数値化する機能がBigDecimalに備わっている。
・四則演算用のメソッドは以下を使う
```java:四則演算
足し算：add()
引き算：subtract()
掛け算：multiply()
割り算：divide()
```
・丸め処理の方法（import文にRoundingModeを記載）
```java:丸め処理
四捨五入：RoundingMode.HALF_UP
切り上げ：RoundingMode.UP
切り捨て：RoundingMode.DOWN
```
エンジニア必見！生産性向上に役立つツール8選

はじめに
私が実際に使って、生産性が劇的に向上したツールを厳選しました。エンジニアとして日々の業務に役立つアイテムを集めましたので、ぜひ参考にしてみてください。

1. Biscuit
公式サイト → Biscuit

複数のアプリを効率的に整理できるツール。Chromeのタブが大量になってしまうことの多いエンジニアには、アプリをまとめることで作業が捗ります。簡単にインポート・エクスポートができ、別のPCへの移行もスムーズです。

2. Notion
公式サイト → Notion

メモやタスク管理を超えて、Wikiやデータベースも作成可能な万能ツール。軽量でマルチデバイス対応、使いこなすことで生産性が格段に上がります。個人的には、映画レビューや議事録作成にも使っています。

3. Feedly
公式サイト → Feedly

RSSリーダーとして、最新のテクノロジーや業界のニュースを効率よく集めることができます。全ての記事をチェックするのではなく、必要な情報だけを選んで素早くインプットできます。

4. Alfred
公式サイト → Alfred

Spotlightの強化版。アプリ検索やChromeのブックマーク検索が速く、ディレクトリ内が乱雑でもAlfredがしっかりサポートしてくれます。高速で必要な情報にアクセスでき、作業がスムーズに進みます。

5. Gyazo
公式サイト → Gyazo

スクリーンショットやGIFを瞬時にキャプチャして共有できるツール。PC標準のスクリーンショット機能よりも遥かに速く、オンラインでのコミュニケーションが一層分かりやすくなります。

6. DeepL
公式サイト → DeepL

翻訳ツールの新しい選択肢。Google翻訳よりも自然な翻訳が可能で、コピー＆ペーストの煩わしさをなくすためにショートカットを使って迅速に翻訳できます。

7. iTerm2
公式サイト → iTerm2

エンジニアにとって必須のターミナル。画面上に半透明で表示でき、エディタやブラウザの上に重ねて使えるため、ターミナルを開くのが簡単になります。カスタマイズ性が高く、作業をより快適にしてくれます。

8. Snap Camera
公式サイト → Snap Camera

オンラインミーティングでのコミュニケーションを楽しくするツール。Zoomなどで簡単に使用でき、面白いエフェクトや肌の調整機能があり、顔を簡単に美しく見せることができます。

まとめ
最後までご覧いただきありがとうございます。すべてのツールを一度に導入するのは大変かもしれませんので、必要な時に必要なものを選んで使ってみてください。この情報が少しでも役に立てば嬉しいです！

また、皆さんのおすすめのツールがあればコメントで教えてくださいね！

こちらも読んでください: https://ceo.skysolution.com/ai/transactional-leadership/