OmniAICreator/Qiita-1.07M huggingface dataset:
error while removing networkでDockerコンテナを終了できない時の備忘録

# 概要
- Dockerのコンテナを終了させようとした際に、`Error response from daemon: error while removing network: network XXXXX id XXXXX has active endpoints`というエラーが出て、docker networkの削除ができなかったのでその時の対処法を書き残しておく。

# 参考
https://docs.docker.jp/compose/reference/down.html

# Docker-composeのコンテナ実行中にファイルを書き換えてしまった場合
コンテナ実行中なのにも関わらず、ファイルを書き換えてしまい`docker-compose down`をすると今回のエラーが発生することがある。その際には以下のコマンドを実行する。
```
docker-compose down --remove-orphans
```
`--remove-orphans`というオプションを付けることで、docker-composeによって作成されたコンテナ・ネットワークを自動で探して掃除してくれる。

上記で問題が解決しなかった場合は、下記手順を行ってみる。

# コンテナの停止
`docker stop [コンテナ名]`

# コンテナの削除
`docker rm [コンテナID]`

`docker rm --force [コンテナID]`
※うまくいかない場合は`--force`オプションを付けてみる

# ネットワーク削除
`docker network rm [ネットワーク名]`
※これには`--force`のオプションがない

# コンテナ接続情報をデタッチ
上記でネットワーク削除ができない場合、コンテナの接続情報が残ってしまっているのでそれを解除。
ネットワークの情報を取得するために下記コマンドを実行。（コンテナのIPアドレスを知りたいときになどもこのコマンドは便利なので覚えておくべき）
`docker network inspect [コンテナ名]`

以下のような情報が現れる
```
[
    {
        "Name": "test",
        "Id": "0f60b7b874f667e2c29b30f0d6867cd9e5de7a7f2cc401274aa9c5b3310f2ab0",
        "Created": "2022-12-05T18:22:24.028784023+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.25.0.0/16",
                    "Gateway": "172.25.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "af1f2d64b630a7642a96e9c52e35c9ee598826629aef6fc3a2c3876d937016de": {
                "Name": "test",
                "EndpointID": "607cd7bbaed54c0b301e0e8fe5e1a3dc1be4e62cef0471010485e9fcb978a91e",
                "MacAddress": "02:42:ac:19:00:02",
                "IPv4Address": "172.25.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "test",
            "com.docker.compose.version": "2.3.3"
        }
    }
]
```

このネットワークのコンテナ接続情報をデタッチするのに下記コマンドを実行。
`docker network disconnect [ネットワーク名] [コンテナ名]`

`docker network disconnect --force [ネットワーク名] [コンテナ名]`
※うまくいかない場合は`--force`オプションを付けてみる


# 再びネットワーク削除
`docker network rm [ネットワーク名]`


# 最後に
ここまでやれば削除できるはず...
恥ずかしくないPythonの書き方

## はじめに
スタンバイのアドベントカレンダー2022のための記事です。
現在、スタンバイでは主にデータサイエンスや機械学習の領域でPython言語をよく利用しています。
ささっと小さいスクリプトを書くにはとても便利だったPythonですが、徐々に大きいサーバーサイドアプリケーションやデータ処理アプリケーションでも利用することが増えてきてしまったので、Pythonの書き方をおさらいしておこうと思います。

## 前提
人に見られてしまったときに、「なにこれ変なのー」と思われない程度のPythonコードが書けるようになりたい。

