OmniAICreator/Qiita-1.07M huggingface dataset:
Did you install mysqlclient?って聞かれたらどうすればいい？

# 目的
いつも通りDJangoRestframeworkでAPIの作成に励んでいて、ふとしたことから仮想環境をanacondaからvirtualenvに変更しようとして色々とインストールし直していた。その時に事件は起こった。

いつも通り```python manage.py runserver```でローカルサーバーを起動しようとした。
するとこのようなエラーが出てきた。。


```
 File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/contrib/auth/base_user.py", line 48, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/db/models/base.py", line 122, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/db/models/base.py", line 326, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/db/models/options.py", line 207, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/utils/connection.py", line 15, in __getattr__
    return getattr(self._connections[self._alias], item)
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/utils/connection.py", line 62, in __getitem__
    conn = self.create_connection(alias)
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/db/utils.py", line 204, in create_connection
    backend = load_backend(db['ENGINE'])
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/db/utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "/opt/anaconda3/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/Users/Yuto/dev/api_practice/tinder_api/tinder-venv/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 17, in <module>
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
```
。。。！？！？

```
Did you install mysqlclient?
```
mysqlclientはインストール済みニダ。。。。


# 解決策
mysqlclientがないのではなく、pymysqlをインストールする必要があるよう。

```terminal
$ pip install pymysql
```

さらにsettings.pyのある階層の__init__.pyに下記のように記述する。

```__init__.py
import pymysql

pymysql.install_as_MySQLdb()
```

もう一度ローカルサーバーを立ち上げる

```
$ python manage.py runserver
January 12, 2022 - 17:59:32
Django version 3.2, using settings 'tinder_api.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

# 参考
[Error loading MySQLdb Module 'Did you install mysqlclient or MySQL-python?'](https://stackoverflow.com/questions/46902357/error-loading-mysqldb-module-did-you-install-mysqlclient-or-mysql-python)
簡単なDockerファイルを作成したがビルドに失敗する

# 概要

- 超絶簡単なDockerファイルを作成したがビルド時にエラーが出たので問題箇所をまとめる

# やったこと

- 下記のDockerファイルを作成した
    - ファイル名: DockerFile
    - 内容

        ```DockerFile
        FROM centos:7
        RUN yum update -y
        ```

- 当該のファイルが有るディレクトリで下記コマンドを実行してDockerファイルのビルドを試みた。

    ```terminal
    $ docker build .
    ```

- 下記の様なエラーが出た。

    ```
    failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount103727647/Dockerfile: no such file or directory
    ```

# 原因

- Dockerファイルの名前が間違えていた。
    - 誤: DockerFile
    - 正: Dockerfile
- ファイル名を修正してビルドを行ったところ正常にコンテナが立ち上がった。
- ビルド後に`$ docker images`で確認したところちゃんとイメージが作成されていた。

    ```
    REPOSITORY                        TAG                            IMAGE ID       CREATED              SIZE
    <none>                            <none>                         4178759679c0   About a minute ago   493MB
    ```
最新のAndroid StudioでLayout Inspectorのファイル保存を行う。

## li ファイルが保存されない
手元のAndroid Studio（Android Studio 2020.3.1 Patch 4）でレイアウトインスペクタを開いてもファイル保存がされない。
そのため、後から見るということが出来ない。

## Legacy Layout Inspectorを使う
Legacy Layout Inspectorはメニューにはないが、存在自体はしている。
適当なショートカットキーを割り当ててやればLegacy Layout Inspectorが起動し
.liファイルが作成される。

1. File -> Settingsで設定画面を出して、検索窓にlayout inspectorを入力
![Screenshot at 2022-01-19 09-14-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/c13471cf-6ef9-1761-c6be-6e7e5798521c.png)
2. Legacy Layout Inspectorを右クリしてAdd Keyboard Shortcut
3. あとは好みのキーを入れる
4. 入力したショートカットキーで起動させるとファイルが作成される
catkinでprofileの切り替えてclang-tidyをお手軽にかける

# catkinのprofile機能

そもそものモチベーションは`catkin`でビルドしているワークスペースがあり、そこで`clang-tidy`を手軽にかける方法を探していたのですが、catkinにprofile機能というのがあり、それを使えば簡単にできそうだったので紹介します。

`catkin`のprofile機能に関しては、ここに良い記事があるので参照いただければと思います。https://choreonoid.org/ja/manuals/latest/ros/catkin-profile.html 
簡単に言うと、ビルド環境(ビルドオプション、ビルドターゲット、ビルド成果物の場所)等を簡単に切り替えるための機能です。

# サンプル

以下のように例えば3つprofileを用意します。

```bash
catkin config --profile release --install --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo
catkin config --profile debug --install --cmake-args -DCMAKE_BUILD_TYPE=Debug
catkin config --profile clang-tidy --whitelist foo piyo -x _tidy --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_CXX_CLANG_TIDY:STRING="clang-tidy-12;-checks=*"
```

この状態で、

```bash
catkin profile set clang-tidy
catkin build
```
とすると、foo, piyoパッケージだけに`clang-tidy`がかけられます。third_partyのパッケージがワークスペースに入っていても対象から簡単に外せたりするので便利です。

```bash
catkin profile set debug
catkin build
```
でdebugビルドができます。

```bash
catkin build --interleave
```
のように、`--interleave` をつけるとビルド途中が確認できこれも便利です。
Dockerの用語まとめ

# 概要

- Dockerの用語の理解が若干進んできたので忘れないようにまとめておく

# ご注意

- 一部理解に誤りがある可能性があります。

# 用語まとめ

### そもそもDockerって？

- コンテナ技術のコンテナを管理するツールだよ
- Dockerの他にもLinux ContainersとかHyper-Vコンテナとかいろいろあるよ

### コンテナって？

- ものを運ぶコンテナのイメージそのままだよ
- Linux上につくられるよ
    - じゃあなんで自分のMacの上にコンテナつくれるの？
        - Dockerが裏でLinuxを起動させてくれているよ
    - Linux起動しているってなんか重そう
        - そんなに重くないよ、コンテナ建てるためだけの機能しか入ってないLinuxを建ててくれているからね
- アプリケーションを動作させるのに必要なものが原則一個づつ入っているよ
    - 例えばlaravelの開発環境を作りたいなら下記のコンテナが必要だよ
        - PHPのコンテナ
        - DBのコンテナ
        - Webサーバーのコンテナ
- コンテナの中と外は隔たりがあるよ
    - PHPとかDBとかWebサーバーがそれぞれ隔たれた場所にあるとそれぞれの通信がだるそうだよね、でも大丈夫だよ
    - 後から説明するdocker composeが全部解決してくれるから気にしなくていいよ
- Dockerイメージを元に作成するよ（`$ docker run`コマンドを実行するとDockerイメージからコンテナを作成するよ）

### Dockerイメージって？

- コンテナの設計図だよ
- DockerHubから取得するか、Dockerファイルから作るよ（`$ docker build`コマンドを実行するとDockerファイルからDockerコンテナを作成するよ）

### DockerHubって？

- 公式もしくは有志の人が作ってくれたDockerイメージが配布されている場所だよ
- ファミレスのドリンクバーみたいな感じだよ（ジュースがDockerイメージ）
- Dockerのユーザー登録をしておくと無制限にDockerイメージを取得することができるよ、おすすめだよ

### Dockerファイルって？

- Dockerイメージをコード化したものだよ
- DockerHubに自分がほしいイメージがなかった時はDockerファイルを自分で書く必要があるよ

### じゃあ結局メリットってなんなの？

- Dockerファイルやバージョンを指定して公式のDockerイメージを使えば誰でも同じ開発環境構築ができるよ
- そもそもDockerファイルを使えば開発環境構築をコードで管理できるよ
- 人の手があまり入らず開発環境構築ができるから楽だし間違いがないよ、すぐ開発に移れるね、やったね

### コンテナ間の通信ってどうやるの？

- コンテナのIPとポートを指定すればできるよ、でもIP指定はちょっとだるいよね
- docker composeを使って簡単に行うことができるよ

### コンテナが増えてきて管理がだるいんだけど

- それもdocker composeを使えば楽になるよ

### docker compose

- コンテナをまとめて管理できるものだよ
- docker compose用の設計図を書いておけば一つのコマンドでまとめて関連するDockerコンテナを起動することができるよ
- ちょっとだけ書き方は違うけど`$ docker build`とか`$ docker run`とかの命令を記載するよ
- ここまで理解できれば「Dockerなんとなく分かります！」って言っていいのかもね
ダウングレード攻撃 とは

## 勉強前イメージ

なにかのバージョンを下げるっていう攻撃？
そんなことある？

## 調査

### ダウングレード攻撃 とは

SSL/TLSの暗号化通信を行う際に、
わざと脆弱性のある古いSSL/TLSのバージョンを指定したり、弱い暗号化スイートでの通信強制し、
使用することで通信の傍受を行う攻撃を言います。

### ダウングレード攻撃の例

1990年代に、FREAK攻撃というものが有りました。
こちらは非常に弱い暗号化方式(512ビット以下)を悪用した攻撃で
安全性の低い暗号化通信をわざと行うことで通信内容を復号し、傍受します。
基本的な対策としては、脆弱性のあるバージョンを使用しない通信を行うことで上記の攻撃や
今後起こりうる攻撃を未然に防ぐことが出来ます。

## 勉強後イメージ

例が思いつかないけど、わざとTLSじゃなくてSSLを使ったりしてデータを盗むってことかな。
そう考えるとできるだけセキュリティの低いバージョンを許可するわけにいかないなーって思うけど
なかなかアップデートされないクライアントもあるしもどかしいね。

## 参考

- [ダウングレード攻撃](https://appswingby.com/security-glossary/downgrade-attack/)
Firebase + Vue.js/Vue CLI/Vuex/Vuetify でSPAなメモ帳アプリを作ってみた

最近初めて Firebase + Nuxt.js を使ったプロジェクトにアサインしたのですが、
あまりにもちんぷんかんぷん。。。

勉強しなきゃ...と思っていたら最高のタイミングでUdemyのクリスマスセールが始まったので
ここぞとばかりに色々な講座をまとめ買いしました✌️

まずは Vue.js の勉強から！
参考にした講座 → [Vue.js + Firebaseで作るシングルページアプリケーション
](https://www.udemy.com/course/vuejs-firebase/)

## 作ったもの

メモ帳です。
講座ではアドレス帳アプリが作成できますが、少し変えてみました。

* Googleアカウントでログインをすると使えるようになります。
* メモを追加する日の日付が自動で反映されます。
* 追加・編集・削除ができます。講座では物理削除だったのを論理削除に変えています。
* 左上のハンバーガーメニューでログインしているGoogleアカウントの確認と、機能一覧が見れます(まだメモ帳しかありません...)。

こちらから実際に触れます → [my-memo](https://my-memos-19c20.web.app/)
Githubはこちら → [福井のGithub](https://github.com/emika0402/My-MEMO)

![my-memo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664075/d769f74c-21f5-ec12-2282-0d996571ffd3.gif)

## 使用したライブラリやツールなど

### Vue CLI

* コマンドラインでVue.jsの開発環境をセットアップするためのツール
* Vue.jsの開発に必要なツール類を質問に答えるだけでまとめてインストールしてくれるので簡単にVue.jsの環境を構築することができる

### Vuex

* Vue.js上のコンポーネント間のデータ(状態)を管理するためのライブラリ

### Vue Router

* Webページのルーティングを実装してくれる公式のライブラリ
* SPAが構築できる

### Vuetify

* Vue.jsで使用できるマテリアルデザインのUIフレームワーク

## 勉強したこと

* Vue.jsの基礎(構文など)
* ライフサイクルについて
* コンポーネントについて
* Vue CLIによる環境構築の方法
* Vue Routerの設定方法
* Vuetifyの設定方法と構文
* Vuexによる状態管理の方法
* Firebaseの導入方法
* Authenticationを使用したGoogleアカウント認証機能
* Cloud Firestoreを使用したデータベースの機能
* Hostingを使用したアプリケーションの公開

## これからやりたいこと

* その日のタスクを忘れがちなのでTodoリストも追加したい！
* Nuxt.jsの勉強 & アウトプットもしたい！

## 以上...！

これで終わりではなく、Todoリストなども作成したり、使いやすいサイトにどんどん改修していけたらと思ってます。

Vue.js、Firebase以外にも勉強したいことがたくさんありすぎるので、
コツコツ積み上げ頑張りますm(_ _)m
Blazor + Azure ActiveDirectory B2C認証時に'Cannot read property 'toLowerCase' of undefined' エラーが出る件

# 事象
Blazor(WASM) + ASP.Netで作成したアプリをAzure AppSerivceにデプロイし認証をテストしたところ
'Cannot read property 'toLowerCase' of undefined' を吐き出しエラーが発生
ローカルPCでデバッガーで動作したところ問題なく動作

# 環境
.Net6 + VS2022 + AzureAD B2C

```
dotnet new blazorwasm -au IndividualB2C
```
にてテンプレートを作成しました
なお、.Net5でも同様のアプリを作成したことがあり、その時は動作しているので.Net6以降の問題だと思われます

# 現象
AppServiceにデプロイ後アプリを開きログインボタンを押すと
Authentication.razorの

```
@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication

