OmniAICreator/Qiita-1.07M huggingface dataset:
VSNotesが非常に便利だという話

## アジェンダ
VSCodeの拡張機能でありVSNotesが非常に便利だったので、この記事では、VSNotesの便利さに焦点を当て、その機能とユーザーにとってのメリットを紹介します。

![スクリーンショット 2024-02-23 22.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961835/50287002-3da5-df37-5a0e-1d77e52327f7.png)

## VSNotesのメリット
### 一元管理
VSNotesを使うと、プロジェクトに関連するメモやドキュメントを一箇所で管理できます。これにより、情報の断片が散らばることなく、必要な時にすぐにアクセスできます。

### マークダウン対応
メモはマークダウン形式で記述され、フォーマットの美しさと読みやすさを保ちながら、テキストベースで軽量なドキュメントを作成できます。コードスニペットやリンク、リストなども簡単に追加できます。

### タグと検索機能
メモにタグを付けて分類することができ、後から特定のトピックやプロジェクトに関連するメモを簡単に見つけることができます。強力な検索機能も備えており、キーワードで素早く情報を探し出せます。

### シームレスな統合
VSNotesはVSCodeの内部に完全に統合されているため、開発環境を離れることなくメモの作成や編集、検索が可能です。これにより、態々VSCodeとメモアプリを行ったり来たりする必要もなくなり、別の作業の流れを中断することなく、効率的に作業を進めることができます。

## インストール&セットアップ
### 1.拡張機能ビューを開いてインストール
VSCodeの拡張機能からVSNotesをダウンロードします。

[VSNotes - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=patricklee.vsnotes)

### 2.コマンドパレットでセットアップ
インストールが完了したら、
Macは`Command + Shift + P`
Windowsは`Ctrl + Shift + P`
で、コマンドパレットを開き`VSNotes: Run setup`と実行してください。

### 3.ファイルを保存する場所を指定
実行後、VSCode上の右下にVSNotes関連のダイアログが表示されるので、そのダイアログ内のStartボタンをクリックします。
Startボタンクリック後、ファイルを保存する場所を聞かれるので、保存したい場所を設定し、ファイルを保存します。

### 4.VSCodeの再起動
3までの工程を終わらせたら必ず、VSCodeの再起動を行なってください。

ちなみに開発者ご自身が動画でQuick Demoを公開しているので、そちらを見るのもオススメです。

[VS Notes Quick Demo - YouTube](https://www.youtube.com/watch?v=Kcf4rpRDmlQ&ab_channel=PatrickLee)

## 使い方
### ファイルの作成
`Shift + Command(Ctrl) + P` でコマンドパレットを開き`vsnote create`と入力し、
`VSNotes: Creat a New Note`と補完されるので、Enterで作成できます。

### デフォルトのファイル名の変更
`Shift + Command(Ctrl) + P` でコマンドパレットを開き、「settings」と入力し、`Preferences: Open User Settings`と補完されるので、Enter キーで確定します。

その後、設定の検索欄に`Vsnotes: Default Note Title`と検索します。

すると以下の様に、表示されます。
![スクリーンショット 2024-02-24 2.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961835/3f9688e7-6c71-280e-06bb-6332e792c094.png)

あとは、以下の欄を変更するだけで、デフォルトのファイル名を変更できます。
```
{dt}_{title}.{ext}
```
例えばデフォルトのファイル名をタイトルだけにしたい場合は以下のように変更します。
```
{title}.{ext}
```
この様に変更を行うことで、各々の好みや作業フローに合わせてノート管理をカスタマイズできます。

### タグ
VSNotesはタグを設定することができます。
以下はReactをタグに設定した例になります。
```md
---
tags:
  - React
---
```

## リファレンス
[Visual Studio Code 拡張 VSNotes でメモをとる - ひよこまめ](https://blog.chick-p.work/blog/vsnote-template)
Leaning TechnologiesのCEO、2023年末アップデート

![leaningtechlogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/d419ef63-6893-229f-7b41-658dc70e8f7e.png)

# Leaning Technologies の目覚ましい業績の年
2023年の終わりを迎えるにあたり、Leaning Technologiesが今年達成した素晴らしい業績をご紹介させていただきます。皆様の継続的なパートナーシップとサポートが、これらの成功に重要な役割を果たしてくれました。

# CheerpJにとって大きな一年
CheerpJ 3.0のリリースを発表できることを大変嬉しく思います。CheerpJは、ウェブ・ブラウザでJavaアプリケーションを活用するための主要なソリューションであり続け、この最新バージョンでは、さらに多くの機能、パフォーマンスの向上、互換性の改善をもたらしました。ユーザーコミュニティーからのポジティブなフィードバックは圧倒的で、CheerpJ 3.0はJava-to-WebAssemblyソリューションの新しいスタンダードになると信じています。

# 開発者リソースへの投資
開発者の皆様をサポートし、お客様の成功をお約束するために、私たちは開発者向けリソースの強化に多額の投資を行ってきました。当社の包括的なドキュメント、チュートリアル、サポート資料は、さらに優れたユーザー体験を提供するために更新され、拡張されました。これらのリソースは、お客様やパートナーが当社のテクノロジーを最大限に活用できるように設計されており、協力的で効率的な開発環境を促進しています。

# Codamとの継続的パートナーシップ
Codamとの長年にわたる関係は、私たちの成功の礎である。Codamとの協力関係は現在も続いており、Codamは常に質の高いインターンを供給してくれています。Codamからのインターンは、新鮮な視点、革新的なアイデア、そして強い労働倫理を私たちのプロジェクトにもたらし、私たちのビジネス全体の成功に貢献してくれています。今後数年間、このパートナーシップをさらに強化していくことを楽しみにしています。

# ライセンスモデルの大幅な変更
WebAssemblyのエコシステムにおいて、私たちがどのような役割を果たしたいかを考えた結果、今年の初めに私たちはライセンスモデルに大きな変更を加えました。Cheerp 3.0から、すべてのコンパイラ・コア・コンポーネントとライブラリは、Apache 2.0 / LLVMライセンスの下で寛容にライセンスされるようになりました。これは、これまでのGPLv2/二重商用ライセンスモデルからの根本的な転換を意味し、Cheerp 3.0は、何の制限もなく、どのような目的にも使用することができます。CheerpJによって、私たちはまた、ソリューションが「無条件」で使用できる範囲を広げました。

加えて、Leaning Technologiesが成長への過程において重要なマイルストーンに到達したことをお伝えできることを嬉しく思います。この1年を通じて、私たちは市場における地位を確固たるものとし、複数の優良企業から信頼を得ることができました。これらの業界リーダーからのお墨付きは、当社のソリューションの信頼性と有効性の証です。また、長期的なパートナーシップを結べたことを光栄に思います。このような評価をいただけたことは、私たちの提供するサービスの品質に対する自信をより強固なものとし、お客様に価値をお届けするという私たちの献身を強調するものです。
私たちはこれからも進化を続けながら、我々の大切な顧客の進化するニーズに応える革新的なソリューションを提供するというコミットメントに揺るぎはありません。私たちのサクセス・ストーリーを語る上で不可欠な顧客の皆様に感謝いたします。

今後ともよろしくお願いいたします。

Stefano De Rossi

CEO, Leaning Technologies
https://leaningtech.com/legacy-modernisation-jp/

引用元：https://leaningtech.com/ceo-year-end-update-2023/
勉強日記 2/21

# 初めに
シフト作成のためのアプリケーションはさまざまあるが，自分で何か作るには良い題材だと思うので，（研究分野である）進化計算を用いて，シフト作成ツールを作って見ようと思う．

# 要件
- PCで使えるブラウザ上のウェブアプリケーション
- n人のシフト希望（日付，時間）を入力
- シフト希望を元に，遺伝的アルゴリズムでシフト表を生成する
- シフト作成者は，いくつかのシフト候補を提示され，その中から異なるものを選択し，それを元に再生成することができる

# 使用技術
- React,TypeScriptなどなど...
- シフト表作成のためのアルゴリズムとして，対話型の遺伝的アルゴリズムを使用する予定


時間をかけずにサクッと作りたいが，他のタスク（研究，応用情報の対策）とどこまで並行できるか...
まず当面は，React, TypeScriptをハンズオンで勉強してみる予定．
【Unity】XR Interaction Toolkit を使ってMetaQuestのパススルーを有効化する

# 初めに
MetaQuestがARFoundationに対応した記事を以前読んだことがあったので、Meta XR SDK(OclusIntegration)を使わずにパススルーできるのでは？と思いVRテンプレートからパススルーを使う方法を調べてみました。

# パススルー有効化手順
1. XR Interaction Toolkitをインポートする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/80a4b451-bb9b-a5e8-e3a5-2d90d507eaae.png)

    * 今回はv2.5.2で確認
    * 確認時はプリインポート済みのVRCoreTemplateでプロジェクトを作成しています
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/f8126fc6-4d91-784e-719f-823c40b16538.png)
    * 他のサイト等を参考にし、XRInteractionToolkitのSampleSceneをQuest用のアプリとしてAndroidビルドに成功し、アプリが正常に動作することを確認しておく
    <br>
