OmniAICreator/Qiita-1.07M huggingface dataset:
reactで何を作る？

# はじめに
この記事は2023年度の振り返りです。

[前記事](https://qiita.com/youfuku/items/d6a6de51ecdc44c7332f)の続きとなります

# 何を作るか？
元々、会議忘れを防止するためにグループウェアのカレンダーをスクレイプして開始時間10分前にボットでつぶやくものを作っていました。
スクレイプする上でログイン認証をしているため、自分で使う分にはいいのですが人に使わせるにはセキュリティの観点からまずいと思い、周りへの配布は避けていました。

ただ、今回フロントをelectronで作る場合、アプリ内にデータを保存できる仕組み(electron-store)があるため、機微な情報は全てアプリに記憶させることでその問題を回避できると判断しました。

# 学習
前回紹介したボイラープレートを利用し、electron-storeを利用したTODOリストの[記事](https://qiita.com/udayaan/items/2a7c8fd0771d4d995b69)がありましたので、こちらを元に学習させていただきました。

# さいごに
今回も短い記事となってしまいました。
ただ、こういった内容で物や仕様がが決まっていったんだと伝わると幸いです。
EPSON Endeavor NP12 をファイル サーバーにしたかった

NP12 をサーバーにしたかった

## スペック
https://faq2.epsondirect.co.jp/qa/Detail.aspx?id=30579
- ATOM 220 という激重くんです
- Linux では Realtek の LAN ドライバの記載が間違えていて別チップに認識して使えないらしい

### メモリ
- 標準メモリは 1GB DDR2-667 (PC2-5300)
  - 公式では 1GB Max だが、2GB は認識するらしいので 2GB に
  - 入っていたのは 1GB DDR2-800(PC2-6400) なので 速いのでもよかったらしい

### HDD
- 標準では 2.5インチ HDD 160GB
  - 安価な KIOXIA の SSD に変更 
  - 他の人がやっているのと異なり、HDD マウンタが固定されていたので、追加でメイン ボードのネジを外す必要あり

## Linux のインストール
10年以上前のマシンで、とりあえず動けばいいので色々試す。

### Debian
- Debian 12.2.0 x86 netinst
  - 内蔵 LAN が認識しない
### Ubuntu
- Ubuntu 22.04.3 Server
  - 内蔵 LAN が認識しない
### antiX Linux
- antiX-23-Full 64bit
  - 内蔵 LAN が認識しない
----
あかんやん。。。
結局 USB LAN をつけて Debian 12.2.0 x64 netinst することに。
後で どっかにしまってある Wi-Fi ドングルにしますかねぇ。。。

## その他
### 結論
- もはや N100 の NUC を買ったほうが早いw
  - ただ、中華製品は常時付けときたくないんだよなぁ...
### モバイル モニタ
- cocopar 13インチだと NO SUPPORT と表示されてしまい、画面が表示されない
- LCD-8000V は大丈夫
VSCodeでよく使うショートカットキー

## はじめに
皆さんはショートカット使っていますか？
エンジニアたるものキーボードからなるべく手を離さずに作業したいものですよね。
ということで今回はVSCodeで特によく使う（と思われる）ショートカットを厳選して紹介したいと思います。
なお、ここに書くのはWindows使用時のショートカットとなります。

## エディタ自体の操作
### [ Ctr + P ]
これがないと生きていけない、というぐらい使う。
入力するとコマンドパレットが開き、ファイル名を入力して選択すればそのファイルを開けます。
断片的にでもファイル名がわかっていればサイドバーから選ぶことはほぼ無くなるでしょう。

### [ Ctrl + F ]
言わずとしれたテキスト検索です。
行数の多いファイルであればあるほど便利。

### [ Ctrl + Shift + F ]
１つ↑のテキスト検索の範囲をワークスペース全体で行うときのショートカット。
調べたいキーワードはわかるけどどこのファイルにあったっけ？的なときに便利。

### [ Ctrl + B ]
サイドバーを開けたり閉じたりするやつ。
コーディング中サイドバー開いてると邪魔になったりしますよね？
こいつを使えば一発で閉じられます。

### [ Ctrl + @ ]
ターミナルを開けたり閉じたりするやつ。
コーディング中ターミナル開いてると邪魔に...（以下同文）

### [ Ctrl + Shift + P ]
コマンドパレット上に「>」が入力された状態でカーソルインします。
ここから拡張機能を使ったり、VSCodeの機能を使ったり、設定画面に移ったりできます。
例えば、「>case」と打つと「小文字に変換」とか「大文字に変換」の選択肢が出てきて、
それを選ぶと選択中の文字列を大文字小文字変換することが可能です。便利！

### [ Ctrl + W ]
タブを閉じる。
タブってどんどん増えていきますよね。

### [ Ctrl + K → Ctrl + W ]
開いている全てのタブを閉じる。
次のタスクに取りかかるときとかに一度全部消してスッキリしたいときにおすすめ。

### [ Ctrl + \ ]
ファイルを左右に分割できます。
長いファイルの上の方を見ながら下の方を書くときなどに便利です。

### [ Ctrl + Alt + →（or ←） ]
開いているタブを分割して右（もしくは左）に持っていけます。
編集するファイルとは別のファイルを見ながら作業したいときに便利。

### [ Ctrl + 数字 ]
１つ↑の[Ctrl + Alt + →]と併用すると便利です。
分割しているエディタにフォーカスすることができます。
例えば、[ Ctrl + 2 ]と押すと2個目の分割にフォーカスします。

### [ Ctrl + Tab ]
開いているタブを選択して移動できます。
順番は前回開いた順になっています。
ブラウザでも使うショートカットなので使いやすい。

## テキスト周りの操作

### [ Ctrl + C （Ctrl + X） ]
言わずとしれたコピー（カット）のショートカット。
もちろん選択範囲をコピーすることもできますが、
何も選択していないときはカーソルのある1行全体をコピーしてくれます。
選択しなくていいの楽。

### [ Shift + Alt + ↑(or ↓)]
カーソルのある行を上下に複製できる。
何気に超便利。

### [ Alt + ↑(or ↓) ]
カーソルのある行を上下に移動できる。
いちいちコピー→貼り付けしなくていいし移動させると楽しい。

### [ Ctrl + Shift + K ]
カーソルのある行を削除する。
いちいち範囲選択しなくて良くて手っ取り早い。

### [ Ctrl + Alt + ↑(or ↓) ]
上下にカーソルを増やせる。
同じ文字を複数行連続で追加したいときとかに便利。

### [ Ctrl + D ]
カーソルをおいている単語全体を選択する。
マウスのダブルクリックのほうが早いかも。

### [ Shift + Alt + H ]
関数の呼び出し階層を開く。
でもCtrl + クリックのほうが早いかも。

## おわりに
ショートカットを覚える方法は繰り返し使うしかないと思います。
VSCode以外のエディタやブラウザなどでも、普段なにげなくマウスで行っている操作を見返して
ショートカットで実行できないか調べてみましょう。
そしてショートカットキーが何か分かれば、どこかにメモるなどして
次に同じ操作をするときはショートカットキーを使って操作するようにしましょう。

慣れないうちは操作が遅くなってもどかしいかもしれませんが、
使えるショートカットが増えていけば間違いなく生産性が向上します。
マウス卒業を目指して頑張りましょう！
CEO ZBET

CEO ZBET - EDUARDO MOROTO doanh nhan co anh huong hang dau gioi ca cuoc.
Dia chi: Tran Nao, P. Binh An, Q2, TP.HCM
Mail:founderzbet@gmail.com
Website:  https://zbet.group/ceo-eduardo-moroto-zbet/  
#ZBET #CEOZBET #FOUNDERZBET #NHACAIZBET #CEOEDUARDOMOROTO
軽深演習 #9 分割



### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 ９日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。


### 前提知識　分割する

圏は、射つまり矢印が重要です。私達は、普段よく矢印をつかっています。そんな矢印にほんの少し、圏論的な発想をすると仕事の効率をあげることができます。忙しい人には朗報です。
仕事術では、人の仕事は断れとか、タスクの優先順位をつけるとか書かれていることが多いです。では、断ったり、タスクの優先順位をつけることができたら、ただ仕事を実行すればいいのでしょうか？　実行時に効率よくすることは大切なんではないでしょうか？　段取り八分仕事二分とよく言われます。段取りは、非常に重要です。[トヨタは、プレスの段取りを数時間から３分にまで劇的に減らしました](https://hajime-i.com/2016/06/28/blog186toyota-setup-plan/) これは、タスクを段取りと実行に分割して、効率をあげています。
```mermaid
flowchart LR
B[段取り]-->C[実行]
```
さらに段取りを仕事とみなせば、段取りの段取りを考えることもできます。図式は、こうです。

```mermaid
flowchart LR
A[段取りの段取り]-->B[段取り]-->C[実行]
```

文章を書くという具体例にこの図式をあてはめてみましょう

```mermaid
flowchart LR
A[テキストエディターvscodeに習熟する]-->B[vscodeを使って文章を考える]-->C[文章を書く]
```

射が１本の場合でなく段取りの段取りという２本の場合を考えるとそれだけで、効率をあげることができるなと思えませんか？
段取りが圏として射として厳密かというと勿論全然違います。圏として段取りを厳密に考えるのは桁違いに難しいです。でも軽深（かるしん　なんちゃって圏論）なので、数学的厳密さは、無視します。矢印をつかって考えるとわかりやすいという意味で、演習　**分割**　を提示します。

### 演習　仕事を段取りと実行に分割すると効率を劇的に改善できます。筆記で文章作成するのと、テキストエディターを使うのとでは生産性に雲泥の差があります。テキストエディターの習熟は時間が少しかかりますが、段取りそのものです。仕事全体の効率を高めてくれます。　あなたが仕事の効率をあげたいと思ったら、どんな段取りに分解するといいでしょうか？　

この仕事には、どんな段取りをすると効率がよくなるかをメモ書きするのは、どうでしょうか？　メモ書きは、段取りの段取りそのものです。段取りの段取りは、なぜか、より汎用性が高いものになります。これが圏論の醍醐味です。
FXトレーディングにおけるAIの重要性とその活用方法

# はじめに
<!-- 発端や概要を記載 -->
私は、FXを初めて１週間の超初心者です。
この記事では、一週間FXをやってみての感想と気づきを書きます。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. FXトレーディングの基本
1. AIとFXの結びつき
1. AIを活用したFXトレーディング戦略


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# FXトレーディングの基本
### FXの基本
FX（外国為替）トレーディングは、通貨の売買を目的とする金融取引の一形態であり、主に外国通貨の価格変動を利用して利益を追求するものです。この市場では、異なる国の通貨同士がペアを形成し、相対的な価値の変動によってトレードが行われます。

### 通貨ペア
通貨ペアは、交換する通貨のペアのことであり、FXにおいて、この二つ通貨の関係が一番重要です。これには、ドル円やユーロドルなど主要なところから、ゴールドや仮想通貨まで幅広くあります。
私は、あまり知らない通貨は怖いので、ドル円、ユーロドル、ゴールドをずっとみてます...
(これら三つは振れ幅が大きいし、通貨交換者が多いので予測しやすい)

<a id="#Chapter2"></a>
# AIとFXの結びつき
### FXは数値の世界
FX市場は、通貨取引ですので、完璧に数値の世界です。
始めて一週間でまず、数字が嫌いになります...
数字が好きな動物ってなんだろう？...そうかAIか！

FXで人間が見ているのは過去のデータです。このデータの傾向によって、買うのか売るのかはたまた待つのかを決めます。

じゃあこの判断を人間よりも数字の得意なAIにやらせたらどうなるのでしょう?

これは、FXをやった人が一度は思うことでしょう。
<a id="#Chapter2"></a>
# AIを活用したFXトレーディング戦略
### FXのAIモデル
　通貨のトレンドや動向予測をするモデルであり、これは世の中にたくさんある。（やっぱりみんな思うことなんだな笑）
 でも、これで成功している人はあまり多くないみたい。
 なんででしょう？

 始めて一週間なりにちょっと考えてみました...
 - 特徴量が間違っている
 - 特徴量が間違っている
 - 特徴量が間違っている

これぐらいしか考えられませんでした。すみません...
でも、これが一番のポイントであることは確かです。

従来のモデルでは、high,low,open,closeを特徴量にしているのがほとんどです。これは、とっても単純で過去のデータを見ています。

しかし、それではダメなのかもしれません。何か誰もやってないような特徴量を使う必要がある。

 ### こんな特徴量はどうか...
 最近、急激な円高になりましたよね？
 その時、私も流れに乗って、稼げました(もっと入れとけばよかった...)
 でも、円高になる前にこうなることは、予想つけれていたような気がします。

普通、投資家たちは、金利差をみます。これまでの円安は、インフレ対策において日米で、日本はマイナス金利の続投、米国は金利の引き上げを行っていたためのものでした。

しかし、12月7日の日銀のお偉いさんが、マイナス金利やめようかな的なことを行ったために、投資家たちは慌ててドルを売り円を買い始めたのですよ。
(他にも、米国のお偉いさんも、利下げしようかなーとか言ってた)
これによって、円高になったんですよね。

ていうことは、過去の為替の動きを見るのでは足りず、最近の会見ニュースやSNSでのお偉いさんの発言をうまく特徴量にしたら、できそうですよね...(超安易に考えています)

# 終わりに
FXとAIをうまく関係付けられたら、不労所得が得られることは間違い無いでしょう。全人類の夢です。この夢に挑戦してみるのもいいのかなとか思い始めた今日この頃でした。

卒研なんかでやろうかな(M先生やりませんか？笑)
再代入不可能なconst変数風味（小ネタ）

# 前書き

この記事は、2023のUnityアドカレの12/10の記事です。
今年は、完走賞に挑戦してみたいと思います。Qiita君ぬい欲しい！

https://qiita.com/advent-calendar/2023/present-calendar#qiita_award

# 再代入不可能なローカル変数

C++やJavaScript、Goなどにはconst変数という機能があり、任意の型のローカル変数に対してconstと修飾することで、その変数を再代入不可能にすることができます。

長いコードの中で、寿命も長い（スコープが広い）変数を扱うとき、うっかりどこかで書き換えられてしまうといったミスを防ぐことができます。

C#には、それらと同等の機能はないのですが、類似機能と、何とか工夫して実現する方法をご紹介します。

# const

最もすぐに思いつくものはconst変数でしょう。C#にも一応const修飾されたローカル変数の機能はあります。

```csharp
const int const_primitive = 0;
const_primitive = 1; // error
```

しかし、これはプリミティブ型（int, floatなど）以外には利用できません。

```csharp
// これはできない
const TimeSpan const_struct = TimeSpan.FromSeconds(0);
const Regex const_class = new Regex(".*");
```

# ref readonly

`ref readonly`は参照先の書き換えを禁止することができます。これは値型（プリミティブ型を含む）だけでなく参照型に対しても利用できます。

```csharp
TimeSpan mutable_struct = TimeSpan.FromSeconds(0);
readonly ref TimeSpan readonly_struct = ref mutable_struct;

Regex mutable_class = new Regex(".*");
readonly ref Regex readonly_class = ref mutable_struct;
```

しかし、書き換え不能なのは参照先だけであり、参照自体を変更することはできてしまうのです。

```csharp
Regex mutable_class = new Regex(".*");
readonly ref Regex readonly_class = ref mutable_struct;
readonly_class = mutable_struct; // error
readonly_class = ref mutable_struct; // 合法
```

# using

using変数は変更できません。

```csharp
using var using_var = new FileStream(".*");
using_var = new FileStream("a.txt"); // error
```

usingの本来の用途は、IDisposableを実装した型のインスタンスを、スコープを抜けたときに自動Disposeするという目的です。

```csharp
{
    using var using_var = new FileStream(".*");
    ...
}
// スコープを抜けたのでusing_var.Dispose()が自動で呼び出される
```

つまり、IDisposable以外の型の変数には使えません。

# Disposableをラップして汎用化する

元の型と相互利用可能なラッパークラスを作ってみます。

```csharp
struct Const<T> : IDisposable
{
    public T Value { get; private set; }
    private Const(T value) => Value = value;
    public static implicit Const<T>(T value) => new Const<T>(value);
    public static implicit T(Const<T> cValue) => cValue.Value;
}
```

このように暗黙のキャストを使うことで、ラップ/アンラップを隠すことができます。

```csharp

using Const<Regex> my_const = new Regex(".*");
my_const = new Regex(".*"); // error

// 自動でアンラップされる
Process("hoge", reg);
static void Process(string text, Regex reg);
```

しかし、メンバを利用したいときはValueにアクセスするしかありません。ライブラリでトークンやハンドラとして提供するような型であればそれでもいいかもしれませんが、これを受け入れてまで再代入不可能に拘りたいかといわれれば、微妙なところです。

```csharp
using Const<Regex> my_const = new Regex(".*");
my_const.Value.IsMatch("hoge"); // メンバを利用したいときはValueにアクセスするしかない
```

# まとめ

結構惜しいところまでは行った気がするのですが、実務で使いたいとは思えませんね…。言語機能としてあってくれると嬉しいですが…

何かいい方法をご存知でしたらコメントいただけましたら幸いです。
Amazon FSx for NetApp ONTAPを複数HAペアでデプロイしてみる(AWS re:Invent2023 recap)

## はじめに
AWS re:Invent2023で"Deep dive on Amazon FSx for NetApp ONTAP scale-out file systems"というセッションがありました。
実際にscale-out file systemsでAmazon FSx for NetApp ONTAP(以下FSx for NetApp ONTAP)の環境を作って、アップデートでできるようになった構成をさらっと見てみたいと思います。

上記セッションはYouTubeで動画が公開されています。

https://www.youtube.com/watch?v=FiSjlvn1B8s

## 1. re:Invent2023で発表されたアップデート概要
従来は**scale-up** file systemsとして、アクティブ/パッシブ構成のサーバによるHAペアを1つのみ作成できました。今回のアップデートで**scale-out** file systemsとして、HAペアを6ペアまで作成できるようになりました。
ユースケースとしては従来のscale-up file systemsのパフォーマンスで足りないようなワークロード、が挙げられます。

現時点では、scale-out file systemsはUS Eastなど一部のリージョンで利用可能で、東京リージョン、大阪リージョンは未対応です。

(参考) Amazon FSx for NetApp ONTAP スケールアウトファイルシステムを発表

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-fsx-netapp-ontap-scale-out-file-systems/

## 2. 実際に作成してみる

米国東部リージョンで`9,216MB/秒(3HAペア、HAペアあたり3,072 MB/秒)`でFSx for NetApp ONTAPをデプロイして、CLIからaggregateを見てみます。aggregateは「物理ディスクの論理セット」([AWS「高可用性(HA)ペア」](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/HA-pairs.html))で、各HAペアに対して1つのaggregateがあります。HAペアが3つの場合、3つaggregateができます。

2つ以上HAペアを作りたい場合、デプロイタイプはシングルAZにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/e1013a89-fd88-18af-57ac-8a06799fe108.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/baa0fe60-f002-8d7c-bbe0-a269e36c9ca5.png)

仮想マシンにボリュームをアタッチして管理エンドポイントにsshします。aggregateを確認(aggr showコマンド)すると3つaggregateが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/9f4b263b-c9aa-c29f-f789-a524f7f7a016.png)

FSxId~-01, 03, 05のノードにaggregateが紐づけられているので、FSxId~-02, 04, 06に再配置できるかな？と思ったのですが、relocationコマンドが見当たらず……そもそもstorage aggregateはshow系のコマンドしか無さそうなので、aggregateの管理はユーザが手を入れるものではなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/cad2320e-a75a-5396-3195-717d5f006090.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/732bb397-a682-1a51-dad3-e37dcb762be8.png)

