OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoの自動テストを実行する方法について

# 「Djangoで自動テストをする方法は？」
* 独りよがりな先輩が後輩に教えています。
* たまに後輩からの突っ込みが入ります。直接先輩には言いませんが、、、
    * （）と太字で書いています。例, **(ほげほげ) (なんでやねん！)**

Windowsならコマンドプロンプトで次のコマンドを実行してね！
でも「manage.py」があるフォルダーというかディレクトリで実行してね。
**（全然違うディレクトリで実行していて一晩を費やした過去の自分に教えてあげたい）**
**（あとこの先輩、MacとWindows、Linuxだったらコマンドが違うのに全然解説せんやん、、これはググる必要があるな「Django テスト Mac」で検索っと）**
```:bash windows バージョン
py manage.py test
```
これを実行するとこんな感じの画面に切り替わるよ！いっちょ前に成功したやつを載せたい！
```: 実行結果
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.070s

OK
Destroying test database for alias 'default'...

(.venv) C:\Users\taiyo\Documents\love_app\mysite>py manage.py test
Found 3 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...
----------------------------------------------------------------------
Ran 3 tests in 0.042s

OK
Destroying test database for alias 'default'...
```
でもこれって事前に自分でテストを書いておいていかないといけないわけ。
どこのファイルに書くかっていうと、、、、

「test.py」という名前のところに書くね。
場所はここであるよ！
**（なんか急に中国風）**
```: ファイル構成図
polls
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py (←ここだよ！ここ、ここ！)
│  │  urls.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─migrations
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          __init__.cpython-39.pyc
│  │
│  ├─templates
│  │  └─polls
│  │          index.html
│  │          question_1.html
│  │          question_10.html
│  │          question_2.html
│  │          question_3.html
│  │          question_4.html
│  │          question_5.html
│  │          question_6.html
│  │          question_7.html
│  │          question_8.html
│  │          question_9.html
│  │          result.html
│  │
│  └─__pycache__
│          admin.cpython-39.pyc
│          apps.cpython-39.pyc
│          models.cpython-39.pyc
│          tests.cpython-39.pyc
│          urls.cpython-39.pyc
│          views.cpython-39.pyc
│          __init__.cpython-39.pyc
│
└─mysite
    │  asgi.py
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py
```
じゃあ、さっそく中身を書いていこうか。
何をしたいかによって、書く内容は変わるよ。**（そりゃそうだろ）**

どんな内容を書いたらいいかは是非ググってみてね。**（急にぶん投げやがった）**

でもマジで、テストしたい内容に応じて変わるんだもん。**（あれ、俺の心の突っ込み漏れてね？？）**

**次回に続く！！**


