OmniAICreator/Qiita-1.07M huggingface dataset:
セルフケアのススメ

# はじめに
今回はセルフケアについて考えてみました。
お風呂に入りながら、通勤列車の中、アイスを食べながら...など
ちょっとした息抜きに読んでもらえれば幸いです。

【追伸】皆様のオススメのセルフケアなどございましたら
コメントいただけるととっても嬉しいです:relaxed:

## 新しい環境はいかがでしょうか？

4月になり、もう半月が経ちますね。

学生の皆さんは新学年へ進級したり新しい学校へ入学したり、
新社会人の皆さんは社会人として入社してまだまだバタついている時期かもしれません。

今回はそんな新しい一歩を踏み出した皆さん（特に新社会人）の方に向けて、
「セルフケア」のススメをお伝えできればと思います。

## セルフケアって？
そのままの意味ではあるのですが、

- **セルフ=自分**
- **ケア=手入れ、世話、メンテナンス**

つまり「自分自身をお手入れして、自己を大切にする」ということです。

## なぜセルフケアをするの？

特にエンジニア業界では毎日コンピュータとにらめっこしながら、頭を使って考えながら仕事をすることが多いです。本番サーバや顧客情報など重大なシステムや情報を扱ったりとするので、心労も多々発生します。そんな中、フルパワーで向き合いすぎることは、体調を崩すことにつながります。

だからこそ、業界や社会で長く生き残っていくためにそれらの心労を癒す術を知っておくことは大切です。

## どうやってセルフケアするの？
皆さんにとってのセルフケアもあるかと思いますが、
今回は自分の行っているセルフケアの例を少し挙げてみます。

### お昼休みに外に出る
お昼休みの外出がオススメです。

たまにはお昼休みに外へ出てみましょう。
オフィス内や自宅でずっと篭っていると、気分や環境が変化しないため少し塞ぎこみがちです。急ぎの実装や対応がない日は少し意識して外に出てみるのがオススメです。

日光を浴びることでセロトニンが分泌されるため、心身の健康につながります。

### ゆっくりとお風呂に入る
お風呂もオススメです。

私は毎日浴槽にお湯を張っています。（いつも長風呂してしまいます）
Youtubeなど動画サイトで気になっている動画を見るくつろぎ時間を設けています。

### お香を焚く
お香もオススメです。

疲れた日などは入浴後にお香を炊いています。
身体も温まった状態で、さらにいい匂いで気分転換をしています。
寝つきもいい気がします。

おすすめのお香を貼り付けたので、よければ試してみてくださいね。
（火付けから香皿・香立までが１箱で完結するセットがあり、入門におすすめです。）

https://hibi-jp.com/

### 睡眠をとる
睡眠をとることもオススメです。

寝る前までパソコンやスマホを触っていると目が冴えてしまうので、寝つきが悪くなったりすることもあります。たまには眠る少し前からパソコンやスマホを置いてみてもいいんじゃないでしょうか。

厚労省には睡眠ガイドというものがあるようです。
一度読んでみてもいいかもしれません。

https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/kenkou/suimin/index.html

### 思ったことを書き出す
思ったことを書き出してみるのもオススメです。
どんな媒体でもいいので、自分の思っていることや考えを外に出してあげましょう。
自分の中で抱え込みすぎると溜まっていくので、適度に吐き出すことも大切です。

Noteというサイトなんかは、
自由に書けて、他の方の記事も読めたりするのでいい感じです。

https://note.com/

### 自分自身で変化したポイントを探す
自分自身で変化したポイントを探すのもオススメです。

他者や自分の中での理想と比較しすぎてしまうと、
できていない面ばかりに注目してしまって落ち込んでしまうことはありませんか？

過去の自分や昨日よりできたこと、なんかを振り返ってみましょう。
前よりちょっと成長した自分を少しだけ肯定してみましょう。

千里の道も一歩から:runner:です！

# まとめ

IT業界は、入社して1、2年が特に大変な業界かなと思います。
自分自身もその頃は大変で日々何かと焦っていた記憶があります。

小さなことを積み重ねていけば、できることも増えていきます。
適度に焦りすぎないように、セルフケアをして心身のバランスを整えながら、
少しずつ自分を強くしていきましょう。

# その他参考

https://www.mhlw.go.jp/kokoro/youth/stress/self/index.html

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
【神ツール】Github Copilotはコード生成だけでなく、ブログ記事作成にも大活躍らしい

# はじめに
お疲れ様です。秋並です。

皆さん、Github Copilotはご存じでしょうか。  
Github Copilotはコーディング作業を支援するサービスで、例えば下動画のようにコメントの内容からコードを自動生成することが出来ます。
![copilot_comment_python.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/00b4e7a6-2cb0-100b-ba3d-7a6e1c3d3871.gif)

<br>

Github Copilotはコード生成に用いることがメインですが、Markdownファイルにも対応しているためブログ記事の作成のような用途にも使用することが出来ます。

そこで、今回は
- Github Copilotを使用したMarkdownファイルの作成方法

について解説したいと思います。


# 環境/前提条件
- Visual Studio Code上でgithub copilotを使用することができる状態になっている（参考サイト：[VSCode ではじめる GitHub Copilot 活用術](https://qiita.com/RyoWakabayashi/items/1207128e88669c76bf5f)）


# Github Copilotをmarkdownファイルでも使えるようにする
VScodeでGithub Copilotを使用する場合、デフォルトではMarkdownファイルでのコード補完が無効になっているため有効化する必要があります。

VSCodeの設定で `copilot` と検索し、Markdownでのコード補完を有効化してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/c7fbb8db-9a39-4554-9986-970fbd8ed001.png)

# Markdownで文章を作成する
Markdownで文章を途中まで記述すると、Copilotが続きの文章を提案してくれます。提案された文章は「tabキー」を押すことで採用することができます。

ファイル全体の文章量が少ない場合、補完される文章も大雑把になりますが、文章を書き進めれば**それまでに記述した文章をもとに**、よりもっともらしい文章を提案してくれるようになります。
![copilot_markdown.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/86e836b3-fade-aa0c-5f0d-05d3506e030c.gif)


## texによる数式の補完
数式を記述する際には、texを使用する人も多いと思いますが、Github Copilotではtexの数式も、いい感じに補完してくれます。

例えば、下画像のように何も数式が書かれていない状態で文章を記述すると日本語のみの文章が提案されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/0dcf8559-48f9-bcb8-fc2f-6871b67524fe.png)

<br>

一方で、下画像のように、「初期手先位置 ```\vec{P}_{\mathrm{start}}```」まで記述した場合、その数式の情報をもとに「目標手先位置 ```\vec{P}_{\mathrm{goal}}```」という数式が提案されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/cc50968a-5cd2-698b-d7b9-b2b8250b58f3.png)

<br>

個人的には、texで数式を記述しているとタイプミスをすることが多いので、この補完はすごく助かっています。

ここでは、texによる数式の例のみを紹介しましたが、plantumlのような言語でもいい感じに補完してくれます。

# まとめ
今回は、「Github Copilotを使用したMarkdownファイルの作成方法」について解説しました。<br>
Github Copilotはあくまでコード生成支援ツールなので、文章作成専用のツールと比べると性能や使いやすさの面で劣るかもしれません。

また、どちらかというと「一から全部文章を書いてもらう」というよりは **「大まかな文章の構成は自分で考え、補助的に文章の生成の手助けをしてもらう」** といった使い方の方が現実的なのかなと思います。

<br>

いずれにせよ

- コードも作成するし、ブログ記事も良く書く

といった人からすると、一石二鳥な使い方が出来ると思うので気になる方は是非お試しください。
[laravel10] ルートパラメータのidがコントローラのモデルとリンクする理由。（暗黙の結合）

今回は、ルーティングに含まれる**ルートパラメータのid** がコントローラアクションで定義した**Eloquentモデル** とリンクする理由をご紹介します！

## 開発環境
- aws Cloud9
- PHP 8.2.15 (cli)
- laravel/framework                     v10.45.1 The Laravel Framework
- javascript
- mariadb105-server-10.5.23-1.amzn2023.0.1.x86_64
- cloudinary-labs/cloudinary-laravel    2.0.3    A Laravel Cloudinary Package

## 前提
- 今回、私はルーティングにルートパラメータで `/profile/{user}` と記述していました。そして、`~/profile/1` というリンクにアクセスした際、コントローラ側でモデルを特定し、その特定のモデルから情報を取得していました。
- しかし、なぜコントローラアクションでインスタンス化するモデルが特定できるのかが分かりませんでした。（`~/profile/1`の"1"は**user_id** を表しています。）
## 課題

ルーティングの記述
```php
Route::middleware('auth')->group(function () {
    # /{user}の部分
    Route::get('/profile/{user}', [ProfileController::class, 'profileShow'])->name('profile.show');
});
```
コントローラの記述
```php
# (User $user)の部分
public function profileShow(User $user)
{
    return view('profile.show')->with(['user' => $user ]);
}
```
## 説明
理由は単純で、**暗黙の結合**が発生していたからです。
以下は、川瀬さんの個人運営による日本語ドキュメントです。目次に暗黙の結合とあるので簡単にそこへ飛べます。

https://readouble.com/laravel/10.x/ja/routing.html#implicit-binding

- 続いて、**暗黙の結合**について説明します。

暗黙の結合（Implicit Binding）は、Laravelの機能の1つで、ルートやコントローラのアクションでモデルを定義することで、**自動的に対応する**リクエストのURIセグメントに基づいて**モデルを取得する仕組み**です。

