OmniAICreator/Qiita-1.07M huggingface dataset:
Javaのオブジェクト指向プログラミング入門：初心者でもわかる基本の書き方：その２

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！

前回記事はこちら
https://qiita.com/k1morikawa@github/items/65b71ff9bdaa78085fd9

今回は具体的なオブジェクト指向Javaについて更に詳しく調べてみましょう！
![インスタスライド_202303062.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1c16fc31-1850-f673-43f9-a6b9061e7d09.gif)


# オブジェクト指向をJavaで書く

```java
// 人間を抽象クラス化

public abstract class 人間{

	abstract void 挨拶ｽﾙ();

}
```

```java
// 人間クラスをオバーライドして日本人クラス化

public class 日本人 extends 人間{

	void 挨拶ｽﾙ(）｛

		System.out.println("こんにちは");}

}
```

```java
// 人間クラスをオバーライドしてアメリカ人クラス化

public class アメリカ人 extends 人間{

	void 挨拶ｽﾙ(）｛

		System.out.println("Ｈｅｌｌｏ");｝

}
```

```java
//日本人、アメリカ人クラスをインスタンス化

///日本人をインスタンス化
人間 森川  = new 日本人();

///アメリカ人をインスタンス化
人間 ケント = new アメリカ人();

森川.挨拶ｽﾙ();
ケント.挨拶ｽﾙ();
```
```
こんにちは
Hello
```
# まとめ
ーJava版でオブジェクト指向を理解しよう

ー人間を抽象クラス化

ー人間クラスをオバーライドして日本人クラス化

ー人間クラスをオバーライドしてアメリカ人クラス化

ー日本人、アメリカ人クラスをインスタンス化

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
dockerのmysqlで"Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)"が出たときの解決例

## 何があった？
もともと動いていたdocker-composeのデータベースの設定周りをお試でいじった後コンテナを立ち上げたら題名のエラーが出てしまい、imageを全削除してもdockerやpcを再起動しても動かなくなってしまいました。

もちろん検索で一番よく出てくる`/var/run/mysqld/mysqld.sock`の追加も試しましたがこちらもうまくいきませんでした。

## このエラーの原因
筆者の場合ではdockerfileの間違った使い方（**エラー文には出ないsyntaxエラー**）によるものでした。

```yml:動かない書き方
===前略===
  mroonga:
    container_name: mroonga
    build:
      context: .
      dockerfile: mroonga.Dockerfile #←この中身が悪かった
    volumes:
      - ./logs/mysql:/var/log/mysql
      - ./local-docker/mysql/mysqld_charset.cnf:/etc/mysql/conf.d/mysqld_charset.cnf
      - ./local-docker/mroonga/00-install.sql:/docker-entrypoint-mroonga-initdb.d/00-install.sql
===後略===
```



## 解決した方法
下記のように作成者が想定した通りの使い方に戻すことでエラーがなくなりました。

```yml:エラーが直った
===前略===
  mroonga:
    container_name: mroonga
    image: groonga/mroonga:mysql-8.0-latest #←dockerfileでカスタマイズするのをやめた
    volumes:
      - ./logs/mysql:/var/log/mysql
      - ./local-docker/mysql/mysqld_charset.cnf:/etc/mysql/conf.d/mysqld_charset.cnf
      - ./local-docker/mroonga/00-install.sql:/docker-entrypoint-mroonga-initdb.d/00-install.sql
===後略===
```


## 補足
自分の場合はdockerfileが悪かった事によるエラーでしたが、環境変数の設定ミスによっても同じエラーが出ることがあるらしいです。

[この記事](https://stackoverflow.com/questions/11990708/error-cant-connect-to-local-mysql-server-through-socket-var-run-mysqld-mysq)の中盤くらいに記載があって、指摘内容はmysqlへの接続情報(hostなど)が指定されていないことによるエラーではと書いてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/46387f07-910f-8251-15c4-b9029300aef3.png)


また同じ記事内に、OSなど他ソフトとのバージョンがあっていないとこのエラーが出る指摘もあり、過去の経験的にはこちらもよく発生しそうだと思ったので紹介しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/24a0d223-0674-3627-e2b4-89203ce90470.png)
Lambda Layerで外部モジュールを使う

# 概要
Lambdaで標準ライブラリ以外を使用したい場合、モジュールをLambdaの関数と一緒にアップロードする方法がありますが、モジュールのサイズが大きいとコンソール上でコードを編集することが出来なくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/8054c67d-2eda-f80a-dbdf-f55a265297c2.png)

そのため、Lambda Layerを作成して、そこにモジュールをアップロードすることで、モジュールのサイズが大きくてもコードが編集できるようにします。

# 1.モジュールの準備

アップロードするモジュールを準備します。
以下を実行し、モジュールが入ったzipファイルを作成します。
なお、zipファイルが解凍されたときにpythonフォルダが出力され、
pythonフォルダ内にモジュールが入っている必要があります。
※任意のフォルダ名だと外部モジュールは使用できません。
```
mkdir python
pip install <モジュール>　-t ./python
zip -r layer.zip ./python
```

# 2.LambdaLayerの作成
AWSコンソール画面にアクセスして、Lambdaの設定画面を開きます。
左メニューから[レイヤー]をクリック→[レイヤーの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/ef96544c-e78e-805f-0fd5-785013525226.png)
レイヤーの作成画面から以下を行います。
1. [名前]に適当な名前を入れます。
2. Zipファイルをアップロードを選択し、作成したzipファイルをアップロードします。
3. アップロードするモジュールに合わせランタイムを選択します。
4. [作成]をクリックし、LambdaLayerを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/e85cf8ba-7548-90a1-cd78-9c2064dd4e10.png)
Lambda設定画面の左メニューより[関数]をクリックして関数一覧を表示します。外部モジュールを使用したい関数をクリックし、関数の設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/e7d6f5b0-dcce-12ec-6ed7-a3d0ceeac3c2.png)
画面下にレイヤー項目があるので、[レイヤーの追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/88d3579d-786f-3261-914b-a9ec04c6cfd2.png)
レイヤーの追加画面で以下を実施します。
1. [レイヤーソース]に「カスタムレイヤー」を選択します。
2. [カスタムレイヤー]に作成したLambdaLayerを選択します。
※関数のランタイムとLambdaLayerのランタイムが一致しないと選択できません。
3. [バージョン]を選択します。作成したばかりだと、1しかないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/71774891-275e-05c5-a3a3-7197e4662e6b.png)

[関数の概要]項目で、Layersに追加したLambdaLayer数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/cb5323c8-2674-e53d-2d09-26e9a727fe0b.png)

後は、外部モジュールを使用できるようにコードを書きます。
pythonだとimport文を使用すればいいです。

# まとめ
とりあえず、Layerにまとめておく方が関数にアップロードしておくより、スッキリする感じがします。バージョン管理もできるので、とりあえずLayerを作成しておいた方がいいと思います。次はTerraformで実装する方法を書きたいと思います。
2023/3/23主にITとかセキュリティの記事

東海市適応指導教室「ほっと東海　横須賀教室」を装った不審メールにご注意下さい
http://www.city.tokai.aichi.jp/item/51477.htm

先週のサイバー事件簿 - フィッシングが増加の傾向、改めて警戒を(3/21)
https://news.mynavi.jp/article/20230321-security/

TikTok、アルゴリズムを操作して特定の動画をブースト。同社幹部が明かす(3/21)
https://www.businessinsider.jp/post-267048

ＡＩブーム再燃「チャットＧＰＴ」が問う人間の価値(3/21)
https://newswitch.jp/p/36288

顏認証システムっていつの間に社会に認められたの？ 大阪駅で始まる顏認証改札(3/21)
https://agora-web.jp/archives/230320055328.html

バイナンスは米国の規制上の懸念に対応するも財務情報を提供できない(3/21)
https://nextmoney.jp/?p=57338

ロシア大統領府が職員に「iPhone使用不可」を通知　現地報道(3/20)
https://news.tv-asahi.co.jp/news_international/articles/000292216.html

SamsungのExynosモデムに脆弱性〜Googleは一部機能の無効化を推奨(3/20)
https://iphone-mania.jp/news-529193/

