OmniAICreator/Qiita-1.07M huggingface dataset:
特徴量エンジンKaskadaの宣言型クエリ言語 Fenl~集約とウィンドウ処理



# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/fenl/aggregation-and-windowing.html

# 集約とウィンドウ処理

## 基本
集計は、入力値のストリームを消費し、出力値のストリームを生成するものと考えることができます。
デフォルトでは、集計が入力を消費するたびに出力が生成されます。
この場合、各出力に関連付けられた時間は、対応する入力に関連付けられた時間と同じであり、出力の値は、その時点までに消費されたすべての入力に集計を適用した結果です。

```javascript
Purchase.amount | sum()
```




| Time | Purchase.amount  | sum() |
| --- | --- | --- |
|2012-02-23 |5 |5|
|2012-05-10 |2 |7|
|2018-11-03 |13 |20|
|2019-10-26 |4 |24|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/2b51b81a-48d6-f97d-e5c8-3804423de0dc.png)


## ウィンドウ集計
集計のデフォルトの動作では、入力が消費されるたびに、その値がこれまでに確認されたすべての入力の集計である出力が生成されます。この動作は、ウィンドウ集計を使用して制御できます。

### 「何を」集約するかを制御する
一つの側面として、「何を」集約するか、つまり集計で使用される入力値のセットについて記述します。デフォルトの動作では、すべての入力値が寄与します。場合によっては、最新の N 個の入力のみを含める、または特定のイベントが発生してからのすべての入力を含めることが必要な場合があります。

### 「いつ」集約されるかを制御する
別の側面では、集計の結果がいつ生成されるべきかを記述します。デフォルトの動作では、入力値が消費されるたびに出力値が生成されます。場合によっては、毎日の終わりに特定のイベントが発生したときに出力値を生成することが望ましい場合があります。

### ウィンドウ処理の例
集計関数の`window`パラメータに**ウィンドウ ジェネレータ**を提供することで、集計をウィンドウ処理することができます。たとえば、 ウィンドウ ジェネレーター`sliding(2, is_valid(Purchase))`は、最近の 2 つの有効な購入の合計を計算します。

なお、このウィンドウジェネレーター`sliding(n, bool)`は、集約される内容に影響を与えますが、各入力に関連付けられた出力を生成するときの動作はデフォルトのままです。
```javascript

Purchase.amount | sum(window = sliding(2, is_valid(Purchase))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/a99c364b-622b-3e5a-6cc5-abd301cd060c.png)

他の例として、ウィンドウ ジェネレーター`yearly()`を使用して、各年の初めにすべての購入の合計を計算できます。

```javascript
Purchase.amount | sum(window = since(yearly()))
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/62507ad5-a61a-4aaf-636f-ba255387d293.png)


### バウンダリーの扱い
`yearly`のような条件では、毎年といったバウンダリーが対象となります。
Fenl はこのバウンダリーの扱いについて、自動的に、式に含まれるすべてのエンティティが持つデータセット内の中で最も古いイベントから最新のイベントまでの時間間隔に制限します。

## 繰り返しの集計
Fenl式において、以下のように複数回（イベントを）集計することもできます。

```
Purchase.amount | sum() | mean()
```

一連の結果を下記に示します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/5c7ba64a-48e8-3de8-61f6-2cf114e257a4.png)

各集計式の詳細についてはドキュメントを参照ください。


https://kaskada.io/docs-site/kaskada/main/fenl/catalog.html#sum

https://kaskada.io/docs-site/kaskada/main/fenl/catalog.html#mean
sedで条件指定して置換する

需要ありそうなのにググってもやり方出てこなかったので調べてみました。
（ググり力の問題かも）

# やりたいこと

例

```
% cat hoge.txt
hoge_hello_0.1.1_hogehoge
fuga_hello_1.2.1_fugafuga
moge_hello_2.2.1_mogemoge_0.1
```

数字の前の `_` だけ `:` に置換したい。

```
% cat hoge.txt | sed 's/_[0-9]/:/g'    
hoge_hello:.1.1_hogehoge
fuga_hello:.2.1_fugafuga
moge_hello:.2.1_mogemoge:.1
```

普通に数字指定すると、数字も置換されて消えちゃう。

# やりかた

```
% cat hoge.txt | sed 's/_\([0-9]\)/:\1/g'
hoge_hello:0.1.1_hogehoge
fuga_hello:1.2.1_fugafuga
moge_hello:2.2.1_mogemoge:0.1
```

## 解説
`-E` オプションの有無で、基本と拡張の正規表現を選ぶ事ができます。
今回は `-E` オプションをつけない事で基本正規表現を選びます。
https://nxmnpg.lemoda.net/ja/7/sed

基本正規表現では `\(\)` で囲う事でサブ式を指定できます。
そして `\1` 等でサブ式を指定できます。
https://nxmnpg.lemoda.net/ja/7/re_format

上記の例では `_` に続く数字だけをサブ式に代入し、置換後にサブ式の数字を戻してあげました。

# 行の検索
特定の行だけ置換処理の対象にしたい。って場合はこんな感じでできます。

```
% cat hoge.txt | sed '/fuga/s/_/:/g'
hoge_hello_0.1.1_hogehoge
fuga:hello:1.2.1:fugafuga
moge_hello_2.2.1_mogemoge_0.1
```

`fuga` を含む行の `_` を `:` に置換しています。
ELBの何がすごいの？

## はじめに
ウェブアプリケーションやサービスのパフォーマンス、信頼性、スケーラビリティを向上させるためには、効果的な負荷分散が不可欠です。そこで登場するのがELB（Elastic Load Balancer）です。ELBは、AWS（Amazon Web Services）の提供する負荷分散サービスであり、その多機能な特徴から多くのユーザーに支持されています。この記事では、ELBの何がすごいのかを紹介します。

#### 自動負荷分散：
ELBは、自動的にアプリケーションへのトラフィックを複数のEC2インスタンスやコンテナに均等に分散します。これにより、単一のインスタンスが負荷でオーバーロードされることなく、パフォーマンスの向上と高い可用性を実現します。

#### スケーラビリティ:
ELBは、トラフィックの増加に応じて自動的にスケールアウトします。アプリケーションの需要が増えた場合、ELBは新しいインスタンスを起動し、トラフィックを分散させます。これにより、アプリケーションのパフォーマンスを維持しながらスケーリングが可能です。

#### ヘルスチェックと自動復元:
ELBは、バックエンドのインスタンスやコンテナのヘルスチェックを定期的に行います。もしヘルスチェックに合格しないインスタンスがあれば、ELBは自動的にトラフィックから外し、問題が解決すると再びトラフィックを振り分けます。この機能により、アプリケーションの可用性が高まります。

#### セキュリティとSSLオフロード:
ELBは、SSL証明書を終端し、アプリケーションサーバーには復号されたデータを渡すことができます。このSSLオフロード機能により、アプリケーションサーバーの負荷を軽減し、高速化を図ることができます。また、ELBはセキュリティグループやWAF（Web Application Firewall）との統合もサポートしており、アプリケーションのセキュリティを向上させます。

#### 多様なロードバランシングアルゴリズム:
ELBは、様々なロードバランシングアルゴリズムを提供しています。ユーザーは、自身のアプリケーションのニーズに合わせて最適なアルゴリズムを選択することができます。Round Robin、Least Connection、IP Hashなど、さまざまなアルゴリズムを利用することで、トラフィックの均等な分散やセッションの制御が可能です。

#### 図解してみた
この図では、"Client"サブグラフはユーザーからのリクエストを表しており、これらのリクエストは"Elastic Load Balancer"に送られます。Elastic Load Balancerはこれらのリクエストを"EC2 Instances"のサブグラフ内のEC2インスタンスに分散します。

このように、Elastic Load Balancingは受け取ったトラフィックを複数のターゲット（EC2インスタンス、コンテナ、IPアドレスなど）に自動的に分散します。これにより、アプリケーションの可用性を高めるとともに、冗長性を保つことができます。

```mermaid
graph LR
    subgraph Client
        C1[Client 1]
        C2[Client 2]
        C3[Client 3]
    end
    subgraph ELB
        LB[Elastic Load Balancer]
    end
    subgraph EC2 Instances
        I1[EC2 Instance 1]
        I2[EC2 Instance 2]
        I3[EC2 Instance 3]
    end

    C1 -->|Request| LB
    C2 -->|Request| LB
    C3 -->|Request| LB

    LB -->|Distribute| I1
    LB -->|Distribute| I2
    LB -->|Distribute| I3
```

## 結論
ELBは、多くの魅力的な機能を備えています。これらの機能により、ELBはウェブアプリケーションやサービスのパフォーマンスと可用性を向上させる強力なツールとなっています。AWSを利用している場合、ELBを活用することで効率的な負荷分散を実現し、ユーザーエクスペリエンスを向上させることができます。ぜひ、ELBの優れた機能を活用してみてください。
cscの作法 その345

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
closedxmlで罫線を引いた、xlsxを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5027a207-1d25-f71d-836a-cf4b80ea5f41.png)

