OmniAICreator/Qiita-1.07M huggingface dataset:
痒いとこに手が届くMATLAB関数【フォント変更shortcut】

# フォントを手軽に変更する関数の作成してみました！

:::note 
### 痒いとこに手が届くMATLAB関数
日々のMATLABライフをちょっと便利にするツールを作成し発信することを目指して投稿をはじめてみました。他のMATLABユーザーさんの作業効率化の一助になれば幸いです！
:::
MATLAB ユーザーの皆さん、こんにちは！


以前より小さな悩みがありました。そう、UIのフォントサイズ問題です。
エディターのフォントサイズは「command + スクロール」などでサクサクっと変更できるのに、コマンドウィンドウのフォントサイズはどうしてあんなに意固地なのでしょう？
まるで「私は変わらないぞ！」と頑固に抵抗しているかのようです。

「フォントサイズを変えるためだけに、毎回環境設定を開くなんて...そんな時間、もったいない！」

そんな声が聞こえてきそうです（私の心の声ですが）

今回は、UIのフォントサイズをコマンドでサクッと変更する関数を作ってみました

## モチベーション
開発しようと思ったきっかけは、オンラインミーティング中です

普段、自分でコーディングする時は、コード全体が見えるように限界までフォントを小さくするんです。でも、オンラインミーティングで画面共有をする際に、その小さすぎるフォントが問題になるんです。

「フォント小さくて見えないよ！」

と、指摘された経験、ありませんか？私はありますとも！しかも何度も！

「ええー、ここから環境設定開いて...フォントを選んで...って、ちょっと待ってくださいね...」


なんて、モタモタしている間に、会議の貴重な時間がどんどん過ぎていきます。そして、参加者の集中力も...

「あー！もう！コマンド一発でフォントサイズ変更できたらいいのに！！」

そんな心の叫びを形にしてみましたという紹介です

## 百聞は一見にしかずまずはデモから
<img src="https://github.com/user-attachments/assets/849f1fda-edf4-4d11-8fd6-3819497be8bc" width="90%">

こんな感じに変更できるようにしてみました