サプライチェーン攻撃への対策　3区分で脅威を押さえる
［第3回］(3/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/012300337/031700003/

見えたSaaS活用3カ条、先進企業JALやトリドールが試行錯誤で導いた勘所とは(3/22)
https://xtech.nikkei.com/atcl/nxt/column/18/02386/031600007/

懲りないマルウエアEmotetがまたも襲来、今度は謎の巨大化で500Mバイト以上に(3/22)
https://xtech.nikkei.com/atcl/nxt/column/18/00676/031600129/

テレワーク・セキュリティーをITIL4で整理、4つの側面と従うべき原則を活用(3/22)
https://xtech.nikkei.com/atcl/nxt/column/18/01687/00349/

もうインストールでつまずかない、好みのLinux環境を構築する
Part2 インストール＆環境構築編（初級）(3/22)
https://xtech.nikkei.com/atcl/nxt/column/18/02365/022400002/

なりすましメールを見抜く技術、「送信ドメイン認証」とは(3/22)
https://xtech.nikkei.com/atcl/nxt/column/18/01842/022100032/

さくらインターネットの電源トラブルで複数のサービスに障害、一部は数日間続く(3/22)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/021300234/

客の問い合わせはまず来ない　アナログから事業を立ち上げる(3/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092900316/031700007/
【AWS】RDSを同名で再作成したときにRDSイベント通知が動作しなくなるときの対処

既知のバグのようです。解決策としては単にイベントサブスクリプションを再作成してあげればOK。なお、修正が入るまで同名RDS再作成の度に再作成の必要があります。（**同名**の場合のみなので注意。検証まではしてないですが、RDS名をかえれば本バグはおこらないはずです。）

せっかくなので一連の手順書いていきます:bulb:

### 1.イベントサブスクリプション削除→作成
**①削除**
RDS→イベントサブスクリプション→該当RDSを選択→削除
![スクリーンショット 2023-03-23 1.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/3bde7237-708b-036a-bf8f-d8c12a40ff90.png)

**②作成**
イベントサブスクリプションを作成
・名前：イベントサブスクリプション名

・ターゲット：イベント発生時の通知先を指定
　SNSならARNです。

・ソース：どのRDSイベントに対して通知させるかを決定します。
　たとえばRDSインスタンスに関連する全てのイベントを通知したい場合は以下のような設定を入力します。
　インスタンス→すべてのインスタンス→すべてのイベントカテゴリ

![スクリーンショット 2023-03-23 2.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/5bcde676-d030-aa43-b3d6-fa2d3663d3f5.png)

上記、入力完了後に保存。

### 2.テスト（気になるなら）
基本は再作成だけでOKですが、気になるなら設定したソースにあわせてテストしてみましょう。以下のリンクのようにそれぞれけっこうな項目数があるので、その中からやってみればよいです。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Events.Messages.html#USER_Events.Messages.instance

下記ではデータベースの作成と削除でアラートがあがるか確認しています。てきとうに作ればよいだけですが、一応利用環境を考えて無料にするとか外部と通信しないなどの設定にしておくと良いかと思います。

**①作成**
データベース→データベース作成

変更する項目
・作成方法：簡単に作成
・エンジン：MySQL
・インスタンスサイズ：無料利用枠

簡単作成のデフォルト設定表示にて
「パブリックアクセス」が「なし」であることを確認
→データベースの作成

![スクリーンショット 2023-03-23 2.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/3640bca9-93af-6152-08e8-9b16eff7d9d2.png)

**②作成アラート確認**
上記RDS作成のアラートが出力されることを確認

**③RDS削除**
①で作成したRDSを削除

**④削除アラート確認**
上記RDS削除のアラートが出力されることを確認

作成アラートはこんなかんじの項目であがりました。
```
Event Source : 
Identifier Link: 
SourceId: 
Notification time :
Message : DB instance created
Event ID : http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Messages.html#RDS-EVENT-0005
```

このバグ知らないとRDS障害に気づけないという問題になりえるので、該当しそうなシステムは過去に作り直しとかしてないか見直ししたほうが良さそうです:pencil:
[NestJS]エンドポイントのレート制限方法

## 概要
作成したエンドポイントに対してレート制限をかける機会があったため、その際の手順を説明する。
大まかには以下の手順でレート制限を行う。

1. NestJS搭載のthrottlerをインストール
2. ThrottlerModuleとしてModuleファイルに設定(ttl、limitは一度ここで指定)
3. ThrottlerGuardをグローバルにバインドする（※重要！！）
3. 最後にthrottler()をコントローラーに適用させてあげる


## 1. NestJS搭載のthrottlerをインストール
まだインストールされていない場合は、以下でNestJS搭載のレート制限用パッケージをインストールする。
```
npm i --save @nestjs/throttler
```

## 2. ThrottlerModuleとしてModuleファイルに設定(ttl、limitは一度ここで指定)
次にapp.module.tsのimportsにThrottlerModuleを追加。（１つのコントローラーでしか用いない場合は同じ階層のmoduleファイルに記述しても良いかも）
```TypeScript
@Module({
	imports: [
	   ThrottlerModule.forRoot({
	      ttl : 3,
	      limit : 15,
	   }),
    ],
})
export class AppModule {}
```
ttl、limitの説明は以下の通り、
ttl：time to liveの略、単位は秒。
limit：ttlあたりに許容する最大リクエスト数。

ここで設定した値がレート制限のデフォルトの値となる。

## 3. ThrottlerGuardをグローバルにバインドする（※重要！！）
自分はこの工程を見逃して、うまくレート制限が反映されなかった。
このようにしないとThrottlerGuardがグローバルにバインドされない。
```TypeScript
providers: [
   {
     provide: APP_GUARD,
     useClass: ThrottlerGuard,
   },
]
```

## 4. 最後にthrottle()をコントローラーに適用させてあげる
レート制限を掛けたいエンドポイントにThrottle()を指定する。
Throttle()のパラメータを指定すると2で記載したttl、limitの値が上書きされる。
このようにしてNestJSではエンドポイントにレート制限をかけることができる。
```TypeScript
   @Throttle(3, 60)
   @Get('get-profile')
   @HttpCode(200)
   getProfile(){
      return "Get profile with custom Rate limiting."
   }
```
Kinesis Data FirehoseにおけるDynamic Partitioning

[前回](https://qiita.com/If_it_bleeds-we_can_kill_it/items/d2c806ee5e0b3dbe3af6)の記事でKinesis Data Firehoseの作り方を書いた。今度は引き続き、Kinesis Data Firehoseでの動的パーティショニングを利用するやり方を備忘として書く。

Kinesis Data Streams から Kinesis Data Firehose の Dynamic Partitioning を使って S3 に格納してみた
https://qiita.com/sugimount-a/items/edd136364a8e0d6cb725

AWSのエンジニアさんが書いた記事のとおり。既定だとS3などの保存先には勝手に日時のフォルダが切られる。例えば`2023/08/31/11/23/filename`といった具合に、S3にディレクトリとサブディレクトリが切られて、そこにストリームで流れたデータが格納される。

このとき、流すストリームのデータを特定のディレクトリに格納するとなると、ストリームを複数作ることになり煩雑。また、その都度ストレージ側（S3）でディレクトリを手動などで切る処理が必要があり、手間がかかる。
そういうケースで、このDynamicPartitioningを活用すると便利。

- DynamicPartitioningの処理
  - KinesisFirehoseが流れるストリームの中身を読み取る
  - 読み取ったヘッダの中身を抽出
  - 抽出内容の値でS3にディレクトリを動的に作成（動的パーティショニング）

- 注意
一度作った配信ストリームでDynamicPartitioningを無効にしていると、有効にできない（そういう動きだったはず、今はバージョンアップして変わっているかも？）。そのため、使う場合は配信ストリームを再度作り直す。

KinesisDataFirehoseで配信ストリームを新規作成する。

その際、S3バケット選択の箇所に動的パーティショニングの設定箇所がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/dee53331-06de-7536-2fc3-c20e004b5bd6.png)

これを有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/b6f06ab8-c4e9-eb54-de6d-2db68e99961e.png)

いくつかのオプション設定があるが、ここでは`JSON のインライン解析`を有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/87e7fca7-248a-3be3-18fa-700308b56785.png)

有効にすると、動的パーティショニングキーの設定画面が出てくる。JQでパースするための式とキーの名前を書く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/2c814915-ee91-35c7-43a9-3dc5a9b1d3fc.png)

初見でなんのことやらという感じで戸惑うが、ここはストリームするデータの中身についてを記述する。例えばストリームに流すデータに「Date」というヘッダがあり、そこに「YYYY-MM-DD」形式で値が入っているとする。S3バケットのディレクトリは「Date」ヘッダの「YYYY-MM-DD」部分を読み取って、その値を元に動的にディレクトリを作成してもらいたい。なおかつ、そこにマッチするデータだけを、S3の「YYYY-MM-DD」サブディレクトリに流したい。
その場合、このように記述する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/3be896b2-6111-81f1-f726-7ce543d1a865.png)

続いて、S3バケットプレフィックスを指定する。以下ではS3バケット直下に「`testbucketdir`」というディレクトリがあり、その配下に動的パーティショニングを作る構成としている。
`/!{partitionKeyFromQuery:Date}/`のDateの部分を自身の検索キーに変える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/e6402fc9-7689-78d8-6309-ca4996e05f32.png)

エラー発生時のログのS3保存先も指定。以下ではS3バケット直下に「`testbucketdir`」の配下「`/errdir/`」に保管するように指定している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/4ba9da39-0b75-4d01-e460-092c18355eca.png)

