OmniAICreator/Qiita-1.07M huggingface dataset:
【開発環境としてのChromebook】Lenovo Chromebook Duetその２

# はじめに
[前回](https://qiita.com/gontaneko/items/323ce50b4ed6f88cd09f)に引き続きLenovo Chromebook Duetについて書いていきます。
利用し始めて２日目気づいたことやベンチマークなど共有させていただきます。
そろそろQiitaの記事らしくコマンドやソースコードが登場させたかったのですが、そこまで辿り着けませんでした。

# ベンチマーク
どれぐらいの性能なのか気になるかと思います。比較対象の機種とあわせてベンチマーク結果を共有いたします。

## 計測対象の機種
今回計測したのは以下の機種です。

|機種名|メモ|略称|
|:-:|:-:|:-:|
|Lenovo Chromebook Duet|今回のターゲット|Duet|
|ASUS Chromebook Flip C101PA|皆さんお馴染み|C101|
|ASUS Chromebook C425|私のメイン機 Core m3（8th Gen)|C425|

## ベンチマークに利用したツール
GeekBenchがArmな2機種にインストールできなかったので、以下のツールで計測しました。

- Octane 2.0
- PCMark for Android

## 計測結果

### Octane 2.0
|機種|Duet|C101|C425|
|:-:|:-:|:-:|:-:|
|結果|![DUET-OCTANE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/94b2eb22-cecc-1579-4a17-ef3a5dc50fea.png)|![C101-OCTANE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/67e66ade-76f3-2966-745c-04ce430fda57.png)|![C425-OCTANE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/ba0dc93e-e5fa-d24d-0409-ed6982ca04ff.png)|
|スコア|10014|10155|26852|

- 他の海外レビューでも見かけましたが、OctaneでのスコアはDuetの方がC101より低いです。シングルコアでの性能がそのままでているのでしょうか。
- Core m3のC425はやはりスコアが良いですね。

### PCMark for Android
|機種|Duet|C101|C425|
|:-:|:-:|:-:|:-:|
|結果|![DUET-PCMARK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/2bea36f2-db0c-9d4f-5be3-5ac6c94dcf42.png)|![C101-PCMARK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/7e2da539-558e-7e26-63a9-59b6960913ac.png)|![C425-PCMARK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/45a8889f-d2f2-df65-263b-f1451e2d42d5.png)|
|スコア|6584|6102|10140|
※画像の大きさが違うのは愛嬌です。

- PCMarkでの測定結果はDuetの方がちょっと良かったです。CPUのグラフはDuetの方が余裕が感じられます。やはりコア数が少し多いことが効いた結果でしょうか。
- C425はやはりスコアが良かったです。CPUのグラフがうまく採取されていないので傾向を比べることができませんでした。

## 所感
DuetとC101では劇的に性能差があるわけではない（そこを過度に期待するとがっかりする）ということになります。
パワーを求める場合はIntelのCoreシリーズを搭載した機種を選んだ方が満足度が高いのではないでしょうか。Pixelbook Goとか。

# その他気づいたこと（バッテリー関連）
端末を持ち出すことを考えると、バッテリー周りはいろいろ気になってきます。
利用して２日目に気づいた点を共有させていただきます。

## 100%充電時の残り利用時間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/085f6f41-d1b1-73dd-3895-bde9191bdbf1.png)
100%充電しUSBケーブルを外して数分後の状態です。
使い方にもよると思いますが10時間ぐらいはもつのではないでしょうか。

## 充電器のアンペア数
2.4Aでの充電器でも通常充電できました。スマホと同じ充電器やモバイルバッテリーで運用できそうです。

# 今日のまとめ
どんどん外に持ち出して使う機種だなと思いました。そのためのいい塩梅のベンチマークとなっているのではないでしょうか。
C101からの乗り換えとしても十分有りだと思います。

#余談
また今度触れるとは思いますが、Debian Busterを有効にしたCrostiniを有効にして、DockerいれてDotnet CoreいれてCode OSSいれてなど普通にできています。
ただしこれまでに無い事象にも遭遇し、この機種特有なのかBusterにしてしまったことが問題なのか切り分けついてないこともあったり。
それはまた別のお話し。
個人的によく使うgitコマンドをまとめてみた

ずっとIDEで行っていた作業を一部コマンドで実行するようにしてみました。
それ用のメモ。
他にもおすすめの使い方があれば教えていただけると嬉しいです。

[2020.11.11 追記]
使うコマンドのレパートリーが増えたので、追加しました。


# (基礎)git Bash上での操作
- コピー
    - Ctrl + Ins
- ペースト
    - Shift + Ins

※コピペしたいところを選択したまま`Shift + Ins`を押すと、一回でコピペできる。

# stash 
- 一覧を見る

```terminal
$ git stash list
```
- 「○○」という名前でスタッシュする

```terminal
$ git stash save ○○
```
- 5番目のスタッシュをアンスタッシュする

```terminal
$ git stash apply 5
```
- 5番目のスタッシュを削除する

```terminal
$ git stash drop 5
```
- 5番目のスタッシュをアンスタッシュしたうえで削除する(めっちゃ便利)

```terminal
$ git stash pop 5
```

# branch
- 一覧をみる

```terminal
$ git branch
```
- 「feature_1111」というブランチを作成する

``` terminal
$ git branch feature_1111
```

- 「feature_1111」というブランチを削除する

``` terminal
$ git branch -d feature_1111
```

# checkout
- 「feature_1111」というブランチに移動する

``` terminal
$ git checkout feature_1111
```
- 「feature_1111」という新しいブランチを作成したうえで移動する

``` terminal
$ git checkout -b feature_1111
```
`-b`のオプションを使うことで、新しく作成したブランチにそのまま移動することができます。
このオプションの存在を知るまでは、`git branch feature_1111`のあとに`git checkout feature_1111`をしていたので、すごく楽になりました。


# fetch

- リモートの更新を読み込む

```
$ git fetch
```

すぐレビューしないといけないけど今の変更点スタッシュしてdevelopに移動するのがめんどくさい！というときに便利です。

# pull
- リモートの更新を読み込んでローカルに反映させる

``` 
$ git pull
```

`fetch`と`merge`をいっぺんにやる。ローカルに変更点があるとエラーになるので事前にスタッシュして回避する。

# merge

- 「feature_1111」というブランチの差分を今いるブランチに取り込む

```
$ git merge --no-ff feature_1111
```

今やってる案件、絶対feature_1111とコンフリクトするわーみたいなときに使えます。
ただし、MRを出すと、feature_1111で改修した内容も差分として表示されるので、管理者にリモートのマージをしてもらうときは順番が逆にならないように気をつける必要があります。

# update-index

- 「index.php」をgitの管理下から外す

```terminal
$ git update-index --skip-worktree index.php
```
- gitの管理下から外しているファイルを確認する

```terminal
$ git ls-files -v | grep ^S
```
- 「index.php」をgitの管理下に戻す

```terminal
$ git update-index --no-skip-worktree index.php
```

ローカルで変更しておきたいけどorigin/developにmargeしたくないような設定系のファイルは、`--skip-worktree`でgitの管理下から外しておきます。
ただ、origin/developの該当ファイルが更新されるとpullできなくなるので、`--no-skip-worktree`でgit管理下に戻します。
はじめてのThree.js 5章 日記

