OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptが解決した問題とは何か、そしてその歴史について振り返ってみましょう。

はじめに こんにちは、皆さん！素敵なエンジニアライフをお過ごしでしょうか？

私は最近、GitHub CopilotとCursorに囲まれて幸せに過ごしています。プログラミングと言えば、少し前まではインターネット上で隠れている解決策を探し出す作業でしたが、今ではAIの進化によって、コードがより快適に書けるようになりました。素晴らしいことです。

ですが、AIで幸せになりすぎた結果、そのありがたみを忘れてしまった存在があるのではないでしょうか？ それは… TypeScriptです！

この記事では、Webフロントの救世主（メシア）であるTypeScriptの歴史を振り返り、その解決した問題の大きさを学びましょう。

TypeScriptとは何か TypeScriptは、Microsoftによって開発されたJavaScriptの上位互換言語（スーパーセット）です。上位互換言語ということは、TypeScriptはJavaScriptに対する互換性を持ち、すべてのJavaScript機能を使用できます。

この関係は、SassとCSSやC++とC言語に似ています。

TypeScriptが上位互換言語として提供する特徴的な機能は、静的型付けです。名前の通り、TypeScriptはJavaScriptに静的型付けを導入することを目指しています。これにより、変数、引数、返り値に型を指定することで、JavaScriptの問題であった「実行するまでコードの安全性が保証されない」という問題を解決しました。

なぜTypeScriptが必要だったのか TypeScriptを導入することで、JavaScriptに型という安全性がもたらされますが、それと同時に、JavaScriptの柔軟性が制限されることになります。実際にTypeScriptを書いてみると、今まで許されていた柔軟な書き方が許されなくなり、最初はストレスを感じることもあります（慣れてきても、初めて使うライブラリの型定義を理解するまではストレスが続きます）。

しかし、JavaScriptの良さを失うことになっても、エンジニアたちはWebフロントの世界で型による安定を求めました。それはなぜか？その流れを歴史から学んでみましょう。

TypeScriptの歴史

JavaScript誕生 JavaScriptは1990年代にNetscapeによって、クライアントサイドで動作するプログラミング言語として開発されました。当時、JavaScriptはHTMLの補助的な役割を果たしていたため、あまり注目されていませんでした。

Flashの黄金時代 2000年代初頭、JavaアプレットやAdobe Flashを使用したWebアプリケーションが登場しました。この流れの中で、JavaScriptにも注目が集まり始めました。

失われた10年 JavaScriptに注目が集まり、大規模な開発が求められ始めました。そこで、ECMAScript 4（ES4）という仕様が議論されましたが、Microsoftの反対もあり、ES4は中止となりました。

Google Mapの登場 Google Mapが登場し、JavaScriptを使った大規模なアプリケーションが作れることが証明されました。これにより、JavaScriptの可能性が広がりました。

AltJSの登場 JavaScriptの限界を感じたエンジニアたちは、JavaScriptにコンパイルできる言語を作ろうと考え、CoffeeScriptなどのAltJS（Alternative JavaScript）が登場しました。

ECMAScriptの進化 ECMAScript 2015（ES6）では、JavaScriptにモジュール構文やクラス構文が導入され、JavaScriptの進化が加速しました。

TypeScriptの誕生 2012年、TypeScriptが発表されました。TypeScriptはJavaScriptのスーパーセットであり、型付けやモジュール化といった機能を提供することで、大規模開発を支援しました。TypeScriptは既存のJavaScript資産を活用できる点も大きな魅力です。

まとめ TypeScriptは、JavaScriptのスケーラビリティの問題に対処するために生まれました。その優位性は、JavaScriptの進化により薄れつつありますが、型付け機能による開発・運用上の優位性は依然として大きいです。

結論 TypeScriptは型を提供することで、コードがドキュメントとなり、コード補完や型チェックといった大規模開発でのメリットを提供します。それによって、JavaScriptでは生じるコードの難読化や運用不能な状況を解決しています。

もっと探索する: https://news.skysolution.com/ecommerce/best-b2b-ecommerce-platform/
circuitjsの作法 その23

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレー回路で、自己保持回路を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c1179ee3-3ce3-de3f-a18c-fc387a89dbae.png)

# ネットリスト

```$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 608 320 608 448 6 1 0.2 0.18307195674649648 0.05 1000000 0.02 20 0.015 0.005 1
R 336 160 272 160 0 0 40 5 0 0 0.5
g 576 448 576 480 0 0
s 576 208 576 272 0 1 true
w 576 272 576 320 0
w 576 160 576 208 0
w 608 320 608 160 0
w 576 160 608 160 0
w 592 448 512 448 0
w 512 448 512 320 0
w 512 320 576 320 0
s 400 160 480 160 0 0 false
w 336 160 400 160 0
w 480 160 576 160 0
162 736 320 736 368 2 default-led 1 0 0 0.01
g 736 368 736 384 0 0
w 576 320 736 320 0

```

以上。
LINE WORKSを使ってみる(コミュニケーション、管理編)

前回で3つのアカウントを作成し、2つのアカウントをそれぞれスマホにセットアップしました。ここでは2つのアカウント同士でコミュニケーションを図っていきます。

### 全員グループトーク・グループトーク・個人トーク

LINE WORKSはコンシューマー向けと同じく、グループトークと個人宛トークができます。それに加えて、LINE WORKSの全メンバーが含まれるトークルームが標準で作成されます。LINE WORKSに登録されたユーザーはまずこのグループが見えるので、全員宛の告知があればここにするのがいいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/4e069f43-528f-2e05-7418-9995aab56e6b.png)

<del>逆にグループは管理者しか作成できないようです(多分)</del>
→そんなことはありませんでした。
https://help.worksmobile.com/ja/admin-guides/manage-members/groups/create-groups/

以下、管理画面よりグループを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/22093d96-b549-a09d-cc81-dc7681689743.png)

マスキングで分かりづらくて申し訳ないですが、自分をグループマスターにしたグループを作成しました。管理画面を見るとグループが追加され、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/25de207e-a5a9-a8ff-8faa-acbf8dbf9af5.png)

スマホのLINE WORKSにも勝手にグループが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/811f8299-41e0-fa01-e0e3-b4f36028bb36.png)

グループマスターはグループへのメンバー追加削除や、グループの機能制限(トークやノートを使用させるか)が管理できます。Teamsとノリは同じですね。なおグループマスターは誰でも任命できます。

### 「組織」設定

LINE WORKSでは管理画面から「組織」が設定できるようです。試しに階層型アドレス帳ライクな組織が作れるかやってみました。

まずは普通に3つの組織を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/b39d5152-4b81-1a9c-1c48-5782712dbaad.png)

「組織の移動」で営業本部と技術本部を株式会社の配下に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/20a6c91a-f8cd-4d65-58e8-266acf68f42b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/67fb3ef7-38ee-0629-bf20-411fc5149c4b.png)

階層型組織を作成することが出来ました。

ところで「組織」は「グループ」と何が違うのでしょうか?(今さら)

公式の説明があったので読んでみます。

https://help.worksmobile.com/ja/admin-guides/manage-members/organizations/add-organizations/

>組織とは、会社の組織図上に存在する正式な部門のことを指します。
>プロジェクトや社内サークルなど、組織図とは関係なくメンバーが集まったメンバーグループとは異なります。
>会社の組織長のように、正式な役職、部門となるため、メンバーが自由に参加・退出することはできません。

なるほど。もう少し説明を読むと、組織の管理は組織長ただ1人が行うようです。

では試しに2つのアカウントを営業部に所属させてみましょう。

組織の所属はアカウント単位で設定するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/52d416b9-ce60-9b77-c24f-2f7ccb479456.png)

100人、200人の組織でこれをやるのは面倒なので、一括インポート時に設定するのが楽ですね。

ちなみに2人目のアカウントを組織長に指定しようとするとエラーになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/49064140-cf76-bd2c-93df-7b205452ef08.png)

### 組織追加後のグループトーク画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/4a74882a-431c-c4a7-e243-ea792b5b111c.png)

アカウントを追加した「営業本部」のグループに加えて、上位階層の「株式会社テスト」のグループにも所属していました。これが階層型の効果なのでしょうか。

### 管理について

ユースケースとして「グループに関係者以外は入ってほしくないが、関係者が(リアルで)加入した場合は速やかにグループに入れたい」というのがあるとします。

#### 「組織」をグループとして使う場合

- グループに関係者以外は入ってほしくない
    - システム管理者のみが組織の設定ができるので、実現可能
- 関係者が(リアルで)加入した場合は速やかにグループに入れたい
    - システム管理者に依頼する必要があるが、出入りが多い場合はシステム管理者の労力がかかる

#### 普通のグループの場合

- グループに関係者以外は入ってほしくない
    - グループ管理者を任命し、グループ管理者だけがメンバーを追加できるようにして、実現
- 関係者が(リアルで)加入した場合は速やかにグループに入れたい
    - LINE WORKS自体に新規ユーザーを追加しさえすれば、グループ管理者が該当ユーザーをグループに追加できる

ということでメンバーの出入りがフレキシブルな場合は「組織」グループではなく普通のグループを使うのがいいのかな、と思いました。
ある文字列を元にハッシュ化を行う際、ワンライナーでパスワードのように大文字小文字数字記号を出す

ある文字列から一方向性のパスワードを作成させたくなりました。

パスワードというか厳密にはただのハッシュで、結果の文字列を16進ではなくランダムっぽい文字列の生成を行わせようとしました。

先に結論を上げると下記のコマンドです。

