OmniAICreator/Qiita-1.07M huggingface dataset:
ループ処理時の結合セルの注意点

## はじめに
PythonでExcelを操作できるopenpyxlを使用して，全行・全列のループ処理時の結合セルの扱いについての注意点，備忘録です．

## 動作環境
- Python 3.12.0
- openpyxl 3.1.2

openpyxlはpipを使用してインストールできます．
```
pip install openpyxl
```

## 問題点
サンプルとして，下図の表を扱う場合を考えます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617469/1a0b987d-8130-c746-502a-c616af586345.png)

B列の「A/B」欄を全て（B2~B12）"A"に変更したい場合，結合セルを考慮せずに記述すると以下のようになります．
最大行の取り方は「[openpyxlでExcelの最終行を取得する際に気を付けること](https://qiita.com/suipy/items/89dfb42c4d7388cc0f76)」を参考．
```python
import openpyxl as px

excelFile = r"C:\Book1.xlsx"
wb = px.load_workbook(excelFile)
ws = wb.worksheets[0]

max = ws.max_row
for i in range(2, max+1):
    ws.cell(row = i, column = 2).value = "A"

wb.save(excelFile)
wb.close()
```
上記のスクリプトを実行すると，次の```AttributeError```が発生します．
```python
AttributeError: 'MergedCell' object attribute 'value' is read-only
```
エラーコードを読んでわかる通り，MergedCell（結合セル）型のvalue属性は読み出し専用であって書き込みはできません．

サンプルの表では，B5,6 と B10,11 が結合されており，そこに表示されている値を持っているのは B5 と B10 のセルであり，B6 と B11 ではありません．

セルを結合すると，結合した範囲の左上のセル以外のすべてのセルがワークシートから削除されます．結合されたセルの境界情報を保持するため，結合されたセルの境界セルは```None```の値を持つ結合セル（今回の例ではB6,B11）として作成されます．B列をループで出力すると次のようになります．

```
2 A
3 A
4 A
5 A
6 None
7 A
8 B
9 B
10 B
11 None
12 B
```

ここで，ループ処理によって "B6，B11のセルの値を書き換える" というコードが実行された場合，上述の設計上，```read-only```なのは自然な動きだと思います．

## 解決策
結合セルの判定を追加して，```AttributeError```を回避します．

```python
import openpyxl as px

excelFile = r"C:\Book1.xlsx"
wb = px.load_workbook(excelFile)
ws = wb.worksheets[0]

max = ws.max_row
for i in range(2, max+1):
    typeCell = isinstance(ws.cell(row = i, column = 2), px.cell.cell.MergedCell)
    if not typeCell:
        ws.cell(row = i, column = 2).value = "A"

wb.save(excelFile)
wb.close()
```
```isinstance```関数でセルがMergedCell型か判定し，```typeCell```にはBool値（True / False）が格納されます．
```not```演算子を使用することで，条件分岐では書き換え可能なセル（```typeCell == False```）のみ，処理を行うことができます．
なんだかPCの通信が悪いから可視化してみた話

この記事は[Splunk Advent Calendar 2023](https://qiita.com/advent-calendar/2023/splunk) 18日目です。


11日目にこんな記事を書いてます。

https://qiita.com/symmr/items/ac73e2f9cae26e02478d


実際にこれで色々データ拾ってみたよ、というお話が本日です。


## ネットワーク通信遅い問題

ありますよね。
自分のPCもそうですし、PC管理者の人がユーザーから「遅いんだけど！」と問い合わせもらったときにどう調査したらいいか、何かしらの調査ツールが必要だったり、なかなか悩みどころかと思います。



## Splunkで結構データ取れます

UFでAdd-onだったりコマンドプロンプトを使って結構取れます。

### Add-on系
- [Splunk Add-on for Microsoft Windows](https://splunkbase.splunk.com/app/742)
WinNetMon (Windows Network Monitor) でネットワークアクティビティが取れます。これで、PCからどこ宛ての通信を行っているか可視化できます。
inputs.confで以下のようにすればOK。
```text: inputs.conf (WinNetMon)
[WinNetMon://inbound]
direction = inbound
disabled = 0

[WinNetMon://outbound]
direction = outbound
disabled = 0
```
通信状況を全て取得するのでPCへの負荷が高かったり、データサイズが大きいので注意。詳細は[こちら](https://docs.splunk.com/Documentation/SplunkCloud/latest/Data/MonitorWindowsnetworkinformation)。

また、WifiアダプタのイベントをWindows Eventから取得するには以下。

```text:inputs.conf (Wifiアダプタイベント)
[WinEventLog://Microsoft-Windows-WLAN-AutoConfig/Operational]
disabled = 0
start_from = oldest
current_only = 0
checkpointInterval = 5
renderXml=true
```


- [Speedtest Addon for Windows](https://splunkbase.splunk.com/app/5398)
[Speedtest.net](https://www.speedtest.net/)が提供しているコマンドを実行し、Download/Upload速度をチェックできます。
このAdd-onを解凍すれば分かりますが、`speedtest_ta_windows\bin`に`speedtest.exe`がぽつんと置いてあり、inputs.confでこのように指定しています。
```text:inputs.conf
[script://.\bin\speedtest.exe --format=json --accept-license --accept-gdpr]
interval = 0 */1 * * * 
index = speedtest
disable = false
```
これでコマンドプロンプトでexe実行した標準出力結果をSplunkに送れるんですね。


### コマンドプロンプト系
- Wifi通信状況
以下コマンドを実行すればWifiのシグナル強度、受信/送信速度（Mbps）が取得できます。
`netsh wlan show interfaces`

適当なバッチファイルを.\binに作って
```text: バッチファイル例
@echo off
chcp 65001 >nul
netsh wlan show interfaces
```

inputs.confで呼び出せばOKです。
```text: inputs.conf例
[script://.\bin\wifi.bat]
interval = 60
sourcetype = wifi
disabled = 0
```

- ファイルダウンロードテスト
speedtestはちょっと負荷的に重い場合、[OVHCloud](https://proof.ovh.net/files/)などが提供しているダウンロードテスト用ファイルを使わせてもらうのも手です。
curlしつついい感じに整形します。
`curl -s -o NUL -w "Download speed: %{speed_download} bytes/sec\nTotal time: %{time_total} seconds" https://proof.ovh.net/files/1Mb.dat`

- tracert
昔ながらの方法。途中経路で遅延が大きい個所がないか確認します。
`tracert /4 www.google.com`


## ダッシュボード作ってみた

後は取得できたデータを可視化するだけです。
例えばこんな感じです。

スピードテストの結果とかネットワーク使用状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/c379ccfb-a81a-eeb4-23ae-a8cbb1da2eee.png)

Wifi状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/432d68a3-ed91-7d8e-b51e-222516128785.png)

Tracert分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/402dea85-1c69-b994-33dc-4cfdd149b523.png)



なんか遅いなーと思ったとき、シグナル強度が弱かったり、強度は問題ないけどWifiルーター側のスループットが悪かったりとか、理由が分かるようになって面白いです。


## まとめ

UF使ってコマンドプロンプトとかPowershellの実行結果も取れるんだよ！の一つのお話でした。
色々情報取れるUF＆結果を雑に投げても加工・統計処理できるSplunkであれば、活用の幅はめちゃくちゃ広いですね。
ngx-scannerを使った時に苦労したこと

# はじめに
Angularでngx-scannerを使ってQRを読み取るアプリケーションを作りました。
これをiPadで起動してみると、インカメを使いたいのに背面カメラが起動してしまいました。
CSSもうまくきかず、苦労したので忘れないようにメモを残します( ..)φメモメモ

# iPadで背面カメラが起動してしまう

iPadのOSは17.2です。執筆時最新です。

参考にしたサイトに助けられました。
使用できるカメラがMediaDeviceInfoの配列の中に入ってくるのですが、起動時はこの配列の最後に入っているカメラが選ばれてしまうみたいです。

iOS17.2では配列の最後は背面カメラでした。

```html
<zxing-scanner [(device)]="currentDevice" (camerasFound)="onCamerasFound($event)" (autostarted)="onAutoStarted()"></zxing-scanner>
```

```typescript
availableDevices: MediaDeviceInfo[] = [];
currentDevice: MediaDeviceInfo | undefined;

onCamerasFound(result: MediaDeviceInfo[]): void {
    this.availableDevices = result;
}

onAutoStarted(): void {
    for (let i = 0; i < this.availableDevices.length; i++) {
      const device = this.availableDevices?.[i];
      if (device.kind === 'videoinput' && device.label.includes('前面カメラ')) {
        this.currentDevice = device;
      }
    }
  }
```

`camerasFound`
デバイスで使用できるカメラをリストで表示してくれる。

`autoStarted`
スキャナが自動起動されたときにイベントが走る。

console.logをすることでiPadのカメラのラベルを調べたところ、インカメは「前面カメラ」となっていました。
(外側のカメラは「背面カメラ」)

参考サイト

https://blog.officekoma.co.jp/2021/12/angularngx-scanner.html

# cssが効かない
ngx-scannerのカメラの表示される部分(?)のサイズを変える方法がわからずに苦労しました。
videoタグのスタイルをいじればいいというところまでたどり着くもうまくいかず…
stack overflowを見て辿り着いた答えは「!important」という禁じ手でした…。本当はたぶんもっといい方法がある…と思われる…。
(::ng-deepは書き方が悪かったのかもしれないが、効かなかった)

```scss
video {
    width: 100%;
    height: 550px !important;
    object-fit: contain;
}
```

参考サイト

https://stackoverflow.com/questions/65144271/zxing-scanner-resize-to-full-height-with-angular

# おわりに
Mac普段使わないので、iPadのデバック苦労した🤪
ALBとEIPの関係

## そもそもEIPとは？
Elastic IP アドレスは、動的なクラウドコンピューティングのために設計された静的 IPv4 アドレスです。Elastic IP アドレスはユーザーの AWS アカウントに割り当てられ、リリースするまでユーザーのアドレスになります。Elastic IP アドレスを使用すると、アドレスをアカウント内の別のインスタンスに迅速に再マッピングすることで、インスタンスやソフトウェアの障害をマスクできます。（AWS公式より抜粋）

参考： https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

## ALBでのEIPの利用について
ALBのプライベートIPを固定し、利用したいところですが時間経過でIPが変更されるため残念ながらALBのIPを固定することはできません。しかし、ALBのIPを間接的に固定する方法を以下の2つ紹介します。

## 方法１：Global Acceleratorを使って固定IP化する

### ココがすごい！
①エニーキャストな固定IPであり、地理的に一番近いロケーションにルーティングされる。これはIPを2つ持つのではなく
2つの固定IPが、各エッジローケションにアナウンスされ、ユーザーは意識せずに一番近いロケーションにルーティングされる
⇒片方のネットワークの疎通が出来なくなった場合は、別のネットワークに切り替わり再接続できるため、冗長化されています

②固定IPのため、ALBやDNSのラウンドロビンで受けるDNSキャッシュの影響を受けなくなるためフェイルオーバーに強くなる

③2つの固定IPが割り当てられ、1つのIPネットワークが中断した場合は、別のネットワークゾーンから固定IPが復活する

④ヘルスチェック機能があり、継続的にアプリケーションを監視する

### ヘルスチェック
ヘルスチェックは、Global AcceleratorとALB 両方で行われます。
・Global Acceleratorはリージョンレベルの通信に特化しているため、リージョンレベルでのヘルスチェック
・ALBはリージョン内のヘルスチェック 
のイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2360194/c6e94934-25d1-9119-7190-a7c06d2d0a55.png)


## 方法２：ALBの前段にNLBを構築する
-ALBの前段にグローバルIPアドレスを固定したNLBを配置する。
→NLBはプライベートIPの固定ができる
トレンドデザイン2024

今年もやってきました。
アドベントカレンダーの季節・・・かれこれ記事を書くのも3回目。
どんどん年齢を重ねてくのがきついきつい。
10代の時には流行を追いかけ雑誌を読み漁り、スマホも最新のものが欲しい！なんて言ってたり
前職では音楽の流行を追いかけて流行の最先端を行く！みたいな仕事をしてたりもしていたのですがいつの間にやら流行に乗ることができなくなってきました。

とはいえデザイナーたるもの常に新しい技術を見につけ流行にも敏感でないといけません。それに気持ちだけでも若くいたい！
というわけで今回は現在トレンドとなっているデザイン、2024年に流行るだろうと言われてるサイトデザインを紹介していきたいと思います。

## トレンドデザイン2024


### ■モバイル特化型デザイン
こちらは今に始まったことではないですがモバイルユーザーが増える一方ということでモバイルユーザーを意識したデザインが増えています。
レスポンシブなんかはずっと言われてきてるのですが、今年はPCで見てもモバイルサイトを体験してるようなデザインが増えてきました。
#### 例になるサイト
https://www.lucua.jp/special/xmas2023/#cake
https://www.globalwork.jp/women/holidaygift2023/
https://neko2.co/winterholidays/


### ■モーションアンドインタラクティブ
こちらは動画のような演出をおこなうデザインのことで昔はサイトが重くなる！という理由から避けられガチだったのですが
5Gが普及しつつある近年では注目を集めてるだとか。
#### 例になるサイト
https://www.wakabayashi.co.jp/project/hitotoki/
https://tenku-jp.com/
https://www.net-marketing.co.jp/

### ■イマーシブコンテンツ

イマーシブ（immersive）という言葉通り、ユーザーに「没入」体験を提供するようなコンテンツです。
ユーザーのアクションに反応したり、ゲームのような没入感を体験させたりするサイトが増えてきています。
#### 例になるサイト
https://www.greenwichpeninsula.co.uk/paperpeninsula/
https://town.kaonavi.jp/
https://www.sbs.com.au/theboat/

### ■Y2Kデザインの再評価

Y2Kというのは今から20年前の2000年代初頭に流行した、または主流だったトレンドを現代に取り入れたスタイルになります。
「ネオンカラー」「カラーグラデーション」「抽象的な形状」「ポップ感」「ピクセルアート」のようなイメージです。
2024年には90年代から2000年代初頭にかけてのデザインスタイルである「Y2K」が再評価され、Web制作の世界に戻ってくることが予想されてるようです。
#### 例になるサイト
https://www.attentive.com/holiday
https://lottie.london/products/lottie-london-eye-gems-twinkle-in-your-eye?variant=40767546163243
https://recruit-tokyu-agc.co.jp/2024/


いかがだったでしょうか？
なんでもかんでも流行の波に乗れば良い！と言うものでもなさそうですね！（当たり前）
あくまで参考として上記を取り入れながら楽しくデザイン制作ができれば良いなと思います。

それでは皆さん楽しいデザイナーライフを。
また来年お会いしましょう！
【Unity】ノーコードでサイコロアプリを作ってみる（StateGraph）

# これはなに？

Unity初心者がサイコロアプリを作るまでの過程をまとめた記事になります
アセット以外のところは、ビジュアルスクリプティングを利用して作成したいと思います

# 作ってみる
今回、作っていくのはコチラ

- `StateGraph`を作成する
    - 状態を作成する
    - 切り替え条件を作成する

https://docs.unity3d.com/ja/Packages/com.unity.visualscripting%401.8/manual/vs-state-graphs-intro.html

## StateGraphを作成する

State(状態)ごとに処理を切り分けることができます
今回はサイコロを`振る前`・`振っている最中`・`振った後`の状態に分けました
**各状態**と**状態と状態の間の切り替わる条件**に処理を書くことができます

![stategraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/d0f9e4bd-85e6-d86d-f95e-7445f76962e8.png)

### 各状態

-  振る前
    - 特になし
- 振っている最中
    - 出目の結果の非表示
    - ダイスをふる
- 振った後
    - 出目の結果を表示
    - 履歴を表示
    - 統計を表示

### 状態と状態の間の切り替わる条件

#### 振る前 > 振っている最中

- 画面(ボタン)を押したら遷移する
    - `ButtonDiceRoll`オブジェクトについては次回説明
    - オブジェクトがタップされて離したときに状態が切り替わります

![state1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/2c758c6e-bf9e-01c6-43bf-547c1a0eea07.png)

#### 振っている最中 > 振った後

- サイコロが止まった状態になったら遷移する
    - `Dice Get Rolling`ノードがFalseになったとき状態が切り替わります

![staet2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/2dbe54b9-8579-5665-62ad-4758bd8601a0.png)

#### 振った後 > 振る前

- 2秒たったら遷移する
    - `Cooldown`ノードを利用します
        - Durationに設定した時間経過したら状態が切り替わります

![state3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/25796c1e-3d35-127a-e56c-c92296ae0b5d.png)

# さいごに

今回は状態についての説明でしたが、状態があることで処理が分断されて不具合が起きにくい状態を作ることができました

# 連載記事

https://qiita.com/acronhub/items/a46c6f5c16c4d262728c

https://qiita.com/acronhub/items/ccbdda267de28730d68e

https://qiita.com/acronhub/items/25d626d7ae2956942735

https://qiita.com/acronhub/items/7fa83565ffdd05576605

https://qiita.com/acronhub/items/7c3a39d384c0b6ea277c

https://qiita.com/acronhub/items/c273a54507b07a5937e3
一人アドベントカレンダーを支える技術

# はじめに
全ての武器をお箸にしろ、[にわのわ](https://twitter.com/niwa_nowa)です。
今回のアドベントカレンダーを走るにあたって、もろもろ良かったコンテンツをまとめていきます。

# ネタ探し
- twitter
王道。
情報の揮発性が高い。

- Amazon Web Services ブログ

https://aws.amazon.com/jp/blogs/news/

英語記事の方が速報性が高いので主にこちらをウォッチしています。

https://aws.amazon.com/new/?nc1=h_ls&whats-new-content-all.sort-by=item.additionalFields.postDateTime&whats-new-content-all.sort-order=desc&awsf.whats-new-categories=*all

- Open AI Blog
DevDayからウォッチしています。

https://openai.com/blog

- The GitHub Blog
- 
https://github.blog/

# Tools
- Qiita CLI
markdownで記事を書ける＋VS Codeで書けるのは最高

https://blog.qiita.com/release-qiita-cli-general/

- ScreenToGif
Gif作るのマジで楽

https://www.screentogif.com/

- ウェブページ全体をスクリーンショット - FireShot - Chrome ウェブストア
クリップボードにコピーできて便利

https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg/related?hl=ja

# その他
- Y1000
めっちゃ寝れる。
多分悪い魔女はリンゴではなくこれを渡していた。

https://www.yakult.co.jp/yakult1000/

- YouTube Music
音楽を爆音で鳴らしながらタイピングすると気持ちがいい
人生においてかなりコスパのいいサブスクをしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/b0cebfaa-fb60-2ae5-cb51-a05d86289c6e.png)
価値観シェアワークのすすめ

HRBrain Advent Calendar 2023 カレンダーの21日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain

## はじめに
こんにちは。
株式会社HRBrainで労務サービスのプロダクトマネージャーをしています @Moou0820 です。
少し前の話になりますが、チームのコミュニケーションを向上する為に行った価値観カードを使ったワークについて書こうと思います。

## ワークのきっかけ
私自身、入社して半年経ち仕事にも慣れてきたタイミングで、新卒の配属や新しいメンバーの入れ替わりがあり、改めて2023年を乗り切る強いチームにする為に何かしたいと考えていました。
そんな中、全社で「[ドラッカー風エクササイズ](https://times.hrbrain.co.jp/entry/2021/12/14/the-drucker-exercise)」をやる流れがありましたのでそのアイスブレイク的な位置づけで開催しました。

## 使ったツール（カード）
今回使用したカードはオンラインでもできる「[wevox valueCard](https://wevox.io/valuescard/)」になります。
前職でもコロナ禍に1度オンラインで使用させて頂いた経緯があり、その時もワーク的には盛り上がり成果を感じられたのですが、次回機会があれば絶対にオフラインで顔を見ながらワイワイ開催したいと心に決めていたので迷わずカードを選択しました。


### バリューズカードとは
簡単に説明すると、数あるカードの中から自分の価値観にあったカードを選別していき最後残った5枚を共有することで相互理解を深めるカードゲームです。

ポイントは「相手が捨てたカードを拾える」ことです。
誰に取って何が重要で何が不要なのか、また誰かが捨てた「価値観」を重要だと思うメンバーが居る、価値観が違うことが当たり前でそれを理解したうえで深い関係性を構築できるワークだと思います。


https://wevox.io/valuescard/

※詳しく知りたい方はこちらから

## 実際に開催してみた
テーマは「自分が仕事する上で大事にしている価値観」と設定し、人数は8人と利用人数の最大数で実施しました。

まず、全員にカードを5枚づつ配ります。
配られた瞬間から、メンバーの普段の仕事のやり取りではわからない表情や性格を垣間見ることができました。
配られた手札に書いてある言葉の定義をまず考える人、人のカードが気になる人、山札から引き当てるカードも手持ちもどちらも捨てれずに迷う人、、終始会話もはずみ和やかな空気で進行していきました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982495/713d11ac-8f7a-d728-cb15-4623ff2527bb.jpeg">

またカードが揃うにつれて自分でも気づいていなかった価値観を再認識することができたし、メンバーが捨てるカードを見て意外性にびっくりすることもあり、この人はこうだろうという固定観念にとらわれていた事にも気付かされました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982495/d23c1bc3-0b04-030c-7629-bba997edf96a.jpeg">


## まとめ
軽い気持ちで行ったワークではありましたが、新しいメンバーとの一体感を早いタイミングで構築でき、その後に続く「ドラッカー風エクササイズ」でも心理的安全性が向上したことで相手への期待値や自分の価値観等の言語化がスムーズに行えたと思います。
新しいプロダクトの発足時、期の始まり、新年を迎えるこのタイミングで改めてメンバー内での価値観を共有し理解を深めてみるのはいかがでしょうか？

最後まで読んで頂きありがとうございました。
素敵なクリスマスをお過ごしください ☆＊*

HRBrainでは引き続き仲間を募集しております。詳細は下記からご確認ください。

https://www.hrbrain.co.jp/recruit
Raspberry Pi OS Liteにデスクトップ環境をインストールする２つの方法

# はじめに
　Raspberry Pi OS Liteでデスクトップ環境を使えるようにするための手順をまとめました。
※こちらのサイトを参考にさせていただきました。

https://raspberrytips.com/upgrade-raspbian-lite-to-desktop/

## `tasksel`コマンドを利用する
　参考にさせていただいたサイトに載っている方法です。
```shell
sudo tasksel
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/3c5ccf3c-d73b-6800-5f28-727375e34770.png)
　インストールしたいデスクトップ環境にスペースキーでチェックを入れて、「了解」を選択します。

## コマンドでインストールする
### PIXEL Desktop（いつもの環境）
![Screenshot from 2023-12-18 16-19-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/3e6dc5dc-3833-3a8a-5419-158e190d637b.png)
```shell
sudo apt -y install raspberrypi-ui-mods
```

### MATE
```shell
sudo apt -y install mate-desktop-environment-core
```

### KDE
```shell
sudo apt -y install kde-plasma-desktop
```

### XFCE
```shell
sudo apt -y install xfce4
```

### LXDE
```shell
sudo apt -y install lxde-core
```

### LightDM（ディスプレイマネージャー）
　比較的軽量なディスプレイマネージャーです。
```shell
sudo apt -y install lightdm
```

### デスクトップ環境から起動するように設定する
　以下のコマンドで設定画面を開き、設定を変更します。
```shell
sudo raspi-config
```
![スクリーンショット 2023-12-18 161316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/5d49b572-a811-52d7-d2f7-81e3ac8e7ec8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/6758feec-9d3f-e271-90ac-1cdec34c8f90.png)
![スクリーンショット 2023-12-18 161350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/97d0036e-0d44-2342-9df8-cf061b8db391.png)
![スクリーンショット 2023-12-18 161401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/0c2e4692-229a-de32-a899-1b8fa1da9110.png)
　最後に再起動します。

## おわりに
　Raspberry Pi OS Liteに手動でデスクトップ環境をインストールすると余計なソフトがインストールされないので「サーバー運用したいけど、ちょっとだけデスクトップ環境から触りたい」みたいなニーズにぴったりだと思います。これからもニッチな記事を書いていきたいと思います。
![Screenshot from 2023-12-18 16-22-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/a3dc7a31-78f1-771d-18f3-7350d045a2a4.png)
　初期インストールされているアプリが少ないですね。
serverspecをコンテナに格納してお手軽インフラテスト自動化 #STIG #PCI-DSS #CISベンチマーク

## まとめ

InSpecコマンドとテストコードをコンテナイメージに入れて、いつでもどこでもインフラテストを実行できるようにします。

:::note warn
Docker Hubで公開されているchef/inspecは、CPUアーキテクチャのARM対応していないなど不具合が発生しがちなので、Dockerfileで自前でInSpecコンテナを用意するのが近道です。
:::


## Dockerfile

```
FROM ubuntu

# Mixlib-install gem で InSpecをインストール
RUN apt update -yq && apt install -yq ruby git nginx
RUN gem install -N mixlib-install && mixlib-install download inspec -v 5 
RUN dpkg -i inspec*

## ライセンス回避
RUN echo 'export CHEF_LICENSE_KEY=free-f0d0da72-8424-4323-ab09-43f625915690-580' >> /root/.bashrc
RUN echo 'export CHEF_LICENSE="accept"' >> /root/.bashrc

# 必要なInSPecテストコードの取得
RUN git clone https://github.com/dev-sec/linux-baseline.git
RUN git clone https://github.com/dev-sec/ssh-baseline.git
```

```
docker build -t inspec .
```

### InSpec 実行

構文：
```
docker run inspec　/bin/bash -c 'inspec exec [InSpecプロファイル] -t [ターゲットサーバー] '
```

実行例：

```
docker run inspec /bin/bash -c 'inspec exec ssh-baseline -t ssh://[USER_NAME]@[IP] --password '[PASSWORD]''
```

## InSpec

InSpecは、RSpecやServerspecライクなコードを元にセキュリティテスト・スキャンを行います。

ゼロベースから必要なテストコードを自分で書くこともできますが、InSpecを開発/メンテナンスしている[Progress社](https://www.chef.io/)[^1]が無料公開しているテストコードを活用できます。（[リンク](https://github.com/dev-sec)）　
今回使用したLinuxOS BaselineとSSH Baselineは、その一例です。


他にも、脆弱性管理データベースとして有名な[CVE](https://www.ipa.go.jp/security/vuln/scap/cve.html)を管理するMITRE Corporationが無料公開しているテストコードも活用できます。（[リンク](https://saf.mitre.org/libs/validate)）

MITREは、[CISベンチマーク](https://aws.amazon.com/jp/what-is/cis-benchmarks/#)や[STIGs](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.security.doc/GUID-9478D24D-A29D-4C0D-A069-647667C6F853.html)に対応したテストコードを無料公開しています。
高いセキュリティ要件を必要とする環境に合わせたセキュリティスキャンを行うことができます。

上記以外のすべてのOSやアプリケーションに対応する[CISベンチマーク](https://aws.amazon.com/jp/what-is/cis-benchmarks/#)と[STIGs](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.security.doc/GUID-9478D24D-A29D-4C0D-A069-647667C6F853.html)に対応するセキュリティテスト・スキャンが必要な場合、有償ではありますが、Progress社から購入することが可能です。

## テストコード

```
describe sshd_config do
  its('PermitRootLogin') {　should_not cmp 'yes'　}
end

describe package('telnetd') do
  it { should_not be_installed }
end　

describe inetd_conf do
  its("telnet") { should eq nil }
end
```

上記のテストコードで「ROOTログインが無効化されていること」「telnetが使われていないこと」をテストします。

## InSpecとSTIGとCISベンチマーク

InSpecのよりセキュリティに特化した活用方法については、こちら↓↓↓↓を参照ください。

https://www.chef-sec.com/stig_cis__benchmark_test/
Photogrammetryによる3次元構造の測定について

# はじめに

Scaniverseなどのアプリで、NoLiDAR?NoProblemというように、LiDARのない機種でも
3Dスキャンが行えるようになっていますが、Photogrammetryという写真から3Dを起こすための
仕組みが続々と掲載されている状況にあります。

https://scaniverse.com/support/no-lidar-no-problem

元々、このような複数枚の画像から、カメラの相対姿勢によって、3次元構造を測定する手法は、
Visual SLAM(SfM)として研究されていて、1980年代初頭にNASAの惑星探査ローバーなどに使われたことが最初だとか。

https://www.rsj.or.jp/content/files/event/international/iros16tutorial_2.pdf

論文などを読んでいると、改めて、測定をやり直さなくても、既存の写真や動画などのデータから
３次元を起こせるということの利点などが書かれています。

iPhoneの掲載されたLiDARのおかげで、
手軽にオブジェクトを3Dに変換することができるようになりましたが、iPhoneだとレーザーの飛距離が5m程度であることなどから、広範囲の測定が難しいことなどの欠点を補うために、Photogrammetryは有効です。

# 対応ソフト

|名前  |win/mac  |有料/無料  |URL  |
|---|---|---|---|
|photocatch  |ios,mac  |無料  | https://www.photocatch.app/ |
|metashepe（旧photoscan）  |windows  |  | https://kuu-satsu.com/software/photoscan/ |
|reality capture  |windows  |  | https://kuu-satsu.com/software/reality-capture/ |
|3DF Zephyr  |windows | | https://www.3dflow.net/3df-zephyr-free/  |
|Meshroom  |windows |  | https://alicevision.org/#meshroom  |
|Apple Object Capture | windows  | | https://alicevision.org/#meshroom  |

https://www.youtube.com/watch?v=v_O6tYKQEBA

有名なのは、2020年7月に設立された非営利団体ALICEVISION協会が開発したMeshroomというソフト。
ドローンで撮影した空撮ビデオなどの写真から3D土地モデルが描かれている映像などが公開されている。


# AWS IoT TwinMakerの中でも利用されている

https://aws.amazon.com/jp/blogs/news/building-a-digital-twin-with-photogrammetry-and-aws-iot-twinmaker/

https://www.dronedeploy.com/product/photogrammetry/


# macでphotocatchを試してみる



# (参考)

https://www.reddit.com/r/photogrammetry/comments/secraw/big_comparision_photocatch_vs_meshroom_vs/

無料で写真から3Dプリント出力可能なモデルを生成できるオープンソースの3D再構築ソフト「Meshroom」
https://gigazine.net/news/20220503-alicevision-meshroom/

ObjectCaptureの使い方
https://lilea.net/lab/how-to-use-object-capture/
Isaac ROSって何者？？

こんにちは 自律移動ロボットとrosと格闘しているhutonです．

この記事ではNvidiaが提供するGPUやjetson向けのROSである
NVIDIA Isaac™ Robot Operating System (ROS) 
issac ROSについて勉強を兼ねてまとめます．
※あまり詳しくない筆者が変なことを言っている可能性があるのでご指摘あればお願いします．

>NVIDIA Isaac™ Robot Operating System (ROS) コレクションは、ハードウェア アクセラレーションされたパッケージを使用して、高性能なソリューションをより速く、簡単に構築する方法を提供します。これには複数のオープンソースのオプションが含まれており、ROS 開発者に NVIDIA® Jetson™ などの NVIDIA ハードウェア上で構築する新しい手法を提供するよう設計されています。

ハードウェアアクセラセーションされているため，jetsonの力をフルで利用できるROS
頭の良いソフトウェア見たいです．

何個かおもしろそうなパッケージがあるのでピックアップして，その後，実際に動かしてみます．

## Isaac_ros_common
isaac_rosの動作に __避けては通れない__ パッケージです．
中にはDockerfileが含まれていて，基本的にこの中でビルドや実行をしていきます．
jetpack5.x系列はubuntu 20.04がベースのため，ROS2 humbleを動かせる（無理矢理）のは便利です．

## Isaac_ros_nitros
謎の半導体企業nvidiaにより，ゼロコピーでノードごとのデータのやり取りが可能らしい
（一体何を言っているんだ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667378/f860cd52-c8b8-eeb2-5351-6f585d3476eb.png)
## isaac_ros_image_pipeline
起動するだけでバカ食いする画像にまつわる歪み補正やサイズ変更などなどの機能をもつ
image_pipelineを上記のnitrosを使ってcpuベースからGPUベースに
置き換えるパッケージらしいです．
↓こんな苦労が強調されてる
>確実に置き換えるために多大な努力が払われました。

## Isaac_ros_pointcloud_utils
実質GPUが使えるpointcloud_to_lazerscan

## Isaac_ros_dnn_inference
ROS2上でNVIDIA Triton/TensorRTを使うための便利パッケージ
モデルの最適化をするTensorRTの恩恵をフルに受けれれるようです．
これを利用した[yolov5](https://github.com/NVIDIA-AI-IOT/YOLOv5-with-Isaac-ROS?tab=readme-ov-file)などなどがあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667378/c7c14fb2-b2b0-b57f-2df5-eb6cdb573da2.png)

紹介はこれくらいにして，実際にjetsonで動作させて見ましょう．
1. はじめに[このドキュメント](https://nvidia-isaac-ros.github.io/repositories_and_packages/isaac_ros_common/index.html#)に従って開発の環境を構築します．
2. 次にnitorosやその他諸々をworkspacesにclone，docker内でbuildします
**buildできない!!!!!!!!!!??????**
nitorosとimage_pipelineで無限に怒られる．．．．．．
とほほ．．．
今回は修論の締切がまずいのでここまで
C# Newtonsoft.Jsonを使用してJsonファイルを扱う

# はじめに

`Newtonsoft.Json`を使用して、JsonファイルのSave/Loadをする。

# インストール

```:コンソールでのパッケージ追加
Install-Package Newtonsoft.Json
```

# コード

```cs:サンプルのデータモデル
class DataModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}
```

```cs:JsonファイルのSave/Load

static void SaveToJsonFile<T>(T data, string filePath)
{
    string jsonData = JsonConvert.SerializeObject(data, Formatting.Indented);
    File.WriteAllText(filePath, jsonData);
}

static T LoadFromJsonFile<T>(string filePath)
{
    if (File.Exists(filePath))
    {
        string jsonData = File.ReadAllText(filePath);
        return JsonConvert.DeserializeObject<T>(jsonData);
    }
    else
    {
        throw new FileNotFoundException($"File not found: {filePath}");
    }
}

```

```cs:サンプルコード
var data = new DataModel
{
    Name = "Name1",
    Age = 30
};

var data2 = new DataModel
{
    Name = "Name2",
    Age = 10
};

List<DataModel> data_list = new List<DataModel>();
data_list.Add(data);
data_list.Add(data2);

string json = JsonConvert.SerializeObject(data_list, Formatting.Indented);
Console.WriteLine($"Serialized JSON: {json}");

// JSONデータをデシリアライズ（JSON → オブジェクト）
var deserializedData = JsonConvert.DeserializeObject<List<DataModel>>(json);
Console.WriteLine($"Deserialized Data - Name: {deserializedData[0].Name}, Age: {deserializedData[0].Age}");

// ファイルへ保存
SaveToJsonFile(data_list, "file.json");

// ファイルから読み出し
var loadedData = LoadFromJsonFile<List<DataModel>>("file.json");
```

# 参考ページ

https://qiita.com/SY81517/items/1cf6246dd99869f7b9c5

https://learn.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json/migrate-from-newtonsoft?pivots=dotnet-8-0
エラトステネスの篩を用いた素数の検出

## 開発環境
- Visual Studio Code (Version: 1.85.1)
- julia version 1.9.4

## 注意
この実装は動作はしますが最適ではないようです。より高速化した実装をコメント欄から頂いています。

## コード
```julia
function sieve_of_eratosthenes(n::Int)::Vector{Int}
  is_prime = trues(n)  # 各数が素数であるかどうかを示す配列。初期値はtrue
  is_prime[1] = false  # 1は素数ではない

  # 2から√nまで繰り返す
  for i in 2:isqrt(n)
      if is_prime[i]
          # 現在の素数の倍数を非素数としてマーク
          for j in i^2:i:n
              is_prime[j] = false
          end
      end
  end

  # is_primeがtrueであるインデックスの数だけを抽出して、素数のベクトルを作成
  return [x for x in 1:n if is_prime[x]]
end

# 例: 100までの素数を見つける
N = 100
primes = sieve_of_eratosthenes(N)
println(primes)
```

## 出力
```console
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
```

## 参考資料
- [Julia 1.9 Documentation](https://docs.julialang.org/en/v1/)
- [エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)
Terraformを利用して、API Gateway+Lamba構成を作成してみる。

## はじめに
本記事は「[AWS-GUILD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aws-guild-2023)」の19日目の記事です。

Terraformを利用して、以下の構成を作成します。
構成自体は非常にシンプルです。

構成図
![api-gatway-lambda-integration.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/341dbc61-1d99-b857-acf1-e59101941da0.png)


## Terraformのフォルダ構成
``` tree
.
├── backend.tf
├── main.tf
├── modules
│   ├── api-gateway
│   │   ├── aws_api_gateway_rest_api.tf
│   │   ├── ...
│   │   ├── output.tf
│   │   └── variables.tf
│   ├── iam
│   │   ├── aws_iam_role.tf
│   │   └── output.tf
│   └── lambda
│       ├── aws_lambda_function.tf
│       ├── src
│       │   └── helloworld.py
│       ├── ...
│       ├── data.tf
│       ├── output.tf
│       └── variables.tf
├── provider.tf
└── variables.tf
```

今回はTerraformのmodule構成でフォルダ構造を作成しております。

詳しくはGitHubを参照。

https://github.com/Teshima-Tatsuya/terraform-aws-api-gateway-lambda/tree/v1.0

## 各リソースの設定
### API Gateway
複数のリソースがありますが、Lambda統合部分のみ抜粋します。
以下の通り、Lambdaモジュールから変数を受け取り、ARNをuriに設定します。
残りの細々とした設定を行うことで、Lambda統合が完成します。

注意点としては`AWS_PROXY`として`type`を設定する必要があるということです。
``` hcl:api-gateway
resource "aws_api_gateway_integration" "lambda" {
  rest_api_id             = aws_api_gateway_rest_api.lambda.id
  resource_id             = aws_api_gateway_resource.lambda.id
  http_method             = aws_api_gateway_method.lambda.http_method
  type                    = "AWS_PROXY"
  uri                     = var.lambda.function_invoke_arn
  integration_http_method = "POST"
}
```

### Lambda
以下のような形でLambda関数を定義します。
`role`にはIAMモジュールで定義したものを利用します。
関数本体は`src`ディレクトリに記載しているため、`archive_file`モジュールを利用して、圧縮したzipファイルをLambda関数として登録します。
``` hcl:lambda
resource "aws_lambda_function" "helloworld" {
  function_name = "api-gateway-sample"
  role          = var.role
  handler       = "helloworld.lambda_handler"
  runtime       = "python3.11"
  filename      = "${path.module}/archive/helloworld.zip"
}

data "archive_file" "sample_function" {
  type        = "zip"
  source_dir  = "${path.module}/src"
  output_path = "${path.module}/archive/helloworld.zip"
}
```

### その他
その他のリソースとして、独自ドメインを利用する場合はRoute 53の設定が必要です。
``` hcl:route 53
data "aws_route53_zone" "aws" {
  name = "aws.tessy.dev"
}

resource "aws_route53_record" "api" {
  name = aws_api_gateway_domain_name.api.domain_name
  type = "A"
  zone_id = data.aws_route53_zone.aws.zone_id

  alias {
    evaluate_target_health = true
    name = aws_api_gateway_domain_name.api.regional_domain_name
    zone_id = aws_api_gateway_domain_name.api.regional_zone_id
  }
}
```

## リソースの作成
本プロジェクトでは、Terraform Cloudを利用しております。
本記事ではTerraform Cloudの設定は割愛しますが、実行環境をCloudに移すことが出来、`plan`実行を確認して、`apply`を承認する。
みたいなことも出来るので、複数人での作業が容易になったりします。

通常は、以下のコマンドを実行してください。
```
terraform plan
terraform apply
```

## 接続確認
こんな感じで無事に接続できたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/f1939f9b-20e2-3b74-72a9-994974262033.png)

## まとめ
API GatewayとLambda統合はマネジメントコンソールだとポチポチするだけで様々なリソースが作成されます。
これをTerraformで作成した場合、思ったよりも多くのリソースを作成することになります。
最初は苦労しますが、一度作成すると内部のリソースの動きが把握できたりしてとても勉強になるのでおすすめです。
c#でNAudioを使ったプロセス一覧取得

# はじめに
[にわのわ](https://twitter.com/niwa_nowa)です。

c#にて実行中のプロセスを取得する方法をまとめます。

# ソース
NAudioというライブラリを使用します。
また、1つのアプリケーションで複数のプロセスを持つものがあります(Discordなど)。

https://www.nuget.org/packages/NAudio/

```csharp
 public ProcessInfo[] GetProcessInfoList()
 {
     if (defaultPlaybackDevice != null)
     {
         NAudio.CoreAudioApi.AudioSessionManager sessionManager = defaultPlaybackDevice.AudioSessionManager;
         SessionCollection sessions = sessionManager.Sessions;

         ProcessInfo[] processInfoList = new ProcessInfo[sessions.Count];
         for (int i = 0; i < sessions.Count; i++)
         {
             AudioSessionControl session = sessions[i];
             uint processId = session.GetProcessID;
             System.Diagnostics.Process process = System.Diagnostics.Process.GetProcessById((int)processId);

             processInfoList[i] = new ProcessInfo
             {
                 ProcessId = (int)processId,
                 ProcessName = process.ProcessName
             };
         }

         return processInfoList;
     }

     return new ProcessInfo[1];
 }
```

クラスの構造は以下の通りです。(別途記載が必要)
```csharp
public class ProcessInfo
{
    public int ProcessId { get; set; }
    public string ProcessName { get; set; }
}
```

# おまけ
以下のようにして各プロセスのミュート状態を切り替えることができます。
```csharp
 session.SimpleAudioVolume.Mute = true | false;
```

# おわりに
プロセス一覧を取得する方法をまとめました。
NAudio越しにプロセス一覧を取得することで、各プロセスの音量調整も可能です。
c#でのホットキー設定方法

# はじめに
[にわのわ](https://twitter.com/niwa_nowa)です。

c#におけるホットキーの設定方法について書きます。
c#でのホットキーの設定は、ctrlキー、windowsキー、altキー＋通常のキー1つの組み合わせで設定可能です。

# ソース
以下のソースではホットキー設定用のフォームを作成し、閉じられた際にホットキーの設定を行っています。
```csharp
    List<Keys> hotkeyKeys = new List<Keys>(hotKeySettingForm.GetHotkeyKeys());

    //ホットキーが設定されていない場合は何もしない
    if (hotkeyKeys.Count == 0)
    {
        return;
    }

    //ホットキーの設定をラベルに表示
    testlabel.Text = "ホットキー設定：" + string.Join(" + ", hotkeyKeys);

    int modKey = 0x0000;
    if (hotkeyKeys.Contains(Keys.ControlKey))
    {
        modKey |= 0x0002;
        _ = hotkeyKeys.Remove(Keys.ControlKey);
    }
    if (hotkeyKeys.Contains(Keys.Menu))
    {
        modKey |= 0x0001;
        _ = hotkeyKeys.Remove(Keys.Menu);
    }
    if (hotkeyKeys.Contains(Keys.ShiftKey))
    {
        modKey |= 0x0004;
        _ = hotkeyKeys.Remove(Keys.ShiftKey);
    }

    //ホットキーを設定する。
    hotKey = new HotKey(modKey, hotkeyKeys[0]);
    hotKey.HotKeyPush += new EventHandler(#実行したい関数);
}
```

ホットキー設定用のフォームは以下のようになっています。
```csharp
 public partial class HotKeySettingForm : Form
 {
     public HotKeySettingForm()
     {
         InitializeComponent();
     }

     public Keys SelectedHotkey { get; private set; }
     public List<Keys> HotkeyKeys { get; set; } = new List<Keys>();
     public int KeyCount { get; set; } = 0;

     private void buttonSubmit_Click(object sender, EventArgs e)
     {
         // ホットキーが設定されていない場合はエラーを表示
         if (HotkeyKeys.Count == 0)
         {
             _ = MessageBox.Show("ホットキーが設定されていません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
         else
         {
             // OKボタンがクリックされたときにフォームを閉じる
             DialogResult = DialogResult.OK;
             Close();
         }
     }

     private void HotKeySettingForm_KeyDown(object sender, KeyEventArgs e)
     {
         //　押下されたキーが一つの場合、リストをクリアして押下されたキーを追加
         if (KeyCount == 0)
         {
             HotkeyKeys.Clear();
             HotkeyKeys.Add(e.KeyCode);
             KeyCount++;
         }
         else
         {
             if (!HotkeyKeys.Contains(e.KeyCode))
             {
                 HotkeyKeys.Add(e.KeyCode);
                 KeyCount++;
             }
         }

         // ホットキーのリストをラベルに表示
         labelHotKey.Text = string.Join(" + ", HotkeyKeys);
     }

     private void HotKeySettingForm_KeyUp(object sender, KeyEventArgs e)
     {
         KeyCount--;
     }

     public List<Keys> GetHotkeyKeys()
     {
         return HotkeyKeys;
     }


 }
```
また、プロkグラムが終了する際にホットキーの監視解除が必要です
```csharp
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        //ホットキーの監視を解除する
        hotKey.Dispose();
    }
```

# おわりに
これらでc#でのホットキーの設定ができるようになります。
今回記載した内容では、バックグラウンドでもホットキーの監視ができるため、そこそこ満足しています。
CodeCommit の自分用メモ


## 接続方法

AWS CodeCommit リポジトリに接続する - CodeCommit リポジトリのクローンを作成してリポジトリに接続する 
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-connect.html#how-to-connect-http  

```
Git 認証情報を使用した HTTPS の場合、または AWS CLI に含まれている認証情報ヘルパーの場合:
git clone https://git-codecommit.us-east-2.amazonaws.com/v1/repos/MyDemoRepo    my-demo-repo
```        

```
git-remote-codecommit を使用した HTTPS の場合 (AWS CLI でデフォルトのプロファイルと AWS リージョンが設定されていると仮定):
git clone codecommit://MyDemoRepo my-demo-repo
```    

```
SSH の場合:
git clone ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/MyDemoRepo    my-demo-repo
```

参考
https://qiita.com/kaburagi_/items/e3ff3a048ec548bf86b4
Anjinによる自動テストの活用事例

# はじめに
本記事は[QualiArts Advent Calendar 2023](https://qiita.com/advent-calendar/2023/qualiarts) 19日目の記事になります。
QualiArtsでUnityエンジニアをしている たなひろ と申します。
最近はAnjinを使ってアウトゲームのテストの自動化に取り組んでいます。
本記事ではAnjinの自動化テストについての活用事例について紹介します。

# AnjinとAirtestの使い分けについて
AnjinとはDeNA提供のMITライセンスで公開されている、テストを自動化するためのツールになります。

https://github.com/DeNA/Anjin

こちらにAnjinについての記事がありますので詳しく知りたい場合はこちらを読んでいただくと良いと思います。

https://swet.dena.com/entry/2022/12/05/170000

弊社ではAirtestという別のフレームワークを利用して自動テストを行なっていますが、Airtestは実機の機種ごとで差異が出るようなテストについて実行しており、Anjinの方はデータのチェックなど、端末に依存しないデータのテストについて使用しています。
こちらはまだAnjinが提供される前にAirtestを利用したチュートリアルの記事になります。

https://technote.qualiarts.jp/article/51/

# Anjinでのテスト活用事例

## アウトゲームでのテスト活用事例
弊社が運用を行うモバイルゲームであるIDOLY PRIDE（以下アイプラ）を例にあげますが、タイトル、キャラクターの育成、編成、ガチャなどのメインのゲームの部分以外をアウトゲームと呼んでいます。(下記がアイプラでのアウトゲーム部分の参考画像になります)
![outgame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981354/93d60896-d750-48ca-b189-6df9fb3f1eec.png)
キャラクターの育成ができるか、編成のおまかせ機能などが正常かなど、このあたりの要素についてきちんと実行できているかを毎朝テストし、不具合があった場合には報告するようにしています。
新規機能などの開発で画面のUIの要素変更などが起こると、不具合やエラーが起きていることがあり、早めの報告が役に立ちます。

## アドベンチャーパート全テスト
アイプラでは、このようなキャラクターとの会話シーン(アドベンチャーパート)があります。
![スクリーンショット 2023-12-18 15.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981354/3f00b57d-46d5-9451-c646-bf2459013f55.png)
このようなアドベンチャーパートにおいてAnjiの自動テストを活用しています。
メインのストーリーや各キャラクターのストーリーなどが大量にあるわけですが、人の手で確認を行うのは大変です。
まずは、メインの会話用スクリプトの存在確認のチェックや、会話シーンの最後まで到達できるかなどのチェックをしています。
また会話に使用される素材データ(音声、画像、モデルデータ、モーションデータetc)も、会話用スクリプトと紐づいて大量に存在するため、それぞれについてきちんと読み込めて実行できているか、という確認もしています。
音声データなど、データが揃っていない段階でも最後まで実行できるような状態になっているため、データエラーについて取りまとめて報告することは大変役に立っています。
またこちらはテストに時間がかかるため毎週末に実行しています。
自動テストによって、手動テストを行うよりもかなり作業量を減らすことができています。

# 実際の仕組み
上記の毎朝および毎週のテストはJenkinsによって定期実行されており、Unityを呼び出し、結果をSlackに送信するようになっています。
送信先として設定されたチャンネルで失敗したテストのみエラーログを確認し、それでも原因が把握できなかった時は、手元のUnityでAnjinのテストを実行し、エラーを特定して報告するようにしています。

# まとめ
今回はAnjinを使用しての自動テストについての活用事例を書いてみました。
今後もAnjinでのテスト項目を増やし省力化に貢献したいと思います。
CFnの自分用メモ

自分用メモ

## リリース履歴
基本的に以下を確認する。ただし、Docが追いついていない可能性があるので、GitHub Issues も確認するとよい。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/ReleaseHistory.html

https://github.com/aws-cloudformation

## Lambda-backed カスタムリソース
- リソースや機能がCFnに対応していない場合、Lambda-backed カスタムリソースを使って、Lambda側でAPIを叩いていい感じにCFn配下のリソースとして構築することができる
ChatGPT以外にどんなLLMがあるか調べてみた

ナレッジコミュニケーションでマーケティング業務に携わっている[矢澤](https://note.com/__80_02)です。

この記事は株式会社ナレッジコミュニケーションが運営する [クラウドAI by ナレコム Advent Calendar 2023](https://qiita.com/advent-calendar/2023/knowcom-cloudai) の19日目にあたる記事になります！


# はじめに
ChatGPT以外にどんな最新のLLMがあるのか、その概要/特徴をBingAIに聞いてみました。大規模言語モデル（LLM）は、大量のテキストデータから学習し、人間のような文章を生成できるAIモデルの一種です。

# 結果
ChatGPT以外のLLMについて調べてみましたところ、以下のような結果が得られました。

### LLaMA（Large Language Model Meta AI）
Meta Platformsの研究機関Meta AIが開発したLLMです。LLaMAは4種類（パラメータ数70億、130億、330億、650億）のサイズがあり、それぞれ1兆個あるいは1兆4000億個のトークン（単語、単語の断片単位）で学習しています。特に注目すべきは、130億パラメータの「LLaMA-13B」がシングルGPUで動作し、しかも「ほとんどのベンチマークで（1750億パラメータの）GPT-3を上回った」（Meta）ということです。

https://ai.meta.com/llama/

### LLaMAとGPT-3の違い
開発者: LLaMAはMeta Platformsの研究機関Meta AIが開発したもので、GPT-3はOpenAIが開発しました。

パフォーマンス: LLaMAの13Bモデルは、GPT-3よりも圧倒的に少ないパラメータ数でGPT-3と同等の性能を示しました。

ハードウェア要件: GPT-3はAIに最適化したアクセラレータを複数台使わなければ動作しないのに対し、LLaMA-13Bは単体GPUでも問題なく動作しました。これにより、コンシューマーレベルのハードウェア環境でもChatGPTのようなAIを動かせる可能性があります。

学習データ: GPT-3.5モデルの学習データは、Llama 2の学習データよりも多いです。

創造性: Llama 2は家族向けのコンテンツを生成しますが、その分創造性が低下します。この言語モデルを使用して物語や詩を生成しようとすると、GPT-3.5モデルと比較して創造性の低い作品ができあがります。

安全性: Llama 2言語モデルは、GPT-3.5よりも安全な出力を生成します。

参考：「ラマ2 Vs OpenAIのChatGPT：どちらが優れているか？」https://textcortex.com/ja/post/llama-2-vs-chatgpt

### FlexGen
スタンフォード大学やUCバークレーなどの研究者が開発した高スループットの生成エンジンです。「高価なシステムではなく、単一のコモディティGPUなど低コストのハードウェアで、新しいアプリケーションを可能にすることを目指す」と説明されています。

参考：https://arxiv.org/abs/2303.06865

### FlexGenとGPT-3の違い

開発者: FlexGenはスタンフォード大学やUCバークレーなどの研究者が開発したものです。

ハードウェア要件: GPT-3はAIに最適化したアクセラレータを複数台使わなければ動作しないのに対し、FlexGenは単体GPUでも問題なく動作します。これにより、コンシューマーレベルのハードウェア環境でもChatGPTのようなAIを動かせる可能性があります。

パラメータ圧縮とオフロード: FlexGenは、LLMのパラメータを圧縮してオフロードすることで、GPUメモリ使用量を削減し、レイテンシーとスループットを最適化します。

モデルの互換性: FlexGenは、GPT-3やOPT-30Bなどの様々なLLMに対応しており、簡単に切り替えることができます。

参考：「FlexGenの魅力と使い方：GPT-3やOPT-30Bを手軽に試せるエンジン」https://note.com/masayuki_abe/n/n76d3e0edd9b2

***
ナレッジコミュニケーションでは[「Musubite」](https://recruiting.musubite-job.com/features/company/knowledge-communication)というエンジニア同士のカジュアルトークサービスを利用しています。
生成 AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
ECR の自分用メモ

自分用メモとして残す

## 運用
- latestタグはダメ、絶対。(脳死)
    - latestを指定していると、タスクが停止して新タスクが起動した際に、その時点での最新バージョンを取得する。したがって、ECR へのイメージ push が別プロセス (例えば、CodePipelineを使用していてビルドの承認フローと、デプロイの承認フローをわけていた場合など) として行われていた場合、誤って最新のイメージを取得してしまう可能性がある。また、ロールバックもしづらい。

## ECR エンドポイントについて
- 複数サブネット(例えば、サブネットA、サブネットB、サブネットC)がある場合、1つのサブネットAにエンドポイントを作成すると、サブネット間でルーティングができていれば、サブネットB、サブネットCからもサブネットAにあるエンドポイントを使って、ECRとアクセスできる。
- 1AZ、インターフェース型のエンドポイントは1つという制限がある
- VPC内で service-code.region-code.amazonaws.com 形式のDNS名を名前解決したときにグローバルIPが返却される。
    - https://dev.classmethod.jp/articles/aggregate-aws-privatelink-to-a-shared-vpc-connected-to-aws-transit-gateway/

- エンドポイント作成の際は、プライベートDNSが有効になっているか確認
    - https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-vpc-create

## Transit Gatewayを跨いだエンドポイントへの通信

- VPC A => TGW => VPC B の構成で、AからBのエンドポイントへの通信を想定する場合
    - 跨ぐと言うことは、VPC外からの通信である。その場合、Route 53 Private Hosted Zone の VPC A に対する関連付けが必要。(自分の理解が怪しい、、、)
    - https://aws.amazon.com/jp/blogs/networking-and-content-delivery/integrating-aws-transit-gateway-with-aws-privatelink-and-amazon-route-53-resolver/
    - https://qiita.com/holidayworking/items/1051898c30b3c08c0c1a
- VPC Aからすると、VPC Bのservice-code.region-code.amazonaws.com 形式の DNS 名はグローバル IP で帰って来てしまう。そのため、Route 53 Private Hosted Zone 作成して、上記のエンドポイントのAレコードをvpce- から始まる DNS 名に解決することで、プライベートIPが返ってくるようになる
Google 検索の小ワザ集

## はじめに
Googleで検索する際に便利な小ワザをご紹介します！
## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 日々Googleで何かと検索している方

## 🔹指定した年以降に掲載された記事のみ検索
**after:xxxx**
(xxxxに西暦）

例）PHPの連想配列に関する最近の情報を調べたい場合
```php 連想配列 after:2023```

月日まで指定したい場合は以下でも可
after:2023-04-01　after:2023/04/01　after:2023-4-1

:::note info
最新バージョンの記事を検索したい時などに便利
:::

ちなみに、古い記事を検索したい場合は、
before: も使えます

## 🔹指定したドメインの記事のみ検索
**site:xxxx**
(xxxxにドメイン)
domain:でもOK

例）PHPの連想配列に関するQiitaの記事を調べたい場合
```PHP 連想配列 site:https://qiita.com/```

## 🔹指定したワードを除外して検索
**-xxxx**
(除外したいワードxxxxに-(ハイフン)をつける)

例）PHPの連想配列に関する情報のうちLaravelに関連する情報を除きたい場合
```php 連想配列 -laravel```

**-site:xxxx**
(xxxxにドメイン)　で指定したドメインの記事を除外

例）PHPの連想配列に関する情報をQiitaの記事を除いて調べたい場合
```PHP 連想配列 -site:https://qiita.com/```

## 🔹完全一致検索
**“xxxx”**
(完全一致させたいワードxxxxを""(ダブルクオーテーション)で囲む)

:::note info
エラー文の検索などに便利
:::
例)
```"NameError: name 'data' is not define"```

## 🔹部分一致検索(ワイルドカード検索)
**xxxx * xxxx**
(わからない部分、任意で良い部分に*(アスタリスク)を入れて検索)

例)
```name * is not define```

## おわりに
他にも便利な検索コマンドはありますが、
初学時に知っておくと便利だな、と思ったものを紹介させていただきました。
興味がありましたら、他の便利な検索コマンドも探してみてください！

読んでいただきありがとうございました！！

## 参考記事
[効率的なGoogle検索テクニック(エンジニア必須技能)](https://chromejohokyoku.com/2022/03/05/%E6%A4%9C%E7%B4%A2%E6%89%8B%E6%B3%95/)
500万円のAWSサービスを申し込んでしまった話

# はじめに
数年前に500万円のAWSサービスを申し込んでしまうという事件がありました。
以前にLTで発表したネタですが、今回記事にしました。

過去のセッション資料

https://speakerdeck.com/chiharutsuboi/500mo-yuan-nosabisuwoshen-siip-ndesimatuta

# 背景：AWS教育環境
- AWSの社内教育を目的として自由に利用できるAWSアカウントを用意
- <B><font color=red>一部のメンバーに管理権限を付与</font>
- 利用ルール
    - IGWやNATなどの作成禁止（社内プロキシを経由させる）
    - VPCピアリングの禁止
    - 不要なリソースは削除、利用する期間のみ起動

# 事件発生
ある日突然、AWS教育環境で高額のAWS利用料金が発生

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741587/b8639eed-893d-e887-e989-30e7ae36ccfc.png)

<B><font color=red>3000ドルのサブスクリプション！？</font>

# AWS Shieldってなに？
マネージド型の<B>DDoS攻撃保護サービス</B>
WEBサービスへ大量リクエストしサーバーダウンさせるような攻撃に対する防御ができる

Standard料金：無料
Advanced料金：<B><font color=red>1ヶ月3,000 USD、1年間のサブスクリプション契約</font>

3,000＄×12ヵ月×為替142円 ＝　<B><font color=red>約500万円！？</font>

申し込み方法：マネジメントコンソールで数クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741587/ee66e4ff-0321-9c17-cbe1-6f6eae337fc6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741587/a3bdb61e-d9b4-1600-4500-1d89acbe9920.png)




<br>
<B>すごく簡単に申し込めますね！</B>
<br>



# 対応
- CloudTrailで調査し、ユーザーの操作を確認
    - 結果、<B><font color=red>料金を確認せずに契約</font></B>してしまったことが判明
- とりあえずキャンセルしようするもマネジメントコンソールから<B><font color=red>キャンセル不可</font></B>

# 対策
その後の対策として下記4点を実施しました

1. 事前教育
2. 適切な権限設定
3. Slack通知
4. 請求アラート

# 対策１：事前教育
IAMユーザーの発行前にAWSの基本教育を実施
下記の３つのe-learningに合格すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741587/9362f34f-405d-7547-c8ec-f3c96152504a.png)

# 対策２：適切な権限設定
- 管理権限は原則提供しない
- 提供するポリシーでは下記のActionを明示拒否
    - shield:CreateSubscription
- 設定可能であればOrganizationsのSCP設定で拒否する

# 対策３：slack通知
毎日slackでAWS利用料を通知
いつでも気軽に利用状況が分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741587/84833edd-4470-4e56-263b-581e755d6486.png)


