粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Git cloneでPermission Denied(publickey)の対処法< SSH Keyを設定する >

jetsonのセットアップ中パッケージのCloneに困ったという記事です。

より具体的にはYOLOv2のROSバージョンを使おうとしたのですがgit cloneでPermission Deniedと喰らいました。
原因はjetsonのSSHキーを設定していなかったというだけだったのでわかっている人は見なくても良いです。

小噺:YOLO for ROSについて

YOLOと言えば2016年,2017年とCVPRにて発表されたSingleShot系の物体検知&抽出 アルゴリズムです。
開発者のサイトはこちら。
YOLO: Real-Time Object Detection

ROSでの実装ですが,私は以下のDarknetを用いてきました。
github.com
感覚的に最もpopularな実装が上のやつですが,ノードでAdvertiseするのが分類名と確率だけで複数のBoundingBoxの情報を出してくれないという不便さがあったと記憶しています。

その点,以下の実装は物体位置と確率がきちんと出力としてサポートされているので助かります。
まだまだ,自分で調べて改造する余地はありそうです。
GitHub - ThundeRatz/ros_yolo2: YOLOv2 integration with ROS


他にも信号機の抽出に特化したやつなどもあり,インターネットの集合知に感謝してもしきれません。
github.com

GitHubでのSSHキーの設定

SSHキーの設定では以下のサイトにお世話になりました。
monsat.hatenablog.com

秘密鍵の作成手順

まず,PC内の秘密鍵作成手順です。(一応Ubuntu16の環境を基準に話しします。)

簡単には次のようなコマンドをうちます。メールアドレスは自分のものにしてください。

ssh-keygen -t rsa -C "your_email@example.com"

入力後,以下の3つを入力要求されますが全部何も考えずにEnterして問題ないそうです。

ちゃんと勉強したければこちらを参考に。
SSHなるものをよくわからずに使っている人のための手引書 - Qiita


その後GitHubのサイトでProfile→SSH Keysの欄から「~/.ssh/id_rsa.pub」内の公開鍵を登録します。
幾つかのコピー方法があるらしいですが意識が低い私は次のコマンドで済ませました。
誰かしかってやってください。

cat ~/.ssh/id_rsa.pub

動作確認

Bash

ssh -T git@github.com

と入力し,Autorizedと出ることで動作が確認できます。

YOLOの改造はまた今度。

ポモドーロに用いるタイマーソフトの比較

ポモドーロとは

料理のことではなく,ポモドーロテクニックと呼ばれる作業時間と短い休憩を交互に繰り返すことで,作業量と集中力を管理する手法のことです。
生産性がグングン上がる!「ポモドーロ・テクニック」って知ってる? | リクナビNEXTジャーナル

一般に25分の作業と5分の休憩を交互に繰り返します。

ポモドーロは使えるか?

ADHDの気がある自分が一人でやってもあんまり効果は感じないです。集中できるときは長続きするしそうでない時は全然だったりのムラがあるタイプです。

しかし,これをラボ等で集団でやると全員が一斉に集中するので部屋が静かになり,自然と集中すべき環境が醸成されるのでなかなかどうして捗った気になります。(効果の程は未検証)

ポモドーロ & プロジェクタ

ポモドーロを手軽に導入したい場合,スマホのアプリをインストールして大音量で鳴らすのが手っ取り早いです。
この場合持ち主以外は残り時間などをチェックできなくて面倒です。

そこでプロジェクタに写すことを考えます。
単焦点プロジェクタは場所を取らなくて便利。

要求

そこで今回の要求としては次の2つがメインになります。

  • プロジェクタに現在の時間等が大きく映る。
  • 終了時や開始時にきちんと音が鳴る。

各ソフトの所感

<名称:評価>の形式で列挙します。

FREE Countdown Timer:▲

フリーソフト
FREE Countdown Timer - CountdownKings

