OmniAICreator/Qiita-1.07M huggingface dataset:
【100万人に届けたい！私のお気に入りガジェット】クリップ付き小型ワイヤレスマウス「エレコム CAPCLIP」

# 「エレコム CAPCLIP」- おすすめのガジェット紹介

この記事は、Qiita 会員数 100 万人イベント「100 万人に届けたい！私のお気に入りガジェット」の記事です。
イベント詳細はこちら ↓
<https://qiita.com/official-events/8644e9719b0040cc1817>

## CAPCLIP とは

CAPCLIP は、エレコムから発売されている小型のクリップ付きマウスです。家電量販店や通販サイトで購入することができます。
Bluetooth 接続に対応しており、USB コード等が必要なく非常に使い勝手が良いです。
デザイン性・機能性ともに優れたマウスなので、紹介させていただきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/56e405fd-5c61-e413-f8e0-2bf4d2837295.png)

## こんな人におすすめ

- 会社でノートパソコンを使用している人
- 普段からマウスを持ち帰ったり、出張・外出が多い人
- 会社の中で自席と会議室の移動が多い人

## おすすめのポイント

### 小さく、クリップ付きなので持ち運びに便利

マウス本体をクリップ部分に格納することができるので、通勤や外出時などカバンで持ち運ぶ時は非常に小さい状態でしまうことができます。
また、特にお勧めしたいのが会社内で自席や会議室を移動するときです。
ノートパソコンを持ち歩いて移動するのですが、飲み物や携帯電話・資料などの持ち物もある中でマウスも持っていくというのはなかなかに邪魔です。
そんな時 CAPCLIP は、ノートパソコン本体の画面部分にクリップを使ってはさむことで荷物を一つ減らすことができます。
※ノートパソコンの大きさによってはつけられないかもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/c99fc8ba-333f-62db-812c-0f5451c767ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/48e23f8f-63cb-a746-14a5-66974c88ac18.png)

### シンプルなデザインで使いやすい

何色かのカラーバリエーションがあり、特に目立たないシンプルなデザインなのでオフィスでも使いやすいです。
全体的に小さいのもメリットで、手に収まりやすく、机上でも場所をあまりとりません。

### Bluetooth 接続なので受信機が USB ポートを占領しない

コードのあるマウスの場合、パソコンの USB ポートが一つ埋まってしまいます。
コードレスマウスでも受信機を USB ポートにさす必要があるタイプは同様に USB ポートを一つ占領します。
使用頻度の低い USB 機器と異なり、マウスは常に使用するので基本的に常に USB ポートの数が一つ少ない状態になってしまいます。
CAPCLIP であれば USB ポートを使用しないのでただでさえ少ないノートパソコンの USB ポートが減りません。

## ちょっと使いづらいポイント

おすすめのガジェットではあるのですが、ちょっとだけ使いづらいポイントもあるので紹介します。

### 充電が切れるタイミングがわかりづらい

一応バッテリーランプもあるのですが、小さいので点滅に気づくことができません。
充電が少なくなると動きが悪くなるなどの予兆もないので切れるときは突然動かなくなります。
（普通に業務で使用する分には体感で一週間くらいは持ちます）

### ほかの Bluetooth 製品を使っているとたまに混線する

自分は Web 会議などで使用するイヤホンマイクも Bluetooth を使用しているのですが、CAPCLIP と同時に使用するとたまにカーソルが暴れだす時があります。
数秒程度で落ち着くので問題ないのですが、Bluetooth 製品を多く使用している方には適さないかもしれません。

### マウスの機能自体は最小限のみ

小ささ故にマウス自体の機能は左右クリックとホイールしかありません。
普段から親指の戻る進むボタンやトラックボールマウスなど、多機能なマウスを使い慣れている人には少し物足りないかもしれません。

## 最後に

今回はおすすめのマウス「CAPCLIP」を紹介させていただきました。
約 4 年前に購入したこちらのマウスですが、最近クリップ部分が割れてしまって操作時に机を傷つけてしまいそうなので次のマウスを購入しようかと考えています。
もちろん次も CAPCLIP を購入する予定です。
普段使いまくっているが故に使いづらいポイントも多くなってしまいましたが、何年も使用しているとてもおすすめのマウスです。
どのマウスを使おうか考えている方はぜひ検討してみてください。
（イベントの商品がLogiのマウスなのに何を紹介しているんだ…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/4a54ac5c-d47f-f4cb-63a0-72badfad1591.png)


## 参考

製品ページ：
<https://www.elecom.co.jp/products/M-CC2BRSBU.html>
チーム分けアプリの開発：Elo Rating Systemによるプレイヤーのランキングと5vs5のチーム分け 1

## はじめに
この記事では、Elo Rating Systemを使用したチーム分けアプリの開発手順について解説します。Elo Rating Systemは、競技の強さを数値化するアルゴリズムで、チェスなどの競技に広く使用されています。
目標は、Elo Rating Systemを活用してプレイヤーのランキングを管理し、バランスの取れた2つのチームに分けるシステムを開発することです。

## 使用する技術
- バックエンド: Go言語を使用し、Echoフレームワークを採用
- データベース: PostgreSQL
- ORM: GORM

1.プレイヤーデータのモデル化とデータベース設計
- プレイヤーデータのモデルをGoのstructで定義
- データベースのテーブルとプレイヤーモデルを紐付ける

2.データベース接続とリポジトリ層の実装
- GORMを使ってデータベースに接続する
- プレイヤーデータを操作するためのリポジトリ層を実装

3.ユースケース層の設計と実装
- Elo Rating Systemの計算ロジックをユースケース層に実装
- プレイヤーのレーティングの取得や更新などを扱うユースケースを実装

4.ハンドラ層の実装
- Echoフレームワークを使ってAPIエンドポイントを定義
- リクエストを受け取り、ユースケースを呼び出して結果を返すハンドラを実装

5.チーム分けロジックの実装
- Elo Rating Systemに基づいたチーム分けロジックを実装
- プレイヤーのランキング順にチームを構成し、バランスの取れた2つのチームを作成

6.APIのエンドポイントとリクエスト・レスポンスの定義
- プレイヤー情報の取得や更新、チーム分けAPIのエンドポイントを定義
- リクエストやレスポンスの構造を定義してAPIの仕様を明確にする

7.テストの実装
- ユニットテストや統合テストを実装して、各機能の正常動作を確認

8.フロントエンドとの連携
- フロントエンドを実装して、チーム分けアプリを完成させる

9.デプロイと運用
- アプリをデプロイして公開する手順と運用について解説

## おわりに：
この記事では、Go言語とEchoフレームワークを使用してElo Rating Systemを活用した5vs5のチーム分けアプリを開発する手順についてメモ程度に記述しました。
プレイヤーのランキングを管理し、バランスの取れた2つのチームに分けるアプリケーションを実装することで、チームプレイの体験を向上させることができます。
言語モデルを使用したデータとのチャットの仕方

### 今回は手元のデータとチャットをして内容を調べるという便利な使い方を説明します。

この手の手法については既に説明している方が大勢いますが、情報が古くなっているものも見られるので自分自身の知識を定着させるため、備忘録代わりに手元のデータとチャットをする方法をメモ書きします。

#### 言語モデルを用いることで（現状では有力な選択肢がOpenAIのAPI位しかないものの）様々なサービスと接続することにより、手元のデータとチャットをすることが出来るようになります。

独自のデータを持ってきて、そのデータの内容をチャットをすることが出来るというのは、何となく分かっているもののその具体的な仕組みまでは分からない。またはChatGPT-Pluginを経由して利用しているので、仕組みは全く分からないという方は、具体的にどのような事を行っているか理解する助けになればと思います。

今回は、**[DeepLearning.AI](https://www.deeplearning.ai/short-courses/langchain-chat-with-your-data/)** が公開している無償のショートコースで学習した成果を踏まえて、比較的新しい概念であるリトリーブ（検索という訳語でよいのだか、Searchとはニュアンスが異なる）について説明します。

まず、まとまったデータが手元にありそのデータとチャット形式でないようについて調べたい場合のアプローチです。

まとまった情報の中からユーザーの質問に関連したデータをフィルタリングし、関連性の高い上位n個のデータを言語モデルに提示して以下のようなプロンプトを提示します。

```
以下の文脈を利用して、最後の質問に答えてください。答えがわからない場合は、答えを作ろうとせず、わからないと答えましょう。
{コンテキスト｝

質問 {質問文}
役に立つ回答
```

実際の仕組みについての説明を続けます。

データとチャットするにあたって必要になるのが比較的新しい（まだ頻繁なバージョンアップが行われています）LangChainというモジュールです。

このモジュールは、コンポーネント化された部品を組み立てたり、鎖のように繋いでいくことで様々な機能を実現するというものです。

今回はLangChainで利用出来る、リトリーバルという方法で、上位k個のデータからユーザーからの質問の答えに該当する部分を探す処理を言語モデルに行わせます。

上記の講義で用いられていた図のうち、簡単な枠だけを利用させていただきました。恐らく問題ないとは思いますが、問題があるという方は教えてください。

![リトリーブの流れ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70882/b56a39e4-bf14-91ad-21b1-92cdb968e105.jpeg)

まず、最初の段階でドキュメントの読み込みを行います。
このドキュメントの読み込みにはLangChainは、CSV、Discord、Dropbox、Email、Evernote、git、html等など、合計で80種類以上のサービスからデータを読み込み、チャット形式で対話可能な **Document** オブジェクトの形にすることが出来ます。実際には、言語モデルのコンテキストの制限から、トークン数を限定した上でdocumentオブジェクトのリストを作成する形になります。

元になるデータは構造化されたデータだけでなく、非構造化データであっても（内容に矛盾がない、質問に答えている箇所がある等の条件はありますが）対応出来ます（いくつかのケースでは失敗しますが、工夫を凝らす事で対応出来ます）

一番手軽な方法としてはWebサイトを丸ごとクローリングして、そのデータとチャットをするというものがあります。
ただ、Webサイトのクローリングはあくまで相手先のサーバーに迷惑を掛けないようリスペクトフルなクローリングを心がけるほか、利用規約などに反しないように注意しましょう。

今回は無難なところで税務署のタックスアンサーのサイトをクローリングして、そのクローリングしたデータとチャットする方法を解説します。

 **⇩**  Google Colabのノートブックへのリンクです。
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](リンク)

