OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetesのノードのスケーリング条件

# TL;DR
- スケールアップはリソース不足のPodが作成されたタイミング
- スケールダウンは(1)ノードの要求リソースが50%以下，(2)全てのPodが他のノードに移動可能，(3)ノード削除不可のアノテーションがされていない，この状態が10分間続いた場合に行われる．
- 基本的に1ノードずつスケールダウンされるが，空のノードの場合は10ノードまで一度に削除される

# 参考にした資料
https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#Internals

# 資料内の用語について
- スケールアップ（scale-up）：ノードプールのサイズアップ（ノード追加）
- スケールダウン（scale-down）：ノードプールのサイズダウン（ノード削除）

通常はスケールアップといえばノードの性能自体を上げることをいうが（スケールダウンはその逆），上の資料ではノードの数を増やすことを意味している．ノード自体の増減は一般にスケールイン・アウトというのでちょっと紛らわしい．

# スケールアップの条件
Kubernetesのスケールアップは単純で以下の条件を満たすと行われる．

- Kubernetesでは10秒ごと（--scan-intervalで指定）にUnschedulable状態になっているPodをチェックし，そのPodがあればノードが追加される

ちなみに，ノードが追加されるとPodのエラー内容が「リソース不足」から「ノードの状態がReadyではない」に変わって，その後ノードの準備が出来たらスケジューリングされる．

# スケールダウンの条件
スケールダウンの条件は少し複雑になっている．

- **CPU・メモリのリクエストの合計がノードの容量の50%以下**になっている（しきい値は変更可能）
- **ノードの内の全てのPod（daemonsetなどのPodを除く）が他のノードに移動可能**な場合．Podの設定によってはリソースが空いていても他のノードに移動できない場合がある．
- **ノードにスケールダウン不可のアノテーションがされていない場合**．

以上の条件に当てはまるかをスケールアップのときと同じで10秒毎にチェックされるが，スケールダウンの場合にはこの状態が**10分続いた場合にのみ**ノードが削除される．（この時間についてもフラグなどで変更可能）

スケールダウンは**基本的には１ノードずつ行われる**．これは特定のノードを削除した後にも他のノードが以上の条件を満たしているか保証されていないためである．ただし，最初のノードが削除されてからまた10分測り直しというわけではなく，連続で削除される可能性はある．

※ただ例外的に**「空のノード」は一度に10ノードまで**削除することが出来る．

## スケールダウン時のPodについて
スケールダウンされた場合，ノードにTaintを付与して再度スケジューリング不可の状態にしてPodの削除を行う．これでKubernetesが自動的に他のノードでPodの再作成を行う．
よく使っているWindowsショートカット

*  殿堂入り（知ってる前提）
    * Ctrl + C / Ctrl + V / Ctrl + Z / Ctrl + A / Ctrl + Y / Ctrl + X / Ctrl + S / Ctrl + F /  [Windows] + L
* いろいろ書くと、量が多くなるので、最低限

## Windows共通
###  Alt + Tab　（重要度：★★★）
* 別のウィンドウに切り替えたいときに使う
* [Alt + Tab] → [Alt押しながら方向キー]で操作することを推奨

###  [Windows] + 方向キー　（重要度：★★）
* ウィンドウを左右に寄せる
* [ウィンドウをスナップしたときに、横に配置できるものを表示する]は絶対に設定オフにする

###  Alt + F4（重要度：★）
* ウィンドウを閉じる

## Chrome
###  Ctrl + T　（重要度：★★）
* 新しいタブを開く
* 検索したい文字を選択 → [Ctrl + C] → [Ctrl + T] → [Ctrl + V]で即検索できる

###  Ctrl + W / Ctrl + F4　（重要度：★★）
* タブを閉じる

###  Ctrl + L / Alt + D　（重要度：★★）
* アドレスバーを選択

###  Ctrl + PageUp / Ctrl + PageDown　（重要度：★★）
* 隣のタブに移動

## Explorer
###  F2　（重要度：★★★）
* 名前の変更

###  Tab / Shift + Tab　（重要度：★★）
* 選択箇所の移動

###  Shift + F10 / アプリケーションキー　（重要度：★★★）
* 右クリック

###  Alt + ↑　（重要度：★★★）
* 1階層上に移動

###  Ctrl + N （重要度：★★）
* 新しいウィンドウを開く

###  Ctrl + テンキーの＋ （重要度：★★）
* ファイル名に合わせて列の長さを調整する

###  Ctrl + Shift + N　（重要度：★★★）
* フォルダ作成

## TextEditor（sakura）
###  Home / End （重要度：★★★）
* カーソル位置から末尾or先頭までを移動
* よく使うのは[Home] → [Shift + End]で1行全選択

###  Alt + 方向キー / Shift + F6 （重要度：★★★）
* 矩形選択モード（sakura）
* VSCodeでは少し違うため使うエディタに合わせる


## Excel
###  F2　（重要度：★★★）
* セル内を編集
Sync Gatewayデプロイメント：概要

ここでは、本番環境でSync　GatewayとCouchbase　Serverを使用するさまざまな側面について説明します。

## 配置
Sync　GatewayとCouchbase　Serverは、別々のマシンにデプロイされることが想定されます。これは、Sync Gatewayは通常、インターネットからのアクセスを受け付け（ることのできる「アプリケーション層」に配置され）、Couchbase Serverは、インターネットからアクセスされる必要がない（「データベース層」に配置される）ためです。

オンプレミスでホストする場合でも、クラウドでホストする場合でも、これら2つのシステム間で最適なパフォーマンスを実現するには、Sync GatewayとCouchbase Serverを互いに近接させておく必要があります。

## サイジングとスケーリング
物理マシン、コンテナ、またはVMによって、単一のSync Gatewayで快適にサポートできるアクティブな同時ユーザーの数が決まります。

または、垂直方向にスケーリングする代わりに、Sync Gatewayノードをクラスターとして実行して水平方向にスケーリングすることもできます。（通常、1つに障害が発生した場合に備えて、高可用性を確保するために、少なくとも2つのSync Gatewayノードが必要になります。）これは、複数のマシンのそれぞれでSync Gatewayの複数のインスタンスを実行し、各着信を指示することによってそれらの負荷分散を行うことを意味します。

クラスターとして構成されるSync Gatewayノードは、特定の処理専用に構成する場合を除いて、同種の構成を持ちます。一方、Sync Gatewayノードを、ドキュメントのインポート処理専用に設定することもできます。


通常、複数のSync Gatewayノードをロードバランサーサーバーの背後に配置することによって、クライアントからの接続要求を調整することが行われます。

## チャネルとリビジョンキャッシュ

適切なサイズのSync Gatewayは、数百から数万のチャネル利用にまで拡張できます。ただし、チャネルキャッシュは無制限に増大する可能性があるため、Sync Gatewayは、特に利用規模が数百万チャネルのオーダーで増大するにつれて、垂直方向のスケーリングの限界に達する可能性があります。

Sync Gatewayでは、キャッシュを調整するための多くのオプションが提供され、メモリ不足の問題が発生する可能性なしにSync Gatewayを垂直方向にスケーリングできます。

設定には2つのカテゴリがあります。

- チャネルキャッシュ：チャネルの数が無制限に増える可能性がある場合に適用されます。

- リビジョンキャッシュ：ドキュメントサイズが大きい場合に適用されます。

詳細は、以下のURLを参照してください。

https://docs.couchbase.com/sync-gateway/3.0/configuration-properties.html

https://docs.couchbase.com/sync-gateway/3.0/configuration-overview.html

#### エディションによる差異
チャネルとリビジョンキャッシュの調整は、エンタープライズエディションのみの機能です。コミュニティエディションは構成ファイル内のこれらのプロパティはすべて無視され、デフォルト値が適用されます。



## パフォーマンスに関する考慮事項
パフォーマンスに関する次の注意事項に注意してください。

- Sync Gatewayノードはローカル状態を保持しないため、ディスクは必要ありません。

- Sync Gatewayノードは、RAMにチャネルとリビジョンのメタデータキャッシュを維持します。構成ファイルのキャッシュ値を調整すると、パフォーマンスを向上させることができます。

- Sync Gatewayは、マルチプロセッシング用に設計されています。軽量スレッドと非同期I/Oを使用します。したがって、Sync GatewayノードにCPUコアを追加すると、ノードの速度を上げることができます。

- データベースで一般的であるように、書き込みは読み取りよりもシステムに大きな負荷をかけます。特に、すべての書き込み操作はSync関数によって処理され、読み取りアクセス権を持つ他のクライアントへの通知をトリガーします。他のクライアントは読み取りを実行して新しいデータを取得します。

- 継続的なレプリケーションを実行している各クライアントには、変更を通知するためのオープンソケットがあり、これらのソケットはほとんどの時間アイドル状態のままであるため、（ドキュメントが非常に頻繁に変更されている場合を除き、実際のデータトラフィックは少ない一方）発生する可能性のあるオープンソケットの数について留意する必要があります。OSレベルチューニングにより、開く必要のある接続の数を最適化することが推奨されます。