# 対策４：請求アラート
- 請求アラートを設定
    - CloudWatchメトリクス
    - 一定額を超えた場合にメールで関係者に通知
    - 10日、20日時点で〇〇ドルを超えた場合に発報
- 現在は他にも機能あり
    - AWS Budgetsのアラート機能
    - AWS コスト異常検出（AWS Cost Anomaly Detection）

# まとめ
- AWSには簡単に契約できてしまう高額なサービスが存在します
- あらかじめ対策しておきましょう！
    - 適切にユーザーの権限を設定
    - AWS利用前の教育ルールを策定
    - 請求アラートなどの検知機能を設定
ペアプロをしてよかったこと〜ナビゲーター編〜

# はじめに
現在私は、全くの未経験からプログラミングを学び始めて1年が過ぎたところにいます。
今回、あるxmlファイルのCompose化をペアプロで対応させていただけることになったのですが、ドライバーではなく指示する側のナビゲーターを行うことになった際、経験が浅い私のような人がどのようにしてナビゲーターを行ったのか（教わったのか）、紹介したいと思います。

# 実装する前に行ったこと
### ①設計を行う
コードを書く前に、miroのボードを使ってxmlをComposeでどのように組み立てていくか、あーだこーだ話し合いながら図に起こしました。

例)
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172794/089fab0e-6bfd-faa8-f2da-82f7f3c57af6.png">

