OmniAICreator/Qiita-1.07M huggingface dataset:
NETCONの「カテゴリMISC, 問題名MISC-2」

NETCON委員の竹田です。

先日、JANOG49で行われたNETCONの「カテゴリMISC, 問題名MISC-2」について解説したいと思います。

##問題文
2つの拠点を持つオフィスがあり、R1とR2はそれぞれの拠点のインターネット向けのゲートウェイとなっており、
NATを使用してそれぞれの拠点のローカルIPアドレスをグローバルIPアドレスに変換しようとしています。
しかし現状両拠点でNATがうまく動作していません。R1とR2で足りない設定を追加し、NATが正しく動くようにしてください。
Linux1(192.168.1.1)⇒R2(1.1.1.2)へのPing

Linux2(192.168.2.1)⇒R1(1.1.1.1)へのPing

がうまくいけば完了です。
また、拠点2のLinux2からLinux1に22222/tcpでSSHできるようにしたいと考えています。
R1に設定を追加して、Linux2から1.1.1.1に22222/tcpでSSHした際にLinux1に接続されるようにしてください。
![image2021-12-9_20-45-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/25153683-d55b-2398-7294-3a8e6d8def81.png)

## 解説
NATがテーマの問題となります。
まずは拠点のローカルIP⇒グローバルIPのNATがうまくいっていないので、これを解決していきます。
R1のConfigを見てみると以下のような設定がされています。

```sh
## インターネット向けIFの設定
interface GigabitEthernet1
 ip address 1.1.1.1 255.255.255.0
 no shutdown
 
## 拠点内部向けIFの設定
interface GigabitEthernet2
 ip address 192.168.1.254 255.255.255.0
 ip nat inside
 no shutdown
 
## NATする送信元IPアドレスを指定するaccess-list
access-list 1 permit 192.168.1.0 0.0.0.255
 
## NAPTの設定
ip nat inside source list 1 interface GigabitEthernet1 overload

```

ぱっと見るとなんか動きそうな設定なのですが、1行だけ設定が足りません。
NATのoutsideとなるIFには明示的にip nat outsideの設定が必要なので、以下の設定を追加する必要があります。

R1追加Config

```
## インターネット向けIFの設定
interface GigabitEthernet1
 ip nat outside
```

R2も同様の設定を追加してあげると、拠点のローカルIP⇒グローバルIPのNATが2つの拠点でできるようになります。

R2追加Config

```
## インターネット向けIFの設定
interface GigabitEthernet1
 ip nat outside

```

つぎに、Linux2から1.1.1.1に22222/tcpでSSHした際にLinux1に接続されるようにポートフォワーディングする部分の解説となります。
R1にはポートフォワーディングの設定が入っていないので、追加してあげる必要があります。
追加設定は以下の1行だけです。

R1追加Configその2

```
## Gi1に着信した22222/tcpの通信の宛先IPを192.168.1.1にして22/tcpに変換する設定
ip nat inside source static tcp 192.168.1.1 22 interface GigabitEthernet1 22222
```

もしくは

```
ip nat inside source static tcp 192.168.1.1 22 1.1.1.1 22222
```

というように、インターフェースではなくIPアドレスを指定して記述する方法もあります。
以上となります。

あまりひねりのない問題でしたが、楽しんでいただけたでしょうか？
次の機会があれば、もう少し凝った問題を作ってみたいと思います！

おつかれさまでした！
ポストモーテムを書いてみる


先日、障害が発生してしまって、初めてポストモーテムを知り、書くことになりました。
障害報告書を書くと凹みますが、ポストモーテムは、失敗からの学びや今後の改善につながる改善活動などの内容なので、とてもポジティブになりました。
もっと詳しく知りたいと思い、ポストモーテムについていろいろなサイトなどから調べてまとめました。

## ポストモーテム（事後検証）とは
ポストモーテムはGoogle 社が提唱している 「SRE」の本（SRE サイトリライアビリティエンジニアリング）に書かれているサービスやインフラの信頼性を支えるための技術の一つです。
障害など想定外のインシデントがあったときに振り返る事後検証のことです。

## 障害報告書との違い
障害報告書→会社や、顧客に障害の状況や内容を伝えるもの、
ポストモーテム→エンジニア内で再発防止や障害の振り返りや事後分析。
失敗からの学びが目的。エンジニアがわかる用語で書いていい。