- Sync GatewayはRAMを使用するように最適化されているため、Linuxのswappiness値を0に変更することでパフォーマンスを向上させることができます（これにより、少なくとも性能が劣化することはありません）（[Swap Space and Kernel Swappiness](https://docs.couchbase.com/server/current/install/install-swap-space.html)参照）。

## 関連情報

https://docs.couchbase.com/sync-gateway/3.0/deployment.html


https://docs.couchbase.com/server/current/install/install-swap-space.html
AWS上でデータの収集、加工、分析を行う

#はじめに
kaggleなどでデータ分析の勉強を行う際は、既に加工されて分析しやすい形になったデータに対して分析を行うことが多いと思います。しかし実務ではデータの収集から行う必要性があったり、分析に適さない生データを扱うことになると思います。

そこで一からデータの入手・加工・分析までの流れをやってみようということと、AWSの経験値を積むために、AWS上で一連の流れを処理するためのアーキテクチャを作成しました。

#学習方法
AWSについてはネットで調べつつ繋げていくのがメインでした。
個々の実装やサービス同士の繋げ方については、別で記事をあげていきたいなぁと思ってます。

スクレイピングについては、udemyの「【4つの実案件で学ぶ】Python Webスクレイピング完全パック」で学びました。実案件を交えつつ、非常に分かりやすい内容となっています。

#作ったもの

一週間に一回、バイク王さんの中古バイクのデータを取得し、データ分析を行える状態まで持っていくアーキテクチャです。
下図が今回作成したものになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863646/6bad7b6e-f325-c414-c877-9d8af183036d.png)

①EventBridgeで一週間に一回、Lambdaのスクレイピングを実行(データ収集)
②スクレイピングしたpickleデータがS3に保存されたことをトリガーとして、データ加工用のLambdaが実行(データ加工)
③最終的にEC2上にdockerでデータ分析環境を作成し、データ分析を行う(データ分析)

といった流れになります。
Seleniumを用いたスクレイピングを実装するのはかなり大変でした…




個々の実装内容について、記事を追加していければと考えています。

・DockerでEC2上にデータ分析環境を作る
https://qiita.com/nessyyamamoto/items/245a2b5b16f935e87b85
「Excel VSTOブック」プロジェクトが作成できない場合

## 対象者

Visual Studio InstallerからOffice/SharePoint 開発のインストール後、
「Excel VSTOアドイン」プロジェクトは作成できるが、
「Excel VSTOブック」「Excel VSTOテンプレート」プロジェクトの作成時にアプリケーションのドキュメントを選択後に「VSTO アドインがアクティブになっていません」みたいなエラーで作成できない場合の備忘録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485488/4ca2078e-1c38-ef60-5ed0-362a5da2b81a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485488/93544f5d-082d-227e-af39-6636f0f9c3eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485488/41b023cb-9ae1-d441-807b-710c4fdf004d.png)

## 解決方法

2008年の記事を参考に解決した。
[Visual Studio Tools for Officeで作るOfficeアプリケーション](https://codezine.jp/article/detail/2481?p=4)

M365 Excelの場合、まずは
Excelのファイル > オプション > トラストセンター > トラストセンターの設定(T) をクリックすることでトラストセンターを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485488/cce9b676-1357-275f-d1a2-07b7cfcae6bd.png)

信頼できる場所 から「新しい場所の追加(A)」を選び、Visual Studioのソリューションを含むフォルダを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485488/58c60d3a-f333-2302-35d7-745f07e24c48.png)

Visual Studioを再起動後、「Excel VSTOブック」プロジェクトを作れるようになった。

## 環境

Microsoft Visual Studio Community 2022 Preview (64 ビット)
Version 17.0.0 Preview 7.0
Microsoft Framework Version 4.8
Microsoft 365 Apps for enterprise
ドキュメンテーション

## ドキュメンテーションとは
- 構築時に作成する
- パラメータシートを見ればどこに何を設定すれば良いのかわかる
    - 手順書ではない
    - 構築ができるレベル
- 既定値と変更後の値が記載されている
- なので、変更しているところをメインに説明する

## ポイント
### 悩んだら書く
後々加えるのは面倒なので、書くかどうか悩むのであれば、とりあえず書いてしまえば良い
### 文章は書かない
画面の設定内容を書くのであって、あなたの文章を書くことはない！
### 画面と同じように書く
画面の通り書くというルール
自動翻訳で日本語がおかしかったとしても、そのまま書く
### 変化する値は記入しない
状態や時間や回数など変化する値
例えば電源のオン/オフ
### 凡例にない記号は使用しない
選択するしない、既定値などの値については凡例で定義する
凡例にない記号は絶対に使用しない
逆に新たに使用したい記号や、元の記号を変更したい場合は凡例で定義する
### 記載の意図を説明できるようにする
自分が作成するパラメータシートなので、記載の意図は全て説明できるようにする
「雛形がこうなっていたので〜」は通用しない

## ドキュメントの種類
【要件定義フェーズ】
要件定義書
 
【基本設計フェーズ】
基本設計書
運用設計書
 
【詳細設計フェーズ】
詳細設計書
パラメータシート
構築手順書
 
【テスト計画】
全体テスト計画書
テストケース一覧
	単体テスト
	結合テスト
	総合テスト
仕様書
報告書
 
【移行フェーズ】
移行計画書
移行手順書

【運用フェーズ】
運用手順書

## 疑問点
ドリルダウンなどで選択した値によって既定値が変わるものはどうしたら良いのか

## 苦労したこと
- とにかく記述量が多すぎる
- どこまで書けば良いかわからない
    - 設定変更した箇所だけで良いのか、それとも全て必要なのか？
- そもそもなぜ記述するのかをきちんと理解しないといけない

## バージョン管理について
クライアントに提出するものが1.0~
内部バージョンが0.1~

発行日：レビュー日
発生元：指摘をもらった人
指摘内容：なるべく言われた通りに記述する・要するにこういうこと？ってのは聞いてから書くようにしたほうがいい
「〜という認識で大丈夫ですか？」「〜という点を修正すれば良いでしょうか？」
検討結果：

### 確認して修正してくださいの真意
「確認して」と「修正してください」は別のフローなので、まずは確認する
確認して、どうしたのかということを伝える
「確認して、項目が不足していたため、追記いたしました」
「確認し、検討した結果、全ての項目を記載しておりました」
Sync Gateway機能解説：同期〜デルタ同期



## 概要
デルタ同期は、Couchbase Mobileドキュメントの変更された部分のみを複製する機能を提供します。これにより、帯域幅の消費量が節約され、スループットが向上します。

Sync Gatewayデータベースでデルタ同期が有効になっている場合、そのデータベースと同期しているCouchbase Liteクライアントは自動的にデルタ同期利用に切り替わります。Sync Gatewayでデルタ同期が無効になっている場合、Couchbase Lieクライアントは通常モードで動作します。

デルタ同期は、デフォルトでは無効になっています。

デルタ同期は添付ファイルには適用されません。


## 構成
次に示すように、データベース構成の`delta_sync`プロパティを使用して、デルタ同期を設定します。


```JSON
// ... other configuration properties as appropriate
{
  "databases": {
    "db": {
      "name": "dbname",
      "bucket": "default",
      "allow_conflicts": false,
      "revs_limit": 20,
      "delta_sync": { 
        "enabled": true,
        "rev_max_age_seconds": 86400
      }
      // ... any other configuration properties as appropriate
    }
  }
}
```

### プロパティ

- `enabled`:  デルタ同期を有効または無効に設定します。
- `rev_max_age_seconds`: デルタ同期の書き込み操作ごとに、リビジョンボディがバケットにバックアップされ、指定された期間保持されます。バックアップされたリビジョンボディは、将来のリビジョンのデルタ計算に利用されます。したがって、新しいデルタは、ここで指定された時間内に到着した読み取り要求に対してのみ生成されます。デフォルト値は86400秒(24時間)です。

## 追加ストレージ容量の考慮

デルタ同期がバックアップされたリビジョンボディをCouchbase Serverバケットに保存するということは、Couchbase Serverに追加のストレージ容量が必要であることを意味します。

必要なストレージ容量の計算式は、以下の通りです。 

```
(平均ドキュメントサイズ * 書き込み/日 * 86400) / rev_max_age_seconds
```

例えば、以下の場合、デルタ同期を有効にすると、Couchbase Serverで追加的に400KBのストレージが必要になります。


- rev_max_age_seconds: デフォルト値(86400)

- 平均ドキュメントサイズ: 4 KB

- 書き込み/日: 100



`rev_max_age_seconds`を0に設定すると、追加のストレージ要件なしで、プルレプリケーションで日和見的にデルタが生成されます。

## 関連情報

https://docs.couchbase.com/sync-gateway/3.0/delta-sync.html
(超小ネタ)Ubuntu Studio 21.xxのログイン画面でハマった件

# Ubuntu Sutudio を 20.04=>21.04=>21.10 と渡り歩いた結果

色々変わって大変。

本来は20.04=>21.04はインプレースアップグレード(ってWindows用語か、要は再インストールなしにdo-release-upgradeするパターン)は非サポートとのことだったが、無理やりやってしまった。

20.04=>21.xxで大きく変わったのはデスクトップ環境で、それまで使ってきたxfce4からkde5に移行したこと。xfce4はたしかUbuntuStudioを使い始めた頃からだったので、えー手元に残ってる一番古いisoは11.04だから、つまり2011年から10年ぶりにデスクトップ環境が変わったということ。うーん感慨深い。

あとはディスプレイマネージャ(ログイン画面)がlightdmからsddmに変更になった。

そしたら、ちょっとだけハマったので顛末をメモがわりに書いてみます。

# インストール時に入るconf vs 管理画面から生成されるconf

インストール時には`/etc/sddm.conf`という中身が空の設定ファイルが生成されるのだが、[KDEシステム設定]=>[起動と終了]=>[ログイン画面(SDDM)]を立ち上げて設定すると、`/etc/sddm.conf.d/kde_settings.conf`という設定される。

うーん、`/etc/sddm.conf`は"Local configuration file for compatibility"とあるので、たぶん昔の方式なんだろう。だったら、デフォルトのコンフィグは`/etc/sddm.conf.d/`配下に入れといてくんねーかな。
なんでかっていうと、うろ覚えだけど`/etc/sddm.conf`に設定書いても反映されない事があったんで、`/etc/sddm.conf.d/`配下にコンフィグファイル作ったんだわ。


