OmniAICreator/Qiita-1.07M huggingface dataset:
RPAの資格を取ってみた【Automation Anywhere編その2】

#この記事について

この記事は、前回の[RPAの資格を取ってみた【Automation Anywhere編その1】](https://qiita.com/t_a_u_e_25/items/2301e84af3fc3d53e569)の続きの記事です。

#この記事の対象者
・Automation Anywhere Certified Advanced RPA Professional (v11)を合格して次に進みたい方
・Automation Anywhereのより実践的な試験を受けてみたい方

今回の記事は、<b>Automation Anywhere Certified Master RPA Professional (v11)</b>について解説します。

#Automation Anywhere Certified Master RPA Professional (v11)の受験

###試験について

試験内容については、以下の通り。

・Q&A(選択式問題) 60分<font color="Red"><b>60問</b></font>
・<font color="Red"><b>Q&Aは1回のみ受験が可能</b></font>
・<font color="Red"><b>3つのBot制作</b></font>

赤字がAdvancedとの違いです。合格までの流れも違います。
下記に流れをまとめます。

###合格までの流れ

####1. Q&A
60分60問の一回勝負。Q&Aの合格にはマイスコア<font color="Red"><b>80%以上</b></font>が必要。

ここで合格ならば、Bot制作の問題へ進むことができます。
*ダメだった場合、再度受験料を払って受ける必要があります。*

####2. Bot試験

3つの制作課題が出されます。制作期間は2週間です。
こちらの合格には、<font color="Red"><b>75%以上</b></font>が必要。

両方合格することで、晴れてMasterの資格を取得することができます。


###受験まで
通常はこちらで試験料金を払いましょう。
[申込ページ](https://university.automationanywhere.com/jp/checkout?cid=orxMZLCKbm41&co=153)

~~今回は<font color="Red">12/31</font>まで~~無料で受けられる方法について記載します。
<b>2020/1/10更新</b>
期限が<font color="Red">1/31</font>まで延長しました！
詳しくは[こちら](https://apeople.automationanywhere.com/s/feed/0D56F00007plDGsSAM?language=ja)


Advancedに合格すると、「Automation Anywhere オンラインラーニングパス招待のご案内– AA認定マスターRPAプロフェッショナル(V11) 資格準備＋試験」のメール案内がきます。

こんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323990/92d76532-3295-66f7-a94c-2e5ccbe054eb.png)

来るタイミングは人によってバラバラなので、これはなんとかして欲しい・・・

URLをクリックすると、「AA認定マスターRPAプロフェッショナル(V11) 資格準備＋試験」を受講することができるので、コースに沿って学習を進めます。

<b>いざ受験！まずはQ&Aマイスコア80%を目指しましょう！！！</b>
<b>Q&A合格したら、Botを制作して提出！！！頑張って作りましょう！！！</b>

###結果について

Bot提出してから、だいたい1日～1週間前後で結果のメールがかえってきます。
合格すると、Automation Anywhereから証明書に関するメールがきます。

以下、証明書
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323990/033aa607-3121-d9e1-c0b8-c6fd24c12f4b.png)


以上でマスター試験の流れは終了です。

###対策について

自分自身が行った対策方法です。他にもあったらあとで追記します。

####Q&A
・基本的に問題はAdvancedとほとんど一緒。前回の記事と同様の対策で進める
・問題数も増え、正答率も上げなければならないので不安を覚える方はもう一度講座を受講し細部を理解する
・Advancedから日が経っていないうちに受験する

####Bot制作
・3つの問題文を見て作れそうなモノから作成する
・制作難易度は、Bot2 < Bot1 < Bot3(個人的主観)
・講座にもある「Bot Me Up: ハンズオンラボ」は試験にも役立つので、必ずそれに沿ってBotを作成してみる
・製品ドキュメントで調べながらワークベンチでコマンドをあれこれ試してみて使い方は理解しておく
・変数、ループ、条件分岐のといった知識は必須なので、分からない場合は知識はつけておくように
・時間ある場合、[Bot の設計、作成、送信に関する推奨標準](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-bot-store-introduction.html)を意識して作ってみる


###改善してほしいところ
・Bot制作については、特定のアプリケーションがない人に対して考慮がされていない(某Office製品ないとか)

・相変わらず結果しか返ってこないため、正解不正解は不明でよくわからないまま試験が終わる

・Masterの受講案内、Bot試験の提出結果が人によっては1日できたり、または1週間以上かかることがある(その間一切連絡なし)

###資格取ったメリット

・RPAツールの知見を得ることができる
・Automation Anywhereの基本的な操作、知識を身につけることができる
・資格取得という目に見える成果を手に入れることができる
・証明書がもらえるから、Linkedinに載せてアピールできる

あくまでも個人的主観です。


ちなみに認定書のサイト内では取得者を見る事ができます。今なら合格すれば、100人台ですね。
日本でまだ100人ほどしか持っていない資格だって自慢できますね。やったね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323990/5d379ae6-deb2-2143-3dde-bcdae5f9a50d.png)



#終わりに
以上です。AutoMation Anywhere編は一旦これで終了です。
次はUiPathかなあ・・・
UITableViewCellのボタンをどのCellのものか判別する

自分へのリマインドを主として書いています。
分かりにくかったら申し訳ないです。

#UITableViewCellにボタンを追加
- **addTargetを追加**

```sample.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomTableViewCell
       let button = UIButton()
       button.addTarget(self, action: #selector(self.buttonEvent(_: )), for: UIControl.Event.touchUpInside)

       return cell
}
```
- **タップされたときのメソッド**
- 
```sample.swift
 @objc func buttonEvent(_ sender: UIButton) {
        print("tapped.")
    }
```

#tapされたボタンのCellを判定する
今回はbuttonにタグを設定する方法を紹介します。
- **buttonにtagを追加**
UIButtonにはInt型のtagをつけることができます、これをcellを追加する際にボタンに設定しておくことでボタンがどのセルのボタンなのかを判別できるようになります。

```sample.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomTableViewCell
       let button = UIButton()
       button.addTarget(self, action: #selector(self.buttonEvent(_: )), for: UIControl.Event.touchUpInside)
       //タグの設定
       cell.button.tag = indexPath.row

       return cell
}
```

- **メソッドの書き換え**

```sample.swift
 @objc func buttonEvent(_ sender: UIButton) {
        print("tapped: \([sender.tag])番目のcell"
 }
```


