OmniAICreator/Qiita-1.07M huggingface dataset:
【Xcode】ライブラリが認識されていない時の対処法

# はじめに
WWDC2019の「[Creating Swift Packages](https://developer.apple.com/videos/play/wwdc2019/410)」を見ていたら新発見があったので記録しておきます。
SwiftPMでライブラリを導入してもimportできない時ないですか？？
Xcodeが重い時に多い気がします。

それを解決できるコマンドをWWCDでしれっと披露してました笑

# コマンド
`command` + `option` + `P`

# 該当場面
4:30くらいでした。
![スクリーンショット 2023-02-05 21.46.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1dc080a6-54d2-fd99-a72a-4d4f022bbc19.png)
![スクリーンショット 2023-02-05 21.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9313db5d-f554-78bc-46d9-8a42c14eba8e.png)
![スクリーンショット 2023-02-05 21.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bd2d1fe3-9bd3-6578-fd8a-49b7221cee69.png)

# おわり
`command` + `option` + `P`はCanvasの更新だけかと思っていましたが、こんなこともできるんですね。
setodaNoteCTF - Redirect 150

# 問題

https://ctf.setodanote.net/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/962a2673-ede0-7519-1377-d1473234dc6a.png)

# 解いてみた

こういうサイト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6d7f4f32-3c23-d724-b8ec-287f515d9a69.png)

ソースを見てみると、下のほうにリダイレクトするような処理がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/13ce6bd7-92c6-9a8c-8248-c5e734c73115.png)

転送先がbase64で変換されているのでcyberchefを使って戻します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9d2bbfa9-4f74-9b6f-a103-ce0543e0ad82.png)


https://ctf.setodanote.net/web004/bWFsa2l0.html にアクセスすればよさそうなので、アクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fcdef0c2-4603-c00e-8105-63b7d051202d.png)

ナイストライと言われ、urlもhttps://ctf.setodanote.net/web004/ZGFtbXlmbGFn/ に転送されていました。
これはつまり、転送されないようにbWFsa2l0.html にアクセスする問題なんでしょうか。

CURLでアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d29859ba-5c80-fa66-f55f-c9c35362f24b.png)

https://ctf.setodanote.net/web004/bm9mbGFn/ にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8ce653e3-58ac-84ec-c131-60befd055353.png)

https://ctf.setodanote.net/web004/bmV4dG5leHQ/ にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/aecd53df-8469-a303-c5d0-c00dc2024a58.png)

https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/ にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/905d9e5e-2450-6223-d9b3-ca8729c80be8.png)

https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/ にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d2234e1b-4ea2-931c-deda-ae77d53a9915.png)

https://noisy-king-d0da.setodanote.net/ にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6712b316-635a-0542-ea4b-10508ff6813f.png)

パラメータが必要らしいので、つけます。
https://noisy-king-d0da.setodanote.net/?callback=getFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ea7cc451-ae69-2b3f-d092-7e8de378649f.png)

フラグが出ました。
スクラム開発で学んだモチベーション維持の大切さ

こんにちは。Webエンジニアの吉田です。

以前4ヶ月間アジャイルコーチ指導のもとスクラム開発を行っていました。開発を行う中で、チームのモチベーションが生産性に大きく影響することを学び、今回その内容を記事にさせていただきました。

これからスクラム開発を行う方々の参考になっていただけたら幸いです。

## 1.スクラム開発とは

スクラム開発はアジャイル開発の1つで以下のように定義されています。

> 複雑な問題に対応する適応型のソリューションを通じて、人々、チーム、組織が価値を生み出すための軽量級フレームワークである。

スクラム開発ではスプリントと呼ばれる固定の期間(1週間から1ヵ月)に区切って、繰り返し開発を行います。そして期間の中で、計画、設計、開発、テストを行います。

また開発メンバーは平等で、上下関係はありません。メンバー間の不得意分野を補いながら、メンバー全員が同等に仕事を出来るようになることを目指します。（誰かが仮にプロジェクトを抜けても開発品質を下げないため）

そしてスクラム開発では、常に変化に適応していくことが必要なため、チームワークやコミュニケーションが重要です。

## モチベーション維持が大切な理由

### 1.仕様変更に柔軟に対応する必要があるため

顧客側の希望を反映していく必要があるため、要望があれば次回のイテレーションで織り込み、細やかな対応を行う必要があります。携わっていたプロジェクトでは開発初期には、頻繁に仕様変更が発生しました。

「仕様変更に柔軟に対応することはスクラム開発において大切だ」と意識していても頻繁に手戻り作業が発生するとやはりモチベーションが下がってしまいます。
このような時はチーム内で以下のことを意識していました。

- コーヒーブレイクの時間をいつもより多めにする 
- ゴールの設定・見直し　

雑談の時間をいつもより増やすことで、相手の性格を知ることができ、信頼関係をより築くことができます。そしてゴール設定を新たに話し合うことで、より良いシステム開発のために頑張ろうという気持ちになりました。

### 2.個人タスクの時間が少ないため

短い期間で開発を行うため、品質と知識の向上のためペアプログラミングを行うことが多いです。レビューを行いながら開発を行うため、1人で仕事を行うのに比べ疲労やストレスが溜まりやすい環境です。

また数時間や1日単位でペアを変えるため、様々な人とコミュニケーションを取る必要があります。そのため1人のモチベーション低下によりチーム全体に影響を及ぼしてしまうことがあるのです。

個人のモチベーション管理としてニコニコカレンダーを用いていました。日々の感情をカレンダーに反映させ、気持ちの変化を把握することで、メンバー全員の状況を確認することできました。感情が落ちているメンバーに対しては積極的にヒアリングや、タスク量の配慮することでモチベーションを落とさず作業することにつながりました。

## 最後に

ウォーターフォール開発を行なっていた時はあまり重要視していませんでしたが、スクラム開発を行う中でチームの信頼関係、モチベーションはとても重要だと感じました。
スクラム開発に限らずどの開発手法でもモチベーションは生産性に影響を与えるので、改めてチーム内のコミュニケーションや、自身の気持ちを意識しながらプロジェクトを進めていきたいと思います。

最後までお読みいただきありがとうございました！
Dockerでのenv.ファイル記述場所について

# 概要
rails(6.1)+mysql(8.0)の環境をDockerで構築した際に学んだ、env.ファイルの記述場所とそれに付随したことについてです。

# env.ファイルはdocker-compose.ymlのenv_fileに書く
はじめは、env.ファイルを読み込むためにGemfileに `gem 'dotenv-rails'`を記述していました。

docker-compose.ymlの項目である`env_file`に記述することでも環境変数を読みこむことができます。
`env_file`に記述することで`env.`に記述した環境変数を使うことができます。
docker-compose.ymlに必要なことをまとめられるのでこちらの方がわかりやすいと思いました。

# _env_file_ と _env._ の違い
- **env_file**
`env_file`はdocker-compose.ymlの項目の1つで、環境変数を記述したファイルを読みこむもの

- **env.**
コンテナ内で使う環境変数を記述するファイル
ホストに環境変数の設定があればホスト側が優先される

