OmniAICreator/Qiita-1.07M huggingface dataset:
Openstackは何ができるかまとめてみた

今回はOpenstackについて、どのような機能があるか自分なりまとめてみました。<br>今後もクラウド環境を触れる機会もあるため、少しでも参考になればと思います。<br>また、当記事に過不足ございましたら、ご了承ください。
#1．Openstackとは
まずはじめに、Openstackとは何かについて説明します。
>OpenStack は、プールされた仮想リソースを使用して<br>プライベートクラウドおよびパブリッククラウドを構築および管理するプラットフォームです。
引用サイト：[『Red Hat』](https://www.redhat.com/ja/topics/openstack)より

<img width="350" alt="Openstack" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681098/7227de41-e49e-0edf-4a1a-e689d515f548.png">

※もう少し砕いて説明するとクラウドコンピューティングを構築するソフトウェアです。
　クラウド環境で構築することでネットワークや仮想マシンなど操作や管理が容易になります。
　またOpenstackは、オープンソースソフトウェア(OSS)であるためライセンス料金が不要になります。


#2．Openstackでどのようなことができるのか<br>
####1．プライベートクラウドの作成<br>
プライベートクラウドとは、自社専用のクラウド環境です。<br>外部にクラウドの情報を公開しないことで、自社専用の構築環境を運用できます。<br>必要に応じて作成したインスタンスの削除やフレーバやリソースなどを柔軟に構築ができます。<br>
また、運用するに辺りセキュリティ面ではパブリッククラウドと比較して高い性能があります。<br>他にもインフラのキャパシティ向上するため、
コンピュートやストレージに関する大規模な要求にも対応可能になります。<br>
####2．パブリッククラウドの作成<br>
パブリッククラウドとは、エンドユーザーが所有していない<br>ITインフラストラクチャから作成されたクラウド環境です。
現在では、スタンドアロンで利用する機会が少なくなり、<br>異種混合環境の一部として利用されるようになりました。
その影響で低コストで利用できることやパフォーマンスを向上させることで、<br>サービスの幅が広がっています。
####3．ネットワーク機能仮想化<br>
ネットワーク機能仮想化(NFV)は、ルーター、ファイアウォール、ロードバランサーなど、<br>従来はプロプライエタリー・ハードウェアで実行されていたネットワークサービスを<br>仮想化する方法のことです。<br>NFVを利用することで、物理ハードウェアを少なくなり、リソースを統合することで<br>物理的なスペースや電力など全体的なコストを削減が可能になります。
####4．コンテナの利用<br>
コンテナはシステムの他の部分とは分離された一連のプロセスです。<br>このコンテナを利用することで、開発からテスト環境、<br>または商用環境へ移行することが容易にできます。
#3．Openstackを利用する上で便利だと思った点
####1．オープンソースソフトウェア(OSS)であること
AWSを活用する機会も増えておりますが、ライセンスを支払うことが不要であるため、<br>気軽にクラウド環境へ導入しやすいと感じました。
しかし、Openstackを導入するに辺り設定や内部構造が複雑であるため、<br>簡単ではありません。
####2．自由なクラウド環境を構築しやすい
利用目的に応じて必要な機能をインストールや複数サーバーを分割するなど、<br>機能拡張がしやすい。
パブリッククラウドとプライベートクラウドの利用は、<br>コストとリスクを考慮して運用することができるためメリットがあると感じました。
#4．まとめ
Openstackの概要や個人的に便利だと思うことについて、記述しました。
業務で触れる機会がありますが、詳細な内容を深く知る機会があまりないため<br>この機会にまとめることができ良かったです。

#5.参考文献
・[OpenStack とは | Red Hat](https://www.redhat.com/ja/topics/openstack)
・[OpenStack（オープンスタック）とは : 富士通 - Fujitsu](https://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/virtual/openstack/)
React+ViteをHerokuにデプロイしようとしたらエラーに悩まされた話

~~一端のエンジニアらしく~~自分でサービスを作ってみようとしてHerokuですぐつまづいたのでその備忘録

<h1>ディレクトリ構成の罠</h1>

herokuのアカウント作成・github連携はすんなりいき、いざ deploy branchボタンを押すとこんなエラーが
```
ERROR: Application not supported by 'heroku/nodejs' buildpack
 !     
 !     The 'heroku/nodejs' buildpack is set on this application, but was
 !     unable to detect a Node.js codebase.
 !         
 !     A Node.js app on Heroku requires a 'package.json' at the root of
 !     the directory structure.
```

package.jsonがルートディレクトリにない...？
それもそのはず。herokuと連携していはgithubのブランチではこんな構成を取っていた。

```
├── backend
│   ├── api
│   ├── backend
│   └── manage.py
├── frontend
│   ├── src
│   ├── index.html
│   ├── package.json
│   ├── ...
│ 
├── docker-compose.yaml
├── DockerfileDjango
├── DockerfileNode
├── ...

```

要はReactのコードをfrontendディレクトリの配下においていたせいでherokuがpackage.jsonを見つけれなかったというエラーだった。package.jsonがfrontendの下にいると教えるのが一番なのだけど、やり方がわからず断念。諦めてfrontend以下のコードを全部移動させてこんな感じに。

```
├── backend
│   ├── api
│   ├── backend
│   └── manage.py
├── src
├── index.html
├── package.json
├── ... 
├── docker-compose.yaml
├── DockerfileDjango
├── DockerfileNode
├── ...

```

これでデプロイは通った。

<h1>Application Error</h1>
デプロイが終わって早速URLを叩いてみるとこんな画面が

![https___qiita-image-store.s3.amazonaws.com_0_305466_19532ee4-4d90-70b4-0abe-09fc80963d92.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/887b26dc-434c-a8ea-5431-b95c7293a40e.png)

ログを確認すると**code=H14**やら**code=H10**のエラーが。
これはルートディレクトリにProcfileなるものを作ったり、package.jsonをいじったり、npmでライブラリを追加したら直った。

```console
npm i serve
```

```txt:Procfile
web: npm start
```

```json:package.json
"scripts": {
    "dev": "vite",
    "heroku-postbuild": "npm run build",
    "start": "serve -s build",
    "build": "tsc && vite build",
    "serve": "vite preview"
  }
```

<h1>404 page not found</h1>
何度もデプロイを試していると突然の404。
![zlRL5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/d76c0a0d-2b10-da28-0952-85531f91df3c.png)

エラーは直ったっぽいけど今度は404。今回の原因はViteにありそう。おそらくViteでbuildしたディレクトリを見つけれてないようだ。
[Viteの公式ページ](https://ja.vitejs.dev/config/#build-polyfillmodulepreload)によるとoutDirでビルド先を変更できるようだ。

```ts:vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  root: process.cwd(),
  plugins: [react()],
  build:{//この部分を追加
    outDir:"./build"
  },
  server:{
    host:'0.0.0.0'
  }
})

```
多分rootは書かなくてもいいと思う。デフォルトと同じだし。出力先をbuildディレクトリに設定。デフォルトではdistディレクトリが作られていて、それでherokuがビルド後のファイルを見つけれなくて404になっていたと思われる。

これでやっとこさ
![スクリーンショット 2022-01-10 12.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/e6aba697-fa63-9608-5f08-83899dca75e4.png)

herukuのデプロイが完了！
WSL1とWSL2を共存させる必要はもうなくなったかも

WSL1とWSL2の決定的な違いは、WSL2はLinuxが仮想マシン上で動くという点に尽きる。

## localhost問題

WSL2になって問題となったのがlocalhost問題。
仮想マシンとして別マシンで動くので当然別IPが割り振られる。

WSL2で苦労していた点は一年前にこの記事で書いている。
https://qiita.com/yugo-yamamoto/items/ac31bbd00f6b88e05793

とにかく最後までネックになってたのは、GUIつきChromeが自動化できないという点だったが、それもWindows11+WSLgで本物Chromeが動くので解消。普段使いのChromeが自動化できないという点はマイナスだが、仮想マシン上に入れたChromeもGoogleアカウントでログインしてしまえば、ブックマークも履歴も機能拡張だって共有できる。

以下一見WSL2ではできなさそうだけど、WSL1と同様に動かせる機能。

### portforward

WSL1上でsshのポートフォワードを起動しておいて、Chromeから`localhost:4567`と接続する機会はよくあった。WindowsからのlocalhostはWLS2の何かしらのListenしているポートにアクセスできるのでこれは機能する。

### 現在のフォルダをWindowsから開く


```
root@LAPTOP-5EMLK46H:/mnt/c/Users/yugoy/Downloads# explorer.exe .
```

「コマンドプロンプト代わりにWSLを使う」というタイプの人達にはよくやる操作。
WSL2もWindowsのコマンドは直に呼び出せるのでこれでフォルダを開くことはできる。

### Windows側のデフォルトブラウザでURLを開く

```
exploler.exe http://yahoo.co.jp
```

これで標準ブラウザから開くことができる。Macで言うopenに近い操作がexplorler.exeの起動で可能になる。localhostを経由したWindowアクセスがWSL2からは不可能ではあるものの、Windows上のコマンドはすべて利用可能。

### Window側のclipboardとやり取りする

Macで言うpbcopy,pbpasteをWSL2上の仮想マシンから操作する。

clip.exeはWSL2からも操作可能。

```
echo aa | clip.exe
```

このようなコマンドで、標準出力をWindows側のclipboardに入れるこは可能。clipboardから取り出すコマンドは直接ないためPowerShellを経由する必要がある。

```
powershell.exe Get-Clipboard
```

ということで、「だいたい」Windows側の機能も使えたということで、WSL1はもはや必要なくなった。あとこの1年でWSL2がめちゃくちゃ進化した。まだ進化しそう。
お名前.comのVPSサーバ(ubuntu)でポートを解放する

:::note alert
ポート解放は、解放したポート攻撃されりなどのセキュリティ的な問題があるので、自己責任で設定お願いします。
:::

お名前.comのVPSサーバに2021年にセキュリティグループが追加されたので、手順を記載します
vpsサーバ側のポート解放ではなくセキュリティグループを追加した後、該当のサーバへの設定を行います
※お名前にも説明があったのですが、セキュリティグループの設定だけで、該当のサーバの設定は記載されてなくて少しハマりました

## ubuntu側のポート解放
```
sudo ufw allow 888
sudo ufw reload
```


## ◆VPSサーバの画面にログインし、「IPセキュリティ」をクリックし、インバウンドルールの「設定を追加」クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/e09fff1f-991a-5cdc-b3a0-7bdbfaa48ba6.png)


## ◆解放したいポートを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/f3677b5d-1008-ce15-ad1b-5147a3ea4e37.png)

## ◆追加したインバウンドルールを選択し+ポタンクリックし追加するボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/86c0d895-7a77-2437-8c17-661a7dde50f4.png)


## ◆サーバ一覧から該当のサーバの詳細ボタンをクリックし、IPセキュリティの変更ボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/cb4c83b4-d36e-c4a1-a2e4-8298233b7226.png)

## ◆追加したセキュリティグループを追加して変更ボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/a4aafca7-66c0-5305-0494-74c43c7d8c39.png)

設定はすぐ反映されます。
【RSpec】サポートモジュールを使って共通の処理を一つにまとめる

#各specファイルで乱立していた共通化する前のコードたち

featureスペックとrequestスペックでサインインの表現が違うところに「色々お作法があるんだな〜」と感じます。あとRSpecのとっつきにくさが表れていると思います。（beforeとbackgroundも違う）

```spec/features/post_spec.rb
  let(:test_user) { create(:user) }

  background do
    visit "/login"
    fill_in "spec_email", with: "#{test_user.email}"
    fill_in "spec_password", with: "#{test_user.password}"
    click_button "ログイン"
  end
```

```spec/requests/post_spec.rb
    let!(:test_user) { create(:user) }

    before do
      session_params = { user: { email: test_user.email, password: test_user.password } }
      post "/login", params: session_params
    end
```


#共通化していく

rails_helper.rbに記述されている以下のコードをコメントアウトして使えるようにします。

```spec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
```

supportフォルダと各ファイル（名前は任意）を作成し、共通部分をコピペしてモジュールを作成。
**（注意：ファイルの名前とmoduleの名前は合わせるようにします。）**

```spec/support/sign_in_module.rb
module SignInModule
  def sign_in_as(test_user)
    visit "/login"
    fill_in "spec_email", with: "#{test_user.email}"
    fill_in "spec_password", with: "#{test_user.password}"
    click_button "ログイン"
  end
end
```

```spec/support/sign_in_request_module.rb
module SignInRequestModule
  def sign_in_request_as(test_user)
    session_params = { user: { email: test_user.email, password: test_user.password } }
    post "/login", params: session_params
  end
end
```

作成したモジュールを呼び出せるように、rails_helper.rbで設定する。

```spec/rails_helper.rb
RSpec.configure do |config|
  config.include SignInModule
  config.include SignInRequestModule
end
```

# 共通化した後

スッキリまとまりました。

```spec/features/post_spec.rb
background do
  sign_in_as(test_user)
end
```

```spec/requests/post_spec.rb
before do
  sign_in_request_as(test_user)
end
```

#参考
[Rspecでサインインメソッドを共通化して切り出す(devise使わないとき)[system spec][request spec]](https://qiita.com/tanutanu/items/14b0a1729069b53aa5b8)
[Ruby] irbを使ってこなかった、自称エンジニア

# はじめに
プログラミングスクールに通い、3ヶ月が経ちました。
学習中はirbやrails cなどを使い学んできたが、実際にオリジナルアプリを作る時に全く使っていない。。。
このままでは自称ミュージシャン、自称芸人と並んで自称エンジニアになる気がしたので、「irb」について記事にしました。

# irbってなんなんだ？

<font color="red">REPL(Read-eval-printloop、対話型評価環境)</font>
### つまりREPLとは
プログラミング言語の実行環境の一つで、利用者が入力欄にキーボードなどから式や文を一行入力すると、即座に解釈・実行して結果を返し、再び入力可能になるもの。インタプリタの一種。

### Rubyに用意されているirbと呼ばれるREPL

# どのような時に使うのか
###・動作確認に使われる

その他動作確認では、
〇〇.rbとファイルを作り
　　　　　↓
テキストエディタでコードを記述し
　　　　　↓
ターミナルで%ruby 〇〇.rb と打ち込むと確認できます。
が、手間がかかりますよね？

<h4><font color="red">irbでは簡単に動作確認ができます</font></h4>

###・手を動かして学習できる
学習の定着率には
本や資料を読むことによる***インプット***より
体験したり実践する***アウトプット***の方が定着率が良いため
私のような自称エンジニアは、積極的に使うべきである。
# 使い方

### ターミナルからirbと入力すれば、irbが起動する
```
% irb ←3字を打ち込むと
irb(main):001:0>　←このように起動される
```
### 1+1のような計算を行なってみます。

```apex 
irb(main):001:0> 1+1//←1+1を打ち込む
=> 2//←結果
irb(main):002:0> 
```
### 変数に適当な文字列を代入してみます。
変数aに「お腹すいた」と入れてみます。

```apex
irb(main):002:0> a ="お腹すいた"//変数aに「お腹すいた」を代入
=> "お腹すいた"
```

次に変数aのみを入力して、中身を確認します。

```apex
irb(main):003:0> a//変数aを入力
=> "お腹すいた"//変数aの中身である、「お腹すいた」が出力されます
```
### exitと入力すればirbを終了できます

```apex
irb(main):004:0> exit
```

簡単ではありますが使い方については以上です。

#おわりに
アウトプットをすることが大事なんだとプログラミングを学習してから何度も思いますが、
実際に行動するとなると慣れがない私には難易度が高く感じています。
ですがハードルを低くしてアウトプットを習慣化することで楽しみながら学べるようになってきたと思います。
お粗末な文章、記事だったと思いますが、
最後まで見てくれた方、ありがとうございます。
何かご教授いただければ嬉しいです。
docker-compose exec コマンド で OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "bash": executable file not found in $PATH

## 問題

```
docker-compose exec app bash
```
としたら

```
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "bash": executable file not found in $PATH
```
というエラーが出た

## 解決法
bashではなく `sh` か　`/bin/sh` を使う

```
docker-compose exec app sh
または
docker-compose exec app /bin/sh
```
Azure の OS ディスク代をケチりたい！

## 経緯
Azure for Students の無料クレジットで VPN サーバを動かしていました．無料クレジットは \$100 相当なので単純計算で \$8.33 ぐらいに収める必要があります．
そこで，Azure の試算ツールを用いて月の通信を何GB以内にすれば一年間使い続けられるのか求めます．

Azureの試算ツール：https://azure.microsoft.com/ja-jp/pricing/calculator/

-----

<条件>
リージョン：東日本
インスタンス：B1ls(1コア，RAM 512MB)
OS：Ubuntu
OSディスクサイズ：Standard SSD E4 32GB (デフォルトでは 30 GB になりますが計算を簡単にするため 32GB で計算させます．)

-----

## 結論

月に 11GB までしか通信できません．

これでは困るので "OSディスクサイズ" を小さくして費用を下げます．

仮に Standard SSD の E1 (4 GB) なら月 **28 GB** まで通信可能です．

## 手順
既に Azure 上で VM が動作していることを前提とします．
1. VM の VHD をダウンロードする．
2. VHD をリサイズする
3. リサイズした VHD を OS ディスクにする
4. 以前のディスクを削除する


### 1. VM の VHD をダウンロードする．
Azure Portal から VM のディスク→設定→ディスクのエクスポートで vhd ファイルが取得できます．aria2 などレジューム機能付きのダウンローダを使うことをおすすめします．
https://portal.azure.com/signin/index/

### 2. VHD をリサイズする
ディスクの管理から VHD をマウントしたらこちらの方法でリサイズします．
https://qiita.com/yangniao23/items/0cc08101c856c7eed924

具体的には 4 GB 分以外は未割り当ての状態にします．
リサイズしたら Hyper-V マネージャから 可変 vhdx 形式に変換，縮小，固定 vhd 形式に変換をします．

### 3. リサイズした VHD を OS ディスクにする
Azure へのアップロードには Azure Storage Explorer を使います．`winget` で取ってきましょう．

```powershell:PowerShell
winget install Microsoft.AzureStorageExplorer
```

Azure Storage Explorer のインストールが完了したら，認証を済ませて Disks タブから任意のリソースグループを選択し"アップロード"をクリックしてください．

vhdファイルをアップロードする際は "OS の種類" を "Linux" に， "アカウントの種類" を "Standard SSD" に変更することをお忘れなく！

アップロードが完了したら Azure Portal から先程アップロードしたディスクを選択し，VMの作成を開始してください．

### 4. 以前のディスクを削除する
VMの作成までひとしきり終了したら以前のディスク及びVMは不要です．削除しましょう．
Blenderで凸包を作ろう

## Blenderで凸包を作ろう

頂点座標だけ与えられているとき、その凸包を確認したいとします。
ここでは、Blenderを使って凸包を作成してみましょう。

## やり方

編集モードで頂点を選択し、メッシュメニューの「凸包」で凸包が作成できます。
デフォルトでは、凸包に使われなかった頂点は削除されます。細かい調整は、左下に表示されるオペレーターパネルでできます。

以下は、「凸包」機能に気づく前に作成したものです。参考までに残しておきます。

## SciPyを使う方法

### 準備

SciPyとmore-itertoolsを使います。
[Blenderのコマンドサンプル](https://qiita.com/SaitoTsutomu/items/6b70367455f843a979b1)を参考にして、下記のようにインストールしてください。

```bash
blender_pip install scipy more-itertools
```

### ランダムデータで確認

以下では、ランダムな30個の頂点を作成し、その凸包を作成しています。
Scriptingワークスペースで新規作成して、コピペして実行してください。

```py
from typing import Any, Iterable

import bpy
import numpy as np
from mathutils import Vector
from more_itertools import pairwise
from scipy.spatial import ConvexHull


def add_convex_hull(points: Iterable[Any], name: str = "") -> None:
    """凸包のオブジェクトを作成する

    :param points: 頂点のイテラブル
    :param name: 名前
    """
    ch = ConvexHull(points)
    ar = np.c_[ch.simplices, ch.simplices[:, 0]]
    verts = [Vector(pt) for pt in points]
    edges = list(set(tuple(sorted(j)) for i in ar for j in pairwise(i)))
    faces = ch.simplices
    mesh = bpy.data.meshes.new(name=name or "ConvexHull")
    mesh.from_pydata(verts, edges, faces)
    obj = bpy.data.objects.new(mesh.name, mesh)
    bpy.context.scene.collection.objects.link(obj)


if __name__ == "__main__":
    points = np.random.random((30, 3))
    add_convex_hull(points)
```

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

#### 実行例

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/720e1dfd-d4b3-189d-1ed3-fc8a09d10a17.jpeg" width="400">

#### 補足

簡単に試したところ、面は全て三角形面でした。もし、多角形面にしたければ、編集モードの削除の「限定的溶解」でできるかもしれません。

以上
Arduino について

## 勉強前イメージ

ラズパイより前からあるやつ・・・
Arduinoのほうが難しいイメージ
何が違うかはわからん・・・

## 調査

### Arduino とは

Arduinoは手のひらサイズの基盤にコンピュータで最低限の機能を搭載した
マイコンボードになります。
機械の制御に使用されるマイクロコントローラー、ICチップ、外部入出力用の端子が組み込まれています。
入出力端子を通じて外部の装置の制御を行い、センサーをつないでLEDを開かせたりモーターなどつなげてロボットのような動作など行うことができます。

また、バッテリー駆動や無線通信に対応しているもでるもあり、
IoTを行う際に便利なマイコンボードになります。
1台2000円～3000円程度で始めることができます。

### Raspberry Pi との違い

#### そもそもRaspberry Pi とは

ラズベリーパイと読み、当初教育用の安価なコンピュータとして開発された
シングルボードコンピュータです。
Linuxを使用でき、電子工作もできるということで
低コストでIoTができるのでよく使用されています。

#### Arduino と Raspberry Pi との違い

Arduino は `マイコンボード`
Raspberry Pi は `シングルボードコンピュータ` と呼ばれます。

- OS について

Arduino は OS がなく、
Raspberry Pi は OS があります。
Linuxで動作するプログラムはArduinoでは実行できないので
何をするかによって選ぶ必要があります。

- 役割

Raspberry Pi は端子ピンもあり、OSも載ってるため
比較的なんでもできますが、
電子端子の制御などを行うにはArduinoが比較的適しています。
Raspberry Pi はネットワーク通信をしたりディスプレイの出力、カメラなど使用する場合は
ソフトウェアも使用する必要があるのでRaspberry Pi が適しています。

## 勉強後イメージ

Raspberry Pi と Arduino って大体同じものだと思ってたけど
OS載ってないんだ・・・・
モーターとかハードウェア寄りならArduinoって感じなんかな

## 参考

- [歴史から使い方まで解説！人気のマイコンボードArduinoとは！？](https://deviceplus.jp/hobby/basic-of-arduino/)
- [Arduino](https://e-words.jp/w/Arduino.html)
[django] ImportError: Couldn't import Django 解決方法


#解決方法
・Windows
作成したサイトのフォルダに移動してコマンドプロンプトで以下を実行する。

```
pip install django
```

その後以下のコマンドを実行しサーバーが動いたどうか確認。

```
python manage.py runserver
```

Starting development server at http://*********
と表示されれば動作確認完了。解決できた。

参考サイト
https://docs.djangoproject.com/ja/4.0/intro/tutorial01/

#この記事を書いたいきさつ
Django を使用したかったが使用できなくて困っていた。
Django サーバー起動時にコマンドプロンプトで python manage.py startapp を実行すると import エラーとなった。
#エラー文
```
C:\Users\***\mysite>python manage.py startapp
Traceback (most recent call last):
  File "C:\Users\***\mysite\manage.py", line 10, in main
    from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\***\mysite\manage.py", line 21, in <module>
    main()
  File "C:\Users\***\mysite\manage.py", line 12, in main
    raise ImportError(
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? 
Did you forget to activate a virtual environment?
```
#使用したバージョン
```
py -m django --version
4.0.1
```
【Laravel,MySQL】LaravelからDBへの接続エラーの原因と解決策

#概要
本記事は、[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)で学習している中の疑問・つまづきの備忘録です。

今回はLaravelからDBへの接続エラーの原因と解決策についてまとめます。
なお、[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。


#発生したエラー
peopleテーブルのレコードを全件検索しようとした際に、下記のエラーが発生しました。
![スクリーンショット 2022-01-10 10.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/7a3069b3-4898-67d5-0dde-9e41620d1fc5.png)

#ソースコード
```HelloController.php
/////////一部抜粋

use Illuminate\Support\Facades\DB;

class HelloController extends Controller
{
    public function index(Request $request)
    {
        $items = DB::select('select * from people'); ////ここでエラー発生
        return view('hello.index', ['items' => $items,]);
    }

```
>[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)


# 原因
.envに設定していたDB_HOSTが誤っていました。

```
#.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1    #######ここが原因
DB_PORT=3306
DB_DATABASE=laravel_practice
DB_USERNAME=sail
DB_PASSWORD=password
```

#なぜDB_HOST=127.0.0.1ではだめだったのか

127.0.0.1は、自分自身を指す特別なIPアドレスです。ここではLaravelが動いているホスト自身を指します。
しかしMySQLが動いているのは別のホストであり、そちらを指定してやる必要がありました。

MySQLのホストを調べるには、docker psコマンドを使用します。
出力結果のNAMESを確認すると、別コンテナで動いていることがわかります。

```

$ docker ps

////出力結果は一部抜粋

CONTAINER ID   IMAGE                         COMMAND                  CREATED      STATUS                PORTS                                            NAMES
286f413a566c   sail-8.1/app                  "start-container"        8 days ago   Up 8 days             0.0.0.0:80->80/tcp, 8000/tcp                     laravel-practice_laravel.test_1
77c6251fe186   mysql/mysql-server:8.0        "/entrypoint.sh mysq…"   8 days ago   Up 8 days (healthy)   0.0.0.0:3306->3306/tcp, 33060-33061/tcp          laravel-practice_mysql_1

```

#解決策

.envに設定していたDB_HOSTを修正します。

```
#.env

DB_CONNECTION=mysql
DB_HOST=laravel-practice_mysql_1    #######ここをMySQLが動くコンテナ名に修正
DB_PORT=3306
DB_DATABASE=laravel_practice
DB_USERNAME=sail
DB_PASSWORD=password
```

ちなみに、DB_HOST=mysqlに設定することでも接続可能です。


>コンテナを起動したら、アプリケーションの.envファイル内のDB_HOST環境変数をmysqlに設定することで、アプリケーション内のMySQLインスタンスに接続できます。
>[Laravel 8.x Laravel Sail](https://readouble.com/laravel/8.x/ja/sail.html)


#参考文献
>[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)
>[Laravel 8.x Laravel Sail](https://readouble.com/laravel/8.x/ja/sail.html)
WSLにgmsh並列版のインストール

#はじめに
オープンソースメッシャーのgmshをwsl環境にインストールしたいと思います。
単一版であればバイナリをダウンロードするだけですが、並列版の場合はソースからコンパイルする必要があります。

* [Gmsh] (https://gmsh.info/)
* [Gmsh compilation] (https://gitlab.onelab.info/gmsh/gmsh/-/wikis/Gmsh-compilation)
* [Gmsh Info ： Appendix C にコンパイルの件があります。](https://gmsh.info/doc/texinfo/gmsh.html)

# 環境
OS : Windows 10
WSL : Ubuntu 18.04 LTS

* 単一版code_asterをインストールした環境で実施しています。

#ダウンロードとコンパイル

```bash
sudo apt install git ca-certificates liboce-foundation-dev liboce-modeling-dev libfltk1.3-dev
git clone http://gitlab.onelab.info/gmsh/gmsh.git
cd gmsh
mkdir build
cd build
cmake  -ENABLE_OPENMP ..
make
```

# 並列効果の確認
下記の設定で並列数毎の計算時間を確認してみたいと思います。

```cpp:test.geo
SetFactory("OpenCASCADE");
lc = .005;
Mesh.CharacteristicLengthMin = lc;
Mesh.CharacteristicLengthMax = lc;
Box(1) = {0, 0, 0, 1, 1, 1};
Physical Volume(1) = {1};
```
```bash
./path/to/gmsh -3 -algo hxt -nt number_of_threads test.geo
...
Info    : 5004628 nodes 31096484 elements
```
### 作成されたメッシュ

<img width="200"alt=test.png src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610414/b2addb39-1571-82e7-fee6-86ef2e909c83.png">

### 所要時間一覧

| number_of_threads| meshing 1D | meshing 2D | meshing 3D |
|:----------------:|----------:|----------:|----------:|
|1| 0.0011s| 7.60s | 46.6s |
|2| 0.0012s| 4.05s | 42.7s |
|4| 0.0008s| 2.91s | 36.3s |
|8| 0.0014s| 1.81s | 34.3s |

並列効果はそれなりにありそうです。
1Dは元が少ないので効果が見えず、２Dではそれなりの効果、3Dではなんとなくの結果が出ている様に見えます。
真価を発揮するためにはもう少し設定が必要な模様です。今後の課題にしたいと思います。

以上です。
Missing Purpose String in Info.plist File.

#はじめに
本業のアプリをAppStoreConnectにアップロードした際にリジェクトを喰らいました。

>Missing Purpose String in Info.plist File. Your app's code references one or more APIs that access sensitive user data. The app's Info.plist file should contain a NSLocationWhenInUseUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data.

簡単に訳すと、`Info.plistにNSLocationWhenInUseUsageDescription keyを追加してくれ！`と書いてます。

[NSLocationWhenInUseUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nslocationwheninuseusagedescription)はフォアグラウンドで位置情報を必要とするアプリではInfo.plistに追加しないといけませんが、自分がアップロードしようとしたアプリではそもそも位置情報サービスを必要としていなかったので非常に困りました。

何が原因かを調べていくうちに導入していた`OneSignal iOS SDK`が悪さをしてました。

#原因
OneSignal iOS SDKを使用すると`ジオフェンス機能`を用いたプッシュ通知を使用することができるそうで、この部分が`アプリが実際に位置情報サービスを使用していない場合でも位置情報サービスを使用するアプリと認識してしまう`そうです。

ジオフェンス機能とは、任意の場所を指定し、その圏内を出入りするとあらかじめ決めていた作業を自動で行なってくれるというものです。

ジオフェンス機能を用いたプッシュ通知では、例えばコンビニの近くを通ったりすると、プッシュ通知でクーポンを受け取ったり出来ます。

#解決方法
info.plistにNSLocationWhenInUseUsageDescriptionを追加し、[OneSignal.setLocationShared(false)](https://documentation.onesignal.com/docs/sdk-reference#setlocationshared-method)を呼び出すだけです。

OneSignal.setLocationSharedは`位置情報の収集を無効または有効にするAPI`でfalseを指定している為、位置情報を使用されることはありません。

#最後に
同じようにリジェクトになった方の中には、「`Info.plistにNSLocationWhenInUseUsageDescriptionとNSLocationAlwaysUsageDescriptionを追加して下さい` 」と言われてました。

なのでもうリジェクトを喰らいたくなかった自分は、念には念という事で[NSLocationAlwaysUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nslocationalwaysusagedescription)も追加してアップロードした所、リジェクトが消えました！

めでたし。

#参考にしたもの
[Your app "infomobi" (Apple ID: XXX) has one or more issues - on deploy](https://github.com/meumobi/infomobi/issues/360)
ubuntu ダブルLAMP

sudo vi ubuntsu.sh 

```

# ufw(ファイアウォール)をインストール
sudo apt install ufw

# インストール直後はufwはファイアウォールとして指定されないためufwを有効化「このコマンドを実行するとssh接続が切れるかも知れませんがいいですか？」と聞かれるので y を入力してEnter
sudo ufw enable

# sshのポートを開く
sudo ufw allow 22

# Apacheが使用するポートを開く
sudo ufw allow 80

#netツールインストール
sudo apt install net-tools

```
sudo chmod u+x ubuntsu.sh 
sudo ./ubuntsu.sh

sudo vi LAMPP.sh 
```
#ここからはインストールのコマンドです。
sudo apt-get install -y php
sudo apt-get install -y php-intl php-mbstring php-mysql php-gd
sudo apt-get install -y php-curl php-common php-json php-mbstring php-zip php-tokenizer
sudo apt-get install -y php-fpm　
sudo apt-get install -y php-xml
sudo apt-get install -y mysql-server
sudo apt-get install -y python3-pip
sudo pip3 install -y uwsgi
sudo apt-get install -y default-libmysqlclient-dev
sudo apt-get install python3-dev default-libmysqlclient-dev
sudo apt-get install -y python3.8 python3.8-dev python-is-python3 -y
sudo pip3 install mysqlclient
sudo apt-get install -y sqlite3
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo aptitude install npm
sudo apt install -y nodejs
sudo apt-get install -y libapache2-mod-php
sudo apt install libapache2-mod-wsgi-py3
sudo apt-get install -y apache2
sudo apt install -y apache2 wget unzip
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl restart apache2
sudo pip3 install  mysqlclient

```
sudo chmod u+x LAMPP.sh 
sudo ./LAMPP.sh
windowsでgforth

#概要

windowsでgforthやってみた。

#環境

windows 10 home

#インストール

gforth-0.7.0.exe

#数9を4個つかって1から15までの数を表す式を投入。


```
Gforth 0.7.0, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
9 9 - 9 9 / . 1  ok
9 9 / 9 9 / + . 2  ok
9 9 + 9 + 9 / . 3  ok
9 9 9 + 9 / dup + . 4  ok
9 9 9 + 9 / dup + - . 5  ok
9 dup 9 + 9 + 9 / - . 6  ok
9 9 9 + 9 / - . 7  ok
9 9 9 drop 9 / - . 8  ok
9 9 - 9 * 9 . 9  ok
9 9 / 9 dup 9 / +  . 10  ok
9 9 9 + 9 / + . 11  ok
9 dup 9 9 + + 9 / + . 12  ok
9 9 9 + 9 / dup + + . 13  ok
9 dup 9 9 + 9 / dup + - + . 14  ok
9 dup dup 9 + 9 + 9 / - + . 15  ok
```

以上。
語彙診断をより簡単に

# はじめに
皆様はhttp://testyourvocab.com/ というサイトをご存知でしょうか。
以下のような単語リストにチェックを付けていくと、今の語彙レベルが分かるというサイトです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/ba0166ec-3c74-525b-ba72-637061d9734a.png)

# 問題点
一括選択がない...
そう、このサイトにはすべての単語を一括で選ぶことはできません。

# そこで
　簡単なScriptを組みました。

``` javascript
document.querySelectorAll("input[type='checkbox']").forEach(function(v){v.checked = true});
```

　あとは開発モードを開いてこれを実行するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/1759902f-53cb-db43-d1cc-1b90d2128979.png)

全部チェックが付きました。これで良いはず。

# おわりに
 awryやmaladroitなど明らかに見覚えのない単語も入っていますがおそらく大丈夫でしょう。
最後までご覧いただきありがとうございました。いいなと思ったらLGTMやコメントをいただけると幸いです。
2022/1/10主にITとかセキュリティの記事

パスワード破りSNSをのぞき見　不正アクセス容疑で男逮捕(1/6)
https://news.yahoo.co.jp/articles/99e5f3826675e63ed8d76f23a7da991b6534143b

暗号資産関連犯罪、2021年に140億ドル相当が奪われる──Chainalysis調べ(1/7)
https://news.yahoo.co.jp/articles/bf3fa92d5375b892a8f73c16c2ffb2997a7a8a77

京大で約77TB分のデータ消失　日本HPEのプログラムが不具合(1/8)
https://www.zaikei.co.jp/article/20220108/655180.html

カウネット、リスト型攻撃の形跡確認→ID・パスワードの変更呼びかけ(1/7)
https://www.tsuhannews.jp/shopblogs/detail/68140

「ノートン 360」で仮想通貨マイニング機能が自動インストールされる件に批判の声 - GIGAZINE(1/7)
https://newstopics.jp/url/18991288

窓辺の小石 第43回 ファイル捜査指令(1/7)
https://news.biglobe.ne.jp/it/0107/mnn_220107_3538855374.html

スイス軍が軍事作戦での外国製メッセンジャーアプリの使用を禁止、国内に拠点を置くアプリならOK(1/7)
https://gigazine.net/news/20220107-swiss-restrict-messenger-app/

【-約1兆1792億円】2021年の詐欺・ハッキング被害総額が判明。Immunefiがレポート公開(1/8)
https://crypto-times.jp/2021-scam-hacking/

「不正アクセス」中国籍の男逮捕(1/7)
https://www.tv-wakayama.co.jp/news/detail.php?id=67401

Google、スピーカー特許紛争で敗北　機能を一部削除(1/8)
https://www.nikkei.com/article/DGXZQOGN07DVP0X00C22A1000000/

月間500万PV＆転送量80TBのサイトをたった4万円で維持する方法(1/6)
https://gigazine.net/news/20220106-how-handle-80tb-5m-pv-website/
【devise】暗号化前後のパスワードが一致しているか判定するメソッド

## 実現したいこと
Railsでdevise gemを使っている環境にて、暗号化前のパスワードが暗号化後のパスワードと一致しているか確認したい。
例えば、以下のようなケースです。

- 「このパスワードで設定したはずだがログインできず、パスワードがちゃんと設定されてるか確認してほしい」という問い合わせに対して調査する場合
- 有効期限を持たせた複数のパスワードを、過去履歴を含めてDBに保持しており、古いパスワードが入力された場合に「それは古いパスワードです」とアラートを出したい場合

deviseでは、パスワードは暗号化されDBに保存されているため、DBのレコードを参照するだけだと、元のパスワードがどんなものだったかわかりません。

## 解決方法
「入力されたパスワードを自力で暗号化したものでDBを検索する」という方法もありますが、そこまでしなくても一発でわかる`valid_password?`メソッドがdeviseで用意されています。
レシーバにはActiveRecordインスタンス（パスワードが保存されたレコード）、引数に暗号化前のパスワードを指定します。

## 基本例
```ruby
# ユーザが入力した"hogehoge"というパスワードが、id=1234のユーザのパスワードと一致するか確認したい場合
User.find(1234).valid_password?("hogehoge")
# => 戻り値はboolean

# paramsで渡ってきたpassword（暗号化前）が、id=1234のユーザに設定されたパスワードと一致するか確認したい場合
User.find(1234).valid_password?(params[:password])
```

## 応用例
ちょっと発展させた例です。
例えば、有効期限を持たせた複数のパスワードを、過去履歴を含めて`UserPassword`モデルに保持しており、
古いパスワードが入力された場合に「それは古いパスワードです」とアラートを出したい場合

```ruby
def old_password?(input_password)
 old_passwords = UserPassword.find(1234).where.not(expired_at: nil)
 old_passwords.any? {|old_pw| old_pw.valid_password?(input_password) }
end

redirect_to new_session_path, alert: "入力されたパスワードは有効期限が切れています" if old_password?(params[:password])
```

## 参考サイト
https://kossy-web-engineer.hatenablog.com/entry/2020/12/28/125619

devise gemでは以下で定義されているようです。

https://github.com/heartcombo/devise/blob/main/lib/devise/models/database_authenticatable.rb#L71
Flutterで別画面に遷移しても状態を維持する

## はじめに
アプリの仕様上、ページの遷移先でも状態を維持したいことがあったのでProviderを利用して実装したのでその方法を共有したいと思います。
## 遷移元の実装方法
遷移先のWidgetを`ChangeNotifierProvider.value()`で囲むことによって遷移先にも状態を維持できます。
以下にソースコードを載せておきます。

```dart:test.dart
// viewmodelの宣言
final calendarModel = context.watch<CalendarModel>();

/* 省略 */

Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => ChangeNotifierProvider.value(
            value: calendarModel, // 既存のインスタンスを指定
            child: Transition(),
  )),
);
```

## 遷移先の実装方法
`StatefulWidget`の場合には`didChangeDependencies`内で初期化を行います

```dart:transition.dart
class Transition extends StatefulWidget {
 @override
 _TransitionState createState() => _TransitionState();
}

class _TransitionState extends State<Transition> {

 @override
 void didChangeDependencies() {
  // 初期化
  final calendarModel = context.watch<CalendarModel>();
  super.didChangeDependencies();
 }

 @override
 Widget build(BuildContext context) {
  return Scaffold();
 }
}
```

`StatelessWidget`の場合には`build()`の最初に初期化を行います。

```dart:transition.dart
class Transition extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  // 初期化
  final calendarModel = context.watch<CalendarModel>();

  return Scaffold();
 }
}
```

## 終わりに
最後まで見ていただきありがとうございます。以上のような実装を行いましたが、この実装は`ProviderNotFoundException(Widegtツリー外におけるProviderのアクセス)`を誘発しがちなので注意すべきです。

このような実装は手間がかかってしまうのに加えてバグを誘発する可能性が高いと思います。
そのため状態をグローバル変数的に扱える`riverpod`を導入したほうが可読性やメンテナンスが楽なのでは？と思う実体験にはなりました。今後`riverpod`も触れたらいいな、、、

## アプリの宣伝
最後にはなりますが、現在開発しているアプリに関してご紹介させていただきます。

就活の管理を行うアプリ**Jobhun**です！
Jobhunは「就活状況を一括管理したい...」　「自分が就活の時、予定を組むのが大変だった...」という就活生の声から生まれたアプリです。そのため、実際に就活を経験してきた方の意見を参考に、「本当に必要な機能」をまとめました！

以下のような機能があります。

* 志望企業管理機能
* 就活用カレンダー機能
* ES管理機能 etc...

気軽に就活管理ができるようになっているので、是非ダウンロードしてみてください！！
[LP](https://jobhun.jp/lp)・[IOSダウンロード](https://apps.apple.com/jp/app/jobhun-%E5%B0%B1%E6%B4%BB%E7%94%9F%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA/id1546735909#?platform=iphone)・[Androidダウンロード](https://play.google.com/store/apps/details?id=jobhun.jobhun)
![1639120308483.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612338/dc6bf51e-0e2d-ac6f-baf4-35286d36a04c.jpeg)
perl cpan用 module 作成

## 開発環境
```
mac
-virtual box
--vagrant
---centos7
```
## 事前準備
githubにアカウントを用意しておき鍵認証などでcommitできるようにしておく
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

```
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
```

## install cpanm
perl moduleをインストールするためにcpanmを使います。
perl-App-cpanminusをインストールすることで入ります。
 
```
$ sudo yum -y install perl-App-cpanminus
```

## install module-setup
Perlモジュールの雛形づくりに module-setup コマンドは強力な助けになります。 module-setup コマンドは Module::Setup をインストールすると付いてきます。

```
$ sudo yum install gcc
$ sudo cpanm Module::Setup --force
```
Module::Setup がインストールできたら、module-setup コマンドを初期化しておきます。 何も難しいことはなく、--init オプションをつけてコマンドを叩いたら、良しなに質問に答えていくだけです。

```
$ module-setup --init
Do you use SVN? [yN] [n] n
Do you use SVK? [yN] [n] n
Do you use Git? [yN] [n] y
You chose version control system: Git
Your name:  [Default Name] kawamurashingo
Your email:  [default {at} example.com] xxxxxxx@gmail.com
Dump config /home/vagrant/.module-setup/flavors/default/config.yaml
```
先にMyModuleでgitリポジトリを作っておく
https://github.com/new


```
$ module-setup MyModule
$ cd MyModule
$ git remote add origin git@github.com:kawamurashingo/MyModule.git
$ git push origin master
```

https://github.com/kawamurashingo/MyModule
無事雛形準備完了

## test install
とりあえずなにも変更しなくてもインストール可能

```
$ perl Makefile.PL
$ make
$ make test
$ sudo make install
Installing /usr/local/share/perl5/MyModule.pm
Installing /usr/local/share/man/man3/MyModule.3pm
Appending installation info to /usr/lib64/perl5/perllocal.pod

$ perldoc -m MyModule
```

## オリジナルモジュール作成してみる
参考
https://shin.hateblo.jp/entry/2013/09/24/020506

```
$ export PATH=$PATH:/home/vagrant/MyModule/lib/
```
【AWS】コンソール上で「amazon-linux-extras list」が動かないとき

AWSの扱い方を学習したくて、Udemyの「[AmazonWebServiceマスターコースVPC編](https://airitechjp.udemy.com/course/amazon-web-service-vpc/)」を受講してました。

セクション4の動画15にて
WindowsPowerShellから、AWSのEC2サーバーにSSH接続をした後、nginxをamazon-linux-extrasコマンドでインストールしようとしたところ、画面が固まってしまいました。

```
sudo amazon-linux-extras list
(固まってしまう、、、)
```
`which amazon-linux-extras`で確認しても、ソフトウェアはインストールされているし、helpコマンドとinfoコマンドは問題なく動きます。
しかし、installコマンドとlistコマンドはなぜか固まってしまいます。

EC2インスタンスやVPCを作り直してもダメだったので、3～4時間くらい格闘したのですが、、、
なんと解決方法は***待つ***ことでした、笑

４分くらい待ったら、正しい結果が出力されました。。。

これまでの苦労は何だったんだ？？？笑

備忘録として残しておきます。
[iOS初心者向け]SnapKitとは

#概要
SnapKitの役割を、一言で表すと「調整」です。

調整というのは、ビューレイアウトのパディングや制約を簡単に設定できます。
こちらは、公式のライブラリではなくサードパティとなります。

https://github.com/SnapKit/SnapKit

#使い方
READMEのコードをお借りしますと

```swift
import SnapKit

class MyViewController: UIViewController {

    lazy var box = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(box)
        box.backgroundColor = .green
        box.snp.makeConstraints { (make) -> Void in
           make.width.height.equalTo(50)
           make.center.equalTo(self.view)
        }
    }

}
```
見た目すごく使いやすそうですね。
ここでは、サブビューの`box`のレイアウトを調整しています。
`makeConstraints`の1行目は、幅と高さを50dpに設定しています。
そして、2行目では中心点を親のビューと同じにしています。

#まとめ
SnapKitとは、簡単にビューを「調整」できるサードーパーティライブラリです。
Mailgunのダッシュボードが開かない時（Railsチュートリアル学習）

# はじめに
プログラミング初学者の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

Mailgunのダッシュボードが開かない（真っ白なページ）になる時の対処法の共有です。

## 背景
Railsチュートリアル学習の中で（11章）HerokuにMailgunというアドオンを入れるのですが、
`heroku addons:open mailgun`コマンド後にクロームで開こうとしてもうまくいきませんでした。

![スクリーンショット 2021-12-31 083558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/8ffb4ada-41eb-788a-172b-0fc8470abf24.png)
（真っ白です…）

# 結論
グーグルクロームではなく他のブラウザ（Edge）などで開くとうまくいきます！

# おわりに
お読みいただきありがとうございました、しょぼい記事ですみません💦
どなたかの参考になれば嬉しいです。
【Azure】AppServiceプランのFunctionsのタイマートリガー関数が一定時間後に停止してしまう

# Azure Functionsのタイマートリガー関数が停止する
### 要約
- Azure Functionsにデプロイしたタイマートリガーの関数が1時間程度で停止してしまう
- AppServiceプランでホスティングされたFunctionsは一定時間HTTPリクエストが来ない場合アイドルタイムとなり稼働が停止する
- 解決策はFunctionsの全般設定から"常時接続"設定をオンにする

#事象
Azure Functions にてタイマートリガーで毎分実行させる関数をデプロイした。
しばらく後、Application Insightsのログを確認したところ、"Job host stoped"を最後にパタリとログが出力されなくなっていた。
![スクリーンショット 2022-01-08 15.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420632/76352103-c7fb-5e4b-f1fd-55af010986f2.png)

#調査・原因
本記事の議題となっているAzure Functionsの挙動について参考になりそうなMicrosoftのドキュメントには以下のように記載されている。

>App Service プランを実行する場合、関数アプリが正常に実行されるように、常時接続 設定を有効にする必要があります。 App Service プランでは、関数のランタイムは非アクティブな状態が数分続くとアイドル状態となるため、関数を "起こす" ことができるのは HTTP トリガーのみとなります。 [常時接続] 設定は、App Service プランでのみ使用できます。 従量課金プランでは、関数アプリはプラットフォームにより自動的にアクティブ化されます。
https://docs.microsoft.com/ja-jp/azure/azure-functions/dedicated-plan#always-on

私は上記記事を読んで「...非アクティブな状態？それってどんな状態？」となってしまった。
この非アクティブな状態について、Azureのサポートに一定期間でFunctionsが停止してしまう旨についても含め質問をした。
頂いた回答では、非アクティブな状態というのはFunctionsに対してHTTPリクエストが一定時間以上来ていない状態である。そのような非アクティブな状態が続くとアイドル状態となり、Functionsは動作を停止してしまう。そして、Functionsがこのようなアイドル状態にならないよう、定期的にHTTPリクエストを飛ばすように設定する、それが常時接続の有効化である。とのことだった。

今回の一定期間経ってFunctionsが動作しなくなってしまった原因はここにあったようだ。

結論として、AppServiceプランでホスティングされたFunctionsに一定期間HTTPリクエストが来ない場合、そのFunctinosは停止してしまう。今回のFucntionsはタイマートリガーの関数のみでHTTPリクエストが飛ばない設計となっていたため動作が停止してしまった。以上が原因であった。

# 解決策
解決策としては「調査・原因」でも述べたが、Functionsの全般設定から"常時接続"の項目をオンにすることで解決する。
ただし、AppServiceプラン(F1, D1)ではそもそも常時接続について設定することができないため、B1以上のプランにアップグレードし設定する必要がある。なお、F1,D1では既定として常時接続はオフとなっている。
![スクリーンショット 2022-01-09 22.20.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420632/b12336d0-bd9c-f10f-b74e-ac5cd858ad9f.png)

# まとめ
以上、AppServiceプラン(F1, D1)でホスティングされたAzure Functionsのタイマートリガーの関数が一定期間で動作が停止してしまう問題についての原因と解決策についてであった。
今回はタイマートリガーの関数でこの事象が生じたが、公式のドキュメントに「関数を "起こす" ことができるのは HTTP トリガーのみとなります。」という一文があることから、HTTPトリガーではない関数については全て同様の事象が生じると考えられる。

## 検証
以下、AppServiceプランをF1からB1にアップグレードし常時接続をオンにした場合のタイマートリガーの関数の出力ログである。ログが常に出力されていることが確認できる。
図中の赤枠のログは公式ドキュメントに「従量課金プランでは、関数アプリはプラットフォームにより自動的にアクティブ化されます。」とあることからプラットホームからのFunctionsを起こすため定期的に飛んでくるプラットフォームからのHTTPリクエストだろう。
![スクリーンショット 2022-01-10 8.10.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420632/df0e4b95-7dce-89d2-b630-88039d0471df.png)
Blenderで正多面体

## Blenderで正多面体

Blenderで**辺の長さ1の正多面体**を作成する方法を紹介します。

以降では、編集モードで「ビューポートオーバーレイ」の「計測」の「辺の長さ」をオンにし、選択辺の長さが1であることが確認できるようにしています。

### 正四面体

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/0b3cf513-747f-17b5-6768-ed62e8fbaed0.jpeg" width="300">

追加メニューのメッシュの円錐（Cone）

- 頂点：`3`
- 半径1：`sqrt(1/3)`
- 深度：`sqrt(2/3)`

### 正六面体

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8d4007ba-26af-2344-06ef-1f003c04e084.jpeg" width="300">

追加メニューのメッシュの立方体（Cube）

- サイズ：`1`

### 正八面体

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/c8557a84-566b-2b0d-57e9-ab59468b6e0f.jpeg" width="300">

正六面体の双対多面体を作成することで、正八面体を作成します。

- 追加メニューのメッシュの立方体（Cube）で、正六面体を作成します。
  - サイズ：`sqrt(2)`
- 編集モードに入ります。
- 辺メニューの「辺をベベル」を選び、`[Enter]`を押します。
  - 幅のタイプ：`%`
  - 幅のパーセント：`50`
- メッシュメニューのマージの「距離で」
- オブジェクトモードに戻ります。

### 正十二面体

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/f8124ac4-40ad-8e40-dd45-4b2b479e4461.jpeg" width="300">

正二十面体の双対多面体を作成することで、正十二面体を作成します。

- 追加メニューのメッシュのICO球（Icosphere）で、正二十面体を作成します。
  - 細分化：`1`
  - 半径：`1.763`
- 編集モードに入ります。
- 辺メニューの「辺をベベル」を選び、`[Enter]`を押します。
  - 幅のタイプ：`%`
  - 幅のパーセント：`100/3`
- メッシュメニューのマージの「距離で」
- オブジェクトモードに戻ります。

### 正二十面体

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/5306ea05-2005-cc55-0ac3-b50be9c24537.jpeg" width="300">

追加メニューのメッシュのICO球（Icosphere）

- 細分化：`1`
- 半径：`0.952`

## 補足

- 実数値は、[正多面体のデータ（厳密値）](https://qiita.com/ikiuo/items/0292a58993c4e6d14f2d)を参考にすると、より正確になるかもしれません。
- 頂点の座標を知りたければ、別画面でエディタータイプをスプレッドシートにすると確認できます。

以上
VHDLによる簡単なディジタルフィルターの実験 / その6 / FIRフィルター / 簡易バンドパスフィルター


#1. 概要
今度はバンドパスフィルターを試す。係数は前回と同じく、[山口晶大, (2006), 『はじめてのDSP活用大全』, CQ出版, pp.155-160](https://www.cqpub.co.jp/hanbai/books/30/30931.htm)を参考にして簡易的に計算した。中心周波数は5 kHzにした。

タップ数は16、係数は16ビット長\(`signed`\)、サンプリング周波数は40 kHz。

#2. 簡易バンドパスフィルターのためのVHDL

下のVHDLをコンパイルしてMAX10 FPGAに書き込む。

ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/fir_filter_experiment_band_pass_simple

係数は、トップレベルエンティティ`fir_filter_experiment.vhd`の下の部分に記述する。

```vhdl
constant coeffs_list : coefficient_array := (
	/*
	0, sin( pi/4),  1, sin( pi/4),
	0, sin(-pi/4), -1, sin(-pi/4),
	0, sin( pi/4),  1, sin( pi/4),
	0, sin(-pi/4), -1, sin(-pi/4),
	↑これを下のようにsigned 16ビットに整数化する。
	*/

	16b"0",16x"5A82",16x"7FFF",16x"5A82",
	16b"0",16x"A57E",16x"8001",16x"A57E",
	16b"0",16x"5A82",16x"7FFF",16x"5A82",
	16b"0",16x"A57E",16x"8001",16x"A57E"
);
-- 計算結果に必要なビット数はceil(log2(3 * (1023 * (0x5A82 + 0x7FFF + 0x5A82))))
constant BITS_NEEDED : natural := 28;
```


#3. 全体の接続図
[このとき](https://qiita.com/cyq04000/items/c6b6f871ecd8e679bbb6#3-%E5%85%A8%E4%BD%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E5%9B%B3)と同じ。

#4. 実行結果
ファンクションジェネレーターから正弦波を入力して出力の周波数特性を見てみる。5 kHzを中心とするバンドパスになっている。
![scope_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/db3530ea-5fba-cf1d-58bd-2f20f5c43a45.png)
「エントロピーと秩序」のプログラムをpythonで書く～カルノーサイクル

# 初めに

去年の夏、エントロピーにはまっていていろいろな本を読んでいたのですが、その中の一つに「[エントロピーと秩序](https://www.amazon.co.jp/dp/4532520142/ref=cm_sw_r_tw_dp_07SDCC39B9GNHRC5FEW5)」という本があります。この本の巻末にBASICで書かれたプログラムがいくつか載っているのですが、BASICの実行環境がないので実行できません。そこで、pythonで書き換えてみることにしました。

# カルノーサイクル

ひとつめに載っているプログラムが「カルノーサイクル」です。

```python
import math
import matplotlib.pyplot as plt

plt.xlabel("V")
plt.xticks(color="None")
plt.ylabel("P", rotation=0)
plt.yticks(color="None")

TU = int(input("高温部の温度"))
TL = int(input("低温部の温度"))
Q = int(input("膨張段階で吸収される熱量"))
VI = int(input("初期体積"))

VA = VI  # A点の体積
PA = TU / VA  # Aでの圧力
plt.annotate("A", (VA, PA))

# A-B(等温膨張)
VB = VA * math.exp(Q / TU)  # B点の体積
v = VA
xab = []
yab = []
while(v < VB):
    p = TU / v
    xab.append(v)
    yab.append(p)
    v += 0.1
plt.plot(xab, yab, "g")
PB = p  # B点での圧力
plt.annotate("B", (VB, PB))

# B-C(断熱膨張)
VC = ((PB / TL) * (VB ** 1.667)) ** 1.5  # C点の体積
PC = TL / VC  # C点での圧力
v = VB
xbc = []
ybc = []
while(v < VC):
    p = PB * ((VB / v) ** 1.667)
    xbc.append(v)
    ybc.append(p)
    v += 0.1
plt.plot(xbc, ybc, "y")
plt.annotate("C", (VC, PC))

# C-D(等温圧縮)
VD = ((PA / TL) * (VA ** 1.667)) ** 1.5  # D点の体積
PD = TL / VD  # D点の圧力
v = VC
xcd = []
ycd = []
while(v > VD):
    p = TL / v
    xcd.append(v)
    ycd.append(p)
    v -= 0.1
plt.plot(xcd, ycd, "r")
plt.annotate("D", (VD, PD))

# D-A(断熱圧縮)
xda = []
yda = []
v = VD
while(v > VA):
    p = PA * (VA / v) ** 1.667
    xda.append(v)
    yda.append(p)
    v -= 0.1
plt.plot(xda, yda, "b")
plt.show()

QC = TL * math.log(VC / VD)  # CD間で吸収される熱量
W = Q - QC  # 1サイクルで得られる仕事量
E = W / Q  # 効率

print(f"効率: {E:.2f}")
```

もともとは37行のプログラムだったのですが、書き直すと76行になってしまいました。本に書いてある通り、高温部の温度を1500、低温部の温度を1000、吸収される熱量を3000、初期体積を10で入力すると以下のようなグラフが表示されます。

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109677/6f0fc129-6fe4-6bd1-7f7f-6f88ac9a826d.jpeg)

それっぽいグラフが表示されるので問題なさそうです。
ちなみに、エントロピー系の本をいろいろ読んだ中で、私は「[エントロピーと秩序](https://www.amazon.co.jp/dp/4532520142/ref=cm_sw_r_tw_dp_07SDCC39B9GNHRC5FEW5)」と「[高校数学でわかるボルツマンの原理 : 熱力学と統計力学を理解しよう](https://www.amazon.co.jp/dp/B00GHHXZBQ/ref=cm_sw_r_tw_dp_CRC393F4NAA1MA976AM3)」が面白かったです。
VHDLによる簡単なディジタルフィルターの実験 / その5 / FIRフィルター / 簡易ハイパスフィルター

#1. 概要
今度はハイパスフィルターを試す。係数は、[山口晶大, (2006), 『はじめてのDSP活用大全』, CQ出版](https://www.cqpub.co.jp/hanbai/books/30/30931.htm), pp.155-160を参考に、中心周波数のみを考慮して簡易的に設定する。帯域は制御できない。ここでは通過帯域の中心をナイキスト周波数にしてハイパスフィルターを構成した。

前回と同じく、タップ数は16、係数は16ビット長\(`signed`\)、サンプリング周波数は40 kHzにした。


#2. 簡易ハイパスフィルターのためのVHDL

下のVHDLをコンパイルしてMAX10 FPGAに書き込む。

ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/fir_filter_experiment_hi_pass_simple

係数は、トップレベルエンティティ`fir_filter_experiment.vhd`の下の部分に記述する。

```vhdl
constant coeffs_list : coefficient_array := (
	16b"1",16x"FFFF",
	16b"1",16x"FFFF",
	16b"1",16x"FFFF",
	16b"1",16x"FFFF",
	16b"1",16x"FFFF",
	16b"1",16x"FFFF",
	16b"1",16x"FFFF",
	16b"1",16x"FFFF"
);
-- 係数は全部+1または-1にしたので乗算でビット幅は変化しない。
-- 計算結果に必要なビット数はceil(log2((10ビット最大値1023) * (タップ数16))) = 14
constant BITS_NEEDED : natural := 14;
```


#3. 全体の接続図
[このとき](https://qiita.com/cyq04000/items/c6b6f871ecd8e679bbb6#3-%E5%85%A8%E4%BD%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E5%9B%B3)と同じ。

#4. 実行結果
ファンクションジェネレーターから正弦波を入力して出力の周波数特性を見てみる。一往ハイパスの特性を示しているが、ナイキスト周波数のところはグチャグチャになる。
![scope_60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/a197d126-09f7-bec4-c3b5-d4fc037b3b7c.png)
VHDLによる簡単なディジタルフィルターの実験 / その4 / FIRフィルター / 移動平均

#1. 概要
前回まででやっとディジタルフィルターの実験をする準備が整った。前回素通りさせた経路にFIRフィルターモジュールを挟み込む。

FIRフィルターモジュールは、[Digi-Key TechForumにあったこれ](https://forum.digikey.com/t/fir-filter-vhdl/12861)をほぼそのまま使う。計算結果がオーバーフローしないようビット拡張したあと定義どおりに積和演算をしているだけである。 

まずはすべてのタップを同じ係数で重み付けして移動平均をとってみる。一種のローパスフィルターである。周波数特性が見たいだけなので、係数は全タップとも同じであればとりあえず何でもよい。タップ数は16、係数は16ビット長\(`signed`\)、サンプリング周波数は40 kHzにした。

#2. 移動平均のためのVHDL

下のVHDLをコンパイルしてMAX10 FPGAに書き込む。

ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/fir_filter_experiment_moving_average

係数は、トップレベルエンティティ`fir_filter_experiment.vhd`の下の部分に記述する。

```vhdl
constant coeffs_list : coefficient_array := (
	16b"1",16b"1",16b"1",16b"1",
	16b"1",16b"1",16b"1",16b"1",
	16b"1",16b"1",16b"1",16b"1",
	16b"1",16b"1",16b"1",16b"1"
);
-- 係数は全部1にしたので乗算でビット幅は変化しない。
-- 計算結果に必要なビット数はceil(log2((10ビット最大値1023) * (タップ数16))) = 14
constant BITS_NEEDED : natural := 14;
```

↓ こういう回路がFPGAの中に作られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/7394add4-c48c-7eaa-befd-513271f31dc0.png)



#3. 全体の接続図
[このとき](https://qiita.com/cyq04000/items/c6b6f871ecd8e679bbb6#3-%E5%85%A8%E4%BD%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E5%9B%B3)と同じ。

#4. 実行結果
ファンクションジェネレーターから正弦波を入力して出力の周波数特性を見てみる。単なる移動平均なので帯域の制御はできないが一往ローパスの特性を示してはいる。
![scope_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/3e102507-00fc-18f6-90e6-0bc4fab83366.png)
AtCoder Beginner Contest 228 D問題　開番地法における線形探査法　図解

https://atcoder.jp/contests/abc228/tasks/abc228_d

自分用に作ったのですが、自分用にしてはまあまあ丁寧に作ったのでせっかくなので初記事として投稿してみます！

### ざっくりD問題概要
- とある配列Aの空き場所が知りたい。
- 空かどうかを示す補助的な配列Pを作る。
- 配列A[X]が空きであるかどうかはP[X]を参照。X == P[X]であればA[X]は空いている
- A[X]が空いてない場合インデックスを++1してP配列を参照していけば見つかるが、それだと時間がかかる可能性があるからもっといい感じに解きたい。

### 開番地法における線形探査法で解く理由
- 最大2回の参照で空いている場所が見つかる。


### コード

https://atcoder.jp/contests/abc228/editorial/2944

※以下で図解してるフローはこのプログラムの解法２のフローを図解しています。


### ざっくりアルゴリズムの流れ
することは大まかに２つ

- 空いてる場所を探してそのインデックスを返す
- 再び同じ場所が参照されたとき用に最も近い空いているインデックスを格納しておく。


### 空いてる場所を探しに行く処理フロー

配列Pは以下のような状態とする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228714/ac043655-102d-6647-8fef-bfe37af1e3b5.png)


##### 1番目が空いているか見に行く


- P[1] != 1なので空いてない。P[1]は2なので次はP[2]が空いているかチェック。P[2] == 2なので、２番目が空いている。
- P[2]の値をP[1]に格納する。（空いてる場所を示す場所の情報を格納といったイメージ?)
- P[P[1]+1]の値を参照しに行く　（次空いているであろう場所はP[2]に+1した場所なので)
- P[P[1]+1]の値をP[P[1]]に格納　(これでP[2]は埋まったことになり、かつ次の空いている場所を示す)

			
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228714/3ef418dc-197f-5084-666a-fa09c692c6c7.png)
		

##### また1番目が空いているか見に行く


- P[1] != 1なので空いてない。P[1]は2なので次はP[2]が空いているかチェック。
- P[2] != 2なので空いてない。P[2]は3なので次はP[3]が空いているかチェック。
- P[3] == 3なので、3番目が空いている。
- P[3]の値をP[1]に格納する。
- P[P[1]+1]の値を参照しに行く　
- P[P[1]+1]の値をP[P[1]]に格納　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228714/843f94d0-22e2-2b7a-0938-4bd6355d9376.png)


##### またまた1番目が空いているか見に行く


- P[1] != 1なので空いてない。P[1]は3なので次はP[3]が空いているかチェック。
- P[3] != 3なので空いてない。P[3]は4なので次はP[4]が空いているかチェック。
- P[4] == 4なので、4番目が空いている。
- P[4]の値をP[1]に格納する。
- P[P[1]+1]の値を参照しに行く　
- P[P[1]+1]の値をP[P[1]]に格納



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228714/e3dd6815-bc8c-f8a9-06e9-4952d1de2a6d.png)
				

こんな感じで最大2回で空いてる場所を参照できるということでした。

これって実際に使う時あるのかな...いまいち業務で使いそうになるシーンが思い浮かばない...
開番地法における線形探査法で解くような問題が他にあったら教えてください！！！
VHDLによる簡単なディジタルフィルターの実験 / その3 / 信号を素通りさせる

#1. 概要
今度はADC [MCP3001](https://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf)とDAC [MCP4911](https://ww1.microchip.com/downloads/en/DeviceDoc/22248a.pdf)とを同時に動かす。アナログ信号をAD変換してFPGAに取り込み、FPGAの内部では何もせずにDA変換して出力する。

#2. ADC [MCP3001](https://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf)とDAC [MCP4911](https://ww1.microchip.com/downloads/en/DeviceDoc/22248a.pdf)とを同時に動かすためのVHDL

下のVHDLをコンパイルしてMAX10 FPGAに書き込む。

ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/AD_DA_MCP3001_4911_ver_2

↓ こういう回路がFPGAの中に作られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/c909bf19-1c1e-553a-7bfe-a9ea109d6141.png)



#3. 全体の接続図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/7fed6818-5f1a-d7fc-5eff-f0e98be12dc3.png)


#4. 実行結果
サンプリング周波数は40 kHz。黄色が入力\(1 Vpp、1 kHz\)、緑が出力。
![scope_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/00c1a7f6-38ae-db40-d74f-2a3e47ba8c0e.png)
VHDLによる簡単なディジタルフィルターの実験 / その2 / DAコンバーターを単独で動かす

#1. 概要
前回はR-2R方式のDACを使ったが、DACもICを使うことにする。Micorchip社の[MCP4911](https://ww1.microchip.com/downloads/en/DeviceDoc/22248a.pdf)を使う。諸元は下のとおりである。厳密な何かをするわけではないので何でもよい。    

- 抵抗分圧方式\(抵抗ストリング\)
- 1チャンネル
- 10ビット分解能
- 外部リファレンス
- 電圧出力
- SPI通信、SPIクロックは最大20 MHz

ディップスイッチから適当に10ビット値を送り込んで、それに応じた電圧の出力されることを確かめる。

#2. DAコンバーター[MCP4911](https://ww1.microchip.com/downloads/en/DeviceDoc/22248a.pdf)を動かすためのVHDL

下のVHDLをコンパイルしてMAX10 FPGAに書き込む。

ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/da_converter_MCP4911_spi_ver_2

↓ こういう回路がFPGAの中に作られる。    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/9faacf78-0e82-9019-a3dc-e1b547dbd868.png)



#3. 全体の接続図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/247e1c4f-f958-b4ab-b2ae-fe1d0113cf70.png)


#4. 実行結果
今ディップスイッチから0x200 \(0b10_0000_0000\)を送り込んで、それが1.635〔V〕\( = 3.27 * 0x200/2\^10 \)に変換された。3.27〔V〕はリファレンス電圧の実測値。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/6c255a3e-aa87-28c3-8856-3da2671661cc.png)