非常にクールで見やすいカウント画面と直感的に操作できる点が素晴らしい。
https://www.countdownkings.com/wp-content/uploads/03_countdown_timer_clock.png
https://www.countdownkings.com/wp-content/uploads/04_countdown_timer_end.png

最大の欠点は音が鳴らせないことで,非常におしい存在になっています。
なお,スマホのアプリはきちんとそこの所が改善されているらしいのでおすすめです。
www.countdownkings.com

もっというとPC版にも音の鳴らせる上位ソフトがありますがそちらは有料のよう。
Minimalistic Countdown Timer Extended for PC & MAC
19ドル前後とあまり安くないので不採用。

Tomatime:○

Windows10のアプリから入手したフリーソフト
tomatime を入手 - Microsoft Store ja-JP

音も鳴るし,それなりにわかりやすいUIで使い勝手の良い物になっています。
https://store-images.s-microsoft.com/image/apps.37891.9007199266358781.9785c6c4-81ba-4f0a-906e-38406fa3c5a1.f2ccde65-43a9-41eb-8537-4cc54ed74e4d?w=471&h=305&q=60

欠点は完了時等に鳴らす音が選択できない(嫌な音ではない)のと,ループ駆動できないこと。
ポモドーロを回す度に操作を要求されます。

それ以外は満足。

Focus to Do:◎

こちらもWindows10のアプリから入手したフリーソフト

Focus To-Do: ポモドーロ技術 & タスク管理 を入手 - Microsoft Store ja-JP

サイトから持ってきた画像ですが非常にシンプルでプロジェクタ向き。
https://store-images.s-microsoft.com/image/apps.37755.14049653041316721.db870f08-3704-415d-ae1d-c567f9593aba.e6aa1bb1-2486-4258-bc2a-ed6b73181360?w=471&h=265&q=60

また,作業毎にポモドーロの数を設定して自動ループを組むことができ,サインインしたら作業経過を共有することも可能です。
f:id:ossyaritoori:20180228012448p:plain

あと,開始時と終了時の音が自由にいじれるのも良いです。(選択肢を増やすには課金が必要。よくできてますね。)


ということで,こちらを採用して行こうと思います。

番外編

Webアプリ Tomato Timer:○

Web上で走らせるなら次のサイトが使い勝手良かったです。
Tomato Timer

プロジェクタに投影しないならこれで十分かもしれない。

Chrome アプリ Tomato Timer

自分でやるならChromeアプリ版のTomato Timerが良いでしょう。
chrome.google.com

Chromeさえついていれば計測ができます。
https://lh3.googleusercontent.com/C5ORUsqYKQYLoT-mV5hKyaJwJONvDFqIO6Yi2YSTfdNp_y6f4MtafgWQS_Qkztkzo7-vLvc0Mt0=w640-h400-e365

黙れナレーター(Windowsのナレーター機能を完全封印する)

Introduction

メロスは激怒した。かならず、かの 邪智暴虐 ( じゃちぼうぎゃく ) のナレーターを除かなければならぬと決意した。メロスにはコンピウタがわからぬ。メロスは、ただの学生である。けれどもWindowsの無用なクソ機能に対しては、人一倍に敏感であった。

邪智暴虐のナレーター

今回の殲滅対象である。降臨方法は「Ctrl」+「Windowsキー」+「Enter」である。
降臨後はSAN値がすり減る前に速やかに再度同じコマンドをうって消滅スべし。
https://support.microsoft.com/ja-jp/help/17173/windows-10-hear-text-read-aloud

ナレーターの倒し方

Windows8の場合は以下の記事を参照。
うっとうしいWindowsの「ナレーター」を完全に無効化する方法 | TeraDas-テラダス

本記事ではWndows10のナレーターを討伐する。
Windowsキー」+「r」を押して以下のwindowを出現させ「regedit」とうってEnter。
https://www.top-password.com/blog/wp-content/uploads/2017/04/regedit.png

以下のようなレジスタの「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Narrator\NoRoam」へとたどり着く。
https://www.top-password.com/blog/wp-content/uploads/2017/06/disable-narrator-shortcut.png

