OmniAICreator/Qiita-1.07M huggingface dataset:
jqコマンドをでやりたいことをやるサンプル集

お仕事をしているとJSONを取り扱うことが良くあります。例えばAPIのレスポンスがJSONだったり、JSONファイルを取込んだりします。
そんなJSONを確認するためにちょっと加工したいこともよくあることです。
その時に便利なのがjqコマンドですが、使い方を忘れたとき用にサンプルやサイトのリンクを少しずつ書き溜めていきます。

# 参考になるサイト
- [jqコマンドをインストール](https://qiita.com/ponsuke0531/items/aa405a0f897cd0a78a8c)
- [RedmineのRest APIをcurlとjqで使ってみたサンプル - Qiita](https://qiita.com/ponsuke0531/items/ece54cd29c222b8ab250)
- [Kintoneのアプリのアクセス権をBashでCSV出力する方法 - 助っ人サービス for kintone](https://www.opentone.co.jp/kintone/archives/1810)
- [jqコマンドで文字化けした時の対応方法 - Qiita](https://qiita.com/ponsuke0531/items/ef006e89002a9b448163)
- [bashでjqを使ってJSONの配列をループさせる - Qiita](https://qiita.com/ryo0301/items/2ac9d11f355f1cf52ea5)
- [curlでQiitaOrganizationのユーザー一覧を取得する方法 - Qiita](https://qiita.com/chovin/items/3a4d7db6329286ea44e8)

# 配列の外と中の要素を並べてみたい
- やりたいこと : 配列の外にある「out」と配列の中にある「aryIn1」「aryIn2」の値をCSVで横に並べてみたい
  - イメージ : `"abcdefg","002","100"`

```json:sample.json
[
  {
    "out": "abcdefg",
    ...省略...
    "ary": [
      {
        "aryIn1": "002",
        "aryIn2": "100",
        ...省略...
      },
      {...省略...}
    ]
  },
  {...省略...}
]
```

- jqでやる方法
    1. 一番外側の配列を抜出す : `.[]`
    1. 「out」「ary配列」を抜き出してオブジェクトにする : `{out: .out, ary: .ary[]}`
    1. 「out」と「ary配列の中のaryIn1とaryIn2」を抜出て配列にする : `[.out, (.ary.aryIn1), (.ary.aryIn2)]`
    1. CSV形式にする : `@csv`
    1. (必要であれば)リダイレクトしてファイルへ出力する : ` > out.csv`

```bash:配列の外と中の要素を並べてみる
$ cat sample.json | jq -r '.[] | {out: .out, ary: .ary[]} | [.out, (.ary.aryIn1), (.ary.aryIn2)] | @csv'
"abcdefg","002","100"
"abcdefg","002","685"
"abcdefg","030","687"
"abcdefg","030","841"
"abcdefg","030","028"
"skrdfgu","030","687"
"skrdfgu","030","841"
"skrdfgu","030","028"
...
```
VIGOTECのペンプロッタでお絵かきしよう(Mac)

VIGOTECのペンプロッタ 公式ではWinのみ
Macで動かしたいんだが？


http://www.vigotec.cn


CNC.jsでいけた！
公式ページ

https://cnc.js.org

使い方


https://bbs.avalontech.jp/t/cncjs-cnc-g-code/507/2

### InkscapeでSVG→G-Code変換

svgを読み込む

**'エクステンション' - 'Gcodetools' - 'ツールライブラリ'**

gcode before path : (None)→M03 S250

gcode before path : (None)→M03 S75

penetration feed 100　に変更
![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202021-12-10%2020.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695931/6ec7ab27-0c36-6d8c-f339-b703c7bc97b9.png)

**'エクステンション' - 'Gcodetools' - '基点'**

任意のX座標に変更・パスを配置
![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202021-12-10%2020.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695931/47eadab1-f980-407d-f377-43fd39b3f1e4.png)

**'エクステンション' - 'Gcodetools' - 'パスからGCode'**

出力パス・保存先を指定、「パスからGcode」タブを開いた状態で適用
TypeORMの使い方を間違うとサーバーがハングアップする件

# はじめに

こんにちは、レバレジーズ株式会社 teratailチームリーダーの竹下です。

弊社では、サーバーをTypeScriptで実装しており、O/R MapperにはTypeORMを使用しています。
今回は、TypeORMの使い方を間違うと、サーバーが不定期にハングアップしてしまうという現象のご紹介です。
もし同じような現象が起きている方がいたら、ご参考になれば幸いです。

## 起きた現象

サーバーにはAWS Fargateを使っており、gRPCのサーバーとして立ち上がっているのですが、該当のサーバーが不定期に

1. CPUが張り付いた状態になるがヘルスチェックは正常なまま
1. 一定時間すぎるとOutOfMemoryでタスクが死ぬ
1. 自動で新しいタスクが立ち上がるが、1の状態にすぐなってしまう

ということが発生していました。深夜3時や4時などアクセスがほとんど無いようなときに発生していましたし、ヘルスチェックはタスクが死ぬまで正常なままですし、ログにも特にエラーが記録されていなかったので、調査が難航していました。

## 原因

一番の原因は、DBアクセスのコードでトランザクションを開始した中で更に新しくコネクションを取得しようとしていたことでした。そのコードによりハングアップ状態となり、サーバーで処理が全く行われないという状態になっていました。少し複雑な条件のため、ステップを踏んで説明していきたいと思います。

## 裏側で起きていたこと

実際の現象の裏では次のようなことが発生していました。

1. 原因となるコードが存在するAPI endpointにアクセスが集中(偶然 or クローラーなどがアクセスするページに存在)
1. ハングアップが発生し、リクエストをうけつけるが処理が途中で止まっているため、ログ等も出ずにレスポンスを永久に返さない状態に
1. リクエストがたまることでメモリ使用量が増えていき、メモリの限界まで来るとOutOfMemoryが発生しタスクが死ぬ
1. Fargateがタスクを新しく起動する

ということが繰り返される状態でした。

## ハングアップする条件

問題の発生は次の条件が重なったために起きていました

1. DBのTransaction内で更に新しいコネクションを取得しようとしているコードが存在する
1. ConnectionPoolを利用しており、プールにコネクションが残っていない場合に永久に(または長時間)ブロックする
1. 問題のあるコードが同時並列でConnectionPoolのmaxサイズ以上に実行される

なお、上記の条件を満たすだけでこのバグは発生するため、言語、フレームワーク関わらず発生する可能性があります。


### 問題のコード


```typescript:擬似コード
for(let i = 0;i < 10; i++) {
  startTransaction(async (tr) => {
    const conn = await getConnection() // <= ここが問題
  })
}
```

再現するサンプルコードを[githubのこちらのRepository](https://github.com/takezoux2/typeorm-stuck/blob/master/src/typeorm.ts)に用意しました。実際に動かしてみたい場合は、こちらをご参考に。

何をやっているかと言うと、
ConnecttionPoolののSizeを10としたときに、10並列でDBへのアクセスを発生させているのですが、それぞれのアクセスで
1. Transactionの開始
1. Transaction内で更に新しいコネクションを取得

だけのコードになっています。

通常だと10並列ぐらいなら何も問題なく終了するはずのコードですが、サンプルコードを実行するとログが途中で止まり一生終了しなくなります。
ハングアップは、[Transaction内で新しくコネクションを取得する部分](https://github.com/takezoux2/typeorm-stuck/blob/master/src/typeorm.ts#L35)で発生します。


### 何が起きているか更に詳しく

並列実行数を、コネクションプールのサイズより小さくした場合にはハングアップすることはありません。
つまり、
1. Transaction開始時に、ConnectionPoolから1 Connection取得
1. それが10並列されると10 Connection取得され、ConnectionPoolの残Connection数が0になる
1. Transaction内でさらにConnectionを取得しようとするが、ConnectionPoolにConnectionが残っていないため、そこでブロック

ということが発生してしまっています。この状態になってしまうと、ConnectionPoolからConnectionを取得する部分すべてでブロックされてしまい、ほぼすべての処理が止まるという状態になってしまいます。



## 解決策

### 恒久対応

*Transaction内で新しくConnectionを取得するコードを撲滅する*

これ一択です。

### 暫定対応

しかし、このようなコードは各所に散らばっており、修正してもレビューやリグレッションテストなども必要なので、適用までに時間がかかります。
なので、暫定対応もいくつか記載しておきます。

* ConnectionPoolでConnectionが取得出来ない場合に、比較的短時間でタイム・アウトするようにする
* ConnectionPoolの上限を非常に大きくしておく
  * アイドル時の維持するコネクション数の設定があるConnectionPoolならば、上限は大きくしておいても、そこまでパフォーマンスの影響は受けません
* サーバー台数を増やすし、ハングアップしたサーバーは再起動/停止する
  * 並列数が減ればこの現象は起きなくなるので、暫定対処としては十分だったりします
* ConnectionPoolの使用をやめる



## おまけ

### なぜヘルスチェックは通っていた？

gRPCの前にはNLB(Network load balancer)を置いているのですが、TCPの疎通チェックだけとなるためgRPCのAPIが叩かれていなかったため、ハングアップしていることを検知できていませんでした。
ALBのヘルスチェックはちゃんとgRPCを叩いてくれるのですが、デフォルトでは存在しないAPIを叩き、Unimplementedのエラーが帰ってくることでヘルスチェックをしているので、同様に検知は出来なかったかと思います。
Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Monitor」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure Monitor」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azureの管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)
◇対応するモジュール
[Azure Monitor について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-monitoring-tools-azure/4-describe-azure-monitor)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Service Health」](https://qiita.com/fsd-jume/items/a12c09ff82539c3ff8c2)

## Azure Monitor
**マルチクラウドリソースのデータを収集/分析/可視化し、結果に基づいて対応可能な監視サービス**

**◆監視可能なリソース**
・Azureリソース
・オンプレミスのリソース(エージェントのインストールが必要)
・他クラウド事業者におけるクラウドリソース(エージェントのインストールが必要)

**◆監視可能なレイヤー**
・アプリからOS、ネットワークまでのすべてのレイヤー

**◆収集可能なデータ**
・メトリック：特定の時点におけるシステムの何らかの側面を表す数値
例)CPUやメモリなどパフォーマンスに関連するものなど
例)ネットワークのトラフィック測定結果など
・ログ：システム内で発生したイベント
　-収集されたデータはLog Analyticsワークスペースに格納される

**◆収集したデータの使用例**
・リアルタイムや過去のパフォーマンスに関する詳細情報を表示可能
・ダッシュボードで概要レポートを表示可能
・Power BIとKustoのクエリを使用してカスタムビューの作成が可能
・データが条件を満たした際に、
　-SMSや電子メールで通知可能
　-自動スケーリング可能

### Azure Log Analytics
・収集したデータに対するログクエリの編集と実行で使用
・シンプルなクエリ/複雑なクエリとデータ解析をサポート
・一連のレコードを返すシンプルなクエリの記述後、レコードを並び替え、フィルター、分析可能
・より高度なクエリを作成して統計分析を実行し、結果をグラフで視覚化して特定の傾向を識別することも可能
・クエリ結果の対話的な操作や、他のAzure Monitor機能における使用の場合でも、クエリ結果の書き込みとテストのためのツールとして使用

### Azure Monitorアラート
・Azure Monitorでしきい値を超えたことが検出されたときに自動的に通知
・任意のメトリック/ログデータソースに対してアラートを生成可能
例)VMのCPU使用率が80%を超えたときに通知など
・アラートルールで条件を満たしているか判断し、満たしている場合はアラートがトリガーされ、アクショングループが開始
・アクショングループでは実行するアクションを設定
例)メールやSMS、プッシュ通知
例)Azure Functionsなど
・アラートがトリガーされたときに通知するため、Azure Monitor、Service Health、Azure Advisorで使用

### Application Insights
・様々な環境におけるWebアプリのパフォーマンスを監視する機能
・構成方法
　-アプリにSDKをインストール
　-Application Insightsエージェントを使用
・監視可能な情報
　-要求率、応答時間、失敗率
　-外部サービスによってパフォーマンスが遅くなっているかどうかを示す依存率、応答時間、エラー率
　-ユーザのブラウザから報告されるページビューと読み込みのパフォーマンス
　-レート、応答時間、エラー率が含まれるWebページからのAJAX呼び出し
　※AJAX(Asynchronous JavaScript + XML)：Webページを表示したまま一部分だけ情報を更新可能な仕組み
　-ユーザ数とセッション数
　-Windows/LinuxサーバのCPU、メモリ、ネットワーク使用率などのパフォーマンスカウンター
・アプリの使用が少ない期間中でも状態を監視可能

## 次の学習内容
**MS-LearnにおけるAZ-900の学習範囲は今回で終了です**

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
作りたいものにはどうやらReactが必要らしい。

<h1>環境開発でエラー頻発</h1>
みんなが通る面倒な開発環境でのエラー対処。QiitaやYoutubeで挙がっている「面白そうで作ってみたいもの」は大体Versionが低い。Nodejsをダウングレードしたり、package.jsonを書き換えて違うReactのVersionでやってみたりしたけれどやはりエラーが出てくるので、いったんそれらは無視してReactの基礎を学ぶことにした。

<h2>みんな大好き Progate React編の開幕</h2>
今日からReactの基礎をざっと学ぶ。Totalして20時間ぐらいReactを使って何かを作る動画を見漁ったので大体この構文や関数、Hooksが何を示すのかはわかってるつもり。早めに終わらせたい。
アップル公証対応その2（.ZIPの場合）

　その1は<a href="https://qiita.com/JunTajima/items/83e9da97b1aca0b5fd12" rel="noopener" target="_blank"><strong>こちら</strong></a>。今回はパッケージをpkg形式でなく.zip形式にするためのメモです。

<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">圧縮元の配布フォルダを作る</h3>
　署名を済ませたアプリおよびドキュメント類を入れた圧縮元の配布用フォルダを作ります。

<img src="http://densyodamasii.com/wp-content/uploads/2022/11/column90_01.png" alt="圧縮用フォルダの構成例" width="300" height="157" />

　なお、テスト時に.appファイルのみを入れた状態でZIPパッケージ化したところダウンロード時に.appの中身だけが展開されてしまってアプリとして実行できなくなる現象が見られたのですが、別ファイルを含めてパッケージ化することで回避できたようです。まあこれは圧縮方法の設定がどうこうというよりはブラウザがダウンロード後のファイルをどう扱うかという話のように思います。

</div>
<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">ZIPパッケージを作る</h3>
　ターミナルで以下のコマンドを使ってリソースフォークごとZIPパッケージ化します。アプリ本体の署名を済ませておくのはpkg形式と同様です。
 
<pre class="lang:sh decode:true " >ditto -ck --rsrc --sequesterRsrc "圧縮元フォルダのファイルパス" "圧縮後ZIPファイルのファイルパス"</pre> 

</div>
<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">ZIPパッケージに署名を行う</h3>
　ZIPパッケージに署名を行います。キーチェーンアクセスにDeveloper IDが登録されているのが前提です。
 
<pre class="lang:sh decode:true " >codesign --force --verify --verbose --sign "Developer ID Installer: 支給されたDeveloper ID" "圧縮後ZIPファイルのファイルパス" --deep --options runtime  --entitlements entitlements.plist --timestamp</pre> 

</div>
<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">アップルの公証サーバにアップロードして登録</h3>
　以下のコマンドを実行してアップルの公証サーバに登録します。pkg形式と同じです。App用パスワードについては前回記事を参照のこと。

 
<pre class="lang:sh decode:true " >xcrun altool --notarize-app --primary-bundle-id "xxx.xxxxxx.xxxxxxxxxxxxxxxxxx（id識別用リバースドメイン）" --username "AppleIDの登録名（メールアドレス）" --password 発行されたApp用パスワード --file "署名後のパッケージ.zip"</pre> 


　公証が通ったかの確認はpkg形式の場合と同様です。メールで通知が来るほかターミナルから確認することもできます。念のためにコマンドは以下。

 
<pre class="lang:sh decode:true " >xcrun altool --notarization-info xxxxxxx--xxxx-xxxx-xxxx-xxxxxxxxxxxx（ステータス照合用UUID） --username "AppleIDの登録名（メールアドレス）" --password 発行されたApp用パスワード</pre> 


　なお、アップルは公証の仕組みを切り替える予定のようで、現在altoolで公証を行うと新コマンドの<a href="https://applech2.com/archives/20220611-new-in-notarization-for-mac-apps.html" rel="noopener" target="_blank">notarytool</a>への移行案内メッセージが出ます。2023年秋には完全切り替えの予定の模様です。流れが速くてなかなかついて行くのが大変です。
</div>
Unityプロジェクトの外でコードを参照したくなった(Gitシンボリックリンク)

# はじめに
普段Unityを使っているのですが、Unityに依存したくないツール(C#)を作りたいときは、Assetsディレクトリの外にプロジェクトを作る必要があります。(同じリポジトリの管理下)
そのツールの中で、Unity側のコードを参照したいケースが出ました。
もちろん、UnityEngineに依存しているコードは使えないので、Util系などUnityに依存していないコードになります。
ファイルをそのままコピーしてもできますが、同じ内容の2重管理は良くないのでリンクさせたいと思いました。

そこで調べてみるとシンボリックリンクが使えそうでした。
環境はMacで書いています。

# gitのシンボリックリンクの設定
はじめに、gitのシンボリックリンクの設定をOnにする必要があります。

```
git config --global core.symlinks true
```

確認

```
git config --get core.symlinks
```

ローカルで設定されてしまっている場合は、オフ

```
git config --unset core.symlinks
```

# シンボリックリンクの手順
環境はMacで手順を書いていきます。
新しくリポジトリを作成したことを前提に記述します。

## リンク用するファイルの作成

```
touch file1.txt
```

```file1.txt
hello
```

## シンボリックリンク作成

```
mkdir sub
ln -s ../file1.txt sub/link.txt
```

元になるファイルは、作成するシンボリックリンクファイルから見た相対パスにする必要があります。

### 中身を確認

```
cat sub/link.txt
```

### 結果
```
hello
```

新しくリポジトリをクローンしても、同様の結果が得られました。
また、ファイルだけではなく、ディレクトリを指定するとその中身がすべてリンクされます。

# GitHub側では
ファイルのアイコンが変化し、中身はリンク先の相対パスになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/ffc1d8fb-ed0d-d998-7de2-c3d0ad3f4194.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/81d0c9f9-96e7-0434-63b0-eb03fa2c00fc.png)
Pleasanterサイトのゴミ箱を作る

# 前置き
Pleasanterでサイト構築の中で、とりあえずサイト作ってスクリプト組んでトライエラーを繰り返し、みたいなことやってると、動作確認検証用のサイトが無尽蔵に増えていきますせんか？（中の人はそうです）

こんな感じ↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/604f4326-ec6c-79c0-9074-9ba7d19b2cf0.png)


で、不要なサイト（複数）をまとめてきれいに消したいときは、
1. 適当なフォルダを作成
1. 作ったフォルダに不要なサイトを移動
1. フォルダごとサイト削除

ってやると思います。フォルダ配下はまとめて削除できるので楽っちゃ楽なんですが、それでも繰り返しやっていると面倒に感じてきます。

# そこで
サイトのごみ箱フォルダを作って、ごみ箱に格納したサイトをボタンクリックで削除するスクリプトを組んでみました。

作ったサイトはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/b1e1ab66-37c6-e126-edd6-d7a639f2ad60.png)
「ごみ箱を空にする」ボタンで、フォルダ内のサイトをすべて削除します。

