OmniAICreator/Qiita-1.07M huggingface dataset:
SQLデータ取得基礎編

# 記事の概要
- SQLでDBを操作する際に使用する基本的な文法をまとめてみました。
- 基本的な文法をど忘れしたときの備忘録的な意味で書きました。

## SELECT文
- DBのテーブルから目的のデータを取得する時に使用するSQL
- SELECT文で必ず必要な記述はSELECT + <カラム名> FROM <テーブル名>の２つ
- テーブルから全てのカラムを取得する場合は*を使って → SELECT*FROM <カラム名>;

## WHERE句
- 取得したデータを絞り込んでいく際の条件式を記述するためのSQL
- 比較演算子などを使って条件を記述していく
- SELECT <カラム名> FROM <テーブル名> WHERE <条件式>;

## LIKE演算子
- 特定のパターン文字列を条件にして絞り込みをすることができる
- パターン文字列には、任意の文字を示す%,1文字の任意の文字を指す_を使用することができる。
- SELECT <カラム名> FROM <テーブル名> WHERE <条件式> LIKE <パターン文字列>;

# おまけ
- データを並び替える時に使用するSQLも記載しておきます

## DISTINCT句
- 特定のカラムにおいてデータの重複を削除するために使われる
- SELECT DISTINCT <カラム名> FROM <テーブル名>;

## ORDER BY句
- 抽出したデータを指定のカラムを基準に並び替えることができる
- SELECT <カラム名> FROM <テーブル名> WHERE <条件式> ORDER BY <カラム名> (DESC OR ASC);

## LIMIT 句
- 抽出したレコードの上限の行数を指定することができる
- SELECT <カラム名> FROM <テーブル名> ORDER BY <カラム名> <DESC OR ASC> LIMIT <件数>;

#まとめ
SQLでデータを取得する際の最も基本的な文法をまとめてみました。かなり初歩的な内容ですがお役に立てれば幸いです。また別の記事でデータの追加・削除・更新などの内容もまとめていきたいと思います。
【SQLでバッチ処理】グローバルテンプテーブルの活用

# はじめに
Oracleには処理を高速化するための機能が色々と準備されています。
そのなかで今回は、SQLでバッチ処理を書くときに楽になるような機能を紹介したいと思います。
それは`global temporary table`です。
特に、`global temporary table`の`on commit delete rows`で定義されたテーブルの活用について記述します。
参考: [津島博士のパフォーマンス講座　 第11回 良いSQLについて（2）](https://blogs.oracle.com/otnjp/tsushima-hakushi-11)

# 概要
テーブル定義（入れ物）のみ共有して、レコードは登録した人だけが見ることができ、他の人は見ることができません。
セッションやトランザクションの終了時にテーブルデータが自動削除される機能です。

# 説明
使い方は、普通のテーブルとかわりません。
これから紹介する内容は、イメージはプログラム内の`変数「listやmap」`みたいに一時的にデータを保管する機能と思ってもらえればピンとくるでしょうか。

不要になった時、いちいち削除しないでよく、使い捨てが出来ることが良いです。

しかし、利用方法が具体的に説明されてないことが多いためか、あまり活用されていなくて勿体ないと筆者は思っています。（これまで活用している案件に出会ったことがない。）

そのため、筆者は設計にガンガン活用して本番運用をトータル５年ほどの検証を経て有用だと確信したため、みんなにも楽してほしいという思いで記事にすることにしました。

# 構文
通常のテーブル定義とほとんど一緒です。

```
create global temporary table テーブル名
(カラム定義ホゲホゲ)
[on commit delete rows | on commit preserve rows]

on commit オプションで一時表のポリシーを設定可能です。
delete rows or preserve rows を指定する。
```

**on commit delete rows**
トランザクション終了時にデータを削除する
（セッション終了時もデータを削除してくれます。）


**on commit preserve rows**
セッション終了時にデータを削除する

参考: [テンポラリテーブル(一時表)のまとめ](https://www.sql-dbtips.com/architecture/temporary-table/)

# 例
筆者はこれしか使わない定義オプション`on commit delete rows`（コミット発行で消える。セッション終了でもちゃんと消える。）で定義されている前提でいきます。

TBL‗SALESのある条件に合致する`伝票番号`をキーに処理することが可能なとき色々注文されて、下記のような処理をするとします。
※伝票番号がTBL‗SALES上で`ユニーク`という前提です。。

①トランザクション発行
②対象レコードの排他
③更新前レコードの保管
④レコード更新
⑤コミット発行

```
//①トランザクション発行
//②対象レコードの排他
select 1 from TBL‗SALES where [★煩雑な条件がたくさん] for update nowait
//③更新前レコードの保管
insert into [保管用テーブル名]
select * from TBL‗SALES where [★煩雑な条件がたくさん]
//④レコード更新
update TBL‗SALES set [更新内容] where [★煩雑な条件がたくさん]
//⑤コミット発行
```

特に仕様変更時、[★煩雑な条件がたくさん]の部分で、条件漏れなどの不具合を散見します。
実行中にデータ更新があると、条件合致するレコードが増えたり減ったりするのも地味にいやらしいです。

# そんなとき
ここで`global temporary table`の登場です。
※以降`global temporary table`は、グローバルテンプと記述します。

```
//①トランザクション発行
の後、直ぐにグローバルテンプに対象レコードのキー（伝票番号）をinsertします。
insert into [グローバルテンプテーブル名]
select 伝票番号 from TBL‗SALES where [★煩雑な条件がたくさん]
```

②③④の処理は、
`[★煩雑な条件がたくさん]`の部分を
`[伝票番号 in (select tmp.伝票番号 from [グローバルテンプテーブル名] tmp)]`
に置き換えるだけです。

⑤コミット発行
グローバルテンプの内容は、自動で削除される。（※ロールバックでも削除されます！）

これで修正時は、グローバルテンプに登録するときの条件をなおすだけで済みますね。
さらにキーの伝票番号がユニークなら、実行速度も速い！

以上が活用例ですが、利用イメージがついて応用してもらえれば幸いです。
kotlinとjavaで画面遷移したい！

# はじめに…

この記事は[4個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の5日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその4個前の記事をご覧ください！

- java版 : https://github.com/sato-na/guruwake_java

- kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語で画面遷移をするには…

## 画面遷移の基礎

- javaの場合

```java
Intent intent = new intent(遷移前のアクティビティ.this, 遷移後のアクティビティ.class);
startActivity(intent);
```

例)

```java:MainActivity.java
Intent intent = new Intent(MainActivity.this, WhoActivity.class);  // 25行目
startActivity(intent);
```

- kotlinの場合

```kotlin
val intent = Intent(application, 遷移後のアクティビティ::class.java)
startActivity(intent)
```

例)

```kotlin:MainActivity.kt
val intent = Intent(application, WhoActivity::class.java)  // 18行目
startActivity(intent)
```

intentの設定方法が大きく違う

## 画面遷移の時に文字列を渡す方法

- javaの場合

(遷移前のアクティビティ)
    
```java
Intent intent = new Intent(今のアクティビティ.this, 次のアクティビティ.class);
intent.putExtra("値に紐づくキー", 渡したい値);
startActivity(intent);
```

例) 

```java:HowManyActivity.java
String groupNum = groupNumE.getText().toString();                           // 43行目 
Intent intent = new Intent(WhoActivity.this, HowManyActivity.class);        // 46行目
intent.putExtra("GROUP_NUM", groupNum);    // groupNumをCheckActivityに送る  // 48行目
startActivity(intent);
```

(遷移後のアクティビティ)

```java
Intent intent = getIntent();
final String 変数名 = intent.getStringExtra("値に紐づくキー");
```

例)

```java:CheckActivity.java
Intent intent = getIntent();                                 // 25行目
final String groupNum = intent.getStringExtra("GROUP_NUM");  // 27行目
```

- kotlinの場合

(遷移前のアクティビティ)

```kotlin
val intent = Intent(application, 遷移後のアクティビティ::class.java)
intent.putExtra("値に紐づくキー", 渡したい値)
startActivity(intent)
```

例)

```kotlin:HowManyActivity.kt
val groupNum = group_num_et.text.toString()                               // 33行目
val intent = Intent(application, CheckActivity::class.java)               // 36行目
intent.putExtra("GROUP_NUM", groupNum)   // groupNumをCheckActivityに送る  // 38行目
startActivity(intent)
```

(遷移後のアクティビティ)

```kotlin
val 変数名 = intent.getStringExtra("値に紐づくキー")
```

例)

```kotlin:CheckActivity.kt
val groupNum = intent.getStringExtra("GROUP_NUM")
```

遷移後のアクティビティに書く、値を受け取るためのコードが違う

## ボタンを押して画面遷移をする方法

- javaの場合

```java
Button 変数名 = findViewById(R.id.ボタンのid);
変数.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 画面遷移
    }
});
```

例)

