OmniAICreator/Qiita-1.07M huggingface dataset:
ステガノグラフィ とは

## 勉強前イメージ

グラフィいうから、画像関係あるんかな？

## 調査

### ステガノグラフィ とは

英語でsteganographyと書き、他にもデジタルステガノグラフィとも呼ばれたりするもので
情報を別の情報に埋め込む技術を指します。
どういうことかというと、画像や音声などに悪意のあるコードやマルウェアなどを隠すようなことがされています。
一部を改変するだけなので、一見してわからないようにし情報を埋め込むことが可能になります。

ステガノグラフィは古代から使われている情報の秘匿技術で
紙に果汁で書いた文字を加熱すると浮かび上がるあぶり出しのような技術になります。

暗号化とステガノグラフィの違いとしては
どちらも渡したい情報が見えないという点では一緒ですが、
ステガノグラフィは情報を伝達していること自体も秘密にすることができます。
一方で暗号化はデータが運ばれているということはデータがあるので認識することができます。

### ステガノグラフィでのマルウェア感染

よくあるパターンが以下になります。

1. なりすましのメールを送付
2. 注文書などのエクセルファイルを添付し、ターゲットが開く
3. マクロが起動
4. powershellが起動して外部からステガノグラフィが埋め込まれた画像をダウンロード
5. マルウェア感染

エクセルファイルなどを気をつけないといけないのはマクロが実行され
知らない内にプログラムが実行されてしまっているところになります。

また、エクセルファイルを経由しなくても直で画像だったり動画だったりダウンロードした際も同様のことが発生します。

## 勉強後イメージ

確かに画像とかに文字埋め込まれてたとしてもあんま気づかんよね...
CTFとかで見たけどあーゆーやつの延長かな？
防御策もOSを最新化するであったり、変なファイル開かないだったり、ウイルスソフトを定期的にアップデートするであったり。。
弱みに漬け込む系が多いのね。

## 参考

