OmniAICreator/Qiita-1.07M huggingface dataset:
ShellScriptでの並列実行は「&」で解決

これまでは直列でしかShellScriptを書いてきてなかったんですが、並列での実行を必要とするケースに直面したので、備忘録として残しておきます。

#### 登場人物
```
[並列実行させるスクリプトたち]
・script1.sh
・script2.sh

[実際に実行するスクリプト]
・execute.sh
```

#### スクリプトの中身
 - script1.sh
```
#!/bin/bash

sleep 3
echo "script1 : 3 seconds elapsed."
sleep 3
echo "script1 : 6 seconds elapsed."
```
 - script2.sh
```
#!/bin/bash

sleep 3
echo "script2 : 3 seconds elapsed."
sleep 3
echo "script2 : 6 seconds elapsed."
```

 - execute.sh
```
#!/bin/bash

date "+%Y-%m-%d %H:%M:%S"

# コマンド配列
commands=("./script1.sh" "./script2.sh")
for cmd in "${commands[@]}"; do
    # コマンドをバックグラウンドで実行
    eval "$cmd" &
done

# 全てのバックグラウンドプロセスが終了するまで待機
wait

date "+%Y-%m-%d %H:%M:%S"
```

#### 実行
```
$ ./execute.sh
2025-04-16 19:38:16
script2 : 3 seconds elapsed.
script1 : 3 seconds elapsed.
script2 : 6 seconds elapsed.
script1 : 6 seconds elapsed.
2025-04-16 19:38:22
```
`script1.sh`, `script2.sh`が並列で実行されていることがわかる。

#### 最後に
` > /dev/null &`でバックグラウンド処理させることは多々あったのに、1つのスクリプト内で並列処理できるってことまで考えが至ってませんでした。

ただ、並列実行処理で標準出力させると、コンソールが荒れるので、リダイレクトさせておいて、wait後に一括で吐き出したほうがよさそうです。

#### 参考
https://job-info.hateblo.jp/entry/2024/08/16/230606
xargsを利用するやり方もあるそう。
xcode capabilities 『Background Modes』の設定

### xcode capabilities 『Background Modes』の設定

赤丸をタブルクリック

![スクリーンショット 2025-04-16 19.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867059/4393d052-fbf2-4a0c-81db-ede64e0115cd.png)


すると、Xcode上に下記のように追加されます。

![スクリーンショット 2025-04-16 19.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867059/b371aa8d-cc8c-4333-9a13-c485cffeee8e.png)


OK!
[PowerBI] 視覚化タブのX, Y軸にデータをドラッグ＆ドロップ出来ない時の対処法

# まとめ
## 状況
- `視覚化`タブの`X軸`, `Y軸`にデータをドラッグ＆ドロップ出来ない
## 原因
- 読み込まれているデータが`String`型になっている

## 対処
- PowerBI内で対象のデータを`String`型から`Interger`型に変換する

# 詳細
## 対処法
1. `Home`から`Transform date`をクリックし、`Query Editor`を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/2e678825-07dd-4ab3-8b61-680adaeacb08.png)
1. `String`型から`Interger`型に変換したい列を確認する
1. 列名の前に`ABC`と記載があれば、`Interger`型でデータを取得してしまってる
1. `Query Editor`を閉じる
1. `Model view`を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/a7205819-09c0-495c-858d-15568fff3958.png)
1. `String`型から`Interger`型に変換したい列名をクリックする
1. `Properties`の`Date type`が`Text`と記載されていれば、`Interger`型でデータを取得してしまってる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/7a13ec09-9fae-4bac-8b74-1ce573d12b39.png)
1. `Text`から`Whole number`に変更する
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/500c4b8a-a57f-436d-9cf8-755e79504006.png)
1. `Report view`に戻る
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/c5f75082-d471-4e92-8968-ef4ddd391ece.png)
1. `Date`タブから、`Interger`型に変換したデータをX軸またはY軸にドラッグ＆ドロップする

# 参考リンク
- [Customize x-axis and y-axis properties](https://learn.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-customize-x-axis-and-y-axis)
-
roBa ZMK firmwareでロータリーエンコーダにマウススクロールを割り当てる

## はじめに
自作キーボードroBaのキーマップ編集は ZMK firmware を使用して行います

キーマップ編集にはGithubのアカウントが必要であり、手順はkumaさんが以下にて公開しておりますのでそちらを参考にしてください

https://github.com/kumamuk-git/roBa/blob/main/doc/v3/buildguide_v3.md#6%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97%E3%81%AE%E7%B7%A8%E9%9B%86

kumaさんが公開しているテスト用のファームウェアの場合、ロータリーエンコーダには`PAGE_UP`と`PAGE_DOWN`が割り当てられています

今回はそちらをマウススクロールに変更する手順を解説します

## 変更手順

githubの当該リポジトリで以下の２つのファイルを編集してください

- `zmk-config/config/roBa.keymap`
- `zmk-config/config/boards/shields/Test/roBa.dtsi`

### `roBa.keymap` 追記内容
以下３か所追記します
- スクロール量の定義の追記
- behaviorの追記
- 割り当てたいレイヤーに追加したbehaviorを追記
(別のものが割り当てられている場合は修正)


```roBa.keymap
// #includeのあとのあたりにスクロール量変更の定義を追記

#define ZMK_POINTING_DEFAULT_SCRL_VAL 80

// combosやmacrosと同じ階層に以下のbihaviorsを追記
// スクロール方向を逆にしたい場合は <&msc SCRL_DOWN> と <&msc SCRL_UP> を入れ替えてください

    behaviors {
        encoder_msc_down_up: encoder_msc_down_up {
            compatible = "zmk,behavior-sensor-rotate";
            label = "ENCODER_MSC_DOWN_UP";
            #sensor-binding-cells = <0>;
            bindings = <&msc SCRL_DOWN>, <&msc SCRL_UP>;
            tap-ms = <20>;
        };

// 設定したいレイヤーに sensor-bindings = <&encoder_msc_down_up>; を追記
// 以下は実際にレイヤー０に追記した例

    keymap {
        compatible = "zmk,keymap";

            L0 {
                    bindings = <
&kp Q           &kp L         &kp U         &kp COMMA  &kp EQUAL                                                     &kp F          &kp W  &kp R  &kp Y  &kp P
&kp E           &kp I         &kp A         &kp O      &kp MINUS             &kp LA(LEFT)                 &mkp MB3   &kp K          &kp T  &kp N  &kp S  &kp H
&kp J           &kp X         &kp C         &kp V      &kp PERIOD            &mkp MB1                     &mkp MB2   &kp G          &kp D  &kp M  &kp Z  &kp B
&kp LEFT_SHIFT  &kp LEFT_WIN  &kp LEFT_ALT  &mo 1      &mt LEFT_SHIFT SPACE  &mt RIGHT_CONTROL SPACE      &lt 2 TAB  &kp BACKSPACE                       &kp RS(RIGHT_CONTROL)
                    >;

                    sensor-bindings = <&encoder_msc_down_up>;
            };

        ・・・(省略)・・・
    };

```

### `roBa.dtsi` 修正内容
追記はしません
当該箇所を 12 から 24 へ書き換えてください
```roBa.dtsi
    left_encoder: encoder_left {
        compatible = "alps,ec11";
        a-gpios = <&xiao_d 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        b-gpios = <&xiao_d 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        
        steps = <24>;  // 値を12から24へ変更
        
        status = "disabled";
    };
```

上記２つのファイルを追記、書き換えすればロータリーエンコーダにマウススクロールを割り当てることができます

あとは上記の変更、保存後にビルドされたファームウェアを以下のkumaさんが公開している手順通り書き込んでください

キーマップのみの変更なのでトラックマウス側のマイコンにroBa_R-seeeduino_xiao_ble-zmk.uf2だけ書き込むのでOKです

https://github.com/kumamuk-git/roBa/blob/main/doc/v3/buildguide_v3.md#5-2%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E4%BB%AE%E3%81%AE%E6%9B%B8%E8%BE%BC%E3%81%BF
Node.js環境とブラウザ環境の違い


# はじめに
Node.js環境が必要な場合とそうでない場合(ブラウザ環境)との違いが分からなかったのでまとめました。

# 問題
javaScriptでグラフツールを作成する際、データのダウンロード機能に**ExceJs**（```npm install``` が必要）というエクセル操作モジュールを入れようとしてもブラウザ環境で動作しませんでした。

# 解決方法
モジュールバンドラ（Laravel Mix)でNode.js環境で動くモジュールでもブラウザ環境で動作できるようにする。

## **Node.js 環境がないブラウザとは？**
 Node.js は、通常、サーバーサイド（Web サーバーなど）や開発者のコンピューター上で JavaScript を動かすための「実行環境」です。ファイルシステムにアクセスしたり、ネットワーク通信を行ったり、OS の機能を呼び出したりといった、Web サーバーや開発ツールに必要な機能を提供します。
 `npm` でインストールする多くのライブラリ（特にバックエンドや開発ツール系のもの）は、この Node.js 環境で動くことを前提に作られています。`require()` というモジュールの読み込み方も Node.js の標準的な機能です。
 
## ブラウザ環境とは
一方、Chrome, Firefox, Safari といった Web ブラウザも JavaScript を実行する環境ですが、その主な目的は Web ページを表示し、ユーザー操作に応答することです。

:::note info
セキュリティ上の理由から、ブラウザの JavaScript は、ユーザーのコンピューター上の任意のファイルに自由にアクセスしたり、Node.js のような OS 機能を直接呼び出すことはできません。
:::


