OmniAICreator/Qiita-1.07M huggingface dataset:
Storage Gatewayとは？

## 初めに
本日はStorage Gatewayについて書かせて頂きます。
皆様のご意見頂けたら幸いです。

## Storage Gatewayとは？
オンプレミスからAWSのストレージサービスへのアクセスを高速かつセキュアに行うことができるサービスの事

###### イメージ
![スクリーンショット 2024-04-02 14.28.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/6bbe50e6-06a3-cec5-55b5-7307b0e87bd7.png)

上記の様にAWS上のストレージサービスにStorage Gatewayを通してアクセスを行います。
種類は後ほどご紹介させて頂きます。

## 種類
![スクリーンショット 2024-04-02 14.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/7dd1ff7c-3216-84dc-a28b-3af501294c1b.png)
種類は、大きく分けて3つ有ります。
①ファイルゲートウェイ
②ボリュームゲートウェイ
③テープゲートウェイ

①と②に関してはさらに分けられます。
①−１ S3ファイルゲートウェイ 
①−2 FSxファイルゲートウェイ
②−１ キャッシュ型モード
②−2 保管型モード


## メリット
・格納容量が無制限
→S3やFSxはデータ格納容量が無制限の為、オンプレミス上で気にしなくてもよくなった

・パフォーマンス向上
→クラウドストレージに直接書き込むのではなく、Storage Gateway上に書き込むだけで完了
　機械学習や分析にデータが使わる。使用されたデータをオンプレミスで使用する事が可能

・コスト削減
→データ管理の機器や保守作業が削減できるので、コスト削減と繋がる

・耐久性UP
→イレブンナインの耐久性を持つS3やマルチAZに対して耐久性が高いFSxを使用する為

・高セキュリティ
→オンプレミス環境からクラウドストレージへのデータ転送中及び書き込まれたデータは全て暗号化する事が出来る為

## 最後に
Storage Gatewayについて書かせて頂きました。
オンプレミスからAWSストレージへアクセスする為にとても重要なサービスですね。
ご指摘ありましたらご連絡頂けたらと思います。
Xcode 15 flutter_inappwebview-Swift.h:286:9 Could not build module 'WebKit' Error

# ・ Xcode15対応が4月25日から必須

4月25日より、Xcode 15への対応が必須となります。

Xcode 15でアプリをビルドした際に`flutter_inappwebview`で以下のエラーが発生しました。解決方法を以下にご紹介します。

### 発生したエラー
```
flutter_inappwebview/flutter_inappwebview.framework/Headers/flutter_inappwebview-Swift.h:286:9 Could not build module 'WebKit'
```

### 解決策

`Podfile`の末尾に以下を追加することで、私の環境ではWebKitビルドエラーを解決します。

```
post_integrate do |installer|
  compiler_flags_key = 'COMPILER_FLAGS'
  project_path = 'Pods/Pods.xcodeproj'

  project = Xcodeproj::Project.open(project_path)
  project.targets.each do |target|
    target.build_phases.each do |build_phase|
      if build_phase.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
        build_phase.files.each do |file|
          unless file.settings.nil? || !file.settings.key?(compiler_flags_key)
            compiler_flags = file.settings[compiler_flags_key]
            file.settings[compiler_flags_key] = compiler_flags.gsub(/-DOS_OBJECT_USE_OBJC=0\s*/, '')
          end
        end
      end
    end
  end
  project.save()
end
【Elysia/Bun】Elysiaサーバーをhttpsにする

Elysiaサーバーを作っていて、証明書なしの http は問題なくNet上にいくらでもサンプルがあります。でも、https にしようとすると、BunについてのBun.serveによる tsl 設定方法は見つかるのだけれど、new Elysia()では2024年3月現在見当たらず試行錯誤して判ったので、簡単にメモしておこうと思います。

letsencryptを使った方法ですが、こんな感じです。

```ts: server.ts
import { Elysia } from 'elysia';
const PORT = 443;
const KEYS = {
    cert: Bun.file("/etc/letsencrypt/live/＜ドメイン名＞/cert.pem"),
    key: Bun.file("/etc/letsencrypt/live/＜ドメイン名＞/privkey.pem")
}

const app = new Elysia()
  .get('/', () => 'my https server is running!')

  .listen({
        port: PORT,
        tls: KEYS
    },  (token: any) => {
        if (token) {
            console.log(`Listening to port ${PORT}`);
        } else {
            console.error(`Failed to listen to port ${PORT}`);
        }
    })
```
あなたの日常にも潜む！「オカルト × IT 」事件簿

## はじめに
一見、Qiitaではあまり見る事が無いオカルトタグですが、世界ではオカルトとITが交わった様な超常現象が時折発生します。今回はその様な事例をまとめてみました。


## 世界各地で起こるIT×オカルト事件

##### 1. 500マイル以上離れた場所にメールが送れないのだが

https://cpplover.blogspot.com/2015/04/500.html


##### 2. 「中国人のAさんがお茶を淹れると会社のネットが繋がらなくなる」そんな訳ないと思いながら調べたら…まさかの日常ミステリー

https://togetter.com/li/1618067

##### 3. 祖母が就寝するとDBインサートができなくなる

https://qiita.com/bohemian916/items/46f9f1e8bb32fc0a1f99


##### 4. 「不調なWi-Fiが雨の降っている時だけなぜかつながる」謎をエンジニアが解明

https://gigazine.net/news/20240402-wifi-only-works-when-its-raining/


##### 5. 「IKEAの椅子に座るとPCの画面が真っ暗になる」という怪現象の理由が判明

https://gigazine.net/news/20230501-ikea-chair-monitor-chattering/


##### 6. 「朝7時にインターネットが突然つながらなくなる」という怪奇現象が1年半も続いた村、その原因とは？

https://gigazine.net/news/20200924-old-tv-dsl-interfer/


##### 7. 「部屋で服を着替えるとPCがスリープから復帰する」という謎の現象が報告される、一体なぜ？」

https://gigazine.net/news/20220905-change-clothes-pc-wake-from-sleep/


##### 8. 「バニラのアイスを買ったときだけ車のエンジンがかからなくなる不思議な現象、その原因は？」

https://gigazine.net/news/20200511-vanilla-ice-allergic-car/


##### 9. ユーザーが『アイドル』を歌うとサーバーが停止する
https://qiita.com/laineus/items/7be14dac3eaac72a4cad


##### 10. 予期せぬバグの原因は「満月」だった
https://news.livedoor.com/lite/article_detail/26487946/

## まとめ
どれも面白い記事ですね。やっぱり裏には技術的側面で問題が起こっており、日常生活で直面してしまったら解決が難しいと思いました。みなさんも技術的な事で超常現象に直面した時（エンジニアのみなさんは常日頃から直面していますが）はこの様な場所に問題がある可能性があります。
Debug.Break()よりも強力に実行を一時停止する

# 概要

Windows上の Unity限定の話です。

Unity で開発中、デバッグのために実行を一時停止したいとき、いくつかの方法があります。

- Debug.Break() : ゲームを一時停止した状態でシーン内のオブジェクトの状態を確認できるのでとても便利です。
  - 欠点: 瞬時に実行が止まるわけではなく、次のフレームまで実行が進んでから停止します。
- デバッガのブレークポイント : 止めたところで変数の内容をウォッチしたりステップ実行したりできます。
  - 欠点: 事前にブレークポイントを置かないといけない。複雑な停止条件をつけたブレークポイントを置いても、うっかり「すべてのブレークポイントの削除」で消してしまう。

x86 CPU 上で C / C++ を使っているなら、
```c
__asm int 3;
```
というアセンブリ命令 (3番割り込み) によってデバッガのブレークポイントと同じ効果を発生させることができます。これなら即座に実行が止まり、また「すべてのブレークポイントの削除」で消えてしまうこともありません。

このようなことが Unity (Windows) の C# でもできないか？
というのが今回の趣旨です。

# 結論

以下のように呼び出すと
```cs
MyDebug.HardPause("YOU MUST DEBUG THIS CODE");
```
以下のようなメッセージを表示して実行が停止します (Unity Editor も停止します)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747648/8dc8e0d2-7c2f-b025-793b-a9613025a6e0.png)

表示に従って
- デバッガを Unity にアタッチ
- HardPause()内の Thread.Sleep(1000); の行にブレークポイントを置く
- OKボタンを押してメッセージボックスを閉じる
- デバッガがそのブレークポイントで止まる
- デバッガを使って HardPause()内の無限ループを抜ける

という操作が必要になりますが、 C# スクリプトから強制的に即座に一時停止することができます。(操作が面倒臭いのは認める)

# 止めるためのコード

```cs:MyDebug
using System.Threading;
using UnityEngine;

