OmniAICreator/Qiita-1.07M huggingface dataset:
USBメモリにポータブルCygwinを用意する

Cygwinのポータブル版をUSBメモリに入れてみましょう
##ダウンロード
まずは、Portable Cygwin のインストーラーをダウンロードします。
https://github.com/vegardit/cygwin-portable-installer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/10249c84-be05-6619-b2c1-5e41cddfb0ba.png)
必要なのは___cygwin-portable-installer.cmd___です。
##インストール
コマンドプロンプトを起動します
cmdと検索することでコマンドプロンプトが起動します。
![スクリーンショット 2021-05-28 142311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3f469403-f8d5-3f75-280a-9d35064c973b.png)
Cygwinのポータブル版を保存するフォルダにcygwin-portable-installer.cmdを保存し、実行します。
Cygwinのポータブル版が自動でダウンロードし、インストールされます。
![スクリーンショット 2021-05-28 142331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/29948848-36a6-be8e-18c6-d6ff55569829.png)
![スクリーンショット 2021-05-28 142402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/438891c1-98e4-8ccb-532a-0b2ff3c904ea.png)
![スクリーンショット 2021-05-28 144238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cd026133-44de-e0d3-6ff8-901ef33a8474.png)
##Cygwinを起動する
___cygwin-portable.cmd___を実行することでCygwin　Portableが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3a424981-9390-8cb2-bdf5-91d0e2d8ae9a.png)
![スクリーンショット 2021-05-28 144316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/32b1516d-89b1-0a33-4d94-5be1e395b59c.png)
PowerShellで複数のCSVファイルを結合する

複数のCSVファイルがドライブのあちこちにあって、これを1個のファイルにするためのPowerShellスクリプトを作ってみたいと思います。

#対象となるCSVファイル名の取り出し

カレントディレクトリ・子・孫フォルダに入っているcsvファイルを調べてフルパスを出力します。

```:フォルダ構造
├─果物
│      東京店.csv
└─文房具
       大阪店.csv
```
```powershell:
$files = (Get-ChildItem *.csv -Recurse).FullName
```
```:$files
C:\Users\test\文房具\大阪店.csv
C:\Users\test\果物\東京店.csv
```

#対象となるファイルの結合

各ファイルからCSV形式のデータをインポートします。カレントディレクトリも検索の対象となっているので、結果は1個上のフォルダに出力することにします。

```:東京店.csv
"番号","品名","値段"
"0001","りんご","100"
"0002","みかん","80"
```
```:大阪店.csv
"番号","品名","値段"
"0011","えんぴつ","50"
"0012","ノート","200"
```
```powershell:
Import-Csv $files -Encoding UTF8 | Export-Csv ..\結果.csv -Encoding UTF8
```
```:結果.csv
#TYPE System.Management.Automation.PSCustomObject
"番号","品名","値段"
"0011","えんぴつ","50"
"0012","ノート","200"
"0001","りんご","100"
"0002","みかん","80"
```

#CSVファイルの選別

フォルダ内の全CSVファイルが取り出したいファイルとは限りません。

```:フォルダ構造
├─店舗
│      支店.csv
├─果物
│      東京店.csv
└─文房具
       大阪店.csv
```
```:支店.csv
"番号","店名","英語"
"001","東京店","TOKYO"
"002","大阪店","OSAKA"
```

上のような状況で、先のスクリプトを動かすと、下のようなCSVファイルが出力されます。

```:失敗例
"番号","店名","英語"
"001","東京店","TOKYO"
"002","大阪店","OSAKA"
"0011",,
"0012",,
"0001",,
"0002",,
```

このため、出力したい項目が書かれたファイル`基準.csv`の1行目と、先の対象ファイルの1行目が同じであるか確認するスクリプトを作ります。この`基準.csv`も1個上のフォルダに置くことにします。

```:基準.csv
"番号","品名","値段"
```
```powershell:
$header = (Get-Content ..\基準.csv -Encoding UTF8)[0]
$files = foreach($tmp in $files) { if ($header -eq (Get-Content $tmp -Encoding UTF8)[0]) { $tmp;Write-Host "OK : $tmp" } else { Write-Host "NG : $tmp"} }
```
```:画面出力
NG : C:\Users\test\店舗\支店.csv
OK : C:\Users\test\果物\東京店.csv
OK : C:\Users\test\文房具\大阪店.csv
```
```:$files
C:\Users\test\果物\東京店.csv
C:\Users\test\文房具\大阪店.csv
```

#まとめる

上のスクリプトをまとめると、下のようになります。

```powershell:
$files = (Get-ChildItem *.csv -Recurse).FullName
$header = (Get-Content ..\基準.csv -Encoding UTF8)[0]
$files = foreach($tmp in $files) { if ($header -eq (Get-Content $tmp -Encoding UTF8)[0]) { $tmp;Write-Host "OK : $tmp" } else { Write-Host "NG : $tmp"} }
Import-Csv $files -Encoding UTF8 | Export-Csv ..\結果.csv -Encoding UTF8
```

#おわりに

PowerShellが扱うことができるデータには制限があるそうです。あまり大きなデータだと切れてしまうので注意してください。
まだ始めたばかりなので、もっとPowerShellっぽい良い書き方があると思いますが、それは今度勉強します。
ARFCNと4G/LTEのバンド・周波数の関係

# 事の経緯
Androidでは、現在使用しているBandを直接取得することが出来ない端末が多いですが、一方ほとんどの端末でARFCNを取得することができます。
これに気付くのにかなり時間がかかりましたが、具体的に計算方法を記載している日本語のサイトが見当たらなかったのでシェア

# ARFCNとは
Absolute radio-frequency channel number（絶対無線周波数チャネル番号）の略。
周波数帯と、具体的な周波数をチャンネル番号で示した物です。
3G（UTMS）では`UARFCN`、LTEでは`EARFCN`、5G NRでは`NR-ARFCN`と呼びます。
今回は`EARFCN`に注目してみていきます。

5Gの記事→[NR-ARFCNと5G NRの周波数の関係 - Qiita](./8b6f225edc08056afc88)

# EARFCNからBand・周波数を計算する
EARFCNは、楽天モバイルのBand3 20MHz幅の場合は、`1500`
パートナー回線のBand18 10MHz幅の場合は、`5900`となります。

Band3のダウンリンク周波数のEARFCNの範囲は`1200-1949`となっています。
`1500`はこの範囲の中に含まれますので、確かにBand3であると分かります。

この範囲の中でEARFCNの値が1増えると、0.1MHz（100kHz）増加することを表しています。
`1500`は、`(1500-1200)×0.1=30`で、Band3のダウンリンク周波数幅のうち、最も低い周波数よりも30MHz高い事を示しています。
Band3のダウンリンク周波数の下限は`1805MHz`ですので、
楽天モバイルの使用するダウンリンク周波数はそれより30MHz高い、`1835MHz`である事が分かります。
![EARFCN Band3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528530/f22c873d-2268-aebd-df69-cc1620019fd6.png)


パートナー回線も同様にして計算し、`865MHz`であると分かります。