1. PackageManageのUnityRegistryから `Unity OpenXR Meta` をインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/d2f90a99-7d12-6340-03ca-96a878cb6c83.png)

    * 今回はv1.0.1で確認
    * OpenXR PluginとARFoundationが依存パッケージになっているので、未インポートの場合は一緒にインポートされます
    <br>

1. Scene上のMainCameraにARCameraManagerコンポーネントをアタッチする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/7b0beda6-7da3-8fb1-be72-7c7b22bfa1d3.png)
    <br>
1. MainCameraのBackGroundTypeを単色、Alphaを0に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/13375350-10f0-9e42-4bee-0cfdd1f2bc5b.png)
    <br>


1. ProjectSettingsのXR Pluginの設定でAndroid > OpenXR > MetaQuest feature groupのチェックをONする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/45ac6f69-121b-7303-0b22-1fc4963d3602.png)
    <br>

1. Androidビルドして確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/cd88f9b7-ae31-12f0-4cc8-71091e685df6.png)

# 注意事項
XR Pluginの設定でPC側には `MetaQuest feature group` の項目がないため、残念ながらQuestLink等でデバッグする際にはパススルー表示することができません。このあたりは通常のARFoundationの開発と同じです。Androidビルドで確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/0f0e028b-609c-6b53-23c2-ec45dbc16a05.png)

尚、他のAndroid端末だと[ARFoundationRemote](https://assetstore.unity.com/packages/tools/utilities/ar-foundation-remote-2-0-201106)を使うことでPlayモードでもカメラの映像を移すことができるので、いつか対応する日が来るかもしれません。。。

# 関連情報
VRでは無く、MRメインで開発したいのであればMixed Reality Templateが存在しているので、そちらだと最初からパススルーが動作します。
Spring BootにおけるJava Junit Mockitoまとめ (1)

## 1.最初の導入 --- スタブ(stub)の考え方
Unit テストで、テストしたいメゾっどやクラスが他のクラスAに依存している時、クラスをスタッブで替わる。
例
BusinessクラスにServiceクラスのexecute()に依存する時、以下のコードでServiceのスタブを作成する
```java
public class ServiceStub implements Service{
    @Override 
    public int execute(){
        return 0;
    }
}
```

## 2.MockitoでMockingする
導入のスタブ使用する際に、依存するクラスが多い際、作成するスタブが多く、コード量も増え、非効率となる。そこで、JunitのMockitoを使用し、Mockを作成する。
以下になる
```java
import org.mockito.Mockito.mock;
//Serviceのmockを作成する
Service serviceMock = mock(Service.class)

//Mockの実行条件を設定する
when(serviceMock.execute()).thenReturn(0);
//Buissness中のServiceフィードをMockに設定する
business.service = serviceMock;

//これで、businessでexecute()を実行する時に、0を返す。
```

## 3.Mockに関するアノテーションを使用する時
@Mock, @InjectMocks
Junitテストに
```java
//@Runwith(MockkitoJunitRunner.class) //Junit4でMock使用する時に必要
@ExtendWith(MockitoExtension.class) //Junit5でMock使用する時に必要
public class BusinessTest{
    @InjectMocks
    Business business = new Business();
    
    @Mock
    Service serviceMock;
    //これで、businessのserviceはMockになる。
}
```

## 4.when thenReturnの特性
複数のthenReturnが存在する場合、実行された順番にreturnされる
```java
//returnを順番に返す
when(mock.size()).thenReturn(5).thenReturn(10);
		assertEquals(5, mock.size()); //true
		assertEquals(10, mock.size()); //true

//関数の引数も対応する必要がある
when(mock.get(0)).thenReturn(5);
		assertEquals(5, mock.get(0)); //true
		assertEquals(5, mock.get(1)); //false
```

## 他のツール
#### ①MockitoのAnyパラメータ
```java
//anyInt,anyStringなどもある
import static org.mockito.ArgumentMatchers.anyInt;
when(mock.get(anyInt())).thenReturn("in28Minutes");
```
#### ②verify
mock内の関数が実行されたかどうかを判断する
```java
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.times;
	@Test
	public void verificationBasics() {
		// SUT
		String value1 = mock.get(0);
		String value2 = mock.get(1);

		// Verify
		verify(mock).get(0);
        verify(mock, times(2)).get(anyInt());      //2回実行したか
		verify(mock, atLeast(1)).get(anyInt());    //最低１回実行したか
		verify(mock, atLeastOnce()).get(anyInt()); //最低１回実行したか
		verify(mock, atMost(2)).get(anyInt());    //最多２回実行したか
		verify(mock, never()).get(2);            //実行しなかったか
	}
 ```

 #### ③渡した引数をキャプチャする
 ```java
 import org.mockito.ArgumentCaptor;
 	@Test
	public void argumentCapturing() {
		mock.add("SomeString");
		
		//Stringのクラスの引数をキャプチャしたいと設定する
		ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
		verify(mock).add(captor.capture());
		
		assertEquals("SomeString", captor.getValue());
		
	}

 //複数の引数の場合
     mock.add("SomeString1");
		mock.add("SomeString2");
		
		//Stringのクラスの引数をキャプチャしたいと設定する
		ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
		
		verify(mock, times(2)).add(captor.capture());
		
		List<String> allValues = captor.getAllValues();
		
		assertEquals("SomeString1", allValues.get(0));
		assertEquals("SomeString2", allValues.get(1));
 ```
pythonでzipファイルを解凍する

## 前提
ゴールとしてawsのs3にupされたzipファイルをトリガーにlambdaを動作させzipファイルの中身を編集しs3UPするものを作りたいので
手始めに今回はローカルでpythonの実行ファイル用意してzipファイルを解凍する簡単な処理を試してみる備忘録です

## 条件
zipファイルを展開する時に「.csv」以外の拡張のファイルは邪魔になるので解凍するのは「.csv」ものだけにします

## 実戦

```test_csvs.zip
test_csvs.zip
 └sample1.csv
 └sample2.csv
 └sample3.csv
 └main.py
 └sample.py
```

```test.py
import zipfile
import os

def unzip_files(zip_file_path):
  # 現在のスクリプトが実行されているディレクトリを取得
  extract_to_path = os.path.dirname(os.path.abspath(__file__))

  with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    for item in zip_ref.namelist():
      # 確認用にファイル名表示
      print(item)
      
      # .csvファイルのみを解凍
      if item.endswith('.csv'):
        zip_ref.extract(item, extract_to_path)

# 解凍するZIPファイルのパスを指定
zip_file_path = 'test_csvs.zip'

# .pyファイルのみを抽出して解凍
unzip_files(zip_file_path)
```

test.pyとzipファイルは同じディレクトリに設置してtest.py実行します
test.pyを実行すると同じディレクトリに「sample1.csv, sample2.csv, sample3.csv」が解凍されています


## おわり
今回はzipファイルの解凍だけでしたが次はs3からのファイルのDLとUPの処理周りをやろうかと思います
統合開発環境(IDE)について調べてみた

Gitを学ぼうとUdemyで学習を開始したが、早速Gitインストールで躓く初心者。
インストール過程で遭遇したXcodeがどういうものか気になりすぎてしまい、本来のGit学習を忘れ、熱心に「統合開発環境」というものについて調べてみたので初記事にしてみた。

## 統合開発環境とは 

>統合開発環境 (IDE) は、プログラマーがソフトウェアコードを効率的に開発するのに役立つソフトウェアアプリケーションです。ソフトウェアの編集、構築、テスト、パッケージ化などの機能を、使いやすいアプリケーションと組み合わせることで、デベロッパーの生産性を向上させます。ライターがテキストエディタを使用し、会計士がスプレッドシートを使用するのと同じように、ソフトウェアデベロッパーは IDE を使用して作業を容易にします。”
引用：[IDE とは? - 統合開発環境の説明 - AWS](https://aws.amazon.com/jp/what-is/ide/)

統合開発環境を使わない場合、
・テキストエディタ
・コンパイラ
・デバッカ
などを１つずつ自分で入手して複数の場所で作業することになる。

つまり、統合開発環境はこれらが揃っているため、１つの場所でアプリ開発ができる優れもの。
ちなみにIDEはIntegrate Development Environmentの略。

※「テキストエディタ」は、文章入力ツールでメモ帳なんかも含まれる。ただ書くところ。
※「コンパイラ」は私たちが書いたコードをコンピュータが理解・実行できる形式に変えてくれるソフトウェア。人間とコンピュータの翻訳家。
※「デバッカ」はバグを発見・修正するソフトウェア。

## 統合開発環境の種類 

調べてみると様々あって以下のリンクに表示されるグラフが興味深かった。

[【2024年】IDE（統合開発環境）のおすすめ10製品（全27製品）を徹底比較！満足度や機能での絞り込みも](https://www.itreview.jp/categories/ide?company_size=1#category-description)

よく使われている、かつ、自分が早期に関わっていきそうな統合開発環境を３つ調べてみた。

### Visual Studio
Microsoft社が提供する統合開発環境。
C#、Visual Basic（VB）、C++をはじめ、Python、Node.js、HTML/JavaScriptなど幅広い言語に対応。
ゲーム開発に強いらしい。
有料の統合開発環境で、企業などで使用されている。

### Eclipse
IBM社が提供する統合開発環境。
Java開発用だったが、現在はC言語、C++、C#、PHP、Perlなどの言語にも対応。
日本語での解説も多く、初心者におすすめ。
デスクトップアプリケーションや組み込みアプリケーションが開発できる。

### Xcode 
Apple社が提供する統合開発環境。
iOSやMacアプリ開発するなら必須。
Macでしかインストールできない。
標準対応の言語は、Swift、Objective-C、C、C++、Java、AppleScript
MacアプリやiPhoneアプリだけでなくApple Watchアプリなどの開発が可能。


その他、クラウド上で開発環境を提供するAWSのcloud9なんかもある。


## みんなが使ってるVScodeとは 

よく聞くVScodeは、Microsoft社が提供する”テキストエディタ”に分類される。
しかし拡張機能を追加することで統合開発環境のように使用できる。

・無料
・ほとんどのプログラミング言語に対応
・軽量な動作
・自分の使いやすいようにカスタマイズできる

などがメリットとして挙げられる。
個人的には有料で重たくて機能ましましよりも、個人開発なら無料で軽量な動作が適してるのかなと。

## どの統合開発環境がいいか

どれも得意分野がそれぞれあり、優劣はなく、特に指定がなければ目的や好みでの選択になるのかなと。
言語の流行りみたいなのにも左右されそうだなあという印象も抱いた。

私はまだ触れていないので、とにかく使ってみて体感したいと思います。
【SwiftUI】マルチモジュールにおいてAssetsのColorを表示する

## 始めに
Assetsでcolor setするやり方は、以下の記事等で既に解説されているためコチラを参考にしてセッティングしてください。

https://qiita.com/nakanami/items/006f3bb8f7ea01d3eab8

これをマルチモジュールにしてからでも同じように色を取得する方法です。

## 本題
```swift
.foregroundStyle(Color("WidgetTimeText", bundle: .module))
```

![スクリーンショット 2024-02-21 14.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554113/15e35b68-531a-642d-39ed-722cf58cc7a9.png)

※セッティングしたカラー名と同じにしてください。
【GitHub】Issueの作成にクエリパラメータを使用する方法


以下のようにURLのクエリパラメータを使用してIssueを作成できます。

```
https://github.com/sample/example/issues/new?title=TEST&body=test
```

上記のようにした場合にはタイトルが`TEST`で本文が`test`のIssueが作成されます。


他にも`label`などをクエリパラメータを使用して設定することができます。

https://docs.github.com/ja/issues/tracking-your-work-with-issues/creating-an-issue#creating-an-issue-from-a-url-query
Babylon.js の Procedural Texture のアニメーションする炎のテクスチャ（Fire Procedural Texture）を試す

Babylon.js の公式ドキュメントの「Asset Libraries」を見ていた際に「Procedural Texture Library」という項目が目にとまり、それが気になったので、少し試して記事にしてみました。

●Asset Libraries | Babylon.js Documentation
　https://doc.babylonjs.com/toolsAndResources/assetLibraries

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/cc4f2e22-8ed0-1347-ab73-1e3863f153df.png)

公式ドキュメント上の「Procedural Texture」のページは以下になります。

●Procedural Texture Library | Babylon.js Documentation
　https://doc.babylonjs.com/toolsAndResources/assetLibraries/proceduralTexturesLibrary

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b7da30ba-edf8-b090-ab20-f4b0057cf777.png)

## Procedural Texture
### Procedural Texture とは
Procedural Texture Library の説明を見てみると、「A library of procedural textures, coded textures to run and enhance your scene.」という説明が書かれています。

Babylon.js のシーンの中で利用可能な「coded textures」となるようです。

どんなテクスチャがあるのか、ページの表示を縮小して、一覧で見てみます。
どうやら、掲載されているテクスチャの種類は 7つのようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b088ac33-ca25-56fe-6b23-08d7bbbfaa68.png)

