OmniAICreator/Qiita-1.07M huggingface dataset:
Railsコンソール終了時にエラーになる(Ralis チュートリアル)

#前提
RailsチュートリアルをAWS Cloud9を使ってやってます。
windowsで火狐使ってます。

#困ったこと
厳密には困ってはないのですが、Railsコンソール終了時にエラーが発生していました。
特に使えないわけではないですがちゃんと見てみることに。
以下出ていたエラーです。

```console
/usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb/ext/save-history.rb:98:in `initialize': Permission denied @ rb_sysopen - /usr/local/rvm/rubies/ruby-2.4.1/.irbrc_history (Errno::EACCES)
```

見てみると「/usr/local/rvm/rubies/ruby-2.4.1/.irbrc_history」に権限がないとのこと（Permission denied）。
「/usr/local/rvm/rubies/ruby-2.4.1」に飛んでファイルを確認すると
そもそもファイルがない。

```console
ec2-user:/usr/local/rvm/rubies/ruby-2.4.1 $ cd /usr/local/rvm/rubies/ruby-2.4.1/
ec2-user:/usr/local/rvm/rubies/ruby-2.4.1 $ ls -a
.  ..  bin  config  include  .irbrc  lib  patches.list  share
```

んでもう一回エラーを見ると「save-history.rb」でエラーが起きている。つまり履歴を出力しようとして落ちているかな～と推測（今までずっとエラーだったのでファイルがないのもそのせいかなと）。
ディレクトリ自体に権限がないのかなと思い、「/usr/local/rvm/rubies/ruby-2.4.1」の権限を確認。

```console
ec2-user:/usr/local/rvm/rubies $ ls -l
total 4
lrwxrwxrwx 1 root rvm   32 Dec  3 09:43 default -> /usr/local/rvm/rubies/ruby-2.4.1
drwxrwxr-x 6 root rvm 4096 Dec  3 09:43 ruby-2.4.1
```

今のユーザーに書き込み権限がなかったので、権限付与して確認。

```console
ec2-user:/usr/local/rvm/rubies $ chmod a+w ruby-2.4.1/
chmod: changing permissions of ‘ruby-2.4.1/’: Operation not permitted
ec2-user:/usr/local/rvm/rubies $ sudo chmod a+w ruby-2.4.1/                                                                        
ec2-user:/usr/local/rvm/rubies $ ls -l
total 4
lrwxrwxrwx 1 root rvm   32 Dec  3 09:43 default -> /usr/local/rvm/rubies/ruby-2.4.1
drwxrwxrwx 6 root rvm 4096 Dec  3 09:43 ruby-2.4.1
```

権限がついたのを確認できたので、Railsコンソールを起動して終了させると正常終了しました！
実際に問題のディレクトリ見ると今度は「.irbrc_history」がありました。

```console
ec2-user:/usr/local/rvm/rubies/ruby-2.4.1 $ ls -a
.  ..  bin  config  include  .irbrc  .irbrc_history  lib  patches.list  share
```

#感想
Linuxを今まで触ってこなかったので、ちょっとしたことでも解決に時間かかりますね。

##参考資料
[Linuxの権限確認と変更（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
OSSでの歌唱合成

https://adventar.org/calendars/3353 の14日目エントリーです。

## 歌唱合成エンジン

日本語をサポートする歌唱合成エンジンとしては初音ミクを始めとするVocaloidが圧倒的に有名ですが、Vocaloid以外にも歌唱合成エンジンは存在します。歌唱入力のフロントエンドとしてはVocaloid EditorやPiapro Studioの次あたりにUTAUが有名です。

https://ja.wikipedia.org/wiki/UTAU

UTAUはVocaloidのフロントエンドではなく、独自の歌唱合成エンジンを搭載しています（Wikipediaでは「音声伸縮エンジン部」と書かれている部分です）。標準で付いてくるのはresamplerと呼ばれているものですが、これはカスタマイズ可能になっており、実際にさまざまなエンジンが利用可能です。

https://www20.atwiki.jp/utaou/pages/65.html

さまざまな歌唱合成エンジンが存在しているのは、合成アルゴリズムの選択などで特徴が出せるからでもありますし、どのようなパラメーターを考慮するかで特徴が出るからでもあります。

UTAUで楽曲を作り込むと、制作者次第ではかなり人間の歌唱に近いものを作り出せますが、それを可能にしているのがこのような柔軟性です。

## 音声ライブラリの構築

音声ライブラリの作成作業は、サウンドフォントの作成作業に似ている部分があります。サウンドフォントでは、音色が変わりうる「ゾーン」について、サンプリングデータを割り当てていました。歌唱合成の場合は、発音記号に対応するサンプリングデータを用意する必要があります。

発音記号は、日本語の場合は基本的には50音図の構成に基づいて用意しますが、Vocaloidなどで打ち込んだ経験がある人であれば、実際には同じひらがなでも発音記号が少し違うものが何種類かあることを知っているかもしれません。仕様を決めるのは歌唱合成エンジンやエディタ次第ということになるでしょうが、簡単なものとしては、IPAの国際音声記号に準拠することになるのではないかと思います。

実際には、これに加えて、音声を子音と母音に分解して組み合わせたCVVC音源のようなものがあるわけですが、難しい話になって筆者も説明できる気がしないので、[日本語のWikipediaページ](https://ja.wikipedia.org/wiki/UTAU#%E9%9F%B3%E5%A3%B0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E6%A7%8B%E6%88%90)など、既に十分詳細にまとめられている情報を参考にしてもらえればと思います。筆者は[闇鳴ニュイ](http://nyui.web.fc2.com/)サイトでいろいろ知ることができました（表現力がすごいので是非チェックしてみてください）。

歌詞の中で使用されている発音記号に合致する音声が音声ライブラリの中にあれば、それを使用して再生することが可能なので、これを応用すると日本語以外でも歌唱合成が可能になります。筆者の台湾の知人にこれを利用して歌唱合成を中国語で実践しているグループがあり、彼らは日本語の資料を読みながら独自の音声ライブラリを構築しているようです（今は活発ではないので過去形のほうが適切かも）。

英語圏でもDiPhoneなどが使われているようで、筆者が先日参加してきたAudio Developers Conference (ADC) 2018でも歌唱合成のセッションで言及されていました。発音記号が複雑になったり連続音をサポートするようになったりすると、録音コストが膨大になるので、この辺りはその辺りでバランスを取りながら行うようです。

## world

歌唱合成エンジンのひとつとしてよく選ばれているらしい(?)、worldを取り上げます。

https://github.com/mmorise/World

Worldを取り上げたのは、ひとつにはライセンスがOSS準拠（修正BSD）でUTAU本体を含めてこの方面では珍しかったのと、先の台湾のグループではWorld系の派生実装tn_fndsが利用されていたことがあります。筆者はUTAUコミュニティを観察しているわけではないので、「よく使われている」かどうかは正直わかりません。

WorldはAPIの命名がほとんど「ジョジョの奇妙な冒険」の世界から来ていて、名前からは意図がサッパリわからないのですが（Worldそのものもですが関数名もCheapTrickだのHarvestだのStoneMaskだの…）、リポジトリ中のドキュメントである程度説明されています。

https://github.com/mmorise/World/blob/master/doc/readme_JP.txt

あとは、Worldの使い方をpyWorldVocoderで説明されている記事があって、これが参考になるでしょう（機械学習でパラメーターを与える可能性も紹介されています）。

https://qiita.com/ohtaman/items/84426cee09c2ba4abc22

## UTAU alternatives

クローズドソースで開発されているUTAUエディタのオープンソース代替を開発して、音声データベースや合成エンジンを再利用しようという動きはたまに見られました。

一番よく知られていたのはC#で書かれていた[Cadencii](https://github.com/cadencii/cadencii)だと思いますが、Vocaloid2のサポートを最後に更新されなくなりました。コードベースがWindows.Formsでその後.NETのUIフレームワークが混迷期にあったことや、Vocaloid2の頃までは仕様がそれなりにオープンだったということがあるかと思います。コードはWin32依存でした。Cadenciiのコードを再利用したforkがgithubにはいくつか存在しますが、おそらくWindows以外のプラットフォームで動作するのは[Java移植版](https://github.com/Icenowy/jcadencii)ではないかと思います。

エディタ以外も含む全ての構成要素を用意するプロジェクトもいくつかありました。Qtで開発している[Qtau](https://github.com/qtau-devgroup)というのがひとつあります。ただもう活動はしていないようです。もうひとつ[Rocaloid](https://github.com/Rocaloid)というプロジェクトもあるのですが、これは新バージョンと新サイトを構築中だというので、やはり活動していない状態です（これはそのうち再開するような雰囲気はなくもないです）。

最初に火をつけたCadenciiを除くと、このあたりのプロジェクトは非日本語圏で開発されているようで、海外からの関心がそれなりに高い分野であるようです。
不労所得を得るIoTデバイスをつくった

[IoTLT Advent Calendar 2018](https://qiita.com/advent-calendar/2018/iotlt_neo "IoTLT Advent Calendar 2018") 13日目の記事です

#はじめに
最近はVRやってます。@nokkii(pg_nokkii)です。常時200人待機しているえっちなVTuberとおしゃべりできるサービスやVRの研究に興味のある方はご連絡ください。
本当は先月、脳波でおっぱいの画像を生成するプロダクトを作ったので、アプリのシェアボタンを押したらドローンが飛び上がって遮蔽物の少ない空からEddyStone URLでおっぱい画像を散布するテロシステムを発表しようとしましたが間に合いませんでした。

間に合わせということで、スマートコントラクトとIoTを使って不労所得を得るシステム作った話をします。

##ブロックチェーンの発展と仮想通貨の栄枯盛衰
ビットコインでピザしか買えなかった時代からビットコインのことを知っています。その頃は大学生でしたが、国などの価値担保の無い通貨がこんなに価値を持つとは思っていませんでした。去年から今年の1月までは本当に楽しかったですよね。夢のような時間でした。僕もわずかながらバブルの恩恵に預かり、婚約指輪や３Dプリンタを買えたりしました。

すっかり盛り下がってしまった仮想通貨ブームですが、今でも熱心な開発者の方々が熱い想いを持ってNext Blockchainやスマートコントラクトプロダクトを開発されています。結果はどうあれ、バブルでブロックチェーンにお金と人が集まってよかった。これから通貨の値段が安定したらブロックチェーンプロダクトも安定して運用できることでしょう。投機の気が抜けてきたブロックチェーン技術の今後が楽しみです。

##不労所得に込めた思い
不労所得というと怪しい感じがしますが、ブロックチェーンのネットワークがここまで成長したのも、「投機」という自らが働かずにお金を稼ごうとするパワーやマイニングマシンという不労所得マシーンの存在があったからだと個人的には思っています。ブロックチェーンという新しく難しい技術をITエンジニアでもない沢山の方がゼロから勉強している姿を見て、ITリテラシーを高めるスパイスとして不労所得とはなんてパワフルな動機なのだろうと私は感動しました。原理主義的には仮想通貨ウォレットの秘密鍵はユーザが高いリテラシーのもと管理する必要がありますし、大小はあれどほかのIT技術に触れるときも高いリテラシーが求められています。ひとつのアプローチとして不労所得はリテラシー向上に効果的な面白いインセンティブだと思います。

##Passive Income
技術が発展して昔の何倍もの効率で人が働けるようになりました。人々は働かなくて良くなったでしょうか。超高性能なロボットにコンビニのバイトに行ってもらう未来は来るでしょうか。高価なロボットが働く未来には資本が参入し、貧富が埋まることはないでしょう。私は「低価格で買うだけで儲かるロボット」を作りたいと思いました。この企画を思いついたのですが、私は忙しくこの企画を実現する機会を狙っていました。ちょうどそこでインターン生が来てくれたので変わりに作ってもらうことにしました。こうして生まれたのがPassive Incomeです。

![20180928163559.png](https://qiita-image-store.s3.amazonaws.com/0/40630/7d69cd3d-d8bb-a81c-8144-1c0594d36a24.png)
このプロダクトはカメラで撮った映像をストリーミング配信するデバイスと、動画を販売するマーケットサーバ、ストリーミング動画をスケールさせる配信サーバで構成されています。

まず、デバイスは沢山の場所に存在でき、その場所でセンシングした情報を価値にするIoTの特性を活かし、動画をストリーミング配信します。ストリーミングが可能な状態になると、デバイスの配信している動画の情報がマーケットに登録されます。ユーザがマーケットからスマートコントラクトで決済(サービス運営者のコントラクトなので運営者のコントラクトに配信者名義で仮想通貨が貯まる)をすると、ユーザは1日のアクセスコード付きのURLを得ることができます。ストリーミングを始めると一人目のユーザのアクセス時の名前解決は配信者のデバイスのIPとなり、CtoCで直接配信されます。

デバイスの回線状況によっては複数人への動画配信は回線負荷が大きすぎます。デバイスがペイできると判断した場合、デバイスは配信サーバにスマートコントラクトで自らの稼ぎの一部を分け(サービス運営者のコントラクト上の自分のamountをサービス運営者に分ける)、配信サーバのIPで名前解決をするように要請します。このタイミングでユーザがきた場合、配信サーバはデバイスから動画をストリーミングし、ユーザに動画を中継します。

##スマートコントラクトを使う意味
スマートコントラクトの本来の意味は契約を司る検証、執行、実行、交渉を行うところにあり、一見するとスマートコントラクトを使う意味はないように見えますが、このシステムではサーバとの契約を自動で行えることや、動画に問題があった場合に配信者、配信サーバの所有者双方から動画の配信を打ち切れるコントラクトになっています。自動で契約を行ってお金を支払うだけ。クラウドサービスやWebサービスにスマートコントラクトのインターフェースができて、AIやデバイスが自律的にそれらを活用できるようになるだけでも人間の限界を超えてビジネスが行えるような気がしませんか？スマートコントラクトにはそういう用途で注目しています。

##リリース
現状、メインチェーンにデプロイできていない(Testnetにはあがってますよ)のと、動画配信サーバからPullで動画を取ってこれる仕組みになっていないのでリリース時期は未定です。
こういうプロダクトがたくさん出てくればもっと盛り上がるのにな〜と思っているので、このアイディアに刺激を受けた方はなんかつくってみてください〜


未完成ですが、参考になれば
https://github.com/yebisu14/passiveIncome
django+Celeryによる非同期処理について

# はじめに
[Gaiax Group Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gaiax-group)の13日の記事です。ギリギリロスタイム以内なので13日目です。（すみません）

最近Djangoで開発したアプリケーションの中でジョブキューを使いたいシチュエーションがあったのでCeleryを用いて実現ししました。その際に学んだことについて備忘録的に記録しておきたいと思います。
django+Celeryの環境構築についてはいろんな記事があると思いますので、私が勘違いしたりなどして詰まった部分などを中心に共有します。

# そもそもジョブキューとは
ジョブキューとは読んで字のごとく、何かしらの処理（ジョブ）をキューと呼ばれる先入れ先出しのリストに登録して順番に処理していくものです。主にウェブアプリケーションなどで、例えばクロールやcsv吐き出しなどの実行に時間がかかる重い処理がユーザからリクエストされた際などに利用します。
具体的には以下のようなイメージです。

![HrpqQCaa5sYDvvHU-28CBF.png](https://qiita-image-store.s3.amazonaws.com/0/45273/ff073e7d-bbc7-c72a-3f26-d69b77c81fd9.png)
参照：[ヌーラボのサービスを支える動脈「 ジョブキュー 」の仕組みを紹介します！](https://nulab-inc.com/ja/blog/nulab/jobqueue-messagequeue/)

このように、ユーザーからのリクエストに対するレスポンスをジョブキューにジョブが登録されたタイミングで返すことで、ユーザーに重い処理が実行されている間レスポンスを待たせず、裏で処理を走らせることができるようになります。

# Celeryを使う際に出てくる用語
次にCeleryを扱う上で最低限理解しておくべき用語を整理します。

## celery
[celery](https://celery.readthedocs.io/en/latest/)とはpythonのジョブキュー処理フレームワークです。workerと呼ばれるdeamonプロセスを待機させて非同期処理の仕組みを作ったり、beat deamonを起動してジョブの定時実行を行ったりできます。（定時実行についてはdjangoを利用する場合は[django-celery-beat](https://github.com/celery/django-celery-beat)というライブラリを使うと制御が簡単になるのでオススメです。）

## Broker
[Broker](https://celery.readthedocs.io/en/latest/getting-started/brokers/index.html)はジョブキューの根幹となるメッセージを受け取ってqueueに登録し、queueからworkerにジョブメッセージを渡す部分です。BrokerにはRabbitMQ、Redisなどが指定できます。

## Result Backend
[ResultBackend]()はタスクを追跡したり、または戻り値が必要な場合にタスクの実行結果を格納しておく部分です。

## Consumer（worker）
キューからのメッセージを受け取って実際に処理を行うプロセスです。
以下のコマンドで立ち上げることができます。

```
$ celery -A [project_name] worker -l info
```

## queue
クライアントから受け取ったジョブを登録しておくキューのことです。
workerを立ち上げる時に任意のqueue名を指定することで、workerとqueueを紐づけることができます。
何も指定せずにworkerを立ち上げた場合は、デフォルトで設定されている「celery」という名前のqueueに全てのジョブが登録されます。

```
$ celery -A [project_name] worker -l info -Q [queue_name]
```

また、concurrencyを指定することでそのqueueに登録されているジョブを幾つのworkerに処理させるかを指定できます。（デフォルトではお使いのPCで利用可能なCPU数が設定されています）

```
$ celery -A [project_name] worker -l info -Q [queue_name] --concurrency=10
```

ちなみに、この立ち上げたqueueに対してジョブを格納する際には、以下のようにジョブを定義する際にqueueを指定することで任意のqueueにジョブを登録することができます。

```task.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task(queue='queue_name')
def sample_task(self, name):
    print(f"hello {name}")