# テーブル設定
なかなかマニアックな設定方法（？）、フォルダにスクリプトを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/6668bf9b-cf00-6547-a158-5ae484fcd918.png)

# 実装したスクリプト
#### ボタン追加
ごみ箱を空にするボタンを追加
```javascript
$(document).ready(function() {
    $('#MainCommands').append('<input type="button" class="button button-icon ui-button ui-corner-all ui-widget applied" id="submit" value="ごみ箱を空にする" class="btn" onclick="EmptyTrash()">');
});
```

#### サイト削除
ボタンクリックでサイトを削除するスクリプト
```javascript

//ボタンクリックで呼び出される関数
async function EmptyTrash() {
    let data = await ExecuteSql();
    DeleteSite(data.Response.Data.Table);
}

//ごみ箱フォルダ配下のサイト一覧を取得
async function ExecuteSql(){
    //APIから拡張SQLを実行、フォルダ配下に登録されているサイトのサイトIDを取得します --- ポイント①
    let id = Number($p.id());
    let data = {
        "ApiVersion": 1.1,        
        "Name": "GetSites",
         "Params": {
            "ParentId": id
        }
    }
    let uri = new URL(window.location.href);
    let url = `${uri.origin}/api/extended/sql`;
    let response = await fetch(url, {
        method: 'POST',
        body: JSON.stringify(data),
        headers: {
            'Content-Type': 'application/json'            
        },
    });
    return response.json();
};

//取得できたサイト一覧よりサイトを削除
function DeleteSite(table){
    for (let data of table) {
        //サイト削除APIでサイトを削除します。  --- ポイント②
        $p.apiDeleteSite({
            id:data.SiteId
        });
    };
    $p.setMessage('#Message', JSON.stringify({
         Css: 'alert-success',
         Text: 'ごみ箱を空にしました'
    }));
}
```

