OmniAICreator/Qiita-1.07M huggingface dataset:
線形計画法 + pulp のハンズオン

# 線形計画法の概要
* 線型計画法（せんけいけいかくほう LP; linear programming ）は、数理計画法において、いくつかの1次不等式および1次等式を満たす変数の値の中で、ある1次式を最大化または最小化する値を求める方法である。線形計画法の対象となる最適化問題を線型計画問題という。
[出典:[Wikipedia]](https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E8%A8%88%E7%94%BB%E6%B3%95)

* 目的の変数に対して、複数の1次不等式や1次等式で制約を設けて最も大きい（小さい）目的変数を求めるやり方

# ハンズオン
## 問題
### example1
* 下記の制約条件をもとに、利益を最大化するにはどうすればよいか　　
    * 工程1は1日7時間まで
    * 工程2は1日14時間まで

|table|物品A|物品B|
|------|:------|------:|
|工程1|2時間|2時間|
|工程2|3時間|5時間|
|利益|4千円|5千円|

## ソースコード
* pulpを用いて、利益の最大化問題を解く
* pulpは最適化問題を解くためのライブラリ

```python:ライブラリインポート
from pulp import *
```

```python:問題解決ソースコード
# 問題オブジェクトを生成
prob = LpProblem(name='整数計画法exapmle1',sense=LpMaximize)

# 変数設定
x1 = LpVariable('x1',lowBound=0)
x2 = LpVariable('x2',lowBound=0)

# 目的変数の設定
prob += 4*x1 + 5*x2
# 制約条件設定
prob += 2*x1 + 2*x2 <= 7,'ineq1'
prob += 3*x1 + 5*x2 <= 14,'ineq2'

# 問題出力
print('-------問題情報出力-------')
print(prob)

# 解を求める
prob.solve()

# どういう状態で解けたか
print('-------解情報-------')
print(LpStatus[prob.status])

# 最適値出力
print('-------最適値出力-------')
print('Optimal Value ={}'.format(value(prob.objective)))
# 最適解出力
print('-------最適解出力-------')
for val in prob.variables():
    print('{}={}'.format(val.name,value(val)))

```
## 結果
```text
-------問題情報出力-------
整数計画法exapmle1:
MAXIMIZE
4*x1 + 5*x2 + 0
SUBJECT TO
ineq1: 2 x1 + 2 x2 <= 7

ineq2: 3 x1 + 5 x2 <= 14

VARIABLES
x1 Continuous
x2 Continuous

-------解情報-------
Optimal
-------最適値出力-------
Optimal Value =15.75
-------最適解出力-------
x1=1.75
x2=1.75
```

## まとめ
* 簡単な例はなんとなくわかった。
* 社会問題では立式するのが大変そう。
* 混合整数線形計画もやりたい。

## 参考
[最適化におけるPython](https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)
Windowsでdockerを使ったrailsの環境構築で役立った記事リスト

基本的には個人的なメモとして紹介する。
他にも同じ状態になった人も参考になると思う。