赤で囲ってある箇所をダブルクリックして以下のように値を書き換える。
https://www.top-password.com/blog/wp-content/uploads/2017/06/WinEnterLaunchEnabled.png

これでナレータのショートカットを無効にしたことになる。

ナレーターは二度死ぬ

ショートカットを無効にした所で奴の本体は生きている。追い打ちをかけるべし。
「C:\Windows\System32」からNarrator.exeを探し出す。

右クリックで「プロパティ」を開くと以下のような画面が出る。

「セキュリティ」のタブを開いて「詳細設定」をクリック。
f:id:ossyaritoori:20180222172815p:plain

以下のように赤枠がUsersになっていれば「OK」を押して戻る。
「TrustedInstaller」など他のものになっていれば権限を変更しに行く。
f:id:ossyaritoori:20180222172600p:plain

権限を変更するには「編集」を押して出て来る以下の画面をひらき,赤枠に「Users」とうったのちに右側の名前を検索をタッチ。
うまく行けばさっきの赤枠内に自分のユーザ名が表示される。
f:id:ossyaritoori:20180222172434p:plain


そしたら以下の画面に戻って,「編集」の所をクリックして
f:id:ossyaritoori:20180222162116p:plain

次のように読み取りと書き込みに無効と設定する。
https://www.top-password.com/blog/wp-content/uploads/2017/06/deny-execute-narrator.png

これにて終劇。
ナレーターは死んだ!もういない!


勝利のBGMに酔うと良い。
www.youtube.com

MATLABでパーティクルフィルタ

流石に適当に書きすぎたか
この辺の分野はどの専門を土台にするかでかなり説明などが変わってきます。
私は制御&ロボティクスが半々くらい。EKFやベイズの定理などはすでにMasterしているものとします。
(ていうか説明しない)

基礎は確率ロボティクスで勉強しよう。

確率ロボティクス (プレミアムブックス版)

確率ロボティクス (プレミアムブックス版)

ちなみに英語版のドラフトは以下のURLに落ちています。
https://docs.ufpr.br/~danielsantos/ProbabilisticRobotics.pdf
書籍版と比べましたが書籍版の方が洗練されてますね。英語読むの辛いし。

パーティクルフィルタとは

ベイズフィルタの亜種。状態推定に必要な確率分布を数式ではなく,多数の粒子群の集合として表現する手法です。
粒子の数を増やせば実質どのような分布でも表現でき,状態方程式とノイズの分布がわかっていればどのような関数でも同じように実装できるのが強み。


wikiを見るか以下の説明が簡潔かと。
なお,『カルマンフィルタもパーティクルフィルタも全部ベイズフィルタで説明がつく』という説明が美しいのでやはり上記の確率ロボティクスの本を読むことをおすすめします。
パーティクルフィルタ - おべんきょうwiki - アットウィキ

実装などについては以下のサイトが参考にしやすい。
Tutorial/Practice0 – MIST Project

Pythonの実装例でよければ確率ロボティクスを和訳した上田先生が公開しているモンテカルロ自己位置同定の話なんかが実装の参考になることでしょう。
github.com

後は鏡先生のスライドとかも参考になるか?
http://www.ic.is.tohoku.ac.jp/~swk/lecture/ic2012/kagami_ic20120710.pdf


matlab実装

というかMATLABの実装もAtsushiさんがやってくれてます。自己位置同定に関してはこれを使えば良いでしょう。
Particle Filterを使用した自己位置推定MATLABサンプルプログラム - MyEnigma

もう少し汎用的な話なら以下のブログがわかりやすいかと思います。式はいくつかこのブログから拝借してます。
satomacoto: Pythonでパーティクルフィルタを実装してみる

ちゃんとわかりたかったらやっぱり教科書を読みましょう。あれはやはり名著です。

各々の粒子は状態,重みをもつ。

状態推定

各々の粒子はそれぞれ自分の状態,重みをもつとします。

