OmniAICreator/Qiita-1.07M huggingface dataset:
Xbox360コントローラーとmindstorm-EV3でラジコンを作る【前編】

## はじめに
Xbox360コントローラーを使ってmindstorm-EV3のモーターをコントロールします。
EV3で動くLinux環境ev3devを使って開発します。この記事は、EV3にev3devをインストールし、SSH接続できている状態であることを前提にしています。
環境構築ができていない方はこちらの記事を参考にしてください。
>
[mindstorm-EV3をLinuxで制御しよう! ev3dev OSのインストールととSSH接続](http://qiita.com/murotani/items/46f905bec33b1673c41a)

## 環境
- mindstorm-EV3
- PC : Ubuntu 15.04
- ev3dev (ev3dev-jessie-2016-10-17)

PCはJavascriptが動けばよいのでUbuntuである必要性はありません。

## 必要なもの
- Xbox360コントローラー　　　


![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/149019/a94d8223-af9a-cb3f-b481-b40649439118.jpeg)


## 今回作るもの（動画）
前進、左右旋回、ボール発射の動きができるシンプルなロボットです。
右トリガーを押すと右旋回、左トリガーを押すと左旋回、Bボタンを押すとボール発射します。
(クリックで動画再生)

[![YouTube](http://i.ytimg.com/vi/gPDc_OgnoOg/hqdefault.jpg)](https://www.youtube.com/watch?v=gPDc_OgnoOg)

## 仕組み
![スクリーンショット 2016-12-18 16.28.10.png](https://qiita-image-store.s3.amazonaws.com/0/149019/467e2f8e-8276-e3ca-3705-72a815123f92.png)
ev3dev上にnodejsでWebサーバーを立てます。PC上で取得したXbox360コントローラーの入力をWebサーバーに送信することでラジコンを実現します。

## 機体の準備
![1 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/149019/97140702-42d0-01ac-b5b4-6cd1e0d41841.jpeg)

### 駆動部
右前輪駆動LモーターをインテリジェントブロックのAポートに、左前輪駆動LモーターをBポートに接続します。
### 発射部
ボール発射機構に使うMモーターをCポートに接続します。

## 動かし方
### １　nodejsのインストール
```
sudo apt-get update
sudo apt-get install nodejs
```

### ２　リポジトリからクローン
```
git clone https://github.com/muro-tani/xboxEv3Tank.git
cd xboxEv3Tank
sh motorSetup.sh　 //接続されているモーターのファイルパスを初期化
nodejs app.js　　　　　　　　　//実行
```

### ３　Xbox360コントローラーをPCに接続



### ４　ブラウザを立ち上げて[http://ev3dev.local:3000/](http://ev3dev.local:3000/)にアクセス
このような画面が出てくれば成功です。
![スクリーンショット 2016-12-18 17.09.36.png](https://qiita-image-store.s3.amazonaws.com/0/149019/b4a54d01-e8d1-f10f-4da1-dabc9c8bc484.png)

### ５　操縦方法
右トリガーボタンを押している間、右旋回。左トリガーボタンを押している間、左旋回。
右トリガーボタンと左トリガーボタンを同時に押している間、前進。
Bボタンを押すとボール発射
というようにプログラムされています。

後編に続きます
[Xbox360コントローラーとmindstorm-EV3でラジコンを作る【後編・プログラム解説】](http://qiita.com/murotani/items/e911bb96aabe44612d88)
Rustでゲーム作ってるお話

Rustといえば**高速実行**、**高安全性**、そして**並行性**を達成するということを目的とした言語ですが、それらにものすごくぴったりな用途が存在します。そう「ゲームプログラミング」です(安全性はゲームプログラミングに限った話ではないですが)。
というわけでRustでゲームエンジンとゲーム作ってますというお話をします。というより、それらの中で便利だと思うor裏技的に活用してるRustの機能を紹介していく感じになります。

ゲームエンジンの詳細については[別のアドベントカレンダーの同日記事](http://qiita.com/Pctg-x8/items/ccdb005cf08491ed964d)を参照していただくとして、とりあえず本題に入っていきます。

## traitによる詳細な可視範囲の設定

ゲームを製作するにあたって、勉強とかもろもろを兼ねて新規に内製エンジン"Interlude"を並行して開発しているのですが(いずれcrates.ioにあがるとおもいます。たぶん)、そのなかで`trait`を活用(駆使)してクレート内にのみ見える内部メソッドみたいなものを定義しています。
現在のRustでは全体に公開(`pub`)か同一モジュール外には非公開かの可視性しか指定できませんが、Interludeでは`trait`を使用してそれをクレート外にエクスポートしないことによりクレート外から内部メソッドにアクセスできないようにしています。これが正攻法かどうかはわからないのですが(もっと良い方法があったら教えてください...)。

```rust:lib.rs
mod a;
pub use self::a::Data;

mod internals { pub use super::a::*; }
```

```rust:a.rs
use super::internals::*;

// Data::getは外からみえるようにしたいけどData::newは外からみえて欲しくない(でも同一クレートの他modからは見えてほしい)
// -> DataInternalsというトレイトを定義してそれをクレート外にエクスポートしなければ中でしかみえなくなる
pub struct Data(u32);
impl Data { fn get(&self) -> u32 { self.0 } }
pub trait DataInternals : Sized { fn new(v: u32) -> Self; }
impl DataInternals for Data { fn new(v: u32) -> Self { Data(v) } }
```

## enumと&mut selfを用いてオブジェクト死亡処理を効率よく行う

制作中のゲームのほうでは`enum`でオブジェクトの状態を管理するようにして、アップデート処理で`&mut self`を受け取るようにしています。こうすることでオブジェクトの状態を綺麗に管理することができ、「死亡中はこのメンバにさわってはいけない」みたいな不安全さも取り払うことができて、さらにインプレースでの処理になるので効率もよくいいことだらけです。また、ゲームのほうではアップデート処理を並列化するのに[Rayon](https://crates.io/crates/rayon)を使用しているのですが、これとの相性も良いです。ただ`self`を直接書き換えるので見栄えとしてはそんなによろしくないというか。

例として、次のようにオブジェクトを定義するとします。

```rust
#[derive(Clone)]
enum GameObject { Free, Living(u32), Garbage(u32) }
impl GameObject
{
  fn update(&mut self, require_to_die: bool)
  {
    if let &mut GameObject::Living(bx) = self
    {
      if require_to_die { *self = GameObject::Garbage(bx); }
    }
  }
}
```

updateでrequire_to_dieがtrueの状態でわたってくると死亡状態になるようにします。オブジェクトの後始末に必要な情報も一緒に渡す必要があるのでu32を渡しています。
これを管理するほうですが、次のようにします。

```rust
let mut objects = [GameObject::Free; MAX_GO];
...
objects.par_iter_mut().for_each(|o| o.update(...));
for go in objects.iter_mut()
{
  match go
  {
    &mut GameObject::Garbage(bx) => { 後始末コード; *go = GameObject::Free; },
    _ => ()
  }
}
```

par_iter_mut().for_each(...)でループを回して、そのあとにもういちどforを回してGarbageを後始末しつつFreeに変換しています。
最終的に普通にforで回すのでupdateと一緒にしてしまってもいいんじゃないかと思わなくもないのですが、updateの中身が激重とかだと天と地ほどの差が出るんじゃないかと思います(期待)。ここに出てくる後始末コードというのはどう頑張ってもシングルスレッドでしか動かせないような処理(メモリ解放とか)をするコードで、これもupdate内でやってもいいのですがロックにかかる負荷を少しでも減らそうという考えです。

## おわりに(雑感)

ゲーム制作においてGCは動作負荷を予測できなくて予期しないプチフリーズを引き起こしたりするからできるだけ切るようにする、というのはずっと言われてきたことではありますが、~~ぶっちゃけC#とか普通に使われてるし今ではもうそこまで気にしなくてもいいような気が~~RustはGCがなくその心配がないので、性能にかなり信頼を寄せてプログラムを書くことができたような気がします。ただ、GCがない分メモリ管理に重点を置く必要が出てくるのでそこだけ見れば普通に生産性は落ちます。ただ、その落ちた生産性を上回る(かもしれない)くらいの便利な機能(パターンマッチとか)が豊富なので普通にC++で開発するよりはかなり精神的に良いプログラミングができると思います。
Tango対応ファブレットPHAB2 Proをさわってみた

以前から注目していたTango対応ファブレット[Lenovo PHAB2 Pro](http://shopap.lenovo.com/jp/smartphones/phab-series/phab2-pro/)が届いたので、早速さわってみました。


## Tangoとは
[Googleが開発を進めてきたAR(拡張現実)のプラットフォーム](https://get.google.com/tango/)です。
深度センサ、光センサなどを搭載した対応デバイスを通して、空間を立体的に捉えることができ、ARコンテンツを重ね合わせることができます。


## PHAB2 Pro 開封の儀
まずは、箱に入った状態から。
デバイスの特徴であるカメラ、センサが見えるパッケージデザインになっています。箱にもTangoのロゴが入っていますね。
![IMG_1318 (1).JPG](https://qiita-image-store.s3.amazonaws.com/0/153460/c3aa267a-b58c-b36a-3a1c-0d4f3443ed44.jpeg)

本体を取り出した状態。
6.4インチとかなりの大画面です。
![IMG_1320 (1).JPG](https://qiita-image-store.s3.amazonaws.com/0/153460/65baf65a-613e-ff4f-36ad-6c57e272099e.jpeg)

最後に背面。
取説を読まない子なので、どれがどれかよくわかりませんが、たしかにセンサがたくさん付いています。
![IMG_1322.JPG](https://qiita-image-store.s3.amazonaws.com/0/153460/39df8f4a-19d6-6b27-afad-d863110afd58.jpeg)

本体以外の付属品として、ACアダプタ、USBケーブル、イヤフォン、取扱説明書(英語、日本語)が付いてました。


## Tangoアプリをさわってみる
ホーム画面の"Tango"アイコンをタップすると、Tango対応アプリを表示・ストア検索できます。

Tango対応アプリの"Lenovo AR Camera"を使って、AR写真を撮影してみました。
![ARPET_IMG_201612172139280732.jpg](https://qiita-image-store.s3.amazonaws.com/0/153460/85ab5e44-4693-2795-8fff-d088f27472c6.jpeg)

MacBookから生えている花はARコンテンツですが、タッチパッドやキーボードを接地面としており、影を落としているのがわかるかと思います。
このように、Tangoなら違和感のない自然なARを実現することができます。


## アプリをビルドしてみる
開発者向けにJava、C++、UnityのSDKをGoogleが配布しています。
[Unity SDK](https://developers.google.com/tango/apis/unity/)をダウンロードして、サンプルアプリをビルドしてみました。

1. Unityで適当な名前のプロジェクトを作成
2. "Assets" > "Import Package" > "Custom Package..."から、ダウンロードした"TangoSDK_Argentine_Tango_Unity5.unitypackage"をインポート
3. "Project"タブの"Assets" > "Tango SDK" > "Examples" > "Scenes"からサンプルを選んで、"Hierarchy"タブにドラッグ&ドロップ
4. "File" > "Build Settings..."で"Android"を選択して、"Switch Platform"

あとは、[Androidアプリ向けのデバッグ、ビルド](https://docs.unity3d.com/ja/current/Manual/android-GettingStarted.html)と同じ手順のため、割愛します。


## ビルドしたアプリを動かす
実際に、PHAB2 Proで実行してみました。
ビルドしたのは、"ExperimentalMeshBuilderWithColor"です。
![Screenshot_20161218-003355.png](https://qiita-image-store.s3.amazonaws.com/0/153460/1c60edf6-6149-63f8-baca-2975f110f7a1.png)

静止画ではわかりにくいですが、カメラを向けた方向の壁や障害物をリアルタイムに検知して、3Dメッシュ化するアプリです。
"Export"をタップすると、OBJフォーマットで保存してくれます。


## まとめ
PHAB2 Proの発表時からTangoには期待していましたが、少しさわっただけでも他のデバイスでは体験できない要素が詰まっていて、大いに可能性を感じます。
このスペックのSIMフリー端末で、49,800円(税別)なら買って損はないでしょう。

Unity初心者なのですが、API仕様やソースコードを読みこんで、Tangoアプリ開発にもトライしてみたいです。
[iOS][Swift]Admobの広告をSwiftで表示する


個人的なメモ。役立つ人がいれば。
まだまだ、アプリ開発は初心者のという私のような人向け。

## 環境 ##
Xcode8.1/Swift3.0


## 広告導入 ##
iAd が使えないし、簡単に広告を入れてみる。

導入は、podfile を書いてみた。コマンドラインで、pod init して、pod install をする。

```Podfile
target 'SaimonCats' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  # use_frameworks!
    pod 'Firebase'
    pod 'Firebase/AdMob'
    pod 'EAIntroView', '~> 2.10.0'

  # Pods for SaimonCats

(略)

end
```

brigeも書いて定義する。

```Header:Bridging-Header.h
#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "EAIntroView/EAIntroView.h"

#endif /* Bridging_Header_h */
```

ViewController の Delegate を定義する。

```swift:ViewController.swift
class ViewController: UIViewController, GADBannerViewDelegate {
```

ViewController に func を定義する。

```swift:ViewController.swift
    // Admob広告表示処理
    func getAdBannerView(_ BannerType: Bool) -> GADBannerView {
        // Admob Version
        print("Google Mobile Ads SDK version: " + GADRequest.sdkVersion())
        
        // bannerViewの作成
        var bannerView: GADBannerView = GADBannerView()
        bannerView = GADBannerView(adSize:kGADAdSizeBanner)
        
        // 表示位置計算
        var bannerY:CGFloat = 20
        if BannerType {
            bannerY = UIScreen.main.bounds.size.height - bannerView.frame.height
        }
        let bannerX = (UIScreen.main.bounds.size.width - bannerView.frame.width) / 2
        
        // 表示位置設定
        bannerView.frame.origin = CGPoint(x: bannerX, y: bannerY)
        bannerView.frame.size = CGSize(width: bannerView.frame.width, height: bannerView.frame.height)
        
        // 表示バナーのIDを指定
        bannerView.adUnitID = bannerId // Enter Ad's ID here
        
        // delegate と表示先指定
        bannerView.delegate = ViewController()
        bannerView.rootViewController = self
        
        // バナーをリクエスト
        let getrequest:GADRequest = GADRequest()

        if debugModeFlag {
            // テスト用バナー
            getrequest.testDevices = [kGADSimulatorID]
        }

        bannerView.load(getrequest)
        
        // バナーを返す
        return bannerView
    }
```

別のViewControllerから呼ぶ。

```swift:SampleViewController.swift
	let viewController = ViewController()
	let bannerView:GADBannerView = viewController.getAdBannerView(true)
	self.view.addSubview(bannerView)
```

他に書き方もあるとは思いますが、一例ということで。

## 自分のアプリに反映 ##
以下のアプリで使っています。スクリーンショット観てみてください。

[AppStore] Simoncats
https://itunes.apple.com/jp/app/simoncats/id1078064315?mt=8
Swiftのsortが、要素数が増えると安定ではなくなる話

# はじめに

タイトル通り。これではまった。

# 調べたこと

## コード
以下のコードで、sortの挙動を調べた。
わかりやすいように、sortの処理はつなげて書かずに分割してある。

```swift

typealias Pair = (Int, Int)

// 要素数21個の場合
let array1 = (0 ... 20).map { i in
    Pair(i / 5, i)
}

// tupleの2つめの要素でsortしてから
let sorted1 = array1.sorted { (p1, p2) in
    p1.1 < p2.1
}

// tupleの1つめの要素でsort
let sorted12 = sorted1.sorted { (p1, p2) in
    p1.0 < p2.0
}

print(sorted12)

// 要素数501個の場合も同じことをする
let array2 = (0 ... 500).map { i in
    Pair(i / 5, i)
}

let sorted2 = array2.sorted { (p1, p2) in
    p1.1 < p2.1
}

print(sorted2)
    
let sorted22 = sorted2.sorted { (p1, p2) in
    p1.0 < p2.0
}

print(sorted22)
```

## 結果
要素数21の場合は安定なのに、要素数501の場合は安定ではなくなっている様子がおわかりいただけるだろうか。

<img width="1529" alt="スクリーンショット 2016-12-18 1.14.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/73290/b914fd4d-2b0c-2e87-7427-225c7bb022c2.png">


# 原因
未調査。Swiftのコードを読もう。

# 最後に
安定じゃないと困るようなsortをするときは気をつけよう。私は自前でマージソートを実装して乗り切った。
Mayaのノードからアトリビュートのコネクト情報を確認してみる（破壊処理を行う前に）

初めての投稿というのもありちょっとした内容に触れてみたいと思います。
実際はもっと良い方法もあるかもしれません、その場合はぜひ情報を頂けると感激します。

#　はじめに
今回は constraint されている、または connection されているアトリビュートを検知したいと思います。
なぜこの話題でこの内容かといいますと、listAttr　を使用してアトリビュート情報を持ってきたとします。
ですがこれに isConnection をかけて調べても constraint や Expression は検知できますが
connection でつなげられている場合は素通りしちゃうんですね。

そのうえで connection されている attrbute を普通にコンストレインしてしまったとします。
アニメーションを焼き付けて戻す時には当然 connection は外れてしまうのです。

これは困る。

マジで困る。

リグの質が変わる可能性がある。（たまに外部の人がそれでリグを破壊することがあります。）

ということで何となくでコンストレインしたり、スクリプトでまとめて処理する時などにちゃんと検知して
もし connection されているようだったら対象から除外して欲しい！という意図をもってこの内容と致しました。
いっそチェッカー仕様にして warning しても良いでしょうね。

ということで本編に入ります。

#　実際にやってみる

```
connection = pm.listConnections(node, connections=True)※1
if connection:
    for _c in connection:
        if (not isinstance(_c[0], pm.general.Attribute)※2
                or isinstance(_c[1], pm.nodetypes.AnimCurveTA)
                or not _c[0].isDestination()):
            continue
    # 上記条件をすり抜けるアトリビュートは従属されているアトリビュート
```

はい、唐突にスクリプトをペッと貼り付けました、とりあえず上の二行(※1)はどうでも良いでしょう。
nodeにある全てのコネクションの取得と、取得できたかを見ているだけです。

listAttr からはアトリビュート属性のみを収集しますが、listConnections は非常に強力です。
本当につながっていれば何でも取ってきます、とりあえずここから洗い出しましょう。

まず listConnection でとった情報には当然一定の規則があります。

([nt.Attribute(name), nt.contraint(name)],　[hoge, hage]...etc)

こんな感じです、内容は適当に書いたので細かいところは気にしないでください。
for文で回すと中のリスト部分が取れます。

ここの部分ですね：
[nt.Attribute(name)※A, nt.contraint(name)※B]

このリストの中は

※Aと書かれている側が必ずConnection関係を調べたノード側
※Bがそのコネクション内容（コネクション先）

となります。

さてここまで情報を抜き出したのであれば後は状態を確認するだけです。
今回の条件は for　の中にある if に記載される条件式(※2)です。

```
if (not isinstance(_c[0], pm.general.Attribute)
        or isinstance(_c[1], pm.nodetypes.AnimCurveTA)
        or not _c[0].isDestination()):
```

行っていることを説明すると

+ isinstance で、ノード側の情報がアトリビュートか調べる。
+ アトリビュートが AnimCurve か調べる。（キーアニメーションしている場合は接続されているため）
+ 最後にisDestination()、アトリビュート属性でかつ、従属先があるか調べる。

やや力技ですが、以上となります。


# 最後に

内容自体は非常に簡単ですので、皆様なにがしかの形で似たようなことを行っているかとは思います。

ただ他社様のデータに対し破壊的な処理を行う場合には、
改めて間に似たような処理を一度かませてくださると非常にありがたいです。

この調べ方は他にもいろいろできますので
今回はコンストレイン、コネクションとリグに使われるものを例にしましたが、
テクスチャ周りなどでも似たようなことはあるかと思います。

ある程度の経験者であればちゃんと調べて問題ない形にしていただいているかと思いますが、
もしスクリプト勉強し始めたばかりです！
ということであればできる限り丁寧に扱っていただきたいと思います。

何かあればご一報くださいませ。
Yesodで作るWebアプリの起動時にDBに対して処理を行う

Yesod Advent Calendar 2016|14日目の投稿です。

Webサーバ起動時にDBに対して処理を行いたいことがあります。
例えば設定値テーブルにデフォルト値を突っ込んだり、システム管理者を登録したり・・・

Yesodでこのような処理を行う場所は、```Application.hs```の中の```makeFoundation``` 関数が良さそうです。

# 書き方
Yesodのテンプレートで作成した```makeFoundation```関数の中には次のような処理があります。

```Application.hs
-- Perform database migration using our application's logging settings.
runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc
```

この処理を真似して新しい処理を追加することで、起動時にオリジナルのDBアクセス処理を追加することが出来ます。
例えば以下のように。

```Application.hs
-- Perform database migration using our application's logging settings.
runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc

-- DB処理を追加
runLoggingT (runSqlPool (initializeDbData) pool) logFunc
```

 ``` initializeDbData ``` 関数の中では、``` selectList ``` など、 ``` Database.Persist ``` モジュールの関数が使えます。Modelも展開されているので、Handler関数の中と同じ感覚でDBアクセスが書けます。

```Applicatin.hs
initializeDbData = do
    l::(Maybe (Entity SystemConfiguration)) <- selectFirst [] []
    case l of
        Nothing -> do
                     now <- liftIO $ getCurrentTime
                     sc  <- pure $ SystemConfiguration {
                                     _systemConfigurationValue = "XXXX"
                                   }
                     _ <- insert sc
                     pure ()
        Just _ -> pure ()
```

以上です。
JDK9 Incubator Module

この記事は、[Fujitsu Advent Calendar](http://qiita.com/advent-calendar/2016/fujitsu)の12/18の記事です。
12月に入って、突然、Incubator Moduleが[OpenJDK JEP 11](http://openjdk.java.net/jeps/11)として登録されました。この記事では、このIncubator Moduleについて簡単に紹介します。

##Incubator Moduleとは

Incubator Moduleは簡単に言うと、正式なJava SEの仕様ではないが、お試し版としてOpenJDKに入れるモジュールのことです。現在、HTTP/2などが候補となっています。

このJEP11は、他のJEPと違っている点が２つあります。

一つは、冒頭で「突然」と言いいましたが、JEP2.0のプロセスでは、通常、ステータスがCandidate(OpenJDKのロードマップに入る)になる前に、メーリングリストなどで議論されることになっていますが、今回は特になかったようです。

もう一つは、番号が11番になっていること。JEPの番号は101番から振られて、現在302番まであります。(1番はJEP自身のこと、2番はテンプレートで、3～100までは欠番になっていました。)新しいJEPなら303番になるはずが、これまで使われてこなかった11番が割り当てられています。

この２点について、そうなっている理由は共通で、Incubator Moduleが、Feature JEPではなく、Informational JEPであるためです。Informational JEPは、Feature JEPのワークフローにのらないということで、特別な議論なくCandidateになり、番号もFeature JEPとは違う採番になりました。ただし、Information JEPはこれまでも他にあり、101番以降が使われています。(例 JEP 188: Java Memory Model Update)


##仕様

Incubator Moduleのライフタイムは限定的で、その機能がJCPで標準化されないなら、削除されることになります。

Incubator Moduleのモジュール名は、「jdk.incubator.xxx」とします。

Incubatorの機能は、Incubator Moduleからのみ、exportされます。将来、この機能が標準化された暁には、パッケージ名が変わり、Incubator Module以外のモジュールからexportされます。Incubator ModuleとそのAPIはなくなることがありますが、その場合「@Deprecated」アノテーションはつけるべきではないとされています。Deprecatedとは別の概念です。したがって、Incubator Moduleを使う場合は、将来の非互換についてリスクを取る必要があります。

Incubator Moduleは、Incubator機能のみをexportでき、「java.」とか「javax.」のAPIをexportできません。Incubator Moduleは、「jdk.unsupported」モジュールとも関係なく、sun.misc.Unsafe等のAPIもexportできません。

Incubator Moduleは、JREには含まれません。JDKランタイムには含まれますが、アプリケーションから自動的に使うことはできません。アプリケーションから使うには、javaコマンドに「--add-modules」オプションが必要となります。

##背景

OpenJDKは、OSSである一方で、Java SEのRI(参照実装)という側面があります。Java SEの仕様はJCPで標準化されますが、それ以外の機能をOpenJDKは自由に加えることは可能です。ただし、RIにある機能がde-fact標準になってしまう恐れがあり、そうなるとJCPでの標準化の意義が薄れてしまいます。ですが、そうは言っても、JCPでの標準化には時間がかかり、最新技術をタイムリーに提供できないのも困ります。

というようなジレンマを解決するための施策のようですが、本当に解決になっているのかどうなのかという議論はあります。
vagrantでスナップショットを日本語名にしたら起動できなくなった

いつも通りvagrant upしようとしたらエラーが出ました。

# エラーメッセージ
```
C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/util/io.rb:32:in `encode': incomplete "\x83" on Windows-31J (Enc
oding::InvalidByteSequenceError)
```

# 原因
スナップショット名に日本語が含まれていたためでした。
virtualbox側でスナップショットを作るとやりがちだと思います。

# 解決方法
スナップショットの名前を変えたら解決しました。
Shinosaka.rb 合宿@松江

Shinosaka.rbは松江Ruby会議に合わせて松江で開発合宿を開催しています :smile:
松江合宿の内容をレポートします。

最初にShinosaka.rbの合宿で松江市の福田さんと日程の調整をしてくれた @macera に感謝です。
ホントに助かりました。

## :snowman2: 大雪
合宿初日は大雪で、参加メンバーの到着が大幅に遅れてしまいましたが、なんとか到着、、 :sweat_smile:
![IMG_0182.jpg](https://qiita-image-store.s3.amazonaws.com/0/6470/2b6d2626-1ae6-fa8d-3ee2-458dc3b56177.jpeg)

## :house_with_garden: 合宿先
### 美保館
今回の合宿先には[美保館](http://www.mihokan.co.jp/)を利用させてもらいました。
WiFiやプロジェクターなどいたれり、つくせりでした。
開発合宿には最高の環境を用意していただけました（松江市ヤバい） :laughing:

![IMG_0184.jpg](https://qiita-image-store.s3.amazonaws.com/0/6470/14e28764-eafb-3805-8297-444ae3f977db.jpeg)

![u30acu30f3u30d0u30ebu30d3u30a3.jpg](https://qiita-image-store.s3.amazonaws.com/0/6470/b9944b5c-1de8-e733-7bfb-21a33ad3074d.jpeg)

### カニ :crab: 
カニがめっちゃおいしくて、他のメンバーの分まで頂きました。
![IMG_0213.jpg](https://qiita-image-store.s3.amazonaws.com/0/6470/c8346fac-f04e-672c-8d15-8e7450a80527.jpeg)

## 開発合宿
Shinosaka.rbでは[Tebukuro](https://github.com/shinosakarb/tebukuro)というイベント管理サービスを作っています。
その開発をする為に、この合宿を企画しました。
大雪の為に、到着が遅れたけど無事に開発できたし良かった。

![shinosakarb_matsue_2016.JPG](https://qiita-image-store.s3.amazonaws.com/0/6470/58b0cac2-c158-ca94-b85b-be160d47da29.jpeg)

## 松江Ruby会議08
[松江Ruby会議08](http://matsue.rubyist.net/matrk08/)に参加したかったので、合宿をこの日程で調整しました。

講演がホントにすばらしかった。
開発合宿スケジュールの都合で、松田さんの講演までしか聞けなかった:sweat:
これからのShinosaka.rb 運営のヒントにもなりました。

|発表者|内容|
|---|---|
|@ppworks|[許可を得る前にプルリクしよう](https://speakerdeck.com/ppworks/matrk08)|
|@yukihiro_matz|松江Ruby会議|
|@a_matsuda|[My Favorite Tools](https://speakerdeck.com/a_matsuda/my-favorite-tools)|

### LT
松江Ruby会議でLTしてきました。
Shinosaka.rbのこれまでとこれから。関西のRubyコミュニティを紹介しました。
発表したスライド => [僕とRubyコミュニティ](https://murajun1978.github.io/slides/matsue_rubykaigi08/slides/)

![1080651.jpg](https://qiita-image-store.s3.amazonaws.com/0/6470/be46865d-42f4-4879-089c-c704a774729f.jpeg)

## 松江オープンソースラボにいってきた
松江Ruby会議の会場の別館にオープンソースラボがあるので見学させていただきました。
Twitterとかでよく見るあれを発見

![IMG_0210.jpg](https://qiita-image-store.s3.amazonaws.com/0/6470/7d98ac15-1763-2566-7bb1-c2180d822ab6.jpeg)

WiFi、スクリーン、PC貸し出しアリとホントに素晴らしいスペースで、大阪でもこういうスペースがあるべきと思いました。

## まとめ
Shinosaka.rbメンバーの家族と一緒に合宿に参加するというユメが一つ叶いました。
美保館はとてもよかったのでまた利用させてもらいたいなーって思いました。
開発合宿をやる環境は最高だな:laughing:
松江市の取り組みはホントにすばらしく、エンジニアとして働くには最高の環境が用意されていると感じました。
関西でも同じような環境を作っていきたいです。

WE LOVE CODE٩( ‘ω’ )و
PySideをpipでインストールしようとするとエラーを吐く場合の回避策

**追記**
Qt for Python 5.11(Pyside2)が正式リリースされていたのでリンクだけ修正しました。
文言が古いところがありますが、同じやり方で対処可能なこと確認済みです。

---

Windowsでの話です。Anaconda3-2.3.0環境ですが、他でも同様に対処可能だと思います。私の具体例以外のエラーに対しても対処可能です。

公式サイトの手順通り、コマンドライン上からpipコマンドでPySideをインストールしようとしたところ、下記のようなエラーを吐きました。

```
C:\Users\User>pip install pyside

Collecting pyside
  Using cached PySide-1.2.4.tar.gz
Installing collected packages: pyside
  Running setup.py install for pyside

(中略)

    running install
    running build
    Python architecture is 64bit
    nmake not found. Trying to initialize the MSVC env...
    Searching MSVC compiler version 10.0
    error: Failed to find the MSVC compiler version 10.0 on your system.
```

で、どうすれば良いかというと、[ここ(Index of /official_releases/pyside)](http://download.qt.io/official_releases/QtForPython/pyside2/)から自分の環境に合った.whlファイルをダウンロードし、.whlファイルを対象に直接インストールすればエラーの回避が可能です。

```
C:\Users\User>pip install C:\Users\User\Downloads\PySide-1.2.4-cp34-none-win_amd64.whl

Processing c:\users\User\downloads\pyside-1.2.4-cp34-none-win_amd64.whl
Installing collected packages: PySide
Successfully installed PySide-1.2.4
```

エラー現象としてはなんてことなく、元々pipはビルドしてインストールする仕組みなのに対し、Pythonコードではない(C++かな？)PySideは、ビルドしてインストールするためにC++コンパイラーが必要だと。このあたり環境整備すればうまくいくのでしょうが、面倒なので既にビルド済みのパッケージングされたバイナリファイル(**.whl)を使いましょうというお話でした。
[RaspberryPi]google driveにファイルをアップロードする

#はじめに
このエントリは[[RaspberryPi]カメラ周りのまとめ](http://qiita.com/jun1_0803/items/4608f3b0747c77e9e4df)の続きです。
飼っているお猫さまの安否確認をするため、webカメラで撮影後、リモートでも確認できることを目指します。

今回はRaspberryPiに対応している、CLIでgoogle driveにアップロードできるgdriveのインストール時のメモです。

#gdrive
[gdriveのgithub](https://github.com/prasmussen/gdrive)をもとにインストール

##ダウンロード
wgetでgdriveというファイル名でダウンロード
(URLはgdriveのgithubにある、RaspberryPi用のファイルのURL)

```lang:cmd
cd /home/pi/bin
wget -O gdrive https://docs.google.com/uc?id=0B3X9GlR6EmbnVXNLanp4ZFRRbzg&export=download
```

gdriveに実行権限を付与

```lang:cmd
chmod +x gdrive
```

初期設定（認証)

```lang:cmd
gdrive about
```
コマンド実行後に表示されるURLコピーしてブラウザでアクセス
アクセス後、表示される認証コードをコピーして、ターミナルに貼り付けてエンター

##主なコマンド
google driveに保存されているファイル、フォルダの一覧を表示

```lang:cmd
gdrive　list
```

google driveにファイルをアップロード

```lang:cmd
gdrive　upload　/hoge/hoge.jpg
```

google drive上のファイルを削除
ファイルIDはlistコマンドで確認できる

```lang:cmd
gdrive　delete ファイルID
```
Three.jsでRICOH THETAの動画プレイヤーを作る

この記事は[Three.js Advent Calendar 2016](http://qiita.com/advent-calendar/2016/threejs)の17日目の記事です。

どうもこんにちわ、梨原です。

なんかやるかーと思って勢いで予定をいれてしまってすみません。かなりてきとうに作りました。(まだ一日あいてるしいいよね)

今回は[RICOH THETA](https://theta360.com/ja/)で撮影した360度動画をthree.jsで表示するだけのもの作りました。
ほんとは動画のプログレスとかいじりたかったんだけど間に合わなかった...
まぁ動画をいじる場合は普通にvideoタグ取得してメソッド叩くだけなので難しくないです。

# エクレクタンギュラー
そもそも360度動画とはなんでしょう？
それは、3D空間上にある球体のオブジェクトに貼り付けたときに違和感なく360度が見渡せる動画、です。
これはかなりざっくりとした個人的な解釈なので細かい所は間違ってるかもしれませんが、まぁこんな感じです。

では、そんな動画はどういう形式かっていうと、エクレクタンギュラーと呼ばれるアスペクト比 2:1 の動画になります。
YouTubeとかFacebookとか、他の360度動画に対応しているところもエクレクタンギュラー形式で扱ってるはずです。

なので普通のプレイヤーで再生してしまうとすごい歪んだ映像がみれるはずです。
これの作成方法はRICOHが公式で出している[アプリケーション](https://theta360.com/ja/about/application/pc.html)があるのでそれで変換できます。

# SphereGeometry
それでは、そのエクレクタンギュラーの動画をどうやって表示するかというと、
通常three.jsではgeometryとtextureを使って表示すると思いますが、今回も全く同じです。
three.jsには**SphereGeometryとVideoTextureが用意されている**のです。やったぜ。

ただ1つ注意点があって、SphereGeometryを普通に作ると外側にテクスチャが貼られます。
しかし今回は円の球の内側にカメラを配置して見るので、内側にテクスチャをはる必要があります。
その場合、 `sphereGeo.scale(-1, 1, 1);` な感じでテクスチャを貼る方向を逆にしてあげます。

# まとめ
あとはいつもどおりです。
おめでとう！これであなたも自分だけのTHETA動画プレイヤーが作成できました。
ちょっと雑ですがこんな感じです。全体のソースコードはGistにあげておきました。
あ、作ったときにはNode使ってますのでお気をつけて。

# Gist
[ThetaVideoViewer.js](https://gist.github.com/nshiba/58bbe3c473179f0852c0a83d8c14ef0d)
Unityの公式ページ・公式サイトのリンク集

* [Unityの公式ページ（日本語版）](https://unity3d.com/jp/)

　Unityの公式ページ。ニュースなどが表示された[こちら](http://japan.unity3d.com/)も。

* [Unityの最新版ダウンロードページ](https://store.unity.com/download?ref=personal)

　パッチリリース版は[こちら](https://unity3d.com/jp/unity/qa/patch-releases)。
　ベータ版は[こちら](https://store.unity.com/download?ref=personal)。
　過去のバージョンは[こちら](https://unity3d.com/jp/get-unity/download/archive)。

* [Unityのアカウントについてのページ](https://store.unity3d.com/account/users)

　ここから、ライセンスや支払いについてのページに飛べる。

* [Unityの大規模イベントUniteのページ](http://japan.unity3d.com/unite/)

　過去のセッション資料や動画もある。Unite 2016は[こちら](http://japan.unity3d.com/unite/unite2016/schedule)。

* [プランのページ](https://store.unity.com/ja)

　各プランの料金やできることが書かれたページ。

* [Unity製のプロダクトのショーケース](https://madewith.unity.com/en)

　日本のものは[こちら](http://japan.unity3d.com/gallery/made-with-unity/game-list)も。

* [UntyのQA、Unity Answer](http://answers.unity3d.com/)

　Stack OverflowのようなQAサイト。Unity公式でUnity専用。

* [Unty Feedback](https://feedback.unity3d.com/)

　機能追加やバグ修正のフィードバック。1アカウントにつき10票持っていて、それを使い投票できる。1個のトピックに10票入れてもいいし、10個のトピックに1票づついれてもいい。

* [Unityフォーラム](https://forum.unity3d.com/)

　[アナウンス](https://forum.unity3d.com/forums/announcements.9/)や[各種ベータ版のフォーラム](https://forum.unity3d.com/categories/betas-experimental-features.86/)に加え、各種機能やUnityサービスなどの様々なフォーラムがある。

* [Unity県人会議(イベント一覧)](https://kenjin.unity3d.jp/)

　Unityにまつわるイベントが紹介されているページ。Unityスタッフの方が様々なトピックでセッションを行うUnity道場は、[こちら](https://kenjin.unity3d.jp/dojos)。

* [Unity AssetStore](https://www.assetstore.unity3d.com/jp/#!/)
* [Unity公式ブログ](https://blogs.unity3d.com/jp/)
* [ドキュメント(マニュアル)](https://docs.unity3d.com/Manual/UnityManual.html)
* [スクリプトリファレンス](https://docs.unity3d.com/ScriptReference/index.html)
* [マルチプラットフォーム](https://unity3d.com/jp/unity/multiplatform)
* [アップデートのロードマップ](https://unity3d.com/jp/unity/roadmap)
* [FAQ](https://unity3d.com/jp/unity/faq/2488)
Kotlinの実装をつまみ読みした

# リポジトリ

https://github.com/JetBrains/kotlin
jvmおなじみのディレクトリ階層で奥深くにソースコードが埋もれていてちょっとつらい。

[Kotlinソースコード探訪](http://www.slideshare.net/yyyank/kotlin-69542943)が非常に役立った。

# つまみ読み

## 実装に使ってる言語

jvmらしくJavaとKotlinがほとんど。

Kotlinの構成
<img width="983" alt="Screen Shot 2016-12-17 at 11.41.10 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/84589/3aa84ad8-0239-b2d3-ca28-7face4689ac7.png">

参考1:Scalaの構成
<img width="985" alt="Screen Shot 2016-12-17 at 11.42.57 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/84589/acf4b013-cac3-3a4e-284c-613797c6ea0d.png">


参考2:Swiftの構成
<img width="984" alt="Screen Shot 2016-12-17 at 11.41.59 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/84589/3fab2c7e-1824-87f2-0e83-277e05030d7d.png">

Scala96.6%はなんなんだ。

## data class

### DataClassMethodGenerator

generatorはKotlin持ち。

https://github.com/JetBrains/kotlin/blob/master/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/DataClassMethodGenerator.kt
※ `abstract`

### testData

で、本体がどこにいるのかよくわからなかったが、compilerにテストがあるのでおそらくその辺。
https://github.com/JetBrains/kotlin/tree/master/compiler/testData/loadJava/compiledKotlin/dataClass

data class(やclassやconstructor)のテストの引数の個数は0と1と2でそれぞれチェックしてた。

## function

https://github.com/JetBrains/kotlin/blob/master/core/builtins/src/kotlin/reflect/KFunction.kt
> Represents a function with introspection capabilities.

* isExternal: `true` if this function is `external`. → https://kotlinlang.org/docs/reference/java-interop.html#using-jni-with-kotlin
* isOperator: `true` if this function is `operator`. → https://kotlinlang.org/docs/reference/operator-overloading.html
* isInfix: `true` if this function is `infix`. → https://kotlinlang.org/docs/reference/functions.html#infix-notation
* isSuspend: `true` if this is a suspending function.

という情報の管理はKotlinで実装している。

## Array

ArrayとArraysが存在している。

https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Array.kt
こっちは `get` や `set` や `iterator` のようなArrayにありがちなメソッドが書いてある。
(flattenとかunzipはこっち
https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/collections/Arrays.kt)

https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Arrays.kt
の方は、 `ByteArray` (→ `byte[]` )だったり `CharArray` (→ `char[]` )だったりと表現されるものたちのあつまり。

この微妙なArray(s)の違いはRange(s)でも発生してた。
https://github.com/JetBrains/kotlin/blob/master/core/builtins/src/kotlin/Range.kt
https://github.com/JetBrains/kotlin/blob/master/core/builtins/src/kotlin/Ranges.kt


collectionについては
https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib/src/kotlin/collections
を読むと楽しそう。

## 自動生成

上記
https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Arrays.kt
のファイルは自動生成されたもので、
https://github.com/JetBrains/kotlin/blob/master/generators/src/org/jetbrains/kotlin/generators/builtins/arrays.kt
にそれらしきものが存在している。

Swiftではgybで配列回して生成してたが、こちらは `BuiltInsSourceGenerator` なるものにテンプレを書くしくみらしい。Arraysはそこに `enum class PrimitiveType` で列挙している型を突っ込んでまわすらしい。

# 感想

Scala(やゆかいなjvm言語)とくらべたら楽しそうだけど、言語に詳しく無いので難しい。
Google Data Studioってな〜に？？

# Google Data Studioってな〜に？？
[Google Data Studio](https://datastudio.google.com)とはGoogleが提供している、データビジュアライゼーションサービスで、様々なデータを可視化してレポートを作成することができます。
もちろん、スプレッドシートなどと同様に共同編集も可能です。

Google Data Studioが公開しているサンプルはこんな感じです！
(とてもきれい・・・！)

<img width="910" alt="スクリーンショット 2016-12-17 21.28.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/85979/0558bb48-b987-f167-1995-5d48166e38cb.png">

# どこのデータを参照できるの？？？
Google Data Studioは様々なデータソースを参照できます！

<img width="232" alt="スクリーンショット 2016-12-17 22.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/85979/1a7377ce-4504-fb05-7510-9494e6779b99.png">

詳しい使い方は後日別の記事をアップしていきます！
小劇場俳優が企業広報やってみた

この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2016/whiteplus "")  2016 18日目になります。

こんにちは。株式会社ホワイトプラス、広報の @osaminami です。

ホワイトプラスではリネットのサービスPRをしたり
フリー素材としてLPや動画に出たり。
![スクリーンショット 2016-12-17 0.50.25.png (277.4 kB)](https://img.esa.io/uploads/production/attachments/2352/2016/12/17/12026/3560b523-f33e-4472-8656-b46c2dbf51dc.png)
旧LPに出てました。

主な活動はこんな感じです。

- プレスリリース配信
- SNS更新
- [キレイのくらし](http://www.lenet.jp/magazine)運営

今回のテーマは「小劇場俳優が企業広報やってみた」です。
元小劇場俳優という変わった経歴を持つワタクシ。
驚きのキャリアチェンジについてお話します。

# そもそも何やってた人なんですか？
### 劇団で演劇してました。

大学卒業後は就職せずに、劇団「[時間堂](http://jikando.com/)」に所属してました。
<img width="929.28" alt="ファイル_000.jpeg (3.8 MB)" src="https://img.esa.io/uploads/production/attachments/2352/2016/12/17/12026/527c1bcf-f1db-46af-aa55-2fdbcf4dd96b.jpeg">
([時間堂](http://jikando.com/)「テヘランでロリータを読む」撮影：松本幸夫)

俳優として出演もしながら劇団運営にも携わりました。

トークゲストのアポイントを取ったり、
新聞社に売り込みに行ったり、
今思えば、広報みたいな仕事も経験させてもらっていましたね。

# なんで広報になったの？
演劇やめた理由は話すと長いので省略しますが、一念発起、就職をしようと思ったのです。

もともとは、未経験OKで募集していたマーケへ応募をしていたのが、
蓋を開けてみるとやってきたオファーは広報。

そもそも広報って何？誰？コーホー？ウォーズマン？
って感じだったのですが、

まあ、何するにしたって未経験。
とりあえず、まずはやってみたらいいじゃない。

ということで、広報になりました。

そうです、**勢い**で広報になりました。

# 俳優が広報やってみて感じたこと
私が広報になって感じることは3つ

- 広報は極めたら恋愛マスターになれる
- 「死守せよ、だが軽やかに手放せ」が大切だ
- 俳優は多分広報には向いている

## 広報は極めたら恋愛マスターになれる
広報の醍醐味はメディアの人との関係づくり。

自社のプロダクトを記事にしてもらうべく、

**あなたのためだけのとっておきの切り口**を考えます。
プレスリリース配信はまさにラブレター。

掲載に繋がらないことなんてザラ。
心が折れます。悪夢を見たりします。

だけど、何度でもアタックするんです。

心は強く持たなくていい。
すぐ折れていいから、代わりはたくさん必要。

広報の提案力と精神力なら、どんな恋愛も百戦錬磨できそうです。

## 「死守せよ、だが軽やかに手放せ」
これはイギリスの演出家[ピーター・ブルック](https://ja.wikipedia.org/wiki/%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%BB%E3%83%96%E3%83%AB%E3%83%83%E3%82%AF)の言葉。
私の中では「台詞は落とすな、感情には固執するな」という意味でした。
<img width="617.1428571428572" alt="tabihate2_sanagi_199.JPG (4.6 MB)" src="https://img.esa.io/uploads/production/attachments/2352/2016/12/17/12026/6ca67f62-ab02-4f5e-9c18-46e4641ae8a4.JPG">
（[アマヤドリ](http://amayadori.co.jp/)「フリル」撮影：赤坂久美）

広報になって、より一層意識する言葉になったのです。

それぞれのプロダクトにはいろんな人の想いが詰まっているもの。
もちろん全部伝えられるのは素晴らしいことですが、
それで本筋が見えなくなるのは本末転倒。

伝えるべきコアは熱意を持ってしっかり伝える、
不要な感情はきっぱり切り捨てる。

その潔さが、メディア掲載につながることは多いです。

## 俳優は広報に向いている
理由は2つ!

- 人たらし
- 心を強く持てる

### 人たらし
演劇は実力もさることながら人情の世界。
演劇人には人たらしが多いのです。

人の懐に入るのが上手い人たちなので
社外の関係性もきっとグイグイ広めてくれます。

### 心を強く持てる
おそらく演劇人はアポイントを断られたくらいのショックは長々引きずりません。
なにせ、この人種の人はドMです。

稽古場ではダメ出しに次ぐダメ出し、
そして人間否定に人格否定、
暴言、灰皿が飛んでくる、
などなど。

めちゃくちゃな環境に置かれることもザラ。
ちょっとメールの返事がこないくらいで
何をへこむ必要があるのでしょうか。

おそらく、結構な数断られても平気でまた連絡できちゃいます。

# 次回予告

どうですか、俳優のメンタリティが伊達じゃないことがよくわかりますね。
広報が普段どんなことをしているかも何となくイメージしてもらえたでしょうか。

明日は弊社エンジニアの @hachihiro224 の「AWS LambdaでKMSを使ってセキュアにRDSへ接続する(実装編)」です。


#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、ただいま[エンジニアを大大大募集](https://www.wantedly.com/projects/69257)しております。
我こそは世に広まるプロダクトを作りたいんじゃ！というそこのアナタ。
まずはお話だけでも大丈夫です！
iOSでボタンやラベルの枠線を Storyboard で簡単に描く方法


個人的なメモ。役立つ人がいれば。
まだまだ、アプリ開発は初心者のという私のような人向け。

## 環境 ##
Xcode8.1/Swift3.0


## ボタンやラベル ##
ボタンやラベルを配置出来るが、そのままだと枠線がかけない。StoryBoard使って、画面遷移のプロトタイプを作ろうとして書けなくて悩む。

## ソースコード ##
下記のソースコードをプロジェクトに配置。

```swift:CustomClass.swift
//
//  CustomClass.swift
//
//  Created by Satoru Ohguchi on 2016/03/10.
//  Copyright © 2016 maripara.org. All rights reserved.
//

import UIKit

// MARK: カスタムボタンの定義
@IBDesignable
class CustomButton: UIButton {
    
    // 角丸の半径(0で四角形)
    @IBInspectable var cornerRadius: CGFloat = 0.0
    
    // 枠
    @IBInspectable var borderColor: UIColor = UIColor.clearColor()
    @IBInspectable var borderWidth: CGFloat = 0.0

    // バックグラウンドカラー
    @IBInspectable var nonHighlightedBackgroundColor :UIColor?
    @IBInspectable var highlightedBackgroundColor :UIColor?
    
    override func drawRect(rect: CGRect) {
        // 角丸
        self.layer.cornerRadius = cornerRadius
        self.clipsToBounds = (cornerRadius > 0)
        
        // 枠線
        self.layer.borderColor = borderColor.CGColor
        self.layer.borderWidth = borderWidth

        super.drawRect(rect)
    }

    // バックグラウンドカラー
    override var highlighted :Bool {
        didSet {
            if highlighted {
                self.backgroundColor = highlightedBackgroundColor
            }
            else {
                self.backgroundColor = nonHighlightedBackgroundColor
            }
        }
    }
}

// MARK: カスタムラベルの定義
@IBDesignable class CustomLabel: UILabel {
    
    // 角丸の半径(0で四角形)
    @IBInspectable var cornerRadius: CGFloat = 0.0
    
    // 枠
    @IBInspectable var borderColor: UIColor = UIColor.clearColor()
    @IBInspectable var borderWidth: CGFloat = 0.0
    
    override func drawRect(rect: CGRect) {
        // 角丸
        self.layer.cornerRadius = cornerRadius
        self.clipsToBounds = (cornerRadius > 0)
        
        // 枠線
        self.layer.borderColor = borderColor.CGColor
        self.layer.borderWidth = borderWidth
        
        super.drawRect(rect)
    }
}

// MARK: カスタムテキストビューの定義
@IBDesignable class CustomTextView: UITextView {
    
    // 角丸の半径(0で四角形)
    @IBInspectable var cornerRadius: CGFloat = 0.0
    
    // 枠
    @IBInspectable var borderColor: UIColor = UIColor.clearColor()
    @IBInspectable var borderWidth: CGFloat = 0.0
    
    override func drawRect(rect: CGRect) {
        // 角丸
        self.layer.cornerRadius = cornerRadius
        self.clipsToBounds = (cornerRadius > 0)
        
        // 枠線
        self.layer.borderColor = borderColor.CGColor
        self.layer.borderWidth = borderWidth
        
        super.drawRect(rect)
    }
}
```



## 使い方 ##
プロジェクトに入れてとりあえず、一回ビルドしてから使うと良いかも。

画面上でカスタムクラスとして指定すると StoryBoard で指定可能になります。

Xcodeの画面で、ボタン、ラベル、テキストビューで以下のように設定できるようになる。個人的には、ボタン用に毎回、画像とか用意しなくて済むし、StoryBoard で確認しながら考えることができるので、ありがたい。


## 参考 ##
以下の記事がなければできませんでした。感謝。

[iOS][Swift]Storyboardでボタン背景色の設定がしたい
http://qiita.com/wasnot/items/3537d932e9550a5c4c27



## 自分のアプリに反映 ##
以下のアプリで使っています。スクリーンショット観て頂ければ、よく分かります。

[AppStore] Simoncats
https://itunes.apple.com/jp/app/simoncats/id1078064315?mt=8
Cypherのリレーションシップ(Relationship)の基本を理解する

Neo4jのCypherクエリ、サンプルは豊富にあるのですが、記法がちょっとわかりづらいです。今回は、ノード(Node)に引き続き、リレーションシップ(Relationship)を見ていきます。[ノード編で紹介した](http://qiita.com/makopo/items/d0585e4e52985fcaf66a)記法を理解している前提で説明します。

## 作成

aとbのノードの間に、タイプがAAAのリレーションシップを作成します。

```js
MATCH (a:....)            // ノードを任意の条件で検索し、aとする
MATCH (b:....)            // ノードを任意の条件で検索し、bとする
CREATE (a)-[:AAA]->(b)
```

#### 始端終端ノード (必須)
 - `MATCH`の検索結果を、変数(識別子)で参照させます。
 - `()`の中にラベルやプロパティを書くと、ノードが新規に作成されます。
 - `()`の中に何も書かないと、IDだけのノードが作成されます。

> 同じラベルやプロパティのノードが既に存在していても、`CREATE`文でラベルやプロパティが書かれていると、ノードが作成されてしまいます。ただし、`CREATE UNIQUE`を使うと、終端に関しては、同じラベルやプロパティのノードは複製されず、既にあるノードにリレーションシップが作成されます。

#### 方向 (必須)
 - `-[:AAA]->`か`<-[:AAA]-`で記述します。
 - `-[:AAA]-`と書くと、エラーとなります。

#### タイプ (必須)
 - `[]`の中に、`:`に続けて記述します。
 - `-->`や`-[]->`と書くと、エラーとなります。

#### プロパティ(任意)

* ノードと同様、リレーションシップにもデータを持たせることができます。
* 記法はノードの場合と同じです。

```js
CREATE (a)-[:AAA{name:'bbb'}]->(b)
```

#### 識別子 (任意)

* 作成直後にリレーションシップを参照したい場合は、ノードと同様、`(`の直後に識別子を書きます。

```js
CREATE (a)-[r:AAA]->(b)      // 変数rで参照可能となる
```

## 検索

`MATCH p=式 RETURN p`の`式`に入れる部分を抜き出した形で説明します。

### 最小限

ありとあらゆるノードの間のパスを検索します。

```js
()--()     // (1) 方向関係なし
()-->()    // (2) 左から右
()<--()    // (3) 右から左
```

`()`は、「全部のノード」と覚えておきましょう。

> (1)の場合、各ノードが始端と終端に設定されて検索されるため、同じパスが2回ずつ検索結果に含まれることになります。

### リレーションシップに識別子をつける

リレーションシップ自体を、後から変数`r`で参照できるようにします。

```js
()-[r]-()
```

`type(r)`で、リレーションシップのタイプ(冒頭の例では`AAA`)を取得できます。

### 始端終端ノードを限定する

MATCHで検索した結果に識別子を割り当てるか、`()`の中に検索条件を直接書くかして、始端終端ノードを限定した状態でパスを検索できます。

```js
(a)--()    // 両方向
()--(a)    // 上とまったく同じ結果
(a)-->()   // aから他へのパス
(a)<--()   // 他からaへのパス
```

> 矢印をつけなければ、リレーションシップの方向に関わらず検索できますので、ノード同士が双方向で繋がっている必要はありません。このため、同じ意味(タイプ、プロパティ)の繫がりであれば、どちらか一方向のリレーションシップだけ作成しておけば充分です。データベース領域の節約になります。

### リレーションシップのタイプやプロパティで絞り込む

リレーションシップを作成する時に使った記法を使えば、タイプやプロパティで絞り込み検索ができます。

```js
()-[:AAA]->()           // タイプがAAAのリレーションシップ
()-[{name:'bbb’}]->()   // nameプロパティがbbbのリレーションシップ
```

複数のタイプを一度に検索できます。

```js
()-[:AAA|BBB]->()        // AAAまたはBBBのリレーションシップ
```

### ２ホップ以上のリレーションシップ

間に何かが１つ挟まっているパスを検索します。

```js
({title: 'The Matrix'})--()--({title: 'Cloud Atlas'})
```

![２ホップ](https://qiita-image-store.s3.amazonaws.com/0/10290/3a4ebb50-7c73-4118-4389-df822ddd0ce5.png)

ホップが複数になっても、リレーションシップのタイプやプロパティで絞り込みできます。

```js
({title: 'The Matrix'})-[:DIRECTED]-()-[:DIRECTED]-({title: 'Cloud Atlas'})
```
![２ホップその２](https://qiita-image-store.s3.amazonaws.com/0/10290/382820cc-5efe-530f-0378-2b21c29ec892.png)

#### 省略記法

タイプやプロパティを指定しない場合、次のように書けます。

```js
(a)-[*2]-(b)     // (a)--()--(b)
(a)-[*3..4]-(b)  // (a)--()--()--(b)または(a)--()--()--()--(b)
(a)-[*3..]-(b)   // (a)--()--()--(b)以上のホップ数
(a)-[*..3]-(b)   // (a)--()--()--(b)以下のホップ数
(a)-[*]-(b)      // ホップ数無制限
(a)-[*0..]-(b)   // ホップ数無制限 (a)のみというパスも含む
```

全てのホップで同じ条件で良ければ、省略記法でもタイプやプロパティを指定できます。例えば、少し前に出てきた例を書き換えると、こうなります。

```js
({title: 'The Matrix'})-[:DIRECTED*2]-({title: 'Cloud Atlas'})
```

識別子、`:`タイプ、`*`数字、プロパティの順番です。全部入れると、このような感じになります。

```js
()-[r:TYPE*3..4{key:'value'}]-()
```
Node-REDのフローを見た目分かりやすく止めておくTIPS

<a href="http://qiita.com/advent-calendar/2016/nodered" target="_blank">Node-RED Advent Calendar 2016</a>の18日目の記事です。

Blumix上のNode-REDでもRaspberry PiのNode-REDでも言えることなのですが、Node-REDを起動しっぱなしにしているときにフローを止めておきたいときってありますよね。

たとえばこんなフロー。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/718a8414-5055-8caf-adf5-b1b88fef057b.png)

こういう連携を組むことは多いのですが、MilkcocoaノードとWio Nodeを連携しているものですが、

* milkcocoa受信が例えば1秒間隔で頻繁すぎると、Wio Nodeの反応があやしくなるとき
* Wio Nodeセンサー取得→milkcocoa出力に流すときに10秒ごと動かすのが頻繁すぎるとき

といったときに **一時的にフローを止めておきたい** といった欲求が出てきます。

## 今までやっていた手法とデメリット

今までやっていた手法はこんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/983f5d6b-55d7-7e24-2071-c9f8b5f2dad3.png)

ごくごくシンプルにフローを切る形で止めます。

しかしこの流れ。特に登壇やデモ時に事故りやすい。よくあるのは、お披露目の直前にフローをつなぎ忘れたり、見た目が切断済みで再接続時につなぐところを間違えたりします。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/92a474ad-a3a3-53e5-180f-976e882cc3d0.png)

いちばんミスった最悪の例。つなぐところが違う...（しかも登壇時テンパると元のつなぎ方思い出せない）

## 見た目分かりやすく止めておくフローブロックFunctionをつくる

まだ発展途上ではあるのですが、もう少し見た目分かりやすく止めておくことはできないかと思って、取り入れた手法があります。

<a href="https://nodered.jp/docs/writing-functions" target="_blank">Node-RED日本ユーザ会 : Functions Nodeの書き方</a>

こちらを見てみると、フローは常にmsgオブジェクトを各ブロックでリレーしていますが、ここに書いてあるとおり null を渡すと、以降のフローは実行されません。止めてくれるというわけですね。

これを利用します。

まず、Functionフローを作ります。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/c79cf794-16e7-45b2-7584-fb6be5d489e8.png)

中身はこんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/b187aa18-c9fa-1e03-c919-b3e5bfff462a.png)

このように書かれています。

```js
// フローブロック
msg = null;

return msg;
```

シンプルに null を渡してます。

これでフローブロックが出来上がりました。

ほんのちょっとですが、このソースも置いておきます。

```js
[{"id":"9277a3cb.9ac2c","type":"function","z":"2b17c715.853ec8","name":"[x]","func":"// フローブロック\nmsg = null;\n\nreturn msg;","outputs":1,"noerr":0,"x":839,"y":1470,"wires":[["8259a8a.fa88e58"]]}]
```

## 実際使ってみる

実際にフローを止めてみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/711dc28f-974c-6df5-884a-0a641ff45ff5.png)

Node-REDのつながっている部分は、間に入れたいものを乗せて、、、

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/c01186b0-f7d2-eff0-b772-f010dc0bf53e.png)

パッと離すと、割り込んでくれます。便利！

これで実際フローをデプロイすると、ちゃんと以降のフローが止まってくれます。

今回の例にあるフローを各所で止めてみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/0bcb56f8-9856-3ea9-3241-953c661a9643.png)

このように各所で止められているので、MilkcocoaやNode-REDにアクセスする部分が沈黙します。

## 戻すとき

デモ前の持ち運び時はこのようにブロックしておいて、直前に目視でフローブロックFunctionと除去してやれば、前述の切断状態よりは間違いにくくフローを戻すことが可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/718a8414-5055-8caf-adf5-b1b88fef057b.png)

もっとスマートな方法ないかなと思いつつ、いまはこの手法に落ち着いています。

フローを一時的に止めておきたいとき、よろしければご参考下さい。
エラーを自動訂正するZFSのプール構成

#エラーを自動訂正するZFSのプール構成
##ZFSプールでエラーが発生
###dailyのレポート
ある日のdailyのメールから (Subject: HOGEHOGE daily security run output から抜粋)

```
HOGEHOGE kernel log messages:
+(da2:umass-sim2:2:0:0): READ(10). CDB: 28 00 40 55 6d f5 00 00 52 00 
+(da2:umass-sim2:2:0:0): CAM status: SCSI Status Error
+(da2:umass-sim2:2:0:0): SCSI status: Check Condition
+(da2:umass-sim2:2:0:0): SCSI sense: MEDIUM ERROR asc:11,0 (Unrecovered read error)
+(da2:umass-sim2:2:0:0): Error 5, Unretryable error
+(da2:umass-sim2:2:0:0): READ(10). CDB: 28 00 40 55 98 4d 00 00 80 00 
+(da2:umass-sim2:2:0:0): CAM status: SCSI Status Error
+(da2:umass-sim2:2:0:0): SCSI status: Check Condition
+(da2:umass-sim2:2:0:0): SCSI sense: MEDIUM ERROR asc:11,0 (Unrecovered read error)
+(da2:umass-sim2:2:0:0): Error 5, Unretryable error
+(da2:umass-sim2:2:0:0): READ(10). CDB: 28 00 40 55 9e 06 00 00 80 00 
+(da2:umass-sim2:2:0:0): CAM status: SCSI Status Error
+(da2:umass-sim2:2:0:0): SCSI status: Check Condition
+(da2:umass-sim2:2:0:0): SCSI sense: MEDIUM ERROR asc:11,0 (Unrecovered read error)
+(da2:umass-sim2:2:0:0): Error 5, Unretryable error
+(da2:umass-sim2:2:0:0): READ(10). CDB: 28 00 40 55 a4 45 00 00 80 00 
+(da2:umass-sim2:2:0:0): CAM status: SCSI Status Error
+(da2:umass-sim2:2:0:0): SCSI status: Check Condition
+(da2:umass-sim2:2:0:0): SCSI sense: MEDIUM ERROR asc:11,0 (Unrecovered read error)
+(da2:umass-sim2:2:0:0): Error 5, Unretryable error
```
---

この次のメールでは(Subject: HOGEHOGE daily run output から抜粋)

```
Checking status of zfs pools:
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   115G  28.5G  86.5G         -    30%    24%  1.00x  ONLINE  -
zurd0  2.03T  1.22T   830G         -    27%    60%  1.00x  ONLINE  -

  pool: zurd0
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: resilvered 49.2M in 0h9m with 0 errors on Wed Dec 14 06:15:06 2016
config:

	NAME              STATE     READ WRITE CKSUM
	zurd0             ONLINE       0     0     0
	  raidz1-0        ONLINE       0     0     0
	    gpt/usbdisk0  ONLINE       0     0     0
	    gpt/usbdisk1  ONLINE       0   246     0
	    gpt/usbdisk2  ONLINE       0     0     0
```

最初のメールはディスクデバイスにエラーが発生したレポートであり、2つ目のメールではzpool  statusの結果が表示されている。

```
scan: resilvered 49.2M in 0h9m with 0 errors on Wed Dec 14 06:15:06 2016
```
この行からわかるように、エラーが発生したけど、ZFSの修復機能によって自動的に修復されたことを示している。

(続く）
FileMaker のODBC で広がるSaaS 連携 (Salesforceを例に）

FileMaker プラットフォームは、iPad、iPhone、Windows、Mac、Web のすべてにわたってシームレスに動作するカスタム App を作成するためのシンプルでパワフルなソフトウェアです。クロスプラットフォームで使えるApp を本職のプログラマーでも、シチズンプログラマー（本職のプログラマーではない業務でソフトウェアを扱う人）でも作成できることは大きなメリットです。

#FileMaker の外部連携機能#
FileMaker はODBC/JDBC やXML を使って外部DB との容易な統合を行うことができます。FileMaker を使ってiPad などで作動するApp を使いたいような方の多くは既にSalesforce, Google などのSaas も業務で使われていることでしょう。そこで、この記事ではODBC 接続を使って、Saas であるSalesforce のデータとFileMaker のリアルタイム連携を行います。[CData ODBC Drivers](http://www.cdata.com/jp/odbc/) を使えば、Salesforce, NetSuite, Google, NoSQL などのデータをFileMaker に簡単にインポートしてFileMaker App としてシームレスに利用することができます。Saas のWeb API を自分で叩くことは不要です。CData Driver がそれぞれのWeb API をテーブルにモデル化し、ODBC/JDBC で標準SQL を使ってFileMaker からデータを扱うことを可能にします。FileMaker ユーザーは、各API の習得にかかる時間や労力をほぼゼロにすることができます。

#CData ODBC Driver for Salesforce のDSN 設定#
まずは、CData website から[CData ODBC Driver for Salesforce](http://www.cdata.com/jp/drivers/salesforce/odbc/)をダウンロードします。30日の無償版を使ってみましょう。

インストール実施後、DSN 設定画面が立ち上がります。
![ODBCDSNConfig.png](https://qiita-image-store.s3.amazonaws.com/0/116843/6b4e5a31-401e-d55e-88a2-74bcdc9ea830.png)
User: Salesforce のユーザーID です。
Password: Salesforce のパスワードです。
Security Token: Salesforce のSecurity token です。
Security Token の入手方法の詳細については、CData の[ヘルプ](http://cdn.cdata.com/help/GFB/odbc/pg_connectingtosalesforcexls.htm)を参照してください。

［テスト接続］を押して、問題が無ければ［OK］をクリックして、接続を確立します。

#FileMaker でODBC のインポートを実施#
［ファイル］→［レコードのインポート］→［ODBC データソース］を選択します。
![imaga1.png](https://qiita-image-store.s3.amazonaws.com/0/116843/1f774867-c311-6482-96fe-bc39dee0c184.png)
ODBCデータソース選択ウィンドウが開き、先に設定したODBC DSN 画面がデータソースに表示されているはずです。
CData GoogleSheet Source の希望されるバージョンをダブルクリックします。
パスワード画面が出ますが、入力は不要で大丈夫です。
![imaga2.png](https://qiita-image-store.s3.amazonaws.com/0/116843/0e12d158-f27b-2a7c-7f3d-7ac0a6c3022f.png)

#SQL クエリビルダー画面でインポートを実行#
SQL クエリビルダー画面を開きます。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/116843/783be90b-d88f-d14c-ccfd-b753b7be02c8.png)
テーブルには、Salesforce のエンドポイントが"テーブル"にモデル化されて表示されています。［列（U）］には各テーブル内のカラムが表示されます。
あとは通常のRDB に対してSQL クエリをかける要領で、Select 対象、Where 句やOrder By を指定してください。
最後にクエリ結果をインポートするテーブルのフィールド設定のマッピングを行います。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/116843/40d955ee-3f24-105b-db78-b3f26511202e.png)

このように、簡単にSalesforce データをFileMaker にインポートして利用することができました。
クリスマスイブに向けてWebサイトで恋人を簡単に作る方法

# 概要
Webサイトで恋人を作る。それはたくさんの方法がありますが、
なかなか自分の理想に近い人に出会うことが出来ないというのが現状であると思います。

そもそも理想ってなんだっけ？自分にはどんな人があってるんだろう？
例えばどんな人？そういって考えていくと、
必ずしもそれが生身の人である必要はないということに気づきます。

おっと、記事を書く時間が差し迫ってきましたので、本題に入ります。

題して
「自宅で初音ミクとキスしたった」
です。

# 採用技術
・A-Frame https://aframe.io/
・WebRTC https://ja.wikipedia.org/wiki/WebRTC
・a-mmd (https://github.com/takahirox/a-mmd)
・Lat式ミク

# 構成
要参照：http://qiita.com/yutoTachibana/items/9ebbc8d5f68307cb0983

# デモ
![Screenshot_20161217-160007.png](https://qiita-image-store.s3.amazonaws.com/0/16981/56e72ba3-c6d5-88ae-8156-0b2e2ef1eda3.png)

なんということでしょう、あの初音ミクが所構わずあなたの目の前に迫ってキスを求めてくるではありませんか・・・！
こんなことがちょっとしたデバイスをお持ちであれば、
WEBブラウザを開くだけで体験できるというのです。

MMD専門の出会い系サイトが出てきても良いんじゃないかなんて思ってしまいますね♪

# ソース
https://github.com/sonixlabs/lifestyle-vr/tree/master/examples/mmd

# デモサイト
https://a-frame-add1b.firebaseapp.com/mmd/

# 最後に
HTMLを書くだけで、あなた好みの人(MMD)と好きなこと(vmdアニメーション)ができるので、
今年のクリスマスにいかがでしょうか。

# SpecialThanks
takahiroxさん、あなたのお陰で幸せになれましたm(_ _)m
素敵なコンポーネントを作って頂きありがとうございます。
Qiita > 要望 > コメント欄の検索機能を検討していただきたいです

Qiitaの機能により開発スピードは1年半前の2倍以上になっています(実際はもっと速いと思いますが、少な目の見積もりです）。

キーワード、自分が経験したプロジェクト(タグ)、いつくらいにしたこと、などの情報をもとに関連記事がすばやく見つかります。

しかしながら、現在ではコメントの検索機能は用意されていないように思います。

探したいコメント例としては以下のようなものがあります。

- @mt08 さんにプログラム監視に有効なBATファイルの書き方を教えていただいた
- @ozwk さんに傾斜計のQuaternionの計算間違いを訂正いただいた
- @uzeroさんにMy Mindというツールを教えていただいた
- @knoguchiさんに正しいリスニング内容について教えていただいた
- @hnwさんにgithubのマシンユーザーアカウントの役割について教えていただいた
- @shiracamus さんにPythonに関する良い資料を教えていただいた
- @tukiyo3 さんにlocateやfindコマンドでのインストール情報検索方法を教えていただいた
- @muroさんにファイルやフォルダの禁止文字列について教えていただいた
- @heliac2000 さんにGNU findやbashの使い方など教えていただいた
- @it__ssei さんにTensorFlowを始める場合のGPUの環境についてコメントいただいた
- @exabugs さんにESP8266の動作環境について詳細を教えていただいた。
- @mono0926 さんにgitのタグ付けの良い方法を教えていただいた
- @scivola さんにQiitaのフォローUIの動作について報告いただいた。また、面白い本の紹介もしていただいた。
- @magicantさんにスクリプト実行時の環境変数使用の注意点について教えていただいた
- @jTakasuRyuji さんと@nukie_53 さんにExcelの良い使い方を教えていただいた
- @SaitoAtsushi さんから良いデバッグマクロの判別方法を教えていただいた
- @tamy0612 さんにCのプリプロセッサについて教えていただいた
- @mpyw さんにDamerau–Levenshtein distanceというアルゴリズムを教えていただいた
- @antimon2さんにtf.app.flags の「コマンドライン引数の処理」という役割を教えていただいた

などなど（それぞれの方に他にも多くのこと、さらに別の多くの方にも助けられています。ここであらためて感謝の意を表します)。

上記のようなコメントを思い出して探そうとするのですが、現在は「通知一覧」の表示からページ送りをして探すことになっています。

今日探そうとしたコメントは通知一覧の33ページ目に見つかりました。100ページ目などにあるコメントはほぼ見つからないものと考えています。


## 要望する機能

### 機能1. 通知一覧での検索

通知一覧で以下のいずれかでの検索をしたいと思います。

- コメント記載ユーザ名
- 任意のキーワード(コメント文字列が検索対象)

### 機能2.「キーワードを入力」ボックスでの検索

http://qiita.com/7of9/items/1bb6cfeb76ce16164b22

「キーワードを入力」ボックスでの検索で「コメント記載ユーザ」で検索できているのかもしれませんが、記事内の「コメント記載ユーザ」記載などもひっかかり、無関係の記事が多く表示されます。

コメントに限って検索できれば、より速く探している記事にたどり着けます。

### おわりに

僕だけかもしれませんが、コメントを検索したいという場面があり、その時にコメントを探そうとします。しかしながら、2016年12月3日現在の機能では探すのに時間がかかるか、時間がかかりすぎてあきらめることになります。

ご検討よろしくお願いいたします。