### ②ナビする側の手順を確認
上記がある程度完成したら、ナビする側の手順を確認しました。

たとえば
「ComposeをかけるようにするにはまずComposable関数を作成しなきゃね」とか
「今回のはAbstractComposeViewなのかComposeViewなのかとかも確認しておこう」とか
「ある程度どんな風に反映されているか確認したいからPreviewも書かないとね」とか
「それらが準備できたらさっきのxmlの中身をcomposeにしたやつを埋めてみよう」とかとか・・・

わからなくてテンパってしまう私にとってはこのくらい細かい確認をしてもらえてすごくありがたかったです。

## いざ実装してみて
設計した図を確認しながらナビゲーション（私）が少しずつコードを読み上げ、ドライバーの方はそれに従い記述していきました。

結果的には、上記のように設計や確認をしっかりめにやったつもりではありましたが、やはり一発では想定通りのレイアウトにはならず、xmlと見た目が変わってしまいました。
しかし、実は前回設計などは全くせずにペアプロを行ったことがあり、少なくともその時よりは形になっていました！
なんなら私がナビなのに全然ナビできなくて泣きたくなったのを覚えていますが、今回事前に設計したことや細かい事前準備のおかげですこ〜〜〜しですがナビができました🥲

ほんの些細なことですが、ナビをやるとなった際に何をどう指示したら良いのか、何からやれば良いのか訳がわからなかったことが事前に設計することでドライバーとの認識が揃い、なんといっても自身の頭の中が整理され非常にやりやすく感じました。