class MyDebug
{
    // Windows API の MessageBox を呼べるようにする。
    [DllImport("User32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr h, string m, string c, int type);

    static void HardPause(string message)
    {
        string fullMessage = $"Attach the debugger to Unity,\n"
            + "set breakpoint at Thread.Sleep(1000); in HardPause(),\n"
            + "and press OK button of this message box,\n"
            + "Then set the variable loop=false; in the debugger\n"
            + "to continue.\n\n"
            + message;
        MessageBox((IntPtr)0, fullMessage, "Hard paused for debug!", 0);
        Debug.Log(message);
        bool loop = true;
        while (loop)
        {
            Thread.Sleep(1000);
        }
        Debug.Log($"HardPause() - exit the loop.");
    }
}
```

要点
- Thread.Sleep() で無限ループするだけでは、ただ Unity Editor が反応しなくなるだけで、何が起きたのか分からない。
- Console も動かなくなるので Debug.Log() でメッセージを出すことはできない。
- Windows API の MessageBox() を使って Unity の外でメッセージを表示する。
ハロー効果の抑制失敗（日記）

（※[前の日記（"画像の輝度補正がどうの"）](https://qiita.com/NyancoRitter/items/ce8160952f8d3418e530)の続きである．）

前回のあらすじ：【適当にガウシアンでぼかした結果を「各所の明るさ」を示す物として用いた結果，当然ハロー効果がすごい．つらい．】

……というわけで，
「単純にぼかすのがダメなら，エッジ保存型の平滑化をすればいいじゃない」を試した，というか試そうとした．

素人なので「エッジ保存型」ですぐに思いつくのは　バイラテラルフィルタ　と　メディアンフィルタ　くらいなのだが，どちらもフィルタカーネルサイズを大きくすると **処理がすごく重い** から困る．
（前回用いたガウシアンのカーネルサイズは「画像高さの 1/3 」とかいうでかさ）

* **バイラテラル** :  
  これ，パラメタ調整が難しい．色空間側のパラメタをいじってハローを抑止しようとすることはそのまま自前処理の効果抑制に繋がるわけなので難儀する．ハローは軽減しているけど処理効果もひどいよね，みたいな．あと前述のようにガウシアンと同じ規模でやろうとかすると非常に重くて非現実的．
* **メディアン** :  
  処理パラメタが無いのである意味悩まなくて済む．こっちも重い上に，カーネルサイズがでかいとそもそも期待しているような「エッジ保存」効果はほとんど無くて結局ハローを生じる．しかも，その雰囲気が嫌らしい．ガウシアンは等方性だから「これはハローだよね」とかわかりやすいのだが，こっちは下図のように入力画像には存在しなかった明暗境界が唐突に生じたりする感じ．

**でかいカーネルサイズのメディアンフィルタを用いた例：**
背景に（日向と陰みたいな）謎の明暗が発生している．（※この記事の後ろの方に原画があるけど，これは元々は存在しない）
![WrongResult.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/afc1a81c-ca70-b276-f751-86564b236f74.png)


……というわけで，そう簡単にはハロー効果には対抗できそうにない．（←いまここ）

なんかいい感じの方法を探す必要があるかなぁ．
なんとなくだが，もっと直接的に「エッジ」を扱って何とか工夫しないと無理なんじゃないだろうか？　とか思いつつある．

## あまり関係ない話

上記のフィルタを（重くないが，自前処理に使うには足りないような）小さいカーネルサイズで用いると，処理結果はこんな感じになる．（この例はカーネルサイズ9のメディアンフィルタ）

**入力：**
![Src.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/c4d89710-3357-8ac0-46ee-66b9a20604d3.png)

**メディアンフィルタ（カーネルサイズ9）：**
![Median.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/74f27dc2-c2a2-cc66-5361-f01029bbb291.png)

**↑のメディアンフィルタを使った自前処理：**
![ResultOfMedian.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/d7444217-2880-b9da-bbdd-e9c0278c5dcd.png)

処理が局所的すぎてことごとく灰色になるので「画像の輝度を補正しましたｗ」とは言えず全然ダメなわけであるが，要は「周囲よりも明るいか暗いか」を示しているわけだから「これ，原画に足せばコントラスト的にはちょっとはマシになるんじゃね？」とか思い，

`入力 + この結果 - 127`

とかいうことをしてみた．

![TheResult.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/781ffe88-58b5-9dda-253a-33efdddb1af2.png)

無理してかっこいい言葉(?) を用いれば「高周波成分を強調」とか何とか言うのだろうか？（素人なので正しい言葉かどうかもイマイチわからないが）　若干はっきりするよね．まぁだからどうしたとかいうことも特に無いのだが．
Tableauでのバブルチャート作成

# Tableauのバブルチャート

## 特徴

Tableauのバブルチャートはマークタイプを円にしてサイズにメジャー、色にディメンションまたはメジャー、詳細にディメンションを設定することで表現します。
ラベルにディメンションまたはメジャーを追加で設定することができます。

１つ１つのバブルを細かく見るよりは、全体を見て概要をつかむことができるようなチャートになります。
詳細に設定するような、数の多いディメンションに対して2つのメジャーの値で概要を表現したい、などの用途で使用できると思います。

縦軸・横軸に値を持つ一般的なバブルチャートとは少し異なり、バブルの大きさが重要であることは共通ですが、バブルの色も大きな意味を持つことがTableauのバブルチャートの特色になると思われます。

![バブルチャートイメージ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/3ac9f77a-8217-a599-e4c1-3ee9e2dbcd99.png)

## 作成手順

例としてサンプルのスーパーストアのデータを利用して、売上の大きい製品について利益がどうなっているかを大まかに見たいとします。
製品名をバブルの詳細に設定し、大きさを売上、色を利益として表現することで全体像がつかめると思われます。

### 1. マークタイプを円にする

![バブルチャートイメージ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/521632a7-04fa-cabe-0a51-135c578237f9.png)

### 2. サイズに売上をドラッグする

![バブルチャートイメージ03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/ed94e541-0a5b-b431-1baf-9e9701dbd702.png)

### 3. ラベルに製品名をドラッグする

バブルの中に製品名を表示しない場合は詳細に設定すればよいです。

![バブルチャートイメージ04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/b816cdef-0f00-0993-da04-bbf8c9068640.png)

### 4. 色に利益をドラッグする

![バブルチャートイメージ05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/92036dbd-59c5-3dcc-859b-f84bc1b1974c.png)

### 5. 色の調整、フィルターなど設定

利益の色を調整します。中央の値を0にし、枠線を設定するなどします。
製品名が多く非常に細かくなっているので、売上の最低値を設定するなどしてフィルターします。

![バブルチャートイメージ06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/1852b15f-ab01-bdfa-b55f-82467b900978.png)

# 一般的なバブルチャート

## 特徴

縦軸・横軸と、バブルのサイズの３つのメジャーを用いて表現するチャートです。
２つのメジャーの値の関係を表現するため散布図を作成したところで、さらにもう１つメジャーの情報を付加したいという場合に使用できると思われます。

チャートが煩雑にならないよう注意は必要ですが、バブルの色とラベルに追加でディメンションまたはメジャーを設定できるので、様々な情報を１つのチャートに包含することができます。

![バブルチャートイメージ07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/6db5e73f-2f84-1d99-3c3f-d6f07fce3d80.png)

## 作成手順

こちらも例としてサンプルのスーパーストアのデータを利用し、売上の大きい製品について、数量と利益の関係がどうなっているか把握したいとします。

### 1.列に数量、行に利益をドラッグする

![バブルチャートイメージ08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/3f401517-3397-59ba-c844-9ee78e53f3cb.png)

### 2.サイズに売上をドラッグする

![バブルチャートイメージ09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/6d8ff014-50c1-ef63-0247-ec4ff2d305f4.png)

### 3.ラベルに製品名をドラッグする

チャートに製品名を表示しない場合は詳細に設定すればよいです。

![バブルチャートイメージ10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/cb026667-1d7e-e615-6bd3-abb61f145915.png)

### 4.色・サイズの調整、フィルターの設定

製品の数が多く見づらくなっているので、売上の最低値を設定するなどしてフィルターします。
バブルが見やすいように色を変えたり不透明度を下げ、サイズを調整します。

![バブルチャートイメージ11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/34eab099-4458-3204-d746-8fcfa99629b7.png)
[AIX]マウントで隠されたファイルの参照方法

誤ってマウントポイントにファイルを作成してしまった場合、mount中にはそのファイルが確認できません。
これによって、dfではファイルシステムの使用量が高いが、lsやfindではファイルが見つからないという事象が発生しえます。
```
# ls /testfs/testfile
/testfs/testfile
# mount /testfs
# ls /testfs/testfile
/testfs/testfile not found
```
mountしたままの状態であっても/をディレクトリマウントすることで、/以下のマウントポイントのファイルを確認できます。
```
# mount / /mnt
# ls /mnt/testfs/testfile
/mnt/testfs/testfile
```
多重マウントしている場合は1つ目のファイルシステムをディレクトリマウントします。
```
# ls /testfs/testfssub/testfile
/testfs/testfssub/testfile
# mount /testfs/testfssub
# ls /testfs/testfssub/testfile
/testfs/testfssub/testfile not found

# mount /testfs /mnt
# ls /mnt/testfssub/testfile
/mnt/testfssub/testfile
```
bit操作 ~ <<(シフト演算)とbitset ~ 

**`<<`について**
`<<`は左シフトを表しており、`>>`は右シフトを表します。もともとなかった箇所は0うめされます
```c++
シフトしたい数字 << 何bitシフトしたいか;
シフトしたい数字 >> 何bitシフトしたいか;
```
`biset<>`について
```c++
#include<bitset>
std::bitset<何bit表示にするか> 変数名 = 2進数にしたい表示;
std::bitset<何bit表示にするか>(2進数にしたい表示);
```
ただ表示したいだけなら、下の方を使うことが多いです

---

具体例
```c++
#include<iostream>
#include<bitset>
using namespace std;

int main(void){
  //43を2進数表示にする
  bitset<8> s=  43;
  cout << "上の方法 : " << s << endl;
  cout << "下の方法 : " << bitset<8>(43) <<endl;

  s = s << 2;
  cout << "2bit左シフト : " << s << endl;
  s = s >> 2;
  cout << "2bit右シフト : " << s << endl;
}
```
出力結果
```zsh
上の方法 : 00101011
下の方法 : 00101011
2bit左シフト : 10101100
2bit右シフト : 00101011
```
【CI/CD】オンプレミス環境にgithub actionsで自動デプロイする

## 1. GitHub Actions Self-Hosted Runnerの構築

GitHub Actions Self-Hosted Runnerを構築するためには、以下の手順に従います。

1. GitHubリポジトリの設定から、Settings > Actions >runnerセクションに移動し、**new self-hosted runner**を押下します。

2. 適切なOSとアーキテクトを選択し、表示されているコマンドを実行

3. GitHub側で接続できていることを確認する。接続すると、表示が「Idle」に変わる。

### 注意
2で実行するコマンドにTOKENが含まれていますが有効期間が1時間です
参考：https://github.com/actions/runner/issues/1882?ref=pangyoalto.com

## 2. actions-runner/run.sh自動起動設定

自動で「Self-hosted runner」の「actions-runner/run.sh」を実行させる必要があります。
これには「rc.local」を利用します。
rootでrc.local作成

```
sudo su -
sudo vi /etc/rc.local
```
既にインストール済みの「actions-runner/run.sh」を絶対パスで記述
rc-local.serviceで実行する場合は、rc.localファイルに「RUNNER_ALLOW_RUNASROOT="1"」を設定するのがポイントです。
そうしないとrc-local.serviceで実行できません。

```
#!/bin/bash
export RUNNER_ALLOW_RUNASROOT="1"
/home/****/actions-runner/run.sh &
```

実行権限を与えましょう

```
chmod +x /etc/rc.local
```
続いて、rc-local.serviceの自動起動設定、サービスリスタート、ステータス確認をします。

```
systemctl enable rc-local.service
systemctl restart rc-local.service
systemctl status rc-local.service
```
rc-local.serviceが以下のように正常起動していればOKです。

```
● rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: active (running) since Mon 2021-11-22 15:32:43 UTC; 12s ago
    Process: 1643 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
   Main PID: 1644 (run.sh)
      Tasks: 15 (limit: 37282)
     Memory: 35.0M
     CGroup: /system.slice/rc-local.service
             ├─1644 /bin/bash /home/***/actions-runner/run.sh
             └─1648 /home/***/actions-runner/bin/Runner.Listener run

Nov 22 15:32:43 ********* systemd[1]: Starting /etc/rc.local Compatibility...
Nov 22 15:32:43 ********* systemd[1]: Started /etc/rc.local Compatibility.
Nov 22 15:32:45 ********* rc.local[1648]: √ Connected to GitHub
Nov 22 15:32:46 ********* rc.local[1648]: Current runner version: '2.284.0'
Nov 22 15:32:46 ********* rc.local[1648]: 2021-11-22 15:32:46Z: Listening for Jobs
```

## 3. Workflowの作成

GitHub ActionsのWorkflowを構築します。このWorkflowでは、リポジトリからのコード変更を検知し、自動的にデプロイプロセスを開始します。
**.github\workflows**というフォルダ構成にしてその配下にymlで以下のworkflowを記述します。

```yaml
name: Deploy On-Premise

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: self-hosted
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      # デプロイしたいファイルをオンプレミス環境にコピーするステップを追加
      - name: Copy To On-Premise
        run: sudo cat ${{ github.workspace }}/${githubリポジトリにあるデプロイしたいファイル} | sudo tee ${オンプレのデプロイしたいフォルダ} >/dev/null
      # その他に実施したい処理を記載
```

##　参考記事
https://qiita.com/hanaokatomoki/items/af47da39a61948fb123f
https://qiita.com/renave/items/b557aca674b4be0876f1
[Google Calendar API(V3)] Javaでカレンダーの空き時間情報を取得する

Google Calendar API V3(Java)を使用して、
Googleカレンダーの空き時間情報を取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[空き時間を取得](#1-空き時間を取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. 空き時間を取得
Googleカレンダーの空き時間を取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
CalendarScopes.CALENDAR
CalendarScopes.CALENDAR_READONLY
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    
    Calendar.Freebusy freebusy = calendar.freebusy();
    FreeBusyRequest content = new FreeBusyRequest();
    content.setItems(Arrays.asList(new FreeBusyRequestItem().setId("カレンダーID")));
    content.setTimeMin(new DateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2024-01-01")));
    content.setTimeMax(new DateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2024-03-01")));
    Calendar.Freebusy.Query query = freebusy.query(content);
    
    FreeBusyResponse res = query.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/calendar/v3/freeBusy
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
FreeBusyRequestのsetメソッドにより、リクエストボディを追加できます。

取得の開始時刻と終了時刻を指定しますが、この期間が3ヶ月を超えると
期間の指定が長すぎるという例外になるようです。

|メソッド|引数|説明|
|---|---|---|
|setTimeMin|DateTime|【必須】取得する空き時間の開始時刻|
|setTimeMax|DateTime|【必須】取得する空き時間の終了時刻|
|setTimeZone|String|レスポンスで使用されるタイムゾーン|
|setGroupExpansionMax|Integer|カレンダーIDの最大数<br>最大値は100|	
|setCalendarExpansionMax|Integer|FreeBusinessを提供するカレンダーの最大数<br>最大値は50|	
|setItems|List\<[FreeBusyRequestItem](#freebusyrequestitemset)\>|クエリ対象のカレンダーやグループのリスト|	

#### FreeBusyRequestItem(set)
|メソッド|引数|説明|
|---|---|---|
|setId|String|カレンダーIDまたはグループID|

### 1.3. レスポンスの内容

#### FreeBusyResponse
|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："calendar#free"|
|getTimeMin|DateTime|開始時刻|
|getTimeMax|DateTime|終了時刻|	
|getGroups|Map\<String,[FreeBusyGroup](#freebusygroup)\>|グループの拡張|
|getCalendars|Map<String,[FreeBusyCalendar](#freebusycalendar)>|カレンダーの空き時間情報|

#### FreeBusyGroup
|メソッド|戻り値|説明|
|---|---|---|
|getErrors|List\<[Error](#error)\>|省略可能なエラー|
|getCalendars|List\<String\>|グループ内のカレンダーの識別子のリスト|	


#### FreeBusyCalendar
|メソッド|戻り値|説明|
|---|---|---|
|getBusy|List\<[TimePeriod](#TimePeriod)\>|予定ありとみなす期間のリスト|

#### Error
|メソッド|戻り値|説明|
|---|---|---|
|getDomain|String|エラーのドメインまたはカテゴリ|
|getReason|String|[エラーの理由](#エラーの理由)|

#### TimePeriod
|メソッド|戻り値|説明|
|---|---|---|
|getStart|DateTime|期間の開始日|
|getEnd|DateTime|期間の終了|

#### エラーの理由
|定義値|内容|
|---|---|
|groupTooBig|リクエストされたユーザーグループのサイズが大きすぎる|
|tooManyCalendarsRequested|リクエストされたカレンダーの数が1つのクエリには多すぎる|
|notFound|リクエストされたリソースが見つからない|
|internalError|API サービスで内部エラーが発生|


<br>
<br>
おしまい。。
Labs.perplexity.aiでの日本語入力中のEnterで送信されないようにする。

:koala: 以下の文はDBRX-Instructに作成してもらいました。
:koala: tampermonkeyが必要になります。


Perplexity.ai Composition Events について
=========================================

この記事では、Perplexity.ai Composition Events という UserScript について解説します。この UserScript は、日本語入力中に Enter キーを押下しても検索クエリが送信されないようにするものです。

Perplexity.ai Composition Events とは
------------------------------------

Perplexity.ai Composition Events は、日本語入力中に Enter キーを押下しても検索クエリが送信されないようにする UserScript です。この UserScript は、labs.perplexity.ai の Web サイトで使用することを想定しています。

labs.erplexity.ai は、機械学習モデルの開発や評価を行うためのプラットフォームです。labs.Perplexity.ai では、様々な言語でのテキスト入力が可能ですが、日本語入力中に Enter キーを押下すると、意図せずに検索クエリが送信されてしまうことがあります。この UserScript は、この問題を解決するために作成されました。

Perplexity.ai Composition Events の機能
---------------------------------------

Perplexity.ai Composition Events は、日本語入力中に Enter キーを押下しても検索クエリが送信されないようにする機能を提供します。この機能は、以下のように動作します。

1. 日本語入力開始時に `compositionstart` イベントを監視し、`isComposing` 変数を `true` に設定します。
2. 日本語入力終了時に `compositionend` イベントを監視し、`isComposing` 変数を `false` に設定します。
3. キーダウンイベントを監視し、`isComposing` 変数が `true` の場合に Enter キーが押下されても検索クエリが送信されないようにします。

Perplexity.ai Composition Events の利用方法
-------------------------------------------

Perplexity.ai Composition Events を利用するには、以下の手順に従ってください。

1. Tampermonkey などの UserScript 管理拡張機能をインストールします。
2. Perplexity.ai Composition Events の UserScript を Tampermonkey に追加します。
3. labs.perplexity.ai の Web サイトにアクセスし、日本語入力を開始します。
4. 日本語入力中に Enter キーを押下しても検索クエリが送信されないことを確認します。

Perplexity.ai Composition Events のソースコード
----------------------------------------------

Perplexity.ai Composition Events のソースコードは、以下の通りです。

```javascript
// ==UserScript==
// @name         Perplexity.ai Composition Events
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Prevent Enter key from submitting search query during Japanese input on labs.perplexity.ai
// @match        https://labs.perplexity.ai/
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var input_element = document.querySelector("textarea");
    var isComposing = false;

    // 日本語入力開始
    input_element.addEventListener('compositionstart', function(){
        isComposing = true;
    });

    // 日本語入力終了
    input_element.addEventListener('compositionend', function(){
        isComposing = false;
    });

    // 修正後のhandleIMEEnter関数
    function handleIMEEnter(event) {
        if (event.code == "Enter" && isComposing) {
            event.stopPropagation();
        }
    }

    // handleIMEEnter関数をキーダウンイベントのリスナーとして登録
    input_element.addEventListener('keydown', handleIMEEnter);
})();
```

まとめ
------

Perplexity.ai Composition Events は、日本語入力中に Enter キーを押下しても検索クエリが送信されないようにする UserScript です。この UserScript は、Perplexity.ai の Web サイトで使用することを想定しています。この UserScript は、日本語入力中に Enter キーを押下しても検索クエリが送信されないようにする機能を提供します。この UserScript を利用することで、日本語入力中に意図しない検索クエリの送信を防ぐことができます。

:koala: Spacial Thanks: [masachika.kmd](https://addons.mozilla.org/en-US/firefox/user/18026200/)
MySQL + AWS RDS – RDS 証明書の更新でダウンタイムは生じるのか生じないのか

# 前提


RDS証明書更新よりも前に、アプリケーションがデータベースに接続するための証明書更新も必要なようだ


# 概要

MySQL の SSL モードが required でない場合は、ダウンタイムが生じなさそう
ただしSSLの暗号化通信がされなくなってしまうようなので、いつの間にかSSL通信していなかったという事態には要注意だ

 MySQL 8 系の SSL モードはデフォルトが required ではなく preferred なので、注意

## 参考

新しい SSL/TLS 証明書を使用して MySQL DB インスタンスに接続するようにアプリケーションを更新する

> disabled、preferred、および required の SSL モードを指定できます。preferred SSL モードを使用し、CA 証明書が存在しないか、最新でない場合、接続は SSL を使用しない状態にフォールバックし、暗号化なしで接続が行われます。
>これらの新しいバージョンでは OpenSSL プロトコルが使用されるため、サーバー証明書の有効期限が切れても、 required SSL モードが指定されていない限り、接続の成功は妨げられません。
>preferred モードの使用を避けることをお勧めします。preferred モードでは、接続時に無効な証明書が検出されると、暗号化の使用が停止し、暗号化せずに続行されます。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/ssl-certificate-rotation-mysql.html

# 他、参考

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
YoomからTeamsに連携する際のアクセス許可のリスト

## 背景
YoomにマイアプリからTeamsを追加する際に、
アクセス許可が制限されているとエラーダイアログが表示される。
このとき表示されるダイアログでは、
どのアクセス許可の制限に引っかかったかわからないため、
制限について検討したくても情報がない。

### 制限がある場合のエラーダイアログ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761271/4b4d1565-e557-9fc4-9cc1-90e750ebbddf.png)

このような表示のため、制限に引っかかるとどのアクセス許可が必要なのか不明。

### 制限がない場合に表示されるダイアログ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761271/a3c9f077-d722-7b97-22f0-e8b61a868b32.png)

制限がない場合は、上記のように要求されているアクセス許可が表示されている。
もし、エラーダイアログが表示された場合には、
ここで表示されているアクセス許可の見直しが必要。
Node.jsのdb-migrateで環境変数を利用する

# 目的
Node.jsでdb-migrageパッケージを用いてMigrationをしたい。
その際、jsonファイル内で環境変数を用いてMySQLのパスワードを設定したい。

##### 参考
https://qiita.com/tiwu_dev/items/77b60ac9efa15142468d

# 解決策
公式のDocumentにしっかりと書かれていた。

https://db-migrate.readthedocs.io/en/latest/Getting%20Started/configuration/
> You can also specify environment variables in your config file by using a >special notation. Here is an example:
>
>``` json: database.json
>{
>  "prod": {
>    "driver": "mysql",
>    "user": {"ENV": "PRODUCTION_USERNAME"},
>    "password": {"ENV": "PRODUCTION_PASSWORD"}
>  },
>}
>```

``` json:
"password": {"ENV": "環境変数"}
```
の形で利用する事ができるらしい。
【python】スライスを使って文字列を反転させる


## 概要

- Python のスライスについて便利な記載方法について説明します。
- 書き方を忘れてしまうのでメモがてら記載します。

## TL;DR

- `test_str[::-1]` で文字列を反転させることができます。
- 文字列判定すさせることで、回文判定などに利用できます。

## スライスの基本的な使用方法

> ❗ スライスの基本的な使用方法を知っている場合は、この章をスキップしてください。

- テストデータを定義

  ```python
  test_str = 'abcdefg'
  ```

- 先頭から文字を取得する

  ```python
  test_str[0]
  # 'a'

  test_str[1]
  # 'b'

  test_str[2]
  # 'c'
  ```

- 末尾から文字を取得する

  ```python
  test_str[-1]
  # 'g'

  test_str[-2]
  # 'f'

  test_str[-3]
  # 'e'
  ```

- 取得する範囲を指定する

  - `str[start:end]` で `start`の index 以上 `end`の index 未満の文字列が取得される
  - `start` と `end` は省略可能で、省略した場合は先頭から末尾まで取得される

    ```python
    test_str[1:3]
    # 'bc'

    test_str[2:5]
    # 'cde'

    # start を省略した場合
    test_str[:3]
    # 'abc'

    # end を省略した場合
    test_str[-3:]
    # 'efg'
    ```

- 〇文字飛ばしで取得する

  - `str[start:end:step]` で `start`の index 以上 `end`の index 未満の文字列が `step` 文字飛ばしで取得される

    ```python
    # 1文字飛ばし
    test_str[::2]
    # 'aceg'

    # 2文字飛ばし
    test_str[::3]
    # 'adg'

    # 3文字飛ばし
    test_str[::4]
    # 'ae'
    ```

## 文字列を反転させる

```python
test_str[::-1]
# 'gfedcba'
```

- 配列でも同様のことができます

  ```python
  test_list = [1, 2, 3, 4, 5]
  test_list[::-1]
  # [5, 4, 3, 2, 1]
  ```

このように、スライスを使うことで回文を判定することも可能です。

```python
test_str = 'level'
if test_str == test_str[::-1]:
    print('回文です')