## まずPEP8から大事なところを抜粋
[pep8-ja](https://pep8-ja.readthedocs.io/ja/latest/#)
* インデントはスペース4
* トップレベルの関数やクラスは、行間を2行ずつ空けて定義する
* クラス内部では、行間を1行ずつ空けてメソッドを定義する
* ドキュメンテーション文字列は`"""`で囲み、`class`や`def`の行の後に置く([docstring](https://peps.python.org/pep-0257/))
* 命名規則
    * モジュールの名前は全て小文字で短く、アンダースコアを使うのも推奨されない
    * クラスの名前はCapWords方式
    * 型変数もCapWords方式
    * 関数や変数は小文字のみ、単語をアンダースコアで区切る
    * 公開されていないメソッドやインスタンス変数にだけ、アンダースコアを先頭に付ける
    * 定数は全て大文字で、単語をアンダースコアで区切る
    * インスタンスメソッドの引数の一つ目の引数は常に`self`
    * クラスメソッドの一つ目の引数は常に`cls`
* プログラミングでの推奨事項
    * シングルトンとの比較には`is` `is not`を使う。等価演算子は使わない
    * 型の比較は`isinstance()`を使う
    * `try...finally`の中で`return / break / continue`は使わない

## ディレクトリ構造
フレームワークを使うときはそれに準ずるが、何もないときは
```
myproject
|- myproject
|  |- __init__.py
|  |- __main__.py
|- docs
|- tests
|  |- test_cat.py
```
srcディレクトリではないらしい

## Type Hintsを使おう
```python
def check_cat(cry: str) -> bool:
    return cry == 'ニャー'
```
dataclass機能が便利
```python
@dataclass
class Animal:
    cry: str

def check_cat(animal: Animal) -> bool:
    return animal.cry == 'ニャー'

check_cat(Animal('ワン')) # False
```

## ファイルを扱うときはwith文を使おう
```python
with open("cat.txt", "w") as file:
    file.write("ニャー")
```
リソースの閉じ忘れを防げる

## 条件式にandを使わず範囲指定できるのがすてき
```python
a = 1
if 0 < a < 2:
    print('ニャー')
```
入力値のバリデーションとか読みやすくできそう

## 三項演算子がいつもと違う
```python
cat = True
print("ニャー" if cat else "ワン") # ニャー
```
いつもの言語と違うので注意する

## その他
* 文法チェックにはflake8を使おう
* コードフォーマットにはblackを使おう
* import文はisortにきれいに書き直してもらおう
* Poetryでライブラリの依存関係を管理しよう
* mypyで型をチェックしよう
* radon / xenon でシンプルなコードを維持しよう
* Pythonがおもしろくなってきたので、春休みにもっと勉強してみよう！
pathlibでディレクトリを再帰的に検索してファイルリストを表示する

### 実行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/8bee7373-1a88-df18-d036-3a3fe719bdf8.png)

### ソース
```get_file_list.py
# -*- cording: cp932 -*-
from pathlib import Path

def main():
    get_file_list()

def get_file_list():
    parent_path = "C:\\Windows\\boot"
    str_header = "ファイルパス"
    print(str_header)
    p = Path(parent_path)
    l = list(p.glob("**/*"))
    for element in l:
        if element.is_file():
            s_element = str(element)
            print(s_element)

if __name__ == "__main__":
    main()  
```

### 結果
```
ファイルパス
C:\Windows\boot\BootDebuggerFiles.ini
C:\Windows\boot\DVD\EFI\BCD
C:\Windows\boot\DVD\EFI\boot.sdi
（中略）
C:\Windows\boot\PCAT\zh-TW\memtest.exe.mui
C:\Windows\boot\Resources\bootres.dll
C:\Windows\boot\Resources\en-US\bootres.dll.mui
C:\Windows\boot\Resources\ja-JP\bootres.dll.mui
```
プログラミング学習を学ぶ前に知っておきたいこと~PC設定編~

## 初めに
この記事は**プログラミング学習を学ぶ前に知っておきたいこと**と題したシリーズの一つです。
このシリーズは各テーマごとに連日投稿予定です。

## このシリーズ記事の対象者
- プログラミングに興味を持って、学習を検討している方
- 学習したいけど、何から手をつけたらいいのかわからない方

[前回の記事](https://qiita.com/MPrg2011/items/3af818f0d60814320571)の続きです。

https://qiita.com/MPrg2011/items/3af818f0d60814320571

## 言語の学習と並行してやっておきたいこと

### トラックパッドの設定
- [ ] タップでクリックをONにしておく
- [ ] 軌跡の速さを最速に

Windows

https://itojisan.xyz/trouble/13014/

Mac

https://support.apple.com/ja-jp/HT204352

### キーボードの速度設定を最速にしておく
- [ ] キーのリピート
- [ ] リピートの入力認識までの時間

Windows

https://support.microsoft.com/ja-jp/windows/%E5%85%A5%E5%8A%9B%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%AE%E8%A8%80%E8%AA%9E%E8%A8%AD%E5%AE%9A%E3%82%92%E7%AE%A1%E7%90%86windows-12a10cb4-8626-9b77-0ccb-5013e0c7c7a2

Mac

https://support.apple.com/ja-jp/guide/mac-help/kbdm162/mac

### スクロールの速度設定を最速にしておく
Windows

https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=018273


Mac

https://support.apple.com/ja-jp/guide/mac-help/mchlp1138/mac#:~:text=%E3%83%80%E3%83%96%E3%83%AB%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E9%96%93%E9%9A%94%E3%81%A8%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E9%80%9F%E3%81%95%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B&text=Mac%E3%81%8C%E3%83%80%E3%83%96%E3%83%AB%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A8,%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%80%E3%82%92%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

### (MacBook)　Dockの設定
- [ ] Dockを自動的に表示/非表示
- [ ] サイズを小さくする

https://support.apple.com/ja-jp/guide/mac-help/mh35859/mac#:~:text=Mac%E3%81%A7%E3%80%81%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%20%EF%BC%9E,%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%EF%BC%89&text=%E5%8F%B3%E5%81%B4%E3%81%AE%E3%80%8CDock%E3%80%8D%E3%81%AE%E4%B8%8B,%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

### Chromeをインストール
SafariやEdgeと比較して拡張機能や検証ツールが充実していて使いやすいのでおすすめです。

https://www.google.com/intl/ja/chrome/

### 言語入力のインストール
Macはデフォルトでことえりというものが設定されていますが、予測変換や学習機能が優秀なのでインストールしておきましょう。ユーザー辞書によく使うもの(メールアドレスなど)を登録しておくとタイプミスも防げます。

https://www.google.co.jp/ime/

### (MacBook)RayCastのインストール

https://www.raycast.com/

以前は
- ShiftIt(ウィンドウの切り替えをキーのみで可能)
- Clipy(コピーした文字やファイルの履歴を30件保存して、いつでも呼び出せる)
- Alfred(アプリやファイルの検索を最速でしてくれる)
の3つのインストールをおすすめしてましたが、RayCast1つで可能になります。
インストール後はSpotlight検索を表示をOFFにしてから使用しましょう

::: note info
WindowsとMac両方で同じアプリを使いたい方はueliをインストールしてみて下さい。
:::

https://ueli.app/#/

**使い方の解説**

https://softantenna.com/blog/ueli/

### キーボードの早打ちの練習

https://www.e-typing.ne.jp/

オーソドックスなタイピング練習サイト。会員登録して記録を残すことが可能です。

https://sushida.net/

お手軽から一発勝負までメニューが豊富です(寿司だけに…)

https://typingland.higopage.com/jp.html

ゲーム感覚でタイピングを覚えることができます。
子供向けに見えますが指の置き方から教えてくれるのでPC操作に慣れていない方にはおすすめです。

### 最後に
短い記事でしたが最後まで見ていただきありがとうございました。

明日は学習する際のメモのとり方について投稿予定です。

参照元動画

https://youtu.be/LWJ4VOF6GCs

2年前の動画なのでAlfredを紹介してますがこちらの記事では代替アプリを紹介してます(この動画はMacBookのみです)。
8.94^18「京都大学2019年（H31年）」をwolframAlphaとsympyでやってみたい。

常用対数表を使っていません。

オリジナル

上と同じです。大学入試数学問題集成＞文系【１】

https://mathexamtest.web.fc2.com/2019/201910541/2019105410100mj.html#top-0102

# wolframAlphaで
8.94^18

https://www.wolframalpha.com/input?i=8.94%5E18&lang=ja

x=8.94^18,IntegerPart[x]

https://www.wolframalpha.com/input?i=x%3D8.94%5E18%2CIntegerPart%5Bx%5D&lang=ja

# sympyで
(勉強中)
```python
```


# 参考
Web開発でgitのコミットにprefixをつける(Semantic Commit Messages)

## 導入してよかったこと
gitを使い始めてしばらくしてもコミットに何を書けばいいのか迷う時期がありました。
そこでOSSのとあるJSライブラリ開発ではprefixを付けていることを知り取り入れてみたところ
- コミット内容のカテゴリ付けされているみたいになりコメントの取っ掛かりになる。
- コミットに含める内容を意識しやすくなった。
- prefixを見ればロジックに影響がある変更なのかわかりやすくなった。
- 漠然と使っていても体験すればするほど理解が深まっていく。

という効果を実感してきました。
ただライブラリ開発とWeb開発の違いから補足したところや2,3年使ってみて理解が進んだ部分があったのでそれらも一緒にまとめてみます。

## prefix付きコメントについて

コメント例
`feat: Validation種類追加のためValidator追加`

やってることはこのように prefixは `feat:` の部分で内容に合うものを付けてからコメントを書くようにするだけです。

元は Angular.js でのcommit format 内の `<type>` 部分で他にもformatがありますがここだけ導入してもわかりやすくなります。

※この形式が [Semantic Commit Messages](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716#file-semantic-commit-messages-md) と命名されていました。

## prefix種類

これはコミットを区別するために書くのですがそれぞれどんな時に使うか説明を書いていきます。

- `feat:` ロジック・機能(一緒に書いたUnitTestも含む)・ロジックにかかわるライブラリ追加やupdate
- `fix:` バグ修正(ロジックの変更あり)
- `docs:`  jsdocやphpdocなどのようなコードに影響ないコメント、ドキュメントファイル
- `style:` コードスタイルの修正のみ(ロジックの変更なし)
- `refactor:` リファクタリング
- `perf:` パフォーマンス改善(この変更が注意箇所になる)
- `test:` UnitTestのみの修正やTestCaseの追加
- `chore:` ビルド用のファイルや補助ツール、ドキュメント生成のような関節的なライブラリ関連
- `design:` HTMLソース・画像やcssなどデザイン関連
- `remove:` 機能やファイルの削除(これによるインパクトを意識しないといけない)

参考元
Angular.js
https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type

付け加えたのは `design` と `remove` 
`design` はデザインチームからの素材を取り込んだりする必要があるので区別するため。
`remove` は運用しながらの開発をしているので削除したことによる影響を考えないといけないため配慮が必要なので追加しました。

環境によってはまた違うprefixが必要になるかもしれませんが
『ロジックに影響するかしないか』や『区別する理由』に気付けるようにすれば良いと思います。
【Laravel】混合コンテンツエラーの対応方法

## 環境
- Laravel 9.19
- react 18.2
- vite 3.0
## 混合コンテンツエラーの出力
検証環境へアプリケーションをデプロイしたところ、Chromeのコンソールに混合コンテンツエラーが出力されました。

````
Mixed Content: The page at xxx.com was loaded over HTTPS, but requested an insecure...
````

エラーの内容から、`https`と`http`のサイトが混合しており、読み込めないことが原因でした。

Chromeの検証ツールから、cssファイルやJavaScriptファイルへアクセスする際に`http://localhost`へアクセスしており、検証環境のドメインになっていないことがわかりました。

## 対応方法
検証環境へドメインするために、コンテンツファイルのURLを環境変数を設定する必要がありました。
.envファイルで環境変数を管理している場合は、下記の記述で設定可能です。

````.env
ASSET_URL=https://example.com
````

## 余談
無駄にSSL化が適用されていないことや、フロントのビルドツールの設定やオプションに誤りがあるなどを疑ってしまい、解決に時間を費やしてしまいました。。。
今後の自分のためにも忘備録として、記事にさせていただきました。
perlでタイムスタンプを変更したい、Time::Pieceを使って

この記事はPerl Advent Calendar 2022の6日目になります。
昨日は[@nanto_viさん「Perlで配列の先頭何要素か以外を抜き出す」](https://nanto.asablo.jp/blog/2022/12/05/9545777)でした
# 概要
　今回の概要はタイムスタンプを変更しよう！、Time::Pieceモジュールを使って！です。
　思い立ったが吉日、手元のperlで作ってみました。
# 使うモジュール
- Time::Piece
  - コアパッケージになっているオブジェクト指向の時間オブジェクト
- Time::Seconds
  - Time::Pieceな時間オブジェクトで計算する際に使用する
# コード
```perl:TimeStampUpdate.pl#!perl
use strict;
use warnings;
use Time::Piece;
use Time::Seconds;

my $c = @ARGV;
if($c < 2){ # 引数が2つ未満のときは使い方を表示
	print ">perl TimeStampUpdate [input file] [update time YYYYmmddHHMMSS]";
} else {
	my $file = $ARGV[0];	my @s = stat $file;  # stat関数でファイル情報を取得
	
	my $z = Time::Piece->strptime($ARGV[1],"%Y%m%d%H%M%S");  # Time::Pieceを用いて時間オブジェクトに
	$z -= (ONE_HOUR * 9);  # 指定時間から9時間引いて世界標準時に
	
	utime $s[8], $z->epoch, $file;  # utimeを用いて更新時間のみ変更
}
```
# 実行結果
sample.txtは2022/12/4　10:45です
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542578/180923f9-5fbe-7e66-42cf-beb1526ea67d.png)

これを2019/4/1 22時10分30秒に書き換えます
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542578/cc8413e5-84c9-9459-d0d7-1bf2f5c697c1.png)

sample.txtの更新日時が書き換わりました
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542578/ad61d445-d51f-05c2-f816-7134c066fda6.png)

# Time::Piece
## 文字列を時間オブジェクトに変換
- Time::Piece->strptime(文字列, フォーマット)関数を使います。
  - 例では時間文字列として「20190401221030」を与えましたので、フォーマットは"%Y%m%d%H%M%S"としました。
  - 対応は以下のとおりです
    - %Y - 2019
    - %m - 04
    - %d - 01
    - %H - 22
    - %M - 10
    - %S - 30

## 時間オブジェクトから値を取り出し
- 例ではエポック秒を取り出すのに「->epoch」を使いました
- 他にも「->ymd」でyyyy-mm-dd形式の文字列が得られます
- 詳しくは[perldocのTime::Piece](https://perldoc.perl.org/Time::Piece)を御覧ください

# おわりに
　わざわざperlで更新時間を変えようだなんて酔狂ですが、時刻を扱うならTime::Pieceを使いたいねとの思いを込めて投稿しました。
　明日は@papixさんです。毎年勉強させてもらっています。今から楽しみです。
テキストの色をグラデーションにする

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 6日目です。

テキストの色をグラデーションにしてみます。

## できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/900cc20f-0dad-c9e9-e537-fe727045b513.png)

```html
<p class="text-gradient">text gradient</p>
```

```css
:root {
  --color1: #edb658;
  --color2: #e7719b;
}

.text-gradient {
  font-size: 10vw;
  font-weight: 600;
  font-family: Avenir, sans-sarif;
  color: var(--color1);
  background: linear-gradient(45deg, var(--color1), var(--color2));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
```

## メモ

- コツは `background-clip` と `-webkit-text-fill-color`
- background-clip
    - https://developer.mozilla.org/ja/docs/Web/CSS/background-clip
    - 要素の背景をどこまで表示させるか指定できる
    - 他の値は `border-box` `padding-box` `content-box`
- -webkit-text-fill-color
    - https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-text-fill-color
    - 文字の塗りつぶしの色を指定する
    - このプロパティが設定されていない場合は color プロパティの値が使用される

## 遊んでみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/790fc190-1e4c-7363-4b5e-2ed62da2cfd8.png)

https://codepen.io/becolomochi/pen/RwJZwzM
ゲームクライアントエンジニアとして働いて感じた、大学院に進学したメリットとデメリット

この記事は、[Craft Eggアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/craftegg)、6日目の記事です。
5日目は重谷康輔さんの[『プロジェクトで起きる問題への向き合い方　～今日この問題を伝えてくれてありがとう！～』](https://note.com/hhw_hlsy/n/n18c8877b583b)でした。

株式会社Craft EggでUnityエンジニアをしています東です。

私は現在キャリアとしては二年目ですが、インゲーム・アウトゲームの開発にくわえ、社内活性化や採用活動へのコミットなど、様々な業務に携わらさせていただいています。

ゲーム開発人材の採用活動にあたっては、以下のような質問をよくいただきます。

**私はゲームエンジニアを目指しているのですが、現在、大学院に進学するか学部卒で就職するか悩んでいます。どちらの方が良いでしょうか？**

本記事ではこちらについて、自分なりに感じたメリット・デメリットを書かせていただこうかと思います。（スマホゲーム業界に所属する一個人としての見解となります）


## ■メリット
#### 専門的な知識が身に付く
院進学といってまず初めに挙げられるのはやはり専門知識の深掘りです。

何を専攻するかにもよりますが、中でも画像処理系やソフトウェア工学系の分野は相性が良いのではないかと思います。また、専攻内容を直接業務に活かせなかったとしても、深い知識があれば、「それをどこで活かせるか？」などといった応用力が身に付くはずです。

#### コンピュータサイエンス全般の知識が身に付く
何か一つの分野を深掘りするとはいえ、研究していく上ではさまざまな知識が必要になります。

私は、VRやARといった分野の専攻でしたが、研究の際にはUnityを使用するだけでなく、Pythonを使ってサーバを用意して外部のAPIを利用したり、Dockerで環境を構築したり、実験結果の統計処理のためにPythonやRといった言語を使用しました。これにより、業務でのアセットの置き換え作業やテストなど、何かしらを自動化するにあたってShellやPythonを触ることもありましたが、すんなりと入っていくことができました。

#### 数学や英語への抵抗が薄くなる
研究を行う上で、数学や英語の知識は必須と言っても良いでしょう。

私自身、日々英語の論文を調査し解読していましたし、三角関数や行列演算を用いたプログラムを書いたりしてきました。

ゲームを作っていると、数学的な処理や、日本語の資料が少ない外部ライブラリを使用するケースも少なくありません。そういった時に抵抗を感じずに自走できるような能力が身に付くと思います。

#### 事象の調査能力・資料の作成能力・タスク管理能力などの素養が身に付く
日々、答えのない問題と向き合う必要があるので、事象の調査能力が身に付きます。わからない問題に直面した時に、どうやって調べて解決すれば良いか、どういった資料を参照すれば良いか、といったスキルが感覚的に身に付きます。

また、ゼミ発表や学会発表などもあるので、資料作成・タスク管理の能力も自ずと身に付いていきます。

## ■デメリット
#### キャリアのスタートが遅れる
なんといってもキャリアのスタートが遅れることが最大のデメリットだと思います。

修士卒だと、学部卒で就職した同期はいきなり三年目の先輩になります。開発サイクルが早く流動性の高いスマホゲームの業界だと、ここの二年の差は意外と大きく感じるかもしれません。

とはいっても業務で年次ではなく年齢で評価されるというようなことはないので、私は、本人が気にするかどうかだけの問題だと思っています。
早く実績がほしい、現場で実務経験を積んでいきたい、という人には合わないかもしれません。

#### 金銭的な問題
当たり前ですが、追加で二年学校に通おうと思うと学費がかかります。国立でも入学金と合わせて１００万以上はかかります。

私も奨学金を借りて進学した身ですが、この金額は精神的な負担にはなります。

ただ一方で、その分の経験をできたとも思っているので、これも、本人が気にするかどうかの問題だと感じています。

## その他
#### 就職に有利になるかどうか
会社によるのかもしれませんが、個人的な体感としては特に有利になったり不利になったりすることはないです。

ただ、就職活動まで期間が二年長いこと・整った環境で専門的な活動を行えることを考えると、研究や学問に向き合う時間が増えるだけでなく、単純に時間的猶予ができるという意味でも、実質的に有利になるという側面はあるかもしれません。


## 最後に
ゲームエンジニアは業務としてゲーム作りに勤めますし、院生は一研究者として世の中の謎や新しい発見に向き合います。

学部卒であれば早めに現場でゲームエンジニアとしてのキャリアを積むことができますし、院卒であれば、広く深い知見や洞察を身に付けることができるかと思います。
将来のことを考えるとどちらが自分に得があるか悩んでしまうと思いますが、最終的には自分のワクワクする方を好奇心で選んでみるのが一番かと思います。
【Swift】初心者のランダム通話アプリ開発奮闘記 #8

# 今日の積み上げ
一旦期待値通りの座標をプレビューに出すのは諦め、次の項へ、、
![2022:12:05_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997222/efb89b2b-c159-02b9-46d7-6c68c717354a.png)

↑の丸がついているところを押すと、、

![2022:12:05_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997222/3b701d7c-01fe-4bca-1059-bd5091ab33f2.png)

デバックモード（正式名称不明）が起動し、地図が表示されるところまできた！！！
（なぜか指定した座標ではなく、シリコンバレーらへんが表示されるがこの際、よいであろう）

これで一旦、公式チュートリアルは終わり！！！
もう、英語には懲りたので、本屋で初学者用のSwift教本を探そうと思います
【VSCode】Remote Developmentについて

※この記事は、[Visual Studio Code Advent Calendar 2022](https://qiita.com/advent-calendar/2022/vscode)の5日目の記事です。  
  
#### はじめに  
私は、ずっとVSCodeを使ってて、[VS Code Meetup](https://vscode.connpass.com/)でも何回か発表もさせていただきました。  
  
その中で「Remote-Containerでnext.js 環境を作った話」をした際に「Remote Development」「Remote Containers」などがごちゃごちゃになっている方も多かったので(私もそうでした)、ここでそれをまとめた記事にしようと思いました。  

#### Remote Developmentってなに？  
まず「Remote Development」ですが、これは下記3つの拡張機能がセットになった拡張機能パッケージのことです。  
  
下記3つの拡張機能のインストールをまとめてRemote Development1回のインストールで済ますことができます。(もちろん、機能なども単体で入れた場合と全く同じです)  
  
- Dev Containers(旧Remote Containers。コンテナ環境での開発に便利) 
- Remote SSH(SSHを利用したリモートホストでの開発に便利)  
- WSL(ローカルフォルダをWSL環境で開く(=Linuxのように扱える))  
  
たまにRemote DevelopmentとRemote Containersを混同しているブログなどを見かけますが(=私もそうだった)、先述の通りRemote Developmentはあくまで拡張機能パッケージであり、Remote Development自体は拡張機能ではありません。  
  
昔はDev ContainersがRemote Containersという名前だったので、余計ややこしかったのもあるんでしょうね。  
  
#### 実際にインストールされる拡張機能について  
##### Dev Containers(Remote Containers)  
これはコンテナ環境での開発をサポートしてくれる拡張機能です。  
ローカル環境からイメージビルド＆コンテナ作成を行ったり、実際にコンテナ内に入ってVSCodeで開発・テストなどを行うことができます。  
  
これについてはちょうど前回のStreamWest-1629さんが[https://zenn.dev/streamwest1629/articles/vscode_wanderer-in-devcontainer:title]という内容で投稿されているので、詳しくはそちらを読むのがよいと思います。  
  
##### Remote SSH  
これは名前の通りSSH接続を行う拡張機能です。  
SSHを用いてリモートホストに接続したり、接続先のリモートホスト環境でVSCodeで開発・テストなどを行うことができます。  
  
その他、設定ファイルに接続設定を残して、マウス操作だけで簡単にリモートホストに接続が行えたりします。  
  
なお設定ファイルにOSのhostsファイルを使うこともできますが、その場合は管理者権限でVSCodeを開かないといけないので、個人的にはRemote SSH用の設定ファイルを作成することをお勧めします。(もちろんRemote SSHのGUI操作で作成可能)
  
##### WSL
これはWindows上のフォルダをWSLとして開くことができる拡張機能です。  
WSLとして開く≒Linuxとして開けるということになるので、Linuxに慣れている人には使いやすい拡張機能です。  
  
また、最近は実際のサーバーはLinux環境で動かすことが多いので、そういう意味でもより実際のサーバーに近い感覚で操作することができます。  
  
#### まとめ  
以上、Remote Development(＆その拡張機能)について説明しました。 
  
Remote ContainersがDev Containersに名前が変わったので、だいぶ区別がつきやすくなりましたが、もしこのあたりがごちゃごちゃになっている人がいたら、そういう人たちの理解の助けになれば、と思います。  
  
それでは、今回はこの辺で。
Meta Quest の Hand Tracking で手がどっかにいってしまう解決方法

# デモ
## 通常のHand Tracking

https://youtu.be/UNQEBkzDrg0

## トラッキングが失われても手が残り続ける Hand Tracking 

https://youtu.be/Bks5NaZfOKI

# スクリプト

```HandMeshController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HandMeshController : MonoBehaviour
{
    [SerializeField] private OVRHand OriginalLeftHand;

    [SerializeField] private SkinnedMeshRenderer LeftHandMesh;

    [SerializeField] private OVRHand OriginalRightHand;

    [SerializeField] private SkinnedMeshRenderer RightHandMesh;

    [SerializeField] private OVRHand CopyLeftHand;

    [SerializeField] private OVRHand CopyRightHand;
    // Start is called before the first frame update
    void Start()
    {
        LeftHandMesh.enabled = false;
        RightHandMesh.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (OriginalLeftHand.IsTracked)
        {
            CopyLeftHand.gameObject.transform.rotation = OriginalLeftHand.gameObject.transform.rotation;
            CopyLeftHand.gameObject.transform.position = OriginalLeftHand.gameObject.transform.position;
        }

        if (OriginalRightHand.IsTracked)
        {
            CopyRightHand.gameObject.transform.rotation = OriginalRightHand.gameObject.transform.rotation;
            CopyRightHand.gameObject.transform.position = OriginalRightHand.gameObject.transform.position;
        }
    }
}


```

### 使い方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/477b087b-dc19-b1b8-da3e-4947e7c6bef7.png)

CopyLefthand, CopyRightHandには CustomHandPrefabをコピーし、LeftHandAnchor, RightHandAnchor以外の場所に置きます。

LeftHandMesh, RightHandMeshは OVRCustomHandPrefabの子オブジェクトの SkinnedMeshRenderer　をアタッチします。

以上
【Docker】hadolintの導入方法

## hadolintとは

hadolintは`Dockerfile`のリンターです。  

## 導入方法

Homebrewを使用してインストールします。  

```terminal
brew install hadolint
```

Homebrewを使用しない場合には以下

https://github.com/hadolint/hadolint/releases/latest

## 使用方法

### CLI

次のようにコマンドを実行することで使用できます。  

```terminal
hadolint Dockerfileのパス
```

```terminal
$ hadolint Dockerfile
Dockerfile:12 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation.
Dockerfile:12 SC2086 info: Double quote to prevent globbing and word splitting.
Dockerfile:17 SC2086 info: Double quote to prevent globbing and word splitting.
```

### VSCode

拡張機能をインストールするとVSCode上で使用できます。  

https://marketplace.visualstudio.com/items?itemName=exiasr.hadolint

インストール後`Dockerfile`を開くと以下のように警告が表示されるようになります。  

![D84F2B4D-D3E9-44DB-8BFB-16108BE7EB38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/daa9e570-ac21-e40a-2192-355d26fcb734.png)
CloudWatch Alarmで強制的にアラーム状態へ変更してテストする方法

# はじめに

CloudWatch Alarmを設定したけど、どうやってアラートアクションのテストやるの？
そう思う人向けに素早くテストをする方法があるということを知って欲しくて記事にしました。

昔はアラートのCPUやメモリを無理やり上げたり、レスポンスステータス500を発生させる裏ルートなんかを使ったりすることもあれば、テストせずに本番で閾値が上がるまでずっと放置されていることもありました。設定ミスがあって閾値超えても次のアクションが実行されてなかったりなんてことも...

今回お伝えすることは閾値のテストまではできないですが、アラートアクションの単純な設定ミスを事前に検知できるので必ず新規でアラートを追加した時には実施したいところです。


# アラート通知
アラート通知テストをするためにAWSCLIを利用します。


## AWSCLIのインストール

安定バージョンだとAWSCLI2系が有力のため、[公式の手順](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)をもとにインストール。

私の環境では以下のバージョンで実行します。

```bash
$ aws --version
aws-cli/2.7.27 Python/3.10.6 Darwin/21.2.0 source/x86_64 prompt/off
```


### アラート状態に変更する

コマンド一発で強制的にアラーム状態に変更することができます。
※ alarm-name はご自身の環境に合わせて変更してみてください。

```bash
aws cloudwatch set-alarm-state --alarm-name "api-gateway-alarm-test" --state-value ALARM --state-reason "alarmtest"
```

はい、以上です。たったこれだけで出来ます。
このコマンドだけで簡単にテストできるとはAWSCLI有能すぎる!!

### AWS IAM Identity Centerを用いた場合

たまにAWS IAM Identity Center（旧 AWS SSO）を用いた実行方法をど忘れしてしまうので備忘録として書き残しておきます。

```bash
aws sso login --profile <profile-name>
aws cloudwatch set-alarm-state --alarm-name "api-gateway-alarm-test" --state-value ALARM --state-reason "alarmtest" --profile <profile-name> --region ap-northeast-1
```


# まとめ

アラートの通知も頻繁にテストする訳ではなく毎回忘れてしまうので、このような形で残しておくのは良いですね。

CloudWatch Alarmを怖がらずに活用していきましょう！
まだContextでグローバルステート管理してるの？ useSyncExternalStoreを使う


これは [ZOZO Advent Calendar 2022 カレンダー](https://qiita.com/advent-calendar/2022/zozo) Vol.4 の 17 日目の記事です。

React でグローバルな状態管理するとき、皆さんは何を使うでしょうか。

状態管理ライブラリには Redux, Recoil, jotai, Zustand など様々ありますが、わざわざ入れるまでもないかと Context を使っている人も多いと思います。

Context を用いた自作の状態管理は、スコープを作れたり、文献が多いなどのメリットもありますが React への理解が浅いと余計なレンダリングを招くなどの罠もあります。（今回は触れません。_React Context アンチパターン_ などで検索するとでてきます）

:::note
本記事は Context を用いた状態管理を否定するものではありません。
:::

本記事では、 `useSyncExternalStore` を用いた状態管理を作ることで、 `useSyncExternalStore` とそれを使った状態管理ライブラリへの理解を深めることがゴールです。

## [useSyncExternalStore](https://ja.reactjs.org/docs/hooks-reference.html#usesyncexternalstore)

useSyncExternalStore は React18 から導入されたフックで、下位互換のある [`use-sync-external-store`](https://www.npmjs.com/package/use-sync-external-store) パッケージとしても提供されています。公式のドキュメントでは [_ライブラリの製作者向け_](https://ja.reactjs.org/docs/hooks-reference.html#usesyncexternalstore:~:text=%E3%81%8F%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B-,%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%A3%BD%E4%BD%9C%E8%80%85%E5%90%91%E3%81%91,-%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) という記述がありますが、覚えておいて損はないでしょう。

> 外部データソースから読み出しやデータの購読を行うために推奨されるフックです。

このフックを用いることで、簡単に状態管理が行えるようになりました。
Zustand や nanostores などがフックのみで(ツリーの上層でコンポーネントを配置せずに、かつ一意の文字列の Key などを設定せずに)利用できるのはこのフックによる影響が大きいです。
jotaiは実は使っていませんが...

### API

useSyncExternalStore は 3 つの引数を取ります。

1. `subscribe`: 状態の変化を通知するためのコールバックを登録する関数
1. `getSnapshot`: 現在の状態の値を返す関数
1. `getServerSnapshot`: サーバーサイドレンダリング時の値を返す関数(任意)

`subscribe` は、返り値として unsubscribe な通知を中止する関数を返す必要があります。

次は、具体的なコードとしてオレオレ状態管理を作ってみます。

## オレオレ状態管理してみる

jotai ライクな API で必要最低限の処理を記述するとこうなりました。

```js
export const atom = (initialState) => {
  let state = initialState;
  let callbacks = new Set();
  return {
    get: () => state,
    set: (value) => {
      state = typeof value === "function" ? value(state) : value;
      callbacks.forEach((cb) => cb());
    },
    subscribe: (cb) => {
      callbacks.add(cb);
      return () => callbacks.delete(cb);
    },
  };
};
export const useAtomValue = (atom) => {
  return useSyncExternalStore(atom.subscribe, atom.get);
};
export const useSetAtom = (atom) => {
  return atom.set;
};
export const useAtom = (atom) => {
  return [useAtomValue(atom), useSetAtom(atom)];
};
```

１状態１ atom な状態管理がトレンドっぽい（要出典）ので同様に `atom` で状態定義、 `useAtom` などでアクセスという形です。

`subscribe` で登録されたコールバック関数を Set で管理し、 `set` で状態が更新された際に登録されたコールバック関数を呼ぶことで、状態の変化が通知されます。

このままでは SSR などが考慮されないので実用性には欠けますが、 Playground で React を触る時には使えるかもしれません。

TypeScript を用いたデモ

https://stackblitz.com/edit/react-tiny-atom-demo?file=atom.ts

この形式を応用することで、ResizeObserver や IntersectionObserver などの DOM イベント、非同期な操作を含む Reducer などのカスタムフック化もロジックの分離が容易になります。

## おわりに

この記事では Context を使わない自作状態管理について考えました。

`useSyncExternalStore` を用いることで煩雑な Context 管理から解放されましょう。

また、多くの本番環境では（バンドルサイズの極限のチューニングが必要でない限り[^1]）Context による状態管理や今回の手法を用いずに Zustand, jotai, nanostores など著名なライブラリを選定したほうが結果的に安く済むと思います。

[^1]: この場合そもそも React を使わない選択肢を考えるべきです
Pythonで地理空間情報（GIS）+ PytorchをAnacondaで動かす方法

GeoPandasをはじめとする地理空間情報系のライブラリと機械学習を行うためのPytorchがなぜかうまくAnacondaの環境上に入らない現象が発生したため、調べていたところうまくいったサイトがあったので備忘録に残しておきます。

# geopandas + geospatialを導入
はじめに、地理空間情報系のライブラリがいろいろ格納されている「GeoSpatial」を導入します。こちらの導入は以下の動画を参考にしました。
https://www.youtube.com/watch?v=Y1xB7d2VbFY

```sh
conda create -n geo python=3.9
conda activate geo
conda install -c conda-forge mamba
mamba install geopandas
mamba install -c conda-forge geospatial
```

新しい環境を作ったほうが、謎のエラーに苦しめられることはないでしょう（バージョン競合など）
動画では「geo」という名前で環境を作成していたため、その通りにします。pythonのバージョンは3.9とします。mambaとはcondaの高速実行化パッケージです。

# Pytorchを入れる。
https://pytorch.org/get-started/locally/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3020270/3b24fe69-3808-5f7d-b4d1-b83afe57d7ab.png)

まずはpytorchのダウンロードサイトに行きましょう。ローカルのGPUを使って学習を進めるため、CUDAを入れます。これによれば記事を書いている時点で、CUDAの11.6か11.7を入れておけばよいとなります。ダウンロードサイトは以下の通りです。pytorch指定のバージョンに合わせてCUDA Toolkitを導入しましょう。

https://developer.nvidia.com/cuda-11-7-0-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local

そして
``` sh
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
``` 
をanaconda promptに入れます。

```python
import torch
import geopandas as gpd
``` 
を入れて問題なければ完了です。
失敗の報告を称賛しよう

# 最近思うこと
サッカーW杯の日本代表が熱いですね！
今夜もvsクロアチア戦をハイボール片手に観戦予定です。(勝ったら興奮で多分寝れないw)

ただ、Twitter等のSNSを見てて残念に思うことがあり。
先日のvsコスタリカ戦にて0-1で敗北を喫してしまったわけですが、
SNS上で目に留まったのは、

**戦犯探し**

個人名は挙げませんが、**戦犯**とされる特定の選手のSNSアカウントなどに対し、
非難や批判どころか、誹謗中傷の声まで届いていたようです。

応援していたのに期待通りにならなかった結果、やり場のない感情をぶつけたくなる気持ちは分かります。
でも、敗因の矛先として特定の個人を晒し首にすることは何か生産性があることなのか？
次の試合に繋がる行為なのか？
これは、アスリートに限らず一般社会人の仕事においても同じことが言えるのではないかと思います。

というわけで、表題の「失敗の報告を称賛しよう」について、
最近読んだ本の内容を抜粋しながら、IT業界のシステム開発における「失敗の報告」の重要性について書いていければと思います。

## 読んだ本
[失敗の科学](https://amzn.asia/d/5MtKZsX)
医療業界や航空業界の実例を切り口として、
「失敗から学ぶ」という当たり前のことを実践するのがなぜ難しいのかや、
その具体的な実践方法について、様々なケーススタディから教えてくれる本です。

### なぜ「戦犯探し」は始まるのか？
筆者によると、
「非難は、失敗や好ましくない出来事に対する人間のごく一般的な反応と言える。
何か間違いが起こると、人はその経緯よりも、『誰の責任か』を追及することに気を取られる傾向がある。
我々は、たとえどれだけ複雑な出来事でも、新聞や雑誌の見出しのように単純化してしまうのだ。
非難は我々の学習能力を妨げるばかりではなく、ときには深刻な結果をもたらす。」
とのことです。


### 「失敗を懲罰する」ことの弊害
故意ではない失敗について責め立てられ、罰せられる(≒会社から「戦犯」認定され、晒し首にされる)
とその組織は失敗に対してどのような向き合い方となっていくのか？
- (罰せられるので)失敗をしないように仕事を進めようとする結果、
    - パフォーマンスが下がる
        - 新しいことにチャレンジする意欲が低下する
    - 報連相の頻度が落ちる
        - 全体のコミュニケーション量が低下する
        - 失敗を隠蔽するようになる
        - 仕事が属人化し、取り返しのつかないミスに繋がる可能性がある

懲罰志向の組織文化がもたらす影響については研究調査の結果があるようで、
6か月の期間でとある大学病院の8つの看護師チームに着目したようです。
結果、厳重な処罰を日常的に行っているチームからは表面的に挙がってきたミスの報告の数は少なかったが、実際には他のチームよりも多くのミスを犯していたそうです。
一方、非難傾向が低いチームにおいては真逆の結果で、ミスの報告数は多かったものの、実際に犯したミスの数を比較すると、懲罰志向のチームの方が多かったようです。

人間工学の専門家シドニー・デッカーの言葉を引用すると、
「非難すると、相手はかえって責任を果たさなくなる可能性がある。ミスの報告を避け、状況の改善のために進んで意見を出すこともしなくなる」
とのことでした。

確かに。(小並感)

### ではどのように失敗の報告を積極的に促すか？
いよいよ本題です。
私が聞いた話で、某自動車メーカーの生産工場では、ヒヤリハットが起こった時にその報告を行うそうなのですが、
報告を受けた時点で、「ナイス報告です！」と言っているようです。
聞いたときに、とても良い取り組みだなと個人的に感じて、
- ミスに対して叱責されない
    - 叱責のストレスや恐怖がなく、報告しやすい風土となる
- 個人攻撃がされない
    - チーム全体としてミスに対する改善案の検討を行い、チームとしてパフォーマンスの向上が図れる

当たり前ではあるけど、とても大事なことであり、こういった活動を意識的に行うことで、高いパフォーマンスを発揮できる組織へと育っていくのだろうなと感じます。


### システム開発の現場に落とし込んでみる
ではシステム開発における具体的なミスやヒヤリハットについて検討してみます。
- リリースミス
- DBのバックアップの取り忘れ
- 消してはいけないデータの削除
などなど挙げるとキリがないですが、何かしらのミスはご経験ある方が多いと思います…(私もやってしまったことがありますw)

こういったシステム開発に関するミスは、
- 手順書の確認不足・レビュー不足
- ダブルチェックしていなかった
- うっかりミス
など、多くのことが「気を付けていれば防げたよね」という事例が多いように思います。

ただ、その時にミスを犯した張本人を「お前の不注意だ！」と責めれば解決するのか？次にミスを犯さないようになるか？
ここで個人攻撃をしてしまうと取り返しのつかない事態になりかねませんので、
**個人ではなくシステムを見よ**
を心がけていきたいなと感じています。

ミスを責めない。
報告を上げてくれたことを称賛する。
ミスの原因を、個人に求めるのではなく、チームとしてのやり方・手順の部分に切り口を当てて仮説を立て、検証する。
見直しを行った手順について改めてチーム全体で見直し、フィードバックを行う。

### さいごに
リモートワーク環境なこともあり、なかなか仕事上のコミュニケーションが取りづらい状況ではありますが、
「継続は力なり」をモットーにチームビルディングを行っていければ、と思っています。

日本代表、頑張れー！
今すぐできる！Unityでの開発を快適にするための各設定

この記事は、[Craft Eggアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/craftegg)、7日目の記事です。
6日目は[@ce_gassy](https://qiita.com/ce_gassy)さんの『ゲームクライアントエンジニアとして働いて感じた、大学院に進学したメリットとデメリット』でした。

# はじめに
株式会社Craft EggでUnityクライアントエンジニアをしている山元です。
本記事ではUnityおよびその周辺ツールでの開発を快適にする（効率を上げる）各種設定についてご紹介します。


### 使用環境
```
Mac Catalina
Unity 2020.3.31f
```

#  Unity編
![スクリーンショット 2022-12-05 18.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332397/cc7eea09-90b3-19d4-cf4e-e55e8734c687.png)

## AutoRefresh をオフにする
Unity>Preferences>General から Auto Refresh をオフにすることができます。
更新を反映したいときは⌘ + Rでリフレッシュを行う必要があります。

※ これがオンになっていると、アセットが変更されたときに、アセットの自動更新を行います。スクリプトの変更を加えるたびコンパイルが実行され、その都度作業が中断されてしまいます。

## Compress Assets on Import をオフにする
Unity>Preferences>General から Compress Assets on Import をオフにすることができます。オフにすることで、インポート時にアセットを自動的に圧縮することがなくなるため、インポート時間を短縮できます。

※ただしオフにするとインスペクタでテクスチャの圧縮後のファイルサイズを確認できなくなります。

## Disable Editor Analytics (Pro Only) をオンにする
Unity Pro を使用している方は Unity>Preferences>General から Disable Editor Analytics (Pro Only) をオンにすることができます。
これをオンにするとEditorが自動で匿名データをUnityに送信しないようになるため動作が少し軽くなる可能性があります。

## Script Changes While Playing を Recompile After Finished Playing にする
Unity>Preferences>General から Script Changes While Playing を変更することができます。
Editor が実行されている間にスクリプトを変更された際の動作を選択することができ、デフォルトの Recompile And Continue Playing はシーンを実行中でも再コンパイルします。ゲームがシリアライズ可能でないデータに依存している場合は想定しない挙動になるため、変更を推奨します。

Recompile After Finished Playing にしておくとシーンを停止するまで再コンパイルを行わないようになります。

## Prefab Mode の Auto Saveをオフにする
PrefabMode で開いている時に Scene ビュー>Auto Save からオフにすることができます。
自動で Prefab が保存されなくなるので手動で保存する必要があります。

※ これがオンになっていると、Hierarchy で Prefab の変更を行うたびに保存を行うのでEditor動作が重たいです。

## 大量のオブジェクトが表示されている時 Scene ビューの Gizmos をオフにする
Scene ビュー右上の Gizmos をオフにすると Scene ビューを開いている時の Editor 動作が少し軽くなります。

## sparse checkout を使用して開発する際に必要のないリソースを pull しないようにする
プロジェクトに無くても動作する大量の素材(assetbundleなど)が入っているなどして起動、インポートに時間がかかっている場合はsparse checkoutを使用してリソースの入っていない状態のプロジェクトを用意して作業すると開発が捗ります。

## 自分に合ったEditor拡張を導入、開発して開発効率を上げる
自分がよく行う操作、めんどくさいなと思った操作はEditorを拡張して自動化することにより普段の開発速度を上げる事ができます。

# 最後に
今回は少しでも Editor を軽くして開発効率を上げるために自分が行なっている設定を紹介しました。使えそうな設定があったら是非取り入れてみてください。
ここまで読んでいただききありがとうございました！
Kotlin&AssertJでsuspendな関数をテストする時に気をつけること

# 結論
テスト関数の戻り値がUnitであることを確認すること。

# 何が起きるか
suspendな関数をテストするために、以下のように書くと戻り値がUnitではなくなります。

```kotlin
// No tests found for given includesの発生するコード
internal class FuncTest {
    @Test
    fun test() = runBlocking {
        // ブロック内の最後の式が戻り値と見做されるので
        // test()の戻り値がAbstractIntegerAssertになってしまう
        Assertions.assertThat(2).isEqualTo(2) 
    }
}
```

AssertJではassertの戻り値が[Assertionクラス](https://javadoc.io/doc/org.assertj/assertj-core/latest/org/assertj/core/api/AbstractAssert.html)です。そのためtest()の戻り値が（上記の例では）`AbstractIntegerAssert`になります。
jUnitはテスト関数の戻り値にUnitを期待するため、テスト関数を見つけることができずに`No tests found for given includes`で例外が発生します。

これを解消するにはtest()の返り値がUnitであることを明示する必要があります。
具体的には以下のような方法になります。

```kotlin
internal class FuncTest {
    @Test
    fun test() = runBlocking<Unit> {
        Assertions.assertThat(2).isEqualTo(2)
    }
}
```

```kotlin
internal class FuncTest {
    @Test
    fun test(): Unit = runBlocking {
        Assertions.assertThat(2).isEqualTo(2)
    }
}
```

```kotlin
internal class FuncTest {
    @Test
    fun test() = runBlocking {
        Assertions.assertThat(2).isEqualTo(2)
        Unit
    }
}
```

jUnitの[Assertions](https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Assertions.html)を利用する限りでは戻り値がvoidなのでこのような問題は発生しません。

```kotlin
internal class FuncTest {
    @Test
    fun test() = runBlocking {
        // 返り値がvoidなのでtest()の戻り値もUnitになる
        Assertions.assertEquals(2, 2)
    }
}
```
ABC280回答メモ

0.はじめに
　A～Cがやさしく、Dもそこそこでした。Ｄは解けなかったけど。
　3問正解だとやはりレーティングが下がる感じでした。

1.A - Pawn on a Grid
　Aにしては2次元表を使う感じの問題でした。
　まぁ使わなくても解けそうでしたが
　素直に表に入れて、カウントしてAC

　https://atcoder.jp/contests/abc280/submissions/36959724

2.B - Inverse Prefix Sum
　最初は問題の意味が分からなくて悩みましたが
　回答の数列[i]は、問題の数列[i]-回答の数列[i-1](初期値0)
　でOKと気づき、そのまま実装。
　
　どちらかというと、答えの出力で配列を空白明けで表示する
　ほうにてこずりました。

　https://atcoder.jp/contests/abc280/submissions/36968288

3.C - Extra Character
　C問題にしては簡単すぎるので、どこかに罠があるんだろうなと
　とりあえず、
　1)文字列を頭から比較して差があったアドレスを出力
　　(添え字なので+１する)
　2)最後まで差が無かったら、最後の文字が
　　追加された文字なので、Tのレコード長を出力
　としたら、あっさりACでした。

　https://atcoder.jp/contests/abc280/submissions/36972742

4.D - Factorial and Multiple
　1時間20分残して到達するも、あの手この手を使っても
　ACをとれませんでした。
　終了後、解説を見たら10分で解けたので
　解説を見て分かった気になる感が強い設問でした。

　考え方１
　　Kを2から順に割っていき、1になったら
　　最後に割った数が答え
　　ならなかったら、K自体が答え
　　（途中でK＜割る数になったら、割る数/Kで
　　Kをわる。）
　　→余裕でLTE

　考え方２
　　Kを2から順に割っていき、1になったら
　　最後に割った数が答え
　　（途中でK＜割る数になったら、割る数/Kで
　　Kをわる。）
　　193000000になるまで1にならなかったら、K自体が答え
　　(↑PyPy3でLTEにならない限度)　
　　→RE

　考え方３
　　Kを素因数分解して、約数の最大値が答え
　　→WA

　考え方４
　　Kを素因数分解して、約数×約数の答えの最大値が答え
　　→WA

　考え方５（回答をみて。）　　
　　Kをi（2から～2000000）とKの最大公約数で割っていき
　　Kが1になったら、その時のiが答え
　　20000000まで、1にならなかったら、Kが答え

　どちらかというと、最初に考えていた解き方が
　近かったなーと思いつつ、ACを頂きました。
　

　https://atcoder.jp/contests/abc280/submissions/36997685

以上
かけだしエンジニアリングマネージャーが1on1ミーティングで大切にしていること

HRBrain Advent Calendar 2022 カレンダー2の11日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

## はじめに

こんにちは。株式会社HRBrainでエンジニアリングマネージャーをしている山口です。

2022/08/01に入社してから5か月目、そろそろiDeCoの移管手続きをしようと思う今日この頃、皆様いかがお過ごしでしょうか？

本記事では、15名程度のメンバーと毎週30分ずつ実施している1on1ミーティングでの工夫を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/c701250d-cfb3-c904-5320-f01ab1f0d38c.png)

## 1on1ミーティングで大切にしていること5選

1on1ミーティングに限らないと思いますが、個人的にはいつも5つの観点を大切にしようと心掛けています。

### 1. 議事録を書く

メンバーの成長促進やモチベーションアップを主目的と考えているため、雑談重視で進めることが多いです。

とはいえ、いざという時に前回何を話したのか見返すことができると、ミーティングがスムーズに進むようになるため、メモ程度の議事録は書くようにしています。

### 2. できるだけスキップしない

話すトピックがなかったり他タスクが忙しくてスキップしたくなるときもあると思いますが、できるだけスキップしないように心掛けています。

トピックがないときこそ普段話せないことを引き出すチャンスですし、忙しくてもメンバーのために時間を調整するのもマネージャーの仕事ですよね！

### 3. 相手の気持ちを尊重する

「謙虚（Humility）」「尊敬（Respect）」「信頼（Trust）」のHRT原則に従い、相手の考えや意見を傾聴することが重要だと思っています。

また、自分の意見を主張する際にも、相手を傷つけないよう気をつけることが大切ですね。

### 4. 自分の意見を主張する

相手の気持ちを尊重しながらも、自分の意見をはっきりと主張することも必要です。

自分がどのように考えているか、どういった解決策を提案したいかをはっきりと伝えることで、相手とのやり取りがスムーズに進むようになります。

### 5. アクションプランを整理する

最後に、今後やるべきことやアクションプランを整理します。

今後どのようなアクションを起こすべきか、いつまでにどのようなタスクを完了するべきか、目標達成に向けた課題解決やアドバイスをコーチング形式で実施することが多いです。

## 1on1テンプレート

上記観点を漏れなく実施するために、下記の様なテンプレートを作って利用しています。

毎回全てを埋めることはなく、会話の流れを見ながら省略したりカスタマイズをしています。

途中タスクや目標の進捗状況を確認する項目がありますが、取り組み方をアドバイスするために確認する程度であり、細かい進捗確認はしていません。

```
## アイスブレイク
<!-- 緊張をほぐすために業務に関係のない雑談をする -->

## コンディション
<!-- 体調やモチベーションの確認をする -->
- ☀
- ☁
- ☂

## 前回から進んだこと

### プロジェクトタスク
<!-- 各プロジェクトで担当するタスクの状況について確認をする -->
<!-- 順調なら工夫した点、遅延なら原因を確認する -->
<!-- 順調なら横展開の方法、遅延ならリカバリ案や再発防止策の検討を促す -->

#### タスク名
- ステータス
    - オンスケ
    - 遅延
    - 前倒し
- 理由
- 今後やること

### 目標
<!-- 期初設定した目標進捗について確認をする -->
<!-- 順調なら工夫した点、遅延なら原因を確認する -->
<!-- 順調なら横展開の方法、遅延ならリカバリ案や再発防止策の検討を促す -->

#### 目標テーマ
- ステータス
    - オンスケ
    - 遅延
    - 前倒し
- 理由
- 今後やること

## 良かったこと
<!-- 業務内で良かったことや嬉しかったことがあれば一緒に盛り上がる -->

## 困っていること／気になっていること
<!-- 業務内で困っていることがあれば対応を一緒に考える -->

## 今後やりたいこと
<!-- 技術力強化やキャリアパスの悩みがあれば一緒に考える -->

## その他なんでも
<!-- その他分類しにくいことを話す -->
```

## まとめ

1on1ミーティングで大切にしていることと、利用しているテンプレートを紹介しました。

「他にもこんな点に気をつけるといいよ！」「自分はこんなアジェンダで実施しているよ！」などあれば、ご意見ご感想お待ちしています！

HRBrainでは引き続き仲間を募集しております。最新の募集状況などは下記からご確認ください。

https://www.hrbrain.co.jp/recruit
"GitHub Student Developer Pack"の"Heroku offer"資格を得られない件

## 事の発端
2022年8月25日に、Herokuが無料プランの終了を発表しました。
それまで使用可能だった無料枠が廃止されたことで、11月28日までに有料プランにアップグレードする必要がありました。しかし、この発表の後に学生向けサポートも公開されました。
それが**GitHub Student Developer Packに登録してHeroku offerの資格を得ることで
毎月$13USD相当のクレジットを1年間付与してもらう**というものです。
私のLaravel成果物はHerokuのDBを使用しているため申請して
Herokuを継続利用することにしました。
## 申請
GitHubのアカウントは既にあるので
まずは**GitHub Student Developer Pack**への申し込みを試みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1192794/44343d86-de66-2d6a-fdf9-24bd63f52ec2.png)
学生証のアップロードなどを済ませると、提出完了のメールが送られてきました。
しかし、4時間ほど後に「申請を承認しない」とのメールが届きました。

そこには以下の助言が記載されていました。
・GitHub のユーザープロフィールにフルネームと短い経歴が記入されている場合
認証される可能性が大幅に高くなります。
・GitHub ユーザープロフィールに、画像に表示されているフルネームや短い経歴など
関連する情報をすべて記入しましたか？
<原文>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1192794/44506900-7645-1c93-d112-77b1cb76773e.png)
「short bio」は自己紹介欄の部分だと考えられますが
当時、私のGitHubプロフィールは初期アイコンな上、自己紹介も未記入でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1192794/ab0690c5-b060-4b6a-92f4-ae1a21db969a.png)
この問題に対処すべく、アイコンを自分の顔写真にし経歴の紹介文を書き加えました。
そして、2度目の申請を行いました。

## 2度目の申請結果
残念ながら、再び落ちてしまいました。結果を知らせるメールの文章は
1度目のそれとほぼ同じです。
本当に人が審査しているのかも疑わしくなってきましたが、GitHubによるサポートが必要だと
判断したので、GitHubサポートに問い合わせました。
しかし混み合っているのか、3日経った今日(12/5)でもオペレーターからの返信はないです。

## 申請の送信失敗
念のためにGitHubプロフィールに自己紹介のRead Meを追加し
自己紹介文よりも詳細に経歴を記入しました。
その後に3度目の申請を試みましたが、今度は申請の送信ができなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1192794/f06e9558-7bdd-236c-7480-bbc143b65fb7.png)
送信処理がされず、これが表示されます。
アドバイスは以前と同じまま...。

### 終わりに
私事ですが他に困っている学生がいるかもしれないと思い記事にしました。
まだ解決に至っていませんが原因の解明、続報があれば加筆します。

### 参考文献
https://blog.jnito.com/entry/2022/10/04/104100

https://forest.watch.impress.co.jp/docs/news/1435422.html

https://jp.heroku.com/github-students
Workato：Recipe functionsへ簡単に多くの値を受け渡すテクニック

# はじめに
WorkatoのRecipe functionsで呼び出し元から値を取得する、あるいは呼び出し元に対して値を返す際には、リクエスト（引数）、レスポンス（戻り値）のスキーマ定義が必要となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6aa51be7-32e1-d831-46a4-8ff6696b2253.png)

Recipe functionsに対して受け渡す値が少ない場合は１つ１つスキーマを定義して対応することで問題ありませんが、例えば、以下のような内容を全てRecipe functionsへ渡したい場合、受け渡す値が多いためスキーマ定義が非常に複雑になり、定義の手間がかかります。また、スキーマの数の上限により、そもそも値を受け渡せない問題が生じる場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c9b39563-8ff8-666c-ac7e-1d9b3e850c60.png)


# 対応

JSONテキスト化してRecipe functionsへ渡すことで、上記のような値も手軽にRecipe functionsへ受け渡すことが出来ます。

コネクタの戻り値をJSONへ変換するには、Recipe functionsのフィールドをFormulaモードに切り替えたうえで、Recipe functionsへ渡したいアクションのデータピルをセットし、 `.to_json` メソッドを追加します。このようにすることで、指定されたRecipe functionsへJSONテキストで値を渡すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9a3f3e6a-dfec-b521-a4a5-d179a39dc3c7.png)

値が渡されたRecipe functionsでは、JSON Parser by Workatoコネクタを利用することで、JSONテキストをパースすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e4f5ecb0-3fb2-c9dc-28c6-ed34ee17d086.png)

パースされた結果は、データピルを選択して、各コネクタ（アクション）上で利用することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c72e1f5d-d38f-b992-f22f-2b702dc4d9a6.png)

なお、JSON Parser by WorkatoでJSONをパースする際、スキーマを認識させる（スキーマを自動生成する）ためにSample documentの入力が必要になります。Recipe functionsに値を渡したいコネクタのレスポンスを「Copy JSON」でコピーし、コピーした内容をSample documentへ貼付することで、自動的にスキーマが生成されます。（手動でスキーマを定義したり、Formulaを駆使して対応する必要はありません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b450eda6-36b2-522b-d224-9469ac19418a.png)