状態推定はEKF等と同じ流れで,状態方程式に基づいて各々の粒子を遷移します。
「各々のパーティクルごとに更新をするという点」と「実際に乱数を与えてノイズも加える」という点が少し違います。
f:id:ossyaritoori:20180204022446p:plain

まぁモンテカルロって言ってますしね。実際に試していくわけです。

観測に依る更新

一方,状態更新の際には尤度を使って更新します。
f:id:ossyaritoori:20180204023057p:plain

このp(Y|X)というやつが曲者ですが,ノイズをガウス分布と仮定するなら次のように書けます。
この更新に使う尤度は次のように計算します。(1次元の場合)
f:id:ossyaritoori:20180204023305p:plain

ここで,p(Y|X)は相対的な値がわかればよいです。
なぜなら,この後,全てのParticleに対して尤度を元に重みを更新しますが,更新した重みの和が1になるように正規化します。
従って,どうせ後で割り算でつじつま合わせの補正がされるので余計な計算はしなくて良いということですね。

ここが気味が悪いと思う人はやはり教科書を(ry
これもわかりやすく説明するのは他の人に投げたい。

個人的な解釈

解釈の例を載せておきます。間違っていたら指摘してください。

非線形出力方程式として
Y = g(X) + ⊿
とでもしてみましょう。g()が非線形関数の出力で⊿が平均0,分散σ×σのガウス分布とします。
はてな形式で数式をうつのはだるいのでこれで勘弁

g(X)を左に移行する式変形をするとつまるところ,Y-g(X)は平均が0で分散がσ^2のガウス分布に従うことになります。
そしてガウス分布の式はWikiより次のように表せます。
f:id:ossyaritoori:20180204023733p:plain

このxの代わりにY-g(X)をぶち込んだ分布にXとYは従うということです。
つまり特定のXの時に特定のYを取る分布p(Y|X)はまさにこの分布に従うということです。
うーん,うーん,また教科書読み直してきます。
深夜に書いてて頭痛くなってきた。

リサンプリング

最後に新たに得られた重みの大きさに応じて粒子を再配置します。
パーティクルフィルタによる自己位置推定動作の可視化 - Qiita リサンプリングの項を参照。(孫引用で申し訳ない)

注意しないと確率の低めな粒子が全て淘汰されて推定値の集合が一点付近に収束してしまい,誤った値に収束して動けなくなったり,突然の外乱で値がずれたときに追従できなくなってしまうなどと言った問題が発生します。

これにも手法論がいろいろありまして
確率ロボティクス第五回 参照)

「系統抽出法」を使うのがおおかた妥当らしいです。
重みを元に領域を区切り直して再びばらまく&その際にランダム性を持たせて粒子の多様性を保存する的な意味合いです。

尤度の設定は重み付き平均でいいのか?

単峰性が確約されない場合重み付き平均は良くない場合も多いです。
以下のブログが非常にわかりやすい。
qiita.com

コード

応用例としてwikiの速度推定の話をしましょう。
カルマンフィルター - Wikipedia

速度がランダムウォークするとの仮定のもと,位置と速度の2つの状態を持つ状態を推定するという問題です。

コード置き場

例のごとくGistにあげました。リサンプリングとかはAtsusiさんのをほぼそのまま借りてます。ありがとうございます。

実装のコツ

クラスで作成しました。変数の状態等を内部できちんと管理するのにいいですね。
また,関数ハンドルとして状態方程式等を与えることに寄って,自分の設定した状態方程式に合わせた実装が容易にできるようにしました。
おそらく大体の関数においてこのコードは使用可能ではないでしょうか。

関数ハンドルにかんしては詳しくは「無名関数」でググってほしいですが

f=@(x,y)x+y

としたなら

f(x,y)
>> 5

という風に使えるものを関数ハンドルと呼びます。これで

state=@(x,u)A*x+B*u

とでも書けば状態方程式を簡単に定義できるというわけ。これは覚えて置いて損はないかと。

結果

