OmniAICreator/Qiita-1.07M huggingface dataset:
データセンターの引っ越しで困った話

謎のアドベントカレンダー、第 22 話です。

## 社内システムを都市部のデータセンターへ引っ越し

社外向けサービスの運用を東京から引き取って名古屋で自前運用を始めるのを機に、その隣に社内システム用のラックを借りて引っ越すことになりました。

郊外のデータセンターはアクセスが悪いのと、社外向けサービスのシステムに（お互いのファイアーウォールとルーターを介して）LAN ケーブル一本でアクセスできる構成のほうが良いだろう、との判断です。

（その社外向けサービスは社内でも活用していました。いわゆるドッグフーディングですね）

社外向けシステムのうち、もともと郊外のデータセンターに置いてあったメールサーバー、テスト用サーバーなどは残していくことに。

ただし、ラックの設置位置を少し移動するために、「データセンター内での引っ越し」が必要になりました。

![server_racks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/7c27e361-73b4-2447-ee31-ec8d2a9e89ab.png)

## 社内・社外の両方の引っ越しの計画策定＆当日指揮

社内・社外両方のシステムに精通していないと計画は策定できないし当日の指揮も取れません。

結果、筆者が担当することになりました。

ただ、当日はどちらかのデータセンターに留まったまま指揮を取る余裕などありません。

自分でブツを運んで移動後に設定を切り替える必要があります。

（当時、それができる人がほかにいませんでした）

## ラックの前も後ろも大渋滞

ぎっくり腰が半ば癖になっているメンバーもいるので無理は禁物です。

そのため、人手は多数確保しました。

が、それが裏目に出てラック前後の通路が大渋滞しました。

一応、作業がバッティングしないよう、片方が前ならもう一方は後ろ、のつもりで計画を立てたのですが、社内・社外それぞれ時間を気にしつつ自分たちの作業を進めていたので、お互いに相手の領域に侵出していました。

もちろん、お約束の「ネジ山つぶし」も発生。

取り外しているうちに行方不明になるアクセサリー類もいくつか。

## なんとか社内用の機器を搬出して引っ越し先のデータセンターへ移動

引っ越し先のデータセンターに着いたところで携帯電話に何度も着信が。

郊外のデータセンターに残してきた、社外向けサービスのテスト用サーバーなどが通信できなくて困っている、とのこと。

こちらはこちらで社内用のルーターを新しいデータセンターの回線に合わせて再設定しないといけません。

（そっちでなんとかしてくれよ！）

悪戦苦闘の末、残してきたスイッチのうちの 1 台でポートベース VLAN の設定をクリアし忘れていることがわかりました。

（手順書に書いたのを調整中に消してしまったようです）

電話でその旨伝えるも、現地ではスイッチの設定方法がわからず、さらに悪戦苦闘が続いたのでした。

## その後の引っ越しでは

機器が増え重量が増し、ラックの本数も増えたため、さらに綿密な計画を立てて引っ越しすることになりましたが、相変わらず（社外向け・社内とも）計画策定＆当日指揮（＆ネットワーク機器やミドルウェアの設定調整）は筆者…。

社外についてはシステムリプレースと同時に引っ越す（機器の移動はせず引っ越し先のデータセンターに新しい機器を設置・設定する）わけですが、DR サイトが増えるなど（明日のネタです）さらに大掛かりになり、筆者が「プロジェクト管理者兼実務担当者」となってほぼ一人で（DR サイト含め）新旧 4 つのデータセンターを行き来することに。

（以前の話で出てきた郊外のデータセンターも一部残していました）

そんな状況では事件が起きないわけがなく、社内は上手く行ったものの社外向けサービスでリバースプロキシの設定ミスが発生し、一度切り戻して翌月再チャレンジすることに。


## さらに時は過ぎて

クラウド時代になりました。

（そして社内システムの引っ越し担当からは解放されました）

ネットワーク機器の設定できない問題、管理するネットワーク機器の数は激減したものの相変わらずゼロでは無いので、今も続いています。

VPN ルーターのリプレースが必要なところで、USB to シリアル変換ケーブルが行方不明になって泣いています。

😭😭😭

---

23 日目の記事に続きます。

- **[DR サイトの構築で困った話](https://qiita.com/hmatsu47/items/f218dbfbc14a5802b30f)**

https://qiita.com/hmatsu47/items/f218dbfbc14a5802b30f
Arduinoで電子工作に挑戦

![IMG_4022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/6204f742-21ee-3346-67b7-3d46449347da.jpeg)
参考書をもとに喋って移動するロボットを作ってみました。
![IMG_4019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/9dafe3f2-9c3c-2428-2625-23a4ba1a363a.jpeg)
タミヤからこんな工作キットが出されていたなんて。取り敢えず取説通りに組み立てて行きます。
![IMG_4020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/16cc5d51-c0dd-57c6-3cc3-f76648fd2522.jpeg)
参考書をもとにマイコンや音声マイク、LCDディスプレイなどを用意。![IMG_4024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/27e2e3e5-3b2f-59c6-e94f-335b556dff24.jpeg)
はんだ、久々です。ビビリなので吸取線も一応用意しました。
![IMG_4004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/747efd9d-ab50-5e20-c328-c3871a674be5.jpeg)
配線がこんがらないようにジャンピングワイヤーを色分けして組み、グルーガンなどでマイコンとバギー本体をくっつけます。
![IMG_4021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/073e2fea-3bd9-b4c0-4e54-078f6e511c6b.jpeg)
詳しい組み込み方や、プログラムはこちらを参考にさせて頂きました。とてもわかりやすく開発することができるので是非挑戦してみて下さい。
HTML タグまとめ

## bタグ　文字の強調 

## pタグ: 段落を付ける

## 見出し要素
h1,h2,h3...タグ

## htmlタグ
HTML文書であることを宣言する

## headタグ
どんなデータを扱うのかを伝える

## titleタグ
webブラウザに表示されるタイトルを設定

## bodyタグ
HTML本文のコンテンツを扱う。

## リスト 
olタグ: 1,2,3...を文頭に付ける。
ulタグ: ●を文頭に付けて文章を整理する
liタグ：ol,ulタグ内の文に付ける。

例)
olタグ
    liタグ　/liタグ
/olタグ

ulタグ
    liタグ　/liタグ
/ulタグ
## aタグ
違う場所に移動したい際に使用するタグ
aタグの後ろに移動先のリンクを入力する
例) a href=https//google.com

## imgタグ
画像を付ける際に使用する
img src=" "
src以下に出力する画像の名前やURLを入力する
alt属性で出力画像に関する情報を文字で伝えられる。

## divタグ
様々な要素をグループ化できる。コンテナの様なもの。

## spanタグ
spanで挟んだ文字のスタイルや色を変えたい際に使用

## hrタグ　
水平線を作る

## brタグ
改行できる

## supタグ
添え字等を表現したいときに使用する

## subタグ
化学文字等で使用されることが多い

## main
主要コンテンツがmainの中に入れる際に使用する

## nav 
他の場所に飛ぶことができる部分をまとめる際に使用するタグ。

## header
ページの上に位置するnavをまとめる際に使用可能

## footer 
ページの下に位置するnavをまとめる際に使用可能

## tableタグ
表作成。データを整理し、分かりやすく表示する。

## tdタグ
テーブル内のデータを表示する際に使用する。
例)
tableタグ
    tdタグxxxxxtdタグ
/tableタグ

## trタグ
テーブル内に行を追加し、データを整理する

tableタグ
    trタグ
        tdタグ xxxxx /tdタグ
     /trタグ
/tableタグ

## thタグ
テーブルにヘッダーを追加
tableタグ
    trタグ
        thタグ xxxx /thタグ
        tdタグ xxxxx /tdタグ
     /trタグ
/tableタグ

## rowspan
行の長さを設定
例) th rowspan="2"
2列文使用することができる

## colspan
列の長さを設定
 th colspan="2"

## Formタグ
入力欄やチェックボックス、ボタン機能を受け入れ、webサーバーに送信するコンテナ。
action属性で、どこに入力された情報を送信するのかを設定する。
methodでフォームを送信する際に使用するHTTPメソッド(GET、POST等）を指定

formタグ　action="送信先"

## inputタグ
入力欄を生成
inputタグ　type = number

typeでどんな入力欄にするのか設定できる。
type = textで文字列を入力できる欄が完成
type = numberで数値を受け入れられる欄が完成。
沢山種類がある。
placeholder：入力欄にどんなデータを入力できるのかを明確化可能
name属性で、name属性がないデータを送信しないようにするためにある。
value属性で、ボタン上で表示する値を設定。また送信したデータがどれか分かるようにできる
radio属性で一つしか選択できないようできる。name属性を同じ情報にすることで、グループ化できる。

例) 
inputタグ　type = number name="q" placeholder = "数値を入力" 

labelタグ　for = "s"
inputタグ　type = radio name="q" placeholder = "数値を入力" id = "s" value = "s"

labelタグ　for = "m"
inputタグ　type = radio name="q" placeholder = "数値を入力" id ="m" value ="m"

label タグ　for = "sm"
inputタグ　type = radio name="q" placeholder = "数値を入力" id ="sm" value ="sm"

## labelタグ
文とその他を関連づけられる。
例えば、"Do you like cake?"とチェックボックスを関連づけることができる。

id 属性で、入力した情報を他と区別し、独自のデータとする。
for 属性で、関連づけたい要素idを設定。