以上のテクニックを活用することで、Workatoのレシピ開発を効率的に行えるようになりますので、是非ご活用ください。
令和５年度以降の基本情報技術者試験に合格するために参考書は1冊(キタミ式)のみで充分

curroです。
本年10月に基本情報技術試験に高校生で受験し、合格したのですが、本日初めて令和5年度以降の基本情報技術者試験の概要について目を通しました。

次の試験から制度が変わる、ということはわかっていたのですが、ここまでの変化があったとは思いませんでした。

<h2>午後試験大幅範囲短縮</h2>


僕が注目するのは、午後問題が情報セキュリティ系とプログラミング・アルゴリズム系のみになったことです。これは駆け出しの人にとっては痛い変更かもしれません。しかし、逆にいうと対策がしやすくなったということでもあります。これまではデータベースやストラテジ、マネジメントなど出題されるかどうかすらわからない分野を学習する必要がありましたが、次回からはそれがなくなるのです。


また、情報セキュリティもプログラミング・アルゴリズムに関しては、基礎を抑えるだけで大幅な得点アップを見込めます。それらを重点的にやるだけでいいので、対策はしやすくなります。



これまでの基本情報技術者者試験では、独学で勉強する場合は2,3冊の参考書が必要でした。しかし大幅に午後試験の範囲が縮小された今では、午前試験のみの参考書で充分です。あとは、ネットの解説記事や実際にプログラミングをしたり、あとは<a href="「基本情報技術者試験 科目B試験のサンプル問題」">こちら</a>のようなサンプル問題を解いて力試しをする感じで余裕で合格出来ると思います。



