OmniAICreator/Qiita-1.07M huggingface dataset:
DatabricksマーケットプレイスでMaaS Tech Japanの地理空間データを試す

気づいたらこちらも公開されていました。[unerry様](https://qiita.com/taka_yayoi/items/af35659038f8d77a59a9)に続き、続々と各社様にプロバイダーになっていただいています！

https://marketplace.databricks.com/details/9fa49603-c4c7-4152-8faa-208aad1b1a40/MaaS-Tech-Japan-inc_H3-IndexResolution-12

![Screenshot 2023-10-16 at 12.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9513879b-4b2a-4521-65af-dedc2ef2009b.png)

カタログに取り込みます。
![Screenshot 2023-10-16 at 12.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef3768ac-33c7-c7aa-9286-167d7763c39a.png)

取り込まれました。
![Screenshot 2023-10-16 at 12.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef1bbca1-53a1-ef2c-0648-f287b1cbd8fa.png)

![Screenshot 2023-10-16 at 12.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55121204-0789-f1e2-f2ba-08957f6a4f8f.png)

まさに地理空間情報。
![Screenshot 2023-10-16 at 12.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1515c6a2-9214-c7cf-9c08-86fa1a9723a7.png)

Databricks SQLでクエリーを行い、Mapタイプのビジュアライゼーションを使います。

```sql
SELECT * FROM districts;
```

![Screenshot 2023-10-16 at 12.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c4cf5708-d853-861c-1e27-7843562ad2e0.png)

ポップアップの書式を変更します。
![Screenshot 2023-10-16 at 12.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f3d29fcb-0189-faa2-7740-f618d4e7f279.png)

これだけの手順でデータを可視化することができました。
![Screenshot 2023-10-16 at 12.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/03b72c4a-fcf3-6e0c-f027-4981f0e79060.png)

[地理空間関数](https://docs.databricks.com/ja/sql/language-manual/sql-ref-h3-geospatial-functions.html)の練習にも使えそうです。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Linuxを使えるようになろう #2

# SSH通信をできるようにする
SSHとは，Secure Shellの略称であり，リモートでコンピュータと通信するためのプロトコル．
通信すべてが暗号化されており，安全な通信が可能．

Linuxサーバーを建てたあと，SSHを使って接続しサーバー上で作業をすることがほとんど．
直接サーバーをいじることはほとんどない．

## VirtualBoxのネットワーク設定

VirtualBoxの場合は，直接サーバーをいじることもできるが，今後実務でやることを考えて，SSH接続できるようにしていく．

まずは，VirtualBoxのネットワーク設定を行う．
サーバーを選択した状態で，設定を開く．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/b7c9d064-42ac-3dae-e99b-d1a70fe241c4.png)

設定からネットワークを選択．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/18746f69-7691-d488-2219-a5cfb2c3091c.png)

アダプター1のAdvancedを開きポートフォワーディングをクリック．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/831eebce-da69-9221-8af4-408b13ab2c15.png)

下記のように右上の＋ボタンで22ポートと80ポートを開放する．
80ポートはWebサーバー用だが，今後Webサーバーの勉強会もやるので設定しておく．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/44438390-bd4f-b6e2-997c-e71eade58a3c.png)

あとはOKをクリックして設定終了．


## Linuxサーバー側の設定

Linuxサーバーを起動し，opensshサーバーをインストールする．

```
$ sudo apt update
$ sudo apt install openssh-server
```

これでインストールは完了．ただし，デフォルトでは，公開鍵認証しか使用できない設定になっている．
そこで，パスワードでの認証も可能なように設定する．
(業務で行う場合は，パスワード認証は危険なので，公開鍵認証で行うこと．勉強会なので，簡略化のためにパスワード認証にしている)

```
$ sudo emacs /etc/ssh/ssh_config
```

emacsで設定ファイルを開く．