```bash
seed="your_seed_string"; echo -n "$seed" | sha256sum | awk '{print $1}' | fold -2 | while IFS= read -r byte; do printf "\\$(printf '%03o' $((16#$byte % 94 + 33)))"; done | tr -d '\\' | head -c16

.k|Kz|MVNs?kwLSw
```

前段階としてハッシュ化してパスワードのように取り扱う場合には下記のようにしていました。

```
seed="your_seed_string"; echo -n "$seed" | sha256 | cut -c-16

c94a995b2ab75b2c
```

ただこれだと小文字16進数の範囲の文字しか出てこないため、要件を満たせないことがありました。
そこで一方向性のハッシュの結果を大文字、小文字、数字、記号を混ぜて



| コマンド | 解説 |
| --- | --- |
seed="your_seed_string"; echo -n "$seed" | 文字列の定義
| sha256sum | ハッシュ化 |
| fold -2 | 16進数で文字ごとに切り分け |
| while IFS= read -r byte; do ~~ done | 文字でループ |
| printf "\\$(printf '%03o' $((16#$byte % 94 + 33)))"; |  文字にアスキーキャラクターの33を足し込む |
| tr -d '\\' | バックスラッシュを取り除く |
| head -c16 | 16文字で切り出す |


途中で33を足しているところはASCIIコード表のビックリマーク（33）を基準にして下駄を履かせています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/2aa455be-dae8-6f7e-4e87-5a27ae3a8a73.png)

バックスラッシュは何かとエラーになりそうだったので省いています。雑に省いているので、`tr` コマンドの前に大量のバックスラッシュがあった場合には文字数が16文字未満になる恐れがあります。対処としてはprintfの中で条件分岐させるほうが良さそうですが…、まぁ実務上は問題ないかと思います。



もちろん、ランダムなパスワード生成ではなくあくまでハッシュなので取り扱いには十分注意してください。
SwiftUI備忘録 #PreviewとPreviewProviderについて

## プレビューについて
iOS17以降は、#Previewで簡潔に呼び出せる。
デバイスごとの切り分けはPreviewProviderで利用する。
なので、デバイスごとに表示を確認したい場合は、PreviewProviderを利用する。
特に意識しないかつサポートOSが17以降であれば、#Previewを使えばいいと理解した。新規開発は#Previewを優先するのがいいかもしれない。


## コード例
iOS17以降は#Preview、それ以前は#else以降のPreviewProviderをプレビューする

```
#if swift(>=5.9)
#Preview {
    BookMarkListView()
        .environmentObject(AppState())
}
#else
struct BookMarkListView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            BookMarkListView()
                .environmentObject(AppState())
        }
    }
}
#endif
```
コンピューターの重要性とその役割

コンピューターの重要性とその役割
Visit here:https://cutehairstyles.live/
コンピューターは、現代社会において欠かせない存在となっています。私たちの日常生活や仕事、さらには科学技術の進歩において、コンピューターは大きな役割を果たしています。本記事では、コンピューターの基本的な仕組みと、その重要性について説明します。
![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890671/2394c791-de4b-2a3d-e53c-8b779978ad95.jpeg)

コンピューターとは何か？

コンピューターは、データを処理し、情報を生成するための電子機器です。入力されたデータを計算、分析、または整理し、その結果を出力することで、人々のさまざまなニーズに応えます。たとえば、テキストの作成、画像の編集、インターネットの利用などが挙げられます。


コンピューターの仕組み
コンピューターは、以下の主要な部品から構成されています：

ハードウェア: 実際の物理的な部品（CPU、メモリ、ハードディスク、キーボード、ディスプレイなど）。

ソフトウェア: コンピューターを動かすためのプログラム（オペレーティングシステムやアプリケーションソフトウェア）。

ネットワーク: 他のコンピューターやデバイスと接続するためのシステム。
これらが連携することで、私たちが必要とするタスクを効率的に遂行します。

コンピューターの利点

コンピューターは多くの分野で活用されています。その利点は次の通りです：

効率性の向上: 複雑な計算やデータ処理を短時間で行える。
コミュニケーションの促進: インターネットを介して世界中の人々とつながる。
情報の保存と整理: 大量のデータを安全に保管し、迅速に検索できる。

現代社会への影響

今日、教育、医療、ビジネス、エンターテインメントなど、あらゆる分野でコンピューターが活用されています。例えば、オンライン学習の普及は、教育の機会を広げ、誰もが知識を得られる環境を提供しています。また、医療分野では、AI技術を使った診断や治療が進化しています。

まとめ

コンピューターは、私たちの生活をより便利で効率的にするための重要なツールです。その技術は日々進化しており、将来的にはさらに多くの可能性を秘めています。私たちはコンピューターの恩恵を享受する一方で、正しく活用し、デジタル社会における責任を果たすことが求められます。
閏年を判定したいのか、29という値が欲しいのか

## はじめに
個人的な話です。
VBAで**指定した年の各月の日数を取得する**機能が必要になり、
閏年（うるう年）のことを考慮した実装をしました。

2024年の閏年が終わり、今更ではあるのですが、
備忘録として書かせていただきます。

## よくみかける判定方法
```vb
Function IsLeapYear(iYear As Integer) As Boolean
    If (iYear Mod 400 = 0) Then
        IsLeapYear = True
    ElseIf (iYear Mod 100 = 0) Then
        IsLeapYear = False
    ElseIf (iYear Mod 4 = 0) Then
        IsLeapYear = True
    Else
        IsLeapYear = False
    End If
End Function
```

・西暦が4で割り切れる、かつ、100で割り切れない
・西暦が400で割り切れる
のどちらかに当てはまれば閏年、当てはまらない場合は通常年と判定するやり方です。

これを使っても良かったのですが、
再度判定結果からTrueの場合は29日、Falseの場合は28日を返すのは
気が引けるな～ということで他の方法を模索しました。

### その１．DateSerial関数を使う方法

**20XX/3/1から1を引いた値**を求め、**3/1の前日つまり2月の最終日**を取得するようにしました。
これを使えば閏年かどうかの判定はこちら側で行わなくても済むようになります。
※他の言語では対応していないものもあります

```vb
Function GetFebDays(iYear As Integer) As Integer
    GetFebDays = Day(DateSerial(iYear, 3, 1) - 1)
End Function
```

ちなみに**指定した日付から1年の間に**閏年が含まれているか判定し、
2月の日数を返したい場合は以下のように書きます。

```vb
Function GetFebDays(HopeDay As Date) As Integer
    Dim monthPart As Integer
    Dim yearPart As Integer
    
    monthPart = Month(HopeDay)
    yearPart = year(HopeDay)
    
    '2月を過ぎていたら翌年で計算する
    If monthPart > 2 Then
        yearPart = yearPart + 1
    End If
    
    GetFebDays = Day(DateSerial(yearPart, 3, 1) - 1)
End Function
```

### その２．DateAdd関数を使う方法

その１と同様のやり方ではございますが、こちらでも可能だと思います。

```vb
Function GetFebDays(iYear As Integer) As Integer
    GetFebDays = Day(DateAdd("d", -1, DateSerial(iYear, 3, 1))
End Function
```

## おまけ
他の言語（JavaScriptやC#）ではどうなのかも調べてみました

### その１．JavaScriptの場合

**2月の29番目**もしくは**3月の0番目**を指定し、
存在する場合は29を返すというやり方もあります。

```javascript
function isLeapYear(year) {
  return new Date(year, 1, 29).getDate() === 29;
}

function isLeapYear(year) {
  return new Date(year, 2, 0).getDate() === 29;
}
```
### その２．C#の場合

そもそもDateTimeクラスにIsLeapYearメソッドが用意されているみたいです。
引数に**4桁の数字**を指定して使います

```c#
bool resule = DateTime.IsLeapYear(2020);
```

## さいごに
浅い感想ですが、いろいろなやり方があるんだな～と思いました。
正直、DateSerial関数を使ったやり方は少しひねっていて初心者ぽくない感じが僕は好きです。笑

ただ先述の通り、言語によっては出来たり出来なかったりするみたいなので、
オーソドックスなModを使ったやり方が書く側もコードを見る側も理解しやすいのかなと思いました。
circuitjsの作法 その22

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
論理回路で、フリップフロップ回路を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ab4c993c-9cf5-fa4c-2405-a28f8b95169a.png)

# ネットリスト

```
$ 1 0.000005 1.500424758475255 50 5 50 5e-11
M 400 192 448 192 0 2.5
L 144 192 96 192 0 0 false 5 0
L 96 272 48 272 0 0 false 5 0
151 272 192 400 192 0 2 5 5
151 144 176 272 176 0 2 5 5
w 272 208 272 272 0
w 96 272 272 272 0
w 144 160 144 112 0
w 144 112 400 112 0
w 400 192 400 112 0

```

以上。
【Docker】MacでDockerがインストールできない時の対処

# 事象
macOS Seqoia 15.2（24C101)でDockerを新規インストールしようとしたところ、インストーラーを開いた際に以下のような警告が出てきて永遠にインストールできない。

![スクリーンショット 2025-01-08 15.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374371/320da483-f512-ca70-c7da-7379a2b1a374.png)


# 対処法
Dockerのサポートに問い合せしてみたところ、以下のコマンドを実行してみるように言われた。

```
sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
```

これに加えて以下のコマンドで
```
sudo rm -rf /Library/PrivilegedHelperTools/com.docker.*
```

古いファイルを削除した後、インストーラーを再び実行すると、インストールが正常にできた。
WireGuardをインストールするとbash: complete: nosort: invalid option nameというエラーが発生する件

## 発生した問題
macOS (Apple Silicon)でWireGuardをインストールすると以降
ログインシェルが実行されるたびに以下のエラーメッセージが出るようになる
```
-bash: complete: nosort: invalid option name
-bash: complete: nosort: invalid option name
```

