OmniAICreator/Qiita-1.07M huggingface dataset:
SEED Solutionsを試すがWindowsじゃあきらめた

#目次
[1.はじめに](#1-はじめに)
[2.SEED SolutionsのGithubリポジトリ](#2-SEED SolutionsのGithubリポジトリ)
[3.WSL2でUbuntuを入れる](#3-WSL2でUbuntuを入れる)
[4.UbuntuをGUI起動できるようにする](#4-UbuntuをGUI起動できるようにする)
[5.やっと起動できた](#5-やっと起動できた)
[6.Windowをちっちゃくする](#6-Windowをちっちゃくする)
[7.しかしアプリが起動しない](#7-しかしアプリが起動しない)
[8.おわりに](#8-おわりに)

#1. はじめに
先日山形市で開催されたITExpoにて出展のあった、THK社のロボット「SEED Solutions」がオープンソースであると聞いたので、自分の端末でシミュレーター動かせるかを試してみる。

だが、ソースはC++のようである。。。15年ぐらい前に触った程度だよ。。。果たしてやれるのか。
ちなみにロボット知識もほぼない。

#2.SEED SolutionsのGithubリポジトリ
Githubのアカウントページは以下。

https://github.com/seed-solutions

とりあえず以下のリポジトリは一番説明が多そうなので（しかもシミュレーターまで動かせる？？）やってみる。

https://github.com/seed-solutions/seed_r7_ros_pkg

パンフレットには複雑なソフトウェア開発と書いてある。
![seedsolutions (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269692/84501562-7001-f8b2-3c4d-3d6b12b7e3c0.jpeg)

#3. WSL2でUbuntuを入れる

展示会で見たときに使っていたパソコンのOSはMacだった。こういう制御系はやっぱりLinuxなのか。
Linuxは無料でインストールできるが、インストール先のパソコンが当然ないので、やはりWSL2に頼ることに。

~~インストール手順をたどっていくと、kineticをインストールと書いてある。
kiteticのサイトを見ると、Ubuntu 16.04が必要と書いてある。
http://wiki.ros.org/kinetic/Installation/Ubuntu~~

~~React開発のために、最新のUbuntu(20.x)を入れていたので、別途インストールが必要となった。
Microsoft Storeを探しても16.04が出てこないため、手順を探していたら、過去バージョンを入れるリンクを発見。（２．ディストロのダウンロードのところ）
https://qiita.com/moriai/items/850ee91d60edc91e7b7e~~

~~一度はインストール後にUbunts起動したときに失敗したが、いったん削除して再度試したらちゃんと入った。~~

kinecticではなく、melodicを利用する手順を採用。
melodicのサイトを見ると、Ubuntu 18.04 LTS(Bionic)が必要と書いてあるのでインストールすることに。

http://wiki.ros.org/melodic/Installation/Ubuntu

Ubuntu 18.04 LTSはMicrosoft Storeで検索すると普通に出てきた。

#4. UbuntuをGUI起動できるようにする
さて、シミュレーターがあるということは、やはりGUIが必要なのかなと予想（説明なども見ていない）したので、以下の手順を参考に、GUI起動できるようセットアップ。

https://karst459.com/190/

~~めっちゃ時間がかかった。2時間ぐらい？モバイルルーターが熱くなって充電されなくなった。~~

Ubuntuのバージョンを変えた際に、以下の手順を見つけ、日本のミラーサイトからパッケージを取得するように変更した。

~~~
$sudo sed -i.bak -e 's%http://[^ ]\+%mirror://mirrors.ubuntu.com/mirrors.txt%g' /etc/apt/sources.list
~~~

https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/

* なんかうまくいかなくてこれをやった

GUI表示のコマンド「sudo service x11-common start && sudo service dbus start && gnome-shell --x11 -r」を実行してエラー。見ると「gnome-shell」というパッケージを入れろとコマンド付きで言われている。

~~~
$sudo apt install gnome-shell
~~~

#5. やっとGUIで起動できた
![xwindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269692/cfced75a-f7b3-fbef-1dba-2cfbd6556259.png)

#6. Windowをちっちゃくする

Linux画面が全画面表示されて調べ物ができなくなるので、xLaunchの設定を変更してWindowを独立させられるようにした。
Multipleだと全画面になって、One Large Windowだと大丈夫。
![xdips.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269692/ee5f0ebe-4783-0458-ef80-283a7410353e.png)

#7. しかしアプリが起動しない

Terminalを起動しようと思ったが、うまく起動しない。Terminalすら起動しないということはダメなんだろうな。。。
![fail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269692/f1309f27-430f-ea0f-3c9d-2c70d8ad09e3.png)


#8. おわりに

まずはLinuxをGUI起動するのが大変だった！
しかし、うまく動かないので、やはり物理マシンで動かすのがベストなのでしょう。

Windows11のWSLだとGUI起動がすんなりいきそうなので、これに期待します。
（まだパソコン買い換えの予定はなし）

https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps
pythonの「__name__」とかはなに？

# pythonの「\_\_name__」とかはなに？

## 勉強前イメージ

全然プログラム書かないのでよくわからんけど、昔からの疑問。
\_\_main__ とかもよく見る気がする

## 調査

### pythonの「\_\_name__」について

pythonのプログラムは `コマンドから直接実行される` か、 `importで他のプログラムから参照される` の、どちらかの方法で実行されます。
「\_\_name__」は、pythonのコードを実行するときに作られる変数で、この変数には実行しているプログラムのモジュール名が自動的に入ります。

pythonの特殊なグローバル変数で、他にも
`__file__` や `__cached__` などがあります。

よく使われるものとして、
`if __name__ == '__main__':` と記載すると
コマンドラインから直接実行されたときの処理を記載することができます。

### ちなみに・・・関数と変数について

#### 関数

関数としては一定の処理を入れておくような箱になります。
関数の例として、「ご飯を炊くまで」を考えます。

1. お釜にお米を入れる
2. お米をとぐ
3. 水を入れる
4. 炊飯器にセットをする
5. 炊飯器のスイッチを押す

ご飯を炊くまでにざっくり上記の作業があります。
「ご飯を炊く」 という `関数` に、上記の処理があるイメージです。

関数の定義は以下で行うことができます。

```
def 関数名():
    処理１
    処理２
```

ご飯を炊くという関数にしてみると以下になり、「お米を炊く」関数を呼び出すと以下が実行されるイメージです。

```
def お米を炊く():
    お釜にお米を入れる
    お米をとぐ
    水を入れる
    炊飯器にセットをする
    炊飯器のスイッチを押す
```

#### 変数

変数については、「NAME」という変数があるとすると
`私の名前は NAME です` をテンプレートを作っておくことでNAMEを変更するだけで、
以下のように名前を変えることができます。

- NAME = たかし → `私の名前は たかし です`
- NAME = はなこ → `私の名前は はなこ です`

## 勉強後イメージ

ほんとにプログラムは皆無の世界だけど
ちょっとずつ仲良くなりたい
タイトル以外に、関数と変数の違いもわかった。

## 参考

- [Python モジュールの位置特定と実行](https://docs.python.org/ja/3/library/runpy.html)
- [python 関数の基本が初心者でもわかる！引数や戻り値も理解できる！](https://udemy.benesse.co.jp/development/python-work/python-function.html)
- [Pythonで\_\_name__を使う方法【初心者向け】](https://techacademy.jp/magazine/18871)
加速度センサーのデータ(csv)をUnityに取り込む

# 制作背景
ラズパイと加速度センサを使ってデータを取ったもののこのデータをどう使えばいいのかわからなかったので色々調べてみたんですけど、どうも自分の環境に合うものが見つからず苦労したのでここにメモとして残しておきます。
# 使い方
Resourcesという名前のディレクトリを作って、その中にcsvファイルを置く(今回はdata.csvを置いた場合のコード)
csvDatasという配列に文字列としてデータが入っているのでそれをごにょごにょして使うことが出来ます
# コード

```C#:csv_reader.cs
// about acc
csvFile = Resources.Load("data") as TextAsset;
StringReader reader = new StringReader(csvFile.text);
while(reader.Peek() != -1)
{
    string line = reader.ReadLine();
    csvDatas.Add(line.Split(','));
}
max_acc = csvDatas.Count;
Debug.Log(csvDatas[0][0]);
```
Databricks からAzure Data Lake Storageへの接続手順 (ADLS gen2 Storageの作成)


# 概要

Azure Databricksから、ADLS gen2ストレージにあるデータを取得する手順について確認したいと思います。
ここでは、最初のADLSgen2ストレージの作成方法について確認したいと思います。

# Azure ADLS gen2の作成

## ストレージアカウントの作成 (Azure Portal) 

まずはADLSのストレージコンテナを作成するため、ストレージアカウントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/0e877aa4-7bf5-88e1-dcaa-07ab4ae25124.png)

データブリックス・ワークスペース内でのみ利用するの場合、Azure Databricksと同じリソースグループを指定しておくと管理が楽になります。Azure リソースグループについては[こちらの記事](https://tech-blog.cloud-config.jp/2019-06-06-evening-azure-challenge-002/)が参考になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/31fd5c50-2e16-0dd3-e056-7c98ced060ca.png)


- __サブスクリプション/リソースグループ__ 上図の管理スコープを参考に既存のものを選択するか、新規作成をします。
- __ストレージアカウント名・地域__ を選択します。
- __パフォーマンス__ は`Standard`で十分です。
- __冗長性__ もデフォルトの`GRS`にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/b0bdd436-3694-b2da-1c17-2fe9d4422a9a.png)

次に進み`詳細設定`では、`階層型名前空間を有効にする`にチェックを入れます。これによりADLSgen2のファイルレベルアクセスが可能になります。

残りの設定は全てデフォルトのままで`ストレージアカウントを作成`します。

## コンテナの作成 (Azure Portal) 

ストレージアカウントが作成出来たら、次にコンテナを作成します。コンテナが具体的なストレージオブジェクトとして、Notebookからアクセスする対象となります。
`ストレージブラウザー` - `BLOBコンテナ`を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/a091170e-3290-bc97-08b6-6d89724f37c2.png)

`コンテナーを追加する` にて、新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/9a332146-be2f-0382-bef3-d175bd34defc.png)

作成したコンテナ上にサンプルデータをアップロードしておきます。（後ほどロードするため）
[サンプルcsvデータ](https://people.sc.fsu.edu/~jburkardt/data/csv/cities.csv)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/ab744606-b696-69ad-85b7-e811a1ff1b44.png)


ここまでが共通のADLSストレージ作成作業になります。

# データブリックスからストレージへのアクセス方法

ストレージが作成できたら、認証方式を決めて設定をします。各認証方式の特徴と設定方法はこちらをご覧ください。

[ストレージアカウント認証](https://qiita.com/maroon-db/items/8cbb8bb14adeead7bed0)
[SAS Token認証](https://qiita.com/maroon-db/items/1df46d0c088a550ab053)
[サービスプリンシパル認証](https://qiita.com/maroon-db/items/84f47e8ca28056202d0e)
Excel for Mac 2018でのcsv読み込み時のエンコーディングバグについて

こんにちは。
年賀状印刷のために色々データをこねくり回していたら、エクセルにてデータが適切なエンコーディング方式で読み込むことができなくなるバグが発生したため忘備録として残しておきます。

#環境
macOS BigSur 11.2.3
Microsoft Excel for Mac 16.16.27

#発端
実家の年賀状印刷に使用しているコンピューターが壊れてしまい、なんとか印刷できないかと家族に頼まれたため、winではなくmacで年賀状の宛名印刷をすることになりました。
とりあえず住所録用のデータを自PCのデータベースに収納し、cvsで書き出せたので次に年賀状印刷ソフトをmacで調べたのですが、それが全く見つからない。
やっとの思いで見つけたサービスがはがきデザインキット2022というサービスでした。
できればwebではなくアプリケーションとして欲しかったですが、adobe AIRランタイムの関係で終わってしまったソフトも多く、諦めて使うこととしました。

https://nenga.yu-bin.jp/design_kit/

そこで、このサービスで読み込むように住所録のcsvファイルを生成するのですが、ダウンロードしたcsvテンプレートがShift-jisであり、そのテンプレートにUTF-8のデータを読み込もうとした際に問題は発生しました。


#問題
エクセルでデータを読み込む際、テキストファイルウィザードというのを呼び出すのですが、もちろんエンコーディング形式を正確に与えなければ文字化けして読み込むことができません。
そこで、ファイル形式をUTF-8に指定して読み込むわけです。
![スクリーンショット 2021-12-23 15.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422981/b2033ad3-5a73-bd5b-655c-10f9d41f7403.png)
問題なさそうですね。
そのファイルを保存しようとすると、このようなエラーが出ます。
![スクリーンショット 2021-12-23 15.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422981/0651fc0d-6f40-4483-84b2-9213c5212c89.png)
保存するしかないので保存します。なんの問題も起きていないように見えますが、新規作成してデータを読み込んでみましょう。
すると、以下のように適切なエンコーディング方式を指定しているのに文字化けが発生してしまします。
![スクリーンショット 2021-12-23 15.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422981/4ac5cab9-1556-bc9b-dcd7-6dce20de5e65.png)

#解決策
エクセル自体を再起動すれば治ります。
やるたびに毎回発生するので、同じような作業をする場合にはめんどくさいです。
CSSアニメーションでループ間隔のdelayを実現する手軽な方法

## はじめに
cssのアニメーション便利ですよね。
ただ、cssのアニメーションってループ時の場合、ディレイの間隔って調整が難しいですよね。。。
`animation-delay`って初回の待機時間しか効かないのでループ時の2回以降の間隔って`@keyframes`内に待機時間も含めた形で作る必要があるからなんですよね。
このプロパティが存在していれば話が早いんですが、そうもいかない`animation`プロパティ悩ましい。。。

## keyframesに待機時間も含めて対応
以下は[CSS-TRICKS](https://css-tricks.com/css-keyframe-animation-delay-iterations/)の記事から拝借させていただいたものですが、`@keyframes`に待機時間を含めております。
(20%〜100%以降が待機時間になります。詳しくは[CSS-TRICKS](https://css-tricks.com/css-keyframe-animation-delay-iterations/)の元記事にてご確認いただければと思います。)

<p data-height="500" data-theme-id="0" data-slug-hash="rLdxVZ" data-default-tab="js,result" data-user="tomoasleep" data-embed-version="2" data-pen-title="dJgNLK" class="codepen">See the Pen <a href="https://codepen.io/chriscoyier/pen/rLdxVZ">rLdxVZ</a></p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

ただ、直感的ではないですよね。。。
ちょっと入り組んだアニメーション定義したい場合にこんなん一個一個書いてらんない。。。

## 解決方法
[Wait! Animate](https://waitanimate.wstone.uk/#!/)という素晴らしいサービスがあります。
`CSS`の場合は以下のサイトにてプロパティをぽちぽちして書き出されたコードを使用すればよいです！
`SCSS`の場合は`mixin`を使ってよきに`keyframes`を定義する感じです！（mixinの使用方法は[Wait! Animate](https://waitanimate.wstone.uk/#!/)をご確認くださいませ。）

https://waitanimate.wstone.uk/#!/

## おまけ
`dart-sass`版
といっても`math.div`に書き変えたぐらいしか変更していないですが。。。

```scss:wait-animate.scss
@use 'sass:math';

// @see http://waitanimate.wstone.io/#!/
@mixin waitAnimate($options: ()) {
  $options: map-merge(
    (
      animationName: waitAnimate,
      duration: 1,
      waitTime: 0,
      timingFunction: linear,
      iterationCount: infinite,
    ),
    $options
  );

  $name: map-get($options, animationName);
  $kf: map-get($options, keyframes);
  $kfLength: length($kf);
  $duration: map-get($options, duration);
  $waitTime: map-get($options, waitTime);
  $timingFunction: map-get($options, timingFunction);
  $iterationCount: map-get($options, iterationCount);
  $counter: 1; // index of 'each'

  @keyframes #{$name} {
    @each $frame, $prop in $kf {
      #{ math.div($frame * $duration, $duration + $waitTime) + 0% } {
        @each $k, $v in $prop {
          #{$k}: #{$v};
        }
      }
      // if last in loop and waitTime is not 0, add the last frame as 100% (this is what creates the pause)
      @if $counter == $kfLength and $waitTime > 0 {
        100% {
          @each $k, $v in $prop {
            #{$k}: #{$v};
          }
        }
      }
      $counter: $counter + 1;
    }
  }

  %#{$name} {
    animation: #{$name} #{$duration + $waitTime}s #{$timingFunction} #{$iterationCount};
  }
}
```

と、あまりループのcssアニメーション待機時間を調整したいなどのニーズはあまりないかもですが
(私自身過去に1度ぐらいしかなかった。。。)
誰かのお役に立てれば幸いです。
【業務】Goが触りたいなぁってお話

Googleが開発した『Go』


流行らないわけがない…
今色んな言語がこれから統合されていく予感がするんですよねぇ。。。

実際リプレイス案件で
結構使われてるらしい…！（Javaみたいな感じ）



#理想の技術習得
フロントエンド：TypeScript
バックエンド：Go, Java

>フロントエンド界隈は半年で死ぬ技術もあるし
新規参画者も多い

<br>
###デザインは　Google を真似ればイイ
Dynamics 365 Finance and Operations ~ Power Automateを活用する① ~

今日は FO と Power Automate で何かシナリオを考えてみます。とりあえず Power Automate にはテンプレートが沢山あるので、色々とアイデアはすぐに出てきそうです。初回なので簡単なテーマで以下にしてみます。
シナリオ：新製品がマスタに追加されたらメールで通知する。

① FO に Alert rule を作成します。Alert（警告）は何かしらの FO 内のビジネスイベント*をキャッチしてくれる機能です。通常のまま使うと、イベントが起きた時にアクションセンター（画面右上）に通知されます。ただ、その時に通知したい相手が FO を使っていない可能性があるので、メールなり Teams なりに通知したいというケースがあるかと思います。

*ビジネスイベント…各モジュールにてレコードが作成・編集・削除された、など。2021年3月アップデートで、バッチ処理の開始・完了・失敗・キャンセルにも対応するようになったので、夜間バッチの監視にも使えそうです。

https://docs.microsoft.com/ja-jp/dynamics365/fin-ops-core/fin-ops/get-started/alerts-overview?toc=/dynamics365/commerce/toc.json

リリース済製品 > オプション > カスタム警告の作成
警告をビジネスイベントとして送信する場合は、"外部に送信" を はい に設定します。
OKボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/c8298b75-01a7-f295-8966-1bd179969cc0.png)
Rule ID: 000263 で作成されました。これが今回のビジネスイベントの内容になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/5798d923-dfbb-0b69-c63d-54f15fa7bd0b.png)

次に、ビジネスイベントのスキーマをコピーしておきます。これを Power Automate 側に教えてあげることで、FO（ビジネスイベント） と Power Automate（フロー）のデータ内容が紐づけられます（後述のParse JSON）。
ビジネスイベントカタログ > ビジネスイベントID "BusinessEventsAlertEvent" > スキーマのダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/25eaef06-e662-1693-6bc3-52821d5e9232.png)

FO 側の操作は以上です。

② Power Automate でビジネスイベントが発生したら、メールを送信するというフローを作成します。
Power Automate ポータル: https://japan.flow.microsoft.com/
+ 作成 > テンプレート > "Dynamics 365 Finance でビジネス イベントが発生したら電子メールを送信する"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/554d8392-c99d-252e-095e-d6170b9a41fb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/da928929-497d-6881-dcb6-2f41a8f3be37.png)
サンプルから生成 > 先ほどダウンロードしたスキーマのテキストを張り付ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/639c06c8-dc36-7ade-168d-2bf6eaa1e993.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/6ad5b46f-7410-2941-0feb-a0bbef656b09.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/5c6bb8ff-b1e6-0012-2b3f-573fc1d12a71.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/82694948-a7de-94fb-3f80-ce1fa99df2e1.png)
こちらで一通りの Power Automate（フロー）の設定は完成しました。

なお、フローを作ると、FO 側のビジネスイベントのアクティブイベントにも当該イベント "警告ルールをトリガーする時" が反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/795f911a-62fc-c39e-4be7-bffe61b62376.png)
では、テストしてみます。Power Automate で "テスト" - "手動" をクリック

FO で 新製品マスタ（リリース済製品）を作成すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/264d21ea-46c1-e562-350f-fc798d0f04c4.png)
ビジネスイベントがトリガーされて、フローが正常に回りメールが通知されてきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/2242bb60-aadc-7979-17ff-b541c82cb39a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/ca6dbcae-ead5-cff0-cf41-379d2a5837dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/774d7c1e-3372-da87-5c6a-b10c283b9477.png)
ローカル環境のみで有効なconsole.log()を即席で作る

# はじめに
初めて実務でフロントエンド開発を行っています。
想像の10倍ぐらいconsole.log()を書いているわけですが、その時「仮に削除 or コメントアウトし忘れても大丈夫なconsole.log()が欲しい」と思ったのがきっかけです。

# console.log()の仕様を見てみる

```typescript
/*略*/

log(message?: any, ...optionalParams: any[]): void;

/*略*/
```
↑らしいです。
これをそのまま引数として受け取ってローカル環境だった場合のみconsole.log()を実行する、というやり方で実現できそう。

# 実装

```typescript

const defaultLocalPortNumber = process.env.REACT_APP_LOCAL_PORT_NUMBER || 3000

/**
 * ローカルかどうか
 *
 * @param {number} [localPortNumber=3000]
 * @return {*}  {boolean}
 */
export const isLocal = (localPortNumber: number = defaultLocalPortNumber): boolean => Number(location.port) === localPortNumber

/**
 * ローカル用console.log()
 *
 * @param {*} [message]
 * @param {...any[]} optionalParams
 */
export const consolocalLog = (message?: any, ...optionalParams: any[]): void => {
  if (!isLocal()) {
    return
  }

  console.log(message, ...optionalParams)
}

/**
 * ついでにローカル用console.error()も
 *
 * @param {*} [message]
 * @param {...any[]} optionalParams
 */
 export const consolocalError = (message?: any, ...optionalParams: any[]): void => {
  if (!isLocal()) {
    return
  }

  console.error(message, ...optionalParams)
}

```

# 使い方

```typescript
import { consolocalLog, consolocalError } from '../path/to/helpers'

/*略*/

consolocalLog('DEBUG OUTPUT: ', randomData)
consolocalError('ERR OUTPUT: ', err)

/*略*/
```


とはいえ最後はしっかり確認して削除なりコメントアウトなりするに越したことはないと思います。
TrendMicro Cloudone Demo（Network）

#### 1. はじめに

TrendMicro Cloudoneの[デモ](https://cloudone.trendmicro.com/docs/network-security/NS_Action/#next-steps)を実施したので、その結果を本記事に纏める。TrendMicroが用意したCloudFormationのスタックを実行するだけ、デプロイしたAWSリソースもスタックの削除を行えば自動的に削除されるので安心。


#### 2. デモ環境の基本構成

Protected Subnetに所属しているEC2インスタンス（Webサーバ）のデフォルトルートは必ず、EC2インスタンス（Network Security）のENIを通過して、NATGW経由でインターネットへ出る。また、インターネット（Internetgateway）からの通信は必ずEC2インスタンス（Network Security）のENIを通過するようになる。つまり、インターネットからのInboud通信、インターネットへのOutbout通信は必ずNetwork Security（IPS/IDS）を通過するような形となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/143634c8-ae81-8098-4c5e-42d7fdcc7c0c.png)


#### 3. デモ環境の作成方法

[CloudFormation](https://console.aws.amazon.com/cloudformation/home?#/stacks/create/template?stackName=CloudOneNetworkSecurityPoC&templateURL=https://trendmicro-tippingpoint.s3.amazonaws.com/documentation/templates/poc.yaml)のリンクをクリックして必要事項を記入。

①ページ：前提条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/d66436e7-3747-fefd-921a-402e58901fe0.png)

②ページ：スタックの詳細を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/b9453e77-e6ff-a166-00f4-62f63473f309.png)
Trendmicro CloudoneのAPI KeyをCloudoneのアカウント管理画面から生成して、Key情報を入力する。CloudFormationを実行することでEC2インスタンスが生成されるので、そのEC2インスタンスのログインに必要なKey-Pairの情報もこちらで選択する。


重要なのは、API KeyとEC2インスタンスのKey-Pairくらい。後の設定は適当に行いDeployを実施すると。以下のような形でCloudFormationスタックのデプロイが成功する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/70eab8e6-ef91-cc8a-7174-71e442e925ab.png)

#### 4. IPS/IDSのお試しコマンド

[こちら](https://cloudone.trendmicro.com/docs/network-security/NS_Action/#attack-simulation)に記載の以下コマンドで既知の脆弱性を突くコマンドを実際に実行すると、

```bash:脆弱性を突くコマンド例
curl -H "User-Agent: () { :; } ; /bin/eject" http://<web server ip>
```
Cloudwatch Logsのログメッセージによりフィルタされるログが検知される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/ccb7f32e-bc4d-e7f7-e3fb-76d2dd57be36.png)


以上
くそアプリをやっと思いついた

# くそアプリをやっと思いついた
## 苦しんだ理由
 くそアプリを考えるにあたって要件定義を考えすぎた。
 1.仕事や余暇の役に立ってはいけない。
 2.人を和ませなければならない。
 3.人に感心されるような出来栄えはいけない。（っつーか、できねえw）
## できたもの
```
#良い日になるプログラムを作りました
#Google Colaboratoryで実行できます
from datetime import date
today = date.today()
if today == date(2022, 1, 1):
  message = 'Happy New Year!'
else:
  message = 'Have a nice day!'
print(today,message)
```
## 自己評価
　肩に力が入ってなくて、いいんじゃねw

## Githubはこちら
 [AppMakesYouHappy](https://github.com/Hiroyuki-Moriya/AppMakesYouHappy)
Google Apps Scriptを活用しよう: サンプルスクリプトやライブラリ、ベンチマークなどのリスト

## リスト

[https://github.com/tanaikech/taking-advantage-of-google-apps-script/tree/master/Japanese_version](https://github.com/tanaikech/taking-advantage-of-google-apps-script/tree/master/Japanese_version)

## 概要

これは、私の[Blog](https://tanaikech.github.io/)、[Gists](https://gist.github.com/tanaikech)、[GitHub](https://github.com/tanaikech)や[Stackoverflowでの私の回答](https://stackoverflow.com/users/7108653/tanaike?tab=answers)で公開している主にGoogle Apps Scriptを活用するためのサンプルスクリプトやライブラリ、ベンチマークなどをカテゴリー毎にまとめたリストです。Google APIsを活用するための情報も含まれています。

オリジナルは[こちら（英語）](https://github.com/tanaikech/taking-advantage-of-google-apps-script)です。このリストのみを日本語に自動翻訳させています。リストにある各リンク先は英語です。

先日、このリストだけでも日本語にすると検索しやすくなるのではないかという話になり、日本語に翻訳したリストを公開させていただきました。何かのお役に立てますと幸いです。
JavaのSEがRubyを書くためのまとめ

#目的
・Rubyの基本を理解し、他人のコードを読めるレベルに到達する。
・基本を整理しつつ、Javaとの違いを関連付けをしたい。
(・Qiitaデビュー)

#動確環境
**OS**: Mac
**Version**： 2.6.8p205

#基礎知識
##全てがオブジェクト
文字列、配列はJava同様にオブジェクト。
さらには、数値、真偽値、nil(Javaではnull)、正規表現等もオブジェクト。

なので以下のように、それぞれに対してto_sメソッドでオブジェクトから文字列化することも可能。

```
true.to_s
nil.to_s
```
##文の区切り
基本的に文の区切りにセミコロン不要、改行でよい。
１行に複数の文を記述したい場合に明示的に;で区切ることは可能。

##コメント
◯１行コメント
Java: //
Ruby: #

◯複数行コメント

```Java
/*
Javaコメント
*/
```

```ruby
=begin
Rubyコメント
=end
```
##変数
###型定義
動的型付け言語なので、宣言時のデータ型記述は不要。
(慣れないうちはコーディングしてて不安になる)

```ruby
str = 'hello'
int = 10 * 10
```
型宣言していないので異なるデータ型を代入できてしまうので注意が必要。



###命名慣習
Javaではキャメルケースが多いが、Rubyではスネークケースが慣習。

```ruby
snake_variable = 'スネークケース'
```

##文字列
### シングルクオートとダブルクオート
Javaでは１文字の場合を除きダブルクオートで囲むが、
Rubyでは以下の違いがある。
・シングル -> 特殊文字をそのまま出力。
・ダブル  -> 特殊文字の適応。文字列内での式展開。

```ruby
# 特殊文字
puts 'hello \n world'　#改行されないで/nごと出力。
puts "hello \n world" #改行される

# 式展開
name = "ボブ"
age = "F"

puts "私は#{name}です。#{age.to_i(16)}歳です。" # name、ageに式展開されてから入る
#私はボブです。15歳です。
```

###　文字列同士の比較
```
Java: "AAA".equals("AAA");
Ruby: "BBB"== "BBB"
```

## 数値
###インクリメント・デクリメント
Rubyには++、--演算子が使えない。
Java: n++;
Ruby: n += 1

他はJavaと大きな違いはない印象。

## 真偽値と条件分岐
Rubyでは、Javaと異なり以下のルールがある。
・false、nilであれば**偽**。
・その他は**全て真**。

```ruby
# 以下のものは全て真
1
-1
'false'
''
```

nilを偽で使うケースは、**データの有無**で処理を分けたい時に便利。

```ruby
# データを取得するような関数
data = find_data(hoge)

if data
  puts "データあり"
else
  puts "データ無し"
end
```

## if文
・全体的に、Javaのifからカッコを無くした感じ。
・"else if"が、"elsif" になっている点に注意。
・終わりにendの記述。
・**最後に評価された式を戻り値として返す。** 

```ruby 
if 条件a
  #処理a
elsif 条件b
  #処理b
else
  #処理c
end
```

```ruby
# 最後に評価した式を返す。
age = 20

result =
if age < 20
    "未成年"
else
    "成人"
end

puts result # 成人
```

また、ifを修飾子として書くこともできる。
(英語っぽい書き方だね)

```ruby
point = 3
day = 1
point *= 5 if day == 1
puts point # 15
```

## メソッド
###定義
・Javaから{}を無くした感じ。
・def,endを記述。
・戻り値の型宣言はやはり不要。
・引数が必要ない場合は、省略可能。

```ruby
def greeting
  "こんにちは!"
end
```
### 達筆中、、、

#参考文献
・[プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plus)](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design/dp/4297124378/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=W7NSI89V9P4J&keywords=%E3%83%97%E3%83%AD+ruby&qid=1640233837&sprefix=%E3%83%97%E3%83%AD+ruby%2Caps%2C230&sr=8-1)
BigQuery備忘録 : GA4から取得したデータをBigQueryで扱う時に使う2つの関数(unnest, _table_suffix)


【<b>ネストの解除</b>】
・ ネストとは、一つの要素に対して複数要素が対応しているもの(配列)。
・ 対応している複数の要素のカラム名に対して、unnestする。

例えば、こんなschoolテーブルがあるとします。

| absence_date | class.key | class.string | class.int | 
| ------------ | --------- | ------------ | --------- | 
| 20181001     | room      | A            | null      | 
|              | my_number | null         | 000001    | 
|              |           |              |           | 
| 20181003     | room      | B            | null      | 
|              | my_number | null         | 000003    | 
|              |           |              |           | 
| 20181006     | room      | C            | null      | 
|              | my_number | null         | 000005    | 


例えば、20181001に遅刻した学生はAというクラスにいる000001番の人です。

ここで、上記テーブルをこんな感じで書き換えたいと思います。

| absence_date | room | my_number | 
| ------------ | ---- | --------- | 
| 20181001     | A    | 000001    | 
| 20181003     | B    | 000003    | 
| 20181006     | C    | 000005    | 

```
select
   absence_date,

   -- classのネストを解除した後、keyのroomから値を引っ張ってくる。
　　　　　　-- roomの値はstringカラムにある。

   (
     select
        string
     from 
        unnest(class)
     where
        key = 'room'
   ) as room,

   -- classのネストを解除した後に、keyのmy_numberから値を引っ張ってくる。
   -- my_numberの値はintカラムにある。

   (
     select
       int
     from 
       unnest(class)
     where 
       key = 'my_number'
   ) as my_number
from
    school;
```

これでOKです。

【<b>テーブルの中に変数を埋め込む</b>】
・　GA4から持ってきたデータなどは、日付ごとにテーブルが分割されている
・　例えば、
　　`firebase-public-project.analytics_153293282.events``_`<b>`20181002`</b>
・日付部分を * に変えて、_table_suffix関数を用いて、期間を指定する。

```
-- ユーザー定義関数で直近1年を指定
create temp function start_datesuffix() as (
  format_date('%Y%m%d',date_sub(date(current_timestamp,'Asia/Tokyo'),interval 1 year))
);

create temp function end_datesuffix() as (
  format_date('%Y%m%d',date(current_timestamp,'Asia/Tokyo'))
);
-- 直近1年のデータを取得

select
   *
from 
   `firebase-public-project.analytics_153293282.events_*`
where
   _table_suffix between start_datesuffix() and end_datesuffix();
```

ポイントは、where 以下です。
ぶっちゃけ、ユーザー定義関数でなくてもいいのですが、大体は直近1年や1ヶ月のデータが必要になるかなと思ったので、これを記載しました。

おしまい。
GTMでリンクのクリック計測が出来ない時は何がおきているのか

# 結論から
`gtm.linkClick` イベントが発生してほしいのに `gtm.click` しか発生していないため、GTMで標準的なクリック計測をするときに使うトリガー「クリック > リンクのみ」が動かない

---
以降は結論を確認する方法の説明です。


# クリックに連動するトリガーは「すべての要素」と「リンクのみ」の2つ
 
下記はトリガーを新規登録する時のトリガータイプの選択肢のキャプチャ。
![スクリーンショット 2021-12-23 12.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/5b4db07f-573a-cf7d-4c40-8549af736659.png)

「クリック」のタイプには下記2つのタイプが存在する

* すべての要素
* リンクのみ
 
「すべての要素」は全てのクリックで発火するトリガー。
ブラウザ内のどこをクリックしても発火する。（テキストでも画像でもリンクでも、なにもない背景でも）
 
「リンクのみ」はクリックした対象がリンクの時のみ発火するトリガー。
 

# 標準的なクリック計測の設定内容
* トリガー
    * トリガーのタイプ: リンクのみ
* タグ
    * タグの種類: Google アナリティクス: ユニバーサル アナリティクス
    * トラッキングタイプ: イベント
    * イベントトラッキングパラメータ: {GAのイベント計測したい値を設定}
    * Gooeleアナリティクス設定: {GAのトラッキングID}

　※ GAがユニバーサルアナリティクスの場合の設定です。GA4だとタグの設定内容が若干違います。

# クリック計測がされない。。。
原因は分かっていません。
HTMLの構造が問題という話もありますが、HTMLだけ抜き出して（CSSやJSは抜き出さない）試すと計測されたりするので、もっと複合的な原因がありそうです。

# 何が起きているのか確認する
## GTMのデバックモードでサイトを開く
Tag Assistantを使用する。
https://tagassistant.google.com/

GTMの管理画面から「プレビュー」をするとTag Assistantが起動する。
Tag Assistantに対象のサイトのURLを入力してサイトを表示する。

## サイト上でリンクをクリックして、Tag AssistantのConnect画面を確認する
### Tag AssistantのConnect画面
![Tag AssistantのConnect画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/3c469ff5-e627-77a0-b968-1eb5fa2459f3.png)

### クリック計測が出来る場合
画面左のSummaryに下記2つが表示される（時には2つ以上）
* Click
* Link Click
![スクリーンショット 2021-12-23 14.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/2b3bdc5e-2b79-c351-97eb-26db30863b4f.png)

Click はトリガータイプの「すべての要素」が発火する。
Link Click はトリガータイプの「リンクのみ」が発火する。

Click を選択すると、Variablesタブで `gtm.click` というイベントである事がわかる。
![gtm-click.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/789230e5-c751-9f3f-1c71-960b05f34e5a.png)

Link Click を選択すると、Variablesタブで `gtm.linkClick` というイベントである事がわかる。
![gtm-linkClick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/9ac342b2-5cac-a8dc-b80c-1871a2a4e6b5.png)


### クリック計測が出来ない場合
画面左のSummaryに Click のみ表示されて Link Click が表示されない。
![gtm-click-no-linkClick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/edd8e293-2e88-87b0-5d9f-fbe46012f7fc.png)


# 結論
クリック計測がされないのは、リンククリック時に `gtm.linkClick` イベントが発生してほしいのに `gtm.click` しか発生していないため。

# どうやって解消する
HTMLで解消する方法はHTML（CSS・JS・画像）を変更して  `gtm.linkClick` イベントが発生するHTMLにする。
計測のためにHTMLを変える事に対しては意見が分かれそうだが、これが出来るとGTMはシンプルな設定が出来る。

もう一つはGTMで解消する方法。
`gtm.click` イベントは発生しているので、これにトリガーの発火条件を絞ったり変数を組み合わせてイベント計測が出来るようにする。
HTMLの変更は要らないが、トリガーの発火条件を絞るのはHTMLのタグ名・クラス・IDを使うためGTMの設定が増えやすい。
HTMLの作りによっては、リンク一つに対してトリガー一つ用意する、とかもありえる。
スマホでストレージの空き容量が無くなった時に、アプリデータがどうなるか試してみた

##はじめに
面倒なのであまりやらないんですが、ストレージの空き容量が無くなった時にアプリが動いてて、どうなるのかなーって思いますよね。
まあOSが不安定になったり、動かなくなったりするので、アプリ側はあまり心配もしてないんですが、自前アプリで動作確認してみました。

スマホはフラッシュメモリーなので、長く使ってると、ライトエラーも起きますしねえ。
##結果
###android 11エミュレータで試しました。
- プリファレンスへ出力
    - 消えたりしなかった。書き込もうとした分は書き込めてなかった。
- ファイルへ出力
    -  ファイル内容は丸っと消えた。途中まで書き込めたりもするだろうね、きっと。試してないけど。対策すればいいんだけど面倒だね。
-  sqliteへ出力
    -  DBファイルは無事。書き込めないので例外が発生して、落ちた。

###iPhone XRで試しました。
androidと違い、空き容量200MBぐらいでダメになりました。設定のiPhoneストレージで確認したので、使用セクターの使ってない部分の合計が200MB近いとかなのかな

- NSUserDefaultsへ出力
    - 消えたりしなかった。書き込もうとした分は反映されなかったと思う。ごめんちょっと記憶が曖昧:sweat_smile:
- ファイルへ出力
    -  writeToFile:atomically:をYES指定では当然問題なし。[NSKeyedArchiver archiveRootObject:toFile:]も問題なし。他の方法はきっと問題あり。
-  sqliteへ出力
    -  DBファイルは無事。書き込めないけど。

##終わりに
以上、自社アプリそのままで、試せる範囲で試しました。
試してないけど、空き容量ありでのライトエラーでもきっと同じ結果。

自社androidアプリ、ファイル出力のが丸っと消えてたので、対策はした。まあ一時ファイルに保存して、成功したらオリジナルを削除して、リネームするのみ。
AzureのCustom Visionを使って物体検出してみた

### つくったもの
つくったものは洗濯表示の意味を教えてくれるアプリです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">先輩と2人でAzureのCustom Vision使って洗濯表示の意味を表示してくれるアプリ作りました <a href="https://t.co/0LDFVXCGJL">pic.twitter.com/0LDFVXCGJL</a></p>&mdash; abokado4770 (@abokado_niko) <a href="https://twitter.com/abokado_niko/status/1473278034941988864?ref_src=twsrc%5Etfw">December 21, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
### やったこと
スマホのカメラでスキャン→洗濯表示の個数を入力→写っている洗濯表示の意味を表示してくれます。
洗濯表示は全部で41種類ありますが、まだそのうちの20種類しか対応してません。物体検出するのに最低限必要な枚数の15枚しかトレーニングさせていないものも精度は80%を超えるので比較的楽に物体検出して遊べると思います。
Custom Visionの使い方など細かい話はこちらが詳しく丁寧に解説しています
https://ascii.jp/elem/000/004/058/4058850/
物体検出についてはこちらのサイトが詳しく解説しています。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/custom-vision-service/logo-detector-mobile
フロントエンドはPower Appsを使いました
Power Appsは私でなく先輩が担当したのでこちらの記事を読んでください
Power Appsでつまづいたら参考になるかもしれません。
（リンク間に合いませんでしたすみません。できたら更新します）
### 最後に
ノーコードでプロダクト作るの初めてだったのですが、物体検出がどんなものなのか体験してみる分にはいいと思います。やったことは写真撮ってタグつけてトレーニングだけですので（まぁそれが結構面倒なのはおいといて）
今度また画像認識するときには既にデータがあるやつでコードをゴリゴリ書きたいです。
他にもこちらのサイトでCustom Visionの活用事例を解説してますので参考にどうぞ
https://esg.teldevice.co.jp/iot/azure/column/column19.html
分からないこともMicrosoftのDocsで大体解決します
Joy-ConとPython3で脚部動作認識

#はじめに
こんにちは、HCB Advent Calendar 2021の21日目を担当するKimです。
僕は卒業研究でPC作業中の脚部動作促進システムの研究をしており、研究の中ではJoy-ConとPythonを使った脚部動作認識を実装しています。
今回は僕が実装した脚部動作認識について紹介します。
#脚部動作認識方法
##データの取得
開発中のシステムでは，Joy-Conから脚部動作中の加速度と角速度を取得し，その値を使ってMacで認識する流れになっています。
Joy-Conから加速度・角速度を取得する方法は@tocoteronさんの記事を参考にさせていただきました。
https://qiita.com/tocoteron/items/9a5d81c8f640ecaff7a9
Joy-Conから取得したデータは，その脚部動作を認識するための基準データとしてcsvファイル保存します。
##DTW距離の算出
DTW(Dynamic Time Warping)とは２つの異なる波形の類似度を距離として算出するアルゴリズムです。
DTW距離が小さいほど波形データの類似度が高いことを表します。
動作認識ではSVMなどの機械学習が僕の周りで流行っていますが，
DTWの場合は用意するデータが基準波形データと計測時の取得波形データの２つなので，データ収集の時間削減のために使用しています。
pythonだとfastdtwというライブラリを使うのが簡単だと思います。

```python
distance_LegMotion,path_LegMotion = fastdtw(file1,file2,dist=euclidean)
```
DTW距離の算出は上記1行で算出できます。
file1は取得したデータのcsvファイル、file2は基準データのcsvファイルが入ります。
##DTW距離の比較
脚部動作ごとに基準データを取得できたら，取得データと基準データとのDTW距離が算出します。
DTW距離の中で最小値となった基準データを脚部動作として認識します。
#おわりに
今回は開発中のシステムで使っている脚部動作認識の方法について記述しました。
研究発表が終わっていないので，ソースコードは非公開です。
脚部動作の軌道が似ているとまだ誤認識がありますが，閾値や裏処理を工夫すれば減らせそうな気がするので，今後も開発を頑張っていこうと思います。
PS2EXE-GUIの日本語文字化けの対策

[PS2EXE-GUI](https://github.com/MScholtes/TechNet-Gallery/tree/master/PS2EXE-GUI "PS2EXE-GUI")はMS公式ツールなので諸事情があっても使用しやすいが、
コメント以外の日本語は文字化けしてしまう。その対策をまとめました。
#メッセージ定義ファイルを用意
メッセージ定義のCSVファイルを用意（文字コードはSJISで保存）します。

```text:msg.csv
name, message
msg1, 完了しました。
title1, 完了
```

#定義ファイルを読み込むPowerShell
定義ファイルと同じパスに、EXE化するPowerShellを作成します。

```encodingFix.ps1
$MsgFile = ".\msg.csv"

#アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms

#SJISでCSVファイルを読み込み
$msgs = import-csv $MsgFile -Encoding Default

$msgs | %{
			if ($_.name -eq "msg1") {
				[string]$msg1 = $_.message
			}
			
			if ($_.name -eq "title1") {
				[string]$title1 = $_.message
			}
		}

[System.Windows.Forms.MessageBox]::Show($msg1, $title1, "OK", "Info")
```

#PS2EXE-GUIで同じパスにEXE化
PS2EXE-GUIで同じパスにEXE化して、実行すると、日本語が文字化けしません。
Unity UIを手動でレイアウトする方法

#はじめに

今日はクリスマス・イブ。
急いで仕事を片付けて帰ろうとしたその時、上司から呼び止められます。

「この UI画面のシーン ファイル、今日中に作っといて」

今までの貴方なら、やるせない悲しみを抱えつつ、様々なツールを起動していたかもしれません。

しかしこの記事を読んだ貴方なら、Unityだけを起動して、ポンポンポーンと作業して、

「お先で〜す！」

と帰れる・・・かもしれません。



#レイアウトが面倒なのは、実は 2種類しかない

・ 任意個のサイズ固定のものを、片側に密着させる場合
・ サイズ固定と比率固定が混合のものを、両側に密着させる場合

これら 2つとも Layout Groupで実現できます。



##🌟 基本の Hierarchy

毎回同じなので、覚えてしまいましょう！

### Canvas
1) Canvasを追加してください
2) Render Modeを Screen Space - Cameraにします
3) Render Cameraを Main Camera (Camera)にします
![Canvas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/fb5cdc1a-66d0-f168-cfbe-00d966777f61.png)


### 空の GameObject
1) Rect Transformを stretchで貼ります
2) Horizontal Layout Groupを追加します
縦向きのレイアウトの場合は Vertical Layout Groupを追加して下さい。
![GameObject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/8dfd9463-f221-3db7-0893-f3421cbd1885.png)


### Button と Spriteを設定しない Image
1) Layout Elementを追加します
![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/a62b3b9c-5d60-16c1-adf5-a197c57b9b81.png)


### Text と Spriteを設定した Image
そのままで OKです。



##🌟 任意個のサイズ固定のものを、片側に密着させる場合

![片側密着.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/f5d56216-4700-aa6f-93cb-4f808cb7dabb.png)


### GameObject
Horizontal Layout Groupを設定します。

* Control Child Size: On
* Use Child Scale   : On
* Child Force Expand: Off

![片側密着GameObject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/562c4979-3fdf-ee63-6586-117c083027e0.png)


### Button と Spriteを設定しない Image

Layout Elementを設定します。

* Min Width: サイズ固定の px

![片側密着Button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/6fda9bc7-946c-9305-60c5-46c12a621e81.png)

![片側密着Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/750318c8-63ed-28f4-5a43-355d1e718d47.png)



### Text と Spriteを設定した Image

自身の横幅が自動で設定されるので設定は不要です。



##🌟 サイズ固定と比率固定が混合のものを、両側に密着させる場合

![両側密着.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/255c6b06-56d9-d261-524d-c979bf4830f4.png)


### GameObject
Horizontal Layout Groupを設定します。

* Control Child Size: On
* Use Child Scale   : On
* Child Force Expand: On

![両側密着GameObject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/db341991-f417-c909-8d2c-f39b742c055b.png)


### Button と Spriteを設定しない Image

Layout Elementを設定します。

* Flexible Width: 10000... とにかく大きな値

![両側密着color Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/68dcc288-1519-76b1-6651-20a241f2361c.png)


##🎉 実装例

現在「歳時記カレンダー＋」という、日付をタップするとその日の記事が読めるカレンダー アプリを開発しています。この画面は Unity UIを使い、全て手動でレイアウトしています。日付は 1日毎に別々の GameObjectになっています。スワイプで左右にスクロールさせることが出来ますが、レイアウトは破綻しません。
![capture_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129732/99580b66-4c85-45d7-7549-0867b4f9721b.png)
※画面は開発中のものです。



# さいごに

実はこの方法を見つけるまで Unity UI (uGUI)で思い通りレイアウトできず、四苦八苦していました。Unity UIは説明不足で分かりづらくて・・・本当に時間を返してほしい😭

でも僕の涙がみんなの笑顔😊になるなら〜と思い、今回の知見を共有させていただきました。

皆様のクリスマスが楽しいものになりますように。メリークリスマス！⛄️🎄🎁✨
XcodeのiOSシミュレータ、古めのやつが劇遅な件

##はじめに
自社アプリを開発していて、ちょっと古いiOSシミュレータが劇遅だった。
最新iOSシミュレータだと問題なかった。xcode11/12/13でそうだった。
##原因は
Objective-CアプリでAVAudioPlayerを使っていると、理由はわかりませんが、劇遅になるようです。自社アプリだけかもしれませんが。
Swiftアプリは作ってないので、どうなのか不明です。

対策として、シミュレータ向けビルドではAVAudioPlayerを使わないようにしました。まあ主要機能じゃ無いので、開発中はなくても困らない。

```obj-c
//古めのiOSシミュレータだと劇遅になるので、SE無し
#if TARGET_OS_SIMULATOR
    return;
#endif
```

##終わりに
まあそれだけ。最新iOSシミュレータのみ問題無いのは謎。
困ってないので、それ以上は追ってないよ。

今までで一番手抜き:yum:
宇宙研学生コミュニティ 12月交流会

#前提

* これは 「[JAXA学生 Advent Calendar 2021](https://adventar.org/calendars/6213)」 の中の12/23の記事です。
* エンジニアリング的なことは一切書いてませんのでご注意ください。
* なかなか知り得ない、JAXAの所属学生の生態について興味のある方はぜひ読んでみてください！


#本文

はじめまして！
JAXA学生 advent calendar 12/23 担当の Omaam です！
世はクリスマスモードで街を歩けばクリスマスソングが聞こえてきてくるようになりました。
クリスマスの楽しい雰囲気の中に、年末の忙しさが同時に来るというというカオスは嫌いじゃないです。

さてさて、今回は宇宙研・JAXAに所属している学生が自治的に運営を行っている学生コミュニティで開催した、交流会の様子について紹介したいと思います！

##学生コミュニティについて

まずはこの学生コミュニティについて軽く紹介します。
といっても私も途中から参加したのでそんなに詳しくは知りませんので聞いた話にはなってしまいます。

学生コミュニティはちょうどコロナパンデミックが始まる少し前に創立メンバーによって作られた学生自治組織です。宇宙研にいる学生は、工学から理学まで様々なバックグランドを持ちつつ、宇宙への探究心というロマンのもと集結した同士の集まりです。しかし、残念なことに学生コミュニティが設立される前までは学生全体の包括的な繋がりはありませんでした。

この状況をなんとかしたいと思い立った初期メンバーによってこの学生コミュニティは設立されました。
地道な普及活動のおかげもありなんとか最初の顔合わせ交流会の計画までは漕ぎ着けることができたのですが、パンデミックが本格化してきてしまい開催することはできませんでした。

しかし、今年の後半からコロナ感染者が減少してきたこともあり、11月に感染対策をした上で初めて交流会を行うことができました！今回は12月に開催した2回目について紹介したいと思います。

##12月交流会

交流会と言ってもクリスマスパーティを行うといった大掛かりなものではなく、小一時間ほど集まってお菓子やコーヒーを嗜みながら、趣味やら研究やらの話をただ行うだけの軽い感じのものです。

うーん、どうしましょう。
様子を紹介するとか言いましたが特に書く内容がないのです（ただのおしゃべりしかしてないのだから！）
ということで楽しそうで魅力的な写真を自慢するだけにします。

![PXL_20211216_083507400.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355559/9a5d2b52-90b6-a8e9-f80f-45c928d2031c.jpeg)
![PXL_20211216_085840547.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355559/10fb8599-1030-624c-f8ea-ed01fd62dce7.jpeg)


##最後に
この文章を読んで、宇宙研の学生の様子が少しでも伝わってくれれば嬉しいです。
他にも宇宙研の様子や関連記事ががあるのでぜひぜひ興味があれば[JAXA学生 Advent Calendar 2021](https://adventar.org/calendars/6213)を覗いてみてください！

お粗末な文章でしたが、クリスマス前ということでご勘弁を。
メリークリスマス！
そして良いお年を！
ポスドクから企業のデータ分析職に転職した後の一年間を振り返りました

#はじめに
[昨年のAdvent Calendarの記事](https://qiita.com/tk-ml/items/92fe764cc2725095f0ed)ではポスドクからデータ分析職への転職活動について書きました。今回は転職後の約１年で経験したことや学んだことをプロジェクトごとにまとめました。受託なのでプロジェクトの具体的な内容は書いておりません。その点ご了承ください。

#メディア関係ログデータの集計・可視化（期間：約２ヶ月半）
Pythonを使ったテーブルデータの集計、可視化をひたすら実施しました。ポスドク時代にテーブルデータの集計を行うことはほとんどなかったので大変でしたが、このプロジェクトを通して飛躍的に上達しました。

顧客の前でプレゼンテーションすることも数回ありました。顧客の前でのプレゼンテーションは、学会発表と通じるところもあれば、そうでないところもありました。また、資料作成に費やすことができる時間がこれまでより圧倒的に短く、限られた時間で素早く資料をつくらなければならないためこれまでとは異なったやり方が必要でした。

#メディア関係ログデータのダッシュボード作成（期間：約２ヶ月）
BIツールを使ってログデータのダッシュボードを作成しました。ダッシュボード作成の経験はなくBIツールも全く使ったことがなかったのですが、このプロジェクトを通してBIツールを使ったダッシュボード作成に必要な技術を一通り習得できました。

#時系列データを使った故障予知の検証 (約半月)
機器の計測データから故障の予兆を捉えることができるかどうか周波数解析を用いて検証しました。データの整理、集計、ノイズ除去から周波数解析までPythonで実行しました。

#メディア関係サービスの利用数予測の検証（期間：約３ヶ月）
サービス利用数をどの程度の精度で予測できるか月、週、日単位で検証しました。データーベースからSQLでデータを抽出して、Pythonで集計、可視化、予測モデルの構築を行いました。
社内での検証だったため顧客とのコミュニケーションの経験を積むことはできませんでしたが、Pythonのスキルは向上し、集計、可視化、予測モデルのコーディングを格段に素早く実行できるようになりました。

# 文書検索技術の検証（期間：約4ヶ月）
深層学習を使った文章検索技術をPytorchで実装し、性能を検証しました。まず、顧客からいただいたテキストデータの前処理をPythonで実施しました（正規表現等を使用）。モデルのハイパーパラメータのチューニングとGPUを用いた学習をPytorchで実行し、性能を評価しました。比較対象として深層学習を用いない伝統的な手法も実装、評価しました。さらに、深層学習の計算結果を検索エンジンに組み入れました。

自然言語処理は未経験でしたが、本プロジェクトを通してテキストの前処理、文書検索に関連する自然言語処理の技術を習得できました。Pytorchに関しても計算グラフなど基本的なところは習得できました。また、深層学習のライブラリでの計算方法を正確に把握するためにライブラリのソースコードを読み解きましたが、その過程で優れた設計やcallメソッドはじめPythonの様々な機能を学習できました。

# 配送最適化アルゴリズム開発（約１ヶ月）
商品の最適な配送計画を算出するアルゴリズムを構築しました。このプロジェクトは現在継続中で、Pythonでアルゴリズムの実装、検証を実施しています。

この最適化問題は、考慮しなければならない要因が多く、その要因が絡み合っており非常に複雑です。また、アルゴリズムの計算時間も短くなければならないという事情があります。ですので、この複雑な問題を適切に数式で表現し、シンプルな手順で解を求めるアルゴリズムを構築する必要がありました。これを実現する上でアルゴリズム研究開発の経験が活きたと思います。

# 習得スキル

- Python
　ダッシュボード作成以外のプロジェクトではPythonを使用したので(期間：約１１ヶ月)、Pythonのコーディングスキルは飛躍的に向上しました。特にPandasを使ったテーブルデータの集計、分析の技術が一番伸びました。

- SQL
SQLに関しては、ログデータ、サービス利用数予測に用いるデータの抽出で使用したのみで、業務で利用する機会は比較的少なかったので、本を読んだりデータサイエンス１００本ノックに取り組んだりするなど自習で習得しました。

- プレゼンテーション
　顧客に対するプレゼンテーションの機会は少なかったのですが、プレゼンテーション資料の作成の技術が向上し、作成時間もある程度短縮できるようになりました。

- ソフトスキル
ポスドク時代は、個人の研究、他の研究者との共同研究に関わらず、基本的に自分のやり方、自分の考えで研究を進めておりました。入社以降は、PMの元、顧客の同意を得ながら仕事を進めていきますので、業務を通じて、チームでの仕事の進め方、コミュニケーションのとり方を学びました。

# 所感
多くのプロジェクトに関わることで様々な課題に取り組み、様々な技術に触れることができましたが、いずれのプロジェクトも期間が数ヶ月と短いため、業務を通じて一つのテーマ、技術を深めていくことはあまりできなかったように思えます。この点に関しては、ある程度自習で補いました（特にSQL）。

上述しましたが、仕事の進め方が、研究所と大きく異なるので、学ぶことが多かったです。例えば、研究のようにじっくり一つのことに取り組むのではなく様々な業務を素早く仕上げていかなければなりませんので、スピードに対する意識が重視する方向に大きく変化しました。

機械学習の専門性に関しては、活かせるプロジェクトもあれば、全く活かす機会のないプロジェクトもありました。ただし、ポスドク時代に培った問題解決能力、本質を深く考える力、プレゼンテーション能力、文章力、プログラミングスキル等ある程度抽象的な能力はどのプロジェクトでも大いに役立っていると思います。

今後も、分析、アルゴリズム開発からシステム開発まで一貫して遂行できるように技術を高めていきたいと思っています。

最後まで読んでいただきありがとうございました。
【一】Reactのライフサークルメソッド一覧

本記事はReactのライフサークルメソッド(lifecircle method)一覧をまとめてそれぞれの機能を説明いたします。

### 全体像
下記の全体像により、Reactのライフサークルメソッドは大体三種類があります。

- Mounting
- Updating
- Unmounting

![react_lifecircle_method.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/25a582a5-cbf4-23e9-9279-0d10717b8278.png)


### Mounting
Mountingとは、コンポーネントがユーザーにレンダリングされるまでの仕込みの期間である。
Mountingにおいて、以下のライフサークルメソッドがあります。


| 項番 | メソッド | 説明 |
|:-----------|:------------|:------------|
| 1      | constructor | Mounting時に一番最初に呼ばれるメソッドです。JSXでは使われることがほとんどないため、見かけることもまれです。super(props)を呼び、更新がする必要性があれば更新できます。         |
| 2| static getDerivedStateFromProps| このメソッドだけはstaticです。render()が呼ばれる前にstateの更新があるかどうかを確認します。もしあれば更新後のstate、無ければnullを返します。|
| 3| componentWillMount | このメソッドはconstructorからrenderまでの間に呼ばれる。危険なメソッドので、React v17から除去される予定です。  |
| 4| render | このメソッドだけはコンポーネントで必須です。ReactがJSXコードを評価して、仮想DOMを構築します。|
| 5| componentDidMount| このメソッドはコンポーネントがDOMに反映される後に呼ばれる。|

### Updating
Updatingとは、コンポーネントがユーザに表示されており、ユーザーが操作できる期間である。
Updatingにおいて、以下のライフサークルメソッドがあります。

| 項番 | メソッド | 説明 |
|:-----------|:------------|:------------|
| 1      | componentWillReceiveProps | Update時に一番最初に呼ばれるメソッドです。コンポーネントのstateを初期化します。       |
| 2      | static getDerivedStateFromProps| このメソッドはReact v17から除去される予定です。       |
| 3      | shouldComponentUpdate| コンポーネントの評価と再レンダリングを継続するかどうかを決定します。つまり更新をここでキャンセル出来ます。       |
| 4      | componentWillUpdate| このメソッドはReact v17から除去される予定です。       |
| 5      | render| 上記と同様に、レンダリングするメソッドです。      |
| 6      | getSnapshotBeforeUpdate| 更新が発生する直前のスクロールを位置を記憶して、提供するような使い方が出来ます。       |
| 7      | componentDidUpdate| 更新が完了した際に呼ばれるメソッドです。       |

### Unmounting
Unmountingとは、他のコンポーネントに切り替え前に現在表示されているコンポーネントを破棄するための期間である。
Mountingにおいて、以下のライフサークルメソッドがあります。

| 項番 | メソッド | 説明 |
|:-----------|:------------|:------------|
| 1      | componentWillUnmount | コンポーネントがアンロードする時に、破棄される前にトリガーされます。このライフサイクルメソッドを使用して、任意のクリーンアップタスクを実行できます。      |

### Error Handling
レンダリングする時に、エラーが発生したら、このメソッドは呼ばれる。
Error Handlingにおいて、以下のライフサークルメソッドがあります。

| 項番 | メソッド | 説明 |
|:-----------|:------------|:------------|
| 1      | static getDerivedStateFromError | 子供のコンポーネントはエラーが発生する時に、このメソッドは呼ばれる。      |
| 2      | componentDidCatch | 子供のコンポーネントはエラーが発生する時に、このメソッドは呼ばれる。      |

### 最後に
最後まで読んでいただき、ありがとうございました。
本記事は下記のサイトを参照しました。
1.[React Guidebook](https://tsejx.github.io/react-guidebook/foundation/main-concepts/lifecycle/#static-getderivedstatefromerror)
2.[【Reactの設計を学ぶ】ライフサイクルを知ろう](https://code-ship-blog.wemotion.co.jp/technology/%E3%80%90react%E3%81%AE%E8%A8%AD%E8%A8%88%E3%82%92%E5%AD%A6%E3%81%B6%E3%80%91%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%82%92%E7%9F%A5%E3%82%8D%E3%81%86/#section1)
Julia: http クライアントの使い方 (Post)

```julia:http_post.jl
#! /usr/bin/julia
#
#	http_post.jl
#
#						Mar/02/2022
# --------------------------------------------------------------------
import Pkg; Pkg.add("HTTP")
using HTTP
# --------------------------------------------------------------------
println("*** 開始 ***")
url = "https://httpbin.org/post"
header = [("Content-Type", "application/json")]
params = Dict("user" => "jiro", "password" => "123456")
rr = HTTP.request("POST",url,header,query = params)
#
println(rr.status)
println(String(rr.body))
println("*** 終了 ***")
# --------------------------------------------------------------------
```

実行コマンド

```bash
./http_post.jl
```

次のバージョンで確認しました。

```text
$ julia -v
julia version 1.8.5
```
Julia: http クライアントの使い方 (Get)

```julia:http_get.jl
#! /usr/bin/julia
#
#	http_get.jl
#
#						Dec/23/2021
# --------------------------------------------------------------------
import Pkg; Pkg.add("HTTP")
using HTTP
# --------------------------------------------------------------------
println("*** 開始 ***")
rr = HTTP.request("GET", "https://httpbin.org/get"; verbose=0)
println(rr.status)
println(String(rr.body))
println("*** 終了 ***")
# --------------------------------------------------------------------
```

実行コマンド

```bash
./http_get.jl
```

次のバージョンで確認しました。

```text
$ julia --version
julia version 1.8.5
```
【作業効率化】超簡単！たった 5 分でターミナルを見やすくカスタマイズする方法

# ◇ 完成イメージ
▽ iTerm2
![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911184/626f2957-7d69-5d88-a4ad-46312591efdc.png)

▽ VSCode 内ターミナル
![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911184/80334ebf-e74b-f90a-cf56-3c85805448bb.png)



# ◇ 環境
- Mac
    - シェルは `zsh` を使用
    - `Homebrew` はインストールしているものとします

# ◇ 今回利用するツール
- Prezto
    - `zsh` 拡張フレームワーク
- iTerm2
    - Mac 専用のコマンドラインツール
    - 下記よりインストールしておいてください
        - https://iterm2.com/

# ◇ 大まかな流れ
1. `Prezto`の設定
    1. ターミナルに好みのテーマを適応します
2. `iTerm2`の設定
    1. プログラミング用フォント`Ricty`を適応します

# ◇ 設定方法

## 1. Prezto の設定

##### 【1】 設定ファイル ( `.zshrc` ) をバックアップ

```      
  $ mkdir ~/BACKUP      
  $ cp ~/.zshrc* ~/BACKUP
```

##### 【2】 下記コマンドにて、不要ファイルの削除
        
```
$ rm -rf ~/.zprezto ~/.zlogin ~/.zlogout ~/.zpreztorc ~/.zprofile ~/.zshenv ~/.zshrc
```    

##### 【3】 Prezto をインストール
        
```
$ git clone --recursive https://github.com/sorin-ionescu/prez... "${ZDOTDIR:-$HOME}/.zprezto"
```
        
    
##### 【4】 新しい zsh 構成を作成
        
```
$ setopt EXTENDED_GLOB
    for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
 ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
    done
```

▽ この際、下記ファイルが生成されます。
- `.zprezto` `.zlogin` `.zlogout` `.zpreztorc` `.zprofile` `.zshenv` `.zshrc`

##### 【5】 バックアップしておいた設定ファイル( `.zshrc` )の内容を移行
        
##### 【6】 ターミナルを再起動

```
$ exec $SHELL -l
```

##### 【7】 適応させたいテーマを選ぶ

```
# テーマの一覧表示
$ prompt -l

# テーマのプレビューを確認
$ prompt -p name
```

- 下記サイトでも手軽に確認できます。
    - [参考] https://mikebuss.com/2014/04/07/customizing-prezto/
  
##### 【8】 テーマの適応
- 試しに`sorin`というテーマを適応してみます。

```
$ prompt -s sorin
```

![sorin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911184/b5e75c64-a86b-bc18-5657-b3139f7da667.png)
※ 因みに、冒頭で紹介したものは`paradox`というテーマになります。

## 2. iTerm2 の設定
##### 【1】 プログラミング用フォント`Ricty`の追加に伴うパッケージをインストール
    
```
$ brew tap sanemat/font
``` 

##### 【2】 `Ricty` をインストール

```bash
$ brew install ricty
```

##### 【3】 `Ricty` を `/Fonts/` 配下にコピー

```bash
$ cp -f /usr/local/Cellar/ricty/4.1.1/share/fonts/Ricty*.ttf ~/Library/Fonts/
```

##### 【4】 キャッシュを更新

```bash
fc-cache -vf
```

##### 【5】 `iTerm2` の設定画面で、フォントを `Ricty` 変更

![iterm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911184/6653bc44-e40e-d0d8-a2b2-e581139ab23e.png)

# ◇ 参考
- https://github.com/sorin-ionescu/prezto
- https://mikebuss.com/2014/04/07/customizing-prezto/
- https://github.com/sanemat/homebrew-font
iPhoneのDroidCamアプリとPC(Windows,Python,OpenCV)の接続

iPhone:iPhone7
iOS:14.6
DroidCam:1.8.0

PC:
OS:Windows10
Python:3.9.4
OpenCV:4.5.1.48

上記の環境を同一のLANネットワークに接続し、
iPhoneのDroidCamの映像を
Windows上のPythonアプリで受信して表示できた

参考にしたページは以下
[Connect/Dev47Apps](https://www.dev47apps.com/droidcam/connect/)
>Connect with internet browsers (Android)

の記述を特に参考にした


キャプチャ結果の画像サイズは
水平：640、垂直：480

解像度指定する場合は、URLを以下のように変更する


```
cap.open('http://192.168.179.3:4747/video/force/1280x720')
```
スマホのIPアドレス：192.168.179.3
スマホのポート番号：4747
（IPアドレスとポート番号は、スマホのDroidCamアプリを起動すると表示される）
解像度指定　水平：1280、垂直：720

ソースは以下。


```connect.py
# DroidCam接続
import cv2

cap = cv2.VideoCapture()
cap.open('http://192.168.179.3:4747/video')  # OK (480,640,3)

while(True):
    ret,frame = cap.read()
    cv2.imshow("remote" , frame)
    # qキー入力でwhileループを抜ける
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
# 撮影用オブジェクトとウィンドウの解放
cap.release()
cv2.destroyAllWindows()

```
【mac】github複数アカウントをdirenvを使って環境変数で切り替える

仕事とプライベートでgithubアカウントを分けて運用しています。

https://qiita.com/kn339264/items/2078f5971fdaf3bbe767

.gitconfigで設定を分けていたのですが、direnvが便利だそうなので設定してみます。

## direnv is 何？
現在いるディレクトリに環境変数をロード/アンロードする拡張機能をシェルに追加できます。

https://direnv.net/

## direnvのインストール
```
$ brew install direnv
```

インストール後はバージョンを確認

```
$ direnv --version
```

公式のとおり.zshrcに追記

```
eval "$(direnv hook zsh)"
```

.zshrc再読み込み

```
$ source ~/.bashrc
```

## gitの環境変数を設定

下記のように仕事用ディレクトリとプライベート用ディレクトリがある場合、それぞれのディレクトリ直下に.envrcファイルを設置する。

```
├ work/
└ private/
```

.envrcに環境変数[^note]を追記

```
export GIT_COMMITTER_NAME=ユーザー名
export GIT_COMMITTER_EMAIL=メールアドレス
export GIT_AUTHOR_NAME=ユーザー名
export GIT_AUTHOR_EMAIL=メールアドレス
export GIT_SSH_COMMAND="ssh -i /user/to/path/sshkeyファイル"
```

.envrcの内容を反映する

```
$ direnv allow
```

これでgit commit、git push時に環境変数を参照するようになります。
今回の設定（環境変数の設定）だと`git config --list`ではuser.nameやuser.emailは表示されないので、git commit後にgit logを念の為確認しましょう。

```
$ git log
```


[^note]: ちなみに環境変数はGit公式ドキュメントに記載があります。[GIT_SSH_COMMAND](https://git-scm.com/docs/git#git-codeGITSSHcode)、[GIT_AUTHOR_NAME,GIT_AUTHOR_EMAILほか](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables)
hyperfineの雑な使い方

Rust製ベンチマーク計測用の便利なコマンドで、hyperfineというのがある。

https://github.com/sharkdp/hyperfine

READMEを一読してもいまいち使い方がわかりにくいのでメモ。
出力形式を最初に指定して、あとは、比較したいコマンドを並べておけばいい。たとえばこんな感じ。

```sh
hyperfine --warmup 1 --export-csv vcf-bench.csv \
  'python python-cyvcf2/read.py 1kg.chr1.subset.bcf' \
  'rust-htslib/target/release/rust-rhtslib 1kg.chr1.subset.bcf' \
  'rust-noodles/target/release/rust-noodles 1kg.chr1.subset.bcf' \
  'nim-hts-nim/read ./1kg.chr1.subset.bcf' \
  'c-htslib/read 1kg.chr1.subset.bcf' \
  'python python-pysam/read.py 1kg.chr1.subset.bcf' \
  'go-vcfgo/go-vcfgo 1kg.chr1.subset.vcf.gz' \
  'ruby-htslib/read.rb 1kg.chr1.subset.bcf'
```

出力できる形式は `asciidoc` `csv` `json` `markdown` の４通り。2つ以上指定することも可能。

```man
--export-asciidoc <FILE>
--export-csv      <FILE>
--export-json     <FILE>
--export-markdown <FILE>
```

この記事は以上です。