OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript/TypeScriptでArray.slice()のマイナスの挙動【ChatGPT APIを例に】

みなさん、ChatGPTのAPIは使っているでしょうか？
簡単に使えて便利な反面、トークン数節約は重大な問題でしょう。そのために送るメッセージ数に上限をつけるようなこともあるでしょう。
そんな時にsliceでシンプルに書けることに気づかずに回りくどい書き方をしてしまっていたので、戒めとして記事にします。

なお、chatGPTのpromptエンジニアリングを楽にするツールを作成しているときに気づいた話なので、そのツールもあとで紹介しておきますね。
AI同士で対話させられるツールになっています

https://prompt-studio.vercel.app/

https://qiita.com/ruiiixiii/items/6a21eb83ab397ade4a16

## 基本: JavaScript/TypeScriptにおけるArray.slice()の挙動について

`Array.slice()`は、配列の一部分を切り出すためのメソッドです。このメソッドは、引数として開始位置と終了位置を指定することができます。

例えば、次のようなコードを考えてみましょう。

```javascript
const fruits = ["りんご", "バナナ", "みかん", "ぶどう", "メロン"];

// 開始位置のみを指定する
console.log(fruits.slice(1)); // 出力: ["バナナ", "みかん", "ぶどう", "メロン"]

// 開始位置と終了位置を指定する
console.log(fruits.slice(1, 4)); // 出力: ["バナナ", "みかん", "ぶどう"]
```

この場合、`fruits.slice(1)`という記述によって、配列の2番目以降の要素を切り出すことができます。また、`fruits.slice(1, 4)`という記述によって、2番目から4番目の要素を切り出すことができます。

さらに、開始位置や終了位置をマイナスの値にすることもできます。この場合、末尾からの位置を表すことになります。

```javascript
const fruits = ["りんご", "バナナ", "みかん", "ぶどう", "メロン"];

console.log(fruits.slice(-3)); // 出力: ["みかん", "ぶどう", "メロン"]
```

なお、マイナスの値を指定した場合には、開始位置が配列の長さよりも大きい場合は0、終了位置が配列の長さよりも大きい場合は配列の長さとみなされます。

```javascript
const fruits = ["りんご", "バナナ", "みかん", "ぶどう", "メロン"];

console.log(fruits.slice(-10)); // 出力: ["りんご", "バナナ", "みかん", "ぶどう", "メロン"]
console.log(fruits.slice(1, -2)); // 出力: ["バナナ", "みかん"]
```

## ChatGPT APIを例にしたユースケース

ChatGPTのAPIを使用してサービスを作るときには、トークン数を節約するために、送信するメッセージ数を制限することがあります。

その時にこのsliceの知識は役立ちます。
例えば、次のようなコードを考えてみましょう。

```javascript
const messages = [
  { role: "system", content: "はじめまして。" },
  { role: "user", content: "こんにちは。天気を教えてください。" },
  { role: "assistant", content: "今日は晴れです。" },
  { role: "user", content: "ありがとうございます。" },
  { role: "assistant", content: "お役に立てて良かったです。" }
];

const limit = 3;

const slicedMessages = messages.slice(-limit);

console.log(slicedMessages);
// 出力: [
//   { role: "user", content: "こんにちは。天気を教えてください。" },
//   { role: "assistant", content: "今日は晴れです。" },
//   { role: "user", content: "ありがとうございます。" }
// ]
```

上記のコードでは、配列`messages`から末尾の3つの要素を切り出しています。この場合、`messages.slice(-limit)`という記述によって、`messages`配列の末尾から3つの要素が切り出されます。

また、もし`limit`が`messages.length`よりも大きい場合、全ての要素が切り出されます。

```javascript
const messages = [
  { role: "system", content: "はじめまして。" },
  { role: "user", content: "こんにちは。天気を教えてください。" },
  { role: "assistant", content: "今日は晴れです。" }
];

const limit = 10;

const slicedMessages = messages.slice(-limit);

console.log(slicedMessages);
// 出力: [
//   { role: "system", content: "はじめまして。" },
//   { role: "user", content: "こんにちは。天気を教えてください。" },
//   { role: "assistant", content: "今日は晴れです。" }
// ]
```

`limit`が`messages.length`よりも大きい場合、全体を送っても制限数以下になるので、シンプルに`slicedMessages = messages.slice(-limit);`という記述が成立します。

自分はこれに気づかず、回りくどい書き方してたんですけどね（汗）

## 最後に

この話は、chatGPTのpromptエンジニアリングを楽にするツールを作成しているときに気づいた話です

対話型のシステムに組み込みたい場合なんかに、性能を上げるためにプロンプトエンジニアリングしてると、「いちいちユーザーの入力考えて入れるのめんどくせえええ」ってなるわけです（実体験）

なので、ユーザーの入力もchatGPTに作らせてしまえばいいと思い、AI同士で対話可能なツールを作りました！

https://prompt-studio.vercel.app/

開発者の皆さんはもちろん、AI同士で話させて遊びたいだけでも見てみてください
（AgentGPTなんかと同じで今のところapi keyを入れてもらいます。もちろんopenAIのAPIサーバーにしか送ってないです！）
（忘備録）Kali Linux で "GPG error" がでた際の対処法

# GPGエラーに対処する
GPGエラーの内容は，登録しているリポジトリの署名が無効であることが記載されている．
そのため，下記のコマンドを実行することでローカルの鍵リストに新しい公開鍵を追加．

```terminal
$ wget -O - https://archive.kali.org/archive-key.asc | sudo apt-key add
```

その後，無事に実行できるはず
```terminal
$ sudo apt update
$ sudo apt full-upgrade -y
```

# 参考文献
https://qiita.com/y518gaku/items/435838097c700bbe6d1b
https://qiita.com/madaaamj/items/65c140d8113c66de8059
https://medium.com/ethical-hacking-%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC/gpg-%E3%82%92%E7%90%86%E8%A7%A3%E3%81%9B%E3%82%88-ed464ec89232
https://wiki.archlinux.jp/index.php/GnuPG


---
### 修正
1. 2025/03/17 `GPGエラーに対処する` のコマンド内容を修正
    - @shiracamusさん ご指摘ありがとうございます。
【新形式】基本情報技術者試験に合格したので勉強法をご紹介！

本日、新形式の基本情報技術者試験を受験してきました。結果は以下の通りです。

科目A　715/1000
科目B　895/1000
※両方とも600/1000以上で合格

無事合格できたということで、自身が行った勉強方法をご紹介します！

<b>目次
・いつから勉強を始めた？
・使った教材・サイト
・具体的な勉強方法
・試験を受けてみた所感</b>


<b>・いつから勉強を始めた？</b>
勉強を始めたのは3か月前、1月中旬ごろからで、参考書を読み始めました。
最初は知識をつけていくことを意識し、計算問題や科目Bのような思考力を必要とするものは試験1か月前ごろから取り組み始めました。
※私はIT業界の実務経験やITパスポートの受験経験があります。まったくの初学者であればもう少し期間が必要かもしれません。

<b>・使った教材・サイト</b>
参考書としては以下の書籍1冊のみです。
https://www.amazon.co.jp/dp/4815608768/

かなり分厚く最初は圧倒されるかもしれませんが、内容はわかりやすく書かれているのでサクサク進められました。

問題演習にはこちらのサイトを利用していました。
https://www.fe-siken.com/fekakomon.php

科目A対策に過去問が数多く掲載されており、科目B対策にはIPAのサンプル問題が解説付きで見られるのでとても参考になりました。


<b>・具体的な勉強方法</b>
科目Aについては、まずは参考書を3周ほどして基本的な単語の意味を理解し知識をつけ、その後は過去問を5年分ほど解きました。最終的に過去問は正答率75～80％ほどになりました。
科目Bは、過去の問題形式から大きく変わっているという情報があったので、基本的にはIPAのサンプル問題（20問＋6問）を何度も繰り返し解きました。あやふやで意味がよくわからない部分を残さないことを意識しました。


<b>・試験を受けてみた所感</b>
受ける前に一番不安だったのは科目Bの方でした。サンプル問題が26問しかなく、どんな問題が飛んでくるかドキドキしながら臨みました。
ふたを開けてみれば科目AよりBの方が点数が良いという結果に。

科目Aについては「こんな単語参考書に載ってたか…？」「こんな計算問題見たことない…」と感じることが多かったです。
参考書に載っていない問題が多かったからこそ、落とせない問題をしっかり拾っていくのが大事だと思いました。

科目Bは解いている最中は難しく感じましたが、終わってみればまぁまぁ高得点という感じでした。問題文をしっかり読んで、プログラムの実行結果を丁寧に書いていくのがやはり大事だと思いました。


新形式ということで不安な面も多かったですが、何とか合格できてよかったです！
今後はAWS認定資格や応用情報にも挑戦してみようかと思います！
【タイムゾーン】SupabaseのtimezoneをAsia/Tokyoにする【JST】

```sql
alter database postgres
set timezone to 'Asia/Tokyo';
```

タイムゾーンがJSTになるので見やすくなります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c47bb07c-41aa-4046-3332-88c04a27e164.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/ae79bfcb-f041-3434-a5ba-32b69719342a.png)

https://supabase.com/docs/guides/database/managing-timezones
メモ：Dynamic Memory Bandwidth Allocation for Real-Time GPU-Based SoC Platforms

### 著者は素人のお知らせ
著者はこの分野の知見を広めてみようかなぁ~くらいの気持ちの人です。普通にメモです。

#### IEEEの方のURL

https://ieeexplore.ieee.org/document/9211564