## SRE サイトリライアビリティエンジニアリングについて
詳しく知りたい方は以下のサイトを見てみてください。
英語版は、オンラインで無料で公開されています。
[Google - Site Reliability Engineering](https://sre.google/sre-book/introduction/)
日本語版は、オライリー・ジャパンより出版されています。
[『SRE サイトリライアビリティエンジニアリング――Googleの信頼性を支えるエンジニアリングチーム』](https://www.oreilly.co.jp/books/9784873117911/)

一部抜粋
> 何が起こったのかを詳細に確認し、イベントのすべての根本原因を見つけ、問題を修正するか、次回の対処方法を改善するためのアクションを割り当てる必要があります。Googleは、障害を回避または最小化するのではなく、障害を明らかにし、エンジニアリングを適用してこれらの障害を修正することを目的として、非難のないポストモーテムの文化の下で運営されています。

英文）

> Postmortems should be written for all significant incidents, regardless of whether or not they paged; postmortems that did not trigger a page are even more valuable, as they likely point to clear monitoring gaps. This investigation should establish what happened in detail, find all root causes of the event, and assign actions to correct the problem or improve how it is addressed next time. Google operates under a blame-free postmortem culture, with the goal of exposing faults and applying engineering to fix these faults, rather than avoiding or minimizing them.

以下のサイトでポストモーテムについて書かれています。とても共感しました。

* ポストモーテムは、非難がなく、人間ではなくプロセスと技術に注目するもの。
* 人間は「修正」できない。環境を修正しなければならない。

https://ymotongpoo.hatenablog.com/entry/2020/01/27/173000


## ポストモーテムの書き方
今後ポストモーテムを書くにあたってテンプレートを作成しました。
随時改善し更新していく予定です。
———————————————————————————————
**タイトル** ：
**作成日**：
**作者**：
**ステータス**：Draft / In Review / Reviewed / Closed

**サマリ**：どんな障害だったか
**インパクト**：簡単な説明
**原因**：障害の原因
**影響**：ユーザーや収益への影響。非常に具体的で正確な数を記載
**対応**：障害に対してどんな対応をしたのか
**再発を防止する方法**：

* 予防（障害の再発をポジティブに防ぐにはどうしたらよいか
* 検出（同様の障害を正確に検出するまでの時間を減らすにはどうするべきか）
* 緩和（次回この種の障害が起きたときの深刻度や影響度の％を減らすにはどうしたらいいか）
* 修正（次回障害が検出されたときにどうすればより速く回復できるか）

**タイムライン**：
（1）始まった時間
（2）アラート発生時間
（3）インシデントが公開された時間
（4）調査開始から解決に至るまでの時間

## ポストモーテムサンプル(あくまでも架空の障害です！ほんとに)
**タイトル**：全サービス接続不安定
**作成日**：2022年1月19日
**作者**：日高
**ステータス**：Draft

**サマリ**：2022/1/19 17:43頃から全サービスに接続しづらい状態が持続していた
**インパクト**：外部の特定のPCから大量のアクセスがあった
**原因**：外部の特定のPCから大量のアクセスがあったことが原因。想定外の負荷、ディスクの容量不足 
**影響**：４０００リクエストがアクセスできなかった
**対応**：原因となっているPCからのアクセスを制限することで収束

**再発を防止する方法**：

* 予防：負荷テストをおこない、キャパシティを確保する
* 検出：定期的なモニタリングで予兆に気づくようにする
* 緩和：障害発生時にアラートがなるよう設定し、エンジニアが問題にいち早く気付けるようにする。Slackに障害発生の調査をはじめることを宣言し、状況を共有する。
* 修正:障害対応手順書を作成し共有し、いち早く復帰できるように準備しておく

**タイムライン**

* 1/19 17:43頃 3台あるWebサーバーのうち1台で負荷が高い状態を確認
* 1/19 17:45頃同一IPアドレスから大量のアクセスを確認
* 1/19 17:50頃負荷の高いサーバーを切断
* 1/19 17:55頃 WAFにて当該IPアドレスを遮断→一時的に復旧
* 1/19 18:00頃 当該IPアドレスの制限を解除し復旧 

## 参考文献

https://mixi-developers.mixi.co.jp/fault-handling-and-postmortem-6f46547b9b13

https://qiita.com/an_sony/items/0565ad980f9097c76d11
ヘルプデスクへのメール到達確認の問い合わせ

ヘルプデスク宛によくシステムからのメールが届かない、メールが正常に送信されたか調べて欲しいなどのお問い合わせがよくあります。
そんなときの対応方法をまとめました。

## １．メールアドレスに不備がないか確認
メールアドレスとして正しくない。スペルが間違っている場合があるので、確認します。


## ２．メール送信ログを確認

まずメールログを調べます。
当社では、AWSのCluodWatch Logsで収集しています。
AWSにはCloudWatch Logsというマネージドサービスがログ収集を行う機能として備わっています。
AWSのCluodWatch Logsでのメールログは以下のメニューから確認します。

* CloudWatch>ログ＞ロググループ＞ログストリーム選択
* ログイベントのイベントをフィルター項目に調べたいメールアドレスを入力します。
* 送信されるべき日時も分かればCustom項目から日時を絞って検索することもできます。
* 該当するメール送信ログの中でstatusと書かれたところを確認します。

**メールログ フォーマット**
Jan 28 12:22:19　　　　　　//処理の発生日時
mta13a　　　　　　　　　　//ホスト名
postfix/smtp[13557]:　　　　//プロセス名
9005E823A66:　　　　　　//キューID
to=<xxx@docomo.ne.jp>,　　//送信先メールアドレス情報
relay=mfsmax.docomo.ne.jp[xxx.xxx.xxx.xxx]:25,　　//送信先SMTPサーバ情報
delay=0.35, delays=0.09/0/0.07/0.2,　　　　　　　　//メール送信の処理時間
dsn=2.0.0,　　　　　　　　//SMTPステータスコード
status=sent　　　　　　　//送信結果

*statusの種類には以下の３つがあります。*

* status=sent　送信完了
* status=bounce　送信失敗
* status=deferred　送信リトライ

## 3.メール送信ログの内容をお伝えする
### sentの場合の対処法
sentになっていれば、メールサーバーから正常に送信されています。
こちらからは正常に送信されているため送信先のメールサーバ管理者の方にMessage-Id を伝えて、送信先側で調べてもらうしかないです。

### deferredの場合
deferredは、何らかの原因で再送がかかっている状態です。
エラーコードを見て内容を確認します。（相手のメールボックスが一杯、相手サーバーが障害を起こしている、など色々）
相手先のサーバーの問題が解消すれば到達します。

例）Host or domain name not found. Name service error for name=xxxx.net type=MX: Host not found, try again
→相手サーバば見つかりません。

### bounceの場合
bounceは何らかの原因でメールが戻ってきている状態で相手には到達していません。
たいていはメールアドレスが間違っているか、迷惑メールに分類されていることが多いです。
迷惑メールに分類されてスパム扱いされている場合はプロバイダに連絡して解除してもらいます。

ログにGoogleのMTAが表示されている場合は以下を案内します。

* Google管理者ヘルプページに書いてある手順でメールログを確認して******もらう。
[Google 管理者ヘルプページ](https://support.google.com/a/answer/55299?hl=ja)

* Googleのメールのフィルタを設定してもらう
Googleメールの設定ボタン(歯車)＞「すべての設定を表示」＞「フィルタとブロック中のアドレス」
リストの一番下の方にある「新しいフィルタを作成」でFrom: に「ブロックを解除したいメールアドレス」を入力
「フィルタを作成」をクリックし「迷惑メールにしない」にチェックし「フィルタを作成」をクリックして作成する

---

以上、ヘルプデスクへのメール到達確認の問い合わせ対応方法でした。何かの参考になれば幸いです。
NETCONの「Routingカテゴリの問題名 Routing-1 (30点)」

JANOG49 NETCON委員の塩沢です。JANOG49 NETCONにご参加いただきありがとうございました。
この記事では、Routingカテゴリの問題名 Routing-1 (30点) について解説します

##問題文
新入社員のあなたは、NWの勉強のため VyOSで検証環境を作りました。
IPv4とIPv6でそれぞれBGP Peer を張ろうとして設定をいれましたが、どちらもBGPネイバーが確立できません。
IPv4とIPv6でBGPネイバーが正常に確立できるように設定を修正してください。
※なお、予め eBGPのピアはお互いのconnectedのIPアドレスで張るということが取り交わされているものとします。
![netcon-shio.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/1cb7c809-58a8-2103-8ee7-5b3826812535.png)

## 解説
VyOSを用いた eBGPがテーマの問題です。この問題では、VyOS1とVyOS2において、以下の点に誤った設定がされていたのが原因でした。

IPv4
VyOS1

ネイバーのアドレスがconnected (192.168.10.2) ではなくLoopback (192.168.2.2 ) のアドレスに設定されている
remote-asに相手のAS番号 (65002) ではなく自身のAS番号(65001) が指定されている。
VyOS2

ネイバーのアドレスがconnected (192.168.10.1) ではなくLoopback (192.168.1.1 ) のアドレスに設定されている
IPv6
VyOS2

ネイバーのIPv6アドレスの省略位置が間違って設定されている
2001:db8::49:1 → 2001:db8:49::1


以上の点を修正するとBGPネイバーが正常に確立できるようになります。

解答例
VyOS1

```
# edit protocols bgp 65001
# rename neighbor 192.168.2.2 to neighbor 192.168.10.2
# delete neighbor 192.168.10.2 remote-as 65001
# set neighbor 192.168.10.2 remote-as 65002
```


VyOS2

```
# edit protocols bgp 65002
# rename neighbor 192.168.1.1 to neighbor 192.168.10.1
# rename neighbor 2001:db8::49:1 to neighbor 2001:db8:49::1

```

なお、今回ピアはお互いのconnectedのIPアドレスで張るという条件を付けておりましたが、loopbackアドレスのほうでもピアを張ることができます。その場合は以下の設定を追加する必要があります。

 Ⅼoopbackアドレスへのルートを追加
 eBGP multihop を2に追加
 update-source で Loopback を指定する



IPv4/IPv6どちらか一方のBGPネイバーが確立している場合は50％、両方のネイバーが確立できると満点としました。


また、VyOS1/VyOS2どちらもプレフィックスフィルターを設定していましたが、VyOS2において IPv6のプレフィックスリストが間違った値で設定されていました。今回はBGPネイバーが確立している時点で正解としましたが、5名の方がこの点も修正してご回答いただきました。



＊　＊　＊

IPv4のみPeerできていたという方やloopbackアドレスでピアを張ってしまった方も再チャレンジして満点の回答を提出いただくなど、多くの方に挑戦していただきありがとうございました。この問題を通して、少しでもBGPについての理解を深めていただく機会となりましたら幸いです。
laravel validation、第2引数を使ってのメッセージ設定

【環境】
windows10 64bit
php 7.4.27 
laravel 8 

こんにちは、今回はこんなケースです。

まずは画像を見てもらいましょう。
![case1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/75fd21a5-0890-9751-bf9a-c05fa8a48b0f.png)

こんな感じで設定を行って、
__➀　プレーヤまたはコンピュータのどちらにもチェックが入ってない場合にエラー
➁　名前の欄が未記入ならエラー__　
という内容を、laravelのvalidationを使って表示させようとするという内容です。

完成図はこんな感じ
↓　　　↓　　　↓　　　↓
![case2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/5bf868dd-b408-5693-0110-89a613b7dd9e.png)

最初はこんなもん簡単にできるやろうと思ったが意外な落とし穴にはまってしまって苦戦しました。


まずこれの設定ですが、こんな感じ

```html:index.html
{{-- エラーメッセージ --}}
@if ($errors->any())
@foreach ($errors->all() as $error)
<p> <strong style="color:red;">{{ $error }}</strong></p>
@endforeach
@endif
{{-- ここまで --}} 

/** ラジオボタンの設定 **//
  //プレーヤにチェック　      ＝　"1”を返す
  //コンピュータにチェック　  ＝　"0"を返す
  //どちらにもチェックがない　＝　nullを返す
/** 名前入力の設定 **//
  //入力したものを返す。ただし、未記入の場合nullを返す
<p><input type="radio" name="chara" id="chara" value="1">プレーヤ</p>
 <p>デーモン様のお名前を入力してください</p>
<input type="text" id="player_name" name="player">
<p><input type="radio" name="chara" value="0">コンピューター</p>
```

共通しているのは、nullが返ってきたらバリデーションでエラーを返すと考えて、
"required"で設定すればいいかなと思ったが、


```php:playersContoroller.php

        // バリデーション
        $validatedData = $request->validate([
            'chara' => 'required',
            'player' => 'required'
        ]);
```

そうするとこのように帰ってきます。
↓　　↓　　↓
![case3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/d0cb5cf2-cf7e-5e66-f02b-8f9f5fa9f403.png)


requiredの場合、このように設定されています。

```php:validator.php
'required'             => ':attributeは、必ず指定してください。
```             

:attributeはここでは、それぞれのname属性の名前が返ってきてます
（●　ラジオボタン　＝＞　　name = "chara"  ,   ●　テキストボックス　＝＞　name = "player"）

これでは見ている人から見れば、何のエラーかわかりにくいですよね？
ましてや、名前を入れてないことのエラーが　「必ず指定してください」っていうのもなんか変((+_+))


というわけで、各々のrequiredにメッセージを入れるという設定をしないといけません。((+_+))

けど、私の知っているの方法としては、
__●　ruleのディレクトリを設定する__ 
__●　middlewareのディレクトリを設定する__


この２つの方法です。ちょっと面倒くさいと思いました、、、、が
###「いやいや第2引数にメッセージを作ったらそれで完結するよ」
と教えてもらい、すんごく楽チンでした。

こんな感じです。



```php:playersContoroller.php(第2引数にメッセージ追加）
        // バリデーション
        $validatedData = $request->validate([
            'chara' => 'required',
            'player' => 'required'
], [    //ここから第2引数
            'chara.required' => '【エラー】：チェックしてください',
  　　　    'player.required' => '【エラー】：枠内を入力してください',  　  ここまで//  
    ]);
```




これでちゃんと設計通りにできました(^^)/
↓　　　↓　　　↓　　　↓
![case2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/92769b0b-7e1d-850e-e6a7-7b12bf850959.png)


なお、今回の内容は、laravelの青本に書いてるとのことです。基本さえわかっていたら、そこまでググらなくても出てくるよ、、と


まとめると・・・やっぱり基礎にもどる習慣をつけておこうと思ったのでした。

基礎を見なおす　→　なかったらググる

以上です。
WindowsFormにて開発したツールをMac OSでも起動させたい件

Monoとか.net coreを利用すればよい気がしましたが、そこまでやる気はないし、一応、.net 5を入れたら動くのは動くと思うので、
何かしないことにしました。
しかし、今後は以下の内容を生かしてやりたいですね。


Porting WinForms Application to Mac OS
https://stackoverflow.com/questions/22661589/porting-winforms-application-to-mac-os

Compile C# based Windows (WinForms App) application to run on Mac OS High Sierra or Mojave
https://stackoverflow.com/questions/53466621/compile-c-sharp-based-windows-winforms-app-application-to-run-on-mac-os-high-s

What is Xamarin.Forms?
https://docs.microsoft.com/en-us/xamarin/get-started/what-is-xamarin-forms
Vueの学習中に出たエラーの原因がしょうもなかった

どうも、とらのこです。
僕は今ですね、Udemyというオンライン学習プラットフォームでVue.jsのコースを学習しているのですが、その最中にエラーに引っかかって１０分ほど悩んでました。でも結果はとても単純で、「予約語」を使っていたからでした。
言語によらず起こり得ることなので、プログラミング言語を学習している人は一読しておくと良いかもしれません。

## どんなソースコードを書いていた？
Vue.jsの機能であるv-ifディレクティブを学習していたときの話です。

:::note info
ちなみにjsfiddleというオンラインIDEを使用して学習しています。環境構築せずに使えるのでプログラミング初心者にはオススメです！
:::

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
 <div id="app">
     <p v-if="isTrue">OK</p>
     <button v-on:click="switch">switch</button>
 </div>
```
v-ifを設定したタグは、ifというくらいですので「もしも○○だったら」というものです。

上記の例で言うと、「もしも”isTrue”の値が真（True）だったら、画面にOKを表示する」という意図を持ったHTMLのコードになります。

”isTrue”の値はVue.js側で定義しているわけですが、「switch」というボタンをクリックすることで、"isTrue"の値を変更できるようにしています。

```javascript:vue
new Vue({
  el: '#app',
  data: {
    isTrue: false
  },
  methods: {
    switch: function () {
      console.log() this.isTrue = !this.isTrue
    }
  }
})
```
まあ今回はVueのお勉強ではないので説明は割愛しますが、”isTrue”の値を定義したり、「switch」ボタンがクリックされたときの処理を定義しているものです。

## どんなエラーが出た？
さて、まずどんなエラーが出たかですが、以下に貼り付けています。

```
avoid using JavaScript keyword as property name: "switch"
Raw expression: v - on: click = "switch"
1 | <div id="app"> 
2 | <p v-if="isTrue">OK</p> 
3 | <button v-on:click="switch">switch</button>
  | ^^^^^^^^^^^^^^^^^^^ 
4 | </div>
```
ふむ、僕は英語は空っきりですが、１行目で「”switch”があかんよ〜」と言われていることだけはわかります。

JavaScript keywordをプロパティ名として使うのを避けてくださいよ、と訳せますね。

ここで、JavaScript keywordをググって一番上に出てきたサイトを何の気無しに見てみました。

https://www.w3schools.com/js/js_reserved.asp

そうしたら、ピーンと来ました。

switchって「Reserved Word（＝予約語）」じゃないですかー！

Java初めてやったときにめちゃめちゃ聞いたことあるー！

SE5年やってて今更引っかかるとか恥ずかしすぎるー！

と、あまりのしょうもない原因にSE歴6年目の僕は、情け無さに打ちひしがれました。

## 予約語ってなに？
以下のサイトに用語説明が書いてありました。

https://gimo.jp/glossary/details/reserved%20word.html

つまり、whileやif、switch等の基本的な制御文、制御構造で使用するようなものは、それ自体が意味を持つため、変数名などでは使っちゃいけませんよ、ということですね。

だいぶ初歩的な失敗でした。。

## どうやってエラーを解決した？
いたって簡単です。switchを名付けていたプロパティ名を別のものにするだけです。

僕の場合は、switchをisTrueSwitchに変更しました。

メソッド名を命名するときは、その処理の意図を考えてあげるといいですね。

※ちなみにHTMLにswitchがまだありますが、それはボタン名をswitchにしているだけなので、予約語には引っかかりません。

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<div id="app">
  <p v-if="isTrue">OK</p> 
 <button v-on:click="isTrueSwitch">switch</button> 
</div>
```
```javascript:vue
new Vue({
  el: '#app',
  data: {
    isTrue: false
  },
  methods: {
    isTrueSwitch: function () {
      console.log() this.isTrue = !this.isTrue
    }
  }
})
```
僕と同じようなミスをしてしまった方も落ち込まないで下さい！

今日１つ学びが増えましたよ！そうやって人間は成長していくものだと思って一緒にプログラミング学習していきましょう！
安心して！Gitでコミットエラー起きてファイルどっか行った気がしたときに確認すること

git commitでコミットエラーが起きて、 変更ファイルがどっか行って超焦りました。

どんなエラーだったか、どうやって解消したかを書いておきます！

## コンソール見たらこんな感じのエラーだった
```
error Delete `..` prettier/prettier
```
はて。。？？

## 結論ファイル復元できたし、コミット成功まで行ったよ
結論から言うと、コミット失敗したファイルは自動的に退避してくれていたので、以下を参考に復元することができました。

https://qiita.com/chihiro/items/f373873d5c2dfbd03250

```
git stash list
```
```
git stash apply [復元したい内容が含まれているインデックス番号]
```
2日くらいかかった修正なので、戻ってよかったです。。

## じゃあ、なぜコミット失敗したの？

では、なぜコミット失敗したのかですが、git commitを契機にeslintによるソースコードの静的チェックとPrettierによるコードフォーマットチェックが行われ、変更ファイル内にエラーが存在したためです。

昨日までの僕にはこの説明では何のこっちゃ分かりません。

↓eslintって何ですのん？

https://dev-yakuza.posstree.com/react/eslint/

↓Prettierって何ですのん？

https://dev-yakuza.posstree.com/react/prettier/

git commitでeslintやPrettierを実行できる機能があるの？と昨日までの僕は勘違いしていました。

git commit実行時にeslintやPrettierを実行するためには、huskyとlint-stagedというツールを使って実現しています。（また訳のわからない・・）

↓huskyとlint-stagedって何ですのん？

https://dev-yakuza.posstree.com/react/husky-lint-staged/

つまり、 処理順番をまとまると、以下の感じですかね。
1. git commit時に発生するGitフック「pre-commit」をhuskyでハンドリング
2. huskyの設定で「pre-commit」時の処理をlint-stagedに設定しておく
3. lint-stagedによってGitステージング上のファイルを対象にeslintやPrettierを実行

僕の書いたソースコードは③でPrettierによるフォーマットチェックでエラーになっていた訳ですね。

## じゃあどうやってコミット成功まで行ったの？
愚直にいくと、エラーを全て自力で解消するということになるのですが、そこはコマンドが用意されていました。助かった！

```
yarn run lint –-fix
```
--fixオプションをつけることで、フォーマットの自動補正してくれるようです。ここら辺参考にしました。

https://amg-solution.jp/blog/23498


## 参考リンク
NETCONの「Switchingカテゴリの問題名 Switching-1 」(20点)

JANOG49 NETCON委員です。

JANOG49 お疲れ様でした。NETCONを楽しんでいただけたなら幸いです。
それでは、Switchingカテゴリの問題名 Switching-1 (20点) について解説します。


##問題内容
![構成図_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/403fe2c2-58a9-4b65-1333-edcadd543baf.png)

先輩社員のあなたは新入社員Aの育成のため、検証環境を作成し、そこでLACPを使ってLAGを作成するよう新入社員Aに課題を出しました。
課題を出した翌日、新入社員Aより数ヶ所設定変更を行ったものの疎通が通らないと相談を受けました。
正常に通信ができるよう設定変更を行ってください。
※設定変更して良い機器はSW2のみとし、その他については疎通確認および設定確認のみとする。

(配点20)
SW1の初期config

```
interface Port-channel1
switchport trunk allowed vlan 10
switchport trunk encapsulation dot1q
switchport mode trunk
!
interface GigabitEthernet0/0
switchport trunk allowed vlan 10
switchport trunk encapsulation dot1q
switchport mode trunk
speed 100
duplex full
no negotiation auto
channel-group 1 mode passive
!
interface GigabitEthernet0/1
switchport trunk allowed vlan 10
switchport trunk encapsulation dot1q
switchport mode trunk
speed 100
duplex full
no negotiation auto
channel-group 1 mode passive
!
interface GigabitEthernet0/2
negotiation auto
!
interface GigabitEthernet0/3
negotiation auto
!
interface GigabitEthernet1/0
switchport access vlan 10
switchport mode access
negotiation auto
!
interface GigabitEthernet1/1
negotiation auto
!
interface GigabitEthernet1/2
negotiation auto
!
interface GigabitEthernet1/3
negotiation auto
```

SW2の初期config

```
interface Port-channel1
switchport trunk allowed vlan 10
switchport trunk encapsulation dot1q
switchport mode trunk
!
interface GigabitEthernet0/0
switchport trunk allowed vlan 10
switchport trunk encapsulation dot1q
switchport mode trunk
duplex half
no negotiation auto
channel-group 1 mode passive
!
interface GigabitEthernet0/1
switchport trunk allowed vlan 10
switchport trunk encapsulation dot1q
switchport mode trunk
duplex half
no negotiation auto
channel-group 1 mode passive
!
interface GigabitEthernet0/2
negotiation auto
!
interface GigabitEthernet0/3
negotiation auto
!
interface GigabitEthernet1/0
switchport access vlan 10
switchport mode access
negotiation auto
!
interface GigabitEthernet1/1
negotiation auto
!
interface GigabitEthernet1/2
negotiation auto
!
interface GigabitEthernet1/3
negotiation auto
```

## 問題解説
　この問題はLAG(link aggregation)に関する問題です。
ポートトランキングとかチャネルグループなんて言われる事もありますが、乱暴に言ってしまえばLAGは複数のイーサネット回線を束ねる技術です。
問題内容はLAGの設定ミスが原因でSW間で疎通が取れないということで、今回のような物理的な原因がない前提で進めた場合、新入社員Aが作業したSW2の設定を確認することになるかと思いますが、その確認時に設定値の異変に気が付けるかというのが今回の問題です。

　確認方法で一番簡単な方法はshow runを叩く方法です。
実行後、出力されるインタフェースの情報から両系ともpassiveになっていることに気が付けば、SW間でネゴシエーションが開始されず、疎通できなかったことが原因と切り分けられます。あとはSW1は設定変更できない点を踏まえて、SW2のLACPのモードをactiveに変更する趣旨の回答なら正解とし、それ以外については不正解としています。

　また、人によってはSW1のduplexがfull、SW2のduplexがhalfとなっている点まで気づいた方もいたかと思いますが、
こちらの不一致によるエラーカウンタ増加については最近だと影響がない場合がほとんどのため、採点には加味していない箇所です。



## 解答例
LACPの設定に誤りがあり、SW1、SW2ともにLACPモードがpassiveとなっておりました。
この設定の場合、LAGのネゴシエーションが行われないためリンクアップしません。
そのため、SW2のchannel-group 1 の設定をmode activeに変更することで解消しました。
変更内容は以下になります。

```
SW2(config)#
SW2(config)#
SW2(config)#int gi0/0
SW2(config-if)#channel-group 1 mode active
SW2(config-if)#exit
SW2(config)#
SW2(config)#
SW2(config)#int gi0/1
SW2(config-if)#channel-group 1 mode active
SW2(config)#exit

```
Power BI Serviceのレポート・アプリから「基になるデータ」をエクスポートできるようにする

# はじめに
Power BI Serviceのレポート・アプリでデータのエクスポートを実行しようとした際、「基になるデータ」を選択できない事象が発生した。
基本的な話ではあるものの、解決するのに意外と時間がかかったので、共有する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/e4f06385-0dad-c008-3544-31be575f682b.png)


# 解決方法
以下2つの解決方法がある。

## 1つ目：Power BI Desktop上で設定する
Power BI Desktopの「オプション」で設定を変更してから、Power BI Service上に発行する。(ファイルごとに設定変更が必要)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/8f189c1f-3497-5e0c-1d6f-c47dd944e04c.png)

## 2つ目：Power BI Service上で設定する
Power BI Service上で、「レポート」の「設定」をクリックし、以下のとおり設定を変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/aa07d20c-c130-eb14-b6d2-dacd272fb0fb.png)

