OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle Cloud Infrastructureという名前のアプリ

先日、スマホにOCI2段階認証用のアプリをAndroid端末に入れようとGooglePlayで「Oracle」と検索したら色々と出てきました。

Fusionとかプリマベーラとかのアプリもあるんですね・・・
で、気になったのは「Oracle Cloud Infrastructure」というアプリ。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/9afc17e0-3c3d-d428-1e43-02f3c9289a27.jpeg)


OCIそのまんまの名前ですが、聞いた事が無かったのでとりあえずインストールしてみました。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/46796f32-e39c-240c-bfd8-0653b257c2e1.jpeg)


起動するとOCIのロゴが出てきました！
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3387e083-13ae-9939-da65-4b37dc86cd69.jpeg)


Sign Inボタンがあったので押下すると・・・
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/b5376fa4-b65c-da4a-ddb1-a382bfe1f5b9.jpeg)


利用規約が出てくるので「I Agree」を押下します。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/8c2b8a36-48ee-3ff1-e323-9295a3d0b768.jpeg)


テナンシー名を入れて続行
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3596d125-d6bf-d695-ba4d-a60c5118928e.jpeg)


アイデンティティ・ドメインはデフォルトのまま
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/216e8f89-da95-03d7-ca0d-8e51cb927967.jpeg)

ユーザー名とパスワードの入力
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/6c147ab6-61f7-c8e9-d191-5ae6a431d432.jpeg)

2段階認証を登録してあるアプリに通知が飛ぶので「許可」します
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/ae8b7cdd-7c3d-28e0-d12c-da8f655163df.jpeg)

ログインできました！
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/62f12c99-1b2d-69ed-f666-63649c06dbfa.jpeg)
自動ログインも有効にしておきます。

ログイン直後の画面では月額利用料金や現在発生しているアラート等を確認できます。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3f8bfc2c-35d6-6860-203f-150d203bd4a6.jpeg)
また、数は限られているものの、リソースの状況も確認できるようです。
試しにコンピュートを選んでみました。

一覧には私が構築した「mikan」という名前のサーバがありましたｗ
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/edadb5ca-1fc0-9379-0765-7d9158dffe82.jpeg)
サーバ名をクリックしてみます。

インスタンスの現在のステータスが表示され、起動・停止・再起動・削除のボタンがあり、アプリ上から操作できるようです。
![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/858e868e-fa60-78bf-b1ee-f9be4413ec29.jpeg)

下の方にスクロールするとメトリックがありました。
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/cde53591-8d45-c753-29c9-fa9887671cd6.jpeg)
CPUの使用率以外にもあ、ネットワークやディスクに関するメトリックもありました。

見た感じ、運用管理をモバイル端末でできるツールで、構築等はできないようです。
ただ、アラートが上がった時にアプリでいち早く情報を確認できるのは便利ですね。
【データベース】なぜデータ型を決めるのか？

# はじめに
RailsでWebアプリを作るうえでデータベースの型という概念が存在します。
※C言語の静的型付け、変数宣言時に型を決めるのとはまた別です。

腑に落とすために学習した内容を記録します。

<br>


