OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクト指向プログラミング

# オブジェクト指向とは
* オブジェクトという概念で処理対象を捉え、これをモジュール化していくことで全体を構成するやり方
* モジュールの独立性が高く、保守しやすいプログラムを作ることができる。

オブジェクト指向とは、```クラスを使って抽象化すること```です。

## オブジェクト指向の三原則
### 継承
同じようなプログラムを1か所にまとめて```コードを再利用しやすくする```仕組み

似たようなオブジェクトを複数作る時に、全てのプロパティやメソッドをいちいちプログラミングするのは非常に手間が掛かりますが、```継承を使うことにより、同じ機能を実装```できます。

ゲーム作成に例えると、「車」に「トラック」も追加しようとした場合。基本操作は同じため追加も簡単にできるのです。

### 差分プログラミング
継承している上で不足している部分だけプログラミングを行う手法。
出典 https://gihyo.jp/book/2022/978-4-297-12375-8

### カプセル化
```他のプログラムからできるだけ変更できない```仕組み

オブジェクトが持つデータや処理のうち、```別のオブジェクトから直接利用される必要のないものを隠す```ことを言い、利用する場合は```外部から操作するために作られた処理を設ける```ことを言います。
プログラムが壊れにくくなると共に、```大人数で開発をするときすべてのコードを認識```する必要がなくなります。

### ポリモーフィズム
継承したコードの一部を変更して利用するための仕組み

```クラスによって同一のメソッドで異なる処理が行える```という性質をいいます。

世の中の家電は説明書を見なくてもだいたい使い方がわかりますよね。
車においてもアクセルが右というふうに決まっています。
プログラムも同じ処理の名前で動いてくれると、処理名を覚える必要もないし、ミスも減らすことが出来るのです。
    出典 https://robo-done.com/blog/2021/04/doneship_object_oriented/#:~:text=%E3%80%8C%E3%81%82%E3%82%8B%E5%BD%B9%E5%89%B2%E3%82%92%E6%8C%81%E3%81%A3%E3%81%9F,%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82

# オブジェクト指向の「カプセル化」とは
データやメソッドという```複数の要素たちをまとめたもの```。
```ひとまとめの構造にカプセル化```されることで、オブジェクト内部の構造は、```外部から知ることができなくなる```。
```知るべき情報以外は知らなくて良い```と隠すことができる。
これを```情報隠蔽```というカプセル化の利点。

オブジェクトの実装方法に修正を加えても、その影響を最小限にとどめる。

# クラスとインスタンス
### クラス
オブジェクトが持つ性質を定義したもの

### インスタンス
属性値を与え、メモリ上に生成して実体化させたもの

# クラスには階層構造がある
クラスの考え方の基本は、「オブジェクトを抽象化して定義する」こと。

### 抽象化とは？
* 「抽象的な概念を理解する」とは、物事を「大きな視点で```俯瞰（ふかん）的に捉えられる```」ことです。また、```大きな視点で俯瞰的```に捉えることによって、「```全体の構造を把握```する」
* 細かなことは取りあえず脇に置いておいて、「```特徴を理解しやすくする```」感じです。
* ```物事の目的や意味、本質```を捉えられる。

## 階層構造の特徴
p５８９の図を見る。
下位クラスは上位クラスのデータやメソッドなどの構造を受け継ぐことができる。

### 継承
このように```サブクラスがスーパークラスの特性を受け継ぐ```こと

#### スーパークラス（基底クラス）
オブジェクト指向において```クラスの親子関係が成り立つ場合の親側```のクラスのこと
出典 https://www.sophia-it.com/content/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%AF%E3%83%A9%E3%82%B9

#### サブクラス（派生クラス）
オブジェクト指向において、```クラスの親子関係が成り立つ場合の子側```のクラスのこと
出典 https://www.sophia-it.com/content/%E6%B4%BE%E7%94%9F%E3%82%AF%E3%83%A9%E3%82%B9

# 汎化と特化(is a関係）
スーパークラスとサブクラスの関係で成り立つ。

### 汎化
下位のクラスが持つ```共通の性質を、抽出```して上位クラスとして定義する
#### 気づき
抽象的にするのか。

### 特化
抽象的な```上位クラスを、より具体的```なクラスとして定義する。
#### 気づき
具体的にするのか。

# 集約と分解(part of関係)
継承関係のない上位クラスと下位クラスの関係で成り立つ。

### 分解
下位クラスは```上位クラスの性質を分解```して定義したもの。
* あるオブジェクトを構成するオブジェクトへ展開すること
#### 気づき
グループの中の一つなのか。

### 集約
上位クラスは```複数の下位クラスを集約```して定義したもの。
* 構成オブジェクトを一つのオブジェクトにまとめること
#### 気づき
グループのように想像するのか。

# 多様性（ポリモーフィズム）
同じメッセージを複数のオブジェクトに送ると、```それぞれが独立した固有の処理```を行う。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

https://gihyo.jp/book/2020/978-4-297-11781-8
g++のboostで-lboost_program_optionsオプションつけたのにundefined reference