# 参考文献
[Writing and running tests](https://docs.djangoproject.com/en/4.2/topics/testing/overview/)
[Djangoのテストでrequest.POSTに任意の値を設定する方法](https://qiita.com/tcx_ik/items/4fad57413063439e54b5)
【コマンドラインのオプションが使えるようになる】Rubyのライブラリoptparseについて

# はじめに
### optparseとは？
プログラムをコマンドラインで実行するとき、オプションや引数を指定できるようにするRubyの標準ライブラリです。

ライブラリについて、わからない人は以下の記事を一読すると良いかと思います。

https://qiita.com/sugamaan/items/d7871da28c0160b69609

# オプション定義のコード例
次の項でこちらのコードに関して、説明していきたいと思います。
```sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a') do |v|
 p v 
end

opt.parse!(ARGV)
p ARGV
```
実行結果↓
```
ruby sample.rb -a foo 
# => true
     ["foo"]
```

# コードの解説 (使い方)
### 1. optparseライブラリの読み込み
optparseはRubyの組み込みライブラリではないため、使用するためには読み込む必要があります。
```
require 'optparse'
```
### 2. OptionParserクラスのインスタンス作成
オプションや引数の定義と処理を行うためのオブジェクトoptを生成します。
```
opt = OptionParser.new
```
### 3. OptionParserのonメソッドを利用
オプションや引数の定義と処理を指定します。onメソッドは、オプションや引数が指定されたときに実行されるブロックを受け取ります。
※他のeachメソッドなどとは異なり、ブロック内の処理は登録されるだけで、実行はされません。
```
opt.on('-a') do
# -aが指定されたときの処理を書く
end
```
### 4. opt.parse!でコマンドライン引数を解析
引数を解析し、定義したオプションや引数の処理を実行します。ARGVは、コマンドライン引数の配列を表しており、parse!メソッドによりそれらの引数が解析されます。
```
opt.parse!(ARGV)
```
***

以上がコマンドラインでオプションを使うための流れです！さらに詳しい内容が公式リファレンスに記載されてありますので、ご参照ください。

# 参考

https://docs.ruby-lang.org/ja/latest/library/optparse.html
ABC311 - C - Find it! 自己解法

# 問題

https://atcoder.jp/contests/abc311/tasks/abc311_c

# 考察
問題で与えられるグラフには必ず有向閉路が1つ以上存在しています。そのどれか1つを求めてくださいという問題です。問題文から、「ある頂点」は必ず1つだけ有向の辺が伸びていることが分かります。さらに有向閉路は必ず存在することから、任意の頂点$A_i$から有向辺をたどっていくことで必ず有向閉路を周回することになります。そこで、下記のような手続きで有向閉路1つを求めることができます。
1. 始点となる頂点を決め打ちする。
1. 訪れた頂点を記録しながら、有向辺をたどる。
1. 1度訪れた頂点を再び訪れた時点で1度たどるのを止める。
1. 「3で止まった頂点」を始点として、訪れた頂点の順番を記録しながら有向辺をたどる。
1. 再び「3で止まった頂点」に戻ってくる。このときに、「4で記録した頂点の順番」が求めるべき有向閉路の1つになる。これを出力する。

これなら計算量も$O(N)$には収まると思われるので、十分間に合いそうです。
上記の手続きとなるようなコードを実装していきましょう。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc311/submissions/44021385

ご不明点などがあれば教えていただけると幸いです。
(コラムです)数学教科書の巻末とコラムは、イイですね。


**数学教科書の巻末とコラムを、教科書ガイドでガイド？してほしいです。**
勉強中です。

# 「問題を解くときに働く見方・考え方」イイですね。
東書?数Ⅱ　教科書NO.701　巻末
問題を解く過程は4つの段階で表すことができます。
(数研出版様と)違う意味での4STEPでした、

ユーチューバー様で問題の解説を、4つの段階で解説してほしいですね。
(?以下、私がDeepL翻訳しました？)
https://www.deepl.com/ja/translator#ja/en/私は相変わらずややこしい事をしています。
https://www.deepl.com/ja/translator#ja/en/私は相変わらずヤヤコシイ事をしています。
https://www.deepl.com/ja/translator#ja/en/問題を理解する
https://www.deepl.com/ja/translator#ja/en/計画を立てる
https://www.deepl.com/ja/translator#ja/en/計画を実行する
https://www.deepl.com/ja/translator#ja/en/ふりかえる

次の"の行と,以下そのままエラーです。実行不要です。
https://www.deepl.com/ja/translator#en/ja/"Understanding the Issues"
https://www.deepl.com/ja/translator#en/ja/Understanding_the_Issues
https://www.deepl.com/ja/translator#en/ja/make_plans
https://www.deepl.com/ja/translator#en/ja/carry_out_a_scheme
https://www.deepl.com/ja/translator#en/ja/look_back

# 以下いつものゆうどうです。
数学の教科書で、音楽？を調べていたら,上記を発見した次第です。
数学の教科書のコラムから、過去問があったら、教えて下さい。(不公平感?)
（リンクのジャンプの調子がわるいかも）

https://qiita.com/mrrclb48z/items/3bc211acd500aa36a7a1#:~:text=%E3%81%A6%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82-,%E6%95%B0,-%E2%85%A1%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%82%88%E3%82%8A
Javaの例外処理について学習してみた

# 概要
Javaの例外処理について学習してみました。以下のページを参考にしました。

例外処理

https://www.javadrive.jp/start/exception/

例外とは

https://www.javadrive.jp/start/exception/index1.html

try文

https://www.javadrive.jp/start/exception/index2.html

必ず実行する処理の記述(try..catch..finally)

# まとめ
何かの役に立てばと。
Kotlin の使いやすさ

個人的なメモ書きです。
- ; がいらない  
- 型推論が使えるからコードがかなりすっきりとしたものにできる  
- letなどを駆使することでnullチェックとその後の処理を手短く記述することができる
- Javaの後継言語になっているので相性抜群！！！
- ドキュメントがたくさんある

これからも追記予定
ひな形を使わずASP.Net Coreを使ったWebサーバーを構築する。

# 概要
クラスライブラリやコンソールアプリ内にWebサーバーを立てたい場合に、ASP.Net Coreを使えるようにする手順です。

# 手順
## ASP.Net Coreフレームワークの参照
サーバーを立てたいプロジェクトのcsprojを編集して、フレームワークの参照を追加します。
```diff_xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
+ <ItemGroup>
+	<FrameworkReference Include="Microsoft.AspNetCore.App" />
+ </ItemGroup>

</Project>
```

## Controllerの準備
今回呼び出したいAPIを記述したControllerクラスを用意
```C#:TestController.cs
using Microsoft.AspNetCore.Mvc;

namespace ConsoleApp1
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class TestController
    {
        [HttpGet]
        public string GetMessage()
        {
            return "Hello World";
        }
    }
}
```

## Webサーバーの立ち上げプログラムを記述

ひな形を使わないときは、なぜかAPIとコントローラの紐づけがうまくいかないため、
Controllerを記述したプロジェクトを明示的に指定する必要がありました。
```C#:Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// Controllerを記述したプロジェクトを明示的に指定
var assembly = AppDomain.CurrentDomain.GetAssemblies()
    .ToList()
    .First(x => x.GetName().Name == "ConsoleApp1");

builder.Services
    .AddControllers()
    .AddApplicationPart(assembly);

var app = builder.Build();

app.UseAuthorization();

app.MapControllers();

app.Run();
```

## 構成ファイルの準備
ASP.Net Core特有のappsettings.jsonという名前の構成ファイルを準備します。
Visual Studioでjsonファイルを追加します。
プロパティから、ビルドアクションを「コンテンツ」に変更し、コピー動作を「常にコピー」にしておきます。

構成内容を記述します。
```json:appsettings.json
{
    "AllowedHosts": "*",
    "Kestrel": {
        "Endpoints": {
            "Http": {
                "Url": "http://localhost:1234"
            }
        }
    }
}
```

# 動作確認
デバッグ実行したら、ブラウザでAPIにアクセス。
http://localhost:1234/Test/GetMessage
「Hello World」の文字が表示されることを確認します。

# 最終的なプロジェクト構成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139166/6548e048-0cc9-8a50-76de-5a1482b2eb64.png)
mysqldump (Ver 8.0.32)--single-transactionオプションエラー

ec2でmysqldumpがエラーになりました。

--single-transactionオプションが引っかかるようです。

以下のエラーが出ます。

> mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'admin'@'%' (using password: YES) (1045)

以下のバージョンが対象になるようです。
https://qiita.com/is0383kk/items/41550e44569790d34ce1

> mysqldump  Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)

8.0.34にアップデートしてもエラー回避できず、結局以下のコマンドで8.0.31にダウングレードして対応できました。

```
# yum downgrade mysql-community-client-plugins-8.0.31-1.el7 mysql-community-client-8.0.31-1.el7 mysql-community-libs-8.0.31-1.el7
```
レコメンドで役立つ？履歴との重複を高速に判定する方法

こんにちは。nadareです。
普段は業務でレコメンドエンジンをスクラッチで実装しています。
今回はレコメンドでよく使う、履歴との重複を高速に判定する方法を紹介します。

# どんな時に使うか
今回紹介するテクニックは主に以下のようなケースで利用します。

1. 学習時に負例からユーザーが別の機会でインタラクションするものを除くケース
2. 予測時に予測結果からユーザーの履歴に既に含まれているものを除くケース

このテクニックは例えばデジタルコンテンツの購入のように、一度購入した商品をもう一度購入することはないようなケースで良く用います。

例えば1ではNNのモデルでインタラクションのあるアイテムを正例を1、それ以外のバッチ内の他の正例を負例として0で予測するケースを考えます。バッチ内の他の正例が全て0として扱えればいいのですが、中には過去に購入済みであったり正例と同じアイテムであって、本当に無関係な負例と同様0として予測するのには不適切で、マスクをかけたいことがあります。

2のケースは、予測時に既にユーザーが購入している、閲覧済みであるといった理由でレコメンドに適さないアイテムをレコメンドの候補から外すケースです。もちろん予測結果をDBに入れて後からSQL等で重複を判定してもよいのですが、後の方で除外するほどレコメンドの件数を確保しにくく、かつ予測結果の並び替えなどを上手く働かせられなくなります。

# 具体的なアルゴリズム
1のケースで想定してみましょう。バッチサイズがN=4096で、判定する負例の数も4096、ユーザーはH=100の履歴を持つとします。
## 愚直に判定するケース
N人のユーザーごとに愚直にN個の負例とHの履歴の衝突を計算すると、O(HN^2)≒1.7Gの計算が必要になり重いです。
pythonでループを回すには当然遅く、行列で一括で計算するには空間計算量が厳しいです。

## 二分探索を用いるケース
負例はバッチ内で共通なので、これをソートして昇順に並べます。ソートはO(Nlog(N))で可能です。
ソートされた数字の配列Lの中にある数字aがあるかは以下のようなコードで判定できます。

```python
ix = np.searchsorted(L, a) % len(L)
hit = L[ix] == a
```
このhitした部分についてnp.where等を使ってマスクをかけます。
二分探索の計算量は一回当たりlog(L)のため、O(HNlog(N))≒5.0Mの計算で可能になり、大幅に速度が改善します。

# 実際の運用
アルゴリズムの説明のため簡略化しましたが、実際は様々なロジックと合わせて上記ロジックを運用します。
ユーザーごとに履歴の長さは異なり、大抵のユーザーの履歴は一桁二桁であるのに対して、稀により大きな桁数の履歴を持つユーザーが現れます。このような場合、大きいユーザーに合わせて密な行列を作ると殆どのユーザーで無駄な計算をしてしまうため、[tf.RaggedTensor](https://www.tensorflow.org/api_docs/python/tf/RaggedTensor)を使います。また、レコメンドの履歴や推薦結果は人気なものにある程度偏るため、ユニークをとってから計算するなどして同じ計算を極力省きます。

# まとめ
二分探索を用いて履歴との衝突を判定するニッチなテクニックを紹介しました。
二分探索は基本的なアルゴリズムですが、しっかり押さえておくことで計算量を大幅に減らすことができます。
競プロ等を通じて、アルゴリズムの基礎力を高めていきましょう。
LEGOとObnizを用いた猫自動餌やり器

非常にシンプルな構成です。

<h2>一、システムの構成：</h2>

・本体：猫餌やり器の本体はLEGOで作成
・電子パーツ：Obniz、人感センサー、サーボモーター、LED
・プログラム：人感センサー、サーボモーター、LEDを制御するプログラム


<h2>二、成果物イメージ：</h2>

![IMG_3710.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/b6b5cac8-43d0-3fa3-da45-42ed87ede394.jpeg)
Qiitaの秘められた問題点：エンジニアコミュニティの質と方向性を再考する

# Qiitaの役割と進化の課題

Qiitaは、その設計意図と達成すべき目的についてのいくつかの混乱に直面しているようです。このプラットフォームは、技術的な知識を集約し、その普及を狙うという建前においては誰もが賛同できるものでしょう。一方で、Webライティングの一般的な枠組みが一貫して適用されるため、初めて見る人にとっては情報量が豊富なコンテンツが提供されているように感じることでしょう。しかし、それが内容の深みやオリジナリティにつながるとは限らず、最善の結果を生み出すとは必ずしも言えない現実も存在します。

## 個々の成長と全体の品質

この現状は、プラットフォーム内に存在するさまざまな関心事の間の微妙な緊張を示しています。一方で個々の寄稿者は、自己啓発や自己表現に努力を注ぎ、一方でそれが必ずしもQiita全体の品質向上に寄与するとは限らないということに、我々は気づかねばならないかもしれません。

## ポエム記事とその影響

また、エンジニアリングのライフスタイルや経験に焦点を当てた"ポエム"記事も、これらは多様性を重視し、一部の読者にとっては有益な視角を提供する存在であり、その存在は無視できません。だが、あるテーマに偏った情報源が増えると、それがQiita全体の品質や視野を偏らせ、混乱を招く可能性があります。

## 評価と読者の混乱

さらに、一部の記事が極端な評価を集め、その結果、より多くの閲覧の機会を獲得するという現象も問題になりつつあります。これは、Qiitaの全体的な品質が低下しているとの誤解を引き起こす可能性があります。記事に問題があると感じて直接的なフィードバックを提供しようとする人もいますが、そのアプローチが問題解決に寄与するとは必ずしも言えないでしょう。

## ユーザーへの価値

また、ある記事が人気を集めるという現象は、必ずしもその記事が読者に対して有益な情報を提供している証左ではないということも理解すべきです。それでも必ずしも無価値な記事と見なすべきではありません。読者にとって有用な情報が提供されているかどうかが、本来最も重要なポイントであり、これがプラットフォームの真の価値を示すものであるべきです。

## 結び

よって、私たちが理解すべきは、Qiitaはエンジニアが知識を交換するための場であり、その価値は一時的な人気や評価の数によって測るべきものではなく、どれだけ多くのエンジニアに有益な情報を提供できたかによって評価されるべきであるということです。
ノートPC2台を縦置きできる100均ガジェット

## はじめに
会社支給のwindowsノートと、プライベート用のMacBookを机に置くと、
机の面積をかなり占めてしまう。

PC2台を縦置きにして、机をシンプルにしたい。
amazonに縦置きスタンドが売っているが、2,000円以上する・・・

そこで、私がPCスタンド代わりにセリアから買ったアイテムが、
ピッタリハマったので紹介します。

## そのアイテムとは・・・

まな板スタンド
![IMG_4900 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/5d19b066-7b72-4914-23ff-2e689f050064.jpeg)

幅4cmほどなので、ノートPC２台ピッタリハマります。
しかも100円。カラーも白でおしゃれだし、デザインもシンプル
いいことだらけです。

![IMG_4901.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/ebbfd097-7312-0b50-8677-9b81e7454161.jpeg)


## 終わりに・・・

amazonで検索すれば欲しい物はすぐに出てきますが、
100均の様々なアイテムで活用方法を探してみるのも楽しいですヨ
[TableauミニTips]ワークシートの自動更新オンオフ

# はじめに
同僚から、「ダッシュボードを作っていたら画面が白くなって動かない・・・！」という問い合わせがありました。
これ、解決方法は単純なのですが、トレーニングとかでも習うことあまりないだろうし、知らないとびっくりするしで、意外とハマりポイントなのでは？と思ったのでミニTipsとして記事にしておきます。

# 画面が白くなる？
Tableau Desktopで作業中、たま〜に画面が以下のように半透明になることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945012/25994bed-1c3e-0c7c-5633-27cea71d7074.png)

この状態で行列シェルフや各マークカードに入れるディメンション/メジャーを操作しても、フィルタに何か追加してもVizは全く変化しません。

（出荷モードを外したのに画面に残っている、の図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945012/65e8cfca-e1fd-c762-e87c-d1090081cccc.png)