### 実装のポイント

#### ポイント①
今回の肝となるのが、フォルダ配下に登録されているサイト一覧を取得する方法。[APIから拡張SQLを実行する](https://pleasanter.org/manual/extended-sql-api)という機能を利用します。javascriptからAPIで拡張SQLを発行、フォルダ配下に登録されているサイトのサイトID一覧を取得します。

GetSites.json.sql
```sql
SELECT [SiteId]
FROM [Sites]
WHERE [ParentId] = @ParentId
```
※ParentIdが親サイトIDが設定されており、javascriptから自身のサイトID(=サイトごみ箱のサイトID)が渡されます。親サイトIDがごみ箱サイトのサイトIDと一致するもの ***(=サイトごみ箱に配置されているサイト)*** を取得対象としています。

GetSites.json
```json
{
    "Name": "GetSites",
    "Api": true
}
```
→マニュアルを参考に設定

これらをFetchでAPI発行、SQLを実行しています。

#### ポイント②
取得できたサイト一覧をループさせて、[$p.apiDeleteSite](https://pleasanter.org/manual/script-api-delete-site)でサイトを削除しています。

# おわりに
利用シーンはあまり多くは無いかもしれませんが、Pleasanter開発者にとってはちょっと便利になると思います。
HTMLコーディングで役立つGoogle拡張機能

# Google拡張機能
今まで活用しきれていなかったのですが、今回の案件でかなり使っているのでその中でも今後も有用に使えそうなものをご紹介します。
## HTMLチェッカー
### HTMLのタグミスなどを簡易チェックしてくれる拡張機能
単純なHTMLコーディングならそこまで発生しないが、テンプレート型やモジュール型でFWを使ってコーディングする場合は、抜け漏れをサクッと見れるのは便利でした。
細かいところまでは見れないので、HTML5の規約に沿ってコーディングすることは重要ですね。
## Perfect Pixel
### 実画面上に半透過状態の元画像を表示してくる拡張機能
LP作成などでPSDファイルからHTML化する際に使いました。
5px未満の誤差までしか許容しないなど特定の条件がある場合に、微調整や全体的なレイアウトの確認を行うのにちょうどよかったです。
如何にデザイナーさんがきれいに作ってくるかという外部リスクがあるので過信は禁物です。
## Alt & Meta　viewer
### 画像のAltやTitleのMetaを表示してくれる拡張機能
画像にAltの抜け漏れがないか直観的に画面上に表示してくれます。
toCのLPなどを作る際には画像表示できないことも考慮してもれなくAltメッセージは入れるべきですね。
【JavaScript】演算子「+」を理解したい

## 題材

**JavaScriptの「+」の用途**

なんか使い方が色々あるらしいですね……

## 単項プラス演算子

- オペランド(被演算子)の前につけて使う
- オペランドをNumber型に変換する。

```js
+"100" // 100
+"abc" // NaN
+true  // 1
+false // 0
+null  // 0
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Unary_plus

## 算術加算演算子

- 2項演算子
- 左右が両方Number型なら左右の値の和を生成
- そうでないなら、両方をStringに変換して連結文字列を生成

```js
12345 + 54321 // 66666
"abc" + "de"  // "abcde"
"DECO*" + 27  // "DECO*27" 片方がNumberでも両方がNumberでないなら文字列結合
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Addition

## インクリメント

- 1を足す
- 前置と後置で動作が変わる

```js
var x = 1;
var y = x++;
console.log([x,y]) // >>> [2,1]
```

```js
var x = 1;
var y = ++x;
console.log([x,y]) // >>> [2,2]
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Increment

---

## 遊び散らかしてみる

- `![]`が`false`、`!![]`がtrueなので、`+![]`が`0`、`+!![]`が`1`になる
- `(+!![]) + (+!![]) + (+!![]) + ……`と繰り返すことで任意の自然数を表せる

この調子でやっていくと`+![]()`の6種だけでJavaScriptのあらゆるコードがかけるらしい。("JSF\*\*k")
そのうちそれを別で記事にするかも。
Trailblazer Hoodieについて

こんにちは
本橋孝昭です

今回は　Trailblazer Hoodieをゲットする方法をご紹介します




## Trailblazer Hoodie とは

Salesforce のよく資料とかで見る人が来ている黒い服です。
つまり↓のことです

![motohashitakaaki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/96e8608b-9740-855b-91c8-a097e866a427.png)


## どうやってTrailblazer Hoodieをゲットするの？（キャンペーンに参加）


多くの場合、Salesforceのイベントやキャンペーンでゲットする方法がございます

過去（2019年）は
Rangerになって
Trailblazer Hoodieをゲットしよう！
というキャンペーンがありました
https://www.salesforce.com/jp/campaign/be-a-trailblazer/

このようなキャンペーンは定期的に開催しているので要チェックです

毎月開催されているキャンペーンとしては
Trailhead Questです

https://trailhead.salesforce.com/ja/quests#thquests-dreamquest

ここにある
Road to Ranger Quest
を見ると

Achieve Trailhead Ranger Rank between ○○ to enter for a chance to win³ a Trailblazer Hoodie (1 of 50). To get started, check out the Road to Ranger trailmixes.

と書いてあり

Trailblazer Hoodie (1/50) を獲得するチャンスがあることが分かります
見る人を想うアウトプット

この記事は『Qiita Advent Calender 2022』の『Qiita史上最多記録をつくろう！アウトプットはいいぞカレンダー』参加記事です。

---

## TL;DR.

- 対象が見たとき(見返したとき)に理解できるかどうかを気にかけよう

という自戒。

## 自分用の場合

- 自分がすでに持っていた知識は持っている前提で書いていい
    - が、ど忘れしそうだなと直感的に思ったら検索ワードくらいは登場させとくといいかも

『homebrewでvlc落とす』

## 他の人が見るかもしれない場合

- 多少日本語に気を使ったほうがいいかもしれない
- 専門性が高い知識は自分がすでに知っていても参考記事くらいはおいたほうがいいかもしれない
- コマンドや関数はある程度パクれるようにしといてもいいかもしれない

『ターミナルで`brew install vlc`』

## 他の人のために作る場合

- 説明文で変な日本語を書いて文章を破綻させない
- 自分が知ってる知識を相手が知っているとは限らない
- 相手の検索能力を過信しない
- コマンド一発でミスなく確実に済むならそのほうがむしろ説明しやすくて良いかも

『Launchpadからターミナルを探してクリックして開き、`brew install vlc`と入力してEnter』

## 共通

- でもアウトプットしないよりはしたほうが良い

ところで、この記事は自戒寄りなのでかなり適当ですね？
BigQuerySQLで上から2行目だけを取得するコード

## コード
- offsetで指定した行数分だけ飛ばします
- offset処理をした後にlimitします
```sql
select *
from table_name
order by column_name
limit 1
offset 1
```
## 参考文献
https://oss-db.jp/dojo/dojo_19
Databricks Feature Storeのコンセプト

[Feature Store concepts \| Databricks on AWS](https://docs.databricks.com/machine-learning/feature-store/concepts.html) [2022/9/23時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では、Databiricks Feature Storeと特徴量テーブルを使用する際に役立つコンセプトを説明します。

:::note
**注意**
現時点では、Feature StoreはUnity Catalogメタストアをサポートしていません。Unity Catalogが有効化されたワークスペースでは、特徴量テーブルはデフォルトのHiveメタストアにのみ書き込むことができます。
:::

# 特徴量テーブル

特徴量は特徴量テーブルに格納されます。それぞれの特徴量テーブルは[Deltaテーブル](https://qiita.com/taka_yayoi/items/345f503d5f8177084f24)と他のメタストアに格納されます。

特徴量テーブルには主キーが必要です。特徴量テーブルの特徴量は、多くの場合、一般的な計算関数で計算、更新されます。

特徴量テーブルのメタデータは、テーブルの生成元となるデータソース、テーブルを作成、更新したノートブック、ジョブを追跡します。

リアルタイム推論のために、特徴量テーブルを[オンラインストア](#オンラインストア)に公開することが可能です。

グルーピングと検索を容易にするために、[タグを作成](https://docs.databricks.com/machine-learning/feature-store/feature-tables.html#work-with-feature-table-tags)し、特徴量テーブルに関連づけることができます。

# オフラインストア

オフラインの特徴量ストアは特徴量の検索、モデルのトレーニング、バッチ推論に使用されます。これには[Deltaテーブル](https://qiita.com/taka_yayoi/items/345f503d5f8177084f24)の特徴量テーブルが含まれます。

# オンラインストア

オンライン特徴量ストアは、リアルタイム推論に用いられる低レーテンシーのデータベースです。Databricks Feature Storeがサポートしているオンラインストアについては、[Work with online stores](https://docs.databricks.com/machine-learning/feature-store/online-feature-stores.html)をご覧ください。

# ストリーミング

バッチ書き込みに加えて、Databricks Feature Storeはストリーミングをサポートします。ストリーミングのソースから特徴量を特徴量テーブルに書き込むことができ、特徴量の計算には生データのストリーミングを特徴量に変換するために[構造化ストリーミング](https://docs.databricks.com/spark/latest/structured-streaming/index.html)を活用できます。

オフラインストアの特徴量テーブルからオンラインストアにストリーミングすることも可能です。

# トレーニングセット

トレーニングセットは特徴量のリストと生のトレーニングデータ、ラベル、特徴量を検索するための主キーから構成されます。特徴量ストアから特徴量を抽出してトレーニングセットを作成し、モデルトレーニングの際の入力データにすることができます。

どのようにトレーニングを作成して利用するのかに関しては、[トレーニングデータセットの作成](https://qiita.com/taka_yayoi/items/c6785fc3c93c89a204f6#%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)を参照ください。

# モデルのパッケージング

Databricks Feature Storeの特徴量を用いてトレーニングした機械学習モデルは、特徴量との紐付けを維持します。推論を行う際にモデルが特徴量ストアから特徴量を取得することも可能です。モデルの呼び出し下は、モデルに使われた特徴量の主キー(例えば、`user_id`)を指定するだけで、モデルが特徴量ストアから必要な特徴量を取得します。

バッチ推論においては、オフラインストアから特徴量が取得され、スコアリングの前にデータと結合されます。リアルタイム推論においては、特徴量はオンラインストアから取得されます。

モデルを特徴量のメタデータとパッケージングするには、`FeatureStoreClient.log_model()`を使用します。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
VS Codeで.gitフォルダありフォルダを開いても「現在開いているフォルダーにはgitリポジトリがありません」になったら

管理者権限でgit cloneしてしまった疑いあり
(管理者権限で起動したコマンドプロンプト内でgit cloneしてしまった等)

非管理者権限でgit cloneし直せば治る
CloudFrontのキャッシュ削除をCLIでやる手順

CloudFrontのキャッシュ削除をCLIでやる手順をメモ

## 手順

```bash
# CloudFrontのディストリビューションIDを入手
aws cloudfront list-distributions --profile {profile} | jq '.DistributionList.Items[] | .Id + " " + .Aliases.Items[0]' -r
# 希望のディストリビューションIDとキャッシュ削除するパスを指定して作成
aws cloudfront create-invalidation --distribution-id {distribution id} --paths '{キャッシュ削除したいパス}' --profile {profile}
# キャッシュ削除結果を確認、前のコマンドンの結果のjson Invalidation.Id を {invalidation id} に指定する
aws cloudfront get-invalidation --id {invalidateion id} --distribution-id {distribution id} --profile {profile}
```
PL/SQLを業務で使うことがあったので簡単なまとめ

※使った範囲でひとまず

SQLを手続き型の処理で実行するためのOracleの仕組み。
MATERIALIZED VIEW を作るときに必要だったので、理解のため、備忘のために残します。
# 基本構造

```sql

DECLARE
/* 宣言部分（任意） */

BIGIN
/* 実行部分 */

EXCEPTION
/*  例外処理部分（任意）　*/

END;

```

- BIGINの中に **BIGIN-END;** をネストさせることは可能


```sql
DECLARE
/* 宣言部分（任意） */
BIGIN
   BIGIN
   /* 実行部分 */
   
   EXCEPTION
   /*  例外処理部分（任意）　*/
   END;
END;

```




# 要素


- BGIN
    - 処理の開始
    - Delphiにも似た構造がある
- END;
    - 処理の終了
    - **;** （セミコロン）必要
    - Delphiにも似た構造がある
- IF isHoge THEN hoge ELSE fuga END IF;
    - 分岐の記法

```sql
IF ishoge THEN 
   hoge
ELSE
   fuga
END IF;
```

- EXECUTE IMMEDIATE 
    - 動的SQLの実行

```sql
/* バインド変数なし */
BIGIN
   sql := 'select * from hoge';
   EXECUTE IMMEDIATE sql;
END;


/* バインド変数ari */
BIGIN
   sql := 'select * from hoge where fuga = :FUGA';
   fuga := '123';
   EXECUTE IMMEDIATE sql USING fuga;
END;

```


- RAISE
    - 常の実行を停止させ、例外ハンドラに制御を移す

```sql
BIGIN
   sql := 'select * from hoge';
   EXECUTE IMMEDIATE sql;
EXCEPTION
   RAISE <例外処理>;
END;
```
- OTHERS
    - 定義していない例外が発生しても適切に処理を正常終了させたい場合に利用

```sql
BIGIN
   sql := 'select * from hoge';
   EXECUTE IMMEDIATE sql;
EXCEPTION
   WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
          RAISE;
        END IF;
END;
```


# 小ネタ

- SQLCODE
    - エラーコードなどを履いている場合はこの変数？に入っているので比較演算子が使える。
    - EXCEPTIONなどで利用できる
- DBMS_OUTPUT.PUT_LINE
    - sqlplusなどで実行している場合にコンソールに出力できるログの記法
    - JavaScriptなら **console.log()** など
    - Javaなら **System.out.println()** など
- 代入
    - **:=** という記法


# 実践

**HOGE**, **BK_HOGE** というテーブルを **UNION** した **HOGE＿MVIEW** を生成したい

前提
- カラムは全く同じとする
- HOGEのバックアップ（累積）テーブルとしてBK_HOGEを利用している
- UNIONした情報を使ってselectしたい場合がある
- bk_flgというバックアップ時に１が立つカラムの状態によってUNIONする

```sql
BEGIN
    BEGIN
      EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW HOGE_MVIEW';
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -12003 THEN
          /* 12003はMATERIALIZED VIEW　が存在しない場合のエラーコード*/
          RAISE;
        END IF;
    END;
    
    EXECUTE IMMEDIATE 'create materialized view HOGE_MVIEW REFRESH FORCE AS 
        SELECT * FROM HOGE WHERE bk_fkg= 0
        UNION
        SELECT * FROM BK_HOGE WHERE bk_fkg= 1';
    
END;
```



# 最後に

知りたてほやほやなので間違い等のご指摘は喜びます。

# 参考ドキュメント

一部です

https://www.oraexcel.com/oracle-11gR1-ORA-12003/lang-jp

https://www.prgkop.com/plsql-primer6/

https://www.shift-the-oracle.com/plsql/exception/raise.html

https://atmarkit.itmedia.co.jp/ait/articles/1909/18/news008.html

http://oracle.se-free.com/plsql/d6_raise.html

https://docs.oracle.com/cd/E57425_01/121/ZZPRE/GUID-76CDB6B6-EED8-4DFE-8DBF-C864028F38F1.htm

https://sql-oracle.com/?p=1468

https://www.ashisuto.co.jp/tech-note/article/20170414_oracle.html
paiza.ioでelixir その59

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

# 練習問題
qiita apiを叩いて、タイトル一覧を取得せよ。

# サンプルコード

```
:inets.start
:ssl.start

{:ok, {_status, _headers, body}} = :httpc.request('https://qiita.com/api/v2/items?query=elixir')

body = IO.iodata_to_binary(body)
body = String.replace(body, "\\u003c", "<")
body = String.replace(body, "\\u003e", ">")
Regex.scan(~r/title\":\"(.+?)\",\"updated_at/, body)
|> Enum.map(fn [_, v] -> 
    IO.puts(v)
end)


```

# 実行結果

```
paiza.ioでelixir その58
paiza.ioでelixir その57
Elixirでmatch_specを使ってETS検索
paiza.ioでelixir その56
paiza.ioでelixir その55
AxonでResNet18を我流でやってみた【設計者編】
OptionParserでElixirスクリプトの引数を解析
paiza.ioでelixir その54
Elixir Axon で学ぶ機械学習 (Livebook)
Elixirで気軽にスクリプト
paiza.ioでelixir その53
paiza.ioでelixir その52
paiza.ioでelixir その50
Phoenix 1.7.0-rc.0 を楽しむ（Elixir）
Elixirで気軽にpersistent_termを使う
Elixir Nx の基礎 (Livebook)
paiza.ioでelixir その49
paiza.ioでelixir その48
paiza.ioでelixir その47
paiza.ioでelixir その46
```

# 成果物


https://paiza.io/projects/BY1EQh4-CpR2T-pkmnJOqA?language=elixir

以上。
【Powershell】フォルダ内のpdfを連結させる方法

# フォルダ内のpdfを連結させる方法

複数のpdfファイルをすぐにマージしたいとき、以下の1行で名前順に結合することができる。
フォルダ内のファイルを全て、pdftkの引数に渡しています。
※pdftkをinstallする必要があります。

https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

```
user/
　└ document/
           ├ 1.pdf
           ├ 2.pdf
           ├ 3.pdf
           ├ 4.pdf
           ├ 5.pdf 
```

```powershell:powershell
$string=''; Get-ChildItem -File *.pdf| ForEach-Object { $string +=  $_.name + ' ' } | Invoke-Expression "pdftk $string output output.pdf"
```
※実行後、連結されない場合は、以下のコマンドを実行すると連結されるかも
```powershell:powershell
Invoke-Expression "pdftk $string output output.pdf"
```

## まとめ
このような作業を時間をかけずサクッとできれば、業務効率改善につながると思う。
AS/400(IBM i)のJAVAは遅いのか？

いまだに時々（今日またｗ）なんですが、

「IBM i（AS/400）てJava遅いんですか」

と聞かれることがあります。遅いと理解しています、という感じなんですが。

これ、三つ子の魂百まで、と似てて、確かにOS/400 V3,V4+POWER5以前はそれもしょうがないなあ、という感じではありました。その辺をポイント絞ってまとめます。

## かつてAS/400 JAVAが遅かった理由
・POWER5までは同時代のインテルCPUのクロック数の約1/2程度だったこと（1多重同士でベンチすると間違いなく遅い）
・OS/400は最初からJDKが64ビットだったが、WINDOWSは32ビットだった
・JAVAの実装がSUN JAVA準拠だった（他社の一般的なJDKより厳格な仕様で安定性は高かったが重かった）

100多重でベンチする機会より数多重位でベンチする方が圧倒的に多かったですからAS/400が遅いというのはまああったわけです。それでも100多重等でベンチするとWINDOWSより速かった(当時からSMT4など多重化処理は速かった）んですけどね。

## 今、IBM i JAVAが速い理由
・CPUクロックが速くなった。インテル比でクロック数は対等以上でしょう。
・コア性能もPOWER6以降、前モデル比で+30～40%くらいずつ速くなってますし。インテルはほとんど変わってないと思うのでPOWER頑張ってると思う。
・JDKが他のプラットフォームと共通の一般的なJAVA実装に変わった 軽い
・PASE上（AIXランタイム環境）でJAVA稼働するようになりAIXと完全に共通化されより速くなった
＊32ビットJAVAを後追いでサポートした。今やWINDOWSも64ビットが標準ですがｗ。IBM i は32/64ビット両方１つのOS上で同時に動きます
・SMT8で多重処理がさらに速くなった

こんなところでしょうか。

## SpecJBB
SpecJBBでも2010年代中盤頃まではAIXとほぼ同等～▲10%位で業界最速級でした。最近はAIXがすごく速くなっちまって敵わないけど他社よりは速いはずです。最近ちょっと調べてないので後で調べてみます。

■2022/11/16追記
Specjbbのスコアを調べてみました。長くなったので下記に分割しました
https://qiita.com/gomAnomalocaris/items/ccaeeefeb0e91eee9438
RxJava3でデバッグ時によく使う機能

# 初めに
今回はRxJava3を使った開発でとく使われる関数を紹介していこうと思います
### 本文
***error***
こちらは、文字通りわざとエラーを吐かせたい時に使います。
下記が実際にエラーを吐かせるときの例です
```kotlin
override fun api(): Single<Hoge> {
    return Single.error(createHttpException(500))
}
private fun createHttpException(errorCode: Int) = HttpException(
    Response.error<Hoge>(
        errorCode, "".toResponseBody("plain/text".toMediaTypeOrNull())
    )
)
```
***just***
次に紹介するのが、返却物に仮のデータを入れることができる時に使う`just`です。
これを使うと手元で欲しいデータを作ることができるので、わざわざその通信の`Mock`を作る必要がなくなります。
下記が例です
```kotlin
override fun api(): Single<Hoges> {
    return Single.just(
        Hoges(
            emptyList()
        )
    )
}
```
### 最後に
自分は`coroutine`を今までメインで触ってきたので、最近触った`RxJava3`の便利な機能をまとめてみました。
何かのお役に立てれば幸いです
AWS CLI の使い方メモ（windows）

# インストール方法
1. AWS 公式から [AWS CLI MSI インストーラ](https://awscli.amazonaws.com/AWSCLIV2.msi) をダウンロード
1. ダウンロードしたインストーラを実行して端末にインストールする
1. インストール後にコマンドプロンプトで以下を実行し、インストールできたか確認する
```
$ aws --version
aws-cli/2.8.10 Python/3.9.11 Windows/10 exe/AMD64 prompt/off
```
# 設定
以下の方法でユーザ情報を設定する
```
$ aws configure
AWS Access Key ID [None]: {アクセスキー}
AWS Secret Access Key [None]: {シークレットアクセスキー}
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
# 使い方
* 指定したインスタンスIDで取得できるメトリクスの一覧を表示
```
$ aws cloudwatch list-metrics --namespace AWS/EC2 --dimensions Name=InstanceId,Value=i-xxxxxxxxxxxxxxxxx 
```
* CPUUtilization を指定した期間（+9時間）、5分間の粒度、指定したインスタンスID、平均値をタブ区切りでファイルに出力する方法
```
$ aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --start-time yyyy-mm-ddTHH:MM:SS+09 --end-time yyyy-mm-ddTHH:MM:SS+09 --period 300 --dimensions Name=InstanceId,Value=i-xxxxxxxxxxxxxxxxx --statistics Average --output table > log.txt
```
# 参考
* [AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)
devcontainerの構築を試してみた

# はじめに

現在弊社で参画しているプロジェクトでdevcontainerを用いた開発に感動したため、
自分で1から構築してみた備忘録として執筆した。


# devcontainerとは
コンテナ技術であるDockerは言語のバージョンや設定をコードベースで統一することができるものの、
各開発者間でのコードエディターの設定を統一することまではできなかった。

例えばある開発者が保存時にフォーマッタを自動で適用する設定にしている一方で、別の開発者がその設定を行っていない場合にはソースコードの変更時に意図していない部分での変更が起こってしまう可能性がある。

そんなエディター同士の設定を統一することができるのがdevcontainerである。
devcontainerを用いることでインストールするVSCodeの拡張機能やワークスペースの設定値もコンテナ内にコードベースで定義することが可能となる。

つまりVSCodeの拡張機能を含めた環境を含めたコンテナを作成し、そのコンテナ中で開発することでエディタの設定を統一して開発することが可能となる。

なので新規参入者が入る度に推奨する拡張機能を一つ一つインストールして、追加設定をして、、、という手間を一気に削減できるすごい技術である。


参考）
https://code.visualstudio.com/docs/remote/containers#_trusting-your-workspace

https://code.visualstudio.com/docs/remote/containers-tutorial

# 実際に使ってみた
例としてGoとMySQLのAPIサーバーを構築した。


作成方法はかんたん3ステップ
1. Dev Containers: Try a Dev Container Sample.. でGoの環境を作成
1. 作成したDockerfileをビルドするdokcer-compose.yamlファイルを作成
1. 共通設定の対象を.vscode/setting.json に記述
（今回はファイル末尾に改行を自動挿入、行末の半角スペースを削除を追加）

ここから **Dev Containers: Reopen in Container** でVSCodeがコンテナに接続してコンテナ上でファイルを編集できます。

サンプルのソースコード
https://github.com/tsukasaI/go_devcontainer


# 番外編 Goコードの解説

```go:main.go
package main

import (
	"database/sql"
	"fmt"
	"net/http"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	openDB()
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8001", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello World")
}

func openDB() {
	_, err := sql.Open("mysql", "go_db:go_db@/go_db")
	if err != nil {
		panic(err)
	}
	fmt.Println("DB opend")
}
```

今回はコンテナで起動したMySQLサーバーに接続し、成功したらターミナルで`"DB opend"`を出力し
localhost:8001にアクセスすると`"Hello World"`とレスポンスが返ってくるプログラムを作成した。

docker-composeのvolumeでローカルPCでチーム開発している方に是非使ってほしい。
VisualStudio2022をアップデートしたら、プロジェクトが開けないし、新規作成もできなくなった

# はじめに
VisualStudio2022を`17.4.0`にアップデートしたら、下記のようなエラーメッセージが出てプロジェクトが開けなくなった。

```
xxxxx.csproj : error  : SDK リゾルバー エラー: "SDK "Microsoft.NET.Sdk.Web" を解決しようとしているときに、SDK リゾルバー "Microsoft.DotNet.MSBuildSdkResolver" に失敗しました。
例外: "Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadManifestCompositionException: マニフェスト 'microsoft.net.workload.mono.toolchain' [C:\Program Files\dotnet\sdk-manifests\7.0.100\microsoft.net.workload.mono.toolchain\WorkloadManifest.json] 内のワークロード定義 'wasm-tools' が、マニフェスト 'microsoft.net.workload.mono.toolchain.net7' [C:\Program Files\dotnet\sdk-manifests\7.0.100\microsoft.net.workload.mono.toolchain.net7\WorkloadManifest.json] と競合しています
```

また、プロジェクトの新規作成もできなくなった。新規作成すると、（ファイル自体はいろいろ作成されてるのに、）空っぽのソリューションしか開かない。


# 解決

.net7のpreview版をインストールしてるとこうなるようなので、**.net7のpreview版をアンインストールすべし！**
![2022111323201821_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/e44d6e37-9421-17be-e3e4-3ab0ed75a58c.png)


なお、エラーの直接的な原因は、`C:\Program Files\dotnet\sdk-manifests\7.0.100`の中がこうなっていること。
![2022111010313500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/4549bc08-a5d3-a94e-064b-166fa8804ebd.png)

`microsoft.net.workload.emscripten`と`microsoft.net.workload.mono.toolchain`の中身が、`.net7`がついてるやつの中身と競合してるっぽい。
無印のフォルダはpreview版をインストールしたときに作成され、`.net7`のフォルダは新しいやつ。

手動でこの2つのフォルダを削除しても、エラーが起きなくなる。まぁ、ちゃんとアンインストールした方がよさそう。
手動で削除しちゃった場合でも、後でpreview版をアンインストールしてとどめを刺しても大丈夫。
AWSIOT: AWS CLI で トピックにパブリッシュ

次のバージョンで確認しました。

```bash
$ aws --version
aws-cli/2.7.35 Python/3.9.11 Linux/5.19.0-23-generic exe/x86_64.ubuntu.22 prompt/off
```

## エンドポイントの調べ方

```bash
aws iot describe-endpoint --endpoint-type iot:Data-ATS
```

```text
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "b987ceh026tlxq-ats.iot.ap-northeast-1.amazonaws.com"
}

```

## トピックの調べ方

```bash
aws iot list-topic-rules
```

topicPattern です。

```text
"topicPattern": "test/topica"
```

## パブリッシュするスクリプト

```bash:publish.sh
ENDPOINT="b987ceh026tlxq-ats.iot.ap-northeast-1.amazonaws.com"
HOST="https://"${ENDPOINT}
TOPIC="test/topica"
#
aws iot-data publish --cli-binary-format raw-in-base64-out \
	--topic $TOPIC --qos 1 --payload '{"x": 37, "y":47, "z": 1027}' \
	--endpoint-url $HOST
```

## 結果の確認

MQTT テストクライアント　で確認できます。
AWS IoT -> MQTT test client

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/25fae126-92e2-c0f0-bf32-d1d218ded4c7.png)
現役インフラエンジニアがAWS Certified Cloud Practitioner(CLF-C01) を受けた話

# きっかけ

急に受けてみたくなったので受けてみました。
さらっと合格できたので社内/社外向け備忘録レビューを書きます。

# 受けた人のスペック

受けた人はこんなスペックです。
2-3時間程度勉強したら合格しました。

- 新卒2年目インフラ/NWエンジニア
- おうちでESXiやルータを愛でている
- AWSの実務経験1年
    - 高可用性のあるWebインフラをつくったことがある
    - DirectConnectやDirectryService、ClientVPNも触ったことある

# 受験に必要なこと

- 試験をピアソンVUEで予約すること

これ一択です。後に引けなくなりますし1か月後くらいまでできるのでお勧めです。

# 思ったこと（個人の感想）

AWS用語クイズのような内容でしたがAWSをお客様に提案していく上ではとても重要な資格に感じました。
クラウドを一緒に提案するプランナーさんが持っているととても嬉しいなと思いました。
大学生の方はITパスポートと一緒に持っておくといいのかなと思いました。


# 思ったこと（試験内容）

## できたこと

EC2やS3、ALBなどAWS肝になる機能はよくできました。
こればAWSのサービスクイズくらいに思ってもらえば大丈夫です。
たまによくわからないカタカナ（AWS語）が出てきますのでそれは対策サイトで学びましょう。
CCNAのCisco語的な何かを感じました。

> おうちでESXiやルータを愛でている

これを書いた理由ですが、家で仮想化基盤を運用しているのとAWSにおいておくことのメリットデメリットが分かっていると解ける問題が結構あったので書きました。

## できなかったこと

普段はあまり使わないコスト管理回りや、監査系の得点率が低かったです。
合格ラインが7割くらいといわれていますが、ここをある程度理解しておかないと足元をすくわれます。
読書だけではなく、**実際にコンパネを触ってみて** こんな機能かと理解するのが一番いいのかなと思いました。


# 使った教材

結構有料サイトを使う人は多いですが、このサイトだけでカバーできました。
似た問題が良く出てきました。AWSわからない人は少し本を読んで、**課金されない程度にコンパネ触って**みたらいいと思います。

https://aws-exam.net/clf/

# 予約の導線

自分の会社がAWSパートナーであればAPNアカウントでのログインがおすすめです。
パートナーアカウントでログインすると会社のパートナーレベルに2日ほどで反映されるのでみんなに喜ばれます。

# おわりに

AWSをやっている人からすると簡単な試験でしたが必要な知識はかなり網羅できている資格でした。
みなさん受けましょう。
C言語のライブラリ周りの基礎用語メモ

C言語ライブラリ周辺の名前がややこしくてよくわからないので調べたときのメモ。

### `libc`

標準Cライブラリ。
C言語の標準規格で定められた、型・マクロ・関数の集合からなるライブラリ。

### `glibc`
「GNU Project」による標準Cライブラリ「`libc`」の実装。

### `llvm-libc`
LLVMプロジェクトによる標準Cライブラリ「`libc`」の実装。


### `GCC`
`GCC`, the GNU Compiler Collection https://gcc.gnu.org/

* GCC 11.2 released [2021-07-28] 最新
* GCC 10.3 released [2021-04-08] 
  * Debian::bullseyeのパッケージ依存 
    * `gcc-10`, 
      * dep: `libstdc++6`(GNU 標準 C++ ライブラリ v3)
        * dep: `libc6` (GNU C ライブラリ: 共有ライブラリ)

### `Clang`

_Clang is an "[LLVM](https://llvm.org/) native" C/C++/Objective-C compiler_

* Debian::bullseyeのパッケージ依存
  * `clang-11`
    * dep: `libstdc++6`(LLVMではなく、GNUの標準C++ライブラリがデフォルト)
      * dep: `libc6` 
  * `libc++-11-dev`: (clangとは依存関係がなく、デフォルトではインストールされない)
    * dep: `libc++1-11` LLVM C++ Standard library
      * dep: `libc6`

### `C++ABI`

例外やRTTIや名前マングリングといったC++の低級層のABIを提供するライブラリ

* `libsupc++`: GCCによるC++ABI実装
* `libc++abi`: LLVMによるC++ABI実装

### `libstdc++`

GNU標準C++ライブラリ

* GPLv3(>4.2)
* `__gnu_cxx` Namespace
  * https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01125.html
* https://gcc.gnu.org/onlinedocs/libstdc++/manual/source_organization.html

### `libc++`

LLVM標準C++ライブラリ

* BSD
* https://releases.llvm.org/11.1.0/projects/libcxx/docs/index.html


## おわり

わからないことだらけだ。
paiza.ioでelixir その57

# 概要
paiza.ioでelixirやってみた。
Regex.scan使ってみた。

# サンプルコード

```
Regex.scan(~r/foo([0-9])/, "foo1 foo2")
|> IO.inspect

Regex.scan(~r/c(d|e)/, "abcd abce")
|> IO.inspect

Regex.scan(~r{o+}i, "foo fooooo!")
|> IO.inspect
Regex.scan(~r{o+}i, "foo fooooo!", return: :index)
|> IO.inspect

Regex.scan(~r/c(?:d|e)/, "abcd abce")
|> IO.inspect

html = "<html><span>ok</span></html>"
Regex.scan(~r/(.*?>)([^&<]+)(<\/span>)/s, html, capture: :all_but_first)
|> Enum.map_reduce(0, fn [l, c, r], acc ->
	c =	c
		|> String.split()
		|> Enum.with_index()
		|> Enum.map(fn {char, index} -> 
		    "<span id='CHAR-#{index + acc}'>#{char}</span>"
		end)
	{[l, c, r], acc + length(c)}
end)
|> elem(0)
|> IO.puts()

Regex.scan(~r/A(.+?)C/, "A0bCA1bCA2bCA3bCA4bC")
|> IO.inspect
|> Enum.map(fn [_, v] -> 
    IO.puts(v)
end)



```

# 実行結果

```
[["foo1", "1"], ["foo2", "2"]]
[["cd", "d"], ["ce", "e"]]
[["oo"], ["ooooo"]]
[[{1, 2}], [{5, 5}]]
[["cd"], ["ce"]]
<html><span><span id='CHAR-0'>ok</span></span>
[["A0bC", "0b"], ["A1bC", "1b"], ["A2bC", "2b"], ["A3bC", "3b"], ["A4bC", "4b"]]
0b
1b
2b
3b
4b
```

# 成果物


https://paiza.io/projects/AH4aWPUZC745yVwQO3_U1A?language=elixir

以上。
Vue Jest Error: Not implemented: navigation の対策 [document.createElementの場合]

# 問題

```
Error: Not implemented: navigation
```

jestで使用される jsdom はナビゲーションをサポートしていないため
window.location.href などを実行すると、このメッセージが表示される

### エラーを起こすコード(例)

クリックでファイルをダウンロードするコード

**component**
```javascript
download(fileId) {
  const url = `https://hogehoge.com/{fileId}`;
  const link = document.createElement('a');
  link.id = 'downloadFileLink';
  link.href = url;
  link.download = url;
  link.click();
}

```

**jest**
```javascript
test('ダウンロード後完了メッセージが表示される', async () => {
  wrapper = mount(component, {
    store,
    vuetify,
    localVue,
  });

  // クリック
  wrapper.find(sel('downloadBtn')).trigger('click');

  // Promise処理待ち
  await flushPromises();

  // ダウンロード完了メッセージ確認
  expect(wrapper.find(sel('downloadText')).text()).toEqual('Downloaded');
});


```

# 解決方法

```javascript
function makeAnchor(target) {
  return {
    target,
    setAttribute: jest.fn((key, value) => (target[key] = value)),
    click: jest.fn(() => {}),
    remove: jest.fn(() => {}),
  };
}
const anchor = makeAnchor({href: '#', download: ''});
const createElementMock = jest.spyOn(document, 'createElement').mockReturnValueOnce(anchor);

/**
 * - window.location.hrefを起こすアクション
 */

// 終わったらMockをrestore
createElementMock.mockRestore();
```

**[回避したいこと]**
createElement で作る aタグのイベント click で  
window.location.href　が実行されておきるエラー

**[手順]**
1. clickのイベントをmockしたオブジェクトを作る
1. [1] のオブジェクトでcreateElementのmockを作る
1. createElementをspyOnしてmockしたものを渡す
1. window.location.href　は実行されない

# 余談

window.locationをmockする方法はたくさんあったが  
直接 window.location をmockしても意味がなかった

document.createElementで作成したもの自体をmockしなければ
clickイベントの window.locationイベントのエラーを回避できなかった
[React] とんち問答

ここで挙げるものについて、必ずしも"良い実装である"とは言えません。
様々なReactべからずをいかにして掻い潜るか、とんちの利いた実装に感じられて面白かったので記事にしました。
ここに掲載したものは以下のリポジトリに置いてあります。
https://github.com/na2na-p/react-with-japanese-tonchi


# 子から親に値が渡る(ように見える)
例えば
1. 親でuseStateする
1. 子にsetter渡す
1. 子で渡されたsetterを実行する


子は直接は親の値書き換えてませんよね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/31a3fd5d-062d-5520-3fcc-57b2ed6b625f.png)

# 特定の条件を満たすまではHookを発火させない
例えば
1. 特定の条件を満たすまで呼んでほしくないHookだけフラグメントのみ返すコンポーネントに実装する。
1. 特定条件満たしたら該当のコンポーネントを出す。


これならコンポーネントを呼び出すたびに呼ばれるHookの数は変わりませんよね？
例えば、クエリを飛ばしたいけど値が入るまでは待ってほしいときなんかに使えるかと思います。（けど、どう考えてもクエリ飛ばすブツのほうを改修すべきな気がする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/42f9ac70-7690-857d-b930-8a3de8ca8375.png)


# おわりに

多分まで増えるかと思いますがいったんこのあたりで。
C++例外処理入門メモ

# C++例外処理
https://learn.microsoft.com/en-us/cpp/cpp/errors-and-exception-handling-modern-cpp?view=msvc-170
こちらを参考に例外処理について学習したときのメモ。


## 基本

- try (statement) 実行中発生するエラーを補足するブロックを定義する
- throw (keyword) 問題を検知した際にエラーを投げる
- catch (statement) tryブロックでエラーが発生した際に実行されるブロックを定義する

```cpp
try {
    throw (1);
} catch (int error_number) {
    std::cout << "error: " << error_number << std::endl;
}
```

throw された型が不明な場合、Three dotsで何でもCatchできる。
```cpp
try {
    throw unknowtype;
} catch(...) {
    // do something
}
```


## Best Practices

#### throwするエラーは<stdexcept>ヘッダの標準exceptionを使用するべきである。

```cpp
try {
    throw std::runtime_error("something wrong");
} catch (std::exception& e) {
    std::cout << e.what() << std::endl;
}
```

※[例外を`catch`する際は、値ではなく参照で`catch`する](https://qiita.com/ysti/items/67ba8a2c6389fadc2feb#comment-16ea73ff4625977c5b83)

#### 発生すべきでないエラーはassertを使うべし

```cpp
void f(int x) {
  // パラメータxは、正数でなければならない
  assert(x >= 0);
}
```

#### `C++11`で非推奨とされた例外指定を使用しない

[動的例外指定](https://ja.cppreference.com/w/cpp/language/except_spec)は`C++11`で非推奨になった。
[](https://qiita.com/ysti/items/67ba8a2c6389fadc2feb#comment-1dbc4f414f97a3adeaf4)

## まとめ

マイクロソフトのドキュメントは神。
ありがたい。

--- 

## Special thanks

ご指摘ありがとうございます！　感謝！

- @yaito3014 
- @Nabetani
Google Cloud Vision APIの推論時間を計測してみた

# 目的
Googleが提供している画像推論用API（Cloud Vision API）を試してみました。推論時間のベンチマークがぱっとでてこなかったので、実力をみるとともに推論にかかる時間を計測してみました。

# 結果
使用したAPI:[Object Localization](https://cloud.google.com/vision/docs/object-localizer)

|  画像サイズ[pix]  |  推論時間[ms]  |
| ---- | ---- |
|  640x480  |  788  |
|  320x240  |  337  |

もっと何秒もかかるのかと思っていたが、結構早い。ローカルのプラットフォームに依存するものはないとは思いますが、M1 Mac miniスクリプトを動かしました。

# コード
APIの初期設定：[始める前に](https://cloud.google.com/vision/docs/before-you-begin)

以下のコードで、PCに接続されているWebカメラから画像を取得して、Cloud Vision APIを呼びます。後半で人がいる部分にボックスを書いて表示してますが、やらなくてもよい。上記の推論時間は response = client.object_localization(image=vision_image) にかかる時間です。

``` python:googleVisionApiTest.py
import cv2
from google.cloud import vision
import time

def main():
    client = vision.ImageAnnotatorClient()

    # 画像取得
    start = time.perf_counter()
    capture = cv2.VideoCapture(0)
    ret, capture_img = capture.read()
    resize_img = cv2.resize(capture_img, dsize=None, fx=0.25, fy=0.25) # 320x240
    # resize_img = cv2.resize(capture_img, dsize=None, fx=0.5, fy=0.5)  #640x480
    height, width = resize_img.shape[:2]
    print(f'{width}, {height}')

    # 画像変換
    _, num_bytes = cv2.imencode('.jpeg', resize_img)
    num_bytes = num_bytes.tobytes()
    vision_image = vision.Image(content=num_bytes)
    end = time.perf_counter()
    print(f'Get Image[ms]: {((end-start) * 1000)}')    

    # Google Vision API実行
    start = time.perf_counter()
    response = client.object_localization(image=vision_image)
    end = time.perf_counter()
    print(f'Get Response[ms]: {((end-start) * 1000)}')    
    labels = response.localized_object_annotations

    disp_img = resize_img

    # 人を検出した場所にボックスを書いて表示
    for object_ in labels:
        if(object_.name == 'Person'):
            x1 = 1.0
            y1 = 1.0
            x2 = 0.0
            y2 = 0.0
            print(f'confidence: {object_.score}')
            for vertex in object_.bounding_poly.normalized_vertices:
                print(f'X:{vertex.x}, Y:{vertex.y}')
                if(vertex.x < x1):
                    x1 = vertex.x
                if(vertex.x > x2):
                    x2 = vertex.x
                if(vertex.y < y1):
                    y1 = vertex.y
                if(vertex.y > y2):
                    y2 = vertex.y
                
            x1_ = int(x1 * width + 0.5)
            x2_ = int(x2 * width + 0.5)
            y1_ = int(y1 * height + 0.5)
            y2_ = int(y2 * height + 0.5)

            print(x1_, y1_, x2_, y2_)

            disp_img = cv2.rectangle(disp_img, (x1_, y1_), (x2_, y2_), (0, 255, 255), 2)
    
    cv2.imshow("Person Detection", disp_img)

    while True:
        key = cv2.waitKey(10)
        if key == 27: # ESC 
            break

if __name__ == "__main__":
    main()
```

# 所感
画像サイズによって時間は変わりますが、これはなかなかの応答時間だと感じました。アクセス量によって料金がかかるみたいなので、システムは慎重に組む必要がありますが、高精度なAIモデルと強靭な推論リソースから生み出される検出結果は驚くべきものがあります。これを使うことで、手軽に高精度なAIアプリケーションを作れる気がしました。監視カメラとかこれでいいんじゃないかな、ダメかな。
十進BASICについて、調べてみた。

https://hp.vector.co.jp/authors/VA008683/index.htm

https://hp.vector.co.jp/authors/VA008683/english/index.htm

「整数小数で1000桁まで計算してくれるので，」だ
そうです。

# 参考

Python3の整数int型に最大値はない（上限なし）

https://note.nkmk.me/python-int-max-value/

Full BASIC系（規格準拠）＜

https://ja.wikipedia.org/wiki/BASIC#%E7%8F%BE%E5%9C%A8%E8%B2%A9%E5%A3%B2%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A7%E5%8B%95%E3%81%8FBASIC
エンジニア向け：CTO目線のこんな企業に転職しては駄目だTOP５ その１　CTOが居ない

CTOとして20年、CTO10社、技術顧問20社以上の森川目線でのこんな企業に転職しては駄目ランキングをまとめてみました！

もちろんエンジニア向けです。

# １．CTOが居ない
　これ一番駄目ですね。CTOが居ない会社って、社長が営業系の方で技術とか開発とか関係なしに先ずは売上、利益という会社が多いです。

　エンジニア採用に関しても、人を人財として見ておらず、ただのツールとして見てる人が多いです。

　一番ベストは、役員CTOがいる事です。経営にCTOが口を出せる事。

　これは技術や開発面に関して正しいジャッジが出来るだけでなく、経営に関して論理的なジャッジが出来る会社がどうかという点もあります。

 　そして一番危険なのがCTOがコロコロと変わってる企業もヤバいです。ネット企業としてCTOが大事だとは分かっていながら、CTOを雇うけど、折り合わずCTOがドンドンやめていってる状態です。特にこの手の会社はCTOへの給与オファーも高く、良いイメージを出してきます。しかし入ってもスグに無理難題を押し付けられたり、言ってる事がコロコロと変わったり、エンジニアを人財として扱わない事によりCTOが病んでしまって退職していってるパターンがあります。

　転職する際には、CTOがいるか役員CTOがいるか、そしてCTOがコロコロ変わってないかのチェックをしてみて下さい。

[CTO目線のこんな企業に転職しては駄目だTOP５ その１　CTOが居ない](https://qiita.com/k1morikawa@github/items/eb6ae4e10883b5203be4)
[CTO目線のこんな企業に転職しては駄目だTOP５ その２ CTOがエンジニア出身でない](https://qiita.com/k1morikawa@github/items/4f6ae4f94bdfa543b256)
[CTO目線のこんな企業に転職しては駄目だTOP５ その3　新卒エンジニアを取ってない](https://qiita.com/k1morikawa@github/items/65b2c2b40cb973945d7a)
[CTO目線のこんな企業に転職しては駄目だTOP５ その４　副業を許してない](https://qiita.com/k1morikawa@github/items/3cc4036ec600e1ad0cc8)
[CTO目線のこんな企業に転職しては駄目だTOP５ その５　管理者（CTO、VPoE、EM）が忙しすぎる](https://qiita.com/k1morikawa@github/items/c57ea172001705304264)
イラストAI活用のパーティーゲーム

昨今、画像生成系AIが沢山無料、オープンソースで出てきてます。

Midjourney、DALL・E2、Stable Diffusion」等

その画像生成系AIの活用事例としての一つとしてのパーティーゲームです。

画像生成AIを使って共通のお題でイラストを描くが、実は一人だけお題を知らない。プレイヤーは誰がお題を把握せず参加しているか探し出すゲーム。

僕には思いつかない。。発想が素晴らしいと思います！

楽しそうです。

https://www.itmedia.co.jp/news/articles/2211/04/news082.html
Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Service Health」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure Service Health」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azureの管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)
◇対応するモジュール
[Azure Service Health について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-monitoring-tools-azure/3-describe-azure-service-health)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Advisor」](https://qiita.com/fsd-jume/items/f2aaa99ac29eaaadbba5)

## Azure Service Health
**デプロイされている特定のリソースとAzure全体の状態や最新情報を確認可能**
※最新情報：サービスに影響するイベント、計画的なメンテナンス、可用性に影響する変更など
・履歴アラートが保存され、情報を後から確認可能
・イベントの影響を受けた時のためにサポートへのリンクを用意

### Azure Service Healthの3つのサービス
**◆Azureの状態**
・すべてのリージョンにおける全Azureサービスの正常性を確認可能
⇒広範囲に影響を与えるインシデントの確認に最適

**◆Service Health**
・使用しているAzureサービスとリージョンの正常性を確認可能
⇒使用中のサービスに影響を及ぼすお知らせの確認に最適
・アラートを設定して、サービスの問題や計画メンテナンスなどサービスに影響する可能性がある場合に通知も可能

**◆Resource Health**
・使用している個々のリソースの正常性を確認可能
⇒使用しているリソース単位の確認に最適
・Azure Monitorを使用することで、リソースの可用性が変動した際にアラートを通知可能

## 次の学習内容
**◆Azure Monitor**

https://qiita.com/fsd-jume/items/c94cf04a5e63016bd438

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
AWSハンズオン_１_IAMの１_EC2からS3へアクセスするロールを作って、接続する


AWSの初心者のさとしです
ハンズオンで勉強メモとして投稿いたします。
ご覧になったみんなさんにお役に立てればうれしいです
※：間違うところがあれば、ご指摘していただければ幸いです


EC2からS３へアクセスするロールを作る手順は下記です
１，S3へアクセスポリシーを作る
２，ロールを作る（１のポリシー）
３，EC2を起動して、ロールを付与する
４，teraTermでEC2へ接続して、S3を接続する

それでは、始まります
１，S3へアクセスポリシーを作る
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/f8afdd9f-013d-336e-8f12-960ae3e1939f.png)
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/f30e5859-256a-6e58-59ca-791440a53c1f.png)
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/6371cf85-3fdc-4140-09a6-2dca120dab37.png)
作成したポリシーを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/d66fa023-fd18-80e7-e0a9-0ea77e2e0886.png)


２，ロールを作る（１のポリシー）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/c963a69f-973f-9bfd-3970-70de31e46aa2.png)

![screencapture-us-east-1-console-aws-amazon-iamv2-home-2022-11-06-21_36_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/16920596-f66e-ca33-2027-193f9eb30bef.png)

![screencapture-us-east-1-console-aws-amazon-iamv2-home-2022-11-06-21_37_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/ec2cc026-3d29-bb9c-ea54-049bb4134fa5.png)

![screencapture-us-east-1-console-aws-amazon-iamv2-home-2022-11-06-21_39_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/f9873083-6e80-55a0-7f05-1fa107d2f625.png)

![screencapture-us-east-1-console-aws-amazon-iamv2-home-2022-11-06-21_40_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/595185f0-dab6-3466-94f7-7083194a9c89.png)

３，EC2を起動して、ロールを付与する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/a4ca53c6-49d8-5765-b93b-d7869a3149a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/e9763559-0ef6-8c15-4bd5-1805912e7f0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/1364b9a0-b99b-c32c-0efa-98e1eafe2b4d.png)

teraTermを起動して、S３へアクセスできるかを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/b24f0b93-f694-73eb-caf7-09f84eac7021.png)

下記のコマンドを打つと、エラーがなければ、接続できることが確認できました
※今の時点でS3にバケットはまだありませんので、何も表示されなくてもOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/8709c7a1-097a-5c16-8940-feaee1a2d0b6.png)

今回のハンズオンが終わりました。
自分の勉強メモとして、どんどん記載しておきます。