<RemoteAuthenticatorView Action="@Action" /> <----このコントロール

@code{
    [Parameter] public string? Action { get; set; }
}

```

RemoteAuthenticatorViewが'Cannot read property 'toLowerCase' of undefined'
というエラーを吐いているところまで突き止めました。


# 対応策
[ネット](https://github.com/dotnet/aspnetcore/issues/33312)を見てみると同様のエラーで困っている人を発見
だが、Net 6 Preview 4とやや古い環境なので参考になるか？と思いつつ試してみたら治りました。

1. Clientプロジェクト(*.csproj)に

```
	<ItemGroup>
		<TrimmerRootAssembly Include="Microsoft.Authentication.WebAssembly.Msal" />
	</ItemGroup>
```
を追加
2. Clientのbin、objフォルダを一度削除後、再ビルドしデプロイ

英語が得意ではないためなぜ？という部分が不明なのですが、対処療法として記述しました。

いずれ根本的な解決がなされることを期待しています
IPアドレスのメモ

自分用のメモです。

# 【Network】「IPアドレスについて」
- IPアドレスとは「インターネット上の住所」である。

- ネットワーク学習でまず考えるべきこと → 「TCP/IPモデルの何層目の話か？」
IPアドレスはTCP/IPモデルの`「インターネット層（レイヤー3）」`の話。

- IPアドレスは4つに分割される。例：192.168.21.22、116.91.197.177
区切られた4つの値の範囲はそれぞれ0~255の256種類。256は「2の8乗」
→エンジニアとして覚えておくべき数字。

- 「2の8乗」の深掘り。コンピュータの世界で「8」は重要な数字である。
→「8bit = 1byte」
※「2」→ 1bit、「2の2乗」→ 2bit、「2の3乗」→ 3bit・・・「2の8乗」→ 8bit = 1byte。

- IPアドレスは4byte = 32bit 
→ IPアドレス「〇〇〇.〇〇〇.〇〇〇.〇〇〇」の〇〇〇は「2の8乗」種類。
それぞれ「8bit = 1byte」だから合わせて「4byte = 32bit」

- ここまでは「IPアドレス」と表現してきたが、厳密には2種類ある。「IPv4」と「IPv6」
※本記事では「IPv4」を解説

- IPアドレスは誰が持つのか？答えは「機器の中のNIC」
→NICとは「Network Interface Card」の略

### よくある質問①：PCが変わるとIPアドレスも変わるのか？
→結論、変わる。個人PCだと昨日と今日で違うIPアドレスということも起こりうる。

### よくある質問②：1つのコンピュータが複数のIPアドレスを保有できるのか？
→Yes。複数の住所を持つことができる。


# IPアドレスは大きく2種類存在する。しっかり区別することが大切。
- グローバルIPアドレス（WAN = Wide Area Network）

- プライベートIPアドレス（LAN = Local Area Network）

## グローバルIPアドレス（WAN）
- インターネット接続には必須
- インターネット上で一意でなければならない
- 動的である（一般家庭の場合） → 昨日と今日で異なる可能性あり
- ISP（Internet Service Provider）から借りられる。※ISPはフレッツ光など

### よくある質問：IPアドレスは誰が管理しているのか？
- 世界中のIPアドレスを管理している組織は「ICANN」
- アジアのIPアドレスを管理している組織は「APNIC」
- 日本のIPアドレスを管理している組織は「JPNIC」
- IPアドレス管理指定事業者がIPアドレスを管理。 ←ここにお金を払ってIPアドレスをもらう。

## プライベートIPアドレス（LAN）
- 特定の個人間でのみ接続したい場合に使用
- プライベートIPアドレスではインターネットに繋がらない
- 重複OK

※自分のプライベートIPアドレスを知りたい場合
Mac：ターミナルで「ifconfig」と入力
Windows：ターミナルで「ipconfig」と入力


# IPアドレスには「クラス」が存在する

- IPアドレスはクラスA~Eの5つに分かれている
→「ネットワークの規模」を定義している

- ネットワーク規模の大きさはクラス「A<B<C<D<E」の順

- 普段使っているPCはクラスA~Cに属する


- クラスAは大規模なプライベートIPアドレス空間・グローバルIPアドレス空間に使う

- クラスBは中規模なプライベートIPアドレス空間・グローバルIPアドレス空間に使う

- クラスCは小規模なプライベートIPアドレス空間・グローバルIPアドレス空間に使う

- クラスDはテレビ・ケーブルなど

- クラスEは研究者の実験用

- 異なるクラス間でもグローバルIPアドレスであれば通信できる。プライベートIPでは不可

### あれ？IPアドレスは住所では？空間とかおかしくない？
→IPアドレスは都道府県のようなデータを保持している

例：192.168.2.1 → 「東京都渋谷区1-1-1」みたいな感覚
東京都に該当する部分を「ネットワーク部」、それ以降を「ホスト部」と呼ぶイメージ

- 上記IPアドレスのうち「192.168」を「ネットワーク部」、「2.1」を「ホスト部」と呼ぶ
→ネットワーク部とホスト部の区切り位置はクラスによって決まる
→このような表記方法を「クラスフルアドレス」と呼ぶ

# サブネットマスクとは？

- クラスフルアドレスでは分け方が雑。「もう少しIPアドレス空間を細分化したい」という需要に対応。

例：10.3.30.1 → クラスA、クラスAのネットワーク部は8bit、よってネットワーク部は「10」

- 上記IPアドレスを2進数で表すと「00001010.00000010.00001110.00000001」

- サブネットマスクは「11111111.11111111.00000000.00000000」とする
→ネットワーク部は「11111111.11111111」

- サブネットマスクの役割は「1が立っている所までをネットワーク部とする」

- つまり2進数で表したIPアドレスのうち「00001010」がネットワーク部、「00000010」がサブネット部

- サブネットマスクの1の部分とクラス概念で特定したネットワーク部の差分がサブネット部と理解

- これらの話はグローバルIPアドレス、プライベートIPアドレス共通の話

# プライベートアドレスの範囲

- IPアドレスはクラスに分かれている。プライベートアドレスはクラスの中でさらに範囲が限定されている

# 私たちのPCはグローバルIPアドレスを持っていない

- PCではなくルーターがグローバルIPアドレスを持っている

- 私たちのPCがグローバルIPアドレスを持っていたら、セキュリティ面で危険

- グローバルIPアドレスの数は256×256×256×256＝約42億、数が足りない
だからグローバルIPアドレスを借りる。これをNAT（Network Address Translation）という。

・私たちのPCはプライベートIPアドレスを持っている。ルーターを通じて一時的にグローバルIPアドレスを借りることでインターネットに接続できる。


# まとめ

- ネットワーク空間を分けるのは「ルータ」

- ネットワークとはTCP/IPモデルで成り立つ
IPアドレスはレイヤ3の話

- IPアドレスは4byte = 32bit

- IPアドレスを持つのは機器の中のNIC（Network Interface Card）

- IPアドレスにはグローバルIPアドレス（WAN）とプライベートIPアドレス（LAN）が存在

- IPアドレスには「クラス」が存在、A~E
初回git push 時の「src refspec master does not match any」解決法

# エラー内容
新規アプリを作成し、pushした際に以下のエラーが出力された。

```terminal
$ git push
error: src refspec master does not match any
error: failed to push some refs to 'github.com:xxx/xxx.git'
```

２行目が赤文字になっていたため、２行目を中心に調べていると、
- pullしてからmerge
- git pull --rebase

という解決策が出てくる。
これはリモートとローカルでコミットが分かれていて、マージできなくてrejectedされている状態の時のエラーの解決法である。
確かにこのエラーでも
「error: failed to push some refs to 'github.com:xxx/xxx.git'」というエラーが出力されるため、２行目のエラー内容で調べると違うエラーの解決策にヒットしてしまう。



# 解決策
１行目の「error: src refspec master does not match any」で調べてみる。

```terminal
$ git push origin main
```
以前までは「master」ブランチが自動で作成されていたのですが、2020/10以降、新規にレポジトリを作成すると、「main」ブランチが作成されるようだ。

## 参考
https://deepblue-ts.co.jp/git/git-push-error/
`appleboy/ssh-action` でエラー。dial tcp: lookup example.example on 192.0.2.1:53: i/o timeout

# 発生したこと

今まで問題なく動いていたが、以下のような謎のエラーが出た。

```
2022/01/18 22:51:31 dial tcp: lookup example.example on 192.0.2.1:53: read udp 192.0.2.2:37138->192.0.2.1:53: i/o timeout
```

[i/o timeout · Issue #32 · appleboy/ssh-action](https://github.com/appleboy/ssh-action/issues/32)

似たような issue があったが、これは `:22` ポートの話であり少し今回の事象とは異なる。

一応、上記のコメントに従って鍵ファイルを更新してみたが、効果はなかった。

# 解決方法

DNS 周りの問題っぽかったので、ドメイン名で指定していたホスト名を IPアドレスに変更した。とりあえず動くようになった。

```
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USER }}
        key: ${{ secrets.KEY }}
        port: 22