# 問題
```bash
$ sudo apt-get install libboost-all-dev
```
をして
```
$ g++ -lboost_program_options -lboost_filesystem  main.cpp
```
を実行すると
```
main.cpp:(.text+0x48): undefined reference to `boost::program_options::operator<<(std::ostream&, boost::program_options::options_description const&)'
```
のようなエラーがずらっと出てくる

# 解決
`-lboost_program_options -lboost_filesystem`は必ず**最後**に指定する必要がある．
つまり
```
$ g++ main.cpp -lboost_program_options -lboost_filesystem 
```
の形式で実行する必要がある．


# 参考文献
[C++ Boostによるコマンドライン引数処理](https://www.trifields.jp/cpp-boost-program-options-950)
rails apiでCarrierwave使用する際にreact(material-ui)でデフォルト画像を設定する方法

はじめに
--
現在rails api + typescript(react)でポートフォリオを製作中で、
userがログインしているときはヘッダーにプロフィール画像が表示される機能を実装しようと考えていました。

↓こんな感じに画像を表示させたいと考えていました。
![スクリーンショット 2022-08-29 0.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641341/d02ac188-a490-d91a-0131-a268e22e077c.png)

ですが、railsをapiモードで"carrierwave"のgem使うのは初めてで少し身構えたのですが、
material-uiを使えば便利にデフォルト画像を設定して、レイアウトも整えてくれてとても便利でした。

学習のアウトプットとして備忘録として残します。
同じことをしたい人の助けになれば幸いです

環境
--
react 18.0.0
material-ui 4.12.4 (5系の場合は書き方が少し違うかもしれないので注意です)
rails 6.1.4
M1mac

material-uiが全てを解決してくれた
--
railsでviewを書いている時は、"carrierwave"の設定でデフォルト画像を設定していたのですが、reactだとどんな風に書けばいいんだろう？
railsにデフォルト画像を設置してaxiosでデータを持ってくる記述をすればいいのかな？等色々考えていたのですが、書くコードが多くなりそうでもっと簡単に実装する方法はないか考えていました。

そんな時に、material-uiにとても便利な<Avatar>というコンポーネントというものを見つけました！


Avatarの使い方
--
結論だけ書くと、下記のように書けば画像データがない場合にデフォルト画像を表示してくれます。
めちゃくちゃ簡単ですね。
しかも最初から画像を丸くしてくれているんです！！ありがたい。。（もちろん設定で四角にもできます）

~~~react
<Avatar src={currentUser?.image.url} />
//=>srcには画像のurlを代入する(今回はログイン中アカウントの画像urlを代入しています)
~~~

※デフォルト画像
![スクリーンショット 2022-08-29 1.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641341/b22d13e1-e418-f8b8-485b-16cfba767683.png)

※画像をアップロードしている場合はその画像が表示される
![スクリーンショット 2022-08-29 1.32.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641341/aec41a3c-a058-7081-9eb7-88848452e579.png)

一体何が起きているのか
--
Avaterはデータを読み込めない場合に備えてデフォルトで画像が用意されています。
そのため、今回はsrcが読み込めなかった場合（今回だとログイン中のアカウントがプロフィール画像を設定していない場合）はデフォルトの画像が表示されました。

ちなみに、Avaterにはsrcと一緒にaltを記述することができます。
srcが読み込めなかったときは、altに記述されている文字列の最初の一文字が表示されます。(imgタグと似ていますね。）

ちなみに下記の記述の場合は、Aが表示されます。
![スクリーンショット 2022-08-29 1.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641341/55113e42-6175-edf9-228a-4e8e41b56647.png)

~~~react
<Avatar alt="Allan Saint-Maximin" src="存在しない画像のurl" />
~~~

もっとAvaterは色々とカスタマイズできるので、ぜひ公式ドキュメントを覗いてみてください。

https://v4.mui.com/components/avatars/
[UiPath] よくわかるモダンフォルダ(ジョブ/スケジュール設定OC2022.4編)

こんにちは。[UiPath Friendsコミュニティ](https://uipath-friends.doorkeeper.jp/)運営メンバの @masatomix です。
[[UiPath] よくわかるモダンフォルダ(ジョブ/スケジュール設定編)](https://qiita.com/masatomix/items/91887e9edc89975f9cd9) の続きです。



## イントロ

前回の記事で、**UiPath Orchestrator 2021.10.x ではジョブ/トリガー設定時のマシン指定方法が改善された**って話をしました。その際に参考って追記しちゃったんですが、**OC2022.4.x はもうすこし改善していた**ので、今回はそれについてです。


| バージョン | ジョブ                                                       | トリガー                                                     |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| OC2020     | ・フォルダ内の全マシンのいずれか<br />・マシン指定               | ・フォルダ内の全マシンのいずれか                               |
| OC2021     | ・フォルダ内の全マシンのいずれか<br />・**テンプレートを指定**<br />・マシンを指定 | ・フォルダ内の全マシンのいずれか<br />・**テンプレートを指定**<br /> |
| 参考<br/>OC2022.4     | ・フォルダ内の全マシンのいずれか<br />・テンプレートを指定<br />・マシンを指定 | ・フォルダ内の全マシンのいずれか<br />・テンプレートを指定<br />・**マシンを指定** |



## TL;DR

OC2022.4はトリガー設定時でもマシン指定ができるようになりました。

ちなみにクラシックフォルダでは「マシンを直接指定」「全マシンを動かす」という設定ができたのですが、モダンフォルダではできなくて。
モダンフォルダ移行時にちょくちょく問題になることがあったのですが、

- 「マシンを直接指定」はできるようになったので、解決
- 「全マシンを動かす」は直接的にはできないけど、各マシンを指定するトリガーを一つ一つ作成することで、間接的に解決

となりました。

## 画面を見てみる

### OC2022.4

#### ジョブ

OC2021系と同じです。テンプレートを選択可能です。
![001](https://imgur.com/b9SfJdW.png)


#### トリガー

トリガーはこう。OC2021系から進化して、テンプレートを選んだのち、具体的なマシンまで指定できるように。
![002](https://imgur.com/jRMVBSy.png)

## 参考:クラシックフォルダからの移行の観点

TL;DRにも書きましたが、クラシックフォルダからの移行の観点で追記です。

いよいよディスコンな雰囲気のクラシックフォルダですが、クラシックではトリガー設定をする際「このロボットグループに属する全ロボットがジョブ実行(**いずれかでなく全マシン**)」「このロボットグループに属するロボットの**具体的にこれとこれで実行**」って設定が可能でした。

![003](https://imgur.com/wiIWoOG.png)
マシン指定やそもそも全部のマシンが動いてよ、ってニーズはトリガーでもあると思うんですが、モダンフォルダでは OC2020/2021まではできませんでした。

が、**OC2022.4.x ではトリガー時もマシン直接指定が可能になった**ので「**マシンを直接指定するトリガーを、マシン個数分作成**」することで、複数マシンをスケジュール起動することができるようになりました。

お疲れさまでした！

## 関連リンク

自分がモダンフォルダ関連で書いてある記事を載せておきます

- [[UiPath] よくわかるモダンフォルダ(ジョブ/スケジュール設定編)](https://qiita.com/masatomix/items/91887e9edc89975f9cd9)  前回記事
- [よくわかるモダンフォルダ(イントロ編)](https://qiita.com/masatomix/items/686b6af4fac69a0b18a3) 
- [[UiPath] よくわかるモダンフォルダ(基本編)](https://qiita.com/masatomix/items/159d652027a80ff91002)
- [[UiPath] Orchestrator関連のシステム構成図を整理してみた(よくわかるモダンフォルダ番外編)](https://qiita.com/masatomix/items/0bc8d6053f1ac71c789f)
- [[UiPath] Orchestratorバージョンアップ時の検討事項(よくわかるモダンフォルダ番外編)](https://qiita.com/masatomix/items/0ae1c16f0779ab6e2f4f)
- [[UiPath] よくわかるUnattendedロボット(イントロ編)](https://qiita.com/masatomix/items/c63115254ed59d06ff9a)
- [[UiPath] よくわかるUnattendedロボット(同時実行編)](https://qiita.com/masatomix/items/7a8d9c6904d71303aa56)
小ネタ／Open API 3.0 ジェネレータ oapi-codegen v1.11.0 のコード自動生成の方法

社内で使う管理用のちょっとした API を OpenAPI & Go(golang) で作るべく **[oapi-codegen](https://github.com/deepmap/oapi-codegen)** を（過去の文献を参考に）使おうとして、

`configuration error: package name must be specified`

に阻まれ、回避方法を探したら **[リリース情報のページ](https://github.com/deepmap/oapi-codegen/releases/tag/v1.11.0)** にちゃんと書いてあった、というだけのメモ書きです。

（ついでにいうと、最初に探し当てていた文献にもちゃんと書いてありました…）

## 以前のバージョンでの使い方

こんな感じで紹介されている例が多かったと思います。

```sh:
go get github.com/deepmap/oapi-codegen/cmd/oapi-codegen
oapi-codegen 【スキーマ定義の .yaml ファイル】 -package 【パッケージ名】 -generate 【生成対象：types,client,server,spec など】 -o 【出力先の .gen.go ファイル】
```

（ほかに`-o`オプションではなく` > `で出力先を指定する例もありました）

**例：**

- **[Go の Open API 3.0 のジェネレータ oapi-codegen を試してみた](https://future-architect.github.io/articles/20200701/)（Future Tech Blog）**
- **[OpenAPI（APIドキュメント）を用いたGoのAPIサーバー開発](https://note.com/shift_tech/n/n2d0265731777)（SHIFT Group 技術ブログ）**

`oapi-codegen`は　v1.11.0 から **設定（config）ファイルを読み込んで** コードを自動生成しないといけなくなりました。

（ついでにいうと 1 行目の`go get`で`oapi-codegen`をインストールする方法も Go 1.16 で非推奨になり 1.17 で廃止されました）

- **v1.11.0 をインストールする場合**

```sh:
go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.11.0
```

## v1.11.0 以降の使い方

`config.yaml`などの設定ファイルに、

```yaml:config.yaml
package: petshop
generate:
  echo-server: true
  client: true
  models: true
  embedded-spec: true
```

のような設定を記述してから、

```sh:
oapi-codegen -config config.yaml 【スキーマ定義 .yaml】 > 【出力先 .gen.go】
```

とします。

（出力先ファイル名は、設定ファイルに`output: 【出力先 .gen.go】`で指定しておくことも可能です）

または、（おそらくいずれ非推奨→削除になりそうですが）`-output-config`と`-old-config-style`を指定し、

```sh:
oapi-codegen -output-config -old-config-style -package=【パッケージ名】 -generate=【生成対象：types,client,server,spec など】 -alias-types 【スキーマ定義 .yaml】 > 【出力先（設定）.yaml】
oapi-codegen -config 【↑で出力した（設定）.yaml】 【スキーマ定義 .yaml】 > 【出力先 .gen.go】
```

とします。

## 参考

- **[Many updates, you will need to update your configuration](https://github.com/deepmap/oapi-codegen/releases/tag/v1.11.0)（oapi-codegen v1.11.0 Release Notes）**
- **[oapi-codegenでchi用APIインターフェースを自動生成](https://rinoguchi.net/2022/06/oapi-codegen-chi-server.html)（rinoguchi's techlog）**
  - 最初に`oapi-codegen`の参考文献として見つけてブックマークしていたにも関わらず、問題が解決した後で v.1.11.0 での変更点の記述があるのに気付きました…。
Gemのバージョン指定

# Gemのバージョン指定方法
Gemfileでは、インストールするGemに対してバージョン指定方法ができます。


| 指定方法          | 意味             |
|:-----------------|:-----------------|
|1.2.3             |1.2.3             |
|>= 1.2.3　　　　　 |1.2.3以上         |
|>= 1.2.3, < 1.2.5 |1.2.3以上1.2.5未満|
|~> 1.2.3          |1.2.3以上1.3.0未満|

# バージョニング表記(補足)
|表記　　　　　　　 | 意味                                                              　   |
|:-----------------|:-----------------                                                     |
|x.0.0　　　　　　　|メジャーバージョン。後方互換性※のない変更を含む修正。                     |
|0.x.0　　　　　　　|マイナーバージョン。後方互換性を持ったAPIの変更など。新機能、新APIの実装等。|
|0.0.x　　　　　　　|パッチバージョン。API変更のない実装レベルの修正。バグフィックス等。    　  |

※後方互換性：新しいバージョンが古いバージョンの機能を内包していること。

参考にした記事
https://autovice.jp/articles/118
【SwiftUI×Firebase】AppDelegate.swiftがない！となった時の対処法

## 結論


~App.swiftを、こう書きましょう。
①〜③の順番でプログラムを書いてみましょう。

```~App.swift
import SwiftUI
import FirebaseCore   // ① : Firebaseのセッティング

struct FirebaseCloudMessagingPracticeApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate   // ③ : Firebaseのセッティング
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

// ② : Firebaseのセッティング
class AppDelegate: NSObject, UIApplicationDelegate {
  func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    FirebaseApp.configure()