labelタグ for = "cheese" Do you like cheese? /label
inputタグ　type = "checkbox" names= "cheese" id="cheese"

## buttonタグ
ボタン生成
例)Buttonタグ type="submit"　送信　/Buttonタグ
submitで送信するボタンになる。

## selectタグ
リスト化できる
label for = "meal" choose meal /label
select name = "meal" id="meal"

/select

## option
selectタグでデータを表示できる

option value="sake" 鮭 /option
option value="maguro" マグロ /option


参考記事
http://www.htmq.com/html/indexm.shtml
Flutter 次のイベントループまで一定時間実行を遅らせる

ビルド後の処理で`widget`をレンダリングしてからアクセスするには`Timer`で関数を呼び出してもいいのですが`await`を入れたい場合はいくつかの方法があり、

```dart
Future(() { /* FutureのAPIかasync/awaitを使う */ });
// mainを抜けた時点で実行されるのがmicrotask、useEffect内でasync/awaitを使用したい時など
Future.microtask(() { /* 処理内容 */ });
// 遅延処理
Future.delayed(Duration.zero, () {　/* 処理内容 */　});
```
`Future`/`Future.microtask`/`Future.delayed`を利用するか、

```dart
// riverpod更新時にNavigator.of(context).pushで処理が衝突する現象を回避
WidgetsBinding.instance.addPostFrameCallback((_) { /* 処理内容 */ });
// import package:flutter/scheduler.dart; が必要
// WidgetsBindingと同様の処理
SchedulerBinding.instance.addPostFrameCallback((_) { /* 処理内容 */ });
// import 'dart:async';
scheduleMicrotask(() { /* 処理内容 */ });
```
`WidgetsBinding`/`SchedulerBinding.instance.addPostFrameCallback`/`scheduleMicrotask`などがあります。

どれを利用しても上手く動いてくれますが、よく目につくのは`Future.delayed`です。

実行までの`context`や`widget`のビルドを保証して次のアクセスを円滑にしてくれます。`Flutter`内部の問題を処理しながら動いてくれるのは後者の方ですが、見やすさで前者を利用される方が多いような気がします。

それぞれの動きを検証
```dart
import 'dart:async';

void main() async{
  print('1');
  await Future((){
    print('2');
    Future(()=>print("3"));
    scheduleMicrotask(() => print('4'));
    Future.microtask(()=>print("5"));
    new Future.delayed(new Duration(seconds:1),
                       () => print('6'));
    new Future(() => print('7'));
    new Future(() => print('8'));
    print('9');
  });
  scheduleMicrotask(() => print('10'));
  print('11');
}

// 1　2　9　11　4　5　10　3　7　8　6
```
`Future.delayed`でループしている動き
```dart
import 'dart:async';

  Future<void> main() async {
   int _count = 0;
   // 3秒ごとにカウントして行き、3回目に終了
   while(true) {
     await Future.delayed(Duration(seconds: 3));
     _count++;
     print("$_count回");
     if (_count == 3) {
      break;
    }
   }
 }
```
記憶の構造からプログラミング学習を考える