#### NVIDIA公式のURL

https://par.nsf.gov/servlets/purl/10267567


論文内で連呼しているkernlとはGPU上で動くプログラムのことであり記事でも統一している。



## まとめ

WCETを算出するのは不可能である。そこでWCETを推測し、それを保証できるように計算資源予算を変化させる。

## 前提

- 現代のプロセッサを対象にWCETを求めるのは不可能である ← 引用論文から
- GPUとCPUが合わさったSoCを対象に研究をした
    - 実験はJetsonTX2
    - メモリ領域をCPUとGPUで共有し帯域幅も共有している点がポイント

- CPUとGPUをBigLittleなコアとして見ることができる
- NVIDIA GPUには仕様が公開されていないHardware process schedulerが存在する。

> GPUは、ノンプリエンプティブでグローバルなFIFOスケジューリングポリシーを使用するM個のプロセッサを持つマルチプロセッサとして抽象化することができる。　（引用)

- WCETを悪化させる要因はメモリアクセスであるとする




## 研究の方針

#### 目標

ランタイム時に事前に推定されたWCETを破らない事を保証する



#### 事前に行うこと

単位計算資源(=Q)あたりのWCETを推定する



#### 実行中に行うこと

計算資源の分割と配分を行う

タスクの進行度を常に観測する。タスクをブロックごとに分ける。

タスクの進行度に合わせてQを変更しWCETを守ることを保証する



## きになったこと
- 論文でも述べられているがCPUなどのシステムにも展開できるのか
- オーダーが小さいものを計測したが数msくらいでも対応できるのか
- メモリ競合をどうするかがメインだったがCPU時間が深刻なのもある場合、この手法が適用できるか。
- CPUオンリータスクの場合でもいけるか
- メモリ競合と演算機競合どちらも発生する場合WCETを実用的に推定できるのか



## note

共有メモリへのアクセス競合はWCETを悪化させる要因。

動的な監視とメモリ帯域割り当てを行う

nvGPUにはハードウェアスケジューラーがある(非公開)

CPUとGPUをBigLittleなコアとして見ることができる。(BIG+++ & Little-----)

TX2を対象に実験した。GPUとCPUが統合され物理的に同一のメモリに対してアクセスする。キャッシュは別

BWLOCK++(CPUからのメモリ帯域干渉からGPUを保護するもの)なんかおもろそう.

WCETを決定づけるもの(この論文の場合CPUからのメモリ干渉)の影響度を変数(=Q)としておく。 →　すなわち実験に基づいて求めたWCETを守るためにQを動的に変化させてWCETを守ることを保証できる。

任意のQに対してWCETが計算できる。

速度低下が許容範囲に収まっていることやシステムがスケジューリングできることが前提としてある。

各コアのベストエフォート(最も理想的な状態(理論的最大ではない))の時をQ=1とする

CPUコアを一つリアルタイムタスクに割り当てる
リアルタイムタスクとベストエフォートタスクを混在させリアルタイムタスクが来たらベストエフォートを止めて実行する。

タスクをブロックごとに区切り進行具合を調査してリソースの最大予算Qを決定する

測定された実行時間は正規分布になるとしてWCETを推定する

GPUとCPUは同じクロックタイマーを使っている

カーネルの実行ステップごとにWCETを求める。

GREEDY:最大メモリ時間
FAIR:Qが一定だあると仮定
Qn = max( min(QG, a * QG + (1 - a) * Qn-1), QF )

予算計算と状況取得に時間がかかるため予測されるWCETは保守的になる。

ブロック進行状況追跡は共有メモリベース
Javadocのサマリーとロケール

# 概要

Javadoc を生成したとき、サマリーの「説明」欄がどのように決まるのかを調べた。

「説明」欄に記載される「最初の文」の区切りは Javadoc 生成時のロケールに依存する。
英語ロケールではピリオド `.`、日本語ロケールでは `。` が最初に出現するまで、または最初の `p` や `pre` の開始タグの直前までである。

# サマリーと詳細

`javadoc` コマンドで生成される HTML ページは、まず各項目のサマリー[^summary]を記載し、その後に各項目の詳細が続く形式をとる。サマリーの「説明」に記載されるのが Javadoc コメントの「最初の文」である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591453/7add241b-59c5-9f08-6483-ae909abd4ac4.png "java.lang.String のサマリー")

「最初の文」に続く下図下線部は、詳細にのみ記載される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591453/caf2bc37-b4f5-e0a9-3073-a0237980761f.png "java.lang.String の詳細")

# ロケールが英語のとき