## 解決方法
`/opt/homebrew/etc/bash_completion.d` で`grep -OR nosort *`でnosortが含まれるコンプリーションファイルを探すと
`wg`と`wg-quick`というコンプリーションファイルが見つかる
そのファイルをvim等で開き`/nosort`でcompleteコマンドを実行している行を探し
completeコマンドの`-o nosort`を削除すると無事
2行の`-bash: complete: nosort: invalid option name`は表示されなくなる
pandasから出現回数のdictにする



### **user**:

pandas dataframe 形式のデータ df があります。列Xには、重複が多くあります。df から列Xを読み込んで、列Xに登場する文字列をkeyとして、その出現回数をvalueとする辞書形式データを得るPython関数を書いてください。

---

### **assistant**:

以下のようなPython関数を作成することができます。Pandasを使用して、指定された列（X）に登場する文字列の出現回数をカウントし、それを辞書形式で返す関数です。


```python
import pandas as pd

def count_occurrences(df, column_name):
    # 指定された列の値の出現回数をカウント
    counts = df[column_name].value_counts().to_dict()
    return counts

```

使用方法:

例えば、dfというDataFrameが以下のようなデータを持っている場合:


```python
import pandas as pd

# 例として、以下のDataFrameを作成
data = {'X': ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']}
df = pd.DataFrame(data)

# 関数を呼び出して出現回数をカウント
result = count_occurrences(df, 'X')
print(result)

```

このコードを実行すると、出力は次のようになります:


```
{'apple': 3, 'banana': 2, 'orange': 1}
```

説明:
- df[column_name].value_counts()は、指定された列（この例ではX）の各値が登場する回数をカウントして、pandas.Seriesオブジェクトを返します。
- .to_dict()を使って、そのSeriesを辞書に変換しています。辞書のキーは値（文字列）、バリューはその出現回数になります。

---
山登りアプリYAMAPで見栄えのする自動生成動画を出力する

# 山登りアプリYAMAPで見栄えのする自動生成動画を出力する

山登りアプリYAMAPで見栄えのする自動生成動画を出力する手順を解説します。  
動画はmp4形式で取り出せるので、SNSへの投稿などで使えます。  
[👇YouTubeリンク](https://youtube.com/shorts/CpYbmP5kdz8?si=bfRdS1xPSy0HKooY)  
[<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735605156377.png" alt="image" width="20%"/>](https://youtube.com/shorts/CpYbmP5kdz8?si=bfRdS1xPSy0HKooY)

## YAMAPから自動生成動画を出力する

YAMAPアプリを起動します。  
<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735617719014.png" alt="image" width="20%"/>  
マイページから動画にしたい活動日記を選択します。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735608245578.png" alt="image" width="20%"/>
  
3Dリプレイを再生を選択します。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735608772076.png" alt="image" width="20%"/>
  
3Dリプレイが始まったら、画面中央の**動画を共有**をクリックします。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735608941815.png" alt="image" width="20%"/>

動画を作成中と表示されるので、しばらく待ちます。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735609056104.png" alt="image" width="20%"/>

👆この画面になったら、動画ファイルは携帯の写真フォルダに保存されています。  

## 本記事へのリンク

[<img src="https://websa12.z11.web.core.windows.net/image-data/202412/20241231/1735617152062.png" alt="image" width="30%"/>](https://docs.saurus12.com/tips/yamap_movie)

### [https://docs.saurus12.com/tips/yamap_movie](https://docs.saurus12.com/tips/yamap_movie)

[keywords]  
YAMAP 動画ファイル SNS共有

[山登りアプリYAMAPで見栄えのする自動生成動画を出力する](https://docs.saurus12.com/tips/yamap_movie)

更新日:2024年12月31日
【Unity】ProjectSettingsの iOS (Player設定) に関するメモ


## 概要

iOS 向けの設定でいろいろとハマることがあった（主に画面端の入力関係）ため、備忘録として残します．

環境：Unity2021.2.1

https://docs.unity3d.com/ja/2023.2/Manual/class-PlayerSettingsiOS.html

設定項目は以下のセクションに分かれている．

- Icon (アイコン)
- Resolution and Presentation (解像度と表示)
- Splash Image (スプラッシュ画像)
- Debugging and crash reporting (デバッグとクラッシュのレポート)
- Other Settings (その他の設定)

## Resolution and Presentation

#### Orientation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/8eb58fff-d5b1-0fb1-cba6-b7403327e0bf.png)

画面の回転方向に関する設定．※この項目は`Android`, `iOS`, `UWP`で共有．

#### Allowed Orientations for Auto Rotation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/6c1a0c98-2228-bba5-bde7-52599a042964.png)

`Default Orientaion`が`Auto Rotaion`の時に表示される．各方向への自動回転を許可するか否かを設定できる．

また`Auto Rotation`の場合、`Orientation`の方に自動回転時のアニメーションを有効にするかの項目も追加される．

#### Multitasking Support

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/7c7e0b13-7ba2-01aa-e0dc-49365c3ed01e.png)

マルチタスク機能を使用するかの設定．使用しない場合は`RequiresFullScreen`にチェックを入れる．有効にすると、`StatusBar`中央に表示される`・・・`から画面分割を行える．

https://support.apple.com/ja-jp/102576

また有効にする場合、横画面と縦画面の両方に対応している必要があるらしい．
(私の環境では XCode のビルドは通るが、`・・・`が表示されず無効な状態になっていた)

https://kan-kikuchi.hatenablog.com/entry/Requires_full_screen#google_vignette

#### Status Bar

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/37a6de4f-5650-a2aa-0918-8bba976fa660.png)

iOS アプリのステータスバー（画面上部に表示される時間、バッテリー状態、先ほどの`・・・`などを含む領域）に関連する設定．

- Status Bar Hidden：　表示 / 非表示
- Status Bar Style：　表示色（Auto / 黒 / 白）

## Other Settings

#### Configuration

- Camera Usage Description
- Microphone Usage Description
- Location Usage Desctiption

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/ab00a505-7837-594b-e9bb-374bcab94859.png)
iOS アプリでカメラやマイク、位置情報を使用する場合は、何らかの文字列を入力する必要がある．ここに設定した文字列は許可ダイアログ内の説明文で使用されるらしい．

https://qiita.com/ohbashunsuke/items/c56da7461ff6f3bd6910

<details><summary>説明文の多言語化</summary>
余談だが、UnityLocalizationで多言語化対応している場合、これらの説明文は`ProjectSettings > Localization > Metadata`から`LocalizedString`を設定できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/2d641424-f28b-1460-946c-d2ed6c88008d.png)

</details>

- Target Device：　アプリが対象とするデバイス
- Target minimum iOS Support：　アプリが動作する iOS の最小バージョン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/a852be2f-91e7-879c-e880-e2d3b8a43d5e.png)

- Defer system gester on edges：　画面端でのシステムジェスチャの遅延
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/5c51a38b-b92d-c834-1d23-22b878dea855.png)

画面端からのスワイプでシステムメニューが開くが、それに必要なスワイプが２回になる（１回目は選択状態になり、２回目で通常）．
<b>画面右端にある`Slider` (uGUI) の反応が遅れるという問題が発生していた</b>が、この`Right Edge`にチェックを入れることで解決した．Slider は IDragHandler で値の更新を行っているため、それとシステムジェスチャの判定が競合していたものと思われる．

一応マニュアルでは下記のように説明されており、実際に上下のジェスチャは使用頻度が高いため有効化する場合は注意が必要．

> iOS ヒューマン インターフェイスのガイドラインでは、この動作を有効にするとユーザーが混乱する可能性があるため、有効にすることはお勧めしません。

https://docs.unity3d.com/6000.0/Documentation/ScriptReference/PlayerSettings.iOS-deferSystemGesturesMode.html
Docker Desktop for Macが危ないアプリ扱いされて使えないのでRancher Desktopへ移行

# 環境
* MacBook Pro 2022 M2

# いきさつ
* いつものようにMacを開いたら以下のウィンドウが表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618505/27b13570-7577-b723-f4fe-bbc4c182eca7.png)
* ゴミ箱に一旦入れて戻してみるも戻すたびに上記ダイアログが表示されてdockerが起動できない
* Docker Desktopを勝手にアップデートする設定にしていたのだが今日アップデートされたと思われるDockerアプリのタイムスタンプが未来日付になっておりおそらくこれが原因でウイルス扱いされていると思われる
* 再インストールを試したが同様の現象が再発
* これ以上頑張るよりは直すために頑張るよりは以前からRancher Desktopに移行したいと考えていたのでこれを機に移行することにした
* docker-composeすら使用せずdocker単体で良いのならRancher DesktopをインストールしなくてもLimaを単体でインストールしても動作する（Rancher Desktopは内部でLimaを使用している）
    * docker-composeが後から欲しくなったらbrewで別途インストール可能。