具体的には、ルートやコントローラのアクションで、型宣言された**変数名**が**URIセグメントの名前と一致**し、その型宣言された変数がEloquentモデルである場合、**Laravelは自動的に対応するURIセグメントの値を使用して、データベースからモデルインスタンスを取得します。**

例えば、以下のようなルートがあるとします。

```php
use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user->email;
});
```

この場合、`$user` 変数は `App\Models\User` クラスのインスタンスとしてタイプヒントされています。そして、URIの `{user}` セグメントの値に基づいて、Laravelはデータベースから対応するユーザーレコードを取得し、そのユーザーのメールアドレスを返します。

同様に、コントローラのアクションでも同じ機能が利用できます。

```php
use App\Http\Controllers\UserController;
use App\Models\User;

Route::get('/users/{user}', [UserController::class, 'show']);
```

```php
namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    public function show(User $user)
    {
        return view('user.profile', ['user' => $user]);
    }
}
```

ここでは、`$user` 変数が `User` モデルでタイプヒントされており、URIの `{user}` セグメントに基づいて自動的にユーザーレコードが取得され、ビューに渡されます。

暗黙の結合を使用することで、コードがより簡潔で読みやすくなり、データベースからのデータの取得が効率化されます。
- また、`{user}`には自動的にuserモデルの主キーが挿入されます。
## 結論
- 暗黙の結合はlaravelの便利機能で、これを利用することで、より簡潔にデータベースからのデータ取得が実現します！🙌

＊何か間違えなどがございましたらコメント欄にてご連絡いただけると幸いです。
データサイエンス中級者向けおすすめ書籍

データサイエンス関連の中級者向けのおすすめ書籍をします。私が読んで面白かった本であり、今では初心者向けかもしれません。