# 原因と対処法
この状態は、「ワークシートの自動更新がオフになっている」ため起きています。
画面をもう一度よく見てみると、左上のほうのメニューアイコンが、いつもと違う形になっているはずです。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945012/c9dd0880-3553-90a2-b695-d996cdef0c55.png" />

アイコン画像と状態はこんな関係になっています。
現在の状態とアイコンが一致しているのではなく、押したら行われる操作とアイコンが一致しているところが注意点ですね。

<table>
    <tr>
        <td>
            <img width="40" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945012/cead6ad3-1b1b-6e29-64df-a7bdc29114b1.png" />
        </td>
        <td>
                自動更新<b>有効</b>
        </td>
        <td>ワークシート上で操作を行うたびに、データソースにクエリが発行されVizが更新される<br>このアイコンをクリックすると「自動更新を一時停止」する
        </td>
    </tr>
    <tr>
        <td>
            <img width="40" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945012/2ff1fdc7-43f3-0536-b8c7-7d667bee359f.png" />
        </td>
        <td>
                自動更新<b>無効</b>
        </td>
        <td>　ワークシート上で操作を行っても、データソースにクエリが発行されない<br>この状態でワークシートを操作すると、Vizが最新のデータ状態でないことを示すために全体が半透明になる<br>このアイコンをクリックすると「自動更新を再開」する
        </td>
    </tr>
</table>

なので、「シートが白くなって更新されない！」となったら、慌てず騒がずアイコンをクリックして自動更新を再開すれば大丈夫です。

なお、Desktop上で操作をしていて、自分では設定していないのに勝手に自動更新が停止されていることがあります。私はこの発生条件を正確に理解できていないのですが、データ量が多い、ブレンドを使っている、などの時に起こりやすいような気がしています。

# 自動更新を無効にするメリット

おまけとして、なんで自動更新を無効にするオプションがあるのかについても書いておきます。
このオプションはViz作成時のパフォーマンス向上を目的としていると考えられます。

特にデータ量が多く、クエリ実行に時間がかかるデータソースにアクセスするワークシート上で作業している場合、ディメンションやメジャーを放り込むたびに、フィルタを設定するたびに何秒か待たされて・・・というのでは作業効率が下がってしまいます（それ以前に超イライラすると思います）。
そこで、行いたい一連の操作があらかじめわかっている場合は、自動更新を無効にしておき、必要な操作をおこなった後で再開すれば、無駄なクエリ発行で待たされることもなくなります。

Tableauのオンラインヘルプでも本機能はパフォーマンスと絡めて紹介されています。

[パフォーマンスを向上させるため自動更新をオフにする](https://help.tableau.com/current/pro/desktop/ja-jp/queries_autoupdates.htm)

# おわりに
いかがでしたでしょうか。本記事の内容が、これから同じ事象でハマる人が少しでも減ることにつながれば幸いです。
OSファイルシステムの構成確認（man hier）

- 以下のコマンドを叩くと確認できる。
```terminal:terminal
man hier
```

- 以下のような内容が確認できる。

```terminal:terminalの出力内容
/            ファイルシステムのルートディレクトリ

/bin/        シングルユーザーおよびマルチユーザー環境の両方に基本的なユーザーユーティリティ

/dev/        ブロックおよびキャラクタデバイスファイル

             fd/   ファイルディスクリプタファイル; fd(4)を参照

/etc/        システムの設定ファイルおよびスクリプト

/mach_kernel カーネルの実行ファイル（ブート時にメモリにロードされるオペレーティングシステム）。

/sbin/       シングルユーザーおよびマルチユーザー環境の両方に基本的なシステムプログラムおよび管理ユーティリティ

/tmp/        一時ファイル

/usr/        多くのユーザーユーティリティとアプリケーションが含まれています

             bin/       一般的なユーティリティ、プログラミングツール、およびアプリケーション
             include/   標準的なCインクルードファイル

                        arpa/       インターネットサービスプロトコルのCインクルードファイル
                        hfs/        HFSのCインクルードファイル
                        machine/    マシン固有のCインクルードファイル
                        net/        その他のネットワークCインクルードファイル
                        netinet/    インターネット標準プロトコルのCインクルードファイル; inet(4)を参照
                        nfs/        NFS（Network File System）のCインクルードファイル
                        objc/       Objective-CのCインクルードファイル
                        protocols/  BerkeleyサービスプロトコルのCインクルードファイル
                        sys/        システムのCインクルードファイル（カーネルデータ構造）
                        ufs/        UFSのCインクルードファイル

```

- 参考

https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
Seeed studioの XIAO ESP32C3と拡張ボードを使ってみた（注意喚起あります）

# ことの発端
いま色々なマイコンボードを弄り回していまして、現在は XIAO ESP32C3 を弄ってます。
で、テスト評価に便利ということでXIAO用拡張ボードも購入しました。
この拡張ボード、OLEDディスプレイも付いてて配線も要らないから便利なんですよ😁

参考リンク

https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/

https://wiki.seeedstudio.com/Seeeduino-XIAO-Expansion-Board/#specification

テストとして、SG-90サーボを回してみました。
環境としては⇓の写真ですが、写真ではサーボの配線はボードから外してあります。
![Polish_20230727_153750496.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/f472ea0c-bc26-b954-fb29-c2bf23a90f19.jpeg)

表示されている数値は角度表記です。単純にスイープさせて動かすやり方です。
で、なぜ配線を外してあるかといえば、基板から煙が出たからです(O_o)
サーボモーターはサーボコネクタに接続しました。名前がサーボコネクタだし、５Vも出力されているのでそのままダイレクトに・・・
で、暫く動かしていたら煙がでました(・・;)
慌てて電源を切り、その後調べたところサーボコネクタの5V出力が死んでました。
でも、マイコンを動かす3.3Vは生きているので表示は生きています。
# 発煙の原因
この拡張ボード、サーボ出力の5VはUSBに繋がなくても5Vが得られる様に昇圧回路がはいっていました。
その部分の回路図が⇓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/d90d4d6c-9663-02ec-ed3d-49c25e2d9778.png)
煙が出た位置もちょうどこのデバイスが実装されているあたりからでした(+_+)
ここ、回路図に700mAって書いてありますね。
それが定格ってことなのでしょう
では、SG-90の最大消費電流はと、ぐぐったら⇓にピーク値で1.2Aとありました。