この記事はラクス Advent Calendar 2022の17日目の記事です。
昨日は@R9rT9tさんの[新卒エンジニアがコードレビューから学んだ二つの学び（Strategyパターン編）](https://qiita.com/R9rT9t/items/43050aff322c7a58e21b)でした。

---

ここ最近、認知バイアス[^1]とか面白いな〜と、脳科学系の読み物を読んでいました。そこにプログラマにどんぴしゃな↓を見つけ、脳の働きとか知っているとプログラミングに（主に学習）に活かせそうだな、と思ったので紹介したいと思います。

https://www.manning.com/books/the-programmers-brain

## はじめに

プログラミングでもなんでも、初学時に行う学習方法は人それぞれあるかと思います。僕はとりあえずやってみる派で、いじりつつ理解していくのを好んでいます。本は好きで、技術本も読みますがそこれだけで学習した気にはなりません。
と、自分のスタイルを書きましたが、ここでは学習法の内容や良し悪しについては触れません。習熟者の脳（記憶）がどう働き使われているのかを考察し、初学者が学習の末に目標となる姿を探ります。その題材として、コードリーディング時の脳を見ていきたいと思います。

## 記憶のしくみ

まずは記憶について説明していきます。僕がざっくりしか理解していないので、こんな感じなんだくらいで見ていただけると🙇‍♂️
科学的に記憶には以下の3つの種類があるとしているようです。

- working memory（日本語: ワーキングメモリ、感覚記憶など）
　　-　瞬間瞬間に人が影響を受ける物全てが書き込まれ、瞬間的に処理（フィルター含め）される
- short-trem memory（日本語: 短期記憶）
　　- 直前に処理されたモノが書き込まれる
　　- 揮発性で長時間覚えておくことはできず５、６個程度のモノしか保持できない
- long-term memory（日本語: 長期記憶）
　　- 大量（無限）のモノを書き込むことができる
　　- 読み出すのが遅い（思い出せない）
　　- 自分の名前のように何度も参照するモノ、重要なモノなどすばやく読み出せるモノもある

コードリーディングを例にどのように記憶が使われるのかを見ると↓のようになり、だいたいPCと同じような感じかと。ワーキングメモリは`CPU`、短期記憶は`メモリ`、長期記憶は`HDD(SSD)`と僕はざっくり認識しています。

1. 開いたファイルから文字、単語を追っていくときまずはワーキングメモリに格納され、それが何を表すのか処理（理解）しようとします
1. ワーキングメモリ上に情報が足りないとき、短期記憶→長期記憶の順で記憶を探しワーキングメモリに読み出し、処理します
1. 処理された情報は短期記憶に移動されます
1. 短期記憶から長期記憶に移動されます

### 記憶の単位

ここで`モノ`としているのは記憶の単位が決まっていないためです。人により同じコードを見てもそれを文字の集まりと認識するか、単語の集まりと認識するか、1枚の画像として扱うか違ってきます。
例として、以下のコードで考えます。

```java
public static void main(String[] args) {
    System.out.println("Hello, world!");
}
```

このコードを、`p`,`u`,`b`,`l`,`i`,`c`と語として扱ったとしたら、短期記憶の容量は5,6個です。それだけで溢れることになります。

`public`,`static`,`void`,`main`のように単語で扱え流ことができれば短期記憶は溢れませんし、長期記憶と併用できればもっと長いプログラムも読み進めることができるでしょう。

さらに以下のようにmainブロックと、中で実行されるコードをそれぞれモノとして扱うことができれば容量を２つしか消費しません。

```java
// 1
public static void main(String[] args) {
}

// 2
System.out.println("Hello, world!");
```

## 習熟者を目指すには

記憶の観点から見たとき、初学者と習熟者の違いとしては単純な知識量と、長期記憶として書き込む単位（ここでは質と言った方が適切かもしれません）があります。知識量は学習を進めていく上で得られていくと思いますが、それをどう使える単位として記憶できるかがカギになるように思います。

使えるとはどういうことか。例えばデザインパターンを知っていて記憶していても、読んでいるコードがそれを使用しているかどうかに気付けなければ使えるとは言えません。使用に気付き、理解し、読み飛ばせるようになって使えると言えそうです。

そのためにはどうするのか。なるべく大きな塊でパターン化して記憶すること、それを読み出せるようにすること。例えば、// TODO

## さいごに

はじめに勉強方について触れましたが、どんな勉強法をしても全ては自分の記憶に書き込まれます。脳の仕組みを知ることで、効率的に学習できるといいですね。

[^1]:[認知バイアス - Wikipedia](https://ja.wikipedia.org/wiki/%E8%AA%8D%E7%9F%A5%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9)
さくらVPSのUbuntuで `ssh: connect to host xxxxx.vs.sakura.ne.jp port 22: Operation timed out` になったときの調べ方


初めて触ってみた日に環境構築して、その次の日にSSHがタイムアウトする現象が起きたのでメモ。

早速ググって以下の記事を見て調べる前に試したものの再起動では治らず・・・

https://blog.logicky.com/2014/10/20/sakura_ssh/

前日にパケットフィルターにHTTPとSSHの設定を行なっているため以下の記事も参考にならず・・・

https://yu-nix.com/archives/sakura-vps-packet-filter/

https://labo.kon-ruri.co.jp/sakura-vps-ssh-security-protection/#index_id9

そして改めて公式ドキュメントを確認することに。
Q&Aの`iptables`操作について、Ubuntuのバージョンが違うものの試したところ、そもそもそんなディレクトリはないと怒られてしまった笑汗

https://manual.sakura.ad.jp/vps/network/packetfilter.html

https://manual.sakura.ad.jp/vps/troubleshoot/timeout.html

```shell
$ sudo ls /etc/iptables/iptables.rules
ls: cannot access '/etc/iptables/iptables.rules': No such file or directory
```

公式ドキュメントにファイアウォールがあれこれ書かれてあるため、そんなに操作していなかった`ufw`を確認することに。
すると、さくらVPSのパケットフィルターの設定上ではHTTPとSSHの設定を行なっているものの`ufw`上では追加されていないことが以下のように確認できた。
そのため、SSHを追加することでSSH接続が回復しましたー

https://www.server-world.info/query?os=Ubuntu_22.04&p=ufw

```shell
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache                     ALLOW       Anywhere
Apache (v6)                ALLOW       Anywhere (v6)

$ sudo ufw allow ssh

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache                     ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere
Apache (v6)                ALLOW       Anywhere (v6)
22/tcp (v6)                ALLOW       Anywhere (v6)
```
GPGキー とは

## 勉強前イメージ

yum installするときに・・・

## 調査

### GPGキー とは

GPG(GNU Privacy Guard)というオープンソースのツールの公開鍵で
公開鍵を使って署名を検証したりメールの暗号化復号化をしたりします。
GnuPGとも呼ばれています。
GPGはOpenPGPという名前で標準化している仕様でそれに準拠しています。

今回調べる元となったのはyumで見かけたのですが
yumからパッケージをインストールする際に正しい配布先からインストールしているかどうかのチェックに使われます。
他にも↑にも記載していますが、メールの暗号化・復号化や署名を行うことができます。

## 勉強後イメージ

オープンソースのツールでyum installするときに正しいか見てるってことか。

## 参考

- [GPGキー](https://xtech.nikkei.com/it/article/Keyword/20091204/341579/)
Google Cloud Storage から CSV ファイルを Looker Studio にアップロードする

# 概要

Google Cloud Storage から CSV ファイルを Looker Studio にアップロードする方法について記載します。

# この記事によって出来ること

- Looker Studio に CSVデータをアップロードできる
- Google Cloud Storage から Looker Studio にデータをアップロードできる

# 補足

Looker Studio にデータをアップロードする方法には複数ありますが、本記事では Google Cloud Storage を使用する方法について記載します。


# Google Cloud Storage から CSV ファイルを Looker Studio にアップロードする流れ

以下の手順で行います。

1. データを Google Cloud Storage にアップロードする
1. データを Google Cloud Storage から Looker Studio にアップロードする


## データを Google Cloud Storage にアップロードする

Google Cloud コンソール等を通じて、Storage バケットを作成し、データをアップロードします。
![Screen Shot 2022-12-17 at 16.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/44715215-f6fa-b087-b225-7176c08d3a94.png)

Looker Studio へアップロードする際、データファイルのパスが必要になるため、確認しておきます。
![Screen Shot 2022-12-17 at 16.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/d2153f02-f1ca-8853-433c-3183fd2c44a1.png)

Looker Studio で Google Cloud Storage からデータをアップロードする際、以下のようにデータファイルのパスを指定する必要があります。

{Bucket_name}/{Folder_name}/{File_name}

本記事の場合は、"bucket_20221217/dam.csv" となります。


## データを Google Cloud Storage から Looker Studio にアップロードする

Looker Studio にて、データソースを作成します。
具体的な手順としては、左上の「作成ボタン」をクリックし、「データソース」を選択します。

![Screen Shot 2022-12-17 at 16.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/c9248de2-f9ea-baac-48ad-109329e7028c.png)

どこからデータをアップロードするかを指定するため、「コネクタ選択画面」にて「Google Cloud Storage」を選択します。

![Screen Shot 2022-12-17 at 16.12.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/91dfe120-5846-1e77-9487-da89928c3297.png)

「Looker Studioにデータへのアクセス権を許可してください」と表示されたら、「承認」ボタンをクリックします。
![Screen Shot 2022-12-17 at 16.12.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/a8481991-3a12-7e58-624f-43d5ca6fb93b.png)

アップロードする対象のファイルを指定するため、「GCS ターゲットパスの File Path」に、先程確認したデータファイルのパスを指定して、「接続」ボタンをクリックします。

![Screen Shot 2022-12-17 at 16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/900dd8bd-7ddd-3986-e374-33980ebd2b88.png)

アップロードが完了すると、データの項目一覧が表示されます。
![Screen Shot 2022-12-17 at 16.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/75359997-f940-cf0b-9df1-3cf1b57cbdaa.png)

Google Cloud Storage からデータをアップロードすると、データセット名が「Google Cloud Storage」となるので、後日利用しやすいようにデータセット名を変更しておきます。

具体的な手順は、
左上の「Looker Studio」アイコンをクリックしてホーム画面を表示します。
![Screen Shot 2022-12-17 at 16.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/e7a24208-063f-e725-d64a-1ed283dbf7fa.png)

対象のデータセットの右端にある「３つのドット（︙）」をクリックし、「名前を変更」を選択し名前を変更します。
![Screen Shot 2022-12-17 at 16.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/86f919ae-6b67-d30f-ca28-aeb3eafd4884.png)

![Screen Shot 2022-12-17 at 16.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/2a91bda4-650f-ebc7-6e96-86a838d5d177.png)

以上です。
【Rails】Bootstrapのnavbarで綺麗にログアウトリンクを表示する方法

# 概要

* deviseを導入
* Bootstrapで”Navbar fixed”を導入し、ヘッダーで「マイページ」や「ログアウト」リンクを設置しようというところ

# 困ったこと
* 以下HTMLだとリンクがヘッダー内で微妙に下にずれ、なぜか綺麗に表示されない。また、CSSもなぜか反映されない。
```erb:_header.html.erb
<li class="nav-item">
 <a class="nav-link"><%= link_to 'ログアウト', destroy_user_session_path, :method => :delete %></a>
</li>
```

# 解決方法
* aタグではなく、Railsで一般的に使われるlink_toで以下のようにclass指定したら綺麗に反映されました。
```erb:_header.html.erb
<li class="nav-item">
 <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: 'nav-link' %>
</li>
```
Wordpressのセキュリティーを保つ

ミートアップお疲れ様です。

できる限り簡単な方法で書いてあります。

## Siteguard WP Pluginをインストール

https://ja.wordpress.org/plugins/siteguard/

プラグイン検索画面から「Siteguard」と入力して検索したほうがよさそうです。

### ダッシュボードで少なくとも以下を有効にする

- 管理ページアクセス制限
:::note info
フレッツ系のIPOE（いわゆるIPV6でインターネットを高速に？とか）から接続している場合、ちょっとでもアクセスがないとIPV4アドレスがコロコロかわるので、ABEMAをつけっぱなしにしながらWordpressを操作するか、管理ページアクセス制限ははずしたほうがよさそうです

IPアドレスが変わった時点で404エラーになることを確認済です
NTT系のひかり回線でない場合、もしくはPPPoEの場合はそんなにコロコロIPアドレスが変わりませんので大丈夫です。
:::
- 画像認証（ひらがな画像認証させるだけでもかなり強化できます）
- ログイン詳細エラーメッセージの無効化
- ログインロック
- ログインアラート
- XMLRPC防御
- ユーザー名漏えい防御　(https://example.com/?author=1のこと）

### できれば以下を有効にする
- ログインページ変更（https://example.com/wp-admin/ から変更すること）
:::note info
未ログインで直接 https:/
/example.com/wp-admin/ にアクセスすると TOPページにリダイレクトされます。
:::
- フェールワンス

### WP Siteguard の最も詳しい公式の説明

https://www.jp-secure.com/siteguard_wp_plugin/
## 借りているサーバーでできること
### サーバーにWAFが対応していればすべて有効にする

悪意のコードがポストされないようにするために設定しましょう
悪意のコードが入れられると認証なしでもWordpressを書き換えることができてしまいます。

試しにSQL構文をチャットボットに入れると、WAFが働いており、「寝ている」ことになっています。
（データベースパスワードを意図的に変えても同じことが発生します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/fc3370f7-879d-f38e-aa4c-f5f4f9edd314.png)

### サーバーが対応していれば以下に対応する
- 日本国外からのWordpressログインページへのアクセスをIPアドレスで無効化する
:::note info
多くの攻撃が中国です。
:::

## もし攻撃がやられると？

https://qiita.com/nanakochi123456/items/8dbd8813d1ab6ba5b87b

https://qiita.com/nanakochi123456/items/391370f775e7aad6f912

## さいごに

うちの会社も１度やられましたし、知り合いの会社も攻撃されまくっています。

攻撃は無差別にやってきます。
セキュリティーは本当に守りましょう
聴覚障害者を雇用する、ということ

こんにちは、株式会社方角という会社で代表取締役をしております方山れいこと申します。「デフエンジニアの会」アドベントカレンダー17日目を担当させていただきます。

デフエンジニアの会アドベントカレンダーに参加していますが、実は私は耳が聞こえる、いわゆる「聴者」です。そしてエンジニアでもありません（htmlとCSSを触れる程度です）。
「なぜ聴者の非エンジニアが参加しているの？」と疑問に思われた方も多いと思います。今回私は「聴覚障害者を雇用する経営者」そして「聴覚障害者の雇用の未来をより良いものにしたい起業家」という目線から書かせていただければと思います。

<h1>株式会社方角の現状</h1>
社員のプライバシーに関わる話も出てくるため詳細に書くことは控えさせていただきますが、弊社は聞こえる社員と聞こえない社員が一緒に働く職場です。<br>
少人数の小さい会社ですが、コミュニケーション方法など工夫して文化として浸透させることを目的としています。<br>
前提として、弊社は週の半分はリモートワークです。出社率は時期によって違います。（最近は寒いのでリモート率高め）

<h3>どんな人が働いているのか</h3>
福祉的なバックボーンを持った人は一人もおらず、入るまでこういう世界を知らなかったという社員もいます。ですが皆口を揃えて言うのは「耳が聞こえてても聞こえてなくても、別に関係なくないっすか？」って感じです。<br>
今までとは違うコミュニケーションの方法や人との関わり方に柔軟に対応できる人たちなので、いい意味でこだわりのない人たちかもしれないですね・・・。


<h3>株式会社方角のマインド</h3>
代表が障害当事者の文化や生活をまずよく知り、企業文化に発展させることが大事であると考えています。
ここが欠けていると、小手先の配慮だけで終わってしまい、中身の伴わないものとなってしまうからです。<br>
文化や生活を理解した上で、以下のことを行っています。


<h3>積極的に行っていること</h3>
<b>全社的にテキストコミュニケーションを主とする</b><br>
聞こえる者同士でも極力電話を使わない文化とし、テキストでのコミュニケーションを推奨します。<br><br>
<b>ブギーボードを会社で購入し使用する</b><br>
ちなみに弊社がよく使用しているのは、<a href="https://amzn.to/3hByjzt
">キングジムのこちらのブギーボード</a>です。<br><br>
<b>全社員に定期的に1on1を行う</b><br>
最近困っていること、悩んでいることなどを積極的に聞き出す機会を作っています。<br><br>
<b>ゆるく繋がってくれる当事者を巻き込む</b><br>
聴者の目から見て不明なことがある時は、何名かの当事者に気軽に聞ける場所を設けています。

<h3>雇用してみて思ったこと</h3>
弊社の事例は聴覚障害に限定されるものではありますが、それを踏まえても、障害者の雇用は決して難しいことではないなと感じています。<br>
当事者の文化や生活をまず理解すれば、企業がやるべきことは自ずと見えてくるのではないでしょうか。

<h3>今後の株式会社方角の課題</h3>
<b>会社専属の手話通訳スタッフを入れる</b><br>
理由は２つあります。<br>
・今後社員が成長していった際に、クライアントともより対等に話せる機会を創出したいため<br>
・メディア露出の機会などで通訳を必要とする場面がありそうなため<br>
それぞれで担当する方も変わってきそうなので、場面によってお願いする方を変えられる仕組みができないか模索中です。<br><br>
<b>会社主催の手話教室を必須とする</b><br>
今聞こえる社員には自主的に手話を覚えてもらっていますが、より基本を学んでもらうために手話教室の導入を考えています。


<h1>株式会社方角の新たな取り組みについて</h1>
聴覚障害当事者と関わることが増え、企業がコミュニケーションの方法を整備すれば、お互いがより快適に仕事をすることができると実感しました。<br>
おこがましいですが、弊社のような企業をもっと増やしたいと思い、聴覚障害者の雇用を創出する求人プラットフォーム「 <a href="https://gratuna.com/
">グラツナ</a>」を立ち上げます。

23年1月にまず仕事情報掲載サイトとしてオープンします。その後23年3月以降、企業研修プログラムやコンサルティング、サポートデスクの設置を予定しています。<br>
障害者雇用はハードルが高い、とどうしても思われがちですが、企業がきちんと適切に理解すれば決して難しいことではない、ということを広めてゆきたいと思っています。<br>

来年以降の株式会社方角も、どうか見守っていただけますと幸いです！
院生な私のNotion活用術

# はじめに
n番煎じ感ありますが、Notion大好きなので自分の使い方をまとめます！

https://www.notion.so/

# 学生は学割プランを使おう！
https://www.notion.so/ja-jp/product/notion-for-education

Notionでは学割プランが用意されています。
学割プランではなんとファイルのアップロードが無制限！！！！
大学のメールアドレスを登録するだけなので学生の皆さんは是非登録しましょう。

# Notion活用術まとめ

## 技術メモ・技術記事の下書きとして
研究でも趣味でも、調べながら一生懸命実装すると、気づいたらタブが50個くらい開いていてよく分からないとか、あとから実装箇所を見て何やってたんだこれってなることがよくありませんか？（私はよくあります...）
そのような事態を防ぐために、メモやログを残しておくと後々の自分のためになります。
また、上手くまとめられたものについては、markdownで記述されているのでそのままQiitaやZennで記事化しやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631855/e6c9b603-726f-7476-b4a8-f09b4e3dc01b.png)


https://zenn.dev/d_forest/articles/9af8586dacdebf60ce15


## 論文管理
論文管理にはMendeleyを使っていましたが、モバイルアプリが終了してしまったこともあり、Notionに以降しました。
学生の場合は学割プランでファイルのアップロードが無制限なので、論文のpdfをNotion内に埋め込むことができます。
自分の場合はiPadのGoodNotesで手書きでメモを取りながら論文を読みたいので、NotionにGoodNotesのリンクを埋め込んでいます。

https://www.goodnotes.com/

~~GoodNotes上で共有リンクを作成（"Share Link to Collaborate"）し、"Open Document on Web"をオンにすることでNotionの埋め込み（"Create embed"）で閲覧できる状態になります。~~
2023/01/23追記：現在GoodNotesのリンクを埋め込みしても閲覧できない状態になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631855/0e65ac2b-be32-9f5a-668b-71343f818a12.png)

論文管理についてはこちらが参考になります。

https://note.com/ninomium/n/n13e5725a55bc

テンプレートも使いやすいです。

https://www.notion.so/ja-jp/templates/%E8%AB%96%E6%96%87%E7%AE%A1%E7%90%86%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

## ブックマーク

### PC
Notionはブックマークを管理するのにも使えます。
公式のchrome拡張機能 Notion Web Clipperでは、ウェブサイトをNotionの指定のデータベースに保存することができます。

https://chrome.google.com/webstore/detail/notion-web-clipper/knheggckgoiihginacbkhaalnibhilkk?hl

![Screen Shot 2022-12-17 at 15.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631855/67839858-e352-0a38-9554-926f6ba8d8bd.png)

非公式ですが、Save to Notionではchrome上でタグやメモなど他のプロパティも設定することができるのでとても便利です。

https://chrome.google.com/webstore/detail/save-to-notion/ldmmifpegigmeammaeckplhnjbbpccmm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631855/97491c78-ef9d-136d-47e3-7f529926fecf.png)

Notionではこのような感じに。
上がSave to Notion、下がNotion Web Clipperです。
Save to Notionではアイコンも設定されるのでいい感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631855/b494f3cf-7b19-b031-cad6-f022e8764b2a.png)