# 振り返りを行う
紆余曲折ありつつもマージできた後に、設計したものに対しどうだったかしっかり振り返りも行いました。
実装する前に書いた設計の右隣に実際の実装を書き、注意する点や今回学んだことなどをメモしたりして、今後のペアプロに活かせるように残しました。

実際に次にペアプロした時に、振り返り時に残した図やメモを参考にすることができ、時間短縮にもつながったと思います。


例)
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172794/ebe31bee-52bf-bb9d-d2bd-c0d0cf11c9ed.png">

# まとめ
#### ▼ペアプロでナビゲーターをやる際に行った方がいいこと
1. `実装前にドライバーと一緒に設計を行い認識を合わせる`
2. `ナビする側の手順を細かく確認しておく`
3. `設計と結果を比較し細かな振り返りを行う`

# 感想
今回ペアプロ（ナビ）を行うことになった際に上記で記述してきた、設計〜振り返りまでを行い超未熟な私としては順を追って細かく説明をしてもらい、いつも思う"わからないことがわからない"という状態が少なくなった感じがしました。
尚且つ言葉だけではなく、図に起こすことで頭の中で理解がしやすかったです。

今回の経験から、しっかりと設計〜振り返りを行いお互いの認識の相違がなくなることで時間短縮にもつながり非常に学びにもなりました。
主観ですが、ペアプロやモブプロ関係なく全てにおいて一見回り道のように感じますが、設計〜振り返りまでを行うことがスムーズに実装できる近道なのかもなぁと感じました。
【DataStage】IBM Information Server DataStageのログリミット超過への対処