http://meyon.gonna.jp/study/electronic/4123/#:~:text=%E7%B5%90%E6%9E%9C%EF%BC%9ASG90%20%E3%81%AE%E6%9C%80%E5%A4%A7%E9%9B%BB%E6%B5%81%E3%81%AF%201.2A%20%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%A2%E3%83%BC%E3%82%BF%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%AF%E3%80%81Arduino%20%E3%81%AE,5V%20%E5%87%BA%E5%8A%9B%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%AF%E9%81%BF%E3%81%91%E3%81%9F%E3%81%BB%E3%81%86%E3%81%8C%E3%81%84%E3%81%84%E3%80%81%E3%81%A8%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E3%82%84%E3%81%A3%E3%81%B1%E3%82%8A%E6%AD%A2%E3%82%81%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%A7%E3%81%99%E3%81%AD%E3%80%82%20%E3%83%A2%E3%83%BC%E3%82%BF%E7%94%A8%E3%81%AB%E5%88%A5%E9%80%94%201.5A%20%E3%81%90%E3%82%89%E3%81%84%E3%81%AE%E5%AE%B9%E9%87%8F%E3%81%AE%E3%81%82%E3%82%8B%E9%9B%BB%E6%BA%90%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%81%9F%E3%81%BB%E3%81%86%E3%81%8C%E8%89%AF%E3%81%84%E3%81%A7%E3%81%99%E3%80%82

つまり、定格を超える電流が流れ、ここの回路が昇天しちゃったってことになります。
リンク先のサイトでは、電源ラインに電流検出抵抗を挿入し、その抵抗両端の電圧をオシロで測っていますからこの電流値は正確でしょう。