```

もしくは、ジョブを呼び出す際に以下のように指定することでも同様に任意のqueueにジョブを登録することができます。

```python3
sample_task.apply_async(args=["name"], queue='queue_name')
```

# RabbitMQを利用している際のこれらの概念の関係性
最後に、Broker・ResultBackend・worker・queue・（concurrency）の関係性を図にまとめると以下のようになります。

![celery_architecture_final.png](https://qiita-image-store.s3.amazonaws.com/0/45273/e723c133-d806-5758-bce0-3e90b00b98dd.png)

参照：[Python Celery & RabbitMQ Tutorial](https://tests4geeks.com/python-celery-rabbitmq-tutorial/)

# おわりに
今回はdjangoでのジョブキュー実装によく利用されているceleryについてまとめてみました。
最近勉強会などで登壇することは増えてきたのですが、qiitaなどへの記事投稿が滞っていたなあと思っていたので、これを機にちょっとずつ投稿していこうかな〜と思いました。
Hyperledger Fablicについて

#Hyperledger Fablicとは
- コンソーシアム型ブロックチェーン
 - コンソーシアム型とは共同体に参加するグループだけが参加できるブロックチェーン
 - 貿易における書類の共有、複数の金融機関で決済用に使うなどのユースケースがある
 - 公式サイト: https://www.hyperledger.org/projects/fabric
 
![big_main10005190_20181028151327270889.jpg](https://qiita-image-store.s3.amazonaws.com/0/282179/413e3426-a7af-bec9-f391-f9261144d145.jpeg)

 
- コンセンサス方式
 - パブリックブロックとチェーンでみられる「マイニング」の概念がなく, 特定のグループだけが参加できるネットワークを形成するので各組織の合意を得るだけ.
 - そのためトランザクションを迅速にさばける, ファイナリティを確保できる.
 - コンセンサス - 分散台帳の更新とトランザクション記録についての合意
 - ファイナリティ - 経済用語. ブロックチェーン関係の話では「ブロックの正当性を最終的に確定した状態」を指す.

- トランザクション実行後の最終状態の保持

 - StateDBというデータストアにトランザクション実行した結果得られる最新の状態(貿易の場合は物資の経路の記録など)を保持する. ビットコインなどのように全トランザクションを参照することなく, その時点での状態を確認できる.

      
以下ブロックチェーンをBC, Hyperledger Fablic SDKをSDKと省略することがある.

##Hyperledger Fablicの構成要素
- Hyperledger FablicClient SDK
 - クライアント用のSDK
 - Hyperledger Fabricの機能を利用するためのAPIが提供されている
 - トランザクションを実行できる
 
- Organization
 - ネットワークに参加する組織を表現する単位
 - 後述するピアやオーダラーが含まれる

- Peer(ピア)
 - Organization内のノードを表す単位
 - ブロックチェーン, StateDB, チェーンコードを保有
 - Endorser, Committerの役割を持つ
 - Endorser - トランザクションに同意する
 - Committer - トランザクションと実行結果の妥当性を確認してStateDBとBCを更新する
 
- Orderer(オーダラー)
 - Endorserによって同意されたトランザクションの結果をブロックチェーンとStateDBに書き込む順番を決める
 - ネットワーク上の全てのトランザクションを制御する

- チェーンコード(Chaincode)
 - スマートコントラクトを実行するプログラム
 - 現在node.js, go, javaで書ける

- State DB
 - トランザクション実行後に得られる最新の状態(残高とか)を格納するデータストア
 - LevelDBというKEY-VALUE形式のものやApache CouchDBというJSON形式のものが利用できる
 
- MSP(メンバーシップサービスプロバイダ)
 - Hyperledger Fabricが提供するCA(認証局), または外部のCAと連携してユーザーの登録, ユーザー証明書(Ecert)の発行を行う
 - 各OrganizationでそれぞれMSPを実装できる

- Endorsement Policy
 - BCやStateDBを更新するために同意(Endorsement)が必要なOrganizationにポリシーを規定するもの
 - 「A社の合意のみが必要」などのルールが決めれるということ

- チャネル(Channel)
 - ネットワークを分割したネットワーク
 - 各チャネル内で同一のStateDBとBCを保持する
 - A社、B社、C社が参加するネットワークにチャネル1, ２があるとする
 - A社はチャネル1と２, B社はチャネル１, C社はチャネル2に参加しているとすると3社は参加しているチャネルのStateDBとBCを持つ(複数のStateDBとBCを持つことがある)

##トランザクション処理の流れ
1. SDKを利用するクライアント(webアプリケーションなど)からチェーンコードの実行がリクエストされる(Transaction Proposal). Endorsement Policyのポリシーに従って対象のOrganizationのピア(Endorser)に対して要求される. ピアはBC, StateDB, チェーンコードを持つことを思い出そう.

2. Endorser(トランザクションに同意する人)がチェーンコードをシミュレートする. この時はStateDBへの書き込みを行わず, RWset(Read/Write set)を発行する. RWsetはチェーンコードをシミュレート時の読み込み対象と書き込み対象のキー項目とバージョン番号, 書き込む値を格納する.

3. Endorserが署名したRWsetをクライアントに応答する. これによってトランザクションはOrganizationから認められたものとなる.

4. SDKは対象のOrganization内の署名つきRWsetによりEndorsement Policyが満たされることを確認する. この情報を元にOrdererにトランザクションの制御を要求する. 

5. Ordererはトランザクションの順番を決める. 順番が決められたトランザクション(署名つきRWset)はネットワーク内のピア(Committer)に送られる. 

6. Committerがトランザクション(署名つきRWset)を検証. 成功するとStateDBとBCを更新する. 検証としてはRWsetに入っているキー項目のバージョン番号とStateDBのキー項目のバージョン番号が同じであるかをチェックする. 

7. Committerはトランザクションの検証が成功したか否かを, イベントを発行してクライアント側に通知する. 検証に失敗したら対応が必要になる.

##感想
なんか複雑だなと思ってまとめてみたがやっぱり複雑だった. パブリックブロックチェーンと違っている点が多々あり面白いと感じた. パブリックでやる必要がない部分やパブリックでやることがNGな領域(貿易など)で活躍すると思う. 

##参照
～ブロックチェーンの革新技術～ Hyperledger Fabricによるアプリケーション開発
https://www.amazon.co.jp/dp/B07JNY46ZS/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
URIの構築をいい感じにする

[Dart Advent Calendar 2018](https://qiita.com/advent-calendar/2018/dart) 13日目の記事です。

本当はAngularDartの事書こうと考えてたんですが~~仕事とか飲み会とかで~~思うように時間が取れなかったのでURIライブラリーの事を簡単に書きます。

## ざっくり説明

　プログラム書いていると何処ぞのサーバーにリクエストを送ったりすると思うのですが、その時指定するURIを単純に文字列で連結させたりしていると柔軟性に欠けたりするため、URIの構築をオブジェクトを操作しながらプログラミング出来るようにするためのライブラリーです。Builderを使ってDartコアライブラリーにおけるURIを生成するのですが、このURIは現状だと動的なURI生成にはちょっと不便な所があるのでこのようなライブラリーを使うと良い感じでプログラミング出来るかと。
　　
ソースは[こちら](https://github.com/google/uri.dart)
pubは[こちら](https://pub.dartlang.org/packages/uri)

　ちなみに似たようなライブラリーに[fluri](https://github.com/Workiva/fluri)というのがあります。以前はこちらを使っていたのですが最近は今回紹介する方のライブラリーを使ってます。

## pubspec.yaml
　下記のようにpubspec.yamlにuriの依存関係を追加します。

```yaml
name: uri_sample
environment:
  sdk: '>=2.0.0 <3.0.0'