## はじめに
IBM Information Serverに関して、公式リファレンスしか基本的に記事が上がってこないので、過去に自分が遭遇した事象などをまとめることで、少しでもヒントになるようなものを残そう。としているものになります。

なお、扱った事があるバージョンは9.1と11.7ですが、2023年以降は9.1に触れることもなくなったため、基本的には11.7でも有効だったものを掲載しています。

当然、非公式なのでIBM社からのレビューなど受けておりません。
詳細についてはサポートチームへ問い合せ願います。

## 事象説明
DataStageを介したジョブの実行中に異常終了を検知。
DataStageのログをディレクター経由で参照しようとしたところ、以下のエラーによりログを開くことができません。

```
ログファイル RT_LOGXXXから選択中にエラーが発生しました
コマンド: SELECT RT_LOGXXX WITH @ID LIKE '1N0N' AND F7 = "XXXXXXXX" COUNTSUP
エラー: Internal data error. File '/opt/IBM/InformationServer/Server/Projects/Project/RT_LOGXXX/Over.30': 
Computed blink of -x81C dose not match expected blink of 0x1E6800!
Detected within group stating at address 0x7FFFD800!
```

## 解説
DataStageはジョブの実行履歴をエラーログ内にも出てきたファイルに保管し続けます。(UVlog)
どれほどのログを保管し続けるかは、別の設定でパージ数の設定を確認する必要があります。