## ニューラルネットワーク
* [ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://amzn.to/3U4IhbX)
基本からPythonのみを使って丁寧に説明してあります。計算グラフでニューラルネットワークの順伝搬・逆伝搬を説明しており、非常に面白かったです。
計算グラフについては、スタンフォード大学の[コンピュータビジョン機械学習](https://cs231n.stanford.edu/)の講座を参照してください。この講座が非常に内容の濃いコンテンツで勉強になります。こんな内容が公開されているなんてアメリカの教育の層の厚さに驚きです。

## 生成AI
* [Generative Deep Learning: Teaching Machines to Paint, Write, Compose, and Play by David Foster](https://amzn.to/3JiQHYd)
Jupyterでのプログラミングですが、生成AI関連のアルゴリズムを学べます。コードがウェブ上にあるので、ダウンロードしてコードを実行しながら、本書を参考にして学ぶことができます。
日本語版があったと思ったのですが、見つかりませんでした。ご存じでしたら、教えてください。

## 強化学習
* [ゼロから作るDeep Learning ❹ ―強化学習編 by 斎藤 康毅](https://amzn.to/4d3QeXh)
強化学習の理論についても丁寧で分かりやすいです。

* [Reinforcement Learning, second edition: An Introduction by Richard S. Sutton & Andrew G. Barto](https://amzn.to/3xzmC3M)
言わずと知れた強化学習の古典。これ一冊で十分かなという感じです。これは第２版ですが、個人的には第１版の方がよかったなと思います。
* [強化学習（第2版）by Richard S. Sutton & Andrew G. Barto](https://amzn.to/3W33HbP)
もちろん日本語版もあります。
hyprdotsを立ててみた

# archlinuxについて
archlinuxはLinuxディストリビューションの一つでかなり自由な規制に公開されています。
開発理念がシンプリティということもあり、必要最低限のものしか入っていません。逆にいうなら、改造をしやすいOSとなっています。
今回はカッコイイGUIをhyprdotsというコンポジタをかり作成していきたいと思います。
## コンポジタとは？
軽くコンポジタの説明をしてからインストールについて書きたいと思います。
コンポジタというのは、出力のグラフィックをGPUに渡す機能のことですが、私もよく理解していないので「GUIを起動させるために必要なんだな！」程度で考えましょう！
## archlinuxのインストール
archlinux公式からisoファイルをインストールしましょう
[archlinuxのiso](https://archlinux.org/download/, "archlinux")
次にRufusなどを使ってBIOSから起動できるようにします。
[Rufus](https://www.gigafree.net/system/os/Rufus.htm,"rufus")
それでは起動します。

## セットアップ
起動したら一番上を選択することでコンソールが現れます。
wifiを使いたい方はこちらのコマンドを試してください。
```
iwctl

stasion wlan0 connect [your_wifiname]
password:

exit
```
今回はセットアップを簡単にしてくれるコマンドがあるのでそれを使います。
```
archinstall
```
設定が以下のように変更しました
Mirrors > Mirror region > Japan

disk configuration > Use a best effort~ > [your_disk] > ext4 > yes

Boot loader > Grub

User account > Add a user > [your_username] > [your_pass] > yes > confirm and exit

Profile > Type > Desktop > Hyprland > polkit

Audio > Pipewire

Addisional packages > nvim firefox git

network configure > Use NetworkManager

Timezone > Japan

install > [てきとうにキーを押す]

これでhyprlandのインストールが終わりました。

# Hyprlandセットアップ
起動時archlinuxを選択してください。

hyprdotsのファイルをインストールします。
ログインをしてください。
Windows key + Q でコンソールを出してください。
```
nvim .config/hypr/hyprland.conf
```
上から13行目にあるautogeneratedをコメントアウトしてください。
そしてmonitorの下に次のコードを追加します。
```
monitor=,1680x1050@60, 0x0, 1
```
## 次にhyprdotsをインストールします。
コンソールから
```
cd
git clone https://github.com/prasanthrangan/hyprdots.git

cd hyprdots-main
cd Scripts

./install.sh
```
これでインストールが始まります。

**注意**
セレクト時には番号で答えてください。
n以外の選択はyで答えます。

```
select shell : zsh
select aur helper : paru

repository extra : 1

# repository AURは3つ聞かれますが3つとも1です。
repository AUR : 1
```
rebootしたら終了です。
お疲れ様でした。


参考資料
https://www.youtube.com/watch?v=otwnzco0HmM
Autoware Universeのチュートリアルがすごかった その1

# はじめに
Autoware Universeのチュートリアルをやってみると結構かんたんにセットアップできたので備忘録を残します

# やり方
Autoware Universeのチュートリアルは以下にあります。
https://autowarefoundation.github.io/autoware-documentation/main/installation/

Tier4がおすすめしているAutowareの使用方法として2パターン用意されているみたいです。
1. Docker installation
2. Source installation
ぱぱっと試してみたい方はDockerで行ったほうが早くできると思います。
今回はubuntuに実環境を用意しているのでSoource installactionの方をやっていきます。

## 環境構築
### istallation
Source installationを実際にやるだけです。
https://autowarefoundation.github.io/autoware-documentation/main/installation/autoware/source-installation/

まずgitからautowareのリポジトリをクローンしてきます。
```
git clone https://github.com/autowarefoundation/autoware.git
cd autoware
```
クローンしたらautowareに必要なほぼすべてのソフトウェアをインストールすることができるシェルスクリプトをが用意医されているので実行します。
```
/setup-dev-env.sh
```
めっちゃ時間がかかるので待ちます。終わったらインストールは完了です。

### ワークスペースの作成
ROS(ROS2)で作業するためのスペースであるワークスペースを作成します。こちらもSource installationに沿って行うだけです。
vcs toolというC++の依存関係をうまくやってくれるソフトでワークスペースを構築します。
```
cd autoware
mkdir src
vcs import src < autoware.repos
```
次にROSの依存パッケージのダウンロードを行います。
```
source /opt/ros/humble/setup.bash
rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO
```
最後にワークスペースをビルドして完了です。
```
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
```

# 終わりに
これで環境はできたので次はチュートリアルを勧めていきましょう！
https://autowarefoundation.github.io/autoware-documentation/main/tutorials/ad-hoc-simulation/planning-simulation/
JVM - ガベージコレクション(GC)の概要

ガベージコレクション（GC）は、JVMがメモリ管理を効率よく行うための重要な機能です。このブログでは、GCの基本的な概念とその動作の仕組みについて解説します。

## ガベージとは

ガベージとは、プログラムが確保したメモリのうち、もはやプログラムによって参照されないメモリ領域のことを指します。

これはオブジェクトやデータ構造が不要になった、つまりそのデータに対するすべての参照がプログラム内から失われた状態を意味します。

ガベージが発生する主な原因は以下の通りです：

* **オブジェクトのスコープ外移動**： オブジェクトが定義されたスコープを外れたとき、例えばローカル変数が関数の実行終了とともにスコープ外となる場合。
* **参照の上書き**： あるオブジェクトへの参照が新しいオブジェクトへと変更された場合、古いオブジェクトはもはや参照されなくなります。
* **明示的な参照削除**： プログラムが意図的にオブジェクトへの参照を削除することで、ガベージとしてマークされる場合。

ガベージがメモリ内に蓄積すると、複数の問題が発生する可能性があります：

* **メモリリーク**： 不要なメモリが適切に解放されずに残ると、プログラムが消費するメモリ量が徐々に増加します。これは「メモリリーク」と呼ばれ、長期間実行されるプログラムにおいて特に問題となります。
* **システムのパフォーマンス低下**： 使用可能なメモリが不足すると、システムは新たなメモリの確保に苦労し、全体的なパフォーマンスが低下することがあります。

## ガベージコレクション（GC）とは

ガベージコレクションとは、プログラムが動的に確保したメモリ領域のうち、もはや使用されていない部分（ガベージ）を自動的に検出し、解放するシステムのことを指します。

これにより、開発者はメモリの解放忘れによるリークを心配することなく、アプリケーションの開発に集中することができます。

## ガベージコレクションの必要性

プログラム内でメモリは継続的に確保され、それによって計算やデータ保持が行われます。

プログラムが大きく複雑になるにつれて、手動でメモリを管理することは非常に困難になります。未使用のメモリが適切に解放されない場合、メモリリークが発生し、最終的にはアプリケーションのパフォーマンス低下やクラッシュを引き起こす可能性があります。

ガベージコレクションにより、これらのリスクを自動的に管理し、システムの健全性を保つことができます。

## ガベージコレクションの動作原理

一般的なGCのプロセスは、「マーク・アンド・スイープ」という手法を用います。このプロセスは以下のステップで構成されます：

* **マーキング**： システムは生きているオブジェクト、つまりプログラムによって引き続き使用されているオブジェクトを特定し、マークします。
* **スイーピング**： マークされていないオブジェクト、すなわちもはや参照されていないオブジェクトをメモリから解放します。

このプロセスは、プログラムの実行中に定期的に自動的に行われ、メモリの効率的な使用を保証します。

## GCのパフォーマンスと最適化

GCはメモリを効率的に管理する一方で、GCプロセス自体がCPUリソースを消費します。そのため、不必要にGCが頻繁に発生するとアプリケーションのパフォーマンスに悪影響を及ぼすことがあります。

適切なヒープサイズの設定やGCアルゴリズムの選択により、GCのパフォーマンスを最適化することが可能です。

## 最後に

ガベージコレクションは、Javaプログラムが安定して効率よく動作するために不可欠な機能です。適切な理解と管理により、システム全体のパフォーマンスを向上させることができます。

開発者は、アプリケーションの要件に応じて最適なGC戦略を選択することが重要です。

## 参考情報

* [Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html)
.NET CLI でタブ補完をする


タイトル通り、 .NET CLI のタブ補完を有効にする方法について記載します。

なお、 Bash 以外は試していないので、出来るかわかりません。
(ほぼ公式資料そのままの情報なので出来ると思いますが。)

## 設定方法
### PowerShell
`$PROFILE` のプロファイルを作成/編集し、以下のコードを追加します。

```powershell
# PowerShell parameter completion shim for the dotnet CLI
Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock {
    param($wordToComplete, $commandAst, $cursorPosition)
        dotnet complete --position $cursorPosition "$commandAst" | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
}
```

### Bash
`.bashrc` に以下のコードを追加します。

```bash
# bash parameter completion for the dotnet CLI

function _dotnet_bash_complete()
{
  local cur="${COMP_WORDS[COMP_CWORD]}" IFS=$'\n' # On Windows you may need to use use IFS=$'\r\n'
  local candidates

  read -d '' -ra candidates < <(dotnet complete --position "${COMP_POINT}" "${COMP_LINE}" 2>/dev/null)

  read -d '' -ra COMPREPLY < <(compgen -W "${candidates[*]:-}" -- "$cur")
}

complete -f -F _dotnet_bash_complete dotnet
```

### zsh
`.zshrc` に以下のコードを追加します。

```zsh
# zsh parameter completion for the dotnet CLI

_dotnet_zsh_complete()
{
  local completions=("$(dotnet complete "$words")")

  # If the completion list is empty, just continue with filename selection
  if [ -z "$completions" ]
  then
    _arguments '*::arguments: _normal'
    return
  fi

  # This is not a variable assignment, don't remove spaces!
  _values = "${(ps:\n:)completions}"
}

compdef _dotnet_zsh_complete dotnet
```

### fish
`config.fish` に以下のコードを追加します。

```config.fish
complete -f -c dotnet -a "(dotnet complete (commandline -cp))"
```

### nushell
`config.nu` に以下のコードを追加します。

```config.nu
let external_completer = { |spans|
    {
        dotnet: { ||
            dotnet complete (
                $spans | skip 1 | str join " "
            ) | lines
        }
    } | get $spans.0 | each { || do $in }
}
```

次に、 `config` の `completions` 内に、先ほど定義した `external_computer` を `external` を追加します。

```config.nu
let-env config = {
    # your options here
    completions: {
        # your options here
        external: {
            # your options here
            completer: $external_completer # add it here
        }
    }
}
```

## 使用感
通常 (`ls` など)の補完と比べて遅延を感じるので、微妙に使い辛いです。
~~というか、 `ls` などは長いファイルで補完が便利ですが、 .NET CLI ではそのような機会があんまりないので、ぶっちゃけ補完がなくてもいいです。~~
と思ったのですが、よく考えてみたら `.sln` ファイルに `.csproj` を追加するときなど、長い文字を使うこともありました。
設定しておくと便利かも。

---
### 参考
- https://learn.microsoft.com/ja-jp/dotnet/core/tools/enable-tab-autocomplete
mapは配列を返すはずなのにReactでコンポーネントを生成できることを不思議に思った

## はじめに
Reactでは、配列からコンポーネントを生成する際にしばしばmap()が使用されます。

https://ja.react.dev/learn/rendering-lists

しかし、mapは配列を返すはずです。気持ち的には、forEachをつかってループごとにコンポーネントをreturnする方が直感に合っているような気がします。（それだと動かないですが）

もちろん「配列からコンポーネントをレンダーする」ことにおいてmap()を使用することに毎度疑問を抱きながら使っているわけではないのですが、なんとか納得したく色々遊んでみました。

※「配列をかえすんだから当たり前では？」と思った方は以降の内容を見てもよくわからないかもしれません、、、僕は当たり前には思えませんでした...

## おさらい - map()とは -
map()は配列に対して使用できるメソッドで、配列の各要素を一つずつ取り出して関数を適用させ、その結果算出されたものを**配列**として返します。

```javascript
const array = [1,2,3,4,5]

const doubleArray = array.map(num => num * 2)

console.log(doubleArray)
// [ 2, 4, 6, 8, 10 ]
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

## 不思議に思った点

「はじめに」にも記載しましたが、Reactではリストのレンダーにしばしばmap()が用いられます。
```react
function App() {
  const userArray =  [
    {
      id: 1,
      name: 'ange'
    },{
      id: 2,
      name: 'lize'
    },{
      id: 3,
      name: 'inui'
    }
  ]

  return (
    <div>
      {
        userArray.map(user => (
          <div>{user.id} - {user.name}</div>
        ))
      }
    </div>
    {/* 
    　　このようになることを期待するし、実際にそうなる。
      <div>
        <div>1 - ange</div>
        <div>2 - lize</div>
        <div>3 - inui</div>
      </div>
     */}

  )
}

```

「map()でリストを一つずつとりだして、それを用いてdivが生成されるんでしょ」、では個人的にはしっくりきません。なぜならmap()は**配列**を返すので、以下のようになってしまうはずです。

```react
    <div>
      {
        // 配列が返るのでこうなるはず
        [
          <div>1 - ange</div>,
          <div>2 - lize</div>,
          <div>3 - inui</div>
        ]
      }
    </div>
```
すなわち、map()で処理する→リストが生成される と言う説明では少し飛躍しているように感じていました。

## 波括弧{}に配列を含めた時の挙動
しつこいですがmap()は配列を返すので、波括弧に配列を入れたときの挙動について調べたくなりました。
結論から言うとさきほど書いたコードの「配列が返るのでこうなるはず」の記述でもしっかり描画されます。

```react
function App() {

  return (
    <div>
      {
        // JSXを含む配列を記述しても描画される
        [ <div>1 - ange</div>, <div>2 - lize</div>, <div>3 - inui</div> ]
      }
{/* 
  <div>
    <div>1 - ange</div>
    <div>2 - lize</div>
    <div>3 - inui</div>
  </div>
*/}
    </div>
  )
}
```

文字列を含む配列をいれると、それらが1行ずつ描画されます
```react
function App() {

  return (
    <div>
      {
        ['アンジュ','リゼ','戌亥']
      }
    </div>
{/* 
    <div>
    アンジュ
    リゼ
    戌亥
    </div>
*/}
  )
}
```

ちなみに配列の代わりにオブジェクトを入れてみると怒られます
```react
function App() {

  return (
    <div>
      {
        {id: 1, name: 'ange'}
      }
    </div>
  // Uncaught Error: Objects are not valid as a React child
  //  (found: object with keys {id, name}). If you meant to render 
  //  a collection of children, use an array instead.

  )
}
```
配列を使えって書いてますね

波括弧に配列を入れた時の挙動が確認できたので、map()でコンポーネントが生成されるのも腑に落ちたのでした。

### 追記

https://qiita.com/yokajima/items/31238c7f8efd8e82e4b7

関連記事にこちらの記事がありました。
僕と同じモヤモヤが出発点になってます。内部処理をのぞいているのでより詳しく把握できます。
discord.js 身内鯖用スパム対策したい

## 事の経緯。

鯖内メンバーがパスワード流失（詳細は分かりません）しました。
鯖内すべてのチャンネルにリンクが張られるスパムが発生したので、今宵対策ですが、要件定義などがうまくいっていません。

投稿自体は初めてです。見にくいかと思いますがご了承お願いします。
更新の可能性があります。


```js
const spamCount = 4 ;
const spamCheck = [];

client.on('message', async message => {
const spamInterval = 3000; //連投の間隔

if (message.mentions.everyone && message.author.bot == false ){ {
   spamCheck.push(message.author.id) 
   setTimeout(spamCheck.shift, spamInterval)
  

    if (spamCheck.filter(n => n === message.author.id).length >= spamCount) {
     
      const userToKick = message.author;
      client.users.get(userToKick.id).send('スパム検出されたのでキックの処理になりました。');
      

      // ユーザーをキックします
   try {
      await message.guild.member(userToKick).kick();
      message.channel.send(`スパムの疑いがあるため、${userToKick.username} をサーバーからキックしました。`);
    } catch (error) {
      console.error(error);
      message.channel.send('ユーザーをキックするのに失敗しました。');
    }
  

      spamCheck = [];

  }

  
   }
  
});

```

上から見ていきます。


# スパムの簡単な要件定義。
* 今回と類似のスパムを止めるだけ
* 「3sの間に4回eveyoneメンションでスパム」とします
* everyoneした&& !botで
* * 送信者のidを配列にpush
* * setTimeout(処理,開始時間)で
```js
const spamCount = 4 ;
const spamCheck = [];

client.on('message', async message => {
const spamInterval = 3000;


if (message.mentions.everyone && message.author.bot == false ){ {
   spamCheck.push(message.author.id) 
   setTimeout(spamCheck.shift, spamInterval)
  
```
* spamCheck配列をフィルタリング
* message.author.idと一致する要素だけを取出
* * 特定のユーザーがこれまでに何回メッセージを送信したか確認
* * （.length >= spamCount）spamCount以上であるか。今回は（3sに）4回
* メッセージ送信者のidを格納しDMにメッセージを送信
```js

 if (spamcheck.filter(n => n === message.author.id).length >= spamCount) {
     
      const userToKick = message.author;
      client.users.get(userToKick.id).send('スパム検出されたのでキックの処理になりました。');

```
* 送信者をkick
* 鯖内でのメッセージ（ここは特定のチャンネルにsendでもいいと思う。応急処置で今はこの記述）
* エラーの場合の処理。botの権限を確認してね
* id持っておくのは嫌なので初期化

```js

 // ユーザーをキックします
   try {
      await message.guild.member(userToKick).kick();
      message.channel.send(`スパムの疑いがあるため、${userToKick.username} をサーバーからキックしました。`);
    } catch (error) {
      console.error(error);
      message.channel.send('ユーザーをキックするのに失敗しました。');
    }
  
      spamCheck = [];

  }  
}
  
});
      
```
### 優先度高め課題
* スパム投稿を消す。
* 誤kickの場合のどうしよう
* 鯖でkickの基準を説明していいのか。（投稿してるだろ）
* everyoneがないと対策ができない
* * テスト環境の都合でイメージついていない
* 休日もコードを書くとなぜか体調を崩す


### 優先度低すぎ課題
* hereや個別の人へのメンションでの嫌がらせは対応しにくい。
* * ここに関しては招待側の自助努力と信頼でと考えている。

誰かの助けになれば幸いです。
またスパム要件定義等コメント待っています

◆参考
<a href="https://scrapbox.io/discordjs-japan/%E3%82%B9%E3%83%91%E3%83%A0%E5%AF%BE%E7%AD%96%E3%82%92%E3%81%99%E3%82%8B%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">スパム対策をするサンプル</a>
某氏が考えたプログラミング言語？spinozaを改造して遊んでみる


# spinozaとは

これを見てください。

https://web.archive.org/web/20150123003120/https://qiita.com/kenokabe/items/98f4efac4029f0b2b419

# 改造する

本家のコードではうまく動かないことがあったので自分好みに改造しました。

```js:spinoza.js
const spinoza = {};

(function() {
    function create_$(ary) {
        function _$(arg) {
            if (typeof arg === 'function') {
                ary = ary.map(e => arg(e));
                return create_$(ary);
            }
            ary.push(arg);
            return create_$(ary);
        };
        _$.ary = ary;
        return _$;
    }

    spinoza.$ = function $(arg) {
        if (
            typeof arg === 'function' &&
            arg.name === '_$' || arg.name === '_$$' ||
            arg.name === '$' || arg.name === '$$'
        ) {
            return arg.ary ? create_$(arg.ary) : create_$([]);
        }
        const _$ = create_$([]);
        return _$(arg);
    };

    function create_$$(ary) {
        function _$$(arg) {
            if (typeof arg === 'function') {
                ary = arg(ary);
                return create_$$(ary);
            }
            ary.push(arg);
            return create_$$(ary);
        };
        _$$.ary = ary;
        return _$$;
    }
    
    spinoza.$$ = function $$(arg) {
        if (
            typeof arg === 'function' &&
            arg.name === '_$' || arg.name === '_$$' ||
            arg.name === '$' || arg.name === '$$'
        ) {
            return arg.ary ? create_$$(arg.ary) : create_$$([]);
        }
        const _$$ = create_$$([]);
        return _$$(arg);
    }

    spinoza.out = function(arg) {
        console.log(arg);
        return arg;
    }
})();

if (typeof module !== 'undefined' && module.exports) {
    module.exports = spinoza;
}
```

基本的には本家と同じですが
\\$は引数の関数に配列の要素を渡す
\\$\\$は引数の関数に配列自体を渡す
という仕様に変えました。

# サンプル

```js:sample.js
const spinoza = require('./spinoza');
const $ = spinoza.$;
const $$ = spinoza.$$;
const out = spinoza.out;

$$(1)(out);       // [ 1 ]
$$(1)(2)(out)     // [ 1, 2 ]
$$(1)(2)(3)(out); // [ 1, 2, 3 ]

function plus10(num) {
    return num + 10;
}

$$($(1)(2)(3)(plus10))(out); // [ 11, 12, 13 ]

$$('hello')(out)(out);
// [ 'hello' ]
// [ 'hello' ]
```

# FizzBuzz

```js:fizzbuzz.js
const spinoza = require('./spinoza');
const $ = spinoza.$;
const $$ = spinoza.$$;
const out = spinoza.out;

// 中身がJSなので普通にJSでFizzBuzzを書けばいいが、
// それだとつまらないのでspinoza君をなるべく活躍させる

function createArray(ary) {
    const [start, end] = ary;
    function _createArray(ary, num = start) {
        if (num > end) {
            return ary;
        }
        ary.push(num);
        return _createArray(ary, ++num);
    }
    return _createArray([], start);
}

function fizzbuzz(num) {
    if (num % 15 === 0) {
        return 'fizzbuzz';
    }
    else if (num % 3 === 0) {
        return 'fizz';
    }
    else if (num % 5 === 0) {
        return 'buzz';
    }
    else {
        return num;
    }
}

$($$(1)(100)(createArray))(fizzbuzz)(out);
```

# 感想

逆ポーランド記法みたいだなーって思った。（小並感）
現状ほぼJSなところが残念さん。

逐次は分かるけど、分岐、反復はどうやるのだろう。

話がずれるけど、やっぱLispは面白かったなあ。
特にかー&くだーは素晴らしくて、
これのおかげで再帰処理が書きやすかったんだなあ。と再度体感できた。
Lispはマトリョーシカみたいに全体がリストなのが面白いんだよなあ。
kindleの読み上げがアシストリーダーに変更になり、画面OFFにすると止まってしまう

## 通勤中にkindleの読み上げを聴いていたが、急にできなくなった
　※ひとまず自身の問題としては、最低限は解決といったところです。
 
　通勤時にkindleの読み上げを使って読書を楽しんでいたのですが、最近急に「アシストリーダー」なるものが表示され、画面OFFと共に音声が停止してしまう状態になったので困っていました。
　初期化してみたり、「kindle　アシストリーダー　戻す」とかで調べたりでは解決策が出てこなかったため半ばあきらめていたのですが（ググり方がなってないとかAIへの尋ね方がよろしくないとかはひとまず置いといて）、手元のFire HD（第８世代）でなら通勤中に画面OFFで聞き続けられそうな方法を見つけたのでメモを兼ねて共有します。Fire HD plus（第12世代）では同じ設定でもダメでした。しょんぼり。(´･ω･`)
## アプリをピン止めする
　※手元の2台のうち、うまくいったのはFire HD（第８世代）のみです。
　　また、Fire HD（第８世代）であれば動作を保証するものでもありません…。
  
　・kindleホーム画面の設定（歯車）
　　→セキュリティとプライバシー
　　→アプリを固定 をONにする。
　　（タッチを無効にする はOFFのまま）
　・タスクの切り替え画面（画面下の■）を押してkindleを表示
　・画面上部のkindleのアイコンの下にあるｖの字（下に開けそう）を押す
　　→ピン止め という項目があるので押す
　　→アプリは固定されています と表示されるのでOK
　　（□固定したアプリでの～は未チェックでOK）
　・アシストリーダーで音声を再生する
　・画面OFF
　・アプリのピン止めをもとに戻すには、画面下の◀と■を同時に押す（1秒位）。

　これでHD8(第8世代)でなら画面OFFでも読み上げが途切れないようです。(試してダメだったらすまぬ…すまぬ…）
　HDplus(第12世代)ではやはり画面OFFで読み上げが止まってしまいます。読み上げ聴けるから本買ってるのに…残念。

　ただ、今後のアップデート等で読み上げが止まるようになったり、読み上げが画面OFF状態でどの程度続くのかは不透明です。明日までにアップデートで不可に、なんて可能性もあります。ここ数日あまり聞けなかったので（画面ONのままタッチ操作しないようがんばって持ち歩く…とかやってた。すぐ止まる）、もう5分とかでもいい。通勤中に聴きたいよー！

## 最後に
　読んでくれてありがとうございます。最近、通勤中は音楽ばかり聴いてたけど、明日はすこし読み上げが聴けそうです。家の中でのテストでは、ひとまず良好（10分～）。また進展があったら書くかもです。それでは～！(･ω･)ノシ
Windows 10 アップデート後にタッチスクリーンが機能しない問題を解決する方法

Windows 10 PC でタッチスクリーンが機能しない場合は、この記事で共有されているさまざまなテクニックを実装してください。

Microsoft Surface は Windows 10 と組み合わせた最高のデバイスですが、Windows 10 タブレット デバイスはこれだけではありません。タッチスクリーンを備えたコンピューターがより安価になっているため、現在購入する新しいラップトップにはタッチスクリーンが搭載されている可能性があります。いつものように、かつて専用だったギアが限界数に達すると、互換性と信頼性の問題が発生します。 Windows 10 では、タッチスクリーンがまったく機能しない、またはまったく反応しないという問題が典型的です。そのため、代わりにキーボードとマウスを使用する必要があります。

UEFI と BIOS はどの OS でも動作するため、Windows 10 のタッチ スクリーンをテストするために使用できます。テストを終了するには、デバイスを UEFI/BIOS メニューに入れて、タブレットがインターフェイスで動作するかどうかを確認する必要があります。モニターまたは<a href="https://blog.bit-guardian.com/touch-screen-driver-windows/">Windows 10 のタッチ スクリーン ドライバーに</a>問題がある可能性があります タッチスクリーンが使用できるかどうか。したがって、ここではこの問題を解決し、タッチスクリーンを再び動作させるためのさまざまな解決策を提供します。

Windows 10 PCでタッチスクリーンが動作しないエラーを修正するためのさまざまなテクニック
Windows デバイスのタッチスクリーンの問題を解決するために実行できる修正のリストを次に示します。

方法 1: タッチスクリーンを掃除してコンピュータを再起動する
最初のステップとして、画面が汚れていないかどうかを確認します。時間が経つにつれて、ディスプレイのセンサーは油分やゴミが蓄積するため、感度が低下します。マイクロファイバークロスを使用して、画面の汚れや汚れを取り除くだけです。非常に頑固な汚れには、低刺激性で電子機器に安全な洗剤を使用してください。画面に洗剤や消毒用アルコールを付けると、画面の損傷がさらに大きくなります。あるいは、酢と蒸留水を同量混ぜたものを入れたスプレーボトルを使って拭き取ることもできます。混合物をタオルにスプレーするだけです。

見下したような言い方に思えるかもしれませんが、スリープ機能とスリープ解除機能が改善され、バッテリー寿命が長くなったことで、スマートフォンの電源をオフにしたときの電力の無駄が少なくなる可能性があります。単純な再起動だけで、コンピュータのタッチスクリーン機能が復元される場合があります。デバッグにリソースを費やす前に、これを試して問題が解決するかどうかを確認してください。

方法 2: タッチスクリーン ドライバーを更新する
多くの人は、Windows ドライバーを最新の状態に保つことに気づいていません。このため、彼らはこのような問題に直面することになります。通常、Windows オペレーティング システムを更新すると、それに伴ってほぼすべてのデバイス ドライバーも自動的に更新されます。ただし、一部のドライバーが破損したり欠落したりする場合があります。このような場合は、自分で新しいドライバーを更新またはダウンロードする必要があります。以下では、タッチスクリーンドライバーを更新する最良の方法を共有します。

ステップ 1: タスクバーにある Windows アイコンを右クリックして、[スタート] メニューのコンテキスト リストを開きます。

ステップ 2: リストからデバイス マネージャー ツールをクリックして選択します。

ステップ 3: [デバイス マネージャー] ウィンドウで、[ヒューマン インターフェイス デバイス] オプションを探してクリックします。

ステップ4: 次に、タッチスクリーンドライバーを右クリックし、コンテキストメニューからドライバーの更新オプションを選択します。

ステップ5: 新しいウィンドウが表示されるので、「ドライバーを自動的に検索する」オプションを選択します。

ステップ 6: しばらく待ってから、セットアップ ウィザード ウィンドウに表示される指示に従って、新しいドライバーをインストールします。

ステップ 7: ドライバーがインストールされたら、コンピューターを再起動します。

方法 3: タッチスクリーンのトラブルシューティング ツールを実行する
Windows トラブルシューティング ツールは、ユーザーがデバイスの使用中に発生する可能性のある問題を解決するのに役立つ便利な組み込みツールです。使い方は非常に簡単ですが、専門知識なしで使用すると PC が故障する可能性があります。したがって、プロセス全体を説明する以下の指示に注意深く従ってください。

ステップ 1: タスクバーにある Windows アイコンをクリックして、[スタート] メニューを開きます。

ステップ 2: その中で「設定」を検索し、Enter キーを押します。

ステップ 3: [設定] ウィンドウで、[更新とセキュリティ] オプションを選択します。

ステップ4: 左側のペインにある「トラブルシューティング」タブをクリックします。次に、右側のペインにある「追加のトラブルシューティング」オプションをクリックします。

ステップ5: 次に、「ハードウェアとデバイス」セクションをクリックして展開します。

ステップ6: 次に、「トラブルシューティングの実行」ボタンをクリックしてプロセスを開始します。

ステップ 7: PC にこの問題の原因となっている要因を探してもらいます。次に、ウィザード ウィンドウの手順に従って問題を解決します。

ステップ 8: トラブルシューティングが完了したら、コンピューターを再起動します。

結論
タッチスクリーンが動作しない問題を解決するためのさまざまなテクニックがお役に立てば幸いです。問題が解決しない場合は、モニターの製造元にお問い合わせください。あるいは、PC を近くの修理店に持ち込んで専門家のサポートを受けてください。それ以外に、このブログ投稿に関するご意見を以下のコメント欄で共有してください。
英語論文高速読み込み術

# はじめに

こんにちは。
ジョジョ好きなXRクリエイターの [もふるね](https://twitter.com/mofurune_k) です。

最近、１ヶ月ほど、NAISTのCAREラボへインターンに行ってきました。
インターン中に、学生たちから「英語論文高速読み込み術」を伝授されました。
その術を活用して、すごく多くの論文を読みました。
今回は、その術を備忘録として書き記します。

# １．論文検索

- SciSpace（ChatGPT4拡張機能）

https://chat.openai.com/g/g-NgAcklHd8-scispace

- Elicit（Webサイト）

https://elicit.com/

- Perplexity（Webサイト）

https://www.perplexity.ai/

これらは、検索欄にテーマや単語を入力すると関連した論文を教えてくれます。


# ２．論文を読む

- Paper Interpreter（ChatGPT4拡張機能）

https://chat.openai.com/g/g-hxDOCBQrs-paper-interpreter-japanese

論文のpdfを入力すると日本語で解説してくれます。

- DeepL（Chrome拡張機能）

https://www.deepl.com/ja/chrome-extension

選択した文章を日本語に翻訳してくれます。


# ３．論文を保存

- Zotero（ソフトウェア）

https://www.zotero.org/

論文を管理できます。
さらに、論文を書くときに、Wordと連携して簡単に引用できます。


# まとめ

ChatGPTは惜しげも無く課金すべし
BigQueryとSpreadSheetを連携してみた

# この記事でやってみたこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/d546121a-d422-c877-37ee-51cf44553b67.png)

# こんな状況におすすめ
1. インプットがSpreadSheet、アウトプット（閲覧、分析など）もSpreadSheet
1. SpreadSheetでのデータ加工の限界にぶち当たっている（10,000行超えると関数の挙動が遅くなったりします）
1. SpreadSheetだと実現できない、複雑すぎるけどSQLだとサクッと加工できる

# 手順
## SpreadSheetの設定
まずはSpreadSheetにデータを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/b7fccaa6-140e-3cd8-c0c2-ce26089f102c.png)

## BigQueryへのインポート設定
BigQueryのコンソールを表示して、追加ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/11053084-4b9b-fff4-5c79-b9966d9e39e8.png)

データソースを選択する画面が出てくるので、「Google ドライブ」を選択します。

テーブルを選択するためのコンソールが出てくるので、必要な情報を埋めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/72a2cfd5-9e77-6290-c48b-ab9c2e2ac7a5.png)

### ソース
- ドライブのURLを選択：SpreadSheetのURLをそのまま貼り付けます
- ファイル形式：Googleスプレッドシートを選択
- シート範囲：データとして取り込む範囲を、「シート名!範囲」の形式で記載します。SpreadSheetのセル参照方法と同じです

### データセット
- データセット：送信先のデータセットを記載します
- テーブル：送信先のテーブル名です
- テーブルタイプ：外部テーブル以外選択できません

### スキーマ
スキーマは、自動検出と自分で作成する2通りがあります。

#### 自動検出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/7c1b5e51-b215-9a5b-a7d4-892cdb210ff2.png)
データのヘッダ行をそのままカラム名として取り込んでくれます。
ポイントとしては、詳細オプションの「スキップするヘッダー行」にヘッダ行数（ここでは1）をいれることで、ヘッダを読み取ってくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/314171d9-cb45-76a9-aa97-0f7b909e54bc.png)
自動検出で作成したテーブルがこちら。
SpreadSheetのヘッダ行をちゃんと絡むとして読み取ってくれています。
また、データ種類についても、INTEGERとSTRINGを判別してくれています。

#### 手動生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/9b62c736-157a-f4e9-421f-ee2583fce0a8.png)
GUIでポチポチしてスキーマの生成ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/5a7b6983-e758-0901-e414-68ad10641051.png)
また、カラム数が多いデータを試行錯誤しながら作成する場合は、何度もGUIをポチポチするのは大変なので、「テキストとして編集」を選択するとテキストモードに切り替わります。
最初にGUIでポチポチしたものをテキストモードに切り替えてコピーして退避すると次回以降の生成の時に楽です。

## 設定作成
準備ができたところでいよいよテーブルの作成をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/2bdc2160-a7a0-9fb8-6fd9-2bbb46183ba7.png)
「テーブルを作成」ボタンをポチッと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/a7aa8c09-fd9d-95f0-0cb5-9e2d8ed03fb4.png)

無事作成されたようです。

中身を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/7885a969-e93e-f36f-683e-e7217e064ce7.png)

できてるっぽい。
通常のテーブルであればプレビューをすることができますが、SpreadSheetから作成したテーブルはプレビューができないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/3e821abb-e1d2-4a4f-f5b3-84d94be60d2b.png)

外部データという扱いになっています。

クエリでSelectしてみると中身が見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/53d5f47f-d3ba-f28b-54fb-5012e25e8586.png)

テーブルの作成は無事成功したようです。

# リンクしている！
BigQuery上のテーブルは外部のソース（SpreadSheet）にリンクをしているイメージです。
SpreadSheetを変更するとリアルタイムでテーブルへも反映されます。
データの変更時にいちいちインポートしなおさなくていいのでとても楽です。

一方でSelectをする度にSpreadSheet全体を読みに行くので少し遅いです。

用途としては変更頻度が高く、Selectの速度が多少遅くてもいいような場合には有効だと思います。
10秒で覚える！Amazon CognitoのユーザプールとIDプールの覚え方

**Amazon Cognito** のサービスを利用していると
 「**ユーザプール**」と「**ID（アイデンティティ）プール**」
という言葉が出てきます。

覚えにくいですよね？:sweat_smile:

**Amazon Cognito**はAWSが提供するアプリの認証サービスです。
認証と認可をサービスとして提供します。
* **認証**　本人であることを確かめること。例えば、ログイン時にパスワードを求めるとか。
* **認可**　正しいアクセス権を付与すること。例えば、管理者ユーザなのか一般ユーザなのか。

「　認証　→　認可　」　の流れです。

ここで、"ユーザID"とういう言葉がありますよね？
「　ユーザ　→　ID　」　と考えると・・・

:white_check_mark:　**認証　を担当する　ユーザ（プール）**
　　（ユーザプールではユーザを管理します。）

:white_check_mark:　**認可　を担当する　ID（プール）**
　　（IDプールではアクセス権を管理します。）

って、覚えられます。:smiley:
Steam版モンスターハンターライズのSwitch Proコントローラー設定メモ(2024.4)

Steam版のモンスターハンターライズでNintendo SwitchのProコントローラーを使うための設定メモ(2024.4版)

SwitchのProコントローラーをPCと接続しておく

Steamの設定から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/32634469-ad23-4bcb-579e-c35f3ba182ee.png)

