OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuコマンドでこれまで使えたやつ

# 初めに
こんにちはHayaa6211です．僕は普段Herokuを使ったbotなんかをよく作成してるのですがそこでよく使ったりたまに使うけどめっちゃ必要なコマンドとか忘れがちなので備忘録として置いときます．
途中途中gitの備忘録もあります
あとよかったら「これもよく使う！！」ってコマンド教えてください！

### 注意
- 初心者herokuユーザーなので間違っている可能性があります．その際はコメントをお願いします
- 途中，`{hogehoge}`といった表記があります．これは人によって異なる部分です．自分の環境の当てはめて実行してください．

## 見出し
1. [コンソール行く前](#コンソール行く前)
1. [login](#login)
1. [すでにデプロイしてるアプリをクローンしたい](#すでにデプロイしてるアプリをクローンしたい)
1. [ローカルのアプリをデプロイしたい](#ローカルのアプリをデプロイしたい)
2. __[gitコマンド](#gitコマンド)__
1. [普通のクローン](#普通のクローン)
1. [リモートから変更を取得](#リモートから変更を取得)
1. [ローカルの変更を確認](#ローカルの変更を確認)
1. [コミットの履歴](#コミットの履歴)
1. [指定したコミットの変更点](#指定したコミットの変更点)
1. [addの取り消し](#addの取り消し)
1. [プッシュの取り消し](#プッシュの取り消し)
1. [ローカルでブランチ作成](#ローカルでブランチ作成)
1. [ローカルでブランチ切り替え](#ローカルでブランチ切り替え)
1. [ブランチ名の変更](#ブランチ名の変更)
1. __[アプリ一覧](#アプリ一覧)__
1. [アプリ作成](#アプリ作成)
1. [アプリの環境設定を表示](#アプリの環境設定を表示)
1. [環境設定を設定](#環境設定を設定)
1. [環境設定の設定を解除](#環境設定の設定を解除)
1. [dynoの停止と実行(非推奨)](#dynoの停止と実行(非推奨))
1. [メンテナンスモードのon/off](#メンテナンスモードのon/off)
1. __[おわりに](#おわりに)__



### コンソール行く前
Herokuはgitを使用します．gitをダウンロードしましょう．

https://git-scm.com/

git上でherokuコマンドを使用するためにここからHeroku CLIをダウンロードしてください

https://devcenter.heroku.com/ja/articles/heroku-cli


### login
gitにHerokuアカウントを紐づけるためにloginします．

~~~
heroku login
~~~

実行すると，

~~~
heroku: Press any key to open up the browser to login or q to exit:
~~~

って聞かれるのでq以外を適当に入力してください．そしたらブラウザが開かれます．
英語なので少しわかりにくいですが画面に従ってloginしてください．(登録してなければ登録してください)

### すでにデプロイしてるアプリをクローンしたい

~~~
heroku git:clone -a {アプリ名}
~~~

これでクローンされました

### ローカルのアプリをデプロイしたい
すでにローカルで作業していたアプリをデプロイするときは

~~~
$ cd {作業ディレクトリ}
$ git add .
$ git commit -m {コメント}
$ git push heroku master
~~~

上から順に

1. 作業ディレクトリに移動
1. すべてのファイルをステージング
1. ステージングしたファイルをコミット (-mはコンソール上でコメントをするオプション．これがないとvscodeとかに飛ばされてコメント書ける)
1. コミットしたリポジトリをmasterブランチとしてプッシュ

### gitコマンド
僕が忘れてたやつだけ

#### 普通のクローン

~~~
$ git clone https://{hogehoge}
~~~

#### リモートから変更を取得

~~~
$ git pull
or
$ git fetch
$ git merge origin/master
~~~

#### ローカルの変更を確認

~~~
git status
~~~

#### コミットの履歴

~~~
$ git log
~~~

#### 指定したコミットの変更点

~~~
$ git show {コミットのハッシュ値}
~~~

#### addの取り消し

~~~
$ git reset HEAD {ファイル名}
~~~

#### プッシュの取り消し

~~~
$ git reset --hard {戻したいコミットのハッシュ値}
$ git push -f
~~~

#### ローカルでブランチ作成

~~~
$ git branch {作成したいブランチ名}
~~~

#### ローカルでブランチ切り替え

~~~
$ git checkout {ブランチ名}
~~~

#### ブランチ作成してそのまま切り替え

~~~
$ git checkout -b {ブランチ名}
~~~

#### ブランチ名の変更

~~~
$ git branch -m {古いブランチ名} {新しいブランチ名}
~~~

### アプリ一覧

~~~
$ heroku apps
~~~

### アプリ作成

~~~
$ heroku apps:create {アプリ名}
~~~

### アプリの環境設定を表示

~~~
$ heroku config
~~~

### 環境設定を設定

~~~
$ heroku config:set {KEY1}={value1} {KEY2}={value2} ...
~~~

### 環境設定の設定を解除

~~~
$ heroku config:unset {KEY}
~~~

### dynoの停止と実行(非推奨)

~~~
$ heroku dyno:scale web=0 #停止
$ heroku dyno:scale web=1 #実行
~~~

### メンテナンスモードのon/off
メンテナンスモードをonにするとデプロイしてもdynoが起動せず，初回起動もないのでデプロイ時は基本メンテナンスモードにしたほうが良いです．(webhookなどには引っかからなくなるのでその名の通りメンテナンス時だけon)

~~~
$ heroku maintenance:on
$ heroku maintenance:off
~~~


## おわりに
とりあえずこれまで使ったことあって忘れそうなやつを羅列しましたがかなり量ありますね．しかも調べてみたらherokuコマンドはまだまだあるのでherokuプロへの道は長そうです．
Power Automate でJSONプロパティの存在チェックをする

# シュレディンガーのプロパティ

社内承認フローをPower Automateで作っています。

承認結果やコメントは応答の都度SQL Sereverに保存しているのですが、
承認を回していくとき、コメントをする人としない人がいます。

Commentが入っていないケースをPower Automate 側で取得して扱おうとすると当然こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431807/c82bf461-3e9b-3aa9-dfa8-62516fe432fc.png)

これをPower Automate 側でなんとか対応できないかな～と思って試した備忘録です。

# 経緯(ただのメモ)
[empty](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#empty)はこの場合NG
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431807/7149abb4-538f-fc2e-72f7-70a1d3a49c38.png)

[length](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431807/f3826939-997f-2bfc-3f59-971f12c80373.png)
)でプロパティ数を数えるとかも一瞬考えたんですが、イケてなさすぎるのでやめました。
Object型に変換してしまっているのでアレイにするのもめんどい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431807/ba5e2182-0aab-a30c-4790-02955fa6d6a5.png)

# 存在チェックっぽいことができた

めちゃ普通の結論かもしれませんが、[string](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#string)を使うとうまくいきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431807/c9da41a1-bd8b-0f5e-4ed4-45fab4632c8e.png)

右辺は空欄です。
左辺の式の中身
```
string(items('オブジェクト名')['Comment'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431807/c7c15438-0e56-50f8-2b12-a8e9be78ab45.png)
赤線の部分がうまく機能してくれているみたいです。
今回は?はつけなくても大丈夫でした。
G検定に合格したので完走した感想

# 初めに
今回，2022年3月5日に開催したJDLA Deep Learning for GENERAL 2022#1(通称G検定)を受験し無事合格したので，勉強法や去年変更となったカリキュラムへの対策を今後の自分のためにも備忘録として残しておきます．

![general2022#1_regular.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112260/94d6db1b-2f76-0f4c-46ea-aaaa34a23ffb.jpeg)

![general2022#1_small.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112260/c0dac58a-cea8-dc4d-7f78-1b540b710392.jpeg)

## 目次
- [G検定とは](#a1)
- [実際に行った勉強法](#a2)
- [試験を受験しながら思ったこと](#a3)
- [全体の感想](#a4)
- [おまけ](#a5)

<a id="a1"></a>
## G検定とは
一般社団法人 日本ディープラーニング協会が主催する「ディープラーニングを事業に生かす知識を有しているかどうかを確認するための民間の試験」である．
一般にジェネラリスト向けの検定であり「人工知能やディープラーニングなどの技術とビジネス活用の双方を理解し、橋渡しができる「ビジネストランスレーター」としてのジェネラリストの育成」を目的としている．  
あとの細かい内容はHPを参照してください．

[G検定とは](https://www.jdla.org/certificate/general/)

<a id="a2"></a>
## 実際に行った勉強法
1. 最初に参考書 [Amazon](https://www.amazon.co.jp/dp/481561167X/ref=cm_sw_r_tw_dp_92S8D0MA9V3B6QJN6J51) を利用し基本知識の理解と暗記を行いました．
正直，参考書から出題される人工知能の歴史や機械学習の手法などはサービス問題だと思います．実際の試験では一問にかけられる解答時間がとても少なく，見直す時間なども考慮すると一問一答形式でさっさと答えていかなければいけません．  
そのためこの勉強は手を抜かず出てくる単語についてすぐに解説(おまけの知識があるとより良い)ができる程度まで理解を深めましょう．  
私は友人やTwitterなどで時々知識の確認として適当に単語の解説を行いました．

2. 参考書の内容が終わったら**模擬問題を一度解きましょう**．時間を測りながら回答し，わからなかった問題は必ずメモし後々理解できてるか確認しましょう．

2. 模擬試験を受けた結果が5割をこえているならいい調子です．ここからは参考書だけではカバーできない時事問題についてです．**時事問題はかなり多く出題されます**がその時によって問題の内容が大きく変わります．そのためインターネット上で提供されている対策サイトなどを活用し問題をたくさん解いたもん勝ちだと思います．

2. 対策サイトの問題を解いていき定期的(私は試験1週間前から毎日寝る前)に模擬試験を受けましょう．


<a id="a3"></a>
## 試験を受験しながら思ったこと
想像よりも時事,法律問題の量は多いです．また初見では「しらねーよばか！」と思うくらいマニアックな内容が出たりしますが実はヒントが隠されていてそれぞれの単語の理解ができていれば解ける問題もあったりします．焦らずに問題をよく読むことが大切だと思いました．  
また，これはどの試験でもいえることですが少しでも不安な回答があった時はマークしておきましょう．何割くらいとれているのかの参考にもなりますし見返しやすくなります．  
あとやっぱり参考書に載ってた内容はサービス問題です．2秒でこたえられるようにしておくと心に余裕ができます．

<a id="a4"></a>
## 全体の感想
今の時代はインターネットという最強ツールがあるので調べることができます．少しでもわからない単語や場所があったらその場で理解しることがとても大切です． 
これを読んでいる方でこれからG検定を受験する方はそこまで気負わず問題を解くことを楽しみにして勉強しているといいと思います．ふぁいてぃん！

<a id="a5"></a>
## おまけ
毎回合格率が6割程度なのですがこれってもしかして相対評価なんですかね？
合格点などは公表されておらず大体7割程度と言われていますがその時によっては6割前後でも受かってる人がいるので最低6割もしも時間に余裕があったら7割超えるように頑張るといいのかなと思いました．(気合)

あとG検定受けてめちゃくちゃに勉強意欲がわいてるので今のうちにE検定も受けたいなと思ってます．#2が8月にあるので勉強時間が取れそうなら受験します！
【Xcode・Swift・SwiftUI】あるコードを通過したときに音を鳴らす

# 本記事を1枚の画像で表すと
![スクリーンショット 2022-03-17 23.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/3541261e-8fa5-2ca3-356c-325215074a95.png)

# print デバッグ

Xcode でコーディングをしてそれをデバッグする際、例えば条件分岐をする際にどちらの分岐に入ったかを調べるために、 `print(_:separator:terminator:)` を使ったりします。そしてコンソールの出力を見て、どちらの分岐に入ったかを確かめることができます。

しかし、もしコンソールに大量の出力が流れるとすれば、コンソール内で検索やフィルタをかけなければ出力を追いかけるのは困難でしょう。

![スクリーンショット 2022-03-17 22.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/782c2524-2ae5-64f8-765a-fae5f91c3946.png)

# Breakpoint デバッグ

また、Breakpoint を作成し、一旦動作を止めてあげることでどちらの分岐に入ったかを確かめることもできます。Breakpoint を作成する方法はいくつかあります。

- Breakpoint を作成したい箇所の行番号をクリックする
- Breakpoint を作成したい箇所にキャレット（テキストカーソル）を移動させ、`Cmd + \`（JIS キーボードの場合は `Cmd + Option + ¥` など）を押す
- Breakpoint を作成したい箇所にキャレット（テキストカーソル）を移動させ、「Debug」>「Breakpoints」>「Create Breakpoint at Current Line」をクリックする

この方法では実行を一旦停止することとなり、様々な処理を同時に走らせている場合には、この停止を解除した後、不都合が起きる可能性も考えられます。

![スクリーンショット 2022-03-17 23.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/1f6a0b2e-d0e1-e6e0-445d-8e5fa6f892b7.png)

（一度作成した Breakpoint を削除するには、青い行番号を副ボタンクリック（右クリック）して「Delete Breakpoint」をクリックする方法や、キャレット（テキストカーソル）を移動させ、`Cmd + \`（JIS キーボードの場合は `Cmd + Option + ¥` など）を押すなどの方法があります。）

# Breakpoint に来ても実行を自動的に続ける

Breakpoint に処理が到達しても、実行を続ける方法があります。青で示された行番号をダブルクリックすると吹き出しが出てきます。
この「Options」にある「Automatically continue after evaluating actions（アクションの評価後、自動的に続行する）」にチェックマークを入れると、その Breakpoint に到達しても実行が自動で継続します。

![スクリーンショット 2022-03-17 23.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/f7ce47e2-e277-4fa4-a9c5-63a4ba72598e.png)

# Breakpoint に来たら音を鳴らす

![スクリーンショット 2022-03-17 23.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/3541261e-8fa5-2ca3-356c-325215074a95.png)

「Automatically continue after evaluating actions」するのはいいのですが、このままでは Breakpoint を作成した意味があまりありません。では、「Action」にある「Add Action」ボタンをクリックし、選択肢の中の「Sound」にチェックを入れましょう。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/0acd4a79-9969-59b1-3c3e-a14140c8ba7e.gif)

（GIF のため音はありません。右上の出力音量レベルを見てみてください。）すると、Breakpoint のあるコードを通過したときに、Mac から音がなるようになります。

もちろん、比較的最近の Xcode でできるようになった「Column Breakpoint」でも同じように音を鳴らすことができます。

![スクリーンショット 2022-03-17 23.16.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/49d0fe79-c3de-954c-da48-42531232ce12.png)

# Breakpoint に条件を指定する

これはおまけです。Breakpoint には「Condition」で条件を指定することもできます。例えば、以下のスクリーンショットの場合、`Button` の action が実行されるごとに `count` がインクリメントされていきますが、その `count` が2の倍数のときだけ音がなるように、「Condition」に

```swift
count.isMultiple(of: 2)
// count % 2 == 0 と同じですが、こちらのほうがより「2の倍数」であることが自然言語的に読み取りやすいでしょう
```

が入っています。

![スクリーンショット 2022-03-17 23.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/0ac87cd6-3c18-b40a-52ca-d500d30e1cd5.png)
未経験が独学でポートフォリオサイト作ってみた。

# 初めに
転職の際に何か見せられるものがあればと思い、作成しました。
https://yuutan1017-ylog.com/


![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051679/30e598f0-5f35-1485-7bf2-83c8d88acd43.png)

デザインはtailwind、動きはframer-motinoで書きました。
ただただ使ってみたくて選びました。


# 記載内容

まずほかのエンジニアの方々がどんなものを作成しているか調べ、シンプルな内容にしました。

- 自己紹介
- 技術スキル
- ポートフォリオ
- コンタクトページ


# 主なパッケージ
- next 12.1.0
- tailwindcss 3.0
- framer-motion 5.6.0

コンタクトページはnode-mailerを使用しました。
デプロイは相性のいいVercelで行いました。



# 最後に　

初めての作成で、学ぶことも多くとてもいい経験になりました。
まだまだ知識も浅く、至らない点も多いと思うので随時更新したいと思います。
DockerでLaravel8環境を作った際にタイムゾーン設定でハマった話

# はじめに
DockerでPHP公式イメージである「PHP:8.0-apache」を利用してLaravel8.4環境を構築した際に、タイムゾーン設定でハマった話。

# 環境
```
docker -v
```
Docker version 20.10.12

```
docker compose version
```
Docker Compose version v2.1.1

Ubuntu 20.40(WSL2)

上記環境でLaravelインストールまで終わった状態。

# 失敗手順
php.ini
```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

上記「php.ini」をホスト側（ローカル）に作成。
最低限の設定を記述し、コンテナ側「/usr/local/etc/php/php.ini」にマウント。
この状態でLaravel上で「date("Y-m-d H:i:s")」を実行してみると、UTC/協定世界時の日時が表示される。

なんで？？？と思いつつphpinfo()のdate欄を確認。
「date.timezone」は「Asia/Tokyo」になっているが、「Default timezone」は「UTC」のまま、、、
コンテナ停止・イメージ削除してからコンテナを再度起動しても変わらず。


# 成功手順
上記の失敗手順に加えて、Laravelソース内「config/app.php」の該当箇所を変更
```
'timezone' => 'UTC',
```

↓↓
```
'timezone' => 'Asia/Tokyo',
```

これだけでした。
tanh( log( 0 ) ) == -1

反比例

```math:
y = \frac{1}{x}
```

の X-Y 平面のグラフを $\frac{1}{\sqrt{2}}$ 倍スケールして 45° 時計回りに回転し、X'-Y' 平面に移すと

```math:
\begin{eqnarray}
\vec{X} & = & \frac{1}{2} (x, -x) \\
\vec{Y} & = & \frac{1}{2} (y, y) = \frac{1}{2} \left( \frac{1}{x}, \frac{1}{x} \right) \\
\vec{P} = \vec{X} + \vec{Y} & = & \frac{1}{2} \left(x + \frac{1}{x} ,\ x - \frac{1}{x} \right) = \left( \cosh{\theta}, \sinh{\theta} \right) \\
\end{eqnarray}
```

だから、双曲線関数の角度 $\theta$ は

```math:
\begin{eqnarray}
\theta
& = & \cosh^{-1}{ \frac{1}{2} \left( x + \frac{1}{x} \right) } \\
& = & \sinh^{-1}{ \frac{1}{2} \left( x - \frac{1}{x} \right) } \\
& = & \log{x} \\
\end{eqnarray}
```

が得られる。$\tanh{\theta}$ は

```math:
\begin{eqnarray}
\cosh{\theta} & = & \cosh{\left( \log{x} \right)} = \frac{1}{2} \left( x + \frac{1}{x} \right) \\
\sinh{\theta} & = & \sinh{\left( \log{x} \right)} = \frac{1}{2} \left( x - \frac{1}{x} \right) \\
\tanh{\left( \log{x} \right)} = \tanh{\theta} & = & \frac{ \sinh{\theta} }{ \cosh{\theta} } = \frac{ x^2 - 1 }{ x^2 + 1} \\
\end{eqnarray}
```

だから

```math:
\tanh{\left( \log{0} \right)} = \frac{-1}{1} = -1
```

となるハズ。

Google 検索に" tanh(log(0)) " を入れると "undefined" が返されますが、Mathematica では

```mathematica:
In[1]:= Tanh[Log[0]]
Out[1]= -1
```

となります。
Microsoft Teamsを導入した際の必要最低限のコンプライアンス設定

# はじめに
リモートワークが進みコミュニケーションも対面からチャットツールやオンライン会議に変わってきています。
Officeをよく利用する組織はMicrosoft Teamsを導入することが多いかと思います。
ただ、チャットツールを導入するといっても、ライセンスを割り当てしておしまいではなく、組織として導入する上で、必要最低限は必要だと思われるコンプライアンスの設定を備忘録として残そうと思います。
いろんな考え方があるので、異論は認めます。
あくまで、私個人の見解です。

# 設定すべき項目
* 監査
* アイテム保持ポリシー

# 設定したほうが良い項目
* Azure AD 診断設定

# 監査
監査の項目は、M365コンプライアンスにて設定することができます。
Microsoft 365内のアクティビティを記録してくれる機能です。
ユーザーがどんなファイルにいつアクセスしたのかなどが記録されています。
初期状態ですと、無効になっているため、有効にする必要があります。
注意点として、90日までしか保存されません。
より長く保存したい場合は、M365 E5などが必要になります。
詳細は以下記事を参照してください。
https://docs.microsoft.com/ja-jp/microsoft-365/compliance/audit-log-retention-policies?view=o365-worldwide

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258122/2a754881-6197-40d8-376b-f2e5b28cb7d5.png)

# アイテム保持ポリシー
アイテム保持ポリシーはTeamsにおけるチャット履歴を保存する機能です。
チャットという目に見えにくい空間における、パワハラやいじめなどが発生したした際の、調査時に使用することが多いかと思います。
プライベートチャンネルについても保持したい場合は、ポリシーを2つ作成してください。
詳細については以下参照してください。
https://docs.microsoft.com/ja-jp/microsoftteams/retention-policies

https://docs.microsoft.com/ja-jp/microsoft-365/compliance/retention-policies-teams?view=o365-worldwide

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258122/5e0df4a8-e07b-8896-e221-6c1fb88ca325.png)

# Azure AD 診断設定
Azure AD診断設定はAzure ADのログをAzureやサードパーティ製品にエクスポートし、格納する機能になります。
Azure ADログについては、いつ誰がどこからアクセスしたのかが記録されています。
このログはAzure AD Freeの場合1週間程度で流れてしまいます。
Azure AD P1ライセンス以上でも30日間しか持ちません。
不正アクセスなどがあった際の監査でも利用できるため、Azure ADログはエクスポートすることをおすすめします。
構成には、Azureのプラットフォームの知識が必要になるため、ハードルを上げすぎないようにおすすめとしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258122/945fa30c-cbdb-8c11-c225-8e9203fe0741.png)

# さいごに
あくまで個人の見解ですが、最低限のガバナンスは効かせられるのではないでしょうか？
実際の設定手順については、暇があれば記事作ろうと思います。。。
基本情報技術者試験対策　8日目

基本情報技術者試験対策　8日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

本日の目標
-
1問30秒で答えることを意識して取り組む。



間違った箇所
-
１、メモリインタリーブ
種記憶を複数のグループに分けて、各グループにそれぞれ順番にアクセスすることで、アクセスの高速化を図る。

２、データディクショナリ
データを保管するもの

３、データウェアハウス
企業の様々な活動を介して得られた大量のデータを整理・統合して蓄積しておき，意思決定支援などに利用する

４、ストリクトルーティング
通信パケットの転送経路を、送信側のルータで指定する

５、シンクライアントエージェント
シンクライアントからの要求に応じて、処理を代理して行うサーバ側のコンピュータ
シンクライアントとは、PCやスマホなどクライアント側の端末で、限られた処理しかできない

６、アキュムレータ
演算途中の結果を一時的に保持するレジスタ。レジスタは、CPUの中の部品で、データを記憶するところ

７、命令デコーダ
命令レジスタから受け取った命令を命令レジスタから受け取った命令を解読して、核装置に送信する

８、モジュール結合度
モジュール同士の関連性の強さ
モジュール結合度が弱い　→ 独立性が高い　→ 保守性がある
モジュール結合度が強い　→ 結合度が高い　→ 参照する時間が短い
６段階に分けられ、結合度が低い順に
①データ結合 (結合が弱い↑、独立性が高い↑)
処理に必要なデータだけを単一のパラメータとして受け渡す
②スタンプ結合
処理に必要なデータだけをレコードや構造体などのデータ構造として受け渡す
③制御結合
もう１つのモジュールの制御要素を受け渡している。
④外部結合
外部宣言された共通データを参照している。
⑤共通結合
共通域に宣言された共通データを参照している。
⑥内容結合 (結合が強い↓、独立性が低い↓)
お互いのモジュール内部を直接参照・分析

９、系統図法
目的を達成するために最適な方法を追求する

１０、PDPC法
いろいろな結果が想定される場合に、想定される障害と対策法を障害と対策法を図示することで最適な結果に至るプロセスを求める

11、SIEM
OS,データベース、アプリケーションなど多様なソフトウェアや機器が出力する大量のログデータを分析し、異常があった場合に管理者に通知して対策を知らせたりする

１２、営業秘密
①秘密として管理される
②事業活動に有用な技術上又は営業上の情報であること
③公然と知られていないこと

振り返り
-
1問30秒で取り組んだが、特にテクノロジー系の正答率が低く、その中でも、基礎理論とコンピュータシステムができていなかった。アルゴリズムやネットワーク、データベースなど計算や少し考える問題が苦手なため、次回はその辺りをメインに取り組んでいきたい。

>引用
https://www.fe-siken.com/
【クエリビルダ】Sharperlightエンジンが生成したSQL文を確認してみる

[Sharperlight](https://sharperlight.jp/)製品群共通のクエリ設計ツール**クエリビルダ**には、クエリのデバッグツールとして**プレビュー**機能が備わっています。クエリを設計したあと[プレビュー]ボタンを押すことで機能します。SQL文を確認するオプションもこのプレビュー機能の一部です。
![2022-mm-dd Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5d2b254b-fa85-0065-07e7-275d2f1d592c.png)
このようにクエリにより抽出されたデータを見ることができます。
![2022-mm-dd Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8c604741-2ab0-c54e-3b11-2d789414e984.png)
このプレビュー機能にはいくつかのオプションがあります。グリッド上部のアイコンメニューから利用できます。
生成されたSQL文を確認するのもこのオプションの中のひとつです。
![2022-mm-dd Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e7c8f00d-62e8-2952-66ab-160b6994751d.png)
これがクエリ定義を元に生成されたSQL文です。[Sharperlight](https://sharperlight.jp/)エンジンは、データモデルの定義を元にこのようなSQL文を動的に作成します。対象となるデータソースのデータ構造やビジネスロジックは、すべてデータモデル内で解決されており、この例でもみられるような Segment等は全てデータモデル設計段階で定義されます。
![2022-mm-dd Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c9948163-58fb-a742-3794-1a371b3001d9.png)
このSQL文は、対象データベースエンジンに準拠したSQL文であり、他のクエリツールでも実行可能です。

:postbox:[Sharperlight](https://sharperlight.jp/)
【M1Mac】パスを通そうと思ったらドツボにハマったので備忘録【Homebrew・MySQL】

## 何にハマったか

MySQLのインストール（より詳細にはmysql-client＠5.7のインストール）をbrewでして、いつもどおりパスを通そうと思ったら中々通らなかった。

## この記事を読むと何がわかるか
- M1 Mac環境でのパスの通し方。（Intel Macを使っていた人要注意）
- M1 Mac環境で、mysqlコマンドの実行方法・パスの通し方。

## ドツボにはまった経緯

この[リンク](https://awesome-linus.com/2020/09/17/mac-mysql-command-not-found/)の記事を始めとした、様々な技術記事で書かれているようにパスを通そうと試みた。

具体的には以下のような方法です。

### 1. ~/.bashprofileの変更

いつも通り、.bash_profileを変更します。

```bash
% echo 'export PATH="/usr/local/opt/mysql-client@5.7/bin:$PATH"' >> ~/.bash_profile
```

### 2. パスを通したあとの細かい作業

シェルの変更を保存して、シェルを再起動します。

```bash
% source .bash_profile
% exec $SHELL -l
```

### 3. パスが通っているか試す

もちろん、mysql-clientが使えるようになっているはずです!

```bash
% mysql -V
zsh: command not found: mysql
```

…悲しくなりました…なぜMySQLは私のことが嫌いなの…

## ドツボにはまった原因と解決方法

### 1. M1 Macのターミナルは標準がzsh

M1 Macのターミナルでは標準でzshが使用されているので、.bash_profileではなく.zshrcや.zprofileを変更します。(すでに存在している方を変更します)

実はこれで躓くの2回目です…悲しい…正しくは以下のように実行します。

```bash
誤)
% echo 'export PATH="$PATH:/usr/local/opt/mysql-client@5.7/bin"' >> ~/.bash_profile
正)
% echo 'export PATH="$PATH:/usr/local/opt/mysql-client@5.7/bin"' >> ~/.zprofile
```

### 2. mysql-clientが保存されているパスが違う

技術記事を鵜呑みにして、パスを同じにしておりました。

brewでinstallしたパッケージのパスは以下のように検索します

```bash
% brew --prefix "検索したいパッケージの名前"
例)
% brew --prefix mysql-client@5.7
/opt/homebrew/opt/mysql-client@5.7
```

### 3. 結論

以上のハマったポイントから、実際に実行すべきコマンドは以下のようになります。

```bash
% brew --prefix mysql-client@5.7
/opt/homebrew/opt/mysql-client@5.7
% echo 'export PATH="$PATH:/usr/local/opt/mysql-client@5.7/bin"' >> ~/.zprofile
% source .zprofile
% exec $SHELL -l
```

すると…

```bash
% mysql -V
mysql  Ver 14.14 Distrib 5.7.34, for osx10.17 (x86_64) using  EditLine wrapper
```

やったーーー！！！ MySQLは私のこと嫌いじゃなかったのね!!!

## 反省

M1 Macでの開発の際は、Macでの開発記事を鵜呑みにしないようにしましょう！（当たり前すぎて悲しい）

→ M1 Macの開発記事が増えるように、私も願っております。
【Unity2D】SpriteにLightを反映させる

Unityの3Dゲームで用いられるLightを、2DのSpriteに対しても反映させる方法です。
汎用性低めかもですが、自分用の備忘録に残しておきます。

【まえがき】
自作ゲームで3Dモデルと2Dイラストを組み合わせているのですが、
光源を設定したときに3Dモデルにしか反映されないのが前から気になってました。

下二枚の画像を見ていただければわかる通り、
2DSprite（下記画像のキャラクター）は光源の影響を受けていません。
![スクリーンショット 2022-03-17 213716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/d4d9c4bf-cc10-28f3-432f-29ee0eeddc04.png)
![スクリーンショット 2022-03-17 215807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/2aeacc3c-0c40-5a92-9d90-f03e5d35929e.png)

これを、光を反射して色や明るさを反映するようにMaterialを変更します。
最終的にこんな感じになります。
![スクリーンショット 2022-03-17 213618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/4fa8e921-a738-e48f-fa70-8bae6f2798d1.png)
![スクリーンショット 2022-03-17 215732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/4a87c94c-dd81-5528-2f61-d1061c34261a.png)


【本編】
* 手始めにSpriteと光源(Light)をシーンに配置します。今回の作業だと光源はPoint Lightがわかりやすいと思います。
![スクリーンショット 2022-03-17 220942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/ce197f51-b8e8-843c-7214-4fe27cdb633f.png)


* Materialを新規作成します。
![スクリーンショット 2022-03-17 220237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/36cec2d0-e2d2-638c-c02c-250f143a918d.png)


* 作成したMaterialを選択し、インスペクターにあるShaderを選びます。ドロップダウンリストからSprites→Diffuseをクリックします。
![スクリーンショット 2022-03-17 212743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/42ac7f12-c766-5f6e-1876-5ad5340e9bb2.png)



* 光の影響を受けさせたいスプライトを選択し、Materialの欄に先ほど作成したものをセットします。
![スクリーンショット 2022-03-17 213831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/f4fd8ff2-e58e-279a-e404-917465fcd62a.png)

* これでSpriteが光源に照らされるようになっているはずです。
![スクリーンショット 2022-03-17 213618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681124/4fa8e921-a738-e48f-fa70-8bae6f2798d1.png)

【あとがき】
こちらの記事でこのテクニックを知りました。ありがとうございます！
https://kan-kikuchi.hatenablog.com/entry/2D_Light
Raspberry Pi 4B にWindows10/11ARMを入れて SSDからブート その後５

ラスパイOS上でWindows10/11のインストールイメージをSSD書き込む方法です
時間はかかりますが、簡単に作成できます

参考HP　https://raspida.com/win11-on-rpi400-1step-install

参考HPに詳しく説明されているので、私がやってみたことをご紹介します

準備
---
Raspberry Pi 4B または 400
USB接続ができるSSDを２個（一つはラズパイOS、もう一つはWindowsをインストール）
電源供給ができるUSBハブ
今回購入しましたDC5.1V3.8AのスイッチングＡＣアダプターです
アンダーボルテージ（カミナリマーク）が時々（１日５回以上）発生していたので、何か対策はないかということでACアダプターを変更しました

config.txtには　over_voltage=4　と　arm_freq=1800　を追加しています
その状態でラズパイOSを起動しWindows10のインストールSSDを
オーバークロックのオプション付き（over_voltage=4　と　arm_freq=1800）で作成しました


結果
---

やっとWindowsも遅いながらも安定して使えるようになりました

CPU

	BCM2711 (ARM Cortex-A72)

	基本速度:	1.80 GHz
	ソケット:	1
	コア:	4
	論理プロセッサ数:	4
	仮想化:	非対応
	L1 キャッシュ:	320 KB
	L2 キャッシュ:	1.0 MB

	使用率	3%
	速度	1.80 GHz
	稼働時間	0:00:05:16
	プロセス数	124
	スレッド数	1364
	ハンドル数	46156
docker-composeで環境変数が読み込めないときの対処法。[WARNING: The MYSQL_ROOT_PASSWORD variable is not set.]

Rails(API) + MySQL + Reactという構成でポートフォリオを作成する中で、ローカルで開発したものをコンテナに入れて動かす際に環境変数関係でハマりました。

原因は簡単なことでしたが、解決までかなりの時間がかかったため、その道のりを記録に残しておきます。

## 前提条件
・macOS Monterey v12.1
・ruby 3.0.3
・Rails 6.1.5
・MySQL 8.0.28
・Docker 20.10.12
・Docker Compose v2.2.3

## やりたいこと
`docker-compose.yml`で`.env`に記載した環境変数を読み込みたい。
```yml:docker-compose.yml
version: '3'

services:
  db:
    image: mysql:8.0.28
    volumes:
      - ./etc/my.cnf:/etc/mysql/conf.d/my.cnf
      - hanger-talk_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      TZ: 'Asia/Tokyo'
    ...
    env_file:
      - ./api/.env
    ...
```

## 発生した問題
`env_file`で`.env`ファイルを指定しているのに、`docker-compose.yml`で読み込めない。
```console
$ docker-compose config

WARNING: The MYSQL_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
...
 environment:
   MYSQL_ROOT_HOST: '%'
   MYSQL_ROOT_PASSWORD: ''  <=ここ
   TZ: Asia/Tokyo
```

環境変数が設定されていないと言われていますが、これを解決するのに結構な時間を要しました。

## 原因と解決法
### 原因
`docker-compose.yml`と`.env`ファイルが同じ階層に設置されていない。
```ディレクトリ構成（失敗パターン）
rails-react-app
├── api
│    ├── ...
│    ├── config
│    │   ├── database.yml
│    │   └── ...
│    ├── ...
│    ├── .env  <= ここ
│    └── ...
├── front
│    ├── ...
│    └── ...
├── ...
└── docker-compose.yml
```


`docker-compose config`で、`docker-compose.yml`が読み込んでいる環境変数を確認します。
```console
$ docker-compose config
```
前述の通り、環境変数がセットされていないと言われました。
```console
WARNING: The MYSQL_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
```
### 解決法
`docker-compose.yml`と`.env`ファイルを同じ階層に置く。
```ディレクトリ構成（成功パターン）
rails-react-app
├── api
│    ├── ...
│    ├── config
│    │   ├── database.yml
│    │   └── ...
│    ├── ...
│    └── ...
├── front
│    ├── ...
│    └── ...
├── ...
├── .env  <= ここ
└── docker-compose.yml

```

もう一度`docker-compose config`をします。
```console
$ docker-compose config
```
きちんと読み込まれていました。
```console
$ docker-compose config

MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: password  <=ここ
TZ: Asia/Tokyo
```

## それでも読み込めないときは？
データの永続性のためのDockerボリュームが変更前の状態を保持して悪さをすることがあります。これを一度削除して、再作成します。

まずは念の為コンテナを停止・削除。
```console
$ docker-compose down
```
buildしたイメージを削除する。
```console
$ docker rmi $(docker images -a -q)   # すべてのイメージを削除するコマンド
```
ボリュームを削除する。
```console
$ docker volume rm volume_name
```
参考：https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes-ja

再度ボリューム、イメージ、コンテナを構築する。
念の為ボリュームの設定を確認。
```yml:docker-compose.yml
version: '3'

services:
  db:
    ...
  api:
    ...
  front:
    ...
volumes: 
  my-app_data:
    external: true
```
```console
$ docker volume create --name my-app_data
$ docker-compose build
$ docker-compose up -d
```
参考：https://qiita.com/damele0n/items/ac20e93749eb060fddfa

## Railsでも`.env`ファイルを使いたい
Railsではお馴染みの`gem 'dotenv-rails'`用に`.env`を作りたいときは、`docker-compose.yml`とは別に作ればOK。
```ディレクトリ構成（dotenv-railsでも.envを使う）
rails-react-app
├── api
│    ├── ...
│    ├── config
│    │   ├── database.yml
│    │   └── ...
│    ├── ...
│    ├── .env  <= ここ
│    └── ...
├── front
│    ├── ...
│    └── ...
├── ...
├── .env  <= ここ
└── docker-compose.yml
Docker コマンド備忘録

## 概要
dockerについて勉強したのでそのコマンド集を備忘録としてまとめます。


## dockerコマンド
### DockerHubからイメージのダウンロード
``` 
docker image pull <image>
or 
docker pull <image>
```

### コンテナの作成
-i, --interactive: 入出力を開く
-t, --tty: ttyの割り当てexit
```
docker create [OPTIONS] <image>
```

### コンテナの起動
- -a, --attach: コンテナへのアタッチ(このままではコマンド入力を受け付けない)
- -i, --interactive: アタッチを行い、コマンド操作が行える

```
docker start [OPTINOS] <container>
```

### 起動したコンテナにアタッチ(コンテナに入る)
createコマンドの`-ai`オプションを付けた場合と同じ
```
docker attach <container>
```

### コンテナの作成+起動+アタッチ
- -i, --interactive: 入出力を開いたままにする
- -t, --tty: ttyの割り当て
- -d: detachモードで起動(バックグラウンドで動かす)
- --name: コンテナに名前を付ける
- --rm: コンテナが終了した時にファイルシステムを自動で削除する
- -v, --volume: ファイルの共有
- --cpus: cpuの制限
- --memory: メモリの制限
```
docker run [OPTINOS] <image>
```

### 起動中のコンテナのコマンドを実行
```
docker exec <container> <command>
```

### コンテナの停止
```
docker stop <container>
```

### イメージ・コンテナ・ボリューム・ネットワークの一覧表示
```
docker <images>   # イメージの表示
docker ps -a      # 全てのコンテナの表示
docker volume ls  # ボリュームの表示
docker network ls # ネットワークの表示
```

### コンテナの詳細情報の表示
```
docker inspect <container>
```

### イメージの削除
```
docker rmi <image> # 複数選択可
docker image prune # 全てのイメージの削除
```

### コンテナの削除
```
docker rm <container>  # 複数選択可
docker container prune # 全てのコンテナの削除
```
pgAdmin: Table や View をGUI で作った場合の、Create SQL の取得方法

# 背景
Postgres をあまり使ったことが無い素人が、GUI で Table / View を作った際に、その Create 文を欲しくなった

# 概要
pgAdmin に普通に存在してた機能でした。

最初、Table/View の Property 画面からいけるかと思ってて諦めてたから嬉しい :laughing: 

1. Table/View 選択
1. [SQL] タブ開くだけ

![HowToGetCreateSQL.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/fcc7caaf-de34-cec1-f5b3-eac6cc122462.gif)

# 環境
postgresSQL 13 (or 14)
pgAdmin 5.5 (6.7 でも同様）

# あとがき
pgAdmin って便利ですねぇ
GoogleColaboratory上でMecab形態素解析


Python未経験でしたが、自然言語処理、形態素解析の話が業務で出たため会話できるよう**Mecab**での分かち書きをやってみました。
JupyterNotebookでも可能でしたが、GoogleColaboratoryでの話を備忘録兼初心者の経験として残します。
## GoogleColaboratoryとは
Googleが提供するサービスでGoogleアカウントさえあれば無料でPythonの実行がブラウザ上でできます。
Pythonってどうやって使うんだろう、環境設定で挫折しそう、そんな方でも手軽に試せます。
私のようなPythonに興味はあるけどあまり触れたことが無い人が初めて見るにはぴったりです。
プログラミングの学習は楽しさを見出さないと続かないもの、かくいう私も何度も学習を中断しています。
絶対続けるみたいな固い意志があればいいですが、少しの壁でも躓いちゃうと辞めちゃいます。
まず最初に簡単な環境で始めてみて面白さに気づけばよいと思います。

## テキストデータの分析
どの言語でも最初は'HelloWorld'ですよね。
でも画面に文字を出すだけでは何もおもしろくないしif文やfor文での処理も他の言語でやったことある人にはつまらないです。
そこで私はテキストを分析してみたいという目的ありきで学習を始めました。

定量的なデータと違いテキストデータは貯まりはしても分析できない、ただ眺めて終わってしまいがちです。膨大な文字を分析して利用できたら今まで見過ごしていたことに気づけるかも⁉
そう思いテキストデータを分析するにはといろいろ調べてMecabでの形態素解析にチャレンジしました。

## 形態素解析とは
私たちが日々使っている日本語はかなり複雑です。英語であれば単語と単語の間はスペースで区切られていますし、使われる文字もアルファベット26文字だけです。ところが日本語ではひらがな、カタカナ、漢字と膨大な種類の文字が使われ、単語を認識することが困難です。
そこで形態素解析と呼ばれる分析で文章を単語で区切り、それぞれの単語の品詞を判定しテキストの分析ができるようにします。
そういわれてもいちから一人で形態素解析をするのは難しい。ところがこの便利な世の中、OSSとして日本語の解析器が公開されています。
その中の一つとして今回Mecabを利用しました。

## Mecabを使ってみる
長々と書いてしまいましたが、さっそく使ってみましょう。
まずはMecabと辞書のインストールです。
GoogleColaboratory上で以下のコードを入力、実行しました。
~~~
!pip install mecab-python3
!pip install unidic
!python -m unidic download
~~~
pipというのはPythonのパッケージ（プログラムの塊のようなもの）の管理ツールで用意されているツールをインストールできます。
mecab-python3とunidicという辞書をインストールしました。
~~~
import MeCab
import unidic
mecab = MeCab.Tagger()
print(mecab.parse('私はPythonを学習しています。'))
~~~
続いてこのように入力すると以下のような結果が出ました。
```
私	代名詞,,,,,,ワタクシ,私-代名詞,私,ワタクシ,私,ワタクシ,和,"","","","","","",体,ワタクシ,ワタクシ,ワタクシ,ワタクシ,"0","","",11345327978324480,41274
は	助詞,係助詞,,,,,ハ,は,は,ワ,は,ワ,和,"","","","","","",係助,ハ,ハ,ハ,ハ,"","動詞%F2@0,名詞%F1,形容詞%F2@-1","",8059703733133824,29321
Python	名詞,普通名詞,一般,,,
を	助詞,格助詞,,,,,ヲ,を,を,オ,を,オ,和,"","","","","","",格助,ヲ,ヲ,ヲ,ヲ,"","動詞%F2@0,名詞%F1,形容詞%F2@-1","",11381878116459008,41407
学習	名詞,普通名詞,サ変可能,,,,ガクシュウ,学習,学習,ガクシュー,学習,ガクシュー,漢,"","","","","","",体,ガクシュウ,ガクシュウ,ガクシュウ,ガクシュウ,"0","C2","",2203704837153280,8017
し	動詞,非自立可能,,,サ行変格,連用形-一般,スル,為る,し,シ,する,スル,和,"","","","","","",用,シ,スル,シ,スル,"0","C5","",5370298291593857,19537
て	助詞,接続助詞,,,,,テ,て,て,テ,て,テ,和,"","","","","","",接助,テ,テ,テ,テ,"","動詞%F1,形容詞%F2@-1","",6837321680953856,24874
い	動詞,非自立可能,,,上一段-ア行,連用形-一般,イル,居る,い,イ,いる,イル,和,"","","","","","",用,イ,イル,イ,イル,"0","C4","M4@1",710568013079169,2585
ます	助動詞,,,,助動詞-マス,終止形-一般,マス,ます,ます,マス,ます,マス,和,"","","","","","",助動,マス,マス,マス,マス,"","動詞%F4@1","",9812325267808939,35697
。	補助記号,句点,,,,,,。,。,,。,,記号,"","","","","","",補助,,,,,"","","",6880571302400,25
EOS
```
品詞や表記ゆれのパターンが出るのがうっとおしい方は以下のように書けば分かち書きだけができます。

**コード**
~~~
import MeCab
import unidic
mecab = MeCab.Tagger('-Owakati')
print(mecab.parse('私はPythonを学習しています。'))
~~~
**結果**
~~~
私 は Python を 学習 し て い ます 。
~~~

こうやって単語に区切ることによって例えば
`アンケートでよく使われた単語は何だろう？`や`単語と評価の関係はどうだろう`のようなテキストから発見を得る段階に進むことができます。

## まとめ
今回はテキストデータの分析の初歩をGoogleColaboratoryで実行してみました。
ここから私はGoogleDrive上のCSVファイルを読み込んで頻出名詞を求めたり、アンケートでのスコアと単語の関係を調べたり、文章の類似性を調べたりと進んでいきました。
インストールがどうだの、PandasやNumpyといった有名ライブラリを使っての分析だのと調べながらでしたが簡単なループ処理で終わるよりかなり楽しく学習できました。
Pythonに興味を持った初心者の参考になれば幸いです。


参考
https://atmarkit.itmedia.co.jp/ait/articles/2102/05/news027.html
Kotlin KoansでKotlin入門　第１２回：Rename on import

# はじめに
公式の問題集[「Kotlin Koans」](https://play.kotlinlang.org/koans/overview)を解きながらKotlinを学習します。

過去記事はこちら
- Introduction
  - [第０回：Kotlin Koansについて](https://qiita.com/kosuke1/items/41d192af63485bfc8cb8)
  - [第１回：Simple Functions](https://qiita.com/kosuke1/items/5862a3ece96082a62e67)
  - [第２回：Named arguments](https://qiita.com/kosuke1/items/2af11262852ee41b5da7)
  - [第３回：Default arguments](https://qiita.com/kosuke1/items/16cb8ac780df58dc8054)
  - [第４回：Triple-quoted strings](https://qiita.com/kosuke1/items/52cfeed2c49b0252d40e)
  - [第５回：String templates](https://qiita.com/kosuke1/items/0221bbbc5bc70847be6f)
  - [第６回：Nullable types](https://qiita.com/kosuke1/items/aa96e422c5313b6961bc)
  - [第７回：Nothing type](https://qiita.com/kosuke1/items/1ca0e48820d58c9dfe16)
  - [第８回：Lambdas](https://qiita.com/kosuke1/items/8de74f9491e003127f53)
- Classes
  - [第９回：Data classes](https://qiita.com/kosuke1/items/1be2de1b4406b8d914bf) 
  - [第１０回：Smart casts](https://qiita.com/kosuke1/items/50bdecaa0740eb0e1a17)
  - [第１１回：Sealed classes](https://qiita.com/kosuke1/items/71a4da02fe1e99da5d63)


# 問題
[Rename on import](https://play.kotlinlang.org/koans/Classes/Rename%20on%20import/Task.kt)

コメントを解除してコンパイルさせます。```kotlin```パッケージの```Random```を```KRandom```に、javaパッケージの```Random```を```JRandom```にリネームします。

修正前のコード
```Kotlin
// import kotlin.random.Random
// import java.util.Random

fun useDifferentRandomClasses(): String {
    return "Kotlin random: " +
            // KRandom.nextInt(2) +
            " Java random:" +
            // JRandom().nextInt(2) +
            "."
}

```


# 問題のポイント
クラスや関数を[インポート](https://kotlinlang.org/docs/packages.html?&_ga=2.146335796.1801786368.1647520462-1976109019.1644486873#imports)する際、import指示文の後に```as NewName```を付けることで、別の名前を指定することができます。これは、異なるライブラリにある似たような名前の2つのクラスや関数を使いたい場合に便利です。
```Kotlin
import foo.Bar // Barはアクセス可能
import bar.Bar as bBar // bBarは'bar.Bar'を意味する
```

# 解答例
```Kotlin
import kotlin.random.Random as KRandom
import java.util.Random as JRandom

fun useDifferentRandomClasses(): String {
    return "Kotlin random: " +
            KRandom.nextInt(2) +
            " Java random:" +
            JRandom().nextInt(2) +
            "."
}
```
axiosの使い方

# 目的
Vue.jsを学習中にaxiosを使う機会があったので自分用メモ程度に記載

# axiosとは
非同期通信でデータを取得するためのもの
（やっていることはajaxみたいなもの）

# axios使い時
JSONデータを提供しているAPIと接続して、データを取得してくることが多い

# axiosのインストール

Vue.jsでaxisosを実際に使うには
1.axiosをアプリケーションにインストールする
2.CDNリンクを設置する
の2パターンがある。

## axiosをインストールする
axiosのインストールはnpmかyarmでできる
```
#npmの場合
npm install axios
#yarnの場合
yarn add axios
```
## CDNリンクを設置する
CDNを使ってaxiosを使う場合はheadタグに次のスクリプトタグを挿入する
```
<script src="https://unpkg.com/axios/dist/axios.min.js"><script>
```

# axiosの使い方
Vueファイルの中でaxiosを使うには
```vuejs:Vue.js
<script>
import axios from 'axios';

export default {
  data() {
    return{
      変数名: 初期値
    }
  },
  mounted() {
    axios
      .get('URL')
      .then(response => (this.変数名 = response))
  }
}
```
初心者による初心者の為のIaC(CloudFormation)Pt.1 概要編 〜コードで書いてみな、飛ぶぞ〜

# はじめに
皆さんインフラ、コードで書いていますか？私は全く書いたことありません！！
『コードで書いてみな、飛ぶぞ』が口癖のIaC推進派インフラエンジニアの方に師事しております。
IaC？？？聞いたことあるケド…ってくらいの読者を想定しております。なんせ私も最近までワードしか知らなかったもので。
ただの勉強したことのアウトプットですが、興味ある方に少しでも参考になればと思います。
# 目次
Pt.1では
- IaCのメリットデメリット
- Terraform or CloudFormation ?
の2項を扱っていきます！
# IaCのメリットデメリット
### メリット
- インフラ構築の設定ミス、漏れが減る
コンソールでポチポチする場合、設定をすっ飛ばしてしまったり、誤設定をしてしまう可能性がある。コード化するとミスが減りますね。

- Gitで管理することができる
Gitで管理できる、つまり構築や変更の差分をバージョン管理が可能になる。また、複数人でレビューができるようになるので、知見が共有できるようになります。

- テンプレを用意しておけば似た構成ならコピペですぐ作れる
コンソールだといちいち最初からポチポチしなければならないが、コードならコピペと多少の改変ですぐ同じインフラが構築できます。
新規サービスを立ち上げる時も、個人で色々設定していじくりまわして遊ぶ時も非常に便利ですね。
### デメリット
- 変更もコードでしなければならない
コードで構築した後にコンソールで変更するとコードと整合性がとれなくなってしまう。

- 学習コストがかかる
そらそうよ

(他にもメリットデメリットはあるのですが、本稿は初心者to初心者なので割愛しております。)
# Terraform or CloudFormation ？
IaCといえばTerraformというイメージがあると思いますが、AWS公式のサービスでCloudFormation(CFn)というのもあります。
私としてはGCPはしばらく触らなそうなので、AWS公式サービスのCFnでもいいのでは？と思ったり。というわけで両者の特徴を見ていきましょう。
## Terraform
- 記述方式はHCL(HashiCorp Configuration Language)
JSON互換ですが、バージョンによって書き方が変わってしまうのでちょっとハードル高いです。

- AWSもGCPも対応している
(初心者的には)これが一番メリットなのではないでしょうか？

- CFnよりもネットの情報が多い
QiitaではTerraformタグの記事は1840、CloudFormation記事は1150ヒットする。
あれ、思ったより差があるな…？
## CloudFormation
- 記述方式はJSON或いはYAML
はい、めっちゃ楽ですね。AWS内ではJSONで書かれていることが多いです。適当にポチポチしている私でも見かけるレベル。
YAMLの方が読み書きしやすいので、今後例文はYAMLにて書いていきます。

- AWSでしか使えない
Terraformと違いAWSのみでしか利用できません。GCPを使っている方はこの時点でアウトですね。ですが差し当たりAWSしか使わない人も多いのではないのでしょうか？

- 最新のフォーマットバージョンが”`2010-09-09`”
### つまり…12年弱書き方が変わってない…ってコト！？
ワ…！！ってどこからか聞こえてきそうですね、今も昔も変わらないフォーマットがここにあります。(もちろん設定値等は続々増えています。)
先のことはわかりませんが、一度習得すればずっと同じ書き方が通用しそうですね。
GCP+TFに浮気していたとしてもCFnは貴方を待ち続けている。かもしれない。
## 締め
どうでしょうか、IaCは知ってるけど、どういうメリットデメリットがあるのか、Terraformの他にどんな選択肢があるのか少しは知れましたでしょうか。
目下私はAWSを触っていく所存なのでCFnを選択致しました。(だってYAMLで書けるし…)
次回は CFnの記述方法を投稿したいと思います。
MySQL2::Error: FUNCTIONになった話

herokuにデプロイしていたオリジナルWEBアプリを
AWSにデプロイしようと奮闘している中で発生したエラー。


ActiveRecord::StatementInvalid in Home#feel
Mysql2::Error: FUNCTION ****_development.RANDOM does not exist: SELECT  


登録したイベントの一覧表示ページで発生。
困ったな。。。と思いつつ、エラーコードを観察すると、
MySQLの文言でRANDOMがどうとか言っている。


基準を満たすイベントの中からランダムで６つ取得し表示する。
という記述をしていてその時に"RANDOM()"を使っていたのだが、
どうやらこれが要因だった模様。


参考
https://qiita.com/dunkelrots/items/7dbde92ab13f388e0dc1


MySQLではRANDOM()ではなく　rand()で記述するのが正しいらしい。
今回herokuからAWSに変更する上でデータベースもmySQLに変更していたので
起きたエラーでした。

というかデータ取得時に使っている関数に”DB依存のものがある。”という事自体が
新しい発見だった。
【scrapy-selenium】spider作成〜メイン処理を書き始める前に先に修正した方が良いコード

作成したspiderのソースコードを書き始める前に、気をつけて置いた方が良いことの覚書。

例：Amazon（https://www.amazon.co.jp/ のスクレイピングをするとき）

### spider作成のコマンド
`scrapy genspider [-t crawl] www.amazon.co.jp/`
プロトコル名などの部分は要らないので、「https://」の部分は削除しておくこと。
crawlテンプレートを使う場合はオプション`-t crawl`をつけること。


### scrapy-seleniumを使う場合のmiddleware設定
[scrapy-seleniumの設定方法](https://github.com/clemfromspace/scrapy-selenium)の「READEME」の内容を参照

今回はchromeを使ったのでsettings.pyの最後に以下のように追記

```
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
SELENIUM_DRIVER_ARGUMENTS=['-headless']  # '--headless' if using chrome instead of firefox
```

また、45行目あたりを以下のように変更
```
# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
DOWNLOADER_MIDDLEWARES = {
    'scrapy_selenium.SeleniumMiddleware': 800
}
```

### spiderファイルの中身
##### `class KeywordExploreSpider(CrawlSpider):`直下

* spider作成時に入力したものが反映されるので下位ドメインの記述がある場合は削除
`allowed_domains =`

（例：
www.amazon.co.jp/ref=nav_logo
→www.amazon.co.jp/）

* 初期設定だと`http`になるので、`https`にする
また、行末の「/」は不要なので削除
`start_urls = `

（例：
http://www.amazon.co.jp/ref=nav_logo/
→https://www.amazon.co.jp/ref=nav_logo ）

##### その他覚えておくと便利なコード
* ブラウザの画面遷移とかの時間待って上げてから次の動作を命令する
`sleep(3)`

事前にsleepモジュールをインポートしておくこと
`from time import sleep`

* ヘッドレスモード（PC上にブラウザを立ち上げない）で動いてるので、
所々スクリーンショットを取りながら動作を確認。
`driver.save_screenshot('01_ブラウザ立ち上げ.png')`

ターミナルでseleniumとchromedriverをインストールしておくこと
```
pip3 install selenium
brew install chromedriver
```

モジュールのインポート方法は以下の通り
`from selenium import webdriver`

* スクリーンショットを取ろうにも、画面が一部しか映らなくて、ちゃんとできてるか不安な場合追記
JavaScriptで画面をフルスクリーンにすることができる。
```
        w = driver.execute_script('return document.body.scrollWidth')
        h = driver.execute_script('return document.body.scrollHeight')
        driver.set_window_size(w, h)
```
Virtualenv上のipythonが起動できないので対処

環境
__・__ __OS__ - Ubuntu 20.04.4 LTS
__・__ __virtualenv__ - 20.13.2
__・__ __python3__ -  3.8.10
__・__ __ipython__ - 8.1.0
（2024/2/8追記）見ての通り古い情報です。ご注意ください。

# ipythonが起動できなかった
ある日Virtualenv上のipythonを起動しようと思い、ipythonと打ったらこんな事に。（ipythonは何かのパッケージと一緒に導入された＆初起動っぽかったです）
```
~~~~~ 中略 ~~~~~

AttributeError: 'PosixPath' object has no attribute 'readlink'

If you suspect this is an IPython 8.1.0 bug, please report it at:
    https://github.com/ipython/ipython/issues
or send an email to the mailing list at ipython-dev@python.org

You can print a more detailed traceback right now with "%tb", or use "%debug"
to interactively debug it.

Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
    c.Application.verbose_crash=True
```

エラー文で検索して出てきたGitHubのissueを見てみると、site-packagesのあたりが変になっている様子。元ページはややこしいうえに英語なので、本記事に日本語でまとめてみました。

# 解決法
まず、Virtualenvを導入したディレクトリに移動します。
そして起動し、site-packagesの絶対パスを出力。
```shell
cd なんたらかんたら
source venv/bin/activate  
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
```
site-packagesまでの`相対パス`を把握します。
自分の場合は`venv/lib/python3.8/site-packages`でした。

次のコマンドの最後に`相対パス/IPython/core/interactiveshell.py`を追記して実行。
```shell
sed -i 's/p.readlink()/p._from_parts(os.readlink(p,))/g' 
```
自分の場合は以下のようになりました。
```shell
sed -i 's/p.readlink()/p._from_parts(os.readlink(p,))/g' venv/lib/python3.8/site-packages/IPython/core/interactiveshell.py
```

そして、`ipython --version`と実行すると`8.1.0`が出力。
治りました！

__参考__ - https://github.com/ipython/ipython/issues/13554

# そもそも（追記）
2022/3/18時点で、ipython-8.1.0以降は不安定っぽい？です。
`from IPython.lib import passwd`を実行すると、`ImportError: cannot import name 'passwd' from 'IPython.lib'`と出ました。

GitHub上のIPythonのリポジトリを見ると、passwdが入っている筈の`IPython/lib/security.py`も無い様子。

最終的にipythonを入れ直しました。
`pipdeptree`で確認したところバージョンが指定される依存関係も無かったので、ipython7以上8未満に。
```shell
pip3 uninstall -y ipython
pip3 install 'ipython>=7,<8'
```
ipython-7.32.0が入りました。
Solidityのmemoryとstorageについての備忘録

## はじめに
今回はdAppsを練習で実装している際に「storage」と「memory」の扱い方に関して少し戸惑ったので備忘録として残しておきます。

## storage
storageはブロックチェーン上に永久に保存される変数。

**可変長配列を使用する場合、storageで宣言する必要がある。**

関数外で宣言する場合、デフォルトでstorageになっている。

ブロックチェーン上に保存するので、ガス代が高くなる。

## memory
コントラクトを実行する場合にのみ保持される変数。

→ブロックチェーン自体に保存されるわけではないため、storageと異なりガス代もかからない。

関数内で宣言する場合にはデフォルトでmemoryになっている。

## 実装の際に苦労した点
可変長配列を返そうと考えたが、結構苦戦しました。

以下がうまくいかなかったコードです。

```solidity
function _transferableNFTs(uint256 stage) private view returns (NFTItem[] memory) {
        // return用の変数の宣言
        NFTItem[] list;
        // itemsは状態変数
        for (uint256 index = 0; index < items.length; index++) {
            if (items[index].stage == stage && !items[index].sold) {
                list.push(items[index]);
            }
        }
        return list;
}
```

memoryであるにもかかわらず配列の宣言の際に初期化を行っていないのでエラーになりました。

そして次に書いたのが以下のコード

```solidity
function _transferableNFTs(uint256 stage) private view returns (NFTItem[] storage) {
        // return用の変数の宣言
        NFTItem[] storage list;
        // itemsは状態変数
        for (uint256 index = 0; index < items.length; index++) {
            if (items[index].stage == stage && !items[index].sold) {
                list.push(items[index]);
            }
        }
        return list;
}
```

デフォルトでmemoryになっているので宣言の際に「storage」を追加し、返り値もstorageに変更しました。

しかし、**storageを返り値にすることができない**ためエラーになります。

そして以下のようなコードに変更しました

```solidity
function _transferableNFTs(uint256 stage) private view returns (NFTItem[] memory) {
        // _transferableNFTCountで事前に配列の数を取得する
        uint256 count = _transferableNFTCount(stage);

        // return用の変数の宣言
        NFTItem[] list = new NFTItem[](count);

        // 新しい配列用のインデックスの宣言
        uint256 currentIndex = 0;

        // itemsは状態変数
        for (uint256 index = 0; index < items.length; index++) {
            if (items[index].stage == stage && !items[index].sold) {
                // pushではなく代入にする
                list[currentIndex] = items[index];
                currentIndex++;
            }
        }
        return list;
}
```

storageで値を返すことはできないので、memoryの宣言に変更しました。

**memoryで宣言する場合、固定長配列になるので事前に配列の長さを定義しておく必要があります。** そのため、宣言前に配列の長さを取得しています。

また、固定長配列の場合は「push」ではなく、代入になるので「currentIndex」というインデックスを別途宣言しています。

これによってmemoryでも実質的に可変長配列を返却できるようになります。

## 最後に
solidityに可変長配列がなさそうだったので実質的に実装しました。

もし、より効率的な方法があれば教えていただけると幸いです🙇
Nuxt3 + TailwindCSS の始め方

```zsh
% npx nuxi init my-great-project
% cd my-great-project
% # yarn add -D nuxi
% yarn add -D tailwindcss@latest
% # yarn add -D postcss@latest autoprefixer@latest
```

```nuxt.config.ts
import { defineNuxtConfig } from 'nuxt3'

// https://v3.nuxtjs.org/docs/directory-structure/nuxt.config
export default defineNuxtConfig({
  ...
  css: [
    '@/assets/css/main.css',
  ],
  build: {
    postcss: {
      postcssOptions: {
        plugins: {
          tailwindcss: {},
        },
      },
    },
  },
  ...
})
```

```zsh
% yarn run tailwindcss init -f
```

```tailwind.config.js
module.exports = {
  content: [
    './app.vue',
    './components/**/*.{vue,js,ts}',
    './layouts/**/*.{vue,js,ts}',
    './pages/**/*.{vue,js,ts}',
    './plugins/**/*.{js,ts}',
    // './nuxt.config.{js,ts}',
  ],
  presets: [],
  ...
}
```

```assets/css/main.css
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
    h1 {
        @apply text-2xl;
    }
}
```

```app.vue
<template>
  <div>
    <h1 class="text-blue-500">Hello</h1>
    <NuxtWelcome />
  </div>
</template>
```

```zsh
% yarn dev
```
Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化（Rails）

Deviseを使っていたRailsアプリケーションで、ログイン情報としてIDとパスワードとは別に、**特定の条件をユーザーが満たす場合にそのユーザーのログインを許可したくない**場面があり、その際の制御と日本語表示を学んだので備忘として記載します。

# やりたいこと
ユーザーはメールとパスワードでログイン可否の認証を行なっている。
しかしながら、ユーザーテーブルにはロック状態かどうかを判定するカラムがあり、ユーザーがロックされている場合にはログインさせたくない。
また、エラーメッセージを日本語化したい。

## １. ユーザーにログインさせない方法

結論：Deviseが用意している[`active_for_authentication?`メソッド](https://github.com/heartcombo/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in) を使う

```ruby:user.rb
def active_for_authentication?
  super && active? # ユーザーがログインするためには、active?がtrueを返すことも必要
end
```

## 2. エラーメッセージの制御

結論：`inactive_message`メソッドを使う

```ruby:user.rb
def inactive_message
  active? ? super : :account_inactive # active?がfalseの時はdevise.
end
```

日本語化ファイル（devise.ja.yml）で日本語エラーを記載

```yml:devise.ja.yml
devise:
  failure:
    account_inactive: 'ロックされているためログインできません'
```

## 3. エラーメッセージに引数を渡したい
ユーザーカラムでは別で`name`カラムを持っており、エラーメッセージは、例えば`name`がrubyという人なら、
「rubyさんはロックされているためログインできません」といったエラーメッセージを表示したい。

結論：deviseのロケールではなく別のロケールで記述する

```ruby:user.rb
def inactive_message
  # :account_inactiveから修正
  active? ? super : I18n.t('flash_message.inactive_user', name: name)
end
```

`devise.ja.yml`の方に向ける方法で記載できるのかなーと思って試したり調べたりしましたが、出来なさそうだったので大人しく`ja.yml`に記載しました。
（こうやればできる、というのがあればぜひ教えてください）

```yml:ja.yml
ja:
  flash_message:
    # nameを受け取りたいなら%{name}と記載する
    inactive_user: "%{name}さんはロックされているためログインできません"
```

# 参考
ここまで書いて、この記事のほとんどは以下の記事に綺麗にまとめられていることを発見しました。
[RailsのDeviseで特定の条件のアカウントをログインさせなくする](https://qiita.com/Naggi-Goishi/items/49f758608f93286a3701)
WSL上でのVuls処理速度確認

## 目的

Vulsで大量の処理をする場合の基礎検証を軽めに

### 確認内容

- 下記それぞれの条件で CPE 10件を処理
    - sqlite と redis
    - CPE Scan とgo-cve-dictionary server
        - CPE Scanでは10Hostに1個ずつCPEを記載
        - go-cve-dictionary serverは10回リクエスト 
- WSL と WSL2も比較しようかと思ったけどredisにすれば十分な速度になりそうなのでWSL2は未確認（そのうちやるかも）

### 結果

| WSL ver | db type | Scan type | 結果 |
|:-:|:-:|:-:|:-:|
|  1 | sqlite  | CPE Scan  | 100  |
|  1 | sqlite  | go-cve-dictionary server |  65 |
|  1 | redis  | CPE Scan  |  12 |
|  1 | redis  | go-cve-dictionary server |  12 |

### 準備

- [Install Manually · Vuls](https://vuls.io/docs/ja/install-manually.html)
- [vulsio/go\-cve\-dictionary: Build a local copy of CVE \(NVD and Japanese JVN\)\. Server mode for easy querying\.](https://github.com/vulsio/go-cve-dictionary)

### スキャン手法

- [CPE Scan · Vuls](https://vuls.io/docs/ja/architecture-cpe-scan.html)
- [vulsio/go\-cve\-dictionary: Build a local copy of CVE \(NVD and Japanese JVN\)\. Server mode for easy querying\.](https://github.com/vulsio/go-cve-dictionary) の server mode
ThonnyではなくVSCodeで全部完結するようにした

[前回の記事](https://qiita.com/prln/items/2cee43a75c20ba493b4e)ではRasppberry Pi PicoでLチカしました．
その際にThonnyというIDEを使ってプログラミングをしたのですが，あれサジェスト機能とかないんですよね．．．

まあ使いにくかったです．

できれば普段使っているVSCodeを使ってサジェスト機能とか使いながら開発を進めていきたかったので，今回はそれができないか試してみました．

結論としてはできたので記事にしていきます．
やり方解説している記事はあったのですが，その方法では少なくとも私はできなかったので少し詳しく解説します．


## やり方
VSCodeの拡張機能Pico-Goというものを使います．
![767ffccfc150342aad7ea019089a0652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/4aecf7c8-a69a-de66-55f1-73461cf5af14.png)

こんなのです．

これをインストールしたら
VSCodeでpythonファイルが入っているフォルダを開いて(既に開いていたらOK)

``Ctrl``+``Shift``+``P``でコマンドパレットを開き，``>Pico-Go > Configure Project``と入力します.
![89774c5e058df6df90df031e07728ec8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/4d7c3b0e-a62b-858b-cba3-f77775641b89.png)

これで設定が完了するので，サジェスト機能やらが使えると思います．

次に，ラズパイ ピコを接続します．
![e18bcc015380c1a3af8f8fd7708f5cab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/0fcab673-cdd4-ccce-ec7e-69126d9fda0a.png)
こんな感じでVSCodeの下にボタンがあると思うのですが，ラズパイをパソコンに接続してから，このPico Disconnectedと書かれているボタンを押してください．
Pico Consoleに``Connected to COM3...``のように表示されればOKです．

実行するためにはRunと書かれているボタンを押せば実行できます！

## おわりに
一応説明されている記事はあったのですが，その方法ではできなかったので実際にできた方法をシェアしておきました！

また何かあれば記事を書きます！
それでは
Bootstrapをモバイル端末で見たとき小さくなる時の対処法

# 症状
スマホなどの端末で見るとアイコンが小さくなる。
![スクリーンショット (149).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967873/d6e2fed5-9d4c-c4a9-092f-8fae2b7eefee.png)
# 解決法
before
~~~ HTML
<head>
    <meta charset="UTF-8">
    <title>〇〇〇</title>
    <link rel="stylesheet" href="/resources/css/bootstrap.css">
    <script src="/resources/js/bootstrap.js"></script>
  </head>
~~~
after
~~~ HTML
<head>
    <meta charset="UTF-8">
　　<!-- 追記 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
　　<!-- 終わり -->
    <title>〇〇〇</title>
    <link rel="stylesheet" href="/resources/css/bootstrap.css">
    <script src="/resources/js/bootstrap.js"></script>
  </head>
~~~
パスはそれぞれの環境に合わせて書き換えてください。
VScodeで「!」打ってからのEnterキーのショートカットを使えば自動入力されるっぽい。
# 結果
![スクリーンショット (150).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967873/866c5c8f-d35a-4273-ab1e-334492f56a02.png)
Blenderで4次元データの可視化

## やること

4次元データのグラフをBlenderで作成してみましょう。
4軸目は、球のサイズにします。

## やってみる

データはダミーで作ります。

```py
import bpy
import numpy as np


def draw(data, scale=0.02):
    mn = data.min()
    mx = data.max()
    data[:, :3] = (data[:, :3] - mn) / (mx - mn) * 2
    for x, y, z, s in data:
        bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=3, radius=s * scale, location=(x, y, z))
    bpy.ops.object.select_all(action='SELECT')
    bpy.ops.object.shade_smooth()
    bpy.ops.mesh.primitive_cylinder_add(vertices=4, radius=0.02, location=(1, 0, 0), rotation=(0, 1.5708, 0))
    bpy.ops.mesh.primitive_cylinder_add(vertices=4, radius=0.02, location=(0, 1, 0), rotation=(1.5708, 0, 0))
    bpy.ops.mesh.primitive_cylinder_add(vertices=4, radius=0.02, location=(0, 0, 1))
    bpy.ops.object.select_all(action='DESELECT')

# 今回は乱数で生成するが、np.loadtxtでCSVから読んでもよい
data = np.random.default_rng(0).uniform(0, 100, (20, 4))
data[:, 3] = data[:, 3] // 10 + 1

draw(data)
```

実行結果

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/bce35b9a-91b4-9bf1-ed9e-176bec50896e.jpeg" width="300">

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

以上
rails6 Bootstrapテンプレートでのエラー

こちらは、私がBootstrapのテンプレートを使用した時につまづいたエラーについて紹介します。

# 環境
ruby 3.0.2
rails 6.1.4
bootstrap 5.0.0-beta3
popperjs 2.10.2
webpacker 5.0

# エラー内容
bootstrpのテンプレートをインストールし、ダウンロードしたフォルダやファイルを自分のアプリに組み込んでいきます。
その時に、stylesheetsフォルダーに必要なcssやscssのファイルも一緒に移行しました。
そして、ローカルにアクセスして見たところ、
```
Sprockets::DoubleLinkError
```
こちらは、「同じ出力パスを持つ複数のファイルをリンクできない」というエラーのようでした。

# つまづいたポイント
Rails6からwebpackerがデフォルトでインストールされるようになりました。
webpackerでは、cssファイルではなくscssファイルを使用することでスタイルの編集が可能になります。
なので、stylesheetsフォルダー中にcssファイルかscssファイルがあるとrails側でどちらを見ればよいか分からずにエラーとなりました。
# webpackerとは
Webpackとは、CSS、JavaScript、画像などを１つのファイルとしてまとめるためのモジュールバンドラーで、node.jsのモジュールの1つです。

こちらの記事を参照
https://qiita.com/PonPon3/items/0957e69c0927be5c1a8b

# 対処法
不要なcssファイルを削除しました。
エラーメッセージ内に不要なファイル名が表示されるので、そのファイルをその都度削除していくと良いと思います。