```java:MainActivity.java
Button startButton = findViewById(R.id.start_btn);  // 19行目
startButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, WhoActivity.class);
        startActivity(intent);
    }
});
```

- kotlinの場合

```kotlin
ボタンのid.setOnClickListener {
    // 画面遷移
}
```

例)

```kotlin:MainActivity.kt
start_btn.setOnClickListener {  // 16行目
    val intent = Intent(application, WhoActivity::class.java)
    startActivity(intent)
}
```

ボタンを扱うときに必要なコードが全体的にjavaよりもkotlinの方が少ない

# 最後に…

今回はjavaとkotlinでボタンを押して画面遷移をしました。
全体的にjavaよりもkotlinの方が簡潔に書ける印象でした。

明日も記事を投稿するので、引き続き温かく見守ってください。
プログラムを書くときの注意点：その４

【概要】
----------------------------------------
<b>1.結論</b>
<b>2.インターフェース分離の原則とは何か</b>
<b>3.なぜインターフェース分離の原則が必要か</b>
<b>4.インターフェース分離の原則はどう使うのか</b>
<b>5.ここから学んだこと</b>
<br>

1.結論
----------------------------------------
<b>インターフェース分離の原則にも従う！
<br>

2.インターフェース分離とは何か
----------------------------------------
●インターフェース分離とは、

>”クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない。”

一体どういうことかと言うと、
<br>
『利用しないメソッドは消しましょう！
さもないと関係のないメソッドに依存してしまい、
変更に影響がでちゃいますよ！』ということです。
<br>


3.なぜインターフェース分離の原則が必要か
----------------------------------------
結論としては、プログラミングを書く際の要は以下の
3つに集約されると思っています。

Ⅰ）保守性：修正（エラー発見のしやすさ）・管理のしやすさ
Ⅱ）拡張性：追加機能実装のしやすさ
Ⅲ）可読性：記述のわかりやすさ
が必要だと考えております。


ただこの分野に関しては余計な物は書かないということもありますので、
考え方は、プログラムに限ったお話ではないと思います。

つまり、上の3つを叶えるには
<b>インターフェース分離に”も（他の４つの原則もあるので）”従う！！</b>
<br>


4.インターフェース分離の原則はどう使うのか
----------------------------------------
こちらも例題で見ていきましょう！

```Ruby:インターフェース分離の原則
interface BBB
 void A();
 Void B();

class AAA implements （interface名） BBB
 void A();
 void B();
    .
    .
    .
```

とあったときに、仮にvoid Aに変更があったときには
他のメソッド(classAAA)も見なくていけません。
また、修正の必要がなくても確認は必要なので
余計な作業が増えてしまいます。

上記は単純なのでまだ良いですが、
複雑であればあるほどこの手間は無限大です。
<br>



5.ここから学んだこと
----------------------------------------
i)以前に紹介した、”<a href="https://qiita.com/taka_no_okapi/items/42e6bba8c23ef019f7f6">オープン・クローズドの原則</a>”にも”interface”は使われるので相互に発揮される原則だなと感じました！

ii)最初は単純に余計な物を書かないことが大事と思いましたが、文字通りの意味だけでなく、<a href="https://qiita.com/taka_no_okapi/items/76cb75bd85f24206d144">”単一責任の原則”</a>にもある役割別に分けることに繋がるなと思いました。例えば、PCであれば”動画”・”インカメラ”の役割別に分けることもそうですが、わざわざPCに”発電機機能”をつける必要はないということです。
<br>
Docker build時にDNSの名前解決が失敗する問題の対処

## 環境

Host: macOS Mojave 10.14.6, docker desktop 2.3.0.4
Base image: alpine:3.12 

## 問題と原因

Docker imageをbuildする際に、peclのライブラリをインストールしようとして以下のエラーが発生。

```
No releases available for package "pecl.php.net/zip"
install failed
```

諸々調べているとdockerコンテナ内部からpecl.php.netに到達出来ていないのが原因だった。

## 解決方法

Docker EngineにGoogle Public DNSを指定することで解決した。
Docker desktop > Preference > Docker Engine

```
{
  //省略
  "dns" : [ "8.8.8.8" ]
}
```
業務ビジネスフローで「次のステージ」が表示されない？？

