OmniAICreator/Qiita-1.07M huggingface dataset:
Snowflake入門チュートリアル(Zero to Snowflake)をやってみた

# はじめに
Snowflakeの手軽に試せるチュートリアルを見つけたのでやってみました。
[Snowflake の 30 日間無料トライアルアカウントを作成](https://signup.snowflake.com/)して、クレジットカードの登録なしで試せました。
チュートリアルは英語ですが、ブラウザの翻訳機能で日本語化してもそれほど違和感なく読めました。
若干おかしな翻訳部分もありますが、読み替えできる程度でした。

https://quickstarts.snowflake.com/guide/getting_started_with_snowflake/index.html#0

わかりやすく書かれていて内容はとてもよいのですが、全体像がよくわかっていないまま上から順に指示通りに作業を進めていると、黙々と作業をこなしてしまい、今、自分が何のためにどんな作業をやっているのか迷子になってしまいがちです。

最初に全体像が把握できていればよかったなと思ったので、整理しました。
- チュートリアルの目次
- ラボのシナリオ
- 作成するオブジェクトの全体像

# チュートリアルの目次
1. 概要
2. ラボ環境を準備する
3. Snowflake のユーザー インターフェイスとラボストーリー
4. データのロードの準備	
5. データのロード
6. クエリ、結果キャッシュ、およびクローンの操作	
7. 半構造化データ、ビュー、結合の操作
8. タイムトラベルの使用	
9. 役割、アカウント管理者、およびアカウントの使用状況の操作	
10. 安全なデータ共有とデータ マーケットプレイス	
11. Snowflake 環境のリセット	
12. 結論と次のステップ

実施時間は、全体で約90分程度です。

# ラボのシナリオ
Citi Bike は、米国ニューヨーク市にある都市全体の自転車共有システムです。
Citi Bike の分析チームは、蓄積したデータに対して分析を行い、自転車利用者をよりよく理解して、最適なサービスを提供したいと考えています。
ラボでは、大きくは以下の3つの観点で作業を進めます。

**・データのロード**
まず、自転車利用者のトランザクションの構造化データ(csv)を Snowflake に読み込みます。
次に、半構造化データ(JSON)である 気象データを使用して、自転車の乗車回数と天気の間に相関関係があるかどうかを判断します。

**・ロールの作成や特定のアクセス許可の付与など**
ジュニア DB管理者が Citi Bike に入社したので、ジュニア DB管理者用の SYSADMIN(システム定義のデフォルトロール) よりも権限が少ない新しいロールを作成します。

**・データ共有**
Citi Bike のアカウントと同じ地域に独自の Snowflake アカウントも持っている信頼できるパートナーがいるので、そのパートナーにデータ共有を行います。

# 作成するオブジェクトの全体像
ラボの作業では、データベース、テーブル、仮想ウェアハウス、外部ステージ、ロールなど様々なオブジェクトを作成していきます。デフォルトで用意されているものを使用する場合もあります。
今、自分がどこの何を作成しているのか迷子にならないように全体像を図示してみました。
全量を網羅できていないかもしれませんが、主要なオブジェクトは把握できると思います。
- 赤太字：手順内で新規作成しているオブジェクト名
- 黒太字：手順内で使用しているデフォルトのオブジェクト名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305774/7c2e68c6-72ac-161e-8b41-acfaf88f0c76.png)

# おわりに
Snowflakeの**基本的な機能を満遍なく触れる**内容になっているので、これからSnowflakeを勉強しようとする人に向いていると思いました。
これから試される方が、この記事を参考に迷子にならずにチュートリアルを進められると嬉しいです。
せっかくなのでもう少し他の機能も理解できるように、他のチュートリアルも試していきたいと思います。
Oracle Analytics Cloud：OCI Logging Serviceでログを取得する

# はじめに
OCIには、様々なログを一元的に収集するOCI Logging Serviceがあります。
ロギングサービスを使用すると、OCIのサービスのログを取得することができます。
今回は、Oracle Analtyics Cloud（**OAC**）のログを取得してみたいと思います。
# ポリシーの設定
次の2つのIAMポリシーを設定します。

```
allow group analytics_admins to manage log-groups in compartment myOACProduction
allow group analytics_users to read log-content in compartment myOACProduction
```

# ログ取得の設定
OCIコンソールにログインします。
「監視および管理」の「ログ・グループ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/80592e8e-9d45-c55f-c492-9398afd9fee4.png)
ログ・グループの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/fd6934af-dcfe-70ee-b733-a11fb508ad6b.png)
「名前」と「説明」を入力し、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/11d1c35d-e1a2-4055-18cf-33371176bbbf.png)
作成したログ・グループの詳細を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/11a64833-f684-2df8-403c-6ee6a943750e.png)
左のリソースの「ログ」を選択し、「サービス・ログの有効化」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ab359e47-9919-9e06-dc10-d2d6bf3cd65e.png)
サービスには「Analytics Cloud」を選択します。
リソースには、ログを取得したいOACインスタンスを選択します。
ログカテゴリを「Audit Logs」にして、ログ名を入力します。
最後に「ログの有効化」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/fbf96d3e-5058-bae0-a72a-d792adaafd2f.png)
しばらくするとログ作成が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7786d34e-7baa-9098-9329-b82b0376e198.png)

# OACで諸々操作
ログ取得の対象としたOACインスタンスにログインし、操作してみましょう。
分析やワークブックのCSV出力、ワークブックのプロパティ変更、フォルダ作成などをしてみました。

# ログの確認
コンソールからログを確認してみると、ちゃんとログ取得されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/3cb4cc71-a94c-955f-b914-753efae07be5.png)
それぞれのログエントリの下向き矢印をクリックして、詳細を確認することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/196dcf48-73c6-df73-1a2c-0089eb83b999.png)

# ドキュメント
こちらに公式ドキュメントがあります。

https://docs.oracle.com/en/cloud/paas/analytics-cloud/acoci/administer-services.html#GUID-EFE621A5-85F4-459D-96C2-0AEF3B837145