# 最後に
もともとdocker内で環境変数を読みこむ方法について調べていました。がenv系のそれぞれの違いなどがわかっていなかったので、環境変数についても理解を深めることができました。
XCode 14 [Thread 1: "Could not find a storyboard named 'Main' in bundle NSBundle]

このエラーは　Main.storyboard ファイルが削除され、コードの一部がまだそれにアクセスしようとしている場合、Xcode は「バンドル NSBundle に「main」という名前のストーリーボードが見つからなかった場合に発生します。
(Main.storyboardを誤って削除してしまった場合は作り直せばいいです。)

一方、意図的にMain.storyboardを削除した場合はMain.storyboardを読み込まないように設定する必要があり、それは以下の手順で行います。

1. [PROJECT NAME]in project navigater >[General] > [Development Info] > [Support multiple windows] 
1. Click (-) icon (Delete [Main storyboard file base name])

![スクリーンショット 2023-02-05 21.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/4e36221e-34ba-9433-13f3-7806fefae808.png)

[Main storyboard file base name]の(-)アイコンをクリックして削除
![スクリーンショット 2023-02-05 21.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/0542db59-9c5b-5078-a941-26001219850a.png)

すると項目が消えるので、それで完了です

削除後のリスト
![スクリーンショット 2023-02-05 21.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/9e472dde-7325-22c6-25ad-fb542c7b0583.png)
ChatGPT にお願いして、PowerShell でGitからソースコードを取得してZip化＆treeっぽいテキストファイルを作ってもらった

# 背景
Bat で同様のコードがあったが、Windows の文字コード関連のUpdateによって文字化けが発生してた。
修正しようと思ったら手こずったので・・

いっそ AI さんに最初から作ってもらおうって試した記録

# 会話の結果

```powershell 
# Create the directory "source"
New-Item -ItemType Directory -Path source

# Set the working directory to "source"
Set-Location source

# Clone the repository
git clone https://github.com/m-radzikowski/aws-sdk-client-mock.git

# Set the working directory to the repository directory
Set-Location aws-sdk-client-mock

# Get the Git hash
$gitHash = git rev-parse --short HEAD

# Get the current date
$date = Get-Date -Format "yyyyMMdd"

# Create the zip file name
$zipFileName = "src_$date($gitHash).zip"

# Get the current working directory
$currentDirectory = Get-Location

# Create the destination path
$destination = "$currentDirectory\..\$zipFileName"

# Zip the sources
Compress-Archive -Path "$PWD\*" -DestinationPath $destination

# Print the zip file name
Write-Output "Zip file created: $destination"

# Custom function to display the file tree
function Get-Tree {
  param (
    [string]$Path,
    [int]$Indentation = 0
  )

  Get-ChildItem $Path | ForEach-Object {
    $prefix = "  " * $Indentation
    if ($_.PsIsContainer) {
      Write-Output "$prefix|-- $($_.Name)"
    } else {
      Write-Output "$prefix|-- $($_.Name)"
    }

    if ($_.PsIsContainer) {
      Get-Tree -Path $_.FullName -Indentation ($Indentation + 1)
    }
  }
}

# Get the file list and write to a file
Get-Tree -Path "$PWD" | Set-Content "$currentDirectory\..\sourceList.txt"
```

https://chat.openai.com/chat/de458e19-c923-4f7e-8637-ad3902732e0a

# あとがき
何がすごいのか

- 問題点を指摘すると修正してくれる
- おかしいところを聞くと、理由を教えてくれる
- 例を見せると、取り入れてくれる
- 平均以上の知識を期待できるので、苦手な部分の補助や初学者の支援には最適

ちょうどいま、新しい業務に切り替わって技術全般初学者に戻ってるので、頼っていこうと思う。
VirtualBox7.0のhost-only adapterの仕様変更について

# はじめに

VirtualBox7.0において、最近のmacOSバージョンを実行しているVirtualBoxでは、host-only adapterをサポートしていません。

その代用として、host-only networkを使うことになります。

![Screenshot 2023-02-05 at 20.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/4885f9f3-4030-9514-1732-8c038826168d.png)

以下が公式ドキュメントです。

https://www.virtualbox.org/manual/UserManual.html#network_hostonly

当環境は以下の通りです。

```text:環境
Mac os: vetura 13.1
VirtualBox: Version 7.0.4
```
大きな仕様の変更点は以下の通りです。

- ゲストOSにアクセスするためにポートフォワードをするポートを指定する必要がある。

# host only network構築手順

## toolsからnetworkを選択

toolsからnetworkを選択します。

## host-only networkからネットワークを作成

host only networkからcreateを選択しネットワークを作成します。

![Screenshot 2023-02-05 at 20.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/dfce8cdd-38ea-9925-a65f-c701164cb57a.png)

## propetiesとNAT Networkを選択

propatiesとNAT Networkを選択、Port Fowardingを選択します。
以下の図のように、オープンしたいportを追加します。

![Screenshot 2023-02-05 at 20.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/9f0c263f-84f6-4f68-e5c3-22da59be1253.png)

## ゲストOSの設定からhost-only networkを選択

ゲストOSの設定からattahed toをhost-only networkを選択、先程作成したhost-only networkのnameを選択します。

![Screenshot 2023-02-05 at 21.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/c8636795-e3d4-acad-5f09-e6da917bb12e.png)

## 自身のIPを確認

ifconfigをターミナルで打ち、自身のIPを確認します。

![Screenshot 2023-02-05 at 21.13.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/3eb6da7c-ab9c-317f-55a7-fa5fc02105ce.png)

## 簡易サーバー

簡易サーバーを立てます。

![Screenshot 2023-02-05 at 20.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/4ddb9674-6c5d-1bf1-adc9-a6616378ac0b.png)

これで外部からアクセスできます。
【実装メモ】pandas基礎レベル



## 書くこと

久しぶりにpandasを触ったときに、実装がわからずググったことをメモる。

- ｎ個の要素数の `Series` 作成
- `DataFrame` に `Series` を列結合（ `df[’name’]`, `df.insert()`）
- 既存の列aにlambda関数を実行して、結果を新規列bを作成
- dfを２次元配列(list)に変換

最後にNotion AIの要約も載せてます。

## コード

### n個の要素数の `Series`

```python
# %%
uuids = [str(uuid.uuid4()) for i in range(5)]
s = pd.Series(uuids)

empty_list = [None] * 5
```

### `DataFrame` に `Series` を列結合

最後尾の列に `Series` 結合

```python
# %%
df['uuid4'] = s

```

任意の列番号に `Series`結合

```python
df.insert(0, 'top_uuid4', s)
```

### 既存a列にlambda関数、新規列bを作成

```python
# %%
df['twice_value'] = df['value'].apply(lambda x: x * 2)
```

### dfを２次元配列(list)に変換

`values` でNumPy 配列に変換。

```python
list_from_df = df.values.tolist()
```

## おまけ

コードサンプルの `# %%` はvscodeでjupyter機能を簡易に使うためのもの。

[Working with Jupyter code cells in the Python Interactive window](https://code.visualstudio.com/docs/python/jupyter-support-py)

## 最後に

今回出てきたレベルの加工なら、そもそもpandasを使う必要がないみたいな話があるかもしれません。このあたりの塩梅について、知見があればご意見ください！

## おまけのおまけ）Notion AI 要約→翻訳

This document provides a summary of how to use the pandas library in Python, including how to create a Series with n elements, how to join Series to a DataFrame, how to create a new column in a DataFrame using a lambda function, and how to convert a DataFrame to a two-dimensional array. It also provides an additional tip on using the "# %%" code in Visual Studio Code for Jupyter support.

このドキュメントでは、n個の要素を持つSeriesの作成方法、SeriesをDataFrameに結合する方法、lambda関数を使用してDataFrameに新しい列を作成する方法、DataFrameを2次元配列に変換する方法など、Pythonのpandasライブラリの使用方法をまとめています。さらに、Visual Studio CodeでJupyterサポートを行うための「# %%」コードの使用方法についても追加で説明しています。
未経験からAWS認定を取得した話

はじめまして。
パチンコ店で社員として働きながら
エンジニア転職を目指している者です。

目標としていたAWS認定資格を取得出来たので
備忘録的に初めての記事を書いてみます。

## 環境
* スクール利用（侍エンジニア）
* 週5でパチンコ店勤務（社員）

## 取得した資格
* CLF
* SAA
* DVA

取得順は　CLF ＞ DVA ＞ SAA でした。
総準備期間は5ヶ月です。

## 使用教材

### 【教科書】
- AWS認定資格 クラウドプラクティショナーの教科書(無料!)
- AWS認定資格　ソリューションアーキテクトアソシエイトの教科書(無料!!)
- AWS認定　デベロッパーアソシエイト教科書
- ポケットスタディ　AWS認定デベロッパーアソシエイト



### 【ハンズオン】
* 侍エンジニアAWSコース
* 侍エンジニア メンターからの課題
* Hands-on for Beginners



### 【問題集】
* TechStock
* Udemy
* Ping-t(SAAのみ)

# 学習方法
## ■CLF
**準備期間：1ヵ月半**
侍エンジニア教材 ＞ 教科書2週 ＞ TechStock & Udemyで満点取るまで反復

ネットワークの基礎も無い状態でしたので、スクールの教材で基礎を学んでから
教科書を読み込み、後は問題集の反復でした。

また、ハンズオンはメンターの方が用意して下さった課題をクリアしていく事で
サービスの理解も深まりました。

## ■DVA
**準備期間：2ヵ月半**
侍エンジニア教材(ハンズオン)　＞　教科書　＞　TechStock & Udemy

3つの中では一番難しかったです。

教科書が難しすぎて読む事を途中で挫折しました…
準備期間のほとんどをTechStockとUdemyの問題集を反復＆解説読み込みで過ごしました。

教科書は深く読まずに、さらっと読んで用語をほんのり頭に入れる　⇒　問題集反復
の勉強方法が自分には合っていると思いました。

Github、Code4兄弟、Lambda＆API、CloudFormationを
メンターからの課題、Hands-on for Beginners、Classmethodなどでハンズオンしました。

## ■SAA
**準備期間：1ヵ月**
教科書　＞　TechStock & Udemy & Ping-t

DVAの知識があったので、多少は楽でした。

設定された目標受験日まで時間が無かったので、教科書をさらーーーっと読んで、
TechStock ＞ Udemy ＞ Ping-t の優先順位で解きまくりました。

ハンズオンは無し。

# まとめ
仕事の日は3h、休日は最低5hほどを確保して、トータル400h↑の勉強時間でした。

正直、問題集解く ⇒ 解説読む ⇒ 以下エンドレス
でも無理やり合格は出来ると思います。

ただし、業務に役立てるならハンズオン等行い、知識の定着をする必要があると感じました。

DVAで時間を取られてしまったのが悔やまれますが、頑張れば半年でSOAまでは取れるかも？
有識者の皆様の仰る通りSAAから取った方が効率が良いかもですね。
究極まで最適化したコードは同じになるか


私見を述べさせてもらいます。

コンピュータで、ある問題を解くのにアルゴリズムが一つしか無いということはありえないと思いますが、究極までエレガントさを追求したり、最適化を推し進めた場合、最適解が一つしか無い、すなわち、複数の人が書いたコードが同じコードになるということはあり得ると思います。
その場合、著作権はどの様になるかが問題です。特許のように登録制だと、最初に登録した人に知的所有権は渡ると思いますが、プログラミングのように、一般的には特許を取らないものは、著作権は主張できるのでしょうか。ライセンスは主張できても、これは自分で考えついたものだと、ライセンス外のところで言われれば、そう認めざるを得ないのでは無いでしょうか。その場合、文字通り、コピーライトはコードをデジタルコピーをして配布する権利に成り下がってしまいます。何が言いたいのかと言うと、あるアルゴリズムを完全に理解した上で、あるコードを究極まで最適化して書いた場合、そのアルゴリズムでは、同じようなコードしか出来ないと言うことです。もちろん、言語の違いはあると思いますが、それは「移植」と言うべきでしょう。移植したコードの著作権は移植者にあると思います。僕は、Qiitaでは、著作権は放棄しています。僕がQiitaに載せるコードは自由に改変して使ってもらっていいです。アルゴリズムが一つしか無いということはありえないということは、手続き型、関数型、オブジェクト指向型の別があったり、別表現があったり、冗長なコードを含む場合です。冗長さを許せば、いくらでも煩雑なコードが書けます。それによるコードの違いが著作物の違いだとすると、手を加えて煩雑にしたコードを、独自のものだと主張することが出来ますが、そんなことは、コードの美学から言って避けて欲しいものです。究極まで最適化をすると、アルゴリズムの別解や別表現がない限り、同じコードになってしまいますね。これは、しょうがないことだと思います。

終わり。
viエディタの基本

# はじめに
## viエディタの特徴
以下の2つの動作モードを切り替えながら使う。
- コマンドモード
  →vi起動時点のモード
- 入力モード
  →入力がviコマンドと解釈されるモード
## viの起動
ファイル名を指定してviコマンドを実行。
ファイル名を指定しなければ、空の新規ファイルが開かれる。
-Rオプションを指定すると、読み取り専用モードでファイルが開かれる。

# viの入力モード
| コマンド | 説明 |
|:-----------|:------------|
| i | カーソルの前にテキストを入力 |
| a | カーソルの後にテキストを入力 |
| I | 行頭の最初の文字にカーソルを移動し、その直前にテキストを入力 |
| A | 行末にカーソルを移動し、その直後にテキストを入力 |
| o(小文字) | カレント行の下に空白行を挿入し、その行でテキストを入力 |
| O(大文字) | カレント行の上に空白行を挿入し、その行でテキストを入力 |
Ruby timesメソッドを使った繰り返し処理を行うプログラムを書く

# 繰り返し処理を行うプログラムの作成

- ユーザーに数字を入力してもらい、その数の回数だけHello world!と表示させるコードを記述します。

```ruby
def output(num)
  num.times do
    puts "Hello world!"
  end
end

puts "何回表示させますか？"
num = gets.to_i
output(num)
```

## 解説

- メソッド外の部分
```ruby
puts "何回表示させますか？"
num = gets.to_i
output(num)
```
上記コードは、ファイルを実行したときにターミナルで出力される内容を書いています。
ユーザーに数字を入力させることで、「Hello world!」が何回表示されるのかを実行するためです。
getsメソッドで入力した値は、全て***文字列***で返します。
そのため、***.to_i***を付けて数値に変換させます。

- output(num)
ユーザーが入力した数値を、メソッド内で呼び出したいため、numという引数を使います。

- outputメソッド内
繰り返し表示させるためには、timesメソッドを使います。
ユーザーがターミナルで入力した数値が変数numに代入され、処理が行われるということです。
【初級】 pythonでモジュールを使う

記載日2023/02/05
モジュールのファイル構成が独特で、少し理解しずらかったので、備忘録として記述します。

なお、クラスとモジュールの使い分けについても考えたので、もし興味がある方は[こちら](https://qiita.com/middle_aged_rookie_programmer/items/858fde1fbb376ab32c5d)も見てみてください。

## 流れ
まず、モジュールのファイル構成やコード記述の概要を記載します。
次に、具体的に機能をコードに書いてみます。

## ファイル構成や書き方
参考サイトによると、ディレクトリ名にモジュールの名前を書き、そのディレクトリ内の\_\_init.py__に機能を記載するのが一般的みたい。
\_\_init__.pyにはメソッド（def）を記述する（classは記述しない）。

プロジェクト
　|
　|ーモジュール名
　|　　|
　|　　|－\_\_init__.py
　|
　|ーMain.py

~~~python
# __init__.py
import XX

def method():
    return YY
~~~


## 具体例
モジュールを使って以下機能を記述したコード例を記載する。
・引数2つの和と差をコンソールへ出力する。

ファイル構成は以下の通り。

　プロジェクト
　　|
　　|－Calc
　　|　　|
　　|　　|－\_\_init__.py
　　|
　　|－Main.py

Calcモジュールでは足し算と引き算のメソッドを持つ。ディレクトリCalcの下に\_\_init__.pyを配置して、Calcモジュールを構成する。
Main.pyでは、モジュールのメソッドを呼び出してコンソールに和と差を出力する。
<details>
<summary>Calc/__init__.pyのコード</summary>
<div>

~~~python
def Sum(a, b):
    return a+b

def Sub(a, b):
    return a-b
~~~

</div></details>

<details>
<summary>Main.pyのコード</summary>
<div>

~~~python
import sys
import Calc as CalcM

def Main():
    print(CalcM.Sum(int(sys.argv[1]),int(sys.argv[2])))
    print(CalcM.Sub(int(sys.argv[1]),int(sys.argv[2])))

    # > 実行すると和の5と差の1が出力される。
    # > python Main.py 3 2
    # > 5
    # > 1

if __name__=="__main__":
    Main()
~~~

</div></details>

## 参考にさせて頂いたサイト
・ファイル構成について
https://rinatz.github.io/python-book/ch04-07-project-structures/
【Github】Fine-grained personal access tokensで開発者がpushするときのtoken取得手順とそのスコープ


Githubでhttpsで開発者がpushするときにtokenが必要ですが、そのtokenの種類に`Fine-grained personal access tokens`が追加され今までのはclassicになっていたので`Fine-grained personal access tokens`で開発者がpushするのに必要なtokenを作る手順です。

# token取得手順

- token生成ページ: https://github.com/settings/tokens?type=beta

から`Generate new token`を指定します。

![Generate new token](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/3a70047f-d200-6f0b-1bb5-2c8d7b115d2f.png)

TokenNameはどこで・何に使ってるのかわかるような名前を(後でとけんを消したりするときにわかるように)、Expirationは有効期限で最長で1年までのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/1b96ad9a-e7f8-01e6-104e-5b486473c74b.png)

Repository accessは`All repositories`か特定のリポジトリだけでいいなら`Only select repositores`からリポジトリを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/5512ab75-5e1f-ba72-5164-30a687b4f9bc.png)

Permissionsは`Contents`に`Read and write`を付けます。
権限の詳細はこちら→ https://docs.github.com/en/rest/overview/permissions-required-for-fine-grained-personal-access-tokens?apiVersion=2022-11-28#contents

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/1eb55278-a2af-c7c9-c1e3-bbceae016167.png)