dependencies:
  uri: ^0.11.3+1
```

## 使い方

### URI構築
　基本的な使い方はDart特有のメソッドカスケーディングを活用してBuilderを操作してく感じです。

#### 絶対パス
```dart
import 'package:uri/uri.dart';

void main() {
  var builder = UriBuilder()
    ..scheme = 'http'
    ..host = 'localhost'
    ..port = 8080
    ..path = 'sample'
    ..fragment = 'test'
    ..queryParameters['param1'] = 'value1';

  print(builder.build().toString());
}
```
出力結果は下記です。

```
http://localhost:8080/sample?param1=value1#test
```

#### 相対パス
相対パスを構築したい場合は単純にhostとかを設定しなければOKです。

```dart
void main() {
  var builder = UriBuilder()
    ..path = 'sample'
    ..fragment = 'test'
    ..queryParameters['param1'] = 'value1';
  print(builder.build().toString());
}
```
出力結果は下記です。

```
sample?param1=value1#test
```

#### URLエンコーディング
これはこのライブラリーというかDartのUriクラスの恩恵です。（UriBuilder#buildにてUriが取得出来るため）

```dart
void main() {
  var builder = UriBuilder()
    ..scheme = 'http'
    ..host = 'localhost'
    ..port = 8080
    ..path = 'テスト'
    ..queryParameters['param1'] = '値';
  print(builder.build().toString());
}
```
出力結果は下記です。

```
http://localhost:8080/%E3%83%86%E3%82%B9%E3%83%88?param1=%E5%80%A4
```

#### build()を省略
単純に文字列にしたい場合はUriBuilder#toStringを呼びだせばOKです。（内部で`build().toString()`している）

```dart
void main() {
  var builder = UriBuilder()
    ..scheme = 'http'
    ..host = 'localhost'
    ..port = 8080;
  print(builder.toString());
}
```
出力結果は下記です。

```
http://localhost:8080
```

今回は以上になります。
【Unity(C#)】Inspectorをきれいに

　　
　　
　　
　　
この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。
　　

##Inspectorをきれいにする

デバックとかで便利なのもあるので忘れないように書いときます。

| コード       |    機能    |  
|:-----------------|------------------:|
| [HideInInspector]           |              表示しない|       
|[Header("string header")]        | 指定した変数の上にheaderを表示 |       
| [Space(float hight)]           |    hight分のスペースを空ける |       
|  [Tooltip("string tooltip")]               | カーソル合わせるとtooltipを表示 |         
| [Range(float min,float max)]            |  min~maxの範囲のスライダーを表示 |       
| [Multiline(int line)]          |  line分の改行が可能 |      


```C#
    [HideInInspector]
    public int g;

    [Header("なんとかかんとか")]
    public GameObject nantokakantoka;

    [Space(100)]

    [Tooltip("説明文っぽいのが出る")]
    public string setsumeibun;

    [Space(50)]

    [Range(0, 100)]
    public float slider;

    [Multiline(3)]
    public string kaigyou;
```
![Inspector design.png](https://qiita-image-store.s3.amazonaws.com/0/244071/17273761-e2bd-a071-c6c5-a87a851b07ab.png)

いつの日か、
Editorいじってバキバキに改造したい。

---------

2019/3/26　追記

超簡易HelpBox↓

```C#

#if UNITY_EDITOR
[CustomEditor(typeof(編集したいクラス名))]
public class HogehogeCustomWindow : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        EditorGUILayout.BeginVertical(GUI.skin.box);
        {
            EditorGUILayout.HelpBox("おまえはもうしんでいる", MessageType.Info);
        }
        EditorGUILayout.EndVertical(); //2019/10/08 追記　これで閉じないと警告が出まくる　
    }
}
#endif
```

次使うとき忘れそうなことメモっとくと良さそう。

---
2019/10/08 追記

`base.OnInspectorGUI();`を書くことで
もともとInspectorに表示されていたパラメーターを表示することができます。
なので、最初に書くとヘルプボックスは下に、最後に書くとヘルプボックスは上に出てきます。


---
2019/04/20　追記

Editor上にボタンを作成して、
押下時にメソッドを呼んで処理を走らせることができます。

```C#
#if UNITY_EDITOR
    [CustomEditor(typeof(拡張したいクラスの名前))]
    public class Debug : Editor
    {

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            EditorDebugTest _RootClass = target as 拡張したいクラスの名前;

            //少しスペースを空ける
            EditorGUILayout.Space();

            // 押下時に実行したい処理
            if (GUILayout.Button("Inspectorに表示されるボタン名"))
            {
                _RootClass.実行したいメソッド;
            }
        }
    }