```

根本的な原因はわからないまま。

# 補足

* ドメイン名、 IPアドレスは置き換えています。
Intellij「プロジェクト」ビューの「ファイルを開くを選択」が外部ライブラリで正しくスクロールしない


この、ぴょんととぶやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/ebcfb38a-f6b4-e2f6-f204-be7e5b4d3575.png)

# 解決方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/5a7f9d66-b636-d4ec-09b3-97bc33156278.png)

`#com.intellij.ui.tree.AbstractTreeNodeVisitor:trace` を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/2b66592b-5a11-cd0d-4481-db3850e44106.png)
VBA ドライブレターから、URN（共有名）を返す

#ありそうでない
Excelは割当ドライブだとF2でEnterしてもリンクしない？書き換える必要があるみたいなので作りました。
本当はFSOだけでもいいのかもしれない。
関数名ですがドライブレターというと1文字だが、大文字英語とコロンの2文字入れて2文字返すことになるので、ちょっと関数名があっていない。

#コード

```vb
Function DriveLetterToURN(str As String) As String
' X: の形でいれてください
' https://atmarkit.itmedia.co.jp/ait/articles/0802/20/news136_2.html
  Dim fso As Object   ' Scripting.FileSystemObject
  Dim drv As Object   ' Scripting.Drive
  Dim drvs As Object
  Dim n As Long
  Dim objWshNetwork
  Set objWshNetwork = CreateObject("WScript.Network")
  Dim objDrives As Object
  Dim i As Long
  Set objDrives = objWshNetwork.EnumNetworkDrives
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set drvs = fso.Drives
  For Each drv In drvs
  If str = drv.Path Then
    For i = 0 To objDrives.Count - 1 Step 2
    If drv.Path = objDrives(i) Then
     DriveLetterToURN = objDrives(i + 1)
     Exit Function
    End If
    Next
   End If
  Next
  DriveLetterToURN = str
End Function
```
【JS】undefinedについてまとめみた！ 

## `undefined`とは
`undefiend`は、「未定義」である事を示す値です。

## `undefined`になるケース
以下が`undefined`になるケースです。
- 初期化されていない変数の値
- オブジェクトに指定されていないキーの呼び出し
- 関数の`return`を書かなかった場合の戻り値
- 引数のある関数を呼び出すときに引数を与えなかった場合の値

以下がコードになります。
Javascriptを実行出来る環境で試してみてください！！


``` js
// 初期化されていない変数の値
let testUndefined;
console.log(testUndefined); // undefined

// オブジェクトに指定されていないキーの呼び出し
const test = {};
console.log(test.name); // undefined

// 関数の`return`を書かなかった場合の戻り値
function testFunc() {}
console.log(testFunc()); // undefined

// 引数のある関数を呼び出すときに引数を与えなかった場合の値
function emptyFunc(param) {
  console.log(param); // undefined
}

// 引数になにも与えない
emptyFunc();
```

## `undefined`と`null`は似ているが同じではない

### 同じであるケース
- 真偽値で判断するときは、両方`false`である
- プロパティを呼び出そうとするとエラーになる

### 同じでないケース
- 厳密等価演算子で比較すると`false`になる


``` js
// falseになる
console.log(undefined === null); // false

// 厳密でない場合は、trueになる
console.log(undefined == null); // true

```


## 最後に
プログラムを書く際は、`undefined`や`null`はバグの原因になるので、無闇に増やさないようにしましょう！！


