OmniAICreator/Qiita-1.07M huggingface dataset:
pythonで特異値分解を左右特異ベクトルと特異値行列を計算して再現を確認

行列Xを特異値分解して元の行列を再現する


$X = USV$
と特異値分解して各行列$U,S,V$を計算する


特異値分解する行列$X$を設定
```python
import numpy as np

X = np.array([
    [1,2],
    [3,4],
    [5,6],
    [7,8]
])
print(X)
```
```python
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
```

$X$(M行×N列)のM,Nを求めて
M=Nの時
M>Nの時
M<Nの時
で場合分けして$U,S,V$を計算する


```python
M,N = X.shape

U,D,V = np.linalg.svd(X)
if M == N:
    S = np.diag(D)
elif M > N:
    S = np.vstack([np.diag(D),np.zeros((M-N,N))])
else:
    S = np.hstack([np.diag(D),np.zeros((M,N-M))])
print('(M,N)=',(M,N))
print('S.shape:',S.shape,'\n')
print('U:\n',U,'\n')
print('S:\n',S,'\n')
print('V:\n',V,'\n')
```
```python
(M,N)= (4, 2)
S.shape: (4, 2) 

U:
 [[-0.15248323 -0.82264747 -0.39450102 -0.37995913]
 [-0.34991837 -0.42137529  0.24279655  0.80065588]
 [-0.54735351 -0.0201031   0.69790998 -0.46143436]
 [-0.74478865  0.38116908 -0.5462055   0.04073761]] 

S:
 [[14.2690955   0.        ]
 [ 0.          0.62682823]
 [ 0.          0.        ]
 [ 0.          0.        ]] 

V:
 [[-0.64142303 -0.7671874 ]
 [ 0.7671874  -0.64142303]] 

```
$USV$で元の行列$X$が再現されているかを確認

```python
print(np.dot(np.dot(U,S),V))
```
```python
[[1. 2.]
 [3. 4.]
 [5. 6.]
 [7. 8.]]
```
npmやyarnからパッケージをインストールする際に気をつけること

```
#0 3.710 npm notice New major version of npm available! 8.5.1 -> 9.1.3
#0 3.710 npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.1.3>
#0 3.710 npm notice Run `npm install -g npm@9.1.3` to update!
#0 3.711 npm notice
#0 3.712 npm ERR! code ERESOLVE
#0 3.714 npm ERR! ERESOLVE unable to resolve dependency tree
#0 3.714 npm ERR!
#0 3.714 npm ERR! While resolving: tmp@0.1.0
#0 3.714 npm ERR! Found: react@17.0.2
#0 3.714 npm ERR! node_modules/react
#0 3.714 npm ERR!   react@"^17.0.2" from the root project
#0 3.714 npm ERR!
#0 3.714 npm ERR! Could not resolve dependency:
#0 3.714 npm ERR! peer react@">=18.0" from @react-three/fiber@8.9.1
#0 3.714 npm ERR! node_modules/@react-three/fiber
#0 3.714 npm ERR!   @react-three/fiber@"^8.9.1" from the root project
#0 3.714 npm ERR!
#0 3.714 npm ERR! Fix the upstream dependency conflict, or retry
#0 3.714 npm ERR! this command with --force, or --legacy-peer-deps
#0 3.714 npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
#0 3.714 npm ERR!
#0 3.714 npm ERR! See /root/.npm/eresolve-report.txt for a full report.
#0 3.715
#0 3.715 npm ERR! A complete log of this run can be found in:
```

任意のパッケージをインストールしようとするとエラーが起きる場合がある
インストールしようとしているバージョンが対応したnpmのバージョンになっていない可能性があるので
パッケージをインストールする際は現在のnpmに対応したバージョンをインストールするようにしよう！



### Dockerでのnpmの確認方法
```
$ docker-compose exec app npm -v
```
dockerの中に入ってnpmのバージョンを確認する

```Dockerfile
FROM node:17.6.0

WORKDIR /usr/src/app
COPY ./ ./

RUN npm install

CMD ["npm", "start"]
```

dockerのnodeのバージョンを確認して(今回は17.6.0)

![スクリーンショット 2022-12-05 0.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549641/2881f0b8-3196-29a9-ee92-f25af6403e15.png)


nodeの安定バージョンリストでそれに対応したnpmを確認する(8.5.1)
ニジボックスでState Of JavaScript / CSS のスポンサーになった話

# ニジボックスで State Of JavaScript / CSS のスポンサーになった

https://stateofjs.com/en-us/

こちら、フッターを見てくれると良いのですが、 Google の隣に並んでいますね。震えますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6031/03d63ce8-226f-3326-8c05-fd0c6518b2ad.png)

## 経緯

もともとは POST Dev というイベントがありました。ニジボックスの中でやったイベントの中でもかなり大掛かりなものであり、イベントトータルで見ても楽しかったなーと思っています。
総合司会としてずっと出てましたが、いつもやってる JSConf.jp のような技術だけを紹介するイベントではなく、組織論とか技術以外の話もチラホラ存在する範囲の広いイベントだったと思っています。

https://lp.nijibox.jp/cp/postdev/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6031/61cca23c-d8f3-094d-69ab-7bad7565a670.png)

さて、そのイベントの中で　Sacha さんは State Of JavaScript / CSS の結果を通じて最先端の JavaScript トレンドがどうなるかを教えてくれました。
その話で色々と聞いていたら、 **「実はスポンサー募集してる」という事で「せっかくだし、スポンサーにならせてください」** 、と手を上げたのがきっかけです。

今回の記事は State Of JavaScript が如何に一人の個人が頑張って活動しているかをお伝えしようと思います。 Sacha のためにもスポンサーを増やしたいと思っており、これを見た方々は是非ご検討頂けると幸いです。

## State Of JavaScript / CSS とは

そもそもの話をしていませんでしたが、 State Of JavaScript / CSS とは JavaScript / CSS についての調査・サーベイをするものです。毎年年末になるとサーベイが開始され、サーベイ結果に基づいて結果が年始から4月頃に公開されます。例えばこういう結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6031/76e6a02b-00ff-638d-0cdc-62728da4bacd.png)

この結果は横軸がポジティブかネガティブか、縦軸が使っているか使っていないかを示しています。これを見ていると、例えば　Svelte とかは少しずつ使われていて、ポジティブな意見が増えていることがわかります。こういう結果を出すために数年かけて毎年サーベイをしています。

## State Of JavaScript の中身

2021 年の JSConf.jp でどうやって作っているかを発表してくれていました。 いろいろなツールを使っているのかと思いきや、ほとんど自分で作って管理しているとのことでした。一回作ったものを使い回すのではなく、自分で使ってみて、実際の使い心地を調べながらやっているみたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6031/49208a8d-c623-69d0-d258-527eb76d03bd.png)

https://github.com/Devographics

## スポンサーになることを検討してみませんか？

Sachaはスポンサーを募集しています。特に日本企業のスポンサーが居てくれると嬉しいそうです。 State Of JavaScriptの内容はおそらく世界中のフロントエンドエンジニアが読む資料ですが、ほぼ彼と数名のボランティアとコミュニティにより継続されています。彼は日本で暮らしていますが、日本のスポンサーが増えれば増えるほど、住み続けやすくなるでしょう（ビザ等の関係で）。

スポンサーになりたいということであれば、直接彼とコンタクトを取ってみてください。
https://sachagreif.com/
MATLAB で Digital Lossy VST プラグインを作る ～ 聴覚心理特性とは？ ～ 非同期バッファで MDCT