コントローラの設定を開いて
・『Nintendoボタンレイアウトを使用』はOFF
・『Switch ProコントローラのSteam入力を有効にする』はON
に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/ffc9e6d5-ba1d-96db-331e-4785e957c035.png)

ライブラリ -> モンスターハンターライズにあるコントローラ設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/2fe815c8-5609-9bb0-8960-8aede87283ee.png)

レイアウトを編集を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/b7242473-ef1d-e5cc-7cd2-a919569b4ab8.png)

ボタン -> バンパー -> Lボタンにコマンド2を追加して『モードシフト（右ジョイスティック）』に設定する 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/58f8f0e8-63c8-ec82-62b2-014de650ef4d.png)

ジョイスティック -> 右ジョイスティック動作を『ジョイスティックマウス』に設定する
ジョイスティック -> 右ジョイスティック（モードシフト）を追加して動作を『ジョイスティック』に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/173aca99-a362-9d85-d739-c2e8216f037b.png)

ジャイロ -> ジャイロ操作を『マウスとして使用』に設定する
ジャイロ操作の右の歯車アイコンからジャイロの設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/5407122f-d5b2-aef2-b95e-ac3eda73f345.png)

ジャイロ -> ジャイロ有効化ボタンを『左トリガー』に設定する
ジャイロ -> ジャイロ回転軸を『ヨー&ロール連結』に設定する
ジャイロ -> ジャイロ・ヨー比率を『100%』とジャイロ・ロール比率を『-100%』に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302877/9491e899-3bca-ca16-5fad-6661441bae59.png)