1. 取得したEARFCNを、[EARFCNのリスト](#earfcnのリスト)と照らし合わせて、範囲内にあるBandを発見する。
1. 下記の計算式で具体的な周波数を特定する

```
[周波数（MHz）]＝([取得したEARFCN]-[同BandのEARFCNの下限])×0.1+[同Bandの周波数の下限(MHz)]
```

※アップリンクのEARFCNはAndroidで取得出来ない場合もあるので、その場合でもダウンリンクとアップリンクは通常対になっているため、ダウンリンクのEARFCNをそのまま使用し、[同Bandの周波数の下限(MHz)]はアップリンクの周波数に置き換えて計算するとよい。

# EARFCNのリスト
日本でLTEで使われているもののみを抽出（それ以外は[参考](#参考)を見てください）

| Band | キャリア  | DL下限（MHz） | EARFCNの範囲 | UL下限（MHz） | EARFCNの範囲 |
|:----:|:---------:|:-----------:|:-----------:|:----------:|:-----------:|
| 1    | d a S     | 2110        | 0-599       | 1920       | 18000-18599 |
| 3    | d a S R   | 1805        | 1200-1949   | 1710       | 19200-19949 |
| 8    | S MCA     |  925        | 3450-3799   | 880        | 21450-21799 |
| 11   | a S       |  1475.9     | 4750-4949   | 1427.9     | 22750-22949 |
| 18   | a R(p)    |  860        | 5850-5999   | 815        | 23850-23999 |
| 19   | d         |  875        | 6000-6149   | 830        | 24000-24149 |
| 21   | d         |  1495.9     | 6450-6599   | 1447.9     | 24450-24599 |
| 26   | d a R(p)  |  859        | 8690-9039   | 814        | 26690-27039 |
| 28   | d a S R   |  758        | 9210-9659   | 703        | 27210-27659 |
| 41   | a(U) S(W) BWA |  2496   | 39650-41589 | 2496       | 39650-41589 |
| 42   | d a S     |  3400       | 41590-43589 | 3400       | 41590-43589 |

※Band41・42はTD-LTEのため、上下共に同一周波数を使用。
d:docomo a:au(KDDI/沖縄セルラー電話) S:SoftBank R:楽天モバイル R(p):楽天モバイルパートナー回線 a(U):UQ Communications(auで使用可能) S(W):Wireless City Planning(SoftBankで使用可能)
MCA:高度化MCA BWA:地域広帯域移動無線アクセス（地域BWA）システム
Band26はdocomo・auともMFBI運用（800MHz帯のサブBand）



# 参考
[Absolute radio-frequency channel number - Wikipedia(EN)](https://en.wikipedia.org/wiki/Absolute_radio-frequency_channel_number)
[LTE Carrier Frequency and EARFCN - CableFree](https://www.cablefree.net/wirelesstechnology/4glte/lte-carrier-frequency-earfcn/)
目次: Teamsプラットフォームのご紹介

みなさま、こんにちは！日本マイクロソフトでカスタマーサクセスマネージャーをしている澤本と申します。我々は、Microsoft 365を中心とした**モダンワーク[オフィスワーカー]**領域におけるお客様のTeams利活用推進のお手伝いをしております。今回から10回の連載で、同じカスタマーサクセスの仲間達と共に多くのお客様先で浸透し始めました**『Teamsの更なる活用： Teamsプラットフォーム化』** についてご紹介して行きたいと思います。

### [第 1 回 モダンワークのDXとは？] (https://qiita.com/Masa_Sawamoto/items/dde15b926483bf135f02)

オフィスワーカーを中心に拡がりを続けるMicrosoft Teams。Teamsを活用したオフィスワーカーDXの市場状況と現在のDXをステージ分けして解説します。

### [第 2 回 Teamsプラットフォームと業務のアプリ化] (https://qiita.com/Masa_Sawamoto/items/5ea350fc8b934138cf2a)

Teamsをプラットフォーム化することで実現できる業務のアプリ化(DX化)について、どのようなアプリのカテゴリやアプローチがあるかをご紹介します。

### [第 3 回 Teamsの特徴的なインターフェース] (https://qiita.com/Ken_Okihara/items/465b21f1cdc5074d9618)

Teamsを活用していく上で重要な、Teamsの特徴的なユーザーインターフェースについて解説します。どういう場合にどのUIを利用すべきか例を使ってご紹介します。

### [第 4 回 Teamsサードパーティアプリの可能性](https://qiita.com/Takeshi_Nakamura/items/222428b446bab15fa741)

Teams上で利用可能なサードパーティを使うメリットや連携した利用例をご紹介します。これからデジタル化の中で期待される電子サインやオンライン名刺交換、従業員エンゲージメントを盛り上げる社内通貨アプリなどの例をご紹介します。

### [第 5 回 Teamsアプリテンプレート] (https://qiita.com/Nagaaki_Iwata/items/49536e2965fa2cebb2bd)

企業全体に展開し易いTeamsアプリテンプレートをご紹介します。その名の通り、アプリをテンプレート化したもので、Azure上で動作し、無料でお使い頂けます。テンプレートなのでお客さまご自身がカスタマイズしてお使いいただくこともできます。これから本格化する業務のデジタル化の中で期待される従業員エンゲージメントを補う「アイスブレイク」や全社通達が可能な「Company Communicator」、よくある質問をチャットウィンドウ上で呼び出せる「Quick Response」などもご紹介していきます。

### [第 6 回 Power Platformとは？ローコード・ノーコードの意味するところ](https://qiita.com/Tetsuo_Takahashi/items/8ddad74d7a25c4926a1b)

現場業務のデジタル化に欠かせないPowerPlatformで実現される世界観についてご紹介します。ローコード・ノーコードやアプリ開発の民主化などの特徴から、この最先端テクノロジーの適応すべき領域を親和性など含め解説します。

### [第 **7** 回 **Power Platform** アンバサダー] (https://qiita.com/Masa_Sawamoto/items/f60164d498eeba3a6da8)

利活用を推進する際に現場側で推進を協力してくれる人をアンバサダー(チャンプと称することもあります)を設定するケースがあります。どんな方がアンバサダーに適任か？現場のアンバサダーと本部側との構成などフィードバック環境についてご紹介します。

### [第 8 回 Power Platform ガバナンス] (https://qiita.com/Masa_Sawamoto/items/d432b67d53e2b8440686)

企業がPowerPlatformを活用していくには、ユーザー教育から始まり、アプリのセキュリティやライフサイクル、コンポーネントの標準化など、様々な分野を検討する必要があります。デジタル化を浸透させるために必要な継続できるデジタル化のための組織構成を解説します。

### [第 9 回 Power Automate と Teams の素敵な関係] (https://qiita.com/Takayuki_Kumada/items/6da8479599d34601cb27)

個人の生産性を最大化できるPower Automateで出来ることを解説します。トリガーとアクションの組み合わせで実現できるサンプルなどもご紹介してますので、是非チャレンジしてみてください。

### [第 10 回 Teamsが支えるアプリ活用基盤]  (https://qiita.com/Ikuko_Yoneda/items/3830ac74c38c1ededac2)

Teams上でアプリを活用するために必要なアプリの管理機能についてご紹介します。管理者画面でコントロール可能な、アプリの利用許可、ユーザーのアクセスポリシー、画面上のアプリの配置が可能な設定などについて解説します。

 (本記事は2021年5月時点の情報に基づきます）
第 2 回 Teams プラットホームと業務のアプリ化

 みなさま、こんにちは！日本マイクロソフトでカスタマーサクセスマネージャーをしております澤本です。今回は、業務を効率を最大化するTeamsプラットフォームについて、業務のアプリ化とは何か？どんな業務アプリのカテゴリがあるか？などをご紹介したいと思います。

突然ですが、皆さんモバイルオーダーってご利用されたことありますか？ 私たちの日常生活の一部では、既に結構DX化が進んでいるケースもあり、そのひとつが飲食店の業界です。

デジタルを活用することで、単なるデリバリーだけでなく、来店前にメニューを見て、注文から決済までをすべてオンラインで先に済まことが可能になります。これにより、待ち時間なしに注文した商品をピックアップできる仕組みが飲食店の世界では実現されています。


![2.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/6bf9a2ef-3631-66b8-2cfb-a3acc638f085.jpeg)


これの注目すべきところは、このプロセスのほぼすべてが、デジタル上で完結する仕組みになっているところです。すごくないですか！？

このポイントとなるのが、このビジネス自体がアプリ化されていることです。注文から精算まで完結され、後は商品をピックアップに行くだけ！ 飲食店の業界では、このようにビジネス・プロセスをアプリ化させることで業務を効率化・簡素化し、顧客満足度を向上させる仕組みが浸透して来ており、ビジネスの領域においても同様に採り入れない理由はありません。

では、ここからTeamsのお話をしていきます。Teams はコミュニケーションやコラボレーションの中心、ハブのアプリとしてマイクロソフトでは位置づけています。 コミュニケーションプラットフォームとして、チャットや会議の利用から始まり、コラボレーション利用として、ファイル共有や共同作業の場といった活用もされていると思います。

![2.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/3e426b43-0c35-c3cb-2a22-69c1f16f7cd3.jpeg)

さらに一歩進めた活用としてOfficeアプリやサービスだけでなく、皆さまの業務プロセスもTeamsに統合して、ご活用いただけるように設計されています。これが「Teams プラットホーム」の基本的な考え方です。

![2.3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/8e3f774a-ad09-8f09-2c8b-c2533348dfde.jpeg)

> **Teamsの活用成熟度は、一般的に４つの段階で表現されます**
> 1. 最初は、基本機能として、チャットやミーティング、ファイル共有などから始まり
> 2. 次にタブ連携をして、OneNoteやPowerPoint、Excelなど関連アプリをタブに追加します
> 3. 更に業務と組み合わせ、 PowerAutomateなどを用いて他のアプリやシステムとの連携を行います。この辺りから段々スマートになってきますね！
> 4. 最終段階では、特定の業務をアプリ化し、Teamsから活用することで、各現場の業務をTeamsに集約し業務を更にアプリ化することが可能になってきます。

では、**『業務をアプリ化する』**とは、いったいどんなアプリを指すのでしょうか？
アプリも色々ありますが、どのように業務アプリがカテゴライズされるのか見てみましょう！

![2.4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/b5560c31-474a-be7b-c208-4b2ee4c0071f.jpeg)

業務アプリとは、汎用性の高いものから、部門内の業務向けまで、およそ3種類に分けて考えることができます。

#### 汎用性が高いアプリ：
マイクロソフト製もあれば、サードパーティなどもあります。身近なところでは、WordやExcelの様なオフィス用途アプリから、サードパーティでは、例えばプロジェクト管理や開発管理系アプリもあれば、電子署名、オンライン名刺交換など、変わったところでは、社員同士のエンゲージメントを高める社内通貨アプリなども登場しています。

#### 組織全体向けアプリ：

こちらは、全社規模でも利用可能なアプリのカテゴリです。 拡張性に優れ、規模を分けて部門や部署などの単位で展開が出来る様なTeams専用のオープンソースのアプリテンプレテートになります。 既に40種以上が提供されており、Teams上で『全社員向けにメッセージの一斉配信が出来るツール』や、『自社(自部門)専用のFAQボット』や、『社員同士のエンゲージメントを高めるアイスブレイクアプリ』など。 企業内の文化や業務オペレーションに対応できるアプリを提供しています。

#### 部門業務向けアプリ：

各現場の業務には、特殊な手順であったり、経験値が必要とする業務があります。こういった業務もデジタル化、アプリ化をして生産性や時代に合った仕事の進め方に最適化することが重要です。これには、現場をリードする従業員(アンバサダーやチャンプと称することもあります)や市民開発者の手を借りて、例えばPower PlatformのAI Builderなどテクノロジーを最大限に活用することで、写真から現場の状況を瞬時に解析させて、次のアクションへ繋がせることで業務の再構築や最適化の実現が可能になります。

さて、次回は、Teamsが「ハブ」と言われる理由である、Teamsのユーザーインターフェースについて解説したいと思います。

(本記事は2021年5月時点の情報に基づきます）

**[-- 目次に戻る --](https://qiita.com/Masa_Sawamoto/items/72cc8679a9b2ea812d70)**
第 1 回 モダンワークのDXとは？

みなさま、こんにちは！日本マイクロソフトでカスタマーサクセスマネージャーをしている澤本と申します。我々は、Microsoft 365を中心とした **モダンワーク[オフィスワーカー]領域** におけるお客様のTeams利活用推進のお手伝いをしております。今回から10回の連載で、同じカスタマーサクセスの仲間達と共に**『Teamsの更なる活用』**についてご紹介して行きたいと考えております。

早速ですがこのコロナ渦において、皆様の職場環境に変化が訪れていると思います。
こちらは昨年の8月の発表だったのですが・・・

> • [リコー様：2020年10月からテレワークを恒久化、本社の出社率を３割に抑える](https://www.jiji.com/jc/article?k=2020081900958&g=eco)
> • [日立製作所様：2021年４月から在宅勤務を標準とする](https://www.jiji.com/jc/article?k=2020081900958&g=eco)
> • [東芝様：製造現場を対象に週休3日制を導入し、出社の頻度を減らして感染拡大を防ぐ](https://www.nikkei.com/article/DGKKZO58776260U0A500C2NN1000/)

この様に日本においても多くの企業様で**『ニューノーマルに向けた効率的で新しい業務』**が徐々に浸透してきております。このニューノーマルと言われる新しい生活環境で、私達は如何にビジネスで成果を出していけば良いのでしょうか？

こちらにその鍵となる動きをまとめてみました。

![1.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/125ed68b-8190-722c-974a-ce1be1c39ef1.jpeg)


まず、オフィスワーカーですが、テレワークを基本とし、場所にとらわれず、どこからでも業務ができることが望まれています。これを実現するために課題として、印刷やハンコなどを無くすペーパレス化の実現や固定電話、タイムカード、行き先掲示板などの事務機器をデジタルに置き換える必要が出てきます。

そして現場で業務されるフロントラインワーカー方にも、感染リスクを減らすこと、また迅速なオペレーション行うため、オフィスワーカーと同様にペーパレス化を中心とした業務のデジタル化が重要課題になっています。現場と本部をすべてデジタルでつなぐことにより、より多くの情報を共有/展開することが実現できますので、将来のトレンド分析や業務改善へ繋げることが実現できるようになります。

![1.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/03418e15-0fa2-6326-f916-9428f762b85c.jpeg)

オフィスワーカーにおけるDXは、大体この様な3つのステージで説明できます。

#### ステージ１：デジタルへ移行

オフィスワーカーのDXを推進する最初の一歩は、『人とデジタルの親和性を良くする』ことです。 これにはチェンジマネジメントと呼ばれる従業員の意識改革であったり、これまで物理的な事務機器に頼っていた業務プロセスをデジタル化することが重要となります。そして、ユーザーがデジタルに対応できるようになるとステージ２へ移行します。

#### ステージ２：デジタル内での統合 

ステージ２では、デジタル内でのアプリの連携や統合を指しています。それぞれの業務に則したイノベイティブで効率の良いアプローチを模索し、融合させていくステージとなります。

#### ステージ3：データの利活用

ステージ３のデータの利活用では、更にAIによるデータの分析やIoTをはじめとする別のシステムとの統合により、効率化や新しい気づきを得て、新たなる価値創造 へと繋げてゆきます。

現在、Teamsを活用の多くのお客様はこのステージ2にいらっしゃいます。今後 Teams上でアプリの連携や統合により、業務の更なる効率化が必要となってくると考えております。こちらのブログ記事では、このように**『Teams活用して如何に業務をデジタル化するか』**を様々な視点から解説して行きたいと思います。

(本記事は2021年5月時点の情報に基づきます）

**[-- 目次に戻る --](https://qiita.com/Masa_Sawamoto/items/72cc8679a9b2ea812d70)**
3分で読める最新脆弱性～VMware vCenter Server～

#はじめに
VMware vCenter Server上で動作する脆弱性について紹介する記事です。
詳細は記事内のリンクをご参照ください。

#目次
1．概要
2．原理
3．攻撃例
4．対策

#概要
VMware vCenter Serverに対して、リモートアクセスで無制限の特権を持つコマンドの実行が可能。

公開日：2020/05/25
影響範囲：VMware vCenter Server/VMware Cloud Foundation
リスク指標([VULDB](https://vuldb.com))(2021/5/28現在) 
　　CVSS：7.3
　　CWE：[CWE-287](https://vuldb.com/?vulnerability_cwe.175850)(Improper Authentication)
脆弱性情報
　　CVE：[CVE-2021-21985](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-21985)
　　VULDB：[VDB-175850](https://vuldb.com/?id.175850)
　　vmware：[VMSA-2021-0010](https://www.vmware.com/security/advisories/VMSA-2021-0010.html)

#原理
VMware vCenter Serverでデフォルトで有効になっているVirtual SAN Health check プラグインの認証が欠如しており、ポート443へのネットワークアクセスを持つ悪意のあるアクターは、リモートでコードが実行することが可能。



#攻撃例
不明

#対策
解決策
　　早急な修正パッチの適用(vmware.comで配布中)

回避策
　　VMwareプラグインの無効化([vmware.com](https://kb.vmware.com/s/article/83829))
　



#あとがき





間違い・情報のupdateがあれば、コメントしてくれるとありがたいですm(_ _)m
<br><br>
ESP32をWifi中継機にする

# はじめに
ESP32をWi-Fiのリレーができれば低消費電力かつ小型のWifi中継機になるのではないか？ということで調べたところ，作れてしまったので記事とします．

イメージとしてはこのような感じです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/1e374f5b-88db-08a2-e2be-e1b279305af7.png)


※構築環境についてはWindowsではなくMacとなりますので予めご注意ください．

# 目次
1. ESP32の初期化
1. GitHubからダウンロード
1. ファームウェアのインストール
1. Wifi各種設定

## 1. ESP32の初期化
### esptoolのインストール
まずはesptoolをインストールする必要がありますので，下記コマンドを実行する．

```sh
$ pip install esptool
```

### ESP32の初期化
下記コマンドを実行する

```sh
$ esptool.py --port /dev/tty.usbserial-0001 erase_flash
```

なお私の場合portが **/dev/tty.usbserial-0001**であったが，人によりここは違うため, /dev/tty.まで打ってタブキーを押して候補を確認してから実行する

エラーが出力されなければ初期化成功です

## 2. GitHubからのダウンロード
https://github.com/martin-ger/esp32_nat_router

今回はこちらのGitHubに上がっているプログラムを利用します．

任意のディレクトリ配下で下記コマンドを実行．
※予めgitのインストールをお願いします．

```sh
$ git clone https://github.com/martin-ger/esp32_nat_router.git
```

## 3. ファームウェアのインストール

ダウンロードしたファームウェアをESP32へインストールします．

まず予めカレントディレクトリをesp32_nat_routerとしておきます．

```sh
$ [ダウンロードした場所のパス]/cd esp32_nat_router
```

そして下記コマンドを実行します．

```sh
esptool.py --chip esp32 --port /dev/tty.usbserial-0001 \
--baud 115200 --before default_reset --after hard_reset write_flash \
-z --flash_mode dio --flash_freq 40m --flash_size detect \
0x1000 build/bootloader/bootloader.bin \
0x10000 build/esp32_nat_router.bin \
0x8000 build/partitions_example.bin
```

エラーがでなければインストール完了です．

## 4. Wifi各種設定

ファームウェアのインストールが終了すると，接続できるWifiに**ESP32_NAT_Router**が表示されているはずですので，接続します．

![スクリーンショット 2021-05-28 13.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/841c1258-0ed8-fae7-d455-9cf54a720d64.png)


そして任意のWebブラウザーを開き**http://192.168.4.1/**とURLを入力します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/c65f5ee7-bddd-df84-844a-90e62261ecbc.png)

上の図のような画面となればOKです．

まずここでやることは**STA Settings (uplink WiFi network)**の設定です．
ここに入力するのは親機のWi-FiのSSIDとパスワードとなります．

![スクリーンショット 2021-05-28 14.04.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/c72ef7e3-f804-fea1-cfa8-018dc8598c22.png)

情報を入力し，**Connect**を押下します．自動的に再起動するので，再起動し終わり再度Wi-Fiとして接続できるようになったら同様に**http://192.168.4.1**へ接続します．

最後に中継機となるAPのSSIDとパスワードを設定するため，**AP Settings (the new network)**の設定をします．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/548f01c9-be80-2545-05c3-b982d6f389f8.png)

この画像のように任意のものを入力して**Set**を押下します．

再起動が終わったらSSIDとパスワードが設定されたものとしてWi-Fiに繋げるようになっていますので接続します．

その後，好きなサイトやYouTubeなどを開いて無事接続されていれば全ての設定が完了です．お疲れ様でした．


# おわりに

![DSC_0265.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/b9d820b4-0d26-bfe8-1b4f-084ad0fc5466.jpeg)

こんな小さい機器でもちゃんと機能するのがすごいなって感じます

ただ機器のリソースが非常に弱いため通信速度はあまりでないようですね💦

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/39cf7bff-386c-c84f-b679-075988637096.png)


今後は消費電力がどのように変化していくか調べてみたいと思います
kintoneでテンプレートのExcelに書き込んでダウンロードする

~~今回はなんだかんだ言ってExcelのテンプレート（雛形）も使うんだよ
というお仕事に役立つカスタマイズ・・・かも知れません。~~
※書式が消えてしまうということが分かりました💦

予め作っておいたExcelファイルにkintoneのフィールドの値を書き込んでダウンロードするアプリです。

# アプリの準備
アプリはファイル置き場のアプリと、Excelに書き込むアプリ2種類作成します。

## ファイル置き場アプリ

このアプリは、フィールドを準備するだけです。特にカスタマイズはしません。

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| 添付ファイル  | 添付ファイル  |   |
| 文字列(1行)  | 説明  |   |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/531f96b0-d98f-7018-0eaa-bd62dac24048.png)

テンプレートとなるExcelファイルを保存しておきましょう。ファイル名はなんでもOKです。
今回は、A1セルになにか入力したらC2セルに「僕の名前は[A1の値]です」となるようなExcelファイルを作りました。
※A1になにか値を入力している状態で保存しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/6b1e37a4-5d33-5293-9a3d-12970f2c5391.png)


## Excelに書き込むアプリ

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| スペース| spBtn  |   |
| 文字列(1行)  |  名前 |   |
| 文字列(1行)  | 出力ファイル名  |   |
| ルックアップ  | テンプレート  | ファイル置き場からレコード番号取得  |
| 文字列(1行)  | テンプレートの説明  |（ルックアップで説明フィールドを取得）   |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d406d4ac-5eb0-25dc-f885-e5038d4429e9.png)

ルックアップの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/bd1bbd3a-2b7b-baa2-d4f1-a2b2588db3fc.png)

# JavaScript
Excelに書き込むアプリの方のカスタマイズをします。

こちらのライブラリを使用します。

https://github.com/sheetjs/sheetjs

ファイルダウンロードしつつ、sheetjsで書き換えたいセルを書き換えます。
↓ファイルダウンロードはこちらを参考に。

https://developer.cybozu.io/hc/ja/articles/200814380-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E5%BF%85%E9%A0%88%E3%81%A8%E3%81%AA%E3%82%8B2%E3%81%A4%E3%81%AE%E6%89%8B%E9%A0%86


詳細、編集画面などお好きなイベントで使ってください。

```js
// スペースフィールドにボタン設置
const sp = kintone.app.record.getSpaceElement("spBtn");
const btn = document.createElement("button");
btn.textContent = "ボタン";
sp.appendChild(btn);

// ボタンクリック
btn.addEventListener("click", async () => {
  const fileKey = await kintone.api(
    kintone.api.url("/k/v1/record.json", true),
    "GET",
    {
      app: kintone.app.getLookupTargetAppId("テンプレート"),
      id: event.record.テンプレート.value,
    }
  );
  const url =
    "https://{サブドメイン名}.cybozu.com/k/v1/file.json?fileKey=" +
    fileKey.record.添付ファイル.value[0].fileKey;

  // ファイルダウンロード 
  const req = new XMLHttpRequest();
  req.open("GET", url);
  req.setRequestHeader("X-Requested-With", "XMLHttpRequest");

  // SheetJS の公式ドキュメントのBrowser download fileを参考に
  req.responseType = "arraybuffer";
  req.onload = (e) => {
    const data = new Uint8Array(req.response);
    const workbook = XLSX.read(data, { type: "array" });
    // Excelのセルを書き換える(
    workbook.Sheets[workbook.SheetNames[0]].A1 = {
      v: kintone.app.record.get().record.名前.value,
    };
    XLSX.writeFile(workbook, event.record.出力ファイル名.value);
  };

  req.send();
});

return event;
```

# 動作確認＆まとめ
こんな感じになります！
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/f4f93b28-16c5-7eaf-f611-6bc2fa30dfec.gif)

今回の場合、A1のセルに決め打ちで入力しているので、柔軟にやりたい場合は書き込み先のセルの指定など色々と工夫する必要がありそうです。
[AWS_29]障害時はSORRYページへ通信を流す

##環境
**Amazon Web Service**

* EC2(Amazon Linux 2 , t2.micro , 汎用SSD 8GB)
* RDS(MySQL , db.t2.micro)
* ALB

**ローカルPC**

* MacBook Pro(2.9 GHz デュアルコアIntel Core i5 , 8 GB 2133 MHz LPDDR3)
* macOS 11.3.1（20E241）


##概要
EC2等が何らかの障害によりWebページを表示できない時に備えて、sorryページへ通信を流せるようにする。
具体的にはフェイルオーバールーティングにて、プライマリをALBを設定して、セカンダリをS3バケットに設定する。
![構成図12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/99ae2dc8-14e0-f1d7-1a4a-7ffa152d25de.png)


###S3のバケットを作成

1. `S3　＞　バケットを作成`
1. 以下の項目を入力していく。
    * バケット名: (独自ドメイン名)<br>ドメインとバケット名は揃える必要がある。Route53のレコード作成時に必要な条件となる。
    * AWS リージョン: `ap-northeast-1`
    * パブリックアクセスのブロックをすべてオフにする。
    * `バケットを作成`をクリックする。

###Sorryページファイルのアップロード
1. アップロードするためのページを開く。<br>`Amazon S3　＞　(独自ドメイン)　＞　オブジェクトタブ　＞　アップロード`をクリックする。
1. sorryページ用のhtmlファイルをアップロードする。
<br>`ファイルを追加　＞　(任意のhtmlファイルや画像)を選択 ＞　アップロード`をクリックする。

###静的ウェブサイトホスティングを編集する
1. 静的ウェブサイトホスティング編集ページを開く。
<br>`Amazon S3　＞　(独自ドメイン)　＞　プロパティタブ　＞　静的ウェブサイトホスティング　＞　編集`をクリックする。
1. 以下の項目を入力してく。
    * 静的ウェブサイトホスティング: `有効にする`
    * インデックスドキュメント: `index.html`
    * エラードキュメント: `error.html`
1. `変更の保存`をクリックする。

###バケットポリシーの設定をする。
1. バケットポリシーの編集ページを開く。<br>`Amazon S3　＞　(独自ドメイン)　＞　アクセス許可タブ　＞　バケットポリシー　＞　編集`をクリックする。
1. バケットポリシーを編集する。
<br>以下のAWS公式ページから、バケットポリシーをコピーして、設定するバケットポリシーにペーストする。そして`Bucket-Name`の部分を独自ドメインに変更する。
<br>[カスタムドメインを使用した静的ウェブサイトの設定 ステップ 8: バケットポリシーをアタッチする](
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#add-bucket-policy-root-domain)
1. sorryページにアクセスする。
<br>`Amazon S3　＞　(独自ドメイン)　＞　プロパティタブ　＞　静的ウェブサイトホスティング　＞　バケットウェブサイトエンドポイント`に記載のURLをクリックする。

###Route53でプライマリ/セカンダリの設定をする
1. 既存のAレコードをプライマリのレコードへ編集する。
<br>`Route 53　＞　ホストゾーン　＞　yoshiki-mbp.com　＞　(既存のAレコード)　＞　レコードを編集`をクリックする。
1. 以下の項目を入力して、`保存`をクリックする。
    * ルーティングポリシー: `フェイルオーバー`
    * フェイルオーバーレコードタイプ: `プライマリ`
    * レコードID: `LB-Primary`
1. セカンダリのレコードを作成する。`レコードを作成`をクリックして、以下の項目を入力していく。
    * レコード名: `blog`
    * レコードタイプ: `A`
    * エイリアス: オンにする
    * トラフィックのルーティング先: 
        * エンドポイント: `S3ウェブサイトエンドポイントのエイリアス`
        * リージョン: `ap-northeast-1`
        * S3エンドポイント: (先ほど作成したS3バケットが表示されるはず)
    * ルーティングポリシー: `フェイルーオーバー`
    * フェイルオーバーレコードタイプ: `セカンダリ`
    * レコード ID: `LB-Secondary`

###障害試験
1. EC2インスタンスが`実行中`の状態で正常にWebページが表示されることを確認する。
1. EC2インスタンスを2台とも`停止`する
1. すぐにWebページにアクセスすると、`503 Service Temporarily Unavailable`が表示されるが、TTLの設定時間待ち、再度Webページにアクセスするとsorryページが表示される。
「network: add cmd: failed to assign an IP address to container」と出てContainerCreateから進まない

## ログ
```
  Warning  FailedCreatePodSandBox  5m36s                  kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "xxxxx" network for pod "elasticsearch-867694d588-245kp": networkPlugin cni failed to set up pod "elasticsearch-867694d588-245kp_log" network: add cmd: failed to assign an IP address to container
```

### 原因
- Nodeに追加するIPアドレスの上限に達した

## スケールアップ

```
eksctl scale nodegroup --cluster=vamdemic-clsuter --name t3large --nodes 2
```

## 確認

```
kubectl get node
```
Lightning Experience のオムニチャネル ⇒ オムニチャネルの使用開始

１．作業項目の完了に必要なスキルを、エージェントが持っているスキルと照合するルーティング種別はどれですか?
２．外部ルーティングを使用すると企業は何ができますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/042c51b5-f168-41ec-dda0-23ade7600344.png)
vscodeで変数が表示されない問題の解決法

## デバックしても変数が表示されない

つい数日前に使い始めたvscodeで環境構築していたら、突然ファイルをデバックしても"実行とデバック"の変数に何も表示されなくなってしまいました。

デバック　変数　表示されない　などのワードで検索してもいまいちヒットせず、理由もわからずで小一時間くらい闘っていましたが、最終的に自分で解決することができました。

この記事が同じ悩みで格闘している方の助けになれば幸いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558730/091b0bfc-e065-4a2c-76e3-5bffac37e9b3.png)


## 環境

わたしの使用している環境です。

- Windows10
- vscode（Python、C＃、Ruby、Java）
- Anaconda3（Pythonのpathを通しています）



## 前提として

**拡張機能は入ってますか？**
わたしは今回Pythonを使っていたので、PythonとPylanceは入れてありました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558730/57d699d3-c534-046b-36a4-b6e90889e824.png" alt="image-20210528125246925" width=50%;" />

## 方法1

いろいろサイトを見ていく中で、「launch.jsonを編集する」というものありましたが、これで解決するのは"デバック コンソール"の欄に表示されるようになる、です。
詳しくはこの方に記事をご覧ください。
[vscodeにてpythonでのデバッグ中、デバッグコンソールが機能しない](https://hachian.com/2020/01/22/print_no_longer_provides_output_in_debug_console/)

今回は、デバック（F5キーを押す）しても変数の欄が真っ白な問題を解決したいので、これはしなくてもよいかと思います。（が、わたしは一応しました。）


## 解決方法

vscodeを開きます。
適当にPythonで書かれたファイルを開いてください。
参考までに、わたしが試し用で適当に書いたプログラムです。

```python
a=1
b=1

print("hello")
print(1+2)
print(a)
print(b)
```

vscodeの一番上にある 実行タブ を押すと、下のように出てきますので、
1. "すべてのブレークポイントを有効にする" を押す。
2. F9もしくはブレークポイントの切り替えを押す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558730/e178aa29-0ccd-565a-336d-e9cfe5a55639.png" alt=""width=43%;" />


そうすると、どこか選択されていた行の左に赤丸マークがつくと思います。
（この丸の位置をマウスでクリックしても、同様にマークをつけることができます。）
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558730/2c44903d-fc52-23cf-6124-81abf837945c.png" />

最後に、F5キーを押してデバックすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558730/de1993e4-c2e1-4bfd-c454-40371f608165.png)
変数のところに表示されました！！



## 最後に

変数欄に表示されなかったのは、ブレークポイントを設定していなかったから、ということだったんですね。環境開発を変えると慣れなくて大変です…。

print()で表示させなくても変数に何が入っているかわかると非常に便利なので、デバック活用していきましょう。
[ビギナー向け]TouchDesignerとYoutubeLiveを連携させてコメント取ってきちゃうよ vol.1

#YoutubeLiveの需要
オンラインイベントのはやってますよね～
__BADHOP__が無料でオンラインライブやってて、クオリティの高さに感動しちゃった

見てるだけで最高！！
ですが、わいは__ひらめいたのである__
#コメントで遊べたら没入感アップ
どうしても距離的に離れてるから、__その場のテンション味わえない__
なら、Youtubeにせっかくある__コメント機能__使って

__Liveに参加できれば楽しいやん！__
要はLiveの映像にコメントが反映されると、、、

そういうことですわ

#今回作るものはこちら
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704869/f7e8bdf3-b50e-655e-5ad8-15a170f27184.gif)

Youtube Liveのコメントをとってきて、live映像と一緒に出していますね～
サーフィンなのは、単に波乗りジョニーしたいから
#チュートリアルは動画のほうがわかりやすい
あくまでわいの意見ですが、文字より__映像__のほうが内容はいってくるんすよねー
ここで言うことではない（笑）

というわけで、__vol.1__下記から見に行ってください！！
画像クリックで飛べまっせ
[![thna_youtube_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704869/936ab2b2-f829-ab9b-7f11-e35b3329869a.jpeg)](https://youtu.be/gbCdakQV-w4)


#ポイント解説
詳しい内容は[動画](https://youtu.be/gbCdakQV-w4)で話してるのでここではかるーい解説
##Youtube Data API
何が何でもYoutubeの情報を引っ張てくるにはこれ必要！
__具体的にはAPIを使うためのkeyが必要ってことさ__

え、そのまえにAPIってなんだよって？

簡単に説明すると、
[外部のサービス(今回ならYoutube)の機能を使えるようにする便利ツールといったところかな](https://www.sejuku.net/blog/7087)

ドラえもんのポッケだ。
のび太単体ではジャイアソを倒す方法はないけど、ドラえもんのポッケから出てくるアイテム使えば倒せるよね
その窓口てきな役割がAPIさ

本題戻ると、
[Google Cloud Platform](https://console.cloud.google.com/?hl=ja)からAPIのKeyをゲトるよ
動画でも説明してるけど、[こちら](https://qiita.com/iroiro_bot/items/1016a6a439dfb8d21eca)も大変役に立ちます
というか、パクらせていただいてます（笑）

##API使うときのパラメータを作っておく
ここはvol.2にて詳しく説明しますが、今回は以下の3つのパラメーターを作っておきます

- key -> これはさっき作ったAPIkey
- id -> これは取得したいYoutubeの動画リンクの=以下(今回で言えばサーフィンのライブ中継)
- part -> YoutubeLiveの情報がほしいので、liveStreamingDetailsにしといてください
![3parameter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704869/630e7848-3b60-27a6-49d5-f14f9af636f0.jpeg)


サラっと`textDAT`と`tableDAT`使てるけど、ここら辺は慣れっす

#準備完了
これでAPIのリンクに飛ばす準備できましたとさ
ここからコメントを取得していくでえ
続きは[vol.2](https://qiita.com/miwa_maroon/items/b76cb9663a0dd2588b5d)で

ホンジャマカ
SORACOM Orbitでボタンの簡易位置情報をオブジェクトに詰め替える(Webassembliy編)

# この記事は

[Azure IoT Central](https://azure.microsoft.com/ja-jp/services/iot-central/)に[SORACOM LTE-M Button](https://soracom.jp/products/gadgets/)のデータを投入して地図表示をさせる際、どのようにデータを[SORACOM Orbit](https://soracom.jp/services/orbit/)で調整したかというお話です。

なお、IoT Centralは利用例であり、本質的には**「Orbit(AssemblyScript)でオブジェクトや配列を含むJSONをどうやって生成するか？」**ということになります。

# LTE-M ButtonをAzure IoT Centralに接続する

LTE-M ButtonをAzure IoT Centralに接続する話は、以下の資料を参照ください。

https://aadojo.alterbooth.com/entry/2020/12/28/101659

# 地図を出したい！

上記の記事ではclickTypeなどの表示までは行っていますが、位置情報を地図に表示するところまではしていませんでした。
そこで、今回地図の表示にチャレンジします。

IoT Centralでは、Gepointという形のデータを送り込むと、[Azure Maps](https://azure.microsoft.com/ja-jp/services/azure-maps/)の機能を使って地図上に表示したり経路を計算したりすることができます。
Geopointというのは緯度(latitude),経度(longitude),高度(altitude、オプション）を要素に持つオブジェクトです。JSONで書くと

```json
{
    .....,
    "geopoint": {
        "lat": xxxxxxxx,
        "lon": xxxxxxxx,
        "alt": xxxxx
    }
}
```

こんな感じでデータが送られてくると良いということになります。

# SORACOM Orbitでデータを詰めよう

LTE-M Buttonで簡易位置情報をHTTPヘッダなどではなく送信データ本体に含める場合はSORACOM Orbitを使います。Webassemblyでやる場合についてはこちらの記事を参照ください。

https://qiita.com/kkimura/items/1af1c33d7d3862e1a454

しかし、こちらの記事で整形した送信データは以下のような形になっていて、位置情報がgeopoint型のオブジェクトではなくフラットに展開されています。

```json
{
   "clickType": 1,
   "clickTypeName": "SINGLE",
   "batteryLevel": 1.0,
   "binaryParserEnabled": true,
   "lat": 3?.************,
   "lon": 13?.***************
}
```

これをgeopoint型にするには、以下のようにsoraletのコードを修正します(該当部分のみ抜粋)。

```typescript
export function uplink(): i32 {
  ....
  const location = getLocation();
  encoder.pushObject("geopoint"); // <- ここを追加
  encoder.setFloat("lat", location.lat);
  encoder.setFloat("lon", location.lon);
  encoder.popObject(); // <- ここを追加
  .....
}
```

これはOrbit(AssemblyScript)で利用しているJSONEncoderの機能で、`pushObject("geopoint")`は`"geopoint": {`の行を、`popObject()`は`}`の行を出力するものです。

なお、JSONEncoderには`pushArray("arrayObject")`(`"arrayObject": [`を出力)と`popArray()`(`]`を出力)という関数もありますので、これらを組み合わせると自由にJSONを組み立てられます。

# IoT Centralにデータを送ってみる

では、このsoraletでデータを変換してIoT Centralにデータを送ってみます。IoT Centralのデバイステンプレートにgeopoint型の定義と地図のViewを追加すると以下のように無事表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/9e5db415-32ad-9492-49ab-9ace6e2db77a.png)

# まとめ

SORACOM Orbit(AssemblyScript)では、`pushObject()`,`popObject()`,`pushArray()`,`popArray()`を使うことでJSONの中にオブジェクトや配列も作ることができます。
今回は例としてIoT Centralで地図を表示するためにGeopoint型のオブジェクトにデータを詰めるということに利用しましたが、フラットでないJSONをOrbitから出力できると、データを受け取るバックエンド側の柔軟性も上がると思いますので是非お試しいただければと思います。

# おまけ

なお、この内容は2021/5/27に開催された[SORACOM UG Online #5](https://soracomug-tokyo.connpass.com/event/210151/)で発表しました。その時のスライドはこちらになります。

https://www.slideshare.net/kenichiroukimura/azure-iot-central
初めてPowerShellで文字操作をやってみた


PowerShellの勉強の続きです。今回は文字操作を勉強してみました。いつものとおり、忘れないようにメモを残します。

#文字列の分割

文字列を区切り記号`,`で分割します。

```powershell:一般的な記入法
'Jan,Feb Mar,Apr'.split(',')
```
```
Jan
Feb Mar
Apr
```

複数の区切り記号をカンマ`,`と空白` `として分割します。

```powershell:複数の区切り記号を使う場合
'Jan,Feb Mar,Apr'.split(', ')
```
```
Jan
Feb
Mar
Apr
```

分割数を指定します。

```powershell:分割数3を指定した場合
'Jan,Feb Mar,Apr'.split(', ',3)
```
```
Jan
Feb
Mar,Apr
```

正規表現を使う場合は`-split`を使います。

```powershell:正規表現を使う場合
'Jan,Feb Mar,Apr' -split '[,\s]',3
```
```
Jan
Feb
Mar,Apr
```

区切り記号を2文字以上にする場合も正規表現を使います。

```powershell:改行コードで分割する場合
"abc`r`ndef" -split "`r`n"         #PowerShellではエスケープに"\"ではなく"`"を使います。
```
```
abc
def
```

#文字の前後の空白の削除

`Trim`を使い、文字の前後の空白を取り除くことができます。

```powershell:
'  Hello  ,  World !  '.Trim()
```
```
Hello  ,  World !
```

配列では全要素に対し空白の削除が行われる。

```powershell:
'  Hello  ,  World !  '.split(',').Trim()
```
```
Hello
World !
```

#全角・半角変換

文字を半角に変換するには`[VbStrConv]::Narrow`を、全角に変換するには`[VbStrConv]::Wide`を使います。

```powershell:
using namespace Microsoft.VisualBasic
Add-Type -AssemblyName 'Microsoft.VisualBasic'
[Strings]::StrConv('ＰｏｗｅｒＳｈｅｌｌ',[VbStrConv]::Narrow)
[Strings]::StrConv('Windows',[VbStrConv]::Wide)
```
```
PowerShell
Ｗｉｎｄｏｗｓ
```

#置き換え

文字`bc`を`BC`に置き換えます。

```powershell:一般的な記入法
'abcdefgabcdefg'.Replace('bc','BC')
```
```
aBCdefgaBCdefg
```

正規表現を使う場合は`-replace`を使います。

```powershell:正規表現を使う場合
"abc`r`ndef" -replace "`r`n",","
```
```
abc,def
```

複数の条件を入れる場合も正規表現を使います。

```powershell:複数の条件を使う場合
'abc,def' -replace 'abc|def','xyz'
```
```
xyz,xyz
```

#n番目の文字の場所を調べる

(n番目の区切り文字の場所)+1を調べます。

```powershell:
$original='id,name,age,sex'
$c=0
$number=2
for($i=0;$i -lt $number;$i++){ $c=$original.IndexOf($target,$c)+1 }
```
```:$cの値（結果）
8
```

後ろから数えるには、`LastIndexOf`を使います。(後ろから数えてn番目の区切り文字の場所)-1を調べます。

```powershell:
$original='id,name,age,sex'
$c=0
$number=1
$c=$original.Length
for($i=0;$i -lt $number;$i++){ $c=$original.LastIndexOf($target,$c)-1 }
```
```:$cの値（結果）
10
```

#文字を数える

（IndexOfを使う方法もあるのですが）ネットでは「元の文字数から対象の文字を消した文字数を引く」方法がよく書かれていました。

```powershell:変数内にある対象の文字数を調べる
$original='id,name,age,sex'
$target=','
($original.Length-($original -replace $target,'').Length)/$target.Length
```
```
3
```

#特定の文字が入っている行を取り出す

ログファイル`*.log`から`error`と書かれた行を取り出します。デフォルトでは大文字小文字を区別しないようです。

```powershell:
select-string *.log -Pattern 'error'
```
```
test1.log:3:system error 88
test2.log:6:service Error 99
```

#おわりに

PowerShellはWindowsに必ず入っているので、慣れてくるといろ色々なことができそうです。次回はcsvファイル関連のプログラムを作ってみたいと思います。
terraform initで「Failed to query available provider packages」が発生した時の対処法

自宅サーバ用途でESXiを導入しました。WebからポチポチしてVMを立てるのは大変なので、terraformを使ってコードで管理しようと思います。

使用したプラグインは以下になります。

- Registry: [josenk/esxi | Terraform Registry](https://registry.terraform.io/providers/josenk/esxi/latest)
- GitHub: [josenk/terraform-provider-esxi: Terraform-provider-esxi plugin](https://github.com/josenk/terraform-provider-esxi)

使用しているterraformのversionは以下になります。(Mac環境を使用しています)

```bash
$ terraform -v
Terraform v0.15.4
on darwin_amd64

```

## エラー内容

はじめに`terraform init`で使用するprovider pluginの設定を行いますが、この時点でエラーが発生しました。

```bash
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/esxi...
╷
│ Error: Failed to query available provider packages
│ 
│ Could not retrieve the list of available versions for provider hashicorp/esxi: provider registry registry.terraform.io does not have a
│ provider named registry.terraform.io/hashicorp/esxi
│ 
│ All modules should specify their required_providers so that external consumers will get the correct providers when using a module. To see
│ which modules are currently depending on hashicorp/esxi, run the following command:
│     terraform providers

```

使用したファイルは以下になります。

```main.tf
terraform {
  required_providers {
    esxi = {
      source = "hashicorp/esxi"
    }
  }
}

provider "esxi" {
  esxi_hostname      = "192.168.0.2" # ESXiのIPアドレス
  esxi_hostport      = "22"
  esxi_hostssl       = "443"
  esxi_username      = "root" # ESXiにSSHするときのUSER
  esxi_password      = "pa$$w0rd" # ESXiにSSHするときのPASSWORD
}

resource "esxi_guest" "vmtest" {
  guest_name         = "vmtest"
  disk_store         = "datastore1"
  network_interfaces {
    virtual_network = "VM Network"
    mac_address     = "00:50:56:00:00:00"
  }
}
```

## 対処法

`source = "hashicorp/esxi"`という指定が間違っていたので、`source = "josenk/esxi"`に修正して対処しました。(公式ドキュメントにも書いてありました、、)

```main.tf
terraform {
  required_providers {
    esxi = {
      source = "josenk/esxi" # ここを修正
    }
  }
}
```

terraform 0.13からProviderが https://registry.terraform.io/ から配布されるので、`source = "<Provider名>/<プラグイン名>"`と記載することで https://registry.terraform.io/ からプラグインを探しにいきます。

また、`source = "registry.terraform.io/josenk/esxi"`と記載しても同じ動作になります。

プラグインを使用する際には、レジストリのWebページにアクセスして右上の「USE PROVIDER」をクリックすると、必要なterraformのversionとコードが見れるので、表示された通りに記載すれば問題ないです。

![terraform-registry-josenk-esxi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251749/f4ef1acb-4bc3-280e-93c8-1ae32a05b796.png)

## Reference

- [terraform 0.13でローカルproviderを利用する方法 - Sionの技術ブログ](https://sioncojp.hateblo.jp/entry/2020/10/13/195117)
- [could not query provider registry for registry.terraform.io でterraformのproviderがダウンロードできない問題の対処 - Screaming Loud](https://yuutookun.hatenablog.com/entry/2021/01/05/192708)
amazon,楽天市場,yahooショッピングにおけるスクレイピングの可否に関しての調査

**”スクレイピングしたい”**

そう思った時によく挙げられるサイトとして**amazon**,**楽天市場**,**ヤフーショッピング**等が挙げられると思います。（おそらくせどりが狙いの方が多いのでは？）

そこで、今回は利用規約等からスクレイピングの可否について調査しました。

# Amazon

> 本規約およびサービス規約の遵守を条件とし、アマゾンまたはコンテンツ提供者は、アマゾンサービスを限定的、非独占的、非商業的および個人的に利用する権利をお客様に許諾します（譲渡およびサブライセンス不可）。**この利用許可には、アマゾンサービスまたはそのコンテンツの転売および商業目的での利用、製品リスト、解説、価格などの収集と利用、アマゾンサービスまたはそのコンテンツの二次的利用、第三者のために行うアカウント情報のダウンロードとコピーやその他の利用、データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。**本規約またはその他の規約にて明示的に許諾されていない権利は全てアマゾンまたはそのライセンサー、供給者、出版者、権利保持者またはその他のコンテンツ権利者が留保します。アマゾンサービスまたはそのいかなる部分も、アマゾンからの書面による明示的な承諾を得ていない限り、商業目的のために、複製、複写、コピー、販売、再販、アクセス、その他の利用はできません。商標、ロゴ、およびアマゾンが有するその他の財産権的価値のある情報（画像、文字、ページレイアウト、フォームを含む）は、書面による明示的な承諾を得ていない限り、フレームにしたり、またはフレーム技術を使って取り込んだりすることはできません。また、アマゾンの明示的な書面による許諾なく、アマゾンの名称や商標をメタタグなど隠れたテキストとして使用することはできません。アマゾンサービスを不正に利用することは禁止されており、適用される法律に従ってのみ利用できます。本規約およびその他の利用規約に反する使用をした場合、アマゾンが使用許諾した権利は終了します。

[amazon利用規約](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201909000)より

つまり、**amazonからの許諾がない限りダメ**という認識です。

# 楽天市場

>第７条（禁止事項）
１．	お客様は、本サービスの利用において以下の各号に定める行為をしてはならないものとします。
 	（１）	法令、裁判所の判決、決定もしくは命令、または法令上拘束力のある行政措置への違反
 	（２）	公の秩序または善良の良俗を害すること
 	（３）	反社会的勢力に対する利益供与その他の協力をすること
 	（４）	犯罪による収益の移転行為及びこれを助長、幇助等すること
 	（５）	第三者へのなりすましまたは意図的に虚偽の情報を送信すること
 	（６）	購入する意図なく商品の購入を申し込むこと
 	（７）	**当社の事前の許可を得ることなく、自動化された手段（自動購入ツール・ロボットなどこれらに準ずる手段）を用いて商品を購入すること（商品ページ上の情報取得等を含む）**
 	（８）	正当な理由なく商品を受け取らないこと
 	（９）	正当な理由なく返品等をすること
 	（１０）	自己取引、関係者内での内部取引、架空取引
 	（１１）	ポイントの不正取得、ポイントを不正な目的に利用すること
 	（１２）	当社、当社のグループ会社、ショップ、他のお客様、その他第三者の権利を侵害し、または迷惑をかけること
 	（１３）	不正アクセス行為、またはこれを助長する行為
 	（１４）	本サービスの誤作動を誘引すること
 	（１５）	本サービスが通常意図しないバグを利用する動作を生じさせ、または、通常意図しない効果を及ぼす外部ツールの利用、作成、または頒布
 	（１６）	当社、当社のグループ会社、ショップ、他のお客様のサーバー、コンピュータ等に過度の負担をかけること
 	（１７）	当社、当社のグループ会社、ショップ、他のお客様、その他第三者にコンピュータウイルス等の有害なプログラムを送信し、または流布すること
 	（１８）	本サービスの運営を妨げること
 	（１９）	不正な目的をもって、本サービスを利用すること
 	（２０）	本規約に違反し、または、本サービスの趣旨目的に反すること
 	（２１）	楽天会員規約その他、当社が定める規約、ガイドライン等に違反すること
 	（２２）	その他当社が不適切と判断すること
２．	お客様が前項の定めに違反した場合、またはショップもしくは当社に対する債務を履行しない場合、当社は、お客様に事前に通知することなく、以下の各号に定める措置の一部または全部を講じることができます。
 	（１）	お客様による本サービスの利用を停止し、または楽天会員規約に基づき、お客様の楽天会員資格を停止もしくは取消しをすること
 	（２）	商品の発送等取引の履行を停止すること、またはショップに停止を要請すること
 	（３）	お客様に対し、注文時に選択した支払方法と異なる方法で代金をお支払いいただくよう要請すること
 	（４）	お客様に対し、ポイント、クーポン、その他の特典を取消すほか、不当に得た利益を返還いただくこと
３．	前項の措置を講じたことによってお客様に生じた損害については、当社は一切責任を負いません。
４．	お客様が第１項に違反したことによって、当社に損失ないし損害が生じた場合

[楽天市場利用規約](http://www.rakuten.co.jp/doc/info/rule/ichiba_shopping.html)より

楽天市場も、amazon同様**楽天市場の許諾なしに商品の購入ならびに商品ページの情報の収集は禁止**されているようです。

ただし、
> 当社の事前の許可を得ることなく、自動化された手段（自動購入ツール・ロボットなどこれらに準ずる手段）を用いて商品を購入すること（**商品ページ上の情報取得等を含む**）

ということで、商品ページ以外は明記されていませんでした。

# ヤフーショッピング

利用規約上では、明記されてる文面は確認できませんでした。

# 終わりに
色々、この記事を執筆するまでに理由を考えてスクレイピングしていいみたいな文面もちらほら散見されました。
理由をつけてやるのは自由ですけど、**個人的にはやめた方がいい**と思いました。（良心の呵責とか色々言っても聞かない人は聞かないんだろうけど。）


# 更新日
- 2021.5.28 
-
【JavaScript：文字列変換】入力した「ひらがな」を「カタカナ」に変換する


## ひらがなをカタカナに変換します↓

`hiraganaToKatakana(string)` 関数に渡した引数のうち、
「ひらがな」を「カタカナ」に変換した上で返却します。

```javascript
// ひらがなの配列
const hiraganaArray = [
  'あ', 'い', 'う', 'え', 'お',
  'か', 'き', 'く', 'け', 'こ',
  'さ', 'し', 'す', 'せ', 'そ',
  'た', 'ち', 'つ', 'て', 'と',
  'な', 'に', 'ぬ', 'ね', 'の',
  'は', 'ひ', 'ふ', 'へ', 'ほ',
  'ま', 'み', 'む', 'め', 'も',
  'や', 'ゆ', 'よ',
  'ら', 'り', 'る', 'れ', 'ろ',
  'わ', 'を', 'ん',
  'が', 'ぎ', 'ぐ', 'げ', 'ご',
  'ざ', 'じ', 'ず', 'ぜ', 'ぞ',
  'だ', 'ぢ', 'づ', 'で', 'ど',
  'ば', 'び', 'ぶ', 'べ', 'ぼ',
  'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ',
  'ゃ', 'ゅ', 'ょ'
]

// カタカナの配列
const katakanaArray = [
  'ア', 'イ', 'ウ', 'エ', 'オ',
  'カ', 'キ', 'ク', 'ケ', 'コ',
  'サ', 'シ', 'ス', 'セ', 'ソ',
  'タ', 'チ', 'ツ', 'テ', 'ト',
  'ナ', 'ニ', 'ヌ', 'ネ', 'ノ',
  'ハ', 'ヒ', 'フ', 'ヘ', 'ホ',
  'マ', 'ミ', 'ム', 'メ', 'モ',
  'ヤ', 'ユ', 'ヨ',
  'ラ', 'リ', 'ル', 'レ', 'ロ',
  'ワ', 'ヲ', 'ン',
  'ガ', 'ギ', 'グ', 'ゲ', 'ゴ',
  'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ',
  'ダ', 'ヂ', 'ヅ', 'デ', 'ド',
  'バ', 'ビ', 'ブ', 'ベ', 'ボ',
  'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
  'ャ', 'ュ', 'ョ'
]

// 引数に渡された単語が「ひらがな」だったら true を返す関数
function isHiragara(character) {
  if (hiraganaArray.includes(character)) return true
  return false
}

// 引数に渡された言葉のうち、「ひらがな」を「カタカナ」に変換する関数
function hiraganaToKatakana(words) {
  return words.split('').map(character => {
    if (!isHiragara(character)) return character
    const characterIndexInHiragaraArray = hiraganaArray.indexOf(character)
    return katakanaArray[characterIndexInHiragaraArray]
  }).join('')
}

console.log(hiraganaToKatakana('われわれは、うちゅうじんだ。'))
// → ワレワレハ、ウチュウジンダ。
for文の速度が遅いとき(一応jsの場合)

###ネストされたプロパティはfor文の外で参照する
当たり前だったかもしれませんが初心者はこういうことに気づかないと思うので。
自分はこれで9000ms→20msになりました。(約10000回のループでした)
for文の中で参照するとfor文が繰り返されるたびに参照します。
for文の前で参照すると変数に代入された結果がキャッシュとして使われるので参照は1回ですみます。

※includes()を使っていますがこれは配列の中に指定した要素があるかを検索するものです。ある場合はtrue、ない場合はfalseを返します。

```js

悪い例:
for (let i = 0; i < obj.array.length; i++ | 0) {
        if (List1.includes(nest1.nest2.nest3[i])) {
          if (List2.includes(nest4.nest5.nest6[i])) {
            if (List3.includes(nest7.nest8.nest9[i])) {
             ・・・

改善後:
let a = nest1.nest2.nest3;
let b = nest4.nest5.nest6;
let c = nest7.nest8.nest9;
let len = obj.array.length;

for (let i = 0; i < len; i++ | 0) {
        if (List1.includes(a[i])) {
          if (List2.includes(b[i])) {
            if (List3.includes(c[i])) {
             ・・・

//ちなみに以下のように書き換えたらスッキリするかもしれないが速度的には大差ない
for (let i = 0; i < len; i++ | 0) {
  if (List1.includes(a[i]) && List2.includes(b[i]) && List3.includes(c[i])) {

```

###追記
たとえネストされていなくても大きな配列を扱う場合は先に変数に入れたほうが速いです。
以下はnuxtの例です

```js
例

for (let i = 0; i < len; i++ | 0) {
  if(this.bigList[i]){ //遅い(約600ms)

----
let a = this.bigList;
for (let i = 0; i < len; i++ | 0) {
  if(a[i]){ //速い(約10ms)

```
【Swift】CollectionViewのタップしたセルの要素を取得する

# どういうことか

セルをタップしたとき、セルに書かれている文字を取得して変数に入れたい。

## こうやってやる

```swift:ViewController.swift
    // セルがタップされたとき
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        
        switch indexPath.section {
        
        case 1:            
            if let cell = collectionView.cellForItem(at: indexPath) as? LabelCollectionViewCell {
                // セルの要素が取得できる
                selectText = cell.titleLabel.text
            }

    // 省略
```

おわり(´・ω・｀)
Reactでお天気アプリの作成

## はじめに
今回はReactでお天気アプリを作成しました。

## 完成イメージ
![スクリーンショット 2021-05-28 10.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288651/49c3fe98-f0d4-3ad8-afc2-e004f80ee1bb.png)

## 作成目標
- APIを使うことに慣れる
今までAPIを使ってアプリ作成をしたことがなかったので
この機会にAPIをきちんと使えるようにすること。
そのために公式の仕様のドキュメントを読んで、なるべく自分のコードで書きながら進めました。

## 使用した技術
- React
- Material-UI
- Typescript
- recharts
- react-google-maps/api

## 実装した機能
- geolocationにて現在地の取得
- geocodingにて入力された地名から緯度経度を取得
- 取得した緯度経度のお天気情報をOpenWeatherから取得


## 感想
- 苦労した点
まずAPIを使ったことがなかったので、データを取得する部分で上手くいかず苦労しました。

他の方の記事はなるべく見ないで公式のドキュメントを読んで自分で書いてみることを目標にしたので
かなり時間はかかりましたが、勉強になりました。

また新しいことに挑戦してると当たり前のことを失念したりして驚きました。
データを取得する関数内で、データが取得できているかconsole.logを使用して確認しても
データが入っておらずなぜ？としばらく詰まっていました。
でもレンダリングしないとデータは更新されませんよね...。
一時的にデータを確認するためのボタンを作成して更新を確認したりして解決しました。

- 反省
TypeScriptをもっと使用しようと思っていたのですが、現状の自分のレベルでは
ただ無駄にコードを増やしているだけで、足枷にしかなってないように思いました。

なので次作成するアプリではもっと上手くTypeScriptを使えるようになりたいと思いました。
また、まだ使ったことのない技術もどんどん試したいと思います！


関連記事
[OpenWeather ワンコールAPI](https://openweathermap.org/api/one-call-api)
[OpenWeather currentAPI](https://openweathermap.org/current)
[Google Maps APIの使い方](https://www.webdesignleaves.com/pr/plugins/googlemap_01.html)
[Google geocoding](https://developers.google.com/maps/documentation/geocoding/overview)
[geolocation](https://webdrawer.net/javascript/geolocation.html)
[地図を表示](https://dev.classmethod.jp/articles/launching-a-map-app-using-react-google-maps-api-locally/)
[unixtimeを日時に変換](https://qiita.com/shirokurotaitsu/items/5efd855900ec6135bbab)
日本語 OCR モデルのリスト (awesome-Japanese-OCR-model)

- 適宜アップデートします。
- 日本語の学習済みモデルが利用可能なもの
- なるべく python で使えるもの

# PaddleOCR
https://qiita.com/harusamet/items/24d59bd2bb50ab6873ac

# EasyOCR
https://github.com/JaidedAI/EasyOCR

# OpenCV & OpenVino Pretrained Model
https://qiita.com/nonbiri15/items/a4151bfcda4e5ce43335

https://github.com/yas-sim/handwritten-japanese-ocr
Analytics Cloudを活用したPOSデータ分析：商品クラスター分析①(ビジュアライゼーションの拡張分析機能)

# 利用環境 #

データベース：Oracle Autonomous Data Warehouse　容量(1OPCU)

BIサービス：Oracle Analytics Cloud  機能セット(Enterprise Analytics) 、容量(２OPCU)



# 用意したデータについて #

アパレル事業の店舗POS売上明細データ：　ID付きPOSデータなので、会員ID付きの売上データです。商品属性（カラーコード、サイズ）、ブランドなどは、連結済み

会員マスタデータ：会員の基本属性データですが、ポイント増減に関する情報も、連結済みのデータ





# Analytics Cloudを活用したPOSデータ分析：商品クラスター分析①(ビジュアライゼーションの拡張分析機能)

商品の売れ筋、死に筋を把握することは、商品の生産や仕入れ計画、商品配分などを考える上で、重要なことです。今回は、Analytics Cloudに備わっている機械学習機能を使って、商品を売れ筋、死に筋に分類して見たいと思います。Analytics Cloudにおける機械学習機能は、ビジュアライゼーションの拡張分析機能として、オートマチックに利用する方法と、関数として提供される機械学習アルゴリズムを利用して計算式を自分で組む方法などがありますが、今回は、前者のビジュアライゼーションの拡張分析機能を使った方法をご紹介します。

商品の売れ筋や死に筋を分類する、商品ABC分析には、クラスタリングが有効です。



完成形イメージ
**商品クラスターグラフ（直近90日のTシャツ・カットソー売上数量ベース）**

![012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/e621e4d3-a6cd-599e-85db-1d7bf31b4581.jpeg)


# ベースのツリーマップを作成する　



値に”数量(商品売上枚数）”、カテゴリに”商品CD”を配置したツリーマップを作成します。そしてフィルター領域に任意のフィルターを配置します。

商品アイテムは、”Tシャツ・カットソー”で絞り込んでいます。購入日付は[相対時間フィルター](https://qiita.com/Nakayamasan/items/ad356dcf98e1a09ff739)を使って、直近90日に絞り込んでいます。

ツリーマップは、商品点数が比較的多いときに、商品別の売上数量や金額などを面積で直感的に把握するのに適していると思います。左上の面積が大きい商品(商品CD)は、売上枚数が多く、右下に行くほど、売上枚数が少ないことを表しています。

![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/8a01d5c2-6070-b8a5-331a-af98644774a6.jpeg)


画面左側の黒いメニュバー上部のアイコンの一番右のループの形をした”分析”アイコンをクリックすると、ビジュアライズの拡張分析のリストが表示されます。

![0031.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/fde9382c-9ec6-5215-a1e1-37fd03020a23.jpeg)



# クラスタの追加



”強調表示”からクラスタを選択して。ツリーマップのレイアウト編集パレットの”色”にドラッグ＆ドロップします

![0043.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/bf96e94f-f04e-c2c5-1ed0-176c2aea1f38.jpeg)


すると、ツリーマップに表示されたボックスが、自動的に色分けされました。これで、クラスタリングのアルゴリズムを直近90日のPOS売上明細データに適用した結果、Tシャツ・カットソーの商品について売上枚数で5つのカテゴリに分類されたことになります。非常に簡単ですね。

![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/67c72cc2-f1c9-a445-e4af-b7636c0f852d.jpeg)


メニュバーの下部に作成されたツリーマップのプロパティで、クラスタリングのパラメータを変更することが出来ます。ビジュアライゼーションの拡張分析機能として提供されているクラスタリングでは、クラスタリングの**アルゴリズムとクラスタリングの数（グループ）**を変更することが出来るようになっています。

![0045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/fe5ecca8-ad90-7e86-40cc-54c0a147c823.jpeg)


アルゴリズムを変更したり、グループの数を変更すると、入力した値に応じて、ビジュアライズが再描画されます。

クラスタリングのアルゴリズムは、K平均法と、階層的クラスタリングから選択することができますが、それぞれのアルゴリズムについては、ここでは割愛します。クラスタリングについて、[よくまとまっている記事](https://qiita.com/sotoattanito/items/b885ef2dd3fe11cb817d)を見つけたので、ご参考までに。


![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/923db34b-df55-e685-5486-a4c84a9db706.jpeg)


すごく簡単に、クラスタリングが行えるのは良いことですが、商品ごとのクラスタの分類（クラスタコードやクラスタ名）をデータとして保持したい場合には、ちょっと適さないところがあります。あくまで、クラスタリングを行った結果をビジュアライズとして簡単に確認することが出来るところに用途がありそうです。

次回は、Analytics Cloudの関数として提供されているクラスタリングを使った方法についてご紹介したいと思います。





# まとめ

- ビジュアライゼーションの拡張分析機能として、クラスタリングを利用できる。ツリーマップなどのビジュアライズに適用することで、視覚的に商品クラスタリングした結果を確認することが出来る
-
【SQL】SUM, AVG, COUNT, MAX, MIN

#はじめに
今回は、集計関数と呼ばれるものを扱ってみます。

#SUM
合計値を取得したい時に使います。
例えば、以下の表の合計金額を取得したいとします。

![ScreenShot 2021-05-28 11.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/f1f71bea-e8cc-7ecd-8a5e-061dcf79981e.png)

```SQL
SELECT SUM(price)
FROM foods;
```

![ScreenShot 2021-05-28 11.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/bbe8061c-ab8b-a093-990b-92a0f8d938dc.png)

#AVG
次に、平均を求める時に使われるAVG関数をみていきたいと思います。

```SQL 
SELECT AVG(price)
FROM foods;
```

![ScreenShot 2021-05-28 11.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/b7baa8b7-4f1f-6840-e70f-b6e85905d72d.png)

#COUNT
データの個数を調べたい時に使います。
以下のように、焼きそばの金額がnullである表を例にクエリを書いてみます。

![ScreenShot 2021-05-28 11.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/5edf1564-3d0e-a0f9-f8ec-908e06e8d369.png)

```SQL
SELECT COUNT(price)
FROM foods;
```

![ScreenShot 2021-05-28 12.00.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/f82da4b5-3a9d-78cb-7a8c-a8e4d801c809.png)

nullである焼きそばのレコードがカウントにされていません。
nullであるデータも含めて、カウント数を調べたい時は、以下のようにしてレコードの数を取得します。

```SQL
SELECT COUNT(*)
FROM foods;
```

![ScreenShot 2021-05-28 12.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/d36b4ba7-5e6c-d67d-6207-024fae8647cf.png)

#MAX, MIN
最大値と最小値を取得したいときに、それぞれ用います。

```SQL
SELECT MAX(price), MIN(price)
FROM foods;
```

![ScreenShot 2021-05-28 12.08.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/5f68c63a-e0d4-fe16-c51a-c659c05f270e.png)


#おわりに
間違いなどありましたら、お気軽にコメントください！