`Generate token`からtokenを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/62467cff-414b-edcb-75dd-dd6a50253f6f.png)

最後に生成されたtokenをコピーして

![スクリーンショット 2023-02-05 203545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/fc36ada0-0ad2-97d2-e8bd-c55c96b1bfe2.png)

# pushする

あとはpushするときにUsername/Passwordを入力するときのPasswordに取得したtokenを入力するとpushできます。

```
$ git push origin main
Username for 'https://github.com': ******
Password for 'https://******@github.com': 
Everything up-to-date
```

pushする前に

```
$ git config --global credential.helper store
```

を実行しておくとその環境上でUsername/Passwordが保存され次回以降にpushするときにUsername/Passwordを聞かれなくなります。
動いていた頃のvoltaをHomebrewでインストールする

Voltaは便利だがすぐ動かなくなる。
そこで動いていた過去バージョンのvoltaをHomebrewでインストールする。

# 手順

さきほどvolta1.1.1(1.1.1_1)が動かなくっていたので、1.1.0をインストールしたときの例。
ARM64 Venturaの環境で1.1.1が動いたと言っている人もいたが、Montereyでは動かなかった。
別の原因かも。

```sh
$ brew tap-new $USER/volta
$ brew extract --version=1.1.0 volta $USER/volta
$ brew install $USER/volta/volta@1.1.0
$ volta -v
$ brew developer off
```

# その他の方法

## formulaファイルを直接指定する

直接formulaファイルを指定する方法は使えなくなったらしい。
怒られた例。

```sh
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/04791f84abb845f2b2e216da986f1b77e47f5701/Formula/volta.rb
Error: Installation of volta from a GitHub commit URL is unsupported! `brew extract volta` to a stable tap on GitHub instead.
```