## おまけ アプリをゴミ箱送りにしても上記ダイアログが何度も出てくる場合
* ゴミ箱の中身を空にするとアラートが止まった。
* ゴミ箱の中身を見てゴミ箱送りにしなきゃ・・・ってアラート出してる？天然さんかな？(#^ω^)ﾋﾞｷﾋﾞｷ

# 移行してみた所感
* Rancher Desktopの方が起動やビルドに若干時間がかかる
    * Rancherの方が速いというネット記事を見かけたが昔の話っぽい
* とは言え微々たる差であり使い勝手はほぼ変わらない
    * Docker Desktopのライセンス料を払っているなら移行を検討していいと思う
# 手順
## Docker Desktop for Macの削除

1. ApplicationフォルダからDocker.appを削除（今回の場合はMacが勝手に削除済）
1. 関連ファイルの削除
```
rm -rf ~/Library/Containers/com.docker.docker
rm -rf ~/Library/Application\ Support/Docker\ Desktop
rm -rf ~/Library/Group\ Containers/group.com.docker
rm -rf ~/Library/Logs/Docker\ Desktop
rm -rf ~/Library/Preferences/com.docker.docker.plist
rm -rf ~/Library/Saved\ Application\ State/com.electron.docker-frontend.savedState
```
* 別に残しておいても支障ないが戻るつもりがないなら消してストレージ容量を確保

## Rancher Desktopのインストール
1. brewからインストール
    ```
    brew install --cask rancher
    ```
1. dockerのパスを確認
    ```
    which docker
    ```
	* これで`【ルートディレクトリ】/.docker`が含まれるパスが表示されていたらdockerコマンドのシンボリックリンクがdocker desktopのパスのままになっているので以下コマンドでRancher Desktopへ向けてシンボリックリンクを貼りなおす
    	```
    	ln -sf ~/.rd/bin/docker /opt/homebrew/bin/docker
    	```
     * Apple siliconマシンの場合。intelマシンの場合はパスが違うらしいので注意
1. mysqlコンテナを開けるようにする
	* そのままだとmysqlコンテナを立ち上げようとするとpermission deniedが発生しコンテナが立ち上がらなくなる
		* mysqlディレクトリ全体を777許可してもpermission deniedになる
	* 解消するために以下作業を行う必要がある
    	1. `~/Library/Application\ Support/rancher-desktop/lima/_config/override.yaml`を作成し、以下内容を保存
        	* 参考にさせていただきました：https://qiita.com/kino15/items/8b3ae44fb3115cb670da
            	```
            	mountType: 9p
            	mounts:
            	- location: "~"
            		9p:
            		securityModel: mapped-xattr
            		cache: "mmap"
            	```
1. Rancher Desktopをコマンドのみで開けるようにする
    * 完全に好みの問題なので起動する度毎回ウィンドウを閉じるのが苦痛じゃなければこの作業は不要
    1. Rancher DesktopのウィンドウからPreferencesを選択
	1. ApplicationペインのBehaviorタブにあるStart in the backgroundにチェックを入れる
    	![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618505/70a3ef44-4222-3c30-02c5-b7ce0e9425d3.png)

	1. 右下のApplyを押下して保存
	1. MacツールバーのRancher Desktopのアイコンを右クリックしてQuit Rancher Desktopを押下し一旦閉じる
		* アイコンが消えるまでしばらく待つ
    1. Rancher Desktopの起動
        ```
        open -g -a "Rancher Desktop"
        ```
        * これでRancher Desktopのウィンドウが出てこずにツールバーのアイコンだけ出てきたら成功
    1. dockerおよびdocker composeの起動確認
        ```
        docker info
        docker-compose --version
        ```
【勉強記録】Qiita毎日投稿してから3カ月がたちました

# はじめに
こんにちは！アメリカに住みながら独学でソフトウェアエンジニアを目指しているものです。
今回は10/6からQiitaを毎日投稿して3か月たったので、振り返りを兼ねて記事にしていきます


# 目標の3カ月続いた
まさか10月6日から思い切って毎日投稿を始めて、3か月も継続できるとは自分でも驚きです！
途中、2回ほどトラブルで数分日付を過ぎてしまったことはありましたが、本質的には毎日投稿を続けられたと思います。まずは自分を褒めたいです。
3か月投稿を続けてみて、いくつか気づきがありました。

* 自分の記事を見返すようになった
人間は忘れる生き物です。私も毎日勉強していますが、やはり忘れてしまうことはしばしばあります。
Qiitaに投稿した記事は検索機能を使って復習できるので、過去の学びを見直すことが増えました。自分の言葉で書いているので理解も早く、長期的に見れば大正解だったと思います。

* 自分の記事を見てくれる人が増えた
記事の内容はさておき、X（旧Twitter）の影響もあって、少しずつ読んでくださる方が増えた気がします。コメントでフィードバックをいただくこともあり、新しい学びの機会が広がっています。

* 独学で勉強継続している人が意外と少ない？
QiitaやXを始めたきっかけのひとつは、独学で勉強を続けている方と交流できたらと思ったからです。しかし、意外にも独学でコツコツ頑張っている方にはまだ出会えていません（プログラミングスクールの方はよく見かけますが）。
もう少し継続していれば、きっと同じような方に出会えると信じています！もちろん、見つけたからといって特別なことをするわけではありませんが、共感や刺激をもらえると嬉しいですね。

* 記事ネタをストックしておく
これは自分でも良いアイデアだと思っていますが、勉強中に「この記事にできそう」と思った内容はすぐにNotionのToDoリストに追加しています。
これにより、毎回何を投稿するか悩む必要がなくなり、無理なく投稿を続けることができています。

* 勉強する分野を分散する
これは勉強効率にも関連するポイントですが、1日に同じ科目ばかりをやらないように心がけています。
アメリカの大学に通う前や通っていた頃は、あまり意識せず同じ分野を長時間やり続けていました。
今になって、効率やアウトプットの観点であまり良くないことに気づき、分野を分散させるようにしています。

# 今後の目標
今後の目標としては、就職するまでは毎日投稿を継続したいと考えています。就職後は投稿頻度を少し落とす予定ですが、継続的に記事を投稿していきたいです。
現場でのインプット量が増える分、必要な情報を適切にアウトプットしながら学びを深めていきたいと思っています。

# まとめ
Qiitaでの毎日投稿を通じて、自分自身の成長を実感するとともに、多くの気づきを得ることができました。
この習慣をさらに続けていくことで、目標であるソフトウェアエンジニアへの道を着実に歩んでいきたいと思います。
circuitjsの作法 その21

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
論理回路で、自己保持回路を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3d86acf3-6235-423a-6874-d3d756f3c572.png)


# ネットリスト

```
$ 1 0.000005 1.500424758475255 50 5 50 5e-11
M 448 240 496 240 0 2.5
L 96 176 48 176 0 0 false 5 0
L 96 304 48 304 0 0 false 5 0
150 320 240 448 240 0 2 0 5
152 272 112 432 112 0 2 0 5
I 96 304 208 304 0 0.5 5
w 208 304 256 304 0
w 256 304 256 256 0
w 256 256 320 256 0
w 432 112 320 224 0
w 272 128 448 240 0
w 272 96 160 96 0
w 160 96 160 176 0
w 96 176 160 176 0

```

以上。
単方向データリンク層プロトコル

# ただ送るだけ
>最初の例として、何かまずいことが起きる可能性を心配する必要がないので、できるだけ簡単なものを考えるよう。`データは一方向のみに伝送`される。`送信側及び受信側のネットワーク層はいつでも準備が整っている`。`処理時間は無視`できる。`無限のバッファ領域が利用可能`である。そして、中でも`データ・リンク層の間の通信チャネルは決してフレームを壊したり、失ったりしない`。この完全に非現実的な「ユートピア」とあだ名を付けたプロトコルは、単位これから作るものの基本的な構造を示すためだけのものである。

>プロトコルは送信者と受信者という二つの別々の手続きから構成されている。送信者は送信元マシンのデータ・リンク層で動作し、受信者は宛先のマシンのデータ・リンク層で動作する。順序番号や確認通知は用いないので、MAX_SEQは不要である。`イベントのタイプとして可能なのはframe_arrival(すなわち損傷を受けていないフレームの到着）`だけである。

>送信者は、`データをできるだけ早く回線に送り出すだけの無限whileループの状態`にある。ループの本体は、（常に親切な）`ネットワーク層からパケットをとってくる`事、`変数sを用いて出力フレームを作成`すること、そして`フレームを送り出す`ことの三つの手続きで構成されている。このプロトコルでは`フレームのinfoフィールドだけが使用`される。というのは、他のフィールドは誤り制御、フロー制御に関係しているが、ここでは誤りやフロー制御の制約は存在していないからである。

### infoフィールドとは
>データフレームのinfoフィールドは単一のパケットを格納している。
...
繰り返し何なるが、パケットとフレームの関係を理解することが重要である。ネットワーク層はトランスポート層からメッセージを受け取り、ネットワーク層ヘッダーを付加してパケットを構築する。このパケットがデータ・リンク層に渡され、出力フレームのinfoフィールドに入れられる。
p２０７

## 逐次確認
### フレームが溢れるのを防ぐことを試みる
>送信者が`受信者が処理できるより早くフレームで溢れさせるのを防ぐ`問題に挑戦しよう。このような状況は現実で容易に起こるので、それを`防ぐことは非常に有用`である。ただし、通信チャネルにはまだ誤りがないものとし、データ・トラフィックはまだ単方向である。

### 一般的な解決策　　受信者が送信者に送信許可を伝えるフィードバックを返す
>受信者が送信者にフィードバックを返すようにすることである。パケットをネットワーク層に渡した後に、`受信者は小さなダミー・フレームを送信者に送り返し、送信者に次のフレームを送信して良いという許可を与える`。１フレーム送った後、`送信者は小さなダミー（すなわち確認通知）フレームが届くまで、暇つぶしをしなければならない`。この遅延は、フロー制御プロトコルの簡単な例である。

>送信者がフレームを一つ送ると、先に進む前に確認通知を待つプロトコルを逐次確認(stop-and-wait)と呼ぶ。

