OmniAICreator/Qiita-1.07M huggingface dataset:
炎の型工房 火の型 12日目 :　プログラマーは料理上手!! Pongを作ろう -3-

[<ruby>炎<rt>ほのお</rt></ruby>の<ruby>型<rt>かた</rt></ruby><ruby>工房 <rt>こうぼう</rt></ruby>ScratchとDartでゲームプログラム<ruby>入門<rt>にゅうもん</rt></ruby> Advent Calendar 2016](http://qiita.com/advent-calendar/2016/firefirestyle-studio)
の<ruby>記事<rt>きじ</rt></ruby>です


<img width="500" alt="magic.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/89d1b269-8c55-d108-a718-194c287ca0d6.png">


プログラマーは、<ruby>料理<rt>りょうり</rt></ruby>が<ruuby得意<rt>とくい</rt></ruby>...かもね!!

<ruby>下<rt>した</rt></ruby>ごしらえしたら、<ruby>調理<rt>ちょうり</rt></ruby>しよう!!



　
　　

## テニスコートを<ruby>作成<rt>さくせい</rt></ruby>しよう

<img width="325" alt="v000.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/4091f5e7-39f7-bd77-98bf-93d0e15a2af0.png">


<ruby>画面<rt>がめん</rt></ruby>の<ruby>端<rt>はし</rt></ruby>に、ボールを<ruby>跳<rt>は</rt></ruby>ね<ruby>返<rt>かえ</rt></ruby>す<ruby>仕切<rt>しきり</rt></ruby>を<ruby>作<rt>つく</rt></ruby>ろう


<ruby>上下左右<rt>じょうげさゆう</rt><ruby>は<ruby>別<rt>べつ</rt></ruby>の<ruby>色<rt>いろ</rt></ruby>にしてね。


### コードを<ruby>書<rt>か</rt></ruby>く

<img width="377" alt="v001.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/f83d60b1-37a0-f58c-12ec-ebbda98d05f9.png">


このコードを<ruby>追加<rt>ついか</rt></ruby>してね


### <ruby>確認<rt>かくにん</rt></ruby>する　
https://scratch.mit.edu/projects/136420808/

<img width="334" alt="v002.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/71c1c8df-cdfe-129f-07a5-e8018c3cc640.png">


1. <ruby>旗<rt>はた</rt></ruby>をクリックすると、<ruby>端<rt>はし</rt></ruby>に<ruby>四角形<rt>しかっけい</rt></ruby>が<ruby>描画<rt>びょうが</rt></ruby>されること



　　　


　


## ネコをボールに変える　
ネコをPongのボールとして<ruby>利用<rt>りよう</rt></ruby>することにします。

<img width="334" alt="v101.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/60f3d7c1-1f27-7b88-dad9-ceee4ef9c012.png">


1. Sprite1 をクリック
2. コスチュームをクリック
3. Spriteアイコンをクリック

<img width="334" alt="v102.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/074d00be-cd4f-716f-fde0-0f919851ee3a.png">


1. ものをクリック
2. ball-aをクリック
3. OKをクリック


<img width="334" alt="v103.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/f044fe06-3650-b991-0a0c-885680ad8124.png">


https://scratch.mit.edu/projects/136429229/



## Thanks
<div>
ここまで、<ruby>読<rt>よ</rt></ruby>んでくれてありがとう!!
</div>
<div>
では、<ruby>次回<rt>じかい</rt><ruby>、また
<ruby>会<rt>あ</rt></ruby>えることを、
<ruby>楽<rt>たの</rt></ruby>しみにしています。
</div>

そして、<ruby>次回<rt>じかい</rt></ruby>は、ボールに<ruby>動<rt>うご</rt></ruby>きをつけます

<div>
ではでは
</div>
Listの中の文字列をカンマ区切りにしてつなげるやり方

#この記事について#
DAOから返ってきた値がListに入っていて、その値を連結させて取り出したいときがあるのですけど、
今回はそんなときのやり方について備忘録を残します。

注)2つめのやり方についてはそのまま流用するとコンパイル時に警告が出るので、修正してから
お使いください。

