OmniAICreator/Qiita-1.07M huggingface dataset:
M5StickVのMaixPy開発環境


#概要
M5StickVのMaixPy開発環境、日々色々な不具合などが解消・機能拡張されています。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">V IDE!!! pls try.<a href="https://t.co/TRXbswJD0f">https://t.co/TRXbswJD0f</a> <a href="https://t.co/wBE5Xh4lGH">https://t.co/wBE5Xh4lGH</a> <a href="https://t.co/jNOqSNnCW3">pic.twitter.com/jNOqSNnCW3</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1161226432179105794?ref_src=twsrc%5Etfw">August 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


M5StickV Quick Start のページに載っているツールから、VerUPしています。
https://docs.m5stack.com/#/en/quick_start/m5stickv/m5stickv_quick_start


## 1. Download Firmware

M5StickVに書き込むFirmwareは、以下のURLから、
maixpy_v.XXXXXXXXX_m5stickv.bin 
をダウンロードします。

http://dl.sipeed.com/MAIX/MaixPy/release/master/

19/8/14時点ではv0.4.0_39が最新です。
http://dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.4.0_39_g083e0cc/

## 2. Flash Firmware
Firmwareを書き込むkflash_guiは、以下のURLから、windowsの場合、
kflash_gui_XXXX_windows.7z
をダウンロードします。
https://github.com/sipeed/kflash_gui/releases

なお、
v1.5.1以降は、Board→M5StickV　を選択します。
v1.5.1以前は、Board→Maix Go　を選択します。
v1.2.5は、Board→Auto　でも書き込めます。

19/8/14時点ではv1.5.3が最新です。

## 6. MaixPy IDE
PythonでプログラミングするMaixPy、以下のURLから、windowsの場合、
maixpy-ide-windows-XXX.exe   
をダウンロードします。
http://dl.sipeed.com/MAIX/MaixPy/ide/

19/8/14時点ではv0.2.4が最新です。
http://dl.sipeed.com/MAIX/MaixPy/ide/v0.2.4/



#最後に

よいM5StickVライフを！！
「スプリクト」と「スクリプト」

#はじめに
どうも、めかとろ人間です。
正直この記事をQiitaにあげていいものか...と悩んだのですが、IT用語に関する話であること、どちらが正しい言葉なのか検索ですぐに出てこなかった事を踏まえ、記事の投稿に踏み切りました。

#この記事の対象
タイトルにある通り、今回は「スプリクト」、「スクリプト」なんだか両方聞いたことがあるような.....両方使えるような......そんな気がしてきて、どっちが正解なのか分からなくなってしまった残念な方向けの記事です。

#ことの発端
JavaScriptに関する業務をしていて、「JavaScript」という単語が頻繁に飛び交っていました。
ある時、私の会話を傍らで聞いていた友人に、

**『お前、「ジャバスクリプト」を「ジャバスプリクト」って言わない？』**

と言われ、私の中に衝撃が走りました。

確かに「スプリクト」と言っている気がする.....（気のせいじゃなかった。）
そもそも「スクリプト」と「スプリクト」ってなんか意味が違うのか....？
もしかしたら両方とも正解......？

そんな考えが交錯していました。

#ググった。
まぁ、わからないことはgoogle先生に頼るのが世の中の常識です。
早速、親の顔よりも見た検索ボックスに「スプリクト」を入力して検索しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434095/196b461d-5d78-9d4a-b669-8725db735e39.png)

...どうやら**「スクリプト」が正しい**ようです。

チョット考えれば、
英語に直すと「スクリプト」は「Script」であり、
「JavaScript」というところからも「スクリプト」が正解であることは明白です。

#まだ諦めない。
じゃあ間違いであった「スプリクト」はどこから.....？
もしかしたら海外の人も間違えるのでは？？と思い、英語で「Sprict」と入力してgoogle検索をかけてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434095/85446e34-7e71-f933-3f1d-91a015461581.png)

検索のヒット件数から見ても、
どうやら海外の人も間違える人が一定数いる(？)のかもしれません。

