OmniAICreator/Qiita-1.07M huggingface dataset:
ラズパイでDNSサーバー作った。

## なぜやるか
DNSサーバーについての知識を得る。 
試験で問われる。応用情報技術者試験など

自宅で稼働させているwebアプリケーションにドメインで接続するために必要。


## 用意
windowsPC
ネットワーク環境
ラズパイ3B+ 

## ラズパイセットアップ

### ラズパイVNC設定
```
sudo apt-get update
sudo apt-get upgrade
```
https://qiita.com/SHIJIMI_EN/items/476399577755da1fcd86

### ラズパイIP固定

https://qiita.com/SHIJIMI_EN/items/78caa649b89a4eb9f92b

### sambaファイル共有

https://qiita.com/SHIJIMI_EN/items/9904ae0f17b5d329f192

## Unboundのインストール

参照

https://www.palsha.jp/how-to-setup-raspi-dns-server/#index_id0

ほぼこの記事通り作っていきます。

sudo apt update
sudo apt install unbound

sudo touch /etc/unbound/unbound.conf.d/custom.conf
sudo mkdir -p /var/log/unbound
sudo chown unbound:unbound /var/log/unbound
sudo chmod 750 /var/log/unbound
sudo nano /etc/unbound/unbound.conf.d/custom.conf



```
server:
    interface: 100.64.16.103

    access-control: 100.64.16.0/24 allow
    access-control: 100.64.16.151 allow
    access-control: 0.0.0.0/0 deny
    access-control: ::0 deny

    local-data: "kajiapp.example.com. IN A 100.64.16.104"
    local-data: "unko.com. IN A 100.64.16.104"

    verbosity: 1
    logfile: /var/log/unbound/custom.log
    use-syslog: no

remote-control:
    forward-zone:
        name: "."
        forward-addr: 100.64.16.231
```

```
sudo systemctl restart unbound
```

## FW設定
インストール
```
sudo apt update
sudo apt install ufw
```

ポート開放 上から
DNS
VNC
SSH
ファイル共有samba
```
sudo ufw allow to any port 53 proto udp
sudo ufw allow 5900/tcp
sudo ufw allow OpenSSH
sudo ufw allow from any to any port 137,138,139,445 proto tcp
sudo ufw allow from any to any port 137,138,139,445 proto udp
```
有効化
```
sudo ufw enable
```
## windows (クライアント側)の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/51a10347-e203-fb7d-b78d-a7b57e409948.png)


## クライアントからDNSに接続できるかテスト
```
nslookup 問い合わせたいドメイン名 DNSサーバのIPアドレス
```

### うまくいかないとき
クライアントからipv6を無効にした。
ブラウザのキャッシュをクリア
DNSキャッシュをクリア
ipconfig /flushdns


DNSサーバ再起動
sudo systemctl restart unbound
configファイルチェック
sudo unbound-checkconf
DNSサーバの状態確認
sudo systemctl status unbound
覚えておきたい便利コマンド集（随時更新）

## はじめに
覚えておくと便利なコマンドを教えて頂いたので、PCのメモ書きに埋もれてしまわないように残しておきたいと思います。今後も便利そうなコマンドをここに追記していき、使いこなしていきたいと思います。

## システム情報を確認するコマンド
### 1.自分の使っているOSの種類とバージョンを調べる
```
cat /etc/os-release
```
以下、出力内容の例です。
```
➜  ~ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

### 2. OSのカーネルバージョンを調べる
```
uname -a
```
以下、出力内容の例です。
```
Linux DESKTOP-QO2B4CF 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
```


## ネットワーク関連

### 1.自分のグローバルIPアドレスを調べる
```
curl ifconfig.me
```
グローバルIPアドレスが表示されます。

## 履歴やプロセス管理

### 1. コマンド履歴を確認する
```
history
```
今まで叩いたコマンドの履歴がずらーっと表示されます。長いコマンドなどを確認したい時に便利そうです。
MSA切り替えのための分解パターン

## 分解パターン  
モノリシックからMSAへ移行する際、1つのサービスを複数のサービスに分解する方法について課題が存在します。  
どのような判断基準に基づいてサービスを分離するかに関するパターン、つまり「分解」を解決するためのパターンです。

---

### 1. ビジネス能力に基づく分解 (Business Ability)  
「ビジネス能力」を基準にサービスを分解する方法です。  
例えば、銀行の送金サービスでは、残高確認、送金先口座の確認、口座状態の確認など多くの機能を持ち、これらが1つの「ビジネス」であるという概念です。  
送金を分離した場合、「ビジネス能力」に基づいてMSAを分離したと言えます。

#### 長所  
- ビジネスが複雑で大規模な組織の場合に適している  
- ビジネスの特性上、内部サービス間の通信が頻繁に発生する場合に有効  

#### 短所  
- サービス間の凝集度、結合度、依存性が増加  
- プロセスが進むにつれて構造が曖昧になる可能性がある  

---

### 2. サブドメインパターンによる分解 (Sub-Domain) from DDD  
サブドメインを基準に、サービスを1つずつ作成するという概念です。  
複雑なビジネスであっても、内部のサブドメイン単位で分離します。  
例えば送金サービスを分離する場合、口座管理、内部残高、外部銀行との通信など、複数のサブドメインが存在します。この場合、送金サービスはこれらのサブドメインをすべて呼び出して利用する形になります。

#### 長所  
- サービス間の独立性と隔離性が向上し、結合度が低下  
- サービス間の影響度が減少し、依存性を最小化  
- 障害の影響を最小限に抑えることが可能  
- MSAの理念に合致したパターン  

#### 短所  
- サービス間の不要な通信が発生する可能性がある  
  - HTTPやgRPCの呼び出し回数が増加し、トラブルシューティングが困難になる可能性  
- サービスが過度に細分化されるリスク  
- 大規模システムでは非効率性が増加する可能性
Kubernetes認定資格全冠へ【四冠目】〜Kubernetes and Cloud Native Security Associate (KCSA)に合格

## 概要
先日（2025年1月18日）、Kubernetes and Cloud Native Security Associate (KCSA)試験に合格しましたので、学習内容など共有しつつ、次回の試験の備忘録としてこの記事を書いてみました。
KCSA試験は日本語版の試験がないので（2025年1月25日現在）、日本語版がリリースするまで待とうかと思いましたが、Kubernetes認定資格全冠を早めに狙いたかったため、英語での試験を頑張ってみました:muscle:
日本語版がリリースされるとKCSA受験者は増えると思いますので、Kubernetes認定資格全冠のアーリーアダプターを狙っている方は、今がチャンスですね。

## Kubernetes and Cloud Native Security Associate (KCSA)とは
公式ページによると、下記のように記載されています。
> Kubernetes および Cloud Native Security Associate (KCSA) は、クラウド ネイティブ エコシステムにおけるセキュリティ技術の基礎知識とスキルを理解していることを実証し、プロフェッショナル レベルに昇格することに関心のある候補者向けに設計された、プロフェッショナル レベル前の認定資格です。

https://training.linuxfoundation.org/ja/certification/kubernetes-and-cloud-native-security-associate-kcsa/

試験の立ち位置としては、KCNA試験と同じレベルになっています。
「Kubernetes および」と記載されていることから、Kubernetesの知識だけでなく、セキュリティに関する周辺サービスの知識も必要になってきます。とは言っても難しいことは問われないので、サービスの概要と名称だけは押さえておきましょう。

## 学習方法
### Kubernetes Security KCSA Mock Exam

https://kubernetes-security-kcsa-mock.vercel.app/

無料のWebアプリで問題が300個あります（これ作った人に感謝:bow:）。
ただ解答内容は間違いもあるので、微妙なところはその都度調べてみました。その際にWebアプリでは色々と取り組みにくかったので、下記リンク先から問題が記載されているjsonファイルを抽出して、学習していました。
https://github.com/thiago4go/kubernetes-security-kcsa-mock

本番試験より易しく、問題文も短めですので、サービスの概要を覚える程度に使ってください。

### KodeKloud
Kubernetes試験ではいつもお世話になっているサイトです。CKAとCKADのコースは無料ですが、他のコースは月35ドルのプランに加入しないといけません（情報が少ないので私は加入しました）。
KCSAのコース内容は動画学習と模試になります。

https://learn.kodekloud.com/user/courses/kubernetes-and-cloud-native-security-associate-kcsa

動画で一通り試験範囲を学習して、模試で力試しという流れになります。
模試のレベル感は、こちらも本番試験より易しく、問題文が短めです。

### Kubernetes & Cloud Native Security Associate EXAM-PREP
Udemyにあった模擬試験のコースで評価が良かったので、購入してみました。

https://www.udemy.com/course/kcsa-kubernetes-cloud-native-security-associate-exam-prep

全部で120問ありますが、本番試験よりかなり易しめです。
とりあえず100％正答できるくらいになれば、概ねサービスの概要は分かっているのかなと。

### Practice Exam Kubernetes and Cloud Native Security Associate
こちらもUdemyの模擬試験コースです。

https://www.udemy.com/course/pe-k8s-kcsa

間違えが多いのでオススメできませんが、問題文の長さは本番試験に近いので、お金に余裕があればお試しください。

## 試験結果
合格ラインが75点のところ、1回目が59点で不合格、2回目が79点でギリギリの合格:sweat_smile:
1回目の不合格で分かったこととして、まず問題文が長いということ。上記のUdemy等の模試では対応していないくらい問題文が長く、理解するのに時間がかかりました。
次に選択肢が単純ではないということ。英語ということもあるのですが、2択に絞ってから理解しないと正答に辿り着けないような問題構成です。
最後に時間が足りない。1問1分半くらいの時間配分ですが、問題文が英語なので理解に時間がかかり、思った以上に時間を消費します。

## 1回目に落ちてから
1回目の試験に落ちてから対策として考えたのが、「問題に出てきたサービスの理解を日本語で完璧にする」こと。
Udemy等の模試では取り扱っていないサービスが出てきたり、ちゃんと理解していないと答えられない問題が出てきていたので、その辺りを自信もって答えられるようにしました。

「Admission controllers」の問題は数問出ていたので、下記リンク先の内容は押さえておいた方がいいです。

https://sysdig.jp/blog/kubernetes-admission-controllers/

「STRIDEモデル」も数問出ていたので、英語でも対応できるように内容を押さえておきましょう。

https://www.cybersecurity.metro.tokyo.lg.jp/security/KnowLedge/439/index.html

「Pod Security Admission（PSA）」についても内容を理解しておきましょう。

https://qiita.com/comware_higashi/items/b8b2d90c15b57223713e

模試等で問題の更新されていないと「Pod Security Policy（PSP）」がそのまま出題されています。ただ、Kubernetesのv1.21でPSPは非推奨になり、今はPSAがベースになっていますのでご注意を。

## 最後に
日本語版のリリースを待とうかなぁと思いましたが、Kubernetes認定資格全冠の称号「Kubestronaut」を早く取得したいので、英語での試験を頑張ってみました。
ただ、英語の試験は本当に疲れますね〜普段から非母国語で仕事とか生活している人、やっぱり尊敬します:clap:

Kubernetes認定資格全まで残りはCKSのみ。頑張ろう:muscle:
【Android】LifecycleObserverの実装備忘

# 前提
以下によると、
ActivityやFragmentのOnResumeなどのライフサイクルのOverrideメソッドが非推奨となっています。

https://developer.android.com/topic/architecture/recommendations?hl=en#lifecycle
>Do not override lifecycle methods such as onResume in Activities or Fragments. Use LifecycleObserver instead. If the app needs to perform work when the lifecycle reaches a certain Lifecycle.State, use the repeatOnLifecycle API.

翻訳すると…
>アクティビティやフラグメントの onResume などのライフサイクル メソッドをオーバーライドしないようにします。代わりに LifecycleObserver を使用します。ライフサイクルが特定の Lifecycle.State に達したときにアプリが処理を実行する必要がある場合は、repeatOnLifecycle API を使用します。

ライフサイクル関連の処理を実装する場合は、代わりにLifecycleObserverを使用する必要があるとのこと。
ちょうど実装する機会があったので、その時の備忘を記載します。

# 実装
実際に行った実装はシンプルです。
以下のような`DefaultLifecycleObserver`を継承した
`LifecycleObserver`のクラスを作成します。

```Kotlin
class SampleLifecycleObserver : DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        Log.d("Lifecycle", "onResume")
    }

    override fun onStart(owner: LifecycleOwner) {
        super.onStart(owner)
        Log.d("Lifecycle", "onStart")
    }

    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
        Log.d("Lifecycle", "onPause")
    }

    override fun onStop(owner: LifecycleOwner) {
        super.onStop(owner)
        Log.d("Lifecycle", "onStop")
    }
}
```
上記で実装しているライフサイクルは、
`onResume`, `onStart`, `onPause`, `onStop`
の４つのみですが、他にも`onCreate`や`onDestroy`が用意されています。
ライフサイクル毎に処理を実施したい場合は、
各ライフサイクルの中に実行したい処理を実際に書くだけです。
（今回はログ出力だけ実施させてます）

あとは、この追加したクラスを以下のように
`addObserver`関数で登録するだけです。
```Kotlin
    init {
        lifecycle.addObserver(SampleLifecycleObserver())
    }
