OmniAICreator/Qiita-1.07M huggingface dataset:
each_with_indexとeach.with_index

## each_with_indexの場合

```rb
array = ["Ruby", "PHP", "Python"]
array.each_with_index do |element, index|
  p "#{index}：#{element}"
end

#以下の様に出力
0：Ruby
1：PHP
2：Python
```

## each.with_indexの場合

```rb
array = ["Ruby", "PHP", "Python"]
array.each.with_index(1) do |element, index|
  p "#{index}：#{element}"
end

1：Ruby
2：PHP
3：Python
```

indexを指定の数字から始めたいときに便利

## 参考
[【Ruby】each_with_indexは知ってたけどeach.with_indexは知らなかった… - 訳も知らないで](https://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173513)
ActiveStorageが生成したファイルパス(URL)をNo route matches回避のリダイレクト対象外にする

# 問題点

存在しないパスへアクセスがあった時に、ルート(/)へリダイレクトさせるルーティング設定をしている環境で、ActiveStorageを利用して画像ファイルを保存していたWEBアプリ上で画像が表示されなくなった。

```ruby:config/routes.rb
# .
# .
# .

# 本番環境で、
# ルーティングが存在しないパスへアクセス(GET)があった場合に、
# ルート(/)へリダイレクトさせる
if Rails.env.production?
match "*path" , to: redirect('/'), via: 'get'
end
```

![ActiveStorage01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/63a18142-f60e-7019-f0f9-be448ce486ad.png)

# 原因

ActiveStorageを利用して取得した画像ファイルのURLがリダイレクトの対象になっていた。

```erb:show.html.erb
<%# 画像ファイルを表示 %>
<%= image_tag @user.avatar %>

# HTMLには↓のURLが出力される
# /rails/active_storage/blobs/xxxxx--xxxxx/icon.png
```

<img width="750" alt="ActiveStorage03.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/59899e37-42cc-1b06-4284-fabfb002e632.png">


# 解決策

ActiveStorageを利用して取得する画像ファイルのURLをリダイレクトの対象外にすることで解決した。

参考：[Rails Router Catchall Picks Up ActiveStorage Routes · Issue \#31228 · rails/rails](https://github.com/rails/rails/issues/31228)

```ruby:config/routes.rb
# .
# .
# .

# 本番環境で、
# ルーティングが存在しないパスへアクセス(GET)があった場合に、
# ルート(/)へリダイレクトさせる
get '*path', to: redirect('/'), constraints: lambda { |req|
  # 'rails/active_storage'が含まれているパスはリダイレクト対象外にする
  req.path.exclude? 'rails/active_storage'
}
```
jQueryのappendメソッド



## appendメソッドとは？

対象の要素の末尾に
テキストやHTML要素を追加するメソッド


```html
<ul>
    <li>JavaScript</li>
    <li>React</li>
</ul>
```

このul要素にli要素を一つ追加したい・・・

```js
$('ul').append('<li>jQuery</li>');
```

最終的には以下の様なHTMLとなる。

```html
<ul>
    <li>JavaScript</li>
    <li>React</li>
    <li>jQuery</li>
</ul>
```

ボタンを押したら、何かが追加される・・・
などという実装に便利。

## 参考
[jQueryのappendでDOM要素を追加する方法まとめ！ | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト](https://www.sejuku.net/blog/37847)
C/C++ printfの%lfはdouble(倍精度浮動小数点)をフル桁で表示してくれない

Javaのバイナリをいじっていて、floatやdoubleの格納方法が気になったので以下のようなソースコードで勉強をしていました。

```cpp
int main() {
	union {
		double d;
		float f;
		unsigned char c[8];
	} uni;

 	printf("入力：");
	scanf("%lf", &uni.d);

	printf("d = %lf\n", uni.d);
	dump(uni.c, 8);
	sdumpb(buff, uni.c, 8);
	exponent = (cast_n(&uni.c[4], 4) & 0x7FF00000) >> 20;
	printf("指数部：%d(%d)\t仮数部：%s\n", exponent - 1023, exponent, &buff[12]);

	uni.f = uni.d;
	printf("f = %f\n", uni.f);
	dump(uni.c, 4);
	dumpb(uni.c, 4);
	sdumpb(buff, uni.c, 4);
	exponent = (cast_n(&uni.c[2], 2) & 0x7F80) >> 7;
	printf("指数部：%d(%d)\t仮数部：%s\n", exponent - 127, exponent, &buff[9]);

	return 0;
}
```

ところが、**``scanf``**から入力したはずの**``double``**が小数点以下6桁までしか表示されないのです。

```
入力：0.1234567890123456789
d = 0.123457
3f bf 9a dd 37 46 f6 5f
00111111 10111111 10011010 11011101 00110111 01000110 11110110 01011111
指数部：-4(1019)        仮数部：1111100110101101110100110111010001101111011001011111

f = 0.123457
3d fc d6 ea
00111101 11111100 11010110 11101010
指数部：-4(123) 仮数部：11111001101011011101010
```

これじゃ **``double``**と**``float``**の値を見比べたいのに比較にならないじゃないの！

ということであちこちググってみても、**``%lf``**指定すればええねん。というような答えしか無い。

最終的に以下にたどりついてスッキリ。
　　[IBM Knowledge Center - fprintf()、printf()、sprintf() - データのフォーマット設定と書き込み](https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/fprints.htm)

>  e E f F デフォルトの precision は 6。precision が 0 または後ろに数値を伴わずに表示されたピリオドの場合は、小数点は出力されない。

つまり、小数点以下は6桁がデフォルト。

しかし以下の記載は怪しいデス。

>  g G すべての有効数字が出力される。

**``%g``**を指定してもVC2008の**CL.exe**でも、**bcc32.exe**(5.5と10.2)でもフル桁表示されませんでした。
**gcc**や**cc**ならちゃんと表示されるのかな。


なので結局、**printf**で小数点フル桁ほしい時は

```cpp
printf("%.16f", value);
```

とかやるのがベストなようです。

冒頭のソースコードの参考元：
　　[浮動小数点数の内部表現(IEEE) - Wakaba Programming School](http://www.k-cube.co.jp/wakaba/server/floating_point.html)
Androidアプリケーション開発入門

#前書き

諸事情あって、Androidアプリ開発することになったので、最近の流行りを調べながらやってくよ。
(ついでに、Qiitaのスライドモードを試してみるよ。)

---

## 開発環境

機種名 : MacBook Pro
OS : High Sierra 10.13.6
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB

---

## Android開発環境

Android Studio : Android Studio 3.1.3
JRE: 1.8.0_152-release-1024-b01 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

---

#本題

---

## 進捗

[SandBox](https://github.com/Diaboro87/Sandbox)

---

## 目標

流行りの主要なライブラリを確認する。

---

## 作りたい内容

アーキテクチャを~~MVC~~MVVM(?)として、それぞれの層で必要なライブラリを確認していく。
(追記 2018/08/01:gradleでの開発だから、android用のLibraryというより、JAVAのLibraryかな？)

---

## UI

Vue.jsみたいな感じのデータバインディング系のライブラリを使いたい。

え？データバインディング系のライブラリないの？(ないわけじゃないが、検索上位じゃない)
むしろ標準機能でできるみたい。

---

## WebAPI連携

REST系ライブラリ:まぁ、Volley一択ですね。
<img width="1162" alt="OkHttp3__volley__Retrofit2_-_調べる_-_Google_トレンド.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/b6e392e2-658d-1a71-f803-79da80587864.png">

---

## DB連携と関連するライブラリ

> [AndroidアプリでSQL Server等のDBへ接続したい](https://diy-kagu.hatenablog.com/entry/2017/03/23/135936)

上記記事を見るに、DBに直接接続はできない。
ってことで、DB連携はいつも通り、pythonでポスグレにつなぎますー

---

# 感想

---

Androidって、ちょろっとしか開発してなかったけど、普通の業務アプリ作ろうとするとこうなるのね。

これは、Android系のLibraryが不足していると見るべきなのか？
もしくは、javaの普通のLibraryで開発するのがいいのか。まぁ要調査ですね。
Excelでユニークでランダムな8桁の文字列を生成するやつ

Excelでサンプルデータなどで利用するために、ユニークでランダムな8桁の文字列を大量に作りたいときのコード

**前提**：keyというシートを作ってA1に
*abcdefghijklmnopqrstuvwxyz0123456789*
という文字列が入っている

以下を１つのセルに丸ごとコピペしていれてフィルハンドルを引っ張って必要な分をいれる。

---

`=CONCATENATE(MID(key!$A$1,(RANDBETWEEN(1,LEN(key!$A$1))),1),MID(key!$A$1,(RANDBETWEEN(1,LEN(key!$A$1))),1),MID(key!$A$1,(RANDBETWEEN(1,LEN(key!$A$1))),1),MID(key!$A$1,(RANDBETWEEN(1,LEN(key!$A$1))),1),MID(key!$A$1,(RANDBETWEEN(1,LEN(key!$A$1))),1),LOWER(BASE(ROW(),36,3)))`

---

中身は生成されるものはランダムな文字列5桁+行番号の36進数でユニークを担保している。
桁数は8桁だが改造したら何桁でもできる。

以下に実際に生成された20個を参考として記載。

d88ik001
72wyc002
xr7b2003
ra2d4004
th467005
gseyh006
mgfyp007
mj74u008
vsfc8009
ut3u500a
d5wj600b
b8dkp00c
kyta200d
hz2pg00e
s9vxe00f
xquu300g
ug36i00h
872sw00i
r4h9400j
yfyut00k
MSX 16進変換サンプル

```tohex1.asm
; z88dk / WebMSX
; z80asm -b -l tohex1.asm
; appmake +msx -b tohex1.bin --org 0xd000 --fmsx

chget   equ     $009f
chput   equ     $00a2

        org     $d000
start:
        call    chget
        ld      hl, val
        ld      (hl), a
        ld      de, buf
        call    tohex
        ld      hl, buf
        call    puts
        jr      start

puts:
        ld      a, (hl)
        or      a
        ret     z
        call    chput
        inc     hl
        jr      puts

tohex:
        ld      a, (hl)
        srl     a
        srl     a
        srl     a
        srl     a
        cp      $0a
        ccf
        adc     a, $30
        daa
        ld      (de), a
        inc     de
        ld      a, (hl)
        and     $0f
        cp      $0a
        ccf
        adc     a, $30
        daa
        ld      (de), a
        ret

val:    defs    1
buf:    defm    "xx ", 0
```

`tohex1.cas`をCassetteにドロップする。
テープアイコンのメニューから[Run Program]を選択する。
![WMSX Screen.png](https://qiita-image-store.s3.amazonaws.com/0/257554/55aa9cf4-1755-314d-44f1-adcc2533e306.png)

[WebMSX テープ版](http://webmsx.org/?tape=http://www.maroon.dti.ne.jp/lance/file/tohex1.cas)

他の例

```tohex1.asm
; z88dk / WebMSX
; z80asm -b -l tohex1.asm
; appmake +msx -b tohex1.bin --org 0xd000 --fmsx

chget   equ     $009f
chput   equ     $00a2

        org     $d000
start:
        call    chget
        ld      de, buf
        call    tohex
        ld      hl, buf
        call    puts
        jr      start

puts:
        ld      a, (hl)
        or      a
        ret     z
        call    chput
        inc     hl
        jr      puts

tohex:
        push    af
        rrca
        rrca
        rrca
        rrca
        and     $0f
        ld      hl, hexarr
        ld      b, 0
        ld      c, a
        add     hl, bc
        ld      a, (hl)
        ld      (de), a
        inc     de
        pop     af
        and     $0f
        ld      hl, hexarr
        ld      c, a
        add     hl, bc
        ld      a, (hl)
        ld      (de), a
        ret

hexarr: defm    "0123456789ABCDEF"
buf:    defm    "xx ", 0
```
Feature-Engineeringのリンク集めてみた

#【理論】
###Feature Engineering
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750

###Discover Feature Engineering, How to Engineer Features and How to Get Good at It
https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
###カテゴリカル変数のEncoding手法のまとめ
http://jotkn.ciao.jp/wp/2017/08/22/post-67/
###Feature Engineering: Data scientist's Secret Sauce !
https://www.linkedin.com/pulse/feature-engineering-data-scientists-secret-sauce-ashish-kumar?trk=prof-post

###最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
https://www.slideshare.net/mlm_kansai/kaggle-138546659

#【実装】
###DataFrameで特徴量作るのめんどくさ過ぎる。。featuretoolsを使って自動生成したろ
https://qiita.com/Hyperion13fleet/items/4eaca365f28049fe11c7

featuretoolsについてはHome Credit Default Riskの公開カーネルでも言及されてました。
Will Koehrsenさんは手動と自動の両方のカーネルを公開しており非常に勉強になる。
###Automated Feature Engineering Basics
https://www.kaggle.com/willkoehrsen/automated-feature-engineering-basics

###Introduction to Manual Feature Engineering
https://www.kaggle.com/willkoehrsen/introduction-to-manual-feature-engineering

###Introduction to Manual Feature Engineering P2
https://www.kaggle.com/willkoehrsen/introduction-to-manual-feature-engineering-p2

###KaggleのWinner solutionにもなった「K近傍を用いた特徴量抽出」のPython実装
https://upura.hatenablog.com/entry/2018/06/23/165855

###カテゴリカル変数のEncoding手法について
http://nami3373.hatenablog.com/entry/2018/07/26/230655

###fast_feng
https://github.com/tomomotofactory/ffeng

###学習アルゴリズム以外のscikit-learn便利機能と連携ライブラリ
https://yubessy.hatenablog.com/entry/2016/02/17/164511

###遺伝的プログラミングによる特徴量生成
https://qiita.com/overlap/items/e7f1077ef8239f454602

###遺伝的プログラミングによる特徴量生成でLightGBMの精度向上
https://upura.hatenablog.com/entry/2018/12/11/000000

#【Coursera】
How to Win a Data Science Competition: Learn from Top Kagglers
https://www.coursera.org/learn/competitive-data-science

#【本】
###特徴量エンジニアリングに焦点を当てた簡潔な本：「Feature Engineering for Machine Learning」
https://10001ideas.com/2018/07/19/%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E7%84%A6%E7%82%B9%E3%82%92%E5%BD%93%E3%81%A6%E3%81%9F%E7%B0%A1%E6%BD%94%E3%81%AA%E6%9C%AC/
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これ翻訳権取られていたので、どこかで翻訳が進んでいるはず。とても良い本なのでオススメです。 <a href="https://t.co/XEs4mnILfJ">https://t.co/XEs4mnILfJ</a></p>&mdash; piqcy (@icoxfog417) <a href="https://twitter.com/icoxfog417/status/1021671531770826752?ref_src=twsrc%5Etfw">2018年7月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

2月23日にオライリーから出版予定です。
[機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践][1]
[1]:https://www.amazon.co.jp/dp/4873118689/ref=as_li_ss_tl?ie=UTF8&qid=1547182598&sr=8-2&keywords=Python%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0&linkCode=sl1&tag=hoxom023-22&linkId=b69947b517c075acb5a12e6a41e08993&language=ja_JP
linux でファイルのバックアップ

# linux で日付のついたバックアップファイルを取る

* コマンド

```
$ cp /Users/#{user_name}/docker_centos_project/docker-compose.yml `date +/Users/#{user_name}/docker_centos_project/docker-compose.yml_%Y%m%d`
```

* 出来上がったファイル

docker-compose.yml_20180731

シェルファイル作ってディレクトリ移動したら楽かも
メール系の知識


# メールのプロトコル
##SMTP(Simple Mail Transfer Protocol)
**メール送信**に用いられるプロトコル。
TCPポートの２５番を使う。

SMTPが使われるのは、

- 「メール送信者のPC」→「送信側のメールサーバ」
- 「送信側のメールサーバ」→「受信側のメールサーバ」

##POP(Post Office Protocol)
**メール受信**に用いられるプロトコル。
「メールソフト主導型」。メールサーバから、メールをPCにダウンロードする。

##IMAP(Internet Message Access Protocol)
**メール受信**に用いられるプロトコル。
「サーバ主導型」。メールボックスをサーバの方に保管する。
PCのメールソフトで表示するときは、サーバに置かれたメールボックスを表示する。


#メールの構成
１通のメールは、**「エンベロープ(封筒)」**と**「メールデータ」**から構成される。

##エンベロープ(封筒)
宛先を「MAIL TO:」で指定し、発信元を「RCPT FROM:」で指定する。

##メールデータ
[メールデータの構造](http://d.hatena.ne.jp/takami_hiroki/20110209/p1)
DATAコマンドからドット(.)だけの行までの間がメールデータ。
**「ドット(.)だけの行」**がくると、その行を**「メールの終端」**として判定する。
そのため、メールの本文中に「行頭がドット(.)」となっている行は、**先頭をエスケープ(..)**する必要がある。

メールデータは更に、**「メールヘッダ」**と**「メールボディ」**に分かれる。

###メールヘッダ
[メールヘッダとは](https://wa3.i-3-i.info/word11129.html)
[メールヘッダの一覧](http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/mail-header.html)
メールの宛先や差出人の名前といった「メール本文以外の情報」が書いてある場所。
代表的な項目として、以下が含まれる

#### Return-Path
[Return-Path【メールヘッダ】](https://wa3.i-3-i.info/word11110.html)
きちんとメールをお届けできなかった際の返信先（連絡先）を指定する場所が「Return-Path（リターン・パス）」

#### Message-ID
[Message-ID](https://wa3.i-3-i.info/word11102.html)
[Message-ID - 通信用語の基礎知識](https://www.wdic.org/w/WDIC/Message-ID)
「メールを識別するための番号」で、**必ず一意**になる。（CC、BCCで送られたメールは同じ番号になる）
一般的な方法では、あるホストで一意に決まる英数字(ユーザー名や日付/時刻など)の羅列、@、ドメイン名やホスト名、という形に生成する。

最大文字数は「995文字」らしい。([Message-IDをDBに保存する際の考察](https://qiita.com/color_box/items/96d46ab3866b392679d1))

#### Reply-to
[Reply-to](https://wa3.i-3-i.info/word11098.html)
[Reply-to - 通信用語の基礎知識](https://www.wdic.org/w/WDIC/Reply-To)
「送信したメールの返信先アドレス」を指定する。

#### In-Reply-To
[In-Reply-To](https://wa3.i-3-i.info/word11103.html)
[In-Reply-To - 通信用語の基礎知識](https://www.wdic.org/w/WDIC/In-Reply-To)
あるメッセージに対する返信を書く時に**元のメッセージを識別する**ためのヘッダ。
元メッセージのMessage-IDが格納される。

#### References
[References](https://wa3.i-3-i.info/word11104.html)
[References - 通信用語の基礎知識](https://www.wdic.org/w/WDIC/References)
あるメッセージに対する返信を書くとき、「元になったメッセージを識別する」ためのヘッダ。
元メッセージのMessage-IDのほか、元メッセージが何かの返信である場合はそのMessage-IDも書かれる。
In-Reply-Toとは異なり、**スレッドを示すためのヘッダ**といえる。
多くのメーラーでは、この値を用いてスレッド表示を行う。


###メールボディ
「本文」や「添付ファイル」の情報が入っている部分。

# その他ワード
## キャリアブロック
[キャリアブロック(受信ブロック)](http://www.plusmb.jp/2008/10/03/8.html)
一度に大量の配信を行ったり、エラーメールアドレスを多く含む配信を行うと、迷惑メールと判断され、配信元サーバからメール配信をブロックされることがあります。



```
PopServer：受信メールサーバー
PopPort：ポート
UserName：メールアドレス
Password：パスワード
PopType：タイプ（Apop または Pop）
```


#参考URL
- [SMTPでメールを送ろう](http://www.tohoho-web.com/ex/draft/smtp.htm)
- [Contents-Transfer-Encoding](https://wa3.i-3-i.info/word11117.html)
- [SMTP](http://research.nii.ac.jp/~ichiro/syspro98/smtp.html)
- [エンベロープ（envelope）From/To とヘッダのFrom/To](https://www.cuenote.jp/documents/smtp/000204.html)
- [電子メールのプロトコルSMTP、POP、IMAP、HTTP](http://sotolog.com/pc/pop-imap-http-mail-protocol/)
- [メール設定で最初につまずく「SMTP」「POP」「IMAP」。その意味＆設定方法は？](https://time-space.kddi.com/ict-keywords/kaisetsu/20170824/2081)
PowerShell の GC が壊れているとしか思えない件について

# PowerShell の GC が壊れているとしか思えない件について

**8/1 追記: GC に問題があるのではなく、PowerShell の範囲オペレータが配列(イテレータではなく)を返すという仕様の問題でした. 詳細はコメントにて**

```powershell
PS> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      3.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.2.9200.22198
PSCompatibleVersions           {1.0, 2.0, 3.0}
PSRemotingProtocolVersion      2.2


PS> [GC]::Collect()
PS> [GC]::GetTotalMemory($false)
6122184                                 ※5.8MB
PS> 1..[math]::Pow(10, 8) > $null
PS> [GC]::GetTotalMemory($false)
3205013128                              ※2.98GB
PS> [GC]::Collect()
PS> [GC]::GetTotalMemory($false)
5412832                                 ※5.16MB
```

PowerShell どうなってんの?
[初学者]RailsにBootstrap4+Font Awesome 5の導入手順

# 目的 
- Qiitaに記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
- 今後、railsを学ぶ方に向けての参考に役立てる。

# 条件

- ruby 2.5.1
- rails5.2
- Bootstrap : 4.1.3
- Font Awesome : 5.2.0

# 手順リスト

1. Gemfileに追加する
2. application.scssに追加
3. application.jsに追加

## 1. Gemfileに追加する

```ruby:Gemfile
gem 'bootstrap', '~> 4.1.3' # 記事下の関連URLからバージョンを確認して導入
gem 'jquery-rails'
gem 'font-awesome-sass', '~> 5.2.0' # 記事下の関連URLからバージョンを確認して導入
```

```bash:インストール
# Gemfileに追記したやつをインストールする
bundle install
```

## 2. application.scssに追加

まず、`app/assets/stylesheets/application.css`のファイル名(拡張子)を`app/assets/stylesheets/application.scs`に変更する

```bash:ファイル名を変更
# 下記コマンドでファイル名(拡張子:.scss)に変更できます。
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

次に、```app/assets/stylesheets/application.scss```に読み込み設定を行います。

```ruby:app/assets/stylesheets/application.scss
# 以下を追記する
@import "bootstrap";
@import "font-awesome-sprockets";
@import "font-awesome";
```

## 3. application.jsに追加

```app/assets/javascripts/application.js
//= require rails-ujs
//= require jquery3
//= require popper
//= require bootstrap
//= require turbolinks
//= require_tree .

//= require jquery」が残ったままの方がたまにいるので、ある場合は削除してくだいさい。
```

# 関連URL

[github / bootstrap-rubygem ](https://github.com/twbs/bootstrap-rubygem)
[github / font-awesome-sass ](https://github.com/twbs/bootstrap-rubygem)
[github / jquery-rails ](https://github.com/twbs/bootstrap-rubygem)
[Font Awesome 5.2](https://fontawesome.com/)
Rust 2018のリリース前情報


Rustに導入される予定の新しいエディション、Rust 2018について、リリース前に得られる情報をご紹介します。

# Rust 2018とは何か

Rust公式ブログの [What is Rust 2018?] (https://blog.rust-lang.org/2018/07/27/what-is-rust-2018.html)より、大雑把に要約してみます。

Rust 2018とは、簡単に言えばC++におけるC++11みたいなものです。これまでのRustはRust 2015と呼ばれることになり、Rust 2018ではRust 2015からの破壊的変更が含まれます。12/6にリリース予定のRust 1.31が、Rust 2018の最初のリリースとなる予定です。`Cargo.toml`内でエディションを指定することにより、Rust 2018の機能が利用できるようになります。

## Rust 2015との互換性

Rust 2018のリリース後も、RustコンパイラはRust 2015で書かれたコードをコンパイルできます。また、Rust 2018からRust 2015で書かれたライブラリを使うことも、その逆も可能です。コンパイラは異なるエディションのコードをリンクすることができます。また、Rust 2015から2018へと自動変換するためのツール`cargo fix`が提供される予定です。

## Rust 2018リリース後の開発について

Rust 2018のリリースというのは、あくまで最初のリリースであるに過ぎません。Rust 2018がリリースされた後でも、Rust 2018への機能の追加は続けて行われます。また、必要であればRust 2015にも変更が加えられます。

## なぜエディションという形をとるのか

ユーザのコードを破壊することなく、破壊的変更を取り入れることのできる方法だからです。

また、Rustでは6週間ごとのリリースで細かい変更を積み重ねてきましたが、これはRustの変化を追い続けることを難しくしています。エディションという密なパッケージにすることで、これまで行われた変更を大きな視点から知ることができます。

# Rust 2018での変更点

[The Rust Edition Guide](https://github.com/rust-lang-nursery/edition-guide)を読めば、今の所予定されている変更点を伺い知ることができます。いくつか以下に紹介しますが、この文書自体が書きかけで、確定ではありません。

__追記(2018/11/30)__

__[The Rust Edition Guide](https://github.com/rust-lang-nursery/edition-guide)がかなり整備され、どの機能がどのバージョンのrustcから導入されるかわかるようになりました。また、async,await構文はRust 1.31時点では導入されず、安定化はRust 2018リリースより後となりました。__

__追記(2019/11/9)__

__Rust 1.39にて、async,await構文がstableになりました。__ 

## 非同期処理

async、await構文が追加されます。

## モジュール

`extern crate`が不要になり、`use`文で他クレートのシンボルを直接インポートできるようになります。

パス指定がクレート名で始まった場合、絶対パスとして認識されます。つまり、次のような書き方が可能になります。

``` Rust
mod foo {
    fn bar() {
	    let a = std::boxed::Box::new(1);
	}
}
```

Rust 2015では相対パスのため、`foo`の中の`std`という名前のモジュールを探してしまいますが、Rust 2018では期待通りに`std`クレート内のパスをたどってくれるようになります。パスが`crate`で始まった場合、現在のクレートの先頭からのパス指定となります。同様に、`self`は現在のモジュール、`super`は親モジュールからのパス指定となります。

`pub(crate)`が`crate`に変更され、短く書けるようになります。

マクロが`use`文でインポートできるようになるなど、Rustの他のシンボルと同様にモジュールベースで扱えるようになります。

## ライフタイム

いくつかの省略した書き方が導入されます。
例えば、`fn`や`impl`宣言において、`<>`内でのライフタイムの宣言が省略できるようになります。

また、Non-lexical lifetime(NLL)が導入されます。Rust 2015では、スコープ範囲をベースにライフタイムを管理していましたが、NLLによりスコープに縛られないもっと柔軟な書き方が可能になります。

## トレイト

`impl Trait`構文と`dyn Trait`構文が導入されます。Rust 2018では、トレイトオブジェクトを使う時は、`dyn Trait`構文が推奨されます。つまり、`&Trait`よりも`&dyn Trait`を使うことになります。これらの構文はRust 2015にもすでに導入されています。

# Rust 2018を試す

Nightlyコンパイラで、`#![feature(rust_2018_preview)]`を追加します。

``` Rust
#![feature(rust_2018_preview)]

fn main() {
}

mod a {
    pub fn foo() {
        let _ = std::boxed::Box::new(1); // 新しいパス指定方法
    }
}
```

Cargoを使う場合は、以下を`Cargo.toml`に追記します。こちらもNightlyが必要です。`main.rs`へのfeatureの指定は不要のようです。

```
cargo-features = ["edition"]

[package]
edition = '2018'
```

ただし、以上の指定をしても、予定されている機能が全て有効になるわけではないようです。例えば、NLLを有効にするためには`#![feature(nll)]`の追加が必要です。

***

Rust 2018がリリースされた後でも、これまでのRust(Rust 2015)で書かれたコードは引き続き使えるようですので、とりあえずひと安心というところでしょうか。Rust 2018で起こる変更は確定ではなく、issueやフォーラムで活発な議論が行われている最中です。
Vue.jsで2回目のクリックが効かなくなる

えー、本日のがっかりしょぼん記事です。あまりにも恥ずかしい話ではありますが、同じことでつまづいた人が私以外にもきっといるはずというかいてくれるといいなーというか、まぁそんな感じで記事として残して起きます。

# 本日の大事なこと
``.once``は思っていた多重クリック対策とは違った！``.once``は思っていた多重クリック対策とはちがった！
大事なことなので2回言いました。

# 何が起きたのか
Vue.jsでメールフォームを作ってたのですが、無事にメールが送れるようになった後、validationを入れたら動かなくなりました。
ページをロードした後1回目にvalidationに引っかからないようにフォーム送信すると成功するのですが、一度validationに引っ掛けてもう一度フォームを送信しようとすると、自動的にページがリロードされてしまうのです。``e.preventDefault()``を効かせているのにも関わらず。
pデバッグで頑張ってみたところ、1回送信ボタンを押すと、そこに関連付けた関数が消えているとしか思えない挙動をするのです。

# 何が起きていたのか
さて、もうお分かりですね。
そう、送信ボタンに``.once``のイベント修飾子を付けていたのでした……。
多重クリック防止策だと思って便利だなー、とか思いながら付けていたのですが、これは1回``v-on``が起動した後、そこに関連付けられた関数を削除してしまうのです。
参考：[[Vue.js] フォームの多重送信を防止する](https://qiita.com/ryo511/items/2563bb61b4b4d1be9619#no_good-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E4%BF%AE%E9%A3%BE%E5%AD%90-once)
思った通りの原因でしたが、思ってもなかった原因でした。
validationは問題なかったようです。

# 私が思っていた多重クリック防止策
ちなみに、私が実現したかった多重クリック防止策は[こちらの記事](http://www.sky-limit-future.com/entry/vue_disabled_btn)で実現できました。多謝。
springのバージョンによってUriComponentsBuilderが"+"をエンコードしない

# 現象

以下のようなコードでクエリパラメータをエンコードしたい、とする。

```java
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("key", "a+b");
String u = UriComponentsBuilder.fromHttpUrl("http://www.google.com").queryParams(params).build().encode().toString();

System.out.println(u);
```

上記コードの結果は、以下表のように、spring-webのバージョンによって異なる。

|spring-webのバージョン|結果|
|:-----------------|:------------------|
|spring-boot1(spring-web-4.3.18.RELEASE)|<code>http://www.google.com?key=a%2Bb</code>|
|spring-boot2(spring-web-5.0.4.RELEASE)|<code>http://www.google.com?key=a+b</code>|

新しい5.0では"+"がエンコードされなくなっている。

# 原因
https://stackoverflow.com/questions/50432395/whats-the-proper-way-to-escape-url-variables-with-springs-resttemplate-when-ca あたりに書いてあるが、クエリパラメータのエンコードの実装がRFC 3986ベースに変わったから、とかなんとか。

実装を確認する。HierarchicalUriComponentsというクラスが実際にエンコードを担当しており、その内部にエンコード対象かどうかを判定する箇所がある。

4.3ではこうなっている。

```java
		QUERY_PARAM {
			@Override
			public boolean isAllowed(int c) {
				if ('=' == c || '+' == c || '&' == c) {
					return false;
				}
				else {
					return isPchar(c) || '/' == c || '?' == c;
				}
			}
		},
```

5.0ではこうなっており、"+"が外れているのが分かる。

```java
		QUERY_PARAM {
			@Override
			public boolean isAllowed(int c) {
				if ('=' == c || '&' == c) {
					return false;
				}
				else {
					return isPchar(c) || '/' == c || '?' == c;
				}
			}
		},
```
[Python + tkinter] LabelFrameウィジェットを使った入れ子構造

初めての投稿です（そして最後になるかもしれない）
Python + tkinter でGUIアプリをコーディングしているときにハマりました。
参考書も読まず進めていて、おそらく超スーパー初歩な話なのですが、せっかくなので残しておこうと思います。

![piture01.png](https://qiita-image-store.s3.amazonaws.com/0/277337/d7a8c569-84ce-75e7-0e6e-c81ee05eff05.png)


上図のように、LabelFrameを入れ子にして上1段、下2段にwidgetを配置したく、下記のようにすると、表示が崩れて困りました。
※記事ではフレーム名をウィンドウの見た目に示すためLabelFrameにしていますが、Frameでも同様です。編集リクエストをくださった方、ありがとうございました。

```wrong.py
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

frame1 = ttk.LabelFrame(root,text="FRAME1").grid(row=0,column=0)

label1 = ttk.Label(frame1,text="text1").grid(row=0,column=0)

frame2 = ttk.LabelFrame(frame1).grid(row=1,column=0)
entry1 = ttk.Entry(frame2).grid(row=0,column=0)
button1 = ttk.Button(frame2, text="BUTTON1").grid(row=0,column=1)

root.mainloop()
```
![piture02.png](https://qiita-image-store.s3.amazonaws.com/0/277337/48c9c639-d0c9-fdfd-ecdb-bc7b9f71bb86.png)
こんなかんじ

いろいろ調べてなんとなく学習したのですが、入れ子にするfLabelFrameを、順番に閉じてやらないといけないようで、つまりそれぞれ内包するwidgetを配置したあとで、gridなりpackなりするんですね。
そうなっていないソースも散見されるのですが、特に入れ子にする場合は、自分の環境では(?)うまくいきませんでした。

```correct.py
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

frame1 = ttk.LabelFrame(root,text="FRAME1")

label1 = ttk.Label(frame1,text="text1").grid(row=0,column=0)

frame2 = ttk.LabelFrame(frame1,text="FRAME2")
entry1 = ttk.Entry(frame2).grid(row=0,column=0)
button1 = ttk.Button(frame2, text="BUTTON1").grid(row=0,column=1)

frame2.grid(row=1,column=0)		#frame2を配置(綴じる)
frame1.grid(row=0,column=0)		#frame1を配置(綴じる)

root.mainloop()
```

私のようにスーパー初歩な方の参考になれば。
Lubuntu 18.04のVirtualBoxへのインストール

　Macをメインで使っていますが、ちょっと何かを試してみたい時には、いつもVirtualBox上のLubuntuを使っていました。18.04 LTSがリリースされたのでVirtualBoxへインストールしてみたのですが、起動すると以下のような画面になってしまいます。
![スクリーンショット 2018-07-31 20.20.04.png](https://qiita-image-store.s3.amazonaws.com/0/231981/421f4f39-99a4-6207-b6a1-00aa7b1f7513.png)
　まだ、リリースされたばかりだからなのかと思っていたのですが、18.04.1がリリースされたので試してみても同じ結果になります。
　んー、これはちゃんと調べて対策しないと、いつまで経っても16.04のままになってしまうと思い、ちょっと調べてみました。見つかった対策としては、インストーラを起動して言語選択した後で"F6"を押して"nomodeset"を起動オプションに指定することでインストールができるようになるとのことです。
![スクリーンショット 2018-07-31 20.23.29.png](https://qiita-image-store.s3.amazonaws.com/0/231981/2c329a82-3204-28b5-c4f1-bf40bf9d4aa8.png)
　これで無事にインストールは完了し、Lubuntuを起動できるようになります。ただ、Virtual Box Guest Additionsをインストールしても、解像度が1024x768の固定になってしまいます。これは単にgrubの設定に"nomodeset"が残っているためです。なので、/etc/default/grubをvi等で開き、以下の行をコメントアウトします。

```bash:/etc/default/grub
GRUB_CMDLINE_LINUX=“nomodeset”
```

　その後、grubの設定を更新します。

```bash
$ sudo update-grub
```

　再起動すれば、ウィンドウサイズに合わせて解像度も変更されるようになります。
Kotlinまとめ - 文法詳解 - ジェネリクス

# ジェネリクスの導入
* リストやセットのようにオブジェクトのコンテナを例に考える

## Any型コンテナ
* Any型の引数にすれば何でも受け取れるようになる
* ⇔毎回ダウンキャストが必要になる

```Kotlin:Any型コンテナ
class Container(var value: Any)

val intContainer = Container(123)
println(intContainer.value as Int)
val strContainer = Container("Hello")
println(strContainer.value as String)
```

## 特化型コンテナ
* 型の安全性は担保できるようになった
* ⇔すべての型に対応しようとしたらキリがない

```Kotlin:特化型コンテナ
class IntContainer(var value: Int)
class StrContainer(var value: String)
    .
    .
    .
```

## ジェネリクスコンテナ
* 型パラメータを受け取る
    * 型引数と呼ぶ
* Intで初期化した場合はvalueの型はIntになり、Stringで初期化した場合はStringになる
    * **キャストする必要がなくなる**

```Kotlin:ジェネリクスコンテナ
class Container<T>(var value: T)

val intContainer = Container(123)
println(intContainer.value)
val strContainer = Container("Hello")
println(strContainer.value)
```

# ジェネリック関数
関数や、メソッド、プロパティも型パラメータを受け取ることができる

```Kotlin
fun <T> box(value: T): Container<T> = Container(value)
val <T> T.string: String
    get() = toString()

val container = box(5)
println(container.string)
```

Swiftはメソッド名の後ろに型パラメータを書くので順番が違う

# ジェネリック制約
* 型パラメータで受け取る型に制限をかけることが可能。
* `:`以降に指定した型のサブタイプにする必要がある

```Kotlin
interface Hoge
interface Fuga
class Foo<T>
class Bar<T: Hoge>

Foo<Hoge>() // OK
Foo<Fuga>() // OK

Bar<Hoge>() // OK
Bar<Fuga>() // NG
```

# ここから難しいので、あとで復習する
## 変位指定

## スター投影

## 具象型

---

[← 文法詳解 - インタフェース](https://qiita.com/hicka04/items/9922c8342ff8a8fcda8a)
メモ：Qiitaのタグ検索インターフェイスが超絶劣化

※2018/08/01追記
　元の見た目に戻ってるっぽい？


--------------------------
※ここから元の記事

適当な記事を開く→タグ検索→新着順2ページ目を表示

![01.png](https://qiita-image-store.s3.amazonaws.com/0/26088/8e9baf7c-e227-eb2b-f5aa-633c9b3a0e34.png)


最初に出てくる記事が新着順2ページ目じゃないとか何考えてるんですかね。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/26088/00f12ead-0dc0-99e2-23ff-76a94f67b0ac.png)

PC版だとさらに余計なものが入ってきて非常にわかりにくい。

せっかくStylus入れてるんだから自分でどうにかしろよという話ではありますが。
ReactUI > Gestalt




IE11での動作時には、'Symbol' is undefinedエラーが表示されるのでpolyfillが必要です。

```
npm install --save-dev @babel/polyfill
```


It should be as simple as including `import "@babel/polyfill"   `  at the top of index.js


[Gestalt Docs Broken for IE11 (Windows 8.1) · Issue #197 · pinterest/gestalt](https://github.com/pinterest/gestalt/issues/197)
kustomize imageTags 機能

kustomizeの紹介はいろいろと素晴らしいものがあるので参照してもらうとして

[KubernetesのYAML管理ツールkustomizeを試してみた](https://qiita.com/ryodocx/items/008fdaf5c68678656749)
[KustomizeでKubernetes YAMLを管理する](https://deeeet.com/writing/2018/07/10/kustomize/)

新機能としてしれっと追加されていたimageTagsを紹介する

`もうメチャわかりやすい`

### 特定のdeploymentのimage tagを書き換えるのではなくて 全ての同じ名前のimage tagを上書きできる

 
[sample repository](https://github.com/Sho2010/kustomize_sample/tree/master/sample3)

# imageTags 機能

~~~
.
├── base
│   ├── api_deployment.yaml
│   └── kustomization.yaml
└── development
    └── kustomization.yaml
~~~

base/kustomization.yaml

~~~yaml
commonLabels:
  app: kustomize-sample

resources:
- api_deployment.yaml
~~~

base/api_deployment.yaml 一部省略


~~~yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 1
    spec:
      containers:
      - name: api
        image: sho2010/sample-api:latest
      - name: fluentd
        image: fluent/fluentd:latest
~~~

- - -

development/kustomization.yaml

~~~yaml
bases:
- ../base

# imageのtagだけピンポイントに書き換える
imageTags:
  - name: sho2010/sample-api
    newTag: awesome_version
  - name: fluent/fluentd
    newTag: v0.12.43
~~~

# 結果

imageのtagだけピンポイントに書き換わる

`$ kustomize diff development`

~~~diff
diff -u -N /var/folders/jp/ggx75n896sdc48n9rwjcmhjr0000gp/T/noop-016709509/extensions_v1beta1_Deployment_api.yaml /var/folders/jp/ggx75n896sdc48n9rwjcmhjr0000gp/T/transformed-739983166/extensions_v1beta1_Deployment_api.yaml
--- /var/folders/jp/ggx75n896sdc48n9rwjcmhjr0000gp/T/noop-016709509/extensions_v1beta1_Deployment_api.yaml      2018-07-31 18:59:34.000000000 +0900
+++ /var/folders/jp/ggx75n896sdc48n9rwjcmhjr0000gp/T/transformed-739983166/extensions_v1beta1_Deployment_api.yaml       2018-07-31 18:59:34.000000000 +0900
@@ -21,9 +21,9 @@
         - sh
         - -c
         - bundle exec rails server
-        image: sho2010/sample-api:latest
+        image: sho2010/sample-api:awesome_version
         name: api
         ports:
         - containerPort: 50051
-      - image: fluent/fluentd:latest
+      - image: fluent/fluentd:v0.12.43
         name: fluentd
~~~

これの何がいいかと言うと `fluentd` や`envoy`, `nginx`などのimage versionをどこにsidecarが付いてるか知らなくても一括で更新できるということです　よかったですね。
tempfile をcopyを使わずに外に持っていく方法


# `tempfile` が巨大な場合、`FileUtils.cp` のコストが高い

たまによくあるこんなコード

```.rb
require 'tempfile'
require 'fileutils'

Tempfile.create('hoge') do |tempfile|
  # ...
  # 処理が成功した場合は、result_file に tempfile の中身を入れたい
  FileUtils.cp(result_file, tempfile) if success?
end
```

# 解決案

`FileUtils.ln` を使えばコストは　copy より軽くなる

- ハードリンクなので、`Tempfile.create` ブロック終了時に `tempfile` が unlink されても `result_file` は削除されない

```.rb
require 'tempfile'
require 'fileutils'

Tempfile.create('hoge') do |tempfile|
  # ...
  # 処理が成功した場合は、result_file に tempfile の中身を入れたい
  FileUtils.ln(result_file, tempfile) if success?
end
```

[こういう場合のためのメソッドが欲しいというrubyのissueがあった](https://bugs.ruby-lang.org/issues/4592)けど、進捗はない様子
Vue.jsで配列のリアクティブに苦労した

はまったなあと思って調べると他にも苦労している人はたくさんいましたね:innocent:

### これは動かない

```
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
html,body,h1,h3 { margin: 0; padding: 0; }
</style>
</head>
<body>
    <div id="app">
        <h1>配列</h1>
        <div>
            <button @click="visibleArray[0] = !visibleArray[0]">A表示切替</button>
            <h3 v-show="visibleArray[0]">A</h3>
        </div>
        <div>
            <button @click="visibleArray[1] = !visibleArray[1]">B表示切替</button>
            <h3 v-show="visibleArray[1]">B</h3>
        </div>
    </div>
<script src="https://npmcdn.com/vue/dist/vue.min.js"></script>
<script>
new Vue({
    el: '#app',
    data: {
        visibleArray: [true, false],
    },
});
</script>
</body>
</html>
```

単純に配列の要素を更新しただけではVue.jsは気付いてくれない。鈍い。
そこで`splice()`を使う。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

### splice()

```
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
html,body,h1,h3 { margin: 0; padding: 0; }
</style>
</head>
<body>
    <div id="app">
        <h1>配列</h1>
        <div>
            <button @click="visibleArray.splice(0,1,!visibleArray[0])">A表示切替</button>
            <h3 v-show="visibleArray[0]">A</h3>
        </div>
        <div>
            <button @click="visibleArray.splice(1,1,!visibleArray[1])">B表示切替</button>
            <h3 v-show="visibleArray[1]">B</h3>
        </div>
    </div>
<script src="https://npmcdn.com/vue/dist/vue.min.js"></script>
<script>
new Vue({
    el: '#app',
    data: {
        visibleArray: [true, false],
    },
});
</script>
</body>
</html>
```

冗長になるが仕方ない。

### いっそオブジェクトで

```
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
html,body,h1,h3 { margin: 0; padding: 0; }
</style>
</head>
<body>
    <div id="app">
        <h1>オブジェクト</h1>
        <div>
            <button @click="visibleObject[0] = !visibleObject[0]">A表示切替</button>
            <h3 v-show="visibleObject[0]">A</h3>
        </div>
        <div>
            <button @click="visibleObject[1] = !visibleObject[1]">B表示切替</button>
            <h3 v-show="visibleObject[1]">B</h3>
        </div>
    </div>
<script src="https://npmcdn.com/vue/dist/vue.min.js"></script>
<script>
new Vue({
    el: '#app',
    data: {
        visibleObject: { 0: true, 1: false },
    },
});
</script>
</body>
</html>
```

これはこれでもにゃる:innocent::innocent::innocent::innocent::innocent:
mariadbのupgrade

5.xから10.xに更新したところeventが追加できないなど
エラーが発生したので調べたところ、mysql_upgradeをしてないといけないらしい。

念のためDBを退避
`# mysqldump -u USER -p -B DBNME > OUT_FILE`

upgrade実行
`# mysql_upgrade -p`
Kotlinまとめ - 文法詳解 - インタフェース

# インタフェースの定義と実装
* 実装するオブジェクトの協会におけるプロトコル(規約、取り決め)を表現するもの
* インタフェースのメンバは基本抽象メンバ(`abstruct`を書かないのが普通)
    * 直接インスタンス化できない

```Kotlin
interface Greeter {
    val language: String
    fun sayHello(target: String)
}

class EnglishGreeter: Greeter {
    override val language: String = "English"
    override fun sayHello(target: String) {
        println("Hello, $target")
    }
}
```

* 抽象クラスとの違い
    * インタフェースにはコンストラクタがない
    * 継承可能なクラスは1つ。準拠可能なインタフェースは1つ以上  
      複数のインタフェースを実装する場合はカンマで区切る

# デフォルト実装とコンフリクト回避
* ①インタフェースは複数実装できるが、同名のメンバをもつ別々のインタフェースを実装しようとする
    * →問題なし

```Kotlin:①
interface Foo {
    fun execute()
}

interface Bar {
    fun execute()
}

class FooBar: Foo, Bar {
    override fun execute() {
        println("FooBar")
    }
}
```

* ②同一のメンバをもつクラスとインタフェースをそれぞれ実装しようとする
    * →問題なし。スーパークラスに実装があるので、サブクラスでの実装は任意

```Kotlin:②
interface Foo {
    fun execute()
}

open class SuperClass {
    open fun execute() {
        println("SuperClass")
    }
}

class FooSubClass: SuperClass(), Foo {}
```

* ③実装がある同一のメンバをもつインタフェースをそれぞれ実装しようとする
    * →デフォルトの実装があるがオーバーライドする必要がある

```Kotlin:③
interface Foo {
    fun execute() {
        println("Foo")
    }
}

interface Bar {
    fun execute() {
        println("Bar")
    }
}

class FooBar: Foo, Bar {
    override fun execute() {
        super<Foo>.execute()
    }
}
```

* さらっと出てきたがインタフェースは実装を持つことができる
    * メソッド
    * バッキングフィールドを持たないプロパティ

# インタフェースの継承
継承元のメンバを受け継ぐ

```Kotlin
interface Foo {
    fun aaa()
    fun bbb()
}

interface Bar: Foo {
    override fun aaa() {}
    fun ccc()
}

class Baz: Bar {
    override fun bbb() {}
    override fun ccc() {}
}
```

# デリゲーション
* オーバーライドしていないメンバは、デリゲーションによって受け取ったものと同じ処理をする  
  という処理が書ける
* 正直使い所が難しい。  
  移譲することによって影響範囲が大きくなりやすくなりそうでメンテナンスしづらそうなイメージが湧いた

```Kotlin
interface Greeter {
    fun sayHello(target: String)
    fun sayHello()
}

class JapaneseGreeter: Greeter {

    override fun sayHello() {
        this.sayHello("匿名さん")
    }
    
    override fun sayHello(target: String) {
        println("こんにちは、$target!")
    }
}

// sayHello()を実装していないが、デフォルトの動作はコンストラクタで受け取ったgreeterの処理を実行する
class GreeterWithRecording(private val greeter: Greeter): Greeter by greeter {
    
    private val _targets: MutableSet<String> = mutableSetOf()
    val targets: Set<String>
        get() = _targets

    override fun sayHello(target: String) {
        _targets += target
        greeter.sayHello(target)
    }
}

val japanese = JapaneseGreeter()
val greeter = GreeterWithRecording(japanese)
greeter.sayHello()       // こんにちは、匿名さん!
greeter.sayHello("移譲")  // こんにちは、移譲さん!
println(greeter.targets) // [移譲]
```

---

[← 文法詳解 - 継承と抽象クラス](https://qiita.com/hicka04/items/e00a9d9896f7017a932b) || [文法詳解 - ジェネリクス →](https://qiita.com/hicka04/items/d5882e99d4254b25cae4)
iOS メモリについて

#はじめに
Apple Documentの「メモリ効率の向上に 関するガイドライン」を少しづつまとめて見ようと思いこの記事を書きました。
認識間違いなどありましたら、教えていただけると嬉しいです。

#序章 仮想メモリについて
仮想メモリはOSXとiOSとも、4GBあります。
仮想メモリは、物理的なRAMの容量に制限されることなく、オペレーティングシステムが稼働するための仕組みで、仮想アドレス空間を各プロセスに割り当てて、割り当てられた空間を一定の大きさ(4KB)に分割して管理します。この分割された空間を**ページ**と言います。

プロセッサ（CPU?）とメモリ管理ユニット（システム？　以降MMU）はページ表を管理し、プログラムの仮想アドレス空間上のページをメインメモリのアドレスに対応づけます。

そして、僕たちが買いたコードがメモリ上にあるアドレスにアクセスしようとすると、MMUはページ表を参照して、仮想アドレスを物理アドレスに変換します。

#iOSのメモリ管理について

iOSはメモリが枯渇しそうになると、ディスク上に存在し書き換えることのないデータ（コードページなど）は、単純にメモリから消去し、必要になった時点で再び読み込むようになっています。
それでもメモリ領域が足りない場合は、システムがアプリケーションにその旨を通知し、メモリを解放して空きを確保するよう要求します。`applicationDidReceiveMemoryWarning`とかね
この要求に応じられなかった場合、アプリ自体を停止してしまいます。

おまけ
OSXの場合はメモリが枯渇しそうになると、ハードディスクに使用しないデータを保持させます。そのためのハードディスク上の領域をバッキングストアと呼びます。OSXにしかこの機能は備わっていません。

#アドレスがメインメモリになかった場合
アクセスしようとしたアドレスがメインメモリに無く、ハードディスクに存在する場合は、**ページフォールト**という割り込み処理が発生し、**ページング**と呼ばれる処理が行われます。

ページングは仮想メモリシステムは専用のハンドラを起動し、実行中のコードを停止して、メインメモリの空きページを見つけた後に、必要なデータを含むページをハードディスクから読み込み、ページ表を更新してから処理を再開します。

**注意**
頻繁にページフォールトが発生すると、ページの読み書きも頻繁に起きるので、実行中のコードよりも時間がかかります。これを**ディスクラッシング**と呼びます。

#メモリ領域が無い場合のiOSの挙動
もしメインメモリ上に空きページがない場合は他の使用しないページを解放して、新しいページ用の空間を確保しないといけません。
iOSにはバッキングストアの機能がないので、メインメモリから使わないメモリを退避する（これを**ページアウト**と呼びます。）ことができません。

しかし読み込み専用のページは、必要に応じてハードディスクから物理メモリにページを移動する（これをページインと呼びます）ことはできます。
AppCenterでCrashを表示するためのSymbolが足りないと言われた

# 概要
AppCenterでiOSアプリのクラッシュログをいい感じに見たいなと思ったけど中々クラッシュログのポータルが表示されずハマってしまったのでメモしておきます。

# 原因
Symbolが不足していました。
クラッシュログをAppCenter上で見るためにはSymbolをアップロードしなければいけません。
不足なくアップロードする必要があるらしいのですが何が不足しているのか分からなかったのでかなり時間を取られてしまいました。

# 解決法
以下のコマンドで不足しているSymbolを勝手にアップロードしてくれます。

```bash
appcenter crashes upload-missing-symbols -a {アプリ名}
```

アプリ名のリストは以下のコマンドで取得することができます。

```bash
appcenter apps list
```
python3でボタンのクリックイベントを使う

python3でボタンを使ってみる。

```python
#モジュールのインポート
from ipywidgets import widgets
from IPython.display import display

#文字列の定義
x = "ボタン1"
y = "ボタン2"
click = "をクリックしました。"

#ボタンを作成("description"に、ボタンに表示する文字列を代入。)
button1 = widgets.Button(description = x)
button2 = widgets.Button(description = y)

#クリックイベントを定義
def click1():
    print(x + click)
def click2():
    print(y + click)

#ボタンにクリックイベントを実装
button1.on_click(click1)
button2.on_click(click2)

#ボタンを表示
display(button1)
display(button2)
```
LINEのOGP画像のキャッシュクリアで手こずったのでメモ

facebook、twitterはOGPのキャッシュクリアをするツールがありますが
LINEはツールがないようで、しかもすぐには反映がされなかったのでメモしてみました。

# 1）画像を修正、差し替え
画像サイズや記述は正しくできている前提になります。

# 2）facebookデバッガーでOGPのキャッシュをクリア
https://developers.facebook.com/tools/debug/sharing/
念のため以下ページの「POSTによるfacebookOGP最強クリアフォーム」も行いました。
http://www.kagua.biz/fb/cacheclear.html

# 3）翌日以降に反映を確認
OGPのキャッシュクリアについての問い合わせをした人の情報
http://w3q.jp/q/4465
上のページでは2週間または1〜2日で反映というLINEからの回答になっていましたが
今回は画像の更新のみで20時間程度で反映を確認できました。


# 4）修正の確認方法

**●別の端末にしても確認はできない**
投稿済みURLの場合はlineのサーバにキャッシュされているため
別の端末、別のアカウントで確認しても修正は確認できませんでした。

**●URLを変更すればすぐに確認できる**
URLを変更した場合は別の投稿とみなされるのですぐに修正が反映されました。
今回、URLは維持したかったので修正確認だけ別URLを作って確認しました。
（例：123.htmlを123a.htmlに）

また適切な方法かわかりませんが簡易的に修正が反映されているか調べるのには
LINEへ投稿するURLの末尾に?を付ける方法で確認も便利でした。
?が付くことで別URLと認識されて修正が反映された投稿を確認できます。
修正したファイルの記述にミスがないことが分かって
キャッシュがクリアされるのを待つ間の安心感は増しました。
（例：123.html?でLINEに投稿）

スマホなら投稿したいURLをコピペで末尾に?追加で投稿。
PC版はline.meの画面のURLをコピペで末尾に?追加。
（例：https://social-plugins.line.me/lineit/share?url=あなたのURL/123.html?）


#5）今後の対処
一度投稿されてしまうとキャッシュクリアまで時間がかかるので
今後、LINEシェア確認を最初に行う場合はPC版で行うことにしました。
PC版の場合は投稿前の画面でOGPとテキストの表示が確認できて
ここまでの表示であればキャッシュが残ることはありませんでした。


###参考ページ
http://www.kagua.biz/fb/cacheclear.html
Pythonでクローリングをするのに必要な関数

クローリングとスクレイピングに必要なものを中心、Pythonの基本的な話のまとめ

.pyファイルでやるなら
'三つ、もしくは"三つで囲むと まとめてコメント扱いになる
\#は、その行だけコメント扱いにしてくれる

ちなみにPython3

#Print関数

```python
print('Hello World')
print(1)
'''
printの後は()
'''
```

# データの型(単体)　
Pythonのデータ(object)に対して、何かの処理をしたい場合
元々そのオブジェクトに備え付けてあるmethodを使う方法と
関数にそのデータを渡す方法がある
例えばAというデータに対して
A.~~
function(A)
これは前提

      
## 文字列　string
```python
print('Hello\nWorld')

tmp = 'Hello World'
tmp.split(' ') #文字列の分解はsplit
tmp.split('o')
tmp + '!!' #結合は + でつなげるだけ
tmp[0] #何番目の文字という取り出し方もできる
tmp.find('ll') #文字列の中に指定した文字があるか確認できる
tmp.find('x') #ない文字を探すと-1が返ってくる
```
## 数値　 int double たぶん説明いらないので省略

```python
1
1.3
```

##　日付型　datetime
```python
from datetime import datetime as dt #このimportが必要
tstr = '2017-12-29 13:49:37'
tdatetime = dt.strptime(tstr, '%Y-%m-%d %H:%M:%S')　# 文字列を変換できる
tdatetime 
str(tdatetime)#逆に、日付を文字列に直したい場合はこれ
tdatetime.day #　ちなみにこんなこともできる
tdatetime.month
tdatetime.year
dt.now() #これで現在時刻がだせる
str(1031) + 'くっつける' + str(tdatetime) 
```

ここまでの3つの型は、全部str()で囲むことで、文字列に変換でき、+でくっつけることができる
   
## ブール
```python
True
False
'''
上の二つだけの型
条件分岐などで使える
'''
```

# データの型(複体)

## リスト 配列ともいう
```python
tmp_list = [7, 'aa', False] #中身はなんでもいれられる
tmp_list[0] #0から始まって、指定した番号のものを返してくれる
tmp_list.append(12) #appendでデータの追加ができる
tmp_list
del tmp_list[1] #delで要素の削除も行える
tmp_list
```

###Dataframe　これはpandasが必要 
```python
import pandas as pd
URLlist = pd.read_csv('URLlist.csv')
URLlist
'''
csvの読み込み方法はほかにもいろいろあるが、これが一番楽だし、読み込んだデータを使いやすいと思う
csv読み込むときは、文字コードの問題とか結構面倒で、引っかかることが多いので注意
基本的にはcsvの文字コードをutf-8、区切りがカンマ(,)で保存すること
'''
URLlist.ix[0,0]#ixで指定すると、特定の要素を抜き出す
URLlist[[0]]#二つのカッコで挟むと、列をリストとして抜き出せる　
URLlist.iloc[0]#ilocで指定すると、特定の行をリストとして抜き出せる
```
# for文
```python
words = ['Japanese', 'English', 'French']
for w in words:
    print (w)
'''
for文そのものは知っていると思うのでPythonでfor文を各書き方だけ説明

for 変数 in オブジェクト:
    実行する処理
    
変数の後ろに「in」が付くことと、オブジェクトの後ろに「:」が付くことに注意
'''
for num in range(5):
    print(num)
'''
rangeで数字の連番を使える
'''
for num in range(20):
    print num
    if num == 10
        break
'''
break文はそれ以降の処理にかかわず、for文を終了する
'''
for num in range(2, 10):
    if num % 2 == 0:
        print("偶数", num)
        continue
    print("奇数", num)

'''
coninue文は、for文のそのあとの処理だけスキップして、次にいく
意味は実行すればわかる
''' 
```

# 関数を定義する
```python
def function(arg1, arg2):
    return  arg1 + ' ' + arg2

tmp = function('本日は','晴天なり')
tmp
'''
関数を定義する場合は、def文を使用する。
関数名には、任意の関数名を記述、
引数は、何らかのオブジェクトを渡す時に使用する。
戻り値は、何らかのオブジェクトを返す時に使用する。
'''
def url_print(arg1):
    return arg1[0] + arg1[1] + arg1[2]+ arg1[3]
tmp = url_print(URLlist.iloc[0])
tmp
'''
引数に、リストを渡すことも可能
'''
```


Webdriverとかもほんとは書きたいけど、とりあえずここまで。
Dockerとttyで遊んでみよう

## TTYとは

>TTYとは、キーボードとロール紙プリンターなどから構成され、シリアル回線を通じて大型のホストコンピューターに接続し、ホストコンピューターへ文字を入力したり、あるいはホストコンピューターからの出力を印字したりする装置のことである。
>
>これが転じて‥


[TTYとは - IT用語辞典 Weblio辞書](https://www.weblio.jp/content/TTY) より

## Docker コンテナを走らせる

```
docker run --detach --tty --name=play_with_tty alpine
```

## 手元のコンソールの1個目のウィンドウでDockerコンテナにつなぐ

```
docker exec --interactive --tty play_with_tty /bin/ash
```

ttyを確認

```
/ # tty
/dev/pts/1
```

## 手元のコンソールの2個目のウィンドウでDockerコンテナにつなぐ

二窓せよ二窓。

```
docker exec --interactive --tty play_with_tty /bin/ash
```

ttyを確認

さきほどとは別のものが割り振られているのが分かる

```
/ # tty
/dev/pts/2
```

2個目から1個目に文字を送ってみよう。

```
echo Hello > /dev/pts/1
```

## 何が起こる？

1個目のウィンドウに `Hello` が現れる。

```
/ # tty
/dev/pts/1
/ # Hello
```

## 何故？

仮想端末や標準入出力端末のことは、まだぼんやりとしか分かっていない。はっきりと分かったらまた記事にする。

## 環境

- Docker version 18.06.0-ce, build 0ffa825

## Gist

- [Play with "tty" featuring docker container](https://gist.github.com/YumaInaura/0f21f8a6a191aacc467f4b3b07691236)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
リモートワークでの心構え

2017年2月に[株式会社アイエンター](https://www.i-enter.co.jp/)で在宅勤務制度が始まり、それと同時に入社。
フルリモートで働き始めて1年半が経過しました。
その間、会社に行ったのは入社初日を含めても3日だけ。
（社員旅行とか忘年会等も参加しているので、実際に顔を合わせてる機会はもう少しある）
日々業務を行っていくなかで気付いた事、感じた事を私の心構えとしてまとめてみました。
##■家と仕事の境界線を明確にしよう
一部屋を仕事部屋として利用できれば理想的。
できない場合は仕事専用の机を作って仕事が終わったら、そこから離れる。
仕事がプライベートの空間を侵食するとオンとオフの切り替えが下手になってしまう。
##■着替えましょう
Skype等で打ち合わせすることがなくても、自宅だからといってパジャマのまま仕事をしない。
あくまでも仕事中という気持ちの切り替えも必要。
##■会社から貸し出されたパソコンは、仕事以外で使わない
家族がプライベートで使うことは絶対しないようにする。
どこでどう情報が漏れてしまうか分からないということを意識しておく。
##■余裕を持ったスケジュールをたてることを意識する
コミュニケーションのタイムラグがどうしても発生してしまう。
オフィスで横に居たら30秒で終わる話もSkypeやTeamsで文字で伝えるとなると数分～数時間かかったりする。
納期のあるものは納期ギリギリに提出するのではなく、少し早めに終わらせるようなスケジューリングするようにする。
自分で自分の仕事のマネジメントを行っているという気持ちを持つことが大事。
##■一緒に働いている人たちと積極的にコミュニケーションをとる
家にいても会社と同じように仕事ができると信用してもらってることを忘れない。
連絡が取れないとか、何をやっているのか分からない…と思われないように、
自分の状況を常に先回りして仕事仲間や同僚に知らせるように意識する。
仕事は人と人との繋がりで成り立っているので、人とのつながりが希薄になってしまわないように
自分から発信したり、アピールすることが大切。
例えば、コミュニケーションツールやちょっとしたミーティングの時に雑談することは悪いことじゃない。
お互いの日常生活が見えてくると、相手をより身近に感じることができます。
##■まとめ
家でも会社でも働くということに変わりはなく、難しく考えすぎないようにすること
仕事を楽しむ、プライベートを楽しむ、なんでも楽しめる時間を
しっかり取れるのがリモートワークのメリットだと思う。
難しく考えない。<strong>Let`s Enjoy!!!</strong>
iOS11の「低電力モード」で、HTML5 videoのautoplayが動作しない

# tl;dr;

<img width="320" alt="Image uploaded from iOS.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54305/606b0d3e-7f6b-f3b2-c1a9-969a43815140.jpeg">

<img width="375" alt="Image from iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/54305/2f614b33-c234-f310-759a-bf832b8c51a4.png">


# 詳細
iOS 11 (11.2以降？)から、
「低電力モード」使用時に、HTML5のvideoが自動で再生されなくなりました。
手元の環境で確認したところ、Safari, Chrome, Firefoxなど、主要なブラウザすべてでそのような挙動のようです。

いろんなApple公式のドキュメントを眺めてみたんですが、該当する情報は見つからず、
↓のstackoverflowの記事しか見つかりませんでした。
https://stackoverflow.com/questions/47655077/autoplay-muted-video-ios-11-2?rq=1

# 対策

autoplayさせることができないため、 **ユーザー自身に再生ボタンを押して貰う必要があります**。
ビデオの上に他のUIが乗っていてユーザーが再生ボタンが押せない！！なんてことがないように
画面を設計しましょう。


# 付録

検証コード
https://jsfiddle.net/vneL2w03/

```html
<!DOCTYPE html>
<html>
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link href="http://vjs.zencdn.net/7.1/video-js.min.css" rel="stylesheet">
    <script src="https://vjs.zencdn.net/7.1.0/video.js"></script>
  </head>
  <body>
    <video id="test-video" class="video-js vjs-default-skin vjs-16-9" muted controls playsinline crossorigin="anonymous">
      <source src="https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8" type='application/vnd.apple.mpegurl' />
    </video>
    <script>
      var main = function(){
        player = videojs("test-video");
        player.on(player, 'loadstart', function(){player.autoplay('any');});
      }
      main();
    </script>
  </body>
</html>

```
どこでもカラーミーでスペック情報は残しつつ商品説明文だけ非表示にする方法

カラーミーにはカート機能を使ってサイトやブログ内にカートを設置できる機能があります。

どこでもカラーミー - カラーミーショップ ネットショップ運営サービス https://shop-pro.jp/func/cartjs/

どの項目を表示・非表示にするかは設定時に選択できるのですが、細かい調整はCSSで設定する必要があります。
今回、商品説明文章がひたすらに長かかったため説明文を非表示にしたかったのですが、スペックは表示したいという要望があがりました。

CSSだけではなくJavaScriptで非表示する必要があったためメモがてら残しておきます。

# 生成されるHTMLを確認する

カート機能のJSから生成されるHTMLを確認してみると、「cartjs_product_explain」という名前のclassがついたdivタグが生成され、そのなかにスペックと商品説明文章がはいっています。

```
<div class="cartjs_product_explain">
 <div class="spec">
  <p>スペック情報1</p>
  <p>スペック情報2</p>
  スペック情報3
 </div>
 ここに商品説明文章がはいります。（←こいつを消したい！）
</div>
```
商品説明文章とスペック情報が一緒になっています。切り離して表示したいのですが、スペックだけにclass名が付与されていて、商品説明文章にはありません。
`.cartjs_product_explain`を`display: none;`にしてしまうと`.spec`も非表示になってしまうため、困ります。

# JavaScriptでHTMLを操作する

ということで、JavaScriptでHTMLを操作しましょう。

```
$(function() {
	$('.cartjs_product_explain').each(function(){
		var explain = $(this).find('.spec').html();
		$(this).html('<div class="spec">' + explain + '</div>');
	})
});
```

やっていることは、

- 各`.cartjs_product_explain`に対して実行（複数OK）
- `.spec`のhtml要素を変数`explain`に格納
- `div.spec`で囲んだ変数`explain`の内容で各`.cartjs_product_explain`を上書き

というようなことです。

上記のJavaScriptを該当するページから読み込むか、HTML内に記述します。
これで商品説明が消えて、スペック情報だけ表示するようになりました！

## 注意

読み込み後に実行するため、一瞬説明文章が見えてしまいます。ファーストビューじゃなければ大丈夫なんですが、
一瞬見えるカクツキが嫌だと言う場合はローディング画像を表示するなどして対応しましょう。

参考： jQueryでできる簡易ローディング画面の実装方法 | フロントエンド | kigiroku https://kigiroku.com/frontend/loder.html
SharePointカスタムリストの集計値はflowの検索クエリに使えません！

# 今回の投稿背景
開始と終了の日付カラムがあって、その中間の日になったら
対象のレコードのIDを通知するっていう仕組みを作ろうとしてまして
中間の日はSharePointの集計値で作成したので、それをフィルタークエリとして
使おうと思ったのです。

# カスタムリストの構造
|カラム名|列の種類|内容|
|:-----------------:|:------------------:|:------------------:|
|オーダー番号|1行テキスト|XXXX-XX-XXX|
|開始日|日付と時刻|yyyy-mm-dd|
|終了日|日付と時刻|yyyy-mm-dd|
|通知日|集計値|開始日+(DATADIF(開始日,終了日,"D")/2)|

# 検索用フロー設計
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/7bdbf6f9-fb37-36be-3f3d-1946bd4985c4.png)

```ruby:式
formatDateTime(utcNow(),'yyyy-MM-dd')
```

# 実行結果
```
{
  "status": 400,
  "message": "種類 'Calculated' のフィールド '通知日' は、クエリのフィルター式には使えません。\r\nclientRequestId: e73bc925-468c-47c1-825f-9beaa3c4ee17\r\nserviceRequestId: 8419809e-404f-6000-3af4-3ad603aaba3f"
}
```

# というわけで・・・
集計値のカラムをクエリのフィルター式としては使えません！
という結果になりました。
おしまい！

# いやいやいやいや！なんとかせぇよ！！！
そりゃそうですよね～
集計値がそのまま使えないというのであれば、集計値と同じ内容のデータを
日付と時刻のカラムに代入してあげればいいですね＾＾

# カスタムリストの構造（修正版）
|カラム名|列の種類|内容|
|:-----------------:|:------------------:|:------------------:|
|オーダー番号|1行テキスト|XXXX-XX-XXX|
|開始日|日付と時刻|yyyy-mm-dd|
|終了日|日付と時刻|yyyy-mm-dd|
|通知日|日付と時刻|yyyy-mm-dd|
|通知日（計算用）|集計値|開始日+(DATADIF(開始日,終了日,"D")/2)|

# 代入用フロー設計
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/e96f953c-a26f-3142-a703-84ec3f299ee8.png)

# 代入結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/8033688e-a8d6-eaa7-6c4b-fed8eef44b91.png)
　　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/87235c9a-fda6-7516-26a8-42bbe7226ae4.png)

# 検索結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/9af1ee38-43d1-17c7-247c-c50dc6d20a4f.png)

# まとめ
・SharePointの集計値を検索クエリとして使いたい場合は、別カラムの別の型として格納するようにする仕掛けを作る必要がある。
・ここではわかりやすいように日本語でカラム名を記載しているが、実際はカラム名を英語で明示しないと検索クエリとして使えない。

# 正直なところ・・・
集計値も検索クエリとして使いたいんですよねぇ(´・ω・`)