具体的には、以下の 7つがあります。

- Brick Procedural Texture
- Cloud Procedural Texture
- Fire Procedural Texture
- Grass Procedural Texture
- Marble Procedural Texture
- Road Procedural Texture
- Wood Procedural Texture

### Fire Procedural Texture を見てみる
試しに 7つある中の「Fire Procedural Texture」をピックアップして見てみます。

●Fire Procedural Texture | Babylon.js Documentation
　https://doc.babylonjs.com/toolsAndResources/assetLibraries/proceduralTexturesLibrary/fire

[サンプルページ](https://playground.babylonjs.com/#KM3TC)を開いてみると、良い感じに表面がアニメーションするテクスチャのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/477b7d33-0aba-41af-e8b9-fc29be52d271.png)

#### パラメータを変更してみる
ページの説明のほうに戻って、記載された内容を見ていくと、見た目に関わる以下の 4つのパラメータを変更・指定できるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4fa1d339-1766-f916-6138-aa5e4b201966.png)

その中の色に関わるパラメータである「fireColors」は、「BABYLON.Color3/4」を使った指定もでき、それ以外では「PurpleFireColors, GreenFireColors, RedFireColors, BlueFireColors」というあらかじめ準備された内容で指定することもできるようです。

試しに、 `fireTexture.fireColors = BABYLON.FireProceduralTexture.BlueFireColors;` を試してみます。
そうすると、以下のように炎の色が青になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/53074138-8258-8061-6d5a-d1ec3805554f.png)

さらに、4種類の既定の内容を「RedFireColors ＞ BlueFireColors ＞ PurpleFireColors ＞ GreenFireColors」という順で変えてみて、その様子を動画にしてみました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/TlpHSxiJZMk?si=i2lmi9j2pHVNUQBd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

これは手軽に使えて、見た目も良い感じです！
button_to に思った通りの CSS が効かない問題の対処法

## 事象

`button_to` という `Rails` のヘルパーメソッドを使って送信ボタンを実装するときに下記のように実装すると `button_to` に思った通りの `CSS` が効きませんでした。今回はその原因と対処法を共有いたします。

```ruby
<%= button_to '送信',
              任意の_path,
              method: :post,
              params: { key: 'value' },
              class: 'custom-class' %>
```

## 原因

この問題の根本原因は `button_to` ヘルパーが生成する `HTML` 構造にあります。具体的には、指定した `class (custom-class)` が `form` 要素ではなく、内部の `input` 要素に適用されてしまうためです。`Rails` は `button_to` を使用すると、以下のような `HTML` を生成します。

```ruby:before
<form class="button_to" method="post" action="指定したパス">
  <input class="custom-class" type="submit" value="送信">
  <input type="hidden" name="authenticity_token" value="..." autocomplete="off">
  <input type="hidden" name="key" value="value" autocomplete="off">
</form>
```

この構造では、`custom-class` クラスが `input` 要素に直接適用されており、`form` 要素自体には適用されていません。

## 対処法

問題を解決するためには、`form` 要素にも `CSS` クラスを適用する必要があります。これを実現するには、`button_to` メソッドの `form` オプションを使用して、`form` 要素にクラスを指定します。以下のように修正します。

```ruby:after
<%= button_to '送信',
              任意の_path,
              method: :post,
              params: { key: 'value' }, 
              class: 'custom-class',
              form: { class: 'form-custom-class' } %>
```

この変更により、`form` 要素に `form-custom-class` のクラスが適用され、`input` 要素には引き続き `custom-class` クラスが適用されます。これによって、期待通りのスタイルを `button_to` に適用することができます。

## まとめ

`button_to` ヘルパーメソッドを使用する際に `CSS` スタイルが期待通りに適用されない問題は、`form` と `input` 要素に適切なクラスを指定することで解決できます。

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
指定した仮想デスクトップでExcelを起動する

# はじめに
マルチタスクを効率化するために Windows 11 の仮想デスクトップを活用しているエンジニアの皆さん、こんにちは。

特定の仮想デスクトップでExcelを起動すると、直前にExcelが開かれていた仮想デスクトップで開かれてしまい「あ゛ー！」ってなりませんか？

本記事は、特定の仮想デスクトップ内で Excel を起動する方法の備忘です。