else:
    print('回文ではありません')

# 回文です
```

## その他 応用編

### 文字列を回転させる

- たとえば、`'abcdefg'` を `1` 文字ずつ回転させる場合

  ```python
  test_str = 'abcdefg'
  for i in range(len(test_str)):
      test_str = test_str[1:] + test_str[0]
      print(test_str)

  # bcdefga
  # cdefgab
  # defgabc
  # efgabcd
  # fgabcde
  # gabcdef
  # abcdefg
  ```

## まとめ

書き方を忘れてしまうのでメモがてら記載しました。
もっと良い方法があれば教えてください。

## 参考

- https://docs.python.org/3/c-api/slice.html
- https://note.nkmk.me/python-slice-usage/
エクセルで"済"にしたら、その1行をグレーアウト。

# 指定範囲を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/f93db78c-9d04-2a98-9943-915ebfd7edfe.png)

# ルール作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/2741cb73-4906-09c9-919e-32652fff70fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/25613a24-17f7-09d5-07ac-feae83327063.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/e4fdc103-63bf-8d5c-abea-04337c5652c4.png)

# DONE.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/7c82629e-07bc-859b-7b0f-021ccabf1e1f.png)
FuelPHP における ORDER BY での条件指定

# 概要
FuelPHP では基本的に FuelPHP が提供している Query Builder を用いて SQL を作成する
その SQL を作成する中で ORDER BY 句の設定でハマったのでメモを残す

やりたいこととしては一部の ID のみを検索上位に表示、それ以外を異なる Column で並べたいといったもの

e.g.
```
SELECT *
FROM `target_table`
WHERE `condition` = true
ORDER BY `target_table`.`id` = 1 DESC, `target_table`.`other_column` ASC;
```

# 環境
PHP: 8.0.30
FuelPHP: 1.8.2
MySQL: 5.7.41

# 結論

Query Builder の `order_by()` の第一引数に条件を含めた形で `DB::expr()` 経由で値を渡す
```
$rows = DB::select()
    ->from('target_column')
    ->where('condition', '=', true)
    ->order_by(DB::expr('id = 1'), 'DSEC') // ← ここ
    ->order_by('other_column', 'ASC')
    ->execute()