### スマホ
スマホ（iOS, Android）ではchromeでウェブページを開いた状態で「共有」→「Notion」を選ぶと、Notion Web Clipperと同様にデータベースにブックマークを保存できます。
スマホでは現状タグ等は設定できないのが残念です。


## GitHubにバックアップ
https://github.com/darobin/notion-backup

NotionをGitHubにバックアップするサービスです。
GitHub Actionsを利用してcronで定期的にバックアップが実行されるように設定できます。
いざというときのためにも、バックアップを取っておくと安心です。

https://dendenblog.xyz/notion-auto-backup/


## Notion APIでさらに便利に
NotionにはAPIがあるので、色々なサービスと連携させるとより便利に使うことができます。


https://developers.notion.com/

簡単に使うならZapierのようなサービスもあります。

https://zapier.com/


## 他にも...
技術的な事以外にも様々なことをNotionで管理しています。
例えば...

- 就活のスケジュールや説明会のメモ
- 読書リスト
- 旅行やイベントの感想、日記
- ~~無印の美味しかったカレーリスト~~
- ~~ソシャゲの入手したカードのリスト~~

些細なことでもNotionに残しておくと意外と役立ちます。

# 最後に
Notionの世界は奥深く、使い切れていないところもたくさんありそうです。
Notion APIでももっと遊びたい（修論がやばいです）。
皆様のNotion活用術も共有していただければ幸いです！
【AWS】RDS(db.m3.large)のストレージ拡張ができなかった原因と解決策

# はじめに
サポート切れ直前のインスタンスタイプを使用し続けたり、DBエンジンのアップデートを行わず放置したりしてませんか？

今回は本番環境にて、
**空きストレージ容量残り3パーセント以下、しかしストレージの拡張が行えません！まもなく本番DB停止します！**　って状況に遭遇しました。（伊吹マヤちゃんっぽい感じで)

何とも言えない緊張感が味わえますが、心臓によくないのでこうなる前にこまめなアップデートで対策しておきましょう。。。。
放置しちゃダメです。後で辛い目にあいます。