```
これでライフサイクルを検知して処理を実行することが可能になります。


# 少し余談
上記実装の他にライフサイクル検知する処理で
`ProcessLifecycleOwner`と呼ばれるものがあります。

https://developer.android.com/reference/androidx/lifecycle/ProcessLifecycleOwner

こちらも`LifecycleObserver`と同じように
Observerを登録して使用しますが、以下のようなクセがあります。

>Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_STOP, events will be dispatched with a delay after a last activity passed through them. This delay is long enough to guarantee that ProcessLifecycleOwner won't send any events if activities are destroyed and recreated due to a configuration change.

上記によると、どうやら`onStop`または`onPause`は
delayによる遅延（数秒ほど？）の後に検知されるようです。

これにより何が起こりうるか？
例えば、
「アプリがバックグラウンドになった時、非同期通信中であれば通信遮断する」といった動作を実現したいとします。
そこで`onStop`のタイミングで通信遮断する実装にした場合、以下のようになる恐れがあります。

>非同期通信中
>↓
>通信完了してレスポンス返却済み
>↓
>（delayによる遅延で）onStop()が検知されて通信遮断

つまり、通信中にバックグラウンドにしてもdelayによる遅延のせいで、
その間に通信レスポンスが返ってonStopの検知が通信化完了後となる、といった動きになってしまうということです。
これでは**アプリバックグラウンドのタイミングで通信が遮断されない**というわけです。
`ProcessLifecycleOwner`を使用する場合は、この検知遅れに注意して実装する必要があります。（私も実際にここでつまずきましたので…）
文字列を連結して1行で表示

# はじめに
Tableauでは、文字列フィールドに対してMAX(最大値)・COUNTD(一意な数)等の集計はできますが、すべてのデータの文字列を連結するといったことはできません。
今回は**指定したフィールドの文字列を連結して1行で表示**する方法を紹介いたします。

# 使用するデータソース
サンプルスーパーストア

# 目的
「カテゴリ」ごとに「サブカテゴリ」を連結して1行で表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/b0485055-0c57-06a1-16c8-195298d3550c.png)


# 実装
### 手順1
「サブカテゴリ(連結)」フィールドを作成
PREVIOUS_VALUE()：表計算関数であり、一つ前の計算結果を返します
```
PREVIOUS_VALUE('')
+IIF(FIRST()=0,'',',')
+MAX([サブカテゴリ])
```

### 手順2
「LASTフィルター」フィールドを作成
```
LAST()=0
```

### 手順3
ビューに配置
行：カテゴリ、サブカテゴリ
ラベル：サブカテゴリ(連結)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/b19111c6-3ac6-98d3-8c09-49b124423d19.png)
※「サブカテゴリ(連結)」の設定：「次を使用して計算」⇒「サブカテゴリ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/29d9681b-57a8-f2b1-570f-84e40320b536.png)

### 手順4
「LASTフィルター」をフィルターに配置して「真」を選択
※「サブカテゴリ(連結)」の設定：「次を使用して計算」⇒「サブカテゴリ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/1b9a19c1-b5fb-780f-1dbf-b7de866ee8f5.png)
ビッグデータ分析におけるHadoopの基本と代替ツールの選び方

ビッグデータ時代において、膨大なデータの効率的な処理や保存は重要な課題です。その解決策としてよく知られているのが**Hadoop**ですが、すべての状況において適しているわけではありません。この記事では、Hadoopの概要やそのメリット・デメリット、さらにはHadoopがオーバースペックとなる場合に利用すべきツールについて解説します。
※この記事は、ChatGPTの出力を基に作成しています

---

### **Hadoopとは？**
Hadoopは、大規模データの分散保存と分散処理を可能にするオープンソースソフトウェアです。以下の2つの主要コンポーネントを備えています：

- **HDFS（Hadoop Distributed File System）：** データを複数のコンピュータに分散して保存。
- **MapReduce：** データを分散して並列処理するための仕組み。

**メリット**
- **スケーラビリティ：** コンピュータを追加するだけで処理能力を拡張可能。
- **耐障害性：** データの複製機能により、障害に強い。
- **コスト効率：** 安価なハードウェアで運用可能。

**デメリット**
- **リアルタイム処理が苦手：** バッチ処理が得意で、リアルタイム性は低い。
- **運用の複雑さ：** 導入・管理には専門知識が必要。
- **小規模データには不向き：** 分散処理のオーバーヘッドが発生。

---

### **Hadoopが向いている場面と向いていない場面**

**Hadoopが向いている場面**
- **大規模データ（数TB以上）の処理：** 例：SNSログ解析、大規模な売上データ分析。
- **バッチ処理：** 定期的に大量のデータを集計・処理するケース。
- **多様なデータ形式の保存：** 非構造化データ（画像、動画、テキストなど）を扱う場合。

**Hadoopが向いていない場面**
- **リアルタイム処理が必要な場合：** リアルタイムのデータ監視や即時応答が求められる業務。
- **スモールデータの処理：** 数GB規模のデータであれば、他の軽量ツールで十分。
- **簡易なデータ分析：** 小規模な集計や可視化にはオーバースペック。

---

### **Hadoopがオーバースペックな場合に利用すべきツール**
データ量が少なくHadoopが必要ない場合は、以下のようなツールが適しています。

#### **1. RDBMS（リレーショナルデータベース）**
- **無料ツール例：** MySQL、PostgreSQL、SQLite、MariaDB
- **メリット：**
  - SQLによる直感的操作が可能。
  - トランザクション管理が強力。
  - 小～中規模の構造化データに最適。
- **デメリット：**
  - スケーラビリティに限界がある。
  - 非構造化データの処理が難しい。

**向いている場面：** 売上データ管理、在庫管理、顧客情報管理など。

#### **2. パーソナルデータ分析ツール**
- **例：** Excel、Google Sheets、Tableau、Power BI
- **メリット：**
  - 操作が簡単で可視化が充実。
  - 初期コストが低い。
- **デメリット：**
  - データ量が増えるとパフォーマンスが低下。
  - 複雑な処理には向かない。

**向いている場面：** 簡易なデータ分析、トレンドの可視化。

#### **3. Pythonのデータ分析ライブラリ**
- **例：** pandas、NumPy
- **メリット：**
  - 柔軟なデータ加工が可能。
  - 様々なデータ形式に対応。
- **デメリット：**
  - メモリ制約がある（数GB以上のデータは処理が難しい）。

**向いている場面：** データクレンジングや中規模データの分析。

#### **4. クラウド型データウェアハウス（DWH）**
- **例：** Google BigQuery、Amazon Redshift
- **メリット：**
  - スケーラビリティが高く、数GB～数TBのデータを分析可能。
  - 管理不要でSQLを使った分析が可能。
- **デメリット：**
  - クエリの実行ごとに課金される。

**向いている場面：** クラウド上でのデータ分析やログデータ集計。

#### **5. 軽量分散処理エンジン（Apache Spark）**
- **メリット：**
  - インメモリ処理により、高速な処理が可能。
  - リアルタイム分析にも対応。
- **デメリット：**
  - セットアップや運用に知識が必要。

**向いている場面：** 中規模～大規模のリアルタイムデータ分析。

#### **6. NoSQLデータベース**
- **例：** MongoDB、CouchDB
- **メリット：**
  - 非構造化データや柔軟なスキーマ変更に対応。
- **デメリット：**
  - SQLをサポートしていないため、学習コストがある。

**向いている場面：** IoTデータ、ログデータ、JSON形式データ。

---

### **ツール選択の基準**
ツールを選ぶ際は以下の基準を考慮してください：

1. **データ量**
   - 数GB以下：RDBMSやパーソナルツール。
   - 数GB～数TB：BigQueryやSpark。

2. **データ形式**
   - 構造化データ：RDBMSやBigQuery。
   - 非構造化データ：MongoDBやNoSQL系データベース。

3. **処理の目的**
   - 簡易集計やレポート作成：パーソナルツール。
   - 複雑な分析や並列処理：SparkやBigQuery。

4. **運用のコストと管理能力**
   - リソースが限られる場合：クラウド型サービス。
   - 柔軟性が必要な場合：オープンソースツール。

---

### **まとめ**
Hadoopは、大規模なバッチ処理や非構造化データの分析に強力なツールですが、すべてのケースで最適とは限りません。小規模～中規模のデータ分析では、RDBMSやPythonライブラリ、クラウドサービスを活用することで、より効率的に運用できます。

用途やデータ量に応じて適切なツールを選択することで、コストを抑えながら最適な結果を得ることができます。どのツールが自社のニーズに合っているかをよく検討し、必要に応じて複数のツールを組み合わせて活用することをおすすめします！
MSAへの移行の必要性と実現可能性の判断

## MSAへの移行の必要性と実現可能性の判断

### 必要性の観点

1. 開発やデプロイの際に、他のチームのソースや共通モジュールが原因で、スケジュール調整やコミュニケーションが妨げられるほどの問題が発生しているか？
2. 遅延する開発やデプロイプロセスによって、必要なビジネス開発が遅れたことがあるか？（business の観点で）
3. 単一のデプロイによる全体的な影響範囲の把握が難しく、それによって見落としが発生し、頻繁に障害が起きているか？
4. 主要サービスによる頻繁なデータベース負荷が原因で、他のサービスに影響を及ぼした事例が多いか？

### 実現可能性の観点

1. エンジニアリングチームが、MSA構造および各サービス間の通信に関する基本的なアーキテクチャを理解しているか？
2. CI/CDパイプラインを支えるDevOps/SREチームが存在し、トラブルシューティングに必要なインフラ知識を有しているか？
3. MSAやクラウド環境における適切なセキュリティを担保できるセキュリティ担当者がいるか？
4. 社内のエンジニアリング最高責任者が、MSA移行の必要性を十分に理解し、共感しているか？

### MSAは常に良い選択とは限らない

基本的にうまく運用できるのであれば良い選択となり得るが、実際には国内外の企業で安易に導入した結果、モノリシック構造に戻ったケースも存在する。（失敗例は表面化しないことが多い）
**「なぜ（Why）」に対して「だから（Because）」と自信を持って説明できる場合には、良い選択肢となる可能性がある。**
Tableauの機能で丸角背景を作成

# はじめに
Tableauのダッシュボードにおいて背景はとても重要な要素であり、単純にワークシートやワークシートを並べるよりも、グループごとに背景を設定することで視認性が向上します。
オブジェクト(ワークシートやコンテナ等)の背景色を設定すると角がある背景になってしまいますが、今回ご紹介する方法を使用すれば、Tableauの機能だけで丸角の背景を作成することができます。

# 目的
丸角背景の上にグラフを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/855831d3-da17-aa1c-af28-1c9a12022d7f.png)


# 実装

### 手順1
背景用のワークシートを作成
・マークは「多角形」
・「詳細」に適当なフィールドを配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/adb9b587-e953-46e9-d03a-e5026f333ed5.png)

### 手順2
ビューを右クリック⇒「注釈をつける」⇒「エリア」をクリック
「注釈の編集」は空欄でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/09a200ea-a66a-4552-cf9b-b00d6f6906db.png)

### 手順3
四角形が表示されるので、手動で大きさを最大に設定
四角形の角にカーソルを合わせてドラッグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/e8007347-b8a4-3422-2db7-cdf26530e98b.png)

### 手順4
四角形を右クリック⇒「書式設定」をクリックして以下を設定
・「網掛け」から希望の色を選択
・「コーナー」から「丸みがある」項目を選択
　「丸みがある」「かなり丸みがある」「非常に丸みがある」の三段階から選択可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/76fc470c-700a-3f91-7abd-ce35130ccdeb.png)

### 手順5
作成した背景用ワークシートをダッシュボードに配置し、その上に浮動でグラフのシートを配置すれば完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/13f7c065-4ca0-102c-1b77-f3f77503f79f.png)
PC全体のファイルを速攻で見つけたい！「Everything」を使ってみた。

## はじめに
エンジニアの皆さんなら一度は思ったことがあるのではないでしょうか。。
「前作ったあのファイルってどこだっけ」
「アプリのiniファイル書き換えたいんだけどどこだっけ」
「似た名前のフォルダが至るとこにあり、どこに目的のファイルあったっけ」
これを解決できるのが`Everything`というフリーソフトです。
## このアプリの概要

**PC全体のファイルを検索できます。**

## ダウンロード
[公式サイト](https://www.voidtools.com/)からダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/a40a4028-d650-dbfe-3b5c-27bdb1f6275e.png)

`Everything-1.4.1.1026.x64-Setup.exe`を起動。言語を選択し、「OK」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/9444c232-a88e-377c-fe8b-ec838570d4b9.png)
使用許諾契約を読み、良ければ同意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/474effad-d160-c60b-fdc9-487d7a0c5381.png)
インストール先のフォルダを選択。
（デフォではProgram Files配下にフォルダが作成されます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/bdbe2760-14f0-d4ba-c15c-bff963d47ba3.png)
インストールオプションを選択。キャプチャは自分の設定。設定したら「インストール」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/614e4f95-4def-9bfe-2aba-3d7c83a3a654.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/9d933e8d-299d-933c-c0ee-8e25f7ea56dd.png)

## 使い方
「ツールバー」の隠れてるインジケータからオレンジの虫眼鏡マークを探す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/f6a87ac6-40ef-6c65-f54f-fe8361364a3e.png)
右クリックして、メニューを表示。
「検索ウィンドウを表示（S）」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/5c9f5155-da41-8b54-486c-101cf523291d.png)
検索バーに拡張子やキーワードを入力して検索ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/1e031101-ae0d-b33e-f0dc-b41e65af446c.png)
SQLについて学ぼう！（第1回：SQLとデータベースについて）

## 1. はじめに
本書では、SQLをこれから学びたい人向けに、SQLの概要や構文の使い方を説明していきます。
第1回は『SQLとデータベースについて』のテーマで、SQLとデータベースの概要を説明していきます。


## 2. SQLとは
SQLは『Structured Query Language』の略で、リレーショナルデータベース（RDB）を操作するために使われる言語です。
企業の業務システムからWebサイトまで様々な場面で利用されており、データ分析や情報管理に欠かせない存在となっています。

また、SQLは多くのRDBシステムで共通して利用できるため、一度学習すれば様々なシステムで活用することができます。

「リレーショナルデータベース？」「操作？」とハテナが浮かぶ方もいるかもしれませんが、本書ではそれらについても説明していきます。


## 3. データベースとは
データベースとは、電子媒体で格納された膨大なデータを、効率的に保存、管理するためのツールです。
「データ」とは具体的に何を指すかというと、例えば会社に関わるデータの場合は以下のようなものです。

・社員　：社員コード、名前、性別、生年月日、住所など
・商品　：商品コード、商品名、型番、サイズ、原価など
・取引先：取引先コード、取引先名、住所、担当者など

会社の規模によっては、これらのデータの件数が数十万～数百万単位になるなど、会社を運営するうえで膨大な量のデータを管理する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949924/c161ef35-4100-f8b5-f13f-b904a7451b34.png)


## 4. データベースの種類について
データベースは、大きく2種類に分けることができます。

### 4-1. RDB
RDBは『Relational Database』（リレーショナルデータベース）の略で、「テーブル」と呼ばれる表形式のデータを複数関連付けて管理するデータベースのことです。

**社員マスタ**
| 社員番号 | 名前         | 性別 | 生年月日    | 住所                   |
|:--------|:-------------|:-----|:-----------|:----------------------|
| 1       | 佐藤 一郎     | 男   | 1964/09/25 | 東京都新宿区○○○        |
| 2       | 鈴木 花子     | 女   | 1992/05/02 | 大阪府大阪市×××        |
| 3       | 高橋 二郎     | 男   | 2000/09/26 | 愛知県名古屋市△△△    |
| 4       | 田中 花美     | 女   | 1985/12/12 | 福岡県福岡市□□□        |

テーブルにはそれぞれ名前が付いており、上記の表は「社員マスタ」という名前の付いたテーブルです。
表形式なので行と列で構成されており、行を「レコード」と呼び、列を「フィールド」と呼びます。
（行を「row（ロウ）」、列を「column（カラム）」と呼んだりもします。）

***※RDBの製品例***
・Microsoft SQL Server
・Oracle Database
・MySQL
・PostgreSQL
・SQLite
・Db2

:::note info
※本書では、RDBをベースとしてSQLの説明をしていきます。
:::

### 4-2. NoSQL
NoSQLは『Not Only SQL』の略で、RDBではないデータベースの総称です。
RDBは表形式のため、どのレコード（行）に対しても同じフィールド（列）がありましたが、NoSQLは非RDBであるため、レコード毎に決まったフィールドがありません。

以下は、NoSQLの一種であるキーバリュー型のデータです。

**商品マスタ**
| Key | Value                                             |
|:----|:--------------------------------------------------|
| 1   | （商品名：○○、型番：××-××、サイズ：100cm×50cm×30cm） |
| 2   | （商品名：△△、型番：□□-□□、容量：1,000ml）         |

Valueに注目すると、レコードによって保持するフィールドが異なっているのが分かります。

***※NoSQLの製品例***
・Redis
・Apache HBase
・MongoDB

:::note alert
※NoSQLは、SQL言語で操作しないものである為、概要説明にとどめます。
:::

## 5. SQLでできること
データベースに格納されている膨大なデータに対し、SQLで以下の操作を行うことができます。

### 5-1. データの追加、更新、削除
テーブルに対して新しい行を追加したり、特定の条件を指定することで既存データの更新や、不要な行の削除を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949924/95874e4d-2191-fe8c-bf7c-9cabdd270fbe.png)

### 5-2. データの検索・抽出
特定の条件に合うデータの抽出や、複数のテーブルを結合して新しい表を作成することができます。

**（例）取引先マスタと社員マスタを結合して、取引先毎の担当者表を作りたい場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949924/f2b5ea88-2271-82d6-aee4-7e2e46613bca.png)

### 5-3. データの集計
データをグループ化して、合計値、平均値、最大値、最小値などを計算することができます。

**（例）取引先マスタの取引先毎に、売上金額の合計を知りたい場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949924/1a351abf-8c83-5547-9d3e-4c435a071d24.png)


## 6. まとめ
・データベースには、RDBとNoSQLの2種類ある
・SQLとは、RDBを操作するための言語である
・RDBとは、行（レコード）と列（フィールド）の表形式で構成されており、
　複数の表（テーブル）を関連付けて管理することができる
個人的な備忘録：GoとLINE Notifyで環境構築からトークン取得まで、簡単にLINE通知機能を実装してみた

## はじめに
Goを使えば、LINE Notifyを活用してLINEに簡単に通知を送る仕組みを実装できます

:::note
**このスクリプトは、Go初心者やLINE Notifyを初めて利用する方にもわかりやすい内容となっています。**
:::

***この記事では、環境の準備から実際に通知を送信するまでの手順を丁寧に解説します。***

## 書こうと思ったきっかけ
この仕組みは、以前Pythonを使って実装しましたが、今回はGoで置き換え、知識を横展開してみようと考えました。

**詳細は、以下の記事をご参照ください：**

https://qiita.com/free-honda/items/8c5c3ec4cdb6ad6a5107

最近、Go言語について少し勉強を始めたばかりで、まずは動くものを作ることを目標にしています。***その第一歩として、今回簡単なLINE通知機能を作成しました。***

私の想定していた成果物が完成したので、この記事を通じてアウトプットしていきたいと思います。

## 必要な環境準備

### Goのインストール
お使いの端末でGo言語の環境構築がまだ終わっていない場合、過去の記事で方法を紹介していますので、参考にしてください。

https://qiita.com/free-honda/items/b3672e2ccfedbb14773a

### LINE Notify トークンの取得
LINE Notify にログインし、トークンを発行してください。発行したトークンを以下のコード内の `lineNotifyToken` にコピー＆ペーストすることで利用できます。

https://notify-bot.line.me/en/

### コードの準備
以下のコードをローカル環境のファイル（例: `line_notify.go`）に保存します。

```line_notify.go
package main