# 補足
「データのエクスポート」画面の「詳細情報」のリンク先にも、同様の手順書が記載されている。
(意外とたどり着くのが大変かもしれないと思い、ここにも記載した)

https://docs.microsoft.com/en-us/power-bi/visuals/power-bi-visualization-export-data#set-the-export-options
【HULFT】作業用コマンド集

自分用のHULFTコマンドメモになります。

##### 管理画面表示（UTF-8）
```
utladmin -8
```
[HULFT管理画面起動コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/UX-OPE/Content/HULFT_OPE_UNIX/HULFTOpeCmd/StrtCmd_MngmntScrn.htm)

##### 配信・集信履歴
```
【配信履歴】
utllist -s
utllist -s | tail -5
【集信履歴】
utllist -r
utllist -r | tail -5
```
[配信履歴と集信履歴のリスト表示コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-OPE/Content/HULFT_OPE/HULFTOpeCmd/SndLog_RcvLogListDipCmd.htm)

##### 定義出力
```
utligen -f 【出力ファイルパス】 -i snd -id "*"
utligen -f 【出力ファイルパス】 -i snd -id 【HULFTID】
※管理情報　：　snd|rcv|job|hst|tgrp|fmt|mfmt|sch|trg|mail
```
[管理情報パラメータファイル生成コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-OPE/Content/HULFT_OPE/HULFTOpeCmd/MngmntInfoParaFGenCmd.htm)
[配信管理情報の項目一覧](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-HELP/Content/HULFT_OPE_WIN/HULFTSysMngmntInfo/SndMngmntInfo.htm)
[集信管理情報の項目一覧](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-HELP/Content/HULFT_OPE_WIN/HULFTSysMngmntInfo/RcvMngmntInfo.htm)