```
#   PasswordAuthentication yes
```
の部分を
```
   PasswordAuthentication yes
```
に変更する．(コメントアウトされているので，#を削除する)

opensshサーバーの起動
```
$ sudo service sshd start
```

## ターミナルを使う

ターミナルはGUI上で，コマンドを入力するためのアプリケーションである．
ターミナルを使って，SSH接続でLinuxサーバーにアクセスすることができる．

Windowsの場合は，下の検索まどから「terminal」で検索するとターミナルがあるので，それを使えば良い．
起動後，下記のようにして，アクセスする．

```
ssh <アカウント名>@localhost
```

localhostは今作業しているマシンのことを指す．
実務で使う場合は，IPアドレスなどそのサーバーを指すものに変更すれば良い．

# Linuxコマンドを使えるようになる

Linuxサーバーは基本的にターミナルからのコマンド入力で操作する．
そのための基本的なコマンドを紹介していく．


## 基本コマンド

|コマンド|操作内容|
|-|-|
|cd <パス>|指定したパスに移動|
|ls|ファイル一覧の表示|
|pwd|現在いるディレクトリを表意|
|mkdir|ディレクトリを作成|
|cp <対象ファイルパス> <コピー先>|ファイルのコピー|
|mv <対象ファイルパス> <移動先>|ファイル，ディレクトリの移動|
|rm <ファイルパス>|ファイルの削除|
|rmdir <ディレクトリパス>|空のディレクトリの削除|
|history|これまでに実行したコマンド履歴の表示|
|emacs <ファイルパス>|emacsを使ってファイルを編集する|
|sudo|管理者権限で実行する|
|exit|ログアウトする|


## cd

チェンジディレクトリ

```
cd <パス>
```

で，指定したパスのディレクトリへ移動する．
絶対パスでも相対パスでもどちらでも良い．


```
cd ..
```
一つ上のディレクトリへ移動する．

### 絶対パス
絶対パスはディレクトリの構造上の頂点より，ファイルまでのパスをすべて表記する方式

/home/fuga/hoge.txt
など/から始まる場合には絶対パスで記述されている．

### 相対パス
現在作業しているディレクトリからみたファイルの位置を記述する方式

../fuga/hoge.txt
など/以外から始まる場合は相対パスで記述されている．


## ショートカットキー

よく使いそうなものを紹介

|ショートカットキー|操作内容|
|-|-|
|Ctrl + a|カーソル位置を先頭に移動|
|Ctrl + e|カーソル位置を末尾に移動|
|Ctrl + k|カーソルがある位置から行末まで切り取り|
|Ctrl + r|実行したコマンドの履歴から検索|
|Ctrl + u|カーソルがある位置から行頭までを切り取り|
|Ctrl + y|切り取った文字列の貼り付け|
|Tab|途中まで入力した文字列からディレクトリ名やファイル名を補完|
AWSのlambdaでlaravelを動かす

# また馬鹿なことを・・・
AWSって普通に使ってたらどんどんお値段が上がっていきますよね？我々のような弱小勢力にはお財布に大変厳しいことになりかねません。安くむしろ無料でどうにかなりませんかね、AWSさん・・・。
考えました。
そうだ、lambdaなら私達の無理難題を解決してくれるはずだ。

# そもそも論としてlambdaでphpは動くのか
動きません。非推奨です。ただしカスタムランタイムをつかったりdockerイメージをデプロイしたりすれば使えます。でもめっちゃ面倒くさいですよね・・・。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-custom.html

# lambdaだと何が嬉しいのか
1. サーバ管理しなくてよい
1. アクセス増えても勝手にスケールしてくれる
1. 安い(限りなくゼロに近づけることが可能とおもわれ)

# そこでbrefの出番です
brefをつかえば、一瞬にしてlaravelアプリケーションをlambdaにデプロイできます。
https://bref.sh/

# まずはlaravelプロジェクトを
いつもの
```
composer create-project laravel/laravel myapp
```

# 最低限Laravelが動くように
```
cd myapp
cp .env.example .env
php artisan key:generate
```

# aws cliのセットアップはがんばって
```
aws configure
```

# serverlessコマンドも必要
```
npm install -g serverless
```

# brefをインストール
```
composer require bref/bref bref/laravel-bridge --update-with-dependencies
php artisan vendor:publish --tag=serverless-config
```

# serverless.ymlができるのでちょっとだけ修正
↓これはまあいじってもいじらなくてもどっちでもいいですけど
```
region: ap-northeast-1
```
これ以上は特になにもしなくても動きます。

# デプロイ
```
sls deploy
```

これだけ！あとは裏でcloudformationが動いて、API Gatewayとlambdaを設定してデプロイしてくれます。最後にこのURLねって教えてくれるのでそこにアクセスすればLaravelのwelcomeページが表示されると思います。

# 注意点
ディスクには書き込めませんという大前提で。

1. セッションはElastiCacheかCookieで
    * ElastiCacheにするとコストがかかる
1. DBはS3にCSVとかおくかRDS(Aurora)で
    * RDSにするとコストがかかる
1. 画像ファイルなどはS3におかなきゃいけない
1. アクセスがないとコールドスタンバイ状態になるので上がるまで多少時間必要
    * 応答スピードが求められるサービスには不向きかも
1. 実サービスに使えるのかどうかは吟味が必要

# まとめ
ちょっとしたアプリケーションを限りなく無料で公開したい場合は、brefをつかったlaravelをlambdaにデプロイはとても使える手段ではないかと思います。lambdaのためにnodeとかpythonとか勉強したりせなあかんとか、それに付随するであろうフレームワーク覚えたり結構ハードルがあがると思います。

普段からlaravel書いてる人であれば、そのままデプロイできるというのはとても楽ですよね。あとはそれが実運用に耐えられるのかどうかを見極めれば実際のサービスでも使えなくはないのかななんて思いました。

ぜひ一度このlambdaでlaravelが動く感動を味わってみてください。
RenameButton Appleサンプルの話

#RenameButtonのAppleのサンプルのエラーを治しました
> 理由

- iPadのSwift Playgroundsで"名称変更"ボタン ?
つまり RenameButton()のコントロールがあるでしょう ?
これって使い方を検索していたらAppleにありました[「RenameButton](https://developer.apple.com/documentation/swiftui/renamebutton)」ですが ? このコードではエラーになるのです


> 目的

- RenameButtonの理解と使い方
- Appleのそのサイトのコードのエラーを治したい

> 忙しい人はContentView.swiftをすり替えてください

# 必要な条件

- iPadOS 17.0.3
- Swift Playgroundsアプリ 4.3.1
- 画像はシステム画像を使用しています

# ContentView.swift

```ContentView.swift
//
//  RenameButton🌙.swift
//  SwiftUITest
//
//  Created by 福田 敏一 on 2023/10/16.
//  Copyright © 2019 株式会社パパスサン. All rights reserved.
//
// ❇️ ℹ️ 🚨 🎀 📅 ☼ ☕︎ 👀 💼 👑 📢 🧨 💎 🎡 🏕 🏖 🚗 🖲 🎁 📌 ⛑ ✚ 😍 ♻️ 💠 🔆 🅿️ 🔰 ✅ 🌏 🌙 💌 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, world!")
        }
        RowView()
    }
}

struct RowView: View {
    @State private var text = ""//❇️未使用
    @FocusState private var isFocused: Bool
    
    @ObservedObject var item = Item()//🎀エラー1・この行を追加
    
    var body: some View {
       //TextField("Prompt", text: $text) //❇️未使用のtext
        //🎀エラー1・Cannot find '$item' in scope
        //🧨エラー2・Value of type 'ObservedObject<User>.Wrapper' has no dynamic member 'name' using key path from root type 'User'
        //🎀エラー1追加後 OK
        //🎀エラー2追加後 OK
       TextField(text: $item.name) {
            Text("Prompt")
        }
        .focused($isFocused)
        .contextMenu {
             RenameButton()
            // ... your own custom actions
        }
        //🎀エラー3・Cannot assing to prerty:'$isFocused' is immutable それと Cannot assing value of type 'Bool' to type 'FocusState<Bool>.Binding
        //.renameAction { $isFocused = true }
        //🎀エラー3・以下に修正
        .renameAction { isFocused = true }
    }
}
//🎀エラー1・Itemクラスの定義を追加
class Item: ObservableObject {
     @Published var name = ""//🧨エラー2・この行を追加
}

```

# 私の感想なんですが?
私はiPad9を使用しています
2021年12月とか？ にSwift Playgrounds 4が
利用可能になったとか
iMac用も用意してあることを
私はその事を最近知りましたがiPadで研究しています
しかし なんでiPadでのそれらのコード入力は
いじめとしか思えないほど使えない
私は古いiMacのキーボードをやトラックパッドを
iPadで使ったり
M1 iMacのキーボードやマジックなんとかを使ったり
格安の外国製のケース付きトラックパッド付き
キーボードも買いましたが
今は それなしでコードを書いてます
Appleには改善を期待しながら
少しのコツと諦めない努力で
いじめキーボードに挑戦しています
コード入力画面の半分を占領する
いじめキーボードっ

# 意味不明なコード

```
ContentView()
    .navigationTitle($contentTitle) {
        // ... your own custom actions
        RenameButton()
    }

```
同サイトに以下の記帳がありますが
意味不明です
この投稿が済んだら研究します

しかし iOS16からRenameButtonって
一体 何に使うんでしょうね？

ここまで
SSM Session Manager経由でローカル環境からRDSへ接続を行う方法

## aws-cliのインストール
homebrewを使ってインストールします。
```
$ brew install awscli
```
バーションが確認できればインストールは成功です。
```
$ aws --version
```


## aws-cliの初期化
事前にAWSコンソールから、アクセスキーとシークレットアクセスキー、regionを確認しておき、下記実行時にそれぞれの項目に設定します。
outputformatについては指定しなければjsonになります。
```
$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]: 
```

設定したAWS認証が正しいか確認します。
```
$ aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXX",
    "Account": "<AWSアカウントID>",
    "Arn": "arn:aws:iam::<AWSアカウントID>:user/<IAMユーザー名>"
}
```

## ローカル環境からRDSへ接続する
ローカル環境のターミナルにて以下コマンドを実施し、Session Managerへポートフォワード実施します。
```
$ aws ssm start-session --target <踏み台インスタンスID> --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<RDSのエンドポイント>"],"portNumber":["<ポートナンバー>"], "localPortNumber":["<ローカルポートナンバー>"]}'
```
ポートフォワード実施後、ローカル環境のDBクライアントツールを使用し、接続を行います。
ホスト名、ポートは以下の通りとなります
```
ホスト名: <RDSのエンドポイント>
Port: 「3. Session Managerへポートフォワード実施」の「localPortNumber」で指定したPort番号
```

## configureの切り替え
検証環境や本番環境へ接続を切り替える場合は、credentialsを修正します。

#### 書き換える場合
ファイルを開いて編集するとわかりやすいです。
```
$ cd .aws
$ open credentials
```

###### 書き換えずに切り替える場合
defaultで登録してある情報とは別に、ユーザー名で指定して情報を追加登録できます。
```
$ aws configure --profile ユーザー名
```
credentialsに追加されているか確認します。
```
$ aws sts get-caller-identity --profile ユーザー名
```

下記コマンドでアカウントを切り替えます。
```
$ export AWS_DEFAULT_PROFILE=ユーザー名
```
マルチドメインのpostfix運用で、証明書期限切れのメッセージが送信時に出るようになり途方に暮れたら

マルチドメインのpostfixを運用していて、ある日突然メール送信時に、証明書の期限が切れているとのエラーが出るようになりました。証明書は更新しているのになぜ？とお悩みの方へヒントになれば幸いです。

### 発生現象・環境・背景
・postfix(3.5.9, linux)　main.cf で複数ホスト名の証明書を使い分けるため、tls_server_sni_mapsを定義。postmapコマンドで.dbファイルを作成。
・各証明書はLet’sEncryptで3ヶ月ごとにcertbot renewコマンドで自動更新。/etc/letsencrypt/live/（ホスト名）に最新の証明書へのシンボリックリンクがあり、このパスをpostfixのtls_server_sni_mapsに定義。つまりいつでも最新の証明書がそのパスにある。
・メール送信時に証明書の期限切れで送信エラーとなる。opensslコマンドで確認するも、証明書は有効なものに更新済み。
`openssl s_client -connect ホスト名:ポート -starttls smtp |openssl x509 -noout -dates
`

### 原因と対応
・tls_server_sni_mapsのdbファイルは単なるホスト名ごとの証明書へのパス（ファイル名）のテーブルと思いきや、db作成時点の証明書の本体がガッツリ入っていた。つまり、postmapコマンドを実行した時のシンボリックリンク先の証明書の中身。以下でそれを確認。
`postmap -q ホスト名 /etc/postfix/（tls_server_sni_mapsのファイル名）| nkf -mBW`
・証明書更新の際にはpostmapコマンドでtls_server_sni_mapsのdbファイルを再作成することにして解決
latexで図が表示されない。

図が表示されなくてエラーが出た時

エラーメッセージには

```
Overfull \hbox (2302.70973pt too wide) in paragraph at lines 67--68
 [][] 

LaTeX Warning: Float too large for page by 268.30379pt on input line 68.
```

と表示された

該当箇所を見てみると

```
 64 
 65 \begin{figure}[ht]
 66 \centering
 67 \includegraphics[scale=1.3]{image9.jpg}
 68 \end{figure}
 69 


```

[scale=1.3]の部分を[scale=0.3]

とか書いたら表示された。

図が大きすぎたらしい。
AzureAppServiceでSQLCMDを使いたいときのメモ

# 結論

下記コマンドをSSHで叩けばよい

```
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/msprod.list
apt-get update
apt-get install -y mssql-tools

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
```

# なぜこのメモが必要なのか

1. AppServiceのSSH上での簡易な調査や緊急時のSQL対応として使いたいこともある
2. どういうわけかChatGPTに聞いても答えがなかなかでない事項。なんで…？
クラウドレンダリングを使って、高スペックなPCが必要なソフトウェアの社内レビューを効率化

## はじめに
クラウドレンダリングとは、3DCG等のレンダリングをクラウド上で行う技術です。従来のレンダリングでは、ユーザーのコンピューター上でレンダリングを行うため、高性能なコンピューターが必要でした。しかし、クラウドレンダリングでは、クラウド上の高性能なコンピューターを利用するため、ユーザーのコンピューターの性能に依存する必要がありません。古くはシンクライアントとも呼ばれてきました。

## クラウドレンダリングのメリット
クラウドレンダリングには、以下のメリットがあります。

- 高性能なコンピューターがなくても、高品質なレンダリングが可能
- レンダリングにかかる時間を短縮できる
- コストを削減できる

## クラウドレンダリングの用途

クラウドレンダリングは、以下の用途に利用されています。
- 映画やゲームなどの映像制作
- 建築や製造などの設計
- 医療や教育などの分野でのシミュレーション

## 製品の社内レビューにおける課題
ソフトウェアや3DCGパース製品の開発時には社内レビューという工程が入る場合があります。
近年の業務用PC調達やワークスタイルの変化で社内レビューには以下のような問題点があります。
- 半導体不足によりPC調達が困難
- 円安によるPCの高騰
- 利用頻度が低く、コストパフォーマンスが悪い
- リモートワークの普及で遠隔でレビューを受ける場合があるがハイスペックなPCを持ち歩いていない

## クラウドレンダリングで解決
Tencent CloudのCAR（クラウドレンダリング）はWindowsアプリやAndroidアプリをクラウド上のサーバーで実行し、クライアント側はその映像を受信して操作できるPaaS製品です。
ビルドしたアプリケーションをコンソール画面にアップロードするだけですぐにブラウザでアクセスできるようになります。

どれだけ簡単にできるかは以下の記事で紹介してますのでご覧ください。
[クラウドレンダリングを試してみた](https://qiita.com/v-cube/items/06b586248f8d24bb1782)

Tencet Cloudのクラウドレンダリングを活用すると前述の課題が解消できます。

**半導体不足によりPC調達が困難**
→クラウド上の仮想マシンを利用するため、すぐに確保できます

**円安によるPCの高騰、利用頻度が低く、コストパフォーマンスが悪い**
→必要なタイミングのみPCをレンタルするイメージなので高価なPCを購入する必要がありません。
次々と高性能なアプリが発生しても、新たにPCを購入しなおしたり、パーツ交換するといった対応も不要になります。

**リモートワークの普及で遠隔でレビューを受ける場合があるがハイスペックなPCを持ち歩いていない**
→クライアント側はブラウザでアクセスできるので、安価なPCやスマホでも十分操作可能です。
レビューをうけるタイミングに合わせてクラウドレンダリングにアップロードと有効化すればいつでもどこでもレビュー可能です。


## まとめ
クラウドレンダリングは、高性能なコンピューターがなくても、高品質なレンダリングを可能にする技術です。レンダリングにかかる時間やコストを削減できるため、さまざまな分野で利用されています。今後ますます普及していくことが期待されています。

## 最後に
[**Tencent Cloudに関するお問い合わせはこちらから**](https://jp.vcube.com/form-inquiry-md06-tencent.html)
【VB.NET】DataGridViewをすぐに更新する書き方

## やりたいこと
科目修正画面の保存ボタンを押したら、すぐに科目マスタ画面のDataViewViewに
修正を反映させたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/d89a09ab-e349-6bd2-f3b0-f117eb6b07e5.png)


## 解決方法
科目マスタのクラスにDataGridViewを更新する処理を書く。
修正画面のインスタンスを生成する時、コンストラクタに科目マスタのFormを参照で渡す。
科目マスタのDataGridViewを更新するときは、参照で渡したFormを使用してDataGridViewを呼び出す。


## コード
### 科目マスタ画面のコード
```Visualbasic
Private Sub btnAddSubject_Click(sender As Object, e As EventArgs) Handles btnAddSubject.Click
    Dim addSubject As New AddSubject(labelAddSubj, titleAddSubj, sender.text, Me)
    addSubject.ShowDialog()
End Sub


' DBから取得したデータを使用してDataGridViewを更新する関数
Public Sub displayDGV(dt As DataTable)
    Try
        ' データをDataGridViewに表示する
        listSubject.DataSource = dt
    Catch ex As MySqlException
        MessageBox.Show("エラーが発生しました。error:" & ex.Message)
    End Try
End Sub

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/3b09a770-7bed-0b44-6bdb-d7c786fcfaa3.png)
`Me`と書くことで他のフォームに渡すことができる。



### 修正画面のコード
```visualbasic
private mDgvForm as DgvSubjectMaster
Public Sub New(ByRef dgvForm As DgvSubjectMaster)
    Me.mDgvForm = dgvForm
End Sub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/e2b035d1-4b77-0273-fd13-eb0b865ae9df.png)
`ByRef`を書くと参照型になる。


### 科目マスタ画面のDataGridViewを呼び出すコード
```visualbasic
mDgvForm.displayDGV(dt)
```
`dt`…DBの値がDataTable型で入っている。(今回はDBのデータを取得する処理は書いていない。)
定時帰る術-Linux改行問題(cat、fileコマンド)

# 改行問題

### Windowsで作ったファイルをそのままでlinuxにアップロードする場合、linuxが認識できない改行がついていることがあり、cat -Aで確認できる。
### 問題：↑でサービス起動で謎のエラーがでたり、シェルの実行でエラーがでたりする。


改行がおかしい例
```cat –A test.txt
a^M$
b^M$
c^M$
d^M$
e^M$
f^M$
```
「^M」が表示されたら、改行がおかしいと判断できる

正常の場合：
```cat -A test2.txt
a$
b$
c$
d$
e$
f$
```
file で確認した方がはやいかも
```file test.txt
test.txt: ASCII text, with CRLF line terminators
```
赤字の部分(with CRLF line terminators)が表示されたら、改行がおかしいと判断できる

## 解決：
###	WinSCPでWindows→linuxファイルを転送する時、転送設定を「テキスト」にしてから、転送するようにする。
（↑で日本語が存在する場合、文字化けが起きる場合があります。）
### Windowsの改行はCR(\r)+LF(\n)となり、linuxはLF(\n)なのでCRを消せば、OKです。
```sed -i 's/\r//g' test.txt
```
（-iを付けずに、確認してから-iで実行した方が安全）
Wordpressのブログに、記事のキーワード検索機能を追加する方法

# キーワード検索を置きたいページのphpファイルを開く
通常はブログ一覧であるarchive.phpやsingle.phpだと思うのでそのファイルを開いて以下を追加します。

```php
<form action="<?php echo site_url('/ブログがあるディレクトリ/'); ?>" method="get">
  <div class="">
    <input class="" type="text" name="s" value="<?php echo esc_html(get_search_query()); ?>" placeholder="キーワード検索">
    <button class="" type="submit">検索</button>
  </div>
</form>
```

`name="s"`をinputタグにつける点がポイントです。
Wordpressはデフォルトでキーワード検索の機能を持っています。
この機能を呼び出す鍵になるのが`name="s"`です。
sは、WordPressの内部的なクエリ変数で、検索クエリに割り当てられています。
WordPressはこのクエリ変数を使用してデータベース内の投稿ページを検索します。

検索結果ページ（通常search.phpテンプレートファイルが使用される）が表示され、一致する投稿がリストされます。そして、検索結果が表示されるページは、`ブログのURL/?s=検索窓に入れたキーワード`となります。


# 全角スペース繋ぎだと複数キーワード検索ができない
デフォルトだと、複数キーワード検索は半角スペース繋ぎでなければ動きません。
全角スペース繋ぎでも複数キーワードを検索できる様にするためには、function.phpは以下のように追加して、全角スペースを半角スペースへ変換させる様にする必要があります。

```function.php
function convert_fullwidth_space_to_halfwidth( $query ) {
    if ( is_search() && !is_admin() ) {
        $s = $query->get( 's' );
        $s = str_replace( '　', ' ', $s ); // 全角スペースを半角スペースに変換
        $query->set( 's', $s );
    }
    return $query;
}

add_filter( 'pre_get_posts', 'convert_fullwidth_space_to_halfwidth' );
```

# 検索対象
この検索窓で検索できる対象は、以下の通りです、カテゴリやタグは含まれません。
含めるためにはカスタムが必要です。

- 投稿（記事）のタイトル
- 投稿（記事）の本文（コンテンツ）
EclipseでJARファイルを配置

# はじめに
JARファイルをlibフォルダ配下にコピペする以外のJARファイルの配置方法です。

Eclipce上で、JARファイルを、**java build path**に追加し、**Deployment Assembly**に登録します。

### WebContent以下のディレクトリ構造
```
├─ WebContent
│ └─META-INF
│ └─WEB-INF
│        └─ lib ★
│        └─ web.xml
```

## JARファイルをlibフォルダへ配置する手順
1\. 左クリックで表示される項目の中から、proertyを選択
2\. **Java build path**を選択し、「Libraries」の「Add External JARs」から、jarファイルを追加
3. **Deployment Assembly** を選択して、「Add」をクリックすると、Select Ditective Type が用事されるので、「Java Build Path Entries」を選択して、「Next」
4. 2で**Java build path**に登録したJARファイルの一覧が表示されるので、それらを選択して「Finish」


#### 補足
jarファイルは、アプリケーションが実行(デプロイ)された時にlibフォルダに行くため、libフォルダ内を直接参照してJARファイルを確認することはできません。JARファイルを確認したい場合は、プロジェクトフォルダ内に作成される、**Referenced Libraries**から参照することができます。
next build後は環境変数が変更できなくなる

## TL;DR
`next build` を行うとそれ以降環境変数が変更できなくなり、ECSのタスク定義で設定しても反映されない。

### Before
```sh
FROM node:18-alpine
WORKDIR /usr/app
COPY ./src /usr/app/
COPY ./package.json /usr/app/
COPY ./yarn.lock /usr/app/
RUN yarn install && next build
EXPOSE 80

CMD ["next", "start"]
```
### After

```sh
FROM node:18-alpine
WORKDIR /usr/app
COPY ./src /usr/app/
COPY ./package.json /usr/app/
COPY ./yarn.lock /usr/app/
COPY init.sh /usr/app/

RUN yarn install
EXPOSE 80
# init.shでは「next build」と「next start」が実行される 
CMD ["sh", "init.sh"] 
```

Dockerの`RUN`はイメージ作成時に実行されます。
Dockerの`CMD`はイメージを起動する時に実行されます。
ECSのタスク定義に設定された環境変数を適用するには、`CMD`で`next build`を実行する必要がありました。

（以下記事を参考にしました🙇）

https://qiita.com/kskumgk63/items/f59c8f46728fa7ef414b#run


### 参考にした情報

以下のドキュメントから「ビルド後環境変数が変更できなくなる」ことがわかりました。

> After being built, your app will no longer respond to changes to these environment variables. For instance, if you use a Heroku pipeline to promote slugs built in one environment to another environment, or if you build and deploy a single Docker image to multiple environments, all NEXT_PUBLIC_ variables will be frozen with the value evaluated at build time, so these values need to be set appropriately when the project is built.

https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables
ReactNative デバッグができません

本文の通り ReactNative でデバッグができません。
VScode や DevTools ReactNativeDebugger も試しましたがどれも使えませんでした。

どなたかデバッグの種類は何でも良いのでやり方を教えて頂けませんか？
よろしくお願いします。

[バージョン]
node 
v18.13.0

expo
"expo": "~49.0.13"

expo-cli@6.3.10 



DevTools のエラー内容。
![スクリーンショット 2023-10-16 9.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570410/b3589a88-0b7b-e320-cb6a-01d194af8d16.png)
メモ GitHub Private Repositories の共有

## 目的
複数人で開発する為に限定者に非公開のRepositorieへのアクセス権限を公開する方法

## 方法
Repositorieを選択　→　Settings　→  Collaborators
![スクリーンショット 2023-10-16 095302.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607524/d86d6a8c-48c6-481d-6baf-7b0c950109f0.jpeg)

Add people を選択　招待のメールをする
![スクリーンショット 2023-10-16 095823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607524/23491871-85ad-eab1-52c1-f173af9d4aa0.jpeg)

※予めGitHubのアカウントを招待者へ作成してもらう事
AWS　SAA　模試直し⑥

# 現状
Udemyの講座をすべて視聴完了（約１ヶ月半かかった）
AWS-CLI取得済

# 今回の模試の結果
![スクリーンショット (91).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957298/84cddaf5-b4cb-fe52-9c5f-9f2d6bba2657.png)

あと数問の壁が中々越えられない、、、、
60%代をキープしているので、あとは弱点を補強して来週末に控えている本番に備えようと思う。
問題慣れもしてきて、問題文の構成が頭で浮かぶようになってきたのは模試をいくつも解いてよかったところである。ほとんど1時間で解けているので時間配分も問題なさそうだ。

# 直し
## SQSとSNS
イベントをトリガーにしている場合→SNS

## SQS
SQSはオンプレミス環境とも接続できる

#### Cloudwatchとの連携
負か高まった場合に分散するときはCloudwatchと連携
SQSキューサイズを監視して、Amazon EC2インスタンスにAuto Scalingグループによるスケーリングを設定

#### メッセージ保持期間
デフォルトで4日間

## VPCピアリング
ピアリング関係となっているVPC-Aに次のような接続があったとしても、それらの接続に対してはVPC-Bはピアリング接続先を拡張することは不可

## DynamoDB
#### ポイントインタイムリカバリ
本稼働環境の DynamoDB テーブルに書き込みを実施したり、削除してしまっても、過去 35 日間の任意の時点にテーブルを復元することができる

## S3
#### 暗号化
暗号化情報なしの PUT リクエストを拒否するバケットポリシーがある場合は、そのPUT リクエストは拒否される

#### 監査
AWS KMSを使用してS3バケットを暗号化して、監査チームのアカウントがKMSキーにアクセスできないようにすることで、S3バケットへのアクセスを許可しつつも、監査チームメンバーはデータそのもにはアクセスできないように設定
IAMロールによってS3バケット内にアクセスできますが、データそのものは閲覧ができない

#### アクセス頻度
高頻度：S3　Standard
低頻度：One-ZoneIA、Standard-IA

#### OAIとOAC
OAI：（OAI）を割り当てて、そのOAIにのみS3バケット内への読み取り権限があるようにS3バケットポリシーを設定
OAC； (OAC) をCloudFrontディストリビューションに割り当てて、OACにのみ読み取り権限があるようにS3バケットポリシーを設定

#### 静的ウェブサイト
・http://bucket-name.s3-website-Region.amazonaws.com
・http://bucket-name.s3-website.Region.amazonaws.com

## AWS DataSyncエージェント
・オンプレミス環境にあるNFSストレージデータをEFSに移行する
・オンプレミスと AWS ストレージサービス間のデータ移動を自動化するサービス
・自動暗号化やデータの整合性検証が含まれており、暗号化を実施しながらデータを安全に移行することが可能

## ELB
#### 暗号化された通信
AWS Certificate Managerを利用してSSL/TLS 証明を発行して、その証明書をELBに設定する

## Route53
#### フェールオーバー
アクティブ/パッシブ：フェールオーバールーティングで構成、障害発生時にのみ使用
アクティブ/アクティブ：他のルーティングポリシーでも使える、障害発生していなくても使用

## Lambda
#### LambdaとKenesis
Lambda：リクエスト負荷の予測が難しいケース、写真を処理するといった仕組み
Kenesis：ストリームデータをリアルタイム処理するために利用

#### Lambda Layer
複数のLambda関数でライブラリを共有できる仕組み
Lambda関数間で利用する共通機能などをLayerにまとめて構成
重複部分を共有化することができる

## EBS
#### 特徴
・同じAZ内のEC2にしかアタッチできない
・同じゾーン内で自動的にレプリカ作成
・EC2から物理的に隔離されたストレージで、独立してデータを保持できる。

#### 使用を開始するために必要な処理
・最初にボリューム内にファイルシステムを作成することが必要
・/dev/xvdが１つ必ずアタッチされている
・追加のEBSボリュームをアタッチした後は、任意のファイルシステムでボリュームをフォーマットしてからマウントすることが必要

#### IOPSのプロビジョニング値を計算
プロビジョンドIOPSボリュームのIOPS性能とボリュームサイズ（GiB単位）の最大比は50：1で設定

## RDS
#### IAM DB認証
RDSインスタンスの作成時にEnable IAM DB Authentication(IAMのDB認証）を有効化する
パスワードではなくEC2インスタンスにおいて固有のプロファイル認証情報を使用してデータベースにアクセス

## Aurora
#### フェールオーバー
Amazon Aurora レプリカを作成している場合：30 秒以内に完了
Amazon Aurora レプリカを作成していない場合：15 分以内で完了

## CloudFormation
#### CloudFormationスタックセット
CloudFormation テンプレート内に AWS リソースの設定を定義して、１つのテンプレートにより複数の AWS アカウントやリージョンにリソースを展開できる
クロスアカウントやクロスリージョンにAWSリソースを展開しなければならないケース

## Redshift
#### Work Load Management（WLM）
Redshiftのクエリ処理に対して割り当てるRedshiftのリソースを指定する機能
WLMを利用することでクエリ処理をキューに登録して実行順序を定義することが可能
※SQSではない！！！

## EC2
#### ELBを使わず高可用性とフォールトトレランスを適用（ハードコーディングされた静的IPアドレスを必要）
・EC2インスタンスをヘルスチェックするスクリプトを作成→停止した場合にIPフローティングで複数EC2インスタンス間の冗長性を構成
・ElasticIPを適用してプロキシサーバーを設置

## Organization
#### SCP
デフォルト設定：メンバーアカウントが属するOUに対して「FullAWSAccess」が付与

## ENI
#### アタッチ方法
■実行中のアタッチ（ホットアタッチ）
■停止中のアタッチ（ウォームアタッチ）
■インスタンスが起動中のアタッチ（コールドアタッチ）
XOプラットフォームから SearchAssist へドキュメント検索する場合のメッセージ ノードの設定方法


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556493/48b654d8-2e40-bec9-e76b-2946ed88a0cd.png)

## Result(ノード名)メッセージノードにそれぞれのチャネルに対して設定が可能です。

#### 以下Web/Mobile ClientとMS Teamsの例になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556493/80236354-879c-e96e-72e6-cfc3543370db.png)


 ## Web/Mobile Clientチャネル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556493/3546d1d6-d1e7-d892-c9c1-89f5d8b6551a.png)

##### ドロップダウンから Web/Mobile Clientチャネルを選択し、プレーンテクストではなくて詳細を選択して以下のJSコード設定します。
```ruby:Web/Mobile Client.rb

var data=context.data
var elements = [];
for (var i=0;i<data.length;i++){
    var ele={
        "title": data[i].file_title,
        "subtitle": data[i].file_preview, //.substring(0,90)
        "buttons": [{
            "type": "web_url",
            "title": "View Article",
            "url": data[i].file_url
        }]
    }
    elements.push(ele)
}
var message = {
    "type": 'template',
    "payload": {
        "template_type": 'carousel',
        "elements": []
    }
};
message.payload.elements = elements;

print(JSON.stringify(message));

```



## MS Teamsチャネル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556493/1b15b84b-1b47-5954-3244-484304f03d24.png)

##### 新しいチャネルを追加してドロップダウンからMS Teamsを選択します。プレーンテクストではなくて詳細を選択して以下のJSコード設定します。
```ruby:MS Teams.rb
var data = context.data
var message = {
    "type": "message",
    "speak": "",
    "attachments": [{
        "contentType": "application/vnd.microsoft.card.adaptive",
        "content": {
            "type": "AdaptiveCard",
            "body": [{
                    "type": "TextBlock",
                    "size": "Medium",
                    "weight": "Bolder",
                    "text": "Here are a few more results that might be of your interest"
                }
            ],
            "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
            "version": "1.5"
        }
    }]
}
for (var i = 0; i < data.length; i++) {
    var ele = {
        "type": "ColumnSet",
        "columns": [{
            "type": "Column",
            "items": [{
                    "type": "TextBlock",
                    "weight": "Bolder",
                    "text": data[i].file_title,
                    "wrap": true
                },
                {
                    "type": "TextBlock",
                    "text": data[i].file_preview, //.substring(0,50)
                    "wrap": true
                }, {
                    "type": "ActionSet",
                    "actions": [{
                        "type": "Action.OpenUrl",
                        "title": "View more",
                        "url": data[i].file_url
                    }]
                }
            ],
            "width": "stretch"
        }]
    }
    message.attachments[0].content.body.push(ele)
}

print(JSON.stringify(message))
```

以上
Set Up the CRM Analytics App for Consumer Goods Cloud



[【トレイル】Set Up the CRM Analytics App for Consumer Goods Cloud](https://trailhead.salesforce.com/content/learn/modules/tableau-crm-administration-for-consumer-goods-cloud/set-up-the-tableau-crm-app-for-consumer-goods-cloud)

+ [【質問】Set Up the CRM Analytics App for Consumer Goods Cloud](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CHpSr)

「アプリの作成」セクションにいます。ステップ 3 と 4 を実行しましたが、ステップ 5 ～ 6 が入力されず、空のアプリを選択すると、エラーが発生してステップ 7 に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b0991c73-c505-3458-617e-db11f6bdeab1.png)


この問題は、RetailVisitKpi レコードがないために発生します。ただし、作成することは許可されていません。 

Salesforce ヘルプで、次の記事を見つけました: https://help.salesforce.com/s/articleView?id=sf.retail_task_admin_storekpi.htm&type=5ですが、確かに、必要な権限セットがないため、実行できません。私の組織にはそれらが存在しなかったため、私が追加する必要がありました。私は Trailhead を段階的に実行しており、適切な開発者エディションを所有していることを指摘しておく必要があります。 


# 資料

+ [Consumer Goods Cloud - FAQ](https://help.salesforce.com/s/articleView?id=000393827&type=1)

メモ: 以下のソリューションを表示するには、Partner Community に参加する必要があります。
Partner Community へのアクセス権を申請するには、こちらのリンクにアクセスして、[今すぐ参加] をクリックしてください。
この記事では、機能、ロードマップ、Einstein、データモデル、設定、アップグレード、エラー、ドキュメント、PLC コンテンツ、アドバイス、Maps Advanced Planning、Maps、調査タスクと KPI 種別、管理パッケージの可用性、管理、Einstein Vision、移行、タイムライン、リソース、統合、権限、AP 試験、組織、ドキュメントのトピックに関する FAQ について説明します。
【未解決】input要素にtemporals.format@thymeleafが適用できない

# 環境
| 名称 | バージョン |
|:-:|:-:|
| spring-boot-starter-thymeleaf | 3.1.4 |

# 問題
LocalDateTime型で渡された要素を&lt;input type="hidden"&gt;で渡そうとしたが、フォーマットが機能しなかった。コンソールにエラーが出力されず、原因がわからなかった。
```view.html
<input type="hidden" th:field="*{updateDatetime}" th:value="*{#temporals.format(updateDatetime, 'yyyy/MM/dd HH:mm:ss')}">
```

# 結論
hiddenに限らず、input要素はtemporalsを適用できない模様？
ネットにあるサンプルコードが軒並みth:textなのは、th:text以外には適用できないため？
(自環境でも、th:textであれば適用できた)

やりたかったこと自体は、Formクラスに＠DateTimeFormatを付けることで実現できた。
```SampleForm.java
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")
private LocalDateTime updateDatetime;
```
ssh接続の手順【OSの授業】

# 目的
大学の学科サーバーにpassword入力抜きで二重暗号鍵でssh接続できるようにしたい。

# 環境
シェル：zsh

# 設定方法
## 1. ssh keyを作成
```zsh
ssh-keygen
```
keyのパスワードはなしでもok。
`~/.ssh/id_rsa`(秘密鍵) と `~/.ssh/id_rsa.pub`(公開鍵) が生成される。

## 2. ~/.ssh/config の設定
`~/.ssh/config`に以下を追記する。
```
Host 設定するホスト名
    Port xxxx
    User ユーザー名
    Hostname 学科サーバーのホスト名
```
それぞれ自分で編集する。

## 3. 学科サーバーへ公開鍵を転送して登録
学科サーバーへの公開鍵を転送と公開鍵登録が実行する。
```zsh
ssh-copy-id -i ~/.ssh/id_rsa.pub ユーザー名@設定したホスト名
```
正しく設定されていることを確認する。（`Identity added: 〜` と返ってくればok）
```zsh
ssh-add ~/.ssh/id_rsa
```

※これは `~/.ssh/id_rsa.pub` 中身を学科サーバーの `~/.ssh/authorized_keys` に追加している。（下記コマンドは入力不要）
```zsh
ssh 学科サーバーのホスト名 "mkdir ~/.ssh; chmod 700 ~/.ssh "
cat  ~/.ssh/id_rsa.pub | ssh 学科サーバーのホスト名 "cat >> ~/.ssh/authorized_keys"
```

## 4. パスワードなしでssh接続できるか確認
パスワードを入力することなく、`date` と `ls` が実行できることを確認する。
```zsh
ssh 設定したホスト名 "date ; ls -ld ~"
```
これにてssh接続完了。

# sshのホスト名をtab補完できるようにする
`~/.zshrc`の最後に以下を追記。
```zsh
function _ssh {
  compadd `fgrep 'Host ' ~/.ssh/config | awk '{print $2}' | sort`;
}
```
zshを再読み込み。
```zsh
source ~/.zshrc
```
`ssh 半角スペース` + `tabキー` で補完が出れば成功。

# 参考
- [SSH公開鍵認証で接続するまで](https://qiita.com/kazokmr/items/754169cfa996b24fcbf5)
- [zshでsshのホスト名をtab補完する方法](https://www.proglad.tokyo/2021/04/zshbashsshtab.html)
次世代ネットワーク技術の未来を展望する！エンジニア向けの最新トレンドと技術革新

**次世代ネットワーク技術の未来を展望する！エンジニア向けの最新トレンドと技術革新**

---

**1. はじめに**
ネットワーク技術は、インターネットの初期から急速に進化してきました。この進化は、データ伝送速度の向上、コスト削減、新しいビジネスモデルの登場など、多くの変革をもたらしてきました。この記事では、近年注目されている次世代ネットワーク技術に焦点を当て、その特徴とビジネスへの影響を詳しく解説します。

---

**2. 5Gの概要**
- **5Gとは？**
  5Gは、第5世代移動通信システムを指します。4G LTEに次ぐ新しい通信規格として、高速なデータ伝送と低遅延を実現しています。

- **5Gの主な特徴**
  - 超高速データ通信: 既存の4Gと比べて10倍以上の速度
  - 低遅延: リアルタイム通信を実現
  - 多数同時接続: IoTデバイスの普及に対応

- **5Gの現状**
  - 上記の３つのうち、超高速データ通信しか実現されてません。低遅延と多数同時接続はいつからでしたっけ？この３つが全て実現されてこそ、５Gの本格化です。すでに開始されていて間違っていたらすみません

- **5Gの利点とビジネスへのインパクト**
  5Gの導入により、VR/AR, 自動運転車, スマートシティなどの新しい技術やサービスが可能になります。

---

**3. SDN（Software Defined Networking）**
- **SDNとは？**
  SDNは、ネットワークの制御を集中化し、プログラムによって動的に変更可能にする技術です。

- **SDNの主要な特徴と利点**
  - 柔軟性: ネットワークの設定や管理を迅速に変更可能
  - コスト削減: 物理的なハードウェアに依存しないため、運用コストを削減
  - イノベーション: 新しいネットワークサービスやアプリケーションの迅速な導入が可能

- **SDNの実用例とビジネスへの影響**
  多くの企業がSDNを導入することで、ネットワークの運用効率を向上させています。また、新しいビジネスモデルやサービスの開発も促進されています。

---

**4. NFV（Network Function Virtualization）**
- **NFVの概要**
  NFVは、ネットワーク機能を仮想化し、ハードウェアから独立したソフトウェアとして実行する技術です。

- **NFVの利点と実際の使用例**
  - 柔軟性の向上: 物理的なハードウェアに依存しないため、迅速にネットワーク機能を追加・変更可能
  - コスト削減: ハードウェアの投資や運用コストを削減

- **NFVとSDNの関係性**
  NFVとSDNは、ネットワークの柔軟性と効率を向上させるための技術として、しばしば連携して導入されます。

---

**5. 次世代ネットワーク技術がもたらすビジネスチャンス**
新しいネットワーク技術は、新たなビジネスモデルやサービスの機会を生み出しています。IoT, スマートシティ, ヘルスケア, 金融など、多岐にわたる分野での応用が期待されています。

---

**6. まとめ**
次世代ネットワーク技術は、ビジネスの変革と新たな価値の創出をもたらす重要な要素となっています。エンジニアとして、これらの技術を理解し、適切に活用することで、未来のネットワーク社会をリードすることができるでしょう。

---
# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
gRPC入門: はじめてのgRPC


## 1. はじめに
gRPCはGoogleが開発したオープンソースのRPC (Remote Procedure Call) フレームワークで、2015年に公開されました。HTTP/2を通信プロトコルとして使用し、データのシリアル化にはProtocol Buffers（ProtoBufとも呼ばれる）を使用することが特徴です。


## 2. gRPCの特徴

1. Protocol Buffersとは
Protocol BuffersはGoogleが開発したバイナリ形式のデータ表現フォーマットです。JSONやXMLよりも効率的にデータをシリアライズ・デシリアライズすることが可能です。また、プログラミング言語に依存しない独自のスキーマ定義言語を持っており、このスキーマを基に各言語用のコードが生成されます。

2. HTTP/2による高速通信
HTTP/2を使用することで、従来のHTTP/1.1よりも高速な通信を実現しています。HTTP/2の特徴として、ヘッダー圧縮や多重ストリーム、サーバープッシュなどがあり、これにより効率的な通信が可能となっています。

3. ストリーミング
gRPCは4種類のストリーミングをサポートしています:
単一リクエスト/単一レスポンス
単一リクエスト/ストリームレスポンス
ストリームリクエスト/単一レスポンス
ストリームリクエスト/ストリームレスポンス
これにより、リアルタイムの通信や大量のデータを効率よく扱うことが可能です。

4. 複数言語のサポート
gRPCは様々なプログラミング言語をサポートしており、C++, Java, Python, Go, Node.jsなどの多くの言語で利用することができます。これにより、異なる技術スタックを持つシステム間でも容易に通信を行うことができます。

5. デッドライン/タイムアウトのサポート
gRPCのクライアントは、リクエストにデッドライン（タイムアウト）を指定することができます。これにより、レスポンスが返ってこない場合にクライアントが適切な処理を行うことができます。

6. 認証と認可
gRPCは、SSL/TLSによるトランスポート層のセキュリティや、Googleトークンベースの認証をサポートしています。

## 3. サンプル実装

Pythonでの簡単なgRPCのサーバーとクライアントの実装を示します。

### 3.1 ProtoBufの定義
まず、サービスとメッセージを定義する.protoファイルを作成します。

```proto
syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}
```

### 3.2 サーバーの実装

```python
from concurrent import futures
import grpc
import hello_pb2
import hello_pb2_grpc

class Greeter(hello_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return hello_pb2.HelloResponse(message='Hello, %s!' % request.name)

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()

```

### 3.3 クライアントの実装

```python
import grpc
import hello_pb2
import hello_pb2_grpc

channel = grpc.insecure_channel('localhost:50051')
stub = hello_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(hello_pb2.HelloRequest(name='Qiita'))
print("Greeter client received: " + response.message)

```

これで、サーバーを起動し、クライアントを実行すると、"Hello, gRPC User!"というメッセージが表示されます。
【Python】Traffic Generatorを作った

# 背景
新しいプラットフォーム上にアプリを移設したのに伴いMetricsとLogを確認したい。そのためにある程度の規模のリクエストを一定時間以上送信し続ける必要がある。このような場合、通常`Apache Jmeter`を用いているが、今回はリクエストごとにUserAgentとリクエストにのせるパラメータをランダムに切り替えたいので自前で用意した。

# 要件
- リクエストごとにUserAgentとクエリパラメータをランダムに切り替えたい
- 単位時間あたりのトラフィックをある程度大きくしたい

# Code

```python:traffic_generator.py
# coding:utf-8
import requests
import random
import threading
from time import sleep

user_agents = [
    # Safari User-Agents
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPad; CPU OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
    # Chrome User-Agents
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
    # Microsoft Edge User-Agents
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Edg/117.0.0.0 Safari/537.36 EdgA/117.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Edg/117.0.0.0 Safari/537.36",
]

# please change accordingly
queries = ["query1", "query2"]
num_requests = random.randint(1, 10) 

def send_requests():
    while True:
        try:
            with open("url.txt", "r") as file:
                urls = file.readlines()
                if not urls:
                    print("No more shops in the list. Exiting...")
                    break  # Exit the loop if there are no more shops to process
                url = random.choice(urls).rstrip()
            
            user_agent = random.choice(user_agents)
            query = random.choice(queries)
            header = {'User-Agent': user_agent}

            # please change "?query=" accordingly
            request_url = url + "?query=" + query

            print(request_url)
            response = requests.get(request_url, headers=header)
            print("Status Code:", response.status_code)
            sleep(0.5)
        except Exception as e:
            print("An error occurred:", str(e))
            continue  # Continue to the next iteration if an error occurs

threads = []
for _ in range(num_requests):
    thread = threading.Thread(target=send_requests)
    thread.start()
    threads.append(thread)

for thread in threads:
    thread.join()
```

```text:url.txt
url_1
url_2
url_3
...
url_N
```
About Remix v2-flat routes

## Introduction
Remix v2 で App を構築する過程で学んだことの一部を残す。

## Background
このメモ作成時（2023年10月）の現職の Frontend は、Vue/Nuxt、React/Gatsby など複数の構成が存在する。

デファクトと言える Next.js は、数ある Framework の中で最もユーザーが多く、コミュニティーが活発。
一方で、Next.js を Vercel 以外、例えば Cloud Run で動かす場合、恩恵を受けられないことがある。deploy の手軽さが違う。
また、Vercel としても他の platform で使われると開発する incentive がない。

その他の Framework を問われると、monetize がはっきりしているものが妥当な選択肢となる。

そこで、Shopifyと提携した Remix を検証する。

v2 が release されたため、大きな変更の1つである flat routes とその他の変更点について調べる。

https://my-portfolio-remix-v2.pages.dev/portfolio

https://github.com/danny-yamamoto/my-portfolio-remix-v2

## Overview
### Flat routes
v1 で future flags を有効にしたため、flat routes は経験した。
v2 における flat routes の実装方法に、変更なかった。

> Also in v1.11 we added "flat" routing, which simplifies doing nested layouts without requiring nested directories. This is the default in v2[^1]
>
> また、v1.11では "フラット "ルーティングが追加され、ネストされたディレクトリを必要とせず、ネストされたレイアウトを簡単に行えるようになりました。これはv2のデフォルトです。

[^1]: https://remix.run/blog/remix-v2

構成は、以下の通り。一部分かりやすいように修正してある。

```html
      <div className="flex-container">
        <div className="flex-item">
          <h2 id="experience"><Link to={`/portfolio/experience`}>Experience</Link></h2>
          <h2 id="articles"><Link to={`/portfolio/articles`}>Top 20 Articles</Link></h2>
          <h2 id="certificates"><Link to={`/portfolio/certificates`}>Certificates</Link></h2>
        </div>
        <div>
          <Outlet />
        </div>
      </div>
```

```bash
│   ├── routes
│   │   ├── _index.tsx
│   │   ├── portfolio.articles.tsx      // Outlet
│   │   ├── portfolio.certificates.tsx  // Outlet
│   │   ├── portfolio.experience.tsx    // Outlet
│   │   ├── portfolio._index.tsx        // Outlet
│   │   └── portfolio.tsx               // layout
```

`Outlet` の初期表示は、`portfolio._index.tsx`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/62bfd9c9-8037-5ada-fb1e-bb8e35b716da.png)

コンテンツを選択すると、`Outlet` がプレースメントとして働き、`portfolio.experience.tsx` を表示される。URL は変わらない。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/768a0e88-1ff0-2134-24a1-d4102060b721.png)

### React Server Components (RSC)
v3 でのサポートが検討されている。

> The tl;dr is that we are optimistic about adding support for RSC in Remix v3 and we are anxious to do our part in the effort to prove the technology in multiple frameworks. The capabilities of RSC are interesting, but Remix v2 relies on current stable React features, which at the time of this writing doesn't include RSC. When RSC is stable, you can expect that Remix will support it.[^1]
>
> 要するに、私たちはRemix v3でRSCをサポートすることを楽観視しており、複数のフレームワークでこの技術を証明する努力の一端を担うことを切望しているということだ。RSCの機能は興味深いが、Remix v2は現在の安定したReactの機能に依存しており、この記事を書いている時点ではRSCは含まれていない。RSCが安定すれば、Remixはそれをサポートすることになるでしょう。
AZ-104試験対策のまとめ「ネットワーク編②」

## はじめに
Microsoft Azure Administrator(AZ-104)合格に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AZ-104取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください

## 試験対策のまとめ
### **負荷分散の分類**

| サービス | 分散対象 | 推奨トラフィック |
| ---- | ---- | ---- |
| Azure Front Door | グローバル(リージョン間) | HTTP(S) |
| Traffic Maneger | グローバル(リージョン間) | 非HTTP(S) |
| Application Gateway | リージョン内 | HTTP(S) |
| Azure Load Balancer | リージョン内 | 非HTTP(S) |
* 参考
    - https://learn.microsoft.com/ja-jp/azure/architecture/guide/technology-choices/load-balancing-overview  

### **ロードバランサー**
ゾーン冗長であるため、可用性ゾーン全体で高可用性を確保可能  
レイヤー4(TCP/UDP)のリージョン内ロードバランサー  
* **パブリックロードバランサー** 
    - VNet内のVMにアウトバウンド接続を提供(プライベートIPアドレスをパブリックIPアドレスに変換)  
    - インターネットトラフィックをVMに負荷分散する目的で使用

* **内部(プライベート)ロードバランサー**
    - VNet内でトラフィックを負荷分散する目的で使用
    - フロントエンドIP構成にプライベートIPを使用(Azureによってアクセスが制限される)

* 参考
    - https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-overview

### **Azure Front Door**
Microsoftの最新のクラウドコンテンツ配信ネットワーク(CDN)  
Microsoftのグローバルエッジネットワークを使用してコンテンツを配信  
レイヤー7(HTTP/HTTPS)のグローバルロードバランサー  
* 参考
    - https://learn.microsoft.com/ja-jp/azure/frontdoor/front-door-overview
    - https://learn.microsoft.com/ja-jp/azure/frontdoor/front-door-faq

### **Azure Application Gateway**
Webアプリケーションに対するトラフィックを管理可能  
URLベースのルーティングが可能  
レイヤー7(HTTP/HTTPS)のリージョン内ロードバランサー  
WAFやDDoS Protectionを使用してDDos攻撃からアプリケーションを保護可能  
* 参考
    - https://learn.microsoft.com/ja-jp/azure/application-gateway/overview

### **Traffic Manager**
DNSベースのグローバルロードバランサー  
パブリックエンドポイントに高可用性と高い応答速度を提供  
各エンドポイントの稼働状況も監視可能
* 参考
    - https://learn.microsoft.com/ja-jp/azure/traffic-manager/traffic-manager-overview

## 次の試験対策のまとめ
* **AZ-104試験対策のまとめ「ネットワーク編③」**

https://qiita.com/fsd-jume/items/a8288c119d6453b8a89f

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
学習データの偏りがなぜ問題か？

## なぜ知りたいと思ったか？
機械学習に用意した学習データが、もし偏りがあると問題があるのか知りたかった。


## 学習データの偏りとは何か？
機械学習モデルの性能に影響を及ぼす、学習データの分布の偏りのこと。「1つの分類に集中的に学習していた」という原因が多く、あらゆる問題が生じる。


・どんな問題があるか？
①モデルの汎用性能が低下する
実際のデータと似たデータしか学習していないモデルは、未知のデータに対して正確に予測できず、幅広く使えない。

②データ分析の信頼が低下する
偏ったデータで学習すると、悪意のあるデータを検知した時に制御できなくなり、個人情報を盗聴される危険性がある。

③倫理性・社会性問題が起こる
偏った学習データで学習したモデルを使うと、特定の人種やグループの偏見や差別に繋がる等の社会問題が起こりやすい。2014年に起きた「Amazonの人材採用AIによる女性差別問題」で、「人工知能の社会問題の認知の有無」が問われた事例がある。
https://forbesjapan.com/articles/detail/23419?read_more=1


## データの偏りを防ぐには？
**学習データのバランスをとる**
学習データに偏りが起きる原因は、サンプルデータの集め方が偏っているケースが多い。その対策としてバランスの取れたデータセットを作るのが重要になる。
テスト駆動開発のYoutube動画を見たまとめ

TDD Boot Campさんのテスト駆動開発について解説している動画がわかりやすく、参考になったので要点だけをまとめようと思います。

動画の内容は[こちら](https://www.youtube.com/watch?v=Q-FJ3XmFlT8&t=3111s)

僕の知識レベル（参考にしてください）
* Railsを学んでいる初心者
* 基本的なCRUDアプリが作れる程度
* テスト駆動開発にはこの動画が初めて

あくまで僕なりのまとめなので、ぜひ本編を見てくださいね。

## テスト駆動開発のゴール
「動作する綺麗なコード」を目指すのを前提にテスト駆動開発をする

## テスト駆動開発7STEP
1. 次の目標を考える
2. その目標を示すテストを書く
3. そのテストを実行させて失敗させる（RED）
4. 目的のコードを書く（最短で成功させるようなコード→明確）
5. ２で書いたテストを成功させる（GREEN）
6. テストが通るままでリファクタリングする(Refactor)
7. 1~6を繰り返す

こんな感じでRED→GREEN→Refactorを繰り返していくわけです。

## テストの関数の中身（3aパターン）

- 準備
- 実行
- 検証（１番に書く）&& (8割は値の比較)
- （後片付け）

## TODO（問題を小さく分解する）はテスト容易性+重要度

* 両方高、
* 両方低
で分けていく

## TDD(テスト駆動開発）のスキル

* 問題を小さく分解する
* 歩幅を調整する
    - テスト→仮実装→三角測量→実装
    - テスト→仮実装→実装
    - テスト→明白な実装
* テストの構造化とリファクタリング
    - テストコードは仕様書になるようにする
    - 未来の（3年後の自分）でも意図がわかるのか（特にいらないコードは消しておく）
せんせー、次世代放射線治療ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、次世代放射線治療ってなに？

# 次世代放射線治療とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## 次世代放射線治療って何？

みんな、日焼けすると肌が赤くなること、知ってるよね？それは太陽からの光が肌に当たるから。実は、光や放射線を使って病気を治す方法があるんだ。その中で、新しい技術や方法を使って病気をもっと良く治すことができるのが「次世代放射線治療」なんだよ。

## どういうこと？

昔から、放射線を使って病気の部分を治療する方法があるんだ。でも、技術が進化して、今はもっと正確に、しかも痛くない方法で治療することができるようになったんだ。

## どうしてそれがすごいの？

昔の方法だと、病気の部分だけでなく、周りの健康な部分も少しだけ傷つけてしまうことがあったんだ。でも、次世代放射線治療では、病気の部分だけをピンポイントで治療できるから、周りの部分が傷つくことが少ないんだよ。

## だから、次世代放射線治療ってなに？

次世代放射線治療は、新しい技術を使って、病気の部分だけをとても正確に治療する方法。これによって、痛みが少なく、回復も早くなることが期待されているんだよ。

# まとめ

このように、次世代放射線治療は、新しい技術で病気の部分をピンポイントで治す方法。これにより、患者さんがより安全に、そして快適に治療を受けることができるようになってきたんだよ。
せんせー、アンチマター推進ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、アンチマター推進ってなに？

# アンチマター推進とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## アンチマター推進って何？

みんな、対を成すものって知ってる？靴下の左と右、手のひらと甲、そういうものだよね。宇宙にも、普通の物質とちょうど反対の性質を持つ「アンチマター」というものがあるんだ。そして、このアンチマターを使って、宇宙船を動かそうという考えが「アンチマター推進」なんだよ。

## どういうこと？

アンチマターと普通の物質が触れ合うと、すごく大きなエネルギーが出るんだ。これを使って、宇宙船を速く動かすことが考えられているんだよ。

## どうしてそれがすごいの？

アンチマター推進は、今のロケットよりもずっと速く宇宙船を動かすことができるかもしれないんだ。だから、もし実現できれば、遠くの星や惑星にもっと早く行けるようになるかも！

## だから、アンチマター推進ってなに？

アンチマター推進は、特別な「アンチマター」という物質を使って、宇宙船をすごく速く動かす方法のこと。これを使えば、遠くの宇宙の旅も夢じゃなくなるかもしれないんだよ。

# まとめ

このように、アンチマター推進は、特別な「アンチマター」という物質を使って宇宙船を動かす方法。もし実現できれば、遠くの宇宙の探検がもっと楽しくなるかもしれないね！
[flutter] richTextEditorのライブラリを徹底比較してみた。[完全版]

## はじめに

こんにちは。
今回は業務でflutterのrichTextEditorの実装を行った際に、
色々なライブラリの検討をしたので、その知見を共有できたら良いなと思い記事を書いている次第です。
どなたかの参考になれば幸いです。


※今回の記事は2023/10月時点での情報です。
今後のアップデートで状況が変わっていることもあるので、参考までに見ていただけるありがたいです。

## 感謝

この記事では、いろいろなライブラリを比較検討していますが、
そもそも**OSSは、開発者の善意の元、
ただで利用させて利用させていただいているもの**です。
ただ批判するのではなく感謝して使わせていただきましょう！！


## flutter_quill

#### おすすめ度　★★★★☆　4/5

太字、文字の大きさなどカスタマイズ性は良好で問題なく、
特にいいなと思った点としては、
本文から取得したtextをjson形式で変換するメゾットが標準で実装されていることです。

一つ残念。。と思ったのが、初期値をhtmlの形式で組み込めないことです。
本文の中から取得したtextをhtmlに変換することはできましたが、
初期値がstring型でしか出力できないんですよね。
そこが改善されるようになれば、なお良いです！

https://pub.dev/packages/flutter_quill

## quill_html_editor

#### おすすめ度　★☆☆☆☆　1/5

上記で紹介したquillエディタの発展版みたいです。

上記のライブラリでは実現できなかった初期値をhtmlで入力できるようにはなっているのですが、、
肝心のエディタが改行できなかったり、文字を入力するごとにキーボードが落ちたりなど、
挙動が不安定な部分がありました。
今後に期待ですね。（時間があれば自分でPR投げたい）

https://pub.dev/packages/quill_html_editor

## html_editor_enhanced

#### おすすめ度　★★★★★　5/5

結果的に今回の要件で自分が採用したパッケージはこちらになります。
richTextEditorとしての機能も問題なく使用できますし、
パラメーターも多く、カスタマイズ性も高く、かなり使いやすいパッケージです。
初期値もhtml形式で渡せますし、今のところ文句のつけようがないです。

https://pub.dev/packages/html_editor_enhanced



## zefyrka

#### おすすめ度　★★☆☆☆　2/5

昨日としては問題なく使用できますが、ややカスタマイズ性が低いなと思いました。
ぱっと見ですが、初期値を入力できるパラメータ等の確認出来ませんでした。
こちらも今後に期待です！！

https://pub.dev/packages/zefyrka/score


## 最後に

最後までご覧いただきありがとうございました。
重ねてになりますが、あくまで2023/１０月現在での情報になるので、最終的にはご自身で確かめていただくのがベターと思います。

自分もいつかOSSにpushとかしてみたいな〜と思ってみたり。
(デカ文字)ESP32でカラー液晶、温度計を作って遊ぶ3(シリアルモニター)


arduino unoで受信テストプログラム


![o_cop674.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d7971b73-77a5-daac-5db8-e59802cb0173.jpeg)


![o_cop675.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bb44d45b-8fda-15ef-1da6-0123e7f1d9b3.jpeg)




```c++


//ser_mon_9600_uno_t3_1

#include <arduino.h>

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX



int incomingByte = 0;  // 受信データ用

void setup(){

  Serial.begin(9600); // 9600bpsでシリアルポートを開く
  mySerial.begin(9600); // ソフトウェアシリアルの初期化

  Serial.print("START\r\n");

}//setup


void loop() {

  if(mySerial.available() > 0) { // 受信したデータが存在する


    //バッファーが空になるまで読み飛ばす
    while (mySerial.available() != 0) { // 受信したデータが存在する

      incomingByte = mySerial.read(); // 受信データを読み込む

    }//while

    //PCのシリアルにHEXを出力
    Serial.print("[");
    Serial.print(incomingByte,HEX);
    Serial.print("]");

  }//if

}//loop




```
plunkerでopenjscad その11

# 概要
plunkerでopenjscadやってみる。
練習問題やってみた。

# 練習問題
OBJをパースして、描画せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/04e06634-1719-a1f9-bed7-7fc56aadcbb8.png)

# サンプルコード

```
function main() {
	var obj0 = 
"g cube\n" +
"v 0 0 0\n" +
"v 10 0 0\n" +
"v 0 10 0\n" +
"v 10 10 0\n" +
"v 0 0 10\n" +
"v 10 0 10\n" +
"v 0 10 10\n" +
"v 10 10 10\n" +
"vt 0 0\n" +
"vt 0 1\n" +
"vt 1 0\n" +
"vt 1 1\n" +
"vn 0 0 -1\n" +
"vn -1 0 0\n" +
"vn 1 0 0\n" +
"vn 0 -1 0\n" +
"vn 0 1 0\n" +
"vn 0 0 1\n" +
"f 1/1/1 3/2/1 4/3/1 2/4/1\n" +
"f 1/1/2 5/2/2 7/3/2 3/4/2\n" +
"f 2/1/3 4/2/3 8/3/3 6/4/3\n" +
"f 1/1/4 2/2/4 6/3/4 5/4/4\n" +
"f 3/1/5 7/2/5 8/3/5 4/4/5\n" +
"f 5/1/6 6/2/6 8/3/6 7/4/6";
	var points = [];
	var faces = [];
  var t = 0;
  var textArray = obj0.split(/\r\n|\r|\n/);
	for (var i = 0; i < textArray.length; i++)
	{
		var line = textArray[i];
		if (line.indexOf('v ') === 0)
		{
			var tmp = line.split(' ');
			points.push([tmp[1], tmp[2], tmp[3]]);
		t = t + 3;
		}
		else if (line.indexOf('vn ') === 0)
		{
		}
		else if (line.indexOf('f ') === 0)
		{
			var tmp = line.split(' ');
			var p0 = tmp[1].split("/");
			var p1 = tmp[2].split("/");
			var p2 = tmp[3].split("/");
			var p3 = tmp[4].split("/");
			faces.push([p0[0] - 1, p1[0] - 1, p2[0] - 1]);
			faces.push([p0[0] - 1, p2[0] - 1, p3[0] - 1]);
		}
	}
	return CSG.polyhedron({
		points: points,
		faces: faces
	});
}
```

# 成果物

https://embed.plnkr.co/plunk/YKT5KxkLCdLQvV0z


以上。
【WebAPI】ステータスコードを正しく使う　500番台編

:::note
500番台のエラーは、クライアント側ではなくサーバー側に問題があった場合のエラー。
:::

### 500 Internal Server Error
WEBアプリケーション開発をしているとよく見るエラー。サーバ側のコードにバグがあってエラーを吐いて処置が停止してしまった場合などに発生する。
500番台のエラーじゃログを監視して管理者に通知が行くように設定して、発生時に再発を防止するようにすることが推奨される。

### 503 Service Unavailable
サーバーが一時的に利用できない状態になっていることを示すもので、意図的にせよ、意図的でないにせよ、サーバが応答しなくなった場合に返すエラー。
意図的に返すケースは、メンテナンスのためにサービスを止めるケース。意図的でないケースは、サーバーが過負荷に陥ってレスポンスを返せなくなり、ロードバランサーなどWebサーバの前段にいるサーバが変えケースなどがある。

---