OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】比較演算子について

## 比較演算子一覧

| 演算子 | 例       | 意味               |
|--------|------------|--------------------|
| `==`   | `a == b`   | aとbが等しい       |
| `!=`   | `a != b`   | aとbが等しくない   |
| `>`    | `a > b`    | aはbより大きい     |
| `>=`   | `a >= b`   | aはb以上           |
| `<`    | `a < b`    | aはbより小さい     |
| `<=`   | `a <= b`   | aはb以下           |
| `<=>`  | `a <=> b`  | aとbの比較結果を返す |

## 各演算子の詳細

### `==` (等しい)

`==` 演算子は、2つの値が等しいかどうかを比較します。等しい場合は `true` を返し、そうでない場合は `false` を返します。

```ruby
a = 5
b = 5
puts a == b  # => true
```

### `!=` (等しくない)

`!=` 演算子は、2つの値が等しくないかどうかを比較します。等しくない場合は `true` を返し、等しい場合は `false` を返します。

```ruby
a = 5
b = 3
puts a != b  # => true
```

### `>` (より大きい)

`>` 演算子は、左側の値が右側の値より大きいかどうかを比較します。大きい場合は `true` を返します。

```ruby
a = 5
b = 3
puts a > b   # => true
```

### `>=` (以上)

`>=` 演算子は、左側の値が右側の値以上かどうかを比較します。以上の場合は `true` を返します。

```ruby
a = 5
b = 5
puts a >= b  # => true
```

### `<` (より小さい)

`<` 演算子は、左側の値が右側の値より小さいかどうかを比較します。小さい場合は `true` を返します。

```ruby
a = 3
b = 5
puts a < b   # => true
```

### `<=` (以下)

`<=` 演算子は、左側の値が右側の値以下かどうかを比較します。以下の場合は `true` を返します。

```ruby
a = 5
b = 5
puts a <= b  # => true
```

### `<=>` (宇宙船演算子)

`<=>` 演算子は、2つの値を比較し、以下のような結果を返します：
- 左側の値が右側の値より小さい場合は `-1`
- 左側の値が右側の値と等しい場合は `0`
- 左側の値が右側の値より大きい場合は `1`
- 比較できない場合は `nil`

```ruby
a = 5
b = 3
puts a <=> b  # => 1

a = 5
b = 5
puts a <=> b  # => 0

a = 3
b = 5
puts a <=> b  # => -1

a = 3
b = '5'
puts a <=> b  # => nil
```
【Flutter】 iPhoneに対して無料通知したい(Webhookでこじつけ)

# 先に結論
  __「DiscordにWebhookでメッセージを送る」__ ことで無料通知機能を実現させました。  
  すみません、言いたいことは以上です。


# 背景

自作Flutterアプリを友人と使う際に、特定のメッセージを通知できるようにしたかったのですが、友人がiPhoneであることで悩みができました

iOSに通知機能を実装するには「Apple Developer Programに入る必要がある」ということ。  

入るにはお金がかかる...  
まだAndroid中心で開発していて、iOS開発は現状メインターゲットでないし...と悩みました。

そこで「通知機能のあるアプリを代用しちゃえばいいんじゃないか」と思い立ち、Discordを使って通知をしようとした　というお話です。

# Webhookを使って通知を代用してもらう

今回は「簡易的にボタンを押したらDiscordの専用チャネルに通知を送る」アプリを作ってみます。


## Discordサーバに通知用チャネルを作成

今回は「通知」チャネルを用意。
![スクリーンショット 2024-09-30 20.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309969/9c0fb4ce-22d1-1c28-ad45-1522ca5de2f4.png)

## チャネル設定からWebhookを作成

歯車マークをクリック後、連携サービスを選択。

![スクリーンショット 2024-09-30 20.30.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309969/df2bb035-988f-b820-91ee-c6d796d248ba.png)

「ウェブフックを作成」をクリックするとWebhookが作られる。

![スクリーンショット 2024-09-30 20.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309969/ff058940-97a5-f24d-c197-e04049bb44e7.png)

これでWebhookは準備完了。  
「ウェブフックURLをコピー」してURLをアプリに搭載となります。

## FlutterアプリにWebhook送信関数を作成



Webhookのためにパッケージを追加。
+ http

Webhook送信関数として以下を作成。  

```dart
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<void> send(String user, String text) async {
    final Uri url = Uri.parse(
        "[ここに作ったWebhookのURLを貼り付け]");
    Map<String, String> headers = {
      'content-type': 'application/json',
    };
    Map<String, String> postData = {"username": user, "content": text};
    String body = jsonEncode(postData);
    http.Response response = await http.post(url, headers: headers, body: body);
  }

```

Discordとしては「username」と「content」でメッセージは構成されるみたいです。  
この時、先ほど作成したウェブフックのURLを貼り付けておく。

## 通知ボタンを作成

ボタンを作って先ほどの関数を呼ぶようにします。 　　
今回は簡単に作りたいので、固定文字列でusernameとcontentを指定します。

```dart
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: TextButton(
          onPressed: () => send("メッセンジャー", "無料で通知！"),
          style: TextButton.styleFrom(
            foregroundColor: Colors.orange[900],
          ),
          child: const Text(
            "通知",
          ),
        ),
      ),
    );
  }
```

これで準備できました。(すごい簡素ですけど...)

![スクリーンショット 2024-09-30 21.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309969/d16b731f-692c-acb3-ead2-6920222b2aa9.png)



## iOS(Discord)への通知を見てみる

iPhoneにDircordアプリを入れて、通知ボタンを押してみると...

![スクリーンショット 2024-09-30 23.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309969/df5b2c87-67c5-ec45-2a75-3c46955fd485.png)

できました！


# メリット・デメリット

+ メリット
    + 無料で通知できる
    + 通知部分の処理を用意する必要がない(Webhookはそこそこ実装気楽)

+ デメリット
    + 代用アプリに完全に依存する
        + 代用アプリの仕様に影響を受ける
        + フォーマットはアプリ任せだし、アプリが使えなくなるかもしれない
    + 代用アプリを該当デバイスに入れてもらう必要がある

# 最後に

特定の個人にのみ配布するのであればアリな方法かなと個人的には考えてます。(動けばいいや精神)  

もし「無料で出来る限りやりたい」とお考えの方がいれば。このような方法も候補の1つとお考えいただければと。
OSIモデルレイヤーの説明


# OSIモデルレイヤーの説明

OSI（Open Systems Interconnection）モデルは、ネットワーク通信を7つの異なる層（レイヤー）に分けて、通信の仕組みを階層的に説明したものです。各レイヤーの役割や使用する機器、具体例、重要用語を詳しく説明します。

## 1. アプリケーション層 (Application Layer)
- **役割**: ユーザーとネットワーク間の直接的なインターフェースを提供し、アプリケーションがネットワークサービスを利用できるようにします。プロトコルにはHTTP、FTP、SMTPなどが含まれます。
- **具体例**: ウェブブラウザがサーバーにHTTPリクエストを送り、サーバーがレスポンスを返す。電子メールクライアントがSMTPを使用してメールを送信します。
- **使用する機器**: コンピュータ、スマートフォン、サーバー。
- **重要用語**: HTTP（HyperText Transfer Protocol）、FTP（File Transfer Protocol）、SMTP（Simple Mail Transfer Protocol）。

## 2. プレゼンテーション層 (Presentation Layer)
- **役割**: データの形式やエンコーディング、暗号化、圧縮を担当し、異なるデータ形式間の変換を行います。データのセキュリティやデータ構造の変換もこの層で行われます。
- **具体例**: SSL/TLSプロトコルを使用してデータを暗号化し、ウェブブラウザとサーバー間の通信を保護します。
- **使用する機器**: 暗号化/復号を行うサーバーやデバイス。
- **重要用語**: SSL（Secure Sockets Layer）、TLS（Transport Layer Security）、データ暗号化、文字コード変換。

## 3. セッション層 (Session Layer)
- **役割**: 通信セッションの確立、管理、終了を行います。通信の途中でセッションが中断された場合に再開する機能も含まれます。
- **具体例**: クライアントとサーバーが通信セッションを確立し、一定時間の非アクティブ後にセッションがタイムアウトする。
- **使用する機器**: コンピュータ、サーバー、ネットワーク機器。
- **重要用語**: セッション確立、セッション再開、タイムアウト、ソケット通信。

## 4. トランスポート層 (Transport Layer)
- **役割**: データの送受信の信頼性を確保し、エンドツーエンドの通信を管理します。データをセグメントに分割し、誤り検出や再送なども行います。主なプロトコルにはTCPとUDPがあります。
- **具体例**: TCPがデータの信頼性を確保し、データが正しい順序で受信されるようにします。UDPはリアルタイムのビデオストリーミングなどで使用されます。
- **使用する機器**: ルーター、ファイアウォール。
- **重要用語**: TCP（Transmission Control Protocol）、UDP（User Datagram Protocol）、フロー制御、パケット再送。

## 5. ネットワーク層 (Network Layer)
- **役割**: パケットの送信経路を決定し、異なるネットワーク間でデータを転送します。IPアドレスを使って送信元と送信先を特定します。
- **具体例**: ルーターがIPパケットを適切な宛先にルーティングします。
- **使用する機器**: ルーター、スイッチ。
- **重要用語**: IPアドレス（Internet Protocol Address）、ルーティング、ICMP（Internet Control Message Protocol）、IPsec（Internet Protocol Security）。