    return true
  }
}
```
【自己学習】Go言語を学ぶ(8)

# 公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

## Switch
switch 文は if - else 文のシーケンスを短く書く方法です。

サンプルコード：実行したOSを調べる

```go
package main

import (
  "fmt"
  "runtime"
)

func main() {
  fmt.Print("Go runs on ")
  switch os := runtime.GOOS; os {
  case "darwin":
    fmt.Println("OS X.")
  case "linux":
    fmt.Println("Linux.")
  default:
    // freebsd, openbsd,
    // plan9, windows...
    fmt.Printf("%s.\n", os)
  }
}
```

## Switch evaluation order（評価順序の切り替え）
switch caseは、上から下へcaseを評価します。 caseの条件が一致すれば、そこで停止(自動的にbreak)します。

サンプルコード：次の土曜日まで何日かを調べる

```go
package main

import (
  "fmt"
  "time"
)

func main() {
  fmt.Println("When's Saturday?")
  today := time.Now().Weekday()
  switch time.Saturday {
  case today + 0:
    fmt.Println("Today.")
  case today + 1:
    fmt.Println("Tomorrow.")
  case today + 2:
    fmt.Println("In two days.")
  default:
    fmt.Println("Too far away.")
  }
}
```

## Switch with no condition(無条件で切り替える)
条件のないswitchは、 switch true と書くことと同じです。

このswitchの構造は、長くなりがちな "if-then-else" のつながりをシンプルに表現できます。(if文をわかりやすく)

サンプルコード：現在時刻から表示を変化

```go
package main

import (
  "fmt"
  "time"
)

func main() {
  t := time.Now()
  switch {
  case t.Hour() < 12:
    fmt.Println("Good morning!")
  case t.Hour() < 17:
    fmt.Println("Good afternoon.")
  default:
    fmt.Println("Good evening.")
  }
}

```
Sessionサービスの追加　visual studio 2022

visual studio 2022 でSessionサービスを追加。

自分の読んでる本だとStartupクラスがある前提なので
それがない現在はどうするのか調べてみた。
Program.cs の下記に記述すればいいみたい。

*参考にしたページ：https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/app-state?view=aspnetcore-6.0
------------------------------------------------------------------------------------------

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddDistributedMemoryCache(); //ここから

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromSeconds(100);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
}); //ここまで

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.UseSession(); //あとここ

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Hello}/{action=Index}/{id?}");

app.Run();


------------------------------------------------------------------------------------------
【PowerShell】変数に入れた文字列でフォルダを作成・移動するワンライナー

# 何を説明する記事か
mkdirで作成したフォルダにcdで移動するワンライナーを書く際、cdに与える文字列が変数の場合でも動作させる方法

# コード

```powershell
$dirName = "goodLuck"; md $dirName | cd
```

# この記事を書くに至るまでの過程

mkdirしたフォルダに飛ぶ方法として、`cd $$`が存在しているのを知っていた。
```powershell
md dirName
cd $$
```

ところが、mdの引数に変数を指定すると、cdした際に変数名を文字列として移動しようとしてしまう。
```powershell
$dirName = "goodLuck"
md $dirName
cd $$

Set-Location: Cannot find path 'C:\Users\user\source\repos\$dirName' because it does not exist.
```

mkdirをパイプラインでつないでcdすることで、フォルダを移動することが可能。  
ということで、前段のコードに至った。


# 参考
- [PowerShell 7 からPipeline Chain Operators(&& と ||)が使える様になります](https://dev.classmethod.jp/articles/powershell-7-pipeline-chain-operator/)
- [PowerShellでmkdirしたディレクトリにcdする方法](https://blog.shibata.tech/entry/2017/09/27/215312)
さくっとnode-fetch+node-html-parserでスクレイピングする

## node-fetchでいいじゃん

もともとSeleniumとかPuppeteerとかPlayWrightで当然ながら合法的な範囲内でスクレイピングをしていました。しかし、golangでスクレイピングのスクリプトを書いたあとに、そもそもfetchでもいけるじゃないか、と気づきました。node-fetchで簡単にスクレイピングができるので記事にしてみました。

## 完成物

```TypeScript
import fetch from 'node-fetch';
import { parse } from 'node-html-parser';

const main = async () => {
	const url = 'https://qiita.com/';
	const response = await fetch(url);
	const body = await response.text();
	const root = await parse(body);
	const h2s = root?.querySelectorAll('h2');
	h2s.forEach((element) => {
		const text = element.innerText;
		console.log({ text });
	});
};

main();
```

結果

```TypeScript
{ text: 'Dockerコンテナのpostgresqlがマルウェアに感染した件について' }
{ text: 'Dockerfile ベストプラクティス／2022夏' }
{ text: '「技術記事って、別に書かなくてもよくないすか？」' }
{ text: 'TexTraの翻訳 APIをJavaScriptだけで取得する' }
{ text: '動的計画法の実例: QRコードの最適なエンコードを求める' }
{ text: '全Qiita民に見てほしい！岡田監督のメッセージ：「自ら考えて動く」チームを育てる、グローバル水準の組織作りのメソッド' }
{ text: '【祝!!無限増殖】寝てる間に話題のStable Diffusionが無限に動く仕組みを作ってみた' }
{ text: '6歳娘「ねぇ、パパ！このテストコード、Given-When-Then構文で可読性、高めてみない？」' }
{ text: '【入門】Python を書く前に知っておきたいデータ型のあれこれ' }
{ text: '[Power BI] 新DAX関数 EVALUATEANDLOG を試してみる🎉' }
{ text: '新人エンジニアが先輩に言われたこと4つ' }
{ text: 'Kubernetes 1.25: SIG-CLI (kubectl) の変更内容' }
{ text: 'Elixirで冪根を求めることを楽しむ' }
{ text: '【Windows】Raspberry Pi Pico Wの開発環境の構築とLチカ【Python】' }
{ text: 'ゆめみさんのインターンでモブになってきた話' }
{ text: 'システム運用作業で気を付ける事 まとめ' }
{ text: '僕が考えた最強の作業手順書' }
{ text: '【NestJS】マルチステージビルドでNestJSイメージのサイズを小さくする方法' }
{ text: '【CSS】画像のbefore・afterをスライドさせて、比較できるようなUIを作ってみた。' }
{ text: 'EC2→ECS移行の際に、本番環境へのデプロイにecspressoを用いた話' }
{ text: '【UiPath】バージョン「22.7」Previewリリースまとめ' }
{ text: 'Apple Silicon M2はM1シリーズと比べて命令セットが拡張されている' }
{ text: '【JavaScript】TABキーによる要素のフォーカス送りをグループ内でループさせる' }
{ text: 'Stable DiffusionをAWSのEC2インスタンスで動かすまでの手順' }
{ text: 'チーズのヘタと早すぎる抽象化' }
{ text: 'Unity+MagicOnionでメタバース空間を作ってみる（第二回）' }
{ text: 'Goの fs.FS をOSのファイルシステムにマウントしたい' }
{ text: 'MUI(旧Material-UI)の Container で最大横幅を設定する ～ヘッダーの幅固定もできるよ～' }
{ text: 'Python,Ruby,PHP,Java,JavaScript,Perlの条件分岐の比較' }
{ text: 'UiPath_エクセルでセルの色を塗りつぶしたいな～' }
```

ひとまずQiitaからh2タグのテキストを全部拾ってくるスクリプトです。あとは適宜Selectorを変更するなり処理してみてください。

あとはcookieが必要なときはcookieをたせます。とあるサイトで18歳以上かどうかを判定するcookieがあったときは
下記のように対応しています。

```TypeScript
import fetch from 'node-fetch';
import { parse } from 'node-html-parser';

const main = async () => {
	const url = 'https://qiita.com/';
    const options = {
        headers: {
			cookie: 'over18=yes'
		}
	};
	const response = await fetch(url, options);
	const body = await response.text();
	const root = await parse(body);
	const h2s = root?.querySelectorAll('h2');
	h2s.forEach((element) => {
		const text = element.innerText;
		console.log({ text });
	});
};