その他は暗号化やバッファサイズなどをよしなに設定して、ストリームを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/9370430f-7c0e-a1d1-fee7-c997b0eb2ef6.png)

上記で、S3バケット直下「`testbucketdir`」の配下に、「YYYY-MM-DD」形式のディレクトリが自動で作られて、そこにKinesisFirehoseで流れたストリームデータが格納されるようになる。
まさに名前の通り、動的にディレクトリをパーティションで分割して格納されるという算段。

とても便利な機能だった。

# 参考
Amazon Kinesis Data Firehoseの動的パーティショニング(jqパーサー)を試してみた
https://dev.classmethod.jp/articles/dynamic-partitioning-kinesis-firehose/

Amazon Kinesis Data Firehose の動的パーティショニングを利用してみた記録と注意点
https://qiita.com/kkkdev/items/e4c931bc54dcf3442a0b
msx0 に teraterm でシリアル接続する方法(文字化けして困っている人向け)

msx0 が書き込まれた M5Core2 を手に入れたので teraterm でシリアル接続をしてみる。

## M5Core2のドライバをインストール
シリアル接続をするためにまずは M5Core2 のドライバをインストールしておく必要があるので、こちらでダウンロードをします。

https://docs.m5stack.com/en/download

USB DRIVER & OPEN SOURCE LIBRARY という場所から私は Windows なので、CP210x_VCP_Windows をダウンロードしてインストール。

ドライバをインストール後、M5SCore2 を接続するとデバイスマネージャー上の COM ポートに CH9102(またはCP210x)と表示されたデバイスが見えればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/3c2a1af7-93be-1729-8aec-cd8013a2e1f0.png)

## Teraterm のダウンロードと初期設定

https://ttssh2.osdn.jp/

### Teraterm を起動しシリアル接続するが、文字化けの嵐、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/dcbff458-d032-d2a0-1fec-44eea228dc27.png)
シリアルポートは先ほどデバイスドライバで見えたポートが表示されているはずですのでそれを選択。

だがしかし、文字化けの嵐、、対策として2つ設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/2c445a0a-7527-9eda-0127-2be5144d1d0c.png)

### [設定]->[端末]設定で端末サイズを 80 x 25 に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/b84d506b-2ba9-d1a2-bb7b-c3169ccc5fc7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/29c1ebe1-b6c0-3567-781d-3572a5dbff57.png)


### シリアル接続の設定を変更する

[設定]->[シリアルポート]の設定を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/8d645d20-7a2f-2193-de99-4b8718c42f64.png)


[スピード]の設定を "115200" に設定して "現在の設定を再設定" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/3855e417-03b7-0657-a1d9-f5f136cb8fce.png)


## 設定完了、文字化けせずに表示できましたね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/5b4a740e-1f78-11ee-7458-b57b97d4577e.png)




次回も同じ設定を使いたい場合には [設定]->[設定の保存] をしておいてもいいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/50e1120c-cdd9-c809-8f70-4f827a275a64.png)


## 最後に
バックスペースが効かないんだけど？ってなりません？
私はなりました。

実はそれは問題ではなくて、Teraterm 上ではバックスペースを入力しても画面に反映されませんが msx0 の画面を見るとちゃんと入力されていますのでご安心を。(めちゃめちゃ小さな画面とにらめっこすることになりますけどね、、)
![IMG_5197.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84516/12b462a6-7c82-f63a-e27c-99a877c92ebf.jpeg)

では楽しんで！

次は Wifi の設定だとかをしたいんですが、16GB 未満の TF(microSD)カードを持っていないのでまた今度。
Makefile で for if sleep 演算 したのメモ

# はじめに
変に考えてしまって思いのほか上手くいかなかったのでメモとして残しておきます。
あとすっごい単純にこれだけ！みたいな記事が欲しくてという感じです:bow_tone1:


# メモ

```Makefile
aaa:
	@echo 'はじめ'
	@for i in {1..3}; \
		do sleep 1; echo $$i; \
    	if [ $$i -eq 2 ]; then \
    	  echo 'a'; \
    	else \
    	  echo 'b'; \
    	fi; \
	done 
	@echo 'おわり'
```

# 上記打った後の出力(打ったところから)

```
$ make aaa <= 打ったとこ

はじめ
1
b
2
a
3
b
おわり
```

# ここだった、、

余白ないと上手くいかないんですね、、

```
○[ $$i -eq 3 ]
×[$$i -eq 3]
```

# さいごに

Makefileにアレルギーなく挑めるようになれたらなと思いました！
Makefileって色々出来ていいですよね(◍•ᴗ•◍) :shamrock:

# おまけ

最終的に以下のようなもの作りたかった感じです。(意味なかったですが、、:cry:) ※ちなみに『app99』はコンテナ名

```makefile
db_check:
	@echo '次の処理始める前に何回か確認します。確認作業は最高30回ほどおこないます。'
	@for i in {1..30}; \
		do sleep 1; \
		app99_status=`docker inspect --format='{{.State.Status}}' app99`; \
    	if [ $$app99_status  == 'running' ]; then \
    	  echo 'DBサーバー動いていること確認出来ましたので抜けます。'$$i'/30 回目'; \
		  break; \
    	else \
    	  echo 'DBサーバー動いていること確認出来ませんでした。'$$i'/30 回目'; \
    	fi; \
	done 
	@echo 'おわり'
```

で以下もダメで(動作はしますが意味なかった処理)

```makefile
db_check:
	@echo '次の処理始める前に何回か確認します。確認作業は最高30かいほどおこないます。'
	@for i in {1..30}; \
		do sleep 1; \
		mysql99_socket=`docker exec -i -t mysql99 bash -c 'mysql_config --socket' | grep sock | cut -c 1-20`; \
    	if [ $$mysql99_socket == '/var/lib/mysql/mysql' ]; then \
    	  echo 'DBサーバー動いていること確認出来ましたので抜けます。'$$i'/30 回目'; \
		  break; \
    	else \
    	  echo 'DBサーバー動いていること確認出来ませんでした。'$$i'/30 回目'; \
    	fi; \
	done 
	@echo 'おわり'
```

最終的に以下に落ち着きました！

```makefile
db_check:
	@echo '次の処理始める前に何回か確認します。確認作業は最高30かいほどおこないます。'
	@for i in {1..30}; \
		do sleep 1; \
		mysql99_sock=`docker exec -i -t mysql99 bash -c 'ls /var/run/mysqld/mysqld.sock' | grep sock | cut -c 1-22 | sed 's/ //g'`; \
    	if [ $$mysql99_sock == '/var/run/mysqld/mysqld' ]; then \
    	  echo '確認出来ましたので抜けます。'$$i'/30 回目'; \
		  break; \
    	else \
    	  echo '確認出来ませんでした。'$$i'/30 回目'; \
    	fi; \
	done 
	@echo 'おわり'
```

参考
https://beiznotes.org/multiple-lines-in-makefile/
Livebook のコンテナが DockerHub から GitHub Container Registry に移行していた

## はじめに

Livebook 0.9.0 が出ました！

https://github.com/livebook-dev/livebook/releases/tag/v0.9.0

私はいつも Docker コンテナから Livebook を起動しているので、早速 Dockerfile の FROM 句を更新しようと思ったのですが、、、

https://hub.docker.com/r/livebook/livebook/tags

DockerHub の Livebook にまだ 0.9.0 のタグができていませんでした

## DockerHub に最新版がない理由

単純にまだプッシュしていないだけかな、とも思ったのですが、すでに2日経っているのに、、、

と思って調べてみると、以下の PR を発見しました

https://github.com/livebook-dev/livebook/pull/1792