# 解決手順
## Excelを別プロセスで起動するショートカットの作成
1. [スタート] メニューの Excel を右クリック ＞ [詳細] ＞ [ファイルの場所を開く] をクリック
2. 開いたフォルダー内の Excel のショートカットを右クリック ＞ [送る] ＞ [デスクトップ (ショートカットを作成)] をクリック
3. デスクトップに作成されたショートカットを右クリック ＞ [プロパティ] をクリック
4. [ショートカット] タブの [リンク先] の欄の一番最後 (～excel.exe" の後ろ) に「 /x」を入力して [OK] をクリックする
※スラッシュの前には半角スペースが入ります

## ショートカットを「送る」メニューに追加
1. Windowsキー + R
2. 名前の欄に `shell:sendto` のように入力して OK ボタンを押下
3. SendTo フォルダーが表示されるので、先程デスクトップで作成したショートカットをこのフォルダに移動する。
（ショートカット名を『Excel(別プロセスで起動)』とするとわかりやすい）

## Excelを開く
Excelを開くときに、コンテキストメニューの「送る」から起動する。

# PowerPointはこの方法ができない
残念ながらPowerPointは別プロセスで起動するオプションがないため、この方法では解決できません。

# 最後に
この情報が誰かのちょっといいことに寄与したら嬉しいです！

# 参考
1. [Windows10仮想ディスクトップ複数使用でエクセル個別で開くと、最初のディスクトップにエクセルが移動します。](https://answers.microsoft.com/ja-jp/windows/forum/all/windows10%E4%BB%AE%E6%83%B3%E3%83%87%E3%82%A3/ced24451-aa58-4fd8-835d-76d8094315cf)
2. [Windows11で右クリックメニューの送るを編集・追加する方法 - Win11ラボ](https://win11lab.info/win11-sendto/#i)
[Power BI] Power Queryでカレンダーテーブルを作成😊

# はじめに

BIを構築するにあたり、カレンダーテーブルの作成はほぼ必ず必要になります。

以前、Power Query でカレンダーテーブルのひな型は作成していたのですが、会計年度などを変数化をし、GitHubで再公開します。

▼以前の記事

https://qiita.com/akihiro_suto/items/434a5766e507b0808021

# カレンダーテーブルを作成👌

GitHubで公開しましたのでそちらをご確認ください。

issue、プルリク大募集。より良いカレンダーテーブルにしていきましょう😊
間違いの指摘も大歓迎です！

https://github.com/hanaseleb/PowerQuery-CalenderTable

# 概要

日付に加えて、相対日付や曜日、月などのカラムが用意してあります。
会計年度の必要項目を変数に入力すると、相対会計期列も計算されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/30aa522f-c00e-c590-b460-2ef459639c64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8efedae0-7f5f-607b-d0b0-67e4c82ac869.png)
phpenvが動かなかったためDockerを使ってPHPの特定のバージョンでComposerを動かす

phpenvが動かなかったためDockerを使ってPHPの特定のバージョンでComposerを動かしました。

# 結論

```json:composer.json
{
  "config": {
    "platform": {
      "php": "MAJOR.MINOR.PATCH",               # ここにバージョンを書く
      "ext-something": "MAJOR.MINOR.PATCH"
    }
  }
}
```

https://hub.docker.com/_/composer

```bash
docker run --rm -v $(pwd):/app composer/composer update
```

# 経緯
少し古い Larave（Laravel8）が入っているリポジトリを引っ張りだして動かそうとしたところ、依存関係のライブラリがPHP 7.3 でしか動かなくなっていました。
2024年2月現在では手元の環境（MacOS）には PHP8.3 が brew で入っていました。

これまでは古いバージョンのPHPを使う場合、 `brew install php@7.3 && brew link php@7.3`  などとして切り替えていたのですが、現行のbrewでは見つかりませんでした。

他のbrewをtapすれば入りそうではあったのですが、せっかくなのでこれまであまり使ってこなかった `phpenv` を使ってみました。
特定のリポジトリだけ古いバージョンのPHPが必要でしたし、そのほうが便利かなと思いました。

ですが指定バージョンのPHPのインストールに失敗してしまい困ってしまいました。

# Docker
Dockerで試すことにしました。
今回の対象はLaravelで、かつローカル環境に `sail` を使っていたため、そちらをインストールすれば環境が出来上がるのですが、独立して入れてみました。

# ポイント
今回のポイントは、ホストOS側で作成されている`composer.json` を含むコードに対してcomposerを実行したい、というものでした。
コンテナ内部でPHPの環境を構築してそこで `composer install` などをするのではなく、使い捨てのDockerコンテナを使ってホストOS用に実行する、というものです。

# 結論
冒頭にもありますが, composer.json の `config.platform.php` の項目にPHPのバージョンを追記します。
必要に応じて `ext-json` などもここに記述するようです。

今回は `7.3` で動かしたいので下記のように追記します。

```json:composer.json
{
  "config": {
    "platform": {
      "php": "7.3.33"
    }
  }
}
```

その上でホストOS上で実行します。

```
docker run --rm -v $(pwd):/app composer/composer update
```

`docker run --rm -v $(pwd):/app composer/composer` までワンセットでその後の引数はcomposerの引数になります。 このコマンドが `composer` コマンドのように動くのでとても便利です。

実行結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/2a470414-563d-9d02-8ebc-96330a382712.png)

phpenvが動かなかったのは残念ですがやはりDocker便利ですね。


https://hub.docker.com/_/composer

https://stackoverflow.com/questions/43903775/installing-composer-in-a-docker-container

https://tommcfarlin.com/old-versions-of-php-with-homebrew/
VSCodeでMind 8 for Windowsのkernelをデバッグ実行してみる（つづき）

# はじめに
VSCodeでMind 8 for WindowsのKernelを[デバッグ実行開始できました](https://qiita.com/mylifewithviolin/items/1d01b250ef2d0a175d0c)ので、今回はそのデバッグ途中のご様子のレポートです。※注 デバッグの言い回しですが、もちろんデバッグが目的ではなく、学習目的でステップ実行しているだけです。

# 前提条件
Windows11 Pro 22H2
VSCode(Visual Studo Code)　1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 8.0.08 for Windows

## VSCodeの拡張機能
C/C++ for Visual Studio Code 1.18.5 Microsoft 
C/C++ Extension Pack 1.3.0 Microsoft 
C/C++ Extension UI Themes 2.0.0 Microsoft 
VS Code Makefile Tools 0.8.22 Microsoft 

# デバッグ実行の前提条件
Mind開発者の@killyさんからの前回記事コメントでの情報共有で、今回デバッグ対象のmindexec.exeは通常Mindコンパイラによりターゲットソースの主ファイル名でリネームされて（同名のMコードファイルといっしょにランタイム的に）実行されるとのことでしたので、今回はmindexec.exe状態でしかデバッグ実行できないため、通常とは異なりますがMコードファイル側をmindexec.mcoにリネームしておきデバッグ実行します。
とりあえずなにかよいMコードファイルないかなということで、とっさにはMindコンパイラ自体のmind.mcoをリネームしてみることとします。

```
C:\developments\vscode\mind8\kernel>dir mindexec.*

 C:\developments\vscode\mind8\kernel のディレクトリ

2023/01/22  16:36             2,130 mindexec.c
2024/02/17  10:12           169,472 mindexec.exe
2024/02/17  10:12           747,528 mindexec.ilk
2023/01/22  16:36           151,454 mindexec.mco
2024/02/17  10:12            34,727 mindexec.obj
2024/02/17  10:12         1,272,832 mindexec.pdb
               6 個のファイル           2,378,143 バイト
```
mindexec.mcoがほんとはmind.mcoだったやつです。


# デバッグ実行中のご様子
最初から下図の状態までウォッチ式を追加したわけではありませんが、どうもこの状態の場合、ランタイムファイルmrunt060.exeがないため、下図のtry_multpath_exec.cのループを失敗で抜けて

![vscodec14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/37d5773a-b99b-32cb-f1b6-16f8392c1f70.png)

mindex.cの下記のヶ所に入ってしまうようです。

```c:mindex.c
	/* ---------------------- */
	/* やっぱり起動できず     */
	/* ---------------------- */
	emgcyHeaderOutput();
	printf( "Mind runtime not found\n" );
	emgcyExit();
 ```

 Mind runtime not foundをコンソール出力して終了。

 # デバッグ実行の前提条件2
 mrunt060.exeをkernelフォルダに置かせていただきます。
```
C:\developments\vscode\mind8\kernel>dir mrunt*.exe

 C:\developments\vscode\mind8\kernel のディレクトリ

2023/01/22  16:36           181,760 mrunt060.exe
               1 個のファイル             181,760 バイト
```

# デバッグ実行中のご様子2

mindex.cの下記のヶ所exit_program(retcode);に入ってしまうようです。

```c:mindex.c
	retcode = spawnv( P_WAIT, FullpathRuntname, &(Argv[0]) );
	if ( retcode != -1 )
	{
		exit_program(retcode); /* 子の終了コードを上に返す */
	}
```
下記のエラーをコンソール出力して終了します。
```
  コンパイルエラー：ファイル名の指定が誤りです。
```

これはつまりMindコンパイラがコンパイル対象のソースファイルを要求していることのような（気もします。プロセス実行は成功したような気がします）。いきなりMindコンパイラのMコードを指定したのは大それ過ぎていたかもしれません。

# おわりに
ちょっとタイムアウトしてしまいましたが、次回は引数を要求しない簡単なMコードファイルで様子見します。
Node.js をインストーラを使用せず利用する

# 管理者権限がうざい
- インストーラには管理者権限必要
- nvmでも管理者権限が必要

# よって、管理者権限を使わずになんとかする

### node.jsをダウンロードする
今回の使用バージョンはv8.11.3
https://nodejs.org/dist/v8.11.3/
※zipか7zをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/6a73d9e5-7d55-bf4b-2a81-d14d88431477.png)

### 解凍して任意の場所で置く
今回はここに置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/5d5b8a02-8ea0-712c-6d18-dc99df24477a.png)