# サンプルコード

```

using System;
using System.IO;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book10.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j;
			for (i = 1; i < 11; i++)
			{
				for (j = 1; j < 11; j++)
				{
					ws.Cell(i, j).Value = i * 10 + j - 10;
				}
			}
			ws.Range(1, 2, 1, 4).Style.Border.SetTopBorder(XLBorderStyleValues.Thin).Border.SetBottomBorder(XLBorderStyleValues.Thin).Border.SetLeftBorder(XLBorderStyleValues.Thin).Border.SetRightBorder(XLBorderStyleValues.Thin);
			ws.Range(3, 2, 6, 6).Style.Border.SetTopBorder(XLBorderStyleValues.Thin).Border.SetBottomBorder(XLBorderStyleValues.Thin).Border.SetLeftBorder(XLBorderStyleValues.Thin).Border.SetRightBorder(XLBorderStyleValues.Thin);
			ws.Range(7, 8, 8, 9).Style.Border.SetTopBorder(XLBorderStyleValues.Thin).Border.SetBottomBorder(XLBorderStyleValues.Thin).Border.SetLeftBorder(XLBorderStyleValues.Thin).Border.SetRightBorder(XLBorderStyleValues.Thin);
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```

以上。
cscの作法 その344

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
closedxmlでセル結合した、xlsxを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1a23f465-a379-5dc9-206d-3f1e1f491e70.png)

# サンプルコード

```

using System;
using System.IO;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book9.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j;
			for (i = 1; i < 11; i++)
			{
				for (j = 1; j < 11; j++)
				{
					ws.Cell(i, j).Value = i * 10 + j - 10;
				}
			}
			ws.Range(1, 2, 1, 4).Merge();
			ws.Range(3, 2, 6, 6).Merge();
			ws.Range(7, 8, 8, 9).Merge();
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```

以上。
gitのfilemode

## Gitは実行権限しか管理していない
これは重要。
Gitで管理しているファイルについて、基本的にパーミッションは `0644` になっていると想いますが、これを例えば `0600` （ファイル所有者以外の読み取り権限をなくす）にする方法は **ありません**。

できるのは `0644` ⇔ `0755` だけです。

## ファイルのGit上でのパーミッションを確認する方法

```
% git ls-files --stage {ファイル名}
100644 e9bc5dd70ad1d7b08b5cdf14906ef239f2e13367 0	{ファイル名}
```

## パーミッションを無視する設定

Git上のパーミッションの影響を受けたくない場合はこちら。

### 設定する
	$ git config core.filemode false

### 確認する
	$ git config -l | grep filemode

## gitに対して明示的にパーミッションを変更する
### 実行権限を付与するとき
	$ git update-index --add --chmod=+x [filename]

### 実行権限を外すとき
	$ git update-index --add --chmod=-x [filename]

## 参考URL
http://git-scm.com/docs/git-update-index

上記URLにも、

```
--chmod=(+|-)x
Set the execute permissions on the updated files.
```

と書かれている通り、「u」「g」「o」や「-r」「-w」とかはないです。全体に対する実行権限の変更のみ。
【セグメントルーティング（SR）実践編】SR-MPLS TE Anycast SIDをCMLで実装してみた話

ネットワークエンジニアの「だいまる」です。 今回はSR-MPLS（Anycast SID）についてまとめました。
結構、色んな課題があったのでそこにも触れています。 

https://daimaru-tech-blog.com/?p=784
SudachiPy にて未知語を判定する

Sudachi はUniDic品詞体系なので、品詞として未知語は存在しません。
SudachiPy を利用して形態素解析を行う場合、未知語を判定したい場合があります。

手元の環境は以下になります。

* Ubuntu 22.04.2 LTS
* Python 3.10.6
* SudachiDict-core==20221021
* SudachiPy==0.6.6

未知語を判定したい場合は以下のように`is_oov()`を使って実装します。

```python
from sudachipy import tokenizer
from sudachipy import dictionary

tokenizer_obj = dictionary.Dictionary().create()
mode = tokenizer.Tokenizer.SplitMode.A

contents = 'ChatGPTに質問する'

for m in tokenizer_obj.tokenize(contents, mode):
    word = m.normalized_form()
    print(word + '：未知語判定 ' + str(m.is_oov()))
```

上記のコードを実行すると以下のような結果になります。

```
chatgpt：未知語判定 True
に：未知語判定 False
質問：未知語判定 False
為る：未知語判定 False
```