Steam側での設定は以上です

次にモンスターハンターライズを起動して、ゲーム中の「スタートメニュー」にある「オプション」＞「GAME SETTING」＞「パッド用ボタンアイコン設定」を『タイプ5』に設定する

後はお好みで決定ボタンをBからAに変えればよいでしょう
$_SERVER

## はじめに

$_SERVERについて整理する。

### $_SERVER

リクエストヘッダー、またはサーバー固有の変数情報


### リクエストヘッダーを取得する

ヘッダー情報とサーバー変数とを区別するために、生のヘッダー名を次の規則で整形したものを格納する。

・ハイフン(-)はアンダースコア(_)に変換
・接頭辞として「HTTP」を付加

例えば、User-Agentヘッダーを取得するには、$_SERVER['HTTP_USER_AGENT']のように記述する。

### レスポンスヘッダーを設定する

header関数を使うことでレスポンスヘッダーを設定できる。
ヘッダーを出力するのでheader関数の前に何か出力があった場合はエラーとなる。

```php
header(string, $header [, bool $replace = true [, int $response_code]]) : void

$header :ヘッダー文字列
$replace :同名のヘッダーが出力済みである場合に置き換えるか
$response_code :HTTP応答ステータス
```
[Laravel10] HTMLファイルで、値の有無で表示を分岐させる便利な方法。（null合体演算子）