### パスを通す
今回は、ユーザー環境変数の「Path」に設定する
設定したらPC再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/f3a4ce13-a209-1586-fc88-67980ccd5658.png)

### パスが通っているか確認する
node.jsのバージョンを確認
~~~
node -v
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/4c677eb1-a345-9e2d-c1d2-f54668a0257b.png)

npmのバージョンを確認
~~~
npm -v
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/d96d0d08-b75a-8b45-d4d1-d316f25bd2a7.png)

npmはupdateの通知が来ることもある

npxのバージョンを確認
~~~
npx -v
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/18cae9f0-55f5-da8b-3c95-9275e4cb49c4.png)

ここまでくれば、使えると思う

# もし、すでにインストーラにてインストールしていた場合
少し強引だが、こんな方法がある
### インストーラでインストールしたNode.jsのフォルダにたどり着く
たぶん、
~~~
c:\Program Files\Nodejs
~~~
らへんに入っている

### npmやnpxのファイルを退避させる
適当にフォルダを作って、そこに移動させておく
npm.cmd、npx.cmdも移動させる
あとは、上記の要領でほしいNode.jsを持ってきて配置させてパスを通すだけでOK

### なぜ、これをやるか
インストールされているとき、パスはシステム環境変数側を使って通している。

システム環境変数の方を触れるのであれば、インストーラの方のパスより上に、手動で追加したNode.jsフォルダのパスを設定すればいいが、
管理者権限などの制限がある場合は、ユーザー環境変数のパスに設定せざるを得ない。

しかし、OS自体は、システム環境変数の方を先に認識するので、システム環境変数を変更できない場合は、どうしてもそちらの方を最初に参照してしまう。

それを回避するために、無理やりコマンドを認識できなくさせてやったという形となる。


以上です
MITRE CALDERA v5.0.0 インストール手順

### MITRE CALDERA v5.0.0

