OmniAICreator/Qiita-1.07M huggingface dataset:
C#でカノジョをつくる（21日目）

お疲れ様です。たなしょです。
今回は形態素解析使用してもう少しカノジョとの会話のバリエーションを増やしたいと思います。
今回はその導入です。

## MeCab
MeCabという形態素解析を行ってくれるツールを導入します。
MeCabの説明は[こちら](https://github.com/kekyo/MeCab.DotNet/blob/main/README.ja.md)になります。
形態素解析の説明は[こちら](https://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90)になります。

英語の場合は品詞でスペースが空きますが、日本語は品詞がつながっているのでMeCabで品詞ごとに取り出して判別させるためにMeCabを使います。

## 形態素解析するクラスをつくる
形態素解析するクラスを作成します。

1.形態素と品詞情報を分割してを格納しています。
`tagger.ParseToNodes(input)`は形態素解析を実行して、形態素オブジェクトを取り出しています。
形態素解析では割と公式みたいな感じで出てきます。

```c#
public static List<string[]> Analyze(string input)
{
     var tagger = MeCabTagger.Create();
     List<string[]> result = new();

     foreach (var node in tagger.ParseToNodes(input))
     {
         if (node.CharType > 0)
         {
             string[] surface_feature = new string[] {
                 node.Surface,
                 node.Feature
             };
             result.Add(surface_feature);
         }
     }
     return result;
}
```
2.名詞でかつ[一般、固有名詞、サ変接続、形容動詞語幹]の品詞が出現したらパターンマッチしたとします。

```c#
public static Match KeyWordCHeck(string part)
{
    Regex rgx = new("名詞,(一般|固有名詞|サ変接続|形容動詞語幹)");
    Match m = rgx.Match(part);
    return m;
}
```

## 最後に
今日は短いですがここで終わりしたいと思います。
明日は本日作ったAnalyzerクラスを使ってパターン辞書に登録していく処理を作っていきます。
Javaでヒープサイズ測定 JUnit5編

[Javaのカレンダー | Advent Calendar 2021](https://qiita.com/advent-calendar/2021/java)の13日目の記事です

# 概要

Javaの単体テストでヒープ(メモリ)を簡単に測定したいときに使える方法

## 参考

- [quick-perf/quickperf： QuickPerf is a testing library for Java to quickly evaluate and improve some performance-related properties](https://github.com/quick-perf/quickperf)
- [Quickly remove some big performance bottlenecks with QuickPerf by Jean Bisutti](https://www.youtube.com/watch?v=cEkoJL09kKI)

# やり方

正直、以下のページを見たまんま

[JUnit 5・quick-perf / doc Wiki](https://github.com/quick-perf/doc/wiki/JUnit-5)


## 測定コード

ドキュメントに `JUnit 5 >= 5.6.0 is required` とあったので注意

これをもってきました

[quickperf-examples/JvmAnnotationsJunit5Test.java at master · quick-perf/quickperf-examples](https://github.com/quick-perf/quickperf-examples/blob/master/jvm-junit5/src/test/java/org/quickperf/jvm/JvmAnnotationsJunit5Test.java)

```java
@QuickPerfTest
public class SampleQuickPerfTest {
    @MeasureHeapAllocation
    @Test
    void test() {
        new ArrayList<>(100);
    }
}
```

### 実行結果

```
[QUICK PERF] Measured heap allocation (test method thread): 440 bytes
```

## pom.xml の設定

以下の依存を追加

dependencyManagement で bom を指定しておけば、dependencies　の version が統一される程度のもので、
dependencies　で <version> を指定しても動きはしました

```xml:pom.xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>5.7.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.quickperf</groupId>
            <artifactId>quick-perf-bom</artifactId>
            <version>1.1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

...

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.quickperf</groupId>
        <artifactId>quick-perf-junit5</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
```

# 付録

この Quick Perf には他にも面白い機能(アノテーション)があって、参考の動画などをみて感覚を掴みつつ、どういうシチュエーションで利用するかは謎だが興味深いテストができそう

[JVM annotations · quick-perf/doc Wiki](https://github.com/quick-perf/doc/wiki/jvm-annotations)

- @HeepSize, @Xmx (@Xms) : ヒープサイズの最大値を設定できる
- @UseGC : GC の種類が指定できる
- @ExpectNoHeapAllocation : ヒープを確保しないことをチェックする
- @ProfileJvm　: JDK Flight Recorder のプロファイルが取れる(pom.xml に `quick-perf-jfr-annotations` の依存の追加が必要)

また、これとは別に JPA の 発行SQLの回数などをアサーションできるアノテーションもある
本番環境をAWSからHerokuへ移した際のデプロイでエラー


https://qiita.com/divclass123/items/070d0ee9e1f6f6b906df


この方法で、デプロイをしてます。いやー、いい記事だ


/app/vendor/bundle/ruby/2.6.0/gems/activestorage-6.1.3.1/lib/active_storage/service/registry.rb:18:in `block in fetch': Missing configuration for the amazon Active Storage service. Configurations available for the test、local services. (KeyError)

herokuデプロイでエラー


environments/production.rb


```
  config.active_storage.service = :amazon
```

```

  config.active_storage.service = :local

```


に変更






Dec 21 06:16:32 coffee-passport-on-heroku app/web.1 /app/vendor/bundle/ruby/2.6.0/gems/aws-sigv4-1.2.4/lib/aws-sigv4/signer.rb:621:in `extract_credentials_provider': missing credentials, provide credentials with one of the following options: (Aws::Sigv4::Errors::MissingCredentialsError)


とエラー

がまたでた


config/strage.ymlの以下の記述を削除


```

amazon: 
  service: S3
  region: ap-northeast-1
  bucket: coffeepassport
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

```
Ruby の slice が便利になった

Python の

```python:Python
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10][1:10:3]    #=>[2, 5, 8]
```

って便利ですよね。Ruby でこれをやろうとすると、ちょっと工夫が必要でした。

例えばこんな感じに。

```ruby:Ruby
1.step(9, 3).map { [*1..10][_1] }    #=>[2, 5, 8]
```

しかし、これはいまでは（たぶん Ruby 3.0 から）こんな風に書けるようです。

```ruby 
s = (1...10).step(3)
s.class    #=>Enumerator::ArithmeticSequence
[*1..10].slice(s)    #=>[2, 5, 8]
```

これの応用で、`%`を使ってさらに短く書けます。

```ruby 
[*1..10].slice((1...10) % 3)   #=>[2, 5, 8]
[*1..10][(1...10) % 3]   #=>[2, 5, 8]
```

便利ですね。
AWSを安心して個人利用するための色々をまとめてみた。

## はじめに
　AWS (Amazon Web Services) は近年様々に活躍の場を広げているクラウドサービスです。高性能なマシンを気軽に利用することができ、レンタルサーバやストレージとして使うこともできます。

　また、近年はディープラーニングを筆頭に人工知能技術に関心が高まっています。高性能なGPUを搭載したコンピュータが欲しいけど、そこまでお金を出したくない…とクラウド活用を考えている方もいるかもしれません。

　今回はそういった、個人でAWSを使いたい人が安心して利用するための諸々を書いていきます。

## AWS利用に伴うリスク
　AWSを個人で利用するに際して最も不安要因となるのはその利用料金なのではないでしょうか。特に、AWSには把握しきれないくらい沢山のサービスがあります。使っているうちに意図しない料金が発生して気が付いたら高額請求…なんてのは怖いです。

　また、パスワードやアクセスキーが漏洩すると、アカウントを不正に利用されて仮想通貨のマイニングなどに使われてしまうケースもあるようです。

https://www.nikkei.com/article/DGXMZO39233590R21C18A2000000/

　予期しない出費を避けるためにはセキュリティも大事だといえます。

## 安心して使うためにやるべきこと
　コスト、セキュリティの観点からAWSを安心して使うために最初に必要となることを、なるべく少なく、無料でできる範囲内でまとめました。
### Cost Explorer でコストを可視化
　Cost Explorer はサービスにどれくらいのお金がかかっているかを可視化してくれるサービスです。可視化されないことには手の打ちようがありません。
コンソールから「Cost Explorerを起動」で簡単に起動できます。
![スクリーンショット 2021-12-21 210354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/c7b0bd34-cf1b-53c9-64f0-4efbb974125e.png)
　公式のデモ（ ↓ ）では沢山のサービスを立ち上げていますが、何にお金がかかっているかが一目で見て取れます。

https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/

### AWS Budgets で予算を設定
　AWS Budgets ではユーザが予算を設定し、利用額に応じてアラートを受け取ることができるサービスです。利用額が予算を超えてしまったときや、超えそうなときに通知してくれます。ありがたい。
![スクリーンショット 2021-12-21 211124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/2d7569e5-10e3-b190-8274-3a8fba807724.png)
　予算の作成画面もいたってシンプルです。Amazonは通販サイトも然りですが、フォームが本当に分かりやすいです。
![スクリーンショット 2021-12-21 223540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/e41009b2-c368-c44a-0eb4-158c0f9279ea.png)

### AWS Trusted Adviser
　AWS Trusted Adviser はAWSのサービス利用に際してセキュリティ、コスト、パフォーマンス等の観点からユーザーに警告や提案をしてくれるサービスです。
![スクリーンショット 2021-12-21 215639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/3140ca37-9200-0849-9723-2fae99cea65c.png)
　もちろん最初はメッセージの意味もよく分からないので、調べながらひとつずつ対応するしかないのでしょう。しかし、AWSを使い始めたときには右も左も分からないわけですから、「これをしなさい！」と言ってくれる Trusted Adviser は嬉しいサービスです。
![スクリーンショット 2021-12-21 220933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/428a53f8-e1a0-e48b-d849-f61ec59b958f.png)

### 準拠法を日本法に変更する（おまけ）
　これは最近知ったのですが、AWSのサービス利用契約はデフォルトでは米国のワシントン州法となっているみたいです。
　特にこだわりがなければ、日本法準拠の契約に変更しておくとよいのではないでしょうか。
　契約の変更はAWS Artifactから行えます。
![スクリーンショット 2021-12-21 204654.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/80532012-65f4-2ae5-eedd-2f8882c49a08.png)
　こちらの契約を選択して、契約内容をダウンロード・確認して「契約を受諾」で変更できます。
![スクリーンショット 2021-12-21 205329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240853/52275b9c-3de6-0ab3-261f-cf27a3936c0a.png)



## おわりに
　今回のAdvent CalendarがQiitaへの初めての投稿でした。これをきっかけにQiitaを活用して勉強していきたいです。
H2でVacuum

## 背景
H2 Databaseは導入が楽ですが、放っておくとファイルが肥大化します。Vacuum的処理は当面実装されそうにありません。

しかし、サーバを落とすときには若干のVacuum的処理が走ります。

つまり時々落としてやればよいのです。
落としても大丈夫かだって？君の会社が大枚叩いて使ってるオーロラやら何やらは１００％繋がるのかい？インターネットなんていつでも切れるんだぜ！

## 実装
Spring-bootを前提にして話を進めますが、DBのマイグレーションとかより先に立ち上げなきゃいけませんから、main(String[])で最初に立ち上げてしまうのが一番トラブルが少ないでしょう。stop/startはScheduledを使えます。


    private static Server server;
    public static void main(String[] args) throws Exception {
        server = Server.createTcpServer("-ifNotExists").start();
    }
    @Scheduled(cron = "0 0 0 * * *")
    void dbCron() throws Exception {
        server.stop();
        server = Server.createTcpServer().start();
    }

# 考察
実際、毎分１回落とす設定にしても体感できるトラブルはありません。データがでかくなれば事情が違うのかもしれませんが。
点字はプログラミングの良い題材だと知った



# プルリクエストのリンク

https://github.com/JunichiIto/tenji-maker-challenge/pull/28

# ロジックの解説

まず点字のしくみのページを見ました。
http://www.naiiv.net/braille/?tenji-sikumi

1文字は6つの部分（マス）で構成されていて点を打つか打たないかで文字を表現します。
５０音を表す際、大部分は母音と子音がそれぞれ3マスずつ使って組み合わせて表現しているようです。

ですので、母音と子音の点を打つ場所をテーブルとして持たせて変換する形としました。
できる限り、ページの説明通りにテーブルを作るようにして以下のようにしました。

```ruby:点を打つ位置のテーブル
  TABLE = {
    A: [1],
    I: [1, 2],
    U: [1, 4],
    E: [1, 2, 4],
    O: [2, 4],
    K_: [6],
    S_: [5, 6],
    T_: [3, 5],
    N_: [3],
    H_: [3, 6],
    M_: [3, 5, 6],
    R_: [5],
    YA: [3, 4],
    YU: [3, 4, 6],
    YO: [3, 4, 5],
    WA: [3],
    WO: [3, 5],
    N: [3, 5, 6],
  }
```

はじめ、子音も一文字で表そうとしましたが、「ん」とな行が区別できないので、子音は２文字目にアンダーバーをつけるようにしました。

説明ページの黒丸部分の番号を書いていくだけなので間違いは少ないはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/db25e7e9-d57a-46a1-af06-cc354ca2674e.png)

図の引用：[全視情協:点字とは - 点字のしくみ](http://www.naiiv.net/braille/?tenji-sikumi)


# コードのアピールポイント

とにかく無駄のない最小限のコードで動作するようにしました。
以下が全コードです。

```ruby:tenji_maker.rb
class TenjiMaker

  # http://www.naiiv.net/braille/?tenji-sikumi
  TABLE = {
    A: [1],
    I: [1, 2],
    U: [1, 4],
    E: [1, 2, 4],
    O: [2, 4],
    K_: [6],
    S_: [5, 6],
    T_: [3, 5],
    N_: [3],
    H_: [3, 6],
    M_: [3, 5, 6],
    R_: [5],
    YA: [3, 4],
    YU: [3, 4, 6],
    YO: [3, 4, 5],
    WA: [3],
    WO: [3, 5],
    N: [3, 5, 6],
  }

  def to_tenji text
    lines = [[], [], []]
    text.split(' ').each do |t|
      @indexes = TABLE[t.to_sym] || TABLE[(t[0] + '_').to_sym] + TABLE[t[1].to_sym]
      draw.each_with_index{|line, i| lines[i] << line }
    end
    lines.map{|line| line.join(' ') }.join("\n")
  end

  def draw
    [
      mark(1) + mark(4),
      mark(2) + mark(5),
      mark(3) + mark(6),
    ]
  end

  def mark index
    @indexes.include?(index) ? 'o' : '-'
  end
end
```

処理としては、まずテーブルにそのまま一致するものがあれば採用し、
なければ１文字目＋アンダーバーで子音を取得、２文字目で母音を取得し結合したものを表示形式に成形しています。

# 頑張ったところ

テーブルの構造をシンプルにして簡単に作れる形にするまで何度か考えました。

# 苦労したところ

初めはクラス内の定数として実装しようとしましたが、
ruby特有の機能を多用する形になりそうだったので
最終的にシンプルにハッシュを使う形にしました。

# 工夫したところ

資料ページからできる限り直感的に
テーブルを定義できるようにしました。

# 自慢したいところ

コードの簡潔さ、点字の定義の作りやすさ

# 伊藤さんにメッセージ

通常のアドベントカレンダーとは一味違って楽しみながら記事を作成できました。
ありがとうございます。次回もあれば参加したいです。
牧草地の雑草管理はおまかせ！ドローンを活用した農業への取り組み

## はじめに
こんにちは。 @dcm_yamaya です。

この記事は、NTTドコモ R&D Advent Calendar 2021 22日目の記事です。
なんとことしはカレンダーが2つあります！ぜひ[カレンダー1](https://qiita.com/advent-calendar/2021/nttdocomo)ものぞいてみてください！

筆者は普段の業務では、画像認識やエッジコンピューティングの技術領域を担当しています。

アドベントカレンダーも3年目でして過去記事も（ちょっと情報が古いかもしれませんが）ぜひ。

- [Jetson と TensorRT で画像認識の高速化2019](https://qiita.com/dcm_yamaya/items/dcb149684fb210b39e8c)

- [NVIDIA Triton Inference Server で推論してみた](https://qiita.com/dcm_yamaya/items/985a57598d516e77894f)

ことしは農業AIに関する技術を紹介したいと思います。世の中的にはアグリテックとも呼ばれている分野になりますかね。

農業AIに関する取り組みもいくつかあるのですが、今回は私が画像認識技術を開発している農業向けのドローンの活用について書いていきます。

## ドローンを活用した雑草管理の効率化

北海道の酪農・畜産業では、品質のよい牧草生産のために重要な雑草管理の課題があります。非常に広大な敷地の中で雑草がどの位置にどのくらい繁茂しているのかを人が巡回して確認していますが、人手不足が深刻化する中で十分な時間が取れないという社会課題があります。

この課題に対し、ドローンと画像認識技術を活用することでより効率的な牧草生産に貢献できないかと考え、ドローン画像に対する画像認識技術を開発しています。

これにより、今まで人手で行っていた巡回や、実際の雑草を駆除するための除草剤散布の作業を大幅に省力化し、効率的な牧草生産が可能になることで、深刻な人手不足や就業者の労働負荷などの社会課題解決につながってほしいと考えています。

以降で、画像認識技術や開発中のシステムを紹介したいと思います。

## ドローンシステムと使い方
![fig01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526000/ae7b591b-be8a-8adb-2bb8-7cb4484dde2e.jpeg)

まず最初に、実際にドローンを飛ばすためのシステムからご紹介します。最近では除草剤をタンクに積んで散布することができるドローンも登場しており、これを活用した雑草のピンポイント散布を実現するシステムを作っています。以下の図のように2ステップからなっています。

### STEP1: 画像認識によるセンシング
ステップ1として、まずはドローンによる画像撮影とその画像に対する画像認識を実施します。

ドローンの自動飛行と撮影のシステムを開発しており、これにより牧草地の画像を撮影します。撮影する位置は飛行前にシステム内で指定しその通りに自動飛行するためユーザーはドローンの操縦をする必要はありません。

撮影した画像を画像認識プラットフォームへ与えると画像認識処理が実行され、牧草地内の雑草の位置を特定します。上記資料でピンクの枠で weed 1.00 と表示しているのがエゾノギシギシと呼ばれる雑草になります。

これを牧草地の画像全体に対して実行し、牧草地全体のセンシング、すなわち雑草の分布状況がシステムから把握できるようになります。

### STEP2: 除草剤散布のアクチュエーション
次にステップ2として、画像認識により特定した雑草位置に対して除草剤散布ドローンを飛ばし、雑草がある位置にのみピンポイントで除草剤を散布していきます。

除草剤散布ドローンについても、飛行はもちろん散布も自動で実行するためユーザーの操作は不要です。そのため飛行している様子を監視するだけでOKです。

以上がドローンを活用した牧草管理の仕組みとなります。

## ドローン x 画像認識技術

このセクションではステップ1の画像認識について触れたいと思います。

実際にドローン画像に対して画像認識を実行した結果の例が以下です。

![fig02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526000/d7d5be56-32c8-4b19-b234-263536e250f3.jpeg)

画像認識技術のうち、物体検出と呼ばれるモデルを学習してエゾノギシギシの位置を特定しています。

### 学習と推論の処理
モデルの学習においては、ドローン画像は5Kサイズなのでそのまま学習させると画像が潰れてしまいうまく学習できません。

そのためこの例では横9x縦6のグリッドに画像を分割し、グリッド画像として学習を実施しています。

牧草と見比べたエゾノギシギシは色がほぼ同じ緑で、葉の形状特徴しかないため認識が難しいところが初期の学習では見られましたが、オーグメンテーションと呼ばれる画像処理生成したデータを含めるなどの工夫により精度があがってきました。

引き続きモデルの改良やデータの工夫を実施しており、グリッドにまたがる雑草を統合する部分もできあがっています。

もちろん学習するにあたりアノテーションと呼ばれる正解データの作成が非常に重要で、ここは人手をかけて実施をしました。

学習モデルによる推論（認識処理）においては、グリッドごとに特に雑草の多い場所を赤の透過、少し多い場所を青の透過で示すことで草地品質の可視化を実現しました。これによって赤い場所のみ、または赤と青両方の位置にのみ除草剤散布ドローンが除草剤散布をすることでピンポイント除草を実現します。

ドローンの撮影の高さはおよそ25mで撮影することが多いです。
- できるだけ上空の高高度で撮影して、1枚の画像で広く捉えたい
- しかし、高すぎると画像認識が難しくなる
- 除草剤散布の幅も考慮する必要がある

という3点をあわせて決定しました。

## 画像認識をもとにした除草剤散布

![fig04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526000/71bdfea0-0bb1-c332-43f6-4017be70c392.jpeg)


こうした画像認識の結果を用いて、ステップ2として行う除草剤散布の様子が上の写真です。

駆除したい雑草に対して実際に散布したあと2週間後の様子を確認すると、十分な散布効果が見られました。

## おわりに

牧草地の雑草管理にドローンを応用する取り組みについて、今回ご紹介しました。

今後は画像認識の精度向上などに引き続き取り組み、農家さんにより便利に使ってもらえるように取り組んでいきたいと考えています。
フェールオーバーとダウンタイムについて【まじで超簡単に】

AWSの勉強をしているがよくこれらの言葉が出現するのでどう意味なのかをまとめておく。

## フェールオーバーとは
これは結構AWSの検定対策をしていると頻繁に出現される言葉。
フェールオーバーとは、例えばあるシステムで何か問題が起きて、そこから自動的に待機中のシステムに切り替わる仕組みのことをいう。

システムを運用していて、例えば1つのデータベースサーバーに何か障害があり停止してしまったら、そのサービス自体が止まってしまう。
それを防ぐために、データーベースサーバーを2つ用意したりする。

1つは、通常利用。もう一つは何かあった時のため用。

この通常利用のものから待機用に切り替わることをフェールーオーバーというらしい。


## ダウンタイムとは
ダウンタイム、これもAWS検定の問題ではよく出現する。
ダウンタイムとは、通常利用のサーバーが停止してから復旧するまでの時間のことをいう。

システムは24時間365日、常時稼働できることが期待されるが、それでも止まってしまうことがある。
この止まっている時間のことをダウンタイムというらしい。

もしシステムが停止してしまった時に、このダウンタイムをより短いものにしていち早く復旧するためにAWSのサービスを利用して様々な対策を講じる必要がある。。。らしい。
理想のリーダの特徴10選

#はじめに
本記事はqnoteアドベントカレンダー(https://qiita.com/advent-calendar/2021/qnote) 22日目の記事になります。

本記事では私が理想とするリーダの特徴10選を紹介します。
リーダと一口に言っても現場によって作業範囲は大きく変わると思いますが、今回はチーム開発をする上でのコミュニケーションに重点を置いています。
そしてあくまで理想なので、体現できていないじゃないか、と石を投げないでください泣いてしまいます。

#理想とするリーダの特徴10選
##1. 作業目的を明確にして具体的な作業指示をする
メンバを困らせない、迷わせない。
作業目的が明確に伝わっているとメンバの気づきや提案でより良い方向に進む可能性がある。
メンバの力量に応じて抽象的な指示にするのはアリ。

##2. 進捗遅れは自分の責任だと考える
後から叱責するのはダメぜったい。
指示誤りは無かったか、勘違いさせるような指示ではなかったか、情報不足ではなかったか、などを考える。

##3. 相談しやすい雰囲気作りをする
相談しづらい雰囲気のせいでメンバが悩みを抱え込んでしまうのは良くない。
状況次第だが1時間以上抱え込むなら相談してもらった方がお互いハッピー。
個人的には15分、長くても30分考えて解決しなかったら相談してほしい。

##4. 能動的にメンバの状況をヒアリングして相談に乗る
メンバは基本悩みを抱えていて、相談しづらい気持ちがあると思っていた方が良い。
能動的に進捗確認することで早めに問題点や悩みを吸い上げて軌道修正できるはず。

##5. メンバの意見も尊重し、内容次第でちゃんと取り入れる
メンバの意見は内容で判断する。
意見しても何も聞いてもらえないと思われたら手遅れ。

##6. 自分の判断ミスや間違いを素直に認める
要らないプライドは捨てる。

##7. 他チーム、他部署の人にもフランクに話してそれとなく相談事に乗る
気にかけてくれる人がいるだけで気持ちが楽になる。

##8. 褒める
自分も褒められたい。

##9. 情緒が安定している
穏やか大事。

##10. 「あとやっておくから今日は上がっていいよ」
一番カッコいい。

#さいごに
私のチームのリーダは他にもこんなカッコいいところがあるぞ！とか、リーダとしてこんなカッコいい立ち回りしてるぜ！などありましたら是非コメントで教えてください。
それらも取り入れてみんなで一緒により最強のリーダを目指しましょう。
Windowsの危険なファイルパス

# はじめに

派遣先の新入社員の人と一緒に簡単なツールをデバッグしていたら予想外の挙動を示したから、
調べてみたらWindowsのパスには予想外の仕様が含まれていることが確認できた。

あまりに予想外でびっくりしたからその驚きのまま日記にする。

# 何が起きた？

例えばテキストファイルの文字コードを一括修正するようなソフトを.Netで作ったとする。

適当なテキストボックスで変換元のフォルダを指定したいとすると、必要なことは…パスの存在確認だろう。
一緒にテキストボックスの挙動を確認していたら、「テキストボックスの内容がC:になったら、謎の場所を示すようになる」症状が発生した。

一体どういうことだろう？

# 調査結果

グーグルで検索したら公式ドキュメントに書いてあった。

https://docs.microsoft.com/ja-jp/dotnet/standard/io/file-path-formats

下記はほぼそのままの引用

| パス | 説明 |
|:--|:--|
| ```C:\Documents\Newsletters\Summer2018.pdf``` | ドライブ```C:```のルートからの絶対ファイル パス。 |
| ```\Program Files\Custom Utilities\StringFinder.exe``` | 現在のドライブのルートからの絶対パス。 |
| ```2018\January.xlsx``` | 現在のディレクトリのサブディレクトリにあるファイルへの相対パス。 |
| ```..\Publications\TravelBrochure.pdf``` | 現在のディレクトリと同等になるディレクトリにあるファイルへの相対パス。 |
| ```C:\Projects\apilibrary\apilibrary.sln``` | ドライブ```C:```のルートからのファイルへの絶対パス。 |
| ```C:Projects\apilibrary\apilibrary.sln``` | **```C:```ドライブの現在のディレクトリからの相対パス。** |

一番下は初めて知った。

# おわりに

この公式ドキュメント、最後にこんなことが書いてあった。

> 最後から 2 番目のパス形式を意図しているときに最後のパス形式を使用することが、Windows ファイル パス関連のバグの共通の源になっています。

**誰だってそうなるわ！**
Canvas APIでの描画をハックする


### 回想
子どもの頃、ちゃんとパソコンを触ったのは、小学校の授業で「一太郎スマイル」を使って絵を描いたことでした。
https://pc.watch.impress.co.jp/docs/article/990118/just.htm

Canvas API でも絵を描くことができます。　アプローチ方法は異なりますが、「二次元の空間に、自分が表現したいと思うものを描く」という点では「一太郎スマイル」での体験も Canvas API での体験も同じです。
Canvas API を使えば、あの頃の体験を蘇らせることができます。

### この記事の目的
Canvas APIでの描画速度を高めてくれる便利ハックや方法をご紹介します。
Canvas APIでは、描きたいものが複雑だったり、細かくなるほど、相応に手間がかかりがちかと思います。

3つほど方法をご紹介し、Canvas APIでこれから何かを描画しようとしている方、今後いつか描画するかもしれない方の力になれば幸いです。
### クリックした位置の座標を表示させる
![adee.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435918/3e70997d-3794-b6af-06ef-c2a1fb7baf63.jpeg)
Canvas のDOM要素は、左上を基点として座標で位置を取得できるようになっています。
それを利用し、クリックした位置を画面に表示させます。
そうすることで、描きたい線の距離や位置を捉えやすくなり、描画速度が高まります。

Reactでは、以下のような関数を `<Canvas />`タグに噛ませることで座標を取得できます。

```typescript
  const handleCoordinate = (
    e: React.MouseEvent<HTMLCanvasElement, MouseEvent>
  ) => {
    const rect = e.target.getBoundingClientRect();
    const x = parseInt(`${e.clientX - rect.left}`);
    const y = parseInt(`${e.clientY - rect.top}`);
    setCordinateX(x); // useState_1
    setCordinateY(y); // useState_2
  };

```


### 座標数値をコピーできるようにする
![スクリーンショット 2021-12-21 21.50.44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435918/87ba76e4-86f2-ccde-1792-28150aa23402.jpeg)

前項で表示させた座標(x,y)を、区切りのカンマごとコピーできるようにします。

```typescript
const handleCopy = (coordinate: string) => {
    // coordinate = 442,65
    navigator.clipboard.writeText(value);
};
```
こうすることで、コピーした値を、そのまま `moveTo()`メソッド や `lineTo()`メソッドの引数に貼り付けることができ、描きたい線の始点や終点などを簡単に捉えられるようになります。


### backgroundImageで、ベース画像を差し込む
stylesのbackgroundImage属性を用いて、描きたい対象の、元データとなる画像をCanvasに予め差し込んでおきます。
※縦横のサイズ調整は必要です。

```typescript
      <canvas
        width={800}
        height={680}
        id={"canvas"}
        style={{
          border: "solid 1px #383838",
          background: "#e9e9e9",
          backgroundImage: `url(${"/kduck.png"})`, // 描きたい対象の元画像を設定
          backgroundRepeat: "no-repeat",
          backgroundPosition: "100px",
        }}
        onClick={(e) => handleCoordinate(e)}
      />

```

こうすることで、Canvas APIによる、以下の赤線のような描画が可能になります。
![vvv.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435918/5f6aeb50-d2bd-300a-aa53-b63c7039de50.jpeg)
>画像参照： https://zukan.pokemon.co.jp/detail/054

ほとんど元のコダックの画像と同じ距離、曲がり具合を再現できているかと思います。
キュートなお腹の曲がり具合を完全に手中に収めました。

さらに前項まででご紹介した①座標を表示する機能と②座標のコピー機能と掛け合わせることで、座標の位置を正確かつ(比較的)迅速に取得し、描きたい元データにより忠実に描くことを可能にしてくれるかと思います。
(もっと良い方法あれば、ぜひコメント欄で教えてください)


### まとめ
ポイントは以下です。
①クリックした位置の座標を表示させることで、相対的に線の位置を決められるようになる
②表示した座標の数値をコピーできるようにすることで、Canvas APIの各メソッドの引数に値を渡しやすくする
③backgroundImageで元データとなる画像を挿入し、その上に描画を施していくことで描画の精度を上げる

①・②・③を組み合わせることで、ちょっと複雑な絵なども、効率的に描画できるようになるかと思います。
Mac(M1)で作ったFlutterアプリを実機iPhoneにインストールする。

## はじめに
Flutterで作成したアプリを実機にインストールしたので、その時の内容をメモとして残す。

## 実行環境
【PC】
　MacBook Air (M1, 2020)

【各SWバージョン】
　・macOS Big Sur 11.6.1
　・Flutter 2.5.3　（dart 2.14.4）
　・Xcode 13.1
　・VScode(AplleSilicon) 1.62.2

【iPhone端末】
　iPhone XR（iOS 14.8）

## 手順
① Xcodeでサンプルプロジェクトを実機にインストールしてみる。
② Flutterのアプリを実機にインストール。

## ① Xcodeでサンプルプロジェクトを実機にインストールしてみる。

#### Xcodeを開きAppleIDアカウントを追加する。

まずはXcodeを開いたら `Xcode` のタブを選択し、『Preferences...』をクリックする。
![Qiita-no063_img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/7064e843-bc0b-5444-47f1-1df3271fcdd8.png)

アカウントのタブを選択し、左下の『＋』ボタンよりApppleIDを追加する。
※AppleIDの入力を求められるため、ID／パスワードを入力する。
![Qiita-no063_img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/f85548a4-9068-bebf-e79a-270ef16e4c86.png)

### Xcodeでテスト用プロジェクトの作成 ＆ 実機インストール

Xcodeを開き直して、『Create a new Xcode project』よりプロジェクトを作成する。

`iOS`タブを選択し、`App`を選択したら『Next』をクリック。
![Qiita-no063_img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/3c379e8c-1f5a-2a96-249a-e2905d208ca4.png)

次の画面の入力内容は、今回以下の様に入力。
　※Teamsのところには先程追加したAppleIDのアカウントを選択する。
![スクリーンショット 2021-12-12 10.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/c6dbb45c-ccdd-88ca-34c2-86887db418d7.png)

Xcodeより作成したサンプルプロジェクトを実機で動かしてみる。
　・iPhoneをMacに接続する。
　・下図右上の赤枠部分より、実機のiPhoneを選択する。
　・下図右下の`DeploymentInfo`より、手持ちのiPhoneのiOSバージョン以下に設定する。
　・下図左上の青枠部分より、iPhoneにインストールされる。
![Qiita-no063_img7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/8d28cd85-9fd4-df42-42f7-cfe564c2cab1.png)

**上記によりiPhoneにインストール自体はされるが、アプリを開くにはiPhone側で設定が必要。**
『設定』＞『一般』＞『プロファイルとデバイス管理』よりアプリ開発者を信頼してあげればOK。


## ② Flutterのアプリを実機にインストール

XcodeでFlutterプロジェクト配下のios > Runner.xcodeprojを開き、`Signing & Capabilities`のタブよりTeamを選択する。（先程と同じアカウントのもの。）
![Qiita-no063_img8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/5dc597f0-b764-3096-0fc0-e17055d3436b.png)


**以下をVScodeのターミナル上で実行**
iPhoneをMacに繋いだ状態で、接続デバイスの情報を確認する。

```terminal:
flutter devices
*****のiPhone (mobile) • 00008020-001E3D1611E2002E • ios • iOS 14.8.1 18H107
```
※インストールコマンドで必要になるため頭文字（上記例だと`0`）を覚えておく。

一旦ビルドで作成されたファイルをクリーンする。

```terminal:
flutter clean
```

再度iOS用のビルドを実施

```terminal:
flutter build iOS
```

以下のコマンドより、実機iPhoneにインストールする。（もちろんiPhoneをMacに繋いだ状態で）

```terminal:
flutter install -d [頭文字]
```


## おまけ

**・アイコン変える方法はこちらのサイトを参考にした。**

https://dev-yakuza.posstree.com/flutter/app-icon/

**Developer Program に参加していないと１週間でインストールしたアプリは使えなくなる。。**

ちなみに、少し変更して再度ビルド使用とすると以下の様なエラーが出ることがある。

```terminal:
Encountered error while building for device.
```

上記エラーが出た場合、XcodeでFlutterプロジェクト配下のios > Runner.xcodeprojを開き、`version` や `build` をいじったら解決した。
Railsにおける秘密情報の管理をざっくり掴む

#概要
Railsを学習していると、秘密情報の管理方法がたくさんあってどれを使えばいいのか分からなくなってしまうことが多々ありました。
そこで、各バージョンで使用されている手法をまとめてみました。


#秘密情報とは何か
秘密情報とは、パスワード、トークン、暗号キーなど外部に公開すべきでない情報のことを指します。
例えばAWSのアクセスキーなども秘密情報に含まれます。


#結論
Rails5.2以降は`credentials`で管理をしています。
それ以前では、
Rails4.1:`serets.yml`
Rails5.1:`encrypted secrets`
などが使用されていました。

#credentialsの使い方
`config/credentials.yml.enc`にYAMLファイルとして暗号化され、秘密情報が保存されています。
ここで暗号化されたファイルを復元するには、`Rails new`の際に作成された`master.key`を使用します。

編集方法は、

```
% EDITOR=vim rails credentials:edit
```

VScodeで編集したい場合は、

```
EDITOR="code --wait" bin/rails credentials:edit
```

とエディタの指定を変更してください。
参考:[Rails5.2のrails credentials:editを好きなエディタで編集する(macOS)](https://qiita.com/zaki_zaki/items/dfc83a1fcd7dbc07af6b)

エディタ環境変数にエディタが指定されていないと以下のエラーが出てきます。
その場合は、`EDITER`に何かしら指定してあげましょう。

```
No $EDITOR to open file in. Assign one like this:

EDITOR="mate --wait" bin/rails credentials:edit

For editors that fork and exit immediately, it's important to pass a wait flag,
otherwise the credentials will be saved immediately with no chance to edit.
```

`credentials.yml.enc`の初期設定は以下のようになっています。

```:credentials.yml.enc
# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: e3a358ac35037fe43907a8e673e521ff838fko4mdd895b9c6f447efg3db24b008ce23aa22f1b5512c74fcdcf6587c879edaeb5eedf23f835887d8463e4eeda
```

あとは、設定したい秘密情報を設定すれば設定完了です。

```:credentials.yml.enc
 aws:
   access_key_id: hoge
   secret_access_key: example
```

```
irb(main):001:0> Rails.application.credentials.aws[:access_key_id]
=> "hoge"
```
Java Silver SE11 1章

# Java Silver SE11 1章
[黒本](https://www.amazon.co.jp/gp/product/4295007625/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。

## package
コンパイラやJVMはクラス名の重複を防ぐために、「完全修飾クラス名」で取り扱う。
(名前空間を提供する)

完全修飾クラス名(full qualified class name) FQCN　は先頭行に記述する。
`package パッケージ名.クラス名;`

* パッケージ単位でアクセス制御が可能になる
* 公開、非公開に分けることができる
* クラスは必ず何らかのパッケージに属する
 * （記載がない場合、無名パッケージに属するものと解釈される）
* ソースの先頭行に記述する
 * コメントは記述可能
* 無名パッケージに属するクラスは、<br>同じく無名パッケージに属するクラスからしかアクセスすることができない

### クラスのアクセス修飾子

| public  | 記載なし | private |
|:-------:|:------:|:-------:|
| 全て可能 | 同じパッケージに属するクラス | クラスには指定できない |

### 実際に検証
```java:Sample1.java
package chapter1.test2.sub;

public class Sample1 {

	public String greet() {
		return "hello";
	}
}
```
```java:Sample2.java
package chapter1.test2.sub;
// publicを記載しない
class Sample2 {

	public String greet() {
		return "hello";
	}
}
```
```java:Main.java
package chapter1.test2.main;

import chapter1.test2.sub.Sample1;
import chapter1.test2.sub.Sample2;

public class Main {

	public static void main(String[] args) {
		// sample1はインスタンス生成できる
		Sample1 sample1 = new Sample1();
		// エラー sample2はインスタンス生成できない
		Sample2 sample2 = new Sample2();

		// hello
		System.out.println(sample1.greet());
		// エラー
		System.out.println(sample2.greet());
	}

}
```


## import
FCQNの入力の手間を省くために、import文がある。
package文より後に記述する。
`import パッケージ名.クラス名;`

import宣言はあくまでも「入力軽減」であり、FCQNの記述を省略しているに過ぎない。

java.langバッケージに関しては、import文を記述しなくとも自動的にインポートされる。
（使用頻度がとても高いから）
例：System, Integer, String など
また同じパッケージに属するクラスも、インポート宣言する必要なく利用できる。

## Javaクラスを実行するコマンド
メモリ上にクラスファイルに相当するバイトコードを出力し、これを実行している。
（ソースファイルモードのこと）

javaコマンドでTest.javaを実行する場合
`> java Test.java`
`> java Test`

## エスケープ　
特別な意味を持つ記号をただの文字列として認識させる文字のこと。
記号の前に「¥」を記述する。

起動パラメータを実行した場合の例

| 起動パラメータ | 実行結果 |
|:----------:|:-------:|
| ¥" | " |
| a¥" | a"|
iOS 15にアップデート後いくつかのアプリで通知が来なくなった際の対応

##通知が来なくなったアプリ
- ＋メッセージ
- LINE

---

###症状
- メッセージが送られているにもかかわらず通知されない
- アプリを起動した時点でメッセージを読み込む

---

###実施したこと
1. 再起動
1. アプリ退避と再ロード
1. ツールによるリカバリーモード移行と復帰
1. ファームウェアマイナーバージョンアップ
1. アプリ完全削除と再インストール

---

###結果
上記、5番目で回復
情報処理安全確保支援士に合格しました。

令和3年秋に受験した情報処理安全確保支援士試験に合格しましたので、学習に使った教材やサイトなどのまとめを投稿します。

# 情報処理安全確保支援士とは

> サイバーセキュリティに関する専門的な知識・技能を活用して企業や組織における安全な情報システムの企画・設計・開発・運用を支援し、また、サイバーセキュリティ対策の調査・分析・評価を行い、その結果に基づき必要な指導・助言を行う者
[IPA公式サイト](https://www.jitec.ipa.go.jp/1_11seido/sc.html)より引用

上記の様に公式サイトでは記載されており、サイバーセキュリティ分野における国家資格です。
合格率は20%前後で推移する試験です。

# 試験形式
 試験は大きく4つに分けられます。

|  | 午前1|午前2| 午後1 |午後2|
|:------------|:-----------|:------------|:------------|:------------|
| 試験時間|50分   |40分   |90分　   |120分   |
| 出題形式    | 多肢選択式    |多肢選択式      |記述式   |記述式   |
| 問題数      | 30問        | 25問         |3問中2問を解答 |2問中1問を解答|



# 筆者のスペック

自分のスペックを貼っておきます。
・ 地方国立大卒
・ 今年の1月に基本情報を受験し合格
・ 今年の4月に応用情報を受験して合格
・ 高校の時の情報の授業は苦手でした。

紆余曲折あって今は中小SES企業で勤務しています。

# 試験に向けた勉強
### 午前2対策
応用情報に合格していたので、午前1は免除で対策していません。
よって、午前2対策からはじめます。

対策として使ったものは以下の2点です。

#### 情報処理安全確保支援士　ALL IN ONE　パーフェクトマスター

https://shuppan.tac-school.co.jp/koukou/books/joho-sc/

セキュリティに関する網羅的な知識を得られるので、まずはこの参考書を通して知識を習得していきました。
また、この参考書は午後問題も付属しているので、午後問対策にもなります。

#### 情報処理安全確保支援士ドットコム
https://www.sc-siken.com/

こちらのサイトは午前問題の過去問と解説をまとめているサイトです。
このサイトで、模擬試験を何度も行なって午前対策を進めました。

**参考書でインプットして、模擬試験でアウトプットを行うという対策を繰り返し行いました。**

### 午後1と午後2対策
**午後問題対策はひたすら過去問を解くことでした。**
参考にした教材は午前問題で取り上げた参考書以外に2点あります。

#### 2021 情報処理安全確保支援士「専門知識+午後問題」の重点対策
https://www.itec.co.jp/store/products/detail.php?product_id=3757

いわゆる「緑本」?と呼ばれる参考書です。この本は、各テーマごとに重要事項がまとめられて、そのテーマに沿った過去問が出題されています。テーマの解説が詳細かつ、過去問解説も丁寧です。問題量も多いので、おすすめです。

#### 令和03年【秋期】情報処理安全確保支援士パーフェクトラーニング過去問題集 (情報処理安全確保支援士試験)
https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C03%E5%B9%B4%E3%80%90%E7%A7%8B%E6%9C%9F%E3%80%91%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB%E8%A9%A6%E9%A8%93-%E3%82%A8%E3%83%87%E3%82%A3%E3%83%95%E3%82%A3%E3%82%B9%E3%83%88%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4297121689/ref=asc_df_4297121689/?tag=jpgo-22&linkCode=df0&hvadid=342604959589&hvpos=&hvnetw=g&hvrand=12669235444249188508&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-1249096062940&psc=1&th=1&psc=1&tag=&ref=&adgrpid=66342769422&hvpone=&hvptwo=&hvadid=342604959589&hvpos=&hvnetw=g&hvrand=12669235444249188508&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-1249096062940

こちらの参考書もおすすめです。過去問の数が豊富で、解説も付いているので重宝しました。


# 最後に
　IT業界に入ってまずは目標としていた資格を取得することができました。合格証書が届き次第、支援士の新規登録を進める予定です。次は来春の試験でネットワークスペシャリストの合格を目指していきたいと思っています！！

以上となります。
ありがとうございました。
クリスマスなのでBurpに少し祝って貰った


これはシーエー・アドバンス Advent Calendar 2021 25日目の記事です。

初めまして、シーエー・アドバンス（CAAD）技術統括本部セキュリティチームの @miya_zato  です。
今日ってクリスマスっていう日らしいですね、「12/25、空いてますか？（暗黒微笑）」って連絡が最近来てました、憎しみの連鎖は僕が今日断ち切ります。

普段の業務ではBurp Suiteというローカルプロキシツールを利用して脆弱性診断を行っています。
今日はこの相棒に、クリスマスを少し祝って貰おうかと思います。

同じチームの @miya_ken さんの記事を参考に、拡張機能を簡単に作成してみます。

参考記事
https://qiita.com/miya_ken/items/f88a051e4c6cfd2a67de

# さっそく祝って貰おう！
今回はpythonでクリスマス用の拡張機能を用意しました。
また、環境の準備や拡張機能の導入は参考記事に記載されているので今回は省略します。

## 拡張機能を読み込んだ直後にMerryChristmas
拡張機能を読み込んだ時に最初に表示されるのがここになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529348/30d06afd-827e-04ac-d60a-9636f5fedd04.png)

普段は何も表示されていないか、問題なく追加できた事を伝える文章が迎えてくれますが、今日はクリスマスです。
挨拶のようなMerryChristmasです。

```
from burp import IBurpExtender
from java.io import PrintWriter

class BurpExtender(IBurpExtender,ITab,IContextMenuFactory):

    def	registerExtenderCallbacks(self, callbacks):
        stdout = PrintWriter(callbacks.getStdout(), True)
        
        # ここでoutput出力時にメリークリスマス
        stdout.println("MerryChristmas")
```

## 例外が発生した時にMerryChristmas
拡張機能を読み込む際にエラーが発生した場合は、Errorsのタブでエラーの詳細が確認出来ます。
ここでもクリスマスが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529348/9ea07915-61b5-65eb-cd06-e43c9e2287f0.png)

先ほどの挨拶のような感じとは違い、ちょっと忙しさを感じますね

```
from java.lang import RuntimeException

class BurpExtender(IBurpExtender,ITab,IContextMenuFactory):

       def registerExtenderCallbacks(self, callbacks):

       # 例外を投げる時にメリークリスマス
       raise RuntimeException("MerryChristmas")
```

今回はpythonのraiseを利用して例外を発生させています

## Event logからMerryChristmas
拡張機能の読み込みが終わった後のEvent logからもMerryChristmasしてもらえます
![alert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529348/c004e014-f040-2a17-c1fa-e3097fd14596.png)
二度見しちゃうタイプのMerryChristmasですね、通りすがりのおじさんにボソッ言われて、「えっ...あのっ...！」って振り返る雰囲気を感じ取ってください

```
from burp import IBurpExtender

class BurpExtender(IBurpExtender):

    def	registerExtenderCallbacks(self, callbacks):
        
        # 指定したメッセージをBurp Suite警告タブに表示する
        callbacks.issueAlert("MerryChristmas")
```


## タブからMerryChristmas
拡張機能の読み込みが終わった後は様々な場所でクリスマスが出来ます。
![tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529348/de27d541-60f0-f689-4700-32d566553a6b.png)

一見すると気づかないような所から祝って貰いました。
あっ...MerryChristmas...というような控えめなMerryChristmasです。

```
from burp import IBurpExtender
from burp import ITab
from javax.swing import JPanel
from javax.swing import JMenuItem

class BurpExtender(IBurpExtender,ITab):

    TAB = "MerryChristmas"

    # コンポーネントの用意 
    def __init__(self):
        self.TAB_panel = JPanel()
    
    # タブの名前を付ける
    def getTabCaption(self):
        return self.TAB
    
    # タブがBrupに追加された時に使用するコンポーネントを取得する
    def getUiComponent(self):
        return self.TAB_panel

    def	registerExtenderCallbacks(self, callbacks):

        # Burp Suiteのウィンドウにタブを追加する
        callbacks.addSuiteTab(self)
```
タブの名前自体は変数にMerryChristmasを入れておくだけですが、
タブが追加された時にBurpが利用するコンポーネントの用意から、タブの名前の付け方から調べながらやっていてとても詰まってしまったので
日頃の勉強不足を痛感していました...（参考記事に助けてもらいました）

# まとめ
今回は4か所からクリスマスとして祝って貰えました、今回は拡張機能を読み込んでメッセージを表示させたりUIを追加する程度だったので、来年にはもう少し実りのある記事をかけるように頑張ろうと思いました。

それではみなさん、MerryChristmas！！！！！
トヨタ博物館で感じた技術の振り子

## 電気自動車の今昔

今、旅行で愛知に来ています。
トヨタ博物館に行って解説を聞いていたら、１００年ほど前の自動車黎明期は、現代の主流であるレシプロエンジン（いわゆるガソリン車）は20％ほどのシェアで、蒸気機関、電気自動車の方が人気だったそうです。
当時は、レシプロよりも蒸気の方がパワフルだったり、ガソリンスタンドも少なければ電気の方が補給しやすいなどの背景があったようです。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%AC%E3%83%BC%E3%83%BB%E3%82%B9%E3%83%81%E3%83%BC%E3%83%9E%E3%83%BC

現代では100年の時を経て、ガソリンから電気への転換を迎えています。
ここに至るまでには、夜間電力が余っている問題や電池の技術発展、環境性能の要求の高まりなど、いろいろな背景がありました。

## 技術の振り子

技術は振り子、あるいは螺旋だという表現を何度か目にしたことことがあります。
自動車の機関の話のように、昔廃れた技術が何かをきっかけに見直され、再燃する。

https://www.publickey1.jp/blog/18/2018.html

背景にあるのは、技術単体の進化というより周辺環境の方が影響していると思います。

- マシンスペックの向上
    - ボトルネックとなるポイントが変わる
- エンドユーザーの環境
    - スマホとか、VRとか
- ビジネス上の目標、収益構造
    - 広告収入、サブスク、マイニングetc
- OSS界隈の動向
    - 拡張ツールでさらに便利に
- セキュリティポリシーの変化
    - Cookie、HTTPSなど
- 法規制の変化
    - 緩くなる、キツくなる、解釈が変わる

## 技術の審美眼

でも再燃した時、過剰な期待を持って迎えられ、銀の弾丸かのように取り扱われることがある。
クラウド、ゼロトラスト、アジャイル、機械学習、マイクロサービス・・・思い当たる節はないでしょうか。

PoCでも有利な条件でやれば優位性が示せるのは当たり前で、上に挙げた観点でも適性があるのかも大事だし、それに加えて、

- 組織の体制
- 既存のIT資産との連携

といった組織内部の環境への適性も関わってくると思います。

## まとめ

- 螺旋の歴史を知っておくと面白い
    - 次の復活が訪れたときに理解が早い、正しい選択/使い方ができるはず
- 置き換えではダメ
    - 取り入れるにしても、従来のものと同じ思想ではないから、単なる置き換えではなくアジャストが必要
    - そのスコープは、従来考えていた範囲と同じとも限らない
- 最終的には諦める
    - 銀の弾丸はないと心得る
    - 従来のやり方も、どこかで諦めはあって当たり前に受け入れられているだけ
    - 新技術の諦めポイントを掴み、関係者を説得させる

ということで、これから電気自動車を購入予定ですが、従来の自動車の枠組みに囚われずに楽しんでみたいと思っています。
NuxtのPWA化で[pwa] [icon] Icon not foundと注意された

## version

**nuxt: 2.15.0
@nuxtjs/pwa: 3.3.5**

## エラー内容

NuxtでPWA対応するとこんなエラーが出た

```bash
WARN  [pwa] [icon] Icon not found in /app/static/icon.png
```

icon.pngが見つからないとのこと。

どうやらデフォルトのアイコン名がicon.pngらしい。
[https://pwa.nuxtjs.org/icon/](https://pwa.nuxtjs.org/icon/)

## 対処法
以下を設定するとなくなりました。

```bash
pwa: {
    icon: {
      fileName: 'hogehoge.png',
    },
  },
```

staticにicon.pngを入れてももちろん大丈夫です。

ドキュメント読むの大事。
OpsRamp 検知したアラートの処理（Alert Action）

# 概要

OpsRampでアラートを検知するとアラート一覧に表示されます。
表示されたアラートに対してインシデント化するのか、そのままクローズするのかなどの処理を選択する必要があります。
選択できる処理は下表のとおりです。


| No | Action | Description |
| :-- | :-- | :-- |
| 1 | Acknowledge | アラート内容を確認したら"Select"⇒"Acknowledge"にステータスを変更します |
| 2 | Create Incident | アラートからインシデントを作成します<BR>インシデント化するとインシデントIDが採番されます |
| 3 | Attach And Update Incident | 検知したアラートで既存チケットを更新します |
| 4 | Attach Incident | 検知したアラートを既存チケットにアタッチしますが、チケットは更新しません |
| 5 | Suppress | 同じアラートを抑制します。<br>抑制する期間を指定することも可能です。 |
| 6 | Unacknowledge | Acknowledgeから元に戻します |
| 7 | Unsuppress | Suppressから元に戻します |
| 8 | Run Process | Process Definitionで設定したフローを実行します |
| 9 | Close | アラートをクローズします |


※OpsRamp公式ドキュメント  

https://docs.opsramp.com/platform-features/feature-guides/alerts-templates/configure-alert-actions/




# アラートの状態と選択肢
アラートに対する処理を選択する際に、アラートの状態によって表示される処理が変動するので、確認できたケースを記載しておきます。
（公式ドキュメントに記載して欲しい・・・）


### [Select + 障害中]
アラートを検知すると最初にこの状態で表示されます。

![2021-1213-2110-45.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/34edb8ea-0383-68f0-2396-115ca0b23267.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Acknowledged |
| 2 | Suppress |
| 3 | Create Incident |
| 4 | Run Process |
| 5 | Heal |


### [Select + 復旧済み]
CPU使用率など自然復旧するアラートなどが該当します。そのままクローズするケースが多いと思います。

![2021-1221-2201-55.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/da041ef3-6ce9-f7c9-b390-e5c31b5835b8.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Close |
| 2 | Create Incident |



### [Suppressed + 障害中]

![2021-1213-2114-27.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/cc284b61-d7af-60b2-5c55-cd4320bc6c6b.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Unsuppress |
| 2 | Heal |

### [Suppressed + 復旧済み]

※確認中・・・（たしか、復旧すると自動でCloseしたようなような？）



### [インシデント化 + 障害中]

![2021-1221-2204-15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/59f2d607-fbce-d610-3331-d4a02ebb92fd.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Acknowledged |
| 2 | Suppress |
| 3 | Run Process |
| 4 | Heal |


### [インシデント化 + 復旧済み]

インシデント化したアラートが復旧すると、自動でクローズされるので何も選択することができません。




### [Acknowledged + 障害中]

![2021-1221-2208-42.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/4b20fa2f-ac40-15e4-3233-ad9bf7d7013b.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Unacknowledged |
| 2 | Suppress |
| 3 | Create Incident |
| 4 | Run Process |
| 5 | Heal |


### [Acknowledged + 復旧済み]

![2021-1221-2206-49.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/975743f2-aeff-36e3-5d73-eda446a1ccce.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Close |
| 2 | Create Incident |



### [Closed + 復旧済み]

![2021-1221-2208-04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/77adb234-e596-25d7-36c6-c4700e5bec5f.jpeg)

| No | 選択肢 |
| :-- | :-- |
| 1 | Create Incident |





おわり。
【Django】makemigrations しようとしたら query が clash したよというエラーが出た【Python】

# 【Django】makemigrations しようとしたら clash したよというエラーが出た

原因究明できてないけど一応回避はできたのでメモ

試行錯誤しながら model を作成していて、 makemigrations しようとしたら、↓のようなエラーが。

```
ERRORS:
users.User.foo: (fields.E303) Reverse query name for 'users.User.foo' clashes with field name 'main.Bar.user'.
        HINT: Rename field 'main.Bar.user', or add/change a related_name argument to the definition for field 'users.User.foo'.
```
何かしらでDBに不整合が起こって参照できなくなっているみたい・・・？

この時点でのUserモデルとmain.Barモデルはこちら(実際のものと少し内容変えてます フィールド名など)

```py:users/models.py
class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField("email", unique=True)
    username = models.CharField("username", unique=True, max_length=40)
    foo = models.ManyToManyField(Monster, blank=True)
    is_staff = models.BooleanField("is_staff", default=False)
    is_active = models.BooleanField("is_active", default=True)
    date_joined = models.DateTimeField("date_joined", default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = "username"
    EMAIL_FIELD = "email"
    REQUIRED_FIELDS = ["email"]

    class Meta:
        verbose_name = "user"
        verbose_name_plural = "users"
```

```py:main/models.py
class Bar(models.Model):
    ... 略
    user = models.ForeignKey('users.User', on_delete=models.PROTECT)
    image = models.ImageField(upload_to='image')
    ...
```

# 解決策

言われている通り、main.Barクラスのフィールド名を user → owner にしてみた。

```py:main/models.py
class Bar(models.Model):
    ... 略
    owner = models.ForeignKey('users.User', on_delete=models.PROTECT)
    image = models.ImageField(upload_to='image')
    ...
```

このあとmakemigrations するとうまくいった

```
$ python manage.py makemigrations
Did you rename monster.user to monster.owner (a ForeignKey)? [y/N] y # ←yes
Migrations for 'main':
  main/migrations/0003_auto_20211221_2131.py
    - Rename field user on monster to owner
    - Remove field user from record
Migrations for 'users':
  users/migrations/0002_user_set_mon.py
    - Add field set_mon to user
```

# 考察

おそらく、試行錯誤の段階でちょこまかmakemigrations実行したせいでDBがおかしくなった・・・？
user っていうフィールドが使用済みになって使えなくなっているような感じ
↑因果関係が全くつかめてないので憶測でしかない

ただのフィールド名被りならかぶってる元のやつの名前変えても解決しそうだが、、、
かぶり元がどこかわからん

ちょっとよくわからないので今日は寝ます。
鼻水止まらん。
「django.db.utils.ProgrammingError: relation "accounts_user" does not exist」の解決法

本記事は下記サイトに移行しました。
https://blog.rujuu.com/%e3%80%8cdjango-db-utils-programmingerror-relation-accounts_user-does-not-exist%e3%80%8d%e3%81%ae%e8%a7%a3%e6%b1%ba%e6%b3%95/
FastAPI+React+DockerでQiitaみたいなサイトを作ってみたい -1日目-

#背景
FastAPIを昨日触ってみた感触が良さそうだったので、勉強中のReactも含めてサイトを一つ作ってみる

*注意:勉強中の身のため、ちゃんちゃらおかしいことを書き始めるかもしれませんがご容赦*

#初期構成

なんとなくDockerは触ったことがあるので、今日はBackendの基盤を作るところまで

初期ファイル構成は以下

```
├backend
│　└　Dockerfile
└ docker-compose.yaml
```

``` Dockerfile:./backend/Dockerfile
FROM --platform=arm64 python:3.9-buster

WORKDIR /src
```

```yaml:docker-compose.yaml
version:'3'
services:
 backend:
  build:./backend
  volumes:
   - ./backend:/src
  ports:
   - 8000:8000
  tty: true # docker-compose up した後Exitしないように一旦
```
これだけ

# 初期設定
とりあえずこの状態でビルド

```sh:terminal
docker-compose up #buildしろって怒られるけど知らん
```
んで中に入る

``` sh:terminal
docker-compose exec backend bash
```

中に入ったらpoetryのインストールとinit

``` sh:bash
pip install poetry
poetry init
```
いろいろ聞かれるけど全部yes

んでfastapiとuvicornをインストール

```sh:bash
poetry config virtualenvs.in-project true
poetry add fastapi
poetry add uvicorn[standard]  
```
※uvicornの[standard]つけなくて、起動できず1時間死んだ

そうするとpyproject.tomlとpoetry.lockが./backend下に生成される。
一旦この状態でfastapiを動かしてみるために簡単なHelloWoldを

```python:./backend/api/v1/main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
 return {"Hello","World"}
```
んで起動

```sh:bash
poetry run uvicorn api.v1.main:app --host 0.0.0.0 --reload
```
ブラウザでlocalhost:3000にアクセスしてHelloWorldが表示されてたらOK
![スクリーンショット 2021-12-21 21.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328944/0e1850d8-9242-9909-9d96-54743ecb496b.png)

そしたら環境から抜けてお掃除。

```sh:terminal
docker-compose down
docker image ls
docker image rm [imageId]
#一応イメージも削除しておく
```

んで、今まで実行してきたコマンドを元にDockerfileを書き直す

```Dockerfile:./backend/Dockerfile
FROM --platform=arm64 python:3.9-buster

WORKDIR /src

RUN pip install poetry 
COPY pyproject.toml* ./ 
COPY poetry.lock* ./
RUN poetry config virtualenvs.in-project true
RUN poetry install

ENTRYPOINT ["poetry","run","uvicorn","api.v1.main:app","--host","0.0.0.0","--reload"]

```

んで再構築

```sh:terminal
docker-compose up
```

何事もなくApplication startup completeが表示されたらブラウザでも確認して今日は終わり。
プロデルで文字列操作

　リファレンスは[ここ](https://docs.utopiat.net/rdr/manual/primitive/string.htm)にある。

　以下，`【自分】`は文字列物を指している。

## 【自分】から【文字：文字列】を数える

　プロデルは1と１を同じように扱ってくれるなどの機能があるが，文字列を数える際にはどうなるか。

```プロデル
あは，「あア1１AaＡａ邉邊辺Aa🌵😕⌚⛅」
あから「あ」を数えるして，報告。
あから「1」を数えるして，報告。
あから「a」を数えるして，報告。
あから「邉」を数えるして，報告。
あから「Aa」を数えるして，報告。
あから「😕」を数えるして，報告。
```

　結果は次の通り。文字列ではきちんと区別される。また，`【文字】`は2文字以上でも良い。

```
1
1
2
1
2
1
```

## 【自分】からスペースを消す

　PerlのchompやPythonのstr.strip()のような手順である。

```
あは，「「
　　　  	
　　　  	
あ
　
	　　   　	
」」
あからスペースを消して，報告。
```

↑タブがうまく表示されないが・・・

　結果は以下の通り。改行，半角・全角スペース，タブは消える。

```
あ
```

## 【数：整数】文字，【自分】の先頭から消す

```プロデル
あは，「あいうえおかきくけこ」
3文字，あの先頭から消して，報告。
あは，「🌵😕⌚⛅」
3文字，あの先頭から消して，報告。
あは，「文京区駒場3-8-1」
「UTF-8」という文字コードであをバイナリ配列へ変換して，それを「Shift-JIS」という文字コードでバイナリ配列から変換して，3文字それの先頭から消して，「Shift-JIS」という文字コードでそれをバイナリ配列へ変換して，それを「UTF-8」という文字コードでバイナリ配列から変換して，報告。
```

　結果。なお3つ目は文字コードを変換したわけではないので注意（UTF-8の文字列を無理矢理Shift_JISで解釈したもの）。

```
えおかきくけこ
�⌚⛅
�区駒場3-8-1
```


## 【自分】から【文字：文字列】を探す

```プロデル
あは，「あいうえおかきくけこ」
あから「おか」を探して報告。
あから「おか」を前方向へ探して報告。
```

```
5
5
```

## 【自分】で【置換対象：文字列】を【置換後：文字列】へ置換する

```プロデル
あは，「あいいあいああいああいあああいあ」
あで「あい」を「あ」へ置換して報告。
```

```
あいあああああああああ
```

なお正規表現を使いたい場合は`正規表現`を使う。

```プロデル
正規表現であを「「あ{2,}|い{2,}」」から「あ」へ置換して報告
```

```
あああいあいあいあいあ
```

## 【自分】のローマ字

```プロデル
「あいうえおカキクケコ東京特許許可局」のローマ字を報告する
「ちちゃししゃっふじじゃぅゑゐ」のローマ字を報告する
```

```
AIUEO
TITYASISYAHHUZIJALU
```

　リファレンスにもある通りよみがなに対してローマ字を付与する手順なので，ひらがなのみ対応。
Kinectセンサーの認識が不安定な時にした事

先日、一年ぶりにKinectを使ったプロジェクトに挑戦しました！
しかし、Kinectが繋がらない。。。
同じような問題を抱えている方に少しでも参考になれば嬉しいです。

#デバイス
- Kinect V2 (Xbox One Kinect センサー)
- Windows 10

#問題
以下の写真のようにKinect v2 Configuration Verifierに繋いでもKinectが認識されない。
もしくは認識を一瞬してもすぐに認識されなくなってしまい、とても不安定。
<img width="400" alt="260499436_1508700429504169_2043830849458218539_n.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2413072/34ccd101-2718-1108-45e7-c807f2ec9e72.png">
<img width="400" alt="260730970_2975348332687802_1808122647516710639_n.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2413072/3da7bab4-e338-957c-d988-f3bba39fda53.png">

#最初にやった事
まずはこちらのサイトがとても分かりやすくKinectが繋がらない時の対処法をまとめていらっしゃるので参考にさせていただきました。https://www.next-system.com/blog/2018/01/24/post-1198/

私の場合、全て試してみたのですが、残念ながら繋がらず。。。

#次にやった事
これはハードウェアの問題ではないかとKinectのケーブルを購入。（Amazonで買えます）
新しいケーブルを接続。。。
それでも繋がらない。。。
一応上記のサイトの通り、デバイスのアンインストールを行い、再起動後に再接続を試みました。
###すると接続成功！！！
相当嬉しかったです:laughing:

#まとめ
私の場合、どのソフトフェアの対処法を試しても修正出来なかったこと、どうしてもKinectを使いたかったことから、新しくケーブルを買って試してみようと決心が出来ましたが、新しくKinectのケーブを買うのにはお金がかかる為、上記のサイトを基に、ありとあらゆる対処法を試してみた方が良さそうです。しかし、それでもどうしても繋がらない場合、Kinectのケーブル、もしくはKinect本体に問題がある可能性があるかもしれません。。。同じような問題を抱えている方に少しでも参考になれば嬉しいです。
Azure Application Gatewayを使ったIngressコントローラ(AGCI)をチュートリアルどおり実行してみた

## はじめに
「[チュートリアル: 新しい Application Gateway インスタンスを使用して新しい AKS クラスターのイングレス コントローラー アドオンを有効にする](https://docs.microsoft.com/ja-jp/azure/application-gateway/tutorial-ingress-controller-add-on-new)」
今日は、このチュートリアルをやってみようと思います。AKSのチュートリアルを実行してみて詰まった部分を追記してみました。

### 前提条件

前提条件がわかりにくいので以下の通りまとめました。
[Azure Cloud Shell](https://portal.azure.com/#cloudshell/)リンクからBash実行に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25104/d9d550f4-5363-a4f4-bcb2-1e66ea36067a.png)


#### ログイン

```bash
@Azure:~$ az login
Cloud Shell is automatically authenticated under the initial account signed-in with. Run 'az login' only if you need to use a different account
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXX to authenticate.

```

以下にアクセスしてenter the codeのXXXXXを入力
https://microsoft.com/devicelogin

しばらくログインが成功してsubscription情報が得られる

```
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "xxxxxxxxxxxxxxxxxxxx",
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "isDefault": false,
    "managedByTenants": [],
    "name": "Azure",
    "state": "Enabled",
    "tenantId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "user": {
      "name": "xxxxxxx@xxxxx.xxxx",
      "type": "user"
    }
  },
・
・
・
]
```

#### インストール

```bash
az upgrade
az aks install-cli
az extension add --name aks-preview
```

```bash
az version

{
  "azure-cli": "2.31.0",
  "azure-cli-core": "2.31.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {
    "ai-examples": "0.2.5",
    "aks-preview": "0.5.48",
    "ssh": "1.0.0"
  }
}
```

#### デフォルトのサブスクリプション変更


```bash
az account set --subscription xxxxxxxxxxxxxxxxxx
```

### 各コマンド実行

以下はチュートリアル通り実行する

```bash
# リソースグループ作成
az group create --name myResourceGroup --location canadacentral

# AKS Application Gateway イングレス コントローラー アドオンを有効にしてデプロイ
az aks create \
-n myCluster \
-g myResourceGroup \
--network-plugin azure \
--enable-managed-identity \
-a ingress-appgw \
--appgw-name myApplicationGateway \
--appgw-subnet-cidr "10.2.0.0/16" \
--generate-ssh-keys

# resouce group
az aks get-credentials -n myCluster -g myResourceGroup

# マニフェストをアプライ
kubectl apply -f \
https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml
```

### 確認

```bash
$ kubectl get ingress
NAME        CLASS    HOSTS   ADDRESS       PORTS   AGE
aspnetapp   <none>   *       20.104.4.39   80      7m32s
```

http://20.104.4.39/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25104/105d87d6-7d91-90da-a042-c19a924eb2c6.png)

## まとめ

簡単に作れるものの、そのまま作ってしまうとデフォルトでService CIDR 10.0.0.0/16が指定されてしまいす。同じサブスクリプション、ロケーションですでにIPを使ってしまっている場合、作成することはできないという問題があります。
次回は、これを解決する[チュートリアル](https://docs.microsoft.com/ja-jp/azure/application-gateway/tutorial-ingress-controller-add-on-existing)を明後日にやります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25104/cbdbddc3-f6af-1bbc-d893-a2a710706cf1.png)
Apacheでwebページ表示

仮想マシンを使用してApacheでwebページ表示する

## ポート番号を追加してポートを開放

80番ポートを開放する

```bash
firewall-cmd --permanent --zone=public --add-service=http
```

再起動

```bash
firewall-cmd --reload
```

## webサーバーのインストール・起動など

```bash
# apacheインストール
sudo yum install httpd

# apache起動コマンド
sudo systemctl start httpd

# 停止コマンド
sudo systemctl stop httpd

# ステータス確認
systemctl status httpd

# 自動起動のコマンド
sudo chkconfig httpd on
```

## webブラウザで開く

`http://localhost:8080/`にアクセス

![スクリーンショット 2021-12-20 22.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920178/3c0f8725-8128-5de7-ade8-2aa67a5345e2.png)


Apacheの初期画面が表示できる

## 表示したいhtmlファイルをドキュメントルート配下に配置する

### CentOSの公開ディレクトリの確認

`/etc/httpd/conf/httpd.conf`ファイルのDocumentRootに記述されているpathがwebサーバーで公開するディレクトリとなっている

中身を確認する

```bash
cat /etc/httpd/conf/httpd.conf
```

以下のようなものが記述されている

```
DocumentRoot /var/www/html/
```

上記の場合は`/var/www/html/`配下にhtmlファイルを置けばwebサーバーを通じて表示できる。


`/var/www/html`にindex.html作成して配置

![スクリーンショット 2021-12-20 22.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920178/651a07b9-2a58-24c4-d1ea-5337ffbdbad7.png)


作成したhtmlが表示できる

## まとめ

htmlファイルだけじゃなくて、Laravelなども動かしていきたい。