## 1.1.0〜

1.1.0以上であれば多分get.volta.shからでもインストールできる。

```sh
$ curl https://get.volta.sh | bash -s -- --version 1.1.0
```

## 〜1.0.x

古いバージョンをインストールするにはこちらのやり方。

https://docs.volta.sh/advanced/installers#installing-old-versions

```sh
curl https://raw.githubusercontent.com/volta-cli/volta/8f2074f423c65405dfba9858d9bcf393c38ffb45/dev/unix/volta-install.sh | bash -s -- --version 1.0.8
```
Failed to get D-Bus connection: No such file or directory

## 前提
macOS 13(Ventura)
CPUが `Apple Silicon M1 MAX`
Docker for Mac
systemdを採用しているOS？（今回はCentOS7）

## エラーメッセージ

```bash
$ systemctl status httpd

Failed to get D-Bus connection: No such file or directory
```

`systemctl` コマンドがとにかくエラーで動かない。

```~/Library/Group\ Containers/group.com.docker/settings.json
  "deprecatedCgroupv1": true,
```

上記、 `false` を `true` に変更する。

## ここが重要

**macOS を再起動する。**

私の場合、このステップが必要でした。
Docker for macを再起動とかしたんだけど、変化なしでした。
あれこれして時間を無駄にしました。
とにかく、まるごと、再起動。
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile

Spring BootのプロジェクトをMacで起動しようとした時のメモ

```
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile
```

`./mvnw spring-boot:run`とするとエラーになった。

### 原因
pomに書かれているjavaのバージョンと実際に実行する時に使われているjavaのバージョンが一致しないため。

### 解決策
pomに書かれているバージョンのjavaをインストールしてパスを通す！！
Dockerで環境を作りMySQLを起動するまで

# はじめに
こんにちは！
いきなりですが、今回は勉強がてらSQLの勉強するかなーと思いました。それでDockerで環境構築するか！と思いMySQLをインストールするまでのDockerfileとMySQLの起動をShellScriptで作りました！
せっかくなので記事にしていきます。

# dockerfileの中身
dockerfileの全体の中身になります
```dockerfile:dockerfile
FROM ubuntu:20.04

RUN apt update && apt upgrade
ENV TZ Asia/Tokyo
RUN apt install -y tzdata
RUN apt install -y --no-install-recommends mysql-server 
WORKDIR /usr/share/mysql
COPY start_mysql.sh /usr/share/mysql
RUN chmod 755 /usr/share/mysql/start_mysql.sh
```
ちょっと中身を見ていきます。
まず今回はUbuntu20.04を指定をしてます。
そして次にaptをupdateしてupgradeします。
```dockerfile:dockerfile
FROM ubuntu:20.04

RUN apt update && apt upgrade
```
次にこれ。
少しあれってなりました。なぜならばlogの方を見てほしいのですが、ここで先に進まなくなってしまいました。
ちょっと調べてみるとどうやら次の１行でタイムゾーンのインストールが必要なようです。`RUN apt install -y tzdata`
入れたら問題が解決しました。

```dockerfile:dockerfile
RUN apt install -y tzdata
RUN apt install -y --no-install-recommends mysql-server 
```

```terminal:ターミナル
=> [3/3] RUN apt install -y mysql-server
=> => # questions will narrow this down by presenting a list of cities, representing
=> => # the time zones in which they are located.
=> => #   1. Africa      4. Australia  7. Atlantic  10. Pacific  13. Etc
=> => #   2. America     5. Arctic     8. Europe    11. SystemV
=> => #   3. Antarctica  6. Asia       9. Indian    12. US
=> => # Geographic area:
```
次に上から順にやっていることですが、
`WORKDIR /usr/share/mysql`についてはコンテナに入ったらこの指定した箇所がスタートになります。
`COPY start_mysql.sh /usr/share/mysql`についてはローカルにあるshellファイル（今回作成したstart_mysql.sh）をコンテナの/usr/share/mysqlのなかにコピーします。
`RUN chmod 755 /usr/share/mysql/start_mysql.sh`についてはコピーしたstart_mysql.shの権限を変更しています。
```dockerfile:dockerfile
WORKDIR /usr/share/mysql
COPY start_mysql.sh /usr/share/mysql
RUN chmod 755 /usr/share/mysql/start_mysql.sh
```
# ShellScriptの中身
次にShellScriptの中身ですが、実行したらroot権限で入れるようにしました。
やっていることはmysqlをスタートしてログインするというコマンドを入れているだけです。
```sh:start_mysql.sh
service mysql start 
mysql -u root -p
```
# Docker起動
次は実際に起動手順を書いていこうと思います。
以下で起動可能です！
```docker:docker
$ docker image build -t sample-mysql:v1 .
$ docker image ls
$ docker run --name mysql-container -it sample-mysql:v1
```
以下でShellを実行します。
```terminal:コンテナ
$ source　start_mysql.sh
```
# 最後に
いかがでしたでしょうか。
もし余計なものがあったらすみません。。
ですが、こちらでMySQLが起動できました！
また本当はdockerfileにShellを実行するコマンドも書きたかったのですが、
ちょっとうまくいきませんでしたのでとりあえずはコンテナ内で叩くという方針にしました。。。
今回SQLの勉強をしたいため環境を作ったので別途SQLの記事も書きたいかなと思います！
ExpoからRedux Toolkitを触ってみる

# はじめに
Redux Toolkit(RTK)のできそうなこと
- グローバル変数的なものを作れる
- 色々な画面から値を更新できる