## Node.js 環境がないブラウザ
つまり、Web サイトを閲覧している一般ユーザーのブラウザには、Node.js がインストールされているわけではありません。
そのため、Node.js 特有の機能（`require('fs')` のようなファイルアクセスなど）や、Node.js の `require()` というモジュール読み込みの仕組みをそのままでは理解・実行できません。
これが「Node.js 環境がないブラウザ」という意味です。

## バンドル (Bundle) とは？
最近の Web 開発では、JavaScript のコードを機能ごとに別々のファイル（モジュール）に分割して書くのが一般的です（例: `header.js`, `form-validation.js`, `api-client.js` など）。また、`exceljs` のような便利な外部ライブラリ（これも多くのファイルで構成されています）を `npm` などでインストールして利用します。

これら多数の JavaScript ファイルを、そのまま `<script>` タグで一つ一つ HTML に読み込ませると、
- ブラウザがサーバーに何度もファイルを取りに行く必要があり、ページの表示が遅くなる。
- ファイル間の依存関係（「このファイルは、あのファイルが先に読み込まれていないと動かない」といった関係）の管理が大変になる。

なので、Node.js の `require()` や ES6 の `import` といったモジュール構文を、古いブラウザも含めて確実に解釈させたい。

### ★ バンドルの役割
「バンドル」とは、これらの問題を解決するための処理です。Laravel Mix のようなツール（内部では Webpack などが使われています）が、複数の JavaScript ファイルや、`node_modules` にインストールされた外部ライブラリ（`exceljs` など）をすべて解析します。
そして、どのファイルがどのファイルに依存しているか（`require` や `import` の関係）を把握し、それらを**一つ（または最適化のために数個）の大きな JavaScript ファイルにまとめる**作業を行います。このまとめる行為、またはまとめられたファイルの束（たば）を「バンドル」と呼びます。

## ブラウザで実行可能な JavaScript ファイルとは？

これは、上記「バンドル」処理の結果として生成される JavaScript ファイルのことです。

元のソースコード（複数のファイルに分かれていたり、Node.js の `require()` を使っていたりする）が、**ブラウザが直接解釈して実行できる形式に変換され、まとめられた状態**になっています。


# まとめ

### ■ Node.js 環境がないブラウザとは？
Node.js 特有の機能や `require` をそのままでは使えない、普通のユーザーのブラウザ。
### ■ バンドルとは？
複数の JavaScript ファイルやライブラリを、依存関係を解決しながら一つ（または少数）のファイルにまとめる処理。
### ■ ブラウザで実行可能な JavaScript ファイル
バンドル処理によって作られた、ブラウザがそのまま読み込んで実行できる形式の JavaScript ファイル。
IT業界未経験者が4日でAWS　AIFに合格した話

## 1. はじめに
・自己紹介
私は文系出身の２１歳で全くのIT業界未経験であり、もちろん今回受けたAWSの前提知識もなにもありませんでした。前職はコールセンター業務で電気とガスの提案業務を行っていました。
・取得したきっかけ
取得を目指したきっかけは私自身AIに興味があり昨今における生成AIでなにかと遊んでいました。そうしてAIに触れているうちにもっと深く知りたいと思うおようになり、AIの資格について調べました。
そうしたなかで見つけたのがAWS　AIFでした。
## ２. 勉強方法
ー使用教材は主に２つです
・UDEMY
https://www.udemy.com/share/10c9El3@gYyLUpLxMrYDR8FtDFJl992vcYbFDEEeAvYrboHzHMvR2tAZvsofdtvLkXi4r0-XMw==/
一通り授業と小テストを受けて最後に模擬試験が2回分ついている、内容は初学者にも分かりやすく非常に丁寧だった。

・模擬試験
https://explore.skillbuilder.aws/learn/signin
Udemyの講義と模擬試験をうけたあと実施し80％ほどとれた

## ３.受験
![IMG_7967.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063325/54abb8a0-8f73-45ac-b4ec-a5d29c6186ec.jpeg)
結果は737点と多少あぶなげはあるが合格することができた。１，２日で動画講義を視聴し３，４日でアウトプットを行った。4日前に申し込んだ理由としては長く学習機関をとると半ばだらけてしまうと思ったので試験範囲と内容を一読し、4日が最短だと思い試験を申し込んだ。結果としては合格したが内容理解についてはまだまだである。

## ３.今後
今回の資格勉強で深層学習や生成AIなどさまざまな人工知能について興味をもつことができた、またAWSについても今後個人的使用したいと思えるほど興味深い内容だった。
Firebase の App Testing Agent (Android) をためしてみる

最近出た Firebase App Distribution の App Testing Agent (Android) を軽く試してみました。

https://firebase.google.com/docs/app-distribution/android/app-testing-agent

前回の記事で作ったサンプルアプリをテスト対象に使ってみます。

https://qiita.com/mangano-ito/items/7329234f1118fc175fd8

## やりかた

まず、App Distribution にいままでと同じようにアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/3addc90d-a018-467e-b627-c293454f9eae.png)

で、上部にある導線から App Testing Agent にオプトインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/e2a262ef-c023-4e9c-a58d-73fbb0cd9a12.png)

そうすると、上部のタブに「テストケース」が増えました:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/5cef7e44-eb49-4496-b89b-60a5e1358865.png)

「新しいテストケース」を押すと、テストケースを指示するモーダルが出ますので、適当に入れます:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/c232592d-8801-4172-8ef2-0fb093952e10.png)

今回はただ単にアプリが起動することだけを確認してみます。こういう指示のしかたであっているのかは不明です。

保存するとテストケース一覧に追加されるので、実行したいテストケースをチェックして「テストを実行」してみます:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/f7ca028a-9d94-4de8-9199-b838b19ad255.png)

実行対象のビルドや認証情報の指定があるので、適当なものを選んで「テストを実行します」:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/e34b001e-4eb2-4779-b8a3-ea3052160eb6.png)

そうすると、該当のビルドで「アプリ テスト エージェント」の欄にテストの状態が出ます:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/e6a6f482-4e85-4374-9b4e-2142525d5195.png)

## 結果: 成功が期待される単純な起動チェック

終わったら結果が確認できました:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/a446d3ac-9cc9-4504-8847-fd91488dca09.png)

成功条件も解釈されていそうです:

> The app is displaying its main screen, indicating it launched successfully. The goal of launching without crashing has been achieved. 

Google Cloud Storage 上にテストのログや動画がアーティファクトとして残っていて便利です:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/d17d4076-038f-4d67-8921-5aae7410ac7a.png)

## 結果: 失敗を期待する UI の詳細のチェック

ホントに解釈されているのか、落ちる期待のテストケースを作って確認してみました。

﻿![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/7d8a978a-b347-4f6d-9c7f-39be71f32a82.png)

> The goal was to check if the color of the checkmark is red. The current color is blue, so the goal failed. 

ちゃんとチェックマークの画像が赤色ではなくて青色であることを認識してテストが失敗していそうです。

## 感想

UI 要素の見た目のチェックなど、真面目にテストを書こうと思うと大変になりそうなケースでも曖昧な指示で動いてくれそうなので、期待通り AI が活躍できる場面は多そうだなと感じました。対象の UI 要素を指定したりは、画像レベルでのチェックするのをコードで書くことは面倒ですが、これであれば容易です。

反面、今回確認していないところで画面遷移とか複雑な操作の指示があった場合は特に、プロンプトによってどういう動きになるか予測がつきづらいとか、基準が明でないあいまいさの弊害もありそうで表裏一体になりそうな気配もあり、実戦投入するとどんな感じになるかは未知数ですね。

でも、単純に便利で面白そうなので入れてみたいですね！ 以上です。
Reactで学習記録アプリ作ってみた

## 現在の状態
- Reactの公式ドキュメントの内容を5日間かけてインプット
- Reactの公式ドキュメントの内容をQiitaにアウトプット
- UdemyでReactの基礎動画を1つ受講
- Reactを学習し始めて合計10日間くらい

## 今回作ったもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/1124d65b-a751-4bb4-b457-974f140ad01d.png)

CSSなどのスタイルは一切なしのシンプルな学習記録アプリになります。
学習内容・時間の記録、記録した内容の表示、合計学習時間の表示
など少ない機能に見えますが、**Reactのstate機能**や**javaScriptの基礎**をきちんと理解していないと作成できないレベルでした。
## つまづいたこと
### stateの使い方
stateをセットするときに、次のレンダリングでようやく更新されることを忘れてセット直後に使用しようとしてエラーが出て困った。

### inputのvalueの扱い方
```e.target.value``` で ```input``` タグの入力値を取得できると理解できておらず、最初の方は入力しても真っ白な画面になりパニックになった（笑）

### デバッグ方法
僕は元々、組み込みエンジニアなのでデバッグ時はブレークポイントを気になる箇所に付けて、エラーが起こっている箇所を探していました。今回はReactということもありデバッグ方法がよく分からなかったのでとりあえずデバッグログを出すようにしてなんとかエラーは対処できました。



## 大事だと思ったこと
- 僕の場合は公式ドキュメントの内容を事前に少し入れていたおかげで、少しスムーズに進めることが出来たと思っています。（何回も公式ドキュメントを見たりせずに済んだ)
- アウトプットがめちゃくちゃ大事！！ドキュメントを読んだだけでは、**絶対にここまで定着していなかった**。公式ドキュメントのチュートリアルやUdemyで受講した時にアウトプットした内容と似た部分を今回はコードで書きました。
何回も書くことで自然に覚えることが出来ていた！！！
- stateの機能や、Reactのレンダリングの仕組みをきちんと把握して理解できていたからこそ、今回のアプリを完成させることが出来た
- エラーが起きたときはとりあえず ```cosole.log``` で確認しよう！！！