import (
	"bytes"
	"fmt"
	"net/http"
	"net/url"
)

func sendLineNotify() {
	// LINE Notifyのトークンをここに設定してください
	lineNotifyToken := "あなたのLINE Notifyトークンをここに入力"
	lineNotifyApi := "https://notify-api.line.me/api/notify"

	// メッセージデータをフォームエンコード形式で準備
	data := url.Values{}
	data.Set("message", "Goから通知検証が成功！")

	// HTTPリクエストの設定
	req, err := http.NewRequest("POST", lineNotifyApi, bytes.NewBufferString(data.Encode()))
	if err != nil {
		fmt.Println("リクエストの作成に失敗しました:", err)
		return
	}

	// ヘッダーに認証情報を設定
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Set("Authorization", "Bearer "+lineNotifyToken)

	// HTTPリクエストを送信
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("通知の送信に失敗しました:", err)
		return
	}
	defer resp.Body.Close()

	// レスポンスを確認
	if resp.StatusCode == http.StatusOK {
		fmt.Println("LINEに通知が送信されました")
	} else {
		fmt.Printf("通知の送信に失敗しました: %d\n", resp.StatusCode)
	}
}

func main() {
	sendLineNotify()
}
```

- **コードの説明**
  - **LINE Notifyトークン**
    - `lineNotifyToken` に自身のLINE Notifyトークンを設定します。
  - **フォームデータ**
    - `url.Values` を使って通知メッセージを指定しています。この形式はLINE Notify APIが受け付けるものです。
  - **HTTPリクエストの送信**
    - `http.NewRequest` を使ってリクエストを作成し、ヘッダーに認証情報とデータを設定しています。
  - **レスポンスの確認**
    - `resp.StatusCode` をチェックし、200（成功）であれば送信成功、それ以外はエラーを表示します。

## スクリプトを実行してみた
ターミナルで保存したスクリプトを以下のコマンドで実行します。

```bash
go run line_notify.go
```

このコマンドを実行すると、LINEに通知が送られるはずです。

**実際のコマンド結果**

```bash
➜  Desktop git:(main) ✗ go run main.go
LINEに通知が送信されました
```

LINE Notifyの指定したトークルームまたは自分のアカウントに通知が届いていれば成功です。

### エラーが発生した場合
通知に失敗した場合は、HTTPステータスコードとエラーメッセージが表示されます。

## LINE通知の結果
今回のコードを実行した結果、以下のような通知がLINEに届きました。

![Screenshot 2025-01-26 at 16.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/86d6abb2-9efb-b94c-2e8c-d6d600fdc199.png)

通知メッセージの内容は「`Goから通知検証が成功！`」で、スクリプトを実行するたびに通知が正常に届くことを確認しました。

## まとめ
初めてLINE Notifyを使用した際は、トークンの発行やGoコードの実装に少し不安がありましたが、シンプルなAPI設計のおかげでスムーズに動作させることができました。

:::note info
***LINEに通知が届くことで、プログラムが実際に動いていることを実感できたのが、とても良い体験でした。***
:::

特に、身近なLINEアプリを活用することで、エラーや処理完了の通知をリアルタイムで確認できるのは非常に便利だと感じました。
VivaldiでGoogleのページ翻訳を簡単に使う

# 目的
Vivaldiには標準で翻訳機能がついているが、Chromeなどに搭載されるGoogle翻訳に及ばない。
単一語句の翻訳であればあまり気にならないが、ページ全体の翻訳などでは粗が目立ち、これを回避するたびに毎回Chromeを開き直すのが面倒なのでVivaldi内で完結できるようにする。

# 解決法
Vivaldiのコマンドチェイン機能を使ってJavascriptコードを実行する。
脳死ChatGPTコードコピペだけど機能してるから許してほしい。

# 手順
1. 「設定」から「クイックコマンド」を開く
1. コマンドチェイン項目で新規項目を「＋」から追加し、適当な名前をつける(今回translate)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995370/f7721c9a-58fe-4bef-9e42-d5dff989f5de.png)

1. Command1を「現在のタブでリンクを開く」にして次のコードをコピペ
    ```javascript
     javascript: (() => { const currentURL = location.href; const translateURL = `https://translate.google.com/translate?sl=en&tl=ja&u=${encodeURIComponent(currentURL)}`; window.open(translateURL, '_blank'); })();
     ```
1. 任意の英字ページ上でF2などを押してクイックコマンドを起動。その後先程の名前を検索(translate等)を探して実行

コマンドチェインはマウスジェスチャやショートカットに登録できるので毎回検索->実行しなくてもよくなる。

また、実行コード内のURL「sl=en」や「tl=ja」を変更すると英語->日本語に限らず翻訳ができる。

# 最後に
これでVivaldiがまた強くなってしまったね。
【電脳少女プログラミング2088-壊レタ君を再構築-】D問題 データセンター解答(SQL)

https://ppg.paiza.jp/denno2088/challenges/denno2088_s_d_01

現在開催中の「電脳少女プログラミング2088」で出題されているD問題相当の「データセンター」を解きましたので、その解答内容をここに残しておきます。
問題のリンクは上記です。


## 問題内容
問題の内容を簡単にまとめると下記のようになります。
> 「person」という名前のデータベースから「id」と「name」の2つのカラムを抽出する


## 解法
特に難しい文法を使用する必要もなく、ただ単に`SELECT`を使用し`id` `name`を抽出するだけで正解できます。
下記のようなコードで実装できます。
```SQL
SELECT
    id, name
