OmniAICreator/Qiita-1.07M huggingface dataset:
コードの意図 ～たかがmergeされどmerge～

# tl;dr

- この記事は[terraform Advent Calendar 2020](https://qiita.com/advent-calendar/2020/terraform)の4日目です
- 先日同僚のコードをレビューした時に merge の使いどころについて解説したんだけどちょっと整理しようかなって
- merge の順序だけでも意図があるんだよって
- ぶっちゃけカレンダーに穴を開けないようにしたいだけｗ

# 元のコード

aws関係の自作モジュールで tags を渡すところが微妙だった。

```hcl:a.tf
module a {
  source = "../modules/hoge"
  （省略）
  tags = {
    Project = "X"
    Env     = "prod"
    Make    = "terraform"
  }
}
```

```hcl:module/hoge/
variable "tags" {
  description = "tags"
  type        = map
  default = {
    Project = ""
    Make    = "terraform"
    Env     = ""
  }
}

resource aws_hoge {
  （省略）
  tags = var.tags
}
```

もちろん動くけれども。

# なにがダメか

- tags の default 部分は呼び出し側の値をバリデートしていないので値が自由になる（バリデーションは今回の用向きには必要ないので対象外）
- Make = "terraform" って、呼び出し側が書いてたら意味ない
- それはつまり Make タグの値を他の値にしてしまうことも可能になる（Make:Ansible とかねｗ）
- この module を使ったらタグに Make:terraform が付くんだよ、という意図を持たせたかったはずなんだけど。。。

# ダメな直し

```hcl:module/hoge/
locals {
  tags = {
    Make = "terraform"
  }
}

variable "tags" {
  description = "tags"
  type        = map
  default = {}
}

resource aws_hoge {
  （省略）
  tags = merge(local.tags, var.tags)
}
```

惜しい。けど、[merge()](https://www.terraform.io/docs/configuration/functions/merge.html) は後勝ちなので、呼び出し側で Make = "ansible" って書いたら結局それになっちゃう。
あえて意図をつけるなら、Make ってタグを渡さなくても自動で terraform が付くよ。書き換えてもいいよ。になってしまう。
たぶん違うタグで違う用途ならアリかもしれないが、今回には当てはまらない。
少なくてもロジックとして考えた場合、好きな値に出来てしまうなら最初からデフォルト値なんか持たせる必要がなかった。つまりただの考慮漏れに見えてしまう。

# Make:terraform を死守するための直し

```hcl
  tags = merge(var.tags, local.tags)
```

これなら Make:terraform を死守できる。
意図しているところは、このモジュールを使うと Make:terraform というタグが付く。違う値にはさせない。消すこともさせない。になる。
（そしてこの意図は他のタグやアトリビュートでも同じように使える大事なことだ）

# （おまけ）そこまで考える必要ある？

- 自作モジュールだし、動けばいいんだよって意見はごもっとも。一緒には仕事したくないけどｗ
- 別の値にしたい奴には好きにやらせればいいじゃんって意見には、まぁ好きにすればと。インターネット老人会またはPerlユーザならそう考えるのもわかる。
- 意図とかコメントしておけばいいんじゃんって意見には、まぁ反対はする。コードが読めないメンバーを慮って説明をコメントするのはリーダブルコード的にも美しくない。
- スケジュールとか手間とかって意見には、仕事のQEDを勉強しなおしてきてねって。話はそれからだ。
- 異論は認めるｗ

# （おまけ２）たとえば

- 例えば PowerdBy とか、BaseCode とか、モジュールを使っていることを明示的にタグで残す、のはリソース管理の観点からもお勧め
- 例えば Name タグを後ろに書いてあるモジュールは多い（Nameの値をソレにする意図がある）
- 例えば [aws vpc module](https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/main.tf) とかを見て、意図を考えるのとても勉強になる

# 最後に

神は細部に宿るって言うし、ちょっとでもいいコードをしゅっと書けるようになりたい。
Git/Githubで管理しているAndroid Studioプロジェクトの名前を変更する時の手順

この記事は、Git/Githubで管理しているAndroid Studioプロジェクトの名前を変更する時に、軽く梃子摺ったため備忘録として残すものです。
同じ悩みを抱えた人の手助けにもなれば幸いです。

# Git/Github関連
## Githubの操作

```
リポジトリ -> settings -> Rename
```

## .git/configを書き換える
対象のリポジトリにある.git/configを弄る

```config 
[remote "origin"]
    url = https://github.com/{your name}/hoge.git
    fetch = +refs/heads/*:refs/remotes/origin/*
```

↓

```config 
[remote "origin"]
    url = https://github.com/{your name}/huga.git
    fetch = +refs/heads/*:refs/remotes/origin/*
```

# Android Studio関連
## ディレクトリの名前を変更する
**Android Studio内部からではなく**、エクスプローラーなど外部からプロジェクトのルートディレクトリ名を変更する
## プロジェクトを開いてClean Project
この際、`settings.gradle`に下記の部分があれば書き換えてから実行

```gradle 
rootProject.name = 'hoge'
```

↓

```gradle 
rootProject.name = 'huga'
```

# 確認
```bash
git pull origin huga
```
とかでリポジトリにアクセスできれば終了

# 参考記事
[Android Studioでプロジェクト名を変更する](https://qastack.jp/programming/18276872/change-project-name-on-android-studio)
[GitHubのリポジトリ名変更方法](https://qiita.com/hisurga/items/583e8dbe4970bc8c25c8)
VMwareを利用したBitVisor開発環境

先日の[BitVisor Summit 9](https://bitvisor.connpass.com/event/191785/)で，"Tracing BitVisor with bpftrace" という内容を発表しました([スライド](https://speakerdeck.com/mmisono/tracing-bitvisor-with-bpftrace))が，このとき開発は全てIntel macOS上のVMware Fusionでnested virtualizationを利用しておこないました．BitVisorを触ってみたいけどどうしたら良いかわからないとか，準備が面倒という人には結構おすすめの方法だと思うので，ここにその方法を紹介します．また，今回はmacなのでVMware fusionを利用しましたが，LinuxでもWindowsでも同様な方法でBitVisorを動作させることができると思います．

## 全体像

以下のような環境を作ります．

- VMwareのnested virtualizationでBitVisorを動かす
- BitVIsorはipxeを利用して，ローカルのbitvisor.elfを取得，ブートするようにする
- コンテナを利用したBitVisorのビルド環境を提供することで，macでも開発できるようにする

## 事前準備

VMwareにBitVisor上で動かすお好きなゲストOSをインストールしてください．また，以下の設定をおこないます．

- プロセッサの設定でnested virtualization (VT-x)を有効化
- UEFIではなくBIOSを選択 (UEFでも同じようなことができるはずですが，ここではBIOSブートを利用します)
- シリアルのプリンタを削除．シリアルコンソールの追加
- vmwareとローカルに接続するためのvmnet1を追加
- vmwareの設定ファイル (*.vmx) を開いて，以下のように設定 (macの場合，~/Virtual Machines.localized/ 以下に存在)

```bash
# シリアルポートの設定
serial0.fileType = "file"
serial0.fileName = "/tmp/bitvisor_serial"
serial0.present = "TRUE"

# ipxeブートの設定
ethernet1.connectionType = "hostonly"
ethernet1.addressType = "generated"
ethernet1.virtualDev = "e1000"
ethernet0.opromsize = 262144
ethernet1.opromsize = 262144
ethernet1.present = "TRUE"
e1000bios.filename = "/tmp/bitvisor_dev_env/build/8086100f.mrom"
guestinfo.ipxe.net1.ip = "172.16.117.10"
guestinfo.ipxe.net1.netmask = "255.255.255.0"
guestinfo.ipxe.net1.gateway = "172.16.117.1"
guestinfo.ipxe.dns = "172.16.117.1"
guestinfo.ipxe.filename = "http://172.16.117.1:8000/bitvisor.elf"
```

なお，このあたりのIPアドレスの設定は使用するVMwareによって変わることがあります．うまく以下ない場合は一旦OSを起動してインタフェースに割り当てられているアドレスを確認してみてください．またVMwareの種類(WorkstationかPlayerか)によってGUIで設定できる項目に違いがあるようです．その場合も上記のように手動で設定すれば動作すると思います．

## BitVisorのビルド

簡単にビルドできるように，スクリプトを用意しました [mmisono/bitvisor_dev_env](https://github.com/mmisono/bitvisor_dev_env)．macでも動作します．WSLでもきっと動作します．というかあれはそもそもVMですし．

以下のようにクローンして使います．

```bash
% git clone https://github.com/mmisono/bitvisor_dev_env
% git submodule init
% git submodule update
% ./clone_bitvisor_mercurial.sh  // もしくは，./clone_bitvisor_git.sh
% ./make_config.sh   // bitvisorのmake config. TTY_SERIALをONにしておくと良いです
% ./make.sh          // bitvisorのビルド 
% ./build_ipxe.sh    // ipxeのビルド
% cd build 
% python3 -m http.server // ipxe用のサーバの起動
% // 別のウィンドウで
% tail -f /tmp/bitvisor_serial  // bitvisorのシリアルログをみる
```

## BitVisorの起動

全てがうまくいけば，VMを起動すると，ipxeでbitvisorを取ってきてそれからゲストOSを立ち上げてくれます．BitVisorを修正したい場合は適当にソースを変更したあと，また ./make.sh でbitvisor.elfを更新してVMを再起動すればよいです．以下が実行例です (qiitaに動画が貼れないようなので画像で)

- 起動前

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153099/f0cceb37-1bd8-027b-440c-0037240877e2.png)


- ipxeでのブート
![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153099/e39ffd8b-0755-f1fd-2738-36bbaea88885.png)



- BitVisorの起動ログ

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153099/5265a351-b8e5-e726-3ad1-b1eb8c237300.png)


## まとめ

VMwareを利用したBitVisorの開発環境例を紹介しました．なかなか便利だと思うので，BitVisorの開発環境で挫折した人は是非一度試してみてはいかがでしょうか．
BitVisorのthreadとprocess

BitVisorにはthreadとprocessがあります．この二つについて簡単に説明します．なお一部の用語はIntel VT-xのものを利用しています．ご了承ください．AMDの場合でも内容は同様です．

---


一般に，プロセスもスレッドもCPUが実行するプログラムの単位で，その二つの違いはプロセスが独立したメモリ空間を持つのに対して，スレッドは同じグループのスレッド内でメモリ空間が共有されるという点です（スタックは除く）．

さて，BitVisorのthreadやprocessも上記の性質を持ちますが，それに加えて以下のような特徴があります．

## thread

Linuxでは一番最初にinitプロセスが動作しますが，BitVisorでは最初にmain threadが起動します．そして，VMX root modeのring0で動作するものは全てthreadになります．

### threadの作成

threadは `thread_new()` で作成することができます．ソース中で `thread_new()` を呼んでる箇所をみればthreadがどんなものか分かると思います．

### threadのスケジューリング

メインスレッドで実行されるメインループの`vt_mainloop()` 関数を見ると，ループの最初に `schedule()` が呼ばれていることが分かります．

```c
static void
  vt_mainloop (void)
  {
      enum vmmerr err;
      ulong cr0, acr;
      u64 efer;
      bool nmi;

      for (;;) {
          schedule ();
          vt_vmptrld (current->u.vt.vi.vmcs_region_phys);
          panic_test ();
[...]
```

基本的には `schedule()` は一つずつ作成したスレッドにスイッチして処理を進めます．逆に言えば，BitVisorのスレッドが動作するタイミングは（当たり前といえば当たり前ですが）VMEXITが発生し，VMX root modeに制御が移ったタイミングになります．またBitVisorはタイマ割り込みによるスケジュールは利用していないので，各スレッドは自分の責任で `schedule()` を呼ぶ必要があります．さもなければそのスレッドで処理が止まってしまいます．

## process

さて，BitVisorではprocessはVMX root modeのring3，いわゆる保護ドメインで動作します．プロセスのソースは `process/` 以下にあります．プロセスを新規に追加するには，ここにソースを書いて，Makefileに追加することになります．

### processの起動

processは `process_new()` 関数で準備をおこなったあとBitVisorのメッセージパッシングの仕組みを利用して起動します． 詳しくは core/process.c をみてください．processにコンテキストスイッチするときにsysenterでring3 (保護ドメイン)へ移行します．

メッセージパッシングの仕組みについては，また別途改めて機会があれば別の記事にまとめようと思います．

### processのスケジューリング

process自体にスケジューリングという概念はありません．プロセスがシステムコールを呼んだり，あるいはメッセージハンドラが終了すればsysexitでring0のスレッドに戻ります．そしてそこのスレッドで `schedule()` されることになります．

## 参考文献

process (保護ドメイン) に関しては以下にも説明があります．ここでは触れていないメッセージパッシングについても書かれています．．

- deep_tkkn, [BitVisor の保護ドメインとのI/F のお話 - Qiita](https://qiita.com/deep_tkkn/items/77d47bd470cbac3540e9), BitVisor Advent Calendar 2016
C言語　hexdump風に文字列を出力するプログラム

# オリジナルhexdump関数

メモリ領域を表示する関数です。
以下の3つの要素からなります。

- アドレス部
- ASCII部
- 文字列部

文字が表示文字でない場合は'.'に置き換えます。

## コード

```c
#include <stdint.h>
#include <unistd.h>
#define PRINTABLE(a) (' ' <= a && a <= '~')

void ft_print_nbr(uintmax_t n)
{
	char buf[17];
	char *p;

	p = buf;
	*p++ = '\0';
	while (1)
	{
		*p = "0123456789abcdef"[(n % 16)];
		n /= 16;
		if (!n)
			break ;
		p++;
	}
	if (!*(p - 1))
		*++p = '0';
	if (*(p - 2))
		for (int i = 0; i < 7; i++)
			*++p = '0';
	while(*p)
		write(1, p--, 1);
}

void *ft_print_memory(void *addr)
{
	unsigned char *s1;
	unsigned char *s2;

	if (!addr)
		return NULL;
	s1 = (unsigned char *)addr;
	s2 = s1;
	while (*s1)
	{
		ft_print_nbr((uintmax_t)s1);
		write(1, ": ", 2);
		for (int i = 0; i < 16; i++)
		{
			*s1 ? ft_print_nbr(*s1++) : write(1, "  ", 2);
			if (i % 2)
				write(1, " ", 1);
		}
		for (int i = 0; i < 16; i++)
			if (*s2)
			{
				write(1, (PRINTABLE(*s2) ? s2 : (unsigned char *)".") , 1);
				s2++;
			}
		write(1, "\n", 1);
	}
	return addr;
}

int main()
{
	char *s = "To find information use the search box on the top right corner of the screen, or categorically browse the wiki using the Documentation topic links provided below.";
	ft_print_memory(s);
	return 0;
}
```

## 出力結果

```terminal
0000000100003f11: 546f 2066 696e 6420 696e 666f 726d 6174 To find informat
0000000100003f21: 696f 6e20 7573 6520 7468 6520 7365 6172 ion use the sear
0000000100003f31: 6368 2062 6f78 206f 6e20 7468 6520 746f ch box on the to
0000000100003f41: 7020 7269 6768 7420 636f 726e 6572 206f p right corner o
0000000100003f51: 6620 7468 6520 7363 7265 656e 2c20 6f72 f the screen, or
0000000100003f61: 2063 6174 6567 6f72 6963 616c 6c79 2062  categorically b
0000000100003f71: 726f 7773 6520 7468 6520 7769 6b69 2075 rowse the wiki u
0000000100003f81: 7369 6e67 2074 6865 2044 6f63 756d 656e sing the Documen
0000000100003f91: 7461 7469 6f6e 2074 6f70 6963 206c 696e tation topic lin
0000000100003fa1: 6b73 2070 726f 7669 6465 6420 6265 6c6f ks provided belo
0000000100003fb1: 772e                                    w.
```

## ポイント

- アドレスも数字なので、アドレス部とASCII部の出力を1つの関数にまとめました。
- unsigned charにキャストすることで、拡張ASCIIに対応できるようにしています。
    - 文字を扱うときは、基本的にcharで渡されたとしても、unsigned charにキャストして使うのがおすすめです。
【jQuery】のお作法について


#はじめに
弊社のAdvent Calendar 3日目の記事として投稿します。
内容はフロントサイドの師匠から教わったjQueryのお作法について。
調べても意外と出てこないので、知識共通と自分の備忘録を目的に書きます。

#jQueryの基本
調べれば腐るほど出てくるので簡潔に。
HTMLの読み込みが終わったら処理を実行するよ。という書き方は以下の3種類あります。
これがないとHTMLの読み込みが終わっていないのに処理が実行してしまい、正しい処理ができないです。
決まり文句と思いましょう。

```
$(function () {
    //処理
});

jQuery(document).ready(function () {
    //処理
});

jQuery(function () {
    //処理
});
```

このドキュメントレディは同時発火が可能であり、極論を言えば1処理ごとに記載出来ます。
しかしそれでは可読性・保守性が低く、バグ調査やエンハンス開発の大きな障害となります。
そこでjQueryを書く際、心に留めてほしいのは
######jQueryとは関数型プログラミングである
ということです。
関数型プログラミングについては調べれば私より詳しく簡潔に書いてある記事がありますので、そちらを参照してください。

#jQueryのお作法


```
$(function () {
    // 変数定義
    var log1 = 'func1です';
    var log2 = 'func2です';

    // 関数定義
    // 処理関数
    var initialize = function () {
        func2();
    };

    // イベント関数
    var func1 = function () {
        console.log(log1);
    };

    var func2 = function () {
        console.log(log2);
    };

    // イベント発火バインディング
    $(document).on('click', '.btn', func1);

    // 初期処理
    initialize();
});
```

このように定義ごとに分けて記載することで可読性・保守性が高いソースとなります。
可読性・保守性が高ければバグ発見・修正も簡単ですし、エンハンス開発も簡単でしょう。

例のように少ない処理であれば逆に見にくいかもしれませんが、サーバー負荷を軽減するためにフロントで出来ることはフロントで実装するのがデファクトスタンダードですので、様々な処理をフロントで行うようになればなるほど、このお作法の良さが光ります。
Sonic Piによるオーディオプログラミング例

Sonic Pi
===

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)

# 概要

https://sonic-pi.net/

Ruby言語をベースに音楽用機能と実行環境一体型IDEを含めたライブコーディング用言語環境。サウンドエンジンはSuperColliderを使用する。Raspberry Piでも動く。

開発はOvertoneと同じくケンブリッジ大コンピュータ研究所のSam Aaron。初出は2012年。音楽がプログラミング教育に適したテーマであると考えたRaspberry Pi Foundationからの依頼により、プログラミングやその他コンピュータ技術の経験がない12歳の学生にも使えるように設計された。(*1)

(*1) Samuel Aaron and Alan F. Blackwell. 2013. From sonic Pi to overtone: creative musical experiences with domain-specific and functional languages. In Proceedings of the first ACM SIGPLAN workshop on Functional art, music, modeling & design (FARM '13). Association for Computing Machinery, New York, NY, USA, 35–46.

# 実装例

## サイン波生成

Sonic PiはRubyの言語内DSLなので構文的にはRubyのものがすべて使えます。Sonic Pi 3.2.2では最新に近いRuby2.7.1がベースとなっており、Rubyのバージョンアップにもこまめに追従しているようです。とはいえSonic Piによる音楽生成には複雑なロジックや最新機能が必要になることはあまりないと思います。  
音程は周波数による指定ではなくMIDIノートナンバーで69(=A440)と指定します。デフォルトでは減衰音のエンベロープになっているので持続音的な音にしてみました。

```ruby

use_synth :sine
play 69, amp: 0.5, attack: 0, attack_level: 1, decay: 0, sustain_level: 1, sustain: 2, release: 0
```

## Delayエフェクト

Sonic Piは、Dir.pwdなどのカレントフォルダ取得関数がシステムフォルダを返しソースコードのフォルダを取得する方法がなさそうなので、ファイル操作は絶対パス指定でおこなう必要があります。

with_fxブロックで囲むとその内側で鳴らす音すべてにエフェクトがかかる、という独特の文法です。Echoエフェクトのディレイタイム指定phaseは1拍の長さに対する割合で指定します。0.4とした場合、BPM60なら0.4秒ですがBPM120なら0.2秒になります。bt()関数で1拍の秒数を取得できるので下の例ではミリ秒から変換して使用しています。

```ruby

datapath = "/tmp/"
file = datapath + "voice.wav"

delayTime = 400 # msec
feedback = 0.5
wetLevel = 0.5

use_bpm 120
delayPerBeat = delayTime / 1000.0 / bt(1)

with_fx :echo, phase: delayPerBeat, mix: wetLevel, decay: feedback * 10 do
  sample file
end
```


# 感想

言語仕様は、SuperColliderなどに比べると本業プログラマーではないアーティストにも理解しやすいわかりやすさがあります。Ruby言語の利点である、シームレスに言語を拡張しやすい、一見わかりやすく高度なこともできる、といった特徴を生かしている印象です。誰にでも扱いやすい平易な言語で本格的な使用にも耐えるものを作ることはなかなか難しく、そういう点でSonic Piは独自の地位を築いているように思います。

Rubyのライブラリという形ではなく実行環境一体型にして簡単インストール、実行画面もシンプル、チュートリアルや言語マニュアルなども実行画面を切り替えずにすべて見られるなど、言語仕様だけでなく全体にわたって注意深く使いやすさが設計されています。Raspberry Piとの関わりからもわかるように、プログラミング教育をひとつの目的としており、ハードルを下げるための思想が一貫しているように感じます。

ただし、Sonic Piの目的はあくまでライブコーディングであり、サンプルレベルの音声信号の生成や加工といった目的には向いていません。用意されている音源をlive_loopを使ってループ再生しながら、パラメータやプログラムを次々と書き換えて音楽を変化させていくのが本来の使い方だと思います。

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)
秘密分散と触れ合おうの話

はじめまして、ゆうぴっぴ([@_yu_pippi_](https://twitter.com/_yu_pippi_))と申すものです
ITに全く秀でていないながらもお勉強中なのでアウトプットしてみようと思います
対戦よろしくお願いします

# そもそも秘密分散って？
 - 数ある暗号技術の一つ
 - 秘密情報を何人かのメンバーで分散して管理する方法の総称

秘密情報をバラしてみんなで管理してリスク減らそうぜって考えですね

具体的に、各メンバーに渡される分散された秘密情報のことを「**シェア**」、秘密情報からシェアを生成する人(端末)を「**ディーラー**」、シェアを受け取って管理する人を「**参加者**」といいます。
なんで最後だけ参加者なんでしょうね...自分の見立てではシェアとディーラーに対応する日本語がなかったのかな...と勝手に妄想してます

# 具体的なシナリオ
以下のようなシナリオが考えられます(全てフィクションです)

ある会社の社長は役員たちに告げました
しゃっちょ「これ、マジで**†トップシークレット†**なんで大切に保管しといてね　あとよろしく」
役員たちはザワつきます
A「こんなもの、僕じゃ手に負えないよ」
B「お前のとこで保管しといてよ」
C「一人では荷が重すぎる」
「・・・」
「「「！！！」」」
そうですね、一社に一台、秘密分散です
彼らは三人で、全員が集まった時に復元できるように秘密分散するようにしました

# 加法的秘密分散法
今回は一番簡単にできる加法的秘密分散法を実装してみましょう
まず以下、定義します

```math
S：秘密情報 \\
r_1,r_2,\cdots,r_{n-1}:n人分の乱数
```

今回はAさんBさんCさんの3人で管理するので乱数は2つです

## 分散(シェア作成)
BさんとCさんには生成した乱数をそのままシェアとして渡します

```math
s_2=r_1 \\
s_3=r_2
```

Aさんには以下のようなシェアを渡します

```math
s_1=S-r_1-r_2
```

これでみんなにシェアを渡せました

実装例(Python3.8)

```
def create_share(secret, n):
    share = []
    for i in range(1, n):
        r = random.randint(-(2**63-1), 2**63-1)
        share.append(r)
    s = secret - sum(share)
    share.insert(0, s)
    return share
```

## 再構築(秘密の復元)
みんなが合意したときにシェアを持ち寄って全て足します(簡単！)

```math
s_1+s_2+s_3=(S-r_1-r_2)+r_1+r_2=S
```

これで復元できました

実装例(Python3.8)

```
def combine_share(share):
    s = sum(share)
    return s
```

以上のような感じで秘密を分散できました
n個のシェアをn人で管理するので(n,n)しきい値法とも呼ばれます
今回紹介した方法はだいぶ簡単に実装できるので安全性もそこまで高くありませんが他の方法(たとえばShamirの秘密分散)だともっと強い秘密分散を実現できたりします

いかがでしたでしょうか
拙い文ですが読んでいただきありがとうございました
みなさんも良い秘密分散ライフを！
実用rubyワンライナー

# なぜrubyワンライナーか

要約すると日々の業務で発生する雑な文字列処理をやっつけるのにrubyめっちゃ便利


## なぜワンライナーが必要か

1MBやら1GBある文字列を雑に処理したいときってのは結構存在する
例えば、ログやメディアの解析データ、gitコマンドの出力等に「hogeの出現間隔って最小どれくらい？」みたいな調査を行いたいことがある

そういったとき背筋を伸ばしてエディタ立ち上げてpython書くのも良いが、いかんせん怠いしめんどいし遅い

出来ればググる速度で結果を出したい
そういったとき、シェルコマンドを駆使してコマンドラインに直接ゴリゴリ書いていくワンライナーが効力を発揮する

## rubyワンライナーで何ができるか

主に文字列処理。他にもいろいろできるが、今回は割愛する

## なぜ文字列処理をrubyでワンライナーを行うか

rubyのメリットにこの辺がある

- `-e`や`-n`などワンライナーに便利なオプション
- 強力な正規表現
- 数値処理もできる
- `each_with_object`や`each_cons`など魅力的な関数がある
- rubyを使ってるユーザはそれなりにいる
- まぁそれなりにいろんな環境に入っている

# どうやってrubyワンライナーを使えばよいか

個人的によく使うパターン2つと、たまに使う機能と、一応知ってるけどめったに使わない機能を紹介する

## 個人的によく使うパターン

### `ruby -e 'ARGF.hoge' `

コマンドライン引数で指定されたファイルや標準入力をゴリゴリ処理するパターン。
集積処理やeach_consで2要素間の値取りたい場合などで良く使う

```bash:example1
# 1000までの3が付く数字の合計
$ seq -f "value=%g" 1000 | grep "3" | \
ruby -e 'p ARGF.map{|s| s=~/value=(\d+)/;$1.to_i}.sum()'
```


|コマンドライン|説明|
|:--|:--|
|ruby|rubyコマンド|
|-e オプション|引数として受け取った文字列をrubyコンマドとして実行する|


|出てくる単語|説明|
|:--|:--|
|ARGF|コマンドライン引数で指定されたファイル OR 標準入力を表す ファイルオブジェクト|
|他|rubyの勉強してくれ|

### `ruby -nle '$_ =~ /hoge/ and $1.to_i < fuga and print piyo'`

コマンドライン引数で指定されたファイルや標準入力から1行ずつとりだし、処理を行う
要するに高級なsedやawk

```bash:example
# ptsの下1桁が0なフレームを出力
ffprobe test.mp4 -show_packets -select_streams a 2>/dev/null | \
ruby -nle '$_ =~ /pts=(\d+)/ and $1.to_i % 10 ==0 and print $1.to_i'
```


|コマンドライン|説明|
|:--|:--|
|ruby|rubyコマンド
|-n オプション|sedやawkのように「1行ごとに読み出し-eオプションの引数を適用する」ようになる(※1)|
|-l オプション|入出力の改行をいい感じに処理する。具体的には`$_` に格納する値をchompする+print時末尾に改行を挿入する|
|-e オプション|引数として受け取った文字列をrubyコンマドとして実行する|

|出てくる単語|説明|
|:--|:--|
|and|`&&` と大体同じ。ただし、演算子の優先順位が非常に低い|
|$_|-nオプションによって割り当てられる(※1)|


(※1)もう少し正確な挙動について
-nオプションを使用すると下のように展開される。
getsはARGFから1行ずつ文字列を読み出し、変数 `$_` に格納される
詳細: https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html#cmd_option

```ruby
while gets
 ${eオプションの引数}
end
```

## たまに使う機能

コマンドラインオプション

|オプション名|使用頻度|説明|
|:--|:--|:--|
|-r feature|割と使う|require。モジュールの読み込み|
|-a|割と使う|awkモード。`-n` オプションと一緒に使う。 `$F` に`$_.split`の結果が代入される |
|-p |自分は使わないけど他の人は使ってるっぽい|-nの機能に加え、最後に `print $_`を行うようになる|
|-i [extension]|まれに便利|sedの-iなどと同じ。コマンドライン引数で指定されたファイルに標準出力の内容を書き込む。extensionを指定するとbackupを残しておける|


`-n`で自動定義される変数

|変数名|使用頻度|説明|
|:--|:--|:--|
|$.|まれに便利|現在の行番号|


## あるのは知ってるけどあまり使ってない機能

コマンドラインオプション

|変数名|使用頻度|説明|
|:--|:--|:---|
|-0|perlで使ったことがある|-nオプションで読み込む際に`\n`以外の文字で区切れるようになる。実用上は空行区切りにするのに使う|


その他

|キーワード|説明|
|:--|:--|
|BEGIN,END|awkのBEGIN ENDと同じ([参考](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#BEGIN))|
|条件式における `hoge..fuga` |flop flopとか呼ばれるもの。どうもdeprecatedぽいので説明は省略 ([参考](https://qiita.com/HMMNRST/items/b006db30dc8c15e1952b))|


# 参考
- https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html
- https://docs.ruby-lang.org/ja/latest/class/Kernel.html
- ミニマルperl(https://www.amazon.co.jp/dp/4873113687)
IchigoJam で DATA 文みたいなことをする

この記事は、[IchigoJam Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ichigojam) の 5 日目です。
まだ、Qiita に記事を投稿するのに慣れてないので、いろいろ至らない点があるかと思いますがご容赦ください。

# はじめに

かつてのベーマガに掲載されていたプログラムって、大抵は PCG やマシン語などのデータをプログラムの後半にまとめて DATA 文で記述してたじゃないですか。確か、Dr.D がそれを勧めていたような気がするんですけど、実際どうでしたっけ?

プログラムの後半にデータをまとめるべきかの是非はともかく、DATA 文が使えない IchigoJam でも同じような感じでデータをまとめて記述して、FOR 文で順次読み込むことができたらなぁ…って思う事ありませんか? 

# 実現例

早速ですが、こんな感じで実現してみました。

```
1 '### "KNIGHT" DATA ###
2 Z=#C03:Y=#700:U=0
3 X=0:IF PEEK(Z)!=39 GOTO 9
4 X=X-1:W=PEEK(Z-X)
5 W=W-41-W/32*6:IF W<0 GOTO 8
6 V=V<<6+W:POKE Y,V>>(X*2&7)
7 Y=Y+(X&3<3):U=U^W:GOTO 4
8 IF U LIST PEEK(Z-3):END
9 Z=Z+PEEK(Z-1)+4:W=PEEK(Z-3)
10 IF W GOTO 3 ELSE LRUN 1
11 '//AA3lQj:mw/k227uDHox1wbB
12 '3l/A/k//xCH7122///2zzw2/T
13 'kA///////kA2/zzzzzzAoxTjq
14 ':mzotAg:AwDzzkQ20kwT0zgxB
15 'EA2Uw8XAzjtx2Vc30kUT/:vQR
16 'sC2U3DU//UA62lYnTrzUkC2k9
17 'yC2Tj6ov0kQ610w/jb0M7C/EN
18 'y/0EcpNsCXW2/U//3/EU13//B
19 '///iuevc///I40kQ60k71003d
20 'C9csF0//51EMNdZa////35ksl
21 'T2Vg32nbNhhOEWG0/Es9DaVMG
22 'A7//T6lwT6k//0/ET4FwC2Us9
23 'uWvxTrnse1//TbtyTbty/9eeT
24 'JJKeeZJJ56tyzzxyTVVzzzzzK
25 'zzzzzkD
```

これは、電子工作マガジン 2020 年夏号付属のマイコン BASIC マガジンに掲載された私の作品 "KNIGHT" のプログラムの一部です。

PCG 16 キャラ分のパターンとパズル 15 面分のデータ、合わせて 256 バイトのデータを、アドレス #700 以降に展開し、プログラムスロット 1 に保存されているゲーム本編のプログラムを `LRUN 1` により実行しています。 

# 解説

技術的には以下の記事で紹介されている仕組みを応用したものです。

[IchigoJam で円周率をファインマン・ポイントまで計算表示したい](https://qiita.com/fujitanozomu/items/079135533d3aaaf50f25)

こちらの記事では、カタカナも使用して 1 文字で 7 ビットの情報を表現しているのですが、ベーマガのような紙媒体に載っているリストを写経してもらうことを想定すると、なかなか厳しいものがあると思うので、使用する文字を数字、アルファベット大文字小文字、記号 2 種類に限定し、1 文字で 6 ビットの情報を表現するように改変しています。

また、VIDEO 1 モードでリストを出力させた際に行の折り返しが起きないように、適宜改行を入れています。これはまぁ、自分のちょっとしたこだわりというか、かつてのベーマガのお作法というか、そんなところです。
メモリが少ない IchigoJam においては、(理論上の)行数が多くなると、その分メモリ的に不利なので、あまり褒められたものではありませんが…

追加要素として、簡単な誤り検出機能を入れています。誤りを検出した場合は、その行のリストを表示してプログラムが停止します。PCG データはともかくとして、もしこれがマシン語のデータであるならば、入力が間違っていた場合は暴走する恐れがあるので、写経してもらう想定ならば重要な機能だと考えます。

# データ変換ツール

ということで、Web ブラウザで動作するデータ変換ツールを作りました。

[IchigoJam Data Converter](https://gistpreview.github.io/?df74260b790e44f01c3252213d5ba437/IchigoJamDataConverter.html)

「ファイルを選択」で画像ファイルを選択すると、画像の左上から 8&times;8 ピクセル単位で右方向に白黒二値化した PCG パターンとして抽出・変換し、上記の実現例のような形式のソースコードを出力します。
おまけ機能として、画像以外のファイルを選択した場合は、バイナリデータとしてファイルの内容をそのまま読み込んで変換します。
いずれの場合も、データが 460 バイトを超えた場合は無条件に切り捨ててしまうのでご注意ください。
ランキング学習3　pyltrを使ったランキング学習

[Aidemy](https://aidemy.net/)　2020/12/3

#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、ランキング学習の3つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・pyltrについて
・LambdaMARTについて

#pyltr
##pyltrとは
・__pyltr__はChapter2で出てきたランキング学習のデータセットLETOR専用の分析パッケージである。
・pyltrは__呼び出すだけ__でChapter2で行なったようなデータの前処理が行える。また、評価指標や学習モデルも使える。

##データの格納
・LETORデータセットは列ごとに__「正解ラベル（0,1,2）」「クエリID」「46次元の特徴ベクトル」__が格納されているが、pyltrを使うことで、データを分割するときにこれらの列番号を参照する必要がなくなる。
・分割の方法は__「pyltr.data.letor.read_dataset(ファイル名)」__で行える。具体的なコードは以下の通り。

![スクリーンショット 2020-11-25 1.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/e482d4bb-7670-525a-b2bc-c89f0be69d51.png)

##LambdaMART
・pyltrには、__LambdaMART__という__モデル__が用意されている。このモデルは__「LambdaRank」「MART」__という2つのモデルからなり、高い精度を誇るものである。このうちLambdaRankは__RankNet__という概念の拡張である。
・ここでは理論的な部分を説明する。RankNetでは、文書$d_i,d_j$とそのスコア$s_i,s_j$について、確率$P_{ij}$を$$P_{ij}=P[d_i \succ d_j]=\frac{1}{1+e^{-\sigma(s_i-s_j)}}$$を満たすように定める。これを使って、コスト関数$C$を$$C = - \bar{P_{ij}} \log P_{ij} - (1 - \bar{P_{ij}}) \log (1 - P_{ij})$$として定め、これを$s$について最小となるようにするのが目的である。LambdaRankはこのコスト関数の式が$$C_{ij}=\log(1 + \exp( - (s_i - s_j) ) ) |\Delta Z|$$であるという点のみ異なる。
・__MART__は__勾配ブースティング決定木__と呼ばれるものである。通常の決定木と違う点は、複数の学習機を組み合わせた__アンサンブル学習__であり、かつ以前に学習機が間違えたデータに対して大きな重み付けを行う__ブースティング__がある点である。式としては、目的関数$O(\theta)$について、誤差に関する項$L(\theta)$とモデルの複雑さに関する項$\Omega(\theta)$の和で表される。これにより、__正確でないモデル__と__複雑すぎて汎化されないモデル__にペナルティを与えることができる。
・具体的な使い方については、次項で確認する。

##ハイパーパラメータのチューニング・ランキングの生成
・pyltrでは、__validationデータ__を使ってLambdaMARTのハイパーパラメータをチューニングできる。
・まずはvalidationに必要なデータや評価指標を設定する。方法は、__「pyltr.models.monitors.ValidationMonitor()」__で行う。引数にはXとyのvalidation__(vali_X,vali_y)__を指定し、評価指標については__「metrics」__で指定する。今回は__「pyltr.metrics.NDCG(k=10)」__を使う。また__「stop_after」__で、何回連続で最良解が得られれば処理を打ち切るかを指定する。

・ここまで終わったら、__「pyltr.models.LambdaMART()」__でモデルを作成し、__「model.fit()」__で学習させることができる。

![スクリーンショット 2020-11-25 13.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/b06649c1-046a-f637-4607-c3917a415d2b.png)

##評価指標の選択
・前項では__NDCG__を使用したが、それ以外の評価指標も使える。
例としては、DCG__（pyltr.metrics.DCG）__、ExpertedRR__(pyltr.metrics.ERR)__、AP__（pyltr.metrics.AP）__、AUC-ROC__（pyltr.metrics.AUCROC）__がある。まとめると次のようになる。

![スクリーンショット 2020-11-25 13.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/b1209f74-4df5-eba1-4787-37e8ca045bd2.png)

#まとめ
・__pyltr__はデータセットLETOR専用の分析パッケージである。これを使うことで、簡単にLETORの前処理やモデルを呼びだすことができる。
・pyltrには、__LambdaMART__というモデルが用意されている。__「pyltr.models.monitors.ValidationMonitor()」__で、このモデルのハイパーパラメータを設定し、__「pyltr.models.LambdaMART()」__でモデルを呼び出すことができる。

今回は以上です。最後まで読んでいただき、ありがとうございました。
グループレポートをkintoneで一瞬で見やすくまとめる技、ワンクリックコピー付き

## kintoneを使えば、いつでもどこでも報告書を作成できるのだが…
このような複数あるチームやグループごとの報告書をまとめて会議で報告するとき、皆さんはどうしていますか？特にマネージャーやリーダーが苦悩していることと思います。

1. 各グループ、チームからの報告をアプリで管理
![スクリーンショット 2020-12-01 11.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100494/0812bac8-2db9-54c3-88e3-3530021065d7.png)


2. これらの報告を合体して、部や本部として報告したい時、現状はこのようなになると思います。

> 
- 各レコードを開いて、内容をコピーしてメモ帳などにペーストしてまとめる
- CSV出力してそれをコピーして報告する
- REST APIやツールを使ってデータ出力して、まとめる

どれもこれも、手間がかかり面倒。

これから紹介するkintoneカスタマイズは、複数あるレポートをサクッとまとめて、クリップボードにコピーするものです。しかも、マークダウン記法で仕上げていると、きれいで見やすいレポートの完成です。（個人的感想）
コピー先のアプリにもマークダウン機能を取り入れると、全社のあらゆる報告が見やすく整理できますね。

## 完成画面 <レポート Plus>
その名も「**レポート Plus**」と名付けてみました。
[ソースコード](https://github.com/maptomo/report-plus)を公開していますので、是非お試しください。

#### レコード一覧
- レコード一覧にある「ボタン」をクリックするだけで、表示されているレコードをまとめる
- クリップボードにコピーしてくれる

![スクリーンショット 2020-12-01 11.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100494/8b640ffd-d32f-5a38-d95a-f3c6159a7eeb.png)

#### レコード詳細
こちらもマークダウン機能を搭載してみました。
![スクリーンショット 2020-12-01 11.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100494/afc313ed-2657-e340-8d89-c309a19e4980.png)

#### レコード追加、編集
入力中にどのように表示されるかプレビュー機能を搭載してみました。

## 事前準備
- kintone環境
- kintone報告書アプリ作成

## kintoneで報告書アプリを作成する
アプリの構成はこちらです。

| フィールド名|フィールド種類|フィールドコード|
|:---------|--------|:------------------|
| グループ名|文字列（一行）|Group|
| 日付|日付|Date|
| 報告|文字列（複数行）|Report|
| スペース|Space|Space|

* スペースフィールドは、レコード編集時の報告がマークダウンでどう表現されるかプレビューするためのボタン置き場です。

## 仮データを登録する
アプリを作成したら、CSVからの読み込み機能を使って、データを読み込んでみましょう。
サンプルデータを[こちら](https://github.com/maptomo/report-plus/blob/main/sample_group_reports.csv)に用意してみました。
※もちろん、レコード登録機能から作ってもOKです。

## JavaScript読み込みでURL設定、ファイル読み込みしてみよう
[ソースコード](https://github.com/maptomo/report-plus)をPCにダウンロードして設定。

- PC用のJavaScriptファイル
    - https://cdnjs.cloudflare.com/ajax/libs/marked/1.2.5/marked.min.js
    - kintone-ui-component.min.js
    - report_plus.js
- PC用のCSSファイル
    - kintone-ui-component.min.css
    - markdown.css

---

※ markdown.cssはカラー、マージンなどをオリジナルで変えることもできます

#### 設定後のイメージ
![スクリーンショット 2020-12-01 11.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100494/878ac5f8-da85-473e-4d8e-eec449e31b1a.png)

##参考
- [Marked.js](https://marked.js.org/)
- [kintone UI Component](https://github.com/kintone/kintone-ui-component)
    - （要望）Dialog Component の CloseButtonのイベント関数が欲しい
    - （要望）NotifyPopup Component に秒単位で自動非表示になる機能がほしい
- ほか、CSSについてはいろいろ参照
【RSpec】letの利点が分からないので、letとbefore両方試してみた

## はじめに
RSpec学習中に「letとbeforeなら、letを使ったほうが無難」ということを耳にしました。しっかり理解した上で、letを使いたいと思いletとbeforeの違いを調べたところ、淡白な解説を読むよりも、具体例を示したほうが一目瞭然であることに気づき、備忘録としてまとめることにしました。

そこで、本記事では`userモデルの単体テスト`を例に、beforeとletを使用した時の挙動の違いを示します。

## 使用技術
- gem
 - devise
 - factory_bot
 - rspec

## 準備
- deviseで、ユーザモデルを作成
  (https://qiita.com/Hal_mai/items/350c400e8763ce0487a3)
- factory_botで、テストデータを用意
- passwordは、存在チェックのvalidationがかけられているため、敢えて空白を代入し、保存時にエラーが出る前提のuserデータを用意しました。

#### テストデータ(user)
```rb
FactoryBot.define do
  factory :user do
    name { "User1" }
    email { "email@sample.com" }
    #validationでエラーが出る様にあえて空白を代入
    password { "" }
  end
end
```

### beforeを用いた場合のrspec

```rb

require 'rails_helper'

RSpec.describe User, type: :model do

  #------------beforeを用いた場合-----------
  before do
    @user = build(:user)
  end
  #---------------------------------------

  #正常系
  it "is valid with adequet name, email and password" do
    user = @user
    expect(user).to be_valid
  end

  #異常系
  it 'is invalid without a name' do
    user = @user
    user.name = ""
    user.valid?
    expect(user.errors.messages[:name]).to include("を入力してください")
  end

end
```

### letを用いた場合のrspec
```rb

require 'rails_helper'

RSpec.describe User, type: :model do

  #------------letを用いた場合-----------
  let(:user) { build(:user)  }
  #---------------------------------------

  #正常系
  it "is valid with adequet name, email and password" do
    user = @user
    expect(user).to be_valid
  end

  #異常系
  it 'is invalid without a name' do
    user = @user
    user.name = ""
    user.valid?
    expect(user.errors.messages[:name]).to include("を入力してください")
  end

end
```

## テスト結果

###beforeを用いた場合
```terminal
F.

Failures:

  1) User is valid with adequet name, email and password
     Failure/Error: expect(user).to be_valid
       expected #<User id: nil, email: "email1@sample.com", name: "User1", created_at: nil, updated_at: nil> to be valid, but got errors: パスワードを入力してください
     # ./spec/models/user_spec.rb:13:in `block (2 levels) in <top (required)>'

Finished in 0.99262 seconds (files took 11.68 seconds to load)
2 examples, 1 failure
```

### letを用いた場合
```terminal
FF

Failures:

  1) User is valid with adequet name, email and password
     Failure/Error: expect(user).to be_valid

     NoMethodError:
       undefined method `valid?' for nil:NilClass
     # ./spec/models/user_spec.rb:11:in `block (2 levels) in <top (required)>'

  2) User is invalid without a name
     Failure/Error: user.name = ""

     NoMethodError:
       undefined method `name=' for nil:NilClass
     # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>'

Finished in 0.16009 seconds (files took 12.2 seconds to load)
2 examples, 2 failures
```


beforeを用いた場合は、2件中1件のテストケースが成功してしまっています。また、エラーの原因がコンソールから分かりません。
一方、letを用いた場合は、2件ともテストケースが失敗しており、かつ`NoMethodError`で`name`に異常があることが一目瞭然です。

#### 参考文献
- RSpecのletを使うのはどんなときか？（翻訳）<br>https://qiita.com/jnchito/items/cdd9eef2ed193267c651
【知らないと恥】ドメインとサーバーとは...

単純にコードが書けるだけでなく、ITの基本知識を身につけたくてまとめていきます。今回は「__ドメイン__」と「__サーバー__」について。

##ドメインとサーバーの基本


* ドメイン インターネットの社会での住所
* サーバー サイトやメールを格納する置き場所
* IPアドレス インターネット上の住所みたいなもの

パソコンやスマホで__アドレス__（例えばgoogle.com）を入力すると__IPアドレス__（4つのブロックに分けられた数字）を基に、見たいホームページが収容されたWeb__サーバー__にアクセスできる。

__サーバー__には、IPアドレスと言う数字の住所が割り振られていますが、数字なため人間が覚えにくいというデメリットがあります。それゆえ、数字と紐づける形でドメインを使った方がわかりやすいですね。

##DNSとは？

IPアドレスとドメイン名を紐づけるシステムのことを__DNS__（ドメイン・ネーム・システム）と言います。

ドメインをお名前ドットコムなどの会社から取得して使いますが、ゲットしただけでは使えません。Webサービスとしてドメインを使用するには、アクセスされた時にドメインをIPアドレスに変換が必須です。その変換機能の役割を果たすのが__DNS__です。

##まとめ

整理してみると以下のような感じになります。例えで説明すると...

* ドメイン -> 住所
* サーバー -> 土地

土地には、家を建てたり公園を作ったりと色々なことができますね。同じようにサーバーは「ホームページ」や「Webサービス・アプリ」を構築できます。

###参考になったサイト

https://www.itra.co.jp/webmedia/domain_dns_difference.html
https://hajimeru01.com/posts/4842/
tiffファイルの処理に関連するnotebookメモ

・参考にしたkaggleのnotebook
https://www.kaggle.com/iafoss/panda-16x128x128-tiles
https://www.kaggle.com/haqishen/panda-inference-w-36-tiles-256
https://www.kaggle.com/thehemen/pytorch-transfer-learning-with-k-folds-by-drug-ids

・%は割ったあまり

・pad関数は、それぞれの次元の方向にふくらませるイメージ。正方形が拡大する、立方体が拡大するなど。
第2引数の配列のそれぞれの要素は、各次元をどれくらいの幅前後に膨らませるかを示している

```python:pad関数
np.pad(np.random.randn(2,2),[(1,1),(1,1)],constant_values=3)
```

・efficient net
https://qiita.com/Radley/items/e6cd148079468dbdb616

・画像、アノテーション、領域明示系のコンペでどうtransfer learningしてるかがわかるようなnotebookを探す
C# 基本文法まとめ

**本記事は、Unityを扱うにあたって、知っておくべき
基本的な文法についてまとめたものです**

##**bool型**
 
```csharp
//bool型変数には、「true」か「false」しか入れない。
//Javaでのboolean型と同じ
bool example = true;
```
 
 

##**int型　float型**
 
```cs
//int型変数には、大体-21憶から21億までの整数が格納される。
//この範囲を超える整数は、long型で扱うことができる。
int example = 64;
 
 
//小数を格納することができる。
//数値の末尾に「f」をつけることで、float型であることを表す
//誤差が許容される有効桁数は、６～９桁
float example = 3.2f;
```
 
##**string型**     

~~//JavaではStringだが、C#ではstringなので注意~~

**→C#では、Stringでもstringでも文字列を扱うことができる**

```csharp
//string型では、文字列を格納できる。    
string example = "文字列";
```

 
 
##**配列型**

 ```cs
    //配列の宣言
    int arrays [] = new int [] {1,2,3}; 
 
    //配列の長さ(大きさ)をコンソールに表示する。ここでは、「３」と表示される。
    Debug.Log(arrays.length); 
 
    //配列の番号を指定してコンソールに表示する。ここでは、「１」と表示される。
    Debug.Log(arrays[0]); 
 
 
    //配列の番号を指定して、内容を書き換える。
    arrays[0] = 900;
 
    //書き換えた内容の表示。ここでは、「900」と表示される。
    Debug.Log(arrays[0]);
```
 
##**List型**
 
```cs
    //配列型は、最初に宣言した個数までの要素番号しか使えないが、
    //List型では、後から追加していくことができる。
    List <int> lists = new List <int> {1,2,3};
 
    //listsの中の個数をカウントする。ここでは、「3」と表示される。
    Debug.Log(lists.Count);
 
    //List型listsに「800」のデータを追加する。
    lists.add(800);
 
    //さっき追加したデータが、末尾に入っていることを確認する。
    //ここでは、「800」と表示される。
    Debug.Log(lists[3]);

```
 
##**Dictionary型**

```cs
    //List型と異なるのは、値を取り出す際に指定した文字列を使うことができる点。
        Dictionary <String,int> values = new Dictionary <String,int>{
            {"ひっかく",30},
            {"たいあたり",40},
            {"つつく",35},
        };
 
     //「ひっかく」の威力が100に変更される（チートです！）
     values["ひっかく"] = 100;
 
      //威力30の「ひのこ」が追加される。
      values.add("ひのこ",30);
 
```
 
 
 
 
##**列挙型**

```cs
    //enum型は、値の種類を先に宣言しておくことができる
    //ここでは、Easy,Normal,Difficultの3つしか入れることができなくなっている。
    enum GAMEMODE{
        Easy,
        Normal,
        Difficult
    }
 
    GAMEMODE gamemode = GAMEMODE.Easy;
 ```
 
##**定数**

```cs
    //constを付けると、その値は変更できなくなる。
    //Javaでのfinalと同じ
    const int example = 10;
 ```
 
##**ベクトル型**

```cs
        //varは型推論といって、勝手に型を補ってくれる。
        var position = new Vector3(0, 1, 2);
 
        //座標を(0,1,2)に移動させる。
        transform.position = position;
 
        //ベクトル同士の演算も可能。結果は、(2, 4, 6)
        Debug.Log(new Vector3(0, 1, 2) + new Vector3(2, 3, 4));
 ```
ホームページ運営のすすめ

こんにちは。本記事は、[個人開発 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/private-development) の3日目の記事です。

前日は @ryy さんによる「[ペット専用SNSアプリを支える技術と工夫など](https://qiita.com/ryy/items/b459da7ecc5291603934)」でした。ペット好き向けの SNS 、面白そう。ペットの画像に吹き出しを付けられるといった工夫あり、愛を感じました。

個人開発を通じて得た気付きは 「[3年間の個人開発を通じて得た気付き](https://qiita.com/drytt/items/b78db945eceb03cae2cf)」にまとめましたので、よろしければどうぞ。

今回は、（今更感はありますが）ホームページ運営のメリットについて整理してみます。

# 現状の課題（仮説）

多くの個人開発者は、できるだけ多くの人に見てもらえるよう、常にアウトプット先に悩みつつ活動している。知見（記事執筆など）のアウトプット先、アプリ等の成果物のアウトプット先、愚痴や悩みごとの吐き場所など。例えば、知見（記事執筆など）のアウトプット先を例に考えても、Qiita で記事執筆したり、note で記事執筆したり、最近人気になっている Zenn で記事執筆したりするのではないか。

結果、活動を進めていくうちにアウトプットが散在していくのではないか。
アウトプットの散在により、個人開発者自身は自身の活動紹介がしづらく、個人開発者を追う情報収集者（ファン）は活動を追いづらくなっているのではないか。

つまり、アウトプット情報を集約した場所（活動ログ）が求められているのではないか。
（...無理矢理感）

# 解決策

1. アウトプット情報を集約できる既存サービスを使用する
2. アウトプット情報を集約できるサービスを開発し、使用する
3. アウトプット情報を集約できるサービスを自分で用意する

1 は、既存サービスの制約が発生する。例えば、文字数や画像サイズといった見せ方など。
2 は、個人開発者なら好んで選びそうな気もするが、開発ネタではないので一旦除外する。
3 は、自由度が高く良いのではないか。-> ホームページという選択肢。

以降で、メリデメを考えてみる。

# ホームページ運営のメリット・デメリット

## デメリット

デメリットから。

- 構築コスト
- メンテナンスコスト
- 下手にホームページつくったりすると内容次第で逆効果

## メリット

ここを言いたかったので挙げてみる。

### 1.構築自体が良い学習になる

どんな構成で構築するのかをまず考えなければならないので、自然と調べるし、実践するので良い学習になる。
アプリだけでなくインフラ知識も必要となるので、これまた良い学習になる。

例えば、VPS + Nginx + Pug (HTML Template) みたいな感じでしょうか。

### 2. メンテナンス自体が良い学習になる

メンテナンスは手間なので、如何に効率的にメンテナンスできるか考えるようになる。
結果、Git / GitHub や シェルスクリプトといったことの学習契機となる。あと cron とか。

### 3. デザインを学習する契機になる

イケてないホームページは見るたびに残念な気持ちになります。
もし自分のホームページがそうだった場合、改善しようかなという気持ちが湧いてくるかと思います。
結果、デザインを学習する契機になる。Bootstrap でも良いし、生 CSS でもいいし、HTML のマークアップ見直しでもいいし、とにかく考えるようになる。

### 4. アプリ開発の練習台になる

問合せページや掲示板といった定番のものを設置することもできるし、SPA を適用してもいい。やりたいとおもったことを試せる場所になる。

### 5. アクセス数がレスポンスとなって帰ってくる

Google Analytics などのアクセス解析ツールを使ってアクセス数を解析すれば、どれくらい興味・感心を引いているのか、肌で感じられるようになります。また、サービスを利用するだけでは得られない情報、例えば、どれだけ滞在したとか、どんなキーワードでアクセスしてきたかといった情報も Google Search Console を使えば取得できます。欲しいと思う情報が取れる。

### 6. 自身の振り返りとして活用できる

今年どんなことやってきたっけ、そんな風に思った時にホームページを見ればすぐに内容を把握できる。便利じゃないですか？
また、もしホームページのコンテンツやデザインをアップデートしていたら、ホームページ自体が作品というか成長させていける素材なので、ああこんなに更新して成長したな、とか感じられるようになったり。

### 7. 活動を紹介しやすい

課題で書いたことを解消できますね。ホームページ見てみてよ、で済みますから。

### 8. 企業のホームページや他の人のホームページを見る視点が学習に変わる

こんな風に見えるの面白いな、とかこのデザインいいな、とか、見やすいな、とか。
自分のホームページに取り入れてみようか、といった視点が自然と芽生えるのでネットサーフィンが学習視点に切り替わります。

### 9. 阿部寛のホームページって面白い

阿部寛のホームページって面白いですよね。

### 10. こんな記事を書いたりすることもできるようになる（書くネタになる）

10 個ぐらいあげたかったのですが苦しかった。

# おわりに

ホームページ運営って意外と良いことあります、と伝えたかったです。

（正直「[3年間の個人開発を通じて得た気付き](https://qiita.com/drytt/items/b78db945eceb03cae2cf)」の方に時間をかけすぎました...）



ここまでお読みいただき、ありがとうございました。

明日は @alclimb さんの「【個人開発向け】失敗の経験と成功した人から学んだこと10選」です。
人に優しいコードレビュー文化草案

私はキャリアの中でシステム会社やゲーム会社、AIの会社などを経験してきましたが、開発を行うほとんどのチームではコードレビューを行っていました。振り返ってみると私自身は致命的な指摘を受けたことはなくてレビューが怖いという印象を持っていません。ゲーム会社時代のCTOのコードの書き方にかなり影響を受けているので、比較的まともなコードが書けているのか、もしくは私が怖いから言いにくいのかもしれません…。

ただ、人のレビューを見ていると、かなりきつい言葉でコメントを書いていて人格攻撃に見えてしまうものや、逆にレビューを受ける側の人がスキルの高い人だと不安なコードでもノーレビューでApproveされてしまうものなど、コミュニケーションが邪魔になって正しいレビューになっていない場面を見かけます。これではレビューが怖いという人の意見もうなずけます。いずれにしろ、人が人に対して行うものなので指摘する場合も表現に思いやりが必要です。でなければレビューに出すことが精神的な負担になってしまい、隠れてコミットするという状況を招きかねません。正論だけが正解ではないのです。

そこで、私が３年前、今の会社に入社したときに書いたコードレビューの草案をここに載せておきます。↓

## コードレビューの目的

まずコードレビューの目的を全員が理解する。これはプロダクトだけではなく個人にとっても有益。

- プロダクトの品質担保
- 自分の担当以外のコードの理解
- チーム全体のスキルアップ
    - レビューを繰り返すことで注意すべき点などが共通認識としてチーム内に蓄積されていく
- 個人のスキルアップ
    - レビューする側・される側ともに別の人の書き方や考え方を知ることは重要

## レビューする人とされる人との関係

- レビュワーは偉くない
    - コードを書いた人（=実際に行動をした人）に敬意を払う
- コードを書いた人は、レビュワーが自分よりもそのコードを理解していないと意識しておく
    - コードを書いた人は見てほしいポイントなどを簡潔に説明できるようにしておく

## 円滑にレビューをするために

- レビューを出す際の精神的ハードルがなるべく低くなるような空気をみんなで作る
    - 人格攻撃と受け取られるような表現は避ける
    - 杓子定規になりすぎない
- ツールで余計な手間のかかるレビューが減らせるなら依頼の前に導入
    - コードの自動整形
    - typoチェック
- 自分よりスキルが上だと思う人が書いたコードでも指摘箇所があれば躊躇しない
    - 指摘した結果、それが間違っていても良い
        - 指摘された人はそれを攻撃しない、議論する
- 指摘箇所=修正箇所ではない
    - 指摘が間違っている場合もある
    - 議論が重要
    - レビューがプロダクト進行のボトルネックにならないように重要でない指摘は ”場合によっては” 対応しない

## やらないこと

- コードフォーマットの個人的な好き嫌い
    - チームがとりきめたコードスタイルから外れている場合は除く
    - パフォーマンスなどの観点を含んでいる場合は除く
    - 参考程度にアドバイスするのは良い
    - やるなら自動フォーマットのライブラリとか入れてCIで弾く

# さいごに

ぜひこの草案をレビューして、こうしたほうが良いというのがあったらコメントください！
ゲームオブジェクトに物理法則を適用する(Riditbody)

#オブジェクトに物理法則を付与するの巻

##Riditbodyの作成

**物理演算を付与したいゲームオブジェクトを選択し、
Component->Rigitbody->Physics->Riditbodyを選択する**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/548e6774-cdc2-425a-d0cc-ee981220e83d.png)

##Riditbodyの詳細解説

**Riditbodyの要素を、以下にまとめておく。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/d66b9369-3ae5-066d-e29e-7be3f4cbe0f6.png)


|名前 |詳細|
|-----|-----------------|
|Mass |オブジェクトの重さ(重さはkg)|
|Drag |空気抵抗の大きさ。<br>大きくするとオブジェクトが動きにくくなる|
|Angular Drag|回転に対する空気抵抗|
|Use Gravity|重力を適用するかどうか選択する|
|Is Kinematic|建物や壁に使用する。<br>スクリプトで動かさない限り動かないようになる。|
|Interpolate|これをONにするとスムーズな映像になるが、<br>あまり使いすぎると重くなりすぎるので注意|
|Collision Detection|オブジェクトを高速移動させたとき、壁などを貫通することがあるが、これをONにすると防ぐことができる。|
|Constraints|各座標軸に対して、Freeze Positionで移動、Freeze Rotationで<br>回転しないようにすることができる
【Jellyfin】自分だけのメディアサーバー

Qiitaに一つとしてJellyfinの記事がなかったので、書こうと思いました。

# Jellyfinとは？
Qiitaに出てこないほど日本では知名度が低いのかもしれませんが、Jellyfinとはメディアサーバー用のサーバーアプリケーションです。
### メディアサーバーとはなんぞや？
簡単に言ってしまえば自分だけのNetflixって感じです。
動画や映画、音楽など自分のサーバーにおいて他のデバイスからアクセスができるということです。
用途としてはキャンピングカーに一台メディアサーバー用のラズパイとか持っていって、電波の届かないところでも映画や音楽が楽しめますよって感じです。
他にも色々と用途はあるかと思いますが。

### Jellyfinを使う理由
このJellyfinの魅力はオープンソースで完全無料ってところです。他にも同じようなサービスでPlexというのがありますが、そちらはサブスク型だったり。
正直言ってしまうと、netflixでいいじゃん！ってなったり、Google Driveに保存すれば済む話だよね？？
とかなってしまうのですが、ロマンというかなんというか。。。欲しいですよね？自分だけのメディアサーバー


![Screenshot from 2020-12-03 00-20-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/bc526218-3d3e-f014-43b6-a41493f16b41.png)
こちらは、jellyfinのデモ用のページです。正直言ってこれに自分の動画が入るのはあり。かっこいい。

## インストール方法
[Jellyfin - Downloads](https://jellyfin.org/downloads/)
ディストロごとに書くのは面倒なので、こちらへアクセスしてもらえばいいのですが、一応Ubuntu/debian用の物はおいておきます。

```
sudo apt install apt-transport-https
wget -O - https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo apt-key add -
echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release ) $( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list![Screenshot from 2020-12-03 00-40-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/f326890b-4279-f0a3-00d1-a14eeee34094.png)

sudo apt update
sudo apt install jellyfin
```
Linuxだけではなく、WindowsやmacOSにも対応しているようです。


## 設定方法
[Jellyfin - Documentation](https://jellyfin.org/docs/)

Jellyfinをインストールしたあと、`sudo service jellyfin start`などのコマンドを使ってデーモンを走らせてください。
デフォルトポート8096番でjellyfinがホストされます。

http://localhost:8096 にアクセスして、このような画面がでたら成功です。

![Screenshot from 2020-12-03 00-40-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/865ab915-e191-3803-624d-4dd37e8d3142.png)

この画面のあとにユーザー登録など数段階の設定ページがありますが、だいたいデフォルトの設定で大丈夫だと思います。

あとは、自分の動画、音楽などのデータを追加していけば、自分のメディアサーバーとして利用できます。

![Screenshot from 2020-12-03 00-43-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/8127d27d-d31f-231a-1f79-128dac0f8c66.png)
自分は音楽を追加してこのようにできました！

## 余談
スマホアプリもあるので、ローカル内でポートを開放して、スマホからアクセスするなんてこともできちゃいます。
友達が家に遊びに来たときとかも複数端末で同じリソースにアクセスできるのは意外とかゆいところに手が届く機能かもしれないですし、やっておいて損はないかも?

ちょっと本気になれば、スマホで撮った画像や動画などもここでホストしながらバックアップも一緒にとれるとか、ドメインと固定IPがあれば、リモートからアクセスなんてこともできるので、可能性が広がって楽しいですね。
30分ほどで設定ができたので、かなりお手軽にできるかと思います。

ユーザーを作成したり、そのユーザーのアクセスできるコンテンツを制限したり、APIキーを発行したりできたりして、本当に可能性しか広がりません。

特に写真家、動画クリエイターなどの芸術家の方々はこれを使って自分のポートフォリオを作成するなんてこともできるのではないでしょうか？
get,findなどの返り値表


# find()

`App\Model::find(1)` の返り値は**Modelのオブジェクト**
  
# get()

`App\Model::where('id',1)->get()` の返り値は**Collectionクラス**
（中身はModelのオブジェクト。ゆえに`foreach()`で回せば各々の値を取得できる。）
  
# first()

`App\Model::where('id',1)->first()` の返り値は**Modelのオブジェクト**
  
※もしなかった場合は`NULL`を返す

以下[tinker](https://github.com/laravel/tinker)(laravel用REPL)で実行した際の様子


```
$ php artisan tinker
New version is available (current: v0.8.14, latest: v0.8.15)
>>> App\Model::find(1)
=> App\Model{#458
     id: 1,
     name: "モデル1",
     created_at: "2017-11-30 07:32:29",
     updated_at: "2017-11-30 07:32:29",
   }

>>> App\Model::where('id',1)->get()
=> Illuminate\Database\Eloquent\Collection {#449
     all: [
       App\Model{#448
         id: 1,
         name: "モデル1",
         created_at: "2017-11-30 07:32:29",
         updated_at: "2017-11-30 07:32:29",
       },
     ],
   }

>>> App\Model::where('id',1)->first()
=> App\Model{#470
     id: 1,
     name: "モデル1",
     created_at: "2017-11-30 07:32:29",
     updated_at: "2017-11-30 07:32:29",
   }

>>>

```

# ちなみに：where()

ちなみに

`App\Model::where('id',1) `の返り値は**Builderクラス**

```
>>> App\Model::where('id',1)
=> Illuminate\Database\Eloquent\Builder {#462}
>>>

```

# そんで：all()

そんで`App\Model::all()` の返り値は**Collectionクラス**

```
>>> App\Model::all()
=> Illuminate\Database\Eloquent\Collection
```
  
  
# もっとくわしく
- [Namespaces | Laravel API](https://laravel.com/api/5.4/index.html)

# おわり

以下もどうぞ

- [【Laravel】Laravelでよく使うroute()とview()とredirect()まとめ](https://qiita.com/sola-msr/items/4f92686d474118d1cceb)
- [【Laravel】わりとよく使うArtisanコマンド集](https://qiita.com/sola-msr/items/a09b857c5e7f7c88d01d)
- [【Laravel】Viewのbladeの書き方](https://qiita.com/sola-msr/items/a128f4e0900f3541690c)
2日目：地面と門の作成で学ぶunityのオブジェクトとマテリアル

この記事はアドベントカレンダー「[【VCI】テーマパークを作ろう](https://adventar.org/calendars/5855) 」の2日目の記事です。
(※1日目とは異なるPCで作成しているため、前回の異なる点があるかもしてません)

#はじめに
前回はRoom背景の変更まで行いましたが、Room内に不要なアイテムがいくつか残っている状態可と思います。
Vキャス内のRoomに行き、Menuからルーム情報>ルーム内アイテムから不要なアイテムを選んで削除しましょう

#今回の内容
今回はテーマパークの地面と門を作成しながら以下のことを学びます

* Unityでのオブジェクト作成 
* 画像テクスチャの作成
* 繰り返し画像の設定方法

# Unityのオブジェクトで地面と門を作成
まずは地面を作成します。
Unityでオブジェクトを扱うときは他のソフトで作ったものを持ってきたり、UnityStoreで購入したものを使う事が多いのですが、単純な図形であればUnity内でも作成できるため、今回はそちらを使用します。

Unityでオブジェクトのhierarchyのエリアを右クリックするとMenuが表示されるので3DObject>Planeを選択すると、平面のオブジェクトが追加されます。
<img width="60%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/2697a7fd-dd0f-7da6-7dfc-9627ce322f8d.png">
デフォルトでは広さは10m✕10mですが今回はもっと大きいほうが良いため、この後右側のInspecterタブのtransformのscaleをすべて10にして10倍の100m✕100mにしました


このようにunity内でオブジェクトを作成したい場合は3DObjectから追加します。他にも立方体や球、カプセル型、円柱などがあります。
位置・大きさ・角度はtransformの値をいじることで変更可能です。

ためしに立方体と円柱を使って作った門が以下です。
<img width="60%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/f94028fe-3adf-7685-3698-b1c81b19d7e5.png">
(上の部分は45度傾けた立方体を9個並べています)

複数のオブジェクトでものを作成する場合は以下のように1つ空オブジェクトを作り、その中にオブジェクトを置くようにすると、後でまとめてサイズなどが変更できて便利です。(Gateが空オブジェクトです)
![gate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/49f3d91a-2684-66af-c5ab-a27290d42fab.png)

# 作成したオブジェクトに画像や色を設定(マテリアルの設定)
次に作成したオブジェクトに色や画像を設定していきます。
（作成順序が前後したため先に床に画像が適用されてますが無視して下さい）

まずは門に色を付けていきます。
Projectタブを右クリック>create>materialでマテリアルを作成します。
(このマテリアルが色や画像を設定する物となっており、マテリアルをHierarchyのオブジェクトに紐付けることでマテリアルが反映されます。)
作成したマテリアルを選択すると右側のInspecterで色を設定することができます。
今回は柱を白、看板部分を赤、青、緑の3色にしようと思うので、以下のように計4つのマテリアルを作成します。
(マテリアルはCtrl＋Dでコピー可能で、F2で名前変更ができます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/85779afd-d3e0-4bc2-d65a-58f5890beb28.png)

作成したマテリアルを適用したいオブジェクトにD&Dすると反映することができます。
すべて反映させると次のようになります
<img width="60%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/137b019b-86a5-6762-0262-c72776e136f3.png">

次に床に画像を設定します。
こちらの手順は簡単で、Projectのタブから画像をD&Dするだけでマテリアルが自動作成され、適用されます
<img width="60%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/8c7454c4-5542-e063-0791-a589533d5ede.png">

ただし、このままでは石畳が大きすぎるため、自動作成されたマテリアル(D&Dした画像と同階層のMaterialsの中にあります)を選択し、IncpecterのTilingの値(繰り返し回数)を変更します。

これでマテリアルの設定は完了です。

# VCIエクスポート
作成が完了したのでVCIエクスポートをエクスポートしようと思いますが、このままエクスポートしようとすると以下のようなエラーメッセージが表示されるかと思います
![20201202-221453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/43a2397d-f85b-6a5b-9b5a-ff7de99eb053.png)

これが出る原因ですが、VCIでは使えるコライダーの種類が決まっており、Planeにデフォルトで付いているMeshColliderは使えません。
(コライダーについては後日説明します)
とりあえずPlaneオブジェクトを選択し、IncpecterのMEshColliderの部分の右側の点3つの部分をクリックし、RemoveComponentを選択して削除します。

これでエラーは出なくなるはずです。
後は昨日と同じ手順でアップロード＆Roomでの背景読み込みすれば反映されます！
![2020120223403322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/15c2fb14-fe8f-1dae-4f4e-07a10c4c1bcb.jpeg)


#終わりに 
今回はUnity内でオブジェクトを作りましたが、冒頭でもお伝えしたように凝ったモデルは外部ツールでの制作または購入が主になると思います。
次回はその外部ツールでの作成をしていきたいと思います
【Flutter】FirebaseAuthでユーザ登録した後にuidでFirestoreにコレクションとサブコレクションを作る例


FirebaseのCloud Firestoreにユーザ登録して、usersフィールドにuidでドキュメント作って
その下にサブコレクションを作るコードメモ

```dart:signUpAndGenerateSubCollection.dart
Future signUpAndGenerateSubCollection() async {
    try {
      // メールとパスワードでユーザー登録
      final FirebaseAuth auth = FirebaseAuth.instance;
      final AuthResult result = await auth.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );
      // 登録したユーザー情報
      final FirebaseUser user = result.user;
      final users = Firestore.instance.collection('users');
      collection.document(user.uid).collection('hoge').add({
        'hoge': hoge,
      });
    } catch (e) {
      // 登録に失敗した場合
      throw (e);
    }
  }
```

新規登録の後に新しく作る場合

```dart:adHoge.dart

Future addHoge() async {
    final FirebaseAuth auth = FirebaseAuth.instance;
    final users= Firestore.instance.collection('users');
    final user = await auth.currentUser();
    if (user != null) {
      users.document(user.uid).collection('hoge').add({
        'hoge': hoge,
      });
    }
  }
```

ユーザが個別の記事などを投稿する場合、サブコレクションを実装したほうが後々よさそう。

### 参考：
Cloud Firestoreの勘所 パート2 — データ設計(https://medium.com/google-cloud-jp/firestore2-920ac799345c)
Libero SoCのインストール方法

##はじめに
Libero SoCとはMicorsemi(Microchip社)のFPGA開発環境です。xilinx,Intel,Latticeに比べて格段に知名度は低いです。
私は仕事の都合上10年以上前(当時はActelという社名でした)に使ったのが最初です。
特徴としては以下のとおり

* 論理セルがFlash型
* Flash型なのでコンフィグ用のROMが不要
(SRAM型CPLDのようにデバイス内にRAMが内蔵されているという事もなく、論理セルで情報を保持してるらしいです。)

* ソフトエラー耐力が高い。これは業種によっては全く気にしないです。通信装置はめちゃ気にしました。
* が、内蔵SRAMはSRAMなので当然ソフトエラーには弱いです。
* そしてFlash型なので微細化がSRAM型より難しいらしく動作速度が遅い...
* マイナーであるが故、困ったときに頼れる人がいない...これは当時私も苦労しました。

##インストールファイルのダウンロード
以下のリンク先からインストールファイルをダウンロードします。
ここでの注意点としては、開発するデバイスによって対応しているVersionが異なるという事です。
リンク先に対応表がありますのでよく確認してダウンロードして下さい。
[Microsemi社](https://www.microsemi.com/product-directory/fpga-soc/1637-design-resources)
##インストールの注意点
実行ファイルの指示に従いボタンをポチポチしていれば問題なくインストールできると思います。
しいていうなればこういったツールは任意のディレクトリを指定してインストールすると問題が起きる可能性があります。
特別な理由がなければデフォルトの場所にインストールしましょう。

## ライセンスファイルの設定
ライセンスファイルを設定せずにLibero SoCを起動しようとすると以下のエラーがでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695279/8dd5783d-e56f-dd8a-1859-071f623bc1a5.png)

Microchip社のHPからライセンスファイルを入手&設定して下さい。私は"Silver(Free)"ライセンスを使用しています。
 [Microchip Libero Installation Licensing Setup User Guide](https://coredocs.s3.amazonaws.com/Libero/12_4_0/Tool/Libero_Installation_Licensing_Setup_User_Guide.pdf)

Eメールで送付される"License.dat"をMicrosemi License utilityから取り込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695279/109f5e49-d1bd-c875-47d5-c8e02b687d6a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695279/88b75e25-85a1-e2fe-ff42-c8eca5ea33f8.png)


ここでの注意点ですが、一度ライセンスファイルをインポートするとこのツール上から消せないっぽいですね。。
インポートしたと同時に環境変数へ設定されてるようで、消したければwindowsのコントロールパネルまで行ってで消さないとダメみたいです。
(お試しで適当な場所に保存した"License.dat"をインポートしたら消せなくなりました。。)

ここまで作業すると問題なくLiberoSoCを起動できるはずです。お疲れ様でした！
上手くいかない方はライセンスファイルのDisk IDを間違えていないか？
環境変数が変になっていたりしないか？確認してみて下さい。この手の問題で上手くいかない場合は真面目に調査せずにアンインストールして再チャレンジorツールのVersionを落として再チャレンジしたほうが早かったりします。

##参考
 最近マクニカ様が取り扱いを開始したようです。
 日本語の情報が少ない事もメジャーになれない要因の一つなので今後のマクニカ様には期待です！
 [マクニカ様](https://www.macnica.co.jp/business/semiconductor/articles/microchip/135038/index.html)
***