## おわりに
6HAペア試してみたかったですが、プロビジョンしたスループットキャパシティに対しても課金があるので今回は3HAペアを一瞬作るだけにしました。検証環境があれば性能試験などもやってみたいです。
BlockBenchでマイクラ開発！

## はじめに
[Life is Tech！Advent Calendar](https://qiita.com/advent-calendar/2023/life-is-tech?fbclid=IwAR2UU-Fp4OJHJ3mGiWmmG27TbaIh5LsT5xWfS7maDxe3QSpH8x8N30B2ryE)　11日目を担当します、 
Minecraftメンターのことりと申します🐣
今回は、「Minecraftを使ったプログラミングを始めたい」と思っているみなさんにとって、有益な情報をこちらの記事でご紹介していきたいと思います！


## BlockBenchってなんだ？
マイクラでの開発環境はこの前、けーちゃんがお話ししてくれましたね！詳しくは下の記事を参照してくださいね！
[MinecraftでMODを作る by けーちゃん](https://qiita.com/K__chan/items/ce5fcc514ab16a3d105f)

さてさて！マインクラフトコースでの開発の仕方が理解できたところで、本日の記事の本題に入っていきたいと思います！
今回紹介するのは、BlockBenchです、、！！
マイクラで登場するMod(ゾンビ、ニワトリ、エンダードラゴンなど)の3Dテクスチャを創作できるアプリケーションです！
現在はWeb版、OS版、Linux版の3種類に対応しています！
BlockBenchで書き出したテクスチャは、MinecraftのMOD開発だけでなく、Unityやblenderで使うことも可能です！
とにかく簡単に作れるので、やっていきましょう！

## やること
[BlockBench](https://www.blockbench.net/)を検索！
下の画像が出てくると思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/64a7c479-b62f-4ce7-aff5-1e0b80048d10.png)

OPEN WEB APPをクリック！そうすると・・・？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/2b800143-1fd7-d692-c121-def0b642d21f.png)

このような画面が出てきます！
Modded Entityのタグを押してみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/8ed1dfd8-d952-5de5-04eb-f32d9c79366c.png)