### 参考になった記事
[sudachipy.Morpheme.is_oov](https://worksapplications.github.io/sudachi.rs/python/api/sudachipy.html#sudachipy.Morpheme.is_oov)
AWS（無料枠内）で初めてWordPressを構築してみた感想

最近、私はAWSの無料利用枠を使ってWordPressを構築してみました。初心者ながらも、その感想をシェアしたいと思います。

まず、AWSの無料利用枠は非常に魅力的です。初めてのユーザーにとって、無料枠を活用することでAWSの基本機能を体験することができます。無料で利用できる期間や提供されるリソースは制限がありますが、それでも十分な範囲でWordPressを構築できました。

WordPress構築には、EC2（Elastic Compute Cloud）マイクロインスタンスを使用しました。このマイクロインスタンスは、比較的小規模なウェブサイトに適しており、初期設定やセットアップも簡単です。

AWSのマネジメントコンソールも初心者にとって非常に使いやすかったです。わかりやすいインターフェースと直感的な操作性があり、手順を追うだけで簡単にWordPressを構築することができました。ドキュメンテーションやサポートも充実しており、必要な情報にアクセスするのも容易でした。

無料枠内でも、セキュリティに関してはAWSが信頼性を発揮します。セキュリティグループやアクセス制御リストの設定を適切に設定することで、ウェブサイトの保護を強化できます。また、無料枠内であってもバックアップ機能を利用することができました。

ただし、無料枠内での制約もあります。リソースの制限やトラフィック制限などがあり、大規模なトラフィックや高度な機能を必要とする場合には有料のプランに移行する必要があります。ただ、初心者としては十分な学びと成果を得ることができました。


## まとめ
AWSの基本機能やセキュリティについての理解を深めることができました。初心者にとって、AWSは手軽に使える選択肢であり、学びの場としても大変価値のあるものだと感じました。
brew services listでのpostgresql@14 256 errorの解決法

## 問題の背景

macOS上でHomebrewを使用し、PostgreSQLを管理しています。しかし、`brew services list`コマンドを実行すると`postgresql@14`に対して`256 error`が表示されました。

:::note info
以前に寄稿した、以下記事と解決のプロセスや問題の原因は同様ですが、同じ記事にまとめるのが困難だった為、別々の記事にまとめさせて頂いております。
[brew services start postgresql@14でのErrorの解決法](https://qiita.com/kimascript/items/70a2649541cbad19233c)
:::

## 問題の特定

このエラーメッセージは通常、PostgreSQLのプロセスが既に実行中である、または古いプロセスがまだシャットダウンされていない場合に発生するようです。

## 解決方法

以下のステップを通じて、この問題を解決しました。

### 1. 実行中のPostgreSQLのプロセスを確認

```bash
ps aux | grep postgres
```
これにより、すでに実行中のPostgreSQLのプロセスの存在を確認できます。

### 2. 確認されたPostgreSQLのプロセスを全て停止
```bash
pkill -f postgres
```
このコマンドで実行中のすべてのPostgreSQLのプロセスを強制終了させることができます。

### 3. PostgreSQLが正常に停止したか確認する為に再度プロセスの確認
```bash
ps aux | grep postgres
```
停止が成功していれば、このコマンドでPostgreSQLのプロセスは表示されません。

### 4. `postmaster.pid` ファイルが存在する場合、それを削除
```bash
rm /usr/local/var/postgresql@14/postmaster.pid
```
`postmaster.pid`はPostgreSQLが実行中であることを示すファイルで、通常はPostgreSQLの正常な終了時に自動的に削除されます。しかし、何らかの理由でPostgreSQLが正常に終了しなかった場合、このファイルが残ってしまうことがあります。このファイルが存在すると、PostgreSQLはすでに実行中であると判断して新たに起動できない為、削除する必要があります。

### 5. 最後に、再度PostgreSQLのサービスを起動
```bash
brew services start postgresql@14
```

以上の手順を実行することで、**`brew services list`での`postgresql@14 256 error`を解消することができました**。
brew services start postgresql@14でのErrorの解決法

## 問題の背景

macOS上でHomebrewを使用し、PostgreSQLを管理しておりましたが、ある時、通常通りPostgreSQLサービスを起動しようとしたところ、エラーメッセージが出力されました。

:::note info
以後寄稿した、以下記事と解決のプロセスや問題の原因は同様ですが、同じ記事にまとめるのが困難だった為、別々の記事にまとめさせて頂いております。
[brew services listでのpostgresql@14 256 errorの解決法](https://qiita.com/kimascript/items/c04fd9f7f155f248075c)
:::

## 問題の確認

以下のコマンドでPostgreSQLサービスを起動しようとしました。

```bash
brew services start postgresql@14
```

しかし、以下のエラーメッセージが出力されました。

```
Bootstrap failed: 5: Input/output error
Try re-running the command as root for richer errors.
Error: Failure while executing; `/bin/launchctl bootstrap gui/501 /Users/user/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist` exited with 5.
```

## 問題の特定

エラーメッセージから、plistファイル（`/Users/user/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist`）で定義されたサービスの起動時に何らかの問題が発生したことが示唆されています。

このエラーメッセージは通常、PostgreSQLのプロセスがすでに実行中である、または古いプロセスがまだシャットダウンされていない場合に発生するようです。

## 解決方法
以下のステップを通じて、この問題を解決しました。

### 1. 実行中のPostgreSQLのプロセスを確認

```bash
ps aux | grep postgres
```
これにより、すでに実行中のPostgreSQLのプロセスの存在を確認できます。

### 2. 確認されたPostgreSQLのプロセスを全て停止

```bash
pkill -f postgres
```
このコマンドで実行中のすべてのPostgreSQLのプロセスを強制終了させることができます。

### 3. PostgreSQLが正常に停止したか確認する為に再度プロセスの確認

```bash
ps aux | grep postgres
```
停止に成功していれば、このコマンドでPostgreSQLのプロセスは表示されません。

### 4. `postmaster.pid` ファイルが存在する場合、それを削除

```bash
rm /usr/local/var/postgresql@14/postmaster.pid
```



`postmaster.pid`はPostgreSQLが実行中であることを示すファイルで、通常はPostgreSQLの正常な終了時に自動的に削除されます。
しかし、何らかの理由でPostgreSQL

が正常に終了しなかった場合、このファイルが残ってしまうことがあります。このファイルが存在すると、PostgreSQLはすでに実行中であると判断して新たに起動できない為、削除する必要があります。

### 5. 最後に、再度PostgreSQLのサービスを起動

```bash
brew services start postgresql@14
```

以上の手順を実行することで、**PostgreSQLのサービスを正常に起動することができました**。
RustとRubyでAES-256-CBCの暗号化・復号化をする

# 目的
以前[RustでAES-256-CBC暗号化](https://qiita.com/aoyagikouhei/items/a4233dd5720f40386f03)という記事を書きましたが、base64やaesなどのライブラリが新しくなったので書き直してみました。
前の記事ではRustで暗号化、復号化、Rubyで復号化でしたがRubyの暗号化も追加しました。
お互いで暗号化・復号化が正しく動作することを確認しました。

ivは暗号化した文字列の先頭16byteに配置しています。

# コード
```rust:Cargo.toml
[package]
name = "crypt"
version = "0.1.0"
edition = "2021"

[dependencies]
aes = "0.8.2"
base64 = "0.21.2"
bytebuffer = "2.1.1"
cbc = { version = "0.1.2", features = ["std"] }
rand = "0.8.5"
```

```rust:main.rs
use aes::cipher::{KeyIvInit, block_padding::Pkcs7, BlockEncryptMut, BlockDecryptMut};
use base64::{Engine as _, engine::general_purpose};
use bytebuffer::ByteBuffer;
use rand::{distributions::{Alphanumeric, DistString}};

type Aes256CbcEnc = cbc::Encryptor<aes::Aes256>;
type Aes256CbcDec = cbc::Decryptor<aes::Aes256>;

// 暗号化
fn encrypt(key: &str, data: &str) -> String {
    let mut rng = rand::thread_rng();
    let iv_str = Alphanumeric.sample_string(&mut rng, 16);
    let iv = iv_str.as_bytes();
    let cipher = Aes256CbcEnc::new(key.as_bytes().into(), iv.into())
        .encrypt_padded_vec_mut::<Pkcs7>(data.as_bytes());
    let mut buffer = ByteBuffer::from_bytes(iv);
    buffer.write_bytes(&cipher);
    general_purpose::STANDARD.encode(buffer.as_bytes())
}

// 復号化
fn decrypt(key: &str, data: &str) -> String {
    let bytes = general_purpose::STANDARD.decode(data).unwrap();
    let res = Aes256CbcDec::new(key.as_bytes().into(), bytes[0..16].into())
        .decrypt_padded_vec_mut::<Pkcs7>(&bytes[16..])
        .unwrap();
    String::from_utf8(res).unwrap()
}

fn main() {
    let plaintext = "予定表～①💖ﾊﾝｶｸだ";
    let key = "01234567012345670123456701234567";
    let enc = encrypt(key, plaintext);
    println!("{}", enc);
    let dec = decrypt(key, &enc);
    assert_eq!(plaintext, dec);
    println!("{}", dec);

    let args: Vec<String> = std::env::args().collect();
    if args.len() > 1 {
        println!("{}", args[1]);
        let dec = decrypt(key, &args[1]);
        assert_eq!(plaintext, dec);
        println!("{}", dec);
    }
}
```

```ruby:main.rb
require 'base64'
require 'openssl'

key = "01234567012345670123456701234567"
plain_text = "予定表～①💖ﾊﾝｶｸだ"

# 暗号化
def encrypt(key, data)
  engine = OpenSSL::Cipher.new('AES-256-CBC')
  engine.encrypt
  engine.key = key
  iv = engine.random_iv
  res = engine.update(data) + engine.final
  Base64.encode64(iv + res).gsub(/\n/, '')
end

# 複合化
def decrypt(key, data)
  data = Base64.decode64(data)
  engine = OpenSSL::Cipher.new('AES-256-CBC')
  engine.decrypt
  engine.key = key
  engine.iv = data[0..15]
  res = engine.update(data[16..]) + engine.final
  res.force_encoding("UTF-8")
end

encrypted_data = encrypt(key, plain_text)
puts encrypted_data
decrypted_data = decrypt(key, encrypted_data)
puts decrypted_data
puts decrypted_data == plain_text

if ARGV.size() > 0
  decrypted_data = decrypt(key, ARGV[0])
  puts decrypted_data
  puts decrypted_data == plain_text
end
```
【ポチポチだけ！！】VSCode+DockerでAzure Functionsの開発環境構築

## Azure Functionsの開発環境
今回は**VSCode+WSL+Docker**で**Azure Functions**の開発環境を構築するよ
**ボタンポチポチ**で作れちゃうのでめちゃ楽です

## さっそく構築
まずはVSCodeを開き「拡張機能」から「Azure Functions」をインストールします

### プロジェクトの作成
Azureロゴのアイコンを押してからFunctionsのボタンを押しましょう↓
![6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/9e5133e4-e7b7-e4c3-8c10-13c7d80adfe4.png)
画面上にタブが出てくるので「Python」を選択↓
![6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/73d2e87e-0b3b-d9d5-d537-b0e87248d4b6.png)
pythonを選択すると仮想環境が自動で作られますが、今回はDev Containerを使うので**Skipを押しましょう**↓
![6-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/b7cb41bb-81fd-b790-c423-a714810f4095.png)
Functionsの関数を作るように言われるので、とりあえず「HttpTrigger」を選んでおきましょう

### Dev Containerの作成
「ctrl + shift + p」を押したらコマンドパレットが表示されるので「Reopen in Container」を押しましょう
テンプレートがたくさん出てきます
「Show All Definitions...」という項目を押しましょう↓
![6-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/2820bab3-1378-3b60-cf9d-5d1de75dc83e.png)
Functions + Python用のテンプレートを選びます↓
![6-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/04204999-d996-d7ac-a58d-67f1c3a7ebab.png)
ビルドが始まったらOKです！

### ファイル構成
最終的に↓こんな感じのファイル構成になると思います(.git配下は省略)
```
test-functions
├── .devcontainer
│   ├── Dockerfile
│   └── devcontainer.json
├── .funcignore
├── .git/
├── .gitignore
├── .npmignore
├── .vscode
│   ├── extensions.json
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── HttpTrigger1
│   ├── __init__.py
│   ├── function.json
│   └── sample.dat
├── host.json
├── local.settings.json
└── requirements.txt
```

## ローカル実行するよ
VSCode内のターミナルで「func start」を入力するだけで動くよ↓
![6-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/6c20508b-1bdb-97ff-9d83-559665b5a2b8.png)
ブラウザでアクセスしたらレスポンス来た！完成！おわり！
![6-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/a363627e-b676-27bc-ad2b-abb3e434d916.png)

## デプロイについて
Azureクラウド上のデプロイする場合は雲アイコンからできます(Azureログイン必須)↓
![6-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/4feda90b-8932-919f-7645-693f9b7e7d65.png)
pipで入れたパッケージ等はpip freezeでrequirements.txtに記載しておけばデプロイ時に勝手にインストールしてくれます

## 最後に
Microsoftのドキュメントって読みにくいよね
**いいね、ストックしていただけるとやる気が出ます**🔥🙏
SaaS runners on macOS で Xcodeビルドするときの証明書周りのセットアップ

## はじめに
Gitlab CI のビルドマシンとして Mac mini を使用していましたが、Gitlab のSaaS Runner でビルドできるということを聞いたので移行してみました
Mac mini でやっていた xcodebuild に加えていくつかセットアップが必要になったのでこちらを紹介したいと思います

## gitlab-ci.yml

 全体はこんな感じです
```yaml

build-jop:
  tags: [shared-macos-amd64]
  image: macos-12-xcode-14
  stage: build
  variables:
    SECURE_FILES_DOWNLOAD_PATH: ./securefiles
  script:
    - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bas
    - security create-keychain -p "password" gitlab.keychain
    - security default-keychain -s gitlab.keychain
    - security set-keychain-settings -l gitlab.keychain
    - security unlock-keychain -p "password" gitlab.keychain
    - security import $SECURE_FILES_DOWNLOAD_PATH/"証明書.p12" -k gitlab.keychain -P "p12password" -A
    - security set-key-partition-list -S "apple:" -s -k password gitlab.keychain
    - uuid=$(grep UUID -A1 -a $SECURE_FILES_DOWNLOAD_PATH/dis.mobileprovision | grep -io "[-A-F0-9]\{36\}")
    - mkdir -p ~/Library/MobileDevice/"Provisioning Profiles"
    - cp $SECURE_FILES_DOWNLOAD_PATH/dis.mobileprovision ~/Library/MobileDevice/"Provisioning Profiles"/$uuid.mobileprovision
    - xcodebuild ...

```
    

### スクリプト解説

##### 1. セキュアファイルダウンロード
ビルド中に使用するファイルをセキュアファイルとして登録でき、以下のコマンドでインストールできます
セキュアファイルは ビルドに必要な証明書（.p12）や Provisioning Profile （.mobileprovision）などを置いておきます
ファイルの登録方法は以下の記事が参考になります
[[GitLab CI/CD] macOS SaaS Runner と GitLab Mobile DevOps で iOSビルド実行環境の簡単セットアップ](https://qiita.com/n11sh1/items/26ac715b60f968f10a9e)
```yaml
    - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bas
```


##### 2. 証明書をキーチェーンに登録
証明書を登録するためのキーチェーンを作成し、タイムアウトを終了までにしてからアンロックします。
デフォルトのタイムアウトは300秒ですが、これだと``Run Script``で``Pod``や``Carthage``の署名のタイミングでロックされている可能性があります
また、``codesign``が利用できるようにパーティションリストの設定も行います
```yaml
    - security create-keychain -p "password" gitlab.keychain
    - security default-keychain -s gitlab.keychain
    - security set-keychain-settings -l gitlab.keychain
    - security unlock-keychain -p "password" gitlab.keychain
    - security import $SECURE_FILES_DOWNLOAD_PATH/"証明書.p12" -k gitlab.keychain -P "p12password" -A
    - security set-key-partition-list -S "apple:" -s -k password gitlab.keychain
```

##### 3. Provisioning Profileの配置
.mobileprovision 内から``UUID``を抽出し、ファイル名にして``Provisioning Profile``ディレクトリへ移動させます
```yaml
    - uuid=$(grep UUID -A1 -a $SECURE_FILES_DOWNLOAD_PATH/dis.mobileprovision | grep -io "[-A-F0-9]\{36\}")
    - mkdir -p ~/Library/MobileDevice/"Provisioning Profiles"
    - cp $SECURE_FILES_DOWNLOAD_PATH/dis.mobileprovision ~/Library/MobileDevice/"Provisioning Profiles"/$uuid.mobileprovision
```

##### 4. xcodebuild
上記の設定ができれば証明書周りのセットアップが済んでいる状態です
``xcodebuild``でアーカイブ、エクスポートなど行ってください


## おわりに
Shared Runner は手元に実機がなくてもCIを実現できるのが良いですが、ビルド時間が Mac mini (8GB Intel) と比較して少し長く掛かるようです
早さを重視するのであればオンプレで用意してしまうのもありかもしれません
Custom: Support Profile　関係


これもよく理解できない質問が多い。無いとか消したとか... どうな風にトレイルヘッドをやっているのかもすごく疑問に思う。私は一度も遭遇できません。まぁ、慣れも必要なのかもしれないですが私は恐ろしくて管理者を任せる気にはなれませんね。

# 間違って消した時？

+ [How can I add "Custom: Support Profile"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pf4qO)

:::note
Refer to this:

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NQYlDSAX
:::

# 存在しないらしい

+ [can not find custom :sales profile](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pf0tA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/104ac53d-a739-9de3-3969-0c5b2f399888.png)

:::note
Try opening and doing the challenge in a new org.

After placing the components correctly, click on Save -> Go to 'Apps and Profile' -> Select 'Custom: Sales Profile.
:::
ソフトウェアアーキテクチャの基礎本を読んでみて1


勉強のアウトプットの目的で書いています！
間違っていたらすいません💦

### アーキテクチャとはそもそも何？？
外部的な要求や要件に応じて、最適な IT システムを構成するための設 計思想と構成されたシステムの構造のこと

よーするに基本的な設計や構造のこと


### アーキテクチャを理解することに必要なこと

##### システムの構造
##### アーキテクチャの特性
##### アーキテクチャ決定
##### 設計指標

上の４つを理解する必要がある



 ここではシステムの構造を説明します。

## システムの構造とは

### アーキテクチャスタイルの種類のこと！！

代表的なアーキテクチャスタイルは

#### ・マイクロサービス

#### ・レイヤード

#### ・マイクロカーネル


## マイクロサービスとは簡単に
ソフトウェア開発アーキテクチャの手法の一つでアプリケーションを
それぞれ小さくサービス独立させて、独自の役割と責任を持ってAPIを通じて
サービスをやり取りする開発手法

##### メリット
・小さく独立させることによって障害が起こったときに、問題があるところだけ切り外せばよく、保守、開発がしやすい
・それぞれ独立させてAPIでサービスをやり取りするため、技術による制約が受けにくい。だから色んな言語で開発ができる

##### デメリット
設計が難しくまた、費用がかかってしまう。


マイクロサービスで開発したアプリ

例
・LINE 、Amazon,メルカリ


## レイヤードとは簡単に

よく使われる一般的な設計パターンでシステムを複数のレイヤー（層）に分割して
各レイヤーが特定の機能と責任範囲を持ち、それぞれ独立して変更と拡張が可能で
上位レイヤーは下位レイヤーに依存しているが、逆に下位レイヤーは上位レイヤーに
依存関係はまったくないのが特徴のアーキテクチャ

#### それぞれのレイヤー層の種類

##### プレゼン層
UIなどの表示の部分 HTML,CSS  ビュー　、ルーティング

##### アプリケーション層
ビジネスロジックの処理でCRUDやELTなど サービス、リポジトリの呼び出し

##### ドメイン層
ビジネスルールや仕様の関心ごとを取り扱う層  モデル

##### データアクセス層
永久化テクノロジーの処理でDB操作をする層　　　マイグレーションファイル


#### メリット
・保守性と拡張性が向上する
・コンポーネントや機能の再利用がしやすい
・テストやチーム開発がしやすい

#### デメリット
・レイヤー間の情報の受け渡しにやデータ変換が必要な為、オーバーヘッドが生じる場合がある
・適切なレイヤー分割が難しい
・過度な抽象化が増える


ちなみにオーバーヘッドとは
処理や操作を実行するために必要なコストやリソースが必要な範囲を超えて
発生する、追加的な負荷や処理のこと


## マイクロカーネルとは 簡単に

マイクロカーネルとはカーネル（コンピューターシステムの中核となるソフトウェア）
が最低限の機能しか持たず、他の機能は個別のソフトウェアとして存在する。
例えばファイル管理やデバイス制御などはカーネルの外部で独立したソフトウェアとして実装される。


#### メリット
・柔軟性と拡張性: カーネルの最小限の機能により、新しい機能やサービスを容易に追加できる

・セキュリティと信頼性: ユーザーレベルのサーバーによる分散処理により、システムのセキュリティと信頼性が向上する

・モジュール性と保守性: カーネルとサーバーの分離により、システムの特定の機能を変更や修正する際に他の部分に影響を与えずに行える

#### デメリット
・性能の低下: カーネルとサーバーの間のメッセージングやプロセス間通信によりオーバーヘッドが発生し、性能が低下する場合がある

・複雑さ: カーネルとサーバーの分散処理により、システムの複雑さが増します。設計とデバッグが困難になる場合がある

カーネルアーキテクチャはスマートフォンやロボットや自動掃除機などの
システムに採用されていることが多いそうです


以上でアーキテクチャのシステムの構造を終わります！
ST7735(パラレル)で遊ぶ まとめ(リンク集)


●1

https://qiita.com/caa45040/items/d1f6f38364175ac568d3

●2

https://qiita.com/caa45040/items/2251ed94a8ba3adbc150

●3

https://qiita.com/caa45040/items/7bf1127d688972fef3a8

●4

https://qiita.com/caa45040/items/04f39fbce5002033c105

●5

https://qiita.com/caa45040/items/59f5f9336f9393ab65a8

●6

https://qiita.com/caa45040/items/0785f3f3a875b6f10e16

●7

https://qiita.com/caa45040/items/062785304e0bb3f605e7

●8

https://qiita.com/caa45040/items/e5bde5f9f1716dce29ea

●9

https://qiita.com/caa45040/items/5fd72d9970cb3135e605

●10

https://qiita.com/caa45040/items/bc0b754230479f9bcf7d

●11

https://qiita.com/caa45040/items/8ef77ee90536250abe5a

●12

https://qiita.com/caa45040/items/a954007a67f5186be6a3

●13

https://qiita.com/caa45040/items/32bbee1fe4a0dd6d749a
子供のご飯タイムを快適にしよう！Teachable Machineを使って剣で斬られるWebアプリを実装！

## ご飯を集中して食べて欲しい
年長の娘はご飯中によく立ち歩きます。。
なにか理由をつけて席を立ち、おもちゃで遊んだりダンスを踊ってみたりと大忙しいです。ご飯を集中して食べて欲しいので注意したり、娘がどんなに面白いことをしても笑わないでいてみたりと色々とやっていますが、食べるのに時間がかかります・・・:expressionless:
そんな娘に座っていると剣で斬られるアプリ「スタンドカットちゃん」を試してみました:thumbsup_tone2:
ONE PIACEにハマっているため、効果音は剣で斬られる音に決定しました。一番ウケが良かったです！

## 使ってみると
https://twitter.com/yuko6891/status/1665681455450664960

https://647e45f0fcc57a1aa92aae5b--benevolent-lily-bc5ee8.netlify.app/

本当は娘で紹介したかったのですが、使える動画が撮れず断念しました。
初めはカメラが気になって席に座りましたが、斬られる音が楽しくて立ったり座ったりと遊んでしまいました。ただ我が家では席を立つと剣で斬られるということは浸透したため、席を立つことを躊躇するようにはなりました。ちょっとは効果があったと思っています:joy:

## 実装環境
Code Pen
ml5.js
Teachable Machine
Netlify

## 実装の解説
こちらの記事を参考にしました。（子供と銃で撃たれて楽しみました:grin:）

https://qiita.com/twtjudy1128/items/4c29a98a035a6e8cbcb4

### ①Teachable Machineで機械学習
以下の記事に登録方法が丁寧に解説されています

https://qiita.com/PoodleMaster/items/f08805bcf4e7596ba25b

今回は画像プロジェクトで「座る」「立つ」の２パターンを学習させました。
最低でも１００枚以上は学習させた方がいいそうです。

![スクリーンショット 2023-06-03 14.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/d0ee32dc-8b5d-a067-7f23-731f1067b644.png)

共有可能なリンクはこちらに貼ります。
![スクリーンショット 2023-06-06 6.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/cb027fa9-bea4-326d-a5e9-a67c4049446c.png)

### ②効果音をダウンロードして設定
効果音は以下の効果音ラボからダウンロードしました。
https://soundeffect-lab.info/sound/battle/battle2.html

ダウンロードした音声ファイルは、Code PenでExpoetした後にdistの直下に設定します。
Code Penでは音が試せません。
Webで開くと動作を確認できます。
![スクリーンショット 2023-06-06 6.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/48fa6fa3-82a2-83eb-e85a-825da3d1038c.png)

音声は以下の部分に指定しています。
![スクリーンショット 2023-06-06 6.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/5841f1ff-ea17-72da-71c0-559d9ad20a23.png)

Code Pen

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="abQoONR" data-user="YukoOnuma" 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/YukoOnuma/pen/abQoONR">
  座って食べよう！</a> by yuko6891 (<a href="https://codepen.io/YukoOnuma">@YukoOnuma</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


## 最後に
TeachableMachineは、初めて触った私でも簡単に登録することができました。
Qiitaに投稿されている方の記事をコピーして、①と②を変更するだけで簡単に実装できます。
Qiita素晴らしい！ぜひ試してみてください！

https://www.sejuku.net/blog/55523
cscの作法 その343

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
closedxmlでsqliteを流し込んだ、xlsxを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/541a37b6-3463-3148-4c7c-bfb627d5867b.png)

# サンプルコード

```

using System;
using System.Text;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book8.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i = 1;
			ws.Cell(i, 1).Value = "Id";
			ws.Cell(i, 2).Value = "Name";
			ws.Cell(i, 3).Value = "Number";
			ws.Cell(i, 4).Value = "Price";
			SQLiteConnectionStringBuilder ConnectionStr = new SQLiteConnectionStringBuilder();
			ConnectionStr.DataSource = "db0.sqlite";
			using (SQLiteConnection Connection = new SQLiteConnection(ConnectionStr.ToString()))
			{
				Connection.Open();
				using(SQLiteCommand Command = new SQLiteCommand(Connection))
				{
					Command.CommandText = "SELECT * FROM fruit ORDER BY id ASC";
					using (SQLiteDataReader Reader = Command.ExecuteReader())
					{
						while (Reader.Read())
						{
							i++;
							string Id = Reader.GetInt32(0).ToString();
							string Name = Reader.GetString(1);
							string Number = Reader.GetInt32(2).ToString();
							string Price = Reader.GetInt32(3).ToString();
							ws.Cell(i, 1).Value = Id;
							ws.Cell(i, 2).Value = Name;
							ws.Cell(i, 3).Value = Number;
							ws.Cell(i, 4).Value = Price;
						}
					}
				}
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```


以上。
cscの作法 その342

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
closedxmlでasciiなxlsxを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/319df4cc-f53e-3548-ced7-cf74106b31fb.png)

# サンプルコード

```

using System;
using System.IO;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book7.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j;
			byte b = 31;
			for (i = 0; i < 16; i++)
			{
				ws.Cell(1, i + 2).Value = i.ToString();
				ws.Cell(1, i + 2).Style.Fill.BackgroundColor = XLColor.Aqua;
			}
			for (i = 0; i < 6; i++)
			{
				ws.Cell(i + 2, 1).Value = (i * 16 + 32).ToString();
				ws.Cell(i + 2, 1).Style.Fill.BackgroundColor = XLColor.Aqua;
			}
			for (i = 0; i < 6; i++)
			{
				for (j = 0; j < 16; j++)
				{
					b++;
					char c2 = Convert.ToChar(b);
					ws.Cell(i + 2, j + 2).Value = c2;
				}
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```

以上。
社会人１年目を終えて

# *まえがき*

新卒でシステムエンジニアになってから１年が経ちました。
この記事では１年目に心掛けていたことや、後輩くん達に意識して欲しいことを簡単にまとめます。

# コミュニケーション
当たり前ですが、仕事関係でコミュニケーションが上手いと交友関係が広がり、結果働きやすくなります。

私は、外面を外交的に固めていたのですが、内心は人と話すのに消極的でした。
そんな私が１年目をやり過ごした方法をご紹介します。

### できるだけ相手に興味を持つ
相手に興味を持つことを意識しました。これが当たり前のようでやってみるとなかなか疲れる、、、
具体的にはどんなこと？？？ということで例を２つ挙げてご紹介します。
例えば社内で趣味の話になったとしましょう。私(趣味:テニス)とAさん(趣味:サイクリング)が話しています。
```
例１
私「Aさんの趣味は何ですか？」
Aさん「サイクリングです！」
私「そうなんですね！(私と趣味違うな、、残念、、、)」
```
```
例２
私「Aさんの趣味は何ですか？」
Aさん「サイクリングです！」
私「そうなんですね！(サイクリングが趣味なんだ！)」
```
例１の場合、「私」は「Aさん」のことを「私と趣味が違う人」として認識します。
「私と趣味が違う人」なので、サイクリングの情報が薄くなってしまいがちです。そうなってしまうと、同じことを二度三度聞いてしまったり、会話のチャンスを逃してしまったりしてしまいます。

例２の場合、「私」は「Aさん」のことを「サイクリングが趣味の人」として認識します。
このように認識していれば、「昨日はいいお天気でしたね。サイクリングされましたか？」など、相手が話しやすい話題を提供することができます。

### 聞き上手を意識する
私の考える「聞き上手」とは、話し相手に気持ちよく話してもらうことです。
仕事を教えてもらっている時でも、雑談をしている時でも、相槌や質問・感想などで話を盛り上げるよう意識しました。
先輩は後輩から質問されると嬉しくてついつい話し過ぎてしまうものです。(私も含め)
話すのが消極的な私でも、お話中の気になった点をいくつか質問するだけで２時間以上もお話してしまったこともあります。**(もちろん仕事の話←重要)**
特に技術者のお話は深掘るほど核心的なお話を聞けるので、大きな学びに繋がりました。
また、仕事の時間をお話の時間にできるので、程よい　~~サボり~~　気分転換になりました。

# 仕事の姿勢
ほぼ未経験でシステムエンジニア職に就いたので、入社時点で周りの方(同期含め)との知識差は大きく開いていました。
少しでも早く周りに追い着こうと意識したことをご紹介します。

### 暇な時間を作らない
仕事中とはいえ、どうしてもスキマ時間はできてしまいます。そんな時にすることを決めておくと時間を効率的に使えます。
例えば、先輩に「何か知っておいた方が良いことってありますか？」と尋ね、その回答をスキマ時間に調べたり、「スキマ時間ができたらこれをやろう」と自分で決めておいたことをやったりです。私は主に基本情報処理者試験とAWS関連の学習をしていました。
調べ物や学習で得た知識は、業務を行う上で大きな自信につながります。
また、業務時間中にスキマ時間をみつけて自己研鑽する習慣はとても重要だと考えます。
**１日５分程度でも１年(365日)続けたら30時間ほどにまで積み重なります。**
この30時間になるかもしれない毎日のスキマ時間をただぽけ〜っと過ごすのか、コツコツ積み重ねるのか、どちらが効率的な時間の使い方かはいうまでもないですね。まさに**ちりつも**です。

ただ、「休憩せずに勉強しろ！！」と言っているわけではないです。**休憩時間はスキマ時間ではありません**。しっかりと脳を休ませ、できる限り良い状態で仕事を行えるようにしましょう。
自己研鑽も休憩も「**仕事を効率的に行える**」ようになるので長期的にみて「**仕事を楽にこなせる・時間に余裕ができる**」ようになります。
詰まるところ、**自己投資**です。

### やりとりの証拠を残す
**メモをひたすらとりました**。当たり前のことですが、とても大事なことだと再認識したので記述します。
研修の内容、会議の内容、仕事のやり取りなどを記録し、振り返れる状態にしておくことで「言った・言ってない問題」の対策や、仕事忘れの防止ができます。

### ホウレンソウを細かくする
言わずと知れたホウレンソウです。ホウレンソウを行うことで、方向性が合っているかの確認と、詰まっているところのアドバイスをもらうことができます。私が思う最大のメリットは、「**ホウレンソウを行うことで相手と責任を共有できる**」ということです。ホウレンソウを行う相手というのは、ほとんどの場合上司です。上司と進捗を共有し、上司がGOを出したのであれば、**万が一失敗しても上司が肩代わり**してくれます(まともな上司であれば、、、)。


# 仕事以外
仕事以外の私生活であれこれ言うのはナンセンスだとは思いますが、
「休日何したら良いんですか？」
と後輩に質問されたことがあるため、私が大事にしていることをご紹介します。

### 依存先を増やす
趣味を増やしてみましょう。
多くの場合、仕事は週5日8時間行います。これは社会人にとって多くの時間を割くことになります。必然的に、会社・仕事への依存性は高まります。
会社・仕事が全てだ！という人がいたとします。仕事がうまくいっている時はいいのですが、仕事が不調な時は他の趣味(依存先)がないため何をやっても気分が落ち込むでしょう(極端な例)。
趣味が一つでもあれば、仕事がうまくいかなくても趣味で気分を上げることができます。
**趣味の数は多ければ多いほど良いです(私調べ)**。
エンジニアっぽいことを言うと「**メンタルの冗長構成**」とでも言いましょうか。
要するに、**何か嫌なことがあった時にそれを忘れられるほどのめり込めるものを用意しよう**！ってことです。

# *あとがき*
初投稿でした。
新卒で入社して一年。後輩もでき、この一年どんなことしたっけなーという振り返りでこの記事を書きました。
ほぼ未経験からのスタートでしたが、今では自社製品の副開発責任者として試行錯誤の毎日を送っています。
知識もそれなりに着いてきて、他部署の先輩や直属の後輩くんから技術的な質問を受けることも珍しく無くなってきました。
この記事を書いたのは自己満ですが、どなたかの目に留まっていただけたら幸いです。
Pythonで線形検索をやってみた

# 前提条件
* Python3

# 目的
Pythonで線形検索を実装し、実行してみる。

# サンプル
```l_search.py
def l_search(a,p):
    for i in range(0,len(a),1):
        if a[i] == p:
            return i  
    return -1                         # 探索失敗


names = ['ゆうと', 'ひな', 'さくら', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう']
sorted_names = sorted(names)
print(names)
print(sorted_names)

p = 'つばさ'
print('未ソート',p,l_search(names,p))
print('ソート済',p,l_search(sorted_names,p))
p = 'たろう'
print('未ソート',p,l_search(names,p))
print('ソート済',p,l_search(sorted_names,p))
p = 'ゆうと'
print('未ソート',p,l_search(names,p))
print('ソート済',p,l_search(sorted_names,p))
p = 'あい'
print('未ソート',p,l_search(names,p))
print('ソート済',p,l_search(sorted_names,p))
p = 'ゆう'
print('未ソート',p,l_search(names,p))
print('ソート済',p,l_search(sorted_names,p))
p = 'れん'
print('未ソート',p,l_search(names,p))
print('ソート済',p,l_search(sorted_names,p))           
```

## 実行結果
```
['ゆうと', 'ひな', 'さくら', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう']
['あい', 'あおい', 'あん', 'かいと', 'さくら', 'しょうた', 'そら', 'だいき', 'つばさ', 'ななみ', 'ひな', 'ひろと', 'まお', 'みう', 'みさき', 'ゆい', 'ゆう', 'ゆうと', 'りく', 'れん']
未ソート つばさ 10
ソート済 つばさ 8
未ソート たろう -1
ソート済 たろう -1
未ソート ゆうと 0
ソート済 ゆうと 17
未ソート あい 6
ソート済 あい 0
未ソート ゆう 19
ソート済 ゆう 16
未ソート れん 7
ソート済 れん 19
```

# 参考資料
https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B-ebook/dp/B0834JWWZG?keywords=python+%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1686011263&sprefix=python+%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%2Caps%2C632&sr=8-1&linkCode=ll1&tag=qiitajinbei23-22&linkId=44cf9c11307bbfd98ffd54fcde902e21&language=ja_JP&ref_=as_li_ss_tl

https://youtu.be/yLb718d38SA

https://colab.research.google.com/drive/1OnJiQZ0Wh0iklECTZcajv4c2D5zLheAK#scrollTo=FOINDyPfakDQ

# 関連資料
https://qiita.com/jinbei230525/items/42c9865367386a23b01e

# 編集後記
情報処理学会のアルゴリズム入門から線形検索について、学習してみた。
2023/6/6主にITとかセキュリティの記事

カスペルスキー、従業員のiPhoneで見つかったスパイウェアの分析結果公表(6/4)
https://www.zaikei.co.jp/article/20230604/724115.html

iPhoneにiMessage悪用してマルウェア感染させるゼロクリック攻撃、注意を(6/4)
https://news.mynavi.jp/techplus/article/20230604-2694429/

数百万人に影響の恐れ、悪意あるGoogle Chromeの拡張機能見つかる - 確認を(6/4)
https://news.mynavi.jp/techplus/article/20230604-2695867/

東京海上日動、サプライヤーなどに「コネクテッドカーサイバー保険」発売　製品起因のサイバー攻撃に対策費用(6/4)
https://news.yahoo.co.jp/articles/36fb8da86e075c8f1fd539e4089ccee0d556e9be?source=rss

2022年のフィッシング報告は前年比1.8倍、スマートフォンの被害状況は？(6/4)
https://news.mynavi.jp/techplus/article/20230604-2694210/

「ロシアのサイバー攻撃に備えを」　IT立国エストニア首相呼びかけ(6/4)
https://news.yahoo.co.jp/articles/e045fe6994762f33d1e3486aca59a94044aba00d

「新しい資本主義」改訂案 リスキリングや生成AI開発を強化(6/4)
https://www3.nhk.or.jp/news/html/20230604/k10014088841000.html

攻撃対象領域管理（Attack Surface Management、ASM）(6/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/052900143/

パナソニックHDが社内向け対話AIの開発・運用を強化、社外向けサービスも視野(6/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08077/

富士通の中計に見る人月商売IT業界の終焉、それにしても時田社長は「持っていない」(6/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/053100285/

月間7億人が利用、秘匿性の高さが売りの「Telegram」とは(6/5)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/051100111/

基幹システムをAzureに移行　3年・4000人月を投じる
第一フロンティア生命保険(6/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/052600132/

生産年齢人口が1200万人減少　賃上げへ本気のDXが必要だ(6/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/052600140/

生成AI時代のノーコードツール最前線(6/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/053100146/
2-03記憶管理

## 2-03記憶管理
記憶管理　プログラム記憶方式　
プログラムを主記憶に読み込んでおき、CPUが順次読みだし実行する方式です。主記憶の容量には限りがあるため，主記憶を効率よく管理することを記憶管理と言う。

### 実記憶管理
#### 区画方式
主記憶を幾つかの区画に分割して、プログラムに割り当てる方式
##### 固定区画方式
主記憶をあらかじめ決まった大きさの区画に分割する。各プログラムは格納できる大きさの区画に配置される。使用効率は悪いが，処理時間は一定で速い
##### 可変区画方式
主記憶をプログラムが必要とする大きさの区画に割り当てる。主記憶の使用効率は良いが，処理時間は不定で遅い

##### フラグメンテーション(fragmentation碎片化)
OSが主記憶の領域の獲得と解放を繰り返していくと，細切れの未使用領域が発生する現象
メモリコンパクション （memory compaction）
フラグメンテーションを解決するために、細切れの未使用領域を連続した一つの領域にまとめ、再び利用可能にする
##### スワッピング方式　（swapping）
実行中のプログラムのうち優先度の低いプログラムを一時中断して磁
気ディスクに退避（スワップアウト）して，優先度の高いプログラムを主記憶に配置する（スワップイン）方式
##### オーバレイ方式(overlay)
あらかじめプログラムを同時に実行しない排他的な幾つかの単位
（セグメント）に分割しておき，実行時に必要な部分だけを主記憶に配置して実行する方式です。
将一个大的程序分成若干个小的模块，每次只将需要执行的模块加载到内存中，其他模块则存放在外部存储器中，等到需要时再将它们替换到内存中，从而实现内存空间的节省

### 仮想記憶方式
プログラムを仮想記憶空間に格納しておき，実行時に必要なプログラムやデータを動的に実記憶に配置して実行する方式,主記憶の容量よりも大きなメモリを必要とするプログラムも実行できるようになる。

### ページング方式(页面置换)
主記憶とプログラムを固定長（ページという）に分割し，このページ単位で管理する方式
大きなプログラムを実行するときも，ごく短い時間を見れば，必要なのは一部のみであるこの方式では，実行するページが主記憶に存在しないときは，ページフォルトと呼ばれる割込みが発生し，不要なページを実記憶から補助記憶に追い出し（ページアウトという），必要なページを補助記憶から主記憶に配置します（ページインという）
ページフォルトが多発すると，処理効率が急激に低下する現象（スラッシング）
### ページ置換えアルゴリズム(页面置换算法)
ページング方式で，不要なページを決定する主な方法
FIFO方式（First-In First-Out）
最も古くから主記憶に存在するページを置
き換える
LRU方式（Least Recently Used）
最後に参照されてから最も経過時間が長いページを置き換える
LFU方式（Least Frequently Used）
参照回数が最も少ないページを置き換える
Langchainのメモリを基本的に状態を持たないstreamlitで実装する方法

streamlitは簡単に実装できますが、その反面状態管理は難しいです。一方でLLMアプリを作ろうと思うと会話の履歴やインデックスなど保持していてほしい情報がまぁまあまあります。

今回はstreamlitで特にlangchainのメモリ(会話の情報)を実装する方法を紹介します。

# 実装例
![ezgif-1-2fd740f2e0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53055/6498bddc-85db-f4c9-3395-c9d1aa2f9fdb.gif)

https://github.com/yazoo1220/streamlit-streaming-test

# streamlitの状態管理　st.session_state
streamlitでは基本的に状態を持たないので変数に何かを入れても何かアクションした瞬間(ボタン押すなど)すぐ消えてしまいます。

そこでst.session_stateが使えます。これはセッション中情報を保存してくれる特別な変数を設定するものです。
使い方としてはまず初期化して
```
# Initialization
if 'key' not in st.session_state:
    st.session_state['key'] = 'value'

```
その後この変数に情報を格納

```
st.session_state['key'] = 'value2'
```
呼び出すときは

```
st.write(st.session_state['key'])
```

とすればvalue2と表示されます。今回はkeyの部分をmemoryとしてその中身に会話の情報を入れていきます。

# langchainのメモリ
langchainは色々なメモリの保持の仕方がありますが、今回は一番基本的なConversationBufferMemoryを使います。


まずはConversationChainと一緒にインポートし

```
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
```
初期化　
```
def get_state(): 
     if "state" not in st.session_state: 
         st.session_state.state = {"memory": ConversationBufferMemory(memory_key="chat_history")} 
     return st.session_state.state 
state = get_state()
```
そしてChainの中にstate['memory']を入れます。
```
chat = ChatOpenAI(streaming=True, temperature=0.9)
        conversation = ConversationChain(
            llm=chat, 
            prompt=prompt,
            memory=state['memory']            
        )
```
これでchatの会話を保存してくれます。

過去の会話を要約したり、エンティティモデルやグラフとして格納する方法もありますので慣れたら是非memoryを入れ替えて楽しんでください。

chatの内容が保存されているのを確認できるデモアプリも作ったので遊んでみてください。

https://streaming-and-memory.streamlit.app/

同じようにstreamlitでlangchainを実装する際にハマるストリーミング(一文字(トークン)ずつアウトプットする)の方法もまとめたので困ったときは読んでみてください。
https://qiita.com/yazoo/items/b318adbab0d5f3f58dc8
【Laravel】マイグレーションのカラム作成、よく使うデータ型まとめ

# 目次
### 1. データ型
integer()
bigInteger()
double()
string ()
text()
boolean()
softDeletes()

### 2. カラム修飾子
default()
nullable()
comment()
unsigned()

### 3. おわりに

# 1. データ型

## integer()
データベースにINTEGERカラムを作成する。範囲は-2,147,483,648〜2,147,483,647。符号なしの場合は0〜4,294,967,295。
```
$table->integer('sales');
```

## bigInteger()
データベースにBIGINTカラムを作成します。範囲は-9,223,372,036,854,775,808〜9,223,372,036,854,775,807。符号なしの場合は0〜18,446,744,073,709,551,615。
```
$table->bigInteger('sales');
```

## double()
データベースにDOUBLEカラムを作成します。精度(合計桁数)とスケール(小数桁数)を指定します。下の例では全8ケタで小数点以下が2ケタになります。
```
$table->double('amount', 8, 2);
```

## string ()
データベースにVARCHARカラムを作成します。長さ(半角英数字での文字数)を指定します。最大65535。全角の場合は文字のbyte数により格納できる文字数が変わります。
```
$table->string('name', 100);
```

## text()
データベースにTEXTカラムを作成します。長さの指定はなく、半角英数字で65535文字入ります。
```
$table->text('description');
```

## boolean()
データベースにBOOLEANカラムを作成します。
```
$table->boolean('confirmed');
```

## softDeletes()
データベースにカラム名「deleted_at」のTIMESTAMPカラムを作成します。Eloquentの「ソフトデリート」機能に必要なdeleted_atタイムスタンプを格納するためのものです。
```
$table->softDeletes();
```

# 2. カラム修飾子
## default()
カラムのデフォルト値を指定できます。下の例では、category_idのデフォルト値に1を指定しています。
```
$table->bigInteger('category_id')->default(1);
```

## nullable()
カラムにNULL値を許します。モデルを生成する際に、そのカラムが空であることを許容できるようになります。
```
$table->text('self_introduction')->nullable(0);
```

## comment()
コメントを設定できます。データベースのカラムのコメントに反映されます。
```
$table->string('email')->comment('ユーザーのEメールアドレス');
```

## unsigned()
整数(integer)を符号無し(unsigned)にします。上記ではinteger()とbigInteger()に使えます。
```
$table->bigInteger('user_id')->unsigned();
```

# おわりに
Laravelでよく使うデータ型（カラム）についてまとめました。もっと他のデータ型を知りたいという方は、以下のLaravelのページ内「利用可能なカラムタイプ」をご参照ください。

https://readouble.com/laravel/9.x/ja/migrations.html
【AWS】AWS SAAまとめ③

# インスタンスファミリーとは
インスタンスファミリーは、インスタンスタイプの用途別の分類です。インスタンスファミリーの分類は、汎用、コンピューティング最適化、メモリ最適化、高速コンピューティング、ストレージ最適化に用途が分けられる。

|インスタンスファミリー|インスタンスファミリーの分類|用途|
|-|-|-|
|M|汎用|リソースのバランスが取れたインスタンスファミリー|
|T|汎用（CPUバースト機能）|バースト可能な汎用タイプのインスタンスファミリー|
|C|コンピューティング最適化|高性能なCPUを提供するインスタンスファミリー|
|R,X|メモリ最適化|大容量のメモリを提供するインスタンスファミリー|
|P,G,F|高速コンピューティング|高性能なGPUを提供するインスタンスファミリー|
|I,D,H|ストレージ最適化|高性能なローカルストレージを提供するインスタンスファミリー|

# AWS Billing and Cost Managementが提供している主な機能
|カテゴリー|機能|説明|
|-|-|-|
|Billing|請求書|・各月のアカウント全体の請求、請求のサービスごとの内訳を確認できる。　・請求情報はCSVファイルとしてダウンロードできる。|
|Billing|Cost & Usage Reports|・アカウントの請求情報や使用金額をはじめとして、より詳細な製品属性、料金属性などをまとめたレポートを自動作成できる　・AWSサービスごとの使用状況をレポートとして作成可能|
|Cost Management|Cost Explorer|・サービスごとにコストとリソース使用状況をグラフによって可視化し、分析・予測ができる|
|Cost Management|Budgets|・利用サービスのリソース状況、コストを監視し、設定した予算を超えた場合アラート発報を行うことができる　・設定予算ごとの状況確認、管理ができる|

# Route53で作成可能な、一般的なDNSレコードのタイプ
|レコードタイプ|説明|
|-|-|
|Aレコード|IPv4アドレス用のレコード|
|AAAAレコード|IPv６アドレス用のレコード|
|CAAレコード|ドメインまたはサブドメインの証明書認証機関(CA)を指定できるレコード|
|CNAMEレコード|あるホスト名に対する別名を定義するレコード|
|DSレコード|サブドメインでDNSSECを利用する際に使うレコード|
|MXレコード|該当ドメイン宛のメールサーバーのホスト名を定義するレコード|
|NAPTRレコード|動的委任発見システム(DDDS)アプリケーションで使用されるレコード|
|NSレコード|ホストゾーンのネームサーバーのサーバー名を定義するレコード|
|PTRレコード|IPアドレスを対応するドメイン名にマッピングするレコード|
|SOAレコード|Start Of Authority（SOA）レコード<br>ドメインおよび対応するRoute53のホストゾーンを定義する|
|SPFレコード|メール送信者の身元を確認するために利用されるレコード<br>※現在はSPFレコードの代わりにTXTレコードの作成が推奨される|
|SRVレコード|ホスト名に加えて負荷分散優先順位、重み、サービスポート番号の３種類の情報を付与できるレコード|
|TXTレコード|ホスト名に関連付けるテキスト情報を定義するレコード|
|エイリアスレコード|AWSアカウント内の特定のサービスで作成されたリソースやエンドポイントを登録するレコード。AWSのみで利用可能な特殊なレコード|

# 参考
https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-%E7%AC%AC3%E7%89%88%EF%BC%BBSAA-C03%EF%BC%BD%E5%AF%BE%E5%BF%9C/dp/4295016098/ref=sr_1_3?keywords=aws+saa&qid=1682091471&sprefix=aws+saa%2Caps%2C172&sr=8-3

https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3-Amazon-Web-Services%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-ebook/dp/B09MQ14XR1/ref=sr_1_40?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1EBE6F4T4ZH0I&keywords=aws&qid=1685982524&sprefix=aws%2Caps%2C192&sr=8-40
早期リターンのメリット

早期リターンのメリットについて、Kotlinのコードから理解する

## パフォーマンスの向上

与えられたリストからターゲットの要素を探し、最初に見つかった要素のインデックスを返す関数

```kotlin:早期リターンを使用した場合
fun findElementIndex(elements: List<Int>, target: Int): Int {
    for (index in elements.indices) {
        if (elements[index] == target) {
            return index
        }
    }
    return -1
}
```

:::note info
ターゲットの要素が見つかった際に、即座にインデックスを返して関数を終了している
:::


```kotlin:早期リターンを使用しない場合
fun findElementIndex(elements: List<Int>, target: Int): Int {
    var result = -1
    for (index in elements.indices) {
        if (elements[index] == target) {
            result = index
        }
    }
    return result
}
```

:::note alert
ターゲットの要素が見つかっても、全要素の探索を終えるまで処理は終わらない
:::

## コードの可読性の向上

価格の計算を行う関数

```kotlin:早期リターンを使用した場合
fun calculatePrice(quantity: Int, pricePerItem: Double): Double? {
    if (quantity < 0 || pricePerItem < 0) {
        return null
    }
    val totalPrice = quantity * pricePerItem
    return totalPrice
}
```

:::note info
`quantity`か`pricePerItem`が負の場合、即座に`null`を返して関数を終了している
:::

```kotlin:早期リターンを使用しない場合
fun calculatePrice(quantity: Int, pricePerItem: Double): Double? {
    var totalPrice: Double? = null
    if (quantity >= 0 && pricePerItem >= 0) {
        totalPrice = quantity * pricePerItem
    }
    return totalPrice
}
```

:::note alert
条件が満たされない場合でも後続の処理が行われてしまう
:::

## バグの削減

引数`a`を引数`b`で割った結果を返す関数

```kotlin:早期リターンを使用した場合
fun divide(a: Int, b: Int): Double? {
    if (b == 0) {
        return null
    }
    val result = a.toDouble() / b.toDouble()
    return result
}
```

:::note info
ゼロで割り算をしようとした場合、nullを返してゼロ除算によるバグを防いでいる
:::

```kotlin:早期リターンを使用しない場合
fun divide(a: Int, b: Int): Double? {
    val result = a.toDouble() / b.toDouble()
    if (result == 0.0) {
        return null
    }
    return result
}
```

:::note alert
意図せずゼロ除算が行われる可能性があるため、バグ発生の恐れがある
:::

## プログラムの構造化

与えられた数値が偶数であるか判断する関数

```kotlin:早期リターンを使用した場合
fun isEven(number: Int): Boolean {
    if (number % 2 != 0) {
        return false
    }
    return true
}
```

:::note info
数値が奇数の場合に即座に`false`を返すことで、判定ロジックが明確化されプログラムの構造がシンプルになる
:::

```kotlin:早期リターンを使用しない場合
fun isEven(number: Int): Boolean {
    var isEven = true
    if (number % 2 != 0) {
        isEven = false
    }
    return isEven
}
```

:::note alert
不要な変数の使用や条件判定後の冗長な代入処理を行うことで、単純な処理を複雑にしている
:::

## エラーハンドリングの簡素化

与えられた文字列が一定の条件を満たしているか検証する関数

```kotlin:早期リターンを使用した場合
fun validateInput(input: String): Boolean {
    if (input.isEmpty()) {
        return false
    }
    if (input.length > 10) {
        return false
    }
    return true
}
```

:::note info
エラーハンドリングのロジックが簡素化され、不正な入力の検出や処理が容易になる
:::

```kotlin:早期リターンを使用しない場合
fun validateInput(input: String): Boolean {
    var isValid = true
    if (input.isEmpty()) {
        isValid = false
    }
    if (input.length > 10) {
        isValid = false
    }
    return isValid
}
```

:::note alert
不要な変数の使用や条件判定後の冗長な代入処理が発生している
:::
railsを使ってアプリを作る 編集


ルーティングの作成
```get "posts/:id/edit" => "posts#edit"```

対応するviewのリンクの作成
```<%= link_to("編集", "/posts/#{@post.id}/edit") %>```

htmlの作成

    <%= form_tag("/クラス名/メソッド名") do %>
      <div class="form">
        <div class="form-body">
          <textarea name="content"><%= @post.content %></textarea>
          <input type="submit" value="保存">
        </div>
      </div>
    <% end %>
Prometheus メトリクスデータの保持期間を変更してみた

OpenShiftにおけるPrometheusメトリクスデータの保持期間は、デフォルト15日間のようなので、24時間に変更してみました。

変更手順は下記の通りです。

・手順1
oc -n openshift-monitoring get configmap cluster-monitoring-config
・手順2
oc -n openshift-monitoring create configmap cluster-monitoring-config
・手順3
oc -n openshift-monitoring edit configmap cluster-monitoring-config
・手順4
下記を追記する。
data:
  config.yaml: |
    prometheusK8s:
      retention: 24h
・手順5
OpenShift Web コンソールから変更内容を確認できます。
![OpenShift Web コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357652/0c76aa09-6b08-ae1e-f2f6-23664293f3b7.png)

参考：https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.6/html/monitoring/modifying-retention-time-for-prometheus-metrics-data_configuring-the-monitoring-stack
参考：https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.1/html/monitoring/configuring-the-monitoring-stack
Linux　mntってなに

## mntとは

Linuxシステムにおけるマウントポイント（Mount Point）を表すディレクトリ

マウントポイント：外部のデバイスやファイルシステムをLinuxファイルシステムの一部としてアクセスするために使用される

:::note
Linuxでは、デバイス（ハードディスク、USBドライブなど）やネットワーク上のリソース（NFS、SMBなど）を**ファイルシステムツリーに組み込むプロセス**を「マウント」と呼ぶ
:::