[<B>MATLAB/Simulink Advent Calendar 2022</B>](https://qiita.com/advent-calendar/2022/matlab) に参加予定です。
<br>
公開しました。
<br>

・使用ツール
<dt>　MATLAB</dt>
－Audio Toolbox
<br>
<br>
・デモ動画
<B>[Digital Lossy VST プラグイン]</B><iframe width="703" height="268" src="https://www.youtube.com/embed/eQLXjcwAZX4" title="DLossy7 - Digital Lossy Plugin" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br>
<br>
<H4><a href="https://note.com/leftbank/n/nf62235fa6ebd"</a> [<B>note</B>]にUpしました。</H4>
JavaScriptの「卵が先か、ニワトリが先か」問題

# 卵が先か、ニワトリが先か

少し前ですが、こんなツイートが流れて来ました。

https://twitter.com/madzadev/status/1585288906358095872

JavaScript的にはニワトリが先のようです！！

このツイートを見て、自分もDevToolsのコンソールで試して見たところ ["🥚","🐣","🐥"]をsortしたところ、

予想：["🐥","🐣","🥚"]
実際：["🐣","🐥","🥚"]

なってしまいひよこが卵の殻に入って、ひよことして自立して、卵になるストーリーになってしまいました。。。
![スクリーンショット 2022-12-05 0.11.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/3aed6892-397b-4e7a-5ca2-d1976876433c.png)

卵が先か、ニワトリが先か、卵からでかけのニワトリが先か
この問題について、なぜこうなるのかを調査していきたいと思います。

## sortの処理について
まずsortの処理についてしっかり理解していきます。

sort() メソッドは、配列の要素を**In-placeアルゴリズム**でソートし、ソートされた同じ配列の参照を返します。既定のソート順は昇順で、要素を文字列に変換してから、 **UTF-16 コード単位の値の並び**として比較します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

なるほど UTF-16コードがポイントな気がしてきました。


## コードポイント値
文字列をCode Point(16進数)の配列にして返すconvertCodePoints関数を用意しました。
```js
function convertCodePoints(str) {
    return Array.from(str).map(char => {
        return char.codePointAt(0).toString(16);
    });
}

const str = "🥚🐣🐥";
const codePoints = convertCodePoints(str);
console.log(codePoints); // => ['1f95a', '1f423', '1f425']
```

🥚 => '1f95a'
🐣 => '1f423'
🐥 => '1f425'

UTF-16にすると以上のような5桁の16進数になります。

これをsortすると以下の様になり、
```js
[ '1f95a', '1f423', '1f425' ].sort()
> ['1f423', '1f425', '1f95a']
```

["🐣","🐥","🥚"] の順になるということですね。


## おまけ
**ローストチキンがニワトリ・卵より先**
![スクリーンショット 2022-12-05 0.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/2c780151-cc4f-c3b4-d4bd-f2dd1ec5b69c.png)

**大人男性がおじいさん・赤ちゃんより先**
![スクリーンショット 2022-12-05 0.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/a1377a2c-978d-3bb0-502a-1cb2aea23423.png)




# 参考
https://jsprimer.net/basic/string-unicode/
【Java】参照型オブジェクトの罠

<h1>【Java】参照型オブジェクトの罠</h1>


<p>以下の事象が発生して、解消に時間がかかったので、共有します！</p>

<h3>■起きた事象</h3>
<p>レスポンスの件数分、参照型オブジェクトをarrayにaddしたのだが、addされた[0]番目の要素の値のみがレスポンスの件数分、置き換わってしまう。<br><br>
以下のコードは、Listに格納されたレスポンスの件数分、arrayにaddするコードです。</p>

```java:bug
	void bug() {
        List<Response> response = new ArrayList<>();
        /*******************  処理省略 *******************/
		List<Test> array = new ArrayList<>();
		Test test = new Test();

		for(int i = 0; i < response.size(); i++) {
            test.setId(response.get(i).getId());
            test.setName(response.get(i).getName());
            test.setFullName(response.get(i).getFullName());
            //responseが3件あった場合、
            //arrayの0番目の要素の値が都度置き換わってしまい、１、２番目に値が格納されない
			array.add(test);
		}
	}
```

<h3>■解消法</h3>

```java:success
	void success() {
        List<Response> response = new ArrayList<>();
        /*******************  処理省略 *******************/
		List<Test> array = new ArrayList<>();

		for(int i = 0; i < array.size(); i++) {
			//Testインスタンスを都度生成すると参照が変わるので、全ての要素に正しく値が格納できる。
			Test test = new Test();
            test.setId(response.get(i).getId());
            test.setName(response.get(i).getName());
            test.setFullName(response.get(i).getFullName());
			array.add(test);
		}
	}
```

<h3>■まとめ、参考文献</h3>
<p>雑な説明になってしまって申し訳ありません。。<br>
以下のサイトなどで、参照型オブジェクトに関して詳しく説明してくれているので、そちらも見てみてください！！</p>

https://qiita.com/akitaaa/items/b7b15229f7582038fc93

https://qiita.com/shunsuke227ono/items/07c08cf5640564f7739c
ユーザー定義ルートと使用手順

●ユーザー定義ルート
Azureで管理されるシステムルートを変更することはできないが、ユーザー定義ルートを作成することで別のルートを使用するシナリオ対応が可能。
ユーザー定義ルートとして指定されたルート情報は、システムルートより優先度が高いルート情報として使用されるので、既定のシステムルートをオーバーライドしたり、サブネットのルートテーブルにルートを追加したりするのに役だつ。

●ユーザー定義ルートの使用手順
ユーザー定義ルートを使用して特定の宛先への通信経路を変更する手順
１、ルートテーブルの作成
２、ルートの追加
３、サブネットへの関連付け
４、変更されたルートの確認
落ちこぼれエンジニアが社内外で発信活動をし始めてから気づいた3つの事

## はじめに

「アウトプットはいいぞカレンダー」参加記事という事で、現在社会人3年目で、ちょうど半年前位から発信活動を始めて今感じていることを記事にしました。

私自身、所謂「強い」エンジニアでは全くなく、入社してから勉強を始めたので特に1,2年目の頃は落ちこぼれと言って良いほど何も出来ませんでした。ただ、**発信活動を始めたからこそ気づけたこと**が沢山あります。

私のように「強いわけではない」方が、アウトプットを始める機会になれば幸いです。

## 「発信する人が一番勉強になる」という話

これは社内の方から頂いた言葉です。

例えば勉強会を例に取ると、勉強会のジャンルによっては「参加者は勉強会の時間分の話を聞いている」だけになってしまう場合もありますが、**発表者は人に伝える為に、参加者の何倍もの時間を使って準備・学習する**事になります。

勿論、時間を取る分勉強出来るという事もありますが、「何となく聞いている」事になってしまいがちな参加者に比べて「分かりやすく、正しい情報を伝える」という明確な目的が存在する発表者の方が、**時間当たりの学習効率も高い**と思います。

私自身も「正しい情報」を伝える為に**一次情報**を出来るだけ手に取るようにする癖がつきましたし、「分かりやすく」伝える為の**資料の見せ方**や**話し方**が多少身についたように感じます。

## 「発信する人の周りに情報が集まってくる」という話

こちらについては「2つの方面」の情報の集まり方があるなと最近感じています。
**1つ目は「相談が来るようになる」点です。**

勉強会や社内での情報提供を始めるようになり「自分が強いテーマや関心のあるテーマ」が知れ渡ることによって、あるテーマについて相談される事が増えました。

実際にはそのテーマについてそこまで詳しくなかったとしても、**相談を受ける→調べて回答する**を繰り返す事で、少しずつ知識が身についていった部分があると思います。

また、そういった相談は一問一答形式で回答出来ない場合が多々あるので、「その状況に応じて」「今自分の持っている知識を組み合わせながら」回答することにより、より実践的な知識として自分の中に定着していっているように感じます。

**2つ目は「自分より更に強い人からアドバイスが貰える」点です。**

例えば勉強会を開催した際に、自分よりその分野に詳しい人や、近い分野で詳しい人がいる場合に**補足の情報**を追加で頂けたりする点もかなり大きなメリットだと感じます。

他にも、同じテーマでも人それぞれ感じていることが違ったりするので、頂いたコメントや感想が参考になる事もあります。

## 「自分なりの視点があれば、それが価値を生み出すこともある」という話

勿論、事実や知識の提供のみだと「強い」エンジニアの方や公式ドキュメントには到底敵いませんし、「強い」エンジニアが周りにいる中で発信をする事は時に緊張も伴います。

ただ、**情報に自分なりの視点を足す**ことで、情報に価値が生まれる場合もあります。

例えば以下の私の記事の場合は「VSCode」「VSCode拡張機能」「Github」と単体では何の変哲もない知識ですが、
「インプット→アウトプット環境」という新しい視点を足せたからこそ、多くの人に見て頂いたりコメント等を頂けたのかな、と思っています。

https://qiita.com/yoyoyo_pg/items/413729f47854af2e644b

なので最近は「強くない」自分だからこその情報提供の仕方もあるのだなと思い始めています。

## おわりに

以上、ここ半年特にアウトプット活動を始めて良かった事・気づいた事をまとめてみました。

定期的にアウトプットする機会を作る事で、勉強が捗ったりもします。
「最初から強いやつ」ではないからこそ、自分が強くなる為の戦略として、今後も継続してアウトプットしていけたらな、と思います。
aws 無限列車発進！！！

# 概要

* 本記事は、[KDDIアジャイル開発センター Engineer & Designer Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kag)の4日目の記事となります。
* あらかじめ言っておきます。**本記事は何の役にも立ちません。ご容赦ください。**
* やりたいことは1つ。「**DynamoDBにデータを書き込むHTTPエンドポイント**」という要件を満たす aws のアーキテクチャ構成を考えます。
* ※ 実はこちら、昨年の JAWS DAYS 2021 の枠内で開催されましたピタゴラスイッチ選手権で出されたお題の1つとなっています。

## よくある構成

* あらためて、お題というのが「**DynamoDBにデータを書き込むHTTPエンドポイント**」です。
* この要件を満たそうとすると下記がよくある構成ですよね。

![スクリーンショット 2022-12-04 23.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/7507bdaa-4f0c-b148-2e8d-ecd63118edf3.png)

* 今ですと、Lambda でもHTTPSのエンドポイントが生やせるので、下記のような構成も取れそうですね。

https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/

![スクリーンショット 2022-12-04 23.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/25f6eec8-7406-d079-5503-8b39dc4dc5ad.png)


## aws を使ったアーキテクチャ構成

* さて、じゃあ私が考えたアーキテクチャをお見せします。

![スクリーンショット 2022-12-05 0.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/5ee652e0-9870-a5f3-21b7-283eac4f2385.png)



# まとめ

* EventBridge Pipes が便利だぜってことを言いたかっただけです。w
* EventBridge Pipes については、下記を見ていただけますと幸いです。

https://qiita.com/yoshii0110/items/1ec1716c84903e8791a8


# 参考文献

https://dev.classmethod.jp/articles/jawsdays2021-pitagora-aws/
AWS認定クラウドプラクティショナー合格に向けて Day12

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day11](https://qiita.com/Ayako_0224/private/dda05692457fa815f993)

# EBSとは
 EC2インスタンスと一緒に使うブロックストレージ
インスタンス上のワークロードなどに利用する

## EBSの選択
AWSには3つの形式が用意されている
- ブロックストレージ
    - EBS
    - インスタンスストア
- オブジェクトストレージ
    - S3
    - Glacier
- ファイルストレージ
    - EFS

## EBSの特徴
- 他のアベイラビリティゾーンのインスタンスにはアタッチできない
- 1つのEBSを複数のインスタンスで共有することができない(プロビジョンドIOPS除く)
- 同じアベイラビリティゾーン内のインスタンスのみ切替が可能

## EBSのボリュームタイプ
- SSD
    - 汎用SSD(1GB~16TB)
    - プロビジョンドIOPS(4GB~16TB)
- HDD
    - コールドHDD(500GB~16TB)
    - スループット最適化(500GB~16TB)
- マグネティック(1GB~1TB)

## EBSのバックアップ
EBSはスナップショットを利用してバックアップを取得する
S3に保存されている
DLMを利用すればスナップショットを定期的に取得するなどスケジューリングも可能になる

## スナップショットの共有
- リージョン間の共有が可能
- 権限を変更すれば他のアカウントでも閲覧が可能

## スナップショットとAMI
AMIはOS設定のイメージ
スナップショットはストレージのバックアップ

## EBSの削除
EC2のインスタンス削除のタイミングで削除されてしまうためデータを残したい場合は設定が必要

## EBSの暗号化
CMKを利用してボリューム作成時とスナップショット作成時に暗号化を実施する

## EBSのRAID構成
- RAID 0
    - パフォーマンスの向上が目的
    - ストライピング
- RAID 1
    - ボリュームの冗長性が向上
    - 2つのボリュームを同時にミラーリング

次の記事は➡︎[AWS認定クラウドプラクティショナー合格に向けて Day13](https://qiita.com/Ayako_0224/items/e44d4b8b01d44d236f23)
App Service で Tomcat アプリケーションをデプロイする際の注意点

# はじめに
[Microsoft Azure Tech Advent Calendar 2022](https://qiita.com/advent-calendar/2022/microsoft-azure-tech "Microsoft Azure Tech Advent Calendar 2021") の 4 日目の記事です。本稿では、App Service で Tomcat アプリケーションをデプロイする際に陥りやすい注意点を紹介します。


# 概要
App Service における Tomcat アプリケーションのデプロイ方法については、公式ドキュメントの[WAR、JAR、EAR パッケージをデプロイする](https://learn.microsoft.com/ja-jp/azure/app-service/deploy-zip?tabs=cli#deploy-warjarear-packages") にて解説されています。こちらのドキュメントにて言及されているとおり、サポートされている手段はAzure CLI、PowerShell、Kudu publish API となっており、FTP や WebDeploy によりデプロイされたアプリケーションの動作は保証されておりません。また、Kudu サイトの UI から手動でデプロイ資産を配置してデプロイすることもサポートされておりません。 サポートされていない方法でデプロイを実施した場合、稀に 404 エラーが発生するという事象が発生するとともに、その他にも想定外のエラーが発生する可能性があります。

# サポート対象のデプロイ方法が限られている理由
## 前提
前提として App Service のアーキテクチャについて解説します。まず、App Service では可用性を向上させるために複数のインスタンスを用いてアプリケーションを運用することができますが、ホームディレクトリ(Windows: C or D\home\、Linux: /home)配下のディスク領域は、各インスタンス間で共有されるストレージがマウントされています。共有ストレージに関しては公開ドキュメントの[複数のインスタンス間でのファイル アクセス](https://learn.microsoft.com/ja-jp/azure/app-service/operating-system-functionality#file-access-across-multiple-instances)でも解説されております。

## サポート外のデプロイ方法によって発生し得る事象
以上のアーキテクチャを受けて本題に入りますと、サポートされていない方法でファイルを共有ストレージ上に配置した場合で App Service が再起動した場合は、各インスタンスの Tomcat が起動する際に稀に同時に同じ Java 資産（class ファイル等）にアクセスしてしまう問題が発生します。こちらの事象が何故問題になるかというと、一方のインスタンス上にある Tomcat が特定のファイルを処理している最中にファイルロックを掛けることで他のインスタンスが同一のファイルにアクセスした際にファイルをオープンできず、404 エラーが発生してしまいます。

正しいデプロイ方法の場合は Java の資産が D:\DWASFiles\Sites\<App Service のリソース名>\Temp\tomcatFiles\XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\site\wwwroot のような、インスタンスのホームディレクトリ外のローカル領域に展開されます。このように Java の資産が展開される詳細な動作については [App Service における Tomcat アプリケーションへの war ファイルのデプロイについて](https://qiita.com/georgeOsdDev@github/items/c8184d7b8676f10982d9) の記事でも解説されております。


# 最後に
App Service にて Java アプリケーションを Tomcat にて複数インスタンスで運用しており、App Service の再起動時に 404 エラーが発生している場合は、デプロイ方法がサポートされている方法なっているかを確認しましょう。Tomcat の catalina ログに FileNotFoundException が記録されているような場合は、今回解説したようなファイルロックの問題が発生している可能性が考えられます。（ロック中のファイルにアクセスした場合、FileNotFoundException が発生し得ます。）そのため、原因の調査にあたっては catalina ログも同時に確認すると原因の切り分けに繋がるでしょう。
何度も言うけどNumEntryGuardsは中継ノードの数じゃない

# NumEntryGuardsは中継ノードの数じゃない。
NumEntryGuardsを変更しても中継ノード数は変わりません。
これはTorの仕様です。
Torサーキットは入口ノード、中間ノード、出口ノードの三つで構成されます。
なお、相手がHSの場合はHS側もサーキットを構築して中継ノード数が増える場合があります。(rendezvous pointとかそういうので調べたらわかるかも。)
しかし、Qiitaを含めTor関連の記事を見ると大抵中継ノード数だと書かれています。
一体どこでこんな情報が出てきたんですかね？
日本語の記事だけを調べたところ2014年に投稿されたブログの記事が初出ぽいのですが、詳しい事は言及しないでおきます。

# じゃあNumEntryGuardsってなんなのよ。
入口ノードの候補数を変更する設定です。
マニュアルを読みましょう。
https://2019.www.torproject.org/docs/tor-manual.html.en#NumEntryGuards


# どうやれば中継ノード数を増やせる？
ひとつはTorのソースコードを変更する事です。
TorはOSSですので、ソースコードが公開されており、誰でも変更を加えることが出来ます。
https://github.com/torproject/tor

もう一つは仮想OSとかを使って伸ばしていく方法です。
適切な設定の上でホストOSでTor通信を行い、仮想OSでもTor通信を行えばノード数は6になります。
あまりスマートな方法とは言えませんが...
だれか仮想OSを使わなくとも複数のNAT(?)を通す方法知りませんかね。
switch文を使った演習

# 問題
リレーの順位に応じて以下の点数を出力してくださ。
1位は50点、2位は40点、3位は30点、4位は20点、5位以下は10点。

```java
public static void main(String[] args) {
		score(1);
}	
public static void score(int grade) {
	switch(grade) {
		case 1:
			System.out.println("50点");
			break;
		case 2:
			System.out.println("40点");
			break;
		case 3:
			System.out.println("30点");
			break;
		case 4:
			System.out.println("20点");
			break;
		default:
			System.out.println("10点");
			break;
	}
}

//演算結果
//50点
```

# 補足
- switch文の場合if文と違って、条件に当てはまっても以降の処理を行うのでbreakを使って強制的に終了させる必要がある。
→逆にあえてbreakを書かずに処理を行わせることもある
- defaultは必ずしも必要というわけではない
- 一般的には分岐が３つや４つ以上になるときに使われるらしいが、スクールの先生はifを使うことの方が多い気がすると言っていた。（私はifの方が先に条件を設定するからわかりやすくて好きかも）
AzureとAWS比較 IaaS ネットワークセキュリティの違いについて

AWSの検証を行っているときにネットワークACL(Access Control List)とセキュリティグループの違いについて調べたので、これを起点にAzureとのIaaSにおけるネットワークセキュリティについて比較しようと思いました。

# AzureのNetwork Security Group(NSG)
まずはAzureから。
**AzureのNSGはステートフルです。**
IaaSのNIC、若しくはIaaSの存在するサブネットに対してインバウンドかアウトバウンドかを選択し、以下の5タプル(要素)で通信の制御を行います。

**1. Source IP Address
2. Destination IP Address
3. Protocol
4. Source Port
5. Destination Port**

# AWSのネットワークセキュリティ
**AWSのネットワークセキュリティもステートフルです。**
AWSのIaaSの存在するVPCに対してインバウンドかアウトバウンドかを選択し、以下の3つの要素で通信の制御を行います。
**1. プロトコル
2. ポート
3. Source IP Address**

## AWSのネットワークACL
**AWSのネットワークACLはステートレスです。**
AWSのIaaSの存在するVPC内のサブネットに対してインバウンドかアウトバウンドかを選択し、ネットワークセキュリティと同じ3つの要素で通信の制御を行います。
<font color="Red">**ただし、ステートフルなため、インバウンドルールに対しては対象の通信のレスポンスにあたるアウトバウンド方向の通信も許可しなければならず、インバウンドルールに対してもレスポンスにあたるアウトバウンドルール方向の通信も許可しなければなりません。**</font>

## ネットワーク層におけるステートフルとステートレスの違いは何か？
はい。
ここで本題です。
**ステートレス:AWSのネットワークACLは許可したい通信に対して、レスポンスの通信を許可しなければならない
ステートフル:AzureのNSGやAWSのネットワークセキュリティは、インバウンドであれアウトバウンドであれ、許可したい通信のみを許可し、許可したい対象のレスポンスの通信は許可する必要がない**
これがステートレスとステートフルの違いです。

## ステートレスとステートフル、どちらが優れているのか？
優劣はありません。
場合によって制御しやすい方を選択します。
ルーターなどによくある機能の<font color="Red">**SPI**</font>は<font color="Red">**S**</font>tateful <font color="Red">**P**</font>acket <font color="Red">**I**</font>nspectionの略で、ステートフルに通信制御を行う機能です。

## ちょっと分かりにくいんで具体的な例を挙げてくれませんか？
そうですよね。
**ステートフルな通信制御機能を持つルーターでアウトバウンド方向にAny Any Permit、インバウンド方向にAny Any Denyの設定を行うとどうなるでしょうか？**
正解は<font color="Red">アウトバウンド方向はどのような通信も許可し、インバウンド通信はどのような通信も拒否します。</font>
まぁこの辺はまだわかりやすい、想像しやすいと思います。
**しかしステートレスな通信制御機能しか持たないルーターで先ほどと同様にアウトバウンド方向にAny Any Permit、インバウンド方向にAny Any Denyの設定を行うとどうなるでしょうか？**
正解は<font color="Red">ルーターから通信のリクエストは出せますが、リクエストに対するレスポンスが一切許可されないため、**実際の通信は途絶えてしまいます。**</font>
もっとわかりやすく言うと、ステートレスなルーターにアウトバウンド方向にAny Any Permit、インバウンド方向にAny Any Denyの設定を行うと、ルーター配下のあらゆる通信が途絶えます。
<font color="Red">**つまりインターネットに出れません。**</font>

## いや、ちょっと意味が分からないので、図で説明してもらえませんか？
はい。
その通りですね。
まずはイメージしやすいステートフルから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/890266fc-d1ec-6271-4f1e-94546ae1a38c.png)
もう普通の通信ですね。
ではステートレス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0efe6bd3-8f9a-607d-853c-205aeedfe741.png)
はい。
拒否されます。
これがステートレスとステートフルの違いです。

## なんでステートレスがあるんですか？全部ステートフルでもいいんじゃないですか？
優劣の話と同じで、場面によってどちらが良いか変わります。
例えばWebアプリケーションのFirewallであればステートフルの方が有効です。

ステートフルは一般のルーターであれば便利ですね。
複雑なこと考えなくて済みます。

## AzureとAWS比較するとどうなの？
単純に選択肢が多い方が良いかと思います。
そういう意味では
<font color="Red">**AWSに軍配が上がると思います。**</font>
しかし設定した通りに挙動する、制御がわかりやすい、思った通りの設定がやりやすい、という意味では
<font color="Blue">**Azureの方がトラブルなく設定できて分かりやすいかと思います。**</font>
やはりどちらが良い、というのはケースバイケースという結論でしょうか？

本日はここまで。
ChatGPTを使って英語を勉強する

こんにちは，[AkihisaWatanabe](https://twitter.com/Akihisa_Wat)です！ 

ChatGPTは英語と日本語では精度に差が出るようなのでできたら英語で使いたい．しかし，毎回DeepLを使うのもめんどくさい…
そうだ，こうなったら英語でChatGPTを操れるようになるためにChatGPTで英語を勉強しよう！

ということで，今話題のChatGPTを使った英語の勉強方法について自分が試した範囲で紹介します．



## 単語の意味を教えてもらう
`〜の意味を教えて`
![スクリーンショット 2022-12-03 23.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356712/391a7dfa-6a65-5983-5036-cc04230b45fa.png)

## 例文を作ってもらう
`〜の例文を作って`[^1]
![スクリーンショット 2022-12-03 23.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356712/70ba509b-0989-6f8b-1105-390a9df728c2.png)

## 単語の覚え方を教えてもらう
`〜の覚え方を教えて`
語源や接頭語などの意味を交えて覚え方を提案してくれます．
![スクリーンショット 2022-12-03 22.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356712/50ca5149-cff6-aea2-90d8-b71b95c1651a.png)

## 似た単語の意味の違いを説明してもらう
`AとBの違いを教えて`
類義語など微妙なニュアンスの違いを教えてくれます．
![スクリーンショット 2022-12-03 22.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356712/b9abdf2f-a785-74f2-92c9-c14ac3966b87.png)

## 文章から単語帳を作成する
`以下の英文から単語帳を作って．`[^2]
![result_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356712/2f0f9a44-ea58-1966-4e6b-eec997cfdb2f.jpeg)

## 英作文を添削してもらう
`以下の英作文を添削して．`
![result_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356712/e14cb2a6-93da-c7f9-8ca6-81b84eb6309c.jpeg)



[^1]: 事前に意味を質問した単語とそうでない単語では例文の数や出力形式などで違いが生まれるようです．
[^2]: 英文→文章，単語帳→単語リストという表現に変えると出力が変わるようです．
DoctrineとEloquent比較大全5: レコードを削除

day5の今日は、1件のレコードを削除する（SQL的にはDELETE）やり方を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

$book1 = $entityManager->getRepository(Book::class)->find(1);

$entityManager->remove($book1);
$entityManager->flush();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/c0e4819f8f10c36d7ae553203ca6fdec05755a0d/Doctrine/Usecase/delete_one_record.php>

- day3の方法でBookエンティティのインスタンスを取得します。
- EntityManagerの `remove()` メソッドにBookエンティティを渡し、その後にEntityManagerの `flush()` メソッドを呼びます。
- DELETE文はremove()を呼び出したときでなくflush()を呼び出したときに実行されます。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Book;

require __DIR__.'/../vendor/autoload.php';

$book1 = Book::find(1);
$book1->delete();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/c0e4819f8f10c36d7ae553203ca6fdec05755a0d/Eloquent/Usecase/delete_one_record.php>

- day3 の方法でBookモデルのインスタンスを取得します。
- Bookモデルのインスタンスの `delete()` メソッドを呼び出します。
ActiveRecord vs DataMapper

![05.ActiveRecord vs DataMapper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/053f5b13-0224-05ea-0ddb-d321eb0b356d.png)

https://bliki-ja.github.io/pofeaa/ActiveRecord/

https://bliki-ja.github.io/pofeaa/DataMapper/

Active Record は、以下の全ての責務を兼ねるひとつのオブジェクトを設けるパターンです。

- Domain Model の意味表現に使われる要素
- Row Data Gateway によるデータベースアクセス
- Table Module によるドメインロジック

ひとつのクラスがテーブルに関する知識を全て持つのが、Active Record の特徴です。これにより、ひとつのレコードに関する大部分のロジックが、オブジェクトインスタンス内のスコープに閉じることになります。無関係な行への誤ったアクセスを予防できる、オブジェクト指向的なプログラミングに慣れていないプログラマーにとっても平易なロジック記述が可能になる、といったメリットがあります。

Row Data Gateway としての操作を外に露出させず、できるだけ内部で利用して Table Module として利用できる形にすることで、Transaction Script のリファクタリング手段としての有効性が示唆されています。この点を逆に言うと、Active Record の凝集性を意識せずに設計すると、そのクライアントコードは実質的に Transaction Script になるという意味です。クライアントコードは Active Record の内部と異なり、すべての Active Record オブジェクトへのアクセス権を持っており、それはデータベースに任意の SQL を直接発行できるのと同じ意味になるからです。

Active Record のデメリットは、柔軟なドメインモデルを構築できない点です。オブジェクトは必ずテーブルに対応しなければならないため、Domain Model はテーブルの構造にダイレクトに依存します。これは特に、蓄積されたデータが増えてデータベースのスキーマ変更が困難になってくると、モデルのリファクタリングを急激に困難にしてしまうデメリットとして現れてきます。この不自由への覚悟ができるぐらいアプリケーションが単純かどうかを、よく考えて採用しなければならないパターンです。

プロジェクトによりますが、Active Record をサポートするフレームワークを利用すると、Domain Model がフレームワークに強く依存してしまう点が問題になる場合もあります。フレームワークが動作する条件を満たさないと、単体テストができないからです。データベースとの接続を確立しないと動作しないフレームワークもあります。現在では OSS のデータベースを Docker などで簡単に起動できますが、昔は Oracle の開発用ライセンスがなく、データベースの実物を動かせない開発者もいました。

いっぽう、Data Mapper は、中間的な「マッピング」層によって、何者からも独立した平易な Domain Model のエンティティ (ビジネスロジックが操作する対象物としてのオブジェクト) と、データベースのテーブル構造との直接的な繋がりを分離するパターンです。

プログラミング言語で表されるモデルの都合と、リレーショナルデータベースの都合は、似ている事と全く似ていない事があります。Domain Model のビジネスロジックが高度になればなるほど、似ていないことによる不都合の方が目立ってきます。このギャップを埋めるのにかかる面倒な作業は、インピーダンスミスマッチ (異なる電気回路などを接続したとき発生するエネルギーロスの原因) に例えられます。このミスマッチによるロスを緩和し、双方の都合が良いようにデータを翻訳して同期するのが、Data Mapper の目的です。

Active Record は、広義ではオブジェクトリレーショナルマッパー (ORM) に分類されることもありますが、PoEAA の観点では Active Record を ORM みなしません。独立した Domain Model と、独立したリレーショナルデータベースがあり、それを外部からマッピングによって繋ぐアーキテクチャを、ORM と呼びます。

何がインピーダンスミスマッチなのか、マッピングでどのように解決するのかについては、「オブジェクトリレーショナル振る舞いパターン」および「オブジェクトリレーショナル構造パターン」で詳しく述べられています。

Data Mapper を利用することで得られる即物的なメリットは、データモデルを使う単体テストに影響する外部要因が、ゼロになることです。ただし、手作業でマッピングのメカニズムを作ると、そこを自動テストのカバレッジに含むのは (Active Record と同じ理由で) とても困難かつ退屈な作業です。確実に手作業の量が少ないと確信できる場合以外は、サードパーティのマッピングフレームワークを利用するのがオススメです。

どのようなドメインロジック記述の方針を選ぶべきかと同じように、データゲートウェイか、Active Record か、Data Mapper かの選択は、単純な優劣で比べるべきものではありません。

- 直接的な SQL のチューニングが重要になる場合は、薄いデータゲートウェイが有利になります。
- 単一レコードに着目した比較的単純な手続きが多い場合は、Domain Model に Active Record を入れ込むのが効率的です。
- たとえばテスト駆動開発で(あるいは同じような設計方針で)、小さな問題に分解した抽象モデルの連携によって Domain Model を設計したい場合は、Data Mapper が最適な選択になります。
AWS認定クラウドプラクティショナー合格に向けて Day11

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day10](https://qiita.com/Ayako_0224/private/f99ae3b8a6ade17e7266)

# EC2インスタンス操作 2/2
前回に引き続き操作方法について確認する
## WEBサイトを作成する
### 管理者権限(ルート権限)に移動する
```
[ec2-user@~~~~ ~]$ sudo su
[root@~~~~ ec2-user]# 
```

### ファイルの確認を行う
ソフトウェアの状態を確認して必要なものはアップデートされる
```
[root@~~~~ ec2-user]# yum update -y
~
~
~
完了しました!
```

### アパッチサーバーを導入する
WEBサーバーになるソフトウェア
```
[root@~~~~ ec2-user]# yum install httpd -y
~
~
~
完了しました!
```

### アパッチサーバーの中にWEBサイトを作成する
#### htmlファイルを作成する
WEBページを作るためのディレクトリ(html)に移動し適当なhtmlファイルを作成する(index.html)

```
[root@~~~~ ec2-user]# cd /var/www/html
[root@~~~~ html]# 
```

#### アパッチサーバーを起動する
インスタンスを停止するたびにアパッチサーバーも停止するため都度起動する必要がある
```
[root@~~~~ html]# systemctl start httpd
```

常に起動しておくには以下のコマンドを実行する
```
[root@~~~~ html]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
```

#### サイトにアクセスする
パブリックIPアドレスにアクセスすると...
作成したindex.htmlが表示されている！
![スクリーンショット 2022-12-04 23.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436259/10caf392-b432-f8de-4f71-fbb5eda7202d.png)

## EC2インスタンスのバックアップ
バックアップはAMIというイメージで取得する
インスタンスのダッシュボードから
1. 該当のインスタンスを選択
2. アクション
3. イメージとテンプレート
4. イメージの作成

でイメージを作成していく

次の記事は➡︎[AWS認定クラウドプラクティショナー合格に向けて Day12](https://qiita.com/Ayako_0224/items/66d462e07646851ad485)
Juliaで学ぶプログラミング入門 コレクション／辞書型(Dict)

# 辞書型（Dict)
Juliaの 辞書型（Dict）は、キーと値の組み合わせを保持するデータ構造です。キーは単一で重複なし（＝ユニーク）、値はそのキーに対応するものです。辞書型は、高速な探索、追加、削除が可能です。例えば、次のような使い方ができます。

```julia
# Dict型の生成
mydict = Dict("key1" => "value1", "key2" => "value2")

# 値の取得
println(mydict["key1"])  # "value1"が表示される

# 値の追加
mydict["key3"] = "value3"

# 値の削除
delete!(mydict, "key1")

```

## for文の利用

for文を使用して中身を反復処理することができます。次のように記述します。
```julia
# dictionaryの生成
mydict = Dict("key1" => "value1", "key2" => "value2")

# for文を使った反復処理
for (k, v) in mydict
    println("$k : $v")
end
```
上記の例では、dictionary内のキーと値を順番に取り出して処理しています。また、反復処理の中では、キーと値はタプルの形で取り出されるので、括弧を使用して個別の変数に代入することもできます。

## 初期化
初期化するには、以下のようにします。
```julia
# 初期化宣言する
my_dict = Dict{Any, Any}() #Dict()でもAny,Anyになる

# データを追加する
my_dict["key1"] = "value1"
my_dict["key2"] = "value2"
```
上記の例では、Any 型をキーと値の両方に使用していますが、実際には、キーと値の型は異なる場合が多いでしょう。その場合は、dictionaryを宣言する際にキーと値の型を指定します。

```julia
# キーが文字列型、値が整数型のハッシュマップを宣言する
my_dict = Dict{String, Int}()

# ハッシュマップにデータを追加する
my_dict["key1"] = 1
my_dict["key2"] = 2
```

## 削除
辞書型 (Dict) を削除する方法はいくつかあります。例えば、以下のように delete!() 関数を使う方法があります。
```julia
# 辞書型を定義する
d = Dict("a" => 1, "b" => 2, "c" => 3)

# "a" キーに対応する要素を削除する
delete!(d, "a")

# 辞書型を表示する
println(d)
```

上記のコードを実行すると、次のように表示されます。
```julia
Dict("b"=>2,"c"=>3)
```
また、辞書型からすべての要素を削除するには、empty!関数を使うこともできます。

```julia
# 辞書型を定義する
d = Dict("a" => 1, "b" => 2, "c" => 3)

# 辞書型を空にする
empty!(d)

# 辞書型を表示する
println(d)
```

実行すると次のように表示されます。
```julia
 #Dict{String, Int64}()
```

## keyの存在確認
辞書型 (Dict) にキーが含まれているかどうかを確認するために、haskey() 関数を使います。この関数は、次のように使います。

```julia
d = Dict("a" => 1, "b" => 2, "c" => 3)

# 辞書型に "a" キーが含まれているかどうかを確認する
if haskey(d, "a")
    println("d has the key 'a'.")
else
    println("d does not have the key 'a'.")
end
```
上記のコードを実行すると、次のように表示されます。

```julia
d has the key 'a'.
```
AWS認定クラウドプラクティショナー合格に向けて Day10

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day9](https://qiita.com/Ayako_0224/private/dc9afb65197a4f891693)

# EC2インスタンス操作 1/2
前回はインスタンスのセッティングをして起動をした
今回は操作方法について確認する

## 操作方法
サーバーの種類によって異なるが２種類
- GUI(Windowsサーバー向け操作)
- SSHソフト(Linuxサーバー操作)

SSH接続方式は操作するPCがMacかWindowsかで異なる
Windowsの場合はTera Termのインストールが必要
MacはTerminalで行える
今回はMacで操作したためMacのみの紹介

# SSHの接続設定
Amazon Linuxサーバーでインスタンスを起動したためSSHの接続設定を行う
## 初回時
1行目...ダウンロードした秘密鍵ファイルを.sshに移動
2行目...秘密鍵の権限を400に変更
```
~ $ MV ~/Downloads/sample.pem ~/.ssh
~ $ chmod 400 ~/.ssh/sample.pem
```

## 毎回のアクセス時
SSHの接続を行う
@以降はインスタンスのIPアドレスを記述
```
~ $ ssh -i ~/.ssh/sample.pem ec2-user@xxx.xxxxxxx
```

接続するか聞かれるので`yes`と入力
```
The authenticity of host 'xxx.xxxxxxx (xxx.xxxxxxx)' can't be established.
ECDSA key fingerprint is ~~~~~~.
Are you sure you want to continue connecting (yes/no)?
```

接続完了
```
Warning: Permanently added 'xxx.xxxxxxx' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 1 available
Run "sudo yum update" to apply all updates.
[ec2-user@~~~~ ~]$ 
```

次の記事は➡︎[AWS認定クラウドプラクティショナー合格に向けて Day11](https://qiita.com/Ayako_0224/items/dda05692457fa815f993)
IchigoJam でソートの可視化

[IchigoJam](https://ichigojam.net/) でソートの可視化をしてみた。
今回は[バブルソート](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)と[クイックソート](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88)での昇順ソートを扱う。

※IchigoJamはjig.jpの登録商標です。

# バブルソート

今回行うバブルソートは、以下のアルゴリズムである。

1. ソートする配列全体を対象とする。
2. 対象の前から順に、隣り合う要素の大小関係をチェックし、前の要素の方が大きい場合は入れ替える。
3. 対象の最後の組までチェックしたら、対象の一番最後の要素を対象から外し、2から繰り返す。対象が無くなった場合は終了する。

以下が、今回作成したこれを行うプログラムである。

```
10 ' ｲﾁｺﾞ ｿｰﾄ (ﾊﾞﾌﾞﾙ)
20 FOR I=0 TO 19:[I]=I+1:NEXT
30 FOR I=0 TO 19:P=RND(20-I):T=[I]:[I]=[I+P]:[I+P]=T:NEXT
40 CLS:FOR P=0 TO 19:GOSUB 50:NEXT:GOTO 80
50 FOR K=0 TO 19:LOCATE 6+P,K
60 IF [P]>=20-K ?CHR$(#FF); ELSE ?CHR$(0);
70 NEXT:RETURN
80 FOR I=18 TO 0 STEP -1
90 LOCATE 6,20:?CHR$(#E2);:FOR J=0 TO I
100 LOCATE 7+J,20:?CHR$(#E2);
110 WAIT 5
120 IF [J]<=[J+1] GOTO 140
130 T=[J]:[J]=[J+1]:[J+1]=T:P=J:GOSUB 50:P=J+1:GOSUB 50
140 LOCATE 6+J,20:?CHR$(0);
150 NEXT:LOCATE 7+I,20:?CHR$(0);
160 NEXT
170 LOCATE 0,21:END
```

# クイックソート

今回行うクイックソートは、以下のアルゴリズムである。

1. ソートする配列全体を対象とする。
2. 対象に要素が1個しか無い場合、この対象についての処理を終える。
3. 対象の一番左の要素を基準とし、左位置を対象の左から2番目の位置に、右位置を対象の最後の位置とする。
4. 左位置が右位置よりも左にあり、かつ左位置の要素が基準以下の間、左位置を右に進める。
5. 右位置が左位置よりも右にあり、かつ右位置の要素が基準以上の間、右位置を左に進める。
6. 左位置が右位置よりも左にあるならば、左位置の要素と右位置の要素を交換し、4に戻る。
7. 左位置(=右位置)の要素が基準より小さいならば、基準の要素と左位置の要素を交換する。  
   (これにより、対象の最初から左位置までの部分は基準以下の要素のみ、左位置から最後までの部分は基準以上の要素のみになる)
8. 「対象の最初から左位置の1個左の部分」「対象の左位置から最後の部分」それぞれを新しい対象とし、2以降の処理を行う。

以下が、今回作成したこれを行うプログラムである。

```
10 ' ｲﾁｺﾞ ｿｰﾄ (ｸｲｯｸ)
20 FOR I=0 TO 19:[I]=I+1:NEXT
30 FOR I=0 TO 19:P=RND(20-I):T=[I]:[I]=[I+P]:[I+P]=T:NEXT
40 CLS:FOR P=0 TO 19:GOSUB 50:NEXT:GOTO 90
50 FOR K=0 TO 19:LOCATE 6+P,K
60 IF [P]>=20-K ?CHR$(#FF); ELSE ?CHR$(0);
70 NEXT:RETURN
80 WAIT 5:RETURN
90 S=20:LET[S],0,19
100 IF S<20 GOTO 240
110 X=[S]:Y=[S+1]:S=S-2:IF X<Y LOCATE 6+X,20:?CHR$(#E5); ELSE GOTO 100
120 L=X+1:R=Y:LOCATE 6+L,20:?CHR$(#E2);:LOCATE 6+R,20:?CHR$(#E2);
130 IF L>=R OR [L]>[X] GOTO 150
140 LOCATE 6+L,20:?CHR$(0,#E2);:L=L+1:GOSUB 80:GOTO 130
150 IF R<=L OR [R]<[X] GOTO 170
160 R=R-1:LOCATE 6+R,20:?CHR$(#E2,0);:GOSUB 80:GOTO 150
170 IF R<=L GOTO 200
180 T=[L]:[L]=[R]:[R]=T:P=L:GOSUB 50:P=R:GOSUB 50
190 GOSUB 80:GOTO 130
200 IF [X]>[L] T=[X]:[X]=[L]:[L]=T:P=X:GOSUB 50:P=L:GOSUB 50:GOSUB 80
210 LOCATE 6+X,20:?CHR$(0);:LOCATE 6+L,20:?CHR$(0);
220 S=S+4:IF L-X>Y-L+1 LET[S-2],X,L-1,L,Y ELSE LET[S-2],L,Y,X,L-1
230 GOTO 100
240 LOCATE 0,21:END
```

# 実行結果

以下は、これらのプログラムを GIGA IchigoDake で実行した様子である。

<iframe width="560" height="315" src="https://www.youtube.com/embed/FdxLUq7d2Zo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Ubuntu 22.04 - Crony のインストール

## 前提
今日は日曜日なので、、というか、あと数時間で日曜日が終わってしまうので、あまり難しいことはしたくない。というわけで、必要かどうかはわからないけれど、NTP サーバを構築しようと思う。

NTP のオープンソースといえば、ntpd かなと思ってたのだけど、chrony というのが最近の CentOS のデフォルトになっているらしく、新しい方が好きという理由で chrony にした。
## 環境
Ubuntu 22.04
Chrony 4.2
## 設定
新しく仮想マシンを用意します。この辺の記事を参考にするとよいです。

https://qiita.com/akikito/items/d30d85d4d05694887726

https://qiita.com/akikito/items/a31c4c2b38953d11b999

https://qiita.com/akikito/items/b081164d83476c38cf8c

ネットワークに接続できるようになったら、chrony をインストールします。
```
$ sudo apt -y install chrony
```
ステータスの確認をしておきます。`active (running)`になってればOK
```
$ sudo systemctl status chrony
```
それから、タイムゾーンの NTP サーバを追加。
```
$ sudo vi /etc/chrony/chrony.conf
```
デフォルトは`#`でコメントアウトして、`ntp.nict.jp`を追加する。
```
#pool ntp.ubuntu.com        iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
pool ntp.nict.jp iburst 
```
それと、時刻同期の範囲を最後に書いておく。
```
allow X.X.X.X/X
```
設定後は忘れずに再起動しておこう。
```
$ sudo systemctl restart chrony
```
それから、Ubuntu の時刻を日本時間に合わせておこうと思う。というのも、Ubuntu の初期設定では UTC になっておるのだ。
```
$ timedatectl
               Local time: Sun 2022-12-04 14:32:53 UTC
           Universal time: Sun 2022-12-04 14:32:53 UTC
                 RTC time: Sun 2022-12-04 14:32:53
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
これをこう！
```
$ sudo timedatectl set-timezone Asia/Tokyo
```
そしたら、こうなる。
```
$ timedatectl
               Local time: Sun 2022-12-04 23:34:21 JST
           Universal time: Sun 2022-12-04 14:34:21 UTC
                 RTC time: Sun 2022-12-04 14:34:21
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
もしかしたら、あとで設定追加するかも。今はこれでOK！
APIを実装する時に考えたこと・気づいたこと

この記事は、yuriacatsアドベントカレンダー5日目の記事です。

---

最近、[個人開発](https://github.com/yuriacats/yamanote_wasuremon_node/tree/master/src)でAPIを作るような機会があったのですが、その時に気づいたこと・意識してみたら学びが多かったこと、失敗したなと思ったことを書き留めておこうと思います。

## 気づいたこと
- コンテナ化して自動デプロイするより、Lambdaのほうが個人的には楽だなと感じた。
- 自動デプロイを組むのがとてつもなく大変（AWSを利用する場合）
- 特にAIMを振るのが大変…（Lambdaでも大変だが関わるサービスが多い分ECSの方が大変に感じた）
- とにかくデプロイ先の知識がかなりいるのでそれを先に勉強した方が個人開発は楽。
- 他の人からのアドバイスは貴重なので[techtrain](https://techtrain.dev/)なりTwitterの人なりにアドバイスを定期的にもらうと個人開発のペースメーカーになり良い。

## 意識してよかったこと
- ライブラリーの選定の意思決定をギリギリまで粘ったこと
    - [当時読んでいた本](https://amzn.to/3iuQKWx)に「意思決定をギリギリまで遅らせろ」という話が書かれており、試しに実践してみるかという気持ちになった。
    - 意思決定を遅らせることでとりあえず動くものを実装するぞということがしやすくなったと思う。

     
- 　APIのモックを作ってフロントに一旦ベタ置きしておく。
    - 　 フロントの開発に一旦集中してからバックエンドのAPIを考え…を繰り返すとバックエンドの休憩がフロントエンドで、気づきを生かしてみたいなサイクルを回せ煮詰まってつらいと投げ出すことが少なくなった。
    - 　 また、APIのエンドポイント（仮）を作っておくことで、フロント側の視点からエンドポイントの設計のあらを考えることができる。

## 失敗したなと思ったこと

- 設計は初めにある程度固めておくべきだった。
    - 設計の経験がないことも悪さしているように思えるが、APIの元データを作る時にどのような構造で取るかということで結構手が止まってしまいプロジェクトが進まないといったことが私は多くある。というか、プロジェクト止まる時のポイント１位はそれだと思う。

- 予定管理はするべき
    - 実装予定がないと触っていても本質的でないところに力を入れて現実逃避をしがちである。
    - それはそれとして最初は勢いで書いた方がいいこともある。
    - 勢いの間に実装計画を立てて各工程＋８hくらい加えながら予定表を作っていくとよさそう
    - それはそれとして~~アドベントカレンダーの記事~~や仕事やで予定が潰れる要因は多いので、その辺も考慮に入れつつ周りの人に「〇〇日『まで』にリリースしたいのでXX日にコードレビューお願いします！！！」くらいのアドバイス予約をしておくと良いと思う。


# 今回の失敗談から考える必要な準備

- デプロイ方法候補のやり方を一通り予習→仮実装（HelloWorld）
- デプロイ予定日を決めアドバイスしていただく人にアポを取っておく
- 思い立ったらすぐ実装→設計予定を立てる。

あらかじめ、個人開発が思い立った時のために勉強しておくと良いこと

- AWSなどデプロイ方法についての知識
- 設計（DBやクラス設計レベルの設計の知識はあった方が良い）
AWS SAM cron 設定は UTC 依存ではなく Timezone 依存のスケジューラ (ScheduleV2) を使おう

# 背景
Lambda の定周期稼働方法を探すと、普通に以下が見つかるが・・

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html

よっしゃと思い設定してみると、設定時刻通りに動かない。
そう、よくある UTC 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/dd27cdb5-f110-9b07-9094-6020c6bb2bec.png)

その後、途中諦めかけていたが、Console 側に Timezone 設定可能なスケジューラというものを見つけて、そこからドキュメント経由で ScheduleV2 を見つけたので紹介。

# 結論：Local Zone で動く Scheduler
Scheduler なら、TimeZone 由来で動かせるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/66daa365-ef4a-4304-b0e7-68210200b19d.png)


## 設定方法

`Type: Schedule` (V1) だと、`Schedule:` で設定してたのが、`ScheduleExpression:` になってたり、`ScheduleExpressionTimezone` 設定しないと　Default の UTC になるのでご注意を

```yaml: トリガー設定例
        ScheduleV2Event:
          Type: ScheduleV2
          Properties:
            Name: ScheduleV2EveryTueSat2120
            ScheduleExpression: cron(20 12 ? * TUE,SAT *)
            Description: Example schedule2
            ScheduleExpressionTimezone: "Asia/Tokyo"
```

で、sam deploy すると、こんな感じで設定出来てることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/33bd6951-9580-5e9f-605c-7359fb35dd71.png)

ただ・・ Lambda 側からは、現状 Scheduler は見られないみたい・・ 2022/12/4 現在

## 関連ドキュメント
各 Property は、以下で調べられる

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-scheduleexpressiontimezone

TimeZone はここ

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/athena-supported-time-zones.html

EventBridge スケジュールの information から飛んでく説明ページが以下（これのおかげで見つけられました）

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/using-eventbridge-scheduler.html


## Console で設定する場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ea5cfcd3-16a4-1e9f-b53d-ddbd79450056.png)

但し、ここから Lambda への接続は可能ですが、Lambda 側からは表示できません。
故に、Lambda からスケジュールへの接続は、2022/12/4 時点では選べないので注意。
※設定は出来てそう

https://ap-northeast-1.console.aws.amazon.com/scheduler/home?#schedules

# あとがき
はやく以下を対応してほしい限り
- 日本語訳
- Lambda 側での Console での設定

# keyword
Use EventBridge Scheduler rather than Rule if you want to set in TimeZone not UTC.
ここが辛いよ社内アプリのアクセス解析

社内アプリのログを「ユーザーを増やすためにどんな施策を打てばいいか」を考えるというちょっと攻めた感じの仕事。


# 辛かったこと
- コンバージョンがよく分からない
    - ECであれば売上、Youtubeであれば再生数を伸ばすために頑張るけど社内アプリの場合、何の数字を伸ばせばいいのか分からない
- GA4を社内アプリに活用している事例が見つからない
    - googleアカウントの計測はできず社内の従業員情報と引き当てるために色々頑張ってる始末
- 計測のための実装を開発メンバーに依頼しなければならない
    - 開発メンバーからすると指示命令系統の外からの依頼、あしらわれがち
    - 「それ仕込んで何になるんですか？」「さあ、見てみないことには...」
- 浮いてる
    - 社内でそんなことやってる人は周りにいないし、過去実績もない
    - 開発メンバーでも意思決定する人でもない
    - 誰にも構ってもらえず孤軍奮闘することになる。後輩には引き継げない（可哀想なため
- 


# それでも頑張ったこと
- 開発メンバーの改善ネタが尽きたときに猛プッシュ
    - 「この前作ったあの機能、使われてるかどうか確認してみましょうよ！」
- 方針の変わり目を逃さない
    - じゃあこの際にKPIはこれに決めて、計測できるように仕込んで...と提案する準備
流行りの画像生成やってみた！

# はじめに
最近画像生成AIが話題になっています。画像生成AIのツールはたくさんありますが、今回はその中でも無料で使用できるStable Diffusionの使い方を説明します。
# huggin faceの使い方
hugging faceというサイトには、事前にトレーニングされたディープラーニングモデルが提供されており、[こちらのページ](https://huggingface.co/models
)から画像分類、翻訳、画像生成など様々なタスク向けのモデルを利用することができます。ここでは、テキストから画像を生成したいので、Tasksはtext-to-imageを選びます。すると、右側に画像生成用のモデルがたくさん出てきます。今回はダウンロード数の最も多いCompVis/stable-diffusion-v1-4を使用します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543066/74a622af-7955-bc08-296f-424f9cf63740.png)
モデル名「CompVis/stable-diffusion-v1-4」をクリックすると、[こちらのページ](https://huggingface.co/CompVis/stable-diffusion-v1-4)にきます。
# hugging faceに登録する
stable diffusionを使用するには、hugging faceに登録する必要があります。[こちらのページ](https://huggingface.co/)の右上にあるSign Upからhugging faceに登録して下さい。ログインできたら、[こちらのページ](https://huggingface.co/settings/tokens)にアクセスします。New tokenをクリックすると、以下のような画面が出てくるのでName、Roleを指定した後、Generate a tokenをクリックします。すると、トークンを作成することができます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543066/d01b074f-d503-14e7-76f6-1db766036e54.png)
# google colaboratory上で画像生成を実装する
最後に、google colaboratoryを用いて画像生成を実装します。(google colaboratoryの使用方法は他の記事を参考にして下さい。)[こちらのページ](https://huggingface.co/CompVis/stable-diffusion-v1-4)にpytorchを用いた実装例が載っており、それをそのまま実装してみたいと思います。
まずは、GPUを使用する必要があるので、ランタイム->ランタイムのタイプを変更 からGPUに変更します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543066/f70eed56-86f2-b6be-2637-d5e2034dff26.png)
次に、以下のコードでインストールします。
```python
!pip install --upgrade diffusers transformers scipy
```
次に、以下のコードで認証を行います。Tokenを求められたら、先ほど生成したTokenをコピー＆ペーストします。また、Add token as git credential?と聞かれたら、nと答えます。
```python
!huggingface-cli login
```
認証に成功すると以下のように表示されると思います。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543066/600fb3b7-023a-5175-238a-a789961463f4.png)
次に、以下のコードで画像生成を行います。prompt = "a photo of an astronaut riding a horse on mars"となっているので、「火星で馬に乗った宇宙飛行士の写真」を生成してくれるようです。
```py
import torch
from diffusers import StableDiffusionPipeline

model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda"


pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16, revision="fp16")
pipe = pipe.to(device)

prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]  
    
image.save("astronaut_rides_horse.png")
```
最後に、生成した画像を確認してみます！
```py
import cv2
from google.colab.patches import cv2_imshow
img  = cv2.imread("/content/astronaut_rides_horse.png")
cv2_imshow(img)
```
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543066/68e36468-3e3d-9d83-a3de-ad1cad412cf8.png)
きちんと画像生成されました！たしかに火星で馬に乗った宇宙飛行士の写真ですね:grin:

# おわりに
今回は画像生成を試してみました。意外と簡単にできて驚きました:sweat_smile:
promptの内容を変えてみると面白そうですね！

参考：https://signyamo.blog/stable-diffusion/
社内 LAN の IP アドレス空間で困った話 (2)

謎のアドベントカレンダー、第 8 話です。

7 日目の **[社内 LAN の IP アドレス空間で困った話 (1)](https://qiita.com/hmatsu47/private/96e065b26d302d501585)** の続きです。

https://qiita.com/hmatsu47/private/96e065b26d302d501585

## 社内 LAN の IP アドレス空間が 192.0.0.0/24

「えっ？ 192.168.0.0/24 の間違いじゃないの？」と思われるかもしれませんが、間違いではありません。

なぜそんなことになったのか？というと、社内 LAN 導入のタイミングが関係しているのだろうと推測しています。

（「推測なの？」と疑問に思われるかもしれませんが、筆者が入社した時点で社内や取引業者にその理由がわかる人がいませんでした）

要は、

- プライベート IP アドレス空間を定めた [RFC1597](https://www.nic.ad.jp/ja/translation/rfc/1597.html) が出たか出ていないかの頃に設計が行われた
- 設計時点で LAN 内に 200 程度の機器が繋がる想定だった
  - そもそもそれでは足りてないじゃんよ、というのが[前回の記事](https://qiita.com/hmatsu47/private/96e065b26d302d501585)の話
- クラス C の先頭が 192.0.0.0/24
- この時点でこのアドレス空間は未割り当て
  - 後の [RFC3330](https://tex2e.github.io/rfc-translater/html/rfc3330.html) で規定あり→ [RFC5735](https://tex2e.github.io/rfc-translater/html/rfc5735.html) を経て [RFC6890](https://tex2e.github.io/rfc-translater/html/rfc6890.html) へ

ということでしょう。

### 問題 1 : 狭い

1 つのセグメント（サブネット）で社内 LAN を構成するのであれば、より広い空間が欲しいところですし、そうでなければ /24 もしくはそれ以外のセグメント（サブネット）を用意したいです。

いつまでも手動で DHCP リースを削除して Toil を蓄積し続けるわけにはいきません。

### 問題 2 : 扱いが面倒

基本的にプライベートアドレスは

- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16

が前提なので、それをわざわざ読み替える形で機器やソフトウェアを設定しないといけないのは面倒ですし、インターネットへの接続も面倒です。

何らかの不具合に繋がるかもしれませんし。

## L3SW 導入を機にアドレス空間を変更・分割した

そして、運良く

- 自社の予算で（予備機込みで）買える価格帯の 24 ポート L3SW が発売された
  - アライドテレシスの CentreCOM 8624XL
  - 定価は確か 198,000 円
    - **[いけりり★Blog の過去ログ](http://www.ikeriri.ne.jp/blog/kako.php?itemid=132&catid=46)** にも書いてありました
- [2 日目の記事の後半](https://qiita.com/hmatsu47/items/c65ecd701b5a3a574119#%E3%81%95%E3%82%89%E3%81%AB%E3%81%9D%E3%81%AE%E5%BE%8C)の、ビル間接続をダークファイバーに移行するタイミングがきた

ところで、

- 社内 LAN の IP アドレス空間を 192.168.0.0/16 内に変更
- その中で /24 のセグメント（サブネット）に分割
- セグメント（サブネット）間を L3SW で接続

という形に変更しました。

（ここまでは外部の業者に社内 LAN 設計を委ねていましたが、論理設計についてはここから自社内で行なうスタイルに変えました）

これで[不毛な作業](https://qiita.com/hmatsu47/private/96e065b26d302d501585)から解放されました。

ばんざーい。

---

9 日目からはまた別の話になります。

（タイトル意味不明シリーズ）

- **[切れて困った話](https://qiita.com/hmatsu47/items/64c360698673677cd643)**

https://qiita.com/hmatsu47/items/64c360698673677cd643
Raspberry Pi Zero2 W を使ってAmazon Kinesis Video Streams(CPP)のビルド

# 1. 概要
以前、Raspberry Pi Zero WHにBuster(Debian 10)をで試したことを、Pi Zero2 Wにbullseye(Debian 11)でやり直そうとしたときに「 index-pack died of signal 9」が出てcmakeが成功しなかった。とりあえずの回避策を書いておく。

以前の記事

https://qiita.com/tetsuoMikami/items/d9fa860cab026ba36690

# 2. 手順
# 2.1. OSインストール
Raspberry Pi Imangerを使って、bullseye 64bit Liteをインストールする。

# 2.2. アップデートやライブラリインストール
今回の件と関係ない気がするのだが、事前に行った操作を記載。
```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt -y install libssl-dev libcurl4-openssl-dev liblog4cplus-dev cmake m4 git
$ sudo apt -y install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools 
```

# 3.  Amazon Kinesis Video Streams Producerのビルド
gitリポジトリをクローンしてビルドする。これらは公式に乗っている手順。
```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp
$ mkdir -p amazon-kinesis-video-streams-producer-sdk-cpp/build
$ cd amazon-kinesis-video-streams-producer-sdk-cpp/build
$ cmake -DBUILD_GSTREAMER_PLUGIN=ON ..
$ make
```

# 4. 問題発生
cmake中にエラーが出て、最終的に「-- Configuring incomplete, errors occurred!」と表示される。
gitの処理中のエラーっぽい。

```
Submodule 'boringssl' (https://boringssl.googlesource.com/boringssl) registered for path 'boringssl'
Submodule 'krb5' (https://github.com/krb5/krb5) registered for path 'krb5'
Submodule 'pyca.cryptography' (https://github.com/pyca/cryptography.git) registered for path 'pyca-cryptography'
Cloning into '/home/outlaw/work/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/libopenssl/build/src/project_libopenssl/boringssl'...
error: index-pack died of signal 9
fatal: index-pack failed
fatal: clone of 'https://boringssl.googlesource.com/boringssl' into submodule path '/home/outlaw/work/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/
```

# 5. 対策
「index-pack died of signal 9」は大きなgitリポジトリを取得しようとしたときに出るエラーらしい。メモリ不足が原因とのこと。
「boringssl.googlesource.com/boringssl」をPCでcloneしてみたら、314MBだった。しかし、メモリ上に落とすとは思えないのだが。

これの対策にはサーバー側で行うもの、clone時にdepthを一旦浅くするものがあるようだが、後段でも同じことが起きたら面倒なので、SWAPを広げて一時対策することにした。
というか、cmakeでgitのdepthを変更する方法がわからなかった。

# 5.1. SWAPを増やす
サービスを止めて、設定値を変更、サービスを再開する。OSの再起動などは不要。

```
$ sudo service dphys-swapfile stop
$ sudo nano /etc/dphys-swapfile

100 -> 500へ変更してファイル保存.

$ sudo service dphys-swapfile start
```

気になる場合は終わってからもとに戻せばよい.

# 6. 結論
Amazon Kinesis Video Streams(CPP)のcmakeがRaspberry Pi Zero2 Wでも完了するようになった。
他のRaspberry Piでも起きるのかもしれないと不安である。

以上
Industry4.0で世界はどう変わるのか？

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# Industry4.0とは
Industry4.0とは、ドイツ政府が2011年に発表した産業政策です。`最初の産業革命を1次として、現在のデジタル技術を駆使した産業革命をIndustry4.0と定義`付けています。
インダストリー4.0の本質は、[CPS(CyberPhysicalSystem)](https://qiita.com/7_inai_/items/68cea45c0331dfdde3bf)により製造業のサービス化を加速するための産業政策としての、国際標準化活動です。
Industry4.0を代表する技術にIoTとAIが挙げられます。IoTとAIにより、従来は人しかできなかった高度な知的活動も自動で行えるようになります。


# Industry1.0〜3.0
### ●Industry1.0(第一次産業革命)
`軽工業の機械化`
18世紀後半、イギリスで蒸気機関が発明されたことにより、綿織物を自動製造できるようになりました。また鉄道や蒸気船も生み出されました。

### ●Industry2.0(第二次産業革命)
`重工業の機械化`
19世紀の半ば〜20世紀初頭石油燃料や電気を用いて、重工業の機械化や大量生産化かできるようになりました。
エジソンの白熱電球、テスラによる交流電気システム、ベルによる電話等様々な通信技術が産まれたのもこの時期です。

### ●Industry3.0(第三次産業革命)
`機械による単純作業の自動化(コンピューター革命)`
1970年台初頭、コンピューターの登場により単純作業が自動化されるようになりました。

# インダストリー4.0における重要な考え方
①ノウハウの形式知化
　ベテラン社員しかできない作業をなくす、海外展開へも有効
②全工程管理
　製造だけではなく、製品の設計、生産、物流、販売、アフターケアという全行程の情報を収集する
③リアルタイム管理
　リアルタイムの情報を集めることができる
④システムの標準化
　カスタマイズされたシステムではなく、標準的なシステムを使うことで、合併時の障壁をなくす
⑤ITの有効活用
　CPS,IoT,コングリッドコンピューティング,AI
⑥各工程の作業内容の可視化
　可視化により、人的リソースの量、品質管理プロセスを正確に把握できる。
⑦原価差異分析の精度向上
　原価差異分析：標準原価(計画上の原価)と実際原価の差異を求めて、その理由を分析し、生産時の改善活動に役立てる。


# 様々な予測が飛び交うIndustry5.0の世界
いつ頃から始まるのかもわからないIndustry5.0ですが、様々な憶測が飛び交っています。そのためまだはっきりとしたことは分かりませんが、`テクノロジーとバイオロジーの融合`がIndustry5.0のポイントだと言われています。Industry1.0〜4.0はテクノロジーの進歩による産業革命であったのに対して、Industry5.0ではバイオロジーが関わってきます。これにより地球規模の問題を解決できる可能性もあると、非常に注目されています。


# 終わりに
Industry4.0は日本の製造業にとって非常に重要な分岐点になります。Industry4.0後の製造業は、「ものづくりの提供」から「サービスの提供」にビジネスモデルをシフトチェンジしていきます。
Industry 4.0は、製造業において大きな可能性を秘めており、新しいビジネスモデルを生み出すことができます。
iTerm2のサーバーログにあるRailsのファイルパスをクリックした時にRubyMineで開けるように設定する

# 概要
Ruby on Railsで開発する時、エラーが発生したらターミナルにエラーの原因の場所をちゃんと出力してくれます。
そういう時には、ファイルパスをCommand+クリックして、RubyMineでファイルが開けるようになれば便利ですね。

![スクリーンショット 2022-12-04 22.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/3122c5be-925c-a0f8-2703-236120adeb6f.png)

# 設定方法

`iTerm2 の Preferences > Profiles > Advanced > Semantic History >
Run Command`の右のフィールドに
```
/Applications/RubyMine.app/Contents/MacOS/rubymine \5 --line \2 \1
```
を入れる。


![スクリーンショット 2022-12-04 22.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/f1711f55-5b47-3e1e-2c43-b646e3943166.png)