##### 定義反映
```
【定義登録】
utliupdt -f 【定義登録ファイルパス】
【定義登録（上書き）】
utliupdt -f 【定義登録ファイルパス】 [-r]
```
[管理情報バッチ登録コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-OPE/Content/HULFT_OPE/HULFTOpeCmd/MngmntInfoBatchReg.htm)
※各管理情報のパラメータの形式情報あり

##### 定義削除
```
utlirm -i snd -id 【HULFTID】
※管理情報　：　snd|rcv|job|hst|tgrp|fmt|mfmt|sch|trg|mail
```
[管理情報削除コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-OPE/Content/HULFT_OPE/HULFTOpeCmd/MngmntInfoDelCmd.htm)

##### 配信要求
```
utlsend　-f 【HULFTID】 -sync
```
[配信要求コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-HELP/Content/HULFT_OPE/HULFTOpeCmd/SndFCmd.htm)

##### 送信要求
```
utlrecv　-f 【HULFTID】 -sync
```
[送信要求コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-HELP/Content/HULFT_OPE/HULFTOpeCmd/SndReqCmd.htm)

##### 製品確認
```
utlhulversion
```
[製品確認コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/UX-OPE/Content/HULFT_OPE_UNIX/HULFTOpeUtl/ProdctConfrmCmd.htm)
[グレード](https://www.hulft.com/help/ja-jp/HULFT-V8/COM-FUN/Content/HULFT_FUN/Products/grade.htm)
※グレードによってファイルトリガ機能が使用できないなどがある

##### ファイルトリガ機能
[ファイルトリガ情報](https://www.hulft.com/help/ja-jp/HULFT-V8/UX-OPE/Content/HULFT_OPE_UNIX/HULFTSysMngmntInfo/FTrigInfo.htm)
※ファイルトリガ情報を反映させるためには、要求受付デーモンの再起動、またはファイルトリガ情報制御コマンドの実行が必要
[ファイルトリガ情報制御コマンド](https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-HELP/Content/HULFT_OPE/HULFTOpeCmd/FTrigCtrlCmd.htm)
[電源投入時の自動起動および停止方法](https://www.hulft.com/help/ja-jp/HULFT-V8/UX-ADM/Content/HULFT_ADM_UNIX/Env/auto_startup_exit.htm)

##### その他情報
[履歴情報エラーコード概要](https://www.hulft.com/help/ja-jp/HULFT-V8/UX-ERR/Content/HULFT_ERR_UNIX/ErrC_LogInfo/LogInfoErrCSum.htm)
[コマンド異常終了時の終了ステータス](https://www.hulft.com/help/ja-jp/HULFT-V8/UX-ERR/Content/HULFT_ERR_UNIX/TerminStatus/TS_UnsucTermCom.htm)
GitHubでマージしちゃった特定のプルリクを取り消したい！

前職まで、バージョン管理ツールはSubversion（SVN）を使っていたこともあり、恥ずかしながらGitHubを使ってRevertをするのは初めての経験でした。

コマンドラインでやる方法もあるのでしょうが、初めてのことはUIでやったほうが視覚的で分かりやすくミスがないかなと思ったので、MergeされたPull RequestをGitHubでRevertする方法を探して実施しました。

実際のGitHubの画面を見せながら、GitHubでRevertする方法を見ていきましょう。

## こんな方にオススメ
- GitHubを使って特定のPull Request（プルリクエスト）のMergeを取り消したい

## 具体的なステップ
1. closedのPull RequestからMergeを取り消したいPull Requestを選択
1. 対象のPull Requestの詳細画面でRevertボタンをクリック
1. Mergeを取り消すための戻しPull Requestを作成
1. 作成された戻しPull RequestをMerge

## closedのPull RequestからMergeを取り消したいPull Requestを選択
まず、GitHubのリポジトリにおいて「Pull requests」タブを開き、Mergeを取り消したいPull Requestを選択します。
今回は「masterプルリク_sample2」というPull Requestがそれに該当すると思ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/cd961aa8-c263-b7d6-d085-5f31d15926a0.png)

該当のPull Requestをクリックして、Pull Requestの詳細画面に遷移すればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/4cb76185-369b-c939-3a77-5de0f0afb23f.png)


## 対象のPull Requestの詳細画面でRevertボタンをクリック
下のほうに「Revert」ボタンがあるので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/93977b0d-f97a-eca3-204b-c50e9790564b.png)

## Mergeを取り消すための戻しPull Requestを作成
さきほどの「Revert」ボタンをクリックすると、Mergeを取り消すための戻しPull Requestを作成する画面に遷移します。

タイトルの変更や概要の追加をしたい場合は適宜行ったうえで、「Create Pull request」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/205cdc5e-f38a-ab65-0347-e1a453929e74.png)

戻しPull Requestが作成されましたね👍

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/37e966e0-9ed7-aca6-8d11-0e3253c2dbc1.png)


