OmniAICreator/Qiita-1.07M huggingface dataset:
null だけの JSON は合法か？

# TL;DR
- JSON の規格は [RFC 4627](https://tools.ietf.org/html/rfc4627) と [RFC 7159](https://tools.ietf.org/html/rfc7159) があって、 7159 によって 4627 は Obsolete とされている
- 4627 はトップレベルには `object` もしくは `array` のみ置けるとしているので `null` だけの JSON は**非合法**
- 7159 ではトップレベルには `value` があれば良いことになったので**合法**
- Ruby の `JSON` モジュールは前者準拠(?) のようで `JSON.parse('null')` は例外を発生させる (**追記あり**)

# 発端
Ruby の `JSON` モジュールにこういう JSON を食わせると、コケて例外が上がってきてしまう。

```rb
JSON.parse("null") #=> JSON::ParserError
```

一方、他の JSON 実装である [Oj](https://github.com/ohler55/oj) や、 Node.js, Chrome では問題なく `nil`/`null` にパースされる。

```js
> JSON.parse("null")
null
```

これは困った。


# JSON の規格
JSON の規格は ECMA と RFC で定義されている。 RFC には 4627 と 7159 があり、前者は後者によって deprecated とされているので、現在の標準は RFC 7159 ということになる。それぞれ、トップレベルにおいて許される表現をこう定義している:

## ECMA 404
http://www.ecma-international.org/publications/standards/Ecma-404.htm

```
A JSON text is a sequence of tokens formed from Unicode code points that conforms to the JSON value
grammar.
```
とされている。 `value` は object/array/number/string/`true`/`false`/`null` のいずれかのことであり、従って `null` だけの JSON は**合法**である。

## RFC 4627
https://tools.ietf.org/html/rfc4627

```
A JSON text is a serialized object or array.

  JSON-text = object / array
```
とされている。 `null` は object でも array でもないので、**非合法**だ。

## RFC 7159
https://tools.ietf.org/html/rfc7159

```
A JSON text is a sequence of tokens.  The set of tokens includes six
structural characters, strings, numbers, and three literal names.

A JSON text is a serialized value. Note that certain previous
specifications of JSON constrained a JSON text to be an object or an
array.  Implementations that generate only objects or arrays where a
JSON text is called for will be interoperable in the sense that all
implementations will accept these as conforming JSON texts.

   JSON-text = ws value ws
```
とされている。 `null` だけの JSON は**合法**である。


# 結論
というわけで `null` だけで構成される JSON は現在では合法で、 Ruby の `JSON` モジュールが古い規格に従っているだけのことであった


# 追記: Ruby の JSON モジュールについて
[flori/json 2.0.0](https://github.com/flori/json/blob/v2.0.1/CHANGES.md#2015-09-11-200) で RFC 7159 準拠になったようです。 `JSON.parse("null")` も無事 `nil` を返すようになりました。
Windows上でのEmscriptenのセットアップ

Emscriptenは、C/C++のコードからJavaScriptを出力することのできるコンパイラです（厳密にはちがう？）。
C/C++で書いたコードをそのままブラウザ上で動かすことができるので、とても便利です。
また、GLFWやOpenGL ESにも対応しているため、グラフィックアプリケーションもコンパイルすることができます。

この記事では、Windows上で、Emscriptenのビルド環境を構築する方法を紹介します。
執筆時のEmscriptenのバージョンは、1.35.0です。

#準備
Windows上に環境を整備するには、以下のものが必要です。
筆者は、Windows 10上で構築しています。

- Emscripten SDK : emsdk-1.35.0-web-64bit.exe (http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html)

これをダウンロードし、実行するだけで環境構築が完了します。上手く行かない場合は、Offline版をダウンロードして実行しましょう。
かつては、Pythonを入れたり、ClangやLLVMをビルドしたりが必要だったようですが、今では上記のSDKをダウンロードして実行するだけで一通り必要なものをインストールしてくれます。

これで一通りインストールはされるのですが、大規模なソフトをコンパイルするさいに必要なmakeがインストールされないため、別途準備する必要があります。
筆者はとりあえず以下のものを使っています。

- Make for Windows (http://gnuwin32.sourceforge.net/packages/make.htm)

上記のMake for Windowsには、LibIntlとLibIconvも必要なようです。

- LibIntl for Windows (http://gnuwin32.sourceforge.net/packages/libintl.htm)
- LibIconv for Windows (http://gnuwin32.sourceforge.net/packages/libintl.htm)

これらのサイトから、Binariesをダウンロードし、各binディレクトリ内のファイルを、パスの通っているディレクトリに入れて下さい。

インストールが完了したら、パスを通しておきまます。
（ちなみに、Emscripten SDKのインストールをすると、「C:\Program Files\Emscripten\mingw\4.6.2_32bit」というパスが追加されますが、このフォルダはインストールされないようです。32bit版のSDKなら、インストールされるのかもしれません。）

これで環境構築は完了です。

#まとめ
Windows上でのEmscriptenのセットアップ方法をまとめました。
検索するとOS XやUbuntu上での記事が多く、Windowsのものが少なかったため、改めてまとめてみました。
特にWindowsユーザーにはmakeなどの馴染みもあまりないため、その点も含めてまとめています。
古い記事ですと、ビルドが必要だったりと難しいことが書いてあるものもありますが、今ではとても簡単になっています。

incoming版のインストール方法や、WebAssemblyへのコンパイル等については[こちら](https://www.sumirelab.com/docs/tech/windows%e3%81%abemscripten%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%ef%bc%88incoming%e5%af%be%e5%bf%9c-webassembly%e7%92%b0%e5%a2%83%e3%81%ae%e6%95%b4%e5%82%99%ef%bc%89/)を御覧ください。
Google Apps Script ことはじめ


![image](https://qiita-image-store.s3.amazonaws.com/0/30079/ac39ac0a-ff15-3734-cb72-fa2ba8d6f1d8.png)

# 動機

最近、GoogleのSpreadsheet上でKPIダッシュボードを作ることがあって、単純処理を効率化できたらいいなーと思って触り始めました。
Apps Scriptを使って、定時でクーロンを動かしAPIからデータとってグラフとか書けるようになるのが目標です。

# Driveに、Hello World

[Reference](https://developers.google.com/apps-script/)を見ながら進めていきます。
まず、[script.google.com](script.google.com)を訪れて、以下のコードを書きます。

```
function myFunction() {
  // Create a new Google Doc named 'Hello, world!'
  var doc = DocumentApp.create('Hello, world!');
}
```

保存して、実行します。その際に、認証を求められるので、許可しておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/84e80515-9d6a-5d8f-c6fa-d9a070cbdf78.png)

実行後、Driveを見るとHello, world!というDocsが出来てました。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/bc01c0d3-5b42-85bf-e91e-3ee174c234cc.png)

Script Editorは補完もしてくれて素敵です。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/5ee27e50-b529-2a18-3115-f2152d8886dc.png)


# サンプルコードを利用してスプレッドシートでカスタム関数を作る

[Quickstart: Macros, Menus, and Custom Functions](https://developers.google.com/apps-script/quickstart/macros#set_it_up)を実行すると、スプレッドシートにカスタム関数を付け加えるやり方がわかります。

さらに、Google Mapsの情報を読み取り、地点Aと地点Bまでの経路をカーナビのように表示してくれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/5d64e39b-e756-cd02-5e1c-f9c0a19a11dc.png)

# むすび

なんかいろいろ出来そうでわくわくします。

これを書いたあとに、[GoogleスプレッドシートでKPIなどシートの内容をSlackにも投稿できちゃうGoogle Apps Scriptの逆引きリファレンス](http://qiita.com/wapa5pow/items/c2aef3e83a496bd95410)をかきました。

# 参考

* [呼び出し数などの制限](https://developers.google.com/apps-script/guides/services/quotas#current_quotas)
* [SpreadsheetのAPIリファレンス](https://developers.google.com/apps-script/reference/spreadsheet/#classes)
Windows10でTotalTerminal風のターミナルを使う

最近Surfacebookを手に入れてMacから移行しようかなと思っているのですが、
ターミナルがWindowsでは悩むところですよね。
私はMacではTotalTerminalというQuake風のターミナルを使っていました。
ctrlキーを２回押すとターミナルがにゅいっと出てきて、この感覚がお気に入りだったので
Windowsでも是非やりたい！ということで設定してみました。
以下の二つを使いました。

- [Cmder](http://cmder.net/)
- [AutoHotkey](https://autohotkey.com/)

## Cmder
現在windowsのターミナルとしてcmderがおすすめらしいです。UIも結構イケてます！
私は[開発者がSurfacePro3を買ったらまずやること](http://qiita.com/tanakh/items/a1b4705fb58ef3c89800)を参考にさせてもらいながらインストールしました。シェルにはMSYS2を入れました。
cmderを起動してsettings->Main->Appearanceに移動します。
![cmder-setting.png](https://qiita-image-store.s3.amazonaws.com/0/119101/f2b61ba3-d656-6e69-4f3e-f9ec53ddaba2.png)
ここでQuakes style slide downにチェックを入れます。またAnimation timeを短くすると素早くスライドしてきます。
![Cmder-shotcut.png](https://qiita-image-store.s3.amazonaws.com/0/119101/311b4eec-a7a3-d869-4a90-e37335db0288.png)
Key＆Macroからターミナルの表示/非表示のトリガーキーを設定できます。
ここでctrl2回押しを設定したかったのですが、やり方がわかりませんでした...
=> ctrl2回押下に対応しているアプリからctrl+@を呼び出そう！

## AutoHotkey
ということで、autohotkeyならキー連続入力に対応してるだろうということで調べてみるとちゃんと対応してました！！
アプリをインストールした後、
デスクトップを右クリック->新規作成->AutoHotkey Script
でAutoHotkeyの新規スクリプトを作成します。ファイルをテキストエディタで開き、以下のように設定します。
AutoHotkeyのスクリプトはhttp://eternalbeta.cs.land.to/wiki.cgi?page=AutoHotkey#p24 にサンプルが豊富にあります。

```ahk:script.ahk
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Ctrl::
	If (A_PriorHotkey = A_ThisHotKey && A_TimeSincePriorHotkey < 300)
		Send,^@
	KeyWait,Ctrl
return
```
保存後、スクリプトをダブルクリックするとAutoHotkeyが起動します。
その状態でctrlを２回押してみると...
![Animation-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/119101/8a0d2361-564c-b4a5-1363-b64785f92c70.gif)

にゅいっとターミナルが出てきたり消えたりします！！

これでQuake風のターミナルをwindowsでも使うことができました。
後は細かい設定をしていけば使いやすくなりそうです！
Bashがくるまでこれで頑張る
GloVeが出力したモデル(txt)をgensim.word2vecで読み込めるように整形する。


GloVeで学習すると、標準のオプションではvector.binとvector.txtが出力される。
これらはgensim.word2vecで読み込めないので、読み込める形式に整形する。

# word2vecのフォーマット
区切り文字はスペース


**1行目：単語種類数 次元数**
**2行目以降：単語1 ベクトル1 ベクトル2 ...**

上記のようなシンプルなフォーマットとなっている。

# GloVeのフォーマット
区切り文字はスペース

**単語1 ベクトル1 ベクトル2 ...**

上記のように、word2vecの1行目が欠けている。
つまり単語種類数と次元数を1行目に追加することで形式が変換できる。

# 実装

## 使い方

```
$ python glove2word2vec_format.py vector.txt > gensim_vector.txt
```

出力したものを`model = word2vec.Word2Vec.load_word2vec_format("./gensim_vectors.txt", binary=False)`とすれば読み込める。

## ソースコード

```glove2word2vec_format.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def main():
    argvs = sys.argv  # コマンドライン引数を格納したリストの取得
    argc = len(argvs) # 引数の個数

    if (argc != 2):   # 引数が足りない場合は、その旨を表示
        print('Usage: # python %s filename' % argvs[0])
        quit()

    line_count = 0 # 行数
    vector_size = 0 # 次元数
    # 1度目のファイルアクセスで、行数と次元数を確認
    with open(argvs[1], "r") as fin:
        for line in fin:
            line_count += 1
        # 最後に次元数を確認
        vector = line.rstrip().split(' ')
        vector_size = len(vector) - 1
	# 2度目のファイルアクセスで、word2vec形式のものを標準出力
    with open(argvs[1], "r") as fin:
        print(line_count, vector_size)
        for line in fin:
            print(line, end="")

if __name__ == "__main__":
    main()
```

# 出来なかったこと
バイナリファイルを開いて、word2vec形式に変換したかった。
バイナリファイルの開き方が知識不足により実現できなかった。
RTXルータのファームウェアアップデート

Windows PCからTFTPを使用して、RTX1100のファームウェアアップデートを行ったので、その手順メモを残します。

以下の環境で作業しました。(自前の環境に置き換えてください。)
```
作業PC：OS Windows10
Windows PCのIPアドレス：192.168.11.103/24
RTX1100ルータ(LAN1)のIPアドレス：192.168.11.50/24
ダウンロードしたファームウェア：rtx1100.bin
ダウンロードしたファームウェアの保存場所：デスクトップ
```

# 準備したもの
- D-Sub9ピン RS232 のシリアルケーブル
※注 結線はクロスタイプのもの
- USBシリアル変換ケーブル
- ターミナルソフト

それぞれ以下のケーブル、ターミナルソフトを使いました。

- ELECOM製 シリアルリバースケーブル
- iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)1.0m ブラックスケルトン BSUSRC0610BS
- TeraTerm

# ファームウェアのダウンロード
以下YAMAHAサイトから、ルータに合った最新版をダウンロード。
http://www.rtpro.yamaha.co.jp/RT/firmware/index.php

# ルータへの接続とログイン(ルータ側での作業)
※USBシリアル変換ケーブルは事前にドライバソフトをインストールしてください。
※ルータはinitボタンで事前に初期化しています。(cold startコマンドを使用した初期化方法もあります。)
1. PCとルータをシリアルケーブルで接続して、TeraTermを起動。
2. TeraTermの[新しい接続]ウィンドウから[シリアル]を選択。
3. [ポート]から[COM番号: USB Serial Port(COM番号)]を選択して、[OK]を押下。
4. パスワードをを求められたら、Enterキーを押下。(初期化直後の場合)
5. Administrator権限
```> administrator```
6. IPアドレスの設定
```# ip lan1 address 192.168.11.50/24 ```
7. tftpによるファームウェア受信許可の設定
```# tftp host 192.168.11.103```
8. 保存
``` # save```

# ファームウェアのアップロード(Windows側での作業)
ここの手順はYAHAMAが提供してくれている資料が参考になります。
http://www.rtpro.yamaha.co.jp/RT/how2tftp.pdf

1. コマンドプロンプトを[管理者]で起動。
2. ファームウェアをルータにアップロード。
```
C:\WINDOWS\system32> tftp -i 192.168.11.50 put c:\Users\sacchinログオンユーザ名\Desktop\rtx1100.bin exec
```

※「'tftp'は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません」と返されたら、以下を実施してみてください。(TFTPはデフォルトでは無効になっています。)

[コントロールパネル]→[プログラムと機能]→[Windowsの機能の有効化または無効化]を選択して、[Windowsの機能]から[TFTPクライアント]にチェックを付けて[OK]を押下。
※もしくは[Ctrl]+[R]を押下し、[OptionalFeatures]を入力して[OK]押下すると、[Windowsの機能]が表示されます。

3\. バージョン確認
```# show config 
RTX1100 Rev.8.03.94
```

# 設定の削除(ルータ側での作業)
tftpによるファームウェア受信拒否の設定(設定削除)
```# no tftp host```

以上が、ファームウェアアップデート手順になります。
Mac OSでSwiftを利用したメニューバーの編集のやり方を教えてください。

Mac OSでSwift2を使ったメニューバーの編集方法を教えてください。

例えば、メニューバーのファイルの
Openを選択したり、Saveを選択するとWindowが開いて選択できるようにしたいです。

方法がお分かりになる方がいらっしゃれば、ご指導よろしくお願いします。
Swift(Mac OS)でキーボードのKeyの値を取得したい。

Mac OSでSwift言語を利用してキーボードの入力された値を取得したいのですが、どこにどのように記述すれば良いかわかりません。

NSResponderから継承させるような気がするのですが・・・
わかる方がいらっしゃれば、ご指導よろしくお願いします。
Chrome 拡張を使って、DocBase のサブメニューを閉じられるようにしてみた

[DocBase - 社内の人も社外の人も、関係者全員で使える情報共有サービス](https://docbase.io/) を使っているが、`〇〇で検索`をするとサブメニューが出て、表示領域を圧迫するので、閉じられるようにしてみた。

# 画面例

デフォルトは3カラム

![image](https://qiita-image-store.s3.amazonaws.com/0/30755/51160785-44f1-6d25-1876-21d761972d15.png)

タグで検索をすると、サブメニューが表示される
(あれ？こっちも3カラムだな……)

![image](https://qiita-image-store.s3.amazonaws.com/0/30755/2fb96209-213e-7ce8-623f-e16c5efbaaa2.png)

邪魔なので、閉じたい。閉じるボタンを追加。

![image](https://qiita-image-store.s3.amazonaws.com/0/30755/6eb125bd-5963-f3ae-4506-6c238d99f1ed.png)

閉じると、広くなって嬉しい。

![image](https://qiita-image-store.s3.amazonaws.com/0/30755/392570d7-0aa9-5192-4e61-ead31dad7c5f.png)

# コード

manifest.json

```
{
  "name": "Docbase Custom",
  "version": "1.0",
  "manifest_version": 2,
  "permissions": [
    "https://*.docbase.io/"
  ],
  "content_scripts": [
    {
      "matches": ["https://*.docbase.io/*"],
      "js": [
        "./js/zepto.min.js",
        "./js/content_script.js"
      ],
      "run_at": "document_end"
    }
  ]
}
```


content_script.js

```
var actualCode = '(' + function() {
  var subMenuHider = function(){
    var $toggler = $('<div style="position:absolute;top:0;background:yellow;z-index:1;width:10px;height:20px;cursor:pointer;"></div>');
    var $closer = $toggler.clone().css({"right": 0}).text("<");
    var $opener = $toggler.clone().css({"left": 0, "display": "none"}).text(">");
    var $subMenu = $(".js-main-sub-menu");

    $(".sub-menu").prepend($closer);
    $(".js-main-content").prepend($opener);

    $closer.on("click", function(){
      $subMenu.hide();
      $opener.show();
      $(window).trigger("resize");
    })
    $opener.on("click", function(){
      $subMenu.show();
      $opener.hide();
      $(window).trigger("resize");
    })
  }
  $(document).ajaxComplete(function(event, xhr, settings) {
    if (settings.url.indexOf("/groups") > -1 ||
        settings.url.indexOf("/api/tags") > -1) {
          subMenuHider()
        }
  });
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
```

# 参考
[jquery - Chrome-extension Javascript to detect dynamically-loaded content - Stack Overflow](http://stackoverflow.com/questions/17986020/chrome-extension-javascript-to-detect-dynamically-loaded-content)
Unity RemoteでのプレイはApplication.isEditor = true だよ、というメモ

作ったスクリプトをスマホで軽く検証したい、というときに[Unity Remote](http://docs.unity3d.com/ja/current/Manual/UnityRemote4.html)が便利ですが、初心者がその時にちょっと陥ってしまったメモ

# Application.isEditor
Unityのエディタ上で動いているときはtrueを返すbool値です。
「スマホではスマホ用の操作をしたいけど、エディタ上ではキーボードで動きの確認をしたい」というときに使います。

```lang:C#
/// Editorで起動しているときはキーボード操作を可能にし、そうじゃないときはスマホのジャイロで動かす
if (Application.isEditor) { 
    move.x += Input.GetAxis ("Horizontal") * 3.0f; /// Vector3 moveは別に記述、数字は適当
    if(Input.GetKeyDown("space")) Jump(); /// void Jump()は別に記述
} else {
    move.x = Input.gyro.gravity.x * 12.0f; /// スマホを傾けると左右に移動、数字は適当
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {Jump ();} ///タップするとジャンプ
}
```
エディタで操作しているときは左右キーでx軸方向移動、Spaceキーでジャンプ。
実機で操作しているときは傾けてx軸方向移動、タップでジャンプ。

なのですが、このscriptだとUnityRemoteで動きません。エラーも起きないので1時間ほどハマってしまいました。
なぜかというと、UnityRemoteもエディタから起動するので、 	`Application.isEditor = true` になるからです。普通に考えたら当たり前です。

なのでこのようにしました。

```lang:C#
/// Editorで起動しているときはキーボードでもスマホでも操作可能にする。 そうじゃないときはキーボードでは操作できない。
move.x = Input.gyro.gravity.x * 12.0f; 
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {Jump ();} 
if (Application.isEditor) { 
    move.x += Input.GetAxis ("Horizontal") * 3.0f;
    if(Input.GetKeyDown("space")) Jump();
}
```

`else`を取っただけです。
あと、`Input.gyro.gravity.x`が`Input.GetAxis("Horizontal")`を上書きしないよう、記述の順序を変えました。
これでUnityRemote(スマホ)でもキーボードでも無事に動作するようになりました。
Ruby Enumerable#inject メソッドの使い方 初期値の意味 

inject メソッドのリファレンスを読み解くのに時間がかかったのでメモしておく。
inject メソッドはブロックを使って繰り返し計算を行ってくれるらしい。

```rb
p [2, 3, 4, 5].inject {|result, item| result + item }        #=> 14
p [2, 3, 4, 5].inject(0) {|result, item| result + item**2 }  #=> 54
```
この .inject(0) とはなんだろう？
pry で実行。

```rb
pry(main)> p [2, 3, 4, 5].inject(0) {|result, item| result + item**2 }
54
=> 54
pry(main)> p [2, 3, 4, 5].inject {|result, item| result + item**2 }
52
=> 52
```

(0)があるのと無いので出力結果が2ほどずれる。リファレンスをもう少しちゃんと読んでみる。

>inject(init = self.first) {|result, item| ... } -> object

>最初に初期値 init と self の最初の要素を引数にブロックを実行します。 2 回目以降のループでは、前のブロックの実行結果と self の次の要素を引数に順次ブロックを実行します。 そうして最後の要素まで繰り返し、最後のブロックの実行結果を返します。
要素が存在しない場合は init を返します。
初期値 init を省略した場合は、 最初に先頭の要素と 2 番目の要素をブロックに渡します。 また要素が 1 つしかなければブロックを実行せずに最初の要素を返します。 要素がなければブロックを実行せずに nil を返します。

なるほど。初期値が（上のケースで言えば(0)）がない場合、先頭の要素と2番目の要素をブロックに渡すらしい。

```rb
p [2, 3, 4, 5].inject {|result, item| 
result + item #1回目は2 + 3
}        #=> 14
p [2, 3, 4, 5].inject(0) {|result, item| 
result + item**2 #1回目は0 + 2**2
}  #=> 54
p [2, 3, 4, 5].inject {|result, item| 
result + item**2 #1回目は2 + 3**2
}  #=> 52

```
これで2ずれるのね。徐々にリファレンスを読めるようになってきて嬉しい。
railsでparamsからパラメータを取得するとundefined methodが出る。

##環境
Rails: 4.2.2
OS: OS X El Capitan(10.11.4)

##原因と対処法
検索フォームから条件を取得して検索するということをやろうとした。
検索フォームのviewのtext_fieldでkeywordを指定しているので、Controllerのparams[:keyword]で値を取得しようとたら下記のようなエラーが出た。

```
undefined method `keyword' for #<Search:0x007f9e0959cf00>
```

ソースは以下のとおり。

```SearchesController.rb
class SearchesController < ApplicationController
  def index
    item_name = params[:keyword]
  中略
end

```

```search.rb
class Search
  include ActiveModel::Model
  attr_accessor :title, :author, :pubilisher, :image
end
```

```new.html.erb
<% provide(:title, "本の検索") %>
<h1>本の検索</h1>

<%= form_for @search, url: searches_path, method: 'get', html: {class: 'form-horizontal'}  do |f| %>

  <div class="form-group">
    <div class="col-md-2">
      <%= f.label :keyword %>
    </div>
    <div class="col-md-6">
      <%= f.text_field :keyword, class: 'form-control' %>
    </div>
  </div>

  <div class="form-group">
    <div class="col-md-2">
      <%= f.submit "検索", class: "btn btn-primary" %>
    </div>
  </div>
<% end %>
```

どうやらModelにkeywordがなかっただけのようだ。
keywordをModelに追加したら正常に 動くようになった。

```search.rb
class Search
  include ActiveModel::Model
  attr_accessor :title, :author, :pubilisher, :image, :keyword
end
```
Mediumさんに翻訳に関するポリシーを聞いてみた

Medium.comに、翻訳ポリシーに関する質問をしました。
自分のリテラシーが低く、該当記述を探すことができなかったので。。明確な回答を得たのでQiitaに書き残しておきます。

結論から言うと、__投稿者の了承を得れば好きにしていい__とのことでした。
以下、メールのやりとり。（拙い英語ですみません。。）

```
// 僕。
Hi. I’m a young web developer living in Japan.

Today let me ask you a question please. Could you tell me if I can translate and publish your properties to the website where people can see?
Most of Japanese people can’t understand English so much. I wish I can provide amazing posts about programming in Medium.com with Japanese developer community and make them greater. 
I’ll wait your reply patiently.

Sincerely.

```

```
// Mediumの人
Hi Chuck,

Thanks for your interest in Medium. The rights of the content on Medium belong to their authors. You can translate and publish them if the author of the post gives permission to you to do so. 

I hope this helps.

Thanks,
Ahmet
User Happiness
```

```
// 僕。
Thanks for early and tender reply. 
I completely understood your translation policy.

After I got your reply, I translated the post and it got huge popularity among Japanese tech community.
Off course I got permission of the post's author.

This is it.
http://qiita.com/chuck0523/items/caacbf4137642cb175ec

I appreciate your huge effort to maintain the greatest website in the world. May great posts in Medium.com make the world better place!

Thanks.

```
「第６章」Apache Solr インストール

#Apache Solrのインストール
Apache solrはオープンソースの全文検索エンジンです。

**Solrの特徴**

***とにかく速い*** ... 噂では7億ドキュメント(インデックスサイズ3.5TB)でも1秒以内に返ってくるらしい。

***分散インデックス、レプリケーションなどの機構を備える*** ... インデックスが大規模になった時にマスタースレーブを作ったり、インデックスを分割したりとサーバーの負荷を軽減して高速検索を可能にする色々な機能がある

***ファセット機能*** ... ファセット検索とはSolrの機能の名称で、実際のサイトでは「絞り込み(ドリルダウン)検索」を表示するために利用される。
現在の検索結果に含まれる「ある属性」の含まれる件数を数え上げることができる。
実際のサイトでは都道府県やタグの表示に利用されることが多い。

MySQLなどのデータベースで個数を数え上げることもできるが、
1回のリクエストで1つの個数しか取得できないため、都道府県の絞り込みを実装したい場合には最大で47回のリクエストが発生することになり現実的ではない。

Solrのファセット検索では1回のリクエストで最大47個全ての個数が取得できるため、圧倒的な速度向上が見込まれる。

***地理空間検索*** ... 位置認識検索サービスを作成するのは、高価な専用ソリューションと地理空間の専門家たちの領域だったが、
最近になって、Apache Solr に空間機能が追加された。

##Javaのインストール
1. WindowsにJDKをインストールする。
2. javaのバージョンを確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/8dbbfaab-b4db-1746-803f-f7577bcfca9c.png)

##Solrのインストール
1. Solrのサイト (http://lucene.apache.org/solr/) に行き、右のメニューの[Download]ボタンをクリックする。![image](https://qiita-image-store.s3.amazonaws.com/0/85145/928712b7-aa28-88f4-f64c-f8df2e37e327.png)
2. 「Apache Download Mirrors」のページに飛びますので、適当なリンクをクリック。![image](https://qiita-image-store.s3.amazonaws.com/0/85145/c59f0ba2-52fe-93b9-58ed-e01773a8aabe.png)
3. Windowsの場合は、Zipをダウンロード。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/b4a4ff1b-3c75-a051-1126-29f0fa0e3b85.png)
4. 適当な場所にZipファイルを解凍する。私の場合は「D:\Software\solr-6.0.0」。

##Solrの起動
1. コマンドプロンプトから次のようにSolrを起動する。
2. `solr start -e cloud -noprompt`
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/e94625e9-1e1f-ad15-5e30-84ab1f0e50b5.png)
3. 起動結果
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/da8499ba-4a42-615d-1050-f27712741af6.png)
4. Solrが正しく起動できたか、Solrの管理画面にアクセスして確認する。[default設定]
http://localhost:8983/solr/
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/337bff31-c6a3-4a6b-a98c-dc692395248a.png)
AssetBundleの作成と利用方法(Unity5.3)


AssetBundleをROMに見立てて読み込もうと思いついたが
資料がネット上に散乱している上に前バージョンの
サンプルとかもあったり情報が錯綜としているので
とりあえずまとめてみようと思う
以降Unity5.3時点でのコードで記載しておく


###ソースコード

```BuildAssetBundle.cs
using UnityEditor;
using System.Collections;

public class BuildAssetBundle {
	[MenuItem("Assets/Build AssetBundles")]
	static void BuildAllAssetBundles()
	{
		BuildPipeline.BuildAssetBundles ("Assets/AssetBundles_Output");
	}
}
```

```Loader.cs
using System;
using UnityEngine;
using System.Collections;

public class Loader : MonoBehaviour {

	// Create a symbolic link by first
	// ex) /Users/Shared/AssetResources/ -> /AssetBundleWithDLLTest/AssetBundleWithDLLTest/Assets/AssetBundles_Output/
	string BundleURL = "file:///Users/Shared/AssetResources/packingassets.unity3d";
	string AssetName = "NowPrintingCube";

	IEnumerator Start () {
		using (WWW www = new WWW (BundleURL)) {
			yield return www;
			if (www.error != null) {
				throw new Exception ("WWW download error:" + www.error);
			}
			AssetBundle bundle = www.assetBundle;
			if (AssetName == "") {
				Instantiate (bundle.mainAsset);
			} else {
				Instantiate (bundle.LoadAsset (AssetName));
			}
			bundle.Unload (false);
		}
	}
	
	void Update () {
	
	}
}
```

上のコードは本家のサンプルを改造したものだが
「packingassets.unity3d」のタグが付いた「NowPrintingCube」という
PrefabをAssetBundleとして出力して実行時に読ませるようにしている
手順として次の通りである

###AssetBundleのビルド
```
1. Assets/Editorに上のBuildAssetBundle.csを置く
2. Unityウィンドウの右下のAssetBundleプルダウンからリソースをどのAssetBundleに含めたいか選択する（例ではpackingassets.unity3dを選択）
3. 上メニューの「Assets」に「Build AssetBundles」からビルド
4. /Assets/AssetBundles_Outputにpackingassets.unity3d作成される
```
###AssetBundleの読み込み
```
1. ヒエラルキーにあるGameObjectにLoader.csを追加（自分は「base」というオブジェクトに読ませている）
2. BundleURLメンバーにpackingassets.unity3dのパスを指定する（例ではシンボリックリンクを使っている）
3. WWWクラスでアセット読み込み
4. Instantiateでpackingassets.unity3d内のNowPrintingCubeというPrefabを読み込む
```
とりあえず上のコードでローカルファイルからキャッシュ無しでかつエディター上でもAssetBundleから読み込めるようになる

GitHubの以下のコミットが今回のプロジェクトである
[AssetBundleWithDLLTest / Implement simple packing and load AssetBundle](https://github.com/SkillshotJP/AssetBundleWithDLLTest/tree/a1dddee5ae3917da3eab6b2194e2fee8267090b4 "AssetVybdkeWithDLLTest / Implement simple packing and load AssetBundle")


次回はAssetBundle上でのコード読み込みについて書こうと思う

###参考文献
[Unity - マニュアル: アセットバンドル](http://docs.unity3d.com/ja/current/Manual/AssetBundlesIntro.html "Unity - マニュアル: アセットバンドル")
dockerでalpineベースのminidlnaイメージを作る

# 目的

alpineベースでサイズが小さいminidlnaイメージを作りたい

## alpineベースでイメージを作る

alpineのapkにminidlnaパッケージがあるのでらくちん
alpineのedgeとstable(3.3)でminidlnaのバージョンにほとんど差がなさそうなのでstableを使います
https://pkgs.alpinelinux.org/packages?name=minidlna&branch=&repo=&arch=&maintainer=

Dockerfileはこんな感じで、minidlnaのインストール、設定ファイルのマウント、minidlnaの起動をしてます

```:Dockerfile
FROM alpine:latest

# install minidlna
RUN apk --update add minidlna && rm -rf /var/cache/apk/*

# Add config file
ADD conf/minidlna.conf /etc/minidlna.conf

CMD minidlnad -d

```

`ADD conf/minidlna.conf /etc/minidlna.conf` で指定したminidlnaのconfigはこんな感じ
メディアファイルはvideoだけ指定していますが、必要ならaudio、picturesも設定しましょう
[このページ](https://wiki.archlinuxjp.org/index.php/ReadyMedia)はarch用のminidlnaの説明ですがalpineでも参考になります

```:etc/minidlna.conf
user=minidlna
media_dir=V,/var/lib/minidlna/videos
db_dir=/var/cache/minidlna
log_dir=/var/log
port=8200
friendly_name=Alpine DLNA Server
serial=681019810597110
inotify=yes
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg
album_art_names=AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg
album_art_names=Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
strict_dlna=no
enable_tivo=no
notify_interval=895
```

起動はこんな感じ

```bash
$ docker build -t minidlna:alpine Dockerfile
$ docker run -d --name minidlna \
  --net=host \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -v /HOST_VIDEO_DIR:/var/lib/minidlna/videos \
  minidlna:alpine

```

VLCやPS3でvideoファイルの再生が問題なくできました :vhs: 

## Ubuntuとのサイズ比較

試しにUbuntu16.04ベースのイメージも作ってサイズを比べるとこんな感じ

```
$ docker images
REPOSITORY        TAG      IMAGE ID        CREATED           VIRTUAL SIZE
ubuntu-minidlna   latest   70fbfbdeba9b    13 minutes ago    318.7 MB
alpine-minidlna   latest   cd59ae61d3d6    2 minutes ago     49.42 MB
```

320MBから50MBなのでかなり減ります :muscle: 
こんなに差があると積極的にalpineベースに変えていきたいですね :+1:
youtubeのダウンローダー使い方メモ

これ系は昔から色々ありましたが、
やっぱりモダンなソフトウェアはわかりやすくて便利ですね。

## これをつかいます

youtube-dl: https://github.com/rg3/youtube-dl
pythonで実装されたyoutubeから動画をダウンロードするためのソフトです

## インストール

macなら普通にbrewで入ります

```
$ brew install youtube-dl
```

## 使い方

### URLを引数に渡して実行するとダウンロードされます

```bash
$ youtube-dl https://www.youtube.com/watch?v=fdLKVMCrzN
```

### よしなに名前をつけてダウンロードできます

- `%(autonumber)s`: 連番をつけてくれる
- `%(title)s`: 動画タイトル
- `%(ext)s`: 拡張子

```bash
$ youtube-dl -o '%(autonumber)s-%(title)s.%(ext)s'\
  https://www.youtube.com/watch?v=fdLKVMCrzN
```

その他にもいろいろなテンプレート変数があります
https://github.com/rg3/youtube-dl#filesystem-options


### ダウンロードしたいリストから落とせます

URLのリストが入っているファイル名を渡すと、上から順番にダウンロードしてくれます

```bash
$ youtube-dl \
  -a /tmp/youtube-file-urls.txt \
  -o '%(autonumber)s-%(title)s.%(ext)s'
```
ブラウザ外から写真をドラッグアンドドロップする（JavaScriptUI）

タイトルのような画面を作成したので、メモしておきます。大昔（10年くらい前）は、IE限定で同機能に300万円前後の値段を付けて機能追加の仕事を受けていました（たしかActiveXなどを利用した記憶があります）。HTML5ではDrag and Drop　、File APIが利用できるため、簡単に実装できます。

**機能**
・ブラウザ外から写真をマウスでドラッグドロップして、画面に表示する

**JavaScript**

```js:image_drop.js
"use strict";
const target = document.getElementById("target");
target.addEventListener("dragover", event => {
  event.preventDefault();
});
target.addEventListener("drop", event => {
  event.preventDefault();
  const file = event.dataTransfer.files[0];
  Object.keys(event.dataTransfer.files).forEach(function(key){
    if (event.dataTransfer.files[key].type.indexOf("image/") < 0) {
      return;
    }
    const reader = new FileReader(); 
    reader.addEventListener("load", event => {
      const image = document.createElement("IMG");
      image.src = event.target.result;
      document.getElementById("result").appendChild(image);
    }, true);
    reader.readAsDataURL(file);
  });
});
```

**HTML**

```html:image_drop.html
<div id =　"target" style="width:80%;height:100px;border:1px solid;margin:10px auto 0 auto;">
  ここに写真をドラッグしてください
</div>
<div id="result" style="width:80%;height:100px;margin:10px auto 0 auto;"></div>
```

ソースは必要最低限だけ記載しましたが、以下サンプルは画面を整形しています。
[ブラウザ外から写真をドラッグアンドドロップする（JavaScriptUI）](http://kaikusakari.github.io/image_drop.html)

**動作イメージ**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/110457/ac3c123c-1d16-15ce-f723-9e95a7d9b118.png)

指定範囲に写真をドロップすると、画面上に写真とファイル名を取り込みます。
（背番号間違えてた。。）
NOP WORD PTR?

自分で書いたC言語のコードを逆アセンブルしていたところ、妙なオペコードの存在に気づきました。

# 基本知識

## NOP命令
多くのCPUには、「何もしない」命令である`NOP`命令が備わっています。CPUによっては、設計時に「全ビット0」のようなパターンを意識的にNOPへ割り当てていることがあります。

x86はそうではなく、もともとは`XCHG EAX, EAX`（`EAX`レジスタ同士を交換するという、実質何も実行しない命令）を`NOP`として使っていました。その後のパイプライン化で`EAX`レジスタを触らないように最適化されることとなり、x64に至っては（本来32ビットレジスタに触れば上位32ビットはクリアされるはずが）真に何もしない命令となっています。

また、この`XCHG`から派生したものとは別系統の、`0f 1f`から始まるオペコードのNOPも実装されています。

## WORD PTR
AT&T記法では`movl`や`andw`というように、命令そのものでオペランド幅を表現するようになっています。一方、インテル記法の場合、命令自体は`MOV`や`AND`のようにオペランド幅を問わず共通となっています。

どこかのオペランドがレジスタなら、幅は決め打ちにできるのですが、メモリと即値の場合、何も書かなければ幅がわかりません。ということで、`BYTE PTR`、`WORD PTR`、`DWORD PTR`、`QWORD PTR`というものをメモリオペランドの前に補って、どんな幅でメモリをアクセスするのかを（アセンブラレベルで）表現します。

# 妙なオペコード
`objdump -d -M intel`として、自分がCで書いたコードを逆アセンブルしていたのですが、その過程で妙なものを発見しました。

```
     fa1:	66 2e 0f 1f 84 00 00 	nop    WORD PTR cs:[rax+rax*1+0x0]
     fa8:	00 00 00 
```

なんと、`NOP`命令に複雑なオペランドを指定してあるのです。これはもしかして、「`NOP`と見せかけて何かしらの処理を行うのでは」なんてことも思ったのですが、調べてみればやはり「何もしない」とのことでした。

どうやら、これはアライメントを合わせるために埋めてあるものだということでした。そして、1バイトの`NOP`で埋めるよりデコードの効率がいいので（一度に○**命令**デコードできるとのこと）、オペランドやプレフィックスを指定して10バイトにした`NOP`を使っている、というのが真相でした。

# 外部リンク
* [Intelのオペコード一覧（PDF）](http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)
* [Stackoverflow](http://stackoverflow.com/questions/22486415/gdb-nop-with-extra-data-why)
一回使ってみたい無料系の管理画面フレームワークまとめとく

管理画面用のUIフレームワークをちょこちょこ見るんですが、一回使ってみたいなと思ってそのまま忘れることが多いのでまとめておきます。
使ったことはないけどかっこいいので使ってみたいというやつをただ貼っていくだけの内容ですが


# blur-admin

https://github.com/akveo/blur-admin

http://akveo.com/blur-admin/#/dashboard

最近見た中で個人的にダントツかっこいいやつ。
ひたすら男心くすぐってくるな〜っていうUI。
bootstrapベースで一通りの機能は揃ってそうなイメージです。
カラーテーマとかはなさそうなので、デモのままのUIになりそう


# RazorFlow

https://razorflow.com/

シンプルで使い勝手が良さそうなUIです。
白基調だし、管理画面っぽい感じでちょっとだけ凝ってる風に見せられるかなって気がします。
ひとことで言うと無難な印象


# Gentellela

https://github.com/puikinsh/gentelella

https://colorlib.com/polygon/gentelella/index.html

見た目的には前出2つの中間ぐらい？
ただ、デモページのUIがたまに壊れてるとこあるので若干不安、、、


# AdminLTE

https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html

割りとメジャーどころなのかな？
シンプルだけどbootstrapで自前でつくるよりはだいぶ凝ったUIにできそう。
結構使われてるっぽいので安定感ありそう.。

---


次に管理画面作ることあったらこの辺から選択してみようかな〜と思ってます！
React NativeでEventEmitterを利用してナビゲーションのボタンイベントを検知する

ReactNativeのナビゲーションボタンはコンポーネントと独立しているので、コンポーネントをまたいでイベントを処理する必要がある。NavigationコンポーネントでReduxのStateを監視しても良いが、単純にイベントを聞く方が個人的にはすっきりすると思う。　(Eventの多用は混乱を招くので注意しないといけませんが）


私は[ExNavigator](http://qiita.com/shohey1226/items/7a4d355de17187da2758)を利用しているので、これを用いて説明します。

Router.jsでEventEmitterのインスタンスを持ちます。そして、ボタンを押すとeventをemitする仕組みです。


```
import React, {View, WebView} from 'react-native';
import ExNavigator from '@exponent/react-native-navigator';
import ExSceneConfigs from '@exponent/react-native-navigator/ExSceneConfigs';
import EventEmitter from 'EventEmitter';

let eventEmitter = new EventEmitter();

let Router = {
  getNewBlockerRoute(){

    return {
      renderScene(navigator) {
        let NewBlocker = require('./containers/NewBlocker').default;
        return <NewBlocker navigator={navigator} type="new" events={eventEmitter}/>;
      },

      configureScene(nav){
        return ExSceneConfigs.ZoomFromFront;
      },
      getTitle(){
        return "New Blocker";
      },
      renderLeftButton(navigator){
        let CloseButton = require('./components/CloseButton').default;
        return <CloseButton navigator={navigator} onCloseButtonPress={() => eventEmitter.emit('closeButtonEvent') }/>
      },
      renderRightButton(navigator){
        let SaveBlockerButton = require('./containers/SaveBlockerButton').default;
        return <SaveBlockerButton navigator={navigator} type="new" onSaveButtonPress={() => eventEmitter.emit('saveButtonEvent') }/>
      }
    }
  },


}

module.exports = Router;
```

Closeボタンでは、propsを実行するだけ。

```
import React, { View, Text, Image } from 'react-native';
import Styles from './Styles';
import Button from 'react-native-button';

let CloseButton = React.createClass({

  onPressClose(){
    const { navigator, onCloseButtonPress } = this.props;
    if(typeof onCloseButtonPress === "function"){
      onCloseButtonPress();
    }
    navigator.pop();
  },

  render(){
    return (
      <Button onPress={this.onPressClose}>
        <Image source={require('../assets/images/close.png')} style={Styles.exClose} />
      </Button>
    );
  }
});

export default CloseButton;
```

そして、これをListenしたいComponentで定義する。

```
import Subscribable from 'Subscribable'; // unmount時にremoveなどのsubscriptionの処理をしてくれる

let NewBlocker = React.createClass({

  mixins: [ Subscribable.Mixin ],　// Mixinで利用できるようになる。.Mixinを忘れずに

  componentDidMount(){
    this.addListenerOn(events, 'closeButtonEvent', this.stopLoading);
    this.addListenerOn(events, 'saveButtonEvent', this.stopLoading);  
　　　 },  

  // emitされるたびに呼ばれる。
  stopLoading(){
    this.refs.webview.stopLoading();
  },
```


最初に言ったようにeventの多用は混乱します。私はRoute管理だけに利用しています。
Unity5: ScrollRect上に表示するButtonの反応がシビアな件への対応

uGUIのScrollRect上にButtonを表示しているケースでButtonの反応が著しくシビアだったりする。
この件は以前から世界中で皆が悲鳴を上げている症状。
Unity本体での対応も予定されているようだが実装時期は未定の模様。情報を検索しているとだいたい定番と言える対応が見えてくる。

今回は、こちらのページ[UnityのuGUIでスクロール中にボタンの長押しをするスクリプト](http://kohki.hatenablog.jp/entry/Unity-uGUI-Scroll-Long-Press)を参考に自分なりの対応を行ってみた。

自分のケースでは長押しは不要で取りこぼしているであろうButtonのクリックを再現できればよいだけなので内容はシンプルになる。
ちょっとだけ工夫したのはクリックと見なした場合のアプリケーション側への通知をUnityEventで行うこと。

ScrollRectを継承して、ドラッグの開始と終了で移動距離をチェックし閾値以下であればアプリケーション側へ通知する処理を追加。
この内容だと厳密にはクリック動作と言えない判定ではあるけれど実用上はあまり問題にならないと思う。

### スクリプト

```csharp:ScrollRectEx.cs
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ScrollRectEx : ScrollRect
{
    public ScrollRectExEvent onClicked;
    const float MAX_DISTANCE = 20.0F;

    private Vector2 startPos;

    new void Start()
    {
        base.Start();
        if (onClicked == null) {
            onClicked = new ScrollRectExEvent();
        }
    }

    public override void OnBeginDrag(PointerEventData eventData)
    {
        startPos = eventData.position;
        base.OnBeginDrag(eventData);
    }

    public override void OnEndDrag(PointerEventData eventData)
    {
        base.OnEndDrag(eventData);
        float distance = Vector2.Distance(startPos, eventData.position);
        if (distance < MAX_DISTANCE) {
            onClicked.Invoke(eventData);
        }
    }

}
```

アプリケーション側へ通知する際のイベントを用意。

```csharp:ScrollRectExEvent.cs
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ScrollRectExEvent : UnityEvent<PointerEventData>
{
}
```

（上の例ではファイルを分けているが用途を考えると一つのファイルにまとめる方が妥当かもしれない）

### 使い方

アイテムのリストを表示するスクロールビューのオブジェクト ItemSelector(仮名) がある場合
まずは ItemSelector(仮名) にコンポーネントとして 上記の ScrollRectEx を追加する。

そして ItemSelector(仮名) を管理するスクリプト ABC.cs がある場合、次のように処理を用意する。

```csharp:ABC.cs
void Start()
{
    var component = GetComponent<ScrollRectEx>();
    component.onClicked.AddListener(OnClicked);

    // その他アプリケーション固有の処理
}

public void OnClicked(PointerEventData eventData)
{
    // このメソッド内はアプリケーション毎に対応が変わる。以下はあくまでも参考。
    var component = eventData.pointerPressRaycast.gameObject.GetComponent<Content>();
    if (component != null) {
        // クリックされたであろうUIパーツにコンポーネントXYZが存在する場合は通知対象とみなす
        // そしてそのパーツが通常クリックされたときと同じコールバックを強制的に呼び出す
        component.OnButtonPressed();
    }
}
```

これで実機での操作ストレスが軽減できると思う。
Oracleで日付型データを検索する場合の指定方法

#はじめに
Oracleで日付型(DATE型)データを検索する場合の指定方法を以下記載します。

#表記法
```
where begin_time >= to_date('2016/04/23 00:00:00', 'yyyy/mm/dd hh24:mi:ss')
and begin_time <= to_date('2016/04/23 23:59:59', 'yyyy/mm/dd hh24:mi:ss');
```

#実行例
```
SQL> select begin_time, end_time, undotsn from dba_hist_undostat
  2  where begin_time >= to_date('2016/04/23 00:00:00', 'yyyy/mm/dd hh24:mi:ss')
  3  and begin_time <= to_date('2016/04/23 23:59:59', 'yyyy/mm/dd hh24:mi:ss');

BEGIN_TIME          END_TIME               UNDOTSN
------------------- ------------------- ----------
2016-04-23 09:19:38 2016-04-23 09:29:38          2
```
はじめてのElectron


なんか前にやった事あるきがするけどはじめて。

http://electron.atom.io/docs/v0.37.5/tutorial/quick-start/

をベースにはじめて見ます。

## はじめる

ディレクトリ切って、`package.json`作ってモジュールをインストール。

````
$ mkdir sample
$ cd sample
$ npm init
$ npm i electron-prebuild
````

本記事執筆時点では 0.37.5 が入ってくる模様

github のタグには1.x.x系のリリースもあるみたいだけどドウイウ…？

 
ファイル構成を下記のような形にしてそれぞれに内容をねじ込む。

````
sample/
├── package.json
├── main.js
└── index.html
````


````:main.js 
'use strict';

const electron = require('electron');
const app = electron.app;  // Module to control application life.
const BrowserWindow = electron.BrowserWindow;  // Module to create native browser window.
 
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
var mainWindow = null;

// Quit when all windows are closed.
app.on('window-all-closed', function() {
  // On OS X it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform != 'darwin') {
    app.quit();
  }
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
app.on('ready', function() {
  // Create the browser window.
  mainWindow = new BrowserWindow({width: 800, height: 600});

  // and load the index.html of the app.
  mainWindow.loadURL('file://' + __dirname + '/index.html');

  // Open the DevTools.
  mainWindow.webContents.openDevTools();

  // Emitted when the window is closed.
  mainWindow.on('closed', function() {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null;
  });
});
````

````:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using node <script>document.write(process.versions.node)</script>,
    Chrome <script>document.write(process.versions.chrome)</script>,
    and Electron <script>document.write(process.versions.electron)</script>.
  </body>
</html>
````

下記コマンドを実行して完了

````
$  ./node_modules/.bin/electron main.js 
````
RPi > GPIO+UDP(v0.4..v0.6) > フットキー入力を認識しつつUDPコマンド応答する実装

関連 http://qiita.com/7of9/items/c5e39a8c08ca7a6e5af6
関連 http://qiita.com/7of9/items/3491b41f3b18a393e2cf

## v0.4

GPIO入力値をUDP通信で返すようにした。

[v0.4 @ github](https://github.com/yasokada/python-160423_footInput/releases/tag/v0.4)


```footInputl.py
#!/usr/bin/env python

'''
v0.4 2016 Apr 24
  - add UDP_procCommand()
v0.3 2016 Apr 23
  - add UDP_recvData()
  - add UDP_setup()
  - add GPIO_setup()
v0.2 2016 Apr 23
  - define main()
  - change interval to 10 msec base for UDP comm
v0.1 2016 Apr 23
  - can check 5 GPIO input
'''

import RPi.GPIO as GPIO
import socket
import time
import os

ins = [40, 38, 36, 32, 26]
vals = range(5)

def GPIO_setup():
    GPIO.setmode(GPIO.BOARD)
    for idx in range(5):
        GPIO.setup(ins[idx], GPIO.IN, pull_up_down=GPIO.PUD_UP)

def UDP_setup():
    # incoming data string port
    datip="" # INADDR_ANY
    datport = 7002
    datsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    datsock.bind((datip, datport))
    datsock.setblocking(0)
    return datsock

def UDP_recvData(datsock, rcvdat):
    address = ""
    try:
	data,address = datsock.recvfrom(100)
    except socket.error:
	pass
    else:
	rcvdat = rcvdat + data
	return rcvdat, True, address
    return rcvdat, False, address

def UDP_procCommand(rcvdat, datsock, rcvadr):
    if "foot" not in rcvdat:
        return
    
    ret = "foot"
    for idx in range(5):
        if vals[idx]==GPIO.HIGH:
            ret = ret + ",1"
        else:
            ret = ret + ",0"
    ret = ret + "\n"            
    datsock.sendto(ret, rcvadr)
    

def main():
    GPIO_setup()
    datsock = UDP_setup()
    
    cnt=0
    rcvdat = ""

    while True:
        cnt=cnt+1
        rcvdat,rcvd,rcvadr = UDP_recvData(datsock, rcvdat)
        time.sleep(0.01)

        if rcvd == True and "\n" in rcvdat:
            UDP_procCommand(rcvdat, datsock, rcvadr)
            rcvdat = ""

        if cnt < 30: # 300msec
            continue
        cnt=0

        for idx in range(5):
            vals[idx]=GPIO.input(ins[idx])
            print vals[idx],
        print

if __name__ == '__main__':
    main()
```

## 通信プロトコル

UDP通信は以下とした

- ポート: 7002

```txt:送信者
foot<LF>
```

```txt:RPi
foot,1,0,0,1,1<LF>
```

## 実行例

RPi側で以下としておく

```txt:RPi
$ sudo python footInput.py

```

例としてMac OS X からのコマンド送信

```txt:
$ echo "foot" | nc -u 192.168.10.6 7002
foot,1,0,0,1,1
```


## code v0.6

足で踏んでからの応答性を改良するためIO取り込みのタイミングを300msecから100msecに速めた。

[v0.6 @ github](https://github.com/yasokada/python-160423_footInput/releases/tag/v0.6)
RPi > GPIO入力部分(v0.1) > フットキー入力を認識する実装

関連 http://qiita.com/7of9/items/c5e39a8c08ca7a6e5af6

RPiでGPIO入力を認識する。

[python-151205-shutdownButton](https://github.com/yasokada/python-151205-shutdownButton/blob/master/shutdownButton.py)をベースとする。

3..6のボタンを認識するコードに書換えることになる。

UDP通信も一緒に行うとした場合、上記コードのチャタリング対策(3時刻の状態使用)ではなく、数百msecインターバルでGPIOを取込むという[別のチャタリング対策](http://qiita.com/7of9/items/41ecc844c1c7b66007ae)を使うのもありかも。


## GPIO

[GPIO @ element14](https://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png?01AD=3GFAsUh02EntTskZDsqoiyvO-igbeiNsgF4zlAW69fGivD9TtfmWGAQ&01RI=D167A48D6D5050A&01NA=na)

上記のうち40, 38, 36, 32, 26あたりを使う。

## 配線

ブレッドボードで配線。

適宜、それぞれのGPIOの線をGNDラインに接続することで、スイッチ入力の代わりとする。

![DSC_0160.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/2a3c3fa6-af2e-015d-4c2c-fd56248cc755.jpeg)


## Code v0.1

[v0.1 @ github](https://github.com/yasokada/python-160423_footInput/releases/tag/v0.1)

5つのGPIOを認識するコード。
sudoをつけて実行する。

```footInput.py
#!/usr/bin/env python

'''
v0.1  2016 Arp 23
  - can check 5 GPIO input
'''

import RPi.GPIO as GPIO
import time
import os

ins = [40, 38, 36, 32, 26]
GPIO.setmode(GPIO.BOARD)
for idx in range(5):
    GPIO.setup(ins[idx], GPIO.IN, pull_up_down=GPIO.PUD_UP)

vals = range(5)

while True:
    for idx in range(5):
        vals[idx]=GPIO.input(ins[idx])
        print vals[idx],
    print

    time.sleep(1.0)
```

```txt:結果
$ sudo python footInput.py
0 1 1 0 1
0 1 0 0 1
0 1 0 0 1
0 1 0 0 1
0 1 1 0 1
0 1 1 0 1
0 1 1 0 1
0 1 1 0 1
```

GNDにつけたピンの値が1から0へ変化する。
RPi > Link > GPIO > pullup / pulldown

関連 http://qiita.com/7of9/items/c5e39a8c08ca7a6e5af6

RPiでGPIO入力を取込む場合、プルアップ、プルダウンがどうだったか。

以下の情報を見つけた。
http://d.hatena.ne.jp/hnw/20150607

あるポートはプルアップされ、あるポートはプルダウンされているようだ。
コードで変更することもできるだろうから、デフォルト状態にどれくらい頼るかは不明。

<hr>
http://qiita.com/7of9/items/8fc8cf65a3407c48daa6
の記事と整合性が取れるかどうか。
技術英語 > I have previously [alluded to] the benefit of using DMA coupled with the AXI interfaces in part 21.

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]

No.1369 / 2129

> I have previously alluded to the benefit of using DMA coupled with the AXI interfaces in part 21.

http://eow.alc.co.jp/search?q=alluded&ref=sa
> as alluded to earlier
前にも示唆［ほのめか］したように
std::is_assignable



std::is_assignableって使っている人っているのだろうか?
もし使っている人がいたとしたらちゃんと期待した通りに動いているのだろうか?

仕事で使ってみたがどうにもうまく動かなかったので、is_assignableを使うところを抜き出して、試しに書いてみた。

```cpp
#include <string>
#include <type_traits>
#include <iostream>

class A {
public:
  int a1;
};

class B : public A {};


template <typename To, typename From>
void doTest(To& to, From&& from) {
	to = from;
	std::cout << std::boolalpha << std::is_assignable<To, From>::value << std::endl;
	
}

int main() {
	{int B::* b_a1;doTest(b_a1, &B::a1);}
	{int i; doTest(i, 100L);}
	{std::string s;doTest(s, "aaa");}
//	{char* s;doTest(s, std::string("aaa"));} // コンパイルエラー
	{A* a;B b;doTest(a, &b);}
}
```

これでコンパイルは通る、つまりコメントアウトした行を除いてassignableなはずだ。
しかし`std::is_assignable<To,From>::value`の結果は…

```text
> g++-4.8 -Wall type_traits_test.cpp -std=c++11 -o type_traits_test
> ./type_traits_test
false
false
true
false
```

Visual Studio 2015でも結果は全く同じだった。他の組み合わせまでは試していないが。

```text
> cl type_traits_test.cpp
(警告とかが出てるけど関係なさそうなので省略)
> type_traits_test.exe
false
false
true
false
```

type_traitsの実装見てみるとだいたいどちらも同じような感じ。
基本的には`declval<_To>() = declval<_From>()`が通るかどうかをassignableかどうかの判断に使ってる。
まぁ俺だってそうする。いやさっきまでならそうしてた。
だって、declvalの説明には

[declval - cpprefjp C++日本語リファレンス](http://cpprefjp.github.io/reference/utility/declval.html)
> 指定された型の値を得る。
> この関数は、decltype(expr)やnoexcept(expr) といった、実際には評価されない式の内部において、特定の型を持った式を作るためのヘルパ関数である。

ってあるし。何でこれでfalseが返るんだろうってtype_traits見てたら、気付いた。
declvalのせいじゃないか。declvalもg++、VS2015共に同じような実装?で

```cpp
template<typename T> add_rvalue_reference_t<T> declval();
```

ってなってた。そう右辺値参照を追加してる。
右辺値 = 右辺値の形で代入しようとしているのでコンパイルに失敗してて
assignableじゃないって判定されてるんじゃないかと。

declvalじゃなくて左辺値参照を追加する、いわばdecllvalといったものが必要なんじゃないだろうか。
decllvalでis_assignableを書き直してみたのがこれ。

```cpp
template <typename Ty>
typename std::add_lvalue_reference<Ty>::type decllval();

template<class _To, class _From>
struct My_Is_assignable {
  template<class _Dest, class _Src>
  static auto f(int) -> decltype((void) (decllval<_Dest>() = std::declval<_Src>()), std::true_type());
  template<class _Dest, class _Src>
  static auto f(...) -> std::false_type;
  typedef decltype(f<_To, _From>(0)) type;
};

template<class _To, class _From>
struct my_is_assignable
	: My_Is_assignable<_To, _From>::type {
};
```

ベースにしたのがVS2015のソースなので似通っているのは勘弁。一応g++でも動くことは確認した。
で先の試しに書いたコードを、こちらを使うようにして実行してみたら全部trueが表示されるようになった。

declvalだけじゃなくてdecllvalもstdにあったほうがいいんじゃないかな。
[git 学習] learnGitBranchingを全クリしてこそ真の勇者だ

新人の諸君！
先輩方がgitギット言うのでもうgitの勉強は完璧だと思う。
だが、
まだここ↓に倒すべき相手が居るぞ！

＿人人人人人人人人人人＿
＞　[learnGitBranching](http://pcottle.github.io/learnGitBranching/)　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^￣

# learnGitBranching とは
- けっこう前からある
- Gitのコマンドを手を動かして学習するサイト（javascriptでできてる）
- **死ぬほどrebaseできる**
- ソース：https://github.com/pcottle/learnGitBranching

見た目
![スクリーンショット 2016-04-23 3.07.36.png](https://qiita-image-store.s3.amazonaws.com/0/42777/4834b02f-6a36-ca82-8a46-e0d97e1c9737.png)

# 追記
- ググって出てくるこれ＜http://k.swd.cc/learnGitBranching-ja/ ＞はメンテされていないのか
remoteコマンドのタブや真の勇者クエが少ないので**こっち＜http://pcottle.github.io/learnGitBranching/ ＞がおすすめ**

そもそも前者では`?NODEMO`をURLに付加してるだけなので見えてるURLと違うとこに飛びます
![スクリーンショット 2016-04-25 10.45.43.png](https://qiita-image-store.s3.amazonaws.com/0/42777/dceb8f6d-d3aa-6ddf-1a35-6ce34f751cd7.png)




それではみなさん頑張ってください
UbuntuでDvorak-Qwertyを使う (2016/12/18更新)



####環境
Ubuntu 14.04 LTS
##XKBの設定ファイル作りました

GitHubのリポジトリは一度削除したのですが、[pati-ni](https://github.com/pati-ni)さんがインストール用のスクリプトを追加した新しいリポジトリを作成してくれたので、forkしていくつかの修正を加えてあります。

![dvorak-qwerty.png](https://qiita-image-store.s3.amazonaws.com/0/67844/ba5b322b-393a-eb95-869e-b5b987666f75.png)

修飾キーなし, Shift, CapsLockではDvorak,
Control, Alt, Superを使った入力はすべてQwertyとして動作します。

Controlの時だけQwerty、AltとSuperはDvorakといったような部分的な設定はできません。

##グローバルホットキーは再設定が必要

symbolは同じアルファベットでも別のkeycodeへリダイレクトさせているためか、グローバルホットキーは再設定する必要があります。新しいレイアウトを選択後、System Settings / Keyboard / Shortcutsにて、 例えばLaunch terminalを選択してCtrl+Alt+Yを入力し、表示がCtrl+Alt+Tとなっていること、もう一度入力してターミナルが起動することを確認してください。

他のアプリケーションでは、特に新たな設定をする必要はありません。

##インストール

https://github.com/ZeptByteS/dvorak-qwerty/tree/develop

Ubuntuであれば、Downlaod ZIPからダウンロードして解凍したディレクトリからinstall.shを実行すれば、現在の設定ファイルのバックアップと新しい設定ファイルのコピーが実行されます。

`$ sudo ./install.sh`

XKBのキャッシュを削除
`$ sudo rm /var/lib/xkb/*xkm`

再起動すると、 Text Entry Settings から新しいレイアウトを選択できるようになります。

![textEntrySettings.png](https://qiita-image-store.s3.amazonaws.com/0/67844/da528c3a-b39e-45fb-5c6e-d6727296b908.png)

一応 Dvorak international や programmer Dvorak などに対応したレイアウトも作りましたが、通常はdead keyなしのDvorak-Qwerty simplifiedを選択すれば良いかと思います。

---------------------------------------

2016/12/18 追記:
(Ubuntu Gnome 16.04 LTS)
先日XKBの設定ファイルを作って遊んでいた時に新しい方法を思いつきました.  CapsLockをスイッチにしてDvorak配列とQwerty配列を入れ替える方法です. この方法では修飾キーを押した時にリダイレクトさせる必要がないため, 編集するファイルが少なくて済み, RedirectKeysを使った入力を認識してくれなかったすべてのプログラムでも動くはずです.

[More simple way to use dvorak-qwerty on Linux (Ubuntu Gnome 16.04 LTS)](https://github.com/ZeptByteS/dvorak-qwerty)