FROM
    person;
```
このSQLのコードでは、`SELECT`句を使用してデータベース内の`person`テーブルから`id`列と`name`列を指定し、それを抽出しています。
特定の条件を満たすデータのみを抽出するような場合には`WHERE`句を使用して抽出データの絞り込みを行いますが、今回はそのような制約がないため`WHERE`句の使用は不要です。


## 余談
ちなみになのですが、最初は下記コードを提出しRuntime errorを食らいました。
原因は`preson`というスペルミスです。
皆さんもタイプミスには気を付けましょう…
```SQL
SELECT
    id, name
FROM
    preson;
```
ECサイトへのサイバー攻撃による国内クレジットカード情報漏えいインシデントまとめ/2024年12月公表分

# 概要

- 2024年12月に公表されたクレジットカード情報漏えいインシデントのまとめです

# notes
- この月間に公表したものなので、各インシデントごとの被害発生期間は別です
- どの程度のインシデントと被害が月ごとに発生しているかの備忘録であり報道記事ではないので、原則として当事者法人等の個別具体的名称は書きません
- 被害に該当可能性のある人には事業者等より個別に連絡があると思われます


# 当月の被害の概要

- 12月は、1件のクレジットカード情報漏えいインシデントが国内で公表されました
- 合計で、71,943件ほどのクレジットカード情報について漏えいの可能性があるそうです

# 当月のインシデント

## 1. 衣料品販売サイト

### 被害について
- 71,943件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2019年12月27日～2024年5月15日とのことです
- 292,707件の個人情報の漏えいの可能性があります

### 経緯・原因等

- 2024年6月26日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- また、当該サイトの管理運用においてセキュリティ侵害を検知する仕組みが不足していたか存在していなかったため、被害発生期間が長期化した原因につながったものと思われます


# 感想

- 当月のインシデント件数は1件でしたが、被害規模は大きいものだったと感じます


# おまけ

## 「クレジットカード・セキュリティガイドライン」

- [経産省：「クレジットカード・セキュリティガイドライン [5.0版]」](https://www.meti.go.jp/press/2023/03/20240315002/20240315002.html)
- [(一社)日本クレジット協会:関連資料](https://www.j-credit.or.jp/security/document/index.html)

## IPA(独立行政法人情報処理推進機構)
- [ECサイト構築・運用セキュリティガイドライン](https://www.ipa.go.jp/security/guide/vuln/guideforecsite.html)

## 個人情報保護委員会
- [個人情報保護委員会](https://www.ppc.go.jp)
    - [個人情報保護委員会 - 個人情報保護法関連法令・ガイドライン等](https://www.ppc.go.jp/personalinfo/legal/)
    - [個人情報保護委員会 - 個人情報保護法相談ダイヤル](https://www.ppc.go.jp/personalinfo/pipldial/)
    - [個人情報保護委員会 - 漏えい等の対応とお役立ち資料](https://www.ppc.go.jp/personalinfo/legal/leakAction/)

## 割賦販売法関連
- [割賦販売法](https://laws.e-gov.go.jp/law/336AC0000000159)
- [割賦販売法施行令](https://laws.e-gov.go.jp/law/336CO0000000341)
- [割賦販売法施行規則](https://laws.e-gov.go.jp/law/336M50000400095)
- [経産省サイト - 割賦販売法](https://www.meti.go.jp/policy/economy/consumer/credit/11kappuhanbaihou.html)

## 経産省
- [クレジットカード・セキュリティ官民対策会議](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_security/index.html)
(2024年4月9日〜)
- [クレジットカード決済システムのセキュリティ対策強化検討会](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/index.html)
(2022年8月4日〜2023年1月20日)
    - [クレジットカード決済システムのセキュリティ対策強化検討会 報告書](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/pdf/20230120_1.pdf)
    - [クレジットカード決済システムの更なるセキュリティ対策強化に向けた主な取組のポイント](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/pdf/20230120_2.pdf)


# フッター

## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421
参照先がindex.tsxではなくindex.tsになってしまう

`TypeScript`と使ってプロジェクトにおいてUIコンポーネントを作成して、いざ活用して別のコンポーネントを作成しようと際に、`index.tsx`ではなく`index.ts`を参照してしまう問題に直面しました。その当時のディレクトリ設計や`tsconfig.json`と合わせて説明しようと思います。

## ディレクトリ設計
ざっくりですが、以下のようなディレクトリ設計を組んでました。
```
apps/
├── routes/
│   └── _index.tsx
└── ui/
    └── button/
        ├── index.ts // ユーティリティ関数等を定義
        └── index.tsx // Buttonコンポーネントを定義