先日購入した以下の本を参考にさせて戴きました！
[ステップアップ javascript](https://www.shoeisha.co.jp/book/detail/9784798169835)
物事を体系的に学ぶことで鬱病になった

僕は某海外の激安オンライン学位を取って就職をした機械学習エンジニアだ。就職をしてからは、独学ではじパタ、カステラ本、PRML、赤本、Goodfellowの深層学習、sklearn+tensorflow本などをはじめとする基礎を半年ぐらいかけて学んだ。

ある日、山田先輩がこんなことをいってきた。

山田先輩「君は仕事はできるみたいだが、物事を体系的に学んでないことがバレバレだぞ。体系的に学べ。」

体系的にってどういうことを意味してるんだろう...

僕「体系的に学ぶ際の必読書はありますか？」

山田先輩「そうだなあ、基礎から学ぶならはじパタ、もっと応用的なことならPRML、統計の基礎なら赤本かなぁ」

全部僕が勉強してきたことじゃないか。

僕「それ、入社してからすぐに学んだ内容ですよ。」

山田先輩「は？うるせぇよ。お前は体系性が足りねぇから5周ぐらい読んどけバカ。あと測度論も忘れずに勉強しとけよ。」

それから、しばらくかけてはじパタ、PRML、赤本を5周、ノートを書きながら学び、測度論の基礎としていくつかの書籍を学んだ。

僕「先輩、この前はご指導ありがとうございました。体系的に学ぶために5周学んで、測度論もちゃんと勉強しておきました。」

山田先輩「君みたいな低学歴なアスペが何をどれだけ学んでも無意味だよ。人は学歴で体系的に学んだかどうか評価される。君ごときが独学しても何の意味もない。」

こう言われてから僕は体調を崩し、なにもかもやる気をなくしてしまった。心療内科に行ったら鬱病だと診断された。現在の僕のの精神状態だと、入院治療が妥当らしいので、入院した。

この記事は、入院中に外泊できるようになったので書いている。
【備忘録】Big O notationについて勉強した

# Big O notation

就活のためアルゴリズムやデータ構造の勉強を改めてやることにしました。今回 Big O 記法の勉強したのでそのまとめ。

## まず、良いコードとは？

1. Readable
2. Scalable (Speed of runtime, Memory) -> Big O で測れる

コードを実行する際、それを実行するコンピューターの性能に依存するのではなく、プログラムそのものの性能を図るための指標として用いられる記法のこと。

Speed of runtime: インプット量が増える度に実行時間が比例してどのくらい増えるか(オペレーションの数が増えるか)

以下のチャートで、インプット数とオペレーションの数の関係がまとめられている。
プログラムを書く時、なるだけ Excellent になる Time Complexity を目指すべし。

![Screen Shot 2022-01-17 at 21.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2137239/0b8353bb-b48f-2a60-55fa-788a2fb76bff.png)

### 基本

# O(n) - Linear Time

インプットが増えるに伴い、オペレーションの数も比例して増える。

```js
const arr = ['apple', 'banana', 'peach'];

function findApple(array) {
  for (let i = 0; i < array.length; i++) {
    if (array[i] === 'apple') {
      console.log('Found Apple!');
      // break ->見つけた時点で抜け出せるけど、最悪は最後までループするのでそのケースを想定
    }
  }
}

findApple(arr); // O(n)   --> Linear Time
```

# O(1) - Constant Time

インプットが増えてもオペレーションの数は変わらない。必ず2回のオペレーションステップでい続けるので、グラフの場合線は並行である続ける。

```js
const boxes = [0, 1, 2, 3, 4, 5];
function logFirstTwoBoxes(boxes) {
  console.log(boxes[0]); //O(1)
  console.log(boxes[1]); //O(1)
}

logFirstTwoBoxes(boxes); // O(2) everytime  -> O(1)
```

# O(n^2) - Quadratic Time

ネストループ

```js
// O(n^2)
const nums = ['a', 'b', 'c', 'd', 'e'];
function logAllPairsOfArray(array) {
  for (let i = 0; i < array.length; i++) {
    for (let j = 0; j < array.length; j++) {
      console.log(array[i], array[j]);
    }
  }
}
```

Time Complexity を計算する上でのルールがある。
# BIG O ルール

1. Worst Case

   （例：ループだと、一致するものを途中で見つける可能性もあるが、最悪のケース、毎回最後までループしなければいけないケースを想定する）

2. Remove Constant

   (例：2n+ 100) -> O(n)となる。 より多くのインプット量を想定したとき、誤差の範囲内になる)