### ドキュメントの読み込み

税務署のタックスアンサーのサイトをクローリングするにあたっては、
スタートのページを、
「https://www.nta.go.jp/taxes/shiraberu/taxanswer/index2.htm」
として、クローリングドメインの範囲を
「https://www.nta.go.jp/taxes/shiraberu/taxanswer/」
とするのがよいでしょう。

クローリングしたデータは一旦、LangChain固有の「Documentオブジェクトのリスト」という形にします。
Documentオブジェクトというのは、ドキュメントの本文に加えて、メタデータを保存できるLangChainの標準的な文章の形式です。

まずWebサイトを非構造化データとして扱うという前提でデータを袖手します。
その際必要になるのが、**[unstructured](https://github.com/Unstructured-IO)**というモジュールになります。
また当然ですがlangchainやopenai等のモジュールも必要になります。

税務署のタックスアンサーの範囲にあるURLのリストを取得する必要がありますが、その手順はここでは触れません（予めURLの一覧を取得しておいて下さい）。

以下は、実際にタックスアンドアンサーのサイトからの質問応答を行うGoogle Colabのノートブックになります。
別途pathに指定した箇所にURLs.txtという、タックスアンドアンサーのサイトのURLを記録したテキストファイルが必要になりますが、URLリストを取得するのが面倒な方に、以下のリンクからダウンロードできるように共有します。
**[タックスアンドアンサーのサイトのURLテキストファイル](https://drive.google.com/file/d/1JOf7izOqIW_DQHZwKynFISw5XBrVgL24/view?usp=sharing)**

上記のURLテキストファイルを、pathで指定した（デフォルトでは、"/content/drive/MyDrive/TaxAndAnswer/"以下）に配置してから、**documentオブジェクトのリスト生成の実行**を行う事で、URLからdocumentオブジェクトのリストを生成できます。
インターン体験記(DMM.com)

# 自己紹介
現在、情報系の勉強をしている学部4年生(大学院進学予定)です。
普段はVueやFastAPIを使ってWeb App開発をするなどしています。研究室では、姿勢推定に関する研究をしている他、某企業で2023年3月〜から長期インターンで自然言語処理(transformer)を学んだりしてます。

# インターンに応募したきっかけ
2月頃に参加したハッカソンの企業紹介でDMM.comさんがインターンを開催していることを知りました。
元々Web App開発が好きだったので、いい経験になると思い応募することに。

# 概要
- Go言語の学習
- 期間:5日間
- フルリモート

# 1日目
計17名の学生でスタート。オープニング終了後は早速現役のエンジニアの方からGoの講義を受けました。
Go何もわからんの状態から始まりましたが、丁寧に解説をしてくれたので、基礎からじっくり理解できました。
講義後は、他のインターン生と課題解決のグループディスカッションをしました。
そんなこんなで1日目おわり。

# 2日目
2日目はみっちりGo講義を受けるDayでした。この日はcontext、http、dbなどなど…Goでバックエンド開発に必要不可欠な知識が盛りだくさん。
こんな一気に覚えられるのか…？って感じでしたが、講師のエンジニアの方の解説や資料がわかりやすく、以外となんとかなりました。
(contextは理解するまでまだ時間がかかりそうですが……)

また、この日は新卒で入社した方達と話せる座談会がありました。同じ出身の方がいて地味に嬉しかった()


# 3日目、4日目
ここから本格的に演習スタート。テンプレートが渡されるので、それを使って各々API実装に取り組み始めました。
テンプレートはレイヤードアーキテクチャを採用しており、MVCモデルに慣れてしまっていた脳で全体像を理解するのに時間がかかってしまった…
他の既存プログラムを読み込み、「なるほど、ここにこう言う処理を書くのね」っていうパターンを理解してからは割とさくさくいけました。
(そこにたどり着くまでに地味に時間がかかってしまいましたが…)

# 5日目
ラストのGo演習日。課題のAPI実装をやりきりました。時間が余ったので、プラスで新たなエンドポイントを作成したりしました。終わった頃にはGoの書き方をだいぶ理解できていた気がします。
演習終了後は現役エンジニアの方のライブコーディング。「そう言う思考でコーディングしてるのか…」と知見を深められました。
そんなこんなで早いもので全ての日程が終了してクロージング。

# 完走した感想ですが
Goについて、そしてバックエンド開発についてめちゃくちゃ勉強になりました。
来年もインターン参加したいなぁ……
Rangerの世界: macOSとキーボードで開かれる新しい道（その２）

## はじめに

前回の記事では、Vimライクなキーボード操作がたのしいRangerをご紹介しました。macOSでも、Ranger＋キーボードはなかなか心地がよいものです。

https://qiita.com/hann-solo/items/4279eb7211fdba680535

前回は、ウェブ上にすでにある、素晴らしいリソースのご紹介まででした。今回は、macOSでつかうときに、いい感じになる設定のコツなどをご紹介しようと思っていたのですけれども、かんがえをあらためまして、「困ったときの対処法」のメモにすることにします。

## はじめかたと、おわりかた（正常系）

はじめかたは、iTerms2などのターミナルエミュレータで、

```shell
$ ranger
```

です。するとこんな画面でRangerが起動します。

![SS 2023-08-05 20.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/35f0775d-3e5b-6824-be59-d21ffc8f4979.png)

終了するときは、`q`です。ただしく言うと`q`は「タブを閉じる」コマンドで、すべてのタブを閉じると、Rangerが終了します。

タブを複数ひらいているとき、`q`を連打すると、いずれはRangerが終了します。`q`を連打したくない場合は`Q`です。１キーで、すべてのタブを閉じてRangerを終了します。

## おわりかた（異常系）

こまったことに、Rangerは固まったり、`q`で終了できないことが、わりとあります。

よくあるのが、`q`を押すと、画面の左下に`Not Not quitting: Tasks in progress: Use 'quit!' to force quit`と表示されるパターンです。右上に、棒のようなものがクルクル回っているとおもいます。

![SS 2023-08-05 20.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/104b5921-e00e-eda8-ae62-ac7b4b9e7e27.png)

こういうときは、あわてずさわがずキーボードで`:quit!`と打ちます。タブをたくさんひらいているときは`:quitall!`がよいでしょう。画面の左下のメッセージどおりに（`:`を頭につけて）打てばよいです。

:::note
バックグラウンドでタスクが走っているのが原因であることがほとんどです。
`w`キーでtaskview画面を開き、カーソルをタスクに合わせて`dd`すると、終了を邪魔しているタスクを終了させられます。
:::

## おわりかた（もっと異常系）

さらに困ったことに、ごくまれにRangerが固まることがあります。`:quit!`と打とうにも、キー入力に反応しません。

そういうときは`Ctrl-z`です。シェルのプロンプトに戻るので、`jobs`で数字を確認して、`kill`します。

```shell
$ jobs
[1]  + suspended  ranger /Users/users/Downloads

$ kill %1
[1]  + 42198 exit 1     ranger /Users/user/Downloads

$ jobs

```

これでRangerが終了したので、ふたたび`ranger`と打てば再起動します。

:::note
単に操作がきかなくて困っているだけの場合は、`Ctrl-z`でシェルのプロンプトに戻り、そのまますぐに`fg`して戻ると、動いていることが多いです。こちらの操作もお勧めです。
:::

## そのほか、戻りかた

だいたい`esc`を押すか、`:q`とタイプすれば戻れます。どんなときでも、`Ctrl+z`→`kill %1`→`ranger`とすれば、Rangerを強制終了させられます。

## おわりに

いざというときの終了の仕方のご紹介でした。とにかく「原状復帰」ができれば、トライアル＆エラーもやりやすいとおもいます。いろいろさわって探索するのがなによりです。

その３以降では、あらためておすすめのカスタマイズ設定をご紹介したいとおもいます。ハッピーキーボード生活の一助となれば幸いです。


## ご参考

### 一連の記事

- その１：Rangerの魅力的なリソースをウェブからピックアップ
- その２：「終われない問題」への対処法
- その３：標準機能の中から、特に便利な機能の紹介
- その4：カスタマイズして便利な機能の紹介
- おまけ：カラースキームのオススメの組み合わせ

https://qiita.com/hann-solo/items/4279eb7211fdba680535

https://qiita.com/hann-solo/items/691cb695be5bba80f6ea

https://qiita.com/hann-solo/items/7bb85d89afadb3b7e940

https://qiita.com/hann-solo/items/aebb2de23bfe33ec2153

https://qiita.com/hann-solo/items/7e0d18ba0a6fd6ed9f61


### 環境

- ranger 1.9.3
- Python 3.11.4
- iTerm Build 3.4.19
- macOS Ventura 13.4.1
- MacBook Pro (14-inch, 2021)
初めての登壇を終えて

# コミュニティ運営の失敗談を発表しました
![#PP夜会](https://media.connpass.com/thumbs/85/66/8566069ecc946ccb8c95b4a223affa47.png)

https://twitter.com/1RRhcSB6HSUu9hF/status/1687146065798328320?s=20

風呂敷コミュニティの畳み方を考える、を発表させていただきました。
* 予想以上の人に聞いてもらえて
* チャットなどで反響も貰えて
* さらにはX（Twitter）のフォローまでしてもらえて

とても驚いています。主催の
[@yugoes1021](https://twitter.com/yugoes1021)
さん、運営の皆様、貴重な機会を頂き本当にありがとうございました。

# 登壇のメリット１：自分の言いたいことが明確になる
いやブログでやれ、という向きもありますが、やはり
* 時間制限のあるなかで
* 自分の言葉で話す

体験はライブ以外で得られませんし、今回は特に「所属している企業・団体のコンプライアンスに関わる内容は持ってこないように」な制限内で伝わるようにするには
1. 言える内容をリストアップする
1. 伝えたいことを並べる
1. 伝わる順番を工夫する

これが結構なトレーニングになります。
私事ですが、技術や現物の説明なら「なんぼでもできる」と思っていましたし、社内では散々やって来たのですが
コミュニティ活動について説明する、説明可能な状態かどうかを確認することをサボってきた（だから失敗した）ことがあらためて分かりました。
# 登壇のメリット２：知見者にフィードバックが貰える
しかも今回はMicrosoft MVPsの方々にとても前向きで有益なフィードバックが頂けました。これをイベントのたびに経験して積み上げているMVPの皆様の情熱とエネルギーに圧倒されました。
社内での発表とは違います。
* 社内は参加者の属性が揃っているので、ぶっちゃけグラフ1個で5分話すとかでも伝わる
* 社内は内容を詰め込んでも後からフォローできる
* 部署や工程が最初から既知なので、「毎度おなじみ〇〇課です」が通じる

このアドバンテージが無い状態でどう伝えるか、伝わったのか、にチャレンジできます。
# 発表でのやらかし
https://twitter.com/1RRhcSB6HSUu9hF/status/1687521602148478976?s=20
# これから
私は技術者のサポートがしたいんだな、という原点を振り返ることができましたので
* 伝わらないサポートの仕方を変える
* 分かりやすさに手間をかける
* みんなで遠くまで進む（仲間を増やす、コアメンバーを育成する）

に取り組んでいきますし、そのノウハウは当Qiitaで記事化しますし、Qiitaにならない独白などは個人ブログで発信していきます。見に来てくれると嬉しいです。
CloudWatch Logs を Insights で検索する

## 背景
これまで CloudWatch Logs に適当にログ出力していたアプリについて、検索しづらいなーと思ったので、なんかいい方法がないかと調べてみたところ、Insights という機能でもっと便利に検索できそうだったので試してみました。

## これまでのやり方

特にいい方法を知らなかったので、「すべてのログストリームを検索」などで適当にフィルタリング条件を入力して絞るくらいでした。
（というかイマイチ使いづらいなーとは思いつつも、その他のサービスでは CloudWatch 外でログを管理していたので、そんなにしっかり使う機会もなくこれでとりあえずは事足りていた）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733013/a443c9fb-d8ed-cf20-c8fc-167c3a0a3f00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733013/0197962b-b86d-f7f0-2d12-6fdfcf8a20d2.png)

## 今回試してみた方法
サイドバーにある「ログのインサイト」というのを試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733013/cdf7aed0-c703-818d-6062-d3cef518a051.png)

どうやらこれを使うと、クエリを実行して対象のログを抽出することができるらしいです。
そのためにはログを JSON 形式で出力しておくと都合がよいみたいでした。

## AWS CLI を使ってログを出力する
アプリからは適当なテキスト形式で「とりあえず出しているだけ」状態だったので、いったんAWS CLIでログを書き出してみました。

エスケープなどの都合でシンプルに JSON 形式で書き出すのが難しかったので tempfile を挟む方法で出力しています。

```bash
# Create a temporary file
tempfile=$(mktemp)

# Write the JSON log event to the file
echo '[{"timestamp":'$(date +%s)000', "message":"{\"level\": \"info\", \"message\": \"Test message\", \"timestamp\": \"'$(date +%s)000'\"}"}]' > $tempfile

# Use the file as the parameter to the AWS CLI command
aws logs put-log-events \
  --profile sample-dev \
  --log-group-name "sample-log-group" \
  --log-stream-name "i-12345678abcdefgh" \
  --log-events file://$tempfile
```

CloudWatch Logs では以下のように確認できました。

![Pasted image 20230804101154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733013/0abd45e8-0eb6-baf2-4905-51f11ee82263.png)

```JSON
{
  "level": "info",
  "message": "Test message",
  "timestamp": "1691110540000"
}
```

次にこれを Insights で検索してみます。

## Insights で検索

ロググループを選択した上でクエリを入力します。
クエリについては[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html)が参考になるかと思います。
（[こちらの記事](https://dev.classmethod.jp/articles/how-to-cloudwatch-logs-insights/)も参考になりそうです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733013/6513a645-80dc-5f54-4ff6-cd583d94ab73.png)

```
fields @timestamp, @message, @logStream, @log
| filter message = "Test message"
| sort @timestamp desc
| limit 20
```
まぁ雰囲気でだいたい分かるし書けるかなと思いますが、filter で WHERE 句を書ける感じですね。
これでクエリを実行すると以下のように先ほど出力したサンプルのログがヒットしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733013/be97918f-d5b9-8a10-dcc0-ed6fbd53d2b8.png)

さきほどのログの JSON と見比べてもらうとわかりやすいんですが、**JSON の key がフィールドとして認識されている**ので、それを検索条件として使える感じになっています。

@ つきのフィールドは AWS が用意してくれているもののようですね。

## 注意点
### コスト

クエリの実行、というかクエリを実行してスキャンされるログの量に応じてコストがかかります。
コストについてはこちらの[公式ドキュメント](https://aws.amazon.com/jp/cloudwatch/pricing/)を参照ください。

>スキャンしたデータ 1 GB あたり 0.005USD

これを見ると正直たかが知れているような気はしますが、今回は試し打ちしただけなので実際に稼働しているアプリケーションに対して実行するとどの程度のスキャン料になるかがよくわかっていないです。
そのへんは要チェックかなと思いました。

### ネストした JSON は認識できない？
みたいなことを何処かで見たのですが見失ってしまったのでメモのみ。確認してないのですが。
なので JSON  は可能ならばフラットな構造にしておくほうが良いかなと思いました。
そういう構造の場合は Athena を使うなど別の方法を選択することになるのかなと。

## まとめ
CloudWatch Logs にログ出力する場合は形を決めて JSON 形式で出力しておくと Insights でクエリ実行して抽出できて便利そう。

これについてはもうちょっとちゃんと調べてみたいと思いました。
[UE5] DataTable の項目をコンボボックスで表示する

C++ で作った DataTable 構造体には `FDataTableRowHandle` という便利な機能があります。
![13cfd214db8a645bafaec9f54ca6a9f7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41105/1cde1f53-6c21-f5d4-e9c0-bfc5de165648.png)
プロパティ編集時に DataTable のアセット指定と RowName を選択する UI が生成されます。

# `RowName` を指定してデータを取得する

```C++
USTRUCT( BlueprintType )
struct FHogeDataTableRow : public FTableRowBase
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly)
	int32 Hoge = 0;
};
```

`FTableRowBase` を継承した `FHogeDataTableRow` を作って、

```C++
    UPROPERTY( EditDefaultsOnly, meta = ( RowType = "/Script/[ModuleName].HogeDataTableRow" ) )
	FDataTableRowHandle RowHandle;
```

`UPROPERTY.meta` に `RowType` を指定します。

```C++
const auto* FoundRow = RowHandle.GetRow<FHogeDataTableRow>( ANSI_TO_TCHAR( __FUNCTION__ ) );
if ( !FoundRow )
{
	UE_LOG( LogTemp, Warning, TEXT( "%s: not found!" ), *RowHandle.ToDebugString() );
}
```
`GetRow` でデータを取得します。
引数の `ContextString` には、用途が分かるような文字列を渡すとよいでしょう。

:::note info
`ANSI_TO_TCHAR` は文字化けを防ぐために追加してます。
めんどくさいのでいい方法ないかなぁ。。。
:::

# おまけ

## `FDataTableCategoryHandle` も使いたかった

列名 `ColumnName` から値 `RowContents` に一致した複数行を取得する構造体。
RowContents には文字列以外の型も指定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41105/684eb46d-2085-cd08-0e90-29494746df54.png)
`HogeName` の列に対して値が `Category1` の行を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41105/380ccbb5-621e-70db-13b5-88998140ee4e.png)
この場合は `NewRow_1` `NewRow_2` が取得できる。

```C++
TArray<FHogeDataTableRow*> FoundRows;
CategoryHandle.GetRows<FHogeDataTableRow>( FoundRows, ANSI_TO_TCHAR( __FUNCTION__ ) );
```

:::note alert
手元の UE5.3 Preview では、エディタの言語設定が日本語だとクラッシュします。
英語だと問題なし。
:::

## DataTable 以外なら `GetOptions` も便利

https://qiita.com/_efe/items/1930525c15f881ac56db

```C++
UPROPERTY(meta=(GetOptions="GetTestOptions"))
FString Test;

UFUNCTION()
TArray<FString> GetTestOptions() const
{
    return { "A", "B", "C" };
}
```

UFUNCTION 定義の関数名を指定すれば OK。
未経験からバックエンドエンジニアになるためにやるべきこと

## 1. はじめに
こんにちは、皆さん。プログラミングやエンジニアリングに興味があるけど、どこから始めたら良いのかわからない、という方へ向けた記事を書きたいと思います。今回は、特に未経験者がバックエンドエンジニアになるためのステップを具体的に説明します。

## 2. バックエンドエンジニアとは？
まず、何がバックエンドエンジニアの役割なのか理解することが大切です。バックエンドエンジニアは、ウェブアプリケーションやソフトウェアの裏側（"バックエンド"）を担当するプロフェッショナルです。彼らの主な仕事は、サーバーサイドの開発、APIの作成やデータベースの管理、セキュリティの確保等、ユーザーが直接見ることのない部分を設計・実装・保守することです。

## 3. バックエンドエンジニアになるために必要なスキル
以下に、バックエンドエンジニアになるために必要な基本的なスキルを挙げます：

プログラミングスキル: バックエンド開発では、Python, Java, Ruby, Node.jsなどの言語がよく使われます。
データベース管理: SQLやNoSQLの理解と実装スキルが重要です。
サーバー/ネットワーク理解: HTTP, HTTPS, FTPなどのプロトコルの理解、Linuxの基本操作が必要です。
API開発: RESTやGraphQLなどのAPI設計と実装についての理解が必要です。
## 4. 学習のステップ
それでは、具体的にどのように学習を進めるべきかについて説明します。

* ステップ1: プログラミング基礎を学ぶ
まずは基本的なプログラミングの知識から始めましょう。PythonやRubyが初学者にはおすすめです。オンラインのプログラミングコースや教科書を使って自習すると良いでしょう。

* ステップ2: データベースを理解する
次に、データベースについて学びましょう。SQLを始めとするクエリ言語の理解と、実際にデータベースを操作してみることが重要です。

* ステップ3: Webの基礎を理解する
HTTPやHTTPSなどのプロトコルを理解し、どのようにウェブが動作するのかを学びましょう。さらに、Linuxの基本的な操作方法を学ぶと、サーバー管理の基礎を身につけることができます。

* ステップ4: 実践的なプロジェクトを作る
知識を実際のスキルに変換するには、実践的なプロジェクトを自分で作ってみることが一番です。例えば、自分だけのWebアプリケーションを作ってみると良いでしょう。

## 5. まとめ
バックエンドエンジニアになるためには、基本的なプログラミングスキル、データベースの理解、サーバー/ネットワークの理解、そして実践的なプロジェクトを通じた経験が必要となります。一歩一歩地道に学び、確実にスキルを積み上げることが大切です。頑張ってください！
QNAPでDockerのコンテナをDockerfileから作る話

# QNAPでDockerのコンテナをDockerfileから作る話

## どういうこと？
QNAPには「Conteiner Station」という、Dockerなどのコンテナを簡単に扱えるアプリケーションがあるが、コンテナ作成についてはGUIゆえにやりづらかったり細かい設定(RUNコマンドが使えない)ができないところがある。
じゃあどうしたら？という話

## さっくりと結論
「Conteiner Station」をインストールしたQNAP-NASにSSHログインすれば普通にDockerコマンドが使える。
なので、Linux系マシンでDockerコンテナを作るページを参考にして、適当なフォルダにdocker-compose.yml 、Dockerfileを作ってコンテナをビルドすればOK。
テキストでごりっごりに設定できるので自由自在。
作られたコンテナファイルはGUIで作ったものと同じく、デフォルト(だと思う)設定では以下のフォルダに保存される。
`/share/Container/container-station-data/lib/docker/containers`
コンテナIDの12桁で検索かければOK。

## ただし…
画像の通り、GUIに作ったコンテナと扱いが違うっぽく、表示が違う。
docker-compose.ymlのファイルを格納したディレクトリ名が「APP」の名前、その配下にContainer名がついた「docker」が表示される。
これは、たぶんdocker-compose.ymlで複数のservicesを指定したときに一連のAPPだという認識をするため、だと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101039/97210c8e-3916-6841-e943-cb9a3cdcc8d2.png)
上がDockerfileで作ったコンテナ、下がGUIで作ったコンテナ。