私が遭遇したこのエラーは、パージ数を40と比較的多めに設定していた際に発現しました。
(この設定理由は、別のバグを検知した結果を確認するために保管回数を増やしていたためだったのですが、本件で別のエラーが上がってしまうという。。。)

本題に戻りますが、このログのファイルサイズは、**2GB**までという制約があります。
つまり、OVER.30のファイルサイズが2GBを超過すると、DataStageはログファイルを開くことができなくなり、書き込みもできなくなってしまう、というのが問題でした。

## 対処法
画面ショットや詳細な説明は省きますが、手順としては以下になります。

### 手順
ディレクターの画面から、対象のジョブを右クリックして削除
または、コマンドによるdeleteも可(私が触っている環境はIBM社がshell化していたので、同じようなものがあると想定)

その後、問題のジョブを再度import処理を行えば、実施が可能です。

### 注意点
根本解決はできておらず、ログの2GB制約は変わらないため、パージ数やジョブの分割を検討する必要があります。

また、資材としてimportしたジョブそのものにログが肥大化した状態で付与されている場合も要注意です。スリム化してからライブラリ管理を行うことをおすすめします。

私が触っていた環境では、/optのパスに潤沢なストレージが割り当てられておらず、容量の面でも不安が残ったため、定期的に容量チェックを行っていたりしました。(環境的にはパージ数を戻せれば良かったのですが、頻出しないログを検知するまでの運用として・・・)