今回は、HTMLファイルで、変数の値の有無（値が存在する場合とnullの場合）で表示を分岐させる便利な方法をご紹介します！

## 開発環境
- aws Cloud9
- PHP 8.2.15 (cli)
- laravel/framework                     v10.45.1 The Laravel Framework
- javascript
- mariadb105-server-10.5.23-1.amzn2023.0.1.x86_64
- cloudinary-labs/cloudinary-laravel    2.0.3    A Laravel Cloudinary Package

## 前提
- 今回の処理は、`$post` が存在していれば、以前に入力した値をテキストボックスに表示し、`$post` が存在していなければテキストボックスが空になるというものです。
## 課題

```html
<!-- 修正前の記述 -->

<div class="post-body">
    <!-- 以下、修正部分-->
    @if($post)
        <input type="text" name="post[body]" placeholder="今日はどんな天気でしたか？" value="{{ old('post.body', $post->body) }}" /><br/>
    else
        <input type="text" name="post[body]" placeholder="今日はどんな天気でしたか？" value="" /><br/>
    @endif
</div>
```
## 解決事例

```html
<!-- 修正後の記述 -->

<div class="post-body">
    <!-- 以下、修正部分-->
    <input type="text" name="post[body]" placeholder="今日はどんな天気でしたか？" value="{{ old('post.body', $post->body ?? '') }}" /><br/>
</div>
```
## 説明
- 修正前の記述 

**このコードは、条件に応じて投稿の本文を表示するためのものです。** 
投稿が存在する場合（`$post` 変数が true の場合）、投稿の本文を表示します。投稿が存在しない場合（`$post` 変数が false の場合）、空の投稿フォームを表示します。

投稿フォームの入力欄には、`$post->body` の値が表示されます。また、フォームが再表示された場合に、ユーザーが以前入力した値を保持するために `old()` ヘルパーを使用しています。

**条件文 `@if($post)` が `$post` 変数が定義されていることを確認します。** 
定義されている場合は**投稿の本文** を表示し、定義されていない場合は**空** の入力欄を表示します。
- 修正後の記述

**修正されたコードは、投稿の本文を表示するための入力フォームです。** 
`$post->body` の値がフォームに表示され、フォームが再表示された場合には `old()` ヘルパーを使用して以前の入力値を保持します。

**`$post->body` の代わりに `$post->body ?? ''` を使用しています。**
これにより、`$post` 変数が null の場合でもエラーが発生しないようになります。

### 次に、`「?? ‘’」` についての簡単な説明です。
- **`「?? ‘’」`で値が存在する場合とnullの場合を条件分岐** 

`?? ''`は、PHPにおいて**null合体演算子**（null coalescing operator）として使われます。これは、左側の式がnullであれば**右側の式を返し**、そうでなければ**左側の式を返す**という意味です。具体的には、左側の式がnullまたは未定義の場合に右側の式が返されます。

例えば、以下のようなコードがあります：

```php
$value = null;
$result = $value ?? 'default';
echo $result;

```

この場合、`$value` はnullなので、`$result` には `'default'` が代入され、結果として `'default'` が出力されます。

`''` は空の文字列を表します。したがって、`?? ''` は**左側の値**がnullである場合に空の文字列を返すという意味になります。
## 結論
HTMLファイルで、変数の値の有無（値が存在する場合とnullの場合）で表示を分岐させるときは、if文で条件分岐させるのではなく、`?? ''`を使うことができます！🙌

＊何か間違えなどがございましたらコメント欄にてご連絡ください。
【初心者向け】REST APIについての基本まとめ

## はじめに
WEB技術（主にREST　API）について学んだことをまとめました。

## APIとは
Application Programming Interfaceの略
具体的には：アプリケーション同士の連携や別のアプリケーションへの機能提供など、一方のアプリケーションからもう一方のアプリケーションを呼び出すためのもの