[はじめてのthree.js](https://www.amazon.co.jp/dp/4873117704)

#新たに知った知識
- 2dオブジェクトに穴を開ける発想
- thetaで結構変形できる
- 片方を負の値でシリンダー作ると杯みたいな形ができる![Screen Shot 2020-05-28 at 23.19.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181534/ac1d9e09-9fb7-d6bb-b88e-033ee2e3a681.png)
- torusknotのpとqはそれぞれ結び目が軸の周りに何回巻きつくかと内側の穴の周りに何回巻きつくか(画像はp=9, q=11 のエンゼルフレンチ)
![Screen Shot 2020-05-28 at 23.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181534/353ec638-4e6a-1ed8-ab65-25302b25321b.png)

#気づいたこと
- thetaのguiの値のmaxがなぜ6.3なのかと思ったけど単純に2Π


#wow moment
- エンゼルフレンチ

#まだ解決していない点



[6章はこちら](https://qiita.com/asadsexyimp/items/efe083e4e4779465c846)
【PostgreSQL】重複行削除で使えるDISTINCT ON

## はじめに
ある列の重複は削除した上で他の列も含めて取得したいなどのケースで便利な`DISTINCT ON`という構文がPostgreSQLには存在する。
この構文は標準SQLには存在しないので注意。
標準SQLの普通の`DISTINCT`は特定の列の重複のみ除外して他の列も取得ということはできず、重複除外に指定するか取得しないかしかできない。

この構文を使用しなければ`GROUP BY`や副問合せを駆使しなければならないのでそれに比べるとかなり直感的に書くことができる。

下記のサンプルテーブルに対して使用していく。

```sql
postgres=# create table t1 (c1 int, c2 int);
postgres=# insert into t1 values (1, 1), (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 2), (2, 3);
postgres=# select * from t1;
 c1 | c2
----+----
  1 |  1
  1 |  1
  1 |  2
  1 |  3
  2 |  1
  2 |  2
  2 |  2
  2 |  3
(8 rows)
```

## DISTINCT ONの使い方
`SELECT`キーワードと列指定の間に`DISTINCT ON (式1, 式2,...)`とすることで使用できる。
式には単に列名を使用するのが基本的な使い方になる。
式はそれぞれ個別に評価され、すべての式の結果が同じものは重複しているとして最初の行しか出力されない。
このときの最初の行は`ORDER BY`していない限りどのレコードが選ばれるかは確定できないことに注意。

### 特定列の重複を削除した上で全列を取得
#### c1を指定する
```sql
postgres=# select distinct on (c1) * from t1;
 c1 | c2
----+----
  1 |  1
  2 |  1
(2 rows)
```
c1内での重複がなくなった。

#### c2を指定する
```sql
postgres=# select distinct on (c2) * from t1;
 c1 | c2
----+----
  1 |  1
  2 |  2
  1 |  3
(3 rows)
```
c2内での重複がなくなった。

### 完全重複行削除
これについては標準SQLでDISTINCTを使用するのと同じなのであえて使う必要はないが問題なくできる。

```sql
postgres=# select distinct on (c1, c2) * from t1;
 c1 | c2
----+----
  1 |  1
  1 |  2
  1 |  3
  2 |  1
  2 |  2
  2 |  3
(6 rows)
```
`1 1`と`2 2`で重複していた行が削除された。

ちなみにただのDISTINCTを使うとこうなる。

```sql
postgres=# select distinct c1, c2 from t1;
 c1 | c2
----+----
  1 |  1
  2 |  3
  1 |  3
  2 |  2
  1 |  2
  2 |  1
(6 rows)
```
順番は不定とはいえけっこう差が出た。
重複除外のタイミングの違いだろうか？

## 参考
https://www.postgresql.jp/document/11/html/queries-select-lists.html#id-1.5.6.7.6.2
VSCode上のマークダウン とDraw.ioでドキュメントを作成する

# はじめに

VSCodeの機能拡張 Draw.io Integrationがリリースされ、VSCodeで作画ができるようになりました。
文章をマークダウン、図形をDraw.ioを使ってドキュメント化すれば、ソースコード含め全ての成果物をVSCodeで完結できます。　また、図形をテキスト形式であるsvgで作成すればマークダウンと共にgitで管理するのに都合がよいです。

ということで、Draw.ioでsvg形式で画像ファイルを作成し、マークダウン（mdファイル）に埋め込む方法を調べました。

|環境|                            |
|----------------|----------------------------|
| OS             |macOS Caralina 10.15.4        |
| VScode         | 1.45.1 |
|Draw.io Integration | 0.6.6 |


# VSCode拡張機能 Draw.io Integration導入方法

先人の方がまとめて下さってます。⇒ [VSCodeでDraw.ioが使えるようになったらしい！](https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e)


# Draw.ioでsvg形式のファイルを作成する

拡張子を`.drawio.svg`または`.dio.svg`にしてファイル作成すると、Draw.ioに関連付けられ、svg形式のファイルを作画＆作成できます。
<img width="809" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/060596cf-5d76-b338-522e-1276e134c996.png">


# mdファイルにsvgを埋め込む

mdファイルに以下のように作成した画像（.drawio.svg)を埋め込むことができます。
マークダウン構文`![](ファイルパス)`またはimgタグで記述します。
<img width="1024" alt="2−1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/5398c2aa-7d8f-31cb-dbf7-e6cdf1c10606.png">

# mdファイルの編集画面からDraw.io画面を開ければ...

マークダウン構文で記載した場合、画像ファイルを cmd + クリック で開くことはできますが...
<img width="1024" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/4a2e1640-a4a7-8a81-9bf9-cb80e393d1e9.png">

残念ながら、テキストエディタが開いてsvgのソースが表示されます。
<img width="1024" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/ecbcfa7b-ec5a-da16-f89b-820e9bddddcc.png">

Draw.io Integrationはまだリリースされたばかりなので、バージョンアップして安定性とVSCodeとの親和性があがることを期待します。
(SpotMicroAI) 1．ハードウェアの準備

# はじめに

この記事は書きかけです。今週中を目途に完成予定。

# 準備物

![写真 2020-04-04 23 40 55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256233/7fd3763a-7269-8adf-65da-e2a07d27160b.jpeg)
![写真 2020-04-05 0 07 21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256233/ab2b3042-b16a-64e1-82da-af4c18d3f4aa.jpeg)


ToDo: BOM
Name, Quantity, Url, Price, ...
Ink, 筆
PCA9685, jetson

# 3Dプリンタパーツの詳細

以下のような写真をいろいろ載せる

![スクリーンショット 2020-05-24 10.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256233/966d545d-cfb7-a7ef-247e-937d772ac7f2.png)
ViewModel と移譲コマンド

## はじめに

オレオレ解釈の覚え書き　その８

移譲コマンドについてまとめます。

## 本文

移譲コマンドとは ViewModel で宣言されるデリゲートです。View からバインドされることを前提にしており、コントロールの決められたプロパティとバインドすることで、コントロールへの操作に対応する処理を ViewModel で実装することができます。

移譲コマンドは ICommand インターフェースとして公開され、これを実装するクラスは、Prism であれば DelegateCommand、Livet であれば ViewModelCommand、MVVM Light Toolkit であれば RelayCommand といった具合にフレームワーク独自の形で提供されています。

今回は Prism を使い、画面上のボタンがクリックされたときに実行される処理を ViewModel に移譲してみます。ViewModel に ICommand インターフェースのプロパティを宣言し、DelegateCommand クラスで初期化します。View には Button コントロールを配置し、Command プロパティでバインドします。これにより、画面に配置されたボタンがクリックされると、ViewModel のメソッドが呼び出されるようになります。

```cs:ViewModel
using Prism.Commands;
using System.Windows.Input;

namespace TestApp.ViewModels
{
    public class MainWindowViewModel
    {
        public ICommand ShowMessageCommand { get; }

        public MainWindowViewModel()
        {
            this.ShowMessageCommand = new DelegateCommand(() => this.ShowMessage());
        }

        private void ShowMessage()
        {
            // メッセージを表示する処理
        }
    }
}
```

```xml:View
<Window x:Class="TestApp.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:p="http://prismlibrary.com/"
        p:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <Button Command="{Binding ShowMessageCommand, Mode=Onetime}" Content="メッセージ表示" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    </Grid>
</Window>
```

## おわりに

View を起点にした処理を定義するための移譲コマンドについてでした。
原則的には View はビジネスロジックを扱えないため、処理を ViewModel に任せる必要があり、本稿の移譲コマンドを使用します。逆に ViewModel では描画ロジックを扱えないため、前回の相互作用処理を使い View に依頼します。これらを組み合わせて両層でやり取りをしつつ、処理を組み立てていきましょう。

次回は MVVM を語るうえで特に重要な仕組みである、変更通知プロパティについてまとめます。（これがなければ ViewModel のプロパティの変更を View に反映できません。本来は最初にやるべきでした。）
個人アプリ制作人気５

#今日の成果
非同期通信によりメッセージ機能ができた。
AWSでのssl化の流れ
Route53でドメインを購入（有料です）
AWS Certificate Manager(ACM)でSSL証明書の発行
ロードバランサーでALBにhttpsの設定を入れて作成
Route53でAレコードのエイリアスを作成(現在ここで苦戦中)
Windows10+VSCode+.NET CoreでC#開発環境を作ろう！

C#を用いてプロジェクトを進めることになりました。
プロフィールにもある通り、私のメイン言語はC言語。
レガシー脱却への追い風をいただけたと思い、このチャンスをフル活用させていただきます！

# Visual StudioではなくVSCodeを使う

普段からWindowsアプリケーション等を作成しているのであれば
本家Visual Studioを使用している方も多いと思いますが、
言語学習としてあちこちの言語を切り替える身としてはVSCodeが沁みついております。
今回もVSCodeでC#開発環境を作成してみようと思います。

※注：2020/05/28現在、Visual Studioを使用する方はVisual Studio 2019 16.4以降が推奨となります。理由は.NET Core 3.1との連携となります。


## VSCodeのインストール
[こちら](https://code.visualstudio.com/)からインストールできます。
オフラインPCで使用する場合は[こちら](https://qiita.com/mekemeke421/items/98d5a3e2f2cc7517a6ab)を参照ください。

## .NET Core SDKのインストール
[こちら](https://dotnet.microsoft.com/download)から.NET Core SDKをダウンロードします。
2020/05/28現在では.NET Core SDK3.1.3が推奨されています。

インストールは選択肢もなく簡単でした。
<center>![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342276/a5c53ef2-e0fc-0948-79c1-42e2473ff6d0.png)</center>
<center>![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342276/838495d3-6c71-62af-c0f6-5168e47a158b.png)
<center>![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342276/738ead34-8188-450f-7225-33ceced7b16f.png)

## 拡張機能のインストール
C#用の拡張機能として以下をインストールしました。

[C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)
~~[C# FixFormat](https://marketplace.visualstudio.com/items?itemName=Leopotam.csharpfixformat)~~
※formatterでC#とC# FixFormatどちらも認識するのでC#のみインストールしました。

# Hello World!!
いざ、Hello World!!

1. HelloWorldフォルダを作成する（プロジェクト名/namespace名）
2. コンソールにて作成したフォルダで`dotnet new console`を実行する
3. フォルダ内でProgram.csを作成する（クラス名）
4. Console.WriteLineの行にブレークポイントを設定してF5でデバッグ実行

まずは.NET Core SDKでプロジェクトを作ります。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342276/a5597ea2-d7eb-4cfb-d392-a820bbdabc72.png)

そのプロジェクトにソースを追加してデバッグ実行するわけですね。

ソースは以下です。

``` C#:Program.cs
using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

F5を押した結果、
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342276/4d412fed-a08f-3b7a-8e5f-2fe6f6d05489.png)

止まりました！
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342276/c2961f00-d990-454b-8078-5db44371770d.png)

コンソール出力ばっちり！

実行だけの場合はコンソールで`dotnet run`で動きます。

# まとめ
Hello Worldだけですが、環境を作成して確認するのに
ググる時間を入れても１時間かかりませんでした。
環境作成のみであれば5分程度とお手軽でした。
**Let's C#!!**

# 参考

- [C# および Visual Studio Code の使用を開始する](https://docs.microsoft.com/ja-jp/dotnet/core/tutorials/with-visual-studio-code)
- [Visual Studio CodeでC#プログラミング](https://qiita.com/shuhey/items/38ce475b3c0c90862d2c)
【Navigation】 Single Activity構成時のアナリティクスのスクリーン計測Tips

Navigationコンポーネントを使い、アプリをSingle Activity構成にした際のアナリティクス（[Firebase Analytics](https://firebase.google.com/docs/analytics)）のTipsを紹介します。

# 存在感の強い `MainActivity` 
アナリティクスを使う場合、Activityは自動で計測されるため、特に意識せずとも画面遷移がトラッキングされ便利です。
https://firebase.google.com/docs/analytics/screenviews

しかしながら、自動計測はActivityのみのため、Navigationコンポーネントを使ったSingle Activity構成の場合に、そのままだと **存在感の強いMainActivity** が出来上がってしまいます。
<img width="248" alt="スクリーンショット_2020-05-28_11_11_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/79cd1211-8081-3c2d-15d3-c7db8c4ab55f.png">

# `addOnDestinationChangedListener` を使うとｼｭｯと対応できる💡
存在感の強いMainActivityを無くすために、各Fragmentにトラッキング用の仕組みを入れても良いかと思いますが、Navigationの画面遷移時に呼ばれる `NavController#addOnDestinationChangedListener` を使うことでｼｭｯと対応することができます。

https://developer.android.com/reference/androidx/navigation/NavController#addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener)

## サンプルコード
`addOnDestinationChangedListener` を使ったサンプルコードです。

```kotlin:MainActivity.kt

val navController: NavController = ...

navController.addOnDestinationChangedListener { _, destination, _ ->
    // ① 型チェック
    if (destination is FragmentNavigator.Destination) {
        // ② Fragmentのクラス名を取得
        val screenName = destination.className.split(".").last()
        // ③ 送信
        FirebaseAnalytics.getInstance(this).setCurrentScreen(this, screenName, screenName)
    }
}
```

ポイントを解説します。

### ① 型チェック
`addOnDestinationChangedListener` の `destination` は型が `NavDestination` となっており、そのままだとクラス名が取得できません。

そこで、 `FragmentNavigator.Destination` かどうかをチェックし、スマートキャストでクラス名（ `className` ）を取得できるようにします。

ちなみにNavigationでDialogFragmentを使っている場合はこれだと対応出来ないので、 `DialogFragmentNavigator.Destination` かどうかのチェックも必要になりそうです。

### ② Fragmentのクラス名を取得
`FragmentNavigator.Destination#className` は `com.example.ExampleFragment` のようにパッケージ名も含んでいるため、 雑に `split(".").last()` とすることでFragmentのクラス名だけを抽出しています。

### ③ 送信
②で抽出した `screenName` を `setCurrentScreen()` で送信します。
[setCurrentScreen (Activity activity, String screenName, String screenClassOverride)](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics#public-void-setcurrentscreen-activity-activity,-string-screenname,-string-screenclassoverride)

以上で、Single Activity構成時でも画面遷移時にいい感じにトラッキングができるようになりました。

# まとめ
簡単ではありますが、Navigationコンポーネントを使い、アプリをSingle Activity構成にした際のアナリティクスのTipsを紹介しました。

`addOnDestinationChangedListener` 便利 :relaxed:
Dockerでapt-get upgrade

#はじめに
Dockerでイメージをビルドしようとすると、ユーザインタラクションを避ける必要があります。ところがapt-get upgrade　したときのサービスのリスタートの確認では、一般につかわれている -y オプションをつけてもYes/Noの確認がでてしまいdocker build が停止してしまいます。

#問題点
Dockerfile内でapt-upgradeすると、-yをつけようが--force-yesをつけようが--allow-downgradesをつけようが--allow-remove-essentialをつけようが--allow-change-held-packages をつけようが、以下のプロンプトが避けられない

```
Configuring libssl1.1:arm64
There are services installed on your system which need to be restarted when
certain libraries, such as libpam, libc, and libssl, are upgraded. Since these
restarts may cause interruptions of service for the system, you will normally
be prompted on each upgrade for the list of services you wish to restart.  You
can choose this option to avoid being prompted; instead, all necessary restarts
will be done for you automatically so you can avoid being asked questions on
each library upgrade.

Restart services during package upgrades without asking? [yes/no]
```
で、これがでるとdocker build がとまって、どうしようもない感じ

#解決策
debconf-set-selections
コマンドに設定をいれることでプロンプトのデフォルトの選択肢が選択できます。
'* libraries/restart-without-asking boolean true'をわたすことで、上記のプロンプトでとまるのを抑止できました。
Dockerfileに以下を設定

```
RUN echo '* libraries/restart-without-asking boolean true' |  
debconf-set-selections
```
でもって、このあとの
apt-get upgrade -y
では上記のプロンプトでは止まらなくなります。

#利用例
[Darknetをビルド済なXavierNX/JetsonNANOのDockerイメージを作成](https://qiita.com/sowd0726/items/0da7128150f4a11ad30f)でつくったイメージだと、apt-upgradeがおこなわれなくて、いろいろ起きますが、これで、apt-get updateとupgrade部分を自動化することができます。

```Dockerfile
FROM darknet:100
RUN apt-get -y update
RUN echo '* libraries/restart-without-asking boolean true' |  debconf-set-selections
RUN apt-get -y upgrade
RUN apt -y install xfce4-terminal
CMD ["/bin/bash"]
```
Google ColaboratoryでJavaのJupyter Kernelを使う

前回([Google ColaboratoryでJavaプログラムを動かす](https://qiita.com/natsuume/items/24e152d4892710019a52))の続き

# 前回との違い
ちゃんとColab上でJavaのJupyter Kernelを使ってpythonを使うのと同じようにJavaを動かす

# 手順
## 1.  colab上から`.ipynb`をダウンロードする
そのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34789/590a788d-0c92-5852-009d-3403285160e6.png)

## 2. `.ipynb`を書き換える
元の内容は下記のようになっている

```ColabJava.ipynb
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "ColabJava.ipynb",
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "hXaCsZGNbimN",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}
```

`kernelspec`を書き換える

```変更後.ipynb
    ...
    "kernelspec": {
      "name": "java",
      "display_name": "Java"
    }
    ...
```

## Jupyter Kernelを入れる
変更した`.ipynb`をノートブックをアップロードからアップロード
今回は[IJava](https://github.com/SpencerPark/IJava)を使用するので、開いたcolabで下記セルを実行

```
!git clone https://github.com/SpencerPark/IJava.git
%cd IJava/
!./gradlew installKernel
```

最初はJava Kernelが無い状態なので下記のようなメッセージが左下に表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34789/3a649842-686d-0439-196f-d8ff04efa2b4.png)
ので、上のセルが実行完了したらノートブックの設定を改めてJavaに合わせて保存し直す。

完全勝利！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34789/51054c7e-439c-68de-ed37-4d108d8534ff.png)

# おまけ(外部ライブラリを使う)
今回使用したIJavaのRead meにもちゃんと書いてあるが、外部ライブラリも普通に読んで使える。(すごい！)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34789/b414693e-fe3d-1d69-8955-5e5b23c5d408.png)
JavaScript 配列と繰り返し

# 配列と繰り返し処理
配列と繰り返し処理の1例を紹介していきます。
（例） for文を使って、配列の要素を順番に取り出す

```javascript:sample.js
const color = ["red", "blue", "yellow"];

for(let i = 0; i < color.length; i++) {
    //iが配列内の要素の数だけループする
  console.log(color[i];//変数iを用いて要素を取得
}
```

```console
red
blue
yellow
```

for文を使用することで配列の中に格納されているすべての値を簡単に出力することができます。
また、`配列.length`とすることで配列の要素数を取得できます。
[Rails]strftimeあれこれ

# 前置き
現在Railsでマッチングアプリ作成中ですが、strftimeをよく使うので、すぐ見れるよう書き方をまとめておきます。

# strftimeって？
日時データを好きなようにビューに表示出来るメソッドです。

# やってみよう

今回はcreated_atでやっていきます。

デフォルトだとこうですね。後ろの+0900は使わなさそうですね。
2020-05-22 16:11:01 +0900

```ruby
created_at.strftime("%Y-%-m-%-d %-H:%M")

# 表示　2020-5-28 20:25
```

こんな風に文字列変換出来ます。
適当に記号並べているわけではありません。笑

下記に書式を一部添付しておきます。
もっと知りたい方はこちらにあります。
引用元[pikawaka](https://pikawaka.com/rails/strftime)

| 書式 | 返り値 | 説明 |
|:--|--:|:--|
| %Y | 2019 | 西暦を4桁の数で取得する※西暦1年は「0001」 |
| %m | 01 | 月を必ず2桁の数字で取得する（01-12） |
| %-m | 1 | 月を1桁か2桁の数字で取得する（1-12） |
| %d | 01 | 日付を必ず2桁で取得する（01, 02 ... ） |
| %-d | 1 | 日付を1桁か2桁で取得する（1, 2 ... 10, 11 ...） |
| %H | 12 | 24時間制の時刻を必ず2桁で取得する（00-23） |
| %-H | 12 | 24時間制の時刻を1桁か2桁で取得する（0-23） |
| %I | 12 | 12時間制の時刻を1桁か2桁で取得する（1-12） |
| %M | 00 | 分を取得する（00-59） |
| %S | 00 | 秒を取得する（00-60）※60はうるう秒 |

ありがとうございました！
レスポンシブデザイン

# プログラミングの勉強日記
2020年5月28日　Progate Lv.61

##レスポンシブデザイン
　画面幅を合わせてレイアウトが柔軟に切り替えられる。レスポンシブデザインが適用されていないと、画面幅を狭めるとコンテンツが収まらなくなってしまうことがある。
　レスポンシブデザインを適用するためには、`<head>`タグ内にviewportを設定する。また、responsive.cssの読み込みではstylesheet.cssにメディアクエリ用のCSSを記述しても問題ないが、整理しやすいようにCSSを分割しresponsive.cssにメディアクエリ用のCSSを記述する。<font color=blue>※responsive.cssの読み込みは必ずviewportの設定よりも後に記述する</font>

```html
<head>
  <meta name="viewport" content="width=device-width,initial-scale=1.0"> //viewportの設定
  <link rel="stylesheet" href="responsive.css"> //responsive.cssの読み込み
</head>
```

##メディアクエリ
　プラウザの画面サイズに応じてCSSのスタイルを設定できる手段のこと。`@media(条件){...}`という形で記述する。この条件に当てはまるときのみCSSが適用される。条件には最大幅（`max-width`）と最小幅（`min-width`）を指定できる。条件を指定するときの値の部分を<font color=orange>ブレイクポイント</font>という。

```css
@media(max-width:1000px){
  /*1000px以下の時に適用したいCSSを記述する*/
}
```

###レイアウトの崩れを直す

<img width="676" alt="上級編.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/581ebe5a-44fe-b984-974a-00303d379e75.png">
　要素（水色の四角）がwidth:25％で指定されているのところで、左右のpaddingを加えると要素幅の要素の合計が100％を超えてしまい、レイアウトが崩れてしまう。そこで、右のようにするためには`box-sizing:border-box`を使うと要素の幅の合計にpaddingとborderが含まれるようになる。<font color=blue>しかし、marginはbox-sizingでの合計値に含まれない。
　また、指定するときには`*`（アスタリスク）ですべての要素に対してCSSを適用することが推奨されている。</font>
　
###floatと親要素の関係
　通常は親要素の高さは子要素を包む高さとなる。しかし、<font color=blue>子要素がfloatのとき親要素の高さは0になってしまう。</font>（float(浮いている)は親要素から見るとfloatの子要素は存在しないように見えてしまうから）
　→`float:left`は`clear:left`で浮いている状態を解除できる。
　　☆`float:left;`を適用するためだけの空タグを用意する。`<div class="clear"></div>`を入れる。

###要素の表示/非表示
　要素の非表示：`display:none;`
　要素の表示 ： `display:block;`
SAPUI5でデータ値によってカラーリングできるテーブルを作る

#はじめに
SAPUI5で開発をしている際に
よくsap.ui.table.Tableを使うのですが、
特定の値が入った行を自由に色分けするようにしたいな、と思い実装する機会があったので
備忘録として記事を書かせていただきます。

#やりたいこと
行ごとに色分けできるテーブルをつくる

#前提
画面にui.table.TableがController内で一つ作成されていることを前提として話を進めます。
今回初期の画面はこんな感じです。
<img width="1279" alt="スクリーンショット 2020-05-28 21.55.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411770/0a652743-26e1-1f81-71c8-58bc5b36486c.png">

テーブルを作成した関数はこんな感じです。

```
	createTableContents: function () {
		var semanticPage = sap.ui.getCore().byId("semanticPage");

		// テーブル生成
		var Table = new sap.ui.table.Table({
			id: "table",
			visibleRowCount: 10,
			rows: "{path:'data>/results'}",
			width: "100%",
			selectionMode: "None",
			enableSelectAll: true,
			ariaLabelledBy: "title",
			columns: [],
			showNoData: true
		});

		//テーブルタイトルを追加
		var Title = new sap.m.Title({
			id: "tableTitle",
			text: "テストテーブル"
		});

		var toolbar = new sap.m.Toolbar({
			content: Title
		});
		Table.addExtension(toolbar);

		// セマンティックページのコンテント部に追加する
		semanticPage.setContent(Table);

		var columnKeys = ["customer", "drink", "year"];
		var column;
		for (var i = 0; i < columnKeys.length; i++) {

			column = new sap.ui.table.Column({
				id: columnKeys[i],
				width: "auto",

				// カラムヘッダ表示内容 
				label: new sap.m.Label({
					"width": "100%",
					// *i18n clm
					"text": columnKeys[i],
					"textAlign": "Center"
				}),
				// カラム内データ情報
				template: new sap.m.Text({
					text: "{data>" + columnKeys[i] + "}",
					width: "100%",
					wrapping: false
				})
			});
			Table.addColumn(column);
		}
	}
```

#sap.m.Textを継承する
drinkの列が「ハイボール」のデータを強調表示させたいな、と思ったのでその列が強調表示されるように作っていきたいと思います。
sap.m.Textを継承し、新しく1つ構造を定義してみます。以下ソースです。

```
sap.m.Text.extend("ColorText", {
		metadata: {
			properties: {
				color: sap.ui.core.CSSColor
			}
		},
		renderer: {},
		onAfterRendering: function () {
			if (Text.prototype.onAfterRendering) {
				Text.prototype.onAfterRendering.apply(this, arguments);
			}
			
			var elm = this.$().parent();
			while (elm[0].tagName !== "TR") {
				elm = elm.parent();
			}
			var rowText = elm[0].innerText;
			if (rowText.indexOf("ハイボール") >= 0) {
				elm.css("background-color", "#f0e68c");
			} else {
				elm.css("background-color", "#FFFFFF");
			}
		}
	});
```

sap.m.Textを継承して新たにColorTextを作成しました。
レンダリングが完了した際にthis.$().parent()でそのテーブル内の行の要素を取得し、
”ハイボール”という単語の含む行のCSSをいじる作りになっています。

#ソースコードを編集
次に上記のテーブルのColumnを定義している部分を少しいじります。

```
column = new sap.ui.table.Column({
		id: columnKeys[i],
		width: "auto",
		label: new sap.m.Label({
			"width": "100%",
			// *i18n clm
			"text": columnKeys[i],
			"textAlign": "Center"
		}),
		// *** ここを変更 ***//
		template: new ColorText({
			text: "{data>" + columnKeys[i] + "}",
			width: "100%",
			wrapping: false
		})
	});
```

templateのsap.m.Text部分を先ほど継承したColorTextに変更します。
画面を確認してみるとうまくハイボールの列だけ色を変えることができました。
<img width="1282" alt="スクリーンショット 2020-05-28 22.15.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411770/9650e99b-08a6-74f0-1a29-68d9483a84f6.png">

#終わりに
onAfterRendering部分を色々とアレンジすればもっと自由性が高く色を変えることもできると思いました。
継承については自分もまだまだあまり理解できていないのでもっと勉強していきたいと思った次第です。
pythonのrelative_to()で相対パスを指定しようとしたらはまった

# 概要
絶対パスから相対パスを取得するために以下のようなコードを実行した

```python

import pathlib

p = pathlib.Path()
file_path = 'image-db'
file_path_rel = p.cwd().relative_to(file_path)
```

エラー

```bash

ValueError: '/directory/of/python' does not start with 'image-db'
```

relative_to()の中身がカレントディレクトリより外にあると動かないらしい．

# 対策
os.path.reipath('行先', '起点')を使えば複雑な相対パスも取得できる．

```python
file_path_rel = os.path.relpath(file_path, os.getcwd())
```

# 参考サイト
https://hibiki-press.tech/python/os_path_abspath/1021
効率よくコーディングするための考え方

## はじめに

久しぶりに丸々一本実装したのですが、思った以上に時間がかかってしまいました。
何がいけなかったのかを反省するとともに、効率の良いコーディングに結び付けるにはどうするかについての徒然メモです。


## 動作確認の時間を減らす

### コンパイルの回数を減らす

1つ実装するたびにコンパイルして動作確認をしていいると、着実に少しずづは進んでいきますが、実装のスピードは遅くなります。ある程度のまとまった単位の実装が終わったタイミングで動作確認するように意識しましょう。

### インプットのデータ量は最小減にする

データの読み込時間は意外と侮れません。確認したい箇所に到達するまで1分かかるのと10秒ですむのとでは、10回確認した場合であっても9分近くの差が発生します。
一定量のデータを使った動作確認はテスト工程に任せましょう。
但し。パフォーマンスを意識する必要がある場合は、別途、パフォーマンス検証を事前にする必要があります。

### デバッグログをしっかり仕込む

想定通りに動かなかった時の原因特定でハマるとかなりの時間を費やします。
デバッグログは、バグの原因特定だけでなく、各処理が想定通りに動作していることを確認する際にも効力を発揮します。


## 変数・定数

### 極小スコープ以外は固有の変数名を付ける

「s」や「i」、「row」や「data」などの変数名で宣言した場合、他でコードを借用した際に、借用先のコードと変数名が被ることがあります。
結果、借用元か借用先のどちからの変数名を変更することになりますが、変更漏れによるバグが意外と多いです。また、同じことをしている部分の変数名が処理によって異なるとメンテもしづらくなります。
汎用的な変数名は、他のロジックが這いこむ余地がないくらいの極小スコープでのみ使用するようにしましょう。

### 別の変数の一部分となる変数名を定義しない

IDEが貧弱な場合「item_code」と「item_code_limit」のような名称を付けると、「item_code」で検索すると「item_code_limit」まで引っ掛かってきます。リファクタリンク機能のない環境で置換をせざるを得ない場合も危険です。
同様の理由で、スコープが長い変数・定数に「s」や「i」のような名前をつけるのもメンテしづらくなります。

### 同じ値を関数ごとに別の名前で定義しない

「item_code」が「item_code」として意味するのであるならば、どの関数の中でも同じ名前で宣言しましょう。「item_cd」「ic」「item」みたいに、別名で宣言されると可読性が下がります。よそからコードを拝借した場合は、面倒がらずに統一感のあるソースに整形しましょう。


## SQL

### insert、update、delete、truncate はテーブル名まで１行で書く

今回の趣旨とは外れますが、データ更新系のSQLは、1行でテーブル名まで書いておくと、そのテーブルで grep すれば、CRUDを簡単に調査できます。


## おわりに

一定のレベルに達していれば、コーディングの効率を上げることは、品質のよい成果物を作成することに直結すると思っています。
こんなことを意識したら、コーディングの効率があがりましたといった実体験のコメント頂けると嬉しいです。
try-with-resourcesとAutoCloseable

try-with-resourcesは大体IOExceptionが発生するものに対してのみ使えると思っていましたが、。
AutoCloseableで様々なクラスに対して有効化できるらしい。

#try-with-resourcesについて
try-with-resourcesステートメントは、1つ以上のリソースを宣言するtryステートメントです。 リソースは、プログラムが終了した後に閉じる必要があるオブジェクトです。 try-with-resourcesステートメントは、各リソースがステートメントの最後で確実に閉じられるようにします。 java.io.Closeableを実装するすべてのオブジェクトを含む、java.lang.AutoCloseableを実装するすべてのオブジェクトをリソースとして使用できます。

>Oracle Java Documentation
>https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

つまり、AutoCloseableを実装すればtry-with-resourcesに対応できる！

#AutoCloseableについて
閉じられるまでリソース（ファイルまたはソケットハンドルなど）を保持できるオブジェクト。
AutoCloseableオブジェクトのclose（）メソッドは、リソース仕様ヘッダーでオブジェクトが宣言されているtry-with-resourcesブロックを終了すると、自動的に呼び出される。
この構造により、迅速なリリースが保証され、リソース不足の例外や、そうでなければ発生する可能性のあるエラーが回避されます。
java.langパッケージに含まれている。

>Interface AutoCloseable
>https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/AutoCloseable.html

try-with-resourcesでtry文が終わった時に自動でクローズ処理してもらいたい、
またクローズ時に特殊な処理を挟んでほしい対象のリソースに対してAutoCloseableインターフェースを実装する。

##AutoCloseableとCloseableについて
AutoCloseableと似て非なるものでCloseableがある。
こちらはAutoCloseableを継承したインターフェースであり、こちらはjava.ioパッケージに含まれている。
AutoCloseableは例外発生時にExceptionをスローするが、CloseableはIOExceptionをスローする。


java.ioパッケージにあるほとんどのクラスでCloseableが実装されている為、
FileOutputStreamやBufferedReaderなどのクラスはtry-with-resourcesで宣言できる。

#使用
try-with-resourcesで自動的にリソースの開放したい場合、
リソース解放時にほかの処理も加えたい場合などに使用する。

```SampleTryWithResources.java
public class SampleTryWithResources {
    public static void main(String[] args) {

//     Closeable(AutoCloseable)を実装しているクラスを
//    try-with-resourcesで宣言すると、try文終了時に自動でclose()が実行される。
        try (SampleCloseAble sca = new SampleCloseAble()) {
            System.out.println("Try-With-Resources開始");

            System.out.println("try文実行中");

            System.out.println("Try-With-Resources終了");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class SampleCloseAble implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("Closeableクラスのclose()実行");
    }
}
```
```sys.out
Try-With-Resources開始
try文実行中
Try-With-Resources終了
Closeableクラスのclose()実行
```
try文の中の処理が終了した後に実装したcloseメソッドが呼び出されている。
ただし、次のようにtry文の中で例外が発生すると、catch文の前にcloseメソッドが呼び出されることに注意すること。

```SampleTryWithResources2.java
public class SampleTryWithResources2 {
    public static void main(String[] args) {

        try (SampleCloseAble sca = new SampleCloseAble()) {
            System.out.println("Try-With-Resources開始");

            System.out.println("try文実行中");

            throw new Exception();
        } catch (Exception e) {
            System.out.println("Try文例外終了");
            e.printStackTrace();
        }
    }
}
```
```sys.out
Try-With-Resources開始
try文実行中
Closeableクラスのclose()実行
Try文例外終了
java.lang.Exception
	at ...
```

処理の順番は
Try文の中の処理　⇒　AutoCloseableのcloseメソッド ⇒　catch文の中の処理
となる。
ArduCAM Mini Cameras Tutorialを和訳してみた

# 0.原文
https://www.arducam.com/knowledge-base/mini-tutorial/

Arduino unoや、その他Raspberry Piなどのマイコンに取り付け可能なカメラArduCam Mini。
その公式チュートリアルを和訳してみました。

訳が間違っている等の責任は取りません。

感想としては

>The ArdCAM library is designed for Arduino platform,which is composed by four sub-libraries It is ArduCAM,ArduCAM_Touch,0V7670FIFO and UTFT4ArduCAM_SPI.

など、明らかにおかしい英語があって、読みにくかった。
また、PCのOSがwindowsであることを前提にして書いてあった。


# 1.ArduCAM Miniカメラのチュートリアル
## 1-1. 概要
このチュートリアルはArduino UNO R3上でArduCAM Mini カメラ(2メガピクセル/5メガピクセル)を動作させるためのデモである。
![image.png](https://www.arducam.com/wp-content/uploads/2017/12/ArduinoConnection-.jpg)

## 1-2. 用意するもの
このデモでは、次のものを用いている。

- Arduino UNO R3 マイコンボード 1つ
- ArduCAM Mini カメラ(2メガピクセル) 1つ
- デュポンコネクタワイヤ オス-メス 8つ

## 1-3. Arduino IDEを通じてArduCAM Miniカメラを動かす

### 1-3-1. ArduCAM専用ライブラリのダウンロード
最新のArduCAMライブラリは次のリンクからダウンロードできる。
https://github.com/ArduCAM/Arduino.
ArduCAMライブラリはArduinoプロットフォーム用に設計されている。
またこのライブラリは、以下の4つのサブライブラリによって構成されている。

- ArduCAM
- ArduCAM_Touch
- 0V7670FIFO
- UTFT4ArduCAM_SPI

ダウンロードの際、これら4つのサブライブラリは、`Arduino/libraries`ディレクトリの直下に保存する必要がある。ここを誤ると、Arduino IDEがライブラリを正しく認識できない。
また、README.mdには必ず目を通していただきたい。
![](https://www.arducam.com/wp-content/uploads/2017/05/library.jpg)

### 1-3-2. カメラの設定
`Arduino/libraries/ArduCAM/memorysaver.h`ファイルを開き、次のいづれかのカメラモジュールを有効化する。

- OV2640_MINI_2MP
- OV5642_MINI_5MP_PLUS
- OV5640_MINI_5MP_PLUS 

![](https://www.arducam.com/wp-content/uploads/2017/05/Camera-Configuration.jpg)

同時に有効化できるカメラは高々1台である。

### 1-3-3. Arduino IDEの利用

Arduino IDEを起動し、`Tools`→`Board`→`Arduino/Genuino Uno`を選ぶ。

![](https://www.arducam.com/wp-content/uploads/2017/06/uno.jpg)

`File`→`Examples`→`ArduCAM`→`mini`→`ArduCAM_Mini_Video_Streaming`を選び、
これをマイコンボードへ書き込む。

![](https://www.arducam.com/wp-content/uploads/2017/06/uno_VIDEO_STREAMING.jpg)

![](https://www.arducam.com/wp-content/uploads/2017/06/cs.jpg)

### 1-3-4. ホストアプリケーションの起動

`Arduino/libraries/ArduCAM/examples/host_app/ArduCAM_Host_V2.0_Windows`
を開く。

![](https://www.arducam.com/wp-content/uploads/2017/06/hostapp2.jpg)

ArduCAMライブラリについてのさらに詳しい情報は、次のリンクを参照されたい。
https://www.arducam.com/downloads/shields/ArduCAM_Camera_Shield_Software_Application_Note.pdf
spannerでwhere inで検索する

spannerで複数条件で検索するときにwhere inを使って書く方法を調べたのでまとめます。

## 修正前
```
names := []string{"Alice", "Bob"}

stmt := spanner.Statement{
	SQL: "SELECT * FROM Users WHERE Name IN (@Names)",
	Params: map[string]interface{}{
		"Names": strings.Join(names, ","),
	},
}
```
このコードだと、namesが一つの場合には、問題なく動きます。
複数の場合には、`Alice,Bob`で一つの文字列として扱われるため、検索に失敗します。

## 修正後
```
names := []string{"Alice", "Bob"}

stmt := spanner.Statement{
	SQL: "SELECT * FROM Users WHERE Name IN UNNEST(@Names)",
	Params: map[string]interface{}{
		"Names": names,
	},
}
```
[公式にサンプル](https://github.com/googleapis/google-cloud-go/blob/8ae70a49e5272da922a33a493a5cc99819329dd0/spanner/examples_test.go#L496-L510)があったのでそのままですが、上記のようになりました。
`UNNEST`が配列を使う点がポイントです。

> UNNEST 演算子は ARRAY を受け取り、ARRAY 内の各要素を 1 行にしてテーブルを返します。

https://cloud.google.com/spanner/docs/query-syntax?hl=ja#unnest

IN句の詳細はこちらにあるので参照してください。
https://cloud.google.com/spanner/docs/operators?hl=ja#in_operators

# まとめ
spannerのドキュメントをもっと読んでいかないと。。
Unityで３６０度画像を表示する方法



今回はUnityで３６０度画像を取り入れる方法を見ていきます。　

事前に　３６０度画像を用意しておいてください。　



Unityのvrは２０１９．３を使用。



# ステップ１　全球体のモデルと　３６０度画像をUnityのプロジェクトに入れる　



全球体のモデルは　こちらを使うといいです。　

https://www.dropbox.com/s/f0cxi198g0i0mgf/Sphere100.fbx?dl=0



そしてこの　spere100を　シーンにドラッグして　

サイズを変更します。　

サイズは　X ＝-100、Y ＝100、Z ＝100　ぐらいにする。

もしくはそれ以上。　

Ｘ軸は　マイナスにして　反転を防ぎます。　



# ステップ　２　画像を貼り付ける

次に　３６０度画像を　spere100【球体】にドラッグして　

貼り付けます。　

貼り付けて　うまく表示ができていない人は　

spere100の　インスペクターから　

シェーダーを　unit　→　textureにして　

その下にある　四角いマスの所に　画像を入れましょう。


![bandicam 2020-05-28 21-27-58-822.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295760/637dc137-0aa2-e555-51c7-15cc19234313.jpeg)





これで　３６０度画像を表示できました。

# ステップ３　　ゲームビューでクルクル

せっかくなので　

ゲームビューで　視点をクルクル　見渡せるようにしていきましょう。　

これは　StandardAssetに入っている　

rollerodyFPSControllerを使えば　簡単にできます。　

まず　StandardAssetをインポートして　

その中に　rollerodyFPSControllerのプレハブがあるので　

それをシーンにドラッグします。　　

場所としては、　球体の真ん中ぐらいに配置するのがいいでしょう。　

そのままだと　落ちてしまうので　

インスペクターから　リジッドボディ　そして　

重力をＯＦＦにします。　チェックをはずせばＯＫです。　

これで　再生してみると　

ゲームビューで360度　視点で見れます。　

このとき　マウスカーソルが消えてしまいますが　

ESCキーを押せば　復活します。　

こんな感じに　配置するといい。

![bandicam 2020-05-28 21-41-03-226.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295760/13767b06-e898-1254-4d78-ae8b13132b24.jpeg)









ＰＳ　

[３６０度　動画にする方法はこちら](https://qiita.com/zazizuzezo22334/items/d3d234753096a5ee286c)
【Ruby】複数の条件下で、配列から特定の値を取り出す方法【select・each】

## できるようになること
複数の条件を用いて、配列から特定の値を見つけることができます。

例）1~10までの数字のうち、5以下かつ2で割れるものを導き出しなさい。
みたいな問題が解けるようになります。

## 方法
Array#eachとArray#selectを使います。

```ruby
numbers = (1..10).to_a
rule = [["<", 5],["%", 2]]

rule.each do |b|
    numbers.select! do |a|
        if b[0] == "<" 
            a <= b[1]
        else
            a % b[1] == 0
        end
    end
end

p numbers # [2,4]
```

## つまりどう言うことか
条件（今回はrule）をeachで回して、その中に判別したいもの（今回はnumber）を入れる必要があります。かつて、逆にして困っており、最近この方法に気づいたのでまとめさせていただきました。

何か同じ悩みで引っかかっていた人の解決になれば嬉しいです。
lightgbmがdlopen(/Users/*site-packages/lightgbm/lib_lightgbm.so, 6): Library not loaded: */libomp/lib/libomp.dylib  Referenced from: /Users/*/opt/anaconda3/lib/python3.6/site-packages/lightgbm/lib_lightgbm.so  Reason: image not foundでエラーが出た。

よくわかりませんが、

```
brew install libomp

pip uninstall lightgbm

pip install lightgbm
```
で解決しました。
個人的に頻繁に使ったRSpec集

RSpecを書いているうちに、「これとよく似た比較書いたけどどのプロダクトのどのSpecだっけ？」って探して時間を取られた事があったので、ここに記事としてまとめておきます。未来の自分と他の開発者の方に役立つ事を願って。

## エラーログが出力されている事を確認。

```ruby

it 'エラーログが出力される事' do
    expect(Rails.logger).to receive(:error).with(/code: 400/)
    # 以下、テストしたい処理を書く
end
```

ポイントとしては

- expectをitの一番最初に書く。こうしないとログの出力メソッドがreceiveによって捕捉されません。
- `with`の中に、含まれていてほしいメッセージを書く。そのまま書くと完全一致にならないとパスしないので、スラッシュで囲むことで、特定のメッセージを含んでいた場合のケースを書くことができます。いわゆる正規表現。

[参考にしたサイト](https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/setting-constraints/matching-arguments)


## エラーログが出力されていない事を確認。

```ruby
it 'エラーログが出力されない事' do
    expect(Rails.logger).to receive(:error).exactly(0).times
    # 以下、テストしたい処理を書く
end

```
先程の例の応用で、「正常に処理が完了するケースの場合はエラーログが出ないはずだ。」も調べたかった。
`receive`メソッドにつなぐ形で回数を指定できるので、`.exactly(0).times`でメソッドが呼ばれていない事を確かめました。
[参考にしたサイト](https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/setting-constraints/receive-counts)

よくRubyやRailsを書く人からしてみれば「当たり前じゃねぇか！」って言われるかもしれませんが、私がここ最近初めて本格的にRailsを使った開発にアサインされて、戸惑いながらも開発していた時に得たものなので、優しい目で見ていただけますと幸いでございます。
使えそうなものが出てきたら追記していこうと思います。

ありがとうございました。
Raspberry Pi OS(旧名Raspbian Buster) 2020-05-27 Release-note 翻訳

(追記: 2020/8/24にRaspberry Pi OS 2020-08-20がリリースされています)
https://qiita.com/utaani/items/93495ca290ce226bd14d

http://downloads.raspberrypi.org/raspbian/release_notes.txt

2020-05-27：

   - Bookshelfアプリケーションを追加
   - Raspberry Pi Diagnosticsアプリケーションを追加
   - 拡大鏡プラグインをタスクバーに追加 - 有効にするには、推奨ソフトウェアから拡大鏡アプリケーションをインストールする必要があります
   - 推奨ソフトウェアに拡大鏡アプリケーションを追加
   - Chromiumの初期タブにマーケティング質問票を追加
   - Scratch 2のバージョン0.25が含まれています - 外部アプリケーションを使ってSenseHATのIMUにアクセスできます
   - Scratch 3のバージョン1.0.5が含まれています - 外部アプリケーションを使ってSenseHATのIMUにアクセスできます
   - Flashプレーヤーのバージョン32.0.0.371が含まれています
   - Node-REDのバージョン1.0.6が含まれています
   - VNCサーバーのバージョン6.7.1が含まれています
   - VNCクライアントのバージョン6.20.113が含まれています
   - 内部オーディオ出力が独立したALSAデバイスとして有効になりました
   - MagPiのプレインストールが削除され、初心者向けガイドに置き換えられました
   - メインメニューから削除されたMagPi Webリンク
   - ChromiumがPDFファイルのデフォルトアプリケーションに
   - lxpanelプラグインに共通アイコン読み込みコードが使われます
   - イタリア語の翻訳が追加されました
   - 無効になったメニューボタンへの、マウスポインターのデフォルト移動が無効になりました
   - メニューボタンの左パディングを削除
   - フォーカスの動作が変更され、ウィンドウが開かれていない場合はフォーカスがデスクトップに移動する-Orcaスクリーンリーダーの信頼性が向上
   - バグ修正 - ボリュームプラグインにフォーカスされるバグ
   - バグ修正 - マウスとキーボードの設定におけるキーボードの繰り返し間隔のバグ
   - バグ修正 - バッテリープラグインのバッテリー検出バグ
   - バグ修正 - プラグインが非表示の場合のタスクバーの誤ったアクティブ領域
   - バグ修正 - ファイルを選択するとファイルマネージャーがクラッシュすることがある
   - 初回起動時にディスクIDが再生成されるようになりました
   - udevルールを更新
    - 未使用の不活性なルールを削除
    - ビデオグループにvcsm-cmaを追加
    - pwmをgpioグループに追加する
   - i2cprobe：より柔軟なI2C / SPIエイリアスマッピング
   - Raspberry Piファームウェア 21e1fe3477ffb708a5736ed61a924fd650031136
   - Linuxカーネル4.19.118
デバッグ時の「ソースが見つかりませんでした」の対処法

eclipseでspringbootを使って開発している駆け出しエンジニアです。
やり方を調べながらデバッグをやろうとした時に出てきたエラーの解決方法についてです。

##状況・原因

ブレークポイントを立てて、デバッグを起動しました。

ブレークポイントで止まったと思ったら、赤文字で
「ソースが見つかりませんでした」と表示されました。

ソースルックアップパスというものに動かしているプロジェクトが含まれていなかったことが原因でした。

##解決方法

- デバッグの所の虫みたいなマークの隣にある逆三角クリック

- →デバッグの構成→ソースと進む

- →ソースルックパスで「追加」を押して、使ってるJavaプロジェクトを追加する

僕はこれで無事に解決されました。
試してみてください。
THETA V/Z1をルータに簡単につなげる

RICOH THETA V/Z1をスマホアプリからの設定でWiFiルータに接続するのは手間だが、WPSを使って簡単につなげられる。WPSに対応しているルータでクライアントモードを使うときに便利。

0. WiFiルータのWPSを有効にして、WPSでの接続待ち状態にする。
1. THETAのWiFiボタンを押す（押し続ける）
2. THETAのModeボタンを押す（押し続ける、２つのボタンが同時に押された状態）
3. THETAのシャッターボタンを押す（押し続ける、３つのボタンが同時に押された状態）
4. ルータを見て、接続されたら（あるいはWiFi LEDが高速点滅したら）指を離す（10秒後くらい）

<注意>
WiFiルータがTHETAの対応していないチャンネルで電波を出していると接続できない。国内だとルータは2.4GHzでは1〜13chまで使うものが多く、ルータのチャンネル選択を自動にしていると、THETA Vと時々つながらないことがある。5GHzでもW53やW56で電波を出しているルータにはつながらない。

* Vの対応チャンネル: 2.4GHz:1～11ch, 5GHz:W52（36/40/44/48ch）
* Z1の対応チャンネル: 2.4GHz : 1～13ch, 5GHz : W52（36～48ch） 

参考： https://community.theta360.guide/t/theta-v-client-mode-configuration-guide/2565

公式の方法:
 (THETA V) https://support.theta360.com/ja/manual/v/content/prepare/prepare_08.html
(THETA Z1) https://support.theta360.com/ja/manual/z1/content/prepare/prepare_08.html
iOS13でショートカットのバックアップを作成する

## 前置き
\ﾃﾞﾃﾞｰﾝ!/
![C8A144FA-0D15-4497-9D09-87E76FE70F28.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/1d94abe3-9d5c-9d00-5b93-f5173a60224b.jpeg)
目当てのショートカットがなかなか見つからなかったり、割と不便なのでこの機会に整理します。
## iOSのバージョンによってはバックアップの復元方法が違う
iOS12での方法は既に先駆者様達が個人ブログ等でまとめてくださっているので、ここではiOS13でのバックアップ・復元方法について取り上げます。

## 必要なもの
・iCloud Drive
・ファイルApp
・ショートカットApp

## バックアップ
![9D25654D-66EC-4584-8019-AD6B06B762C5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/be434557-0652-35d8-e09d-b03affcbd508.jpeg)
極論この2アクションで十分です。日時を書いたフォルダを作っておくと尚GOOD。

## 復元
![43B2025D-7D15-48ED-8A2D-84DB01314980.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/ba8ea213-562e-5f2c-356d-06fac80d227d.jpeg)
**iCloudからリンクを取得する**というのがミソです。DropboxのリンクではショートカットAppが開かないため復元できません。

## おまけ追記
バックアップ・復元ができる実用的なやつを作りました。[リンク](https://www.icloud.com/shortcuts/6372ca32af5c49149ebad5fad106605e)
AWS DiscoveryService

#AWS DiscoveryService
> AWS Application Discovery Service では、オンプレミスサーバーに関する使用状況と設定のデータを収集することで、AWS クラウドへの移行を計画できます。Application Discovery Service は AWS Migration Hub と統合されています。これにより、移行ステータスの情報が 1 つのコンソールに集約されるため、移行の追跡が簡単になります。検出したサーバーを表示し、これらをアプリケーションとしてグループ化して、各アプリケーションの移行ステータスをホームリージョンの Migration Hub コンソールから追跡できます。

> 検出されたすべてのデータは、AWS Migration Hub ホームリージョンに保存されます。したがって、検出および移行アクティビティを実行する前に、Migration Hub コンソールまたは CLI コマンドを使用してホームリージョンを設定する必要があります。データは、Microsoft Excel や AWS 分析ツール (Amazon Athena や Amazon QuickSight など) にエクスポートして分析できます。

Application Discovery Service API を使用して、検出したサーバーのシステムパフォーマンスと使用状況データをエクスポートできます。このデータをコストモデルに取り込むことで、これらのサーバーを AWS で実行した場合のコストを計算します。さらに、サーバー間に存在するネットワーク接続に関するデータをエクスポートできます。この情報により、サーバー間のネットワーク依存関係を確認し、サーバーをアプリケーションとしてグループ化して、移行計画に役立てることができます

Application Discovery Service では、2 つの方法で、オンプレミスのサーバーを検出して関連データを収集します。

* エージェントレス検出
    * VMware vCenter を通じて AWS Agentless Discovery Connector (OVA ファイル) をデプロイします。検出コネクタ を設定すると、vCenter に関連付けられている仮想マシン (VM) とホストが識別されます。検出コネクタ は、静的な設定データとして、サーバーのホスト名、IP アドレス、MAC アドレス、ディスクリソースの割り当てを収集します。さらに、VM ごとに使用状況データを収集し、CPU、RAM、ディスク I/O などのメトリクスの平均とピークの使用率を計算します。
* エージェントベース検出
    * VM と物理サーバーのそれぞれに AWS Application Discovery Agent をデプロイします。エージェントのインストーラは Windows および Linux オペレーティングシステムで使用できます。これにより、静的な設定データ、詳細な時系列のシステムパフォーマンス情報、着信/発信のネットワーク接続、および実行中のプロセスが収集されます。

> Application Discovery Service は、AWS パートナーネットワーク (APN) のパートナーが提供するアプリケーション検出ソリューションと統合できます。これらのサードパーティー製ソリューションを使用すると、検出コネクタや検出エージェントを使用せずに、オンプレミス環境の詳細を Migration Hub に直接インポートできます。サードパーティーのアプリケーション検出ツールは、AWS Application Discovery Service をクエリしたり、パブリック API を使用して Application Discovery Service データベースに書き込んだりできます。このようにして、Migration Hub にデータをインポートして表示できるため、アプリケーションをサーバーに関連付けたり、移行を追跡したりできます。

##VMware の検出に関する詳細
> VMware vCenter 環境で実行されている仮想マシン (VM) がある場合は、検出コネクタ を使用してシステム情報を収集できます。各 VM にエージェントをインストールする必要はありません。代わりに、このオンプレミスアプライアンスを vCenter 内にロードし、このアプライアンスですべてのホストと VM を検出することを許可します。

> 検出コネクタ は使用しているオペレーティングシステムの種類を問わず、vCenter で実行されている各 VM のシステムパフォーマンス情報とリソース使用状況をキャプチャします。ただし、各 VM の「内部を見る」ことはできません。したがって、各 VM で実行されているプロセスや使用されているネットワーク接続を判断することはできません。移行計画に役立てるために、このレベルの詳細が必要な場合や既存の VM の一部の詳細を確認する場合は、必要に応じて 検出エージェント をインストールできます。

また、VMware でホストされている VM の場合は、検出コネクタ と 検出エージェント の両方を使用して 検出を同時に実行できます。

##
[Javascript]繰り返し処理(while, for)

#while
`while (条件式) {
  処理
}`

```javascript
let number = 1;

while (number < 10) {
  console.log(number);
  number += 1;
}
```


#for
`for (変数定義;条件式;変数の更新) {
処理
}`

```javascript
for (let number = 1; number < 10; number += 1) {
  console.log(number);
}
```

#if文との組み合わせ

```javascript
for (let number = 1; number < 10; number += 1) {
  if (number % 2 === 0) {
    console.log("2の倍数です");
  } else {
    console.log(number);
  }
}
```
View側になるべく手をつけずUIを作ってみる

#はじめに
どうも！
SAPUI5の開発にて同じような構成の画面を大量に作る機会があり、
UIをController側で作る機会があったので
自分へのメモとして記事を書かせていただきます。

#やりたいこと
View側をいじらずにUIを作成したい

#ページを定義し、埋め込む

まず大元となるページを定義していきます。
ViewのXMLファイルは以下のような感じ。

```
<mvc:View controllerName="controllerName" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m">
	<Shell id="shell">
		<App id="app">
			
		</App>
	</Shell>
</mvc:View>
```

あらかじめAppにidを付与しておきます。(ここではappとしています。)
基本的にここからView側を触ることはありません。

Controller内で以下の内容の関数を定義し,Oninit内で呼び出します。
今回はsap.f.semantic.SemanticPageを使っていきます。

```
	createPage: function () {

		var app = this.getView().byId("app");

		// ページ定義
		var semanticPage = new sap.f.semantic.SemanticPage({
			id: "semanticPage",
			showFooter: false,
			preserveHeaderStateOnScroll: false,
			toggleHeaderOnTitleClick: true,
			headerPinnable: true,
			titleHeading: new sap.m.Title({
				id: "title",
				text: "テストページ"
			})
		});

		app.addPage(semanticPage);
	}
```
SemanticPageを定義し、app.addPageでPageを埋め込んでいます。

この段階で画面はこんな感じ。
<img width="1440" alt="スクリーンショット 2020-05-28 20.31.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411770/ce4cd68c-3eae-eeeb-6354-cc1493b8aa67.png">

#色々コンテンツを差し込んでみる
showFooterをtrueにするとフッターが出てきたりヘッダにボタンを追加することも可能です。

```
		// ヘッダ部分に検索ボタンを追加
		var titleMainAction = new sap.f.semantic.TitleMainAction({
			id: "btSearch",
			text: "検索",
			press: function (oEvent) {
				this.onSearch(oEvent);
			}.bind(this)
		});
		semanticPage.setTitleMainAction(titleMainAction);

		// ヘッダ部分に実行ボタンを追加
		var footerCustomActions = new sap.m.Button({
			id: "btExecute",
			text: "実行",
			enabled: false,
			press: function (oEvent) {
				this.onExecution(oEvent);
			}.bind(this)
		});
		semanticPage.addFooterCustomAction(footerCustomActions);
```
ページのコンテンツ部にテーブルを差し込む関数も入れてみます。

```
	createTableContents: function () {
		var semanticPage = sap.ui.getCore().byId("semanticPage");

		// テーブル生成
		var Table = new sap.ui.table.Table({
			id: "table",
			visibleRowCount: 10,
			rows: "{path:'data>/results'}",
			width: "100%",
			selectionMode: "None",
			enableSelectAll: true,
			ariaLabelledBy: "title",
			columns: [],
			showNoData: true,
			fixedColumnCount: 1
		});

		//テーブルタイトルを追加
		var Title = new sap.m.Title({
			id: "tableTitle",
			text: "テストテーブル"
		});

		var toolbar = new sap.m.Toolbar({
			content: Title
		});
		Table.addExtension(toolbar);
	
		// セマンティックページのコンテント部に追加する
		semanticPage.setContent(Table);
	}
```

ということであっという間にController側で簡易的なUIが完成しました
<img width="1440" alt="スクリーンショット 2020-05-28 21.01.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411770/8b6c5e77-bbde-98a2-f0f5-d3589a0f28c0.png">

#エラーが出てきて画面が表示されない
以下のようなエラーが出てくる場合は
`TypeError: sap.f.semantic.SemanticPage is not a constructor`
`TypeError: sap.ui.table.Table is not a constructor`

manifest.jsonファイルの"dependencies"部分の"libs"に以下の記述を追加します。
`"sap.f": {},
"sap.ui.table": {},`

#終わりに
簡易的なページですがほぼViewには手を加えずにController側のみでページを作ることができました。
上記の関数に少し手を加えて共通関数として定義すれば、各々の画面のOninit内で呼び出すことで簡単に似たページを作ることができます。
もし似た構造のページを複数作成する機会がある方はご参考までに。
React Navigation Stackをリセットする

##Stackをリセットする

Stack Navigatorを使っているとStackがどんどん溜まっていき重くなっていきます。
そこでStackをリセットするには　**navigation.dispatch** と **StackActions.reset** を使います。

###StackActions,NavigationActionsのインポート

```
import { StackActions, NavigationActions } from 'react-navigation'
```
###resetアクションをdispatch

```
const resetAction = StackActions.reset({
              index: 0,
              actions: [
                //routeNameはリセットした時の初期スクリーンの名前
                NavigationActions.navigate({ routeName: 'Home' })
              ],
            });
            navigation.dispatch(resetAction);
});
```

## 活用例
Navigatorは実際使う時には複数使うことがほとんどだと思います。今回はTabNavigatorの中でStackNavigatorを使っている場合を考えます。Tab遷移をする際にStackをリセットしてからタブを移動してみましょう。

 ```
-TabNavigator
 -Home              <--遷移先
 -StackNavigator
   -PlanList
   -PlanDetail     <--現在地
```

上のような構成で単純に
navigation.navigate('Home')とするとHomeには移動できますがTabNavigatorでStackNavigatorに来た時にStackがリセットされていないためPlanDetailに来てしまいます。そのため遷移する際にStackをリセットしてから移動してみましょう

```
const resetAction = StackActions.reset({
    index: 0,
    actions: [
    NavigationActions.navigate({ routeName: 'PlanList' })
    ],
});
navigation.dispatch(resetAction);
navigation.navigate('Home');
```
そのままですね。自分のメモなので許してください。