## 誤り訂正の追加
### 受信したフレームが誤っているとそれに関わるプロトコルに悪い影響を及ぼす
>今度は通信チャネルの通常の状況である。誤りがある場合について考えてみよう。フレームは損傷を受けたり完全い失われたりする。しかし、フレームが伝送中に損傷を受けても、受信側のハードウェアがチャックサムを計算する際に、これを検出するものと仮定しよう。もしーありそうにないことであるがーフレームが損傷を受けているにも関わらずチェックサムが正しくなっていると、`このプロトコル（そして他のすべてのプロコトル）は誤りを起こす（すなわち、正しくないパケットをネットワーク層に届ける）`

### 同じフレームかどうかを判別するための順序番号
>受信者が初めて見るフレームと再送とを区別できるようにする手段である。これを実現するための自明な方法は、送信者が送信する各フレームのヘッダーに順序番号を付加することである。

>ヘッダーはプロトコルによって順序番号に1ビット、数ビット、あるいは複数バイトを提供する。重要な点は、プロトコルが正しく動作するのに十分なだけ大きな順序番号を運ぶことができなければならない。

### フレームが届くか傷ついて届くか、届かないかでフレームを送る内容が決まる
>あるフレームを送信してタイマーを起動すると、送信者は何か面白いことが起こるのを待つ。三つの可能性がある。すなわち、`確認通知フレームが損傷なく届く`か、`損傷を受けた確認通知フレームがたどり着くか`、`タイマーが切れる`かのいずれかである。正しい確認通知が到着すると、`送信者はネットワーク層から次のパケットを取り出してバッファに入れ、以前のパケットに上書き`する。`順序番号も進められる`、`損傷を受けたフレームが到着するかタイマー切れになると、バッファも順序番号も変更されず、そのコピーが送信`される。すべての場合において、ついで、`バッファの内容（次のパケットまたは重複のいずれか)が送信`される。
　正しいフレームが受信者に到着すると、順序番号が検査されて重複かどうか調べられる。重複でなければ受理されてネットワーク層に渡され、確認通知が生成される。重複したフレームや損傷を受けたフレームはネットワーク層に渡されないが、最後に正しく受信したフレームの確認通知を引き起こし、送信者に次のフレームに進むか損傷したフレームの再送を促す。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
Excelシート一覧の作成機能

空のシートで使うのを推奨
```
' シート一覧を取得
' GetWorkbookAllSheets Macro
' Keyboard Shortcut: Ctrl+Shift+W
Sub GetWorkbookAllSheets()
    Dim ws As Worksheet
    Dim newSheet As Worksheet
    Dim i As Integer
    
    ' アクティブシートを取得
    Dim activeIndex As Integer
    activeIndex = ActiveSheet.Index
    
    ' 新しいシートをアクティブシートの右に挿入
    Set newSheet = ActiveWorkbook.Sheets.Add(After:=ActiveWorkbook.Sheets(activeIndex))
    newSheet.Name = "シート一覧"
    
    ' シート一覧を書き出し
    With newSheet
        ' 初期化
        .Cells.Clear
        ' ヘッダーを書く
        .Cells(1, 1).Value = "シート名"
        i = 2 ' データの開始行
        ' 各シート名を取得
        For Each ws In ActiveWorkbook.Sheets
            .Cells(i, 1).Value = ws.Name
            i = i + 1
        Next ws
    End With
End Sub
```
色々考えた結果休学する（まだしていない）

## 現在の立ち位置
大学3年2月に就活を始めて11ヶ月経過
エンジニア就活のために休学を検討（絶対する）
TOEIC:780点
IT未経験
・ProgateのJavaが完了済
・基本情報技術者の試験対策2ヶ月目（スローペース）
・「Web技術の基本」理解度80％
・ポートフォリオ作成、エンジニア就活、最低限のマインドセットはインプット済み
・作りたいモノのイメージ◎
## 休学の背景
### エンジニアへの興味
就活を始めた当初からエンジニアへのぼんやりとした憧れがあった。実力主義で、語学習得が必然的な環境はカッコいい。「将来は収入の柱を3つは持ちたいな」「自分で事業を作りたいな」なんて考えたり。小学生の頃から自分はエンジニアになるだろうと考えていたような気もする。技術の授業で見た友達の爆速タイピング、綺麗なスライドでなぜか悔しいと感じたのは今でも覚えている。
また、Xでフォローする人や保存するポストはいつもエンジニアや生成AI関連であることに気づいた。何言っているか分からないが、とりあえず保存して後で見返したり。

でも、何もしてこなかった。チャンスなんていくらでもあったはず。要は、探究心が無いのだと思う。自身の根源的な性格なのか、はたまた親の知育教育なのか…。

確かに、高校3年間はサッカー部、大学2年間は予備校の受験指導で頭がいっぱいだった。"その時その瞬間"に最大限集中できたのは非常にいい経験だったが、いざ終わってみれば何もない。正直、燃え尽きていた。矢印の先をどこに向ければいいのか分からなくなった。その状態で就活を始めたもんだから、どうも本気になれない。自分に嘘をつきながら進めている気がしてならない。時期的にもエンジニア就活は到底間に合わない。
### 休学を決意
24時間365日技術について思考を巡らせるには？→「休学」
正直これでもかなり遅い。だからこそ、1日でも早く決意する必要があった。1年前にこの考え方であればよかったとは思うが、そんなこと言っている暇はない。気づくまで時間がかかったのは、少し意味が異なるが「堪忍袋の尾が切れた」の表現がイメージしやすいかなと。死ぬ間際に、この選択をしてよかったと思えますよーに。
## 今後について
ポートフォリオ作成が第一の目標。基本情報・応用情報の取得は2ヶ月が目標。Webサービスは、まずアウトプット用のブログサイト構築を考えている。技術の証明から自身のことについて視覚的に理解してもらえる、1つのまとまった受け皿を用意すべきだと考えた。

その後だが、ポートフォリオとして1つのWebサービス案がある。
今月末、以前半年ほど働いて少しお休みしてたアルバイトに復帰する。店長は毎月1人で手動のシフト管理をしている。LINEで希望日時を聞き、エクセル上で公平性を考慮してシフトを組み、必要であればリマインドする。勤怠管理のシステムは導入されているが、シフト管理は導入されておらず。お客さんが少ない時間に作業していることが多いが、未統一のフォーマットで送信される希望日時を一つひとつ確認してエクセルに打ち込み、返信し、リマインドするのは単純に面倒臭い。

「完全自動のシフト管理アプリ」これを作りたい。店長が一人ひとりにLINEを送信する必要はなく、スタッフがWebアプリ上で希望日時を選択すればいい。集計した順に自動でシフトを公平に振り分け、提出締め切りの⚪︎日前に自動でリマインドする（優先度低い）。招待リンクを送信すればスタッフの一括登録が可能。バックヤードのPCでは、店長が管理者権限でスタッフ管理やシフトの微調整、印刷を行う。

どんないいことがあるのか。大幅な時間短縮は言うまでもない。店長には夫と子供がいて、家族の時間を減らしたくないはず。もう1つ重要なのは、"LINEを使用しない"ことかなと。LINEはなるべく家族や友人と利用したい。20人ほどいるスタッフと毎月やり取りするのは大変。トーク画面のほとんどを業務LINEで埋め尽くすのは嫌でしょう。
スタッフはコミュニケーションを介さずシフトを登録できる。URLからログインして希望日時を入力するだけ。

他にも色々考えることはあるが、無駄にならない程度で収めることも大事かなと。あくまで1つの案だが、プログラミングやWebアプリケーション開発の基礎知識を学びながら課題を吸い取り、要件定義、設計する。小さい機能から構築し、実際に使用してもらいながら改善して本番稼働させる過程を経験するのが理想ではある。
だから、"ポートフォリオで作成したくて〜"とは言わない。目的はお客さんの課題解決であり、実績のためではないから。

今日、とあるメガベンチャーのリクルーター面接で2次選考の辞退を申し出た。27卒でエンジニア職に挑戦し、貴社のインターンや本選考に応募すると伝えたところ、面接後すぐに案内メールが来た。はやっ。いつでもかかって来なさいと言わんばかりに。
ExcelでSharePointサイト内のファイルのサイズ一覧を出す

容量が管理されていて容易に拡張できないと嘆いている方向けに
どのフォルダやファイルが逼迫させているかExcelで一覧ですぐに出せるよ～という記事です
※Power Queryを使うため、Power BIでもできます

## ExcelのPower Query機能で確認が可能　

Excelを新規で開き、
「データ」タブ＞「データの取得」＞「ファイルから」＞「SharePointフォルダーから」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/cd851ada-b4d9-4a19-9d2a-e76aa4148d2a.png)

対象のSharePointのURLを設定
※接続の画面がでてきたら利用するEntra ID等で認証しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/92643a19-33ae-a94b-1260-05c2bfabc5f2.png)

## Power Queryでファイルサイズを出力する

プレビュー画面が出てきたら、「データの変換」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/b894956c-6077-43ce-2bc0-4a21a17d185a.png)

サイト内に格納されているファイル一覧が出てきます。これだけでも便利。
ファイルサイズ（バイト数）を出すため、右のほうにある「Attributes」列横の展開マークを押し、「Size」にチェックを入れて展開します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/6fc2141e-0ba7-22c1-db94-936f0c21a783.png)

「Size」列がバリアントとなっているので10進数に変えましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/492ba8d4-546a-00d0-53d2-02658f31c590.png)

必要に応じて降順に並べ替えて、閉じて読み込めばExcelに一覧が出てきます。出来上がり！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/836c5ed0-a2c1-d032-bd1d-26b5d53f444d.png)

## ちょい工夫

Size列を条件付き書式のデータバーで見せてあげると、一目で逼迫させてるファイルを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/d1e0ba3e-0a48-c774-799b-f07709472738.png)

