OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10でGitHubを始める～①'おまけGitホームディレクトリ変更

個人学習メモ。

本設定は個人的な好みでおこなっているため、不要な場合は本設定は飛ばして次の記事[「Windows10でGitHubを始める～②GitHubアカウント作成」](https://qiita.com/emiki/items/dadf77e9ae1e2b192323)へ。

# 1.ホームディレクトリの変更
Git Bashを起動した際のホームディレクトリはデフォルトで`/c/Users/[ログインユーザ]`となっている。
このままでも問題ないが、Linuxだとデフォルトが`home/`であり、私がそれに慣れているので、今回はホームディレクトリを変更していく。

`Windows+R` で「ファイル名を指定して実行」を開き、`sysdm.cpl`でシステムのプロパティを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b65f507b-107f-0091-359d-87a32ceaec7a.png)
詳細設定タブから環境変数クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/46dc511b-5579-7797-6b3d-24e8db4013bd.png)
`user`のユーザー環境変数　の「新規」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3b9c1b84-0d62-f50c-e8cc-c2b97aa148bc.png)
新しいユーザ変数入力ダイアログが開くので以下を入力しOK。※`C:\home`がない場合は作成する
 - 変数名：HOME
 - 変数値：`C¥home`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/9ef5c314-25b9-288d-5de8-ebdbfdce342e.png)
ユーザー環境変数に`Home`が追加されたことを確認しOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6ff81a7c-1b6a-0c40-5c68-8f200542816c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b9d81448-b93e-598d-57c6-82e47b402644.png)
OKで閉じる。
Git Bashを開き、`pwd`コマンドでホームディレクトリを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5243e145-8c67-c54c-061b-979a9245e361.png)
ホームディレクトリが`/c/home`であることが確認できる。