## RESTとは
Representational State Transfarの略
簡単に言うと設計ルール、具体的に言うと６つの制約に準拠した設計思想です。

## 6つの制約とは

RESTの６つの制約とは、以下を指します。
- クライアント/サーバー
    -　クライアントとサーバーにシステムを分離することです。具体的には、クライアントにUI（ユーザーインターフェース）、サーバーに処理、といった感じに分離します。
- キャッシュ制御
    - クライアントとサーバーのやり取り回数を減らすための制御です。クライアントはサーバーからダウンロードしたリソースを一定期間保持します。
- コードオンデマンド
    - プログラムをクライアントにインストールして実行します。JavaScriptだったりクライアント側で実行されるものについてはこのコードオンデマンドに該当します。
- 統一インターフェース
    - インターフェースを固定化します。 URIではリクエストの処理を指定しますが、その際の処理を限定化することを言います。例えば、データの取得時にはGETmethod、更新時にはPUT、POSTのmethod、削除時にはDELETEのmethodなどです。８つのメソッドがありますが、基本は CRUD操作に準拠したメソッドが多く使われます（CRUD操作については後述）。
- 階層化システム
    - Webサーバー、APサーバー、DBサーバーなどそれぞれの役割ごとに独立させることを言います。多くの階層化システムは、それぞれのサーバーを複数台構成にしたものを指します。
- ステートレス
    - サーバーが状態を持たないこと言います。クライアントがサーバーに対してリクエストを投げる際、常に全ての情報を持ってリクエストを投げます。サーバーが前後情報を持たないため、リクエストが冗長になりますが、サーバー側の利点としては前後情報を見る必要がないので単一のやり取りのみを気にしていればよく、シンプルに考えることができます。 

各制約のメリット・デメリットは以下の通りです。
| 制約名 | メリット | デメリット |
|:-:|:-:|:-:|
|クライアント/サーバー| UIと処理を分離することでマルチプラットフォームに対応できる  |  処理をサーバーが受け持つため、サーバー側に障害が起きるとシステムを利用できなくなる |
|キャッシュ制御| クライアントとサーバー間の通信回数が減ることでサーバーの負荷が軽減される  | クライアント側にダウンロードしたリソースが最新のものではなくなる  |
|コードオンデマンド| クライアントの拡張が容易になる |アプリケーションのプロトコル可視性が低下|
|統一インターフェース| メソッドなどが統一されているためシンプルで扱いやすい | HTTP1.1であればメソッドが8個に限定されているため拡張性に欠ける|
|階層化システム| コンポーネント（各サーバーを指す）が独立しているため他のコンポーネントに影響を与えず、進化と再利用がしやすい。  |  複数のコンポーネントを構えているため、ユーザーから見て応答が悪く見える |
|ステートレス| １回のやり取りのみを考慮して設計を行えば良いので何かとシンプルになる |  前後の情報を持たないため、都度のやり取りが冗長になる |

## CRUD操作とは
統一インターフェースで出てきたCRUD操作について説明します。
Create(登録)、Read(読み出し)、Update(更新)、Delete(削除)の操作をまとめた略語です。

それぞれをHTTPmethodに置き換えると

| 操作 | HTTP method |
|:-:|:-:|
| Create  | PUT,　POST  |
| Read  |  GET |
| Update  |  PUT |
| Delete  |  DELETE |

となります。

## URIの設計について
URIの設計についてはシンプルに、外部からの呼び出しでもURIがわかるようにします。

リソースmovie（ここでは映画の情報とします）を例に挙げて説明します。

CRUD操作に対してそれぞれのURIを設計すると、以下の通りになります。

|URI| HTTP method |操作|
|:-:|:-:|:-:|
|api.sample.com/movies| GET |映画情報一覧を取得|
|api.sample.com/movies| POST |映画情報を新規作成|
|api.sample.com/movies/1| PUT |映画情報を更新|
|api.sample.com/movies/1| DELETE |映画情報を削除|
|api.sample.com/movies/1| GET |特定の映画を新規作成|

:::note warn
URI設計は、シンプルでわかりやすい単語を選ぶことが重要ですが、略しすぎて何を意味しているかわからないものは避けましょう。
:::
【Next.js14】npm run build で useSearchParams() should be wrapped in a suspense boundary at page "~~~".でビルドエラーとなる

備忘録として

# 経緯
Next14でフロント側入力フォーム作成。
URLクエリパラメータを取得するためuseSearchParams()を使用。
npm run dev では問題は無かったがnpm run buildを実行すると、
> useSearchParams() should be wrapped in a suspense boundary at page "＊＊＊＊". 

と表示されビルドエラーとなる。



# 環境
+ Next.js 14.1.4
+ React 18.2.0

# 解決策
詳しくはこちらを読めば原因は分かります。

https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout

useSearchParamsを使用する際は<Suspense></Suspense>でラップしてねってことですね。

しかし、useSearchParams()を使用しているのはMyFromコンポーネント内なのですが、そちらにSuspenseでラップしてもエラーが解消しなかったっため、親コンポーネント側にSuspenseのラップを追加したらビルドエラーが解消しました。

```Javascript:page.js
import MyFrom from "./components/form";
import { Suspense } from "react"; //追加

～～中略～～

    return (
    <>
      <CommonJs />
      <GoogleTagManager gtmId="******" />
        <section className="Contact">
            <h2>入力フォーム</h2>
            //Suspenseでラップ
            <Suspense>
                <MyFrom/>
            </Suspense>
        </section> 
      <Footer />
	  </>
    )
```
「E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.」が出たときの対処法

# はじめに
ubuntuのバージョンを20.04から22.04にアップグレードしようとしたときに、表題のエラーに遭遇した。
未だに原因はわかっていないのだが、日本語の資料がほぼなかったので対処法だけ記しておく。

# 環境
- Windows11
- Ubuntu22.04

# 具体的な症状
```bash
sudo apt-get upgrade
```
をしたときに5時間くらい経っても終わらず強制終了をしたら、以降何かのパッケージをインストールしようとするたびに
```bash
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
```
が出て進めなくなってしまった（それ以前から問題があって、そのせいでupgradeが進まなかった可能性もアリ）。

エラーメッセージの通りに
```bash
sudo dpkg --configure -a
```
を実行すると、今度は以下のメッセージが出て、そのまま待っているだけだと何時間待っても終わらないという状態になった。
```bash
（略）
Running mtxrun --generate. This may take some time... done. 
Pregenerating ConTeXt MarkIV format. This may take some time...
```

# 良くなかった対処法
```bash
sudo dpkg --configure -a
```
を実行した後、いつまで経っても終わる気配がなかったので強制終了してwslを再起動した。
その後、Ubuntuのupgradeはできるようになったが、元々インストールしていたパッケージがいくつか消えてしまった（これは強制終了したことが原因ではなく、よくわからないまま強引にupgradeをしてしまったことが原因かも）。
また、パッケージを新しくインストールしようとするたびに表題のエラーがでる症状は直らなかった。

# 良かった対処法
Ask Ubuntuに[同様の質問](https://askubuntu.com/questions/956006/pregenerating-context-markiv-format-this-may-take-some-time-takes-forever "Ask Ubuntu")が投げられており、これの返答にあった対処法のうちの一つが効いた。
具体的にやったことは、`Enter`をおしっぱにするだけ。とにかく何も考えずに`Enter`を押し続けると、何もしなかった時は一切出なかったlogがちらほら出力されはじめ、大体1,2分もあれば実行が終わる（なんで？）。
ちなみに返答にあるほかの方法も試してみたが、上手くはいかなかった。

# 結論
`sudo dpkg --configure -a`を実行してあとは`Enter`おしっぱでOK！
React Nativeでapkを作成時のエラー対応A problem occurred evaluating project ':app'.

# apk作成時のエラー
環境構築はこちらを参考
https://qiita.com/ryome/items/7e95279eeffbf231b1ba

# 環境
Node 20.11.1
Java 17
Android Stadio 2023.2.1
react-native-cli: 2.0.1
react-native: 0.73.6


# エラー内容
上記で環境構築中「gradlew bundleRelease」を実行
```
FAILURE: Build failed with an exception.

* Where:
Build file 'D:\work\node\react-native-app\android\app\build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'com.android.internal.application'.
 > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
 Your current JDK is located in D:\Program Files\java
 You can try some of the following options:
 - changing the IDE settings.
 - changing the JAVA_HOME environment variable.
 - changing `org.gradle.java.home` in `gradle.properties`.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
```

javaのバージンが古く17にしてくださいと言われたのでダウンロード解凍して、環境変数を変更して再度実行
https://jdk.java.net/java-se-ri/17

メッセージにそのまま記載されていますが、備忘録的に残しておきます
LINEbotでローディングのアニメーションを表示

2024年4月17日にLINEのローディングアニメーションのAPIが公開されました！！

https://developers.line.biz/ja/news/2024/04/17/loading-indicator/

返答が来るまで指定の時間下記のような、【入力してますよ】という表現のアニメーションが表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624933/17d41f1d-14c9-f730-6beb-e26f19a78a58.png)

下記のそれを利用したオウム返しbotを作ってみました。
文字を送ってから、その間アニメーションが表示されて、5秒後に送ったテキストと同じものがかえってきます。
ぜひお試しください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624933/6beae09b-eb20-217e-4043-469dd5d4d2b3.png)

裏で動いておりますGASのスプレッドシートです。

https://docs.google.com/spreadsheets/d/1JMxzg1Ay7ZZkwWffLVD0BTVvZpKeVa07-_tq3atYOzc/edit?usp=sharing