# 【結論】なぜデータ型を決めるのか
[1.　メモリの効率的な利用](#1メモリの効率的な利用)
[2.　データの整合性を保証](#2データの整合性を保証)
[3.　演算の正確性](#3演算の正確性)
[4.　パフォーマンスの最適化](#4パフォーマンスの最適化)
[メリット](#メリット)


# 1.　メモリの効率的な利用
■ 非効率的な例
例えば数値型の整数型`int`と浮動小数点型`float`を区別しない場合、以下のことが起こります。

①全ての数値を同一形式で保存する。
②最も汎用性が高く多くの情報を格納できる浮動小数点型が適用される。
③よって整数でも浮動小数点として扱われるため通常よりも多くのメモリを消費してしまう。
⇩
結果としてメモリの使用が非効率的になる。


<br>

■ 日付/時間型の例
日付/時間型には、日付型`date`、時間型`time`、タイムスタンプ型`timestamp`があり

①日付型`date`は年、月、日を表すデータ
②時間型`time`は時、分、秒(ミリ秒やマイクロ秒)を表すデータ
③タイムスタンプ型`timestamp`は日付と時間の両方を格納します。


日付型の場合は特定の日付を記録させるのに適していて、例えば誕生日やイベント開催日など、時間の情報が不要な場合に使用されます。
逆に時間型は具体的な時間(誕生日のイベント開催時間など)が重要で、日付は重要でないため、このように分離させてメモリの消費を抑え効率化させています。


# 2.　データの整合性を保証
■ 未定義の場合
例えば、整数型`int`が未定義で、ユーザーが「5」と入力した場合、システムはこれを**数量として認識できず**、エラーが発生するか誤った処理を行う可能性があります。

<br>

■ 定義の場合
システムが不適切なデータの入力を防いで、適切な処理を行います。


# 3.　演算の正確性
先ほどの`2.  データの整合性を保証`に繋がりますが、数値型であれば数学的演算、文字列型であればテキスト操作など、システムがデータ型に応じた操作を適切に行うことができます。

■ 未定義の場合
例えば、商品の価格が文字列型で保存されている場合。
文字列 ”100” と ”200” のを加算しようとすると、単に文字列連結され"100200"という風に正しい結果が得られない場合があります。

■ 定義の場合
100 と 200 の加算は正しく計算され、結果として 300 という数値が得られます。



# 4.　パフォーマンスの最適化
■ 計算の遅延の例
浮動小数点数 `float` の演算は整数 `int` の演算よりもコストが高く、計算処理が遅くなる可能性があります。

■ 関数の最適化
(従業員の出勤時間と退勤時間を記録し、勤務時間を計算するシステム)
出勤時間と退勤時間が文字列で保存されていると、これらを日付/時間型に**変換**し、その差を計算するのに余計なステップとリソースが必要になります。


# メリット
①効率的なデータ管理を行い、データの種類ごとに最適なストレージ方法を使用できる
②型を制約して、入力されたデータの不整合を防ぎ、エラーの低減に繋がる
③データ型を通じてデータの扱いが予測しやすくなり、プログラムの挙動の安定に繋がる
GASで日付の操作まとめ

### はしがき
Google Apps Scriptは、非エンジニアでも業務に活用する機会が比較的訪れやすい言語ではないでしょうか。
本記事は、業務にスプレッドシートやGoogleフォームを活用している方を対象に、業務の効率化や自動化に使えそうなスクリプトをまとめています。
少しずつ更新予定です。

:::note info
このスクリプトは、スプレッドシートと連動して動くコンテナバインド型スクリプトを想定しています。
:::

## GASでの日付操作
### 日付から要素を取り出す
Google App Scriptで、日付の中の要素を取得したいときに使用できる関数を作成しました。
引数として日付を**inputdate**の中に入れると、その中の様々な要素を取り出せます。

```javascript
function getDateComponents(inputdate){
  const daydict = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; //曜日を文字列で取得する場合の変換用配列
  const input = inputdate;
  const year = input.getFullYear(); // 年を取得
  const month = input.getMonth() + 1; //月を取得
  const date = input.getDate(); //日を取得
  const day = input.getDay(); //曜日を取得
  const daystring = daydict[day];
  const firstDayOfMonth = new Date(year, input.getMonth(), 1); //月内の最初の日を取得
  const dayOfWeek = firstDayOfMonth.getDay(); //月内の最初の日の曜日を取得


  // 月曜日始まりに調整するオフセット
  const offset = (dayOfWeek === 0) ? 6: dayOfWeek - 1; // 月の最初の日が月曜日でない場合、その週を第0週として扱う

  // 今日の日付と今月の最初の日の差を計算（日数のミリ秒単位）
  const diffInDays = Math.floor((input - firstDayOfMonth) / (1000 * 60 * 60 * 24));

  //今月の最初の日の曜日と差を考量して何週目かを計算
  const weekOfMonth = Math.ceil((diffInDays + offset) / 7);

  return{
    year:year,
    month:month,
    date:date,
    day:day,
    daystring:daystring,
    week:weekOfMonth
  };
}
```
以上で、日付から年、月、日、曜日（数字と文字列）、月内の何週目かが取り出せます。

:::note info
週の始まりが日曜日で良い場合は、offsetの記述はまるまる不必要なので削除してください。
:::
:::note warn
GASでは、月は1月から0はじまり、曜日は日曜日から0はじまりで数字が振られています。
:::

### 日付を取得する
```javascript
//今日の日付を取得する
const today = new Date();

//特定の日付を取得する
let year = 2024;
let month = 5;
let date = 1;
const thedate = new Date(year, month-1, date);
```

こちらもどうぞ

https://qiita.com/hymhtm/items/38e1c617a7b55b67006a
『教えてAI』を使ってみた

# 『教えてAI』とは？

GMOインターネットグループのGMO教えてAI株式会社が運営する生成AIプロンプトポータルです。
ユーザーが一度プロンプトを入力するだけで、最大6つの異なるAIモデルから同時に出力結果を取得できるサービスです。この機能により、情報の探索やプロンプトの評価が劇的に効率化されます。

利用できるAIモデルは下記の8モデルになります。

●GPT-3.5
●GPT-4o
●Claude3 Haiku
●Claude3 Sonnet
●Claude3 Opus
●Gemini 1.0 Pro
●Gemini 1.5 Flash
●Gemini 1.5 Pro

具体的な利用の流れは以下の通りです。

1. プロンプトを入力
2. 最大6つのAIモデルが同時に出力結果を生成
3. AIモデルの回答を比較
4. 最適な結果を選択
5. プロンプトの精査と分析作業を効率化

![スクリーンショット 2024-05-27 23.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/14988164-08a9-19f5-1153-416634696cb1.png)

実際の出力結果の例です。各AIモデルの回答が異なるため、人間の性格が出ているかのようで面白いです。


そして、最大のメリットはなんといっても、**OpenAIの「GPT-4o」とGoogleの「Gemini 1.5 Pro」が無料**で利用できる所です。

私は普段GPT-4oを使用していますが、GPT-4とでは比べ物にならないほど性能が上がりました。そんなGPT-4oを無料で使えるとは正直考えられません…しかもGemini 1.5 Proまで…


# 生成AIの新しい活用方法

『教えてAI』のような先進的なAIツールの導入により、生成AIの利用体験が大きく変わります。
このツールを活用することで、情報収集やコンテンツ作成の効率化が飛躍的に向上し、企業や個人がAIを積極的に導入することが予想されます。

具体的には、複数のAIモデルを同時に利用することで、最適な検索結果を迅速に得ることができるため、情報収集の効率が劇的に改善されます。

さらに、各AIモデルの強みと弱みを比較し、用途に応じて最適なモデルを選択することで、高品質なコンテンツ生成が可能となります。
例えば、特定の業務においては、あるAIモデルが他のモデルよりも優れていることがあり、その特性を理解することで、より効果的なコンテンツを生成することができます。
こうしたプロセスは、従来の方法では得られなかった精度とスピードをもたらし、業務の生産性を大幅に向上させると思います。

# デメリットは？

無料で使えて便利とはいえ、まだまだ使いにくさはあります。
以下４点が今後の改善に期待していきたい点になります。

**1. 入力トークン数の制限**
多くのユーザーが利用できるように、入力できるトークン数に制限が設けられています。この制限により、大規模なデータや長文の処理が難しくなる場合があります。

**2. 実行数の制限**
利用状況によっては、1日あたりの実行数が制限されることがあります。これにより、頻繁にAIを使用するユーザーにとっては不便となる可能性があります。

**3. 自分好みにならない**
AIモデルがユーザーの入力データを学習しないため、利用者の特定のニーズや好みに応じた出力を提供することは難しくなります。
つまり、AIが特定のユーザーに最適化されることはなく、全ユーザーに対して同じパフォーマンスを発揮することになります。
また、検索履歴やプロンプト入力の記録が保存されません。

**4. 画像生成やファイル入力の制限**
画像生成やファイルの入力には対応しておらず、各種AI提供元のサービスを利用する必要があります。これにより、別途サービスを利用する手間が発生します。

履歴が残らずAIが自分好みにならない点はかなり不便に感じるかもしれません。


![スクリーンショット 2024-05-28 15.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/e44ae526-7106-abdd-3e1b-8cd4d5fdb595.png)
また、夕方あたりには上記の画像のように止まってしまうこともあったので、利用者が多い時間帯にはサービスが一時的に利用できなくなることもあります。


# まとめ

『教えてAI』は、複数のAIモデルを同時に試すことができるため、生成AIに初めて触れるユーザーにとって、どのモデルが最適かを学びながら利用できる最適なツールです。

ただ、トークン数や実行数の制限など不便な点はあるので、ヘビーユーザーには向かないかもしれません。

マーケティング用のキャッチコピーや短い記事の生成など、テキストベースの出力を求める業務に非常に適しています。

今や生成AIの力は欠かせないものとなっているので、上手に活用していきたいですね。
【BizRobo!】DAロボットのComponent変数設定②

# はじめに
みなさん初めまして。
普段はBizRobo!を用いてRPAの開発を行っています。
今回は初心者が必ずといっても過言ではないComponentの設定についてお話したいと思います。
以前少しだけお話している記事があるので、是非こちらも参照していただけますと幸いです。
[DAのComponentに変数を設定する](https://qiita.com/t_k9006/items/ab5b253d11ea7089681c "過去投稿")

# 設定
#### 変数設定箇所以降にも文字がある場合
###### 例（DAロボットでExcelを操作することはほとんどありませんが例として）

<font color="red">テスト20240101.xls</font>

上記のようにファイル名に日付が含まれたExcelをDAで操作するとします。
この日付を変数で毎回置き換える場合、「はじめに」の項目で貼り付けたやり方では機能しません。
また、日付を変数で持たせているような場合は以下のように設定します。

**<font color="red">"EXECEL.EXE[title=￥"テスト" + 日付の変数 + ".xls￥"]"</font>**
※上記コピペする場合は「￥」を半角に変えてください

上記のように設定することで可変にComponentを対応させることが出来ます。

# ちなみに・・・
私は初めは全く分かりませんでした。
「￥」で囲うことすらもどういうことか分かりませんでしたが、
やっているうちに慣れてくるのと、何をしているかの理解出来るようになるので、
もし苦手な方は諦めずにやっていただければなと思います。

# さいごに
是非この記事を参考にして実践してみてください！
辞書を使ってLeetCodeの Two Sum問題をPythonで解く

## はじめに

こんにちは、りょまです。プログラミング未経験ですが、エンジニアを目指してLeetCodeの問題を1日1題解き、その学びを記事にしています。

今回は「Two Sum」という問題に挑戦しました。
[LeetCode: Two Sum](https://leetcode.com/problems/two-sum/)

間違いや改善点があればご指摘いただけると幸いです。

## 問題の概要

与えられた配列 `nums` と整数 `target` に対して、`nums` の中から2つの数を足して `target` になる組み合わせを見つける問題です。

- 各入力には必ず1つの解が存在すると仮定してよいです
- 同じ要素を2回使うことはできません
- 答えはどの順序で返してもかまいません

例1

入力: nums: [1, 5, 3, 8, 7], target: 10
出力: [1, 4]（nums[1] + nums[4] = 5 + 5 = 10）

例2

入力: nums: [2, 9, 4, 6, 3], target: 12
出力: [1, 3]（nums[1] + nums[3] = 9 + 3 = 12）

制約

- 2 <= nums.length <= 10^4
- -10^9 <= nums[i] <= 10^9
- -10^9 <= target <= 10^9
- 1つの有効な答えが存在する

## 解法
辞書を利用して効率的に問題を解きます。（ハッシュマップとも言います。）

辞書とは、キーと値をセットで格納・取得できるデータ構造のことです。（英語で dictionary なので `dict` とします。）

```Python
# 辞書の例
dict = {'apple': 100, 'orange': 150, 'banana': 200}

# 値の取得
print(dict['apple']) # 出力結果: 100

# 値の追加
dict['lemon'] = 250

# 検索
print('lemon' in dict) # 出力結果: True
```
このようにしてデータの格納、値の取得や追加を実装することができます。上記の例では、キーにフルーツ名、値にそのフルーツの価格を格納しています。

例えば、appleの場合、キーが 'apple' で、値が 100 となります。

辞書の特徴は、3つあります。
- キーと値のペアを効率的に格納・取得できる
- キーは一意であり、重複することはない
- 高速な検索、挿入、削除操作ができる（平均的な時間計算量は O(1)）

### 具体的な解法
1. numsをループで1つずつ見ていく
2. targetからnumsの各数値を引いた値をcomplement(補数)として、そのcomplementが辞書にあるかを確認する
3. complementが存在する場合、そのインデックスと現在の数値のインデックスを返す
4. complementが存在しない場合、現在の数値とそのインデックスを辞書に追加する

辞書により、全ての要素を一度ずつ確認するだけで良いので、時間計算量はO(n)となる。
・forループの時間計算量: O(n)
・辞書操作の時間計算量: O(1)
・全体の時間計算量: O(n) × O(1) = O(n)

### 実際のコード
```Python
def two_sum(nums, target):
    dict = {}
    
    for i, num in enumerate(nums):
        complement = target - num
        if complement in dict:
            return [dict[complement], i]
        dict[num] = i

nums = [1, 5, 3, 8, 7]
target = 10
print(two_sum(nums, target))

nums = [2, 9, 4, 6, 3]
target = 12
print(two_sum(nums, target))
```

```Python:実行結果
[1, 4]
[1, 3]
```

### コード説明
1. 辞書 `dict` を作成する
2. 配列 `nums` をループし、各要素に以下の操作を行う
   - `target` から現在の数値を計算し、`complement` に格納
   - `if` 文で `complement` が `dict` に存在するか確認
   - 存在する場合、`complement` のインデックスと現在のインデックスを返す
   - 存在しない場合、現在の数値とインデックスを辞書に追加する
3. forループが終了し、if文に引っ掛からなければ最終的に空の [] を返す

あまり馴染みのないコードがありました。
```Python
for i, num in enumerate(nums):
```
これはenumerate関数というもので、インデックス番号と任意の要素を同時に取り出すことができます。

```Python
subjects = ['Math', 'English', 'Science', 'Music']

for i, subject in enumerate(subjects):
    print(i, subject)
```

```Python
0 Math
1 English
2 Science
3 Music
```
このようにenumerate関数を使うことで配列`subjects`に格納されているそれぞれの要素をインデックスと同時に取り出すことができました。

## まとめ
今回の問題は辞書を使うことで、効率的に要素を見つけることができました。
辞書について理解が深まりとても勉強になりました。
MyCobot 280をPythonで制御するためのチュートリアル　(1)

## はじめに

MyCobot 280は、Elephant Robotics社が提供するコンパクトでパワフルな6軸ロボットアームです。このチュートリアルでは、Pythonを使用してMyCobot 280を制御する方法を紹介します。Windows環境でのセットアップから基本的なAPIの使用例までを詳しく解説します。

![mycobot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/e2b7db9f-6e6c-b80f-f726-563b4c07ae4e.jpeg)

次回の記事です。

https://qiita.com/kotai2003/items/af5ea5e1a88a6e952b2b

https://qiita.com/kotai2003/items/8b15a25194a8352ad641

## 前提条件

- Windows PC
- MyCobot 280ロボットアーム
- Python 3.xがインストールされていること
- USB Type-Cケーブル

## ステップ1: Python環境のセットアップ

### 1.1 Pythonのインストール

Pythonがインストールされていない場合は、[公式サイト](https://www.python.org/downloads/)からダウンロードしてインストールしてください。

### 1.2 仮想環境の作成

仮想環境を作成することをお勧めします。以下のコマンドを使用して仮想環境を作成し、有効化します。

```bash
python -m venv mycobot_env
cd mycobot_env
Scripts\activate
```

### 1.3 必要なパッケージのインストール

`pymycobot`パッケージをインストールします。

```bash
pip install pymycobot
```

## ステップ2: MyCobot 280のセットアップ

### 2.1 ドライバのインストール

MyCobot 280をPCに接続するためのドライバをインストールします。以下のリンクからドライバをダウンロードしてインストールしてください。

- [CP210x USB to UART Bridge VCPドライバ](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers)

### 2.2 MyCobot 280の接続

MyCobot 280をUSB Type-CケーブルでPCに接続し、電源を入れます。

## ステップ3: Pythonコードの作成

### 3.1 MyCobotオブジェクトの初期化

以下のコードを使用して、MyCobotオブジェクトを初期化します。

```python
from pymycobot.mycobot import MyCobot
from pymycobot import PI_PORT, PI_BAUD

# Windows環境でのポートとボーレートを指定
PORT = "COM3"  # ポート番号はデバイスマネージャーで確認
BAUD = 115200

# MyCobotオブジェクトの初期化
mc = MyCobot(PORT, BAUD)
```

### 3.2 基本的な制御

ロボットアームの電源をオンにし、基本的な動作をさせてみましょう。

```python
import time

# ロボットアームの電源をオンにする
mc.power_on()

# 各ジョイントの角度を取得
angles = mc.get_angles()
print("Current Angles:", angles)

# ジョイント1を90度に移動
mc.send_angle(1, 90, 50)
time.sleep(2)

# ロボットアームの電源をオフにする
mc.power_off()
```

### 3.3 複数のジョイントを同時に制御

```python
# 複数のジョイントを同時に制御
angles = [0, 45, 90, -45, 0, 0]  # 各ジョイントの目標角度
speed = 50  # 移動速度

mc.send_angles(angles, speed)
time.sleep(3)

# ロボットアームの電源をオフにする
mc.power_off()
```

## まとめ

このチュートリアルでは、Windows環境でMyCobot 280をPythonで制御するための基本的な手順を説明しました。Python APIを使用することで、さまざまな制御が可能です。さらに詳細なAPIや高度な使用方法については、公式の[ドキュメント](https://docs.elephantrobotics.com/docs/gitbook-en/7-ApplicationBasePython/)を参照してください。

## 参考資料

https://docs.elephantrobotics.com/docs/gitbook-en/7-ApplicationBasePython/

https://download-elephantrobotics.oss-cn-shenzhen.aliyuncs.com/Product_software/myCobot/%E4%BA%A7%E5%93%81%E7%94%BB%E5%86%8C/shrink/myCobot280M5-brochure-2022.11.23.pdf

https://note.com/npaka/n/n7f2dd658af7f

https://github.com/elephantrobotics/pymycobot/blob/main/README.md

https://www.techlife-hacking.com/?p=956

https://zenn.dev/karaage0703/books/3be6bad93b0c8e/viewer/d5e138
Next.jsのDocumentが理解出来てなかったのでメモっておく

# Documentとは
ページがレンダリングされるときに<html> タグと <body> タグを拡張するために使用される。
このファイルはサーバーサイドでのみレンダリングされます。
そのためonClickなどのイベントハンドラーはDocumentで利用できない。

# 使い方
Next.jsのpagesコンポーネントは、デフォルトで<head>、<body>を定義してくれるが、これらを変更したい場合はpages/_document.jsを使う。
この時にDocumentをextendsする。
Html, Head, Main, NextScriptのいずれかが不足しているとエラーが発生します。

```react
import Document, { Html, Head, Main, NextScript } from 'next/document'

class MyDocument extends Document {
  render() {
    return (
      <Html>
        <Head>
          <link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP" rel="stylesheet" />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    )
  }
}
```

# 参考
[Next.jsの_document.jsを理解する](https://zenn.dev/oozato/scraps/f21351a602a9cb)
[Custom Document](https://nextjs.org/docs/pages/building-your-application/routing/custom-document)
[カスタム Document(https://nextjs-ja-translation-docs.vercel.app/docs/advanced-features/custom-document)
[Next.jsのnext/headとnext/documentについて](https://curucuru.co.jp/blog/20230606_next_head)
Excelのショートカットキーについて

こんにちは、大野と申します。
今回は実はこんなショートカットキーも存在するんだということを紹介したいと思います。
　※Ctrl+C　→　コピーなどごくごく一般的なものは掲示していない場合があります。


 ## データ入力・繰り返し
 F4　→　直前の操作を繰り返す
 F2　→　セルを編集する
 Alt + Enter　→　セル内改行
 Alt + ↓　→　ドロップダウンリストを表示する
 Ctrl + D　→　上のセルのデータをコピーする
 Ctrl + R　→　左のセルのデータをコピーする
 Ctrl + ;　→　現在の日付を入力する
 Ctrl + :　→　現在の時刻を表示する
 Ctrl + J　→　改行コードを入力する


 ## 数式の入力
 Shift + ALT + ＝　→　sum関数を入力する
 
 ## セルの操作
 Alt + H → V → V　→　値を貼り付ける
 Alt + H → V → K　→　書式を貼り付ける
 Alt + H → O → A　→　行の高さの自動調整
 Alt + H → O → I　→　列の幅の自動調整
 Ctrl + Alt + V　→　形式を選択して貼り付ける
 Ctrl + -　→　選択範囲を削除する
 Ctrl + 1　→　セルの書式設定を表示する
 Ctrl + 9　→　行を非表示にする
 Ctrl + 0　→　列を非表示にする
 Ctrl + B　→　太字にする
 Ctrl + I　→　斜体にする
 Ctrl + U　→　下線を引く
 Ctrl + 5　→　文字に取り消し線を引く
 Shift + Ctrl + 6　→　外枠罫線を引く
 Shift + Ctrl + ￥　→　罫線を削除する
 Shift + Ctrl + +　→　セル、行、列を挿入する

 ## セルの移動と選択
 Ctrl + ↑・↓・←・→　→　データの端に移動する
 Ctrl + End　→　最後のセルにジャンプする
 Ctrl + .　→　選択範囲の最後のセルに移動する
 Ctrl + [　→　参照元セルに移動する
 Ctrl + G　→　ジャンプを表示する
 Shift + Ctrl + ↑・↓・←・→　→　データの端まで選択する
 Shift + Ctrl + *　→　表全体を選択する
 Shift + Space　→　行全体を選択する
 Ctrl + Space　→　列全体を選択する
 Alt + ;　→　可視セルのみを選択する
 

 ## Altを使ったショートカット
 Altを使用したショートカットには特徴があります。
 例えばExcelを開いてホームが選択された状態にしてください。
 その状態でAltを長押しするとショートカットが存在する機能の上にショートカットキーが表示されます。
 あとは使いたい機能をAltを押したまま選択するだけです。

 
## 最後に
 普段Excelを使っている方なら知っているという人もいるかと思いますが、普段使わないと、思っている以上に便利な機能を知らないものですよね。当記事を書くために調べていてとても勉強になりました。
 当記事の内容が少しでも作業の役に立てれば幸いです。

 以上、大野でした。
002024000530調査

PE（Provider Edge）ルータとクラウド間のBGP Peer Downの原因として考えられる理由は、一般的なBGP Peer Downの原因に加えて、クラウド特有の要因も含まれます。以下に主要な原因を挙げます。

1. ネットワーク障害
物理リンクの障害: クラウドプロバイダーとの接続の物理的なリンクがダウンすることがあります（例：ケーブル断線、ネットワーク機器の故障）。
インターフェース障害: PEルータのインターフェースやクラウド側のインターフェースの障害。
2. 設定ミス
IPアドレスの設定ミス: PEルータやクラウド側のIPアドレス設定の誤り。
AS番号の設定ミス: 自律システム番号（AS番号）の設定ミス。
BGPピア設定ミス: BGPピアリングの設定ミス。
3. ネットワークの変動
ルーティングループ: ネットワーク内でルーティングループが発生すると、BGPセッションがダウンすることがあります。
ルートフラッピング: 頻繁なルート変更が原因でBGPセッションが不安定になることがあります。
4. ACL（アクセスコントロールリスト）の問題
ACLの設定ミス: BGPトラフィックが誤ってACLでブロックされること。
5. セキュリティ問題
DoS/DDoS攻撃: クラウドプロバイダーやPEルータがDoS/DDoS攻撃を受けると、BGPセッションがダウンすることがあります。
不正なルートアドバタイズ: 不正なルートアドバタイズが原因でBGPセッションが切断されること。
6. タイマーの問題
ホールドタイムアウト: BGPホールドタイムが切れるとセッションがダウンします。
キープアライブメッセージの問題: キープアライブメッセージが適切に送受信されない場合、セッションがダウンすることがあります。
7. クラウドプロバイダーのメンテナンスや変更
クラウドメンテナンス: クラウドプロバイダー側で計画的なメンテナンスが行われることがあります。
クラウド設定の変更: クラウド側でBGP設定が変更されることがあります。
8. ネットワークポリシーの問題
クラウドのポリシー変更: クラウドプロバイダーがネットワークポリシーを変更した結果、BGPセッションが影響を受けることがあります。
9. リソースの問題
PEルータのリソース不足: CPUやメモリの不足が原因でBGPセッションが維持できないことがあります。
クラウドリソースの問題: クラウド側のリソース（例えば、仮想ルータのリソース）が不足している場合も考えられます。
10. ソフトウェア/ハードウェアの問題
ソフトウェアのバグ: PEルータやクラウド側のソフトウェアにバグがある場合。
ハードウェアの故障: ルータやクラウド側の機器のハードウェア故障。
トラブルシューティングのポイント
ログの確認: PEルータとクラウド側の両方でログを確認し、BGPセッションがダウンした具体的な理由を探ります。
BGPデバッグ: 詳細なデバッグ情報を取得して解析します。
設定の確認: PEルータとクラウド側のBGP設定を再確認します。
クラウドプロバイダーとの連携: クラウドプロバイダーに問い合わせて、問題の有無やメンテナンス状況を確認します。
ネットワーク監視ツールの活用: ネットワーク監視ツールを使用してトラフィックやリソースの状況を監視します。
これらのポイントを踏まえて、原因を特定し、適切な対策を講じることが重要です。












MTU（Maximum Transmission Unit）の不一致が原因でBGP Peer Downが発生する可能性はあります。具体的には、以下のような状況が考えられます。

MTU不一致による問題のメカニズム
TCPセッションの問題:
BGPはTCP（通常はポート179）を使用してピア間のセッションを確立します。MTUの不一致があると、TCPセグメントが途中で分割され、フラグメント化されることがあります。フラグメントが途中で失われたり、正しく再構築されなかったりすると、TCPセッションが不安定になります。

Path MTU Discovery（PMTUD）の失敗:
BGPセッションが確立された後、経路MTU探索（PMTUD）によって最適なパスのMTUが検出されます。しかし、ネットワーク機器やファイアウォールがICMPフラグメント化必要メッセージをブロックしている場合、PMTUDが失敗することがあります。これにより、大きなパケットが送信され、途中でドロップされる可能性があります。

BGPメッセージの分割:
BGPメッセージがMTUサイズを超える場合、それが正しく分割されずに伝送されると、メッセージが途中で失われることがあります。特に、大規模なBGP更新や複雑なルート情報を含むメッセージが影響を受けやすくなります。

実際のBGP Peer Downの原因
MTUの不一致が直接BGP Peer Downの原因となる場合、以下のような症状やログメッセージが観察されることがあります。

BGPセッションの頻繁な再確立: BGPセッションが頻繁に確立されては切断される状況。
BGPキープアライブやホールドタイムアウト: キープアライブメッセージが適切に送受信されず、ホールドタイムが切れることによるセッションの切断。
ログメッセージ: デバイスのログにMTUに関連するエラーメッセージが記録されることがあります。
トラブルシューティング
MTU不一致が原因でBGP Peer Downが発生しているかどうかを確認するための手順は以下の通りです。

MTUサイズの確認: BGPピア間のリンクで設定されているMTUサイズを確認し、一致しているか確認します。
PMTUDの検証: PMTUDが正常に動作しているかを確認し、必要であればICMPメッセージのフィルタリングを調整します。
Pingテスト: 大きなパケット（MTUサイズに近いサイズ）を使用してPingテストを行い、フラグメント化やパケットロスが発生していないか確認します。
TCP MSS調整: TCP最大セグメントサイズ（MSS）を調整して、フラグメント化を防ぐ設定を行います（例：MSSを1400バイトに設定）。
ルータやスイッチのログ確認: BGPセッションが切断された理由を示すログを確認します。
対策
MTUサイズの統一: BGPピア間のリンクで一貫したMTUサイズを設定する。
ICMPメッセージの許可: ネットワークデバイスやファイアウォールでICMPフラグメント化必要メッセージを許可する。
TCP MSSの調整: BGPセッションで使用されるTCP MSSを適切な値に調整する。
これらの対策を講じることで、MTUの不一致によるBGP Peer Downのリスクを低減することができます。
Javaの `ArrayList` と `List` の違いの理解


Javaプログラミングをしていると、リストを使う場面で `ArrayList` を使うか `List` を使うかで迷うことがあります。この記事では、`ArrayList<Integer> array = new ArrayList<Integer>();` と `List<Integer> array = new ArrayList<Integer>();` の違いを整理していきます。

## 宣言の違い

### `ArrayList<Integer> array = new ArrayList<Integer>();`

これは、`ArrayList` 型の変数 `array` を宣言しています。具体的な `ArrayList` クラスを直接使うので、`ArrayList` 固有のメソッドや機能にアクセスできます。

```java
ArrayList<Integer> array = new ArrayList<Integer>();
array.ensureCapacity(100); // ArrayList 固有のメソッド
```

この例では、`ArrayList` の `ensureCapacity` メソッドを使っています。このメソッドは、`ArrayList` 特有のものです。

### `List<Integer> array = new ArrayList<Integer>();`

こちらは、`List` インターフェース型の変数 `array` を宣言しています。`ArrayList` を実装として使っていますが、コードの他の部分では `List` インターフェースのメソッドしか使いません。

```java
List<Integer> array = new ArrayList<Integer>();
// array.ensureCapacity(100); // List インターフェースにはこのメソッドがないため使用できません

// 他の List 実装に変更が容易
array = new LinkedList<Integer>();
```

この例では、後から `LinkedList` に変更しても問題なく動作します。`List` インターフェースを使うことで、具体的な実装に依存しない柔軟なコードが書けます。

## インターフェースと実装の違い

### List インターフェース

- `List` はリストの一般的な操作を定義するインターフェースです。
- `ArrayList` や `LinkedList` など、複数の実装クラスがあります。
- `List` インターフェースを使うと、具体的な実装に依存しないコードが書けます。

### ArrayList クラス

- `ArrayList` は `List` インターフェースを実装した具体的なクラスです。
- 配列に基づいたリストの実装で、要素のランダムアクセスが高速です。
- 固有のメソッドや機能があり、直接使用する場合はそれらを利用できます。

## 使い分けのポイント

### `ArrayList<Integer> array = new ArrayList<Integer>();` を使う場合

- 具体的な `ArrayList` クラスの機能を使いたい場合。
- 実装が変更されないことが確実な場合。

### `List<Integer> array = new ArrayList<Integer>();` を使う場合

- インターフェース型を使うことで、後で `List` の他の実装に変更する可能性がある場合。
- より柔軟でメンテナンスしやすいコードを書きたい場合。

## 具体的な例

以下の例で、`List` 型を使うメリットを示します。

```java
// インターフェース型の使用
List<Integer> array = new ArrayList<Integer>();
array.add(1);
array.add(2);
array.add(3);

// 実装を変更しても問題ない
array = new LinkedList<Integer>();
array.add(4);
array.add(5);
```

このように、インターフェース型を使うことで、後で実装を変更する際の影響を最小限に抑えることができます。

## まとめ

- `ArrayList<Integer> array = new ArrayList<Integer>();` は具体的な `ArrayList` 型を使い、 `ArrayList` 固有のメソッドや機能にアクセスできます。
- `List<Integer> array = new ArrayList<Integer>();` は `List` インターフェースを使い、コードの柔軟性とメンテナンス性を高めます。後で実装を変更する場合に便利です。
TypeScriptでJSONをfetchして出力する


シリーズのトップは↓こちら

https://qiita.com/every-month/items/a6a9f481ac31eb695d25

前回の記事は↓こちら

https://qiita.com/every-month/items/8f20dc7fde2b25be386f

たまたま再びプライベートで人にTypeScriptを叩き込む機会がありまして、せっかくなので再びこの場をお借りしていっしょに復習します。

## 前回の復習（再掲）

- `mkdir`
    - フォルダを作る
- `cd`
    - フォルダの中に入る
- `npm install --save-dev tsx`
    - TypeScriptを実行するためのパッケージを取ってくる
- `console.log`
    - コマンドの画面に出力する
- `npx tsx src/index.ts`
    - `src/index.ts`に書いたTypeScriptを実行する

↑これらはよく使うので慣れると便利です♪

## 今回のポイント

- `const response=await fetch("ここにURL");`して`const json:any=await response.json();`する
    - ネットからJSONを取ってくる
    - 最初は覚えるだけでもいいかも
        - HTTPの理解
        - これだけで~~ご飯３杯いける~~相当話ができる
- `console.dir(json,{depth:null});`
    - オブジェクトの中身を見る
    - `console.log`とは違う
- オブジェクトの中身は`.`で使う
    - `json.last_price`みたいに

↑特に`.`はもうすごく使いますのでまず間違いなく覚えるほうがいいと思います♪

## top-level awaitに対する怒られ対応

`await`のしどころが一番外側の場合、`tsx`が怒る場合がありますので、`"type":"module",`を`package.json`にくわえてこんな感じにします。

```json:package.json
{
    "type":"module",
    "devDependencies":{
        "tsx":"^4.10.0"
    }
}
```

## たった３行でJSONを取ってきて出力する

今回はTypeScriptを叩き込んだみんなの大好きな暗号資産であるSymbolの日本円建てでの価格をZaif APIから取得します。

https://zaif-api-document.readthedocs.io/ja/latest/PublicAPI.html#id17

```typescript:src/index.ts
const response=await fetch("https://api.zaif.jp/api/1/last_price/xym_jpy");
const json:any=await response.json();
console.dir(json,{depth:null});
```

忘れずに保存して

```bash:>か$か%か#って書いてあるところに入力してエンター
npx tsx src/index.ts
```

これを実行すると、

```
{ last_price: 3.33 }
```

概ねこのような画面になるのではないでしょうか。
この`3.33`と言うのは必ず`3.33`が出るのではなく、実行する度にその時の最新の終値が出るので、**この数値はよく変わる**と思います。

これがJSONをNode.js側で理解したものの内容です。ほしいものはこれ自体ではなく`3.33`なのでこれを取り出します。

```typescript:src/index.ts(抜粋)
console.dir(json,{depth:null});
```

先程の最後の行↑を↓こう書き換えてみます。

```typescript:src/index.ts(抜粋)
console.dir(json.last_price,{depth:null});
```

ここが今日のポイントです。`json`が`json.last_price`に変わっています。これは`json`の中の`last_price`を使うときにする書き方です。

それでは忘れずに保存して、

```bash:>か$か%か#って書いてあるところに入力してエンター
npx tsx src/index.ts
```

これを実行すると、

```
3.33
```

具体的な**数値は変わるかもしれません**が、例えばこのような表示になるのではないでしょうか。

今回の目標はここまでです🎉

## 今回のポイント（再掲）

- `const response=await fetch("ここにURL");`して`const json=await response.json();`する
    - ネットからJSONを取ってくる
    - 最初は覚えるだけでもいいかも
        - HTTPの理解
        - これだけで~~ご飯３杯いける~~相当話ができる
- `console.dir(json,{depth:null});`
    - オブジェクトの中身を見る
    - `console.log`とは違う
- オブジェクトの中身は`.`で使う
    - `json.last_price`みたいに

↑特に`.`はもうすごく使いますのでまず間違いなく覚えるほうがいいと思います♪
【CircleCI】デプロイ時間を半分にする

## はじめに
インフラをAWSのEC2からECSに切り替えたサービスがありました。以降デプロイ時間が伸びてしまい開発効率が落ちてしまう問題が発生しました。そこでデプロイを短くしようと試みたので方法をまとめます。

## 行ったこと
当たり前かも知れませんが、まずCircleCIのパイプラインから各Jobの実行時間を調べました。Jobの詳細を見ることでStepsとしてJob内の処理も確認できます。

**パイプライン**
![スクリーンショット 2024-05-30 13.12.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/6dcbae49-9a79-748f-0c41-b991bafc8f73.png)

**Job詳細 - Steps**
![スクリーンショット 2024-05-30 13.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/26ed2480-3f45-cced-e66d-47bab4bb5ae6.png)

上記調査からデプロイ時の時間の掛かっている処理やボトルネックがないかを確認しました。

## 対策
具体的に行った対策は下記の2つです。
1. 同時実行
2. Jobの統一


## 対策の詳細
**1. 同時実行**
ビルドしたDockerイメージをECRにプッシュする処理を同期的に行っていたました。その処理を同時実行で並列にしました。これまではJobには切り出されていませんでしたが、Job内のStepsの中で同期的に行われていました。
![スクリーンショット 2024-05-30 13.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/d7d2550d-b302-1c0e-639c-90da37f1083c.png)

https://circleci.com/docs/ja/concurrency/

**2. Jobの統一**
workspaceを使ってJob間でデータを共有している処理が複数ありました。データ共有の処理で1〜2分かかっていたのでJobを統一し短縮しました。

https://circleci.com/docs/workspaces/

**備考**
DLC Docker Layer Cacheを使用しようと考えましたが既に実装されていました。DLCは料金がかかりますが、有効な手段かと思います。

https://circleci.com/docs/ja/docker-layer-caching/

## まとめ
CircleCIのデプロイ時間を短くすると聞いて、最初はハードルが高かったですが理解してみると面白く、理解しやすい部分もありました。開発効率を上げられることにも繋がるので機会があればまた挑戦してみたいです。

## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/
M1 Macにyolov9をインストール

# M1 Macにyolov9を入れたときのメモ（自分用備忘録）
参考：https://note.com/mim_2020/n/n1fe1418bb4c2
いつも環境構築で失敗するので自分用備忘録です。
## githubからダウンロードしてくる
```
git clone https://github.com/WongKinYiu/yolov9
```
## yolov9用に新しい環境を作る
```
cd yolov9
conda create -n yolov9 python=3.9
conda activate yolov9
pip install -r requirements.txt
```
色々な学習済みモデルと検証用の画像をインストール
```
wget -P pretrained -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-c.pt
wget -P pretrained -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt
wget -P pretrained -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-c.pt
wget -P pretrained -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-e.pt
wget -P sample_images https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/bus.jpg
wget -P sample_images https://raw.githubusercontent.com/Megvii-BaseDetection/YOLOX/main/assets/dog.jpg
```
util/general.pyの903行目を変更
```
# 修正前：
prediction = prediction[0] 
# 修正後：
prediction = prediction[0][1]  
```
以下のコマンドを実行して学習済みモデルを使ってサンプル画像から物体を検出する
```
python detect.py --weights pretrained/yolov9-c.pt --source sample_images --data data/coco.yaml --device mps
```
これで動いてruns/exp*フォルダの中に判別された画像が出てくる。
自分で学習させたいときは、https://github.com/WongKinYiu/yolov9 の Training の記述を参考に学習する。
まずはデータをダウンロード：
```
bash scripts/get_coco.sh
```
とてつもなく時間がかかる。
以降はGPUメモリ制限に引っかかって作業が進められていないので、また進捗あったら追記していきます。
CSSのいろいろ


## CSSとは
- HTMLの見た目を定義する
- 実は思ったより高機能
- いろんなTipsがある

----

## セレクタの優先順位
- !important > id指定 > class指定 > タグ指定 > 順番
- それぞれの足し算
- **優先順位に頼らない！**
  ただ、想定通りにいかない原因を探るために優先順位のことを知っておくのが大事

----

## CSSボックスモデルを知っておこう
- margin
- border
- padding
- 内容

----

## サイズがずれる！ってなりませんか？
- デフォルトではサイズ指定は**内容に対して**の指定
  borderとpaddingの分、広くなる
- 奥義「box-sizing: border-box」

----

## calc、ご存知ですか？
- 「メニューは幅300pxで、コンテンツエリアは残りの幅」
  width: calc(100% - 300px)

----

## CSSフレームワーク
- 適用しただけで良い感じの見た目になるすごいやつ
- 目的別に定義されたクラスを利用して見た目をよくしていける
- BootstrapやTailwind、Bulma　など


----

## CSSは書きにくい・・・
- そんなときにCSSメタ言語
- CSSの冗長な記述法を低減
- 関数／変数：「この色よりちょっと暗い色」なんて指定ができる
- SaSS／Less

----

## transitionによるアニメーション
- 要素の 2 つの状態間の変化を定義することでアニメーションとなる
  マウスカーソルが重なったときにじわっと色が変わる、など
- 本格的なアニメーションを作るための仕様もある

----
## CSSのおもしろさ
- 進化が早い：あんなに苦労してたのにプロパティ１つで出来るようになってる・・・
- 奥が深い：苦労はするが、思った通りのレイアウトがシンプルなHTMLタグで実現できたときの嬉しさは格別

----

## 最後に
- Webアプリで見やすい画面・魅力的な画面を作るにはCSSの知識は必須！
- CSSメタ言語は絶対導入してください！
ファイルのバックアップ:QiitaとAndroid標準メモ帳アプリとVSCodeを調べた。

・私のエディター環境のバックアップ状況です。

# Qiita
https://help.qiita.com/ja/articles/qiita-edit#part-d10d07bab9311260

# Android端末に標準でメモ帳アプリ
＞標準アプリで消えてしまったメモは、基本的に復元することができません。
https://notepm.jp/blog/8738#Android%E3%81%AB%E3%83%A1%E3%83%A2%E5%B8%B3%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AF%E6%A8%99%E6%BA%96%E3%81%A7%E3%81%A4%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B

# (別件)miとは？
＞マルチファイル検索・置換
＞検索・置換
＞　複数のファイルからのファイル検索・置換（マルチファイル検索・置換）
＞その他
＞　自動バックアップ機能
https://www.mimikaki.net/mi3/introduction/index.html

# やっぱり、VSCode一択でしょうか。
私はgitを使った事がありません。
chromebookで、VSCodeを使っています。explorer→timeline
https://www.webdesignleaves.com/pr/plugins/vscode-local-history.html
Node.jsをインストールしてTypeScriptでコマンドの画面に文字を出すまで


シリーズのトップは↓こちら

https://qiita.com/every-month/items/a6a9f481ac31eb695d25

たまたまプライベートで人にTypeScriptを叩き込む機会がありまして、せっかくなのでこの場をお借りしていっしょに復習します。

## 今回のポイント

- `mkdir`
    - フォルダを作る
- `cd`
    - フォルダの中に入る
- `npm install --save-dev tsx`
    - TypeScriptを実行するためのパッケージを取ってくる
- `console.log`
    - コマンドの画面に出力する
- `npx tsx src/index.ts`
    - `src/index.ts`に書いたTypeScriptを実行する

↑これらはよく使うので慣れると便利です♪

## Node.jsとnpmのインストール

まずはNode.jsとnpmをインストールします。

ここはパソコンがWindowsの人かMacの人かLinuxの人かによって大幅に違うので、説明をふんわりさせてください😢💦

ただ、ここからダウンロードするのがおそらく近道です。

https://nodejs.org/en/download/prebuilt-installer

ダウンロードしたらインストールします。

今回は本当に入門のつもりなのでnpmを使いますが、もっとがんばりたい人はyarnやpnpmを使って適宜読み替えるのもいいかもしれませんね。

## 作業場所を作ってそこに移動する

コマンドの画面を出します。

VSCodeならフォルダを開いて右クリックのメニューから統合ターミナルが開けます。

WindowsならPowerShellだったりLinuxなら端末だったりターミナルだったりすると思いますが、それを開きます。

だいたいみんなホームフォルダで作業している状態になると思います。
つまり、一番下の行には、これは環境次第ですが、だいたい`>`か`$`か`%`か`#`で終わる行があると思います。
その行に多くの場合パソコンのユーザーの名前が出ていると思います。

フォルダを作ってみます`mkdir ここはフォルダの名前`という感じで入力します。`mkdir`は半角です。横幅の狭いアルファベットです。今回は簡単さを優先してフォルダの名前にはあまり記号を使わないことにします。見づらいばあいは代わりに`_`この記号をつかいますこれは一部の記号が特別な意味で使われがちだからです。

`1_hello_world`という名前のフォルダを作るのであれば↓こうします。この記事ではこの名前で行きます。

```bash:>か$か%か#って書いてあるところに入力してエンター
mkdir 1_hello_world
```

ではこのフォルダが本当にできているか確認します。

```bash:>か$か%か#って書いてあるところに入力してエンター
ls
```

今出た中に作ったフォルダの名前が書かれていることを確認します。

次はその中に移動します。

```bash:>か$か%か#って書いてあるところに入力してエンター
cd 1_hello_world
```

これで完了です。でもせっかくなのでまだこの画面を閉じないでくださいね。

## npmでTypeScriptを動かす準備をする

TypeScriptを動かすために、最近話題の`tsx`というパッケージをインストールします。

```bash:>か$か%か#って書いてあるところに入力してエンター
npm install --save-dev tsx
```

なんか動きます。終わるまで待ちます。

## TypeScriptを書く

今度はこのフォルダの中にもう１つフォルダを作ります。

```bash:>か$か%か#って書いてあるところに入力してエンター
mkdir src
```

この中にTypeScriptのファイルを作ります。

Windowsなら

```bash:>って書いてあるところに入力してエンター
notepad src/index.ts
```

Linuxなら、特に`nano`であれば

```bash:$か%か#って書いてあるところに入力してエンター
nano src/index.ts
```

とすると多くの場合メモ帳アプリが動きます。

早速TypeScriptを書きます！

```typescript:src/index.tsx
console.log("ここにお好みの一言");
```

こんなふうに書くことで実行した時にお好みの一言を出力することができる予定です。

例えばこうしてみます。

```typescript:src/index.tsx
console.log("hello world");
```

これで保存して、メモ帳アプリを閉じます。閉じなくてもコマンドの画面で作業ができる場合は閉じなくてもOKです。
VSCodeの人は閉じなくてもいいですが上のほうのタブのところの●が消えていることを確認します。

## TypeScriptを実行する

今回は`npm`ではなく`npx`です。

```bash:>か$か%か#って書いてあるところに入力してエンター
npx tsx src/index.ts
```

これで先程のお好みの一言が画面に出ていることを確認します。

出てきてたらOK🎉

## 今回のポイント（再掲）

- `mkdir`
    - フォルダを作る
- `cd`
    - フォルダの中に入る
- `npm install --save-dev tsx`
    - TypeScriptを実行するためのパッケージを取ってくる
- `console.log`
    - コマンドの画面に出力する
- `npx tsx src/index.ts`
    - `src/index.ts`に書いたTypeScriptを実行する

↑これらはよく使うので慣れると便利です♪
PythonでExcelの空白行や列を検出して削除するを自動化する方法

Excelデータの処理では、空白行や空白列が頻繁に発生します。これらの空白領域は、表の表示スペースを占有するだけでなく、データ分析の際にバイアスを生じさせ、データ処理の効率と結果の正確性に影響を与える可能性があります。
空白行はデータ集計操作を妨げ、統計カウントの不正確さを招き、空白列はデータ解析ロジックを誤誘導し、後続のデータ分析プロセスに影響を与える可能性があります。
したがって、Excel表から空白行と空白列を削除することは、データ前処理における基本的なタスクです。この記事では、**Pythonを使用してExcelファイルから空白行と空白列を自動的に識別して削除する方法**を紹介します。これにより、データセットの整合性を確保し、後続のデータ分析作業の基盤を固めることができます。

この記事で使用している方法は、[Spire.XLS for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)に基づいています。PyPI：`pip install Spire.XLS`。

## PythonでExcelファイルから空白行と空白列を識別して削除する

ライブラリの `CellRange.IsBlank` 属性は、指定されたセル範囲が空白かどうかを判断し、ブール値を返します。ワークシートで使用されている各行または列を反復処理し、この属性を使用して空白かどうかを判断し、空白の場合は `Worksheet.DeleteRow()` または `Worksheet.DeleteColumn()` メソッドを使用して削除できます。これにより、Excelファイルから空白行と空白列を識別して削除する操作が実現します。

操作手順は以下のとおりです。

1. 必要なモジュールをインポートします。
2. `Workbook` インスタンスを作成し、`Workbook.LoadFromFile()` メソッドを使用してExcelファイルを読み込みます。
3. ワークブック内のワークシートを反復処理し、`Workbook.Worksheets.get_Item()` メソッドを使用してワークシートを取得します。
4. ワークシートで使用されている行を反復処理し、`Worksheet.Rows[].IsBlank` を使用して行が空白かどうかを判断し、空白の場合は `Worksheet.DeleteRow()` メソッドを使用して削除します。
5. ワークシートで使用されている列を反復処理し、`Worksheet.Columns[].IsBlank` を使用して列が空白かどうかを判断し、空白の場合は `Worksheet.DeleteColumn()` メソッドを使用して削除します。
6. `Workbook.SaveToFile()` メソッドを使用してExcelファイルを保存します。
7. リソースを解放します。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookのインスタンスを作成します
workbook = Workbook()

# Excelファイルをロードします
workbook.LoadFromFile("サンプル.xlsx")

# ワークシートをループ処理します
for i in range(workbook.Worksheets.Count):
    # ワークシートを取得します
    worksheet = workbook.Worksheets.get_Item(i)
    # 使用されているすべての行を反復処理します
    for j in range(worksheet.Rows.Length-1, -1, -1):
        # 行が空であるかどうかをチェックします
        if worksheet.Rows[j].IsBlank:
            # 空行を削除します
            worksheet.DeleteRow(j+1)

    # 使用されているすべての列を反復処理します
    for k in range(worksheet.Columns.Length-1, -1, -1):
        # 列が空であるかどうかをチェックします
        if worksheet.Columns[k].IsBlank:
            # 空列を削除します
            worksheet.DeleteColumn(k+1)
         
# ファイルを保存します
workbook.SaveToFile("output/DeleteBlankRowColumn.xlsx", FileFormat.Version2016)
workbook.Dispose()
```

結果
![PythonでExcelファイルの空白行と列を削除する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a514305b-1dd0-3230-76a0-29baa408d3a3.png)

この記事では、Pythonコードを使用してExcelワークブックファイルから空白行と空白列を識別して削除する方法を紹介しました。

Excelファイル処理のその他のテクニックについては、[Spire.XLS for Pythonチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html)をご覧ください。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)
【ChatGPT＋DALL-E3】フラットなベクター画像を生成するための三つのコツ。


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

　今回は、フラットなベクター画像を生成するための三つのコツです。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::
　まずは、ニュース。

　X-Twitterの
　　OpenAIアカウントからの
　　　発表がありました。
[OpenAI正式発表](https://x.com/OpenAI/status/1795900306490044479?t=LPYNieC4mNkFD44Nm-BfQw&s=03)
　DeepL翻訳
「すべてのChatGPTフリーユーザーは、ブラウズ、ビジョン、データ分析、ファイルアップロード、GPTを使用できるようになりました」

　なお、ここには
　　画像生成は含まれません。

　また、
　　ChatGPTからの
　　　ダウンロードも
　　　　ダメなようです。

　それから
　　音声会話については
　　　Web版にはありません。

　　やりたい場合は
　　　アプリ版を導入してください。
　　　　アプリ版の音声は
　　　　　次のものが選べるようです。
![Screenshot_20240530-112440~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/83a18762-200b-2bac-12e0-17ee72c99fc3.png)
***
　さて、
　　本題です。

　今回は、こちらを参照します。
　　[Chase Leanさんポスト](https://x.com/chaseleantj/status/1795785982345957440?t=VejvFA3sx3QQGzIhxtKmAQ&s=03)

　以下は、上記を翻訳したものです。

　フラットなベクター画像を
　　生成するための
　　　より良いプロンプトを
　　　　書くための3つのヒントを
　　　　　紹介します。

　1. 重要：プロンプトには
　　　必ず「minimalistic」を
　　　　追加すること。

　　理由：そうしないと、
　　　生成される画像の
　　　　ほとんどが複雑すぎて
　　　　　使えない。

　2. カラーパレットの使用

　　理由：パレットに言及しないと、
　　　画像は一般的なものに見え、
　　　　スタイルをコントロール
　　　　　するのが、難しくなります。

　　カラーパレットは
　　　即座にあなたのベクターに
　　　　特徴的なテーマを与えます。

　3. 企業的な雰囲気を出したい場合は
　　　大胆な色を使う。

　　こぢんまりとした雰囲気を
　　　出したい場合は
　　　　ソフトな色や
　　　　　パステルカラーを使う。

　　例：
　　　大胆な色： 赤、青、黄、緑、紫
　　　ソフト：ライラック、コーラル、
　　　　クリーム、ベージュ、
　　　　　スカイブルー
***
　ここからは
　　ポストに添付されたPromptを
　　　アップします。

　実際に画像を生成したのですが
　　なぜかQiitaにアップできない
　　　状況なのです。

　Promptをコピーしやすいように
　　コードブロックに入れますね。

　まずは、1番から。

　「minimalistic」の指定。
　　日本語で「ミニマル」でもOK。

　「ミニマル」なし。
```Text:
flat vector of person exercising, natural living
```

　「ミニマル」あり。
```Text:
flat vector of person exercising, super minimalistic style, natural living
```

　次に、2番です。
　　カラーパレットですね。

　カラーパレットなし。
```Text:
flat vector of a woman working on her laptop, super minimalistic corporate style
```

　カラーパレットあり。
```Text:
flat vector of a woman working on her laptop, super minimalistic corporate style, red and white color palette
```

　3番は、雰囲気ですね。

　企業的な雰囲気。
```Text:
flat vector of a man working on his computer, super minimalistic corporate style, red and white color palette
```

　こぢんまりとした雰囲気。
```Text:
flat vector of a girl reading a book with a dog, super minimalistic style, beige color palette
```
***
　どうでしたか？

　私自身、
　　ベクターも
　　　使わなくて、
　　　　今回初めてに近い試みでした。

　この三つは
　　シンプルでありながら、
　　　効果的ですよね。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
BIOSとは

BIOS(バイオス)とはBasic Input Output Systemの略称で、`マザーボード上のROMに搭載されているプログラム`です。
Windows等のOSが起動する前に動作し、パソコン本体に搭載されている`ハードウェア(キーボード・マウス・メモリ・CPU・ハードディスク等)の管理と制御`を行います。

BIOSの設定を変更することで、起動時のハードの読み込みの順序を変更したり、搭載されているハードウェアを使わせたくない場合等に、意図的に無効化したりすることができます。

また、ハードディスクのアクセスにパスワードを用いる設定を行うことで、Windows等のOSが起動する前にユーザーにパスワードを求める事も可能で、動作がハードに依存するために強いセキュリティを実現できます。

反面、BIOSはパソコンの起動の根幹を担うため、`BIOSのアップデートや、操作中の停電等のなんらかの障害で破損した場合、パソコンの起動は不可能`になります。

また、一部ソフトウェアにはBIOSの情報を利用するものがあるため、パスワードをかけた事により動作しないソフトウェアが出てくる場合があります。
# 出典
https://www.e-tamaya.co.jp/html/faq/pc/113.html#:~:text=BIOS(%E3%83%90%E3%82%A4%E3%82%AA%E3%82%B9,%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

　BIOS（バイオス）とは「Basic Input/Output System」の略で、パソコンの基盤であるマザーボードに搭載され、`パソコンの電源が入ってから最初に動き、OSの読み込みや、主にハードウェアを制御するプログラム`です。

　BIOSはパソコン起動時のハードウェア制御だけでなく起動順位の変更やパスワード設定を行うことができます。

　起動順位の変更は、システムが起動中に間違ったストレージを選択してしまう時やOSのインストールができない時に行います。

　パスワード設定は、①コンピューターにログインするために入力するシステムパスワード、②BIOSを設定する際に入力する管理者パスワード、③ハードウェア起動時に入力するハードウェアパスワードと3種類あります。どのパスワードも設定することで不正なユーザーのアクセスを防止します。

　他にも、`パソコンの故障箇所の診断をするためにハードウェアテストを行いCPUやメモリ、HDDの動作に異常がないかの確認`も行うことができます。

# 出典
https://www.mouse-jp.co.jp/mouselabo/entry/2023/11/02/100006#:~:text=%E3%81%BE%E3%81%A8%E3%82%81-,BIOS%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%81%8C%E3%81%AA%E3%81%84%E3%81%8B%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%82%82%E8%A1%8C%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82,-BIOS%E3%81%AE%E7%A8%AE%E9%A1%9E

# 感想
パソコンを起動した時パスワードを要求されるのはBIOSの働きのなのか。
企業ソフトウェア・サービスのオープンソース化、かなりの確率でビジネス放棄の可能性

今日もポエムです。

## オープンソース化かというと耳障りはよいけれど

有名ソフトウェアベンダーのオープンソース化。その後、継続して活動できている例は正直、あまりありませんよね。
根本的には、企業の色がついたソフトウェアを進化させメンテナンスするという作業は、一筋縄はいかないのです。

そういった状況を鑑みた状況での、今日のオープンソース化。オープソース化した理由は、それらしい理由を語るケースが多いですが、実際には、メンテナンスコストとビジネスのバランスが悪かった。その1点につきます。

サポートを中止するという判断は、現ユーザーの反発も買いますし、印象的にも良くありません。だからこその「オープンソース化」な可能性が高いです。

正直、残念ですけどね。
[Dynatrace] ダッシュボードにある一覧表に信号表示🟢🟡🔴を追加して、状態を一目瞭然にしたい！

# テーマ
Dynatraceのダッシュボードに、以下のようなネットワーク機器のインターフェイスの状態の一覧表があるとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/f4fb915b-a4ac-b21a-afa8-01a825e0ab03.png)

これは、SNMP経由でネットワークスイッチから定期的にデータを取得し、インターフェイスの状態を一覧表示したものです。

`up(1)`と`down(2)`といった文字では瞬時に判別しづらいので以下のように表示させたい、というのが今回のテーマです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/175507d8-c734-f21f-b337-8c809664d5dc.png)

一目瞭然ですね！

# どのようにして実現しているか

この一覧表はDQLというクエリ言語を用いて書いたクエリで生成されています。信号表示の無い、オリジナルのクエリは以下のようなものです。

```
fetch `dt.entity.snmp:com_dynatrace_extension_snmp_generic_device_interface`
| filter opStatus != "notPresent(6)"
| fields description, opStatus, highspeed
| sort description asc
```

各行の役割は以下の通りです。
1. SNMP経由で取得している、ネットワークスイッチのインターフェイス一覧を取り出す
2. `opStatus`が`notPresent(6)`である行を取り除く、つまり実在するインターフェイスだけに絞り込む
3. `description`, `opStatus`, `highspeed` のフィールド (列) だけを表示させる
3. `description` ここではインターフェイス名でソートする

どのようなフィールドがあるかを調べるには`describe`を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/0a1ce90c-e0ab-dcbb-e45b-a7430bb69293.png)

ではどのようにして信号表示を追加しているのでしょうか。

```
fetch `dt.entity.snmp:com_dynatrace_extension_snmp_generic_device_interface`
| filter opStatus != "notPresent(6)"
| fieldsAdd Status = if(opStatus == "up(1)", "🟢", else:"🔴")
| fields  Status, description, opStatus, highspeed
| sort description asc
```

オリジナルに対して以下の１行だけを追加しています。

```
| fieldsAdd Status = if(opStatus == "up(1)", "🟢", else:"🔴")
```

ここでは`fieldsAdd`を使って、新たにStatusという名前のフィールドを追加しています。値は、`opStatus`が`up(1)`の時は"🟢"を、それ以外では"🔴"という文字をセットしています。文字ですので"👍"と"👎"や、"🙆"と"🙅"など自由に設定できますが、ここで凝ると一目瞭然でなくなってきますね。

数値データを取るメトリクスに対してであれば、適宜しきい値を決めて、それを超えると"🔴"、といった信号表示フィールドを追加することも可能です。

# データを後から整形・加工したい

このように`fieldsAdd`は非常に強力で、データを見やすく、表現力豊かにできる機能であることを感じていただけたかと思います。

Dynatraceでは、データが取り込まれる時点で、あらかじめ決められた処理が行われます。ログ行から属性を切り出すなどもその一例です。このような処理を取り込み時点だけでなく、後から、つまりデータ利用時にできるのがとても便利です。

後から、こんなフォーマットのデータがほしいとか、いくつかの属性を組み合わせて新しい属性を作りたいといったことが自由にでき、過去のデータにさかのぼって適用できます。

これらの機能を活用して、より見やすくてわかりやすいダッシュボードを、自由度高く作ってみてください。

Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/
モノイダルプロ函手のDay畳み込み

## モノイダル圏
モノイダル圏$\mathscr{M}$とはモノイダル函手$\oplus:\mathscr{M}\times\mathscr{M}\rightarrow\mathscr{M}$が定まった圏で，次を満たすものを言う．
* 単位対象$I\in\mathscr{M}$の存在．
  対象$I\in\mathscr{M}$が存在して任意の対象$M\in\mathscr{M}$に対して．
  ```math
  \begin{align}
  \rho_M&:M\otimes I \simeq M\\
  \lambda_M&:I\otimes M \simeq M
  \end{align}
  ```
  となる同型$\rho_M,\lambda_M$が存在する．
* 任意の対象$A,B,C\in\mathscr{M}$に対して，
  ```math
  \alpha_{A,B,C}:(A\otimes B)\otimes C\simeq A\otimes(B\otimes C)
  ```
  となる同型が存在する．
また互角恒等式と三角恒等式を満たす．
```math
\begin{alignat}{5}
((A\otimes B)\otimes C)\otimes D&\stackrel{\alpha_{A,B,C}\otimes id_D}{\to}&(A\otimes (B\otimes C))\otimes D&\stackrel{\alpha_{A,B\otimes C,D}}{\to}&A\otimes((B\otimes C)\otimes D)\\
\downarrow \alpha_{A\otimes B,C,D}&&&&\downarrow id_A\otimes\alpha_{B,C,D}\\
(A\otimes B)\otimes (C\otimes D)&&\stackrel{\alpha_{A,B,C\otimes D}}{\longrightarrow}&& A\otimes(B\otimes(C\otimes D))
\end{alignat}
```
```math
\begin{alignat}{3}
(A\otimes I)\otimes B&\stackrel{\alpha_{A,I,B}}{\to}&A\otimes (I\otimes B)\\
\rho_A\otimes id_B\downarrow& &\downarrow id_A\otimes\lambda_B\\
&A\otimes B&
\end{alignat}
```
モノイダル圏上の函手をモノイダル函手やモノイダルプロ函手と呼ぶ．
## Day畳み込み
モノイダルプロ函手間の新しい演算としてDay畳み込みを定義する．
Day畳み込みとは人名'Brian Day'から取ってDay Convolutionと命名されている．
モノイダル圏$\mathscr{E}$上のモノイダル函手$F,G:\mathscr{E}\to\mathbb{Set}$に対してDay畳み込み$(F\star G)_{\mathscr{E}}$は次のように定義される．
```math
(F\star G)_\mathscr{E}:=\overline{\bigoplus_{x,y\in\mathscr{E}}}F_{(x)}G_{(y)}\Delta^{(x\otimes y)}_{\mathscr{E}}
```
また，モノイダル圏$\mathscr{C},\mathscr{D}$上のモノイダルプロ函手$P,Q:\mathscr{C}^\mathbb{op}\times\mathscr{D}\to\mathbb{Set}$に対してDay畳み込み$(F\star G)_\mathscr{D}^\mathscr{C}$は次のように定義される．
```math
(F\star G)_\mathscr{D}^\mathscr{C}:=\overline{\bigoplus_{\substack{A,C\in\mathscr{C}\\B,D\in\mathscr{D}}}}P^{(A)}_{(B)}Q^{(C)}_{(D)}\Delta_{(A\otimes C)}^{\mathscr{C}}\Delta^{(B\otimes D)}_{\mathscr{D}}
```
## Day畳み込みの単位元
プロ函手のDay畳み込みは単位元$J_\mathscr{D}^\mathscr{C}$を持つ．
```math
J_\mathscr{D}^\mathscr{C}:=\Delta_{(I)}^\mathscr{C}\Delta_\mathscr{D}^{(I)}
```
左単位律を示す．
```math
\begin{align}
(J\star Q)_\mathscr{D}^\mathscr{C}&=\overline{\bigoplus_{\substack{A,C\in\mathscr{C}\\B,D\in\mathscr{D}}}}J^{(A)}_{(B)}Q^{(C)}_{(D)}\Delta_{(A\otimes C)}^{\mathscr{C}}\Delta^{(B\otimes D)}_{\mathscr{D}}\\
&=\overline{\bigoplus_{\substack{A,C\in\mathscr{C}\\B,D\in\mathscr{D}}}}\Delta_{(I)}^{(A)}\Delta_{(B)}^{(I)}Q^{(C)}_{(D)}\Delta_{(A\otimes C)}^{\mathscr{C}}\Delta^{(B\otimes D)}_{\mathscr{D}}
\end{align}
```
[ここ](https://qiita.com/289CH4n/items/fabdbe5ea7f073640b4f)で，$\Delta$の単位律を用いる．
```math
\begin{align}
&=\overline{\bigoplus_{\substack{C\in\mathscr{C}\\D\in\mathscr{D}}}}Q^{(C)}_{(D)}\Delta_{(I\otimes C)}^{\mathscr{C}}\Delta^{(I\otimes D)}_{\mathscr{D}}\\
&\simeq\overline{\bigoplus_{\substack{C\in\mathscr{C}\\D\in\mathscr{D}}}}Q^{(C)}_{(D)}\Delta_{(C)}^{\mathscr{C}}\Delta^{(D)}_{\mathscr{D}}\\
&=Q^{\mathscr{C}}_{\mathscr{D}}
\end{align}
```
右単位律は省略する．
【忘備録】Slackの古いワークスペースをリストから削除する

![slack_ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683665/d3861dc0-d311-83a9-7188-c17e7e1bdea9.png)

今や、Slackは私の生活の一部。仕事の全部（言い過ぎ）となっています。
フルリモートワークでは、『ここがオフィス』的な重要性があります。

オンラインスクールへ通っていたときにも、校内コミュニケーションがSlackで行われていました。

大変便利だったのですが、卒業後、私はそのワークスペースにいる資格が無くなり、ワークスペースリストのアイコンにはエクスクラメーションマークがついていました。
もうワークスペースへのアクセスがないため、ワークスペース内で『このワークスペースから退出』のようなこともできません。

使わないため、問題ないと言えばないのですが、なんとなく気持ち悪い。
できれば、リストから削除したいと思っていました。

様々なヘルプ情報を照らしても、私のケースが確認できず、結局 Slackサポートへメールしたところ、あっという間に解決しました。

Slack のツールバー上、ヘルプ > トラブルシューティング > キャッシュをクリアして終了
（私のMacが英語になっているため、日本語がちょっと違う可能性あり）
そして、再起動。

なんてカンタンに治せるのか、驚きでしたので、忘備録しておきます。

![slack_menu_ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683665/9d1e2433-a50a-2800-8614-e8772f5c0c0b.png)
robloxでassistant その92

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
RootRigAttachmentを使え。

# 手順
- ReplicatedFirstに、localscriptを追加。
- スクリプトを書く。
```


local player = game.Players.LocalPlayer
player.CharacterAdded:Wait()
local Character = player.Character
wait(5)
local AlignPosition = Instance.new("AlignPosition", Character.HumanoidRootPart.RootRigAttachment)
local VF = Instance.new("VectorForce")
local F = 3690
VF.Force = Vector3.new(0, F, 0)
VF.ApplyAtCenterOfMass = true
VF.Attachment0 = Character.HumanoidRootPart.RootRigAttachment
VF.Enabled = true
VF.Parent = workspace
	

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/265b5bac-067d-7f72-086a-c376650549f3.png)


以上。
Cloud Source Repositories が 2024/6/17 販売終了

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki）です。

プライベートな Git リポジトリサービスである [Cloud Source Repositories](https://cloud.google.com/source-repositories/docs?hl=ja) が 2024/6/17 に販売終了とアナウンスがありました。
ひっそりと？アナウンスされていましたので共有の意味も込めて記事にします。

:::note warn
本記事は2024年5月24日ごろに作成しております。引用している内容は執筆時点のものとなります。
:::

## リリースノートから引用

> Cloud Source Repositories is scheduled for end of sale on June 17, 2024. Starting June 17, 2024, if your organization hasn't previously used Cloud Source Repositories, you cannot enable the API or use Cloud Source Repositories. New projects not connected to an organization can't enable the Cloud Source Repositories API after June 17, 2024. Customers who have already enabled the API prior to this date will not be affected and can continue to use Cloud Source Repositories.

（Google翻訳）
Cloud Source Repositories は、2024 年 6 月 17 日に販売終了となる予定です。2024 年 6 月 17 日以降、組織でこれまで Cloud Source Repositories を使用していない場合は、API を有効にしたり、Cloud Source Repositories を使用したりすることはできません。組織に接続されていない新しいプロジェクトでは、2024 年 6 月 17 日以降、Cloud Source Repositories API を有効にすることはできません。この日付より前に API をすでに有効にしているお客様は影響を受けず、引き続き Cloud Source Repositories を使用できます。

引用元はこちらです。

https://cloud.google.com/source-repositories/docs/release-notes?hl=en

## 既存のユーザーは引き続き使用できる

以下に該当する場合では 2024/6/17 以降、新規の販売が終了するようです。

- 組織配下のいずれかのプロジェクトで Cloud Source Repositories を使用したことがない場合
- 組織なしのプロジェクト

組織配下のいずれかのプロジェクトで Cloud Source Repositories 使用したことがあれば、それまで API を有効化していなかったプロジェクトでも引き続き使用できるとのことです。
（念の為サポートに確認しました。）

## まとめ

- Cloud Source Repositories が 2024/6/17 に新規の販売が終了
- **既存のユーザーは Cloud Source Repositories を引き続き使用できる**
- **組織配下のいずれかのプロジェクトで Cloud Source Repositories を使用したことがあれば、それまで API を有効化していなかったプロジェクトでも引き続き使用できる**
- 組織で使用したことがない or 組織なしのプロジェクト では 2024/6/17 以降 API を有効化できない

現状、既存のユーザーは引き続き使用できるもののその内お知らせがあるかもしれませんね。
IncreLoRA: モジュールの重要度に基づくパラメータ適応追加

※ このページは「IncreLoRA: Incremental Parameter Allocation Method for Parameter-Efficient Fine-tuning」の要約になります。

## このページでわかること
- トレーニング中にモジュールの重要度に基づいてパラメータを適応的に追加する「IncreLoRA」
- 低リソース設定でも高いパフォーマンスを実現
- IncreLoRAは、初期パラメータ数に制限されず、高ランク上限のパラメータ行列を効率的に利用できる

## 対象読者
- 特に自然言語処理（NLP）や大規模言語モデル（LLM）のファインチューニングに関心のある人
- 効率的なモデル微調整手法を用いてトレーニングコストを削減し、パフォーマンスを向上させたい企業の技術者やデータサイエンティスト

## 従来手法の問題点
1. **大規模言語モデルの微調整コスト**：
   - 事前学習済み言語モデル（PLM）のサイズが増大するにつれて、全パラメータを微調整することは効率的ではなく、多数の下流タスクに対してはトレーニングおよびストレージのコストが高騰する

2. **現行の微調整手法の限界**：
   - 既存のLow-Rank Adaptation (LoRA)などのパラメータ効率の良い微調整手法は、各モジュールのパラメータの重要性を無視しているため、最適なパフォーマンスを引き出せないことがある

3. **初期設定の制約**：
   - LoRAのような手法は、トレーニングの初期段階で設定されたパラメータ数に依存するため、最終的なランク上限が制約されてしまい、全体的なトレーニング効率とモデルの性能が制限される

## IncreLoRA
### IncreLoRA とは？
IncreLoRAは、LLMの微調整を効率化するためのインクリメンタルパラメータ割り当て手法です。LoRA（Low-Rank Adaptation）の問題点であるモジュールごとのパラメータの重要性を無視する点を改善し、トレーニング中に各モジュールの重要度スコアに基づいてトレーニング可能なパラメータを適応的に追加します。これにより、初期のトレーニングパラメータ数に制限されず、同じトレーニングコストでより高いランク上限のパラメータ行列を実現します。


#### 低ランク行列の再構成
IncreLoRAは、事前トレーニングされた重み行列Wに対して更新行列ΔWを適用します。LoRAの手法に従って、ΔWは二つの低ランク行列AとBの積として表現されます。しかし、IncreLoRAでは各wiにスケーリングλiを追加し、これを更新します。ΔWの初期状態はゼロに設定され、ランダムガウス分布で初期化されます。

#### 増分パラメータ割り当て
IncreLoRAの主な特徴は、トレーニング中に重要度スコアに基づいて各モジュールにトレーニング可能なパラメータを段階的に追加することです。各モジュールの重要度スコアは、更新行列の全パラメータの平均値として計算されます。スコアは感度平滑化と不確実性定量化を通じて信頼性を高めます。一定のステップごとに、最も高いスコアを持つモジュールに新しいパラメータが追加されます。

#### 学習の安定化
新たに追加されるパラメータがランダムな状態で初期化されるため、これらのパラメータには新しい学習率カーブが設定され、トレーニングの安定性が確保されます。これにより、全てのパラメータがトレーニング終了時にゼロに収束するようになります。

### IncreLoRA のメリット
1. **高いパラメータ効率**：重要なモジュールに適応的にパラメータを追加することで、同じトレーニングコストでより高いパフォーマンスを達成
2. **柔軟なパラメータ割り当て**：トレーニング中にパラメータを増加させるため、初期のパラメータ設定に依存せず、より柔軟なトレーニングが可能
3. **低リソース環境での優れた性能**：低リソース設定でも他の手法に比べて高い性能を発揮し、リソースが限られた環境での応用に適している

### IncreLoRA の手順
1. **初期化**：各モジュールに初期のランク1のパラメータを割り当て、トレーニングの準備を行う
2. **重要度スコアの計算**：トレーニング中に各モジュールの重要度スコアを計算し、パラメータの追加が必要なモジュールを特定する
3. **パラメータの追加**：一定のステップごとに、重要度スコアが高いモジュールに新しいパラメータを追加し、そのパラメータに対して新しい学習率カーブを設定する
4. **トレーニング**：追加されたパラメータを含むモデルをトレーニングし、重要なモジュールに高いランク上限のパラメータを割り当ててパフォーマンスを向上させる

### IncreLoRA の性能
- **実験結果**：GLUEベンチマークでの実験において、IncreLoRAは低リソース設定でも他のベースライン手法を上回る性能を示した
- **パフォーマンス向上**：特に低リソース環境でのパフォーマンスが優れており、GLUEベンチマークの複数のタスクで最高のスコアを達成した
- **効率性**：IncreLoRAは、同じトレーニングコストでより高いパラメータ効率を実現し、トレーニングとストレージのコストを削減する

## まとめ
以上がIncreLoRAの要約でした。個人的に IncreLoRA は LoRA 版 Mixture-of-Experts みたいなイメージを受けましたね。パラメータ効率は良いんでしょうが、実際学習にかかるコストは気になるところです。

おわり。