#調査結果
いろいろ検索をかけた結果、[このページ](https://www.wdic.org/w/TECH/%E3%82%B9%E3%83%97%E3%83%AA%E3%82%AF%E3%83%88)にたどり着きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434095/26c1636d-c68a-f26f-35d7-35418bc1fc41.png)
>スクリプト(script)のことらしい。
単純な間違いながら広く蔓延している模様である。

確かに、
「Script」の "ｃ" と "ｐ" を入れ替えると「Sprict」になるし、
「スクリプト」の "プ" と "ク"を入れ変えると「スプリクト」になります。

日本人も、英語圏の人も単純な間違いが蔓延したというのには納得のいくものがあります。

#さいごに
もし、あなたの周りにスクリプトを「スプリクト」と発音してしまう人がいたら、
「あっ、スクリプトのことを言ってるんだろうなぁ」と脳内補完するか、
やんわりと教えてあげてください。
certbot-dns-sakuracloudを利用したLet's Encrypt証明書更新に失敗する場合の原因と対応方法

## はじめに

DNSサーバとしてさくらのクラウドDNSを利用している場合、certbot-dns-sakuracloudを利用することで、DNS認証によるLet's Encryptの証明書追加および更新を自動化することができますが、更新時に以下のようなメッセージが表示され、証明書の更新に失敗する場合があります。

※以下はhoge.localという架空のドメインを例にしていますが、このようなドメインは当然さくらのクラウドDNSやLet's Encryptでは扱えません。

```
# certbot renew --force-renewal --server https://acme-v02.api.letsencrypt.org/directory
(略)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/hoge.local.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Plugins selected: Authenticator dns-sakuracloud, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for hoge.local
dns-01 challenge for hoge.local
Unsafe permissions on credentials configuration file: /root/.sakura
不適切な要求です。パラメータの指定誤り、入力規則違反です。入力内容をご確認ください。
_acme-challenge のTTLは全て同じである必要があります
Cleaning up challenges
Attempting to renew cert (hoge.local) from /etc/letsencrypt/renewal/hoge.local.conf produced an unexpected error: Error adding TXT record: 400 Client Error: Bad Request for url: https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/commonserviceitem/xxxxxxxx. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/hoge.local/fullchain.pem (failure)
```

## 原因

以下のファイルより、 ```ttl = 60``` という記述が確認できます。これによって、更新時にこれから追加される ```_acme-challenge``` TXTレコードに設定される（あるいは既存の ```_acme-challenge``` TXTレコードに設定されていることが期待されている）TTLが60秒であることがわかります。

https://github.com/certbot/certbot/blob/master/certbot-dns-sakuracloud/certbot_dns_sakuracloud/dns_sakuracloud.py

``` python:dns_sakuracloud.py
class Authenticator(dns_common.DNSAuthenticator):
    """DNS Authenticator for Sakura Cloud DNS
    This Authenticator uses the Sakura Cloud API to fulfill a dns-01 challenge.
    """

    description = 'Obtain certificates using a DNS TXT record ' + \
                  '(if you are using Sakura Cloud for DNS).'
    ttl = 60

    def __init__(self, *args, **kwargs):
        super(Authenticator, self).__init__(*args, **kwargs)
        self.credentials = None
```

## 対応

既存の ```_acme-challenge``` TXTレコードのTTLを全て60秒に揃えたうえで、

```
# certbot renew --force-renewal --server https://acme-v02.api.letsencrypt.org/directory
```

を実行することで、正常に（前述の問題が発生すること無く）証明書更新が行なえるようになります。
VSCode で pygame.init() 実行時の「Module 'pygame' has no 'init' member」エラーを消す方法

#import pygameでエラーの消し方
VS Codeのsettings.jsonを開く。
開き方はVS Codeで**Ctrl** + **,**で設定を開ける。設定からsettings.jsonって検索して編集するを押すと開ける。

settings.jsonの{}内に以下を追記する。

```json
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=pygame"
    ]
```
追記する直前の行に,（カンマ）が入っていないことがあるので注意
#参考
https://blog.qs-grct.com/2018/11/05/231549/
String のメンバ関数 size() にハマった話

##はじめに
私はいつも通り競技プログラミングの問題を解いていると, 
どんだけ頑張っても ACできない... 
なんで?????? どう見てもアルゴリズムはあっているのに.....
っていう状態になりました

結果, アルゴリズムではなく私のC++への理解不足だったんですけど
私以外にも苦しむ人が出てくると思うのでまとめておきます.

##本題
問題のプログラムは下記のプログラムです.

```c++:exsample.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    string  S="Hello";
    cin >> S;

    cout << S.size() << endl; //5
    cout << S.size()-10 << endl; //18446744073709551611
    cout << (int)S.size()-10 << endl; // -5
}
```
S.size() が 5 になるのはわかる...
Hello が 5文字だから 5なのは当たり前!

S.size()-10 は, つまり 5-10 だから -5と思ったら, 18446744073709551611!!!
オーバーフローしてる!!!

良く良く理由は, 簡単でS.size() は大きさなんだから負の値を取らない, つまり unsigned 型
(unsigned)5 - 10 だからオーバーフローするのは当たり前

これを意図通りに動かすのは簡単で (int)S.size() のように (int) でキャストしてあげたら良いだけ
すると　答えは -5 になり幸せな気分になれる


##まとめ
string のメンバ関数size() を使うときはしっかり (int) でキャストしてあげよう
(全ての場合に置いてキャストするのではなく, 引き算したとき0未満になってほしい場合だけキャストしてください)
###おまけ
ついでに私がハマったAtCoder の問題置いときます
[ABC028-B-高橋君とパスワード](https://atcoder.jp/contests/abc032/tasks/abc032_b)
【要ブレスト】対象スキーマの全テーブルのレコードをcsv形式で取得する方法を勉強中...

# TODO
- [ ]  タイトルをやる方法を記載!!
- [ ]  マスターデータ／トランザクションデータを区別する手法を...


# 参考サイト
◆Oracle11g 1800個以上のテーブルのＣＳＶエクスポート
　https://qa.atmarkit.co.jp/q/3622
　　※まずはA5MKツールで簡単にできそうか確認(最終的にはバッチ化)　
◆テーブルのデータをCSV出力する
　https://irof.hateblo.jp/entry/20100108/p2
　　※ベースはここを参考に...
◆SELECT文の検索結果をCSVへ出力するSQL(Oracle)
　https://qiita.com/uhooi/items/7d5e9b5deb5968dbbe8c
　　※ここにあるようにコードにコメントいれないと...
◆SQL*Plus システム変数一覧
　https://www.shift-the-oracle.com/sqlplus/system-variable/
　　※ここから調べて...
◆【全テーブル】Oracle -> CSV -> Excel【抽出】
　http://n73.jugem.jp/?eid=51
　　※最終的にはここまでやりたいが、今はPending...
◆OracleDBの任意のテーブルの全レコードをCSV化するツール
　http://pommegarnete.blogspot.com/2014/07/oracledbcsv.html


# 対応コード(インストール終わってから...)
```sql:exportTableRecordToCsv.sql
-- マスターデータ／トランザクションデータは事前に区別しとく
-- 

```
#PowerApps における数学 #1

#はじめに
これから数回にわけて、PowerApps、特にキャンバスアプリを作成する際に利用するかもしれない数学と、アプリ上での表現について解説します。
最終的には振り子をPowerAppsで動かすところまで頑張ります。

#第１回：PowerAppsと座標系

##通常の直行座標
PowerAppsでの座標系（XとYの組）は通常のXY座標と比較して少し特殊です。
まずは通常のXY座標についてみてみます。
![ordinary.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/d54348c5-df26-dbd7-9c48-a2a15add5272.png)
通常、平面上のとある点は、ｘ軸の値とｙ軸の値で決定されます。仮にx=X かつ y=Yとすると、図のように平面上で1点が定まります。
重要なのは、**x軸は右に行くほど大、y軸は上に行くほど大**であることです。

##キャンバス上のXY座標
PowerAppsでの座標が特殊なのは、原点(x=0,y=0)が画面左上に存在することです。
通常XY座標と同様に、x, yをそれぞれ決めれば、キャンバス上での1点が定まるのは同じです。
ただし大きく異なるのは、キャンバスの場合 x軸は右に行くほど大 だが **y軸は下に行くほど大**であることです。
![canvas_coordinate.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/e21c9c8e-c5ab-59db-1b46-bfd7bdf1a5d5.png)
この意味で、ｙ方向の向きが逆であり、あらゆる公式をキャンバスアプリで表現する際、yの符号を反転させる（マイナス１をかける）ことが必要になります。

例を見てみましょう。例えばボールの自由落下ですが、通常の座標系ではボールのy座標(高さ)は時々刻々と小さくなり、やがて地面(y=0)に等しくなります。
一方でキャンバスアプリの場合はというと、ボールのy座標は時々刻々と大きくなり、y=0(この場合は天井)から離れていくということになります。
![example.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/dbb13661-9bb1-f330-01ba-cf82645afa06.png)
数式にすると、自由落下の時間変化部分(1/2 gt^2)の前の符号が逆であることで表現されます。

以降ではXY座標系のほかに極座標について説明しますが、いつでもこの**「Yが逆」**がポイントになります。

##極座標
極座標は、原点(x=0,y=0)からの距離と、x軸から測った角度で定義される座標系(場所の表し方)です。

XY座標が「東に10km、北に5km」的な表現なら、極座標は、「距離10km、2時の方向」みたいな表し方です。
極座標でも平面状のとある点を、今度は距離rと角度θで定義することができます。
XY座標との読み替えは、図にあるように、三角関数(コサインとサイン)を用いて表されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/bd5dad0f-b0df-f7b7-8bd9-a5a042e6df81.png)
この時、角度は反時計回りに大きくなることに注意してください。

##キャンバス上での極座標
キャンバス上での極座標は基本的には通常の極座標と変わりません。
「ｙを逆にしないといけないって言ったじゃないか」と言われそうですが、これは角度の測り方を反対向きにすることで吸収できます。
繰り返しですが、**キャンバスの極座標では角度は時計回りにはかる**という点に気を付けてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/05e10412-aa24-547d-ee0f-ba0a2e6e5ff5.png)

実際に例を見てみます。ここでは仮にr=200(px), 角度45°がキャンバス上でどこに来るかを見てみましょう。
たしかに半径200、角度45°で期待した場所にオブジェクトが配置されています。
（実際にはコサイン、サインの中には0~2πの範囲にあるラジアン表示での角度を入れています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/0ed03bfb-f883-6109-1bf5-c3e0faa47bd4.png)



#まとめ
第１回はキャンバス上でのXY座標の取り方と、極座標表示について解説しました。
次回は特定の点からある距離ｒ、角度θまたは特定の点からx軸方向にXpx, y軸方向にYpx移動するようなケースと、オブジェクトの中心座標について解説します。
Privateメソッドの必要性を理解して実装するための実践メモ

# 背景
2019年の4月から主にrubyで新機能開発を担当しています。
サービスリリース当初に実装され、その後ほとんど改修されずにいたレガシーコードを、3年の月日を経て改修しました。

その過程でメソッドを公開すべきか非公開にすべきかに関して色々と考えることがありました。
ここでは自分のための整理を兼ねてまとめようと思います。