> English default sentence-break algorithm — Stops at a period followed by a space or an HTML block tag, such as &lt;P&gt;.
> [javadoc -breakiterator](https://docs.oracle.com/en/java/javase/11/tools/javadoc.html#:~:text=from%20its%20value.-,%2Dbreakiterator,-Computes%20the%20first)

例えば `-locale en_US` を指定すると、ピリオド `.` にスペースや改行が続いたとき、ピリオドまでが「最初の文」となる。

以下の例では `hello.` が「最初の文」である。

```
hello. world
```

```
hello.[TAB]world
```

```
hello.
world
```

以下の例の `hello.` では、「最初の文」は**区切られない**。

```
hello.world
```

```
hello.<br>world
```

```
hello.<div>world</div>
```

冒頭に引用したドキュメントによれば、ピリオドに HTML ブロックタグが続いたとき「最初の文」として扱うとされているが、`div` タグはそのように扱われなかった。

一方、 `p` や `pre` タグがあらわれると、直前にピリオドが**なくても**直前までが「最初の文」になるようだ。
以下の例の `hello` は「最初の文」である。

```
hello<p>world
```

```
hello<pre>world</pre>
```

なお、ロケールが英語のときに `-breakiterator` オプションを有効化すると、「最初の文」を別のアルゴリズムで区切るようになるが、本稿では割愛する。

# ロケールが日本語のとき

ロケールが英語**ではない**とき、[BreakIterator クラス](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/text/BreakIterator.html) によって検出される「最初の文」が採用される。
日本語の場合、すなわち `-locale ja_jp` を指定すると、句点 `。` が行の区切りとなる。[^sentense]

以下の例では `こんにちは。` が「最初の文」である。

```
こんにちは。日本。
```

```
こんにちは。
日本。
```

以下の例の `こんにちは` では、「最初の文」は**区切られない**。

```
こんにちは<br>日本。
```

```
こんにちは<div>日本。</div>
```

英語と同様に、 `p` や `pre` タグがあらわれると、直前に句点が**なくても**直前までが「最初の文」になる。
以下の例の `こんにちは` は「最初の文」である。

```
こんにちは<p>日本。
```

```
こんにちは<pre>日本。</pre>
```

# 詳細は `<p>` に続けて書く

ドキュメントの言語にあったロケールを指定して `javadoc` コマンドを実行する限り、上記のルールに従って分割される。しかし、例えば IDE などで正しいロケールを認識しない場合もあるかもしれない。[^locale]
典型的には、日本語の Javadoc が `-locale en_US` で生成された場合、ほとんどの文ではピリオド `.` が出現しないため、全文がサマリーに出力されてしまう。

そこで、以下のような方針をとると、概ねロケールに依存せずに「最初の文」を区別できる。

- 「最初の文」は、途中にピリオド `.`　や句点 `。` を含まないように書き、末尾にはドキュメントの言語にあった句点をつける（例えば、英語なら `.`、日本語なら `。`）
- 詳細は `<p>` に続けて書く

```:例
サマリーはひとつの文で、簡潔に書く。

<p>詳細は、次の段落に分けて記載する。
```

なお、`p` の閉じタグ `</p>` は省略できる。

> 特徴的なのは `</p>` で閉じる前に他のブロックレベル要素が見つかった場合は自動的に閉じることです。
> [&lt;p&gt;: 段落要素 - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/p)

[^summary]: 手元で `javadoc` コマンドを実行すると「サマリー」ではなく「概要」と翻訳された。訳語の差異は本題ではないので、本稿では JDK の Javadoc における訳語を採用する。
[^sentense]: [BreakIterator#getSentenceInstance](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/text/BreakIterator.html#getSentenceInstance(java.util.Locale)) による境界を採用しているとみられる。該当の実装は[おそらくここ](https://github.com/openjdk/jdk/blob/jdk-11+28/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java#L579)。
[^locale]: 実際にこれが問題になる環境がどれほどあるのかはともかく、期待した結果の得られる確率を高める作法は知っておいて損はないと思う。
ChatGPTは英語の翻訳にも使えるということ

# 一番会話（？）をしているのはChatGPT

ChatGPTが世の中に出てはや４ヶ月たった（有名になり広く使われ始めたのはここ1ヶ月ほどだろう。

大学生になった私は課題の多くをChatGPTに1度は投げるようにしている。そうすることによって、新しい視点やアイディアが思い浮かぶのだ。もちろん、そのままコピペはしていないChatGPTを横目に自分の言葉にするのだ。そして、怪しい部分に関しては自分で調べたりなどする。

そんな、ぼっち大学生活で一番話しているのはChatGPTになりだしているわけだが。先日英語の課題で気付いた事があったのでそれを書き留めたいと思う。

# deeplでの翻訳とChatGPTの翻訳
## 課題について
英語の課題が出たと書き出したわけだが、どういった課題かというと専門的な英語を翻訳するといったものだ。
一例を出すと

integer 整数
numerator 分数

と言った具合に今は主に数値の英語の翻訳が課題として出されている。

## unique solution
私がこの記事を書こうと思ったのがこの「unique solution」だ
deepl だと　「ユニークソリューション」というように訳される。　こういうのは何だが、それくらい分かるw　直訳なのだから。私が知りたいのは数学においてどのようなものであるかだ。
ただ、ChatGPTは「唯一解」と翻訳した。
なるほど、これならしっくりくる。
数学的でわかりやすい。
その他も、しっかりとわかりやすい英語になっていてとてもすんなりとわかった。

# ChatGPTの今後の用途
最近、自治体や学校での使用に関しての声明が出始めている。
私の大学ではまだ公式見解は出ていない。
しかし、上記のように専門的な英語を翻訳する能力が秘められているのであれば、論文を読み込んでもらい翻訳することで研究に集中することができるようになる。
そんな可能性に気付いた。
真・オブジェクト思考

# 皆さんオブジェクト指向やってますか？
オブジェクト思考ではありませんよ？オブジェクト指向するんですよ。

# オブジェクト(物)思考
オブジェクト指向プログラミングにおいて、クラスを現実世界の物として考えることがよく取り上げられます。しかし、これはクラスを物理的な実体として捉える誤解を生むことがあります。

システムに落とし込む際には、理想的には現実世界とシステムのやり取りを考慮した設計が求められます。例えば、ネットショップで商品の注文を受けて倉庫の在庫を確認して、不足分を工場に発注するシステムを作ろうとした場合、受注商品、在庫商品、発注商品などのクラスを作成するかもしれません。

ではこれを現実にしてみましょう。ネットショップで注文を受けると受注商品とかいう実体があるのかないのかわからない商品が倉庫に飛んでいき、せっかく在庫としてある商品が倉庫から動き出し受注商品と融合して発注商品となり飛んでいく。

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703178/79e57ba1-65e4-8eae-8a1a-f15f94162ab3.png)

**かるくホラーですね。**

実際には、

![実際.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703178/31138d27-1665-4643-16ad-069f092fb651.png)

このように現実世界でも実際に動いているのは商品そのものではなく、受注伝票や在庫伝票、発注伝票とそれを扱う人間です。

システム上で扱われるものは、物理的な実体ではなく、それらを管理するための情報と作業です。システムは人間の作業を模倣するものであり、人間と情報のやりとりをしているだけでしかありません。

# MVCが、、、
MVCの考え方では、Model（モデル）・View（ビュー）・Controller（コントローラー）を同じクラスとします。これは、伝票ではなく、人間が自分で記憶して直接やりとりしているというだけで本質は変わりません。

![mvc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703178/e1acf2ad-65fd-88f7-6c42-a98b8a29160a.png)

本当に作り出すべきものは何かを考える必要があります。現実世界とシステムのやり取りをよく理解し、システム上で扱う情報に焦点を当てることが重要です。
Spinnaker でカメラの最大画素の取得

# 背景
カメラ制御の調査をした際のメモ

# 最大値の取得
以下いずれか、かな、と


Spinnaker/Camera.h を確認して、以下を使う。Heightも同様にある。
example code をみるなら、NodeMapInfo/Image Format Control 辺り

- WidthMax
    - Description
        ```cpp
        Maximum width of the image (in pixels). The dimension is calculated after horizontal binning.
              WidthMax does not take into account the current Region of interest (Width or OffsetX).
        ```
                
- SensorWidth: binning 使う場合も考えて、たぶんこっちを使うべきな気がする
    - Description
        
        ```cpp
        Effective width of the sensor in pixels.
        ```

## 注意

example code で Sequencer に Node.GetNode(”Width”).GetMax() があるが、これは設定値っぽいので注意
GetMin() も存在しているので、そもそも固定値でないことは明白ですね。

## horizontal binning とは
画像処理の一つで、複数のピクセルをまとめて一つのピクセルとして扱うこと
この処理により、画像のノイズを減らすことができる。
また、画像の解像度を下げることができます。

ってことで、MaxWidth/Height は、binning すると SensorWidht/Height より小さくなりそう。

# Node.Width の OffsetX/Y と Width/height の関係性

> SensorWidth = Width + (OffsetX x 2) 

となっている。
一度設定した場合、カメラを再起動（再接続）しない限り設定は残っているので、Width/OffsetX を再設定したい場合は、小さくする方を先にする必要があるので注意。
リセット方法があるのかもしれないけれど・・

Width/Height, OffsetX/Y は、[CFloatNode](http://softwareservices.flir.com/Spinnaker/latest/class_spinnaker_1_1_gen_api_1_1_c_float_ptr.html) なので、GetValue() で Float を取得する必要がある。
GetMax/GetMinは、最大最小だが、なんの？という疑問
Incは、SetValue の Increment 値

# 公式
 [Spinnaker C++: Programmer's Guide (flir.com)](http://softwareservices.flir.com/Spinnaker/latest/_programmer_guide.html#Examples)
【FX_BTC_JPY】仮想通貨価格推定ネットワーク【Pythonの勉強にもなる】【Deep Learning】

## はじめに
mmbotを作るにあたり，価格予測のネットワークを作成しました．

対象はFX_BTC_JPYです．

Deep Learningを活用したものになります．

Google Colabのファイルを最後に添付致しますので

購入して直ぐに動作の確認がクラウドでできます．

>＊PCのスペックに依存せずに動かすことができます．

ネットワークの結果は下記にようになります．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820615/381f6ed0-4ba9-c62a-cfc3-7549641153d6.png)



決定係数が0.99あり，自分が作成したネットワークの中では最強の性能を出してくれました．

さすがDeep Learningですね．

期間は7月中のデータを活用しました．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820615/e6066399-4883-fbc6-79b6-3a2fd333999e.png)


是非，mmbotに活用してみてください．

また，章を細かく分けていますので，Pythonの初学者にも比較的読みやすいと思いますので，最新のAI知識を取得したい方は是非，活かしてみてください．

## 仮想通貨について

### 仮想通貨市場の現状

仮想通貨は，近年，急速に普及している分野の1つです．ビットコインをはじめとする仮想通貨は，今や多くの人々の注目を集めています．それに伴い，仮想通貨市場も急速に拡大しています．

### 価格予測の重要性

仮想通貨市場は，大変不安定であり，価格の変動が激しいことが特徴です．そのため，価格予測は非常に重要な要素となっています．価格予測により，投資家は仮想通貨市場での適切な投資判断を行うことができます．

## Pythonと深層学習を使った価格予測の方法

Pythonと深層学習を使った価格予測の方法は，以下の通りです．
1. 過去の価格データを収集する
2. データを前処理する
3. モデルを設計する
4. モデルを学習させる
5. モデルを評価する
6. 価格を予測する

## 深層学習による価格予測のメリット

深層学習による価格予測のメリットは，以下の通りです．
- 高い精度での予測が可能
- パターン認識能力が高いため，複雑なデータでも扱える
- パラメータの数が多いため，他の手法に比べて高い表現力を持つ

---

## 必要なもの

PC(OSはlinuxでもwindowsでもなんでも問題ないです．)

>Google Colabを使用しますので低いスペックでも可能

---

## 有料記事に含まれているもの

- Google Driveとの連携

- ライブラリのインポート

- データセットの読み込み

- 前処理

- データの可視化

- ネットワークの構築

- 学習

- 損失可視化

- 推定コード

- モデルの評価

- 推定結果可視化

- 全体コード

-  Google Colabファイル

![](https://cdn.apollon.ai/media/notebox/userimages/f9fc0aa0-c44d-48de-b85d-bcdb087a2fa9.jpg)


▼▼▼▼

▼▼▼

▼▼

▼

【FX_BTC_JPY】仮想通貨価格推定ネットワーク【Pythonの勉強にもなる】【Deep Learning】


https://note.com/azurite_azu/n/ncf48b927ad21
🌟Pythonを学べる仮想通貨自動売買で不労所得をゲット🌟

現代の経済状況は、個人の収入源に対する要求を高めています。多くの人々が、単一の収入源に頼らずに、安定した収入を得る方法を探しています。このような需要を満たすために、不労所得というコンセプトが生まれました。この記事では、不労所得の概念について説明し、仮想通貨自動売買のメリット、そしてPythonを学ぶことの重要性について詳しく説明します。

## はじめに

### 不労所得とは?
不労所得とは、人々が定期的に収入を得るために労働しなくてもよい収入源のことを指します。例えば、株式投資、不動産投資、オンラインビジネス、著作権料などが含まれます。

### 仮想通貨自動売買とは?
仮想通貨自動売買とは、仮想通貨の価格変動を自動的に検出し、トレードすることを指します。自動トレードシステムにより、トレーダーは市場に24時間アクセスできます。これにより、人為的ミスや感情的な判断を排除し、より正確なトレードが可能になります。

### Pythonとは?
Pythonとは、オープンソースのプログラミング言語の一つです。Pythonは、シンプルで読みやすいコードを書くことができ、多くのライブラリが用意されているため、プログラムの開発やデータ解析、人工知能の開発など、幅広い分野で利用されています。また、Pythonは、多くのプラットフォームに対応しており、移植性に優れています。Pythonは、オブジェクト指向プログラミングと手続き型プログラミングの両方をサポートしており、プログラミング初心者からプロのプログラマーまで、幅広い層の人々に利用されています。Pythonを学ぶことにより、自動売買アルゴリズムを開発するための必要なスキルを習得できます。



## 不労所得のメリット

### ファイナンシャルフリーダム
不労所得を得ることにより、人々は自分自身の時間を自由に使うことができ、好きなことに時間を費やすことができます。さらに、不労所得が安定的であれば、定期的な収入を得ることができます。このような状況は、自分自身の将来に対する不安を軽減し、より安定した生活を実現するための手段として役立ちます。

### 収入源の多様化
単一の収入源に頼ることは、リスクを伴います。もし収入源が途切れた場合、生活に支障をきたす可能性があります。不労所得を得ることにより、収入源を多様化することができます。これにより、収入源が途切れた場合でも、別の収入源からの収入を得ることができます。

### 仕事のスケジュールの柔軟性
不労所得を得るために必要な労働時間は、一般的に定期的な仕事に比べて少なく、自由度が高いです。このような柔軟なスケジュールは、個人が仕事とプライベートのバランスを取ることを容易にします。

## 仮想通貨自動売買の理解

### 仮想通貨とは？
仮想通貨とは、ブロックチェーン技術を利用して、暗号化されたデジタル資産です。代表的な仮想通貨には、ビットコイン、イーサリアム、リップルなどがあります。

### 自動売買とは？
自動売買は、人間のトレーダーに代わってトレードを行うことを指します。自動売買は、自動トレードシステムを使用して、市場データを分析し、決定を下すことができます。

### 自動売買の仕組み
自動売買は、プログラムによって制御されます。プログラムは、市場データを収集し、決定を下すためのアルゴリズムを使用します。アルゴリズムは、自動売買を制御するためのトレードルールを決定します。

## 仮想通貨自動売買のメリット
## エモーションの排除
自動売買を利用することにより、トレードに感情を介入させることがありません。トレードにおいては、感情が判断を歪め、損失を招くことがあります。自動売買を利用することにより、これらのリスクを軽減することができます。

### バックテストによるシステムの検証
自動売買システムは、過去の市場データを使用してバックテストを行うことができます。バックテストは、自動売買システムのパフォーマンスを検証するために使用されます。これにより、トレーダーは、自動売買システムが現実的な利益を生み出すかどうかを確認することができます。

### 多様な戦略の実現
自動売買システムは、複数のトレードルールを組み合わせて使用することができます。これにより、多様なトレード戦略を実現することができます。

## Pythonによる自動売買システムの構築

Pythonを使用して自動売買システムを構築することができます。
以下はPythonで構築したシステムの例です。

https://note.com/azurite_azu/n/neb790decc757

https://note.com/azurite_azu/n/n2654fa55574b

### Pythonの利点
Pythonは、オープンソースのプログラミング言語であるため、無料で入手することができます。また、Pythonは、簡単な構文と高い拡張性を持つため、初心者から上級者まで、幅広いユーザー層に向けたプログラミング言語となっています。

## まとめ
不労所得を得るための方法として、仮想通貨自動売買は、魅力的なオプションの一つです。自動売買を利用することにより、感情を排除し、多様なトレード戦略を実現することができます。また、Pythonを使用して自動売買システムを構築することができます。Pythonは、オープンソースのプログラミング言語であり、簡単な構文と高い拡張性を持つため、自動売買システムの構築に最適です。

## FAQ
## 1. 自動売買を利用するためには、どのようなトレードプラットフォームが必要ですか？
自動売買を利用するためには、多くのトレードプラットフォームでサポートされているプログラミング言語を学ぶ必要があります。Pythonは、多くのトレードプラットフォームでサポートされているため、自動売買システムの構築に最適です。

### 2. 自動売買システムのバックテストはどのように行われますか？
自動売買システムのバックテストは、過去の市場データを使用して行われます。トレードルールが適用されたデータを使用し、実際の市場状況でどのような結果が得られるかを確認することができます。

### 3. Pythonを使用して自動売買システムを構築するために必要なスキルは何ですか？
Pythonを使用して自動売買システムを構築するためには、Pythonの基礎的な知識が必要です。また、データ分析や機械学習の知識も必要になる場合があります。

### 4. 自動売買を利用する場合、何を注意すべきですか？
自動売買を利用する場合、トレードルールを適切に設定することが重要です。また、バックテストを行い、実際の市場状況でどのような結果が得られるかを確認することも重要です。

### 5. 自動売買を利用することで得られる最大のメリットは何ですか？
自動売買を利用することで得られる最大のメリットは、感情を排除し、多様なトレード戦略を実現することができることです。
【SwiftUI】アプリ内にライセンスを表示する

# はじめに
ライセンス表記用のライブラリと言えば、LicensePlistですね
しかし、LicensePlistは設定アプリのアプリ項目にライセンスが追加されます。
これではユーザーの目にはなかなか触れることはありません。

今回はアプリ内にライセンスを表示するライブラリを紹介します。

https://github.com/cybozu/LicenseList

# インストール
① 「File」を選択します
② 「Add Packages...」を選択します
![スクリーンショット 2023-04-22 21.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e9a3c206-e76b-a76a-58bb-139af81d5a9f.png)

③ `https://github.com/cybozu/LicenseList`を貼り付けます
④ 「Dependency Rule」を設定します
⑤ 「Add Package」を選択します
![スクリーンショット 2023-04-22 21.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5b07b57e-0eff-bee4-4739-d8e9c427eca5.png)

⑥ 「LicenseList」にチェックをいれます
⑦ 「Add Package」を選択します
![スクリーンショット 2023-04-22 21.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/53c87aaf-e3d8-a684-ad73-086b5cff734a.png)

# プラグインの設定
① プロジェクトを選択します
② ターゲットを選択します
③ 「Build Phases」を選択します
④ 「+」を選択します
![スクリーンショット 2023-04-22 21.27.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/93265434-4b25-58eb-18bc-ccb8e9077496.png)

⑤ 「PrepareLicenseList」を選択します
⑥ 「Add」を選択します
![スクリーンショット 2023-04-22 21.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/395f0e69-829a-6c43-476b-09d4bef2f298.png)

# 使い方
### 一般的な使い方(UIは固定)
READMEのUsageを見てください

https://github.com/cybozu/LicenseList#usage

### UIのカスタマイズ
```swift:ContentView
import SwiftUI
import LicenseList

struct ContentView: View {
    var body: some View {
        List(Library.libraries, id: \.name) { library in
            Text(library.name)
        }
    }
}
```

# おわり
色んなアプリのライセンス欄を眺めるの結構好きです
【Rust】メソッド、関連関数

## 参考
https://man.plustar.jp/rust/book/ch05-03-method-syntax.html

## メソッド
Rustのメソッドは、構造体に対して直接呼び出すことができる関数で、関数とは異なり、最初の引数は必ず`self`になり、これはメソッドが呼び出されている構造体インスタンスを表します。

具体的には、以下のようにしてメソッドを定義できます。
```rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };
    println!("The area of the rectangle is {} square pixels.", rect1.area());
}
```
`Rectangle`の文脈内で関数を定義するには、`impl`ブロックを始めます。
それから、 `area`関数を`impl`の波括弧内に移動させ、引数をシグネチャ内と本体内の両方で`self`に変えます。

この関数を呼び出すとき、`rect1.area()`というように**構造体変数のインスタンス.メソッド名()の構文**を使用します。

## 関連関数
また、`impl`ブロックの中では、`self`以外の引数を持つ関数を定義することもできます。

これらの関数は、構造体の文脈で直接アクセスできるため、**関連関数 (associated functions)** と呼ばれます。

**関連関数を定義するには、implブロックの中で、selfを引数に取らない関数を定義**します。

例えば、以下のようにして関連関数を定義することができます。

```rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn new(width: u32, height: u32) -> Rectangle {
        Rectangle { width, height }
    }
}

fn main() {
    let rect1 = Rectangle::new(30, 50);
    println!("The area of the rectangle is {} square pixels.", rect1.area());
}
```
この例では、`new`関数を定義しています。
この関数は、`impl`ブロックの中にある構造体を新しく作成するための関数であり、`self`という引数は必要ありません。

また、`new`関数を呼び出すときは、`Rectangle::new`のように、**関連関数を呼び出すときは、構造体名の直前に`::`を使用**します。

**関連関数を定義するときには、その関数が特定の構造体に関連つけられているものであることを明示的に示す必要**があります。

それが、例えば `Rectangle::new`のように、構造体の名前を一緒にして呼び出す理由です。

関連関数は、構造体のコンストラクタや、同じ構造体に関連する関数をまとめるのに便利です。
また、関連関数は、構造体を初期化する際に実行する手続きをカプセル化するために役立つことがあります。
[AWS Q&A 365][S3]AWSのよくある問題の毎日5選 #37

# 1. Amazon S3を使って静的ウェブサイトを設定する方法は？
答え：Amazon S3を使用して静的ウェブサイトを設定するには、バケットを作成し、静的ウェブサイトホスティングを有効にします。次に、ブロックパブリックアクセス設定を編集し、バケットのコンテンツを一般に公開するバケットポリシーを追加し、インデックスドキュメントとエラードキュメントを設定します。

# 2. Amazon S3でホストされている静的ウェブサイトにカスタムドメインを使用できますか？
答え：はい、Amazon S3でホストされている静的ウェブサイトにカスタムドメインを使用できます。Route 53でドメインを登録し、2つのバケットを作成し、ルートドメインバケットとサブドメインバケットのリダイレクトを設定します。その後、バケットポリシーを追加し、エイリアスレコードをアタッチし、ウェブサイトをテストします。

# 3. Amazon S3でホストされている静的ウェブサイトにTransfer Accelerationを設定する方法は？
答え：Amazon S3でホストされている静的ウェブサイトにTransfer Accelerationを設定するには、Transfer Accelerationを有効にし、URLエンドポイントを更新する必要があります。Transfer Accelerationは、長距離のファイル転送を高速化し、ウェブサイトのパフォーマンスを向上させることができます。

# 4. Amazon S3でホストされている静的ウェブサイトのデフォルトバケット暗号化を設定する方法は？
答え：Amazon S3でホストされている静的ウェブサイトのデフォルトバケット暗号化を設定するには、Amazon S3バケットキーまたはSSE-S3を使用してデフォルト暗号化を設定する必要があります。これにより、データを保護し、常に暗号化された状態で保管されることが保証されます。

# 5. Amazon S3でホストされている静的ウェブサイトを削除する方法は？
答え：Amazon S3でホストされている静的ウェブサイトを削除するには、バケット内のすべてのオブジェクトを削除し、バケットを空にしてからバケットを削除する必要があります。これらの操作はS3コンソール、AWS CLI、SDK、またはREST APIを使用して実行できます。静的ウェブサイトを完全に削除する前に、必要なデータをバックアップすることを忘れないでください。
[AWS Q&A 365][S3]Daily Five Common Questions #37

# 1. How do I configure a static website using Amazon S3? 
Answer: To configure a static website using Amazon S3, you need to create a bucket and enable static website hosting. Then, you can edit the Block Public Access settings, add a bucket policy that makes your bucket content publicly available, and configure an index and error document. 

# 2. Can I use a custom domain for my static website hosted on Amazon S3? 
Answer: Yes, you can use a custom domain for your static website hosted on Amazon S3. You need to register the domain with Route 53, create two buckets, and configure the root domain bucket and subdomain bucket for redirect. Then, you can add a bucket policy, attach alias records, and test the website. 

# 3. How do I configure Transfer Acceleration for my static website hosted on Amazon S3? 
Answer: To configure Transfer Acceleration for your static website hosted on Amazon S3, you need to enable Transfer Acceleration and update the URL endpoint. Transfer Acceleration can speed up the transfer of files over long distances and improve the website's performance. 

# 4. How do I set default bucket encryption for my static website hosted on Amazon S3? 
Answer: To set default bucket encryption for your static website hosted on Amazon S3, you need to configure default encryption with Amazon S3 Bucket Keys or SSE-S3. This can help protect your data and ensure that it is always encrypted at rest. 

# 5. How do I delete a static website hosted on Amazon S3? 
Answer: To delete a static website hosted on Amazon S3, you need to delete all the objects in the bucket, empty the bucket, and then delete the bucket. You can use the S3 console, AWS CLI, SDKs, or REST API to perform these actions.
【Rust】Selfとselfの違い

## Selfとselfの違い
Rustの`Self`と`self`は、全く異なるものです。

`Self`は、trait内で使用される特別なキーワードで、`Self`はそのトレイトを実装している型自体を指します。

例えば、以下のようにtrait内で使用されます。

```rust
trait MyTrait {
  fn new() -> Self;
}
```

ここでは、trait内で`new`という関連関数が定義されています。
この関数が戻り値に指定した`Self`は、そのtraitを実装する具体的な型を指します。

一方、`self`は、Rustのキーワードでメソッドの引数または関数呼び出しで利用されるキーワードです。

`self`は、そのメソッドが定義された構造体または列挙型のインスタンス(self by value)または参照(self by reference)を指します。

例えば、以下のように`self`を使用することができます。

```rust
struct MyStruct {
    my_field: String,
}

impl MyStruct {
    fn my_method(&self) {
        println!("my_field: {}", self.my_field);
    }
}

fn main() {
    let my_struct = MyStruct { my_field: "Hello".to_string() };
    my_struct.my_method();
}
```

ここでは、`my_field`メソッドの引数として`&self`が使用されています。
これは、`MyStruct`のインスタンスの参照を表し、`self.my_field`では参照先の`MyStruct`インスタンスのメンバーである`my_field`にアクセスしています。
GitHubが二要素認証を有効化しろって行ってきたのでする | [ACTION REQUIRED] Your GitHub account, ~~~~, will soon require 2FA

GitHubでAuthenticator application (TOTP)とText messages (SMS)での二要素認証を有効化していきます。

2023年4月27日00:00 (UTC) までに2FAの登録が必要だそうです。
**日本時間だと2023年4月27日09:00**です。

二要素認証を登録しなかった場合は、有効化されるまでGitHubアカウントのアクセスを制限されるようで、期日過ぎてからはアクセス時に2FAの登録フォームが表示されるようになるみたいです。

二要素認証の設定は

- Security key
- GitHub Mobile
- Authenticator application (TOTP)
- Text messages (SMS)

の中で**2種類**以上有効化が必要みたいです。
ここではAuthenticator application (TOTP)とText messages (SMS)を有効化します。

## 事前準備

**二要素認証用のアプリケーション**
二要素認証用のアプリケーションを用意しておく必要があります。
これは二要素認証を有効化作業の中で表示されるQRコードを読み込み、ログイン時にワンタイムパスワードを表示するためのものです。
PCかスマホにインストールしておきます。

- PCの場合
    - Chrome拡張: Chrome Authenticator 
        - https://chrome.google.com/webstore/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai?hl=ja
- スマホの場合
    - google authenticator
        - Android: https://apps.apple.com/jp/app/google-authenticator/id388497605
        - iOS: https://apps.apple.com/jp/app/google-authenticator/id388497605

**SMSを受け取れるデバイス**
スマホ等のSMSを受け取れるデバイスが必要です。

## GitHubで二要素認証を有効化する - Authenticator application (TOTP)
Authenticator applicationの認証を有効化していきます。
自分のアカウントでGithubにログインし

- https://github.com/settings/security

にアクセスし、以下の緑のボタンEbable Two-Factor authenticationをクリックします。

![2fa-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/bd50b8ce-a001-8313-1ff5-a44d37da57a4.png)

`Confirm access`が表示されたら、アカウントのパスワードを入れて進んでください。

事前準備で用意した二要素認証用のアプリケーションでQRコードを読み込みます。
読みこむと6桁の数字が表示されるので表示された数字を`Verify the code from the app`に入力してContinueします。

注) 6桁の数字は一定時間で更新されるので更新前に入力してContinueをクリックしてください。
![2fa-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/72de737c-3412-8f67-8d3f-7c7c948397eb.png)

次の`Download your recovery codes`で表示されているのは、二要素認証用のデバイスの故障等でワンタイムパスワードが取得できなくなった時用の復旧用の文字列で、ダウンロードしてデバイスとは別の安全な場所に保管してください。

ダウンロードすると落ちてくる`github-recovery-codes.txt`が復旧用のコードです。

![2fa-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/242b2b2e-0cf1-029f-3a87-aa74739a4e07.png)

保管したら、`I have saved my recovery code`をクリックして次に進みます。

![2fa-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/7ae62173-fb6a-b797-638d-b5f7c0f30d00.png)

これで一旦終了です。

## GitHubで二要素認証を有効化する - Text messages (SMS)
Text messagesの認証を有効化していきます。
自分のアカウントでGithubにログインし

- https://github.com/settings/security

にアクセスします。Authenticator applicationを有効化した後だと以下のような画面になるので
SMS/Text messageのAddをクリックして設定を進めていきます。

![sms-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/761dd10f-5115-075b-c746-65c40ca6d4ec.png)

Country codeをJapanを選択し、その下にSMSを受け取れる電話番号を入力してSendします。
入力欄がその下に追加されるので、SMSに送られてきた6桁の数字を入力してSaveで設定終了です。

![sms-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/8e7ea230-b973-7727-139a-62c4848c032e.png)



終わり。
LinuC-1 Exam 101 振り返り

# はじめに
LinuC-1 Exam 101 Version 10.0（1回目受験）の振り返りまとめ。（2023/04/22受験）
勉強期間：１週間
事前知識：dockerコマンドと基本的なLinuxコマンド（cd, ls, rmなど）が分かる程度。
勉強方法：主にping-tの問題。分かりにくい箇所はUdemyで学習。

https://ping-t.com/

https://www.udemy.com/course/linuxlpic

# 結果
スコア 466点
合格ライン 480点
不合格
 
### セクション名：　正解率
Linuxのインストールと仮想マシン、コンテナの利用：　62％
ファイル・ディレクトリの操作と管理：　50%
GNUとUnixのコマンド：　53%
リポジトリとパッケージ管理：　62%
ハードウェア、ディスク、パーティション、ファイルシステム：　63％

# 反省点
選択式だけではなく、コマンドを実際に打つ問題があり、戸惑った。コマンドのオプションについて、大体ではなく、実際に自分で打てるだけのはっきりとした知識が必要だと感じた。shutdown関係の問題が多かった気がするが、-h、-s、-rなどのオプションや、時間指定をする時、デフォルトが秒なのか、分なのか分からなかったので今後重点的に復習する。また実際にAWSやVirtualBoxで練習用の環境を作成し、実際に何回も打って覚える必要がある。併行して、今日までにPing-tで間違えた箇所の問題について解き直しを行う。
【Vim】 短縮入力でよく使う文字列のショートカットを作成


# Introduction

普段のコーディングは`VSCode`で行っていますが、ちょっとしたメモやシェル、SSH 接続した学習用の端末等で`Vim`を使う機会があります。
メモはともかく、`Vim`ではシェルの`shebang`や学習時のハイパラ設定等、定型文を頻繁に手入力していました。
そんな面倒なコピペや手入力をしなくても、`.vimrc`に`短縮入力(abbrコマンド)`を登録しておくとショートカットできて便利なので紹介します。

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu22.04

## 1. .vimrc の設定

- `.vimrc`は`Vim`の設定ファイルです。ここで`短縮入力`を記述します。
- `短縮入力`は長い文字列を、ショートカット文字列で記述できるようにします。
- 以下のコマンドで`.vimrc`を開きます。ファイルがない場合は新規作成されます。

```bash:
vim ~/.vimrc
```

- `短縮入力`の基本構文は以下になります。

```console
abbr <ショートカット> <文字列>
```

- 例として、`shebang`を登録してみましょう。`.vimrc`に以下の記述を追加してください。

```console:
abbr _sh #!/bin/bash
```

- 基本構文に当てはめると以下のとおりです。
  　- <ショートカット>`_sh`
  　- <文字列>`#!/bin/bash`
- `:wq`でファイルを保存して閉じます。以上で`短縮入力`の登録完了です。

## 2. 短縮入力の動作確認

- 登録した`shebang`の短縮入力を実行してみましょう。

```bash:
vim test
```

- `i`で挿入モードに入ります。
- <ショートカット>の`_sh`を入力し、`Enter`や`Tab`等、文字や数字以外の任意キーを押します。

```vim:
#!/bin/bash
```

- `shebang`が表示されるようになりました。
- 以上で`短縮入力`完了です。<ショートカット>の文字列を忘れないようにすれば、地味ですが大いに役立つ機能になります。

## 3. おまけ

- 今回は`短縮入力`を 1 件しか登録しませんでしたが、複数の`abbr`コマンドが追加可能です。
- `短縮入力`は 1 行に限られませんが、エディタのタブ補完のようにシンプルな設定をおすすめします。

### 最後に

一度`短縮入力`を登録しておけば環境が変わる等ない限りショートカットできますが、それ故に忘れやすいため備忘録として記事にしました。
本記事の執筆にあたり、『マスタリング Linux シェルスクリプト』を参考にしました。
情報が比較的少ないシェルの体系的な知識に加え、本記事にあるような Vim の便利な機能も記載されておりますので本棚に一冊あると重宝します。

### 参考

https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0Linux%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88-%E7%AC%AC2%E7%89%88-%E2%80%95Linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%80%81bash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-Mokhtar-Ebrahim/dp/481440011X
1年目エンジニアが半年かけて高校数学をやり直した記録

社会人1年目の夏から半年間、高校数学してました！
高校ではろくに勉強してなかったので、実質初学者でしたが、なんとかやり切りました。

## なぜやろうと思ったのか
+ 大学数学を履修したはずなのに、全然覚えていない
→ まずは高校レベルで基礎固めしなければ一生身につかないと思った
+ 数学をやらなかった後悔があった

## 始める前の数学レベル
+ 数IAはだいたいできる
+ 数IIBからはわからない
+ 大学数学の科目はいくつか取ったが、テストを乗り切ったら忘れてしまったので考慮外

## 勉強時間、やり方
+ 総勉強時間: 160時間
+ いつやった: 毎日昼休み、ノってる日の夜

社会人は勉強時間の確保が最大の課題だと思います。解決策として、「この時間にやる！」を決めれば、半惰性的に勉強するようになり、無理せずともいつか終わります。
私の場合、「昼休みは数学！」と決めてから、出勤するたびに数学が進んでました。日々進歩を感じるのは嬉しかったです。

## 学習教材
すべてマセマ出版の「スバラシク面白いと評判の初めから～」シリーズを使用しています。
[初めから始める数学 – マセマ出版社](https://www.mathema.jp/product_category/%e5%88%9d%e3%82%81%e3%81%8b%e3%82%89%e5%a7%8b%e3%82%81%e3%82%8b%e6%95%b0%e5%ad%a6/)
[初めから解ける数学問題集 – マセマ出版社](https://www.mathema.jp/product_category/%e5%88%9d%e3%82%81%e3%81%8b%e3%82%89%e8%a7%a3%e3%81%91%e3%82%8b%e6%95%b0%e5%ad%a6%e5%95%8f%e9%a1%8c%e9%9b%86/)

メルカリでまとめて購入し、合計7900円(平均1冊878円)でした。

このシリーズは、チャート式ほど量がなく、かつ文字通り「初めから」教えてくれるので、私みたいなほぼ初学者でも独学できました。

途中、数学IIBが非常に辛かったです。概念を学ぶ割には楽しい計算が全然なかったので…。代わりに数IIIに入ってからは、数IIBと繋がって楽しく微分積分できました。頑張って耐えてよかった！

### 教材ごとの学習時間

| 数IA教材 | 学習時間 |
|:-:|:-:|
| 初めから始める数学I | 16時間 |
| 初めから始める数学A |  11時間 |
| 初めから解ける数学I・A問題集 | 14時間 |
| 計 | 41時間 |

| 数IIB教材 | 学習時間 |
|:-:|:-:|
| 初めから始める数学II | 22時間 |
| 初めから始める数学B |  16時間 |
| 初めから解ける数学II・A問題集 | 24時間 |
| 計 | 62時間 |

| 数III教材 | 学習時間 |
|:-:|:-:|
| 初めから始める数学IIIPart1 | 13時間 |
| 初めから始める数学IIIPart2 |  26時間 |
| 初めから解ける数学III問題集 | 18時間 |
| 計 | 57時間 |

その他、数IA・数IIBでは理解度の判定に令和3年度大学入試共通テストを使用しました。
時間制限なしでやったところ、得点は、
+ 数IA: 81(平均57.68)
+ 数IIB: 64(平均59.93)

という感じで、まあセンター対策してない割には悪くないかな？と思いました。
一番の収穫は、1時間以上数学に向き合える地力がついたことかもしれません。

## 学習してみて変わったこと、変わらなかったこと
**業務では正直、役に立つ機会がありません！！！**
一応、間接的に役立つときはあります。後述する競プロで学んだことを業務のプログラム化に活かせたり、数学のように1行ずつエラーを追っていく癖がついたりしました。
スキルアップの観点からは微妙だったかもしれません。理解に数式が必要な仕事がそもそもないです。

競プロは、そもそも高校数学前提の問題なので、当然役立ちます。
ただ、数IIIまで学んだ時点だと、「解説が理解しやすくなった」程度で恩恵を感じづらいかもしれません。
これが、線形代数まで学び直すと、直接的な解法に繋がってきます。大学数学をやるための高校数学と見れば、効果が大きいものだと思います。

あと趣味的な話ですが、積分が結構楽しいです！ヨビノリさんの今週の積分や他の数学授業も、娯楽的に楽しめるようになりました。
急にΣや∫が出てきても強気になれるのも良い変化でした。抵抗なくなるって大事ですよね。

包括的には、達成感もありましたし、久々の数学が純粋に楽しかったので、やってよかったーと思っています。
それに、最近、社会人向けの大学院に通いたいと考えています。院試では当然大学数学が必要なので、高校数学をやっていないと絶望的でした。思わぬところで選択肢が広がることもあるんですね。

## 今後の学習
前述の通り、大学院進学も考えているので、情報工学で使う数学を学んでいく予定です。
最近線形代数をやりまして、対角化が非常に楽しかったです。この「楽しい」を大事にしたいです！「数学をやらなかった後悔」がもうないように！
そのうちマセマロードマップをやりきれたらいいな。

## 参考
https://qiita.com/poly_soft/items/8ea0fc85577f0726f098

## おまけ 便利な勉強道具
+ クルトガ
ちょっと高いけど三菱のクルトガオススメ
https://www.amazon.co.jp/dp/B0845V47FR
+ フリクション&フリクション消しゴム
フリクションと付箋で間違えた箇所を記録していました。
フリクションの裏のボールすぐ黒くなりますよね、これフリクション消しゴムで消すと黒くなりづらいです。
ただ、消しゴムは取扱店が少ないので注意です。めっちゃ探してロフトにありました。
+ ページオープナー
純粋に便利です。ページ閉じるストレスが軽減されました。
Amazonで適当に買ったので、どの商品かは覚えていないです。
商品によると思いますが、痕がわりと残るので、気にする人は注意です。
+ しおりシール
リュックで持ち運ぶと、普通のしおりはよく失踪します。
無印のしおりシールは紐の形なので、失踪することがありません。
シールの名の通り、一度貼ったらきれいに剥がせないので注意です。
【Python】palindromeの実装

# はじめに
palindromeとは
逆さに読んでも同じもの。
例）abcba
※ 1文字の時も今回は含めることにする。

# 実装
```python:palindrome.py
def palindrome(strings: str) -> bool:
    len_strings = len(strings)
    if not len_strings:
        return False
    if len_strings == 1:
        return True

    start, end = 0, len_strings - 1
    while start < end:
        if strings[start] != strings[end]:
            return False
        start += 1
        end -= 1
    return True

if __name__ == "__main__":
    print(palindrome("test"))
```

# 参考
https://www.udemy.com/course/python-algo
ポケモンのサイズ・体重をまとめたCSVを作りました

ポケモンのサイズ・体重をまとめたCSVデータを作りました
---
https://github.com/kurogee/pokemon_detail
↑github初心者なので使い方間違ってたら教えてください...

・日本語名にのみ対応しています
・名前は「name」列
　サイズ(単位:m)は「size」列
　重さ(単位:kg)は「weight」列にあります
・エンコーディングはUTF-8です
・サイズは約27.4KBです

使い方の例(Python)
```python:example.py
import pandas
from sys import exit

data = pandas.read_csv("pokemon_detail.csv", encoding="utf-8")
sizes = data["size"]
weights = data["weight"]
names = data["name"]

search_size = float(input("サイズ(m): "))
search_weight = float(input("体重(kg): "))
tolerance_size = float(input("サイズの許容範囲 (数値入力): "))
tolerance_weight = float(input("体重の許容範囲 (数値入力): "))

kouho = []
for size, name in zip(sizes, names):
    if search_size - tolerance_size <= float(size) <= search_size + tolerance_size:
        kouho.append(name)

if kouho == []:
    print("候補: なし")
    exit(0)
else:
    result = []
    for i in kouho:
        memory = list(names).index(i)
        if search_weight - tolerance_weight <= float(list(weights)[memory]) <= search_weight + tolerance_weight:
            result.append("名前: {}\n高さ: {} 重さ: {}".format(list(names)[memory], list(sizes)[memory], list(weights)[memory]))
    if result == []:
        print("候補: なし")
    else:
        print("+++検索結果+++")
        print("\n\n".join(result))
```
UnrealIRCd構築メモ

windows10にUnrealIRCdでIRCサーバをローカルに立ててみたので、インストールや設定作業で個人的に気になった点をまとめます。

基本的にドキュメントが充実しているのでほとんどそれに従えば問題なく接続までできました。

自己証明書を使ってSSL/TLS接続することまで行います。

# UnrealIRCdのインストール

https://www.unrealircd.org/download/6.0/6.0.6/winssl からインストーラをダウンロードします。

インストーラを起動してウィザードを適宜進めていきます。

最後の画面のチェックボックスの`Run makecert.bat`はチェックをつけておけば、Finishのあとにバッチが起動するので、必要事項を入力すればSSLサーバ証明書が作成できます。
![スクリーンショット 2023-02-08 175300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/e500bce9-cf3b-a3e2-3990-0fd617a39cb9.png)

# 設定ファイルの修正[^1]

[^1]:参考：https://www.unrealircd.org/docs/Installing_(Windows)

以下ではインストール先ディレクトリを`$IRCDIR`とします。

`$IRCDIR\conf\examples\example.conf`を`$IRCDIR\conf`にコピーして、ファイル名を`unrealircd.conf`にリネームします。

このファイルがUnrealIRCdの設定ファイルになりますので適宜修正していきます。[^2]
設定項目がたくさんありますが、最低限以下を設定すれば起動しました。
cloak-keyはランダム文字列生成のwebサービスを使って90文字の文字列を作成すれば大丈夫でした。

```diff:unrealircd.conf
- oper bobsmith {
+ oper hoge { 

...
    cloak-keys {
		"Oozahho1raezoh0iMee4ohvegaifahv5xaepeitaich9tahdiquaid0geecipahdauVaij3zieph4ahi";
-		"and another one";
-		"and another one";
+		"jBUOcpY0LCsDI7xIc6aFRvGYGW5xLQI72Tsf6nTTk8UDMBc1Bw6G3II72DT86LwydFssu0XiDubv0ROM";
+		"lya77ca1655osddBE5bqPgfrft2NacnCfF5IjRKkpSU5xSbT1xnttvdP7XRDrINxjQ50buPMBeXsjc3l";
	}

...

set {
-	kline-address 'set.this.to.email.address'; /* e-mail or URL shown when a user is banned */
+	kline-address 'email@example.org'; /* e-mail or URL shown when a user is banned */
```

[^2]:設定項目　https://www.unrealircd.org/docs/Configuration 

UnrealIRCdを起動して次の画面が表示されればサーバ構築完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/8b07cf60-43ea-b3d5-1bc0-c2e87e09c1da.png)

# 接続確認

IRCクライアント（LimeChatやHexChatなど）からIRCサーバに接続してメッセージ送受信することを確認します。

### 暗号化なし

`localhost:6667`に接続することでメッセージ送受信することができました。

### SSL/TLS通信

接続の前にUnrealIRCdのSSLサーバ証明書をwindowsの証明書ストアにインストールします。
`$IRCDIR\conf\tls\curl-ca-bundle.crt`をダブルクリックして証明書のインストールをすれば完了です。

`localhost:6697`に接続することでメッセージ送受信することができました。

(LimeChatからだと対応TLSバージョンが古くてサーバ接続時に`error: : ACCEPT_SR_CLNT_HELLO: tlsv1 alert protocol version`のエラーで即切断されます。）

# 補足

## デバッグ用ログを出力したい。

以下のように設定します。

```diff:unrealircd.conf
log {
	source {
		all;
-		!debug;
+		debug;
		!join.LOCAL_CLIENT_JOIN;
		!join.REMOTE_CLIENT_JOIN;
```

ちなみにログは`$IRCDIR\logs\ircd.log` に出力されます。

## サーバ接続パスワードを設定したい

以下のように設定します。

```diff:unrealircd.conf
allow {
	mask *;
	class clients;
+	password "mzbot123";
	maxperip 3;
}
```

## 仮想ホスト名を割り当てないようにしたい。

UnrealIRCdはデフォルトではサーバ接続しているユーザのIPアドレスを他ユーザに見えないようにvhost(仮想ホスト名)を割り当てるようになっています。

それを無効化するには、以下のように設定します。[^3]

```diff:unrealircd.conf
-	modes-on-connect "+ixw"; /* when users connect, they will get these user modes */
+	modes-on-connect "+iw"; /* when users connect, they will get these user modes */
```

[^3]:クローキング：https://www.unrealircd.org/docs/Cloaking

## 連続送信の間隔時間の制限をなくしたい

デフォルトでは短い時間間隔でメッセージを多数送ると送信制限かかるのですが、anti-fllod機能を無効化することで制限がなくなります。[^4]

以下を設定ファイルに追加し、もし既存の設定に`anti-flood`ブロックがあれば削除してください。

```:unrealircd.conf
blacklist-module targetfloodprot;
```



[^4]:anti-flood：https://www.unrealircd.org/docs/Anti-flood_settings
bcmbm-mrubyでException

mruby 3.2ベースでビルドしたモジュールでSimpleHttpすると落ちるようになってしまいました。

```
Hello Bear Metal mruby on BCM/mips
10.0.1.128
simple http 1
**Exception 32: EPC=80035240, Cause=9080002C (CoProcUnu)
                RA=8003523C, VAddr=00000000

        0  ($ 0) = 00000000     AT ($ 1) = A0000000
        v0 ($ 2) = 00000000     v1 ($ 3) = 00000000
        a0 ($ 4) = 00000000     a1 ($ 5) = 800AE4D0
        a2 ($ 6) = 0000002B     a3 ($ 7) = 00000001
        t0 ($ 8) = 0000003F     t1 ($ 9) = 00000026
        t2 ($10) = 0000007C     t3 ($11) = 0000002A
        t4 ($12) = 0000003A     t5 ($13) = 00000021
        t6 ($14) = 000000BF     t7 ($15) = 0000002C
        s0 ($16) = 00000005     s1 ($17) = 80FFFDC8
        s2 ($18) = 800CC5E0     s3 ($19) = 00000000
        s4 ($20) = 800D64A8     s5 ($21) = 0000002F
        s6 ($22) = 800CC5E0     s7 ($23) = 800B53AC
        t8 ($24) = 000002E0     t9 ($25) = 800D77F0
        k0 ($26) = 80FFFDC8     k1 ($27) = 800D1AA0
        gp ($28) = 8043BDC0     sp ($29) = 80FFFD00
        fp ($30) = 800B292A     ra ($31) = 8003523C

Decompressing..........done
 >0x80FFFFFF>complite
```

ヘッダーの連想配列のsortで落ちていました。

レジスタの中身から16Mのメインメモリの前後1Mくらいしか使ってないので、メモリ不足ではないようです。

Exceptionの理由はコプロセッサー関係ですが、明示的にアクセスしてるところはないので、直接的な原因ではないと考えられます。

なぜかadmbm-mrubyでは問題が起きません。

build_config.rbを見比べたところ、bcmbmには-march=mips32あり、admbmにはなかったので外してみました。

なんとこれで問題が解決しました。

BCMはmips32なので付けてもよさそうなのですが、ダメみたいです。

admbmはbcmbmから作ったのですが、なぜ外したかは覚えていません。

mrubyみたいな複雑なプログラムはコンパイル時のオプションがシビアなのかもしれません。
Azure Logic Apps 従量課金を Azure CLI を使ってゾーン冗長で作成してみた

Azure Logic Apps の従量課金をゾーン冗長で作成するのはプレビュー中という事もあり、今のところ Azure ポータルからのみサポートさています。つまり Azure CLI からの作成はまだサポートされていないわけですが、Azure ポータルも一つのウェブアプリケーションなので、最終的な処理は Azure REST API で Azure リソースを作成しているはずです。そこで今回は Azure CLI の REST 機能を使って、プレビュー中のゾーン冗長設定の Azure Logic Apps を作成してみました。

## まずは Azure ポータルでゾーン冗長で作成して JSON を確認

ゾーン冗長の場合は、`"zoneRedundancy": "Enabled"` が存在するようです。

![logicapp-zone-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/ce879f91-0788-2567-d6c8-5071fb4287ff.png)

![logicapp-zone-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/37bfb794-de88-b59d-bf6a-3db85cee533b.png)

## Azure CLI でゾーン冗長の Azure Logic Apps を作成

```bash:bash
wf=mnrlgama-003
rg=mnrlgama-rg
sid=$(az account show --query id --output tsv)
location=japaneast

az rest \
  --method put \
  --url "https://management.azure.com/subscriptions/$sid/resourceGroups/$rg/providers/Microsoft.Logic/workflows/$wf?api-version=2016-06-01" \
  --body '{
  "properties": {
    "definition": {
      "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {},
      "triggers": {},
      "actions": {},
      "outputs": {}
    },
    "parameters": {},
    "zoneRedundancy": "Enabled"
  },
  "location": "'$location'",
  "tags": {}
}'
```

## 参考

https://learn.microsoft.com/ja-jp/azure/logic-apps/set-up-zone-redundancy-availability-zones?tabs=consumption

https://learn.microsoft.com/ja-jp/rest/api/logic/workflows/create-or-update?tabs=HTTP
Railsのパーシャル(部分テンプレート)とは

# はじめに
Railsのパーシャルについてまとめてみました

# パーシャルとは
パーシャル(部分テンプレート)とは、複数のViewファイルの中で使われている部分を一つのViewファイルとして管理したい場合に使い、コードを共通化することができる

## 使い方
### `render`メソッド
`<%= render 'ファイル名' %>`で指定したテンプレートファイルを呼び出す

### ファイル名のルール
パーシャル(部分テンプレート)のファイル名はファイル名の先頭に`_`を付ける
* 例: `_header.html.erb`

### 例
```ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Sample App</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="utf-8">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
  </head>
  <body>
    # app/views/layouts/_header.html.erbのパーシャルを呼び出している
    <%= render 'layouts/header' %>
  </body>
</html>
```


# 参考記事
[【Rails】 部分テンプレートの使い方を徹底解説！](https://pikawaka.com/rails/partial_template)
Goracle Backup Repository for Mac & Linux Users


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307384/7b93fd22-c288-e294-e41f-42aa34efa47f.png)

https://github.com/Moon1215i/goracle_backup

`.goracle` is the configuration file for the Goracle node, containing the account information required for the node to participate in the Algorand network, as well as the connection details for the Algorand node that the Goracle node will use. This file is created during the initialization of the Goracle node and is critical for backing up, restoring, and migrating the Goracle node to another VPS. As such, backing up this file is the top priority for Goracle node operators and will be necessary in case of Goracle node or VPS failure, or when migrating to another VPS. I have created a repository that can assist with backup and restoration, which I hope will be useful for the Goracle team and GoraGang members.

This backup repository is specifically designed for Mac and Linux users, and may not be useful for Windows users. The Goracle node is very user-friendly for operators, and the configuration file is so simple that it can be saved in Notepad by simply copying and pasting. Additionally, if you use SFTP, you can make the file copying process more visually appealing. Although it is not necessary to create a repository, it is also possible to copy files using the command prompt. As this repository is related to the Goracle node, we share it here. By the way, the prompt supports English and Japanese, and other languages can be added as well. Please feel free to try it out if you are interested.

@Moon1215i



<details><summary>【日本語】</summary>

<!--(上に空行が必要)-->
`.goracle`は、Goracleノードの設定ファイルで、Algorandネットワーク上のGoracleノードが参加するためのアカウントと、Algorandノードへの接続情報が含まれています。Goracleノードを初期化する際に、このファイルが作成されます。この極めて重要なファイルをバックアップすることは、Goracleノードオペレーターにとって最優先のタスクです。また、Goracleノードの不具合やVPSの問題、別のVPSに移行する際にも必要となります。このため、バックアップや復元に役立つリポジトリを作成しました。GoracleチームやGoraGangの方々がお役に立てることを願っています。

このバックアップリポジトリは、MacとLinuxユーザー向けで、Windowsユーザーには役に立たないかもしれません。Goracleノードはオペレーターにとって非常に使いやすく、設定ファイルもメモ帳にコピー&ペーストで保存できるほどシンプルです。また、SFTPを使用すればファイルのコピーも見やすくできます。リポジトリを作成するほどのことではありませんが、コマンドプロンプトを使用してファイルをコピーすることも可能です。Goracleノードに関連するものなので、ここで共有します。ちなみに、プロンプトは英語と日本語に対応しており、他の言語も追加することが可能です。興味がある方はぜひ試してみてください。

@Moon1215i


</details>
Oracle SQL Developer にてデータ・パンプ・インポート・ウィザードにて発生する ORA-31640 への暫定対応

## 概要

Oracle SQL Developer にてデータ・パンプ・インポート・ウィザードにて発生する ORA-31640 への暫定対応方法を共有します。Oracle SQL Developer にて、デフォルトの設定でデータ・パンプ・エクスポート・ウィザードで出力したデータ・パンプ・ファイルをインポートしようとしたら次のエラーが発生しました。とりあえず次の手順に進めることができた方法を共有します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/521acd06-753e-210c-73ad-e5490d79bba3.png)

`EXPDAT01.DMP`が検索されてしまうため、ファイルの完全名を渡す方法で回避しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5eed2cf0-ce38-9c40-73e6-399a9f8f0580.png)

ファイル名を`EXPDAT01.DMP`に変更する方法やエクスポート時にファイル名に日付を付与しない方法でも暫定対応はできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e93f7706-5d5c-a096-75b7-a3877a5f75a3.png)