ローディングのアニメーションの部分は下記になります。

```javascript:main.gas

function loadinganimation(userID) {

  var options = {
  "method": "post",
  "headers": {
  "Content-Type": "application/json",
  "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN,
  },
  "payload": JSON.stringify({ // payloadをJSON文字列に変換
    "chatId": userID,
    "loadingSeconds": 60 //60秒表示
  }),
  };
 UrlFetchApp.fetch("https://api.line.me/v2/bot/chat/loading/start", options);
}

```

POSTしてからトーク画面が開いているときにアニメーションが表示されるものとなっております。
ですのでPOSTしたときにトーク画面が開いていないと、アニメーションは表示されません。

GASは返答が少し遅いので相性がいいAPIだと思います。

これがあるだけでユーザーのストレスは減ると思いますので是非ご利用ください！！
[Rails] debug gem で効率的なデバッグをしたい...

### 概要
Railsのdebug gemについて、デバッグ時に活用できると感じた機能を紹介します。

### 利用方法
デバッグしたい箇所に`binding.break`を記載 
※ `binding.b`でも可

```ruby
def hoge
   binding.break #処理中断
   # ...
end
```

#### 基本コマンド
`c` / `continue` 処理続行（ブレークポイントがあれば再度そこで停止）
`n` / `next`     ステップオーバー
`s` / `step`     ステップイン

### 業務で活用できそうなデバッグコマンド

 - `do, if`
   特定の条件でデバッグ
   ```ruby
    # 特定の例外時にデバッグ
    binding.break do: 'catch ActiveRecord::RecordNotFound'

    # 特定の条件でデバッグ
    binding.break if val == "hoge"
    ````
---

 - `i`
現在のスコープで有効なローカル変数、インスタンス変数を一覧で出力

---

- `bt n（行数）`
バックトレースを表示

---

- `l`
周辺のソースコードを表示

---

- `record on` / `step back`
    - `record on`でその記録
    - `step back`で`record on`で記録した処理まで1行ずつ戻ることが可能

---

### まとめ
簡単ですが、以上です。
個人的に `i` コマンドは現在のスコープで利用できる変数がまとめてみれるので便利だと思いました。
（タイムトラベルデバッグはまだ活用する機会がない...）
私がWindows11＋WSLでUbuntuを導入したときにぶつかった壁

### マニュアル通りにコマンドを打ち込めばいいだけなんて簡単すぎィ！！

…そう思っていた時期が私にもありました。

この記事はそんな浅はかすぎる投稿主が、
### Windows11＋WSLでubuntuを導入
する際にぶつかった3つの壁と解決方法の記録です。

導入手順はこちらの動画を参考にさせていただきました。

https://youtu.be/odDJ3QvlF2g?si=HY_k-Plv6l2T_M46

しかし、動画の通りに進めてもうまくいかなかった…。

この記録が、同じような壁にぶつかった誰かの役に立ちますように。

### 第一の壁：WSLのインストール

PowerShellを管理者権限で起動し、
```
wsl --install
```
HAHAHA！！
なんて簡単なんｄ…　
#### Errorだと…?！
Errorコードと文章を解読したところ、
「このインストールは違法です。許可されません！」とのことでした。なんでやねん。
#### スマートアプリコントロールがオンになっている
と、今回のようにインストールを妨害されてしまうようです。

設定→プライバシーとセキュリティ→Windowsセキュリティ→Windowsセキュリティを開く
→アプリとブラウザーコントロール→スマートアプリコントロール→オフ

で、解決できた。
（ちなみにオフにする際に「オフにしたら戻せません！」と警告してきますが、
先に進むためです。覚悟を以て臆せず行きましょう）


### 第二の壁：ubuntuのインストール
こちらは、Microsoft Storeからubuntuをインストールします。

HAHAHA！！
インストールして起動すれば勝手に初期設定が終わってユーザー登録まで進めるなんて簡単だｎ…

#### rootアカウントでユーザー登録されているだと…??！
しかも、通常であれば勝手に始まる諸々のインストールが始まらない。

Linuxコマンド「Su」や「exit」を使ってみるが効果はいまひとつのようだ。
（root権限下で適当に触ってしまうとOSを破壊しかねないため、かなり肝を冷やしました）

#### 結局、最後まで原因がわからず終い（再インストールで解決）
ユーザー登録をEnterなどで飛ばしてしまった場合は自動的にrootがメインユーザーに設定されるそうですが、
今回ばかりは初回起動の時点なんだからどうしようもなくない？！

色々調べましたがやっぱり分からず最終的には再インストールで解決しました…。

### 第三の壁：Ubuntuリリースアップグレード

無事にUbuntuパッケージをアップデートし、次はアップグレード！
```
lsb_release -a
```
で現在のバージョンを確認したところ、ubuntu 22.04でした。
ここから、最新版のVer,23.10（R6.4現在）にアップグレードしていきます。
```
sudo vim /etc/update-manager/release-upgrades
```
ファイルを開き、
```
Prompt=lts
```
から
```
Prompt=normal
```
に書き換えて保存して、
```
do-release-upgrade
```
を実行すればおっけー！
HAHAHA!!!
勝ったな…って
#### またしてもErrorだと?!?!?!?!（切れ気味
Errorは「アップグレードを実行するにはltsをNormalに書き換えてください」とのこと

…いや、したじゃん!?したよねぇ?!

どうやら保存できていなかったようです。
保存コマンド→×マークでPowerShellを落として再起動してしまったのが問題だったみたいです。
```
:wq
```
で「保存して閉じる」コマンドを行うのが正解だった模様。
基礎って大事ですね。

その後、VscodeとWsl接続はつつがなく事が進み、
無事に環境構築を終えられました。
![スクリーンショット (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771642/11e86c84-32fb-7778-8e0e-26e27e6d8c9b.png)


### 無事に終えて
![スクリーンショット (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771642/e3f4e53f-74d1-1916-efff-564a40cd09d5.png)

動画では10分程度で終わらせていたのに、実際にかかった時間はなんと約3時間!!!!
ひたすらError→調べる→進む→Errorを繰り返して、やっとの思いで環境構築出来ました。

達成感がすごいぜ!!!!!!!（泣きそうな顔で

他にも細々としたErrorがいくつかありましたが、その大半はWindows側の要因や
一時的なバグでした。
Windowsめんどくさすぎ!!!!

次はdockerの導入だ、頑張ろう…。
嗚呼…Mac bookが欲しい。

（ご覧いただきありがとうございました。
定常性って何？時系列データ解析の基礎知識

# はじめに
大学の卒業研究で時系列データを扱う上で、「定常性」について学んだので、ここでアウトプットしておきます。これから時系列データを扱う方にとって、有益な情報となれば幸いです。
# 定常性とは
定常性は、時系列分析で行う多くの統計的モデリングや分析手法において前提とされている性質です。なので、時系列データ予測をしたい時は、最初に定常性を確認する必要があります。

では、「定常性」とはどんな性質なのでしょうか。
「"**常（つね）**"に"**定（さだ）**"まっている性質」と書いて、「定常性」というわけですが、

「**時間の変化によって、平均や分散などの統計的な特性が変化せず、常に一定である**」

という性質です。
# 定常性を確認する手段
そんな定常性ですが、データを眺めるだけでは正確に判断できません。なので、一般的に**ADF（拡張ディッキー-フラー）検定**や**KPSS検定**という統計的な検定方法が用いられます。

それぞれの検定で帰無仮説が異なるため、解釈には注意が必要です。
しかし、詳しい算出方法などは、まだあまり理解できていないので、またの機会にさせてください。
# 非定常の3つのタイプと定常化する手法
定常性を確認できない（時間の変化によって、平均や分散などの値も変化してしまう）場合を**非定常**と言います。また、「非定常」を「定常」にする処理のことを**定常化**といいます。

そして、非定常には主に3つのタイプがあります。
一つ目は、**トレンド非定常性**です。
**トレンド**とは、データの全体的な傾向のことです。全体的に上昇傾向や下降傾向がある場合、「トレンドが存在する」と表現されます。
トレンドが存在する場合、全体的に値が上昇したり下降したりするわけですから、時間の変化によって、平均値が変化するため、非定常となります。
また、トレンド性非定常の場合は、差分を取ることで、定常化を試みるのが一般的です。

二つ目は、**季節性非定常性**です。
**季節性**は、「1年間の周期性」と言い換えた方が理解しやすいかもしれません。例えば、「毎年夏になると値が高くなり、冬になると値が小さくなる。」というような特徴がある場合、時間の変化によって、平均値が変動するので、非定常となります。
季節性非定常性の場合は、季節差分を取ることで、定常化を試みるのが一般的です。

三つ目は、**分散性非定常性**です。
**分散性**は、文字通り分散のことです。トレンドや季節性がなかったとしても、最初は分散が大きかったのに、徐々に収まってきた場合やその逆の場合などが当てはまります。もちろん、分散が一定にならないので、非定常となります。
分散性非定常性の場合は、対数変換やBoxCox変換などで、定常化を試みるのが一般的です。

##### 注意点
扱うデータによっては、複数タイプの非定常性が同時に存在する場合もあるため、定常化の手法を適切に見極める必要があります。
# おわりに
以上、定常性について学んだことでした。
Qiita初投稿なので拙い文章だったかもしれませんが、最後まで読んでいただき、ありがとうございました。
今後も、学んだことをアウトプットしていこうと思いますので、よろしくお願いします。

# 参考文献
・https://www.salesanalytics.co.jp/datascience/datascience174/#3
・https://x.com/DS_school_1/status/1780015844275503581