#endif
```

[Editor上でDebug](https://qiita.com/OKsaiyowa/items/b285ccf9e12f11fbebfc)等にも使えて、便利機能として重宝してます。

---
2019/10/07　追記
`namespace`(using～のところ)にこれ書いときましょう。

```C#
#if UNITY_EDITOR
using UnityEditor;
#endif
```
Rails5.2でデフォルトで追加されるようになったReferrer-Policyヘッダについて調べた

Rails5.2で、`Referrer-Policy`ヘッダがデフォルトで`strict-origin-when-cross-origin`に設定されるようになりました。

> [Add 'Referrer-Policy' header to default headers set](https://github.com/rails/rails/commit/428939be9f954d39b0c41bc53d85d0d106b9d1a1)

`Referrer-Policy`についてよく知らなかったため、主に[MDN Web Docs - Referrer-Policy](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referrer-Policy)を読んで理解したことをまとめていきます。

## リファラポリシーとは
`HTML5.2`から追加された仕様です。
遷移先にリファラを送信する際のポリシーを指定できます。

### 対応しているHTML要素
`<a>` `<area>` `<img>` `<iframe>` `<link>` タグがリファラポリシーに対応しています。

### ブラウザの対応状況
[MDN Web Docs - ブラウザーの対応](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referrer-Policy#Browser_compatibility) を見たところ、
`Edge`、`Internet Explorer`、`Edge Mobile`、`iOSのSafari`では未対応のようです。
その他のブラウザでも、バージョンによっては対応していない場合があります。


### 指定できるポリシー

指定できるポリシーと、送信されるリファラの内容は下記となります。

| ポリシー | 送信する内容 |
|:---|:---|
| `no-referrer` | 常に送信しません。 |
| `no-referrer-when-downgrade` | `HTTPS` → `HTTP` には送信しません。<br />プロトコルのセキュリティレベルが同一以上であれば URL全体 を送信します。<br />**ポリシーが指定されていない場合の既定の動作**です。  |
| `origin` | 常に オリジンのみ を送信します。 |
| `origin-when-cross-origin` | 同一オリジン間では URL全体 を送信します。<br />その他の場合は オリジンのみ を送信します。 |
| `same-origin` | 同一オリジン間では URL全体 を送信します。<br />その他の場合は送信しません。 |
| `strict-origin` | `HTTPS` → `HTTP` には送信しません。<br />プロトコルのセキュリティレベルが同一以上であれば オリジンのみ を送信します。 |
| **`strict-origin-when-cross-origin`** | `HTTPS` → `HTTP` には送信しません。<br />同一オリジン間では URL全体 を送信します。<br />プロトコルのセキュリティレベルが同一以上であれば オリジンのみ を送信します。<br />**Rails5.2でデフォルトで設定されるようになったポリシーです。** |
| `unsafe-url` | 常に URL全体 を送信します。  |

#### オリジンとは

プロトコル・ホスト名・ポート番号 の組み合わせです。
全て一致していれば同一オリジンですが、どれかが異なればクロスオリジンとなります。

詳しくは[MDN Web Docs - 同一オリジンポリシー](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy#Definition_of_an_origin
)を参照すると良いでしょう。

### HTTPヘッダ以外でも指定ができる

#### `meta`要素で指定
```html:meta要素で指定
<meta name="referrer" content="origin">
```

#### 各要素ごとに指定
`<a>` `<area>` `<img>` `<iframe>` `<link>` 要素では、各要素ごとに`referrerpolicy`属性を指定できます。

```html:referrerpolicy属性で指定
<a href="http://example.com" referrerpolicy="origin">
```

また、 `<a>` `<area>` `<link>` 要素では、リレーション属性でも指定可能です。

```html:rel属性で指定
<a href="http://example.com" rel="noreferrer">
```

#### 優先順位は？

[WHATWG - Referrer policy attributes](https://html.spec.whatwg.org/multipage/urls-and-fetching.html#referrer-policy-attributes)によると、以下の順序でリファラポリシーが決定するようです。

1. `rel`属性
2. `referrerpolicy` 属性
3. `<meta>`要素
4. `Referrer-Policy`ヘッダ

Rails5.2でデフォルトで指定されるようになった`Referrer-Policy`ヘッダは、一番優先順位が低いため、`<meta>`要素等で指定されていればそちらが優先されるようです。

## Railsで`Referrer-Policy`ヘッダのポリシーを変更する方法

`Referrer-Policy`ヘッダのポリシーを変更する場合は、
`config/application.rb`や`config/environments/*.rb`で、以下を追加すれば変更できます。

Rails5.2以前のバージョンでも、必要に応じて適切なポリシーを設定すると良いですね。
ページごとに異なる場合は`<meta>`タグで指定すれば良さそうです。

```ruby
# リクエストヘッダに含める Referrer-Policy を no-referrer-when-downgrade に変更する
config.action_dispatch.default_headers['Referrer-Policy'] = 'no-referrer-when-downgrade'
```

## まとめ

サイト運営者側としては、リファラを辿れば様々な情報が取得できるため便利ですが、
プライバシーの保護やセキュリティ面を考えると、リファラポリシーを制御することも大切だなぁと感じました。

よく「HTTPSからHTTPに遷移する際にはリファラが送信されない」というような記事を見て、そういうものなのだと何となく思ってしまっていましたが、リファラポリシーの挙動が分かったことにより理解が深まったので良かったです。

最後までお読みいただき、ありがとうございました。
[cocoa][swift]MOSA のについて

<p>Cocoa.swiftは、MOSAとCocoa勉強会 関東の共催です。<br />
このMOSAについて説明します。</p>

<p>MOSAはmacOS/iOS/watchOS/tvOSに関係する人々が参加するコミュティです。<br />
macOS/iOS/watchOS/tvOS関連の業界の活性化に貢献することを目的に活動しています。</p>

# 沿革
<ul>
<li>1995年に任意団体 'Macintosh OS Software Association' として設立される。</li>
<li>2004年に特定非営利活動法人となる。</li>
<li>2007年に「ソフトウェア・アーティスト宣言」を行い、これを機に 'MOSA' を 'Multi-OS Software Artists' の略とする。</li>
<li>2018年に特定非営利活動法人を解散して、任意団体となる。</li>
</ul>

# 活動内容

## 勉強会
<p>Cocoa勉強会 関東 と合同で定期的に勉強会を開催しています。</p>
<ul>
<li>BUKURO.swift<br />
東京 池袋で開催されるmacOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>関東.swift勉強会<br />
macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
</ul>

## Webマガジン
<ul>
<li><a href="https://note.mu/mosa_media/m/me339a1d6e3f2">Application Engineer Journal "猛者"</a></li>
</ul>

## イベント
<ul>
<li><a href="https://mosa.connpass.com/event/85556/">The Bash in Tokyo</a><br />
MOXSSGとCocoa勉強会 関東と合同で開催します WWDCの合同勉強会です。</li>
<li>MSM<br />
年に1回、2日間に渡って開催され、集中的な技術セッションが行われる、技術習得と親睦交流を目的としたミーティング。</li>
</ul>

# 過去の活動内容

## セミナーやイベント
<p>技術解説を主としたセミナーを開催する。</p>

## MSM (Macintosh Software Meeting)
<p>年に1回、2日間に渡って開催され、集中的な技術セッションが行われる、技術習得と親睦交流を目的としたミーティング。 略は、その後、MOSA Software Meetingや、MOSA 湘南 Meeting と変わってきている。</p>

## WWDCツアー
<p>米国Apple社が主催する開発者向けイベントWorldwide Developers Conferenceへの割安ツアーを催すほか、事前交流会や報告会などを行う。</p>

## DEMOsa
<p>製品やソフトウェアにまつわるアイデアやデザインに関するデモンストレーションを、一人10分間のリレーで行うというイベント。</p>

## MOSAメンバーズカフェ
<p>年に数回不定期で催される、会員間の交流や情報交換を目的としたオフラインミーティング。</p>

## ビジネスマッチング
<p>企業による開発者（開発社）の募集を会員に紹介する活動。</p>

## テクニカルドキュメント要約ライブラリ
<p>技術文書を要約（翻訳）してウェブサイト上に公開する活動。アップルの承認と協力のもと、同社の技術文書が中心に要約されている。</p>

## MOSA Developer News（MOSADeN、MOSA伝）
<p>技術解説やコラムなどの連載記事、レポート、ニュースなどを掲載した週刊のメーリングリスト。</p>

## MOSAic
<p>開発者向けのニュースに解説を交えて取りまとめた日刊のウェブサイト。</p>

## MOSA de BB
<p>会員間で情報交換や交流を行うウェブ上の掲示板。</p>

## MOSA Exchange
<p>会員間で資料やプログラム、ソースコード等の交換を行うウェブサイト。</p>

## mosa entrance
<p>プログラミング入門・初級レベルの会員相互のコミュニケーションを目的としたオフラインミーティング。</p>

## MOSA Tech Meeting (MTM)
<p>開発技術の情報共有を目的とした会費制のオフラインミーティング。</p>

## MOSA自習室
<p>会員間の交流を目的として、時期と場所を固定したオフラインミーティング。</p>

## MOSAメールマガジン
<p>技術解説やコラム、レポート、ニュースなどを掲載したメールマガジン。</p>

## PubHack.swift
<p>Cocoa勉強会 関東 と合同で開催する交流会。</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/111294/">Cocoa.swift 2019-01</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
MyBatisの条件分岐(<if>など)で文字列リテラルを利用する際の注意点

現場でハマっていた人がいたので・・・メモっておきます。

# ハマっていた事象は？

パラメータオブジェクトのプロパティ値（String型）に応じて組み立てるSQLを変更するために、MyBatis提供の `<if>` タグ を使用して以下のような条件分岐を組んでいた。

```java:パラメータオブジェクト
public class MyParam {
  private String status;
  // ...
}
```

```xml:マッパーXML（断片）
<if test="status == '0'">
  ...
</if>
```

開発者の想いとしては・・・ `status`の値が`"0"` の場合に特定の条件を加えたかったのですが・・・実際にはこの条件が `true` になることはなかったのです。

# なぜか?

MyBatisは `test`属性に指定された値を[OGNL式](https://github.com/jkuhnert/ognl)として評価するのですが、OGNL式的には`'0'`は`String`ではなく`Character`として扱うようで、型が異なる値の比較となり常に `false` になってしまうというオチでした。

気になるのは・・・この動作は仕様なのか？という部分ですが・・・
MyBatisが利用している[OGNLライブラリの言語リファレンス](https://github.com/jkuhnert/ognl/blob/master/docs/LanguageGuide.md#constants)を見ると・・・・

> * String literals, as in Java (with the addition of single quotes): delimited by single- or double-quotes, with the full set of character escapes.
> * Character literals, also as in Java: delimited by single-quotes, also with the full set of escapes.

と記載がありました。明示はされていませんが・・・

* `'0'` -> `Character`
* `'00'` -> `String`
* `"0"` -> `String`
* `"00"` -> `String` (当たり前ですが・・)

ということなのかなと・・・。

# じゃあ・・・ダブルクォーテーションで括る？ → :thumbsdown:

```xml:マッパーXML（断片）
<if test="status == "0"">
  ...
</if>
```

皆様ご存知の通り・・・（当たり前なのでが・・・）上記の記載はXMLとして成立しません。でも「ダブルクォーテーションで括る」というアプローチは間違ってません。

# XML属性の括り文字を変えればいんじゃね！？ → :thumbsup:

色々解決方法はあるのですが・・・わたしが直感的かな〜と思ったのは・・・XML属性の括り文字を「`"`」から「`'`」にし、`test`属性の値の中で「`"`」を使えるようにするというものでした。

```xml:マッパーXML（断片）
<if test='status == "0"'>
  ...
</if>
```

# 他の解決方法は？

もちろん他にも解決方法はあります。

## 定数の利用

文字列リテラルを直接指定せず、定数化してOGNL式の中で参照することができます。
実は・・・この方法があるべき姿なのかもしれませんね。

```java:定数クラス
package com.example.domain;
public class Status {
  public static final String STOP = "0";
  // ...
}
```
```xml:マッパーXML（断片）
<if test="status == @com.example.domain.Status@STOP">
  ...
</if>
```

## 実体参照の利用

文字列リテラルの括り文字を「`"`」の実体参照「`&quot;`」にすることでOGNL式側には「`"0"`」と認識させることができます。ただし・・・見てわかる通り・・・可読性はかなり低くなります。

```xml:マッパーXML（断片）
<if test="status == &quot;0&quot;">
  ...
</if>
```

## toStringの利用

OGNL式はメソッドを呼び出すことができるので、`Character#toString()`を呼び出して`Stirng`へ変換することができます。う〜ん・・・、動くけどなんか負けた感が半端ない・・・

```xml:マッパーXML（断片）
<if test="status == '0'.toString()">
  ...
</if>
```

# まとめ

ちゃんと定数設計ができていれば、定数を利用するのが良さげですが・・・今回は「文字列リテラルを利用する前提」でエントリーを書いたので・・・「XML属性の括り文字を「`'`」にする」方法をイチオシにしました。
ちなみに・・・ハマっていたエンジニアは「toStringの利用」での解決方法をネットで見つけて修正案として提案してきたんですけどね・・・
家族の愛oT！ファミリーテック♪

皆さまはじめまして、くろさきみほともうします。
中1・小4の息子2人を育てながら、広報として働いています。

ちょうど1年前くらいにGoogle Homeを買って「ついに我が家もIoT！」と浮かれたのも束の間、イマイチ使いこなせてなくて、ほかの家庭のIoT事情を知りたくなり、「ファミリーテックIoT LT」イベントをスタートしました。

「ファミリーテックIoTLT」は、実はまだ2回しか開催できていないのですが、パパママたちの愛情あふれるLTにいつもほっこりしています。

ママだけじゃなくて、パパたちが、家庭のあるあるとか悩みを、IoTものづくりでユニークに解決してるのがびっくりなのです。

登壇LTをちょっとご紹介します！

●お片づけをさせるロボット「キレイスキー」 家庭の問題を解決するロボットを作る委員会
![37954431_1747271235364796_7470644188854353920_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/53b309da-41fe-c812-b9d0-053043dddf6c.jpeg)
●料理の『適量』に挑み、返り討ちにあった話 
![37953471_1747271275364792_7982281218802581504_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/3b393cea-934e-716f-a133-2f4f0a95f0a0.jpeg)
●家族の誕生日に作って祝うことを5年間本気でやってみた
![37886222_1747271232031463_3144170215361740800_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/614b1b4e-2c07-9b74-5799-7d3f0237f900.jpeg)
●離れた家族に、おつかれさま！遠隔お酌！
![38014735_1747271318698121_4005425292670664704_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/ea441b0f-2f75-b9f4-e2f2-847bad42aada.jpeg)


その他にも
●こどもの見守りIoT
●親子でたのしむ「IoTやる気スイッチ」の作り方
●酷暑を乗り切る熱中症予防IoT
●身近なモノで家庭IoTにチャレンジ
●夫婦の問題はSlackとIFTTTでだいたい解決する


第2回目は、大人 LTの横で子どもたちがわいわい電子工作、という和やかな雰囲気で進行しました。
小1から中1まで、子どもたちのパワーはやっぱりすごい！大人 LTのデモンストレーションにも「これなあに？どうやってやるの？」と、興味津々にトライしてる様子が印象的でした✨

●勉強したくなる！まほうの生き物ペン♪
![43222186_1842372649187987_6119124362848108544_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/385e393d-acf8-e3d9-a2d8-18ad8c4d1163.jpeg)
●「子育テック」テクノロジーで育児を効率化するのと、手間暇＝愛情という気持ちのバランスについて
![43238520_1842372425854676_6887314319260778496_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/0f694ad6-79f4-5c7d-3f50-dcd44a62e314.jpeg)
●おとうさんにまかせろ！ダイソーでできるプラレールIoT
![43294867_1842372582521327_1031429421107511296_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/bdbb9e92-1b4f-f61b-9410-db674f4c5201.jpeg)
育児を属人化(ワンオペ)させないノウハウ！目から鱗
![43198612_1842372472521338_6041587674735706112_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/310128/4ee5b009-52a8-5f7a-a66c-8ee28692adb6.jpeg)



他にもたくさんLTありました！
テクノロジーで家族や夫婦の絆をもっと強いものに♪

第3回、年明けにやりたいです！
Terraformを使ってAWS CodeCommit プロジェクトリポジトリの作成とIAMグループの作成

Terraformを利用してGit運用できる環境構築になります

* Gitリポジトリの作成
* 複数ユーザで運用するためのIAMグループの作成
* AWSコンソールからユーザを手動で作成

## Terraformのインストールについて

過去の記事を参考にインストールしてください
https://qiita.com/acron/items/d47a634852036ed3ce04

## リポジトリの作成

リポジトリ管理のファイルを作成します
※まだちゃんと運用していないのでベストなまとめ方なのか模索中

````sh:aws_codecommit_repositorys.tf
#
# CodeCommit Repositorys
#
resource "aws_codecommit_repository" "hoge" {
  repository_name = "hoge"
  description     = "テストリポジトリ"
}
````

## Git運用できるユーザーグループの作成

````sh:aws_iam_groups.tf
#
#  IAM Groups
#
resource "aws_iam_group" "group_codecommit" {
  name = "codecommit_group"
}
````

````sh:aws_codecommit_policy.tf
resource "aws_iam_group_policy_attachment" "group_codecommit-attach" {
  group      = "${aws_iam_group.group_codecommit.name}"
  policy_arn = "arn:aws:iam::aws:policy/AWSCodeCommitPowerUser"
}
````

## Git運用するユーザーの作成

* AWSコンソールを利用してIAMから作成
  * 先程作成したグループに所属させます 

1. 【ユーザー追加】ボタンから作成
![スクリーンショット 2018-12-13 23.03.28.png](https://qiita-image-store.s3.amazonaws.com/0/266407/325bd742-20a2-39e1-fabb-049c680f4322.png)
1. アクセス許可の設定で先程作成したグループを選択
![スクリーンショット 2018-12-13 23.05.09.png](https://qiita-image-store.s3.amazonaws.com/0/266407/f2191bb3-dc2d-5aba-f7b9-19c60d71355e.png)
1. SSH 公開キーのアップロードします
![スクリーンショット 2018-12-13 23.53.00.png](https://qiita-image-store.s3.amazonaws.com/0/266407/92f7d487-d34b-cefc-ff5a-d60f041ff00c.png)
AndroidでRxJava(RxAndroid) + RxBus + Data Binding + roomのサンプル(Java1.7ベース)。

# はじめに
本記事は [Android 初心者 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/android-beginner) 13日目の記事です。

Android開発を初めて1ヶ月ほどがたったころ、
会社で以下の話が持ち上がりました。

**開発しているアプリがレガシーなので構造を新しくしよう!**

そこで、ここ2ヶ月くらい調べたり勉強したりしていた結果をサンプルアプリにまとめて見ました。
これを元に、どういう構造にしていくか、
どう変えていったらよいかをチーム内で会話していく予定です。

## 動作確認バージョン
- Win
  Android studio 3.2.1
  Windows10 Home Version:1803

- Mac
  Android studio 3.2.1
  Mac OS Mojave 10.14.1

## アプリの構造
 - 以下のデザインパターン使用する
   MVVM

 - 以下のライブラリを使用する
   - RxJava2(RxBus)
   - RxAndroid
   - room
   - Data Binding

## 前提条件
このまま本番コードにするわけではないです
あくまでチーム内で議論するためのサンプルです。
  
## サンプルの目的
### 神Activity(Fragment)からの脱却
- いま業務で開発しているアプリは神Activity(Fragment)過ぎてツライ
- Activity(Fragment)の継承地獄
- 密結合過ぎてテストを書くのがツライ

### Nullpo対策
アプリがライフサイクルについていけず、よく死ぬ。
安心したい。

### もっとレガシーに愛を
ネットにあるサンプルはkotlin、RetroLambda使用前提のコードばかり。
Java1.7までしかしらないけどRxJavaとかを使いたい人向け。
(もちろんkotlinにしたいが現実的にはコストや品質面で難しい…)

勉強しろ!という話はごもっとも…。
でも勉強するのが目的ではないので、
とりあえず分かるもの、動くもの、今の知識でも勉強できるものがあれば嬉しいと思います。

### 自分の勉強結果のアウトプット
強いAndroidエンジニアの人からマサカリ貰えたら嬉しい。
アーキテクチャや考え方の部分は、独学キツイので良さげな仕組みがあったら知りたい…。

### その他、悩んでいる点
- データソース(ファイル、DB)をラップするためにRepositoryパターンにした方が良いか?
  いまのところsqliteだけだし、roomのままで良いかなぁと思っている。
  たぶん切り替えるのもそんなに辛くないハズ…。
  あまり最初から盛りすぎると硬直する気もしている。

- dagger2の利便性がわからず使えていない
  ちょっと勉強したりもくもく会で聞いてみたけど、
  イマイチ使う嬉しさがわからない…。
  困っていることに気づいていないだけっぽい?
  具体的なソースコードとかあると嬉しい。

- 他の機能に対する問題の有無を検証できていない
  課金機能、GoogleMapの埋め込み、カメラ機能などに対してこの仕組みで良いかは未検証。
  どうとでもなりそうな気はするし進めちゃって良い気もするけど、
  可能なら先に検証しておきたい。

# 作成したサンプルアプリのソース
ソースは以下のGithubからどうぞ。
https://github.com/fortegp05/SampleAndroidApps

# アプリに実装した機能
- 非同期通信機能(RxJava2(RxBus)、RxAndroid)
  Githubのリポジトリを検索して一覧表示する機能
  connpassのイベントを検索して一覧表示する機能(Apiが重くてよくタイムアウトする)

- roomによるSQLiteの操作
  SQLiteにデータ保存する機能
  SQLiteからデータを取得して表示する機能

- Data BindingによるViewとViewModelの連携

- Navigation Drawerの実装

- テストの実装
  - 単体テスト
  - UIテスト
 
# 今後やっていきたい内容
  - さらなるモダン化
    - kotlin化
    - RetroLambdaの使用
  - 機能拡張
    - 検索時に任意の文字列を渡す部分をData Bindingで双方向にする
      - リアルタイム検索とか
    - RecyclerViewのスクロール時に次のデータを取ってくる
    - SQLiteの操作追加
      - 更新
      - 削除


# おわりに
次回から実際にコード例を上げつつ、やったことをアウトプットしていきます。
次はRxJavaによる非同期処理の解説にチャレンジしてみる予定。
Xamarin で Entity Framework Core を利用するときの注意事項メモ

# Xamarin で Entity Framework Core を利用するときの注意事項メモ

## はじめに

Xamarin で Entity Framework Core を利用するときに、いくつかはまった事があったので、対応策のメモを記載しておきます。

## Migration Tool

Xamarin のプロジェクトに対して、Entity Framework Core のマイグレーションツールの ```dotnet ef``` コマンドを直接実行することができません。コンソールアプリケーションに Xamarin のプロジェクトを参照させて、コマンドを実行する必要があります。

.NET Core のコンソールアプリケーションをソリューションに追加し、コンソールアプリケーションの参照設定で、Xamarin のプロジェクトを追加します。

![ConsoleApp](https://gist.githubusercontent.com/tafuji/c7295084bc04ecc6a8a128b83f0b14fc/raw/f158ff9723c599a978f33b64bd3830b5d59911b1/01-MigrationToolConsole.png)

コンソールアプリケーションのプロジェクトのディレクトリで、```dotnet ef``` コマンドを実行してください。

![dotnet-ef-command](https://gist.githubusercontent.com/tafuji/c7295084bc04ecc6a8a128b83f0b14fc/raw/f158ff9723c599a978f33b64bd3830b5d59911b1/02-dotnetef.png)

```bat
dotnet ef migrations add [マイグレーションの名前] -p [DbContext を持つプロジェクトの csproj ファイル]
```

そうすると、マイグレーション関連のコードを生成することができます。

![dotnet-ef-command](https://gist.githubusercontent.com/tafuji/c7295084bc04ecc6a8a128b83f0b14fc/raw/f158ff9723c599a978f33b64bd3830b5d59911b1/03-GeneratedMigrationCodes.png)

## System.Buffuers 関連のビルドエラー

Android プロジェクトをビルドすると、以下のようなビルドエラーがでることがあります。

> Can not resolve reference: `System.Buffers`, referenced by `System.Memory`. Please add a NuGet package or assembly reference for `System.Buffers`, or remove the reference to `System.Memory`.

この場合は、```System.Buffers``` を NuGet を使ってインストールすると解決できます。

## Linker の設定

Release ビルド時に、リンカーにより、使用 (または参照) されないアセンブリ、型、メンバーが破棄されので、Entity Framework Core が利用しているクラス類が破棄されないように、Linker の設定を行う必要があります。以下のような xml ファイルを iOS, Andorod のプロジェクトに追加して、ビルドアクションの設定を行う必要があります。

```xml
<?xml version="1.0" encoding="utf-8" ?>
<linker>
  <assembly fullname="mscorlib">
    <type fullname="System.String">
      <method name="Compare"></method>
      <method name="CompareTo"></method>
      <method name="ToUpper"></method>
      <method name="ToLower"></method>
    </type>
  </assembly>
  <assembly fullname="System.Core">
    <type fullname="System.Linq.Expressions.Expression`1"></type>
    <type fullname="System.Linq.Queryable"></type>
  </assembly>
</linker>
```

Visual Studio のビルドアクションで、[LinkDescription] の設定を行ってください。

![ConsoleApp](https://gist.githubusercontent.com/tafuji/c7295084bc04ecc6a8a128b83f0b14fc/raw/f158ff9723c599a978f33b64bd3830b5d59911b1/04-LInkDescription.png)

## ```SQLitePCL.Batteries_V2.Init()``` の呼び出し

SQLite データベースを利用している場合は、アプリケーションの初期化時に、```SQLitePCL.Batteries_V2.Init()``` を呼び出す必要があります。

```csharp
SQLitePCL.Batteries_V2.Init();
```

## さいごに

GitHub の Issue に Entity Framework Core がうまく動かないときの回避策がまとめられています。こちらも定期的にウオッチしておくと良いかもしれません。

- [Workarounds for Xamarin.iOS app with EFCore 2.0](https://github.com/aspnet/EntityFramework.Docs/issues/597)
Pepperでコーヒーを淹れさせた話

はい！というわけで12/14のアドベントカレンダーネタはPepperを使ってコーヒーを淹れる話です。
このネタはPepperのPartnerMeetUpで話したものですが、世の中でPepperに関する悲しい記事も多いので何か楽しめるものは出来ないかなとプロトタイピングしたのが始まりでした。
　たまたま自宅にあったKUREGのコーヒーサーバーとMicrobotPushというIoTプッシュデバイスとダンボール工作のプロトタイプを作ったのが始まりです。（LTスライドよりイメージ抜粋）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175066/cafd71f1-3fe6-44a2-73f0-8ddc180c5789.png)
　MicrobotPushに関してなじみがない人もいると思うので少し書きますと、スマート家電対応していないレガシーな機器や押しボタン式のデバイスをIoT制御するためのデバイスです。
https://microbot.is/ja/push/
デバイス自体はBluetooth接続なのでスマホや専用のスマートハブで制御可能なほかタイマー起動などのスケジューリングが可能です。

以下デモ動画です。
https://youtu.be/myGY_Yuqwd8

　プロトタイピングなので適当でいいや、と作ってみたのですが、形になると課題はありつつもそれなりに動くものができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175066/c4535056-a295-4690-a2d8-77acee62426a.png)

　そこから数カ月、忙しさにかまけて次のステップを進めてなかったのですが、ハロウィン向けのイベントで美容室でお茶をふるまうということで次のステップへと着手しました。
まずカップホルダーを３Dプリンタで自作し、スタビライザー機能を付けて、途中でエラーになって手がダラーンとなってもお茶がこぼれないようにしました。
　またお客様に楽しんでもらえるように、リアルビットコイン（謎）対応のコインシューターもダンボールで自作しております。これがお客様にはかなり好評でした。
　コインシューター自体はobnizというイケてるワンボードマイコンを使って作成しています。
　MicrobotPushの通知の受け側ですが前回はスマホでのwebhook受信をしたのですが、ProtaSというスマートホームハブを使い営業時間中はいつでも受けれるようにしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175066/1b504953-103a-3478-7571-15af7ed2aac8.png)

　構成的にはobnizのコインシュータでコイン投入を検知して、node-REDに通知、websocket経由で通知を受けたPepperがコーヒーを淹れるタイミングでMicrobotPushに通知というかなりハードなことをやっております。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175066/cd9d4c7a-e4fe-6f43-ea2b-4cc3aeef354a.png)

　ハロウィンの１週間前から稼働させたお客様の感想は思ったより上々で
「Pepperがボタンを押してくれるかと思ったら、コーヒーを受けてくれて予想の斜め上だった」
「コインシューターがかわいい」
「Pepperが思ったよりよくしゃべる（笑）」
などポジティブな感想がほとんどでした！

ちょっとお客様の反応が良かったのでクリスマスバージョンも引き続き稼働させる予定です。
皆様も、もし眠ってるPeppperがいたらコーヒーくらい淹れさせてみたら少しは愛着がわくかもしれませんね！
それではよいクリスマスを―！
video 要素のスクリーンショットを撮影するブックマークレット

![a.png](https://qiita-image-store.s3.amazonaws.com/0/248832/7633afe4-10bc-3dba-4d07-2d5f9a5a78df.png)

## 概要

YouTube やニコニコ動画のワンシーンを画像として保存したい時、どうしてますか？
OS のスクリーンショット機能？でも良いんですが、たいてい矩形選択する必要があるから面倒だし、きれいに選択できなかったら嫌ですよね？私は嫌です。

そこでエンジニアなりに video 要素について調べてみると（ほとんどの動画は video 要素で実装されているので）、 Canvas の drawImage 関数にそのまま渡して描画できることがわかりました。
つまり仮想 Canvas に video 要素を描画してスクリプトダウンロードするブックマークレットを作れば、ワンタッチで動画のスクリーンショットを撮影することができそうです。

## コード

というわけで作ったのがこちらになります。

```javascript
javascript: (() => { const video = document.querySelector('video'); if (video) { const canvas = document.createElement('canvas'); canvas.width = video.clientWidth; canvas.height = video.clientHeight; const context = canvas.getContext('2d'); context.drawImage(video, 0, 0, canvas.width, canvas.height); const image = new Image(); image.src = canvas.toDataURL('image/png'); const a = document.createElement('a'); a.download = `${location.host}_${new Date().toISOString()}.png`; a.target = '_blank'; a.href = image.src; a.click(); } else { alert('There is no video tag.'); } })(); void 0;
```

説明は割愛…ブックマークの URL 欄にコピペすれば OK です。
試写は[こちら](https://www.youtube.com/watch?v=MY1d5Saqrc4)で行いました。ナショジオ良いですよね。

## 注意点

* Chrome でしか動かないはず
* Chrome では二回目の撮影時に複数ダウンロードの許可を求めるポップアップが表示される
* video 要素がない場合はアラートを表示する
* video 要素がいっぱいある場合は最初の要素だけ撮影する
* CORS 由来のエラーで動作しない場合がある

## 動作確認サービス

✅ ニコニコ動画（ HTML5 版のみ）
✅ ニコニコ生放送（ HTML5 版のみ）
✅ Twitch
✅ YouTube
❌ Vimeo

## ひとこと

360° カメラの動画を撮影したらこんなんなりました。
![b.png](https://qiita-image-store.s3.amazonaws.com/0/248832/7cbeb3b9-c5a1-0ef0-92c7-3baf8e6fd744.png)
Drupal8で幹事さん向けサイト構築する話。

を描こうと思ったんですが、だいぶ遊びすぎて（有給消化中）構築できてないので
まずは一旦なぜDurpal8を触るに至ったか、の話をします。

<h2>なぜDurpal8を触ることになったのか</h2>
ずばり<b>『転職』</b>です。
この度、6年弱勤めた人材会社を退職しコンサルティング会社へ転職することになりました。そして次の会社で使うことになるのがDurpal8です。転職については別エントリーで書きます、総合職の弊害とG'sに通ったからわかったことがあって今回の転職に至ったので。（読む人いないかもだけど）

<h2>圧倒的WordPress優位の日本</h2>
ちなみにDurpal8とはWordPressと同様のCMSです。
そもそも更新性の高いサイトはCMS（Contents Management System）を利用している場合が多く、私が仕事で触っているサイトの多くもWordPress（以下、WP）で構築されていました。<br>
確かにPHPとhtml,CSSが分かれば気軽にサイト構築ができるため、日本で大人気のCMSです。調べたところ世界的にWPが60％、あとは有象無象に1％〜3％の専有率。。。有象無象の中の1つがDurpalです。

<h2>圧倒的ドキュメントの少なさ</h2>
次の会社で触るとなれば、とりあえず触ってみようと思い立ってググってみましたがマジでドキュメントが少ない。アマゾンでポチろうにも該当しそうなのは１冊、日本語で書かれてるWEBページもほぼなく、なぜDurpal8にしたんだよ！御社ぁぁぁぁ！となっているのが今の率直な気持ちです。

優秀なエンジニアの皆さんにお聞きしたい、ドキュメントが少ない場合はトライアンドエラー以外の手段ってないんでしょうか・・・。

<h2>それでもきっとある、Drupal8のいいところ</h2>
WPとの大きな違いは、どうやらDrupal8の場合ブログ機能はあくまでモジュールでありブログありきではないサイトの構築が可能であるということだとか。あとは権限管理がしっかりしているセキュアな環境ということがDrupal8のメリットのようですね。

兎にも角にも、構築してみないとわからないので12月アドベントカレンダーが終わるまでに構築しますという決意表明の投稿でした。
ぼくのためのシェルスクリプト詰め合わせ

自分用備忘録。ひとのために書いてないので注意
特にLatexをDockerでコンパイルする方法は自分のパソコンが汚れないのでオススメです。

# 環境
Mojave 10.14
zsh 5.3 (x86_64-apple-darwin18.0)

## ファイル操作系
カレントディレクトリの``day``ディレクトリ以外のファイルまたはディレクトリを``day``に``mv``

```sh
ls | grep -v day | xargs -I {} mv {} day
```

## コンパイル系
``Docker``内の``LaTeX``にカレントディレクトリの``LaTeX``ファイルを食わせカレントに``pdf``生成

```sh
#!bin/zsh
docker cp 01.tex Cassinubuntu01:/root/MyProject/Infexp2/th05
docker exec -it Cassinubuntu01 bash -c "cd /root/MyProject/Infexp2/th05 && platex 01.tex"
docker exec -it Cassinubuntu01 bash -c "cd /root/MyProject/Infexp2/th05 && dvipdfmx 01"
docker cp Cassinubuntu01:/root/MyProject/Infexp2/th05/01.pdf .
```
上記スクリプト実行後``pdf`` を見ている ``Preview``のリロード

```sh
open -a Preview 01.pdf
```


c++ クイックラン

```zsh
#!bin/bash
if [ $# -ne 1 ]; then
  echo "need file name" 1>&2
  exit 1
else
  g++ $1
  ./a.out
fi
```

# その他

 ドッカーの中に入る

```shell
docker exec -i -t コンテナ名 bash
```


Markdown から pdf 生成

```shell
input.md -o output.pdf -V documentclass=ltjarticle --pdf-engine=lualatex
```

Firefox 起動

```zsh
#!bin/zsh
cd /Applications/Firefox.app/Contents/MacOS
./firefox -ProfileManager
```
WebディレクターだけどRubyとJavaScriptを比較してみた雑感

こんにちは。
こちらは[LIGのアドベントカレンダー14日目](https://qiita.com/advent-calendar/2018/lig)の記事です。

[株式会社LIG](https://liginc.co.jp/)でWebディレクターをやっているともぞうといいます。
私はエンジニア出身でもなんでもないんですが最近Rubyをはじめました。
自分でサービスのつくりたいなーって思って。
Ruby on Railsつかってつくるぞ〜って気持ちです。

そんなこんなで、本稿ではさわり始めたRubyでこれ便利やんけと思ったものをちょっとさわったことのあるJavaScriptと比較していきます。

## 前提として

JavaScriptは4年前くらいにJQueryで少し書いたことがあるくらいです。
なので、手に持ったマサカリは懐にしまってください。

## 繰り返しようのメソッドが用意されている

timesメソッドというものが用意されていてとても簡単に繰り返し処理をおこなえました。

```
10.times do
 処理させたい内容
end
```

JavaScriptで同じことをやろうとすると……

```
for(var i = 0; i < 10, i++){
 処理させたい内容
}
```

Rubyの記述が13文字に対して、JavaScriptは22文字でした。
9文字も少ないです。
指が疲れにくい。

## 文字列と変数の連結が楽な気がする

Rubyだと変数を`#{変数名}`と`#{}`でくくるだけで文字列に入れることができます。

```
str = "変数の文字"
p "#{str}です"
```

JavaScriptだと……

```
var str = "変数の文字"
console.log(str + 'です');
```

みたいに `+`でつなげる必要があります。
個人的に`+`が可読性を残っている気がしていて、Rubyのほうが楽な気がしました。

## 偶数か奇数の判別が楽

`.odd?`メソッドで奇数だった場合はTrueを返し、`.even?`メソッドを使うと偶数の場合Trueを返してくれます。

```
if 10.even? then
	p "偶数でした"
else
	p "奇数でした"
end
```

JavaScriptだと`10 % 2 == 0`みたたいに計算させる必要がある
こんな具合に

```
if(10 % 2 == 0){
　　　　console.log("偶数でした");
　　　　}else{
　　　　console.log("奇数でした")
}
```

## 配列の合計を出してくれる
`sum`メソッドを使うだけで合計を出してくれる

```
nums = [1, 2, 3, 4, 5]
p nums.sum
```

JavaScriptだと`for文`つかったりと結構面倒そうです。
以下のサイトを見ました。
[http://shanabrian.com/web/javascript/sum-number-value.php](http://shanabrian.com/web/javascript/sum-number-value.php)

## さいご

まだまだRuby触りたて & JavaScriptたいして知らないんですが、Rubyは便利なメソッドが多く用意されているなーという気がします
JavaScriptはfor文やif文といった構文をうまく使っていく必要がある気がします。

雑感としては………

JavaScriptは構文をベースに自力で処理（偶数判定の処理とか）を考える必要があって、エンジニア脳が鍛えられそうな一方、手法が複数あるので初心者はどうすりゃいいんじゃああってなりそうだって気がしました。

Rubyは便利な道具がそろっているのでとてもとっつきやすい気がします。
シンプルな書き方(括弧書かなくていいとか)も相まってなんとなく読みやすいですし。

こういう違いRubyが初心者向けにもおすすめされている理由なのかなんて思いました。
以上です。

明日は誰かの何かみたいです。
とても楽しみです。
NEM の公開鍵からアドレスを導出する方法

# 前提
## 秘密鍵
* 乱数で生成されます。NEMの場合、３２biteの乱数です。

## 公開鍵
* 秘密鍵から導出されるものです。公開鍵から秘密鍵を見つけるのは非常に難しくなっています。

## アドレス
* 公開鍵から導出される、アカウントの送受信宛先となるものです。

# 公開鍵からアドレスを導出する
## 1. 公開鍵を用意
3f9f8c791f4b55c84278c10c7596f959a43a71dc35888d16e3d26a33456b6df2

## 2.SHA3(256bit)で公開鍵のハッシュ値を計算
400b2df583636fcf57001b96812c799969e51358c0e192015f48a1251fc10704

https://www.milk-island.net/javascript/hashgenerator/sha3_256.html

## 3.Ripemd(160bit)で上記2のハッシュ値を計算
9a556a8b28f1640e52e5546569f03d1367f6bf66

https://good-tool.net/hash-calculator?d5cf5a3d0314b41b86f13f59167189bdb

## 4.上記3の前にネットワークbyteを追加(メインネットは0x68)
689a556a8b28f1640e52e5546569f03d1367f6bf66

## 5.SHA3(256bit)で上記4のハッシュ値を計算
ddefa199239c503f5e18759a23566d4edd69ac4fcdfb9c0b10190d4b08ab7b18

https://www.milk-island.net/javascript/hashgenerator/sha3_256.html

## 6.上記5の前半4byteをチェックサムとして切り出す
a2b5586d

## 7.上記4の後ろに6を追加
689a556a8b28f1640e52e5546569f03d1367f6bf66a2b5586d

## 8.上記7をbase32でエンコードする
NCNFK2ULFDYWIDSS4VKGK2PQHUJWP5V7M2RLKWDN

https://yu-kimura.jp/2018/03/21/base32/

#　引用
https://tadajam.katari.be/DybkrUq3
CEDEC+KYUSHU2018で話足りなかったテストの話

この記事は [KLab Advent Calendar 2018](https://qiita.com/advent-calendar/2018/klab) 14日目の記事です。

こんにちはhamasan05です。
先日CEDEC+KYUSHU2018に
[大規模モバイルオンラインゲームを支えるソフトウェアアーキテクチャ開発とその使用例](http://cedec-kyushu.jp/2018/session/19.html)
というタイトルで登壇してきました。
(資料はただ今公開準備中なので公開次第URL差し替えます)

セッションを準備するにあたってたくさん準備をしたのですが
泣く泣くカットしたことがたくさんありました。
今回はその中で有用なプログラムネタがあったので紹介します。
「自動テストの拡大」に関する部分です。

# セッションの概要
新しいアーキテクチャの採用によりサーバクライアント間のテストを自動化することに成功したのがセッションでのお話  
![cedec1.png](https://qiita-image-store.s3.amazonaws.com/0/311510/53733eb5-5546-e277-46d2-16e837ef51ef.png)
![cedec2.png](https://qiita-image-store.s3.amazonaws.com/0/311510/fbf9997e-020b-fc14-6532-feb62a194456.png)
![cedec3.png](https://qiita-image-store.s3.amazonaws.com/0/311510/cc292412-fca9-c0eb-8aae-ad0dacb49318.png)

# 実際にどうやっているのか
今回紹介する内容ではクライアント側はUnity(言語はC#)、サーバ側はPythonを利用しています。
ドライバはPytestを利用していて通信の置き換えはPython for .NETを利用しています。
Python for .NETの使い方についてはすでに記事があるため割愛します。

今回は実際にテストに利用する際に気をつけるべき点として
3つのポイントを紹介させていただきます。

1. クライアントロジックはピュアなC#で記述する
1. サーバロジックの時間のかかる処理はまとめてパッチを当てておく
1. クライアントロジックとサーバロジックを通したテストは一番最後にやる

# クライアントロジックはピュアなC#で記述する
ロジック部分はピュアなC#で記述してmonoでコンパイル可能かつ動作できるようにしておきます。
これはテストがどんな環境でも動くようにするためです。
UnityEngineに依存した部分やOSに依存した部分があると動作する環境が限られてしまいます。
(作業者のPCなどでは動くが、サーバではUnityやAndroid SDK、Xcodeなどインストールしないと動かない等)
環境を選ばずにテストできることによって、テスト用に高速なマシンを選択したり、並列処理をしたりと柔軟性が拡大します。

上記の観点からクライアントロジックの一部はテスト用に差し替えられるように設計上隔離しておくと良いです。
UnityEnginge等に依存する処理は隔離した上でテストに影響を与えない処理に差し替えたダミーを準備しておきます。

また、通信を行う処理についても物理的に隔離しておく必要があります。
こちらは単純なダミーではなくPython側の処理をコールする処理で上書きをしておきます。
これらのダミーのクラス群とプロダクトに含まれるべきロジック部分をコンパイルしてDLLを作成してテストを行います。

# サーバロジックの時間のかかる処理はまとめてパッチを当てておく
テストで大幅に時間がかかる箇所については、Pytestの共通の初期処理で予めパッチを当てておきます。
大幅に時間が掛かるものの代表例としてはネットワーク関連になります。
DBや他のサービスへのアクセスが有る場合はサーバ側でも共通で固定値を返すようなダミーを作って
パッチを当てておくと良いです。

# クライアントロジックとサーバロジックを通したテストは一番最後にやる
当たり前の話ではあるのですがC#とPythonのテストをそれぞれきっちりやってから最後に通しのテストをしたほうが良いです。

このテストは一定成約があり問題があったときに原因特定がやや難しいです。
デバッガが使えなかったりスタックトレースが情報不足だったりします。
(問題があった場合はデバッグライトを使って駆使して特定しているのが現状です)
できるだけ品質を上げた状態でテストすることが望ましいです。

# 最後に
CEDEC+KYUSHU2018での私達のセッションに参加していただいた皆様、この記事を読んでくれた皆様に心より感謝します。
アクセシビリティとシビックテック

Code for Nerima（東京都練馬区）の代表の青木秀仁と申します。加えてもう一つの肩書きとして「UDトーク」と言うコミュニケーション支援アプリの開発者でもあります。

今回初めてこのアドベントカレンダーに参加させていただきます。

Code for Nerimaの活動紹介とともに「なぜシビックテック活動においてアクセシビリティに取り組むことは大事なのか」をお伝えできればいいかなと思っております。

と堅苦しく始めてしまいましたが気楽に進めます（笑）

まずはこちら、

「Code for Nerimaのイベントにはいつも日本語／多言語のリアルタイム字幕があり、2〜3日中には全文ログを公開しています」

そんなことできるの？そもそもリアルタイム字幕ってなに？とこれだけだと声があがりそうですが、これがUDトークを使ってできることです。音声認識技術を使って話しをすべてリアルタイムに文字化、自動翻訳技術で多言語へ変換します。記録はすべて保存ができるので少し修正してすぐに公開することもできます。UDトークは先のCode for Japan Summit 2018でも採用されすべてのセッションでリアルタイム字幕を提供させていただきました。ちなみにUDトークは団体活動で使用するのは無料です。

ではこれが何のためにあるのか？

・聴覚障害をお持ちの方のため
・外国人の参加者のため

つまり「いままで参加ができなかった人へ機会を創れる」と言うことです。

「課題解決をしようとしている人たち、実は課題がそんなにないよね」と言う投稿をとあるブログでみました。その通りだと思います。僕も東京都練馬区に住んでいて「特に気になる課題がない」のです。もしCode for NerimaがUDトークを使っていなかったら、そこに参加できない人がいます。聴覚障害者の方や外国人の方です。その時点でその方たちは「参加できない課題」を抱えてるわけで、UDトークを使うことで「課題が解決」できたことになります。そういう方たちは他にもたくさん課題を持ってきてくれます。つまり

「課題は探すより、持ってる人に参加してもらった方がいい」

と言うことです。そのためにシビックテックの活動は「アクセシビリティ」に取り組んでいろんな方の参加の機会を増やす必要があると考えています。アクセシビリティと言うとちょっと聞きなれないかもしれませんが、障害者に対してのアクセシビリティは日本だと「バリアフリー」と言う言葉を使うかもしれませんがイコールではありません。アクセシビリティよりも「ユニバーサルデザイン」や「ユニバーサル対応」などの言い方の方が近いです。参加がしづらかったりできない人に対しての参加の機会を作る、これが活動におけるアクセシビリティへの取り組みだと考えています。

では参加がしづらい人、できない人とはどう言う人のことを指すでしょうか？さきに出した例で言うと聴覚障害を持っていたり日本語がわからなかったりがありますが、その日に予定があって来れられない人も参加できない人に含まれます。その日に来られないのは予定があることがだけが理由ではありません。例えばガイドヘルパーが必要なかたで都合が合わせれなかった視覚障害者や身体障害者の方たち、雨が降って車椅子で移動が難しかった、子供がいて家を空けることができない方たちなど、さまざまな理由があります。

ではそうした方たちに広い意味で参加をしてもらう、参加ができるようにするにはどうしたらいいでしょうか？

Code for NerimaではZOOMによる生中継を行なっております。かつUDトークを一緒に動かして「遠隔での字幕付き動画配信」を行なっています。こうすることで当日その時間に物理的に来れない人にも参加をしていただくことができます。その時間に予定があるかたも、そのあと全文の記録をウェブに公開するので、後から読んで把握することができます。

これらのアクセシビリティに取り組むことでCode for Nerimaは圧倒的に参加がしやすくなっています。

実はCode for Nerimaのメンバーにはたくさんの障害者の方たちがいらっしゃいます。でもCode for Nerimaとしては「障害者の方に参加してください」と一言も言っていません。参加しやすい、参加ができると言うことで自然と集まってきていただいています。もともと僕自身が聴覚障害者の方たちとつながっていたことも大きな要因ではありますが、その方たちが友達を誘って気軽に参加できる団体であり場になっています。アクセシビリティに取り組むことで多種多様のいろんな方たちがCode for Nerimaに参加しています。

アクセシビリティの一例としてUDトークの活用を紹介しましたが「どうやったらイベントに参加しやすくなるか」を考えてみていただければと思います。

 Code for Nerimaの例でのアクセシビリティは障害者の方たちの参加がしやすくなる例を示しましたが、実はアクセシビリティは「対象となる人への取り組み」ではなく「発信するイベントのあり方への取り組み」だと考えています。つまりアクセシビリティに取り組むことによって

・あらゆる参加者が理解を深めることができる

これが一番のメリットであり重要なことです。リアルタイム字幕は聴覚障害者の方たちだけではなく、聴こえる人にも情報を追うのに便利です。聞き逃しても、途中でトイレに行っても（これは実際好評です）、開始にちょっと遅刻しても参加できます。全文ログは振り返ることが簡単にできますし、検索をかけることができます。

なのでこの記事を読まれているイベント主催者の方は改めてイベントへの「参加しやすさ、機会創出」をアクセシビリティの観点から一度考えてみてはいかがでしょうか？先にも述べましたがシビックテック団体で課題解決を掲げているのであればまずは「活動に参加できない」と言う課題を持っている人への解決に取り組んでみていただけたらいいかと思います。

最後になりますが、東京都練馬区ではこうしたCode for Nerimaのアクセシビリティへの取り組み自体が区と連携した「区民協働活動」となっています。東京都練馬区は「区」としてUDトークを導入し活用を進めており、区のアクションプランにもUDトークの名前が掲載されています。区の公式イベントでの運用サポートをCode for Nerimaで行っています。また区内の団体主催のイベントへのサポート等も行っています。Code for Nerimaではこうしたサポートもシビックテック活動の一つと位置づけています。「アクセシビリティの町、練馬」を目指しています（笑）。

もしアクセシビリティへの取り組みやUDトークにご興味がある方はCode for Nerimaのイベントにぜひご参加ください。