※本記事で取り上げているインスタンスタイプやDBエンジンバージョンが古く、検証環境での再現が難しいため画像無しとさせていただきます。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [環境について](#環境について)
1. [発生した事象の詳細](#発生した事象の詳細)
1. [終わらない再起動](#終わらない再起動)
1. [原因](#原因)
1. [解決策](#解決策)
1. [さいごに](#さいごに)


# 環境について
RDSのインスタンスタイプ、DBエンジンバージョンは以下のようになってます。

|インスタンスタイプ|DBエンジン|バージョン|
|---|---|---|
|db.m3.large|MySQL|5.7.31|

# 発生した事象の詳細
コンソール画面からいつものようにRDSのストレージを拡張しようとしたのですが。。。
**ストレージ拡張の欄が選択できない？！**　と焦りました

インスタンスタイプが古いからかなぁと思ってインスタンスタイプを変更しようと思ったのですが、インスタンスタイプのプルダウンも表示されません。
AWSから完全に見放されたか。。。と思いましたがDBエンジンバージョンを5.7.33以上(2022/12/17時点で選択できる一番古いバージョン）を選ぶとプルダウンでインスタンスタイプを選択できるようになってました。

この状態になるとストレージ拡張の箇所も設定できるようになりました。
これで解決だーと安堵しましたが、さらなる問題が。。。

# 終わらない再起動
DBエンジンバージョンを5.7.33以上を選択すると、何も選択できなかったインスタンスタイプの項目が選択できるようになり、ストレージ拡張の欄も設定できるようになりました。


この状態で「すぐに適用」を選択して実行するも、「保留中の変更」となったまま更新が始まりませんでした。

仕方ないのでRDSを再起動したのですが、今度は「再起動」のまま固まって動かなくなりました。。。


# 原因
原因としてはm3のインスタンスタイプとDBエンジンバージョン(5.7.40)の組み合わせがサポートされておらず、内部処理が正常に行えなくなっていたからでした。
※通常はインスタンスタイプ変更とDBエンジンバージョンを同時にアップデートしても問題ありません。

この状態になってしまうと自分でどうにもすることができないのでAWSサポートに連絡し、DBエンジンバージョン更新のタスクをキャンセルしてもらう必要があります。

そして、内部処理がうまくいかない組み合わせで処理を進めるためには、**インスタンスタイプを先に変更し、その後でDBエンジンバージョンを変更する**必要があります。

気づいた方がいるかと思いますが、今回の事象はDBエンジンバージョンの「5.7.33」以上を選択した状態でないとインスタンスタイプの項目が選択できませんでした。
つまり「5.7.31」のバージョンを使用している状態でコンソール上からインスタンスタイプを変更しようとしてもそもそも選択できないため、インスタンスタイプとDBエンジンバージョンは同時に変更せざるを得ないわけです。


# 解決策
インスタンスタイプだけを変更したいのにコンソール上からできなくて困った。。。。


そんなときにはAWS CLIコマンドの出番です。
CloudShellを開き以下のコマンドを実行することでインスタンスタイプとDBエンジンバージョンを別々に変更することができます。

``` mod_db.sh
#インスタンスタイプをdb.m5.largeに変更する
# db.m5.large への変更
aws rds modify-db-instance --db-instance-identifier "DB識別子" --db-instance-class db.m5.large --apply-immediately

#5.7.40 への変更、ストレージの拡張:170GiBに
#この2つは同時に変更してもOK
aws rds modify-db-instance --db-instance-identifier "DB識別子" --engine-version 5.7.40 --allocated-storage 170 --apply-immediately
```


# さいごに
今回はストレージを拡張するだけなのに色々苦しめられたので原因と解決法を書いてみました。
AWSはこれからもアップデートが入って古い世代はどんどん使用できなくなってくるし、それに伴って想定していない不具合とかも出てくるかと思います。

ギリギリで対応しようとしたけど解決に時間がかかって間に合わず、サービス中断なんてことが起こらないことを祈ってます。。。。

今回はここまでです。
最後まで読んでいただきありがとうございました。
MUFG Data Science Basic Campで優勝した話

# 本記事について

初めまして！
minegrammer（みねぐらまー）です！
この記事は [CDLE youth Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cdleyouth) 18日目の記事です。

先日行われた、MUFG Data Science Basic Camp に参加し、1位優勝しました！
本記事ではデータ分析コンペの参加結果・解法の共有と脱初心者の戦略に触れたいと思います。

本記事ではデータ分析の初中級者を対象としています。
データ分析に興味があるが、そもそもデータ分析コンペとは？という人は、先にコンペ自体の流れを調べてもらえると内容がよくわかると思います！
専門用語の説明は省略しているので、調べてわからなかったらtwitterにDMしてください。

# アジェンダ
1. コンペについて
2. 解法
3. 勝因
4. 脱初心者の戦略
4. まとめ 


# 1. コンペについて
MUFG Data Science BasicCamp  
2022年9月12日（月）～10月16日（日）

https://mypage.1170.i-web.jpn.com/mutb2024/op/event/internship/datascience.html#program

テーブルデータでお弁当の販売個数を予測するコンペでした。

初中級者向けということでデータ数は少ないですが、データ数が少ないと工夫がしづらいことが分かりました。
また評価データの数も少ないので、分類タスクなどでは評価データ次第の結果にもなりそうです。


# 2. 解法

- **前処理**
明らかに売れすぎているデータの削除（学習に悪影響そうなもの）
欠損値の補完
ユニーク値の削除（１回しか出現しないものは他とまとめます）


- **特徴量**
元データの特徴量
kcalが欠損かどうかのフラグ
料理名・カテゴリ・調理法ごとに条件分岐で 0 , 1 の特徴量を作成（ゴリ押し）


- **学習**
ランダムフォレストをfold数 5 で学習

# 3. 勝因

解法はかなりシンプルだったと思います。
自然言語処理やアンサンブルなど色々なことを試しましたが、結果としてシンプルが一番良かったです。
特に勝因となったのは以下の３つです。

- **データを理解したオリジナルの特徴量**
集約値だけでなく、データそのものの特徴を反映した特徴量を作成した

- **交差検証による適切なモデルの評価**
public LB と private LB で評価されるデータが変わるため、モデルの汎化性を評価する必要があった

- **CV の値とpublic LB の結果の記録**
CV の値とpublic LB の結果から適切な最終モデルの選択ができた


## 3-1. 得られたこと
コンペ序盤は生データを見る（EDA）
交差検証で汎化性の評価をする
実験の記録を残す（どのように記録していくか有識者に教えていただきたい）


# 4. 脱初心者の戦略

ここからは脱初心者する戦略を、完全に筆者の主観で書いていきます！
それぞれの定義は以下です。

- 初心者
データ分析に興味がある。
データ分析の経験を聞かれた時の内容が勉強内容である。

- 中級者
一定の領域・難易度の課題であれば、価値を創出できる。
データ分析の経験を聞かれた時の内容が、コンペ・研究などの取り組みの内容である。

## 4-1. アプローチ
主なアプローチは以下の２つで、同時に行う方がいいでしょう。

1. データ分析コンペへの参加
2. 過去のコンペの解法の調査

### ① データ分析コンペへの参加
まずは、コンペに参加してみることが一番重要だと思います。
そのときの、思考過程・課題・他者との比較などの経験が、後々に役に立ちます。
また、ただ座学で勉強するよりも実際に試行錯誤する方が、リアリティを感じられて勉強になります。

コンペの選び方は
- 学生限定
- 課題設定、評価指標が理解しやすい
- テーブルデータ

の辺りがいいと思います。
特に学生限定コンペでは課題設定も簡単で、データも少ないので積極的に参加しましょう。
ただ、学生限定の自然言語処理などのコンペでは（これはおそらくですが）、高順位に入るためには高スペックのマシンが必要になるみたいです。研究室などのPCを借りられるのであればいいですが、そうでない場合は追加費用が必要になるかもしれません。


### ② 過去のコンペの解法の調査
コンペに参加したら、まずはそのコンペの課題設定や評価指標を理解します。
その後は、過去の類似したコンペの解法を調査しましょう。

必ず使える技術はないかもしれませんが、アプローチのヒントになると思います。
まさに、私の「料理ごとにOnehotベクトルを作成する」という解法は、別のコンペの解法から着想を得たものでした。

# 5. まとめ

いかがでしたでしょうか。
データ分析にこれから取り組まれる方の参考になれば幸いです。

データ分析コンペに参加することは沢山のメリットがあるため、ぜひ今後とも参加したいです。
対戦よろしくお願いします。
今日のElixirSchoolメモ12「内包表現」

ElixirSchoolの学習メモです。

https://elixirschool.com/ja/lessons/basics/comprehensions

## 基本

リスト内包表記はElixirで列挙体（enumerable）をループするための糖衣構文、短縮形のこと。
内包表記は`Enum`や`Stream`を反復するためのより手軽な文を生成するためによく用いられる。

与えられた一つ以上のコレクションに対して、各要素の値のすべての組み合わせを展開して、
場合によって値をフィルタし、残った値で新しいコレクションを作成する。

内包表記の一般的な文法は次のとおり。

result = for _generator or filter..._ [, into: _value_], do: _expression_

```elixir
iex(2)> for x <- [1, 2, 3, 4, 5], do: x * x
[1, 4, 9, 16, 25]
```

入れ子になったループのように、複数のジェネレータを用いることも可能。

```elixir
iex(6)> for x <- [1, 2], y <- [5, 6], do: x * y
[5, 6, 10, 12]
iex(8)> for x <- [1, 2], y <- [5, 6], do: {x, y}
[{1, 5}, {1, 6}, {2, 5}, {2, 6}]
```

内包表記はリストだけでなく、列挙可能なものならどんなものにも使える。

```elixir
# マップ
iex(10)> for {k, v} <- %{"a" => "A", "b" => "B"}, do: {k, v}
[{"a", "A"}, {"b", "B"}]
# バイナリ
iex(11)> for <<c <- "hello">>, do: <<c>>
["h", "e", "l", "l", "o"]
```

ジェネレータは入力値セットと左辺の変数を比較するのにパターンマッチを使っている。

```elixir
iex(13)> for {:ok, val} <- [ok: "Hello", error: "Unknown", ok: "World"], do: val
["Hello", "World"]
```

### フィルタ

フィルタは内包表記のためのある種のガード。
フィルタされた値が`false`か`nil`を返す場合は最終的なリストから取り除かれる。

```elixir
iex(4)> for x <- [1, 2, 3, 4, 5], x < 4, do: x * x
[1, 4, 9]
```

また、ジェネレータ同様複数のフィルタを使うこともできる。

### :intoの使用

リストではなく、他のものを生成したい場合は`:into`オプションを使う。

```elixir
# キーワードリストからマップを作成する
iex(15)> for {k, v} <- [one: 1, two: 2, three: 3], into: %{}, do: {k, v}
%{one: 1, three: 3, two: 2}
```

ビット文字列は列挙可能なので、リスト内包表記と`:into`を用いて文字列を作成することができる。

```elixir
iex(16)> for c <- [72, 101, 108, 108, 111], into: "", do: <<c>>
"Hello"
```
WindowsにWSLをインストールしてReactの開発環境を構築する方法

# WindowsにWSLをインストールしてReactの開発環境を構築する方法

以下の公式サイトを参考にWSL上にReactの開発環境を構築する。

https://learn.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-wsl

https://learn.microsoft.com/ja-jp/windows/dev-environment/javascript/react-on-wsl

## WSLをインストール

コントロールパネル>プログラム>Windowsの機能の有効化または無効化でLinux用windowsサブシステムのチェックボックスを外す
![スクリーンショット 2022-12-17 155140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742765/da6920bb-b72d-10b6-727b-4781b693e88c.png)

powershellを管理者権限で開いて、以下のコマンドを打つ

```
wsl --install
```

再起動すると自動でWSLが立ち上がる
ユーザー名とパスワードを入力して初期設定完了

## nvmをインストール

wslのホームディレクトリに移動してcurlをインストール
```
cd /
```
```
sudo apt-get install curl
```
```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
```
一回、wslを閉じて再度開く。
以下のコマンドを打ってnvmと返ってきたら、nvmインストール完了
```
command -v nvm
```

## Node.jsをインストール

Node.js の現在の安定した LTS版をインストール
```
install --lts
```
以下のコマンドでversionが出てきたらOK
```
nvm ls
->     v18.12.1
default -> lts/* (-> v18.12.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v18.12.1) (default)
stable -> 18.12 (-> v18.12.1) (default)
lts/* -> lts/hydrogen (-> v18.12.1)
・・・以下省略
```
npxやnpmが入っていてversionが確認できればOK
```
npx --version
8.19.2
```
```
npm --version
8.19.2
```

## npx create-react-app でプロジェクト立ち上げ

適当なフォルダに移動する
このとき使用するファイルをマウントされた C ドライブ (/mnt/c/Users/yourname$) に保存したりしないように注意する。
npx create-react-app 任意の名前で立ち上げ
```
npx create-react-app my-app
```
そのディレクトリに移動
```
cd my-app
```

## npm start

以下のコマンドでローカルホスト3000番が立ち上がれば完了
```
npm start
```
UbuntuにSSHサーバー設定（ファイアウォール許可設定についても）

# 概要

Ubuntuにリモートデスクトップできる環境を用意してる。
（Windows ⇒ Ubuntuへリモートデスクトップ）

でも、ちょっととしたメンテや確認のたびにリモートデスクトップするの面倒くさい。

SSH接続してコマンドでサクッと作業したい。

# やり方

## パッケージ一覧更新とインストール

```shell
sudo apt update
sudo apt install openssh-server
```

途中で ↓ 聞かれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/54806cd8-037a-2ed4-2261-0f14f6362d69.png)

## 起動状態確認

インストールが終了するとSSHサーバーが自動起動する。

```shell:sshが起動しているか確認コマンド
sudo systemctl status ssh
```

起動していれば下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/691764e8-8f31-19a8-2f5d-d54b271e6fc3.png)

## Ubuntu起動と同時にSSHが自動起動する設定になってるか確認

インストールすると、『システム起動と同時にSSHサーバーが自動起動する設定』になる。

```shell:Ubuntu起動と同時にsshが自動起動する設定なっているか確認コマンド
systemctl is-enabled ssh
```

自動起動設定になっていれば下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bbcb7f0e-dddd-9fac-0253-fe2ad80200c1.png)

# ファイアウォール設定

ファイアウォールが有効になっている場合、SSH用のポートを解放してあげないと外部から接続できない。

```shell:ポート番号22（SSH用のポート番号）を解放するコマンド
sudo ufw allow 22
```

```shell:ファイアウォールの状態表示コマンド（本当に設定が反映されたか確認用）
sudo ufw status
```

# 参考サイトさん

https://codechacha.com/ja/ubuntu-install-openssh/

https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007

https://qiita.com/htshozawa/items/e24729a4ab332cb40313

https://www.itmedia.co.jp/help/tips/linux/l0584.html

# バージョン

Ubuntu 20.04.5 LTS
OpenSSH_8.2p1
yum localinstall とは？やってみた。

## 勉強前イメージ

yum installとは違う？

## 調査

### yum localinstall とは

そもそも `yum` とはrpmを管理するマネージャーのことを指しています。
詳細は [こちら](https://qiita.com/miyuki_samitani/items/9ac04ca2b783575d8371) に記載しておりますが
大きな特徴としては、依存関係を自動的に解決してくれるというものがあります。

### yum localinstallを使ってみる

今回はtreeコマンドを入れようとおもいます。
今のところはtree使えません。

rpmを取ってきます。

```
wget https://ftp.centos.org/7.9.2009/os/x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm
```

できました。

```
[root@localhost ~]# ll | grep tree
-rw-r--r-- 1 root root 47508  7月  4  2014 tree-1.6.0-10.el7.x86_64.rpm
```

それをlocalinstallします。

```
yum localinstall tree-1.6.0-10.el7.x86_64.rpm
```

普通にyum installするのと似たような感じですね。

```
[root@localhost ~]# yum localinstall tree-1.6.0-10.el7.x86_64.rpm
読み込んだプラグイン:fastestmirror, product-id, search-disabled-repos, subscription-manager

This system is not registered with an entitlement server. You can use subscription-manager to register.

tree-1.6.0-10.el7.x86_64.rpm を調べています: tree-1.6.0-10.el7.x86_64
tree-1.6.0-10.el7.x86_64.rpm をインストール済みとして設定しています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ tree.x86_64 0:1.6.0-10.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================================================================================
 Package                     アーキテクチャー              バージョン                           リポジトリー                                      容量
=======================================================================================================================================================
インストール中:
 tree                        x86_64                        1.6.0-10.el7                         /tree-1.6.0-10.el7.x86_64                         87 k

トランザクションの要約
=======================================================================================================================================================
インストール  1 パッケージ

合計容量: 87 k
インストール容量: 87 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : tree-1.6.0-10.el7.x86_64                                                                                               1/1 
  検証中                  : tree-1.6.0-10.el7.x86_64                                                                                               1/1 

インストール:
  tree.x86_64 0:1.6.0-10.el7                                                                                                                           

完了しました!
```

これでtreeコマンド使えるようになりました。

```
[root@localhost ~]# tree
.
├── test.txt
├── tree-1.6.0-10.el7.x86_64.rpm
└── xx.txt
```

## 勉強後イメージ

今回はtreeコマンドで大した依存性もなかったと思うけど
もっとややこしいやつとかならスゴイ効果的なのかな

## 参考

- [CentOS6 に　yum localinstallが警告でまったくインストールできない！](https://www.kaasan.info/archives/3304)
- [Linuxにtreeをインストールする方法](https://www.koikikukan.com/archives/2016/12/08-003333.php)
【備忘録】SFTPコマンドについて

サーバ、ネットワーク機器へファイルの送受信を行う時に、SFTPコマンドを使う事ができる。
scpでも同じような処理ができるが、こちらも覚えておいて損はない。
WindowsでもLinuxでも使える。

# 対象のサーバに、SFTPコマンドでログイン
今回はserver:192.168.162.1にログインする。ユーザー名とパスワードはSSHと一緒。 すると、プロンプトがsftp>というように表示される。

``` 
sftp ユーザ名@192.168.162.1
```
実行結果
```
Connected to 192.168.162.243.
sftp>
```
この状態は、ふつうにSSHしたときと同じホームディレクトリの内容になっている。SSHしても、SFTPしても、lsしたときのファイルの 内容は変わらない。

# 便利なコマンド
## lsコマンド
lsを実行すれば、ディレクトリの中身を確認することができる。
```
ls
```
実行結果
```
sftp> ls
big-ip-dns kubernetes linux-userdb netbox_core
```

## pwdコマンド
現在の自分のいるディレクトリを表示する。
```
pwd
```
出力結果
```
sftp> pwd
Remote working directory: /home/user/big-ip-dns
```
## cdコマンド
ディレクトリを移動することができる。Linuxと一緒だが、プロンプトが変化しないのでわかりづらいかも

# ファイル転送
## ローカルのPCにダウンロードする
`get ファイル名` と指定するだけでOK。今回は `bigip-login.yml` をダウンロードした。

```
sftp> get bigip-login.yml
Fetching /home/dito/big-ip-dns/bigip-login.yml to bigip-login.yml
/home/dito/big-ip-dns/bigip-login.yml 100% 267 17
```

## ローカルのPCからアップロードする
これも簡単。sftpのプロンプト上で、putコマンドを実行するのみである。 とりあえず、ローカルのPCにある、 teraterm.log をアップロードする。

```
sftp> put teraterm.log
Uploading teraterm.log to /home/jst-dito/teraterm.log
3 teraterm.log 100% 2897 315.9KB/s 00:00
```
サーバ側でlsコマンドを実施してみると、新たにteraterm.logが追加されているのがわかる。

アップロード先のディレクトリは後ろの引数に指定する。ここではsv0066の、 /home/jst-dito/kubernetes 配下にアップロードしている。

```
sftp> put teraterm.log /home/jst-dito/kubernetes
Uploading teraterm.log to /home/jst-dito/kubernetes/teraterm.log
teraterm.log 100% 2897 313.1KB/s 00:00
```

以上。

# 参考
https://qiita.com/tatsumi_t2/items/73567ff4a1006399969b
https://setechlog.com/sftp-how-to-use/
[Flutter] 正規表現を使って、文字列の中のURLの部分だけをリンクに置き換える

この記事は、【 [可茂IT塾 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kamo-it) 】の18日目の記事です。

Flutter のアプリ開発で実装したものを記事にしました。

誰かのお役に立てれば、幸いです。

文字列の中のURLを正規表現で検知して、URLの部分だけをリンクに変換、url_launcherでブラウザに飛ばす機能を実装しました。

## 使用するパッケージ
url_launcher を使いました。

https://pub.dev/packages/url_launcher

## URL を判別する正規表現

これはすでにいくつか記事があったので、それを参考にしました。

https://murashun.jp/article/programming/regular-expression.html

下記の RegExp を使用。

```dart
RegExp _urlReg = RegExp(
  r'https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=#]*)?',
);
```

## 正規表現にマッチした部分をリンクテキストに変換する

`splitMapJoin`を使って、正規表現にマッチしたものとそうでないもので処理を分けます。

Text Widget の extension にします。

```dart
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

extension TextEx on Text {

  RichText urlToLink(
    BuildContext context,
  ) {
    final textSpans = <InlineSpan>[];

    data!.splitMapJoin(
      _urlReg,
      onMatch: (Match match) {
        final _match = match[0] ?? '';
        textSpans.add(
          TextSpan(
            text: _match,
            style: const TextStyle(
              color: Colors.blue,
              decoration: TextDecoration.underline,
            ),
            recognizer: TapGestureRecognizer()
              ..onTap = () async => await launchUrl(
                    Uri.parse(_match),
                  ),
          ),
        );
        return '';
      },
      onNonMatch: (String text) {
        textSpans.add(
          TextSpan(
            text: text,
            style: const TextStyle(
              color: Colors.black,
            ),
          ),
        );
        return '';
      },
    );

    return RichText(text: TextSpan(children: textSpans));
  }
}
```

## 画面

### Text Widget で表示した時

```dart
Text(exampleText)
```
![スクリーンショット 2022-12-17 16.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435645/4d6354ee-1074-9bbd-7027-da840f969f0c.png)

### urlToLink で表示した時

```dart
Text(exampleText).urlToLink(context)
```
![スクリーンショット 2022-12-17 16.04.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435645/daac1091-17ea-5483-de9b-b8b76da00381.png)

URL の部分だけ、TextStyle を変更して、リンクにすることができました。

## 最後に

参考サイトのやり方を Text Widget で使うときにこのような感じに落ち着きました。

このやり方自体は、正規表現を変更したり、プロパティを修正をすることで、他にも利用可能な場面がありそうだなと思います。

修正すると良いところだったり、間違っているところがありましたら、お手数ですが、ご連絡いただけると助かります。

## 参考
https://halzoblog.com/textfield-url-hyperlink/#toc5

https://zenn.dev/t_fukuyama/articles/35074a8c3e65ec
NextJsでプロジェクトのセットアップをする

NextJsでプロジェクトを作成するにあたって環境構築をしました。
EslintやPretterの設定について、今後も行うと思うので、流れを記録しておきます。

## 新規作成

```
$ yarn create next-app --typescript
```
サーバー起動
```
$ yarn dev
```

https://nextjs.org/docs/getting-started


## ESLint

https://nextjs.org/docs/basic-features/eslint

設定を追加
```typescript:package.json
"scripts": {
  "lint": "next lint"
}
```
インストールと構成
```
$ yarn lint
```

```typescript:.eslintrc.json
{
  "extends": ["eslint:recommended","next/core-web-vitals"]
}
```



### ESLintでTypeScriptのチェック

https://eslint.org/docs/latest/user-guide/getting-started

https://qiita.com/sakelog/items/0ca90ead7a6df0cfebf0#3-3-typescript%E3%81%AEparser%E3%82%92%E8%BF%BD%E5%8A%A0

https://typescript-eslint.io/getting-started

```
$ yarn add --dev @typescript-eslint/parser @typescript-eslint/eslint-plugin
```

```typescript:.eslintrc.json
{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
      "ecmaVersion": "latest",
      "project": "./tsconfig.json",
      "ecmaFeatures": {
      "jsx": true
    }
  },
  "plugins": ["@typescript-eslint"],
  "extends": ["eslint:recommended","next/core-web-vitals","plugin:@typescript-eslint/recommended"]
}
```

## Prettier
インストール
```
$ yarn add --dev prettier eslint-config-prettier
```

ESLint と Prettier を連携させる(競合するルールをオフにする)

```typescript:.eslintrc.json
{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
      "ecmaVersion": "latest",
      "project": "./tsconfig.json",
      "ecmaFeatures": {
      "jsx": true
    }
  },
  "plugins": ["@typescript-eslint"],
  "extends": ["eslint:recommended","next/core-web-vitals","plugin:@typescript-eslint/recommended","prettier"]
}
```

フォーマットの設定

```typescript:.prettierrc
{
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true,
  "jsxSingleQuote": true,
  "printWidth": 60
}
```

## エディターの設定

https://github.com/prettier/prettier-vscode

```typescript:.vscode/settings.json
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
```
足掛け1年もかかってCISSP合格したから反省まとめる

# はじめに
タイトル通りだいぶ時間かかりました。数ヶ月で合格したという合格体験記が多い中、なかなか苦労した方だと思うので、つまずきポイントをまとめます。
# ファーストチャレンジ
### 準備
[公式問題集](https://www.amazon.co.jp/CISSP%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%BB%E3%83%81%E3%83%A3%E3%83%83%E3%83%97%E3%83%AB-ebook/dp/B08C7J6SR5)をひらすら周回
### 合否
不合格
4ヶ月かけて準備をしましたがだめでした。
### 達成状況
CISSPは不合格だとドメインごとの達成状況を教えてくれます。そこそこ惜しかったみたいです。
|ドメイン|達成状況|
| --- | --- |
|資産のセキュリティ|基準値以下|
|セキュリティアーキテクチャとエンジニアリング|基準値以下|
|セキュリティとリスクマネジメント|基準値近く|
|セキュリティの評価とテスト|基準値以上|
|ソフトウェア開発セキュリティ|基準値以上|
|セキュリティ運用|基準値以上|
|通信とネットワークセキュリティ|基準値以上|
|アイデンティティとアクセスの管理|基準値以上|
### 反省
1. 苦手な問題にフォーカスしなかった
試験を受けていて「あ、これと似たようなの問題集で解いた！」と思いつつ、確信を持って回答できないものがかなりの数ありました。原因は公式問題集をひたすら最初から最後まで周回したので、正解できた問題も間違った問題も同じ回数しか触れていなかったことだと思います。正否を記録して間違えた問題を重点的に復習するべきでした。

2. インプットがおろそかだった
理論的に理解していない分野で問題演習を続けても、切り口の違う問題に太刀打ちできません。具体的に言うと暗号理論が弱かったと思います。

3. 参考情報がちらばっていた
問題集を解いていると解説だけでは分からないことがちょくちょく出てくるので、都度googleで調べていたのですが、調べた情報をまとめる努力をしていませんでした。同じキーワードで検索をかけることも度々あり効率が悪かったと思います。

4. 本番の時間配分
選択式とは言え条件反射で答えられるような問題はほとんどないので、結構体力を使います。8時前くらいに試験開始で普段の仕事より朝が早かったこともあり、1時間半ほど通しで問題を解き進めたところで完全に思考がにぶりました。休憩をはさんでも、少し問題を解くとすぐ注意散漫に。全然ペース配分がつかめませんでした。

# セカンドチャレンジ
### 準備 
1. 問題集の移行
ファーストチャレンジの反省から、学習ログをつけて問題を解こうと思ったものの、Kinddle片手に正否を記録するのが面倒くさすぎて挫折。[他の方の受験記](https://qiita.com/nantoiukoto/items/93b94197e1b05377493a#3-official-study-guide%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8Bweb%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F)を調べてみると[公式Study Guide](https://www.amazon.co.jp/Certified-Information-Security-Professional-Official-ebook/dp/B07CG86947)を買うとWileyなるWebサービスで学習記録機能つきの問題集が使えるらしいです。Chromeの翻訳機能で日本語に訳すといい感じに本番っぽい機械的な翻訳になったので笑、これをメイン教材にすることにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857499/ba8f99fd-0fe4-5979-fd28-4fe30a1be186.png)
20問を1セットにして、数セット問題を解く→間違えた問題を復習する、を繰り返しました。

2. 暗号理論の補強 
Wileyの問題集を解くかたわら[暗号技術入門](https://www.amazon.co.jp/%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E7%A7%98%E5%AF%86%E3%81%AE%E5%9B%BD%E3%81%AE%E3%82%A2%E3%83%AA%E3%82%B9-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B015643CPE/)を読み進めて基本的な理論の理解を進めました。

3. 参考情報の一元化
よくよく調べてみると[個人でCISSPのまとめノートを作っている方](https://tex2e.github.io/blog/security/cissp-notes)がいらっしゃったので、都度googleで調べるのではなく、まずはこちらで検索をかけるようにしたら勉強がめちゃくちゃはかどりました。お世話になりました。

4. 本番の細かな休憩
日々の問題演習で、頭がクリアなまま解きつづけられるのは自分の場合20問までと分かったので、本番も20問で区切ることにしました。20問ごとに机の上に突っ伏したり、目をつぶったりして数分休憩を取り、以下の問題数を終えるごとに試験室から退出して10-15分ほどの軽食/トイレ休憩をとりました。
ちょっと多すぎるかなというくらい細かく休憩をとり「クリアな頭で問題と向き合う」よう気をつけました。結果、4時間で解きおえたので（試験時間は6時間）、時間的にはかなり余裕がありました。

|ラウンド|セット組|問題数|
|---|---|---|
|1|20*5|100|
|2|20*4|80|
|3|20*3+10|70| 

### 合否
合格
高額な受験料と長時間の試験がひたすらプレッシャーで、なかなか再受験をする気持ちになりませんでしたが、ファーストチャレンジから約8ヶ月、細々と勉強を続けて合格できました。合格するとドメインごとの達成状況は開示されないようで、どれくらい解けていたかは謎です。

# 参考サイト
[[資格受験]独学でCISSP を受験した話](https://zenn.dev/valmet083/articles/c6c0c184266d07)
[CISSP 独学で合格するまで](https://qiita.com/nantoiukoto/items/93b94197e1b05377493a)
[CISSP 勉強ノート](https://tex2e.github.io/blog/security/cissp-notes)
AWSのデプロイで躓いた話

## はじめに
私は某プログラミングスクールに通う初学者です。
学習を始めて数ヶ月経ちますが、まだまだ考えが足らなかったり、トンチンカンな行動を起こしていると思います。
自分が遭遇したエラーや問題解決をした記録として投稿します。

## デプロイ
今日はAWSを使ってデプロイしたときのことを書きたいと思います。

今回デプロイしたアプリケーションは、以前にデプロイしていたにも関わらず、色々あって（長いので割愛します）ブラウザで表示できなくなっていることに気づき、スクールのカリキュラムを見ながら作業を行いました。

EC2内でgit pull origin masterを行ったところ、
```:ターミナル
From https://github.com/xxxx/アプリ名
 * branch            master     -> FETCH_HEAD
Already up to date.
```
このように返ってきました。
そのままユニコーン軌道コマンド
```:ターミナル
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```
を実行すると
```:ターミナル
master failed to start, check stderr log for details
```
と返ってきました。
```:ターミナル
less log/production.log
```
コマンドを実行してエラーを探していきます。

```:ターミナル(エラーログ)
ActionView::Template::Error (The asset "xxxxx.png" is not present in the asset pipeline.
```
このようなエラーを見つけました。
アセットファイルを正しくコンパイルできていないのが原因のようです。

以下、行なったこと
```:ターミナル
rails assets:precompile RAILS_ENV=production
```
```:ターミナル
ps aux | grep unicorn
```
psコマンドで現在動いているプロセスの確認をしました。
すると、killされていないプロセスが2つありました。
masterと書いてあるプロセスidをkillします。
```:ターミナル
kill <確認したunicorn rails masterのプロセスid>
```

最後にRailsを再起動するコマンドを実行します。
```:ターミナル
RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```

ブラウザ上でアプリケーションを開くと、正常に表示することに成功しました。
エラーが出たときはエラーログを表示するコマンドを実行し、エラー文を見つけ、それに沿って解決策を探す。それができませんでした...




## AWSの無料枠
AWSには、12ヶ月間、一定の使用量までは様々なサービスを無料で利用できる」という無料枠があります。
無料期間が終わると、使用量に応じて料金が発生するそうです。
**※無料期間内でも、使用量が無料枠を超えると料金が発生します。**

例えば、２つ目のアプリケーションをAWSでデプロイする場合、新たにインスタンスを作成しますが、稼働時間による無料枠の使用限度を超えると料金が発生します。
AWSのアカウントを作成してから13ヶ月以上経った場合、インスタンスを起動している状態だと料金が発生するそうです。
2つ目以降のデプロイをしたことがないので、具体的な金額はわからないですが、法外な費用ではないと聞きました。

### 料金発生を避けるためにできること
- Elastic IPアドレスを解放する
- 紐付いているS3バケットを削除する
- インスタンスを削除する　など

## 終わりに
自分で解決したいのに、調べて実行してを繰り返しているうちにどこまで完了しているのかわからなくなり、メンターさんに教えていただきました。
renderでデプロイをしたこともありますが、AWSは作業工程も多く、難しくて苦手意識を持っています。慣れる日は来るのか...日々学習ですね。
ありがとうございました。
JAWS-UG CDK支部#4で「concurrencyで爆速並列デプロイ」というタイトルでLTしました


この記事は、「[AWS CDK Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cdk)」の17日目の記事です。

# はじめに
先日行われた[JAWS-UG CDK支部 #4](https://jawsug-cdk.connpass.com/event/264652/)にてCDKでの並列デプロイを実現するconcurrencyオプションについてLTをしました。※オプション1つのネタで何処まで引っ張るか悩みどころでしたが、皆ががっつりめなだったので時間配分的にあっさりめに収めたのは結果的に正解でした。

# スライド
<script async class="speakerdeck-embed" data-id="2242a0f0651840fcab26bec8631f2d16" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

# さいごに
紆余曲折を経て導入された並列デプロイオプション、使用にあたって承認ステップを省かせる必要がありますがデプロイ前にきちっとdiffを確認するなどして影響範囲を把握した上で活用してみるのは如何でしょうか。


# 参照
https://github.com/aws/aws-cdk/pull/21681
【RecursionCS】初回MTG議事録

2022年12月。
今年最後のチーム開発に参加しましたので、議事録や記録をまとめます。

## 個人的なチーム開発の目的
チームとしてのアウトプットを最大化したい。
- 自分個人：できることを増やす（フロント・バックエンド・全体設計）
- 他メンバー：自分が邪魔をせず実力を発揮できるようサポート
### なぜ？
- 実力を発揮できないことは苦しいから
- 自分の実力を決めつけると誰も成長できなくなるから
- 社会の課題を解決するにはチームの力の最大化が必要だから

## 各種ルールについて
### 定期MTGの流れ
1. 各メンバーの課題と進み具合を報告
2. レビュー/修正/マージ（必要に応じて）
3. 追加Issueの洗い出し
4. Issueの優先順位付け→追加
5. Issueの担当者を決定
6. 連絡事項の伝達

### GitHub関連

https://github.com/Recursion-Group-W
#### ①Commit messageの書き方
下記の接頭辞＋修正内容を記述

```
feat: A new feature
fix: A bug fix
docs: Documentation only changes 
style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
refactor: A code change that neither fixes a bug nor adds a feature
perf: A code change that improves performance
test: Adding missing or correcting existing tests
chore: Changes to the build process or auxiliary tools and libraries such as documentation generation
```
- feat: 新しい機能
- fix: バグの修正
- docs: ドキュメントのみの変更
- style: 空白、フォーマット、セミコロン追加など
- refactor: 仕様に影響がないコード改善(リファクタ)
- perf: パフォーマンス向上関連
- test: テスト関連
- chore: ビルド、補助ツール、ライブラリ関連

> [【参考】僕が考える最強のコミットメッセージの書き方](https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e)

#### ②Branchの命名
上記Commit messageと同じで大丈夫ですが、英語にする必要があります。

#### ③レビュー・マージ担当
PRを送ったあとに、レビュワーを設定ください。
レビューが完了次第、マージ担当者がマージを行い、不要なブランチを削除します。

#### ④Issueについて
定期MTGでIssueを追加していきますが、各自気づいた点があれば随時追加していきましょう。
Labelで優先順位を設定し、担当者をAssigneeに追加します。
またBranchにリンクが貼れるので、情報が重複しないように上手く活用するのが良いと思います。
（その場合はBranch名とIssue名を同一にすると、関連が分かりやすいのでオススメ）

## スケジュール
- 全体設計/WF作成：～12/24
- フロントエンド：12/25～1/21
- バックエンド：1/1～1/21
- デプロイ：～1/28

## 決定事項

### 使用する技術スタック
- フロントエンド：Next.js＋TypeScript＋TailwindCSS
- ゲーム画面：CanvasAPI（＋ライブラリ）
- サーバーサイド/DB：Netlify

### MTG日程
毎週月曜日・水曜日
21時～
IntuneでTRANSFORMS引数を含むmsiファイルを配布する方法


# 方法

- msiファイルと同じフォルダ内にinstall.cmdを作り、その中にmsiexecコマンドを書く
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380031/6cc1de7c-d9e5-727d-70a8-ac776a8d7bc5.png)
  ```bat:install.cmd
  msiexec /i "%~dp0SupportAssistx64.msi" TRANSFORMS="%~dp0SupportAssistConfig.mst" DEPLOYMENTKEY="<key>" /qn
  ```
  :::note
  例はDELLのSupportAssistという管理ツール
  `%dp0`は実行ディレクトリを表す
  `DEPLOYMENTKEY=`はこのツール独自の引数
  :::
- Microsoft-Win32-Content-Prep-Toolでintunewinファイルを作成する
  - https://github.com/Microsoft/Microsoft-Win32-Content-Prep-Tool
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380031/f87896f4-f9e9-d2ea-08f7-f985d5fd684c.png)

- IntuneのWin32アプリ配布でインストールコマンドを"install.cmd"にする

  | デフォルト値                             | 変更後          |
  |:---------------------------------------:|:---------------:|
  | `msiexec /i "SupportAssistx64.msi" /qn` | `"install.cmd"` |

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380031/84f8f70f-a7ac-7fd4-cf89-443d1709af7e.png)

おわり