午前試験の参考書はキタミ式の最新のやつを買えば間違い無いです。

<h2>とりあえず俺の記事読めば余裕</h2>

午後問題に関しては、今後このアカウントでも解説を出していきますので、そちらをご覧いただければ合格は堅いでしょう。

以上です。Twitterフォローお願いします。
MariaDBでテーブル削除

# やり方（テーブル存在チェック無し）

```sql
DROP TABLE テーブル名
```

存在しないテーブルを削除しようとすると『1051 Unknown table…』の例外。

# やり方（テーブル存在チェックあり）

```sql
DROP TABLE IF EXISTS テーブル名
```

削除対象テーブルが存在しなくても例外にならない。

# 参考サイトさん

https://www.javadrive.jp/mysql/table/index4.html

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
10.5.4-MariaDB
こんなMR（PR）出しちゃダメなんだZ！！


# [<font color="#333">転職して半年経ちました</font>](#-転職して半年経ちました)

未経験からエンジニア転職して早くも半年が経ちました。
界隈では未経験転職から1年半〜経って転職ドラフトとかで年収アップしてる方が散見されてきましたが私は今の所、全くそんな兆しは見えません。

今回はそんな自分の恥を晒します。
今までに出してきたMR（マージリクエスト）で
先輩エンジニアの方々にご指摘を頂き、先輩の貴重なリソースを奪ってきた数々の
クソコードのうち、選りすぐりの指摘をランキング形式でお届けします！