```

# 解決策以外に試したこと

1. Query Builder の `order_by()` の第二引数に直接値を入れる
    ```
    $rows = DB::select()
        ->from('target_column')
        ->where('condition', '=', true)
        ->order_by('id', 1) // 対象の条件
        ->order_by('other_column', 'ASC')
        ->execute()
    ```
1. Query Buildr の `order_by()` の第二引数に条件込の文字列を渡す
    ```
    $rows = DB::select()
        ->from('target_column')
        ->where('condition', '=', true)
        ->order_by('id', '= 1 DESC') // 対象の条件
        ->order_by('other_column', 'ASC')
        ->execute()
    ```
1. Query Builder の `order_by()` の第二引数に `DB::expr()` を用いて条件を渡す
    ```
    $rows = DB::select()
        ->from('target_column')
        ->where('condition', '=', true)
        ->order_by('id', DB::expr(' = 1 DESC')) // 対象の条件
        ->order_by('other_column', 'ASC')
        ->execute()
    ```

## 実際のコードの確認
どれもうまく動かなかったので `execute()` の代わりに `compile()` を呼びログを確認したところ `id DESC` となっていた
そのため実際の Query Builder のコードを確認すると `ASC` 以外は全て `DESC` となるようになっていた

```php:fuel/core/classes/database/query.php#198
$direction = strtoupper($direction);
if ( ! empty($direction))
{
    $direction = ' '.($direction == 'ASC' ? 'ASC' : 'DESC');
}
```

そのため値の方ではなく Column の方を置き換える形で試したところうまく動作した

# まとめ
* FuelPHP の Query Builder で　ORDER BY 句の条件をつける場合は第一引数に `DB::expr()` を用いて条件指定を行う
* 簡単に試して動かない場合はライブラリのコードを読んだ方が早い
LTI実装に関わる技術資料

# 概要
[日本1EdTech協会](https://www.1edtechjapan.org/ "日本1EdTech協会")では[1EdTech Consortium Inc.](https://www.1edtech.org/ "1EdTech Consortium Inc.") が策定している[LTI](https://www.1edtech.org/standards/lti "LTI")  (Learning Tools Interoperability)、[OneRoster](https://www.imsglobal.org/activity/onerosterlis "OneRoster")、[QTI](https://www.imsglobal.org/activity/qtiapip "QTI") (Question Test Interoperability)等の学習エコシステムを形成するための標準を国内に普及することを主なミッションとしています。
ここ数年、これらの標準を取り入れたMEXCBTや学習eポータル関連の実装が進み、多くのベンダーが開発に関与しています。日本1EdTech協会では、こうした開発を様々な角度から支援してきました。しかしながら、開発に必要な情報が分散しているためLTIに関し、それらをとりまとめた記事を作成しました。
# LTI実装に関わる技術資料
### ① 日本1EdTech協会にて2022年度に実施したLTI関連の講演ビデオおよび説明資料のアーカイブ
https://www.imsjapan.org/dt20221205
### ② LTI Bootcamp Materials (GitHub): 1EdTechのLTI仕様策定者がとりまとめた開発全般の情報
https://github.com/IMSGlobal/ltibootcamp
### ③ 情報処理学会ぺた語義: 日本IMS協会のLTI関係者が情報処理学会に投稿した一般向けの解説
1.	LTI 1.3 の機能と意義
https://www.ipsj.or.jp/magazine/9faeag0000005al5-att/6306peta.pdf (P293-)
2.	LTI 1.3 開発のための資料とサービス
https://www.ipsj.or.jp/magazine/9faeag0000005al5-att/6307peta.pdf (P347-)
3.	LTI 1.3 活用事例と適合試験
https://www.ipsj.or.jp/magazine/9faeag0000005al5-att/6309peta.pdf (P507-)
### ④ 1EdTech LTI1.3 and LTI Advantage Specification: 1EdTechのLTI 1.3 Webサイト
https://www.imsglobal.org/activity/learning-tools-interoperability

### ⑤ LTI開発に関わった技術者による実践的なQiita記事
https://qiita.com/YujiTokiwa/items/e15ffbe338e5594682e5
SageMaker Studioでカスタムイメージが起動しない

# 発生した事象

SageMaker Studioのjupyter labでカスタムイメージを選択して起動しようとしたところ。ステータスがUpdattingのまま起動されない。**(2024/4/1現在）**

# 原因
サポートに問い合わせたところ、AWS側の問題（おそらくバグ？）とのことでした。
space の JupyterLabAppSettings に SageMakerImageVersionAlias が設定されている場合、カスタムイメージを使用してJupyterLab App を起動しようとすると、CreateApp APIが呼び出されません。

spaceの設定確認コマンド[2]
```
aws sagemaker describe-space --domain-id <Domain ID> --space-name <space 名>
```
# 対処法
対処法として以下を提示して頂きました。

1. 新たに作成された space を使用する
2. AWS CLI コマンドから JupyterLab App を起動する[1]
    ```
    aws sagemaker create-app \
    --domain-id <ドメイン ID> \
    --app-type JupyterLab \
    --app-name default \
    --space-name <space 名> \
    --resource-spec "SageMakerImageArn=arn:aws:sagemaker:ap-northeast-1:<AWS アカウント ID>:image/<カスタムイメージ名>,SageMakerImageVersionAlias=1,InstanceType=<インスタンスタイプ>"
    ```

3. JupyterLab の space 一覧ページから JupyterLab App を起動する。
space の JupyterLabAppSettings における SageMakerImageArn の値がカスタムイメージの ARN になっていれば、JupyterLab の space 一覧ページ から [Run] をクリックすることで起動できる。[2]

# 参考資料
[1] CreateApp - Amazon SageMaker
https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateApp.html

[2] describe-space — AWS CLI 2.15.34 Command Reference
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sagemaker/describe-space.html

[3] update-space — AWS CLI 2.15.34 Command Reference
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sagemaker/update-space.html
RetNetを線形時変システムにする

[RetNet](https://arxiv.org/abs/2307.08621)の計算式は以下のようになっています：
```math
Y_i=X_iW_Q\sum_{j\in[0,i]}A^{i-j}W_K^\mathsf{T}X_j^\mathsf{T}X_jW_V
```
ここで$A$は複素対角行列で、論文では対角化された行列$BAB^\mathsf{T}$の$B,B^\mathsf{T}$が$W_Q,W_K$にパラメータとして吸収されるというロジックを取っています。
簡単のために$Q_i=X_iW_Q, Z_i=W_K^\mathsf{T}X_i^\mathsf{T}X_iW_V$と置きます。
```math
Y_i=Q_i\sum_{j\in[0,i]}A^{i-j}Z_j
```
時間方向に展開すると
```math
\begin{align}
Y_0&=Q_0Z_0\\
Y_1&=Q_1(AZ_0+Z_1)\\
Y_2&=Q_2(A^2Z_0+AZ_1+Z_2)\\
Y_3&=Q_3(A^3Z_0+A^2Z_1+AZ_2+Z_3)\\
\end{align}
```
のようになり、括弧内最終項直前までを隠れ状態と$A$の積$AH_{i-1}$とみなすと
```math
\begin{align}
H_i&=AH_{i-1}+Z_i\\
Y_i&=Q_iH_i
\end{align}
```
の更新式が得られます。
このような隠れ状態の係数$A$が時間$i$に依存しない線形システムは時不変システムと呼ばれ、[Mamba](https://arxiv.org/abs/2312.00752)の論文では既存の線形時不変システムの性能的な制限について考察がされています。
ここで$A$を時間依存の対角行列$A_i$とし、RetNetを線形時変システムとすることを考えます。
隠れ状態の更新は以下のようになります：
```math
\begin{align}
H_0&=&A_0H_{-1}&+&Z_0&&&&&&\\
H_1&=&A_1A_0H_{-1}&+&A_1Z_0&+&Z_1&&&&\\
H_2&=&A_2A_1A_0H_{-1}&+&A_2A_1Z_0&+&A_2Z_1&+&Z_2&&\\
H_3&=&A_3A_2A_1A_0H_{-1}&+&A_3A_2A_1Z_0&+&A_3A_2Z_1&+&A_3Z_2&+&Z_3\\
\end{align}
```
ここで各$A_i$は対角行列のため、これらの積は行列要素毎の積として独立に考えることができます。
一要素のスカラーに着目して以下のように小文字で書きます：
```math
\begin{align}
h_0&=&a_0h_{-1}&+&z_0&&&&&&\\
h_1&=&a_1a_0h_{-1}&+&a_1z_0&+&z_1&&&&\\
h_2&=&a2a_1a_0h_{-1}&+&a_2a_1z_0&+&a_2z_1&+&z_2&&\\
h_3&=&a_3a_2a_1a_0h_{-1}&+&a_3a_2a_1z_0&+&a_3a_2z_1&+&a_3z_2&+&z_3\\
\end{align}
```
ここで$z_2$までの列の係数行列
```math
\begin{pmatrix}
a_0 & 1 & 0 & 0\\
a_1a_0 & a_1 & 1 & 0\\
a_2a_1a_0 & a_2a_1 & a_2 & 1\\
a_3a_2a_1a_0 & a_3a_2a_1 & a_3a_2 & a_3\\
\end{pmatrix}
```
を効率的に計算したいです。積の形だと計算が難しいので対数$l_i=\mathrm{log}(a_i)$を取ると係数行列は
```math
\mathrm{exp}
\begin{pmatrix}
\begin{pmatrix}
l_0 & 0 & 0 & 0\\
l_1+l_0 & l_1 & 0 & 0\\
l_2+l_1+l_0 & l_2+l_1 & l_2 & 0\\
l_3+l_2+l_1+l_0 & l_3+l_2+l_1 & l_3+l_2 & l_3\\
\end{pmatrix}
\end{pmatrix}
\bigodot
\begin{pmatrix}
1 & 1 & 0 & 0\\
1 & 1 & 1 & 0\\
1 & 1 & 1 & 1\\
1 & 1 & 1 & 1\\
\end{pmatrix}
```
の形に書けます。ここで$\bigodot$はアダマール積です。
$\mathrm{exp}$の中身は行方向の畳み込み演算$*$を用いて
```math
\begin{pmatrix}
\begin{pmatrix}
l_0 & l_0 & l_0 & l_0\\
l_1 & l_1 & l_1 & l_1\\
l_2 & l_2 & l_2 & l_2\\
l_3 & l_3 & l_3 & l_3\\
\end{pmatrix}
\bigodot
\begin{pmatrix}
1 & 0 & 0 & 0\\
1 & 1 & 0 & 0\\
1 & 1 & 1 & 0\\
1 & 1 & 1 & 1\\
\end{pmatrix}
\end{pmatrix}
*
\begin{pmatrix}
1 & 1 & 1 & 1\\
1 & 1 & 1 & 1\\
1 & 1 & 1 & 1\\
1 & 1 & 1 & 1\\
\end{pmatrix}
```
のように計算できます。
ここでは長さ4の系列を例として説明しましたが、もちろんこのアルゴリズムは任意の系列長に対して実行できます。

## 実装
~~-現在コードを整理してますので完了次第公開します~~ [公開しました](https://github.com/myxyy/TimeVariantRetNet)。
注意点としては$a_i$の絶対値は発散を避けるために1未満である必要があり、また対数を取るため0に近すぎてもいけません。
実装では$X_i$の線形変換で得た複素数を滅多に0にならない性質を利用しており、[SigLog](https://colab.research.google.com/github/ISMRM-MIT-CMR/CMR-DL-challenge/blob/master/tutorial_complex_activations_solutions.ipynb#scrollTo=2XydbcMlBk9L)のような関数に通しています
HelloWorld本 第8章

# ELF

Linuxはexecveシステムコールを用いて、ELFの実行ファイルを起動する。
セクションはリンク、セグメントはロードの単位である。
セクションヘッダは追加と削除の為、ファイルの終端付近に配置される。
プログラムヘッダは順次的なロードの為、ファイルの先頭付近に配置される。
/usr/include/elf.hは移植性を持ち、/usr/include/linux/elf.hは固有の定義を利用できる。

# 動的リンクと共有ライブラリ

動的リンクは位置独立なライブラリを利用し、ディスクを節約する。
共有ライブラリは仮想アドレスを利用し、ライブラリを共有してメモリを節約する。
共有ライブラリは動的リンクを必要とするが、動的リンクの対象が共有ライブラリである必要は無い。
汎用OSは仮想アドレスが標準であり、動的リンクと共有ライブラリが混同されやすい。
共有ライブラリは絶対アドレスで指定できない為、関数ポインタを利用する。
関数ポインタの配列をGOT(Global Offset Table)、GOTを呼ぶ処理をPLT(Procedure Linkage Table)と呼び、例えばprintfのPLTは以下である。

```
printf@plt:
    jmp  *GOTのアドレス   # 二回目以降
    push $GOTのオフセット # 一回目
    jmp  共通のアドレス解決ルーチン