なんかあんまり恩恵受けた感じしないですね。
とりあえず動いているのではなかろうか。
f:id:ossyaritoori:20180204164317p:plain

総評・所感

正直に言ってカルマンフィルタより実装が楽かというと全然そんなことは無いし,計算量もクソ重でした。
(これは行列演算ライブラリの利点を生かす実装をしなかったという点が大きいが)

一番困難なところはチューニングで,状態遷移のときのノイズをそれなりに大きく取らないとパーティクルがうまく撒けないし,
(追記:いや,これはどっちかというと初期値のバラまき方の問題というべきか。)
毎ステップでランダム要素が入るので,妙なことが起こるのではという不安もそれなりにあります。
そして周波数領域での設計とか超やりにくいじゃん!という致命的な制御屋の不満があったり,,,

何れにせよ多量のサンプルを用いて幅広い表現力を得た代わりにチューニングや設計のコツなども多分にややこしくなったというのが本当のところではないだろうか。

「パーティクルフィルタは簡単」との言はもっとロボットのローカライゼーションとかやる時に実感できるのかなぁ…

PDFの図をIPEで編集

前回に引き続きIPEの布教です。(今回はなぜかですます調)

ossyaritoori.hatenablog.com

IPEの強い点はLatexを用いた綺麗な作図を直接PDFで生成/編集が可能というところでした 。
ところが,IPEは任意のPDFを開けるというわけではなく「IPEで作ったPDFしか開けない」という足かせがあります。

PDFをIPEで開けるようにする

はい,実はIPEをインストールしたbinの中に「pdftoipe.exe」と「ipetoipe.exe」というファイルがありましてそいつらを使えばPDFをIPEで扱える形式に変換可能です。
Matlab · otfried/ipe-wiki Wiki · GitHub

手順は以下の2stepです。

pdftoipe.exe file.pdf file.xml
ipetoipe.exe -pdf file.xml file.pdf

最初の行でPDFをIPEで開けるようにして,次の行でPDFとして保存し直しています。
まぁ編集するだけなら最初の行だけで良さそう。

具体例:MATLABの図

以下の図は僕が昔matlabで作った図です。
f:id:ossyaritoori:20180129205817p:plain

いろいろ突っ込みどころはありますがこれをIPEで開くと次のようになります。
f:id:ossyaritoori:20180129210008p:plain

TextBoxの区切りがちょっと変になったりξが文字化けしてνになっていますがこれは再編集すれば治ることです。

再編集した結果がこちら。
字体やフォントの違いなど注意事項はありますがIPEの強さがわかっていただけたかと思います。
f:id:ossyaritoori:20180129210605p:plain

ちなみに捏造っぽいこともできます。
良い子のみんなは真似しないように
f:id:ossyaritoori:20180129210850p:plain

他の具体例も暇があれば試します。

PDFのCropping

PDFの余白切り抜きも思いのままです。
f:id:ossyaritoori:20180130002926p:plain
上のように外苑の赤枠を加工することで,PDFの余白を削れます。

以下の記事で紹介したBrissよりはるかに高性能なので図の余白調整にはこちらを使うことにします。
ossyaritoori.hatenablog.com


batファイルの作成

毎回コマンドをうつのはだるさの極みな(環境変数などもだるい)のでbatファイルで自動化をします。

PDFをIPE形式に変換して開く(一行目のみの実装)

とりあえず以下のファイルに適当な名前を着けて保存します。
私は「openPDFinIPE.bat」という名前にしました。

「set INPUT= %1 」でドラッグ&ドロップしたファイルのパスを取得
ファイル置換を用いて変換後のファイル名を生成しています。

使用する際には最後2行のIPEのpathをキチンと書き換えてください。

@echo off

echo FileName is ...

set INPUT= %1
set FNAME= %INPUT:.pdf=%
set IPE_FILE= %INPUT:.pdf=.ipe%
set OUTPUT= %INPUT:.pdf=ipe.pdf%

echo %INPUT%

