OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習入門②決定木分析を学ぼう

# はじめに

ひつじ橋です🐑

今回と次回では, 

<font color = "Red">決定木分析</font>と<font color = "Red">重回帰分析</font>を扱います.

どちらも, ビジネスで頻繁に利用されるアルゴリズムだそう.

これらは, 「教師あり学習」.

中でも, 「識別系」と「予測系」に分類されます.


# 決定木分析とは？
・・・<font color = "Red">決定木</font>を用いた分析方法.

「決定木分析」で画像を検索すると, 心理テストなどに見られるような, Yes / Noのみで分かれたシンプルな樹形図が出てきます.

まさにこのイメージです！

## ①決定木分析の強み
### 1. みやすい
統計に精通していない人でも, <font color = "Blue">見てすぐに分析が可能</font>です.

### 2. 前処理が少なく済む
決定木分析の分岐では, 値の大小などに基づいて振り分けられます.
そのため, 
<font color = "Blue">分布の考慮や, 変数変換などの処理が要らず</font>楽！！

### 3. 分類と回帰の両方に対応！
さて, 
ここで, 2つの予測方法を紹介します.

🌟<font color = "Red">分類</font>・・・データがどのカテゴリーに続するか, を予測する手法. 
個人的には, 『ア○ネーター』のイメージでいます.

🌟<font color = "Red">回帰</font>・・・連続する値を予測する手法.
たとえば, 過去の売上データをもとに回帰直線し, これを利用して売上を予測したり...

##### (参考)

https://avinton.com/academy/classification-regression/

これらにはそれぞれ, 適する分析手法が異なります. 

しかし, 決定木分析は

<font color = "Blue">分類と回帰の両方に対応</font>

しています！！

## ②決定木分析の弱み
### 1. 分岐の数に注意！
分岐の数が少なすぎると, 
予測精度が低くなりすぎる場合があります.

逆に多すぎると, 
<font color = "Red">過学習</font>の危険があります.

##### WORD
🌟<font color = "Red">過学習</font>・・・使ったデータにのみ適合しすぎて、新しいデータの予測精度が低くなること. 

...

なんだかよく分からないですね🤦‍♀️

やはり『◯キネーター』で想像してみると,

・「日本人ですか？」
👉「教員ですか？」
👉「思い浮かべているのは Mr.UNI」
ではとても当たらないですよね.

・逆に, 「日本人」の「教員」の「白衣」の「男性」のみ試しすぎると, 
その界隈にだけ無駄に詳しくなり, 他の人間のデータに疎くなりますよね.

### 2. 精度が高くなりにくい
アルゴリズムがシンプルすぎるために, 複雑なデータへの対応が難しいということです.

## ③活用できる場面
そんな決定木分析が輝ける舞台は...?

実際には, 主に

・顧客の行動予測
・ある事象の原因探索

に使われているようです.

##### (参考)

https://www.nttcoms.com/service/research/dataanalysis/decision-tree/

## ④Pythonで実装してみた

以下GitHubに置いてあります🔽

https://github.com/letstocotocoproject/Data_analysis_practice

# おわりに
今回は, 決定木分析の概要をまとめました.

次は重回帰分析です！
機械学習入門①機械学習をはじめてみよう

# はじめに
ひつじ橋です🐑

先輩のサポートをいただきながら, 機械学習を始めてみました.

ということで, しばらくは『機械学習をはじめよう！』ということで, 
学びの記録としたいと思います.

# 機械学習とは？
・・・データを分析する方法の１つ. データから, 「機械」（コンピューター）が自動で「学習」し, データの背景にある<font color = "Blue">ルールやパターンを発見する</font>.

機械学習には大きく分けて3種類あります.

### ①教師あり学習

たとえば, 
Step1. コンピュータに, 犬の写真と猫の写真(<font color = "Red">教師データ</font>)を与えます.
Step2. コンピュータが, それらから, 犬と猫の特徴を学習します.
Step3. コンピュータに, 何者かわかっていない写真(<font color = "Red">入力データ</font>)を与えてみます.
Step4. コンピュータが, 「犬」or「猫」を判断して返却します(<font color = "Red">出力データ</font>).

実際には, 
天候、価格、販促などの要因から売上を予測する
シーンなどで用いられます.

### ②教師なし学習
一連の入力データを基に, <font color = "Blue">その背景にあるパターンや構造を見つけ出す</font>手法です.

実際には, 
ネットショッピングでのレコメンデーション機能
などで用いられます.

### ③強化学習
システム自身が試行錯誤し, 精度を高めていく方法.
「己で学んでください」とはこのこと...?


##### (参考)

https://www.nri.com/jp/knowledge/glossary/lst/ka/machine_learning

# おわりに

次回からは, 
「教師あり学習編」ということで, 2つの分析手法を見ていきます.

がんばります！！！！！
野生のエンジニアは常識を知らない

## 野生のエンジニアは常識を知らない
ので、笑わないでほしい、という話。

`文系出身のエンジニアによるAdvent Calendar 2023に参加したくて書きました`

https://qiita.com/advent-calendar/2023/liberal-arts-engineer

## 野生のエンジニアとは
※ここでいう野生のエンジニアとは、 **野生のエンジニアリング** とは一切関係ありません。

教育機関での情報教育や、企業内でのOJTなどによる教育を、一切受けていないエンジニア。
Google老子や昨今ではChatGPT先生に協力を仰ぎ、本を読み漁り、荒野の中を自分の身一つで突き進むエンジニアのことです。

## 野生のエンジニアはお作法を知らない
みなさんは「忘れられた荒野～狼少女ジェーン～。」という作品をご存じでしょうか。
かの名作「ガラスの仮面」の劇中劇です。
狼に育てられた人間の少女ジェーンが、人間の街に連れ去られ、人間として扱われるうちにだんだんと変わっていく物語・・・だった気がする。多分。

その中で、ジェーンは確か・・・多分、床に放られた肉、かじってた気がする。うん。多分。

もし目の前でそんなシーン繰り広げられた暁には、皆さん、眉をひそめて
「あらイヤですわ・・・」
とクジャクの羽の扇子でお顔をお隠しになられるでしょう。

野生のエンジニアはそんな感じです。

放っておくと改行もインデントもコメントアウトでコメント残すこともしません。
いったい誰がどこで、##や--や//がコメントアウトで、そこにメモを残せるんだよと教えてくれるのでしょうか。

どうか野生のエンジニアが書いたプログラムを鼻で笑わずに、「この子は人間らしい暮らしをしてこなかったんだ・・・」と思いながら、優しくマナーを教えてください。

## 野生のエンジニアはデバッグモードを知らない
転ばぬ先の杖、なんて言葉は、だれしも聞いたことがございますでしょう？
え、ご存じない？あら・・・人間らしい暮らしを・・・いえ、なんでもございません。

ともかく、プログラミングをする際にはバグはつきもの。
どこでバグが起きてるか、などを検知するために、プログラムを1行ずつ進めたり、データ処理を全データではなく一部にとどめて行う・・・などはよくある話。

なのかしら？

野生のエンジニアは、とにかく必死なので、デバッグモードのボタンなど触ったこともなければ、
「何、この虫マーク・・・キモ。」と思うこともございます。

そう。
プログラムを書いたら最後、頭っから足の先まで、全部処理します。
全部処理して、エラーが出たら、どこまでの処理ができてるのかを、結果のデータなどを見て「ああ、多分ここやな」などと類推して修正するのです。

時間がかかるったらございませんわ。

try(){} catch(e){} みたいな書き方なんて、もちろん出会うこともございません。

野生のエンジニアを見かけた際は、そっとバナナの皮にでも書いて差し出してあげてください。

## 野生のエンジニアはテスト環境を知らない
現実世界に「テスト環境」なんてございますかしら？
本物の世界と全く同じで、ただミスをしても何の問題もない環境。
それってお伽噺のアリスの不思議な世界のことではなくって？

そう。
野生のエンジニアの、特にプログラムしか触ったことのない勢は「テスト環境」のことを知りません。

ええ、何が起きるかもうお分かりですわよね。

全力で本番環境でゴリゴリとプログラミングを試しますわ。
処理の中に **Drop Table** があろうが気にしませんわ。

いつだって本番。いつだって本気。
全力少年とは野生のエンジニアのこと。

失敗が怖い？

怯えてたら何も生まれないってばっちゃが言ってたわよ。


## 野生のエンジニアは常識を知らない
と、こんな感じでつらつら書かせていただきましたが、野生のエンジニアは本当に、時々びっくりされちゃうんですけど、知らないことが多いんです。

文系のエンジニア～のカレンダーですが、文系に限らないかもですね。。。
自分は文系で、プログラミング未経験からいきなり、VBAとかGASとかPythonとか書かされて、
そのたびに困ったときはエンジニアの同僚に頼り、
そのたびに「こんなことも知らないの(笑)」と笑われてきました。

知らないんですよ。野生なので。

でも、野生だから変な知識は知ってたりします。
食べられない草と食べられる草の見分け方とか、変なバグの回避方法とか。

野生は通った道を自分で切り開いてきているのと、結構業務知識を知っていたりするので、
正当な進化をしたエンジニアとはまた違った味を出してます。

どうか、優しくしてください。

そしてこれからも一緒にがんばりましょ。
【Google Cloud Next Tokyo ’23レポート】DAY1 今日はじめる高速セキュアな アプリケーション開発 DevSecOps とシフトレフト