今回はLife is Tech!のマスコットキャラクターでもある、トビスケを作っていきましょう！
マイクラで動くトビスケ、、、どんなものなのでしょうか、、ワクワクっ(≧∇≦)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/63e15537-baba-ef9f-9d03-2901a7251130.png)
File NameをOriginalTobisukeにして、Texture Sizeを64×64にします！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/4624c5a1-9d87-53e1-5f76-90b6c9d419a0.png)
また、左側の画面にTEXTURESがあるので、右側のボタンを押して、textureを生成しましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/8b6676dc-7c93-60ce-d37c-1799a5aa49d3.png)
そうするとこのような画面が出てくるので、Name:original_tobisukeに設定し、Confirmを押しましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/9b310057-3168-a124-e2a7-772cd7ca20a7.png)
Cubeを生成していい感じに配置して、、、色もオリジナリティを加えてトビスケっぽく！
こんな感じでモデリングし終えたら、保存していきましょう！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/45f7f206-b1ca-b3bf-6236-b4ed5f18d2e9.png)
File >> Export >> Export Java Entityで、Javaに書き出すことができます！

この後は、IntelliJにimportしたり、既存の教科書の内容をすこーし書き換えることが必要になっていきます！詳しくは、Life is Tech!のMinecraft教科書を参照してみてね！

さて！ことりの作ったオリジナルトビスケは、果たしてどうなったのかというと、、、？？

![スクリーンショット 2023-12-09 21.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820157/b190b99f-c348-5638-db5c-9cb4fd443604.png)
なんと、、、！！幸せの青い鳥の如く、反映している、、そして可愛い(≧∇≦)
このように、自分で作った3Dモデルを、マイクラに簡単に楽しく繁栄させることができました！
みなさんもぜひ、マイクラで自分の作った3DCGモデルを反映させてみてくださいね！
以上！Minecraftコースのことりの「BlockBenchでマイクラ開発！」でした！
それではみなさん、また次のキャンプでお会いしましょう！🐣
StreamlitはなぜStreamlitという名前なのか

この記事は[KDDI Engineer & Designer Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kddi)の14日目として投稿されたものです。  
このアドベントカレンダーは「KDDIのみんなでTechな記事を書こう！お仕事に関係しても関係なくてもOK！」という企画となっています。  
ちなみに、本記事は私自身のお仕事とは関係ないものです。  

## Streamlitとは

StreamlitはPython向けのWebアプリケーションフレームワークです。  

https://streamlit.io/

Streamlitを使うとフロントエンドの知識ゼロでもデータを可視化するためのWebアプリケーションを簡単に作れます。以下のような機能が特徴。  
- 変数を地の文に書くだけで、GUIに出力される(**マジックコマンド**)
- `st.radio`や`st.text_input`のようなWidget APIを呼び出すだけで、GUIコンポーネントが生成される

## 名前の由来