# ロギングサービスのチュートリアル
ロギングサービスに興味が出てきた方には、こんなチュートリアルもあります。
- [ロギング・サービスを使って3つのログを収集する](https://oracle-japan.github.io/ocitutorials/intermediates/using-logging/)
Static route 、aggregate route設定

https://qiita.com/virazoor/items/2607649857b982f3b515

以下は、JNCIA-DC試験範囲でカバーされる**スタティックルート**、**アグリゲートルート**、**生成ルート**のルーティングコンポーネントの設定、監視、トラブルシューティングの方法です。

## スタティックルートの設定
スタティックルートは、手動で設定されるルーティングエントリであり、通常はルーティングテーブルに動的ルートを追加するために使用されます。スタティックルートを設定するには、以下の手順を実行します。

- ルーティングテーブルにスタティックルートを追加するための「set routing-options static」コマンドを使用します。
- スタティックルートの条件を指定するためのプレフィックス、ネクストホップ、および優先度などのパラメーターを指定します。

 ## アグリゲートルートの設定
アグリゲートルートは、複数のプレフィックスを単一のルーティングエントリにまとめるために使用されます。アグリゲートルートを設定するには、以下の手順を実行します。

- 「set routing-options aggregate」コマンドを使用して、アグリゲートルートを設定するためのパラメーターを指定します。
- アグリゲートルートに含めるプレフィックスを指定するための「set routing-options aggregate route」コマンドを使用します。

## 生成ルートの設定
生成ルートは、ルーターのインタフェースに直接接続されたネットワークをルーティングテーブルに追加するために使用されます。生成ルートを設定するには、以下の手順を実行します。

- ルーティングテーブルに生成ルートを追加するための「set routing-options interface-routes」コマンドを使用します。
- インタフェース名、プレフィックス、およびその他のパラメーターを指定します。

## ルーティングコンポーネントの監視
ルーティングコンポーネントの監視には、以下の方法があります。

- 「show route」コマンドを使用して、ルーティングテーブルに表示されるルートの状態を確認します。
- 「show route protocol」コマンドを使用して、ルーターが特定のルーティングプロトコルから受信したルートを確認します。
- 「show route advertising-protocol」コマンドを使用して、ルーターが特定のルーティングプロトコルをして報告しているルートの情報を表示させることができます。
```
show route advertising-protocol ospf
show route advertising-protocol bgp
```
RubyでAtCoder ABC264(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC264のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - "atcoder".substr()
https://atcoder.jp/contests/abc264/tasks/abc264_a
```ruby:a-264.rb
l, r = gets.split.map(&:to_i)
s = "atcoder"
puts s[l - 1...r]
```

# B - Nice Grid
https://atcoder.jp/contests/abc264/tasks/abc264_b
```ruby:b-264.rb
r, c = gets.split.map(&:to_i)

def grid(a, b)
  if a == 1 || a == 15
    puts "black"
    exit
  elsif (a == 3 || a == 13) && 3 <= b && b <= 13
    puts "black"
    exit
  elsif (a == 5 || a == 11) && 5 <= b && b <= 11
    puts "black"
    exit
  elsif (a == 7 || a == 9) && 7 <= b && b <= 9
    puts "black"
    exit
  end
end

grid(r, c)
grid(c, r)
puts "white"
```
別解として公式解説を参考にしました。中央のマスから黒色のマスまでの距離が奇数であることを利用しています。
```ruby:別解
r, c = gets.split.map(&:to_i)

if [(r - 8).abs, (c - 8).abs].max.odd?
  puts "black"
else
  puts "white"
end
```
## 解説
黒色となる部分を列挙して探索しています。

# C - Matrix Reducing
https://atcoder.jp/contests/abc264/tasks/abc264_c
```ruby:c-264.rb
h1, w1 = gets.split.map(&:to_i)
a = Array.new(h1){ gets.split.map(&:to_i) }
h2, w2 = gets.split.map(&:to_i)
b = Array.new(h2){ gets.split.map(&:to_i) }

(0..h1 - 1).to_a.combination(h2).each do |y|
  (0..w1 - 1).to_a.combination(w2).each do |x|
    flag = true
    h2.times do |i|
      w2.times do |j|
        if a[y[i]][x[j]] != b[i][j]
          flag = false
          break
        end
      end
      break if !flag
    end
    if flag
      puts "Yes"
      exit
    end
  end
end
puts "No"
```
## 解説
h, wがともに10以下と小さいので全探索できます。combinationメソッドを使って順にbと一致する場合があるか調べていき、一致する者があればYesを出力して終了、最後まで一致するものがなければNoを出力します。

# D - "redocta".swap(i,i+1)
https://atcoder.jp/contests/abc264/tasks/abc264_d
```ruby:d-264.rb
s = gets.chomp

ans = 0
"atcoder".chars.each do |c|
    ans += s.index(c)
    s.slice!(c)
end
puts ans
```
## 解説
（公式解説を参考にしました）

文字を目的の文字列（この問題ではatcoder）におけるインデックスに置き換えて探索する転倒数を利用して解くことができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
Beamerとパワポ・Keynoteを併用する

Beamer vs パワポ論争がありますが、どっちも使えばいいじゃんって思います。

パワポ・KeynoteのサイズをBeamerに合わせれば、違和感なく合体できるので、併用可能だと思います。

# サイズ
[参考](https://tex.stackexchange.com/questions/542215/beamer-presentation-with-169-aspect-ratio-and-same-height-as-43-aspect-ratio)
| |aspectratio|mm|pt|
|--|--|--|--|
|Beamer デフォルト|4:3|128 by 96|364.2 by 273.15|
|Beamer デフォルト|16:9|160 bt 90|455.24 by 256.07|


# Tips
- `\addtocounter{framenumber}{x}` で x ページ分スキップできる。
- `\usepackage{pdfpages}` であるPDFのページをそのまま挿入できるパッケージ。
- `\includepdf[pages=2]{intro.pdf}` だったら、`intro.pdf` の2ページ目を挿入。
Create a condition for request count

```python
from google.cloud import monitoring_v3
from google.oauth2 import service_account

# 認証情報を指定してクライアントを作成する
credentials = service_account.Credentials.from_service_account_file('<path-to-service-account-key-file>')
client = monitoring_v3.AlertPolicyServiceClient(credentials=credentials)

# Cloud Runサービスのリビジョン名を指定する
service_name = '<your-service-name>'
revision_name = '<your-revision-name>'

# アラートポリシーを作成する
alert_policy = monitoring_v3.types.alert_pb2.AlertPolicy()
alert_policy.display_name = 'Cloud Run Alert Policy'

# インスタンス数の条件を追加する
instance_condition = alert_policy.conditions.add()
instance_condition.display_name = 'High instance count'
instance_condition.condition_threshold.filter = f'metric.type="cloud_run_revision_instance_count" resource.type="cloud_run_revision" resource.label."service_name"="{service_name}" resource.label."revision_name"="{revision_name}"'
instance_condition.condition_threshold.duration = {'seconds': 60}
instance_condition.condition_threshold.threshold_value = 50

# 通知チャネルを設定する
notification = monitoring_v3.types.Notification()
notification.type = 'pubsub'
notification.pubsub_topic = '<your-pubsub-topic>'
alert_policy.notification_channels.add(topic_name=notification.pubsub_topic)

# 通知チャネルの追加情報を設定する
notification_config = monitoring_v3.types.AlertPolicy.NotificationConfig()
teams_channel = monitoring_v3.types.NotificationChannel()
teams_channel.type = 'microsoft_teams'
teams_channel.display_name = 'My Teams Channel'
teams_channel.user_labels['channel_address'] = '<your-teams-channel-webhook-url>'
notification_config.alert_history_window = {'seconds': 3600}
notification_config.channels.append(teams_channel)
alert_policy.notification_config = notification_config

# アラートポリシーを作成する
project_name = f'projects/{project_id}'
alert_policy = monitoring_v3.types.AlertPolicy()
alert_policy.display_name = 'My Alert Policy'
alert_policy.combiner = monitoring_v3.enums.ConditionCombinerType.AND.value

# Set the notification channel
alert_policy.notification_channels = [teams_channel.name]

# Create the alert policy
alert_policy = client.create_alert_policy(project_name, alert_policy)
print('Created alert policy: {}'.format(alert_policy.name))


```
propsの扱い方

最近、Reactを初めて触ったのですが、ほかの言語を学んでいるとpropsの扱いがかなりややこしかったので、備忘録としてまとめます。

例えば、こんなオブジェクトを用意します。
```
const RecipeInfo = {

		// 料理名
		title : '',
		
		//コメント
		comment : '',
		
		//材料
		ingredients:[
		],

		//手順
		procedure:[
			
		],
	}

const [recipe, setRecipe] = useState(RecipeInfo);
```
これは、初期値RecipeInfoをrecipeにセットします。さらにrecipeの値を更新したい場合は、setRecipeという関数で更新するというuseStateになります。

次に子要素にこれらの情報を引き継ぎます。下記のような記載になります。
```
{/* 料理名 */}
<RecipeTitle recipe = {recipe} ,setRecipe = {setRecipe}/>

{/* コメント */}
<RecipeComment recipe = {recipe} ,setRecipe = {setRecipe}/>

{/* 材料 */}
<Ingredient recipe = {recipe} ,setRecipe = {setRecipe}/>
```
細かい子要素の中身は割愛しますが、RecipeTitle、RecipeComment,Ingredientの３つの子要素に親要素が持っているrecipeとsetRecipeの情報を渡します。下記のようなイメージです。
![プレゼンテーション1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/32b3b15c-cc73-2aa9-81a5-ca1cfd031120.png)


次に子要素側でpropsを使って呼び出します。RecipeTitleの場合は、以下の通りになります。
```
function RecipeTitle(props) {
	//処理を書く
}
```
このときに、recipeのそれぞれの項目とセット関数を呼び出すにはどのように処理をかけばいいでしょうか？
答えは次の通りです。

```
function RecipeTitle(props) {
	props.recipe.title
    props.recipe.comment
    props.recipe.ingredient.プロパティ名
    props.recipe.procedure.プロパティ名
    props.setRecipe(更新する値)
}
```
となります。ややこしいので、一回整理します。

JavaやC言語などは関数の呼び出し元と呼び出し先が1:1で対応します。
イメージは次のようになります。
![プレゼンテーション2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/ad90600b-183b-c9fe-d407-90e4c0b177ba.png)
図のように呼び出し先の引数が２個なら、呼び出し元でも引数は２個、呼び出し先の引数が３個なら、呼び出し元でも引数は３個のように呼び出し先と呼び出し先で1:1で対応しているのが分かります。

対して、Reactのpropsのイメージは次のようになります。
![プレゼンテーション3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/026a58c4-d040-d6f5-529f-f3434376f1c9.png)
先ほどは1:1であったのに対して、今度は1:多の関係になっています。
呼び出し元で引数を追加しても呼び出し先はソースを変更する必要がありません。
そのため、呼び出し先で値を参照する場合は、
・propsの中にあるレシピの中にあるタイトル(props.recipe.title)
・propsの中にあるレシピの中にある材料の中にある〇〇(props.recipe.ingredient.〇〇)
・propsの中にあるセット関数(props.setRecipe(〇〇))
のようにアクセスする必要があります。イメージはこんな感じです。
![プレゼンテーション4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/4c8496b2-8696-38f0-83b0-9230a171b505.png)
JavaやCであれば、一番上の階層のpropsがありません。recipe,setRecipeの階層からスタートします。


他の言語を経験している人だからこそ陥りそうな罠でしたので、あえて記事にまとめました。
参考にしていただければ幸いです。
と言ってもuseContextを使えば、わざわざ子要素に引き継ぐなんて考えなくてよいので、これらのことを気にする必要はありません。
useContextを使うことを推奨します。

それでは
【CKA-JP合格体験記】勉強で得たものを考える

# はじめに

CKA-JPに合格しました。勉強していく中で得たものについて徒然に書いていきます。
ちなみに合格ラインは66点で私は84点でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/d4aa7f8b-2f48-c584-7108-75d37ddd862d.png)

# CKS受験に必要でした

まず受験の経緯ですが、CKS受験に必要だったためです。業務でKubernetesを使っていたため技術力を高めたいと思っていましたが、CKAには業務で使っていない内容が含まれており、あまりやる気は出ませんでした。。
以下のページにあるように、CKS受験には有効期限が切れていないCKAを持っていることが必要です。

https://training.linuxfoundation.org/ja/certification/certified-kubernetes-security-specialist-cks-jp/

# 実践的なKubernetes技術取得の証明になります

そもそも資格を取る目的として自分の技術証明があると思います。Kubernetes認定試験の場合は、選択式ではなく実際にコマンドを打って答えるので実践的な内容になります。
具体的にはkubectlでコンテナやサービスといったリソースを自分で作れる証明になります。

選択式の試験と比べると、難しいかどうかは好みによるかなと思っています。コマンドを打たねば答えられませんが、答えに至る方法は自由です。どこまでの回答があっているか確認用のコマンドを打つこともできます。問題文のやってほしいことを明確に理解できるのであれば、選択式よりも答えやすいのではないかと思っています。

# Kubernetesの基盤のイメージがわくようになりました

試験範囲ですが、以下のページが参考になります。

https://qiita.com/mochizuki875/items/a77d5c495d2fb99bd2f9

受験前にCKADは取っており、試験内容のかぶりがいくつかありました。
CKAのみの内容として、
* クラスタのバージョンアップ
* ETCDのバックアップ＆レストア
* Kubernetesリソース（Ingress、RBAC）
* kube-systemのコンポーネント（APIサーバー、DNSサーバー、CNI）

などがあります。

正直環境依存のものが多く、学んだことをそのまま業務に使えるとは思えませんでした。。
最近はマネジメントサービスでAWSのEKS、OCIのOKEなどがあり、Kubernetesの基盤は気にしなくても使えるようになっています。

ただ、いつも気にしないKubernetesの仕組みをより深く知ることができるのは面白いかもしれません。
またKubernetesリソースの使い方をさらに知ることで、今までマニュアルで何とかしていたことを、仕組みで解決できるようになるかもしれません。

## Kubernetesのネットワークの理解が深まりました

前提として、私は業務でKubernetesに触れていたため以前から知っている部分は多くありました。
まずコンテナというだけで、インスタンスのどこで何が動いているか知る必要があります。以下に参考にした記事を載せておきます。

https://qiita.com/zembutsu/items/24558f9d0d254e33088f

さらにKubernetesでは様々な通信が行き来しています。
Kubernetesのリソースを作成するにはAPIサーバーにアクセスします。

https://kubernetes.io/ja/docs/reference/networking/ports-and-protocols/

POD同士も通信します。Kubernetes内部にDNSサーバーがあり、名前解決も行っています。

https://kubernetes.io/ja/docs/concepts/services-networking/dns-pod-service/

さらにマネジメントサービスを使用していれば、クラウドベンダーのIPアドレスから通信が来ることもあります。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/sec-group-reqs.html

これらのことを知らないと、得体のしれないものが動いている感覚になってしまうと思います。
ネットワークの問題になったときに何がよくて何が悪いのかわからなくなります。

# Linuxに関する知識も身につきました

CKAではKubernetesのコマンドだけでは解けない問題も出てきます。
LPIではLinuCレベル2相当の前提知識が必要とされています。

https://lpi.or.jp/k8s/#CKA

一気に覚えるのが大変になりますが、KubernetesだけでなくLinux全般の知識が身につきます。
業務でもコンテナの動いている様子やアプリの管理に役立てられるので、ためになりました！

# おわりに

これで私はCKADとCKAを持つことになりました。Kubernetesを極めるため、CKSもとれるよう頑張ります！
Big Objects

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


# エラー

+ [検索時にmixed DML errorになる](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pecpz)


# 使用例

+ [Batch process which periodically archive SObjects to Big Objects : 定期的に保存させる](https://qiita.com/Keiji_otsubo/items/5ab78b06c91b8069249d)
【学習】Ruby on Rails チュートリアル 第7版 - 第1章ゼロからデプロイまで

5/9 8:15
・クラウドIDE(AWS Cloud9)
*セットアップなどに(OSの違いなどによる)バラツキが起きづらい
*環境構築が楽

・Ruby on RailsでWeb開発を行うための準備
*Cloud9のアカウント開設
*Cloud9の初期設定
 インデントはスペース2つ
*以下をインストール
 Rails 7.0.4
 ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
 Bundler version 2.3.14
・1.2まで終了
5/9 8:50

5/9 21:40
*AWS Cloud9 > Environments
 openをクリックして作成したクラウドIDEを開く。

*アプリの作成
rails newで
指定のディレクトリにRailsアプリケーションのスケルトンを作成

 rails _7.0.4_ new hello_app --skip-bundle
 ※railsのバージョンを指定。bundleコマンドをスキップ
 →インストールしたバージョンと互換性を保つ

*アプリに必要なgemsをインストール
 bundle _2.3.14_ install
 ※bundleのバージョンを指定。
 →インストールしたバージョンと互換性を保つ

*ローカルWebサーバーを起動
rails server

*Model-View-Controller（MVC）

Railsのコントローラ（controller）：Webサーバーへのリクエストを処理する
Railsのモデル（model）：コントローラとの対話から、データベースとの通信を行う。
Railsのビュー（view）：その名の通り。HTML　コントローラがブラウザに返す。

・1.3まで終了

5/9 22:25


5/10 8:15

・git/github
 ※バージョン確認
 git --version

　*クラウドIDEのGitをアップグレード
　source <(curl -sL https://cdn.learnenough.com/upgrade_git)
 →git version 2.40.1

 *パスワードの保持時間の設定※xxxxに秒数
 git config --global credential.helper "cache --timeout=xxxx"

 *gitの初期設定
  git init
　 ※rails new実行時にGitリポジトリも自動的に初期化しているが、
   常にgit initを実行する癖をつけておく。

 *githubにhello_appをpush

 *githubの操作練習
 gitでブランチ(modify-README)を作成し、
 README.mdを編集。
 add,commitしmainブランチにmerge
 そして、githubにpushを行った。

branchの移動は↓
switch
checkoutだと思ったが、checkoutとの違いは？

⇨git switchコマンドはブランチの切り替えを専用に行うコマンドでバージョン2.23でリリース。
https://qiita.com/RINYU_DRVO/items/958e0723178f88da8101

1.4まで終了

5/10 9:16

5/10 19:50

・Renderに作成したhello_appをデプロイ
“Advanced”設定にて
環境変数RAILS_MASTER_KEYを設定する際のvalueを
config/master.keyとしていた為、失敗した。
朝にやった方が集中できる。

githubへpushすると自動でデプロイされる。
https://hello-app-9i1q.onrender.com/
1章終了！

5/10 20:30
ルーティング インスタンス（RIB グループを含む）

https://qiita.com/virazoor/items/2607649857b982f3b515

# ルーティング インスタンス（RI）

JNCIA-DC資格試験では、ルーティング インスタンス（RI）およびルーティングインスタンスバックグラウンド（RIB）グループについての知識が求められます。以下にそれぞれの概要を説明します。

- **ルーティングインスタンス（RI）**：ルーティングインスタンスは、論理的に分離されたルーティングテーブルの集合です。つまり、各ルーティングインスタンスは、異なるルーティングプロトコルや異なるVRF（仮想ルーティングおよび転送）インスタンスなど、異なるルーティングテーブルを保持できます。

- **ルーティングインスタンスバックグラウンド（RIB）グループ**：ルーティングインスタンスバックグラウンドグループは、RIのルーティング情報ベース（RIB）を表すために使用されます。つまり、RIの各RIBグループは、そのインスタンスに関連する情報を収集・保持し、各ルーティングプロトコルの学習、フィルタリング、そして転送決定を実行するのに使用されます。


ルーティングインスタンス（RI）は、同じデバイス上で異なるルーティングプロトコルを実行する必要がある場合に、それぞれのルーティングプロトコルに対して独自のルーティングテーブルを作成することができるため、ネットワークの柔軟性を高めることができます。

例えば、BGPプロトコルでインターネットルーティングを行うRIを作成し、同じデバイス上でOSPFプロトコルを使用して内部ルーティングを実行するRIを作成することができます。

ルーティングインスタンスバックグラウンド（RIB）グループは、RI内の複数のRIBをグループ化して、同じルーティングプロトコルに関連する情報を管理するために使用されます。
各RIBは、同じルーティングプロトコルに関連する情報を管理するために使用されますが、同じルーティングプロトコルでも、異なるネットワークのセグメントに関連する情報を別々のRIBで管理することができます。

また、試験では、RIBグループの役割に加えて、RIBグループを構成するために使用されるフィルタリングオプション、およびRIBグループ間での経路交換に使用されるルーティングポリシーに関する知識も求められます。

# フィルタリングオプション
RIBグループを構成するために使用されるフィルタリングオプションとしては、以下のようなものがあります。

- **受信フィルタ**：RIBグループ内で学習された経路のうち、特定の条件を満たすものだけを選択することができます。例えば、プレフィックスの長さやプレフィックスリストに基づいてフィルタリングすることができます。

- **出力フィルタ**：RIBグループから広告される経路のうち、特定の条件を満たすものだけを選択することができます。例えば、宛先プレフィックスに基づいてフィルタリングすることができます。

- **サンプルリアルタイムフィルタ**：ルーティングテーブルの変化をリアルタイムで監視し、フィルタリング条件に一致する経路が変化した場合に通知することができます。

# ルーティングポリシー
RIBグループ間での経路交換に使用されるルーティングポリシーには、以下のようなものがあります。

- **インポートポリシー**：外部のルートを内部のルーティングテーブルに導入する際に、どのような条件を満たすルートを受け入れるかを制御するために使用されます。例えば、ルートのタグやルートのネクストホップなどに基づいてフィルタリングすることができます。

- **エクスポートポリシー**：内部のルートを外部のネットワークに広告する際に、どのような条件を満たすルートを広告するかを制御するために使用されます。例えば、ルートのタグや広告するネクストホップなどに基づいてフィルタリングすることができます。

- **ポリシー優先順位**：ルーティングポリシーが競合する場合に、どのポリシーが優先されるかを制御するために使用されます。
【Erroe】The POST method is not supported for route

### バージョン
Laravel9
Inertia
Vue3

# エラー

```
The POST method is not supported for route admin/purchases/store. Supported methods: GET, HEAD, PUT, PATCH, DELETE.
```

上記のエラーが表示されました。

# ルート

```php:
Route::resource('purchases', PurchaseController::class)
->middleware(['auth:admins', 'verified']);
```

ルートはresourceで一括で指定しており、コマンドで確認してもちゃんと通っているので問題ありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/b5b783c5-7a38-04df-b14d-0b0576a745dd.png)

# 原因
Vue側に問題がありました。

修正前
```php:
const storePurchase = () => {
    Inertia.post('/admin/purchases/store', form)
}

```

修正後
```php:
const storePurchase = () => {
    Inertia.post('/admin/purchases', form)
}
```

これで解決できました。
Pythonのlen関数の使い方

>1 行目で、整数 N と、続けて N 個の文字列 s_1, ... , s_N が半角スペース区切りで与えられます。s_1, ... , s_N を改行区切りで出力してください。

という**paiza**問題集のプログラム問題を実装しました

```Python3
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！
data = input()
array1 = data.split(' ')
for i in range(1,len(array1)):
    print(array1[i])

```
Supabase: ロールに割り当てられたカラムの権限を確認するSQL

Supabaseは、Firebaseに代わるオープンソースのアプリケーション開発プラットフォームです。データベースの管理や認証機能など、アプリケーション開発に必要な機能を提供しています。今回は、Supabaseで使用する、ロールに割り当てられたカラムの権限を確認するSQLについてご紹介します。

## SQLクエリ
以下のSQLクエリを使って、特定のロールがどのカラムにどのような権限を持っているかを簡単に確認することができます。

```sql
select grantee, table_name, column_name, privilege_type
from postgres.information_schema.role_column_grants
where table_schema = 'public'
  and grantee in ('anon', 'authenticated');
```

出力結果の例:


| grantee       | table_name | column_name  | privilege_type |
|---------------|------------|--------------|----------------|
| anon          | posts      | id           | SELECT         |
| anon          | posts      | title        | SELECT         |
| anon          | posts      | content      | SELECT         |
| anon          | posts      | author_id    | SELECT         |
| authenticated | posts      | id           | SELECT         |
| authenticated | posts      | title        | SELECT         |
| authenticated | posts      | content      | SELECT         |
| authenticated | posts      | author_id    | SELECT         |
| authenticated | posts      | id           | INSERT         |
| authenticated | posts      | title        | INSERT         |
| authenticated | posts      | content      | INSERT         |
| authenticated | posts      | author_id    | INSERT         |
| authenticated | posts      | id           | DELETE         |


## クエリの解説
- `grantee`: 権限を持っているロール名です。
- `table_name`: 権限が割り当てられたテーブル名です。
- `column_name`: 権限が割り当てられたカラム名です。
- `privilege_type`: カラムに対する権限の種類です（例：SELECT, INSERT, UPDATE, DELETEなど）。

`information_schema.role_column_grants`というテーブルを使って、特定のスキーマ（この例では`public`）に属するテーブルのカラム権限をリストすることができます。例では、`anon`（匿名ユーザー）と`authenticated`（認証済みユーザー）という2つのロールの権限を確認しています。

## 結果

このクエリを実行すると、各カラムの権限とロールを一覧で確認でき、どのロールがどの権限を持っているかひと目でわかります。これにより、セキュリティポリシーやアクセス制御を適切に管理することが容易になります。

## 関連

https://qiita.com/suin/items/63b127e2cc5dc4ea87e5
ST7735でテキストの表示(128x160)(STM32F767)


目的
初期化をキレイしてテキストを表示


96x64と240x320との中間的なサイズ128x160

![o_cop494.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6410516b-131e-4e2d-f457-eda2108bd2fd.jpeg)

![o_cop495.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e23c19a1-5d8a-87eb-2f9c-29cf5f6727d1.jpeg)

![o_cop496.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/158718db-9198-4553-2bfd-aaae0bf498b6.jpeg)

![o_cop497.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e138f3a8-299e-e537-7108-1437c8c7b4dd.jpeg)


```c++



//st7735_text_test1_071

//インクルド
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

//ピン定義
// For the breakout board, you can use any 2 or 3 pins.
// These pins will also work for the 1.8" TFT shield.
#define TFT_CS        10
#define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         8

//画面の定義
// For 1.44" and 1.8" TFT with ST7735 use:
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//初期化
void setup(void) {

  //シリアル
  Serial.begin(9600);
  Serial.print(F("Hello! ST77xx TFT Test"));

  //画面の初期化
  // Use this initializer if using a 1.8" TFT screen:
  tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab
  
  Serial.println(F("Initialized"));

  uint16_t time = millis();
  //画面のクリア
  tft.fillScreen(ST77XX_BLACK);
  time = millis() - time;

  Serial.print("[cls]");
  Serial.print(time, DEC);
  Serial.println("ms");
  delay(500);

  // テキストサイズを設定
  tft.setTextSize(3);
  // テキスト色を設定
  tft.setTextColor(ST77XX_WHITE);
  // テキストの開始位置を設定
  tft.setCursor(0, 10);


  // 1行目にUNOを表示
  tft.println("UNO");

} //setup


//メインルーチン
void loop() {
} //loop





```
AWS Rekognition × Laravel で画像認識して人数／人物別に分類してみた

# はじめに

Amazon Rekognition は機械学習を使用した画像認識を簡単に利用できるAWSのサービスです。そのサービスを用いた実装例として、今回は画像を人数／人物別に分類して一覧表示するアプリケーションを作成してみました。

GitHub からダウンロード可能です。

https://github.com/falya128/image-categorize  

Amazon Rekognition を用いたアプリケーション作成の参考にして頂ければ幸いです。  


# 機能説明

## 画面構成

### 人数別の画像一覧

アップロードした画像に写っている人数別に一覧表示できます。人数のボタンを押すことで切り替え可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339770/66aa3c0d-6e1d-1f74-fa47-2ea50aa03769.png" width="800" />

### 人物別の画像一覧

アップロードした画像に写っている人物別に一覧表示できます。顔のボタンを押すことで切り替え可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339770/696f0815-ec14-b055-e547-ca409f72c5dd.png" width="800" />

### 画像アップロードおよび削除

任意の画像を選択してアップロード可能です。複数枚のアップロードにも対応しております。  
また、アップロードした画像を一括で全て削除するボタンも設置しております。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339770/b497de80-aa67-d5e3-81dc-a556decc9c4a.png" width="800" />

## 技術構成

PHPのフレームワークである **Laravel** をベースとして構築しました。バージョンは 10 です。
また、バックエンドからフロントエンドへの橋渡しとして **Inertia** を使用しました。

フロントエンドは **Vue** で実装しております。
デザイン面ではUIフレームワークとして **Vuetify** を使用しました。

そして、重要な機能である画像認識は **AWS SDK for PHP V3** を用いて、Laravel から Amazon Rekognition API を呼び出すように実装しております。  

https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/API_Reference.html

## 処理概要

### 画像に写っている人数の検出
  
本アプリケーションでは、ファイルアップロード時に顔データを登録する Rekognition API「**IndexFaces**」を呼び出しており、そのレスポンスには画像に写っている人数分の顔データが含まれております。

https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/API_IndexFaces.html

そこで、レスポンスに含まれる顔データの数から人数を検出し、データベースに各画像に写っている人数を登録するように実装しました。

### 人数別の表示

データベースに登録された情報を基に分類して表示するだけで、シンプルな処理となっております。

### 画像に写っている人物の検出

Amazon Rekognition では管理したい単位でコレクションを作成して顔データを登録できます。本アプリケーションでは、（非効率ですが）初期表示のタイミングで Rekognition API 「**CreateCollection**」 を呼び出してコレクションを作成しております。
 
https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/API_CreateCollection.html

そして、ファイルアップロード時にRekognition API 「**IndexFaces**」を呼び出して顔データを検出し、Amazon Rekognition のコレクションへ登録を行っております。


### 人物別の表示

まずは Rekognition API 「**ListFaces**」 を呼び出して、コレクションに登録されているアップロードした画像の顔データを全て取得します。ただし、この状態では顔データを取得しただけの状態なので、ここから似ている顔ごとに整理する必要があります。

https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/API_ListFaces.html
  
そこで、取得した顔データをリクエストパラメータとして、Rekognition API 「**SearchFaces**」 を呼び出して、似ている顔を検索します。その際、全ての顔データごとにAPIを呼び出すと大量のリクエストを送ることになってしまうので、検索結果として返却された顔データは除外していき、リクエスト回数を減らすように工夫しております。

https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/API_SearchFaces.html

上記の手順を行えば、似ている顔ごとにデータを整理できるので、画像を人物別に分類して表示することが可能となります。

## おわりに

Amazon Rekognition の活用を目的として、画像を人数／人物別に分類して一覧表示するアプリケーションを作成してみました。  
AWS公式の開発者ガイドの情報を基に探り探りで実装したので、もっと良い方法があるのではないかと思いながらも、なんとか実現したいことは出来たので良かったです。
mbedでの基本的なI/O処理

mbedの一番基本的なI/Oを使った作成例です。
自分でも忘れてしまうので、敢えてアップして備忘録代わりにしてます。
マークダウンに慣れてないのでこちらにアップしました。
[mbedでI/O](https://yokaton.com/mcu-202305-mbedio/)
2023/5/9主にITとかセキュリティの記事

ChatGPTによる精度98％の異常に高性能なAI文字起こしソフトで、動画から記事を一瞬で作る方法（中嶋 よしふみ）(5/6)
https://agora-web.jp/archives/230503053415.html

健康保険証は廃止の方向でも「マイナ保険証」の利用進まず　来秋の一本化に不安の声(5/7)
https://news.yahoo.co.jp/articles/1ef7cd617636dc0bea26c2e0222b156b06279ade?source=rss

AIエンジニアは子会社で採用、高度人材獲得へあの手この手(5/8)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07955/

2022年のサイバー犯罪被害額　前時代的犯罪が首位の深刻な理由(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100113/042600106/

国交省の河川監視カメラ337台が停止、IoT端末なのに無防備で運用
国土交通省(5/8)
https://xtech.nikkei.com/atcl/nxt/column/18/01157/042800085/

名刺管理サービスにソーシャル攻撃の脅威、利用企業の不正ログイン対策は万全か(5/8)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07984/

「OSS版ChatGPT」が次々登場　その学習手法が物議を醸す訳(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100111/042600097/

楽天に謎のライバル「A社」登場　どうなるプラチナバンド巡る攻防(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100110/042700104/

20年前から指摘されていたプロジェクト成功に必須の力(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020900021/042600137/

ChatGPTの使いこなしが仕事に　注目のプロンプトエンジニア(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100112/042600068/

相手を引き付けて飽きさせない　効果的なプレゼン8つの秘訣(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/010500334/042600005/

定型作業から本来業務へ　マインドチェンジの実践法(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/033000349/042700002/

デジタル投資負担に苦しむ飲食店が売上高を増やす方法(5/8)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/040200037/042700079/
C# Windowsアプリ作成時 備忘録

## テキストボックスを数値のみ入力に制限する方法
https://stellacreate.com/entry/cs-textbox-number-only

* ImeModeプロパティをDisableに変更
* ShortcutsEnabledプロパティを(コピペ不可)Falseに変更
* ([カミナリマーク]をクリックして)KeyPressイベント入力欄に[txtNumOnly_KeyPress]と入力

### KeyPressイベント
```cs
private void txtNumOnly_KeyPress(object sender, KeyPressEventArgs e)
{
    //バックスペースが押された時は有効（Deleteキーも有効）
    if (e.KeyChar == '\b'){
        return;
    }

    //数値0～9以外が押された時はイベントをキャンセル
    if ((e.KeyChar < '0' || '9' < e.KeyChar)){
        e.Handled = true;
    }
}
```
14 Minesweeper Variants:Vanilla

[14 Minesweeper Variants](https://store.steampowered.com/app/1865060/14/) の自分用攻略メモです

# これはなに？

Steamにあるマインスイーパーのゲームです。
一般的なマインスイーパーと違い、以下のルールがあります。

* 必ず理詰めで解ける
* ？マスがある(そのマスに爆弾がないことのみわかる)
* 確定してないマスを開くかフラグを立てると、即座にゲームオーバー(エキスパートモード)
* 爆弾の配置ルールやマスにある数値のルールにいろんなバリエーションがある

要は、当てずっぽう禁止で、最小限のヒントが出るマインスイーパーです。

## バニラモードの攻略

バニラは通常のマインスイーパーと同じルールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/6c1d26d4-124e-4dbf-f60e-163c72036e02.png)

上記のような盤面の場合「青マスの爆弾数＝赤マスの爆弾数＋１」となります。
青マスに0個なら、赤マスに1個、青マスに2個なら赤マスに3個です。

灰色のマスはお互いが共有しているため、ここに爆弾があってもマスの差が付きません。
したがって、共有してないマスで差が付きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/dbf502f6-235e-bd75-ef4b-1b265ee485a6.png)
数値に3の差があると、一方が0個、他方が3個となり、完全に確定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/1befdba9-fa65-27b4-3f19-ba492adbf417.png)
片方が端っこの場合は0個扱いになります。

## 離れた共有

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/cbbf02fb-368b-f88b-16e6-02d0a692cd71.png)
隣接してない場合、共有してないマスが多くなるので確定とは程遠くなりますが、
それでも重要なヒントになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/0f2b32ed-f204-9354-9689-50f88d9843e9.png)
斜めだと共有マスが2個、この配置も稀に使います。

## 応用編

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/dbf59fab-1eb9-0fe1-0d90-b30835322f60.png)
121のルールです。
この場合、1の上下にのみ爆弾があり、それ以外が安全マスとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/43507984-166a-7def-f5bb-936c39f70c3c.png)
まず、2と4のマスから、赤＋青マスに2個爆弾があることがわかります。
そして、1のマスで、赤マスに1個だけとわかるので、青マスに爆弾が確定します。

3マスのうち、2マスに爆弾という状態は3通りあるため、
他のマスによって、この2マスに同時には存在しない、というヒントで1箇所確定します。

## 残り個数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/d199ee5b-fc88-110e-0bdc-114b8383d6a9.png)
この盤面で、爆弾が残り１個なら青マス、残り３個なら赤マスが確定します

1のマスによって、2マスのうちどちらか、という情報がわかっています。
青マスは両方のマスから参照されています。
残り1個の場合はここに爆弾がないと爆弾の数が足りません。

逆に爆弾が残り3個の場合、安全なマスは1マスのみです。
2マスのうち、どちらかに爆弾というのは、安全マスも1マスある、という意味です。
考え方は先程の爆弾1個と同じで、安全マスにしないといけない場所はどこなのか、と考えます。
Auto-GPT × Stable Diffusionの初期設定

# 環境
|     Name  |       Information |        
|:-----------------|:------------------|  
|OS|Microsoft Windows 11 Pro|
|version|10.0.22621 ビルド 22621|
|python|3.10.11|

# Auto-GPTのインストール

まず、はじめに...

多くのライブラリを使う(はず)なので、この後打つ、`pip3 install -r requirements.txt`を打つ前に仮想環境を作るのをおすすめします。仮想環境については色々ありますが、簡単なものは下のサイトが分かりやすいです。なお、pythonを既にインストールしている方などは、```virtualenv```や```anaconda```を使うかpythonを再インストールする必要があると思います。

https://www.python.jp/install/windows/venv.html

## インストール

[下のサイト](https://bocek.co.jp/media/service/902/)を参考にインストールし、環境ファイルの作成までを完了する。

 [**【完全自動型AI】AutoGPTを徹底解剖！使い方をご紹介**](https://bocek.co.jp/media/service/902/)

※2023/05/09 現在 pineconeはサインアップ後、waitingに入れられてすぐには使えない模様。大体5日くらいでメール届いて使えるようになる。
### [推奨]Vscodeのインストール

便利なので

# stable-diffusion-webuiと連携する

Auto-GPTフォルダ内の`auto_gpt_workspace`フォルダ(ない場合は作る)にstable-diffusion-webuiフォルダを入れる。

![スクリーンショット (609).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361032/a2797f20-a325-268c-4f11-1dee7c9fce90.png)

こんな感じの階層になればok

`stable-diffusion-webui`フォルダ内の`webui-user.bat`ファイルを編集。
`COMMANDLINE_ARGS=`に(=の後ろに)`--api`を書き加える

これでstable-diffusion-webui側の設定は終わり。

`Auto-GPT`フォルダ内の`.env`ファイルを編集する。
`IMAGE GENERATION PROVIDER`を探して、以下のように設定する。コメントアウト用の先頭の#は外すように。

```
IMAGE_PROVIDER= sdwebui
IMAGE_SIZE= [256, 512, 1024から選択]

HUGGINGFACE_IMAGE_MODEL= [適当なモデルを入力]
HUGGINGFACE_API_TOKEN= [huggingfaceのtokenを入力(readで良いと思います。) ※設定からコピーできる]
```
なお、対応しているモデルは以下にあるものだけのよう。

https://huggingface.co/models?pipeline_tag=text-to-image

Auto-GPTをドッカーで動かしたりする場合は、公式ドキュメントを読んで下さい。なくても多分動きます。

https://docs.agpt.co/setup/#running-auto-gpt

お疲れ様でした。これで動くはずです。

# 実行
```
cd Auto-GPT
python -m autogpt --gpt3only
```
※Auto-GPTのフォルダに移動してコマンドを実行して下さい。

適当なプロンプトを与えて動作テストしましょう。
errorが出た際はerrorメッセージ通りのことをすれば大体治ります。

分からないことやご指摘がありましたら、コメントお願いします。
慣性スクロールライブラリ Lenis

# official
https://lenis.studiofreight.com/
https://github.com/darkroomengineering/lenis

## npm package
```
$ npm i lenis
```

## usage
```
import Lenis from 'lenis'

interface Window {
  lenis: Lenis;
}

const lenis = new Lenis({
  lerp: 0.1,
  duration: 1.0,
  easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
  orientation: 'vertical',
  gestureOrientation: 'vertical',
  smoothWheel: true,
  smoothTouch: false,
  touchMultiplier: 2,
});

function raf(time) {
  lenis.raf(time);
  requestAnimationFrame(raf);
}

requestAnimationFrame(raf);

window.lenis = lenis;

document.querySelectorAll('a[href^="#"]').forEach(anchor => {
  anchor.addEventListener('click', (e) => {
    e.preventDefault();
    window.lenis.scrollTo(anchor.getAttribute('href'), {
      duration: 0.4,
    })
  });
});

```

スクロールバーを表示(機能)させたい要素に属性を指定
```
<div data-lenis-prevent></div>
```
クラウドってなに

## クラウド（Cloud）とは

インターネットを通じてサービスを提供する仕組みのこと
→サービスプロバイダーが自社のデータセンターでサーバーやネットワーク機器を運用し、顧客はインターネットを通じてそれらのサービスにアクセスすることができる

ユーザーが自社内でインフラやアプリケーションを運用する必要がない
→サービスプロバイダーがシステム運用を代行してくれるため、コスト削減や運用の効率化などのメリットがある

スケーラビリティが高く、需要が増加した場合でも柔軟に対応できる

## クラウドの種類

- IaaS（Infrastructure as a Service）：仮想マシンやネットワーク、ストレージなどのインフラストラクチャーを提供するサービス
- PaaS（Platform as a Service）：アプリケーションの実行環境を提供するサービス
- SaaS（Software as a Service）：アプリケーションそのものを提供するサービス


AWSやMicrosoft Azure、Google Cloud Platformなど、大手IT企業が提供するクラウドプラットフォームもある
CKA試験、Logs

# ログの出力

pod `custom-app`のログをモニタリングし、`file not found`ログを抽出し、`/var/CKA2022/custom-log001`ファイルに保存しなさい

```sh
kubectl logs custom-app | grep 'file not found' > /var/CKA2022/custom-log001
```


# リソスノ出力
`top` 命令語を利用する

```sh
kubectl top nodes --sort-by=cpu # cpu利用が多い順でNodeを出力
kubectl top pods --sort-by=memory # memory利用が多い順でPodを出力
```

# Json フォーマット
```
kubectl get pods -o json
kubectl get pods --sort-by=.metadata.name
kubectl get pv --sort-by=.spec.capacity.storage`
```

# クラスタリスト情報を確認する
`name=overloaded-cpu` ラベルを利用する`pod`の中でCPU消費率が一番多い`Pod`の名前を探して`/var/CKA2022/custom-app-log`に記録しなさい

```sh
kubectl get pod --show-labels | grep 'name=overloaded-cpu'  # ラベルを確認する
kubectl top pods --sort-by=cpu

# 'name=overloaded-cpu'ラベルを使うPodでCPU使用率が一番多いPodを`/var/CKA2022/custom-app-log`に記載する

```
CSVファイルを読み込む

## 概要
CSVファイルを一行づつ読み込んで表示する

## 手順
1. 読み込みたいファイルを開く
1. データを１行づつ読み込む
1. ファイルを閉じる

getData()を呼び出す形で実行することを想定。

```PHP
function getData(){

    //ファイルを開く
    $csvfile = fopen(__DIR__.'/../data/data.csv','r');

    //１行づつ読み込む
    while($line = fgetcsv($csvfile)){

        //読み込んだ1行づつを表示していく
        var_dump($line);
    }

    //ファイルを閉じる
    fclose($csvfile);
}
```
ファイルを`fopen(ファイルパス)`で開いて`$scvfile`に格納。
`fgetcsv()`でCSVファイルを１行づつ読み込み、`$line`に入れ込み、なくなるまで`while`文で回す。
whileの中で`var_dump`で＄lineの中身を１行づつ表示し、最後に`fclose()`で対象ファイルを閉じる。
エンジニアの基礎力アップ

どうもみなさんこんにちは。
エンジニアとして日々の成長は必要不可欠です。
プログラミングもそうですがエンジニアにはコミュニケーション能力も重要です。

# はじめに
最近できていないなと反省として思うところがあったので備忘録として残します。

* 指示に対して復唱できていない

一つ目の「復唱」は自分の理解力の確認です。聞いた瞬間はわかっているつもりでも作業を進めるとわからない瞬間が発生します。また、自分がどうやって作業を進めるかを考え時間ばかりが過ぎてしまいます。
上司から聞いた指示に対して自分の理解度を確認する。復唱することで自分がどこで悩んでいるかを特定することができます。作業に対してどうやって進めるか、手順を考えることで事前に躓くかもしれないポイントを押さえることができます。

# まとめ
自分の反省を言語化することは難しいですが恥じるものではありません。むしろ自分がよりよくなるための経験値です。比較するのは周りのメンバではなく昨日の自分と明日の自分なのです。
WebSocketについて

## Introduction

WebSocketは、Web上で双方向の通信を実現する技術です。以前は、Web上での双方向通信には、Ajaxを利用していましたが、Ajaxでは、通信を開始する側がサーバーにリクエストを送信し、サーバー側がレスポンスを返すという、単方向の通信しかできませんでした。しかし、WebSocketを利用することで、双方向通信が可能となり、リアルタイムな情報のやり取りや、マルチプレイヤーゲームなど、様々な場面で利用されています。

## WebSocketの特徴

WebSocketには以下のような特徴があります。

- リアルタイムな情報のやり取りが可能
- サーバーからのプッシュ通知ができる
- コネクションを維持し続けることができるため、効率的な通信ができる

## WebSocketの仕組み

WebSocketでは、クライアント側とサーバー側で、WebSocketプロトコルに則った通信を行います。クライアントが最初にサーバーに接続すると、サーバー側でWebSocket通信用のデータベースが作成されます。そして、クライアントとサーバー間でWebSocketプロトコルに基づいた通信が開始され、必要な情報が双方向でやり取りされます。通信が終了すると、WebSocket通信用のデータベースが削除されます。

## WebSocketの利用例

WebSocketは、リアルタイムな情報のやり取りが必要な場面で利用されます。例えば、株価情報のリアルタイム更新や、チャットアプリのリアルタイムなメッセージ受信などがあります。また、マルチプレイヤーゲームでは、WebSocketを利用してプレイヤー同士の情報のやり取りを行います。

## Conclusion

WebSocketは、Web上での双方向通信を実現するための技術であり、リアルタイムな情報のやり取りや、マルチプレイヤーゲームなど、様々な場面で利用されています。WebSocketを利用することで、サーバー側からのプッシュ通知も可能となり、効率的な通信が行えます。今後も、WebSocketを利用したアプリケーションの利用が増えることが予想されます。
RedAmberで書いたらこうなる - pandasのquery

# RubyのデータフレームライブラリRedAmberで解く

Apache Arrowを利用したRubyのデータフレームライブラリであるRedAmberを作っている鈴木(@heronshoes)です。

https://github.com/red-data-tools/red_amber

この記事は下記の記事に触発された紹介記事です。

https://qiita.com/sonota88/items/7c81beca2c86fdf21556

@sonota88さんはパーサに造詣が深いので、流石のアプローチだと思いました。
私も、[データサイエンス100本ノック（構造化データ加工編）](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)のRuby(RedAmber)版を作っているので、同じ 例題 -005 をやってみたらどうなるかご紹介したいと思います。

問題はこうです。
```
レシート明細データ（df_receipt）から売上日（sales_ymd）、顧客ID（customer_id）、
商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の全ての条件を満たす
データを抽出せよ。

- 顧客ID（customer_id）が"CS018205000001"
- 売上金額（amount）が1,000以上
```

これはこんな風に書けます。

```ruby
# 例1
df_receipt[["sales_ymd", "customer_id", "product_cd", "amount"]]
  .filter { |df| (df[:customer_id] == 'CS018205000001') & (df[:amount] >= 1000) }
```

RedAmberでは 列の中身のオブジェクトをVectorと呼んでいて、Vectorにはベクトル演算のメソッドとして`#==` や `#&` や `#>=` を持たせています。これらは演算子の再定義を使っているのですが、`&` はプリミティブな演算子としては優先順位が高いためカッコが必須となります。ちなみに優先順位が低い`&&`は再定義できないので使えません。

RedAmberによる書き方で私が一番好きな書き方はこちら。

```ruby
# 例2
df_receipt
  .pick(%i[sales_ymd customer_id product_cd amount])
  .filter { (customer_id == 'CS018205000001') & (amount >= 1000) }
```

例2で`filter`の括弧の中は、`instance_eval`を使って呼び出されていることと、列名である`customer_id`が`method_missing`のおかげで `self.customer_id` として呼び出されていることと、selfが省略できることが合わさって、このような書き方ができます。

ちなみに、もし列名がメソッド名にできない名前であった場合はこのように書きます。

```ruby
# 例3 列名がメソッド名にできない名前の場合
df_receipt
  .pick(:sales_ymd, :'customer-id', :product_cd, :Amount)
  .filter { (v(:'customer-id') == 'CS018205000001') & (v(:Amount) >= 1000) }

  # または
  # .filter { |df| df[:'customer-id'] == 'CS018205000001') & (df[:Amount] >= 1000) }
```

`DataFrame#v(:column_name)`は指定した列名のVectorを返すメソッドです。同じ働きをする
`DataFrame#[]`よりも少し速いというメリットがあります。

## 宣伝

RubyKaigi2023の3日目の午前中、Open StudioでRedAmberについて発表します。参加される方は現地でお会いしましょう！

https://rubykaigi.org/2023/presentations/heronshoes.html#day3

## 追記

[データサイエンス100本ノック（構造化データ加工編）](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)のRuby(RedAmber)版は現在作成中です。

Arrow 11.0.0では機能が不足していて書きにくかった設問があったので、機能をリクエスト&コントリビュートしたArrow 12.0.0を待っていました。今日(4/8)、[Red Arrow Gem も含めた12.0.0が無事リリースされた](https://arrow.apache.org/release/12.0.0.html)のでこれを利用したRedAmber 0.5.0へのバージョンアップを予定しています（RubyKaigiまでにできるかな...）。

## さらに追記(2023-05-25)

RubyKaigiまでに、どころか2週間もたってようやく[RedAmber 0.5.0](https://github.com/red-data-tools/red_amber/discussions/244)を出せました。なかなか出せなかった理由はArrow 12.0.0で新しくなったJoinを修正するのに時間がかかってしまったからです。100本ノック的には、join周りが少し速くなったはず（検証できてないですけど）なのと、前半の条件検索あたりの設問で部分文字列の検索が速くなったはず（検証できてないですけど）なのと、rankでtiebreakerのオプションが使えるようになったので設問19がスッキリ書ける（これは確認済）のがポイントです！

データサイエンス100本ノック RedAmber版も急がねば！
AWS Certified Machine Learning – Specialty＿勉強メモ（１日目）

# はじめに
今月末に標記の試験を受けようと思うので、大事そうなところのメモを残しておきます。

# 勉強メモ
・S3内のデータをSOLクエリを使用して分析したい時
&emsp;-Athena：S3に格納されたデータに対してクエリを実行できる。
&emsp;-Kinesis Data Analytics：S3に格納されたデータに対してクエリを実行できない。

・データ量が多すぎて、Athenaの実行速度が遅い時
    &emsp;-データをApache Parquet形式で保存する。

・AWS Batchとは？
　送信されたバッチ ジョブの要件に基づいて、最適な量とタイプのコンピューティング リソースを動的にプロビジョニングする。また、障害が発生した場合でもジョブを継続的に実行できる自動再試行メカニズムも提供。

・S3の種類
&emsp;-S3 Standard：
&emsp;-S3 Standard-IA：アクセス頻度の低いデータ用（すぐにダウンロード可能）
&emsp;-S3 Glacier Deep Archive：使わなくなったデータの保存（すぐにダウンロードできない）

・AWS Step Functionsとは？
&emsp;AWS Lambda 関数と複数の AWS サービスをビジネスクリティカルなアプリケーションに簡単にシーケンス化できるサーバーレス関数オーケストレーター。

・高価な GPU ベースのインスタンスに支払うことなく、推論ワークロードを加速したい時
&emsp;-Elastic Inferenceを使用する（TensorFlow、Apache MXNet、PyTorch、および、ONNXモデルをサポート）。

・Term Frequency - Inverse Document Frequency (TfIdf)とは？
&emsp;-テキスト データを機械学習モデルに渡すことができる数値表現に変換するために使用されるアルゴリズム。最初の関数 (Term Frequency) は、コーパスに属する文に単語が出現する頻度をカウントする。2番目の関数 (Inverse Document Frequency) は、単語がコーパス全体に出現する頻度をカウント。

・AWS Panoramaとは？
&emsp;機械学習アプライアンスおよびソフトウェア開発キット (SDK) であり、コンピュータ ビジョンをオンプレミスのカメラに導入して、高精度かつ低レイテンシーでローカルに予測を行うことができる。

・顧客が他の顧客の製品の好みとの類似性に基づいて購入する可能性が高い製品を予測するレコメンデーションシステムを作成したい時
&emsp;-Amazon EMR で Apache Spark を使用して、協調フィルタリング推奨エンジンを作成する。

・モデルのトレーニングに費やす時間を減らしたい時
&emsp;-トレーニングデータセットをprotobuf recordIO形式に変換し、SageMakerのパイプモードを使用してモデルをトレーニングする。パイプモードでは、S3から直接データをストリーミングするため速くなる。
※ Apache Parquet 形式ではパイプモードを使うことができない。

・AWS Data Pipelineとは？
&emsp;様々な、AWS コンピューティングサービスとストレージサービス、およびオンプレミスのデータソース間で、指定された間隔でデータを確実に処理および移動するのに役立つウェブサービス。このサービスを使用することで、保存されているデータに定期的にアクセスし、大規模に変換して処理し、その結果を Amazon S3、Amazon RDS、Amazon DynamoDB、Amazon EMR などの AWS のサービスに効率的に転送できる。

・Synthetic Minority Oversampling Technique (SMOTE)とは？
&emsp;置換によるオーバーサンプリングではなく、「合成」例を作成することによってマイノリティ クラスをオーバーサンプリングするオーバーサンプリング アプローチ.

# 参考
https://www.udemy.com/course/aws-certified-machine-learning-specialty-practice-exams-amazon
ローカルのプロジェクトをGithubのリモートリポジトリにアップロードする

# 前提
完全に備忘録です
- 新しくGithubでリポジトリ作った後，毎回エラーで何分か悩むので備忘録書きます

状態
- Github上に新しく作成したリポジトリが存在する
- ローカル上にアップロードしたいプロジェクトフォルダが存在する

# 1. Terminalでプロジェクトフォルダに移動
```
cd
cd myApp
```

# 2. Gitの初期化
gitで管理されていない場合以下を実行して初期化
- git statusを打ってfatal: not a git repository (or any of the parent directories): .gitって出る場合，git initする必要がある
```
git init
```

# 3. Gitコマンド
下のコマンドを打っていく
```
git add .
git commit -m "1st commit"
```

pushするとリポジトリが設定されていないと怒られる
```
$git push
atal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add <name> <url>

and then push using the remote name

    git push <name>
```

上の指示通りに（https://...はGithubリポジトリの右上の緑の「Code」をクリックすると表示される，SSHの場合はそっちでも良いけど設定とか必要だったはず）
```
git remote add origin https://github.com/ユーザ名/リポジトリ名.git
git push origin
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.
```

またなんか怒られたので上のコマンド通りに
```
git push --set-upstream origin master
```

これでエラーが出なければGithubのリモートリポジトリ上に反映されているはず

# まとめ
自分はいつも分かんなくなるし，以下のエラー循環地獄でよく分かんなくなるので，**この記事の手順を最初からやり直すのが一番速い**気がしますｗ（短期的思考...ちゃんと理解しろ...）
（隠しファイルの.gitフォルダを削除してから）

```
error: src refspec master does not match any
error: failed to push some refs to 'origin'

To https://github.com/y/x.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/y/x.git'

fatal: Need to specify how to reconcile divergent branches.

error: remote origin already exists.
```
本日の微分方程式（4日目）

なんとなく脳トレがてら1日1問解説しようと思っただけです．飽きたらやめます．

## 問題
```math
y^{\prime} = \frac{1}{x-y}.
```
## ポイント
- $x-y$ を置換すると変数分離形になるタイプだと気づけたら勝ちです．
    - 変数分離を行う際に，分母が0にならないか注意しましょう．

## 解説

$u = x-y$ とおくと，$y=x-u$ です．両辺を $x$ で微分すると，$y^\prime = 1-u^\prime$ が得られます．これを与式に代入することで，次のように $u$ と $x$ に関する変数分離形を作ることが出来ます．

```math
1-u^\prime = \frac{1}{u},\\
u^\prime = 1-\frac{1}{u},\\
\therefore u^\prime =\frac{u-1}{u}.
```

「本当にこれって変数分離形なの？」って思うのも無理ないです．わかりにくいよって方は，右辺を $\left(\dfrac{u-1}{u}\right)\times 1$ と見ましょう．$P(x)=1$，$Q(u)=\dfrac{u-1}{u}$ と解釈すれば，右辺は紛れもなく $P(x)\times Q(u)$ の変数分離形です．あとは力技で解いていきましょう．
ただし，変数分離を行う関係で $u-1$ が分母に来てしまうので，場合分けを行いましょう．

**① $u\neq 1$のとき**

```math
\begin{align*}
u^\prime &=\frac{u-1}{u},\\
\frac{u}{u-1}\frac{\mathrm{d}u}{\mathrm{d}x} &= 1,\\
\int\frac{u}{u-1}\frac{\mathrm{d}u}{\mathrm{d}x}\mathrm{d}x &= \int 1\mathrm{d}x,\\
\int\frac{u}{u-1}\mathrm{d}u &= \int 1\mathrm{d}x,\\
\int\frac{(u-1)+1}{u-1}\mathrm{d}u &= \int 1\mathrm{d}x,\\
\int\left(1+\frac{1}{u-1}\right)\mathrm{d}u &= \int 1\mathrm{d}x,\\
u+\log |~u-1~|&= x+C_1~~~(C_1:任意定数).\\
\end{align*}
```

さて，最後に得られた式は， 新たにおいた $u$ と $x$ に関する式なので，解答としては不完全です．$u = x-y$ とおいたことを思い出し，$y$ について解いておきましょう．

```math
\begin{align*}
u+\log |~u-1~|&= x+C_1,\\
x-y+\log |~x-y-1~|&= x+C_1,\\
\log |~x-y-1~|&= y+C_1,\\
|~x-y-1~|&= e^{y+C_1},\\
x-y-1&= \pm e^{C_1}e^{y},\\
x-y-1&= C_2e^{y}~~~(C_2\neq 0),\\
\therefore y+C_2e^{y}&=x-1.\\
\end{align*}
```

ここで，$C_2 = \pm e^{C_1}$ とおいています．
$y=e^x$ および $y=-e^x$ のグラフの漸近線が $y=0$ であるように，$C_1$ が任意の実数値を取るとき， $\pm e^{C_1}$ は0以外のすべての値をとるため， $C_2\neq 0$ とわかります．

**① $u=1$のとき**
$u=x-y$ とおいたのですから，$u=1$ のとき，$x-y=1\Leftrightarrow y=x-1$ を意味します．
$y=x-1$ が微分方程式 $y^{\prime}=\dfrac{1}{x-y}$ を満たすのか，忘れずにチェックしましょう．

```math
(左辺)=y'=1.
```

また，$x-y=1$ ですから，

```math
(右辺)=\dfrac{1}{x-y}=\dfrac{1}{1}=1.
```

よって，$(左辺)=(右辺)$ が成り立ちます．
ここで， $y=x-1$ は，解 $y+C_2e^{y}=x-1$ において $C_2 =0$ としたものと一致します．

最終的な答えは，両者の解を合わせて，

```math
y+Ce^{y}=x-1~~~(C:任意定数).
```

## 【参考】 多項式で構成された分数の積分

途中で出てきた，$\displaystyle\int\frac{u}{u-1}\mathrm{d}u$ ですが，いざ急に登場すると変形に困りますよね．
多項式で構成された分数の積分を行う上でポイントは，

1. 公式が使えないか？
1. 因数分解できないか？（実は約分できることも）
1. 分子の次数を下げられないか？

あたりです．地味に重要なのが，分子の次数を下げるという操作で，今回のように $1次式/1次式$ で構成されている場合は，多項式の割り算で分子の次数を0次式に下げることが可能です．

一般に，任意の1変数多項式の分数は，(分子の次数)$~<~$(分母の次数) にすることが出来ます．

今回で言えば， $\dfrac{u}{u-1}$ というのは，$u \div (u-1)$ を筆算してあげることで，

```math
u \div (u-1) = 1\cdots 1,
```

が導けるはずです（$1\cdots 1$ は，1余り1の意）．よって，

```math
\dfrac{u}{u-1} = u \div (u-1) = 1\cdots 1 = 1+\frac{1}{u-1},
```
とわかるわけですね．本編の解説では，割り算をせずに"つじつま合わせ"で変形していますが・・・．複数通りの解法を引き出しに持っておいて，自分のスタイルを持っておくことは重要です．

上記の変形がわかりにくい場合は，仮分数（分子が分母より大きい分数）を具体的な数字で考えてみて，一緒に比較してみてはどうでしょうか．

```math
\frac{7}{5} = 7 \div 5 = 1\cdots 2 = 1+\frac{2}{5}.
```

## 【参考】 Wolframalpha

非常に便利なので皆さん積極的に使っていきましょう．

https://www.wolframalpha.com/input?i=y%27+%3D+1%2F%28x-y%29&lang=ja
M5Stamp C3Uのplatformio.ini

# 結論
以下の```platformio.ini```で書き込めた。
書き込み時はM5StampC3Uのボタンを押しながら接続する。
ただ繋ぐだけではシリアルデバイスとして認識されない。
細かい設定とかは参照元から変更していないので、各々の環境に合わせて変更してください。

```platformio.ini
[env:esp32c3]
platform = 
	https://github.com/platformio/platform-espressif32.git
platform_packages = 
	framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git
framework = arduino
board = esp32dev
board_build.mcu = esp32c3
board_build.partitions = huge_app.csv
board_build.variant = esp32c3
board_build.f_cpu = 160000000L
board_build.f_flash = 80000000L
board_build.flash_mode = dio
board_build.arduino.ldscript = esp32c3_out.ld
build_unflags = 
	-DARDUINO_ESP32_DEV
	-DARDUINO_VARIANT="esp32"
build_flags = 
	-DARDUINO_ESP32C3_DEV
	-DCORE_DEBUG_LEVEL=2
	-DARDUINO_VARIANT="esp32c3"
monitor_speed = 115200
monitor_filters = time
```

# エラー

| 環境 |
|:-:|
|  windows11 |
|  vscode |

自分の環境ではgitをインストールするだけでした。
他にもエラーが出る可能性はありますが、適宜必要なものをインストールすれば問題ないと思います。


# 参考
https://github.com/platformio/platform-espressif32/issues/670

このissueで話されてました。大感謝です。
DockerでEclipseを動かしてみました：初心者、とりあえず動かすだけ

### はじめに
---
**DockerでEclipseを動かしてみました。**

最近Androidアプリだったり、Webアプリケーションだったりをちょこっと動かす度に開発環境のインストールから始めたせいで、色々PCのソフトウェアが煩雑になってきたので、よく考えたら開発環境もdockerで管理できるんじゃね？と思っての調査です。

### そもそもGUIってDockerで使えるの？
---
思いついてすぐ疑問に思ったのが、そもそもdockerではGUI使ったことない、というかGUIのソフトウェアを起動しても画面が表示されないということです。

それに関しては、Linux等UNIX系で使用されている**X Window System**というのが使えるようです。
イメージに書き起こしてみるとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/4cba0358-24ef-4c2e-ce69-d4547bf5c5df.png)

以下大変わかりやすい参考ページ
[参考ページ 1](https://ja.wikipedia.org/wiki/X_Window_System%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A8%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
[参考ページ 2](https://wa3.i-3-i.info/word13660.html)

### 環境構成
---
・My Windows PC :win10
・Docker Desktop 4.17.1

### X Serverをインストール
---
というわけで、My Windows PCにはX serverをインストールします。
調べてみると色々あるようですが、GUI表示だけとりあえずできればというのであれば、VcXsrvが良いと色々な場所で書かれていたので、私もそれに倣おうと思います。

VcXsrvの[公式サイト](https://sourceforge.net/projects/vcxsrv/)からダウンロードして、そのままインストール。
私はすべてディフォルト設定にしました。

### DockerFileを書いてみる
---
dockerのインストールに関しては、非常にわかりやすく解説された様々なサイトがありますので説明は割愛します。
特に特殊な設定はしていません。
[この辺](https://docs.docker.jp/engine/userguide/containers/dockerizing.html)のHello Worldが表示できればOKだと思います。多分…

まずはdockerfileを置く適当なディレクトリを作り、移動して下記のdokckerfileを作成します。

```
# 今回はJava 8を使いました。
FROM openjdk:8

WORKDIR /root/.local

RUN apt-get update

# Eclipse をインストール
# 後のdocker runコマンドで呼び出すために
# ln -s でeclipseのexeをsbin/eclipseにリンクします。

RUN wget http://ftp.jaist.ac.jp/pub/eclipse/technology/epp/downloads/release/2023-06/M2/eclipse-committers-2023-06-M2-linux-gtk-x86_64.tar.gz -O - | tar zxvf - && \
    ln -s /root/.local/eclipse/eclipse /usr/sbin/eclipse

# Eclipseを動かすためにlibswt-gtk-4-jniも入れます。
RUN apt-get install libswt-gtk-4-jni -y

# X Window Systemをインストール
RUN apt-get install x11-apps -y
ENV DISPLAY=host.docker.internal:0.0
```

dockerファイルを書いたフォルダに移動し、powershell等から下記のコマンドでdockerイメージをビルドします。
```
docker build -t eclipse .
```

無事ビルドが確認出来たら。
下記コマンドでdocker containerを作って実行します。
```
docker run -it --entrypoint eclipse --name dockerInEclipse eclipse
```

こんな感じで無事起動できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/001c7c26-a5ae-421f-6eca-01c9d4ea2c47.png)

### おわりに
---
いろんなサイトを参考にしつつ、とりあえずDockerでEclipseによるWebアプリケーションの開発が出来そうな状態にしてみました。
まぁ、起動できただけなので**日本語化**とかとか最低限必要な設定などもこれからですが、一旦**とりあえず動かすだけ**まではできたので、今回はこんな感じにしたいとおもいます。