# 講演概要
アプリケーション セキュリティのために工数がかかり開発期間が長くなってしまっていませんか？パイプラインにセキュリティの自動化プロセスを統合することで、セキュリティを堅牢化しつつ開発の高速化も実現します。今回は開発現場の課題を振り返りつつ、手戻りゼロで高速かつセキュリティの専門家不要でセキュアな開発を実現する方策をご紹介し、後半は FortiDevSec のデモを交えた具体的な実践方法をご覧いただきます。

セッション レベル：初級
取り上げる主な Google Cloud 製品 / サービス
Cloud Build
Compute Engine

https://cloudonair.withgoogle.com/events/next-tokyo?talk=d1-pl-06

# 所感
まさに今開発中のサービスでも最後に外部業者に脆弱性チェックをしてもらえばいいや、と思っていました・・・
それによる手戻りはスケジュールに組み込んでいないのでそれが開発プロセスの中で解決できるのであれば今すぐにでも取り入れたいなあと思いました。

FortiDevSecを使うかはともかく、SASTだけでもやっておきたいですね。

また、IaCを採用するメリットとしてIaCスキャンを使うことでインフラのリスクを静的解析できるというのも大きな発見。
まだ経験値が浅くてIaCを採用しないケースも多いんですが、こういったサービスを最大限活用する目的でもIaCを採用してく１つの理由になりそうです。

# セッションメモ

## 概要
アプリケーションセキュリティのお話
チェックシートを使ったり外部診断サービスに依頼したりしているのでは？
これらはコストがかかるので、それらを開発しながらタイムリーに診断ができるようにする
それによって手戻りなくかんたんに高いセキュリティのまま素早く実装できる

## 問題点
脆弱性の大半はソフトウェア起因でだが、アプリケーションセキュリティに割かれるコストは多くないという現状
DevOpsの中にセキュリティが取り込まれていないことが多い（知識不足、重要性の認知不足、リリース前のスポット対応している。そのため、脆弱性に気づくのが後工程になりがちで、手戻りが大きく結果としてサービスのリリースを阻害していることも多い）
高機能高付加価値のニーズに対応するためにコード量の増大、システムの複雑化
OSSを使う,ネットからコピペしたコードなど中身も多種多様になっている
OSSにも脆弱性がないかを気遣う必要がある

## DevSecOps
開発運用フェーズの中にセキュリティへの取り組みを統合することで堅牢性を確保しながらも手戻りがない高速開発を実現する

## シフトレフト

より前工程で実施することで手戻りをなくす

## 具体的な手法

開発中にタイムリーに解決
→ SAST（静的アプリケーション解析）
OSSを継続的にモニタ
→ SCA（ソフトウェアコンポジション解析）
攻撃余地がないかチェック
→ DAST（動的アプリケーション解析）

## FortiDevSec

SAST、SCA、DAST、Secretスキャン、IaCスキャンなど統合したAppSecツール
CI/CDに組み込むことが可能
マニュアルスキャンも可
JIRA連携

5ユーザー USD 500/月（ユーザーは開発者単位）
14日間フリートライアル可能（トライアル後課金）

修正すべき脆弱性を特定する機能（さまざまな観点での絞り込みができる）





# 資料リンク
【Google Cloud Next Tokyo ’23レポート】DAY1 リアルタイム解析データを トリガーにした アプリケーション構築方法のご紹介

# 講演概要
プレイドは、KARTE のリアルタイム解析データをトリガーにした独自の機能やアプリケーションをコードひとつですばやく簡単に構築できる KARTE Craft の提供を開始しました。本セッションでは、KARTE Craft のご紹介と NRI デジタル吉田様から KARTE Craft と業務システムと統合することによる活用例をご紹介していただきます。

セッション レベル：中級
取り上げる主な Google Cloud 製品 / サービス
BigQuery
Looker Studio

https://cloudonair.withgoogle.com/events/next-tokyo?talk=d1-pl-04

# 所感

今自分達が開発をしているサービスと重なる領域もあり、とても参考になりました.

自分達がグラフをどうするとか、どんなデータを出すと議論している間に彼らは来年にはグラフなんか出さずに具体的なアクションの提案を出すようなことをしていきたいとまで言っていったのが衝撃的。周回遅れにならないようにもっとギアを上げて行かなきゃなと身が引きしまる思い。。。

また、無理やり全ての機能を詰め込むんじゃなくて餅は餅屋に任せておくやり方や、ユーザーと共創をしていくようなやり方もあるんだなという点も刺さりました。

# セッションメモ

## KARTEとKARTE Craft

CXプラットフォーム
あらゆるデータを顧客ごとに統合・リアルタイムに解析
WEBのポップアップ、アンケートなど顧客に合わせた体験をマルチチャネルでシナリオ化

できること
オンライン接客
外部サービスとの連携機能（ただ、連携間隔は1時間単位でもっと密に連携したいというニーズに応えられてない）
API callとhookもあるが、これは生データのやりとりなのでデータ変換をしたい
→ リアルタイムかつ柔軟に連携する仕組みを作りたい！！

KARTE Craft
KARTEに不足している機能をユーザー自ら開発して連携を作り込むことができるサービス

コード実行基盤（Craft Functions）
コードを自由に記述してKARTE上で動かせるので、KARTEにない機能を自分で作ることができる
JavaScriptで記述

様々なトリガーを設定することができるので、作ったコードをリアルタイムで実行することができる

データストアの機能（Secret Manager、Key Value Store)も持っている

これまでは機能の追加をするためにはリクエストをもらっていたため、すぐに要望に対応できるかはわからなかった。
しかし、Craftがあればユーザー側で開発ができる

サービスとしてはマーケターなど決してコードを書くことになれていないユーザーが多いが、そこをサポートする体制も整えている

## 実際に使った事例の紹介(NRIデジタル）

KARTEとGoogle Cloudを組み合わせたソリューションに取り組んでいる
C4M ONBoard with KARTE
OMO OnBoard

これまでの課題
オンラインでのデータ収集に関しては豊富な機能でカバーできている
しかし、オフラインでの顧客体験についてはフォローができなかった

商材・接点に濃淡に応じて柔軟に対応できることが必要

営業や接客サービスの方の顧客接点からのデータを収集したい
リアル⇄デジタルでのデータのやり取り
顧客ダッシュボード（Looker StudioにBigQueryを介してKARTEの情報を見える化）
顧客ステータスの出し分け（CRMからBiqQueryでデータ抽出し、KARTEへ連携）
→ 
これまではこれらをリアルタイムに連携することがKARTEの仕組み上難しかったため業務によっては使い勝手がよくなかった
また、別システムになってしまうと使ってもらえない恐れもあった

Craftを使うとこんなことできるようになる

ダッシュボード
→ 業務に特化した形でダッシュボードを生成できる（しかもリアルタイムで）、それを顧客管理システムの中でできる（KARTEの画面には触れない）

CRMからKARTEへデータ連携
→ 顧客に応じたステータスや属性情報をCRMが管理、この情報をリアルタイムでKARTEに渡すことができる。それによってステータスに応じたWEB接客をリアルタイムな状況に応じた形で対応ができるようになる

KARTEの機能を普段使っている業務システムに組み込むことができるようになり、実際に使うユーザーにストレスを与えずに体験の向上ができる

円グラフとか棒グラフを出すんじゃなくてもっと先のアクションを提案するようなことを目指したい


# 資料リンク
【Google Cloud Next Tokyo ’23レポート】DAY 1 任天堂のデータ分析基盤

# 講演概要（セッション紹介から抜粋）

任天堂におけるデータ分析基盤の概要、システム アーキテクチャ、システム管理、利用状況をご紹介します。

セッション レベル：初級
取り上げる主な Google Cloud 製品 / サービス
BigQuery
Cloud Composer
Cloud Data Fusion
Cloud Storage

https://cloudonair.withgoogle.com/events/next-tokyo?talk=d1-da-01

# 所感

無線が聞こえなくていきなり詰みました・・・笑 なので、薄く聞こえる音声とスライドのみでの内容になっています。

全体的に任天堂における分析基盤がどのように構築されているか、どういった体制で運用をしているかというお話でした。
扱っているユーザーやデータ量も多く、多数のデータソースを抱えている状態できちっと権限の管理や自動化も実施しているんだなあという印象でした。

IaCについては一部導入を始めているものの、権限やユーザーグループの管理まではコード化できていない、というは発想になかったので今後取れいていきたいなと思いました。

# セッションメモ
## 概要
2023から稼働
BiqQueryの活用

3億3000万アカウント

900テーブル
4.5Tレコード

250+ PowerUser
900+ CasulaUser
5000+ Bi Content

## アーキテクチャ
ファイルで入力、CloudFactionを通じたAPI連携による抽出

BatchによってBIToolsへのデータ加工を実現
ファイル直接参照、ELT

オーケストレーション
依存関係を保ったままでタスク分解をしている

データウェアハウス
BiqQuery Data Trasfer serviceでデータ投入することで簡単にデータ転送可能

## システム管理
データの利用にあたってデータオーナーの承認が必要な体制を敷いている
アカウント管理はGroupsを使っていて、権限セットに応じたグループを用意している

IaC
TerraFormを用いてCloud,Group等を管理
GitHubActionsを使ってグループの管理、社内wikiへの連携など実施

CI/CD
GitHunActionsを利用

## 利用状況
SKU変更してベースは0で、maxオートスケーリングを設定する契約に変えた
オートスケーリングやslotの状況（1時間の間でも頻繁にスケーリングしているのがわかる）