# 参考
[Windows10でGitHubを始める～⓪Gitの概念とインストールソフトの種類](https://qiita.com/emiki/items/5c8e52cf6b8506015462)
[Windows10でGitHubを始める～①Gitインストール](https://qiita.com/emiki/items/c0aa0b4da4b63921b153)
[Windows10でGitHubを始める～①'おまけGitホームディレクトリ変更](https://qiita.com/emiki/items/d3f7c054b70171218f64)
[Windows10でGitHubを始める～②GitHubアカウント作成](https://qiita.com/emiki/items/dadf77e9ae1e2b192323)
[Windows10でGitHubを始める～③GitHubでのメールアドレス設定とGitクライアントでのユーザ名・メールアドレス設定](https://qiita.com/emiki/items/4103150a5d7a7cfbff24)
[Windows10でGitHubを始める～③'おまけユーザ名・メールアドレス設定について詳細](https://qiita.com/emiki/items/24212696b54fd16e8af8)
[Windows10でGitHubを始める～④リモートリポジトリの作成（GitHub）](https://qiita.com/emiki/items/5080d948af4a2d0febf5)
[Windows10でGitHubを始める～⑤Githubにプッシュする](https://qiita.com/emiki/items/a2871ab626396e95d9ec)
[Windows10でGitHubを始める～⑥-0.Git～GitHub間の認証について](https://qiita.com/emiki/items/eeaf77d51aadef98aea9)
[Windows10でGitHubを始める～⑥-1.Git操作時のGitHub認証HTTPS（Git Credential Manager）](https://qiita.com/emiki/items/3f2ebda7280374fb3bb7)
[Windows10でGitHubを始める～⑥-2.Git操作時のGitHub認証HTTPS（Personal access token）](https://qiita.com/emiki/items/498b05ede19eee3ad916)
[Windows10でGitHubを始める～⑥-3.Git操作時のGitHub認証SSH編](https://qiita.com/emiki/items/1f1fc0bf0c2c4347148d)
[Windows10でGitHubを始める～⑦GitHubへのPullRequest](https://qiita.com/emiki/items/8619441dca761869177f)


https://it-kyujin.jp/article/detail/263/
スプライトとへいれつ実行「こども向けのSnap!かいせつ」

スプライトのボタンを押すと、新しいスプライトをステージに加えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/3b27d45e-5d57-2dcb-215a-0c6552b88031.png)
新しいスプライトはステージのてきとうな所にあらわれて、色もてきとうに付けられます。
それぞれのスプライトはじぶんのスクリプトを持っています。スプライトをクリックすると、スクリプトエリアにそのスプライトのスクリプトが表示されます。スクリプトエリアがどのスプライトのスクリプトを書いているのかはスクリプトエリアの左上にひょうじされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/ec037e51-6eb0-e434-d7e2-a5f64a5a5039.png)

二つのスプライトを作って、一つ目のスプライトには下のようにブロックをおいてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/6539736b-ae5d-93d9-42c1-0ef8e4227e31.png)
二つ目のスプライトには、下のようにブロックをおきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/eaac2225-9fae-1a43-7e6b-69be23743402.png)
緑のはたのマークを押すと、一つのスプライトはぐるぐる回り、一つのスプライトは前後に進むのが分かると思います。このじっけんで、二つのスクリプトがべつべつに動いていることが分かります。これをへいれつ実行やパラレル実行といいます。２つのスプライトは<b>同時</b>に動きます。

へいれつ実行は一つのスプライトのなかの、ふくすうのスクリプトでもできます。一つのスクリプトの中に、下のようにブロックをおいてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/d5b55c78-5220-8641-c806-97de9b59e776.png)
スペースキーを押してみてください。スプライトはずっと円を書くように動くはずです。なぜなら、「うごかす」と「まわる」がへいこうして、同時に起こるからです。プログラムを止めるためには、ツールバーの赤いボタンを押してください。

<h2><a href="https://qiita.com/wordplugin/items/3dd49948bb375811ba14">コスチュームと音</a></h2>
<h2><a href="https://qiita.com/wordplugin/items/143b53f6a12cc8027a6e">ブロードキャストによるスプライト間つうしん</a></h2>

<a href="https://qiita.com/wordplugin/items/4158def39e181110c5bb">戻る</a>
Oracle Cloud InfrastructureのVMインスタンスにSSH経由でVNC接続する

Oracle Cloud InfrastructureでA1インスタンスを確保できたのでVNC接続するために色々試した結果の備忘録です。
マシン環境はARM版Ubuntu20.04です。

1：準備するもの
TightVNC
Termius
RealVNC Viewer




2：ホストの登録
Termiusにホストを登録します。
登録方法は以下の記事を参照してください。

https://qiita.com/Sakathon/items/123ec29b996e1caf32b1




３：デスクトップ環境(LXDE)のインストール
今回はVNCで軽量なデスクトップ環境であるLXDEを使用します。
下記コマンドでLXDEをインストールします。
```
$ sudo apt-get install -y lxde-core
```

４：TightVNCのインストール・設定
下記コマンドでTightVNCをインストールします。
```
$ sudo apt-get install tightvncserver
```
インストール完了後、起動します。
```
$ vncserver
```
初回実行時はパスワードの設定を求められるので6~8桁のパスワードを設定します。
パスワード設定後に閲覧専用パスワードを設定するか聞かれるので n を選択します。
```
Would you like to enter a view-only password (y/n)?
```
VNC Serverが立ち上がってプロンプトが返ってきたら一度VNC Serverを閉じます。
```
$ vncserver -kill :1
```
次にVNC Server起動時に先ほどインストールしたLXDEで立ち上がるように設定します。
```
$ vi ~/.vnc/xstartup

#! /bin/bash
xrdb $HOME/.Xresources
lxsession -s LXDE &
```
保存後に再びVNC Serverを起動します。
```
$ vncserver -localhost
```



４：Port Forwardingの設定
このままの状態ではSSH経由でVNC ServerにアクセスできないのでTermiusにあるPort Forwardingを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/68a1303c-cb49-a1be-b460-95f823af3f29.png)
Termiusのナビゲーションメニューから[Port Forwarding]を選択します。
画面左上の[+NEW]を選択すると設定画面が出るので以下のように設定します。
[Set a label...]　任意の名前
[Host from] Termiusに登録されているホスト一覧が出るのでVNC接続したいホストを選択します。
[Port From] 使用されていない任意のポートを入力します。
[Host to] localhost
[Port to] 5901
[Bind address] 127.0.0.1

入力が終わったら[Set a label...]右にある[→]を押せば閉じれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/3c6872f1-f824-25e7-b5e7-a261fe5cd865.png)
登録した項目をダブルクリックしてアイコンが青くなれば接続完了です。



５：VNC接続
今回はRealVNC Viewerを使用しますが、任意の物を使用しても問題ないと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/84c92d65-96c9-1a62-a3ac-5ba634a2c81f.png)
RealVNC Viewerのアドレスバーに[localhost:5900]と入力し接続してvncserverの初回起動時に設定したパスワードを入力すればVNC接続できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/88a2587e-99af-07f1-96a4-11a75bc57136.png)
スマホアプリ開発 開発手法の違い



# 背景
スマホアプリを作ってはみたいが、色々作る手法がありどれが何が違うかが正直わからなかった。
事前に何で作るかどんなものがあるのかを調べたので簡単にまとめた。

# 前提
クロスプラットフォームでの作成は経験がないので
これから開発にチャレンジした後に、メリットデメリットについては追記する可能性がある。
あくまで現時点の認識した内容を書き留めているため、認識が違うところがあればリクエストください。
それぞれのぱっと見の特徴をあげているだけなので、記載粒度は比較のために粗くしてます。

# 筆者の経験度
Java,C#は現場経験あり。
AndroidJava,Swiftに関しては触りだけ勉強したことがあり。
kotlinはandroidJavaからConvertしたことがあるのでそこまで確認していない。

# クロスプラットフォーム開発とは？
　ワンソースで複数のプラットフォーム（iOS、Android）に対応したアプリを開発できる。
ここではスマホアプリ開発のことだけ書きたいので、スマホアプリ以外の対応プラットフォームについては省略。
# ネイティブアプリ開発とは？
　通常通りプラットフォームによりそれぞれ別の言語で開発が必要になり
　ソースもそれぞれで管理することになる。
　androidアプリ開発であれば、Kotlin。
　iOSアプリ開発であれば、Swift。
　のように別々でソースを作成するため、それぞれで同じ動作や表示を処理するためには別のソースで管理し、書き方ももちろん異なる。

# クロスプラットフォームでの開発
### flutter
開発言語：Dart言語も新しく覚える必要あり
動作確認方法:AndroidStudio,Xcode両方で準備必要
android動作確認：Android Studio、IntelliJ IDEA、Visual Studio Codeで対応可能
使う場合には拡張機能の設定が必要
iOS動作確認：コマンドライン上でそれぞれのIDEで読み込むためのアプリを作成して立ち上げる

### Xamarin
開発言語：C#でそのまま開発できる
動作確認方法:VisualStduioだけで対応可能

### ReactNative
開発言語：Reactベース
動作確認方法:AndroidStudio,Xcode両方で準備必要
android動作確認：このとき拡張機能で動作できるようにする
iOS動作確認：コマンドライン上でそれぞれのIDEで読み込むためのアプリを作成して立ち上げる

# ネイティブアプリでの開発
開発言語：kotlinまたはSwift
androidアプリはAndroidStudio,iOSアプリはXcode両方に分けて開発が必要
動作確認も開発した環境で確認する
kotlinはJavaと親和性が高いため、AndroidJavaで書いたソースをkotlinに置き換える機能もある

# 最後に
今の段階ではそれぞれのメリデリは、その人の得意領域に寄りそう。
私であればC#のスキルがあるため、Xamarinで開発を始めるのがコストが少ないと感じた。
nodenv で指定したバージョンのnodeがインストールできない

# 現象
nodenvを使用してnodeのバージョン管理をしている環境で、`nodenv install xx.x.x` コマンドで、指定したバージョンをインストールしようとすると、下記のエラーが出る。

```
node-build: definition not found: xx.x.x
```

`nodenv install --list` でインストールできるバージョンの一覧を表示させても、欲しいバージョンが表示されない。


# 対処法

下記コマンドを実行し、`node-build` を最新化する。

```
git -C ~/.anyenv/envs/nodenv/plugins/node-build pull
```

再度、`nodenv install --list`を実行して、バージョンの一覧が最新化されているのを確認し、`nodenv install xx.x.x` を実行する。
【第一回】UnityでAndroidゲームアプリを作る ~プロジェクト作成と素材集め~

# 本連載について
- 本連載では、私が趣味で個人開発しているAndroidゲームの作成過程を記録していこうと思っています。
- 作るゲームは2Dの横スクロールアクションにしていこうと思っています。

# 本記事について
本記事では以下の内容を記載します。
1. Unityプロジェクトの準備
1. 使用する素材集め

# Unityプロジェクトの準備
1. Unity hubを開きます。私は[Unity Hub 3.0.1](https://unity3d.com/jp/get-unity/download)を使用しています。
1. Unity Hubを開いたら、「New project」をクリック。
1. 2Dを選択して、右下のProject Settingsに必要事項を入力して、Create Projectをクリック。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/2d186350-9723-6100-ab47-a74b8aec0a17.png)
1. プロジェクトが開いたら、Ctrl＋Shift＋B等でUnityのBuild Settingsを開き、Androidをクリックして右下のSwitch platformを押す。<br/>(※ Android用のプラグイン等をUnityに導入していない場合は、[以前書いたこの記事](https://qiita.com/CPyRbJvCHlCs/items/4a2eaa7ba6c2a8f6da58)のようにセットアップを行う。)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/bc3fba93-d56b-e6ac-2c34-915fd196527d.png)
1. 上記が完了するとUnityが開く。この後色々と追加していきますが、画面の大きさを大体合わせるために、左下のドロップダウンメニューから使用する解像度を選択します。私は自分が使用しているスマホと同じ程度の2160x1080とかを適当に選択しています。<br/>今回は横スクロール的なゲームにしようと思っているので、Portrait(縦向き)ではなくLandscape(横向き)を選択します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/2ff8b524-d615-5944-b112-e8152c79d649.png)
1. 上記でLandscapeを選択していても、Buildしてインストールされると、縦向きにするか横向きにするかはユーザーの設定次第となってしまいます。今回は縦向きはサポートしないので、以下のようにBuild Settings->Player Settings...->Settings for Android->Resolution and Presentationに行き、Default OrientationをAuto RotationからLandscape Leftに変更します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/ff347963-17a2-30df-2b6c-c2ff76d6781c.png)
1. あとは忘れずに、[以前書いたこの記事](https://qiita.com/CPyRbJvCHlCs/items/4a2eaa7ba6c2a8f6da58)のように64bitビルドのみに設定します。これを忘れると、.apkファイルから手元でインストールする分には問題ありませんが、Google Play Storeに申請する際に、64bit対応が必須ですと言われてエラーになります。

# 楽しい素材集め
上記細々とした設定をしたら、続いて大事なゲームの見た目に関わる素材集めです。
1. [Unity Asset Store](https://assetstore.unity.com/)を開きます。
1. 今回は2Dゲームを作ろうと思っているので、背景とキャラ等のセットとして以下の二つのフリー素材を使うことにしました。それぞれのページを開くと、フリー素材であれば「Add to My Assets」というボタンがあると思うので、そちらをクリックします。
    1. [Free 2D Cartoon Parallax Background](https://assetstore.unity.com/packages/2d/environments/free-2d-cartoon-parallax-background-205812)
    1. [Pixel Adventure 2](https://assetstore.unity.com/packages/2d/characters/pixel-adventure-2-155418)

1. 続いて、これから作成するゲームのUnityプロジェクトへ素材達をインポートするために、以下のようにPackage Managerを開きます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/15840b55-c217-ba08-10c1-b9baf96054d3.png)
1. Package Managerが開くので、先程Add to My Assetsした素材を選択し、Downloadをクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/d76fbf13-64f3-65e0-d671-acab252eedca.png)
1. Downloadが完了したら、先程までのDownloadボタンがImportボタンに変わると思うのでクリックします。すると以下のようにImportする項目が開くので、必要なものを選択してインポートしてください。(私は面倒なので全チェックのままImportしました。)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/b91987a4-6a12-4e81-0939-703a8a8753a8.png)
1. 以下のように、先程ImportしたものがProjectパネルのAssets以下に入っていれば成功です。お疲れさまでした。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33458/df8003b4-3bf4-88f1-a908-3d6d437fbcdb.png)


# 続きの記事 (2022.03.05更新)
[【第二回】UnityでAndroidゲームアプリを作る ~ステージ作り~ はこちら](https://qiita.com/CPyRbJvCHlCs/items/29fc47a768d47e73b85f)
記憶が消える前に受験しよう -AWS SAPとDVA受験記録-

うまくまとまっていませんが、記録がわりに記載していきます。

# そもそも受験しようと思ったきっかけ

## Solutions Architect -Professional （SAP)

年間取得目標に書いちゃったから+出向先でお世話になっている先輩からの勧め、という感じです。
良くわからないけれど、毎期「勉強しろ」「資格を取得しろ」を強制されるのは今のトレンドなんでしょうか？
自社だと「特定の資格ないとクラスアップさせない」という風潮があるのですが、むしろ昇給したくない人間は取らない選択を続ければいいのか？
なんか話がズレちゃいましたが、自主的に取得しようと思っていたので、先輩からの勧めに後押ししてもらって受験を決めました。

## Developer -Associate （DVA）

Solutions Architect -Professionalを取得してから、購入したWeb問題集の使用期限が２ヶ月弱残っていたので、何かもう一つくらい・・・という気持ちで決めました。
Associate資格なので、１ヶ月頑張ればいけるかな？と思い、Web問題集を数問解いて、イケると確信して受験を決めました。

# 勉強方法はひとつだけ

SAPとDVA、勉強方法は至ってシンプルです。
[Web問題集](https://aws.koiwaclub.com/exam/scs/)をプロフェッショナルで契約し、ひたすら問題を解きました。
1日70問(7問で1ブロックになっているものを1日10ブロック)を目標に、ひたすら解いて、間違った問題の解説を読んで・・・の繰り返し。
もっとも、毎日目標数を解くことはできなかったです。
仕事は8時から日が変わるくらいまで毎日やってるし、土日祝もずっと出社・・・みたいな感じだったので。
都内へ出社するときは通勤途中に片道2〜3ブロック、昼休みに1ブロック、寝る前に2〜3ブロック。
代替休暇が取れたときは、午前中に3ブロック、日中は家事とか色々やって夕食後〜寝る前でに7ブロック、のような感じでしょうか。
頭の中で、この設問は、こういう理由はこれを選択した、選択から除外した・・・など自分に説明しながらやってました。
あとは自分の部屋でやるときは、あえて口でブツブツ呟きながらやりましたね・・・公共の場所じゃできないですが、一人の部屋ならOK。

## やっておけば良かったこと

ホワイトペーパーは読んでおけば良かったかな、ブラックベルト視聴しておけば良かったかな、と思うところはあります。
あとはハンズオン系ですね。
イメージしきれなかったサービスについては、手を動かして頭に入れる・・・ということをやっても良かった。
AWSの模擬試験も、受験する余力があるならやっても良かったかな。

## やらなくて良かったこと

複数の問題集に手を出さなかったのは良かったと思っています。
個人的には、Web問題集だけで十分でしたね。
AWSの問題の出し方に慣れる・・・という意味で、通常のテキストはあまり参考にならないかな、と。
問題の微妙なニュアンスとか、変な訳し方とか、そういったあたりもWeb問題集だとなぞってくれてます。

# 受験するタイミングは、記憶が定着したと思ったら！

ポイントは、短期間に問題を解くことで、記憶に刷り込むことかと思います。
一夜漬けは推奨しませんが、繰り返し繰り返し解くことで記憶に定着されていくものが、日を経つと消えていくんですよね。
なので、ほぼほぼ問題が間違わずに解けるな、と感じたところで、受験日を決めました。
DVAについては、元々一ヶ月後受験予定だったのを途中で一週間前倒しにして、自分の手応えを感じたところで「じゃあ明後日受けよう」のような感じで結果二週間で受験する、という感じでタイミングを変えていきました。

# 試験についてはちょっとだけ

結果として、どちらの試験も一発合格できました。
何度やっても、最後の「終了」ボタン押す時が一番緊張するし、吐きそうになるのは何でしょうか。
自分の頭を「諦めモード」に持っていって、ボタンを押すようにしています。

SAP試験直前にエナジードリンクを飲んだため、試験中に2度ほど席を外すハメに・・・これは完全な失敗。
困ったら「問題に書かれていることをシンプルに考える」というアドバイスを先輩にもらっていましたが、これは当たりですね。
あれもできる、これもできる、こうすればできる・・・とか考え始めると深みにハマるので、悩み始めたらこのアドバイスを思い出して、リセットして、解き直すことができました。

あとは、仕事が忙しいので、休暇じゃなくて中抜けして受験してきたのですが、これもちゃんと休暇取ってコンディション整えて受験するのがいいですよね。

# 合格後、意外だったこと（ちゃんと調べとけ、ということも含め）、その他

SAPに合格したら、過去に取得したCFA(Cloud Practitioner)とSAA(Solutions Architect -Associate)の有効期限がSAPと同じだけに延長されてました。
再受験しなきゃ・・・と思っていたので、ラッキーでした。（ちょうど今年期限を迎えるところだった）

あとは、転職サイトからのメールと電話が一気に増えましたw
ありがたいことですね〜。

Web問題集の期限まであと一ヶ月あるので、今度はSCS(Security -Specialty)に挑戦してみようかな、と思っています。
うまくいくかわからんけど。
さすがにこれは、ホワイトペーパーちゃんと読みます。
SystemVerilogのreal ⇒ integer 変換と丸め方法のメモ

| 記述        | 丸めの方法        |例（正の数）           |例（負の数）              |
|:------------|:-----------------|:---------------------|:------------------------|
|i = $rtoi(r) |切り捨て           |1.234 ⇒ 1, 1.500 ⇒ 1|-1.234 ⇒ -1, -1.500 ⇒ -1|
|i = int'(r)  |四捨五入           |1.234 ⇒ 1, 1.500 ⇒ 2|-1.234 ⇒ -1, -1.500 ⇒ -2|
|i = r        |四捨五入           |1.234 ⇒ 1, 1.500 ⇒ 2|-1.234 ⇒ -1, -1.500 ⇒ -2|
|i = $ceil(r) |大きい整数へ切り上げ|1.234 ⇒ 2, 1.500 ⇒ 2|-1.234 ⇒ -1, -1.500 ⇒ -1|
|i = $floor(r)|小さい整数へ切り下げ|1.234 ⇒ 1, 1.500 ⇒ 1|-1.234 ⇒ -2, -1.500 ⇒ -2|

```verilog:
  initial begin
    real r;
    int  i;
    r =  1.4; i = $rtoi (r); $display("i = $rtoi ( %f) : i = %2d", r, i);
    r =  1.5; i = $rtoi (r); $display("i = $rtoi ( %f) : i = %2d", r, i);
    r = -1.4; i = $rtoi (r); $display("i = $rtoi (%f) : i = %2d", r, i);
    r = -1.5; i = $rtoi (r); $display("i = $rtoi (%f) : i = %2d", r, i);
    r =  1.4; i = int'  (r); $display("i = int'  ( %f) : i = %2d", r, i);
    r =  1.5; i = int'  (r); $display("i = int'  ( %f) : i = %2d", r, i);
    r = -1.4; i = int'  (r); $display("i = int'  (%f) : i = %2d", r, i);
    r = -1.5; i = int'  (r); $display("i = int'  (%f) : i = %2d", r, i);
    r =  1.4; i = r        ; $display("i =         %f  : i = %2d", r, i);
    r =  1.5; i = r        ; $display("i =         %f  : i = %2d", r, i);
    r = -1.4; i = r        ; $display("i =        %f  : i = %2d", r, i);
    r = -1.5; i = r        ; $display("i =        %f  : i = %2d", r, i);
    r =  1.4; i = $ceil (r); $display("i = $ceil ( %f) : i = %2d", r, i);
    r =  1.5; i = $ceil (r); $display("i = $ceil ( %f) : i = %2d", r, i);
    r = -1.4; i = $ceil (r); $display("i = $ceil (%f) : i = %2d", r, i);
    r = -1.5; i = $ceil (r); $display("i = $ceil (%f) : i = %2d", r, i);
    r =  1.4; i = $floor(r); $display("i = $floor( %f) : i = %2d", r, i);
    r =  1.5; i = $floor(r); $display("i = $floor( %f) : i = %2d", r, i);
    r = -1.4; i = $floor(r); $display("i = $floor(%f) : i = %2d", r, i);
    r = -1.5; i = $floor(r); $display("i = $floor(%f) : i = %2d", r, i);
  end
```
```text:
i = $rtoi ( 1.400000) : i =  1
i = $rtoi ( 1.500000) : i =  1
i = $rtoi (-1.400000) : i = -1
i = $rtoi (-1.500000) : i = -1
i = int'  ( 1.400000) : i =  1
i = int'  ( 1.500000) : i =  2
i = int'  (-1.400000) : i = -1
i = int'  (-1.500000) : i = -2
i =         1.400000  : i =  1
i =         1.500000  : i =  2
i =        -1.400000  : i = -1
i =        -1.500000  : i = -2
i = $ceil ( 1.400000) : i =  2
i = $ceil ( 1.500000) : i =  2
i = $ceil (-1.400000) : i = -1
i = $ceil (-1.500000) : i = -1
i = $floor( 1.400000) : i =  1
i = $floor( 1.500000) : i =  1
i = $floor(-1.400000) : i = -2
i = $floor(-1.500000) : i = -2
```

#### 参考
https://stackoverflow.com/questions/42003998/systemverilog-round-real-type

https://lsifrontend.blog.fc2.com/blog-entry-780.html

https://www.chipverify.com/verilog/verilog-math-functions
Termiusを使ってOCI VMインスタンスにSSH接続する

Windows/MacOS/Linux/iOS/Androiなんでもござれの私の大好きなSSHクライアントであるTermiusを紹介します。
無料で使える機能が十分すぎて非常に気に入ってます。

Windows版をメインに説明します。

１：インストール
下記アドレスよりインストーラーを入手しインストールしてください。

https://termius.com/windows


２：秘密鍵の登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/5d855c30-f32e-19fe-f41d-d0a68b9c16e6.png)
初回起動時のウィザードを終わらせた後に画面左上のナビゲーションメニューから[Preferences]をクリックしてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/32767471-1b46-e1c2-4af3-aa7915b6106e.png)
ナビゲーションメニューから[Keychain]を選択し、画面上部の[+NEW HOST]から[Import or paste a key]を選択すると
秘密鍵の入力画面が出るので[Set a label...]に任意の名前と[Private Key]欄に秘密鍵を貼り付けてください。
入力が終わったら画面右上の[→]を押すと閉じれます。

３：ホストの登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460502/cdd0b76f-edd5-0e10-de07-14daa373897d.png)
[Preferences]を閉じて[Hosts]画面が出たら画面左上の[+NEW HOST]を選択すると接続先情報を入力する画面になるので
[Set a label...]に任意の名前
[Address]に接続先のIPアドレス
[Username]にSSH接続するユーザー名
青字の[Keys]を選択して先ほど登録した秘密鍵を選択したのちに[Set a label...]右にある[→]を選択すると閉じれます。


４：SSH接続
登録されたホスト名をダブルクリックすれば接続できます。
corsエラーが出た

## 行っていたこと

ローカル開発でフロントエンドとバックエンドを接続する際にエラーが起きた。
`fetch`でデータを引っ張る時にブラウザのコンソールでエラーを発見！

フロント側：`http://localhost:8111`(webpack)
バックエンド側：`http://localhost:8080`(express)

## エラー内容

    Access to fetch at ... from origin ...has been blocked by CORS policy:
    No 'Access-Control-Allow-Origin' header is present on the requested resource. 
    If an opaque response serves your needs, set the request's mode to 'no-cors' to 
    fetch the resource with CORS disabled.

CORSにブロックされた... 

## 対応

`yarn add cors`
app.ts

    import cors from "cors";

    const app = express();

    const corsOptions = {
    origin: "http://localhost:8111",
    optionsSuccessStatus: 200,
    };
    app.use(cors(corsOptions));

## 最後に
バックエンド側で`cors`を導入したら接続に成功しました！
※備忘録を兼ねて作成

## 参考記事

https://qiita.com/chenglin/items/5e563e50d1c32dadf4c3
Windowsユーザープロファイルが壊れたときのVSCode環境復旧

ある日突然、会社PCのユーザープロファイルが破損してしまって辛い目に遭ったので記録を残しておきます。

## 何が起きたか
だいたい以下検索結果の上位に出てくる感じのこと。
[Users/temp - Google 検索](https://www.google.com/search?q=Users%2Ftemp)

[ググったところ、レジストリをいじると治るよ](https://www.google.com/search?q=一時プロファイルでログオンしています+原因)、とのことだったので試してみる。
が、新しくユーザープロファイルが作られるだけだったので、壁紙からデスクトップのショートカットアイコンやファイルの関連付けまでリセットされてしまった。
VSCodeも、インストールしていたプラグインやキーバインドが全部消えてしまった。

## 消えたようで消えていなかった
実は旧ユーザーのフォルダに設定値 (が記録されたファイル) は残っていた。

### 主要な設定ファイル
主な設定 (settings.json) とキーバインド設定 (keybindings.json) のファイルは以下のフォルダにあった。
`C:\Users\{旧ユーザー名}\AppData\Roaming\Code\User\`
この2個のファイルは新ユーザーのフォルダにそのままコピーしておいておく。
`C:\Users\{新ユーザー名}\AppData\Roaming\Code\User\`

### プラグイン
コピーで済めばよかったのだが、どこになんのファイルがあるのかわからなかったため再インストールすることにした。
しかし、どんなプラグインを入れていたかなんて細かく覚えていない。
先述のフォルダを漁っていると、怪しいファイルがあった。
`C:\Users\{旧ユーザー名}\AppData\Roaming\Code\CachedExtensions\user`
中身はJSONだったので、とりあえず整形 (素のVSCodeでできる) して別ファイルに一時保存。
そして一気にGrep! (コマンドプロンプト使いこなせない)

```
User@Host MINGW64 ~/Desktop
$ cat Untitled-1.json | grep displayName
                        "displayName": "CharacterCount",
                        "displayName": "Markdown Preview Mermaid Support",
                        "displayName": "Doxygen Documentation Generator",
                        "displayName": "SVG Viewer",
                        (以下略)
```

ということで、だいたい入っていたプラグインが特定できました。
Grepで引っかかった行の前後を見れば作成者も特定できるので、これを手がかりに後は手作業でインストール……。

なんかもっといい方法もありそうだけど、これ以上は調べるのに時間がかかりそうだったので諦めました。
スマホページの読み込みプロセスを録画する無料ツールLoadshowを公開

# Loadshow β

https://loadshow.net/

こんな感じでスマホページの読み込みプロセスをコンパクトな動画にします。

例: トヨタ自動車WEBサイト https://toyota.jp/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/0dc16078-4784-47e2-0931-179d209507c8.png" width="240">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/d08c95fe-eee3-520c-03b5-98d9708b516d.png" width="240">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/f6de2cc3-4e95-161b-74fb-201c710654fa.png" width="240">

こんな感じで複数の動画を並べて比較する機能もあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/8ee74078-eb17-3f0b-f75b-ded700c78183.png" width="640">

競合比較はもちろん、同じページを時間の違いでも比較できます。速度が改善されたよーといプレゼンにも。

ぜひ遊んでみてください！

# なぜ作ったか

単純に動画にすると **表示速度** がわかりやすいと思ったからです。

計測ツールとしては [PageSpeed Insights](https://pagespeed.web.dev/) が有名ですが、結果が数値で示されても偉い人に伝わりません。

そもそも PageSpeed Insights はWebアプリケーションとして応答性能も重視するため、結果は **表示速度** とちょっと違います。

RUMを計測するのが一番ですが、やはり数値だとピンときません。

わかりやすい動画で多くの人が問題を認識し、共有してくれるといいなと願ってます。

# 細かな話

## スマホのシミュレーション

ブラウザは　[Puppeteer](https://github.com/puppeteer/puppeteer) で制御してます。CPU Throttlingは　x4、Upload/Downloadは最大 10Mbps に制限しています。

## 90%描画 (Paint 90%)について

通信が一通り終わったタイミングから2秒ほどウェイトを入れて、**Webページという画** が完成したと判断します。

これが動画の最終フレームであり、読み込み過程のフレームは最終フレームに近づく過程と捉えて、ピクセルベースの差分から進捗を評価します。

完成の90%まで近いたら必要な情報はおおよそ表示されただろう、ということで90%描画を **表示速度の基準値** としました。

カルーセルスライダーのような動的要素の影響を吸収する効果もあります。

## ビューポート

ビューポートを縦長にして録画しています。そのため、CSSによっては表示が大きく崩れることがあります。

また、通常のブラウザとはリソースの扱いが厳密には違う部分があるとも推測してます。

# 技術スタック

## ホスティング Firebase

ホスティング、Googleアカウント認証、結果データの管理、アナリティクスは [Firebase](https://firebase.google.com/?hl=ja) です。楽ちん！

## 動画生成 Puppeteer + FFmpeg

動画の生成は [Puppeteer](https://github.com/puppeteer/puppeteer) と [FFmpeg](https://ffmpeg.org/) でゴリゴリやってます。

## フロントエンド Vue.js 3 + simple.css

[Vue.js](https://jp.vuejs.org/index.html) と [Simple.css](https://simplecss.org/) でさくっと。

素のHTMLを書くだけで不快じゃないデザインになるSimple.cssいい！

## ワーカー おうちKubernetes + PubSub

動画生成がけっこう重い処理です。クラウドだとバーストしたときコストが怖いので、退役マシンによるおうちKubernetesクラスタで処理してます。

なので計測時間には計測側由来のばらつきもあります。無料なのでご容赦ください。
Webについてまとめる【備忘録】


## はじめに
Webについて改めて学習したので、大まかにまとめました。


## Webとは
Webとはインターネットを利用して「文章や画像などを公開・閲覧できる仕組み」のことです。正式名称は、World Wide Web（世界に広がる蜘蛛の巣）と言います。インターネットとは、世界中のコンピュータを相互接続したネットワーク網のことでWebとイコールと勘違いしやすいですが、別のものです。Webの誕生によってインターネットが普及しました。

<img width="450" alt="インターネット接続イラスト.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/5c0b44fa-e73e-e21d-b0ab-dfb4082cb8f3.jpeg">

## Web〇〇
よく「Web〇〇」という言葉を聞くので、それぞれの用語の整理をしていきます。

- Webページ：Web上にある文章のこと
- Webサイト：特定のドメインの下にあるWebページの集まりのこと
- Webアプリケーション：Webを介して利用するサービスを提供すること
- Webサービス：インターネットを利用したサービスのこと。(TwitterやYouTubeなど)
- Webシステム：WebサイトやWebアプリケーション、Webサービスと提供するための仕組みのこと


## Webの構造
Webの構造は、 **サーバー** （ネットワーク上で情報やサービスを提供する役割を持つコンピューターのこと）/**クライアント**（サーバーから提供された情報やサービスを利用する役割を持つコンピューターのこと）モデルになっています。



<img width="450" alt="クライアントサーバーモデル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/c66affd9-7059-37c4-c87a-7a6fbe09a2ce.png">

## Webを支える仕組み
- HTTP・URI（URL）・HTMLの大きく3つで支えられている
    - HTTP：情報を取得したり発信する際のプロトコル（約束事）
    - URI：インターネット上における情報の場所
    - HTML：情報を表現するための共通の書式

## リクエストとレスポンス
- リクエストを出す側を「クライアント」
- リクエストに対してレスポンスを返す側を「サーバー」
- どんなWebサービスでも、必ずこのリクエストとレスポンスの連続で成り立っていることがポイント

![スクリーンショット 2022-05-02 18.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/cc80d899-b8d8-c1a7-93af-79b020d3d4a4.png)

### IPアドレス
- コンピューターの場所を示す住所があり、この住所（IPアドレス）が、サーバーに付与されているので、クライアントは目的のサーバーにリクエストを出すことができる。この仕組みあるため、リクエストに対してレスポンスができる。

### ドメイン
- 「youtube.com」などの英数字が並んでいるもので、サイトにアクセスすることができる。この英数字が並んだものを「ドメイン」という。

### DNS(ドメインネームサービス)
- ドメインネームシステム、という仕組みがあるおかげで、PCはドメインとIPアドレスを対応づけることができる。このドメインからIPアドレスを導き出すことを「名前解決」という。


## 参考文献
- イラスト図解式 この一冊で全部わかるWeb技術の基本
GoogleデータポータルのダッシュボードをQiitaに埋め込む→低画質サムネしか取れなかった

## この記事でやってること
GoogleDataPortal のダッシュボードをQiitaに埋め込む方法を模索。
→結局、サムネイル取る方法は分かったけど、画質悪い。インタラクティブなダッシュボードを埋め込む方法ないんかな。

## 経緯
最近社内でPowerBIを使ってダッシュボードを利用中
→便利なのだけど、私用プロジェクトでPowerBI使うとライセンス周りが面倒そう。
→GoogleDataPortalで無料ダッシュボード作れそうなのでやってみた。




## 結果_ サムネしか取れずいまいち
データポータルのサムネイルを作成して、Qiitaに画像として貼り付けた
→画質が低すぎて読み取りにくい。
![Datapotal_Thumbnail](https://datastudio.google.com/embed/reporting/7356c8d8-12f0-4c74-8790-76fcca74a803/page/aDomC/thumbnail)

元レポート

https://datastudio.google.com/embed/reporting/7356c8d8-12f0-4c74-8790-76fcca74a803/page/aDomC


## 上手くいかなかった手法
iframeをDatapotalの”リンクを共有”で作成して、直接貼り付けるのはうまくいかなかった。
以下のように何も表示されなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498912/5f2943d1-a12c-753d-8d25-a99d324dd924.png)



## 参考にさせていただいた記事

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

https://inhouse-plus.jp/web-analytics/googledataportal/embed-report-in-website/

https://developers.google.com/datastudio/share/thumbnails?hl=ja
SORBSのブラックリストに登録されたEIPを解放してみた

## 背景
EIPがSORBSのブラックリストに登録されていたために、逆引き設定の解除申請だけでは解決できなかったので備忘録として残します。

## SORBS(Spam and Open Relay Blocking System)って何？
迷惑メールを配信している疑いのあるIPアドレスやドメインを登録している組織で、SORBSの他にSpamhausやSpamCop等もあるようです。

今回、対象のEIPは逆引き設定がされていて、そもそもEIPを解放する際には逆引き設定解除の手続きが必要になるのですが、ブラックリストに登録されている状態でAWSへ逆引き設定の解除申請を行うと、対象IPがブラックリストに載っているため、先にブラックリストからの登録解除を行うよう指示されます。
実際に、逆引き設定解除の申請を行った際のAWSからの返信は以下です。
> Hello,
> 
> Thank you for submitting your rDNS request.
> We see that the provided identifier, xx.xxx.xxx.xxx, is blacklisted by spam.dnsbl.sorbs.net.
> Before your request can be processed, please attempt to work with the above mentioned blacklist to have the resource delisted.
> If you have attempted to contact the blacklist with no resolution, please reply to this email with the steps you have taken to permanently resolve this issue.

SORBSのサイトで確認すると、確かに対象IPがリストに登録（<span style="color: #d61b09">Listed</span>）されていました。
https://www.sorbs.net/
![画像１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/cd0587b0-d68a-9d3a-14eb-d0280430aca4.png)

登録解除の際には、解除理由の記載が必要となります。
今回はアカウント解約に伴うEIP開放でしたので、サーバー削除していることとIPアドレスも使用しない旨の内容で申請しました。

>Hello
>
>Dear SORBS Staff
>
>We have applied to AWS to remove the ElasticIP reverse lookup setting for the target IP, and were instructed to implement the removal from the SORBS blacklist.
>
>When we checked the blacklist, we found that the target server's IP address xx.xxx.xxx.xxx was registered in the SORBS list.
>However, we are currently deleting the server and will dispose of the target IP as we have no plans to use it in the future, so please remove it from the list.
>
>We apologize for the inconvenience and thank you for your cooperation.

数時間後にSORBSのサイトを確認すると、リストから除外（<span style="color: #069417">Delisted</span>）されていました。
AWSへ対応が完了した旨連携し、無事にEIPを解放することができました。

![画像２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/7a7d6507-d44b-dcfd-d8ad-c807b5b321f6.png)

## 最後に
以下サイト等で、IPアドレスがブラックリストに登録されていないか事前に確認できます。
下記画像のように **LISTED** の文字がある場合は、ブラックリスト登録されていますのでご注意ください。
**Email Blacklist Check – See if your server is blacklisted – MxToolbox**
https://mxtoolbox.com/blacklists.aspx
![画像３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/38a56de8-47dd-249c-7595-af635a85afbb.png)
[Swift] Firebase Firestoreデータを削除する方法

# [Swift] Firebase Firestoreデータを削除する方法



# [1] コレクションを削除する。

```ViewContoroller.swift
import FirebaseFirestore

Firestore.firestore().collection("[コレクション名]").getDocuments { (snapshot, error) in
            if let error = error{
                print("エラー",error)
                return
            }
         
            for document in snapshot!.documents{
                document.reference.delete()
            }
            
     }



```
# [2] ドキュメントを削除する。
```ViewContoroller.swift
 Firestore.firestore().collection("[コレクション名]").document("[document]").delete()
```


参考記事

https://www.codegrepper.com/code-examples/whatever/delete+all+documents+in+collection+firestore

https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja#swift_2
ngrok（ローカルのサーバをWebに公開できるツール）

# ngrok (エングロック)とは
読み方はエングロック。ローカル環境のサーバをWeb上に公開できるツール。

# 使い方
インストール後に下記のコマンドで起動する。

```:コマンド
$ ngrok http 8000
```
するとこんな感じに表示されます。
赤枠で囲ったURLに対してリクエストが送られると、ローカルの「http\://localhost:8000」へ転送してくれるという仕組みです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533999/93d4cd70-77e7-4270-7931-dcd809dd8d21.png)

# 注意点
**1. URLは毎回変わる**<br>リクエスト送信用のURLは、ngrokを起動するたびに毎回変わるので、使うときも注意が必要。

**2. ローカルのサーバも起動させておくこと**<br>ngrokはあくまで外部からのリクエストをローカルに転送してくれるツールなので、ngrokを起動させた状態で、同時にローカルのサーバも起動していないとアクセスはできない。
Java Silver SE11 11章

# Java Silver SE11 11章
[黒本](https://www.amazon.co.jp/gp/product/4295007625/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。

## モジュール
複数のパッケージをまとめて管理する単位のこと。
モジュール内のパッケージは、明示しなければ非公開パッケージとなり、パッケージに含まれるクラスがpublicであったとしても、外部のモジュールからアクセスできなくなる。

### プラットフォームモジュール
標準クラスライブラリなど、あらかじめ用意されているライブラリを提供しているモジュールのこと。
例として、java.langやjava.util,  java.ioパッケージなどをまとめているのが、```java.baseモジュール```である。このモジュールは自動的に読み込まれる。


### module-info.java
対象のモジュールの設定内容を記載するファイルに該当する。
下記２点を記述する。

* どのパッケージを公開するのか
* 他のどのモジュールを使用するのか

モジュール用のディレクトリにこのファイルを作り、他のソースファイルとコンパイルすることで、モジュールを作成できる。

```java:testモジュールのmodule-info.java
module test {}
```

moduleの後に、モジュール名を記述し、公開するパッケージや利用する外部モジュールを「{}」内に記述する。
(何も書かない場合、全てのパッケージを公開せず、どの外部モジュールも利用しないことを意味する。)

```java:パッケージの公開と他モジュールの利用
module test {
  exports com.sample;  // 公開するパッケージ
  requires hello;     // 利用する他のモジュール
}
```

### 推移的な依存関係
```module1 → module2 → module3```
上記なような推移的な依存関係を表した「モジュールグラフ」がある。
これは```module1はmodule2に依存```し、```module2はmodule3に依存```していることを示している。

「この依存関係」かつ「module1がmodule3のクラスを利用する」ためには、```各module-info.java```を以下のように書く。

```java:module1 module-info.java
module module1 {
  requires module2;  
}
// module1はmodule２を利用できる
```

```java:module2 module-info.java
module module2 {
  requires transitive module3; 
}
// module2はmodule3を利用できる
// 「transitive」により、module1はmodule3を利用できる
```

### ディレクトリ構成
モジュールのルートディレクトリをtestとすると、module-info.javaはその配下に置く。

```java:ディレクトリ構造
current
  |-src 
  |  |-test
  |    |-com
  |    |  |-sample
  |    |     |- Main.java
  |    |-module-info.java
  |-mods
    |-test
```

src：ソースファイルのルートディレクトリ
test：モジュールのルートディレクトリ
com：パッケージのルートディレクトリ
mods：コンパイルの出力先


## 構文
以下に試験対策として、構文を記述していく。

### コンパイル
コンパイルするためのコマンド。

```java:コンパイルの構文
javac -d クラスファイルの出力先ディレクトリ コンパイルするファイルパス
```

```java:testモジュールのコンパイル
javac -d mods/test src/test/module-info.java src/test/com/sample/Main.java
```

module-info.javaも同時に、コンパイルを行うことに注意する。

### クラスの実行
エントリーポイントを持つクラスを実行するためのコマンド。


```java:クラス実行の構文
java --module-path モジュールのルートディレクトリ -m 実行したいモジュールのクラス
```

```java:testモジュール実行
java --module-path mods -m test/com.sample.Main
```

### jarコマンド
モジュールをjarコマンドで、１つにまとめることができる。
複数のクラスをまとめたjarファイルを作成する。

```java:jarコマンドの構文
jar --create --file=jarファイル名 --main-class=エントリーポイントを持つクラス -C jarファイルに含めるファイルがあるディレクトリ
```

```java:jarコマンドの例文
jar --create --file=mlib/test.jar --main-class=com.sample.Main -C mods/test
```

#### 解説
mlibディレクトリにtest.jarファイルを新規作成する。
エントリーポイントを持っている「com.sample.Main」を指定する。
mods/testディレクトリ内にあるファイルが含まれる。
最終的に、mlib/testディレクトリにtest.jarファイルが作成される。

### モジュールの設定情報確認
module-info.javaに設定したモジュールの情報を確認するためのコマンドがある。

```java:設定情報確認
java --describe-module
jmod describe
```

### 非公開パッケージの一時利用
module-info.javaにてexportsされていないパッケージを、一時的に利用してコンパイルすることができる。この時javacコマンドのオプションを使用する。

```java:一時利用
-add-exports
```
一時的へんすう「こども向けのSnap!かいせつ」

これまでへんすうに入るあたいは、数字や短い文字でした。しかし、へんすうに入るあたいの大きさにきまりはありません。第５章では、いろいろなあたいやデータこうぞうを入れる「リスト」を入れることを学びます。第８章では、ウェブサイトからのデータをへんすうに入れる方法を学びます。これらのきのうを使うとき、あなたのプロジェクトはより多くのメモリを使うことになります。
もし、Snap!で使える以上のメモリを使ってしまうと、プロジェクトをほぞんできなくなるかもしれません。（より多くのほぞんするところが必要であれば、コンピューターにほぞんすることもできます。）もし、あなたのプログラムが多くのデータを外から読みこんできていたら、プロジェクトをほぞんする前にメモリからデータを消したいと思うでしょう。こういうことをするには、へんすうの上で右クリックをして下のようなメニューを出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/bc7f5d2c-878d-bf1b-3579-79a814df53eb.png)
transient（一時的（いちじてき））というチェックボックスがあります。このチェックボックスにチェックがはいっていると、そのへんすうにはいったあたいは、ほぞんされません。そうすると、つぎにこのプロジェクトがひらかれた時には、へんすにはあたいがはいっていませんから、何かのあたいをへんすうに入れる必要があります。

<a href="https://qiita.com/wordplugin/items/102d2cac8e4c8c3bbbb9">戻る</a>
[Django] CommandError: You appear not to have the 'mysql' program installed or on your path.

#使用環境
Windows 11

#解決方法
path の追加。
path の追加方法が以下のサイトに載っています。

https://www.dbonline.jp/mysql/connect/index6.html

#説明
python manage.py dbshell　コマンド使用後、SQL クライアントがない場合と Windows に SQL がインストールされていない場合、タイトルのエラーメッセージが出た。

#エラーメッセージ
```python
CommandError: You appear not to have the 'mysql' program installed or on your path.
```

#原因
path の追加が正しくできていなかった。


#参考サイト

[課題] CommandError: You appear not to have the 'mysql' program installed or on your path. と出る
https://zenn.dev/wtkn25/articles/django-mysqlclient-install

コマンドラインツールにPATHを設定する
https://www.dbonline.jp/mysql/connect/index6.html#section1
Qiita デビュー

# ブログもデビュー
一昨年前にOpenCVとかの顔認証に衝撃を受けて、15年ぶりにFPGA（正確にはSoC）のコーディングを再開した。ハードとソフトいろいろ勉強し直している最中で、こちらはその備忘録としたい。

# マークダウン記法
今回はデビューついでにマークダウン記法を学習。
PYNQでよく使っているJupyter notebookで使われてるのと一緒かな？
とは言ってもハッシュ記号ぐらいしか使ったことなくて、今後読みやすく書けるようになるのが課題か。
[Django] 'mysql' is not recognized as an internal or external command, operable program or batch file. 解決方法

#使用環境
Windows 11

#解決方法
path の追加

#参考サイト
path の追加方法が載っています。

https://www.dbonline.jp/mysql/connect/index6.html

#エラーメッセージ
```python
'mysql' is not recognized as an internal or external command, operable program or batch file.
```

#原因
path の追加が正しくできていなかった。
【Typescript】特定の数字しか入らない配列の型を作る

# 何がしたい

* [1, 8, 9] しか入らない配列の型を作りたい
* 1, 8, 9 全てが入る場合もある
* 1 だけ入る場合もある
* 8, 9 の2つが入る場合もある
* [9, 1, 8] のように順番が並び変わるケースもある

```ts
const NumArray = [1, 8, 9] // 全部入る場合
const NumArray = [1] // 1つだけ入る場合
const NumArray = [8, 9] // 2つだけ入る場合
const NumArray = [9, 1, 8] // 順番が並び変わるケースもある
```
# 結論
```ts
type SpecificNumber = (1 | 8 | 9)[];
```

```ts
const NumArray:SpecificNumber = [1] // 1つだけ入る場合
const NumArray:SpecificNumber = [8, 9] // 2つだけ入る場合
const NumArray:SpecificNumber = [9, 1, 8] // 順番が並び変わるケースもある
```

# 参考

ちゃんとサバイバルTypescriptに書いてあった、、、
しかも「よくある間違い」にもしっかり引っかかってしまった、、
[配列要素にユニオン型を使う際の書き方](
https://typescriptbook.jp/reference/values-types-variables/union#%E9%85%8D%E5%88%97%E8%A6%81%E7%B4%A0%E3%81%AB%E3%83%A6%E3%83%8B%E3%82%AA%E3%83%B3%E5%9E%8B%E3%82%92%E4%BD%BF%E3%81%86%E9%9A%9B%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9)
フィールドタイプが時間の場合に15分刻みしか入力できない？


任意で入力できるという話と、できないという話が交錯している。
一度調べる必要がありそう。

[Time field type in Lightning](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FWw0t)
運用管理ソフトウェア「Hinemos」を使ってみる！！part5 ～エージェント登録～

# 1.はじめに
今回は、HinemosマネージャにHinemosエージェントを登録します。
この手順を踏まないと、ジョブ管理や監視ができません。でも一瞬で完了します。

これまでに実施してきた手順は、以下のリンクにまとまっています。
[運用管理ソフトウェア「Hinemos」を使ってみる！！part1 ～はじめに～](https://qiita.com/takuyasuzuki9/items/426be12d59366e64c5d2)


# 2.エージェント登録
## 【手順1】クライアント起動
Windowsのメニューから「HinemosClient6.2.2」を選択して押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/986198a8-636f-d15a-b8b3-c176a140e840.png)

ユーザID：hinemos(デフォルト)
パスワード：hinemos(デフォルト)
接続先URL：http://(HinemosマネージャのIPアドレス):8080/HinemosWS/
マネージャ名：マネージャ1(デフォルト)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/96585487-bcd7-5871-84e4-eda3778ddff9.png)
と入力して「ログイン」を押下。

## 【手順2】クライアント登録
クライアントウィンドウで[パースペクティブ]→[リポジトリ]を押下。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/8bb82709-1b12-937c-e959-a6cc25de0650.jpeg)
[リポジトリ[ノード]]タブを選択して、「作成」アイコン押下。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/849a1e24-5664-7404-24de-a7736eba5c90.jpeg)
以下の項目（必須）を入力する。（ここは環境に合わせて入力してください。）
まずは、エージェント。入力後、「登録」を押下。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/ee30bdad-fbaf-a8c3-6042-ada4c3ea1e87.jpeg)
ついでに、マネージャも登録する。入力後、「登録」を押下。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/84e31a8b-e88f-7613-d0c3-3998ad07e1b7.jpeg)
[リポジトリ[ノード]]に登録したノードが確認できればOK。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/3a837b51-624d-f7cf-ee89-147c989e5060.jpeg)

# 3.振り返り
手順通りやってもらえれば。
応用として、エージェントを複数まとめて管理したいときは、[リポジトリ[スコープ]]タブで任意のスコープを作成して、その中にノードを登録していきます。
例えば、APサーバ群を作ったり、クライアント端末群を作ったり。

次は、いよいよ監視の設定を行っていきます。
ASE(Atomic Simulation Environment)でモデルの図を保存する,描写する,モデルを出力する(png,cif,traj,pov)

# ASE(Atomic Simulation Environment)で、モデルの保存、可視化を行う
・[Jupyter上でモデルを可視化する](#jupyter上で可視化する)
・[trajファイルのをJupyter上で図を描写する](#traj-jupyter上でステップを確認する)
・[pngで２次元的な図を出力](#png-2d)
・[cifファイルで出力 （→ VESTAで開く）](#cif)
・[povを介して、pngで３次元的な図を出力](#pov-png3d)

まずは、描写させるモデル。slabという名前に格納する
([ASE公式サイト参照](https://wiki.fysik.dtu.dk/ase/ase/io/io.html))

```python
from ase import Atoms
from ase.build import fcc111, add_adsorbate, bulk
adsorbate = Atoms('CO')
adsorbate[1].z = 1.1
slab = fcc111('Cu', (2, 2, 3), a=3.61, vacuum=7.0)
add_adsorbate(slab, adsorbate, 1.8, 'ontop')
```

## Jupyter上で可視化する

```python
from ase.visualize import view
view(slab, viewer='ngl')
```

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302038/7f86abaf-0250-ed53-f70d-ef589252724e.png)

## traj (＆jupyter上でステップを確認する)

```python
from ase.io import write
write('slab_x3.traj',slab* (3, 3, 1))

# ASE@jupyterで再度読み込んで描写させる場合
from ase.io.trajectory import Trajectory
traj_slab =  Trajectory('slab_x3.traj')
from ase.visualize import view
view(traj_slab, viewer='ngl')
```
Jupyter Lab上で表示させた場合。グリグリ動かせます。
最適化ステップなども保存されていれば再生も可能
![Jupyter-slab_x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302038/d53acee6-a9c6-4b4c-d2e0-e6ba26992ee6.png)

## png (2D)

```python
from ase.io import write
write('slab_x3.png', slab* (3, 3, 1), rotation='10z,-80x')
```
slab_x3.png
![slab_x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302038/970a7bf5-0f61-2716-32c4-5f7fe66165c2.png)


## cif

```python
from ase.io import write
write('slab_x3.cif', slab* (3, 3, 1))
```

slab_x3.cifファイルをVESTAで読み込んだ様子
![VESTA-slab_x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302038/39302dd6-b8a2-fc47-b2bc-4bb7e2f76a0a.png)


## pov →png(3D)

```python
from ase.io import write
write('pov_slab_x3.pov', slab* (3, 3, 1), rotation='10z,-80x')
```
- povからpngに変換する

ここから先は、ターミナル上を想定。Jupyter上でやるならXwindows必要かも。

```bash
#povrayをインストールする (ubuntu ver.)
$ sudo apt install povray

$ cat pov_slab_x3.pov
...
background {color White transmit 0.0}
camera {orthographic
  right -22.99*x up 21.90*y
  direction 1.00*z
...

# povファイルのrightの行のxとyの比を維持して下記のコマンドで変換する
# 背景白なら、transmit 1.0を0.0に書き換える。
$ !povray -W2230 -H2190  pov_slab_x3.pov

```

pov_slab_x3.png
![pov_slab_x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302038/48ec5951-e7da-cb18-e59c-3e032d5f5b91.png)

-----

ASEとQuantum Espresso関連の投稿記事リンク

**ASEとQuantum Espressoを使って、**
- [手動でCuの単位格子最適化して、平衡体積弾性率を見積る](https://qiita.com/egoo/items/3b68017fedd3d160014a)
- [Ptが単純立方構造、fcc、hpcのいずれの構造をとるかを調べる](https://qiita.com/egoo/items/8fa70a073df10782caaa)
- [六方晶Hfの格子定数aとcを最適化する](https://qiita.com/egoo/items/003669a4bc5da4f503ca)
- [H2Oなどの３原子分子を構造を最適化して、安定構造を見つける](https://qiita.com/egoo/items/b6c4b8a1f5280fbfd718)

**他**
- [ASEでモデルの図を保存する,描写する,モデルを出力する(png,cif,traj,pov)](https://qiita.com/egoo/items/55be3a27cd8a83c26ef2)
- [Quantum Espressoを色々なライブラリでコンパイルして、自分のPCに最速な状態にする](https://qiita.com/egoo/items/7fc55b4f7fa9c4b2f87d)
Flutter fvmエラー


# 開発環境

PC:macOS Monterey
エディター：Visual Studio Code

# 内容

Flutterのバージョン管理にfvmを使用していたが、fvm flutterコマンドが実行できなくなった。

エラー内容

```
・
・
・
Downloading _fe_analyzer_shared 29.0.0...
Reinstalled 1061 packages.
Reactivating devtools 2.7.0...
Precompiling executables...
Precompiled devtools:devtools.
Installed executable devtools.
Reactivating fvm 2.2.3...
Precompiling executables...
Failed to precompile fvm:main:
Error: Couldn't resolve the package 'fvm' in 'package:fvm/src/runner.dart'.
.pub-cache/hosted/pub.dartlang.org/fvm-2.2.3/bin/main.dart:3:8: Error: Not found: 'package:fvm/src/runner.dart'
import 'package:fvm/src/runner.dart';
       ^
.pub-cache/hosted/pub.dartlang.org/fvm-2.2.3/bin/main.dart:6:14: Error: Method not found: 'FvmCommandRunner'.
  exit(await FvmCommandRunner().run(args));
             ^^^^^^^^^^^^^^^^
Failed to reactivate fvm 2.2.3: Failed to precompile fvm:main:
Error: Couldn't resolve the package 'fvm' in 'package:fvm/src/runner.dart'.
.pub-cache/hosted/pub.dartlang.org/fvm-2.2.3/bin/main.dart:3:8: Error: Not found: 'package:fvm/src/runner.dart'
import 'package:fvm/src/runner.dart';
       ^
.pub-cache/hosted/pub.dartlang.org/fvm-2.2.3/bin/main.dart:6:14: Error: Method not found: 'FvmCommandRunner'.
  exit(await FvmCommandRunner().run(args));
             ^^^^^^^^^^^^^^^^
Binstubs exist for non-activated packages:
  From fvm: fvm
Reactivated 1 package.
Failed to reactivate 1 package:
- fvm
pub finished with exit code 69
```

このエラー発生後、fvmコマンドが使用できなくなった。
fvmコマンドを実行すると、下記のようなエラーが発生する。

```
zsh: command not found: fvm
```

# 原因

下記コマンドを実行したこと。

```
flutter pub cache repair
```

# 解決策

```
pub global activate fvm
```

もう一度上記コマンドを実行するか、homebrew経由でfvmをインストールする。

# 参考

https://stackoverflow.com/questions/63468608/flutter-version-management-error-bash-fvm-command-not-found

# 関連記事

https://qiita.com/mkurom/items/9a2d3b11e548ff38b9ec
Azure Cosmos DB - データの一意性

データの一意性は、Partition Key と Unique keys で決まる。
Partition Key 、 Unique keys は、コンテナ作成時に設定する。
以下 Partition Key に`/pk`、Unique keys に`/col1, /col2`を設定した場合の例。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/4aa3ba7b-3205-9402-29e8-09e48a085660.png)

# サンプルデータ

説明に使用するサンプルデータは以下形式とする。
ただし、データ INSERT 時に、`id`（一意の値）が自動的に追加される。

```
{
  "pk": String,
  "col1": Number,
  "col2": Number,
  "col3": Number
}
```

# Partition Key

Partition Key を`/pk`とした場合、
`pk`と`id`が一致するデータは INSERT、UPDATE 時に競合となる。

以下、競合パターンイメージ。

```
test-container
  │
  ├─ pk: A
  │      ├─ {pk: "A", id: "1", ...}  ※ Partition Key conflict ※
  │      ├─ {pk: "A", id: "2", ...}
  │      ├─ {pk: "A", id: "3", ...}
  │      └─ {pk: "A", id: "1", ...}  ※ Partition Key conflict ※
  │
  ├─ pk: B
  │      ├─ {pk: "B", id: "1", ...}
  │      ├─ {pk: "B", id: "2", ...}
  │      └─ {pk: "B", id: "3", ...}
  │
```

Partition Key を指定する必要がない場合、
デフォルトの`/id`のままにすることで、`id`が一致するデータは INSERT、UPDATE 時に競合となる。
参考: [パーティション キーとして項目 ID を使用する](https://docs.microsoft.com/ja-jp/azure/cosmos-db/partitioning-overview#using-item-id-as-the-partition-key)

以下、競合パターンイメージ。

```
test-container
  │
  ├─ id: "1"
  │       └─ {pk: "A", id: "1", ...}  ※ Partition Key conflict ※
  │
  ├─ id: "2"
  │       └─ {pk: "A", id: "2", ...}
  │
  ├─ id: "3"
  │       └─ {pk: "A", id: "3", ...}
  │
  ├─ id: "1"
  │       └─ {pk: "B", id: "1", ...}  ※ Partition Key conflict ※
  │
```

# Unique keys

Unique keys に`/col1, /col2`を設定した場合、
`col1`と`col2`が一致するデータは INSERT、UPDATE 時に競合となる。

Unique keys を設定した場合も Partition Key による一意性は維持される。

以下 Partition Key に`/pk`、Unique keys に`/col1, /col2`を設定した場合の競合パターンイメージ。

```
test-container
  │
  ├─ pk: A
  │      ├─ {pk: "A", id: "1", col1: 1, col2: 2, ...}  ※ Partition Key conflict ※
  │      ├─ {pk: "A", id: "1", col1: 2, col2: 2, ...}  ※ Partition Key conflict ※
  │      ├─ {pk: "A", id: "2", col1: 3, col2: 2, ...}
  │      ├─ {pk: "A", id: "3", col1: 4, col2: 2, ...}  ※ Unique keys conflict ※
  │      └─ {pk: "A", id: "4", col1: 4, col2: 2, ...}  ※ Unique keys conflict ※
  │
  ├─ pk: B
  │      ├─ {pk: "B", id: "1", col1: 1, col2: 2, ...}
  │      ├─ {pk: "B", id: "2", col1: 2, col2: 2, ...}
  │      └─ {pk: "B", id: "3", col1: 3, col2: 2, ...}
  │
```
2022/2/27主にITとかセキュリティの記事

名古屋大医学部の教職員メールに不正アクセス、患者１８４人の個人情報が閲覧された恐れ(2/25)
https://www.yomiuri.co.jp/national/20220224-OYT1T50214/

JPCERT/CC「制御システムセキュリティカンファレンス 2022」資料公開、米国パイプラインへのランサムウェア感染事例も解説(2/25)
https://s.netsecurity.ne.jp/article/2022/02/25/47181.html

ＳＷＩＦＴからの排除は現在対ロシア制裁対象に入っていない＝財務省担当者(2/25)
https://jp.reuters.com/article/japan-sanctions-swift-idJPKBN2KU09Z

【動画】これ、全部フェイクです。ロシアのウクライナ侵攻めぐる誤情報にご注意を！(2/24)
https://nordot.app/869536919886708736?c=110564226228225532

ウクライナ、複数の政府ウェブサイトにＤＤｏＳ攻撃－機能停止(2/24)
https://www.bloomberg.co.jp/news/articles/2022-02-23/R7RJLNT0G1KX01

改正個人情報保護法の「個人関連情報」、匿名・仮名との違いやCookieとの関係は？(2/25)
https://active.nikkeibp.co.jp/atcl/act/19/00350/012100003/?i_cid=nbpnxta_sied_pickup

【Gmail最適化ハック】相手がメールを開封した日時を確認する方法(2/25)
https://www.lifehacker.jp/article/2202_gmail-hack-email-tracking/

「Web3」とはいったい何か？ウェブの歴史から読み解く理想と現実(2/25)
https://m.finance.yahoo.co.jp/news/detail/20220225-00297160-diamond-column

メタマスク（MetaMask）ウォレット上の使い方と注意点、盗難被害を防ぐには？(2/25)
https://hedge.guide/feature/metamask-wallet-bc202202.html

Apple Watchを売る時に必ずするべき1つのこと(2/25)
https://www.gizmodo.jp/2022/02/the-best-way-to-factory-reset-your-apple-watch.html

「その警告画面は偽物です」　国民生活センターが「サポート詐欺」に注意喚起(2/24)
https://news.biglobe.ne.jp/it/0224/imn_220224_3568128899.html

セールスフォースのバグ報奨金プログラム、2021年の支払額は約3億円超(2/25)
https://japan.zdnet.com/article/35184029/

企業向けルーターの利用実態調査で異変、常勝ヤマハが僅差で「首位陥落」(2/25)
https://active.nikkeibp.co.jp/atcl/act/19/00349/012100003/?i_cid=nbpnxta_sied_pickup

デジタル相「サイバー攻撃脅威高まる」　産業界に注意喚起(2/25)
https://article.auone.jp/detail/1/2/3/221_3_r_20220225_1645752372294105

デジタル相、サイバー強化必要　政府機関に対策要請(2/25)
https://news.yahoo.co.jp/articles/90371b4114414a8e00b1fdc8b20458593818848a

ニセのウイルス対策ソフトはウイルスより危険だ(2/25)
https://ascii.jp/elem/000/004/084/4084066/?rss

「ロシア政府に対抗作戦を行う」──ハッカー集団Anonymousが声明　サイバー攻撃を示唆(2/25)
https://news.biglobe.ne.jp/it/0225/imn_220225_3828527724.html

なりすましメールの到達を阻止するために必要なことは？ フィッシング対策協議会のイベントで「DMARCレポートの活用事例」を紹介(2/24)
https://internet.watch.impress.co.jp/docs/news/1390367.html

“東欧のシリコンバレー”の危機　日本IT企業が業務委託(2/25)
https://www.fnn.jp/articles/-/321064

「スリー」と「アンプリチュード」のECで不正アクセス　クレジットカード情報、最大10万件の漏えいの可能性(2/25)
https://www.fashionsnap.com/article/2022-02-25/acro-security-error/

中国で監視を強化する企業にネットユーザーが反発、その背景にあるもの(2/25)
https://japan.zdnet.com/article/35183965/

アウディが5Gを車載、Wi-Fiやインフォテインメントを高速化へ…ベライゾンと協力(2/24)
https://s.response.jp/article/2022/02/24/354561.html?utm_source=https://tokiocyberport.tokiomarine-nichido.co.jp/&utm_medium=referral

「表示が0.1秒遅れると、売上が1％減少する」絶対王者アマゾンがやっている"すごすぎるデータ分析"(2/25)
https://m.finance.yahoo.co.jp/news/detail/20220225-00054736-president-column

目指せ「オンライン市役所」、全国初のリモート相談専用ボックス　三田市が実証実験(2/25)
https://www.kobe-np.co.jp/news/sanda/202202/sp/0015089671.shtml

プロが厳選！　ワンランク上のActive Directory運用管理を実現するPowerShellコマンドレット10選(2/25)
https://atmarkit.itmedia.co.jp/ait/spv/2202/25/news008.html

ウクライナ侵攻直後から音声で情報交換　ツイッター「スペース」に5万人(2/24)
https://www.j-cast.com/trend/2022/02/24431728.html?p=all
Ansibleで配列の要素数ループさせる


## 配列
- 

```vars/main.yaml
services:
  - "user01"
  - "user02"
```

```main.yaml
- name: Create Directory
  file:
    path: /home/ec2-user/{{ item }}/
    state: directory
    owner: ec2-user
    group: ec2-user
    mode: 775
    recurse: yes
  with_items: "{{ services }}"
```
Bluetooth アダプタ TP-LINK UB500をLinuxに入れたときのメモ

# 手順

+ ほぼこの通りでできる：https://github.com/tedboudros/tplink-ub500-linux-patch-guide
+ debian bullseyeだとkernelが5.10なので(2022/02/27現在)そっちを入れないとだめ。
+ また、debianにはkmodsignがsbsigntoolに含まれないバグがあるためsign-fileを使う：https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=939392
+ bluetoothキーボードの場合途中で効かなくなるので、そのときはスクリーンキーボードを使う
  + 設定 -> アクセシビリティ -> 常にアクセシビリティメニューを表示する をやっておくと楽

# kmodsignが見つからない

+ linux-kernelをダウンロードした後で手順通りにビルドする。そうすると下記ディレクトリ(5.10の場合)にsign-fileができるのでこれを代わりに使う

```
/lib/modules/5.10.0-11-amd64/build/scripts/sign-file
```
Scrapy の Spider 実行時に指定できるオプションまとめ

クローラー&スクレイピング フレームワーク Scrapy のSpider 実行時に指定できるオプション
`$ scrapy crawl` コマンドだけではなく、`$ scrapy runspider` コマンドでも使用可能。

オプション | 説明
--- | ---
--help, -h | ヘルプを表示
\-a *NAME=VALUE* | Spider の __init__() メソッドにキーワード引数を渡す。複数回指定可能。
--output=*FILE*, -o *FILE* | 抽出した Item を保存するファイルパスを指定する。
--output-format = *FORMAT*, -t *FORMAT* | 抽出した Item を保存する際のフォーマットを指定する
--logfile=*FILE* | ログの出力先のパスを指定する。デフォルトでは標準エラー出力。
--loglevel=*LEVEL*,-L LEVEL | ログレベルを指定する。デフォルト値は DEBUG
--nolog | ログの出力を完全に無効化する。
--profile=*FILE* | プロファイルの統計を出力するパスを指定する。
--pidfile=*FILE* | プロセス ID を指定したパスのファイルを出力する。
--set = *NAME* = *VALUE*, -s *NAME*=*VALUE* | 設定を指定する。複数回指定可能。
--pdb | 例外発生時に pdb によるデバッグを開始する。

## Spider 実行時に指定可能な Format
拡張子 | フォーマットの説明
--- | ---
json | JSON 形式の配列
jl または jsonlines | JSON Lines 形式（各行に JSON のオブジェクトを持つテキスト）
csv | CSV 形式
xml | XML 形式
marshal | marshal モジュールでシリアライズしたバイナリ形式
pickle | pickle モジュールでシリアライズしたバイナリ形式