> Docker Hub will soon drop free organizations (docker/hub-feedback#2314), so we plan to migrate all images to GitHub Container Registry.

DockerHub がフリープランの組織を削除しようとしているので、イメージをすべて GitHub Container Registry に移行するみたいです

どうも、以下のニュースが原因のようです

https://gigazine.net/news/20230317-docker-hub-image/

## GitHub Container Registry とは

DockerHub や ECR などのように、 GitHub 上にコンテナイメージを保存、共有する機能です

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry

パブリックパッケージの場合は無償利用可能なので、オープンソースにとってはかなり便利ですね

https://docs.github.com/ja/billing/managing-billing-for-github-packages/about-billing-for-github-packages

## どこからプルすればいいのか

今まで GitHub Container Registry を使ったことがなかったので最初分かりませんでしたが、 GitHub のリポジトリーからイメージに辿り着きました

GitHub リポジトリーの右メニュー Packages の中の [livebook](https://github.com/livebook-dev/livebook/pkgs/container/livebook) をクリックします

![スクリーンショット 2023-03-23 0.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/35f495ce-6cdb-0314-5f5a-95fc94e833f3.png)

すると、以下のようなページに遷移します

![スクリーンショット 2023-03-23 0.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/eb79413b-0bba-6178-39df-a681d8a1a508.png)

0.9.0 を使いたい場合、[0.9.0 のリンク](https://github.com/livebook-dev/livebook/pkgs/container/livebook/78741195?tag=0.9.0)をクリックします

![スクリーンショット 2023-03-23 0.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b590fb98-61f8-6e86-1503-02ce9ed779e9.png)

遷移したページに当該タグの使い方が表示されます

単に Pull して使いたい場合は以下のコマンドを実行します

> ```shell
> $ docker pull ghcr.io/livebook-dev/livebook:0.9.0
> ```

自分のコンテナにカスタマイズしたい場合は Dockerfile に以下のように記述します

> ```Dockerfile
> FROM ghcr.io/livebook-dev/livebook:0.9.0
> ```

これで私も無事 Livebook 0.9.0 を動かすことができました

![スクリーンショット 2023-03-23 0.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f05940ff-cf91-ee7a-cc62-feed3c6532ba.png)

## まとめ

使ったことはありませんでしたが、 GitHub Container Registry 結構便利そうですね

明日以降、 0.9.0 の機能を色々使ってみたいと思います
Rspecでインスタンスメソッドをinitializeメソッドを通過させずにテストさせるには

# Rspecでインスタンスメソッドをinitializeを通過させずにテストしたい！
過去の自分の行いに対しての戒め的記事。
Notベスプラ。

## こんなことありませんか？

あなたは保守運用がメインのエンジニアです。これまで問題なく普通に運用されていたシステムが実は要件が違っていた、あるいは問題が起こっていたが誰も気付かず、そのままにされていて、自分がそのシステムの担当になったときに発覚し、鬼クレーム。早急に直近発生している問題を解消しないといけない、なんて状況。

## 障壁
これまで不完全だった処理に少し手を加えて異常値を省く処理を加えた。
当然、既存のコードをややこしくしないためにメソッドを切り出して、インスタンスメソッドが増えるなどのはある。
そしてその追加したインスタンスメソッドテストを試したいのだが、initializeメソッドに環境に依存する処理など、通したくない処理がある。そもそもその実装が正しいかはさておき、影響範囲は少なくスピーディに対応したいとき。

```
module ABCDE
  class FGHIJ
    def initialize(dataset = 'production')
        環境依存や外部APIとの通信を挟んだり、する処理
    end

    def new_method
        XXXXX
    end
end
```

## プランA
テストの時のみ、ソースのインスタンスメソッドをクラスメソッド化させる。
```
module ABCDE
  class FGHIJ
    def initialize(dataset = 'production')
        環境依存や外部APIとの通信を挟んだり、する処理
    end

    
    def self.new_method
        XXXXX
    end
end
```

テスト。
```
require 'spec_helper'
module ABCDE
    RSpec.describe ABCDE::FGHIJ do
        describe 'new_method' do
            it 'hogehogehoge' do
                expect(ABCDE::FGHIJ.new_method)....
            end
        end
    end
```
テストは実行できる。一応、新しく自分が書いた部分のメソッドのテストはできる。
だがそもそもテストのためにソースコードを改変するのはキングオブナンセンス。

## プランB
allocateメソッドを利用する。
allocateを使うと指定したクラスのインスタンスを生成しつつ、initializeを呼ばないということができる！！

https://docs.ruby-lang.org/ja/latest/method/Class/i/allocate.html

```
require 'spec_helper'
module ABCDE
    RSpec.describe ABCDE::FGHIJ do
        describe 'new_method' do
            it 'hogehogehoge' do
                expect(ABCDE::FGHIJ.allocate.new_method)....
            end
        end
    end
```
これによりソースコードをいじることなく、テストを実行でき、initializeを通らなくて済む！

## まとめ
プランBでなんとかその場を乗り切ったが、本来はその時点で設計や、前任者を既存のコードの問題を抑え込むのが最高のソリューションではある。ただし、自身の実力や置かれている状況によっては、その選択はむしろリスクとなりうることもある。自分の対応がナンセンスであることを認識しつつも、既に成立して回っているビジネスを滞りなく回し続けるためにはミニマムソリューションを選択することもある。
dockerで立てたmisskeyインスタンスでファイルアップロードができない

# 起こったこと

Docker Compose を使って構築した Misskey で、ファイルのアップロードができなかった

https://misskey-hub.net/docs/install/docker.html

# 原因

コンテナ内で `files` の所有者がmisskeyではなくrootになっていたのが原因っぽい？

# 解決法

少し邪道な気はするけど、コンテナ外で

```bash
sudo chmod 777 files
```

を実行
工学院大学の学生アカウントの認証情報を検証する方法

## 目的
工学院大学周りのツール作ったりする中で、工学院大学の統合認証アカウントの認証情報を検証する方法を探していました。

一番手っ取り早いのはGoogle OpenID Connectの`hd`パラメータを使ってログイン可能なドメインを弊学の某ドメインに絞ることです（下参照）

https://developers.google.com/identity/openid-connect/openid-connect?hl=ja#authenticationuriparameters

でもこれだと生涯アドレスの認証になります。もし統合認証アカウントのログイン情報を検証したいという人がいたら、下の方法が参考になると思います。

## 方法概略
統合認証システムを使っているものの中の一つに、教育用のメールサービスがあります。メールの認証システム経由でログイン情報を検証すればいけます。

## コードサンプル
pythonで簡単なサンプル（ただ上の件を実行するだけ）
```python
from imaplib import IMAP4_SSL

m = IMAP4_SSL("弊学のIMAPサーバー")

try:
    [stat, msg] = m.login("ID", "パスワード")

    if stat == "OK":
        print("認証OK")
except:
    print("認証エラー")

```

## コメント
また認証システムが変わったら動かなくなります
[AWS Q&A 365][Cognito]AWSのよくある問題の毎日5選 #12

# 1. アマゾンコグニトは何ですか？
答え：アマゾンコグニトは、ユーザーのIDとデータ同期サービスで、モバイルおよびウェブアプリにユーザー登録、サインイン、アクセス制御を簡単に追加できます。また、デバイス間でデータを同期し、Facebook、Google、AmazonなどのソーシャルIDプロバイダーを通じてユーザーを認証する機能も提供しています。

# 2. アマゾンコグニトを使い始める方法は？
答え：アマゾンコグニトを使い始めるには、AWSアカウントに登録し、管理ユーザーを作成する必要があります。その後、ユーザープールとIDプールを作成することで、ユーザーを認証し、AWSリソースへのアクセスを提供することができます。

# 3. アマゾンコグニトの料金オプションは？
答え：アマゾンコグニトは、従量制の料金モデルを提供しており、使用した分だけ支払うことになります。料金は、ユーザープール内の月間アクティブユーザー数と、格納および転送されるデータ量に基づいています。

# 4. ユーザープールとIDプールを使用して、AWSサービスにアクセスする方法は？
答え：アマゾンコグニトを使用してユーザーを認証し、AWSサービスにアクセスするための一時的な資格情報を提供することができます。これを行うには、IDプールを設定して、AWSセキュリティトークンサービス（STS）を使用してAWSリソースへのアクセスを許可する必要があります。

# 5. Amazon Cognitoでのロールベースのアクセス制御のベストプラクティスは何ですか？
答え：Amazon Cognitoにおけるロールベースのアクセス制御のベストプラクティスには、ロールマッピング用のロールを作成し、パスロール権限を付与し、トークンを使用してユーザーにロールを割り当て、ルールベースのマッピングを使用してユーザーにロールを割り当てることが含まれます。また、マルチファクター認証や高度なセキュリティ機能など、適切なセキュリティ対策でユーザープールとアイデンティティプールを保護することも重要です。
[AWS Q&A 365][Cognito]Daily Five Common Questions #12

# 1. What is Amazon Cognito? 
Answer: Amazon Cognito is a user identity and data synchronization service that makes it easy to add user sign-up, sign-in, and access control to mobile and web apps. It also provides the ability to synchronize data across devices and authenticate users through social identity providers such as Facebook, Google, and Amazon. 

# 2. How can I get started with Amazon Cognito? 
Answer: To get started with Amazon Cognito, you need to sign up for an AWS account and create an administrative user. Then, you can create a user pool and an identity pool, which will allow you to authenticate users and provide them with access to AWS resources. 

# 3. What are the pricing options for Amazon Cognito? 
Answer: Amazon Cognito offers a pay-as-you-go pricing model, which means that you only pay for what you use. The pricing is based on the number of monthly active users in your user pool and the amount of data that is stored and transferred. 

# 4. How can I access AWS services with a user pool and an identity pool? 
Answer: You can use Amazon Cognito to authenticate users and provide them with temporary credentials that allow them to access AWS services. To do this, you need to configure your identity pool to use AWS Security Token Service (STS) to grant access to the AWS resources. 

# 5. What are the best practices for role-based access control in Amazon Cognito? 
Answer: The best practices for role-based access control in Amazon Cognito include creating roles for role mapping, granting pass role permission, using tokens to assign roles to users, and using rule-based mapping to assign roles to users. It is also important to secure your user pool and identity pool with appropriate security measures such as multi-factor authentication and advanced security features.
キーボード操作exeファイルでPCのスリープ設定を自動化

お疲れ様です。

昨日PCのキーボード操作自動化の実行ファイルを作成してみたので、作成手順を紹介します。

●作成経緯
作成の経緯として、自宅PCを外のカフェとかでもリモート操作できるようにする際、自宅PCが勝手にスリープしないようにする必要がありました。以下の設定画面（中国語ですみません）の①→②のように、上から4つを「ずっと行わない（从不）」に選択する必要があり、毎回設定するのが面倒だったので、一操作で完結できたら便利だと思いました。

（①	自動スリープ設定時：在宅時）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/777b46fe-357f-7210-eb80-76a83767bd60.png)

↓
（②	自動でスリープをしない設定：屋外でリモート操作をする時）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/b96ede4d-0ed5-4a92-f82a-a64187468e74.png)


●設計工程
使用ファイル：バッチファイル，exeファイル

実行順序：バッチファイルをダブルクリック→あとは上の②画面まで自動操作

作成手順：
①	設定画面切替後のキーボード操作を自動で行う実行ファイルを作成する。
②	（設定画面を開く）→（①の実行ファイルの実行）の順で処理するバッチファイルを作成する。


●作成手順の説明
①Visual studioでexeファイルを作成

Visual studioを開き、新しいプロジェクトの作成→以下のWindowsフォームアプリケーションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/e07bd28b-2a80-d0cf-4a77-c2790e422383.png)