## 作成された戻しPull RequestをMerge
最後のステップとして、先程作成した戻しPull RequestをもってMergeしていきます。

ここで「なんでまたMerge？」と思う人もいるかもしれませんが、戻しPull Requestには「特定のPull RequestでMergeしたファイルを元に戻してよ」という情報が詰まっているイメージで、それをMergeすることで初めて取り消しが完了するという感じです。

戻しPull Requestに対して、特にコメントがなければ、「Merge Pull request」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/8bc6dd42-3242-ddcd-e32b-bdd8dcc54cb2.png)

確認を促す画面になるので、問題なければ「Confirm merge」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/69493886-3c87-1f27-4732-7ba005a16a02.png)


少しすると、Mergeが完了し、「masterプルリク_sample2」でMergeした内容を取り消すことができました🙌

はい、以上になります。

この記事を見て、同じ悩みをもった方の解決の助力が出来たら嬉しいです！！
Macにhomebrewでmaven（Javaビルドツール）をインストールする

mvnコマンド実行したらエラーなっちゃった。。macにmavenインストールしなきゃ！

と、こんな感じでJavaプログラムを実行するためのビルドツールであるmavenのインストールし忘れで、mvnコマンド叩いちゃうことありますよね？ありますよね！？

macにmavenをインストールするための方法としてhomebrewを採用しています。

## こんな方にオススメ 
- homebrewを使ってMacにmavenをインストールしたい

## 前提
- Javaがインストール済みであること
- Homebrewがインストールされていること

Homebrewのインストールがまだの方はこちらを参考にしてインストールしてください！

https://qiita.com/toranoko92114/items/10976bad711fd0987dd3

## mavenコマンドを実行したときのエラー
```bash
% mvn package zsh: command not found: mvn
```
業務でこれまで触ったことがないプログラム（mavenプロジェクト）の改修担当になったので、GitからCloneしてきていざ動作確認してみようと上記のコマンドを実行したらエラーが出ました。

そりゃそうですよね。Maven入れていないんですもん。

これまで触ったプログラムがPHP（Laravel）だったり、JavaでもGradleプロジェクトだったりで、mavenを入れてこなかったを忘れていました。

僕の端末はMacなので、さっそくhomebrewでmavenをインストールしていきます！

## homebrewでインストール可能かを確認する
homebrewでmavenを入れる際に、念のためインストール可能なリストにあるかを確認しておきましょう。以下のようにやります。

```
% brew search maven 
==> Formulae 
maven maven-completion maven-shell maven@3.2 maven@3.3 maven@3.5 
==> Casks 
mavensmate homebrew/cask-fonts/font-maven-pro homebrew/cask-fonts/font-maven-pro-vf-bet
```
普通に「maven」があるのでインストールできそうですね。

あとは、mavenの後ろに@3.2とか@3.5とか付いているものはバージョン指定してインストールしたいときに使う感じですね。

## homebrewでのmavenのインストール
なんのことはない以下のコマンドを実行するだけです。（上述したとおり、バージョン指定したい場合は@3.5とか付ける）

```
$ brew install maven
```
すると、数分したらインストールが完了します。

## インストールされていることの確認

```
% mvn -v
 Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
 Maven home: /usr/local/Cellar/maven/3.8.3/libexec
 Java version: 17.0.1, vendor: Homebrew, runtime: /usr/local/Cellar/openjdk/17.0.1/libexec/openjdk.jdk/Contents/Home
 Default locale: ja_JP, platform encoding: UTF-8
 OS name: "mac os x", version: "11.6", arch: "x86_64", family: "mac"
```
冒頭のように `zsh: command not found: mvn` がでなくなったのでOKですね👌
NETCONの「Tutorialカテゴリの問題名 Switching (20点) 」

JANOG49NETCON委員　嶋です。
JANOG49 お疲れ様でした。NETCONを楽しんでいただけたなら幸いです。
「Tutorialカテゴリの問題名 Switching (20点) について解説します。


問題文
VLAN間ルーティングができてないVLAN番号をすべて回答してください。
![スクリーンショット 2021-10-21 17.36.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/a4857f98-6f43-898f-6f55-1adff7bbf81e.jpeg)

採点基準について
SWのconfigを確認すると以下のようになっています

```
interface GigabitEthernet0/0
 switchport trunk encapsulation dot1q
 switchport mode trunk
 switchport nonegotiate
 negotiation auto
!
interface GigabitEthernet0/1
 switchport mode access
 switchport nonegotiate
 negotiation auto
!
interface GigabitEthernet0/2
 switchport access vlan 2
 switchport mode access
 switchport nonegotiate
 negotiation auto
!
interface GigabitEthernet0/3
 negotiation auto
!
```


interface GigabitEthernet0/3の設定が抜けていることが原因となっています

そのためSWのGi0/3にVLAN3のaccess vlan設定追加する必要があります。
ただ今回は問題文にある通り、VLAN間ルーティングができてないVLAN番号を答えればいいので
VLAN 3と答えれば正解となります。
以上です
@initBinderでString型のリクエストパラメータを空文字からNullにしました

業務で、『String型のformが未入力でsubmitされたとき空文字ではなくNullで受け取りたい』というケースが発生して、調べたらすぐ解決できたのでメモしておきます！

結論からいうと、リクエストパラメータを受け取って処理をするControllerクラス（@Controller）に、@InitBinderを指定するという対応です。

どういうことか、これから具体的に見ていきます。

## 実現したい内容（食べログを例に）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/5af46a34-c6ae-10b3-3e16-82dd21cfef69.png)

「エリア・駅」という項目、「キーワード」という項目は、入力必須項目ではないため、何も入力せずに検索ボタンが押されることは容易に想定できます。

ここで仮に、上記２項目が文字列を入力できるString型の項目ということにしましょう。（あくまで例なので注意です）

何も入力されずに検索ボタンが押されたとき、Springのデフォルトだとnullではなく空文字（””）がプログラム側に渡されてきます。