# 概要
クラスは果たすべき1つの責務を持ちます（[単一責務の原則](https://qiita.com/UWControl/items/98671f53120ae47ff93a)）。
その責務については、クラスができること・何をするのかを外部に公開、宣言します。
しかしながらそれをどのように実現するのかの詳細は内部に留めておきます。

言葉ではわかっていても、実行するのはまた少し次元が違う話です。
そこで、実際に概念を使いこなすために重要だと感じたり、先輩エンジニアの方からいただいた教えを以下の3つに分けて整理します。

1. クラスの責務を言語化する
2. 最短で、負荷最小で解読できるか
3. 仕様は変更され、コードは書き換えられる

# クラスの責務を言語化する
クラスがなんのために存在しているのかを端的に言語化する必要があります。
その明文化を怠ると、色んなことができる（責務がブレている）クラスが出来上がったり、使う場所ごとに異なる要求が生じた際にまとめきれなくなります。

私の所属するプロジェクトでは、レコードの検索に `Finder`クラスを実装していますが、「誰のために（どんな用途のために）」「何を見つけてくれるのか」が不明確なクラスを作成してしまい、途中で大きめのリファクタリングが必要になってしまいました。

逆にこの言語化がバチっと決まると、

- どんな要求に応える必要があるのか（＝必要なメソッドの列挙）
- どんなインターフェースを提供すれば良いか
- 外部からは返り値に対してどんな期待がされるのか

というクラスに関する本質的な事項が明らかになってきます。
これらの情報が過不足なくまとめられていると、必要最小限ですっきりとしたクラスが実装できるはずです。

逆に上記の本質的な事項から外れた詳細はprivateメソッドとして実装します。
誰かに仕事を依頼する時には、何をしてほしいのかをイメージし、依頼内容をまとめ、成果物を受け取り・評価しますよね。
その依頼から仕事の完遂の間のプロセスは、依頼された人だけが知っていればいいのです。（カプセル化と言います）

# 最短で、負荷最小で解読できるか
過去のコードと対峙すると、なんとも理解しがたいファットメソッドに出会うこともあります。
わかりにくいコードは、例えば以下のような特徴があるように思います。

- 結局何をやってくれるのかがコードから即座に読み取れない
- なんのための処理なのか、処理のかたまりがどこまで続くのかが不鮮明
- 定数名や関数名など、名前から明確な意味を感じ取れない

解決策としてコメントを書きまくるというのも考えられますが、
コメントを書く前にコメントがなくても理解できるように書けないかを考えるべきです。
（少し変わった実装をしないといけない事情や、伝わりにくい実装意図など、コメントを書くべきタイミングも勿論あります）

チーム開発では他のメンバーが自分のコードを読んで理解する時間も工数に含まれますから、
最短、最小負荷で理解できるコードを書くことの重要性は想像以上です。

そこで活躍するのもprivateメソッドです。
関数をいくつかの処理のブロックに分割し、1つ1つをprivateメソッドとして実装することで、
大元のメソッドを読む時には処理手順書を読むような形となります。
（その関数は大抵外部のクラスが知っている必要がないし、知ってほしくもないのでprivateになるというわけです）

各手順の詳細が知りたい時だけ、privateメソッドの中身を見ればいいのです。
「20行に渡ってごにょごにょしてるけど、結局これをやってるだけかい！」みたいなノリツッコミが起こらないよう、
初めから何をするか関数として宣言してあげましょうね。

# 仕様は変更され、コードは書き換えられる
納品で縁が切られるような製品でない限り、プログラムはいつか修正されることを前提とする必要があります。
これは自身がまっさらなところから機能を実装する場合にはあまり意識しないことでした。

私が担当した機能はシステムの根幹となる部分で、初期実装時から3年間手がつけられていませんでした。
しかし法改正に伴い前提が覆り、コードの変更を余儀なくされました。

改修の前に影響範囲を一通り調べる際、publicメソッドとprivateメソッドでは以下のような違いが出ます。
**◆publicメソッド**
外部に対して公開されている
⇨ 使われている全ての場所（クラス外部）に影響が生じ得る
⇨ 外部で使う必要がなさそうだと思っても、外部で使われている可能性を否定できない

**◆privateメソッド**
内部に閉じている
⇨ クラス内で使われている箇所だけに影響が生じる
⇨ 責務を果たすための詳細にすぎないので、影響が限定的

例えば、引数を追加したい、メソッド名を修正したい、という修正が必要になった場合、
privateメソッドの場合にはそのクラス内で使われている箇所だけを確認すればOKです。

しかし不必要に公開されてしまっている場合、どこで使われているのかを確認し、
漏れなく修正しきる必要が出てしまいます。

公開するメソッドを必要最小限にすることで、クラスが担う役割を明確にし、
かつ修正も容易になります。

# 参考
私の提出したPRにて引用されたプライベートメソッドに関する`t_wada`さんの見解：https://qa.atmarkit.co.jp/q/2784
SwiftでMessagePackする

# 環境

Xcode 10.3

# 使ったフレームワーク

- [MessagePack.swift](https://github.com/a2/MessagePack.swift/tree/master/Sources/MessagePack)
    - たくさんフレームワークがある中で、これが最もメンテナンスされていた。一番速いらしい
- [MessagePacker](https://github.com/hirotakan/MessagePacker)
    - `Codable` に対応しているフレームワーク

どちらもフレームワークのファイルが `MessagePack.framework` になっていてややこしい。。

# 導入

どちらもCocoaPodsで導入可能

```Podfile
target 'HogeApp' do
  use_frameworks!

  pod 'MessagePack.swift', '~> 3.0'
  pod 'MessagePacker'
end
```

その後 `pod install` で導入。

# `MessagePack.swift` の使い方

本記事ではunpackする例のみを例示。
key value store 的なデータをunpackする場合。

```swift
import MessagePack

do {
    var configs: [String:String] = [:]
    let unpacked = try unpack(data)
    if let ary = unpacked.value.arrayValue {
        for map in ary {
            if let dics = map.dictionaryValue {
                if let k = dics["key"]?.stringValue, let v = dics["value"]?.stringValue {
                    configs[k] = v
                }
            }
        }
    }
} catch let error {
    print(error)
}
```

個別に値を割り当てていく必要があるのが難点。

# `MessagePacker ` の使い方

本記事ではunpackする例のみを例示。
適当なコンテンツをunpackしてみる。

```swift:Content.swift
struct Content: Codable {
    var title: String?
    var desc: String?
    var iconURL: URL?
    var isMain: Bool?
    
    enum CodingKeys: String, CodingKey {
        case title
        case desc
        case iconURL = "icon_url"
        case isMain = "is_main"
    }
}
```

型がある場合はとてもシンプルにデコードできる。

```swift
import MessagePacker

let content = try! MessagePackDecoder().decode(Content.self, from: data)
```

専用の型を作らないといけないのが難点。

# 参考

- [MessagePack.swift/Sources/MessagePack at master · a2/MessagePack.swift](https://github.com/a2/MessagePack.swift/tree/master/Sources/MessagePack)
- [hirotakan/MessagePacker: MessagePack serializer implementation for Swift. msgpack.org[Swift]](https://github.com/hirotakan/MessagePacker)
[Java][初心者向け]2次元配列で要素を直接挿入する方法

#はじめに
こんにちは、いわっちと申します。
JavaのArrayList\<ArrayList\<Integer>>などの、二次元配列についてです。


###投稿に至った経緯
先日、AtCoderさんのBeginner Contestに初参加させて頂きまして、その時に二次元配列を利用する問題がありました。

そして、模範解答に二次元配列に対して、要素を直接挿入する場面がありました。基本的に模範解答のコードに関してはC++がメインなので、Javaで書いてると模範解答とは少し違う部分があるのです。

Javaでは二次元配列に直接挿入するとエラーになってしまうので、注意です。よくよく考えれば、すぐ出来ることなのですが、私自身の忘備録も兼ねて投稿させて頂きました。

#2次元配列に要素を直接挿入
細かくいうと直接ではないのですw。やり方としては要素を挿入する前に、newで定義しておくという感じです。直接挿入するやり方は以下の通りです。

```Main.java
ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();

/* ここ */
for (int i = 0; i < index; i++) {
		ArrayList<Integer> array = new ArrayList<Integer>();
		arrays.add(array);
	}
/* */

arrays.get(index - 1).add(2000);
```

このfor文を入れないとエラーが起きてしまいます。C++だと定義しなくても直でいけるらしいですが、Javaだとダメみたいです。

#おわりに
以上です。これに関して特に言及しているサイトもなかったので、投稿してみました。

何かお力になれたら幸いです。
【ggplot2/R】ELISAの測定結果から4係数ロジスティック曲線(4-parameter logistic curve)を書く

Rを使ってELISAの測定値から4係数ロジスティック曲線を描く方法を紹介します。
関数**ggplot()**と**stat_function()**を組み合わせて書きます。

#ELISAのデータ

今回使用するデータ（ELISA.csv）です。

| Concentration | Absorbance |
|:-----------|------------:|:------------:|
|10|3.0802|
|3.333333333|3.0151|
|1|2.5858|
|0.333333333|1.5019|
|0.1|0.5901|
|0.033333333|0.207|
|0.01|0.0621|
|0|0.0039|

#必要なパッケージ
Rを使って4係数ロジスティック回帰分析をするため、**drc**パッケージをインストールし、読み込みます。
それと、**dplyr**と**ggplot2**を一括で読み込むため**tidyverse**も読み込んでおきます。

```R:ライブラリの読み込み
library(tidyverse)
library(drc)
```

#データの読み込みと確認
**read.csv()**でELISAのCSVデータを読み込み、**glimpse()**で内容を確認しておきます。

```R:データを調べるための最初のプロット
ELISA <- read.csv("ELISA.csv")
glimpse(ELISA)
```

#散布図を描く
**ggplot2**でとりあえず散布図を描いてみます。

```R:データを調べるための最初のプロット
ggplot(ELISA, aes(x = Concentration, y = Absorbance)) +
  geom_point() +
  scale_x_log10()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471633/4da6cc84-1624-376b-65d3-b6f274b4cd3a.png)


#4係数ロジスティック回帰分析モデルを作る
**drc**パッケージの**drm()**を使って4係数ロジスティック回帰分析モデルを作ります。

```math
y = d+\frac{c-d}{1+(\frac{e}{x})^b} \\\
```

関数**drm()**の**fct**で**LL.4()**を指定し、回帰モデル`L4p`を作ります。
4つのパラメーター（b, c, d, e）は作ったモデルの中の`coefficients`のリストに入っています。
なので、4つのパラメーターを回帰モデル`L4p`の`coefficients`から取り出します。

```R:drm()を使って4係数ロジスティック回帰分析モデルを作る
L4p <- drm(Absorbance ~ Concentration, data = ELISA, fct = LL.4())
a <- L4p$coefficients #回帰モデルから係数を取り出す
a #回帰係数を表示
a[1] 
a[2] 
a[3] 
a[4] 
```

実行結果はこうなります。

```R
> L4p <- drm(Absorbance ~ Concentration, data = ELISA, fct = LL.4())
> a <- L4p$coefficients #回帰モデルから係数を取り出す
> a #回帰係数を表示
b:(Intercept) c:(Intercept) d:(Intercept) e:(Intercept) 
-1.2631086189  0.0008242024  3.1637420197  0.3374669485 
> a[1] 
b:(Intercept) 
    -1.263109 
> a[2] 
c:(Intercept) 
 0.0008242024 
> a[3] 
d:(Intercept) 
     3.163742 
> a[4] 
e:(Intercept) 
    0.3374669
```

#最後にstat_function()で4係数ロジスティック回帰を描く
最初に作った散布図に、分析モデルで推定した4つの回帰係数と関数**stat_function()**を使って回帰曲線を加えます。
`fun = function(x)`の後にxの関数を描きます。

```R:stat_function()で4係数ロジスティック回帰を描く
ggplot(ELISA, aes(x = Concentration, y = Absorbance)) +
  geom_point() +
  stat_function(fun = function(x) a[3] + (a[2] - a[3]) / (1 + (a[4] / x)^a[1])) +
  scale_x_log10()
```

これを実行すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471633/359ac821-65b9-de94-7888-c137623dca28.png)

こんな感じで4係数ロジスティック回帰曲線が描けました。

#最終的なスクリプト


```R:ELISA(4係数ロジスティック回帰)
#ELISAの測定値で4係数ロジスティック回帰分析

#Rをキレイにしておく
rm(list = ls())

#ライブラリの読み込み
library(tidyverse)
library(drc)

#データの読み込みと内容の確認
ELISA <- read.csv("ELISA.csv")
glimpse(ELISA)

#データを調べるための最初のプロット
ggplot(ELISA, aes(x = Concentration, y = Absorbance)) +
  geom_point() +
  scale_x_log10() 

#drm()を使って4係数ロジスティック回帰分析モデルを作る
L4p <- drm(Absorbance ~ Concentration, data = ELISA, fct = LL.4())
a <- L4p$coefficients #回帰モデルから係数を取り出す
a #回帰係数を表示
a[1] 
a[2] 
a[3] 
a[4] 

#stat_function()で4係数ロジスティック回帰を描く
ggplot(ELISA, aes(x = Concentration, y = Absorbance)) +
  geom_point() +
  stat_function(fun = function(x) a[3] + (a[2] - a[3]) / (1 + (a[4] / x)^a[1])) +
  scale_x_log10()

```
競プロ2日目

# 今日の教材
[ABC 135のA〜C](https://atcoder.jp/contests/abc135/tasks)に挑戦しました。
# 大事だと思ったこと
## 1. 提出する前に一度ローカルで確認
ペナルティのあるコンテストに出るときにはそうすべきなのかなと思いました。
普段参加されている方は、確かめずに提出している方も多いのでしょうか。。。？

## 2. データ型に気をつける
普段はそこまでfloatとintを気にしていなかったのですが、出力の形式には注意した方が良いと思いました。
[このページ](https://qiita.com/KoyanagiHitoshi/items/32dc42d8c5ee75339e54#%E7%AC%AC1%E7%AB%A0-%E6%96%87%E6%B3%95%E8%A6%B3%E7%82%B9)でかなりまとまっているようなので、次回目を通してみたいと思います。

## 3. 使えそうな関数がないか考えてみる
minとかmaxとかsumとかを気軽に使えることは、大学受験の数学と大きく違うなと感じました。
解答をみて気づいて悔しかったです。
→A・Bでは使わなくても、C以降は大切な観点になる気がします。

# 次回やること
- [このページ](https://qiita.com/KoyanagiHitoshi/items/32dc42d8c5ee75339e54#%E7%AC%AC1%E7%AB%A0-%E6%96%87%E6%B3%95%E8%A6%B3%E7%82%B9)に目を通す
- ABC134をとく
Project Euler 54をPythonでやってみる

#問題
英語
https://projecteuler.net/problem=54
日本語
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2054

#解答
正直そこまで工夫はなく単純に役を調べて比べただけです。

```Python:ProjectEuler54.py
import requests

# 1 = High Card
# 2 = One Pair
# 3 = Two Pairs
# 4 = Three of a Kind
# 5 = Straight
# 6 = Flush
# 7 = Full House
# 8 = Four of a Kind
# 9 = Straight Flush
# 10 = Royal Flush

def sort_cards(cards):
    dic = {"2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "T":10, "J":11, "Q":12, "K":13, "A":14}
    c = list(map(lambda x:dic[x[0]],cards))
    c.sort()
    return c

def check_flush(cards):
    for i in range(4):
        if cards[i][1] != cards[i+1][1]:
            return False
    return True

def check_rank(cards): # 5枚のカード
    sorted_cards = sort_cards(cards)
    dif = [sorted_cards[i+1]-sorted_cards[i] for i in range(4)]
    if check_flush(cards):
        if dif == [1,1,1,1]:
            if sorted_cards[0] == 10:
                return [10,14] # 10 = Royal Flush
            else:
                return [9,sorted_cards[4]] # 9 = Straight Flush
        else:
            return [6,sorted_cards[4]] # 6 = Flush
    elif dif == [1,1,1,1]:
        return [5,sorted_cards[4]] # 5 = Straight
    else:
        t = dif.count(0)
        if t == 0:
            return [1,sorted_cards[4]] # 1 = High Card
        if t == 1:
            return [2,sorted_cards[dif.index(0)]] # 2 = One Pair
        if t == 2:
            z_pos = [i for i, x in enumerate(dif) if x == 0]
            d = z_pos[1] - z_pos[0]
            if d == 1:
                return [4,sorted_cards[z_pos[0]]] # 4 = Three of a Kind
            else:
                return [3,sorted_cards[z_pos[1]]] # 3 = Two Pairs
        if t == 3:
            if (dif[1] != 0) or (dif[2] != 0):
                return [7,sorted_cards[4]] # 7 = Full House
            else:
                if dif[0] == 0: # 8 = Four of a Kind
                    return [8,sorted_cards[3]]
                else:
                    return [8,sorted_cards[4]]
            
        

url = "https://projecteuler.net/project/resources/p054_poker.txt"
try:
    r = requests.get(url)
    with open('rss.xml', mode='w') as f:
        f.write(r.text)
except requests.exceptions.RequestException as err:
    print(err)

data = [[x.strip() for x in s.split(" ")] for s in r.text.split("\n")]
num_sum = 0
for i in range(len(data)-1):
    r1 = check_rank(data[i][:5])
    r2 = check_rank(data[i][5:10])
    if r1[0] > r2[0]:
        num_sum += 1
    elif r1[0] == r2[0]:
        if r1[1] > r2[1]:
            num_sum += 1
print(num_sum)
```

1.751 seconds
ゴミアプリをたくさん作るための準備 Django

#はじめに
ここでいう「ゴミアプリ」は尊敬の念を込めての表現です。プログラミングの初学者が作りたいものを形にするためにはアウトプットが必要だと思うので、アウトプットしていることに関しては敬意を表するべき。

準備とはいえ、プログラミング言語そのものはひと回りしている程度（本や動画などの教材を1周以上はやっている）。ほぼ自分用のMemo。


#ざっと設計
**全アプリ機能**
どんな機能が必要になるかを全て書き出す
（ログイン機能 / シェア機能 /  いいね機能 など）
 
**データベース設計**
どんな情報を保存するのかを書き出す
（ユーザーアカウント / 日時 など）

**ページ設計**
上記で出したアプリの機能やデータベースのテーブルをもとに、どのようなページが必要で、どのような機能を持たせるかを決める


#とうぜんながら
これは一人で何かを作る練習なので、リアルのプロジェクトではたくさんの人が関与するため、決め事、決まり事が多く、「誰か」が絡むならば不十分である。

だけど、まずは自分でやりながら「もっとこうしたい」や「こういう場合は？」というものを見つけるべきだし、気軽にやるべき。

ただ裏を返せば、一人でやるとしても、この辺りはしっかりと決めてやることでスキルアップにはつながるはず。

一人で作るとコメントアウトなども省略しがちなので、同様に意識して記載する。

---
#URL設計

これは画面遷移とかペーパーとかでも良いのでプロトタイプを作っておくと良さそう。

|画面|URL|URL名|
|:-----------------:|:------------------:|:------------------:|
|ログイン|/****/login/|login|
|ログアウト|/****/logout/|logout| 

のような感じで表にしておくとわかりやすい。

#テンプレート設計
|テンプレート名|内容|
|:-----------------:|:------------------:|
|base.html|ベースとなるテンプレート|
|/***/edit.html|***の更新画面|
|/***/list.html|***の一覧画面|

templatesの一覧も同様に表にしておく
C#でWindows Serviceのインストール処理を実装する

#概要
Windows Seriviceを過去にC++で開発していた時は、
インストール処理も実装していました。

C#でのWindows Service開発では、テンプレートがあって、
サービス自体はとても簡単に作成できますが、
なぜかテンプレートにはインストール処理は実装されていなくて。
今回はその処理を実装した話。

#やること
テンプレートで生成されたコードから変更した点を記載します。

・Main関数に引数を追加し、起動時引数での分岐を作成
・起動時引数で「install」が指定された場合に、インストール処理を実行するようにする。
　※XXXXXXXXServiceが開発するサービスのクラス名
　インストール処理は、実行ファイル名を取得して
　ManagedInstallerClassクラスのInstallHelper関数を呼び出すだけ。

``` Program.cs

namespace XXXXXXXXService
{
    static class Program
    {
        static void Main(string[] args)
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                        new XXXXXXXXService()
            };

            switch (args[0])
            {
                case "install":
                    string[] args = { System.Reflection.Assembly.GetExecutingAssembly().Location };
                    ManagedInstallerClass.InstallHelper(args);
                    break;

                default:
                    ServiceBase.Run(ServicesToRun);
                    break;
            }
        }
    }
}
```

あ、Program.csに以下も追記しておいてくださいね。

``` Program.cs
using System.Configuration.Install;
```

起動時引数にinstallを指定して実行してみます。
※管理者権限で実行してください。
　また、Visual Studioから実行する際は、Visual Studioを管理者権限で実行してくださいね。

そうすると、以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/001d737c-cbc4-4b5c-2652-048ebfdbd0a0.png)

今回は管理者権限のあるユーザー名とパスワードを入力したのですが、
ここで注意点があります。

ユーザー名は先頭にコンピューター名＋￥マークをつける必要があります。
例えば、コンピューター名がaaa、ユーザー名がbbbであれば、
　aaa￥bbb
をユーザー名に入力します。

なお、コンピューター名は設定->システム->バージョン情報で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/131b8d56-a60d-7318-09ff-161ebc24db9c.png)


このソースでは、既にインストールされているかの確認処理や、エラーになった時の処理は記載していないので、
必要に応じて実装してください。
Python勉強の記録_190813

#やったこと

- [AtCoderの問題を分類しました](https://qiita.com/KoyanagiHitoshi/items/32dc42d8c5ee75339e54)を頭から解き始めた。（1.1）
- 解答例に初見の文法が登場したので調べた（内包表記だった）

#学び
- 内包表記

```python
#普通に書くと
lst = []
for i in range(10):
    lst.append(i)
print(lst)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
```python
#内包表記で書くと
lst = []
lst.append([i for i in range(10)])
print(lst)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

- 区切り文字

```python
lst = [1, 4, 5]
print(lst)
#[1, 4, 5]
print(*lst, sep="/")
#1/4/5
```

- macで"\"の打ち方： `option + ¥`
SafariのpostMessageの第二引数は必須なので注意

## SafariのpostMessageの第二引数は必須なので注意
window.postMessageはiframeとの通信に便利ですが、第二引数がundefinedだと、Safariでnot enough argument errorが発生するので注意してください。

`'*'`など、何かしらを設定する必要があります。
公式ドキュメントはこちら。 https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage



この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
c# プロパティの歴史（ざっくり）

#はじめに
現在（2019年8月現在）に至るまで、プロパティがどういうふうに進化していったか、ざっくりまとめてみた。
#c#1.0、1.2、2.0時代
c#には初めから「プロパティ」という機能があり、
SetterメソッドとGetterメソッドいちいち作るより楽＆見やすい。
↓↓こんなふうにいちいちメソッド作らなくても。。

```c#
    private int _a;
    public int GetA()
    {
        return _a;
    }
    pubic void SetA(int v)
    {
        _a = v
    }
```
↓↓簡単に書けるように！

```c#
    private int _a;
    public int A
    {
        get { return _a; }
        set { _a = value; }
    }
```
#c#3~5時代
**自動実装**が追加されてさらに便利に！！
単純に代入取得だけの処理を書きたい場合は、わざわざgetとsetの中身を書かなくてもよくなった。

```c#
public int X { get; set; }    // まさかの一行！！
```

#c#6時代
便利機能がいろいろ追加された！

たとえば、**初期化子**というものがつかえたり↓↓

```c#
public int A { get; set; } = 3;
// 「= 3」の部分が初期化子。
// ここでは、初期値3を入れている
```
自動実装で、Getterのみ指定ができるように。

```c#
public int A{ get; }
// コンストラクタか、初期化詞を遣えば、1度だけ設定できる。
// 以後値が変わることはない。
```

#c#7時代
「{ return  }」の記載が、「=>」により省略できるようになった。
（※c#6自体にこの機能はあったが、プロパティには使えなかった。）
↓↓こんな感じにかけるようになった。

```c#
public int A => 3;
// 「get {return 3;}」と同じ意味。
```

#参考
++C++ // 未確認飛行 C
https://ufcpp.net/study/csharp/ap_ver6.html
buildinsider
https://www.buildinsider.net/language/csharplang/0600
C# 7.0 の新機能
https://qiita.com/tadnakam/items/afe390679e8b5dfa7fa3
Error: An AuthUI instance already exists for the key "[DEFAULT]"の対処法

**SPA**で**Firebase AuthUI**を扱う際に

`Error: An AuthUI instance already exists for the key "[DEFAULT]"`

と表示されることがある。問題のコードは↓である。

```typescript:
const ui = new firebaseui.auth.AuthUI(firebase.auth())
ui.start('#firebaseui-auth-container', uiConfig)
```

すでにAuthUIが存在しているにもかかわらず、`ui.delete()`を呼ばず、再び`new`してしまっているのが問題のようだ。
かんたんな対処としては、↑のコードを

```typescript
const ui = firebaseui.auth.AuthUI.getInstance() || new firebaseui.auth.AuthUI(firebase.auth())
ui.start('#firebaseui-auth-container', uiConfig)
```

↑のようにすればよい:thumbsup:

参考: [Error: An AuthUI instance already exists for the key "[DEFAULT]"](https://github.com/firebase/firebaseui-web/issues/216)
計算フィールドを考える（FileMaker）

#計算フィールドとは
あえて記載するまでも無いかもしれませんが、テキスト、数字、日付、時刻、またはオブジェクトの計算を行うためのフィールドの設定です。
四則演算だけでなくファイルメーカーで使用できるスクリプトステップをを駆使して、様々な値をセットすることができます。

#計算フィールドの問題点
ファイルメーカは、簡単な手順でデータベースに対し計算フィールドや集計フィールドという形で演算処理、集計処理を行うことができます。
しかし、便利である反面、デメリットを理解して運用しないと集計に時間がかかったり、検索に時間がかかったりと簡単にストレスMAXな環境になってしまいます。
以下、計算フィールドの問題点と、置き換えの手段についてまとめたいと思います。

###データベースの特性
ファイルメーカーは、データベースなので基本的にはデータを集めて
検索・抽出などの再利用が主目的となります。
データベースは高速に検索、集計を実施するためにインデックス（索引）と呼ばれる目印をつけることで高速化を図ります。ファイルメーカでも他のデータベースと同じように特定のフィールドで検索をかけるとインデックス（索引）を作成し高速化を図ります。そのため１回目の検索はインデックス（索引）を作成するため少し時間がかかりますが、２回目以降の検索はかなり高速に検索するという動作になります。

###計算フィールドの特性
ここで、問題になってくるのは計算フィールドの特性です。
演算した計算結果を表示するという特性上、都度、値が変わる可能性があるため
計算フィールドはインデックス（索引）を保持することができません。
計算結果は常に変わる可能性があり目印が正しく機能しなくなるためです。
この結果、計算フィールドは検索、抽出をするたびにすべて計算をし直した後
結果をもとに検索抽出を実施する動作となり、処理に時間が大きくかかってしまう状況になってしまうのです。

#利用者が快適に作業するために考えること
計算フィールドを正しく把握していくことで問題を管理することができます。

###①レイアウトを整理する
利用者にとって、レイアウトにあるフィールドは、
すべて検索できるものと考えると思います。
対応をとっていくために、利用者が検索をかけて利用するインタフェース（UI）としてのレイアウトと、帳票印刷用、スクリプト計算用など利用者が意識することがないそれ以外のレイアウトを整理しておくといいと思います。
後者のレイアウトは検索等は発生しないため、考慮する必要はありません。

###②計算フィールド利用箇所を判断
計算フィールドに対して検索する必要あるかチェックする。
検索の必要が無い場合は、
インスペクタ→データ→フィールド入力欄から検索モードのチェックをはずして
検索できないようにするといいと思います。

###③計算フィールドを通常のフィールドに置き換える
計算フィールドの値を検索対象として扱いたい場合、
計算フィールド→通常フィールドに置き換えを検討するといいと思います。
オプション→入力値の自動化の欄に計算式をセットすることで値を取得できます。
ただし、このオプションはフィールド作成時に動作する機能であるため
新規レコード作成時にしか値の更新をしません。
その場合はスクリプトを活用して、定期的にフィールド内容を更新してください。
（次の項で説明します。）

###④更新するための仕組みを用意する。
③で作ったフィールドに対して、更新スクリプトを用意して
更新したいタイミングでスクリプトトリガを呼び出します。
（画面を開いたとき更新、計算式に利用するフィールドが更新されたとき等）

#参考 　更新スクリプトのおすすめ

###・表示中レコード更新の場合
スクリプトステップ
「フィールド内容の全置換→置換→計算結果で置き換える」
に対し、該当の計算式を埋め込んで実行する。

###・現在レコードのみの更新でいい場合
スクリプトステップ
「フィールド設定→計算結果」
に対し計算式を埋め込んで実行する。


#その他、高速化のためできること
###検索方法を工夫する
検索時、計算フィールドの値を再更新する対象は表示中のレコード全てが対象になります。
そのため、検索条件が複数あり計算フィールドでない条件もある場合は
先に計算フィールド以外の条件で検索を実行した上で、計算フィールドで絞り込みするようにすると高速に検索を実行することができます。
Pythonでカーソル位置のRGB値を取得する.

# 概要
webサイトやアプリケーションを見ていて、「この色を自分で再現したい!!」と思うことも多いのではないでしょうか。  
しかし画面上のRGB値を取得するためによく言われるやり方は
画面をスクショ　⇒　ペイントにペースト　⇒　スポイト
とかなりめんどくさいです。~~フリーソフト入れるのも面倒だし･･･~~

そこで今回は、Windows APIをpythonから扱うためのpywin32を利用して、手っ取り早くカーソル上のRGB値を取得するスクリプトを作成しました。

##pywin32のインストール

```
pip install pywin32
```

以下のモジュールをimportします。

```python

import win32gui
import win32api
```

## DPIの設定
```python

import ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
```

また、ctypesの```SetProcessDPIAware```関数を利用することで、現在のDPI、つまり実際にデスクトップディスプレイ上で表現されているピクセル数を考慮した座標を取得することができます.

## カーソル位置の取得 & RGB値の取得
```python

# デスクトップウィンドウの取得
desktop = win32gui.GetDesktopWindow()
document = win32gui.GetDC(desktop)

def getCursorPixel(document):
    # カーソル位置の取得
    cursor_pos = win32api.GetCursorPos()
    
    # 指定したPixelのRGB値の取得
    pixel_color = win32gui.GetPixel(
        document, cursor_pos[0], cursor_pos[1]
    )
    
    # 10進数表記のRGB値に変換
    rgb = [pixel_color >> 8*i & 0xff for i in range(3)]
    
    print("RGB({0},{1},{2})".format(*rgb))
```

## 動作

このやり方だと、

1. コンソールを開いておく
1. RGB値の欲しい位置にカーソルを持っていく
1. Alt + Tabでコンソールにフォーカスを移す
1. 実行

という手順を踏む必要があります。
ひょっとするとwin32apiを利用してクリックのイベントハンドラーを追加したりできれば、もっとGUIによる直感的な操作ができるかもしれません。

また、hoverに対してデザインが変わる仕様になっていたりする場合は、GetPixelに座標だけ渡してあげるなど、適宜対応してあげる必要があるでしょう.
js ユーザからの動画の取得(getUserMedia)

#ユーザからの動画の取得(getUserMedia)

```html
<video id="player" controls autoplay></video>
<script>
  var player = document.getElementById('player');

  var handleSuccess = function(stream) {
    player.srcObject = stream;
  };

  navigator.mediaDevices.getUserMedia({video: true})
      .then(handleSuccess);
</script>
```

##参考
https://developers.google.com/web/fundamentals/media/capturing-images/?hl=ja
グロースハックの生みの親が、KPIの前にまずは北極星となる指標を定義しろと主張するわけ

![caleb-woods-292OcsAYBK8-unsplash (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226318/26723b70-16fc-1785-f98a-f8234ed5d3f5.jpeg)

どうも！[Exploratory](https://ja.exploratory.io/?utm_campaign=north_star_metric&utm_medium=blog&utm_source=qiita)のIkuyaです。

今日はSaaSのビジネスを語るうえで耳にすることが多い**North Star Metric**というコンセプトについて、グロースハックの生みの親であり、Dropboxの最初のマーケターでもあるショーン・エリスが簡潔にまとめている記事があったので、そちらを紹介します。


* North Star Metricとは - [リンク](https://blog.growthhackers.com/what-is-a-north-star-metric-b31a8512923f)

-----

## North Star Metircこそがビジネスを継続的に成長させる

North Star Metric(NSM)は成長の激しいシリコンバレー企業で使われて有名になった強力なコンセプトです。このコンセプトはチームの小手先の成長ではなく、長期的なビジネスの成長に全ての人が集中するために重要です。

では**North Star Metricがなにかというと、それはプロダクトの本質的な価値が顧客に提供できているかを測る単一の指標**です。この指標を改善することにリソースを割くことが、顧客の数を持続的に成長させるために最も重要なこととなります。

## 自分たちのNorth Star Metricを探す

例えばAirbnbのNorth Star Metricは宿泊の予約数です。この指標はAirbnbがゲストとホストに提供する価値を的確に捕らえています（訳者注：Airbnbは宿泊施設を提供するホストと、宿泊するゲストの両者を結びつけるプラットフォームを提供している）。

またFacebookのNSMは一日あたりのアクティブ・ユーザー数です。なぜならFacebookのユーザーが増えるほど、彼らはユーザーの表示する投稿フィードを最適化し、よりユーザーにとって価値あるものを提供できるようになるからです。

では自分自身のNorth Star Metricを明らかにするためには、どうすれば良いのかというと、最も製品にほれこんでいるユーザーが、自身のプロダクトにどのような価値を感じているかを理解することが最も重要です。

次に、この明らかになった価値を一つの指標で数値化することです。該当する指標が複数出てくる場合もありますが、可能な限り単一の指標にまとめるようにしてください。

## North Star Metricがチームを一つにまとめる

North Star Metricは成長という曖昧なコンセプトを、顧客に届けることができた価値として定量化することができるのです。そうすることで成長の責任をマーケティング担当だけが負うことがなくなります。

多くの場合、それぞれのビジネス・チームは顧客に対して何らかの価値を届ける役割を持っています。例えばセールスやマーケティングは新規の見込み客を集客してきますし、製品担当やカスタマーサポートは潜在顧客や既存顧客により製品の価値を体験してもらうための重要な役割を果たしています。

共通の指標がない状態で、細分化されたチームが一丸となって、成長に向かっていくことは、非常に難しいものです。

## North Star Metricを成長の原動力に

ひとたびNorth Star Metricを決めたら、次は、何がNorth Star Metricを上下させるのかを理解する番です。ここで考えられる変数は、例えば新規ユーザーのサインアップ、アクティベーション、エンゲージメントやリテンションなど、一般的には顧客のライフサイクルに含まれているものです。

これらの相互に影響しあう変数とコンバージョン率の関係を深く理解していくことで、NSMを大きく伸ばすチャンスを見つけることができるようになるのです。


-----


## あとがき

本日はチームをまとめ、スピーディーかつ継続的な成長をもたらすコンセプトであるNorth Star Metricを紹介しました。

North Star Metricを決めることはもちろんですが、本文でも言及されていたように、ひとたびNorth Star Metricを決めたら、North Star Metricを上下させる変数とそれらの関係を理解することが重要になります。

というのも、North Star Metricを上下させる変数間の関係を深く理解しない限り、具体的な施策の提案に結びつかないからです。

このような変数間の関係を効率良く、そして深く理解していくために、統計や、機械学習のモデルを使っていくことになります。

## SaaSアナリティクス・セミナー

あとがきでも触れた統計・機械学習のモデルを使って、サブスクリプション型ビジネスを成長させるための分析、 施策立案を実現する手法についての紹介セミナーを9月12日に開催します！

興味のある方はぜひご参加ください！

詳細は[こちら](https://ja.exploratory.io/saas-analytics-seminar?utm_campaign=north_star_metric&utm_medium=blog&utm_source=qiita)のページにあります。
JavaからScalaのSeqをつくる、ScalaのSeqをJavaのListにする

# 環境
- Scala 2.12
- Java 8
 
# JavaからScalaのSeqをつくる

```scala:Scala
Seq("a","b","c")
```

```java:Java
  @SafeVarargs
  public static <T> Seq<T> Seq(T... values) {
    Seq<T> seq = JavaConverters.collectionAsScalaIterableConverter(Arrays.asList(values)).asScala().toSeq();
    return seq;
  }
```

**サンプル**

Javaで、Scalaの***Seq(1,2,3)***と同等操作

```java
import java.util.Arrays;

import scala.collection.JavaConverters;
import scala.collection.Seq;

public class SeqInJava {

  public static void main(String[] args) {
    Seq<Integer> seqInJava = Seq(1, 2, 3);
  }

  @SafeVarargs
  public static <T> Seq<T> Seq(T... values) {
    Seq<T> seq = JavaConverters.collectionAsScalaIterableConverter(Arrays.asList(values)).asScala().toSeq();
    return seq;
  }
}
```

# ScalaのSeqをJavaのListにする

```java
JavaConverters.seqAsJavaList(Seq(1, 2, 3))
```

**サンプル**

```java
import java.util.Arrays;
import java.util.List;

import scala.collection.JavaConverters;
import scala.collection.Seq;

public class SeqToList {

  public static void main(String[] args) {

    List<Integer> list = JavaConverters.seqAsJavaList(Seq(1, 2, 3));
    System.out.println(list);

  }

  @SafeVarargs
  public static <T> Seq<T> Seq(T... values) {
    Seq<T> seq = JavaConverters.collectionAsScalaIterableConverter(Arrays.asList(values)).asScala().toSeq();
    return seq;
  }
}

```
js ユーザから画像を取得

#画像ファイルを取得し、ページに表示させる

```html
<input type="file" accept="image/*" capture="camera" id="camera">
<img id="frame">
<script>
  var camera = document.getElementById('camera');
  var frame = document.getElementById('frame');

  camera.addEventListener('change', function(e) {
    var file = e.target.files[0];
    // Do something with the image file.
    frame.src = URL.createObjectURL(file);
  });
</script>
```

##参考
https://developers.google.com/web/fundamentals/media/capturing-images/?hl=ja
Automation Anywhere でボットを特定の時間にスケジュールして毎日呼び出す

# 概要
ボットを作成したら、毎日繰り返して実行したいというニーズも出てくるかと思います。OSのタスクスケジューラを使わなくてもAutomation Anywhere 自体でスケジューリングする機能があります。いずれも、Enterpriseの**(attended/unattended) Bot Runnerライセンスが割り当てられたデバイス/Clientが必要です**。

対象

* Automation Anywhere Enterprise 11.3.2
* ([Community Editionは不可](https://qiita.com/RPAbot/items/8d9b14a8b779d1d305e4#community-edition%E3%81%AE%E6%A9%9F%E8%83%BD%E7%9A%84%E5%88%B6%E9%99%90))

# 方法1: Control Room からアクティビティをスケジュール (要Unattended Bot Runnerデバイス)
一つ目の方法として、Control Roomにボットをアップロードして、それをBot Runnerが割り当てられたデバイスに割り当ててスケジュール実行することができます。

あらかじめ、Bot Runnerライセンスが割り当てられたClientを起動しておく必要があります。

Control Roomを開き、「Bots/マイBot」を開きます。このページは、Client側の作業フォルダーと対応しており、Client側からボットをアップロードできます。ボットの実行メニューとしては、右上のメニューに出ている通り「**Botをすぐに実行**」「**キューでBotを実行**」「**Botをスケジュール**」の3種類あります。
![aa-task-schedule01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/88c69553-6107-af2a-09e8-e067acf677bb.png)

Clientからボットをアップロードしてみると、以下の通りボットが表示されます。ボットのコンテキストメニューからも「**Botをスケジュール**」が利用できます。こちらをクリックします。
![aa-task-schedule02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/13bf4e4c-f422-8c50-8d0e-18702ad69648.png)

「**Botをスケジュール**」のページでは、ボットの実行スケジュールを1度きりの実行 or 繰り返し実行、繰り返しならその間隔 (毎日/毎週/毎月)と頻度 (何回)、繰り返す期間などが指定できます。
![aa-task-schedule03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1c4bb241-61f2-1b29-f129-51e7060b8cf4.png)

最後に、ボットを実行するデバイス (***Unattended*** Bot Runnerである必要あり) を選択するとスケジュールが完了します。(右上の「**Botをスケジュール**」ボタンがクリックできるようになります。) Unattended Bot Runner デバイスは、このライセンスを持ったユーザーでClientにログインしているPCをアクティブな状態にしてControl Roomにつないでおくだけで認識されます。
![aa-task-schedule04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/02c8d857-4fe7-96c9-efa6-2c7c3a3b4aea.jpeg)


「**Botをスケジュール**」ボタンのクリックでプロセスが完了します。

その後、「アクティビティ/スケジュール済み」を見てみると、アクティビティがスケジュールされていることがわかります。
![aa-task-schedule05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c4991975-b2ff-cd92-c896-09d4bf5dfe6c.png)



# 方法2: Client 上でスケジュール
もう一つの方法として、Client上でスケジュールする方法もあります。この機能は通常ボット開発者が利用するBot Creator では利用できず、ClientにログインしているユーザーにBot Runnerライセンスが割り当てられている必要があります。

Bot Creator ライセンスのユーザーの場合、ボットのプロパティのスケジュール部分を見ると、以下の通り「**一度のみ**」のスケジュールが可能です。
![aa-task-schedule10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e222ae62-27cb-47d8-3801-14ae3b0330be.png)


Bot Runnderのアカウントでログインすると、開発関係のメニューが減る代わりに、ボットのスケジュールについてはメニューの数が増えます。
![aa-task-schedule11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a321fdd9-0d69-7fca-eb4b-de7164098707.png)

いずれかのスケジュールオプションを選択して「**保存**」ボタンをクリックすると、Windows ログオンアカウント情報を入力する画面が出ます。
![aa-task-schedule12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/20f3d939-132c-ddd7-ed2b-c970fe04b815.png)

これで「保存」ボタンをクリックすると、以下の画面の通り、タスクがスケジュールされたとの画面になります。
![aa-task-schedule13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a7ee66cb-0844-43fa-b97b-856100872816.png)

このようにタスクのスケジュールができますので、試してみてください。
最後までお読みいただきありがとうございました。
PX4とDDS-RTPSの関係

# 概要

[PX4](https://github.com/PX4/Firmware)で、[DDS eProsima Fast-RTPS](https://github.com/eProsima/Fast-RTPS)っぽいのを使っているという情報を聞いたので、おおよその概要を調査してみる。実際のPX4はないので、あくまでソースなどの公開情報からわかる範囲と、想像のみで調査。DDSとしては、[ここ](https://www.omg.org/spec/category/data-distribution-service/)にすべての仕様が公開されているので、参考にしてほしい。

# 結論

PX4 firmwareとDDSの世界(例えば、ROS1/ROS2、他のDDS application)を繋ぐためのbridgeを構築して、CPU側で適当な処理をすることで、PX4の制御やPX4の情報取得などを柔軟にできるようにしようとしている。

# トピックス

### PX4-FastRTPS Bridge

[PX4-FastRTPS Bridge](https://dev.px4.io/v1.9.0/en/middleware/micrortps.html)が一番情報が多い。

下の図からわかる通り、PX4自体とそれを接続する先(via UART or UDP)でPX4コンポーネントが使用する[uORB message](https://dev.px4.io/v1.9.0/en/middleware/uorb.html)をRTPS messageに変換する責務を担っている。つまり、uORB / DDS-RTPSを接続できることで、オフロード先でRTPS applicationを開発してPX4と接続できるということ。

![RTPS Bridge](https://dev.px4.io/v1.9.0/assets/middleware/micrortps/architecture.png)

Client/Agentアーキテクチャによって、複数のClientがAgentに対して接続できる形をとっていることがわかる。
物理的な接続にはUART or UDPと記載されている。(UART接続のほうがデバイス間接続には一般的のような気がするが、なぜUDP??)

Client/Agentのソースコードは[PX4 firmware](https://github.com/PX4/Firmware)をbuildすることで生成されるようになっている。

- Bridge Client
  - https://github.com/PX4/Firmware/tree/master/src/modules/micrortps_bridge
- Bridge Agent
  - https://github.com/PX4/Firmware/blob/master/msg/templates/urtps/microRTPS_agent.cpp.em

### ROS1/ROS2との関係

ROS1/ROS2とも以下の図の通り、接続はアーキテクチャ的には可能だが、Real-Timeなのかはわからない。ROS1にとっては通信はできるレベルで、性能はかなり悪く実際に使える状態なのか疑問。

オフロード側のpackageとしては、[px4_ros_com](https://github.com/PX4/px4_ros_com)が必要で、px4_ros_comによってROS1/ROS2側での通信が可能となる。

![PX4 with ROS2](https://dev.px4.io/v1.9.0/assets/middleware/micrortps/architecture_ros2.png)

![PX4 with ROS1](https://dev.px4.io/v1.9.0/assets/middleware/micrortps/architecture_ros.png)

### eProsima Repository

#### [PX4-FastRTPS-PoC](https://github.com/eProsima/PX4-FastRTPS-PoC)

Proof Of Conceptでduplicateになっているが、この時点ではPX4とraspiをUARTで接続して、オフロードするようなことを想定していたよう。
SerializerとしてeProsimaが提供するFast-CDRを利用することでOMG(Object Management Group)のIDLと同じ形式をサポート。

![PX4 to Raspi](https://github.com/eProsima/PX4-FastRTPS-PoC/raw/master/doc/scheme.png)

#### [PX4-FastRTPS-PoC-Snapdragon-UDP](https://github.com/eProsima/PX4-FastRTPS-PoC-Snapdragon-UDP)

こちらは、PX4とQualcomm SnapdragonをUDP接続してbridge接続をできるように試みるプロジェクト。(実際にどこまで動くかは全く不明)
そもそもUDP接続(network接続)っていうものは、PX4とSnapdragonの間では一般的な接続なのだろうか？PX4がネットワークインターフェースをもっているということか？
yarnとは

代表的なnode.jsのパッケージマネージャに`npm`と`yarn`があります。

<font color="red">**npmよりyarnの方が良い！**</font> と書いてある記事を何回か見かけたので、今回はyarnについてまとめてみました。
npmについては以前の記事でまとめています。
> [npmとは -Qiita](https://qiita.com/lelouch99v/items/05f973df9c54cec23419)

# yarnとは
- JavaScriptのパッケージマネージャ
- 2016年にFaceBookが公開した
- npmと互換性がある = 同じ`package.json`が使える

# yarnのメリット

- **npmよりインストールが速い**
  - 約半分になる場合もあるそう
- **npmより厳密にモジュールのバージョンを固定できる**
  - `yarn.lock`ファイルで、各パッケージのインストールバージョンを固定できる。
- **npmと一緒に使える**
  - npmと同じのpackage.jsonが使えるため、同一プロジェクトでnpm or yarnで固定しなくて良い。 

# yarnの使い方
## yarnのインストール
ターミナルで以下のコマンドでインストール。

```
sudo npm install -g yarn
```

## package.jsonの生成
パッケージを一括管理できるpackage.json。
プロジェクトにまだpackage.jsonがない場合、以下のコマンドで生成できる。

```
yarn init
```
npmでは`npm init`だった。

## yarnでパッケージをインストール
package.jsonに記載されたモジュールをインストールする。

```
yarn
```
npmでは`npm install`だった。yarnはyarnだけ。短いね。

## パッケージの追加
以下のコマンドでパッケージのインストールとpackage.jsonへの追加ができる。

```
yarn add [パッケージ名]
```
npmでは`npm install --save`だった。

## パッケージのアンインストール
```
yarn remove
```
npmでは`npm uninstall`

## その他
### devDependencies
```
yarn add [パッケージ名] --dev
```

### グローバルインストール
```
yarn global add [パッケージ名]
```

# まとめ
使いやすそう。今後はyarnでいいかも。
【Android】Android 10から始めるSettings Panels

# Settings Panelsとは
Android ~~Q~~10から新しく追加されたAPIで、
自アプリのコンテキスト内でユーザー設定を表示し変更を可能にする機能です。
つまり、設定アプリに移動しなくて済むためユーザー操作の手間を減らすことができます。

<img width="40%" alt="Screenshot_1565703351.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/b3cf3f60-65e9-48d8-deb9-9bdbbd1c51ca.png">


# 設定できる項目
- ACTION_INTERNET_CONNECTIVITY
 - Wi-Fi、モバイルデータ、機内モードなどのインターネット接続状況の確認や設定
- ACTION_WIFI
 - Wi-Fiの接続確認や設定
- ACTION_NFC
 - NFCの設定状況や変更
- ACTION_VOLUME
 - 各種音量の確認や設定 

# 使い方

### 準備


```gradle:build.gradle
android {
    compileSdkVersion 29
    defaultConfig {
        // 省略
        targetSdkVersion 29
    }
}
```

### 実装

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ACTION_INTERNET_CONNECTIVITY
        settings_internet_connectivity.setOnClickListener {
            startActivityForResult(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY), REQUEST_CODE)
        }

        // ACTION_WIFI
        settings_wifi.setOnClickListener {
            startActivityForResult(Intent(Settings.Panel.ACTION_WIFI), REQUEST_CODE)
        }

        // ACTION_NFC
        settings_nfc.setOnClickListener {
            startActivityForResult(Intent(Settings.Panel.ACTION_NFC), REQUEST_CODE)
        }

        // ACTION_VOLUME
        settings_volume.setOnClickListener {
            startActivityForResult(Intent(Settings.Panel.ACTION_VOLUME), REQUEST_CODE)
        }
    }
}

```

### 完成イメージ

<img width="40%" alt="settings_panels.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/7b667207-0356-8833-d58c-0436ce80c32d.gif">

# 補足
- AndroidXによるバックポートも予定している。（今後のアップデートに期待）
- コールバックは#onActivityResult()で受け取る。

#### 参考資料
https://developer.android.com/preview/features#settings-panels

---

##### 追記
・タイトルをQから10に修正
【React】オブジェクトリストをループしてコンポーネント化する

#はじめに

プログラミング歴2ヶ月の素人が書いています。（間違っていたらご指摘ください）

WesBos.com のオンラインビデオコースでReactを学習しています。
動画は以下から。
https://reactforbeginners.com/

「Reactでオブジェクトリストをループしてコンポーネントを動的に複数生成する」ための学習メモです。


#今回の目的

以下のような商品リストがオブジェクトリストとして存在するとします。

```react:fishList.js

const fishes = {
  fish1: {
    name: "Pacific Halibut",
    image: "/images/hali.jpg",
    price: 1724,
  },

  fish2: {
    name: "Lobster",
    image: "/images/lobster.jpg",
    price: 3200,
  },

  fish3: {
    name: "Sea Scallops",
    image: "/images/scallops.jpg",
    price: 1684,
  },

export default fishes;
```

このようなオブジェクトリストをもとに、

* コンポーネントを動的に変化させながら自動生成。

* リストが増えたり減ったりしても、自動的に変化するようにします。


#実装の概要

* オブジェクトリストはそのままではループできないので、`Object.keys()`でキー配列化する

* `map()`しながら、`<Fish />`というコンポーネントをキー配列の要素分つくる

* `<Fish />`コンポーネント内でオブジェクトの情報が使えるよう`props`として渡す


##リストのインポート

```react:App.js
import React, { useState } from 'react';
import fishes from '../fishList'; //Fishのオブジェクトリスト
import Fish from './Fish'; //Fishコンポーネント（これから作る）

const App = () => {
  return (
    /*ここに <Fish /> のリストを作りたい*/
  )
};
export default App;
```


##オブジェクトリストからキーの配列をつくる

```react:App.js
const App = () => {
  return (
     {Object.keys(fishes)} // [fish1, fish2, fish3]
  )
};
```

##キーの配列を`map()`してコンポーネントを作る

ついでに個々のコンポーネントにユニークな`key`propsをつけることができます。

```react:App.js
const App = () => {
  return (
    {Object.keys(fishes).map(key => <Fish key={key} />)} 
    // <Fish key="fish1"/>
    // <Fish key="fish2"/>
    // <Fish key="fish3"/>
  )
};
```


##オブジェクトの情報にアクセスできるよう`Props`を渡す

```react:App.js
const App = () => {
  return (
    {Object.keys(fishes).map(key => <Fish key={key} details={fishes[key]} />)} 
    // <Fish key="fish1" details={name: "Pacific Halibut", image: ...} />
    // <Fish key="fish2" details={name: "Lobster", image: ...} />
    // <Fish key="fish3" details={name: "Sea Scallops", image: ...} />
  )
};
```


##Fishコンポーネントで情報を受け取る

プロパティから情報を受け取って、使用することができます。

```react:Fish.js
import React from 'react';

const Fish = (props) => {
  return (
    <li>
      <img src={props.details.image}/>
      <h3>{props.details.name}</h3>
      <p>{props.details.price}</p>
    </li>
  )
};

export default Fish;
```

###分割代入を使ったリファクタリング

`props.details`はそれぞれの`fish`のオブジェクトリストになっているので、分割代入することでよりコードが簡潔になります。
（なお、変数の並び順はプロパティの定義順と違っていても、分解しないプロパティがあってもokで、対応するプロパティがない場合は無視されます。）

参考： 『《JavaScript》ES6の分割代入のはじめかた。』
https://qiita.com/uto-usui/items/a9d17447fe81c17c41fa

```react:Fish.js
import React from 'react';

const [name, image, price] = props.details; //分割代入

const Fish = (props) => {
  return (
    <li>
      <img src={image}/>
      <h3>{name}</h3>
      <p>{price}</p>
    </li>
  )
};

export default Fish;
```


#まとめ

* オブジェクトリストをコンポーネント化することができる

* キー配列化して、`map()`でループする

* `props`に情報を渡して、個々のコンポーネントからアクセスできる

* 分割代入すると、コードが簡潔になる
*
UiPathで勉強してみた(UiPath Academy)

<h2>UiPathの勉強をしたい！</h2>
私自身UiPathというものを知り勉強をしてみようと思い立った人間の一人でした。
しかし、私の中にある思いが浮かんできました。

「どうやってUiPathの勉強したらいいか分からない。」
「そもそもUiPathでどんなことができるのかわからない。」

勉強を始める上で誰しもがぶつかる障壁の一つではないでしょうか。
というわけでサクッとそんな障壁を乗り越えていきましょう！

<h3>UiPath Academyを活用する</h3>
これがUiPathサクサク使いこなせる人になる一番だとの近道です。

<h3>UiPath Academyとは</h3>
UiPath社が提供しているUiPathをe-learningで学習できるサイトのことです。無料です。
様々なトレーニングコースが用意されており、UiPathの基礎中の基礎～上級者まで幅広く勉強することができます。日本語にも対応しています。

トレーニングコースを修了すると修了証明書を発行することができます。

UiPath Academy
https://academy.uipath.com/pages/10/my-dashboard

<h3>どのコースを受ければいいのか</h3>
様々なコースがあるのですが
「Level 1 Foundation (基礎)トレーニング」から始めるのが安定です。
このトレーニングでは以下のことを学ぶことができます。

・基本的なプロジェクト作成の流れ
・UiPathでどんなことができるのか
・UiPathにはどんな機能があるのか

私は演習とかはせず「どんなことが、どんな感じで操作して実現するのか」を意識して勉強しました。動画は基本的に2倍速推奨です。
所要時間は13レッスンで5時間程度でした。

<h2>まとめ</h2>
UiPath Academyを使ってUiPathマスターになりましょう！