↓
次の画面では、ファイルの保存場所,フレームワークを設定して「次へ」を押します。
↓
以下のような画面が表示されるので、右下のプロパティの中の稲妻マークの“イベント”からLoadイベントを探し“loaded”と入力して、すぐ右の空白でダブルクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/22e97456-d711-d738-fe2a-0c343558fac8.png)

↓
するとエディター画面に移動します。（下図）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/5c35aedd-7ba8-4182-2562-35f7ebaa3ff8.png)

↓
8行目に“using System.Threading;”と参照を追記し、下図選択箇所のようキー操作を記載します（①スリープ設定画面中では、↓キー8回,Tab, ↓キー8回,Tab, ↓キー8回,Tab, ↓キー8回の順の押下で②になります）。スレッドの実行完了と画面への反映に時差があるため、Thread.Sleep(2500)で2.5秒待機しています。最後“%{F4}”はAltとF4の同時押しで画面を閉じる操作になります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/6816af42-76db-09b6-d56e-79ac5c59314b.png)

↓
ソリューションのビルドでexeファイルを産生します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/c4940864-1c2e-ac4c-1d71-cf6ff169c728.png)

↓
以下位置にexeファイルが作成されました。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/8e329e8a-5b30-614e-9f96-66aa919ea867.png)



②	バッチファイルの作成

Memo帳を開き、以下をコピー貼り付けします。
```
@echo off
start "" "ms-settings:powersleep"
timeout 2 > null
start "" "（ここは先ほどのexeファイルのパスをコピーします）"
exit /B 0
```

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/1032c651-298f-5050-79c8-de06ac846c25.png)

↓
Ctrl+Sを押し、ファイル名を“（自分の好きな名前）.bat”にして保存します。
これで完成です。
↓
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/29c4ad4a-60f9-f9bd-a2d3-01de005a1b93.png)

作成したバッチファイルをダブルクリックするとスリープモードを自動で設定します。
Unixコマンドライン操作【基礎編①】

コマンドラインの基礎知識について1から復習中なので、
主に自分の備忘のために学んだことを記録しておこうと思います。

教材はRuby on Railsチュートリアルのコマンドライン編です。
https://railstutorial.jp/command_line/basics#cha-2_footnote-ref-2

macOSを使っています。

1.ターミナルの起動
Macの場合ターミナルの起動はComanndスペースからterminalと検索
terまで打てば予測でterminal.appが出てくる

2.コマンドラインの内訳
![スクリーンショット 2023-03-22 23.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291837/b50e0059-bfa9-bec6-5406-9e20441f4d33.png)

~%までがプロンプト（prompt）
次にコマンド（command）（ここでコンピューターにコマンドを渡す）・・rm
オプション（option）（別のオプションを渡す場合に使う）・・-f
引数（argument）（数学で言う関数の引数に相当）・・foo.txt

3.ターミナルのタブ追加
Macの場合、command + Tキーでタブを追加
またはシェル⇛新規タブを選択、でも追加できる

4.echoコマンドで文字列の出力
![スクリーンショット 2023-03-22 23.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291837/7a492f2f-f71e-c02d-8047-8197a34de4e5.png)
この場合、出力結果はいずれも「hello」になる
（"や'の有無によらない）

5.コマンドの入力ミスなどにより、入力不能となった場合
ctrl + Cキーで脱出できる

※escキーでも脱出できるらしいが、自分の場合なぜかうまくいきませんでした
（入力画面が一瞬白っぽくなっただけ・・）

6.manページについて
manコマンド　＋　調べたいコマンドで、そのコマンドに関する謎解説が出てくる
![スクリーンショット 2023-03-22 23.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291837/4582942d-ca46-dfdb-e780-8d41eb96bb1d.png)
manのページはQを押せば閉じる

7.コマンド入力に便利なショートカット

ctrl + A    　:入力中の行の先頭へ
ctrl + E    　:入力中の行の末尾へ
ctrl + U    　:入力中の行を全消し

8.ターミナル入力内容のクリア

clear コマンド
もしくは
ctrl + Lでターミナルをクリア

9.タブ（ウィンドウ)を閉じる

exit コマンド
もしくは
ctrl + Dでタブを閉じれる

らしい（試したが自分の場合プロセス完了のメッセージが出てきただけで閉じはしなかった）
![スクリーンショット 2023-03-23 0.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291837/0cc83c79-8bea-34eb-d230-f00bbec79a8f.png)
（もしやり方が間違っていたら、教えていただけたらうれしいです！）

今回はこんなところで

ありがとうございました。
WindowsにLaravelを初めてインストールしたらエラーが出たのでメモ

# はじめに
PHPでフレームワークをまともに使ったことがないのと、地元のお祭りの情報発信でちょっといろいろ作りたいのでLaravelに挑戦したなったのが発端。
さくらのレンタルサーバーにも導入できると聞いたので、そろそろPHPのフレームワークの一つくらい触っておかないとね、ということで。
ちなみに、Windowsでのお話。

# やったこと
- composerのインストール
    - インストーラを使ってもできるが、公式の[Download](https://getcomposer.org/download/) にかかれた手順でもOK。コマンドでインストールする場合でPHPのOpenSSLが有効じゃない場合、extension=opensslを有効にする必要がある。それと、composerを実行するバッチファイルを作成しないと気軽に実行できない。
- Laravelプロジェクトの作成
    - ここでエラーが出た
- node.jsのモジュールもインストール
- Laravelの初起動

参考にした[【Laravel】開発環境構築 Windows編](https://chigusa-web.com/blog/laravel-setup/)の通りにやれば構築できました。
ちょっとエラーが出たので、それをメモしておきます。

## Your requirements could not be resolved to an installable set of packages.

Laravelのプロジェクトを作ろうとしたらこんなエラーが出た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/e78e8371-0710-cd4c-c136-0722de79eec2.png)

調べてみると、php.iniを変更する必要があるようだ。
なので以下を追加した
```
extension=php_fileinfo.dll
```

そして、もう一度実行したら、空じゃないよ！と怒られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/39c45e32-49be-dc85-01a8-7c6e457c098d.png)

とりあえず、問題なくプロジェクトが生成されることを確認したかったので、sample-projectディレクトリを消して、再度実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/5dedcc01-c1bb-c998-0d29-09ba425de0e5.png)
PHPのバージョンが問題になりそうな警告が出ているが、とりあえずは完了した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/94d4b947-310a-8672-0f60-86db014b5456.png)

Laravelのバージョンを確認してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/0ac284f2-0e29-1096-2290-a53f4ddd69ef.png)

## Call to undefined function Illuminate\Encryption\openssl_cipher_iv_length()
作成したLaravelのプロジェクトをApacheのhtdocsに入れてアクセスした際に発生。
ググったところ、php.iniのextension_dirを絶対パスに変えてApacheを再起動すればよいという記事を見つけたので試したら解決。


# 参考

