OmniAICreator/Qiita-1.07M huggingface dataset:
SqueezeWave 動作メモ（CPU推論）

pytorchベースの音声合成ボコーダーSqueezeWaveの環境構築メモです
CUDAのみを前提に実装されていたので各種ハードコーディングを書き換えた実装をcloneして使う感じになりそうです


構築した環境はUbuntu 18.04が入ったラックトップPCです
基本的には付属のREADMEを同じです


#環境構築

python仮想環境作成

```
conda create -n SqueezeWave python=3.6
conda activate SqueezeWave

```


リポジトリ整備


```
git clone git@github.com:KeigoTakamura/SqueezeWave.git #use SSH
cd SqueezeWave 
git submodule init
git submodule update
pip install torch==1.0 matplotlib==2.1.0 numpy==1.13.3 inflect==0.2.5 librosa==0.6.0 scipy==1.0.0 tensorboardX==1.1 Unidecode==1.0.22 
```
requirements.txt でもOK

モデルの整備

[トレーニング済みモデル](https://drive.google.com/file/d/1RyVMLY2l8JJGq_dCEAAd8rIRIn_k13UB/view?usp=sharing)
[mel-spectrograms](https://drive.google.com/file/d/1g_VXK2lpP9J25dQFhQwx7doWl_p20fXA/view?usp=sharing)

をダウンロードしてunzipで解凍



#推論
(homeディレクトリの名前をrocmにしてあります）

```
$ python inference.py -f <(ls mel_spectrograms/*.pt) -w pretrain_models/L64_large_pretrain  -o .  -s 0.6
/home/rocm/miniconda3/lib/python3.7/site-packages/torch/serialization.py:434: SourceChangeWarning: source code of class 'glow.SqueezeWave' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.
  warnings.warn(msg, SourceChangeWarning)
/home/rocm/miniconda3/lib/python3.7/site-packages/torch/serialization.py:434: SourceChangeWarning: source code of class 'glow.WN' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.
  warnings.warn(msg, SourceChangeWarning)
/home/rocm/miniconda3/lib/python3.7/site-packages/torch/serialization.py:434: SourceChangeWarning: source code of class 'glow.Invertible1x1Conv' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.
  warnings.warn(msg, SourceChangeWarning)
./LJ001-0015.wav_synthesis.wav
./LJ001-0051.wav_synthesis.wav
./LJ001-0063.wav_synthesis.wav
./LJ001-0072.wav_synthesis.wav
./LJ001-0079.wav_synthesis.wav
./LJ001-0094.wav_synthesis.wav
./LJ001-0096.wav_synthesis.wav
./LJ001-0102.wav_synthesis.wav
./LJ001-0153.wav_synthesis.wav
./LJ001-0173.wav_synthesis.wav
Squeezewave vocoder time
84.89326977729797

```



#CPU性能
Intel® Xeon(R) CPU E5-2603 v4 @ 1.70GHz × 6を用いて全データーの推論に84.89秒の推論時間を要しました


#謝辞
https://github.com/KeigoTakamura/SqueezeWave-for-CPU-forkd-/issues/1

このCPU推論版は修正パッチを投げてくださいましたalokprasadさんによって完成しました
感謝申し上げます。
Angularでanimejsを動かす

Angularでanimejsを補完が効くようにする

![スクリーンショット 2020-02-17 18.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/6f2cb69c-87e1-42f7-0625-dcdf3778402f.png)

[animejs](https://animejs.com/)はできることが多いですが、補完が効いたほうが、こういうのも使えるのかと幅を広げると共にミスも減りますよね:santa:

# TL;DR

- @types/animejsを使用
- tsconfig.jsonの`allowSyntheticDefaultImports`を`true`に設定

# 環境

試した環境は下記です:santa:

```package.json

// "dependencies"
"@angular/core": "~9.0.1",
"@angular/cli": "~9.0.2",
"animejs": "^3.1.0",

// "devDependencies"
"@types/animejs": "^3.1.0",
```

# animejsのpackageを追加

既存のプロジェクトでも、新規でも構いません:santa:


```sh
yarn add animejs; (or npm i animejs --save)
yarn add -D @types/animejs; (or npm i animejs -D)

or
npm i animejs --save
npm i animejs -D
```


# tsconfig.jsonの`compilerOptions.allowSyntheticDefaultImports`を`true`にする

```tsconfig.json
{
    ~省略~
    "allowSyntheticDefaultImports": true
  },
    ~省略~
}

```

これで型の恩恵を受けれるようになりました:santa:

![スクリーンショット 2020-02-17 18.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/b2f455a9-c8c2-a54f-16c2-f91a9ccf9d68.png)
VSCode 1.4.2.1　変更点まとめ

VSCode　1.4.2.1がリリースされたので重要だと思われる機能についてまとめます。
# 対象読者

VSCode利用者
忙しい人向け。
そして私自身のメモ。

# 変更点一覧（明らかに不要は割愛）
星の評価基準は実用性と希少性で決めています。
実用性のある機能でも使ってれば必然的にふれるような機能は強調しないようにしています。



・リネームのプレビュー機能が追加　★★★
・エディタが開けるwindow数の制限が設定できるようになった。☆☆☆
・Untitled editorのファイル名がデフォルトで最初の一行目になる。　★★☆
・Untitled editorの言語が現在アクティブなwindowのものに引き継がれる　★★★
・ナビゲータですべてのグループで最も最近使われたファイルが表示されるようになる　★★☆
・パネル（ターミナルが表示されているところ）のwindowが移動できるようなった。　★★★
・再起動で修復できるwindow数を設定で１つにすることができるようになった　★☆☆
・保存時に競合したものに対して、compareまたはoverwriteできる通知が表示されるようになった。　☆☆☆
・保存時に競合するプロセスの通知がされるようになった。　☆☆☆
・ソースコントロールの入力ボックスでMonaco Editorが採用された。★★★
・Multi-root workplaceでフォルダを閉じる作業が２ステップでできるようになった。　★☆☆
・自動でOSのカラーテーマに応じて、それにマッチするテーマにVSCodeも切り替わるようになった　☆☆☆
・エディターのピークビュー（shift+F12のやつ）で最初にフォーカスする場所を設定できるようになった。　☆☆☆
・折りたたまれた場所が強調されるようになった。（カラーも設定できる）　☆☆☆
・折りたたみ機能の強化　★★☆
・新しいラッピングオプション　★☆☆
・suggest widgetの改良　★☆☆
・スクリーンリーダーに一度に読み込まれる行数は１６０とした。　☆☆☆
・統合ターミナルのスクロール感度をエディタと独立して設定できる　☆☆☆
・デバック開始のボタンを単純にした。
・LOADED SCRIPTSのデバック項目が改善　☆☆☆
・デバック構成の並び替えとグループを設定できるようになった　★☆☆
・デバックアイコンの改良　　☆☆☆
・ドラッグ＆ドロックでファイルを開けるようになった　★★★

# 詳細

## リネームのプレビュー機能が追加
こちらはリファクタリング機能の中のリネーム機能の改善。
リネームでどのように変更されたか確認できる。(shift + Enter) 
(Python User は　ropeというモジュールをpipでインストール必要があるので注意）
(Python User　は　インタラクティブWindowを開くコマンドとダブルので注意）


## パネル（ターミナルが表示されているところ）のwindowが移動できるようなった。
これは嬉しい。なぜなら下にターミナルがあるとたまに邪魔になるから
書いてるときに左や右に持っていきたいときが多々あった。

ショートカットキーはデフォルトでは未設定。
右クリックメニューから移動可能

## ソースコントロールの入力ボックスでMonaco Editorが採用された。
要するにGitで管理するときにCommitメッセージの入力が捗るようになった。

## エディターのピークビュー（shift+F12のやつ）で最初にフォーカスする場所を設定できるようになった。
VSCODEの設定からTreeかエディタか選べえる。
また切り替えるコマンドも新しく実装された。

## 折りたたみ機能の強化
Shift + クリックで親のコードから子供のコードが折りたたまれる。
もう一度Shift + クリックで　親のコードが折りたたまれる。

すでに折りたたまれた範囲でoption + cmd + [
→次の折りたたまれていない親範囲を折り畳める


## 新しいラッピングオプション
editor.wrappingStrategyについてadvancedに設定することで、
文字ごとに異なる幅の問題を、設定できる。


### 記事見出し1-1-1

# 参考

https://code.visualstudio.com/updates/v1_42
oracle SQL pivot

# pivotを使った検索結果の表示

### テーブル
|学年|組|名前|点数|
|----|----|----|----| 
|1|1|田中太郎|100|
|1|2|佐藤次郎|90|
|1|2|鈴木三郎|80|
|1|1|齋藤四郎|90|
```
SELECT *
FROM テーブル名
WHERE 点数 > 89
PIVOT(集約関数(点数) 
   FOR 名前 IN ( 100 AS '100点' ,
               90  AS '90点'
              ))
```


## 結果
|学年|組|100点|90点|
|----|----|----|----| 
|1|1|田中太郎|NULL|
|1|2|NULL|佐藤次郎|
|1|1|NULL|齋藤四郎|

カラム名に挿入したい箇所に値をいれることができる
Windowsで簡単にバックアップファイルを作成する

Windows でファイルバックアップを取りたい時、コピーしてリネイムするのが面倒だったので
右クリックの「送る」で簡単にバックアップする方法のメモです。


# やる事
- バックアップするbatファイル作成
- 右クリックしたときの「送る」メニューに追加

## バックアップするbatファイル作成

下記内容でバッチファイルを作成する

```bat
@echo off

if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_10%~x1%" (GOTO NOT_MAKE)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_09%~x1%" (GOTO MAKE_10)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_08%~x1%" (GOTO MAKE_09)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_07%~x1%" (GOTO MAKE_08)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_06%~x1%" (GOTO MAKE_07)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_05%~x1%" (GOTO MAKE_06)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_04%~x1%" (GOTO MAKE_05)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_03%~x1%" (GOTO MAKE_04)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_02%~x1%" (GOTO MAKE_03)
if exist "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_01%~x1%" (GOTO MAKE_02)

echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_01%~x1%" /K /Y
exit

:MAKE_10
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_10%~x1%" /K /Y
exit

:MAKE_09
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_09%~x1%" /K /Y
exit

:MAKE_08
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_08%~x1%" /K /Y
exit

:MAKE_07
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_07%~x1%" /K /Y
exit

:MAKE_06
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_06%~x1%" /K /Y
exit

:MAKE_05
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_05%~x1%" /K /Y
exit

:MAKE_04
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_04%~x1%" /K /Y
exit

:MAKE_03
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_03%~x1%" /K /Y
exit

:MAKE_02
echo F |xcopy "%~f1" "%~d1%~p1%~n1_old_%date:~-10,4%%date:~-5,2%%date:~-2,2%_02%~x1%" /K /Y
exit

:NOT_MAKE
echo msgbox "バックアップは10世代まで  " > %TEMP%/msgboxtest.vbs & %TEMP%/msgboxtest.vbs

```

このバッチで作成されるバックアップファイル名は下記の様に、拡張子の前にoldと日付と連番を入れるようにしています。
<ファイル名>_old_YYYY_MMDD_NN.<拡張子> 
※NNは連番

好みがあると思うので、そこは自由に変えてみてください。

## 右クリックしたときの送るにバッチファイルを指定
「Windows」＋「R」でファイル名を指定して実行を開き、「shell:sendto」と入力し「OK」をクリック。
そうすると、SendToのフォルダが開くので、作成したバッチファイルのショートカットか、batファイル自体を置く。


これで、対象ファイルを右クリックして「送る」メニューからバックアップファイルを作成できます。
xcopy でコピーしているので、ネットワークドライブ上のファイルやUNCパスのファイルもコピーできます。
MySQLの文字コードの設定

####MySQLの文字コードの確認

<pre>
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.010 sec)

</pre>

####MySQLの文字コードの変更
変更する際はmy.cnfファイル内に記述する（下記は例）
<pre>
[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8mb4
</pre>

設定につきましては下記の参考リンクに詳しく書いているため省略します。
・[MySQLの文字コードとCollation](https://qiita.com/yukiyoshimura/items/d44a98021608c8f8a52a)
・[MySQLの文字コード事情](https://www.slideshare.net/tmtm/mysql-62004569)
・[MySQL 文字コード確認]
(https://qiita.com/tfunato/items/e48ad0a37b8244a788f6)

####データベースの文字コード確認
<pre>
mysql> show create database [DB_NAME];
</pre>
####データベースの文字コード修正
<pre>
ALTER DATABASE [DB_NAME] DEFAULT CHARACTER SET [文字コード];
</pre>

####テーブルの文字コード確認
<pre>
mysql> show create table [TABLE_NAME];
</pre>
####テーブルの文字コード修正
<pre>
ALTER TABLE testtable CONVERT TO CHARACTER SET [文字コード];
</pre>

下記参考リンク
・[[MySQL]mysqlの文字コード確認と変更方法のまとめ](http://babyp.blog55.fc2.com/blog-entry-838.html)
Pythonを使ったRandom Forest（ランダムフォレスト）で疾患分類

#目的
<b>自分のメモ用。</b>
Random Forest（ランダムフォレスト）を使って疾患Aと疾患Bを分ける。
入力したバイオマーカの内どれが重要かを調べる。
[UCLの先行研究](https://n.neurology.org/content/87/23/2463.long)では、Accuracy74.0%だったのでそれを超えることが目標。

コードと解説は、[こちら](https://www.aiprogrammers.net/entry/2020/04/28/214214)に記載しました。
[【機械学習】Random Forestで疾患分類](https://www.aiprogrammers.net/entry/2020/04/28/214214)

#まとめ
今回は、Random forestを使って疾患分類をしてみた。
我々の実験だと75.4%で先行研究の74.0%より1.4%高かった。
先行研究ではGray matter volumeのみであったが、我々はdiffusion MRIから得られるmapを入力。
とりあえず、SensitivityとSpecificityを調べたい。
【Powershell】パワーシェルでメールを送信

メモとして残します。


#■やり方
```testsendmail.ps1

# メールサーバ設定
$MailSv = "localhost" #ipaddress or host name
$Port = 25
$Encode = "UTF8"
# 送信元
$From = "from@test.com"
#TO CC BCC
$To  = @("to1@test.com", "to2@test.com", "to3@test.com")
$Cc  = @("cc1@test.com", "cc2@test.com", "cc3@test.com")
$Bcc = @("bcc1@test.com", "bcc2@test.com", "bcc3@test.com")
# 件名
$Subject = "❤テストメール❤"
# 本文
$Body = @"
テストメールです。❤
テストメールです。❤
テストメールです。❤
"@

#添付ファイル
$Attachments = @(
    "file1.txt",
    "file2.txt"
)

Send-MailMessage `
    -From $From `
    -To $To `
    -Cc $Cc `
    -Bcc $Bcc `
    -Attachments $Attachments `
    -SmtpServer $MailSv `
    -Encoding $Encode `
    -Port $Port `
    -Subject $Subject `
    -Body $Body
```
上記ファイルを任意の場所に保存。
後は下記のコマンドをcmdか、pwoershell上で実行。
`powershell -ExecutionPolicy RemoteSigned 保存先パス\testsendmail.ps1`

#■さいごに
わりと簡単に送信できるので、windows server 等でメールを送信する際はこれで問題なさそうです。
Pepper SDK入門(16)  Autonomous Abilities①

今回からはQISDKのAPIについて勉強していきたいと思います。
#Autonomous Abilities
**目的**

- Pepperを常に活動状態にしておく。
- 細かい実装抜きで、Pepperが生きているように知覚してもらう。

**動作原理**
Autonomous Abilityは、Pepperのバックグラウンドにおいて自律的に動作します。

**Autonomous Abilityの種類**
<table border="1"><tbody><tr><th>Autonomous Ability</th><th>タイプ</th><th>条件</th></tr><tr><td width="250px">BackgroundMovement</td><td>受動</td><td>待機時間</td></tr><tr><td>BasicAwareness</td><td rowspan="2">反応</td><td>何らかの刺激に反応</td></tr><tr><td>AutonomousBlinking</td><td>人間に反応</td></tr></tbody></table>
**Autonomous Abilityの調整**
HolderBuilder.withDegreesOfFreedomで、Autonomous Abilityの自由度を制限することが可能です。
例えばDegreeOfFreedom.ROBOT_FRAME_ROTATIONは、Pepperの回転運動を妨げます。
*HolderBuilder.withDegreesOfFreedomを使用したい場合は、アプリのAPIバージョンを6以上にしてビルドし直してください。*

```java

Holder holder = HolderBuilder.with(qiContext)
        .withAutonomousAbilities(AutonomousAbilitiesType.BACKGROUND_MOVEMENT)
        .build();

holder.async().hold();

holder.async().release();
```
**優先順位**
Pepperにおける優先順位は、ブリンキング(待機時間での目のLEDの点滅)、人の検知、[Say](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/reference/say.html#say)や[Animate](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/movement/reference/animate.html#animate)といったアクションの順に高くなります。

**参考**

- アニメーションの終わりでPepperに姿勢をキープさせたい場合は、Holderを用いてBackgroundMovementとBasicAwarenessをholdする必要があります。
- 発話中、聞き取り中はボディーランゲージが自動で動作します。その際にスクリーンを固定したい場合は、SayやListenのボディーランゲージを無効にしてください。より詳しく知りたい方は[Say](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/reference/say.html#disable-body-language-say)や[Listen](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/reference/listen.html#disable-body-language-listen)を参照してみてください。
- ChatとQiChatbotの発話・聞き取りを使用している場合、発話中のボディーランゲージはQichatbotで、聞き取り中のボディーランゲージはChatでそれぞれ無効にすることができます。

#AutonomousBlinking
Pepperは誰かを見ている時、あるいは対話型アプリケーションの時など、時々目のLEDが点滅します。これにより、ユーザーにとって不快な印象を与えず、Pepperが自然に瞬きしているように見せる効果が期待できるようです。なお、目のLEDがピンク色の時は、新規ユーザーを見ている時です。

#BackgroundMovement
BackgroundMovementによって呼吸に似た動きを実行することで、Pepperはまるで生きているかのような振る舞いが可能です。
BackgroundMovementは優先順位の高いタスクのない際、Pepperが自律的に動かすことが可能な本体上部を動かしています。[GoTo](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/movement/reference/goto.html#goto)のような他のアクションが割り込んできた際は、バックグラウンドでそのアクションが終了するのを待機する仕組みになっています。

#BasicAwareness
BasicAwarenessによって、Pepperは周辺の物質や人の検知ができるようになります。人検知だけでなくバンパーや手への接触によっても頭部及び体が刺激の方を向くようになっています。また刺激を検知した直後など、そうした人を対象にトラッキングを行うことも可能です。[LocalizeAndMap](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/movement/reference/localize_and_map.html#localize-and-map)と[Localize](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/movement/reference/localize.html#localize)を使用し周辺の地図情報を作成することで、全方位の人検知ができます。
docker-composeでpostgresqlに接続してschemaのversionを削除するまで

誤ってupされたマイグレーションファイルを削除してしまった。
他にまとまって記載されている情報が見つからなかったため記載します。

# 作業手順
- コンテナ起動
- イメージに接続
- データベースに接続
- scheamのレコード確認
- 該当するversionのレコードを削除

# コマンド
**コンテナ起動（起動済みであれば不要）**

````
# docker-compose up -d
```
**起動状態の確認**

````
# docker-compose ps
#=>      Name                    Command               State 
-------------------------------------------------------------
       hogehoge             hogehoge postgres              Up     
````

**コンテナに入る**

````
# sudo docker exec -it hogehoge /bin/bash
````
**DBに接続する**
usernameは`docker-compose.yml`を参照

````
# psql -U USERNAME
````
**データベースの一覧を表示**

````
# \l
````
**データベースに接続**

````
# \c DATABASENAME
````
**テーブル一覧を表示**

````
# \dt;
````
**スキーマテーブルに入っているレコードを確認する**

````
# select * from schema_migrations;
````
**該当するversionを削除**

````
delete from schema_migrations where version='NUMBER'
````
初心者でもできる‼PlotlyでSankeyDiagramを簡単に書く方法

# SankyDiagramとは
サンキー・ダイアグラム(英Sankey diagram)は工程間の流量を表現する図表である。
矢印の太さで流れの量を表している。特にエネルギーや物資、経費等の変位を表す為に使われる。
出典:[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%82%AD%E3%83%BC_%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)

# plotly(PlotlyExpress)で実装するメリット
* データフレームを読み込める。
* コードが簡単に書ける。
* インタラクティブなグラフなので、ユーザーが動かすことができる

# PlotlyでのSankeyDiagramの実装
```python
import pandas as pd
import plotly.express as px

# DF生成
# 1行のデータが推移を表すようにデータフレームを作成する
df =pd.DataFrame([['Cat1', 'CatA-2', 'AI', 'Normal'],
                  ['Cat1', 'CatA-3', 'AI', 'Normal'],
                  ['Cat1', 'CatA-3', 'No', 'NG'],
                  ['Cat3', 'CatA-3', 'Random', 'Normal'],
                  ['Cat3', 'CatA-5', 'Random', 'NG'],
                  ['Cat3', 'CatA-1', 'Random', 'NG'],
                  ['Cat3', 'CatA-1', 'No', 'NG']],
                columns=['one','two','three',"output"])

# カテゴリー変数をダミー変数に
# データフレーム最終列が文字列だとエラー？
df["output"] = pd.get_dummies(df["output"])

fig = px.parallel_categories(df, 
                             dimensions=['one','two','three','output'],
                             color="output",
                             color_continuous_scale=px.colors.diverging.BrBG,
                             labels={'one':'FirstArea', 'two':'SecondArea', 'three':'ThirdArea','output':'output'}
                            )
fig.show()

```

![newplot (69).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/8088193e-75b2-d5a4-cb1b-080938d57396.png)
curlを使ってwebhdfsへアップロード、ダウンロードする

いつも忘れるのでメモ

ダウンロード方法

```
curl "http://(webhdfs_server):14000/webhdfs/v1/hoge/fuga/ahahaha.gz?op=OPEN&user.name=hdfs" > ahahaha.gz
```

アップロード方法
GZファイルであれば下記のようにヘッダーが必要。

```
curl -X PUT "http://(webhdfs_server):14000/webhdfs/v1/hoge/fuga/ahahaha.gz?op=create&data=true&user.name=hdfs" -T ./ahahaha.gz --header "content-type: application/octet-stream"
```

詳しくは下記を参照しましょう。

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
大規模日本語ビジネスニュースコーパスを学習したALBERT（MeCab+Sentencepiece利用）モデルの紹介

#はじめに
以前、日本語の[BERT事前学習済モデル](https://qiita.com/mkt3/items/3c1278339ff1bcc0187f)や[XLNet事前学習済モデル](https://qiita.com/mkt3/items/4d0ae36f3f212aee8002)等の紹介記事を投稿しましたストックマークの森長です。
モデル公開の記事を多くの皆様に読んでいただき、ありがとうございます。

今回は、ALBERTの日本語事前学習済モデルを公開します。
さて、様々な事前学習済モデルが多数提案されている中、なぜALBERT日本語モデルを公開するかといいますと、ALBERTが、A Lite BERTと記載されるように、ただSOTAを突き詰めたものではなく、精度を維持・向上させつつもBERTを軽量化しているモデルのためです。

事前学習済モデルのサイズを大きくすると性能が向上する傾向にありますが、学習時間が長くなったりメモリにのらなくなったり、作成の上での制約が(費用面の制約も)増えてきます。そのため、比較的短時間でモデルを作成でき、モデルサイズが小さいALBERTは、とても使いやすいです。

#ALBERTとは
ALBERTとは、BERTを以下の手法を用いて、軽量かつ高速に学習できるよう提案されたモデルです。

- 因数分解とパラメータ共有を利用したパラメータ削減
    - モデルサイズの縮小、学習時間の低減に寄与
- BertのNext Sentence PredictionタスクをSentence Order Predictionタスクに変更
    - モデルの精度向上に寄与

ここでは作成したモデルのパラメータ/実験設定を述べるに留め、ALBERTというモデルの詳細説明については割愛させていただきます。

# 弊社のALBERT事前学習済モデルの特徴
## 学習元データ
以前公開しましたBERTの事前学習済モデルと同様に学習用データを日本語ビジネスニュース記事としています。そのため、本モデルは、主にビジネスに関するドメインで効果を発揮します。

## tokenizer
弊社では、tokenizerにMeCab + NEologd及びSentencepieceを利用して、文章をトークン化しています。
まず、MeCabを利用することで形態素として正しく分割し、その上でSentencepieceを行うことで、語彙のカバー範囲を広げています。

## 事前学習済モデルの詳細
| 事前学習用データ | トークナイザー | 語彙数 | 正規化| シーケンス長|
|:--|:--|:--|:--|:--|
|日本語ビジネスニュース記事(300万記事)| MeCab +  NEologd 及び Sentencepiece | 32,000語 | NFKD ※| 128 |

※正規化がNFKDである理由は、[公式実装](https://github.com/google-research/ALBERT/blob/4c601a1c096e85b1639460ea6b890ba5a8d2b3ee/tokenization.py#L98)がNFKDのためNFKCにするとライブラリの修正やメソッドのオーバライドが必要になることと、[弊社でXLNetのモデルを作成した際](https://qiita.com/mkt3/items/4d0ae36f3f212aee8002#nfkd%E3%81%A8nfkc%E3%81%AE%E6%AF%94%E8%BC%83)にNFKDとNFKCで結果に明確な差異が無かったためです。

#ダウンロード
[公式(TensorFlow)](https://github.com/google-research/ALBERT)と[PyTorch版](https://github.com/huggingface/transformers)で利用可能なモデルを公開します。

[ダウンロードリンク](https://drive.google.com/drive/folders/19iCO-KLwVpzFdC7zojhGjkjwomRYCQ97?usp=sharing)
モデルの内訳は以下の通りです。

- TensorFLow版
 - model.ckpt.meta、 model.ckpt.index、 model.ckpt.data-00000-of-00001、 checkpoint
 - config.json
 - spiece.model (Sentencepieceのモデル)
- PyTorch版
 - pytorch_model.bin
 - config.json
 - spiece.model (Sentencepieceのモデル)

#利用方法
事前学習済モデルの使用にあたっては、TensorFlow版及びPyTorch版で公開されているサンプルスクリプトで動作しますが、入力データ(入力文章)をMeCab+NEologdでわかち書きしてください。

# ALBERTの日本語事前学習済モデルを利用した所感
## BERTとの比較
弊社の検証用タスク（記事の分類）においては、ALBERT-baseがBERT-baseを1%程度下回る性能となっていましたが、ALBERTはパラメータ数がBERTに比べ大幅に削減されている中で、この精度は十分実用的です。
論文でも同様にbaseモデルの比較ではALBERTの性能が少しだけ低く報告されていますが、ALBERTの凄いところは、BERT-baseモデルよりも少ないパラメータ数(モデルサイズ)のALBERT-largeで、BERT-baseの性能を越えています。
(具体的な数値は[論文](https://arxiv.org/pdf/1909.11942.pdf)のTable 2をご参照ください。)

今後はALBERT-large、xlarge、xxlargeと同等のパラメータサイズのALBERTモデルを作成して利用していきます。

## モデルサイズについて
リソースが限られている中で、モデルサイズが50〜500MB程度に抑えられることは以下の点でとても使いやすかったです。(モデルサイズが大きいと何かと待ち時間が増えてしまいます…)

- 事前学習・検証・推論時のHDD,SSDの容量削減
- デプロイ(モデルのダウンロード速度等)の高速化

#まとめ
最後までお読みいただき、ありがとうございました。
BERT、XLNet等と同様に公開したALBERT事前学習済モデルが、自然言語処理の盛り上がりに少しでも貢献ができると大変嬉しいです。
【Python】ウェブサイトの最終更新日を取得

#大雑把でもいい。サイトの更新日を知りたい。
クロールしたサイトをサイト更新の日付順に並び替えたいのですが、サイトの更新日を取得する方法がわからなかったので調べました。


##参照
[pythonでＷＥＢ上に置いてあるファイルのタイムスタンプの取得を行いたい。投稿 2017/10/13 14:41](https://teratail.com/questions/96163)
[Last-Modified](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Last-Modified)
>HTTP の Last-Modified レスポンスヘッダーは、リソースが最後に変更されたとオリジンのサーバーが判断している日時を含みます。これは受信または保存されたリソースが、同じものであるかを判断する検証材料として使用されます。 ETag ヘッダーよりも精度は低く、その代替手段になります。


#実装

```get_lastmodified.py
import requests
res = requests.head('https://www.kantei.go.jp')
print(res.headers['Last-Modified'])

import datetime
html_timestamp = datetime.datetime.strptime(res.headers['Last-Modified'], "%a, %d %b %Y %H:%M:%S GMT")
print(html_timestamp)

```

```
% python get_lastmodified.py
Mon, 17 Feb 2020 08:27:02 GMT
2020-02-17 08:27:02
```
datetimeの標準フォーマットへの変換も行っています。



##追記
この方法が動的サイトであまりに非力なので、もう少し考えてみました。

[サイトの更新日を真面目に取得する](https://qiita.com/KanikaniYou/items/4f5263a7f2299f4d86e9)
〇〇駆動開発の｢駆動｣とはなにか

## はじめに

エンジニアをしていると､〇〇駆動開発や〇〇駆動設計という言葉を聞く機会があるかと思います｡
ただ､この間友達と話していて､｢駆動開発｣の意味が分かってなくてそれぞれの手法が理解しづらいんだろうなという人がいたため､
｢駆動｣とはなにかを共有します｡

## 駆動とは

｢駆動｣とは､｢動力を伝えて動かすこと｣です｡(｢デジタル大辞泉｣引用)

例えば､車には前輪駆動と後輪駆動があります｡
後輪駆動は､後輪が動力となり､その動力が元となって前輪も回り前に進みます｡

また､駆動は英語で｢driven｣です｡

drivenは､driveの過去分詞で､動かす､走らせるといった意味があります｡
先程の例で行くと､後輪駆動は､後輪が回ることによって車を走らせるという意味になります｡

## 駆動開発とは

｢駆動｣が走らせるという意味なので､｢〇〇駆動開発｣は開発を〇〇によって走らせるということになります｡
つまり､
*開発の軸として〇〇があり､それを元に開発が進む*
ということです｡

## テスト駆動開発(駆動開発の例)

テスト駆動開発(TestDriven Development)は､テストによって駆動します｡
テストを書いて､そのテストが通るようにし､その後リファクタリングという流れになります｡

勘違いされがちですが､テストを書けばテスト駆動開発というわけではないですし､
テスト駆動開発をすればバグが0になるわけではないです｡
また､テスト駆動開発を行っても製品が完成後はテストが必要です｡

じゃあテスト駆動開発とは何なのか?

また､これを理解しやすくするために､従来の開発は何に駆動しているかを明確化します｡
従来の開発は､｢実装→テスト→完成｣となるかと思います｡
実装によって､開発が進むので､これは｢実装駆動開発｣と呼べるのではないでしょうか?

テスト駆動開発: ｢テスト→実装→(テスト)→完成｣
実装駆動開発: ｢実装→テスト→完成｣

## 余談

最近､ウォーターフォールといいながら納期によって開発ボリュームが左右されることがあったり､
要件が追加されることがあってなんか気持ち悪いと思っていました｡
ただ､ウォーターフォールといいながらやっていることは｢納期駆動開発｣なんだなと思うと､
なんとなく腑に落ちました｡

ちなみにアンサイクロペディアには､[締め切り駆動開発](http://ansaikuropedia.org/wiki/締め切り駆動開発)というものがあるようです｡
IoT Centralのデータを他のAzureサービスに連携する【アプリケーションの構築】

**AzureのIoT系SaaSサービスの「IoT Central」**を活用する方法についてまとめていきます。

#IoT CentralとAzureサービスの連携
IoT CentralはSaaSのサービスであるため、取り立てて連携の必要がないようにも思われるかもしれないですが、
基本的にはIoTデバイスを管理し、データを見て、一定の閾値に対して反応を返すことが主な役割であるので、IoTを始めるうえでのお手軽なサービスとしては有用と考えられます。
今回はIoT Centralでデバイスを接続し、データの可視化を実施する方法を試したいと思います。

#IoT Centralを構築する
まず、IoT Centralを作成します。手順については大幅に割愛しますが、以下の公開情報より作成が可能です。
一点言及しておくと、最近新しい料金体系が導入され、以前より少しわかりにくくなりましたが、2台未満の検証もしくは今後本格的に利用を視野に入れており、メッセージ数が多い場合はStandard 2のプランを利用するほうが良いかと思われます。
https://docs.microsoft.com/ja-jp/azure/iot-central/core/quick-deploy-iot-central

#IoT Centralアプリケーションにデバイスを接続する
作成が完了したら、IoT Centralアプリケーションに接続するデバイスを定義します。
今回は既存の製品テンプレートを使用しないので、カスタムで作成します。
IoT Centralアプリケーションのメニューバーより「Device Templates」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/3d6b8e32-9558-8cf8-ef7e-7f4749af9b09.png)
Device Templatesの右上の3つあるアイコンの「＋(New)」を選択して、テンプレートを追加します。
作成するテンプレートの種類がいくつかありますが、「Custom」で作成します。
デバイスの製品名を決める必要があるので任意の名前でOKです。名前を決めたら「Create」を選択します。
次にデバイスが送信するデータを定義します。
「Device Template」から作成したデバイスを選択し、「Measurements」からデバイスの送信データを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/6464798d-9935-eba8-9f55-b2b6d6d7048f.png)
簡単に説明すると「Telemetry」は温度センサなどの値の表示が必要なデータ、「State」は1or0などで状態を表すデータ、「Event」はデバイス側で付随させて送られるデータ、「Location」は緯度経度を値とするデータの利用にそれぞれ適しています。
設定ができたら、「Save」で記載した設定を保存します。
**※かなり前に検証した際にはセンサデータは多数階層構造になっていないキーバリューペアの形式で送ることでIoT Centralアプリケーション側で認識することができました。Locationの場合はカンマで緯度経度を区切ることで対応できました。
　現在は詳細な公開情報がなくなっていて詳細にはわかりませんが、以下のシミュレーションデバイスと同様の送信データであれば利用できると思います。
　https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-raspberry-pi-web-simulator-get-started**

ここまでで、IoT Centralアプリケーションでデバイスからのデータを表示することができるようになります。
次にデバイスをIoT Centralアプリケーションに紐づける方法ですが、DPSを用いた証明書での認証をしない場合は以下GitHubのコマンドから接続文字列を生成します。DPSについては割愛します。
https://github.com/Azure/dps-keygen
生成した接続文字列を利用してIoT Centralアプリケーションへデバイスを接続します。

実際にデータを送信すると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/273d2413-87a0-d2f4-1dd2-428302fa3831.png)

#まとめ
以前に利用したときに比べて公開ドキュメントがかなり減少していましたが、仮想的なデータを表示することができたので、データ表示の内部仕様はそこまで変化していないように感じています。
とりあえず、公開情報をもっと充実させてほしい。。。切実に。
引き続きIoT Centralを利用したAzureサービスとの連携を実施していきます！
負の二項分布を前提としたGLM

```r
# データの読み込み
url <- 'https://raw.githubusercontent.com/ozt-ca/tjo.hatenablog.samples/master/r_samples/public_lib/jp/poisson_negbinom_sample.txt'
sample <- read.table(url, header = T)

# データの概要
head(sample)
sum(is.na(sample))

# 負の二項分布のパッケージ用意
install.packages("MASS")
library(MASS)

# モデルの学習
model.glmnb <- glm.nb(click ~ ., sample)
summary(model.glmnb)

# 説明変数の絞り込み 変数減少法
stepAIC(model.glmnb)

```
【JavaScript】第2引数でコールバックする関数をどうにかしたい

## とりあげる課題とその問題点

今回取り上げるものは以下のようなコード
実例は[kuromoji.js](https://github.com/takuyaa/kuromoji.js)

```typescript
(A: T, B: VoidFunction) => void
```

```javascript:kuromoji/example/load-node.js
"use strict";

var kuromoji = require("../src/kuromoji");
var DIC_DIR = "dict/";

// Load dictionaries from file, and prepare tokenizer
kuromoji.builder({ dicPath: DIC_DIR }).build(function (error, tokenizer) { // ここが問題のコールバック
    var path = tokenizer.tokenize("すもももももももものうち");
    console.log(path);
    module.exports = tokenizer;
});

// ここでtokenizerは使えない
```

このtokenizerはこのままではコールバック関数外では利用できない。
これはスコープの関係上当たり前だが、少々使いづらい。

しかもコールバック地獄の原因なので使いたくない

というわけでこれを

```typescript:test
const kuromoji = await tokenizer();
const res = kuromoji
      .tokenize('すもももももももものうち')
      .map(t => t.surface_form);

expect(res).toEqual(['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち']);
```

このようにfunctionalに書きたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/4f6fde5f-dbe5-cbd1-8a23-646951baaf79.png)

## 解決策

### new promiseする

```typescript:typescript
import kuromoji, { Tokenizer, IpadicFeatures, TokenizerBuilder } from 'kuromoji';

const builder: TokenizerBuilder<IpadicFeatures> = kuromoji.builder({
  dicPath: 'node_modules/kuromoji/dict',
});

export const tokenizer = () => new Promise<Tokenizer<IpadicFeatures>>(done => {
  builder.build((_err, tokenizer) => {
    done(tokenizer);
  });
});
```

こうすると

```typescript:test
const kuromoji = await tokenizer();
const res = kuromoji
      .tokenize('すもももももももものうち')
      .map(t => t.surface_form);

expect(res).toEqual(['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち']);
```

## まとめ

取り上げたコードの名称を「継続」っていうらしいです。
async/await世代なので少し詰まった。

## 参考文献

<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function>

<https://nymphium.github.io/pdf/ae_from_0.pdf>
IQ Botって何？　-紙業務を自動化するためのRPAツール-

こんにちは。

Automation Anywhere の IQ Bot にはPythonのスクリプトを書く機能があるので、
そのチートシートを作るためにQiitaを始めました！

が、記念すべきQiita初投稿となる今回は、
まずはIQ Botって何？　というところから書いていきたいと思います。

# IQ Botって何？

製品の公式サイト↓には何かいろいろすごいことを書いていますが……
https://www.automationanywhere.com/jp/products/iq-bot

平たく言えば、「今、紙を使ってやっている業務を、RPAによる自動化に届かせるためのツール」です。

# 紙をインプットに自動化ができるメリット

今では日本企業の多くがRPAを導入していますが、
そのRPA、ちゃんと効果出てますか？

この質問に胸を張って「イエス！」と答えられる人は、けっこうレアだと思います。

これにはいくつか原因があるのですが、日本企業にはびこる「紙は偉大なり」の文化もそのひとつです。

## 紙が自動化（RPA化）のネックになる理由

業務をRPAを使って自動化するためには、いくつかの前提があります。

そのひとつが、「自動化対象業務のインプットとなるデータが構造化されている」ということです。

ちょっと難しい言葉を使いましたが、要するに、

**ExcelとかCSVとかデータベースに入っているような形でデータが整備されている状態じゃないと、**
**そもそもRPAによる業務自動化の対象にならない**

ということです。

つまり、**業務に紙がからんでいる限り、RPAによる自動化はできない** というのが、従来の常識でした。

そして、せっかくRPAを使って業務を自動化しよう！　と思った会社の担当者たちが、

あの業務も紙を使ってる、この業務も紙を使ってる……ということで、

**「結局自動化できる業務なんてほとんどないじゃーん！」** と挫折をしていく……という光景が、多くの企業で繰り広げられていました。

IQ Botはまさに、この部分を解決するツールです。

## IQ Botで、紙を使った業務を自動化

IQ Botは、 **「異なるフォーマットの紙（画像）データから、構造化データを取り出す」**　という仕事をやってくれます。

![IQ Botは紙（画像）から構造化データを取り出すツール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/9e781a94-bb1c-2aee-dd6a-0318f4fec520.jpeg)
↑出典：
https://enterprisezine.jp/article/detail/12732?p=2

これができると、従来は自動化の対象から漏れてしまっていた、たとえば以下のような業務を自動化することができるようになります。

- 紙を見て、書いてある内容をデータ入力する業務
- 何かのシステムのデータと紙を照合・突合する業務
- 紙と紙とを照合・突合する業務

わかりやすく「紙」と言っていますが、メールに添付されてくる注文書や請求書のPDFなども対象になります。

これらの業務について、RPA化を諦めた経験はありませんか？

そんなRPA難民たちを救うべくして現れたのがAutomation Anywhere の IQ Bot です。

# まとめ

- IQ Botは紙業務を自動化（RPA化）の対象にするためのツールだよ

今後はIQ Botの使い方や、Pythonで書けるカスタムロジックのチートシートなどを公開していきたいと思います。
Slackワークフロービルダー×2を使って社内セミナー申込をつくる

## モチベーション
- [simple poll](https://simplepoll.rocks/)を使って運用していたが無料プランだと100投票/月の制限があることに気づいた
- 形式ばった募集ではなくラフに申し込みを受け付けたかった
- **ワークフロービルダー使ってみたかった！**

## できたもの
1. 「#セミナー受付_運営」チャンネルから「新規募集開始」アクションを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/afc63b1e-aba8-742a-ce96-ee664c00e9c4.png)

2. 入力フォームが表示されるので必要項目を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/ef580d6f-0e64-5062-1455-a6def2cd9bcf.png)

3. 「#セミナー受付」チャンネルに入力した内容が投稿される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/d13712dd-d09e-c4f2-616e-3e281102fe78.png)

4. 参加したい人はメッセージに:hand:でリアクションする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/87126055-da93-1218-2b6d-fafae85f155e.png)

5. リアクションするとメッセージのスレッドへの投稿と「#セミナー受付_運営」にも誰が参加を表明したのかが投稿される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/f9e1316a-6c09-fa04-d22b-5dc5035cfeae.png)

## 作り方
### セミナー募集_サンプル
全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/4a614432-898d-7d9e-809d-2c24860d188d.png)

1. トリガー
募集を開始する際のトリガーはアクションメニューに設定する。
募集と同じチャンネルでもよかったが誰でも実行できてしまうとカオスになるので運営用のチャンネルに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/d6d9a7fd-f552-3058-21b9-6ca2f0c14889.png)

2. フォームの作成
任意の項目を設定する。
一応募集内容を同じチャンネルにリマインドする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/a60675d0-3708-473b-9828-3e031c5e83fa.png)

3. メッセージの送信
入力フォームの内容を変数として利用し、メッセージを成形する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/dbd07031-00a3-e095-359d-a9577e54dd16.png)

### セミナー参加_サンプル
全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/debcbafd-0dc2-9e0c-2072-080a4611f57a.png)

1. トリガー
絵文字リアクションをトリガーに登録し、「セミナー募集_サンプル」で投稿したメッセージにリアクションしてもらう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/225c9d92-d6d1-aa07-72b9-d6c4ee92c1a8.png)

2. スレッドにメッセージ送信
参加者に申し込み状況を伝えるためにスレッドへ投稿
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/3791cbd1-3f89-8a4a-9cfd-68abb708e649.png)

3. メッセージを投稿
運営チャンネルに申し込み者の情報を投稿
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/8433ec6c-b104-7c39-f111-9ca1a6712021.png)

## 課題
- メッセージに対するボタンを設定してユーザーのアクションを促すことができるが、ワークフローと1対1の関係なので一人がリアクションするとワークフローが進んでしまう
- 上記のため募集と受付でワークフローを分割した
- フォーム作成に日付ピッカーが欲しい
- 申し込みキャンセルは考慮できていない

## 感想
ノンプログラミングでセミナー参加者募集の仕組みが作れました。
非エンジニアでも使える便利な仕組みだと思いますが可変テキスト（変数）のあたりが若干とっつきにくいかもしれません。
機能的には「あとちょっと」という感じですが、今後もどんどん機能がアップデートされると思うので非常に注目しています。
※個人的に外部APIを叩ける機能があればすごく幅が広がるので期待しています！
サルでも分かるwxpythonのデバッグ

# wxpythonをTDDする

## wxPythonとは

Pythonで作ったソフトにGUIをくっつけるものです。
Qtなどが競合となります。

## TDDとは

テスト駆動開発(test-driven development)を指します。
型や関数の入出力を保証しながら開発ができます。

# 実装

## 準備: 開発環境

以下の環境での例を示します。

|種類|バージョン|
|:---|:---|
|OS|泣く子も黙るWindows 10|
|Python|3.6.6|
|wxPython|4.0.6|


## 準備: フォルダ構成

フォルダを以下のように作ります。`dialogTextctrl.py`の方に、サンプルコードを書きます。

```bash 
$ ls samples/{dialogTextctrl,__init__}.py
samples/__init__.py  samples/dialogTextctrl.py
```

## 実装例

今回の実装例では、クラスとそのテストケースを
同じファイルに書きました。現実には、
クラスとそのテストケースは分けて書くことになると思います。

unittestについて、`unittest.TestCase`を継承した
クラスを書きます。そのクラス内で定義されている
`test_`で始まるメソッドを全てテストしていきます。
テスト時の出力が特定の値になるのかをチェックするので、
`unittest.TestCase`拡張クラスで`self.assertEqual(a,b)`や
`self.assertTrue(val_boolean)`などを
`test_`メソッドの末尾で呼んでテストの成否を決めます。

テストの前後に準備が必要な場合、`unittest.TestCase`継承クラス内で
`setUp(self)`や`tearDown(self)`といったメソッドの定義も必要となります。

```python:samples/dialogTextctrl.py
import wx
import unittest

class MyDialog(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self, None, -1, 'My Dialog', size=(200, 400))
        self.components = [
            wx.StaticText(self, wx.ID_ANY, "CONTENT TITLE"),
            wx.TextCtrl(self, wx.ID_ANY, "INITIAL TEXT")
        ]
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.components[0], 1)
        sizer.Add(self.components[1], 1)
        self.SetSizer(sizer)


class TestMyDialog(unittest.TestCase):
    def setUp(self):
        self.app = wx.App()
        self.dialog = MyDialog()
        #result = self.dialog.ShowModal()
    def test_n_components(self):
        self.assertEqual(len(self.dialog.components), 2)
    def tearDown(self):
        self.dialog.Destroy()


if __name__ == '__main__':
    unittest.main()
```

## 実行結果

`python -m LIBRARY_NAME`というコマンドを実行すると
`LIBRARY_NAME`というライブラリのmain関数を実行することになります。
`unittest`の場合には続けざまに実行したいテストケースの
クラスを呼ぶことで、そのクラスだけをテストすることが可能です。

`test_n_components`メソッドではMyDialogの要素`components`が
いくつの要素を持つのかをチェックしています。


```bash 
$ python -m unittest samples.dialogTextctrl.TestMyDialog
.
----------------------------------------------------------------------
Ran 1 test in 0.020s

OK
$ python samples/dialogTextctrl.py
.
----------------------------------------------------------------------
Ran 1 test in 0.019s

OK
```

# まとめ

wxpythonでソフトウェア開発するさいの、
python標準実装のunittestを利用したTDDの例を
示しました。
テストの種類によっては`dialog.ShowModal()`メソッドを
呼ばなくともテストが完了することが分かりました。
RSpec実行時にCapybara::NotSupportedByDriverErrorエラーが出るとき→js: trueになっているかを確認する

RSpecを実行したら下記のようなエラーが出た場合。

```
     Failure/Error: page.save_screenshot('test.png')

     Capybara::NotSupportedByDriverError:
       Capybara::Driver::Base#save_screenshot

     # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/driver/base.rb:51:in `save_screenshot'
     # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/session.rb:724:in `block in save_screenshot'
     # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/session.rb:724:in `tap'
     # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/session.rb:724:in `save_screenshot'
```

`js: true`になっているかを確認。

```ruby
RSpec.describe 'XXX', type: :system do
```
```ruby
RSpec.describe 'XXX', js: true, type: :system do
```

ここが抜けていたためエラーになっていました。
地味な見落としでした。

`js: true`にすることで、`Capybara.javascript_driver`(デフォルトでは`:selenium`)が利用されます。
N予備校の教材縛りで割といけてるWebサービスが作れた！

[N予備校のプログラミング入門コース](https://www.nnn.ed.nico/pages/programming/)が本格的だと最近話題ですね！
というわけでN予備校入門コースの技術を使って、1からWebサービスを作ってみました！
（ゆるい縛りプレイみたいな感じ）



# 作ったサービス
https://www.meish.me/
バーチャルキャラクターのためのプロフィール登録サービスです

開発は1人（テスターさん除く）で、開発期間（リリースまで）は2ヶ月ちょいでした。
プログラミング初心者ではないですが、Webサービスをリリースするのは初めてです。

リリースから2日で400名以上のバーチャルなキャラクターさんが登録してくれていて、わりとちゃんとしたWebサービスになってるかなと思います！

**TOPページ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525963/36cf3679-1115-bece-9f58-3ed6446a1ccf.png)
**プロフィールページ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525963/bcb7fa40-9b18-6d3b-7827-9b4ce8ffbd73.png)

**GitHub**
https://github.com/OkuriSae/Meish

# 使った技術
必要に迫られない限り、N予備校のプログラミングコースで学べる内容で進めました！
プログラミング入門コースを終えた時点で以下の環境ができてるので、すぐに開発が始められて便利 (◦ˉ ˘ ˉ◦)

### 今回使った技術のうち、N予備校で教えてくれるもの
- 第１章
  - VSCode, JavaScript, HTML, CSS, Tweetボタン
- 第２章
  - VirtualBox, Vagrant, Ubuntu, git, GitHub
- 第3章
  - Node.js, Pug, PostgreSQL, sequelize, Bootstrap4, Heroku
  - 脆弱性対策(XSS,CSRFとか)
- 第４章
  - Express, webpack, Passport
- 特別付録コース
  - TwitterAPI

### 今回使ったもので、N予備校に無いもの
- [Google Domain](https://domains.google/intl/ja_jp/)
  - meish.me のドメインを取得しました
- [Amazon S3](https://aws.amazon.com/jp/s3/)
  - アップロード画像の保存先に使いました 
  - Herokuでは画像保存ができないので仕方なし！
- [Jimp](https://www.npmjs.com/package/jimp) （画像処理のnpmモジュール）
  - 画像の圧縮やリサイズに使いました
  - 画像そのまま保存するとデータ転送量が大変…
- [OGP/TwitterCard](https://ogp.me/)
  - ツイッターやSlackにURLを貼ると画像が展開されるアレ！
  - HEADにメタタグを入れるだけなのでカンタン

# 本番リリースまでに追加でやったこと
N予備校の教材に書いてあること以外で、本番リリースまでにやったことです！

### Twitterのデベロッパー申請した
GitHubのアプリケーション登録と違い、Twitterはデベロッパー申請が必要です！
Google翻訳を使いながら英語で申請文を作りましたが、N予備校の特別付録にやり方が載ってたので助かり。審査とかで１週間ぐらいかかりました。

### Google Domainで`meish.me`のドメインとった
なんとなくGoogle Domainでとっちゃったけど、DMMやお名前ドットコムの方が初年度すごい安いのでそっちがいいかも。`meish.me`のドメインは年2,600円ぐらいかかるみたいです。（料金はドメインによって違います）
Herokuに転送するためにはサブドメインを切る必要があるみたいなので、`www.meish.me`のサブドメインを作りました（サブドメインを作るのはタダ）。

### HerokuのDynoPlanを`Hobby`にしてSSL設定した
独自ドメインを使ったり、SSL証明書の設定をするのはHobbyプランからみたいでした。Hobbyプランは$7.00/月です。HobbyプランだとサーバーのリージョンがUSとかUKしか選べないので、ちょっと遅いことがあるかも。

### meish.meのドメインからHerokuのドメインに転送する設定やった
meish.meのドメインでHerokuに繋がるようにする設定をしました。
Heroku側にドメインを登録すると`DNS Target`とやらをもらえるので、Googleドメイン側でその`DNS Target`に転送するように設定しました。

### HerokuのPostgreSQLのプランを`Hobby Basic`にした
HerokuのPostgreSQLアドオンは`dev`プランだと合計5万件しかデータを作れないみたいなので、1千万件までデータを保存できる`Hobby-Basic`プラン（$9.00/月）にしました。サービスの種類や設計によっては`dev`プランでも全然大丈夫かも。

### Herokuで画像保存してたらデプロイや再起動のたびに画像が消えちゃったのでAmazon S3にした
Herokuはデプロイのタイミングや1日1回行われるサーバーの再起動で、サーバーをコンテナごと作り直すので、ローカルに作ったファイルなどが消えてしまうみたいです。
裏技としてデータベースにBlobで画像をおいておく方法があるみたいですが、今回は素直に外部ストレージ（Amazon S3）を使うことにしました。

### OGPとかTwitterCard用のメタタグをいれた
URLをTwitterとかで拡散してもらいたいので、画像展開されるOGP/TwitterCardの設定をしました！HTMLのHEADスペースにOGPやTwitterCard用のメタタグを入れるだけなので簡単でした。
OGPのパワー➡︎ https://twitter.com/hashtag/Meish?f=live

# おわりに
今年の1月にN予備校のバーチャル特別講師として招いていただいたので、そのお礼も兼ねて（？）N予備校でこんなことできるよーっていうのをやってみました！

またちょうどN予備校の内容でWebサービスを作るコンテストが開催中で、高校生の方やN予備校生の方がたくさん参加しているようなので、この記事がお役に立てば嬉しいです！（応募期間終わっちゃったけど…）

小栗さえ（青葉さえ）
Twitter: @OkuriSae
【Vue.js】for文を使って取ってきたオブジェクトのプロパティを子コンポーネントに渡す

### 問題
Vue.jsでfor文を使って配列を回したが、取ってきたオブジェクトのプロパティを子コンポーネントに渡す方法がわからない

### やりたいことの整理
for文で取ったtemperature内の値をTheWeatherItemコンポーネントに入れたい

▼親コンポーネント

```vue:TheToday.vue
<template>
  <div class="today">
    <TheTitle label="Today" :is-today="true" :day="displayDay()"></TheTitle>
    <div class="today-weather">
      <template v-for="(temperature, index) in temperature.todayTemperature">
        <TheWeatherItem :key="index"></TheWeatherItem>
      </template>
    </div>
  </div>
</template>
```
▼for文で取ってきたtemperetureの中身
<img width="377" alt="スクリーンショット 2020-02-17 16.17.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/95049088-ddec-5eed-dd60-a661cf0deccf.png">

▼子コンポーネント

```vue:TheWeatherItem.vue
<template>
  <div class="weather-item">
    <p class="weather-item__time">Now</p>
    <img src="img/rain.png" alt="" class="weather-item__img" />
    <p class="weather-item__temp">5°</p>
  </div>
</template>
<script>
import { weatherMixin } from "@/mixins/weather-mixin";
export default {
  name: "TheWeatherItem",
  mixins: [weatherMixin]
};
</script>
```
▼現在の画面
一旦欲しい値は時間と気温の2つ(アイコン部分は後ほど修正)
<img width="270" alt="スクリーンショット 2020-02-17 16.22.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/7439773a-a6cd-942e-fe42-1dbdcbd01bc7.png">

### やってみる
子コンポーネントのpropsを追加すれば解決できそう
▼子コンポーネント修正

```vue:TheWeatherItem.vue
<template>
  <div class="weather-item">
    <p class="weather-item__time">{{ content.time }}</p>
    <img src="img/rain.png" alt="" class="weather-item__img" />
    <p class="weather-item__temp">{{ content.temperature }}</p>
  </div>
</template>

<script>
import { weatherMixin } from "@/mixins/weather-mixin";
export default {
  name: "TheWeatherItem",
  mixins: [weatherMixin],
  //props追加
  props: {
    content: {
      type: Object,
      required: true
    }
  }
};

```

▼親コンポーネント修正

```vue:TheToday.vue
<template>
  <div class="today">
    <TheTitle label="Today" :is-today="true" :day="displayDay()"></TheTitle>
    <div class="today-weather">
      <template v-for="(temperature, index) in temperature.todayTemperature">
        <!--contentにtemperatureを渡す-->
        <TheWeatherItem :key="index" :content="temperature"></TheWeatherItem>
      </template>
    </div>
  </div>
</template>
```

### 結果
取れたけどタイムスタンプのままだったり温度が四捨五入されていないので修正が必要
<img width="266" alt="スクリーンショット 2020-02-17 16.37.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/d5cd243b-d44f-19a6-2d83-f02c0d545df5.png">

### 修正
フィルターを作って取ってきた値にかける
<img width="265" alt="スクリーンショット 2020-02-17 16.46.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/ebb91ede-4e46-1742-8b92-e6b106b2bbb9.png">

できた🐱
1万人以上が活用する、NRIがチャットツールに求めた3つの要件とは？

# はじめに
野村総合研究所(以下NRI)では、社内のコミュニケーションツールとして、**1万名以上**がチャットを活用し業務を行っています。

- どんな業務にチャットを活用しているのか？
- どんなコミュニケーションの仕組みになっているのか？
- 何のツールを使っているのか？

などなど、これまで展開にあたって得られた知見を惜しみなく、みなさまに共有していくシリーズです。

# NRIがチャットツールに求めた3つの要件とは？
さて早速ですが、第1回はこちらのタイトルでお送りしたいと思います。
ズバリ、弊社が求める要件はこの3つでした。

1. 情報セキュリティが十分に確保できること
1. コミュニケーションの範囲を統制できること
1. カスタマイズ性が高いこと

当たり前のことじゃないか！時間の無駄！と思った方、そう言わず是非内容まで読んでいただければと思います。
なお更に当たり前のこととして、「ユーザビリティが高いこと」、「大規模な人数で利用可能なこと」などもあるのですが、ご紹介するには当たり前すぎるのでここでは省略します。

## 1. 情報セキュリティが十分に確保できること
弊社のお客様には金融や証券会社のお客様もいらっしゃいますので、非常に重要な要件です。
セキュリティの考え方はさまざまあると思いますが、特に下記がポイントでした。

- データが日本国内に保管され、正しく運用されていることが保証されていること
- アクセス元制限が行え、必要なユーザのみ接続できること
- (できれば)社内のネットワークからインターネットを経由せずに使えること

3点目の「社内のネットワークからインターネットを経由せずに使えること」については、可能な限り実現しておきたいポイントでした。
弊社では多くのプロジェクトで開発を外部のパートナー会社に委託していますが、多くの委託先拠点からはインターネットに接続することはできません。(※)
サービスの利用にインターネット接続が前提となってしまうと、こういった開発形態を取っている多くのプロジェクトで利用できなくなってしまうため、実現したいポイントの1つでした。

※各拠点とはNRIと専用線で接続し、入退室管理を行うなど、情報が持ち出し・持ち込み出来ないよう管理しています

## 2. コミュニケーションの範囲を統制できること
タイトルだけでは分かりづらいので、下図をご覧ください。
<img width="434" alt="Screen Shot 2020-03-24 at 13.50.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10806/8a735838-c293-27bb-4658-cab7151db7e7.png">
基本的には、プロジェクトを円滑に進めるためのツールですので、プロジェクト内でのコミュニケーションは問題有りません。ただし、異なるプロジェクト間でのお客様同士の会話、委託先パートナー同士の会話は制限出来る必要がありました。
特にお客様については、弊社とお付き合いがあるかどうかも外部に公開できないため、**お名前も表示されないこと**が重要です。
プロジェクトとしてのコミュニケーションに加え、弊社内社員同士の、組織としてのコミュニケーションツールとしての活用も考えていました。社内でのコミュニケーションも情報統制が必要で、下図のようになっています。
<img width="606" alt="Screen Shot 2020-02-17 at 15.39.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10806/ce53f809-aa66-402d-73aa-cf254fbe835e.png">
本部全体や(図には有りませんが)会社全体でのコミュニケーションは出来るようにしつつ、部内限の情報や本部内限の情報を外部から見られないようにうまく制限できる必要もありました。

こういった2軸のコミュニケーションを実現しつつ、ツールの乱立を防ぎ、ワンストップで横断的なコミュニケーションを提供できるソリューションを模索していました。

## 3. カスタマイズ性が高いこと
最後はカスタマイズ性です。チャットとしての基本機能だけを使っている限りは、どのツールを利用しても大きな違いは無いかと思います。業務での活用が進み、検討されるにつれ、**既存の社内システムと連動させたり、独自の機能を付加したり**など、カスタマイズの要件が発生します。
こうした要件に対して柔軟に対応できるカスタマイズ性をもったソリューション・ツールをNRIでは求めていました。
実際にNRIでは、いくつものカスタマイズを加えて業務で活用していますので、今後のシリーズでご紹介いたします。

# まとめ
NRI独自の事情も多少ありますが、みなさまの会社にも当てはまる部分を少しでも感じて頂ければ幸いです。
次回は、こういった要件から選定したチャットソリューションと、その構築についてご紹介予定です！
自己流docマクロ解析の手順

引き続きEmotet検体が多く着弾しているため、自己流ですがマクロ解析する際の手順を記載します。
どなたかの参考になれば幸いです。

当たり前ですが、解析する際は検証環境で、インターネット接続環境などに留意の上（クローズド環境推奨）ご検証いただけますようよろしくお願いいたします。

#解析手順
##1)解析準備
**・解析したいファイルの用意。**今回はEmotet検体です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/a99a0d7c-4848-5ae8-ff57-d5ce14a787ee.png)
**・Fiddlerの起動**
ネットワーク解析ソフトです。WiresharkのHTTPだけ版と思えばおk。
通信試行を確認するために起動しておきます。
**・Fakenetの起動**
リクエストに対して適当な応答をしてくれるローカルプロキシです。
クローズド環境でも出来る限り挙動を終えるようになります。（二次検体取得とかは無理だけど）

##2)マクロの有効化
「コンテンツの有効化」を押下し、マクロを有効化します。
通信が発生した場合、Fiddle上で通信の試行が確認できます。
Powershellのプロセスから通信試行しはじめたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/61c7bdf3-05b2-f07e-92a2-2504461d7471.png)

##3)マクロの確認
Wordのファイル上で`Alt+F11`を押して、開発者ツールを立ち上げます。
左メニューのプロジェクトを開いていくと「標準モジュール」の配下らへんに、難読化されたマクロが見つかるのではないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/0a588999-5cab-1543-826f-e1eef75a6ff0.png)


##4)引数にあたりをつける
`Ctrl+F`で検索ウィンドウを表示します。
文字列を　Create や　Shell  など、
対象を「カレントプロジェクト」にして検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/811f9e55-071d-32af-d385-5fae97b6a963.png)

下記のような形の文字列がヒットすればOKです。（引数はサンプル）
`Create(Czcpyib, Fpbbsin, Pftqijpd, Tyhacm, Gcepmog, Biap)`

※目処が立たない場合は、Fiddlerを見ながら1行ずつ実行してみたり、
ブレイクポイントを置いて実行させたりとかで切り分けるのですが、ここでは割愛します。

##5) Debug.printで引数を表示
４で目処をつけたCreate内の引数を、一つずつDebug.Printして出力させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/bf74075e-2022-30ea-8cd1-522e8b875660.png)

上記のようにかけたら、F5 を押下して、マクロを再実行します。

##6)イミディウェイトウィンドウの確認
メニューの　表示＞イミディエイトウィンドウ　を開くと、powershellに渡している引数が出力されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/06a4aa65-8fda-f645-2686-797221678a20.png)

##7)Base64のデコード
渡されている引数はEmotetの場合Base64でエンコードされていることが多いので、
何らかの形でデコードします。
今回はCyberChefを使います。
※Base64のレシピだけだとスペースが入ってしまうのでnullを消すレシピを一緒に入れてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/aba6fa85-1f31-7469-2e56-707ba1e91e06.png)

CyberChef入れられない事情などがあれば、Windows純正コマンドでデコードするバッチを過去に作っているのでお使いください。
https://qiita.com/harapeco_nya/items/decbc6daa0294677f9d5

##8)URLなどの情報をもとに解析を継続
Fiddlerでは見えなかったHTTPSなどの接続先もフルパスで見えているため、
URLが生きていれば二次検体の取得も可能になっているはずです。
デコードされた情報をもとに解析を続けてみてください。


#おわりに
マクロについては無知の極みなため、
「もっといい方法あるよ！」などのアドバイスがあれば是非教えてくださいませ！
Dockerの自動起動設定を外す

# Docker 自動起動設定の解除
dockerの初期設定上、PC起動時に自動でdockerを起動する。
dockerはメモリを2~3GB食ってしまうので、必要のない時は起動しないように設定したいと思います。
## 手順
### 1. デスクトップのメニューバーにあるdockerアイコンを選択後、「Preferences」を選択する
<img width="402" alt="スクリーンショット 2020-02-17 16.13.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279967/d2912b97-dd08-22f0-5923-e139c85d85ee.png">

### 2. 「Start Docker Desktop when you log in」のチェックを外す
<img width="1034" alt="スクリーンショット 2020-02-17 16.26.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279967/010bc8e4-afe4-a5da-4167-8536ca603325.png">

### 3. 「Apply & Restart」を選択する
<img width="1033" alt="スクリーンショット 2020-02-17 16.27.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279967/b989f894-9177-1d3b-ff2e-b5cf133f56ba.png">

### 4. 完了
以上、お疲れ様でした
XULの画面にFlowLayoutPanelを表示する

#はじめに
[Mozilla Thunderbird](https://www.thunderbird.net/ja/)（サンダーバード） のアドオン画面は Version 68 現在も XUL で記載しますが、.NET Framework でいう [FlowLayoutPanel](https://dobon.net/vb/dotnet/control/flbeginning.html)（-- dobon.net さんのページ）のような、子要素を折り返し表示可能に並べるコンテナを表示するコードを共有します。子要素には、ラベル ([label](https://developer.mozilla.org/ja/docs/Archive/Mozilla/XUL/label)) のほか画像 ([image](https://developer.mozilla.org/ja/docs/Archive/Mozilla/XUL/image)) なども、さらに複数種類の要素を混在させても使用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100206/85c5683d-3d32-3dbd-5567-e435fac53ebe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100206/39059a40-09e5-fa3c-8407-666f6b4d413e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100206/65ddc7e2-ee66-301e-f94b-c4494aab0536.png)


#コード
##その1 : box style="display:block;"
[Box](https://developer.mozilla.org/ja/docs/Archive/Mozilla/XUL/box)要素は、子要素を縦（垂直）または横（水平）方向に並べて、必要に応じて折り返して表示可能です。

```html:sample.xul
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>

<dialog id="sample"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    title="サンプル"
>

<box style="display:block;">
    <label value="とんかつソース" />
    <label value="サラミ" />
    <label value="チーズ" />
    <label value="とんかつソース" />
    <label value="やさいサラダ" />
    <label value="テリヤキバーガー" />
    <label value="めんたい" />
    <label value="たこ焼" />
    <label value="コーンポタージュ" />
    <label value="なっとう" />
    <label value="チョコレート" />
</box>

</dialog>
```



##その2 : description
[Description](https://developer.mozilla.org/ja/docs/Archive/Mozilla/XUL/description)要素も、子要素を横（水平）方向に並べて、必要に応じて折り返して表示可能です。

```html:sample.xul
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>

<dialog id="sample"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    title="サンプル"
>

<description>
    <label value="とんかつソース" />
    <label value="サラミ" />
    <label value="チーズ" />
    <label value="とんかつソース" />
    <label value="やさいサラダ" />
    <label value="テリヤキバーガー" />
    <label value="めんたい" />
    <label value="たこ焼" />
    <label value="コーンポタージュ" />
    <label value="なっとう" />
    <label value="チョコレート" />
</description>

</dialog>
```

#ご参考
- [How to achieve flow layout in XUL?](https://stackoverflow.com/questions/822772/how-to-achieve-flow-layout-in-xul) - Stack Over Flow 本稿は殆どこちらの日本語版紹介記事みたいなものです