3. Different terms of input

   (例:input が複数の場合。O(a + b) or O(a\*b)と、Big O もそれぞれ用意。

   -> same indentation-> add

   -> anything different -> multiply というのが簡単な計算方法。

4. Drop Non Dominants
   (2 と同じ考え方)
　


# まとめ　

### O(1) Constant  
 - ループなし　

### O(log N) Logarithmic 
 - 通常は、Binary SearchなどのSearching AlgorithmsがO(log N) (ソートされてる前提)

### O(n) Linear 
  - n回for loopやwhile loopsを行う


### O(n log(n)) Log Linear 
  - 大抵はSorting operation 
  
### O(n^2) - Quadratic  
  - コレクション内のすべての要素を比較する、 two nested loops
  
### O(2^n)  - Exponential   
-  Nサイズの問題を解決するrecursive algorithm

### O(n!) - Factorial 
  
 - すべての要素にループを追加


　実行時間だけではなく、メモリの使用量もBig O で測ることができる。
# Space Complexity

2 ways of storing memory　

Heap: store variables that are assigned　

stack: function calls


 # 参考
 
こちらのUdemyで勉強しています。　
 [Master the Coding Interview: Data Structures and Algorithm]( https://www.udemy.com/share/1013ja3@W8XGDO56O8zRLoDZCszjF3YnWtroSjf5XnzM7yfIV1b9frelgPz3U-w2U6ZwX-apyg==/x)

グラフの参考はこちらのサイトです。　
[Big-O Cheat Sheet](https://www.bigocheatsheet.com/)
インフラ リモデSHELL




初期動作設定のシェルを以下に記載

sudo vi Centos7.sh

```
#通信許可設定
sudo yum groups install "GNOME Desktop"
sudo yum install -y xrdp tigervnc-server
sudo systemctl start xrdp.service
sudo systemctl enable xrdp.service
sudo systemctl set-default graphical.target

#リモートデスクトップでの接続に使用するTCP「3389」番ポートを開放します。
sudo systemctl status firewalld
sudo firewall-cmd --permanent --zone=public --add-port=3389/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

#ネットワーク関連なければ
sudo yum install net-tools

#アップデート
sudo yum update

```

sudo chmod u+x Centos7.sh
./Centos7.sh


```
次にGoogle Chromeリポジトリを追加するので下記のコマンドでrepoファイルを新規作成する。
作成したrepoファイルに下記のリポジトリ情報をコピーして貼り付ける。

  
sudo vi /etc/yum.repos.d/google-chrome.repo

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub


#CentOS 7にyumコマンドでGoogle Chromeをインストール
sudo yum install -y google-chrome-stable

#SElinuxを永続的に無効化（enforcingをdisabledに変更）
vi /etc/selinux/config
SELINUX=disabled

#日本語入力ができない場合は以下の設定を追加することで解決できるはず。
※Google Cloud Platform上のCentOS7では以下で解消できました

vi ~/.bashrc
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
exec ibus-daemon -dx &

左上アプリケーション＞システムツール＞設定＞地域と言語＞入力ソース
おそらくここに「日本語(かな漢字)」がないのではないでしょうか？
ただの「日本語」ではなく「日本語(かな漢字)」です。
「日本語」に加えて「日本語(かな漢字)」を追加してください。

```


リモートデスクトップサーバでを「epel」リポジトリを使用し用意する

```
 (Centos7)
sudo yum install -y epel-release
sudo yum install --enablerepo=epel xrdp

 (Centos8)
sudo dnf -y install xrdp tigervnc-server
sudo dnf install epel-release
dnf -y install langpacks-ja
localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf
echo $LANG
vi ~/.bash_profile
LANG=ja_JP.UTF-8
export LANG
source ~/.bash_profile
echo $LANG


(Centos8以降)
#GUIデスクトップインストール
dnf -y group install "Server with GUI"
dnf install epel-release
dnf -y install xrdp tigervnc-server
systemctl start xrdp.service
systemctl enable xrdp.service
systemctl set-default graphical.target
systemctl status firewalld


#日本語環境インストール
dnf -y install ibus-kkc

#通信許可設定
リモートデスクトップでの接続に使用するTCP「3389」番ポートを開放します。(Centos7/8共通)
systemctl start xrdp.service
systemctl enable xrdp.service
systemctl set-default graphical.target
systemctl status firewalld
firewall-cmd --permanent --zone=public --add-port=3389/tcp

#追加で HTTP(80/tcp) と HTTPS(443/tcp) を許可しておきます(Centos7/8共通)
firewall-cmd --permanent --zone=public --add-port=3389/tcp
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

#cockpit と dhcpv6-client を使わない場合は、削除しておきましょう。 (Centos9のみ)
firewall-cmd --remove-service=cockpit --permanent
firewall-cmd --remove-service=dhcpv6-client --permanent


```
2022/1/19主にITとかセキュリティの記事

2021年の上場関連企業の個人情報事故は137件 - TSRまとめ
https://www.security-next.com/133339

パーソナルデータ、4割弱が利用目的に関わらず「提供したくない」
https://www.security-next.com/133277

オーガニック食品の通販サイトに不正アクセス - クレカ情報が流出
https://www.security-next.com/133335

JPCERT/CCが「侵入型ランサムウェア攻撃を受けたら読むFAQ」公開、相談窓口や初動対応の「3つの方針」など示す(1/17)
https://internet.watch.impress.co.jp/docs/news/1380952.html

タイ財務省国税局のTwitterアカウントが乗っ取り被害(1/17)
https://www.thaich.net/news/20220116ou.htm

[FT]米情報機関にデータ提供か　デンマーク元国防相起訴(1/17)
https://www.nikkei.com/article/DGXZQOCB170RY0X10C22A1000000/

ニューヨークでジオフェンス令状とキーワード検索令状を禁止する法案への支持が高まる(1/17)
https://jp.techcrunch.com/2022/01/17/2022-01-13-new-york-geofence-keyword-search-warrants-bill/

ブロックチェーンは金融をどのように変えるのか
https://hedge.guide/cryptocurrency/guide/blockchain-can-change-finance

コア ウェブ バイタルの3指標はどれも薄っぺらいと思うのだが ―― ウェブとCWVの現状【第2部】(1/17)
https://webtan.impress.co.jp/e/2022/01/17/42180

JPCERT/CC、侵入型ランサムウェア攻撃を受けたら読むFAQを公開(1/17)
https://securityinsight.jp/news/13-inbrief/4886-220117-1

中国、国家支援の独自NFT産業を創出へ(1/16)
https://zuuonline.com/archives/235737

1月のWindows Update適用したWindows Serverで再起動の問題発生(1/17)
https://gunosy.com/articles/etj7S

「Firefox 96.0.1」がリリース ～先日発生したHTTP3接続の不具合に対策(1/17)
https://forest.watch.impress.co.jp/docs/news/1380869.html

米国では「Log4j」脆弱性の放置に法的措置も　攻撃に引き続き警戒を呼び掛け(1/17)
https://news.yahoo.co.jp/articles/15b27f74f79f682acfdbd411c96f573ab462b269

数百万台のルータに影響する脆弱性、SentinelLabsの研究者が指摘(1/17)
https://news.infoseek.co.jp/article/mynavi_2354269/?tpgnr=it

ラック、業務データの社外流出を公表--原因は元社員のルール違反(1/17)
https://japan.zdnet.com/article/35182127/

「非デスクワーカー向けSaaS」が今アツい？　「数年前まで無風だった」──CEOが語る背景(1/17)
https://news.yahoo.co.jp/articles/5e4ce890ae3867213320ac3ab3189d0e19717628

Twitterのセキュリティキー実装の概要(1/16)
https://www.infoq.com/jp/news/2022/01/twitter-security-keys/

ブラッド・ピットと連絡を取り合っていますが、本人ではないのでしょうか？被害に遭わないために必要なこと(1/16)
https://news.yahoo.co.jp/byline/tadafumiaki/20220116-00277623

SHIBチームがCoinMarketCapに掲載されたアドレスについて警告(1/17)
https://nextmoney.jp/?p=47536

デジタルアーツ、マルウェアに悪用されるファイル共有サービスについてのセキュリティーレポートを公開。「Discord」と「OneDrive」が突出して悪用(1/17)
https://news.yahoo.co.jp/articles/2cadf42745e31e9cb0b5dacd6efbbd0024b60aac

ヘルスケアサイバーセキュリティ市場―脅威別（マルウェア、ランサムウェア、分散型サービス拒否[DDoS]など）、セキュリティ別、ソリューション別、エンドユーザー別-世界の需要分析と機会の見通し2027年(1/17)
https://www.jiji.com/sp/article?k=000002807.000059861&g=prt

[FT]UAE、資金洗浄対策に懸命　監視リスト入りを警戒(1/17)
https://www.nikkei.com/article/DGXZQOCB173860X10C22A1000000/

モジラとマークアップ、ユーザー追跡するFacebookの監視へ ： 要点まとめ(1/17)
https://digiday.jp/publishers/the-rundown-the-markup-and-mozilla-will-track-facebook-tracking-its-opted-in-users/

「デキる責任者」と「ダメな責任者」…考え方の決定的な違い(1/16)
https://news.livedoor.com/lite/article_detail/21519744/

「これで終わりじゃない」金融庁に緊張感　システム障害収束のめど立たず(1/17)
https://www.sankeibiz.jp/article/20220117-6RY4HGWYCJKO5BL2GI74OJQVUA/

11社のECサイトから顧客情報漏洩　最大43万件、新手の攻撃が対策をすり抜け　ジーアール(1/18)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/011200099/

旭山動物園や日本機械学会が利用する決済サービスで「セキュリティー上の懸念」(1/18)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/121500148/
Javaでデータベースに接続する

# はじめに
この記事は独習JSP＆サーブレット第３版に基づいて、データベースを勉強していた際に躓いた点をまとめた記事です。最新版のJDBCやデータベースを使用している人は、同じようなエラーで躓いていると思うので参考になれば嬉しいです。

## 環境
- Tomcat 10.0
- MySQL 8.0
- MySQLドライバ(JDBC)：mysql-connector-java-8.0.27

## jspからデーターベースに接続する

以下のようにconnect.jspファイルからデータベースに接続するとする。
データソースの設定はcontext.xmlで行う。

```jsp:connect.jsp
<%@ page contentType="text/html;charset=UTF-8"
    import="java.sql.*, javax.naming.*, javax.sql.*" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>データベースへの接続</title>
</head>
<body>
<%
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/database_name");
Connection db = ds.getConnection();
db.close();
%>
データベースへの接続に成功しました。
</body>
</html>
```

```xml:context.xml
<?xml version="1.0" encoding="UTF-8"?>
    <Context reloadable="true">
        <Resource name="jdbc/database_name" auth="Container" type="javax.sql.DataSource" 
        driverClassName="com.mysql.cj.jdbc.Driver" 
        url="jdbc:mysql://localhost/database_name?serverTimezone=JST" 
        username="user_name" password="password" maxTotal="4" maxWaitMillis="5000"
         maxIdle="2" validationQuery="SELECT count(*) FROM book">
         </Resource>
    </Context>

```
Connector/JというMySQL用のJDBC Driverのバージョンが8.0.23以上を用いている人は次のようなエラーが発生していると思う。

```
Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: JST
```
解決方法はcontext.xmlのタグ\<Rerouce\>にあるurlを以下のように変更すればいい。

```
url="jdbc:mysql://localhost/database_name"
```

## データベースにアクセスできるユーザーの設定方法
database_nameというデータベースにアクセスするためのアカウントを新規作成する.

```
mysql> CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password';
```
ユーザー名とパスワード以外にもlocalhostの部分も入力しないといけないので注意。
このアカウントに権限を与えるためには、GRANT命令を使う。

```
mysql> GRANT ALL ON database_name.* TO 'user_name'@'localhost';
```
ここでもlocalhostを忘れずに入力しないと次のようなエラーが発生する。

```
ERROR 1410 (42000): You are not allowed to create a user with GRANT
```
# おわりに
勉強する際は、最新版をインストールすると躓く。
組込み系エンジニアがWeb系に転職してからの1年間を振り返ってみた


どうも Toda Masaoです。

独立系Sier企業で5年6ヶ月エンジニアをさせて頂いていた僕(当時27歳)ですが、
2020年12月にWebエンジニアに転職し、1年が経過しました。

個人的に試行錯誤した1年になったので、時系列でその活動を記事にしてみようと思います。

既にエンジニアされていて、これからWebエンジニアへの転職を考えている方の参考になればと思います。

#目次
[1.入社3ヶ月目まで](#入社3ヶ月目まで)
[2.入社8ヶ月目まで](#入社8ヶ月目まで)
[3.入社13ヶ月 現在](#入社13ヶ月-現在)
[4.最後に](#最後に)
[5.転職活動時の記事](#転職活動時の記事)

#入社3ヶ月目まで
入社してから3ヶ月くらいは、既存システムの改善や小規模な機能追加を担当させて頂きました。


<h4>◎現場とのフィット感はどうだったか</h4>
まず、入社した前に一番気にしていた点が**「技術的に付いていけるのか」**でした。

というのも、ジョインさせて頂いたプロダクトが RubyOnRails案件で
過去実務経験が無い言語でした。

転職時に独学でポートフォリオを作成したとはいえ、
独学で扱った技術と現場の技術レベルに雲泥の差があることは
前職(Sier)の経験から分かっていました。

なので、大丈夫か気にしていたのですが**「問題無かった」**です。

　▼前職　：独自言語だったので、不明点をネット検索してもヒットしない。ロジックを把握するにはコードから読むしか無い。

　▼入社後：不明点検索すればドキュメントがヒットする。標準APIが充実していることで、極端に複雑な計算ロジックが存在しない。

という開発環境の差があり、1ヶ月ほどコードリーディングした感触としては、
言語的な難易度はそこまで高くないな感じたのが正直なところでした。

前職が独自言語でイメージしづらいかもしれませんが、
**ある程度複雑なロジックを用いたシステム開発の経験がある方であれば、
同じような状況になるのかなと思います。**

ちなみに前職では、処理中の処理割り込み発生要因が10個とかあるようなシステムで、
割り込みを全ケースケアしなければならないようなシステムでした。

極端に複雑なロジックとは、これくらいの複雑性を持った処理をイメージしています。


<h4>◎ひたすらコードを触る毎日</h4>
自分で言うのもあれですが、僕自身そこまで頭が良くないです。

よって、普通にやっているだけでは並で終わってしまうと思ったので、
**「休日とかも開発して、コードと仕様に慣れる」**ということをしました。

休日に雇用者から業務命令があってやっていたとかだとアウトですが、
完全に自主的かつ趣味でやっていた感じです。

確かに習得早く見えるけど、そんだけやればそりゃそうなるよね。みたいな量やってました。
当然上司目線は習得早いようにしか見えないので、評価良かったかなという感じでした。

一人で開発時間積むだけでも、自身の持つ母言語の技術レベルの水準までスキル引き上げることができました。

**新卒で初めて開発現場に入った時など、
フォローを受けながらじゃないと技術向上しづらい期間がありましたが、
その時期を超えた経験者であればフォロー必要無くなるんだな。**
というのが気づきでした。


#入社8ヶ月目まで
不具合を改修したり、お客様からの問合せ対応をしていました。
そして傍らで新規機能の開発したりしていました。

この頃には、おおよそフルスタックと呼ばれる業務範囲になっていて、
仕様を詰めたりテストまでを対応させていただくようになってました。

前職では、GitHubやAWSに親しみがなかったのですが、
操作にも大分慣れたかなという感じでした。

<h4>◎難易度の高い作業をどう取るか悩む</h4>
この頃は、ギアの上げどころを探していました。

というのも、前職は大きなプロダクトでした。
要件定義から結合テストまでを専門業務で行っていたこともあり、
現プロダクトの開発フェーズのどこをとっても難易度の高い作業ができるだろうと思っていました。

どの領域で全開のスキルを出して、評価上げにいこうかというのを日々考えていました。

※ちなみに手を抜いていたとかでは当然無く、難易度の高い作業をどこで対応して、
 どう見せていこうかというのを考えていたという意味です。

結果的に受動的な形になりましたが、
従来先輩が対応していた高難易度の不具合対応が舞い込んできたので、
自身で巻き取って改修して全開出すこととなりました。

ここで伝えたいのは、**この頃には上を狙うだけの余裕が少し生まれていて、
通常業務であれば普通にこなせる状態になっていたということです。**

<h4>◎余談</h4>
入社4ヶ月目くらいでエンジニアとしての情報発信用のTwitterを始めました。
半年くらいでフォロワー1000人超えました。
やれば意外と伸びるんだなと思いました。

[ちなみにアカウントはこちら](https://twitter.com/todamasao1)

#入社13ヶ月-現在
**気づけば開発課の責任者になりました。(本筋とずれるので経緯は割愛)**

何をやっているかというと、開発に必要なこと大体全部やっています笑

開発管理、仕様検討、レビュー、実装、レクチャー、採用・・・etc

全開のスキルの出しどころを探していたという旨を前述しましたが、
今どの分野に対しても今までのスキルフル活用で作業させて頂いています。(当然ですが)

基本過去に専門で業務していた内容(採用は除く)をマルチにこなしているという感じで、
組み込みエンジニア時代に培った経験が活きているという実感が非常に強いです。

至らぬ点は多々ありますが、
**組み込み→WEB業界をシフトしてもスキルが通用した。ということだと思っています。**

なにかの参考になれば幸いです。

#最後に
エンジニアとして業界をシフトするという決断が、自分の中で勇気の入るものだったので、
事例を紹介できればと思い今回記事にさせて頂きました。

業界を変えるかどうか迷っている方の参考になれば幸いです。

拙い文章最後までお読み頂き有難うございました。


#転職活動時の記事
以下Web系エンジニアになる際の転職活動について記事にしています。
良ければ読んでみてください。

[SierエンジニアがWeb系エンジニアに転職する為にやったこと](https://qiita.com/todamasao1/items/2faa63f9f83584463753)
簡単な対話bot作ってみた

#はじめに
この記事は、[SLP KBIT AdventCalendar2021]( https://adventar.org/calendars/6706 "AdventCalendar2021") 21日目の記事です。(物凄く遅れました…）
Python学習のチュートリアルとして簡単な対話botを作りました。
（といっても会話が支離滅裂なので期待しているようなbotではありません）

#目次
・環境
・コードの解説
・実行結果
・おわりに

##環境
Python 3.9.7
Spyder

#コードの解説
responder.pyはユーザーの入力した文字列に対して反応を示すためのプログラムです。あらかじめユーザーに返すフレーズをリストにまとめて置き、それをランダムに出力することで会話をしているように見せています。

```responder.py
import random

class Responder(object):

    def __init__(self, name):
        self.name = name

    def response(self, input):
        return ''

class RepeatResponder(Responder):
    # オウム返しのためのサブクラス
    def response(self, input):
        return '{}ってなに？'.format(input)

class RandomResponder(Responder):
    #ランダムな応答のためのサブクラス
    def __init__(self, name):
        super().__init__(name)
        self.responses = ['おなかすいた', 'ねむい', 'ご飯作って',
                          '元気だねー', 'いい天気だね', 'お疲れ様ー']
    def response(self, input):
        return (random.choice(self.responses))

```



```pityna.py
import responder

class Pityna(object):
    #本体クラス
    def __init__(self, name):
        self.name = name
        self.responder = responder.RandomResponder('Random')

    def dialogue(self, input):
        #response()を呼び出して入力した文字列を取得
        return self.responder.response(input)

    def get_responder_name(self):
        # responderに格納されているオブジェクト名を戻り値にする
        return self.responder.name

    def get_name(self):
        return self.name

```



##実行結果
実行してみると下の様な会話をすることができました。しかし、会話をしているように見えてもリストからランダムにフレーズを取り出しているだけなのでぎこちないですね。
![会話の様子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350040/70246c1b-6fff-7882-6470-1cc306a7dcd8.png)

#おわりに
作業中にエラーが大量発生したことでなかなか進みませんでした…
今回はbotとの会話が少しぎこちない状態で終わりましたが、この後も本を読み進めながら学習をして会話がちゃんと成立するぐらいのbotを作りたいと思います。
最後まで記事を見ていただきありがとうございました。


参考にした本
・金城　俊哉『Pythonプログラミングパーフェクトマスター』(秀和システム、2020)
画像ギャラリーに使う画像を拡大させる方法


lightboxを使うと簡単にポップアップ表示できます。

まず、lightboxのサイトでファイルをダウンロードします。

参考にした記事

https://github.com/lokesh/lightbox2/releases

ファイルを解凍してファイルのdistファイル内のcssとjsの中身を
index.html用のcssファイルとjsファイルに移します。

```html:index.html
<head>内に読み込む
<link rel="stylesheet" href="css/lightbox.min.css">
```
```html:index.html
</body>前に読み込む
<script src="js/lightbox.min.js"></script>
```
最後にポップアップ画像のコードを書きます。

```html:index.html
<a href="https://haniwaman.com/cms/wp-content/uploads/2018/02/cat.jpg" 
data-lightbox="demo">画像文字を書き込む</a>
```
参考にした記事

https://haniwaman.com/lightbox/
kindでEphemeral Containerを有効にする

# はじめに
kind環境でEphemeral Containerがエラーで利用できなかったため対応をまとめました。

## 環境
* kind: v0.11.1 go1.17.2 darwin/arm64
* kubernetes(Server): v1.21.1

# 事象内容
以下コマンドを実行しようとしたところ以下のエラーが発生しました。

```:
% kubectl debug sample-pod --image=amsy810/tools:v2.0 -it -- bash
Defaulting debug container name to debugger-wwzx2.
error: ephemeral containers are disabled for this cluster (error from server: "the server could not find the requested resource").
``` 

# 対応

エラーの内容は「ephemeral containersが有効になっていない」とのことなので [kubernetes公式](https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/) を確認したところ、確かに今回のkubernetes v.1.21.1ではデフォルトは無効であることが判明。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/699dc115-3bbf-bb6e-2bdd-0af935638937.png)

[kind公式のFeatureGatesの項](https://kind.sigs.k8s.io/docs/user/configuration/#feature-gates) に記載がある通り、以下の様にkind.yamlを修正。

```yaml:kind.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:                #追加 
  EphemeralContainers: true  #追加 
nodes:
- role: control-plane
- role: worker
- role: worker
```

修正したkind.yamlでkindクラスタを起動し直した後、コマンドがエラーなく実行できることを確認しました。

```:
% kubectl debug sample-pod --image=amsy810/tools:v2.0 -it -- bash
Defaulting debug container name to debugger-tttn5.
If you don't see a command prompt, try pressing enter.
root@sample-pod:/#
```

# おわりに
他のFeature Gatesの機能をkindで有効にする場合も同じように記載すればよさそうです。

---
# 追記(2022/01/19)
クラスタのバージョンを上げれば良いとのコメントをいただき試してみました。
kind.confのノード定義にimageを追加して対応バージョン(1.23.0)を指定します。

```yaml:kind.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
# featureGates:                #コメントアウト or 行削除
#   EphemeralContainers: true  #コメントアウト or 行削除 
nodes:
- role: control-plane
  image: kindest/node:v1.23.0@sha256:49824ab1727c04e56a21a5d8372a402fcd32ea51ac96a2706a12af38934f81ac
- role: worker
  image: kindest/node:v1.23.0@sha256:49824ab1727c04e56a21a5d8372a402fcd32ea51ac96a2706a12af38934f81ac
- role: worker
  image: kindest/node:v1.23.0@sha256:49824ab1727c04e56a21a5d8372a402fcd32ea51ac96a2706a12af38934f81ac
```

ノードが1.23.0で起動していることを確認。

```shell:
% kubectl get nodes         
NAME                        STATUS   ROLES                  AGE   VERSION
kindcluster-control-plane   Ready    control-plane,master   12m   v1.23.0
kindcluster-worker          Ready    <none>                 12m   v1.23.0
kindcluster-worker2         Ready    <none>                 12m   v1.23.0
```

この環境でkubectl debugコマンドをエラーなく実行でき、Ephemeral Containerが利用できることを確認しました。


@superbrothers さま、情報ありがとうございました。
オーブをVFXGraphでつくる

VFXGraph修行中メモ

## 完成品

https://twitter.com/mustankatti/status/1483465354932535300

## 元ネタ

ParticleSystemで作られてたやつをもとにVFXGraphで再実装した。

<iframe width="560" height="315" src="https://www.youtube.com/embed/ctmqr_8esT0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 作り方

VFXGraph

![VFXGraph](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/5282f86e-bb8e-87a3-b21b-749a4687c1e3.png)

VFXShaderGraph: Orbのリング部分

![VFXShaderGraph](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/ec4db1e2-ee12-537d-4ec3-56b5b68f5247.png)



5つのパーツから構成される

1. Circle: オーブの輪郭
2. EnergyLineHead: エネルギー線の先端軌跡
3. EnergyLine： エネルギー線
4. OrbCore: オーブの中心の光
5. Smoke: オーブから出力される煙

### 1. Circle: オーブの輪郭

VFXShaderGraphのリング
- 極座標でリングを作る.
- SmoothStepで輪郭をくっきりさせる

Circle
- 3つのリングを一定間隔で生成して動きのあるリングを作る
- VFXShaderGraphのリングを描画要素に指定
- サイズはLifeに応じて大きくしつつ、Alphaは開始と終わりで薄くする.

![circle](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/23602197-b94d-04f1-b728-71b02e0b7036.png)

### 2. EnergyLineHead: エネルギー線の先端軌跡

EnergyLineHead
- 中心付近からランダム位置に生成、角度とベクトルもランダムに設定
- Turbulenceで軌跡をいいかんじにバラけさせる
- TriggerEventRate(OverTime)でEnergyLine用のイベントを発火する

![EnergyLineHead](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/70cdee99-140b-e6de-f070-c6d817020778.png)

### 3. EnergyLine: エネルギー線

EnergyLine
- 末尾サイズを少しすぼめつつ、色は末尾を透明に. 
- HDRColorで光らせる

![EnergyLine](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/885ff3e7-1884-6f1b-c80c-0f0ebe764234.png)

### 4. OrbCore: オーブの中心の光

OrbCore
- 開始角度とLifetime、SpawnRateをいい感じに調整してウニョウニョ動いているように見せる.
- テクスチャは煙っぽいものやウニョウニョ感が出るものを使う

![OrbCore](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/8ae6c024-baab-ab4f-12c4-8c3a38e76eb7.png)


### 5. Smoke: オーブから出力される煙

Smoke
- RandomVelocity/RandomAngleで射出
- Alphaは徐々に薄く、色は暗めに

![Smoke](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/2845a73f-0d73-2500-728e-6ecd467a0697.png)


## 感想

構成要素の分解ができれば意外と作れる..!
Turbulenceで乱数軌道を作るところと、TriggerEventRate(OverTime) xOverDistanceがハマリポイントだった.
音声ファイルを保存、再生、ダウンロード機能を実装。【Ruby】

# 目的
音声ファイルをアップロードし保存ができ、再生やダウンロードができるように実装します。
以下の画像のようなオーディオプレーヤーが実装されるのがゴールです。
[![Image from Gyazo](https://i.gyazo.com/c7beca78223170f1134c6b610b1f7668.jpg)](https://gyazo.com/c7beca78223170f1134c6b610b1f7668)

# 手順
### オーディオファイルを保存したいモデルにカラムを追加。

```ターミナル.
% rails generate migration AddFileToモデル名 file:string
```
```ターミナル.
% rails db:migrate
```
### ストロングパラメータの修正

```songs_controller.rb
 # 省略

  private

  def song_params 
    params.require(:song).permit(:file, :title)　　#　permit()の中に:fileを追加
  end
```
### gemの追加

```Gemfile.
gem 'carrierwave'
```
```ターミナル.
% bundle install
```
### アップローダーの作成
```ターミナル.
% rails generate uploader Audiofile
```
### モデルに追加

```app/models/song.rb
class Song < ApplicationRecord
# ここから追記
  mount_uploader :file, AudiofileUploader
# ここまで追記
end
```
### viewに追加

```html
app/views/songs/new.html.erb

<%= form_with model: @song, class: 'registration-main', local: true do |f|%>
# 省略
# ここから追記
  <%= f.file_field :file , :size => 140 %>
# ここまで追記
```
### 音声ファイルの再生とダウンロード機能のgem追加

```Gemfile.
gem 'audiojs-rails'
```

```ターミナル.
% bundle install
```

```app/javascript/packs/application.js
#省略
#ここから追記
//= require audiojs
#ここまで追記
```
### viewに追加

```html
app/views/songs/show.html.erb

# 省略

<div class="song_body">
# ここから追記
  <audio src= "<%= "#{@song.file}" %>" controls="">
    <a src="<%= "#{@song.file}" %>">ダウンロード</a>
  </audio>
# ここまで追記
</div>
```
以上で完成です。
ぜひ試してみてください。
超爆速でM1 Mac上にdocker-composeを動作させる

Docker Desktop for Mac and Windows有償化に伴い、cliで現開発環境が稼働できるように、M1 Macで実施したので備忘録がてら残す。
※MySQL5.7対応でかなりハマったのは内緒の話。

## 構成

[lima](https://github.com/lima-vm/lima) + dockerを使用した形を採用。

ホストマシンの上にLima（Virtual Machine）を立ち上げて、その中のDocker Engineを使用する構成。

![イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/cf0bceac-535f-0a99-43b3-d2fa35400841.png)

## 手順

### Docker Install

```shell
brew install docker
```
※ Docker fot Desktop経由でインストール済みの場合はどうにかしてアンインストールすること。

### lima Install

```bash
brew install lima
```

### docker-compose install

執筆当時（20220119）はhomebrew経由でのinstallはできないようなので、物理ファイルを落とす。

```bash
# https://github.com/docker/compose/releases/
wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)
sudo mv docker-compose-$(uname -s)-$(uname -m) /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
```

### lima setting

```bash
# 任意のPathでOK
mkdir -p ~/local/lima
vim ~/local/lima/develop-docker.yml
```

```develop-docker.yml
cpus: 4
memory: "8GiB"
disk: "100GiB"
images:
  - location: "https://cloud-images.ubuntu.com/hirsute/current/hirsute-server-cloudimg-amd64.img"
arch: "x86_64"
  - location: "https://cloud-images.ubuntu.com/hirsute/current/hirsute-server-cloudimg-arm64.img"
arch: "aarch64"
mounts: # プロジェクトを追加
  - location: "~/git"
    writable: true
containerd:
  system: false
  user: false
provision:
  - mode: system
    script: |
     #!/bin/sh
     sed -i 's/host.lima.internal.*/host.lima.internal host.docker.internal/' /etc/hosts
  - mode: system
    script: |
     #!/bin/bash
     set -eux -o pipefail
     command -v docker >/dev/null 2>&1 && exit 0
     export DEBIAN_FRONTEND=noninteractive
     curl -fsSL https://get.docker.com | sh
     # NOTE: you may remove the lines below, if you prefer to use rootful docker, not rootless
     systemctl disable --now docker
     apt-get install -y uidmap dbus-user-session
  - mode: user
    script: |
     #!/bin/bash
     set -eux -o pipefail
     systemctl --user start dbus
     dockerd-rootless-setuptool.sh install
     docker context use rootless
probes:
  - script: |
     #!/bin/bash
     set -eux -o pipefail
     if ! timeout 30s bash -c "until command -v docker >/dev/null 2>&1; do sleep 3; done"; then
       echo >&2 "docker is not installed yet"
       exit 1
     fi
     if ! timeout 30s bash -c "until pgrep rootlesskit; do sleep 3; done"; then
       echo >&2 "rootlesskit (used by rootless docker) is not running"
       exit 1
     fi
hint: See "/var/log/cloud-init-output.log". in the guest
portForwards:
  - guestSocket: "/run/user/{{.UID}}/docker.sock"
hostSocket: "{{.Dir}}/sock/docker.sock"
message: |
     Success.
```

```bash
limactl start ~/local/lima/develop-docker.yml
> 脳死 Enter
echo 'export DOCKER_HOST=$(limactl list develop-docker --format unix://{{.Dir}}/sock/docker.sock)' >> .bash_profile
# 疎通確認(正常に実行できればOK)
docker --version
docker-compose --version
```
MacでTkinterを使ったGUI作成時の注意事項

#環境

- MacOS 12.1
- Python 3.10.0

#TkinterでGUI作るぞ！！！

エラーは出ないのにGUIの画面真っ黒やん。
ボタンも文字も何も出てこない。。。

あかん。　何やっても解決しないぞ、これ
と思って、別のライブラリを使って動かしたところ

>You are running a VERY old version of tkinter 8.5.9. 
>You cannot use PNG formatted images for example.  Please upgrade to 8.6.x

え？　　バージョン古いの？？

#実は気づくタイミングがありました。

直そうとしていた時に
Pythonの対話モードでバージョン確認したんですよ。

~~~
>>> tkinter.Tcl().eval('info patchlevel')
'8.5.9'
~~~
完全に見落としました。 Tcl/tkが入ってて満足してました。　
MacOSでTkinter8.5系は表示バグの致命的欠陥があります。

#よし！！　アップデートするか！！

ターミナルにて `brew info tcl-tk` と打つと

~~~ 
tcl-tk: stable 8.6.12 (bottled) [keg-only]
Not installed
~~~
入ってません。

なので `brew install tcl-tk` で 最新版をインストール

Pythonはpyenv管理していたので

~~~
pyenv uninstall 3.10.0
pyenv install 3.10.0
~~~

GUI表示されたー！！！！

#まとめ

Mac環境でTkinterのGUIが表示されないときはTcl-tkのバージョン確認しましょう。
pyenvで最新版のPythonをインストールしても

~~~
-> https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tar.xz
Installing Python-3.10.0...
<中略>
python-build: use tcl-tk from homebrew
~~~

Tcl-tkは、Homebrewを使うので、`brew`コマンドで確認しましょう

#参考文献

[Macのtkinter8.5でpngをまともに表示できない→PyenvのPython再インストールでtcl-tkをバージョンアップした](https://qiita.com/undead/items/e92ff0038c1fa14689b5)
EclipseでPayaraTools導入エラー

#環境
* mac OS Monterey
* Eclipse IDE for Enterprise Java and Web Developers - macOS x86_64 (Eclipse IDE 2021-12 R Packages)

#原因
__Details__

```
Cannot complete the install because one or more required items could not be found.
Software being installed: Payara Tools 1.4.0.202110041326 (org.eclipse.payara.tools.feature.group 1.4.0.202110041326)
Missing requirement: Payara Tools1.4.0.202110041326(org.eclipse.payara.tools.feature.group 1.4.0.202110041326) requires 'org.eclipse.equinox.p2.iu; org.eclipse.sapphire.modeling.xml.feature.group [9.1.0,10.0.0)' but it could not be found
```

__Google翻訳から__
`org.eclipse.payara.tools.feature.group`には`org.eclipse.equinox.p2.iu`が必要。
しかし`org.eclipse.sapphire.modeling.xml.feature.group`が見つからなかった為インストール失敗。

__どういうことか__
payara toolsをインストールする為に必要なライブラリ？がなくその為にsapphireというプラグイン？をインストール（自動で）してくれるがそもそもsapphireインストール元が存在しなかった。
本来は
https://download.eclipse.org/sapphire/9.1.1/repository/
にあるはずだが Not Found になっている。（2022/01/19現在）

#解決策
探した結果`sapphire/9.1.1/`を配布しているサイトがあった為、ダウンロード。
メニューバーの`Help`→`Install New Software`からインストールした後、再度Payara Toolsのインストール（Market Place）

__サイト__
http://mirrors.ibiblio.org
`eclipse`→`sapphire`→`9`→`sapphire-repository-9.1.1.zip`
__ダウンロード（直接）__
http://mirrors.ibiblio.org/eclipse/sapphire/9.1.1/sapphire-repository-9.1.1.zip
VSCodeでHugoを扱う際、HTMLファイル保存時にフォーマットされてしまうのを防ぐ

自分のブログは静的サイトジェネレータのHugoを使って構築していて、Hugoをなにかいじる場合や記事の執筆そのものも含めてVSCodeで行っています。

ただ、HugoのLayoutファイルなどHTML内にHugo的な記法（`{{ hoge }}`のようなアレ）を書いていると、VSCodeに入れてあるフォーマッタが勝手に改行などしてしまうことがあります。

## 発生する問題

たとえば以下のコードがあったとします。

``` html
    <ul class="facts">
      <li><i class="fas fa-calendar" aria-hidden="true"></i><time datetime="{{ .Date.Format "2006-01-02T15:04:05JST"}}">{{ .Date.Format ( .Site.Params.dateformat | default "2006-01-02") }}</time></li>
      {{ if ne .Date .Lastmod }}<li><i class="fas fa-sync" aria-hidden="true"></i><time datetime="{{ .Lastmod.Format "2006-01-02T15:04:05JST" }}">{{ .Lastmod.Format ( .Site.Params.dateformat | default "2006-01-02") }}</time>
      </li>{{ end }}
      <!--{{ with .Section }}<li><i class="fas fa-bookmark" aria-hidden="true"></i><a href="{{ $.Site.BaseURL }}{{ . | urlize }}/">{{ . | upper }}</a></li>{{ end }}-->
      {{ if eq (getenv "HUGO_ENV") "DEV" }}
      <li>{{ .WordCount }} Words</li>
      {{ if .IsDraft }}<li style="color: #2196f3;">DRAFT</li>{{ end }}
      {{ end }}
    </ul>
```

これを、VSCodeで`Ctrl`+`s`で普通に保存すると・・・

``` html
    <ul class="facts">
      <li><i class="fas fa-calendar" aria-hidden="true"></i><time datetime="{{ .Date.Format "
          2006-01-02T15:04:05JST"}}">{{ .Date.Format ( .Site.Params.dateformat | default "2006-01-02") }}</time></li>
      {{ if ne .Date .Lastmod }}<li><i class="fas fa-sync" aria-hidden="true"></i><time datetime="{{ .Lastmod.Format "
          2006-01-02T15:04:05JST" }}">{{ .Lastmod.Format ( .Site.Params.dateformat | default "2006-01-02") }}</time>
      </li>{{ end }}
      <!--{{ with .Section }}<li><i class="fas fa-bookmark" aria-hidden="true"></i><a href="{{ $.Site.BaseURL }}{{ . | urlize }}/">{{ . | upper }}</a></li>{{ end }}-->
      {{ if eq (getenv "HUGO_ENV") "DEV" }}
      <li>{{ .WordCount }} Words</li>
      {{ if .IsDraft }}<li style="color: #2196f3;">DRAFT</li>{{ end }}
      {{ end }}
    </ul>
```

拡張子がHTMLなので`{{` `}}`のところをちゃんとパースしてくれないんですね・・・

これだと、ファイルを触るたびに後者のように整形されてしまって、結果`hugo server`したときにシンタックスエラーが出てきます。

## 解決策

アナログな解決策ですが、「フォーマッタを動作させずに保存」するコマンドを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/7124c6eb-2ddb-f221-049d-19752bc5a9c1.png)

`Ctrl`+`Shift`+`p`から呼び出してもいいですし、ショートカットキー（上記画像に記載の通り）`Ctrl`+`k` ののち `Ctrl`+`Shift`+`s`で保存でもOKです。

これをやると、フォーマットしないで保存ができます。

※ファイルの拡張子やプロジェクト単位でフォーマッタ動かさないように設定してもいいんですけど、フォーマットをしてくれたほうがいい場面のほうが確実に多いので・・・
Mathematicaでいつも冒頭で実行する処理をまとめる

# これは何の記事か
Mathematicaを快適に使う上でいつも冒頭で書いておきたい処理を自分のためにまとめて書いておく。Mathematicaは公式ドキュメントこそ多いものの、一般人による記事が少なく、コミュニティとして終わっている気がするので、ついでに誰かの助けになればいいな、などと思っている。

# 結論
まずは、自分がノートブックにコピペする用に処理をまとめて書いておく。ノートブックにコピペしたら、適切なところで```command + shift + d```をおして、セルを分割してから実行しよう。

```wl
(* はじめから実行する処理 *)
SetOptions[EvaluationNotebook[], CellContext -> Notebook];
savefile = 
 FileNameJoin[{NotebookDirectory[], 
   TemplateApply[
    "/savefiles/``_savefile.wl", {FileBaseName[NotebookFileName[]]}]}];
(* 実行したい時に実行する処理 *)
Save[savefile, "`*"];   (* savefileが本当に今のノートブックに対応したものかを確認せよ *)
Get[savefile];   (* savefileが本当に今のノートブックに対応したものかを確認せよ *)
```

# 解説
[この記事](https://reference.wolfram.com/language/workflow/AutomaticallyUseSeparateContextsForDifferentNotebooks.html.ja?source=footer)とか[この記事](https://qiita.com/dtakashi/items/94adfc0f7838ad311070)とか。