## 最後に
今後も
データは集め続ける
安心安全なデータ運用
ニンテンドーシステムズでは一緒に働く仲間を募集中！



# 資料リンク
【Google Cloud Next Tokyo ’23レポート】DAY 1 基調講演

# 講演概要
初日の基調講演では、大きな進化を遂げている生成 AI と AI、機械学習を中心にプロダクト アップデートをご紹介します。また、Google Cloud の生成 AI ソリューションをすでにご利用いただいている企業のリーダーから、そのビジョンと取り組み、Google Cloud の生成 AI の成果をお聞きします。

https://cloudonair.withgoogle.com/events/next-tokyo?talk=d1-keynote

# 所感

AI三昧でした（笑）
予想はしていたものの、100%AIに絡めた話だけになるのは意外でしたね。

AIを使うことから作ることにフェーズが移行しつつあるというのはとても刺さりました。
自分達もはやくそのフェーズに移行しないと乗り遅れてしまうなあ。。。

印象に残った発表としてはMeetの後追い機能が凄かった。
要約だけでなく、追加の質問を受け付けてもらえるというのはとてもありがたい。

コードの生成に関してはGitHub Copilotの愛用者としてはそこまでの感動はなかったですが、運用の時に自然言語でサポートしてくれるのはとてもありがたい！ログの内容の検索とか運用やる上で何千と繰り返してきた作業が無くなるだけでもほんとに助かりますよね。

BiqQueryに関しても同様で自然言語でクエリ生成できてスライドに自動反映できる機能は弊社のコンサルチームが歓喜の涙を流しそう・・・

# セッションメモ

## Google日本代表の挨拶からスタート
伴走者
生成AIを触るフェーズから作るフェーズへ
AI First、大胆かつ責任あるAI、責任あるAIの7原則
ハルシーネーションに対して「グラウンディング」で抑制（パブリックデータに対して事実との照会を行うことでノイズを減らす）

そのためのインフラ提供をする
A3VMs、学習速度、ネットワーク帯域においてこれまでの数十倍の能力があるインフラを使える（東京リージョンも来春予定）

Vertext AI、AIの統合開発運用プラットフォーム

PaLM2 日本語サポートと推論力向上、業界特化させた学習モデル

## 中外製薬の方のお話

2019からDXをスタート

従来の創薬にかかるコスト
10-15年
¥3000億
0.0004%

専門性 AlphaFold2
民主化　生成AI Med-PaLM2

TAP 学習支援

## 再び代表

お客様のデータを使って学習しない

use AI（使う）
build AI（作る）
AI ecosystem（導入支援）

## アーワンメナードさん

Vertext AI

モデルガーデン
Codey（コード生成）
Imagen（画像生成）
マルチモーダルEmbeddings（分類、検索、レコメンドの性能向上）

データの堅牢性
グラウンディングサービス（事実に基づく応答の作成）
自分達の知的財産をベースに

みんなの銀行

チューニング方法の活用

## 岡田しょうへいさんのデモ

社内問い合わせチャットbot作成
データソースを与えることで簡単に事実に基づいた回答をするbotを作成できる

## zozo（WEAEの責任者）

記事作成が人的リソースに依存していた
説明文の生成にPaLM2を使うことにした
今後はimage to text text to image、意味づけによる検索などにも活用していきたい

## UseAI 

Duet AI in GoogleWorkspace


GoogleWorkspace 30億ユーザー 1000万の有償顧客
100万人のDuet AIユーザー

ブログによる情報発信デモ
DuetAIにいくつかソースとなるデータ（スプシだったりメールだったり）を与えるだけでブログ記事が書ける
文章のトーンや分量も参考資料を渡すことで調整することができてブラッシュアップも簡単
  
MTGのデモ
メモ作成、テキスト読み上げ、自動で共有できる
リアルタイム翻訳（自動で言語を検出して自分に合う形で提供しれくれる）
会議の後追い機能（後から参加した人向けにそれまでにどんなことが話し合われていたかをテキストで説明してくれる。要約だけではなくてチャットベースで質問をすることもできる）

## build AI

Duet AI in GoogleCloud

コード生成
対話ベース、コメントベースで生成
コードの説明を日本語で
テストコードの生成（これも日本語でコメント出てた）

運用
メトリクスから問題ある箇所を抽出するためにクエリ生成をするが、それも自然言語入力でクエリ生成ができる
ログの内容解説や原因の推測、解決方法の提案を自然言語で説明してくれる

BigQuery
自然言語でクエリを作って実行することができる
言われたことだけではなく、何を達成しようとしているのかを理解して情報を提供してくれる
ワンクリックでスライド化できる

AlloyDB
Oracleからの移行が可能になった
確認が必要なスキーマについて１つの手動変更を学習して他に反映することで手間を削減できる

## セキュリティ

AIの活用
脅威の検知
生産性向上
人材不足の解決

Sec-PaLM2
セキュリティに特化した言語モデル

## クロージング

# 資料リンク
Postman を始めましょう

https://learning.postman.com/docs/getting-started/overview/


ホーム/始めましょう

Postman を始めましょう
ウエルカム！ラーニング センターのこのセクションには、Postman の使用を開始する方法に関するトピックが含まれています。