ちなみにマージリクエスト(MR)やプルリクエスト(PR)というのは自分のコードを
実際に動いている本番環境やその手前のステージング環境に混ぜてもらう為に
権限を持ったエンジニアに確認してもらう事です。

とても大事な行為ですね！
Github使ってるかGitlab使ってるかで呼び方変わりますがやってることは変わりません。

しょーもない事でパイセン達の時間を割かないように是非この記事を反面教師にして気をつけてください！

では早速見ていきましょう！

## 第5位 「ちょ、これ、なくても動くんじゃね？」
最初の方に作ったメソッドが実装していくうちに何故かどこからも呼ばれていなかったり、
変数になんか値を突っ込んでみたけど、その変数結局使わなかったり、デバッグ用にログ出力したりしてそれを消し忘れたりですね。
この様ないらない変数宣言やメソッドがあるとコードの可読性を下げ、自分を含む読み手をただただ混乱に陥れるだけのテロ行為であると認識しましょう。認識します。

## 第4位　「ちょ、ログの出し方適当過ぎじゃね？」

以下、実際に自分が出した無謀なMRの一部です。チーム開発を舐めてる。。。
```sample.rb
Rails.logger.debug "入ってるよDELETEーーーーーーーーーーーーーーーーーーーーーー"
```
いや、いくらデバッグだからって適当過ぎでしょ。
せめて対象のパラメーターとかなんかヒントになるもの出そうぜ！