## 参考文献

[Reactでinput 要素が入力できない時の対応 | SCRAWLED TECH BLOG](https://scrawledtechblog.com/react-input/)

[【Reactでも使う】JavaScriptのreduceの使い方を解説](https://lorem-co-ltd.com/reduce-basic/)

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
HALとかBSPとかドライバとか

質問:「HAL、BSP、ドライバの違いは？
」
以下はChatGPTの回答。

---

めちゃくちゃ良い質問です！  
**HAL・BSP・ドライバ**の違いって、初心者にも上級者にも混乱しやすいポイントなんですよね。

順を追って、わかりやすく整理します！

---

## **ざっくり定義から：**

| 用語      | 役割・意味 |
|-----------|------------|
| **ドライバ** | ハードウェアを直接制御するコード（レジスタ操作など） |
| **HAL**     | ハード依存の処理を**共通化・抽象化**したインターフェース層 |
| **BSP**     | 特定のボードに依存した**初期化コードや設定集**（起動に必要） |

---

## **1. ドライバ（Driver）**

> **ハードウェアを直接制御するソフトウェア**。

- 最も下層、**レジスタを直接操作**してLEDを点けるとか、UARTを初期化する処理を書く
- 書き方もチップによって全然違う
- 移植性は低い（＝チップが変わると書き直し）

### 例（擬似コード）：
```c
*(volatile uint32_t*)(GPIO_BASE + OFFSET) |= 0x01;  // LED ON
```

---

## **2. HAL（Hardware Abstraction Layer）**

> **ドライバをラップして、誰でも使いやすくした共通インターフェース**。

- ドライバの上に乗る抽象レイヤー
- 同じAPIで、**違うチップでも同じように動く**ようにする
- アプリ開発者は、HALだけ知っていればOK！

### 例（STM32）：
```c
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
```

---

## **3. BSP（Board Support Package）**

> **特定のボード（開発基板）向けに準備された設定・初期化コード**のセット。

- CPUだけじゃなく、ボード全体（クロック、外部フラッシュ、GPIO配置）を初期化
- OSが起動するための最低限の「基板に依存したコード」
- HALやドライバを**このボード用にまとめて使えるようにしたもの**

---

## **関係性を図で表すと：**

```
[アプリケーション]
       ↓
     HAL（APIを提供）
       ↓
   ドライバ（レジスタ操作など）
       ↓
    ハードウェア

↑ BSPは、この構成を「特定のボード向け」にまとめたパッケージ
```

---

## **イメージ比較表：**

| 項目     | ドライバ | HAL | BSP |
|----------|----------|-----|-----|
| 抽象度   | 低い     | 中  | 高（ボード全体） |
| 対象範囲 | ペリフェラル単位（GPIO, UARTなど） | 同上 | ボード全体 |
| 移植性   | 低い     | 高い | 低め（ボード依存） |
| 提供内容 | 実装     | API + 実装 | 初期化 + 設定ファイル |

---

## **まとめ**

- **ドライバ**：ハードを直接叩く層（生の制御）
- **HAL**：ドライバをラップして抽象化したAPI層（共通的に使える）
- **BSP**：そのボードでソフトを動かすために必要な**設定・初期化コード集**

---

もし興味あれば、STM32やPico SDKの中で「これはHAL」「これはドライバ」みたいな具体例も一緒に見ていけますよ！やってみる？
Node.jsとは

## Node.js
　大量のリクエストを高速にさばくアプリケーションを作るためのプラットフォーム。
Node.js単体でWebサービスなどを作ることもできるが、どちらかというと大規模なシステムの大量のリクエストを高速にさばく必要がある部分（例えば、APIとかメッセージングの部分）などで使われたりする。
Gmail が有効化できない？原因はログインしてるアカウントだった…！

---

## 目次

- [はじめに](#はじめに)
- [この記事でわかること](#この記事でわかること)
- [こんな人に読んでほしい](#こんな人に読んでほしい)
- [背景と目的](#背景と目的)
- [使用したサービス](#使用したサービス)
- [やろうとしたことの全体像](#やろうとしたことの全体像)
- [詰まったポイント：ログインアカウントの罠](#詰まったポイントログインアカウントの罠)
- [表示されたエラー内容](#表示されたエラー内容)
- [本当の原因と解決方法](#本当の原因と解決方法)
- [まとめ](#まとめ)
- [おわりに](#おわりに)

## はじめに

会社用に独自ドメインのメールアドレス（例：`info@example.jp`）を作成するため、Google Workspace を導入しました。  
手順通りに進めたつもりだったのに、**DNSレコードは正しくても Gmail の有効化で延々エラー**。

「MXレコードが間違ってるのか？」「反映が遅れてるのか？」と何度も見直しては悩み……  
**結果的には「ログインしていた Google アカウント」が原因**というオチでした。

初歩的だけど見落としやすいこのトラップ、しっかりまとめておきます。

---

## この記事でわかること

- Google Workspace の設定時に「**ログインしている Google アカウント**」が正しくないとハマる理由  
- **TXTレコードの確認は通っても、Gmail の有効化は別問題**であること  
- お名前.com でのドメイン取得～DNS設定の流れ（軽く）  
- エラーを避けるための正しいログイン方法と手順  

---

## こんな人に読んでほしい

- Google Workspace を使って独自ドメインのメールアドレスを作ろうとしている人  
- お名前.com でドメインを取得し、DNS設定も済ませたのに、なぜか Gmail が有効化できない人  
- 「確認を完了できませんでした」エラーで何時間もハマっている人  
- 初めて Workspace を使う人、設定に自信がない人  

---

## 背景と目的

会社用のメールアドレスを用意するために、独自ドメインを取得し、Google Workspace を導入しました。  
目的は、Gmail をベースにした `info@〜` や `admin@〜` のような会社ドメインのアドレスを発行・運用することです。

---

## 使用したサービス

- ✅ **ドメイン取得**：[お名前.com](https://www.onamae.com/)  
- ✅ **メール運用基盤**：[Google Workspace](https://workspace.google.co.jp/)  
- ✅ **DNS設定・MXレコード編集**：お名前.comのコントロールパネル

---

## やろうとしたことの全体像

以下のような流れを想定して作業を進めました：

1. お名前.comで独自ドメインを取得（例：`example.jp`）  
2. Google Workspace にてアカウントを作成し、独自ドメインを追加  
3. ドメインの所有権確認（TXTレコードをDNSに登録）  
4. MXレコードを `smtp.google.com.` に変更し、Gmail を有効化  
5. `info@example.jp` などのメールアドレスで外部と送受信

しかしこの途中で、**「Gmailの有効化がどうしても通らない」問題**にぶつかりました。

---

## 詰まったポイント：ログインアカウントの罠

当初は、普段使っている Gmail アカウント（例：`you@gmail.com`）で Google Workspace にログインしていました。

でも実はこれが大問題。

### 😈 この状態でもできてしまうこと

- Workspace にドメインを追加  
- TXTレコードが発行される（＝所有権確認用）  
- お名前.comのDNSに登録 → 「確認完了」と表示される

**ここまで行けるので「もう使えるはず」と思い込んでしまいました。**

---

## 表示されたエラー内容

しかしその後、**Gmail の有効化で何度やってもこのエラー：**

```plaintext
現在確認できません

error  
確認を完了できませんでした  

次の方法をお試しください。  
確認コードのすべてのフィールド（ドメインホストのすべての文字を含む）が正しく入力されていることを確認してください。  
場合によっては、ドメインホストがインターネット上でコードを共有するまでに最長で 48 時間ほどかかることがあります。  
最新のステータスを再確認してください。詳しくは、ご利用のドメインホストにお問い合わせください。
```


📌 本来であればここでスクリーンショットを残しておくべきでしたが、うっかり忘れてしまいました……

---

## 本当の原因と解決方法

原因は、「**Google Workspace に登録されたドメインのメールアドレスでログインしていなかった**」ことでした。  
（例：`admin@example.jp` や `info@example.jp`）

個人アカウントでは、TXTレコードの発行まではできても、**Gmail有効化の“認証”は不可**。

---

### ✅ 正しい手順

1. 登録したドメインのメールアドレスでログインし直す  
2. Google 管理コンソールにアクセス  
3. Gmail の有効化を実行  
4. → 無事確認が通り、メール送受信ができるように！

---

## まとめ

- Google Workspace の設定は、**登録済みドメインのメールアドレスでログインして実施すること！**
- TXTレコードの確認が通っても、**Gmailの有効化は別物**
- スクリーンショットは忘れずに（←教訓）

---

## おわりに

DNS設定など技術的には問題がなくても、  
**“誰でログインしているか”という初歩的なミスで丸一日ハマることがあります。**

この記事が同じように困っている方の助けになれば嬉しいです！

---
【React】invalid input syntax for type timestamp with time zone エラーの解決方法

# はじめに
位置情報をテーブルへ保存する際以下のエラーが表示され、そちらの解決法について記事にします。

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

:::note warn
位置情報保存エラー invalid input syntax for type timestamp with time zone: "Tue Apr 15 2025 18:31:58 GMT+0900 (日本標準時)"
:::

【修正前】下記のように記述していました。
```.tsx
// users_locationﾃｰﾌﾞﾙに位置情報挿入
      if (userId) {
        const { error } = await supabase.from('users_location').upsert({
          id: userId,
          location: `SRID=4326;POINT(${longitude} ${latitude})`,
          updated_at: new Date().toString()
        }, { onConflict: 'id' })
        if (error) {
          console.error('位置情報保存エラー', error.message)
          toast.error('位置情報の保存に失敗しました');
        }
      }
```

テーブルもこちらで作成していました。
```.SQL
updated_at timestamp with time zone default now()

```

# 解決方法
テーブルの型に合わせISO形式に変換する

```.tsx
// users_locationﾃｰﾌﾞﾙに位置情報挿入
      if (userId) {
        const { error } = await supabase.from('users_location').upsert({
          id: userId,
          location: `SRID=4326;POINT(${longitude} ${latitude})`,
          updated_at: new Date().toISOString()
        }, { onConflict: 'id' })
        if (error) {
          console.error('位置情報保存エラー', error.message)
          toast.error('位置情報の保存に失敗しました');
        }
      }
```

# 参考

https://qiita.com/yuba/items/7852a29d63d6279c6f6e

https://zenn.dev/shimouta/articles/97995a29320fea

# おわりに
time zoneについて学ぶことができました。

<br>

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
exit(1)_備忘録

# exit(1)_備忘録
### 終了ステータスとは （wikipedia）

子プロセス（または呼び出された側）が具体的な手続きや委任されたタスクを実行完了した際、親プロセス（または呼び出した側）に渡す小さな数。

プログラムを実行するとき、オペレーティングシステム (OS) はプロセスと呼ばれる、プログラムの「活動実体」を生成し、その中にそのプログラムのための情報を保持する。UNIXやLinuxなどのマルチタスクOSでは、新たなプロセスは動作可能プロセスとして生成される。別のプロセスを生成するプロセスを「親プロセス」と呼び、生成された側を「子プロセス」と呼ぶ。子プロセスと親プロセスは同時並行的に動作する。子プロセスが実行完了したとき、exit（英語版）システムコールを呼び出すことで終了する。このシステムコールが終了ステータスのコードを親プロセスに渡す役割を果たし、親プロセスはwait（英語版）システムコールでその値を受け取ることができる。子プロセスが exit を呼び出して終了してから、親プロセスが wait を呼び出して受け取るまでの間の、子プロセスの状態を幽霊(米国ではゾンビ)と呼ぶ。

### 構文
```
exit <終了ステータス>
```
参考
[終了ステータスについて](https://ja.wikipedia.org/wiki/%E7%B5%82%E4%BA%86%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9)
[exitコマンド](https://itpfdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0289.HTM)
Windows環境で PowerShell + curl を使って ServiceNow API に接続するサンプルスクリプト

以下は、**Windows環境で PowerShell + `curl` を使って ServiceNow API に接続するサンプルスクリプト**です。  
この例では、

- **プロキシサーバーの指定あり**
- **プロキシ認証なし**
- **ServiceNowのBasic認証を使用**
- `curl.exe` を明示的に呼び出す（PowerShellには `curl` のエイリアスがあるため）

という前提で記述しています。

---

### ✅ PowerShell スクリプト例

```powershell
# ServiceNow 接続情報
$instance = "dev12345"  # 例: dev12345
$username = "admin"
$password = "your_password"

# プロキシサーバー情報（認証なし）
$proxyUrl = "http://your.proxy.server:8080"

# ServiceNow API エンドポイント
$url = "https://$instance.service-now.com/api/now/table/incident?sysparm_limit=1"

# curl.exe のパスを明示的に指定（必要に応じてパス修正）
$curlPath = "C:\Windows\System32\curl.exe"

# 認証文字列（Base64エンコード）
$authString = "$username:$password"
$authBase64 = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($authString))

# curl コマンドの構築
$curlCommand = @(
    "`"$curlPath`"",
    "--request GET",
    "--url `"$url`"",
    "--header `"Authorization: Basic $authBase64`"",
    "--header `"Accept: application/json`"",
    "--proxy `"$proxyUrl`""
)

# 実行して結果を表示
$commandLine = $curlCommand -join " "
Write-Host "Executing: $commandLine"
Invoke-Expression $commandLine
```

---

### 💡補足ポイント

- `curl.exe` のパスを明示的に指定することで、PowerShell内の `curl` のエイリアス（Invoke-WebRequest）を避けています。
- `--proxy-user` オプションを指定しなければ、**プロキシにユーザー認証は送られません**。
- `$authBase64` によって ServiceNow への Basic 認証を実現しています。
- `Invoke-Expression` は少々危険なので、信頼できる環境でのみ使用してください。必要に応じて `Start-Process` 等でも代替可能です。

---

もし `curl` の実行結果を PowerShell オブジェクトとして使いたい場合や、レスポンスを整形したいなどありましたら、その点も対応できます！
正規表現入門

## 正規表現とは
文字列のパターンを表現するための特別な文字列

## 使用例
### 文字列の検索・抽出、Webスクレイピング
- ログファイルの「エラー行」
- メールアドレス
- 電話番号
- 日付
- 郵便番号
- URL
- HTMLタグなど

### 置換・修正
- 文章中の機密情報(例：クレジットカード番号)をマスキング
- 改行コードの統一(`\r\n` → `\n`)
- タグの除去（例：HTMLタグを削除）

### 入力時のバリデーション(検証)
- メールアドレスの形式確認
- パスワードの条件確認(英数字混在、8文字以上など)
- 数値や日付の書式確認

## よく使う正規表現の基本記号
### 文字の意味を指定する記号（メタ文字）
| 記号 | 意味 | 例 |
|:-----------|:------------|:------------|
| `.` | 任意の1文字 | `a.c` → `abc`, `acc` などにマッチ |
| `^` | 行頭にマッチ | `^Hello` → `Hello`で始まる行 |
| `$` | 行末にマッチ | `world$` → `world`で終わる行 |
| `*` | 直前の文字が0回以上繰り返し | `a*` → `""`, `a`, `aaa` |
| `+` | 直前の文字が1回以上繰り返し | `a+` → `a`, `aa`, `aaa` |
| `?` | 直前の文字が0回または1回 | `a?` → `""`, `a` |

### グループ・繰り返し・範囲
| 記号 | 意味 | 例 |
|:-----------|:------------|:------------|
| `()` | グループ化 | `(ab)+` → `ab`, `abab`, `ababab` |
| `[]` | 指定した文字のいずれか | `[a-z]` → `a`～`z`のいずれか |
| `[^]` | 含まない文字 | `[^abc]` → `a`, `b`, `c` 以外 |
| `{n}` | ちょうどn回の繰り返し | `a{3}` → `aaa` |
| `{n,}` | n回以上 | `a{2,}` → `aa`, `aaa`, ... |
| `{n, m}` | n~m回 | `a{2,4}` → `aa`, `aaa`, `aaaa` |

### 特殊文字クラス（便利な略記法）
| 記号 | 意味 | 例 |
|:-----------|:------------|:------------|
| `\d` | 数字(`[0~9]`) | `\d+` → `123` などの数字列 |
| `\D` | 非数字 | `[^\d]`と同じ |
| `\w` | 単語構成文字(英数字 + アンダースコア) | `[a-zA-Z0-9_]` |
| `\W` | 非単語構成文字 | `[^\w]` |
| `\s` | 空白(スペース・タブ・改行など) | `\s`+ → 空白部分にマッチ |
| `\S` | 非空白 | `[^\s]` |

## 実例（よく使うパターン）
- メールアドレス
  - `^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$`
- 郵便番号
  - `^[0-9]{3}-[0-9]{4}$`
- 日付(`yyyy/mm/dd`)
  - `^[0-9]{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$`
- 電話番号
  - `^0[5789]0-[0-9]{4}-[0-9]{4}$`

## おすすめチェッカーツール
- 正規表現チェッカー WWW-Creators!
  - JavaScript対応
- Rubular
  - Ruby対応
- Debuggex
  - PHP, Javascirpt, Python対応

## まとめ
正規表現とは、文字列のパターンを記述するための表現方法で、検索・抽出・置換・バリデーションなど幅広く活用されます。基本記号や便利な略記法を使うことで、複雑な文字列処理を簡潔に記述できます。
自己のstr値のフォーマットを変更可能な形で持つクラス

# 用途
クラス定義をモジュールとして提供するが、出力用フォーマットは用途によって変更する場合に使う。

# コード

```python
class cls:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        
    fmt = "({self.x}, {self.y})"
    def __str__(self):
        return self.fmt.format(self=self)
```

## フォーマットの変更
```python
# 全体的に変更する場合
cls.fmt = "{self.x}, {self.y}"

# 個別に変更する場合
a= cls(1,2)
a.fmt = "A: {self.x}, {self.y}"
```
初心者でもできる！AWSの基礎からアプリ作成💻✨

こんにちは、韓国在住のsanaです！

今日は初心者でも分かるAWS基礎編、Pythonを活用してAWSアプリケーション作成について学べる講座３つを紹介します！:sparkles:


:one:初心者向け AWS サービスの基礎
初心者でもAWSのコアをしっかり理解できる内容が揃っており、クラウド技術を初めて学ぶ方におすすめです！

特に、AWSの主要サービス（VPC、EC2、RDS、S3、IAMなど）の使い方を体系的に学べる点が魅力ポイント:point_up:

https://u.inf.run/42wF8pd

:two:【無料講座】Pythonを活用したAWS FinOpsアプリケーションの作成

Pythonの基礎が身についてる方なら誰でも挑戦できる！AWS FinOpsアプリケーションを作成して実践力をつけていきましょう！

https://u.inf.run/4cCV8La


:three:AWSを実践するためのレッスン【中級者向け】

AWSを学習し始めたけどまだ完璧ではないな…という方必見！
Apache Airflow、AWS Batch、AWS ECRAWS Athena、AWS Glueが学べます！

中級者向けの講義なのでAWSの知識を実際に使ってみたいという方おすすめです！

https://u.inf.run/4jAzzgB


どの講義も無制限で見れるので、勉強に詰まった時いつでも見返せます！！

今日は水曜日、今週も半分が終わりました。残り2日も頑張っていきましょう！　ファイティン!!
2200年の宇宙ステーションでの生活：ある日の生活

人類は長い年月をかけて宇宙開発を進め、ついに地球外での生活が当たり前になりました。2200年の今、私は地球の軌道上に浮かぶ巨大な宇宙ステーション「ノヴァ・ステラ」で生活しています。ここでは2000人以上の人々が共に暮らし、研究や仕事を行いながら、新たな人類の未来を築いています。そんな私の一日をご紹介しましょう。

<h2>朝：地球を眺めながら始まる一日</h2>
朝は、人工重力によって地球と同じように布団の中で目を覚まします。窓の外には、青く輝く地球がくっきりと浮かんで見えます。その美しさは、毎朝見ていてもまったく飽きることがありません。太陽の光は、特殊なフィルターを通して柔らかく室内に差し込み、快適な朝を演出してくれます。

朝食は、栄養が完璧に計算された高機能なフードパックですが、最近では3Dフードプリンターを使って、地球で食べていたようなパンケーキやラーメンなども再現できるようになりました。香りや食感も本物そっくりで、朝の楽しみのひとつです。

<h3>午前：研究とチームワーク</h3>
私は植物学の研究員として、火星での食料自給を目指すプロジェクトに参加しています。無重力環境でも植物が成長できるよう、LEDライトや水分循環システム、人工培養土を使って日々実験を行っています。植物は宇宙空間での酸素供給や精神的な癒しとしても重要な存在です。

研究の合間には、地球の研究チームとリアルタイムでデータ共有し、VR会議を通じてディスカッションを行います。時差や通信のラグはほとんどなく、地球との距離を感じることはあまりありません。

<h3>昼食とリラックスタイム</h3>
昼食もフードプリンターで調理され、今日は地球の「カレーライス」を食べました。スパイスの香りが宇宙空間にも広がり、仲間たちと笑いながら食べる時間は、地球の食堂にいるかのような安心感をもたらします。

昼食後は、少し自由時間があります。この時間には音楽を聴いたり、宇宙船の中の緑のエリアで読書をしたり、地球の家族とホログラム通信で会話を楽しんだりします。技術の進化によって、離れていてもつながっている感覚が強くなりました。

<h3>午後：身体のメンテナンスとチーム活動</h3>
宇宙では無重力のため、筋肉や骨が衰えやすくなります。そのため、毎日1時間以上の運動が義務付けられています。宇宙用トレーニングマシンを使ってランニングや筋トレを行い、健康を維持しています。運動後には、リラクゼーションルームでストレッチや瞑想を行い、心身のバランスを整えます。

その後は再び実験作業に戻り、植物の成長データを整理したり、AIと協力して次の研究計画を立てたりします。AIは非常に賢く、スケジュール管理や体調のチェックまでしてくれるため、私たちの生活をしっかり支えてくれています。

<h3>夕方から夜：静けさと宇宙の美</h3>
夕食後には、みんなが集まるラウンジで映画を見たり、カードゲームをしたりして過ごします。地球の文化を共有しながら笑い合うこの時間は、心の癒しです。ときには、地球でのニュースを見たり、宇宙で撮影した動画をSNSに投稿する人もいます。

夜になると、ステーション内の照明が落ち着いた色合いに変わり、睡眠モードに切り替わります。ベッドに入る前に、窓から宇宙を眺めるのが私の日課です。果てしない闇に浮かぶ星々を見ていると、自分がとても小さな存在であることを感じ、同時に大きな宇宙の一部であることにも気づかされます。

<h3>宇宙での生活が教えてくれること</h3>
宇宙ステーションでの生活は、地球とはまったく異なるリズムと環境ですが、慣れてしまえばとても快適です。全てがテクノロジーによって管理され、日々の生活はスムーズで効率的です。自然との距離はありますが、逆にその大切さをより強く感じるようになりました。

ここでの経験は、未来の人類にとって大きな一歩です。宇宙に住むという夢が現実となった今、人々は次の目的地である火星や木星の衛星へと目を向けています。私たちの生活は、その未来の礎を築くための大切な日々なのです。
【OCI】Object Storageのクロスリージョンレプリケーション設定ガイド（AWS S3との比較あり）


## はじめに

Oracle Cloud Infrastructure（OCI）のObject Storageでは、**クロスリージョンレプリケーション（Cross-Region Replication, CRR）** により、バケット間でデータの自動コピーを実現できます。
正確にはオブジェクトストレージのレプリケーション・ポリシーを設定することで、AWSのCRRと同等の動作が行われます。

この記事では、**OCIでの設定手順**をスクリーンショット付きで解説し、**AWS S3の同等機能との比較**も紹介します。

---

## 💡 クロスリージョンレプリケーションとは？

クロスリージョンレプリケーション（CRR）は、1つのリージョンにあるバケットのオブジェクトを、別のリージョンにあるバケットへ**自動・非同期にレプリケート**する機能です。

### ✅ 主な用途
- 災害対策（DR）
- 地理的なアクセス最適化
- リージョン障害時の可用性向上

---

##  AWS S3との比較

| 項目 | OCI Object Storage | AWS S3 |
|------|---------------------|--------|
| 機能名 | オブジェクト・ストレージ・レプリケーション / レプリケーション・ポリシー | Cross-Region Replication |
| 対象 | バケット単位 | バケット単位 |
| 設定場所 | コンソール or API | コンソール or API |
| レプリケーション遅延 | 数分程度（非同期） | 数分程度（非同期） |

https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/usingreplication.htm
https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/usingreplication_topic-To_create_a_replication_policy.htm

---

## 🔧 OCIでの設定手順

### 前提条件
- 送信元バケットと送信先バケットが**別リージョン**に存在
- 同一テナンシ内（別テナンシは未対応）
- 適切なIAMポリシーが設定されていること　
https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/usingreplication.htm#permissions

---

### ① バケットの作成（送信元）

1. OCIコンソール → 「ストレージ」→「オブジェクト・ストレージとアーカイブ・ストレージ」→「バケット」→「バケットの作成」  
2. バケット名を指定 
3. リージョンを確認（例：Tokyo）
4. 作成  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/d779a71b-f601-489f-b884-8cf377a839e4.png)

---

### ② バケットの作成（送信先）

1. 送信元とは**異なるリージョン**で同様にバケットを作成 （例：Osaka）
2. バケット名は任意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/b699d5b4-ac21-42be-834f-dcb6c264c21c.png)


---

### ③ レプリケーション・ポリシーの作成

1. 送信元バケットの詳細ページを開く （例：Tokyo）
2. 「レプリケーション・ポリシー」 →「ポリシーの作成」
3. 以下を入力：
   - 名前：任意（例：replication-policy-to-osaka）
   - 宛先リージョン（例：Osaka）
   - 宛先バケット（例：bucket_osaka）
4. 作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/e9ef00d7-ea81-4f24-baa8-965fe999122a.png)

作成が完了するとステータスがアクティブになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/b296df99-fd9e-4e67-ba3c-8562dfb62937.png)



---

### ④ レプリケーション動作確認

送信元バケットにオブジェクトをアップロードし、数分後に送信先バケットに同一オブジェクトが存在することを確認します。
ここでは東京リージョンのバケットにtestfile.txtをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/5e0a5b19-dd19-4e13-b18c-e165a8597bbb.png)

大阪リージョンのバケットを確認すると同名のファイルが格納されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/b2337f9f-d37b-4572-a80a-c0fa16de569c.png)

---

## まとめ
OCI Object Storageのクロスリージョンレプリケーションは、高可用性やDR対策に有効な機能です。
AWS S3と比べても同等の機能が揃っており、操作もシンプルで2~3分で設定できました。

## 参考

https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/objectstorageoverview.htm

https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/usingreplication_topic-To_create_a_replication_policy.htm

https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html
Arduino Opta Lite(PLC)をArduinoIDEで試す

PLCとして使用可能なArduinoを見つけたので基本的な使い方を記す。
動作確認として内臓されている4つのLEDを制御する。

必要部品
・PC
・Arduino Opta Lite
・ArduinoIDE
・USB Cタイプ(データ通信用)
※内部リレーを使用する場合はDC24V電源が必要。

Arduino Opta Lite
![IMG_7266.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061810/a47f7c67-6059-4101-8bae-c3681c79840e.jpeg)
![IMG_7260.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061810/509fc5cd-90c8-4a3e-b388-0666dbefd909.jpeg)
![IMG_7270.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061810/b62cf459-e38c-4b78-bae3-a275a1cefa91.jpeg)
![IMG_7271.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061810/c965aace-866e-4c20-a1a1-4442a35e4c63.jpeg)


```
void setup() {
  pinMode(LED_D0, OUTPUT);
  pinMode(LED_D1, OUTPUT);
  pinMode(LED_D2, OUTPUT);
  pinMode(LED_D3, OUTPUT);
}

void loop() {
  digitalWrite(LED_D0, HIGH);
  delay(500);
  
  digitalWrite(LED_D1, HIGH);
  delay(500);
  
  digitalWrite(LED_D2, HIGH);
  delay(500);
  
  digitalWrite(LED_D3, HIGH);
  delay(500);
  
  digitalWrite(LED_D0, LOW);
  digitalWrite(LED_D1, LOW);
  digitalWrite(LED_D2, LOW);
  digitalWrite(LED_D3, LOW);
  delay(500);
}
```

ツール＞ボード＞ボードマネージャ　からOpta mbedを検索しインストール。
ボードでOptaを選択。
![スクリーンショット (540).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061810/da9a6868-4597-4b45-89ba-a99ed8005b62.png)

USB接続後、シリアルポートを選択して書き込み。

LEDが順番に点灯した後、すべて消灯　を繰り返す。
![0416.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061810/2551373e-334c-4bb1-bf4f-cbe3f376d14b.gif)


他の部品(スイッチ、LED、ソレノイドなど)を接続して制御する場合は
※入力ピン　I1～I8　は　A0～A7
出力ピン(リレー)　OUT1～OUT4　は　D0～D3
と書く。

※デジタル入力(digitalRead)で使用する場合はDC24Vまで。
※アナログ入力(analogRead)で使用する場合は**DC10V**まで。


ピンアウト
https://content.arduino.cc/assets/AFX00001-pinout.pdf?_gl=1*qj8c8g*_ga*MTIxMDE1OTAzOS4xNjc4Nzc0NzEx*_ga_NEXN8H46L5*MTY3ODc3NDcxMC4xLjEuMTY3ODc3NTAyOS4wLjAuMA

Optaドキュメント
https://docs.arduino.cc/hardware/opta/?_gl=1*qj8c8g*_ga*MTIxMDE1OTAzOS4xNjc4Nzc0NzEx*_ga_NEXN8H46L5*MTY3ODc3NDcxMC4xLjEuMTY3ODc3NTAyOS4wLjAuMA

Optaブログ
https://blog.arduino.cc/2022/11/08/welcome-opta-our-first-ever-micro-plc-with-industrial-iot-capabilities/?_gl=1*13zxada*_ga*MTIxMDE1OTAzOS4xNjc4Nzc0NzEx*_ga_NEXN8H46L5*MTY3ODc3NDcxMC4xLjEuMTY3ODc3NTE0My4wLjAuMA

製造元の販売ページ
https://store-usa.arduino.cc/products/opta-lite
PL/I 初心者　練習問題②

練習問題
問題：成績判定＆統計

5人分の「名前」「得点（0〜100）」を入力し、以下の処理を行うプログラムを作成してください：
・各人の名前、得点、評価（以下のルールに従う）
　90点以上：優
　70〜89点：良
　50〜69点：可
　49点以下：不可
・全体の平均点を表示

```
SEISEKI: PROCEDURE OPTIONS(MAIN);
   DECLARE NAME(5) CHAR(20);
   DECLARE SCORE(5) FIXED;
   DECLARE I FIXED;
   DECLARE TOTAL FIXED INIT(0);
   DECLARE AVERAGE FIXED;

   DO I = 1 TO 5;
      PUT SKIP LIST(I , '人目の名前を入力してください:');
      GET LIST(NAME(I));

      PUT SKIP LIST(I , '人目の得点を入力してください:');
      GET LIST(SCORE(I));

      TOTAL = TOTAL + SCORE(I);  /* 合計点を加算 */
   END;

   AVERAGE = TOTAL / 5;  /* 平均を計算 */

   PUT SKIP LIST('--- 結果 ---');

   DO I = 1 TO 5;
      IF SCORE(I) >= 90 THEN
         PUT SKIP LIST(NAME(I), 'さん: ', SCORE(I), '点 → 優');
      ELSE IF SCORE(I) >= 70 AND SCORE(I) <= 89 THEN
         PUT SKIP LIST(NAME(I), 'さん: ', SCORE(I), '点 → 良');
      ELSE IF SCORE(I) >= 50 AND SCORE(I) <= 69 THEN
         PUT SKIP LIST(NAME(I), 'さん: ', SCORE(I), '点 → 可');
      ELSE
         PUT SKIP LIST(NAME(I), 'さん: ', SCORE(I), '点 → 不可');
   END;

   PUT SKIP LIST('平均点は ', AVERAGE, '点です');
END SEISEKI;


```
Tableau Conference 2025 キーノート 超簡単まとめ

2025/4/15から3日間にわたって開催されるTaleau Conference 2025のキーノートの内容を超簡単にまとめて

# 生成AI時代のアナリティクスとしてTableau Nextを説明
Tableau Nextは4つのレイヤーで構成されそれぞれのレイヤーでAgentforceがサポート（メタデータ書いたり、計算式作ったり、Viz作ったり）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/ee7cfc32-9aba-4e9c-a670-0e64bd218022.png)

Workspaceという概念が登場。図の通り、データ、セマンティックモデル、可視化、ダッシュボードのリネームが管理でき、Workspace内での再利用性を高めているとのこと。UI次第な気もしますが、再利用性が高まるならありがたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/148c09f6-1190-4964-a912-3befdeec89a7.png)

Agentic EraのBlueprintも公開された。（https://www.tableau.com/learn/blueprint/download）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/650b8ca8-5abf-421c-9f83-caaad13ac756.png)

# コミュニティには引き続き投資を進める

コミュニティideaから130以上の機能を実装。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/f9618dc7-8cef-4af8-8f45-d75df01e4637.png)

誰でも参加できるコミュニティSlack立ち上がったとのこと。これからどう運営されるのか分かりませんがもちろん有料版だと思うのでコミュニティ内のコミュニケーションに便利そうですね。[ここ](https://www.tableau.com/community/slack)から入れるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/dedf76d9-d92d-408b-93cb-c0ab18262b56.png)

# Tableau ServerのAI機能も
Extension機能を使ってAI機能を使えるとのことでしたがちょっと期待外れ感がありました。ダッシュボードに質問をして答えてくれる感じでしたが、個人的にはTableau Pulseが使えるまでいかないと喜ばれないのではと感じました。ただこの点は明日のDev on the Stageで詳細が語られるようなので来たいです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/de17e65d-550e-47c5-bdc5-a593015fd331.png)

# まとめ
予想通りTableau Nextがメインでした。ただしTableau NextはSalesforce上で動くため既存のTableau Cloudで使える機能ではないことに注意が必要です。これまでAI機能についてはTableau Server＜Tableau Cloudという関係でしたが、ここにTableau Nextが登場して、Tableau Server＜Tableau Cloud＜Tableau Nextという関係になるのでしょうか。ただTableau Nextの実力値が見えていないので今後に要注目ですね。

明日のDevs on Stageはさらなる機能追加の発表があると思うのでそちらもしっかり見てこようと思います！
【図解】Djangoチュートリアル備忘録 - プロジェクト構造とデータフローについて

## はじめに
新卒エンジニアが会社の研修で勉強した内容を図でまとめてみました。
今回はdjangoについてです。

## プロジェクト構造とデータフロー

![Djangoチュートリアル備忘録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/fba0eec2-07ad-44dc-9ce5-9c4e60fd3ba1.png)

## 解説

![Djangoチュートリアル備忘録 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/b4213e8d-2e26-4df9-83a3-c9372957f217.png)

### Djangoとは

Djangoは、**Pythonで書かれた高機能なWebアプリケーションフレームワーク**です。「バッテリー同梱（batteries included）」の思想を持ち、Web開発に必要な機能が標準で揃っているのが特徴です。

### ページ表示までのデータフロー

Djangoでは、ユーザーのリクエストから応答までが以下の流れで処理されます：

1. **URLアクセス**: ユーザーがブラウザからリクエスト送信
2. **URLディスパッチャ** (`urls.py`): URLパターンを照合し、適切なビューを選択
3. **ビュー** (`views.py`): リクエスト処理とビジネスロジックの実行
4. **モデル** (`models.py`): データの取得・操作（必要な場合）
5. **テンプレート** (`.html`): 表示用HTMLを生成
6. **レスポンス**: 生成されたHTTPレスポンスをユーザーに返す

### リクエスト処理サイクル

1. ユーザーがブラウザからリクエスト送信
2. WSGIサーバーがリクエストを受け取りDjangoに渡す
3. ミドルウェアがリクエストを前処理
4. URLディスパッチャがURLパターンを照合し適切なビューを選択
5. ビューがデータベースからデータを取得・処理
6. ビューがテンプレートにデータを渡す
7. テンプレートがHTMLを生成
8. ビューがHTTPレスポンスを返す
9. ミドルウェアがレスポンスを後処理
10. WSGIサーバーがレスポンスをユーザーに返す

### WSGI と ASGI

- **WSGI** (Web Server Gateway Interface): Webサーバーとアプリケーション間の標準インターフェース
- **ASGI** (Asynchronous Server Gateway Interface): 非同期処理に対応した新しいインターフェース

**実際の使い分け**
- **wsgi.py**: 従来のHTTPリクエスト/レスポンスモデルのみを扱う場合
- **asgi.py**: WebSocketなどのリアルタイム機能や非同期処理を活用する場合

### Djangoのメリット

- 必要な機能が最初から揃っている
- モデル定義さえすれば管理画面が自動生成される
- セキュリティが高い
- データベースの操作が容易（ORM）
- スケーラビリティに優れた設計

### DB関連概念

- **スキーマ**: DBのテーブルやカラム等の構造定義
- **ORM** (Object-Relational Mapping): SQLを直接書かずに、プログラミング言語のオブジェクトでデータベースを操作する技術
- **マイグレーション**: DBの変更履歴をファイルに記録し、その履歴を元にDBスキーマを更新していく手法

<br><br>

![Djangoチュートリアル備忘録 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/6a8231c0-9e54-4646-8017-77f034e16d1a.png)

>図に示されているディレクトリ名やファイル名（django-tutorial-prj、mysite、polls等）はあくまで例示であり、実際のプロジェクトでは開発者が任意の名前を付けることができます。Djangoの規約に従う限り、プロジェクト構造の基本的な階層と機能は維持されます。

### ルートディレクトリ
例では `django-tutorial-prj` となっていますが、任意の名前を付けることができます。プロジェクト全体を格納するディレクトリです。

### プロジェクト設定パッケージ
例では `mysite/` となっていますが、実際には `django-admin startproject` コマンド実行時に指定した任意の名前になります。このディレクトリには以下のファイルが含まれます：

- **`__pycache__/`**: Pythonのバイトコードキャッシュ用ディレクトリ
- **`__init__.py`**: このディレクトリをPythonパッケージとして認識させるファイル
- **`asgi.py`**: ASGIサーバー用のエントリーポイント
- **`settings.py`**: プロジェクト全体の設定を管理
- **`urls.py`**: プロジェクトレベルのURL設定
- **`wsgi.py`**: WSGIサーバー用のエントリーポイント

### アプリケーション
例では `polls/` となっていますが、`python manage.py startapp` コマンド実行時に指定した任意の名前になります。一つのプロジェクトに複数のアプリケーションを含めることができます。アプリケーションディレクトリには：

- **`__pycache__/`**: バイトコードキャッシュ
- **`migrations/`**: データベースマイグレーションファイル
- **`static/`**: 静的ファイル（CSS、JavaScript、画像など）
- **`templates/`**: HTMLテンプレートファイル
- **`__init__.py`**: Pythonパッケージ化用ファイル
- **`admin.py`**: Django管理サイトの設定
- **`apps.py`**: アプリケーション設定
- **`models.py`**: データモデル定義
- **`tests.py`**: テストコード
- **`urls.py`**: アプリケーションレベルのURL設定
- **`views.py`**: ビュー関数/クラス

### プロジェクトルートの重要ファイル
- **`manage.py`**: Djangoプロジェクト管理用のコマンドラインユーティリティ
IBM i 7.6 プログラム資料説明書を読む　その1

[IBM i 7.6プログラム資料説明書](https://www.ibm.com/docs/ja/i/7.6.0?topic=documentation-memo-users)を読んでみます。

## 2桁年度の日付フォーマットの期間の変更

・年号を2桁のみで指定する日付形式（*MDY、*DMY、*YMDなど）を使用する場合、40～99年の範囲は1940～1999年、00～39年の範囲は2000～2039年とみなされます。（デフォルトの場合）
・IBM i 7.5以降では、***環境変数QIBM_QBASEYEAR***を使用して、基準年を1970年または1940年に設定できます。基準年を1970年に設定すると、暗黙的な日付範囲は1970年1月1日から2039年12月31日になります。 2069年。基準年を1940年に設定すると、暗黙的な日付範囲は現在のデフォルト範囲である1940年1月1日から2039年12月31日と同じになります。

[IBM i 7.5マニュアル](https://www.ibm.com/docs/ja/i/7.5.0?topic=ios-changes-1940-2039-date-range-date-formats-2-digit-year)では、

***この環境変数の更新は、パラメーターが TYPE(*DATE)のコマンドにのみ影響します。 既存の RPG または COBOL プログラム、および Db2 には、このアップデートによる影響はありません。*** 
とあります。

**システム内のすべてのジョブの基準年を 1970 に設定する**
```
ADDENVVAR ENVVAR(QIBM_QBASEYEAR) VALUE(1970) LEVEL(*SYS)
```
**ジョブ単位で基準年を1970年に設定**
```
ADDENVVAR ENVVAR(QIBM_QBASEYEAR) VALUE(1970) LEVEL(*JOB) REPLACE(*YES)
```
※デフォルトの基準年は、将来のリリースで1970年に変更される計画とのこと。今からテスト実施など進めてください、という主旨が記載されています。

### CRTCMD のソースにおける 2 桁の年を含む日付リテラルの処理の変更

IBM i 7.5まででは、コマンドソースに TYPE(*DATE) を指定した PARM コマンドまたは ELEM コマンドは、2 桁年の日付リテラルを 1940 - 2039 年の日付として処理しています。

**IBM i 7.6 以降では、2桁年の日付リテラルはコマンドコンパイル時のジョブ基準年に基づいて解釈されます。**

例えば下記の日付（mmddyy)はデフォルトでは 1941 年 1 月 31 日を表します。（日付リテラルは1940年から2039年まで）
```
PARM KWD(DATE1) TYPE(*DATE) DFT(013141)
```
***上記が、ジョブ基準年が1970年の場合は2041年1月31日になります。***

### CVTDAT コマンド, 日付パラメーター付き CLPの2桁日付の解釈の変更

CLP,CLLE *PGM,*MODLUEのソースにCVTDATコマンドまたは *DATE 型パラメーター付き CL プログラム内のコマンドリテラル値を使用するケースです。mmddyyのyyが40～69の場合、ジョブの基準年が1940年か1970 年かで、yyの示す年が変わることになります。

※IBM i 7.5ではCVTDTAコマンドの日付の年の範囲は常に1940-2039年でした。ジョブの基準年は反映されない仕様でしたが7.6ではここが変更点になります。

## ネットワーク関連の変更

※一部の変更点は省略しました（書いてある通りだと思う、あまり使わないと思う等）

### ホストサーバージョブの実行ユーザーがQUSER_NC または QPGMR_NCに変更

たとえばQSERVERサブシステム配下はこんな感じです。１行目からがQSERVER配下のジョブです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/658f247d-b832-4341-bee8-341473c8b89e.png)

以前のホストサーバージョブはQUSERかQPGMRでしたが、QUSER_NCになっていますね。
QSYSWRK, QUSRWRKサブシステム配下のジョブも同様に変化がありました。

## ADTSコマンドの変更

昨年来のホットトピックですね。原文を引用します。

Support for selected Application Development ToolSet tools and their associated commands is being limited to security related fixes. These commands continue to be available in IBM i 7.6:
• Start Data File Utility (STRDFU)
• Create DFU Display File (CRTDFUDSPF)
Support for selected Application Development ToolSet tools and their associated commands is being limited to security related fixes. These commands continue to be available in IBM i 7.6, however the PDM menu option for these commands is removed in IBM i 7.6:
• Compare Physical File Member (CMPPFM)
• Merge Source (MRGSRC)

上記ではSTRDFUは(従来どおり？)使える、とよめそうですが、出荷前のテスト試用版7.6ではSTRDFUコマンドはそのまま使え、DFUのメニュー画面では 1. DFUプログラムの実行 と　 5.一時プログラムを使用したデータの更新  は使えました。ですので、既存のDFU資産の継承・実行という意味では7.6でも問題無いと思います。
ただ困るのは、 2. DFUプログラムの作成、 3. DFUプログラムの変更　などがないので既存DFU定義の修正や新規作成ができない点ですね。。上記の英語原文を読むと出荷版では変わっている可能性もあると解釈できると思います。

後日、正式な出荷バージョンをもって確認したいと思います。

[その2](https://qiita.com/gomAnomalocaris/items/736bbe5987aad621169f)に続きます。
Git 명령어 사용방법

# 개요 

git은 소스트리 또는 개발 툴에서 지원하는 깃 관련 툴에서도 간단하게 가능하기도 하지만, 안정성을 따진다면 git bash에서 직접 적는것만큼 안전한것이 없을것이다. 간편함에 안주해서 소중한 것을 잃기 무서워 몇가지 git관련 명령어를 남긴다. 

### 브런치 체크아웃 관련 
```
git checkout -b 브런치명  # 브랜치 생성 및 이동 

git checkout 브런치명    # 브랜치 이동 
```

### 깃 정보 확인 
```
git status　#　파일들이 스테이지에 있는지 아닌지에 대한 확인 
```

### 깃 원격저장소에 추가
```
git add 파일이름　#　파일을 스테이지에 추가 

git commit -m "커밋 텍스트"　#　커밋 

git push origin 브런치명　#　푸쉬 
```
이 셋은 거의 셋트 비슷한 느낌이다. 묶어서 기억하자


### 풀 받기 
```
git fetch　#　원격 git(origin)에 있는 추가정보를 로컬git에 불러옴 

git pull origin 브런치명　#　풀
```
꼬이기 싫으면 왠만하면 git fetch 한 다음에 실시하도록 하자 

### 깃 커밋 취소
```
reset --mixed  # commit과 스테이지 올리기 둘 다 취소。 

reset --soft   # commit만 취소하고 스테이지에 남기기。 
```

#### 마치며 
이것만 기억해도 깃 80%는 다 한거라고 생각한다.
フリーランスエンジニアに個人事業税の支払い義務はなかった！

# ただし準委任契約に限る
さいたま県税事務所に確認した所...
`「準委任契約の場合であれば個人事業税の支払い対象外ですね～」`
とのこと！

ただし個人事業の中で請負契約を行っているものが1つでもある場合は、**課税対象**となるので注意してほしいとのことでした。

基本的にフリーランスエンジニアの我々は準委任契約だと思うので、支払い用紙が来ても無視してOKです！



# 【まとめ】
１．都道府県によって異なる可能性があるから、一応税事務所に確認して
２．埼玉県の場合は対象外らしい
３．調査される可能性はあるかも
aabをapkに変換する方法

# はじめに
aabをapkに変換する方法を調べたので、変換手順をメモとして残しておきます。

# bundletool
aabをapkに変換するにはbundletoolが必要になります。

## インストール

以下を参照  
https://developer.android.com/studio/command-line/bundletool?hl=ja  

macでhomebrewを使っている場合以下のコマンドでインストール可能
`brew install bundletool`

## 使い方
- 作業用のディレクトリを作成する(仮に、~/workとする)
- 上記のディレクトリに aab ファイルと、aabファイルをビルドする際に使用した.jksファイルを配置する
- ターミナルで作業用のディレクトリに移動する(cd ~/work)
- 以下のコマンドを実行
ファイル名、キーのパス、パスワードなどは適宜変更してください。key.propetiesファイルに書いてあります

```
bundletool build-apks --bundle=app-release.aab \
--output=app.apks \
--ks=key.jks \
--ks-pass=pass:XXXXX \
--ks-key-alias=key \
--key-pass=pass:XXXX
```

- Android端末を PC に繋ぎ下記のコマンドを実行すればインストールできる

```
bundletool install-apks --apks=app.apks
```
Amazon Firestickへアプリインストール(apk)

Amazon Firestickへのアプリインストール方法の備忘録です。

やっていることは単純ですが、バージョンが違うと動作が違ったりします。

海外(タイ)にFirestickを持ってきて使いたいって内容のため、相当コアな内容と思いますがせっかくなので共有しておきます。

macbookからのインストールですが、コマンド変更すれば多分windowsでもできます。


# Amazonアカウント作成(タイ)
今回使いたいアプリがDisney+ hotstarという日本で使われてないアプリです。

普通にアプリストアで探そうとしても日本のアカウントでは見つからずにインストールできません。

日本のアカウントの住所を変更すればできそうですが、住所をタイにしてもアプリは表示されませんでした(何故)

そもそも、Firestickを２つもっているのでアカウントは日本に変えたくないです。さらにややこしい。そのためアカウントを新規作成しました。

もしかしたら日本のアカウントで住所変更すればapkを同じようにインストールできかもしれません。

# apkを見つける
インストールのためにapkを見つける必要があります。
この手のファイルはウイルスを含んでいることもあるので、ウイルスチェックするのがおすすめです。
https://www.virustotal.com/gui/home/upload




arm64-v8a / armeabi-v7aに対応している必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/2e439ad8-3bba-4ab7-8253-11a23bd6d9b1.png)

リンク先
https://www.apkmirror.com/apk/the-walt-disney-company-southeast-asia-pte-ltd/disney-hotstar-android-tv/disney-hotstar-android-tv-25-03-24-0-release/disney-hotstar-android-tv-25-03-24-0-2-android-apk-download/

# apkを解凍&インストール準備
FireOSはxapk や .apkmに対応してないです。apkのみインストール対応です。

その場合、xapk や .apkmの拡張子をzipに変更して解凍して中身を取り出します。

# Firestickで対応
IP確認とadbコマンド使用許可(ググってください)

# adbからインストール準備

adbコマンドを使用できるようにインストール
```
brew install android-platform-tools
```
接続
```
adb connect 192.168.1.24  # ← FirestickのIPアドレス
```
connected to 192.168.1.24:5555ようなメッセージがでる

adbコマンド実行する場所へ先ほどの解凍したファイルを移動

# adb経由でインストール
数分でSuccessという文字がでます。
```
adb install-multiple \
base.apk \
split_config.arm64_v8a.apk \
split_config.armeabi_v7a.apk \
split_config.xhdpi.apk \
split_config.en.apk \
split_config.ja.apk \
split_config.th.apk
```
## 使用するファイルは必要に応じて変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/a5af015c-8837-44de-b1a5-074a4313c2dc.png)
BSP? SDK? 何それ

質問:「BSPはそもそもその基盤上でOSを動かせるようにするためのもの、SDKはアプリケーションから基盤上のGPIOなどを制御するためのものという解釈で良いですか？」
以下はChatGPTの回答。

---

はい！その解釈は **とても本質をついていて正しいです。**  
もう少しだけ補足しつつ、整理してみましょう。

---

## **あなたの理解：**

- **BSP：** 基盤上でOSを動かせるようにするためのもの  
- **SDK：** アプリケーションからGPIOなどを制御するためのもの

→ **その通り！**

---

## **補足ポイント付きで整理すると：**

### **BSP（Board Support Package）**
- **目的：** ハードウェア上で **OSを起動・動作** させるための最低限のサポート
- **構成要素（例）：**
  - 起動時の初期化コード（クロック、メモリ、UARTなど）
  - デバイスドライバ（タイマ、GPIO、Ethernetなど）
  - ブートローダやデバイスツリー（Linuxの場合）
- **対象：** 特定の**ハードウェアやボード**

#### 例：
- ARM Cortex-Aボード用のLinux BSP（U-Boot + Linuxカーネル + デバイスツリーなど）
- ZephyrやFreeRTOSの「board.c/h」や「board_defconfig」

---

### **SDK（Software Development Kit）**
- **目的：** OSの上やOSなしの環境で**アプリケーションを開発**するためのツール群
- **構成要素：**
  - APIライブラリ（GPIO制御、I2C通信など）
  - ヘッダファイル、ビルドツール、ドキュメント
  - OSに依存しない部分も多い
- **対象：** 開発者（アプリ・ミドルウェア）

#### 例：
- Pico SDK（OSなし、bare metal）
- STM32 HAL/LLライブラリ（OSあってもなくても使える）
- Arduino SDK（抽象化されたAPI群）

---

## **図で表すと：**

```
[あなたのCアプリ]
        ↑
     [SDKのAPI]
        ↑
   [BSPの低レベル制御]
        ↑
   [ハードウェア（ボード）]
```

---

## **まとめ：**

> - **BSP：** 「ボードでOSが動くようにするための基盤（OS寄り）」
> - **SDK：** 「アプリケーションからハードを制御するための道具（アプリ寄り）」

この理解があれば、組込み開発の構造がかなりクリアになります！

---

もし今後、RTOSやLinux移植の勉強も視野にあるなら、BSPの具体的な中身（デバイスツリーとか、start.Sなど）に触れるのも面白いですよ。興味あれば深掘りもできます！
【図解】Webの仕組み

## はじめに
新卒エンジニアが会社の研修で勉強した内容を図でまとめてみました。

## Webページのアクセスから表示までの流れ

![Webの仕組み (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/8ed61fc5-457c-41a4-b795-c8ea3b1d9891.png)


## 解説
### 1. リクエスト開始とDNS解決のプロセス

![Webの仕組み (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/e983955d-4fb4-4a85-b2c5-9544e96c37ae.png)


**URLの入力:**
ユーザーがブラウザにURL（例：https://www.amazon.com ）を入力

**DNSキャッシュの確認:**
1. まずブラウザのローカルDNSキャッシュを確認
1. キャッシュにある場合はそのIPアドレスを使用
1. キャッシュにない場合は次のステップへ

**DNSサーバーへの問い合わせ:**
1. ブラウザはOSのDNSリゾルバに問い合わせ
1. さらにISPのDNSサーバーやルートDNSサーバーへと階層的に検索
1. 最終的に目的のドメイン名（www.amazon.com）に対応するIPアドレス（例：54.239.28.85）を取得

**IPアドレスの取得完了:**
取得したIPアドレスを使ってWebサーバーへの接続準備完了


### 2. HTTPリクエスト・レスポンスの流れ

![Webの仕組み (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/73c89fd0-1742-48cb-a3d3-5f6993e5c108.png)



**TCP接続確立（3ウェイハンドシェイク）:**
1. クライアントがSYNパケットを送信
1. サーバーがACK+SYNパケットで応答
1. クライアントがACKパケットを送信して接続確立

**データ転送:**
1. クライアントがHTTPリクエストをサーバーに送信
1. サーバーがHTTPレスポンスをクライアントに返信

**コネクション切断（4ウェイハンドシェイク）:**
1. クライアントがFINパケットを送信
1. サーバーがACKパケットで応答
1. サーバーがFINパケットを送信
1. クライアントがACKパケットで応答して接続終了

### 3. サーバーサイドの処理

![Webの仕組み (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/c47fdd07-8079-478d-850a-182d820f480a.png)

**リクエスト受付:**
1. Webサーバー（Apache、Nginxなど）がHTTPリクエストを受け取る
1. 静的コンテンツの場合はそのままファイルを提供

**動的コンテンツ生成:**
1. アプリケーションサーバーがプログラム（PHP、Ruby、Pythonなど）を実行
1. 必要に応じてデータベースからデータを取得・操作

**データベース処理:**
1. DBサーバーが接続管理、クエリ解析を行う
1. データの検索・更新・追加などの操作を実行
1. 結果をアプリケーションサーバーに返す

**レスポンス生成:**
1. 処理結果をHTMLなどの形式にまとめる
1. HTTPレスポンスヘッダーと共にクライアントへ送信

### 4. レスポンス生成と表示

![Webの仕組み (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/35922352-2167-4974-83fb-4d5836a32891.png)

**HTMLパース:**
ブラウザがHTMLを受信し、DOM（Document Object Model）ツリーを構築

**CSSパース:**
CSSを解析し、CSSOM（CSS Object Model）を構築
スタイル情報をDOM要素に適用

**JavaScriptの実行:**
JavaScriptコードを実行してDOMやCSSOMを操作

**レンダリングツリー構築:**
DOMとCSSOMから実際に表示する要素のレンダリングツリーを作成

**レイアウト処理:**
各要素の位置やサイズを計算

**ペイント処理:**
色や画像などの視覚的要素を描画

**コンポジット:**
複数のレイヤーを合成して最終的な画面を生成

**Webページ表示完了:**
ユーザーに完成したWebページが表示される