Postman を起動して実行するには、「[Postman の最初のステップ](https://learning.postman.com/docs/getting-started/first-steps/overview/)」を参照してください。Postman を使用してリクエストを送信する方法、テストを作成する方法、チームと共同作業する方法などを学びます。

Postman の詳細については、次のトピックのいずれかにジャンプして学習することもできます。

+ Postman でリクエストの送信などを開始するには、[Postman デスクトップ アプリ](https://www.postman.com/downloads/)をダウンロードしてインストールします。詳細については、「[Postman のインストールと更新](https://learning.postman.com/docs/getting-started/installation/installation-and-updates/)」を参照してください。

+ Postman にアクセスしたら、[Postman の操作方法](https://learning.postman.com/docs/getting-started/basics/navigating-postman/)を確認してください。インターフェースに慣れたら、[最初のリクエストを送信](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/)してみてください。

+ Postmanアカウントを作成します。次に、[アカウントの管理](https://learning.postman.com/docs/getting-started/installation/postman-account/)、[Postman プロファイルのカスタマイズ](https://learning.postman.com/docs/getting-started/installation/postman-profile/)、および[Postman のセットアップ](https://learning.postman.com/docs/getting-started/installation/settings/)について詳しく学習します。

+ API を見つけるのに最適な場所は、Postman Public API Network です。使用方法の詳細については、「[パブリック API ネットワークの探索](https://learning.postman.com/docs/getting-started/first-steps/exploring-public-api-network/)」を参照してください。

+ いくつかのリクエストを作成したら、それらをコレクションとワークスペースに整理する必要があります。最初の[コレクションの作成](https://learning.postman.com/docs/getting-started/first-steps/creating-the-first-collection/)と[ワークスペースの作成](https://learning.postman.com/docs/getting-started/first-steps/creating-your-first-workspace/)を確認してください。

+ リクエストやその他のデータを Postman にインポートし、他のプログラムで使用するためにエクスポートすることもできます。[データのインポートとエクスポート](https://learning.postman.com/docs/getting-started/importing-and-exporting/importing-and-exporting-overview/)を確認してください。

+ お困りですか? アプリの問題の[トラブルシューティング方法](https://learning.postman.com/docs/introduction/troubleshooting-inapp/)を学びます。


最終更新日: 2023/11/14
Pythonで「文字列を指定した区切り文字で分割してリストとして取得する(split, splitlines)」の動作を確認してみた

# 概要

Pythonで「文字列を指定した区切り文字で分割してリストとして取得する(split, splitlines)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index18.html

# 実装

以下のファイルを作成しました。
```sample.py
print("My First Album".split())
print("  Next  Page  ".split())
print("Apple\tOrange\tLemon".split())
print("")
print("Orange,Lemon,Apple".split(","))
print("Red*-*Blue*-*Green".split("*-*"))
print("  Next  Page  ".split(" "))
print("")
print("Next Page".split(" "))
print("Next  Page".split(" "))
print("Next   Page".split(" "))
print(" Next Page ".split(" "))
print("")
print("A B C D E".split(" "))
print("A B C D E".split(" ", 1))
print("A B C D E".split(" ", 2))
print("A B C D E".split(" ", 3))
print("A B C D E".split(" ", 4))
print("A B C D E".split(" ", 8))
print("")
str1 = "Orange\nLemon\nApple"
print(str1)
print(str1.splitlines())
print("")
str2 = """\
Hello
My name is Yamada
Thank you"""
print(str2)
print(str2.splitlines())
print("")
str1 = "Orange\nLemon\nApple"
print(str1)
print(str1.splitlines(True))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
['My', 'First', 'Album']
['Next', 'Page']
['Apple', 'Orange', 'Lemon']

['Orange', 'Lemon', 'Apple']
['Red', 'Blue', 'Green']
['', '', 'Next', '', 'Page', '', '']

['Next', 'Page']
['Next', '', 'Page']
['Next', '', '', 'Page']
['', 'Next', 'Page', '']

['A', 'B', 'C', 'D', 'E']
['A', 'B C D E']
['A', 'B', 'C D E']
['A', 'B', 'C', 'D E']
['A', 'B', 'C', 'D', 'E']
['A', 'B', 'C', 'D', 'E']

Orange
Lemon
Apple
['Orange', 'Lemon', 'Apple']

Hello
My name is Yamada
Thank you
['Hello', 'My name is Yamada', 'Thank you']

Orange
Lemon
Apple
['Orange\n', 'Lemon\n', 'Apple']
```

# まとめ

何かの役に立てばと。
インスタレーションには画面共有だ

多分、インスタレーション案件やってる人にはそらそやろと言われるだろうけど、あえて書く。

# 前提
### インスタレーションはそもそも場所を取る
カメラやセンサーは当然ながら、自分のメインの開発PCを展示に使うわけにはいかないから別でPCも用意することになる。
自分のデスクなんてすぐにいっぱいになってしまう。
各PCにディスプレイを繋げ、キーボード・マウスを繋げたりなんかしていられない。

### PCが手近に置いておけない
インスタレーションにおけるPCの設置場所は多くの場合変なところだ。
高いところや狭いところ手の届かないところに置かれる。
マウス・キーボードなんて繋いでられないし、そもそも画面が見えない。
仮にプロジェクションマッピングで画面が見えるにしても、圧倒的に見にくい。

そこで、***「よし、画面共有だ！」*** という気持ちになってくる。


# 画面共有
一口に画面共有と言ってもいくつかパターンがある。
設定やインストール方法などはググってもらうとして、それぞれのひとくちメモを書いておく。

## ローカルネットワーク内でつなぐ場合
現場でLANを構築できるととても快適になる。
無線LANだとある程度自分のラップトップを持ち歩いてチェックが出来る利点がある。
ただし、設置するPCをちゃんと起動するたびに所定の無線LANに接続するようにしないととても面倒なことになる。
あと、できれば固定IPも設定してわかりやすいエイリアス名を付けておくと複数PCを操作しないといけない時に迷わなくて済む。

### 画面共有（Mac）
- Mac to Macだとスムーズ
- ファイルのやり取りもクリップボードの共有も出来る
- Mac miniをヘッドレスで開発できるの楽しいよね

### Microsoft Remote Desktop（Windows）
- Mac to Winでもほとんど違和感なく操作できる
- ファイルのやり取りもクリップボードの共有も出来る
- Windows OSのProでないと繋げられなくて困る
- こいつだけは繋いだ先のWindowsがスクリーンロックされた状態になってしまうことに注意

### VNCサーバ/ビューワ（ex. TightVNCなど）
- ファイルのやり取りやクリップボードの共有が出来ないことがある
- 割とどんな環境でもインストールできる
- ProじゃないWindowsで画面共有したい場合に入れたりする
    - この場合にファイルを共有したい場合は大人しくファイルの共有設定をしてあげましょう


## インターネット越しでつなぐ場合
現場が自分の作業場の近所とは限らない、というか遠くであることのほうが多い。
つまり、何かトラブルがあっても現場に駆けつけられない。
ハード的なトラブル（ケーブルが抜けた・デバイスを認識してないなど）は仕方ないとして、ソフト的なトラブルであればリモートで対応できるようにしておきたい。
なんとかお願いしてレンタルWiFiでも良いから現場にインターネット環境を構築しておきたいものである。

### Chrome Remote Desktop
- Googleアカウントを作る必要がある
- 無料で割りと何でも出来る
- ディスプレイ繋いでないと変な解像度で出たりする

### TeamViewer
- 無料で使っているとTeamViewerの表示が出てしまうので画面ありのインスタレーションだとちょっと辛い

### RustDesk
- 使ったこと無い
- 自前でサーバを立ててあげる必要があるらしい

---
などなど（Chrome Remote Desktopで大体事足りてしまって他あまり使ってない）

# とはいえ
画面を繋いでテストしないと痛い目を見ることもある。
特にゲーミングノートPCなどの高リフレッシュレートな環境から普通の60kHzのディスプレイに出力しないといけない場合、いざディスプレイに繋いでみるとカクつきまくったりして焦る（焦った）。
開発は画面共有でも良いけど、テストするときはちゃんと本番に近い環境でやりましょう。

---

それでは、良いインスタレーション開発を。
【データベース勉強中】DockerでMySQL環境を構築してみる


**Docker**に**MySQL環境**を構築してみる。

<table>
<caption>環境情報</caption>
      <tr>
        <th>PC</th>
        <td>MacBook Air(M1)</td>
      </tr>
      <tr>
        <th>OS</th>
        <td>macOS Monterey(バージョン12.5.1)</td>
      </tr>
      <tr>
        <th>Docker</th>
        <td>version 20.10.22</td>
      </tr>
</table>

## まずはDockerにMySQL環境をつくる

### Dockerをインストールする
Dockerがまだインストールされてない場合は「Docker Desktop」が楽でおすすめ。

**Docker Desktop**

https://www.docker.com/products/docker-desktop/

:::note info
ここからは基本的にターミナルで行う
:::


### 作業ディレクトリをつくって中に入る
今回の作業用に任意のディレクトリを作成する。

```
mkdir test_mysql
cd test_mysql
```

### docker-compose.ymlをつくる
```
touch docker-compose.yml
```

現在のディレクトリ構造はこうなる。
```
test_mysql
    └ docker-compose.yml
```

### docker-compose.ymlにdocker情報を追加する

```
vi docker-compose.yml
```

下記をコピペする。

```
version: "3"

services:
  database:
    image: mysql:5.7
    platform: linux/amd64
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_testdb
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: "Asia/Tokyo"
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3307:3306
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

#### サービス名
```
services:
  database:
```
Docker-Composeでは、アプリケーションを動かすための各要素をServiceと読んでいる。
ここは何でもいいが、dockerのログに表示されるので何のサービスなのかわかりやすいほうがいい。
（例：データベースならdbやdatabaseなど）

#### image
```
mysql:hogehoge
```
hogehogeのところでバージョン指定できる。
latestを指定すると最新バージョンが使用される。

#### platform
M1 Macの場合はplatformを指定しないとエラーになる。
```
platform: linux/amd64
```

#### container_name
コンテナ名を指定する。
ここで指定した名前がコンテナ名になる。
```
container_name: mysql_container
```
![スクリーンショット 2023-11-15 16.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/966ef00a-97d0-3e1d-5c55-afe712373191.png)

#### environment
環境変数の設定。
```
environment:
    MYSQL_ROOT_PASSWORD: rootユーザーのパスワード
    MYSQL_DATABASE: 作成するデーターベース名
    MYSQL_USER: 作成するユーザー名
    MYSQL_PASSWORD: 作成するユーザーのパスワード
    TZ: タイムゾーン
```

#### volumes
Dockerは基本的にコンテナを削除するとそれまで作っていたデータも一緒に消えてします。
volumeに保存しておくことでデータの永続化が可能になる。
```
volumes:
  - ./docker/db/data:/var/lib/mysql
  - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
  - ./docker/db/sql:/docker-entrypoint-initdb.d
```

#### ports
使用するポートを指定する。
```
ports:
  - 3307:3306
```

### コンテナを起動
```
docker-compose up -d
```


## 環境へ入って触ってみる
コンテナ名（今回はmysql_container）を指定して中へ入る
```
docker exec -it mysql_container bash
```

### とりあえずMySQLが入っているか確認
```
mysql --version
>> Ver 14.14 Distrib 5.7.44, for Linux (x86_64) using  EditLine wrapper
```
（無事入ってる）

### mysqlへログインする
```
mysql -u root -p
```
パスワードを聞かれるのでdocker-compose.ymlのenvironmentで指定した**MYSQL_ROOT_PASSWORD**を入力。

```
mysql>
```
と表示されれば成功！
ここからSQLを実行していく。

:point_up_tone2:続く
laravel sail環境は、シングルプロセスです！

# Laravelで、かんたんに Docker化できる　「Sail」とは
便利なのですが、まずはSailとはなにかを説明します。

Laravel Sail は、Laravel アプリケーションのための軽量な Docker 開発環境です。Sail を使用すると、Docker コンテナの複雑さを抽象化し、Laravel アプリケーションの開発とテストを容易にします。

1. php
2. db ( mysqlやmariadbなど)

この２つがセットアップされます。

ここで注意しておきたいのは、webサーバー（nginx とか apacheとか）が存在しません。
実は、PHPにはビルトインウェブサーバーが存在しています。
[php.net ビルトインウェブサーバー](https://www.php.net/manual/ja/features.commandline.webserver.php)

PHPのドキュメントにもありますが
「 __このウェブサーバーは単一のシングルスレッドプロセスしか実行しないので、 リクエストがブロックされると、PHP アプリケーションはストールします__ 」

ちなみに、以下のコマンドでいつでもWEBサーバーが動きます。

```
php run serve
```


## Laravel Sail の基本的なセットアップ手順　（すでにプロジェクトがある場合）

### Laravel Sail のセットアップ

1. Laravel インストーラのインストール

Laravel インストーラを使って新しいプロジェクトを作成する場合は、まずインストーラをインストールする必要があります。

```:terminal
composer require laravel/sail --dev
```


これで　sailは ./vendorに配置される。


### Docker 環境の起動

Sail を使用して Docker コンテナを起動します。

```
./vendor/bin/sail up -d
```

### アプリケーションのアクセスできることを確認

ブラウザで http://localhost 




``` : bash
php artisan sail:install

## 以下のDBなどから選択できます。 複数選ぶときは、カンマ区切りで

Which services would you like to install? [mysql]:
  [0] mysql
  [1] pgsql
  [2] mariadb
  [3] redis
  [4] memcached
  [5] meilisearch
  [6] minio
  [7] mailhog
  [8] selenium
```

以上でインストールされます。
docker-compose.yml
が作成されます。



## で、ここからが本題です。

認証のリクエストしたら、その中で自分自身を呼び出すようなコーディングしていた場合ですね。
このときもう一つプロセスが立ち上がろうとしていますが、PHPのドキュメントにもあるように、ストール（停止）します。
応答なしとなります。

ここが一番時間がかかりました。ストールするとなんにもエラーログもなんにも出ないです。ストールの怖いところです。





```
$http = new GuzzleHttp\Client;

$response = $http->post('http://docker.host.internal/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => '2',
        'client_secret' => 'WJFDwSKZBJHoScIfs7WSj4gSsLtV9LU5fmLRK5p8',
        'username' => 'admin@example.com',
        'password' => 'password',
        'scope' => '',
    ],
]);

var_dump(json_decode((string) $response->getBody(), true));
```


  なにか回避方法はないのか？と調べてましたが、ありません。
PHPのドキュメントには、「ビルトインウェブサーバーに実験的にマルチプロセス対応を行っている」という記載があるので、近い将来には実装されるかもしれませんね。


## 結論、これは、sailでは不可能となります。
素直に、php / nginx という環境にしましょう。
Jestを使ってテストを行う際に、Rechartsが原因で通らなかった時の対処

# はじめに
Rechartsを使ったコンポーネントをJestによってテストしていたところ、Recharts以下のコンポーネントを読み取っていないことに気がついた。
例として
```HTML
<div
    class="recharts-responsive-container"
    style="width: 100%; height: 100%; min-width: 0;"
/>
</div>
```

のようにJestが認識していた。このためRcharts内の要素を読み取ることが出来ず、テストを失敗していた。

# 対処
基本的に以下を参考にすることで可能であった。

 [How to test if BarChart renders with Jest? #2982](https://github.com/recharts/recharts/issues/2982)

 具体的にはテストを行うファイルの一番上に
 ``` javaScript
 jest.mock('recharts', () => {
    const OriginalModule = jest.requireActual('recharts')
    return {
        ...OriginalModule,
        ResponsiveContainer: ({ children }) => (
            <OriginalModule.ResponsiveContainer width={800} height={800}>
                {children}
            </OriginalModule.ResponsiveContainer>
        ),
    }
})
```
を追加する必要がある。

また、TypeScriptの場合は
```TypeScript
jest.mock('recharts', () => {
  const OriginalModule = jest.requireActual('recharts');
  return {
    ...OriginalModule,
    ResponsiveContainer: ({ children }: { children: React.ReactNode }) => (
      <OriginalModule.ResponsiveContainer width={800} height={800}>
        {children}
      </OriginalModule.ResponsiveContainer>
    ),
  };
});
```

のように{Children}の型を明記してあげる必要がある。

# 終わりに
Recahrtsを使ったテストに少し困ったので、自分が行なった対処法を共有したいと思いました。
この記事がお役に立てれば光栄です。
C++ next_combinationの愚直な実装

```
bool next_combination(vector<ll>& v,ll max_num){
    if(v.back()!=max_num){
        v.back()=v.back()+1;
        return true;
    }
    ll pre=max_num+1;
    for(ll i=v.size()-1;i>=0;i--){
        if(v[i]!=pre-1){
            v[i]=v[i]+1;
            for(ll j=i+1;j<v.size();j++){
                v[j]=v[j-1]+1;
            }
            return true;
        }
        pre=v[i];
    }
    return false;
}
```
Atcoder　ABC328E で出題されて解けなかったので，
標準であるnext_permutationみたいに使えるものを書いてみました．
ACコード https://atcoder.jp/contests/abc328/submissions/47591373

考え方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/c27e41ba-460f-8ec0-ae92-0d1ff5fffb6f.png)
画像は5C3=10の場合
{1,2,3,4,5}から3つ選ぶ10通りを列挙する方針．
スタートは{1,2,3} max_num=5
**・配列の末尾がmax_numより小さければ末尾＋＝１**
**・配列の末尾がmax_numであれば，配列を後ろから見ていき，
右に動かせる数字があれば，それを右に動かす．
 動かした数より大きい数は左にしきつめる．**

 

画像を上から見てもらうと，この考え方で列挙できています．
コードの実装もこのままです．

型などテンプレート化していないので，ライブラリとして使うなら，
ほかの人が作っているものを使うことをおすすめします．
N 個の文字を半分ずつ出力 (paizaランク D 相当)

今日の問題はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_step1

そんなに難しくない問題だと思って、
実際に下記のような回答を考えたのだが
`print(n+1)`のときにどうしても空白ができてしまうらしい。
print単独だと改行されるのは知っているが、空白になるのはなぜかわからず。

```python
N = int(input())
for i in range(N):
    if i+1 == N/2:
        print(i+1)
    else:
        print(i+1,end=" ")
```
仕方がないので下のようにprintして吐き出してもらった

```python
N = int(input())
for i in range(N):
    if i+1 == N/2:
        print(i+1)
        print('改行')
    else:
        print(i+1,end=" ")
        print('空白')

```
すると

	
1 空白
2 空白
3 空白
4
改行
5 空白
6 空白
7 空白
8 空白

という結果に。
つまり、この場合だと、８は空白でなくて改行しないといけないので
まちがっていることになる。
そのため、やり直し

```python
N = int(input())

for i in range(1, N + 1):
    if i % (N // 2) == 0:
        print(i)
    else:
        print(i, end=" ")
```
N // 2というのは、商を出すもので、
この場合だと、４で、余りがゼロだったら改行するというもの。
これならiが４でも８でも改行する。
このために１時間もかけてしまった。。。
Lambda コンソール上での SAM テンプレート

## はじめに

Lambda コンソール上でSAM テンプレートを生成出来るようになったみたいです。

- Application Composer にエクスポート
- ダウンロード

上記のどちらかできるみたいです。

## ダイアグラム/テンプレートの切り替え
それぞれの切り替えについて記載します。

## ダイアグラム
元々はこのダイアグラムだけでした。
こちらは、Lambdaを中心にコンポーネントの関連付けを視覚的に表示したものとなります。
- API Gateway
- Layers 
など

![スクリーンショット 2023-11-15 15.30.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/aa8b61a5-46f8-e43a-b7d9-a3f179915b0e.png)


## テンプレート

対象のLambdaを SAM テンプレートで表示することができるようになりました。

![スクリーンショット 2023-11-15 15.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/6b2b99d9-48b8-5d77-e5a1-9203e6ea848d.png)

テンプレートには統合されたサービスについてもエクスポートされます。
添付の内容で言うと、API Gateway についても設定が含まれた状態となっています。

![スクリーンショット 2023-11-15 15.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/fda4a30d-825e-3a73-596b-40636db106ed.png)

### Application Composer にエクスポート機能
![スクリーンショット 2023-11-15 15.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/996679df-6831-d5e7-3d66-4e031994c4b1.png)

クリックすると上記のような画面が出てきます。
「プロジェクトの確認と作成」をクリックします。

![スクリーンショット 2023-11-15 15.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/b40fb6e2-5747-cd60-3bd1-57b2234046f4.png)

Application Composer のプロジェクトが表示されました。


### ダウンロード機能
ローカルに、ダウンロードすることができます。
ファイルは、テンプレートファイル（xxx.yaml）と Zip（xxx.zip）をダウンロードすることができました。

ローカルで開発を進める際にすごく便利です。


### 「Application Composer にエクスポート機能」と「ダウンロード機能」の簡易比較


| Application Composer にエクスポート機能 | ダウンロード機能 |
| --- | --- |
| テンプレートのみ | ソースコード + テンプレート |

まだ十分に比較できていないので、後ほどこちらは更新します。

### まとめ
個人的にはものすごく改良だと思っています。
SAMを使う方は、Lambdaコンソールで設定する機会は少ないと思います。

Lambdaコンソールで作業をしていて、途中で他の方にバトンタッチする機会があれば、非常に役立つと思います。
sambaユーザ登録

sambaに新規ユーザを登録する際の覚え書き。

### 登録済みユーザの確認
```bash
pdbedit -L
```

pdbは"PasswordDataBase"のAbbreviationらしい。

### ユーザ登録
```bash
pdbedit -a 'username'
new password: 'password'
```
windows側(クライアント側)からアクセスする際、上記で登録したusernameとpasswordによって認証する。

### 参考
https://renoji.com/IT.php?Contents=OS_CentOS/Server_File/Samba_User_Registration.html
https://www.samba.org/samba/docs/current/man-html/pdbedit.8.html
pythonでExcelのデータの入力規則を設定する関数

# この記事で分かること
pythonのライブラリ`openpyxl`を使用して、エクセルの任意のセルにデータの入力規則を設定する方法を、備忘録がてらご紹介します。

# 結論
具体的な関数は以下です。
サンプルはリスト型の入力規則を設定する方法です。
```python
import openpyxl as xl
from openpyxl.worksheet.datavalidation import DataValidation

def create_data_validation_list(
    wb: xl.Workbook,    # 編集対象のブック
    ws_name: str,       # シート名
    choices: list,      # 選択肢のリスト
    add_range: str      # 単一セル
) -> None:
    ws = wb[ws_name]
    dv = DataValidation(
        type="list",
        formula1='"{}"'.format(','.join(choices)),
        allow_blank=True,
        showErrorMessage=True,
        errorStyle="warning",
    )
    dv.add(ws["{}".format(add_range)])
    ws.add_data_validation(dv)
```

上記の関数はこんな感じで使用します。
```python
# 編集対象ブック開く
filepath = 'test.xlsx'
wb = xl.load_workbook(filepath)

# ブックの最初のシート名を取得
ws_name = wb.sheetnames[0]

# 入力規則の選択肢
choices = ['○', '×', '△']

# "A1"セルに入力規則を適用
create_data_validation_list(wb, ws_name, choices, "A1")

# 保存
wb.save('output.xlsx')
```

上記のコードを実行すると、このように "A1" セルにデータの入力規則が設定されます。

![dv_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/780e4ceb-0e2e-c99d-aad2-532309451413.png)

# ほんのり解説
`openpyxl.worksheet.datavalidation.DataValidation`クラスをインスタンス化し、任意のセルに適用（add）することで、データの入力規則を設定することができます。

今回はリスト型の入力規則を設定しましたが、エクセルには様々な種類の入力規則があります。

![データの入力規則.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/3ece6b3c-2dfc-2301-55c2-82fd7583a1c0.png)

この種類は、`DataValidation`クラスの`type`プロパティで選択することができます。
各種類の設定方法は[公式ドキュメント](https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.datavalidation.html)を参照してください。

その他のプロパティに関しても記載されておりますので、軽く目を通すことをお勧めします。

# さいごに
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
xrdp にUSキーボードを接続した日本語Windows環境からリモートデスクトップした場合に日本語キーボードが使われれる問題のワークアラウンド

xrdpにUSキーボードを接続した日本語Windows環境から接続すると、日本語キーボードとして認識されて記号がまともに打てないなどの問題が起きることは広く知られている。

[https://gist.github.com/udnp/7d5697093cc94b473d53fdb4f8cdf41b](https://gist.github.com/udnp/7d5697093cc94b473d53fdb4f8cdf41b)

などなど。

よくわからないが、日本語WindowsからRDPをするとUSキーボードをつないでいても日本語キーボードの情報をサーバーに送ることが問題らしい…がそれだと対Windowsで問題が起きない理由がわからない。

そんなこと言っても仕方ないので、巷ではいろんな回避策があるのだが、全ユーザーに影響が及ぶことがあるため、日本語キーボードユーザーと同居した環境でこの問題を回避するのは比較的難しい。特にセッションを再開したときに日本語にリセットされる問題は `ReconnectScript` 、デフォルトでは `/etc/xrdp/reconnectwm.sh` にレイアウト変更を記述することになるが、各ユーザーの事情をシステムグローバルの設定に押し込むのは影響が無駄に大きいうえに、万一構文エラー等を起こすと巻き添えで他のユーザーもログインできなくなる。

というわけで、 `.bash_profile` にバックグラウンドでキーボードマップを監視して、定期的に `us` に書き直すというスクリプトを記述するワークアラウンドをここに示す。なお、ログインシェルは `/bin/bash` とする。

```bash:.bash_profile
if [ -v XRDP_SESSION ] && [[ "$0" == *startwm-bash.sh ]]; then
  setxkbmap -layout us
  (
    while true
    do
      sleep 5;
      if [ ! -d /proc/$PPID ]; then
        break
      fi
      if (setxkbmap -query | grep "^layout:" | grep -q "jp"); then
        setxkbmap -layout us
      fi
    done
  ) &
fi
```

なお、冒頭のifでそのbashがメインのウィンドウマネージャーの立ち上げようシェルだと判定しているが、ファイル名で検知していて若干ガバである。使う場合は注意されたい。
効率的なPythonリスト操作のための12個の関数

# はじめに
Pythonのリストはデータ操作の核となる部分で、その扱い方を知っておくことは非常に重要です。
この記事では、Pythonのリストを操作するための7つの組み込みメソッドを紹介します。

# 1. `len()`: リストの長さを取得
`len()`はPythonの組み込み関数で、リストだけでなく文字列やタプルなどのシーケンスの長さ（要素の数）を返します。リストに格納されている要素の数を知る際に非常に役立ちます。例えば、ループ処理でリストの全要素にアクセスする際などに、リストの長さを事前に知ることが重要です。
```python
my_list = [1, 2, 3, 4, 5]
length = len(my_list)
print(length)  # 5
```
この例では、my_listには5つの要素が格納されているので、len()関数は5を返します。

# 2. `append()`: リストの末尾にアイテムを追加
リストに新しい要素を追加する場合、`append()`関数を使用します。この関数は、指定した要素をリストの末尾に追加します。リストは動的にサイズが変更可能なので、必要に応じて要素を追加することができます。
```python
my_list = [1, 2, 3]
my_list.append(4)
print(my_list)  # [1, 2, 3, 4]
```
この例では、初めにmy_listには3つの要素が格納されていましたが、append()関数を使って4という要素を追加しました。

# 3. `extend()`: リストに複数のアイテムを追加
`extend()`関数は、リストに別のリスト（または反復可能なオブジェクト）の要素を一度に追加するために使用されます。これは、一つのリストの要素を別のリストに結合したい場合などに便利です。extend()を使用すると、元のリストが変更される点に注意が必要です。
```python
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1)  # [1, 2, 3, 4, 5, 6]
```

# 4. `reverse()`: リストの順序を反転
`reverse()`関数は、リストの要素の順序を反転させます。元のリストを変更するため、逆転前のリストを残しておきたい場合は、リストのコピーを作成することがおすすめです。
```python
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers)  # [5, 4, 3, 2, 1]
```

# 5. `insert()`: 指定した位置にアイテムを挿入
`insert()`関数は、指定した位置に新しい要素をリストに追加するための関数です。この関数は2つの引数を受け取ります。1つ目は要素を挿入したい位置（インデックス）で、2つ目は挿入したい要素です。
```python
fruits = ["apple", "banana", "cherry"]
fruits.insert(1, "orange")  # 'orange'をインデックス1の位置に挿入
print(fruits)  # ['apple', 'orange', 'banana', 'cherry']
```

# 6. `sort()`: リストを昇順にソート
`sort()`関数を使用すると、リストの要素を昇順（デフォルト）にソートすることができます。逆順にソートする場合は、reverse=True引数を指定します。この関数は元のリストを変更するため、ソート前のリストを保持したい場合は、先にリストのコピーを作成してください。
```python
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
numbers.sort()
print(numbers)  # [1, 1, 2, 3, 4, 5, 5, 6, 9]
```

# 7. `count()`: アイテムの出現回数をカウント
`count()`関数は、リスト内の指定した要素の出現回数を返す関数です。この関数は、特定の要素がリスト内で何回出現するかを調べる際に役立ちます。
```python
numbers = [1, 2, 3, 2, 4, 2, 5]
count_of_twos = numbers.count(2)
print(count_of_twos)  # 3 (2が3回出現)
```

# 8. `remove()`: 指定した要素をリストから削除
このメソッドは、指定された値を持つ最初の要素をリストから削除します。該当の要素が存在しない場合はエラーとなります。
```python
numbers = [1, 2, 3, 2, 4]
numbers.remove(2)
print(numbers)  # [1, 3, 2, 4]
```

# 9. `pop()`: 指定したインデックスの要素をリストから削除し、その要素を返す
インデックスを指定しない場合、リストの最後の要素を削除し返します。
```python
numbers = [1, 2, 3, 4, 5]
popped_value = numbers.pop(2)
print(popped_value)  # 3
print(numbers)  # [1, 2, 4, 5]
```

# 10. `clear()`: リストの内容を全て削除
リストの全ての要素を削除し、空のリストにします。
```python
numbers = [1, 2, 3, 4, 5]
numbers.clear()
print(numbers)  # []
```

# 11. `index()`: 指定した要素のインデックスを取得
該当する要素がない場合はエラーとなります。要素が複数存在する場合、最初に見つかった要素のインデックスを返します。
```python
letters = ['a', 'b', 'c', 'd', 'e']
index_of_c = letters.index('c')
print(index_of_c)  # 2
```

# 12. `copy()`: リストの浅いコピーを作成
このメソッドはリストの要素を新しいメモリ領域にコピーします。このため、コピー先のリストを変更しても、元のリストは影響を受けません（ただし、リストの要素がオブジェクトの場合、そのオブジェクトは参照コピーされます）。
```python
original = [1, 2, 3, 4, 5]
copied = original.copy()
print(copied)  # [1, 2, 3, 4, 5]
```

# まとめ
Pythonのリスト操作を行う上で、これらの組み込みメソッドは非常に便利です。
これらのメソッドを駆使することで、コードが簡潔になり、より効率的なプログラムを作成することができます。
Remote Video Security Surveillance

Remote video security surveillance refers to the use of video cameras and technology to monitor and record activities in a specific area from a distant location. This technology enables users to keep an eye on their property, assets, or premises without physically being present at the location. Remote video security surveillance systems typically consist of cameras, recording devices, and network connections that allow real-time or recorded video footage to be accessed remotely.

Key components of remote video security surveillance systems include:

Cameras: These can be analog or IP (Internet Protocol) cameras that capture video footage. IP cameras are more common in modern surveillance systems because they can transmit data over a network, making it easier to access remotely.

Recording Devices: Video footage is often stored on digital video recorders (DVRs) or network video recorders (NVRs). These devices save the recorded video for later review.

Network Connection: Remote access is facilitated through a network connection, often using the internet. This allows users to view live or recorded footage from virtually anywhere with an internet connection.

Monitoring Software: Specialized software is used to manage and view the video feeds. This software may provide features such as motion detection, alerts, and the ability to control camera movements remotely.

Alert Systems: Some surveillance systems include alert features that notify users of specific events, such as motion detection or unauthorized access. These alerts can be sent via email, text messages, or push notifications.

Remote video security surveillance is commonly used for various purposes, including:

Home Security: Homeowners can monitor their properties remotely to enhance security and keep an eye on their homes and surroundings.

Business Security: Many businesses use remote surveillance to monitor their premises, deter theft, and ensure employee and customer safety.

Public Spaces: Government agencies and organizations may use video surveillance to monitor public spaces for security and safety purposes.

Industrial Facilities: Remote video surveillance is often employed in industrial settings to monitor critical infrastructure, ensure safety compliance, and prevent unauthorized access.

It's important to note that the use of video surveillance systems must comply with legal and ethical standards, respecting privacy rights and regulations. Additionally, the effectiveness of such systems depends on factors such as camera placement, image quality, and the ability to respond quickly to alerts.
![security-systems-for-storage-units.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621504/c31d8f39-6d9a-fc66-edad-e3f374e022d8.jpeg)


For remote video security surveillance systems,  https://mobilevideoguard.com
AWS Service Catalogの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAWS Service Catalogに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- AWS Service Catalogとは
- AWS Service Catalogの仕組み
- AWS Service Catalogのセキュリティ
- AWS Service Catalog for Advance

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- AWS Service Catalogがどういうサービスか説明できるようになりたい人
- AWS Service Catalogを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# AWS Service Catalogとは
AWS Service CatalogとはAWSで起動するサービス群をカタログとして管理できるサービスです。
AWS Service Catalogを利用することで、AWSに詳しくない人でも簡単にAWS上で管理されたサービスをローンチできます。

AWSには多数のサービスがあり、設定によっては大きなセキュリティホールを作り出すことも可能です。
そのため、管理者が許可したものを許可した設定以外で使ってほしくないという要望があるでしょう、
また、初心者にとってはとりあえず使って大丈夫なものを使って大丈夫な設定で気軽に試したいという要望もあるでしょう。

これらをかなえるのがAWS Service Catalogです。
試験の際にはガバナンス/コンプライアンス/一貫性を強化するために、という文脈で登場することが多いサービスです。

# AWS Service Catalogの仕組み
AWS Service Catalogは裏側に構成管理のためのCloudFormationと権限管理のためのIAMが存在しています。

![](https://storage.googleapis.com/zenn-user-upload/2e44aa1b22c2-20231115.png)

CloudFormationとIAMをAWS Service Catalogという形でくるみ、管理できるようにしているので管理者側で作成できる環境の定義、利用者側で起動可能なサービスをカタログから選択、という使い方ができるようになっています。

AWS Service Catalogを構成するのは大きく2つ、ProductとPortfolioです。

Productは1つまたは複数のAWSリソースから構成されており、実体はCloudFormationテンプレートです。
Productでアーキテクチャを定義し、CloudFormationテンプレートに落とし込んでいきます。

PortfolioはProductとその設定情報が複数集まったものです。
Productをどういった設定でだれがローンチできるかを決めています。

# AWS Service Catalogのセキュリティ
AWS Service Catalogには制約という機能があります。
制約にはテンプレート制約と起動制約があり、それぞれProductをデプロイする際にユーザへ許可する権限を制御できます。

テンプレート製薬はユーザが使用できる設定パラメータを制限します。
例えば起動できるインスタンスタイプを安いものだけに制限したい場合に利用できます。

一方、起動制約はProductあるいはPortfolio単位でCloudFormationの操作に制限をかけます。
例えば、EC2とRDSを使ったWebアプリケーションに関するCloudFormationだけを許可したい場合に利用できます。

# AWS Service Catalog for Advance
AWS Service Catalogを用いてCDを実現する場合のアーキテクチャについて解説します。
AWS Service Catalogの実体はCloudFormationなので、バージョン管理してCI/CDによる高速かつ自動更新を実装するのがAWSのベストプラクティスです。

一番簡単に実装する場合を下図にまとめました。

![](https://storage.googleapis.com/zenn-user-upload/e05714d7f493-20231115.png)

ほかにもCodePipelineも使いながらCIを入れることも可能なので、プロジェクトの要件を考慮しながら追加での実装をしていきましょう。

# まとめ
この記事ではAWS Service Catalogに関連する内容を超詳細にまとめました。

- AWS Service Catalogとは
- AWS Service Catalogの仕組み
- AWS Service Catalogのセキュリティ
- AWS Service Catalog for Advance

次回はElasticBeanstalkを超詳細解説します。
【備忘録】リモートホスト⇔ローカルホスト　ファイルの転送

## 本記事の内容
- リモートホスト（Linux）からローカルホスト（Windows）にファイルの転送をしたい。
- scpコマンドを使用したファイル転送を行なう。

## scpコマンドの使い方
### 構文
```
$ scp [オプション] コピー元　コピー先
```
### 使用例（リモート→ローカル）
```
# scp ユーザー名@リモートホスト名:転送したいファイルのパス名　ローカルの転送先パス名 
$ scp user@xxxxx:home/user/file.txt C:\Users\
```
＊ローカル→リモートの転送の場合は「コピー元」と「コピー先」を入れ替える。

### オプションについて（一例）
- -C : 通信を圧縮する
- -r : ディレクトリ内を再帰的にコピーする
- -v : プログレス情報を表示する

### 参照
この記事は以下の情報を参考にして執筆しました。
- [【scp】Linuxでリモート・ローカル間でファイルを転送するコマンド](https://uxmilk.jp/50946)
- [公開鍵認証とsshコマンド、scpコマンドの使い方](https://www.wakuwakubank.com/posts/490-linux-ssh/#index_id6)
Chat GPT先生が、静的型付けの強さを言語別に並べてみた。

# Chat GPT先生への質問

- Go, Scala, Swift, Objective-C, python, javascript, php , ruby ,C# , C++ ,JAVA,typescriptを静的型付の強い順に点数をつけて順番に並べて

# Chat GPT先生の回答

- 静的型付けの強さを比較することは主観的であり、言語のバージョンやコンテキストによっても変わることがあります。以下は一般的な感覚に基づいて、それぞれの言語に対して静的型付けの強さを1から10のスケールで点数をつけてみました。注意してください、これはあくまで簡単な比較であり、厳密な評価ではありません。

1. **C#:**
   - C#: 8.5

2. **C++, Java, Swift, TypeScript:**
   - C++: 8
   - Java: 8
   - Swift: 8
   - TypeScript: 7.5

3. **Scala, Dart:**
   - Scala: 7
   - Dart: 7

4. **Go, Objective-C:**
   - Go: 6.5
   - Objective-C: 6

5. **C:**
   - C: 5

6. **Python, PHP, Ruby:**
   - Python: 3
   - PHP: 3
   - Ruby: 3

7. **JavaScript:**
   - JavaScript: 2

これは、主観的な評価であり、各言語の静的型付けの強さはコンテキストによって異なります。また、最近のバージョンの言語は常に進化しており、新しい型に関連する機能が追加されることがあるため、最新の情報を確認することも重要です。

# 感想
- 面白い。
Put Predictions into Action with Next Best Action【要注意】


+ [Put Predictions into Action with Next Best Action](https://trailhead.salesforce.com/content/learn/projects/put-predictions-into-action-with-next-best-action)

# Create a Next Best Action Strategy

設定するオプションが全くない。

+ [I am not able to see any branch options for Branch Selector "Likelihood of Joining](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PxtjOSAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/013597ac-b807-e6ef-2714-23f1128453d0.png)

+ [](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PvzwESAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5b175e20-c7bb-fcee-9a22-1a3ab1e803f7.png)


------------

+ [【解答例】Layout Error in "Put Predictions into Action with Next Best Action: Create a Next Best Action Strategy" (Pt. 5)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Pz3oESAR)
コンテナってなんのために使うの？

## コンテナとは
１つのホストOS上で複数のアプリケーションの独立した実行環境を少ないリソースで構築する技術
**使用する一番の目的は作成したアプリの配布や共有を楽にするため。**
本記事は以下の記事を参考に作成しています。
https://future-architect.github.io/articles/20230614a/
https://thinkit.co.jp/article/17301


## コンテナの起源
UNIXの「chroot」というアプリケーションのファイルアクセスを特定のディレクトリ化に制限するための機能が起源だとされ、そこにメモリの管理機能やプロセス分離の機能が追加されたものがコンテナとなっていった。
![](https://storage.googleapis.com/zenn-user-upload/eaa98192e3fe-20231113.png)
参考：https://thinkit.co.jp/article/17301
↓
根本的にはアプリケーションの分離を目的としてコンテナが作られた！

## 仮想化技術との違い

### 仮想化
・一つのホストOS上で複数の仮想的なハードウェアを実行するための技術
・コンテナよりもリソース使用量が増えるが、分離性は高いためセキュアな環境を作成できる

### コンテナ
・VMWareなどのH/W仮想化 とは異なり、**OSそのものは共有**しているが名前空間の分離やリソースの割り当てを分離しているもの

![](https://storage.googleapis.com/zenn-user-upload/d7b60eb731d6-20231113.png)
参考：https://future-architect.github.io/articles/20230614a/

仮想化技術とコンテナ技術は組み合わせて使用されることが多い

## メリット

### 1. 開発者や環境ごとの差異を吸収できる
・チームで開発を進める際、MacとWindowsでローカル環境を実行する際にそれぞれ別の手順を実行する必要があり、手順書の作成が必要になる。
→ 境構築に時間がかかる

・アプリケーション用のミドルウェアやライブラリを開発端末にインストールして開発を進めるとアプリケーションのバージョン管理等が煩雑になる。
→ Dockerなどのコンテナ技術を使用するとDockerfileが存在していればコマンド一つでアプリケーションのビルドと起動が行えるので環境構築が素早く行える。

**・ローカル環境、テスト環境、本番環境で同じコンテナイメージを使用することで環境によって動かないという問題を無くすことができる**

### 2. 起動が高速（柔軟性）
・サーバー環境におけるメリットが大きい
→ オートスケーリング時の起動が素早くなり、**突発的な大量アクセス（スパイク）に対応**することができるようになる。
・一つのコンテナイメージから複数のプロセスを起動することでスケール速度を向上することができる。
![](https://storage.googleapis.com/zenn-user-upload/274fec07d7c3-20231114.png)

### 3. マイクロサービスアーキテクチャを導入しやすくなる
#### マイクロサービスアーキテクチャとは
・複数の独立した機能の組み合わせでサービスを構築する設計手法
・大規模サービスになるほどサービスを一元管理することが困難になるため、サービスの分割が必要になってくる。
#### マイクロサービスアーキテクチャとの相性
・各マイクロサービスを一つのコンテナとして開発することで、**迅速なデプロイやスケーリング**を行うことができる。
・コンテナイメージを作成することで開発環境構築のスピードを上げることができる。
学生としてFlutterKaigiのスタッフをしてきた

初めまして、さかいです。

東京で大学院生をしています。

先日FlutterKaigi2023が開催され、スタッフとして参加してきました。学生としてスタッフをやっているので、「カンファレンススタッフやりたいけど学生じゃだめかな？」「エンジニアの知り合い増やしたいけど、カンファレンススタッフどうなの？」という方の参考になれば幸いです。

# スタッフになったきっかけ

私は昨年の公式Twitterでの募集をきっかけにFlutterKaigiスタッフとなりました。当時はエンジニアの知り合いが少なく、新しい出会いがあれば嬉しいなという気持ちもありました。

FlutterKaigi2022ではハンズオンアシスタントとして活動していました。ハンズオンはオンラインで開催されたため、当日会場に行くことが出来ず少し寂しかったのを覚えています。この時に来年は現地スタッズとして参加することを決意しました。

# チーム分け

FlutterKaigi2023の開催が決まり、まずはチーム分けが行われました。昨年にノベルティの仕事も少し手伝わせていただいた関係でノベルティチームとして活動することとなりました。ノベルティチームの主な活動は前日までに完了するので、イベント当日は受付の役割も担っていました。

# ノベルティチーム

ノベルティチームとしての活動は、ノベルティを渡す目的の策定から始まります。目的が定まると次は渡すものを探します。できるだけ他イベントのノベルティと被らないように、日常使いできるノベルティを選びました。

渡すものが決まれば次ばデザインですが、ノベルティチーム結成時はスタッフにデザイナーがおりませんでした。このタイミングでウェブサイト担当としてデザイナーさんが加わり、ノベルティのデザインもお願いすることになりました。奇跡的にデザイン素人によるクソダサノベルティを回避することができました🙌

デザインが確定し、最後の大仕事は発注です。FlutterKaigi2023のノベルティの発注には基本的にラクスルさんを使わせて頂きました。データはillustraterで納品させて頂いたのですが、納品前のオンラインデザイン編集機能、オペレーターさんによる最終チェックのおかげで印刷を不備なく進めることが出来ました！

あとはノベルティが家に届くので、倉庫に一時的に送り、会場への発送手配をすれば完了です。200人分のノベルティを注文したので、六畳一間の自宅がダンボールで埋め尽くされたのもいい思い出です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396718/7700406a-cc9e-7693-4f7f-4d250d7c6fa3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396718/f1310cf3-3cca-7383-3b94-02204253407d.png)

# 当日

ドタバタの1日でした。午前中は登壇者・スポンサーブース控え室受付、午後は一般受付をしてました。常に何らかの作業をしていたのでセッションはほとんど見ることができませんでした。（会場にいながら配信で20分ほどみました）あとで動画がアップロードされたらたんまりみようと思います！

セッションの後は懇親会です。スタッフは懇親会の裏側で会場撤収のための現場復帰を進めてました。懇親会会場以外の撤収準備が終わった後はスタッフも懇親会へ参加させていただきました。これまでインターンでお世話になった方、懇親会で新しく知り合えた方、Twitterでは見かけたことのある方とたくさんお話しさせていただきました。スタッフ以外にもエンジニアの知り合いが増えるのは嬉しいですね！

# スタッフの方々

めちゃくちゃいい人ばかりです！

普段の準備はオンラインなので調節会う機会は少ないですが、オフラインで会えばそんなこともなかったかのように話しやすい方が多いです。新しいメンバーが加わったタイミングなどで懇親会もあるので、そのタイミングでも交流することが出来ます。

# 最後にスタッフに興味のある方へ

FlutterKaigi2023は楽しんで頂けましたでしょうか？いい学び・出会いを得られる場を提供できていたら幸いです。FlutterKaigi2024の開催は未定ですが、きっとやるでしょう。カンファレンスの運営に興味のある方は是非運営やりませんか？FlutterKaigiを一緒に盛り上げましょう！

学生であることが足枷になることはありません。そもそもFlutterKaigiのスタッフは有志によるボランティアなので、やる気さえあればなんでも出来ます！今年から若い年代の方も増えたので、年齢的な抵抗もなく活動することができます。

スタッフ募集に関してはまだ何も決まっていないので続報をお待ちください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396718/0f1eb9b8-6855-7e88-e63f-d384b5bd5d84.png)
手元のpackage.jsonに記載のversionを手軽に取得したい

手元で触り始めた package.json に記載の version 文字列を、とにかく手軽に取得したい。
かと言って、[`npm version`](https://docs.npmjs.com/cli/v10/commands/npm-version) ではないんだよな〜、という時。

## 取得方法

### jq

そこに `jq` があるなら。

```console
cat package.json | jq -r '.version'
```

### jq (container)

そこに `jq` はないが、 `docker` があるなら。

```console
cat package.json | docker run --rm -i ghcr.io/jqlang/jq -r '.version'
```

### node

そもそも package.json の話をしているくらいだから、`node` がありそうな予感。

```console
node -p 'require("./package.json").version'
```
pyenv versionコマンドに対して「FATAL: Found ... version before pyenv in PATH.」というエラーが表示され、環境変数の順番を確認しても改善しないときの対処法

## はじめに
先日pyenvのセットアップをやり直していたところ、表題の問題に遭遇し解決まで少し時間を要したため、ここに書き留めておきます。

## 注意事項
筆者はプロではありません。書かれている内容について誤りがないように注意は払っていますが、正しさの責任は取れませんので予めご了承ください。

## 実行時期
2023年11月

## 環境
Windows11

### 1. 状態の確認

Windows PowerShellを起動し、以下のコマンドを実行してください。

```shell
$Env:PATH
```

これで環境変数「PATH」の内容が順に表示されるはずです。基本的には「システム環境変数」→「ユーザー環境変数」の順に表示されるはずです。
ここで、以下の2点を確認してください。
なお、PCのユーザー名はuser、「FATAL: Found ...」で表示された「...」の部分のパス名を仮に「\to\error\path」とします。

1. 「C:\Users\user\.pyenv\pyenv-win\shims」または「%PYENV%\shims」と「C:\Users\user\.pyenv\pyenv-win\bin」または「%PYENV%\bin」がそれぞれ「\to\error\pathよりも先に書かれていること
2. 「C:\Users\user\.pyenv\pyenv-win\shims」または「%PYENV%\shims」と「C:\Users\user\.pyenv\pyenv-win\bin」または「%PYENV%\bin」がそれぞれ２回以上書かれていないこと

上記の条件を確認し、特に2.に違反している場合は２回目以降に登場する同じパスを削除して、それが反映されているか再度`$Env:PATH`で確認してください。

ここで、上の確認においてPATHの中に「%PYENV%」が一度も登場していない（「C:\Users\user\.pyenv\pyenv-win\…」の形で書かれている）のに表題の問題が生じている場合は、申し訳ありませんがこの記事の解決法は使えません。
そうでなはなく、「%PYENV%」がPATHの中に登場した方は、次に進んでください。

### 2. 対処法

1. Windows PowerShellを起動し、以下のコマンドを実行してください。

```shell
$Env:PYENV
```
2. 表示されたパス（デフォルトでインストールしていれば「C:\Users\user\.pyenv\pyenv-win」のようなパスが表示されるはず）をコピーしてください。
3. 環境変数の設定画面を開き、全ての「%PYENV%」を上でコピーした文字列に置き換えてください。例えば「%PYENV%\bin」は「C:\Users\user\.pyenv\pyenv-win\bin」のようになります。
4. 「OK」ボタンで環境変数の設定を閉じて、Windows PowerShellを再度新しく立ち上げ直し、`pyenv version`を実行するとエラーが解決されているはずです。解決していないときは`$Env:PATH`を再度実行し、変更が反映されているか確認しましょう。反映されない場合はPCの再起動を実行するのも一つの手です。