main();
```

本当にJavaScriptが必要なサイト以外はこんな感じで軽くスクレイピングできます。ブラウザを起動しなくても良いので軽量ですね。
大きなダンプファイルから一部を切り出す備忘録


定期的に取得しているダンプデータから、特定のデータを復旧するSQLを準備する必要が出てきました。
そのとき、巨大なダンプファイルから一部のデータを切り出す作業を行いましたので、備忘録として残したいと思います。

## はじめに
こちらの方法は、あくまでイレギュラーな対応となります。
ダンプファイルを加工すると、データの整合性を損なう可能性がありますので、十分にご注意ください。

## 対象
- Macを使われている方
- 巨大なダンプファイルを操作する必要が出てきた方
- mysqldumpを使われている方

ダンプデータのサイズが、数十MB程度でしたら、中身を参照する場合などでも取り扱いが楽なのですが、数十・数百GBを超えることもあるかと思います。


ダンプ取得時点で、リストアに利用する必要なデータが解っている場合は、where句などで、ダンプするデータを絞り込むことも出来ますので、そちらの方法をおすすめいたします。


## ダンプファイルを取得

```sql
mysqldump -u root -p --single-transaction sample > sample.dump
```
mysqldumpコマンドには、指定出来るオプションが数多く存在しますので、説明はここでは割愛させて頂きます。
ここではサンプルとして、シンプルなコマンドで取得したダンプデータを例に上げています。


## ダンプファイルを分割
ダンプファイルを取得したディレクトリに移動して、ファイル分割を行います。

```zsh
mkdir temp_split
split -l 100 -a 10 sample.dump temp_split/sample.dump.sql.
```

#### 指定するオプション
<dl>
  <dt>-l</dt>
  <dd>1ファイルに切り出す行数</dd>
  <dd>mysqldumpコマンドで取得したデータは、バルクインサートのSQLになっていますので、「-l 1」と1行分を指定した場合も複数レコード分のデータを含んでいます。</dd>

  <dt>-a</dt>
  <dd>接尾語の文字数</dd>
  <dd>ダンプファイルのサイズが大きい場合、接尾語の文字数が枯渇して「split: too many files」メッセージと共に処理が中断してしまいます。「-l」オプションに指定する1ファイルに切り出す行数に合わせて、大きい値を指定します。</dd>
</dl>



## 分割実行後

しばらくすると、次のような接尾語が付与されたファイル名で、分割ファイルが生成されます。
※利用しているMacの性能や、取り扱うファイルサイズによっては、処理に時間がかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251940/bd3a3fba-a1b5-4a4c-2e3f-8bf8a496e56d.png)

分割されたファイルは、MB単位のファイルとなり、取り扱い可能なファイルサイズになっているかと思います。もし、まだ大きいサイズのファイルとなっていましたら、splitコマンドのオプションを調整して、再度分割して調整するにしてください。


mysqldumpで取得したsqlは、バルクインサートで記述されていますので、分割によって必要なデータが複数ファイルにまたがる場合も、順番リストアしていくことが可能です。


## 最後に

ダンプファイルのサイズが大きすぎて、取り扱いに困っている方の何かヒントの1つになりましたら幸いです。


### 追記: 2022/08/29
上記の方法では、SQLが中途半端なところで行分割されてしまう可能性があるとのご指摘を頂きました。
利用される際は、分割されたファイルの内容が想定されたSQLになっているか、十分に確認の上、ご利用頂くようお願いいたします。
Unityのプロジェクトファイルを受け渡し用に軽量化する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png"> 良いことを聞いたのでメモ

Unityのプロジェクトファイルは巨大になりがちです。
共同開発者に渡したり、別の環境でチェックしようとする時に簡単に軽量化する方法があります。

### プロジェクトファイルで必要なのは３つ

まず、プロジェクトをフォルダごとコピーし、送付用とします。
必要なのは「Assets」「Packages」「ProjectSettings」の３つなので、それ以外を削除。zipで圧縮します。
「Library」フォルダが特に大きくなりやすいですが、これは実行時に自動生成されるとのことなので、受け渡し用のファイルに含める必要はありません。

他にも不要なアセットを削除するプログラムなどもあるようですが、とりあえずの受け渡しには上記の対応で十分な効果が出ます。
【自己学習】Go言語を学ぶ(7)

# 公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list


## If文

* Go言語の if 文は、先ほどの for ループと同様に、括弧 ( ) は不要で、中括弧 { } は必要です。

サンプルコード:

```go
package main

import (
  "fmt"
  "math"
)

func sqrt(x float64) string {
  if x < 0 {
    return sqrt(-x) + "i"
  }
  return fmt.Sprint(math.Sqrt(x))
}

func main() {
  fmt.Println(sqrt(2), sqrt(-4))
}
```

実行結果：1.4142135623730951 2i


## If with a short statement（if文を短くした場合）
if 文は、 for のように、条件の前に、評価するための簡単な文を書くことができます。

ここで宣言された変数は、 if のスコープ内だけで有効です。

サンプルコード:math.Powでべき乗を計算

```go
package main

import (
  "fmt"
  "math"
)

func pow(x, n, lim float64) float64 {
  if v := math.Pow(x, n); v < lim {
    return v
  }
  return lim
}

func main() {
  fmt.Println(
    pow(3, 2, 10),
    pow(3, 3, 20),
  )
}
```

実行結果：9 20

## If and else (ifとelse)
if 文で宣言された変数は、 else ブロック内でも使うことができます。

サンプルコード：

```go
package main

import (
  "fmt"
  "math"
)

func pow(x, n, lim float64) float64 {
  if v := math.Pow(x, n); v < lim {
    return v
  } else {
    fmt.Printf("%g >= %g\n", v, lim)
  }
  // can't use v here, though
  return lim
}

func main() {
  fmt.Println(
    pow(3, 2, 10),
    pow(3, 3, 20),
  )
}

```

実行結果：
27 >= 20
9 20
VMware Workstation 16 ProでUSBデバイスに接続する

タイトル通りのことをやろうとしてうまく動かなかった。その解決方法をまとめる。

まえがき
=
Windows 11上のVMware Workstation 16 ProにおいてゲストOSをUbuntuとしたときにUSBデバイスに接続できなかった。HDDをUSBストレージとして接続し、shredでデータ破棄するなどしたかった。

環境
=
当方の環境はこの通りであるが、結論として(おそらく)環境に依拠するものではなくVMware Workstation 16 Proの生成するvmxファイルにある。

<b>ホストOS</b>
 * Windows 11 21H2 x64
 * VMware Workstation 16 Pro(16.2.4 build-20089737)

<b>ゲストOS</b>
 * Ubuntu 22.04 LTS

症状
=
VMware WorkstationでUSBデバイスそのものは認識するが、当該アイコンが非アクティブのままでゲスト側に接続できなかった。
![usb.restrictions.false.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538068/8cdb4b66-92de-b719-d00a-9277f3c9a4fd.png)

解決方法
=
vmware comunitiesに関連投稿がある[^1][^2]通り、vmxファイルでキー値「usb.restrictions.defaultAllow」がFALSEとなっていると思うのでそれをTRUEとする。

```
usb.restrictions.defaultAllow = "TRUE"
```

(ゲスト停止後に？)ゲストを開き直せばUSBデバイスに接続できるようになる。
![usb.restrictions.true.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538068/23485e42-c575-73a6-c600-03c07f687013.png)

補足
=
Windowsのゲストを作成したときにはそもそもvmxファイルにキー値「usb.restrictions.defaultAllow」のレコードさえなかった(と思う)。そして、USBデバイスへの接続にもこのような支障はなかった。

すなわちVMWare Workstationにおいて指定するゲストOS(のタイプ)によって、vmxファイルが少なからず変わるということらしい。


[^1]: https://communities.vmware.com/t5/VMware-Workstation-Pro/Can-t-attach-any-removable-USB-to-Windows-11-Enterprise-TPM/td-p/2886809
[^2]: https://communities.vmware.com/t5/VMware-Workstation-Player/All-USB-devices-are-greyed-out/m-p/2878152#M38003http://www.rtpro.yamaha.co.jp/RT/manual/rtcommon/swctl/swctl_fnc_vlan_port_mode.html
自分がwatchしているGitHubリポジトリ

JavaScript関連の情報を入手するために、私がどんなGitHubリポジトリをwatchしているか書きます。

## GitHubのwatch機能

GitHubリポジトリの右上にwatchボタンがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/5d948bfb-d237-aa77-6bf5-85fe1f56afd3.png)

これをwatchするように設定すると、そのリポジトリに関連した通知が流れてきます。

## 自分がwatchしているリポジトリたち

#### 自分のリポジトリ

まず、自分のリポジトリは勝手にwatchするように設定されます。

これが63個分ありました。（数えた）

#### Deno関連

denolandのorganizationにあるリポジトリのうち、開発が活発なものを選んでwatchしています。

https://github.com/denoland

34個でした。（これも数えた）

#### TC39関連

TC39はJavaScriptの言語仕様を決めているところです。新しい言語機能を導入する/しないの会議を数か月ごとにしているのですが、その議事録とかの更新を見ています。

- https://github.com/tc39/agendas
- https://github.com/tc39/notes
- https://github.com/tc39/proposals
- https://github.com/tc39/proposal-reversible-string-split
- https://github.com/tc39/proposal-import-reflection

5個。

#### wintercg関連

Winter CGはサーバーサイドWeb APIの標準化団体です。

環境変数の読み方を統一しよう、みたいな事をDenoやcloudflare社などで議論しています。

- https://github.com/wintercg/proposal-webcrypto-streams
- https://github.com/wintercg/environment-metadata
- https://github.com/wintercg/performance
- https://github.com/wintercg/fetch
- https://github.com/wintercg/admin
- https://github.com/wintercg/proposal-common-minimum-api

6個。


という感じで合計94個のリポジトリをwatchしているのですが、上記を全て足しわせると108個になるので、絶対数え間違っていると思います。
CSSのみで（Javascriptを使用せず）タブを実装する

## CSSのみで（Javascriptを使用せず）タブを実装する

このネタは結構ありますよね。。。

多いのが flex レイアウトでラジオボタンとタブページ div を折り返しで分ける実装方法。
（リンクボタン方式もあるが履歴を無駄に発生させる・・・）

### よく見るflexタブの駄目な点

+ Tabキーでフォーカスされない（display:noneとしているため）
　tabindexを指定してもタブの移動が面倒。
　ラジオボタンを使っているのに矢印キー（←→）で選択出来ない。

* flexでorder:-1を使用している（OKでもいいじゃんと思うが原理主義的にはNG）

それで、:hover および :focus による装飾もしたかったので、以下の実装で解決した。

## ぱーふぇくとなCSSタブ
動作確認済みブラウザ
・Google Chrome 104 (および Chromium Edge)
・FireFox 104

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="poLXNVX" data-user="cfd-ack" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/cfd-ack/pen/poLXNVX">
  Css Tab (no-script)</a> by cfd-ack (<a href="https://codepen.io/cfd-ack">@cfd-ack</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
タブのデザイン古くね？ ← オッサンですから。。。

:::note info
2022/09/05 追記：button タグは不要ですね。この内容なら label だけで充分。（整理してなかった・・・
下記の解説も読み替えて下さい。。。
:::

## かいせつ
※ラジオボタンからの兄弟要素による表示切替については既知の手法なので省略します。

まずラジオボタン本体は width:0 等で見えなくする。
ブラウザによってはappearanceも必要。FireFoxはappearance無しだと面白い感じになる。
（※追記：コントロール表示のカスタマイズとしてはこちらが本筋の手法らしいです。）
見えないけど存在するのでTabキーアクセスは確保される。（display:none パターンではアウト）
通常のラジオボタンなので矢印キー（←→）による選択もできる。

つづいて label を使いタブとして見える部分を装飾、button で label のみを囲む。
（button 側は罫線なし padding:0 にしないとマウス押下領域と反応領域のズレが生じる。）
button:hover > label でマウスオーバー表示。
input[type="radio"]:focus + button > label でフォーカス強調（outlineまたは代替表現）

---

さて・・・ ここまで作りこんだが業務で使うことはなさそうだ・・・（おぅ
flex折り返しなのでタブが増えたら多段タブ（複数行）になるし・・・（←そんなにタブ増やすのおかしくね？

スクロール可能な１行タブとなるとJavascript必須。であればどうにでも実装出来るし。
docker-compose + capistrano

## 前置き
一応、AWSにデプロイすることを想定しています
すでに手動デプロイが成功している前提で行います

## 構成
本番環境用にふたつ用意する
- docker-compose.production.yml
- Dockerfile.production

## コンテナ内にキーを保存
ローカルで下記コマンドを実行し、キーをコピー。
ローカルで起動するコンテナにコピーすること
```
$ docker container cp ~/.ssh/<秘密鍵名> <コンテナ名>:/root/.ssh/<秘密鍵名>
```
コンテナ内で下記コマンドを実行し、EC2にログインできるか試す
```
$ ssh -i ~/.ssh/<秘密鍵> ec2-user@EC2IPアドレス
```
できたらおk
ローカル環境用のdocker-compose.dev.ymlに、キーを保存するよう記述
```
  web:
    # 省略
    volumes:
      - ~/.ssh:/root/.ssh
    # 省略