## 6. データリンク層 (Data Link Layer)
- **役割**: 隣接するネットワークデバイス間でフレームを転送します。物理層のエラー検出や修正を行うこともあります。イーサネットやWi-Fiなどが使用されます。
- **具体例**: イーサネットを使用して、データフレームが送信され、MACアドレスを使って宛先のデバイスを特定します。
- **使用する機器**: スイッチ、ネットワークカード（NIC）、アクセスポイント。
- **重要用語**: MACアドレス（Media Access Control Address）、イーサネット、Wi-Fi、フレーム転送。

## 7. 物理層 (Physical Layer)
- **役割**: 実際のデータの物理的な伝送を行います。電気信号や光信号を介してビット単位でデータを転送します。
- **具体例**: 光ファイバーや銅線ケーブルを使って、デジタル信号が物理的に送受信されます。
- **使用する機器**: 光ファイバーケーブル、イーサネットケーブル、ハブ、リピーター。
- **重要用語**: 光ファイバー、電気信号、ビット転送、物理メディア。
なぜDockerではなくKubernetesを使うのかー

なんでわざわざdockerじゃなくてkubertnetesを使うのか？
その１。障害が起きた時に設定直したり復旧したりするのが便利だから。ReconciliationLoopってやつがあって、望ましい状態desire conditionを作っておけば自動的にそれにしてくれる機能があるらしい。
その２。コンテナの仕様を個々に管理するのが大変だから。KubernetesならYAMLファイル（マニフェスト）を使ってインフラの設定を書くと設定をコード化できるんだって。
その３。複数サーバある時にどれ使ってコンテナ起動するか管理するのめんどくさいいいうねん。けどkubernetesにはAPIでインフラ設定があるからOS設定とか書かなくていいんだって

kuberctl -> control plane <- woker node
kubernetesアーキテクチャって上のような構造になっているらしい。ここで重要なのがcpはwnに指示を出さないってところ。これのおかげでcpがぶっ壊れてもwnの中にあるコンテナは壊れないんだって。

クラスタ上にアプリケーションを動作させる。
うえで必要なのがpodをつくること。podとは？コンテナを起動するための最小構成リソース。podは複数コンテナをまとめて起動できるから起動、リリースのタイミングを合わせたいとかの時に同じpodにしたりする。
リソースを作成する場所をnameplaceって言ったり言わなかったり

以下適当
kubectl get pod --nameplace default
kubectl get pod --output wide --nameplace default
kubectl get pod <?> --v=?
kubectl describe pod <?>
kubectl logs <?>
kubectl get pod --selector <?>=<??>


デバッグ用のサイドカーコンテナを立ち上げる。
kubectl debug

kubectl debug --stdin --tty --- --image=curlimages/curl:9999 --target=hello-server --nameplace default -- sh
デバッグ対象のpodと同じネットワーク、同じボリュームをそれぞれローカルで参照できる。ローカルで接続可能か確認するていうことができる。
kubctl run kontenawo sokuzani jikkou
kubectl exec --stdin --tty <> -- ???
ログイン用のpodを作ってログインしてcurlを叩いて疎通確認ができる。
IPアドレスだけでアクセスできるか確認することができる
kubectl port-forward <?> 1234:9999
「npm i」と「npm ci」の違いについて簡単にまとめ

# はじめに
Node.jsの世界で開発をしていると、避けて通れないのがnpm（Node Package Manager）です。npmは、JavaScriptのパッケージ管理ツールとして広く使われており、プロジェクトの依存関係を管理する上で欠かせない存在です。
特に`npm install`コマンドは、エンジニアであれば馴染み深いコマンドかと思います。
今回は`npm install`(npm i)コマンドと似ている`npm ci`コマンドについて記事にしました。

# `npm i`とは
`npm i`は`npm install`の略称で、Node.jsプロジェクトの依存関係をインストールするためのコマンドです。
`npm i`は、`npm install`の略称として機能します。
また、`npm i <パッケージ名>`のように特定のパッケージをインストールすることも可能です。
```
$ npm i
```
コマンド実行をすると、`package.json`ファイルを読み込み、必要なパッケージを`node_modules`ディレクトリにインストールします。

# `npm ci`とは
`npm ci`は`npm clean-install`の略で、こちらも同じくNode.jsプロジェクトの依存関係をインストールするためのコマンドです。
```
$ npm ci
```
こちらはnpm version 5.7.0で導入され、プロジェクトの依存関係をより厳密に管理するために誕生したそうです。
また、`npm ci`は通常、`npm i`よりも高速に動作します。

# `npm i`と`npm ci`の違いは？
`npm i`は`package.json`の内容に基づいて依存関係を解決するのに対し、
`npm ci`は、`package-lock.json`に厳密に従います。
つまり`npm ci`は、開発環境間での一貫性を保つのに役立つコマンドとなります。

特に、実務やチーム開発の場面では`npm ci`は重宝します。
`npm ci`は`package-lock.json`を厳密に遵守するため、全てのチームメンバーが同一の依存関係バージョンを使用することを保証します。
また、`package.json`と`package-lock.json`の一致を要求するため、意図しないバージョンアップによる競合を防ぐことができます。
そのため、「自分の環境では動くのに、他の人の環境では動かない」といった問題を大幅に削減することができます。
不一致が発生した場合にエラーを吐いてくれるのも大きいですね。
```
npm ERR! The package-lock.json file was created with an old version of npm,
npm ERR! so supplemental metadata must be fetched from the registry.
npm ERR! 
npm ERR! sha512-mismatch for https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz
npm ERR! Fetched package: sha512-3Uh8m0vGmTPIUiSiP2pPZOzXc+KSfkTB3GUEWAzwX5VcPCXXrA8Ung2KAmQkVJ53ZrWVPuPkPR1YKPzrHNZdA==
npm ERR! Manifest: sha512-1/AbfjdKhHUd5ZQ7YRWKZ2rCRYWtm7EGZFn3Pk3h7OXS7Q3TuGKfnC/V9N5OCt6M0z28Pzp2Oj7NGEWj8QwLg==
```

# `npm ci`のデメリットは？
より厳密にインストールを行う為、柔軟性の欠如や、開発中の依存関係管理の難しさなどが挙げられるかと思います。
個人開発のシーンでは使用する機会は少ないかと思います。
また、`npm ci`は個別のパッケージをインストールすることはできません。（常にプロジェクト全体をインストールします。）


# まとめ
今回は類似コマンドの`npm i`と`npm ci`について簡単にまとめました。
もしnpmの依存関係でエラーが発生した際には、ぜひ`npm ci`を試してみてはいかがでしょうか。
モダンJavaScript入門メモ

初投稿です。
以下Udemy講座用のメモ書きとして残します。

###### モダンJavaScriptの基礎から始める挫折しないためのReact入門

https://www.udemy.com/course/modern_javascipt_react_beginner/?couponCode=24T4MT92724B

## セクション3 ReactやVue等を使うために知っておきたいJavaScriptの基本
### 1. DOMとは。
* HTMLを木構造で解釈したものであり、HTMLと同じ意味である。
* 従来のDOM操作として、以下のように素のDOMに対して直接操作していた
```js
$('ul > li:first-child').remove();
```

### 2. 仮想DOMとは
* JavaScriptのオブジェクトで仮想的に作られたDOM
    * JS上で仮想DOMの操作により差分を出し、変更部分のみDOMへ反映する
* 変更差分が出せるようになったため、レンダリングの複雑さが楽になりパフォーマンスが向上した。

### 3. yarnやnpm等のライブラリマネージャーについて
* 従来のJavaScriptは1ファイルに処理を書いたり、ライブラリとして読み込んでいた。
* yarnやnpm等は内部でNode.jsが作動することにより、従来のJavaScriptで難しかった依存関係や共有方法などが改善された。
    * npmコマンドにてライブラリをダウンロードすると、package.jsonを元にpackage-lock.json(or yarn.lock)というファイルが自動生成され、node_modulesというライブラリの実態が展開される。
    * node_modulesはライブラリ自体の要素となるためサイズが膨大であり、こちらはGitHubには上げない。
* __package.jsonがあれば、どの端末でnpmダウンロードしても同じnode_modulesが展開される仕様。__

### 4. モジュールバンドラーとは
* 複数のJS(css/image)ファイルを１つに纏めるためのもの
    * webpackやViteが該当する。
### 5. トランスパイラとは
* 新しいJavaScriptの記法を古い記法へ変換してくれる。古いブラウザに対応できる。
    * BABELやSWCが該当する。

### 6. SPAとは
* Single Page Application
* モダンJavaScriptはSPAが基本で、HTML１つのみでJSにより画面を書き換える。
* 画面遷移の待ち時間がなくなり、通信量も一部だけとなる為全体的に表示改善が行われる。

---
セクション3はここまでです。場合によっては再編集などを行います。
記事に問題があれば、取り下げ・編集を行いますのでコメントいただければと思います。

今後も勉強になった事があれば記事として残していこうと思います。
IBM Envizi ESG Suite チュートリアル No.2-1：グループ/ロケーション/アカウントを作成し、UIを使用してEnviziにデータをロードする

# グループ/ロケーション/アカウントを作成し、UIを使用してEnviziにデータをロード


この実習では、グループ／ロケーション／アカウントを作成し、UIを使用してEnviziにデータをロードします。

データのロード方法は、以下のいずれかの方法を選択できます。