Folder Pathごとにピボットでサイズの合計値を出せば
末端のフォルダ内でどれだけ容量を圧迫しているか見ることも可能です。
※親フォルダごとの容量を見たい場合はやり方工夫する必要があるので注意です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/b2c11d05-d38b-2f09-b0e7-969fa07355a0.png)

バイト数じゃなくてメガバイトやギガバイトで見たい場合は、Power Queryで計算して工夫してみるといいかも。

https://mathwords.net/kbmb
Win11 - 24H2 適用後の「OneDrive for Business」アプリケーションクラッシュ回避

## イベントビューワー「アプリケーションクラッシュ」
「WSUS」の廃止表明を受け、IntuneでのWindowsUpdate配信を試し始めたところ、数台のPCに24H2が適用され、利用者からOneDriveが起動できないとの連絡が続出。
　イベントビューワーを確認したところ、起動できずに「アプリケーションクラッシュ」になっている様子。

 MSの質問サイトで寄せられていた内容 ( https://answers.microsoft.com/ja-jp/msoffice/forum/all/onedrive-for-business/49429271-ae65-4ccf-a91e-159ce803f143 ) を試しても改善せず、手を焼くことに。

 ### 「互換性」で解決
 初心に帰って、プロパティーからトラブルシューティングを試そうとしたときに視界に入った「互換性」を試したところ、起動を確認。
　GPOでレジストリの更新を配信することで事なきを得ました。
　　HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers　

### 原因は？
不明ですし、MSに見解を出してほしいところですが、%localprofile%\appdata\microsoft\onedriveから、ProgramFilesにインストール先が変更になったのが原因、とか？
　同機種60数台中1台だけ、24H2になっても挙動できた機種もあったので意味不明。。。
PostgreSQLのチューニングに関して

PostgreSQLのチューニングに関して


SQLのチューニングが必要になる場合の原因としては
OracleからPostgreSQLに乗り換えた際の
処理時間の増加によるものが主となります。

Oracleでは1分未満でもPostgreSQLに乗り換えた場合に
数時間が経過しても処理が終わらないという場合があります。

まずは何が原因でそのような
膨大な時間が経過してしまうようになっているのかを
見極める必要があります。

EXPLAINコマンドを用いて
実行結果に統計情報を付加していきます。

※統計情報に対してどのような情報を表示させるかというのを
オプションで追加することができるが、
それは割愛。

```SQL
	EXPLAIN * FROM hoge;

```

これに対して
そのSQLの結果として
cost、row、width、filterといった情報が
表示されます。

cost:　 cost=0.00..10.00 といった表示がされ、この場合はコストが0から10ということを表している。
	コストが小さいと全体として実行に手間がかかっていないsqlということになり、
	逆にコストが大きいと直すべき箇所があるかも？と考える指標になる。

row：   処理行数の表示
width:  上記rowにおける各行のバイト数を表示
filter: SQLにおいて指定した条件を表示
        name='田中'などの条件を指定した場合それが表示される。



このcostが大きいSQLから順に改修を検討していく

お手軽な対処法としては以下の二つがあげられる
1.INDEXの活用
2.条件の見直し

1.INDEXの活用

　処理行数の多さによる部分はあるが、
　事前に条件に用いられている項目でINDEXを貼る
　↓
　その後実行結果に差異が出るかを確認する

2.条件の見直し

　例えばJOIN句の条件を見直すことができる

　外部結合の後に内部結合を実施すると
　外部結合でデータ量が増えたものを内部結合で圧縮する形になるため
　読むデータが増えてしまっている。
　内部結合から実施することで、結合の際に見るデータが減るため
　効率の向上を図ることができる

　またWHERE句でA.1 = B.1のようにするなら、
　結合の条件の際にその条件を記載することで、
　後続の結合等にデータを引き渡す際の件数削減を図ることができる。

　JOIN句の条件を見直す
　外部結合のON句に条件を指定した場合、
　外部結合先がないデータに対しての各行はNULLが入ってしまう
　そのため列数が増加した状態になっている。
　※ON句で絞り込むか、WHERE句で絞り込むかは
　結合後データのNULLを許容しているのか否かによる部分があるため、
　すべての事象において条件をWHERE句に配置するべきとは言えない
　
　また大規模なSQLを実施する際は
　INDEXだけではなく、コミット件数を幅広く取ってあげ、
　トランザクション等を用いることで処理効率の向上を図ることができる。




　またSQL上というよりはPostgreSQLの仕様の話ではあるが、
　削除等を行ったデータは内部的に削除フラグが立っているだけで
　データとしては残っているという場合があるため、
　VACUME等でディスク側のパフォーマンス向上を図るのも一つの手段ではないだろうか
■ 5-2.ブラックボックステスト技法：”境界値分析”について

# <font color="#00bfff">■ 境界値分析とは？</font>

ブラックボックステストで使用されるテスト設計技法の一つで、

入力値や出力値の境界付近に着目してテストケースを設計する方法です
エラーは境界付近で発生しやすいという経験則に基づき、
効率的に不具合を発見することを目的とします

<INS>多くの不具合は境界付近で発生することが多い為、この技法を用いることで効率的にバグを検出できます</INS>
<br>
# ・<font color="#00bfff">特徴</font>
　-> <font color="#66cdaa">境界付近に特化</font>：
最小値／最大値とその前後をテストし、エラーを効率的に検出します
<br>  
　-> <font color="#66cdaa">範囲制約に有効</font>：
入力や出力が特定の範囲に制限される場面で効果的です
<br>  
　-> <font color="#66cdaa">少ないテストケースで網羅</font>：
境界を重点的にテストすることで、広範囲を効率よくカバーできます
<br>  
　-> <font color="#66cdaa">正常系と異常系を網羅</font>：
境界の内側（正常）と外側（異常）の両方がテスト可能です
<br>  
　-> <font color="#66cdaa">同値分割法と相性が良い</font>：
他の技法と組み合わせることで、テスト精度が向上します
<br>
# ・<font color="#00bfff">テスト対象</font>

<font color="#66cdaa">入力の範囲</font>: 
　-> 最小値、最大値
　-> 境界の1つ手前と1つ後の値
　
<font color="#66cdaa">出力の範囲</font>：
　-> 結果として得られる値の境界をテスト
<br>
# ・<font color="#00bfff">テストケース設計のポイント</font>
境界値分析では、境界値そのものと境界値に近い値をテスト対象とします

■ <font color="#FF99FF">テスト対象となる値</font>
<font color="#66cdaa">下限値とその周辺</font>：

・最小値（境界値）
・最小値より1小さい値（境界未満）
・最小値+1（境界内）

<font color="#66cdaa">上限値とその周辺</font>：

・最大値（境界値）
・最大値より1大きい値（境界超過）
・最大値-1（境界内）
<br>
# <font color="#00bfff">【例】</font>
例えば、パスワードの長さが「8～16文字」の場合であるとした場合

■ <font color="#66cdaa">正常値</font>：
・8文字（下限）、9文字（下限+1）、15文字（上限-1）、16文字（上限）
<br>
■ <font color="#66cdaa">異常値</font>：
・7文字（境界未満）、17文字（境界超過）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873920/fd3c2616-739b-555c-a413-b85a0734d47a.png)
<br>
# ・<font color="#00bfff">利点／欠点</font></INS>

■ <font color="#FF99FF">利点</font>
・境界付近のエラーを効率的に発見できる
・少ないテストケースで広範囲をカバーできる
・同値分割法と併用することで、テストの精度が向上する
<br>
■ <font color="#FF99FF">欠点</font>
・境界以外の値でのエラーを見逃す可能性がある
・境界値が複数ある複雑なシステムでは、すべてを網羅するのが難しい
# ・<font color="#00bfff">まとめ</font></INS>
<br>
境界値分析は、仕様に基づいて効率的にバグを検出できる強力な技法です

他の技法（同値分割法など）と組み合わせて活用することで、
更に高い網羅性と効率性を実現できます


<br>

<INS><font color="###ff00ff">「■ テスト技法：デシジョンテーブルテスト」へ続く</font></INS>
SwiftUI初学者、起動時のデータ取得処理をViewに依存しないようにがんばる 

## 起動時になんかしたい
非同期処理というと堅苦しいが、Viewに関わることなく処理を行いたい。
画面への反映を急ぐことはない。

## 記事にした動機
起動時になにかしたいと迷うときが度々出現すると思ったので、備忘録に乗せておくことにした。

## ChatGPTにきいてみた
回答はこんな感じ。

:::note info
1: アプリ全体で使う状態やリソースの初期化はAppStateで行う。
2: 特定のビューに依存した初期処理はonAppearを使用する。
3: アプリ全体のセットアップ処理は、@main構造体のinitに記述する。
:::


AppStateでの管理することにした。
アプリの起動時にappStateを環境変数として渡しているので、このタイミングでAppStateのinit処理が呼ばれる
```MyApp.swift
@main
struct MyApp: App {
    @StateObject private variable appState = AppState
    var body: some Scene {
    WindowGroup {
        BrowserAppView()
            .environmentObject(appState)
        }
    }
}
```


次は、初回起動時に呼ばれるAppStateの初期化処理。この中では、２つの変数に値を格納している。今回はブラウザアプリであり、起動時のurlは固定値で渡している。（将来的には、すでに開いていたページを開くもしくは、何もページがないとき、空のウィンドウにブックマーク一覧などが表示されているのが理想的だが・・・）