C:\Users\YOURNAME\Desktop\ipe-7.2.7\bin\pdftoipe.exe %INPUT% %IPE_FILE%
C:\Users\YOURNAME\Desktop\ipe-7.2.7\bin\ipe.exe %IPE_FILE%

後はbatにドラッグアンドドロップすればipeでファイルを開くことができます。
ショートカットを作ってデスクトップとかに置くのもありか?

IPEでブロック図などの図を作成

使いやすいCAD風の図作成ソフトIPEの紹介です。
追記などを激しくした結果,口調が統一されていないのであしからず。

IPEとは

PDFやXML形式で図を作成,編集できる描画ソフトです。
マウス操作の使用感はCADに近くマウスが必要ですが,その分「Latexが使える強いInkscape」のような感じで使うことができます。
Inkscapeのプロではないのでやや公平性に欠けますが,使い勝手もなかなか良いです。

他にもPDFで吐いたFigureをちょっと加工したいときとかに便利。

キッカリした図を書くのが得意で,ブロック図とか,

f:id:ossyaritoori:20200111033715p:plain

座標系とかの図がサラサラ書けます。

f:id:ossyaritoori:20200111033916p:plain

導入

以下のサイトからダウンロード,解凍すること。
The Ipe extensible drawing editor

インストールは要らず,解凍したらすぐ使える。

動画

インド英語で聞きとりにくいという噂
www.youtube.com

簡単なブロック線図を書く手順

起動すると以下のような画面が出てくる。今回気をつけるであろう所に赤◯を着けた。上の◯はグリッドのサイズ調整なので無視してくれて良い。
また,グリッドが表示されてない人は左上から数えて5番目の田みたいになってるアイコン(「Snap」の真下)をクリックしてくれ。
f:id:ossyaritoori:20180126114014p:plain

ブロックを書く

箱を書くところだが以下のように箱のマークをクリックしてグリッドをクリックすることで描画が開始できる。
グリッドが荒く感じたら上の16ptとなっている所をいじろう。
f:id:ossyaritoori:20180126114406p:plain

左上と右下の2点のみを指定すればブロックが書ける。

テキストオブジェクトを挿入

テキストオブジェクトは当然「A」みたいになってるアイコンから呼べる。
f:id:ossyaritoori:20180126115141p:plain
上のような画面が出てくるが,
①で普通の文とLatex数式環境を選択でき,
②で文字サイズ(ただしTex形式)を変更可能。今回はLARGEを使用。

各コマンドの具体的な大きさはLaTeXコマンド集 - 文字サイズを見てくれ。


なお,①で普通の文を選んでも$で囲めば数式環境になるので気にならない。
このウィンドウは右クリックMenu最下段でも呼べる。

テキストオブジェクトの位置調整

IPEはこのグリッド上でしかオブジェクトを移動できないらしい。
しかもデフォルトではこのオブジェクトの位置の基準が左下にあるのでどうやっても綺麗に並ばない。

  • 右クリックで「Horizontal Alignment」→「hcenter」
  • 右クリックで「Vertical Alignment」→「baseline」

として基準を真ん中に持ってくることで解決。

左が提案手法で右がデフォルト。
f:id:ossyaritoori:20180126120240p:plain

矢印でつなぐ

線を呼ぶオブジェクトをクリック。
始点はクリック1回。終点はクリック2回。
その際以下の赤線で囲った所をクリックして矢印オブジェクトを指定する。
f:id:ossyaritoori:20180126120709p:plain

丸を付ける

フィードバックなどの結合部に◯を書くには以下のような,中心と円周を指定して円を描くモードを使うと良い。
この際上のグリッドを細かくしておかないといい大きさの◯が書けない。
f:id:ossyaritoori:20180126135021p:plain

ファイルの保存とエクスポート

ちなみにこんな感じになる。
f:id:ossyaritoori:20180126141227p:plain

ファイルの保存

左上のFileからSaveを押す or Ctrl+S で保存可。
この時点でDirectにPDFまたはxmlとして図を保存できる。