## エラーメッセージ

> 例外: ORA-31640: ダンプ・ファイル"/home/oracle/dpdump/hr/EXPDAT01.DMP"を読取りのためにオープンできません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/521acd06-753e-210c-73ad-e5490d79bba3.png)

## エラー対応手順

### 1. ファイルの完全名（例：`EXPDAT01-10_04_18.DMP`）を取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fa232aba-3831-24c2-a037-dabea782181b.png)

### 2. `インポート・ウィザード`にて`ファイル名またはURI`にファイルの完全名を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/aaa17d96-d3f4-1dff-707b-ffd7de4470d3.png)

### 3. データ・パンプを読み取れていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dd63c9ac-025f-6488-b6eb-11141dac756a.png)
#Slack Bolt for Python を利用したアプリ開発：エンタープライズグリッド環境下で考慮すべきこと

Slackには普通の環境と、それを拡張したエンタープライズグリッドという環境があります。
通常はエンタープライズグリッドを考慮した開発を行わないと思うので、いざやってみると挙動がおかしいぞ？ということが発生して、その違和感にモヤモヤしながら開発をすることになったりします。エンタープライズグリッドは少し特殊な環境だと言えます。

## 何が起こるのか
アプリのホーム画面に機能性を与えるような実装をしている場合に困難が生まれます。
例えば、開発中のChatGPT対応アプリだと、以下のような画面の実装があります。
![GPT_Party_-_Leave_a_Nest_Co__ltd__-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/124fa6ba-13df-7f5c-afc2-21f8c6710ece.png)