# 結論
XIAO拡張ボードのサーボコネクタにサーボモーターを直接繋いだらダメ！
ってことです(T_T)
で、サーボモーターを回したい場合どうするか・・・
5Vを別なところから持ってくるということですね。
幸い、今回煙を発した拡張ボード、サーボコネクタの5V出力が使えなくなっただけで、他はちゃんと動いていますので、とりあえずそのまま使います。
買い替えたところでサーボ直結できなければ意味ないし(´・ω・`)
とりあえず、USB側からとって回してます。
ただし、USB3.x以上でないとダメですね。
実用的には別途電源を設けて、サーボモーター電源は別電源から供給してあげるのがよさそうです。
では(^^)/~~~
AzureSQLDBのDTUを上げたら負荷テスト結果は向上するか

## Node.js×TypeScriptのバックエンドAPIに対してK6負荷テスト
AzureSQLデータベースへの登録処理を含むAPIに対してK6を使用してみたところ、SELECT系処理は同時接続数十アクセスにも耐えられるのに対し、INSERTやUPDATEが走るAPIではせいぜい１～３アクセス程度でリクエスト失敗が増え始めていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/1074b69b-97a9-8c6d-a7fd-c8eff83a35a5.png)

## Azure SQL データベースの性能
今回使用したAzure SQL データベースでは、DTUベースのリソースを作成しており、最低レベルのBasicを利用していたためアクセスに耐えられなかったのではないだろうか。

## Azure SQL データベースの DTU とは？
Azure SQL データベースでは、Database Transaction Units (DTU) という単位を使用して、リソースの割り当てを測定している。DTU は、CPU、メモリ、ディスク、I/O によって構成されており、各 DTU は一定のリソースを表している。

## DTU変更方法
DTUはAzureポータルの画面から変更することができる。
データベースのリソース画面に移動し、「コンピューティングとストレージ」からDTUやデータの最大サイズをシークバーで変更可能。
好きなDTUに変更したら「適用」ボタンで変更が反映される。
※今回はDTU５→１００に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/d3135694-2cfd-fc8f-9703-1f0b75262e9a.png)

## DTU100でK6負荷テスト実施結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/8b121b93-edeb-d82c-f198-475a6ead7bbe.png)
DTUを100にあげても同時アクセス数の増加にはつながらない。
別のところに原因があると思われるので今後も調査していきたい。
ExcelのVBAのエディターで日本語が文字化けする場合の解消方法


スタートボタンの右隣の検索ボックスに`intl.cpl`と入力し、<kbd>Enter</kbd>キーを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502854/89308611-6335-5ddf-345b-6b3c65a0bcd5.png)

表示された画面で [管理] タブに切り替え、[システムロケールの変更] ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502854/0e496529-2112-ec66-f655-4e50a37b0c11.png)

表示された画面で [現在のシステム ロケール] のプルダウンから [日本語 (日本)] を選択し、[ベータ: ワールドワイド言語サポートでの Unicode UTF-8 を使用] のチェックを外して [OK] ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502854/d244fc39-9217-16e8-93e3-51baf24a0636.png)

以上


参考サイト 感謝mm
[VBA 文字コードを変換や判定、文字化けを解消する](https://www.tipsfound.com/vba/04012-vba)
[Mac] ショートカットキー - Finder系

# 概要
Macのショートカットキーについてまとめました。
Finder系です。　
共通系は[こちら](https://qiita.com/yut-nagase/items/7663cd4c5c8e8c3e2e26)にまとめました。　


# Finder系

## 選択フォルダーを開く
command+↓

## 上のフォルダーに戻る
command+↑

## フォルダ・ファイルの情報を表示する
command+I 
## クイックルックによるプレビュー表示
Space

## ファイルを削除
command+Delete

## ファイルを複製
command+D

## 「コンピュータ」ウインドウを開く
shift+command+C

## 「デスクトップ」フォルダを開く
shift+command+D

## 「フォルダへ移動」ウインドウを開きます。
shift+command+G

## ホームフォルダを開く
shift+command+H

## 一つ前のフォルダに戻る
command+[

## 一つ先のフォルダに戻る
command+]

## サイドバーが消えたので、再表示したい場合
command+option+s
2つの封筒問題（金額仮定版と未開封版）を数学的に解く

## 問題（金額仮定版）

>お金の入った2つの封筒があり、片方はもう片方の2倍の金額になっている。
無作為に1つの封筒を選んだとき、交換した方が得か？ただし、選んだ方の金額を2Yとする。

引用元：[2つの封筒問題（金額仮定版）](https://qiita.com/SaitoTsutomu/items/3079a88163153abf2ac2#2%E3%81%A4%E3%81%AE%E5%B0%81%E7%AD%92%E5%95%8F%E9%A1%8C%E9%87%91%E9%A1%8D%E4%BB%AE%E5%AE%9A%E7%89%88)

証明では1000円と仮定していますが別になんでもいいです。変数xでもいいです。値がひとつに確定しているという事実が重要なので。

## 解く

https://sokrates7chaos.hatenablog.com/entry/2019/05/03/013225

上記のサイトより、
自然数全体からxを抽選する確率を求める関数Pが存在する場合、
$P(x) \neq P(y) \quad (x \neq y)$
を満たす自然数x, yが存在することが分かります。（1）
（関数Pが存在しないケースは備考参照）

これを前提にしたうえで、封筒問題を考えます。

封筒を開いたら1000円が入っていました。
このとき考えられる封筒の組み合わせは
(500, 1000), (1000, 2000)のいずれかです。

また、封筒の組み合わせの集合は自然数全体に対して以下のような全単射fで表現できます。

```math
\begin{align}
f(x) &= (x, 2x) \\
f^{-1}(x) &= g((x, 2x)) = x
\end{align}
```

つまり、(500, 1000), (1000, 2000)がそれぞれ抽選される確率は
自然数全体から500, 1000がそれぞれ抽選される確率と同じです。

このとき、1000円から切り替えたときの期待値は以下のようになります。

```math
500 \times \frac{P(500)}{P(500) + P(1000)} + 2000 \times \frac{P(1000)}{P(500) + P(1000)}
```

有名な封筒のパラドックスは$P(500) = P(1000)$の場合に発生しますが、
（1）より$P(500) \neq P(1000)$の可能性があります。

よって正確な期待値を求めることができないため、
交換するべきかしないべきかは判定できません。

### 備考

* 一応言っておきますが、これは1000円を変数xにしても同じことです。
* （1）を満たす関数Pが存在しない場合、期待値を求めることが不可能なため結論は変わりません。
* [確率](https://ja.wikipedia.org/wiki/%E7%A2%BA%E7%8E%87%E8%B3%AA%E9%87%8F%E9%96%A2%E6%95%B0)[関数](https://ja.wikipedia.org/wiki/%E7%A2%BA%E7%8E%87%E5%AF%86%E5%BA%A6%E9%96%A2%E6%95%B0)が定義された場合は期待値は求められます。ただし、その確率関数は（1）より一様分布ではありません。

## 問題（未開封版）

>お金の入った2つの封筒があり、片方はもう片方の2倍の金額になっている。
無作為に1つの封筒を選んだとき、交換した方が得か？

引用元：[2つの封筒問題（未開封版）](https://qiita.com/SaitoTsutomu/items/3079a88163153abf2ac2#2%E3%81%A4%E3%81%AE%E5%B0%81%E7%AD%92%E5%95%8F%E9%A1%8C%E6%9C%AA%E9%96%8B%E5%B0%81%E7%89%88)

## 解く

この場合、金額の組み合わせは
$(x, 2x) \quad (x \in \mathbb{N})$
であり、双方の封筒の期待値は
```math
x \times \frac{1}{2} + 2x \times \frac{1}{2} = \frac{3x}{2}
```
と同じになるため、交換してもしなくても期待値は変わりません。

## 開封版では期待値計算で使う確率が1/2かどうか分からないと言っていたのに、何故未開封版では平然と1/2を使っているのか？

開封版の「期待値計算で使う確率」は、(x, 2x)と(x, x/2)の封筒の組み合わせが抽選される確率のことを指しています。
未開封版の「期待値計算で使う確率」は封筒を選択する確率のことを指しています。
「封筒の組み合わせの抽選確率」と「2つの封筒の片方を選ぶ確率」の違いです。

## 何故開封前は期待値が同じにもかかわらず、開封すると期待値が分からなくなるのか？

各「封筒の組み合わせ」が抽選される確率分布が分からないからです。
開封前は**どのような確率分布であろうと**、両方の封筒の期待値は同じになります。
開封後は確率分布が分からなければ、もう片方の期待値を求められせん。

この説明があっているのか自信がありません。
もっとうまい説明ができる人がいたら教えてください。

## 参考にしたサイト

https://dragonflare.blog.jp/archives/55679727.html

## 関連

https://qiita.com/mogamoga1337/items/4eced4eaeb5b5cebc902

https://qiita.com/mogamoga1337/items/a6ca597f1fbc2024fc63
[Mac] ショートカットキー - 共通系

# 概要
Macのショートカットキーでよく使っているものをまとめました。
個人的メモ書きレベルです。

# 画面操作系


## スクリーンロック
command + control + Q


## デスクトップを表示
F11
※フルスクリーンを表示している際は不可なので、タッチパネルで操作(親指＋３本の指を置き、斜め下、反対側斜め上へ展開)

## Finderでの切り取りコピー
command+C → command+⌥Option+V
Optionを付けるだけで「切り取り」に成るので、慣れれば便利かも

## Spotlight検索　※Windowsで言うところのCortana
command+space

## 環境設定を開く
command+,

## タブを閉じる
command+Q

## 最前面のウィンドウを閉じる
command+W

## 開いているアプリケーションを全て閉じる
command+option+W

## アプリケーションを強制終了する
command+option+esc

## フルスクリーン 切り替え
command+control+F

## 文字ビューアを表示する　※Windowsで言うところのIMEパッド。正確には違うが
control+command+space

## スクリーンショットを撮る(画面全体)　※ファイル保存(デスクトップ)
command + shift + 3

## スクリーンショットを撮る(画面一部選択)　※ファイル保存(デスクトップ)
command + shift + 4

## スクリーンショットを撮る(画面全体)　※クリップボード
command + control + shift + 3

## スクリーンショットを撮る(画面一部選択)　※クリップボード
command + control + shift + 4

## スクリーンショットを撮る(アクティブウィンドウ)　※クリップボード
command + control + shift + 4　→ マウスクリック＋Spaceキー
 
# ドキュメント編集系
## 行または段落の先頭に移動
control + A

## 行または段落の最後に移動
control + E

## ファイルの先頭に飛ぶ
command + ↑

## 最上部へ移動
control + ↑

## 最下部へ移動
control + ↓
M5StampS3 + 3.2インチLCD（ILI9341）で MSX エミュレータを動かしてみる

# はじめに

以下の記事で、M5StampS3 + 3.2 インチ LCD (ILI9341) の環境を構築することができ、無事「Hello, World!」を表示するポートレイトが完成しました。

https://qiita.com/suzukiplan/items/b5882449fdbf571b4e80

ただし、上記記事の状態だと描画速度に難があったのですが、その点については描画に用いていたディスプレイドライバを [Adafruit_ILI9341](https://github.com/adafruit/Adafruit_ILI9341) から [LovyanGFX](https://github.com/lovyan03/LovyanGFX) に差し替えてみたところ、実用的な描画速度になりました。

https://qiita.com/suzukiplan/items/e7f66d1b8ae7d6c7e03e

今回は、[micro MSX2+](https://github.com/suzukiplan/micro-msx2p)という組み込み用途に特化した MSX エミュレータを用いて、この環境で MSX エミュレータを動かしてみたいと思います。

本記事で用いるハードウェア構成や配線構成は、[こちらの記事](https://qiita.com/suzukiplan/items/b5882449fdbf571b4e80)から変更していません。

# micro MSX2+ for M5StampS3

`micro-msx2p` を `git clone` して `msx1-m5stamps3` ディレクトリで　`make` を叩けば、M5StampS3 + 3.2 インチ LCD (ILI9341) の環境で MSX1（※C-BIOS）が動きます。

```bash
git clone https://github.com/suzukiplan/micro-msx2p.git
cd micro-msx2p
git checkout 6aa69099af49148448c6e12a0224bd7b2911a22b
cd msx1-m5stamps3
make
```

:::note warn
2023.07.29 追記
最新のcommitで配線仕様が変わったので、配線を変えずに動かすには [commit 6aa6906](https://github.com/suzukiplan/micro-msx2p/tree/6aa69099af49148448c6e12a0224bd7b2911a22b) への `git checkout` が必要です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/abd6512d-e333-9726-9e8a-a1e672cd61d7.png)

このまま起動すると、以下の記事で紹介されている MSX で Hello World が表示されるサンプル ROM が起動します。

https://qiita.com/suzukiplan/items/b369d3f9b41be55b247e

...ですが、流石にそろそろ Hello World を見るのも飽きてきたし、画面の表示レスポンスのチェックも行いたいところなので、もっと動き（アニメーション）のある ROM に差し替えてみましょう。

# ROM を差し替えてみる

まず `msx1-m5stamps3/bios/game.rom` を動かしたい ROM ファイルに置き換えます。

今回は以下の ROM を使ってみることにします。

https://twitter.com/thara1129/status/1670056569680322561

```
msx1-m5stamps3 % cp /path/to/rabbit_adventure_trial.rom bios/game.rom
```

動かす ROM がメガロムの場合、`msx1-m5stamps3/src/app.cpp` の `msx1.loadRom` を呼び出している箇所のメガロム種別を適切に変更する必要がありますが、今回試す ROM は 32KB 標準 ROM なので、書き換え不要です。

> メガロムを動かす時は　`MSX1_ROM_TYPE_NORMAL`　の箇所を適切なものに変更します。
> ```micro-msx2p/msx1-m5stamps3/src/app.cpp
>     msx1.loadRom((void*)rom_game, sizeof(rom_game), MSX1_ROM_TYPE_NORMAL);
> ```

あとは、makeを実行するだけです。

```
make
```

すると動きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/81804843-bef3-62ba-ea19-dc33bafb0413.png)

やっぱり画面が動くと良いですね。

本当は AY-3-8910 (PSG) の BGM が再生されるのですが、まだ、音声モジュールを搭載していないので、残念ながら音は鳴りません。

という訳で、次はI2SのDACモジュール接続にチャレンジしてみたいところです。

https://qiita.com/suzukiplan/items/8724bbda1684a04c8884
Maven の使い方

こちらの記事と同じ事を行いました。
[Maven で Java プロジェクトの構築](https://spring.pleiades.io/guides/gs/maven/)

## 使うソフト

Java のバージョン

```text
$ java --version
openjdk 20.0.2 2023-07-18
OpenJDK Runtime Environment (build 20.0.2+9)
OpenJDK 64-Bit Server VM (build 20.0.2+9, mixed mode, sharing)
```

Maven のバージョン

```text
$ mvn --version
Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
Maven home: /opt/maven
Java version: 20.0.2, vendor: N/A, runtime: /usr/lib/jvm/java-20-openjdk
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "6.4.6-arch1-1", arch: "amd64", family: "unix"
```

## ファイルの用意

フォルダー構造の作成

```bash
mkdir -p src/main/java/hello
```

ファイルの作成

```java:src/main/java/hello/HelloWorld.java
package hello;

public class HelloWorld {
  public static void main(String[] args) {
    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}
```

```java:src/main/java/hello/Greeter.java
package hello;

public class Greeter {
  public String sayHello() {
    return "皆さん、こんにちは!";
  }
}
```

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-maven</artifactId>
    <packaging>jar</packaging>
    <version>0.1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>hello.HelloWorld</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
```

この時のフォルダー構造

```text
$ tree
.
├── pom.xml
└── src
    └── main
        └── java
            └── hello
                ├── Greeter.java
                └── HelloWorld.java

5 directories, 3 files
```

## コンパイル

```bash
mvn compile
```

## パッケージの作成

```bash
mvn package
```

## 実行

```bash
java -jar target/gs-maven-0.1.0.jar
```

```text
$ java -jar target/gs-maven-0.1.0.jar
皆さん、こんにちは!
```
WordPress REST API を使用して WordPressに記事を投稿する(JavaScript)



**headers**

- アプリケーションパスワードはwordpress管理画面のuserページより取得可能
```
  const headers = {
      "Content-Type": "application/json",
      Authorization:
        "Basic " + Buffer.from(`${wordpressのユーザーネーム}:${wordpressのアプリケーションパスワード}`).toString("base64"),
    };
```


**url**

```
const url =  `${wordpressのURL}/wp-json/wp/v2/posts`;
```

**articleData(投稿内容)**

- 公開ステータスは以下
    - publish（公開）
    - future（公開予約） 
    - draft（下書き）
    - pending（非公開）
    - private（限定公開）

```
   const articleData = {
      title: 記事タイトル,
      content: 記事本文,
      status: 公開ステータス,
    };
```


**API実行**

```
 const result = await axios.post(url, articleData, { headers });
```

レスポンス内から投稿ページリンクを参照

```
const postedURL = result.data.link
```

以上
AWS CLF合格したのでメモ✏️

## 資格取得のモチベーション
- プロジェクトが変わるので心機一転でスキルアップのために受験
- 性格上、資格試験は向いていないのですが一番簡単な位置付けなのでちょっと頑張ってみようと思い

## 勉強したこと
- 通称、緑本
    - 1年前くらいに買っていて積読していた
    - 各章の章末問題に使った
- Udemy
    - 評判が良いのでセールの時に購入していて放置していた
    - 基本と応用に分かれていて、応用は本番より難易度が高いとのこと
    - 基本は9割くらい
    - 応用は7割くらいの正答率を目指しつつ間違えたところを見直した
- 公式のトレーニング
    - 無料だし、公式しか勝たん。ということでやった
    - ちょっと古い情報もある
        - 例えば、AWS Well-Architected は、`持続可能性`が書かれていなかったりした
- 公式の模擬試験
    - 無料
    - ただし、20問
    - 試験3日前にやって85%だったので安心して試験に向かった

## 感想
- 書籍とUdemyの基本問題の出題範囲を調査して覚えると合格圏に行くんだろうと思います
- Udemyの応用で出題される頻出ではないサービスも把握しておくと点数が伸びていくんだと思います
- 知らないサービスを知れてよかった
    - ベタな感想ですが、知らないサービスがめちゃくちゃあった
- 一番簡単なやつだから舐めてたけど暗記が大変だった
    - 聞いたこともないニッチなサービスは覚えるしかないので結構辛かった

## 結果
- 834/1000点でした
DjangoチュートリアルのためのDocker環境構築

※ Djangoはじめてなので指摘あれば歓迎します

# やりたいこと
Djangoのチュートリアルやりたい
そのために

- Djangoの環境構築
- Dockerでの環境

依存関係も管理されていてほしいのでpoetryというパッケージ管理ツールを利用します
0ベーススタートです

# 最終的な構成

```
├── docker
│   ├── app
│       └── Dockerfile
├── docker-compose.yml
├── poetry.lock
├── pyproject.toml
└── src
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
```


# Docker環境作成

まず、作業ディレクトリに

`docker/app/Dockerfile`を作成します

```Dockerfile
FROM python:3.11

ENV PYTHONUNBUFFERED 1

WORKDIR /workspace

# poetryインストール
RUN curl -sSL https://install.python-poetry.org | python3 -
RUN echo 'export PATH="/root/.local/bin:$PATH"' >> ~/.bashrc && . ~/.bashrc && poetry config virtualenvs.create false

ADD . /workspace/
```

Python環境をセットアップし、Pythonのパッケージ管理ツールであるPoetryをインストール。
PYTHONUNBUFFEREDは標準出力のバッファリングを無効にして、すぐにコンソールに出力されるようにする。

つぎに作業ディレクトリ直下に`docker-compose.yml`を作成します

```yaml
version: '3.8'

services:
  app:
    build: 
      context: ./docker/app
      dockerfile: Dockerfile
    volumes:
      - .:/workspace
    working_dir: /workspace/src
    ports:
      - 8000:8000
    tty: true
```

`docker-compose up -d`して`docker-compose exec app bash`してコンテナに入ります。

# Djangoのセットアップ

まずコンテナに入ると`/workspace/src`にいるので`cd ..`して一段上に。

`poetry init`を実行します

```bash
 poetry init
```

Package nameとAuthorだけ入れて、enterしておけばできます。

```bash
This command will guide you through creating your pyproject.toml config.

Package name [workspace]: app
Version [0.1.0]:  
Description []:  
Author [None, n to skip]:  n
License []:  
Compatible Python versions [^3.11]:  

Would you like to define your main dependencies interactively? (yes/no) [yes] 
You can specify a package in the following forms:
  - A single name (requests): this will search for matches on PyPI
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Package to add or search for (leave blank to skip): 

Would you like to define your development dependencies interactively? (yes/no) [yes] 
Package to add or search for (leave blank to skip): 
```

そして`django`をインストールします

```bash
poetry add django
```

この時点で以下のような構成です。

```bash
├── docker
│   └── app
│       └── Dockerfile
├── docker-compose.yml
├── poetry.lock
├── pyproject.toml
└── src
```

あとは以下のコマンドでdjangoのプロジェクト作成します。

```
django-admin startproject mysite ./src
```

srcに移動して、サーバーを起動

```
cd src
python manage.py runserver 0:8000
```

localhost:8000にアクセスして画面出れば完了

![django.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/5cc4c42d-cc8f-3684-ddd9-005ce6c127ce.png)
Arduino UNOにAdafruit ST7735をインストール(ST7789も同じ)

目的
OLEDのテスト

1.スケッチ
2.ライブラリ
3.ライブラリを
4.st7735を検索
5.Adafruit ST7735を選択



![o_cop480.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d9356ba1-cbe2-534e-009b-f8973503db48.jpeg)

![o_cop631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/41bb8cec-05be-8681-2ba5-a41c51048b87.jpeg)
paiza.ioでelixir その245

# 概要
paiza.ioでelixirやってみた。
for reduceてなんだ。

# サンプルコード

```

for i <- 1..10, reduce: 0 do
	acc ->
		acc + i
		|> IO.inspect
end
|> IO.inspect


```

# 実行結果

```
1
3
6
10
15
21
28
36
45
55
55
```

# 成果物

https://paiza.io/projects/EZeAGUy2Qpiy8A45ErfjnQ?language=elixir

以上。
@antfu/niのniコマンドがPowerShell上で実行できない問題を解決する

[@antfu/ni](https://github.com/antfu/ni) は `npm install` を `ni` に短縮してくれる便利なコマンドですが、WindowsのPowerShell上では**初期状態だと `ni` を使用できません**。
New-Itemコマンドレットのエイリアスとして `ni` が設定されているためです。

```
PS> ni

コマンド パイプライン位置 1 のコマンドレット New-Item
次のパラメーターに値を指定してください:
```

そこで、下記の通り設定を行うことにより、PowerShellでもniコマンドを使用することができます。

# 設定の概要

PowerShell起動時、Remove-Aliasで`ni`のエイリアスを削除するように設定します。
ただし、Remove-Aliasは**PowerShell 6.0以降でないと使えない**ため、合わせてPowerShellも最新版にバージョンアップします。

# 設定手順

(1) PowerShellのバージョンを確認

```
PS> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22621.1778
PSEdition                      Desktop
.
.
```

(2) PowerShellのバージョンが6.0未満の場合は、下記記事を参考にPowerShellの最新版をインストールする
※バージョンが6.0以上であれば、手順(2)、(3)はスキップしてください

https://qiita.com/probabilityhill/items/f56c9b2882936c296c0e



(3) Windowsの検索バーから「PowerShell」と入力して、表示された候補からPowerShellの最新版をクリックする
※下記画像であれば「**PowerShell 7 (x64)**」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17947/b73a1736-e90e-549d-415f-fbde5492aeb8.png)

:::note warn
PowerShellは、最新バージョンをインストールしても古いバージョンをそのまま残す（共存する）仕様のため、上記で「Windows PowerShell」を選択すると、PowerShell 5が起動してしまいます。
:::

PowerShellの最新版が起動したことを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17947/c66db535-4401-885e-a9da-c520845e7357.png)

(4) PowerShellに下記コマンドを貼り付けた後、Enterキーを押下して実行し、現在ログインしているユーザー用のプロファイル（PowerShell起動時に読み込まれるスクリプト）を作成する。

```powershell
if (!(Test-Path -Path $PROFILE)) {
  New-Item -ItemType File -Path $PROFILE -Force
}
```

(5) PowerShellから下記コマンドを実行し、プロファイルをメモ帳で開く。

```
PS> notepad $PROFILE
```

(6) メモ帳に下記スクリプトを貼り付けて保存する。

```powershell
Remove-Alias -Name ni -Force
```

(7) PowerShellの最新版を再起動し、 `ni -v` で@antfu/niのバージョンが表示されれば設定完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17947/d4c30eb1-3b7d-13fe-5853-725f011e0c2b.png)