```

## tsconfig.json
```json
{
  "include": [
    "**/*",
    "**/.server/**/*",
    "**/.client/**/*",
    ".react-router/types/**/*"
  ],
  "compilerOptions": {
    "lib": ["DOM", "DOM.Iterable", "ES2022"],
    "types": ["node", "vite/client"],
    "target": "ES2022",
    "module": "ES2022",
    "moduleResolution": "bundler",
    "jsx": "react-jsx",
    "rootDirs": [".", "./.react-router/types"],
    "baseUrl": ".",
    "paths": {
      "~/*": ["./app/*"]
    },
    "esModuleInterop": true,
    "verbatimModuleSyntax": true,
    "noEmit": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "strict": true
  }
}
```

## 問題
`routes/_index.tsx`ファイル内で`import { Button } from '~/ui/button'`と記載した際、`TS2305: Module "~/ui/button/index" has no exported member Button`というエラーが発生しました。

## 原因
`TypeScript`においてディレクトリを指定した場合、自動的に`index.ts`を探すモジュール解決ルールが存在します。
そのため、同階層に`index.ts`と`index.tsx`がそれぞれ存在すると、`index.ts`が優先され、`index.tsx`は無視されてしまいます。

## 解決方法
以下どちらかが解決方法になります。

1. `index.ts`のファイル名を変更する
2. `button`ディレクトリにサブディレクトリを作成して、そっちで`index.ts`を管理する

今回は2の方を採用し、ディレクトリ設計を以下のように変更しました。
```
apps/
├── routes/
│   └── _index.tsx
└── ui/
    └── button/
        ├── _logics/
        │   └── index.ts
        └── index.tsx
```

## まとめ
ChatGPTに相談したところ、`tsconfig.json`内の`include`設定や`resolveJsonModule`が`false`になっていないかと提案をしてくれましたが、いずれも間違っていなかったので、答えに辿り着くまでに少々時間がかかりました。
ES6の学び

# はじめに
プロゲートのJabaScript学習レッスンの無料版まで（if文からは有料）やった内容のアウトプットです。変数や定数を学びました。
## 学んだこと
console.log("Hello World");を実行すると、コンソールに「Hello World」と表示されます。ここで気をつけたいのが、**ダブルクオーテーション**(")の存在と**セミコロン**（;）の存在です。これらが適切な位置にないとエラーになってしまいます。ダブルクオーテーションでなくとも、シングルクオーテーション（'）でも良いです。セミコロンは文章の句読点のようなものなので忘れないようにしましょう。そして文の頭にスラッシュ（//）をつけてあげることで、その分をコメントとして認識させることができます。
### 数字の扱い
console.log(1);をコンソールに出力すると1としっかり出力できます。数字は”が必要ありません。またconsole.log(1+1);の出力は2です。計算をしてくれます。console.log("1+1");は1+1と出力され文字として認識されます。＋を＊や/にすることで掛け算、割り算もできます。console.log(9% 2);ではあまりの計算もできます（この場合の表示は１になる）。
### 文字の連結
console.log("東京”＋”りんご”);は東京りんごと表示させることができます。
### 変数など
変数とは値（データ）を入れておく箱のことを言います。その箱には名前がついていてそれを**変数名**といいます。letは変数を宣言するキーワードです。let dir="sora";でdirという変数にsoraという値（データ）を代入することができました。データを表示させるにはconsole.logを使います。この場合console.log(dir);と出力すれば、soraと表示されるはずです。
let name =("吉川");
console.log(name+"こんにちは");で吉川こんにちはとなります。下は数字です。
let number =10;
console.log(number+20);で30となり計算してくれます。
なぜ変数を使うのかというと同じ値を使い続けられたり、変更を加えやすかったり、値の理解のしやすさを実現させるためです。例えば
cosole.log("吉川さんおはようございます");
cosole.log("田中さんおはようございます");
cosole.log("桐生さんおはようございます");
ではおはようございますの部分をこんばんはにひとつづつ変えるには非効率的です。変数を使えば
let text="こんばんは";
cosole.log("吉川さん"+text);
cosole.log("田中さん"+text);
cosole.log("桐生さん"+text);
で代入した値の部分を変更するだけで全ての変更が完了します。
そして変数名はわかりやすい英単語にした方が良いです。また単語を二つ繋げる場合２つ目の英単語を大文字にしましょう。
let name="吉川";
console.log(name);は吉川と出ます。
name="松田";
console.log(name);では変数の値が変更し吉川の後に松田と表示されます。
let number=2
number=number+3;
cosole.log(number);すでに２と定義した変数に３を足したい場合はこうすることで代入できます。これにはnumber+=3;と省略できます。
### 定数
変数と似た機能を持つ定数というものがあります。
const name="吉川";と書きます。定数は変数のように値を変えられません。変数はコードを書いていく過程で、いつの間にか値が変わってしまうことがあります。定数の方がより安全にコードを書くことができます。
### テンプレートリテラル
テンプレートリテラルとは文字列に定数や変数を埋め込めます。
const name="吉川";
```console.log(`こんにちは、${name}さん`);```でこんにちは、吉川さんと表示できます。`(シングルクォート)でないと＄（定数）と認識してくれませんのでこんにちは、${name}さんと表示されてしまいます。
# 終わりに
記事の内容と関係ないですがQiitaでシングルクォートや＄の入力は慣れないと難しいなと感じました。
ODCのLogger API (JavaScript)