```

## Gem追加
```Gemfile
group :development, :test do
  ...
  gem 'capistrano'
end
```
`docker-compose build`などで`bundle install`をした後
コンテナ内で
```
bundle exec cap install
```
これでデプロイに必要なファイルが作られる

## 設定
### Capfile
デプロイ先でコンテナを起動するだけなので、ここはいじらない

### config/deploy/production.rb
```
server '××.××.×××.×××', user: 'ec2-user', roles: %w{web}
```
操作したいサーバは一つなのでrolesはwebのみで。

### config/deploy.rb
```
# capistranoのバージョン固定
lock "~> 3.17.1"
# アプリ名
set :application, "test_app"
set :repo_url, "git@github.com:ユーザ名/リポジトリ名.git"
# ブランチ名
set :branch, "main"
# デプロイ先のディレクトリ。/var/www/のパターンも
set :deploy_to, "/home/ec2-user/test_app/"

set :ssh_options, {
  # capistranoコマンド実行者の秘密鍵
  port: 22,
  keys: %w(~/.ssh/test_app_key.pem),
  forward_agent: true,
  auth_methods: %w(publickey)
}
set :docker_compose_path, "docker-compose -f docker-compose.yml"
set :RAILS_ENV, "RAILS_ENV=production"

namespace :deploy do
  application = fetch :application
  branch = fetch :branch
  docker_compose_path = fetch :docker_compose_path
  rails_env = fetch :RAILS_ENV
  rails_compile = "#{docker_compose_path} run web rails assets:precompile #{rails_env}"

  task :application_set_up do
    on roles(:web) do
      execute "cd #{application};" "git pull origin #{branch};" "#{docker_compose_path} down;" "docker system prune -f"
      execute "cd #{application};" "#{docker_compose_path} build;" "#{rails_compile};" "#{docker_compose_path} up -d"
    end
  end
end
```
## 実行
コンテナ内でこのコマンドを実行
```
bundle exec cap production deploy:application_set_up
```

## 発展
config/deploy.rb
```
namespace :deploy do
  ...
  tesk :タスク名 do
    実行したい処理
  end