- [ステガノグラフィとは？高度なマルウェアからどう防御するのか？](https://eset-info.canon-its.jp/malware_info/special/detail/220517.html)
- [ステガノグラフィ【steganography】](https://e-words.jp/w/%E3%82%B9%E3%83%86%E3%82%AC%E3%83%8E%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3.html)
- [ステガノグラフィとは【用語集詳細】](https://www.sompocybersecurity.com/column/glossary/steganography)
[Touchdesigner]複数ノードが繋がっているButtonCOMPを楽にキー入力に差し替える方法(他入力も可)

## ボタンスイッチをキー入力に差し替えたい！（もしくは両方対応にしたい）

サンプルコードをDLしたとき、トリガーがボタンクリックになっていてちょっと不便..KeyboardIn CHOPとかに差し替えたい！と感じたことはないだろうか。私はよくある。

だが、同じタイプでないオペレーターを右クリックでSwitchすることは出来ない。

そこで私が良くやる対処法を以下に紹介しておきたい。

## 先に結論

まず先に結論。

![ああ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/069b9c9e-37f7-45b0-8de7-ed25273dbb52.jpeg)

ButtonCOMPの中に入るとこのような仕組みになっているので、赤枠で囲った部分に該当OPを追加するだけ。

## 説明

というほどの事もしてないのだが、ボタンの入力判定の間に他の入力判定を追加しているだけである。
こうやってボタンの中にキー入力やその他の入力インターフェース（ex:例えば[マイコンでの操作]()）を入れておけば、
論理CHOPで柔軟に切り替えが可能となる。
In CHOPで入力を外に出しておくことで一層管理しやすくなるだろう。

## 所感

Panel CHOPをつかってボタンは作成されているらしい。


普段はBlogのほうで<b>[Touchdesigner初心者用Tips](https://manumaruscript.com/category/gamma/touchdesigner/)</b>についてちょこちょこ発信しているので、興味のある人は参考ください。
プロアクティブ検知 とは

## 勉強前イメージ

主体的か主体的じゃないか・・・？

## 調査

### プロアクティブ検知 とは

プログラムがどのように振る舞うのかなどを分析することで不正なプログラムを検知する方法。
リスト化されたものに引っかかったものがウイルス！というわけではなく、
こういう振る舞いを多くしているのでこれはウイルスの可能性が高い！というような方法で検知を行います。
これがプロアクティブ検知になります。

### プロアクティブ検知の仕組み

- ジェネリックシグネチャ

不正プログラムでも、同様のものがない場合はウイルスとみなすのが難しいです。
そこで亜種にも似たような振る舞いや特徴をしているものがあればそれはウイルスを判定する、というものです。

- コード解析

ソースコードを分析して、今まで解析してきた不正プログラムの構造と共通点があれば
それはウイルスとしてみなす ということになります。

- エミュレーション解析

隔離された、安全に試すことができる仮想環境で
不正プログラムの動作や挙動を確認し、ウイルスかどうか確かめます。

### リアクティブ検知もあるよ！

リアクティブとはウイルスを解析して固有の情報を探り出します。
それを他の機器へ読み込ませてウイルスに感染しているか、していないかを確認する方法になります。

プロアクティブ検知だけ、リアクティブ検知だけすればよい というものではなく
両方併用することでよりウイルスを発見しやすくなります。

## 勉強後イメージ

結構前に言われてたことっぽいね？
今は振る舞い検知とかそういうことかな。。。

## 参考

- [プロアクティブ検知](https://eset-info.canon-its.jp/malware_info/term/detail/00093.html)
awsコスト管理画面でEC2 otherってナニ？

## 初めに
※2022/12/31現在のaws const Explorerの画面での説明です。
awsを使い始めの頃、動画や書籍を見ながらネットワークを構築していると次の日の朝になぜか料金が発生していたりする。
コスト管理画面を見るとEC2 otherで数ドル発生しているが、otherって何だよ！となってサービスを全て止める←（自分だけ？）
そんな人（自分）を対象とした記事です。

**この記事でわかること**
コスト管理画面でEC2 otherの詳細情報の見方

## 手順
1. aws Cost Explorer を開く
2. 「Cost Explorerで表示」を押す
![スクリーンショット 2022-12-31 10.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/db6f751d-b585-769d-5eb0-e0c73705f0cb.png)
3. このままでは詳細がわからないので
	右側の「グループ化の条件」から「使用量タイプ」を選択
![スクリーンショット 2022-12-31 10.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/5a9d0572-f1a0-a12e-c241-efc97949162c.png)

4. 自分の場合だとNatGatewayに一番料金がかかっていることが分かる。
	NatGatewayは時間単位で課金されるため、学習用に作成した場合は終わった後に削除するのが良い
	(別途削除時にはEIPの解放が必要)
![スクリーンショット 2022-12-31 10.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/54eff0f8-0253-b253-e553-d48bb8aad3ac.png)

## 終わりに
金額は少額ですが、このまま忘れていたりなんかする恐ろしい...
チリも積もればなんとやらというやつですね
お金の管理をしっかりして無駄な支出を抑えましょう！
良いお年を！
マニピュレーションサーバ とは

## 勉強前イメージ

なんかのサーバ？

## 調査

### マニピュレーションサーバ とは

サイバー攻撃のwebインジェクション攻撃に使われるサーバを指します。

webインジェクション とはマルウェアに感染したコンピュータが特定のwebサイトへアクセスした際に
javascriptのコードを介して入力したIDやパスワードなどを盗み取る攻撃で、
それに使われるサーバをマニピュレーションサーバと呼ばれます。
マニピュレーションサーバはjavascriptのコードを配信したり、入力した個人情報を受け取る役目をします。

## 勉強後イメージ

詐欺用のwebサーバ的なことかな？
あまり表立って作ることはできないから結構頻繁に変更したりするのかな？

## 参考

- [マニピュレーションサーバー](https://eset-info.canon-its.jp/malware_info/term/detail/00152.html)
【vs code】Gitにpushしようとしたら　rm: .git/refs/heads/master 2: No such file or directoryを解決


## 環境
Mac(M1, 2020)
vscode５

# [概要]
vscodeで画像のようにpush使用としたら突然できなくなっていた。
![スクリーンショット 2022-12-31 10.56.51（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/121b437b-1835-bfe6-0041-e4825d0c492f.png)


## ぶつかったエラー
```
rm: .git/refs/heads/master 2: No such file or directory
rm: .git/gc.log: No such file or directory
fatal: bad object refs/heads/main 2
fatal: failed to run repack
fatal: bad object refs/heads/main 2
error: github.com:aoi-0358/redelivery-app.git did not send all necessary objects
```
翻訳・意味
rm: .git/refs/heads/master 2: そのようなファイルやディレクトリはありません
rm: .git/gc.log: そのようなファイルまたはディレクトリはありません
致命的: 不正なオブジェクト refs/heads/main 2
致命的: リパックの実行に失敗しました
致命的: 不正なオブジェクト refs/heads/main 2
エラー: github.com:aoi-0358/redelivery-app.git は必要なすべてのオブジェクトを送信しませんでした


色々調べるとgit/refs/heads/master 2: とゆうファイルが生成されているのが原因が一番怪しい
参照記事
https://qiita.com/takemaru_shuna/items/0090486d05a48c42e7ca


## やったこと
1. rm .git/refs/heads/main\ 2 を実行して削除


## 結果
無事pushできました。

わかったことがあれば追記していきたいと考えています。
間違った認識などあれば教えて頂けたら嬉しいです🙇

## 追記
関数の呼び出し(PHP)

関数の呼び出しを使ったサンプルプログラムです

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>関数テスト</title>
  <style>
      .a {
        font-size:18px;
        color:#2F7;
      }
      .b {
        font-weight: bold;
        color:#0725BA;
      }
  </style>  
</head>
<body>
  <?php
    //名前を出力する関数
    function show($name){
        echo "<p class='a'><span class='b'>${name}</span>は乃木坂46のメンバーです</p>";
    }
    //名前配列
    $array = ["秋元真夏","遠藤さくら","賀喜遥香"];
    // ループ文で名前を引数にして関数を呼び出す
    foreach($array as $line){
      show($line);
    }

  ?>

</body>
</html>
```

ポイントは
```PHP
function show($name){
        echo "<p class='a'><span class='b'>${name}</span>は乃木坂46のメンバーです</p>";
    }
```
関数にして処理をまとめます

```PHP
$array = ["秋元真夏","遠藤さくら","賀喜遥香"];

    foreach($array as $line){
      show($line);
    }

```
引数を使って関数を呼び出して処理します。
ビッシング詐欺 とは

## 勉強前イメージ

ビッシングとは・・・・？

## 調査

### ビッシング詐欺 とは

voiceとフィッシングをかけ合わせた言葉で、電話を利用したフィッシング詐欺の方法を指します。
ビッシング詐欺の目的は個人情報や銀行口座番号、パスワードを聞き出すことです。
目的はフィッシング詐欺と同様ですが電話を使うことで緊急性が増し、利用者を不安にさせることで
情報を引き出すことが可能になります。

### ビッシング詐欺の仕組み

よくあるのが、金融機関を名乗るものからターゲットへ連絡を掛け、
不正なアクセスがあった旨を伝えます。ここに連絡ください！というのを置いておき
ターゲットは不安になって電話をかけてしまいます。
そこでクレジットカードの番号や暗証番号の入力が求められる、という流れになります。

リモートワークが急激に広まったこともあり、ビッシング詐欺も広がっています。
個人情報だけでなく、会社のサイトへのログイン情報等も搾取されたケースもあるそうです。

### リバースビッシングというのもある

ビッシング詐欺は攻撃者から発信を行いますが、
ターゲットから電話をかけさせるのがリバースビッシングになります。

SMSなどに偽のメッセージを送ってターゲットが連絡を行って情報を引き出したり
google map等で偽の電話番号を載せてサービス事業者のように振る舞うケースもあります。

## 勉強後イメージ

たまに携帯電話会社から連絡ありました、ここに掛け直してください
みたいなSMS来てることもある・・・・全く気にせず無視してたけどこういうことだったのか。
マルウェアの可能性もあるけど、どれだけターゲットにアクセスさせるかってことか
確かに電話だと焦るよね。

## 参考

- [「ビッシング」の危険性・対策方法について解説](https://www.alsok.co.jp/person/recommend/1334/)
- [音声フィッシング詐欺「ビッシング詐欺」とはどんな詐欺なのか](https://ascii.jp/elem/000/004/068/4068496/)
paiza.ioでelixir その158

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題

論理回路を真理値表で表示せよ。

# 方針
インタープリターを書く。

# 文法
コマンドは、make, init, nand, nor, xor, and, or, notとprintの9個。
コマンドには引数がある。
コマンドと引数はスペース1個で区切る。

# コマンド
# make 3
3個の端子の真理値表を作る。

# init 0 1
０から１の端子を初期化する。

0	1
0	0
1	0
0	1
1	1

# nand 0 1 2
端子０と端子１の否定論理和を端子２に出力する。

0	1	2
0	0	1
1	0	1
0	1	1
1	1	0

# nor 0 1 2
端子０と端子１の否定論理積を端子２に出力する。

0	1	2
0	0	1
1	0	0
0	1	0
1	1	0

# xor 0 1 2
端子０と端子１の排他論理和を端子２に出力する。

0	1	2
0	0	0
1	0	1
0	1	1
1	1	0

# and 0 1 2
端子０と端子１の論理積を端子２に出力する。

0	1	2
0	0	0
1	0	0
0	1	0
1	1	1

# or 0 1 2
端子０と端子１の論理和を端子２に出力する。

0	1	2
0	0	0
1	0	1
0	1	1
1	1	1

# not 0 1
端子０と端子１の否定を端子２に出力する。

0	1
0	1
1	0


# print
真理値表を表示する。


# サンプルコード

```
defmodule Sim do
	def start_link do
		Agent.start_link(fn ->
			[a: [0, 0, 0, 0], b: [0, 0, 0, 0], c: [0, 0, 0, 0], m: 0]
		end, name: __MODULE__)
	end
	def make(o) do
		Agent.update(__MODULE__, fn v ->
		    d = String.to_integer(o)
			List.keyreplace(v, :m, 0, {:m, d})
		end)
	end
	def init(o, p) do
		Agent.update(__MODULE__, fn v ->
			d = [0, 1, 0, 1];
			v = List.keyreplace(v, :a, 0, {:a, d})
			d = [0, 0, 1, 1];
			List.keyreplace(v, :b, 0, {:b, d})
		end)
	end
	def nand(o, p) do
		Agent.update(__MODULE__, fn v ->
			d = [1, 1, 1, 0];
			List.keyreplace(v, :c, 0, {:c, d})
		end)
	end
	def nor(o, p) do
		Agent.update(__MODULE__, fn v ->
			d = [1, 0, 0, 0];
			List.keyreplace(v, :c, 0, {:c, d})
		end)
	end
	def xor(o, p) do
		Agent.update(__MODULE__, fn v ->
			d = [0, 1, 1, 0];
			List.keyreplace(v, :c, 0, {:c, d})
		end)
	end
	def and0(o, p) do
		Agent.update(__MODULE__, fn v ->
			d = [0, 0, 0, 1];
			List.keyreplace(v, :c, 0, {:c, d})
		end)
	end
	def or0(o, p) do
		Agent.update(__MODULE__, fn v ->
			d = [0, 1, 1, 1];
			List.keyreplace(v, :c, 0, {:c, d})
		end)
	end
	def print() do
		Agent.get(__MODULE__, fn v ->
			#IO.inspect v
			{_, a} = List.keyfind(v, :a, 0)
			#IO.inspect a
			{_, b} = List.keyfind(v, :b, 0)
			{_, c} = List.keyfind(v, :c, 0)
			IO.puts " 0 1 2"
			0..3 
			|> Enum.map(fn n -> 
			    IO.puts " #{Enum.at(a, n)} #{Enum.at(b, n)} #{Enum.at(c, n)}"
			end)
			v
		end)
	end
end

defmodule Ronri do
	def run(src) do
		Enum.map(String.split(src, "\n"), fn l ->
			#IO.puts(l)
			s = String.split(l, " ")
			cond do
			Enum.at(s, 0) == "make" ->
				Sim.make(Enum.at(s, 1))
			Enum.at(s, 0) == "init" ->
				Sim.init(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "nand" ->
				Sim.nand(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "nor" ->
				Sim.nor(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "xor" ->
				Sim.xor(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "and" ->
				Sim.and0(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "or" ->
				Sim.or0(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "not" ->
				Sim.not(Enum.at(s, 1))
			Enum.at(s, 0) == "print" ->
				Sim.print()
			true ->
				IO.puts Enum.at(s, 0)
			end
		end)
	end
end

Sim.start_link
Ronri.run("""
make 3
init 0 1
nor 0 1 2
print
""")



```

# 実行結果

```
 0 1 2
 0 0 1
 1 0 0
 0 1 0
 1 1 0

```
    
# 成果物

https://paiza.io/projects/rn8ug6GMfFFLxqnCRJiZyA


以上。
個人目標達成のカギはスピードアップ？(一年を振り返りながら)

### はじめに

今年は皆様にとって、どのような一年だったでしょうか。

除夜の鐘が鳴る前に、一年を振り返りながら残課題整理中です。
新しい技術の習得など、達成できなかった個人目標がちらほら。
何が足りなかったのか、来年はどのように計画を進めるべきか。

### `巧遅(こうち)は拙速(せっそく)に如しかず`?

トレンドやテクノロジが目まぐるしく変わり続けています。
市場のニーズにあう新製品開発であっても、競争に打ち勝つには、
開発サイクルを短縮し、他社より早くリリースするしかないです。

そこで、`巧遅(こうち)は拙速(せっそく)に如しかず`、
スピードに勝るものはないと、言い切った言葉でしょうか。
品質向上など`巧遅(こうち)`が必要な場合もあるかもしれませんが、
数年もかけて良い製品を作り上げては、他社に先取りされるかも。

- 完成しないことには、価値は生まれない
- 時にはいい見切りをつけ、完成させることが重要
- 質も大事だが、スピードがもっと大切
- 決して手抜きをした方がいいということではない

エンジニアの個人目標達成も、同じことが言えるかもしれません。

### スピードアップが個人目標達成のカギ?

振り返ってみると、新しい技術を身につけようと立派な計画を立てたものの、
他のタスクを優先し、後回しにしてきた気がします。

`時間が足りなかった`と一言では片付けられないケースが多々。

- 1つのタスクに完璧を求め過ぎ、時間をかけすぎてしまった
    - まずは、基本機能の完成を目指し、効率アップ
- 優先度が高くもない難題を解決しようと意地を張り、時間をかけすぎた
    - 優先度やコスパを意識し、積み残しにする勇気を
- 複数タスクの時間配分が偏ってしまい、個別タスクに時間を使いすぎた
    - `木を見て森を見ず`にならないように

### おわりに
トータル時間は決まっている、個人目標達成にスピードアップがカギと感じました。
来年は自分の限界を決めず行動を起こし、新しい景色を作り出すと心に誓いながら。
皆様、良いお年をお迎えください、来年もどうぞよろしくお願いいたします。
GraphQL サーバー構築(その3. GraphQLスキーマを外部ファイル化する)

id: 72e2f090

## 前回
https://qiita.com/ponchuchu/items/97b119304c6c912ad0bf

## 今回やること
- [x] GraphQLスキーマを外部ファイル化する
- [x] スキーマ読み込み


### GraphQLスキーマを外部ファイル化する

* .graphqlファイルを読み込むのに必要な依存をインストールします。

```sh:bash
$ yarn add @graphql-tools/graphql-file-loader @graphql-tools/load @graphql-tools/schema
```

* src/schema.graphqlファイルを作成

```graphql:schema.graphql
type Book {
  title: String
  author: String
}

type Query {
  books: [Book]
}

type Mutation {
  addBook(title: String, author: String): Book
}

```

### スキーマ読み込み

```ts: index.ts
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
import { loadSchemaSync } from '@graphql-tools/load';
import { addResolversToSchema } from '@graphql-tools/schema';

const schema = loadSchemaSync('src/schema.graphql', {
  loaders: [new GraphQLFileLoader()],
});

(略)

const schemaWithResolvers = addResolversToSchema({ schema, resolvers });
const server = new ApolloServer({ schema: schemaWithResolvers });

const { url } = await startStandaloneServer(server, {
  listen: { port: 4000 },
});

console.log(`🚀  Server ready at: ${url}`);
```

## 次回
- [ ] GraphQLスキーマにもとづいたTypeScriptの型が自動生成

EOF
参考: [GraphQLスキーマを外部ファイル化する](https://zenn.dev/eringiv3/books/a85174531fd56a/viewer/a8fab6)
straight.el 経由でダウンロードしたパッケージを更新(最新化)する

2024/02/23 更新

パッケージマネージャー straight.el でダウンロードしたパッケージを最新にする方法をちゃんと説明しているサイト(本家github含む)がみあたらないので記事にしたいと思います。
以下を .emacs または init.el に書いてありますが(抜粋)、c-quick パッケージの github リポジトリが更新されても自動的に最新のコードがロードされないのでいろいろ調べたり試行錯誤した結果・・・

(1) M-x straight-pull-all
(2) M-x straight-rebuild-all
(3) Emacs を再起動

の手順で最新のコードがロードできました。

また、時短のため特定のパッケージだけ最新化したい場合は・・・

(1) M-x straight-pull-package RET とし「c-quick」(例えば)を入力後 RET
(2) M-x straight-rebuild-package RET とし「c-quick」(例えば)を入力後 RET
(3) Emacs を再起動

の手順で c-quick の最新のコードがロードできました。

自作のパッケージを github 経由等でインストール・テストしている場合に役立つと思います。
(枯れたパッケージ等は更新(最新化)しなくても、あまり問題ないことが多いとはおもいますが)

ちなみに、stack overflow 等では M-x straight-pull-all または M-x straight-pull-package RET としパッケージ名を入力後、再起動で自動的にリビルドされるように書いてあったりしますが・・・少なくとも私がためしたところではリビルドを明示的に実行しないと:

* ~/.emacs.d/straight/repos/【パッケージ名】・・・は最新の .el が格納されるが
* ~/.emacs.d/straight/build/【パッケージ名】・・・は最新の .el が格納されない

という現象を確認しています。なので straight.el でダウンロードしたパッケージを最新化するには「プル＆リビルド」が必要になると理解しています。そもそも「プル」しないといけないと知らなかった方、「プル」してもどうも最新化されないと思っていた方・・・「リビルド」してみてください(~/.emacs.d/straight/build/【パッケージ名】配下のソースを確認してみてください)。

それでは！

```elisp:~/.emacs or ~/.emacs.d/init.el
(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 6))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

;; c-quick
(straight-use-package '(c-quick :type git :host github :repo "emacs-pkg/c-quick"))
(require 'c-quick)

;; company
(straight-use-package 'company)
(require 'company)
(setq company-idle-delay 0) ; デフォルトは0.5
(setq company-minimum-prefix-length 1) ; デフォルトは4
(setq company-selection-wrap-around nil) ; 候補の一番下でさらに下に行こうとすると一番上に戻る
(add-hook 'emacs-lisp-mode-hook '(lambda () (company-mode 1)))
(add-hook 'lisp-interaction-mode-hook '(lambda () (company-mode 1)))
(add-hook 'lisp-mode-hook '(lambda () (company-mode 1)))
```

c-quick パッケージは以下の記事で説明しています。

https://qiita.com/javacommons/items/c4e85585604d850370b6

https://qiita.com/javacommons/items/e7fe1ba09d4311af9aea

https://qiita.com/javacommons/items/87f7c1f12fac5eedb152

よろしくお願いいたします。
SIMスワップ詐欺 とは

## 勉強前イメージ

SIMを使うのかな。。。
最近esimとか出てきたから？

## 調査

### SIMスワップ詐欺 とは

SIMハイジャックやSIM分割とも呼ばれて、乗っ取り詐欺のようなものになります。
ターゲットになった者はありとあらゆる方法で情報収集されて、情報が悪意のある第三者へ渡る。
ターゲットが公開しているものだったり、漏洩した個人情報なども集められます。
十分に情報が揃ったら携帯電話会社へ連絡し偽の連絡をして持っているSIMへ移すように仕向ける。
これを行うことでターゲットが連絡ができなくなり、ターゲットへ来てた連絡も第三者が受け取れるようになるものです。

### SIMスワップ詐欺の目的

SIMスワップ詐欺の目的はターゲットのオンラインアカウントへのアクセスをするためです。
オンラインアカウントだったらそこまでしなくてもいいのでは？と思うが
二要素認証がある前提でSIMスワップ詐欺を行うということです。

SNSへログインしてアカウントを乗っ取って評判を落とすことも可能。
また、携帯電話から銀行口座のアプリやサイトへログインして金銭的な被害を与えることも可能になります。

### SIMスワップ詐欺を防ぐために

- 怪しいサイトへアクセスしない

SIMカードの複製には個人情報が必要です。
悪意のある第三者はどうにかしてターゲットの個人情報を取得しようとします。
暗号化されていないページはもちろん、公式でないサイトへアクセスを行うことも注意しましょう

- フィッシング攻撃に注意

個人情報へアクセスされることを防ぎます。
見覚えがあるメールでも偽物でないか注意をすることが必要です。

## 勉強後イメージ

正直フィッシング詐欺って見分け付かないの難しいよね・・・・
というか、二要素認証あってもSIMスワッピングされたら結構終わりな感じするよね、怖い

## 参考

- [チェック・ポイント、SIMスワップ詐欺の被害に遭わないための３つのポイントを公開](https://prtimes.jp/main/html/rd/p/000000125.000021207.html)
- [SIMスワップ詐欺の手口とその対策](https://eset-info.canon-its.jp/malware_info/special/detail/210209.html)
【Python】イテレータが何となく分かる様になる

# イテレータ

イテレータとは？

* データの流れを表現するオブジェクト
* 要素を1つずつ取り出せるオブジェクト
    * `__iter__()`メソッドから取り出されたオブジェクトが**イテレータオブジェクト**
    * データがなくなると、StopIteration 例外を送出する

https://docs.python.org/ja/3.10/glossary.html#term-iterator

## イテレータオブジェクトを作ってみる

```python
fruits = ["apple", "orange", "grape"]

iterator = iter(fruits)
print(iterator)  # <list_iterator object at 0x10fd7bf70>
```

```python
for i in iterator:
    print(i)

# apple
# orange
# grape
```

リストと同じようにfor文でループすることが可能です

ではリストとの違いは？

## 次の要素を調べる

組み込み関数`next`を使用することで次の要素を調べることができる
この機能はリストにはできないが、**イテレータオブジェクトだからこそ使用できます**

### イテレータの場合

```python
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
```

```
apple
orange
grape
Traceback (most recent call last):
  File "/Users/ShoyaBaba/application/practice/python-practice/sample2.py", line 9, in <module>
    print(next(iterator))
StopIteration
```

`grape` の次の要素は存在しないので`StopIteration`例外が送出されます

### リストの場合

```python
print(next(fruits))
```

```
Traceback (most recent call last):
  File "/Users/ShoyaBaba/application/practice/python-practice/sample2.py", line 6, in <module>
    print(next(fruits))
TypeError: 'list' object is not an iterator
```

## イテレータオブジェクトは使用済みの同じものを返す

> (list のような) コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。
https://docs.python.org/ja/3.10/glossary.html#term-iterator

公式にもありますが、コレだけでは意味が分かりませんでした。
実際にコードにすることで意味が分かりました

### 同じ処理中でリストの繰り返しをする

> コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。

```python
fruits = ["apple", "orange", "grape"]

for f in fruits:
    print(f)

for f in fruits:
    print(f)
```

```
apple
orange
grape
apple
orange
grape
```

この結果は容易に想像がつきます。
for文で2度同じオブジェクトをループが実行されて出力もされます

### 同じ処理中でイテレータの繰り返しをする

> これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。

```python
fruits = ["apple", "orange", "grape"]

iterator = iter(fruits)

for i in iterator:
    print(i)

for i in iterator:
    print(i)
```

```
apple
orange
grape
```

処理中で、一度使用したため空のコンテナが返されます
そのため、上のfor文での出力のみがされます

## どこで使う？

どんなものかはなんとなく分かったが、そもそもの用途が分からない

イテレータの機能として、

* 操作のステップごとに、順に要素を取り出せる

がある。

これを利用して書くようできる事例としては、、、

### 例として

* テキストファイルを開いて、１行ごとに読み取り、表示
    * 1行目には、hogehogeの処理をして、表示
    * 2行目には、〇〇の処理をして、表示

for文があるのでイテレータは滅多に使わない見たいですが。笑
こんなものがある程度に知っておくといいかもしれないですね
ダークマーケット とは

## 勉強前イメージ

ダークウェブ的な？

## 調査

### ダークマーケット とは

ダークネットマーケットや暗号マーケットともいわれます。
ダークネットを介して運営されているダークウェブ上の商業のウェブサイトになります。

chromeなど主要なブラウザからはアクセスができず、特殊なブラウザを利用するので一般ユーザからのアクセスは難しいです。
また、取引としれは仮想通貨での取引が基本になっており追跡リスクが低いのも特徴です。

### ダークマーケット でやり取りされている情報

違法な商品やサービスのやり取りが頻繁に行われています。
ドラッグや武器、クレジット情報やゼロデイ脆弱性の情報もやり取りがされています。
またDoS攻撃用のツールもやり取りされているのでこういう情報から攻撃を行う人はいると見られています。

## 勉強後イメージ

ダークウェブ上のamazonみたいなやつってことかな？
結構見た目は一般的みたい。

## 参考

- [犯罪者にとっては格好のエサ場？次世代ダークマーケットの利用がもたらす脅威](https://ascii.jp/elem/000/001/812/1812203/)
インシデントって結局なに？〜ITIL4から学ぶインシデント管理・問題管理〜2/2

## はじめに
当初は記事を分けるつもりではなかったのですが、
思ったより長くなってしまったので1/2、2/2とさせていただきました。
前回の記事は↓です！

https://qiita.com/makky/items/bf3fa48000670815bc69

```
①モニタリングおよびイベント管理
②インシデント管理
③問題管理
```
の②インシデント管理の続きからスタートです！


### ②インシデント管理

前回の記事ではインシデントは
①サービスデスク経由でユーザーから直接伝達された現象
②モニタリングおよびイベント管理プラクティスからのエスカレーション
③技術スタッフによる記録

の3つに分けて記録されること、そしてインシデント管理では
**可能な限り迅速に運用を回復させること**を第一に考えることを学びました。

ではインシデントはどのように対応順位がつけられていくのでしょうか

ここでインパクトと緊急度という考え方が出てきます。
この2つの指標を持って優先度が確定していきます。

#### インパクトとは？
インシデント、問題、変更によるビジネスへの影響です。
一般には下記の項目を考慮し確定して大きさを確定していきます。

・生命や健康に関わるリスク
・影響を受けるサービスの数
・財政上の損失
・事業の評判への影響
・規制上、法律上の違反

例えば、影響を受けるユーザーが1人であっても、ビジネスに多大な損失がある場合は
インパクトは大きくなる場合もあるといったイメージです。

#### 緊急度とは？
ではもう1つの指標、緊急度についてです。ITILでは下記のように定義されています。

> インシデント、問題、変更が事業に顕著なインパクトを与えるまでに残された時間の指標

要するに **「事業にとってどれだけ早く解決する必要があるか」** ですね。


上記のインパクト、緊急度をもとにインシデントの優先度が確定されていきます。

例えばインパクトが大きいインシデントだったとしても、
5年先までに解決しないといけない（=5年間は影響がない）といった場合は
緊急度が低く、結果インシデントの優先度が低くなったりします。
この2つの指標をもってインシデントの優先度は確定されていきます。



## 問題管理

```
①モニタリングおよびイベント管理
②インシデント管理
③問題管理
```
の③問題管理まできました。（思ったより長かった、、）

#### 問題管理とは？
ITILでは下記のように定義されています。

> インシデントの実際の原因と潜在的な原因を特定し、ワークアラウンドと既知のエラーを管理する。ワークアラウンドと既知のエラーを管理することでインシデントの発生する可能性とインパクトを抑える。

インシデント管理では運用を回復させることが第一だったかと思います。
なのでインシデントの発生を減らすなどはインシデント管理の役割ではないということです。

逆に（?)問題管理では実際の原因、潜在的な原因まで特定をしていきます。
そしてインシデントの発生する可能性を減らしたり、発生した場合のインパクトを抑えていきます。


そもそもになりますが、ここでいう問題とは何なのか
こちらもITIL内で下記のように定義されています。

> 1つまたは複数のインシデントの原因、または潜在的な原因のこと

この問題に対して「既知のエラー」なのかどうかをまず特定します。

#### 既知のエラーとは
> 分析済だが、未解決の問題のこと

該当箇所はわかっているけど、修正には時間がかかりそうなケースなどが該当します。
問題管理の1つのステータスのようなイメージです。
こういった場合には既知のエラーとして文書化しておくことが重要です。

インシデントが発生する度に問題管理で原因を特定して、
これ、前にも調べたやつだ、、となるのを防ぐためですね

前回の記事のはじめにで記載をした
**「これ前にもあった気がする、、」「これって〇〇さんじゃないとわからないかも、、」**　は
文書化することで防いでいくということですね。

ここの文書化に関連してナレッジ管理というものが出てきます。
#### ナレッジ管理とは？
> 組織全体の情報とナレッジの利用の有効性、効率性、利便性を維持し、改善すること。

知識の再発掘を減らし、適切な人材が適切なタイミングで適切な知識を保持できるような仕組みです。
ナレッジ管理については、これまた長くなってしまうので一旦ここまでとします。


#### ワークアラウンドとは？
問題管理の定義で出てきたワークアラウンドについてです。

> 完全な解決策がないインシデントまたは問題のインパクトを軽減または排除するソリューションのこと

要するに「問題に対する回避策」というイメージです。

先程の「既知のエラー」の例で解決までに時間がかかりそう、、といった場合に
ワークアラウンドもあわせて文書に残しておくことで、インシデントのインパクトを軽減することができます。



## おわりに
自分のアウトプットとしてつらつら理解したままに書いてみました。
インシデント管理、問題管理に限らずですが、ナレッジ管理は肝になってくるような気がします。
ITILにはベストプラクティスがぎゅっとつまっているので
実務でも活かせるよう落とし込みしていけたらと思います！


### 参考
今回はこちらの本をもとに書かせていただきました、ありがとうございました！

https://amzn.asia/d/d71yeuG
dockerコマンドの一部のコマンドライン

●dockerコマンドの一部のコマンドライン

■コンテナ管理
・docker pause コンテナ内のプロセスを一時停止
・docker unpause コンテナ内で一時停止しているプロセスを再開
・docker stats 実行中のコンテナのリソース使用状況を表示

■イメージ管理
・docker rmi ローカルに保存されたイメージを削除
・docker import アーカイブファイルの内容を読み込んでイメージを作成
・docker export コンテナのファイルシステムの内容をアーカイブとして出力
・docker build dockerfileからイメージをビルド
・docker commit コンテナをイメージとして保存

docker exec {コンテナ名|コンテナID} コマンド
・「-it」オプションでコンテナの標準入出力に接続できる
-i：キーボードなどからの入力を受け付ける
-t：擬似ターミナルの割り当て


●Dockerfile
Dockerのイメージを作成する際の構成を定義するファイル。ベースのイメージに対してパッケージをインストールするコマンドなど、イメージ作成時に実行する命令を記述しておく。

■Dockerfileの主な命令
（大文字小文字の区別はないが、引数と区別するために慣習として大文字で記述）

書式：命令　引数

命令
・FROM ベース(基)イメージの指定※最初に記述
・LABEL メタデータ(作成者やバージョンなど)の指定
・RUN イメージのビルドに実行するコマンドの指定
・ADD コンテナに追加するファイルやディレクトリの指定。ローカル・リモートからも追加できる。ローカルのtarアーカイブは自動で展開される。
・COPY コンテナに追加するファイルやディレクトリの指定。ローカルからのみ追加できる。tarアーカイブは自動で展開されない。
・CMD コンテナ起動時にデフォルトで実行するコマンド、またはENTRYPOINTのデフォルトの引数の指定
・ENTRYPOINT コンテナ起動時に必ず実行されるコマンドの指定
・ENV 環境変数の指定
・USER 実行するユーザの指定
・WORKDIR 作業ディレクトリの指定
・EXPOSE コンテナ内で公開するポートの指定
・VOLUME 作成するマウントポイントの指定
・HEALTHCHECK コンテナの稼働状況をチェックする方法の指定


HEALTHCHECK [オプション] CMD コマンド

オプションには--intervalや--timeoutなどを指定できる。
CMDの後には、コンテナ内部で実行してコンテナが動作しているかどうかを確認するコマンドを指定

※「#」で始まる行はコメント行とみなされます


●Dockerのネットワーク
Linux版のDockerではデフォルトネットワーク構成があります。

bridge ... ホストと異なるネットワーク。コンテナ側のeth0インタフェースとホスト側の仮想インタフェース（veth）が直結し、docker0ブリッジ経由で外部のIPアドレスと通信できる
host ... コンテナはホストと同じネットワークインタフェース、IPアドレスを持つ
none ... ネットワーク接続が無い。コンテナはlookbackインタフェースのみ持つ

デフォルトではコンテナ作成時に「bridge」ネットワーク構成。

●別のネットワークを使用する場合は、コンテナ起動時に「--network=ネットワーク名」もしくは「--network ネットワーク名」というオプションを指定してそのネットワークに接続。（以前の--netオプションも使用できる）
Create a Flow with Process Builder


+ [Create a Flow with Process Builder](https://trailhead.salesforce.com/ja/content/learn/projects/set-up-case-escalation-entitlements/create-flow-with-process-builder)

+ [Set Up case escalations and entitlements - Create a flow with Process Builder](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000MjS43SAF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7d09578b-b03e-2732-6c6a-3fd740ee41aa.png)

:::note
Is the email template you have created is active? Make sure Available for Use is checked in the email template section. In the below image you can see Available for use section is checked for active email templates


作成した電子メール テンプレートはアクティブですか?メール テンプレート セクションで [利用可能] がオンになっていることを確認します。下の画像では、使用可能なセクションがアクティブな電子メール テンプレートに対してチェックされていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/62a75430-8ade-c921-4b61-01f5e1a7d7b7.png)
:::
アドウェア とは

## 勉強前イメージ

広告絡みのなんかかな。。。

## 調査

### アドウェア とは

広告収入を目的として無料で提供されるソフトウェアのことを指します。
広告のアドバタイズメントとソフトウェアをつなげた言葉になります。
アドウェア自体はサイバー攻撃ほど危険なものではないと考えられていますが、中には個人情報を搾取したりマルウェアに感染させたりするものもあります。
また、インストールを行うソフトウェアであればマルウェアに感染したりする可能性もあります。

### アドウェアをインストールするとどうなるのか

- ポップアップ広告の表示

よくある、セキュリティソフトを似せたようなものでポップアップががめんじょうにでたりします。
勝手に他のウィンドウを開いたりすることもあります。

- 個人情報の搾取

例えばセキュリティソフトだと購入のリンクへ誘導して個人情報やクレジットカードの情報を取得したりもします。

- ホームページの変更

むかしIEとかでよくあった、ホームページを勝手に変えられるようなこともされます。

### なぜアドウェアが入り込むのか

- 無料のソフトウェアのインストール

上記でも記載していたようにいわゆるフリーソフトなどをインストールした際に発生します。

- ファイルをダウンロードする際についてきた

オンラインでファイルをダウンロードする際に一緒に合わせてダウンロードしてしまっている場合もあります。

- 怪しいwebサイトの閲覧

怪しいサイトを閲覧することで [ドライブバイダウンロード](https://qiita.com/miyuki_samitani/items/212faa45ad6cbc3ffc4d) を使用して
裏で勝手にダウンロード・インストールがされている場合があります。

## 勉強後イメージ

昔のパソコンでIEをめちゃくちゃにされたりとか
よくわからん広告がめっちゃ出るのはアドウェアの仕業なのか

## 参考

- [アドウェアとは？被害や対策をわかりやすく解説！](https://it-trend.jp/cyber_attack/article/442-0020)
- [アドウェアとは？アドウェアの削除方法と対策について徹底解説](https://nordvpn.com/ja/blog/adware-removal/)
無限ループせずにCountをとる

### やり方
useRefを使用して、useEffect内で.currentをインクリメントする。
useRefの.currentはstateではないためインクリメント時にuseEffectは呼ばれない。
![20848D37-7739-4005-B6AB-9CDC81BFE705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380959/410c2f52-19f9-0a25-65ab-3af152308727.png)


### NG例
inputが変わるたびにuseEffect内でsetCount関数を呼んでcountをアップデートする。
この場合、countが変更されるたびにuseEffectが呼ばれるため、無限ループになってしまう。
![D7B17489-B7D0-4FCA-9B45-85BADA904EB2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380959/e014cdfe-06a8-9816-e37a-373d4e6da08c.png)

参考ビデオ:https://youtu.be/t2ypzz6gJm0
マルバタイジング とは

## 勉強前イメージ

広告をなんちゃらー・・・って話だった気がする

## 調査

### マルバタイジング とは

ウイルスを表すマルウェアと、広告を表すアドバタイジングを合わせた言葉で
インターネットのweb広告に不正なスクリプトが埋め込まれているのがマルバタイジングと呼ばれるものです。
クリックするだけでマルウェアに感染するweb広告になります。

### マルバタイジング の仕組み

マルバタイジングの仕組みとしては以下になります。

- 悪意のある第三者がweb広告の業者を攻撃して書き換える
- 広告が様々なサイトで表示
- クライアントが広告をクリックし、不正なサイトへ転送
- サイバー攻撃を受けて、マルウェアに感染

web広告の業者への不正アクセスや、その中のデータの書き換え高度な技術を使用しています。
不正なサイトへ転送されてからは [ドライブバイダウンロード](https://qiita.com/miyuki_samitani/items/212faa45ad6cbc3ffc4d) などで脆弱性を利用してマルウェアに感染させようとします。

## 勉強後イメージ

広告にも不正プログラムか・・・
でも広告業者へ不正アクセスってなんか根本から変えようとしてるんやなって気がする。

## 参考

- [マルバタイジングとは？仕組みや影響、被害事例、対策について解説](https://www.lrm.jp/security_magazine/malvertising/)
- [マルバタイジングとは？その仕組みと対策を徹底解説](https://cybersecurity-jp.com/column/26751)
Mac アプリ　自己流おすすめ４選（2022.12.31）

Qiita への投稿もだいぶ久しぶりになってしまった。
最近、左手デバイスとして有名な Stream Deck を購入した。登録するアプリを物色する中で、改めて Mac に入っているアプリを見直していたのだが、その中でいくつか皆さんに紹介したいものがあったのでこの記事をアップすることにした、選定基準はあくまでも自分流であることはご容赦いただきたい。

## Unsplash Wallpaper.app
Mac の壁紙アプリ。設定によって毎日違う壁紙を選択表示してくれる。
今日に気分に合わないなと思ったら自分で変えることもできる。
私の場合は明るい風景が好きなので、それを選択して表示させている。

App Store で入手できる。

今日の壁紙はこれ。
![fig_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/51823ae8-f07d-7b66-be91-dc630e235d2a.png)




## 英かな.app
US 配列キーボードで、左 command キーで半角英字、右 command キーで全角日本語入力に切り替えるもの。
プログラムを打つためにかっこつけて US キーボード（MX Keys mini for Mac）を使っているのだが、当初は control + space キーで入力を切り替えていたが、今どっちになっているのかをいちいち確認するのが面倒だったので、こちらの app を導入。今、半角英字なのか全角日本語なのかを意識せず、打ちたい方の command キーを押せばいいので、やはり楽である。
Activity monitor で見ると Intel で動いている。まあ、Google 日本語入力も Intel で動いているようなので、気にはしていない。

以下を参照。

[https://ei-kana.appspot.com](https://ei-kana.appspot.com)

## Screenshot.app
これまでは、shift + command + 3 とか shift + command + 4 でスクリーンショットをとっていたのだが、たまたま Applications => Utilities のなかにあるのを見つけた。
使ってみると、直感的に使えてなかなか便利である。
Mac の中にプレインストールされています（Applications => Utilities）。

以下を参照。

[https://support.apple.com/ja-jp/guide/mac-help/mh26782/mac](https://support.apple.com/ja-jp/guide/mac-help/mh26782/mac)

## cd to.app
私は、Python をよく使うのだが、Python プログラムの実行は昔ながらの方法で、Terminal から ```python xxx.py``` で行っている。
このため、Python プログラムやデータを格納したフォルダを Finder で選択し Terminal を立ち上げていたのだが、Finder から Terminal を一発起動するアプリがほしかった。
せっかく Stream Deck があるので、Automator で作って Stream  Deckに登録しようと、調べていた中でこのアプリを見つけた。

以下を参照。

[https://jimaru.blog/apple/finder-to-zsh/](https://jimaru.blog/apple/finder-to-zsh/)

実際のインストールは ```brew install cd-to``` でいける。
インストールすると、Applicationsに ```cd to.app``` が登録されるので、Finder のツールバーに登録すればすぐに使えるようになる。
結果的に Stream Deck に登録する必要はなくなった。

![finder.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/d0e1cba3-5070-78e7-6783-86815aa94e4e.jpeg)


以　上
Yoloのアノテーションの記載形式

YOLOでの画像分類を課題で行っている。
調べると、自分で学習データを作る為に特定のツールを使って切り抜きする方法は多く出てくるが、今回は課題ということですでに学習データはある状態。
但しYOLO形式ではないので、変換する方法を自分用にメモしておく

# そもそもアノテーションとは
>アノテーションとは、画像に対して物体がある位置とクラスの注釈をつけること
https://www.alpha.co.jp/blog/202108_02


# アノテーションの記載形式の概要
>Fig. 2. に、YOLOで使用するデータセットにおける、アノテーションの記載形式を示す。1行につき1つの物体を示しており、この例では3つの物体について記載されている。各行はスペース区切りで左から、物体のカテゴリID、物体中心の座標xおよびy、物体の高さhおよび幅wである。Fig. 3. はこのアノテーションに対応した画像ファイルであり、さらにFig. 2. の1行目に記載されたPottedplantの情報との対応関係を追記した。座標 (x, y) は画像の左上の位置を (0.0, 0.0) 、画像の右下の位置を (1.0, 1.0) としたときの座標である。また、画像のサイズ (w, h) は、画像全体の幅および高さを1.0としたときの相対値とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307295/d894f1f3-e7b6-3c37-5447-618d1f4b4f45.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307295/c32c6c78-a397-6454-37df-9c5bdfefad55.png)

参考サイト
https://medium.com/lastmile-dynamo/yolo%E3%81%AB%E3%82%88%E3%82%8B%E7%94%BB%E5%83%8F%E5%86%85%E7%89%A9%E4%BD%93%E3%81%AE%E6%A4%9C%E5%87%BA%E6%8A%80%E8%A1%93-7c1d0a3381fa

# 計算方法
今回自分に与えられたデータは、上記のように0-1に変換していないデータ例えば
> 878,288,931,349,1

みたいな。それぞれ印をつけた物体の(x_min, y_min, x_max, y_max)を示す。これに加え、画像の幅・高さの情報が与えられている。
このような状況からの計算方法は以下のサイトがわかりやすい。

https://qiita.com/yarakigit/items/4d4044bc2740cecba92a
Juliaで"."（ドット）を使ってブロードキャストする

Julia独特の表記（？）で慣れずに何度も忘れたのでメモしておく。


以下のような配列があったとする。
```julia
julia> a = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3
```
**この配列の要素全てに計算を行いたい（ブロードキャストしたい）場合は，演算子に`.`を加える。**


## 加算(addition)
```julia
julia> a .+ 1
3-element Vector{Int64}:
 2
 3
 4
```

## 減算(substraction)
```julia
julia> a .- 1
3-element Vector{Int64}:
 0
 1
 2
```

## 乗算(multiplication)
```julia
julia> a .*2
3-element Vector{Int64}:
 2
 4
 6
```

## 除算(division)
```julia
julia> a ./2
3-element Vector{Float64}:
 0.5
 1.0
 1.5
```

## 累乗(division)
```julia
julia> a .^2
3-element Vector{Int64}:
 1
 4
 9
```

## 除算の商（quotient）
```julia
julia> a.÷2
3-element Vector{Int64}:
 0
 1
 1
```
ちなみにMacで`÷`をタイプするには`option`+`/`。


## 剰余（remainder）
```julia
julia> a .%2
3-element Vector{Int64}:
 1
 0
 1
```

## 等価（equal)
```julia
julia> a .==2
3-element BitVector:
 0
 1
 0
```

## 小なりイコール(less than or equal to)
```julia
julia> a .≤ 2
3-element BitVector:
 1
 1
 0
```
Macで`≤`をタイプするには`option`+`<`。

## 実は乗算と除算はドットがなくてもブロードキャスト可能
@WolfMoon さんから教えていただきました。

```julia
julia> a *2
3-element Vector{Int64}:
 2
 4
 6
```
```julia
julia> a /2
3-element Vector{Float64}:
 0.5
 1.0
 1.5
```


# おまけ Pythonのnumpyの場合

ちなみにPythonのnumpyの場合は自動でブロードキャストされる。
```python
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a+1
array([2, 3, 4])
```
五目並べの強化学習の方法を、ChatGPTに聞いてみた

それなりにしらべて、どうすればよいかはわかったんですが、試しに、GPTに聞いてみました。

(4)については、一般論で、明確な答えは得られませんでした。ミニマックス法とかヒントになりそうなことを入れてみましたが、具体的な回答は得られませんでした。

それ以外は、ちゃんとした回答でした。内容も私の理解と一致してたのであってると思います。


# (1)五目並べの強化学習で入力にする値はなに

五目並べは、2人で行うターン制のゲームです。各ターンにおいて、プレイヤーは空いているマスに石を置いていきます。ゲームは、最初に置かれた石が3つ並んでいるプレイヤーが勝利する、または、すべてのマスが埋まっていると終了します。

強化学習を用いる場合、入力にする値は、五目並べの盤面の状態を表すものが一般的です。この盤面の状態を表す入力値は、盤面上の各マスについて、そのマスが空いているか、プレイヤー1の石が置かれているか、プレイヤー2の石が置かれているかを示すように、数値やビット列などを用いて表現することができます。

たとえば、以下のような盤面の状態を表す入力値を想像してみてください。

空いているマス: 0
プレイヤー1の石が置かれているマス: 1
プレイヤー2の石が置かれているマス: -1
上のように、各マスの状態を数値で表現したものが、五目並べの強化学習で入力にする値となります。

# (2)rewardの値はどうすればいい

強化学習では、エージェントがどのような行動を取ることが最適であるかを学習するために、報酬 (reward) と呼ばれる数値を与えることがあります。この報酬は、エージェントが取る行動が有益であったかどうかを示すものです。報酬は、エージェントが望む方向に行動を取るように学習するために使われます。

五目並べの場合、報酬の値は、ゲームの状態に応じて決めることができます。たとえば、以下のような報酬を想像してみてください。

エージェントが勝利したとき: 1
エージェントが敗北したとき: -1
ゲームが引き分けで終了したとき: 0
上のように、報酬を設定することで、エージェントが望む方向に学習するようにすることができます。

報酬を設定する際には、自分が望む方向にエージェントが学習するように、適切な値を設定することが重要です。報酬を大きくすると、エージェントはそのような行動を取ることを好むようになりますが、報酬を小さくすると、エージェントはそのような行動を避けるようになります。また、報酬を設定するときには、ゲームのルールや、自分が望む勝利条件を考慮して設定することが重要です。

# (3)Q関数の更新する方法は？

Q関数とは、強化学習で用いられる、状態と行動の組み合わせに対する報酬を表す関数です。Q関数は、エージェントが取るべき行動を決定する際に使われます。

Q関数を更新する方法として、Q学習 (Q-learning) という手法がよく用いられます。Q学習では、以下の式を用いて、Q関数を更新します。

Q(s, a) ← (1 - α) × Q(s, a) + α × (r + γ × maxa' Q(s', a'))

この式で、Q(s, a) は状態 s において行動 a を取ったときの報酬を表す Q 関数の値です。r は実際に得られた報酬を表し、α は学習率を表すパラメータです。γ は割引率を表すパラメータで、未来の報酬をどの程度重視するかを決めるものです。s' と a' は、行動 a を取った後に遷移する状態 s' と、その状態で取るべき行動 a' を表します。

上の式で、Q(s, a) は、(1 - α) × Q(s, a) の部分が前回の Q 関数の値を保持するもので、α × (r + γ × maxa' Q(s', a')) の部分が新しい情報を反映するものです。これらを足し合わせることで、Q 関数を更新することができます。

# (4)五目並べの強化学習の場合、相手の手番はどうすればいい？ミニマックス法つかえる？

五目並べの強化学習の場合、相手の手番を考慮することが重要です。この場合、エージェントが次の手を選択する際には、その行動がどの程度有益であるかを決定するために、相手の手番を考慮した場合の行動価値を評価する必要があります。

そのため、相手の手番を考慮する方法として、ミニマックス法 (Minimax algorithm) がよく使われます。ミニマックス法は、ゲーム木を探索し、最適な行動を選択するためのアルゴリズムです。ゲーム木とは、先手から後手から交互に行動を選択していくことで、様々なゲーム局面を構成するものです。

ミニマックス法では、ゲーム木を深さ優先探索で探索します。探索するときには、以下のように行います。

最も深い局面を探索する。
最も深い局面では、先手の行動を全て評価する。
最も深い局面での、先手の行動の中で最大の報酬を得られるものを選択する。
次に、次に深い局面を探索する。
次に深い局面では、後手の行動を全て評価する。
次に深い局面での、後手の行動の中で最小の報酬を得られるものを選択する。
以上のように、ゲーム木を深さ優先探索していき、最終的に最も深い局面で選択された行動を最適な行動とする。
このように、ミニマックス法を用いることで、相手の手番を考慮した場合の最適な行動を求めることができます。五目並べの強化学習においても、ミニマックス法を用いることで、相手の手番を考慮した最適な行動を求めることができます。

# (5)五目並べをDQNで強化学習するときのニューラルネットの構成をおしえて

五目並べをDQN (Deep Q-Network) を用いて強化学習する場合、ニューラルネットワークの構成については、以下のようになると考えられます。

入力層：盤面の状態を表すデータを入力する層です。五目並べの盤面は、石が置かれている場所を1、置かれていない場所を0で表すことができます。そのため、入力層は、盤面の状態を表すデータを入力することができるようになっています。

中間層：入力層から出力層へとデータを伝播させる層です。DQNでは、中間層を複数持つことができます。中間層の数や、各層のニューロンの数は、ハイパーパラメータとして調整することができます。

出力層：各行動の行動価値を出力する層です。五目並べの場合、出力層は、盤面上のすべての場所に石を置くことができるため、出力層のニューロンの数は、盤面のサイズによって決まります。


# (6)中間層として実績のあるプログラムを教えて

五目並べをDQN (Deep Q-Network) を用いて強化学習する場合、中間層には、畳み込み層や全結合層を持つことができます。

畳み込み層は、画像認識や自然言語処理などでよく使われる層で、入力データをフィルターで処理して、畳み込むことで、情報を抽出することができます。五目並べの場合、畳み込み層を使用することで、盤面の状態から有益な情報を抽出することができるでしょう。

全結合層は、入力データをすべてのニューロンと結合することで、データを処理する層です。五目並べの場合、全結合層を使用することで、盤面の状態をもとに、各行動の行動価値を出力することができます。

また、中間層には、活性化関数を適用することで、ニューラルネットワークの性能を向上させることができます。一般的に使われる活性化関数には、ReLUやsigmoidなどがあります。
バンキングマルウェア とは

## 勉強前イメージ

ATMとかバンキングアプリとか？

## 調査

### バンキングマルウェア とは

インターネットバンキングを攻撃するマルウェアのことを指します。
金融機関のwebページを不正に改造してウイルスを設定しておきます。
クライントが利用中にポップアップが表示されたりして、送金がされてしまいます。

同じような金融の詐欺ではフィッシング詐欺が有名ですが
フィッシングは別のURLを使います。
バンキングマルウェアはURLは正しいので気づきずらいのが特徴です。

もともとユーザ名とパスワードなどはキーロガー等で盗まれていましたが、金融機関も対策を行い
攻撃者側と金融機関でいたちごっこが続けられています。

## 勉強後イメージ

URL一緒だったら結構騙される人多い気がするなぁ。。。

## 参考

- [不正送金させるバンキングマルウェアとは？手口・対策・被害状況まで](https://it-trend.jp/cyber_attack/article/banking-malware_to_illegal_remittance)
TerraformをMac + Azureで使うときのメモ


AzureでTerraform使うことになったのでメモ。

## はじめに

Terraformのコードはかなりバージョン依存が強いです。なので、[本家の最新サンプル](https://developer.hashicorp.com/terraform/tutorials/azure-get-started/azure-build)など参考にした方がいいです。

>原因不明のエラーでしばらく悩みました。

## 事前準備

### Azure CLIのインストール

基からTerraformがインストールされているAzure Cloud Shell使う例が多いようですが、今回はCLI。
Homebrewで入ります。

```bash
brew install azure-cli
```

いちおう動作チェック。


```bash
az --version
```

### Terafformのインストール

オフィシャルでは、下記コマンドが紹介されています。こちらもHomebrewで入るみたい。

```bash
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
```

ただ、Terraformはバージョンがコロコロ変わるかつ依存が高いので、tfenvというバージョン（環境）切り替えツールを介してインストールしてみます。

tfenv自体はHomebrewで入ります。

```bash
brew install tfenv
```

とりあえずlatestを入れてみる。

```bash
tfenv install latest
```

>提供されてるバージョンリストは、tfenv list-remote で確認可能です。

インストールされているバージョンを確認。

```bash
tfenv list
```

執筆時点では1.3.6が最新なので、それを利用するように指定。

```bash
tfenv use 1.3.6
```

動作確認。

```bash
terraform --version
```

### VSCodeにTerafform用の機能拡張を入れる

設定の記述自体はvscodeで記述するのでプラグイン入れておきます。
とりあえず下記２つを入れました。オフィシャルのやつとAzure用のもの。

>プラグインは再起動なしでうまく起動するはずだがフォーマッタ機能が再起動後じゃないとうまく動作しなかったです。

* https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform
* https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureterraform

## 基本操作？

最低限の動作確認をしてみたいと思います。
基本的には[本家のチュートリアル](https://developer.hashicorp.com/terraform/tutorials/azure-get-started)の[一部](https://developer.hashicorp.com/terraform/tutorials/azure-get-started/azure-build)を端折ってやってみるだけ。

### Azureへのログイン

コマンドラインでAzureにログインします。
サービスプリンシパルを使う方法が検索にひっかかるし、その方がいいのでは？と思うのですが、Azure CLI経由では更新系？の操作が通常？のログインじゃないとできないみたいなので普通にログインします。

```bash
az login
```

### 作業場とファイルを作る

作業用のディレクトリとファイルを作ります。

```bash
cd
mkdir terra-test
cd terra-test
```

とりあえず今回はmain.tfにまとめて書く。

```bash
touch main.tf
```

### テンプレートファイルを書く

記述します。プロバイダー関連をproviders.tfに切り出すのが一般的みたいですね。

```tf:main.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0.2"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "myTFResourceGroup"
  location = "japaneast"
}
```

### 初期化

ファイルを記述したら初期化します。必要なフィアルなどがダウンロードされます。

>プロバイダのバージョンなどが違うとエラーが出るみたい。

```bash
terraform init
```

### フォーマット確認

ネットの記事ではplanを生成する感じだったとけどチュートリアルはフォーマットの検証する感じなのでしてみる。

```bash
terraform fmt
```

### バリデート

内容の？検証。

```bash
terraform validate
```

### 適用

問題なければ適用。

```bash
terraform apply
```

### 状態確認

```bash
terraform show
terraform state list
```

>必要に応じてWebポータルなどでも確認。

### 片付け

いらなくなったらdestroyで掃除。

```bash
terraform destroy
```

とりあえずは以上。
他のリソース生成も随時試してみたい。
【実験中】UnityでAmiVoiceを試す②

この記事は、前回の記事の続きとなります。

[UnityでAmiVoiceを試す①](https://qiita.com/hidaka2022/items/5cd4e53f6624a61bd174)

## ファイル先の指定と実行
前回の「ファイルがない」というメッセージに対して
Assetからフォルダを指定して実行しました。

すると、メッセージが以下のように変更されてきます。

![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/0a419abf-cc82-c36f-277e-35baa0cbf77c.png)

エラーメッセージから、セキュリティの問題化と思いNotonの設定を外してみましたが
通信ができず。

## Network系のクラスを使う必要あり
どうやら、ネットワークをUnity用にカスタマイズする必要があるようです。
（なかなか難しい）

https://qiita.com/tomato_sugar/items/ac4b5dbe8277496add56

また、調べたところ、Network関連のUnityシステムは現在推奨されていないとのこと。
先日実装したAzureは、SDK自体にそういう部分が含まれていたため
さくっと制作できたようです。

結局はAndroidの設定を作るしかない、というい結論に至っているので
時間との勝負にはなりそうですが、作り方を模索する点も含めて
色々試していこうと思います。
Dark theme for MS Office

# How to change the theme

[File] -> [Options] -> [General] -> [Office Theme]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31469/67964620-576a-4197-88a2-1aa017e8c523.png)

See:
https://support.microsoft.com/en-us/office/change-the-look-and-feel-of-microsoft-365-63e65e1c-08d4-4dea-820e-335f54672310
【特徴量の生成/Python】ラグ特徴量の生成・使い方

# 今回の課題
Kaggleで時系列データ分析についてインプットをしていたところ、
**ラグ特徴量**という特徴量が出てきた。

使い所について、イマイチ理解ができなかったため、勉強することにした。

## ラグ特徴量とは
今の時間の特徴だけに注目せずに、過去や未来の特徴を用いて、
現在のデータの特徴量を増やす方法。
ラグ特徴量を用いることで、機械学習モデルの予測精度を向上できる可能性がある。
（ラグ特徴量を追加するので、重回帰分析になる。）

**過去のデータを特徴量として使い、機械学習モデルの予測精度を向上させたいときに使うことができる。**

※参考：[【機械学習】時系列データの前処理 -ラグ特徴量作成-](https://cpp-learning.com/preprocess-time-series/)

## コード
#### 1)関数を用意しておく
```python
#指定したカラム、指定した単位でgroupbyして集計してデータフレームで返す関数
def grouped(df, key, freq, col):
    # Grouperは、時系列をGroupbyするためのもの。key:groupbyするカラム。freq:集計する単位。
    df_grouped = df.groupby([pd.Grouper(key=key, freq=freq)]).agg(mean = (col, 'mean'))
    df_grouped = df_grouped.reset_index()
    return df_grouped

# ラグ特徴量を追加するための関数
def add_lag(df, freq, col, lag):
    df_grouped = grouped(df, key, freq, col)
    name = 'Lag_' + str(lag)
    df_grouped['Lag'] = df_grouped['mean'].shift(lag)
    return df_grouped
```
※参考：[【Python】pandas.Grouperで時系列データを楽々groupby!](https://hesma2.hatenablog.com/entry/2021/01/22/003526)

#### 2)Weeklyのラグ特徴量
```python
# add_lag関数を呼び出して、ラグ特徴量を追加する
df_grouped_train_w_lag1 = add_lag(train_df, 'date', 'W', 'sales', 1)
df_grouped_train_m_lag1 = add_lag(train_df, 'date', 'M', 'sales', 1)

df_grouped_train_w_lag1.head()
```
**【出力結果】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/34e5c53f-716f-7bea-5ade-c1ed9cf9b107.png)

#### 3)ラグ特徴量を使って回帰モデルを可視化する
```python
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(30,20))
axes[0].plot('Lag', 'mean', data=df_grouped_train_w_lag1, color='0.75', linestyle=(0, (1, 10)))
axes[0].set_title("Sales (grouped by week)", fontsize=20)
axes[0] = sns.regplot(x='Lag', 
                      y='mean', 
                      data=df_grouped_train_w_lag1, 
                      scatter_kws=dict(color='0.75'), 
                      ax = axes[0])


axes[1].plot('Lag', 'mean', data=df_grouped_train_m_lag1, color='0.75', linestyle=(0, (1, 10)))
axes[1].set_title("Sales (grouped by month)", fontsize=20)
axes[1] = sns.regplot(x='Lag', 
                      y='mean', 
                      data=df_grouped_train_m_lag1, 
                      scatter_kws=dict(color='0.75'), 
                      line_kws={"color": "red"},
                      ax = axes[1])

plt.show()
```
※`seaborn.regplot`メソッドは、
　２次元のデータと線形回帰モデルの結果を重ねてプロットする。
　(2次元データは説明変数が複数あるので、回帰分析の種類は**重回帰分析**になる。)

**【出力結果】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/d2b1aa26-84f8-d9c2-149b-7be0b3349185.png)
未経験からエンジニア向け：CSSは最初勉強しなくても良い

CSS
CSSはWebページに統一のデザインを適用するために記述します。
```css
css:
h1
{
	color:red;
}
```
------
# 理由その１
CSSはhtmlを外だししたものだから

------
# 理由その２
CSSは、デザイナさんが作ることが多い

------
# 理由その３
CSSは、他の事になれてきたら覚えましょう

------
# 理由その４
もちろんCSSを勉強して分かったら問題なし！
でもCSSで躓いても気にしないで！

------
# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
CloudFormationで文字列と変数を連結する方法（Fn::Join or Fn::Sub）

# 目的
クラウドフォーメーションで定義したリソースの戻り値を用いることが多々あるかと思います。
「文字列＋リソースの戻り値」みたいにしたい場合に覚えておくと便利な記述方法になります。

例えば、ECSのコンテナ定義でドッカーイメージを定義する際、ECRのリポジトリのURIが必要になります。
連結方法には「Fn::Join」と「Fn::Sub」の2種類があります。それぞれのパターンを示します。

# Fn::Join
```yml
############### ECR ###############
  myEcr:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: myRepository
      EncryptionConfiguration:
        EncryptionType: KMS

############### ECS ###############
  myTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties: 
      ContainerDefinitions: 
        - Name: myTask
          Image:
            !Join # ECRリポジトリのURI＋バージョン（:latest）を連結
              - ''
              - - !GetAtt myEcr.RepositoryUri
                - ':latest'
```

# Fn::Sub
公式ドキュメントにも記載がありますが、マッピングで「Fn::Sub」関数を使用したケースになります。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html
```yml
############### ECR ###############
  myEcr:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: myRepository
      EncryptionConfiguration:
        EncryptionType: KMS

############### ECS ###############
  myTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties: 
      ContainerDefinitions: 
        - Name: myTask
          Image:
            !Sub # ECRリポジトリのURI＋バージョン（:latest）を連結
              - ${Domain}:v1
              - { Domain: !GetAtt myEcr.RepositoryUri }
```

# まとめ
「Fn::Su」関数を使うほうがすっきりしますね。
どちらを使うかはお好みで。
XcodeにSVGやPDF画像データを利用する方法


# はじめに
Xcodeでデザイナーさんから3種類のサイズ(1x, 2x, 3x)を出力していただいたり、エンジニアがわざわざ３つの画像データを登録するのは面倒ですよね。
時々1x, 2x, 2xと誤って画像選択されていることもあり、できる限りHuman Errorは発生しない仕組みにした方が良いかと思います。


# メリット
1. 基本的にVector画像データ（SVGやPDF）はPNGデータよりもサイズが小さくなります。
1. 1x, 2x, 3x... kx とサイズごとに異なる画像データを用意しなくて済みます。
1. 品質を落とさずに自動的にScaliingされます。


# 方法
1. 新規Image Setを作成します
1. 右側の「Preserve Vector Data」にチェックを入れます
1. 右側の Scalesを「Single Scale」に選択します
1. SVG or PDF画像をアップロードします

![Screenshot 2022-12-30 at 4.10.46 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/acf96fdd-b58b-7b5e-02b0-189805aab84c.png)

# 注意
- もし「Preserve Vector Data」にチェックを入れない場合、Xcodeは自動的にVectorデータを 1x,2x,3xのサイズ別データに変換してしまうため、自動的にスケールしなくなってしまいます。
- SVGデータはPDFデータよりもサイズが小さくて済み好ましいのですが、iOS13以上から利用可能なため、iOS12以下をサポートしている場合は、PDFデータのみ利用可能です
若手エンジニア向け：フルスタックエンジニアになろう

CTO歴２０年、10社技術顧問20社以上 CTO社数10社、技術顧問社数20社以上と数々のCTOを歴任してきた森川からの若手エンジニア向けとしての記事です。

# 森川がエンジニアになった経緯
僕は、小学生の頃にプログラミングを始めました。人に話すと凄いとか、変わってるとか言われます。その時の僕は、ゲームが好きでゲームを作ってみたいと思いプログラマーになると心に決めました。今から考えるとゲームがプログラミングによって出来上がってるという事をどうやって知ったのか不思議です笑
父親は、壁塗りの左官屋さんです。母親は、美容師です。プログラミングに関しては全く知りません。当時はインターネットもありませんでしたので本当に不思議です。
ただゲームがやりたくて、自分で作ってみたくて、新聞配達してお金をためてパソコンを買いプログラミングを始めました。
好きなので小学生でも色々と調べてパソコンにたどり着いたんだと思います。その結果、CTOを２０年もやれる様なエンジニアに成長する事が出来ました。
そんな僕からするとプログラミングは、日常でもあり難しさ等感じた事はありません。

# 未経験からエンジニアなれない理由
現在はインターネットが気軽に利用でき、スマホでアプリも簡単に利用できます。プログラミングに関してもネット上の記事だけでなく、Youtubeにもプログラミング動画が沢山あります。
誰でも簡単にエンジニア、プログラマーになれる時代になりました。それなのに何故、エンジニア、プログラマーになるための講座が有料で沢山あって、それでも離脱する人がいるのか、不思議に思った事があります。
最近、結論が出ました。

# 楽しくないから
エンジニアになるには、Javaの勉強とか、TypeScriptの勉強とか、フロントエンドの勉強から、サーバーサイド、クラウド周り、テスト、データベースとかめちゃくちゃ覚える事が多いです。
これって使いみちがわからずに数学の方程式を覚えさせられてるのと同じです。
よく微分、積分は大人になって役に立たないとか言いますが、実は、微分、積分は大人になっても使います。感覚的に理解しているからスポーツが出来てます。微分、積分は、スポーツから話しをすればきっと楽しかったと思います。

# プログラミングもアウトプットからやっていこう
エンジニアになって楽しむためには、Javaの勉強とか、TypeScriptの勉強とかでなく、ブラウザ上で動くアプリを作る事から始めるべきです。
１．HTMLを学ぶ
２．bootstrapで見た目を変える
３．reactで動的にする
４．FirebaseStorageで永続保存できる
５．nodeJSでサーバーサイド開発を学ぶ
みたいな感じです。
動くもの、現象を見ながら楽しみながらプログラミングも勉強すべきです。
実際は、reactやれば、htmlやbootstrapの動作確認を出来るので、３から始めれば良いと思います。

# フルスタックエンジニアになろう
エンジニアとして年収をあげるには、フルスタックエンジニアになろうと言われてます。これに対して敷居が高いを思ってる方々も沢山いると思います。
でもフルスタックエンジニアになると、システム全体を一人で完結できます。一人で作れるのってめちゃくちゃ楽しいんですよね。でもフロントだけしか知らないと、システムの一部分だけなので、歯車の一つに感じたり、成長を感じられなかったりします。

# MERN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/5bd47b00-6a87-50ee-8918-9e73ad3de1d9.png)
最近では、LAMPでなくMERNスタックが主流です。
先ずは、
M-MongoDB
E-Express
R-React
N-Node.js
を身につけるべきです。JavaScriptを覚えれば、ReactもNode.JSも出来るので導入障壁も低いです。

# 最後に
若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
パンクでアナーキーな（？）MATLAB

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

カレンダー2の12/15分として追加しました。

・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/nf3df50c9fa05"</a> [<B>note</B>]にUpしました。</H4>
オレオレ証明書


## 参考
[オレオレ証明書作ってみる](https://qiita.com/miyuki_samitani/items/b19aa5ac3b3c6e312bd5)
[OpenSSL HTTPS通信で警告が出ないオレオレ証明書の作成](https://marock.tokyo/2018/05/08/post-112/)

# サーバー証明書
## ポイント
証明書(crt)作成の際にSANにドメインorIPを設定する

## 秘密鍵を作成
```
openssl genrsa 2048 > server.key
```

## CSR作成
```
openssl req -new -key server.key > server.csr
```

オプションは全てEnterのみ
```
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
```

## SAN設定ファイル(san.txt)の作成
```
subjectAltName = DNS:local-avhub.com
```

## 証明書の作成
```
openssl x509 -days 3650 -req -sha256 -signkey server.key -extfile san.txt < server.csr > server.crt
```

## MAMPへ配置
バーチャルホストに記述されている場所にサーバ証明書(crt,key)を配置する
```http-vhosts.conf
<VirtualHost *:443>
    DocumentRoot "C:\MAMP\htdocs\avhub"
    ServerName local-avhub.com
    SSLEngine on
    # SSLCertificateFile "C:\MAMP\conf\apache\keys\server.crt"
    # SSLCertificateKeyFile "C:\MAMP\conf\apache\keys\server.key"
    SSLCertificateFile "C:\MAMP\htdocs\avhub\keys\server.crt"
    SSLCertificateKeyFile "C:\MAMP\htdocs\avhub\keys\server.key"
    <Directory "C:\MAMP\htdocs\avhub">
        AllowOverride all
    </Directory>
</VirtualHost>
```

## サーバー証明書をインストール

(ルートCA(証明機関)の証明書をインポートする (Windows Tips))[https://www.ipentec.com/document/windows-import-root-ca-certification]
PDFからページ数の情報を抜いて総ページ数を計算して表示する

# 背景
最近自宅の蔵書を裁断して電子書籍にしていますが
どれだけの量になったか確認したくて
色々調べてみました。

# pdfinfoコマンド
たとえばsample.pdfの情報がほしい場合、次のコマンドを実行します。
```
$pdfinfo sample.pdf
```
そうすると次のような情報が得られます。

```
Creator:         PFU ScanSnap Cloud #iX1600
Producer:        PFU PDF
CreationDate:    Sun Nov 20 01:55:39 2022 JST
ModDate:         Sun Nov 20 01:55:39 2022 JST
Custom Metadata: no
Metadata Stream: no
Tagged:          no
UserProperties:  no
Suspects:        no
Form:            none
JavaScript:      no
Pages:           204
Encrypted:       no
Page size:       410 x 591 pts
Page rot:        0
File size:       23174948 bytes
Optimized:       no
PDF version:     1.3

```
スキャナでPDFに変換していることがわかります。またページ数の情報もあります。
ここからページ数を抜いてくることができそうです。

# 作成したシェルスクリプト
ワンライナーできれいにやってみたかったのですが、可読性を考慮し次のように書きました。

```pageCount.sh
#!/bin/bash

pages=0
for file in `find . -name '*.pdf'`; do
        page=`pdfinfo ${file} | grep Pages | sed -e 's/Pages:           //g'`
        echo "${file} ${page}"
        pages=$(($page+$pages))
done

echo "Total Page ${pages}"
```

内容を解説していきます。
やりたいことは各PDFファイルのページ数とファイル名を表示し、
PDFを格納するディレクトリ（サブディレクトリの配下含む）にあるPDFの総ページ数も合わせて表示することです。

注意すべきポイントを挙げていきます。
1. 各PDFファイルに対しpdfinfoを実行する必要があります。
xargsが使えなかったので、for文を律儀に書くことにしました。
pdfinfoの出力からgrepでPagesを含む行を抜き出しています。
そして最後にsedでページの数字だけが残るように加工します。

1. ページ数の総和を足し上げる際は
`$(())`を使わないと文字列の結合になってしまうので注意が必要です。

# 最後に
蔵書を自炊してPCに格納する場合、
管理が必要になります。
あり物のツールでもいいのですが、
独自のディレクトリ構造でファイルを大量に(300冊くらい)格納してしまっているので、
これからそれに合わせてツールの自作をすることが必要だと感じています。
その際やったことをこれからQiitaで報告していきたいと思うのでぜひご覧いただければと思います。