# 参考

情報元

https://github.com/antfu/ni/issues/21


@antfu/niの説明記事

https://qiita.com/oekazuma/items/12abf4c1bc1dbc63be85

Windowsボタンを[右クリック]→Windowsターミナルで起動した場合に、古いPowerShellが立ち上がってしまう問題を解決したい場合

https://jo-sys.net/powershell-install/#index_id10
給与明細WEBアプリ開発インフラ編

挨拶:このWEBアプリの開発は私がエンジンニアになって初めて携わった開発です。まだまだ勉強不足なところがありますので気になったところがあればお気軽にご指摘頂けたら幸いです。

アーキテクチャ図:
![screenshot .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321327/2cb18989-a111-f846-1fd3-dbb73c82b6a2.png)

アーキテクチャの説明:
今回はシンプルで必要最小限の構成で設計しました。

ポイント
1.フロントサーバーとバックエンドサーバーをプライベートサブネットに置き
ALBを通して外部と通信できるようにしてます。
サーバーを直接インターネットに公開せず保護することができます。
パブリックサブネットにメンテナンスサーバーを一つ設置して
必要な場合はこちらのメンテナンスサーバーからアプリケーションのサーバーに接続して
サーバーの中身を操作します。

2.将来アクセスの増加によりサーバーがマルチAZに構成を変更する可能性もあり
ALBを経由することでサーバーが増加しても同じURLで接続することができます。