なお、コード自体は、以下のリンク先を参考にしております。
[[Java]文字列配列をカンマ区切りの文字列にする](http://d.hatena.ne.jp/mtoyoshi/20080717/1216299220)

#そのまま試してみるには・・・#

コマンドプロンプトで以下のコマンドを発行
```
cd ListTest.javaがあるディレクトリ
javac ListTest.java
java ListTest 
```

<---実行結果---------------------------->
1個目のlistの型class java.lang.String
1個目のlistの中身。カンマ繋ぎ:a,b
2個目のlistの型class java.lang.String
2個目のlistの中身。カンマ繋ぎ:c,d
<--------------------------------------->

#コード#

```java:ListTest.java
import java.util.*;

public class ListTest{

	 /*
	 * Listの書き方を試すプログラム
	 * 参考
	 * http://d.hatena.ne.jp/mtoyoshi/20080717/1216299220
	 *
	 * @SuppressWarnings でコンパイル警告を無効にしている
	 */
	 @SuppressWarnings("unchecked")
     public static void main(String[] args){

     	/*1つ目
     	*
     	*/
     	List<String> lst = new ArrayList<String>();

     	lst.add("a");
     	lst.add("b");
    	
     	StringBuilder builder = new StringBuilder();
     	
     	//型の確認
     	System.out.println("1個目のlistの型" + lst.get(0).getClass());
    	
     	for(String str : lst) {
			builder.append(str).append(",");
		}

		String result = builder.substring(0, builder.length() - 1);
        System.out.println("1個目のlistの中身。カンマ繋ぎ:" + result);

     	
     	/*2つ目
     	* List<String> lst2 = new ArrayList<String>(); としないとコンパイル時に警告が発生する
     	*/
     	List lst2 = new ArrayList();
     	

     	lst2.add("c");
     	lst2.add("d");
    	
     	StringBuilder builder2 = new StringBuilder();
		
     	//型の確認
     	System.out.println("2個目のlistの型" + lst2.get(0).getClass());
     	
		for (int i = 0; i < lst2.size(); i++) {                        
            String str2  = (String)lst2.get(i);
			builder2.append(str2).append(",");
        }

		String result2 = builder2.substring(0, builder2.length() - 1);
        System.out.println("2個目のlistの中身。カンマ繋ぎ:" + result2);
     	
     }
}
```
WEBエンジニアなら必ず知っておくべき「CSRF」のサンプルサイトを作ってみた

## 概要
* CSRFはWEBセキュリティにおいて重要な知識
* なのに入門者はCSRFについての知識を疎かにしてることが多い
* CSRFは、実際のサンプルサイトがないと分かりにくい
* ということで実際にサンプルサイトを作ってみた

## サンプルサイト
* CSRF脆弱性があるサンプルサイト
_（ID、PWは誰でも見れるようになっているので、決して実際の情報で登録しないでください）_
https://hack-csrf-sample.herokuapp.com/

* サンプルサイトへCSRF攻撃をするページ
https://sagami1991.github.io/csrf-sample/


## 何ができるサイトか
サンプルサイトで会員登録後、攻撃用ページを開くと、勝手にサンプルサイトのID、PWが変更されます

1. サンプルサイトのトップページから会員登録ページへ飛びます
 ![Screenshot_46.png](https://qiita-image-store.s3.amazonaws.com/0/131295/99d5c78d-564c-eaf8-fad8-9a28a1654049.png)

1. ID: hoge PW: fuga で会員登録してみます
![Screenshot_43.png](https://qiita-image-store.s3.amazonaws.com/0/131295/b259a43e-6d15-38b7-df3f-6c2e4fca31fa.png)

1. マイページに飛びました
![Screenshot_42.png](https://qiita-image-store.s3.amazonaws.com/0/131295/154a8065-7432-3b4a-3c8a-1771a79a5a98.png)


1. ここで、攻撃者用ページ(https://sagami1991.github.io/csrf-sample/) を開いてみます。開くだけで何もせずにOKです
<img src="https://qiita-image-store.s3.amazonaws.com/0/131295/82f9666a-ada0-3461-96a3-5e27f41a83b1.png" width="50%">

1. その後サンプルサイトのマイページに戻ると、IDとPWがhogehogehackerというものに変わっています。全く関係ない他者のページを踏んだだけで会員情報が勝手に変更されてしまいました
 ![Screenshot_44.png](https://qiita-image-store.s3.amazonaws.com/0/131295/909a886b-7985-cecf-a3b7-319455854abe.png)


## 仕組み
CSRF攻撃の仕組みはわかりやすい記事がそこら中にあると思うので細かい話は省略します。

0. サンプルサイトでログインする
1. 一定時間、ログインは保持される
    * （cookieにsessionIDを持っていて、サンプルサイトのサーバーはsessionIDを元にsession情報を読み取り、ログイン情報等も判断する）
1. 攻撃者用ページにアクセスする
2. 攻撃者用ページからiframe内で会員情報変更処理ページに自動でPOST送信される
    * iframe内でPOST送信させれば、画面遷移しないのでユーザーにばれない
    * iframeを埋め込んでいる部分

    ```html:index.html
    <iframe src="hack-iframe.html" width="0" height="0"></iframe>
    ```
    * iframeに埋め込んであるページのソース
    
    ```html:index.html
    <!-- ユーザー情報変更ページへPOST送信するForm -->
    <form action="https://hack-csrf-sample.herokuapp.com/mypage/edit" method="POST">
		<!-- サンプルサイトのhtmlソースを見ながらIDとパスワードのパラメータ名（name）を合わせ、
		変更させたい適当な値をvalueに設定する -->
		<input name="userId" value="hogehogehacker" />
		<input name="password" value="hogehogehacker" />
	</form>
	<script>
		// 自動でpost送信させるコード
		var form = document.querySelector("form");
		form.submit()
	</script>
    ```

3. サンプルサイトの会員情報が勝手に変更される
    * ブラウザにサンプルサイトのcookie情報が残っていれば、サンプルサイトのサーバーサイドはログインしているものと判断するので、会員情報変更ページから変更リクエストが来たものと同じように判断してしまいます。


## 対策方法
これも、そこらの記事に書かれてあったり、フレームワークによって設定方法があると思うので細かいことは省略しますが、だいたい以下のような方法を採用しています。

1. ログイン時にトークン（乱数）を生成し、sessionに格納する
1. post送信時はform内にそのトークンを入れ、サーバー内でリクエストパラメータのトークンと、session内のトークンが同一かどうか判断する
1. 同一ならばリクエストを受け付ける
    * SessionIDが漏れない限り、攻撃者はトークンが分からないので外部からPOST送信することができなくなる。

## 最後に
サンプルサイトはheroku、攻撃用ページはgithub pagesで作っています。
今どき、なんでもタダでできちゃうのがいいですね。
ちなみにサンプルサイトはtypescript+nodejsで書いています。
nodejsは環境構築が簡単で、重たいIDEなどもいらないので、ストレスフリーでこういうサンプルサイトがつくれちゃいます。

* サンプルサイトのソースコード  
https://github.com/sagami1991/csrf-sample/tree/master/server
* 攻撃者用ページのソースコード  
https://github.com/sagami1991/csrf-sample/tree/master/docs
みんな、Xcode 8.2へのアップグレードはあと数日は自重するんだ！

貴重な二時間くらいをこれで失ったので。

Xcode 8.2からiossimの挙動に問題があってまだTitanium SDK 6.0.0.GAでは正常に動作しません。修正が入っているのでおそらくSDK6.0.1として数日中にリリースされます。しばらくお待ちください。

Twilio Programmable VoiceがCallKitとPushKitに対応したのでモジュールにしたんですが、これでビルドできず…

https://jira.appcelerator.org/browse/TIMOB-24136
Instant Runでビルドされたapkファイルを配布すると、『Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication』という理由でクラッシュすることがある

# Android StudioのRunで生成された apkファイルを配布すると、、、

Android Studio で Run すると、デフォルトでは、
`/<AndroidProcject>/app/build/outputs/apk`にapkファイルが生成されます。

Android Studio 2.0 で導入された [Instant Run](https://developer.android.com/studio/run/index.html#instant-run)でも、
同じようにapkファイルが生成されますが、このapkファイルをテスト用で配布すると、
下記のRuntimeExceptionが、、、

```
java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.ClassNotFoundException
```

# 原因

どうやら、Instant Runでビルドされたapkは、デバッグしている端末に最適化されてビルドされるため、
最適化された端末と合わない端末では実行されないらしい。

※ Android OS 5.0.2系端末でビルドしたapkファイルが、 5系、6系では問題起きませんでしたが、
　Android 4.4系で起動した瞬間にクラッシュしました。。。

# 対応

1. Instant Runをやめる
   - メニューバー => Android Studio => Preferences... => Build, Execution,Deplpyment => Instant Run
   - `Enable Instant Run to hot swap code/resource changes on deploy` のチェックを外す

2. メニューバー => Build => Build apk で作成する
 - 横着せずにこれでやるべきですね。。。



# 所感

該当端末をUSB繋いで、Android Studioでビルドしても再現せず、
apkファイルでインストールされたアプリでログを取らないとわからなかった。。。


# 参考

- 解決したときに参照した記事です(ありがとうございました:bow:)
 - [Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication ?Android (stackoverflow)](http://stackoverflow.com/questions/33967703/unable-to-instantiate-application-com-android-tools-fd-runtime-bootstrapapplicat)
django-hijackでお手軽代理ログイン


## はじめに

この記事は、[Django Advent Calendar 2016](http://qiita.com/advent-calendar/2016/django) 14日目の記事です。

## ここでやること

+ django-hijackの紹介
+ django-hijack-adminの紹介

この前の[TokyoDjangoMeetup #9](https://django.connpass.com/event/44749/)で[@salexkidd](https://twitter.com/salexkidd)に教えてもらいました。

## django-hijackとは

https://github.com/arteria/django-hijack/

> admins can log in and work on behalf of other users without having to know their credentials.

super_userが、パスワードとか知らなくても代理ログインできちゃうやつ。

特定の条件下での不具合調査や、ユーザ毎に表示が異なる画面の確認などなどサービス開発にありがたい機能です。

[AWESOME DJANGO](http://awesome-django.com/)の「ADMIN INTERFACE」の項目にも載ってますね。

## django-hijack-adminとは

https://github.com/arteria/django-hijack-admin

> Django admin site integration for Django Hijack

django-hijackをDjangoの管理画面から使えるようにするやつ。

django-hijackは、以下のエンドポイントからのログイン機能しか提供してません。

+ `/hijack/<user id>`
+ `/hijack/username/<username>`
+ `/hijack/email/<user email>`

django-hijack-adminを利用することで、ユーザ管理画面からボタン１つで代理ログインできるようになります。

![admin-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/19111/7d840d3a-a112-0202-17e0-8a53358243c6.png "admin-screenshot.png")


## おわりに

ざっと簡単にdjango-hijackについて紹介しました。
django-hijackを使えば5分もかからずに代理ログインを実装できるので、ぜひ試してみてください！
デザインレビューの手法と心得

# 概要
この記事は、 [株式会社アイスタイル Advent Calendar 2016](http://qiita.com/advent-calendar/2016/istyle)の15日目の記事です。

気付けば12月も折り返し地点ですが、2016年も残り2週間ほど。
アドベントカレンダーも後半に差し掛かっていますね。早すぎる…！！

この記事では、タイトル通り、弊社のデザインレビューの手法や、個人的に気をつけていること、感じている課題について紹介します。

# デザインレビューの目的
目的は主に2つあります。

## 1. デザインの質をより一層高める
- 複数人のデザイナーの目を通すことで、より質の高い成果物にする。
- 自分一人でなかなか気づけなかったアイデアをもらえる。

実際に、レビューを通す前と通した後を見比べてみると、誰が見ても「すごくよくなった！」と思えるくらいのクリエイティブに仕上がることが多いです。

## 2. 共有
弊社では複数のPJTが存在し、色々な画面を触る機会が非常に多いため、
「自分は今ここを触っているよ！」という共有の意味も込めてレビューを行っています。

# デザインレビューの手法

githubのissueで行なっています。

github上にissueが立てられると、slackに通知が飛ぶようになってます。
また、slackのリマインダー機能を使って、期限前に再び告知します。
![b36cfa85af26324465f66a3df9684173.png](https://qiita-image-store.s3.amazonaws.com/0/147251/f94d4137-c89f-bd12-0c95-b5576f039106.png)

レビューにかける制作物は、大規模な案件だけではなく、バナーや画面の一部分を変更するときなど、ほぼ全ての制作物に対して行なっています。

## issueの内容

以下の内容を書くことが多いです。
1. 実施目的
2. チケットのURL（チケット＝タスク管理ツール）
3. デザインする上で意識したポイント
4. 期限

## レビュアーについて
レビュアーは特にこちらから指名することはありません。
前述の通り、issueが立つとslackに通知が飛ぶので、通知が来たらよしなに見ます。

基本はデザイナーが行っていますので、部署を跨いだレビューは行っていません。

# 個人的に気をつけていること

コードレビューも然りですが、人がデザインしたものに対して意見をするということは、中々の繊細な部分に触れることだと思っているので、充分な心掛けが大切だと思っています。

対面ではなく、文章のみでコミュニケーションを取る場合は齟齬をきたすこともあり、誤解を与えてしまう可能性もあります。

また、レビュー内で熱い議論になることはよいのですが、言い合いへ発展し、チーム内の雰囲気が悪くなることは絶対に避けたいです。
それを避けるために、個人的に気をつけている点があります。

## 最初の一言
いきなり淡々と述べるよりも、最初に肯定の一言があるだけでイビュイーの心は
だいぶ和らぎますし、その後のモチベーションも変わってくると思っています。

![【ispotデザイン】連合特集バナー作成-·-Issue--2-·-istyle-inc-design-review.png](https://qiita-image-store.s3.amazonaws.com/0/147251/20d5b2e0-c53c-78b4-b51e-d192cfcaf247.png)

## 褒めることを忘れない
気になるところに目が行きやすく、指摘のみになってしまいがちですが、
「ここすっごくいいと思います！」といった褒め言葉もレビューの内です。

いいところも積極的に指摘できたら、幸せになれる人は増えると思っています。

## 積極的にemojiを使う
emojiひとつ使うだけで和やかな雰囲気に。（全く関係ないemojiでも）

![1.png](https://qiita-image-store.s3.amazonaws.com/0/147251/36fae95d-85bd-378e-c26c-d3a3fd5c31cd.png)


# 課題
実際にレビューを行なっていて、感じている課題は以下です。

## レビューの時間
現状、レビュー内容や時間のボリュームが膨大なものになっているものもあります。規模によってボリュームは変わってきますし、時間をかけることはよくないということではありません。しかし、レビューに時間をかけすぎてしまうことは、負担につながりかねません。

不特定多数の人がレビューする場合は、一人が割く時間は少なくても、みんなが気付いたことをそれぞれ少しずつ記載していくだけでも良いのでは、と思っています。（一人がレビューをする場合は異なりますが）

レビューすることに対して、「時間がかかるもの」「面倒なもの」という印象になってしまうのは避けたいので、「5分」「10分」とあらかじめ時間を決めて取り組むと良いかもしれません。また、レビューに対する「時間がかかるもの」といった印象になってしまうと下記の課題につながる場合もあります。

## レビューがつかない問題
全員が常にレビューできる状態とは限らないため、レビューがつかないこともあります。またレビュアーを不特定多数にしている場合、レビュアーは「誰かがやってくれる」「とりあえず見たけど、後でコメントしよう（そして期限が過ぎる）」といった気持ちも発生しかねません。

そういった場合は、1人3分くらいで複数人に口頭でレビューをもらい、そのレビューをissueに書き起こします。文字化することは頭の整理にもなりますし、口頭で話した内容にズレがないか確認することができるので、なるべくするように心がけています。

## 最後に
多くのチームで取り入れられている「デザインレビュー」。

意見を交わすことでコミュニケーションも豊かになりますし、デザインを見る機会が増えますので非常に学びになり、とてもいい文化です。

お互いが敬意を持って意見を言い合うことで、よりよいレビューができ、よりよいクリエイティブが出来上がるのでは、と常日頃感じています。今後更にチーム全体でレビューの質を上げていければ良いなと思っています。

皆さんも、よいレビューライフを！

明日は[@suzukit](http://qiita.com/suzukito)さんです！
地域課題可視化システム"ha4go"について書きます。

いま、Code for Kanazawaで開発を続けている地域課題可視化システム["ha4go"（ハシゴ）](http://ha4go.net/)について私自身の整理する意味でも書いてみたいと思います。

## 1.ha4goを開発し始めたきっかけ
直接のきっかけは、２年前の2014年にCode for Japan主催の[Brigadeワークショップ](https://codeforjapan.doorkeeper.jp/events/16707)で紹介されたCode for Philly運用しているシビックテック用のCMS [Laddr](https://github.com/CodeForPhilly/laddr)の日本人向けのものを作る目的で、2015年4月からCfKの有志メンバーとともに開発をスタートしました。

## 2.ha4goの目指していること

ha4goが実現したいことは、シビックテックのPDCAサイクル(ちょっと古い表現..)をくるくるスムーズに回すことにあります。

CfKの活動はメンバーがリアルに集まるオフラインが基本だとおもっています。ですがオフラインだと、集まる場所によっての距離的なものや、集まる日時による時間的な制約をうける場合が当然出てきます。
また石川県だと金沢やその周辺にはエンジニアはいますが、能登ではほとんどいませんので、スキルの地域の偏りみたいなこともあります。
ha4goは課題解決のための障害になりそうな、それらの制約をなるべく少なくし、課題を集めて人をつなぎ、課題解決のための活動をスムーズにしたいと思っています。

###2.1 地域課題を集約し可視化する
CfKではアイデアソン、ハッカソンを年に何度も開催していますし、シビックハックナイトは基本毎月１回に開催しています。
地域課題を話し合ったり解決策を考える場としてはとてもよい機会だと思いますし、参加者同士の課題認識の共有の場としても機能していると思います。
ただ、課題について話した事はどこにも記録がのこらないケースもありますし、別の日に過去の同じような課題設定で最初から..というケースも少なくないと感じています。
そのようなことがないように、まずは課題の共有ということでha4goに集めるようにしたいと思っています。

###2.2 地域課題から自ら解決したい人と解決できる人を繋げる
課題ドリブンで課題を解決したい情熱を持った人と、解決のために必要なスキルを持つ人同士をつなげて解決に必要なスキームを作りやすくしたい、との思いからプロフィールにはスキルを複数登録できるようにしています。
また、課題を投稿するときに必要なスキルも一緒に登録することで、マッチングした登録ユーザーに対して招待メールが送られるようになっています。

###2.3 解決までの道づくりを手助けする
IT業界の人ならモノづくりのプロジェクトをどのようにすすめるのか、というのは体感で理解していると思いますが、CfKでエンジニアではない一般の人もプロジェクトリーダーになるケースがあります。
プロジェクトの運営に不慣れな人でも
「課題を投稿してha4goを使っていくうちに、（ha4goにのせられて）気がついたらプロトタイプまでできてた！」
みたいな流れをha4goがファシリテートできるのが目標です。

どんな形が良いのか開発チーム内でも議論していますが、
もしかしたらシステム機能としてというよりはリアルなメンターのような役割の人が必要なのかもしれません。

##さいごに
最初は半年くらいで形にできると思っていましたが、１年半開発をしてきて、当初の予想よりもかなり難しいことがわかってきました。
というのも、(あまり意識がなく外から言われて気づいたことですが..)少し大げさな表現をするとha4goはCfKのコミュニティー活動そのものをオンライン上で具現化しようとしているからだと思います。
ha4goの開発メンバーで機能を考えるときは、いつも時間が足りないぐらい白熱した議論をしていますが、実際に正解かどうかは利用者に使ってもらってトライアンドエラーを繰り返さないとわからない部分もあると思っています。
今後も地道に進めていきますが、もしコードなどで協力したい他のCode forなシビックハッカーがいらっしゃれば、ぜひぜひ[Github](https://github.com/codeforkanazawa-org/ha4go)などからジョインください。
GPD WINでFnキーを固定キー化するAutoHotkeyスクリプト

# はじめに
[GPD WIN](https://www.google.co.jp/search?q=GPD+WIN)という神機があります。
このデバイスを使うには[固定キー機能](http://hitoriblog.com/?p=46134)を使うのが便利なのですが、固定キー機能には唯一欠点があってFnキーに対応していません。
つまり`F1`を押す場合は依然としてあの小さいキーボードで`Fn`と`1`を同時押ししなければならないのです。
`F6`~`F12`あたりのキーボードの右側の方のキーならば両手で押せるのですが、`F1`~`F4`あたりになるとGPD WINを落としそうになります。

なので、[AutoHotkey](http://ahkscript.org/)を使用して`Fn`キーのちょうど反対側についてる~~使用用途のよくわからないキー~~`アプリケーション`キーを`Fn`代わりにしてしまいましょう！ついでに固定キー機能もつけてしまいましょう！更についでに半角/全角キーの代わりも適当につけてしまいましょう！

# 機能
* `アプリケーション`キーと`1`~`0`,`-`,`=`キーを同時に押すと、`F1`~`F12`が押されたことになります。
* `アプリケーション`キーを単独で1回押すと`Fn`キーが固定化されます。この状態で`1`~`0`,`-`,`=`キーを押すと、`F1`~`F12`が押されたことになります。
    * `アプリケーション`キーが固定中は、画面左上にツールチップで"Fn"と表示されます。
    * `アプリケーション`キーを固定中に`Esc`キーを押すと固定化が解除されます。
* `アプリケーション`キー単独を素早く2度押しすると、アプリケーションキーが押されたことになります。
* `アプリケーション`キーとスペースキーを押すと、`半角/全角`キーが押されたことになります。

# スクリプト

```ahk
CoordMode, ToolTip, SCREEN

DOUBLE_TAP_INTERVAL := 200


fnlock := 0

; AppキーをFnキー代わりにする
APPSKEY::
	if(0 <= A_TimeSincePriorHotkey && A_TimeSincePriorHotkey < DOUBLE_TAP_INTERVAL)
	{
		GoSub, FnLockOff
		Send, {APPSKEY}
	}
	else
	{
		GoSub, FnLockOn
		KeyWait, APPSKEY
	}
Return
	
FnLockOn:
	fnlock := 1
	ToolTip, Fn, 0, 0
;	SoundBeep
Return
FnLockOff:
	fnlock := 0
	ToolTip
;	SoundBeep
Return

#If fnlock
ESC::GoSub, FnLockOff
1::
	Send, {F1}
	GoSub, FnLockOff
Return
2::
	Send, {F2}
	GoSub, FnLockOff
Return
3::
	Send, {F3}
	GoSub, FnLockOff
Return
4::
	Send, {F4}
	GoSub, FnLockOff
Return
5::
	Send, {F5}
	GoSub, FnLockOff
Return
6::
	Send, {F6}
	GoSub, FnLockOff
Return
7::
	Send, {F7}
	GoSub, FnLockOff
Return
8::
	Send, {F8}
	GoSub, FnLockOff
Return
9::
	Send, {F9}
	GoSub, FnLockOff
Return
0::
	Send, {F10}
	GoSub, FnLockOff
Return
-::
	Send, {F11}
	GoSub, FnLockOff
Return
=::
	Send, {F12}
	GoSub, FnLockOff
Return

; ついでにApp+Spaceで半角/全角
SPACE::
	Send, {vkF3sc029}
	GoSub, FnLockOff
Return

#If
```

# おわりに
本当はキーボードについてるFnキーがAutoHotkeyで拾えれば一番いいのですが、Fnキーについては拾えるキーボードと拾えないキーボードがあり、残念ながらGPD WINのは拾えませんでした。拾う方法があれば教えてください。

GPD WINとAutoHotkeyの親和性はかなり高く、今回紹介したようなスクリプトの他にも、パッドをポインティングデバイスにする[スクリプト](http://qiita.com/diaphragm/items/95af3b41b25fab781a52)、BluetoothテザリングをON/OFFする[スクリプト](http://hitoriblog.com/?p=47192)、画面輝度を変更する[スクリプト](http://qiita.com/diaphragm/items/9769c79789d7a9958f8a)なんかも作れるので、必須ソフトウェアと言っても過言ではありません。

それでは皆様も良いGPD WINライフを！
Xamarin.Formsで作ったアプリを、力付くでFabricを使ってテスト配信する。

# はじめに
このエントリは [Xamarin Advent Calendar 2016](http://qiita.com/advent-calendar/2016/xamarin) の15日目の投稿です。

カレンダーちらっと見たら１５日目に空きができている！これは埋めさせていただかなくては！ということでやってみました。
当方Xamarin.Formsをがっつりとできるわけではないですが、頑張りたいと思いますのでよろしくお願いします！

# やりたいこと
みなさんXamarinのAdHoc配信って何使っていますか？
色々と選択肢があると思うんですが、僕が参入しているプロダクトのネイティブアプリは全部Fabricで配信しているので、今回はXamarinもFabricを使って配信を試みたいと思います。
※配信だけです。他のところは使えません。頑張ればいける？

# 前提条件
mac推奨
Xamarin.Formsのプロジェクトと、それに対するiOSのAdHoc用のプロビジョニングプロファイルは作成しておいてください。
Fabricのアカウントも予め作成お願いします！

# 手順
### そもそもFabricとは？
TwitterAPIとか、クラッシュの統計取ったりとかが簡単にできるサービスです。今回はこの中でもCrashlyticsモジュールが提供しているテスト配信を利用させていただきます。
詳しくは[こちら](http://dev.classmethod.jp/smartphone/ios-fabric-sign-in-with-twitter/#toc-fabric-)

### Xamarin.formsとFabricを結びつける。
ここからが本題です。
Fabricの導入はXCodeとAndroidStudioくらいにしかドキュメントがありません。(探したらもしかしたらあるかもしれませんが...)
なので、ダミーのXCodeプロジェクトを作って、なんとかするっていう方針にします！

まずはXCodeを開いて新規のプロジェクトを作成してください。
この時に設定するBundleIdなどは、Xamarinで作成したプロジェクトを同じものにしてください。
![スクリーンショット 2016-12-14 10.08.20.png](https://qiita-image-store.s3.amazonaws.com/0/144029/faf71b72-3204-a9c4-fccc-79e4e7be80cf.png)

![スクリーンショット 2016-12-14 10.07.16.png](https://qiita-image-store.s3.amazonaws.com/0/144029/5072e3c2-5475-5046-5916-9ee6d3f02632.png)
※BundleIdはドメイン逆読み+アプリ名でつけて、他の方の迷惑にならないようにしましょう。記事用にスクショをとっているので、実際には正しいものがセットされています。

XCodeのプロジェクトを作成したら、[このへん](http://techblog.lclco.com/entry/2016/03/28/112721)を参考にしてCrashlyticsのプロジェクトへの導入まで進めてしまいましょう。

Fabricにプロジェクトが認識されましたか？
認識されるとFabricでアプリ一覧に表示されます。
![スクショ001.png](https://qiita-image-store.s3.amazonaws.com/0/144029/296add43-6de9-37e5-5834-1fce6a49c8bc.png)
(モザイクばかりですみません...)

次はXamarinでArchiveしましょう。
証明書をAdHoc版に変更するのを忘れずに。

Archiveが完了したら、Fabricに再度戻ります。
シェアボタンっぽいのを押すと、テスト配信されているものの一覧が出てきます。(まだ0個のはず)
真ん中の上ら辺にあるACTIVESというのを押して、ARCHIVESに切り替えましょう。
そうすると、先ほどXamarinでArchiceされたものが表示されていると思いますので、それを押して配信を行いましょう。
あとは通常のFabricの手順で、配信を行うことができるようになります。
![スクリーンショット 2016-12-14 10.05.03.png](https://qiita-image-store.s3.amazonaws.com/0/144029/e27ac67c-bbf0-f796-8081-1204389a5a4a.png)

# まとめ
これでネイティブと同じくFabricでテスト配信が行えますね！
BundleIdで判別しているっぽいので、Archiveさえしてしまえば、他のフレームワーク使っていても同じような手順でできるはずです。(やったね！)

※あとからスクショして書いているので不備があったら申し訳ございません...
AndroidのAPIレベルと対応するJavaのバージョン

# 本記事について
AndroidのAPIレベルと対応するJavaのバージョンのリストが無かったので、作りました。

## もし、APIレベルと対応するJavaのバージョンが合わないと?
Android Build Toolsを利用して、Androidアプリをビルド出来ません。

たとえば、ビルドにAPIレベル24を利用する場合は、Java8を指定する必要があります。
この時、Java8を利用できないと、ビルドが失敗します。

# Android APIレベルと対応するJavaのバージョン
|Android APIレベル|Javaのバージョン|
|:------------------:|:--------------:|
|19 - 23|7|
|24 -|8|

# 参考資料
* Android
  * [\<uses-sdk> | Android Developers](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html)
  * [SDK Build Tools Release Notes | Android Studio](https://developer.android.com/studio/releases/build-tools.html)
* Android Studio
  * [SDK Tools Release Notes | Android Studio](https://developer.android.com/studio/releases/sdk-tools.html)
* JDK(Java Development Kit)
  * [Java SE - Downloads | Oracle Technology Network | Oracle](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
  * Visual Studioなどでビルドする場合は、対応するJDKをダウンロードする必要があります
温泉で回転寿司

http://togetter.com/li/1050610
をみて突発的にOnsenUIで回転寿司してみました。

無駄にVueJSも使ってますｗ

結果はこちら(Monacaで作ってます)

![UhpS2r0bdr.gif](https://qiita-image-store.s3.amazonaws.com/0/142784/55935f82-b1ba-df86-f74d-bc29fbd264c5.gif)

ソースは

```style.css
/* フッターの背景 */
div#footer-bk
{
	width:95%;                  /* 横の幅を100% */
  height: 32px;               /* アイコンサイズにする */
	position: absolute;         /* 絶対位置指定することを定義 */
	bottom: 32px;               /* 絶対位置指定(左0px,下0px) */
	padding: 0px 0px, 0px, 0px; /* 上下に余白を取る */
  overflow: hidden;
}
/* フッターの表示領域 */
div#footer{
	border: solid #fff; /* 表示領域を白枠で囲う */
}
```

```index.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/style.css">
    <script>
    </script>
</head>
<body>
<div>
  <div id="app">
    <ons-page>
      <br />
        寿司アイコンがスクロールするだけのやつ
      <br />
      <p style="text-align: center; margin: 50% 0;">
        <ons-button @click="showDialog(this);" id="click">Click me</ons-button>
      </p>
      <!-- http://www.wafuicon.com/sushi/3 -->
      <div id="footer-bk">
        <div id="footer" v-bind:style="{height: iconHeight + 'px', position: 'relative', overflow: 'hidden'}">
          <img v-for="image of images" :src="image.url" v-bind:style="{ position: 'absolute', left: image.left + 'px'}" />
        </div>
      </div>
    </ons-page>
    <ons-popover direction="up" id="popover">
      <div style="padding: 10px; text-align: center;">
        <p>
          ダイアログで回転寿司
        </p>
        <p>
          <ons-button @click="closeDialog()">Close</ons-button>
        </p>
        <div v-bind:style="{height: iconHeight + 'px', position: 'relative', overflow: 'hidden'}">
          <img v-for="image of images" :src="image.url" v-bind:style="{ position: 'absolute', left: image.left + 'px'}" />
        </div>
      </div>
    </ons-popover>
  </div>
</div>

<script langurage="javascript">
new Vue({
  el: '#app',
  data: {
    iconNum: 20,
    iconWidth: 32,
    iconHeight: 32,
    images: []
  },
  created: function() {
    for(let i = 0; i < this.iconNum; i++) {
      this.images.push({ url: './icon/sushi03_32.png', left: i * this.iconWidth});
    }
  },
  mounted: function () {
    this.$nextTick(function () {
      window.setInterval(() => {
        this.images.forEach((element, index, array) => {
          element.left -= 1;
          if(element.left < -this.iconWidth) {
            element.left += this.iconNum * this.iconWidth;
          }
        });
      },100);
    });
  },
  methods: {
    showDialog: function(target) {
      console.log(target);
      document
      .getElementById('popover')
      .show("#click");
    },
    closeDialog: function() {
      document
        .getElementById('popover')
        .hide();
    }
  }
});
</script>
</body>
</html>
```

になります。

温泉で回転寿司食べたいなぁ（ぇ
Slackで単語当てゲームのボットを作ってみた（Haskell版もあるよ）

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)の15日目です。

私が所属する新規事業開発の部署では、月1回部内勉強会を行っています。誰か一人が先生役となって、テーマとなる技術をハンズオン形式でみんなに体験してもらい、場合によっては何かを作って発表するところまでします。時間は4時間取っています。

10月のテーマはPythonとLambdaでSlackボットを作るだったのですが、今回はそこで作ったボットの話です。

ニャンコが問題を出してくるので、穴埋めして正しい英単語を答えるというゲームです。

![image](https://qiita-image-store.s3.amazonaws.com/0/79394/cace45e7-2286-451b-85cb-a8e37926cebe.png)


ニャンコが「homeless」という単語を出題して一同ざわつく場面も…

![image](https://qiita-image-store.s3.amazonaws.com/0/79394/2c5eaa65-b36f-09ca-5160-045d435420a7.png)

仕組みとしてはSlackのOutgoing WebhookとIncoming Webhookを使っています。
こちらのページを参考にさせて頂きました（というかほとんどそのまんまです…）。
[slackのbotをAWS Lambda(Python)+API Gatewayで構築 | yamamanx](
http://www.yamamanx.com/slack-bot-aws-lambda-python-api-gateway/)

どんな単語を答えても反応するようにしたかったので、Outgoing Webhookのキーワードにaからzまでの全ての文字をカンマ区切りで登録したのがちょっとした工夫です。

単語リストは[3000 most common words in English | Vocabulary Lists | Learn English](http://www.ef.com/english-resources/english-vocabulary/top-3000-words/)から取得。ただし正解判定時には`/usr/share/dict/words`を使い、正しい英単語なら何でも受け付けるようにしています。

最近Haskellに興味を持ち始めたので、勉強がてらコマンドライン用に書き換えてみたものがこちらです。
https://github.com/aoyama-val/monyado_english

手軽に作れてそれなりに遊べるものができたのが個人的にはうれしかったです。
Group モジュールについて

現在の勤務先である [Deeson](https://www.deeson.co.uk) が開発をスポンサーしている [Group](https://www.drupal.org/project/group) モジュールについて紹介したいと思います。

１０年以上の間、Drupal サイトにおいて、ユーザーグループを作成する際の定番モジュールは Organic Group (OG) でしたが、ここ一年ほどで、それに匹敵する新たなモジュールが現れました。Group モジュールには Drupal 7 と 8 向けのベータがあり、安定リリースに向けてアクティブに開発が続けれられています。

メインテイナーの [Kristiaan van den Eynde](https://www.drupal.org/u/kristiaanvandeneynde) は、OG の設計・拡張性や操作性の問題を前に、独自に Group の作成を開始しました。

##　Group モジュールの特徴
###　パーミッションとロール
独自のパーミッション・ロールシステムを持つ OG と異なり、Group モジュールは Drupal ネイティブのそれを利用します。そのため、サイト管理者がパーミッションとロールを一元管理できる上、開発者が独自の機能を追加した際に意外なアクセス権限問題に悩まされることがありません。

###　DX (Developer Experience) 
Group のコードの多くはオブジェクト指向により書かれています。メインのオブジェクトはクラスとメソッドから構成されているため、PHPStorm などの IDE が自動的にメソッド名を提案してくれます。そのため、コードを追って関数名を探すような手間が省けます。
Group モジュールは、拡張性の高さを開発初期の段階から念頭に置いて作られたため、数多くのフックが用意されています。
これに関連して、Group モジュールはコードのドキュメンテーションが充実しており、機能の詳細を理解したり、拡張する際に大変役立ちます。 group.api.php というファイルにドキュメンテーションが含まれています。


###　関心の分離
OG の問題の一つは、グループを作成する際、親となるタクソノミータームやノードなどを必要とする点でした。これは OG により作成されたグループが、親となるエンティティとの機能とは切り離せないことを意味します。
Group モジュールにより作成されたグループは、それぞれが単一で存在するため柔軟性が高くなります。

###　多機能とのインテグレーション
Group モジュールは Entity API を利用しているため、インストール直後に Views, Rules, Title, i18n などと連携して使うことが出来ます。

##　利用した感想

僕自身、今年前半に担当したサイトの一つに利用しましたが、その時点ですでに安定性の面では全く問題はありませんでした。
ユーザビリティに関しても、Drupal に慣れているエンドユーザーは、操作に戸惑うことはありませんでした。
僕には別途、OG を利用したサイトを運営しているクライアントがいますが、上述のとおり OG のパーミッションやロールの設定が Drupal のそれと別れているため、管理者のトレーニングとサポートにかなりの時間を要しており、また先方の担当が変わるとまた説明しなければならないなど、かなり苦労しています。

設計理念やコードの拡張性、またユーザビリティなどにおいて、個人的には OG よりも Group のほうが優れていると感じています。今後の発展が楽しみなモジュールです。

-----
Group と OG モジュールのメインテイナー、Kristiaan van den Eynde（左） と Amitai Burstein。Drupalcon Dublin にて
![CtWkG7hWEAA1Njx.jpg](https://qiita-image-store.s3.amazonaws.com/0/101653/01801ad5-82da-3434-d623-c2fa99d0d90f.jpeg)
https://twitter.com/amitaibu/status/780710566193225728
クラウド向けの New Relic の新しい料金計算の考え方: CU(Compute Unit)  とは

アドベントカレンダー15日目。今日は、技術的な話しではなく、アプリケーションパフォーマンス監視の `New Relic APM` とインフラ監視製品の `New Relic Infrastructure` の料金体系について説明します。

New Relic では、ちょっと前まで、New Relic APM の料金体系はホスト単位でした。つまり、利用台数 x 固定費といった考え方でした。

しかし、現在は、変動が激しいクラウド環境向けに、柔軟な料金体系を提供しています。これにより、性能の低い環境を使っている場合は、従来よりも低コストで利用が可能となっています。

## CU (Compute Unit) とは

この料金計算に使う基礎となる単位が、**CU** (Compute Unit) です。

CU の使った料金体系は以下となります。:

- APM (年契約):
    - PRO: 25 - 200 ドル/月
    - Essentials: 12.5 - 100 ドル/月
- Infrastructure (年契約):
    - PRO: : 1.80 - 14.40 ドル/月
    - Essentials: : 0.90  - 7.20 ドル/月

※ 月契約だと、APM は３倍くらい。Infrastructure は2倍くらい高くなりそう。

ちなみに、オンプレミスの場合は以下となります。

- APM (年契約):
    - PRO: 150 ドル/月
    - Essentials: 75 ドル/月
- Infrastructure (年契約):
    - PRO: : 14.40 ドル/月
    - Essentials: 7.20 ドル/月


## CU の計算方法

CU の計算式は、以下となります。

```
CU = (CPU 数 + RAM のギガバイト) x 使用時間
```

1ヶ月まるまる使用する場合を、750時間として計算します。

例えば、2 CPU 、2 GB の RAM の環境で、3 時間使用した場合は、12 CU となります。
```
(2 CPU + 2 GB の RAM) x 3 時間 = 12 CU
```

2 CPU 、2 GB の RAM の環境で、１ヶ月(750時間)使用した場合は、3000 CU となります。


## 料金計算のシュミレーター

それぞれの製品の価格ページにシミュレーターがあって、ポチポチするだけで、見積もりが分かるので、是非試してみてください。(CU とかあんまし気にせずにできるのでオススメ）

- [APM 価格ページ](https://newrelic.com/application-monitoring/pricing)
- [Infrastructure 価格ページ](https://newrelic.com/infrastructure/pricing)

以下は、New Relic Infrastructure の価格ページです。選択すると、自動的に、金額と CU が表示されます。

![newrelic_pricing_cu.png](https://qiita-image-store.s3.amazonaws.com/0/46003/66886d15-c209-1ca8-6605-ee11e09b6e65.png)


## ホスト単位の場合とどう変わるのか？

CU 単位となると、低いスペックの場合に安くなることはわかったと思います。では、クラウド特有の増減に対しての柔軟性はどうなのでしょうか？ホスト単位の場合は、増えるとその分、追加料金となります。クラウドは、CU 単位となりますので、以下のようになります。

例として、`t2.small` x 2 インスタンス を使っているとします。その場合、CU は、`4500` で、$5.40 となります。このインスタンスサイズを `t2.medium` x 1 インスタンスに変えたとします。その場合も、CU は、`4500` となります。よって、料金は変わりませんので、契約の変更も必要ありません。

このように、契約している CU 以内であれば、インスタンスのサイズの変更にもある程度柔軟に対応できます。

## まとめ

どうでしたでしょうか？ CU についてなんとなく理解できたでしょうか？ 以下のドキュメントにも CU について書いてあるので、「[Compute Unit 価格とホストの価格](https://newrelic.degica.com/docs/accounts-partnerships/accounts/account-billing-usage/compute-unit-pricing-host-pricing)」をご覧ください。
QVariantを便利に使おう

この記事は [Qt Advent Calendar 2016](http://qiita.com/advent-calendar/2016/qt) 15日目の記事です。

QVariantはQtにおけるバリアント型のクラスです。
QString, QPointのようなQtの型から、int, double のようなプリミティブ型まで
多くの型を格納することができます。
また、void\*, QObject\*, QWidget\*というポインタ型も扱えます。
そのため、多くの型に対応する必要がある場合などに役立ちます。

このクラスはQSettingsなどで活用する機会があるのですが、
直接扱う記事はQiitaになかったので書いてみました。

# 基本的な使い方
QVariantに値を格納するには以下のメソッドを使います。

* コンストラクタ
* QVariant::setValue(const T &)
* QVariant::fromValue(const T &) [static]

```cpp
void set_value()
{
    QString text("text");
    QVariant variant1(text); // constructor
    QVariant variant2;
    variant2.setValue(text); // QVariant::setValue()
    QVariant variant3 = QVariant::fromValue(text); // QVariant::fromValue() [static]
}
```

反対にQVariantから値を取り出すには以下のメソッドを使います。

* toメソッド
* QVariant::value<T>()

```cpp
void get_value()
{
    QVariant variant(QString("text"));
    QString text1 = variant.toString(); // to method
    QString text2 = variant.value<QString>(); // QVariant::value<T>()
}
```


# 具体的な使い方

QSettings を使う例がわかりやすいかと考えたのですが、
昨年のアドベントカレンダーに@taura_noさんの[QSettingsでアプリケーションの設定を保存する](http://taurano.hatenablog.com/entry/2015/12/17/014741)という記事がありましたので、
他の一例としてQVariantMapを用いた方法を示します。

```cpp
void getFileName(QVariantMap & map)
{
    QString caption = map["caption"].toString();
    QString fileName = QFileDialog::getOpenFileName(Q_NULLPTR, caption);
    map["fileName"] = QVariant::fromValue(fileName);
}

void func()
{
    QVariantMap map;
    QString caption("Let's select file!");
    map["caption"] = QVariant::fromValue(caption);
    getFileName(map);
    qDebug() << map["fileName"].toString();
}
```

上記のgetFileNameメソッドはファイル名を取得するメソッドですが、
引数にQVariantMapを渡すことで引数の変更に柔軟な対応ができるようにしています。

後にファイル名の取得方法が変更になった場合
必要に応じて呼び出し元と呼び出し先でQVariantMapのkey/valueを修正しますが、
getFileNameメソッドの引数は一切変更の必要が生じません。


尤も、保守の観点からは引数が明らかである方が望ましいです。
このような方法は自衛的なプログラミング方法として使うべきで、
引数の変更が容易にできないが、仕様の変更が考えられるなどの
限られたケースにおいて最小限で利用がよいでしょう。
RubyのFiberとEnumeratorでプロ生ちゃんgenerator

Ruby1.9から軽量スレッド[Fiber](https://docs.ruby-lang.org/ja/latest/class/Fiber.html)が追加されました。
generatorを作ってみましょう。

### Fiber
Fiberはこんな感じです。

```rb
angel = Fiber.new do |msg|
  puts "プロ生ちゃんマジ天使！"
  Fiber.yield
  puts "プロ生ちゃんマジ天使！"
end

angel.resume #=> "プロ生ちゃんマジ天使！"
angel.resume #=> "プロ生ちゃんマジ天使！"
```

これだと `puts "プロ生ちゃんマジ天使！"` を何度も書かないといけないので面倒くさいです。

```rb
angel = Fiber.new do |msg|
  loop do
    puts Fiber.yield
  end
end

10.times { angel.resume "プロ生ちゃんマジ天使！" } #=> 
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
"プロ生ちゃんマジ天使！"
```

### Enumerator
[Enumerator](https://docs.ruby-lang.org/ja/latest/class/Enumerator.html)でも同じことをやってみましょう。
外部イテレータとしての機能はFiberで実装されています。

```rb
angel = Enumerator.new do |msg|
  loop do
    msg << "プロ生ちゃんマジ天使！"
  end
end

angel.take(10).join(' ') #=>
"プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！ プロ生ちゃんマジ天使！"
```

### まとめ
FiberとEnumeratorを使ってgeneratorを作ってみました。
無限リストなどを処理するときは、[Enumerator::Lazy](https://docs.ruby-lang.org/ja/latest/class/Enumerator=3a=3aLazy.html)をどうぞ。
ニューラルガスを可視化してみた（1）

はじめまして。
カラフルボードでAIの研究開発をやっているn-suzukiです。

普段は開発半分、研究・調査半分という感じで稼働しているため、ニューラルネットや機械学習のアルゴリズムに関する学術論文を読む機会が多く、自分の理解のために論文の内容を実装してみて動かしてみることがあります。

今回はその一環で実装した「ニューラルガス」というアルゴリズムについて紹介します。

##ニューラルガス
ニューラルガス[^1]は、ベクトル量子化[^2]手法の一つで、クラスタリング、特徴抽出等に用いられます。同じベクトル量子化手法であり、より広く知られているK-means法と比較して、量子化精度が良いことが報告されています[^3]。
ニューラルガスでは、$N$個の素子（ニューロンと呼ぶ）が代表ベクトルにあたる重みベクトル$w_n$を持ち、この値を適応的に更新することで適切な代表ベクトルを獲得します。この重みベクトル$w_n$を更新する際のダイナミクスが、気体分子のような振る舞いをすることから、ニューラル"*ガス*"と呼ばれます。


[^1]: A "Neural-Gas" Network Learns Topologies, Thomas M. Martinetz, Klaus J. Schulten, Artificial Neural Networks, pp. 397-402 (10)
[^2]: $N$個のベクトルから$K$個（$N > K$）の**代表ベクトル**を選択し、それ以外のベクトルを代表ベクトルに代表させることで、データの圧縮・単純化を行う手法。
[^3]: "Neural-Gas" Network for vector Quantization and its Application to Time-Series Prediction, Thomas M. Martinetz, Stanislav G. Berkovich, Klaus J. Schulten, IEEE TRANSACTION ON NEURAL NETWORKS, Vol. 4, No. 4, (1993-7)

##アルゴリズム
アルゴリズムを簡単に説明します。
ニューラルガスのアルゴリズムには、大きく分けて"オンライン型"と"バッチ型"の2種類存在しますが、ここではバッチ型のアルゴリズム[^4]について解説します。
ニューラルガスは、以下のような非常にシンプルなアルゴリズムで動作します。

1. $p$番目のデータ$x^p$に対する、重みベクトル$w_n (n=1,\dots,N)$の近さランキング$k_n^p$を全てのデータ$(p=1,\dots, P)$について決定
2. 重み係数$h_\lambda(k_n^p, t)$を計算
3. $h_\lambda(k_n^p, t)$をもとに全ての重みベクトル$w_n$を更新
4. $t_{max}$回、上を繰り返す

重みベクトルの更新式は以下の通りです。

```math
\begin{align}
w_n(t + 1) & =  \frac{\sum_{p=1}^P h_\lambda(k_n^p, t) x^p}{\sum_{p=1}^P h_\lambda(k_n^p, t)} \\
h_\lambda(k_n^p, t) & =  \exp\left(-\frac{k_n^p}{\lambda(t)}\right)\\
\lambda(t) & =  \lambda_{ini} \left(\frac{\lambda_{fin}}{\lambda_{ini}}\right)^\left(\frac{t}{t_{max}}\right) \\
\end{align}
```

ここでの"近さ"とはユークリッド距離の近さを意味します。
ステップ1.では、あるデータ$x^p$に対して、近い順に重みベクトル$w_n$に番号（ランキング）$k_n^p (= 0, 1, \dots, N-1)$を割り振っていきます。

ステップ2.の重み係数$h_\lambda(k_n^p, t)$は、ランキング$k_n^p$の数字が若いほど大きな値をとり、ランキングが下位になるに従って指数的に減衰していきます。これは、$p$番目のデータに対して近い重みベクトルを持つニューロンほど、より$p$番目のデータに近づくことを意味します。このように、ニューロンと入力データの距離や類似度をもとにしたニューロン同士の優劣度合いをベクトルの更新に適用する学習法を**競合学習**といい、これにより、与えらたデータ集合に対して重みベクトルを均等に分布させることができます。同じ競合学習を用いたアルゴリズムとして、自己組織化マップ（SOM）があります。

パラメータ$\lambda(t)$は、初期値$\lambda_{ini}$から終了値$\lambda_{fin}$まで学習回数$t$ごとに指数的に減衰させます（$\lambda_{ini} >　\lambda_{fin}$）。これにより、学習が進むにつれて重みベクトルの変化量が小さくなり、学習を収束させます。

[^4]: BATCH NEURAL GAS, Marie Cottrell, Barbara Hammer, Alexander Hasenfuss, Thomas Villmann, WSOM 2005, Paris

##デモ
さて、文章だけではイメージしづらいと思いますので、簡単なデモを作成しました。
コードは[GitHub](https://github.com/s-naoto/Batch_Neural_Gas/blob/master/BatchNeuralGas.py)にアップロードしました。

タイトルにもなっている可視化の結果は次回掲載します。（試行錯誤しながら画像とGIFアニメのアップロードを繰り返した結果、2MB超えちゃいました笑）
hubotでポケモンGOつくったら皆遊んでくれた話

これは[チャットボット Advent Calendar 2016](http://qiita.com/advent-calendar/2016/chatbot) 15日目の記事です。

ポケモンGOと書きましたが、GO的要素はほぼ無いです（死

# あらすじ

チームでbotを作ってみたはいいものの…なんかパッとしない…
リマインダー~~と、オススメのラーメン屋を教えてくれる~~機能しかない…
↓
PokemonGOがリリースされたから、ポケモンの面白機能を付けよう！そうしよう！

…というわけでブームにあやかってみたら、メンバーの皆がびっくりするくらい使ってくれた機能のご紹介です。

# 機能概要

![SS-2016-12-13-15.49.59.png](https://qiita-image-store.s3.amazonaws.com/0/69809/120c341c-bd8c-d0d0-152d-15b14c6facd8.png)

うちのチームのbotの戸越くんです。
（※元ネタ：[http://www.yurugp.jp/vote/detail.php?id=00000086](http://www.yurugp.jp/vote/detail.php?id=00000086)）

`get pokemon`というと、botがポケモンを捕まえに行ってくれます。
その後、捕まえたポケモンとそのCPを教えてくれます。

それだけです！（今のところ）

# 中身

- hubot
- ES2015
- pokeapi（http://pokeapi.co/）
- 翻訳用json（[PonDad/pokemon.json](https://gist.github.com/PonDad/93922f63c3143489e30c3716d3d176d2)）
- ポケモンのドット絵が掲載された海外のページのURL（※なんか色々グレーな気がしますが、割愛）

※APIから画像も返却されるんですがアニメーションgifの方が可愛かったので、外部のURLを参照してます。。

プログラムは至極単純です。

```js
// configに最大値や、APIのURLなどを定義しておく

// 数値をランダム生成してリクエストURL定義
const pokeSelect = Math.floor(Math.random() * config.max) + 1;
options.url = config.api + pokeSelect + '/';
```

```js
// APIにリクエスト
request.get(options, (err, response, body) => {
    if (response.statusCode === 200) {
        const pokeData = {
            id: body.id,
            name: translateData[body.id - 1].ja, // 翻訳jsonから該当するポケモンの日本語名を取得します
            img: getUrl(body.id, body.name) // 返却値のidをもとにして、画像URLをつくります
        };

        // 数値をランダム生成してポケモンの強さ（CP）を定義
        const cpMax = 2000;
        const pokeCp = Math.floor(Math.random() * cpMax);

        res.send('CP' + pokeCp + 'の' + pokeData.name + 'を捕まえたゴシ！\n' + pokeData.img);

        // もしCPが1900よりも上だったら驚いてくれます
        if (pokeCp > 1900) {
            res.send('コイツはつよいゴシ！！');
        }
    } else {
        // APIエラーだった場合は、捕まえてきてくれません
        res.send('捕まえるの失敗したゴシ…。');
    }
})

```

pokeapiは、ポケモン図鑑の番号に合わせてリクエストを送るとポケモンの情報を返してくれます。
なんか色々遊べそうなデータがいろいろありましたが、今回は名前とIDくらいしか使っていません。

# なんか大人気

![SS-2016-12-13-16.15.23.png](https://qiita-image-store.s3.amazonaws.com/0/69809/8138ce0d-a0d2-5aed-f6e4-e3ba1733896e.png)

何がウケたのか定かではありませんが、１日１ゲットくらいの感覚でみんなポケモンを捕まえる習慣がついてきたように思えます。

ミュウとか出ると、やたらリアクションがついて盛り上がってます。
かわいい系のポケモンが出ると、一部の人がハートマークを付けてきます。

# 今後の拡張計画（夢）

## 捕まえたポケモンのデータを保持したい

現状は、APIからの返却に基づいて都度表示を返しているにすぎません。
ですが、やっぱりポケモントレーナーとしては「捕まえたい」ですよね！

そこで、ポケモンのデータを何かしらの方法で保持して以下のような情報蓄積をしたいと思ってます。

- いままでに捕まえたポケモンの種類（ポケモン図鑑だ！）
- 捕まえた同種ポケモンの中で一番高いCPがいくつなのか

`zukan pokemon`で何％図鑑が埋まったのか見れたり、`maxcp pokemon pikachu`でいままで捕まえたピカチュウの中で一番高いCPがいくつなのかを見れたりしたいです！

さらにデータが別にあるのなら、Webブラウザから参照できると面白いかも！

## ユーザー情報を取り入れる

誰が何を捕まえたのかというデータがあれば、自分が捕まえたポケモンだけを使ってパーティが組める…！

`add pokemonparty pikachu` `remove pokemonparty pikachu`とか！

そうなってくると、対戦機能とかも付けたくなってきますね！（白目）

## もっと失敗させる

現状はAPIからレスポンスさえあれば、ポケモンのゲットに成功します。
でもPokemonGOってもっとシビアですよね。

そこで、スーパーボールやハイパーボールを使うとゲット率に影響するみたいな仕組みも考えています。

そうすると…、じゃあユーザー毎の持ち物の管理とかも……？ハイパーボール投げ放題っていうのも、ゲーム性に欠けますよね…。

## デバック方法なんとかしたい

基本的にはランダム要素なので、たとえばIDが100番未満のポケモンの場合にﾎﾆｬﾗﾗする、みたいなことをしたい場合、
ひたすら100番未満が出るまでモンスターボールを投げ続けないといけなくてつらみを感じています。
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnObjectSave

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/15の記事です。

今回は、スクリプトトリガの[OnObjectSave](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.6.html#432515)です。
アクティブなオブジェクトが検証および保存された後に動きます。
現在編集中だったフィールドを抜けて（自動で保存される設定の場合はここで保存がされる）、次のフィールドへいくなどの動作の直前に動くスクリプトトリガです。

まずは、動作確認です。
https://youtu.be/qmvbi1qttlA

この例では、プルダウンで値を変更すると、以前と違う設定になっているので次のフィールドへの移動がそれぞれ違う、という動きです。
プルダウンで「小学生」を入力すると「小学校名」へ、「中学生」を入力すると「中学校名」へ、「高校生」を入力すると「高校名」へとカーソルが移動します。

この仕掛けが、OnObjectSaveで行われています。
![スクリーンショット 2016-12-14 14.07.49.png](https://qiita-image-store.s3.amazonaws.com/0/60538/fa684db1-4813-c689-97fb-7dc0817e3325.png)

OnObjectModifyも似たような動きですが、OnObjectModifyは保存に関係なく「フィールドが編集された」場合です。
OnObjectSaveは、編集された・されないに関わらず、「フィールドが保存されたら」動くということになります。

FileMakerは自動保存がデフォルトなので、なかなか違いに気づかないかもしれませんが、レイアウトの自動保存を外すと、OnObjectSaveが走った後に保存のダイアログが表示されるのを確認できると思います。
レイアウトの自動保存設定は、↓になります。
![スクリーンショット 2016-12-14 15.25.05.png](https://qiita-image-store.s3.amazonaws.com/0/60538/97d8ef1c-5441-a26c-6b0f-20a4486999e2.png)

自動保存をしない設定では、編集が終わったらダイアログが出て来ます。
![スクリーンショット 2016-12-14 15.25.19.png](https://qiita-image-store.s3.amazonaws.com/0/60538/02f444e1-1fe6-423a-b1d4-783b32b18bae.png)
これをみると、OnObjectSaveは、レコードの保存が行われる前に動くんだな、というのがわかると思います。

細かいですが、自動保存をしないレイアウトの場合は、気をつけてくださいね。
自宅内専用の簡単なファイルサーバを立ててみた

# はじめに
おはこんばんにちは、morivdenです。
家にデスクトップマシンが眠っていたので、
Linuxをインストールしてサーバ構築の勉強に使おうと思います。

サーバ構築を行う際に使用したOSは、`Ubuntu 16.04 LTS`です。
※インストールの際の細かい作業については、記述しません。

# Sambaでファイル共有ができるようにする
今回は`Samba`を使って自宅内でファイルが共有できるようにしたいと思います。
`Samba`はネットワークを通じて、互いにファイルを共有することのできるサーバソフトです。
ファイル共有を行うことで、1つのファイルを複数のユーザで共有したり、
ファイルのバックアップを行うことが可能になります。
Windowsのファイル共有機能と互換性があるので、
Windowsからでもに簡単にアクセスすることができます。

さて、早速設定を行いましょう。
家庭内限定で誰でもアクセスできるようにする程度であれば、
設定ファイルを編集しなくとも、GUIですぐに設定を行うことができます。

1. 共有するディレクトリを作成
![share.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/e97cee9a-1ca7-f961-ea0c-2bf2878f5630.jpeg)  

2. 右クリック→ローカルネットワーク共有を選択
![share2.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/d59521a0-d2c8-d5e4-a5f8-2f5d510718f9.jpeg)

3. Sambaがインストールされていない時
![share3.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/59ece578-bb7b-a276-c678-f8896f329581.jpeg)

4. パッケージをインストール
![share4.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/e9cfbbad-e4cd-a021-c1c6-a4451a04a429.jpeg)

5. インストール中
![share5.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/abfe4697-98ce-c001-6066-6431c570ab68.jpeg)

6. セッションを再起動する
![share6.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/34c92cee-c5e5-0569-b125-e0f9a34429d0.jpeg)

7. 以下の画像のようにチェックボックスにチェックを入れる
![share7.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/c26be27e-0247-ba60-03f4-7aa743ead21a.jpeg)

8. 自動的にアクセス権を付加する
![share8.jpg](https://qiita-image-store.s3.amazonaws.com/0/151976/6a2fa754-699a-12a6-2a5b-0774fc31426d.jpeg)

以上で設定は終わりです。
これでファイル共有ができるようになりました。

Windowsからアクセスしたい場合
ファイル名を指定して実行→`\\ホスト名.local` または `\\ホスト名`と入力して実行

Linux(Ubuntu)からアクセスしたい場合
ファイル→サーバへ接続→`smb://ホスト名.local`と入力して接続

# おわりに
今回は自宅内専用の簡易的なファイルサーバを構築しました。
今後はSSHでリモートアクセスできるようにしたり、
外部からもアクセスできるようにしていきたいと思います。
RESTfm のデモアプリを触ってみる

# RESTfm の公式デモアプリ
RESTfm がインストールできたならば、まずはその使い心地を知るためにデモアプリに触れてみましょう。

実はインストールをしなくても RESTfm の開発者の方々が用意してくれたデモアプリが公式サイトにはあります。

[Downloadのページ](http://restfm.com/demo)よりたどれる、[You are welcome to Create, Update and Delete records in this demo:](http://demo.restfm.com/RESTfm/demo.html)のページがそれです。ユーザ名とパスワードは併記してあるとおりです。

- User Name: write
- Password: restfm

ログインできたならばあとは直感的な操作で CRUD できるはずです。このような Webアプリ を容易に作る事ができるわけです。

# 自らのデータベースでのデモアプリ
公式アプリの次は、自らの FileMaker Server のデータベースを用いてアプリを試してみましょう。

RESTfm のインストールディレクトリのルートに demo.html というファイルが用意されています。Webブラウザ でこのファイルにアクセスしてみてください。先ほどの公式のデモアプリと同様の内容が、自らのデータベースで動いていることでしょう。

![RESTfm_demo.png](https://qiita-image-store.s3.amazonaws.com/0/72181/fbd3ef01-9285-6b42-5148-f71a88bc9dbf.png)

ただ一点、注意してください。名称こそ「Demonstration Web Application」ですが、扱っているのは本番のデータベースです。ここで CRUD した場合はそれは本番のデータベースに対する操作と同等です。Read にとどめておくか、専用のテストデータベースを用いたほうがいいでしょう。

# RESTfm の可能性
このように Web API 経由で FileMaker Server のデータベースを操作できることにより、Web API と親和性が高いアプリケーションを作ることができます。既存のフレームワークにも組み込めるでしょうし、必ずしも Webアプリケーション である必要はないでしょう[^1]。

デモアプリに実際に触れることで、便利な利用方法のアイデアが思いつくのではないでしょうか。

[^1]: コマンドラインのアプリケーション
ワンテンの自社サイトのロボゲー作ってたFlasherのその後

#Flashからその後、
どうも！ツチノコFlasherの河合です。[1-10design](http://www.1-10.com/group/)にflasherとして入社し、以降いろんなコンテンツを作らせてもらってます。Flashには本当にお世話になりました。あの人は今、ということで、この場をお借りしてFlashについての思い出語らせていだたきます。

[selflashさん](http://qiita.com/selflash/items/0b012f9d8e568df2af27)が暑く紹介してくれた[こちら](http://www.1-10.com/design/)ですが、最近入社した子に、”学生のころあの格ゲーのサイトやりました！”とか言われまして、おじさんFlasherとしてはなかなか感慨深いものがある時代になってしまいました。こないだその子からUnityのシェーダーの書き方を教えてもらいました。シェーダ楽しいけど難しい、、

#UnityとかUE4でお仕事するようになってきた
弊社での広告系Flashの仕事がだんだんなくなってきたのは2011年ぐらいからな気がします。世間はもっと早くからだったのではないでしょうか。ということで最近では[UE4でロボット](http://labs.1-10.com/blog/unrealengine4-and-kinect-for-windows.html)動かしたり、[UE4で鬼ごっこVR](http://www.moguravr.com/oni-gokko/)だったり、[Unityで仮想現実にダイブ！するVR](http://works.1-10.com/event/sword-art-online-the-begining//)や、[シンガポールの施設のアトラクション](http://works.1-10.com/event/mosh/)などなど、どれもほんとうに素敵なお仕事の実装に関わらせてもらっています。

#ゲームエンジンについて
![1-10-v3-image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/151798/514232cf-f654-8411-1484-063376f102c6.jpeg)
Flashでこれをつくるのに何ヶ月もかかっていたんです。当時は。

それが最近だとUE4のパワーで、こんな風にかっこよくなってしまいました。
![ss_unreal_demo_cap4.jpg](https://qiita-image-store.s3.amazonaws.com/0/151798/016cfc4a-7d4d-18b0-5ddb-7cc90747bd70.jpeg)

いまの時代、[こんな格ゲー](http://labs.1-10.com/blog/unrealengine4-and-kinect-for-windows.html)が（わりとさくっと）作れてしまう時代になりました。ゲームエンジンってすごい。


#軽トラを乗りこなせ！
さてFlash、Unity、UE4で制作してみて、思ったことを書きます。
- **Unity**
ポルシェ。使いやすい。簡単にきれいな絵がだせる。速くて、でもそれなりにお手軽なスポーツカーみたいなイメージ。
- **UE4**
F１カー。絵がとにかく綺麗！つかいこなすには多少難があるけど、乗りこなせばいちばん速くなる。
- **Flash**
軽トラ。速度はそんなに出ない。乗り手によってはとんでもなく華麗な動きができる。

Flashでつくるのは軽トラック乗ってるようなもんかなと。小回りきくので楽しいけど、描画速度が出ないっていうところもあったりして、それを自分の知恵と工夫で乗りこなして頑張るかんじが面白かったと思います。
この軽トラですが、[すごいのは今見てもやっぱりすごい](http://roxik.com/v/6/)。
ウェブサイトでこんなことできるんだ！すげー！ってなりました。今見てもすげー。もはやFlashうんぬんではなくすごい。

ちなみにわたしの場合UE4やUnityを触っててもFlashみたいなわくわくがありません。
UE4やUnityって綺麗な絵が出せて当たり前なんですよね。ゲームエンジンなんだから。だから表現がリッチになってきてもなかなか感動が追いついてこない（作り手として）。
でもFlashはなぜか得体のしれない感動があった、当時はFlashでうごいてるという事実に（作り手として）わくわくしてました。

#今後
Flashが出てくる前の時代、[Macromedia Director](http://www.adobe.com/jp/products/director.html)というのがありまして、マルチメディアとかCD-ROMとかが流行ってて、マルチメディアコンテンツが栄華を極めていた時代がありました。FlashはDirectorと世代交代をするようにして世の中に出てきたと覚えてるんですが、そうしてつなげて振り返ってみると１０年くらいで技術の世代交代が起こっているかんじに見えてきます。
Director（CD-ROM） > Flash(Web) > Unity、UE4？(WebGL,JS,などなど)=(スマホ、VR、プロジェクションなどなど) > ???
開発する側の人間としてはツールに振り回され続けるのはしんどいですが、いったい１０年後はどんな開発環境になってるのか、未来はAIでコンテンツが自動生成される時代なのか、今から楽しみでもあります！
2016年いいなと思ったSwiftのライブラリ

2016年ももうすぐ終わり。
なので今年いいなと思ったマイナーっぽいライブラリを紹介していきます。
地味に便利系が多いかも。


## [**RxSwift**](https://github.com/ReactiveX/RxSwift)
RxとはReactiveX(Reactive Extensions)のSwift実装です。他にもRxJavaやRxJSなど各言語や各プラットフォーム用のRxがあります。
observableなどの考え方が面白いなと思い今コレを使って何か作ろうかと思ってます。

最近注目されてるであろうライブラリです。
Qiitaでもたくさん記事があります。

他にもRxSwiftと一緒に使うことができるライブラリなどもあります。
RxRealmなどの有名ライブラリなどが対応しています。

[**RxSwift Community**](https://github.com/RxSwiftCommunity)


## [**PermissionScope**](https://github.com/nickoneill/PermissionScope)

![per.gif](https://qiita-image-store.s3.amazonaws.com/0/66167/90edc1c3-3cba-7d6d-0b11-6fa04adccff4.gif)


画像のように簡単に通知や位置情報の使用の許可などを取ることができます。


## [**AsyncKit**](https://github.com/mishimay/AsyncKit)

有名かもしれない。
これは複数の非同期処理を行えるライブラリです。
RxSwiftで非同期処理ができるので今はそっちを使ってますが、使わないときはどのアプリでもこれいれてたら便利かも。

[**作者さんのQiita**](http://qiita.com/mishimay/items/7df447969a1c38d856d8)



## [**BWWalkthrough**](https://github.com/ariok/BWWalkthrough)


![walk.gif](https://qiita-image-store.s3.amazonaws.com/0/66167/e9c2f691-a29c-6c47-3042-01575f8995e7.gif)

これは画像のようなウォークスルー、最初の説明のようなやつを簡単に導入することができます。ウォークスルーのライブラリは何個かあるけどこれが一番かなと思った。


## [**SnapKit**](https://github.com/SnapKit/SnapKit)

これもなかなかに有名かもしれない。
これはコードで簡単にAutoLayoutを書けるとかいうめちゃめちゃいいライブラリ。


```swift:hoge.swift
        box.snp.makeConstraints { (make) -> Void in
           make.width.height.equalTo(50)
           make.center.equalTo(self.view)
        }
```

こんな感じで簡単に書くことができます。


## [**DZNEmptyDataSet**](https://github.com/dzenbot/DZNEmptyDataSet)


![noda.png](https://qiita-image-store.s3.amazonaws.com/0/66167/e42dea44-d25a-41e2-e8e6-5c34841001b6.png)


データがないときに画像のようなページを簡単に表示できる。
地味に便利。

## [**NVActivityIndicatorView**](https://github.com/ninjaprox/NVActivityIndicatorView)

![Demo.gif](https://qiita-image-store.s3.amazonaws.com/0/66167/75913495-4e0e-2df1-7414-168c16a58af9.gif)


この種類のロードアイコンから選んでロード画面ができる。
地味に便利。


## [**R.swift**](https://github.com/mac-cain13/R.swift)


![r.gif](https://qiita-image-store.s3.amazonaws.com/0/66167/908e2305-45ed-55ea-0219-2943e812c73a.gif)

上図のようにクールにイメージとかを書ける。
地味に便利すぎるやつ。


## [**Vapor**](https://vapor.codes/)

これはSwiftをサーバーサイドで使えるようにしたライブラリです。
導入が少しめんどくさいですが面白いライブラリです。
ちょっと前に導入の記事書いたんで見てみてください。
[サーバサイドSwiftライブラリ Vaporの始め方 (Docs読むのめんどくさい人用)](http://qiita.com/Sakumiki/items/6b3e6f15774d469b1b8b)


## これくらいかな
今年いいなと思ったのはこれくらいですかね。
年明けまでにいいの思い出したら、書き足そうと思います。
Vim 8.0 Advent Calendar 15 日目 新しいオプション その 2

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 15 日目の記事です。

新オプション紹介その 2 です。その 1 に比べると地味なオプション達を簡単に紹介します。それぞれ詳細は help を参照してください。

## `'renderoptions'` (特殊形式文字列)

テキストレンダラの設定です。このオプションを設定することによって、Windows ではレンダリングに DirectX を使えます。
また、DirectX に対して様々なオプションを設定できます。

## `'emoji'` (真偽値)

オンにするとユニコード絵文字を全角とみなします。デフォルトはオフです。

## `'langremap'` (真偽値)

元々 `'langnoremap'` オプションがありました。このオプションは真偽値のオプションであったため、これをオフにしようとすると以下のようになります。

```vim
set nolangnoremap
```

これは二重否定でわかりづらい、ということで追加されたのが `'langremap'` オプションです。`'langnoremap'` オプションは今も互換性のために残されていて、この 2 つのオプションは常に逆の値を指すようになっています。

## `'signcolumn'` (特定文字列)

sign の桁を表示するかどうかを設定します。デフォルトは `auto` で、sign が存在する場合のみ表示されます。
その他、`yes` `no` で常にオン/オフが可能です。

sign は本来の目的以外でも、行全体をハイライトするために hack 的にプラグインから使われる場合があり、このような時に `no` を設定することで余計な sign カラムを非表示にすることができます。

## `'tagcase'` (特定文字列)

タグファイル内を検索する際の大文字小文字の区別する方法を指定します。
元々はこれは `'ignorecase'` オプションの値に依存していましたが、`'ignorecase'` はインタラクティブな検索などで使われることもあり、オンにしている人が多いかと思います。一方、タグファイル内の検索はプログラミング言語の識別子などが入っていることもあり、大文字小文字は区別して欲しい場合が多いです。そこで、それぞれ独立して設定できるようにするために `'tagcase'` オプションが追加されました。
デフォルト値は `followic` で、互換性を保つために `'ignorecase'` に追従します。常に大文字小文字を区別して欲しい場合は、`match` を設定します。他にもいくつか設定できる値があります。

## `'termguicolors'` (真偽値)

オンにすると、ターミナル内でも GUI 用の 24 ビットカラーのカラースキームが使用できます。ただし、ISO-8613-3 互換のターミナルが必要です。
対応していないターミナルでオンにすると残念なことになるので注意してください。

## `'luadll'` `'perldll'` `'pythondll'` `'pythonthreedll'` `'rubydll'` `'tcldll'` (文字列)

Vim には様々な言語のインターフェースがあり、ビルド時にこれらを指定できます。
ダイナミックリンクも可能でしたが、これまでは、その dll のファイル名はビルド時に指定したものに固定でした。
しかし、ダイナミックリンクである以上、ファイル名は環境によって変わる場合があります。そこで、オプションによって dll のファイル名を指定できるようになりました。
`'pythonthreedll'` は Python 3 のためのものです。本来 `'python3dll'` としたかったようですが、オプション名に数値が使えないという制約が存在したため、このようになっています。