ピンクの枠で囲った部分は、当該ワークスペースで、機能をOn/Offするようなトグルボタンになっていて、そのワークスペースの設定を格納するためのテーブルにその値を格納しています。
例えばそのテーブル名をWorkspaceSettingsとしておきましょう。
この中には team_id というワークスペースIDを格納するカラムが存在し、それらをキーとしてレコードを取得するようになっています。
通常のワークスペースではそのやり方で構わないのですが、エンタープライズグリッドだとこのやり方を実現するには少し工夫が要ります。

## エンタープライズグリッドの仕様の謎
エンタープライズグリッドでは、一つのエンタープライズIDの元に、いくつものワークスペースを配置することができます。
これは、表現として正しくは無いと思うのですが、内部的には恐らくエンタープライズグリッドという1つの契約が通常のワークスペース一つの契約と同等になっていて、ワークスペースIDによってその一つの箱を切り分けているだけなのではないかなと。
そのため、例えばワークスペースAでSlackコネクトで外部の人とつなぐと、他のワークスペースのDM欄からもアクセスすることができます。ワークスペースという意味でいうと異なるものという形には恐らくなっていないのではないかと考えています。

## エンタープライズグリッドで起こる現象について
これはアプリのホーム画面やDMでの実装のみに関して違和感を覚えるだろうなという話になっています。通常のチャンネル上のメッセージイベント等では発生しません。上述の通り、ホーム画面はエンタープライズグリッド内のどのワークスペースからでもアクセスできるというものであり、決して別れたものという認識にはならないようです。