3.サーバーが外部への窓口をALBに集約することにより経路を集中保護ができます。

4.ステートレスの観点からファイルはサーバーの中に置かず
S3に置くことによって仮に本番のサーバーが故障しても予備のサーバーが
S3に保存したファイルを読み込むことができます。

5.ALB、VPCなどのログはS3に保存し、必要な場合Athenaを使って確認できます。

Terraformの構成:
```
C:.
│   .gitignore
│   .terraform.lock.hcl
│   main.tf
│   README.md
│   ues_modules.tf
│
├───.terraform
└───modules
    ├───ec2_server
    │       main.tf
    │       variables.tf
    │
    ├───load_balancer
    │       main.tf
    │       variables.tf
    │
    ├───rds_server
    │       main.tf
    │       variables.tf
    │
    └───vpc_service
            main.tf
            output.tf
```

Terraformで最低限必要なソースを管理して
細かい設定は手動で管理してます。
GitHubActions workflow初心者おぼえがき　～複数のjob実行～

その１は[こちら](https://qiita.com/konnbu/items/1c6c8fb67821f8b507e2)

## いくつかのジョブを実行したい
ジョブとはこれのことである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/dd0fa59f-a477-93ac-bd15-b2d68759e6fb.png)

今回はいくつかのジョブを繋げて、順番に（直列に）実行したい　ってイメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/83173bb8-61e4-113c-1f39-7ce1ce9e7613.png)
複数同時に（並列に）実行することもできるけど、今回は<b>直列</b>のやり方のみ説明。

### jobs の中身
```yml
jobs:
  # GitHubの画面(UI)上で指定した変数を表示する
  workflow-start:
    runs-on: ubuntu-latest
    steps:（略）

  # 環境変数を表示する
  workflow-env:
    needs: workflow-start
    runs-on: ubuntu-latest
    steps:（略）
```

コードと画面の関係。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/e135ae13-355a-d25c-0787-be30e3d8761d.png)
Pythonで絵文字を認識する方法（無駄記事）

# 概要
絵文字同士の比較をする際、そのまま（e.g. `"👏" == "👏"`）だとエラーが出た。
`ord()`をかませると上手くいった。
```python
a = "👏"
if len(a) == 1 and ord(a) == ord("👏"):
    print("OK")

#console: OK
```

# 経緯
Discord Bot 作成中、絵文字メッセージがトリガーの関数を実装しようとした。

# 振り返り
執筆にあたりやり直したところ、直接比較で全く問題なかった。
ダブルクオーテーションを付け損ねていたのだのだろうか。
GitHubActions workflow基本のキ

ドドド初心者のおぼえがき。

# 今回のソースコード
```yml
name: basic-run

on:
  workflow_dispatch:
    inputs:
      name:
        description: "名前入力"
        required: true
        default: "GitHub子"
      age:
        type: choice
        description: "年齢入力"
        required: true
        default: "20代"
        options:
          - "10代"
          - "20代"
      category:
        type: boolean
        description: "元気？"
        required: true
        default: true

jobs:
  workflow-start:
    runs-on: ubuntu-latest
    steps:
      - name: 変数ちゃんと入ってる？
        run: |
          echo "name: ${{ inputs.name }}"
          echo "age: ${{ inputs.age }}"
          echo "category: ${{ inputs.category }}"
```

# ymlのかきかた
大きくまずは on と jobs と書こう！
（on が変数の定義などを入れる大箱、jobs が実行系の処理を入れる大箱）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/9217992d-1e4c-0d66-2853-fbdbc058faa9.png)

## on について
on には「設定」を書く。変数とか。
### onの中身（今回は手動実行の例）
とりあえずon の一段下にworkflow_dispatchを入れてみると、
ワークフローの画面上に「Run Workflow」のボタンが出るはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/9e295dd5-33db-11a8-d079-3536dc487d38.png)
### もっと細かく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/2fdd622a-9e65-015b-2b7d-2c2980150ffd.png)
変数名は後のjobsで使える。

手動実行の他にも、
- 定期的に自動で実行
- 何かイベントが起きたとき（pushしたとき、マージしたとき等）に実行
などもできる。
「ワークフローを、何かイベントが起きたときに実行する」系の便利ワークフロー例は
GitHub公式ドキュメント「[ワークフローをトリガーするイベント](https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows)」で書かれてる。

## jobs について
jobs には「実行する内容」を書く。

### jobs の中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/2aebae3c-3c42-c805-5d50-7e0dc1e22322.png)
ubuntu-latestと書くことで最新バージョンのubuntuを使ってくれる。
バージョン指定も可。（ubuntu-20.04　みたいな感じに書く）

### もっと細かく
このjobs の一つ下の階層のworkflow_startが、ワークフロー実行時にGitHub画面に反映される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/74d66ae8-3f89-3673-ac59-795fc848b3ef.png)
コードとの関係↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/58f02976-385a-971d-bcdd-af88b74aebe0.png)

このGitHub画面上のworkflow_startをクリックすると詳細が見れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/c1e9f133-415d-feb8-478c-33a4e6a48379.png)
コードとの関係↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/025c8881-d939-a3d7-3703-bcd8ef6a4579.png)

### 補足　変数について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/7f256432-2284-cacd-fddc-f3b700218d04.png)

inputsはいろんな種類があるらしい。別の記事にそこらへんも掘り下げて書きたい。
EVE-NG で VyOS や ESXi を構築する

普段は Nested の vSphere クラスタを構成し、いろいろとイジったりしているが、細かいネットワークの挙動や多ポートのスイッチの設定についてはどうしても動作確認できず困っていた。
当然、豪勢な L3/L2 スイッチ群を用意できれば良いのだが、簡単に揃えられるわけではないので EVE-NG というエミューレターを使用する。