ODCが提供するJavaScript APIの中に、ログ出力を行うLoggerがある。

# ドキュメント
[Logger - ODC Documentation](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/outsystems_language_and_elements/outsystems_apis/javascript_api/logger/)

# erorr API
## 役割・機能
クライアント側から、ODC PortalのLogsにログを出力する。
SeverityはError。

## 使い方
Client ActionのフローにJavaScript要素を配置し、以下のように呼ぶ。

``` js
// カテゴリとエラーメッセージを指定するパターン
$public.Logger.error("Logger Test", "Error Message");
// ↑に加えてError Objectを指定するパターン（例外処理時に使う）
let err = new Error("Error Object");
$public.Logger.error("Logger Test", "Error Message", err);
```

引数は、以下の通り。1と2が必須。
1. category (string): 出力するログをグループにまとめるキー情報らしい。現時点（2025/01/26) では特に使われていないように見える
1. message (string) または error (Errorオブジェクト）: ODC Portal/LogsでMessageとして出力される
1. （任意）error (Errorオブジェクト）: 指定したら、messageに加えてErrorオブジェクトの滅っセージ部分も出力された

以下は、2番目の例（messageとerror療法を指定）での出力結果。Message項目を見ると、APIのmessageが1行目、errorのメッセージ部分は2行目に出力されている。
![スクリーンショット 2025-01-26 0.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/06abd597-7447-a788-4249-4e7ddd2152c5.png)

## サーバー側へログを登録する通信を覗いて見る
ブラウザの開発者ツール > ネットワークタブを開いた状態でログを発生させて覗いてみる。
![スクリーンショット 2025-01-26 15.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6e64e1a4-e241-2430-df94-0f5ab4a70d87.png)

この観察によると、
- JavaScript APIで記録したログは、「https:\//Host/App名/v2/logs」というアドレスへのリクエストでサーバーに反映される
- 短時間に複数のログAPI呼び出しをすると、一度のv2/logs呼び出しで複数のログが記録される
- 各ログは、v2/logs呼び出しリクエストのresourceLogs[0]/scopeLogs[0]/logRecordsに配列要素として渡される
- いくつかODC Portal/Logsページも併せて検討すると、恐らく
    - attributes配列内のkeyがexceptionで始まる要素に渡したErrorオブジェクトの情報がわたる
    - 渡したcategoryはattributes配列内のkey=outsystems.log.message.tag項目に入る
    - attributes配列内のkey=outsystems.error.codeの要素には、ODCが決めたエラーコードが自動設定される→ODC Portal/LogsではMessageの先頭に表示される
    - 渡したエラーメッセージそのものは、attributesではなく、body/stringValueに渡される
    - severityNumberとseverityTextでログレベルの制御をしていそう

2025/01/26時点ではサーバサイドでエラーログを出力するにはException Handlerを使うしかないと思う。しかし、上で見た方法ででErrorログを出せるなら、基盤側にはエラーログを受け取る機能はあるので、OutSystems 11にあったLogErrorをODCにも作って欲しいところ。

# log API
## 役割・機能
クライアント側から、ODC PortalのLogsにログを出力する。
SeverityはInfo。

## 使い方
Client ActionのフローにJavaScript要素を配置し、以下のように呼ぶ。

``` js
// カテゴリとエラーメッセージを指定するパターン
$public.Logger.log("Logger Test", "Info Message");
```

引数は、以下の通り。ドキュメントには記載がないが、省いて実行してもエラーが出なかったので1も2も必須では無さそう。messageを省いてしまうとログの意味がないが。
1. category (string): 出力するログをグループにまとめるキー情報らしい。現時点（2025/01/26) では特に使われていないように見える
1. message (string) または error (Errorオブジェクト）: ODC Portal/LogsでMessageとして出力される

# オフラインでもAPIの実行は可能
ブラウザの開発者ツールを使い、ネットワークがない状態でAPIを実行してみた。
その後ネットワーク有りの状態に戻してしばらく待つと、自動的にv2/logsアドレスへの通信が発生した。オフライン時にAPIを実行すると、しばらくローカルに持っておき、復帰後に連携する仕組みのようだ。

ブラウザの機能でネットワークがない状態を作る機能は、Chromeの場合は以下の場所にある。
下の赤枠部分をOfflineにすると、ネットワークなしの状態をシミュレートできる。
![スクリーンショット 2025-01-26 16.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e3f00af0-9322-93f8-35ff-431866c06c58.png)

# ODCのJavaScript API関係の過去記事
https://qiita.com/jyunji_watanabe/items/ed8a72f0478b8dd31b89
Next.jsアプリケーションで実施するべきセキュリティ対策とその重要性

# はじめに

Next.jsは、サーバーサイドとクライアントサイドの両方で動作する柔軟なフレームワークです。この柔軟性が利便性を向上させる一方で、セキュリティリスクも高まります。これらのリスクに対処するためには、以下のような攻撃や脆弱性を理解し、適切な対策を講じる必要があります。

- **XSS（クロスサイトスクリプティング）**: 悪意のあるスクリプトがユーザーのブラウザ上で実行される攻撃。
- **CSRF（クロスサイトリクエストフォージェリ）**: ユーザーが意図しない操作を実行させられる攻撃。
- **データ改ざん**: 悪意のある第三者がデータを不正に変更する攻撃。
- **セッションハイジャック**: ユーザーのセッションを乗っ取る攻撃。

これらは、アプリケーションの信頼性を損ない、ユーザーの個人情報が漏洩する原因となります。

Next.jsはセキュリティの初期設定が最小限にとどまっているため、開発者が意識的にセキュリティ対策を講じる必要があります。

---

## 自分で対策する重要性

Next.jsでは、セキュリティ対策のほとんどを開発者が設計・実装する必要がありますが、これには以下の理由があります：

- **ユーザーの安全を守る**: ユーザーが安心してアプリケーションを利用できる環境を提供します。
- **攻撃を未然に防ぐ**: セキュリティの甘さを攻撃者に狙われるリスクを軽減します。
- **アプリの信頼性を向上させる**: セキュリティ対策は、ユーザーや企業からの信頼を得るために欠かせません。

以下では、代表的なセキュリティ対策とその重要性について解説します。

---

## **1. Content Security Policy（CSP）の設定**

### **なぜ重要か？**
CSPは、外部リソースの読み込みを制限することで、悪意のあるスクリプトの実行を防ぎます。特に、XSS攻撃の初期段階を遮断する「第一防衛線」として機能します。たとえば、攻撃者が埋め込んだスクリプトがユーザーの個人情報を盗むのを防ぐことができます。

- **外部リソース制限の例**: Google Analyticsを利用する場合、CSPで「Google以外のスクリプトはブロックする」と設定することで、不正なリソースの実行を防ぎます。

参考資料: [Next.js - Content Security Policy](https://nextjs.org/docs/app/building-your-application/configuring/content-security-policy)

---

## **2. CSRFトークンの導入**

### **なぜ重要か？**
CSRF攻撃では、攻撃者がユーザーの意図しない操作を実行させる危険があります。たとえば、ユーザーが知らない間にアカウント情報を変更されるなどの被害が生じる可能性があります。

CSRFトークンは、リクエストごとにランダムに生成されるトークンを検証することで、不正なリクエストを防ぎます。これにより、ユーザーが送信した正当なリクエストかどうかを確認できます。

参考資料: [OWASP - CSRF Prevention](https://owasp.org/www-community/attacks/csrf)

---

## **3. 入力データのサニタイズ**

### **なぜ重要か？**
ユーザーが入力したデータをそのまま処理すると、XSSやSQLインジェクションの原因となる可能性があります。たとえば、`<script>alert('XSS')</script>`のような悪意のあるコードがデータベースや画面に挿入されると、攻撃者が意図した不正動作を引き起こします。

サニタイズ処理を行うことで、入力データがコードとして実行されるのを防ぎ、安全性を確保できます。たとえば、HTMLタグをエスケープして「ただの文字列」として扱います。

参考資料: [OWASP - Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html)

---

## **4. XSS対策**

### **なぜ重要か？**
XSS（クロスサイトスクリプティング）は、攻撃者が悪意のあるスクリプトを実行させ、ユーザーの認証情報や個人データを盗む攻撃です。Next.jsでは、特に`dangerouslySetInnerHTML`を使用する場合に注意が必要です。

信頼できないデータを直接HTMLに埋め込まないようにし、必ずエスケープ処理を施すことで、XSSリスクを軽減できます。

参考資料: [Vercel - Understanding XSS Attacks](https://vercel.com/guides/understanding-xss-attacks)

---

## **5. HTTPヘッダーの設定**

### **なぜ重要か？**
HTTPヘッダーを適切に設定することで、アプリケーションの基本的なセキュリティを強化できます。以下のヘッダーは特に有効です：

- **X-Content-Type-Options**: 不正なファイル実行を防ぎます。
- **X-Frame-Options**: クリックジャッキング攻撃を防ぎます。
- **Strict-Transport-Security（HSTS）**: HTTPS通信を強制します。

これらの設定は、攻撃者に利用されやすいブラウザの動作を制限し、簡単にセキュリティを向上させることができます。

参考資料: [MDN Web Docs - HTTP Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)

---

## **まとめ**

Next.jsアプリケーションを安全に保つためには、以下の対策を実施する必要があります：

1. **CSPの設定**: 外部リソースの制限でXSSリスクを削減。
2. **CSRFトークンの導入**: 正当なリクエストのみを許可。
3. **入力データのサニタイズ**: 外部データの安全性を確保。
4. **XSS対策**: ユーザーのデータや認証情報を守る。
5. **HTTPヘッダーの設定**: 簡易で効果的な防御策を追加。

これらの対策を実践することで、セキュリティリスクを最小化し、ユーザーの信頼を築くことができます。
Laravel TestCaseのDB migration 設定

# はじめに
新しいbranchでテストを実行したところ、DBが存在しないよ！エラーに当たったのでテストケース用のDBマイグレーションの設定方法をメモ。

# 設定
### 1. TestCase.php
テストケースの基盤となるクラス。通常は`tests`の下に存在します。
このクラスに、テスト環境を整えるためのsetUp関数を設定していきます。
```php
abstract class TestCase extends BaseTestCase
{
//....
    protected function setUp(): void
    {
        parent::setUp();
        DB::beginTransaction(); // Start transaction
        $this->artisan('migrate:fresh'); // Migration
    }

    protected function tearDown(): void
    {
        DB::rollBack(); // transaction rollback
        parent::tearDown();
    }
}
```
この設定により、各テストの実行前にsetUpメソッドが呼び出され、データベースがリフレッシュされます。マイグレーションをテスト全体の前に一度だけ実行するか、各テスト毎に実行するかは、要件に応じて設定してください。

データベーススキーマの設定は、`$this->artisan('migrate:fresh');`で実行されます。この段階で必要となるマイグレーションファイルを作成します。

### 2. Migration file
テストに必要なテーブルuser_tableを例にマイグレーションファイルを作成します。

```php
<?php

declare(strict_types=1);

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

class CreateTestTables extends Migration
{

    public function up(): void
    {
        DB::unprepared('
            DROP TABLE IF EXISTS `user_table`;
            /*!40101 SET @saved_cs_client     = @@character_set_client */;
            /*!40101 SET character_set_client = utf8 */;
            CREATE TABLE `user_table` (
              `id` int(11) NOT NULL AUTO_INCREMENT,
              `name` varchar(20) NOT NULL,
              `phone_number` varchar(15) DEFAULT NULL,
              `birthday` date DEFAULT NULL,
              `post_id` varchar(7) DEFAULT NULL,
              `delete_flg` char(1) DEFAULT '0',
              `regist_datetime` datetime DEFAULT NULL,
              `update_datetime` datetime DEFAULT NULL,
              CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
              PRIMARY KEY (`id`),
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        ');
    }

    public function down(): void
    {
        DB::unprepared('
            DROP TABLE IF EXISTS `user_table`;
        ');
    }
}
```
このマイグレーションでは、migrate:freshコマンド実行時にupメソッドが呼び出され、定義されたuser_tableが作成されます。


# おわりに
実際のプロジェクトでは、`up()`の中身は凄まじく長い内容になる可能性があるので、別ファイルに書いてファイルを読み込むという形の方が管理しやすいかと思いまs。
参考になれば幸いです🍏
途中を省略した棒グラフの作成

# はじめに
ある項目ごとの値を比較するために棒グラフを作成したが、値に対して差が小さいため同じ長さに見えてしまうといったことはありませんか？
本記事では、棒グラフの途中を省略して上部のみを表示させることで、小さい差でも目視で比較できる棒グラフを作成します。

# 目的
軸範囲が常に表示されている最小値の80%以降となる棒グラフ
・通常の棒グラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/1119c036-07c5-cbee-eb6f-c0cd50790086.png)
・利益が最小である事務用品の80%(約650万円)以降を表示するぼうぐらふ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/d90b72e3-986a-d1c0-0d3b-4b68702071c4.png)

# 使用するデータソース
サンプルスーパーストア

# 実装
### 前提
「カテゴリ」ごとの「利益」合計を比較する棒グラフ
列：カテゴリ
行：合計(利益)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/1119c036-07c5-cbee-eb6f-c0cd50790086.png)


### 手順1
マークタイプを「ガントチャート」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/8cd512d6-5569-71cc-4b83-933933991874.png)

### 手順2
「軸の編集」を開き、「ゼロを含める」のチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/3e991e57-af24-a64f-26ce-2de20226922a.png)