「コメントだけじゃわからないから対象データもちゃんと渡さないといけなんだ！」と学んだ私は以下のMRも出しました。

```sample.rb
return puts "どれかの処理でエラーが起きました。配列を確認してください。=> #{@res_ary}"
```
すごい！
大量の配列をエラー文に丸投げ！
そしてその中のどれかでエラーが発生したかを探させるという傲慢さ！
「どれかの処理」って軽くクイズ出してんじゃねぇよ！エンジニア辞めちまえ！

以下の様な感じでログ出すと親切ですね。
①エラー内容
②期待される結果
③実際の処理結果
④その後の対応策
これらを配列で返してあげたり。
```sample.rb
err_ary = {
      "エラー内容" => e,
      "期待される結果" => "S3へ#{file_name}を保存",
      "処理結果" => "#{file_name}をS3へ保存できずに処理を終了しました。",
      "対応" => "エラー内容を確認して修正後、もう一度バッチを実行するか直接S3から削除してください"
        }
    @config.logger.error "エラー発生!エラー詳細------->#{err_ary}"
```

## 第3位　「ちょ、変数名、メソッド名センスなくね？」
以下、私の秀逸なメソッド名
```sample.php
public function update_agency_put_db(pamams)
```
updateかputどっちかにしたら？
```sample.rb
def delete_or_update_from_dynamo(params)
```
削除したいの？updateしたいの？笑
何したいのかわからないメソッド名。さすがです。