基本的にPDFで保存するのが良さそうだ。(xmlで保存するとCUIでデザインを変更しやすいとかなんとか)

PDFで保存

PDFで保存すればTexにそのまま貼れるのでPPTで作る際の「EMF→EPS→DVI変換」というクソ面倒なチェーンを組まなくて済む。
また,IPE形式で作成したPDFはそのままIPEで編集可能。

これは結構論文図作成界隈では重要な事項なのではないだろうか。

エクスポート

左上のチェックボックスからエクスポート先を選べる。デフォルトではEPSとPNGの二択。
PNGは時々使うかもしれない。EPSはPDF保存が出来るので必要なさそう。



ちなみに極めるとこれでスライドも作れるらしく,Beamerより良いという説もあるらしい。
使いながら見極めたい。

基本操作や小技など

上のメニューのModeという所から選択モード,並進移動モード等が用意されている。
詳しくはマニュアル参照。
http://simtec.jp/IPE7Manual_JPN.pdf

移動などのショートカット

オブジェクトの移動にはAltを押しながらドラッグする。
他にも覚えておくと操作が楽になるショートカットがあるので適宜覚えて置くと良い。
f:id:ossyaritoori:20180126140351p:plain

プリアンブルの作成

「Edit」→「Document Propaties」からTexのプリアンブルを変更可能。

MATLABのFigureからの連携?

Matlab FigureをTexで使えるTikzに変換する的なやつ。これ関連してたかどうか記憶にないが同カテゴリとして認識しているので加えておく。
https://jp.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz-matlab2tikz

IPE網掛け加工

塗りつぶしの代わりにhatchingすなわち網掛け処理をしたい場合,
右クリックからTiling Patternをクリックし,fallingないしrisingを選択します。
網掛けの線の色はFill color を変更することで変更可能です。

結線を書く

四角形を書くところのすぐ左に○◆Xなどが並んだMarksという処理ボタンがあります。
それを選択して置きたい箇所をクリックするだけ。

PythonでYoutube動画検索

以下を参照。
Google API Python Clientを使ってYouTube Data APIv3をいじる - Qiita

APIを許可する

Google Cloud Platformにアクセスして,新しいプロジェクトを作成。
Youtube Data APIを入れる。

YouTube Data API の概要  |  YouTube Data API (v3)  |  Google Developers


パッケージ導入

ここを元にYoutubeに関するAPIのパッケージを導入。
Installation  |  API Client Library for Python  |  Google Developers

pip install --upgrade google-api-python-client

管理者権限で実行することを忘れずに。

サンプルコード

サンプルコードはこちらから。
Python コード サンプル  |  YouTube Data API (v3)  |  Google Developers

使ったのはYoutube検索API。なんとなく構造がわかったのでそれでよし。
適当なキーワードを入れて動画を検索し,その結果を表示。
動画とプレイリスト,チャンネルを区別できる。

APIのKEYを含めることを忘れずに。

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 21 23:38:58 2018