### 手順3
「利益(最小値)」フィールドを作成
```
WINDOW_MIN(SUM([利益]),FIRST(),LAST())
```

### 手順4
「利益(サイズ)」フィールドを作成
今回は最小値の80%以降を表示させるため0.8を掛けております。
```
-SUM([利益])+[利益(最小値)]*0.8
```

### 手順5
「利益(サイズ)」フィールドをマークカードの「サイズ」に配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/79032ce5-7e06-6c83-6cdc-f4fd668fca7e.png)
createContext（アプリ全体で値を共有する）

## createContextとは
Reactの組み込み関数で、アプリ全体で共有できる保存場所を作成する。

## 使用例
```typescript
import { createContext } from 'react';
const LanguageContext = createContext<LanguageContextType | undefined>(undefined);
```

## アプリ全体で共有する、とは？
値を共有したい状況の例（Contextを使わない場合）：
```typescript
jsxCopy// トップページ
function TopPage() {
  const [language, setLanguage] = useState('ja');
  // ↑ この言語設定を他のページでも使いたい
}

// 商品ページ
function ProductPage() {
  // ここでも言語設定が必要
}
```
Contextを使うと：
```typescript
jsxCopy// どのコンポーネントでも
function AnyComponent() {
  const { language } = useContext(LanguageContext);
  // 言語設定を取得できる
}
```
つまり、Contextは「プロジェクト全体で共有したい値」を保存する場所です。

## 一般的な用途
- 言語設定
- ユーザー認証状態
- テーマ設定
- ショッピングカート情報
【永久保存版】フロントエンドエンジニアのための学習＆開発支援サイトまとめ🌟

# フロントエンドエンジニアに役立つサイトまとめ 🌟

フロントエンドエンジニアとして成長するためには、学習リソースや便利なツールを活用することが重要です。本記事では、初心者から上級者まで役立つサイトやツールをカテゴリ別に絵文字付きでご紹介します！

---

## 📚 学習用リソース

### 🌐 **1. MDN Web Docs**

https://developer.mozilla.org/ja/docs/Web


- **概要**: HTML、CSS、JavaScriptの公式ドキュメント。
- **特徴**: 基礎から応用まで幅広くカバー。ブラウザ互換性情報も充実。
- **おすすめポイント**: リファレンスとして信頼性抜群！

### 🎓 **2. freeCodeCamp**

https://www.freecodecamp.org/japanese/

- **概要**: 無料でプログラミングを学べるオンラインプラットフォーム。
- **特徴**: プロジェクトベースで実践的に学べる。
- **おすすめポイント**: 修了証が発行されるのでモチベーションアップに最適。

### 🖥️ **3. Progate**

https://prog-8.com/

- **概要**: スライド形式で視覚的に学べる初心者向け教材。
- **特徴**: HTML、CSS、JavaScriptからReactまで対応。
- **おすすめポイント**: スマホでも学習可能で隙間時間を有効活用！

### 🎥 **4. ドットインストール**

https://dotinstall.com/

- **概要**: 短時間で学べる動画形式のプログラミング学習サイト。
- **特徴**: 実務的な内容も多く、初心者でも取り組みやすい。

---

## 🛠️ 実践・アイデア共有

### ✨ **1. CodePen**

https://codepen.io/

- **概要**: フロントエンドコードの共有・実験プラットフォーム。
- **特徴**: 他のユーザーが作成したデモを閲覧・編集可能。
- **おすすめポイント**: CSSアニメーションやUIデザインの参考に。

### 🏆 **2. Awwwards**

https://www.awwwards.com/

- **概要**: 世界中の優れたWebデザインを紹介するサイト。
- **特徴**: デザインやトレンドのインスピレーション源として最適。

---

## 🔧 開発サポートツール

### 🌍 **1. Can I use**

https://caniuse.com/

- **概要**: HTML5、CSS3、JavaScript機能のブラウザ対応状況を調べられるサイト。
- **特徴**: 新しい技術採用時の判断材料として便利。

### 💡 **2. Stack Overflow**

https://ja.stackoverflow.com/

- **概要**: プログラミング関連のQ&Aサイト。
- **特徴**: エラー解決や実装方法について他のエンジニアと情報交換可能。

---

## 🔥 トレンド・最新情報

### 🎨 **1. CSS-Tricks**

https://css-tricks.com/

- **概要**: CSSに特化したチュートリアルやテクニックを紹介するブログ。
- **特徴**: レスポンシブデザインやアニメーション実装時に役立つ。

### 📖 **2. Smashing Magazine**

https://www.smashingmagazine.com/

- **概要**: Webデザインと開発に関する記事やニュースを配信。
- **特徴**: デザインからパフォーマンス改善まで幅広いテーマをカバー。

---

## 📝 まとめ