# あるぇ、autologinが効かなくなったぞ。

んで、家で使うデスクトップだから、オートログインさせてたわけよ。
そいじゃぁsddmでもやるか、ってことで`/etc/sddm.conf.d/kde_settings.conf`をこんな感じに書き換えてみた。

```/etc/sddm.conf.d/kde_settings.conf

[Autologin]
Relogin=false
Session=ubuntusutudio
User=theusername

[General]
HaltCommand=
RebootCommand=

[Theme]
Current=
Font=Noto Sans,10,-1,0,50,0,0,0,0,0,Regular

[Users]
MaximumUid=60000
MinimumUid=1000

```

これで確かログインできてたのよ21.04の頃は。
ところがね、21.10になったら全然自動ログインしてくれないわけ。
おかしーなー、とぐぐってみたら...

https://wiki.archlinux.jp/index.php/SDDM

>自動ログイン
>KDM と同じように、SDDM は設定ファイルによって自動ログインをサポートしています、例:
>
>/etc/sddm.conf.d/autologin.conf
>[Autologin]
>User=john
>Session=plasma.desktop
>
>上の設定だと、システムが起動した時に john ユーザーで KDE Plasma セッションが起動します。利用できるセッションのタイプは ls /usr/share/xsessions/ でわかります。

ほうほう、どれどれ

```
$  ls /usr/share/xsessions/
plasma.desktop  remmina-gnome.desktop  twm.desktop

```

がーん、ubuntustudio.desktopが無えじゃねぇか.....

ということで`Session`に`plasma`を設定して解決。

(したとおもったらemacsで編集してたからバックアップファイルのkde_settings.conf~の方を見に行って反映されなかったというオチもあるんよ。ちょっと困るよね元のファイル残しときたい時とか、読み込むのは*.confだけにしてほしいなぁ)

# おわりに

個人的な感想としてはlightdm使ってる人は無理やりsddmに移行する必要はないと思う。do-release-upgradeのパッケージのインストール時にlightdm使うかsddm使うかの選択があるので、迷わずlightdmでいいんじゃないでしょか。

ンまァ21.xx系になって見た目が派手になったのはちょっと感動したし、qjackctlのグラフでalsaとjackのportが一画面で確認できるようになったのはなかなかカッチョいいかなとか思った。


以上、お気持ち表明多めのメモでした。
IPv4 アドレスを単純に降順ソート

#なんでエラー出よんの？
sort(1) コマンドは、普段気にする機会がなく素通りしよるこのコマンドの実装差異が存在しよる。
Linux で IPv4 アドレスを昇順や降順並べ替えしよる組み込みスクリプトが FreeBSD じゃと期待通りに動作せん事があるんじゃ😱

#コマンドの引数例
```text
GNU sort(1)
% sort --version-sort
か
% sort -v
```

```text
BSD sort(1)
% sort --version-sort
か
% sort -t. -k1,1n -k2,2n -k3,3n -k4,4n
```

#解説という超薄っすい蘊蓄
旧来からのコマンドオプションじゃと、BSD 版に「-v」が無いけぇ、エラーで処理中断しよる。
「-t」と「--version-sort」は双方に実装しよるけ、期待通りに処理しよるのじゃが、昨今のレシピは GNU 版が当たり前の如く解説されちょる記事が溢れかえっとるけ、BSD 版で実行しよる時が困る。

#結論✌
じゃけ、躓きよったら確認してみんさい😅

#ほかにも😅
別解として、sysutils/coreutils を ports からインスコして sort ⇒ gsort に書き換えるのも😒
破壊力学のお勉強

#今更破壊力学？
　私は、仕事では基本的に試験データを用いた解析をやっております。
最近は機械学習を用いたモデル開発なんかもやってますが、結果の解釈とかのときに必要になったので、いい機会なのでお勉強ということで。
　一応プログラムも絡めておかないと運営に怒られそうなので、適当に数式をcかpythonかmatlabで書いてみますかねぇ。

##使う本 
いつ買ったのかはわからないが、家に転がっていた__小林英男著、”破壊力学”__

##私の知識
４力（材料力学、熱力学、機械力学、流体力学）は大学で履修
材料に関する知識は一般論ぐらい（機械材料とか）
固体物理は習ったような・・・。
数学は大学課程はなんとか、統計検定２級は最近合格。
plunkerでieee754 その2

# 概要

plunkerでieee754やってみた。
dataview使って、浮動小数点と整数を変換してみた。

# サンプルコード

```
var src = document.getElementById("src"); 
var out = document.getElementById("out"); 

function h2b(str) {
  var buffer = new ArrayBuffer(4);
  var bytes = new Uint8Array(buffer);
  var v = new DataView(buffer);  
  bytes[0] = parseInt(str[0] + str[1], 16);
  bytes[1] = parseInt(str[2] + str[3], 16);
  bytes[2] = parseInt(str[4] + str[5], 16);
  bytes[3] = parseInt(str[6] + str[7], 16);
  return v.getFloat32(0);
}
function h2i(str) {
  var buffer = new ArrayBuffer(4);
  var bytes = new Uint8Array(buffer);
  var v = new DataView(buffer);  
  bytes[0] = parseInt(str[0] + str[1], 16);
  bytes[1] = parseInt(str[2] + str[3], 16);
  bytes[2] = parseInt(str[4] + str[5], 16);
  bytes[3] = parseInt(str[6] + str[7], 16);
  return v.getInt32(0);
}
function run() {
  var str = src.value;
  var codes = str.split("\n");  
	for (var i = 0; i < codes.length; i++)
	{
    var line = codes[i].split(" ");
    var v = h2b(line[0]);
    out.value += v + "\t";
    v = h2i(line[1]);
    out.value += v + "\n";
	}
}




```

# 投入したソース

浮動小数点と整数

```
c0490fdb ffffcdbc
c03ba866 ffffd116
c02e40f1 ffffd470
c020d97c ffffd7ca
c0137207 ffffdb23
c0060a92 ffffde7d
bff1463a ffffe1d7
bfd67750 ffffe531
bfbba866 ffffe88b
bfa0d97c ffffebe5
bf860a92 ffffef3f
bf567750 fffff299
bf20d97c fffff5f2
bed67750 fffff94c
be567750 fffffca6
a6000000 00000000
3e567750 0000035a
3ed67750 000006b4
3f20d97c 00000a0e
3f567750 00000d67
3f860a92 000010c1
3fa0d97c 0000141b
3fbba866 00001775
3fd67750 00001acf
3ff1463a 00001e29
40060a92 00002183
40137207 000024dd
4020d97c 00002836
402e40f1 00002b90
403ba866 00002eea
40490fdb 00003244
```

# 結果

```
-3.1415927410125732	-12868
-2.9321532249450684	-12010
-2.7227137088775635	-11152
-2.5132741928100586	-10294
-2.3038346767425537	-9437
-2.094395160675049	-8579
-1.884955644607544	-7721
-1.675516128540039	-6863
-1.4660766124725342	-6005
-1.2566370964050293	-5147
-1.0471975803375244	-4289
-0.8377580642700195	-3431
-0.6283185482025146	-2574
-0.41887903213500977	-1716
-0.20943951606750488	-858
-4.440892098500626e-16	0
0.20943951606750488	858
0.41887903213500977	1716
0.6283185482025146	2574
0.8377580642700195	3431
1.0471975803375244	4289
1.2566370964050293	5147
1.4660766124725342	6005
1.675516128540039	6863
1.884955644607544	7721
2.094395160675049	8579
2.3038346767425537	9437
2.5132741928100586	10294
2.7227137088775635	11152
2.9321532249450684	12010
3.1415927410125732	12868
0	
```

# 成果物

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

以上。
一斗缶で簡易シールドボックスを作ってみよう