end
```
`bundle exec cap production deploy:タスク名`

これで新しいタスクを作って実行できる。
ここで書かれた処理はコンテナ内ではなく、デプロイ先のサーバで実行されるものなので、そこを考慮したコマンドを書きましょう。
Unity Catalogクイックスタート・設定手順について 


# 設定手順書

ついに[UnityCatalogがリリースされた](https://qiita.com/taka_yayoi/items/bd0d482838650a792f5e)ということで、今後色々と触ってみたいと思います。
今回は、設定編ということで手順書をまとめてみたので、こちらでもダウンロード出来るようにしておきます。

**↓こちらからダウンロード**
- <a href="https://sajpstorage.blob.core.windows.net/maruyama/Documents/UnityCatalog/UnityCatalog設定手順書_AWS_v2022_v1.2.pdf">UnityCatalog設定手順書(pdf)　AWS編(version 1.2)</a>
- <a href="https://sajpstorage.blob.core.windows.net/maruyama/Documents/UnityCatalog/UnityCatalog設定手順書_Azure_v2022_12.pdf">UnityCatalog設定手順書(pdf)　Azure編(version 1.1)</a>


# 外部ロケーション設定

Metastore以外のストレージにアクセスまたは保存したい場合は、外部ロケーションとして登録することができます。
設定方法についてはこちらをご覧ください。

- [Unity Catalog 外部ロケーションの登録 (AWS)](https://qiita.com/maroon-db/private/6f3dee8a8ebd863989a6)
- [Unity Catalog 外部ロケーションの登録 (Azure)](https://qiita.com/maroon-db/items/ae65a6154b633fec3e33)


# カタログ・スキーマIsolation設定

カタログやスキーマレベルでMetastore以外のストレージを設定することが出来る機能です。こちらの機能はManaged Tableとして利用可能です。
- [Unity Catalog のカタログIsolation機能を試す](https://qiita.com/maroon-db/items/a9e6aabcbcb5c3a36633)


# 監査ログ設定

- [Unity Catalog 監査ログ設定（AWS編) について](https://qiita.com/maroon-db/items/dda37c1c42f6e70bb725)

# Terraformを使ってみる

- [UnityCatalog環境をTerraformを使って10分で構築してみる](https://qiita.com/maroon-db/items/70d8eb95aa9c3b978fca)
- [Unity Catalog 外部ロケーションをTerraformで実装してみる](https://qiita.com/maroon-db/private/5bfc314a3bd7eae3bb7b)

# カタログ情報を収集するには？
- [Databricks Unity Catalog のカタログ情報を収集するには？ (Information Schemaって何？）](https://qiita.com/maroon-db/items/e1765d546f07682305f4)
AWS-SAA（C03）試験の対策



2022 年 8 月 30 日からAWS SAAの新試験が開始されます。


https://aws.amazon.com/jp/certification/coming-soon/

8月からちょこちょことSAAの勉強をしていたのですが、新試験に変わることを知らず旧形式の教材を使っていました。。。
無理をして旧形式の試験受験にも滑り込めたのですが、どうせなら新しいサービスも合わせて知っておきたいと思い、新試験で受験することに決めました。
何が変わったのか、追加されたサービスが何なのかまとめていきます。

## 試験ガイドの比較
AWSの新試験についての案内を読んでみると試験ガイドをよく読んでねって書いてありましたので詳しく比較してみました。
試験ガイドは以下から確認できます。
##### SAA-C02の試験ガイド
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Exam-Guide.pdf
##### SAA-C03の試験ガイド
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Exam-Guide_C03.pdf

## 追加されたサービス一覧
試験ガイドを比較し追加されたサービスをまとめてみました。


### アナリティクス
- AWS Data Exchange
- AWS Data Pipeline
- AWS Lake Formation
- Amazon Managed Streaming for Apache Kafka (Amazon MSK)

### アプリケーション統合
- Amazon AppFlow
- AWS AppSync
- Amazon MQ
- AWS Step Functions

#### AWS の請求情報とコスト管理
- AWS Cost and Usage Report
- Savings Plans

#### コンピューティング
- AWS Batch
- Amazon EC2 Auto Scaling
- AWS Outposts
- AWS Serverless Application Repository
- VMware Cloud on AWS
- AWS Wavelength

#### コンテナ
- Amazon Elastic Container Registry (Amazon ECR)
- Amazon ECS Anywhere
- Amazon EKS Anywhere
- Amazon EKS Distro

#### データベース
- Amazon Aurora Serverless
- Amazon DocumentDB (with MongoDB compatibility)
- Amazon Keyspaces (for Apache Cassandra)
- Amazon Neptune 
- Amazon Quantum Ledger Database (Amazon QLDB)
- Amazon Timestream

#### デベロッパーツール
- AWS X-Ray

#### フロントエンドのウェブとモバイル
- AWS Amplify
- Amazon API Gateway
- AWS Device Farm
- Amazon Pinpoint

#### 機械学習
- Amazon Comprehend
- Amazon Forecast
- Amazon Fraud Detector
- Amazon Kendra
- Amazon Lex
- Amazon Polly
- Amazon Rekognition
- Amazon SageMaker
- Amazon Textract
- Amazon Transcribe
- Amazon Translate

#### マネジメントとガバナンス
- AWS Command Line Interface (AWS CLI)
- AWS Compute Optimizer
- AWS Control Tower
- AWS License Manager
- Amazon Managed Grafana
- Amazon Managed Service for Prometheus
- AWS Personal Health Dashboard
- AWS Proton
- AWS Service Catalog

#### メディアサービス
- Amazon Elastic Transcoder
- Amazon Kinesis Video Streams

#### 移行と転送
- AWS Application Discovery Service
- AWS Application Migration Service (CloudEndure Migration)

#### ネットワーク、コンテンツ配信
- AWS PrivateLink

#### セキュリティ、アイデンティティ、コンプライアンス
- AWS Artifact
- AWS Audit Manager
- AWS CloudHSM
- Amazon Cognito
- Amazon Detective
- AWS Firewall Manager
- AWS Network Firewall
- AWS Security Hub

#### サーバーレス
- AWS AppSync
PowerShellを実行してみる

# はじめに
こちらの続きで書いていきます。

https://qiita.com/Nats72/items/28de4a36c1484a6d1e91

# 実行ファイルを作る
`/usr/local/src/pwsh/`ディレクトリに、`test.ps1`というファイルを作ってみます。
PowerShellの実行ファイルは、`.ps1`という拡張子になります。

とりあえず、HelloWorldを出力するだけの内容にしています。
```/usr/local/src/pwsh/test.ps1
echo "Hello World"
```

# 実行ファイルを実行する
PowerShellのコンソールから実行する方法と、PowerShellコンソールを開かずに実行する方法があります。
## PowerShellのコンソールから実行
ファイル名を指定するだけで実行されます。
```
PS /usr/local/src/pwsh> cd /usr/local/src/pwsh/
PS /usr/local/src/pwsh> ./test.ps1
Hello World
```
実行すると、コンソールに`Hello World`が表示されました。

## PowerShellコンソールを開かずに実行
`pwsh`をつけてファイル名を実行することで実行できます。
```
# cd /usr/local/src/pwsh
# pwsh test.ps1
Hello World
```

# PowerCLIを実行する
こちらの記事で使ったコードを参考に、PowerCLIを実行してみます。

https://qiita.com/Nats72/items/01370674f5b01596087a

```/usr/local/src/pwsh/test.ps1
Connect-VIServer -Server {IPアドレス} -User root -Password {パスワード} -force
Get-VM
Disconnect-VIServer -Server {IPアドレス} -Confirm:$False
```
結果は割愛しますが、ちゃんと表示されました。
Viteを使っていて、devだと表示されるのにbuildすると表示されない……。Minified React error #130の解決方法

# 困ったこと

Viteでdevモードは問題なく表示されるのだが、buildすると画面が真っ白になり表示されない。

## 表示されているエラー

```text
 Minified React error #130
```

## 対処法

最近追加したReactのModuleがあればそいつが犯人。とりあえず犯人を特定するために、そのコンポーネントだけ表示しないようにしてみましょう。今回、私の場合は```react-scroll-wheel-handler```というライブラリが原因でした。

こいつのインポートは

```tsx
import ReactScrollWheelHandler from "react-scroll-wheel-handler";
```

こう書くとreadmeにも載っているのですが、実はこれだとviteはうまく動きません。

以下のように書くとうまく動きます。べつにWでもなんでもいいですがWheelのWにしてみました。TypeScriptで書いていると、defaultがありません的なエラーが出るかもしれません。出たらts-ignoreで無理やり消してしまわないとビルドが通りません。ハック的な手法です。

```tsx
import W from 'react-scroll-wheel-handler';
// @ts-ignore
const ReactScrollWheelHandler = W.default ?? W;
```

## 理由

このライブラリはcjsでコンパイルされており、実際のjsファイルを見てみると```module.exports=```ではじまっています。これはviteがdevのときはうまく動きますが、実際にbuildするときはうまくesModuleに変換できない（？）ようです。今回のように、もし```.default```があれば.defaultつきにして、そうでなければ通常の……というハックで解決できます。

## 根本的に解決するには

そもそもcjs形式ではなくesm形式でもライブラリを配布してもらえたら解決します。とりあえずissueにあげておくか自分でつくってしまっても良いかもしれません。

## 参考資料
https://github.com/vitejs/vite/issues/2139
DBの論理削除フラグについて

仕事をしているときに、ふと論理削除フラグをどう表現すべきか？で悩んでいた時に
以下の記事を見つけた。

https://mike-neck.hatenadiary.com/entry/2015/03/24/231422

https://qiita.com/wanko5296/items/f1af9c7bf020e867c2dd

論理削除フラグは状況によってアンチパターンになるらしい。

## それはなぜか？
### 開発時に参照するプログラム側で考慮が必要
つまり、「論理削除フラグを必ず入れる」など必要なわけです。
また、これをどのようなときに0、1にするなど考慮も必要です。

まぁ必要な処理が多くなってしまうわけですね。

### 外部参照先で論理削除フラグについて考慮する必要がある
テーブル結合だったりで論理削除フラグを付け忘れることが結構あります。
または、脳死で論理削除フラグ=0をつけると、逆に仕様を満たせなくなってしまうとか…。

無駄に考えるべき点が多くなってしまいますね。

### マスタが汚れる
人によると思いますが、良く分からないカラムがマスタにあるのは可読性を損なうとは思います。
というより、マスタの全体を見たときにデータの状態が分かりにくくなるのが嫌ですね。

### 論理削除フラグという名前が抽象的すぎてどういう状態か分かりにくい
多くは`DELETED_FLAG`とか`del_flg`とかそんな名前が設定される印象ですが
このカラム名から「**なぜそのデータはフラグが立っているのか？？**」というのが分からないと思います。

つまりは実態を見て判断することは難しく、コメントやプログラムや設計書など外部の資料を見ないと
分からないことが問題です。

### 値を見る必要がある
これは、論理削除というものを根本から覆しますが
中が0，1などBooleanのような形で入っていない場合、何も信用できません。

2や3などがあった場合は、混沌を極めます( ;∀;)

### 脳死でつける可能性がある
割とあります(´・ω・)
ルールで設定しなければならないが、処理として1になる処理はいれていない。など。
脳死で論理削除フラグを付け、後からこのフラグは切り替わっているのか？手動でだれか変更したのか？
フラグ処理入れてしまっていいのか？など、後々無駄な調査が増えるきっかけになるでしょう。

## ならば、論理削除フラグの利点とはなにか？
以下の1点に尽きます。おそらくこれがなければここまで普及していないでしょう。
・スイッチイング（切り替え）が容易。

他のところで言えば、以下のポイントもありますが、そんなに重要な所ではないでしょう。
たくさんのデータをDELETEやUPDATEするのは、バッチなど即起動しなきゃならない処理ではないでしょうし。
・DELETEよりUPDATEの方が早い

### なぜ切り替えが容易なのが重要なのか？
データを物理削除した場合、復旧に手間がかかるためです。
イレギュラーパターンや想定外の現象が起きた場合…などで復旧に時間がかかると、相手の仕事に影響してしまう。
まぁ悪いのは開発者ではないですが、予期せぬ事態に備えていないわけにもいかない。

論理削除があれば、最悪このデータだけでも戻して！！（原因よくわかんないけど！！！）とかの時に
とりあえずスイッチングする、ということが可能というのも大きいのではないかと思います。

※仕様通りではあるけど後でデータの中身は見たい…などの要求や、確認したいからデータくださいとかが
あったりするので、物理削除ではなく論理削除にせざるを得ない…というパターンもある。

## 個人的な論理削除フラグの是非
個人的に言うと、「論理削除フラグがない世界」を味わったことが無いので
どれだけ処理をシンプルにできるのかあまり想像がつかないでいます。

ただ、論理削除フラグ自体は脳死で着けるべきものではないと思います。
特に、その実装の時点でフラグを変更することがないのであれば、つけるべきではないと思います。

また、あまりよくないかもしれませんが論理削除フラグというあいまいな名前にするくらいなら
ちゃんとした状態のカラム・テーブルを用意してそこに相応の値を設定するべきじゃないかと思います。

結論としては、**脳死で付けるな**という話ですね。
[Android]アプリからURLを指定してインターネット通信を行うための準備

# はじめに
今回は　アプリ内でURLを指定してインターネット通信を行う際の前準備の仕方を残します。
簡単なことですが、うっかり忘れてしまうとどんなにビジネスロジックを書いてもインターネット通信を行うことができないので覚えて起きたと思って記事に残します。

# 方法
AndroidManifest.xmlの<manifest>内に

```
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
```
というパーミッション設定を指定します。
この一文を追加するだけです。
Chromeで自動再生がされないのを回避

Chromeで動画を自動再生しようとしたときに下記のエラーが表示され、再生ができませんでした。

```html
      <video
        width="1024"
        height="480"
        id="videojs-vr-player"
        class="video-js vjs-default-skin"
        controls
        playsinline
        crossorigin="anonymous"
      >
        <source src="temp/{{ src }}" type="video/mp4" crossorigin="anonymous" />
      </video>