## 最後に
ジョブの内容次第でログ量が変わるので、初期値設定やパージ数の最低値の1で発生するようなジョブにはさすがに出会ったこともないのですが、状況によってはこの制約でDataStageのジョブを分割しなければいけない、とか出てくるのではないでしょうか。

## 追記
数年前の事象だったので、当時は公式ドキュメントもなかったように思うのですが、、、
改めて調べたところ、以下のサイトを発見。

[DataStageにおけるログメンテナンス](https://www.ibm.com/support/pages/datastage%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AD%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9)

ここでも、諦めて削除してね、とあるのでまあ理由が分かってあとはやるしかない、と思って対処していきましょう。。
ECSの自分用メモ

自分用メモとして残す。

## ECS が動作しないときに確認すべきポイント
- 起動タイプ(EC2 or Fargate)
- SG/NACL のネットワーク設定 (443が開いているか)
- IAM ロールの権限
- EC2 の場合、コンテナインスタンス `/etc/ecs/ecs.config` でクラスターの指定を行っているか
- EC2 の場合、ECS Agent が動作しているか

- カスタムAMIを使用する場合
    - 固有のデータをクリーンアップする必要がある

## プロキシ
- ECS on EC2 だとプロキシ経由で ECR からのイメージを pull できる。
    - ユースケースとしては、すでにプロキシが存在し、VPCeを設けたくない場合など
- ECS on Fargate だとプロキシ経由で ECR イメージは pull できない
    - Fargateタスクで実行されているアプリケーションにおいては、環境変数 `HTTP_PROXY`を利用してプロキシ経由でアクセスすることは可能

https://github.com/aws/containers-roadmap/issues/98


## 安全なコンテナの終了方法
https://aws.amazon.com/jp/blogs/news/graceful-shutdowns-with-ecs/
- タスクが停止すると ECS エージェントは、各コンテナのエントリプロセス (Dockerfile の ENTRYPOINT、CMD) に `SIGTERM` シグナルを送信する。デフォルトで 30s に `SIGKILL` シグナルを送信する。
- コンテナでは、エントリプロセスが全てのプロセスの親になる。
- エントリポイントに `sh` を設定していると注意が必要。デフォルトでは、shell は `SIGTERM`シグナルを無視する。


## ECS Execの方法 (ざっくり)
- ECSExecRoleをタスク定義で設定
- ECS Exec を有効化する(確か、新タスクを起動する必要あり)
```
aws ecs update-service --region <リージョン名> --cluster <クラスタ名> --service <サービス名> --enable-execute-command
```
- ECS Exe でアクセスする
```
aws ecs execute-comand --region <リージョン名> --cluster <クラスタ名> --task <タスクID> --container <コンテナ名> --interactive --command "/bin/sh"
```

## Blue/Greenデプロイ
Application AutoScaling と B/G デプロイを組み合わせて同時使用することは難しい。デプロイ時には一時的に Application AutoScaling は停止した方が良い