## 方法①
以下の"デモ商事"のサンプルを使って組織階層を作成します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520117/d48b2874-874b-96b2-77d3-13ce26e962ff.png)

その結果、Envizi上の組織階層は以下のようになります。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520117/824592b3-f7fa-33cb-2f3a-50df0b887d3c.png)


## 方法②
[Envizi チュートリアル No.1](https://qiita.com/soooi/items/21f28cd23809859dddbe) で作成した組織階層を入力したExcelテンプレートを使用できます。
ExcelファイルをPDFに一括変換するマクロの作成と実行【macOS環境】

# ExcelファイルをPDFに一括変換するマクロの作成と実行【macOS環境】

ExcelファイルをPDFに変換する作業は、特に複数シートが含まれている場合、手間がかかります。レイアウト設定や印刷範囲の調整を一つ一つ行うのは時間がかかるため、Excelマクロを使って大量のファイルを一括でPDFに変換する方法を紹介します。


## 動作確認環境

- **OS**: macOS
- **Excelバージョン**: Microsoft Excel for Mac

## Excelマクロの作成

ここではマクロの詳細な作成手順については割愛します。以下のサンプルコードを適宜使用してください。1シートあたり縦横1ページにフィットするようにしています。（このマクロはChatGPTで生成したもので、必要に応じてChatGPTで修正してください）

```vba
Option Explicit

Sub ConvertExcelToPDF()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim rootDir As String
    Dim filePath As String

    ' ファイルパスが含まれるシートを設定
    Set ws = ThisWorkbook.Sheets("excel->pdf")

    ' InputBoxを使用してユーザーからルートディレクトリを取得
    rootDir = InputBox("ルートディレクトリのパスを入力してください:")

    ' ルートディレクトリがバックスラッシュで終わっているか確認
    If Right(rootDir, 1) <> "/" Then
        rootDir = rootDir & "/"
    End If

    ' 列Aでデータのある最後の行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 列Aの各セルをループ処理
    For i = 1 To lastRow
        filePath = Trim(ws.Cells(i, 1).Value)

        ' ファイルパスが存在する場合のみ処理を実行
        If Len(filePath) > 0 Then
            ProcessFile rootDir & filePath
        End If
    Next i

    MsgBox "変換が完了しました！"
End Sub

Sub ProcessFile(ByVal filePath As String)
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim pdfPath As String
    Dim ur As Range

    On Error Resume Next
    Set wb = Workbooks.Open(FileName:=filePath, ReadOnly:=True)
    If Err.Number <> 0 Then
        Debug.Print "ファイルを開く際のエラー: " & filePath
        Err.Clear
        Exit Sub
    End If
    On Error GoTo 0

    ' 各ワークシートの印刷範囲を設定し、1ページに収まるように調整
    For Each ws In wb.Worksheets
        Set ur = ws.UsedRange
        If ur.Cells.Count > 1 Then
            With ws.PageSetup
                .Zoom = False
                .FitToPagesWide = 1
                .FitToPagesTall = 1
            End With
        Else
            ' 使用セルが1つだけの場合は、印刷範囲をクリア
            ws.PageSetup.PrintArea = ""
        End If
    Next ws

    ' Excelファイルと同じフォルダにPDFとして保存
    pdfPath = Replace(wb.FullName, ".xlsx", ".pdf")
    On Error Resume Next
    wb.ExportAsFixedFormat Type:=xlTypePDF, FileName:=pdfPath, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
    If Err.Number <> 0 Then
        Debug.Print "PDFへのエクスポート中のエラー: " & filePath
        Err.Clear
    End If
    On Error GoTo 0

    wb.Close SaveChanges:=False
End Sub
```

# 実行手順
1. 変換したいExcelファイルを任意のディレクトリに置く
PDFに変換したいExcelファイルを1つのフォルダにまとめてください。このフォルダを「ルートディレクトリ」とします。

2. マクロを含むワークブックにシート `excel->pdf` を追加します。列Aに変換したいexcelファイルを列挙します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590551/8b93e636-084f-fcaf-f5cd-67e1057dde91.png)

3. マクロを実行し、ルートディレクトリを指定
マクロを実行すると、次のようなポップアップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590551/600088be-22a4-29e0-be87-501d02f0f452.png)
このポップアップに、先ほどのルートディレクトリのパスを入力してください。

4. PDFファイルが作成される
マクロが実行され、対象のExcelファイルがPDF化され同じフォルダ内にファイルが作成されます。これで作業完了です！
Linux コマンド1


# Linux Command Line Basics

## ファイルとディレクトリの一覧表示
```bash
ls                 # ファイル一覧を表示
ls -l              # 詳細情報付きの長い形式で一覧表示 (権限、所有者、サイズ、日付など)
ls -a              # 隠しファイルも表示 (ドットで始まるファイル)
ls -lh             # サイズを見やすい単位で長い形式で表示
```

## ディレクトリの移動
```bash
cd /path/to/directory    # 指定のディレクトリに移動
cd ..                    # 1つ上のディレクトリに移動
cd ~                     # ホームディレクトリに移動
cd -                     # 前回いたディレクトリに戻る
```

## ディレクトリの作成
```bash
mkdir myFolder           # 新しいディレクトリを作成
mkdir -p dir1/dir2       # 階層的にディレクトリを作成
```

## ファイルとディレクトリのコピー
```bash
cp source.txt destination.txt            # ファイルをコピー
cp -r /source/directory /dest/directory   # ディレクトリを再帰的にコピー
```

## ファイルの移動/名前の変更
```bash
mv old_name.txt new_name.txt   # ファイル名を変更
mv file.txt /path/to/destination   # ファイルを別の場所に移動
```

## ファイルとディレクトリの削除
```bash
rm file.txt               # ファイルを削除
rm -r directory/          # ディレクトリとその中身を削除
rm -rf directory/         # 強制的にディレクトリを削除 (空でない場合も含む)
```

## ファイル内容の表示
```bash
cat file.txt              # ファイル全体を表示
less file.txt             # ファイル内容をスクロールして表示 (上下キーで操作)
head file.txt             # ファイルの先頭10行を表示
tail file.txt             # ファイルの末尾10行を表示
tail -f logfile.log       # ファイルの末尾を継続的に表示 (ログファイルなどに便利)
```

## grepを使ったファイル内検索
```bash
grep "search_term" file.txt               # ファイル内で特定の文字列を検索
grep -r "search_term" /path               # ディレクトリ内のファイルを再帰的に検索
grep -i "search_term" file.txt            # 大文字小文字を区別せずに検索
```

## システム情報の表示
```bash
uname -a              # カーネルバージョンとシステム情報を表示
df -h                 # ファイルシステムのディスク使用量を表示
free -h               # メモリ使用量を表示
top                   # リアルタイムのシステムリソース使用状況を監視
```

## プロセスの管理
```bash
ps aux                # すべての実行中のプロセスを表示
kill [pid]            # プロセスID (PID) を指定してプロセスを終了
kill -9 [pid]         # 強制的にプロセスを終了
killall process_name  # 指定した名前のすべてのプロセスを終了
```

## ファイル権限の変更
```bash
chmod 755 file.txt              # 読み取り、書き込み、実行権限を設定 (所有者: rwx, グループ: r-x, その他: r-x)
chmod u+x script.sh             # 所有者に実行権限を追加
chmod -R 777 /directory          # ディレクトリ内のすべてのファイルにフル権限を再帰的に付与
```

## ファイル所有権の変更
```bash
chown user:group file.txt        # ファイルの所有者とグループを変更
chown -R user:group /dir         # ディレクトリ内のすべてのファイルの所有権を再帰的に変更
```

## ファイルの検索
```bash
find /path -name "file.txt"      # ファイル名で検索
find /path -type f -size +100M   # 100MBを超えるファイルを検索
find /path -mtime -1             # 過去24時間以内に変更されたファイルを検索
```

## ファイルのアーカイブと圧縮
```bash
tar -cvf archive.tar /path       # ディレクトリをtarアーカイブに作成
tar -xvf archive.tar             # tarアーカイブを解凍
tar -czvf archive.tar.gz /path   # gzipで圧縮したtarアーカイブを作成
tar -xzvf archive.tar.gz         # gzipで圧縮されたtarアーカイブを解凍
```

## sudoを使用した管理者権限の利用
```bash
sudo command                     # コマンドをsuperuser/rootとして実行
sudo su                          # rootユーザーに切り替え
```
AtCoder ABC373 振り返り感想戦(緑コーダーがPythonでA〜D問題まで)

## ABC373 感想まとめ