ちなみにリーダブルコード読了済みです。
読んだ事に満足してしまう愚かな人間。
|　　　　　　　　  　　　　　　　　   　　　　　　　　　　　　　　　　　　　　　　　　　
|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920917/a2a823d3-da28-955f-c244-db8f98da6886.png)


「そのメソッドは一言で表すと何をするのか？」
この答えが「DBからデータ取得してデータをCSVにしてS3に保存して〜〜〜」
みたいに一言で説明できないならクソメソッドです。
できるだけ単一責任にしましょう。
上記で言うなら
「DBからデータを取得するメソッド」
「CSVを生成するメソッド」
「S3に保存するメソッド」
に分けたほうが疎結合となり、バグも発見しやすいし変化にも柔軟に対応できます。

## 第2位　「ちょ、ハードコードやめて？」
ハードコードとはソースコードの中に「固定値」をそのまま書き込むことです。
流石にAWSの認証情報とかはそのまま書き込むことはないですが、定数として設定されてるものや
configで管理されてるものはハードコードせずにちゃんとそちらから使いましょう。
以下に簡単な例を記します。
```gender.rb

class Gender
 MAN = 1
 WOMAN = 2
end

```

```sample.rb
 # NG
 User.where(gender_id: 2)
 # OK
 User.where(gender_id: Gender::WOMAN)
```
新しくプロジェクト入ってきた人からするとgender_idが2って何のことかわかりませんね。
定数使いましょう。
また、既存PJでも自分が分かりずらいと思う部分は変更しても良いと思います。