以前、railsの学習をrailsチュートリアルで行ったがtestのあたりで、エラーの連続、さらにはwindows特有のエラーが多発、最後にはgemのコンフリクトを起こして挫折してしまった。
それから1年ほどたち、[フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座](https://www.udemy.com/course/rails-kj/)が割引してたので購入して進めてみた。

この講座はDocker内で環境構築(rails + MySQL5.7)をするので、macでもwindowsでも同じ内容で進められるというものだった。進めてみるとWindows特有のエラーで止まった。
これは[このサイト](https://crieit.net/posts/Windows-Docker-Rails-sprockets)で解決方法が紹介されていたのですんなりクリア。

そして、次第にrailsチュートリアルのようにherokuにアップしたい欲が出てきた。
そこでherokuを調べてみると、MySQLは有料版でしか使えない？(英語あんましよめないからあってるか分からない。ひとまず設定めんどそうとわかる。)っぽいし、udemyの講座をチェックする限りではMySQLである必要なさそうなのでPostgreSQLを使うことにした。

あとは以下のリンク集を参考に進めた。
現時点では講座の50まで無事進めることができている。

* [Rails+Herokuで5分でWebアプリ作るおっ（ ＾ω＾）](https://qiita.com/ikuwow/items/8b8aa9ac8990f98691a9)
* [【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39)
* [Docker ComposeでRails+PostgreSQLの環境構築](https://qiita.com/youril/items/40d921ddda403c2596f4)
* [Railsアプリで Bootstrap 4 を利用する](https://qiita.com/NaokiIshimura/items/c8db09daefff5c11dadf)
* [【Rails】Pryについて徹底解説！](https://pikawaka.com/rails/pry)
* [[rails]bootsnapがあるとbinding.pryの挙動がおかしくなる現象について！！！！](https://qrunch.net/@yamahare/entries/MZFyp00CFFUl3apH)
* [redirect_to :backエラー](https://teratail.com/questions/194220)

今後講座が進むたびに更新していくつもりだ。

[https://rails-test2020-v2.herokuapp.com/boards](https://rails-test2020-v2.herokuapp.com/boards)
java Calendarクラス（時刻のセット、比較、フォーマット）

#Calendarクラスのインスタンスに任意の時刻をセット

```java

Calendar tempTime = Calendar.getInstance();
            
 // 時間をセット
 tempTime.set(Calendar.HOUR_OF_DAY, trainHour);
 tempTime.set(Calendar.MINUTE, trainTime);
```

#AがBより前の時間かどうか比較

```java

boolean isBefore = false;
//tempTimeがsafeTimeより前の時間かどうか
 isBefore  = tempTime.before(safeTime);
```

#「HH:mm」にフォーマットして出力
```java
import java.text.SimpleDateFormat;

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

// カレンダークラスのインスタンスを生成
Calendar ansTime = Calendar.getInstance();

Date time = ansTime.getTime();
        
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

System.out.println(sdf.format(time));
```
tkでシリアル通信確認するだけ

```python
# -*- coding: utf-8 -*-
import tkinter as tk
import serial as sl
import time
import datetime as dt


class App(tk.Frame):
    finFlag = True
    serial = None
    def __init__(self, master=None):
        super().__init__(master)
        self.master.protocol('WM_DELETE_WINDOW', self.On_Close) 
        # ここはシリアル通信設定を任意で決定すること
        self.serial = sl.Serial('COM7', 19200, timeout=0)
        while( self.serial.is_open is False):
            time.sleep(100)
            
        self.createPage()
        
        self.after(10, self.readData)
        
    def createPage(self):
        self.page1 = tk.Frame(self.master)
        self.page1.pack(pady=5, padx=30)
        
        self.timelabel = tk.Label(self.page1)
        self.timelabel.grid(column=0, row=0)
        self.timelabel['text'] = dt.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        
        self.label = tk.Label(self.page1, font=("",20), relief='ridge')
        self.label.grid(column=1, row=0)
        self.label['text'] = '00.0A'
        
           
    def readData(self):
        line = None
        self.timelabel['text'] = dt.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        if ( self.serial.is_open):
            line = self.serial.readline()
            line = line.strip().decode('utf-8')

            
        if( (line is not None) and (line != '')):

            print(line)
            
            self.label['text'] = line
            
        if ( self.finFlag ):
            self.after(10, self.readData)
        
    def On_Close(self):
        self.finFlag = False
        self.serial.close()
        self.master.destroy()

def main():
    root = tk.Tk()
    app = App(root)
    app.mainloop()

if __name__ == '__main__':
    main()
```
Pyinstaller でバイナリ化したものを実行する時に動的リンクでつまづく(Linux) 解決済み

## 概要
**Pyinstaller** https://github.com/pyinstaller/pyinstaller は、pythonで作ったプログラムを実行ファイルに変形してくれるありがたいライブラリのことです。

これを用いて、pythonコードをoneバイナリファイルもしくはoneフォルダにまとめた時、
別の環境にそのバイナリファイルを持ってきて実行しようとすると、動的リンク関連で怒られ、いろいろはまりました。

## 使った環境＆コマンド

環境：
- ubuntu18.04
- python3.6.3 (pyenv環境を用いていた)

```
pyinstaller -D --clean --onefile --additional-hooks-dir ./ main.py
```
このコマンドを用いて、```main.py```をonefile （バイナリファイル）にして、
他の環境でも使いたかった。（実際はこのバイナリファイルをdocker image の中に置き、dockerをもちいて実行しようとしていた）


## 出たエラー

```bash

| [7] Error loading Python lib '/tmp/_MEIzvSj0a/libpython3.6m.so.1.0': dlopen: libexpat.so.1: cannot open shared object file: No such file or directory
```



## 考察

```so file ``` がないと怒られている。pyinstaller が作ったonefileは実行環境に依存しないと思っていたけど、
実際は動的リンクを行なっている？？

と思って調べてみると、色々なことがわかりました。
まず、pyinstallerでoneファイルになったものでも、
https://github.com/pyinstaller/pyinstaller/wiki/FAQ
ここにあるように、

>GNU/Linux
Under Linux, I get runtime dynamic linker errors, related to libc. What should I do?
The executable that PyInstaller builds is not fully static, in that it still depends on the system libc.


とのこと。つまり、動的にもちろん参照するライブラリがあるので、linuxに依存します。
ここで、次のようなことが書いてありました。

>Another solution is to use a tool like StaticX to create a fully-static bundled version of your PyInstaller application. StaticX bundles all dependencies, including libc and ld.so. (Python code :arrow_right: PyInstaller :arrow_right: StaticX :arrow_right: Fully-static application)

```staticx``` というライブラリがあり、それで完全に静的なライブラリ化するのはどうでしょう？
ということでした。それに従い、やってみました。

git レポジトリはhttps://github.com/JonathonReinhart/static
ここです。
これを使い、```pyinstaller```  でonefileになったものを、さらに ```staticx``` により動的依存を減らしました。

結果、ここで作ったバイナリは、```ubuntu```（開発環境と同じ）docker環境内で無事実行できることがわかりました。


## ではなんで動的にリンクする必要があるのか
動的にリンクするものが多いと環境依存が大きくなってしまうような気がしますが、
なぜ動的リンクをするのでしょうか。

http://archive.linux.or.jp/JF/JFdocs/libc-intro.html
ここには、linuxシステムがオペレーションに使っている```libc```の歴史について書いてありますが、
そのなかの静的リンクと動的リンクの解説について少し引用して置きます。

>  static なライブラリを用いる場合は、リンカはプログラムが必要と
  する部品を探し、出力する実行ファイルにその部品をコピーします。
  共有ライブラリの場合は違った作業が行われます。
  リンカは出力ファイルに「このプログラムが実行されるときには、
  まずこれこれのライブラリがロードされていないといけませんよ」と
  いったメッセージを埋め込みます。したがって明らかに共有ライブラリを
  用いる方が実行ファイルのサイズは小さくなります。
  また消費するメモリやディスク容量も小さくなります。 Linux における
  デフォルトの振る舞いでは、共有ライブラリがあればそちらを用い、
  なければ static なリンクを行います。実行ファイルを共有ライブラリ
  形式にしたいのに static になってしまった場合は、正しい位置に
  共有ライブラリのファイルがあって（a.outでは *.sa、 ELF では *.so です）、
  それらが読み込み可能になっているかどうかをチェックしてください。

つまり、何でもかんでも環境依存しないようにするために、静的リンクをしまくるというのはダメだということです。（つまり自分の考えは浅はかでした。）


## 追記
one file ではなく、one folderを出力するようにpyinstallerを用いた時に、

```bash
cannot find libexpat.so
```

のようなエラーが出ていました。これは、```libpython3.6m.so```を使う時に```libexpat.so``` も動的にリンクしなければならなかったので、そのときにdockerコンテナ上にそれがないというエラーでした。

色々考えましたが、手っ取り早い解決策は、
コンテナ上で　``` apt-get install libexpat-dev　``` で普通にこの```libexpat.so```をインストールしておくことでした。


## まとめ


**pyinstaller** をlinuxで使う時は、onefileになったあとでも動的にリンクしているライブラリが存在していることを心に留めておく。
もし実行時にリンク問題で怒られることがあれば、

- staticx をつかってみるのも１つの手（ただし、静的リンクにすることでバイナリの大きさが増大することも理解しておく。）
- onefileをdockerに埋め込みたいなどの時は、linuxでonefileを作った時にはできるだけ同じような環境のdocker を構築するとストレスが少ない。


以上です。

今回はこの辺で。


おわり。
RubyでSketchUpメモ

#はじめに
SketchUpは立体的な絵を描くことができる(言い換えれば立体モデルを作ることができる)ソフトウエアです。SketchUpは、手作業で立体モデルを作っていくことができますが、さらに、プログラミング言語であるRubyを使って、立体モデルを作ることもできます。

本記事は、rubyを使ってSketchUpで立体モデルを作成することに関しての筆者の覚書記事です。随時更新します。筆者はRubyはほぼ初めて、SketchUpは以前、手作業でこんなの ↓ を作ったり、していたことがあります(これは、実験で使うプラスチック製のチューブで、俗にエッペンというやつです)。

<img width="235" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/7f952c74-f211-dd92-ae39-af04d2b14896.png">

先の投稿では、タンパク質の立体構造データをもとに、SketchUpで立体モデルを作ることができました。

この記事は、さらに色々調べたことを随時更新する記事です。

#注釈を立体モデル上に配置する (Textクラスの使い方)
手作業では、このような注釈を、立体モデル上につけることができます。
<img width="560" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/a29a040d-c73c-abf6-f884-9069b3a49e06.png">
Ruby APIではどのようにすれば良いでしょうか？

調べてみると、これはSketchupのTextクラスのオブジェクトです。Textクラスは、SketchupのDrawingelementクラスのサブクラスです。

<img width="814" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/03c46ece-df84-8c83-c14d-9a055b3f0526.png">

選択した状態で以下を実行してみます。

```rb
selectedObjects = Sketchup.active_model.selection
t = selectedObjects[0]
t.arrow_type
# 3
```
typeを変更してみます。

```rb
t.arrow_type = 0  #矢印なし 
t.arrow_type = 1  #横棒
t.arrow_type = 2  #丸
t.arrow_type = 3  #上の例の通り
t.arrow_type = 4  #ちょっと大きめの矢印
```
デフォルトのやつが一番良い感じな気がします。
Textから対象までを結んだ線はleaderと呼ぶようです。
##Textをrubyで描画する
ここまで調べたらあとはrubyでTextを描くのは簡単だろうと思ったら、leaderを表示できずに手こずりました。以下のコードを見てください。

```rb
model = Sketchup.active_model
entities = model.entities
point = Geom::Point3d.new([10,100,0])  #テキストを関連づける点
text = entities.add_text( "Text", point)  #テキストを追加する
 
p text.has_leader?
# true
p text.display_leader?
# false
p text.vector
# Vector3d(0, 0, 0)
```
要は、新規に作ったTextオブジェクトは、(1) leaderは持っているけれども非表示、(2) Textをセットした点と、表示文字をつなぐvectorがゼロベクトル、であるのが問題でした。ここを変更してやれば、表示されるようになります。

```rb
text.display_leader = true #leaderを表示する設定
text.vector = Geom::Vector3d.new(10,10,10) #テキストをセットしたポイントと、テキストまでのベクターをセット
```
こうなりました。
<img width="362" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/8053d8ac-db27-4ac6-5d17-18ac268a9314.png">

他に関連しそうなのは、線の太さと、表示テキストの変更でしょうか。

```rb
t.line_weight = 10
t.text = "変更後のテキスト"
```
<img width="510" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/9cd6516a-31de-d30c-603c-280aedc7f953.png">
線を太くすると、先端の矢印が埋まってしまうようですね。


Textは、ほかのDrawingElementに、アタッチできるようですが、SketchUp 2019以降で使用可能だということで、試せませんでした。

これで、例えば、[タンパク質立体構造上のアミノ酸残基](https://qiita.com/yoho/items/1e15bbd4e3a7c4c7ff69)に、注釈テキストをつけることができるようになりました。

#次の記事
調べたら、続けてここに書きます..............
Ansible copyでディレクトリを指定したときに階層が1つ深くなることを防ぐ

# 環境

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7
```

# やりたいこと

```
files/
    hoge/
        aaa
        bbb
        ccc
    tasks/
        main.yml
```

上記構成で``hoge``ディレクトリとその中身を構築対象サーバ(ノード)に``/tmp/hoge``として配置したい。

# 失敗例1

```yml:main.yml
- name: copy hoge
  copy:
    src:  "hoge"
    dest: "/tmp/hoge"
```

これを実行すると以下のようになる。

```bash
$ cd /
$ find /tmp/hoge
/tmp/hoge
/tmp/hoge/hoge
/tmp/hoge/hoge/ccc
/tmp/hoge/hoge/bbb
/tmp/hoge/hoge/aaa
```

んん～～1階層多いぞう！

# 失敗例2(失敗ではない)

```yml:main.yml
- name: copy hoge
  copy:
    src:  "hoge"
    dest: "/tmp"
```

結果

```bash
$ find /tmp/hoge
/tmp/hoge
/tmp/hoge/ccc
/tmp/hoge/bbb
/tmp/hoge/aaa
```

期待したどおりなんだけど、例えば転送したファイル``aaa``をこの先の処理で使いたい場合に``/tmp/hoge``を``group_vars/all.yml``などに定義しておいて変数として扱いたくなる。この例では

```yml:all.yml
# 転送先ディレクトリ
hoge_base_dir: "/tmp"
# ディレクトリ
hoge_dir: "/tmp/hoge"
```

と変数を2つ定義しなくちゃいけない？(Linuxの``dirname``コマンドみたいなものが使えるのだろうか)。

# 成功例

```yml:main.yml
- name: copy hoge
  copy:
    src:  "hoge/"
    dest: "/tmp/hoge"
```

``src``の最後に「``/``」をつけることで「指定したディレクトリ配下のファイル」という指示になる。よってこの指定は厳密には「``files/hoge/``ディレクトリ配下のファイル(``aaa``,``bbb``,``ccc``)をリモートの``/tmp/hoge``ディレクトリ配下にコピーする」となる。

結果

```bash
$ find /tmp/hoge
/tmp/hoge
/tmp/hoge/aaa
/tmp/hoge/ccc
/tmp/hoge/bbb
```

これなら変数も以下で済む。

```yml:all.yml
# 転送先ディレクトリ
hoge_dir: "/tmp/hoge"
```
docker-compose buildでエラー発生

#はじめに
`$ docker-compose build`
をすると以下のようなエラーが発生してしまう。

`$docker-compose build
mysql1 uses an image, skipping
phpmyadmin1 uses an image, skipping
Building web1
Step 1/11 : FROM php:7.2-apache`


エラー内容でぐぐるもそれらしい情報が出てこなかった。
備忘録として書いておく

#原因
`docker-compose up -d`
を実行すると次のようなエラーが出力されている
`ERROR: for web  Cannot create container for service web1: Conflict. The container name "/web" is already in use by container "53394296f8d037f3ddcc5f22483d893cce537958422dfa6071222aff77c5a547". You havCreating mysql      ... error`

どうやら既存のコンテナと重複しているようだ。その証拠にconflictが出力されている。

#解決策
https://qiita.com/ozhaan/items/9e2090da22ffd6c7ad2a
のサイトに書いてある以下のコマンドを実行することで既存のコンテナを一括削除できる

`$ docker rm $(docker ps -aq)`
コマンド実行後に
`$ docker-compose up -d`
を実行すると
`Creating mysql      ... done
Creating web        ... done
Creating phpmyadmin ... done`
隣無事にコンテナを立ち上げることができた。
#参考にしたサイト
https://qiita.com/ozhaan/items/9e2090da22ffd6c7ad2a
ラムダ式する意味？

ラムダ式が一体なんなのか、通常のものと何が違うのか、メリットは何か、どういう場面で使うのか。
僕はこれらを全く理解していなかったので、ここでまとめてみようと思う。

まずラムダ式とは
「関数オブジェクトを直接生成するコードのこと」

ん？？？

初めて学んだときは全く理解できなかった。
僕なりに理解して、わかりやすく一言で言うと、
「関数定義を減らせるよ？」
てことなんだと思う。

以下は例。

```kotlin
//ラムダ式を使わない場合。
fun main(args:Array<String>){
    fun cal(x: Int) {
         println(x * x)
    }
  cal(4)//結果：１６
}

//ラムダ式を使った場合
fun main(args:Array<String>){
  val square:(Int) -> Int = { x: Int -> x * x }
    println(square(4))//結果：１６
}

//ラムダ式を使ってさらに省略した場合
fun main(args:Array<String>){
  val square = {i: Int -> i * i }
    println(square(4))//結果：１６
}
```

上記の３つのコードは全て同じことをしようとしている。
確かに関数の定義をせずとも、同じ結果を得ることができている。

ただ現状書いてみたところ、、、
「メリットある？」
て感じてしまった。

もっと勉強したら、メリットや使うべき場面がわかってくるのだろう。
さらに理解したら、追加記事を書いてアウトプットしていこう。
将来作る自分の会社で建設業界をよりよくするために。
Jestで特定ディレクトリをignore

## 概要

Jestの対象範囲から特定のディレクトリを対象外としたい

## jest.config.js

以下の例は`hogedir`をignoreしたいとする

```js
module.exports = {
  testPathIgnorePatterns: ["<rootDir>/hogedir/"],
}
```
[Rails5]  -Routingネストとアソシエーションについて-

#はじめに

webアプリケーション作成途中何気なく使っていた

**Routingネスト**

と、

**アソシエーション**

の違いについて理解を深める為に纏めて見ました。

#１. Routingネストについて
一言で言うと

**・コントローラのルーティングの記述の中に、別のコントローラへのルーティングを記述する事**

例えば、

```ruby
resources :tweets do
  resources :comments, only: [:create]
end
```

と言う風にすれば、

**『tweets/:id/comments』**

の様なURL階層を設計することができる


#2. アソシエーションについて
定義は様々あると思いますが、

**モデル間の関連付け（主従関係）**
**テーブル間のリレーションシップをモデルの上の関係として操作できるようにする仕組み**

と言った所でしょうか。
用途としては関連付けたい２つのテーブルを**has_many**、**belongs_to**で関連付けます

例えば
「tweet」
「comment」
二つのテーブルがあったとして
**「一つのtweetは複数のcommentを持っており、commentは１つのtweetを持っている」**
といった様な場合、

```tweet.rb
class Tweet < ApplicationRecord
    has_many :comment
end
```

```comment.rb
class Comment < ApplicationRecord
    belongs_to :tweet
end
```

とすればアソシエーションの関連付けが出来る。

#3. 疑問に感じていた事

個人的にずっと疑問に感じていたのは、

**アソシエーションしているのにRoutingネストって必要なのか？**

って事です。ただ、

**アソシエーション➡︎モデル間の関連付け**
**Routingネスト→URL設計（関係性のある紐つけ）**

って言う意味をよく理解すればそんな疑問自体おかしい事に気付けました。

# まとめ

閲覧頂きありがとうございます。

誤った認識等ございましたらご指摘お願いいたします。
またコロナと戦う全国の医療関係者の皆様に感謝を申し上げます。
GCP Logging 基本のフィルタ演算子



| 演算子 | 意味   | 使用例                                                         | 
|-----|------|-------------------------------------------------------------| 
| =   | 完全一致 | labels."compute.googleapis.com/resource_name" = "myWebServer" | 
| :   | 含む   | textPayload : WARN                                           | 
| NOT と :   | 含まない   | NOT textPayload : WARN                                           | 
| !   | 否定   | textPayload != INFO                                          | 
| NOT | 否定   | textPayload : (NOT INFO)                                      | 
| AND | かつ   | textPayload : (ERROR AND "Login fail")                        | 
| OR  | または  | textPayload : (ERROR OR WARN OR CRIT)                         |
Temenos社がKony社を買収

#概要
2019年8月28日にモバイルバンキングアプリケーションプラットフォームのKonyが、銀行のソフトウェア会社であるTemenosによって買収されました。

日頃使用しているKony Fabricのメニューについても、買収後以下のような表示に変更となっていました。
【変更前】　　　　　　　　　　　　【変更後】
<img width="180" alt="スクリーンショット 2020-05-07 17.06.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/4c948c81-c2f3-a97d-c3db-455a1a7f804c.png">　　　<img width="173" alt="スクリーンショット 2020-05-07 17.11.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/0fcdd0f5-cf3a-a5c6-082a-0d2021e662bb.png">

また公式ドキュメントの表記についても、
Kony Visualizer　→　Quantum Visualizer、
Kony Fabric　→　Quantum Fabricに変更となっていました。
例：https://docs.kony.com/konylibrary/visualizer/visualizer_user_guide/Content/SUGinstallKonyStudio.htm

以下、プレスリリース日本語訳
>-2019年8月28日　スイス ジュネーブ-
銀行のソフトウェア会社であるTemenos（SIX：TEMN）は本日、急成長中の米国第1位のデジタルバンキングSaaS企業であるKony Incの買収に合意したことを発表しました。この買収により、米国のTemenosの規模と機能が大幅に強化され、重要なデジタル専門知識が追加され、500を超える銀行顧客を持ち、Forrester、Gartnerなどのトップアナリストハウスによってリーダーとして認められている画期的なデジタルフロントオフィス製品であるTemenos Infinityが加速します。Konyの会長兼CEOであるThomas E. HoganがTemenos North Americaの社長に就任し、買収完了日に発効するTemenosの執行委員会に加わります。Temenosは、規制当局の承認を条件として、企業価値が5億5,900万ドル、収益が2100万ドルでKony社を買収することに合意しました。

>Konyは、Gartner、Forrester、IDCなどのトップアナリスト企業からリーダーとして認められているKony Digital Banking Experience製品（Kony DBX）により、米国の一流および中規模の銀行の両方で急速な成長を遂げています。1,500人の従業員とデジタルおよびクラウドテクノロジーに関する深い専門知識を持つKonyは、銀行がデジタルバンキングアプリケーションとその市場をリードする開発プラットフォームで顧客のエクスペリエンスを変革するのを支援してきました。

>Kony DBX製品には、会話型インターフェース、人工知能、拡張現実、ウェアラブルテクノロジーのサポートを含む、優れたオムニチャネルエクスペリエンスを提供するモバイルバンキングアプリのスイートが含まれています。この成功の鍵は、ユーザーエクスペリエンスを設計および反復するための銀行ITへの負荷を軽減することにより、製品サイクルを加速し、俊敏性を高めるKonyの開発プラットフォームです。Konyのバンキングクライアントは、モバイルデポジットの20％以上の増加、モバイルクレジットカード支払いの64％の増加、および放棄率を20％から3％に大幅に削減するなど、バンキングエクスペリエンスを変革することができました。

##Temenosってどんな会社？
1993年に設立されたTemenos（SIX：TEMN）は、バンキングソフトウエアシステムの市場リーダー企業として、リテールバンク、コーポレートバンク、ユニバーサルバンク、プライベートバンク、資産運用者、金融機関等にソフトウエア製品を提供しています。ジュネーブに本社を置き、世界の60カ所以上にオフィスを構えるTemenosは、2019年現在世界150か国、3,000以上の銀行への導入実績があります。
https://www.temenos.com/

##Konyってどんな会社？
2007年創業のMADP(Mobile Application Development Platform)市場のリーダー企業です。2020年1月現在、45の国と地域で約350社、1,200以上の金融、保険、運輸、自動車業界などのモバイルアプリケーション開発で利用されています。

#まとめ 
買収後に、Visualizerの大幅アップデートがあり大きく機能が追加となったとの噂もあるため、
今後使ってみて便利だった機能なども、順次紹介していきたいと思います:thumbsup:

また、これまで紹介した機能以外にも、銀行業務に特化したKonyDBXというサービスがリリースされており、
現在私も勉強中のため、今後こちらでもどんどん紹介していきたいと思います！


#参考
プレスリリース：https://www.temenos.com/news/2019/09/25/temenos-completes-acquisition-of-kony/
【Vue.js】Nuxt.js ？ VueCLI ？それは何、仲間なの？

# ある意味では、良きライバル

![名称未設定-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622473/329a3cf8-4535-5a55-4b99-e2b085caf964.png)


イメージとしては、
どちらもVue.jsでの開発に使うものとしては同士であり仲間なのですが、
ちょっと性質というか性格が違ってくるんですね。

### Nuxt.jsは、Vue.jsのオールインワンのフレームワーク
特にルーティングを管理するrouter.jsを自動で更新してくれるのは神がかっています。
また、デフォルトでSSR(サーバサイドレンダリング)対応しているので、SSRするならこれで決まり。
そしてパッケージやプラグイン同士のつなぎ込みや依存関係を自動で管理してくれる上に、
規約や作法がしっかりとしているので、複数人開発で効力を発揮します。
その反面、自由度やゴリゴリとカスマイズしていきたい猛者は少し窮屈に感じてしまうかも！？
そんな時にうってつけなのが、そうVueCLIです。

### VueCLIは、Vue.jsのオールインワンツール
プロジェクト作成時に、VuexやVue-Routerのプリインストールを選択できたり、
いろいろやりたいようにカスタマイズしやすくなっていますが、
例えばSSRするなら、プラグインを自分で入れたりと、
自由度が高いが、一定の規律で開発を進めないと、複数人で触るとカオスにもなりかねません。

# お好みでどうぞ
つまりシンプルに、
どっちを選ぶかは好みと相性にもなってくるでしょう。
詰まるところ、**行き着く先は同じ**です。
###あなたはこれで何を作りますか？
何を使うか、よりも、何を作るか、が大事なわけで。

#### 参考 
【公式】Nuxt.js
https://ja.nuxtjs.org/guide/

【公式】Vue CLI
https://cli.vuejs.org/
ゼロから始めるLeetCode Day19 「121. Best Time to Buy and Sell Stock」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day18 「53. Maximum Subarray」](https://qiita.com/KueharX/items/837a2bab7e2f6d94d449)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

# 問題
[121. Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/)

競プロをやったことある人はきっと似たような問題を見たことがあると思います。
[プログラミングコンテスト攻略のためのアルゴリズムとデータ構造](https://www.amazon.co.jp/dp/B00U5MVXZO/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
特にこの本とかで。

各日付の株価を格納した配列が与えられます。一回のみ取引が認められるので、その中で最大利益を得るようなアルゴリズムを設計しなさい、という問題です。なお、買う前に売ることはできません。

> Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
             Not 7-1 = 6, as selling price needs to be larger than buying price.

株価が1の時に買い、6の時に売ると最大利益を得られます。
そしてその時の利益である5を返しています。

>Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

この場合は利益を得られる組み合わせが存在しないので0を返します。

# 解法
わかりやすいものとしては、与えられた配列を前から舐めていき、最小値と最大値比較し、更新していくというやり方があるかなぁと問題をみた時に思いました。

何はともあれ試してみましょう。

```Python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        mx, mn = 0, prices and prices[0]
        for i in range(1,len(prices)):
            if prices[i] > prices[i-1]:
                mx = max(mx,prices[i]-mn)
            else:
                mn = min(mn,prices[i])
        return mx
# Runtime: 68 ms, faster than 43.79% of Python3 online submissions for Best Time to Buy and Sell Stock.
# Memory Usage: 15.2 MB, less than 5.75% of Python3 online submissions for Best Time to Buy and Sell Stock.
```

解ければ良いという考え方っぽくてあまり良い回答とは思えませんね・・・

何か良さげな回答はないかと思ってdiscussを見ていたらやたら`float(inf)`
を使って回答している物が多いのでなんだろうと思って調べてみると、無限大を表す`inf`というオブジェクトなんですね。

[組み込み関数](https://docs.python.org/ja/3/library/functions.html)

```Python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        mx, mn = 0, float('inf')
        for price in prices:
            mn = min(mn, price)
            pro = price - mn
            mx = max(mx, pro)
        return mx
# Runtime: 72 ms, faster than 26.68% of Python3 online submissions for Best Time to Buy and Sell Stock.
# Memory Usage: 15.1 MB, less than 5.75% of Python3 online submissions for Best Time to Buy and Sell Stock.
```

`float(inf)`を使って書き直してみるとこんな感じ。
知らないことが多いぶん、discussを見るのは勉強になりますね。

良さそうな回答があれば追記します。
TASCAM US-2x2 4x4 音が出なくなったときの対処法 アプリ再起動バッチ

#はじめに
DAWが落ちるとインターフェースから音が出なくなり、よくこのバッチファイルを使う羽目になるので、備忘録としてまとめました。
使用しているOSはWindows10。
メモ代わりに書いているので自己責任で。


#症状と解決策
TASCAMのオーディオインターフェースであるUS-2x2を使用中、DAWがフリーズで落ちた後や、別の音声デバイスの接続時等に音が出なくなることがありました。

いろいろ試したところ私の環境では、PCの再起動もしくは、タスクマネージャーで関連のアプリケーション
**(US-2x2_US-4x4_SettingsPanel.exe, usvmix.exe, usvmixsub.exe)**
を停止させた後、**US-2x2_US-4x4_SettingsPanel.exe**を再起動することで解決しました。

#アプリケーション再起動バッチファイル
毎回手動でタスクキルするのも面倒くさいので以下のバッチファイルを作成しました。

```us22reboot.bat
@echo off
taskkill /f /im "US-2x2_US-4x4_SettingsPanel.exe" >nul
taskkill /f /im "usvmix.exe" >nul
taskkill /f /im "usvmixsub.exe" >nul
start "" "C:\Program Files\TASCAM\US-2x2 & US-4x4 Mixing Driver\US-2x2_US-4x4_SettingsPanel.exe"
exit
```
5行目（C:\Program Files\TASCAM\US-2x2 & US-4x4 Mixing Driver\）はお使いの環境に合わせて**US-2x2_US-4x4_SettingsPanel.exe**までのパスを設定してください。
RSpecを用いたRails ApiのTest

**環境**
ruby:2.6.5
rails:6.0.2
macOS:Mojave(10.14.6)

**事前準備**
  'rspec-rails','factory_bot_rails'のgemを入れておく

```ruby:Gemfile
group :development, :test do
  #-- 省略 --
  gem 'rspec-rails', '~> 3.6'
  gem 'factory_bot_rails'
end
```

#RSpecを用いたApiのテスト
apiディレクトリ内にコントローラを入れている記事を見つけられなかったので
投稿します。今回はgetのテストに絞っています。

*subjectsはnameカラムだけ持つテーブルです。*

**controller**

``` ruby:app/controllers/api/subjects_controller.rb
module Api
    class SubjectsController < ApplicationController
        def index
            subjects = Subject.order(id: :asc)
            render json: { status:'SUCCESS', message:'Loaded subjects', data: subjects }
        end
    end
end
```

**factory**

``` ruby:spec/factories/subjects.rb
FactoryBot.define do
    factory :subject do
        name { "subject test" }
    end
end
```

**RSpec test**

``` ruby:spec/controllers/api/subjects_controller_spec.rb
require 'rails_helper'

# Api::をつけることに注意　ここにめちゃくちゃハマった。
# 階層構造を作らない場合でもSubjectsControllerに""をつけるとエラーになるので注意
RSpec.describe Api::SubjectsController, type: :controller do

        it "全てのsubjectを取得する" do
            #subjectをファクトリから15個作成
            FactoryBot.create_list(:subject, 15)

            get :index
            json = JSON.parse(response.body)

            # 200 success が返ってきたか確認する。
            expect(response.status).to eq(200)

            # 作ったデータの数と同じ数のデータが返されたか確認する。
            expect(json['data'].length).to eq(15)
        end

end
```

##まとめ
冒頭でも述べましたがApiとして利用しているコントローラを階層構造に分けている記事があまり見当たらず苦労しました。
同じところでハマる人が一人でも少なくなれば幸いです。
また、時間がある時にpost,create,deleteのテストも追加したいと思います。
何かおかしい点等ございましたら、コメントお願いします。
それではコロナに負けず一緒に戦いましょう！
**#stay home !!**
金融予測におけるラベリングとは

参考文献[ファイナンス機械学習](https://www.amazon.co.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%B3%E3%82%B9%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E2%80%95%E9%87%91%E8%9E%8D%E5%B8%82%E5%A0%B4%E5%88%86%E6%9E%90%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%9E%E3%83%AB%E3%82%B3%E3%82%B9%E3%83%BB%E3%83%AD%E3%83%9A%E3%82%B9%E3%83%BB%E3%83%87%E3%83%BB%E3%83%97%E3%83%A9%E3%83%89-ebook/dp/B0834XJQTY)

# 本記事のモチベーション
金融データを予測する時に、予測の対象を定義する必要があり、何を予測したいかでアプローチが全然違います。
皆さんが一番馴染みがあるのは、株価$T+1$が上がるのか下がるのかを、価格変化率ないし価格変化率の符号で定義したことがあるのではないだろうか？
しかし、場合によっては、それでは予測が難しかったり、正答率が高くても、平均収益率やシャープレシオは酷かったりと色々な弊害があると思います。
そういったことはラベリングだけで解決出来る問題ではありませんが、ラベリングは軽視されがちでありながら、実はかなり深い意味を持っています。

# 時系列データにおけるラベリングの例とその解釈
例えば、[日経平均株価の日足のOHLCデータ](https://kabutan.jp/stock/kabuka?code=0000&ashi=day&page=1)があるとしよう。
それぞれの終値を$X_1, X_2, ..., X_T$として、翌営業日の日経平均株価の終値を予測したい場合は、予測ラベルを$$Y_n = \frac{X_{n+1}-X_n}{X_n} (1 \leq n \leq n)$$とするだろう。
このとき、このラベルを予測するということは、戦略として今日の引値で日経平均株価を原資産とした商品を成行で新規でロング(ショート)し、翌営業日の引けで成行で決済する戦略であろう。
例えば、このラベルの予測に成功し、55%の正答率を出すことに成功した場合、実はそれは必ずしも運用に成功するとは限らない。ここでコストは一旦無視する。
成功する確率を$p$,成功した時の利益を$\mu_+$、失敗した時の損失を$\mu_-$とすると、期待値は$\mu = p\mu_+ - (1-p)\mu_-$となり、$\mu > 0$という条件では、$p > \frac{\mu_-}{\mu_+ + \mu_-}$になる必要がある。ここで$\mu_- = 1$としても一般性は失わないので、$p > \frac{1}{\mu_+ + 1}$となる。ここで、仮に$p = 0.55$であるならば、$\mu_+ > 0.8181...$とならなければならない。
このように、目的に応じて何を見るべきか判断する必要がある。
つまり、「予測ラベルとは、投資戦略である」と私は解釈している。


# ラベリングの応用例
上記の例から派生するが、予測ラベルの正答率50%以上出すだけで良い例はあるのだろうか？
例えば、こういう戦略はどうだろうか？
資産の価格の仲直で取引でき、流動性が抜群である(ジャンプしない)という強い仮定を置く。$T=0$で資産を新規で保有し、仲直が上に+1bpsもしくは、-1bps動いたら、決済する。これは、金融で紹介される最もシンプルな二項モデルである。
この場合であれば、予測ラベルで50%以上は正の期待値を持つことになる。

では、どのようにラベル付をしたら良いだろうか？

データは、板情報(mid)のtickデータとする。

Pythonコードを用いて解説したい。

```python:label.py

labels = df["mid"].diff().shift(-1).replace(0, np.nan).bfill()
labels = labels / abs(labels)

```

- 1bpsの変化なので、diffで見る。
- 次に、$X_{T}$と$X_{T+1}$の差分を見たいので、インデックスを1つ左にずらす。
- 差分が0においては取引をしないので、0をNullにしておく。
- 差分が0でない時に初めて決済するので、停止時刻を$t$とおくと、時刻$T=0$の戦略の収益は$X_t-X_0$となる。
- 最後は、ラベルを2つ(1か-1)にしたいので、符号だけ見る。

# その他
本書では、その他にもTriple Barrier method、Trend-Scanning method等が紹介されていたので、是非参考にしてみてはいかがだろうか？
Docker基礎【イメージ作成、コンテナ実行】

### Dockerイメージとは
Dockerコンテナを作成するためのテンプレートのようなもの。

### Dockerコンテナとは
Dockerイメージを元に作成され、ファイルシステムやアプリケーションが同梱されている箱のようなもの。外から見ると仮想環境のようなもの。

##Dockerイメージを取得→コンテナ実行
gihyodocker/echo:latestというイメージを取得する。イメージは[dockerhub](https://hub.docker.com/)から取得される。

```
$ docker image pull gihyodocker/echo:latest
```
ダウンロード後、以下のコマンドでコンテナを実行

```
$ docker container run -t -p 9000:8080 gihyodocker/echo:latest
2020/05/07 22:40:24 start server
```
9000ポート経由でHTTPリクエストを受けられるようになる。9000は、ホスト側のポート番号で8080がコンテナ側のポート番号になる。
実際にcurlコマンドでアクセスしてみる。

```
$ curl http://localhost:9000/
Hello Docker!!
```
## イメージとコンテナの確認
イメージの確認

```
$ docker image ls
```
コンテナの確認

```
# 実行中のコンテナ
$ docker container ls

# 作成されたコンテナ一覧
$ docker container ls -a
```

### ポート番号省略可能
```
# docker container run -t -p <ホスト側のポート番号>:8080 gihyodocker/echo:latest
$ docker container run -t -p 8080 gihyodocker/echo:latest
2020/05/07 22:48:10 start server
```
ホスト側のポート番号を指定しなかった場合、自動的に空いているポート番号が割り振られる。
割り振られるポート番号の確認方法はdocker container lsコマンドで確認できる。

```
$ docker container ls
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                     NAMES
a9d99aa10b05        gihyodocker/echo:latest   "go run /echo/main.go"   56 seconds ago      Up 55 seconds       0.0.0.0:32769->8080/tcp   naughty_elion
```
上記でポート番号を確認し、再度curlを叩く場合、

```
$ curl http://localhost:32769/
```

### 参考
[Docker/Kubernetes 実践コンテナ開発入門](https://gihyo.jp/book/2018/978-4-297-10033-9)
golang やってみた mainに引数を入れつつ go routineを入れてみた

mainにコマンドライン実行時に引数を与えるには、flagを使う。
何も指定しないと、Stringの配列で取得されるので、数字をとるなら、strconvで型変換が必要だった。
引数に、引数名を指定できるので、その場合は型も指定できる。

go routineで、先に終わったものをselectで取得するようにしてみた。
単純な計算なので、先に始めた方が先に終わるのかな。
go routineの前後を入れ替えると、先に終わるのが変わる。




```
package main                                                                    

import (
    "flag"
    "fmt"
    "strconv"
)

func main() {
    flag.Parse()
    x_arg, _ := strconv.Atoi(flag.Arg(0))
    chan_x := make(chan int)
    chan_y := make(chan int)
    go func() { chan_x <- 4 + 4 }() 
    go func(t int) { chan_y <- t * t }(x_arg)
    var x int 
    var y int 
    select {
    case x = <-chan_x:
        fmt.Println(x)
    case y = <-chan_y:
        fmt.Println(y)
    }   
    return

```
warning: unable to access '/Users/xxx/.config/git/ignore': Permission denied

flutterで作成したアプリをGitHub Pagesに公開しようとしたらタイトルのようなエラーがでた。


こちら：[stackoverflow: Unable to access 'git/attributes'](https://stackoverflow.com/questions/27150926/unable-to-access-git-attributes)を参考に解決することができたのでその記録。

原因は、ファイルの所有権限が何らかの原因によってuserからrootに変更されてしまったことに起因する様子。

まずは、実際にuserからrootに変更されてしまっているかを確認する。

```
$ cd ~/
$ ls -al
```

上記コマンドを打つと、ファイルがズラっと並ぶが、その中で.configファイルのところがrootになっていることに気づく。
<img width="639" alt="スクリーンショット 2020-05-08 7.17.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261020/bb998f7d-9fdd-5541-7fbe-122db84f16fe.png">

そしたら、

```
sudo chown -R $(whoami) .config
```

のコマンドで、.configファイルの所有権限を現在のユーザー名に変更する。

![uploading-0]()

変更できた。

無事アップロード成功。
めでたしめでたし。
Teamsのメンバーをcsvファイルを使って追加・削除を行う

Teamsは便利なんだけど、メンバーの追加・削除がちと面倒。追加する際にいくつかのグループをつかえることは、[【備忘録】Office365の各グループの機能まとめ　その１](https://qiita.com/hisssa0102/items/1a75c39d5d18cb20386a#%E8%A3%9C%E8%B6%B3teams%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)にも書いた。

ただTeamsアプリ(インストール版でもWebでも）メールみたいにセミコロン区切りで複数追加ができない。地道に1つずつ入力→確定→入力→確定としなければならない。
削除も、一括選択はできるけど、ポチポチしてかないといけない。

Office365管理センター・Teams管理センターでも同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/35e2cce1-cf83-c393-097e-7b9462cd5d73.png)

Powershellで一括で追加や削除はできるけど、もっと楽にやる方法ないのかな・・と思ってたんだけど、気が付いたらcsvでのインポート・エクスポートがリリースされてた。

#一括インポート・一括エクスポート
Azure AD管理センターに、「メンバーのインポート」「メンバーの削除」「メンバーのダウンロード」が増ええてるやん・・・。※Azure PortalのAADでも同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/ca4877af-a654-6d2e-e541-98e6dc51c28c.png)


追加は、メンバーのインポートをクリックとcsvファイルをダウンロードできる。そこにUPNを追加して、インポートするだけ。

削除も同じ。メンバーのダウンロードしておいて、削除したいユーザーの一覧用意すれば、あとは同じ。

グループ単位でしか行えないけど、100とか超えるメンバーがいるグループメンテナンスしてよ！とかいうときには便利。

#反映まで時間がかかるかも

ということで大量追加やってみたけど、実は1回トラブってる。

「Office365グループのメンバーには入ってるのに、Teamsのメンバーにいない」

気づいたときは滝汗でした。

- Azure AD の対象グループ・・・・・・・全員入ってる
- M365 管理センター上の対象グループ・・・全員入ってる
- Teams管理センター上の対象グループ・・・全員入ってる
- Teamsアプリのメンバー表示・・・・・・一部しかいない！


大量に追加した場合で発生。PowerShellでも一括インポートでも同じ。数時間待てば反映してました。Teams関連の設定反映に時間かかるわ、というアレの影響だと思われる。


#まとめ
どうしても大量のメンバーがいるチームを作らなきゃいけないとき、この方法は便利。部署ごとのチーム作ってるようなケースとかでは、使えるかも。

Teamsアプリ上で同じことできれば、ユーザーにもこの恩恵を共有できるんだけどな。

#おまけ

メンバーのエクスポートなら、配布リスト、メールが可能なセキュリティグループ、セキュリティグループでも可能。

インポートと削除は、Office365グループとセキュリティグループだけしか使えないようです。


20210228追記
一般ユーザーで一括で追加したい場合はこの方法をお試しください。
Teamsのメンバーを一括登録する（一般ユーザーで）・・・Microsoft 365 グループに追加するアクションを使う方法
https://qiita.com/hisssa0102/items/95bc2d168825213c316f
【Python/Tkinter】スクロール可能なFrameを作成するクラス

## はじめに
Tkinterは，PythonでGUIを作成する際の最も手軽な選択肢となります。ただし，その内容には若干の不満もあります。Frameのスクロールができないというのもその一つです。以下で，スクロール可能なFrameを作成するためのクラスを紹介します。

なお，下記で紹介するクラスは以下のサイトに掲載されいているクラスの一部を変更したものです。大変助かりました：
・Scrollable Frames in Tkinter | The Teclado Blog, https://blog.tecladocode.com/tkinter-scrollable-frames/

##コード全文
TkinterではFrameにScrollbarをつけることができないので，スクロール可能なWidgetであるCanvasをまず生成し，その中にFrameを入れています。そして，Canvasのスクロール可能な範囲にFrameの幅を含めるようにしています。これにより，Canvasがスクロールされた際に内部のFrameも同時にスクロールして見せることができます。

```py
import tkinter as tk
import tkinter.ttk as ttk

class ScrollableFrame(ttk.Frame):
    def __init__(self, container, bar_x = True, bar_y = True):
        super().__init__(container)
        self.canvas = tk.Canvas(self)
        self.scrollable_frame = ttk.Frame(self.canvas)
        self.scrollable_frame.bind(
            "<Configure>",
            lambda e: self.canvas.configure(
                scrollregion=self.canvas.bbox("all")
            )
        )
        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        if bar_y:
            self.scrollbar_y = ttk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
            self.scrollbar_y.pack(side=tk.RIGHT, fill="y")
            self.canvas.configure(yscrollcommand=self.scrollbar_y.set)
        if bar_x:
            self.scrollbar_x = ttk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
            self.scrollbar_x.pack(side=tk.BOTTOM, fill="x")
            self.canvas.configure(xscrollcommand=self.scrollbar_x.set)
        self.canvas.pack(side=tk.LEFT, fill="both", expand=True)
```

## 実際に使ってみる
実際に使ってみると下記のようになります。

```py
root = tk.Tk()

frame = ScrollableFrame(root)

for i in range(50):
    for j in range(50):
        ttk.Entry(frame.scrollable_frame, width=5).grid(row=i, column=j)

frame.pack()
root.mainloop()
```
![2020-05-08_06h56_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293043/afd96b42-4fdb-15d9-3eb9-99fdca7fb6e0.png)



## 使い方
ポイントは2つ，インスタンス生成時とScrollableFrame内へのWidgetの配置です。
### ①インスタンス生成時
スクロール可能なフレームといっても，x軸とy軸の両方が必要な場合は少ないかもしれません。そこで，追加するScrollbarを選べるようにしました。初期値はTrueですので，必要に応じて非表示を選択します。

```py
def __init__(self, container, bar_x = True, bar_y = True):
```

### ②ScrollableFrame内へのWidgetの配置
上で説明したように，Canvas内にFrameを作成しています。したがって，Widgetを配置する際もCanvas内のFrame（scrollable_frame）に配置する必要があります。下記のようにします。

```py
frame = ScrollableFrame(root)
ttk.Label(frame.scrollable_frame, text="sample").pack
```

## 【補足】
今回のクラスは，下記サイトに掲載のクラスを変更したものです。
・Scrollable Frames in Tkinter | The Teclado Blog, https://blog.tecladocode.com/tkinter-scrollable-frames/

変更点は下記の２点です：

- Scrollbarがy軸しか用意されていませんでしたので，y軸とx軸の両方に対応できるように変更を加えました。
- x軸・y軸の表示・非表示を選べた方が便利な場合が多いので，それも選べるようにしました。
Coral Edge TPU、畳込みの演算はすごく速いようなので、比較的重たいモデルで検証する。

#はじめに
『Edge TPU USB Acceleratorの解析 - Operationとモデル構造』
https://qiita.com/iwatake2222/items/c3a63027d44434633922
の記事で、
**Conv層がかなり得意で、Dense層はわりと苦手**のような記事があったので、
様子を確認した。

#結果
Conv層の速さを活かすために、比較的、重たいモデルで処理速度を確認した。

##inception_v3_299_quant_edgetpu.tflite

```
C:\_work1\_win_corel1\edgetpu_runtime\corel\tflite-master\python\examples\classification>python classify_image.py --model inception_v3_299_quant_edgetpu.tflite --labels imagenet_labels.txt --input images/parrot.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
85.8ms
44.3ms
43.8ms
44.4ms
56.0ms
45.1ms
44.8ms
43.7ms
45.0ms
44.4ms
44.0ms
43.9ms
44.0ms
43.8ms
43.2ms ★
-------RESULTS--------
89  macaw: 0.99609

C:\_work1\_win_corel1\edgetpu_runtime\corel\tflite-master\python\examples\classification>
```

inception_v3 の演算量は、
Intelのopenvinoの情報であるが、
https://github.com/opencv/open_model_zoo/blob/master/models/public/index.md
によると、
11.469（GFlops)。TPUの場合は、浮動小数点演算ではないが、そのままGopsと読み替えて、

11.469 * 1000/43.2 →　265 (GOPS)

上記数値は、速いと言えるのではないでしょうか。
（普通のモデルなので、Dense層は当然あるので、それが足を引っ張っている？）

##inception_v4_299_quant_edgetpu.tflite

```
C:\_work1\_win_corel1\edgetpu_runtime\corel\tflite-master\python\examples\classification>python classify_image.py --model inception_v4_299_quant_edgetpu.tflite --labels imagenet_labels.txt --input images/parrot.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
99.2ms
87.7ms
117.4ms
87.7ms
88.4ms
85.2ms
85.2ms
85.0ms　★
85.1ms
85.2ms
85.2ms
85.1ms
85.3ms
85.1ms
85.7ms
-------RESULTS--------
89  macaw: 0.99609

C:\_work1\_win_corel1\edgetpu_runtime\corel\tflite-master\python\examples\classification>

```
inception_v4 の演算量は、
Intelのopenvinoの情報であるが、
https://github.com/opencv/open_model_zoo/blob/master/models/public/index.md
によると、
24.584（GFlops)。
TPUの場合は、浮動小数点演算ではないが、上記をそのままGopsと読み替えて、

24.584 * 1000/85.0 →　289 (GOPS)

上記数値は、速いと言えるのではないでしょうか。
（普通のモデルなので、Dense層は当然あるので、それが足を引っ張っている？）

※この結果は、下記のCoralの提示しているbenchの結果と一致している。。。（たまたま？）
https://coral.ai/docs/edgetpu/benchmarks/

<img width="608" alt="coral_bench1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/dbb28d1b-64bb-4934-bc5e-182feed2f1b0.png">


#まとめ
Coral Edge TPUの演算の速さが、確認できた。**289 (GOPS)**。
コメントなどあれば、お願いします。
【Golang】Print系関数について調べてみた

#【Golang】Print系関数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。
基礎〜応用まで。

```
package main
 
import ( 
	"fmt"
	"os"
)



func main(){
	fmt.Println("表示")
    //標準とfmtライブラリの違い

	//標準
	print("Hello")
	//改行が入る
	println("Hello!")
	
	//fmtライブラリ
	//fmt標準
	fmt.Print("Hello")
	//改行
	fmt.Println("Hello!")

	//Fprint系 書き込み先指定
	//Stdoutは標準出力に指定
	fmt.Fprint(os.Stdout, "Hello")
	fmt.Fprintf(os.Stdout, "Hello")
	fmt.Fprintln(os.Stdout, "Hello")

	//Sprint系 出力ではなくフォーマットした結果を文字列で返す。変数に代入時など
	fmt.Sprint("Hello")
	fmt.Sprintf("Hello")
	fmt.Sprintln("Hello")


	//Println系 各々の文字列は半角スペースで区切られ、文字列の最後に改行を追加して、連結して表示
	fmt.Println("Hello", "world!")
    fmt.Println("Hello", "world!")

	//Printf系 フォーマットを指定
	fmt.Printf("%s\n", "Hello")
	fmt.Printf("%#v\n", "Hello")

	//Errorf  フォーマットされたメッセージを持つエラーを生成する。自分でエラー値を生成したいとき。
}

	
	/*Printfについて

    Goでは書式指定子 %... のことを verb と表記しています。

	すべての型に使えるverb
	論理値(bool)	%t
	符号付き整数(int, int8など)	%d
	符号なし整数(uint, uint8など)	%d
	浮動小数点数(float64など)	%g
	複素数(complex128など)	%g
	文字列(string)	%s
	チャネル(chan)	%p
	ポインタ(pointer)	%p

	%+v  %vと同じだが、構造体の場合にフィールド名を出力する。
	%#v  値のGoの文法での表現を出力する。
	%T   値の型のGoの文法での表現を出力する。
	%%   %そのものを出力したい場合に使う。


	論理値に使えるverb 
	%t trueかfalse

	整数に使えるverb

	%d	10進数で出力する
	%+d	10進数で出力し、正の整数でも符号を付与する
	%(数値)d	10進数で出力し、(数値)で指定した桁数だけ左を半角スペースで埋める
	%-(数値)d	10進数で出力し、(数値)で指定した桁数だけ右を半角スペースで埋める
	%0(数値)d	10進数で出力し、(数値)で指定した桁数だけ左を0で埋める
	%b	2進数で出力する
	%o	8進数で出力する
	%#o	0付き8進数で出力する
	%x	16進数で出力する(a-fは小文字)
	%#x	0x付き16進数で出力する(a-fは小文字)
	%X	16進数で出力する(A-Fは大文字)
	%#X	0x付き16進数で出力する(A-Fは大文字)
	%U	Unicodeコードポイントに対応する文字で出力する


	浮動小数点数・複素数に使えるverb

	%f	実数表現で出力する
	%F	実数表現で出力する(%fと同じ)
	%e	仮数と指数表現で出力する(eは小文字)
	%E	仮数と指数表現で出力する(Eは大文字)
	%g	指数部が大きい場合は%e、それ以外は%fで出力する
	%G	指数部が大きい場合は%E、それ以外は%Fで出力する


	文字列([]byteも同じ)に使えるverb

	%s	そのままの書式で出力する
	%(数値)s	(数値)で指定した桁数だけ左を半角スペースで埋める
	%e	Goの文法上のエスケープをした文字列で出力する(ダブルクォート付与)
	%q	
	%x	16進数表現で出力する(a-fは小文字)
	%X	16進数表現で出力する(A-Fは大文字)

	*/



```
はじめてのFPGAをAmazon購入の格安評価ボード【WINGONEER ALTERA FPGA Cyclonell EP2C5T144】でやる

# はじめてのFPGA ---格安開発---
はじめてQiita投稿します。Qiitaのルール等あまり勝手がわかっていませんが、宜しくお願いします。

## 1. 格安中華ボード(WINGONEER ALTERA FPGA Cyclonell EP2C5T144)をひとまず買う

Amazonで手軽に購入できる中華製のFPGAボード(¥2,000)をひとまず[購入]します。
[購入]:https://www.amazon.co.jp/WINGONEER-ALTERA-FPGA-Cyslonell-EP2C5T144%E6%9C%80%E5%B0%8F%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%AD%A6%E7%BF%92%E3%83%9C%E3%83%BC%E3%83%89%E9%96%8B%E7%99%BA/dp/B0719H7RMB/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=fpga&qid=1588878513&sr=8-8


## 2. 書き込み装置 USB Blaster も一緒に買う
Amazonじゃなくてもよいのですが、Amazonがラクなので[一緒に購入]します。価格は¥1,000くらいです。
[一緒に購入]:https://www.amazon.co.jp/KOZEEY-STK0114003019-%E3%80%90%E3%83%8E%E3%83%BC%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89%E5%93%81%E3%80%91USB-%E3%83%96%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC-%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-CPLD-FPGA-JTAG-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-%E3%82%A2%E3%83%AB%E3%83%86%E3%83%A9/dp/B008D8QSMU/ref=sr_1_19?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=fpga&qid=1588878513&sr=8-19


## 3. 開発環境(Altera社 QuartusⅡ)の導入
Altera社 (現在、Intelに買収済み) のFPGA開発環境 QuartusⅡ をここではWindowsPCに導入します。ググると上位に出てくる [こちらのサイト] が非常に丁寧でわかりやすかったです。このサイトどおりにひと通り行うと、Lチカまで完了することができます。
[こちらのサイト]:https://misoji-engineer.com/archives/fpga-board.html


## 4. 不揮発性メモリ（フラッシュ・メモリ）への書き込み方法
・FPGAは（３．の手順通りに）普通に書き込んだ場合、開発ボードの電源を１回落とすと、設計した回路データが消えてしまいます。それは非常に面倒なので、電源を入れるたびごとに書き込みデータが消失しないよう、フラッシュ・メモリに FPGA 回路データを事前にプログラミングしておく必要があります。

・そうすると、電源投入時に自動でフラッシュ・メモリからFPGAのほうにコンフィグレーションが行われ、FPGA内部の回路データを常に保持することができます。

以下の手順①～⑧が、FPGA の回路データ（コンフィギュレーション・データ）のフラッシュ・メモリへの書き込み手順です。（※この手順では、[このサイト]もとても参考になりますので、それを今回用いる中華製評価ボード専用の設定に書き換える感じで、以下記事を書いていきます。）
[このサイト]:https://www.macnica.co.jp/business/semiconductor/articles/intel/122065/

①ウィンドウ上部のメニューバーから "File" -> "Convert Programming File" を選択。

②下図のようなウィンドウが開くので、"Programming file type" と "Configuration device" と "Mode" を設定する。（"File name"の箇所はディレクトリもファイル名も任意でOK）
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/df47192f-e6f5-395e-185e-250b3fd0e443.png)


③同様のウィンドウの"Input file to convert" の箇所で、"Flash Loader" をクリックしてアクティブにし、"Add Device..."を選択後、デバイス名"CyclonⅡ" の"EP2C5"を選択する。

④同様のウィンドウの"Input file to convert" の箇所で、"SOF Data" をクリックしてアクティブにし、"Add File..."を選択後、自分のファイル(ファイル名.sof)を選択する。（例としてこの図では、ファイル名は"vhdl1.sof"）
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/f8c0d3d4-7048-bb4d-5254-77ad58986acf.png)

⑤そして、"Generate"ボタンをクリックして、専用のファイル(ファイル名.jic)を作成！

⑥メインウィンドウに戻って、上部メニューバーの "Tool" -> "Programmer" を選択し、ウィンドウを開く。 

⑦下図のようなウィンドウで、左の"Add File..." から、先ほど手順⑤で作成したファイル(ファイル名.jic)を選択し読み込む。

![kakikomi3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/0b2c9a0f-39e3-6e19-a8eb-57bcdd54afc7.jpeg)


⑧"Program/Configure"にレ点（チェック）を入れ、左上の"Start"で書き込み開始！！
  Progress=100%で緑色になれば、書き込み成功！！


ためしに一度電源を切って入れてみても、
回路情報が保持されています。
おつかれさまでした!(^^)!

##5. 最後に
※回路図等ボード情報詳細は[ココ]で拾えます
[ココ]:https://www.openimpulse.com/blog/products-page/product-category/ep2c5t144-altera-cyclone-ii-fpga-development-board/
GoでSQL叩く時のライブラリまとめ 2020

#はじめに

標準ライブラリdatabase/sql(https://golang.org/pkg/database/sql/)
以外のGoのSQLライブラリの紹介
##sqlx
https://github.com/jmoiron/sqlx
生のSQLを書く必要があるが、学習コストが少なめ。
構造体へのマッピングと名前付きパラメータに対応している。

##squirrel
https://github.com/Masterminds/squirrel
squirrelはクエリビルダ。
生のSQLを書く必要がなく、SQL構文を書くようにコードをかける。
学習コストもあまり多くはない。主観だが、、

##gorm
https://github.com/jinzhu/gorm
ORMマッパーのgorm
オブジェクト間のリレーションをきちんと解釈してくれる。
goのライブラリの中では最もORMっぽい。
多機能すぎて、学習コストが高いのがたまに傷。

##gorp
https://github.com/go-gorp/gorp
ORMぽいgorp
ExecはAPIがあるが、基本的には生のSQLを書く。

#終わり
- xorm(https://github.com/go-xorm/xorm)
- pop(https://github.com/gobuffalo/pop)

他にもライブラリはありそうなのでまた今度レビューしてみます。
Comic reader ( ubooquity )

## ubooquity

* [linuxserver/ubooquity - Docker Hub](https://hub.docker.com/r/linuxserver/ubooquity/)
* [linuxserver/ubooquity - LinuxServer.io](https://docs.linuxserver.io/images/docker-ubooquity)

```yaml:docker-compose.yml
---
version: "2.1"
services:
  ubooquity:
    image: linuxserver/ubooquity
    container_name: comics
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - MAXMEM=512
    volumes:
      - ./data:/config
      - ./books:/books
      - ./comics:/comics
      - ./raw:/files
    ports:
      - 2202:2202
      - 2203:2203
    restart: unless-stopped
```

* 管理画面 ( port 2203 )
* http://localhost:2203/ubooquity/admin/

![admin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/6659a13e-5a16-3536-f339-0b08a5237619.png)

Scanする

![スクリーンショット_2020-05-08_05-12-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/db334fbd-ecd9-a38f-771f-82f6eafddcb0.png)


* 閲覧画面  ( port 2202 )
* http://localhost:2022/ubooquity/

![client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/27e6750a-7b9a-2e27-61d3-19f837497064.png)


## renameコマンド

```sh
apt install -y rename
```


```sh:rename.sh
rename 's/\.zip$/.cbz/' *zip
rename 's/\.rar$/.cbr/' *rar
```


## 認証

* [Comic reader ( onigoetz/comicsreader ) - Qiita](https://qiita.com/tukiyo3/items/1dad05fb23e5550a7cca)こちらを参照
初心者によるプログラミング学習ログ 309日目

#100日チャレンジの309日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
309日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>309日目　2h<br>・ポートフォリオ作成<br><br>課題とかデザインカンプからのサイト模写とかできなかった・・・<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1258487141530664960?ref_src=twsrc%5Etfw">May 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
範囲のセルを数える

#IF関数で〇〇以上、△△以下

例：C列が空欄で5以上、10未満
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/837a2035-a5fd-e9b4-e6c1-381914183e57.png)
GoでDBのトランザクション処理を書いてみた

今回は、Goでトランザクション処理を書いてみます。

```go

import (
    "database/sql"
    "log"
)

func withTransaction(ctx context.Context, db *sql.DB, txFunc func(*sql.Tx) error) error {
	tx, err := db.BeginTx(ctx, nil)
	if err != nil {
		log.Println(err.Error())
		return err
	}
	defer func() {
		if p := recover(); p != nil {
			tx.Rollback()
			panic(p) // re-throw panic after Rollback
		} else if err != nil {
			log.Println(err)
			tx.Rollback()
		} else {
			err = tx.Commit()
		}
	}()
	err = txFunc(tx)
	return err
}
```

第３引数には、第１引数に*sql.Txが入り、error型が返り値の無名関数が入ります。
実際の使われ方をみた方が早いので以下を参考にしてください。
GoのクエリビルダSquirrelを使用しています。

```go
type userRepository struct {
	DBClient *sql.DB
}

func (r *userRepository) CreateUser(ctx context.Context, userID string) error {
    query := sq.Insert(usersTable).
          SetMap(sq.Eq{
             "id":          userID,
          })
    return withTransaction(ctx, r.DBClient, func(tx *sql.Tx) error {
		if _, err := query.RunWith(tx).ExecContext(ctx); err != nil {
    	    log.Println(err)
            return err
         }
        return nil
      }
```

txFuncでエラーやpanicが発生したらdefer funcの中でtx.Rollbackが呼ばれ、dbの内容の修正が取り消され、正常終了した場合はtx.Commitがされます。
jetson nanoでopenvslam

#導入
・jetson nanoとは
謎の半導体メーカーnvidiaが出しているAIに強いシングルボードコンピュータ。
強強なraspiのようなもの。

・openvslamとは
ARやVRのコア技術であるトラッキングをカメラの画像解析から行う技術。
開発者は産総研。全天球カメラ使える。

##インストール
※用意に時間がかかります。OSのダウンロードとイメージ焼き位は先にやっておくことをお勧めします。
※TX2やXavierと違ってマイクロSDカードにOSを焼きます。raspiとかと同じ感じ。
###用意
・マイクロSDカード（32G以上を推奨）
・マイクロカードライター（うちのPCについてなかった）
・冷却用のファン（専用品がいいけど、最悪usbファン貼り付けて何とかなる）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">jetson nanoにnoctuaのファン取り付けた。<br>M3だと入らなくてM2.5か2.6なら行けたらしい。<br>3mmのタッピングで止めた。<br>制御はこれから持ってくる。 <a href="https://t.co/pFkEN0v3ed">pic.twitter.com/pFkEN0v3ed</a></p>&mdash; 光輝@ ホログラマー (@koukiwf) <a href="https://twitter.com/koukiwf/status/1258701248208842753?ref_src=twsrc%5Etfw">May 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

###OSの用意
・Download the Jetson Nano Developer Kit SD Card image.（4.3）
・SDカードにイメージを焼く（1 failで焼き直した）
・jetpack(ubuntu18.04だった)起動

##openvslamビルド
[Installation](https://openvslam.readthedocs.io/en/master/installation.html)公式ドキュメントに従うだけ。
※socketviewer側でやりました。
以下ちょっと躓いた点。
・E: ロック /var/lib/apt/lists/lock が取得できませんでした
→gitセットアップを忘れてただけ
・ビルド中に熱で落ちてファンを注文
→待っていられずusbファン買って付けた
・openvslamのビルド中に止まる
→スワップ6G追加したけどそれでも若干怪しかった

##おまけ
ThetaSで動画撮ってチュートリアルに放り込むだけで楽しい

##後日談
wifiついてないのでtp-linkのTL-WN725Nっていうwifiドングルがいいです。
M.2はストレージに残しておきたかったので。
指すだけで認識される。
wdc-300SU2S(Linux非対応)も買ってドライバ頑張ったけどダメだった。