AppState内に、loadBookmarksメソッドを作成した。
Bookmark().fetchBookmark()の処理でRealmからデータを取得する処理を行うようにしている。
loadBookmarksメソッドの呼び出しは、次のコードに記述している。
```AppState.swift
    init(initialURL: URL = URL(string:"https://game8.jp/kids/minecraft")!) {
        self.currentURL = initialURL
        self.webView = WKWebView()
    }
    
    func loadBookmarks() {
        DispatchQueue.main.async {
            self.bookmarks = Bookmark().fetchBookmark()
        }
    }
}
```
AppStateのloadBookmarksメソッドは、Viewが表示された後のタイミングで開始することにした。AppStateの初期化処理の中に含めても良さそうだったんだけど・・・起動直後に処理を呼び出すと、負荷がかかる想定なので、ややずらすためというのが理由だ。
```BrowserAppView.swift
    var body: some View {
        VStack(spacing: 0){
            WebView(action: $webViewAction, isFooterVisible: $isFooterVisible)
            if isFooterVisible {
                TabView(webViewAction: $webViewAction)
                    .transition(.move(edge: .bottom))
            }
        }
        .onAppear{
            appState.loadBookmarks()
        }
        .animation(Animation.easeInOut, value: isFooterVisible)
    }
}
```

この処理の流れ、忘れそう。
視覚的にいい感じにまとめられたらいいのにな。
psコマンド出力フォーマットメモ

```
$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
:
$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
:
$ ps -eF
UID          PID    PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
:
$ ps -eo "出力フォーマット"
"出力フォーマット"
:
$ ps -eO "追加出力フォーマット"
PID "追加出力フォーマット" S TTY          TIME COMMAND
:
```

プロセス優先度等、プロセススケジュールを確認する必要がある場合は次のエイリアスを`.bashrc`に設定しておくと便利かもしれません。

```
alias PS='ps -eo uname,pid,%cpu,%mem,state,psr,policy,rtprio,nice,cmd'
alias PS_THREAD='ps -eLo uname,pid,tid,%cpu,%mem,state,psr,policy,rtprio,nice,comm'
```
TerraformとDockerでNginxを構築してみた

# TerraformとDockerでNginxを構築してみた
### TerraformとDockerでNginx構築に挑戦
TerraformとDockerを使ってNginxを構築しました。作業時間は約15分と手軽です。
今回は、その流れを簡潔にまとめます。この内容は「入門Terraform クラウド時代のインフラ統合管理（impress top gear）」という書籍を参考にしています。ただし、本書に記載されているコマンドがLinux環境向けであったため、Windows環境向けに一部変更しました。

※この記事では、TerraformおよびDockerの準備手順については省略しています。

### 構築手順
NginxコンテナをTerraformでデプロイ
まず、<font color="rgb(107, 142, 35)">**main.tf**</font>を作成してTerraformの設定を書きます。
```
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = ">= 3.0.0"
    }
  }
}

provider "docker" {
  host = "tcp://localhost:2375" # Windows環境でのDocker接続設定
}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = true
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "beginner"

  ports {
    internal = 80
    external = 8000
  }
}
```

### Windows環境での設定変更
「入門Terraform」ではLinux環境のコマンドが使用されていましたが、Windows環境で実行する際には以下の点を変更しました。

#### 接続方法
provider "docker"セクションのhost設定をWindows用に調整します。
　Windows環境
host = <font color="#1e90ff">**"tcp://localhost:2375"**</font>

　または、Named Pipeを使用する場合:
host =  <font color="#1e90ff">**"npipe:////./pipe/docker_engine"**</font>
#### Docker Desktopの設定
Windows環境でhost = <font color="#1e90ff">**"tcp://localhost:2375"**</font>を使用するには、Docker Desktopで以下の設定を有効にする必要があります。
##### Docker Desktop
Settings → General → Expose daemon on tcp://localhost:2375 without TLS を有効化
これにより、TerraformがDockerデーモンに接続できるようになります。

### 作成の流れ
そのあとはCLIにて以下のコマンドを順番に実行します
<font color="rgb(107, 142, 35)">**$ terraform init**</font>
<font color="rgb(107, 142, 35)">**$ terraform plan**</font>
<font color="rgb(107, 142, 35)">**$ terraform apply**</font>

作成後、tutorialコンテナが動作しており、ポート8000で待ち受けています。<font color="#1e90ff">**docker ps**</font>で動作中のコンテナを確認可能です。

![スクリーンショット 2025-01-08 144037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332715/65386399-6065-db70-1d06-d4c289bbb752.png)

### 学び
Terraformのシンプルさを実感しました。

### 次の挑戦
上記の本を参考にしながら、Windows環境向けにカスタマイズしてNginxコンテナを構築しました。
本書ではより詳しくコードごとの解説もあります。
記事では簡潔に説明しましたが、さらに複雑な構成にも挑戦していきたいと思います。
次回は、AWSにてEC2を作成する簡単なコードを紹介予定です。

この記事を読んでいただきありがとうございました。
VLOOKUP関数

=VLOOKUP(要找的,数据范围,在第几列,是否精确)
第一个参数：你根据什么去找数据
第二个参数：告诉我数据在哪里，框出来给我看
第三个参数：告诉我刚刚框的数据范围里，被查找的数据在第几列
第四个参数：找完全一样的，还是找差不多的
注意点：
①查找条件所在的列，作为查找范围的第一列。
②范围：选中后按F4进行绝对引用，防止误修改。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/d15802e6-862d-e96d-b4db-79ccb9ed0bd1.png)

详细解说。
第一个参数：你根据什么去找数据
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/1e5e18b6-9c54-6899-708d-d4ad39ba677f.png)
第二个参数：告诉我数据在哪里，框出来给我看
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/aa497ee3-3843-545d-1228-5184ddd60b1b.png)

第三个参数：告诉我刚刚框的数据范围里，被查找的数据在第几列
注意点：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/7a6c9f50-ced5-ab57-56b7-12ee1355734a.png)

第四个参数：找完全一样的，还是找差不多的
true：模糊查找
false：精确查找
簡単AWS　S3（Amazon Simple Storage Service）

S3（Amazon Simple Storage Service）は、AWSが提供する「クラウド上の倉庫」のようなサービスです。日常生活や仕事の中で、「データを保存したいけど、ハードディスクの容量が足りない」「大事なデータが消えてしまったらどうしよう」といった心配を解決してくれる便利なストレージサービスです。

簡単に言うとこんなサービスです：
1.ネット上の巨大なハードディスク：データを保存する場所を提供します。
2.容量が無制限：写真でも動画でも、どれだけのデータを保存してもOK。
3.どこからでもアクセスできる：インターネットさえあれば、自分のデータに世界中どこからでもアクセス可能。
4.安全性抜群：大事なデータを複数の場所で自動的にバックアップしてくれるため、紛失するリスクが少ない。
身近な例で説明すると：
1.写真や動画の保存 旅行やイベントで大量の写真や動画を撮影したけど、スマホやパソコンの容量がいっぱい。そんなとき、S3を使えばこれらのデータをクラウド上に保存して、いつでも見返したり共有したりできます。

2.ウェブサイトの管理 自分のブログやウェブサイトを運営している場合、画像や資料を訪問者にダウンロードさせたいことがあります。S3を利用すると、こうしたファイルを簡単に保存・配信できて、ユーザーも快適にアクセスできます。

3.バックアップ パソコンが壊れる、スマホを無くす、こうした万が一の事態に備えて、データをバックアップする用途にも使えます。

S3の特徴：
1.バケット（Buckets）
S3では「バケット」と呼ばれるフォルダのような単位でデータを管理します。プロジェクトや用途ごとに分けられるので、とても整理しやすいです。

2.データの堅牢性（99.999999999%の耐久性）
S3はデータを複数のデータセンターに分散保存してくれます。つまり、どれか1つが壊れても他にコピーがあるので安心です。

3.柔軟なプラン選択
頻繁に使うデータ、たまにしか使わないデータ、それぞれに適した料金プランが選べるので、コストも最適化できます。

4.APIによる操作が可能
S3はプログラムと連携することが得意です。自動化や、大量データの取り扱いも効率よく進められます。

S3を使うシーン：
1.ウェブサイト運営者：画像や動画を高速で配信。
2.写真愛好家：膨大な画像データを安全に保存。
3.企業や組織：重要書類やシステムログのバックアップ。
4.研究や分析：大規模データの一時保存や共有。

簡単にまとめると：
S3は、たくさんのデータを安全に保存して、必要なときに素早く取り出せる「クラウドの倉庫」のような存在です。ストレージ不足の悩みを解決し、データを守ってくれる、信頼できるサービスです！
Javaで1e9のような書き方

$10^9$のような整数の定数を書くとき、`1000000000`では0が何個あるかすぐに分からないです。
そこで、`1000*1000*1000`のように式を書けば、コンパイル時に計算結果の定数となります。

そんな時に

# 1e9という定数

とあるc++のソースで、`int m=1e9;`と書いてあり、指数表現の定数なのでしょうが、そういえばJavaでも書けたかなということで、久々に言語仕様を探してみた。