僕はそれをどうにか空文字ではなく、nullで受け取れるようにしたかったんですね。


## どうすればnullで受け取れるようになるか
```java
@InitBinder
public void initBinder(WebDataBinder binder) {
   binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
```

プログラム例のように、@InitBinderアノテーションをつけたメソッドをハンドラクラス（@Controllerクラス）に用意することで、フォームクラスやメソッド引数に対してリクエストバインディング処理を行う前に、このメソッドが呼び出されるようになります。

引数にはWebDataBinderを設定してください！

>WebDataBinderとは・・・
>Web リクエストパラメーターから JavaBean オブジェクトへのデータバインディング用の特別な DataBinder

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/WebDataBinder.html


また、new StringTrimmerEditor(true) とすることで、空の文字列を null に変換することができます。

あと、@InitBinderのあとにクラス名を指定すると指定したクラスにだけ適用できるようです。

ここではtabelogFormDtoというクラスを指定していますが、この場合はString型であるareaとkeywordがnullで受け取れるということですね。

```java
@InitBinder("tabelogFormDto")
public void initBinder(WebDataBinder binder) {
   binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

public class tabelogFormDto {
  /** エリア・駅. */
  private String area;
  /** キーワード */
  private String keyword;
  /** 日付. */
  private Date date;
} 
```

## @InitBinderは他にどういう場合に使えるか
パッと思いつくところでいうと、型変換したり、Springにデフォルトで用意されていないような入力値のバリデーション（検査）をしたいというときはとても有効だと思います！
HomebrewでIntelliJ IDEAをインストールする方法

皆さんは統合開発環境（IDE）は何を使っていますか？

僕は前職までWindows✖️Eclipseを使っていましたが、転職して貸与PCがMacだったこと、全社的にIntelliJ-IDEAが標準という点からIntelliJ-IDEAを使っています。

じゃあIntelliJ-IDEAをMacにインストールしましょう、となったときにHomebrew（--cask）でのインストールが簡単で便利だったので、インストール方法をまとめておきたいと思います！

## この記事でわかること
Homebrew（--cask）でIntelliJ-IDEAをインストールする方法

## 前提
これから述べるインストール方法は、お使いのMacにHomebrewがインストールされていることが前提となります。

インストールがまだ終わっていないという方はこちらを参考にHomebrewのインストールをやりましょう！

https://qiita.com/toranoko92114/items/10976bad711fd0987dd3

## IntelliJ-IDEAをインストールしよう
さあ、HomebrewでIntelliJ-IDEAをインストールしていきましょう。

まずはターミナルを開いて、IntelliJ-IDEAがインストール可能かを確認しましょう。

```bash
% brew search intellij                  
==> Formulae
intercal

==> Casks
intellij-idea  intellij-idea-ce 
homebrew/cask-versions/intellij-idea-ce19
homebrew/cask-versions/intellij-idea19
```
==> Casksの方に、intellij-ideaやintellij-idea-ceが出てきましたね。

どちらをインストールするのかですが、それぞれ以下の意味があります。

- intellij-idea … Ultimate Edition (有償版)
- intellij-idea-ce … Community Edition (無償版)

今回は無償版をインストールしていきます。

以下のコマンドを入力して実行しましょう。

```bash
% brew install --cask intellij-idea-ce
```
```bash
% brew install --cask intellij-idea-ce
Running `brew update --preinstall`...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
Updated 34 formulae.
==> Updated Casks
Updated 8 casks.

==> Downloading https://download.jetbrains.com/idea/ideaIC-2021.3.1-aarch64.dmg
==> Downloading from https://download-cdn.jetbrains.com/idea/ideaIC-2021.3.1-aarch64.dmg
######################################################################## 100.0%
==> Installing Cask intellij-idea-ce
==> Moving App 'IntelliJ IDEA CE.app' to '/Applications/IntelliJ IDEA CE.app'
🍺  intellij-idea-ce was successfully installed!
```
intellij-idea-ce was successfully installed と出ましたね。たったこれだけです。

念のため、インストールされているかも確認してみましょう。

```bash
% brew list --cask
adoptopenjdk11
alfred
chromedriver
dbeaver-community
docker
intellij-idea-ce ⇦ あった！
```
もしくは、LaunchpadのなかにIntelliJ IDEA CEのアイコンがあることでも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/fe4fb2d3-92b1-8695-14b4-6cad5fc50f14.png)


以上です！

IntelliJ IDEAはとても機能が充実していてプログラミングの助けになるツールなので、ぜひインストールしてプログラミングライフを豊かなものにしていきましょう🙌
【JavaScript】closest()(クロウセスト)の使い方 

#closest()とは

直近の親セレクタを指定できる。
###メリット：子要素が全て同じの場合、親要素(自分も含む)で個別に識別できる

※idは同じ値は設定できない

```html
<h2>見出し１</h2>
<div class="aaa">
	<ul class="common-tab">
		<li class="red" data-id="tab_1"><a>タブAAA</a></li>
		<li data-id="tab_2"><a>タブBBB</a></li>
		<li data-id="tab_3"><a>タブCCC</a></li>
	</ul>
<p class="tab_1">タブAAA</p>
<p class="tab_2">タブBBB</p>
<p class="tab_3">タブCCC</p>
</div>

<h2>見出し２</h2>
<div class="aaa">
	<ul class="common-tab">
		<li class="red" data-id="tab_1"><a>タブDDD</a></li>
		<li data-id="tab_2"><a>タブEEE</a></li>
		<li data-id="tab_3"><a>タブFFF</a></li>
	</ul>
<p class="tab_1">タブDDD</p>
<p class="tab_2">タブEEE</p>
<p class="tab_3">タブFFF</p>
</div>

<style>
.red { background-color:red;}
.blue { background-color:#0000FF;},
</style>
```

```javascript
 $('div.aaa ul.common-tab li').each(function(){
 	  if($(this).hasClass("red")){
          const target = $(this).data('id');
          $(this).closest('ul.common-tab').siblings(':not(.'+target+')').addClass('blue');
          $(this).closest('ul.common-tab').siblings('.'+target).addClass('red');
      }
 });


$('ul.common-tab li').click(function(){
	$(this).addClass('red').siblings().removeClass('red');
	const target = $(this).data('id');
    $(this).closest('ul.common-tab').siblings().removeClass('red').removeClass('blue').filter('.' + target).addClass('red'); 
     $(this).closest('ul.common-tab').siblings(':not(.'+target+')').addClass('blue');
});
```

#alert結果
```
⇛   test1

⇛   test2

⇛   test3

⇛   test4

⇛   test5 abc
```
IntelliJ IDEAにLombokを設定する


## IntelliJ IDEAにLombokプラグインをインストール
### 前提
お使いのPCにIntelliJ IDEAがインストールされていることが前提となります。

MacでIntelliJ IDEAがを使う場合はこちらにインストール手順をまとめてますので、まだインストールしていないという方は参考にしてみて下さい！

https://qiita.com/toranoko92114/items/5ba147a76344ca00a1d9

### Lombokプラグインのインストール手順
1. ヘッダメニューからIntelliJ IDEA＞Preferencesを開きます。
1. Plugins（プラグイン）を選択します。
1. Marketplaceタブの検索に「Lombok」と入力し、「Lombok」プラグインをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/89133f69-0022-b6f6-6cb6-c7713719aa6e.png)

## 依存関係の追加
ビルドツールにMavenを使っている方とGradleを使っている方がいると思いますので、そのどちらでも使えるように両方の設定を書いておきます！

### Maven
pom.xmlの<dependencies>タグの配下に以下を記述します。
```xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
　</dependency>
```

### Gradle
build.gradleに以下を追加します。

```gradle
configurations {
    compileOnly {
            extendsFrom annotationProcessor
    }
}

dependencies {
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}
```
テストクラスでもLombokを使いたい場合は上記に加えて、以下を記述することで可能になります！

```gradle
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
```
## Lombokの有効化
ここまでの設定では、まだLombokを完全に有効化できておりません。最後のひと仕事です！

1. ヘッダメニューからIntelliJ IDEA＞Preferencesを開きます。
1. Build, Execution, Deployment（ビルド、実行、デプロイ） > Compiler（コンパイラー） >Annotation Processors（アノテーションプロセッサー）を開きます。
1. Enable annotation processing（アノテーション処理を有効にする）にチェックを入れてOKをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/178b23e8-9f23-dbca-77db-d7599bc4508b.png)

はい、ここまで来たらLombokが使えるようになります！設定は以上です👍
rails 7.00における "cannot load such file --sassc"の解決法


rails7.0.0の影響によるcssの読み込みができなくなるというエラーに遭遇したので、同じ症状で悩まされている方のためになるかと思い、この記事を執筆しています。