公式の[ディスカッション](https://discuss.streamlit.io/t/why-is-streamlit-called-streamlit/339)に詳細に記載されています。

https://discuss.streamlit.io/t/why-is-streamlit-called-streamlit/339

要約すると、
- 最初は"Streaml*e*t"と呼んでいた
- ある人が"Streaml*i*t"とミスタイプした
- "lit"が「照らす」を連想するので気に入ってそのままにした
- そもそも"Streaml*e*t"と呼んでいたのは、データをアプリにストリームさせるものという意味でStreamが入っている単語を選んだ

Streamlet 【名】 小川、細流
(引用：[英辞郎](https://eow.alc.co.jp/search?q=streamlet))

lit 【動】 lightの過去・過去分詞形  
(引用：[英辞郎](https://eow.alc.co.jp/search?q=lit))

ある人というのは、Benjamin Bethurum氏だそうです。
2023年現在はMeta社のPrinciple Product Designerだそうで、すごい人だった。
JavaScriptでの全角カタカナを半角カタカナに変換(逆不可)プログラム例

https://qiita.com/advent-calendar/2023/javascript

アドベントカレンダー9日目の記事

# JavaScriptでの全角カタカナを半角カタカナに変換するプログラム例
題名通り。


## 経緯
そもそものやり方を調べた経緯は、職場の人が~~気持ち悪いやり方で~~変換していたため、便利な変換関数がないか調べたのが発端。

**結論**：なかった。
他のプログラミング言語にはあったため、JavaScriptにもあるだろうと思ったのだが、なぜかなかった。
意外だが、よくよく考えれば機種依存であるため、ブラウザ実行言語には不向きなのかもしれないと思うようになった(無理矢理思い込んでいるだけで、機種依存もあまり関係ないように思う)。


## 参考プログラム
職場の人が参考にしたのは、[【データ加工・変換 No.3】半角カタカナ⇔全角カタカナの変換](https://www.solpac.co.jp/Column/Goanywhere/Convert_Lower_Upper_Katakana/)だと思う。

値を返却する末尾に、メソッドチェーン(`.replace(/ﾞ/g, '゛')`や`.replace(/ﾟ/g, '゜')`)を用いているが、これは半角を全角に変換するための処理である。
逆に言えば、全角を半角に特化するだけならば、ここで記述する必要はない。


## 実際の変換プログラム。
題名通り、全角カタカナを半角カタカナに変換するだけのプログラム。

```javascript
function zen2Han(str) {
	const kanaArray = {
		'ガ': 'ｶﾞ', 'ギ': 'ｷﾞ', 'グ': 'ｸﾞ', 'ゲ': 'ｹﾞ', 'ゴ': 'ｺﾞ',
		'ザ': 'ｻﾞ', 'ジ': 'ｼﾞ', 'ズ': 'ｽﾞ', 'ゼ': 'ｾﾞ', 'ゾ': 'ｿﾞ',
		'ダ': 'ﾀﾞ', 'ヂ': 'ﾁﾞ', 'ヅ': 'ﾂﾞ', 'デ': 'ﾃﾞ', 'ド': 'ﾄﾞ',
		'バ': 'ﾊﾞ', 'ビ': 'ﾋﾞ', 'ブ': 'ﾌﾞ', 'ベ': 'ﾍﾞ', 'ボ': 'ﾎﾞ',
		'パ': 'ﾊﾟ', 'ピ': 'ﾋﾟ', 'プ': 'ﾌﾟ', 'ペ': 'ﾍﾟ', 'ポ': 'ﾎﾟ',
		'ヴ': 'ｳﾞ', 'ヷ': 'ﾜﾞ', 'ヺ': 'ｦﾞ',
		'ア': 'ｱ', 'イ': 'ｲ', 'ウ': 'ｳ', 'エ': 'ｴ', 'オ': 'ｵ',
		'カ': 'ｶ', 'キ': 'ｷ', 'ク': 'ｸ', 'ケ': 'ｹ', 'コ': 'ｺ',
		'サ': 'ｻ', 'シ': 'ｼ', 'ス': 'ｽ', 'セ': 'ｾ', 'ソ': 'ｿ',
		'タ': 'ﾀ', 'チ': 'ﾁ', 'ツ': 'ﾂ', 'テ': 'ﾃ', 'ト': 'ﾄ',
		'ナ': 'ﾅ', 'ニ': 'ﾆ', 'ヌ': 'ﾇ', 'ネ': 'ﾈ', 'ノ': 'ﾉ',
		'ハ': 'ﾊ', 'ヒ': 'ﾋ', 'フ': 'ﾌ', 'ヘ': 'ﾍ', 'ホ': 'ﾎ',
		'マ': 'ﾏ', 'ミ': 'ﾐ', 'ム': 'ﾑ', 'メ': 'ﾒ', 'モ': 'ﾓ',
		'ヤ': 'ﾔ', 'ユ': 'ﾕ', 'ヨ': 'ﾖ',
		'ラ': 'ﾗ', 'リ': 'ﾘ', 'ル': 'ﾙ', 'レ': 'ﾚ', 'ロ': 'ﾛ',
		'ワ': 'ﾜ', 'ヲ': 'ｦ', 'ン': 'ﾝ',
		'ァ': 'ｧ', 'ィ': 'ｨ', 'ゥ': 'ｩ', 'ェ': 'ｪ', 'ォ': 'ｫ',
		'ッ': 'ｯ', 'ャ': 'ｬ', 'ュ': 'ｭ', 'ョ': 'ｮ',
		'。': '｡', '、': '､', 'ー': 'ｰ', '「': '｢', '」': '｣', '・': '･',
		'゛': 'ﾞ', '゜':  'ﾟ',
	};

	const string = Object.keys(kanaArray).join('|');
	const reg = new RegExp(`(${string})`, 'g');
	return str.replace(reg, (_, match) => {
					return kanaArray[match];
				});
}

console.log('変換結果：' + zen2Han('パイポ・パイポ・パイポのシューリンガン、シューリンガンのグーリンダイ、グーリンダイのポンポコピーのポンポコナーのブゥードゥー') );		// ﾊﾟｲﾎﾟ･ﾊﾟｲﾎﾟ･ﾊﾟｲﾎﾟのｼｭｰﾘﾝｶﾞﾝ､ｼｭｰﾘﾝｶﾞﾝのｸﾞｰﾘﾝﾀﾞｲ､ｸﾞｰﾘﾝﾀﾞｲのﾎﾟﾝﾎﾟｺﾋﾟｰのﾎﾟﾝﾎﾟｺﾅｰのﾌﾞｩｰﾄﾞｩｰ
console.log('変換結果：', zen2Han('フ゜ート゜ゥ゜ー') );	// 変換結果： ﾌﾟｰﾄﾟｩﾟｰ
console.log('変換結果：' + zen2Han('フ゛ート゛ゥ゛ー') );	// 変換結果：ﾌﾞｰﾄﾞｩﾞｰ
```

一方向にするだけで、だいぶプログラム量が減る。
今回の変換方法をchatGPTで質問したが、なぜか文字コードを範囲指定するなど機種依存のプログラム結果を出してくるため、使い物にならない。
私の環境では意図した変換をしてくれなかった。
むぅ。無償利用では専門技術を提供してくれないようだ。
世の中金だな。

## 今後
いろいろ技術力を身につけたくて、、、kickstarterで出資者を募っていたため、学習教材に手を出してしまった。
そして、それ以外にも数十件のプロジェクトに支援していたのだが、それらが昨日キャンセルされてしまった。
しかも、なぜか私がキャンセルしたことになっている。
何が原因か分からないが、このままではプロジェクト(支援可能期間)が終わってしまう。
キャンセルしていないのにキャンセルしたことになっており、大変悲しい。
むぅ。

ということで、手に入れたものらは活用していこうと思う(金の力)。
あぁ。まさか、こんなものに手を出すことになろうとは・・・(文化と言葉の壁に阻まれ、活用できずじまい)。

ちなみに、最近は、[Drogo's Shanties](https://soundcloud.com/d-r-o-g-o/sets/drogos-shanties)(サウンドクラウドサービス)を聞きながら~~勉強~~ネットサーフィンもとい、勉強内容の収集をしている。

以上。
mindの研究 その43

# 概要
mindが、謎なので調べてみた。
練習問題、やってみた。

# 練習問題
真理値表を表示する、インタープリタを書け。

# サンプルコード

```
コードは　40個の　文字列。
コード数は　変数。
in数は　変数。
out0数は　変数。
out1数は　変数。

wは　構造体
　セルは　変数
　列は
　　８個の　セル
　全体は
　　8個の　列
。

アセンブラとは
　コード（コード数）に　入れ
　コード数に　１を　加えて　コード数に　入れる
。


RUNとは
　文字列１は　文字列
　単語1は　文字列
　単語2は　文字列
　単語3は　文字列
　単語4は　文字列
　数１は　変数
　数２は　変数
　ｋは　変数
　ｌは　変数
　合否は　変数
　ｎは　変数
　wを　クリア
　ｎに　１を　入れ
　ここから
　　もし　ｎが　コード数より　大きい
　　ならば
　　　終り
　　つぎに
　　コード（ｎ）を　文字列１に　入れ
　　文字列１から　単語切り出し　単語1に　入れ
　　文字列１から　単語切り出し　単語2に　入れ
　　文字列１から　単語切り出し　単語3に　入れ
　　文字列１から　単語切り出し　単語4に　入れ
　　もし　単語1が　「stop」に　等しい文字列
　　ならば
　　　打ち切り
　　つぎに
　　もし　単語1が　「make」に　等しい文字列
　　ならば
　　つぎに
　　もし　単語1が　「in」に　等しい文字列
　　ならば
　　　セル(1，1)に　0を　入れ
　　　セル(1，2)に　0を　入れ
　　　セル(1，3)に　1を　入れ
　　　セル(1，4)に　1を　入れ
　　　セル(2，1)に　0を　入れ
　　　セル(2，2)に　1を　入れ
　　　セル(2，3)に　0を　入れ
　　　セル(2，4)に　1を　入れ
　　つぎに
　　もし　単語1が　「out」に　等しい文字列
　　ならば
　　つぎに
　　もし　単語1が　「and」に　等しい文字列
　　ならば
　　　単語4を　数値変換し　数1と　合否に　入れる
　　　4を　回数指定して
　　　　回数を　lに　入れる
　　　　セル(1, l)と　セル(2, l)を　andして　セル(数1, l)に　入れ
　　　繰り返す
　　つぎに
　　もし　単語1が　「or」に　等しい文字列
　　ならば
　　　単語4を　数値変換し　数1と　合否に　入れる
　　　4を　回数指定して
　　　　回数を　lに　入れる
　　　　セル(1, l)と　セル(2, l)を　orして　セル(数1, l)に　入れ
　　　繰り返す
　　つぎに
　　もし　単語1が　「xor」に　等しい文字列
　　ならば
　　　単語4を　数値変換し　数1と　合否に　入れる
　　　4を　回数指定して
　　　　回数を　lに　入れる
　　　　セル(1, l)と　セル(2, l)を　xorして　セル(数1, l)に　入れ
　　　繰り返す
　　つぎに
　　もし　単語1が　「disp」に　等しい文字列
　　ならば
　　　「1 2 3 4」を　一行表示し
　　　4を　回数指定して
　　　　回数を　kに　入れる
　　　　4を　回数指定して
　　　　　回数を　lに　入れる
　　　　　セル(l, k)を　数値表示し
　　　　　「 」を　表示し
　　　　繰り返す
　　　　改行し
　　　繰り返す
　　つぎに
　　ｎに　１を　加えて　ｎに　入れる
　繰り返す
。

メインとは
　コードを　クリアし
　1を　コード数に　入れ
　「make 4」を　アセンブラし
　「in 1 2」を　アセンブラし
　「out 3 4」を　アセンブラし
　「and 1 2 3」を　アセンブラし
　「xor 1 2 4」を　アセンブラし
　「disp」を　アセンブラし
　「stop」を　アセンブラし　RUNする。





```

# 実行結果

```
>sinri
1 2 3 4
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

```

# アセンブラの説明

- make 4 
4列の真理値表を宣言。
- in 1 2
入力は、1列と2列
- out 3 4
出力は、3列と4列
- and 1 2 3
1列と2列をandして3列に
- xor 1 2 4
1列と2列をxorして4列に
- disp
真理値表を印字

以上。
【Elixir】 with式使った事ない人が読む記事。アンチパターン付

# 使い方

二つの条件が成り立った場合に処理したいとき、普通に書くと二重のcase文になります。

```Elixir
def area(opts) do
  case Map.fetch(opts, :width) do
    {:ok, width} ->
      case Map.fetch(opts, :height) do
        {:ok, height} -> {:ok, width * height}
        :error -> :error
      end

    :error ->
      :error
  end
end
```

これを纏めて書けるのがwith式でした。

```Elixir
def area(opts) do
  with {:ok, width} <- Map.fetch(opts, :width),
       {:ok, height} <- Map.fetch(opts, :height) do
    {:ok, width * height}
  end
end
```

使いたい時あるかも。

# アンチパターン

with式はelse分を使ってエラーになった時の値を書き換える事ができます。

```Elixir
def open_decoded_file(path) do
  with {:ok, encoded} <- File.read(path),
       {:ok, decoded} <- Base.decode64(encoded) do
    {:ok, String.trim(decoded)}
  else
    {:error, _} -> {:error, :badfile}
    :error -> {:error, :badencoding}
  end
end
```
{:error, _} を返した場合は、{:error, :badfile}を返す
:errorを返した場合は、{:error, :badencoding}を返す

File.readは、エラーの場合、{:error, _}を返すので、:badfile
Base.decode64(encoded) はエラーの場合、:errorを返すので、:badencoding

おお。これは、ちょっと気持ち悪い。
エラーが発生した場所と、戻り値の対応が力業な記述になってます。
一見しただけでは、動作が読み取れません。

将来的に、withの中に別の処理を加えたり、返値の型が変わったら大変な事になります。

次のように書くのがおすすめです。
```Elixir
def open_decoded_file(path) do
  with {:ok, encoded} <- file_read(path),
       {:ok, decoded} <- base_decode64(encoded) do
    {:ok, String.trim(decoded)}
  end
end

defp file_read(path) do
  case File.read(path) do
    {:ok, contents} -> {:ok, contents}
    {:error, _} -> {:error, :badfile}
  end
end

defp base_decode64(contents) do
  case Base.decode64(contents) do
    {:ok, decoded} -> {:ok, decoded}
    :error -> {:error, :badencoding}
  end
end
```

else文の使い道を間違えないようにしましょう。

説明のプログラムは、hexdocsの説明のプログラムから引用しました。

本家の説明
https://hexdocs.pm/elixir/1.16.0-rc.0/Kernel.SpecialForms.html#with/1
https://hexdocs.pm/elixir/1.16.0-rc.0/code-anti-patterns.html#complex-else-clauses-in-with
【解決】Windows側のminikubeクラスターにWSL2からアクセスしたい

# 背景

以下のコマンドをコマンドプロンプトから実行し、Windows側にノード6つのMinikubeクラスターを作成した。

```
minikube start --nodes 6
```

しかしWSL側から`kubectl config view`を確認しても当該クラスターの情報が見つからなかった。

# アクセスできない原因

kubeconfig(`~/.kube/config`)がWindows側とWSL2側で分かれていて、WSL2側に認証情報が含まれていないため。

# 作業手順

Windows側のkubeconfig(`kubectl config view`)の値を参照しながらWSL側のkubectlでkubeconfigを設定していく。

Windows側のkubeconfigの値は以下の通り。

```yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority: C:\Users\matoruru\.minikube\ca.crt
    extensions:
    - extension:
        last-update: Sat, 09 Dec 2023 09:06:48 JST
        provider: minikube.sigs.k8s.io
        version: v1.32.0
      name: cluster_info
    server: https://127.0.0.1:59528
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Sat, 09 Dec 2023 09:06:48 JST
        provider: minikube.sigs.k8s.io
        version: v1.32.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: C:\Users\matoruru\.minikube\profiles\minikube\client.crt
    client-key: C:\Users\matoruru\.minikube\profiles\minikube\client.key
```

この設定値の内、以下の値を確認する。

- clusters[].cluster.certificate-authority (**C:\Users\matoruru\.minikube\ca.crt**)
- clusters[].cluster.server (**https://127.0.0.1:59528**)
- contexts[].context.cluster (**minikube**)
- contexts[].context.user (**minikube**)
- users[].name (**minikube**)
- users[].user.client-certificate (**C:\Users\matoruru\.minikube\profiles\minikube\client.crt**)
- users[].user.client-key (**C:\Users\matoruru\.minikube\profiles\minikube\client.key**)

これらの値を使って以下のコマンドを実行する（Windowsのパス`C:\`をWSLのパス`/mnt/c/`に置き換えている点に注意）。

## ユーザ設定

```
kubectl config set-credentials minikube --client-certificate /mnt/c/Users/matoruru/.minikube/profiles/minikube/client.crt --client-key /mnt/c/Users/matoruru/.minikube/profiles/minikube/client.key
```

## クラスタ設定

```
kubectl config set-cluster minikube --certificate-authority /mnt/c/Users/matoruru/.minikube/ca.crt --server https://127.0.0.1:59528
```

## コンテキスト設定

```
kubectl config set-context minikube --cluster minikube --user minikube
```

最後に、以下のコマンドで現在のコンテキストを設定しなおしてノード情報を確認してみます。

```
> kubectl config use-context minikube 
Switched to context "minikube".
```

```
> kubectl get nodes
NAME           STATUS   ROLES           AGE     VERSION
minikube       Ready    control-plane   7h48m   v1.28.3
minikube-m02   Ready    <none>          7h47m   v1.28.3
minikube-m03   Ready    <none>          7h46m   v1.28.3
minikube-m04   Ready    <none>          7h46m   v1.28.3
minikube-m05   Ready    <none>          7h45m   v1.28.3
minikube-m06   Ready    <none>          7h45m   v1.28.3
```

アクセス設定完了です！今後はWSL2側の`kubectl`コマンドからWindows側のクラスターを操作できます。

# 補足

minikubeの再起動後に再度WSL側からアクセスできなくなることがあります。この場合はminikubeクラスターのIPが変更されているので、もう一度Windows側のkubeconfigを確認して[クラスター設定](#クラスター設定)をやり直してみてください。
Laravel10でシンボリックリンクを設定したのにstoreageに保存した画像が表示されない

## 環境
- Xserver
- Laravel10
- docker
## 原因
原因として二つあります。一つは、うまくシンボリックリンクが上手く設定されていない。
二つ目が一番考えられる原因なのですが、パーミッション(権限)が設定できていないです。
## 確認
### シンボリックリンクの設定確認
まずはデプロイ元ののファイルを確認しましょう。
接続したsshに移動して、
```:サーバーID
cd サーバーID.xsrv.jp/プロジェクトファイル名/public
```
lsコマンドでパブリックファイルの中身を確認します
```:public
ls
```
下記画像でstorageが青色だった場合は正常に設定されています。
確か正常に設定されていなかったら、赤色で点滅してたはずです、、
![スクリーンショット 2023-12-09 20.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627919/9bc35af0-213d-60d7-d96d-2f91b124c933.png)
赤く点滅してた場合は、シンボリックリンクを一度削除してもう一度設定し直してください
### パーミッションの確認
storageファイルまで移動します。
```:サーバーID
cd サーバーID.xsrv.jp/プロジェクトファイル名/public/storage
```
画像を保存しているファイルを確認します。
```:storage
ls -l
```
保存先のファイル名の権限が
`drwx----- 2
`
となっていたら画像参照権限が制御されていますので、権限を変更します
```:storage
chmod 755 画像保存先ファイル名
```
これで画像が表示されるはずです。お疲れ様でした！
ソフトバンクのシンプルスマホ６（A201SH）を格安SIMで利用する場合の設定

ソフトバンクのシンプルスマホ６（A201SH）を格安SIMで利用する場合の設定です

SIMフリーなので基本的にそのままで利用できるはずですが、
いろいろあったので備忘録としてメモしておきます。

- APN設定
大手の通信業者は、そのまま使えるたりプロファイルを設定する方法もあるかもしれません。
私の場合、日本通信だったのでAPNによる設定でした。
「設定」アプリを起動、一番下の「すべてを見る」
→「ネットワークとインターネット」
→「モバイルネットワーク」
→「アクセスポイント名」
「APN」画面で右上の「メニュー」ボタンを押し「新しいAPN」を押し、
通信業者の指定する値を設定後、「メニュー」ボタンを押し「保存」を押して保存させる。
その後、作成されたAPNが表示されるので選択状態にしたあと再起動。
選択できない場合、再起動すれば選択できる。

- SMSアプリの設定
SMSプリインストールされているメールアプリに割り当てられているが、
ソフトバンク以外のSIMだとこのアプリは使用できないため、別のアプリに割り当てる。
「設定」アプリを起動、一番下の「すべてを見る」
→「アプリ」
→「デフォルトのアプリ」
→「SMSアプリ」
「メール」が選択されているが。「メッセージ」に変更する

いまのところこれくらいでしょうか？
気が付いたことがあれば、追記します。
楽しい Xit AirBox

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/a16b4574-2a0b-5fcc-98f4-56dd107a69ce.png)

# はじめに

嬉しいのか、嬉しくないのか、年末に向かってどんどん忙しくなり、なかなかゆっくりとテレビを見る時間がとれなくなっていました。
録画した番組を見ようにも、リビングは家族に独占されていて、なかなか自分の撮り溜めした番組を見ることができません。
自分の部屋にはテレビのアンテナ線が装備されてはいるものの、テレビを設置するスペースもテレビを買うお金もありません涙

# パソコンやスマフォでテレビが見えるようになりました！

そんな中、色々と調べていると、テレビを見るだけでなく録画もでき、さらにスマフォからもみれる(テレビも録画も)製品を見つけました。それは、Xit AirBoxという製品です。
私がAmazonで購入したタイミングでは、¥18,000円でしたが、今見ると、¥16,964円とさらにお安く購入可能です。

この製品は、Windows,iOS, Androidの他に、MacOSにも対応しています。Macユーザーの私にとっても嬉しい限りです。

起動するとこのような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/51518a01-d503-49ee-b9fd-cf596a30f3c3.png)

* 自宅

通常はこちらを使ってテレビを見ます。

* 外出先(全ての機能)

外出中はこちらを使ってテレビを見ます。外出先でも自宅のチューナーに繋いでテレビが見れるんですよ。これって便利です。

* 外出先(録画予約)

外出中に外出先から録画したいテレビを予約できます。なんて便利なのでしょう。

:::note warn
実際のテレビが表示されている画面のスクリーンショットを取得しようとしたところ、エラーが発生して取得できませんでした。著作権の問題だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c621e2eb-0e63-8b58-60ad-84f3ab4b7ab3.png)
:::

# 終わりに


* 仕事で忙しくテレビを見る時間がないあなた
* テレビを家族に占有されてなかなか自分の見たい番組が見れないあなた
* 移動時間にスマフォでテレビを見たいあなた

# 参考

https://shop.pixela.jp/items/74783813
C++23便利機能の紹介：byteswap関数

C++23標準ライブラリでは「バイト単位での順序入れ替え」を行う関数テンプレート [`std::byteswap`][ref-byteswap] が追加されました。

C++20機能を利用した[エンディアン][endian]判定([`std::endian`][ref-endian])と組み合わせて、整数型の[ネットワークバイトオーダー][nbo] ⇔ ホストバイトオーダー変換を汎用的に記述できます。

[ref-byteswap]: https://cpprefjp.github.io/reference/bit/byteswap.html
[ref-endian]: (https://cpprefjp.github.io/reference/bit/endian.html
[endian]: https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
[nbo]: https://www.jpcert.or.jp/sc-rules/c-pos39-c.html

```c:POSIX.1-2001
// <arpa/inet.h>ヘッダ
uint32_t htonl(uint32_t);
uint16_t htons(uint16_t);
uint32_t ntohl(uint32_t);
uint16_t ntohs(uint16_t);
// WindowsOSは<winsock.h>ヘッダで同等関数を宣言
```

```c++:C++23
#include <bit>
#include <concepts>

template <std::integral T>
constexpr inline T hton(T value) noexcept
{
  if constexpr (std::endian::native == std::endian::little) {
    return std::byteswap(value);
  } else {
    return value;
  }
}

template <std::integral T>
constexpr inline T ntoh(T value) noexcept
{
  if constexpr (std::endian::native == std::endian::little) {
    return std::byteswap(value);
  } else {
    return value;
  }
}
```

これでもう64ビット幅整数のバイトスワップ関数[^1]を探す必要もなくなり、将来に備えて128ビット幅整数（要る？）のバイトスワップ処理だって簡単に書けちゃいます！

[^1]: `htonll`/`ntohll`, `bswap_64`, `_byteswap_uint64`, etc...


# EXTRA STAGE
:::note warn
以降は [onihusube🍄さん](https://twitter.com/onihusube9/status/1735231299164717213) からの<del>鋭い指摘</del> 追加ネタご提供をもとに追記した内容です。寂しかった記事を増強させるきっかけを頂いたことに感謝。
:::

この世の中にはリトルエンディアン／ビッグエンディアンどちらでも無い、独自の [エンディアン][endian] をもつアーキテクチャが存在するそうです。例えば往年の [PDP-11][pdp11] とか。

C++標準ライブラリはこの点を考慮した仕様となっており、`std::endian::native`は`std::endian::little`, `std::endian::big`いずれでもない処理系定義の値をとる可能性があります。さすが俺たち／私たちのC++！！

[endian]: https://en.wikipedia.org/wiki/Endianness
[pdp11]: https://ja.wikipedia.org/wiki/PDP-11


```c++:C++23
#include <bit>
#include <concepts>

template <std::integral T>
constexpr inline T hton(T value) noexcept
{
  if constexpr (std::endian::native == std::endian::little) {
    return std::byteswap(value);
  } else if constexpr (std::endian::native == std::endian::big) {
    return value;
  } else {
    static_assert(false, "Unknown endianness");
  }
}

template <std::integral T>
constexpr inline T ntoh(T value) noexcept
{
  if constexpr (std::endian::native == std::endian::little) {
    return std::byteswap(value);
  } else if constexpr (std::endian::native == std::endian::big) {
    return value;
  } else {
    static_assert(false, "Unknown endianness");
  }
}
```

:::note info
else節の `static_assert(false, "...");` が気になったあなた。かなりC++にお詳しいですね？確かに以前のC++仕様ではこの書き方だとconstexpr if文の分岐状況によらずコンパイルエラーを引き起こしていました。2023年12年現在では [プログラマの意図通りに振る舞うよう修正](https://yohhoy.hatenadiary.jp/entry/20230220/p1) されています。ちゃんとユーザフレンドリに進化してるんですね〜
:::


## 関連情報
- [P1272R4 Byteswapping for fun&&nuf](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1272r4.html)
- [P0463R1 endian, Just endian](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0463r1.html)
- Stack Overflow, [Integer Byte Swapping in C++](https://stackoverflow.com/questions/3916097/)
【Android】RatingBar使ってみた【Kotlin】

# 実践


```php:activity_main.xml
    <RatingBar
        android:id="@+id/rating_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />        
```
xml側はそのままRatingBarとして設定できます。

以下は　使えるメソッドを紹介します。

        val ratingBar : RatingBar = findViewById(R.id.rating_bar)

変数に設定した上で

# numStars
評価の最大数を決めることができます。

        ratingBar.numStars = 6

とすると評価の最大数を設定できます。
初期値は５が設定されているようです。

xml側では

        android:numStars="100"


ここを設定する時の注意点として、Viewの横幅が評価の最大数が入りきらない場合はその分しか表示できません。
例えば、星二つ分の Viewサイズの場合は星二つまでしか表示されません。
逆にViewは横幅いっぱいにしていても、100など大きすぎる数を入れた所星の数が表示しきれなくなってしまいました。

# Indicator
評価バーをユーザーが変更できるかどうかを設定できます。

        ratingBar.setIsIndicator(true)


xml側では   

        android:isIndicator="true"

trueがユーザーが変更不可、falseが変更可能


また、現在が変更できる状態なのか否かもわかります。

        ratingBar.isIndicator


# rating
評価の初期状態を決めることができます。

        ratingBar.rating = 1.5F
型はFloatで指定します。
また、小数点第一まで指定することができます。



xml側では

        android:rating="1"


# stepSize
評価の段階を設定できます。

        ratingBar.stepSize = 1.2F

このように小数点でも指定できます。

１段階で1.2分動きます。

xml側では　


        android:stepSize="1.2"

# setOnRatingBarChangeListener
評価の変更を検出することもできます。

        ratingBar.setOnRatingBarChangeListener()

# progressTintList
星の色の指定ができます。

        ratingBar.progressTintList = ColorStateList.valueOf(Color.BLACK)

デフォルトでは黄色っぽい色が設定されています。




# 参考

https://akira-watson.com/android/ratingbar-2.html#1

https://developer.android.com/reference/android/widget/RatingBar#attr_android:numStars
ウォームアップ/クールダウン

### ウォームアップ
- 起動指示したインスタンスを、メトリクスに入れない期間。
- ステップスケーリングで、次々に起動指示が来たとき、差分だけ追加する
- デフォルト300s

### クールダウン
- 起動指示が来たとしてもインスタンスを起動させない期間。
- 1つめの起動はしてるのに時間がかかる場合への対応
Raspberrry Pi Zero で OS がクラッシュする CPU動作クロック早すぎ問題

Raspberrry Pi Zero, Raspberrry Pi Zero W で Raspberry Pi OS がクラッシュする.

クラッシュやら Kernel Panic する場所が一定しない。

とにかく動作が不安定である。それも1台だけではない。複数台。





Raspberry Pi Zero W のCPU Broadcom BCM2835 は 1GHz で動作する仕様となっているようですが、実際問題 1GHz で動作させようとすると 動作が不安定で Kernel Panic など "クラッシュ" がたびたび発生して、使い物になりません。

昔の Raspberry Pi OS  10 (buster) の頃は、こんな事なかったような気がしますが、 11 (bullseye) では少なくてもこのような状況です。

このような理由からクロックを落として使用すれば解消されます。

SDメモリカードの `/config,txt` を編集して `arm_freq=800` みたいに周波数を設定します。

![clock800mhz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310537/bdd57c66-0e12-b50d-534a-ca211826eaf7.png)

この例では 800MHz で動作します。(とおもいきや 実際には PLLなどの仕様上の理由で 700MHz あたりで動作するっぽいです)


クロックの測定は `vcgencmd measure_clock arm` で測定でき、確認できます:
~~~
$ vcgencmd measure_clock arm
frequency(45)=700000000
~~~



 これにより、何台も使っている Raspberrry Pi Zero クラッシュ (Kernel Panic) を起こすことはなくなりました。
while True の備忘録

## はじめに
while Trueの備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇

私は今回、サーバーからのレスポンス待ちをする際に利用しました。

## 🦁 結論 🦁
:::note info
押さえておくべき点
* while文は条件を満たすあいだはループを繰り返す。
* ループの途中で別の条件が満たされた場合には「break」を使うことでループ処理を抜ける（処理待ちのときに使う（レスポンスを待つ、ユーザーからの入力待ち、イベント発生待ちなど）
* continueは通常は不要であるが，指定された条件が真の場合には何もしないで，ループ処理を繰り返す
* ループ処理の最後に指定されたelse句はループ処理の最後に実行される
:::

:::note warn
注意点
* 無限ループのため大容量の処理などをする時には負荷を軽減したりするためのコントロールが必須（スリープ処理、最大待ち時間の設定など）
:::


## 基本構文
```python:sample.py
while 条件:  # 条件が満たされる間,以下を繰り返す（場合によっては True を指定する(無限ループ）こともある 
    if 別の条件: # while ループを終了すべき何らかの条件をチェックする
        # 必要な処理を実行後
        break  # ループを抜ける
    # それ以外の場合の処理（これこそが主要な処理)
```


```python:sample.py
import time

# 最大待機時間と待機間隔（秒）
MAX_WAIT_TIME = 180
POLL_INTERVAL = 10

start_time = time.time()  # ループ処理を開始する直前の時間

while True:
    # ここでサーバーからのレスポンスをチェックする仮想的なコード
    # response = check_server_response()
    response = {"status": "RUNNING"}  # 仮のレスポンス

    if response["status"] == "SUCCEEDED":
        # 条件が満たされた場合の処理
        print("処理成功: サーバーからのレスポンスがSUCCEEDEDです。")
        break  # ループを抜ける
    elif response["status"] == "RUNNING":
        # RUNNING状態では、待機せずに次のイテレーションへ
        print("処理中: サーバーからのレスポンスがRUNNINGです。")
        continue  # 待機スキップ
    else:
        print("未知のレスポンス: ", response["status"])
        # 未知のレスポンスの場合は、一定時間スリープ
        time.sleep(POLL_INTERVAL)

    # タイムアウトのチェック
    if time.time() - start_time > MAX_WAIT_TIME:
        print("タイムアウト：処理が完了しませんでした。")
        break
    # ループごとに実行されることの記述
    # 今の場合は，「何も実行しない」
```
## 具体例の解説
ifによって作られた条件分岐をいくつか作ることによって「break」をループ処理（待機処理など）を完了させるものとループ処理をし続けるものを条件分岐できる。

### ①のif
statusが「SUCCEEDED」になったから、特定の処理をして実行して「ループ処理を抜ける」

### ②のif（elif）
サーバーからのレスポンスにあるstatusが「RUNNING」になってるので特定の処理を実行して「ループ処理継続」
continueにてその後の処理をスキップしてループ処理に戻る。

### ③のif
最大の待機時間を設定して超えてしまった場合、特定の処理を実行して「ループ処理を抜ける」

### それ以外
何もしないで，次を待つ


## timeの補足
:::note info
押さえておくべき点
* time.time() は現在の時刻をUNIXエポック（1970年1月1日からの経過秒数）で返す
* start_time は、ループを開始する前に設定された時刻（同じくUNIXエポックでの秒数）
* MAX_WAIT_TIME は、待機する最大秒数
:::
Elixir case文にwhenが使えるって知ってた？

case文って固定値との比較しかできないと思ってました。

マニュアルによると、Guard節がcase文で使えると書いてある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/8442abc6-0f3c-58ed-98a9-725c22b8b80d.png)

```Elixir
defmodule Elixir101 do
  @doc """

  ## Examples

      iex> Elixir101.sample1(3)
      "two-ten"

  """
  def sample1(n) do
    case n do
      1 -> "one"
      _ when n <= 10 -> "two-ten"
      _ -> "over ten"
    end
  end
end
```

使えました。

参考
https://hexdocs.pm/elixir/1.16.0-rc.0/patterns-and-guards.html#guards
エンジニアの口癖5選

## はじめに
未経験からエンジニアに転職して、3ヶ月が経過しました。
会話する中で、よく使われている言葉に気がつきました。
これまでの人生では聞き慣れない言葉です。
個人の口癖というよりも、エンジニアの口癖のような気がしたので、まとめてみます。

初めて聞くと理解できないかもしれないので、予習していただくためにこの記事を書きました。
未経験でエンジニアに転職する方の参考になれば嬉しいです。

### 自己紹介
私は2023年9月1日にフロントエンドエンジニアとして自社開発のSaaS企業に入社しました。
未経験独学で、薬剤師からの転職です。
詳しくはこちらをご覧ください。
[未経験独学で自社開発企業へ〜薬剤師からのエンジニア転職記〜](https://qiita.com/odendayoko/items/f616b2f1952897a9af5d)

## エンジニアの口癖５選
### 第5位　「そもそも」
接続詞で、改めて説き起こすときに用いる語です。
「そもそも人間というものは」などと使われますね。
これは一般的にもよく使われていると思った方も多いと思います。

ただ、エンジニアがよく使う「そもそも」は発音が違います。
一般的な発音は、「そ↑もそも」と冒頭にアクセントが来ますが、エンジニアの発音は「そもそも↑」と尻上がりにアクセントが入ります。
多分方言の違いとかではないと思います。
発音なんてどうでもいいだろ！って突っ込まれそうですね😇
#### 例文
- このタスクって**そもそも**なんでやることになったんだっけ？
- **そもそも**この処理はこの関数でやらせるべきじゃないよね

### 第4位　「よしなに」
いい具合になるように。適切に。という意味の言葉です。
これ、本当にエンジニアになるまで１度も聞いたことがありませんでした。
入社して初めて聞いた時は、意味がわからなくて調べました笑

エンジニア用語というよりはビジネス用語みたいです。
薬局で働いていたから聞いたことがなかっただけかもしれません。
依頼する時によく使われます。
#### 例文
- よしなにお願いします

### 第3位　「おまじない」
これ、実は正確な意味がわからないのですが、ニュアンスとしては「後でわかるので気にしないで」「一旦スルーして」という意味で使われていると思います。
呪術などの「おまじない」の意味ではありません。

Reactのラーニング中、よくメンターさんから言われていました。
おまじない？？？何を祈るの？？？と最初は思っていました笑
初めて聞く人には伝わらなさそうですね。
#### 例文
- ここ難しいから、一旦おまじないで！

### 第2位　「抽象度」「抽象化」
抽象度という言葉は元々は分析哲学用語で、「情報量の大小の度合い」を表す言葉だったそうです。
これがなかなか難しい概念でして…
物事を「大きな視点で俯瞰的に捉える」ことで「全体の構造を把握する」ために「抽象化」が必要だそうです。

プログラミングの考え方にも抽象化は必要みたいです。
なんとなく響きがかっこいいので、日常から使えるとカッコ良さそうです。
#### 例文
- もうちょっと抽象度をあげて考えてみよう
- 抽象化して考えるとわかりやすいよ

### 第1位　「本質」
１日に何回聞いているかわからないレベルで圧倒的に使われています。
一度気になると、余計に気になってしまって印象に残ってしまっているだけかもしれませんが…
エンジニアだけが使うわけではないのですが、特に使われている気がしたので1位に選びました。

この「本質」という言葉、なかなか厄介な気がしていて、その「本質」を言葉で表現するのが難しいです。
国語の読解問題のようなイメージで、「本質」と言われたら、何が本質なんだろう？と考えることもあります。

#### 例文
- それって今回の問題の本質じゃないよね
- 本質的に考えると問題は別のところにあるよね


## 終わりに
なかなか聞き慣れない言葉が多かったのではないでしょうか。
エンジニアに転職したら、確実に耳にすると思います！
他にも業界用語たくさんあるので、珍しいのがあったら教えてください🙇
AWS re:Invent 2023 まとめ（Compute編）

個人的なまとめ

引用元：
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_reInvent2023digest_1201_v1.pdf

## Compute編

### AWS Graviton 4とEC2 R8gインスタンスを発表

- AWSが設計したARMベースのプロセッサ、AWS Graviton 4プロセッサを発表
    - Graviton 3と比較して30%高速、50%多いコア数、75%広いメモリ帯域幅を提供
 - Amazon EC2 R8gインスタンスで利用可能に
    - 高性能なDB、インメモリキャッシュ、ビッグデータ分析に適する
    - R7gと比較して3倍のvCPU/メモリを搭載
 - プレビュー申込みを受付中

### AWS Trainium 2とEC2 Trn2インスタンスを発表

- AWS Trainium 2チップを発表
    - AWS Trainiumと比較してトレーニング処理が最大4倍高速、メモリ容量が3倍、エネルギー消費効率が2倍に
    - Amazon EC2 Trn2インスタンスに搭載。1インスタンスあたり16器のTrainium 2を搭載する
- AWS EFAによるEC2 Ultra Clusterで、最大100,000のTrainium 2で処理を実行可能
    - 最大65EFLOPSを発揮し、3,000億パラメータのLLMのトレーニングを数ヶ月から数週間の単位に短縮する
- 詳細は今後発表予定

### Amazon EC2のハイメモリインスタンスU7iを発表

- 次世代のハイメモリインスタンス、Amazon EC2 U7iインスタンスを発表。最大32TiBのDDR5メモリを搭載、SAP HANAやOracle、SQL Serverなどインメモリデータベースに最適
- 第4世代のIntel Xeon Scalable Processor(Sapphire Rapids)を搭載し、現行のU-1インスタンスと比較し最大125%高い処理性能を発揮する

### NVIDIAのGPUを搭載した3つのインスタンスをアナウンス

- NVIDIAの最新GPUを搭載した3種類のEC2インスタンスの登場をアナウンス。2024年に登場予定、乞うご期待
    - Amazon EC2 P5e instance
NVIDIA H200 GPUを搭載。141GBのHBM3e GPUメモリを搭載し、H100と比較して1.7倍大容量で1.4倍高速。AWS Nitro Systemによる3,200GbpsのEFA
ネットワークで最新モデルの開発・学習に適する
    - Amazon EC2 G6e instance
NVIDIA L40S GPUを搭載。公開されているLLMや小規模言語モデルの学習・推論に。NVIDIA Omniverseを用いるデジタルツインアプリケーションにも
    - Amazon EC2 G6 instance
NVIDIA L4 GPUを搭載。自然言語処理や翻訳、動画解析、音声認識、グラフィクス処理などに最適な低コストでエネルギー効率の高い選択肢

### Amazon Qのインスタンス選定支援機能を発表

- 750以上のEC2インスタンスタイプから最適な選択を行うための支援を提供
- Amazon QがAWSドキュメントと管理コンソール内の情報を元にパーソナライズされた推奨情報を提示する
- 自然言語で追加質問を行うことで更に詳細なガイドを得ることもできる
- EC2管理コンソールからプレビュー利用可能

### ENA Expressが58のインスタンスタイプに対応

- AWSのSRDプロトコルを使用してネットワークパフォーマンスを向上させるENA Expressが新たに58種類のインスタンスタイプで利用可能に
    - 新しい世代のインスタンスタイプで、16vCPUから192vCPUの範囲のものが対象
- ENA ExpressはSRDを利用するが、OSやアプリケーションから意識する必要はない。普通にTCPやUDPで通信すれば、裏側でSRDが適用される
- 全リージョンで、追加費用なしで利用可能

### Amazon BraketでBraket Directプログラムを発表

- AWSで量子コンピューティングについての研究とイノベーションを加速するプログラム、Braket Directを発表
    - 様々な量子デバイスの容量を確保。量子コンピューティングの専門家と直接連携する機会を得られる
    - IonQの新しいイオントラップ型デバイスであるForte等、新世代のデバイスへのアクセスもリクエストできる
- Braket Directはキャパシティを確保するため、利用可否の予測可能性向上にもつながる
- Braketが利用可能な全てのリージョンにて


#jawsug
【Laravel】Docker環境で「File not found」の時は「default.conf」ファイルをチェック！

## はじめに
Docker環境でのLaravelプロジェクト作成時、画面に「File not found」とエラーが表示されてしまいました。

この問題を解決するためには、「**default.conf**」内のルーティングを確認します。

## 環境
Docker version 24.0.7
Laravel v9.52.16 (PHP v8.2.7)

## 問題
```terminal:
$ docker compose exec php bash
$ composer create-project --prefer-dist "laravel/laravel=" .
```
ターミナルからDockerのPHPコンテナ内でLaravelプロジェクトを作成します。

そしてローカルホストにアクセスし、動作確認をしてみると…

![6e293b87bc0825746e74164d977a7352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620668/432ee03d-421b-ff45-220b-f88ec344ae78.png)

「File not found（ファイルが見つかりません）」と言われてしまいました。

## 解決法
```conf: container/web/default.conf（間違い）
server {
    listen 80;
    listen [::]:80;

    root /var/www/html/public; // ルート設定
    index index.php; // 読み取るファイル名

    //以下略
```

上記default.confファイル内で、index.phpを読み込んでもらうためのルート設定が間違っていました。


![fe89d3b0d7b864a8a972e688ec651dd2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620668/9ac4ec59-2e1c-2525-f427-2ecbca9ce747.png)

ディレクトリ構造は上記のようになっているので、publicの前のnichが抜けています。

```conf: container/web/default.conf（正しい）
server {
    listen 80;
    listen [::]:80;

    root /var/www/html/nich/public; // "nich"を付け足す
    index index.php; 

    //以下略
```

「その上位のsrcは入れなくていいの？」と思う方もいるかもしれません。

しかし正しくは上記通り「/var/www/html/nich/public」となります。

というのもphp/Dockerfile内で、以下のようにカレントディレクトリが設定されているためだと思われます。

```dockerfile: container/php/Dockerfile
# コンテナ内で作業する際のカレントディレクトリの指定
WORKDIR /var/www/html
```

よって、自分の場合はこれに「nich/public」と付け足すことで、無事に解決することができました。

![8305cd55447cffb32fba33ed2d5291f4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620668/aa9a657d-4b8a-1892-7383-21e709de4ae3.png)

## 参考
https://qiita.com/zakki_engineer/items/cd7c6eecf83e0db7b3e7
QiitaのAIサジェスト機能使ってみた

# はじめに
こんにちは、人間の[にわのわ](https://twitter.com/niwa_nowa)です。

みなさんはQiitaのAIサジェスト機能を使っていますか？
こちらの記事で利用申請方法についても書かれているのでぜひ触ってみてください！
https://blog.qiita.com/ai-suggest-closed-beta/?utm_source=qiita&utm_content=official_column&utm_medium=referral

今日はQiitaのAIサジェスト機能を使用上限まで使わせてもらったので、その感想を書いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/bfd1270b-f4b8-927f-bf77-0a0d7e665872.png)

# 注意点
コミュニティガイドラインにも書かれているように、AIサジェスト機能を利用する場合は、AIが生成した内容は正確性を確かめましょう。

>  AIが生成した内容は正確性を確かめよう
記事等の執筆に便利なAIツールを活用することそのものは禁止していませんが、AIが生成した内容は、そのまま投稿するのではなく、正しいかどうかを検証した上で投稿するようにしましょう。 Qiitaで提供しているAI機能を利用する場合も同様です。 正確ではない情報が投稿されることは、コミュニティにとって望ましいことではありません。内容に責任をもって投稿しましょう。

https://help.qiita.com/ja/articles/qiita-community-guideline

# 使ってみた感想
使ってみた感想としてはかなりポジティブな印象でした。
０ベースで記事を書くよりも下地を作ってくれるので、筆の進みがかなり早くなると思います。

# 具体的な使用感
すでに使用上限に達してしまっているため、
スクリーンショットや具体的な生成内容を記載することができません。
申し訳ありません。

＋ 生成する内容は文章としてまとまっていると感じた
＋ AWS lambdaについてみたいな見出しをつけて、AIサジェスト機能を利用すると正しい情報が出力された
(マイナーなものだとうまく出力されなかった)
− (クローズドベータ版だからかもしれないが)1記事書いているだけで使用上限に達してしまった
− (クローズドベータ版だからかもしれないが)30%くらいの確率で空のレスポンスが返ってきた

# おわりに
ツイッター上でクローズドベータ版だから記事にするのはだめだよなぁとぼそっと呟いたところ、公式さんに背中を押してくださったので
こちらで感謝を示させてください。

https://twitter.com/Qiita/status/1732646401585390010
SQLOSスケジューラのモニタリング

SQLOSスケジューラの動作状況は動的管理ビュー sys.dm_os_schedulers を参照することで確認可能。

## 動的管理ビューの参照
```sql
SELECT * FROM sys.dm_os_schedulers;
```
#### sys.dm_os_schedulers のカラム一部紹介
- runnable_tasks_count
  実行可能キューでスケジュールされるのを待機しているワーカーの数。
  要求されている作業量（実行されているクエリの数）に対して、CPUの処理能力が追い付いていない可能性がある。
</br>

- current_workers_count
  このスケジューラの関連付けられているワーカーの数。
  SQLOSスケジューラは、必要に応じてワーカーを作成していくため、必ずしもスケジューラが管理可能な最大数のワーカーを常に保持しているわけではない。
</br>

- work_queue_count
  保留中のキュー内の処理の数。
  この数の処理が、実行に必要となるワーカーの空きを待っている。
  この値が常に高い場合は、実際にワーカーの数が不足していることもあるが、ほとんどの場合は別の潜在的な問題が存在することを示している。
  例）多くのワーカーが長時間ロック獲得待ちになっていたり、過剰な数の並列処理が行われていたりといったケース

## 動的管理ビュー
すべての動的管理ビューと動的管理関数はsysスキーマに含まれ、dm_* という名前付け規則に従っている。動的管理ビューまたは動的管理関数を使用するときは、sysスキーマを使用して、ビューまたは関数の名前にプレフィックスをつける必要がある。
```sql
SELECT * FROM sys.dm_os_wait_stats;
```

## 参考
- 絵で見てわかるSQLServerの仕組み(著：平山　理)
- Microsoft Docs
  - [システム動的管理ビュー](https://learn.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-ver16)
  - [sys.dm_os_schedulers (Transact-SQL)](https://learn.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-os-schedulers-transact-sql?view=sql-server-ver16)
  - [sys.dm_os_workers (Transact-SQL)](https://learn.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-os-workers-transact-sql?view=sql-server-ver16)
  - [sys.dm_os_threads (Transact-SQL)](https://learn.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-os-threads-transact-sql?view=sql-server-ver16)
- 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典]
  - [プレフィックス](https://wa3.i-3-i.info/word1208.html)
  - [キュー](https://wa3.i-3-i.info/word14716.html)

## 最後に
SQLServerを最近使う機会が多くなってきたので1から勉強を始めました。
最終的には、性能関連の作業がこなせるようになることを目標にしています。
Rinna社のNue ASRを試してみる on Databricks

音声系ももっと調査していきたい。

# 導入

Rinna社が大規模言語モデルを利用した音声認識モデル「Nue ASR」を発表しました。

https://prtimes.jp/main/html/rd/p/000000052.000070041.html

OpenAI Whisperに匹敵する性能ということで、興味があって試してみました。

huggingfaceのサンプルコードを参考に、Databricksのノートブック上で動かしてみます。
DBRは14.2ML、クラスタはg5.2xlarge(AWS)です。

https://huggingface.co/rinna/nue-asr

# Step1. パッケージインストール

必要なパッケージをインストール。
今回はdeepspeedを使うため、deepspeedの最新版もインストールしておきます。

```python
%pip install git+https://github.com/rinnakk/nue-asr.git
%pip install -U transformers accelerate deepspeed
```

# Step2. モデルのロード

事前にhuggingfaceからダウンロードしておいたモデルをロードします。

```use_deepspeed=True```でdeepspeedでの推論を有効化します。

```python
import nue_asr

model_path = "/Volumes/training/llm/model_snapshots/models--rinna--nue-asr"

model = nue_asr.load_model(model_path, use_deepspeed=True)
tokenizer = nue_asr.load_tokenizer(model_path)
```

# Step3. 音声認識その1

こちらから音声ファイルを利用させていただいて、音声認識してみます。

https://soundeffect-lab.info/

```python
import requests

url = "https://soundeffect-lab.info/sound/voice/mp3/info-lady1/info-lady1-okakeninattadenwabangouha1.mp3"
response = requests.get(url)


# 保存先ファイル名
wave_file_name1 = "audio_1.mp3"

# バイナリ形式で保存
with open(wave_file_name1, "wb") as f:
    f.write(response.content)
```

```python
result = nue_asr.transcribe(model, tokenizer, wave_file_name1)
print(result.text)
```

```:出力
かけになった電話番号は現在使われておりません。
```

正しくは「おかけになった電話番号は、現在使われておりません」という音声です。
最初の文字が欠けていますが、それ以外は正しく認識しています。
最後に読点が付くのが面白い。

# Step4. 音声認識その2

少し長めの音声を使用してみます。

以下の内容を読み上げた音声ファイルになります。
>「本日はご来場いただきまして、誠にありがとうございます。開園に先立ちまして、お客様にお願い申し上げます。携帯電話など、音の出るものの電源はお切りください。また許可のない録音・撮影はご遠慮ください。皆様のご協力をよろしくお願いいたします」

```python
import requests

url = "https://soundeffect-lab.info/sound/voice/mp3/info-lady1/info-lady1-honzitsuhagoraizyou1.mp3"
response = requests.get(url)


# 保存先ファイル名
wave_file_name2 = "audio_2.mp3"

# バイナリ形式で保存
with open(wave_file_name2, "wb") as f:
    f.write(response.content)
```

```python
result = nue_asr.transcribe(model, tokenizer, wave_file_name2)
print(result.text)
```

```:出力
The input audio is 26.5 sec, but such long audio inputs may degrade recognition accuracy. It is recommended to split the audio into shorter segments.
携帯電話など音の出るもの電源はお切りください皆様のご協力をよろしくお願いいたします。
```

部分的な内容が切り出されていました。（最後の部分だけが抜き出されているわけではない）

警告メッセージが出力されているように、長い音声ファイルは正しく認識できないようです。
適切に分けるという前処理とセットで使うことになりそうです。

# まとめ

簡単ですが、Nue ASRを試してみました。
上記に記載していませんでしたが、認識速度はどちらも１秒未満であり、かなり速いです。
(deepspeedの恩恵なのかもしれません）

VRAMの資料用は8.8GBほど。T4で動きそうです。
ただ、通常のメモリはロード時に30GBくらいまで使われていたので、RAMは大きめがよさそう。

認識性能はこれだけだと何とも言えなさいのですが、ある程度適切な文章が生成されるように思います。

これからさらに改善されていきそうな感じですので、今後が非常に楽しみです。
dockercomposeでGoの環境構築

# dockercompose でGoの環境構築

# はじめに

docker かなり初心者。dockercompose の使い方を勉強した備忘録。

# 問題

docker-compose を使って Go 環境を作成する

# 解決方法

↓ を参考に最低限の Go 環境を作成する
 [DockerでGo言語の開発環境を作る方法](https://qiita.com/tkms13/items/74a9ea4b41302323c4b1)

## フォルダ構成

project
├backend
│ └Dockerfile
│ └cmd/
│ 　 └─api/
│ 　　 └─main.go
└docker-compose.yml

DockerFile

```
FROM golang:1.19.1-alpine3.16

WORKDIR /app

COPY ./backend .

CMD ["go", "run", "./cmd/api"]

```

docker-compose

```
version: "3.8"

services:
  backend:
    build:
      dockerfile: ./backend/Dockerfile
    ports:
      - 8080:8080
    volumes:
      - ./backend:/app

```

## 作業中のメモ

作成する中でのメモを残す

- docker-compose.yml メモ
  - image
    - コンテナを作成するイメージの指定
    - イメージがローカルにない場合は Docker Hub から取得する
    - build が指定されている場合は DockerFile から作成されたイメージのイメージ名になる
  - build
    - dockerfile
      - ビルド時に DockerFile からイメージを作成する
  - volumes
    - volume の指定（データの永続化）
    - ローカルをマウントすることができる
- コマンドメモ

```
docker compose up
```

docker-compose.yml に従ってコンテナを作成する
-d オプションをつけることでバックグラウンドで起動できる（デタッチモード）
--build で起動前にビルドできる

```
docker compose down
```

docker compose up で作成したコンテナを停止してコンテナとネットワークを削除する

```
docker compose run --rm backend sh
```

コンテナ内でコマンドを実行する。
例のようにすると backend(サービス名)を起動して sh を実行するためコンテナ内を操作することができる
--rm オプションをつけるとコンテナから exit した時にコンテナを削除する

# おわりに

まだこれで開発が楽にできるって具体的な方法がイメージができていない。
引き続き自分が Docker でできることを増やす

# 参考
- [DockerでGo言語の開発環境を作る方法](https://qiita.com/tkms13/items/74a9ea4b41302323c4b1)
- [【Docker】初心者のための Docker Compose まとめ](https://ai-can-fly.hateblo.jp/entry/summary-of-docker-compose-for-beginners#Compose-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-docker-composeyml)
- [docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f)