[3.10.2 Floating-Point Literals](https://docs.oracle.com/javase/specs/jls/se6/html/lexical.html#3.10.2)

結論を言えば、`1e9`と書けますが、double型です。`1e9d`も同様です。`1e9f`はfloat型になります。
整数型は、10進数、8進数、16進数のパターンしかありません。

そこで、整数のdouble値をint型にダウンキャストすれば、$10^9$の定数に使えそうです。
さらに、long型も$10^{18}$で試してみる。

```java
		{
			int v1 = (int)1e9;
			int v2 = (int)2e9;
			int v3 = Integer.MAX_VALUE;
			System.out.printf("%,d %,d %,d", v1, v2, v3);
			System.out.println();
		}
		{
			long v1 = (long)1e18;
			long v2 = (long)9e18;
			long v3 = Long.MAX_VALUE;
			System.out.printf("%,d %,d %,d", v1, v2, v3);
			System.out.println();
		}

実行結果
1,000,000,000 2,000,000,000 2,147,483,647
1,000,000,000,000,000,000 9,000,000,000,000,000,000 9,223,372,036,854,775,807
```

18個の0を数えるのは大変なので、カンマと付けましたが、意外と便利かもと思いました。
最小値の初期値としてよくMAX_VALUEを使いますが、計算の途中でオーバーフローする可能性[^1]を気にする手間を考えると、$10^9$を2倍しても収まるのでちょうどよい感じの定数です。

## BinaryExponentIndicator: one of p P

せっかくJava言語仕様を開いたので、浮動小数点の定数を見たのですが、最後に謎のpの文字。

標準ライブラリのDoubleクラスにありました。
仮数部と指数部なんて何十年前[^2]に勉強したのでしょうか。

```Double.java
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308
public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
```

ということは、1は`0x1p+0`なのかな。

```java
		{
			double v1 = 0x1p+0;
			double v2 = 0x1p+31;
			double v3 = 0x0.8p+0;
			double v4 = 0x0.1p+0;
			System.out.printf("%f %f %f %f", v1, v2, v3, v4);
			System.out.println();
		}

実行結果
1.000000 2147483648.000000 0.500000 0.062500
```

さすがdouble型です、仮数部が52ビットあるので、int型の範囲なら抜け落ちません。
最初に`0x0.1p+0`を指定して`0.0625`と出てきて、ああ、16進数の小数です。2進数で表現すると`0.0001p+0`みたいな感じ。
ちなみに、`1p+0`とは書けません。こちらは16進数オンリーです。


[^1]: そんなことはないだろうと思った人、二分探索で`int mid=(left+right)/2`でなく、`int mid=left+(right-left)/2`と書いてますかねぇ。
[^2]: 仮数部が何ビットか調べないとすぐに出てこないです。float（1+8+23ビット）、double（1+11+52ビット）。
express + ejs環境でtailwind cssを導入する方法

# はじめに
Web Developer Bootcampを受講しているときに、私は思いました。
「Bootstrapの他のCSSフレームワークはどうやって導入するのかな？」
tailwindを選んだ理由は、単にモダンなCSSだろうという理由で選びました。
# express + ejs環境でtailind cssを導入する方法
## package.jsonの概要
~~~ json
{
  "name": "yelp_camp",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "css": "postcss public/styles/tailwind.css -o public/styles/style.css"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "autoprefixer": "^10.4.20",
    "ejs": "^3.1.10",
    "ejs-mate": "^4.0.0",
    "express": "^4.21.2",
    "method-override": "^3.0.0",
    "mongoose": "^8.9.3",
    "postcss": "^8.4.49",
    "postcss-cli": "^11.0.0"
  },
  "devDependencies": {
    "tailwindcss": "^3.4.17"
  }
}

~~~

## やること
１. 各moduleのインストール
~~~
npm install tailwindcss postcss autoprefixer postcss-cli
~~~
２.  tailwind.config.jsを作る
~~~js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./views/*.ejs', './views/**/*.ejs'],
  theme: {
    extend: {},
  },
  plugins: [
    {
      tailwindcss: {},
      autoprefixer: {},
    },
  ],
};
~~~
３． postcss.config.jsを作る
~~~js
module.exports = {
    plugins: [require('tailwindcss'), require('autoprefixer')],
};

~~~
４． ./public/stylesheets下にtailwind.cssを作る
~~~css
@tailwind base;
@tailwind components;
@tailwind utilities;
~~~
５．package.jsonにスクリプトを追加
~~~json
{
  "name": "yelp_camp",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "css": "postcss public/styles/tailwind.css -o public/styles/style.css"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "autoprefixer": "^10.4.20",
    "ejs": "^3.1.10",
    "ejs-mate": "^4.0.0",
    "express": "^4.21.2",
    "method-override": "^3.0.0",
    "mongoose": "^8.9.3",
    "postcss": "^8.4.49",
    "postcss-cli": "^11.0.0"
  },
  "devDependencies": {
    "tailwindcss": "^3.4.17"
  }
}
~~~
７．CSSファイルをビルド
~~~
npm run css
~~~

８．index.js（app.jsなどメインのjsファイル）で下記を忘れずに
~~~js
app.use('/public', express.static(__dirname + '/public'));
~~~

## 参考
https://tailwindcss.com/docs/installation

https://dev.to/covalhalla/using-tailwindcss-with-express-and-ejs-2hl0

https://qiita.com/Ryo9597/items/8a8e21c51bc2abb49594
モデルスペックはコマンドで作ろう

## Overview
Rspecでモデルスペックを新規作成する際に利用するコマンドを紹介します。


## Motivation/Context
いきなり記事を書こうと思った理由ですが、どこかの誰かのqiita記事で「ニッチなことを書こう」みたいに合ったので、これじゃん！と思って書いてみることにしました。
思い立ったのですぐに行動してみたっていう感じの記事です。

## Get Started!!
```
$ rails g rspec:model user
```
結論、これです。

これでモデルスペックの雛形を作成してくれます。

既存ファイルをコピーしても同じですが、タイポがないので、幾分か楽ですね。
簡単AWS　Lambda

AWS Lambda（ラムダ）はサーバーレスでプログラムのコードを実行できるフルマネージドサービスです。サーバーレスとは、EC2インスタンスなどのサーバーを必要とせずリクエスト発生時にだけプログラムが実行されるアーキテクチャのことです。サーバーレスアーキテクチャでは、インフラストラクチャの管理は完全にAWSによって行われます。

Lambdaを利用すると次のようなメリットがあります。
・プログラム実行環境の構築や運用が不要になる
・プログラムはリージョン内の複数のAZに分散して配置される（耐障害性・可用性の向上）
・プログラムへのリクエスト数に応じたスケーリングが自動的に行われる（拡張性の向上）

開発したプログラムを動作させるためには、通常、実行環境となるサーバーが必要です。サーバー管理は構築・運用ともに負担の大きな作業ですが、Lambdaを利用することにより煩雑な業務を行わなくて済むようになりプログラムの開発に集中できます。

【Lambda関数】
Lambdaで実行されるコードを「Lambda関数」といいます。
Lambda関数は以下のような特徴があります。
・開発言語：Java、Node.js、Pythonなど様々な開発言語に対応
・実行時間：最長15分
・課金方式：リクエスト数に基づく課金と実行時間（単価はメモリ量に依存）に基づく課金の合計
・実行タイミング：特定のイベントがトリガーとして発生したときに実行

ユーザーは、Lambda関数を実行するため
・Lambda関数のコード作成と更新、環境変数設定、IAMロール設定など、アプリケーションに関する設定
・Lambda関数を実行するメモリサイズや最大実行時間の指定など、リソースに関する設定
などを行います。

実行時間が15分以上になる処理や常時稼働が必要なアプリケーションには適していないので、EC2インスタンスやコンテナなどで運用する検討が必要です。

Lambdaを1年以上継続して利用する場合は「Compute Savings Plans」で契約すると、サービスを割引価格で利用できます。Compute Savings Plansは1年または3年の期間、一定のサービス使用量（1時間あたりの利用料金）を決めて契約することで、通常よりも低価格になる購入オプションです。

【Lambda関数のトリガー】
Lambda関数実行の起点となるイベントを「トリガー」といいます。以下はトリガーとして設定できるイベントの一例です。
・Amazon S3バケットにオブジェクトが作成された時
・Amazon DynamoDBのテーブルに変更があった時
・Amazon SQSのキューにメッセージが追加された時
・Amazon SNSからトピックが通知された時
・Amazon API Gateway経由で直接Lambda関数が呼び出された時

例えば、ユーザーからアップロードされた画像ファイルがS3バケットに保存（オブジェクトが作成）された時に、Lambda関数が実行されて画像ファイルの情報をDynamoDBに書き込むといった利用方法があります。

【Lambda関数のアクセス権限】
Lambda関数には実行ログを出力するために、CloudWatch Logsへのアクセス権限が割り当てられています。デフォルトではCloudWatch Logs以外へのアクセス権限はないので、Lambda関数から他のAWSサービスへアクセスさせたい場合はアクセス権限の設定が必要です。Lambda関数のアクセス権限は、他のAWSサービスへのアクセス権限を持つIAMロールによって付与します。その際、Well-Architected Frameworkの「最小権限の原則」に基づき、コード実行に必要な最低限の権限のみ割り当てることが推奨されています。
GitHubでIssueからブランチを作成する手順

# GitHubでIssueからブランチを作成する手順
## 1. リポジトリに移動する
GitHubの対象リポジトリページにアクセスします。
## 2. Issueタブを開く
上部メニューの「Issues」をクリックして、Issue一覧に移動します。
## 3. 対応するIssueを選択
作業対象のIssueをクリックして詳細ページを開きます。
## 4. 「Create a branch」ボタンをクリック
Issueページの右側に「Development」セクションがあります。
「Create a branch for this issue or link a pull request」のリンクをクリックします。
## 5. ブランチ名を確認または編集
自動生成されたブランチ名（例: feat/update-api）を確認します。
必要に応じて修正します（例えば、個人識別子を追加するなど）。
## 6. 「Checkout locally」を選択
次の「What's next?」で「Checkout locally」を選びます（通常、自分のPCで作業する場合）。
## 7. ブランチ作成コマンドを実行
表示されたコマンド（例: git fetch origin と git checkout <branch-name>）をローカルターミナルにコピーして実行します。
ターミナル上でリポジトリのディレクトリに移動してから実行してください。
## 8. ブランチ作成完了
ローカル環境に新しいブランチが作成され、チェックアウトされます。
必要であれば作業を開始してください。