## 第1位　「ちょ、インデントちゃんとして？」
これはもう、拡張機能とか入れて未然に防げって感じですね。
でも最初は結構やらかしてしまって堂々の一位とさせて頂きました。

これらのご指摘は個人開発しかやってこなくて自分の書いたコードが動く事に喜びを感じて
「とりあえず動けば良し！」という自己満に浸っていた為当然ですね。
同じことを何回も指摘されないように気をつけます。

あとはタイポも結構やりがちなのでVSCodeなら「Code Spell Checker」とか拡張機能使って防ぎましょう！

これからエンジニアになる方の参考に少しでもなればと思います。

少し前の時代ならぶん殴られてるんじゃないかな？と思いますが、皆さん優しく指摘してくださるので良い職場です。
TypeScript 4.9時代の型ガードの書き方

## コード

```typescript
interface B {
    b: string
}
interface A {
    a: B
}

const isB = (arg: unknown): arg is B => {
    return typeof arg === 'object' && arg != null && 'b' in arg && typeof arg.b === 'string'
}

const isA = (arg?: unknown): arg is A => {
    return typeof arg === 'object' && arg != null && 'a' in arg && isB(arg.a)
}
```

# 説明

TypeScirpt4.9から`if ('a' in arg)`と書くことによって、if文内では`arg`が`Record<'a', unknown>`と扱われる機能が追加されました。この機能により、これまで実質的に不可能だった型ガード関数の引数をunknown型にすることが可能となりました。ただし、この機能を使用するためには`arg`が`object`に絞り込まれている必要があり、そのため`typeof arg === 'object'`と`arg != null`が必要になります。
nodenvライブラリをインストールしたはずなのに、nodenvコマンドが使えなかったので解決してみた。[パスを通せば解決。]

<h1>問題</h1>
<h4>・Node.jsライブラリをインストールしたはずなのに、nodenvコマンドが使えない。</h4>

```
#/Users/ユーザ名/Work2
$ nodenv local 14.0.0
-bash: nodenv: command not found
```

<h1>結論</h1>
<h4>・.bashrcファイルのパス設定を書き換えて,nodeコマンドのパスを通せば解決。</h4>

```
#/Users/ユーザ名/
$echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
$source .bashrc
$nodenv local 14.0.0
$node -v
v14.0.0
```

<h1>結論に至るまで</h1>
<h2>予想した原因</h2>
今回の問題の原因があるとすれば、以下の2つだと考えました。
<h6>
<ol>
<ul>・そもそもNode.jsがインストールされていない。</ul>
<ul>・パスの設定がされていない。</ul>
</ol>

というわけでこれらについて調べればエラーを解決できると思ったので早速やっていこうと思います。
</h6>

<h2>計画</h2>
<h6>
<ol>
<ul>・Node.jsがインストールされているのかを確認する。</ul>
<ul>・パスの設定を確認して、パスを通す。</ul>
</ol>
</h6>

<h2>計画実行</h2>
まずはNode.jsがインストールされているのかを確認してみようと思います。<br>
確認する方法がわからなかったので、とりあえず再インストールしようとしてみる。

```
$anyenv install nodenv
$anyenv: /Users/sanadatadashitsuki/.anyenv/envs/nodenv already exists
Reinstallation keeps versions directories
continue with installation? (y/N) N
```
どうやら、Node.jsはしっかりインストールできているようです。

じゃあパスを設定すればいいわけだ。

ただ、パスを設定をすればいいのはわかったけど、どんなコードを書けばいいのかわからない。

・というわけでググってみたところこんな記事を発見した。
[nodeコマンドが使えない場合の対処法](https://programming-jissen.com/way-when-node-command-cannot-be-used/)


この記事を読んで.bashrcファイルか.bash_profileファイルを編集すればいいということがわかった。
ただ、その中のファイルにどんなコードを書けばいいのかがわからなかったので、引き続き調べ物を続けてみると、次のサイトを見つけた。

[【mac】ターミナルでnpmが使えない時の対処法](https://itoringth.com/for-use-npm-at-terminal/)

このサイトで記述されていることを実践してみたらできました。
【emmet】コーディングが段違いに早くなる機能3選


# はじめに

この記事では、コーディングを格段に速くする機能「emmet」ついてご紹介したいと思います。
「emmet」を調べるとチートシートも出てきますが、正直なところどれから覚えるべきなのかが分かりません。

なので今回、「これさえ覚えていれば十分！」というものに的を絞ってご紹介していきます。
新しい知識を一から学ぶときっメンタル的にも労力がかかりますよね・・・。
そんな方の目線に立って具体的に解説していきますので、是非参考にしていただければと思います！

# !（エクスクラメーションマーク）

ド定番の機能かと思いますので、ご存じの方は飛ばしてください！

「!」を入力してtabキーを押下すると、以下のようにHTML5の雛形を自動出力させることができます。
模写コーディングを繰り返す際など、頻出する機能なのでしっかり押さえておきましょう！
```HTML:HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

タグの意味に関しましては、過去に作成したこちらの記事をご参考ください。


https://qiita.com/ninja0408/items/96c516e02f895057e67a


# ()（丸括弧）と 複製

```ul>(li+a)*3```と入力してtabキーを押下すると以下のように変換されます。
```HTML:HTML
<ul>
    <li></li>
    <a href=""></a>
    <li></li>
    <a href=""></a>
    <li></li>
    <a href=""></a>
</ul>
```

:::note info
- 「>」で階層であることを指定
- （）内にグルーピングしたいタグを指定
- 「*」は乗法のことなので続けて数字を入力すれば複製することができる
:::

# 「.」でクラス付与、「#」で ID 付与

コチラはかなり便利な機能。
例えばよく使う```wrapper```というクラスを作成する場合は```div.wrapper```と入力。
IDを作成する場合は```div#header```と入力。
また、```div.wrapper#header```のように続けて入力することも可能。入力後tabキーを押下するとそれぞれ以下のように変換されます。
```HTML:HTML
<!-- クラス -->
<div class="wrapper"></div>

<!-- ID -->
<div id="header"></div>

<!-- クラスとID -->
<div class="wrapper" id="header"></div>
```

# さいごに

今回はHTMLでのemmetについて重要な機能3つをご紹介させていただきました。
CSSでも、同様に役立つ機能がたくさんあるので、また別の記事でご紹介させていただければと思います。

emmetの機能は、模写コーディングなどで頻繁に使用することで身体で覚えられ無意識に使えるようになります。
最初の間は意識して使うようにしましょう。
実践形式で学習する際は、忍者CODEがおすすめです。
無料コンテンツから有料コンテンツまで、学習に効果的な教材が揃っているので是非活用してください！

https://ninjacode.work/


https://koga.ninjacode.site/?ni=q_9


最後まで読んでいただきありがとうございました。