#Reference
[CustomCellのボタンをどのCellのものか判別する](http://harumi.sakura.ne.jp/wordpress/2019/01/09/determine-which-cell-belongs-to-customcell-button/)
リモート参加/アーカイブ動画視聴が可能なテックコミュニティ

# はじめに

世の中には多くのテックコミュニティが存在していますが、Meetupやもくもく会などの会場は東京を始め、主要都市がメインとなっていますよね。自分のように~~ド田舎~~ 地方に住んでいる技術者にとっては物理的に参加しづらく、咥えた指もブヨブヨにふやけてしまっていることと思います。

しかし、リモート参加やアーカイブ動画の視聴を可能としてくれているコミュニティもあります。そのようなコミュニティを一覧にまとめていきます。

リモート参加はイベント毎に有無が異なりますが、過去に一度でもあったものは「あり」としています。自分が参加しているグループを記載しているため偏り大です。

# リモート参加/アーカイブ動画視聴 可能なコミュニティ

## Ansible ユーザー会

connpass：https://ansible-users.connpass.com/
リモート参加：あり
動画アーカイブ：なし

## Cloud Native Developers JP

connpass：https://cnd.connpass.com/
リモート参加：なし
動画アーカイブ：[crash.academy](https://crash.academy/community/cndJP)

## Cloud Native Meetup Tokyo

connpass：https://cloudnative.connpass.com/
リモート参加：
動画アーカイブ：[crash.academy](https://crash.academy/community/cloudnativemeetup)

## Docker Meetup Tokyo

connpass：https://dockerjp.connpass.com/
リモート参加：なし
動画アーカイブ：[crash.academy](https://crash.academy/community/dockermeetupTokyo)

## Envoy Meetup Tokyo

connpass：https://envoytokyo.connpass.com/
リモート参加：なし
動画アーカイブ：[Youtubeチャンネル](https://www.youtube.com/channel/UCwfPNAwzTtZbqQ7VHTxtdhw)

## Kubernetes Meetup Tokyo

connpass：https://k8sjp.connpass.com/
リモート参加：なし
動画アーカイブ：[Youtubeチャンネル](https://www.youtube.com/channel/UCbLIVn6QwX6GuS9_D36jNRA)

## VS Code Meetup

connpass：https://vscode.connpass.com/
リモート参加：あり
動画アーカイブ：あり（connpass内の各イベントページにリンク記載）
【体験記】Azure Fundamentals試験(AZ-900)を受験した

Azure Fundamentals試験(AZ-900)に合格したので、勉強方法や感想をかんたんにまとめます。
###受験結果
**合格 （820/1000）**
合格ラインは700点なのでまぁまぁよかったかなと思います。

###事前に持っていた知識
IaaS、PaaS、SaaSの違いがなんとなくわかるくらい。
ほぼ予備知識ゼロでした。

###勉強方法
Microsoft Learnが用意している[Azure の基礎](https://docs.microsoft.com/ja-jp/learn/paths/azure-fundamentals/)というサイトを使いました。
というか、AWSと違ってAzureはまだまだ日本語の参考書や勉強サイトなどが少ないのでこれぐらいしか見つけることができませんでした。
英語ができれば他にもあったのかも知れないのですが、あいにく英語はサッパリできないので・・・。
勉強時間は35～40時間くらい（平日1時間、土日4時間程度を約3週間）でした。
勉強のすすめ方についてはインプット（読む）するだけではなくて、**アウトプットをする**ことを心がけました。
具体的には
①インプットした内容を**自分なりにまとめる**
②Azureの無料アカウント(※)を登録してサイトに記載されている内容を**実際に自分で操作してみる**
ことを行いました。
※ Azureは登録してから30日間または200ドル分のクレジットを使い切るまでは無料

###感想
試験問題44問を20分くらいで回答しました（制限時間は60分）。
試験内容は詳細には書けませんが、**「Azureってなに？」「Azureにはどんなサービスがあってどんなことができるの？」**といったことが問われ、内容を正確に理解していないと難しいのではないかと思います（逆にいうと正確に理解していればOK!!、ひねくれた問題はなかったです）。
そういう意味では、アウトプットを意識していて勉強していたこと、とくにAzureを実際に操作していたことは非常に役に立ったと思います。
他の勉強でも同じかもしれませんが、単に資格の取得だけを目的とした丸暗記ではなく、読んで「へぇー、そうなんだ!!」と思って、実際に手を動かして「おぉ、できた!!すげぇー!!」と体験することが大切だなぁとあらためて思いました。

###おまけ
ちなみに受験申込は英語でした。
上でも述べましたが、僕はさっぱり英語ができません。
試験前もそれなりに緊張しましたが、受験申込しているときのほうが緊張していたかもしれません(笑)
英語、もっとちゃんと勉強しておいたらよかったなぁ・・・。
v-forによる繰り返しの描画


# `v-for`による繰り返し

配列やオブジェクトを**ループ処理**して、
要素を繰り返しを描画するには、`v-for`ディレクティブを使用する。

```index.html
// v-for 構文
<li v-for="各要素を代入する変数名 in 繰り返したい配列やオブジェクト">
```

```index.html
<div id="app">
  <ul>
    <li v-for="item in items" v-bind:key="item.id">
  </ul>
</div>
```

```app.js

new Vue ({
  el: '#app',
  data: {
    items: [
      { id: 1,
        title: '1番目のリスト',
      },
      { id: 2,
        title: '2番目のリスト',
      },
      { id: 3,
        title: '3番目のリスト',
      },
    ]
  }
})

```

`data`オプションに登録されている`items`の配列から、`v-for`ディレクティブを使って**1つずつ要素を取り出し描画**します。


## Key の役割

```
v-bind:key="item.id"
```

`v-forディレクティブ`でループしている要素に対しては、**`v-bind:key`**ディレクティブにその要素として**識別情報となる値（一意の値）**を指定することが推奨されています。Vueが各要素を効率よく追跡できるようにするため、ということのようです。

`:key`は`v-bind:key`の省略構文。


## 不変でユニークなキーを設定しよう

要素の削除や並び替えも考慮して「**不変でユニークなキー**」を設定する必要があります。
ユニークな乱数を生成する`uuid`や、`vue-uuid`を使用して:keyの値を乱数で指定することができます。

[uuid](https://www.npmjs.com/package/uuid)
[vue-uuid](https://www.npmjs.com/package/vue-uuid)

（例）「`vue-uuid`」を使用して`:key`を指定する際は乱数を値に指定できるようにする場合

```index.js

import Vue from 'vue';
import uuid from 'vue-uuid'; // 追加

Vue.use(uuid); // 追加

new Vue({
  el: '#app'
});

```

`uuidモジュール`をimportして、`Vue.use()`の引数に指定することによって
アプリケーションで`uuid`を使用できる様にします。


```app.vue.js

data() {
  return {
    //省略
    items: [
      {
        id: this.$uuid.v4(), // バージョン4のUUIDは、乱数により生成される。
        title: '1番目のリスト',
      },
      {
        id: this.$uuid.v4(),
        title: '２番目のリスト'
      },
      {
        id: this.$uuid.v4(),
        title: '3番目のリスト'
      }
    ],
  }
}

```

これで`id`には乱数が指定されるようになりました。
pyenvとpipenvでPythonの環境構築をする - Mac

# はじめに
この記事は[SFC Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sfc)の24日目の記事です．

慶應義塾大学SFC19の[Santa](https://twitter.com/santa_sukitoku)です．
来年度からSFCの新入生は必修科目の情報基礎でPythonを学習するという話を聞いたので今回はMacでpyenvとpipenvでPythonの環境構築の方法を記します．あと研究会でPython使うことが多いので後々のためにも...
(WindowsユーザーなのにSFCのマジョリティであるMacユーザーのためにMacでの方法を書くとか優しすぎるな🤔)

※ここからはですます調じゃないです(面倒になった)．

## [Homebrew](https://brew.sh/index_ja)をインストール
HomebrewはMac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつ．要は簡単にパッケージを管理することができるシステム．
まずは自分のMacに[Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)がインストールされているか確かめる．
Xcodeがインストールされてない場合はApp Storeからインストールして一回起動する．
そのあとターミナルを開いて下記のコマンドを実行．

```
$ xcode-select --install
```

Xcodeが入っているか確かめたあとに下記のコマンドを実行してHomebrewをインストールする．

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Homebrewがインストールされているか確かめる(Homebrew 2.2.0とか出てきたら大丈夫)．

```
$ brew --version
```

## pyenvとpipenvをインストール
- pyenv

```
$ brew install pyenv
```

- pipenv

```
$ brew install pipenv
```

- .bash_profileに環境変数の設定．

```
$ export PYENV_ROOT="$HOME/.pyenv"
$ export PATH="$PYENV_ROOT/bin:$PATH"
$ eval "$(pyenv init -)"
```

## Pythonをインストール
pyenvを使うとPythonのバージョンを管理しやすくなる．
下記のコマンドでインストールできるPythonのバージョンを一覧で見ることができる．

```
$ pyenv install -l
```

今回はPython 3.7.4をインストールする．

```
$ pyenv install 3.7.4
```

インストールが終わってからターミナルでpythonと打ってもMacでデフォルトであるpython2が動いてしまうのでpyenvを使ってデフォルトのPythonのバージョンを3.7.4に変更する．

```
$ pyenv global 3.7.4
```

ここでpython --versionとターミナルで打つとpythonのバージョンが3.7.4に変わっているはず(変わらなかったら一回Macを再起動)．

## pipenvを使って開発環境を整える．
pipenvはPythonのパッケージ管理ツールでNode.js の npm や yarn，Ruby の gem のように，依存関係も扱える．
まずPythonで開発を行うフォルダを任意の場所に作る．
ここではデスクトップにPythonフォルダを作り，その中でtestフォルダを作ってそこで開発する．

```
$ cd desktop
$ mkdir Python
$ cd Python
$ mkdir test
$ cd test
```

testフォルダに移動したら開発フォルダ内で仮想環境フォルダを作成する設定をする．

```
$ export PIPENV_VENV_IN_PROJECT=1
```

ここまできてからpipenvで環境構築をする．

```
$ pipenv --python 3.7
```

pipenvで必要なパッケージをインストールする．

```
$ pipenv install numpy==1.14 # バージョン指定も可能
$ pipenv install keras
$ pipenv install tensorflow 

$ pipenv install --dev autopep8 # --devで開発環境のみで使うパッケージを別枠(dev-packages)で管理しながらインストールすることができる
$ pipenv install --dev flake8
```

開発フォルダの中に任意のPythonファイル(ここではtest.py)を作って下記のように記述する．

```test.py
import numpy as np
import keras
import tensorflow as tf

print(np.__version__)
print(keras.__version__)
print(tf.__version__)
```

pipenvでPythonのコード(ここではtest.py)を実行する方法．下記の様にエラーがでなければOK．

```
$ pipenv run python test.py
Using TensorFlow backend.
1.17.4
2.3.1
2.0.0
```

## まとめ
MacのデフォルトのPythonが2系って絶対詰まる人が多いと思うんですよね...
来年度の新入生は頑張ってほしい．ちなみにおすすめのエディタは[VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)です．

pipenvの使い方は[Pipenvを使ったPython開発まとめ](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)を参照して欲しい．
pyenvで他のPythonのバージョンをインストールしてそれを使ってpipenvで別の開発環境を作ることも可能なのでその辺はよしなに...
pipenvとかpyenvでもっと詳しく知りたいならググってくれ．そなたのハイスペックマシンで...

気が向いたらWindowsでの環境構築の方法も書きます．

## 参考リンク
[Python3インストール](https://qiita.com/ms-rock/items/72b8f1abc661c539bb09)
[Pipenvを使ったPython開発まとめ](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)
自分が調べたPHPのマジックメソッドの機能についてまとめてみた

# はじめに　
Laravelの仕組みを調べているときに調べたマジックメソッドの機能について、自分の備忘録を兼ねてここにまとめました。 
この投稿について疑問や指摘があれば、ぜひコメントお願いします。 

#本題
**property_exists メソッド**
>PHPマニュアル(https://www.php.net/manual/ja/function.property-exists.php)
>>
機能 オブジェクトもしくはクラスにプロパティが存在するかどうかを調べる。
説明 ``property_exists ( mixed $class , string $property ) : bool``
パラメータ　class:確認するクラス、もしくはクラスのオブジェクトを指定します。 property:プロパティ名を指定します。

試し書き

```PropertyExists.php
//基本型
class Pikotaro
{
  public $pen;
  protected $pineapple;
  private $apple;
}
var_dump(property_exists('Pikotaro', 'pen')); //bool(true)
var_dump(property_exists(new Pikotaro, 'pineapple')); //bool(true)
var_dump(property_exists(new Pikotaro, 'apple')); //bool(true)
var_dump(property_exists('Pikotaro', 'applepen')); //bool(false)
```
```PulsPropertyExists.php
<?php
//同じ名前空間で使うとき
namespace Kosakadaimao;

class Pikotaro
{
  public $pen;
  protected $pineapple;
  private $apple;
}
var_dump(property_exists('\\Kosakadaimao\\Pikotaro', 'pen')); //bool(true)
var_dump(property_exists(new Pikotaro, 'pineapple')); //bool(true)


//異なる名前空間で使うとき
namespace Kosaka;

use Kosakadaimao;

var_dump(property_exists('\\Kosakadaimao\\Pikotaro', 'pen')); //bool(true)
var_dump(property_exists(new Kosakadaimao\Pikotaro, 'apple')); //bool(true)
?>
```
追記）名前空間の特定クラスのプロパティーを調べたい場合は上記のようにすればできます。

**end メソッド**
>PHPマニュアル(https://www.php.net/manual/ja/function.end.php)
>>
機能 配列の内部ポインタを最終要素にセットする。
説明 ``end ( array &$array ) : mixed``
パラメータ array:配列。この配列は参照渡しとなります。関数内で配列の中身を変更するからです。 つまり、ここには配列そのものを渡さなければならず、 配列を返す関数を指定することはできません。 参照渡しできるのは、実際の変数だけだからです。

試し書き

```End.php
//基本型
$kosaka = ['Pikotaro', 'Kosakadaimao', 'Kazuhito'];

var_dump($kosaka); //array(3) { [0]=> string(8) "Pikotaro" [1]=> string(12) "Kosakadaimao" [2]=> string(8) "Kazuhito" } 
echo end($kosaka); //Kazuhiro
```

```PlusEnd.php
//User Contributed Notes から
$kosaka[2] = 'Pikotaro';
$kosaka[1] = 'Kosakadaimao';
$kosaka[0] = 'Kazuhito';

var_dump($kosaka); //array(3) { [2]=> string(8) "Pikotaro" [1]=> string(12) "Kosakadaimao" [0]=> string(8) "Kazuhito" }
echo end($kosaka); //Kazuhito
```
var_dump()の結果からわかりますが、連想配列のキーを数字にしても、デフォルトのキーのように昇順で並んでくれないようです。

```PlusPlusEnd.php
$kosaka = ['Pikotaro', 'Kosakadaimao', 'Kazuhito'];
$kosaka[2] = 'Pikotaro';
$kosaka[1] = 'Kosakadaimao';
$kosaka[0] = 'Kazuhito';

var_dump($kosaka); //array(3) { [0]=> string(8) "Kazuhito" [1]=> string(12) "Kosakadaimao" [2]=> string(8) "Pikotaro" } 
echo end($kosaka); //Pikotaro
```
しかし、デフォルトのキーの値を上書きする形であれば、デフォルトのキーの順番通りに並ぶようです。

#終わりに
もっといろんなマジックメソッドの機能を上げようと思ったのですが、疲れたのでここで終わります。
いつかまたこの続きをやりたいなと思います。
🌴【SourceTree】作業ツリーのファイルを無視したいのに無視が選択できないのはソース管理されているから

## 環境
Windows 10
SourceTree 3.3.4
git version 2.24.1.windows.2

## やりたいこと

無視したいファイルがあるのに無視できない...
.gitignoreに書いても意味無し...何故？

![sourcetree.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/03cf8eac-8ec8-4054-efac-938719ac2296.jpeg)

## やったこと

解決法は単純極まりないです
対象がソース管理下のファイルだったので管理から外すと無視設定できました

---

対象ファイルを右クリックし表示されるメニュー（上記やりたいこと参照）から
「追跡をやめる」→削除しますか？ダイアログの「OK」

![sourcetree2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/54b467e7-b2e8-173e-5347-84505feb8622.jpeg)

（削除の文言が怖いですがファイルは残っています）

↓

Indexにステージしたファイルにアイナス表記で対象ファイルが表示され、
作業ツリーには疑問符表記で同ファイルがあるのでソース管理から外れた状態になっている

↓

対象ファイルをコミットして削除コミットを作成
コメントには管理から外した旨を書いていればいいかと

↓

無視が選択できるようになっている
gradleとmavenの人気の動向

#調査を始めたきっかけ
Mac版のVSCodeにJava Extension Packを入れることにしました。
これは、VSCodeでJavaを扱うために必要な単語補完やデバッガーなどの拡張機能をまとめてインストールできる拡張機能です。

この拡張機能にはmavenが入っていますが、gradleが入っていません。
最近では、androidの影響もあり、mavenよりもgradleの方が勢いがあり、流行っていると考えていたため、違和感を覚え、調査を始めたのがきっかけです。

#人気の動向
日本の直近12ヶ月の動向を、Google Trendで調べてみます。
![gradle-maven-jp-12m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370398/59e0cacf-0522-410d-d76c-28805a3ae981.png)

ほとんど差はありませんが、若干mavenの方が上のようです。
私はgradleの方が流行っていると考えていたので、少々驚きました。

次に、世界の直近12ヶ月の動向を、Google Grendで調べてみます。
![gradle-maven-world-12m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370398/4b72700d-c846-1ad8-9e6e-4152b7a15bfc.png)
mavenの方がずっと上ですね。

最後に、地域別のキーワード比較をしてみます。
![Compared breakdown by region.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370398/ca0ba0cb-9663-a2ba-dd56-be8eec9a952a.png)
真っ赤ですね。
どの地域でもmavenの方が上みたいです。
日本ではGradleがかなり善戦しているようですが、それでもこの状況です。

もしかして、期間を5年で見たら変わるのではないかと考えて調べてみましたが、ほとんど変わりませんでした。
mavenの方はアパレル関係や人名で、「maven」を冠するものがあるのかと思い、流行りのキーワードを調べて「maven -fortnite」(ゲームのキャラらしい)のように無関係と思わしきキーワードを除外してみましたが、それでも結果はほとんど変わりませんでした。


ビルド・プロジェクト管理ツールの選定で悩んでいる方々のお役に立てれば幸いです。
可分距離空間の部分集合が可分であることの証明

# 主張
$(X,d)$ を可分距離空間，$A$ を $X$ の部分集合とする．このとき，$A$ は相対位相に関して可分である．

# 記号
$r>0, x\in X$ に対して $B_r(x)=\\{y\in X\mid d(x,y)<r\\}$ と定める．

# 証明
$E$ を $X$ の可算稠密部分集合とする．このとき $\mathcal{B}=\\{B_{\frac{1}{n}}(e):n=1,2,\cdots;e\in E\\}$ は可算であり，かつ任意の $x\in X$ および $x$ を要素に持つ $X$ の開集合 $U$ に対して $x\in B_{\frac{1}{n}}(e)\subseteq U$ を満たす $B_{\frac{1}{n}}(e)\in\mathcal{B}$ が存在する．

>（∵）任意の $x\in X$ および $x$ を要素に持つ $X$ の開集合 $U$ に対して，開集合の定義より，$x\in B_r(x)\subseteq U$ を満たす $r>0$ が存在する．よって，特に $rN>1$ を満たす $N\in\mathbb{N}$ に対して $x\in B_\frac{1}{N}(x)\subseteq U$ が成り立つ．一方，$E$ は $X$ の稠密部分集合であるから $E\cap B_\frac{1}{2N}(x)\neq\varnothing$ である．そこで，$e\in E\cap B_\frac{1}{2N}(x)$ をひとつ選ぶと $d(e,x)<\frac{1}{2N}$ より $x\in B_\frac{1}{2N}(e)$ である．さらに，任意の $y\in B_\frac{1}{2N}(e)$ に対して
>
```math
d(x,y)\leq d(x,e)+d(e,y)<\frac{1}{2N}+\frac{1}{2N}=\frac{1}{N}<r
```
より $y\in B_r(x)\subseteq U$ すなわち $y\in U$ である．よって $x\in B_\frac{1}{2N}(e)\subseteq U$ が成り立つ．

そこで $\mathcal{B} _A=\\{B\cap A:B\in\mathcal{B}\\}$ と定めると，$\mathcal{B} _A$ は可算であり，かつ任意の $a\in A$ および $a$ を要素に持つ $A$ の開集合 $U\cap A$ に対して $a\in B _a\subseteq U\cap A$ を満たす $B _a\in\mathcal{B} _A$ が存在する．

>（∵）$a\in U$ より $a\in B_{\frac{1}{n}}(e)\subseteq U$ を満たす $B_{\frac{1}{n}}(e)\in\mathcal{B}$ が存在し，このとき $a\in B_{\frac{1}{n}}(e)\cap A\subseteq U\cap A$ である．

空でない各 $B\in\mathcal{B} _A$ に対して $a _B\in B$ をひとつ選び，$D=\\{a _B:B\in\mathcal{B} _A\\}$ とおく．このとき，$D$ は $A$ の可算稠密部分集合である．

>（∵）任意の $a\in A$ および $n\in\mathbb{N}$ に対して $a\in B_a^{(n)}\subseteq B_\frac{1}{n}(a)\cap A$ を満たす $B_a^{(n)}\in\mathcal{B} _A$ が存在する．そこで，各 $n$ に対して $B _a^{(n)}$ に対応する $D$ の元を $a _n$ とすれば，$a _n\in B _a^{(n)}\subseteq B _\frac{1}{n}(a)\cap A$ ゆえ点列 $\\{a _n\\} _{n=1}^\infty$ は $a$ に収束する．

以上より，$A$ は相対位相に関して可分である．
RaspberryPiからAmazon Rekognitionを利用して家族の顔を見分けさせる

# RaspberryPiへのカメラの接続と有効化
$ sudo raspi-config
カメラをEnableにする。

# AWS CLIの導入
$ sudo apt update
$ sudo apt install python3-pip
$ sudo pip3 install awscli

# AWS側の準備
## S3の作成
適当に名前決めて作成（細かい設定はなしでデフォルトのまま）
## IAM Userの作成
S3とRekognitionへの権限のあるIAM Userを作成

# Rekognition
## Collectionの作成
$ aws rekognition create-collection --collection-id 'family'
> {
    "StatusCode": 200,
    "CollectionArn": "aws:rekognition:ap-northeast-1:############:collection/family",
    "FaceModelVersion": "4.0"
}

## Collectionへの追加
S3にファイルをアップロードしておき、それをコレクションへ追加する。
$ aws rekognition index-faces --collection-id 'family' --image '{"S3Object":{"Bucket":"<S3BucketName>","Name":"<S3KeyName>"}}' --external-image-id '<家族の名前>'
> {
    "FaceRecords": [
        {
            "Face": {
                "FaceId": "################################",
                "BoundingBox": {
                    "Width": 0.2894638478755951,
                    "Height": 0.31409332156181335,
                    "Left": 0.37095174193382263,
                    "Top": 0.34483572840690613
                },
                "ImageId": "###########################",
                "ExternalImageId": "<家族の名前>",
                "Confidence": 100.0

##raspberry piで写真を撮って、コレクションから検索
IMGFILE=$(mktemp)
raspistill -w 1024 -h 768 -o ${IMGFILE}
aws rekognition search-faces-by-image --collection-id 'family' --image-bytes fileb://${IMGFILE} | jq '.FaceMatches[] | {name: .Face.ExternalImageId, Similarity: .Similarity}'
> {
  "name": "<家族の名前>",
  "Similarity": 98.38721466064453
}
{
  "name": "<家族の名前>",
  "Similarity": 98.25770568847656
}
node-red-contrib-amazon-echoを使う

#覚えておくこと
node-red-contrib-amazon-echoを使うときはrootでnode-redを起動する。

#公式ドキュメントより
>__Requirements__

>Amazon Echo Hub node is starting a service listening on port 80 which requires Node-Red process to be started with root user.

[node-red-contrib-amazon-echo/github](https://github.com/datech/node-red-contrib-amazon-echo)
自分用 Windows/日本語 ErgoDox EZキーマップ

#現時点のキーマップ（20250121更新）
https://configure.zsa.io/ergodox-ez/layouts/MWYmK/latest/0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319408/f21a68f3-c635-cf06-c95c-698b562c51fa.png)

#コンセプト等
- 46キーに収める（Corneへの移行を見据えて）
- Windows
- 日本語キーボード
    - 例）Shift + 2 = "
- Excelを日常的にゴリゴリ使う
- 最上段は使わない
- 最下段も極力使わない
- 親指の役割をシンプルにした
    - 多くの先人のキーマップを見ると親指がレイヤー切り替え・Modifier等を担当しているものが多いが、自分はどうしても慣れなかった。自分の親指はそんなに賢くなかった
    - 親指の主な役割をスペースキーとバックスペースキーに絞った
    - 多くのModifierは左手小指に託した（普通のキーボードと同じ）
    - 親指以外の指のほうが他の指とリズムよく打鍵できる感じがする。親指は「ドスン」感が拭えない
- Alt+Win+SysRqはWindows11でアクティブウィンドウのスクリーンショットをPNG保存するショートカット（ビデオ > キャプチャフォルダ内に保存される）

#よく行う操作
|入力|場面|用途|
|:--|:--|:--|
|Shift + F10|全般|Appキー|
|Alt + Tab|Windows|タブ切り替え|
|Alt + Shift + Tab|Windows|タブ切り替え（戻）|
|Alt + F4|Windows|アプリ閉じる|
|Win + 矢印キー|Windows|ウィンドウリサイズ|
|F7|文字入力時|全角カナ化|
|F8|文字入力時|半角カナ化|
|F9|文字入力時|全角英数化|
|F10|文字入力時|半角英数化|
|F11|Browser|全画面化|
|Alt + ←/→|Explorer/Browser|履歴戻る/進む|
|Alt + ↑|Explorer|階層を上がる|
|Alt + Enter|Explorer|ファイルプロパティ|
|Shift + Delete|Explorer|ファイル削除|
|Ctrl + Home/End|Excel/テキストエディタ|先頭/終端に飛ぶ|
|Shift + Ctrl + Home/End|Excel/テキストエディタ|先頭/終端までを選択|
|Ctrl + PgUp/PgDn|Excel|隣のシートに移動|
|Shift + Ctrl + PgUp/PgDn|Excel|隣のシートをグループ選択|
|Alt + PgUp/PgDn|Excel|シートの左右方向のページ移動|
|Ctrl + Space|Excel|列選択|
|Shift + Space|Excel|行選択|
|Shift + F11|Excel|シート挿入|
|Alt + F11|Excel|VBA Editor起動|
|Ctrl + NumpadPlus|Excel|挿入|
|Ctrl + NumpadMinus|Excel|削除|
|F2|Excel|セル内編集セル参照編集切り替え|
|F4|Excel|相対参照絶対参照切り替え|
Cloud Functions for Firebaseで開発を始めるときのちょっとした知見

Cloud Functions for Firebaseでちょっとしたものを開発したときに、便利だなーと思ったことをまとめます。

# 外部サービスのAPIを叩くにはプランの有料化が必要（ただし無料枠あり）
例えばSlack APIを使ってSlack上のなんやの自動化をサーバレスでやりたい、ということは無料プランではできません。アウトバウンドネットワークの制限が無い定額プランにするか、従量課金制のプランにする必要があります。従量課金制のプランには無料枠があり、何かをテスト的にやってみる分には十分なので、ほとんどの場合無料で試せます。テスト後は無料プランに戻しておきましょう。

[Firebase Pricing | Firebase](https://firebase.google.com/pricing?hl=ja)

# 環境変数の設定
シークレットキーやパスワードなど、コード中に埋め込みたくない値は環境変数として設定できます。

```shell
# 設定
firebase functions:config:set slack.api_key="XXXXXXXXXXXX"
# 確認
firebase functions:config:get
# 削除
firebase functions:config:unset slack.api_key
```

環境変数はコード中からは次のように参照可能です。

```javascript
const functions = require('firebase-functions')
const { WebClient } = require('@slack/web-api')

const slack = new WebClient(functions.config().slack.api_key)
```

[環境の構成 | Firebase](https://firebase.google.com/docs/functions/config-env?hl=ja)

# ローカルで動作確認
Functionsはデプロイする前にローカルで動作確認することが可能です。

```shell
firebase emulators:start
# もしくは
firebase emulators:start --only functions
```

これでローカルにサーバが立ち上がり、コンソールにエンドポイントが表示されているはずです。

[ローカルでの関数の実行 | Firebase](https://firebase.google.com/docs/functions/local-emulator)

## ローカルサーバに環境変数を反映
`functions:config:set`で追加した環境変数を利用したコードをローカルで動作確認する場合、環境変数の内容をファイル化しておかないと、環境変数が利用できません。

```shell
!  Non-existent functions.config() value requested!
```

のようなエラーメッセージが出ます。

```shell
firebase functions:config:get > .runtimeconfig.json
```

ポイントとして、このファイルは`functions`ディレクトリにある必要があります。

```shell
app/
　├ functions/
　│　├ index.js
　│　├ …
　│　└ .runtimeconfig.json
　└ .firebaserc
```

また、忘れず.gitignoreに追加しておきましょう。

---
ちょっとしたものならこれでもうサクッと開発してしまえるのではないかと思います。
GoでランダムなGif画像を生成する

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の22日目の記事です。

# はじめに
GoでのGIF画像生成を調べてもあまり出てこなかったので書いてみます。

👇実際の生成物
<img width="471" alt="スクリーンショット 2019-12-22 16.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/409cd988-0cff-6ee8-25f1-bc0b5fa87773.gif">

本記事には関係ないですが、`image.Image`から`image.Paletted`に変換する方法って何かいい方法ありませんかね...

# 考えかた
- `Int`のスライスを生成する
- 数字に対応する色をマッピングする
- マッピングした画像を複数作り、GIFにする

### Int スライス
<img width="471" alt="スクリーンショット 2019-12-22 16.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/6f8b5b7e-90e6-cf94-f466-5a522010b0bd.png">

### マッピング
<img width="471" alt="スクリーンショット 2019-12-22 16.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/2bf2f6cc-4f90-4f17-2cb2-a6582bc06714.png">

# コード

```go
package main

import (
	"image"
	"image/color"
	"image/gif"
	"math/rand"
	"os"
)

func main() {
	var w, h, scale, delay = 8, 5, 100, 100
	var items [][]int
	var palette = []color.Color{
		color.RGBA{255, 0, 255, 255},
		color.RGBA{0, 255, 255, 255},
		color.RGBA{255, 255, 0, 255},
	}
	for i := 0; i < 5; i++ {
		items = append(items, generateItem(w, h, len(palette)))
	}
	generateGif(w, h, scale, delay, items, "hoge", palette)
}

func generateItem(w, h, nums int) []int {
	var item []int = make([]int, w*h)
	for i := 0; i < w*h; i++ {
		item[i] = rand.Intn(nums)
	}
	return item
}

func generateGif(w, h, scale, delay int, items [][]int, filename string, palette []color.Color) {
	var images []*image.Paletted
	var delays []int

	for i := 0; i < len(items); i++ {
		img := image.NewPaletted(image.Rect(0, 0, w*scale, h*scale), palette)
		images = append(images, img)
		delays = append(delays, delay)

		for x := 0; x < w*scale; x++ {
			for y := 0; y < h*scale; y++ {
				img.Set(x, y, palette[items[i][y/scale*w+x/scale]%len(palette)])
			}
		}
	}

	f, _ := os.OpenFile(filename+".gif", os.O_WRONLY|os.O_CREATE, 0600)
	defer f.Close()
	gif.EncodeAll(f, &gif.GIF{
		Image: images,
		Delay: delays,
	})
}
```
# おわりに
カレンダーも残り数日ですね

以上明日も頑張ります！！
[tomowarkar ひとりAdvent Calendar Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)

# 参考
https://golang.org/pkg/image/gif/
https://gist.github.com/nitoyon/10108182cc0c12f54878
作って理解するOS_メモリ管理の仕組み(4/5章まとめ)

OSがどのようにファイルを管理しているかのまとめ
#ファイルシステム
ファイルを使ってデータを管理するプログラムの集まりは**ファイルシステム**と呼ばれる。ファイルシステムは１つのファイルに関して、「保存すべきデータそのもの」と「ファイルの属性」の２種類の情報を管理する。
#ファイルディスクリプタ
プロセスがファイルにアクセスする際は**ファイルディスクリプタ**を介して上述の２種類の管理情報にアクセスする。
プロセスは、ファイルシステムが提供したシステムコールでのみファイルにアクセスでき、基本的なシステムコールは
・CREATE/DELETE　（作成と削除）
・OPEN/CLOSE　（オープンクローズ）
・READ/WRITE　（読み込み書き込み）
・SEEK　（アクセス位置の変更）＜＝READ/WRITEじゃなくて、データの読み書きを伴わないでアクセス位置を変更したいとき
・GET/SET ATTRIBUTES　（属性の取得と設定）
・RENAME　（ファイル名の変更）
#通常ファイルと特殊ファイル（略）
#シーケンシャルアクセスとランダムアクセス
##デバイス側から見た差異
シーケンシャルアクセス：磁気テープなどでは、連続したすべてのデータを順番に読み込んでいって比較するしか道はない。EOFフラグを最初から見ていって見つけ出す必要がある。
ランダムアクセス：一方で、位置を指定することで一意にデータを特定する。
##アプリケーション側から見た差異
シーケンシャルアクセス：１バイト単位のアクセスを必要とするファイル（改行コードを先頭から集計していくため）
ランダムアクセス：レコード番号をインデックスとしてアクセスする。
#ブロック単位のデータ管理方法
##連結リスト
インデックスでブロックデータのブロック位置を特定する。
##可変長インデックス
管理データファイルの属性値としてブロックデータのブロック番号を可変長列として保持する。
##固定長インデックス
ロックの開始番号だけ管理ファイルの属性値として持っている。あとの順番はデータ自身に任せる。

#5章
OSが管理する入出力のまとめ。プロセスはOSが提供する**システムコール**を呼び出すことで（システムコールが界面）入出力機器にアクセスし、一方OSはハードウェアインターフェースの抽象化を行っている。
#入出力デバイスの種類
デバイスの種類は
・入力のみ
・出力のみ
・入出力
に大別される。キーボードなどは任意のタイミングでデータを出力しつづけ、生成されるデータ量を測れないし、アドレスも存在しない：**ストリームデータ**という
#入出力ソフトウェアの階層構造
上流からは、上位層（プロセス）→**非依存ソフトウェア**→**デバイスドライバ**→**割り込みハンドラ**→**ハードウェア**の順の処理が流れる。

非依存ソフトウェア・・・プロセスからの入出力要求を管理する(e.g. ファイルシステム)
デバイスドライバ・・・ハードウェアを直接制御する
割り込みハンドラ・・・入出力機器からの要求があった時にどのような処理を行うかを示す（デバイスドライバの一部）

ブロッキング処理・・・プロセスが下位の情報を待たされるか。あとで受け取るようにして、継続処理が可能なものはノンブロック処理という

#入出力ハードウェア
ハードウェアインターフェース・・・物理的な接続仕様
EtherCATを使うと何がうれしいのか（ポエムだけど語りたいこと）

- この記事は [EtherCATについて語る Advent Calendar 2019](https://adventar.org/calendars/4097) の22日目の記事です。


私が書かずとも、様々な記事で書かれていますが、他の産業用ネットワークの比較して推したいところを語りたいと思います。

# てゆーか、産業用ネットワークって何よ
産業用ネットワークは工場の製造装置をネットワーク管理するプロトコルです。

RS485等のシリアル系のField BusからEthernetを使用したIndustrial Ethernetへの置き換えが進んでいます。

理由としては、Ethernetケーブル自体が安くて安定してるのと制御用のパソコンとの親和性が高いのとシリアル系より速度が早く、ケーブルもより長く伸ばせて取り回しが良く拡張性が高い、辺りでしょうか。
- Ref. [産業用ネットワークの種類・シェアの最新情報【RS485はもう古い？】](https://lab.fujiele.co.jp/articles/4277/)


![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70083/f8001488-a3f3-bd84-b1a6-b80f078c04c6.jpeg)
- Ref. [産業用ネットワーク市場シェア動向 2019 （HMS 社統計） ](https://www.hms-networks.com/ja/news-and-insights/2019/05/07/industrial-network-market-shares-2019-according-to-hms)

そんな中のIndustrial Ethernetの中でEtherCATのシェアは3位。あまり高くない。ように見えますが、
- EtherNet/IP <- DeviceNet
- PROFINET <- PROFIBUS DP
- Modbus-TCP <- Modbus-RTU
- CC-link IE <- CC-link
- PowerLink <- CANopen


他のは既存のField Busからの置き換えが多いです~~（PowerLinkは何だったけ？）~~。そんな中での健闘ですよ。新規で導入される理由が存在する！ではEtherCATを使うと何がうれしいのかをポイントを２つ書きます。

# ポイント１：とにもかくにもEtherCATの高リアルタイム性が良い！最速のネットワーク！

最適化した応答速度はマイクロ秒オーダー！

ロボットアームをリアルタイム制御できるほどの速度がすごいです。単純にプログラムを無限ループでマイクロ秒ごとに回しても、ちゃんとマイクロ秒±適当な誤差範囲で動くかどうかはあやしいところです（OSの処理の割り込みとかで）

14日目の[EtherCATの通信距離について](https://qiita.com/nonNoise/items/89ea8010324ac2a853dc)で50mのケーブルで

>因みに、自宅のデスクトップUbuntu環境（LANは1Gbps)では、以下のような速度が出た。
>
>1台目の計測
>
>平均　time:0.2914221599848584[ms]
>
>最大　time:0.3707408905029297[ms]
>
>最小　time:0.23818016052246094[ms]

ネットワーク越しで平均300us±100usの通信速度とかやばくないですか？？？
これを何台もPLCやセンサも含めてネットワークで接続できる！データ食べ放題ですよ！AIでエッジ制御も良いですが、ネットワーク越しにリアルタイムに制御できるのも、どちらも良いですよ（錯乱）！

# ポイント２：あと会費が比較的安い

法人じゃないと入れないっぽいですが。

>Q7. EtherCATはオープン規格なの？
>オープン規格と言いつつ、仕様書をダウンロードするにはETG (EtherCAT Technology Group)に入会する必要があります。ETGへは無料で入会することができますが、法人でないと入会できないようです
- Ref. 4日目：[IoTつくるよ！でのEtherCATに関するFAQ](https://lipoyang.hatenablog.com/entry/2019/12/04/120212)


他の産業ネットワークの入会費や装置の認証費用に比べて比較的安いと思います。

# 終わりに

これが第４次産業革命！Industrie 4.0だ！ドイツ！（これが書きたかっただけなのでは……）
文言のビルド失敗

## はじめに

[前回](https://qiita.com/libru1/items/cf253f64ff88f7afa1dd)

コマンドラインから実行しました
READMEの通りに出来ず、そのレベルに達してないようですが、くじけず進めていきます

## 実行
usageによるとレンダリングが出来そうなので実行

```sh
node ./build/wenyan.js —render ./examples/helloworld.wy
```

エラー発生
/dev/stdoutにアクセス出来ません

windowsだからありません
リダイレクトしてみる

```sh
node ./build/wenyan.js —render ./examples/helloworld.wy > ./renders/helloworld.svg
```

エラー変わらず

残念

## ビルド
それぞれのプラットフォーム用にビルドが必要なのかな。

Makefileを見て実行

```sh
cd tools
node ./make_cmdline.js
```

エラー発生
また/dev/~
デバイスがらみ。潰せない

エラーは出ていたが、wenyan.jsのタイムスタンプが変わったので、サイズが小さくなっているのがきになるが実行してみる。

レンダリングエラーメッセージ変わらず。
windowsでは、無理なのかな。

## おわりに

またレンダリングに挑戦します
【動画解説付き】micro:bitの使い方~Scratch編~

![アイキャッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538330/400d256d-9459-c789-08a3-18f6f401bce4.png)
どうも、プログラミングの鬼シヨツ鬼です。
この記事では「micro:bit(マイクロビット)をScratchでプログラミングしたいぜ」って人に向けて環境の準備からサンプルプログラム実行までの流れを説明します。
ちなみに、この記事は次の動画と同じ内容ですので、記事だけだと分かりづらい部分は、そちらもご活用ください。
(ボタンの位置や操作方法などがわかるので、初心者の方は動画のほうが分かりやすいかも)
[YouTube: micro:bitの使い方~Scratch編~](https://youtu.be/M8WZyN2GBpo)

#準備するもの
・micro:bit
・Scratch3.0がインストールされているPC
　(オンライン版のScratchを使う場合はインストールは不要。インストール方法は[こちら](https://www.youtube.com/watch?v=U6LTxUd25ko))
・tybe-BのUSBケーブル

#Scratch Linkのインストール
###1,Scratchでmicro:bitを使うために、Scratch LinkというソフトをPCにインストール
インストーラの配布サイトは[こちら](https://scratch.mit.edu/microbit)です。
###2,Scratch用のHEXファイルをmicro:bitに転送
Scratch Linkの配布サイトと同じサイトで入手することができます。
転送の際はPCとmicro:bitをケーブルで繋げてください。

#Scratch3.0の準備
###1,Scratch Desktopのアプリを開く
###2,画面左下にある「拡張機能」のボタンをクリック
###3,「拡張機能を選ぶ」の画面から「micro:bit」を選ぶ
###4,PCとmicro:bitを接続する
Scratch側でmicro:bitの検索が始まるので、発見された自分のmicro:bitの「接続する」をクリックしてください。

#プログラムの作成・実行
通常のScratchでのプログラム作成と同じように、ブロックを並べてプログラムを作ります。
プログラムを作った後に転送する必要などはなく、そのまま緑の旗を押すことで実行することができます。
![sample.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538330/59413f81-b255-04e3-ec19-34d22f314b6e.png "micro:bitのAボタンが押されたら「SHIYOTSUKI」という文字をmicro:bitの画面に表示するプログラム例")

#まとめ
Scratchでmicro:bitを使えると、作れる作品の幅が広がるので、ぜひ試してみてください！！
micro:bitの傾きセンサなどを使ったコントローラとか面白いかなと思います。
「こんなの作ったらおもしろかった！」などあったらコメントで教えてください！

最後まで、読んでくれてありがとう。
参考になったら「:thumbsup_tone2:」押してね
Web開発勉強のためWordpressでポートフォリオサイトを開設するまで③〜XAMPPローカル環境構築失敗編〜

**XAMPPでローカル環境を構築できたといったな。あれは嘘だ。**

いや、嘘ではないんですけど、うまくいったのはインストールまででした。
講座の動画に従って投稿や固定ページの更新をしたところ、
「更新に失敗しました。 エラーメッセージ: 返答が正しい JSON レスポンスではありません。」
というエラーメッセージが表示され、なにもできない状態でした。

いまだにデータ交換をテキストやらCSVでやっている仕事ですので、XMLはおろかJSONとは、みたいな状態で、ググってもいまいち解決方法がピンとこない・・・
UdemyのＱ＆Ａを覗いても同様の質問がなかったため、思いきって自ら質問してみました。
すると、すぐに先生自ら回答をくださいました！
>php.iniのmax_execution_timeをデフォルト設定から300に変更して、Apacheを再起動してみてください。

とのこと。ちなみにこの日は有給予定だったので平日朝の7時ぐらいに書きこみました。~~先生ヒマなのかしら。~~
というわけで、php.iniを探してパラメーターを上書き。
念のためPCも再起動しましたが・・・残念ながら改善せず。
どうするかなあと悩みましたが、この時点でもうローカル環境は諦めるつもりでした。
Railsチュートリアルやろうとした時のAWSアカウント、まだ無料枠残ってるからそれ使って環境構築すればええやん、と。
程度にもよりますが、初心者向けの講座もろもろいじって無料枠超えても1000円は取られないらしいので、今後のAWSの勉強も兼ねてAWSで環境構築することにしました。

というわけで、先生にはうまくいかなかったことと、AWSで環境構築する旨をお伝えしました。
先生からも、
>XAMPP とWordPressのいずれが原因かどうか切り分けるために、AWSやVPSなどでApacheやNginxで試してみるのがよいと思います。

とのご回答が。~~めんどくさくなったんですね、わかります。~~

ちなみに先生からlogsフォルダにエラーログ出てない？と聞かれたんですが、残念ながらエラーログは見当たりませんでした。
これでAWSの環境構築を試してうまくいかなかったら、いよいよMAC買うしかないな、と思いました。

そんな背水の覚悟で臨んだAWSのWordpress環境構築ですが、下記のサイトを参考にしました。
・https://skillhub.jp/blogs/197

結論から言うと、ようやくうまくいきました。
ターミナルの開き方とかAWSの操作面で不安がありましたが、それほど難しくないと思います。
投稿や固定ページの更新も問題なくオーケー。
ようやくスタートラインに立てたかなという感じです。
次回からは、サイトを作っていく中でつまづいた点などを書いていきたいと思います。
ancestry'使用時,seedsに多階層カテゴリを書くのめんどくさいから、一気に置換してみる

### gem 'ancestry'使用時,seedsに多階層カテゴリを書くのめんどくさい
一階層でこの分量！孫の階層までペタペタ書くのめんどくさい。
少しでも楽したい。せめてexcelみたいに一気に置換とかしてらくしたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463763/32cd024d-e37f-1da0-2b89-a6cf24789bcb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463763/35b9550e-9dcd-1f56-ed99-824c3de74cba.png)


-----------------------------------------------------------------------

###　VSCodeでコピペでなんとかしてみる。

とりあえず一階層目を、検証ツールでコピペする。（どうせ加工するので、適当でOK。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463763/35b97965-e039-cd2b-e597-134a1264a309.png)

------------------------------------------------------------------------

command + F →　▷　をおす　→　.* を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463763/d5b12490-fdef-4a7a-9648-7bc4cb9d50f3.png)

------------------------------------------------------------------------
\<option value="1">レディース\</option>

↓　こんな風に一気にかえたい！

{layer1:"レディース",layer1_chaild:[]
{layer1:"メンズ",layer1_chaild:[]
{layer1:"インテリア・住まい・小物",layer1_chaild:[]
{layer1:"本・音楽・ゲーム",layer1_chaild:[]
{layer1:"おもちゃ・ホビー・グッズ",layer1_chaild:[]
{layer1:"コスメ・香水・美容",layer1_chaild:[]
{layer1:"家電・スマホ・カメラ",layer1_chaild:[]
{layer1:"スポーツ・レジャー",layer1_chaild:[]
{layer1:"ハンドメイド",layer1_chaild:[]
{layer1:"チケット",layer1_chaild:[]
{layer1:"自動車・オートバイ",layer1_chaild:[]
{layer1:"その他",layer1_chaild:[]

------------------------------------------------------------------------
#### 作業１
検索に↓を入力

\<option value="\d+">

\d+　→　これは数列をさしてます。 

置換に↓を入力

{layer1:"

------------------------------------------------------------------------
#### 作業２
検索に↓を入力

\</option>

置換に↓を入力

",layer1_chaild:[]\n

\n　→　改行です。

--------------------------------------------------------------------------
#### ポイント
ワイルドカードの使い方がEXCELとは勝手がちがう。。。

正規表現を使用する必要があるみたいです。
[Visual Studio での正規表現の使用](https://docs.microsoft.com/ja-jp/visualstudio/ide/using-regular-expressions-in-visual-studio?view=vs-2015&redirectedfrom=MSDN)

この要領で、２階層と３階層も作成できると思います。

この方法でも、やっぱめんどくさいので、もっといい方法がありそうです。
あと、カテゴリー一覧ページみたいなのがあったら、スクレイピングとかしても面白いかも。（訳あって今回はスクレイピングはできなかったけど。）
STM32F103C8T6 開発ボード（通称 Black Pill）小物 寄せ集め

いざ使おうと思った時，自分で動作確認したスケッチが頼りになります。webで先輩たちのスケッチと資料を集めていきます。

たくさん引用させていただきました。感謝します。

# まずは回路図とピンアウト

私のは Black Pill のコピー品で，LEDの位置がPB12のようでした。なので，回路図はこれになります。

https://2.bp.blogspot.com/-Q5FtnBZkFdM/Wsd250LFFkI/AAAAAAAAIzw/kx2-Ud3FJQMoFWB_dOHgB80Hht8W4RgzQCLcBGAs/s1600/black%2Bpill%2Bschematic.jpg

外部電源入力端子がありません。USBから給電するか？
でも，ST-LINKの時は，VCC3.3Vの供給だけで動いていることになります。
ですので，RT9193なるLDOは，ある程度逆耐圧に持ちこたえられる，と判断できます。長期運用なら，入出力間ダイオードか，素直に5Vのところに入力すべきでしょうね。

ピンアウト図もあると便利ですね。これが便利でした。

https://www.google.com/url?sa=i&source=images&cd=&ved=2ahUKEwiS_MTl18jmAhXTMt4KHVEwC7MQjRx6BAgBEAQ&url=https%3A%2F%2Ftwitter.com%2Fj3dz%2Fstatus%2F1134568077922832384&psig=AOvVaw2fUNYVq_S4peflS_6wSEQT&ust=1577084514291027

（2019/12/26 追記）
ピン番号は`PB12`などGPIOピン名称を使うことができます。以下のページが便利です。

https://scrapbox.io/ArduinoSTM32/%E3%83%9C%E3%83%BC%E3%83%89%E5%9B%BA%E6%9C%89%E3%81%AE%E5%AE%9A%E6%95%B0
（追記終わり）

# シリアル

STM32とは関係ありませんが...

Arduino IDE のシリアルモニター，まさにモニターするだけならいいのですが，文字の送信が1行単位です。WinではTeraTerm, MacではCoolTermを愛用しているのですが，そちらは1文字単位で送信されます。

一つのスケッチで，両方とも対応できるようないい方法がないかなあ，と考えていましたら，いい手がありました。

https://ch.nicovideo.jp/yugata/blomaga/ar1177727

`    String str = Serial.readStringUntil('\n');`

とすることで，1行，またはタイムアウトした時点でSTMが受け取れます。私的にはこれでOKです。Arduino IDEでは文字+[Enter]， TeraTerm/CoolTermでは文字をタイプするだけでSTMに文字が送れます。

# タイマーとその割り込み

ずばりこちらですね！ LEDをPB12にして，すっと動きました。

http://nuneno.cocolog-nifty.com/blog/2017/02/stm326-735e.html

# PWM出力

上と同じ方のようですが，

https://gist.github.com/Tamakichi/4ea4ed316c76a0ac33a40f3625eb2e0d

コピペでさくっと動きました。古いですが，感謝感激です。

5kHzでテストしました。PICで作った簡易オシロで動作も確認できました。

![P_20191222_154028_vHDR_Auto.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/3a58f170-5957-05b6-ccec-789f96a72ea5.jpeg)
Livedoorブログの記事更新をPythonとseleniumで自動化してみた。


皆さん、こんにちは。中川です。かなり久しぶりの投稿です。普段は会社でJavaを使った業務用のWebアプリケーションを作っていますが、一般生活ではPythonでスクレイピングをしていることが多いです。特にブログの自動更新やsnsなどの自動フォローなどにはまっています。そこで今回、Pythonとseleniumを使って簡単なブログ更新を行ってみました。

<h2>環境</h2>
Python 3.7.0
selenium 78

<h2>コード</h2>
```python:qiita.py
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

class LivedoorAuto:
	def __init__(self):
		options = webdriver.ChromeOptions()
    　　　#chrome://version プロフィールパスを参照
		options.add_argument("")
       #executable_pathには、chromedriverのパスを記入
		self.bot = webdriver.Chrome(executable_path="", chrome_options=options)

	def livedoor(self):
		bot = self.bot
        #ブログ投稿ページのurl
		bot.get("")
                
		wait = WebDriverWait(bot,60)
		entry_title = wait.until(expected_conditions.visibility_of_element_located((By.ID,"entry_title")))

		entry_title.send_keys("Hello")

		while True:
			try:
				entry_body = wait.until(expected_conditions.visibility_of_element_located((By.ID,"editor_1_f")))
				entry_body.send_keys("Hello Everyone")
				break
			except TimeoutException:
				print("timeout")
				continue
		
		sleep(2)
		bot.find_element_by_class_name("quickSocialMessage").send_keys("Hello")

	
ed = LivedoorAuto()
ed.livedoor()
```
タイトルをhello、記事内容にHello Everyoneという文字を記入するようなコードです。

最初にurlにアクセスする際に、ログインページに飛ばされますが、何度もログインを繰り返すとスパム扱いされることがあるため、最初からログイン情報をセッションに保持するようにしています。
seleniumで、ログイン情報を保持する方法は、以下のページに詳しく説明されています。
<a href="https://rabbitfoot.xyz/selenium-chrome-profile/">Seleniumで次の実行時にもサイトのログイン状態を維持したい場合</a>

あまり難しくはないのですが、案外ネットでこのような情報が少なかったので、書いてみました。何かの参考になると幸いです。
Recorder.jsを利用してブラウザ上で音声を録音する

# ブラウザ上で音声を録音、音声ファイルのダウンロードする

[GitHub Pages](https://s1r-j.github.io/Recorderjs/)で公開しているページで実施できます。
ライブラリとしてRecorder.jsを利用しています。

![ブラウザで録音](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182261/eee77518-2ee1-0882-504e-5f625a7d7f0b.png)

# Recorder.jsとは

Recorder.jsとは[Web Audio API](https://www.w3.org/TR/2018/CR-webaudio-20180918/)というJavaScript APIをラップし、簡単に録音とその音声ファイルの出力を可能にするJavaScriptライブラリです。
このライブラリをHTML内で読み込むことによって、ブラウザ上からPCのマイクを使って録音して音声ファイルをダウンロードできるようになります。

GitHub上に公開されていた[元のリポジトリ](https://github.com/mattdiamond/Recorderjs)を修正しています。
修正したリポジトリは[こちら](https://github.com/s1r-J/Recorderjs)です。また、利用例として[GitHub Pages](https://s1r-j.github.io/Recorderjs/)を使って、ブラウザ上で録音、音声ファイルダウンロードできるようにしています。

本当はライブラリの修正がしたかったのではなく、ブラウザで録音してそのファイルを[Amazon Transcribe](https://aws.amazon.com/jp/transcribe/)に処理させてテキスト化するというWebサービスを作りたかったのですが、時間がとれませんでした...

## フォーク元Recorder.jsの問題点

フォーク元のRecorder.jsは2019年12月時点では開発が停止しており、残念ながらそのままで使うことはできませんでした。

- `AudioContext.resume()`が呼び出されていない
- `Navigator.getUserMedia()`が利用されている

### `AudioContext.resume()`が呼び出されていない

[`AudioContext.resume()`](https://developer.mozilla.org/ja/docs/Web/API/AudioContext/resume)は...あまりよくわかっていないです。
説明では途中停止した音声を再生するために使うらしいですが、AudioContextの初期化に必要らしい？
このメソッドを追加しないと録音ができなかったため、とりあえず追加しました。

### `Navigator.getUserMedia()`が利用されている

[`Navigator.getUserMedia()`](https://developer.mozilla.org/ja/docs/Web/API/Navigator/getUserMedia)は**非推奨**となっています。そのため、一部のブラウザ（Safariなど）ではこのAPIによる操作をおこなうことができないようです。
代替として`MediaDevices.getUserMedia()`を利用することが推奨されています。

今回は`MediaDevices.getUserMedia()`に実装を変更したことで、Safariでも録音をおこなうことができるようになっています。

# ブラウザ上での利用例

[GitHub Pages](https://s1r-j.github.io/Recorderjs/)で公開しているページで実施できます。

マイクの利用を許可し、recordボタンで録音を開始します。
stopを押すことで録音を停止し、音声ファイルが表示されるため、ブラウザ上で再生したり、ファイルダウンロードしたりできるようになります。
再度record、stopをすることで、音声ファイルがさらに追加されていきます。
（ボタンの見た目などはかなりダサいので改善余地あり）

# おわりに

最初にも書きましたが、[Amazon Transcribe](https://aws.amazon.com/jp/transcribe/)が日本語対応して音声からテキストを書き起こすことができるようになったので、
簡単に録音してテキスト化するというサービスにするつもりでした。
AWSではJavaScript SDKが公開されていて、多くの実装例が存在するため難しくないはずです。
時間がとれたときに挑戦してみようと思います。
macでシェルをfishに変えてpyenvとpipが上手くできなかったときの対処法

## 概要
bashからfishに変えてから，以前まではできていた，pyenvでpythonのインストールとpipでパッケージのインストールができなくなったのでその対処法を紹介します．


## 事象
例えば下記のようなエラーが発生しています．

```bash
pip install selenium                        30.8s
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting selenium
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/selenium/
  WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/selenium/
  WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/selenium/
  WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/selenium/
  WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/selenium/
  Could not fetch URL https://pypi.org/simple/selenium/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/selenium/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  ERROR: Could not find a version that satisfies the requirement selenium (from versions: none)
ERROR: No matching distribution found for selenium
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
```

- opensslそもそもある？

```bash
$ which openssl
/usr/local/opt/openssl/bin/openssl
```
ありますね．．．


## 解決方法
opensslが失敗しているので，読み込めてない可能性があります．

- config.fishに以下を追記

```bash:~/.config/fish/config.fish
set -x PATH /bin $PATH  # なければ追加
set -x PATH /usr/local/bin $PATH  # なければ追加
set -x PATH /usr/local/opt/openssl/bin $PATH  # 一番重要
```

- プロファイルの適用

```bash
$ source ~/.config/fish/config.fish
```

- pythonのインストール

無事pythonをインストールするっことができました

```bash
pyenv install 3.6.2                         786ms
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.2.tar.xz...
-> https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
Installing Python-3.6.2...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.6.2 to /Users/taro/.anyenv/envs/pyenv/versions/3.6.2
```
Vagrant(CentOS7) + Djangoでrunserverする手順

個人での開発をWindows→CentOSへ変更した際、仮想環境でのサーバーの立ち上げとWindows(ローカル)でのサーバーの立ち上げ方の理解があやふやで若干苦労したので、Vagrantを使用してのDjangoでのWebサーバー立ち上げプロセス手順を簡単に記しておく。

## 通常のrunserver
仮想環境上でdjangoのWebサーバーを立ち上げる際、以下のコマンドを使用すると思う。

```
python manage.py runserver
```
この場合、デフォルトで127.0.0.1:8000 が立ち上がることになる。
ローカルpc上での開発であれば大丈夫だが、仮想環境上であれば仮想環境内だけで環境が閉じてしまうことになるため、これだけだとWebブラウザからアクセスすることはできない。

127.0.0.1は、自身のマシン内で処理するものなので代わりに0.0.0.0:8000として指定してあげる。

## vagrantfileの設定

以下の一行をvagrantfileへ記述する必要がある。

```
config.vm.network "forwarded_port", guest: 8000, host: 8080
```
ローカルのブラウザで 127.0.0.1:8080 と打つ → 仮想環境の 8000番ポートにアクセスしますよ、という意味となる。

上記の記述を記載し、保存後、vagrantを起動し直してあげる。

```
# vagrantfileのディレクト内で実行する
# 起動
vagrant up

# 停止
vagrant halt
```

vagrant再起動後、再び以下のコマンドでDjangoを起動させる。

```
python manage.py runserver 0.0.0.0:8000
```
サーバーを立ち上げた後、ローカルPCからWebブラウザへ「127.0.0.1:8080」でアクセスする。
リストの辞書でループを回す

# リストの辞書でループを回す
sklearn の GridSearchCV とかって、どうやってループ回してるのか気になったので、調べました。

例として、パラメータ ('A', 'B', 'C') の動く範囲を

```
d = {'A': [0, 1], 'B': [0, 1, 2], 'C': [0, 1]}
```

とします。('A', 'B', 'C') は全部で 2 × 3 × 2 = 12 通りの取り方があります。

パラメータ ind in range(12) を用いてそれら12通りを以下の表のように対応させます。

|ind|'A'|'B'|'C'|
|---|---|---|---|
|0|0|0|0|
|1|1|0|0|
|2|0|1|0|
|3|1|1|0|
|4|0|2|0|
|5|1|2|0|
|6|0|0|1|
|7|1|0|1|
|8|0|1|1|
|9|1|1|1|
|10|0|2|1|
|11|1|2|1|

# 実装
```Python:sample.py
import numpy as np

d = {'A': [0, 1], 'B': [0, 1, 2], 'C': [0, 1]}

keys, values_lists = zip(*d.items())
# keys = ('A', 'B', 'C')
# values_lists = ([0, 1], [0, 1, 2], [0, 1])

sizes = [len(v_list) for v_list in values_lists]
# sizes = [2, 3, 2]

total = np.product(sizes)
# total = 12

for ind in range(12):
    out = {}
    for key, v_list, n in zip(keys, values_lists, sizes):
        ind, offset = divmod(ind, n)
        out[key] = v_list[offset]
    print(out)
    # {'A': 0, 'B': 0, 'C': 0}
    # {'A': 1, 'B': 0, 'C': 0}
    # ……が、上記の表のように、出力される
```

# 元ネタ
https://github.com/scikit-learn/scikit-learn/blob/7e85a6d1f/sklearn/model_selection/_search.py#L140
文言コマンドライン実行

## はじめに

[前回](https://qiita.com/libru1/items/dab052c175fd40e2d912)
サンプルプログラムを実行しました。

[ReadMe](https://github.com/LingDong-/wenyan-lang)を読み

コマンドラインで動かしてみます

## 実行

chmod +xは出来ないのでそのまま実行

```sh
./build/wenyan.js
```

JScriptエラー発生!

JScriptとはwindowsのスクリプト、wshだそうです


```sh
node ./build/wenyan.js
```


usage引数の一覧出て来ました
実行出来そうです。

## おわりに

引数にrenderがありました
次はsvgファイル作ってみます
AWS DeepComporser について

## はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [Amazon AI by ナレコム Advent Calendar 2019](https://qiita.com/advent-calendar/2019/knowcom-amazonai) の21日目の記事です。

今回の re:Invent で発表された **DeepComposer** についてご紹介します。

## AWS 機械学習スキル学習のインターフェイス
機械学習モデルの学習ツールとして、**DeepLens**、**DeepRacer**、**DeepComposer** の三種がラインナップされたことになります。

> 左上が**DeepLens**、右上が**DeepRacer**。<br> そして下が今回の re:Invent で発表された **DeepComposer**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/a5b463f3-2783-6b43-f217-0153ea668e53.png)
 
#### DeepLens
DeepLens は昨今社会実装が進んでいるコンピュータービジョンのモデルを搭載可能な**ビデオカメラ**です。

- **深層学習**モデルに対応したビデオカメラ
- 2017年の AWS re:Invent で発表
- クラウドで深層学習モデルの学習、ローカルのカメラにモデルを搭載
- オブジェクトの検出、行動認識、顔認識、頭部姿勢の検出など、撮影した動画の分析や処理が可能
- 実機の価格は 249 ドル

#### DeepRacer
DeepRacer は誤解を恐れずにいえば**強化学習を学ぶための最先端ラジコン**。実機の値段もさることながら、モデルの学習にかなりの計算資源を要します。継続的に学習できる方は限られるのではないでしょうか？

- **強化学習**のモデルを搭載できる自走型のレーシングカー
- 2018年の AWS re:Invent で発表
- 高度な機械学習テクニックである強化学習モデルのトレーニング方法を楽しみながら学習
- 世界各地でリーグ開催中。2019年11月には新モデル AWS DeepRacer Evo 発表
- 実機の価格は 399ドル

#### DeepComposer
DeepComposer は Generative AI を楽しみながら学べる、機械学習を搭載した世界初のキーボードです。

- **敵対的生成ネットワーク(GAN)**モデルのトレーニングと最適化を通して、オリジナルの音楽を作曲
- 2019年の AWS re:Invent で発表
- 物理的なキーボードだけではなく、**仮想キーボード**を用いて、どこでも作曲・学習可能
- 実機の価格は **99 ドル**

## DeepComposer、なにができる?
もう少し DeepComposer について見ていきましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/afd8a460-33a1-07e6-0a1a-3a12018bd904.png)


#### 無料利用枠 (12か月間)でできること
無料枠の範囲内で、事前にトレーニングされたモデルを活用でき、以下が実行可能です。
AWS クラウド上の仮想キーボードであれば、すぐにでも使えます。

- 音楽のジャンル (ロックやポップなど) のサンプルモデルを用いることで、**コード記述不要**でモデル構築可能
- キーボードを使ってメロディを入力すると、AWS DeepComposer はクラウドで機械学習の推論を実行し、**4 つのパートの伴奏を生成**
- 音源に対し、ポップ、ロック、ジャズなど**編曲が可能**


#### 無料トライアル (3か月間) でできること
無料利用枠に加えて、30 日間の AWS DeepComposer 無料試用版を利用できます。

- 最大 **4 つのモデルのトレーニング**と、それらのモデルを使用した**新しい音楽作品の生成を最大 40 回**まで実行
- Amazon SageMaker を用いて、独自のGANアーキテクチャを構築可能。
- 手元の DAW (デジタルで音声の編集や編曲などできるシステム)を使用して、楽曲のカスタム可能
- Amazon.com で AWS DeepComposer キーボードを購入すると、**さらに 3 か月間の無料試用期間**が追加
- **Generative AI Talent Show** (気になりますね！)に提出する楽曲の作成


## まとめ
DeepComposer は、DeepLens、DeepRacerに比べて、**要する知識レベル・コスト**ともに学習の**ハードルがかなり下がっている**印象を受けました。今が旬の差の Generative AI (また別の記事でご紹介しようと思います) について学習できるのもポイントです。

そもそも音楽はパーソナルなものなので、アウトプットそのものに優劣をつける性質自体が希薄です。個人学習との親和性も高そうですし、モデルの派生系、例えば特定のアーティストの楽曲傾向をシュミレートするモデルや、特定ジャンル(デスメタルとかエレクトロニカとか)のモデルを作る人が出てくると面白そうです。

一刻も早く実機を触ってみたいですね。仮想キーボードであればすぐにでも使用可能なので、休暇中に遊んでみるのも良いのではないでしょうか。