### 正しい team_id が返ってこない
例えば、先程示した画像のボタンを押したとします。
action_idをclick_buttonとしていた場合、そのアクションは以下のような形でキャッチします

```bolt.py
@app.action("click_button")
def click_button_hundler(ack, body, logger, client, view, context):
    print(body["team"]["id"])
    print(context["team_id"])
```

このbody["team"]["id"]/context["team_id"]は正しいidかどうかはわかりません。
複数のワークスペースで試すと、一つのteam_idしか返ってこないでしょう。
エンタープライズグリッドでテストする場合は、複数のワークスペースを作った上でテストをしてみると良いと思います。

## 正しいteam_idが返ってくるのは app_home_opened の時のみ
ものすごく重要な点です。
正しいワークスペースIDが返ってくる唯一の瞬間が、アプリのホーム画面を開いた瞬間です。
このときの　body['team_id']　には、きちんとそのワークスペースのIDが含まれています。
ホーム画面からの処理ではこのIDを引っ張り回しましょう。
先程のボタンのトグル処理の場合は、ボタンのvalueにteam_idを仕込んで引っ張り回しています。モーダルで続いていくような処理の場合はprivate_metadataのなかに格納してしまえばOK。

## まとめ
エンタープライズグリッドのアプリのホーム画面・DM画面は特殊なので気をつけましょう。
テスト環境だとエンタープライズグリッドの複数ワークスペース作ってまで検証しない場合が多いと思うのですが、かなりハマりどころの大きな点だと思います。

上記の不具合は、以下のアプリのユーザーからの報告で気付きました。
ChatGPTをSlackで活用できるアプリになっています。無料で使えますので是非使ってみてください。

https://qiita.com/geeorgey/items/124346b9f4762f7f0e4b