- [【Laravel】開発環境構築 Windows編](https://chigusa-web.com/blog/laravel-setup/)
- [【Laravel】インストールエラー対処法を実例で解説：Your requirements could not be resolved to an installable set of packages.｜require league/flysystem ^1.1 -> satisfiable
](https://prograshi.com/framework/laravel/installation-error-require-ext-fileinfo/)
- [PHP7.4 - openssl のエラーでハマった件](https://qiita.com/medialogo/items/5c22e51056ba84598105)
ChatGPTに要件定義からテーブルの作成までお願いしてみた

以下の記事を参考に、ChatGPTへ要件定義からER図の作成までお願いしてみたという内容です。

https://zenn.dev/yamadamadamada/articles/40d0594c1c6375


# テキストデータを保存できるwebアプリを作ります

今回は、テキストを保存してテンプレート化できるwebアプリを作ろうと思います。タグの設定と検索機能を実装し、簡単に呼び出せる仕組みを想定しています。呼び出したテキストデータは1クリックでコピーできます。


まず初めに、ChatGPTのロールを設定します。
「あなたはプロのWeb開発エンジニアとして回答してください」

### 要件定義

以下の大まかな概要を伝えて、機能要件をまとめてもらいました。
- ユーザーは新規登録することでログイン/ ログアウトできる
- ユーザーはテキストデータに名前を付けて保存できる
- ユーザーはタグを登録できる
- ユーザーはタグをテキストデータに設定して登録したテキストを識別できる
- ユーザーはテキストデータを検索できる
- ユーザーは登録したテキストデータを1クリックで保存できる
![chat.openai.com_chat(Surface Pro 7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/3dd15742-1bd7-af65-ff62-68ff6c142651.png)

これを元に要件を定義していきます。
少し修正したので「機能要件は次に修正してください」と依頼して要件を更新してもらいました。

## シーケンス図の作成
「PlantUMLでシーケンス図を書いてください」
![chat.openai.com_chat(Surface Pro 7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/252435f8-e12c-fb3c-cf48-3e05b1a54b39.png)

※PlantUMLを知らないので、こちらを参考にさせていただきました↓

https://applis.io/posts/plantuml-sequence-diagram

## DB設計
「第三正規化まで行い、テーブルを作成してください」
![chat.openai.com_chat(Surface Pro 7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/60efcd93-288d-0ace-abc1-2e930bf54788.png)
エンティティとテーブルを表記してくれました。
速い...これを元に、DiagramsからER図を作っていこうと思います。

※正規化とは↓

https://it-biz.online/it-skills/normalization/
【Linux】重複行を削除する方法

## 重複した行を削除する方法

## `uniq`と`sort`で削除
`uniq`コマンドと`sort`コマンドを使用して重複した行を削除できます。

```:ターミナル
$ sort 対象ファイル | uniq
```

`uniq`コマンドのオプションは以下のとおりです。
|オプション|説明|
|:---:|:---|
|-c, --count|各行の前に重複回数を出力する|
|-u, --unique|重複していない行だけを出力する|
|-d, --repeated|重複した行だけを出力する|
|-D, --all-repeated|重複した行を全て出力する|
|-i, --ignore-case|比較時に大文字と小文字の違いを無視する|
|-w N, --check-chars=N|行の比較を最初のN文字で行う|
|-s N, --skip-chars=N|最初のN文字を比較しない|
|-f N, --skip-fields=N|最初のN個のフィールドを比較しない|
|-z, --zero-terminated|最後にNULL文字を出力する|

## `sort`で削除
`sort`コマンドのみでも削除できます。
```:ターミナル
$ sort -u 対象ファイル
```

また以下のようにすることで対象ファイルを上書きできます。

```:ターミナル
$ sort -u 対象ファイル -o 対象ファイル
```
【Python】Atcoder勉強記録④

# atcoder復習
下記にatcoderで解いたB問題を記載します。
勉強の記録として残します。是非参考にしてください。
[解いた問題一覧](https://kenkoooo.com/atcoder/#/table/kenbo0224)

# 1.問題①
[B - Rectangle Detection](https://atcoder.jp/contests/abc269/tasks/abc269_b)（<font color="SpringGreen">Difficulty68</font>）

### 解答
```python
s_list = [] # 入力を受け取る
cnt_list = [] # '#'が何行目なのかを取得
cnt_list_1 = [] # '#'が何文字目かを取得
cnt = 1
cnt_1 = 1

s_1 = '' # '#'が付いた文字をセットする変数

for _ in range(10):
    s = input()
    s_list.append(s)

for i in s_list:
    if '#' in i:
        cnt_list.append(cnt)
        s_1 = i
        cnt += 1
    else:
        cnt += 1

if not s_1 == '':
    for j in s_1:
        if j == '#':
            cnt_list_1.append(cnt_1)
            cnt_1 += 1
        else:
            cnt_1 += 1

print(min(cnt_list), max(cnt_list))
print(min(cnt_list_1), max(cnt_list_1))
```
### 解法
入力を受け取りlistに格納する。
#が何行目から存在しているのかをfor文で確認して行数をlistに格納する。
#の文字を確認して#が何文字目から始まっているのかを確認してlistに格納する。
二つのlistの値を確認してminとmaxの値を取得して最後に表示する。
min→始まりmax→最後

# 2.問題②
[B - Everyone is Friends](https://atcoder.jp/contests/abc272/tasks/abc272_b)（<font color="SpringGreen">Difficulty139</font>）

### 解答
```python
N, M = map(int,input().split())
person = [set([]) for _ in range(N)]
# print(person) # [set(), set(), set(), set()]
for i in range(M):
    n_list = list(map(int,input().split()))
    for j in n_list[1:]:
        for k in n_list[1:]:
            person[j-1].add(k)
    # print(n_list[1:]) # [1, 2, 4], [2, 3, 4]
# print(person) # [{1, 2, 4}, {1, 2, 3, 4}, {2, 3, 4}, {1, 2, 3, 4}] set型のリスト

ans = "Yes"
for i in range(len(person)): # set型のlistをループする。
    if(len(person[i]) != N): # Nが参加人数とset型の要素数を見て違った場合にNoをセットする。全員参加している場合は一緒になる。
        ans = "No"
        break
print(ans)
```

### 解法
setのlistを用意して重複が無いようにする。
person[(set型)]にループでデータをセットしていく。各set()にデータが格納される。
ansの初期値は'Yes'にする。
for文でperson[]の要素数ループする。
person内にあるset()型の要素数と舞踏会に参加している人数が違った場合(少ない場合)はansに'No'をセットしてfor文を抜ける。
[Typescript]Callback hellを避ける

<h2>Callback Hellとは</h2>
aというapiを呼び出して、その呼び出し応答が来たら<br>
またbというapiを呼び出して、結果が出たら<br>
またcというapiを呼び出すとしたら<br>
コールバックに、コールバックに、このようなやり方で<br>
デプスが入り続ける問題が生じます。これをcallback hellと呼びます。

このようなコールバックヘルを解決するために出たスペックがpromiseです。

<h2>promiseとは</h2>
promiseはjavascript非同期処理に使用されるオブジェクトです。<br>
callback hellを避けるためにfetchというapiを使います。<br>
fetchはXHR（XMLHttpRequest）が様々な短所を持っているため補完材として出たapiです。（promiseベースのapi）<br>
簡単に説明すると、promiseオブジェクトをリターンしてそのpromiseオブジェクトが提供するthenという<br>
メソッドに非同期関数を連結して書くと、callback hell、depthが深まるcallback hell構造を <br>
まっすぐに広げられるコード構造を作成ができます。
<br><br>
<b>promiseもcallback構造ではありますが、コールバックにデプスを複数の深いデプスで作られず
1つのdepthで一直線に広げられる構造を提供します！<b>
<h2>promise example</h2>

```typescript

export class Api {
    xhr: XMLHttpRequest;
    url: string;
  
    constructor(url: string) {
      this.xhr = new XMLHttpRequest();
      this.url = url;
    }

    /**
     * XHRequest CASE
     * @param callback callback関数をパラメータとして受け取って、returnとして返す
     */
    getRequestWithXHR<AjaxResponse>(callback: (data: AjaxResponse) => void): void {
      // 同期コード
      this.xhr.open('GET', this.url);
      this.xhr.addEventListener('load', () => {
        callback(JSON.parse(this.xhr.response) as AjaxResponse);
      });
      this.xhr.send();
    }

    /**
     * Promise CASE
     * @param callback callback関数をパラメータとして受け取って、returnとして返す
     */
     getRequestWithPromise<AjaxResponse>(callback: (data: AjaxResponse) => void): void {
      // fecth(A,B)  A - URL, B - options(default : GET method)
      // return promoise object - resolve
      // catch - reject
      // fetch return promise object

      // returnされるpromiseオブジェクトがresolve(sucess)であれば、then()メソッドが実行され
      // リターンなるpromiseオブジェクトがreject(fail)ラーメンcatch
      fetch(this.url) 
        // xhrはJSON.parseを使用したが、短所が同期的に作動するということ。
        // jsonデータがとても大きくなったらuiが止まる問題点が存在する。
        // thenにて非同期処理にする。
        .then(response => response.json()) 
        .then(callback) 
        .catch(() => {
          console.log(" no data ");
        })
    }
}


export class NewsFeedApi extends Api {
  constructor(url: string) {
    super(url);
  }

  getDataWithXhr(callback: (data: NewsFeed[]) => void): void {
    return this.getRequestWithXHR<NewsFeed[]>(callback);
  }

  getDataWithPromise(callback: (data: NewsFeed[]) => void): void {
    return this.getRequestWithPromise<NewsFeed[]>(callback);
  }
}
```
【Rails】投稿一覧(テーブルタグ)

# 投稿した一覧表示方法

テーブルタグを使って下のように作っていきたいと思います～！！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111780/9a736cf3-4103-b73c-12fc-5d30249dd79c.png)

```php:view

<table class="table">
  <thead>
      <th>タイトル</th>
      <th>カテゴリー</th>
      <th>温泉質</th>
      <th>本文</th>
  </thead>

<tbody>
<% @spots.each do |spot| %>
<tr>
  <td><%= spot.name %></td>
  <td><%#= spot.category.try(:name) %></td>
  <td><%= spot.quality %></td>
  <td><%= spot.introduction %></td>
</tr>
<% end %>
</tbody>

</table>
Linuxのパフォーマンスチューニング

## 簡易チェックリスト
|  ツール　　　　　　　  |  チェック内容  |  見どころ  |
| ---- | ---- | ---- |
|  uptime  |  負荷の平均  |  １、５、１５分の平均の比較より負荷が上がっているか下がっているかわかる。 `w` でも同じ情報が確認可能  |
|  dmesg -T \| tail  |  カーネルエラー  |  OOMなど致命的なもの  |
|  vmstat -SM 1 | スワップ、CPU使用率などシステムレベルでの統計量 |  ※あとで見どころ追記  |
|  mpstat -P ALL 1  | CPU間のバランス  | CPUの使用率に偏りがある場合はスレッドのスケーリングに問題がある  |
|  pidstat 1  |  プロセス毎のCPUの使用状況。  |  予想外にCPUを消費しているプロセスや、各プロセスのユーザー/システムCPU時間を見る  |
|  iostat -sxz 1  |  ディスクのI/O統計 | ※あとで見どころ追記  |
|  free -mh  | キャッシュを含むメモリの使用状況 | Mem: の Total と Available  |
|  sar -n DEV 1  | ネットワークデバイスI/O  | パケットとスループット  |
|  sar -n TCP,ETCP 1  |  TCP統計  |  接続のスピード、再送 |
|  top  |  全体的なチェック  |  ※あとで見どころ追記  |

- 参考情報
[1] P.16


## 参考文献
[1] Brendan Gregg (著), 西脇 靖紘 (監修), 長尾 高弘 (翻訳) 　「詳解 システム・パフォーマンス 第2版」 ‎オライリー・ジャパン
【Azure】作成から一定期間経過したSnapshotを自動削除する仕組みを導入してみた

# 前提
メンテナンス時など、バックアップを取る際にスナップショットを手動で取得している。

# 課題
メンテナンスが問題なく完了した後、不必要になったスナップショットの削除を行う運用ルールがなく、スナップショットが残り続け無駄なコストが発生していた。

# 目的
スナップショット作成から一定期間経過したものは削除する仕組みをAzure Automation Runbookに登録し日次実行する。
以前AWSで作成したもののAzureバージョンを作ってみる。

https://qiita.com/Pluton/items/e627fc7602f391830fa5

# ソース
~~~powershell:auto_delete_snapshot.ps1
# 自動削除するスナップショットの作成日が何日前かを指定する変数を設定
$RetentionPeriodDays = 7

# 削除対象のリソースグループ名を指定
$ResourceGroupName = "TestAD"

# システム割り当てマネージド ID を使用して Azure に接続する
$AzureContext = (Connect-AzAccount -Identity).context

# コンテキストの設定と保​​存
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

# 保持期間より古いリソース グループ内のすべてのスナップショットを取得する
$OldSnapshots = Get-AzSnapshot -ResourceGroupName $ResourceGroupName | Where-Object { $_.TimeCreated -lt (Get-Date).AddDays(-$RetentionPeriodDays) }

# 保存期間を過ぎた削除対象のスナップショットを削除
foreach ($Snapshot in $OldSnapshots) {
    Remove-AzSnapshot -ResourceGroupName $ResourceGroupName -SnapshotName $Snapshot.Name -Force
    Write-Output "Deleted snapshot: $($Snapshot.Name)"
}
~~~

# スケジュール設定
日次実行が行えるよう以下設定を行います。
Automationアカウント > スケジュール > スケジュールの追加 > 以下のように必要情報を入力
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480824/3fe8e194-194a-449f-fed0-38398a0196ef.png)

Automationアカウント > Runbook > 該当のRunbookを選択 > スケジュールへのリンク > スケジュールをRunbookにリンクします > 事前に作成したスケジュールを選択

上記を実施し、以下のようにリンクされたRunbookに実行対象のRunbookが表示されていれば成功です。
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480824/e900780a-4902-ea88-e158-f0d82b22a8e8.png)


# ロールの設定
Automationアカウントに以下ロールを割り当てます。

Automationアカウント > ID > Azureロールの割当 > ロールの割当の追加
├ ディスクスナップショットの共同作成者
└ Automation オペレーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480824/455ed95c-ce8a-09b7-e65b-ac9d9fae559a.png)

# まとめ
AWSで同様の仕組みを構築した時と比べて、少々癖を感じました。
（慣れもあると思いますが...）
特にロールの設定に関しては、選択肢がかなり多く取捨選択の難しさがありそうです。
そして何より、AWSと比較してブログ記事やQiitaの記事が少なく、ハマった際の調査が難航しました...

個人的な意欲面も含めてやはりAWSの方が好きかなぁと感じた次第です。
VSCode に Polyglot Notebooks を入れて C# Hello, World! を実行してみる

なんか、面白そうなのが出てる。

https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode

Jupyter Notebook が VSCode 上で簡単に使えるってことかな。

## 始め方

1. VSCode で拡張機能をインストール
1. 拡張子 `.ipynb` でファイルを作る
1. 右上で Detecting Kernel ？（適当にやっていたので不正確・・・）がくるくるしていたのでクリック
1. 環境のインストールを進められるのでいわれるがままにインストール
1. なんか準備できたっぽい

## 使い方

### Code
1. `+ Code` をクリックしてブロックを追加
1. 実装する
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/a613a5ba-c016-aa38-b57c-60ff31da297c.png)
1. 実行マークをクリック
1. 結果が表示された！
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/85b18064-fd2e-79af-c353-3d3bbb5a0093.png)

#### 例
こういうの、さっと確認できる。（早く覚えなさい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/c87dec14-5b9e-b460-e185-6c20166d936e.png)

### Markdown
1. `+Markdown` をクリックしてブロックを追加
1. Markdown で書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/32a84b73-b261-f8f1-6e95-5af78172d900.png)
1. Stop editing cell （チェックマーク）をクリック
1. 表示された！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/ae8e2264-3985-9ba8-7caf-2d79058fadb6.png)




## まとめ

とっても簡単に C# のお手軽実行環境ができました。
どうやって書いたらいいんだっけ？みたいな簡単なテスト実装はこれで書き溜めていこうと思います。

## 関連リンク

https://devblogs.microsoft.com/dotnet/announcing-polyglot-notebooks-harness-the-power-of-multilanguage-notebooks-in-visual-studio-code/
obnizのGPIOでGNDをとるときの注意

## はじめに

obnizを使ってとある工作↓をしているときに少し詰まったことがあったので、備忘録としてまとめました。

https://protopedia.net/prototype/3683

## 詰まったこと

![無題の図形描画 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/0bb4f6ad-6995-4f1e-2236-02c55615316b.jpeg)

上記の様な感じでobnizのGPIOとセンサを繋いでいたのですが、センサに電源がうまく供給されず、センサを扱うことができませんでした。
当初書いていたobnizでのコードは下記の様な感じです。

```javascript
const gnd = obn.getIO(0);
const vcc = obn.getIO(1);
const signal = obn.getIO(2);
gnd.output(false);
vcc.output(true);
signal.input(async (value) => {
  // signal検知 
});
```

とりあえず電源（vcc）のoutputを`true`にしてgndを`false`にすればセンサへの電源が取れるのではないだろうか？と、安直に考えてました。

しかし、実行すると以下のようなエラー表示が出てきました。

```
heavy output. output voltage is too low when driving high
```

どうやら電源vccのところの電源が足りていないとのこと

## 内部プルアップを有効化した

結論から書くと、以下のようにコードを修正するとうまくいきました。

```javascript
const gnd = obn.getIO(sensor.gnd);
const vcc = obn.getIO(sensor.vcc);
const signal = obn.getIO(sensor.signal);
gnd.pull("5v"); // <--
gnd.drive("open-drain"); // <--
gnd.output(false);
vcc.output(true);
signal.input(async (value) => {
  // signal検知
});
```

追加したのは以下の２行です。

```javascript
gnd.pull("5v");
gnd.drive("open-drain");
```

`gnd.pull("5v")`で、プルアップが有効化されます。`gnd.drive("open-drain")`はオープンドレインで駆動させるという意味ですが、試行錯誤で記述したものなので必要なものかよくわかってません。

https://obniz.com/ja/doc/reference/common/io/pull-up-down

## さいごに

結論として、obnizのGPIOでGNDをとるときは内部プルアップを有効化しないとうまく電源が動作しないということがわかりました。
しかし、この解決方法はドキュメントを参考にしたわけでもなく、試行錯誤しながら結果として動作できるようになっただけのものなので、正しいかどうかわかりません。指摘あれば編集リクエストお願いします（特にobnizの方）。
SNMP の紹介

# SNMP とは
Simple Network Management Protocol
ネットワークの監視に使う。

- SNMP v1
- SNMP v2 ほとんど使われず、 SNMPv2cに移行した
- SNMP v2c 現在最もよく使われている
SNMP v3 暗号化


# 機器構成

データ送信側がエージェント
データ受信側がマネージャ

複数のエージェントの値を1台のマネージャが受ける。

エージェントのネットワークの流量、CPU温度、その他センサー値など様々な値をマネージャで集積することができる。



# プロトコル

TCP 、UDP 両対応しているが、一般的にUDPが使われる。


ポート161 マネージャ→エージェント(SNMPコマンド、ポーリングによる取得)
ポート162 エージェント→マネージャ(SNMPトラップ、エージェントからプッシュ)


# MIB

管理情報ベース、 MIB というファイルを用いて属性を決定する。

MIB は ASN.1 形式で記述されたテキストファイルとなる。


# SNMP コミュニティ

SNMP 構成要素は MIB でコミュニティ名を設定する。
ネットワークで接続された SNMP 構成要素のうち、コミュニティ名が同じもの同士で通信を行う。
デフォルト値は public 。

# SNMP データの可視化

SNMPマネージャで収集した値を、別のソフトを使って蓄積や可視化を行う。

例：ZABBIX 

以下は ZABBIX で可視化した 3台 の CO2 センサ値。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e5e01765-b4cd-d852-c7b4-cbb635adfd60.png)


# 実装

net-snmp が標準


# リンク

- 「SNMP 独自エージェントを作成してスクリプトの結果を監視する」https://qiita.com/nanbuwks/items/fd1965187350b1dd98a2
- 「Ubuntu や Raspberry Pi に SNMP をインストール」https://qiita.com/nanbuwks/items/3632b3180e587152bfc7
- 「Zabbix を Raspberry Pi にインストール」https://qiita.com/nanbuwks/items/42a3c7e740e721bffbf7
- 「SNMP でスクリプトの実行結果を表示する」https://qiita.com/nanbuwks/items/b23cc954ff1ddef000e5
プログラマは精神力があれば活躍できると思う理由

私の等身大の経歴は以下のような感じです。
こんな私ですが、「プログラマとして大事なのは精神力」という自論を書いていきます。
* エンジニアとしての経歴は10年以上
* 現在はプロジェクトマネージャをやっている
    * 現在持っているチームメンバーは10人くらい

# プログラマに必要な力とそれが精神力で解決できる理由

まず、各フェーズにおける「必要な能力」と「必要な精神力」を書いていきます。
* 開発前フェーズ
    * 必要な能力：技術のキャッチアップをし続ける
    * 必要な精神力：難しい技術も諦めずに理解する精神力とキャッチアップし続ける精神力
* 開発フェーズ
    * 必要な能力：キャッチアップした技術を使用して、正確に実装する
    * 必要な精神力：適当にやらない根気強さと考え抜いて実装する精神力
* テストフェーズ
    * 必要な能力：正確にテストする
    * 必要な精神力：どのようなテストが必要かを考え抜く力と正確にテストをし続ける精神力
* デプロイ
    * 必要な能力：突発的なトラブルにも対応する
    * 必要な精神力：どんなに解決が難しいトラブルでも自分が解決するという気概
* 全フェーズ共通
    * 必要な能力：コミュニケーション
    * 必要な精神力：相手から逃げずに理解しようとする精神力（特にお客さんから無理難題を言われた時にも逃げずに理解しようとすることは大事）

# まとめ

色々書きましたが、要するに
逃げずに立ち向かい自分でどうにかするという気概を常にもつ必要ということに収束すると思います。

上記のことから、精神力があれば、どのフェーズでも活躍できると言えると思いっています！！


ちょっとした地頭の良さみたいなものも必要かと思いますが。
Vimのカーソルの移動

## どこにカーソルがあるか。

なぜエディターを使うかというとソースプログラムの編集においてです。
編集という作業はプログラムの全体、プログラムの中のルーチンの確認をおこないます。
見れるところはすべて見る、それをいかに早く進めるかということです。
そのためにはスクロールとジャンプの機能を備えていればエディターと言えます
その意味でVimは最適のものと言えます。

ノーマルモードは全体の操作を受け持ち、インサートモードをは入力を受け持ちます。 
カーソルの移動はノーマルモードになります。インサートモードの中でもカーソルの移動は出来るのですが補助的なものになります。 
どこにカーソルがあるかを意識する。このときはノーマルモードです。

## カーソル移動
|数|コマンド|説明|
|:-----------:|:------------:|:------------|
|N|k|上に移動|
|N|j|下に移動|
|N|l|右に移動|
|N|h|左に移動|
| |0|（または^）文頭に移動|
| |$|文末に移動|
| |gg|行頭に移動|
| |G|行末に移動|

## スクロール
|数|コマンド|説明|
|:-----------:|:------------:|:------------|
|N|CTRL-E|画面を N 行下方向スクロール(デフォルトは1)|
|N|CTRL-D|画面を N 行下方向スクロール(デフォルトは画面 の半分)|
|N|CTRL-F|画面を N ページ分下方向スクロール|
|N|CTRL-Y|画面を N 行分上方向スクロール(デフォルトは1)|
|N|CTRL-U|画面を N 行分上方向スクロール(デフォルトは画面 の半分)|
|N|CTRL-B|画面を N ページ分上方向スクロール|

## 画面
|数|コマンド|説明|
|:-----------:|:------------:|:------------|
|N|H|画面上で N 行目の最初の非空白文字に移動|
| |M|画面上の真ん中の行の最初の非空白文字に移動|
|N|L|画面上で下から N 行目の最初の非空白文字に移動|

## 現在行
|数|コマンド|説明|
|:-----------:|:------------:|:------------|
| |z[CR]|現在行を画面の１行目にして、再描画
| |z.|現在行を画面の中央にして、再描画
| |z-|現在行を画面の最下行にして、再描画

## ジャンプ
|数|コマンド|説明|
|:-----------:|:------------:|:------------|
|N|CTRL-O|ジャンプリストの N 番目に古い場所に移動
|N|CTRL-I|ジャンプリストの N 番目に新しい場所に移動
||:ju|ジャンプリストを一覧表示
||``|直前のジャンプコマンドの前の場所に移動


このノーマルモードの操作を暗記できれば楽になります。
報連相で気を付けること

## はじめに
こんにちは！新人エンジニアのふかこうです！
今回は私が仕事で経験し学んだ報連相で心掛けなければいけないこと3選を共有したいと思います。
## この記事の対象者
・初級エンジニア
・エンジニアとして働きたい方
・IT企業に就職する学生
## 筆者のレベル
・新人エンジニア

## 1.誰に向けたものなのか
報連相をするのにも方法は色々あると思いますが、よく使われるのはチャットツールやメールがほとんどだと思います。
そんな時に気をつけなければいけないのが、**メンション or CC**です！
誰を対象に報連相をしているのかわからなければ、メッセージの見落としに繋がってしまいトラブルの原因になりかねません。

## 2.内容の具体性
相手に送る内容が抽象的だと、相手にきちんと内容が伝わってなく、認識齟齬が生まれる原因につながってしまいます。
詳細を記述したり、伝える内容に関連する資料なども共有するといいと思います！


## 3.返信の速さ
報連相したことの内容にもよりますが、基本的に自分から相手に伝えているので、相手から返事が返ってきたら早めに対応することは大切です。
チャットツールなどではスタンプなどでリアクションを取っておくのも内容を読んでいるかいないかの区別ができるので大事だと思います。

## まとめ
今回共有した3選は自分が報連相をする上で特に気をつけていることなので、他にも気をつけることはあると思います。社会で働く上で最も大切と言ってもいいものなので、十分に気を付けていきましょう！
PostgreSQLのCOPYコマンド

ファイル↔️テーブルの間でデータをコピーする。
```
COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
```
```
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | PROGRAM 'command' | STDOUT }
    [ [ WITH ] ( option [, ...] ) ]
```
## option
```
    FORMAT format_name
    OIDS [ boolean ]
    FREEZE [ boolean ]
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL ( column_name [, ...] )
    FORCE_NULL ( column_name [, ...] )
    ENCODING 'encoding_name'
```
## 参考サイト
https://www.postgresql.jp/document/9.4/html/sql-copy.html