フロントエンドエンジニアとしてスキルアップするためには、多様なリソースを活用し続けることが重要です。  
本記事で紹介したサイトは、それぞれ異なる目的に特化しているため、自分のスキルレベルや興味に合わせて選んでみてください。  
特に、🌐MDN Web Docsや🎓freeCodeCampは基礎固めに最適であり、✨CodePenや🏆Awwwardsはインスピレーションを得る場としておすすめです！

どんどん活用して、あなたのフロントエンドスキルを磨いていきましょう！💪
Workers,Pagesで国を取得する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/fd814c6a-f021-a14a-be5b-c29c01de904b.png)

これでIP制限の代わりに国で制限をすることも可能

# Workers

```worker.js
export default {
  async fetch(request, env, ctx) {
    const country = request.headers.get('cf-ipcountry');

    const message = country
      ? `The request is from: ${country}`
      : 'Could not determine the country.';

    return new Response(message);
  },
};
```

# Pages & Hono

```tsx:index.tsx
import { Hono } from 'hono'
const app = new Hono()

app.get('/', async (c) => {
    const country = c.req.header('cf-ipcountry');
    return c.text(`country: ${country}`);
});

export default app
```
Windows環境で点群処理ツールPDALをインストールする

## はじめに
　点群データをいろいろ処理できるオープンソースツールである[PDAL](https://pdal.io/en/2.8.3/index.html)のインストール方法について、初心者に分かりづらく少し迷ったので、メモとして残しておきます。

 ## 【準備】ANACONDAのインストール
　WindowsでPDALをインストールするには、はじめに「ANACONDA」というアプリをインストールする必要があります。
 　ANACONDAは[このサイト](https://www.anaconda.com/download)からダウンロードして、インストールします。
ダウンロードするにはメールアドレスの登録が必要です。

## Anaconda Promptを管理者権限で実行
　WindowsでPDALをインストールする場合には、「Anaconda Prompt」というコマンドツールを使います。スタートメニューの中の「Anaconda（anaconda3)」→「Anaconda Prompt」を右クリックして、「詳細」→「管理者として実行」を選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105544/302c1d44-0de4-b673-b75c-c77c3b9a73de.png)

## インストールするためのコマンドを入力
　Anaconda Promptが起動したら、PDALをインストールするためのコマンドを入力します。
 　今回は、PDAL、Python-PDAL、GDALをいっぺんにインストールします。
 ```
conda create --yes --name myenv --channel conda-forge pdal python-pdal gdal
``` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105544/0f24fdb3-d2c5-102c-80ad-0d0b8f17890e.png)

インストールが終了したら、次の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105544/068e4a00-153d-8eb4-2dd5-fb57ed88d977.png)
PDALを使えるようにするには、`conda activate myenv`を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105544/8a10faa3-af32-d05a-88ac-5f44b0116a24.png)

PDALが使えるようになっているかを確認するためにPDALのバージョンを表示させてみます。
`pdal --version`とコマンドに入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105544/6a75b9cb-88c0-36a9-bd83-99223be00c82.png)
バージョンが表示されれば、PDAL使えるようになります。お疲れ様でした。

## 次回以降にPDALを実行する
　次回以降にPDALを実行する場合は、Anaconda Promptを使いますが、管理者権限でなくても構いません。
　再度コマンドに`conda activate myenv`を入力することでPDALを利用できます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105544/026089fc-9fa7-b386-5826-b2305e37e2a3.png)

 


### 参考にしたサイト
[iPhoneでも使えるようになったLiDARの標準ファイル形式「LAS」ってどんなデータなの？を、PDAL/Laspyを使って調べてみる。](https://qiita.com/nokonoko_1203/items/8b8568545148acfe11d3)
[PDALで点群データを処理](https://qiita.com/waigania13/items/b6335ddab09a07746921)
[Point Data Abstraction Library (PDAL)](https://pdal.io/en/2.8.3/quickstart.html)
FluidAPK: シームレスな編集を可能にする究極のオーディオとビデオの統合

FluidAPK の使用ガイド: クラウドベースのビデオとオーディオのマージ
今日の急速に変化する世界では、コンテンツ作成者や企業は、ビデオとオーディオ ファイルの編集とマージに使いやすいクラウドベースのツールを求めることがよくあります。FluidAPK は、高度な技術的専門知識やローカル ソフトウェアのインストールを必要とせずにこのプロセスを簡素化するように設計された多用途のプラットフォームとして際立っています。

この記事では、FluidAPK の概要と、ビデオとオーディオ ファイルをシームレスにマージするための手順を説明します。

FluidAPK とは?
FluidAPK は、ユーザーがビデオとオーディオ ファイルを簡単にマージできるクラウドベースのプラットフォームです。プロフェッショナルなビデオ、YouTube のビデオ ブログ、教育コンテンツを作成する場合でも、FluidAPK を使用すると、複数のメディア ファイルを 1 つのまとまりのある出力に組み合わせることができます。このプラットフォームのユーザー フレンドリーなインターフェイスにより、編集経験がなくても誰でも機能を利用できます。

FluidAPK の主な機能
- クラウドベースの利便性: ダウンロードやインストールは不要です。すべての処理はクラウドで行われます。
- ユーザーフレンドリーなインターフェース: 簡単にナビゲートできるダッシュボードで、動画や音声をすばやくアップロードできます。
- 互換性: MP4、AVI、MP3、WAV など、さまざまな動画および音声形式をサポートしています。
高速処理: 効率的なサーバーにより、マージされたファイルは数分で準備できます。
- 安全: データのプライバシーを確​​保し、処理後にサーバーからファイルを削除します。

FluidAPK を使用して動画と音声をマージする手順:-
FluidAPK を使用して動画と音声ファイルをマージするための簡単な手順ガイドを以下に示します。

手順 1: プラットフォームにアクセスする
Web ブラウザーを開き、FluidAPK (https://fluidapk.online/) に移動します
まだアカウントをお持ちでない場合は、メールアドレスを入力してパスワードを作成し、無料でサインアップしてください。

手順 2: ファイルをアップロードする
ダッシュボードの [ファイルをアップロード] ボタンをクリックします。
コンピューターまたはクラウド ストレージ (Google Drive、Dropbox など) からアップロードする動画ファイルを選択します。
ビデオと結合するオーディオ ファイルをアップロードします。
アップロードが完了するまで待ちます。進行状況を示す進行状況バーが表示されます。

ステップ 3: 結合設定を構成する
ファイルがアップロードされたら、結合設定を選択します。
オーディオ同期オプション: オーディオをすぐに開始するか、特定の時間に開始するかを指定します。
音量調整: 必要に応じてオーディオ レベルを調整します。
出力形式: 結合したファイルの優先ファイル形式を選択します (例: MP4、MKV)。
プレビュー機能を使用して、オーディオがビデオと適切に同期していることを確認します。

ステップ 4: ファイルを結合する
設定を構成したら、[結合] ボタンをクリックします。
プラットフォームがリクエストを処理します。処理時間はファイル サイズによって異なりますが、FluidAPK の高性能サーバーにより通常は高速です。

ステップ 5: ダウンロードして共有する
結合が完了すると、ダッシュボードに通知が表示されます。
結合したファイルをデバイスに直接ダウンロードするか、クラウド ストレージに保存します。

共有可能なリンクを生成して、ファイルを共同作業者やクライアントに送信することもできます。

FluidAPK を使用するメリット

- 技術的な専門知識は不要: このプラットフォームは、初心者とプロの両方向けに設計されています。

- アクセシビリティ: インターネット接続があれば、どのデバイスからでも使用できます。ソフトウェアのインストールは不要です。

- コスト効率: 無料および手頃な価格のサブスクリプション プランを提供します。

- 迅速な処理: ファイルの結合とダウンロードは迅速かつ効率的です。

- コラボレーション対応: サードパーティ ツールを使用せずにファイルを即座に共有できます。

結論

FluidAPK は、オンラインでビデオ ファイルとオーディオ ファイルを結合するための簡単で信頼性の高い方法を探している人にとって画期的な製品です。クラウド ベースの機能、ユーザー フレンドリーなインターフェイス、堅牢なセキュリティ機能を備えた FluidAPK は、クリエイター、教育者、企業にとって理想的なソリューションです。上記の手順に従うことで、メディア ファイルをすばやく組み合わせて、あらゆる視聴者向けに洗練されたコンテンツを作成できます。

今すぐ FluidAPK を使い始め、コンテンツ作成プロセスを簡単に向上させましょう。
VirtualBox の考察

VirtualBox の考察
　仮想マシン　だから、実行できる、コア数と実装RAMが必要ですよね。

そこで、「最低スペックのマシーンで、実行出来るのか?」と言うところから、まず、考えて欲しいです。
動かないとかいう前に、そこを、見て欲しい。

知らないから、素人の憶測だけど、
*.iso って1個の長さのバイナリーフォーマットの様な気がする。当然、セクターとかトラックとかは、フォーマットで、1個構成で、移動属性は持ち合わせていない。
iso はimage ROM で値を見る事は出来るが、文字数の変わる変数などは領域において変えられない。
パソコンでiso を仮想展開しても、フォルダー(固定領域長)に展開しないと、そもそも使えない。
起動の初めはBIOSがSYSTEM driver(windows format)で読み込み始めているから指定はC: でRsaではない。
そもそも、winのフォーマット幅とLinuxのformat幅がそもそも違う。

一応は、それらしく動くんやが、イメージであることに、変わりはない。
installしてあったとして、最初に動かすファイルは、何なんですか? これが分からない。

ワーキングメモリー(isoの全読み込み1fileとして)4GB以下のメモリーシステムなら入らないケースもあり、駆動コア数が2コアの場合windowsと一緒に駆動出来ない場合もあります。

以上、参考。