前回は、Power AutomateとPower Appsのリレーションシップを比較して、表示させることができた！
記事は[こちら](https://qiita.com/sayaka121413/items/9cb6232c614f860b4fb9)
が・・・別の問題が。
複数のエンティティとリレーションシップ張ってると、あれ？表示されない・・・
# エラー「Dynamics365のWebAPIエラー」が起きたときの作成方法と原因
問題作成の時にエンティティを以下4つ作りました。
## 1.試験
### 1.フィールド

|表示名|データ型|
| :-: | :-: |
|合格ライン|テキスト|
|有効化|2つのオプション|

###2.リレーションシップ

| 表示名 | リレーションシップの種類 | 関連テーブル |
|:-:|:-:|:-:|
|試験|多対ー|プロセス|
|試験|一対多|問題|
|試験|一対多|解答|
|試験|一対多|結果|

## 2.問題
### 1.フィールド

|表示名|データ型|
|:-:|:-:|
|問題の種類|テキスト|
|問題文|テキスト|
|選択肢|テキスト|
|配点|整数|
|試験|テキスト|

###2.リレーションシップ

| 表示名 | リレーションシップの種類 | 関連テーブル |
|:-:|:-:|:-:|
|問題|多対一|プロセス|
|問題|多対一|試験|
|問題|一対多|解答|
|問題|一対多|結果|

## 3.解答
### 1.フィールド

|表示名|データ型|
|:-:|:-:|
|解答|テキスト|

###2.リレーションシップ

| 表示名 | リレーションシップの種類 | 関連テーブル |
|:-:|:-:|:-:|
|解答|多対一|プロセス|
|解答|多対一|試験|
|解答|多対一|問題|
|解答|多対一|結果|

## 4.結果
### 1.フィールド

|表示名|データ型|
|:-:|:-:|
|得点|整数|
|合否|テキスト|

###2.リレーションシップ

| 表示名 | リレーションシップの種類 | 関連テーブル |
|:-:|:-:|:-:|
|結果|多対一|プロセス|
|結果|多対一|試験|
|結果|多対一|問題|
|結果|一対多|解答|

と<font color="OrangeRed">４つ全部日本語で作った</font>のが原因

# 解消方法
上４つのエンティティを英語に直しました！

| 変更前 | → | 変更後 |
|:-:|:-:|:-:|
|試験|→|exam|
|問題|→|problem|
|解答|→|answer|
|結果|→|results|

そうすると・・・なんと！
Dynamics365のWebAPIエラーがなくなって保存できた(∩´∀｀)∩わ～い(∩´∀｀)∩わ～い

# まとめ
・日本語でだめなら英語に変換
・根本的な解決には至らないが…解消はできた！
【Ansible】ansible実行時にSSHパスワード認証を使う方法

# はじめに
ansible実行時にSSHパスワード認証を使う方法についてアウトプットしたいと思います。

# 今回の環境

- **OS**

```bash
(venv) [root@tspdev01 test_role]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
(venv) [root@tspdev01 test_role]#
```

- **Ansibleバージョン**

```bash
(venv) [root@tspdev01 test_role]# ansible --version
ansible 2.9.10
  config file = /root/.ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /root/venv/lib/python2.7/site-packages/ansible
  executable location = /root/venv/bin/ansible
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
(venv) [root@tspdev01 test_role]#
```

# 対応内容

`ansible.cfg`に下記内容を追加

```bash:追加内容
[defaults]
ask_pass = True
```
<br>
※`ansible.cfg`の場所は、インストール方法によって異なります。
`yum install ansible`にてインストールした際には、下記ディレクトリに存在します。

```bash:ansible.cfg
/etc/ansible/ansible.cfg
```

# 試しにping疎通を実施

このような感じになります。

```bash:実行結果
(venv) [root@tspdev01 test_role]# ansible -i inventory/test01_inventory.ini test_servers -m ping --ask-pass
SSH password:
192.168.56.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
(venv) [root@tspdev01 test_role]#
```
→`pong`であればping疎通ができています。

# 今回の経緯

最初にansibleを実行した際に、下記エラーが表示されました。

```bash:error
(venv) [root@tspdev01 test_role]# ansible -i inventory/test01_inventory.ini test_servers -m ping
192.168.56.51 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}
(venv) [root@tspdev01 test_role]#
```

エラーの原因を探る過程で、「ansible実行時にSSHパスワード認証を使う方法」の情報にたどり着きました。


# 参考
[ansible で UNREACHABLE! Failed to connect to the host via ssh: Permission denied エラーで対象ホストにログインできない](https://curecode.jp/tech/ansible-unreachable-failed-to-connect-to-the-host-via-ssh-permission-denied/)
MySQL　ファイルに書き出す

#バックアップをとる

mysql> \q　⬅️mysqlサーバーから出る
####ファイルに書き出す　mysqldump -u ユーザー名 -p DB名 > ファイル名
$ mysqldump -u myapp_user -p myapp > myapp.backup.sql

####書き出したファイルを確認する
$ less myapp.backup.sql
q キーで抜ける

####書き出したファイルで復元する　 \\. ファイル名
$ mysql -u myapp_user -p myapp　⬅️mysqlサーバーから出るにログイン

mysql> \\. ./201707_myapp.backup.sql
[Python学習その２]JSON形式データから値を取得する方法

##始めに
今回はPythonを使ってJSON形式データの取得から値の取り出しを行う
###作業環境
OS:Mac
ソフト:JupyterLab
言語:Python

###参考サイト
[JSONで配列の入れ子構造や値の取得方法などをPythonを使って説明！](https://www.sejuku.net/blog/79079)
いつもありがとうございます！

##実際にやってみる
参考サイトからJSONを用意します

```python:test.py
json_test ={
  "name": "taro",
  "age": 23,
  "sex": "man",
  "hobby": [
    "running",
    "swimming",
    "singing"
  ]
}
```

ここからageの値を取得する

```python:test.py
json_test["ege"]

#23
```

次はsexの値を取得する

```python:test.py
json_test["sex"]
#'man'
```

ここまでは簡単に理解できた

次にhobbyの値を取得する
予想では全部の値を取得できるはず・・・

```python:test.py
json_test["hobby"]
#['running', 'swimming', 'singing']
```

予想通りだった

じゃあ、特定の値だけを取得したいときはどうすればいいか

```python:test.py
json_test["hobby"][0]
#'running'
```

こんな感じに配列から値を取得するイメージで取り出すことができる
配列と同じだから1番目を取り出すときは０を指定する

次のJSONデータを取得する

```python:test.py
test_json={
  "name": "taro",
  "age": 23,
  "sex": "man",
  "hobby": [["running","swimming", "fising"], ["movie", "game", "card"]]
}
```

hobbyの値が２次元配列になった

これを取り出すのは難しそう
とりあえず先ほどの感じでやってみる
予想では1つの配列が取り出せる

```python:test.py
test_json["hobby"][0]
#['running', 'swimming', 'fising']
```

予想通りできた
のでswimmingだけ抜き出す

```python:test.py
test_json["hobby"][0][1]
#swimming
```

最後は今までのまとめ

```python:test.py
test_json={
  "name": "taro",
  "age": 23,
  "sex": "man",
  "hobby": {
    "outdoor": {
      "land": ["running", "walking"],
      "sea": ["swimming", "fising"]
    },
    "indoor": ["movie", "game", "card"]
  }
}
```

今まで通りswimmingを取り出す

```python:test.py
test_json["hobby"]["outdoor"]["sea"][0]
#'swimming'
```

配列を取り出すこともできる

```python:test.py
test_json["hobby"]["outdoor"]
#{'land': ['running', 'walking'], 'sea': ['swimming', 'fising']}
```

とりあえずJSON形式データから値を取り出すことはできるようになった

##終わりに

今回の学習で参考にしたサイト
[JSONで配列の入れ子構造や値の取得方法などをPythonを使って説明！](https://www.sejuku.net/blog/79079)
Boost.PhoenixでBoost.Functionライクな関数が定義できるぞ

オペレーターのオーバーロードにより、Boost.Phoenixで独自の関数を定義することができる。

     1#include <boost/phoenix/phoenix.hpp>
     2#include <vector>
     3#include <algorithm>
     4#include <iostream>
     5
     6struct is_odd_impl
     7{
     8    typedef bool result_type;
     9
    10    template <typename T>
    11    bool operator()(T t) const { return t % 3 == 1; }
    12};
    13
    14boost::phoenix::function<is_odd_impl> is_odd;
    15
    16int main()
    17{
    18  std::vector<int> v{1, 3, 6, 8, 12};
    19
    20  using namespace boost::phoenix::placeholders;
    21  std::cout << std::count_if(v.begin(), v.end(), is_odd(arg1)) << '\n';
    22}

11行目で、operator()をオーバーロードしている。

リストv{1, 3, 6, 8, 12}のうち、3で割って余りが1になる要素の数を数えている（この場合は1だけ）

<pre>
$ ./a.out 
1
</pre>

なぜ、このようなことができるようにしているのか？

個人的な感想その１：Boost.Phoenixは後発のライブラリなので、Boost.Functionっぽくも使えるという事をしたかったのではないか？
「'Д・」

個人的な感想その２：オペレーターのオーバーロードこそが、Boost.Function/Lambda/Phoenix/Spiritの礎となる奥義なのではないか？
 (*ﾟﾛﾟ;)
【rails】本番環境にSECRET_KEY_BASEの値を渡す

rails **5.0**で開発中、ハマったポイントの内の一つ。
AWSのECSでデプロイ試みたところ、コンテナの無限起動状態になったため、色々調べたところ、
「実行に必要な環境変数の指定漏れなどコンテナの内部処理が原因で終了するケース」とのこと。↓
[Amazon ECS サービスのスロットリング(コンテナ無限起動)をCloudWatch Eventsで検知する](https://dev.classmethod.jp/articles/detect-ecs-service-throttling/)

私の場合、SECRET_KEY_BASEがうまく設定されていなかったのが原因のようでした。

#結論
dotenv-railsというgemを使って管理する

#対応
gemをインストール

```:Gemfile
gem 'dotenv-rails'
```
SECRET_KEY_BASEを生成

```bash:bash
bundle exec rake secret
```
上記コマンドで表示された長い文字列を.envファイルに書く。.envファイルはプロジェクト配下につくる。

```:.env
SECRET_KEY_BASE="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```
AWS、ECSでデプロイしている場合は、上記設定後イメージを再度ECRにプッシュ後、新しいタスクのリビジョンを作成し、サービスを更新したら、ちょっと待てば反映される。

#ぼやき
普通にタスク定義のrailsコンテナの環境変数のとこに書いてもOKなはずだが、私の場合なぜかうまくいかなかった（コンテナ無限起動が止まらなかった）いまだ原因不明。。

#参考
[Railsで環境変数を設定、取得](https://qiita.com/HayneRyo/items/4181920617db416fa840)
kernel update時にRealtek 8125 NICのドライバを自動コンパイルする

## フレームワーク
- [DKMS](https://wiki.archlinux.jp/index.php/Dynamic_Kernel_Module_Support)  
ざっくりどんなフレームワークかを説明する。  
dnf updateやapt update時にカーネルのバージョンアップが入った際、  
dkmsに登録しておいたドライバをバージョンアップするカーネル用に再コンパイルする。  
dkmsを用いず手動でコンパイルした際にはカーネルのバージョンアップ時に  
再度、手動でコンパイルする必要があるためその手間を省ける。

## 手順

- 冒頭記事の手順通りに進め、その環境で問題なくコンパイルとドライバを使用できることを確認する。
- ソースコードを移動させる。

```:/usr/srcへ移動
# mv r8125-9.003.05 /usr/src
```

- src/Makefileの編集

```diff
--- before_Makefile
+++ after_Makefile
@@ -83,7 +83,7 @@
                EXTRA_CFLAGS += -DENABLE_TX_NO_CLOSE
        endif
 else
-       BASEDIR := /lib/modules/$(shell uname -r)
+       BASEDIR := /lib/modules/$(KVER)
        KERNELDIR ?= $(BASEDIR)/build
        PWD :=$(shell pwd)
        DRIVERDIR := $(shell find $(BASEDIR)/kernel/drivers/net/ethernet -name realtek -type d)
```

- dkms.confの作成

```:お好みのエディタでどうぞ
# vim /usr/src/r8168-8.019.00/dkms.conf
```

```:dkms.conf
PACKAGE_NAME="r8125"
PACKAGE_VERSION="9.003.05"
BUILT_MODULE_LOCATION[0]="src"
BUILT_MODULE_NAME[0]="r8125"
MAKE[0]="'make' KVER=${kernelver} modules"
CLEAN="make clean"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="yes"
```

各パラメータについて少しだけ解説

**BUILT_MODULE_LOCATION**
make実行によってモジュールが生成されるディレクトリを指す。  

**BUILT_MODULE_NAME**
生成されるモジュール名を指す。なお.ko拡張子を除いた名前です。

**MAKE**
実際にコンパイルする際に実行するコマンドを記述します。

makeコマンドをシングルクォートで囲っている理由は  
「KERNELRELEASE will be automatically appended to MAKE[#].  If you want to suppress this behavior, you can quote the make command: 'make'.」
の一文がman内にあり、本ドライバのMakefileはKERNELRELEASEが定義されている場合ビルドに失敗するからです。
何故そういうMakefileを作ったのかはカーネルモジュール周りに疎いのでわかりません。
KERNELRELEASEが定義されている場合にmodulesレシピが定義されないように書かれてます。謎。

**DEST_MODULE_LOCATION**
書かないとDKMSの実行に失敗するけど、書いても無視されてしまう意味不明な変数。
「This is a required directive」って書いてるくせに
「DEST_MODULE_LOCATION is ignored on Fedora Core 6 and higher, Red Hat Enterprise Linux 5 and higher, Novell SuSE Linux Enterprise Server 10 and higher, Novell SuSE Linux 10.0 and higher, and Ubuntu. Instead, the proper distribution-specific directory is used.」

ってほとんどやないか〜〜〜〜〜い。
自分の環境はUbuntuで、/updates/dkms配下にインストールされるのでそれに準拠して上記のconfにはそのパスを記載してます。一応。
RHELとほぼ同義なんで無視される気はしますけど、CentOSだとちゃんと読み込んでくれるんですかね。どうなんだろ。

- DKMSへの追加、ビルド、インストール

```
# dkms add -m r8125 -v 9.003.05
# dkms build -m r8125 -v 9.003.05
# dkms install -m r8125 -v 9.003.05
```

- 実際にカーネルアップデート時に動作するか

適当な過去バージョンのカーネルをインストールしてみる。
インストール後に想定された/updates/dkms配下にインストールされてればOK

```
# apt install --reinstall linux-image-4.15.0-112-generic
# ls /lib/modules/4.15.0-112-generic/updates/dkms/r8125.ko
```

## 参考
- [Realtek 8125 NIC をCentOS8で動かす](https://qiita.com/mhorimoto/items/de9cfb3823e06cafa724)
- [Dynamic Kernel Module Support](https://wiki.archlinux.jp/index.php/Dynamic_Kernel_Module_Support)
- [UbuntuTips/Others/DkmsHowTo](https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo)
【Nuxt.js】リングフィットアドベンチャーの運動記録を入力してグラフ化するアプリケーションを作った

# はじめに

みなさん[リングフィットアドベンチャー](https://www.nintendo.co.jp/ring/)はやっておられますか？
コロナ禍の影響であまり外出ができず、特にリモートワークの場合運動不足に陥りがちです。
そんな中、自室で楽しく運動することができるリングフィットフィットアドベンチャーはとても重宝しています。💪
このような状況も相まって現在も品薄状態が続いているようですね。

さて、そんなリングフィットアドベンチャーですが、プレイしていた以下のようなことを感じました。

- 日々の運動記録は見れるが、そのためにゲームを起動するのがめんどくさい
- switch本体の時間操作をしていると正しく記録されない（これは人によりますが...）
- 運動記録をグラフにして見たい！

というわけで、よくあるフィットネスアプリのように運動記録を入力してグラフで見れるようにしました。
製作期間は2ヶ月くらいです。

[リングフィットログ](https://ring-fit-log.herokuapp.com/record)

[GitHub](https://github.com/azukiazusa1/ring-fit-log)

# 機能

## 記録入力画面
![スクリーンショット 2020-08-19 16.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/d106a422-da52-fd7a-0669-a8892b72b029.png)

下記画像の、リングフィットアドベンチャーの運動終了後に表示される本日の運動結果の項目を入力できるようにしています。
![EfxnX-TUMAAKn-n.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/5d07b8b3-961b-1d71-7928-dd1edfc7c274.jpeg)


## カレンダー
![スクリーンショット 2020-08-19 16.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/3993254d-5fbd-af40-d189-d5394e9a593f.png)

カレンダー表示で月の運動記録を視覚的に表示します。どの日にサボっちゃったかわかっちゃいますね...


## グラフ

![スクリーンショット 2020-08-19 16.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/56a15f9a-ce00-c0e1-1e32-61e01892877e.png)

グラフで日々の運動量の変化を見ることができます。
グラフの作成には[vue-chartjs](https://vue-chartjs.org/)を使用しています。

# 使用技術

## フロントエンド

### Nuxt.js + TypeScript + Vuetify

使い慣れていたVue.jsのフレームワークのNuxt.jsをSSRモードで使用しています。
UIフレームワークも使ったことがあったVuetifyにしました。

Nuxt.js(Vue.js)をTypeScriptで書いたことはありませんでしたが、一度開発時の快適さを味わってしまうともうJavaScriptを使うことは考えられないほどでした。

また、Nuxt.jsのPWAモジュールを使用すれば簡単にPWA化できるので取り入れています。

## バックエンド

### Express + TypeScript

バックエンドはNuxt.jsの[serverMiddleWare](https://ja.nuxtjs.org/api/configuration-servermiddleware/)として実装し、BFFのように扱っています。
Nuxt.jsの他に外部サーバーを必要としないのが嬉しいですね。言語としてNode.jsしか選択できない欠点はあります...

ExpressはNode.jsのフレームワークです。比較的自由度が高いので、MVCフレームワークに沿って構築しています。

## データベース

### MongoDB

以下の点からデータベースとしてMongoDBを採用しています。

- アプリケーションの性質上データの整合性が重要ではない
- 利用者が多いので、情報を得やすい
- NoSQLではあるが、合計や平均などの集約操作が可能

MongoDBのODMとして、[mongoose](https://mongoosejs.com/)が有名ですが、これをTypeScriptで記述する場合拡張しなければいいけないことが多くて大変でした...

## テストフレームワーク

### Jest

## サーバー

### heroku

デプロイ先としては小さなアプリケーションであるためherokuを選択しました。


# おわりに

制作にそんなに時間がかからないと考えていましたが、思ったよりも時間がかかってしまいました。
個人開発だとやるもやらないも自由なんで、その日の気分で開発を勧めていたのでダラダラと進んでいってしまいました。
明確なスケジュールを設定して進めるべきでしたね...
HTTPのキャッシュ仕様をスライド一枚で簡単に

## HTTPのキャッシュ仕様
レスポンスのキャッシュ指定は大まかに**有効期限モデル**と**検証モデル**に分類できます。
今回はこの辺りをスライド1枚に簡単にまとめました。
![HTTP-Cache.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274106/44251cea-6502-4edd-5fd8-a4de67c0ee3e.png)

### 参考
より詳細なキャッシュ仕様は次の書籍等が勉強になります。
- [Web API: The Good Parts](https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864)
- [Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術](https://www.amazon.co.jp/Real-World-HTTP-%E2%80%95%E6%AD%B4%E5%8F%B2%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%A8%E3%82%A6%E3%82%A7%E3%83%96%E6%8A%80%E8%A1%93-%E3%82%88%E3%81%97%E3%81%8D/dp/4873118042)
Contact Form 7の読み込みをお問い合わせページのみに制限する方法

##はじめに

Contact Form 7は、WordPressでのお問い合わせフォーム作成に便利なプラグインですが、全ページでJavaScriptとCSSを読み込むため、動作が重くなってしまいます。

この記事では、Contact Form 7のJavaScriptとCSSの読み込みをお問い合わせページのみに制限する方法を紹介します。


必要なページでのみJavaScriptとCSSを読み込むようにカスタマイズすることで、WordPressの高速化にも大きく貢献してくれます。

##コンタクトフォームの読み込みを制限する

WordPressのfunction.phpに以下のコードを設置してください。
管理画面から、外観→テーマエディター→テーマファイルで編集できます。

```function.php
//コンタクトフォーム読み込み制限 
function cf7_limitation() {
	add_filter( 'wpcf7_load_js', '__return_false' );
	add_filter( 'wpcf7_load_css', '__return_false' );
	if( is_page( 'contact' ) ){
		if ( function_exists( 'wpcf7_enqueue_scripts' ) ) {
			wpcf7_enqueue_scripts();
		}
	if ( function_exists( 'wpcf7_enqueue_styles' ) ) {
		wpcf7_enqueue_styles();
	}
	}
}
add_action( 'template_redirect', 'cf7_limitation' );
```

全てのページでContact Form 7のJavaScriptとCSSの読み込みを無効にした上で、

Contact Form 7を設置したページのみ、
`wpcf7_enqueue_scripts();`の部分でJavascriptを
`wpcf7_enqueue_styles();`の部分でCSSを読み込むようにしています。

is_page( 'contact' )の部分は、Contact Form 7を設置したページのパーマリンクに合わせて変更してください。
上記コードは、`https://hogehoge.com/contact/`に設置した場合です。


##参考ページ

[必要な場合だけ JavaScript とスタイルシートをロードさせるには](https://contactform7.com/ja/loading-javascript-and-stylesheet-only-when-it-is-necessary/)
【rails5】本番環境でcssが反映されない

めちゃくちゃハマりました、、、、
#結論

１、プリコンパイルしていないと反映されない
２、production.rbで静的コンテンツの公開がfalseになっていると反映されない

#対応
##１、プリコンパイルしていないと反映されない
本番ではpublic/assets配下のコンテンツを読み込む。
ローカルでapp/assets/配下においておいたscssファイルやjsファイル、画像などを読み込みたい場合は
本番環境でプリコンパイルを実施する必要がある。コマンドは以下。

```bash:bash
bundle exec rails assets:precompile RAILS_ENV=production
```

##2、production.rbで静的コンテンツの公開がfalseになっていると反映されない

```config/environments/production.rb
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
```
↑この値がfalseだと反映されない。
直接trueに書き換える、などやり方は色々あるらしいが、私の場合はAWSのECSでデプロイしていたので
タスク定義：railsコンテナ:環境変数設定のところで

```
RAILS_SERVE_STATIC_FILES　= true
````

としたらcssなどが反映されるようになった。


#参考
[【Rails】本番環境におけるアセットプリコンパイルの設定](https://qiita.com/aiandrox/items/408724ab8a4482fb5873)
【Rails6】mapメソッドが少しわかる【チュートリアル4.3.2 演習問題２解説】

###はじめに

`yeller([’o’, ’l’, ’d’])`と実行したとき、”OLD”を返すメソッド`yaller`を定義しなさいという演習の回答例とメソッドの流れを書いてみました


###回答例

```
irb(main):025:0> def yaller(hoge)
irb(main):026:1>   oohoge = hoge.map{|v| v.upcase}.join
irb(main):027:1> end
=> :yaller
irb(main):028:0> yaller(['o','l','d'])
=> "OLD"
```
1.`hoge`に配列`['o','l','d']`を渡す
2.`map`と`upcase`で`hoge`の中身を一文字ずつ大文字に変えながら配列を`oohoge` = `['O','L','D']`
3.`join`でつなげて=> `OLD`
という順番です。


###map無しバージョン
ヒントで`map`と`upcase`と`join`を使うといいですよ〜と書いてましたが、`map`なしでも可能みたいです

```
irb(main):025:0> def yaller(hoge)
irb(main):026:1>   oohoge = hoge.join.upcase
irb(main):027:1> end
=> :yaller
irb(main):028:0> yaller(['o','l','d'])
=> "OLD"
```

1.`hoge`に配列`['o','l','d']`を渡す
2.`['o','l','d']`を`join`で繋げて返す`"old"`
3.`upcase`で大文字にする=> "OLD"


以上です〜
複数カラムの内容であいまい検索をしたい時のwhereとorの使い方

# はじめに
・シンプルな検索機能を実装したんですが、`商品名だけでなく説明文も検索条件に含めたい`なーと思いました。
・`LIKE句であいまい検索`もしています。
・色々な方法があると思いますが、僕が実装した方法を書きます。
・間違いなどあればご指摘いただけますと幸いです。

# 検索窓で検索します
![スクリーンショット 2020-08-19 18.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630925/9a0809da-4b64-a4a4-2924-3de49f8f5969.png)
キーワードを入力して、検索ボタンをクリック。
検索結果画面に遷移して、検索結果が表示される。
といった感じです。

# こんなふうに実装しました
```ruby:ビューファイル
# 検索窓
.container
  = form_with(url: search_items_path, local: true, method: :get, class: "hoge") do |f|
    = f.text_field :key, placeholder: "キーワードから探す", class: "fuga", id: "hogehoge"
      %button{type: "submit", class:"fugafuga"}
```
`name="key"`になっているところ（`:key`）がポイントです。

```ruby:routes.rb
# itemsにネストすることと、collectionを使ってsearchアクションへのルーティングを設定します
resources :items, only: [:index, :show, :new] do
  collection do
    get 'search'
  end
end
```
collectionはルーティングに:idがつかない、memberは:idがつくという違いがあります。
今回は検索結果を一覧表示する都合上、idは関係ないのでcollectionを使います。

```ruby:items_controller.rb
# searchメソッドを追加します
def search
  @search_items = Item.search(params[:key])
end
```

```ruby:models/item.rb
class Item < ApplicationRecord
  def self.search(search)
    if search != ""
      Item.where(['name LIKE(?) or explanation LIKE(?)', "%#{search}%", "%#{search}%"])
    else
      Item.all
    end
  end
end
```
### モデルファイルのポイントは以下のとおりです。
・クラスメソッドだからselfを使っています。Item.searchの意味です。

・if文は`検索フォームに何か値が入っていた場合、以下のように検索しますよ`という意味です。

・検索は`nameカラムをLIKE句を使ってあいまい検索をしますよ`、`もしくは`、`explanationカラムをLIKE句を使ってあいまい検索をしますよ`、という意味です。

・`"%#{search}%", "%#{search}%"`は両方とも必要です。nameカラムとexplanationカラムの分ですね。片方でも欠けているとエラーが発生します。

・else以降は`検索フォームに何も値が入っていなければ、商品を全て取り出しますよ`という意味です。

```ruby:items/search.html.haml
.PickupContainer
  %h2.PickupContainer__title
    検索結果
  %ul.PickupContainer__items
    - @search_items.each do |item|
      %li.PickupContainer__items--item
        = link_to "/items/#{item.id}" do
          .DetailBox
            .DetailBox__name
              = item.name
            .DetailBox__details
              %ul
                %li
                  %span ¥
                  = item.price.to_s(:delimited)
              %p
                (税込)
```
### 検索結果はこんな感じです
Gyazoを貼っておきます。
eachメソッドで検索結果が一覧で出てくるようにしています。
https://gyazo.com/3ae03fd0fabed3dc615ae47ad4f166e3

# まとめ
複数カラムを検索条件に含めるための、モデルファイルでの記述が今回のキーポイントです。
が、ルーティングやコントローラーの記述にも大事な部分があるので注意です。
ありがとうございました。
AWSを使ってアプリケーションを公開する手順(1)AWSアカウントの作成

#はじめに
AWSを使ってアプリケーションを公開する手順を記載していく。
この記事ではAWSアカウントの作成方法を記載する。

#AWSアカウントの作成

##AWSのサイトにアクセスする
[ここ](https://aws.amazon.com/jp/)からAWSのトップページにアクセスする。

##コンソールにサインインボタンをクリックする
AWSのトップページ画面右上の「コンソールにサインイン」をクリックする。
![AWSトップページスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/4cc10deb-b3c5-fdcb-aaf1-fd70742f1f73.png)

##新しいAWSアカウントの作成ボタンをクリックする
画面左下の「新しいAWSアカウントの作成」をクリックする。
![AWSサインインページスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/f8936e89-2574-0772-9def-ffdcf5945f28.png)

##アカウント情報を入力する
Eメールアドレス、パスワード、パスワードの確認、AWSアカウント名をそれぞれ入力し「続行」をクリックする。
![AWSアカウント情報入力画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/8912198b-571e-d9a9-aa8d-f2ed370f036e.png)

##連絡先情報を入力する
アカウントの種類および各フィールドを入力する。
各フィールドは半角英数字で入力する。
AWSカスタマーアグリーメントを確認し、同意のチェックを入れ、「アカウントを作成して続行」をクリックする。
なお、今回はアカウントの種類で「パーソナル」を選択する。
![AWS連絡先情報入力画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/8da50297-2c10-ee05-e976-17ef77a9bfe7.png)

##支払い情報を入力する
各項目を入力し「検証して追加する」をクリックする。
![AWS支払情報入力画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/fe344645-4b37-bac8-f816-a602ff735f1d.png)

##本人確認をする
各項目を入力する。「検証コードをどのように受け取りますか？」で「テキストメッセージ(SMS)」と「音声通話」があるが
今回は「音声通話」を選択する。「お問い合わせください」をクリックすると入力した電話番号に電話がかかってくるので、
画面に表示された検証コードをキーパッドで入力する。
![AWS本人確認画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/43c20ab4-a229-4f5d-104f-4950ee45862a.png)

認証に成功すると次のような画面に遷移するので「続行」をクリックする。
![AWS認証成功画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/daa97dd5-bde0-27ca-b27f-3ad7b9f48f4d.png)

##サポートプランを選択する
サポートプラン選択画面に遷移する。今回は「ベーシックプラン」を選択する。
![AWSサポートプラン選択画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/3bccd031-32a7-1332-0261-312c69099ac2.png)

##AWSアカウントにサインインする
画像のような画面に遷移するので「コンソールにサインイン」をクリック。
登録したメールアドレスとパスワードを入力しサインインする。
![AWSサインイン画面スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654714/356244a5-82bb-3eec-c63c-80364879288d.png)

# 関連記事
[AWSを使ってアプリケーションを公開する手順(2)EC2インスタンスの作成](https://qiita.com/drafts/ec5aa2965a89320b074d)
[AWSを使ってアプリケーションを公開する方法(3)EC2インスタンスの環境構築]
(https://qiita.com/osawa4017/items/8dc09203f84e04bf0e66)
[AWSを使ってアプリケーションを公開する手順(4)データベースの作成]
(https://qiita.com/osawa4017/items/7dba25f4fa30ab0b1246)
[AWSを使ってアプリケーションを公開する手順(5)アプリケーションを公開する]
(https://qiita.com/osawa4017/items/6f3125fcc21f73024311)
[AWSを使ってアプリケーションを公開する手順(6)Nginxを導入する]
(https://qiita.com/osawa4017/items/9b707baf6ddde623068c)
【Unity】最近のUnityでC#からSwiftを実行する最短実装

自分の記憶ではUnityからSwiftを呼び出すための手順が以前は複雑だったのですが、最近は簡単になったようなのでメモしておきます。
※**Unity2019.4.4f1**で試しています。

- Helloworld.swift
- Bridge.mm
- Main.cs

この3ファイルを使います。

## 概要図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/8cdecdd3-0036-40fa-aba9-f85c55c2fe04.png)
C#から直接Swiftは呼び出せず、一旦Objective-C++を挟みます。

## Unityプロジェクトの構成

```
Assets
├── Plugins
│   └── iOS
│       ├── Helloworld.swift (Swift)
│       └── Bridge.mm (Objective-C++)
└── Scripts
    └── Main.cs (C#)
```

このような感じで`Assets/Plugins/iOS/`の中に`Swiftファイル`と`Objective-C++ファイル`を入れておきます。

## 最終的にC#から呼び出したいSwift

ゴールはhelloメソッドをC#から実行することになります。

```Helloworld.swift
import Foundation

@objc public class Helloworld : NSObject {
    @objc public static func hello() {
        print("Hello Swift!")
    }
}
```
Objective-C++から呼び出したいものに`@objc`アトリビュートを付けます。[^1]
[^1]: クラス全体をObjective-C++からアクセスを受け付ける場合は、クラス宣言前に`@objcMembers`をくっつける

## Swiftを呼び出すObjective-C++

```Bridge.mm
#import <UnityFramework/UnityFramework-Swift.h>

extern "C" {
  void FromCsharp() {
      [Helloworld hello];
  }
}
```
FromCsharpメソッドをC#から呼び出します。
<br />

```objc
#import <UnityFramework/UnityFramework-Swift.h>
```

以前は`#import <[Unityのプロジェクト名]-Swift.h>`が必要だった記憶ですが、最近はUnityが自動生成するヘッダファイル**UnityFramework/UnityFramework-Swift.h**をimportしておけば良いようです。


## C#からObjective-C++を呼び出す

```Main.cs
public class Main : MonoBehaviour 
{
    [DllImport("__Internal")]
    private static extern void FromCsharp();

    void Start() {
        FromCsharp();
    }
}
```
ここは馴染み深いコードで、`[DllImport("__Internal")]`をくっつけて呼び出すメソッドを定義します。

## 最後に

以前はSwiftにアクセスするの面倒くさいなと思っていましたが、ネイティブプラグインが作りやすくなった感があります。 

## 環境

- Unity2019.4.4f1
- Unity2020.1.0f1
- Xcode 11.6
rack-2.2.x で ActionController::Live が動かなくなっている件について

## 経緯

* レスポンスをすべて組み立てるのに時間がかかる処理があるので､処理全体が完了する前にレスポンスを返したい｡
    * HTTP 1.1 では HTTPヘッダで `Transfer-Encoding: chunked` を設定することで､body を任意の長さの chunk (かたまり) に分割してクライアントに返すことができることになっている
    * Rails には [ActionController::Live](https://api.rubyonrails.org/classes/ActionController/Live.html) というモジュールが用意されている
        * そのモジュールを include して､ `response.stream` に文字列を出力することで､レスポンスを任意の単位で送出することができる
        * 公式のドキュメント等には､その使用例として Server-Sent Events (SSE) が挙げられているが､別に SSE を利用しなくてもよい 

## 問題

ネタ元:

* [Version 2.2.x breaks Rails Actioncontroller:Live streaming · Issue #1619 · rack/rack](https://github.com/rack/rack/issues/1619)

`Rack::ETag` ミドルウェアでバッファリングされているらしく、本来、逐次レスポンスが返ってくるところ、`response.stream.close` するまでレスポンスが返ってこない挙動になってしまっています。

## 回避方法

rack を 2.1.x 系にデグレードするか､あるいは､以下のようにコントローラで HTTPヘッダを明示的に指定することで `Rack::ETag` によるバッファリングを回避できるようです。

```
      headers['Last-Modified'] = '0'
      headers['ETag'] = '0'
```

`Last-Modified`と`ETag`は､ [HTTP条件付きリクエスト](https://developer.mozilla.org/ja/docs/Web/HTTP/Conditional_requests) で使用され､コンテンツの中身が前回取得のものと同じであればリクエストを飛ばさずにキャッシュを利用するようなケースでよく利用されます｡
しかし､(個人的な印象ですが)APIのようなコンテンツが動的に生成されるような場合においては､キャッシュが利用できるケースは限られていて､キャッシュを利用したくないケースが多いと思います｡

今回のケースでも､APIで動的コンテンツを返すような箇所だったので上記のような回避策でも問題無いと判断しました｡

こんなので一日が潰れてしまった...


## 参考リンク

* [Rails 5.2: ActionController::Live does not stream responses, instead returns entire response at once · Issue #38780 · rails/rails](https://github.com/rails/rails/issues/38780)
* [Version 2.2.x breaks Rails Actioncontroller:Live streaming · Issue #1619 · rack/rack](https://github.com/rack/rack/issues/1619)
* [ActionController::Live](https://api.rubyonrails.org/classes/ActionController/Live.html)
* [ActionController::Live | TECHSCORE(テックスコア)](https://www.techscore.com/tech/Ruby/rails-4.0/actioncontroller-live/)
* [WEBRick で HTTP streaming (Chunked transfer encoding) - Qiita](https://qiita.com/ledsun/items/0c8936b7f34e3ee4d052)
* [HTTP条件付きリクエスト](https://developer.mozilla.org/ja/docs/Web/HTTP/Conditional_requests)
Gitのコミット対象に、アップロード画像を含めたくない！


以前、開発者が用意する画像と、ユーザーがプロフ画像の設定等でアップロードする画像では、それぞれ保存場所が違うという記事を書かせていただきました。
>https://qiita.com/beanbeenzou/items/a993bdc872e0a225dd47

そこで、アップロード画像はgithub等に保存させたくないということが出てくると思います。




#.gitignoreで、コミットさせないファイルを指定する

```git:.gitignore
# uploads配下のファイルは、cimmitさせない
/public/uploads/
```



#インデックス環境から、コミットしてしまったファイルを消す

```shell
# ファイルのみ削除
$ git rm --cached ファイル名

# ディレクトリごと削除
$ git rm --cached -r ディレクトリ名
```
[Unity] Unity1週間ゲームジャムのランキング名前入力を日本語対応する 

# はじめに

表題通りunity1week参加者かつランキング表示する人向けな記事となります。
UnityWebGLでInputFieldの日本語入力はデフォルトでは対応していません。
簡単な手順で対応できたので記事にしました。

unity1weekって何？な方はこちらをご参照ください。
[Unity1週間ゲームジャム](https://unityroom.com/unity1weeks)

# 結論

WebGLInputを使えばOKです。
[https://github.com/kou-yeung/WebGLInput](https://github.com/kou-yeung/WebGLInput)
こちら見てすべて理解できる人はもう読まなくて大丈夫です。

# 動作環境

- Unity 2019.4.2f1
- Windows 10


### 動作デモ
![ezgif-6-5b247c788984.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90481/74c15ef6-b998-8947-d48d-155edb8dade9.gif)




# 手順

[unity-simple-ranking](https://github.com/naichilab/unity-simple-ranking)を使用している前提で記載します。
ランキング表示させるための諸々の手順は実施済み想定で進めます。

### 0. WebGLInputをUnityプロジェクトに追加
WebGLInputの[Release](https://github.com/kou-yeung/WebGLInput/releases) ページから最新のUnityパッケージをDLしてImportする
記事時点でver0.91のWebGLSupport.unitypackage

### 1. unity-simple-rankingのRankingシーンを開く

### 2. RankingPanel/NameFormオブジェクトを選択

### 3. InputFieldのContentTypeをAlphanumericからStandardに変更

InputFieldの設定はTextMeshProでも同様です

![コメント 2020-08-19 184032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90481/bd2fe92c-d247-1464-c294-aa858cc38fd0.png)

### 4. NameFormにWebGLInputをアタッチする

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90481/dcc0c09e-42ba-6db7-da40-d9604e6e1a85.png)


# おわり

以上でウェブブラウザ上からでも日本語入力ができるようになります。
ほぼWebGLInputのアタッチだけなのでとりあえず対応しておくくらいでいいかもしれません。

動作デモのゲームはこちらから遊べます（隙あらば宣伝）
[アステリズム](https://unityroom.com/games/asterism)

## 参考記事

- [WebGLのUnity InputField 日本語入力について](https://www.shirokurohitsuji.studio/2019/04/11/webgl-unity-inputfield/)
TypeScriptなcreate-react-appで複数のプロキシを使いたいな

なんでこれだと動くのかわからないけど動くので


# きっかけ

[Configuring the Proxy Manually](https://create-react-app.dev/docs/proxying-api-requests-in-development/#configuring-the-proxy-manually)

を参考に、ドメインは一緒だけど異なるポート番号を持つ各APIサーバーに接続したかった

- /api/hoge -> http://localhost:5001
- /api/fuga -> http://localhost:5002

公式どおりjsファイルを設置したけど動かないうえに、ググラビリティが低いのかまったく情報が出てこない

あれこれ試してたら動いてしまったのでメモ

# /src/setupProxy.js の作成

公式どおりjsを作成

```js:/src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
  app.use(
    '/api/hoge',
    createProxyMiddleware({
      target: 'http://localhost:5001',
      changeOrigin: true,
    })
  );
  app.use(
    '/api/fuga',
    createProxyMiddleware({
      target: 'http://localhost:5002',
      changeOrigin: true,
    })
  );
};
```

# /src/setupProxy.ts の作成

中身一緒でtsファイルを作る

TypeScript的エラーが出たところは適当に直す

```ts:/src/setupProxy.ts
import { createProxyMiddleware } from 'http-proxy-middleware';
module.exports = function(app: any) {
  app.use(
    '/api/hoge',
    createProxyMiddleware({
      target: 'http://localhost:5001',
      changeOrigin: true,
    })
  );
  app.use(
    '/api/fuga',
    createProxyMiddleware({
      target: 'http://localhost:5002',
      changeOrigin: true,
    })
  );
};
```

# 完了

多分これで動くはず

jsファイルとtsファイルのどっちかだけだと動かないのでかなりはまった

後から思ったけどtsファイルのかわりに型定義ファイルを置けばいい話なんだろうか

ちょっと時間がなくて試してないので興味のある方はお試しください
AWS EC2環境のCentOS 7に何としてもVNCで接続したい。

# はじめに
とある製品をセットアップするにあたり、どうしてもGUI環境が必要でした。
VNCというワードも今回初めて知りました。
とても苦しみながらも何とか接続できたので、備忘録として手順を記します。

# 1．CentOSのインスタンスを作成
AWS EC2上にCentOS 7のインスタンスを立てセットアップしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443963/82fbb016-979e-3262-9db8-d4fc15e45c48.png)

# 2．セキュリティ周りを変更
今回は簡易手順とするので、SELinuxおよびfirewalldは停止してしまいます。
※必要な場合はVNCの接続に必要な穴あけ等をしてあげてください。

### SELinuxを無効化

```console
# vi /etc/selinux/config

---disabledに変更
SELINUX=disabled
---
```


### firewalldの無効化
※```#```で始まっているコマンドはrootユーザで実行。
　EC2のrootユーザ切り替えはデフォルトで、**```sudo su -```**

```console
# systemctl disable firewalld
```
**※EC2のCentOS 7には firewalld が存在しないので不要。**

### 設定の反映

```console
# reboot
```

# 3．VNCサーバをセットアップ

### VNCをサーバ側にインストール

```console
# yum install -y tigervnc-server
# yum groupinstall -y "GNOME Desktop"
```

### VNCを利用するユーザ/グループを作成

```console
# groupadd vnc
# useradd vncuser
# passwd vncuser
```

### VNC接続時に利用するパスワードを設定
```console
# su - vncuser

$ vncpasswd
$ exit
```

### VNCのサービスを作成

```console
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:3.service
```

**※```vncserver@:[数字].service```**
　ここの数字によって穴あけする **ポート番号(```590[数字]```)** が変わる。
　例）**```vncserver@:3.service```**　→　ポート番号：**5903**

### VNCサービスの設定を変更

```console
# vi /etc/systemd/system/vncserver@:3.service

---(ユーザ名を作成したものに変えて保存)
ExecStartPre=/bin/sh -c '/usr/bin/[ユーザ名] -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper [ユーザ名] %i
ExecStop=/bin/sh -c '/usr/bin/[ユーザ名] -kill %i > /dev/null 2>&1 || :'
---
```

```console
# cd /home/vncuser/.vnc/
# vi xstartup

---(新規作成)
#!/bin/sh
gnome-session &
---
```

**★以下の権限設定がとても大事！！**

```console
# chown vncuser:vncuser xstartup
# chmod +x xstartup
```

### VNCサービスを起動

```console
# systemctl daemon-reload
# systemctl enable vncserver@:3.service
# systemctl start vncserver@:3.service
# systemctl status vncserver@:3.service
```

# VNCクライアント側（Windows10）

### 適当なところから「VNC Viewer」をダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443963/62725c39-2512-4080-7f93-7d9a499c6866.png)

### VNC Viewerを起動して以下設定

File -> NewConnection
    **```VNC Server: [VNCサーバのIPアドレス]:[ポート番号]```**
    ※他の設定はデフォでもOK

#### == 注意 ==
EC2の **セキュリティグループ穴あけ** も忘れずに。。

---

### 参考
https://ccie-go.com/centos-vnc-1/
https://www.ipentec.com/document/linux-centos-7-vncserver-tigervncserver-install
Brackets SASS Autocompileを使ってみる。

#はじめに
Bracketsの拡張機能、SASS AutoCompileを使ってみたので備忘録を残します。
OSはWindows10
Node.js及びGulpは使用していません。

# SASS Autocompileの入手先

拡張機能マネージャーで検索する他、以下のサイトからも入手が可能です。
[SASS Autocompile | Github](https://github.com/SuperMario4848/Brackets-Extension-SASS-Autocompile)

# 使用方法
拡張機能をインストールすると、メニューバーに`SASS compiler`というメニューが表示されます。
![2020-08-19_18h24_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688078/5b045f49-d5e7-1921-dde6-ff9eb84e959a.png)

1. Select Source Folder で**main.scss**が置いてあるフォルダーを選択します。
2. Select Destination Folder で**main.css**を選択します。ファイルが無い場合は作成されます。
3. Enable AutoCompile をクリックすると準備が完了します。

ファイルを保存するたびに変更内容がmain.cssに反映されるようになります。
Node.jsやGulpがインストールされていなくても使用することができます。

# 注意点

- 1.で指定するフォルダーは、かならず**main.scss**が存在している必要があります。
- main.scssに`@import`で別のscssファイルを読み込むことで、分割されたSCSSファイルを1つのCSSにファイルにまとめることができます。
- コンパイル先のCSSファイルは任意に名前を変更することができます。
- コンパイルの設定はBracketsを起動するたびに設定をする必要があります。

以上です。
Bracketsだけでとてもかんたんにできますが、~~Node.jsとGulpを使ったコンパイル環境も今後構築しようと思います。~~

実際に試しました。
Node.jsとGulpを使ったコンパイルに比べて、やはり柔軟性が劣るという難点はあるようですね。
ディレクトリがごちゃごちゃしないのは良いところかな……
懸賞にどうしても当選したいので

どうやったらレビューをすり抜けられるかJSでちょっと考えてみましたw

```javascript
function getRandomNumber(length) {
  return
    Math.floor(Math.random() * length);
}

function getRandomWinner() {
  const entries = [
    '私',
    'あなた'
  ];
  const index = getRandomNumber(entries.length) >> 0;
  return entries[index];
}
```

下らないようで他言語にはない落とし穴を使っています。わからなかった場合は [O'reillyのJavaScript](https://www.oreilly.co.jp/books/9784873115733/) をオススメします。

答えはこちら:  
https://speakerdeck.com/reverentgeek/javascript-past-present-and-future-ndc-porto-2020?slide=25
RailsのeachにおけるBootstrap4グリッドシステム

Ruby on RailsでWEBアプリケーションの開発中にBootstrapのグリッドシステムがうまく動かないことがあったので備忘録的意味合いもあり投稿します。

#環境
* Ruby2.6.2
* Rails5.2.4
* Bootstrap4

#実現したかったこと
RailsでDBから欲しいデータをすべて取り出しBootstrapのグリッドシステムを利用してきれいに表示させる


#NGパターン
```books_controller.rb
def index
  @books = Book.all
end
```
```books/index.html.erb
<% @books.each do |book| %>
  <div class="row">
    <div class="col-md-6">
      <%= book.name %>
    </div>
  </div>
<% end %>
```

この書き方だとグリッドシステムがうまく動かず表示したい「book.name」が横並びにならずすべて縦に並んで表示されてしまします。


#OKパターン
```books_controller.rb
def index
  @books = Book.all
end
```
```books/index.html.erb
<div class="row">
  <% @books.each do |book| %>
    <div class="col-md-6">
      <%= book.name %>
    </div>　
　 <% end %>
</div>
```
このように.rowをeachの外で記述することによりグリッドシステムがうまく機能します。
#まとめ
Bootstrapは誰にでもかなり優しいCSSフレームワークですが少しの違いでうまく動かなくなることを実感し、プログラミングの厳しさと面白さを改めて実感できました。

今はフロントの部分でBootstrapに頼り切りですがRailsに慣れてきたらBootstrapを使わずにUI/UXを整えられるように勉強していきたい。
ちょっと最適化問題が解けるplatypusを動かしてみた

####なんか暑くて疲れていたのでplatypusで最適化してみた

ベイズ推定の勉強にちょっと疲れてきたので、口安めに、なんか最適化してみたくなって、ちょっとやってみた。
[Platypus - Multiobjective Optimization in Python](https://platypus.readthedocs.io/en/latest/index.html#)にマニュアルがありました。

インストールは、どうも`platypus`でなくて、`pip install platypus-opt`で-optがいるようです。

それでインストールしたら、サンプルを動かしてみましょう。
サンプルは、
[A Simple Example](https://platypus.readthedocs.io/en/latest/getting-started.html)
の、DTLZ2 問題ってのを、 NSGA-IIで解く問題のようです。

一体、このDTLZ2問題ってのがなんなのか？情報があまりありません。
どうもDTLZ2問題とは、単峰性問題で、山あるいは谷がひとつしかない問題のようです。

では、もう一つの NSGA-IIはなんだろう。
GAということで、きっと遺伝的アルゴリズムに関係しているのはわかりますよね。どうも、このGAを複雑にしたもののようです。とりあえず、[NSGA-Ⅱ](https://qiita.com/Taichi-Furukawa/items/a7a0982cc20a401133c0)これを読むとわかるようです。私にはまだ理解できていません。しっかり勉強しないと。。。

さて、ここまで来たら動かしてみましょう。
こんなサンプルのプログラムがマニュアルにのっています。

```python
# -*- coding: utf-8 -*-
from platypus import NSGAII, DTLZ2
# define the problem definition
problem = DTLZ2()
# instantiate the optimization algorithm
algorithm = NSGAII(problem)
# optimize the problem using 10,000 function evaluations
algorithm.run(10000)
# plot the results using matplotlib
import matplotlib.pyplot as plt
plt.scatter([s.objectives[0] for s in algorithm.result],
            [s.objectives[1] for s in algorithm.result])
plt.xlim([0, 1.1])
plt.ylim([0, 1.1])
plt.xlabel("$f_1(x)$")
plt.ylabel("$f_2(x)$")
plt.show()
```
動かすと、こんなグラフが描かれます。
![pareateFigure 2020-08-19 185923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/cb0b8d5a-bca4-3dfc-9b95-c7e037bd8cef.png)

これはパレート最適解の線図になります。

さて、ドキュメントにこんなことが書いてありました。
Note that we did not need to specify many settings when constructing NSGA-II. For any options not specified by the user, Platypus supplies the appropriate settings using best practices. 
google翻訳・・NSGA-IIを構築する際に、多くの設定を指定する必要はないことに注意してください。ユーザーが指定していないオプションについては、Platypus はベスト プラクティスを使用して適切な設定を提供します。

これ、本当だろうか？確かに、スクリプトに、いろいろなパラメーターを書いていないし、これでいいなら、結構楽かもしれない。。。本当だろうか？

とりあえず今日はここまで。。。
javascript - の iterator がちょっと非力だったので

[js-xiterable] というモジュールを書いたというお話です。

[js-xiterable]: https://github.com/dankogai/js-xiterable

* https://github.com/dankogai/js-xiterable

## `map`もねえ、`filter`もねえ、そもそもそれほど使われてねえ?

例えばこういうジェネレーターがあったとして

```javascript
function* count(n) {
    for (let i = 0; i < n; i++) yield i;
};
```

`Array`にしたり…

```javascript
[...count(8)]; // [0,1,2,3,4,5,6,7]
```

ループを回したり…

```javascript
for (const i of count(8)){
  console.log(i);
}
```

というところまではいいとして、

```javascript
count(8).map(v => v*v).filter(v => v % 2 === 1)
```

とかと書けないのはがっかりしませんか?他は

Swiftも…

```swift
(0..<8).map{$0 * $0}.filter{$0 % 2 == 1}
```

Rubyも…

```ruby
(0..7).map{|v| v*v}.filter{|v| v % 2 == 1}
```

かなり毛色が違うとはいえ Python も…

```python
[v * v for v in range(8) if v % 2 == 1]
```

できるのが当たり前なのですから。

## できる!そう [js-xiterable] ならね

というわけで出来るようにしてみました。こんな感じで使います。

```javascript
import {Xiterable} from './xiterable.js';
const xcount = n => new Xiterable(() => count(n));
const tens = xcount(10);
const odds = tens.filter(v=>v%2).map(v=>v*v);
const zips = tens.zip(odds);
[...tens];  // [ 0,      1,      2,       3,       4, 5, 6, 7, 8, 9]
[...odds];  // [ 1,      9,     25,      49,      81]
[...zips];  // [[0, 1], [1, 9], [2, 25], [3, 49], [4, 81]]
```

### 徹頭徹尾 lazy 

`xiterable` なオブジェクトは常に lazy です。要素は本当に必要になるまで一切生成されません。

Swift や Ruby では

```swift
(0..<8).map{$0 * $0} // この時点で [0, 1, 4, 9, 16, 25, 36, 49]
 が生成される
```

ので

```swift
(0..<Int(1e8)).map{$0*$0}
```

とかやると要素数 1e8 == 1億の`Array`を生成しようとしてしまいます。これを防ぐには

```swift
(0..<Int(1e8)).lazy.map{$0*$0}
```

と明示的に`lazy`にしてあげるとよいのですが、`xiterable`場合はじめからlazyなので

```swift
xcount(1e8).map(v => v*v)
```

は瞬殺ですし、

```swift
[...xcount(1e8).map(v => v*v).take(8)]
```

も即座に`[0,1,4,9,16,25,36,49]`と評価されます。

さらにランダムアクセス可能な無限イテレーターという概念までサポートしていて、例えば

```javascript

import { xrange } from './xiterable.js'
xrange().nth(42);  // 41
```

なんてこともできます。`xrange()`というのはPythonとかの`range()`と同様なのですが、引数がない場合には`[0,1,2...]`を無限に生成するジェネレーターとして機能します。しかし`.nth()`で任意の番目の要素が取得できるという。

### `BigInt` もサポート

もう一つの特長として、番号指定に`Number`だけではなく`BigInt`も指定可能ということが挙げられます。例えば

```javascript
[...xrange(0,4)];  // [0,1,2,3]
[...xrange(0n,4n)];// [0n,1n,2n,3n]
```

なぜそうなっているかといえば、`Number.MAX_SAFE_INTEGER` == `9,007,199,254,740,991`より大きな番号も扱う必要が出てきたからです。実は[js-xiterable]を書く前に[js-combinatorics]も全面的に書き直したのですが、例えば`'abcdefghijklmnopqrstuvwxyz'`の順列(permutation)の総数は`26!`== `403,291,461,126,605,635,584,000,000`にもなり、`Number`どころか`uint64_t`でも足りません。

[js-combinatorics]: https://github.com/dankogai/js-combinatorics

しかし`BigInt`はすでにSafari 13を除くモダンブラウザーでサポートされており、Safariも14からはサポートすることが決定しています。使い始めるにはいい時期だと判断した次第です。

```javascript
import { Permutation } from 'js-combinatorics';
let it = new Xiterable(
  new Permutation('abcdefghijklmnopqrstuvwxyz')
);
it.map(v => v.join('')).nth(403291461126605635583999999n); 
// 'zyxwvutsrqponmlkjihgfedcba'
```

念のため、[js-xiterable]も[js-combinatorics]も`BigInt`がなくても動きます。`Number.MAX_SAFE_INTEGER`以上の番号は扱えませんが。

### あとは

Githubをご覧くださいませ。enjoy!

Dan the Lazy JavaScripter
Android,KotlinでRealm

- Android Studio 4.0.1
- Kotlin: 1.3.72
- realm:6.0.2
- Windows 10

## インストール

```gradle:bundle.gradle(project)

buildscript {
    dependencies {
        classpath "io.realm:realm-gradle-plugin:6.0.2"
    }
}
```
```gradle:bundle.gradle(app)
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
```

## 初期化

Applicationクラスを作成し、その中でrealmの初期化をする

```kotlin:App.kt
package jp.co.sankosc.sample

import android.app.Application
import io.realm.Realm

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        Realm.init(this)
    }
}
```

```xml:AndroidManifest.xml
    <application
        android:name=".App"
```

## Modelを作る

引数なしのコンストラクタがないと、コンパイルが通らないみたいです。

```kotlin:User.kt
package jp.co.sankosc.sample

import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required

open class User(
    @PrimaryKey var id : String = "",
    @Required var name : String = ""
) : RealmObject()

```

## Activityから使う

```kotlin:MainActivity.kt
package jp.co.sankosc.sample

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.realm.Realm
import java.util.*

class MainActivity : AppCompatActivity() {

	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)

		val id = UUID.randomUUID().toString()
		val user = User(id, "nozaki")
		val realm = Realm.getDefaultInstance()
		realm.executeTransaction {
			it.copyToRealm(user)
		}
		val count = realm.where(User::class.java).equalTo("id", id).count()
		Log.d("sankosc", "count:" + count)
		realm.close()
	}
}
```