```
ペインを跨いでのランクでの並べ替え方法

# はじめに

Tableauでのチャート作成において、表示しているディメンションの粒度ではなく表全体のランク順で並べて表示したいことがあると思います。
しかし、行や列の軸をクリックしてできる並べ替えではペインごとの並べ替えになってしまうのでうまくできないかと思います。
そういった場合のペインを跨いでの表全体のランク順での並べ替えの方法について、備忘録として記事を残したいと思います。

# 前提

下の図のように、地域、都道府県別に利益を表示しつつ、利益の高い都道府県順に並べ替えたいとします。
わかりやすくするため地域に色を付けていますが、ディメンションとして行にも使用することとします。

![ランク付けイメージ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/60b9d58c-df6e-4a0e-41c5-f3e0220f1994.png)

表示されたペインごとのランク順に並べ替えるのは簡単です。
利益の軸部分に表示される並べ替えのアイコンをクリックすると利益の降順・昇順・並べ替えクリアと切り替わります。

![ランク付けイメージ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/fadafd48-3c7c-96b9-1879-feed2c1769c8.png)

しかしこの方法だと地域ごとの都道府県の利益の高い順にはできますが、地域で区切らず都道府県全体での並べ替えができません。

![ランク付けイメージ03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/fe00467d-161f-8834-257e-fd5c6ed4f13e.png)

# ランク付けの手順

## 1.利益を複製してランクで表計算

合計(利益)を複製して、[簡易表計算] > [ランク]を選択します。

![ランク付けイメージ04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/731d07e9-fa90-11c4-dea8-6b53d40c4363.png)

## 2.表計算の編集

作成したランクのメジャーをクリックして、[表計算の編集]を選択します。
計算タイプが[ランク]、[降順]、次を使用して計算:が[表(下)]になっていることを確認します。

![ランク付けイメージ05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/7b500882-0b79-3014-3a68-387f2296ca26.png)

このとき、「計算アシスタントの表示」にチェックが入っていると計算される順番が[1]、[2]、...と表示されているので確認しながら選択できます。

## 3.不連続に変換

ランクのメジャーをクリックして[連続]から[不連続]に変換します。

## 4.行に移動

変換したディメンションを行の一番左に移動します。

![ランク付けイメージ06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/82ef13bf-25ae-706f-8d74-71e18149a073.png)

すると利益のランクが行に表示され、表全体でのランク順に並べ替えることができました。

![ランク付けイメージ07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/e1fb485a-3ca9-a2ca-b87d-7188318abd8b.png)

利益のランク部分を右クリックして「ヘッダーの表示」のチェックをはずすことで非表示にもできます。

![ランク付けイメージ08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748585/4e8bce66-0345-1912-545d-f6664d211f6d.png)
ケーリー ・ハルミトンの定理の使いどき

#### ケーリー・ハルミトンの定理とは
固有多項式$f_A(\lambda)=0$に対し固有多項式を考えた元の行列を代入すると
$$
f_A(A)=O
$$
が成立する($O$は零行列)
かなりシンプルな定理なので覚えるのは簡単です
※証明は省略します

#### 二次の正方行列での例
```math
A=\begin{pmatrix}
1 & 2 \cr
4 & 3
\end{pmatrix}
```
Aに対する固有多項式$f_A(\lambda)$は
$$
f_A(\lambda)=|A-\lambda E|=\lambda ^2 -4 \lambda - 5
$$
ケーリー・ハルミトンの定理より
$$
f_A(A)=A^2-4A-5E=O
$$
が成立する。
注意点として、定数項をそのままにしてしまうと行列とスカラーの和になってしまい計算することができないので、単位行列$E$をくっつけてあげましょう。


#### 使いどき
**次数下げ**に使用します

例１:$A=\begin{pmatrix}
1 & 2 \cr
4 & 3
\end{pmatrix}$のとき$A^3$を計算せよ
もちろん普通に計算することもできますが、ケーリー・ハルミトンの定理を使ってみましょう。
ケーリー・ハルミトンの定理を用いると、先ほど求めた式より$A^2=4A+5$(＊1)
次に$A^3$を考えると
$$
\begin{eqnarray*} 
A^3&=&A^2A \cr
&=&  (4A+5E)A\cr
&=& 4A^2+5A\cr
&=& 4(4A+5E)+5A  \cr
&=& 21A+20E
\end{eqnarray*}
$$
あとは数字を入れて足し算するだけです。行列の積は大変なので和に落とせるのは嬉しいですよね。こんな感じで、$A^n$を計算することができます。
※実はよく見ると＊1の時点で$A^2$が$A$の一次式でかけてるので次数が落ちてます

---

例2 : $A=\begin{pmatrix}
1 & 2 \cr
4 & 3
\end{pmatrix}$のとき$A^4-3A^3+A+E$を計算せよ

これを普通に計算しようとするとかなり大変です。ですが、こんなときもケーリー・ハルミトンを使うことで楽に求めることができます。さっきのように$A^4$,$A^3$それぞれに$A^2$を作ってあげて次数下げをしていってもいいですが、今回は多項式の割り算を使いましょう
まずケーリー・ハルミトンの定理より、$A^2-4A-5E=O$とわかるので与式をこの式で割ってあげましょう。
$$
\begin{eqnarray*} 
A^4-3A^3+A+E&=& (A^2-4A-5E)(A^2+A+9E)+42A+46E \cr
&=&  42A+46E \ \ \ (\because A^2-4A-5E=O)
\end{eqnarray*}
$$
これも簡単な$A$の一次式の形で書くことができました

--- 

※一般的な行列の多項式では可換性(掛け算の順序を入れ替えても良い)が成り立っていないことが多いため、因数分解や割り算を行えるかはわかりませんが、今回は$A,E$　の二つの行列だけの多項式で、$AE=EA$であるため割り算を行えます。
因数分解を行えない例を以下に示します。
例)$BA\ne AB$のとき
$$
\begin{eqnarray*} 
A^2+4AB+4B^2\ne (A+2B)^2  \ \ \ (\because (A+2B)^2=A^2+2AB+2BA+4B^2)
\end{eqnarray*}
$$


#### まとめ
次数下げに使えるのがケーリー・ハルミトンの定理です。他にも逆行列を求めるのに使えたりします。他にも逆行列を求める時もケーリー・ハルミトンの定理が使えたりします(逆行列を求めるためにはあんまりつかいません)
例１であげたやり方と例2にあげたやり方どちらでも使えるようになりましょう!
Windows Server 2019にRadeon RX 550 のドライバーを入れる

### 前置き
自分が所有してるサーバーにRadeon RX550を購入し装着しドライバーをインストールしようとしましたが、
WindowsServerにはRadeonのドライバが何故かインストール出来ず、調べた結果、解決策がありましたので自分用の備忘録として残しておきます。

### 結論
まずは、Radeonのドライバーを通常通りインストールし、**インストール失敗**させ、セットアップユーティリティを終了させ、生成されたインストール関連ファイルを手動でインストールすることで解決します。

### 検証機
・OS: Windows Server 2019 Standard
・CPU: Intel Xeon E5-2699v3
・GPU: Radeon RX550
・メモリ: DDR4 8GB×8
・ストレージ: SSD 1TB

### インストール方法
**1. [AMDのサイト](https://www.amd.com/ja/support)から、Windows10用のRadeonドライバをダウンロードします。**
検索画面からRX550を選択し”送信”ボタンを押します。
![スクリーンショット 2024-04-02 013802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3420189/95990d41-22cb-2868-d2dc-5fb4b5e32b21.png)
遷移先画面で、Windows10用のドライバをダウンロードします。ダウンロードするのはAMD Softwareです。
**2. 一度セットアップユーティリティを通常通り実行して、失敗させる**
ダウンロードしたインストーラーを実行する。
![20220331194524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3420189/a55c04bf-6bd6-79b1-036f-f485c738151c.png)
上記のような画面が表示されたら、そのままセットアップユーティリティを終了します。
**3.C:\AMDにドライバ関連フォルダが生成されるので移動して手動インストールする**
Cドライブ直下にAMDフォルダが生成されその下にドライバのフォルダが生成されます。
![スクリーンショット 2024-04-02 124931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3420189/754ac321-3f20-1849-6a9c-02b870370bcf.png)

C:\AMD(ドライバのバージョンの名前\Packages\Drivers
に移動し検索窓に「.inf」を入力しインストールファイルを抽出します。
![スクリーンショット 2024-04-02 125021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3420189/bcb828ab-509f-254d-f07c-f49627feeea8.png)

検索結果に出た.infを一つづつ手動でインストールしていきます。
（右クリック⇨インストールをひたすら繰り返します）
インストール完了後は、再起動してください。

### 終わりに
ドライバのインストールは以上です。
上記方法で上手くいかなかったり予期せぬ動作が起こる場合がありますが、自己責任で行ってください。
AWS CLIを使用したDynamoDBのアイテム数のカウント方法

AWS DynamoDBは、大量のデータを扱うためのマネージドNoSQLデータベースサービスです。開発者やデータベース管理者がよく行うタスクの一つに、テーブル内のアイテム数をカウントする作業があります。AWS CLI (コマンドラインインターフェース) を使用して、特定のプロファイルやリージョンを指定しつつ、DynamoDBテーブルのアイテム数を効率的にカウントする方法を記載します。

## 概算アイテム数の取得

`describe-table`コマンドを使用すると、DynamoDBテーブルのメタデータからアイテム数の概算を簡単に取得できます。これはテーブル全体をスキャンせずに済むため、時間もコストも節約できます。

### コマンド例

```sh
aws dynamodb describe-table --table-name テーブル名 --profile プロファイル名 --region リージョン名
```

このコマンドを実行すると、`ItemCount`フィールドにテーブルに格納されているアイテム数の概算が表示されます。

## 特定のクエリ条件に基づくアイテム数のカウント

特定の条件に基づくアイテム数をカウントしたい場合は、`query`コマンドを使用します。この方法は、特定のパーティションキーに対するクエリを実行し、その結果に基づいてアイテム数をカウントする場合に有効です。

### コマンド例

```sh
aws dynamodb query --table-name テーブル名 --key-condition-expression "パーティションキー名 = :value" --expression-attribute-values '{":value":{"S":"キーの値"}}' --select "COUNT" --profile プロファイル名 --region リージョン名
```

このコマンドは、指定したパーティションキーの値を満たすアイテムの数をカウントします。これにより、テーブル全体をスキャンすることなく、特定の条件を満たすアイテムの数を効率的に知ることができます。

## 注意点

- `describe-table`で得られるアイテム数は概算であり、リアルタイムの正確な数ではありません。
- `query`コマンドを使用する際には、パーティションキーを正確に指定する必要があります。また、`query`は特定の条件に基づくアイテムのみを対象とするため、テーブル全体のアイテム数をカウントする方法としては使用できません。

## アイテム数の正確なカウント（非推奨）

テーブルのアイテム数を正確に知りたい場合、`scan`コマンドを使用してテーブル全体をスキャンし、アイテム数をカウントする方法もありますが、これは推奨されません。理由は、大規模なテーブルをスキャンするのは時間がかかる上に、読み取り容量ユニットの消費が大きくなり、コストが高くつくからです。

### コマンド

```sh
aws dynamodb scan --table-name テーブル名 --select "COUNT" --profile プロファイル名 --region リージョン名
```

このコマンドはテーブルをスキャンし、`COUNT`オプションによってアイテム数のみを返します。しかし、大規模なテーブルでは実行に時間がかかり、コストもかさむため、必要な場合を除いて使用を避けるべきです。

## まとめ

AWS CLIを活用することで、DynamoDBテーブル内のアイテム数を効率的に把握することが可能です。テーブル全体の概算アイテム数を知りたい場合は`describe-table`コマンドを、特定のクエリ条件に基づくアイテム数を知りたい場合は`query`コマンドを使用します。これらの方法を使い分けることで、データベースの管理や分析をより効率的に行うことができます。アイテム数を正確に知りたい場合は`scan`コマンドを使用しますが、その際はコストと時間を考慮する必要があります。
WSL2で再インストールしたUbuntuが起動しない問題の解決法

WSL2でUbuntuを再インストールすると以下のようなエラーが出力され、Ubuntuが起動しない場合がある。

```shell
ディスク 'C:\Users\○○○\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx' を WSL2 にアタッチできませんでした: 指定されたファイルが見つかりません。
Error code: Wsl/Service/CreateInstance/MountVhd/HCS/ERROR_FILE_NOT_FOUND
Press any key to continue...
```

以下に手順を記載する

**1\. エラーに記載のある通り、何かしらのキーを押す**

**2\. Windows Powershellを起動する**

**3\. `wsl -l`でWSLに登録されているディストリビューションを表示する**

```shell
Linux 用 Windows サブシステム ディストリビューション:
docker-desktop-data (既定)
docker-desktop
Ubuntu-20.04
Ubuntu-22.04
```

**4\. Ubuntuの登録を`wsl --unregister`で解除する**

今回はUbuntu-22.04が起動しないので、`wsl --unregister Ubuntu-22.04`とし、登録を解除する

**5. Ubuntuを起動して初期設定を行う**
Venv環境でのライブラリインストール時の setuptools>=40.8.0 (from versions: none) エラー対処法

# 現象
Venv環境で pip install を行うと、setuptools>=40.8.0 (from versions: none) エラーが発生し、インストールできないライブラリある。
```
  Installing build dependencies ... error
  error: subprocess-exited-with-error
  
  × pip subprocess to install build dependencies did not run successfully.
  │ exit code: 1
  ╰─> [2 lines of output]
      ERROR: Could not find a version that satisfies the requirement setuptools>=40.8.0 (from versions: none)
      ERROR: No matching distribution found for setuptools>=40.8.0
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
```



# 対処法（Venv環境で実行）
wheel（pip install時に使われるライブラリ）をインストールする。
```
pip install wheel
```

pip install に --no-build-isolation オプションを付けてライブラリをインストールする。
```
pip install --no-build-isolation <ライブラリ>
```



### （参考サイト）

https://github.com/pypa/pip/issues/12050

https://pip.pypa.io/en/stable/cli/pip_install/
Vite によるビルド最適化：Minification、Tree Shaking、Code Splitting、アセットの最適化

Vite は現代のウェブアプリケーション開発において、ビルド速度の高速化と最終的なファイルサイズの削減を実現する強力なツールです。特に`production`ビルドでは、以下の最適化技術がパフォーマンス向上に貢献します。
`vite build --mode production`で行われるビルドについて、環境変数の読み込みの違いもありますが、もう少し深堀りして、Minification、Tree Shaking、Code Splitting、アセットの最適化の 4 つの仕組みについて解説します。

## Minification（圧縮）

### 概念

Minification は、不要な文字（空白、コメント、改行など）を削除し、変数名を短縮することでコードのファイルサイズを小さくする技術です。

### ソースコードの例

```javascript
// example.js
import { add } from "./math.js";

