OmniAICreator/Qiita-1.07M huggingface dataset:
【slack】slackで見やすくコードを共有する方法とマークダウンっぽくする方法

#【slackで見やすくコードを共有する方法とマークダウンっぽくする方法】

slackで先輩に質問する中で、

###「slackでコード共有する時、シンタックスハイライト使った方が見やすくていいよ」とアドバイスを頂いた。

>シンタックスハイライトとは。
>テキストエディタの機能であり、テキスト中の一部分をその分類ごとに異なる色やフォントで表示するもの。(wikipediaより）

```
1 def show
2 end
```

こういう風に投稿したかったが、これが何という呼び方かがわからなかったので凄く勉強になった!

質問すれば、質問した事以外のことも教わることが出来るから、自分より優秀な人に質問出来る環境で、それを使わないでいることはもったいないとしか思えない。

回答する側に気持ちよく回答して貰えるようにして、これからもどんどん質問しよう。

###【slackで見やすくコードを共有する方法】

1.slackの投稿作成フォーム左側の＋ボタンをクリック
2.コードまたはテキストのスニペットを選択
3.貼り付けるコードのタイトル名を入力(users_controllerとか)
4.コードの言語を選択(色がついて見やすくなる)
5.コードを貼り付ける
6.共有相手を選択
7.メッセージを追加する場合は入力
8.スニペット作成するをクリック

以上でかなり見やすいコードの共有が出来るようになりました！

さらに、マークダウンっぽく投稿本文の強調なども出来ます。
###【マークダウンっぽくする方法】

太字強調 アスタリスク「*　*」で囲む
赤文字グレー背景「`　`」で囲む
引用表現　文頭に「>」をつける

[参考記事]
(https://qiita.com/sheercat/items/186c71af92c9494ab26f)
Re: 10分間隔で 10時〜23時台の配列をつくる

この記事は[Okinawa.rb Advent Calendar 2018](https://qiita.com/advent-calendar/2018/okinawarb)の18日目の記事です。
昨日は @hanachin_ さんの[Ruby 2.6のASCII以外の大文字で定義できる定数を試す](https://qiita.com/hanachin_/items/1db0ddfeeff43b8420dd)でした。
明日は @hanachin_ さんの[凸凹のRSpec平らに均すshared_contextがマジ便利](https://qiita.com/hanachin_/items/fa9133c9441b63039194)です。

## やってみた記事です

[10分間隔で 10時〜23時代の配列をつくる](https://qiita.com/7kaji/items/eb0de110177df06d5e3c)が面白そうだったので書いてみました

## 文字列で10ずつ回して時刻っぽくない部分を弾く

```rb
("10:00".."23:50").step(10).select {|t| t.match?(/:[0-5]0/) }
```

## 数字で10ずつ回して時刻っぽくない部分を弾く

```rb
(1000..2350).step(10).select {|t| t % 100 < 60 }.map(&:to_s).each {|s| s[2,0] = ?: }
```

## 10から23と00から50を組み合わせ

```rb
("10".."23").to_a.product(("00".."50").step(10).to_a).map {|t| t.join(?:) }
```

```rb
("10".."23").flat_map {|h| ("00".."50").step(10).map {|m| "#{h}:#{m}" } }
```

## 時刻のことはTimeにおまかせ

```rb
Time.new(0, 1, 1, 10, 0).then {|t| loop.lazy.map { t.tap { t += 10 * 60 } }.take_while {|t| t <= Time.new(0, 1, 1, 23,
50) }.map {|t| t.strftime("%H:%M") }.to_a }
```
```rb
Enumerator.new {|y| t = Time.new(0, 1, 1, 10, 0); while t <= Time.new(0, 1, 1, 23, 50); y << t.strftime("%H:%M"); t +=10 * 60; end }.to_a
```

## まとめ

- 10進数の繰り返しは`step`がべんり
- 数字も文字列も`step`できる
- `Array#product`は2つの配列を組み合わせることができてべんり
- 24進数と60進数など進数が違うものをネストしてループしてまとめるときは外側で`flat_map`するとべんり
- 時刻を一定間隔で繰り返しするときなど何かしら普段繰り返さないものを繰り返したいときは`Enumerator`や`loop.lazy.map`と`take_while`の組み合わせを使うとべんり
転職初日からモブプログラミングでプロジェクト参加した話

これは [モブプログラミング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mobprogramming) 20日目の記事です。
19日の記事は、[こちら](https://qiita.com/qwertytoki/items/cbc302dab11e0b37b9b4)です。

今日は、転職したその日からモブプログラミングを経験しアウトプットした事例のお話です。

# はじめに
　Advent Calendar 初めて書きます。
なぜ書こうと思ったかは後押しされた理由が２つあります。

1. 知り合いが [17日の記事](https://qiita.com/chihiro/items/c620f9da3ce1df08a34c) を書かれていて背中を押された。
2. [1日の記事](https://takaking22.com/2018/mob-advent/) に下記の記述があり、~~背中を蹴られた~~ さらに後押しされている気がした。
 
> Advent Calendarはやったことあるかないかや、エキスパートであるかどうかに関係なく、この流れに乗ってアウトプットするぜっていう勢いがすべてだと個人的には思っております。せっかくなのでモブで記事を書いてみてはいかがでしょうか（ネタ提供）？

勢いがすべて！！ということで、勢いで書いてみます。


# 概要
* 未経験な技術でも、モブプログラミングでアウトプットができた。
* 他の方の作業を見てプロジェクトの理解が深まった。
* プロジェクトの新規メンバアサイン時にモブプログラミングを導入した。
* そして、モブプログラミングでチームが一緒に楽しく仕事することができている。

# 背景
　転職してとあるプロジェクトに参画することになりました。このプロジェクトでは、 Scrumを採用し2週間のスプリントの途中でした。私と同じタイミングで3名が追加されていました。
　私はプロジェクトで利用する技術はほぼ未経験でした。そして、Scrum やペアプログラミング、モブプログラミングも経験がありませんでした。

# 転職初日
　会社の概要説明などを受けたあと、チームメンバへの紹介やプロジェクトの概要説明が終わり、いざ作業しようとしていました。
　それまでは2名がペアプログラミングでの開発をしていました。私を含め3名が追加され、合計 5名でモブプログラミングがスタートしていきました。

その時の印象はこんな感じです。

メンバーA：『じゃあ、みんなでモブプログラミングやっていきましょう』
　　　 私：『（？モブプログラミング？ペア？ではなく？）』
　　　　　 『モブプログラミングってなんですか？』
メンバーA：『モブプログラミングっていうのは…』
　　　　　　～～～
　　　 私：『（なるほど、みんなで同じ作業を進めるのか。なんだか面白そう。）』
メンバーA：『 では、[Mobster](https://github.com/dillonkearns/mobster) 使って時間区切ってやっていきましょう！じゃあ、Bさんナビ、Cさんドライバーでお願いします。』
　　　　　　～～～
　　　　　　ワイワイガヤガヤ。
　　　　　　～～～
　　　 私：『（でも、みんなが同じ作業だとアウトプット量は…。。。）』
　　　　　 『（！！！今のショートカットどうやってやったんだろう？）』
　　　　　 『すみません、今のどうやってやったんですか？』
メンバーC：『それは、↑↑↓↓←→←→BA です。』
　　　 私：『へぇ、すごい！！』
　　　　　　～～～
メンバーD：『じゃあ @lamatsujun さん、ドライバーです。 』
　　　 私：『は、はい。』
　　　　　　目の前にはキーボードとマウス、大きなディスプレイが立ちはだかる。。。
　　　　　　～～～


と、こんな流れでモブプログラミングでプロジェクトへ参画していきました。
※実際には、もっと丁寧に教えて頂いたかもしれませんが、個人の印象です。


# 私達のやり方とモブプログラミング環境
　チームでのモブプログラミングのルールは下記の通りシンプルです。

- 1ターンは 10分間
- 役割は、ナビ、ドライバー、残りはモバー
    - ターンが終われば役割は順次交代
- 全員の作業が終われば 10分間の休憩

　計画、設計、開発、テスト、ドキュメント作成に至るまで全ての作業で採用しています。開発環境はディスプレイが３つ（55, 49, 27インチ）で十分すぎるほどです。キーボード、マウスは、１つずつでスタートし、だんだん増えていき、現在は 1人に１つずつ（5キーボード、5マウス）あります。そして、チームの周りにホワイトボードがたくさんあり議論のときはすぐにそれを利用します。

　前述の通りプロジェクトでは Scrum を採用し1スプリント2週間で作業しています。新規メンバ3名が追加され、モブプログラミングが始まったわけですが、当然ベロシティは変化していきました。


# ベロシティの変化
　さて、新規メンバ3名が参入しモブプログラミングを始めたチームなのですが、ベロシティがどうなったのか、下記の図をお示しします。

![ベロシティ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/12431/485250bb-a0c6-3647-4c59-bc36d6d18300.png)


　一般的に新規メンバがアサインされれば、教育コストが発生しベロシティは低下します。その後緩やかに上昇していくのが通常だと思います。私達のプロジェクトの場合、結果どうなっかというと…。

![ベロシティ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/12431/856a927c-7e08-d22f-94d9-0ad82ba8186d.png)

　ベロシティはさほど低下せずに、その後のスプリントでは速やかに上昇していきました。そして、2スプリント後には、計画以上のストーリーポイントを消化することができました。これは偏にモブプログラミングのおかげです。複数の異なるスキルを持ち合わせたメンバ同士が、個々のスキルを結集した結果をアウトプットし続けた結果でした。


# おわりに
　モブプログラミングの実績を紹介しました。好き嫌いがあるかもしれませんが、私にはすごく合いました。また、ベロシティを見て頂いた通り、プロジェクト新規メンバへの共有には有用だと感じています。
　個々が持っている経験からの最適な進め方や、効率化の手法などをまとめて知ることができます。議論では異なる考え方や観点を知り視野が広がり、一緒にメンバーの開発や設計に関するスタンスもわかります。もちろんみんなが一緒に作業をするので、協力し、共創する姿勢が大切です。
　いろいろと書きましたが、モブプログラミングで大事なのは楽しく仕事をできていることだと思います。これが、私が合っていると思う最大の理由かもしれません。

(初めて Advent Calendar やってみましたが、やってみるものですね！)


# 21日目は
[モブプログラミング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mobprogramming) 21日目は @huideyeren さん です！
エンジニア+Youtuber=心理的安全性！

# 自分の心理的安全性が確保しやすくなる

## チームに自分の意見が言える

- トークする、話す癖がつくことで自分の意見が言いやすくなる。リアルタイムで素早くかわされるスタンドアップミーティングの最中に、一瞬で意見を言いそこねた！というケースが少なくなる。機会損失の損失。

## 勝手に心理カウンセリング

- スマホに話しかけること、トークすること自体が心理セラピー的効果があると実感。悩み相談でカウンセリングも必要なし。人間と話す必要さえない。人見知りな俺たちにはお似合いの心理療法。

## 勝手に生産性パフォーマンス爆上げ

- 会社の人に「そのマグカップなんですか？」5秒で話しかけたりできるようになって、ほっこりする。「5秒」対「1日中ほっこり」の生産性に対するコストパフォマンスも激しく高いと実感。

# 他の人の心理的安全性が確保しやすくなる

- 心理的安全性の80%は、人に話しかけること、コミュニケーション量が影響している論
- 笑顔が明るくなるので、人からも話しかけやすくなる。たぶん。ところで自分の気分が明るい時は、意識していなくても、ふと会社の人から話しかけられることが多い気がする。(自分の表情は自分だけが知らない理論)
- 気持ちに余裕ができて、他の人を愛情の目線、大げさに言えばマザーテレサ的な慈愛の目線で見られる機会が少しだけアップしてきた気がするぜ。

# links

- [まとめ記事。システムエンジニアがYouTuberになるとどうなる？ - Qiita](https://qiita.com/YumaInaura/items/6ceccac00b0f345e6b42)
- [システムエンジニアがYouTuberになるとどうなる？ - YouTube](https://www.youtube.com/playlist?list=PLxjUtvIGEdvb36LrtfkkLIViMSe8HdeCX)
- [システムエンジニア yumainaura - Google Search](https://www.google.co.jp/search?q=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2yumainaura&oq=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2yumainaura&aqs=chrome..69i57.4084j0j7&sourceid=chrome&ie=UTF-8)

# 「エンジニアリング組織論への招待」を読もう！

(@yumainauraは著者じゃないよ)
 
[心理的安全性ガイドライン（あるいは権威勾配に関する一考察） - Qiita](https://qiita.com/hirokidaichi/items/5d8c4294083d85654a04)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニア+YouTuber=Qiitaの記事タイトルに迷わない！ググラビリティup！SEO対策力が磨かれる！

# 「どうやったらアクセス数、再生数を稼げるかゲーム」を常にプレイ

- GoogleやYoutube検索に引っかかりやすいキーワードを探すようになる
- 「想定読者層」を考えて、相手目線で興味を引くタイトルを考えるようになる
- プレゼン、マーケティング、コピーライティング、マスコミ的全般能力が磨かれる

# でもお前、Qiitaにいいね付いてないじゃん？

- 人生は常に結果よりも挑戦であるぜ！ というエクスキューズ
- 自己学習マックス [エンジニア + YouTuber = 自己学習チャンスが最大化！ + Qiitaにいいねがつかなくなる。 - Qiita](https://qiita.com/YumaInaura/items/87175a1a95aff4b3b3ba)
- 実はQiitaでバズらなくても、Qiita使ってない勢から、Google検索経由で無数のアクセスがあったりすると推測(そうでないと説明しづらいView数の記事がある)

# links

- [まとめ記事。システムエンジニアがYouTuberになるとどうなる？ - Qiita](https://qiita.com/YumaInaura/items/6ceccac00b0f345e6b42)
- [システムエンジニアがYouTuberになるとどうなる？ - YouTube](https://www.youtube.com/playlist?list=PLxjUtvIGEdvb36LrtfkkLIViMSe8HdeCX)
- [システムエンジニア yumainaura - Google Search](https://www.google.co.jp/search?q=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2yumainaura&oq=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2yumainaura&aqs=chrome..69i57.4084j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
まとめ記事。システムエンジニアがYouTuberになるとどうなる？ 

# Youtuber歴3ヶ月 (2018年9月スターツ)

>いなうらゆうまYumaInaura - YouTube
>https://www.youtube.com/channel/UCHkvdHCq77kpu_YFr3yhwRQ 

# 記事ども 随時追記


- [エンジニア + YouTuber = 自己学習チャンスが最大化！ + Qiitaにいいねがつかなくなる。 - Qiita](https://qiita.com/YumaInaura/items/87175a1a95aff4b3b3ba)
- [エンジニア+YouTuber=Qiitaの記事タイトルに迷わない！ググラビリティup！SEO対策力が磨かれる！ - Qiita](https://qiita.com/YumaInaura/items/b5da73cb8a45ec541152)
- [エンジニア+Youtuber=心理的安全性！ - Qiita](https://qiita.com/YumaInaura/items/2a335a8724ddb4e51f79)

- サーバー構成図を動画で描くようになる 
- 音読アウトプット自己学習最大化
- UI/UX感度爆上がりでScrapBoxを愛するようになる
- 「小悪党のコバンザメ商法」でまとめ要約アウトプット学習する

# Youtube Playlist

[システムエンジニアがYouTuberになるとどうなる？ - YouTube](https://www.youtube.com/playlist?list=PLxjUtvIGEdvb36LrtfkkLIViMSe8HdeCX)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cbe7aa67-c2b3-218e-8363-82532612852e.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニア + YouTuber = 自己学習チャンスが最大化！ + Qiitaにいいねがつかなくなる。

# システムエンジニアがYouTuberになるとどうなる？

ふぁいなるあんさー！

# Qiitaの記事がどんどん薄くなる！

- Youtube動画でトークすることで、音声トークの手軽さと爆速さに体が慣れてくる。
- 爆速で理解できない、伝わらないものの全てが面倒くさくなってくる。
- ほぼ要約記事とか三行まとめみたいくなってくる。

# Qiitaにいいねがつかなくなる！

- Qiitaでは手厚い記事が好まれる傾向があるかもしれない。
- でも自己学習のチャンスが爆上がりしているので問題ない。
- Qiitaは人の為ならず、自分のためにある初心者の心を思い出した。ビギナーズマインド！


[システムエンジニアyumainaura - Google Search](https://www.google.co.jp/search?q=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2yumainaura&oq=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2yumainaura&aqs=chrome..69i57.4084j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【rails5】一か月の日付を取得し、月を切り替えする

#【一か月の日付を取得し、月を切り替えする】

現在取り組んでいる課題があり、その中で学んだことをメモにしていきます。

each文で上記の実装を目指していたが詰まったのでメモ。

コントローラーに月初と月末を定義

```
月初
@firstday = Date.today.beginning_of_month
```

```
月末
＠lastday = Date.today.end_of_month
```

定義後、ビュー側で翌月に切り替えても日付が表示されない。

前月に至っては、１１月に切り替えると、１１月１日～１２月３１日まで

１０月に切り替えると、１０月１日～１２月３１日まで

みたいに新しく日付が作成され、思うように切り替えが出来なかった。

それは@lastdayの定義が,
**@lastday = Date.today.end_of_month**になっていたから。

**@lastday = @firstday.end_of_month**に変えると、前月も翌月も表示出来た。

この事象が起こったのは、ビューのeach文で定義している@firstday..@lastdayの範囲が、

修正前の

```
＠lastday = Date.today.end_of_monthだと、
「@firstday～現実時間の月末まで」
```

になるので、遡るごとに現実時間の月末までの日数が増えていき、その間の日付を作成していってしまうから。

修正後の

```
@lastday = @firstday.end_of_monthだと、
「@firstday～@firstdayの月末まで」
```

になり、

**「＠firstdayで定義した月の月末までの日付を作成する」**のでイメージ通りに動いた。

冷静に考えてみれば単純なことでしたが勉強になりました。
エンジニアなら抑えておきたいたった一つのKPIと確認に便利なツール

元事業会社のシステムマネージャーから転職して、いちエンジニアに戻り、自分のパフォーマンスを計測するのに抑えているKPIと確認するのに利用しているツールを紹介してみます。


## KPIとは

「KPI」とは? 正しい意味と使い方、その効果とKGIも紹介【ビジネス用語】 | マイナビニュース
https://news.mynavi.jp/article/20180213-584004/

>「KPI」とは、key performance indicator の略で、組織やチームで設定した最終的な目標を達成するための、過程を計測・評価する中間指標のことです。日本では「重要業績評価指標」や「主要業績評価指標」「重要達成度指標」などと言われています。

ビジネスやプロジェクトに関わっているのなら一度は聞いたことがある単語だと思います。

組織やチームでいえば、売上金額やユーザー数などが一般的には指標となりますが、個人として指標を設定して確認するのもありです。


## 抑えておきたいKPI

### 業務中のコーディングに費やした割合

はい。単純明快です。
ポイントとしては、時間ではなく割合で確認することです。業務時間を母数として、開発に費やした時間を割りましょう。


## 確認方法

時間を計測して割合を算出するにも日々計測するのが面倒ですので、できる限り自動化したいところです。なので、便利なツールを利用しましょう。


### WakaTime

WakaTime
https://wakatime.com/

定番ツールのなので皆さん一度は見かけたことがあるのではないでしょうか？
利用していなければ、この機会に導入してしまいしょう。

<img width="1277" alt="スクリーンショット 2018-12-02 10.40.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/10fa153e-39a4-ec3e-d561-a6ecacf229d5.png">


上記のように日毎にコーディングに費やした時間が可視化されます。コーディングした言語やIDEの割合も可視化されます。利用できるIDE・エディタは下記のように対応されていますので、よっぽどマイナーなものでない限りは計測可能です。

<img width="1026" alt="スクリーンショット 2018-12-17 11.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/2440994f-625b-d2ae-4b84-be24da84f133.png">

無償・有償利用ができますが、無償でも過去14日までなら表示可能なので、半月ごとにでも確認するようにしておけば十分活用できます。どうしても月ごとにダッシュボード表示したい場合は、有償利用しましょう。(千円/月くらい)


### Toggl

母数となる業務時間については、始業・就業がはっきりしているのであればそれを適用すればよいですすし、フリーランスさんや裁量労働制など、稼働時間が不定期であれば、タイムトラッキングツールを導入しましょう。

個人的なおすすめとしてはTogglです。スマホアプリもありますので、手軽に計測ができます。

Toggl - Free Time Tracking Software
https://toggl.com/

タイマーで計測するか、手動で入力もできるので、ざっくりとでも作業記録を残して置きましょう。
以下の単位くらいざっくりした記録をしておくだけで、一日の作業内容を把握するいい記録になります。

- 打合せ
- 作業
- 開発
- 移動
- 休憩


## まとめ

エンジニアとしての本分は開発です。
いかにしてその価値を高めるかいろんな手法や考え方があると思いますが、良し悪しを測るための指標がないと、感覚値でしか測ることができず、確実性が乏しくなります。

四の五の言わず、まずはツールを導入して現状を把握しましょう^^
Apache JMeter Tips

JMeter の tips をまとめます。随時追加。

## 環境ごとに投げ先を切り替えたい

`設定エレメント > ユーザー定義変数` を追加し、環境ごとに変数を定義しておく。使う環境以外は無効化して使う。

<img width="1202" alt="スクリーンショット 2018-12-20 6.45.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/2573befc-f10e-0bdb-ccfa-607db0d2f331.png">

`${変数名}` で値を使用できる。

<img width="700" alt="スクリーンショット 2018-12-20 6.38.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/b57f224f-9db9-88b4-224e-1ee559b6f829.png">

## ベーシック認証を突破したい

`設定エレメント > HTTP 認証マネージャ` を追加し、基底 URL に対するユーザ名とパスワードをセットする。

<img width="1202" alt="スクリーンショット 2018-12-20 6.45.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/79c5fb97-7c14-8df8-6756-aade405588c2.png">

## セッションを維持したい

`設定エレメント > HTTP クッキーマネージャ` を追加する。

<img width="1202" alt="スクリーンショット 2018-12-20 6.57.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/8a9b9139-2770-3baa-5231-f94c96aabf0f.png">

## レスポンスから値を取得して利用したい

`後処理 > 正規表現抽出` を追加する。以下はレスポンスヘッダに含まれているトークンを抽出している例。

<img width="1202" alt="スクリーンショット 2018-12-20 6.52.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/1bd737b1-eca3-f51d-2a34-450de8b2e601.png">

`${参照名}` で値を使用できる。

## CSV ファイルを使ってリクエストごとに変数を変えたい

`設定エレメント > CSV Data Set Config` を追加。

<img width="1202" alt="スクリーンショット 2018-12-20 7.01.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/e2cfdaa9-5307-7866-2d6b-36e916b2b3e1.png">

`${変数名}` で値を使用できる。

## ランダム数列を使いたい

`${__RandomString(10, ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789, val)}` などとすれば良い。

<img width="1202" alt="スクリーンショット 2018-12-20 7.11.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/98903/a99284e9-6814-5512-9c57-f2d61e4323ca.png">


- 第一引数：文字列長
- 第二引数：使用する文字
- 第三引数：参照名（`${参照名}`とすれば、後続処理で値を参照できる）

## CLI から実行したい

``` sh
./apache-jmeter-5.4/bin/jmeter -n -t ./script.jmx -l ./log.jtl -e -o ./reports --forceDeleteResultFile
```

`-n`: CLI モード
`-t ./script.jmx`: スクリプトファイルの指定
`-l ./log.jtl`: ログの出力先を指定
`-e -o ./reports`: 結果レポートを html で出力してくれる
`--forceDeleteResultFile`: 既に結果ファイルがある場合、上書きする

[詳細](https://jmeter.apache.org/usermanual/get-started.html)

## CLI 実行結果をもとに、制御したい（パイプラインを失敗させるなど）

前項で結果レポートを出力していると、`statistics.json` が生成される。
エラーカウントやスループットなどが取得できるので、これを読み取って制御すれば良い。

``` sh
jsonData=`cat ./reports/statistics.json`
errorCount=$(echo $jsonData | jq -r ".Total.errorCount")

if test $errorCount -ne 0 ; then
  echo "something wrong."
fi
```
おすすめ商品を見つけ出すフィルタリングのメモ

# はじめに
[Courseraの機械学習コース](https://www.coursera.org/learn/machine-learning)の中で紹介してくれる協調フィルタリングについて，自分の理解度確認と備忘を兼ねた記事としています．

# 「おすすめ機能」
コースで使用していた映画の評価に基づくおススメの映画を求めるという問題を考えてみる．
例えば，4人のレビュアーと5つの映画がありそれぞれ0から5までの6段階評価をしたとする．

|Movie|Alice(1)|Bob(2)|Carol(3)|Dave(4)|
|:----|---:|---:|---:|---:|
|Love at last|5|5|0|0|
|Romance forever|5|**?**|**?**|0|
|Cute puppies of love|**?**|4|0|**?**|
|Nonstop car chases|0|0|5|4|
|Swords vs. karate|0|0|5|**?**|

ところどころ**?**となって抜けている部分がある．「**?**の評価がそれぞれいくつになるか？」というのが問題となる．

# 問題の形式化
上表を以下のような式に落とし込む．

```math
\begin{align}
n_u &= 4 \\ \\
n_m &= 5 \\ \\
r &= \left(\begin{matrix}
1 & 1 & 1 & 1 \\
1 & 0 & 0 & 1 \\
0 & 1 & 1 & 0 \\
1 & 1 & 1 & 1 \\
1 & 1 & 1 & 0 \\
\end{matrix}
\right) \\
\\
y &= \left(\begin{matrix}
5 & 5 & 0 & 0 \\
5 & 0 & 0 & 0 \\
0 & 4 & 0 & 0 \\
0 & 0 & 5 & 4 \\
0 & 0 & 5 & 0 \\
\end{matrix}
\right)
\end{align}
```
それぞれ，$n_u$はユーザー数，$n_m$は映画の種類，$r(i,j)$はユーザ$j$が映画$i$を評価していると1になる2値行列，$y^{(i,j)}$はユーザ$j$が映画$i$を評価したレート値（評価していないのは$0$にしてある）になっている．

# コンテンツベースフィルタリング
英語では，Content-based Filteringとなる？
オススメ機能（リコメンド機能）というのは，相関の高いものを提示することである．
上表の例を取り上げると，まず，映画にはアクションものや恋愛もの，SFなど色々な特徴がある．これらを全部挙げ尽くして1次式を作る．これが仮説関数$h_\Theta(x)$となり，そこで使うパラメータ$\Theta$を学習させるのが，コンテンツベースフィルタリングの学習方法である．

まず，必要な変数を定義する．
$\theta^{(j)}$をユーザー$j$のパラメータベクトル，$x^{(i)}$を映画$i$の特徴ベクトルとする．そうすると，$(\theta^{(j)})^T(x^{(i)})$が予測値となる．
ユーザー$j$のパラメータ$\theta^{(j)}$の最適化問題は以下のようになる．

```math
\min_{\theta^{(j)}}\frac{1}{2}
\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{k=1}^{n}(\theta_k^{(j)})^2
```

1つ目の$\sum$にある$i:r(i,j)=1$は，「$r(i,j)=1$となっている$i$」といういみである．
これから，全ユーザーのパラメータ$\theta^{(j)}$を最適化させるには

```math
\min_{\theta^{(1)},\ \dots,\ \theta^{(n_u)}}
\frac{1}{2}\sum_{j=1}^{n_u}
\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{\lambda}{2}
\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
```

となる．しかし，映画の特徴ベクトル$x^{(i)}$の値が定まっていないため，以下のようなユーザーのパラメータ$\theta^{(j)}$から学習しなくてはならない．

```math
\min_{x^{(1)},\ \dots,\ x^{(n_m)}}
\frac{1}{2}\sum_{i=1}^{n_m}
\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{\lambda}{2}
\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2
```

つまり，$x^{(i)}$と$\theta^{(j)}$を交互に最適化問題を解くことになる．

# 協調フィルタリング
英語では，Collaborative Filteringとなる．
上記のようにコンテンツベースフィルタリングでは，$x^{(i)}$と$\theta^{(j)}$を交互に求めていくことになるため，それを1度に解いてしまうというものである．コスト関数とすれば，

```math
\begin{align}
J(x^{(1)}, \dots,x^{(n_m)},\theta^{(1)}, \dots,\theta^{(n_u)}) = 
&\frac{1}{2}\sum_{(i,j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 \\
&+ \frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2 + \frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2 \\
\end{align}
```

となり，

```math
\min_{\begin{matrix}
x^{(1)}, \dots,x^{(n_m)} \\ \theta^{(1)}, \dots,\theta^{(n_u)}
\end{matrix}}
J(x^{(1)}, \dots,x^{(n_m)},\theta^{(1)}, \dots,\theta^{(n_u)})

```

という最適化問題を組み立てることが出来る．
最小化させる値が多いだけで，問題なく勾配降下法を用いることが出来る．


# まとめ
普段，ECサイトや広告で目にする「あなたにおすすめの商品」などのリコメンダシステムはこのようなフィルタリングを実装しているのだろうと思えるようになりました．協調フィルタリングに至っては，若干，2層ボルツマンマシンに似てるのでは？と思いました．
raspberry pi 1でtensrorflow lite その20

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
sdrをやってみる。
AMラジオ受信機やってみる。


#SDRとは。

ソフトウェア無線（Software-defined radio）とは、
電子回路（ハードウェア）に変更を加えることなく、制御ソフトウェアを変更することによって、無線通信方式を切り替えることが可能な無線通信、又はその技術

![](http://jsrun.it/assets/4/W/f/m/4WfmH)

具現化した受信機は、アンテナと同調は、回路を組むが、それ以降は、ノートパソコンで、マイク入力して、ソフトウェア処理して、スピーカーから出力する。

#AMラジオ受信機の構成
スーパーヘテロダイン方式。
ローカルオシレーターとミキサーで１０００ｋHZのAM波を４５０ｋHZの中間周波数に落として増幅して復調する方式。


![](http://jsrun.it/assets/m/Q/f/A/mQfAE)

#今回製作する方向

スーパーヘテロダインの中間周波数に、４４５KHZの発信機とミキサーを追加して、５KHZの信号を取り出して、ラズパイでマイク入力して、tensorflow liteで復調して、スピーカー出力する。

以上。
【VR学まとめ】2.7 モダリティ間相互作用と認知特性

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の11日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の2章「ヒトと感覚」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 2 ヒトと感覚

## 2.7 モダリティ間相互作用と認知特性

### 2.7.1 視覚と聴覚の相互作用

- モダリティ
    - 感覚様相
    - 一つ一つの感覚のこと(五感など9
- モダリティ間相互作用
    - 複数のモダリティからの情報を**相補的に**知覚する
    - モダリティ毎の単純な加算でないため、相互作用の理解が必要
- 腹話術効果
    - 聴覚の音源定位が視覚の位置に引っ張られる
    - 10°まで現れる
    - 時間的条件は200ms以内と比較的厳しい
- ダブルフラッシュエフェクト
    - 連続した視覚刺激が、ピッピッという音で瞬いて見える
    - 聴覚の高い時間精度が視覚を補っているため起きる現象
- マガーク効果
    - 「ba」と発話する音声 + 「ga」と発話する映像 → 「da」と聞こえる
    - 言語音声の知覚が資格情報に影響していることを示す(相補的ではない？）

### 2.7.2 体性感覚とその他のモダリティの相互作用

- シュード・ハプティックス
    - 視覚が体性感覚に影響
    - 視覚によって生じる主観的な力覚
    - マウスを動かす時に動きが遅いと重く感じる
- モードチェンジ
    - 体の動きや情動によって低次知覚が影響を受ける
    - 体を動かしていると時間順序判断のパフォーマンスが向上、など

### 2.7.3 思考、記憶と学習

- 思考は論理的でない
- バイアス
    - 演繹推論のバイアス
    - 帰納的推論のバイアス
    - 確率判断に見られるバイアス
- 記憶
    - 二重貯蔵モデル
        - 短期記憶
            - チャンク(単位)
                - 7±2(マジックナンバー)まで覚えられる
                - 情報の塊の意
                    - 漢字だと7つだが、熟語だと多くの漢字を覚えられるなど
            - 情報処理の観点からとらえた短期記憶はワーキングメモリと捉えられる
        - 長期記憶
            - 永続的
            - 意味記憶
                - 典型効果
                - 無時間的
            - エピソード記憶
                - 特定の時間と場所に関係した記憶
                - 思い出に相当
            - 手続き型記憶
        - 短期記憶から長期記憶への転送
            - 情動の関与
    - 潜在記憶
- 学習
    - 脳という情報処理系の可塑性
        - 知識やスキルの獲得
        - 訓練に依る知覚精度向上
            - 知覚学習


### 2.7.4 アフォーダンス

- ギブソンのアフォーダンス
    - 環境が持つ意味や価値
        - 川に渡された一本の丸太
            - 人にとっては橋
            - ゾウはおそらく橋でない
- ノーマンのアフォーダンス
    - 行為を導くための形態や造形が持つメッセージ
    - デザイン理論として提唱
- 共通すること
    - 生物が環境から受け取るのは物理的な属性でなく、**意味**であること

# まとめ

最後エモい感じの話でしたね！

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の12日目は[【VR学まとめ】3.1 バーチャルリアリティ・インタフェースの体系](https://qiita.com/nkjzm/items/17b19fae768c4dc8db07)です。
【VR学まとめ】2.6 味覚・嗅覚

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の9日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の2章「ヒトと感覚」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 2 ヒトと感覚

## 2.6 味覚・嗅覚

### 2.6.1 味覚の受容器と神経系


**基本五味**

- 甘
- 酸
- 塩
- 苦
- うま

**味覚の神経伝達**

![JPEG image-52020268CD01-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/12e36076-7a53-f4cb-55b1-aef7c1c16f32.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- 味蕾
    - 分子量が大きい味物質は七回膜貫通型受容体
        - 甘味、旨味、苦味
    - 分子量が小さい味成分はイオンチャンネルを介して直接味細胞を活性化
        - 塩味、酸味
    - 分布場所
        - 茸状乳頭
        - 有郭乳頭
        - 葉状乳頭
    - 神経伝達
        - 鼓索神経
            - 舌の前部
        - 舌咽神経(ぜついん)
            - 舌の奥部や喉
        - 大錐体神経
            - 上顎
- 辛味は痛覚
    - 三叉神経
        - 味覚神経でない
- 味の符号化には2つの説がある
    - まだ不明点が多い


### 2.6.2 味覚の特性

- 味の認識には高次処理大きく関わる
    - 嗅覚と統合して認識しているため、鼻をつまむと味がわからなくなる
- 種を超えると味覚に相違が生じる場合もある
- ギムネマ酸(甘さを感じられなくなる)
- 甘味
    - エネルギー源
    - 一定以上摂ると甘味料の味が嫌いになる
        - 生体防御の一貫
- うま味
    - 昆布: グルタミン酸
    - 鰹節: イノシン酸
    - しいたけ
    - うま味として認識されているのは昆布だけ(他はうま味増強物質)
- 苦味
    - 受容体は25種類
    - 言語バリエーションが少ない
    - 学習によって心地よくなる
- 酸味
    - pHで知覚
    - 唾液の分泌を促す
        - 口の中の味成分を洗い流すことが出来るため、脂の多い料理に加えられることが多い
    - 酸の種類によって同じpHでも酸味が異なる
    - クエン酸だけ特別
- 塩味
    - 発汗利尿により欲しくなる
    - 食品を美味しくする
        - 食材の水分を出して素材の味を濃縮
        - 唾液分泌を促し味物質を口いっぱいに広げる

### 2.6.3 嗅覚の受容器と神経系

- 受容体は350種類
- 化学物質と一対一の対応はしていない(多対多)
- 匂い分子構造マップが形成されている

### 2.6.4 嗅覚の特性

- オルソネーザル
    - 鼻から
- レトロネーダル
    - 口腔から
    - 咀嚼によって化学物質が放出されるため、匂いが変わる
- 種の間での嗅覚の違い
    - 共通するものもある
- 分子構造だけで決まらない
    - フローラル、ミンティなどは異なる分子構造のものでも共通して認識される
- 嗅覚の発達
    - 成人: 口臭や腐敗臭よりバラの香りを好む
    - 2歳半の幼児: 好みの違いはない
- 匂い経験
    - ボトムアップ情報
    - 統合的な高次のメカニズムが関与

# まとめ

味覚と嗅覚は複雑で高次の知覚であることが分かりました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の10日目は[【VR学まとめ】2.7 モダリティ間相互作用と認知特性](https://qiita.com/nkjzm/items/ca4f75918f7e66def83c)です。
PhpStorm(たぶん IntelliJ 系列) で  Partial Commit(ファイルのうち一部だけをコミット) 出来る！

# PhpStorm(たぶん IntelliJ 系列) で  Partial Commit 出来る！

恥ずかしながら先程まで知りませんでした!

https://blog.jetbrains.com/idea/2018/02/intellij-idea-2018-1-eap-partial-git-commits-and-more/

PhpStorm(たぶん IntelliJ 系列) Partial Commit が可能なんです。

これはズボラな人間としては大いに活用せねば！

## どういう時に便利か

ある程度実装してくうちに、特定のファイル(達)に Commit しようとしてる意図とは違う軽微な修正を入れてしまうケースがあります。

例えば、 `SomeController.php` というファイルに対して作業をしていて、偶然 typo を見つけたとします。

でも、既に `SomeController.php` は修正が入っていて、発見した `typo` と一緒にコミットするとコミットログ的に良くないと考える。

そうなると、先に実装箇所を Commit して、その後で `typo` を修正することになるわけですが、まぁ、忘れたり Commit したけど、本筋の方に戻ったりという状況が発生しがちなわけです。

そこで、コミット時に特定の修正だけコミット出来たらいいのになーと思うわけです。

で、今日はなぜかググって見たわけです。 `phpstorm partial commit` って。

そしたら、前述の https://blog.jetbrains.com/idea/2018/02/intellij-idea-2018-1-eap-partial-git-commits-and-more/ を発見したわけですよ！すごい！

## やり方

例えば、  Project Tree (等: favs からとかでも OK)から、対象のファイル達を選択した状態で `cmd + shift + a` から何でも検索を呼び出して、 現れる入力欄におもむろに `git` 入力し、最初に表示されるであろう `Commit File...` をそのままキーボードのエンターから選択します。

※他にも `cmd + k` で、影響のあるファイルに対する Commit Window を表示する方法もあります。

で、表示された Window 上部で、まず、 Partial Commit したいファイルにチェックを入れます。

※もし、 Project Tree から選択していた場合既に選択済みのはずです。

で、次。

画面下方の `Your version` の行番号の箇所にチェックボックスがあるはずです！

<img width="1242" alt="スクリーンショット 2018-12-20 5.02.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/3243/a1f55db0-ac83-0a1d-6169-afb297b7d781.png">

このチェック、デフォルトで全てにチェックが入っているはずですが、今回のコミット作業で除外したい箇所のチェックを外すと、チェックが入っている場所だけがコミットされます！

便利！

例えば、先の例だと、 `fix typo.` というコミットに対して、該当箇所だけにチェックを入れて先にコミットしておく、なんて事ができたりします。

もちろん、チェックを入れてない箇所は未コミット状態として残ります。

これは捗る！
Ruby 2.6のASCII以外の大文字で定義できる定数を試す

この記事は[Okinawa.rb Advent Calendar 2018](https://qiita.com/advent-calendar/2018/okinawarb)の17日目の記事です。
昨日は @yono@github さんの[class_eval の中で定数を定義したときのスコープ](https://qiita.com/yono@github/items/8b7991a88335a08f4b73)でした。
明日は @hanachin_ さんの[Re: 10分間隔で 10時〜23時台の配列をつくる](https://qiita.com/hanachin_/items/1a7b9ea0af62e5021c94)です。

## ASCII以外の大文字でも定数が定義できるようになった

Ruby 2.6の新機能です。

> ASCII以外の大文字でも定数を定義出来るようになりました
https://www.ruby-lang.org/ja/news/2018/12/15/ruby-2-6-0-rc2-released/

## ASCII以外の大文字が定数になった

逆に言うとASCII以外の大文字ではじまる名前は定数になりました。
定数になって影響を受けそうな機能を2.6.0-rc2を使って見ていきましょう。

## ASCII以外の大文字とは

はい
https://www.fileformat.info/info/unicode/category/Lu/list.htm
https://www.fileformat.info/info/unicode/category/Lt/list.htm

具体的な処理はこのあたり
https://github.com/ruby/ruby/blob/v2_6_0_rc2/symbol.c#L202-L236

## 定数になったか確認してみよう

`defined?`が`"constant"`を返す

```
% ruby='𝐀=42; p defined?(𝐀)'; RBENV_VERSION=2.5.3 ruby -ve $ruby; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
"local-variable"
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
"constant"
```

ローカル変数を`Binding#local_variable_set`で設定してみる

```
% ruby='binding.local_variable_set(:𝐀, 42)'; RBENV_VERSION=2.5.3 ruby -ve $ruby; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
Traceback (most recent call last):
        1: from -e:1:in `<main>'
-e:1:in `local_variable_set': wrong local variable name `𝐀' for #<Binding:0x0000556103d9c880> (NameError)
```

できない

正規表現の名前付きキャプチャでローカル変数が自動で定義されるかどうか

```
% ruby='/(?<𝐀>a)/ =~ "a"; p binding.local_variables; p 𝐀'; RBENV_VERSION=2.5.3 ruby -ve $ruby; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
[:𝐀]
"a"
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
[]
"a"
```

ローカル変数は自動で定義されないが定数が定義される(?)

```
% ruby='class 𝐀; end; /(?<𝐀>a)/ =~ "a"; p 𝐀'; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
-e:1: warning: already initialized constant 𝐀
-e:1: warning: previous definition of 𝐀 was here
"a"
% ruby='class C; end; /(?<C>a)/ =~ "a"; p C'; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
C
```

オッ

## まとめ

オッと思って報告した
https://bugs.ruby-lang.org/issues/15437

シュッとなおっていた
https://github.com/ruby/ruby/commit/f89238ec0d689f3989c55c4716da500b8c898900

n0kada さんすごい

新機能みかけたら、みんながやらない使い方を試すといいですね :smile:
Elixirからmp3のID3タグを扱うライブラリ

を作りました。`ID3` といいます。
[ndac-todoroki/elixir-id3 | Github](https://github.com/ndac-todoroki/elixir-id3)

Elixir Forumでの宣伝はこちら
[ID3 - a mp3 ID3v1/v2 tag reader/writer for Elixir | Elixir Forum](https://elixirforum.com/t/id3-a-mp3-id3v1-v2-tag-reader-writer-for-elixir/18826)

`Rustler` を利用してRustで書かれたNIFを利用するライブラリです。ID3に関する部分はすべてRust製のライブラリに依存しているのでちゃんと動くはずです(？)

## できること

### ID3v1/v2タグの読み出し

```elixir
iex> {:ok, tag} = ID3.get_tag("audio.mp3")
iex> tag
%ID3.Tag{
  album_artist: "Queen",
  artist: "Queen",
  date_recorded: ~N[1977-10-07 00:00:00],
  date_released: ~N[1981-11-02 00:00:00],
  disc: 1,
  duration: nil,
  genre: "Rock",
  title: "We Will Rock You",
  total_discs: 1,
  total_tracks: 17,
  track: 16,
  year: 1981
}
```

### ID3v2.4タグの書き込み

```elixir
iex> {:ok, tag} = ID3.get_tag("audio.mp3")
iex> new_tag = %{tag |
  album_artist: "クイーン",
  artist: "クイーン",
  date_recorded: nil,     # <- nilは削除
  genre: "洋楽",
  title: "ウィ・ウィル・ロック・ユー",
}
iex> ID3.write_tag("audio.mp3", new_tag)
:ok
```

### 制限

現在はよく使われる属性にしか対応していません(アーティスト名や曲名など)。詳しくは[ドキュメントの `Tag.t` の頁](https://hexdocs.pm/id3/ID3.Tag.html#t:t/0)をご覧ください。
Rust力が高まったらその他の属性にも対応する予定です。

- 複数あるもの
    - コメント
    - アルバムアート
- 独自属性(`TXXX`)など

独自属性を始めとしたいくつかの属性は `Tag` 構造体ではなく通常の `%{String.t => String.t}` で対応するつもりです。

## 導入

mix.exsに追加してください。
最新のRustが使える状態でないと、コンパイルに失敗するはずです。その場合は `rustup` の導入をしてください。（導入時に最新のRust stableが入ります）

## やってみたいこと

[elixirでMP3のID3v2タグ抽出](https://qiita.com/kokoax/items/ee6e2dc12be6ca8cdafd) で示されていることをベースにすべてElixirで書くのもやってみたい。
とりあえず今はすぐに使えるライブラリがほしいという自分の需要に合わせて作成したので、そのうち。

## 最後に

是非使ってみてください！Rustlerとかライブラリ化とか初めてなのでFBがほしい。
【VR学まとめ】2.5 前庭感覚

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の9日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の2章「ヒトと感覚」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 2 ヒトと感覚

## 2.5 前庭感覚

### 2.5.1 前庭感覚の受容器と神経系

- 三半規管(回転運動を受容、それぞれが直交している)
    - 前半規管
    - 後半規管
    - 水平半規管
- 耳石器(じせきき)(直線運動、傾斜を受容)
    - 卵形嚢(らんけいのう、水平方向)
    - 球形嚢(きゅうけいのう、垂直運動)

### 2.5.2 平衡機能の基本特性

- 前庭動眼反射
    - 視線を空間内で一定に保つ
- 前庭脊髄反射
    - 外乱にたいする身体平衡の維持
    - 視野の網膜像の動きを抑える
    - 前庭顎反射
    - 姿勢反射
        - 耳石器による静的状態や穏やかな運動時の静的な反射
    - 動的姿勢反射
        - 半規管による回転運動時の反射

### 2.5.3 身体運動と傾斜の知覚特性

- 前後方向のx軸周りの回転をロール
    - 閾値は0.4deg/s^2
    - 静的な傾斜の知覚は1.5~2.2deg
- 左右方向のy軸周りの回転をピッチ
    - 重力加速度で傾斜感覚が変化
- 上下方向のz軸周りの回転をヨー
    - 重力方向の傾きが変化しないので半規管で知覚
    - 閾値が低い(0.1~0.3deg/s^2)
- エレベータ錯覚

![B6Hk08hCAAE-Vld.png](https://qiita-image-store.s3.amazonaws.com/0/55365/1fd9ab73-14b2-0498-0477-9c9b921b5d4d.png)
引用元: https://twitter.com/kentarofukuchi/status/549972228591198209

### 2.5.4 動揺病

- 動揺病
    - 乗り物酔い
    - シミュレータ酔い
        - 実車経験が多い人ほど酔いやすい
    - 宇宙酔い
    - 陸酔い
- 感受性が高い人
    - 男性
    - 12-15歳まで
    - 神経質な人や心配性な人
- 感覚矛盾説

### 2.5.3 前庭感覚と視覚の相互作用

- 中枢神経系の広い範囲で深く関連しあっている
- 眼球運動
    - 協調して反射性の調節をしている
    - 静止時あるいは遅い運動は視覚
    - 速い運動は主に前庭系
- 動揺病
    - 車酔いの場合
        - 前方視界の有無が影響
        - 本など車内の静止物を注視すると閉眼時よりよい安い
- ベクション
    - 視覚誘導自己運動感覚
    - 視野の広範囲が動く視運動刺激を受けると逆方向に動いているように知覚する
    - 視覚性動揺病の原因と言われてきたが、そうでない結果も報告されている

# まとめ

身体の平衡は色々なメカニズムによって支えられているんですね！（ダブルミーニング）

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の10日目は[【VR学まとめ】2.6 味覚・嗅覚](https://qiita.com/nkjzm/items/f6ba815ed3e7a490f2f2)です。
AWS EC2にFlask-Cachingを使ってRedisでビューキャッシュをしてみた

#はじめに
機械学習やら色々な新しい事を実践的に試すべく
エロサイトを開発中。[あなろぼ](http://eroiro.me/)
開発実践用にオープンしているので広告は入っておりませんのでお気軽にどうぞ。
色々工夫したアプリケーションの作りになっているのでレスポンスは速いはず。

#アプリケーション構成
このサイトの構成は下記になっています。
Nginx
Uwsgi
Flask(Python)
MongoDB

#今回トライしたこと
1.Redisの導入
2.Flaskのビューをキャッシュ

#1.Amazon Linux2にRedisをインストール
```
sudo amazon-linux-extras install redis4.0
sudo systemctl enable redis.service
sudo systemctl start redis.service
```
今回は動作すればOKなのでこれだけでおｋ
細かい設定は他を参照
この辺りを参照しました。
http://www.denet.ad.jp/technology/2017/11/redis-centos7.html

#2.Flaskのビューをキャッシュ

必要なパッケージのインストール。
```
sudo pip install Flask-Caching
sudo pip install redis
```

```
from flask import Flask
from flask_caching import Cache

app = Flask(__name__)

# Cacheインスタンスの作成
cache = Cache(app, config={
    'CACHE_TYPE': 'redis',
    'CACHE_DEFAULT_TIMEOUT': 60,
    'CACHE_REDIS_HOST': 'localhost',
    'CACHE_REDIS_PORT': 6379,
})

@app.route('/')
@cache.cached()
```

・flask_cachingを呼び出し
・Cacheインスタンスの作成
・アプリケーションのルートの下に「@cache.cached()」を記述するだけ

これだけで自動的にビューをredisにキャッシュしてくれます。

キャッシュにパラメータを指定できます。
`timeout`: キャッシュの有効期間 (秒)　デフォルトはインスタンス作成時のもの
`key_prefix`: キーのプリフィックスで、デフォルトでは"view/リクエストパス"
`query_string`: Trueの場合、クエリパラメータが異なるリクエストはクエリパラメータを含むハッシュ値をキーとしてキャッシュされます (デフォルトはFalseで、クエリパラメータが異なっても同一のキーが使われる)リストとかクエリでビューを変更している場合はこちらをTrueにしましょう

うん、めちゃくちゃ速くなった(気がする？)

見てみてくださいな
[あなろぼ](http://eroiro.me/)
【VR学まとめ】2.4 体性感覚・内臓感覚

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の8日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の2章「ヒトと感覚」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 2 ヒトと感覚

## 2.4 体性感覚・内臓感覚

### 2.4.1 体性感覚・内臓感覚の分類と神経機構

- 特殊感覚
    - 視覚
    - 聴覚
    - 味覚
    - 嗅覚
    - 前庭感覚
- **体性感覚**
    - 皮膚感覚
    - 深部感覚(骨格筋、関節)
- **内臓感覚** (胃、腸、肝臓)

体性感覚・内臓感覚の受容器の4つの分類

- 機械受容器
    - 皮膚の触や圧、筋肉の伸張や緊張
- 温度受容器
    - 温冷などの感覚
- 化学受容器
    - pHなど化学的刺激
- 侵害受容器
    - 強い機械的刺激、熱刺激、酸など体に障害を引き起こす刺激

### 2.4.2 皮膚感覚

- 無毛部
    - 手指など、触覚に依る重要な役割
- 有毛部
    - 大部分がこれ

皮膚は3層でなる

- 表皮
- 真皮
- 皮下組織

皮膚感覚受容器について

- 3種類
    - 機械受容器
    - 温度受容器
    - 侵害受容器
- 構造から観た分類
    - カプセルなどの特殊構造
        - 全て機械受容器
    - 自由神経終末


**触覚**

- 全て特殊構造を持つ機械受容器
- 無毛部
    - マイスナー小体
    - パチニ小体
    - メルケル触盤
    - ルフィニ終末
- 有毛部
    - 毛包受容器
    - パチニ小体
    - メルケル触盤
    - ルフィニ終末

![JPEG image-8959E2507EBC-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/58625d8d-a80b-656c-a1a7-8bafef1c0254.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

受容できる刺激を、「早い変化」「遅い変化」「小さな領域」「大きな領域」という観点で分類できて、そのマトリクスに上記4つの受容器が対応するという話である。受容器によって得意な変化が違うんだね！

- FAⅠ, FAⅡが即順応、SAⅠ, SAⅡが遅順応
- FAⅠ, SAⅠが小受容野で鮮明な境界、FAⅡ, SAⅡが大受容野で不鮮明な境界

基本的能力の調べ方

- 触2点閾
    - 手指や唇などで小さい(2-3mm)
    - 上腕や背、腹、太ももなどで大きい(15-30mm)
- 振動検知閾

**温度感覚**

- 温覚
    - 皮膚温よりやや高い
    - 自由神経終末
    - 無髄線維(C線維)
    - 40-45°Cがよく神経発射する
    - 45°C以上は熱痛覚
- 冷覚
    - 皮膚温よりやや低い
    - 自由神経終末
    - 無髄線維(C線維)または細い有髄線維(Aδ繊維)
    - 30°C付近でよく神経発射する
    - 15°C以下は冷痛覚
- 無関帯
    - 接触させつづけると感じなくなる温度
    - 31-36°C
    - この範囲外は温覚・冷覚が持続する

**痛覚**

- 体性痛覚
    - 表在性痛覚
        - 自由神経終末
        - 無髄線維(C線維)
            - 遅い痛みを伝達
        - 細い有髄線維(Aδ繊維)
            - 早い痛みを伝達
    - 深部痛覚
- 内蔵性痛覚

時間的観点に依る分類

- 急性の痛み
    - 事故による怪我など
    - 傷害を知らせ警告する機能
- 慢性の痛み
    - 癌はど半年以上に渡り繰り返し起きる
    - 障害の程度と痛みの強さの間に相関がないため、有用性のない痛みである

### 2.4.3 深部感覚

- 四肢相互の位置関係や動き、四肢に加わる力などの検出
- 筋肉、腱、関節に存在
- 固有受容器と呼ばれる
    - 筋紡錘(きんほうすい)
        - 筋肉の収縮や伸張を知る
    - ゴルジ腱器官
        - 筋肉が収縮するときに反応する
        - 筋紡錘との反応の違いによって深部情報を精密に伝える
    - 関節受容器
- 深部感覚
    - 位置覚
    - 運動覚
    - 力覚
- 深部痛覚
    - 筋肉、骨、関節、結合組織などからの痛み
    - 痛む場所が明確に分かりづらい
    - 筋痛
        - 乳酸にもよる

### 2.4.4 内臓感覚

- 内蔵受容器の基本的な役目は体内の恒常性維持
    - 通常意識されない
- 飢え、乾き、尿意、便意などの臓器感覚は意識に上る
- 内蔵痛覚
    - 局在性が不明瞭
    - 強い情動性
    - 反射的に吐き気などの自律神経反応を引き起こす

# まとめ

受容体によって得意な変化の伝達が違うんだね！

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の9日目は[【VR学まとめ】2.5 前庭感覚](https://qiita.com/nkjzm/items/962cdd7f2904bba3e684)です。
PHPで基本的なサーチアルゴリズムを実装

今週は、アルゴリズムを勉強しました。

#####サーチアルゴリズム
データの中を探索して、指定した要素を取り出すアルゴリズムです。
基本的なサーチアルゴリズムは、リニアサーチとバイナリサーチの2種類があります。

#####リニアサーチ（線形探索）
配列の最初の値から順番に1つずつ検証していって指定した値を探す方法です。
簡単ですが、大量のデータを扱うには不向きです。
1~1000までの配列から777を取り出すプログラムをPHPで実装してみます。

````PHP
<?php
$list = range(1 ,1000 ,1);
$ans = 777;
for ($i=0; $i < 1000; $i++) {
if ($list{$i} == $ans){
echo $ans;
break;
}
}
?>

````

#####バイナリサーチ
まず、配列の中央から検証して、その値が指定した値より大きいか小さいかを比較します。
大きい場合は探索範囲を中央より後半にして、小さい場合は探索範囲を中央より前半にします。
これを繰り返すことで、指定した値を取り出します。
基本的にリニアサーチよりも早いですが、予めデータが昇順または降順にソートされていないと使えません。
同じく、1~1000までの配列から777を取り出すプログラムをPHPで実装してみます。

```PHP
<?php
$list = range(0, 1000, 1); 
$first = 0;
$last =  1000;
$ans = 777;
do{
$center = (($first + $last) / 2); 
if ($list[$center] == $ans){
echo $ans; 
break; 
} 
else if ($list[$center] < $ans) { 
$first = $center + 1; 
}
else if ($list[$center] > $ans){
$last = $center - 1; 
}
}
while($first <= $last);
?>
```
(原因：未解決)bladeにて、jsのクリックイベントが効かない

laravel bladeにて
vuejsのクリックイベントが動かなかった。

原因は、公式のmake authで作成される
app.blade.phpの

```html
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
```

これをコメントアウトした。
正直、これの正体がわからない。
また調べてみようと思う。
php-master-changes 2018-12-19

今日は主にエンジン内の局所最適化の修正が幾つかあった！

# 2018-12-19
## dstogov: Reorder conditions
- https://github.com/php/php-src/commit/ae9e956ef901ca3f93fd74a412c468bed12a2391
- executor 内の条件分岐の順序を並び替え
- 単に頻度の高いパスを先に持ってって高速化なのかなーとは思うものの詳細不明

## dstogov: Replace zend_hash_apply... with ZEND_HASH_FOREACH...
- https://github.com/php/php-src/commit/cec091176cecd3f1efd553f4283fa7346184ad36
- zend_hash_applyﾎﾆｬﾗﾗ を ZEND_HASH_FOREACHﾎﾆｬﾗﾗ へ置き換え
- たぶん単にハッシュテーブルに 1 つ 1 つ何かして回る系をインライン化して速くしたい

## dstogov: Fixed compilation warnings
- https://github.com/php/php-src/commit/9acfe1f8f02d9dd53c2c1958e942df3f67577385
- [先日修正した箇所](https://qiita.com/sj-i/items/b31203edb71694a39841#dstogov-fixed-memory-leaks)のコンパイラの警告を修正、PHP_MSHUTDOWN_FUNCTION は int 返す関数としての宣言に展開される

## dstogov: Replace add_index_zval() and add_next_index_zval() functions by macros
- https://github.com/php/php-src/commit/85e1df6fdcaf307c5e6b241df4d859e916806d2a
- add_index_zval() と add_next_index_zval() をマクロに変更、たぶんこれもインライン化して速くしたい

## dstogov: Removed add_get_assoc_*() and add_get_index_*() API functions
- https://github.com/php/php-src/commit/d356f6d72b1aa2abe27ba4d135174646b3a4c03a
- add_get_assoc_*() 系と add_get_index_*() 系を削除

## dstogov: Reuse add_property_zval_ex() instead of code duplication
- https://github.com/php/php-src/commit/493f8303559c0f2ff88c1c245513ece86fadde27
- add_property_*ex() の各関数で重複処理を持っていたのを add_property_zval_ex() で済ますよう修正

## dstogov: Added specialized code for small arrays
- https://github.com/php/php-src/commit/dddf3c501ea737ca2992304b227774aa0cb203ae
- 配列初期化処理を小さなサイズの配列に強くした
広告SDK-Adjust SDKを使ったディファードディープリンクの活用について

# はじめに
こんにちは:smile:。
ディップでアプリのUIの改善やマーケティングのツール導入などiOSやAndroidアプリの開発を任されている部署の課長をやらせてもらっている@m-komatsuです。

今回adjustSDKというアプリの広告計測する為のSDKの導入時に実施した施策例と使いどころについて備忘録的になればと思い書きました。

# ディファードディープリンクとは
端末にアプリがインストールされてあれば、ディープリンクを使うと目的の場所に遷移することができますが、アプリをインストールしていないケースにおいてもディープリンクを起動することができます。
アプリをインストールされていないケースでは、adjsut側がディープリンクの情報を一時的に保持し、アプリ初回起動の際にその保持したディープリンクの情報元に遷移させたい画面に着地させることができます。この仕組みをディファードディープリンクと言います。

この機能を使うことで、ユーザー体験やコンバージョン率の向上につながり、色々なキャンペーンを実施することが可能となります。

例えば、特定のキャンペーン経由でアプリをインストールしたユーザーにインセンティブを提供するなどのキャンペーンが可能となったりします。こういうキャンペーンや広告運用をすることで、インストールのCVR向上だけでなく、課金系などのアプリによっては課金ユーザーへの転換率の向上などのキャンペーンにより、全体的なROIが向上する可能性があると思いますので、一度是非検討されてみてはいかがでしょうか。

ちょっと調べた感じでは、ディファードディープリンクの機能を使用できる広告SDKは、adjust以外にappsflyerやfacebookのSDKなどでも使用できます。

# 組込み例
こちらを参考に。※今回はswiftコードで記載します。
https://docs.adjust.com/ja/sdk/ios/

下記のようにデリゲートコールバック関数を以下のように実装し、ディファードディープリンクオブジェクトの情報を取得しておく
※これを実装していない場合は、adjust SDKはデフォルトで常にディープリンクを開く挙動になります。

```
    func adjustDeeplinkResponse(_ deeplink: URL?) -> Bool {
        return true
    }
```

次に、下記のようにアプリでディープリンクの内容データを受信したら、appWillOpenUrlメソッドへのコールを追加する。 これにより、adjust SDK側でディープリンクの中に新たなアトリビューションが存在するかを調べて、あった場合はadjustサーバーに送信します。

```
   func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
        var canHandle = false

        //universal link起動
        if  userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let url: URL = userActivity.webpageURL {
            Adjust.appWillOpen(url)
・
・
・
```

# リアトリビューション！？について
実装自体は難しいことはないとは思いますが、テストする際に、毎度端末の初期化をすることを忘れないようにすることが大事です。
初期化しておかないと、コールバック(*adjustDeeplinkResponse()*)が呼ばれません。

初期化手順については、[**こちら**](https://qiita.com/m-komatsu/items/817fc4bfd0a28a037044)に記載しておきました。

また、固定リンクにおいて、この機能を使うと、新規インストールユーザには効果はありますが一度アンインストールした端末に対してはadjust側に前回のアトリビューションデータが残っている場合が多いのでディファードディープリンクが発動しませんので使いどころは気を付けないといけないと思いました。


adjust社によれば、ディファードディープリンクが動作するのは以下のケースとのこと。

- A:新規インストール時
- B:リアトリビューション時　

(よく読んだら理解はできていたのですが・・・はじめは何故動作しないかかなりハマりました。:confounded:)

**リアトリビューション！！**（普段マーケティング用語を使わないので都度戸惑ってしまいますね・・・:sweat_smile:）

リターゲティングとアトリビューションが組み合わさった言葉らしいです。
アプリインストール（初回起動）してから90日以内にリターゲティング広告経由で再インストールしたコンバージョンのことのようです。

adjust側で設定があって、休眠の条件（休眠期間）を満たして、、
また、アンインストールした後も３０分以上時間を空けて、URLのトラッカートークンを変更するか、キャンペーン以下のパラメータ情報を何かしら変更し、インストールで紐付いているトラッカーとは別のURLで試すと確実のようです。
（インストールと同一のURLの場合、リアトリビューションが計測されない可能性があるらしい・・・:sob:)

例）
https://app.adjust.com/abc123?deep_link=adjustiOS%3A%2F%2F&idfa=111-222-3333-4444
iOSでテストする場合は、IDFAをURLのパラメータに付与することでクリック時にIDFAをadjsutに送ることが必要とのこと。

# 最後に
広告SDKを組み込んだあとのテスト方法は、使用方法をちゃんと読むこと。
(当たり前だけど・・・但し、量が多いのと**[adjust日本語版](https://docs.adjust.com/ja/)**のドキュメント更新されていないことが多いので気を付けましょう:cold_sweat:)

あとは、adjustを使用する際は、テストおよび結果分析を慎重に行い、すべての設定が正しく計測が行われているか確認はしておきましょう。

テストでは、必ず「サンドボックス」で実施すること！
※サンドボックス環境を使うことでテスト データと本番データを区別することができる為。

以上！
Visual Studio 2017以降でUTF-8（BOM無）をデフォルト文字コードにする

Visual StudioでPHP開発／フロントエンド開発を行っている皆さん。
ファイルを新規作成した時に毎回UTF-8(**BOM付**)になってしまうのがうざいですね。

これまでは、Visual Studioの拡張機能を入れて解決するしかありませんでした。

 - [\[小技\]Visual Studioの規定値でUTF-8にBOMを付けないようにする](http://d.hatena.ne.jp/kaorun/20130529/1369809806)
 - [Visual Studioの文字コード規定値をUTF-8(BOMなし)にする](http://horoyoilab.hateblo.jp/entry/2015/04/05/173724)

このあたり、あまり情報が出てこなくてVisual Studio使って開発されてることってあまりないんじゃないの？なんてことを思ってしまいます。
さて、本題ですが、答えは**プロジェクトのルートディレクトリに.editorconfigを作るだけ！**でした。

```.editorconfig
root = true

[*]
charset = utf-8
```

Visual Studioは2017からeditorconfigに対応しています。
特定の拡張子だけをUTF-8(BOM無)にしたい場合は、[\*]の部分を[\*.{php,html,css}]などとすればOKです。

調べてみたら、[charsetはv15.3あたりできちんと実装された](https://developercommunity.visualstudio.com/content/problem/22922/editorconfig-support-interprets-charset-utf-8-as-u.html)みたいですね。
これで拡張機能を待たずにVisual Studio 2019に移行できますね！
Swift  カスタムセル    オートレイアウト　全デバイス対応

# 環境 Xcode12 Swift5

####StoryBoardは使わず、 XibでCustomCellをオートレイアウトで生成しています。
####拡張管理しやすいアーキテクチャにしました。

##ViewController

```
import UIKit

final class ViewController: UIViewController {

    let vm = TableObject()
    lazy var tView: TableView = {
        let tView = TableView()
        tView.table.register(TableViewCell.identifier, forCellReuseIdentifier: "cell")
        tView.table.delegate = self
        tView.table.dataSource = vm
        return tView
    }()
    override func viewDidLoad() {
        super.viewDidLoad()

        tView.frame = view.frame
        view.addSubview(tView)
    }
}

//MARK: UITableViewDelegate
extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("1234567890")
    }
}

```


##UIView

```
import UIKit

final class TableView: UIView {

    let table = UITableView()

   override init(frame: CGRect) {
        super.init(frame: frame)

        self.frame = UIScreen.main.bounds
        table.frame = self.frame
        addSubview(table)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
```


##NSObject

```
import UIKit

final class TableObject: NSObject { }

//MARK: UITableViewDataSource
extension TableObject: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        cell.config(image: UIImage(named:"PhSHT2L7_400x400")!)
        return cell
    }
}
```


##UITableViewCell
```
import UIKit

final class TableViewCell: UITableViewCell {
    
    static let identifier: UINib = UINib(nibName: "TableViewCell", bundle: nil)
    @IBOutlet weak var tableImageView: UIImageView!{
        didSet{
            tableImageView.clipsToBounds = true
            tableImageView.layer.cornerRadius = 12
        }
    }
    @IBOutlet weak var shadowView: UIView!{
        didSet{
            shadowView.layer.cornerRadius = 12
            shadowView.backgroundColor = UIColor.brown
            shadowView.layer.shadowOpacity = 0.5
            shadowView.layer.shadowRadius = 12
            shadowView.layer.shadowColor = UIColor.black.cgColor
            shadowView.layer.shadowOffset = CGSize(width: 5, height: 5)
        }
    }

    func config(image: UIImage){
        tableImageView.image = image
    }
}
```


##TableViewCell.Xib
<img width="264" alt="スクリーンショット 2018-12-20 2.30.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/32eeb366-25cc-2435-c70f-56f3fe7aec51.png">

<img width="1128" alt="スクリーンショット 2018-12-20 2.30.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/b96e9ca9-ce18-eed1-1953-9beb5ea892ef.png">

##ソースコード
https://github.com/daisukenagata/SampleTableView
OpenCV(C++)チュートリアル：2枚の画像をブレンドする

公式チュートリアルの[Adding (blending) two images using OpenCV](https://docs.opencv.org/3.4/d5/dc4/tutorial_adding_images.html)の要約。
筆者の環境はDebian 9

## やること
画像のリニアブレンドを行う数式

```math
g(x)=(1−α)f_0(x)+αf_1(x)
```

$f_0(x)$, $f_1(x)$がそれぞれ入力画像。$α$を0から1に動かすことで$f_0(x)$から$f_1(x)$へとフェード（クロスディゾルブ）する。
`addWeighted()`関数でできる。

##コード
```cpp:sample.cpp
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
// ここでは"using namespace std;"しない。c++17のstd::betaとここで使う変数betaが衝突する。 
using std::cin;
using std::cout;
using std::endl;
int main( void )
{
   double alpha = 0.5; double beta; double input;
   Mat src1, src2, dst;
   cout << " Simple Linear Blender " << endl;
   cout << "-----------------------" << endl;
   cout << "* Enter alpha [0.0-1.0]: ";
   cin >> input;
   // ユーザの入力したalphaが0から1なら使う。
   if( input >= 0 && input <= 1 )
     { alpha = input; }
   src1 = imread( "../data/LinuxLogo.jpg" );
   src2 = imread( "../data/WindowsLogo.jpg" );
   if( src1.empty() ) { cout << "Error loading src1" << endl; return -1; }
   if( src2.empty() ) { cout << "Error loading src2" << endl; return -1; }
   beta = ( 1.0 - alpha );
   //ブレンドを行う
   addWeighted( src1, alpha, src2, beta, 0.0, dst);
   imshow( "Linear Blend", dst );
   waitKey(0);
   return 0;
}

```

[![LinuxLogo.jpg](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/data/LinuxLogo.jpg "LinuxLogo.jpg")](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/data/LinuxLogo.jpg)
LinuxLogo.jpg

[![WindowsLogo.jpg](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/data/WindowsLogo.jpg "WindowsLogo.jpg")](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/data/WindowsLogo.jpg)
WindowsLogo.jpg


注意：読み込んだsrc1とsrc2は加算するので、幅・高さ・型が一致している必要がある。

##説明
上記コードで

```cpp

beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
```
ブレンドを行う`addWeighted()`関数は

$dst=α⋅src1+β⋅src2+γ$

を計算する。ここでは$γ$は0.0。


##コンパイル

```
g++ sample.cpp -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui
```

[![result.jpg](https://docs.opencv.org/3.4/Adding_Images_Tutorial_Result_Big.jpg "result.jpg")](https://docs.opencv.org/3.4/Adding_Images_Tutorial_Result_Big.jpg)
こんな感じになる。