無線に関連する機材の開発を行うと、周囲の影響を避けるため、電波遮蔽した環境でテストを行いたい場合があります。
こういった場合にはシールドボックス（例: [電波暗箱/シールドボックス@MICRONIX](https://micronix-jp.com/products/shield-box/)）などの機材を利用するのですが、シールドボックスは一般に高価で素人には手が出しにくいものがあります。
要は外部から電波が入ってこなければよいわけですから、金属で覆われた箱を用意すればよいのではないか…という観点で実験をしてみた結果を共有します。

## 必要な材料

### 素材

1. 一斗缶ないし半缶 -- 天切、フタ付きという種類を購入すると良いでしょう。今回利用したもの→ https://amzn.to/3F5PrDF
1. アルミテープ -- 穴を開けた部分の遮蔽します。キッチンの隙間を防ぐための資材として売っているものが使えます。例→ https://amzn.to/3n0t0JP 
1. Ethernetポート付きのUSBハブ -- 電源・通信経路確保用に使います。今回使用したもの→ https://amzn.to/3oit0Eg

### 工具

1. ドリル -- 缶に穴を空けるのに利用します。
1. ハンドニブラ -- 穴の拡張にあると便利です。ない場合はドリルで複数の穴を開けてニッパで切断するなどの加工をしてください。今回利用したもの→ https://amzn.to/3wvL9Cr

## 工作

1. 半缶の側面に、ドリルで穴を開けます。
1. ドリルの穴をハンドニブラで拡張して、USBケーブルが通る穴を開けます。![IMG20211105115420_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423595/ddc94cd2-2b32-076d-11e6-7cda3512b27d.jpeg)
1. USBハブのケーブルを穴に通したら、穴の周りをアルミテープで覆います。![DSC_0375.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423595/ff273dab-a45f-bfec-42b4-d1504e5c11d4.jpeg)![DSC_0374.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423595/d70d922e-c1a8-27ff-2f00-7d0a70dd718a.jpeg)

## 検証方法

1. 適当なBluetoothビーコンを吐く機材を用意します（[COCOA](https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/cocoa_00138.html)インストール済みのAndroid機など）
1. USBハブを、PCにつないて、シールドボックスの中への通信路、および電源とします。
1. Raspberry PiなどをEthernetの先に接続して、親機からSSHで接続しBluetooth Low EnergyのScanを走らせてみましょう。
    2. お手軽に実施する場合は [Bleak](https://bleak.readthedocs.io/en/latest/) のサイトに記載されている [Scan](https://bleak.readthedocs.io/en/latest/scanning.html) のサンプルなどが使えます。
1. 缶の蓋を開けた状態でスキャンした場合と、缶の蓋を締めた状態でスキャンした場合の結果を比べます。

## 検証結果

1. 蓋を締めた場合は中にあるものだけがスキャンできますので、ある程度遮蔽されていると思われます。
1. 缶の中には電磁波吸収の加工を一切していないので、内部の反射波が強烈に発生している可能性が高いため、パフォーマンスの測定のような用途には向かないことをご注意ください。
Http - How to Use Http Status 202 for Async Request Reply

The 202 response should return a header with key name of "Location" and value of monitor working status URL.

Calling this monitor-working-status URL then return:

1. 200 OK when the request is still pending.

2. 201 Created when the request has been completed.
The Response in case of GET/PUT/POST should contain the Location to the requested/created/updated resource.

https://docs.microsoft.com/zh-tw/azure/architecture/patterns/async-request-reply
https://github.com/mcumcu/two-oh-two
https://stackoverflow.com/questions/5079367/use-http-status-202-for-asynchronous-operations
https://stackoverflow.com/questions/26199228/is-the-use-of-location-header-in-http-202-response-rfc-compliant?noredirect=1&lq=1
NIST Special Database 19 について

NIST Special Database 19 （以下のページ）についてのメモ。
https://www.nist.gov/srd/nist-special-database-19

ISOと言えばISO9001や14001を指すと思い込んでしまうのと同様に、NISTと言えばセキュリティ関連の用語だと思いがちですが（私だけかな）、そもそもNISTは、アメリカ国立標準技術研究所(National Institute of Standards and Technology)の略だそうです。

そしてこのページは、手書き文字のデータベースでした。
> NIST Handprinted Forms and Characters Database

手書きの文書と文字認識のためのNISTのトレーニング資料で、 **3600人** 分の手書きの帳票、そこから分離した **81万文字** の画像、それらの画像の分類、データ収集のための参照フォーム、および画像の管理と処理のためのソフトウェアユーティリティを公開しているとのことです。

以下原文
> Special Database 19 contains NIST's entire corpus of training materials for handprinted document and character recognition. It publishes Handprinted Sample Forms from 3600 writers, 810,000 character images isolated from their forms, ground truth classifications for those images, reference forms for further data collection, and software utilities for image management and handling.

2016年9月の第2版（2nd Edition – September 2016）と1995年3月の第1版（1st Edition - March 1995）がダウンロード可能のようですね。

内容については、Users' Guide へのリンクが用意されています。
Users' Guide には、hsf4は高校生が書きました、他は国勢調査局の従業員の文字ですよ、などが、記載されていますね。
また、手書き文字を収集するために使った様式や、hsf_page、by_writeなどの分類をどのように行っているか、の記載もあります。
by_merge は、大文字と小文字の区別がつきにくい文字（例えばWとw）は、同じグループにまとめましたよ、ということが書かれていたりもします。なるほどなー

とりあえず大量の数字とアルファベットの文字データが欲しい時は、ここにあるということみたいです。

参考：なお、それを基に、画像データセットを整備したのが、MNIST、EMNISTというものだそうです。

例えばatmarkitのMNISTの記事はこちら。
> MNIST：手書き数字の画像データセット
https://atmarkit.itmedia.co.jp/ait/articles/2001/22/news012.html

例えばatmarkitのEMNISTの記事はこちら。
> EMNIST：手書きアルファベット＆数字の画像データセット
https://atmarkit.itmedia.co.jp/ait/articles/2009/28/news024.html
【Python3】メッセージボックスの表示

#はじめに
VBAなどでよくあるメッセージボックスを表示するコードです。

・「tkkinter.messagebox」をインポート
(Tool Kit Interfaceのこと)

```Python3:messagebox
from tkinter import messagebox

#引数に('タイトル', '内容')を記載

ret = messagebox.askyesno('確認', '処理を開始しますか？')   #「はい」、「いいえ」を選択
if ret:    #「はい」を選択した場合はTrue
    messagebox.showinfo('メッセージ', 'はいを選択しました')    #「情報」のメッセージボックスを表示
else:    #「いいえ」を選択した場合はFalse
    messagebox.showwarning('メッセージ', 'いいえを選択しました')    #「警告」のメッセージボックス
```
#####その他のメッセージボックス

| 表示内容、確認内容 | メソッド、引数 | 戻り値 |
| :--- | :--- | :--- |
| エラー | `.showerror('タイトル', '内容')` | `None` |
| はい、いいえ | `.askquestion('タイトル', '内容')` | `'yes'`, `'no'` |
| OK、キャンセル | `.askokcancel('タイトル', '内容')` | `True`, `False` |
| 再試行、キャンセル | `.askokcancel('タイトル', '内容')` | `True`, `False` |
| はい、いいえ、キャンセル | `.askyesnocancel('タイトル', '内容')` | `True`, `False`, `None` |

>こちらのページを参考にさせて頂きました
>>[【Python】メッセージボックスを表示する](https://pg-chain.com/python-messagebox)
【GAS】V8ランタイムでハマった不具合

## はじめに
2020年2月にGoogle Apps ScriptがV8ランタイムに対応しましたが、実際に対応させてみるといくつか不具合が出ているので、備忘録としてここに書いていきます。
V8ランタイムを無効にする方法は複数のWebサイトに掲載されているので、そちらもリンクしておきます。
[Google Apps scirpt(GAS)ランタイムをV8から旧バージョンに戻す方法(無効化・ダウングレード)](https://auto-worker.com/blog/?p=713)

## ScriptApp.getService().getUrl() の不具合
デプロイのテスト環境(dev環境)でgetUrl()をしても、devのURLが出力されません。
これは既知の不具合ですが、現在も特に治っていませんでした。

## ファイルアップロードの不具合
[Google Apps Scriptでファイルアップローダを作る](https://officeforest.org/wp/2018/12/30/google-apps-script%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%80%E3%82%92%E4%BD%9C%E3%82%8B/)
↑こちらにも記載のある、「V8ランタイムを使用するとアップロードしたファイルが壊れる」という不具合は、2021年11月の段階でも治っていません。
ですので、アップローダ機能を入れたい場合はV8をオフにするしか方法はありません。

## トリガーの不具合（その１）
V8をオンにしている場合、タイマー系のトリガーが「We're sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL.」というエラーを吐いて失敗してしまうときがあります。
発生頻度は少ないですが、原因は不明です。こちらもV8ランタイムをオフにすると発生しなくなったという報告が多いので、そこに原因があると考えられます。
4月頃特に発生報告が多かったようです。[(参考)](https://issuetracker.google.com/issues/184759540)

## トリガーの不具合（その２）
V8をオンにしている場合、トリガーをセットしようとして下記のエラーが出ることがあります。
「ストレージからの読み取り中にサーバーエラーが発生しました。エラーコード: INTERNAL。」
原因は不明です。V8をオフにすると発生しなくなったという報告をいくつか見つけました。

## JDBCの不具合
Cloud SQL(MySQL)を使用してシステムを組んでいたのですが、100件ほどしか入っていない単一テーブルから単純なSELECT文を実行するだけでも妙に処理時間がかかり(10件しか取得しないようなものに10秒)、もしやと思ってV8オプションを削除したところ、高速に戻りました。

## おわりに
自分が困った不具合はいまのところ上記の3件ですが、既知の不具合に関しても治る見込みはあまりなさそうなので、現時点ではV8をオフにしてコードを書いたほうが安定するかと思います。
windowsでiverilog その109

#概要　

windowsでiverilogやってみた。
浮動小数点を整数に変換するモジュール見つけたのでテストベンチ、書いてみた。

#サンプルコード

```
module test();
	reg clk,
		rst;
	reg [31:0] a;
	wire [31:0] o1,
		o2,
		o3;
	assign o1[22:0] = a[22:0];
	assign o1[30:23] = a[30:23] + 8'd6;
	assign o1[31] = a[31];
	assign o3 = o2 + 32'd200;
	f2i #(32) u2(.clk(clk), .ce(1'b1), .i(o1), .o(o2));
	initial
	begin
		$monitor("%h %h %h", a, o2, o3);
	end
	initial
	begin
		#0
			rst = 1'b0;
		#0
			clk = 1'b0;
		#10
			rst = 1'b1;
		#40
			rst = 1'b0;
		#4	a = 32'hc0490fdb;
		#4	a = 32'hc0490fdb;
		#4	a = 32'hc03ba866;
		#4	a = 32'hc02e40f1;
		#4	a = 32'hc020d97c;
		#4	a = 32'hc0137207;
		#4	a = 32'hc0060a92;
		#4	a = 32'hbff1463a;
		#4	a = 32'hbfd67750;
		#4	a = 32'hbfbba866;
		#4	a = 32'hbfa0d97c;
		#4	a = 32'hbf860a92;
		#4	a = 32'hbf567750;
		#4	a = 32'hbf20d97c;
		#4	a = 32'hbed67750;
		#4	a = 32'hbe567750;
		#4	a = 32'ha6000000;
		#4	a = 32'h3e567750;
		#4	a = 32'h3ed67750;
		#4	a = 32'h3f20d97c;
		#4	a = 32'h3f567750;
		#4	a = 32'h3f860a92;
		#4	a = 32'h3fa0d97c;
		#4	a = 32'h3fbba866;
		#4	a = 32'h3fd67750;
		#4	a = 32'h3ff1463a;
		#4	a = 32'h40060a92;
		#4	a = 32'h40137207;
		#4	a = 32'h4020d97c;
		#4	a = 32'h402e40f1;
		#4	a = 32'h403ba866;
		#4	a = 32'h40490fdb;
		#10
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule


```

#結果

```
xxxxxxxx xxxxxxxx xxxxxxxx
c0490fdb xxxxxxxx xxxxxxxx
c0490fdb ffffff37 ffffffff
c03ba866 ffffff37 ffffffff
c03ba866 ffffff44 0000000c
c02e40f1 ffffff44 0000000c
c02e40f1 ffffff52 0000001a
c020d97c ffffff52 0000001a
c020d97c ffffff5f 00000027
c0137207 ffffff5f 00000027
c0137207 ffffff6d 00000035
c0060a92 ffffff6d 00000035
c0060a92 ffffff7a 00000042
bff1463a ffffff7a 00000042
bff1463a ffffff87 0000004f
bfd67750 ffffff87 0000004f
bfd67750 ffffff95 0000005d
bfbba866 ffffff95 0000005d
bfbba866 ffffffa2 0000006a
bfa0d97c ffffffa2 0000006a
bfa0d97c ffffffb0 00000078
bf860a92 ffffffb0 00000078
bf860a92 ffffffbd 00000085
bf567750 ffffffbd 00000085
bf567750 ffffffca 00000092
bf20d97c ffffffca 00000092
bf20d97c ffffffd8 000000a0
bed67750 ffffffd8 000000a0
bed67750 ffffffe5 000000ad
be567750 ffffffe5 000000ad
be567750 fffffff3 000000bb
a6000000 fffffff3 000000bb
a6000000 00000000 000000c8
3e567750 00000000 000000c8
3e567750 0000000d 000000d5
3ed67750 0000000d 000000d5
3ed67750 0000001b 000000e3
3f20d97c 0000001b 000000e3
3f20d97c 00000028 000000f0
3f567750 00000028 000000f0
3f567750 00000036 000000fe
3f860a92 00000036 000000fe
3f860a92 00000043 0000010b
3fa0d97c 00000043 0000010b
3fa0d97c 00000050 00000118
3fbba866 00000050 00000118
3fbba866 0000005e 00000126
3fd67750 0000005e 00000126
3fd67750 0000006b 00000133
3ff1463a 0000006b 00000133
3ff1463a 00000079 00000141
40060a92 00000079 00000141
40060a92 00000086 0000014e
40137207 00000086 0000014e
40137207 00000093 0000015b
4020d97c 00000093 0000015b
4020d97c 000000a1 00000169
402e40f1 000000a1 00000169
402e40f1 000000ae 00000176
403ba866 000000ae 00000176
403ba866 000000bc 00000184
40490fdb 000000bc 00000184
40490fdb 000000c9 00000191

```

以上。
画期的なコロナ飲み薬、重症化を89%減少させるってどのような根拠から？

増川 直裕

週末（11月5日）に、今のコロナ禍から脱却できそうな希望のニュースがありましたね。米国ファイザー社が開発中の、新型コロナウイルス感染症を治療する飲み薬の臨床試験（第2/3相試験の中間解析）で、重症化するリスクを89%減少させるという結果が報じられました。

本記事では、この飲み薬、パクスロビド（PAXLOVID）が、重症化リスクを89%減少させるとは、どのような結果を根拠に算出されたのかについてお伝えします。併せて、リスクの89％減少というのはあくまで限られた患者から得られた推定値なので、推定に対する信頼区間を算出して考察していきます。

ファイザー社のホームページに記載されているニュース（注１）によると、重症化リスクを持つ、入院していない大人の患者が対象で、ランダムにパクスロビドを投与したグループと、プラセボ（偽薬）を投与したグループに割付した結果、登録後28日以内に入院した患者の割合を比較しています。

パクスロビド投与：389人中3人が入院（死亡者なし）
プラセボ投与：385人中27人が入院（その後7名が死亡）

####■入院リスクの比較
下の図は、この結果をクロス集計表と割合を示すグラフ（シェアチャート）で示したものです。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/679d5421-4f5d-53c7-0b42-1c73fe58e51a.png)
各投与グループの入院割合を計算すると、パクスロビド投与グループは0.77%（= 3 / 389）、プラセボ投与グループは7.01%（= 27 / 385）です。2つのグループの割合を比較する一つの指標として**相対リスク**（Relative Risk）がありますが、今回の例において、”パクスロビド投与グループ” の ”プラセボ投与グループ”に対する入院に関する相対リスクは次のように計算されます。


相対リスク
=パクスロビド投与グループの入院割合 ÷ プラセボ投与グループの入院割合
=（3 / 389) ÷ （27 / 385）
=0.11 

つまり、パクスロビドを投与すると、プラセボを投与することに対する相対的なリスクは0.11（11%）に減少することを示しています。これより入院のリスクがどれぐらい減少されるかで考えると 89% （100% － 11%）という、ニュースで報道された数字となるのです。

####■相対リスクの信頼区間
前節で計算された相対リスクの値（= 0.11）は、あくまで試験で対象となった限られた患者での推定値です。そのため推定値だけでなく、その信頼区間も考えた方が良いでしょう。

下図は、今回求めた相対リスクの推定値とその95%信頼区間を算出したものです。
![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/1239daf8-a0f3-ff9c-1b1c-6d2c83c68e26.png)
これより、相対リスク（= 0.11）に対する95%信頼区間は、およそ0.03～0.36 と案外広い区間であることがわかります。そのため、ラフな言い方をすると、入院のリスクの減少は、64%～97%と幅をもって考えることになります。64%と低めに考えても、かなり効果があるなという実感ですが。

当然のことながら、サンプル数が多いほど推定に対する信ぴょう性は高くなるので、信頼区間は狭まります。仮に、今回の臨床試験の投与者数、入院者数ともに10倍多かったとします。すなわち、パクスロビド投与グループは3,890人中30人入院、プラセボ投与グループは3,850人中27人が入院となりますが、このときの相対リスクは、先ほどと同様に0.11ですが、95%信頼区間は0.08 ～ 0.16です。実際の例と比べて、信頼区間がかなり狭まっていますね。

今回の中間解析の結果は、有効性と安全性が十分に示されたということで、今後承認申請が行われるようですが、問題なく承認され、実際のコロナ患者に利用できるようになれば、患者側としても医療機関側としても大きなメリットを享受できそうですね。その頃には、コロナ前のように、公の場でマスクをしなくて済む生活が待っているのかもしれません。

＊ここで求めた相対リスクの信頼区間は、対数スケールに基づくWald信頼区間をもとに算出しています。
_参考：Alan Agresti著：An Introduction to Categorical Data Analysis (2nd Edition)_

■さあ始めよう！
JMPの全機能を30日間試せるトライアル版で、データからさらなる情報を導き出せることを実感してください。

ダウンロードは[**コチラ！**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)

■JMPについて
JMP（ジャンプ）は世界中のエンジニア、データアナリストに選ばれているインタラクティブで可視的なデータ分析ツールです。

---------------------------------------
注１：
PFIZER’S NOVEL COVID-19 ORAL ANTIVIRAL TREATMENT CANDIDATE REDUCED RISK OF HOSPITALIZATION OR DEATH BY 89% IN INTERIM ANALYSIS OF PHASE 2/3 EPIC-HR STUDY
https://www.pfizer.com/news/press-release/press-release-detail/pfizers-novel-covid-19-oral-antiviral-treatment-candidate
composer installでprivateリポジトリのソースコードを取得できなかった

ただのミスなのですが、備忘も兼ねて記事化

## 先にまとめ

- githubにSSHキーを登録してなかったことが原因
- またはhttpsのアドレスを指定すれば取得できる

## どういうエラーか

```
[RuntimeException]
  Failed to execute git clone --mirror -- 'https://ghp_XXXXXX:***@github.com/sample/sample.git' '/Users/user/.composer/cache/vcs/git-github.com-sample-sample.git/'

  Cloning into bare repository '/Users/user/.composer/cache/vcs/git-github.com-sample-sample.git'...
  remote: Repository not found.
  fatal: repository 'https://github.com/sample/sample.git/' not found
```

PHPのプロジェクトをgit cloneしてきてライブラリをダウンロードしようと`composer install`した際に発生しました。
どうやらプライベートリポジトリにソースを取得できない模様。
もっと言うなら`composer.json`に以下のようにリポジトリを書かないといけないパターンです。

```
"repositories": {
    "sample": {
        "type": "git",
        "url": "git@github.com:sample/sample.git"
    }
}
```


## 解決策①
SSHキーを生成してGithubに登録する
### 手順
#### ①キーを生成
```
$ ssh-keygen -t rsa
```

#### ②キーの内容をコピー
名前など指定しない上記のコマンドなら`~/.ssh/id_rsa.pub`をコピー

#### ③Githubに登録
以下にアクセスしてコピーしたキーを登録
https://github.com/settings/keys

#### ④動作確認
GithubにSSHしてみる
SSHできたら`composer install`も成功するはず

```
$ ssh -T git@github.com
Hi {user_name}! You've successfully authenticated, but GitHub does not provide shell access.
```

## 解決策②
`composer.json`のurlをhttpsのものに変更する。
ユーザー名とパスワード(現在だとアクセストークン)でソースを取得できます。

```
"repositories": {
    "sample": {
        "type": "git",
        "url": "https://github.com/sample/sample.git" 
    }
}
```
メール送信の制限

なかなかに面白い質問です。
自信がなかったので答えなかったですが、思った通り（あたりまえかな）


重複する電子メールアドレスの制限もカウントされます。  

したがって、1つの電子メールアドレスに1000の個別の電子メールを送信する場合、制限数は1000になります。 

また、CCおよびBCCの電子メールアドレスは電子メールアドレスの数をカウントするため、1000個の電子メールで他の6人をCCにすると、電子メールのアドレス数とともに6000がカウントに追加されます。 

to、cc、およびbccで使用される任意の数の電子メールアドレスは、重複している場合でも制限にカウントされます。 

[How is the Single Email Limit calculated](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BtNO8SAN)
アインシュタインボット 関係のまとめ


+ [誰かがボットを使用して、Salesforceの外部の別のシステムに情報が格納されている情報に正常にアクセスして提示したことがありますか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BtU2g)


現在の冬のリリースでは、ボット ビルダーから Salesforce プラットフォームの外部サービスを利用して、ボットが外部 API を直接呼び出すことができるようになりました: https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_bots_external_services.htm&language=en_US&r= https%3A%2F%2Fwww.google.com%2F&type=5

外部注文システムの API 仕様がある場合は、そこから外部サービスを簡単に作成でき、ボット ビルダーで利用できるようになります。API パラメーターでさらに前/後処理が必要な場合は、外部サービスを使用する代わりにボット ビルダーからフローまたは Apex を呼び出すこともできます。
.NET Framework と.NET Coreの２つの系列があるんですね

C#を始めたばかりの時にハマったのですが、
テスト対象のプロジェクトが.NET Framework 4.x とかで、

その単体テストのために、テスト用のプロジェクトとしてNUnitの新規プロジェクトを作成して、テストしてくれと言われました。

しかし、その時に間違って、テスト用のプロジェクトの方は.NET Core系列を選択してしまい、「あれ？なんか動かないぞ？？」と思って色々確認していたら、テスト用のプロジェクトの新規作成時に、.NET Frameworkを選択していなかったせいでした・・・ということがありました(汗)
気を付けよう・・。

**新規プロジェクト作成時に選択を間違えないように**
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/3b90d078-076b-6406-d6a0-2f4925e8e966.png)
PHP出力方法

#PHP


```php:hello.php
<?php echo "おはよう"?>
<?php echo "こんにちは"?>
<?php echo "こんばんは"?>
```

ターミナルに以下を入力しましょう！

```
~$ php hello.php
```

このように出力されました！



```:結果
おはよう　こんにちは　こんばんは
```



#配列

```php:index.php
<?php $k = Array(4,1,6);

    echo ("おにぎりを".$k[0])."個下さい"."\n";
    echo ("コーヒーを".$k[1])."杯下さい"."\n";
    echo ("ケーキを".$k[2])."個食べたい"."\n";
```
「\n」は改行の意味です！
ターミナルに以下を入力しましょう！

```
~$ php index.php
```

このように出力されました！


```:結果
おにぎりを4個下さい
コーヒーを1杯下さい
ケーキを6個食べたい
```
pip freezeして、パッケージを管理する

## 前提

この記事でわかること: python におけるパッケージの管理方法
pythonのバージョン: Python 3.10.0

## pythonでのパッケージ管理はpipを使う

`pip`コマンド でパッケージをインストール/アンインストールができます。

```
// pip でインストール
pip install <package>

// requirements.txtを指定してパッケージをインストール
pip install -r requirements.txt
```

逆に今インストールされているパッケージを`requirements.txt`に書き出すときは、`pip freeze`を使います。

```
pip freeze > requirements.txt
```


## 補足

他のプログラミング言語でのパッケージ管理と管理するファイルをまとめておきます。

|プログラミング言語  |コマンド  |ファイル  |
|---|---|---|
|Python  |pip |requirements.txt  |
|Ruby  |gem  |Gemfile  |
|PHP  |composer  |composer.jso  |

## 経緯

django + Cloud Run + Cloud Sqlでアプリを個人開発するときに、pythonにおけるパッケージの管理がわからなかったので、調べました。
普段はPHPを使うことが多く、pythonは初めてだったのでまた一つ賢くなれました。

## 参考URL

[pip: Python環境構築ガイド -python.jp](https://www.python.jp/install/ubuntu/pip.html)

[Python, pipでrequirements.txtを使ってパッケージ一括インストール | note.nkmk.me](https://note.nkmk.me/python-pip-install-requirements/)
macOS Catalina に Frida をインストールする

# はじめに
macに不慣れでハマったので備忘録として。
不要な手順があれば教えて下さい。

# 検証環境など
macOS Catalina 10.15.7（19H1419）
Python 3.9.0
frida 15.1.10
frida-tools 10.4.1
iTerm2

# 手順

## Python3をインストールする
手順は割愛

## pipを最新に

```bash
$ pip install -U pip
```

## Fridaのインストール
インストールするコマンドが下記なので叩いてみる

```bash
$ pip install frida-tools
```

### 公式HPだとコマンド1発でインストールが完了するはず、、、今回は以下のようなエラーが出た

`error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)>`

#### 下記両方試した

##### １つめ

```bash
$ pip install --upgrade certifi
```

##### 2つめ

Finderを開いて
アプリケーション>Python3.9>Install Certificates.command
をダブルクリック

## Fridaのインストール

```bash
$ pip install frida-tools
```

インストールが成功しました。

# 参考記事
https://frida.re/
https://stackoverflow.com/questions/50236117/scraping-ssl-certificate-verify-failed-error-for-http-en-wikipedia-org
plunkerでieee754

# 概要

plunkerでieee754やってみた。
dataview使わないで、浮動小数点(binary32)に変換、その逆も。

# 使用したライブラリー

https://github.com/jarvma18/js-ieee754

# サンプルコード

```
var out = document.getElementById("out");
var src = document.getElementById("src"); 
var out2 = document.getElementById("out2"); 
function run0() {
  var val = src.value;
  out.value = getPrecision(val);
}
function run1() {
  var val = out.value;
  out2.value = getDecimal(val);
}

```

# 成果物

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

以上。
SQLSERVERで特定のカラム名を含むテーブルを調べる方法

## 動機
SQLServerを使っていて
大量にあるテーブルの中から特定のカラムを含むテーブルを調べたいシーンが時々あります。

ex)データの洗い替えで別テーブルに同じ名前のカラムがないか（他に影響範囲がないか）

## やりかた
SQLServerのカタログビューを使うと簡単にできます。

この例では以下の条件を満たす一覧が取得できます。

* TenantIdもしくはtenant_idを持つテーブル
* Testが先頭につくテーブルは除く


```
select t.name, c.name
from sys.tables t
inner join sys.columns c on t.object_id = c.object_id
where (c.name like '%TenantId%' or  c.name like '%tenant_id%')
and t.name not like 'Test%'
```

##参考
https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-tables-transact-sql?view=sql-server-ver15

https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-columns-transact-sql?view=sql-server-ver15
【JavaScript】反復処理②　for...inと列挙可能性


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/bd3ef31e425b2f91db26

#目的

* 反復処理についての理解を深める

#本題
###1.for...inと列挙可能性

**列挙可能性(enumerable)とは**ディスクリプターの一種

https://qiita.com/nao0725/items/3b12a8c1822159363191

***for...inとは***

* 列挙可能プロパティに対して、順不同で反復処理を行う
* プロトタイプチェーン内も列挙対象となる
* 自分自身に設定されているプロパティのみを列挙したい場合はhasOwnPropertyメソッドを使う
* Symbolは列挙の対象にはならない

####例1

基本的なfor...inの書き方

````js
// オブジェクトを定義
const obj = {
	prop1: 'value1',
	prop2: 'value2',
	prop3: 'value3'
}

// for..inを記述
for(let key in obj){
	// このkeyの値にはprop1,prop2,prop3の値(プロパティ)が入っている
	console.log(key);
	// keyを元にobjの値を取得すると
	console.log(key, obj[key]);
	// prop1 value1...と出力される
}
````

####例2

オブジェクトのプロトタイプに対して独自のメソッドを追加した場合

```js
// オブジェクトを定義
const obj = {
	prop1: 'value1',
	prop2: 'value2',
	prop3: 'value3'
}

// オブジェクトのプロトタイプのhelloメソッドを定義
// このように書くとhelloメソッドまで出力される
Object.prototype.hello = function(){}

// 上記のhelloメソッドまで出力させないようにenumerableを追加する
// definePropertyを使う
// 第一引数はメソッドが格納されているprototype、第二引数はメソッド名、第三引数は設定値
Object.defineProperty(Object.prototype, "hello", {
	// 列挙しない設定になる(出力結果から消える)
	enumerable: false
})

// 実際にディスクリプターを確認する
const a = Object.getOwnPropertyDescriptor(Object.prototype, "hello");
// 出力結果でenumerable: falseとなっていることがわかる
console.log(a);

// 試しにprop1を列挙対象から外してみるとコンソールからprop1が消える
Object.defineProperty(obj, "prop1", {
	enumerable: false
})

for(let key in obj){
	console.log(key, obj[key]);
}
`````

####例3

例２のようなやり方ではなくhasOwnPropertyを一般的には使う

```js
// オブジェクトを定義
const obj = {
	prop1: 'value1',
	prop2: 'value2',
	prop3: 'value3'
}

Object.prototype.hello = function(){}

for(let key in obj){
	// 第一引数にkey情報を入れる
	// このkeyが反応し、自分自身(obj)のプロパティかどうか判断しif文でtrueの場合出力する
	if (obj.hasOwnProperty(key)){
		console.log(key, obj[key]);
	}
}
````

####例4

Symbolを使用した場合

````js
// 変数sにSymbolを入れる
const s = Symbol();

// オブジェクトの中にsも混ぜてあげる
const obj = {
	prop1: 'value1',
	prop2: 'value2',
	prop3: 'value3',
	// 変数をプロパティの値として使用する際は[変数]と表記する
	[s]: "value4"
}

for(let key in obj){
	// Symbolの値が出力されていない
		console.log(key, obj[key]);
}

// ディスクリプターで確認すると
const b = Object.getOwnPropertyDescriptor(obj, s);
// {value: 'value4', writable: true, enumerable: true, configurable: true}と出力され、enumerableがtrueとなっていることがわかる
console.log(b);
`````


今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
gitでブランチのバックアップを取る方法

# はじめに
gitでrebaseなどのためにforce pushを行うと、remoteの状態も上書きされるのでなにかの問題が発生した時に簡単に戻せなくなります。

それを避けるため、事前にバックアップを取るのが安全です。GitのGUIでブランチをコピーするなどの機能がありますが、コマンドラインを使っていればどうすればいいでしょうか？ここでgitのコマンドラインでバックアップを取る方法を紹介します。

# バックアップの手順

まずはバックアップしたいブランチをcheckoutし、`git branch -m`で名前を変更します。

```
% git checkout my-branch
% git branch -m my-branch_backup
```

checkoutしているブランチ以外のブランチも名前を変更できます。

```
% git branch -m [currentBranchName] [newBranchName]
```

改めてremoteの`my-branch`をcheckoutすれば、安心してrebaseなどの作業ができます。

```
% git checkout my-branch
% git rebase master
% git push-f my-branch
```

著者は `git branch -m`を習慣的に使っていますが、`git branch -c`で名前変更ではなくコピーを作ることもできます。`-c`を使うと最後にremoteからもう一度checkoutする必要はないので少し楽かもしれません。

```
% git checkout my-branch
Switched to branch 'my-branch'
% git branch -m my-branch_backup
% git branch
  master
* my-branch_backup
```

```
% git checkout my-branch
Switched to branch 'my-branch'
% git branch -c my-branch_backup
% git branch
  master
* my-branch
  my-branch_backup
```

# バックアップを復活する方法

バックアップを取ったあとの作業でremoteのブランチに問題が発生したら、ローカルで取ったバックアップで状態を戻すことができます。

名前変更でもコピーでも、バックアップのブランチは元々のブランチのupstreamもコピーしているので、pushすると以下のメッセージが出ます。

```
% git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:my-branch

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.
```

元々のブランチをバックアップの状態に戻したいので、おそらく一つ目の「push to the upstream branch
on the remote」がしたいでしょう。

```
% git push origin HEAD:my-branch
```

また、元々のブランチが使えない状態になってしまっている可能性が高いので、バックアップの手順を逆にしてバックアップブランチの名前を元に戻すこともできます。

```
% git checkout my-branch_backup
% git branch -M my-branch
% git push -f
```

`git branch`で大文字の`M`のオプションを使うと、存在するブランチを上書きできます。
上のコマンドを実行するとremoteに存在するブランチもそのブランチの状態がバックアップを取る前の状態に戻ります。

```
% git branch
  main
* my-branch
```

# まとめ
以上、gitブランチのバックアップと復活の方法でした。`git branch`のコマンドについてもっと知りたい方はdocsを見てください。

https://git-scm.com/docs/git-branch
Raspberry Pi OS 2021-10-30 Release-note 翻訳

(追記: 2022/1/28にRaspbian OS 2022-01-28がリリースされています)
https://qiita.com/utaani/items/c1fb38ad98e07855b387

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2021-10-30：

 - Debian バージョン11 (bullseye) ベースに
 - デスクトップコンポーネンツ (lxpanel とすべてのプラグイン, libfm, pcmanfm) がGTK+3向けにビルド
 - アプリケーション (piwiz, pipanel, rc_gui, lxinput) がGTK+3向けにビルド
 - PiXflat GTK+3 のテーマが更新され、そのサポートのためにたくさんの変更が追加
 - GTK+3 : ツールバーのアイコンサイズ設定が追加
 - GTK+3 : ウインドウ上にクライアントサイドのデコレーションをリクエストする機能が追加
 - GTK+3 : カスタムスタイルのフレームラベルにインデントの設定が追加
 - 2GB以上のRAMを搭載したデバイス上ではopenboxの代わりにmutterウインドウマネージャーが使われるように
 - mutter : タイトルバーアイコンの動作と外観がopenboxにマッチするように修正
 - mutter : 追加のキーボードショートカットが追加
 - mutter : さまざまなパフォーマンス強化
 - スクリーン拡大鏡にmutter互換機能が追加
 - Appearance SettingアプリにGTK+3とmutterをサポートするためのたくさんの修正が追加
 - ソフトウェアアップデートを検知してインストールするためにUpdaterプラグインがlxpanelに追加
 - ファイルマネージャーの表示オプションがリストかアイコンに単純化され、サムネイル表示用のメニューオプションが追加
 - ファイルマネージャーのツールバーアイコンが新しく
 - KMSがデフォルトのディスプレイドライバーに
 - 上記をサポートするためのHDMIオーディオ出力の更新
 - openboxがKMS下で動作しているときはxcompmgrが有効となる
 - libcameraをベースとした新しいデフォルトカメラサブシステム
 - 新しいカメラでもアプリケーション (libcamera-still and libcamera-vid) がraspistillとraspividと入れ替え
 - 古いカメラサブシステムが64-bit RPi OSから削除 (32-bit版ではまだ有効)
 - Chromiumがバージョン92.0.4515.98に更新
 - VLC media player がバージョン3.0.16に更新
 - SD card copierが動作した後のまぎらわしい取り外し警告を削除
 - BookshelfアプリケーションがCustom PC magazineに含まれるように
 - さまざまな翻訳の更新 - イタリア語, 韓国語, ポーランド語, ドイツ語, アルメニア語
 - スタートアップウィザードが必要に応じて日本語フォントをインストールするようになった
 - lxpanel プラグインの進行状況と情報ダイアログが個々のプラグインでなく共通のプラグインになった
 - lxpanelプラグイン向けのアイコンハンドリング処理コードがlxpanal共通のものになった
 - 4KバージョンのRaspberry Piの壁紙パッケージをRecomended Softwareに追加
 - Python GamesとMinecraftがRecommended Softwareから除外に - どちらもbullseyeと互換性がない
 - Bluetooth ペアリングと接続ダイアログがたくさんのデバイスとの互換性を持つように更新
 - Bluetooth デバイスが取り外し手順の高速化のために、取り外したら常に切断されるように
 - Bluetooth ペアリングダイアログがPiで使えるサービスを提供するデバイスのみが表示されるように
 - 個別のBluetooth ペアリング解除ダイアログが削除 - 個々のデバイスごとにオプション設定に
 - バグ修正 - mutter : テーマ変更時にヘッダーバーの色が更新されない
 - バグ修正 - GTK+3 : ツールチップが画面の下部に正しく表示されない
 - バグ修正 - lxpanel : スクリーン拡大鏡がインストールされてないときにキーボードショートカットで拡大鏡を有効にしたときにクラッシュ
 - バグ修正 - lxpanel : 特定のデバイスに接続する際にBluetoothプラグインがロックアップする
 - バグ修正 - lxpanel : 検出可能モードアイコンがBluetoothシステムの状態と同期しなくなる
 - バグ修正 - piwiz : タイムゾーンのリストに失われた都市があった
 - バグ修正 - piwiz : 国特有の言語パッケージがインストールされていない
 - バグ修正 - bookshelf : パケットがタイムアウトする前により長く待つように
 - バグ修正 - 国際化ダイアログでアクセント付きの文字が正しく表示されるように
 - Raspberry Pi ファームウェア e2bab29767e51c683a312df20014e3277275b8a6
 - Linux kernel 5.10.63
【Flutter】プラグイン作成時にiOSローカルのライブラリを参照する方法

# 概要
Flutterプラグイン作成時に、プラグイン側でiOS向けローカルライブラリを抱きこむ際の設定方法を整理します。
ユースケースとしては、プラグイン利用者が公開済のpodを利用するのではなく会社独自のiOSライブラリ等をプラグインを通してFlutterで利用することを想定しています。

# 環境
```shell-session
$ flutter --version
Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 18116933e7 (3 weeks ago) • 2021-10-15 10:46:35 -0700
Engine • revision d3ea636dc5
Tools • Dart 2.14.4
```

# 実施内容

① Frameworkの取り込み
　a. iOSプロジェクト直下に利用したいライブラリのframeworkをコピーアンドペースト
　　- ※frameworkは、exampleのiosプロジェクトを配置しないように注意する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1424230/eb614fb3-ec91-3b6c-92f6-44128e47c13c.png" width="200">
　b. iOSディレクトリ直下の【podspecファイル(上図の場合、plugin_test2.podspec)】を下記の通り修正
　　- 本記事は[こちら](https://github.com/flutter/flutter/issues/51601)を参考にしました。

```
  # Flutter.framework does not contain a i386 slice.
  # 【重要】以下xxxの部分は適宜変更してください
  s.preserve_paths = 'xxx.framework'
  s.xcconfig = { 'OTHER_LDFLAGS' => '-framework xxx' }
  s.vendored_frameworks = 'xxx.framework'

  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
  s.swift_version = '5.0'
  s.public_header_files = 'Classes/**/*.h'
```

② 【SKIP可】必要に応じて、Universal LinksやKeychain Sharingの設定。
③ flutter pub getを実行して、Podディレクトリを生成する
④ example/iosディレクトリへ遷移して、【pod install】を実行する。
　- ③④をコマンドとして整理すると下記のようになる
　- 既にインストール時はpod updateを実行

```shell-session
$ flutter pub get
$ cd example/ios
$ pod install
```

⑤ Classes/SwiftPlugin【あなたのプロジェクト名】Plugin.swiftでimportしてライブラリを利用する

```dart
import Flutter
import UIKit
import xxx

// 【重要】上や下のxxxの部分やプロジェクト名は適宜変更してください
public class SwiftPluginxxx: NSObject, FlutterPlugin {
  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "plugin_test2", binaryMessenger: registrar.messenger())
    let instance = SwiftPluginTest2Plugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    // 例としてライブラリのインスタンス生成し、バージョンを取得するメソッドをコールを仮に書くとしたら以下となります。
    result(xxx().getVersion())
  }
}
```

⑥ ビルド
Databricksダッシュボードのご紹介

[Introducing Databricks Dashboards \- The Databricks Blog](https://databricks.com/blog/2016/02/17/introducing-databricks-dashboards.html)の翻訳です。

:::note warn
2016年の記事です。
:::

我々のプラットフォームを拡張する新機能である「Databricksダッシュボード」(ダッシュボード)を発表できることを嬉しく思います。簡単に言えば、ダッシュボードは、Apache Sparkクラスターによってサポートされたビジュアルレポートであり、ユーザーはビジュアルを通じて情報を利用でき、パラメーターを変更することでインタラクティブにクエリーを実行することもできます。これは、Sparkによって得られた洞察を即座にユーザーが活用することができるシンプルな方法です。Databricksは、Sparkをこのように幅広く活用できるようにした最初の企業です。

# データサイエンティストからビジネスユーザーにとってのSparkのパワー

活用できる洞察を生み出すデータサイエンティスト(あるいは、データを分析する人は誰でも)は、単に正しい答えを見つけ出すこと以上のことが必要となります。彼らは、その答えを持って、即座に適切な意思決定者とコミュニケーションをする必要があります。多くの場合、これら得難い洞察を公開するプロセスにおいては、データ処理プラットフォームとサードパーティのインテグレーションが必要となり、多くの引き継ぎ、遅れ、面倒な作業を引き起こします。

ダッシュボードにおける我々のゴールは、データの前処理から洞察の公開までの、全体的なデータドリブン意思決定プロセスをスムーズにすることで、Sparkがより企業にインパクトを与えられるようにすることです。我々はすでに、テクニカルユーザーが容易にデータを処理・分析できるようにするために、[ノートブック環境](https://vimeo.com/137874931)やSparkクラスターマネージャーのような機能を提供しています。ダッシュボードが追加されることで、企業の全てのユーザーがSparkにすぐにアクセスできるようになり、Sparkによるメリットを享受できるようになります。

# ダッシュボード: 一つのノートブックで複数のビュー

ダッシュボードは、Databricksノートブックから1クリックで直接作成することができます。実際のところ、ダッシュボードはノートブックの別のビューと言えます。ユーザーは一つのノートブックから簡単に複数のダッシュボードを作成することができ、異なるオーディエンスに対して同じ結果を別の見せ方に仕立てることができます。
![](https://databricks.com/wp-content/uploads/2016/02/Databricks-Dashboard-views-screenshot.png)

ダッシュボードは、様々な可視化フォーマットでノートブックを表現できるようにカスタマイズできます。インタフェース上のシンプルなポイント&クリックの操作でルックアンドフィールをカスタマイズできます。
![](https://databricks.com/wp-content/uploads/2016/02/Databricks-dashboards-screenshot.png)

ダッシュボードを構築したら、URL経由でDatabricksプラットフォームでダッシュボードをホストすることができます。昨年リリースした[セキュリティコントロール機能](https://databricks.com/blog/2015/08/05/helping-the-democratization-of-big-data.html)によって、誰がダッシュボードを参照し、編集できるのかを正確に管理することができます。

# インタラクティブなクエリーで誰でもSparkを利用可能に

ユーザーが内部ロジックに対して異なる入力パラメーターを指定できるように、ダッシュボード上にドロップダウンメニューを簡単に追加することができます。ダッシュボードはノートブックのもう一つのビューであるので、企業の誰でもがノートブックの計算能力を管理された形で簡単に組み込むことができます。このアプローチにおいては、ユーザーはSparkの知識を必要とせず、重要なコードに間違って変更が加えられてしまうリスクを排除します。ドロップダウンメニューを設けることで、他のユーザーがシナリオ分析を効率的に行えるように、Databricksユーザーがダッシュボードを構築するという一般的なユースケースを実現できるようになります。
![](https://databricks.com/wp-content/uploads/2016/02/Scenario-analysis-in-Databricks-dashboards.png)

# ダッシュボードによる重要オペレーションのモニタリング

Databricksでは、すでに[Sparkジョブを作成するためのシンプルかつ堅牢な方法](https://databricks.com/blog/2015/04/16/the-easiest-way-to-run-spark-jobs.html)を提供しています。ダッシュボード機能に加え、Databricksジョブを用いることで、数クリックでダッシュボードを更新し続けるように設定することができます。この組み合わせにより、複雑なDevOpsやサードパーティのインテグレーションなしに、重要なオペレーションを監視できるように自身をアップデートする動的なダッシュボードを構築することが可能となります。
![](https://databricks.com/wp-content/uploads/2016/02/Real-time-Databricks-Dashboards.png)

# ダッシュボードを使ってみる

ダッシュボードはすぐに利用できます。誰でもSparkの力を活用することができ、Sparkによって得られた洞察にすぐにアクセスできるようになります。これによって、複雑なツールやプロセスを用いることなしに、迅速にビジネス上の意思決定に洞察を活用することができます。これによって、データ処理、結果の公開を単一のプラットフォームで行えるようになり、企業はリアルタイムの意思決定ができるようになります。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Equalumの同期速度を可視化してみた。。

####以前の投稿でEqualumの検証を行った際に、5個のオリジナルテーブルをCDCの起点にして、最終的に中間の自動統合データベースを含む、5個の新規データベースをExactlyOnceで安心・安全・確実に生成する・・・・という内容の1時間以内チャレンジ！！が有りましたが、今回は、その際に作成したPythonのプログレスバー型可視化でなく、即時可視化が可能なLogiCOMPOSER(旧Zoomdata)を使った「オーバーヘッドを削った版」動画が出来ましたので、取り急ぎ公開させて頂きます。

##とりあえず・・・動画から！

<iframe width="560" height="315" src="https://www.youtube.com/embed/vXtYPmGVHAQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

作業的には、前回のPythonスクリプトの中から、SQL処理の状況可視化部分だけの残し、それ以外のプログレスバー関連部分を削除した軽量版のツールを作成し、それを走らせた形での即時可視化（ライブモード）を実施します。

可視化ダッシュボードは、かなり以前に検証レポートを共有させて頂いた環境を使って、Equalumと同様のノーコードでサクッと作成しています。

##簡単な概要説明を・・・
今回は、オリジナル側のMySQL上のテーブル5個と、最終出力側のSingleStore上のテーブル状況を可視化設定します。

![スクリーンショット 2021-10-20 12.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/8612e9b3-64fc-638e-94c6-eac7f23725ae.png)


左側の5個は、今回の検証で設定した商材別の5店舗分テーブルのデータ状況を可視化しています。

円グラフ3個は、中間の統合テーブルを起点としたCDC処理により自動的に生成される目的別のテーブル状況を可視化しています。

中央と下段は、同じく統合テーブルをCDCレプリケーションしたテーブル状況を可視化しています。

LogiCOMPOSER(旧Zoomdata)の処理技術により、前回のPythonプログレスバー（この関連処理が、ある意味で「全体の速度・効率の足を引っ張っていた気が・・・（汗））可視化とは全く異なる動きで、Equalumの処理効率を的確に可視化している事が解ると思います。

因みに、真ん中のチャートは、少し複雑な処理を可視化側で入れての動作になっていますので、その他のチャートとは動作が異なり、少し遅れて処理が開始しています。

勿論、この可視化ダッシュボードも「ノーコード」で30分程度（作業の多くは、外観調整でした・・・（苦笑））の作業でした。

##まとめ
重要な事なので、再度言います・・・・（笑い）

この多段のExactlyOnceで安心・安全・確実にデータを即時同期させるストリーミング・パイプラインの作成も、その状況を即時可視化出来るダッシュボード作成も「1時間以内チャレンジ＆ノーコード」で誰でも実現させる事が可能です。

この動画は、上流側へのデータ処理が始まった直後の状況を切り出したものになります。前の動画の中心チャートが統合テーブルのレプリカ側からデータを引っ張っていましたので、この動画では最初に自動統合されているテーブルを可視化したチャートに置き換えてあります。

![EQ200.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/f54f7184-dddb-3c92-5313-02785378fa60.gif)

最初にPythonによるデータのランダム挿入処理が行われる左側5個のチャートが動き始め、間髪を入れずにそれらを統合するテーブルのチャートが可視化され、さらに即時最終的な用途別3個のチャートと、統合テーブルのレプリカの状況を可視化しているチャートが、遅滞なく更新されている事が解るかと思います。（Equalum上ではこの動画構成時に合計で9本のパイプラインが並列で処理されています）

![EQ200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/ce7981af-44d1-f38c-0e11-6b4d840ec6b4.png)


また、今回可視化に使った環境は「LogiCOMPOSER」に名称変更する前のZoomdata版を使いましたが、最新の環境では「更にライブモードの使い勝手」が向上している様ですので、格段に効率の高いノーコード環境が手に入ると思います。

国内でも環境体験プログラムを開始された代理店が有りますので、ご興味があればお声掛けください。（連絡先の紹介をさせて頂けるかと思います）