railsの7.0.0が昨年に公開されましたが、以前のようにcssを適用させようとすると書き画像のようなエラーが出ることがあります。
![Inkedエラー画面_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/8799d448-a136-a3fc-ce92-0207c09e080a.jpeg)

このエラーの解決方法は

```ruby:Gemfile
46 # gem "sassc-rails"
```

のコメントアウトを削除して、bundle installをすることで解決することができます。
rails7.00以前はこのgemが環境構築の際に自動でinstallされていましたが、7.00以降では標準でインストールされないようです.
MySQL ツールについて

MySQLへアクセスしたり、データ管理などをする時にどんなツールを使っているかがチーム内でお話しされたことがあります。

私はWorkbenchとSQL Gateと言う韓国のものを利用していて、
他のメンバーたちはSequelやTablePlusも使っていました。
TablePlusはバックアップなどをやる時にオプションを自由に書き換えられるようにしているので、良いかと思いました。
今はWindowsを利用しているので、SequelやTablePlusを使う機会は無いですが、今後使ってみたいと思いました。:laughing:
WP Wordpress 開発時にローカル環境を簡単に共有する方法

https://and-ha.com/coding/local-wordpress/
https://reicode.info/localbyflywheel-livelink/

Wordpress開発をする時、ローカルで開発している内容がそのままWEBへ公開されるので、他の人が見たり、操作して見たりすることも可能です。
GAを理解する第1歩

欧州では、個人情報の管理についてかまびすしい。

Googleも巨額の制裁を受けており、EU発で世界の個人情報の扱い方が変わってきています。

cookieによる追跡について批判を受けて、代替手段を公開するも、専門的過ぎて誰も付いていけないなどの批判にさらされたようです。

真摯にそれらの言葉に耳を傾けないと、Googleは業界標準の座から滑り落ちてしまうでしょう。

また、Googleも広告収入が大事な収入源ですから、収入減で先細りしかねず、対応しないという事はあり得ないのではないでしょうか。

そういった意味では GoogleAnalytics（以下GA）も、新仕様に沿った情報の収集を始める場合に、見方・活かし方が変わってくるに違いないと思うのです。

新たな広告表示手法も発表されたし、ある意味でちょうどいいタイミングなのでは?、と思ってGAを基礎から再勉強しようと思います。

さぁ!　今日から新たな第1歩!
謙虚に勉強を積み重ねて行こう!


（新たな広告表示手法は https://www.nikkei.com/article/DGXZQOGN2606Q0W2A120C2000000/ 日経新聞「Google、ネット広告の絞り込みで新技術　批判に対応」を参考）
API Gateway の API バージョン指定（ベースパス）で Lambda の処理を分岐させる

## はじめに

ある API で v2 と v3 を並行稼働させることになりました

URL は以下の想定

- https://xxx.com/v2/some_items
- https://xxx.com/v3/some_items

v2 と v3 を個別の REST API やステージとして構築すれば簡単に実装できます

しかし、この API では API_KEY を使った使用量制限などを行っているため、
個別に実装してしまうと、 v2 と v3 で API_KEY を別々にしなければなりません

- 全ユーザー用に新しい API_KEY を発行する必要がある
- ユーザーは新しい API_KEY を使う必要がある
- 新旧どちらの API_KEY も発行できるようにシステム改修する必要がある

そこで、 v2 も v3 も同じ REST_API 、ステージに設定した上で、
ユーザーがアクセスしてきた URL によって処理を分岐させることにしました

これにより、ユーザーは同じ API_KEY のまま URL を変えるだけで移行が可能になります

この実装のため、検証した内容を残しておきます

## 同一リソースへのベースパスマッピング

以下のどちらへのアクセスも同じ API へ繋げなければなりません

- https://xxx.com/v2/
- https://xxx.com/v3/

API Gateway のベースパスマッピングでは、問題なく同一リソースに別のパスを設定できました

Terraform では以下のような形になります

```tf
resource "aws_api_gateway_base_path_mapping" "api-v2" {
  api_id      = aws_api_gateway_rest_api.some-api.id
  stage_name  = aws_api_gateway_stage.some-api.stage_name
  domain_name = aws_api_gateway_domain_name.some-api.domain_name
  base_path   = "v2" # ここだけ違う
}

resource "aws_api_gateway_base_path_mapping" "api-v3" {
  api_id      = aws_api_gateway_rest_api.some-api.id
  stage_name  = aws_api_gateway_stage.some-api.stage_name
  domain_name = aws_api_gateway_domain_name.some-api.domain_name
  base_path   = "v3" # ここだけ違う
}
```

## API Gateway から Lambda へのベースパス連携

既存の実装では Lambda でベースパス（ `/v2/` や `/v3/` の部分）は取得できませんでした
（ `/some_items` の部分は取得できましたが）

そのため、 API Gateway の `requestTemplates` に以下のようにパス情報を追加しました

```json
{
  ...
  "path" : "$context.path"
}
```

これにより、 Lambda 側で以下のようにベースパスが参照できるようになりました

```js
exports.handle = (event, context, callback) => {
  const path = event.path;
  ...
```

以下の AWS 公式ドキュメントを参考にしています

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference

## おわりに

特殊なケースなのであまり参考にはならないかも、、、

ただ、 Terraform で定義することで、こういうケースでも対応しやすかったとは思います
Azure Functionsのnodeでローカルで動かしアクセスすると「Microsoft.Azure.WebJobs.Script: Did not find any initialized language workers.」と出て落ちる

## 現象
dotnetのコマンドラインからプロジェクトを作成し、ローカルで動かしてみるもレスポンスは返ってこず、

``` bash
[2022-01-27T01:36:18.348Z] Host lock lease acquired by instance ID '0000000000000000000000008075DF07'.

Functions:

	HttpExample: [GET,POST] http://localhost:7071/api/HttpExample

For detailed output, run func with --verbose flag.
[2022-01-27T01:39:59.235Z] Executing 'Functions.HttpExample' (Reason='This function was programmatically called via the host APIs.', Id=6b911e52-02a6-4493-ba8b-953be86341b9)
[2022-01-27T01:40:43.719Z] Final functionDispatcher state: WorkerProcessRestarting. Initialization timed out and host is shutting down
[2022-01-27T01:40:43.757Z] Executed 'Functions.HttpExample' (Failed, Id=6b911e52-02a6-4493-ba8b-953be86341b9, Duration=44555ms)
[2022-01-27T01:40:43.757Z] System.Private.CoreLib: Exception while executing function: Functions.HttpExample. Microsoft.Azure.WebJobs.Script: Did not find any initialized language workers.
```

と出て、落ちる。

## 解決
nodeのバージョンは合わせる必要があった。
参照）
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-versions?tabs=in-process%2Cv4&pivots=programming-language-javascript#languages
3.x系では
> GA (Node.js 14、12、10)

なので、nvmでv14を指定。
動くようになった。

（まだまだAzureの情報がネット上に少ない…）
【Power Automate】変数入りのリンクを作成しハイパーリンクで投稿する

日々の業務自動化メモです。

Microsoft PowerAutomateで、変数(今回は日時)をリンクに入れ、ハイパーリンクとしてチャネルに投稿します。

たとえば週に1回そのページにアクセスするとき、指定の曜日にリマインダーとしてチャネルに投稿すれば、
その投稿からリンクを踏んでページにすぐにアクセスできるようになります。

#0. 例

例として週に1回「今日は何の日」にアクセスする場合を考えます。
https://www.nnh.to/01/27.html
※今日は1/27なので、「01/27」の部分を変数にします。

#1. スケジュール済フローを作成する
毎週月曜日にセットしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660844/84f0cdf9-d289-5e21-7c7d-f07ecc0ed0ce.png)

#2.日付変数を作成
「変数を初期化する」より、変数を作成します。
名前は```date```、種類は文字列とし、値は今日の日付を取得する式を「動的なコンテンツの追加」→「式」より入力して作成します。


```{式}
addDays(utcNow(),0,'MM/dd')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660844/abd90cc3-7bb0-048a-3817-5dea1c288e5a.png)


※参考：
https://szkhaven.com/2021/02/15/microsoft-powerautomate_date/

#3. メッセージ作成
Microsoft Teamsの「チャットまたはチャネルでメッセージを投稿する」を選択します。
投稿先の設定をして、メッセージを入力します。


メッセージをハイパーリンクにしたいので、html形式で記述できるよう、右上の```</>```マークを選択してコードビューにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660844/cd795750-cbb1-f9af-ee06-8b5eea5ac490.png)

こんな感じで書いておきます。変数は「動的なコンテンツの追加」から入れられます。

```html
<a href = "https://www.nnh.to/[ここに変数を挿入].html">今日は何の日？</a>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660844/48805125-ea3a-14dd-f48d-50bd08259786.png)

#4. 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660844/6cdbe43d-c4e1-e224-9969-33ff5fa6553e.png)