console.log(add(5, 3));
```

```javascript
// math.js
export function add(a, b) {
  return a + b;
}
```

### ビルド後の違い

`production`ビルド後のコードは次のように圧縮されます。

```javascript
// example.js（圧縮後）
console.log(8);
```

## Tree Shaking

### 概念

Tree Shaking は、使用されていないコード（Dead code）を取り除くプロセスです。これにより、最終的なバンドルサイズが削減されます。

### ソースコードの例

```javascript
// utils.js
export const add = (a, b) => a + b;
export const unusedFunction = () => console.log("This is unused");
```

```javascript
// main.js
import { add } from "./utils.js";

console.log(add(1, 2));
```

### ビルド後の違い

`production`ビルドでは、`unusedFunction`はバンドルから削除されます。

```javascript
// main.js（ビルド後）
console.log(3);
```

## Code Splitting（コード分割）

### 概念

Code Splitting は、アプリケーションを複数のチャンクに分割し、必要なときにのみチャンクをロードする技術です。

### ソースコードの例

```javascript
// main.js
const button = document.createElement("button");
button.innerText = "Load";
button.onclick = async () => {
  const { moduleFunction } = await import("./module.js");
  moduleFunction();
};
document.body.appendChild(button);
```

```javascript
// module.js
export const moduleFunction = () => console.log("Module loaded");
```

### ビルド後の違い

`production`ビルドでは、`module.js`は別のファイルとして分割され、`main.js`から動的にロードされます。

## アセットの最適化

### 概念

アセットの最適化は、画像やフォントなどのリソースファイルのサイズを削減し、ロード時間を短縮する技術です。

### ソースコードの例

```html
<!-- index.html -->
<img src="./large-image.png" alt="A large image" />
```

### ビルド後の違い

`production`ビルドでは、`large-image.png`は圧縮され、ファイルサイズが小さくなります。また、適切な場合は WebP などのより効率的なフォーマットに変換されることもあります。
画像ファイル（例えば、PNG、JPG、SVG など）の圧縮は、Vite のデフォルト設定では直接行われません。
画像最適化に特化した Vite プラグインをプロジェクトに追加することで、ビルドプロセス中に自動的に画像を圧縮できます。例えば、vite-plugin-imagemin は人気のあるプラグインの一つで、複数の画像フォーマットに対応した圧縮オプションがあります。

---

これらの最適化技術を通じて、Vite は`production`ビルドのパフォーマンスを大幅に向上させています。Web アプリケーションや Web ページのロード時間を短縮することで、ユーザーの離脱率の軽減やユーザーエクスペリエンスを改善することが見込めますので、よしなにやってくれている Vite は便利です。
Webエンジニアのポートフォリオ制作について

Webエンジニアのポートフォリオ制作について、ネットの情報を基に私の独断と偏見でまとめただけです。
今後見返せるように、ここへ記録しておきます。

なので、
・これが必要！
・これもおすすめ！
・これを使ってみな？
などを教えていただけると泣いて喜びます！！

また、これから初めてポートフォリオを作る予定の駆け出しエンジニアさんとも繋がりたいです！
一緒にがんばりましょう！！！！！

<h2>【ポートフォリオ制作の手順】</h2>
<ol>
<li>参考サイトを見つける</li>
<li>構成をつくる</li>
<li>デザインを決める</li>
<li>コーディング</li>
<li>ホスティング</li>
</ol>

<h2>【最低限必要となりそうな情報】</h2>
<ul>
<li>プロフィール</li>
<li>これまでの職務経歴</li>
<li>制作実績またはスキルページ</li>
</ul>

<h2>【実績として有効そうなもの】</h2>
<ul>
<li>使用＆勉強した技術や言語のページ</li>
<li>実際の学習時間(動画学習サイト、参考書など)</li>
</ul>

<h2>【意識しておくとよさそうな点】</h2>
<ul>
<li>コンセプト＋理由を明確にする</li>
<li>制作の履歴＆時間を記録しておく</li>
<li>こだわり＋アピールポイントを作っておく</li>
<li>苦労＋反省ポイントを記録しておく、さらに</li>
<li>どのように解決案を導き、実際に解決したのかを記録する</li>
</ul>
【ChatGPT＋DALL-E3】編集機能が付きました。


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

　今回は、DALL-E3に編集機能が付きました、というお話です。

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

　まずは、
　　ChatGPTに
　　　関するニュース。

　OpenAIが
　　ChatGPTを
　　　ログインなしで
　　　　使えるようにした、と
　　　　　発表しました。

　実際に
　　試しました。

　画面はそのまま、
　　右上にサブスクの緑ボタン。
　　　（PC版モードではありません）

　チャットすると、
　　userのアイコンが青紫。
　　　最初のプロンプトを入れると
　　　　回答とともに
　　　　　利用規約についての
　　　　　　メッセージが出る。
　　　　　　　次の入力で消えます。

　履歴を出すと、
　　当然ながら、からっぽで、
　　　それまでのチャット履歴は
　　　　追加されません。

　Sign upか
　　Log Inの選択肢があります。

　Log Inすれば、
　　これまでどおりに
　　　使えますよ。
***
　さて、
　　本題です。

　ChatGPTのDALL-E3に
　　編集機能が備わりました。

　ただし、
　　確認できているのは、
　　　Androidのアプリ版だけです。

　iOSのアプリ版は
　　iPhoneがありませんので😅

　Web版には
　　ありません。
　　　後日、機能が
　　　　追加されるのかもしれません。
***
　さて。

　生成画像を
　　タップすると、
　　　いつものように
　　　　画像が現れます。

　そこに
　　メッセージ。
![Screenshot_20240402-083023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/e0b53198-98ca-0d4d-e7f1-366f96cc4ee8.png)

***
***Googleレンズ翻訳***
DALL・E画像のリファイン

画像全体を編集する

「編集」をタップし、チャットで変更内容を説明します。

編集する画像の領域を選択します [選択] をタップし、その領域を強調表示し、チャットで変更内容を説明します。

始めましょう
***
　と簡単な説明が現れます。
　　これは、これ以降、
　　　出ないようです。

　“Get Started”ボタンをタップ。

　メッセージが消え、
　　画像が表示された状態に。

　変わった点は、
　　下の方に、四つのアイコンが
　　　増えたことです。

　Edit、Select、Save、Shareの四つ。

　Editは、
　　画像全体に対する
　　　編集です。

　Selectは、
　　変更したい箇所を
　　　塗りつぶして、
　　　　チャットに戻り、
　　　　　指示に従って、描画します。

　Saveは、
　　ダウンロードですね。

　Shareは、
　　他者とのシェア。

　最後のふたつは
　　説明する必要がありませんので、
　　　EditとSelectを
　　　　使ってみたいと思います。
***
![Screenshot_20240402-103658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/2640479e-82a9-3a1c-2a5a-a1ed1528609a.png)
　こちらを
　　元画像として使います。
***
　まずは、
　　Edit。画像全体に対する編集。

　タップすると、
　　チャットに戻り、
　　　入力枠に、画像が
　　　　セットされます。

　とりあえず
　　“ゴッホ風にしてください”と
　　　入力しました。
![Screenshot_20240402-104046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/66011a2e-2d2d-108c-842b-c56b47a89b32.png)

　ごらんのとおり、
　　リトライしたかのような感じ。
　　　服装も変化しています。
***
　次に
　　Select。部分編集です。

　Selectをタップすると、
　　アイコンが変わり、
　　　Cancel、戻る、Nextとなります。

　左側のゲージは、
　　編集箇所を塗りつぶす
　　　筆の太さが変更できます。

　では、
　　モデル画像の髪を
　　　塗りつぶしてみます。
![Screenshot_20240402-104223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f60fc436-743d-eaad-a9fa-24e0445386ed.png)

　これでNextをタップすると、
　　チャットに戻り、
　　　入力枠に塗りつぶした画像が
　　　　入ります。

　とりあえず
　　“髪をまとめてください。”と入力。
![Screenshot_20240402-104633.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/3a5e4353-bb70-7ccb-55f2-9eb68952182e.png)

　背景が崩れません。

　これをベースにして、さらに
　　塗りつぶして、
　　　“髪をカットしてください”
　　　　と入力。
![Screenshot_20240402-104642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ce7f29fb-2db4-a883-84b6-f34db89cc1a2.png)

　ドレスも崩れませんね。

　すごいです。

　まだ利用範囲が
　　思い浮かびませんが、
　　　可能性が広がったことは
　　　　確かです。

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

　今回は、ここまで。