米国MITRE社がOSS公開している [BASツール](https://www.softbank.jp/biz/solutions/cybersecurity/security-glossary/breach-and-attack-simulation/) の MITRE CALDERA v5.0.0 が公開されました。

https://medium.com/@mitrecaldera/announcing-mitre-caldera-v5-06798b928adf

https://github.com/mitre/caldera

### インストール手順

早速 Kali Linux に展開してみたのですが、Webログインできないという症状が発生しました。
[CALDERA の Slack](https://join.slack.com/t/mitre-caldera/shared_invite/zt-rvngjjpw-OQHAqpUT87DcyClTosF8dQ) を覗いてみたところ、Node.js や npm などのインストールが必要で、その手順が書いてありましたので共有します。

```bash
# 1) Install git, python, pip, npm
sudo apt update && sudo apt upgrade -y && sudo apt install python3-venv npm git -y
# 2) Update Node & NPM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
source ~/.bashrc
nvm install stable
# 3) Download Caldera
git clone https://github.com/mitre/caldera.git --recursive
# 4) Create environment & activate
cd caldera
python3 -m venv venv
source venv/bin/activate
# 5) Install requirements
pip install -r requirements.txt
# 6) Install Go & add to path
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz && sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz && export PATH=$PATH:/usr/local/go/bin
# 7) Run caldera
python3 server.py --insecure --build
```

しばらくすると端末に大きな CALDERA のロゴが表示されます。 
その後、Webブラウザを開いて `http://localhost:8888/` にアクセスするとログイン画面が表示されます。

```
Username: red
Password: admin
```

でログインできます。

### 関連情報

https://qiita.com/shiracamus/items/658ea3e5b28fa5ae3245

https://qiita.com/shiracamus/items/e1bbdaaeff312e9bd09e

https://qiita.com/shiracamus/items/d2ec398ff6918297ed51

https://qiita.com/shiracamus/items/9c27b08214956b334311
初サイト制作メモ3: PostgreSQL+PrismaでDBを構築

※備忘録用。誤った記載があるかもしれません。コメントで教えていただければ嬉しいです

# 今回利用するもの
- [PostgreSQL](https://www.postgresql.org/)
リレーショナルデータベース（RDB）の作成や操作、管理ができるオープンソースのデータベース管理システム（DBMS）。
VercelではStrageタブから選択できる。
![スクリーンショット 2024-02-21 22.21.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/6c86b6a9-2d4f-0e6a-4b72-f2b56105fe7b.png)

- [Prisma](https://www.prisma.io/)
Node.js ORMの1つ。ORM=Object-relational mapping
プログラミング言語のオブジェクトで定義したメソッドによって、SQLを書かずにデータベースの操作が可能なツール。
ORMについては[こちらの記事](https://qiita.com/minimabot/items/0a3fcc41fd7140dfdc41)がわかりやすかったです。


# PostgreSQLのセットアップ
[Vercelのクイックスタート](https://vercel.com/docs/storage/vercel-postgres/quickstart)を参考に、Vercel PostgresとVercel CLIを追加

`yarn add @vercel/postgres`
`yarn global add vercel@latest`
`vercel link`
`vercel env pull .env.development.local`
※もし`zsh: command not found: vercel`と表示されたら、`export PATH=$PATH:~/.yarn/bin`を実行しておく。
永続的な変更をするには、
PATH環境変数への変更を永続化するためには、~/.zshrcのexport PATHの末尾`に:~/.yarn/bin`を追加

クイックスタート内の通り`app/api/create-pets-table/route.ts`を作成して呼び出すと、VercelのPostgreSQLにpetsテーブルができていることが確認できる
![スクリーンショット 2024-02-21 22.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/66aa807a-7b5f-1618-d638-4754658e97ea.png)


# Prismaのセットアップ
[PrismaのGet Started](https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql)を参考に、セットアップを行う。

`yarn add -D prisma` ※自分はyarnを使っているので。また、typescript ts-node @types/nodeは既に追加済
`npx prisma`
`npx prisma init`
`.env`に、vercel上で確認できる環境変数が入っている状態にする
![スクリーンショット 2024-03-24 17.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/120acabd-6720-2f95-762e-4c36f24d787a.png)


# PrismaからVercel上のPostgreSQLにテーブル作成する

`prisma/schema.prisma`にデータモデルを定義。
![スクリーンショット 2024-03-24 18.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/37dff189-88e9-c3c1-29d7-badc9edf0568.png)

`npx prisma migrate dev --name init`
migrationファイルの生成 + スキーマの変更が実行される
※以降、データモデル定義を変更した場合は、--name の後ろに変更内容をメモ的に入れて実行する。vercelのDBの_prisma_migrationsでメモを確認可能。

DBにテーブルが作成されていることを確認。
![スクリーンショット 2024-03-24 18.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366676/a47cc1b0-10c2-921f-db82-59dd7b180e34.png)
Pythonで環境変数を設定する（dotenv）

右も左もわからずの自分がやってみて面白かったとか、備忘録とかにした方がいいと思った物を記事にしたものなります。もし、必要な方にいらっしゃったら、この記事が役に立てたら嬉しいと思います。
* * *

pythonのキャリアが浅すぎる私。
とりあえず、なんでもいいから最小規模のWebアプリを作りながら勉強と思っていた。
APサーバーからDBに繋ぐためのIDとPWなどをベタがきでソースに書いておいたが、
これをどこかに格納する必要があると思った。
pythonでは何で管理しているんだろう🧐

```python:main.py
DB_HOST=localhost
DB_USER=riku
DB_PASSWORD=Biru-Nomitai
```

## python-dotenvパッケージ
他のパッケージも多いと思うが、自分が取り入れてみたのは「python-dotenv」だ。

インストールはこちら。
```python:terminal
pip install python-dotenv
```

Pythonではpython-dotenvを用いて「.env」ファイルを読み取ることができる。
.envファイルは「key=value」で定義する
```xml
DB_HOST=localhost
DB_ID=riku
DB_PW=Biru-Nomitai
```
上記で設定した後、Pythonでこれらのコードを取ることができる

```python:main.py
from dotenv import load_dotenv
import os

load_dotenv()

db_host = os.getenv('DB_HOST')
db_id = os.getenv('DB_ID')
db_pw = os.getenv('DB_PW')
```

## 開発環境用と本番環境用、それぞれ分けて使おう
開発環境には「.env.dev」、本番環境では「env.prod」ファイルを作り、
環境に合わせてファイルを呼び出すことができる
```python:main.py
from dotenv import load_dotenv
import os

env = os.getenv('ENV', 'dev')

load_dotenv(f'.env.{env}')

db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_password = os.getenv('DB_PASSWORD')
```
```python .env
ENV=dev python dev_main.py
ENV=prod python prod_main.py
```
こうすることで環境により設定を分けることができる。
[PAC] 途中のActionが失敗してもフローを止めずに最後まで実行する設定

しばらく本業が忙しすぎたので久々の投稿です。

これまでPowerShellの投稿しかしてなかったんですが、今年度Power Automateを始めとするPower Platform(App/BI)の技能習得もしたので今後そちらの投稿もしていこうと思います。
今回はPACに関するTipsから。

# 1. やりたいこと
Power Automateはトリガー以降に配置されたActionを順に処理していくものですが、フローによっては途中のActionが失敗する可能性を持つものがあると思います。
(例えばExcelの行取得において条件に該当する行が存在しない、Teamsスレッドへの投稿において指定のIDを持つThreadが存在しない　など)

そんな状況で「途中のActionが失敗してもフローがそこで止まらず、それ以降のActionが実行されるようにする」場合に何をするか、についての説明です。

なお筆者はこの設定を「Forms回答があった場合に、回答に合致する内容をExcelから取得してTeamsのチャットに投稿する」というフローを開発した際にこの設定を調べて知りました。結構あっさりできます。


# 2. フロー全体像
練習用なので下記の簡単なフローをサンプルにします。

トリガー起動した場合、Sharepointの所定のフォルダに保存されているExcel内のTableの内容を更新し、そのTableから値を取得し、その取得した内容をTeamsに投稿するフローだと仮定します。
(各Actionの詳細は設定の説明をするのには不要なので特に説明は無しです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/c6b2305b-4849-3bb9-e15d-c7b9ceb765a4.png)


このフローにおいて、3番目の「行の取得」のActionが失敗しても、フローがそこで止まらずに次の「チャットまたはチャネルでメッセージを投稿する」のActionが実行されるためにはどうすればいいか？を考えます。


# 3. 設定方法
① 失敗する可能性のある<INS>次のAction</INS>において、右側の「…」を選択し、「実行条件の構成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/58dcfe33-42a3-a909-c3ef-6ca77de6086c.png)

② 出てくるチェックボックスの中で「に失敗しました」にチェックをいれる。
(デフォルトでは入ってない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/a063ca79-1e0c-43c0-2630-2729855782ec.png)

これでおしまい。簡単ですが結構便利なテクニックかなと思います。


# おわりに
基本自分用の備忘録ですが何かの役に立つと幸いです。
音声データをテキストへ：WhisperとPythonで簡単変換のテクニック

## はじめに

この記事では、Pythonを使って大きな音声ファイルを分割し、各部分をテキストに変換する方法を紹介します。
これには`openai`と`pydub`ライブラリを使用し、特にOpenAIのAPI（`whisper`）を活用して高精度な音声認識を行います。

OpenAIのAPIで文字起こしができるファイル容量の上限は`25MB`なので、それよりも大きい音声ファイルを扱うときに、ファイルを分割して文字起こしをするプログラムを紹介します。


## 必要なライブラリのインストール

まず、必要なライブラリをインストールしましょう。
これらのライブラリはPythonの環境によってはデフォルトでインストールされていない可能性があるため、以下のコマンドでインストールしてください。

```bash
$ pip3 install tiktoken cohere openai pydub
```

## プログラムのコード

以下が本プログラムの全体のコードです。
このプログラムは、大きな音声ファイルを分割し、それぞれの部分をテキストに変換する機能を持っています。

```python
from openai import OpenAI
from pydub import AudioSegment
import os
import math

# OpenAIのAPIキー設定
OPENAI_API_KEY = "***"
client = OpenAI(api_key=OPENAI_API_KEY)

def split_audio(file_path, size_mb=20):
    """
    指定された音声ファイルを指定されたサイズで分割する。
    :param file_path: 分割する音声ファイルのパス。
    :param size_mb: 分割するサイズ（MB）。
    :return: 分割されたファイルのパスのリスト。
    """
    audio = AudioSegment.from_file(file_path)
    file_size = os.path.getsize(file_path)
    num_parts = math.ceil(file_size / (size_mb * 1024 * 1024))
    length = len(audio)
    part_length = math.ceil(length / num_parts)
    parts = []

    for i in range(num_parts):
        start = i * part_length
        end = min((i + 1) * part_length, length)
        part = audio[start:end]
        part_file_path = f"part_{i + 1}.mp3"
        part.export(part_file_path, format="mp3")
        parts.append(part_file_path)

    return parts

def convert_to_text(file_paths):
    """
    指定された音声ファイルをテキストに変換し、1つのファイルに出力する。
    :param file_paths: 変換する音声ファイルのパスのリスト。
    :return: None
    """
    with open("final_transcript.txt", "w") as final_text_file:
        for i, file_path in enumerate(file_paths):
            with open(file_path, "rb") as audio_file:
                transcript = client.audio.transcriptions.create(
                    model="whisper-1",
                    file=audio_file,
                    response_format="text"
                )
                final_text_file.write(transcript + "\n")

# 使用例
audio_file_path = "/content/240221_1459.mp3"
parts = split_audio(audio_file_path, 20)
convert_to_text(parts)
```

このコードは、音声ファイルを指定されたサイズで分割し、各部分をテキストに変換する流れを示しています。
特に、`split_audio`関数は音声ファイルを分割し、`convert_to_text`関数はそれらをテキストに変換します。

## 使い方

このプログラムを使用するには、まずOpenAIのAPIキーを設定する必要があります。
APIキーを取得したら、`OPENAI_API_KEY`変数にキーを設定してください。

次に、変換したい音声ファイルのパスを`audio_file_path`に設定し、プログラムを実行します。
すると、指定された音声ファイルが分割され、それぞれの部分がテキストに変換され、`final_transcript.txt`に出力されます。

## まとめ

このプログラムは、会議の録音、インタビュー、ポッドキャストなど、長い音声をテキストに変換するのに非常に便利です。
PythonとOpenAIを利用して、効率的かつ正確な音声認識を行うことができます。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
TextMeshPro用のフォントアセット生成時の漢字コピペ用

## 概要

https://qiita.com/kgsi/items/08a1c78b3bee71136156

上記サイトのリストはほぼ全ての日本語文字に対応させる文字セットではあるが、いかんせん文字数が非常に多い(7000文字以上)となり、メモリやアプリ容量を大きく圧迫してしまう。そこでよく使われる漢字のみを用意した文字セットを用意し、それ以外はダイナミックフォントを用いる方法で対応を考えた


## 教育漢字

小学校で習う1006字は**教育漢字**と呼ばれ、常用漢字（2,136字）は別物ではあるが、今回は容量節約のためこちらを用いることにした
以下は小学1年生〜6年生向けの漢字(コピペ用)。改行毎に学年が上がっていく

一右雨円王音下火花貝学気九休玉金空月犬見五口校左三山子四糸字耳七車手十出女小上森人水正生青夕石赤千川先早草足村大男竹中虫町天田土二日入年白八百文木本名目立力林六
引羽雲園遠何科夏家歌画回会海絵外角楽活間丸岩顔汽記帰弓牛魚京強教近兄形計元言原戸古午後語工公広交光考行高黄合谷国黒今才細作算止市矢姉思紙寺自時室社弱首秋週春書少場色食心新親図数西声星晴切雪船線前組走多太体台地池知茶昼長鳥朝直通弟店点電刀冬当東答頭同道読内南肉馬売買麦半番父風分聞米歩母方北毎妹万明鳴毛門夜野友用曜来里理話
悪安暗医委意育員院飲運泳駅央横屋温化荷界開階寒感漢館岸起期客究急級宮球去橋業曲局銀区苦具君係軽血決研県庫湖向幸港号根祭皿仕死使始指歯詩次事持式実写者主守取酒受州拾終習集住重宿所暑助昭消商章勝乗植申身神真深進世整昔全相送想息速族他打対待代第題炭短談着注柱丁帳調追定庭笛鉄転都度投豆島湯登等動童農波配倍箱畑発反坂板皮悲美鼻筆氷表秒病品負部服福物平返勉放味命面問役薬由油有遊予羊洋葉陽様落流旅両緑礼列練路和
愛案以衣位囲胃印英栄塩億加果貨課芽改械害街各覚完官管関観願希季紀喜旗器機議求泣救給挙漁共協鏡競極訓軍郡径型景芸欠結建健験固功好候航康告差菜最材昨札刷殺察参産散残士氏史司試児治辞失借種周祝順初松笑唱焼象照賞臣信成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達単置仲貯兆腸低底停的典伝徒努灯堂働特得毒熱念敗梅博飯飛費必票標不夫付府副粉兵別辺変便包法望牧末満未脈民無約勇要養浴利陸良料量輪類令冷例歴連老労録
圧移因永営衛易益液演応往桜恩可仮価河過賀快解格確額刊幹慣眼基寄規技義逆久旧居許境均禁句群経潔件券険検限現減故個護効厚耕鉱構興講混査再災妻採際在財罪雑酸賛支志枝師資飼示似識質舎謝授修述術準序招承証条状常情織職制性政勢精製税責績接設舌絶銭祖素総造像増則測属率損退貸態団断築張提程適敵統銅導徳独任燃能破犯判版比肥非備俵評貧布婦富武復複仏編弁保墓報豊防貿暴務夢迷綿輸余預容略留領
異遺域宇映延沿我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警劇激穴絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除将傷障城蒸針仁垂推寸盛聖誠宣専泉洗染善奏窓創装層操蔵臓存尊宅担探誕段暖値宙忠著庁頂潮賃痛展討党糖届難乳認納脳派拝背肺俳班晩否批秘腹奮並陛閉片補暮宝訪亡忘棒枚幕密盟模訳郵優幼欲翌乱卵覧裏律臨朗論

## 漢字以外の文字列

これはどこまでいれるか？は用途次第ではあるが、漢字と比べると文字数は少ないためなるべく多く対応できるようにしている

!"#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ@[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ１２３４５６７８９０〜¡¢£¤¥¦§¨©ª«¬ ®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ‒–—―‖‗‘’‚‛“”„‟†‡•… ‰′″‴‹›‼‾⁄⁞⁪⁫⁬⁭⁮⁯€™□　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／◆□■△▲▽▼※〒→←↑↓〓∈∋⊆⊇⊂⊃ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｯｬｭｮｰｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟｳﾞぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞたァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭ─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸＼～∥｜…‥‘’“”（）〔〕［］｛｝〈〉《》「」『』【】＋－±×∪∩∧∨￢⇒⇔∀∃∠⊥⌒∂ABCDEFGHIJKLMNOPQRSTUVWXYZだちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミαβγδεζηθικλμνξοπρστυφχψωЮЯабвгдеёжзийклмн╂÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇∇≡≒≪≫√∽∝∵∫∬Å‰♯♭♪†‡¶abcdefghijklmnopqrstuvwxyzむめもゃやゅゆょよらりるれろゎわゐゑをんムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶопрстуфхцчшщъыьэю♡♪
Laravel + Vue.js で環境構築に戸惑った

# 参考資料
https://zenn.dev/eguchi244_dev/articles/laravel-vue-docker-introduction-20230828#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E7%9B%AE%E6%A8%99

上記サイトを参考にLaravelとVue.jsで環境構築していた。
今回はLaravelの10系で挑戦。


# 現象
dockerにてサーバーを立ち上げたあと、localhostへ遷移すると、以下のエラーが発生し、Laravelの初期画面が表示されない・・・。

```
Vite manifest not found at: /var/www/hogehuga/public/build/manifest.json
```


# 原因
node がインストールできていなかった。



# 対応
- Node.js公式サイト: https://nodejs.org/en/ からNode.jsをインストール

- 以下のコマンドでViteをインストール

`npm install --global vite`

# 次の問題が・・・
タブのtitleにLaravelの表示はあるものの、初期表示が真っ白。。。
デベロッパーツールを開くと、フロント側のエラーが出ている。

# npm run dev
Viteにしたら`npm run dev`をしなくて良いみたいなことを聞いたのですが、初回は必須なのですね。
`npm run dev`で解消しました。

備忘として残します。
E資格で出題される応用数学分野まとめ【E資格対策】

# はじめに
とりあえず、このページでは、E資格よく出る数学について、ざっくばらんに書いていこうと思います。


# 確率・統計
とりあえず、確率・統計のE資格によく出る項目をまとめた。

### <font color="MediumSeaGreen">ベルヌーイ分布</font>

確率 p で 1 を、確率 q = 1 − p で 0 をとる、離散確率分布のこと。

また、「コインを投げたときに表が出るか裏が出るか」のように、何かを行ったときに起こる結果が2つしかない試行のことを「ベルヌーイ試行」という。

### <font color="MediumSeaGreen">二項分布</font>
ベルヌーイ試行をn回行って、成功する回数が従う確率分布を「二項分布」という。

##### 定義
n回のベルヌーイ試行を行うときにちょうどk回成功する確率、すなわちX-kとなる確率は次の式から計算することができる。


```math
\begin{align}
P(X=k) &= {}_n C_{k} ・p^x (1-p)^{n-k} 
\end{align}
```


##### 例
コインを10回投げて表が3回出る確率は、表が出る確率がであることから、次のように計算できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/574ae9be-dd49-28ec-c6d7-ccf1b146e218.png)
https://bellcurve.jp/statistics/course/6979.html



### <font color="MediumSeaGreen">多項分布</font>
多項分布は、よく、出る目が歪なサイコロを振った時に、各目が何回出るかを表現する確率分布として例えられるらしい。

##### 定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/1b3e0e4a-51f0-923f-853f-156f5a20c498.png)


<!-- 
##### 例
＜作成中＞
-->


### <font color="MediumSeaGreen">ガウス分布（正規分布のこと）</font>
もっとも代表的な分布の一つ。だいたいの事象は、正規分布に従うことが多い。
数式は以下のような感じ。
```math
f(x) = \frac{1}{\sqrt{2\piσ^2}}exp[{-\frac{(x-μ)^2}{2σ^2}}] \\
```

### <font color="MediumSeaGreen">ベイズの定理</font>
##### 定義
```math
P(B|A)=\frac{P(A|B)P(B)}{P(A)}
```

##### 解説
これは簡単に導出できる。
AとBの両方が起こる確率は、
```math
P(A,B)=まずBが起こって、その後Aが起こる確率=P(B)P(A|B)　----①
```
一方、以下のようにも表現できる。
```math
P(A,B)=まずAが起こって、その後Bが起こる確率=P(A)P(B|A) ----②
```
①、②より、ベイズの定理が導ける。



## 情報理論

### <font color="MediumSeaGreen">共分散</font>

#### 共分散とは
2組のデータ同士の関係を示す数値のこと。

たとえば、データXとデータYがある場合、
「（データXの偏差）×（データYの偏差）」の平均というのが共分散として定義されているらしい。
式で表すと以下のような感じ。

```math
E[(X−μ_X )(Y−μ_Y )]
```

2変数の積の平均値から平均値の積を引くことからも算出が可能。
式で表すと以下のような感じ。


```math
E[XY]-μ_Xμ_Y
```

### <font color="MediumSeaGreen">相互情報量</font>
2つの確率変数の相互依存度を測る指標。
2つの確率変数が独立だったらゼロになるし、がっつり関係してたら1とかになる。

##### 定義
```math
{\begin{eqnarray}

I(X;Y) &=& \sum_{x,y} P(X = x,Y = y)log\frac{P(X = x,Y = y)}{P(X = x)P(Y = y)}

\end{eqnarray}}
```


<!-- 
##### 解説

＜作成中。式の成り立ちについて書く＞
-->


### <font color="MediumSeaGreen">KLダイバージェンス</font>
Qだと思ってたらPだった時に得られる情報量（驚き具合）を数式に表したもの。
距離みたいな感じだけど、距離ではない(PとQを入れ替えると数値が変わるので)。
以下の式で定義される。
##### 定義
```math
{\begin{eqnarray}

D_{KL}(P||Q) &=& \sum_{x} P(X = x)log\frac{P(X = x)}{Q(X = x)}

\end{eqnarray}}
```

<!-- 

##### 解説

＜作成中。式の成り立ちについて書く＞

-->




### <font color="MediumSeaGreen">JSダイバージェンス</font>
KLダイバージェンスはlogの中の分数の分母が0になっちゃう可能性があるので、それの対策案としてJSダイバージェンスというのがある。

以下の式で定義される。
##### 定義
```math
{\begin{eqnarray}

D_{JS}(P||Q) &=& \frac{1}{2}(D_{KL}(P||R)  + D_{KL}(P||R))

\end{eqnarray}}
```
ただしRは、R(x) = ( P(x) + Q(x) ) / 2 で定義される確率分布とする。


# 参考文献
https://manabitimes.jp/math/853#1

https://ai-trend.jp/basic-study/normal-distribution/normal-distribution/

https://qiita.com/schwarz3374/items/be79574c9a44baeeb169

https://bellcurve.jp/statistics/course/6979.html

https://disassemble-channel.com/multinomial-distribution/

https://bellcurve.jp/statistics/course/6979.html
【Composer】コマンドちょこっとまとめてみました

## 導入
前回は、composerのインストール・基本的なコマンドを紹介しました。

https://qiita.com/umekikazuya/items/841e28180472a7da7959

今回はよく使うよ・便利だよってコマンドやオプションについて10個ほど紹介します。

## コマンド10選
### 1. ``composer show``
インストールされているパッケージの一覧や、特定のパッケージの詳細情報を表示します。バージョン・説明・ライセンスなどの情報が確認可能。
```bash
$ composer show

guzzlehttp/guzzle             7.8.1  Guzzle is a PHP HTTP client library
guzzlehttp/promises           1.5.3  Guzzle promises library
guzzlehttp/psr7               1.9.1  PSR-7 message implementation that also provides comm...
...
```

### 2. ``composer search``
Composer のリポジトリでパッケージを検索します。キーワードに基づいて、利用可能なパッケージを探すことが可能。
```bash
$ composer search command

symfony/console                 Eases the creation of beautiful and testable command line interfaces
symfony/process                 Executes commands in sub-processes
nunomaduro/collision            Cli error handling for console/command-line PHP applications.
...
```

### 3. ``composer dump-autoload``
オートローダーの最適化を行う。オートロードファイルのサイズを減らし、パフォーマンスを向上させることが可能。
```bash
$ composer dump-autoload

Generating autoload files　
# /vendor/ 直下に``autoload.php``が作成される。
```
### 4. ``composer require --dev``
開発環境専用のパッケージを追加可能。
テストライブラリや開発ツールなど、本番環境には不要だけど、開発時に有用なパッケージを管理したいってときに有効。

### 5. ``composer update --lock``
composer.lock ファイルのみを更新します。これは、パッケージのバージョンを変更せずに、ロックファイルのハッシュ値を最新の状態に保ちたい場合で有効。

### 6. ``composer install --ignore-platform-reqs``
インストール時にPHPの依存関係を無視することが可能。
筆者も救われたことが多々あります。

### 7. ``composer create-project``
プロジェクトのスケルトンを作成します。指定されたパッケージを基に新しいプロジェクトを始める際に便利。

### 8. ``composer self-update``
composer 自体のアップデートを行う。

### 9. ``composer help``
特定のコマンドに関する詳細情報を取得可能。
```bash
$ composer help self-update

Description:
  Updates composer.phar to the latest version

Usage:
  self-update [options] [--] [<version>]
  selfupdate
...
```
途中で区切りましたが、オプションや使用方法まで記載してくれます。
便利ですよね。

### 10. ``composer why``
特定のパッケージの依存関係を表示します。プロジェクト内のパッケージ間の依存関係を理解するのに便利。
```bash
$ composer why guzzlehttp/guzzle
__root__ - requires guzzlehttp/guzzle (^7.8) 
```

## まとめ
いかがでしたか？
前回に引き続いて**composer**について紹介しました。

他にもこんなのあるよ。とかあればぜひコメント下さい。

## 参考

https://getcomposer.org/

https://packagist.org/
新規アカウントでEC2のリージョンが制限されてたのでリージョン変更を申請

新規アカウント作成時後に、AWSより以下の内容のメールが届いた。

> Dear AWS Customer,
>
> Thank you for signing up with Amazon Web Services!
>
> As a new customer, you can launch Amazon Elastic Compute Cloud (EC2) instances in 3 AWS Regions. If you prefer other Regions, then contact us through the Support Center: (please click here)
>
> Let us know which 3 Regions are more convenient for you. You can find the list of Regions and the services that are available in each at http://aws.amazon.com/about-aws/globalinfrastructure/regional-product-services/.
>
> Make sure that you aren't running EC2 instances in the Region that you're transitioning from.
>
> If you have a use case that requires you to run EC2 instances in more than 3 Regions, then contact us through the Support Center: (please click here)
>
> Describe your use case, and we'll increase the number of available Regions.
>
> Note: This limitation is temporary and only affects EC2. Other AWS services are available in all Regions.


Asia Pacific (Tokyo) ap-northeast-1 のサービスクォータ `Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances`が 0 となっていた。

レイテンシーを考えると東京リージョンを使いたいので、サポートにコンタクトをとる。

以下のような内容のサポートケースで、使いたいリージョンを連絡。

- Service: Account
- Category: Other Account Issues
- Severity: General question
- Subject: Request to Change Region for EC2 Launch
- Description:
  I would like to be able to launch EC2 instances in the following three regions:
  - US East (N. Virginia) us-east-1
  - US West (Oregon) us-west-2
  - Asia Pacific (Tokyo) ap-northeast-1

1日経って、対応したとのレスポンス。

AWS default quota value が 5 だから、クォータ引き上げもしておけばと思ってたけど、32 でセットされていた。

後日見たら 64 だった。

見間違いだったのか、更に増えたのかわからないけど、東京リージョン以外の利用リージョンは 32 だった。
kotomamba-2.8B-v1.0は『雪国』の冒頭をどうトークナイズするのか

Kotoba Technologiesから[kotomanbaがリリース](https://zenn.dev/kotoba_tech/articles/3eb0984d8fdfb8)されたので、とりあえずトークナイザを試してみることにした。ただ、[kotomamba-2.8B-v1.0](https://huggingface.co/kotoba-tech/kotomamba-2.8B-v1.0)のトークナイザは、[Megatron-LM](https://github.com/NVIDIA/Megatron-LM)のかなり古いバージョンをベースにしていて、今となっては動かしにくいシロモノだった。Google Colaboratoryだとこんな感じ。

```
!pip install transformers sentencepiece
!test -d kotomamba || git clone --depth=1 https://github.com/kotoba-tech/kotomamba
from kotomamba.megatron_lm.megatron.tokenizer import build_tokenizer
from transformers.utils import cached_file
arg=type("",(object,),{})
arg.tokenizer_type="SentencePieceTokenizer"
arg.tokenizer_model=cached_file("kotoba-tech/kotomamba-2.8B-v1.0","tokenizer.model")
arg.vocab_extra_ids=0
arg.make_vocab_size_divisible_by=128
tkz=build_tokenizer(arg)
print([tkz.inv_vocab[t] for t in tkz.tokenize("国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。")])
```

私(安岡孝一)の手元では、以下の結果となった。

> ['▁', '国境', 'の', '長', 'い', 'トンネル', 'を', '抜け', 'る', 'と', '雪国', 'で', 'あっ', 'た', '。', '夜', 'の', '底', 'が', '白く', 'な', 'った', '。']

非常に残念だが「雪国であった」を「雪国」「で」「あっ」「た」とトークナイズしておきながら、その一方「白くなった」を「白く」「な」「った」とトークナイズするようなトークナイザは、あまりに使い勝手が悪い。さて、何とかならないかなぁ。
PagerDutyとは？

## PagerDutyとは
PagerDutyは、システムやアプリケーションの監視、障害通知、および対応プロセスを管理するためのクラウドベースのインシデント管理ツール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303394/bab31911-89df-726a-890f-1789c2b30423.png)
参考：https://www.pagerduty.com/platform/incident-management/analytics/

## そもそもインシデント管理ツールとは
インシデントは、「情報漏洩」や「ウイルス感染」といったセキュリティ上の「インシデント」だけではなく、「サービスにアクセス・ログインできない」「サービス利用中に処理落ちしてしまう」といった利用上の不具合を含むのが一般的。

つまりインシデント管理ツールは、**「通常状態とは異なる何か」がおこった場合に検知・通知し、根本となる原因を探ってくれるツール**

### インシデント管理ツールが必要な理由
一言でお伝えすると、「**様々な監視ツールのアラートを集約する必要がある**」ため。

ひとつのサービスないしシステムの中で、様々な監視ツールや障害検知ツールが含まれていると、そのツールに依存した条件やタイミング、異なる通知方法でエンジニアにバラバラに連絡がいってしまう。また、大きな組織になればなるほど関わるエンジニアは増えるため、そのアラートに対して誰がどのタイミングで対応するのか、そもそも対応済みなのかといった管理が難しくなり、現場が混乱してしまう可能性がある。

そのため、アラートを一元管理して通知してくれるインシデント管理ツールが必要となり、複数の監視ツールの中から必要なアラートだけを担当者へ確実に通知するシステムは、サービス運用におけるインシデント管理において欠かせないツール。

## PagerDutyの特徴
特徴としては、以下4点

**アプリケーションのアラートを確実に通報**
・連携アプリは300以上。重要度の重み付けや対応マニュアルの添付により、シームレスな対応が可能。
・また、インシデントの重要度な重みづけにより「今すぐに対応すべき業務」が明確化されるため、エンジニアにかかる無駄な負担を削減される。


**規範的なダッシュボードとセルフサービス分析**
・運用指標とKPIを視覚化、組織間での調整を行い、より良いビジネス成果を実現可能。

**運用状況をレポート機能で可視化**
・インシデント対応ワークフローをすべて1か所で管理しながら、アプリケーション、サービス、インフラストラクチャの状態を視覚化可能。

**オンコールエンジニアのスケジューリングが可能**
・チームやスタッフの負荷などを把握することが可能。


## PagerDutyのメリットデメリット
### メリット
**障害を未然に防ぐ**
・障害の発生後には高度な分析と詳細レポートにより、インシデントの根本原因を追求し、将来のインシデントに備えることが可能。

**オペレーション効率の向上**
・インシデントが発生した際に対応すべきフローを事前に登録しておくことが可能。
事前にフローを組んでおくことで、属人化を排除し適切かつ迅速な障害対応を可能にします。エンジニアの負荷状況もダッシュボードで管理することができ、状況にあわせた柔軟な割り振りを行い、オペレーションの効率化を図る。

**コスト削減**
・インシデント発生から解決までの調査・改善工数を減らし、再発を防ぎます。結果としてオンコール要因の削減、属人化の削減を行うことで運用コストを削減することが可能。

**顧客満足度の向上**
・インシデント対応によるサービスのダウンタイムを減らすことで、顧客満足度のアップに貢献する。
また安定性・信頼性を担保することで、結果としてサービスのスケーラビリティにも大きく貢献。

### デメリット
**学習曲線**
・PagerDutyは強力なツールですが、適切に設定するには一定の学習曲線がある。
新しいユーザーがシステムを理解し、最適な設定を行うまでに時間がかかる場合あり。

**過剰な通知**
・設定が不十分な場合、PagerDutyは過剰な通知を送る可能性あり。
これにより、チームの負担が増加し、通知の重要性が低下する場合あり。

**依存度の増加**
・PagerDutyを使用することで、組織はシステムの障害対応に強く依存する可能性あり。
このため、PagerDuty自体の可用性や信頼性が重要になる。

## まとめ
PagerDuty=インシデント管理ツールの1つで**非常に機能が豊富で利便性の高いツール**

[PagerDuty](https://www.pagerduty.com/platform/incident-management/analytics/)