#5. 投稿してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660844/c2273964-dc16-1ad4-c1f4-0db62d87c325.png)


投稿できました。
【Unity】DeviceSimulatorインストール方法

# はじめに
Unity2021から変更があった様ですので、記録を残します。

# Unity2021
UnityEditorに標準インストールされています。
※知らずにパッケージマネージャーをひたすら検索しまくってました。

# Unity2020以前
1. パッケージマネージャの歯車ボタンをクリックし、AdvancedProjectSettingsを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/b7d017eb-c324-09f1-6ddd-b41c920faf2d.png)

2.EnablePreviewpackagesのチェックを入れ、I understand を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/8e6c4f45-d251-e4de-b372-a34d0b083acd.png)
vscode拡張 Edit csvで列移動

vscode拡張の「Edit csv」に大変お世話になっているのですが、列の位置を変更したいなと思った時に

* そもそも列移動できたっけ？
* カラムをドラックすればできそう？

と思ってやってみたのですが戸惑ってしまったのでメモとして
- - - 
# 列の移動はできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63965/e25bae7c-f16c-ecfe-7c14-5b375410cc52.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63965/a9ba004d-4d88-bf78-8c16-a96fd28d9cf7.png)
- - - 
# 動画
![カラムの入替.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63965/d94e7605-605f-b8e5-f6e8-843148eda1c0.gif)
- - - 
## 解説
1. カラムを選択（その列全てがハイライト）
    * バケツ押さないように注意
    * カラム名をクリックしてソートしないように注意
1. カーソルがパーになったらドラッグ開始
1. ドラッグの終了
    * カラムを入れ替えたい位置の縦線が太くなる(column1をcolumn2の後ろに移動したい)
        * column2の右側の線が太くなっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63965/838eca6e-473b-6831-0fd1-275565f5082e.png)
        * ドラッグ途中で、移動する対象のカラムの右側（右から左に移動する場合は左側）の線が太くなるが、そこでドラッグを停止しても移動できない
同一サーバー内でWordPressのドメイン変更

[基本環境](#基本環境)
[準備](#準備)
[サーバーデータのドメイン書き換え](#サーバーデータのドメイン書き換え)
[データベースのドメイン書き換え](#データベースのドメイン書き換え)
[公開フォルダ変更](#公開フォルダ変更)
[ブラウザで確認](#ブラウザで確認)
[参考記事](#参考記事)

#基本環境
wordpressデータはサーバー内に設置済み
サーバーファイルとデータベースは移管しない
旧ドメインと新ドメインはサーバー内に設置済み
旧ドメインから新ドメインへ切り替え
`old-example.com`→`new-example.com`

#準備
###バックアップ
ファイルのバックアップ方法（FTPなど）
データベースのバックアップ方法（PhpMyAdminなど）

###テキスト置換
テキストエディタでテキスト検索と置換（Visual Studio Codeなど）

###データベース置換
PhpMyAdminでテキスト検索と置換

#サーバーデータのドメイン書き換え

サーバーファイルの中にある旧URLを新URLに書き換える
`old-example.com`→`new-example.com`

###サーバーファイルをローカルにダウンロード

###コードエディタで表示
Visual Studio Codeでダウンロードしたサーバーファイルを表示
左メニューの虫眼鏡マークをクリック
上段に`old-example.com`を入力すると検索される
下段に`new-example.com`を入力し「すべて置換」マークをクリック

→書き換えられる
`old-example.com`と`new-example.com`を再び検索して書き換えられたことを確認

###サーバーファイルをアップロード

#データベースのドメイン書き換え
###データベースにアクセス
PhpMyAdminを使用する
###データベースをバックアップ
エクスポートでローカルにダウンロード
###旧URLを検索
「検索」タブから「検索する単語や値」に旧URLを入力し、「検索テーブル」で「全選択」→実行
検索ワード数、テーブル名をメモ
「表示」で詳細表示し、どのカラムに含まれているかメモ
置換するのにテーブル名とカラム名が必要となる

###置換する
「SQL」タブをクリック
置換する命令文

```
update テーブル名 set カラム名=replace(カラム名, "置換前の文字列", "置換後の文字列");
```

###置換後の確認
「検索」タブから「検索する単語や値」に旧URL・新URLを入力し、「検索テーブル」で「全選択」→実行
旧URL検索ワードが残っていたら、テーブル名、カラム名を確認して再置換

旧URL検索ワードが０、新URL検索ワード数が最初の旧URLと同じ数になったら置換が完了


#公開フォルダ変更
サーバーコントロールパネルにログイン
ドメインの公開ディレクトリを変更

#ブラウザで確認

***
#参考記事
`https://site-hikkoshi.com/1006/`
`https://www.webantena.net/wordpress/phpmyadmin-update-set-replace/`
MySQL IN句を用いて楽に絞り込みを行おう

## 概要

- MySQLのwhere句とin句を用いて同じカラムの複数条件絞り込みを楽に行う方法をまとめる

## in句を使わないと？？

- fooテーブルのidが　1, 5, 11, 15, 198の情報を表示したい場合通常下記のようなSQL句になる。

    ```sql
    select * from foo
    where id = 1
    or id = 5
    or id = 11
    or id = 15
    or id = 198;
    ```

- これでも一切問題は無いがorをたくさん記載しないと行けない。
- 改行したらしたで複数行に渡って記載しないといけないし、改行しないとなんとなく分かりにくいし。

## in句を使ってみよう

- 先程と同じ条件のSQLをin句を用いて記載してみると下記の様に記載する事ができる。

    ```sql
    select * from foo
    where id in (1, 5, 11, 15, 198);
    ```

- in句の後にカッコ書きで絞り込みたい数値を記載すれば良い。
- 上記はidによる絞り込み。文字列で絞り込みをしたい場合は絞り込み用の値を`"`でくくってあげればいい。

    ```sql
    select * from foo
    where str in ("文字列A", "文字列B", "文字列C");
    ```
PAKURI-THONの事始め

# はじめに

PAKURI-THONというguiのペネトレーションテストツールです。
少し使ってみたので、使い方をまとめてみました。



以下のreadmeを参考にしました。

https://github.com/01rabbit/PAKURI-THON


## 環境

|ゲストos |
|---|
|Kali-Linux-2021.1 |
|Metasploitable3 |


# インストール

```console
git clone https://github.com/01rabbit/PAKURI-THON.git
```

## 初期kaliの場合

初期kaliの場合、powershellempireとdockerをインストールする必要があります。

### powershellempire

https://qiita.com/sugiyama404/items/28042c100b352843af39

### docker

https://baitosakino-hashibirokou.com/kali_with_docker/

```console
sudo ./pkr3.sh
```

## インストール時のエラー

インストール時のエラーは以下を参考に一つづつ潰すといいです。

https://github.com/01rabbit/PAKURI-THON/wiki/Set-up-Docker

全てうまくいくと下記の画面になります。

![Screen Shot 2022-01-27 at 13.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/164fc768-eb3f-05ea-2903-bb0ca6555820.png)

```text
[postgresql]
user = root
password = password
host = localhost
port = 15432
database = pakuri
[nextcloud]
server = http://127.0.0.1:8080
username = pitto
password = kali
inforoom = Information
[webssh]
username = kali
password = a2FsaQ==
[empire]
username = empireadmin(empire default)
password = password123(empire default)
server = https://127.0.0.1:1337
listener = pakuri
port = 8088
```

### コンソール画面

![Screen Shot 2022-01-27 at 13.41.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/8224a728-1ff0-24a9-6673-42a0f4dd436a.png)

### フロント画面

```text
http://127.0.0.1:5555
```
にアクセスします。

![Screen Shot 2022-01-27 at 13.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/97a8038f-29aa-c7c2-77e2-909ad2a08673.png)

## nmapを使う

![Screen Shot 2022-01-27 at 14.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/3dfe64d1-a2b2-d8b4-05e5-4d7cc64a4119.png)

reconをクリック

![Screen Shot 2022-01-27 at 14.27.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/2ac2c661-bc0d-b35b-db3b-3e9ab8aaf872.png)

copyをクリック後、terminalをクリック
terminalで実行します。

![Screen Shot 2022-01-27 at 14.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/54b22a5e-6e0d-19df-2cac-2065f3342364.png)

スキャン完了

![Screen Shot 2022-01-27 at 14.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/4b3dbf81-8eb6-3a22-80bb-baffcf847eef.png)

## PowerShell Empire

![Screen Shot 2022-01-27 at 14.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/35f442fc-de46-7895-8c8e-744bc985cd70.png)

genarate stagerからテスト手法を選択します。

![Screen Shot 2022-01-27 at 14.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/4574f999-eb75-7527-50f8-54a5c08d4c0b.png)

うまく出力されています。

![Screen Shot 2022-01-27 at 14.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/be12a8a4-ef50-d22d-e927-0c7481c0f23b.png)




以上です。