## ソースコード
GitHubで公開しています。興味があればこちらよりどうぞ！
[GitHub : MatTool-font](https://github.com/MyMatTool/font.git)


本ページの[末尾](#実装内容)にサンプルコードもあります。

## 実行方法

コマンドウィンドウ上で`font`コマンドの後に数字または文字列を入力して実行します。

#### フォントサイズの変更
数字を入力すると、フォントサイズが変更されます。
```matlab
>> font 10
```

#### ショートカットキーの実行
ショートカットキーを登録している場合は、key を引数として実行すると、設定内容に変更できます。
```matlab
>> font key 
```

#### ショートカットキーのリストの表示
引数を指定せずに実行すると、ショートカットキーの一覧が表示されます。
```matlab
>> font
--------------------------------------------------
<<Shortcut list>>
  shortcutKey                        font                        size
  ___________    ____________________________________________    ____

  {'default'}    {'Monospaced'                              }     13 
  {'a'      }    {'Academy Engraved LET'                    }      0 
  {'e'      }    {'Menlo'                                   }      0 
  {'m'      }    {'Monospaced'                              }      0 
  {'pm'     }    {'PT Mono'                                 }      0 
  {'am'     }    {'Andale Mono'                             }      0 
  {'ay'     }    {'Ayuthaya'                                }      0 
  {'user'   }    {'__REPLACE WITH YOUR FAVORITE FONT NAME__'}     12 

--------------------------------------------------
input key :
```

## ショートカットキーの登録
同一フォルダ内にある`shortcut.csv`で登録します。
1 つのキーに対して、フォント名とフォントサイズを割り当てることができます。
フォント名のみを設定したい場合は、size 列の値を`0`にして登録してください。
（**※keyにはスペースを使用しないでください**）

例： shortcut.csv
| ShortcutKey | font | size |
| ---- | ---- | ---- |
|f10 | MS Gothic | 12 |
|f11 | Consolas | 14 |
|f12 | Arial | 0 |

例えば、上の例のように登録すると`>> font f10`キーを押すと、フォントが MS Gothic でサイズが 12 に変更されます。


## 実装内容
実装内容としては文字列を数字に変換しsettingsから値を設定するといった方法になります
上記のショートカットキーなどの機能を考えなければ以下のような実装で十分です！
```matlab
function font(value)
% >> font 10
% といった具合に実行する想定なので、引数は文字列として取得する想定
    size = str2double(value);
    if ~isnan(size)
        sys = settings;
        sys.matlab.fonts.codefont.Size.TemporaryValue = size;
    end
end
```

## まとめ
今回はMATLAB の UI フォントサイズ変更の関数を作ってみました。
オンラインミーティングも、もう怖くないですね！
LeetCodeを1日1題解いてみる (day4)

4日目に取り組んだ問題はこちら！

# 21. Merge Two Sorted Lists

https://leetcode.com/problems/merge-two-sorted-lists/description/

## 問題文
You are given the heads of two sorted linked lists list1 and list2.

Merge the two lists into one sorted list. The list should be made by splicing together the nodes of the first two lists.

Return the head of the merged linked list.


## 僕の回答(GPTに質問箇所あり)

```py
class Solution:
    def isValid(self, s: str) -> bool:
        if len(s) % 2 == 1:
            return False
                
        bracket_map = {')': '(', '}': '{', ']': '['}
        stack = []

        for char in s:
            if char in bracket_map: # 閉じ括弧の場合
                top_element = stack.pop() if stack else '#'
                if bracket_map[char] != top_element:
                    return False
            else: # 開き括弧の場合
                stack.append(char)

        return not stack # スタックが空であれば全ての括弧が閉じられたことを意味する
```

## より効率の良い回答例

```py
# 今回は特に修正点はありませんでした！
```

### コメント
リンクリストの使い方を理解できました

### 次回はこちら!
https://qiita.com/h_y_s_d/items/921e6766bce68e1e894f
Marpサイバーキャット・ドリームスケープテーマの紹介

## 概要

サイバーキャット・ドリームスケープは、Marpプレゼンテーション用に設計された独特で魅力的なテーマです。このテーマは、サイバーパンクの要素とドリームライクな雰囲気を融合させ、視聴者の注目を集める独特の視覚体験を提供します。

## 主な特徴

1. 鮮やかなカラーパレット
2. グラデーションを活用したテキストとバックグラウンド
3. アニメーション効果
4. レスポンシブデザイン
5. ダークモードサポート

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">新しいMarpテーマ「Cybercat Dreamscape」作りました②<br>スライドに使うとこんな感じです！ <a href="https://t.co/j0bVQ8xeFF">https://t.co/j0bVQ8xeFF</a> <a href="https://t.co/IzQiuXg4CN">pic.twitter.com/IzQiuXg4CN</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1846158223482720562?ref_src=twsrc%5Etfw">October 15, 2024</a></blockquote> 

## カラーパレット

テーマは以下の5つの主要な色を使用しています：

- バーガンディ (#8C3545)
- ダーク (#26020C)
- ネイビー (#253C59)
- ティール (#329AA6)
- サンド (#F2DDB6)

これらの色は、スライド全体で様々な要素に使用され、視覚的な一貫性と興味を生み出しています。

## タイポグラフィ

本テーマは、優雅さとレトロフューチャリズムを融合させた「Kaisei Decol」フォントを使用しています。これにより、テキストに独特の個性が与えられています。

## 使用方法

1. テーマファイルをダウンロードし、Marpプロジェクトに配置します。
2. Marpドキュメントの先頭に以下のYAMLフロントマターを追加します：

```yaml
---
marp: true
theme: cybercat-dreamscape
---
```

## スタイルの例

### 通常のスライド

```markdown
# これはメインタイトルです

これは通常のテキストパラグラフです。**太字**や*イタリック*のテキストも使用できます。

- リストアイテム1
- リストアイテム2
- リストアイテム3

[これはリンクです](https://example.com)
```

### リードスライド

特別な「リード」クラスを使用して、開始スライドや重要なセクションを強調できます：

```markdown
<!-- _class: lead -->

# プレゼンテーションタイトル

## サブタイトルやキャッチフレーズ

発表者名
```

### コードブロック

```markdown
\```python
def hello_world():
    print("Welcome to Cybercat Dreamscape!")

hello_world()
\```
```

### 引用

```markdown
> サイバーキャット・ドリームスケープは、あなたのプレゼンテーションを夢のような冒険に変えます。
```

## カスタマイズ

テーマのSCSSファイルを編集することで、色、フォント、その他のスタイル要素をカスタマイズできます。主な変数は以下の通りです：

```scss
$color-burgundy: #8C3545;
$color-dark: #26020C;
$color-navy: #253C59;
$color-teal: #329AA6;
$color-sand: #F2DDB6;
```

## まとめ

サイバーキャット・ドリームスケープテーマは、独特で魅力的なビジュアルスタイルを求めるプレゼンターに最適です。サイバーパンクとドリームライクな要素を組み合わせることで、このテーマはあなたのプレゼンテーションを忘れられない体験に変えます。

Marpとサイバーキャット・ドリームスケープを使って、聴衆を魅了するプレゼンテーションを作成しましょう！

## リポジトリ

https://github.com/Sunwood-ai-labs/Theme-Vault-Marp

https://github.com/Sunwood-ai-labs/Theme-Vault-Marp/releases/tag/v1.3.0

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
二部探索アルゴリズムでADしてDAするSimulinkシミュレーション　


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/eb63bb4a-a921-8e5c-c6a4-f89fd584a1c0.png)

```
% 電源電圧ありの2部探索アルゴリズムのAD変換器
function [Vout, D] = binary_search_adc_with_vdd(Vin, VDD, bit_generation_clock)
    % 入力:
    %   Vin  - 入力電圧
    %   VDD  - 電源電圧
    %   bit_generation_clock    - ビット生成用のクロック (0 または 1)
    % 出力:
    %   Vout - 残差電圧
    %   D    - ビット出力 (0 または 1)
    
    % 基準電圧 VREF = VDD / 2
    VREF = VDD / 2;
    
    % クロックが0のとき出力はすべて0
    if bit_generation_clock == 0
        Vout = 0;
        D = 0;
        return; % クロックが0の場合、出力は更新されず終了
    end
    
    % クロックが1のとき、入力電圧に応じて計算
    if Vin > VREF
        Vout = 2 * (Vin - VREF); % VinがVREFより大きい場合
        D = 1;                   % ビット出力は1
    else
        Vout = 2 * Vin;          % VinがVREFより小さい場合
        D = 0;                   % ビット出力は0
    end
end

% クロックが0から1になると値を更新する関数
function y = fcn(u, VDD, bit_generation_clock)
    % fcn - クロックが0から1になるときに出力を更新する
    % 入力:
    %   u   - 入力電圧
    %   VDD - 電源電圧
    %   bit_generation_clock   - ビット生成用クロック信号 (0 または 1)
    % 出力:
    %   y   - 出力電圧 (Voutとビット出力)

    % 初期出力は全て0に設定
    persistent Vout D
    if isempty(Vout)
        Vout = 0;
        D = 0;
    end
    
    % クロックが0から1に変わったときのみ値を更新
    if bit_generation_clock == 1
        [Vout, D] = binary_search_adc_with_vdd(u, VDD, bit_generation_clock);
    end
    
    % 結果を出力
    y = [Vout, D];
end

```



```
function DA_output = DAC_output(VIN, Din, clk)
    % 初期化
    persistent DA_value;
    if isempty(DA_value)
        DA_value = 0;  % 初期値はすべて0
    end
    
    % ビット生成クロックが0の時はすべて0を出力
    if clk == 0
        DA_output = 0;
    else
        % ビット生成クロックが1の時は
        if Din == 1
            DA_output = VIN;  % D1が1の時にVINを出力
        else
            DA_output = -0;  % D1が0の時に 0 を出力
        end
    end
    
    % 値が変更されたらDA値を更新する
    DA_value = DA_output;
end


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/30632480-cacd-f485-be30-5ca5df1785df.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/4b5837b3-7447-1528-81ed-8585465868a4.png)
【基本情報】独学マラソン 割り込み Day 15

「どうすればいいですか？」ではなく「こうすればいいですか？」
しごできジャイアン

:::note worn
この記事は自分用の備忘録です。
:::


# 割り込みとは  
コンピュータで何かの処理が実行中に**別の優先度の高い処理**が発生した際、現在の処理を一時停止して割り込みを処理する仕組み。
割り込みは大きく分けて次の2種類に分類される。

## 1. 内部割り込み（Internal Interrupt）  
**内部割り込み**は、CPU内部やプログラムの実行中に発生する割り込み。主にプログラムのエラーやシステム操作によって発生する。

### 例:
- **ゼロ除算エラー**：0で割る演算が行われたとき  
- **オーバーフロー**：演算結果が扱える範囲を超えたとき  
- **ページフォールト**：必要なデータがメモリ上になく、ストレージから読み込む必要があるとき  

## 2. 外部割り込み（External Interrupt）  
**外部割り込み**は、CPU外部からの信号で発生する割り込み。ハードウェアや外部デバイスからの要求によって処理が中断される。

### 例:
- **タイマー割り込み**：一定時間ごとに処理を割り込む  
- **キーボード入力**：キーが押されたときに発生  
- **I/Oデバイスからの要求**：プリンターやハードディスクの動作完了通知  


## 内部割り込みと外部割り込みの違い

| 比較項目         | 内部割り込み                  | 外部割り込み              |
|------------------|-------------------------------|---------------------------|
| 発生源           | CPU内部、プログラムの実行中   | ハードウェア、外部デバイス |
| 例               | ゼロ除算、オーバーフロー       | タイマー、キーボード入力  |
| 処理目的         | プログラムエラー処理          | デバイスの操作や管理      |
| 発生タイミング   | プログラムの動作に依存        | 外部からの信号に依存      |


# 感想
エラーの多いプログラムを書いていたら、割り込みが多くなってパフォーマンスが低下するらしい。きちんとデフォルト値を設定したり早期リターンで例外処理を先にすませたりなど、基本的なことがとても大事なんだと改めて思った。

# 参考

https://itmanabi.com/interrupt/

https://e-words.jp/w/%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF.html
Ruby sort_by でソートの基準を設定

# はじめに
本記事はRuby初心者が備忘録として作成したものとなっております。間違い等ありましたら、指摘していただけると幸いです。


## sort_byメソッドとは？
ソートの基準を自由に設定するができ、より複雑なコレクションの並び替えが可能になる。
sort、sort_byはどちらも配列をソートするメソッドですがsort_byのほうが処理が速いそうです。


```:Ruby
books = [
  {name: "Book2",price:1000},
  {name: "Book1",price:500},
  {name: "Book3",price:2000}
  ]

sort_book = books.sort_by{ |book| [book[:price],book[:name]] }

puts sort_book

【実行結果】

{:name=>"Book1", :price=>500}
{:name=>"Book2", :price=>1000}
{:name=>"Book3", :price=>2000}
```

降順ソートをしたい場合は `-` をつける
```:Ruby
books = [
  {name: "Book2",price:1000},
  {name: "Book1",price:500},
  {name: "Book3",price:2000}
  ]

sort_book = books.sort_by{ |book| [-book[:price],book[:name]] }　本のpriceを降順ソートしたいのでbook[:price]に - をつける

puts sort_book

【実行結果】
{:name=>"Book3", :price=>2000}
{:name=>"Book2", :price=>1000}
{:name=>"Book1", :price=>500}
```

## 参考元
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/sort_by.html
https://qiita.com/hayato0311/items/52a2eac88545fcaff139
https://style.potepan.com/articles/30459.html
【DAY35】デザインの作り方について


## デザインの流れ
* 何を作るか、誰が使うかを決める

デザインを作成する前に、まずコンセプトや機能など何を作るかを決めます。
また、年齢や職業など誰が使うかも考えます。例えば高齢の方が使うサービスの場合、文字やボタンを大きくするといったデザインの工夫が必要になります。

* ワイヤーフレームを作る

ワイヤーフレームとは、Webサイトの目的に応じて「何を・どこに・どのように」配置するかを表現した設計図です。
ざっくりとページの構成を決めてからページの中身を決めます。

* デザインのルールを決める

決めるといいデザインのルールには色やフォント、パーツなどがあります。
色についてはメインカラー、サブカラー、文字色などを決めます。
フォントについてはタイトル、本文、注意書きなどのサイズを決めます。
使うサイズは3、4種類くらいに収めるとスッキリします。
パーツについては、ボタンなどのパーツを共通化しておくことでデザインが見やすくなるだけでなくわかりやすいUIになります。

* 細かなデザインを決めていく
[tips][cpp][Problemsolver] 関数の結果を引数に使いたい時

# Cppの出力引数

関数の結果を関数の引数に使いたい時。pythonなどの他の言語を触ったりでcppご無沙汰してる時用のメモ。

```cpp
using namespace std;

void hoge(int a, int b, int &result) {
  if (result > 400) cout << "hoge" << endl;
  result = a + b;
}


int main() {
    hoge(2, 3, result);
    cout << result << endl;
    hoge(200, 300, result);
    cout << result << endl;
    hoge(300, 400, result);
    cout << result << endl;
}
```

output
```cpp
5
500
hoge
700
```

## 備考

https://zenn.dev/yonishi/scraps/7d7dc689eb7bbc
TypeScriptのジェネリクスについてまとめてみた

## TypeScriptのジェネリクスってなに？
TypeScriptのジェネリクス（Generics）は、再利用可能なコードを作成するための機能で、特定の型に依存しない柔軟な関数やクラス、インターフェースを定義することができます。ジェネリクスを使うと、同じロジックをさまざまな型に対して適用でき、型安全性を維持しながらコードの汎用性を高めることができます。

### ジェネリクスの基本
ジェネリクスは、関数やクラスを定義する際に 型パラメータ を使用します。この型パラメータは、具体的な型が指定されるまで抽象的であり、関数やクラスを呼び出すときに具体的な型が与えられます。

具体的な記載はこんな感じ
```ts
function identity<T>(arg: T): T {
  return arg;
}
```
この関数は引数 arg の型をジェネリック型 T として宣言しています。T は呼び出し時に具体的な型に置き換わります。つまりstringでもnumberでもどんな型でも可能ということですね。

```ts
const result1 = identity<string>("Hello"); 
```
```ts
const result2 = identity<number>(123);   
```
identity<string>("Hello") の場合、型 T は string に置き換わり、関数は string 型の引数を受け取り、string 型を返します。
identity<number>(123) の場合は、T は number に置き換わります。

### 型推論
ジェネリクスは、TypeScriptの型推論によって、型を明示的に指定しなくても自動的に推測される場合があります。

```ts
const result3 = identity("TypeScript"); // 
```
型推論により、明言せずともT は string になります。

### ジェネリックの活用例
ジェネリクスを使って、どんな型の配列でも処理できる関数を作成できます。

```ts
function getArrayItem<T>(arr: T[], index: number): T {
  return arr[index];
}
```
```ts
const numbers = [1, 2, 3, 4];
```
```ts
const words = ["hello", "world"];
```
```ts
const num = getArrayItem(numbers, 2); // 型は number
```
```ts
const word = getArrayItem(words, 1);  // 型は string
```

`getArrayItem<number>(numbers, 2)` では T が number となり、関数は number 型の配列の要素を返します。
同様に `getArrayItem<string>(words, 1)` では T が string となります。


また、クラスやインターフェースにもジェネリクスを適用できます。

```ts
interface Pair<K, V> {
  key: K;
  value: V;
}
```
```ts
const stringNumberPair: Pair<string, number> = { key: "age", value: 30 };
```
```ts
const booleanStringPair: Pair<boolean, string> = { key: true, value: "yes" };
```

`Pair<string, number>` は key が string で、value が number というペアを定義します。
`Pair<boolean, string>` は、key が boolean で、value が string というペアです。
pnpmの "not found: node" エラーを解決する方法

### はじめに

pnpmを使用してプロジェクトの依存関係をインストールしようとした際に、以下のようなエラーに遭遇することがあります：

```
ENOENT  not found: node

pnpm: not found: node
```

このエラーは、pnpmがNode.jsの実行ファイルを正しく認識できていないことを示しています。今回は、このエラーの原因と解決方法について詳しく説明します。

### エラーの原因

このエラーの主な原因は以下の点にあります：

1. Node.jsのパスがpnpmに正しく認識されていない
2. nvmを使用している環境での設定の不整合
3. pnpmの設定が適切でない

### 解決手順

以下の手順を順番に試すことで、エラーを解決できる可能性が高いです。

#### 1. Node.jsとpnpmのバージョン確認

まず、Node.jsとpnpmが正しくインストールされているか確認します。

```bash
node --version
npm --version
pnpm --version
```

#### 2. pnpmの設定調整

pnpmの設定を調整して、Node.jsのパスを正しく認識させます。

```bash
pnpm config set use-node-version false
pnpm config set node-linker hoisted
pnpm config set use-node-version $(node -v)
```

#### 3. PATHの調整

Node.jsのパスが正しくPATHに設定されているか確認し、必要に応じて調整します。

```bash
echo 'export PATH="/path/to/your/node/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

#### 4. nvmの設定確認

nvmを使用している場合、正しいNode.jsバージョンが選択されているか確認します。

```bash
nvm current
nvm use <適切なバージョン>
```

#### 5. プロジェクト固有の設定

プロジェクトのルートディレクトリに以下のファイルを作成し、Node.jsのバージョンを明示的に指定します。

`.npmrc`ファイル:
```
use-node-version=20.18.0
```

`.nvmrc`ファイル:
```
v20.18.0
```

#### 6. pnpmの再インストール

最後に、pnpmをアンインストールして再インストールします。

```bash
npm uninstall -g pnpm
npm install -g pnpm
```

### 結論

これらの手順を順番に実行することで、多くの場合「not found: node」エラーを解決できます。特に、プロジェクト固有の`.npmrc`と`.nvmrc`ファイルを作成することが効果的でした。

このエラーは環境設定の不整合から生じることが多いため、Node.js、npm、pnpm、nvmなどのツールのバージョンと設定を慎重に管理することが重要です。

また、チーム開発においては、これらの設定をプロジェクトのリポジトリに含めることで、同様の問題が他のメンバーに発生することを防ぐことができます。

### 追記

このエラーに遭遇した場合、まずは基本的なバージョン確認から始め、徐々に詳細な設定調整に移っていくアプローチが効果的です。また、エラーメッセージを注意深く読み、環境変数やパスの設定に特に注意を払うことが重要です。

https://pnpm.io/ja/installation
難解すぎるParserScript

:::note warn
現在、ParserScriptは非推奨です。
:::
　今回は作者の私でも悩ませる言語ParserScript 1.0のどこが難しいかを紹介します。
# 1.　BNFのように簡潔に表せない
　私が、この言語に悩んでいる理由の一つが「BNFのように簡潔に表せない」ことです。もちろん、それだからこそできることもあります。

https://qiita.com/mu-MueLangDeveloper/items/aa612d44de5298d43563

https://qiita.com/mu-MueLangDeveloper/items/3d029cf00b9d54c15fb5

　を見たら分かるんですが、どう見たってアセンブリ言語です。
　多分、よっぽどマイナーな人じゃないとアセンブリを触ったことがないでしょう。これが、難しいポイントです。「<strong>アセンブリを触ったことのない人は絶対最初の一歩で挫折する</strong>」ということです。
# 2.　頭の中に記憶しておくものが多い
　普通の言語、例えばC言語やJavaScriptなどの言語なら、この変数がどのような値になっているかが簡単にわかりますが、ParserScriptは隠れている変数

・record, vrecord, break, push, vpush, varpush, varvpush, 
　match, varmatch, downpush, number, string, down, change, 
　clear, parseresult用リスト
・call, last用スタック
・set, jump用スタック
・memo, pop用スタック

と<strong>4つ</strong>もあります。それらの状態を常に記憶していなければいけません。特に、リストの方は一つのコードを見ただけでは、何をしているのか全く分かりません。
# 終わりに
　以上のことから、ParserScriptはめちゃくちゃ難解で面倒くさいやつです。ですが、できることは多いはずです。まだ実証実験ができていませんが、ParserScriptは字句解析器、構文解析器、アセンブリ化、機械語化、全てを実装できるはずなので、それらを難しいコードを書きたくないなら、ぜひ使ってください。
EC2インスタンスタイプの種類(シリーズ)を理解しよう


<iframe width="471" height="838" src="https://www.youtube.com/embed/sIVzvCpoOEo" title="1分で解説！EC2インスタンスタイプの様々なシリーズを紹介！" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# はじめに

![ec2-instancetype-series01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/72a011b5-0ae0-106c-f7dd-7acb5fddaa61.jpeg)

インスタンスタイプの命名は大きくインスタンスファミリーとインスタンスサイズで構成されており、インスタンスファミリーはさらに

- シリーズ
- インスタンスの世代
- プロセッサーの種類や追加機能

という意味に分けられます。

特にシリーズは表記内容によって性能や用途が異なっており、大きく5つのカテゴリーに分類されます：

# 1.  汎用型インスタンス
![ec2-instancetype-series02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/f00c6a8b-2af3-3f75-4bc4-23db9a279372.jpeg)

CPUやメモリなどの性能がバランスよく取れた汎用的なインスタンスです。
とりあえず迷ったらこのタイプを選択すると良いでしょう。
コストを抑えたい場合はT系、安定性を重視したい場合はM系を選択すると良いでしょう。
検証や学習用途でよく使われるのはT系です。

# 2. コンピューティング最適化インスタンス
![ec2-instancetype-series03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/9692fbd9-75a2-1102-b40d-0d7971fe855d.jpeg)
高性能なCPUを持つインスタンスです
負荷の高い処理をするシステムで効果的です
C系がこれに該当します

# 3. メモリ最適化インスタンス
![ec2-instancetype-series04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/2d2ba6ab-117a-8bd4-b487-0bb7f2061d5e.jpeg)

メモリ処理に特化したインスタンスです
メモリの性能はR系、U系、X系、z系と高くなっていきます。
一般的にはメモリバランスの取れたR系が使われます

# 4. ストレージ最適化インスタンス
![ec2-instancetype-series05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/6b263ae2-212e-ead5-7034-2855a3227ec0.jpeg)

大容量のローカルストレージをもったインスタンスです
リアルタイム性が求められる大規模データ処理であればi系、ビッグデータ処理目的であればD系、H系を選択すると良いでしょう。

# 5. 高速コンピューティングインスタンス
![ec2-instancetype-series06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/cbebe11b-486e-6bb1-0014-ac6eb62da5dd.jpeg)

GPUやFPGAを搭載した大規模なデータ処理に特化したインスタンスです。
機械学習やディープラーニングであればP系、グラフィック処理メインであればG系を選択すると良いでしょう。

# おわりに

このように、様々な要件に応じたインスタンスが用意されています。

システム用途に応じたインスタンスタイプを選べるようにしましょう。
自宅サーバーの環境をまとめた

# 2025/05/07
サーバー機器リプレースに伴い更新

# 宣伝
ヒマつぶしにNext.jsでブログ立てたのでこっちに上げてみました。

https://www.katori.dev/posts/01966267-39fa-73ec-a082-64847a865e46

## サーバー構成

現在我が家では、Proxmoxを使用した仮想化環境を運用しています。
3台の物理サーバーでクラスタを構築していて、ライブマイグレーションなどで無停止メンテナンスが出来るようになっています。
Dockerは単純に好きでないおじさんなので基本的にイチから組んでいます。

### ハードウェア
3台のサーバースペックは次の通り。
もうちょっとvCPU数欲しいなぁとか思っているので、そのうちCPUを変えるかもしれません。
#### サーバー1台目のスペック
- **自作**
- **CPU**: Xeon E5-2689 2.6GHz 1ソケット
- **RAM**: 128GB
- **DISKS**:
  - ProxmoxのOS領域用に500GB NVMe SSD
  - データ領域用に1TB HDD × 6をZFS RAIDZで冗長化（使用可能領域5TB）
- **NIC**: Intel X520-DA2 10Gbps
- **GPU**: NVIDIA Quadro P400, NVIDIA GT710

![pve1.png](https://www.katori.dev/api/images/0196a93a-8381-74a3-afc5-b29f87650409.webp)


#### サーバー2台目のスペック
- **自作**
- **CPU**: Xeon E5-2650 v4 2.2GHz 1ソケット
- **RAM**: 32GB
- **DISKS**:
  - ProxmoxのOS領域用に256GB NVMe SSD
  - Proxmox Backup Serverのデータ領域として500GB × 3をZFS RAIDZで冗長化（使用可能領域1TB）
  - NFSで公開してProxmoxクラスタ全体のデータ領域用に2TB HDD（冗長化なし）
- **NIC**: Intel X540-DA2 10Gbps
- **GPU**: なし

![pve2.png](https://www.katori.dev/api/images/0196a93a-cd57-74a3-b231-8aadca5da950.webp)


#### サーバー3台目のスペック
- **Raspberry Pi 4 Model B Rev 1.5**
- **CPU**: Broadcom BCM2711, quad-core Cortex-A72 1.5GHz
- **RAM**: 4GB
- **DISKS**: 512GB MicroSDのみ
- **NIC**: オンボード 1Gbps
- **GPU**: オンボード

![pve3.png](https://www.katori.dev/api/images/0196a93b-31c3-74a3-acde-445d192ff9ea.webp)

### ネットワーク構成

#### 回線契約
- **契約**: enひかりクロス & MAP-E(V6プラス) + 固定IPオプション
- **プロバイダ**: enひかり
夜の混雑する時間でも6Gbps程度出るので、満足しています。

### 宅内ネットワーク
宅内のネットワークは、無線LANを除いて全てSFP+ 10Gbpsで配線しています。
ただし、ラズパイはMAX 1Gbpsなのでここだけやや遅いです。

全面リプレースしました。

https://qiita.com/katori_m/items/d09d045f308b5e867726

### 各サーバーについて
それぞれスペックに合わせて役割を変えています。

### 1台目サーバー
我が家のインフラの中心的存在。
高負荷サービスを集約していて、**nginx**を使ったhttpsリバースプロキシで外部アクセスを制御しています。

- **nginx**: httpsリバースプロキシ
- **Nextcloud, Jellyfin, Komga**: ファイル共有やメディアストリーミング、電子書籍管理など
- **ArchiveBox**: プライベートWebアーカイブとして、重要なWebページ(エロ)を保存
- **メールサーバー**: 自宅メールサーバーの運用もここ
- **DNSサーバー**（プライマリ）: 自宅ネットワーク内のDNSを担当
- **プリンター共有サーバー(CUPS)**: プリンターのネットワーク共有

その他にも、discord botなど色々動いています。

### 2台目サーバー
2台目は主に**監視**や**バックアップ**を担当。

- **InfluxDB & Grafana**: 各サーバーのテレメトリデータを収集し、視覚化して監視
- **Proxmox Backup Server**: クラスタ全体のバックアップをここで管理
- その他の軽負荷サービスもいくつか動いています。

#### Proxmox Backup Serverについて
Proxmox Backup Serverは、Proxmoxクラスタ全体のバックアップを管理するために使っています。
普通にバックアップを取るよりこっちの方が便利なので使ってます。

### 3台目サーバー
このサーバーは、ProxmoxクラスタのQuorumホスト兼セカンダリDNSサーバーにしてます。

- **DNSサーバー**（セカンダリ）: 1台目がダウンしてもネットワークが落ちないようにしてます。

#### DNSサーバーについて
AdGuard Homeを使って、DNSフィルタリングで広告ブロックを行っています。
また、AdGuardHome-Syncでプライマリとセカンダリの同期を取っています。

### 雑記
ぶっちゃけサーバーが3台もあると電気代がヤバい。
夏場とかはサーバールームが地獄の熱さになっちゃうのでエアコンはつけっぱにしないといけない。
この規模の環境動かすのは正直自己満です。ただ、VPSでこの構成組むと普通に電気代払うより高いからまあいいかなって感じ。
そのうちサーバーラックとラックマウントのATXケース買って全部まとめたい。
Java 学習記録 2日目

# 目的
この記事は以下の記事の続きです。

https://qiita.com/banana877_it/items/9b47d5ad26be57d6e0fe

Javaを学習するC言語使い一年目エンジニアのノートです。

# 前回の復習
前回の復習をさらっと。
```java
// 特別な注釈がない限りコードはJavaです。
class Main {
  public static void main(String[] args) {
    // 文末には ; をつける
    // 文章を表示する
    System.out.println("二日目も頑張った自分偉い");
    // 数値を表示する
    System.out.println(877);
    // 数値の四則演算
    System.out.println((4+3*2/1)-2%3);
    // 文字列の連結
    System.out.println("今日は" + 23 + "度です");
  }
}
```
おさらいできたところで早速本編行ってみましょう！

# 今日も頑張る
### データ型
Progateの現時点のレッスンで説明されたのは以下の3つの型です。
* **String型**……その名の通り文字列型。Sは大文字
* **int型**……integerつまり整数型
* **double型**……小数点を扱える型

StringのSが大文字の理由は今は考えてはいけないようです……。
ProgateのエディタでSystemとStringが青色になっているので関係あるのかな？

### 変数の宣言と値の代入と表示
これはC言語と似た感じですね。
変数を型名とともに宣言してあげます。
`int n;`
`String s;`
`double f;`
そして、イコールを使って代入します。
`n = 877;`
`s = "BaNana";`
`f = 8.77;`
最後にそれを表示してあげればコードの完成です。
表示まで一連の流れにしたのが以下のコード。
```java
class Main {
  public static void main(String[] args) {
    int n;
    String s;
    double f;
    n = 877;
    s = "BaNana"; // 文字列の代入は "" で囲う
    f = 8.77;
    // 変数の表示は数値と同じく "" はつけない
    System.out.println(n);
    System.out.println(s);
    System.out.println(f);
  }
}
```
この辺はC言語と同じなのですんなり入ってきました。

### 変数の初期化と更新
C言語と同じで変数の初期化もできるんですね。
基本的な文法はC言語に近いのかも……。
`int n = 877;`
`String s = "BaNana";`
`double f = 8.77;`
```java
class Main {
  public static void main(String[] args) {
      int n = 877;
      String s = "BaNana";
      double f = 8.77;
      System.out.println(n);
      System.out.println(s);
      System.out.println(f);
      // 整数型と小数点型は四則演算できます。
      System.out.println(n+23);
      System.out.println(f+1.23);
      // 文字列の連結なんかも。
      System.out.println(f+"="+s+n+".it");

      // 数値：値の変更（更新）
      n = 87;
      f = 8.7;
      System.out.println(n);
      System.out.println(f);
      // 数値：自己代入
      n = n + 13;
      f = f + 1.3;
      System.out.println(n);
      System.out.println(f);
      // 数値：省略形。他のも四則演算子の後にイコールをつける
      n += 10;
      f += 0.1;
      System.out.println(n);
      System.out.println(f);
      // インクリメント。デクリメントは--
      // double型でも1増えたり減ったりという挙動は同じ
      n++;
      f--;
      System.out.println(n);
      System.out.println(f);
      
      // Stirng型：値の変更（更新）
      s = "banananonanachiha";
      System.out.println(s);
      // String型：自己代入
      s = s + "bananachi";
      System.out.println(s);
      // String型：省略形
      s += "bananachi";
      System.out.println(s);
  }
}
```

### 変数のルール
これもC言語と似ている
良い例
* 英単語を用いる……fruits
* 中に入る値がイメージできる……fruits="apple";
* キャメルケースを使う……fruitsJuice
（これに関しては後述）

悪い例
* 数字始まり……877fruitsJuice
* 中に入る値がイメージしにくい……aaa="apple";
* スネークケース……fruits_juice
* ローマ字……furuutsuJuusu
* 日本語……フルーツジュース

その他
* 同じ名前の変数は宣言できない
* 型が違う変数同士はそのままでは代入できない
* 予約語を使ってはいけない

スネークケースはダメなんですね。
C言語では特にダメと言われていなかった気がするので気をつけます。

# まとめ
これでProgateのJava1の無料分は終わり！
次回も元気に頑張ります！

# 追記
編集リクエストを頂き、採用しようとしたのですが、うまく反映できませんでした……。
一応反映済みとなっているのですが、お礼メッセージを送れなかったので、この場で御礼をさせていただきます。
hollage0214 様ありがとうございました。
今後の記事にも反映していきます。
ParserScript-Ver-1.0公開！

:::note warn
現在、ParserScriptは非推奨です。
:::

ParserScript最初のバージョン1.0を公開しました。

（非推奨）

https://github.com/MueLangDeveloper/ParserScript-Ver.1.0

　この記事は開発中に投稿した記事の後、ParserScriptに追加した機能を紹介するので、開発中の時の記事をみていないときは

 https://qiita.com/muMueLangDeveloper/items/aa612d44de5298d43563

 で、基本情報を見てください。
 # Ver-1.0で追加された機能
  これから、ParserScriptの紹介されていない機能（予約語）を紹介していきます。
  面倒くさいので一気に予約語を書いてその後に、それがどのような機能なのかを書きます。

  ・escape
  ・noescape
  ・vrecord
  ・varmatch
  ・varmatch?
  ・varnomatch?
  ・varbreak
  ・vpush
  ・varpush
  ・varvpush
  ・downpush
  ・memo
  ・pop
  ・change
  ・clear
  ・parseresult
  ・let
  ・varset

  とまあ、こんな感じでたくさん追加されました。
  次に、それぞれの予約語にどのような機能があるのかを書きます。
  
```prs:.prs
escape ' '

# 空白や、改行など長いコードを書かなくても特定の文字を先頭から消す

noescape ' '

# escapeで指定した文字を無効にする

vrecord ""

# recordとは違い、任意の値から使うことができる

varmatch s

# varmatchの後に変数を指定することで、変数の値を使ってマッチングを行う

varmatch? b

# varmatch?の後に変数を指定し、その変数の値が偽なら対応するendへとぶ

varnomatch? b

# varmatch?の逆

varbreak s s

# varbreakの後に型、変数の名前でその変数を削除できる

vpush 2 "a"

# recordやvrecordで作られたリストの上から任意の番地に値を挿入できる

varpush s

# varpushの後の変数の値を使ってreordとvrecordのリストの最後の要素に挿入する

varvpush 2 s

# varvpushの後のrecordとvrecordのリストの上から任意の番地に変数の値を挿入できる

downpush

# recordとvrecordのリストの一番最後の値を最後から二番目の値に挿入する

memo push "a"

# memoの後のコードを実行せずにスタックに積む

pop

# memoでスタックに積んだコードを取り出して実行する

change 1 true

# recordとvrecordのリストの上から任意の番地の文法がマッチしているかを記録するところを任意の値に変える

clear

# recordとvrecordのリストを空にする

parseresult

# recordとvrecordのリストの最後をparseresultが来た時点からマッチングする

let s str

# letの後に、型、名前を指定してその型の変数を作成する

varset s str "abc"

# varsetの後に、型、名前、値を指定してその型の変数に値を代入する
```
　以上が、Ver-1.0が公開された時に追加された機能です。
# 終わりに
　この記事を書いている途中で、vletとvarvsetを思いついたので、Ver-1.1に実装しようと思います。
【コンピューター技術】NWのソケットの仕組みについて振り返りを実施する

## ソケットとは
ソケットは「**一般にクライアントとサーバーの対話で使用される仕組み**」のことです。
いわば、アプリケーション(プログラム)とネットワークをつなげる「**接続口**」のことで、IPアドレスとアプリケーションを識別するポート番号の組み合わせとも考えることができます。

通常のシステム構成では、一方のマシンにサーバーを、 もう一方のマシンにクライアントを置きます。 クライアントはサーバーに接続して情報を交換し、その後切断します。

ソケットには定まっているのイベントの流れがあります。 コネクション型クライアント/サーバー・モデルでは、 サーバー・プロセス上のソケットはクライアントからの要求を待ちます。 これを行うため、サーバーはまず、 クライアントがサーバーを探せるようにアドレスを確立 (バインド) します。 アドレスが確立されると、サーバーはクライアントがサービスを要求してくるのを待ちます。 クライアントとサーバーとの間のデータ交換は、 クライアントがソケットを経由してサーバーに接続しているときに行われます。 サーバーは、クライアントの要求を実行し、クライアントに応答を送信し返します。
　下記にソケット通信の参考ページを示します。

https://www.ibm.com/docs/ja/i/7.4?topic=programming-how-sockets-work

下記の記事も非常にわかりやすいです。

https://ameblo.jp/bakery-diary/entry-12754672383.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/423b5878-f077-5c91-15ee-3a93738a1ba8.png)

上記の流れが、コネクション型ソケットの一般的なイベント・フローになりますが、具体的にソケットを使った通信の流れについてそれぞれ見ていきましょう。

### １．ソケットを作る (socket() API)
→ 通信をするための「通路」を用意します。これは電話をかけるために携帯電話を手に取るイメージです。

### 2．ソケットに名前をつける (bind() API)
→ サーバー側が「私はここにいますよ」と言うために、IPアドレスとポート番号（番号）をセットします。電話番号を自分の電話に割り当てるようなものです。

### 3．電話をかける準備をする (listen() API)
→ サーバーが電話の着信を待つ状態にします。電話を「待ち受けモード」にするような感じです。

### 4．クライアントが接続する (connect() API)
→ クライアント（電話をかける側）が、サーバーに「接続したい！」とリクエストを送ります。これが電話をかける行為に似ています。
この部分でTCPの場合は、「**TCPハンドシェイク**」を行いTCP接続を確立します。

### 5．サーバーが電話を受ける (accept() API)
→ サーバーがクライアントのリクエストを受け取って、通信を開始します。電話に出ることです。

### 6．実際にデータをやり取りする (send(), recv() などのAPI)
→ クライアントとサーバーがデータを送ったり受け取ったりします。これは電話で会話をするようなものです。

### 7．電話を切る (close() API)
→ 通信が終わったら、ソケットを閉じて「電話を切る」ようにします。

つまり、ソケット通信は「サーバーが電話をかけられる状態にして、クライアントが電話をかけて、会話（データ通信）をして、最後に電話を切る」という流れになります。

## TCP/IPの参照モデル
アプリケーション層とその下位のトランスポート層/ネットワーク層との関係性を見ていきましょう。
通信モデルの中でアプリケーション層とトランスポート層の間に「**ソケットAPI**」というものが有ります。
ソケット API は、 通信モデルの中の層ではありません。ソケット API を使用することにより、 アプリケーションは一般的な通信モデルのトランスポート層やネットワーク層と対話することができるようになるわけです。 以下の図の矢印は、ソケットの位置とソケットが提供する通信層とを示しています。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/e33c02c8-a216-d2b8-9227-bba81175f5f2.png)
linuxのディレクトリ構成についてまとめ

FHSといわれる標準規格がある

### /bin
コマンドの実行ファイルが格納

### /boot
システムの起動に必要なファイルが配置されている。

#### /dev
デバイスファイルが配置されている。

### /etc
システムやアプリケーションの設定ファイルが配置されている。
通常は管理者権限が必要な場所に保管されている

 ### /lib
 /binや/sbinなどに置かれたコマンドが利用するライブラリが格納されている。

 ### /proc
 プロセスCPU使用率やメモリ使用率等の情報が保存されている。※仮想ファイルシステムで管理している為、ファイルは存在しない。

### /media
 リムーバブルメディア(CD/DVD)のマウントポイントとなっているディレクトリが配置されている。

### /opt
ソフトウェアのインストール先となる。(自身でインストールをしたソフトなど)

### /proc
プロセスCPU使用率やメモリ使用率等の情報が保存されている。※仮想ファイルシステムで管理している為、ファイルは存在しない。
 
### /root
rootユーザのホームディレクトリ

### /sbin
 システム管理者が使用するコマンドの実行ファイルが格納されている。

### /tmp
 一時ファイルが配置されている。

### /usr
ユーザーが共有するデータが配置されている。(コマンドやライブラリ)

### /var
システム起動中に可変されるデータが配置されている。(logなど)

### /home
ユーザーのホームディレクトリ

### /mnt
一時的なマウントポイント(アクセス可能ポイント)にするためのディレクトリ

### /run
実行されているプロセスに関連する情報が配置されている。
Node.jsのunzipperで解凍したらファイルが少なかった件

## はじめに

初めてunzipperを使いました
unzipperの最も基本的な使い方ですが、初歩の初歩で躓いてしまいました
具体的にはZIPを解凍したら解凍先のディレクトリにあるはずのファイルがなかったという感じです
エラーが出ないので一瞬気付きにくいですけど同じ問題起きた人いますか？

## 問題のソース

```js
fs.createReadStream('test.zip')
  .pipe(unzipper.Extract({ path: 'output' }));
```

## 解決したソース

```js
  const directory = await unzipper.Open.file('test.zip');
  await directory.extract({ path: 'output' })
```

## 再現

100個ファイルを作成してZIP化する

```js
touch file_{1..100}.txt
zip test.zip file_*
```

unzipperを使ってZIPを解凍する

```js
fs.createReadStream('test.zip')
  .pipe(unzipper.Extract({ path: 'output' }));
```

解凍先を開く

```shell
$ ls output
file_1.txt   file_100.txt  file_12.txt  file_14.txt  file_16.txt  file_18.txt  file_2.txt   file_21.txt
file_10.txt  file_11.txt   file_13.txt  file_15.txt  file_17.txt  file_19.txt  file_20.txt  file_22.txt
```

100ファイルあるはずが16ファイルしかない＞＜

## おわり

unzipper.Openを使えば良いと思います
公式ドキュメントでもunzipper.Openが上の方に紹介されていますし、fs.createReadStreamを使う方法はどうやら(legacy)と書いてある（？）

### 補足

調べていくとわかると思うんですがfs.createReadStreamを使う方法だと解凍時ファイルを作成するところで躓いているっぽいです
ディレクトリかファイルか判定してディレクトリを作る処理を明示的に書いてあげれば直りますね
CUIのようなポートフォリオサイトを作ってみた

# CUIのようなポートフォリオサイトを作ってみた
VercelにデプロイしてドメインはRoute53で管理している構成です。LinuxのCUIを模したページ構成で実装しました。ページの実装だけで力尽きたので、SEOやfaviconなどはまだ未設置です。

リンク↓

https://mitate-gengaku.com


## 動機
SNSや個人開発などのリンクをまとめた自分だけのポートフォリオサイトを前々から作りたいなと思っていたので、連休期間に作ってみました。

## 技術スタック
下記を使って作りました。1ページのみのサイトなのでAstroが最適だと思いましたが、まだ使ったことがないので今回は慣れているReact・Next.jsにしました。Jotaiを使い`SessionStorage`に永続化するデータの保存しています。(タブを閉じるとデータが消えます)。

- React・Next.js
- TailwindCSS
- TypeScript
- Vercel
- Jotai
- @radix-ui/primitives
- shadcn/ui
- Route53(ドメイン)

またサイト構築の上で使用したツール・アセット・ジェネレーター系のサイトは`reference`を入力すると表示されます。

## 動作画面
画像ではわかりにくいので、実際にサイトに訪れていただいたほうが良いかもしれません。
![portfolio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/f317a567-55f9-2392-bdcd-8b51cef300aa.png)
## 今後の展望
今後コマンドの履歴機能、ブログ機能、フォーム
のバリデーションなど追加できればいいなと思っています。

## 最後に
おかしい挙動をしたとかリンク先が間違っているとかあればコメントで教えてください。
よろしくお願いいたします。
二次関数の曲線距離を求めたい

## 二次関数の曲線距離を求めたい
二次関数の曲線距離を求めたくなったときのためのものです。

## コード
初期値a,目標値b,増加分lamとして二次関数の距離を求めてみます。
~~~
import math
import numpy as np

def F(x):
    return x**2

def pytha(x1, y1, x2, y2):
  return np.sqrt((x2 - x1)**2 + (y2 - y1)**2)

a = 0
b = 1
lam = 0.01

total_sum = 0  # 和の初期値

x1 = a
y1 = F(x1)

while x1 <= b:
    x2 = x1 + lam
    y2 = F(x2)
    distance = pytha(x1, y1, x2, y2)
    total_sum += distance  # F(x) の和
    print(f"{x1:.10f}, {y1:.10f}, {x2:.10f}, {y2:.10f}, {distance:.10f}")
    x1 = x2
    y1 = y2

print(f"F(x) の和: {total_sum:.10f}")
~~~

## 方程式
曲線の距離には方程式があります。
~~~math
L = \int_{a}^{b}\sqrt{1+f'(x)^2}dx
~~~
SQLについて学び直したので備忘録

以下の書籍でSQLを基礎から学び直したので、ちゃんと理解せずに使っちゃってたなと思った部分をまとめます。
https://amzn.asia/d/8RJlRP4
## 項目
- サブクエリ

### サブクエリについて
#### サブクエリ
サブクエリは「使い捨てのビュー」のようなものです。
※ビューはよく使うSELECT文を保存しておき、実際にあるテーブルと同じようにVIEW名で使えるようにしたもの。
`select A, B from view_name`

サブクエリはビューをそのままFROM句に持ち込むような形で表現します。
```c
SELECT
    shohin_category,
    count
FROM (
    // FROM句の中でSELECTを使用する
    SELECT
        shohin_category,
        COUNT(*) AS count
    FROM
        shohin
    GROUP BY
        shohin_category
);
```

このように入れ子構造にしてSELECT文を作ることができます。
このSQLではまずFROM句の中のSELECTが実行され、その後に外側のSELECT文が実行される、という順序になっています。

#### スカラ・サブクエリ
「スカラ」とは「単一の」という意味で、その名の通り、**必ず1行だけの戻り値を返す**という制約をつけたサブクエリのことです。
```c
// 販売単価が全体の販売単価の平均よりも高い商品を抽出する
SELECT
    *,
FROM
    shohin
WHERE
    hanbai_tanka > (SELCT AVG(hanbai_tanka) FROM shohin);
```
スカラ・サブクエリは単一の結果しか返さないので、上記のようにFROM句以外の場所でも使うことができます。

#### 相関サブクエリ
相関サブクエリはテーブル全体ではなく、テーブルの一部のレコード集合に限定した比較をしたい時に使います。
```c
// 商品カテゴリごとに商品の平均販売単価を出して、それよりも販売単価が高い商品を抽出する
SELECT
    *
FROM
    shohin AS s1
WHERE
    hanbai_tanka > (
        SELECT
            AVG(hanbai_tanka)
        FROM
            shohin AS s2
        WHERE
            s1.shohin_category = s2.shohin_category            
    );
    
```
それぞれの商品カテゴリのなかで平均販売単価が計算され、それが商品テーブルの各レコードと比較されるため、相関サブクエリはレコードに対して実質的に1行しか返していない、とみなされます。
2024年度上期 - 振り返り

# 2024年度上期 - 振り返り

## はじめに

[2023年度下半期 - 振り返り](https://qiita.com/teppei12345/items/852e4d92c3d25778e44b)で過去の私が下記の通り意思表示をしていたので、今期もやります。  

**今後は定期的にこのような機会を設け、振り返りを実施したいと思っています。**  

## KPT

私は業務で指摘されたことなどは独自のKPTテーブルに蓄積し、定期的に振り返るようにしています。  
今回は2024年度上期？の業務でいただいたご指摘をもとに自分自身を振り返り、猛省しようと考えています。  

## 振り返り

### ドキュメントの完成度や品質の判断

こちらはSIで着手しているプロジェクトにて、発生した問題です。  
私自身、ドキュメントを作りこむことが多く、上長から「作りこみすぎ」とご指摘をいただくことがあります。  
部長から頂いたありがた～いアドバイスを下記に残します。  

1. 指示者と納期を合意  
2. 作業期間の約6割経過後に一度レビューしてもらう。  
3. 考え方を支持者と合意  

**※ 「2.」では、「方向性があっているか」の確認するためのものであるため、資料の完成度は5～6割程度でOK**  
**※ 「2.」の頻度や完成度に関しては、ケースバイケースで臨機応変に対応**  

### こまめな報告を心がける

こちらもSIで、発生した問題です。  
内部での報告はできていましたが、お客様に粒度の細かい作業進捗報告はできていませんでした。  
そのため、報告には下記を意識します。  

* 何を実施したか  
* どのような結果になったか  
* 今後どのようなことを実施するか  
* 相手(お客様)にどのような行動を実施してほしいか  

### 既存機能の修正にはデータの修正も

またまたこちらもSIで発生した問題です。  
私は普段本番環境にリリースしたサイトの運用保守を実施しているのですが、既存機能の修正のほかにデータの書き換えまで気を遣えていませんでした。  
そのため、データの不整合や再度のリリース作業などの問題が発生しました。  
したがって、下記を意識します。  

**既存サイトの修正には、「デグレ確認」「データの書き換え」は要チェック**  

### 作業手順は先方と認識を合わせる

こちらはお客様環境のデータバックアップを取得する際に発生した問題です。  
データをバックアップする作業を実施した際に他作業も実施したため、バックアップ作業の順序が前後してしまいました。  
社内レビューを通して、本番作業手順をばっちり準備していましたが、「バックアップするのだからサービスにアクセスしないだろう」と私は思い込んだ状態で本番作業を迎えました。  
しかし、お客様がサービスにアクセスできることを確認したことで、お客様に不安な思いをさせ、バックアップ作業を再度実施するという手戻りを招いてしまいました。  
上記を振り返り今後は下記を意識します。  

1. 作業手順や順序について、先方と認識を合わせる  
2. 必要であれば、サービスの停止やアクセス制御を設定する  

### 変更の時は細かい連絡を意識する

こちらは社内業務で発生した問題です。  
[インプリム](https://implem.co.jp/)では毎年10月に[インターン生](https://www.wantedly.com/companies/implem/post_articles/878884)を受け入れています。  
実際に業務に着手していただきながら、「働くこと」を考える良い機会になるという考えのもと社内で席替えを実施しました。  
しかし、事前に席が変更になる方を含めた打ち合わせを実施することなく、連絡してしまったため、混乱を招いてしまいました。  
そのため、今後は下記を意識します。  

**大前提：「リーダや代表」と「影響を受ける人」を事前に選定し、事前のこまめな連絡をする**  

1. 影響を受けるメンバーのリーダーや上長には「いつ」「何を」行う予定かを事前に話す  
2. 全体に「いつ」「何を」行う予定かを連絡する  
3. 関係者間で「いつ」「何を」行うのか決定する  
4. 影響を受けるメンバーのリーダーや上長には決定後の事後通知とする  
5. 全体に決定事項を連絡する  

**※ 「3.」の「関係者」について、影響を受けるメンバーのリーダーや上長に決定事項の事前連絡の場合もあれば、決定まで一緒に活動する場合もある**  

### 複数選択肢がある場合の相談

最後はSIで発生した問題です。  
私がアサインされているプロジェクトでは、要件や仕様が明確ではない課題がたくさんあり、その都度明確にしています。  
そして、私は人へのプレゼン力が低くいです(特に、ドキュメント作成能力)。  
そのため、毎回苦労しているのですが、今回お客様に一目でわかるようなドキュメントを作成するというご指摘をいただきましたため、今後は下記を意識します。  

**プレゼンなど相手に何かを理解してもらう際には、図や絵を用いて視覚的に理解できるようにする**  

## さいごに

いかがでしたでしょうか。  
本記事の内容は外部向け、というよりは自分自身の振り返りが主な内容ですが、同じ経験をされた方や反面教師として参考にされる方などには需要はあるのかも・・・？  
今後も定期的に自身の行いを振り返り、猛省する機会を設けます！  

**さらに向こうへ！Plus Ultra！！**
GitHubのOrganization配下リポジトリがクローンできない場合の対処

### 結論
GitHubのOAuthアプリ認証設定をOFFにする。  
（不特定/多数のメンバーが入るOrganizationではやめた方が良い）
  
### 問題
普段利用しているMacbookのSourceTreeアプリから、招待されたOrganization内のリポジトリをクローンしようとしたところ、`Repository not found`エラーが出てクローンできなかった。  
  
※自分が作成したリポジトリ（private, publicいずれも）や、他の組織の作成したリポジトリはクローンできていた。

### 環境  
Macbook Pro 16inch（M1 Max）
macOS Monterey  
GitHub
SourceTree

### 試したこと（解決しなかった）
- #### GitHub Organizationの権限変更
自分のOrganizationでの権限がMember権限だったのをOwner権限に変更した。  

- #### Organizationのベース権限をWriteにした。  
設定 > Member privileges > Base permissionsを「Read」から「Write」に変更した。

- #### SSHキーの作り直し  
元々SSHキーは登録していたが、ssh-keygenコマンドでSSHキー（パスフレーズ付き）を作り直し、SourceTreeとGitHubに再登録した。  

- #### Personal Access Tokenの作り直し  
GitHubのPersonal Access Token（Fine-grained tokens）を再生成し、SourceTreeに再登録した。  
Tokens(classic)でも試した。  

- #### GitHub Desktopをインストール  
GitHub Desktopをインストールし、ログイン、クローンした。  
（クローンまではできたが、フェッチ・プル・プッシュができなかった。）  

- #### PC再起動  
SSHキーやPersonal Access Tokenを再登録した後にMacを再起動した。

- #### ターミナルでクローン  
ターミナルのgitコマンド（SSH）でリポジトリをクローンしようとした。

### 解決した方法  
Organizationの設定からOAuthアプリの認証設定をOFFにしたところ、フェッチ・プル・プッシュできるようになった。  

Organizationの「Setting」  
=> サイドメニュー内、Third-party Accessの項の「OAuth app policy」  
=> 「Third-party application access policy」を「No restrictions」に変更

GitHubのOAuthを使う外部アプリを認証する機能があり、認証なしでアプリを使えるように設定した。デフォルトは認証あり。  
本来なら外部アプリからOrganizationのリポジトリにアクセスしようとしたときに、Organizationの管理者に承認依頼が飛ぶ？らしい。（今回は確認できず。）  

**（注意）今回は身内メンバーのOrganizationだったのでこの設定で済ませましたが、当然セキュリティ的にはマイナスなので、もし他に方法がある場合は避けた方が良いです。**  
  
### 参考  
- OrganizationのOAuthアプリ認証設定について
  https://github.com/atom/github/issues/1010#issuecomment-422882361  
  
  https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/limiting-oauth-app-and-github-app-access-requests  

- OAuthアプリの承認依頼について
https://docs.github.com/en/organizations/managing-oauth-access-to-your-organizations-data/approving-oauth-apps-for-your-organization
(SSD1306)M5NanoC6にM5UnitGLASS2をインストールして遊ぶ。


●　ライブラリに移動
------------------------


![o_coq513.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9e2213e6-6cca-0fc7-bd89-68bd61109427.jpeg)


●　M5UnitGLASS2をインストール
------------------------

![o_coq515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5bea8c3c-9897-3e93-4a26-b1f33685b376.jpeg)
三項演算子の省略形には気をつけろ

## 初めに

PHPやjavascriptなどの三項演算子で
```javascript
const hoge = x ? x : y
```
などと書く場合に省略形として
```javascript
const hoge = x ?? y
```
とする場合がありますが、この二つの結果が違ってくる場合があります

## 実際に試してみる
例えば以下の場合は同じ結果です
```javascript
const x = 1
const y = 999
console.log(x ? x : y)
> 1

const x = 1
const y = 999
console.log(x ?? y)
> 1
```

しかし`x = 0`の場合
```javascript
const x = 0
const y = 999
console.log(x ? x : y)
> 999

const x = 0
const y = 999
console.log(x ?? y)
> 0
```
となり結果が異なります

## なぜか

`??`は正式名称`Null合体演算子`と言い、名前の通りnull(undefined)かどうかを見てるためです

## 終わりに

この結果から、変数に0や空文字がありえて、かつ0や空文字もfalseにしたい場合は
```javascript
x ? x : y
```
もしくは
```javascript
x || y
```
を使ったほうがいいと思います
言語によってはエルビス演算子`?:`でも良いかと思います
picoCTF 2019 writeup First Grep

## First Grep (General Skills)

Can you find the flag in file? This would be really tedious to look through manually, something tells me there is a better way.

添付ファイル
・file


タイトルより、grepを使いたくなるほど大量の文字が並んでいると推測できる。
```
$ file file
file: ASCII text, with very long lines (4200)
```
stringsとgrepでフラグを探す。
```
$ strings file | grep pico
picoCTF{grep_is_good_to_find_things_f77e0797}
```

フラグが得られた。

`picoCTF{grep_is_good_to_find_things_f77e0797}`
M5NanoC6にM5Unifiedをインストールして遊ぶ。



●　ライブラリに移動
------------------------------

![o_coq513.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/100ee0d9-51e9-a903-8333-f5b8bd6d8753.jpeg)



●　M5Unifiedをインストール
------------------------------

![o_coq514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b34401fd-ef96-a186-616b-ae2bf44470ff.jpeg)
コンテナがexitedになって困った時の対処方法

コンテナがexitedになって困った話とその対処
まず以下を実行してコンテナのIDを調べる
```
docker ps  -a
```

そしてexitedになった原因を探るべくコンテナのログを調べる
```
docker logs {{コンテナID}}
```
するとこんなエラーが出ていた
```
initialize specified but the data directory has files in it. Aborting.
```
翻訳すると
```
initialize が指定されましたが、データ ディレクトリにファイルがあります。中止します。
```
:::note info
なのでmysql直下のdataフォルダを削除した
:::

それからコンテナを起動しなおすとうまく行った

参考
https://zenn.dev/sinozu/articles/8c51091af73cd1b386b8
https://qiita.com/jun_kato/items/3ae2db42ef7f1d0cca99
https://qiita.com/SyoInoue/items/41f0f40f2cb6e7605731
Terraformでパスワードを作成する

## はじめに
Terraformを使用して安全なパスワードを生成する方法を解説します。この手法は、クラウドリソースの自動プロビジョニングにおいて、セキュアな認証情報の管理に役立ちます。

## Terraformでパスワードを生成する
### パスワード生成のコード実装

以下のTerraformコードは、`random_password`リソースを使用して、24文字の英数字パスワードを生成します。

```hcl
resource "random_password" "this" {
  length  = 24
  special = false
}

output "password" {
  value     = random_password.this.result
  sensitive = true
}
```

このコードでは、`length`パラメータでパスワードの長さを指定し、`special`パラメータを`false`に設定することで特殊文字を除外しています。

### セキュリティ考慮事項

生成されたパスワードは機密情報なので、`sensitive = true`オプションを設定しないとエラーになります。`sensitive = true`オプション使用することで、生成されたパスワードは機密情報として扱われ、`terraform apply`の出力には表示されません。これは、CI/CDパイプラインでの使用時に特に重要です。

### パスワードの取得方法

生成されたパスワードを表示するには、`terraform output`コマンドを使用します：

```console
terraform output password
```

このコマンドにより、生成されたパスワードが表示されます。

## 重要な注意点

1. **ステートファイルのセキュリティ**: Terraformのステートファイルには、生成されたパスワードが平文で保存されます。このため、ステートファイルのセキュリティは極めて重要です。

2. **リモートステートの利用**: セキュリティを強化するために、暗号化されたリモートステートの使用を強く推奨します。これにより、機密情報の保護が強化されます。



## まとめ

Terraformを使用したパスワード生成は、インフラストラクチャ管理の自動化とセキュリティの両立を可能にします。ただし、生成されたパスワードの適切な管理と、ステートファイルのセキュリティには十分な注意が必要です。

## 確認をした環境
- Terraform v1.9.2
- hashicorp/random v3.6.3

## 参考
https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password
Pantone Color of the Year 2025: Future Dusk

The world of colour has been a buzz with excitement as Pantone unveils its Pantone Colour of the Year 2025, Future Dusk. A dark, moody hue with rich purple undertones, Future Dusk symbolises a world in transition, perfectly capturing the interplay between the familiar and the futuristic. This dramatic, versatile shade evokes feelings of calm, mystery, and possibility, making it an ideal colour for both digital and offline creative applications.

In this article, we will explore the inspiration behind Pantone Colour of the Year 2025 Future Dusk, discuss its emotional impact, and provide practical tips for incorporating it into both digital and offline marketing strategies. Read More: https://www.webhooters.com/pantone-colour-of-the-year-2025-future-dusk/
MLS合格日記

# はじめに
私はAWSを使い始めて今年で約2年半になります。
文系出身の元新卒エンジニアです!
新卒からの2年間で、Cloud Practitioner, SysOps,DVA,SAA,SCSを取得してきました。
前回初めのspecialtyに挑戦し合格したので、今回はMLSを受験することにしました。

# MLSとは
AWS Certified Machine Learning - Specialtyとは
>組織がクラウドイニシアチブを実装するための重要なスキルを持つ人材を特定して育成するのに役立ちます。AWS Certified Machine Learning - Specialty を取得すると、AWS で機械学習 (ML) モデルの構築、トレーニング、チューニングおよびデプロイに関する専門知識を認定します。

https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/

機械学習や最近はやりのAIについて問われました。
受験料は300 USDです。
時間は170 分で、65問出題されます。
テストセンターや、自宅で受験することができます。

# 勉強方法
私は毎回とにかく問題を解きまくるスタイルです（笑）
と前回のように言いたいところですが、今回はそうはいきませんでした…
問題を解いても機械学習についての前提知識がないために全く分からず、解説を読んでもピンとこないので最初から問題を解くのは無理だと悟りました。
なので今回は[G検定の書籍](https://www.amazon.co.jp/dp/4815622752?ref=ppx_yo2ov_dt_b_fed_asin_title)を購入し、機械学習の基礎から学ぶことにしました。
本で読んでもわからないところは[Youtube](https://youtu.be/OFMaQBV3fp4?si=u6ZsNbgQt-Ml6Dp7)の動画を見て勉強しました。
その後はお馴染みの[Cloud Licence](https://techstock.jp/)で問題を何週もするスタイルでいきました。

# 問題傾向
AWSのサービス以外の問題も結構出題されました。
機械学習の基礎的な知識も求められるので、2割機械学習の知識8割AWSのサービス絡みの問題が出るイメージです。

## 合格
全然分からなすぎてとにかくやる気が出ませんでした（笑）
なのであまり勉強できずにいました。
本番ではあまり解けた感覚はありませんでした。
ただ、CloudLicenceの問題を数問見たなあという感じです。

# 最後に
結構ギリギリ受かったなという感覚でした。
今までの業務であまり触れてこなかったサービスが多かったので難しかったです。
前回のSCSよりは難しかったですね…
ただ、機械学習を普段から勉強している方やG検定を受けた経験がある方は勉強しやすいと思います！
Eclipseとは？その概要と用途について解説

<br>

## ■ はじめに
<br>

Eclipseとは、**統合開発環境**（IDE[^1]）の一つのことを指します。
主にJava開発を中心に使用されていて、多くのプラグインが提供されているため拡張性が高く、
Java以外にもC/C++、Python、PHP、Webアプリケーションなどの多様な開発に対応しています。

本記事ではEclipseの基本的な概要、何ができるのか、
そして実際にどういった場面で活用されているのかについて解説します。

## ■　目次
<br>

1. [Eclipseとは？](#1-eclipseとは)
2. [Eclipseでできること](#2-eclipseでできること)
3. [Eclipseのメリット](#3-eclipseのメリット)
4. [Eclipseのデメリット](#4-eclipseのデメリット)
5. [まとめ](#5-まとめ)


## 1. Eclipseとは？
<br>

EclipseはIBM社によって2001年にJava開発のために開発されたIDEですが、
その後はオープンソースプロジェクトとして成長しており、様々なプログラミング言語やテクノロジーに対応するようになりました。

**Eclipseの特徴**
- **オープンソース**で、誰でも無料で利用可能
- **拡張性**が高く、多数のプラグインにより機能を追加できる
- 主にJava開発に使用されるが、他の言語にも対応
- **クロスプラットフォーム**（Windows、macOS、Linux）で動作

## 2. Eclipseでできること
<br>

### Javaの開発

Eclipseは主にJavaの開発環境として広く使用されており、以下のような機能を提供しています。

- **コード補完機能**
    - 入力中に適切なコード候補を表示し、コーディングを効率化

- **デバッグ機能**
    - ブレークポイントを設定し、ステップ実行や変数のウォッチ

- **プロジェクト管理**
    - 複数のJavaプロジェクトを一つのワークスペースで管理し、ビルドパスや依存関係の設定を容易に


### 他のプログラミング言語への対応

EclipseはJavaだけでなく、数多くのプログラミング言語にも対応可能です。

- **C/C++**
    - Eclipse CDT（[^2]）プラグインを利用することでCやC++の開発環境として

- **Python**
    - PyDevというプラグインを使うことで、Pythonのコード補完やデバッグを実行

- **PHP**
    - PHP開発のためのプラグインも存在し、Webアプリケーションの開発などに

### Webアプリケーションの開発

また、EclipseはWebアプリケーションの開発にも対応しています。
Javaを使用した**サーバーサイド開発**や、HTML、CSS、JavaScriptを使用した**フロントエンド開発**も可能です。
また、**Eclipse Web Tools Platform (WTP)** プラグインをインストールすることで、動的Webプロジェクトの作成や、Tomcatなどのサーバーでの動作確認も簡単に行うことができます。

### Gitなどのバージョン管理との連携

Eclipseは、GitやSubversionといった**バージョン管理ツール**との連携がスムーズに行えます。
Eclipse内でリポジトリのクローン、コミット、プッシュ、プルなどの操作が可能なため、
開発チームでの効率的な作業を行うことができます。

Gitのコマンドについて詳しく知りたい方は[こちら](https://qiita.com/e-tak/items/1734d1d920d46b4fe8fb) の記事

### プラグインによる機能拡張

Eclipseの大きな強みは、何と言っても**拡張性**でしょう。
開発に必要な機能はプラグインを通じて必要に応じて追加することができ、以下のような拡張が可能です。

- **テストツールの統合**（JUnit、TestNGなど）
- **データベース接続ツール**（SQL開発用プラグイン）
- **クラウドツールの統合**（AWS、Google Cloudなど）

## 3. Eclipseのメリット

### 無料で利用できる

Eclipseはオープンソースなので**誰でも無料で**利用可能です。
Java開発のツールとして業界で広く使われており、企業や個人を問わず多くのエンジニアが使用しています。

### 豊富なプラグインと拡張性

上記でも説明した通りEclipseの拡張性は非常に高く、公式やコミュニティから提供されている**数多くのプラグイン**を利用することで
様々なプロジェクトに応じた環境を整えることができます。
プラグインのおかげでJava以外のプログラミング言語や、フレームワーク、データベース管理、クラウドサービスとの統合も容易になります。

### クロスプラットフォーム対応

EclipseはWindows、macOS、Linuxで動作し、**クロスプラットフォーム**対応の開発環境です。
異なるOSを使用しているチームメンバーがいても、同じ開発環境を利用できるため、開発プロセスが一貫します。

## Eclipseのデメリット
<br>

### 初期設定やプラグインの管理が複雑

Eclipseは機能が豊富で拡張性が高い反面、**初期設定やプラグイン管理がやや複雑**であるという面もあります。
特に初心者にとっては、必要なプラグインの選定や設定に時間がかかることがあります。
開発環境の構築においては必須の作業となるため、詰まってしまうこともあります。

### 動作が重くなることがある

Eclipseは多機能のため大規模なプロジェクトや多数のプラグインを使用していると、
メモリ消費が多くなる傾向がありPCの**動作が重くなる**ことがあります。

その際は不要なタブを閉じたりガベージコレクションを利用するなどして対策しましょう。

## 5. まとめ
<br>

- Eclipseは、Javaを中心とした**総合的な開発環境**として多くの開発者に利用されてる。
  - 拡張性やオープンソースのメリットを活かして、多種多様なプロジェクトに対応できる強力なツール。
<br>

- 初期設定や動作の重さといった課題もあるが、適切な設定と環境整備の上で運用することで効率的な開発を実現可能
<br>

- Javaの開発を始めたい方や、複数言語や技術を組み合わせたプロジェクトを行いたい方にとっての選択肢になる

[^1]:Integrated Development Environment
[^2]:C/C++ Development Tooling
RPAツールを使った定型業務の自動化入門

<br>

## ■ はじめに
<br>

RPA (`Robotic Process Automation`) とは繰り返し行う定型業務を自動化することで、
業務効率を大幅に向上させるツールです。特に手作業でのエラー削減や業務時間の短縮であったり、
生産性の向上といった効果が期待できるため、業務効率化の向上において重要な役割を果たすツールです。

本記事ではRPAの基本や具体的な製品やツールの特徴、実際の活用例まで解説します。

## ■ 目次

1. [RPAツールの種類と製品紹介](#1-rpaツールの種類と製品紹介)
2. [RPAでできること](#2-rpaでできること)
3. [RPAの業務での活用例](#3-rpaの業務での活用例)
4. [まとめ](#4-まとめ)

## 1. RPAツールの種類と製品紹介
<br>

RPAツールにはさまざまな製品がありますが、それぞれに強みや特徴があります。
ここでは代表的なRPAツールをいくつか紹介し、特徴を解説します。


  | ツール名                 | 特徴                         | 向いている業務                       |
  |----------------------|---------------------------|---------------------------------|
  | UiPath               | 直感的な操作、無料版あり        | デスクトップ操作、Excel作業             |
  | Automation Anywhere   | エンタープライズ向け、AI対応     | 大規模な企業のバックオフィス業務          |
  | Blue Prism           | セキュリティ重視、カスタマイズ性高い | 高水準のセキュリティが求められる業務         |
  | Microsoft Power Automate | Office 365との相性が良い     | Office 365を使った業務の自動化          |
  | MuleSoft RPA         | API統合、Salesforceとの連携が強力 | 顧客データの更新、システム間のデータ連携  |

他にも数々のRPAツールが存在します。
RPAのメリットを最大限活用するためにはそれぞれの特徴や向いている作業を見極めて、
必要な業務に適切なRPAツールを導入することが求められます。

## 2. RPAでできること
<br>

上記で紹介したようなRPAは、人間が行う恒例、定型業務を効率よく自動化することができます。
自動化の具体的な作業例として以下のようなものが挙げられます。
<br>

- **データ入力の自動化**  
  ExcelやWebフォームへのデータ入力を自動化することで入力ミスを防ぎ、業務時間を大幅に削減。
<br>

- **定型的なレポート作成**  
  定期的なレポート作成も自動化可能であり、様々なシステムからデータを収集してレポートを生成。
<br>

- **メール送信の自動化**  
  特定の条件に基づいてメールを自動送信し、顧客への定期通知や社内報告の効率化。
<br>

- **システム間のデータ連携**  
  異なるシステム間でデータを自動的に転記することで手動作業を削減し、人為的ミスを防ぐ

## 3. RPAの業務での活用例
<br>
RPAの導入によって、さまざまな業務を効率化することができます。<br>
自動化の具体的な業務内容例として以下のようなものが挙げられます。
<br>

- **請求書処理の自動化**  
  経理業務では、請求書の作成・送信、支払い期限の管理などを自動化し、経理担当者の作業時間を削減。
<br>

- **カスタマーサポートの効率化**  
  FAQ対応のチャットボットや定型文の問い合わせへの自動返信をRPAで実現し、カスタマーサポートの対応時間を削減。
<br>

- **データ解析の前処理**  
  データの収集やクレンジングを自動化することで、データ解析プロセスをスムーズに進めることができる。
<br>

- **人事業務の自動化**  
  人事管理システムへのデータ入力や採用プロセスにおける候補者管理の一部を自動化することで、データの入力作業時間を大幅に削減。
<br>

## 4. まとめ
<br>

- **RPAは定型業務の自動化に効果的**  
  - データ入力やレポート作成などの繰り返し業務を自動化
  - 異なるシステム間のデータ連携やAI統合による高度な自動化が可能
<br>

- **代表的なRPAツールと特徴**  
  - **UiPath**: 直感的な操作と無料版が魅力
  - **Automation Anywhere**: エンタープライズ向けでスケーラビリティが高い
  - **Blue Prism**: セキュリティ重視のエンタープライズ向けツール
  - **Microsoft Power Automate**: Office 365との相性が良いクラウド型
  - **MuleSoft RPA**: API統合やSalesforceシステムとの連携が強力
<br>

- **具体的な活用例**  
  - 請求書処理、カスタマーサポートの効率化、データ解析の前処理など
  - RPAを活用することで業務時間を大幅に削減し、クリエイティブな業務に集中できる