## 動作条件
以下のQNAPバージョンだと `docker compose` ではなく `docker-compose` とする必要がある模様。ぶっちゃけDockerはまだ勉強中なのでdocker-composeとdockerって何が違うんだっけ？ってレベルなのであてにしないでください。
* QTS 5.0.1.2425
* Container Station V2.6.7.44
* Docker version 20.10.17-qnap10, build 0474f29
[XCode][セキュリティ] 10 This method should not be called on the main thread as it may lead to UI unresponsiveness.

<AppDelegateURL>10 This method should not be called on the main thread as it may lead to UI unresponsiveness.

> <a href="https://qiita.com/sunstripe2011/items/3d74f51d9be37d46fc94#1%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B">（１）どういう意味ですか？</a>
> <a href="https://qiita.com/sunstripe2011/items/3d74f51d9be37d46fc94#%EF%BC%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AF%BE%E5%87%A6%E3%81%97%E3%81%9F%E3%82%89%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B">（２）どのように対処したらいいですか？</a>

## (1)どういう意味ですか？
　これは、「このメソッドはメインスレッド上で呼び出すべきではありません。UIの応答性の低下を引き起こす可能性があります。」というセキュリティ通知は、特定のメソッドがメインスレッド（UIスレッド）上で呼び出されているため、UIの応答性に影響を及ぼす可能性があることを意味します。メインスレッドは、UIの描画やイベント処理などを担当しており、重い処理を行うとUIが一時的にフリーズしたり、ユーザーの入力が遅れたりすることがあります。