```
```
Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD
```

## 原因
URLが記載されていたので確認をしてみると、音声あり状態の場合は自動再生にはユーザーのアクションが必要であると言うことでした。
Chromeの自動再生ポリシーには以下が記載されています。

* ミュートされた自動再生は常に許可されます。
* 音声付きの自動再生が許可される条件
  * ユーザーがクリックやタップなどのアクションを行なった
  * ユーザーが以前に音声付きのビデオを再生したことがある
  * ユーザーがモバイルのホーム画面にサイトを追加したか、デスクトップに PWA をインストールした
* トップ フレームは、自動再生の許可を iframe に委任して、音声付きの自動再生を許可できます。

## 解決策
ミュートにすることで自動再生が可能になりました
```html
      <video
        width="1024"
        height="480"
        id="videojs-vr-player"
        class="video-js vjs-default-skin"
        controls
        playsinline
        crossorigin="anonymous"
        muted
      >
        <source src="temp/{{ src }}" type="video/mp4" crossorigin="anonymous" />
      </video>
```

## 最後に
詳しい仕様については下記のサイトに記載されているので確認してみてください。

https://developer.chrome.com/blog/autoplay/
dockerでコンテナ起動時に「Cannot start service *****: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process:」とか出たとき

## ずっと起動させてたコンテナをメンテナンスのため一度停止して再開させようとした

すると

``` bash
ERROR: for ********  Cannot start service *****: 
failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: 
exec: "/usr/local/sbin/*****": stat /usr/local/sbin/******: no such file or directory: unknown
```

こんなエラー（マスクしているところはコマンドやコンテナイメージ名など）

いろいろ調べると似たエラーの対策はヒットするんだが、同じコンテナ同じ環境なのでいきなりエラーになることはちょっと考えにくい。

### 解決

どうやらサーバーマシン（docker自体を動かしているのは別鯖にしてた）の空き容量不足だった。
docker pruneとかやりまくって解決


結構容量不足で予期しないエラーが出ることが多いのでまずは容量確認した方が良いかも。
ASUS GPU Tweak II をインストール後に IOMap64.sys が原因で BSOD が発生するときの対処法

ASUS GPU Tweak II インストール後に，ログインから数秒経つと IOMap64.sys が原因の SYSTEM_SERVICE_EXCEPTION が発生することがあります．

実は IOMap64.sys を削除しても問題ないので消去してしまいます．セーフモードなり USB メモリから起動するなどして以下のファイルを削除します．

```powershell:PowerShell での実行例
Remove-Item 'C:\Program Files (x86)\ASUS\GPU TweakII\Win7\IOMap64.sys'
Remove-Item 'C:\Program Files (x86)\ASUS\GPU TweakII\IOMap64.sys'
Remove-Item 'C:\Windows\System32\drivers\IOMap64.sys'
```

再起動すると正常に動作するようになります．
めでたしめでたし．
PowerCLIを学ぶ

# はじめに
ESXiのみで、vCenterは使ってない、そんなおうちクラウドでPowerCLIを使うメモです。

# PowerShell起動
シェルの変更って言った方が正しいのかも。
```
# pwsh
```
# PowerCLIインストール
モジュールの確認
```PS
PS /root> Find-Module -Name VMware.PowerCLI
```

PowerCLIインストール
インストールするかどうか聞かれたら`y(yes)`を選択します。
```PS
PS /root> Install-Module -Name VMware.PowerCLI
```

インストールされかどうか確認
```PS
PS /root> Get-InstalledModule -Name VMware.PowerCLI

Version              Name                                Repository           Description
-------              ----                                ----------           -----------
12.7.0.20091289      VMware.PowerCLI             
```
# 接続と切断
ESXiへ接続する
```PS
PS /root>Connect-VIServer -Server {IPアドレス} -User root -Password {パスワード}
```
上記でエラーが出る場合は、`-force`オプションをつけてあげると接続できるかも。
```PS
PS /root> Connect-VIServer -Server {IPアドレス} -User root -Password {パスワード} -force
```

ESXiから切断する。終了時は切断しましょう。
```PS
PS /root> Disconnect-VIServer -Server {IPアドレス} -Confirm:$False
```

# VMを取得する
```PS
PS /root> Get-VM

Name                 PowerState Num CPUs MemoryGB
----                 ---------- -------- --------
01_almalinux         PoweredOn  2        8.000
02_almalinux         PoweredOff 2        8.000
```

# VMの起動・停止
起動（パワーオン）
```PS
PS /root> start-VM -vm {VM名}
```
停止(パワーオフ）
```PS
PS /root> Stop-VM -vm {VM名} -Confirm:$false
```
リセット
```PS
PS /root> Restart-VM -VM {VM名} -Confirm:$false
```
再起動
```PS
PS /root> Restart-VMGuest -vm {VM名}
```
シャットダウン
```PS
PS /root> Shutdown-VMGuest -vm {VM名}
```
## 無償版だと実行できない・・・！
以下のとおり、無償ライセンスだと実行できない旨のメッセージが表示される。
```PS
PS /root> start-VM -vm {VM名}
Start-VM: 2022/08/28 11:09:32   Start-VM                Current license or ESXi version prohibits execution of the requested operation.
```

# VMの詳細情報出力
VM指定して出力
```PS
PS /root> GET-VM 01_almalinux | select *
```
VM一括出力
```PS
PS /root> GET-VM | select *
```

# VMのアップタイムを確認
```PS
PS /root> Get-Stat -entity {VM名} -stat sys.uptime.latest -MaxSamples 1

MetricId                Timestamp                          Value Unit     Instance
--------                ---------                          ----- ----     --------
sys.uptime.latest       2022/08/28 12:41:20                58677 second 
```

# データストア情報出力
```PS
PS /root> Get-DataStore

Name                               FreeSpaceGB      CapacityGB
----                               -----------      ----------
datastore1                             609.260         825.750
```

詳細をCSVで出力する
```PS
PS /root> Get-VM | select * | export-csv -path /tmp/vmlist.csv
PS /root> ls /tmp
vmlist.csv
```

# ハードディスク情報出力
一覧表示
```PS
PS /root> Get-VM | Get-HardDisk```
詳細表示
```PS
PS /root> Get-VM | Get-HardDisk | select *
```

# ネットワークアダプタ表示
一覧表示
```PS
PS /root> Get-VM | Get-NetworkAdapter
```
詳細表示
```PS
PS /root> Get-VM | Get-NetworkAdapter | select *
```
将来に対する不安との向き合い方 🤔

具体的に言うと「仕事上のキャリア」について、どういう風に捉えれば良いのか、自分の中で一つ腑に落ちることがあったので、自分への教訓としてメモ。

悩み相談的に言うと、「自分が数年後になっていたい姿が描けなくて…」というもの。しっかりとしたビジョン（自分の理想像）が描けていれば、それに向かって日々やるべきことが定まっていく。そうなってない現状に漠然とした不安を感じていた。つまり、ビジョンを描けていなくて、その結果、身動きが取れなくなっている状態。今思えば、一つの考え方に固執していたように思う。前提として、明確なビジョンがある人はそれに向かって突き進んでいけば良くて、それがない人を対象にしていることは補足しておく。

ポイントは、仕事において、自分の幸福度を高める要素は何なのか考えること。例えば、「優秀な人たちが集まる場所で働きたい」という思いがあったとして、その環境にいるためには、自分も優秀である必要があり、そうなると日々の学びが重要になる。「自分がどのような姿になっていたい」ではなくて、「自分はどういう状態でありたいのか」を考えて、その状態でいるためには何が必要なのか。この発想の転換は、オブジェクト指向設計に通じるものがあると思う。オブジェクト指向設計の考え方として、クラスではなくメッセージに着目するという教えがある。「何をクラスにするべきか」考える際に、「これは何者なんだ？」ではなく「これは何がしたいんだ？」という問いから、その役割を明らかにして、結果何者なのか定義していくという思考の流れ。

また、自分が優秀であれば、当初の不安は解消されているはず。その不安の背景には「このままだといつか御役御免になるのでは」という思いがある。自分が優秀であれば、環境に依存することなく、必要な時に環境を変えることが出来る。様々な理由で環境を変えたいと思った時に、その選択肢が多いほど幸福度が高い選択を行える可能性が高まる。もう少し抽象化すると、これは不確実性に対する一つの向き合い方なのだと思ったりもした。
【環境設定】macのターミナルを見やすくする方法

## 背景
- デフォルトのmacのターミナルのフォントは可読性が低く、フォントの大きさも小さいため見づらいと感じていた。
- ターミナルのフォントの種類や大きさを自由に変えて見やすいようにしたい。


## 目標
- macのターミナルのフォントの種類と大きさを変更できるようになる。

## ターミナルのフォントの種類と大きさの変更方法
（1）ターミナルを開き、左上のターミナルタブから「環境設定」をクリック
（2）開いたウィンドからプロファイルを選択し、テキストのフォントにある「変更...」をクリック
（3）フォントウィンドが開くので、自分の好きなフォントの種類やフォントの大きさに設定
（4）各ウィンドを閉じていき、ターミナルを再起動すれば、設定が反映される

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/13666311-0b06-04ae-a57e-885459a523ef.png)


## 筆者のターミナルの設定状況（参考まで）
| 項目　| 設定値　| 
| --- | --- |
| フォントファミリー |源ノ角ゴシック Code JP　|
| 書体 |R |
| サイズ | 15 |

## 個人的なおすすめフォント紹介記事
https://qiita.com/takuma-1234/items/85703852e3928fe111c5


## 参考資料

## 個人ブログ

https://takuma-tech.com/2022/09/28/274/
VirtualBoxでUbuntuサーバーを立てて、SSH通信をしてみた

## 概要
ホストOS内で立ち上がっているゲストOSサーバーにSSHでアクセスをする。
### 環境
macOS Monterey v12.1　※ホストOS
Homebrew 3.5.10
VirtualBox v6.1.36
Ubuntu v22.04.1　※ゲストOS


## 1.VirtualBoxのインストール
公式サイトからVirtualBoxのインストール
[Oracle VM VirtualBox](https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html)
※「Mac OS X」を選択してインストール


## 2.ゲストOSの準備
ゲストOSとなるサーバー環境を立ち上げます。
以下の記事を参考に、Ubuntuのサーバーを立ち上げました。
[VirtualBoxを使って仮想サーバを立てよう！（Ubuntuサーバ編）【家のパソコンで簡単】](https://tech.mamezou00000.com/entry/virtualbox-linux#Virutal-Box%E8%B5%B7%E5%8B%95%E3%82%B5%E3%83%BC%E3%83%90%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)

記事にもあるのですが、セットアップが完了し、ゲストOSを起動するにはディスクイメージが必要になります。
自分はディスクイメージをインストールした後にエラーが発生し、起動ができなくなる現象がありました。
※VirtualBoxが既に入っている状態でmacOSをアップデートしたことで、VirtualBoxと何か不整合が起きたっぽいです
こちらは以下の記事を参考にVirtualBoxの再インストールを行い、無事起動できました。
[macOS上のVirtualBoxで”Kernel driver not installed (rc=-1908)” が出た時の対処方法](https://www.nemotos.net/?p=3707)


## 3.ゲストOSでのSSH準備
ゲストOS上でUbuntuのインストールが完了したら、SSHの準備をしていきます。
```
$ sudo apt update
// パッケージ情報の更新

$ sudo apt install openssh-server
// openssh-serverのインストール
```


## 4.VirtualBoxの設定を変更
通常のSSH接続とは違い、ホストOSとゲストOSでSSH接続をする場合、色々設定をする必要があります。
・VirtualBox > 設定 > ネットワーク > アダプター1 > 高度/ポートフォワーディング 
![スクリーンショット 2022-08-28 20.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953754/fce5b543-ad26-9c66-227d-d1b9055cda77.png)


## 5.ホストOSからゲストOSにSSH接続
```
% ssh -p 2222 ユーザー名@locaohost
// ポート番号2222を指定し、サーバーにSSH接続
```

これで接続できれば完了です。


### 参考
[How to SSH into VirtualBox machine](https://www.youtube.com/watch?v=rhFLfwZzlGA)
エンジニア転職　10ヶ月目振り返り

こんにちは！未経験からエンジニア転職した『まさきち』です。
エンジニアに転職して10ヶ月経ちましたので業務や感じた事などを振り返ろうと思います。

これまでの振り返りは下記の記事に書きましたので合わせて読んでいただけると嬉しいです。

https://qiita.com/masakichi_eng/items/be6604f78ebf90f5df69

https://qiita.com/masakichi_eng/items/9495eac6e3ae27898ca9

https://qiita.com/masakichi_eng/items/1d5cbafcca60b5746fe8

https://qiita.com/masakichi_eng/items/18509590c0a1c7c9f996


10ヶ月目は、担当していた新規案件がいよいよリリース間近になってきたので仕上げ作業を行なっていました。
また、業務上の目標を決め、具体的に取り組んでいくことを決めました。

## 仕上げ作業概要
- 外部APIとの連携を行うバッチ処理関係
- 例外処理の追加やログ出力
- 各種テスト仕様書作成とテスト
- バグ修正

### 外部APIとの連携を行うバッチ処理関係

この案件のメイン機能を外部APIと連携する処理の実装をしていました。
1. 外部APIから送られてくるリクエストの情報を受け取って処理を行うAPIの作成
2. 定期的に外部APIにリクエストを送って情報を取得するバッチ処理の作成
主に上記の二つです。

バッチ処理の実装は行なったことがなく、cronや、スケジューラーの設定等の実装を初めて知りました。
今回はLaravelのartisanコマンドを作成して、スケジューラーに登録してcronで呼び出すという流れで実装
下記の記事等を参考にさせていただきました。

https://codelikes.com/laravel-batch-command/

https://zenn.dev/goemon/articles/0596e6f59e776d

https://readouble.com/laravel/8.x/ja/scheduling.html


### 例外処理の追加やログ出力
今まで例外が起きた場合の処理を全く考慮して無かったので例外処理を追加しました。
APIとの連携が取れない場合は、サイト全体が落ちるのではなく、APIが関連する部分だけ落ちるようにするなど
想定外の現象が起きた時のエラーハンドリングやログ出力について学びました。
具体的にはtry-catchで処理を囲んだり、ログ出力してSlackに通知する処理を追加しました。
（ログレベルという概念を初めて知りました... error とかinfotとか色々あるんですね)
下記の記事等を参考にさせていただきました。

https://codelikes.com/laravel-logging/

https://www.plus-one.tech/posts/2020/03/04.html

https://qiita.com/shihori_23/items/4f6d37c2c2c546909159

### 各種テスト仕様書作成とテスト
機能の実装を行いながら単体テスト仕様書を作成してテストを行なっていきました。
バッチ処理の仕様書はフロー図を書き、処理の流れをイメージしながら作成しました。
テスト項目を書き出してテストをしていくと、自分では完璧に作ったつもりでもバグが出るわ出るわw
バッチ処理仕様書の良さそうなテンプレートがあったので参考にさせていただきました。

https://creativecontentlabtokyo.com/apex-batch-process-basic-design-excel-template/

### バグ修正
テストを行なっていくと細かい部分も含めバグが多く出てきたので、バグ修正リストを作成して優先順位を決めて消化していきました。バグ自体は大したことなくても、修正する影響範囲が広いと全て直すのに手間がかかるので大変でした。

## 業務上の目標設定
今までも目標を設定してはいたものの、「資格をとる」、「実装力を身につけて業績に貢献する」のような抽象的なものであったり、立てた目標を振り返れる基準が明確では無かったのでより具体的に自己評価できるように設定し直しました。
一例を下に記述します。

1. プロジェクトを進行していく中での自身の役割
    1. 要件定義や各種設計書を元に実装を滞りなく進めて、納期までにサービスを問題なくリリースする為に自ら手を動かす

2. 役割に対してどのように貢献するか、何に取り組むべきか
    1. スケジュールにそって計画的に実装を進める
    2. スムーズに実装を進める為に技術を前もってキャッチアップする
    3. PMが進捗を把握しやすいような報連相を行う
    4. メンバーのサポートを行う

3. 取り組んだことに対しての振り返り（5W1Hで語るのが良さそう）
    1. 役割は達成できたか
    2. 行動できたか、行動した結果の成長や貢献
    3. 満足度を数値で表して、続行か、改善が必要か


# まとめ
### 成長を感じた部分
仕様書や、実現したいことをヒアリングした後、どのように実装に落とし込むかが割とすぐイメージできるようになってきた。実装スピードが格段に上がった...気がする。

### 課題に感じた部分
報告や共有の仕方に結構悩む部分が多い。文章の組み立て方とか、仕様の説明の仕方など。

# 余談
週2日リモートになりました！
通勤時間が長いので助かります。通勤時間の分はジムに通うなどして有効活用できるので嬉しいです。

以上になります。
最後まで読んでいただきありがとうございました。