OmniAICreator/Qiita-1.07M huggingface dataset:
🔰何か作ろう！　～次に何をやったらいいか分からない人へ～

## 私の作ったもの（宣伝）
[作成したアプリの概要をまとめた記事](https://qiita.com/ssatoshi_117117/items/ec18bcdd039461afae43)　←結構反響を受けた
[作成した大喜利アプリリンク](https://hello-4m00.onrender.com/)
「ユーザ：test,パス:test」でログインできます
ゲストログインもできます！

## 目次
1. はじめに
1. 結論　←　長いのでここだけでも見て！
1. お勧めポイント
1. おススメな進め方
1. 私の場合にどうやって進めたかを具体的に
1. さいごに

## はじめに
この記事は、progate等でプログラミングの基礎的なことはやったけど、次に何やればいいかわからない人への提案をする内容になっている。
やる気がある内に、勉強になって、意味のあることをしてほしい！という思いで書いている。

## 結論
手を動かして、動くものを作ろう！ハンズオン動画がおススメ！
最初は動画を真似て作成して、次に自分でテーマを決めて作ってみよう！
ぜひ、作成したWEBアプリは公開してみてね！

## お勧めポイント
私が「動画でのハンズオン」をお勧めするのには以下の理由がある

### 動画の利点
1. 躓きにくい
1. 分かりやすい
1. おおよその所要時間がわかる！
1. 無料！！！！！！


ここで、自分が参考にした動画の紹介を貼ります。
[おススメ動画](https://www.youtube.com/watch?v=6sS2Eco1y1U&list=PLKGspLlIkheJuDe3rLDBFetEHy_RX5xwo)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/095d5e65-8023-04f4-7c2c-a40646aa9205.png)


### おススメ動画の利点
1. 単体テストをやっている
1. git操作も学べる
1. エラー解決も動画に含まれる
1. 理論について学べる
1. 質問可能（コメント・Xで質問対応していた）←何なら、私に聞いてくれてもいいです

## おススメな進め方
1. まずは、動画の通りにやる。分からないことは都度調べる（が8割理解でOK）
1. 次に自分でテーマを決めてWEBアプリを作成する。技術自体は、出来るだけ参考動画の真似をする
1. 追加の機能・技術を実装する

初心者ならまずは、動画の通りにやることが大事。動画内の説明で理解しきれなかった場合は、動画を止めて調べる。最近ではchatGPTもあるので、どうにでもなる。
動画の内容で作り終えたら、自分で作りたいものを決めて作成。最初は動画にて学んだ技術で実現可能な機能を作成しいく。
自分で決めたテーマだと「これやりたいな」や「こんな機能もあるといいね」が自然と出てくると思うので、それを実現するべく、手を動かそう。ここで、「思った通りに動かない」やエラーに何度も当たるので、頑張ってください。この経験は、今後生きることは間違いないのでやり切ろう！！


＊どうしても、自作したいテーマがないときは、Xのような「投稿アプリ」をお勧め！

## 私の場合にどうやって進めたかを具体的に
1. まずは、動画の通りにやる。分からないことは都度調べる（が8割理解でOK）
→これは、その題の通り、動画を真似てやった。自分だけがエラーになって取り残されることがないので安心。私の乏しい理解力では？？？となったところは、chatGPTに「わかりやすく！」や「具体例をだして」など何度も質問して理解した

1. 次に自分でテーマを決めてWEBアプリを作成する。技術は参考動画の真似をする
→私は、お笑いが好きだったので、ページ上部にもある「大喜利アプリ」をテーマに設定した。まずは、参考動画で学んだことで実現可能な「ページ表示や、検索、ログイン機能」を作成した。

1. 追加の機能・技術を実装する
→オリジナルアプリをせっかく作るのだから、「これやりたいな」や「こんな機能もあるといいね」が上記をやってるときに湧いてきた。これをここでぶちまける。

- 他の人に触ってもらいたい　→　アプリを公開（Render）
- 投稿アプリ特有の動作　　　→　いいね機能
- 大喜利特有の動作　　　　　→　ランキング機能

そして、上記を作成しているときにもアイデアが
そして、アプリを公開すると、またまたアイデアが
その他アイデアを実装していると、またまたアイデアが・・・
この繰り返しをやっていく。　

### さいごに
やる気と時間はあるけど・・・となっていたときに、自分がやってみたものを例に説明した。
せっかくなら、意味があって今後に活きることをやってもらいたい。
向き不向きはあると思うので、やりながら自分にあう方法を見つけてみてほしい。
【Google Gemini】Geminiで描画してみた


　どうも、カーブミラーです。

　今回は、Geminiで描画してみました。

:::note info
本記事は、Gemini（無料版）
　で行なっております。
　　画像はあります。
　　　あしからず。
:::

　アップが遅れてしまいました。
　　これも太陽フレアのせいです😅

　まずは、ニュース。

　OpenAIは
　　日本時間5月14日（火）午前3時に
　　　「Spring Updates」と題し、
　　　　ChatGPTとGPT-4の
　　　　　アップデートに関する
　　　　　　ライブストリーミングを
　　　　　　　行うと発表。
[OpenAIポスト](https://x.com/OpenAI/status/1788987793613725786?t=XARHl_SRALdp7R9Nd3hVjA&s=03)

　それはそうと
　　ChatGPTの出力後のアイコン、
　　　直りましたね。

　　クリップ位置も
　　　直ってます👍
***
　さて、本題です。

　Geminiも
　　ChatGPT同様、
　　　生成AIです。

　文章生成はもちろん、
　　Googleの各種サービスを
　　　連携して使える、という
　　　　特徴があります。

　先日、アプリ版が
　　公開されました。

　ダウンロードして
　　確認しましたが、
　　　Web版との違いは、
　　　　基本的にありません。

　入力枠が大きい、
　　回答数がひとつだけ、
　　　という二点が気付いたところ
　　　　でしょうか。
***
　そんなGeminiですが、
　　画像生成できるのか？

　できます。が、
　　日本語での指示では
　　　“サポートされていません”と
　　　　出てきます。

　ならば、英語なら？

　やり取りをどうぞ。
***
***user***
猫を描画して

***Gemini***
申し訳ありませんが、画像の作成はまだサポートされていないため、リクエストにお応えすることができません。

***user***
Draw a cat.

***Gemini***
![Screenshot_20240511-143441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/b451a7e1-dd7c-bd88-0b90-5f5b30e4b75c.png)

***user***
Draw a man.

***Gemini***
We are working to improve Gemini’s ability to generate images of people. We expect this feature to return soon and will notify you in release updates when it does.

DeepL翻訳
「ジェミニの人物画像生成機能の改善に取り組んでいます。 近いうちにこの機能が復活することを期待しており、その際にはリリースアップデートでお知らせします。」
***

　人物以外を
　　描きますよ、だそうです。

　こりゃ、
　　みなさんの
　　　作品制作の糧には
　　　　なりそうにありませんね😅

　今回は、ここまで。
基本的なGitコマンド

# Gitの基本コマンドをマスターしよう！

Gitの基本設定が完了したら、次は実際にGitを使ってみましょう。ここでは、Gitでよく使う基本コマンドについて学びます。これらのコマンドを覚えれば、あなたもGitを使ってプロジェクトを管理できるようになりますよ！

## リポジトリの初期化：`git init`

新しいプロジェクトを始めるときは、プロジェクトのフォルダで以下のコマンドを実行して、Gitリポジトリを初期化しましょう。

```bash
git init
```

これでそのフォルダはGitの管理下に入ります。簡単ですね！

## ステージングとコミット：git add と git commit

ファイルをGitに追加するには、まずステージング（準備エリアへの追加）が必要です。以下のコマンドで特定のファイルをステージします。

```bash
git add ファイル名
```

全ての変更をステージしたい場合は、以下のようにします。

```bash
git add .
```
ステージングが終わったら、以下のコマンドで変更をコミット（確定）します。

```bash
git commit -m "コミットメッセージ"
```

「コミットメッセージ」には、行った変更の説明を簡潔に書きます。

## 変更の確認：git status と git log

現在の状態を確認するには git status コマンドを使います。

```bash
git status
```

これで、どのファイルがステージされているか、未追加の変更があるかがわかります。

コミットの履歴を見るには git log を使います。

```bash
git log
```

これで、これまでのコミットの詳細を確認できます。

## 変更の公開：git push

ローカルの変更をリモートリポジトリ（例えばGitHubにあるリポジトリ）に送るには git push コマンドを使います。

```bash
git push origin ブランチ名
```

ここで「ブランチ名」は通常 master や main などのメインブランチが使われますが、作業中のブランチ名が入る場合もあります。
Apple Silicon（M1）Mac に Windows10 仮想環境を作る

```kotlin:ターゲット
if (price == FREE && myProcessor == ARM) {
    when (VM) {
        Windows11 -> Success
        Windows10 -> Failed
```
ARMプロセッサの Mac に 今更ながら `Windows10` 環境を構築したい、無償で、でも `Windows11` ならうまくいくのに `Windows10` はエラーになって進めない...っていう方の手助けになればと思いメモとして残します。


# 環境
MacBook Pro M1（Sonoma）

# [UTM](https://mac.getutm.app/) のインストール
`homebrew` を利用
```terminal
brew install --cask utm
```

# ゲストツールのダウンロード
下記の公式ページの Download からゲストツールをダウンロード。

:::note info
必須ではないですが環境構築完了後に利用します。
:::

https://docs.getutm.app/guest-support/windows/

# Windows イメージ作成用ファイルのダウンロード
[UUP dump](https://uupdump.net/) からダウンロード
最新のベータチャンネル > arm64 に Windows11 用のファイルはあります。

:::note warn
Windows10 用は手順途中でエラーとなるものしかないです...
:::

![スクリーンショット 2024-05-11 11.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449806/ca94868e-ec8d-5b75-c944-057a724ba3f3.png)



# Windows10 用イメージ作成ファイルのダウンロード
上記で使える Windows10 ARM版ディスクイメージが見つからないので下記からダウンロードしました。
関係のないDiscussionsですが以前配布されていたであろうファイルがシェアされていたので利用しています。

:::note warn
有害なファイルの可能性もあるので **自己判断で** ご利用ください
:::

https://github.com/WhatTheBlock/WindowsSimplify/discussions/64#discussioncomment-5586168

rarファイルなので `unrar` 等で解凍。

# イメージ作成スクリプトの実行
```terminal
cd (解凍後のさっきのフォルダ)
```

### ユーティリティのインストール
:::note warn
標準のユーティリティではダメだという issue が出てるので下記に従って修正された別の chntpw を使います
:::

https://github.com/sidneys/homebrew-homebrew/issues/2
```terminal
brew tap minacle/chntpw
brew install aria2 cabextract wimlib cdrtools minacle/chntpw/chntpw
```

### スクリプト実行
```terminal
bash uup_download_macos.sh
```
同フォルダに ISOファイルが生成されます。

# UTM で仮想環境の作成
基本的には [公式マニュアル](https://docs.getutm.app/guides/windows/) やその他の記事を参照し、上記で生成した ISOファイルを指定して進めます。

# エミュレータの変更
ここが躓いたポイントですが、Windows10 環境を作りたい場合は、デフォルトのエミュレータから変更する必要があるようです。

UTM のサイドバーから上記で初期設定した Windows10 環境を選択 > 編集 > システム >
システムで `QEMU 6.0 ARM Virtual Machine (virt-6.0)` を選択
（他のバージョンでもいけるかもですが一旦 `6.0` で成功したので利用しました）

![スクリーンショット 2024-05-11 12.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449806/dce1f94e-501d-8c6d-7ec4-eecc26578914.png)

あとは立ち上げるだけでOK。

# Windows 10 インストール完了後
解像度が微妙な感じなので適切に調整したい場合はゲストツールをインストールします。

UTM ウィンドウの　右上 `＋` から適当なボリュームに [ゲストツールのダウンロード](https://qiita.com/drafts/be88dce581371c3f1616/edit#%E3%82%B2%E3%82%B9%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89) で取得した ISO ファイルを割り当てる。

割り当てたボリュームに格納されているゲストツールの exe ファイルの実行でインストーラーが起動します。
インストールすると解像度がより詳細に変更できるようになってると思います。

* * *

以上です。需要はあまりないと思いますがご参考ください。
interface VS 型エイリアス Typescript

## はじめに
Typescriptにおける、interfaceと型エイリアスでの型定義の方法に関して、イマイチ違いがわからなかったので自己学習のためにもまとめてみました。


## そもそも型定義って何（説明不要な方は飛ばしてください）
型定義とは、変数・関数・オブジェクトなどが持つべき型（データ形式・データ構造）を定義すること。
これにより、コード実行時のエラーを事前に検知したりコードの構造が明確になる

Typescriptでは、変数：**型名**の形で、型注釈（アノテーション）を付与します。

**例**
```
//変数
let age: number = 40;
```
```
//定数
const QUESTION: boolean = true;
```
```
//クラス
class Animal
    name: string + '';
    age: number = 0;

 toString() : string {
    return 'Person: ${this.name} (${this.age}歳)';
 }
} 
```

## interfaceと型エイリアスの違いについて
基本的構造


```
//Interface

interface BookType {
    title: string;
    price: number;
}

let b: BookType =  {
    title: BOOK;
    price: 500;
}
```
```
//型エイリアス

type BookType = {
    title: string;
    price: number;
}

let b: BookType =  {
    title: BOOK;
    price: 500;
}
```
#### 異なるポイント①:記述方法
interfaceは宣言なのに対して、typeは"="が必要。


```
//interface

interface BookType {
....//省略
}
```

```
//型エイリアス

type BookType = {
...//省略
}；
```

#### 異なるポイント②:宣言できる型


**interface**
オブジェクト・クラス等の型に特化して型を扱える


**型エイリアス**
プリミティブ型、関数型、タプル型、ユニオン型、インターセクション型など、様々な型を扱える

#### 異なるポイント③:継承方法

```
//interfaceは継承を行える

interface BookType {
    title: string;
}

type Paper = {
    title: string;
};

interface FoodRecipe extends BookType, Paper {
    foodType: string;
}    
```

```
//型エイリアスは継承は行えないが、交差型（&）を用いることで、同じことが実現できる

type BookType = {
    title: string;
}

type Paper = {
    title: string;
};

type FoodRecipe = BookType &
    Paper & {
    foodType: string;
};
```

#### 異なるポイント④:オーバーライド
```
//interfaceの場合は、継承元の型が上書きされる(元の型に代入できるものに限る)

interface BookType {
    title: string;
    price: number;
    infomation: string;
}

interface MapBook {
    title: string;
    price: number;
    tax: number;
}

interface MapBook {
    title: string;
    price: number;
    tax: number;
    ionformation: string;
}


```

```
//型エイリアスの場合は、継承元の型が上書きにはならず、型の交差型が計算される

type BookType = {
    title: string;
    price: number;
    infomation: string;
}

type MapBook =BookType & {
    title: number;
    price: number;
    tax: number;
}

type MapBook = {
    title: never;　//交差型を作成できないため、never型になる
    price: number;
    tax: number;
    infomation: string;
}
```

#### 異なるポイント⑤:同名のものを宣言

**interface**
同名のインターフェイスを定義でき、それらの定義をすべて合成したインターフェイスになる

**型エイリアス**
同名のものは複数定義できない


#### 異なるポイント⑥:Mapped Types
**interface**
使用不可
**型エイリアス**
使用可


そもそもMapped Typesって何
→別で記事更新予定...


### 結論
必要に応じて適宜使い分けるのが良いが、どちらか迷ったら宣言できる表現の幅を考えると、まずは**型エイリアス**を使うのが良さそう。
WSL+VS CodeによるPython開発環境構築～目次～

WSL環境にDockerを導入し、エディタにはVS Codeを使い、Pythonの開発環境を整えるための手順を取りまとめます。
すべての手順を１ページに記すと長すぎるので、ページを分割しています。

# 1, WSLの導入

https://qiita.com/Lintaro/items/855b02164978140dee11

# 2, WSLにDocker+VS Codeを導入する

https://qiita.com/Lintaro/items/d30d10d29212e0c5be47
ゼロコピーでプロセス間通信が可能なiceoryxの使い方：（その1）導入

# 前書き

iceoryxは、Publish-Subscribeモデルに基づくプロセス間通信手段を提供するライブラリの一つで、送受信にデータコピー（一時変数への代入など）を伴わないため、比較的オーバーヘッドが小さいことが特長です（Publish-Subscribeモデルとは何かについては他者の説明に委ねます）。開発元情報や、採用しているプロジェクト事例などは[ここ](https://github.com/eclipse-iceoryx/iceoryx?tab=readme-ov-file)で紹介されています。

通信媒体としてはいわゆるSystem V IPCの共有メモリを使っており、これに準拠したシステムで利用可能です。

共有メモリを使えばゼロコピーにできるのは当たり前じゃないか、と思われるかも知れません。それはごもっともなのですが、実装上は同期や排他処理の工夫が必要で結構ややこしくなるので、そのあたりをしっかり作り込んでいるところがこのライブラリの魅力です。筆者の感覚では、使い方もわりと簡単だと思います。

ドキュメントは本家にしっかり用意されているのですが、日本語でGetting startedしたい人向けの文書が見つからないので、自分で書いてみました。本記事執筆時の筆者の開発環境はUbuntu 22.02LTS + gcc-11.4.0 on WSL2です。

# インストール

以下はGNUツール + git + apt + が使える環境であることを前提にしています。gcc、cmake、libacl1、libncurses5、pkg-configあたりが必要になるので、予めインストールしておいて下さい。

```sh
% sudo apt install gcc g++ cmake libacl1-dev libncurses5-dev pkg-config
```

本家リポジトリを手許にクローンします。

```sh
% git clone https://github.com/eclipse-iceoryx/iceoryx.git
```

ビルドはcmakeで行います。筆者自身がcmakeに慣れていないため1次情報がどこに書かれているか（どこに書くべきか）分からないのですが、`CMAKE_INSTALL_PREFIX`が`/usr/local`に設定されています。これで問題なければ、次の一連のコマンドでインストールまで完了します。

```sh
% cd iceoryx
% cmake -Bbuild -Hiceoryx_meta
% cmake --build build
% sudo cmake --build build --target install
```

# サンプルコンパイル＆実行

試しにサンプルにあるicehelloをコンパイル＆実行してみます。

```sh
% cd iceoryx_examples/icehello
```

コンパイルにはcmakeを使います。

```sh
% cmake .
% make
```

これで、カレントディレクトリに二つの実行ファイルiox-cpp-publisher-helloworldとiox-cpp-publisher-helloworldが出来るはずです。

Publish-Subscribeモデルに必要なメッセージブローカーはiox-roudiで、これは/usr/local/binの下にあります。バックグラウンドで走らせておきましょう。

```sh
% /usr/local/bin/iox-roudi &
```

ちなみに本家の[Getting started](https://github.com/eclipse-iceoryx/iceoryx/blob/main/doc/website/getting-started/overview.md)によれば、roudiというのは **Rou**ting and **Di**scovery の略だそうです。

これで準備は終わりです。ターミナルを二つ起ち上げて、片方で

```sh
% ./iox-cpp-publisher-helloworld
```

もう片方で

```sh
% ./iox-cpp-subscriber-helloworld
```

とすれば、これらが通信している様子が分かると思います。

## cmakeを使わずコンパイル＆リンクするには？

個人的にはcmakeが好きではないので、直接gccでコンパイルするためのオプションを調べました。上記icehelloの下にあるCMakeFiles/iox-cpp-publisher-helloworld.dir/link.txtを見ると

```sh
/usr/bin/c++ CMakeFiles/iox-cpp-publisher-helloworld.dir/iox_publisher_helloworld.cpp.o -o iox-cpp-publisher-helloworld  /usr/local/lib/libiceoryx_posh.a /usr/local/lib/libiceoryx_hoofs.a /usr/local/lib/libiceoryx_platform.a -lpthread -lacl -latomic -lrt
```

と書いてあるので、/usr/local/libの下にあるlibiceoryx_posh.a、libiceoryx_hoofs.a、libiceoryx_platform.aという3つのライブラリをリンクすれば良いと分かります（全て静的ライブラリなのは要注意です）。

また、ヘッダファイルは/usr/local/include/iceoryx/v2.90.0（バージョン番号は実態に合わせて下さい）以下にありますので、例えば

```sh
% g++ -Wall -O3 -I/usr/local/include/iceoryx/v2.90.0 -L/usr/local/lib -o hoge hoge.cpp -liceoryx_posh -liceoryx_hoofs -liceoryx_platform
```

とすれば、ソースファイルhoge.cppから実行ファイルhogeを作ることが出来ます。
次のようなmakefileを作っておくのが良いでしょう。

```
INCLUDE=/usr/local/include/iceoryx/v2.90.0
LIB=/usr/local/lib
LINK=-liceoryx_posh -liceoryx_hoofs -liceoryx_platform

CXX=g++
CXXFLAGS=-Wall -O3 -I$(INCLUDE) -L$(LIB)

TARGET=publisher subscriber
HEADER=mytopic.h

all: $(TARGET)
%: %.cpp $(HEADER)
	$(CXX) $(CXXFLAGS) -o $@ $< $(LINK)
clean:
	rm -f $(TARGET) *~
```

`TARGET`と`HEADER`は適当に変えて下さい。
無料で使える便利なフリー画像サイト8選

世の中にはたくさんのフリー画像サイトがありますが、多くのサイトは登録が必要だったり、有料だったりしますよね。

会社用のPCで登録制のサイトを使うのはセキュリティ面で不安ですし、そもそも1枚の画像に何千円もかけるのはもったいない！と思うことも多いでしょう。

そこで今回は、**無料**で**登録なし**で使える便利なフリー画像サイトをジャンル別に紹介します。

## ド定番

### いらすとや

https://www.irasutoya.com/p/others.html

### ぱくたそ

https://www.pakutaso.com/

Webデザインだけでなく、生活のあらゆる場面で使える日本の2大素材サイトです。

ただし、あまりにも使い回されているため、オリジナリティには欠けます。また、親しみやすいイラストが多いので、フォーマルなシーンやスタイリッシュなデザインには不向きです。

## アイコン

### Googleマテリアルアイコン

https://fonts.google.com/icons

Googleが提供するアイコンを利用できます。Font Awesomeと同様に、Webアイコンなので、CDN設定してタグをソースコードに記述するだけで表示できます。

### icooon-mono

https://icooon-mono.com/

こちらも定番のサイトです。アイコンの色をサイト内で自由に指定できるので、シンプルなアイコンであれば、Googleマテリアルアイコンと合わせてこれで事足りることが多いです。

## イラスト

### Soco

https://soco-st.com/category/person/page/42

柔らかい印象のイラストが揃っています。イラストのテーマカラーを自由に指定できるので、汎用性が高いです。

### tyoudo

https://tyoudoii-illust.com/

Socoと絵柄が似ています。人のイラストが充実しています。

## 写真

### O-DAN

https://o-dan.net/en/

世界中の36サイトを横断して無料写真素材を検索できます。日本語対応なので、海外のオシャレな写真を日本語で簡単に見つけることができます。

サイトごとに検索結果が表示されるので、36サイトの中からお気に入りのサイトを見つけるのも良いですね。

### Devices from Design at Meta

https://design.facebook.com/toolsandresources/

スマホやPCなどのデジタル端末の画像が揃っています。シャオミのスマホやSurfaceなど、コアな端末の画像もあります。

ダウンロード形式はzipなので、PCからダウンロードする必要があります。

**注意点**

フリー画像といっても、**参照元記載が必要**なものや**商用利用不可**なものもあります。利用前に各素材サイトのルールをよく確認しましょう。
同名のExcelファイルを開きたい

## やり方
起動オプションに/xのオプションを付けると別インスタンスで開かれ、同名のファイルを開いていても開くことができる。 

## 実用方法
### 1. SendToとショートカットを使う
SendToフォルダに/xのオプションがついたExcelのショートカットを置く
### 2. レジストリをいじる
1.HKEY\_CLASSES\_ROOT下にあるExcelファイルに関連するキーに以下を編集をする
　`
HKEY_CLASSES_ROOT\[Excelファイルのキー]\shell
`
2.上記のキー下に「AliasOpen」など適当な名前のキーを作成し
3.既定のデータに任意の操作名を記載(例: 別インスタンスで開く)
4.AliasOpen下に「command」キーを作成
5.既定のデータに下記を記載
```
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE" /x "%1"
```
#### 参考
HKEY_CLASSES_ROOT下のキーとExcelファイルの関連
| 拡張子 | キー |
|-|-|
|.xlsx|Excel.Sheet.12|
|.xls|Excel.Sheet.8|
|.xlsm|Excel.SheetMacroEnabled.12|

## 参考記事
https://qiita.com/aske315/items/d802369859a4b9f5e200
【AWS】Elastic Load BalancingとAuto Scalingの連携による効果的なトラフィック分散


# はじめに
AWS上でWebアプリケーションを運用する際、トラフィックの変動に合わせて、サーバーリソースを自動的にスケールさせることが重要です。そこで活躍するのが、**Auto Scaling**です。さらに、Auto Scalingと連携することで、トラフィックを効果的に分散できるのが**Elastic Load Balancing (ELB)**です。本記事では、ELBとAuto Scalingを組み合わせることで、どのように**トラフィックを最適に分散**できるのかを解説します。

# Elastic Load Balancingの役割

### 1-1. トラフィックの分散
ELBは、**複数のEC2インスタンスに対して、トラフィックを自動的に分散する機能**を持っています。これにより、特定のインスタンスに負荷が集中することを防ぎ、アプリケーションのパフォーマンスを維持できます。

### 1-2. ヘルスチェック
ELBは、各インスタンスに対して定期的にヘルスチェックを行います。異常が検知されたインスタンスには、トラフィックを送信しません。これにより、サービスの可用性を高く保つことができます。

# Auto Scalingの役割
### 2-1. インスタンス数の自動調整
Auto Scalingは、あらかじめ設定したルールに基づいて、**EC2インスタンスの数を自動的に増減**します。これにより、トラフィックの変動に合わせて、適切なリソースを確保できます。
### 2-2. インスタンスの自動登録・登録解除
Auto Scalingによって起動されたインスタンスは、自動的にELBに登録されます。同様に、終了したインスタンスは、ELBから自動的に登録解除されます。これにより、**運用の手間を大幅に削減**できます。

# ELBとAuto Scalingの連携方法
### 3-1. ELBのアタッチ
Auto Scalingグループに、ELBをアタッチすることで、連携が可能になります。これにより、グループ内のインスタンスが、ELBの配下に自動的に登録されます。
### 3-2. スケーリングポリシーの設定
ELBのメトリクス（例えば、ターゲットあたりのリクエスト数）を利用して、Auto Scalingのスケーリングポリシーを設定できます。これにより、トラフィックの増減に合わせて、インスタンス数を自動的に調整できます。
### 3-3. ヘルスチェックの追加
Auto Scalingグループに、ELBのヘルスチェックを追加することで、**異常なインスタンスを自動的に置き換えることができ**ます。これにより、システムの信頼性が向上します。

# ELBの種類と特徴
### 4-1. Application Load Balancer (ALB)
ALBは、HTTPやHTTPSといったアプリケーション層でのルーティングを行います。パスベースのルーティングにも対応しており、柔軟な設定が可能です。
### 4-2. Network Load Balancer (NLB)
NLBは、TCPやUDPといったトランスポート層でのルーティングを行います。高いスループットが要求される場合に適しています。
### 4-3. Gateway Load Balancer (GWLB)
GWLBは、ファイアウォールや侵入検知システムなどの仮想アプライアンスにトラフィックを分散します。セキュリティ面での活用が期待されます。
### 4-4. Classic Load Balancer (CLB)
CLBは、従来型のロードバランサーです。現在は、ALBやNLBの利用が推奨されています。

# まとめ
ELBとAuto Scalingを連携させることで、**トラフィックの変動に合わせて、適切なリソースを自動的に確保し、トラフィックを最適に分散させる**ことができます。これにより、**Webアプリケーションのパフォーマンスと可用性を高く維持**できます。AWS上でのシステム運用において、ELBとAuto Scalingの活用は欠かせません。用途に合わせて適切なELBの種類を選択し、Auto Scalingと連携させることで、より信頼性の高いシステムを構築できるでしょう。

# 参考
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/autoscaling-load-balancer.html
AWS Cloud Practitioner取ったけど何も理解してない話

# 1週間くらいでAWS Cloud Practitionerに合格できました！
![スクリーンショット_9-5-2024_201117_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724119/a0a692d5-9fdc-dfff-a3d6-9ef8b05ea185.jpeg)

でもタイトルの通り全然理解出来てません。;;
点数もギリギリだったし
逆にあんまよく分かんなくっても合格できるということでこれから受ける方はなんとなくで頑張ってください！

## やったこと
前提としてAWSの実務経験、知識は何もありません。クラウドってすごそーて感じでした。
1. [AWS認定クラウドプラクティショナー(改訂第2版)](https://www.amazon.co.jp/-/en/gp/product/B0C73QX2CT/ref=ppx_yo_dt_b_d_asin_title_351_o03?ie=UTF8&psc=1)

1. Udemy 【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）

1の本を軽く一周して、Udemyの問題集を基礎編2つ実践編2つを正答率85%を超えるまでやりました。
(本当は90%は超えようと思っていましたがゲームしたくてやめました＾＾)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724119/b42d785c-6db5-ee7d-3eb3-f5c84167e822.png)

問題集を最初解いたときこんな感じでしたが、気にせず進めましょう。

## 
一応、AWSを使う利点くらいは分かりました。SAA取りたいので現在は[1週間でAWS認定資格の基礎が学べる本](https://www.amazon.co.jp/gp/product/B0BZCGMJKS/ref=ppx_yo_dt_b_d_asin_title_351_o01?ie=UTF8&psc=1)で勉強し直しています。(๑•̀ㅂ•́)و✧ｶﾞﾝﾊﾞﾙ

ほとんど日記みたいなものですがお役に立てれば幸いです。
【書評】実践Node.js入門

# 読んだ本

https://gihyo.jp/book/2023/978-4-297-12956-9

# 概要

業務でサーバーサイドJSをやることになり、まずは有名なNode.jsを改めて学び直そうと手に取りました。2023年発売で、そこまで古くないのも良かった点です。
一通りの項目がさらえて、さらに一歩踏み込んだ難しい内容にも触れられているのがとても良かったです。

目次は下記になっています。

1　はじめてのNode.js
2 JavaScript/Node.jsの文法
3 Node.jsとモジュール
4 Node.jsにおける非同期処理（フロー制御）
5 CLIツールの開発
6 ExpressによるREST APIサーバー／Webサーバー
7 フロントエンド／バックエンドの開発
8 アプリケーションの運用と改善

# おすすめの人

- Express.jsなどNode.jsを使用したサーバーサイド開発を始める人
- Reactなど、フロントエンド開発をしているが、Node.jsについて何となく触れている人

# 次に読むなら

他のJSランタイムにも興味が出てきたので、DenoやBunについて調べてみたくなりました。

# 感想

何となく昔に学んだ知識が網羅的にアップデートできて良かったです。下記見返したいメモ。

- Node.jsはシングルプロセス・シングルスレッドのイベントループで待ち受ける
- リクエストIDなどを実装するには Async Hooks を使う
Fugaku-LLMをDatabricksで動かしてみる

富嶽でLLMとはすごい。

https://pr.fujitsu.com/jp/news/2024/05/10.html

https://github.com/Fugaku-LLM/DeepSpeedFugaku

こちらを動かします。モデルにアクセスするにはライセンス条項への同意が必要です。

https://huggingface.co/Fugaku-LLM/Fugaku-LLM-13B-instruct

いつものようにGPUクラスターを使います。

```py
# login huggingface
from huggingface_hub import login
login()
```
```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_path = "Fugaku-LLM/Fugaku-LLM-13B-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, device_map="auto")
model.eval()

system_example = "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"
instruction_example = "スーパーコンピュータ「富岳」の名前の由来を教えてください。"

prompt = f"{system_example}\n\n### 指示:\n{instruction_example}\n\n### 応答:\n"

input_ids = tokenizer.encode(prompt,
                             add_special_tokens=False,
                             return_tensors="pt")
tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=128,
    do_sample=True,
    temperature=0.1,
    top_p=1.0,
    repetition_penalty=1.0,
    top_k=0
)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)
```
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
スーパーコンピュータ「富岳」の名前の由来を教えてください。

### 応答:
「富岳」は日本のスーパーコンピュータの名前です。富士山の異名である「富岳」は、日本で最も高く、最も有名な山であり、その高さは3776メートルに達する。スーパーコンピュータの名前としては、富士山のように高性能で世界に誇れるマシンになるようにという願いが込められている。
```

おおー(って、驚いてばっかり)。

```py
instruction_example = "明治時代の出来事を簡潔に説明してください。"

prompt = f"{system_example}\n\n### 指示:\n{instruction_example}\n\n### 応答:\n"

input_ids = tokenizer.encode(prompt,
                             add_special_tokens=False,
                             return_tensors="pt")
tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=128,
    do_sample=True,
    temperature=0.1,
    top_p=1.0,
    repetition_penalty=1.0,
    top_k=0
)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)
```
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
明治時代の出来事を簡潔に説明してください。

### 応答:
明治時代は、日本が近代国家としてスタートした時代である。この時代に日本は、武士階級を廃止し、天皇を中心とした新しい政府を樹立した。また、教育や医療の制度化、貨幣の統一、暦の導入など、社会や経済の発展にも努めた。明治時代には、日本が近代化への道を歩む上で重要な出来事や変化が数多くあった。
```
```py
instruction_example = "俳句と短歌の違いを簡潔に説明してください。"

prompt = f"{system_example}\n\n### 指示:\n{instruction_example}\n\n### 応答:\n"

input_ids = tokenizer.encode(prompt,
                             add_special_tokens=False,
                             return_tensors="pt")
tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=128,
    do_sample=True,
    temperature=0.1,
    top_p=1.0,
    repetition_penalty=1.0,
    top_k=0
)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)
```
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
俳句と短歌の違いを簡潔に説明してください。

### 応答:
俳句は3句17音、短歌は5句31音です。
```

さすが日本に関して詳しい。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【rails】Herokuに画像が表示されない

# はじめに

- `assets/images/logo.jpeg` に画像を保存し,imgタグにてパスを参照してブラウザ表示を試みた。
- 上記ローカル環境にて表示することはできたが、``heroku``にデプロイした環境では表示させることができなかった。

# やったこと

- 拡張子が `jpeg` になっていた→ `jpg` に修正する。
- `img` タグで記述を `image_tag` に修正する。
- `assets/images/x_logo.jpg` で絶対パス指定していたものを、 `x_logo.jpg` の形で相対パスに変更する。
- 修正後のコード↓

```ruby
.login
  .text-center
    = image_tag 'x_logo.jpg' ,alt: '' ,width: '60' ,height: '57'
  h3.text-center サインアップ

```

# 結果

- 開発環境、Heroku本番環境の両方でアイコンの画像を表示させることができた。

# 参考

https://qiita.com/jnchito/items/3d225112a3ac95379b1d
【rails】viewの共通applicationを切り分ける

# やりたいこと

- deviseを用いたログイン、サインアップ画面と通常のメイン画面とで、共通のviewを切り分けて表示させたい。
- (例)メニューヘッダー,サイドバーはログイン画面には表示させたくない

# やったこと

1. ユーザー認証用のHTMLを作る

2. ApplicationControllerに描画の切替を制御する記述をする

ユーザー認証用のHTML（ファイル名は任意）のファイル名で作って、`app/views/layouts/`配下に作る

※`app/views/layouts/devise.html.erb`で作るとします

devise.html.erb

```jsx
<!DOCTYPE html>
<html>
  <head>
    <title>Sample</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <header class="header">
      <div class="header__inner">
        <div class="header__logo">sample</div>
      </div>
    </header>
    <%= yield %>
  </body>
</html>
```

ApplicationControllerに描画の切替を制御する記述

表示される内容がdevise_controllerかどうかを判断するために`if devise_controller?`を記述し、

**true**だったら`devise.html.erb`

**false**だったら`application.html.erb`

を呼ぶようにする

``application_controller.rb``

```jsx
class ApplicationController < ActionController::Base
  layout :layout_by_resource

  private

  def layout_by_resource
    if devise_controller?
      'devise'
    else
      'application'
    end
  end
end
```

# 参考

https://qiita.com/rearail/items/3faf4e1306b2494a2f4e
【rails】.envファイルに環境変数を設定する

# はじめに

- 外部に公開したくないpasswordなどを環境変数として `.env`ファイルに設定する。
- githubにコミットした際に、 `gitignore` ファイルに.envファイルを指定することで、パスを外部に公開されないようにすることができる。
- 上記の手順を簡単に下記へまとめる。

# 手順

- detenvを `Gemfile` にインストール

```jsx
gem 'dotenv-rails'
```

- `.env` ファイルに外部に公開したくないIDやpassを記述する

```jsx
LOGIN_NAME='name123'
LOGIN_PASSWORD='pass123'
```

- 上記を `環境変数` として他のファイルから呼び出す際は以下のように記述する

```jsx
ENV['LOGIN_NAME']
ENV['LOGIN_PASSWORD']
```

- Githubに.envファイルがコミットされないように `.gitignore` ファイルに以下を追加

```ruby
/.env
```

# 参考

https://qiita.com/noraworld/items/bfa80811c9e30b4474af
【AWS】インスタンスタイプ 〜スポット、リザーブド、オンデマンド、専有の比較〜

# はじめに
AWSは、ユーザーのニーズに合わせて選べる様々なインスタンスタイプを提供しています。それぞれのインスタンスタイプには、メリットとデメリットがあり、使用目的に応じて適切に選択することが重要です。ここでは、スポットインスタンス、リザーブドインスタンス、オンデマンドインスタンス、専有インスタンスの概要を説明し、それぞれの使い分け方を表にまとめました。

# 1. スポットインスタンス
### 概要
スポットインスタンスは、AWSの未使用の計算容量を利用して、オンデマンド料金よりも最大90％割引で利用できるインスタンスです。ただし、AWSがキャパシティを必要とする場合、2分前の通知で中断される可能性があります。
### メリット
- オンデマンド料金と比較して、最大90％の割引で利用できる
- 柔軟なインスタンスタイプとサイズを選択可能
- 中断の可能性を考慮して設計されたワークロードに適している

### デメリット

- インスタンスが中断される可能性がある
- 長期的な運用には向かない
- 中断による影響を最小限に抑えるためのシステム設計が必要

# 2. リザーブドインスタンス
### 概要
リザーブドインスタンスは、1年または3年の期間で特定のインスタンスタイプを予約することで、オンデマンド料金と比較して最大75％の割引を受けられるインスタンスです。
### メリット

- オンデマンド料金と比較して、最大75％の割引で利用できる
- 長期的な使用に適している
- 予約期間中は、インスタンスが常に利用可能

### デメリット

- 予約期間が1年または3年と長期にわたる
- 予約したインスタンスタイプを変更できない
- 前払いが必要な場合がある

# 3. オンデマンドインスタンス
### 概要
オンデマンドインスタンスは、必要な時に必要な分だけ起動し、使用した分だけ料金を支払うインスタンスです。従量課金制で、長期的なコミットメントは不要です。
### メリット

- 必要な時に必要な分だけ利用できる
- 長期的なコミットメントが不要
- インスタンスタイプとサイズを自由に選択可能

### デメリット

- 他のインスタンスタイプと比較して、料金が高い
- 大規模なデプロイメントには費用がかかる
- 需要が高い場合、キャパシティが制限される可能性がある

# 4. 専有インスタンス
### 概要
専有インスタンスは、単一のお客様専用のハードウェアで実行されるインスタンスです。他のお客様とハードウェアを共有することはありません。
### メリット

- ハードウェアレベルでのセキュリティと分離性が向上する
- コンプライアンス要件を満たすことができる
- ライセンスの持ち込みが可能

### デメリット

- 他のインスタンスタイプと比較して、料金が高い
- 専有ハードウェアの設定と管理が必要
- スケーリングには制限がある

# まとめ

| インスタンスタイプ | 特徴 | 適した使用例 |
|---|---|---|
| オンデマンド | - 最大90％の割引<br>- 中断の可能性あり<br>- 柔軟なインスタンスタイプとサイズ | - ビッグデータ処理<br>- バッチ処理<br>- CI/CDワークロード |
| リザーブド | - 最大75％の割引<br>- 1年または3年の予約<br>- 安定した長期運用に適している | - 本番環境のワークロード<br>- データベース<br>- 長期的な運用が必要なアプリケーション |
| スポット | - 従量課金制<br>- 長期的なコミットメント不要<br>- 柔軟なインスタンスタイプとサイズ | - 開発・テスト環境<br>- 予測不可能なトラフィックパターンのWebアプリケーション |
| 専有 | - 単一テナントのハードウェア<br>- 高いセキュリティと分離性<br>- ライセンスの持ち込み可能 | - セキュリティとコンプライアンスが重要なワークロード<br>- ライセンス持ち込みが必要な場合 |

# 参考
https://aws.amazon.com/jp/compare/the-difference-between-on-demand-instances-and-reserved-instances/
python-oracledb で CSV ファイルを出力


## python-oracledb とは
- python-oracledb は cx_Oracle ドライバーの新しい名前で Oracle Database にアクセスするためのモジュール
- デフォルトでは Oracle クライアント ライブラリは不要（Thin Mode） 
- ただし Thin の場合、Oracle データベース側が 12.1 以降なので 11g とかであれば Thick モードにする
- Thick に変更するには接続前に初期化処理 `oracledb.init_oracle_client()` をする
- Thick で必要な Oracle Instant Client はダウンロードして展開したらOK

https://python-oracledb.readthedocs.io/en/latest/index.html

https://python-oracledb.readthedocs.io/en/latest/user_guide/appendix_b.html#driverdiff

https://python-oracledb.readthedocs.io/en/latest/user_guide/appendix_a.html#featuresummary

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

### Thick モードでCSV出力

pandas を使った例

``` oracle_to_pandas_csv.py
import oracledb
import pandas as pd

instantclient = "C:/instantclient_21_13"
oracledb.init_oracle_client(lib_dir=instantclient)
# tnsnames.ora のパスが通常と異なる場合には指定
# oracledb.defaults.config_dir = instantclient + "/network/admin"

sql = """
  SELECT 
    B.id 
   ,B.name
   ,B.address
  FROM
    db.b_info_table B
  WHERE
    B.id <= :id_code
"""

# 列名を取得する
def get_columns(cursor):
    columns = []
    for col in cursor.description:
        columns.append(col.name)
    return columns

# 
with oracledb.connect(user="xxxxxxx", password="xxxxxxxx", dsn="xxxxxxx") as connection:
    with connection.cursor() as cursor:
        results = cursor.execute(sql, id_code='99999999')
        #results = cursor.execute(sql)                    # Bind 変数のないSQLならこれだけで良い

        columns = get_columns(cursor)                     # 列名を取得
        data = cursor.fetchall()                          # 全データを取得

        df = pd.DataFrame(data, columns=columns)          # pandas dataframe に変換
        df.to_csv('oracle_pandas.csv', encoding='cp932', index=False)  # 文字コードは後続の用途次第
```
OrthoFinder が系統樹作成のステップで止まったら

## OrthoFinderでよくあるエラー

OrthoFinderで細菌株を多く使って比較ゲノム解析を行う際、オルソログを持ちいた系統樹作成のステップで、以下のようなエラーが生じる。
今回は31株のオルソログをOrthoFinderにて探索している。

> ERROR: The system limits on the number of files a process can open is too low. For 31 species OrthoFinder needs to be able to open at least r=1061 files. Please increase the limit and restart OrthoFinder



[IOError: [Errno 24] Too many open files #384](https://github.com/davidemms/OrthoFinder/issues/384) に対処法が書いてある。

OrthoFinderは入力した細菌株数からオルソログをどんどん探索してtsvファイルに出力していくので、システム上で同時に多くのファイルを開くこととなる。具体的には、n（細菌株数）に対して、n^2 + 50のファイル数を開けるだけのキャパを用意しておく必要がある。

> If you are running an analysis on n species then OrthoFinder will need to be able to open approximately r=n^2+50 files. The n-squared files are the .tsv files of orthologs that are updated with the orthologs as each new gene tree is analysed. The 50 is for extra files opened by the process. As I don't understand the full intricacies of how how many files linux opens to run a process I'd suggest being safe and using a number considerably bigger than 50.

## 対処法

まずは、システム側で同時に開くことができるファイル数を確認する。
Hard limit > Soft limit の場合は、root権限なしにそのまま変更できる。

```shell
# hard limit
ulimit -Hn

# soft limit
ulimit -Sn
```
31株をOrthoFinderで解析する場合、最低でもr = 31^2+50 = 1,011あれば良い。
今回は余裕を持ってr = 5,000を指定する。

```shell
# hard limit > soft limitの場合
ulimit -n 5000
```

その後、系統樹作成のステップから再実行する。

```shell
orthofinder -ft ortho-finder_prot_fasta/Results_May10/
```
データベース

データベースの説明
主キーと外部キーが存在する。

データベース主に３つのスキーマが分かれている。
それぞれ、ATMを例にして考えてみよう。
外部スキーマ：ユーザーがATMを見てる画面
概念スキーマ：開発者が見ているデータ
内部スキーマ：ハードウェアの部分

主要なデータベースの関係モデル：表形式
属性とは列のこと。

データベースの正規化
主キーと外部キーがある。
    →１つに特定するための列を主キー
外部キー
    →表と表をくっつけるためのキー
表を分けるメリット：
独立性が高まり、データの管理が容易になる。

第一正規化：重複してる列を分割する。
第二正規化：カテゴリー別にデータを分割する。
第三正規化：第二で分割しきれなかった部分をさらに分割する。

トランズアクション処理：

Atomicity:「完全に処理」、「全く処理されてないこと」「途中で終わる処理はつくらない」
Consistency：データベースの内容に矛盾がないこと。
Isolation：複数のトランズアクションの実行結果が等しくなること。
Duration:障害が発生してもデータベースからデータが消失しないこと。

共有ロック：他ユーザーはデータを見ることができるが更新は出来ない。
専有ロック：他ユーザーはデータを見ることができないが更新は出来ない。

ストアドプロシージャ：
プロシージャ：データベーすの命令郡を一つにまとめる。なぜ？データベースをSQLで実行するときに一つずつ実行する手間と通信にかかる負荷を軽減できる。

データベースの復元：
更新前ジャーナルと更新後ジャーナルがある。
更新前ジャーナル：処理が終わる前のデータをそれに保存
更新後ジャーナル：処理が無事に終わったら、それに記録。

コミットとロールバック：
![Screenshot 2024-05-11 at 10.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779552/00c9f7e0-2078-c62c-9c14-7b048aac46ec.png)
![Screenshot 2024-05-11 at 10.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779552/82e47a94-4ea6-44ad-6777-b90bd1e37ea3.png)
![Screenshot 2024-05-11 at 10.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779552/71a2fcb5-87c1-9ae4-0ca0-b158ddd58506.png)
バックアップファイルと更新後ジャーナルでデータを破損した際に、データを復元できる。
バックアップファイルに定期的にデータが保存されている。更新後ジャーナルはトランズアクションが終わったあとのデータを保存してるので復元が可能。

ロールバック：トランズアクション中にエラーが発生した際、更新前ジャーナルで復元。
ロールフォワード：システム障害等でデータが破損した際、バックアプファイルと更新後ジャーナルで復元。![Screenshot 2024-05-11 at 10.36.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779552/e0c9f425-6f75-45c0-a97a-b3bf1ec2dc95.png)

２相コミット
すべてコミット可能：コミット実施
一つでも✗：ロールバック
これらを２相コミットという。
社内Wikiを改善して、開発体験をより良くする

## はじめに

◆この記事は何？
社内Wikiの改善方法について紹介する記事です。

◆この記事のねらい
社内Wikiを改善することで、チームの生産性や品質を向上させ、開発体験をより良くするのがねらいです。

## 先に結論
- 「ルール」ではなく「**ポリシー**」を設ける
    - 「**Working集**」と「**アーカイブ集**」をつくる
    - **ページごとに目的を書く**
- 大切な思考法
    - 「**中途半端なドキュメントは中途半端な文化を生む**」
    - 「**誰でもできるは誰もやらなくなる**」

## 社内Wikiのよくある課題

皆さんの社内Wikiで次のような課題を感じたことはありませんか。

- 情報が散乱
- 更新中のページがそのまま
- メンテナンスされていない構造

多くの人が作成・編集できる社内Wikiは、改善の意志がないと上記のような状態になりがちです。

最悪の場合、開発体験の低下につながります。

## 良い社内Wikiとは

良い社内Wikiの必要条件は以下の通りです。

- 開発体験を向上させる
    - 結果的にビジネス価値を生む
- 必要な情報にアクセスしやすい
    - 逆に不要な情報はアーカイブされている
- 未来を見据えて改善され続けている

組織によって条件は変わると思いますが、概ね上記のような内容が挙がるかと思います。

## 「ルール」ではなく「ポリシー」を設ける

まず社内Wikiを改善するためにポリシーをつくります。

社内Wikiは「ルール」よりも「ポリシー」の方が改善は進みやすいです。

- 「ルール」
    - 必ず守る具体的な指示
- 「ポリシー」
    - ガイドラインとしての推奨事項

◆「ルール」よりも「ポリシー」が良い理由
- 社内Wikiは想定外や例外が発生しやすい
- 多くの人が関わるため、新しい「ルール」はハレーションが起きやすい
- 仮に守っていなくても、そこまで大きな問題になることは少ない

柔軟性を持ちつつ、明確な方針の下で組織として活動していくために、ポリシーを設けます。

次に、実際に効果があったポリシーを3つ紹介します。

### ①「Working集」をつくる

Working集は「更新中のページ」や「どこに配置すべきか分からないページ」のための場所です。

目的は、
1. **中途半端なドキュメントの混在を防ぐ**
1. **全体の構造を綺麗に保つ**

です。

Working集は、想定していなかった例外をキャッチできるようになります。

例えば、次のような運用ができます。
- 「とりあえずWorking集からページを立ち上げておく」
- 「アドホックなイベント用ページをWorking集で立ち上げる」

### ②「アーカイブ集」をつくる

「アーカイブ集」は、「役目を終えたページ」や「削除を迷うページ」のための場所です。

「役目を終えたページは削除する」というポリシーも考えられます。
しかし、社内Wikiでは「自分が作成していないページは削除して良いかわからない」状態になりがちです。

そのため、削除の判断に迷う場合も「とりあえず移動できる場所」として用意しておきます。
心理的にもハードルが下がり、結果的に全体の保守性が高くなります。

### ③各ページに目的を書く

「各ページに目的を書く」というポリシーは有効です。

目的を書くことで、「このページは本当に必要か？」と再評価できるようになります。
量も自然に必要十分になっていきます。

ページごとの目的を記載することで、ページの配置位置を適切に導くことができ、Wiki全体の構造を綺麗に保ちやすくなります。

## 「中途半端なドキュメントは中途半端な文化を生む」

中途半端なドキュメントが一つあると、次々と中途半端なドキュメントが生まれていきます。

そして、それらは次第に「中途半端な組織カルチャー」になっていきます。

早い段階で中途半端なドキュメントを無くしておく、また上記の「Working集」などを活用して「中途半端であること」を明示することで、「中途半端な文化」を予防します。

## 「誰でもできるは誰もやらなくなる」

誰でもできることは誰もやらなくなる傾向があります。
社内Wikiがその代表例です。

よって、推進担当を一人設けるのが有効です。
「ドキュメントオーナー」という役割も考えられます。

[「エンジニアのためのドキュメントライティング」](https://amzn.asia/d/3tuIDb3)では次のように解説されています。

> ドキュメントの責任は全員にある、と考えられることが多くあります。それゆえに、誰も責任を負ってないとも言えるでしょう。そこでドキュメントの課題への対応、ドキュメントの変更に対するレビュー、必要であればドキュメントの更新に責任を持つドキュメントオーダーを明示的に任命することで、責務を明確にしてください。責務の明確化は、ドキュメントが古くなることの防止に役立ちます。

誰でもできる仕事は誰もやらなくなるので、私は積極的にやるようにしています。
そのほうが、組織が良くなり、結果的に自分のためになるからです。

## おわりに

この記事では、社内Wikiの改善方法について紹介しました。

ポリシーをつくること、そしてその背景にある思考法についてご紹介しました。

もし他に効果的なポリシーや思考法があれば、コメントで教えていただけると幸いです。


## 参考

[GitLabに学ぶ 世界最先端のリモート組織のつくりかた](https://amzn.asia/d/el0cgOf)

[割れ窓理論](https://www.kuins.ac.jp/news/2019/02/post_20.html)
【AWS】デッドレターキュー 〜失敗したメッセージを管理する方法〜

# はじめに
分散システムにおいて、メッセージキューは重要な役割を果たします。しかし、メッセージの処理が失敗することがあります。そこで、デッドレターキュー (DLQ) の出番です。DLQは、**処理できないメッセージを一時的に保存する**特別なタイプのメッセージキューです。この記事では、DLQの仕組み、利点などについて説明します。

# デッドレターキューとは？
デッドレターキューは、通常のメッセージキューと並んで存在し、**エラーを含むメッセージや、宛先が指定されていないメッセージを格納**します。受信者が送信メッセージへの応答またはその処理に失敗した場合、ソフトウェアはそのメッセージをDLQに移動します。これにより、通常のキューがブロックされるのを防ぎます。

# デッドレターキューの利点
- **通信コストの削減**：失敗しているメッセージについては有効期限が切れるまで処理を試みるより、数回試行した後にDLQに移動する方がよいでしょう。
- **トラブルシューティングの改善**：誤ったメッセージをDLQに移動すると、デベロッパーはエラーの原因の特定に集中できます。

# デッドレターキューを使用すべきでない場合
- メッセージの送信を**無期限に再試行したい**場合。
- メッセージや操作の**正確な順序を変えたくない**場合。

# AWSによるデッドレターキューのサポート
Amazon Simple Queue Service (Amazon SQS) は、分散システム間でメッセージを大規模に交換するためのスケーラブルなアプローチを提供します。Amazon SQSを使用すると、システムがメッセージキューをいくつでも作成でき、メッセージを一括して転送できるため、コスト効率が向上します。

# おわりに
デッドレターキューは、分散システムにおけるメッセージ処理の失敗を管理するための重要なツールです。DLQを適切に使用することで、通信コストを削減し、トラブルシューティングを改善できます。Amazon SQSのようなサービスを活用することで、信頼性の高いウェブアプリケーションを構築できます。

# 参考

https://aws.amazon.com/jp/what-is/dead-letter-queue/
Outliers' Programs

# Outliers' Programs（自分でガツガツ進めたい人向け）

### そもそも独学の方法って？
[独学大全 絶対に「学ぶこと」をあきらめたくない人のための55の技法](https://www.amazon.co.jp/%E7%8B%AC%E5%AD%A6%E5%A4%A7%E5%85%A8-%E7%B5%B6%E5%AF%BE%E3%81%AB%E3%80%8C%E5%AD%A6%E3%81%B6%E3%81%93%E3%81%A8%E3%80%8D%E3%82%92%E3%81%82%E3%81%8D%E3%82%89%E3%82%81%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE55%E3%81%AE%E6%8A%80%E6%B3%95-%E8%AA%AD%E6%9B%B8%E7%8C%BF/dp/4478108536)
[読書猿Classic: between / beyond readers](https://readingmonkey.blog.fc2.com/)
[独学ガイド/理工学一般](https://ja.wikibooks.org/wiki/%E7%8B%AC%E5%AD%A6%E3%82%AC%E3%82%A4%E3%83%89/%E7%90%86%E5%B7%A5%E5%AD%A6%E4%B8%80%E8%88%AC)
「在野研究」「[ワイルドリサーチャー・ワイルドサイエンティスト](https://neutmagazine.com/emi-kusano-super-teens-7)」という言葉も知っておくといいかと…

### [私大の情報科入試](http://jnsg.jp/?page_id=108)
慶應義塾大学湘南藤沢キャンパスに設置されている学部(SFC)が情報科入試（ちなみにAOも）発祥と言われています．現在は，明大，東洋大，駒大なども入試時に情報科選択ができる学部として有名になりつつありますね．今後の情報科入試の参考資料にもなりうる問題とも言えそうです．


### Computer Science
昔から「計算機科学」と言われた分野．だからプログラミング言語の初回は，必ずと言っていいほど四則演算の方法から始まる．

[教養としてのコンピューターサイエンス講義 今こそ知っておくべき「デジタル世界」の基礎知識](https://www.amazon.co.jp/%E6%95%99%E9%A4%8A%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E8%AC%9B%E7%BE%A9-%E4%BB%8A%E3%81%93%E3%81%9D%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8D%E3%80%8C%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E4%B8%96%E7%95%8C%E3%80%8D%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E3%83%96%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%BB%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4822288730/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=1605060245&sr=1-1)
[基本情報技術者試験]()
[応用情報技術者試験]()

### Python3全般
[Zenn -python](https://zenn.dev/topics/python)
[Python チュートリアル](https://docs.python.org/ja/3/tutorial/)

### データ分析，統計
[データ分析基礎知識 | 株式会社Albert](https://www.albert2005.co.jp/knowledge/)
[Np-Urのデータ分析教室](https://www.randpy.tokyo/)

### 自然言語処理
[言語処理100本ノック（2021年度）](https://www.nlp.c.titech.ac.jp/seminars/study-nlp100.ja.html)
[言語処理100本ノックを解き始める前に](https://gist.github.com/reiyw/9155edf600e85417e82d2e4e4bc9e637)

### G検定/E検定(人工知能について問う資格試験)

### OS

### 自作言語

### 自作PC

### 自作CPU

### ネットワーク&セキュリティ
登大遊さん
村井純さん
[CTF]()
[ハッカーの学校]()
ネスペせきスペ

### アルゴリズムとデータ構造

### 競技プログラミング
[AtCoder]()
[AIZU]()
[Leet]()

### デザイン

### 情報オリンピック

### その他 独学で使えるツール
Windows11 cuda12.3 でpytorch のインストール

## いきなり結論
安定リリース2.3ではなく、Preview（2.4）をセットアップすることで解決しました（2024/05/11現在）
```
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/d8489497-b840-3476-5b48-06cf13afff4f.png)

2024/05/11 現在では、下記のように確認すると、
```python:torch_test.py
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.current_device())
```
```batchfile:ターミナル
2.4.0.dev20240510+cu121
True
1
0
```
と出力されました。（2.4previewが入った模様）

## 環境
- windows11
- python3.11（Windowsストアからセットアップ）
- cuda12.3

## PyTorch stable2.3 をpipでインストールすると、'指定されたモジュールが見つかりません。'
`pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
`
で上記のtorch_test.pyを実行すると、
```batchfile:ターミナル
    import torch
  File "C:\Users\ユーザ名\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\torch\__init__.py", line 142, in <module>
    raise err
OSError: [WinError 126] 指定されたモジュールが見つかりません。 Error loading "C:\Users\ユーザ名\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\torch\lib\shm.dll" or one of its dependencies.
```
でも、指定のパスを確認すると、shm.dllは存在していました。（あるぇ？）

## エラー内容で検索してみたところ
どうも最近修正されたみたいです。
https://github.com/pytorch/pytorch/issues/125109
https://github.com/pytorch/pytorch/pull/125684

なのでいったんStable2.3 をアンインストールし、Previewをインストールし、テストしてみたところ、問題なくテストコードが実行できました。


## 参考にさせていただきました。
https://qiita.com/Bob_Alice/items/7440578f17defa3406b6
[解決済]OpenWrtのluci-proto-ipv6でIPIP6が設定できないじゃないか！💢

:::note info
`luci-proto-ipv6`に加えて`map` `ds-lite` `ip-full`をインストールするとIPIP6が使えるようになったことが24.10にて確認できました。

:::

:::note alert
下記の手順は過去の記録のために残しております。
:::


# 前置きはすっ飛ばして導入手順だけ教えろください！
## 別端末からGitHubでダウンロードして転送、導入する方法
:::note warn
別途IPv4通信出来る端末・回線が必要です
:::

:::note info
事前に`openssh-sftp-server`を導入することをおすすめします
(IPv6のみの環境でもインストールできます)
```bash
opkg update
opkg install openssh-sftp-server
```
:::


[こちらからipip6パッケージをダウンロード](https://github.com/HiraokaHyperTools/openwrt-ipip6)後、SFTPなどで端末に転送し、下記のコマンドを実行してインストールしてください。
```bash
opkg install <パッケージ名> --force-overwrite
```

## ミラーから直接IPv6でダウンロードして導入する方法
:::note info
IPv6のみの環境でもすぐに利用できます
:::

:::note alert
私が独自にCloudflare上に構築したPagesミラーです。
現状のまま提供され、いかなる保証もいたしかねます。
また、サーバに過剰に負荷をかける行為はお辞めください。
:::
下記のコマンドを実行してインストールしてください。
```bash
wget https://openwrtipip6download.pages.dev/ipip6.ipk
opkg install ipip6.ipk --force-overwrite
```

# 事の発端
1. 元のバージョンが22.03.6の最終Stable ext4fsからチマチマrootfsだけ更新してたのでバグバグしてるしふと最新版squashfsにしたくなった(更新も楽だし)
1. とりあえずバックアップしてUbuntuライブ起動してディスク消去してsquashfs版をddする
1. バックアップしたデータを戻して色々足りないパッケージを突っ込む
1. なんか`luci-proto-ipv6`ってのにipip6.jsの競合で邪魔されて[`ipip6.ipk`](https://github.com/HiraokaHyperTools/openwrt-ipip6)が入らねえぞ！👈️ここ
(具体的には`/www/luci-static/resources/protocol/ipip6.js`が衝突している旨が出る)

# 試したこと
1. `luci-proto-ipv6`を消す
    結果→システムタブがソフトウェア以外全部消えた(?)上に多分インターフェース設定もぶっ壊れた
1. [`ipip6.ipk`](https://github.com/HiraokaHyperTools/openwrt-ipip6)の中身を現状と比較して足りない所だけ入れる
    > ipkファイルは7zipで普通に開くことが出来、中身を見ると`control`/`data`/`debian-binary`の3つで構成されている様に見える。
    > dataに関しては`/`配下のディレクトリそのまんまで、`luci-proto-ipv6`で衝突した`ipip6.js`を見比べると目grepした限りでは同じっぽい。それ以外は存在しなかったのでそれが原因か？と思い手で入れてみた。
    
    結果→luci側インターフェースでオプションは出てこなかった
    (多分イニシャライズが足りてないんだろうな～)
1. ファイルをマシンに突っ込んでそれを`opkg install ./ipip6.ipk --force-overwrite`で`luci-proto-ipv6`もろとも合体させる
    結果→成功！！！！やったね！！！！！なお`luci-proto-ipv6`が更新されたらどうなるかは知らん！早くちゃんと組み込め！！！！

# 詰まった所
Q. sftp出来ないんだが？
A. [ここ](https://openwrt.org/docs/guide-user/services/nas/sftp.server)を読みなはれ(OpenWrtに入ってるDropbear SSHサーバはsftp対応してないから別途入れてね)

Q. [ipip6.ipk](https://github.com/HiraokaHyperTools/openwrt-ipip6)をダウンロードしようとしてGitHubを開くとエラーになるんだが？
A. この説明を見ているということは、あなたはIPv6しかない環境(IPoE固定IPとか)かと存じます。
　 GitHubはIPv4しか使えないっぽい(2024/5/11)のでテザリングとか別端末で落としてきて下さい。

Q. squashfsにするとextroot使えないって書いてるし100M位しかないし容量大丈夫なの？
A. [ここ](https://openwrt.org/docs/guide-user/advanced/expand_root)を読みなはれ(一番下のAutomatedをターミナルから叩いて2回くらい再起動すれば勝手に最大サイズまででっかくなります、やったぜ。)
【AWS】S3 Intelligent-Tieringの概要


# はじめに
クラウドストレージを使う上で、コストパフォーマンスは重要な要素です。**Amazon S3 Intelligent-Tiering** は、オブジェクトへのアクセスパターンを自動的に監視し、最適な階層に移動させることで**コストを最小限に抑える**賢いストレージクラスです。

# 自動アクセス階層
S3 Intelligent-Tiering には、以下の3つの自動アクセス階層があります。

### 高頻度アクセス階層
頻繁にアクセスされるオブジェクトに使用され、低レイテンシーと高スループットを提供します。
### 低頻度アクセス階層
**30日間アクセスされないオブジェクトが自動的に移行**されます。高頻度アクセス階層と同等のパフォーマンスを保ちつつ、コストを抑えられます。
### アーカイブインスタントアクセス階層
**90日間アクセスされないオブジェクトが自動的に移行**されます。低レイテンシーと高スループットを維持しながら、さらにコストを削減できます。

# オプションの階層
S3 Intelligent-Tiering には、以下の2つのオプションの階層があります。

### アーカイブアクセス階層
**90日以上アクセスされないオブジェクトを保存するのに最適**で、3～5時間の取得時間でストレージコストを大幅に削減できます。
### ディープアーカイブアクセス階層
**180日以上アクセスされないオブジェクトに適し**ており、取得に12時間以内かかりますが、最もコストを抑えられる階層です。

# 自動階層化の仕組み
オブジェクトが再びアクセスされると、自動的に高頻度アクセス階層に戻されます。これにより、パフォーマンスを損なうことなく、コストを最適化できます。ただし、**128KB未満の小さなオブジェクトは自動階層化の対象外となり、常に高頻度アクセス階層に保存**されます。

# データの保護とアクセシビリティ
S3 Intelligent-Tieringは、**99.9％の可用性**と**99.999999999％の耐久性**を提供するように設計されており、データの保護とアクセシビリティを確保します。

# 最後に
**コスト最適化と高いパフォーマンスを両立させたい場合、S3 Intelligent-Tieringは最適な選択肢**です。アクセスパターンに基づいて自動的に階層を移動するため、**手間をかけずに賢くストレージを管理できます**。ぜひ、S3 Intelligent-Tieringを活用して、クラウドストレージのメリットを最大限に引き出してください。

# 参考

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/intelligent-tiering-overview.html
【初心者向け】スタートアップでのよくある技術スタック


以下の動画の内容を文字化しました。

https://youtu.be/2Ykzq1jTAaM


## 導入
最近の技術スタックの動向とスタートアップでの利用についての解説です。今日は特に、Web系の自社開発企業に焦点を当ててお話しします。

## 開発基礎ツール
まずは、Web系の開発現場の基盤ツールから見ていきましょう。現在のところ、gitとDockerが主流です。gitはソースコードのバージョン管理に欠かせないツールで、多数の開発者が同時に作業する際のコンフリクトを防ぎます。一方、Dockerは開発環境を容易に再現可能にするコンテナ技術で、異なる環境でのバグを未然に防ぎます。

## コミュニケーションとタスク管理
スタートアップでは迅速なコミュニケーションが求められます。そのためには、SlackやNotionなどのツールが重宝されます。これらは日々のコミュニケーションをスムーズにし、プロジェクトの進行状況を一目で把握することができます。

## 使用される主なプログラミング言語
JavaScriptやTypeScriptがフロントエンド開発で主流ですが、バックエンドにはRuby, PHP, Node.jsなどが使用されています。また、PythonやGo言語も特定の場面で重宝されることがあります。特にGo言語は、その実行速度の速さと静的型付けの利点から、大規模プロジェクトでの採用が増えています。

## インフラとクラウドサービス
最後に、現代のスタートアップではほとんどがクラウドサービスを利用しています。AWSやGoogle Cloud Platformなどがあり、これらのプラットフォームを効率よく使用する能力は、スタートアップにおいて非常に価値のあるスキルとされています。クラウドは、サーバーの設定や管理を柔軟にし、スケーラビリティの面で大きなメリットを提供します。

## まとめ
技術スタックは、スタートアップの成功に直接的に影響します。適切なツールや言語の選定は、プロダクトの開発速度や品質を大きく左右するため、これらの技術に精通していることが、市場での競争力を高める鍵となります。今回ご紹介した内容が役立つことを願っています。興味があれば、関連するさらなる学習やキャリアの機会を追求してみてください。

https://youtu.be/2Ykzq1jTAaM
Raspberry Pi 3 A+ に Bookworm をインストール後 apt upgrade で固まる

表題の件は 512 MB しかメモリを持っていない Rapsberry Pi で発生するようで xz がマルチスレッドに対応し apt upgrade 時にメモリが足りなくなるため発生。

この問題に対しては:

1. export XZ_DEFAULTS="--memlimit-compress=512M" と実行してから apt update を実行する。
2. /etc/environment に XZ_DEFAULTS="--memlimit-compress=512M" と書いておく。
3. /etc/dphys-swapfile を編集し swap を 100 MB から 512 MB に増やす (CONF_SWAPSIZE=512)。

などの対策が考えられる。

参考文献:

https://github.com/RPi-Distro/repo/issues/353

[雑談]

Bookworm は Raspberry Pi 4 より前の Raspbery Pi には推奨されないという話もあり。特に理由が無ければ bullseye を使い続けるのが良いのかも。bullseye の End of Life は 2026 年 6 月末とまだ余裕があるし。

https://github.com/raspberrypi/rpi-imager/issues/730
HDMI接続機器の音声をLinuxPCのBTヘッドフォンへ中継するまで

BDプレイヤーを購入した
PCモニタで視聴し、音声はBlueToothヘッドフォンで聞きたい
映像はHDMI切替器経由でPCモニタへ
HDMI音声分離機なるものがあるのを知る。amazonで3000円程のものを購入
HDMI音声分離機にBTヘッドフォンは直接接続できないためPCを経由する
BD>HDMI音声分離機>HDMI切替器>モニタ
　　　　　└>PC>BTヘッドフォン

HDMI音声分離機からPCのLineINへオーディオケーブルを接続
PC側でループバック設定を行う
コマンドラインからpactl list short sources
デバイスの一覧が表示される。

`1       alsa_output.usb-sky_wing_Anker_Soundsync_202011171638200-01.iec958-stereo.monitor       module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED`
`2       alsa_input.usb-sky_wing_Anker_Soundsync_202011171638200-01.mono-fallback        module-alsa-card.c      s16le 1ch 16000Hz       SUSPENDED`
`3       alsa_output.pci-0000_00_1b.0.analog-stereo.monitor      module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED`
`4       alsa_input.pci-0000_00_1b.0.analog-stereo       module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED`
`5       alsa_output.platform-snd_aloop.0.analog-surround-21.monitor     module-alsa-card.c      s16le 3ch 44100Hz       SUSPENDED`
`6       alsa_output.pci-0000_03_00.1.hdmi-stereo.monitor        module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED`

PCのLineINの当たりをつけ（ここでは4番）以下のコマンドを投入
pacmd load-module module-loopback source=4
（機器名指定も可能
pacmd load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo
）
以上で完了。直後は音量調整が必要
設定無効化は以下のコマンド
pacmd unload-module module-loopback
【PHP】PHPフレームワーク「Flow」を試してみる～ViewHelper編～

# 初めに
Flowでは、Fluidというテンプレートエンジンが採用されており、ViewHelperと呼ばれる機能が使えます。今回は、このViewHelperについて解説していきます。

# ViewHelperとは
[こちら](https://qiita.com/nnhkrnk/items/06631a2ac57c6465696b#%E3%82%BF%E3%82%B0%E3%81%AE%E5%AE%9F%E6%85%8B)の記事で、ViewHelperを定義することでHTML内で使える独自のタグを作成することができると紹介しました。今回は、独自のViewHelperを作成してみようと思います。

## 使い方

作り方は簡単です。
以下のような形で書きます。

```php
<?php
namespace Neos\Welcome\ViewHelper;

class TestViewHelper extends \Neos\FluidAdaptor\Core\ViewHelper\AbstractViewHelper
{

    public function initializeArguments() {
        $this->registerArgument('argument', 'string', 'The argument to output', true, 'default value');
      }

    /**
     * @return string
     */
    public function render()
    {
        return 'Hello World! and '.$this->arguments['argument'];
    }
}
```

ポイントは以下です。
* AbstractViewHelperを継承する
* initializeArguments内でViewHelperに渡す引数を定義できる
* render()メソッドを定義し、HTMLで呼び出された際に返す値を定義する

:::note info
registerArgumentメソッドを使うとViewHelperに渡す引数を定義できます。
右から、「変数名」「型」「説明」「必須 / 非必須」「デフォルト値」「スケープの有無」を設定することができます。
:::

HTML側はこんな感じです。

```html
{namespace original=Neos\Welcome\ViewHelpers}
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>単純なHTMLファイル</title>
</head>
<body>
    <p>
        <original:test argument="test"/>
    </p>
</body>
</html>

```

ポイントは以下です。

* 作成したViewHelperの名前空間のエイリアスを定義する
* エイリアスとViewhelper名を使ってタグを定義する
* 設定した引数を記載する

こんな感じで画面に表示されました。
簡単ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/e8bdd8fd-f340-099a-e39e-47e19d82d746.png)


# 使いどころ
具体的な使いどころを一つ紹介します。

## セッションの取得
共通のヘッダーなどで、セッション情報を利用して情報を出しわけたいなどあるかと思います。
その際、セッションをAPIレスポンスで返すのではなく、ViewHelperで定義しておくことで、共通ヘッダーを簡単に作成することができます。

```php
<?php
namespace Neos\Welcome\ViewHelpers;

use Neos\Flow\Annotations as Flow;
use Neos\Welcome\Session\LoginSession;

class SessionViewHelper extends \Neos\FluidAdaptor\Core\ViewHelper\AbstractViewHelper
{

    /**
     * @Flow\Inject
     * @var LoginSession
     */
    protected $loginSession;

    /**
     * @return string
     */
    public function render()
    {
        return 'User ID: ' . $this->loginSession->getUserId() . ' User Type: ' . $this->loginSession->getUserType();
    }
}
```

以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/a843583b-1896-2250-c29f-9d072275b3d2.png)

セッションの使い方はこちらの記事で解説してるので、是非ご覧ください。

https://qiita.com/nnhkrnk/items/1261b62351b05ebcd614



# 終わりに

今回はViewHelperについて解説しました。
FluidのViewHelperは簡単に実装できるうえに、読みみやすいのが良いですね。
バックエンドの人間としては、細かい条件などをPHPで書けるのがうれしいです。

ここまで読んでいただきありがとうございました！