不明なところ
- 全変数をRTKに追加してもいいものなのか？
[Q&A](https://redux.js.org/faq/organizing-state#organizing-state-only-redux-state)


- CreateApiなるものもがあり，他のサイトから接続する時にデータ取得した状態を保持するものっぽい？今は必要なさそうなので後回し

# 触ってみる

[公式HP](https://redux-toolkit.js.org/introduction/getting-started)

## 環境構築

公式ページには
```
npx create-react-app my-app --template redux-typescript
```
とあるが，npx expo create-expo-appの方にはテンプレートが存在していないみたいなので以下コマンドを実行
```
npx expo install @reduxjs/toolkit
```

## ReduxのEssential

公式ページのチュートリアルをみる前にReduxについて学べと．
そりゃそうだ．
[Redux Essentials, Part 1: Redux Overview and Concepts | Redux](https://redux.js.org/tutorials/essentials/part-1-overview-concepts)

ページに飛んでみると
>前提条件
> HTML と CSSに精通していること。
> ES6 の構文と機能に精通している
> React 用語の知識: JSX、State、Function  Components、 Props、およびHooks
> 非同期 JavaScriptとAJAX リクエストの作成に関する知識

そうかそうか．
なんとかなるでしょう．飛ばします．
「スピール溝」とは ── 日本一わかりやすい解説

# 背景
学校のCAD課題で図面上に「スピール溝」という見慣れない指示を目にしたが、インターネットの海を彷徨っても情報がほぼ皆無（本記事執筆時点でGoogle検索のヒット2件）であったため、本記事の公開に至った。

<img width=75% alt="スピール溝の検索結果" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571095/1a56d9ae-c44c-f950-444a-71c8da275941.png">

上述した2件の検索結果は、それぞれ1972年と2007年に公開された文献であり、ともに用語についての説明はされてない。
よって本記事は「スピール溝」という用語について解説した唯一のインターネット記事となる（執筆時点）。

# 結論
スピール溝とは、下図のような菊座金（歯付座金／ベアリングワッシャ）の舌（内径側に付いている突起）を噛み合わせるため、軸に対して施される溝のことである。

<img width=50% alt="菊座金" src="https://www.nikki-tr.co.jp/images/lock_nuts2/main_img_AW.jpg">

出典: https://www.nikki-tr.co.jp/html/lock_nuts2_AW.html

# 使用目的
ラジアルベアリングを軸に固定する手段の一つにベアリングナットを用いる方法がある。しかしベアリングナットはねじによって締結されているだけなので、軸の回転により緩みが発生する。

この問題を回避するため菊座金を使用する。べアリングとベアリングナットの間に菊座金を挟み、外径側の歯をベアリングナットの溝に、内径側の舌をスピール溝に噛み合わせることで、ベアリングナットの回転は軸と完全に固定され、ねじの緩みを防止することができる。

<img width=75% alt="組立図" src="https://www.fun.co.jp/u-town/common/upload/files/products/FINE%20U-NUT/FU%E5%BE%93%E6%9D%A5%E5%93%81%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%832.png">

出典: https://www.fun.co.jp/u-town/products/fine-u-nut/

# キー溝との違い
スピール溝と同じような機能を持つものとして、キー溝がある。
軸との締結にキーを用いる場合はキー溝、菊座金を用いる場合はスピール溝と呼ぶようだが、後者も含めキー溝としている資料もあった。

キー溝は JIS B 1301:1996 によって規格が存在するが、スピール溝には規格の存在が確認できなかった。[ミスミのサイト](https://cp.misumi.jp/tech/tech18.html)では「歯付座金具溝」として軸径に対する寸法が記載されているので、設計の際にはこちらを参考にするのが良いだろう。

# 不明点
「スピール溝」の語源については今回の調査では明らかにならなかった。「キー溝」は「キー」をはめ込む溝であるが、スポール溝にはめ込まれる菊座金または菊座金の舌部分が「スピール」と呼ばれている事例は確認できなかった。

スピールの外国語表記も不明である。英語で「スピール」と発音しそうなスペル（spealやspeel, spielなど）で、washer, keywayといった関連用語ともに検索をしてみたが、有益な情報を見つけることはできなかった。

平行キーのことを「スッピル」と呼称することがあるそうだが、これとの関係の有無も不明である。

# まとめ
スピール溝と呼ばれる構造について、その形状や機能を理解することができた。一方、スピール溝という呼称は（少なくとも現在では）一般的ではないため、極力避けるべきである。

キー溝によく似た機能を持ち、実際にキー溝と呼ばれることも多いため、これに倣い「キー溝」と呼称するのが妥当だと思われる。キー溝との区別が必要な際は「歯付座金溝」と呼んでも良いだろう。

また明確な規格が存在しないため、キー溝と異なる寸法を適用したい場合には詳細な寸法を図面上に指示するのが望ましい。

スピール溝についてより詳細な情報をお持ちの方は、コメント等で是非ご教授いただきたい。
SwiftUIでスプラッシュ画面を実装してみた

## はじめに
今回、アプリの初期起動時のみに表示される画面を実装したので、メモします。

## 実装方法
やったこととしては、とてもシンプルで画面起動時にContentView内で分岐処理をして切り替えただけです。

``` swift:code
import SwiftUI

struct ContentView: View {

    @State private var isLoading = true
    @State var selectedTag = 1

    var body: some View {
        if isLoading{
            // 画面起動時に呼ばれる
            // StartUpViewは、別で作ったViewになります
            StartUpView().onAppear {
                // 画面が起動してから1.5秒後に[isLoading = false]を代入
                DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
                    withAnimation {
                        isLoading = false
                    }
                }
            }
        }else{
            TabView(selection: $selectedTag){
                HomeView().tabItem {
                    Image(systemName: "house")
                    Text("ホーム")
                }.tag(1)
                ShopMapView().tabItem {
                    Image(systemName: "map")
                    Text("アクセス")
                }.tag(2)
            }
        }
    }
}
```
## 実装画面

![beautyMovie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072069/ac2a05ec-15ca-4758-acf4-9c1dcb368564.gif)

## おわりに
上手くできてよかったです:blush:

**参考記事**
https://qiita.com/uhooi/items/ce31c80b7f5035e20be7
【HTML】初期テンプレート

```html
<!DOCTYPE html>
<html lang="ja">
   <head>
     <meta charset="utf-8">
     <title>サイトタイトル</title>
     <meta name="description" content="ディスクリプションを入力">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <link rel="stylesheet" href="style.css">
     <!--<script src="index.js"></script>-->
  </head>
  <body>
  
  </body>
</html>
```
Djangoの開発で突如出てきた__eq__メソッドとは

## テーマ

私は普段Djangoを用いてCDPの開発を行っています。

そこで遭遇した`__eq__`メソッドについて調べたので備忘録として記載します。

## 環境

||バージョン|
|---|---|
|Django|3.1.1|
|Python|3.8|

※バージョン自体少し古めです。。。

## __eq__メソッドとは

`__eq__`メソッドとは、Pythonに標準で用意されている特殊メソッドのことです。

よく使用されるものは下記のようなものがあります。

- `__init__` → クラスの初期化に使用
- `__str__`　→ クラスオブジェクトを文字列で表示

上記の他にも多くの特殊メソッドが存在します。

では、`__eq__`はどういったメソッドなのでしょうか。

結論から言うと、**クラスオブジェクトを何によって等価であるとみなすかを設定するメソッド**です。

通常オブジェクトを比較する場合、下記のようにメモリアドレスから判断します。

```py
class Person:
    def __init__(self, first_name: str, last_name: str) -> None:
        self.first_name = first_name
        self.last_name = last_name

if __name__ == "__main__":
    person1 = Person("taro", "tanaka")
    person2 = Person("taro", "tanaka")
    print(person1) # => <__main__.Person object at 0xffffb0c33a90>
    print(person2) # => <__main__.Person object at 0xffffb0c33810>
    print(person1 == person2) # => False
```

もちろん上記の通り`person1 == person2`は`False`なります。

`0xffffb0c33a90`がメモリアドレスとなっており、Pythonはこの**メモリアドレスの値によってオブジェクトが同じかどうかを判断**します。

今回の場合、`0xffffb0c33a90`と`0xffffb0c33810`は異なっているため判定は`False`になります。

しかし、下記のように`__eq__`メソッドで等価の条件を設定すると

```py
from __future__ import annotations


class Person:
    def __init__(self, first_name: str, last_name: str) -> None:
        self.first_name = first_name
        self.last_name = last_name

    def __eq__(self, other: Person) -> bool:
        return self.first_name == other.first_name and self.last_name == other.last_name


if __name__ == "__main__":
    person1 = Person("taro", "tanaka")
    person2 = Person("taro", "tanaka")
    print(person1) # => <__main__.Person object at 0xffffb0c33a90>
    print(person2) # => <__main__.Person object at 0xffffb0c33810>
    print(person1 == person2) # => True
```

上記のように作成されたオブジェクトのメモリアドレスは異なっているが、`first_name`と`last_name`が同じなので等価であるとみなされます。

このようにメモリアドレスではなく、等価の条件を決めることができます。

## まとめ

いかがだったでしょうか。

Pythonは今回のような特殊メソッドがそれなりに多く存在するので都度調べながら開発しています。

もし実務で知らない特殊メソッドが再度出てきたら備忘録として記載したいと思います。

最後まで読んでいただいて有難うございました！

これからももっと技術に強いエンジニアを目指します！
Vimの基本操作

# はじめに
### 本記事を読んでほしい方
- Vimの操作に慣れていない駆け出しエンジニア

### なぜVimについて知る必要があるのか
Vimとは、多くのLinuxに入っているテキストエディタです。最近では、VScodeなど便利なエディタが登場し、必要ないと思う方もいるかもしれませんが以下の理由でVimの知識は必要です。

- **サーバーの環境構築やバージョン管理ツールの設定ファイルを編集する際**

私も最初、アプリ開発でエラーに遭遇した際、Vimでの編集が求められ困ってしまった記憶があります^^;
Vimの操作は独特で、コマンドの種類も多いので最低限抑えたい方が良いものを厳選して紹介したいと思います。

# Vimの基本的なコマンド操作
### ファイルを開く、 保存 ・ 終了
| コマンド | 実行結果|
|:-:|:-:|
|vim|vimを起動 (開く)|
| vim + ファイル名  |ファイルを指定して開く   |
|:w   |上書き保存   |
| :w ファイル名  |名前を付けて保存  |
| :q  | 終了  |
|:wq   |保存して終了   |
|:q!   |保存せずに終了   |
### モードの切り替え
|コマンド | 実行結果 |
|:-:|:-:|
| i  | 挿入(編集)モード  |
| esc  |ノーマルモード   |
| :  | コマンドモード  |
| v  | ビジュアルモード  |

各モードについてわからない方は[こちら](https://zenn.dev/mo_ri_regen/articles/vim-four-modes)をご覧ください。

### カーソル移動 (ノーマルモードでの)
| コマンド | 実行結果 |
|:-:|:-:|
|k   |上に移動   |
|j   |下に移動   |
|h   |左に移動   |
|l   |右に移動   |

### コピー&ペースト
| コマンド | 実行結果 |
|:-:|:-:|
| yy  | 現在いる所にコピー  |
| P  | 現在いる所にペースト  |
| p  | 下にペースト  |

### 削除
| コマンド | 実行結果 |
|:-:|:-:|
| x  |1文字削除   |
| dd  | 1行削除  |
| dw  | 単語の削除  |

# 最後に
より詳しくVimについて知りたい方は以下の記事や講座に目を通してみると良いと思います。最後まで読んでいただきありがとうございました！

https://qiita.com/hide/items/5bfe5b322872c61a6896

https://knowledge.sakura.ad.jp/21687/

https://www.udemy.com/course/vim-tmux-zsh/
pip install cryptographyでエラー（Docker alpine）

# 前提
cryptographyは、manylinux wheelsを提供しています (2.0以降) ので、すべての依存関係が含まれています。 pip 19.3以上のユーザー (またはpypyを使用していない場合はPython用のヘッダー、OpenSSLおよびlibffiライブラリ用のヘッダーが必要です) が、manylinux2014 (またはそれ以上) 互換のディストリビューション上で実行されている場合、以下のように実行するだけで動作します。
```bash
pip install cryptography
```

# Alpineの場合
Alpineでは、Rustをインストールする必要があります。

```
apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo pkgconfig
```

openssl-devがエラーになる場合はlibressl-devを使用する必要があります。

その後、
```bash
pip install cryptography
```
TextMeshProではPaddingの値に気をつけよう

## TL;DR

TextMeshProで生成するフォントアセットのSampling Point Sizeの設定によっては、
思わぬ表示不具合を引き起こすことになってしまう。

Unity公式がお勧めするのが、 **Sampling Point Size / Padding = 10 という比率**である。例えば、SPS=50で作ったらPaddingは5だ。

https://forum.unity.com/threads/text-mesh-pro-box-around-text-unwanted-effect-bug.665647/


## 問題

TextMeshProでは、TMPで扱いたい通常のフォントを一度「Font Atlas」と呼ばれるテクスチャアセットに対して書き出してそこから表示する。
この事前の書き出しを行うときに使うフォントサイズを設定することができる。それが**Sampling Point Size**であり、これが表示時のフォントサイズの一種の限界となるようだ。当然大きくするほど大きなアトラスサイズ(=アセットのディスク上の大きさ)が必要となるが、フォントが綺麗に描画されるなどのメリットがある。

そこで、あるフォントを極限まで綺麗に表示したいからと言って、極端に大きなSampling Point Sizeを指定したとしよう。すると、こんなことが起こる。

[![大きなSampling Point Sizeのフォントに「文字を囲むような半透明の箱が表示される」という不具合が起こる様子](https://i.gyazo.com/d09b237d41dafa8e1f0766ee1f81c607.png)](https://gyazo.com/d09b237d41dafa8e1f0766ee1f81c607)

...:interrobang:

> もちろん、このテキストを表示するにあたって、マテリアルの変更などの文字の装飾は一切していない。

## 環境

Unity 2021.3.6f1
TextMeshPro v3.0.6

## 再現手順

今回はM+ Font (2p) を使って検証する。

https://fonts.google.com/specimen/M+PLUS+2?query=m+plus

### 1. Font Assetの生成
M+ 2p フォントを極限まで綺麗に表示するためにアトラスサイズを最大まで引き上げてみよう。 ~~よいこのみんなは真似しちゃダメだぞ~~

[![大きなAtlasで生成した場合の表示](https://i.gyazo.com/5685a6f53ebc7d0671ff2c0213b6ee88.png)](https://gyazo.com/5685a6f53ebc7d0671ff2c0213b6ee88)

フォントアセットを生成すると、必ずレポートが出てくる。これを見ると、SPSは **1394** だ。

これとは別に、アトラスサイズ 256x256、Sampling Point Sizeは自動、生成範囲はASCII文字セットでフォントアセット化してみよう。

[![小さなAtlasで生成した場合の表示](https://i.gyazo.com/640a3c5c357369f315cab34b20a38c56.png)](https://gyazo.com/640a3c5c357369f315cab34b20a38c56)

レポートによるとSPSは **23** となったようだ。

### 2. 比較検証

フォントアセット以外の全ての設定が同じである２つのTextMesh Proコンポーネントを上下で並べると、こうなる。

[![大きなAtlasで生成したフォントと小さなAtlasで生成したフォントを比較している。意外にも、大きなAtlasで生成したフォントの方には文字を囲む半透明の箱が表示されるという不具合が起こった](https://i.gyazo.com/5e494ea076148bc9c5f5ddb064151cdf.png)](https://gyazo.com/5e494ea076148bc9c5f5ddb064151cdf)

極限まで綺麗に表示しようとせっかく大きなアトラスに書き込んだフォントが、見事に事故っている。

## WHY?

この問題は[Unityのフォーラム](https://forum.unity.com/threads/text-mesh-pro-box-around-text-unwanted-effect-bug.665647/)でも話題になっているのだが、極端に大きいアトラスサイズに合わせて大きくなったSPSのせいで、書き込んだフォント同士の距離(= Spacing)が小さくなりすぎるという現象が起こったことによるものだそうだ。なぜSpacingが足らないとこんな描画結果になるのかは詳しくはわからないが(隣にレンダリングされたグリフのデータが漏れた？)、Spacingは十分取らないといけないようだ。

https://forum.unity.com/threads/text-mesh-pro-box-around-text-unwanted-effect-bug.665647/

同じフォーラムのスレッドでは、 **Sampling Point Size / Padding = 10** がおすすめされている。実はこの値は生成レポートに `SP/PD Ratio`として表示されていたのだ。この部分の数字が10%前後であるのが良いらしい。

Sampling Point Sizeは最初にTextMeshProを導入した時には `Auto Sizing` として登録されているが、これはAtlasの大きさに応じて調整してくれる、という意味である。それに対してPaddingは自動に設定する設定がなく(最大64)、見落としがちではある。  
よほどのことがない限りは、ASCIIの範囲であれば512四方 ~ 1,024四方にしておけば自動設定でも問題になることはないだろう。  
もしくは、SPSを`Custom Size`に設定し、自分で `Sampling Point Size / Padding = 10` になるような数値にしてから、Atlasのスペースが無駄にならないサイズを探すのも良い。

[![自分でSP/PD比を設定した場合の例](https://i.gyazo.com/baad5747added05a5fc9dd6a0ea707e1.png)](https://gyazo.com/baad5747added05a5fc9dd6a0ea707e1)
(自分でSP/PD比を設定した場合の例)
Kubernetesに腰を据えて入門する方向けのロードマップ


## 背景

最近、「コンテナはもうわかってきたので、これからKubernetesについて腰を据えて勉強したいが、どのように勉強すればいいかわからない」という相談をいただくことがすごく多くなった。

必要に応じて必要なリソースの挙動などを調べてきたし、僕自身も知らないことばかりなので、全てを伝えることはできない。

とはいえ、「入門しにくいサービスが伸びにくい」というのは、間違いないので、Kubernetesに入門する上でこの順番で学習したら、基本的な内容を身につけられるのではないかというロードマップを一つ公開しておくことで、これから業務でKubernetesを理解していく必要がある方の最初の一歩を助けられるかもしれないと思い、公開する事とした。(このQiitaのリンクを渡すだけで質問に回答できるという状態を作りたいという観点もある。)

自分の今の、Kubernetesに対する理解をうまく表現できているリソースを満遍なく集めてきたつもりだ。
全部で6ステップとなり、この6ステップを一通り進めれば、「Kubernetes完全に理解した」と言ってもいいレベルになれるのではないかと思っている。

ここでは、Argo CD(GitOps)やIstio(サービスメッシュ)などのKubernetes周りののエコシステムについては含まれていない。それらは別途調べる必要があることも予め断っておく。
あくまでも、Kubernetes本体の原理と使い方に着目している。

## ロードマップ


1. [プラットフォームの上でものを作るということ](https://toris.io/2019/12/what-i-think-about-when-i-think-about-kubernetes-and-ecs/)（難易度：なし）
   1. 元AWS JPのトリさんがECS/EKSを比較したブログ。k8sに入門する前に絶対に一度は読んでおくべき。
2. [CKA取得](https://qiita.com/riita10069/items/da4d8d19fc1f1cbed283)（難易度：★★） 
   1. Kubernetesのリソースの最低限の使い方を一通り抑えられる良試験 
   2. 4択じゃなくてクラスタ操作系の試験 
   3. 試験対策には、[Udemy](https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/) を受講するのがおすすめ
   3. 僕がKubernetesを初めて学んだ書籍の[Kubernetes完全ガイド](https://amzn.asia/d/0qft2Gc)はとてもわかりやすかったので、CKA取得に際してぜひ読んでいただきたい。
3. [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way)（難易度：★★） 
   1. Kubernetesクラスタをただ立ち上げるだけのワークショップだが、kubeadmやEKSなどのツールを使わない。 
   2. ハイレベルアーキテクチャを理解することができる 
   3. 手順をなぞるだけで終わってしまうと勿体無いので、CKA取得後推奨 
   3. [日本語はこちら1](https://springmt.github.io/kubernetes-the-hard-way-ja/kubernetes_the_hard_way/#0)
   3. [日本語はこちら2](https://github.com/inductor/kubernetes-the-hard-way)
4. [Kubernetes Resource Model](https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/resource-management.md) （難易度：★）
   1.  Kubernetesが他のPlatformと大きく異なる部分であるAPI Centricなアーキテクチャを取り入れているという部分に着目されたKDP 
5. [Borg, Omega, and Kubernetes](https://queue.acm.org/detail.cfm?id=2898444) （難易度：★★★）
   1.  Kubernetesの前身となるBorgがなぜ生まれたのか、どんな取り組みをしてどのような失敗を乗り越え今の形になったのかということについて述べられている論文 
   1.  [日本語はこちら](https://blog.inductor.me/entry/2019/10/29/233837)
6.  [Programming Kubernetes](https://www.amazon.co.jp/Programming-Kubernetes-Developing-Cloud-native-Applications/dp/1492047104) （難易度：★★★★）
    1. Kubernetesを使った開発についてサンプルコード付きで学べる実践的な書籍
    1. フレームワークありきではなく、フレームワークの内部で何をしているかまで書かれている貴重な書籍
    1. 339ページしかなく、意外と量は少ない
Cannot run program "git": error=2, No such file or directory というエラーを解消した方法

今回はAndroidStudioで プロジェクトをビルドした際ビルドエラーになったものを解消した方法を記事にします。
色々検索をかけた内容では　この方法が出てこなかったため、今後のためにも記事に残しておきたいと思います。
もしこの記事を参考にする人は、他の方法を試してからでもいいかもしれません。



# 解決方法
AndroidStudio上方のメニューの中から **Tools**→**SDK manager**→**Android SDK**→**SDK platforms**と進みプロジェクトに必要なSDK インストールします



![スクリーンショット 2023-02-03 18.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/d5df5195-390f-8bec-b6ec-8fa9cdf3fb51.png)


![スクリーンショット 2023-02-03 18.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/972c6d9e-5771-95c1-e30a-dc51ed4f0bbd.png)

この後、同じく上方のメニューFile→Invalidate caches...　や　Build→Clean projectなどをした結果
ビルドが通るようになりました
Tera Termマクロでランダムなパスワードを生成する(サンプル)

# Tera Termマクロでランダムなパスワードを生成する

Tera Termマクロでランダムなパスワードを生成したサンプルです。
```bash:randompw.ttl
length=10
alphabets='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
strlen alphabets
alphabetslen=result
password=''
randomchar=''
for i 1 length
  random pos alphabetslen
  strcopy alphabets pos 1 randamchar
  strconcat password randamchar
next
inputbox 'パスワードは' 'パスワード生成結果' password
```
flaskでとても簡易的なECっぽい何かを作ってみました 其ノ壱

# tl;dr
* Flask x Bootstrapを使ってECっぽい何かを作ってみました。
* ECサイトを作りたかったわけではなく、今後Webアプリケーションを作る前に、アプリ作成 > Web上にDeployを流れとして体験したかったです。ただ結果としてECを作成してみることはいい勉強になりそうだと思いました。


## What I did?
 * Flask x Python x Bootstrapを使った簡易なWebサイトを作成しました
     * index, checkout, thanksの3枚で簡易なECサイトを模しています。
 * 所要時間はおおよそ2日(金曜夜〜日曜夕方)
 * 一番時間がかかったのがBootstrapとJavaScriptでした...

![Screen Recording 2023-02-05 at 5.48.35 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/336aa60a-0ab1-c9f0-86f0-17f1a5d394f4.gif)


## Why I did?
先日までは初めてのアプリケーションとして、数字をSortするアプリケーションを作っていました。そちらがひと段落したので、今週末は何か新しいものを作ってみようと思い、Flaskを使ったWebサイトに挑戦してみました。以前、少しだけNode.jsを勉強した際に触ったことがあったFlaskを2年ぶりに使ってみることにしました。
一番時間がかかったのが、HTML x JavaScript x Bootstrap でした、、、あくまで動かしてみることがポイントだったため、最低限の外見となっています。Deployは無料サービスが終わったHerokuではなくRender.comを試してみることにしました。

---
### 小噺
(エンジニア見習い ZawaP)
　　　　「この間初めてのアプリを完成させたぞ！」
　　　　「なんだかんだすごく時間がかかったけど、それなりに満足いくものができた気がする、、、」
　　　　「この調子で、さらにレベルアップを目指してみるか、、、しかし何を作ろう、、、」
　　　　「うーん、特に今すぐ実現できるアイディアもないし、WebアプリとしてECでも作ってみるか」
　　　　「過去に`Node.js`少し触ったことあるし、`HTML`や`CSS`ならそんなに時間もかからないだろう^^」

　　　　ーーモクモクモクモクーー

　　　　「つ、、、辛い、、、、予想以上に時間がかかったし、なんか気を抜くと、、もう一人のボクが”なんでこれ作ってるの”って聞いてくる、、、、」
　　　　「いや、`html`も`bootstrap`も久々に書いたらほぼ全部忘れてた、、、しかも`flask`の環境づくりに意外とつまづいた。。。。」
　　　　「でもなんとかそれっぽく動くものができたぞ、、、`Render.com`を使ってDeployもできたし、、、」
　　　(続く？)

---
## 感想 & Next Step
* 今回、Webサービスを作りましたが、HTMLやBootstrapはできるだけ使い回ししないと時間が溶けるなと思いました。基本的には今後もPythonをメインに勉強していきたいため、HTMLやJavaScriptの比重はそこまで増やしたくはないです。そのため、今回作成したものを使い回していくことにします。
* とはいえECサイト作成は良い練習になると思うので、DBとの連携など含め機能追加は今後もしていきたいと思います。その次はToーDOアプリとかでしょうか
    * * 個人的には写真と写真内の位置情報を連携させてMap上に表示するアプリを作りたいのですが、今の状態ではまともに作成できないかもしれません、、、
* Skill的なことを考えると機械学習周りを勉強していくことも考えられますが、何がいいのでしょう、、、もしおすすめあれば教えていただけると大変嬉しいです。(現在、非エンジニアですが、1年以内にエンジニア、もしくは関連職に転職することが目標です)
canvasの使い方（備忘録）

# はじめに
HTMLのcanvasでゲーム等を作る際に必要な機能を自分向けにまとめました。
（下のソリティアで必要だった機能が主です）

https://itsuki-jp.github.io/solitaire/

（ぜひ遊んで見てください、バグがあるらしいです(-_-;)）
（条件がわからないので、見つかった方は教えてもらえると助かります！！！）

# 前提
- canvasが既にHTMLにある
```html
<canvas id="canvas"></canvas>
```
- Javascriptのコードが以下のように、HTMLで読み込めるようになっている
```html
<script src="./index.js"></script>
```

https://developer.mozilla.org/ja/docs/Web/HTML/Element/canvas

# 機能たち
## Javascript上でcanvasを扱えるようにする
```js
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
```

## 画面サイズを変更する
```js
canvas.height = 1000; // 高さを1000に
canvas.width = 1000;  // 横幅を1000に
```

## 四角形を描く（塗りつぶす）
```js
ctx.fillStyle = "green"; // 色を緑に
ctx.fillRect(0, 0, 100, 200); // 左上の座標(0,0)から幅100、高さ200の四角形を描く
// ctx.fillRect(x, y, w, h);
```

https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/fillRect

## 四角形を描く（塗りつぶさない）（枠線のみ）
```js
ctx.strokeStyle = "green"; // 色を緑に
ctx.rect(0, 0, 100, 200); // 左上の座標(0,0)から幅100、高さ200の四角形を描く
// ctx.rect(x, y, w, h);
ctx.stroke();
```

https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/stroke

## 四角形の枠を点線にする
```js
ctx.beginPath();
ctx.setLineDash([3,5]);  // 線の長さと間隔
// ctx.setLineDash([]);  ←実線
// ctx.setLineDash([3]); ←線の長さ、間隔が同じになる 
ctx.rect(0,0,100,100);
ctx.stroke();
```

https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/setLineDash

## 文字を書く（塗りつぶす）
```js
ctx.font = "15px serif"; // フォント、サイズを指定
ctx.fillStyle = "green"; // 塗りつぶす色を指定
ctx.fillText("hoge", 0, 0); // 塗りつぶされた文字を描く
```

https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/fillText

## 文字を書く（塗りつぶさない）（枠線のみ）
```js
ctx.font = "15px serif"; // フォント、サイズを指定
ctx.strokeStyle = "green"; // 枠の色を指定
ctx.strokeText("hoge", 0, 0); // 文字の輪郭のみを描く
```

https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/strokeText

### 文字を描写する際の座標について
https://www.wabiapp.com/PronamaStudy/html/html_filltext.html 

上の記事がすごくわかりやすい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627437/0795afe2-5bcc-606f-2dcf-c4db106ada61.png)
(とりあえず、公式の画像)

## クリックされた座標を取得
ごちゃごちゃと座標を変換する必要があります。
```js
function getClickPos(e) {
  const rect = e.target.getBoundingClientRect();

  const viewX = e.clientX - rect.left;
  const viewY = e.clientY - rect.top;

  const scaleWidth = canvas.clientWidth / canvas.width;
  const scaleHeight = canvas.clientHeight / canvas.height;

  const canvasX = Math.floor(viewX / scaleWidth);
  const canvasY = Math.floor(viewY / scaleHeight);
  
  return [canvasX, canvasY];
}
```
# 最後に（？）
これからも、何かしら作っていきたいですね
春休み、一人ハッカソンします！！！
【Unity】NRealで録画しようとすると「Permission Deny」と出る

# はじめに
こんにちは、ユーゴです。今回は、NRealの開発をしていたときに起きた問題を紹介します。
ゲームのデモ動画を撮ろうとした時、「VideoCaptureExample」を導入したまでは良いが、録画しようとすると「Permission Deny」と出てエラーが出ました。小一時間調べましたが解決策は出ず、自力でAndroidのPermission(権限)の設定を調べて直しました。

# 環境
Unity 2021.3.4f1
NReal Light (dev kit)

# 問題
NRealで録画しようとすると「Permission Deny」と出る。

# 解決
AndroidManifest.xmlに権限を記述します。

(1) UnityのProjectウィンドウの「Assets > Plugins > Android > AndroidManifest.xml」を探して開きます。なければこの通りのディレクトリとファイルを作成します。
(2) AndroidManifest.xmlの中はたぶん以下のようになっていると思います。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
  <uses-sdk tools:overrideLibrary="com.nreal.glasses_sdk" />
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@mipmap/app_icon" android:label="@string/app_name">
    <activity android:name="com.unity3d.player.UnityPlayerActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <meta-data android:name="nreal_sdk" android:value="true" />
    <meta-data android:name="com.nreal.supportDevices" android:value="NrealLight|NrealAir" />
  </application>
  <uses-permission android:name="android.permission.BLUETOOTH" />
</manifest>
```

人によって違う可能性は大アリですが、htmlのようなのが書かれていればOKです。
とりあえず、下から2行目(\<uses-permission android:name="android.permission.BLUETOOTH" />と</manifest>\</manifest>の間)に以下を追加します。

```xml
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ここまでで、1回録画に挑戦してみてください
→うまくいった：完了
→うまくいかない：(3)へ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

(3) もし録画を開始して画面が暗転したままの場合、「許可しますか？ Yes/No」みたいなのがAndroid表示されている可能性があるため、グラスからだと見えません。

・スマホと接続：そちらのスマホに「許可しますか？ Yes/No」みたいなのが表示されていないか見ます。あればYes(許可する)を押します

・DevKitと接続：SCRCPYをインストール→エミュレータ起動→「許可しますか？ Yes/No」が出てないか見ます
SCRCPYのインストールは以下を参考にしてください。
[だれでもできる！Nreal Lightアプリ作成入門](
https://synamon.hatenablog.com/entry/nrealnyuumon#Android%E7%AB%AF%E6%9C%AB%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

Macなら、DevKitを接続し、ターミナルで「scrcpy」と打つだけで起動できます。

# まとめ
いかがだったでしょうか。今回は、Nrealで開発している時に録画できない問題が発生したので、解決策を紹介しました。
このように、プログラミングに関するニッチな情報から、よくあるプログラミングの躓きポイントなど幅広く紹介していきます。
お役に立てましたら、いいね・LGTM・フォローの方お願いします！
【Vim】indentLineの導入方法

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Git 2.39.0
* Vim 8.1.3741
* Yarn 1.22.19

# 設定ファイルを編集
以下のように編集して、Vimを再起動します。
* 編集前
```~/.vimrc
call plug#begin()
call plug#end()
```
* 編集後
```~/.vimrc
call plug#begin()
Plug 'Yggdroot/indentLine'
call plug#end()
```

# indentLineをインストール
:PlugInstallでindentLineをインストールします。
```vim
:PlugInstall
```
以下のように表示されたらインストール完了です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/e48962e3-9157-dc93-1708-245a18ab6b21.png" width=50%>

# スクリーンショット
インデントが｜で表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/e98ce7a7-1e5d-f9cf-8cb5-10a18c9eee10.png" width=50%>
AEのスクリプトに追加されたように見えるJSONやポリフィルの罠

AEのスクリプトはES3準拠。しかし何時からかスクリプトに標準でJSONが使えたり、配列にmapやfilterやindexOfが使えるようになっている...？
実際に使えるようになっているのですが、実はここには大きな落とし穴が。

```js:Array.mapで配列のすべての数値を2倍にする
(function(){
    var a = [1, 2, 3];
    var b = a.map(function(d){return d * 2});
    $.writeln(a);
    $.writeln(b);
}());
```

```console:実行結果
1,2,3
2,4,6
結果 : undefined
```

前述のとおりAEのスクリプトはES3準拠なので配列に関してはいわゆるポリフィルが行われているのですが、このポリフィルが行われているタイミングに問題があります。

ポリフィルがどこで行われているかというと、AE2023の場合標準の拡張機能であるCCライブラリのファイル群である
`C:\Program Files\Adobe\Adobe After Effects 2023\Support Files\Libraries\jsx\shims.jsx`
というファイルで、isArray、indexOf、filter、mapがポリフィルされてるのですが、このファイルは
<strong>CCライブラリを開いたときに実行される</strong>ようになっているのです。

:::note warn
CCライブラリを開くとポリフィルされるということは、AEを終了するときにCCライブラリが開いた状態になっていると次回起動時もCCライブラリを開くのでポリフィルされるのですが、CCライブラリを閉じた状態でAEを終了すると次回起動時にCCライブラリを開かないのでポリフィルされないということになります。
AE起動後に一度でもCCライブラリを開くとその後CCライブラリを閉じても大丈夫なのですが、次回起動時にはCCライブラリが開かないのでポリフィルされません。
:::

このせいで自分のPCで動作しても他人のPCでは動作しなかったり、ある日自分が書いたスクリプトが動かないという現象が発生します。

`Folder.appPackage`でSupport Filesフォルダまでを取得できるので、CCライブラリがあるAEをターゲットとするなら、下記のように自分のスクリプトから呼び出してしまうというのもありだと思います。

```js
var shims_file = new File(Folder.appPackage.fsName + '/Libraries/jsx/shims.jsx');
if(shims_file.exists) $.evalFile(shims_file);
```

ポリフィルだけではなくCCライブラリを開くとJSONも使えるようになっており、AE2023では以下の場所にあります。
`C:\Program Files\Adobe\Adobe After Effects 2023\Support Files\Libraries\jsx\json2.jsx`
標準でJSONが使えると思わせておきながら使えるようになっているのはCCライブラリを開いているおかげという罠が用意されているので以下のようにしておくのもよいかもしれません。

```js
var json_file = new File(Folder.appPackage.fsName + '/Libraries/jsx/json2.jsx');
if(json_file.exists && (typeof JSON !== 'object')) $.evalFile(json_file);
```

JSONはjson2.jsをそのままincludeして使ってる人も多いと思うのであまり問題は無さそうですが、標準で使えると思わせてる罠にひっかかると配布時にややこしいことになるので気を付けてみてくださいー。

### 追記
:::note warn
拡張機能用のフォルダC:\Program Files\Common Files\Adobe\CEP\extensionsに各AEバージョンごとのCCライブラリの実態が入っているようで、その中にあるjsxフォルダにもshims.jsxやjson2.jsxが入っているようです。
もしかしたらこっちのほうを実行しているのかもしれないですが、CCライブラリを開かないとポリフィルもJSONも有効にならないのは変わらないようなので上記対応でも問題ないと思います。
:::
Rust記法メモ

Rustで知らなかった記法のメモをひたすら残していきます。

### 積算時のoverflow
```rust
let a: u8 = 100;
let b: u8 = 100;

let c = (a * b) as u64;

let d = (a as u64 * b as u64);
```
積算のタイミングでoverflowするのでcはエラーになる。

### 存在型
返り値でクロージャを返す。

```rust
fn even_numbers() -> impl Iterator<Item = i32> {
    (0..).map(|x| x * 2)
}

fn main() {
    println!("{:?}", even_numbers().take(5).collect::<Vec<_>>()); // [0,2,4,6,8]
}
```
even_numbers()は偶数をひたすら無限に返すクロージャ。
take(5)はiteratorから最初の要素5つをとる。

こうやって遅延評価するの面白い。

### windows関数
sliceから指定長さ分の要素を取り出す関数
```rust
let arr = vec![1, 2, 3, 4, 5];
for e in arr.windows(3) {
    let (first, second, third) = (e[0], e[1], e[2]);
    println!("{} {} {}", first, second, third)
}
// output
// 1 2 3
// 2 3 4
// 3 4 5
```

### any
sliceの中で条件に一致するものが1つ以上ある。
```rust
let arr = vec![1, 2, 3, 4, 5];
arr.any(3); // => true
arr.any(8); // => false
```
rust意外にイテレータの関数たくさんある。
[Rustのイテレータの網羅的かつ大雑把な紹介](https://qiita.com/lo48576/items/34887794c146042aebf1)

### enum
enumを数値に変換する方法
```rust
enum Color {
    Red,
    Green,
    Blue,
}

fn main() {
    let c = Color::Red;
    let n = c as u8;
    println!("{}", n); // 0
}

// 何も指定しなければ、0から始まる。
// 以下のような書き方も可能
enum Color {
   Red = 1,
   Green = 2,
   Blue = 3,
}

```

### HashMap

HashMapを生成する方法
```rust
// Vec型から生成
// word_lists（単語リスト）から出てくる要素の数をHashMapに残す
// ["monday", "sunday", "monday"]なら{"monday": 2, "sunday": 1}みたいな感じ
// foldはJSとかのreduceと同じ
// entry(key).or_insert(value)はkeyがすでに存在すればHashMapのその要素を返し、なければその後のor_insert(value)で新しくkey: valueを作る
word_lists.iter().fold(HashMap::new(), |mut words, str| {
    *words.entry(str).or_insert(0) += 1;
    words
});

// タプルから生成
['A', 'B', 'C'].iter().map(|n| (*n, 0)).collect();

```