@author: Edwin Ri
"""

#!/usr/bin/python

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser


# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps
# tab of
#   https://cloud.google.com/console
# Please ensure that you have enabled the YouTube Data API for your project.

DEVELOPER_KEY = "ここのKeyは最初に取得したAPIキーを用いること。"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

def youtube_search(options):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey=DEVELOPER_KEY)

  # Call the search.list method to retrieve results matching the specified
  # query term.
  search_response = youtube.search().list(
    q=options.q,
    part="id,snippet",
    maxResults=options.max_results
  ).execute()

  videos = []
  channels = []
  playlists = []

  # Add each result to the appropriate list, and then display the lists of
  # matching videos, channels, and playlists.
  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#video":
      videos.append("%s (%s)" % (search_result["snippet"]["title"],
                                 search_result["id"]["videoId"]))
    elif search_result["id"]["kind"] == "youtube#channel":
      channels.append("%s (%s)" % (search_result["snippet"]["title"],
                                   search_result["id"]["channelId"]))
    elif search_result["id"]["kind"] == "youtube#playlist":
      playlists.append("%s (%s)" % (search_result["snippet"]["title"],
                                    search_result["id"]["playlistId"]))

  print("Videos:\n", "\n".join(videos), "\n")
  print("Channels:\n", "\n".join(channels), "\n")
  print("Playlists:\n", "\n".join(playlists), "\n")


if __name__ == "__main__":
  # 検索ワード
  argparser.add_argument("--q", help="Search term", default="ベートーベン")
  # 検索上限
  argparser.add_argument("--max-results", help="Max results", default=10)
  args = argparser.parse_args()

  try:
    youtube_search(args)
  except HttpError as e:
    print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content))


結果はこんな感じ。

Videos:
 ベートーベン メドレー 長時間 BGM No.1 (JdjNRU9QtnQ)
ベートーベン ピアノソナタ メドレー (Uuws9GxHnpQ)
ベートーベン作曲 交響曲第6番「田園」 (DZJHWkk0x7I)
ベートーベン『運命』交響曲第五番第一楽章 (PTr1v1ksWkQ)
The Best of Beethoven (W-fFHeTX70Q)
ベートーヴェン 交響曲第七番 小澤征爾 1975ライブ (tbVsJcX8V5w)
ベートーベン・ピアノ協奏曲第5番「皇帝」 (o5fNRKUOsco)
Beethoven 9 - Chicago Symphony Orchestra - Riccardo Muti (rOjHhS5MtvA)
【作業用BGM】 ベートーヴェン 名曲ピアノメドレー 13曲 (mE0WsSxB-T0)
Symphony No. 9 ~ Beethoven (t3217H8JppI)
Beethoven: Symphony No. 7 - Royal Concertgebouw Orchestra & Iván Fischer (-4788Tmz9Zo)
Beethoven - Moonlight Sonata (FULL) (4Tr0otuiQuU)
Beethoven: Symphony No.6, "Pastorale"; Jarvi, DKB (iQGm0H9l9I4)
ベートーヴェン「月光」 Beethoven "Moonlight Sonata" (-uVmGm9yiGg)
Beethoven "Moonlight" Sonata op 27 # 2 Mov 3 Valentina Lisitsa (zucBfXpCA6s)
ベートーヴェン 歓喜の歌 交響曲第九番 Beethoven Symphony No 9-video part1- (SKWm4SWzDjg)
Beethoven: Symphony No.2; Jarvi, DKB (VAnjfp7vUvA)
ベートーベン 月光ソナタ 全楽章 (xOMetY6Y-AA)
Beethoven Pathetique Sonata - 2nd mov 「悲愴」2楽章 Eric Heidsieck (bE2Zok2eL1Q)
ベートーヴェン 第9 合唱 『歓喜の歌』訳詞付 Choral "Ode to Joy" Beethoven (iU5av55T2Yk)
ベートーヴェン:交響曲 第6番 「田園」 ワルター/コロンビア響 Beethoven Symphony No.6 (byayR-OnN3U)
Beethoven: Symphony no. 3 Eroica - Philippe Herreweghe - Full concert in HD (kwRVR-TmKYw)
ベートーヴェン ピアノ・ソナタ 第8番 「悲愴」 バックハウス Beethoven: Piano Sonata No.8〈Patheyique〉 (-JpkaNWdJDA)
Wilhelm Kempff plays Beethoven's Moonlight Sonata mvt. 3 (oqSulR9Fymg)
ベートーベン - トルコ行進曲 (SexvTXYNcjY)

Channels:


Playlists:

もう少し詳細な説明

Search  |  YouTube Data API  |  Google Developers
メソッドが返すのは次のようなJSONで表されるデータ形式

{
  "kind": "youtube#searchResult",
  "etag": etag,
  "id": {
    "kind": string,
    "videoId": string,
    "channelId": string,
    "playlistId": string
  },
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string
  }
}

ちょっと使ってみたんですけどいろいろ勉強すべきことが多くて面倒っぽいなぁ