[AtCoder Beginner Contest 373 - AtCoder](https://atcoder.jp/contests/abc373)

Rated参加し、D問題まで4解答でした。パフォーマンス 1098 で、レーティング 775 → 813 (+38)でした。7/13以来、2ヶ月半ぶりの緑色復帰です。

緑色に復帰したので、この振り返りのタイトルも「ほぼ緑コーダーが...」から「緑コーダーが...」に変更しました。

目先のレーティングには一喜一憂しないようにしているとはいえ、自分の名前のところが緑色になるとやはり嬉しくなってしまいます。

----

E問題は解けそうで解けなくて、諦めそうになりつつ時間切れまで考えていました。解説を見ていると思っていたよりも難しく、結局今の実力では及ばないレベルでした。しかし、諦めずに考えたメンタル力が、今後どこかで役に立てばいいなと思っていたりします。


## [A - September](https://atcoder.jp/contests/abc373/tasks/abc373_a)

12行の文字列を読み込み、文字数をチェックします。

9月のSeptemberは9文字だなと、この問題で初めて意識しました。問題作った人はよく気づいたなあ。

``` python
count = 0
for i in range(12):
    S = input()
    if len(S) == i+1:
        count += 1
print(count)
```

## [B - 1D Keyboard](https://atcoder.jp/contests/abc373/tasks/abc373_b)

ABCDEFG...XYZ の配列を用意して、文字列Sの中でABC...の位置を順番に求めました。

``` python
S = list(input())
pos = S.index('A')

alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

answer = 0
for i in range(len(alphabet)):
    # 次に探す文字
    alpha = alphabet[i]

    # Sの中で文字の位置を
    next_pos = S.index(alpha)
    answer += abs(next_pos - pos)
    pos = next_pos
    
print(answer)
```

## [C - Max Ai+Bj](https://atcoder.jp/contests/abc373/tasks/abc373_c)

Pythonでは max(list) でリストの最大値を求められるので、それを利用しています。

C問題としては難易度が低く、difficulty75でした。普段と比べて簡単だったので「何か罠があるのでは...」と考えて、提出前に念入りに確認した人が多かったようです。私もそうでした。


``` python
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

max_a = max(A)
max_b = max(B)

print(max_a + max_b)
```

## [D - Hidden Weights](https://atcoder.jp/contests/abc373/tasks/abc373_d)

「u→vにコスト w で移動できる」
ということは、
「v→uにコスト -w で移動できる」
も成り立つことに気づくと、問題の理解が簡単になった。

頂点 1...N に対して、幅優先探索で行けるところまで行き、コストXを求める...という方針で求めました。
各頂点のコストは0で初期化しております。


``` python
N, M = map(int, input().split())
node = defaultdict(list)
for i in range(M):
    u, v, w = map(int, input().split())
    node[u].append((v, w))
    node[v].append((u, -w)) # マイナス w 払えば、逆方向に行ける

visited = [False] * (N + 1) # 訪れた頂点フラグ
x = [0] * (N + 1) # 各頂点への移動コスト(default=0)

# 頂点 1...N から
for i in range(1, N + 1):
    # すでに訪問済ならスルー
    if visited[i]:
        continue

    # スタート位置 i を訪問済にする
    visited[i] = True

    # 頂点 i から行けるところを幅優先探索
    q = deque([i])
    while q:
        cur = q.popleft()
        for next, w in node[cur]:
            if visited[next]:
                # 訪問済ならスルー
                continue
            else:
                # 行けるところは コストx と visitedフラグ を設定
                x[next] = x[cur] + w
                visited[next] = True
                q.append(next)
print(*x[1:])
```
IBM Envizi ESG Suite チュートリアル No.1：企業固有の組織階層を作成する

# 企業固有の組織階層を作成
[Envizi](https://www.ibm.com/jp-ja/products/envizi)は企業の透明性ある情報開示と脱炭素に向けた取り組みをサポートするESGデータ管理プラットフォームです。組織が環境や社会、ガバナンス（ESG）データの取得と管理を単一のデータ管理システムに自動化し、GHG排出量の計算やサステナビリティーの報告と開示の合理化、脱炭素化の機会の特定と管理を行えるように支援します。


# 1. Excelテンプレートの取得
[Seismic](https://ibm.seismic.com/Link/Content/DCJW7RDR2gTm28cJJPf2R326DggP)から、最新の組織階層サンプルExcelシート "IBM Envizi Setup config template and examples.xlsx" を取得します。


# 2. Excelテンプレートの中身を理解する
企業固有の組織階層をExcelテンプレートの中身に置き換えていきます。


# 3. 組織階層データをExcelテンプレートに入力する
製造、石油・ガス、金融、保険など、様々な業界業種において、同様の組織階層をExcelテンプレートで作成することができます。
【学習メモ】HTML＆CSS

# HTML
- h1 h2 h3,,,
見出し（ブロック要素）
- p 
段落（ブロック要素）
- a
リンク、ボタン（インライン要素）
- img 
画像を指定
- ul, li
リスト（黒点、数字）
子要素（li）にのみCSSを適用することも可能
- utf-8
文字コードの一種
- span
一部分にCSSを適用したいすることができる
- input
type属性を指定可能
valueで表示されるテキストを変更
- textarea
# CSS
- セレクタ（要素名）
- プロパティ（変更項目）
color
font-size
font-family
height
width
list-style
float
padding
border
margin
セレクタ:hover
border-radius
text-align
fonr-weight
- インライン要素
インライン要素はwidthやheightを指定できない
displayプロパティを指定することで、インラインブロック要素に変更することができる
- インラインブロック要素
インライン要素と同様に横に並ぶが、widthやheightを指定することができる
- 要素の中央寄せ
広い要素を囲うブロック要素はmargin:outo;
テキストやボタンのようなインライン要素やインラインブロック要素はtext-align: center;
- アイコン
Font Awesome
- rgba
指定した色だけを透明にすることができる
- transition
アニメーションをつけることができる
- line-height
テキストがブロックの中心に配置できる≒
- display
要素をインラインブロック要素やブロック要素にすることができる
- 
# 検証ツール
検証を開いて左上の矢印アイコンを押すと、簡単にwebページの構成を調べることができる
変更したい部分を右クリックして「Edit as HTML」を押すと編集することができる。HTMLの内容を変更してCntl＋Enterを押すと、ページの表示を変更することができる
これらのHTMLやCSSを試しに変更することで、ページ作成時に簡単に試行錯誤することができる
右クリック禁止とmouseover

## 毎日javascriptを学習します

コピペですが
本日のテーマは、

mouseover
mouseleave
右クリック禁止


```html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>サンプルページ</title>
    <style media="screen">
      #box {
        width: 100px;
        height: 100px;
        background-color: grey;
      }
    </style>
  </head>
  <body>
 
    <div id="box"></div>
 
    <script type="text/javascript">
    
    //右クリック禁止
    document.oncontextmenu = function () {return false;}
    
    const box = document.getElementById('box');

 　　//マウスを載せたらオレンジ色になる
    box.addEventListener('mouseover', function() {
      box.style.backgroundColor = 'orange';
    });

    //マウスを外すとグレーに戻る
     box.addEventListener('mouseleave', function() {
      box.style.backgroundColor = 'grey';
    });
    
    </script>
  </body>
</html>




```
【Docker x MySQL】エラー「chown: changing ownership of '/var/lib/mysql/mysql.sock': No such file or directory」について

# 概要
docker-composeでアプリコンテナ（django）とDBコンテナ（mysql5.7）を利用してローカル環境で動かしているプログラムがありました。

しかし、mysql5.7から8.0に変更する作業の過程で、

「docker-composeでmysql8.0のイメージをビルド・起動してから、再度5.7に戻してビルドすると、エラーになる」

という事象に遭遇。

より詳細にいうと、mysql8.0にした時はちゃんとアプリは動作しています。
ただ、5.7に戻すと以下のmysqlコンテナでエラーになります。

> chown: changing ownership of '/var/lib/mysql/mysql.sock': No such file or directory.

djangoのコンテナでは以下（ただし大事なのは上記mysql側のエラーです）。

> MySQLdb._exceptions.OperationalError: (2005, "Unknown MySQL server host 'xxx' (-2)")

こちらの原因と解決方法を説明します。

# 原因

同様の事象で困っている方がいるらしく、以下のgitにもあがっていました。

https://github.com/docker-library/mysql/issues/939

ただし、上記に書いてある通りに、dockerコンテナにマウントしているホストマシン側の`mysql.sock`を削除して再度起動すると、別のエラーになってしまっていました。

そこでもう少し深掘りすると、どうやらdockerボリュームに問題があるようです。
5.7と8.0で行き来していると、互換性の問題でうまく起動しなくなるらしい。

dockerボリュームを分けてあげれば良さそうです。

# 解決方法
今回のdocker-composeでは、指定したディレクトリ(`./docker/database`)をマウントするようにしていました。
なので、5.7で起動する場合と8.0で起動する場合でgitブランチをわけ、かつ、データディレクトリの名前を区別するようにします。

具体的には、以下のようにします。

```yaml
# 5.7を使うとき
volumes: - ./docker/database_5_7:/var/lib/mysql
```

```yaml
# 8.0を使うとき
volumes: - ./docker/database_8:/var/lib/mysql
```

これで、それぞれビルド・起動して、ブランチを行き来しても、エラーが出なくなりました。
別のディレクトリにすることで、互換性の問題が解消されたのでしょう。

ただし、一点注意が必要なのは、この方法の場合は5.7の場合は5.7用のデータベース、8.0には8.0用のデータベースが必要になります。文字セットを変更したり、DB構成を変更したりしている場合は、双方のデータベースに異なるDUMPファイルのレストアが必要になるでしょう。
【React Jest】DOMPurifyを自動テスト中に使った際のimportエラー

# はじめに
Reactの自動テストを行った際に、コンポーネント側でDOMPurifyをimportしてたのですが、読み込みエラーが出て困ったため記載します

# 問題
テスト対象のコンポーネントでDOMPurifyをimportしてところ以下エラーが発生

```shell
TypeError: Cannot read properties of undefined (reading 'sanitize')

      22 |       <Heading size='md' noOfLines={1}>自己紹介</Heading>
      23 |       <Text fontSize='sm' data-testid='description'>
    > 24 |         {parse(DOMPurify.sanitize(
         |                          ^
      25 |           user?.description || '', {
      26 |             ALLOWED_TAGS: ['img'],
      27 |             ALLOWED_ATTR: ['href', 'target', 'src']
```

コンポーネント側の記載
```tsx
import DOMPurify from 'dompurify';

type UserInfoProps = {
  user: UserProfile,
  skills: userSkills[]
};

export const UserInfo = (props: UserInfoProps) => {
  const { user, skills } = props;

  return (
    <>
      <Heading size='md' noOfLines={1}>自己紹介</Heading>
      <Text fontSize='sm' data-testid='description'>
        {parse(DOMPurify.sanitize(
          user?.description || '', {
            ALLOWED_TAGS: ['img'],
            ALLOWED_ATTR: ['href', 'target', 'src']
          }
        ))}
      </Text>

```

# 解決方法
以下インポート文に書き換えて、ページ側の処理もテストの処理もうまくいくようになった

```tsx
import * as DOMPurify from 'isomorphic-dompurify';
```

# 解決できなかったが途中行ったこと
以下インポート文に書き換えたらテストはうまくいったが、ページ側でエラーがでました。

```tsx
import * as DOMPurify from 'dompurify';
```

でたエラー(webコンソール上)
```console
Uncaught TypeError: DOMPurify.sanitize is not a function
    at UserInfo (user_info.tsx:24:26)
    at renderWithHooks (chunk-6VWAHX6D.js?v=9a0a9ad0:11548:26)
    at mountIndeterminateComponent (chunk-6VWAHX6D.js?v=9a0a9ad0:14926:21)
    at beginWork (chunk-6VWAHX6D.js?v=9a0a9ad0:15914:22)
    at beginWork$1 (chunk-6VWAHX6D.js?v=9a0a9ad0:19753:22)
    at performUnitOfWork (chunk-6VWAHX6D.js?v=9a0a9ad0:19198:20)
    at workLoopSync (chunk-6VWAHX6D.js?v=9a0a9ad0:19137:13)
    at renderRootSync (chunk-6VWAHX6D.js?v=9a0a9ad0:19116:15)
    at recoverFromConcurrentError (chunk-6VWAHX6D.js?v=9a0a9ad0:18736:28)
    at performConcurrentWorkOnRoot (chunk-6VWAHX6D.js?v=9a0a9ad0:18684:30)
```
アイディアの作り方

## この記事から得られること
- シカゴ大学のビジネススクールでの広告専門の内容を得られることができる
- 理論ではなく、実務家の集まりでの話なので実践的な内容を手に入れられる。
- 実績のある方法を聞くことができる。


## なぜ、この話しをしようと思ったのか


あなたは、ビジネスマン、SE、エンジニア、プログラマ。あるいは、
他の人かもしれない。

この本の著者は、広告専門だが、アイディアの作り方は、業種業界問わず
どの地位にかかわらす必要だと思う。
なので技術者が読みそうなメディアでシェアしたいと思う。


## 内容
最初にアイディアの作り方を得る前に大切な考え方がある。
それは、
「心を訓練すること」だ。

どのようなスキルを手に入れる場合でも、
第一に、原理
第二に、方法
である。


いちばん大切なことは、
すべてのアイディアが作り出される方法に心を訓練することであり、
すべてのアイディアの源泉にある原理を把握する方法である。

つぎに、ある特定のアイディアをどこから探し出してくる
の順になる。



では
アイディア作成の基礎となる一般原理について大切なこと

- 「アイディアとは既存の要素の新しい組み合わせ」
- 「既存の要素を新しい一つの組み合わせに導く才能は、
物事の関連性を見つけ出す才能に依存するところが大きい」



さて、アイディアを作るぎつ具については、
意識的、無意識的にも次の順序を経ている事実がある。

この順序を通るので、今行っている段階が終わるまで
次の段階へ進んではいけない。

段階は５段階ある。

第一の段階：資料を集めること
ここで集めなければならない、資料は２種類ある。
- 特殊資料
- 一般資料

ここでは、広告の例で紹介する。
- 特殊資料とは、製品とその製品をあなたが売りたいと
考えている人々の資料である。
- 一般資料とは人生と様々な出来事についての知識資料
である。

第二の段階：資料を咀嚼する。
これは、頭脳の中で進行する。
例えば、個語の資料を触ってみる、
一つの事実を取り上げてみる。
あっちに向けたり、こっちに向けてみる。
２つの事実を一緒に眺めてみる。
などを行う。
この段階のとき、次のような２つのできことに出会う。
１、仮の部分的なアイディアアが訪れていくる。
このとき、紙に記入しておく
２，徐々にアイディアのパズルを組み合わせるのに疲れて嫌気をさすことである。
ここまで、パズルを組み合わせる努力を実際にやり遂げたとき、
第二弾会が完了することになる。




第三の段階：直接なんの努力もしないことになる。
つまり、問題を全く放棄して、心の外に放り出すことである。

ことで大切なことは、問題を無意識の心に映し、眠っている間に
それが勝手に働くのを任せるということである。


第四の段階：常にそれについて考えること
考えていることで、最も期待していないとき、
例えば、朝覚めたとき、入浴中のときに訪れる。

第五の段階：アイディアを現実の世界に連れ出すこと。
この段階が最後である。
このできたアイディアを現実の条件に適合させるためには、
忍耐強く沢山な手を加えなければならない。

多くのアイディアが日の目を見ずに失われていくのは、
この場面が多いそうだ。




## まとめ
- 第一： 資料集め（特殊資料と一般資料）
- 第二：心のなかで、集めた資料に手を加える
- 第三：意識の外で何かが、自分で組み合わせの仕事を任せる。
- 第四：アイディアの事実上の誕生を迎える。
- 第五：現実の有用性に合わせるために、最終的にアイディアを
具体化し、展開させる段階。




シンプルだが、第一と第二を続けるために日々継続が必要だと思います。
忘れたときに思い出せるようにと書きました。
もし、役立ちそうだならこのページを保存してみてください。
Quiitaにそんな機能あったかな。。


参考書籍
[アイデアのつくり方 著者：ジェームス W.ヤング](https://www.amazon.co.jp/dp/4484881047/ref=nosim?tag=haruki01-02"アイデアのつくり方")
FLUXメモ

# FLUX

ローカルでMidjournyレベルの絵が出るらしいという噂、Stable Diffusionの開発者たちが立ち上げた「Black Forest Labs」が発表した最新の画像生成AIモデル

https://ascii.jp/elem/000/004/215/4215981/

品質を確認するだけなら→　https://huggingface.co/spaces/black-forest-labs/FLUX.1-dev

https://comfyanonymous.github.io/ComfyUI_examples/flux/#flux-dev


必要ノードがComfyUI最新版のビルトインノードとして必要なので、ComfyUIの最新版を持ってくる必要がある。

既存のComfyUIとは別でStabilityMatrix が便利

StablilityMatrix内のPackageとしてComfyUIが含まれる状態となる

https://github.com/LykosAI/StabilityMatrix

Win　https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-win-x64.zip　

Mac　https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-macos-arm64.dmg

基本的にはこの手順通り

https://note.com/npaka/n/n00172116281e

[flux1-dev.safetensors](https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/flux1-dev.safetensors)については、HuggingFaceでログインして規約同意が必要

16GBのMacBookProではメモリ不足で動作せず。

32GB以上が必要？

モデルがロードされている状態で、生成時間は3分半ほど

サイバーパンク
![ComfyUI_00003_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/64cc8f83-1a32-d26d-c6b8-0cb0bf73fa44.png)



渋谷

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ef569312-cc6a-b0c9-d92e-f4e175c4ecec.png)


クオリティはかなり高い印象を受けました

[FLUXworkflow.json](https://drive.google.com/file/d/1eM4-LIGA4kbokwzyuEFBhgd-jgH7OOUe/view?usp=drive_link)

# FluxでのControlNet

このリポジトリを ComfyUI/custom_nodes にクローン

https://github.com/XLabs-AI/x-flux.git

git clone https://github.com/XLabs-AI/x-flux-comfyui.git

Managerで

8

[**ComfyUI's ControlNet Auxiliary Preprocessors**](https://github.com/Fannovel16/comfyui_controlnet_aux)

1197

[**x-flux-comfyui**](https://github.com/XLabs-AI/x-flux-comfyui)

を入れるほうが早いかも、

ComfyUI/custom_nodes/x-flux-comfyui/ に移動し、python setup.py を実行

models/xlabs/controlnets に移動し、以下のモデルをフォルダにダウンロードします

https://huggingface.co/XLabs-AI/flux-controlnet-collections/blob/main/flux-depth-controlnet.safetensors

https://huggingface.co/XLabs-AI/flux-controlnet-collections/blob/main/flux-canny-controlnet.safetensors

Comfy UI を実行すると動作するはず

ワークフロー（NF4-v2 と Deep Anything v2 を使用）:  https://openart.ai/workflows/IFBoIX4h5QGbGWR40cQJ

Canny 用の他のワークフロー: https://openart.ai/workflows/p4SgVH4pv9837yuwL0n4

オリジナルのワークフロー例:  https://huggingface.co/XLabs-AI/flux-controlnet-collections/tree/main/workflows


再構成して以下のjson、かつRTX4090でようやく動作。重い
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/67eb00ce-f10d-5581-99bd-8511cbde4dfc.png)
![ComfyUI_00006_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/18dbf2ca-e593-a4d9-f0fa-16479fe713d8.png)

[DepthControlNetFLUXworkflow.json](https://drive.google.com/file/d/134NFd6xHYXk5oI2AWJwFmXew__-B6Sbo/view?usp=drive_link)
[成長日記]よわよわエンジニアのこれまでと今後

どうもよわよわエンジニアのko-chanです。

初投稿ということもあり、何を投稿していいのかわかりませんが、現状分析しながら自己紹介していきたいと思います。



## 現在までの経歴

情報系の学部の大学卒業後(実はサボり癖があったため2回留年...orz)、プログラミングが苦手だったのを理由に、CEの会社に就職。

そこでは、CEの仕事というよりはインサイドセールスとして、企業に対して営業をかける業務を主に行っておりました。技術的に得られるものもなく、給料も安かったため、入社9ヶ月で退職。SESの会社に転職しました。

2社目では、組込みをやりたいという思いで入りましたが、自分の技術レベルで常駐できる会社はなく、コンサルタントとして働いている方の下に着き、ツールの業務効率化を行う業務を行なっていました。基本この会社ではフルリモートで働いており、上司の方も非常に面倒見が良く、いろいろと教えてくださっていましたが、出社して働きたいのと、組込みをやりたいという思いもあり、約1年半程勤め、再び転職を決意しました。3社目は、受託開発を行う某大手メーカーのグループ会社に転職しました。

(出社したらしたで、めんどくさくなりますね…塩梅が難しいです笑)

現在もこの会社に勤めており、念願だった組込み開発を行っております。
しかし、中々業務が上手くいかず、技術スキルもつかず、仕事で足を引っ張っているのが現状です。
この現状を打破したいと思い、qiitaに投稿することで自分を変えようと思った所存です。

## 将来的に

長々と経歴を書きましたが、実際今後はどうしたいのか、どうなりたいのか、はっきりとしたビジョンは今のところあまりありません。

強いて言えば、2社目の上司に当たる人の働き方にすごい感銘を受けていましたので、ゆくゆくはコンサルタントのように、企業から仕事をもらいながら、部下を何人も持ちたいという思いがあります。(技術が全く足りていませんが（涙）)



## 今後について

まずは現職の業務を円滑に進めるための知識を学び、技術として扱えるレベルまで持ってくことを第一にしたいと考えています。

勉強したいことも含め、やりたいことを順位づけると、

1.組込み開発全般(マイコン、リアルタイムOS等...)

2.資格

3.Webアプリ開発

4.語学勉強

5.いろいろな技術



最終的にはなんでもできるエンジニアを目指したいとは思っています。



## 最後に

学びたいと思っていることはいっぱいあります。

ただ、いい年になってきてますので、焦りもあります。

自分のため、家族のため、今後より良いライフプランを設計できるよう今後も投稿していこうと思います。

長々と、お話しに付き合っていただきありがとうございました。



同じような境遇の方、また乗り越えた方がいましたらぜひコメントお願いします。
だめだ、やる気が出ない。。。をとりあえず乗り切ろう


朝起きたくない。ご飯作りたくない。勉強もしたくない。なーーんもしたくない。
生きているとそんな気分になることもたまにはあると思います。

そんなネガティブな感情に陥ったときにできるだけ早く ~~乗り越え~~乗り切れたらいいなと思い試したことをメモにのこしてみます。

## :frowning2:なんでやる気がでなくなったんだろう

これといった決定的なイベントはなかったのだけど、振り返ると小さいことの積み重ねだったみたい

 - 社内でのコミュニケーションがうまくいかなかった
 - 資格の勉強を始めたけど思った以上に理解できない
 - なかなか仕事で成果を出せない
 - 砂糖と塩を間違えてしょっぱすぎる卵焼きが出来上がった
 など

 ## :runner_tone2:いろんな気分転換を試してみる

 ### 運動をする
 体を動かしてみよう！と思い3時間の登山に挑戦しました。もともと山登りは大の苦手でしたが、頂上に到達したら達成感で人生観が変わるんじゃないかと思い挑戦。
 結果、頂上についても下山しても山は二度とごめんだ。というネガティブな感情しかわきませんでした。
 **気分が落ちているときに苦手なものに挑戦するのは逆効果。楽しめる運動ならよかったのかも。**

 ### 原因を深堀して考える
 マインドマップなどを使って起きた事象について考えてみました。なぜそうなったか、防ぐことはできなかったかを考えてみましたが考えれば考えるほどネガティブまっしぐらになったため**これも逆効果。**　大切なことだけど今じゃない。気力が回復してからやったほうがよさそうです。

 ### 好きな音楽をきく
その瞬間の意識はそれるけど、気分の切り替えはできませんでした。

### 早く寝る
大体のことは寝たら解決する私ですが、解決しないことがあることを発見。メンタルが落ち込みすぎると効かない場合もあるみたいでした。

### 友達と過ごす
リモートワークだとなかなか1日の中で雑談をする機会がなかったことに気づき、意識的に家族と話したり、気心知れた友人と過ごしたりしてみました。あまり人と会いたくない気分でしたが、少し乗り気ではなくても、人と会って雑談することでなんだか少しだけポジティブになれた気がしました。**私の中ではかなり効果あり。**

### 自分への期待値を落とす
意識高い自分は理想的だけど、それが当たり前だと思い込んで理想の自分とのギャップに落ち込むくらいだったらたまにはあきらめてもいいんじゃないかと思い、私ってこんなもんだよね～と思うことにしました。**結局これが一番効果的なのかもしれない。**
その分周りからの評価も落ちると思うけど、そのあと未来の自分がまたあげてくれるよ～とあきらめることにしました。未来の自分に託す。


## :bulb:気づいたこと
- 気分が落ちているときに”挑戦”するのは危険。失敗したときのダメージが勝手に大きくなってしまう
- 人に頼ってポジティブのおすそ分けをもらうのも一つの手
- 肩の力を抜いてみることも大事

## :star2:おわりに
みなさんは気分が落ちた時どのような気分転換をしていますか？
落ち込むことが無いに越したことはないですが、いざというときに切り替え方を知っていると楽かもしれませんね。
たまには肩の力を抜きましょ
目標の立て方にはMACの原則が大事なんだと思った話

# はじめに
本日で9月末が終わり、今年度も半分が終わりました。
本記事では、MACの原則と呼ばれる目標の立て方で、半年間頑張った話について共有しようと思います。

# MACの原則とは？

**MACの原則**とは、目標達成可能性を大きく高めるために、アルファベットの頭文字3文字を取った原則になります。意味は、

* M(Measurable)：測定可能か
* A(Actionable)：行動可能か
* C(Competent)：適合しているか(価値観に合っているか)

となります。

# どのように適用したか

今年度(4月-9月)の目標の1つとして、**Udemy(オンラインの動画マーケットプレイス)を視聴して、フロントエンドの体系化した知識を取り入れる**といった内容で立てました。

||内容|
|:-:|:--|
|M|半年間で累計100時間分の動画を視聴する|
|A|①JavaScript完全版,TypeScript完全版,応用情報技術者の動画をそれぞれ視聴する<br>②1ヶ月で20時間(1日1時間×週5回)視聴する(5月から行動開始)|
|C|自分でアプリケーションを自在に作れるエンジニアになるために、フロント/バックエンド両方の知識が必要。実務でバックエンド開発を行なっているため、業務外でフロントエンドの知識を蓄えていきたいといった価値観に適合している|

# 結果は？
今年の3月までは、業務外で勉強することがほとんどなく勉強習慣がなかったが、目標を立てたことで半年間で累計100時間分の動画視聴を達成し、フロントエンドの基礎概念(DOMの概念, ジェネリクス, 型の種類)などを学ぶことができた。これにより、自分の理想像に近づくことができた。

# 最後に
この半期でMACの原則を使って目標を立てたのですが、個人的にはかなり効果がありました。
もし良ければ皆さんも実践してみてください！
rbs-inline の自動ビルドを fswatch を使わずに行う

[rbs-inline](https://github.com/soutaro/rbs-inline) をチーム内に導入するにあたって、 watch してビルドするための仕組みを整えた。

rbs-inline の README には `fswatch -0 lib | xargs -0 -n1 bundle exec rbs-inline --output` が紹介されている。
ただ、この方法だと [fswatch](https://emcrisostomo.github.io/fswatch/) を各々インストールする必要がある。 (チーム開発では、セットアップを複雑にしたくない、等で外部ツールに依存したくないことがある)

代わりに [listen](https://github.com/guard/listen) gem を使って Ruby 内で完結するようにした。実際の watch するコードは ↓ の感じ。

```ruby:Rakefile
namespace :rbs do
  TARGET_DIRS = %w(app lib).freeze

  desc 'Build RBS files automatically on file changes'
  task watch: :build do
    require 'listen'

    listener = Listen.to(*TARGET_DIRS, only: /\.rb$/) do |modified, added, removed|
      if removed.present?
        warn "#{removed} are removed. Rebuilding all RBS files..."
        Rake::Task['rbs:rebuild'].execute
      elsif modified.present? || added.present?
        warn "#{modified + added} are modified. Build RBS files from these files..."
        sh('bundle', 'exec', 'rbs-inline', '--output', '--opt-out', *modified, *added)
      end
    end
    listener.start
    sleep
  ensure
    listener&.stop
  end

  desc 'Build RBS files from inline annotations in Ruby files'
  task :build do
    sh("bundle exec rbs-inline --output #{TARGET_DIRS.join(' ')}")
  end

  desc 'Rebuild all RBS files'
  task :rebuild do
    sh('rm -rf sig/generated')
    Rake::Task['rbs:build'].execute
  end
end
```

## listen gem is 何

ここで唐突に出てきた [listen gem](https://github.com/guard/listen) は Guard というツールの内部で使われている、ファイル差分検出用の実装。

Guard は「ファイルが変更したときに特定のツール (Bundler, RuboCop, RSpec 等) を呼び出す」ことが出来るツール。

https://github.com/guard/guard

Bundler, RuboCop, RSpec 等のツールを自動で使うなら Guard を使うとよいが、自前でちょっとした watch を行いたい場合は listen gem を直接使うと良いかも。

```ruby
require 'listen'

listener = Listen.to(*DIRS_TO_WATCH, only: FILE_PATTERN_REGEXP) do |modified, added, removed|
  # modified, added, removed はファイル名の配列で、変更された、追加された、削除されたファイル名をそれぞれ表す。
end
```


Rails でも、直接の依存ではないものの、 `ActiveSupport::EventedFileUpdateChecker` を利用する際に必要になる。 (reloader 用のファイル変更の検知機構の1種。)

https://guides.rubyonrails.org/configuring.html#config-file-watcher

なので、各プロジェクトの依存 gem としてもしかすると入ってるかも。
macOS SequoiaにアップデートしてXcodeもアップデートしたらFlutterで困ったのでメモ

# はじめに

macOSアップデートしたらトラブったので、今後のためにメモしておく。
勘違いもいくつかあったのもあったので。
今回はホント自分への戒め的なもの。

# 発生したこと解決のメモ
macOSをSequoiaにアップデートしてXcodeもアップデート。
そうしたら、使用しているFlutterのプラグインでエラーが発生。
問題解決につながったと思われることを書いておく。

Podfileのplatformを12.0から13.0に変更
https://t.co/em3r9phU9g　のissueにある Allow Non-modular Includes In Framework Modules をYesにするを実施。

以下を実施（多分やらなくても問題ない事もやってるかも)
```
flutter pub upgrade
flutter upgrade
cd ios
rm -rf ~/Library/Caches/CoccoaPodsrm
rm -rf Pods
rm -rf Podfile.lock
pod repo update
pod install
```


# 勘違いしていた恥ずかしい事

使用されるFireBase SDKのバージョンが出力されていたんですが、11.0.0とか出ていて、iOSのバージョン？とかよく読まずに勘違いしていて、Podfileのplatformのバージョンを変えて悩んでいたこと。
(ホントよく見てなくて・・・数字しか見てない感じで・・・恥ずかしい)

もしやと思い、[Firebase Apple SDK Release Notes](https://firebase.google.com/support/release-notes/ios?_gl=1*1xkqq5j*_up*MQ..*_ga*MTk3ODUyNDIwLjE3MjczNjQ5MTU.*_ga_CW55HF8NVT*MTcyNzM2NDkxNS4xLjAuMTcyNzM2NDkxNS4wLjAuMA)にFirebase Apple SDK 11.0はiOS 13からだよって書いてあって気づく。

# ちょっと困ったこと
connectivity_plusをバージョンアップして、ConnectivityクラスのonConnectivityChanged.listen()メソッドの引数の型が変わっていたこと。
大きな問題ではないけれど、flutterのpluginは破壊的な変更が割と入ってくるような印象があるのでバージョンアップは結構勇気がいるのかも・・・

# 最後に
メッセージとドキュメントはよく読め、俺。
P波・S波を簡単かつ正確に描画したい！(指定座標から指定した距離の円を描画する)

# 概要

地球は楕円体なので、地図に真円を描画しても中心から等しい距離の軌跡でありません(数学感)。先人達の記事を見てもよくわからなかったので自分でやってみました。

## 注意
ちゃちゃっと作ったものなのでミスがあるかもしれません。コードはCopilotで移植したものを使えるよう調整したものです。命名が雑だったりおかしかったりするのは気にしないでください。

メルカトル図法とか計算が面倒でよくわからないので、[正距円筒図法](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%B7%9D%E5%86%86%E7%AD%92%E5%9B%B3%E6%B3%95)(座標をそのまま投影するもの)を使用しています。別の方法でもたぶん大丈夫です。

もうちょっとちゃんと作ったら追記します。

# 内容

## どんな感じになるのか？

地図と中心座標を用意して、1pxごとに距離を計算して色を塗りました。距離の計算は[経度緯度の情報から「測地線航海算法」で距離を計算する](https://qiita.com/matsuda_tkm/items/4eba5632535ca2f699b4)を参考にしました。

描画部分を抜き取ったものは下の通りです。

```c#:C#
var dist = GeodesicDistance.Dist([centerLat, centerLon], [imgLat, imgLon]) / 1000d;//距離(km)
if (double.IsNaN(dist))//緯度経度が一致するとNaNになる？
    continue;
var level = dist / cor;//色段階
var co = level > 765 ? Color.FromArgb(a, 128, 128, 128) : level > 510 ? Color.FromArgb(a, 0, 0, (int)level - 510) : level > 255 ? Color.FromArgb(a, 0, (int)level - 255, 0) : Color.FromArgb(a, (int)level, 0, 0);
g.DrawLine(new Pen(new SolidBrush(co)), x, y, x + 1, y);//クソコード
```
(点の描画は幅1px長さ2pxの線を1pxぶん上書きしていく適当な実装)(`a`は透明度、`cor`は距離を合わせるための値です。(255*cor)kmで色が切り替わります(たぶん))

無茶苦茶な計算量ですが、私の環境では1080x1080で2秒弱で描画できました(地図描画除く)。

https://x.com/ProjectS31415_1/status/1840683854174068772

なんか地震界隈の某有名ソフトは到達円内にグラデーションがありますがこんな感じですね

それはさておき当然ながらきれいな楕円でもないです。

https://x.com/ProjectS31415_1/status/1840706665659941348

こんな感じで複数の楕円でもうまくいかなそうです。

## Vincenty法の利用

調べているとどうやらVincenty法の順解法を使うことでできるようです。[[Python]始点の緯度経度と方位角と距離から、終点の緯度経度と方位角を求める
](https://qiita.com/r-fuji/items/5eefb451cf7113f1e51b)を参考にしました。

```c#:C#
var psApprox = new List<Point>();
for (double d = 0; d <= 360; d += deltaD)
{
    var pt = Vincenty.VincentyDirect(centerLat, centerLon, d, newDist, 1);
    psApprox.Add(new Point((int)((pt.Value.lon - config.LonSta) * zoomW), (int)((config.LatEnd - pt.Value.lat) * zoomH)));
}
```
終点の緯度経度が分かればいいですね。`deltaD`を小さくすれば円に近くできます。

https://x.com/ProjectS31415_1/status/1840722300494307445

できました！

どちらも同じ楕円体モデルで高精度のため、うまくできています。

# PS波描画への応用(2024/10/01追加)

走時表を使えば深さ・震央距離からPS波それぞれの到達時間が分かります。しかし深さと時間からPS波それぞれの震央距離が欲しいです。これは線形補間を使って近似的に求めることができることは先人達の記事で知っていたので利用させていただきます。

https://zenn.dev/boocsan/articles/travel-time-table-converter-adcal2020

未到達だと(処理方法によっては)距離がマイナスになって未到達なのに到達していたり変なことになるので0kmとかにしときましょう。

https://x.com/ProjectS31415_1/status/1841096355282108439

JMA2001走時表(tjma2001.zipの方)を使用しました。震源は40.3°N,145.2°E,D=170kmとしました。

ばらつきはありますがだいたい20msで描画できます(どれくらい内部で最適化されているかわかりませんが、最初でも100ms行かないくらいです)。楕円だと違和感があるのでできればメルカトル図法を使いたいですね。

# まとめ

Vincentyの式を利用することで簡単かつ正確に、高速に描画できました。また、これをもとに走時表を用いてPS波を描画できました。

距離単位がmだったりkmだったりするのでよく確認すること。(2敗)

汚いので使い物にならない気がしますが、ソースコードは[ここ](https://github.com/Ichihai1415/PSCircleTest)です。
複数の Git repository の履歴を保持したまま 1つの Git repository を統合する


## はじめに

- Git repository の履歴を保持したまま複数の repository　を1つにまとめる作業をした
- 自身の作業ログ扱いだが履歴として残しておく

## Git repository の統合

- repo1, repo2 を repo　にまとめる

```sh
.
├── repo
| └ .git
├── repo1
| └ .git
└── repo2
  └ .git
```

となっているのを

```sh
.
└── repo
  └ .git
  └ repo1
  └ repo2
```

に変更する

###　手順

- repo 内に repo1 ディレクトリを作成、何かしらのファイルを作成しておく
  - 今回作成したファイルは `.gitkeep` とした
- remote に移行元を追加、fetch しておく
- `git merge --allow-unrelated-histories -X`　で merge　する

```sh
cd repo
git co -b import-repo1
mkdir repo1
touch repo1/.gitkeep
git remote add import-repo1 git@github.com:mziyut/repo1.git
git fetch import-repo1
git merge --allow-unrelated-histories -X subtree=repo1 import-repo1/master
```
docker compose にホットリロード機能が追加されていた件【Docker Compose Watch】

# Docker Compose Watch とは

2023年9月21日にリリースされた [Docker Compose v2.22.0](https://docs.docker.com/compose/releases/release-notes/#2220) で追加されたホットリロード機能です。 `docker-compose.yml` に対象ファイルを指定すると、 `docker compose up --watch` で、そのファイルの変更を検知して反映することができるようになりました。

変更を検知したときに実行できるアクションとして、`sync`, `rebuild`, `sync+restart` の3種類があります。

公式ドキュメントはこちら↓

https://docs.docker.com/compose/how-tos/file-watch/

GAリリース発表されたときの記事↓

https://www.docker.com/ja-jp/blog/announcing-docker-compose-watch-ga-release/

# 使い方

docker compose の設定ファイル `docker-compose.yml` ([最近は `compose.yaml` 推奨らしい](https://docs.docker.com/compose/intro/compose-application-model/#the-compose-file)) に`develop:` 以下を追加します。

```yml:docker-compose.yml の例
services:
  web:
    build: .
    command: npm start
    develop:
      watch:
        - action: sync
          path: ./web
          target: /src/web
          ignore:
            - node_modules/
        - action: rebuild
          path: package.json
```

`watch:` にはアクションを複数設定可能で、以下の設定項目があります。

- `action`: `sync` `rebuild` `sync+restart` の3種類
- `path`: 監視するファイル・ディレクトリのパス
- `target`: `path`で指定したファイルのコンテナ側でのパス
- `ignore`: `path`で指定したパスないのファイルのうち、除外したいファイルのパス

この状態で以下のコマンドを実行すると、`path`で指定したパス以下のファイルの変更を検知して、指定したアクションを実行してくれます。

```
$ docker compose up --watch
```

:::note warn

少し前まで `sync+restart` にバグがあったので、docker compose のバージョンを `v2.29.2` 以上にした方がよさそうです。

https://docs.docker.com/compose/releases/release-notes/#2292

> Fixed an issue which stopped the Compose process for a single container on sync-restart Watch action.

:::

# おわりに

最近久しぶりに Docker Compose を使ったリポジトリを作る機会があり、ホットリロードのいい方法がないか探していたのですが、ちょうど最近追加され便利な機能があったので記事にしてみました。ぜひ使ってみてください。

`docker-compose` コマンドが `docker compose` になってから数年が経ち、ようやく慣れてきましたが、今度は  `docker-compose.yml` ではなく `compose.yaml` が推奨されていたり、新しい機能が増えたりしていて、久しぶりに docker を触ると新たな発見がたくさんあり、楽しいですね。

今後も新しい機能をどんどん活用して、最高の開発環境を作っていきたいです！
Javaでexeを作成して他の端末で動かす

# 初めに
Javaでアプリを作るにあたり配布のことを含め方法を調べてみました。

# 事前準備
Jframeなどを利用してGUIアプリケーションを作成する

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/58a99cea-dc7c-d77f-1ccd-80e92d6b9d96.png)

# ソースコード
※メッセージボックスを表示するだけの簡易なアプリーケーション
```
public static void main(String[] args) {
	JFrame jf = new JFrame();
	jf.setSize(100,100);
	jf.setLocationRelativeTo(null);
	JLabel label = new JLabel("Hello World!");
	jf.add(label);
	jf.setVisible(true);
}
```

# Jarファイルを作成する
基本的にデフォルト通りだが、下記のエントリーポイントを設定すること

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/c28ba79e-ad89-48de-25a6-9a43bd6a0d7f.png)

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/70724595-ed2f-58b1-6cc5-c866e480e362.png)

# Exe作成するアプリをインストール
例として「launtch4j」というアプリをインストール
https://launch4j.sourceforge.net/

# launch4jの設定
アプリを起動し、必要な設定を行う。
・入力：作成したjarファイル
・出力：exeファイルの出力さき
・使用するjreのパス：これを設定しないとJavaがインストールされていない環境で動作しなくなる

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/cdd31d48-7e67-f441-9188-5385457ee6fe.png)

# jdk配下からjreフォルダをコピーする
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/63faf86f-531b-bfb3-81e9-339e162428a4.png)

作成するexeファイルからの相対パスを設定する
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/0f3ffe42-33a8-00af-5d72-e69b22dd29cb.png)

歯車の設定ボタンを押下すると設定ファイルの出力先を問われるので入力後に保存を押下する
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/be09c330-7f0b-d091-321d-0df76b683648.png)

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/48b03fb5-1094-fde6-74ad-f37341c95d87.png)

exeファイルが作成されるので実行する
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/92b873b0-717e-ea78-a1f6-fb1deba1b254.png)

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/cb87d22e-4e35-49f8-aac5-055bd89eb816.png)


必要に応じて、exeファイルとjreをコピーして他の端末で使用する
これでJavaがインストールされていない環境でも動作する
任意のExceptionを実行させる

# はじめに
単体テスト実施時にExceptionを発生させる必要があり、方法を調査した。

# 準備
catch節を適当に用意する。
```
    } catch (IOException ie) {
        System.out.println("IOException 例外が発生しました。");
    } catch (ArithmeticException ae) {
        System.out.println("ArithmeticException 例外が発生しました。");
    } catch (Exception e){
        System.out.println("Exception 例外が発生しました。");
    }
```

# 実行
Try節で表示タブから該当のExceptionを実行
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/1300ac64-0169-c889-10e8-cc209ede00f8.png)

そうすると所定のExceptionがキャッチされる
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/9d234940-54b6-dce7-0e57-d5fb2156c7c8.png)

他のExceptionも同様なので必要に応じてcatch節を追加してテストを行う。
- IOException 　→ throw new IOException();
- ArithmeticException 　→ throw new - ArithmeticException();
- Exception 　→ throw new Exception();
JavaでDLLを呼び出す方法

# はじめに
Javaでアプリを作成するにあたり、WindowsのDLLを利用する方法について調べてました。

# JNAという仕組みを利用する
C/C++で書かれた共有ライブラリ（.dllなど）をJavaから呼ぶ方法の一つ

# 準備
以下のjarをビルドパスに追加する
https://mvnrepository.com/artifact/net.java.dev.jna/jna
※呼び出すDLLに必要に応じて追加する必要がある

# 実装例
メッセージボックスを表示する場合
※user32.dllのMessageboxAを呼び出す場合

ソースコード
```
    public interface User32 extends Library {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
        int MessageBoxA(Pointer hWnd, String lpText, String lpCaption, int uType);
    }

    public static void main(String[] args) {
        User32.INSTANCE.MessageBoxA(null, "test", "title", 0);
    }
```

以下のライブラリをimport
```
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
```

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/95407862-d4e9-e765-1dea-e21fb7c93f7d.png)

# 実行結果
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/dc5ab2d6-fd3b-dd22-1f08-e419ee1e81f0.png)

このように呼び出しが行えるので他のDLLも同様に呼び出しが可能となる。
Junitでprivateメソッドを呼び出す

# はじめに
現場でJunitからPrivateのメソッドを呼び出す必要が出てきたため方法を調査してみました。

# 準備
privateメソッドを定義する
```
	private int divNumbers(Integer a, Integer b) {
		return a - b;
    }
```
# 呼び出し
通常、下記のようにprivateメソッドを別のクラスから呼び出すことはできない


![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/b45ca248-3273-1133-dd42-532d58313d5d.png)

# 設定
リフレクションを利用することでprivateメソッドが呼び出せる様になる

```
	@Test
	public void test2() throws NoSuchMethodException, SecurityException,
									IllegalAccessException, IllegalArgumentException, InvocationTargetException {

		Method method = Calc.class.getDeclaredMethod("divNumbers", Integer.class, Integer.class);
		method.setAccessible(true);

		Calc c = new Calc();
		int div = (int)method.invoke(c, 30, 10);
		assertEquals(20, div);
	}
```

# 実行結果
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864721/09458175-2ada-914b-32ae-c53af1016f29.png)
64パッドのレイアウト図示用MIDIモニタを作った


# 64パッドのレイアウト図示用MIDIモニタ

作った：[Major/Minor 3rd Perfect 5th Layout MIDI Monitor (64pad)](https://codepen.io/ucosarv/full/abeoapg)

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="abeoapg" data-pen-title="Major/Minor 3rd Perfect 5th Layout MIDI Monitor (64pad)" data-user="ucosarv" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ucosarv/pen/abeoapg">
  Major/Minor 3rd Perfect 5th Layout MIDI Monitor (64pad)</a> by ucosarv (<a href="https://codepen.io/ucosarv">@ucosarv</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



- これは何
  - [64パッドを使ってインスタコード並みの手間で和音を入力する](https://qiita.com/ucosarv/items/72aec3f1d5f7e64e6ad4)のレイアウト配列の簡単なMIDIモニタ
    - Mm3rdRotated(上のリンクのもの)、P4th、P5th、DrumPadのレイアウトに対応
    - テキストなしでパッドの物理位置だけ図示するためのレイアウト(DrumPadGrayOutNoText)も追加
  - MIDIノートを受け取ると対応するパッドが黄色くなる
    - 開けるMIDIデバイスをすべて開くので、開いてほしくないデバイスは予め別のアプリで開いておく
  - Shift+Sで静止画として保存
  - Excelで音程と色の配列を作ってソースコードに貼り付ければ動くように作ったつもり
  - デスクトップ録画(LICECapやOBS等)を使えば動画の保存も可能


- 使用ライブラリ
  - p5js
  - WEBMIDI.js