## (２)どのように対処したらいいですか？
　対処方法は、以下のような方法があります：

　メインスレッド以外で処理を実行する：重い処理や時間のかかる処理は、バックグラウンドスレッド（非UIスレッド）で実行することで、メインスレッドの応答性を維持します。バックグラウンドスレッドでの処理を行うために、GCD（Grand Central Dispatch）やOperation Queueなどの手法を使用します。
　非同期処理を使用する：長時間かかる処理は、非同期的に行うことでメインスレッドのブロックを防ぎます。非同期処理には、GCDやOperation Queue、Async/Awaitなどがあります。
　UIの更新はメインスレッドで行う：UIの更新（画面の描画やビューの変更）は常にメインスレッドで行う必要があります。バックグラウンドスレッドでUIを更新しようとすると、予期せぬ結果が生じる場合があります。
具体的な対処方法はコードの中身によって異なりますが、上記のようなアプローチを取ることで、メインスレッドでの重い処理によるUIのフリーズや遅延を回避することができます。

---

## 関連記事
- [サンストライプについて](http://qiita.com/sunstripe)　- About

---

### 制作チーム：サンストライプ
[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/
[サンストライプについて](http://sunstripe.main.jp/)
制作チームのサンストライプのコンテンツについては以下の通り

月3回のコンテンツをリリースしています。
参加者は、プログラマーやデザイナー、イラストレーター、声優やVTuberなどが募集中です。

#### 関連プロジェクト・支援団体

- [地域情報 THEメディア](https://the.themedia.jp/)
地域活性化をテーマに様々な情報を発信しています。

- [ワークショップ情報 THEワークショップ](https://workshop.themedia.jp/)
多様化の時代に向けて他者理解を鍛えることを目的としています。

- [青空プログラミング](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8)　　- 月１だけのプログラミング学習塾
プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに取り組むことができます。


- [プログラミングラボ](https://twitter.com/PLab2020) - オンラインプログラミング研究チーム
３ヶ月にコンテンツを作成するAIを活用した実践形式の開発

- [Vの輪 バーチャル促進イベント企画・開発](https://twitter.com/VTuberLinks) - メタバースサークル
メタバースに向けた企画やイベントの実施およびメタバースとリアルの融合を目指してます。

- [スクランブルスクール バーチャル学校](https://twitter.com/scramblevschool) - バーチャル学校
VTuberに向けた情報発信とバーチャルイベントの企画と実施およびバーチャル番組制作

#### その他協力応援 / 支援者の集い
- [トラストヒューマン](http://trusthuman.co.jp/) - 私たちは何よりも信頼､人と考えてます｡
人材戦略パートナーとして、コンサルティングやクリエイティブの両角度からサポートをしています。
- キャリア教育事業 - [広域学習支援プラットフォーム『のびのび日和』](https://slc-lab.amebaownd.com/)
git とは

##  はじめに
業務でgit(gitlab)を使用しているが、ソースコードのバージョンを管理するツール、g以下コマンドぐらいしかしらないので調査と基本的な使い方を学び強くなる。

```git:gitコマンド
git pull
git push
```

## gitとは
ファイルの`バージョン管理を容易にするシステム`
バージョン管理システムには以下2種類ある。
* 集中型バージョン管理システム
* 分散型バージョン管理システム

### 集中型バージョン管理システム
常にオンラインで最新版のファイルを複数人でバージョン管理していく仕組み
常に最新版のみを作業するので、シンプルにバージョン管理できるがオンライン環境での作業が必要
　例）Subversion

### 分散型バージョン管理システム
gitはこれに該当する、クラウド上と自分のPC内に共有するファイルの保存先を複数持てる

#### メリット
オンライン、オフラインでも複数人が並行して作業できる

#### デメリット
複数人が並行して作業するため、それぞれの作業を

## gitとgithub
gitによって管理されるフォルダのことを`リポジトリ`という
gitを使用し、効率よく作業するには、リモートリポジトリとローカルリポジトリを上手く連携させる必要がある。
そのために用意されているのがリモートリポジトリを提供するサービス`github`
つまり、githubはgitをオンライン管理するwebサービス

## githubとgitlab
gitlabはgithubを参考に開発されたため、同様な機能を備えている。

|違い  |gitlab  |github  |
|:-:|:-:|:-:|
|サービス  |OSSライセンス  |商用ライセンス  |
|料金  |オープンソースなので基本無料  |公開リポジトリは無料※  |
|特徴  |インストールするためのサーバ、運用費用がかかる  |クラウド上で運営されるので、サーバ構築は不要  |

※プライベートリポジトリは課金

つまり、サービスや料金は変わらないので、ライセンスや自社でカスタマイズしやすいかどうかの違い。

## gitlab
gitlabには以下2種がある
<dl>
  <dt>GitLab CE(Community Edition)</dt>
  <dd>オープンソースソフトウェア</dd>
  <dt>GitLab EE(Enterprise Edition)</dt>
  <dd>CE版を元に開発し、CEへの機能追加を有料で提供</dd>
</dl>

以降は、gitlab CE版の主な機能について記載する
* 総合的なコード管理
* マージリクエストによる、コードレビュー
* プロジェクトやソースコードに対する課題管理

### 総合的なコード管理
複数名で開発する場合、各々修正したソースコードは全てgitを利用してバージョン管理されるので、異なる作業をしている人でも簡単に現行の作業をチェックできる

例えば、ソースコードの閲覧、変更履歴の確認、リポジトリのアクセス管理、ブランチの閲覧などが可能

つまり、gitlabを使うと簡単にコード間の管理ができる

### マージリクエストによる、コードレビュー
編集したファイルをコミットする際にgitlab CI/CD機能により、マージリクエスト毎に自動的にビルドとテストを実行できる


:::note info
コミット：修正したファイルを保存すること
:::

つまり、共同作業の変更点を確認しながらマージ作業ができる

### プロジェクトやソースコードに対する課題管理
バグチケットを発行して課題管理できる。
Issue Board機能により、開発途中、運用中に発生した課題を共有できる

## gitlabのメリット
* プロジェクトのコンテンツ共有ができる
* オンプレ上（自社内）でセキュリティの管理ができる
* Gitlabの機能をGit管理下で使える
[XCode][警告] “Root View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:].

<ストーリーボードURL>　“Root View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:].

> <a href="https://qiita.com/sunstripe2011/items/428a3ac87f84c685bf52#1%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B">（１）どういう意味ですか？</a>
> <a href="https://qiita.com/sunstripe2011/items/428a3ac87f84c685bf52#%EF%BC%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AF%BE%E5%87%A6%E3%81%97%E3%81%9F%E3%82%89%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B">（２）どのように対処したらいいですか？</a>


## （１）どういう意味ですか？

「Root View Controllerはエントリーポイントがなく、また

~~~Swift
-[UIStoryboard instantiateViewControllerWithIdentifier:]
~~~

を通じて実行時にアクセスするための識別子もないため、到達不可能です。」という警告は、ストーリーボード内でRoot View Controller（ルートビューコントローラー）に対してエントリーポイントが設定されていないために、アプリケーションが起動した際に該当のビューコントローラーが到達不可能であることを意味します。また、ルートビューコントローラーをストーリーボード上で識別するための識別子も設定されていないため、

~~~ Swift
-[UIStoryboard instantiateViewControllerWithIdentifier:]
~~~

メソッドを使用して実行時にアクセスすることができません。

## （２）どのように対処したらいいですか？

　この対処方法は、以下の手順に従って対応します：

　ストーリーボードで、ルートビューコントローラーとして設定したいビューコントローラーを選択します。
Attributes Inspector（属性インスペクター）を開きます。
「Is Initial View Controller」オプションをチェックします。これにより、選択したビューコントローラーがアプリケーションの起動時に表示されるルートビューコントローラーとして設定されます。
ルートビューコントローラーが設定されると、アプリケーションの起動時にそのビューコントローラーが表示されるようになります。

さらに、実行時に

~~~ Swift
-[UIStoryboard instantiateViewControllerWithIdentifier:]
~~~

　メソッドを使用してビューコントローラーにアクセスする場合は、ストーリーボード上で対象のビューコントローラーに適切な識別子（identifier）を設定することをお勧めします。これにより、識別子を指定してビューコントローラーをインスタンス化することができます。

---

## 関連記事
- [サンストライプについて](http://qiita.com/sunstripe)　- About

---

### 制作チーム：サンストライプ
[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/
[サンストライプについて](http://sunstripe.main.jp/)
制作チームのサンストライプのコンテンツについては以下の通り

月3回のコンテンツをリリースしています。
参加者は、プログラマーやデザイナー、イラストレーター、声優やVTuberなどが募集中です。

#### 関連プロジェクト・支援団体

- [地域情報 THEメディア](https://the.themedia.jp/)
地域活性化をテーマに様々な情報を発信しています。

- [ワークショップ情報 THEワークショップ](https://workshop.themedia.jp/)
多様化の時代に向けて他者理解を鍛えることを目的としています。

- [青空プログラミング](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8)　　- 月１だけのプログラミング学習塾
プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに取り組むことができます。


- [プログラミングラボ](https://twitter.com/PLab2020) - オンラインプログラミング研究チーム
３ヶ月にコンテンツを作成するAIを活用した実践形式の開発

- [Vの輪 バーチャル促進イベント企画・開発](https://twitter.com/VTuberLinks) - メタバースサークル
メタバースに向けた企画やイベントの実施およびメタバースとリアルの融合を目指してます。

- [スクランブルスクール バーチャル学校](https://twitter.com/scramblevschool) - バーチャル学校
VTuberに向けた情報発信とバーチャルイベントの企画と実施およびバーチャル番組制作

#### その他協力応援 / 支援者の集い
- [トラストヒューマン](http://trusthuman.co.jp/) - 私たちは何よりも信頼､人と考えてます｡
人材戦略パートナーとして、コンサルティングやクリエイティブの両角度からサポートをしています。
- キャリア教育事業 - [広域学習支援プラットフォーム『のびのび日和』](https://slc-lab.amebaownd.com/)
[XCode][警告] Prototype table cells must have reuse identifiers

<ストーリーボードURL>　Modal segues are deprecated since iOS 8.0

> <a href="https://qiita.com/sunstripe2011/items/eaa96fc47f2ec0e07aa3#%EF%BC%91%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B">（１）どういう意味ですか？</a>
> <a href="https://qiita.com/sunstripe2011/items/eaa96fc47f2ec0e07aa3#%EF%BC%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AF%BE%E5%87%A6%E3%81%97%E3%81%9F%E3%82%89%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B">（２）どのように対処したらいいですか？</a>


## （１）どういう意味ですか？
　この警告は、プロトタイプのテーブルセルに再利用用の識別子（reuse identifier）が必要であるという意味です。テーブルビューのセルを再利用する際には、セルに固有の識別子を割り当てる必要があるという警告です。

## （２）どのように対処したらいいですか？
　この対処方法は、以下の手順に従ってセルに再利用用の識別子を設定します：

- ストーリーボードでテーブルビューのセルを選択します。
- エディターアシスタントを開いている場合は、Assistance Inspector（アシスタンスインスペクター）が表示されていることを確認します。
- セルの属性を表示するために、Attributes Inspector（属性インスペクター）を開きます。
- Reuse Identifier（再利用識別子）という入力フィールドがあるので、ここに一意の名前を入力します。通常、セルの内容や種類に基づいた適切な名前を設定します。

再利用識別子は、テーブルビューがセルを再利用する際に、正しいセルを識別するために使用されます。この手順に従って再利用識別子を設定すると、警告が解消され、テーブルビューのセルが正しく再利用されるようになります。


---

## 関連記事
- [サンストライプについて](http://qiita.com/sunstripe)　- About

---

### 制作チーム：サンストライプ
[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/
[サンストライプについて](http://sunstripe.main.jp/)
制作チームのサンストライプのコンテンツについては以下の通り

月3回のコンテンツをリリースしています。
参加者は、プログラマーやデザイナー、イラストレーター、声優やVTuberなどが募集中です。

#### 関連プロジェクト・支援団体

- [地域情報 THEメディア](https://the.themedia.jp/)
地域活性化をテーマに様々な情報を発信しています。

- [ワークショップ情報 THEワークショップ](https://workshop.themedia.jp/)
多様化の時代に向けて他者理解を鍛えることを目的としています。

- [青空プログラミング](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8)　　- 月１だけのプログラミング学習塾
プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに取り組むことができます。


- [プログラミングラボ](https://twitter.com/PLab2020) - オンラインプログラミング研究チーム
３ヶ月にコンテンツを作成するAIを活用した実践形式の開発

- [Vの輪 バーチャル促進イベント企画・開発](https://twitter.com/VTuberLinks) - メタバースサークル
メタバースに向けた企画やイベントの実施およびメタバースとリアルの融合を目指してます。

- [スクランブルスクール バーチャル学校](https://twitter.com/scramblevschool) - バーチャル学校
VTuberに向けた情報発信とバーチャルイベントの企画と実施およびバーチャル番組制作

#### その他協力応援 / 支援者の集い
- [トラストヒューマン](http://trusthuman.co.jp/) 
  - 私たちは何よりも信頼､人と考えてます｡
人材戦略パートナーとして、コンサルティングやクリエイティブの両角度からサポートをしています。
- キャリア教育事業 
  - [広域学習支援プラットフォーム『のびのび日和』](https://slc-lab.amebaownd.com/)
【Android】GoogleMapで地図の操作の有効無効を切りかえる【Kotlin】

# はじめに
前回の記事に引き続きGoogleMapに関しての記事になります。
Maps SDK for Android で作成されているアプリでは、GoogleMapのアプリと同じ操作をすることができ、今回記事にする内容は　それをアプリ内で有効無効を切り替えるものになります。
その操作は　**ズーム操作、スクロール操作、傾斜操作、回転操作**です。

# 実践

|操作|コード|内容|
|:---|:---|:---|
|ズーム操作|googleMap.uiSettings.isZoomGesturesEnabled = false|ダブルタップや二本指でのタップなどのズーム操作を無効にする|
|スクロール操作|googleMap.uiSettings.isScrollGesturesEnabled = false|地図上で指でドラッグするスクロール操作を無効にする|
|傾斜操作|googleMap.uiSettings.isTiltGesturesEnabled = false|地図に2本の指を置いて一緒に上下に動かすときの傾斜操作を無効にする|
|回転操作|googleMap.uiSettings.isRotateGesturesEnabled = false|地図に2本の指を置いて回したときの回転操作を無効にする|
      
# 参考

https://developers.google.com/maps/documentation/android-sdk/controls?hl=j
SwitchBotハブ2でエアコンに寝室の温度を一定にさせて、睡眠を快適にする

# 概要
睡眠時に室温がエアコン(ダイキン AN28UAS-W)への設定より高い/低い温度にしかならない事が多く困っていました。
そこでSwitchBotハブ2の温度センサー/赤外線リモコン機能/オートメーション機能を利用することで、室温を設定した上限と下限の範囲内に維持することができるようになりました。

# この記事で伝えたいこと
SwitchBotハブ2は温度センサー/赤外線リモコン機能/オートメーション機能を持っています
これらを利用することで、夏場は設定より室温が高くなるとエアコンの冷房をつけ、低くなると切ることができます。
  もちろん冬場は設定より室温が低くなるとエアコンの暖房をつけ、高くなると切るともできます。
我が家では室温が28.0℃以上になると冷房をつけ、27.5℃以下になると冷房を切るよう設定し、快適な睡眠が得られるようになりました。


# 解決したい課題
我が家では（おそらく他のご家庭でも）エアコンの設定より高すぎる/低すぎる室温にしかならないことがあります。
例え同じ設定にしても、その日の天候か何かによって昨日より冷房が効きすぎたり効かなかったりします。
またエアコンを同じ設定でかけっぱなしにしても、最低温度と最高温度で3-4℃ほど差が出たりします。

# 課題の原因
原因の一つは、エアコン本体の温度と室内の他所の温度に差が有ることのようです。
ダイキンのホームページのサポートページの「よくあるご質問」にも
「Q.エアコンが冷えすぎます。どうしたらよいですか。」に対し、下記の記載が有ります。
>室内の温度をエアコン本体の室内温度センサーで検知しています。
そのために実際に人のいる場所よりも高い温度を検知している可能性があります。
https://www.daikincc.com/faq/customer/web/knowledge2912.html

# 課題を解決する方法
エアコン本体の温度と室内の他所の温度の差による、室温がエアコンの設定温度通りにならない課題の解決方法には、個人の所見ですが、以下のような方法が有ります。
1. **エアコンにリモートセンシングを取り入れる**
エアコンが赤外線温度センサーにより室内のエアコンから離れた場所の温度を測定する。
あるいは、エアコンと離れた場所に置ける外出しの温度センサーを作る。
これらの方法をエアコンメーカーが取り入れてくれれば解決しそうです。
内容はわかりませんが、2019年以降のダイキンの一部モデルには、設定温度と体感温度の差を補正する機能が有るようです。
ただし我が家のエアコンは2019年以前のものなので、その機能は有りません。
2. 空気が循環するようにする
風向きを上に向ける、風量を強くする、サーキュレーターを別に用意するなどし、空気を循環させます。
それにより室内の温度が均等に近くなり、エアコンの室内温度センサーがより実際のものに近い値を測定できるようになります。

今回は、SwitchBotハブ2を使いリモートセンシングを実現しました。

# SwitchBotハブ2導入
SwitchBotハブ2は温度センサー/湿度センサー/赤外線リモコン機能/オートメーション機能を持っています。
赤外線リモコン機能では、多くのメーカーのエアコンがすでに登録されており、それらエアコンのON/OFFを行なえます。
オートメーション機能は、温度/湿度センサーの測定値や/時間/曜日 などの組み合わせの条件と、赤外線リモコンでのエアコンのON/OFFなどのアクションを複数登録できます。
これにより、下記のような設定が可能です。
- 22:00から翌日の6:30の間に28℃以上になったらエアコンの冷房をつける。
- 22:00から翌日の6:30の間に27.5℃以下になったらエアコンを切る
- 6:35にエアコンを切る

曜日を条件に加える事で、曜日ごとに起きる時間や寝る時間の違いにも対応できます。

# SwitchBotハブ2の効果
SwitchBotハブ2導入した後のある日の就寝時間帯の室温を、1年前のSwitchBotハブ2導入前の同じ日の同じ時間帯の室温と比較したグラフがこちらです。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71468/f3490447-5d80-73e4-8759-2f8c3f9b1155.png)


導入前(2022年)は、エアコンで温度を設定しているにも関わらず約2℃の幅がありますが、導入後(2023年)は0.5℃の幅に抑えられています。
導入後(2023年)はSwitchBotハブ2で27.5～28℃の間に収まるよう設定したところ、最低27.1℃、最高27.6℃と0.4℃のずれが有ります。これは、SwitchBotハブ2を置いた場所の室温と、グラフの室温を測っている室温計の場所がずれていることによるものだと推察します。

# 留意点
- 操作音
	SwitchBotハブ2の赤外線リモコンは多くのメーカーのエアコンがプリセットされていますが、操作音が鳴る設定が有効のままだと夜中にエアコンからの「冷房を25℃で運転します」といった音に起こされることがありえます。
	その際は、本体の設定を変更する。あるいは、学習機能で操作音を切る操作とエアコンのON/OFFの操作をセットで学習させる。といった工夫が必要です。
- 電気代
	ON/OFFの条件の温度の幅を小さくすると、それだけこまめにエアコンがON/OFFされます。その事による電気代への影響はわかっていません。
- 内部クリーン運転
	 メーカーや機種によるでしょうが、我が家のエアコンの場合は、内部クリーン運転中にSwitchBotハブ2からON/OFFをすると、内部クリーン運転が止まります。
	 このことによりエアコン内部の湿気が十分に落ちないことがありえます。
- 体の暑さ/寒さへの順応に合わせ、設定を変える
夏の初めには27.0-27.5℃の幅に収まるよう設定していたのですが、やがて寒さで夜中に目を覚ますようになり、翌日から設定を0.5℃上げると快適に眠れるようになりました。
恐らく、だんだんと気温が暑くなりそれに体が順応してくると、睡眠時の室温もそれに合わせて上げていかないと体に無理が出るのでは無いかと思います。


# 今後のSwitchBotハブ2への期待
- 設定のエクスポート/インポート機能が欲しい
夏と冬で設定を入れ替える必要が有ります。シフトに合わせて曜日毎に起きる時間が異なることにも対応しようとすると、設定の数は結構なものになります。
それを季節毎に入れ直すのは面倒なので、設定のエクスポート/インポート機能を導入して欲しいです。

# 最後に
去年までは夜中に寝苦しいといってはシーツを蹴飛ばし、寒いと言ってはシーツを体に巻き付けながら寝ていました。それが嘘のようです。
今後は湿度も加味するなどして、より快適な睡眠を目指したいものです。
AIVOICEforGAMES_Unity has invalid dependencies or related test packages の解決方法

先日A.I.VOICEをUnityで扱えるエディタ拡張が[リリース](https://aivoice.jp/games/)されました。

ただ公式サイトの導入方法ではすんなり導入できず、タイトルのエラーで悩まされたので解決方法を記載します。


- Windows10
- Unity 2021.3.28f1

# パッケージ追加時のエラー
```
[パッケージマネージャーウィンドウ] Unityパッケージマネージャーの操作ができません: Unable to add package [file:D:/AIVOICEforGAMES_Unity]:
  Package jp.ai-j.aivoice-for-games@file:D:/AIVOICEforGAMES_Unity has invalid dependencies or related test packages:
    org.nuget.csvhelper (dependency): Package [org.nuget.csvhelper@30.0.1] cannot be found [UpmError_NotFound].
UnityEditor.EditorApplication:Internal_CallUpdateFunctions ()
```

要はCsvHelperパッケージの依存関係が解消できないと言われる。

# 解決方法
CsvHelperをプロジェクトへインストールします。

[OSにインストールする方法](https://ch.dlsite.com/matome/277425)もあったようですが私はUnityにパッケージインストールする方法で導入しました。

## NuGetパッケージをインストールできるようにする
[こちら](https://qiita.com/akiojin/items/ac05392d97abb8797dcd)を参考にNuGetパッケージをインストールできるようにします。

## CsvHelperパッケージをインストール
ウィンドウ＞パッケージマネージャー＞マイレジストリからCsvHelper(NuGet)をインストールします。
![CsvHelper_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224848/1465e737-1663-5b8d-47a3-11480a37090e.png)

以上です。

# 参考リンク
- [Unity で NuGet パッケージを利用する](https://qiita.com/akiojin/items/ac05392d97abb8797dcd)
- [A.I.VOICE for GAMES　で無料でユニティちゃんが使えるよ！（やり方紹介）](https://ch.dlsite.com/matome/277425)
Raspberry Pi Pico 単3電池拡張ボードでハンダ付けなしの電池駆動IoTを試してみた

[ビット・トレード・ワン](https://bit-trade-one.co.jp/)から販売されている[Raspberry Pi Pico 単3電池拡張ボード](https://bit-trade-one.co.jp/ad2040aa/)を試してみました。
このボードを使えば、簡単にRaspberry Pi PicoやRaspberry Pi Pico Wを単３電池２本で駆動できます。
リセットスイッチやGrove互換コネクタも実装されています。Grove互換コネクタは、GP4,GP5に接続されているので、GPIOやI2CのGroveモジュールを接続することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ab9b05af-68e1-6e68-7f21-2a998547a81f.png)

[Raspberry Pi Pico WH](https://raspberry-pi.ksyic.com/main/index/pdp.id/865/pdp.open/865/)を搭載して、Grove互換コネクタには、[GROVE - 温湿度・気圧センサ（BME280）](https://www.switch-science.com/products/3374)を繋げて[Ambient](https://ambidata.io/)に10分周期で温度を飛ばしてグラフ化するというのを試してみました。
ハンダ付け無しで実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/fa885015-06e4-8edb-51a7-1bdb2b2ade54.png)


## プログラム
普段、Raspberry Pi PicoのプログラムはArduino IDEでプログラミングしていますが、今回は[Thonny](https://thonny.org/)を使ってMicroPythonで初プログラミングしてみました。
環境の準備は、以下のサイトを参考にしました。

https://logikara.blog/raspi-pico-thonny-micropy/

BME280は、micropython-bme280というパッケージが用意されていたので、簡単にセンサからの情報を取得できました。

プログラムは、次の通りです。（Pythonは不慣れたなため、雑なプログラムなのはご了承下さい）
Wi-FiやAmbientの設定値は環境に合わせて変更して下さい

```python
SSID = "ssid"
PASS = "password"
ambient_chid='channel id'
ambient_wkey='write key'
amdient_tag='d1' 

import network
import urequests
from sys import exit
from machine import ADC, Pin, lightsleep, reset
from time import sleep
from machine import I2C
from bme280 import BME280

url = 'https://ambidata.io/api/v2/channels/'+ambient_chid+'/data'
http_headers = {'Content-Type':'application/json'}
http_body = {'writeKey':ambient_wkey, amdient_tag:0.0}

machine.Pin(23, machine.Pin.OUT).high()
led = Pin("LED", Pin.OUT)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASS)
while not wlan.isconnected():
    print('.', end='')
    led.toggle()
    sleep(1)
print(wlan.ifconfig()[0])

i2c = I2C(0)
bme = BME280(i2c=i2c)

while True:
    temp = bme.read_compensated_data()[0]/100
    temp_s = str(round(temp,1))
    print('Temperature =',temp_s,end=',')
    http_body[amdient_tag] = temp
    try:
        res = urequests.post(url, json=http_body, headers=http_headers)
        print(' HTTP Stat =', res.status_code)
    except Exception as e:
        print(e)
    res.close()
    wlan.disconnect()
    wlan.active(False)
    machine.Pin(23, machine.Pin.OUT).low()
    machine.deepsleep(10 * 60 * 1000)
```

## 動作確認
Ambientのコンソールからグラフを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/84862571-5f12-5785-8be6-ab8699cca558.png)

プログラムは、必要な処理を終えたらWi-Fiの通信を停止し、Wi-Fiモジュールの電源を切ってから10分間deep sleepするようにしています。そのため、平均の消費電力を約2mAまで抑えることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ae9fb863-f843-0c98-18c2-da9c692ca873.png)

単３電池でこのぐらいの消費電力だと計算上は1ヶ月以上持つ計算になります。いろんな条件で変わると思うので、Ambient上でデータが入らなくなるまで動作させて実測してみたいと思います。
[flutter]textfieldを複数使用している際に、カーソルが自動で切り替わってしまう件に関して

## 初めに

今回はtextfeildに関してです。

現在のプロジェクトで、一つの画面で複数のtextfeildを扱う機会があったのですが、なぜか片方のtextfeildに内容を入力していると、もう片方にカーソルのフォーカスが持ってかれてしまうバグが顕現しました。
そのバグについての解決法を共有します。

## 結論

textFeildのFocusNodeパラメータに付与するFocusNodeクラスをグローバルで宣言すると上記バグを回避可能です。

## 詳細
以下のようにローカルに宣言するとうまく行きません。

```dart : うまく行かない例
  @override
  Widget build(BuildContext context) {

    final focusNode = FocusNode();
    final focusNode1 = FocusNode();

    return Scaffold(
      appBar: AppBar(
（以下略）
```

このようにグローバルにFocusNodeクラスを宣言する必要があります。
```dart : うまく行く例
 final focusNode = FocusNode();
final focusNode1 = FocusNode();

class MyApp extends StatelessWidget {
  const MyApp({super.key});
（以下略）
```


## 参考URL

バグの事象は違いますが、以下のサイトを参考にしました。

https://stackoverflow.com/questions/56038010/multiple-cursor-in-forms-textformfield-flutter/57586327#comment98746459_56038010
[XCode][警告] Modal segues are deprecated since iOS 8.0

<ストーリーボードURL>　Modal segues are deprecated since iOS 8.0

> <a href="https://qiita.com/sunstripe2011/items/89746f31d965e36a0886#1%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B">（１）どういう意味ですか？</a>
> <a href="https://qiita.com/sunstripe2011/items/89746f31d965e36a0886#%EF%BC%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AF%BE%E5%87%A6%E3%81%97%E3%81%9F%E3%82%89%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B">（２）どのように対処したらいいですか？</a>

## (1)どういう意味ですか？
　この警告は、iOS 8.0以降ではモーダルなセグエが非推奨となっていることを意味します。モーダルセグエは、画面遷移を行う方法の一つで、新しい画面をモーダルとして上に表示するものです。


## (２)どのように対処したらいいですか？
　対処方法は、非推奨のモーダルセグエの代わりに、現代的な画面遷移の手法を使用することです。代替として推奨される方法は、ナビゲーションコントローラーを使用したPushセグエです。これにより、新しい画面がスタックに追加され、戻る操作で元の画面に戻ることができます。
　

具体的な手順としては、以下のようになります：

　ストーリーボードで、セグエの接続をモーダルからPushに変更します。
必要に応じて、ナビゲーションコントローラーをルートビューコントローラーに追加します。
　画面遷移を行うために適切なメソッドを呼び出します。

例えば、

~~~Swift
performSegue(withIdentifier:sender:)
~~~

メソッドを使用して遷移を行うことができます。

　このように変更することで、iOS 8.0以降でもアプリが正しく動作し、最新のベストプラクティスに従った画面遷移が行われるようになります。

---

## 関連記事
- [サンストライプについて](http://qiita.com/sunstripe)　- About

---

### 制作チーム：サンストライプ
[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/
[サンストライプについて](http://sunstripe.main.jp/)
制作チームのサンストライプのコンテンツについては以下の通り

月3回のコンテンツをリリースしています。
参加者は、プログラマーやデザイナー、イラストレーター、声優やVTuberなどが募集中です。

#### 関連プロジェクト・支援団体

- [地域情報 THEメディア](https://the.themedia.jp/)
地域活性化をテーマに様々な情報を発信しています。

- [ワークショップ情報 THEワークショップ](https://workshop.themedia.jp/)
多様化の時代に向けて他者理解を鍛えることを目的としています。

- [青空プログラミング](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8)　　- 月１だけのプログラミング学習塾
プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに取り組むことができます。


- [プログラミングラボ](https://twitter.com/PLab2020) - オンラインプログラミング研究チーム
３ヶ月にコンテンツを作成するAIを活用した実践形式の開発

- [Vの輪 バーチャル促進イベント企画・開発](https://twitter.com/VTuberLinks) - メタバースサークル
メタバースに向けた企画やイベントの実施およびメタバースとリアルの融合を目指してます。

- [スクランブルスクール バーチャル学校](https://twitter.com/scramblevschool) - バーチャル学校
VTuberに向けた情報発信とバーチャルイベントの企画と実施およびバーチャル番組制作

#### その他協力応援 / 支援者の集い
- [トラストヒューマン](http://trusthuman.co.jp/) - 私たちは何よりも信頼､人と考えてます｡
人材戦略パートナーとして、コンサルティングやクリエイティブの両角度からサポートをしています。
- キャリア教育事業 - [広域学習支援プラットフォーム『のびのび日和』](https://slc-lab.amebaownd.com/)
【Python】While文

# While文　ループ処理

### 勉強してたらいろんなことが混ざって分からなくなってきたので、自分なりに書いてみた。
----


# Whileとは？

処理を繰り返し行いたい（ループさせたい）のに使うもの。
または、`条件制御ループ`とも言うらしい。→`特定の条件が満たされるあいだ，何かを行う。`
真（true)である限り実行を繰り返します。

---


## while文　例文


```Python
x = 0              # 初期化  

while x < 5:      # xは5未満
    x += 1         # 1を足していく
    print(x)       

```

```:実行結果
1
2
3
4
5
````

0に1足されてるから、実行結果の最初は1になる
X = -1 に初期値を指定すると、-1+1で0から始まる:point_up:


## while + break + if文

`break文`は、条件が一致したら処理を中断させるもの。
`条件が一致したものは表示されず`、その前の条件まで表示される。


```python
x = 0

while x < 5:       # xが5 未満の時は、処理を続ける
    x += 1
  
  
    if x == 3:     # xが3 のときに処理を中断する
       break
    print(x)

```

```:実行結果
1
2
```


## while + continue + if文
`continue文`は、中断はせず条件に一致したものをとばすもの。
とばした次の一致していないものを表示させていく。


```python
x = 0

while x < 5:      # xが5 未満の時は、処理を続ける
  x += 1
  
  if x == 3:      # xが3 のときに処理をスキップする
    continue

  print(x)        # 3 のときにはこの下の print は実行されない
```


```:実行結果
1
2
4
5
```

---

```py:繰り返し
s = 0
n = 1
while n <= 10:            # 10以下のもの
    s += n                # s = 0 + 1
    print(s)
    n += 1                # n = 1 + 1されてwhileのnに代入される(繰り返す)
                          # n += 1が無いと永遠とnは1のままになる
print('end')
```



```py:実行結果
1
3
6
10
15
21
28
36
45
55
end
```
PostgreSQL データ削除時のエラー: database XXXX is being accessed by other users

## はじめに
毎回のように遭遇するので備忘録として記しています。

## 環境
- DB :  PostgreSQL 15
- ツール：pgAdmin 4


## 事象
Postgresのデータベースを削除しようとした際に、以下エラーが発生し削除できませんでした。
```
Error: database 'XXXX' is being accessed by other users
DETAIL: There are 3 other sessions using the database.
```
## 対処法
調べてみるとDB接続中の他のセッションがいるため削除できない事によるエラーでした。
心あたりはないものの、まず以下コマンドでDBの接続状況を確認します。
```
select * from pg_stat_activity where datname = 'データベース名';
```
結果はこんな感じで表示されます（表示項目は一部抜粋したもの）

|   | pid |user_name |application_name  | client_addr | ~ |
|:-:|:-:  |:-: |      :-:          |:-:          |:-:|
| 1 |16414|  postgres|pgAdmin4 -DB :XXXX |   10.51.16.0  |   | 
| 2 |16415|   postgres|pgAdmin4 -CONN:6817249 | 10.51.16.0  |   |  
| 3 |16399|   postgres|pgAdmin4 -DB :XXXX   |  10.68.51.0 |   |    

  - pid integer
    - バックエンドのプロセスID。後に実行するセッションの切断コマンドで利用します。
  - user_name
    - 接続しているユーザ名
  - application_name text
    - 接続しているアプリケーション名
  - client_addr inet
    - 接続しているクライアントのIPアドレス

 ※その他の表示項目については[公式ドキュメント](https://www.postgresql.jp/document/15/html/monitoring-stats.html#MONITORING-STATS-VIEWS)を参照ください


結果を確認すると、現在接続中のクライアント(10.51.16.0)2つと以前接続した別の開発マシン(10.68.51.0)のセッションが残っていたようでした。


次に接続を強制切断するコマンドを実行（pidは上記で確認したpidを設定）
```
SELECT pg_terminate_backend(pid);
```

自身が接続中のコネクション以外を切断します。
自身のpidはpg_backend_pid () ;で得ることができます。
(リンクだけです)「多項式」と「整式」について調べた。

＞数学の世界では“いわゆる”整式のことは多項式と表現することが普通です。
＞高等学校の数学では，大学以降の数学とはまた違った独特の慣用があったりします。

https://www.chart.co.jp/subject/sugaku/suken_tsushin/77/77-9.pdf

# DeepL翻訳
https://www.deepl.com/ja/translator#ja/en/多項式　　　polynomial
https://www.deepl.com/ja/translator#ja/en/整式　　？　integral expression

# wikipedia

https://ja.wikipedia.org/wiki/多項式

https://en.wikipedia.org/wiki/Polynomial

# 教科書の目次
＞数研出版様の６科目の教科書の表紙です。

https://blog.goo.ne.jp/mh0920-yh/e/589327bd6c840a1ede745ccb0506e5ed


教科書目録（令和4年4月）

https://qiita.com/mrrclb48z/items/405c26b005a61a916c3f#:~:text=%E6%95%99%E8%82%B2%E5%9F%BA%E6%9C%AC%E6%B3%95%EF%BC%9C-,%E6%95%99%E7%A7%91%E6%9B%B8,-%E7%9B%AE%E9%8C%B2%EF%BC%88%E4%BB%A4%E5%92%8C4


# 学習指導要領

https://qiita.com/mrrclb48z/items/405c26b005a61a916c3f#%E5%AD%A6%E7%BF%92%E6%8C%87%E5%B0%8E%E8%A6%81%E9%A0%98


# 参考書

https://www.chart.co.jp/goods/item/sugaku/c/bajggkd3ve.html


https://www.chart.co.jp/goods/sugaku_list/reference.html

# 参考

https://www.google.com/search?q=%E6%95%B0%E5%AD%A6+%E6%96%B0%E8%AA%B2%E7%A8%8B+%E6%95%B4%E5%BC%8F+%E5%A4%9A%E9%A0%85%E5%BC%8F&rlz=1CAUHAM_enJP1038JP1038&oq=%E6%95%B0%E5%AD%A6%E3%80%80%E6%96%B0%E8%AA%B2%E7%A8%8B%E3%80%80%E6%95%B4%E5%BC%8F%E3%80%80%E5%A4%9A%E9%A0%85%E5%BC%8F&aqs=chrome..69i57j0i546l3.25669j0j7&sourceid=chrome&ie=UTF-8

＞新教育課程と学習指導要領　ー数学ー　啓林館

https://www.shinko-keirin.co.jp/keirinkan/kou/math/pdf/math_sidou.pdf

＞2022年度〜　学習指導要領　数学　第一学習社

https://www.daiichi-g.co.jp/kyoka/skk/886364.pdf
Nuxt3.6系でDocker（WSL2内）でnpm run devするとVSCodeでパスが解決できない件について

Nuxtを3.6系にアップデートしたところ、dockerコンテナ内で`npm run dev`すると、ホスト側で起動したVSCodeでパスが解決できなくなって、importがすべてエラーとなってしまいました。


# 対策

GitHubでIssueを探したところ、以下の投稿がありました

https://github.com/nuxt/nuxt/issues/21827

どうやら、.nuxt/tsconfig.jsonのパスがDockerコンテナ内の絶対パスになってしまい、ホスト側のVSCodeでパスが解決できなくなっているみたいです。

どうやら3.7のマイルストーンに組み込まれたようなので3.7系が出るまで待つか、3.5系にダウングレードするかしかないですね。

ちなみに、ver3.7.0は8/7リリース予定みたいです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/e68c8271-ca3d-938d-3de0-b466c611c184.png)


### 暫定回避策

解決するためのパッケージをつくってくれる人がいるようなので、3.6系で使いたいのであればこのパッケージを入れるしかないかもしれません。

https://www.npmjs.com/package/nuxt-tsconfig-relative-paths
バックエンドエンジニア、フロントエンドエンジニアとかいう区切りはもはや意味がない話

## どういうこと？
- dockerなどのコンテナサービスによってサーバー、インフラの存在を完全に意識しなくても良いとは言えないが、フロントエンド、バックエンドの垣根がなくなって来ている。つまりどっちも手軽にできる時代になった。（勉強量は増えました）
- 外部のAPIを使った開発でも開発環境がdocker主流になりつつある。

(技術評論者のdocker実践本より少し引用）

## web業界さん、流行が変わる速度が早すぎる
- ７年前とかは未経験でもrailsチュートリアルを読破したぐらいで採用もらえてたのに、今じゃdocker,aws,redisとか熟知してるのが当たり前になってるよ。今勉強している人達のスペックが高すぎる。
### もうバックエンドエンジニア、フロントエンドエンジニアとかいう言葉は死後になっている認識でいいのかね？
- だって頑張ってるモダンホワイトな企業さんだと、例えばrails,TS(Nextjs),mysql,redis, dockerとか垣根なく色々学ばされる場所がほとんどじゃん？新人くんが「バックエンドエンジニア目指してます！」とか言ってるの見てると胸が締め付けられるね。入社後、半年も経たずに君はバックエンド専門家ではなく全知全能神になっているでしょう。
- インフラエンジニアとかいう言葉ももはや必要ないよね。webエンジニア=バック兼フロント兼インフラエンジニアというのがスタンダードな時代ですね多分。

## 何が言いたいのか分からなくなってきた
- webエンジニア業界は数ヶ月後にその技術がオワコンになっていることも珍しくない「新陳代謝の激しすぎる業界」だから常に勉強しないといけないのが辛いね〜。その代わりモダンな環境でホワイトに働けるのが強みよね〜。
上級者向け？便利なextension集①（swiftUI）

こんにちは。[フエルマネー](https://apps.apple.com/us/app/%E3%83%95%E3%82%A8%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC/id6446435231)開発者です。

今日は僕が実際に使っているextensionをまとめました。
たくさん書こうと思いましたが長くなりそうなのでシリーズ化して書きます。
まずは基本の**型変換**から！

# extensionとは
すでに定義済みのクラスや構造体に対し、プロパティやメソッドを追加できるコードです。
例えばInt変数を倍にして返すtwiceプロパティを作ってみます。
### 拡張変数プロパティ
```swift
extension Int{
    var twice: Int{
        self * 2
    }
}
```
呼び出す時は以下のように記述します。
```swift
let num = 5
print(num.twice) // -> 10
```
メソッドで作っても構いません。同様の結果となります。
### 拡張メソッド
```swift
extension Int{
    func twice() -> Int{
        self * 2
    }
}
```
変数に関わらず、必ず同じ値を返す定数は以下のようにstaticを使います。
### 拡張定数

```swift
extension Int{
    static let million = 1_000_000
}
```
呼び出す時は以下のように記述します。
```swift
print(Int.million) // -> 1000000
```

# 便利な使い方①：型変換の高速化
頻繁に使う型をextensionしておけば、型変換を素早く記述できるようになります。

みなさんは、型変換するときに以下のような書き方をしていませんか？
```swift
let integer = 10 // Int型
let double = Double(integer) // Double型
```
もちろんこれが正規だと思いますが、大体`let double = integer`まで書いてから、「あ、これDouble型に変換しないと！」と気づくと思います。これを変換しようとすると、`integer`の左までカーソルを持って行ってから`Double(`と書き、再び`integer`の右へ移動し、`)`で閉じますよね。

僕が提示するソリューションは以下の通りです。

```swift
extension Int{
    var toDouble: Double{
        Double(self)
    }
}
```
上記のように拡張しておけば、以下のように型変換ができます。
```swift
let integer = 10 // Int型
let double = integer.toDouble // Double型
```
この場合、カーソルを移動する必要はありませんし、`.`を入力するだけでXcodeが予測してtoDoubleを提示してくれます。

カーソルを移動するのは正直、煩わしいんです。こんなことでと思うかもしれませんが、この作業の積み重ねが、コードを書く作業が増えていくと大きな効率の差になってきます。

やってみればわかりますが、これは開発体験、開発速度ともに大幅な向上が期待できます。

# 便利な使い方②：CoreDataのための型変換
やることは前項と一緒です。
普段swiftを書く分にはIntをよく使いますが、CoreDataを使っていると、Int16やInt64への変換を頻繁に行う必要が出てきます。

なのでとりあえず、以下の拡張をしましょう。
```swift
extension Int{
    var to16: Int16{
        Int16(self)
    }
    var to32: Int32{
        Int32(self)
    }
}

extension Int16{
    var toInt: Int{
        Int(self)
    }
}

extension Int32{
    var toInt: Int{
        Int(self)
    }
}
```
続いて、ユーザー定義の型やEnumへの変換です。
例えばフエルマネーでは、口座やカードなどの資産(負債)を以下の4タイプに分けています。

```swift
enum AccountType: Int16{
    case cash, bank, credit, prepaid

    var toString: String{
        ["現金", "銀行口座", "クレジット", "電子マネー"][self.rawValue.toInt]
    }
}
```
これらの分類情報をCoreDataに格納する際は、Int16に対応して格納します。
enumの定義時に、Int16にしてるのがミソです。

これで、enum→Int16への変換は`.rawValue`から呼び出せます。
```swift
let cash = AccountType.cash // AccountType型
print(cash.rawValue) // Int16型
```

では逆はどうするのか。正規のやり方は以下です。
```swift
let type: Int16 = 0 // Int16型
print(AccountType(rawValue: type)) // AccountType型
```
より一層、ボリューム感が出ましたね。
これも先ほどのやり方でextensionします。
```swift
extension Int16{
    var toAccountType: AccountType{
        AccountType(self)
    }
}
```
呼び出す時は以下。
```swift
let type: Int16 = 0 // Int16型
print(type.toAccountType) // AccountType型
```
一番の魅力は、Xcodeが勝手に候補を出してくれることです。
これで開発スピード爆上がり間違いなし！

ご覧いただきありがとうございました。
質問などあれば気軽にしてください。