インストール周りについてはそこそこ情報があるのだが、構築については情報があまりなかったのでメモ代わりに残しておく。

## EVE-NG をインストールする
OVF をダウンロードし、普通に ESXi 上にデプロイすればよい。ここは先人の知恵を借りる。
[EVE-NGを使って仮想NW環境を用意する～1. インストール編～](https://qiita.com/watyanabe164/items/dd6278daf8c30566fca6)

## オブジェクトを追加する
EVE-NG では各 OS やスイッチの ISO を読み込ませることで Lab へ当該オブジェクトをデプロイすることができる。
ISO インポートの方法にややクセがあり、
* EVE-NG の `/opt/unetlab/addons/qemu/` 配下に各オブジェクト用のディレクトリを作成
* ISO を `cdrom.iso` という名前で配置する

というものになる。

### VyOS の作成
スイッチの ISO イメージについては各ベンダから正規に入手するか、実機から入手するなどの方法が必要となり、ややハードルが高い。
__※要はネット上に転がっている（？）ものなどを使用するのは違法なのでやめましょう、ということ__

どうしても Cisco スイッチの挙動を確認したい ... という場合は頑張って入手するしかないが、単に物理的なスイッチの挙動に近いものを再現できれば良いだけなら OSS のソフトウェアルータである VyOS で十分事足りる。
[VyOS のサイト](https://vyos.io/)

VyOS の ISO をダウンロードしたら EVE-NG の VM 上に転送し [公式の手順](https://www.eve-ng.net/index.php/documentation/howtos/howto-add-vyos-vyatta/) に沿って準備をする。
```
/* 専用ディレクトリ作成 */
root@eve-ng:~# mkdir /opt/unetlab/addons/qemu/vyos-1.4
root@eve-ng:~# cd /opt/unetlab/addons/qemu/vyos-1.4

/* cdrom.iso という名前で ISO をコピーする */
root@eve-ng:/opt/unetlab/addons/qemu/vyos-1.4# mv ~/vyos-1.4-rolling-202307280757-amd64.iso cdrom.iso

/* VyOS 用のディスク（KVM の qcow2 形式）を任意のサイズで作成 */
/opt/qemu/bin/qemu-img create -f qcow2 virtioa.qcow2 16G
```

### ESXi の作成
ESXi も ISO をダウンロードし、同様の手順（[公式の手順](https://www.eve-ng.net/index.php/documentation/howtos/howto-add-vm-ware-esxi/)）でイメージ配置を行う。
こちらは ESXi にデプロイした EVE-NG の上に、更にネストする形で作成するものになる。
```
/* 専用ディレクトリ作成 */
root@eve-ng:~# mkdir /opt/unetlab/addons/qemu/esxi-7.0u3g
root@eve-ng:~# cd /opt/unetlab/addons/qemu/esxi-7.0u3g

/* cdrom.iso という名前で ISO をコピーする */
root@eve-ng:/opt/unetlab/addons/qemu/esxi-7.0u3g# cp ~/VMware-VMvisor-Installer-7.0U3g-20328353.x86_64.iso cdrom.iso

/* ESXi 用のディスク（KVM の qcow2 形式）を任意のサイズで作成 */
root@eve-ng:/opt/unetlab/addons/qemu/esxi-7.0u3g# /opt/qemu/bin/qemu-img create -f qcow2 hda.qcow2 32G
```

### EVE-NG 上でデプロイ
上記の方法でイメージを配置すると [左ペイン]>[Add an object]>[Node] で VyOS や ESXi が青字になり、選べるようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/68ee4ae9-611d-791b-5b6f-180c21bc63dd.png)

それぞれ CPU やメモリなどを指定し、Save を押下する。
※ESXi は QEMU Nic を `vmxnet3` に変更することをお勧めします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/3ff44683-12f1-002e-47f6-d94591865ebd.png)

右クリックで Start/Stop することで通常の VM と同様に起動・停止することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/f2030132-4f45-5160-a84b-3f536af420ae.png)

※各アイコンをクリックすることでコンソールを開くことができるが、そのままだとまともに動作しないので、公式サイトから Windows 用のクライアントをインストールすることを推奨
[公式サイト](https://www.eve-ng.net/index.php/download/) -> Windows Client Side
Flutter SingleChildScrollViewの中でListView.builderを使おうとしたらパフォーマンス悪いと知った話

# はじめに
先日、こういった有力な情報を偶然目にした
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こういう実装みかけたらシバき倒す <a href="https://t.co/qk2Vyx3QFX">pic.twitter.com/qk2Vyx3QFX</a></p>&mdash; shohei 💙 (@hobbydevelop) <a href="https://twitter.com/hobbydevelop/status/1683380498415120386?ref_src=twsrc%5Etfw">July 24, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

「**え、今まさにこんな実装をやっていた。。。**」と思い、完全にシバき倒されることとなった。

```dart
    return SingleChildScrollView(
      child: Column(
        children: [
          Image.asset('images/sample.jpg'),
          GridView.builder(
            shrinkWrap: true,
            physics: const NeverScrollableScrollPhysics(),
            gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              childAspectRatio: 0.53,
            ),
            itemCount: jobItems.length,
            itemBuilder: (context, index) {
              final jobItem = jobItems[index];
              return JobItem(jobItem: jobItem);
            },
          ),
        ],
      ),
    );
```

イメージとしては👇のような画面を実装しようとしていました。

![Screenshot 2023-07-29 at 13.36.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/630d2989-1b42-3278-01c2-4a5b9857b9f2.png)





# なぜパフォーマンス悪いのか？
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ListView.builderにはセルの再利用があり「見えている範囲」+αのWidgetのメモリを確保し、見えていないWidgetは見えるまでメモリが確保されません。<br><br>しかし、shrinkWrap:… <a href="https://t.co/jJCj0Zhj1W">https://t.co/jJCj0Zhj1W</a></p>&mdash; shohei 💙 (@hobbydevelop) <a href="https://twitter.com/hobbydevelop/status/1683479696116252672?ref_src=twsrc%5Etfw">July 24, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
どうやらこういった理由らしいです。。

>shrinkWrap: trueにすることでこの「見えている範囲」が「指定された個数分の範囲（スクショの例だと100個分）」になってしまうため、実際に見えていないWidget分もメモリが確保されてしまいます

同じような声が別の人からもありました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ListViewネストでのエラーをググって見つけたコードを真似してよく分からないまま安易に `shrinkWrap: true` 付けて解決した気分になるのはダメで、大抵はCustomScrollView/Sliver使うべき場面。<a href="https://t.co/TZm7e4iaf0">https://t.co/TZm7e4iaf0</a></p>&mdash; mono (@_mono) <a href="https://twitter.com/_mono/status/1555000159121330176?ref_src=twsrc%5Etfw">August 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


何も考えずに`shrinkWrap: true`を使うのはどうやら避けたほうがいいようですね。

## CustomScrollViewで実装してみた

```dart
    return CustomScrollView(
      slivers: [
        Image.asset('images/sample.jpg'),
        SliverGrid(
          delegate: SliverChildBuilderDelegate(
            (context, index) {
              final jobItem = jobItems[index];
              return JobItem(jobItem: jobItem);
            },
            childCount: jobItems.length,
          ),
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 0.53,
          ),
        ),
      ],
    );
```

`CustomScrollView`を使ってその中に`SliverGrid`を使うことで`GridView.builder`と同じ実装を実現することができました！！！
おうちHCIの構築1（メモ）

## Amazonプライムーで購入したN100を生かすべく、HCIを構築してみたい
### 用途
* ファイルサーバ
* VDI
### HCI選定
* Hyper-V - 外側にADを立てないとベアメタルのクラスタを作成できない？ADの構成を分散ストレージ上に置けないので困った
* Hervester - リソースの消費が激しくて、とりあえず1ノード2コア8GB環境では、WebUIにアクセスすらできなくて、VM建てる以前の問題だった
* ProxmoxVE - いろんな人がすでに使用しているから面白みに欠けるなと思ってたけど、結局使うことになる

### ProxmoxVEのセットアップ
とりあえず試したいのでHyper-V上に構築する
今回はproxmoxVE ver8.0を利用する
* 仮想マシン1 2コア4GB(172.21.0.21)
* 仮想マシン2 1コア4GB(172.21.0.22)

### 感想
1ノードだけ立てた段階でもだいぶ軽い、これならいけそう

とりあえず、分散ストレージを進めたい