OmniAICreator/Qiita-1.07M huggingface dataset:
【UE4】同期的なアセットのロード方法とデメリット

# 最初に

この記事はBPを用いたアセットをロードしてSpawnするところまで記事にしたものとなります。間違いや更に良い方法があった場合にはそっとTwitter( [@ろっさむ](https://twitter.com/4_mio_11) )やコメント、修正リクエストなどでお知らせ頂けるととても有難いです。 

# 作業環境

記事内で使用する作業環境は以下の通りとなります。

- Unreal Engine：4.23.1
- Visual Studio：Community 2017 or Community 2017 for Mac or Enterprise 2019



# 前提として知っておきたいデメリット

まず、同期的なロードを扱うと、ロード処理中はメインスレッドを占有してしまうため、プレイヤーから見るとUIも処理も止まってゲーム画面がフリーズしているように見えたりかくついて見えます。



そのため、ミニマムなアセットロードを行う処理であれば問題ありませんが、重いアセットのロードを一気に行うとユーザー体験を損ねる可能性があるので注意が必要です。この場合は非同期なロードを行う必要があります。

# 実装方法

## ①LoadObjectを使用する

`LoadObject`を用いた場合、中身的には`ConstructorHelpers::FObjectFinder`と同等です（実際`FObjectFinder`では`LoadObject`を用いてロードしてます）。

文字列を直接書き込んで参照することができますが、クック時に読み込まれないことがあります。その場合Asset Managerが有効となります。



```c++
void ACPP_StartGameMode::BeginPlay()
{
	Super::BeginPlay();

	FVector EnemyPosition = FVector(100, 1424.302734, 91.790405);

    // BPをc++から呼び出す際は末尾に_cをつける
    // マテリアルなどの場合であれば_cは不必要
	UClass* EnemyCharacterBP = LoadObject<UClass>(this, TEXT("Class'/Game/MyEnemy/Enemy_Meca.Enemy_Meca_c'"));
	if (EnemyCharacterBP)
	{
		AActor* EnemyCharacter = GetWorld()->SpawnActor<AActor>(EnemyCharacterBP, EnemyPosition, FRotator::ZeroRotator);
	}
}
```



## ②LoadSynchronousを使用する

ここでは`FSoftObjectPath`でアセットの文字列を指します。`LoadSynchronous`で実際のアセットロードを行います。こちらはパスを変数にして扱いやすいかと思われます。

```c++
void ACPP_StartGameMode::BeginPlay()
{
	Super::BeginPlay();

	EnemyCharacterPath = "/Game/Developers/mio/Contents/MyEnemy/Enemy_Meca.Enemy_Meca_c";
	FVector EnemyPosition = FVector(100, 1424.302734, 91.790405);

	TSubclassOf<class AActor> EnemyCharacterBP = TSoftClassPtr<AActor>(FSoftObjectPath(*EnemyCharacterPath)).LoadSynchronous(); 
	if (EnemyCharacterBP)
	{
		AActor* EnemyCharacter = GetWorld()->SpawnActor<AActor>(EnemyCharacterBP, EnemyPosition, FRotator::ZeroRotator);
	}
}
```



# 参考

- [アセットの非同期ロード（公式）]( https://docs.unrealengine.com/ja/Programming/Assets/AsyncLoading/index.html )
- [UE4のためのより良いゲーム設計を理解しよう！]( https://www.slideshare.net/masahikonakamura50/ue4-137809570 )
- [猫でも分かる UE4の新しいサンプル「Action RPG」について]( https://www.slideshare.net/EpicGamesJapan/ue4action-rpg )
- [[UE4] C++で動的にアクターを生成（スポーン）する方法で一番実用的だった方法]( https://qiita.com/Kuroyanagi96/items/7849dfaed83fc8df5741 )
Linux mint 19.2にdockerをインストールするときにはまったこと

# Linux mintにdockerをインストールする

dockerについて少し勉強したいと思ったので、VM上のLinux mintにdockerをインストールする

# 環境
- OS：Linux mint 19.2
- VM：Oracle VM VirtualBox 6.0.14 

https://docs.docker.com/install/linux/docker-ce/ubuntu/

上記リンクを参考に手順通り行っていく。


# １．apt-get update

```sh
$ sudo apt-get update
```

# ２．必要なソフトのインストール

```sh
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
```

# ３．dockerのGPG公開鍵を追加

```sh
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

```

上記を実行後、以下のコマンドで確認をする

```sh
$ sudo apt-key fingerprint 0EBFCD88
    
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
```

ここまでは、とても順調に進んでいた。

# ４．リポジトリの設定

ここから問題がおきる・・・

```sh
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

```

`Malformed input, repository not added.`というエラーが表示されてしまった。
参考サイトを見ると注意書きがあった。

> 注：以下のlsb_release -csサブコマンドは、Ubuntuディストリビューションの名前（など）を返しますxenial。Linux Mintなどのディストリビューションで$(lsb_release -cs) は、親のUbuntuディストリビューションに変更する必要がある場合があります。たとえば、を使用している場合 Linux Mint Tessa、を使用できますbionic。Dockerは、テストされていない、サポートされていないUbuntuディストリビューションについては保証しません。（翻訳）

Ubuntuでは上記のコマンドで大丈夫みたいだが、Linux mintだとエラーが起きてしまうみたい。
調べてみると、全く同じことで困っているひとがいた。

https://stackoverflow.com/questions/57402923/docker-installation-on-linux-mint-19-2-doesnt-work

上記の回答を実際にやってみた。

```sh
sudo vim /etc/apt/sources.list.d/additional-repositories.list
```

`deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable`

上記を記入してファイルを保存して終了。

```Sh
$ sudo apt-get update
```

これでdockerをインストールすることが出来るようになる。

質問していた方、回答していた方本当に助かりました！！！

# ５．dockerのインストール

```sh
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

インストール後、dockerのバージョンを確認する。

```sh
$ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea838
 Built:             Wed Nov 13 07:29:52 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied

```

デフォルトではrootユーザーのみdocekrコマンド使用可能なためdockerグループにユーザーを追加するのを忘れないように・・・

```Sh
$ sudo gpasswd -a USER_NAME docker
```

これでようやくdockerを使うことが出来ます。
more_like_thisを使った検索

# 検索Query
```query
{
    "query": {
        "more_like_this" : {
            "fields" : ["title", "photos.description"],
            "like" : "ライダー",
            "min_term_freq" : 1,
            "max_query_terms" : 12
        }
    }
}
```

前の資料にはidsというパラメータがあったようですが、最新のドキュメント見たらなかったので、その辺りの仕様が変わったのでしょうかね。

# テストデータ
```
 76       let(:album1) { create(:album, title: '映画仮面ライダーとホゲホゲ星人の戦い', user: user) }
 77       let(:photo1_1) { create(:photo, description: 'ホゲホゲ星人との場面1です。これは仮面ライダーがXXしているところです',
 78                               album: album1, user: user) }
 79       let(:photo1_2) { create(:photo, description: 'ホゲホゲ星人との場面2',
 80                                album: album1, user: user) }
 81       let(:album2) { create(:album, title: 'ターミネータVS仮面ライダー', user: user) }
 82       let(:album3) { create(:album, title: '鉄仮面のライダー', user: user) }
 83       let(:album4) { create(:album, title: 'ライダーが仮面を被ったら', user: user) }
 84       let(:album5) { create(:album, title: '仮面を被ったライダーの写真', user: user) }
 85       let(:photo5_1) { create(:photo, description: 'ライダーの写真',
 86                               album: album5, user: user) }
 87       let(:album6) { create(:album, title: 'ライダーの写真集', user: user) }
 88       let(:photo6_1) { create(:photo, description: '仮面をつけたライダーも写ってます',
 89                               album: album6, user: user) }
 90
```

# 結果
keywordを「ライダー」で検索した場合
```
鉄仮面のライダー: 0.6458774
ライダーが仮面を被ったら: 0.6458774
ライダーの写真集: 0.6458774
仮面を被ったライダーの写真: 0.5764006
映画仮面ライダーとホゲホゲ星人の戦い: 0.43577272
```
初学者こそブログを書くべきであると思った話

僕は気がついてしまった。

なぜこの１ヶ月ブログを書かなかったのであろうと。

###アウトプット→インプット
僕はブログを書いている。
主な媒体はnoteとかワードプレスとか。
ワードプレスのメディアでは月平均にして大体1万pvくらい。

で、ブログをしている人ならわかると思うが、「ネタ」が大事である。
アドセンスに通す為に、約２ヶ月は毎日ブログを書いた。

おかげ様で１ヶ月で１発合格でアドセンスに通ったのであった。

ここで大事だと感じることはインプットは前段階で必要なのはアウトプットであると言うこと。

なんでもいい。まずは書く！
で、書くと必要なことが出てくる。

この前、プロパティとメゾットについての記事を書いたけど、これらを説明する上で、Classについての記事も書けることになった訳だ。

ネタがないなら、先に書くべき。
書いて分からないことが出てくるから、それがインプットになる。

##ブログは自分の教科書
読み返せば、「俺はなんて下手な文章を書くのであろう」と思う。

けど、それでいい。

<b>だって最初はほとんど見られないんだから。</b>

そりゃあ、発信する媒体とかで変わったり、人気記事になれば読まれるけど、まずは自分の教科書のノートだと思ったほうがいい。

復讐になる。

そう、単なる自己満足でいいのだ笑。

###初学者はコードもブログ化するべきだと気が付く
Qiitaを書くのって結構面倒臭い。
そもそもコードが分からない。それなのにブログを書くのはハードルが高い。
しかも、他のサイトとは違ってマークアップ方式だし、コードを書くしで面倒臭い。

そこで僕は思いついた。

「コードをブログにすればいい」と。

は？と思われると思うが、ありがたいことにコードを書く際に「コメント」という機能がある。

僕はこの機能を使い、コードの大半をコメントすることに決めた。

いちいち、コメントを書くのには手間がかかるが、言葉にの意味や書き方を復讐できる。

わかった部分は抜粋してブログにすればいいことに気がついた。

これで一石三石。

自分の復習になる、相手にも読まれる、ブログが書ける！！

マジで未経験の人たちよ。
共に頑張ろうぜ。
gitlab-runnerでキャッシュが消されてしまう（ような気がした）

## やろうとしたこと
gitlab-runnerで、毎回`composer install`をする無駄なインターネットトラフィックが許せなかったので、ジョブとかパイプラインをまたいで永続的にキャッシュしたかった。
`composer update`のタイミングでキャッシュを消せば良いので、永続化しても問題はなさそう。

### 環境
オンプレサーバのdocker-composeで、`gitlab/gitlab-ce:latest`と`gitlab/gitlab-runner:latest`を走らせている。

## ハマりポイント
とりあえずCI/CDがちゃんと動くか試すか～と思って、実装途中のリポジトリでまだ失敗する状態で書いて試した（`phpunit.xml`をまだ作ってない。）。

```
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/repository/.git/
From http://sealed.example.com
 * [new ref]         refs/pipelines/31 -> refs/pipelines/31
   fd6b04b..138134d  master            -> origin/master
Checking out 138134d2 as master...
Removing composer.phar
Removing vendor/

Skipping Git submodules setup
Checking cache for cache-composer...
No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 
Successfully extracted cache
$ curl -sS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar > composer.phar
$ php composer.phar -qn --prefer-dist install
$ vendor/bin/phpunit --configuration phpunit.xml
Could not read "phpunit.xml".
ERROR: Job failed: exit code 1
```

すると、キャッシュされるはずの`vendor/`と`composer.phar`が`Removing`されてしまっている？？？？

## 勘違いポイント
3時間ぐらいネットの海をさまよっていると、[同じような出力が載っているissue](https://gitlab.com/gitlab-org/gitlab-runner/issues/4154)があった。悩みポイントは自分のと違うっぽかったけど、`git clean`という文字列で気が付いてしまった。

## 原因
この`Removing`は`git clean`が追跡対象外のファイルを消しているだけで、gitlab-runnerのキャッシュとは全く関係が無い。
テスト成功時のログを見てもわかるように、**キャッシュが行われるタイミングはテストが成功した後**なので、テストが失敗している限りキャッシュは行われない。

```
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/repository/.git/
From http://sealed.example.com
 * [new ref]         refs/pipelines/31 -> refs/pipelines/31
   fd6b04b..138134d  master            -> origin/master
Checking out 138134d2 as master...
Removing composer.phar
Removing vendor/

Skipping Git submodules setup
Checking cache for cache-composer...
No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 
Successfully extracted cache
$ curl -sS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar > composer.phar
$ php composer.phar -qn --prefer-dist install
$ php -v
PHP 7.2.24 (cli) (built: Oct 25 2019 05:17:56) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.8.0, Copyright (c) 2002-2019, by Derick Rethans
Creating cache cache-composer...
vendor/: found 5081 matching files                 
composer.phar: found 1 matching files              
untracked: found 4278 files                        
No URL provided, cache will be not uploaded to shared cache server. Cache will be stored only locally. 
Created cache
Job succeeded
```

生意気にもナウでヤングなCI/CD環境！とか調子に乗ってた罰ですかね、大人しく手動でテストして画面のハードコピーを証憑.xlsに貼る作業に戻ります……
社内ISUCONがすごい楽しかった話

# 前提
- 社内でISUCONが行われました。
- 弊社に関わりのある人が作問を行い、弊社のエンジニアと数名の学生が参加しました。
- 本家のISUCONと比較すると、だいぶ簡単？になっていたようです。
    - 競技時間は4時間。
    - アプリケーションの速度改善だけではなく、バグを修正するとスコアが上がるという本家ISUCONにはない要素がある。
    - 参考実装はRuby(sinatra/unicorn)のみ。
    - ミドルウェアはNginx/MySQLを使用。
    - AWS EC2を1台が競技用のインスタンスとして渡される。

# どうしてこの記事を書いたのか
- 全然スコアは伸びなかったし、よく分からないところで躓いてしまい、競技時間の半分ぐらい？を無駄に使ってしまったが、とても楽しかった。
- もっと社内ISUCONをやる会社が増えればいいのにと思った。
- だったら、社内ISUCONの楽しさを広めよう！と思って、この記事を書いている。

# 実際にどうだったのか
## 私たちの背景
この記事を書いている人は主に以下の知識や経験があります。

- Ruby/Rails(業務経験あり)
- ネットクワーク/HTTP(ちょっと)
- sinatra(ちょっと)
- MySQL(ちょっと)
- Nginx(ちょっと)
- JS/TS/React(業務経験あり)


当日にチームを組んだ相方は以下のような知識や経験があります(たぶん)。

- Android(業務経験あり)
- Ruby/Rails(業務経験あり)
- JS/TS/React(業務経験あり)


だいぶアプリケーションに寄っている知識や経験を持った人がチームを組んでいました。

## 私たちの結果

- 順位は3位でした。ただ、再起動試験で失敗したチームもあり、それらを含めると、5位ぐらいでした(10チームぐらい参加)。
- いくつかのアプリケーションのバグを修正し、ちょっとだけスコアが伸ばせました。

## 辛かった/悔しかったこと
- もっとスコアを出せたなぁと思いました。
    - Nginxの王道な設定については「たくさんISUCON解説記事を読んでたくさん書いてあったやん、、、。」
    - Unicornの王道な設定については「ああああ！確かにUnicornプロセスがやたら少ないやん！それって設定で増やせるんか、、、、。知らなかった、、、、。あああああああ！悔しいィィィィィィ！！！！」

みたいなことや

「ん？？？なんかNginxが502を返してくるぞ？？どうしてだ？？」
~1.5時間経過~
「なんかプロセス再起動したら治った、、、、、。なんで、、、、。泣きそう。」

みたいなことがあり、自分の力量不足をとてもとても感じました。本当に泣きそうでした。

## 楽しかったこと
- アプリケーションのバグを修正した時にスコアが少しだけど上がったこと。
- [一人インフラ研修](https://qiita.com/koheiyamaguchi0203/items/c10abd0000583c5e7c04)でRaspberry Piでsshして作業するときの経験が活きたこと。

## 参加したメリット
- すごい悔しかった。これから勉強して、強くなろうと改めて思った。
- すごい楽しかった。これから技術を学ぶ意欲が改めて湧いた。
- 本家ISUCONに参加したい気持ちが湧いた(するとは言ってない)。
- 他のエンジニアと技術の話で盛り上がれた。
- 普段の業務では意識することのない技術を触るきっかけになった。

# 終わりに
組織によると思うのですが、やったメリットはあれど、デメリットは特にないように思います。
もちろん、その時間は業務時間なので、業務との兼ね合いが大事ですが、組織の技術力の向上の機会としては素晴らしい場でしたし、これをきっかけにみんなより学習に励むのでは(少なくとも私は)と思います。
ruby で書くバッチ処理のパフォーマンスチューニング

## 概要
数万件のデータパッチをrakeタスクで行い、当初12時間かかっていた処理が、チューニング後２時間に短縮し、パフォーマンスの重大さを身をもって感じたので備忘録的にまとめたいと思います🏃‍♀️🏃‍♀️🏃‍♀️

### 前提
- バッチサーバースペック
メモリ20GB CPU 4コア
- rails5系

## destroy_allは遅い🚶‍♀️
12時間かかってしまった原因が主にここでした。
当初データ一件ずつに対して複数の関連データを`destroy_all`で行なっていたものを
`delete_all`にしたところ７時間もの短縮となりました🏃‍♀️
関連付けのコールバックも呼ばれる`destroy_all`は大量データを処理する時は要注意です
## activerecord-importを利用したBULK INSERT
大量データをinsertする時はBULK INSERTするかと思います。
カラム名を配列で指定し、同じ順序でvalueを格納した配列を含む配列をimportするのが最速らしい🏃‍♀️
https://github.com/zdennis/activerecord-import#columns-and-arrays
**before**

```ruby
users = []
target_users.each do |u|
    users <<  Result.new(user_id: u.id,  email: u.email)
end
ForX::UserAppMigrationResult.import users
```

**after**

```ruby
target_users =  [[1, 'test@test.com'], [2, 'test@test.com']]
columns = [:user_id,  :email]
Result.import columns, target_users
```
## 脱N + 1
大量のSQLを発行してしまうやってしまいがちな問題。
今回改めて違いを理解したのでざっくりな理解をメモしておく。
`eager_load`　 left_outer_joinしてassociationをキャッシュする
 `joins`　 inner_joinsのみ。associationをキャッシュしない
`preload` 　指定したassociationを複数のクエリに分けて引いてキャッシュする。
`include`　eager_loadとpreloadをいい感じに使い分けている

※（余談）eager_loadで異なるDBでJOINして詰まった時のメモ。
異なるDBのモデル間で`eager_load`を利用したらそんなテーブルないよと怒られました。

```ruby
User.eager_load(:memos)
#=> Mysql2::Error: Table 'memos' doesn't exist
```

mysqlでは`DB名.テーブル名`とDB名を明示してあげれば異なるDB感でもjoinできるので、
`eager_load`や`joins`を利用するときもモデルにDB名を明示すればOKでした。

```ruby
class Memo
  self.table_name = "xxx.memos"  # xxxはdb名
  belongs_to :user
end
```

## マルチプロセス化
rubyで簡単に並列処理を実装できる[parallel](https://github.com/grosser/parallel)を利用しました。

## おわりに
大量データを処理するバッチを書くのは初めてだったので、パフォーマンスを意識する良いきっかけとなりました！
## 参照
https://qiita.com/begaborn/items/95e8d6839dad25584bc8
https://qiita.com/nikadon/items/9e6431f5a7b2b8798113#destroy_all-vs-delete_all
vlookup的なことをbash上でノンプラグラミングで行いたい

# 目的
vlookup的なことをbash上でノンプラグラミングで行いたい。

# 比較するファイル
次の2つのファイルを比較したい
id_list.txt
id_list_new.txt

```id_list.txt
ID,NAME,STATUS,WEIGHT
1001,taro,enable,81
1002,jiro,disable,65
1004,hanako,enable,46
1005,makoto,enable,50
1006,ichiro,enable,72
1007,satoru,disable,78
```

```id_list_new.txt
ID,NAME,STATUS,WEIGHT
1001,taro,enable,81
1002,jiro,disable,65
1004,hanako,disble,46
1005,makoto,enable,49
1006,ichiro,enable,72
1007,satoru,disable,78
1008,fujiko,enable,46
```

# 使用するツール
１）catコマンド
　文字列を連結する
２）echoコマンド
　文字列を出力する
３）joinコマンド
　文字列を連結する
４）commコマンド
　文字列を比較し、差分を出力する
５）sortコマンド
　文字列を並び替える
と　
リダイレクト | 
名前付きパイプ <()

# VLOOKUP的なコマンド
できる限りワンライナーで。

```vlookup.sh
#!/bin/bash

a="id_list.txt"
b="id_list_new_txt"

cat <(echo "ID,NAME,STATUS,WEIGHT,,,")\  
 <(join -t, -j 1 <(comm -13 <(sort ${a}) <(sort ${b})) <(sort ${a}))\
 <(join -t, -j 1 <(comm -13 <(sort ${a}) <( sort ${b})) <(sort ${a}) -v 1)
```

# 出力結果
IDをキーとし、最新のデータを左に、変更前のデータを右に並べる。

```
ID,NAME,STATUS,WEIGHT,,,
1004,hanako,disble,46,hanako,enable,46
1005,makoto,enable,49,makoto,enable,50
1008,fujiko,enable,46
```
【Unity】 Oculus Quest のバッテリー情報を取得する

## Oculus Quest でバッテリー残量を取得する方法
### 実装例

``` C#
    float hmd = SystemInfo.batteryLevel;
    byte left = OVRInput.GetControllerBatteryPercentRemaining(OVRInput.Controller.LTouch);
    byte right = OVRInput.GetControllerBatteryPercentRemaining(OVRInput.Controller.RTouch);
    Debug.LogFormat("Battery: HMD = {0}%, Left Controller = {1}%, Right Controller = {2}%", 
        (int)(hmd * 100), left, right);
```

### HMDのバッテリー残量
- [SystemInfo.batteryLevel](https://docs.unity3d.com/ja/2017.4/ScriptReference/SystemInfo-batteryLevel.html) で0~1のfloat値で取得できる  
また、SystemInfo.batteryStatus を使えば、[バッテリーの充電状況を取得できる](http://baba-s.hatenablog.com/entry/2018/12/26/085000)


### コントローラのバッテリー残量
- [OVRInput.GetControllerBatteryPercentRemaining](https://developer.oculus.com/reference/unity/1.43/class_o_v_r_input#abed7e5330bf1ef803f06728c48e2aa14) で取得できる  
引数にコントローラ種別を渡せば、バッテリー残量がパーセンテージ数値(0~100)で返ってくる。  
**※ SystemInfo.batteryLevelのように0~1のfloat値ではないことに注意**




## 参考
- [SystemInfo-batteryLevel - Unity スクリプトリファレンス](https://docs.unity3d.com/ScriptReference/SystemInfo-batteryLevel.html)
- [Unity 1.43 Reference Guide - Oculus](https://developer.oculus.com/reference/unity/1.43/class_o_v_r_input)
- [【Unity】iOS / Android でバッテリーの状態を確認できる「SystemInfo.batteryLevel」「SystemInfo.batteryStatus」](http://baba-s.hatenablog.com/entry/2018/12/26/085000)
git for windowsでcore.editorをMeryにする方法

## Mery、べんりぃ
最近のWindowsのテキストエディタを調べていて、Meryというよさげなエディタを知りました。
Meryで文章を書いて、そのままgit for windowsでcore.editorをMeryにしたい！と思い、設定を調べましたところ、

https://www.haijin-boys.com/discussions/2818

にて、/spというオプションで既にMeryを起動していても、別のシングルプロセスでMeryを起動できることを知りました。
なので、git bashで次のコマンドを打ってMeryをcore.editorに設定しました。

```sh
$ git config --global core.editor "'path/to/Mery.exe' //sp"
```

/spオプションを指定するときに//spというようにエスケープしてあげるのが肝です。そうしないと/にあるspというファイルを編集する、なんていう解釈をされてしまうので。
UIColor から CIColor に変換するときの注意

# 前提

UIColor から CIColor にする方法は2種類あります

```swift
# 変数 color は UIColor のインスタンスとする

# initializer
CIColor(color: color)

# property
color.ciColor
```

# 注意

`color.ciColor` で取得する時、 `color` が Core Image でイニシャライズされたものでない (= `CIColor` で作成されてない) 場合は例外を返されます。
公式ドキュメントにはかいてありますが、抜け穴だと思います。

> This property throws an exception if the color object was not initialized with a Core Image color.

# 結論

基本的に `CIColor(color:)` の方を使っておけば問題ない。

# 環境

- Swift 5

# 参考

- https://stackoverflow.com/a/42287529
- https://developer.apple.com/documentation/coreimage/cicolor/1528762-init
- https://developer.apple.com/documentation/uikit/uicolor/1621951-cicolor
Ionic v4 の Ionic CLI で yarn を使う

ぶっちゃけこのツイートそのままなのですが、ググっても引っかからないし昔の書き方が出てくるのでここに記す
https://twitter.com/rdlabo/status/1143131462691987456

以前のやり方はこちら

```ionic(〜v3?).
ionic config set -g yarn true
```

Ionic v4以降？ではこちら

```ionic(v4).
ionic config set -g npmClient yarn
```
ローカルのプロジェクトにのみ有効にするには -g オプションを外すこと

これでionic cliがyarnを使います。めでたしめでたし。
<?= ?>で変数を囲んで展開させる表示について教えてください。


仮に、

```
<?php
$PL101="hello!";
?>
<form>
<?= $PL101 ?><BR>
</form>
```

とすれば、

hello!
--------------------
と表示されると思います。


今、

```
$PL101="hello!";

$PL102="$PL101";  // <- ここの書き方を何かしら工夫するものとしてください。
```

となっているとして、直に$PL101は参照できないものとしてください。
そのような前提で、

```
<form>
<?= $PL102 ?><BR>
</form>
```

というように$PL101を参照せずに、

hello!
--------------------
と表示させたいのですが、無理でしょうか?

もう少し具体的に言うと、

予め帳票のレイアウトのデータとして

```
$PL102="$PL101";
<form>
<?= $PL102 ?>　様<BR>
</form>
```
と書いてあります。
このレイアウトのデータをテンプレートにして、印刷したいときに

$PL101="やまだたかお";

というように代入し、

やまだたかお　様
----------------------

と表示させたいのです。そういう展開方法があればベストですが、一工夫すれば同じことできるんじゃないかなと思っているところです。
Blenderのソケットの色についてまとめてみた

##Blenderのソケットの色について知らなかったのでまとめてみました。


- **灰色**は単一の値です。
- **黄色**は3つの値を含むタプル(組)です。色の場合は赤、緑、青のチャンネルに分解できます。透明度が指定できるます。
- **紫**も3つの値を含むタプル。ベクトル/座標情報に使用される。透明度の指定はありません。
- **緑**はシェーダークロージャーで、光がサーフェスまたはボリュームとどのように相互作用するかを表す。他の緑色のソケットにのみ接続できます。

## 異なる色のソケットへの接続

- 黄色と紫は、情報を失うことなく相互に接続可能
- 灰色は、情報を失うことなく黄色または紫色に接続可能（タプル内の3つの値はすべて同じ値に。透明度以外)
- 黄色と紫は灰色に接続できますが、単一のグレースケールに変換されてしまいます。

<img width="952" alt="_2019-11-17_22.58.34.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/4acfbed9-8cd4-0038-5626-f14041591ca0.jpeg">
【AWS EC2 SSH エラー】SSHでインスタンスにそれまで接続できていたのに突然 port 22 Operation timed out となった時に、1つの原因として考えられること

## はじめに

SSHで、それまで接続できていたはずのインスタンス（EC2）に再度繋ごうとしたところ、

```
ssh: connect to host xx.xxx.xxx.xxx port 22: Operation timed out
```

おぉ…なんてこった……

このような状況に陥ったとき、1つの原因として考えられることについて述べます。

## マイIPが変わったのでは？

作成したインスタンスに関連するセキュリティーグループ（インバウンド）に設定されている、SSHのソースの部分を確認してみてください。

<img width="1440" alt="スクリーンショット 2019-12-13 23.48.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210847/3632f579-18f1-6468-12a0-5412a747228a.png">

タイプ「SSH」のソースが「カスタム」になっていると思います。
このソースの「カスタム」となっているドロップダウンリストをクリックして、「マイIP」に変更してください。
すると、一瞬
ロード中…
と表示された後、
先ほどクリックしたドロップダウンリストの右側に表示されていたIPアドレスが変更されたと思います。

そして、もう一度SSHでインスタンスに接続してみてください。

```
   __|  __|_  )
    _|  (     /   
  ___|\___|___|
```

いえーい。

もし、上記の一連の流れが再現された場合、その原因は下記ではないでしょうか。

## 再度SSHした時にインスタンスに繋げなかった原因

インスタンスのセキュリティグループを設定するときに、SSHのソース（送信元）に「マイIP」（設定したときに操作していたパソコンのパブリックIPアドレス）を選択していたと思います。
この「マイIP」は、つまりパソコンのパブリックIPアドレスは、永久に一定というわけではなく、変わる可能性があるのです。
よって、以前SSHで接続できた時と、再度SSHで接続しようとしてできなかった時とでは、その時々のパソコンのパブリックIPアドレスは変わっていたのでしょう。

## 参考
[Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443)
Oracle Databaseのround()の話

この記事は [PostgreSQLのround()の話](https://qiita.com/fujii_masao/items/c79575fb57827f658063) に触発されて、Oracle Databaseでも同様の調査を行った結果です。

# ROUND 関数による丸め

Oracle Database の ROUND 関数は他のデータベースと同様に数値を丸めるために使われます。しかし、データ型によって整数に丸めた場合の結果が変化します。NUMBER 型とBINARY_DOUBLE 型の列に値を格納して結果を確認します。

```
SQL> CREATE TABLE rd_table(c1 NUMBER(3, 1), c2 BINARY_DOUBLE);
Table created.

SQL> INSERT INTO rd_table VALUES (2.1, 2.1);
1 row created.

SQL> INSERT INTO rd_table VALUES (2.2, 2.2);
1 row created.

...

SQL> INSERT INTO rd_table VALUES (2.9, 2.9);
1 row created.

SQL> INSERT INTO rd_table VALUES (3.0, 3.0);
1 row created.

SQL> COMMIT
Commit complete.
```

整数値に変換するために、ROUND 関数を実行します。

```
SQL> SELECT c1, ROUND(c1), c2, ROUND(c2) FROM rd_table ORDER BY c1;

        C1  ROUND(C1)         C2  ROUND(C2)
---------- ---------- ---------- ----------
       2.1          2   2.1E+000   2.0E+000
       2.2          2   2.2E+000   2.0E+000
       2.3          2   2.3E+000   2.0E+000
       2.4          2   2.4E+000   2.0E+000
       2.5          3   2.5E+000   2.0E+000
       2.6          3   2.6E+000   3.0E+000
       2.7          3   2.7E+000   3.0E+000
       2.8          3   2.8E+000   3.0E+000
       2.9          3   2.9E+000   3.0E+000
         3          3   3.0E+000   3.0E+000

10 rows selected.
```

NUMBER 型の 2.5 に対して ROUND 関数を実行すると 3 になるのに対し、BINARY_DOUBLE 型の 2.5 に対してROUND 関数を実行すると 2.0 になっています。これは「銀行丸め」とか「偶数への丸め」と呼ばれる仕様です。端数が 0.5 の場合は偶数になるように丸めます。

# ROUND(v) と ROUND(v, 0) の違い

ROUND 関数の第２パラメーターには小数点以下の桁数を指定します。この値を 0 に指定すると整数に丸められますが、BINARY_DOUBLE 型の列に対して実行すると結果が変わってきます。

```
SQL> SELECT c2, ROUND(c2), ROUND(c2, 0) FROM rd_table ORDER BY c1;

        C2  ROUND(C2) ROUND(C2,0)
---------- ---------- -----------
  2.1E+000   2.0E+000           2
  2.2E+000   2.0E+000           2
  2.3E+000   2.0E+000           2
  2.4E+000   2.0E+000           2
  2.5E+000   2.0E+000           3
  2.6E+000   3.0E+000           3
  2.7E+000   3.0E+000           3
  2.8E+000   3.0E+000           3
  2.9E+000   3.0E+000           3
  3.0E+000   3.0E+000           3

10 rows selected.
```

c2 列が 2.4 の場合、ROUND(c2) は 2.0 が返りますが、ROUND(c2, 0) は 3 が返っています。
これは第２パラメーターに 0 を指定した場合、NUMBER 型として扱われるためです。
[マニュアル](https://docs.oracle.com/cd/F19136_01/sqlrf/ROUND-number.html#GUID-849F6C45-0D72-4464-9C0F-8B6822BA85E1) には下記ようにわかりにくい記述があります。

> nには、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を指定できます。integerを指定しない場合、このファンクションは、nの数値データ型と同じデータ型で値ROUND(n, 0)を戻します。integerを指定すると、このファンクションはNUMBERを戻します。

# 他のRDBMSでは？
SQL Server や DB2 ではNUMERIC 型、FLOAT 型共に四捨五入がデフォルトになるようです。
React向けチャート描画ライブラリ Top 6


# React向けチャート描画ライブラリ Top 6
React向けのチャート描画ライブラリをgithubスター数でピックアップしました。
以下、スター数の多い順です。

⏲2019/12/13時点のスター数です。

# Recharts
[hp](http://recharts.org/en-US/) / [github](https://github.com/recharts/recharts) / [demo](http://recharts.org/en-US/examples) / ⭐️12,888
Rechartsは、ReactおよびData Driven Documentで構築された、再定義された構成可能なチャートライブラリです。
プログラマが頭痛のないReactアプリケーションベースのチャートを作成するのを支援します。

# Victory
[hp](https://formidable.com/open-source/victory/) / [github](https://github.com/FormidableLabs/victory) / [demo](https://formidable.com/open-source/victory/guides/custom-components) / ⭐️7,629
インタラクティブなデータ視覚化とモジュラーチャートを作成するためのReactコンポーネントコレクション。
基本的なチャートとアニメーションもサポートしています。 Vistoryの最大の利点は、カスタムチャートの作成に役立ち、必要に応じて複数の独立した軸を使用できることです。

# React VIS
[hp](https://uber.github.io/react-vis/) / [github](https://github.com/uber/react-vis) / [demo](https://uber.github.io/react-vis/examples/showcases/plots) / ⭐️6,614
React VISは、使いやすいReactチャートライブラリであり、棒/折れ線/面チャート、散布図、ヒートマップ、ドーナツと円グラフの等高線プロット、平行座標、サンバースト、ツリーマップ、レーダーチャートなどのチャートの視覚化に役立ちます。

# VX
[hp](https://vx-demo.now.sh/) / [github](https://github.com/hshoff/vx) / [demo](https://vx-demo.now.sh/gallery) / ⭐️6,584
VXは、React環境でのD3の最適な実装です。
データからチャートを非常に簡単に構築するだけでなく、D3のようなさまざまな形状の生成にも役立ちます。
しかし、D3は低レベルのライブラリと見なされているため、D3を使用するだけでは満足できるとは限りません。VXはD3の構築力を2倍にしました。これらの両方を組み合わせることで、より高速で優れた結果が得られました。

# Nivo
[hp](https://nivo.rocks/#/) / [github](https://github.com/plouc/nivo) / [demo](https://nivo.rocks/components) / ⭐️6,126
Nivoには、豊富なdatavizコンポーネントのセットが付属しています。
素晴らしいD3およびReactプラグイン上に構築されています。
レスポンシブチャートの作成に役立ち、高度なカスタマイズが可能です。

# React ChartJS 2
[hp](https://www.chartjs.org/docs/latest/) / [github](https://github.com/jerairrest/react-chartjs-2) / [demo](http://jerairrest.github.io/react-chartjs-2/) ⭐️2,393
Chart.jsのシンプルなReactラッパー。必要な基本的なReactグラフチャートオプションがすべて備わっています。

# others
### @data-ui/sparkline
[github](https://github.com/williaster/data-ui) / ⭐️373

### Rumble Charts
[github](https://github.com/rumble-charts/rumble-charts) / ⭐️286

### React JSX Highcharts
[github](https://github.com/whawker/react-jsx-highcharts) / ⭐️256

### React Easy Chart
[github](https://github.com/experience-experiments/react-easy-chart) / ⭐️148

### React Fusion Charts
[github](https://github.com/fusioncharts/react-fusioncharts-component) / ⭐️63

# googleトレンド
[googleトレンド](https://trends.google.co.jp/trends/explore?q=react%20Recharts,react%20Victory,react%20VIS,react%20Nivo,React%20ChartJS%202)
※VXは少ないので省きました。
webpackでriotのcssをコンパイルしたい(v4)

webpackでriotのcssをコンパイルする方法を紹介します。

webpackの細かい設定とかはスキップします。

## 1. プリプロセッサを登録する
```webpack.config.js
const postcss = require('postcss');
const prefixer = require('autoprefixer')({ overrideBrowserslist: ["last 2 versions"] });
const compiler = require('@riotjs/compiler');

//第二引数はプリプロセッサの名前
compiler.registerPreprocessor('css', 'postcss', (code, option) => {
  return {
    code: postcss([prefixer]).process(code).css, //ここでcssをコンパイルする
    map: null
  }
});
```

## 2. @riotjs/webpack-loaderのオプションに設定する

```webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.riot$/,
        exclude: /node_modules/,
        loader: '@riotjs/webpack-loader',
        options: {
          css: 'postcss' //プリプロセッサの名前を指定
        }
      }
    ]
  }
};

```

## 3. riotコンポーネントで使う

```html:app.riot
<app>
  <div>R</div>
  <div>i</div>
  <div>o</div>
  <div>t</div>
  <!-- type="{name}"に使うプリプロセッサを指定する -->
  <style type="postcss">
    :host {
      display: flex;
    }
  </style>
</app>
```

以上！

## さいごに
いちいちtype指定するの、いつか指定し忘れそう・・ riot v3ではいちいち指定しなくてもできたのに・・・
【AWS S3】S3上のフォルダの存在確認

## 概要
PythonのAWSへのAPIラッパーであるboto3ライブラリを用いて、S3上のあるフォルダ[^1]
またはファイルが存在するかどうかを確認する関数を書いた。

## 動機
S3上のフォルダの有無で場合分けをしたい処理があったのだが、ネット上にはboto2を使っていて現在では実装されていない関数を使った処理だとか、S3上の「ファイル」にしか使えない方法ばかりがあって、「フォルダ」に対する存在判定がほぼなかった。

なので自作しました。

## 

## コード例

```python
import boto3
from botocore.exceptions import ClientError

client = boto3.client('s3')
bucket_name = 'hoge'
key = "fuga/piyo/bar/" # /まで入れるのがキモだと思う。なくてもいけるかもしれない。確かめてません。
# 2020-09-30追記 コメントより、末尾の/は必要であるとの指摘を頂きました。

result = client.list_objects(Bucket=bucket_name, Prefix=key)

# 次もキモ。上記のパスが存在しない場合、返ってきた結果の中には
# Contents というキーが存在しない。これを使えば存在判定ができる。
if "Contents" in result:
    exists = True
else:
    exists = False
```


[^1]: 厳密にはフォルダではない。S3上ではすべてPythonでいう辞書のように、キー(パスのようなもの)と値(ファイルの中身的なもの)の組み合わせで管理されている。S3ではそのキーがたまたまパスのような/区切りで表現されており、ブラウザではAWSのビューワが/区切りでいい感じに解釈してくれているだけ。
アイカツのQRをPCで読み取りたい...！！！

##はじめに
- こちらの記事は[アイカツ！ Advent Calendar 2019](https://adventar.org/calendars/4521)の19日目の記事となります。SHINING LINE*を繋ぎます。よろしくお願いします。
- 前日の記事はkakakayaさんによる11日目の続きの[](https://qiita.com/snofra/items/f803a8d9149f4c871e6e)です。

##自己紹介と学習している言語

白石莉子と申します。角川ドワンゴ学園N高等学校通学コース代々木キャンパスプログラミングクラスに所属している高校二年生です。高校内では女児向けアニメ同好会を創設し運営をしております。学習言語はPython3です。過去にはHTMLとCSSを触っていました。

##作成経緯

DCDを主にプレイしておりアイカツカードをマイキャラ柄でいつも印刷しています。その時既存柄を失念してしまうためpythonを使用しQRコードを読み取ることを考えました。日常生活の中ではPCを使用する機会が多くあまりスマートフォンを取り出す機会が少ないためPCで読み取れる方が都合がいいのです。そしてプロトタイプを作成したのですが読み取った情報を置いておけないかなと思いSlackに投稿することとしました。

##作成物

アイカツのカードを読み取りSlackに共有するプログラムです。
[Github](https://github.com/Girls-anime-lover/Aikatsu-QR-Slack-Post-Program)にソースコードを公開しております。
使用ライブラリは以下のとおりです。

- Pyzbar
- Pillow
- OS
- SlackClient
- Requests
- json
- sys 
- OpenCV

このプログラムにインストールが必要なライブラリは以下の通りとなります。
このプログラムをお手元の環境で動作させたいと言う方は事前にpipが必要ですので各自インストールをお願いします。
Python3.7のみ動作を確認しています。Python3.8での動作はまだ確認していません。

    pip3 install slackclient
    pip3 install pyzbar
    pip3 install opencv-python
    pip3 install pillow


動作フローは以下の通りとなります。

####QRをWebカメラから読み取る場合
- TkinterでOpenCVを使用しWebカメラから映像を投影したウィンドウを展開する

- QRコードをpyzbarでUTF-8にデコードし変数 pathに代入する

- pathに代入されているURLをbitlyを使用して短縮する

- 短縮URLをcardに代入する

- cardの短縮URLをslackに投稿する


####QRを事前にスキャンしておりファイルがある

- そのファイルがあるパスを指定してpyzbarでQRを検出する

- そのQRを読み取りUTF-8でデコードして変数 pathに代入する

- pathの中にあるURLを短縮URLにする

- 短縮URLをcardに代入する

- cardの短縮URLをslackに投稿する

##問題点と改善点
- pyzbarでQRを読み取りslackに投稿すると末端の.がURLとして認識されない
  - 改善としてbitlyを使用しslackに投稿する
 
- ファジングに弱い
 - 例外処理を何度も設定して対策しました。
 - 同級生の方にお手伝いいただきました。この場を借りお礼申し上げます。

##感想
- openCVとpyzbarに初めて手を出しました。外部モジュールのドキュメントがたいてい英語だったので読むのに苦労しました。今後は英語力をつけてGo langに挑戦しようと思います。
- 一番苦労したのはプログラミング歴がまだ短い(1年未満)自分の実力不足でした。これからはPythonのスキルを向上させるように頑張りたいと思います。
- そもそもアドベントカレンダーを思いつきで2日前に登録しましたがよく書けたなと思います。

##今後の展開
- BS4を利用し投稿するURLからカード名を拾って同時に投稿する機能。
- 旧カツカードにも対応する。
- ここに書いたので本気でやろうと思います。見届けてもらえると嬉しいです。

##最後に
アドベントカレンダーは初めてだったのですがちゃんと書けてるかある意味心配です。
マサカリ等御座いましたらコメントを送信していただくか[Twiiter](https://twitter.com/Ricotan_linux)までご連絡をいただきますと助かります。
[2020/05/07追記]Twitter凍結したためご連絡はコメントでお願いします。またコメント欄に残したくない場合はメールアドレスをお教えしますのでコメントにてこの旨お伝えください。
最後まで見ていただき誠にありがとうございました。
これからも成長しますのでよろしくお願いします。

次の方はgecko655さんの[Spotify上でのアイカツ！楽曲の人気順](https://gecko655.hatenablog.com/entry/aikatsu_adc_2019_16)です。
ライブコーディングを始めよう！

※この記事は[SFC Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sfc)の記事です。

##概要
皆さん、プログラミングで音楽を演奏出来ることをご存知でしょうか？
実は、ライブコーディング(その場でコードを書く行為の総称)で即興演奏できるツールがあります。今回はライブコーディングで演奏するツールの紹介と環境構築の方法、
そして最後に音を実際に出す方法についてご紹介します。

##自己紹介
はじめまして。環境情報学部2年のdaveと申します。
自分は村井研のAQUA(村井研にある量子計算・通信の研究グループ)に所属しており、普段は量子アルゴリズムの実装をしております。
18日に[量子コンピューターAdvent Calender 2019](https://qiita.com/advent-calendar/2019/quantum)にも参戦するので良かったら購読お願いします。

自分とライブコーディングの出会いは、Twitterで流れてきたWIREDの記事
(https://wired.jp/2019/05/19/algoraves-live-coding-djs/) でした。
普段からコードを書き、かつクラシックから電子音楽まで幅広く聴く自分にとって、「プログラムで自分も音楽を演奏してみたい！」と強く思いました。
そして、ライブコーディングの環境構築を1時間前に終わらせたので、その際につまづいた点も含めて解説します。まさに「ライブコーディングを始める」ための記事にします。

##必要なライブラリ
演奏用のライブコーディングのためのソフトウェアはいくつかありますが、今回はPythonを使ったソフトウェアを紹介します。基本的には[^1]を参照しています。

以下のツールをダウンロードして下さい。

1. Python 
2. SuperCollider
3. sc3-plugins
4. Git
5. FoxDot

１つ１つ説明していきます。
### 1. Python
Pythonは今回使うプログラミング言語です。こちらの[リンク](https://www.python.org/downloads/)からご使用のOSに合うものの中で最新版をダウンロードして下さい。

### 2. SuperCollider
SuperColliderはサウンドプログラミング言語(音声を操作するプログラミング言語)の1つです。こちらの[リンク](https://supercollider.github.io/download)から、例によってご使用のOSに合う最新版をダウンロードして下さい。


### 3. sc3-plugins
sc3-pluginsはSuperColliderのプラグインで、これをダウンロードすると音が合成できるようになるそうです。[^2] 
是非ダウンロードしましょう。
このダウンロードの仕方についてご紹介します。

(i) SuperColliderを開いて `Platform.userExtensionDir`を入力します。
(ii) 上のコマンドを`Cmd+Enter(Mac)`あるいは`Ctrl+Enter`で実行します。
(iii) 2.を実行するとディレクトリへのパスが表示されるので、そこに解凍したsc3-pluginsを移動させて下さい。

注: (Macの場合)もし表示されているパスが見当たらなければ、Finderを開いて
`Cmd+Shift+G`を押して下さい。パスの入力欄が出るので、そこに出力されたパスをコピペするとディレクトリに移動できます。

### 4. Git
[こちらのリンク](https://git-scm.com/downloads)からダウンロードして下さい。ツールがダウンロード出来なかった時の奥の手として使います。

### 5. FoxDot
FoxDotはPythonでライブコーディングをするための環境です。このダウンロードの仕方を解説します。

(i) まずターミナルで`pip install FoxDot`、または
`python3 -m pip install FoxDot --user`と入力して下さい。

(ii) SuperColliderを開いて`Quarks.install("FoxDot")`を入力します。

 注:もし上手くいかなかったらSuperColliderで
`Quarks.install("https://github.com/Qirky/FoxDotQuark.git")
Quarks.install("https://github.com/supercollider-quarks/BatLib.git")`を入力して下さい。

インストールが完了したらSuperColliderを再起動しましょう。

(iii) SuperColliderに`FoxDot.start`を入力して、`Ctrl+Enter`で実行します。
 
(iv) コンソールを開いて`Python -m FoxDot`または`Python3 -m FoxDot`を入力します。

(v)  FoxDotに`p1 >> pluck()`を入力して音が出たらゴールです！

## 最後に

先述の通り自分はライブコーディングに関してはど素人なので、一緒に上手くなっていきましょう！環境構築で詰まったら自分のTwitter([Dave/Makoto](https://twitter.com/makoto_quantum))にDM下さい。
[^1]: https://qiita.com/Hulc_0418/items/ba3e94633e465f7201d0
[^2]: https://supercollider.github.io/sc3-plugins/
Donkey Carのネットワーク環境をちょっと工夫してみる

### はじめに

今年、Maker Faire Tokyoや走行会などに参加・主催してネットワーク環境について感じたことをまとめておこうかと思います。AIカーはネットワーク環境前提の仕組みのため、ネットワークがつながらないと何もできないことから大事な要素になっています。
そこで参加者ができる工夫について書こうと思っています。

### 現状

家で以下の環境で使っている分には何の問題もないのですが、走行会イベントでフリーWifiを公開した途端に、Raspberry Pi、パソコンや自分のスマホなどを繋ぎはじめて、最初のうちはうまく動いているのですが、徐々にルーターでの輻輳が起きてしまい、つながらない状態が発生します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/edf39577-eb5b-84bb-5ade-9d681573ded7.png">


### 対策その１（スマホのテザリング）

スマホのテザリング機能により、パソコンとDonkey Carを繋ぎ、走行データを取るまでは共用のフリーWifiには接続しない。データを採取して外部のColaboratoryで学習する際にパソコンのネットワークをフリーWifiの方に切り替える。

![image-20191212103231469.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/a77ec212-46d9-342f-7f23-a0db47cbc690.png)

### 対策その２（ポータブルWifiルーター）

以前ホテルなどで有線LANしかなかった時に、Wifiしかないパソコンをつなぐために作られていたポータブルWifiルーターを活用。と言っても、そんなに種類があるわけではないため、BAFFALO WMR-433W2での運用を書きます（けっしてBAFFALOの回し者ではないですが）。

スマホのテザリングと同様に、ポータブルWifiルーターにパソコンとDonkey Carをつなげます。普段から青い点線の枠で囲まれたネットワーク構成を作っておけば、Raspberry Piのwpa_supplicant.confの設定を都度変える必要がなく、インターネットにつなげたい時は、WMR-433W2の設定画面だけを使えばいいため、走行会に行って即時に走行させることができます。

![image-20191212104946322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/eb820c2f-fea5-d5f5-00e0-2f19e3335a81.png)


WMR-433W2には、ワイヤレスワンモードという設定があり、フリーWifiと無線で接続し、本体についているRJ-45のコネクタはLANケーブルを使ってパソコン又はRaspberry Piに安定してつなぐことができます。Raspberry Piとつないだ場合には、Donkey Carに搭載してルーターに電源供給してあげる必要がありますが、安定した接続が可能になります。

また、Donkey Carに割り振られたIPアドレスを調べるときに、HDMIディスプレイを使う他にスマホに「Fing」というアプリを入れて調べる方法が便利です。

### まとめ

Donkey Car走行会に限らず、人が集まるとネットワークが集中するため致し方ないところもありますが、色々と工夫として安定したイベントになるように、知恵を出していけたらと思っています。
【Vue.js】トランジションクラスの発動タイミングまとめ【デモ付き】

## はじめに
Vue.jsのトランジションクラスが発動するタイミングをまとめました。

[公式サイトはこちら](https://jp.vuejs.org/v2/guide/transitions.html)
## この記事が役に立つ方
- Vue.js初心者

## この記事のメリット
- トランジションクラスがいつ発動するのかがわかる。

## 環境
```yaml
- OS: macOS Catalina 10.15.1
- Vue: 2.6.10
```
## transitionとは？
Vue.jsの機能で、**CSSトランジション/アニメーション**をより使いやすくサポートしてくれます。

## 基本構文

```html:index.html
...略
<div id="app">
  <transition>
    トランジションさせたい要素
  </transition>
</div>
...略
```

```javascript:main.js
new Vue ({
  el: '#app'
})
```

シンプルに`<transition>`で囲むだけなので簡単です。

## トランジションクラス一覧
※画像の例は`opacity`をいじった場合です。

### Enter系

![スクリーンショット 2019-12-13 22.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/4a4ae233-f1ed-9f17-7ebd-c7de416a5a73.png)

|トランジションクラス|タイミング|
|:-:|:-:|
|.v-enter|開始|
|.v-enter-to|終了|
|.v-enter-active|変化している間|

### Leave系

![スクリーンショット 2019-12-13 22.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/d6cd5d94-51c3-03a3-f0cf-f2ebeadfa25c.png)

|トランジションクラス|タイミング|
|:-:|:-:|
|.v-leave|開始|
|.v-leave-to|終了|
|.v-leave-active|変化している間|


※画像は[公式ドキュメント](https://jp.vuejs.org/v2/guide/transitions.html)から拝借しました。

## タイミング確認用デモ

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="html,result" data-user="terufumi1122" data-slug-hash="rNaMNgo" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="rNaMNgo">
  <span>See the Pen <a href="https://codepen.io/terufumi1122/pen/rNaMNgo">
  rNaMNgo</a> by terufumi (<a href="https://codepen.io/terufumi1122">@terufumi1122</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

余談にはなりますが、初めて[CODEPEN](https://codepen.io/)を埋め込んでみました！
コピペだけで出来るとは思っておらず、かなりハードル低かったです:grin:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [Enter/Leave とトランジション一覧 — Vue.js](https://jp.vuejs.org/v2/guide/transitions.html)
JOI2019/2020 一次予選第三回 A問題,B問題の解き方

JOI2019/2020の一次予選第三回、お疲れさまでした.
コンテスト中ではB問題のみ解けました.
解説が出ているから公開していいはず。
使用言語 : C++,Python3

#A問題
<img width="630" alt="qiita_joia.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/683bcd62-2b8f-9046-d158-920e9a0cf826.png">
#解法
X < L
の時、Lを出力.

L <= X <= R 
の時、Xを出力.

R < X 
の時、Rを出力.

#コード
```A.cpp
#include <iostream>

using namespace std;

int main(){
    int X;
    int L;
    int R;
    cin >> X >> L >> R;
    if(X < L){
        cout << L << endl;
    }
    else if(L <= X and X <= R){
        cout << X << endl;
    }
    else if(R < X){
        cout << R << endl;
    }
}
```
以上.


#B問題
<img width="646" alt="qiita_joi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/d1d46bf9-9ec5-c2da-deda-4cd89ab92d9b.png">


#解法
Python3のreplace関数を使って"joi" という文字列を"JOI"に置き換える.

#コード

```B.py
N, S = int(input())
print(S.replace('joi', 'JOI'))
```

以上.

#感想
C問題もだけど、コンテスト中にA問題を解けなかったのが悔しいです...。
[Ruby on Rails5 アプリケーション プログラミング]学習ログ#3[2019/12/13]

**前回 -> [[Ruby on Rails5 アプリケーション プログラミング]学習ログ#2[2019/12/12]](https://qiita.com/CAD-guest01/items/0d8a89a724c588f8ec3f)**
**次回 -> [[Ruby on Rails5 アプリケーション プログラミング]学習ログ#4[2019/12/14]]**

---
#目的
### Progateで学んだことをローカル環境で手を動かして復習することで、基礎を固める

#使用する教材
###山田祥寛(2017). RubyonRails5 アプリケーションプログラミング　株式会社技術評論社

#Q.「RubyonRails5 アプリケーションプログラミング」とは？
#A.ProgateのRoRコースを終えた後にするRoRの勉強としておすすめされている本

出典
(Samurai Blog / Ruby on Rails学習本おすすめ6選【入門者〜上級者までレベル別に解説】)[https://www.sejuku.net/blog/110292]

---
#今日したこと
##ビュー開発の基礎(p104~p136)

###（復習）コントローラ/ビュー/ルート定義 を作成
```console:console
#viewという名前のコントローラクラスを作成
rails g controller view
#view以外の名前のコントローラクラスhogeを間違って作成した場合の切り戻し
rails destroy controller hoge

#ビューの作成
[view_controller] , [books_controller]
を編集

#ルート定義
[routes.rb]
get 'view/keyword'
post 'keyword/search'
```

###フォーム関連のビューヘルパーの作成
```console:console
#viewディレクトリに移動
cd app/views/view
#テンプレートファイルの作成
vi hogehoge.html.erb
```

---
MicrosoftFlowからCommonDataServiseを更新する方法

#はじめに
　MicrosoftFlowからCDS(CommonDataServise)を更新したいという場面は多くあるでしょう。
しかし、更新には一工夫必要だったので、紹介します。

#1. 躓くところ
少しフローをいじったことのある人なら、CDSのアクションを見つけて適当に入れていけば、
更新出来るでしょと思うかもしれないのですが。。。そうではないのです。
<img width="1025" alt="24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/64888250-5f0f-01e9-182a-9d20721da6c0.png">

このレコード識別子って必須項目なに？？
ここで躓いてしまいました。。。

#2. 原因
CDSでは1レコードごとにレコード識別子が付与されているのでは、それが必要みたいでした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/fdc22200-bbe2-1941-b8d4-d1ed8785ee24.png)

#3.  解決法

##3.1  レコード一覧表示を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/6e6474cd-8e48-da74-033d-ba23e41660f4.png)


##3.2  動的なコンテンツとしてエンティティ名を選ぶ
今回は名簿というエンティティなのでエンティティを選びます。


よし！出来た！！！
と思ったのですが、更新をする明細を選ぶところがありません。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/bbe2ef78-0df6-09b8-7a5b-c65bae19ee15.png)
もう一工夫してみましょう！
##3.3  レコードの取得と制御を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/e865a1ee-a6cd-ab14-813f-5d84dd43fe6c.png)

##3.4   完了！
今度こそ完了です。お疲れさまでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/61413e7b-d784-4b56-d54e-40adba7fd52b.png)

#最後に
正直これでいいのかなっと思いながら作成しました。
もしこのやり方で全然簡単に出来るよ！等あったらコメントお願いします。
WIP: ngrxのexample-appをコードリーディングしてみた

https://github.com/ngrx/platform/tree/master/projects/example-app

# ディレクトリ構造

```
$ tree -d

.
└── src
    ├── app
    │   ├── auth
    │   │   ├── actions
    │   │   ├── components
    │   │   │   └── __snapshots__
    │   │   ├── containers
    │   │   │   └── __snapshots__
    │   │   ├── effects
    │   │   ├── models
    │   │   ├── reducers
    │   │   │   └── __snapshots__
    │   │   └── services
    │   ├── books
    │   │   ├── actions
    │   │   ├── components
    │   │   ├── containers
    │   │   │   └── __snapshots__
    │   │   ├── effects
    │   │   ├── guards
    │   │   ├── models
    │   │   └── reducers
    │   │       └── __snapshots__
    │   ├── core
    │   │   ├── actions
    │   │   ├── components
    │   │   ├── containers
    │   │   ├── effects
    │   │   ├── reducers
    │   │   └── services
    │   ├── material
    │   ├── reducers
    │   └── shared
    │       └── pipes
    ├── assets
    └── environments

36 directories

```

# コンポーネント

## containers

Storeの操作を担う。
必要な値をStoreから取得し、componentsに実装した子コンポーネントに値を渡す。
また、子コンポーネントから`emit`された場合、Storeに`dispatch`する。
いわゆる、ページコンポーネントって言うやつ。

## components

componentsにはStoreに値を保存したり、取得したりする処理は実装しない。
`@Input`を使って親コンポーネントから値を受け取り、それを表示する。
ユーザーの操作は`@Output`を使って`containers`に`emit`する。

## モデル

モデルは、modelsフォルダに`interface`を使って実装する。
テストで使うために、モックもここで定義している。

https://github.com/ngrx/platform/blob/master/projects/example-app/src/app/books/models/book.ts

# サービス

`HttpClient`使う処理はやっぱりここに書くよね。`localStorage`とかも。
あとサービスはコンポーネントからは呼び出してなかった。GUARDからはいくつか呼び出しているところはあった。

# ガード

booksのガードはguardsに実装されてるけど、authのガードはservicesに実装されている。
何でですかね？authのガードはだいたいExternal API叩くから？

# ACTION

※ 何をもって分けているのかまだ読み解けてないのです。テストコード読んだら追記します。

## xxxxx.actions.ts

コンポーネント、EFFECTS、ガードとかから呼び出されてるっぽい。

## xxxxxs-api.actions.ts

EFFECTSから呼び出されるACTIONを定義する。
コンポーネントからは呼び出されない。

## collection-api.actions.ts

EFFECTSから呼び出されるACTIONを定義する。
コンポーネントからは呼び出されない。

## xxxxx-page.actions.ts

containersに実装されている`xxxxx-page.component.ts`に対応している。

# EFFECTS

※ EFFECTSもテストコード読んでいるところだよ。まぁでもぱっとみ、collectionのほうはCRUDの操作してるっぽい。

## xxxxx.effects.ts

## collection.effects.ts

# REDUCER

※ REDUCERも(ry

## xxxxxs.reducer.ts

## collection.reducer.ts

## search.reducer.ts
Pythonとは

今日はある意味本命である
Pythonについて投稿します。

# Pythonとは
1991年にオランダ人のグイド・ヴァン・ロッサム氏によって開発されたプログラミング言語です。

少ないコードで簡単にプログラムを作れ
尚且つコードが読みやすいのが特徴です。

「人工知能(AI)」や「Web開発」、「教育の分野」など活用が広まっています。

# Pythonのメリット

基本メリットとして

* シンプルで覚えやすい
* インデントによるオフサイドルール
* コンパイルが不要
* ライブラリが充実している

これらが挙げられます。

## シンプルで覚えやすい
文法がシンプルで必要最低限のものしかあらず
読みやすく書きやすい言語です。
何通りも書き方は用意されてないので
他人の書いたコードも比較的読みやすいものになります。

## インデントによるオフサイドルール
構文などのブロックを字下げ(インデント)で指定するというものです。
これによって誰が書いても同じコードになるため、
プログラムは書きやすく読みやすいモノになっています。

### オフサイドルール
字下げによって文などのかたまりの範囲（ブロック）を示す規則です。

## コンパイルが不要
コンパイル作業は、大量のエラーが発生することが多く時間を要します。
Pythonはインタプリタ型の言語のため、コンパイルの必要がなく
すぐに動作確認ができます。

# Pythonのデメリット
デメリットは以下の通りです。

* 実行速度が遅い
* インデントが必須

Pythonはインタプリタ言語のなかでも特に実行速度が遅い言語と言われています。
企業向けの基幹システム,システムや高度なゲーム開発には不向きです。

またオフサイドルールからインデントが適切にできていないと
エラーとなってしまうこともあります。

# Pythonで作れるもの
作れる物は

* 「Webアプリケーション」
* 「デスクトップアプリケーション」
* 「組み込みアプリケーション」
* 「ゲーム」
* 「機械学習（人工知能）」

などが作れます。

# Pythonの作成例

有名なのをあげると

* youtube
* evernote
* instagram

が代表的です。

# Pythonのフレームワーク

使われいるフレームワークを一部紹介するとこのような物があります。

* Django
* Flask
* Bottle
TerraformでCloud Runを作成する際に最大メモリ量を指定する

## はじめに
こんにちは、SREエンジニアやってます。@hayaosatoです。
今回はTerraformでGCPのCloud Runを構築する際に最大メモリ量も指定しながら構築する小ネタを書いていきたいと思います。

## Cloud Run
Cloud RunはHTTPでリクエストを受ける事が可能なステートレスコンテナを実行できるサービスで、
今回はbeegoで作ったアプリケーションをCloud Runで実行する環境をTerraformで作成していきます。
beegoアプリをCloud Runで実行する記事は[以前](https://qiita.com/hayaosato/items/22cb9f7124008105907b)書いていますので、そちらを見ていただけると幸いです。
また、今回はコンテナイメージはすでにContainer Registryにpushしてあることを前提として進めていきます。

## Terraform
では早速Terraformのコードを書いていきたいと思います。
基本的にグローバル公開でただ動かすだけならドキュメントにあるサンプルそのままで作成できます。

```tf
resource "google_cloud_run_service" "default" {
  name     = "hoge-${var.image_name}"
  location = var.region

  template {
    spec {
      containers {
        image = "${var.hostname}/${var.project_id}/${var.image_name}"
        resources {
          limits = { "memory" : "512Mi" }
        }
      }
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}
```
ここで注意すべき点の一つに最大メモリ量があると思います。
Cloud Runのデフォルト最大メモリ量は256Miとなります。
しかし、今回動かすbeegoアプリケーションはメモリが256Miでは足りないので最大メモリ量を拡張する必要があります。
そこで指定するのが`resources`ブロックの`limits`です。
`limits`にはk8sのquantityと同じフォーマットの文字列をvalueとしたマップを指定する必要があり、
メモリを指定する場合は

```tf
resources {
  limits = { "memory" : "512Mi"}
}
```
となります。
この辺りは[こちら](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)を参考にするとわかりやすいと思います。

## 最後に
Cloud Runデプロイ楽すぎて不安になる

## 参考
- [Terraform Documentation](https://www.terraform.io/docs/providers/google/r/cloud_run_service.html)
- [Managing Compute Resources for Containers](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)
- [こんなに簡単にコンテナをデプロイできちゃって良いんですか？GCP Cloud Runでコンテナを爆速デプロイしてみた](https://dev.classmethod.jp/cloud/gcp/gcp_cloud_run_tutorial_sys/)
systemd-nspawnことはじめ

# systemd_nspawn
## `chroot`
本題に入る前に、理解しておきたい点がある。
Linuxに於いて、プロセスは**ルートディレクトリ**を属性の1つとして持つ。
それは普通、プロセス内で`/`から始まる絶対パスの解釈に使われ、通常はシステムのルートディレクトリ(`/`)が設定されている。
`chroot()`システムコールはルートディレクトリを指定したパスに変更する。
これにより、アクセス可能なファイル等を制限出来る。

## `systemd-nspawn`
`systemd-nspawn`は`chroot`の強化版と解釈出来る。
`chroot`と異なる点として、`systemd-nspawn`は
ファイルシステムの階層やプロセスツリー、各種IPC、ホスト名やドメイン等も完全に仮想化、隔離する。
名前空間を隔離し、軽量なコンテナとして扱える。

また、`systemd-nspawn`を用いるモチベーションの1つとして、`systemd`を用いるLinuxディストリビューションなら何も考えず使えるという点がある。

### Dockerとの違い
再現されたディストリビューションのディレクトリツリー内で出来ることは何でもできる。
Dockerはアプリケーション単位でコンテナを構築するのに対し、`systemd-nspawn`はコンテナに1つのLinuxシステムを構成する。
コンテナ内で複数のアプリケーションを普通のLinux環境同様に起動できるVM型の仮想化に近い環境を構築できる。

## はじめる
筆者が普段使っているUbuntuをホストとし、そこに`systemd-nspawn`を用いてコンテナ環境を作る。

### 環境
`Linux karkador 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu Nov 14 12:06:39 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux`

### 準備
コンテナ上で必要なファイルを用意するために`debootstrap`を用いる。
`debootstrap`とは、Ubuntuのベースとなっているディストリビューションである`debian`の最小限のディレクトリツリーを構成する為のツール。今回はこれでUbuntu用のものを用意する。
今回は`/var/lib/machines/ubuntu`という名前でコンテナ用のディレクトリを用意し、そこへファイルをインストールする。

```
# debootstrap --arch=$(dpkg --print-architecture) $(lsb_release -cs) /var/lib/machines/ubuntu http://archive.ubuntu.com/ubuntu
```

これでコンテナに必要なファイルは作られた

### コンテナに入る
```
# systemd-nspawn -D /path/to/container
```

これで用意した環境のルートシェルに入れる。とりあえず`passwd`でパスワードの設定だけして抜ける。
コンテナから出るには`Ctrl ]]]`で良い。 

```
# systemd-nspawn -b -D /var/lib/machines/ubuntu
```

コンテナをブートする。即ち、コンテナ内で`init`を起動する。
見慣れたUbuntuのブート画面の後、ログインシェルが立ち上がる。
ここまで来ればもう普段通りの事は大体できる。
抜け方は同じ。

```
# systemctl start systemd-nspawn@ubuntu
```

でコンテナが起動される。
自動起動等の操作は他と同様、`enable|disable`で行う。

## コンテナの操作
`systemd-nspawn`コマンドには多数のオプションがある。
例えば最初の`-D`は指定したディレクトリをコンテナのファイルシステムのルートとするオプション。
また、`systemd-nspawn`以外にコンテナの操作に便利なコマンドがある。

### `--syscall-filter`
コンテナ内で発行されるシステムコールのルールを変えられる。
例えば`read`を許可しない時は
`--syscall-filter="~read"`
で出来る(尚、`read`を許可しないと実行も出来ない)

指定するシステムコールに関する詳細は`systemd-analyze syscall-filter`で確認出来る。(グループ単位での指定等)

### `machinectl`
`systemctl start systemd-nspawn@`*hostname*
で起動されているコンテナは、`machinectl`コマンドで操作できる。
`machinectl list`で起動中のコンテナのリストを表示、
`machinectl list-images`で`/var/lib/machines`にあるコンテナのイメージのリストを表示する。
また、自動起動の操作も`machinectl enable|disable`で行える。

`machinectl`は、コンテナ周りの`systemctl`の操作と`systemd-nspawn`をまとめたようなコマンドで大抵の操作はこれで行える。

## コンテナのネットワーク
デフォルトではホストとネットワークを共有している。
また`systemd-networkd`をコンテナ、ホストに設定すると仮想イーサネットリンクやブリッジ、ポートフォワーディングなど、幅広いネットワーク設定が可能になる。

## まとめ
Dockerとは異なる点も多く、使い方も全く別のコンテナ技術として面白いものだと思う。
もう少し運用してみてネットワーク等、情報を追加していきたい。