OmniAICreator/Qiita-1.07M huggingface dataset:
日本語を含んだURLのページ取得を諦めた【tumblr/random】

Hubotでランダムなページへ移動するページ(/random)へアクセス
移動後のページをパースして返す…
という機能を作ろうとした。
しかし
[robot.http] \([node-scoped-http-client])
[request]
どちらも試したが、
リダイレクト先のURLに日本語が含まれていた場合、正常に読み込みができなかった。
ステータスは400 Bad requestになるし、リダイレクト先のURLを出力してみたら文字化けていた。

日本語の部分を削ったり、URLパラメーターに変換したりしてみたが、
加工したURLから元の日本語付きURLにリダイレクトで戻されるので、堂々巡りだった。

今回は別経路からほぼ同一ページが英数字だけのURLで取得できたが、
普通のサイトでは無理だろうし、ほぼ諦め中

***

具体的にはtumblrの/random。
タイトルがURLに入るようで、日本人の場合に多い。
適当にサイトを上げると…
[よりぬきデイリーポータルZ]にします(日本語タイトルが多そうな検索トップ)

`http://dailyportalz.tumblr.com/`
なので、
`http://dailyportalz.tumblr.com/random`
にアクセスすると
ブラウザでは
`http://dailyportalz.tumblr.com/post/47437845065/niftyデイリーポータルzぬいぐるみに剃りこみを入れる`
なURLにリダイレクトされます。


[robot.http]で書くと大体以下な感じ。
[robot.http]は手動でリダイレクト先に飛ばないといけないが、
[request]なら自動で飛んでくれるように見えた。

```coffeescript

	robot.respond /daily/i, (msg) ->
		robot.http('http://dailyportalz.tumblr.com/random').get() (err, res, body)->
			unless err?
				if res.headers.location?
					robot.http(res.headers.location).get() (err, res, body)->
						unless err?
							console.log('成功')
							console.log(body)
						else
							console.log('リダイレクト後エラー')
							console.log(err)
				else
					console.log('リダイレクトなし')
					console.log(body)
			else
				onsole.log('randomエラー')
				console.log(err)

```

結果は

```html

成功
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>

```

これが英語のみの場合、
たとえば
[Cats of Tumblr]
なら
`http://catsof.tumblr.com/`
`http://catsof.tumblr.com/random`
`http://catsof.tumblr.com/post/66245080562/postmodernism-i-dont-know-why-frank-insisted`
なので、先ほどのコードからURLを書き換えると、
400ではなく通常のHTMLのbodyが取得できる。

```coffeescript:URL書き換えのみ

	robot.respond /cat/i, (msg) ->
		robot.http('http://catsof.tumblr.com/random').get() (err, res, body)->
			unless err?
				if res.headers.location?
					robot.http(res.headers.location).get() (err, res, body)->
						unless err?
							console.log('成功')
							console.log(body)
						else
							console.log('リダイレクト後エラー')
							console.log(err)
				else
					console.log('リダイレクトなし')
					console.log(body)
			else
				onsole.log('randomエラー')
				console.log(err)

```


[node-scoped-http-client]:https://github.com/technoweenie/node-scoped-http-client

[robot.http]:https://github.com/github/hubot/blob/master/docs/scripting.md#user-content-making-http-calls

[request]:https://github.com/request/request

[よりぬきデイリーポータルZ]:http://dailyportalz.tumblr.com/
[Cats of Tumblr]:http://catsof.tumblr.com/
brew install php56 で No available formula for php56 と言われる解決方法

Mac の Homebrew で PHPをインストールしようとしたらうまくいきませんでした。brew updateをしたけどだめでした。

# brew install php56で失敗

```
brew install PHP56

Error: No available formula for php56 
==> Searching formulae...
==> Searching taps...
homebrew/php/php56-amqp         homebrew/php/php56-phalcon
homebrew/php/php56-apcu         homebrew/php/php56-pimple
homebrew/php/php56-augmentedtypes   homebrew/php/php56-proctitle
homebrew/php/php56-binpack      homebrew/php/php56-propro
homebrew/php/php56-blitz        homebrew/php/php56-protobuf

略

```

インストールできません＼(^o^)／

# brew tapをする
brew tapをするといいらしいです。

```
brew tap homebrew/homebrew-php
```

# 再度 brew install
php56をインストールします。

```
brew install PHP56
```
今度は成功しました(☝ ՞ਊ ՞)

# 参考
http://stackoverflow.com/questions/32128600/homebrew-command-to-update-php-error-no-available-formula-for-php56
Jenkinsのジョブを一括コピーするシェル

Jenkinsを移行しようとしてジョブを旧環境からコピーしようとしましたが、`$JENKINS_HOME/jobs`以下をコピーするだけではうまくいかなかった[^1]ので、コピーするシェルを作ってみました。

https://gist.github.com/hishida/c9603817a911ffbdce50

※ Jenkins ver. 1.632 で動作することを確認しました。

- 引数にコピーしたいジョブを格納したディレクトリを指定します。（旧環境の`jobs`以下をコピーしてきたものなどです）
- ディレクトリ名をそのままジョブ名にしますが、コピー先のJenkinsに同名のジョブがある場合は警告を出してコピーしません。
- コピー後はジョブを無効化します。（自動実行されると困る場合もあるので）
- 変数`JENKINS_URL`はlocalhostを指定していますが、リモートのURLに変更してもできると思います（試していません）

[^1]: 以前はそれでOKだった気がするのですが・・。
JavaScriptのモジュールシステムに関するまとめ

普段はRailsのサブセットとしてのJavaScript（CoffeeScript）しか書いておらず、この手の話は浅学のため、ご指摘などコメントいただけると幸いです :bow: 

## 1. 予備知識

### Prototype

既存のオブジェクトを拡張することで機能を提供するライブラリ。
例えば`Array`や`String`、またグローバルな名前空間のうち、`Class`や`Hash`といった汎用性のある名前を利用している。
このため名前の衝突が生じやすいという問題があった。

- https://ja.wikipedia.org/wiki/Prototype_JavaScript_Framework
- http://gihyo.jp/dev/feature/01/prototype/0001

### jQuery

WebブラウザのためのJavaScriptを容易に記述できるライブラリ。
実装を`jQuery`（`$`）という名前空間に集約することで、Prototypeにおける衝突の問題を解決している。

- https://ja.wikipedia.org/wiki/JQuery
- http://d.hatena.ne.jp/kazuk_i/20110407/1302130947

### 大規模アプリケーション開発

JavaScriptにおける大規模なアプリケーション開発の場合、実装をMV*に分割する必要性が生じる。
この分割を進めると、モジュール間の依存関係が生まれる。
しかし、JavaScript単体にはこれを解決するモジュールシステムは存在しなかった。
このための解決策として、後述するCommonJSが登場する。

## 2. モジュールシステムのためのAPI仕様

### CommonJS

JavaScriptでサーバサイドを開発するために生まれた標準APIの仕様。
元々ServerJSという名前だったが、後にその他の分野にも適用可能なものになりCommonJSに改めた。

CommonJSにはファイル操作など様々なAPIの仕様が策定されているが、その中でモジュールに関するものもある。
「`module`や`exports`でモジュールを定義し、`require`で読み込みこれを利用する」といった、現在主流になっている仕様を策定している。

- http://kaihooo.com/node-js/

### AMD

Asynchronous Module Definitionの名のとおり、モジュールの非同期定義に関するAPI仕様。
当初CommonJSはブラウザ環境を考慮していなかったが、AMDはこれを考慮し、遅延読み込みに対応した。

元々はCommonJSで策定が進められていたが、後に切り離された。

- http://qiita.com/nanocitrus/items/70f1316debf05b93ac82

## API仕様の各実装

### Node.jsのrequire

CommonJSのモジュールAPIの仕様に従った実装（だった）。
現在はCommonJSの仕様の枠を超え、Node.js独自の実装も行なわれている。
CommonJSの仕様を広めるきっかけになる。

### Browserify

CommonJSのモジュールAPIの仕様に従って書かれたJavaScriptを、ブラウザ上で動作可能にしたモジュールシステム。

`require`に指定されたモジュールを、読み込むのではなく事前にビルドすることで問題を解決する。
またこの際、依存関係も同時に解決する。

### RequireJS

AMDのモジュールAPIの仕様に従った実装。
依存関係の解決は、Browserifyと異なり、ビルド時ではなく実行時に行なう。

### WebPack

RequireJSやBrowserifyよりも後発のモジュールシステム。
ビルドプロセスで依存関係を解決するが、CommonJSとAMDの両方のスタイルをサポートする。

JavaScriptだけでなく、スタイルシートや画像などのアセット全般を扱うことができ、またさまざまなオプションも設定できる。

- http://qiita.com/yosisa/items/61cfd3ede598e194813b

### ES6のモジュール

ES6ではモジュールシステムに関する仕様が策定されている。
CommonJSの仕様に近く、`export`でモジュールを定義し、`import`で読み込む。

JavaScriptの標準仕様となることから、将来的にES6のモジュールに置き換わることが予想される。

- http://uehaj.hatenablog.com/entry/2015/11/07/001848

## 3. モジュールに関する現状の実装指針

ES6のモジュールシステムを見据えつつ、BrowserifyかWebPackで目的に合った方を採用すればよい。

- http://qiita.com/mizchi/items/6b569cc75dbcc26a1f15
- http://tsuchikazu.net/javascript-module/
- http://qiita.com/megane42/items/2ab6ffd866c3f2fda066

## 4. 備考

### パッケージ管理システム

#### npm

Node Package Managerの名のとおり、Node.jsにおけるパッケージ管理ツール。
Rubyでいうところの`gem`。
Node.jsはブラウザに依存しないプラットフォームであるため、npmで公開されているパッケージもこれに準じている（ものが多い）。

ただし、npmは公式にフロントエンドのパッケージも登録することを呼びかけており、後述するbowerの利用は衰退するものと思われる。

- http://blog.npmjs.org/post/101775448305/npm-and-front-end-packaging
- https://twitter.com/mizchi/status/663982889705410560

#### bower

ブラウザ環境のためのパッケージ管理ツール。
Node.jsにおけるnpmの、ブラウザ環境バージョンのようなもの。
npmパッケージのひとつで、Twitterが開発。

- http://yosuke-furukawa.hatenablog.com/entry/2013/06/01/173308
C#でPDFを直接印刷する処理を実装する。

## Foxit J-Reader
ググってみると`Foxit J-Reader`のコマンドで印刷する方法を一番よく目にするが、`Foxit J-Reader`をインストールする必要があるのでできれば、この方法は避けたい。

## GhostScript
[GhostScript](http://www.ghostscript.com/)を使えば出来そう。  
Wikipediaによると
>Ghostscript（ゴーストスクリプト）は、PostScript や Portable Document Format (PDF) などアドビシステムズのページ記述言語用のインタプリタおよび、それを基にしたソフトウェアパッケージのことである。

とのこと。  良く分からんが、色々調べるとPDFをPNG、JPEG、TIFとかの画像ファイルに変換する機能があるらしいのでそれを利用する。

## GhostSciprtのDLLを使ってPDFを画像ファイルに変換
参考にしたのは[この記事](http://www.codeproject.com/Articles/32274/How-To-Convert-PDF-to-Image-Using-Ghostscript-API)(How To Convert PDF to Image Using Ghostscript API)。  
記事にはサンプルコードが書かれているが、サンプルコードをダウンロードできるので、ダウンロードしてそのまま流用する。

## 実装
### GhostSciptをC#から使用する為の準備
1. プロジェクトを作っておく。
1. GhostSciprtを[ダウンロード](http://ghostscript.com/download/)してインストール。
1. インストールフォルダに`gsdll32.dll`があるので、作成したプロジェクトのフォルダにコピーする。
1. プロジェクトのプロパティでビルド時にDLLが出力先フォルダにコピーされるようにビルドイベントにコマンドを記述する。こんな感じ`Copy /Y "$(SolutionDir)lib\GhostScript\gsdll32.dll" "$(TargetDir)"`

1. [参考記事](http://www.codeproject.com/Articles/32274/How-To-Convert-PDF-to-Image-Using-Ghostscript-API)からソースをダウンロード。(※[CodePeject](http://www.codeproject.com/)のアカウントが必要)
1. ダウンロードしたソースから`PDFConvert.cs`をプロジェクトフォルダ内にコピー。

### 変換と印刷処理
#### 処理の大まかな流れはこんな感じ。
1. GhostScriptでPDFを画像に変換
1. `System.Drawing.Printing.PrintDocument`オブジェクトを生成
1. `PrintDocument.Print()`メソッドで印刷
1. イベントハンドラの引数に渡されるGraphicsオブジェクトを使って`PrintDocument.PrintPage`イベント内で変換した画像を書き込む

#### サンプルコード
```csharp
//
// Convert PDF to Image.
//
var src = @"path\to\src.pdf";
var dst = @"path\to\dst.tif";
PdfConvert pc = new PdfConvert();
pc.OutputFormat = "tifflzw";  // TIFF
pc.Convert(src, dst);

//
// Create PrintDocumnt object and execute print.
//
using (var pd = new PrintDocument())
{
    pd.DocumentName = "sample";
    pd.PrintPage += new PrintPageEventHandler((s, e) =>
    {
      using (var img = Image.FromFile(dst))
      {
        e.Graphics.DrawImage(img, e.MarginBounds);
      }
      e.HasMorePages = false;
    });
    pd.Print();
}
スリープ解除/スクリーンセ―バ解除にパスワードを要求 の 開始後の時間を任意の値に変更する


スリープ解除/スクリーンセ―バ解除にパスワードを要求 の項目を見ると開始時間が

+ すぐ
+ 5秒後
+ 1分後
+ 5分後
+ 15分後
+ 1時間
+ 4時間

とすごく大雑把です．
<img src="https://qiita-image-store.s3.amazonaws.com/0/69007/1a9c488c-c97a-5e11-a609-a4bcf3b94338.png" width=600>

## 30秒ぐらいにしたい！と思ったので調べてみました．

見つけた情報
[How can I manipulate several security settings from terminal? - Ask Different](http://apple.stackexchange.com/questions/27055/how-can-i-manipulate-several-security-settings-from-terminal)


## やり方

現在の設定を確認

```
$ defaults read com.apple.screensaver
{
    askForPassword = 1;
    askForPasswordDelay = 60; // 現在の値
}
```

設定の上書き

パスワードを聞かれるまでの時間を秒で設定します．

```
$ defaults write com.apple.screensaver askForPasswordDelay 30 // 任意の値
```

反映されたか確認

```
$ defaults read com.apple.screensaver
{
    askForPassword = 1;
    askForPasswordDelay = 30; // 更新を確認
}
```
広告ブロッカーではやられるHTML

こんにちは
アップルのHTMLでRSSを使ったバナーがあります。

```html
<div id=iddwidget-root'></div><script>(function(t,e,i,d){var o=t.getElementById(i),n=t.createElement(e);o.style.height=600;o.style.width=160;o.style.display='inline-block';n.id='ibb-widget',n.setAttribute('src',('https:'===t.location.protocol?'https://':'http://')+d),n.setAttribute('width','160'),n.setAttribute('height','600'),n.setAttribute('frameborder','0'),n.setAttribute('scrolling','no'),o.appendChild(n)})(document,'iframe','ibb-widget-root',"banners.itunes.apple.com/banner.html?partnerId=&aId=&bt=genre&t=genre_matrix_black&ft=topalbums&st=music&s=34&p=11&c=jp&l=ja-JP&w=160&h=600");</script>
```

これを貼ってHTMLに展開するとitunesのランキングが表示されます。しかし、コンテンツブロッカーはこれをブロックして表示されなくなります。コンテンツブロッカーというとABPなどがあります。ちなみに、これは[ここ](https://banners.itunes.apple.com/jp/genre/jp/q3iPQunyfc/va6trZYA2C)から入手できます。これ、広告ブロッカーでも無効になります。広告ではないのに。
**なぜ?そもそも広告ブロッカーの仕組みとは**
そもそものこと、windowsのInternetExplorerの保護モードを有効になっているとパソコンのスプリクトによるコントロールを一時停止する機能があります。しかし、下に表示が出ているので無効を押すと表示されます。もちろん、その保護モードは広告はブロックされません。だって、ABPなどの広告ブロッカーをインストールしていないためです。ABPは[APPはここから](https://itunes.apple.com/jp/app/adblock-plus-abp/id1028871868?mt=8)ダウンロードできます。広告ブロッカーはこのような所があります。

1. 広告をなくしてサイトを快適に
2. 使いすぎには注意

2は意味ないけどこのようなことです。
広告を設置する中でHTMLとjavaなどがあります。そのスプリクトに広告のスプリクトがあり、広告ブロッカーがそのスプリクトをブロックすることで無効にし表示されなくなる仕組みです。そのスプリクトを設置するだけではなく設置するには広告会社からの審査が必要です。審査に合格されたサイトのみスプリクトから広告を表示されます。そんな仕組みです。で、今回のテーマの**広告ブロッカーではやられるHTML**に戻ります。で、それを確認出来たのはiPadで複数の広告ブロックアプリです。設置しすぎてこんなことになりました。まあ、広告ブロッカーでサイトの広告表示スプリクトをダウンすることでサイトも速く閲覧することもいいところです。
Google Apps ScriptでTwilioを使ってSMS送信

Google Spread SheetからSMSを使いたい！

ってことで、その方法です。

# Twilioに登録
SMSを使うために[Twilio](http://twilio.kddi-web.com/)というサービスを使います。
これは電話やSMSをAPI経由で扱えるサービスです。

http://twilio.kddi-web.com からサインアップしてください。

SMSを使うにはアメリカ(+1)の電話番号を使わないといけないみたいです。
詳細は以下を参照してください。
http://qiita.com/zaru/items/079fa96cba1081a76b10

# TwilioのサイトからSMSをテスト送信
https://jp.twilio.com/user/account/developer-tools/api-explorer/message-create のページからSMSを送信できます。

また、このページから以下の情報をメモしておきましょう。

* AccountSid
* Auth Token

# Google Apps ScriptからSMS送信

以下のコードでSMSを送信できます。


上記のTwilioのURLから得た以下の情報を適宜使ってください。

* Twilioで取得したアメリカの電話番号
* AccountSid
* Auth Token

また、電話番号は基本、+国コードから始まる形式(E.164 形式)でないと動きません。

```js:SMSManager.gs
var SMSManager = (function() {
    "use strict";
    
    var TWILIO_SMS_API_URL = "https://api.twilio.com/2010-04-01/Accounts/#{AccountSid}/Messages.json";
    function SMSManager(from, accountSid, auth_token){
        this.from = from;
        this.accountSid = accountSid;
        this.auth_token = auth_token;
        this.sms_api_url = TWILIO_SMS_API_URL.replace("#{AccountSid}", accountSid);
    }
    // 送信結果のステータスコードを返します。
    SMSManager.prototype.send = function(to, body){
        var options = {
            method: "post",
            headers: {
                Authorization: " Basic " + Utilities.base64Encode(this.accountSid + ":" + this.auth_token)
            },
            payload: {
                To: to,
                From: this.from,
                Body: body
            },
            muteHttpExceptions: true,
        };
        var response = UrlFetchApp.fetch(this.sms_api_url, options);
        var code = response.getResponseCode();
        return code;
    };
    
    return SMSManager;
})();

```

```js:main.gs
function main(){
    var from = "+100000000"; //Twilioで取得したアメリカの電話番号
    var accountSid = "YOUR_ACCOUNT_SID";
    var auth_token = "YOUR_AUTH_TOKEN";
    var sms = new SMSManager(from, accountSid, auth_token);

    var phone_number = "+819011111111"; // 090XXXX形式ではダメで+8109XXXX形式(E.164 形式)にする
    var message = "こんにちゎ";
    // 送信結果のステータスコードが返ります。
    var code = sms.send(phone_number, message);
    
    // 送信成功時には201が返るみたいです。
    if (code == 200 || code == 201){
       Logger.log("送信成功");
    } else {
       Logger.log("送信失敗");
    }
}
```

# 価格

TwilioのSMSの利用料は以下サイトに載っています。
http://twilio.kddi-web.com/price/

ドコモ宛だと１回10円ぐらいかかっちゃうので、ミスってfor文, while文でまわしちゃうとえげつないので注意してください。
Neo4j 説明会いったよう


http://jp-neo4j-usersgroup.connpass.com/event/21579/

## ユーザーグループから

- 2.3出たよ
- Graph Connect 2016 Europeをやるよ

## グローバルでの導入事例

Neo4j 開発 Jim Webber 来日！

neo4jの人は日本に関心あるらしい

### Overview

- 金融関係の紹介
- つまんない業界にどうやってNeo4jが入っていったのか
- 5つのアプリについて
	- First-Party Fraud 金融の不正行為
	- 自動車保険の不正行為
	- 決済・ID関係
	- なんか
	- ガバナンス

### First-Party Fraud

FirstParty 犯罪者当人がアカウント作って普通につかって不正行為をする。
クレジットカードの上限額をドンドン上げたりする。
これが組織化してきて問題になっている。

ヤバイ。
犯罪としては規模が多くてすごい。

Fraud Ring

問題なのは実際に存在する住所とかだから銀行からは普通の人にしか見えない。
段々段々おかしな感じになっていく。
あるとき一気にやって消えていく。

そんな手口。

住所使われた本人はなりすましに使われてて本人確認できない。
／(^o^)＼ﾅﾝﾃｺｯﾀｲ

今までの不正検知は二次元的なもので、ノーマルレンジから飛び出たものを止めるとかそういうことしかできなかった。
画一的な検知じゃあかん。

これを検知するには、もっと深い味方をする必要があって、これを可能にするのがグラフDBだ。

Cypherクエリでリスキーな人を見つける例

### Whiplash for Cash

交通事故を利用した犯罪の検知に使ってる

### 決済系

CookieとかIPから判断してる。
Estyの例。
フィッシングされてる可能性があったりする。

パターンを見てやる。

### マスタデータの管理

- Adidas
	- 色んなデータベースを一つのグラフDBに統合して使った事例
- ICE

グラフの大きな特徴は三角関係

### ガバナンス

## Graph Connect 2015 報告会

性能がリニアに上がっていく。
ノードが増えてもまんま上がる。

データを管理することだけではなく、データとデータの関係を見るために使える。
何かが見える、何かに使える。

オンライン企業でもすげーグラフDB使ってる。
- Google
- Linked in
- Paypal

↓

レガシー企業にも広がってる
- Walmart
- シスコ

### Neo4jユースケース

- リアルタイムレコメンデーション
	- 導入案件多い。
	- RDBでやるとJOINの嵐
	- 今までのものだとリアルタイム性が非常に低い
- マスタデータ管理(MDM)
	- 色んなものの管理
- 不正検知
- グラフ検索
- ネットワーク・ITT運用管理
- IDアクセス管理
	- トラッキング

### Neo4jスタートアッププログラム

小さいところだとNeo4j Enterpriseめっちゃ安く提供してる

### Neo4j 2.3リリース

- 高速化
- クラスタの性能限界に挑戦

Dockerオフィシャルイメージ！

### 3.0の機能

- 統一した言語ドライバを出す。
	- 2.xだと色んな選択肢があった。
	- それぞれで表記方法に違いがあった
	- 3.0で統一する
- Open Cypher
	- Spark
	- Oracle

### これからは

今まではデータの時代。
これからはデータのつながりの時代。

概念的にどう違うのかを理解することが大事。
今まであるものは重視しつつ新しいものは取り入れる。

「つなげること」
Rails環境でのhighstock利用

#Rails環境でのhighstock利用

以下のサイトを参考に[highstock](http://www.highcharts.com/products/highstock)をRailsの環境に適用しようとしたときにハマった話。

http://suzumenote.com/tech/46

/app/assets/javascriptsにhighstockt.js,chart.jsを配置して、
application.jsに

```<%= javascript_include_tag "application" %>```

と記載して、アセットパイプラインを利用して、highstock.jsを呼び出すと、以下のjavascriptエラーとなります。

*Uncaught TypeError: $(...).highcharts is not a function*

生成されたソースコードを確認しても、問題なくjavascriptファイルは読み込まれいるようですが、
なぜかhighstockが見つからないと。。。

ちなみに、アセットパイプラインを使わずにscriptタグでjsファイルを指定してやると、エラーなく利用可能です。

##解決方法
アセットパイプラインを使ってhighstockを利用する場合は、以下を参考にchart生成すると利用できました。

http://stackoverflow.com/questions/32011248/highcharts-uncaught-typeerror-highcharts-is-not-a-function


具体的にはchart生成の記述を
***
```rb:chart.js
		// create the chart
		$('#container').
		highcharts('StockChart', {
			credits : {// 右下のクレジット
				enabled : false
			},
			・
			・
			・
```

を

```rb:chart.js
		// create the chart
		window.chart = new Highcharts.StockChart({
			chart : {
				renderTo : $('#container')[0]
			},
			credits : {// 右下のクレジット
				enabled : false
			},
			・
			・
			・
```

とrenderToをつけて呼び出せばOKです。

これでアセットパイプラインを利用して、問題なく、highstockが利用できました。


しかし、なぜアセットパイプラインを利用すると、jsの読み込みの挙動が変わるのか。。。これはよく理解できてないです。
もしわかる方いたら教えてください。
TorqueL(トルクル) Windows版における入力デバイス検知の実装について


> 本記事の内容を[はてなブログ](https://nanmo.hateblo.jp/entry/2015/11/10/000000)に転記しました。
> すぐにQiitaの記事を削除する予定はありませんが、どちらか一方だけ残すとなったらはてなブログの方を残すと思います。
> ご承知おき下さい。

[TorqueL](http://TorqueL.net)のWindows版では入力デバイスがキーボードがゲームパッド(ジョイスティック)かで一部の画面表示を動的に切り替える仕組みを入れています。
この記事は「入力デバイスをどのように検知しているか」の説明です。

![torquel_detectinputdevice.gif](https://qiita-image-store.s3.amazonaws.com/0/37548/ef1a8430-7361-c772-859b-e68239f13c5d.gif)


## まとめ

Unity 4.3のInputManager経由の入力は使わず、publicのenumでデバイスを仮想的に定義(InputDevice)し、KeyCodeから判断するように実装しています。
(※軸/Axis系はInputManger経由でしか取れなかったのでそのまま)

以下、仮想コード

```lang
public class hogeinput : MonoBehaviour {
	public enum InputDevice {None, Keyboard, Mouse, Joystick, Unknown};
	public static InputDevice LastInputDevice { get{return lastInputDevice;} }
	static void detectInputDevice( KeyCode kc) {
		int keycode = (int)kc;
		if ( keycode == 0 ) {
			//None
			lastInputDevice = InputDevice.None;
		}
		else if ( keycode >= 8 && keycode <= 319 ) {
			//Keyboard (8=Backspace, 319=Menu)
			lastInputDevice = InputDevice.Keyboard;
		}
		else if ( keycode >= 323 && keycode <= 329 ) {
			//Mouse Button 0-6
			lastInputDevice = InputDevice.Mouse;
		}
		else if ( keycode >= 330 && keycode <= 429 ) {
			//Joystick Button
			//ex:joystick 330-349, joystick1 350-369, joystick2 370-389, joystick3 390-409, joystick4 410-429
			lastInputDevice = InputDevice.Joystick;
		}
		else {
			//Unknown
			lastInputDevice = InputDevice.Unknown;
		}
	}
}
```

キーコードの詳細は [http://docs.unity3d.com/jp/current/ScriptReference/KeyCode.html](http://docs.unity3d.com/jp/current/ScriptReference/KeyCode.html) を参照のこと。

製品で動いてる実装では同じクラス内に独自実装したボタン割り当てとボタン入力受付関数からdetectInputDevideを毎回呼ぶようにして、Updateで入力デバイスをチェックしつつもうひとつ前のlastInputDeviceを保持する変数を用意して入力デバイスが切り替わったことが検知できるようにしていたりします。
(ボタンの割当周りの実装については別記事予定)

上の実装だとキーボードかゲームパッドかぐらいしか検知していませんので、例えば「360のパッドと[DUALSHOCK4](http://qiita.com/nanmo/items/559a58f76dda82323283)で自動的に分けられるようにしたい」という時は[Input.GetJoystickNames()](http://docs.unity3d.com/ScriptReference/Input.GetJoystickNames.html)で入力のあったジョイスティックのデバイス名(デバイスとプリンターで表示されてる名前)をチェックするようにするといいんじゃないかと思います(ただあまり現実的じゃないかも)
python > 関数 > 定義 / 引数 / 戻り値

pythonでの関数の勉強

定義の仕方、引数、戻り値を使ってみる。

参考
http://www.isl.ne.jp/pcsp/python/python24.html

以下の実装をした。

http://ideone.com/DLVT3W

```test.py
def main():
	print "hello"
	val = addfunc(3,1)
	print val


def addfunc(arg1, arg2):
	return arg1 + arg2
	
if __name__ == '__main__':
	main()
	
```

```txt:結果
hello
4
```
ideone > contact > faq > How can I get in touch with you?

ideone.comにてpythonを選択してもテンプレートのコードがpythonのものにならない。

気にせずpythonコードを入力して実行すれば一応実行できるが( http://ideone.com/RvKIlG )、他のコードと対称性が悪い。

ideoneに連絡しようと思ったが、連絡先を見つけるのに時間をとられた。

http://ideone.com/faq
の最後
> How can I get in touch with you?

に連絡先が記載されている。 
contact あっと ideone.com (2015年11月10日現在)

<hr>
(追記)

pythonのテンプレートコードがない件については、先ほどideoneから連絡があり、「まだすべての言語のテンプレートをデータベースに用意していない。逐次用意する」という回答だった。
技術英語 > its mission was extended long [beyond its intended purpose]. / five seconds behind schedule 

5年後には消えてるかもしれないCNNの記事
http://money.cnn.com/2015/10/27/technology/voyager-nasa/

> The primary mission of Voyager was to explore Jupiter and Saturn, but <font color=red>its mission was extended long beyond its intended purpose.</font>

いい意味でプロジェクトが延長される例。

どこかで聞いた「いいものというのは誰かが引き継いでくれる。真似してくれる。」というのを思い出した。

<hr>
関連して思い出したのは

intended -> scheduled -> scheduleに遅れが -> 

> We'<font color=red>re five seconds behind schedule</font>.

Voyagerのエピソードに出てきた。
時間にシビアなミッションの訓練中のJanewayの言葉。

<hr>
関連して思いつくのは

intended -> intention (意図)

ソースコメントやgitのコミットメッセージにはintentionを書くのがやはりよさそう。
ズルをして、「とても長い配列の上位M件だけをクイックソートより高速に取り出す」



[とても長い配列の上位M件だけをクイックソートより高速に取り出す](http://qiita.com/kikurage/items/948c9e2c730c47c2c4c1)の計測用コードを見て、ズルをしたら微妙に早くなるんじゃないかと思って試したら３倍くらい早くなりました。

なお、ズルなので実用的ではありません。



# 計測結果

60回平均で３倍速。

```txt
test: 1
test: 2
...
test: 59
test: 60
QuickTopSort: 18.2989166666521ms
   CheatSort: 5.20891666669243ms
```


# ズルの内容

入力データが一様分布であることから上位M件とそれ以外の下位を分離する値を大まかに予想し、最初のピポッドに使っています。


# 実装

元の[quickTopSort](https://gist.github.com/Kiikurage/c05059274fdd54048dc3?ts=4)のコードをコピペして次のように変えました。

修正済：~~なお、元のコードの `if (from + 1 >= to) return;` は `if (from >= to) return;` が正しいのではないかと思われます（`quickSort([2,1])`を実行してみる限り）。~~

```js
function cheatSort(arr, M, p) {
  arr = arr.slice(0);
  cheatSortCore(arr, M, p);
  return arr;
}

function cheatSortCore(arr, M, p) {
  var i = 0,
      j = arr.length - 1,
      tmp;

  if (arr.length < 2) return arr;

  while (true) {
    while (arr[i] <  p && i <= j) i++;
    while (arr[j] >= p && i <= j) j--;

    if (i >= j) {break;}
    else {
      tmp = arr[i];
      arr[i] = arr[j];
      arr[j] = tmp;
    }
  }

  quickTopSortCore(arr, M, 0, i - 1);
  if (i - 1 < M) quickTopSortCore(arr, M, i, arr.length - 1);
}

function test3() {
  var a = 0,
      b = 1e9,
      p = 2 * M * (b - a) / N + a;
  res3 = cheatSort(arr, M, p);
}
```
TCP通信でPCからLED(on Arduino)の点滅を制御する

#　はじめに
メディアアート製作のために、複数ArduinoをLANにつないで通信制御をするシステムを組んでいる。

前回は[こんな感じ](http://qiita.com/UT-HACKs/items/c617d887f7c8152b1a21)でArduinoのイーサネット通信を試した。
物理的な接続を確認できたので、今回は実際にLEDの点滅を試してみたい。

本当はTCPよりUDPを使いたいのだけれど、それはまた次回。

将来的にはtelnetではなく、Max/mspからの一括制御を目指します。

# 用意したもの

- Arduino
- 純正イーサネットシールド２
- 無線ルータ＆LANケーブル

接続は[前回の記事](http://qiita.com/UT-HACKs/items/c617d887f7c8152b1a21)を参照のこと。

本記事ではmacからtelnetコマンドを利用した制御を試みる。

# 手順

1. Arduino上に文末のサンプルコードを参考にWebサーバを立てる。(前回記事参照)
2. telnet <host> <port>でArduinoにアクセス
3. 1/0を送信することで、LEDのオンオフを制御
4. 1/0以外の文字を送信することでコネクションを切断

#ポイント

### **利用出来るピンについて**
イーサネットシールド（旧版）はデジタルpinの11-13を利用しているらしく、digitalWriteの制御対象としては使えない。よって9番ピンをターゲットとして9番ピンとGNDにLEDを設置して動かした。

### **複数アクセスと擬似マルチスレッド処理**
複数PCから１つのArduinoのLEDを同時制御することは（現在の我々の技術力では）できない。クライアントの接続フラグが立っている間whileを回すため、新規の接続は基本的に無視されるコーディングになっている。（文末コードを参照）
Arduino上でマルチスレッド処理するには、たとえば[こちらの記事](http://d.hatena.ne.jp/LaclefYoshi/20110129/1296310627)なんかが参考になるかもしれない。



# 参考：TCPの1/0でLEDの点滅を制御するサンプルコード
サンプルコードのうちEthernet2のWebServerを改変して用いた。
※古いEthernetライブラリではなくではなく**Ethernet2を利用する必要がある**ので注意

```lang:WebServer-uthacks.ino

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c=='1')
          digitalWrite(9,HIGH);
        else if (c=='0')
          digitalWrite(9, LOW);
        else if (c=='\n' || c=='\r')
          continue;
        else
          break;
        
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

```

# これから
[ここのページ](http://r-dimension.xsrv.jp/classes_j/category/%E3%83%95%E3%82%A3%E3%82%B8%E3%82%AB%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/)にMax/mspでTCP・UDP通信をするときの具体事例が上がっていたので参考にしたい。
Arduino イーサネットシールド２を使ってみた。



# はじめに
大規模なメディアアート作品を製作するにあたって、複数のArduinoを広い空間に散らばらせて配置することになりました。
空間的に広がって配置された１台の制御PCと複数のArduinoを有線で接続する方法についてまとめます。

紹介するイーサネットシールドは2015年5月の発売ということもあってまだ情報が少ないので、旧版の情報も合わせながらまとめていきます。


## どうしてUSBケーブルじゃいけないの？？
はじめは単純にUSB延長ケーブルを利用しようと考えたのですが、比較的高価な上にUSBは規格上5mまでしか通信ができないと決まっているようです。
通信ができたとしても電圧降下がおきてシリアル通信が読み落とされる可能性を考慮して、USBは利用できないと考えました。

それに比べるとLANケーブルは元から数十mでの取り回しができる上に比較的安価なので今回の用途には向いています。

また、現地での電波環境が読めないことと、デバッグのやりやすさを考慮して無線での接続ではなく有線での接続を決めました。



# 用意したもの


- 無線ルーター (IOデータの。家に余ってたやつ。)
- LANケーブル（種類はなんでもいい）


某社面白系エンジニアの方からオススメされた[このイーサネットシールド](https://www.switch-science.com/catalog/2270/)（スイッチサイエンス社ページから購入可能。3k円）を利用しました。

イーサネットシールドはArduinoの上にかぶせて使います。
裏面にはMACアドレスの描かれたシールが貼られているので、うっかり剥がさないように注意！！

![S__80633863.jpg](https://qiita-image-store.s3.amazonaws.com/0/96806/bf65317b-4007-7f0d-0e99-adaa75792f41.jpeg)


# 手順
基本的には参考ページ準拠。


1. 物理的な接続①Arduino-PCと②イーサネットシールド-ケーブル-ルーター-PCを確認
2. サンプルスケッチ**Ethernet2の**WebServerのMACとIPを環境に合わせて書き換える。（文末参照）
3. Arduinoにアップロード
4. ブラウザからArduinoに与えたIPアドレスにアクセス
5. 成功していれば下のように、Arduinoのanalogピン出力が見えるはず。

 <img width="1437" alt="スクリーンショット 2015-11-10 06.32.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/96806/fc6d89dc-f03a-0f05-9949-f9c67d1e66ca.png">







#参考にしたページ
[やっと解決！Arduino Ethernet Shield2（シールド２）通信！](https://www.mgo-tec.com/blog-entry-11.html)は比較的最近の記事で、使うべきライブラリがEthernet2という新しいバージョンであることを教えてくれた命の恩人である。

[第6回 Arduinoを使ってWebサーバーをつくろう！](http://deviceplus.jp/hobby/entry_006/)
この製品の一つ前の方を使っているけれども、手順は大まかに同じなので参考になる。

Arduinoを1.77に変更。
java Version 8 Update 65をダウンロード。

・**《4のプログラムを書き換える》において、引っかかった点**
MACアドレスとIPアドレスは手で与える必要がある。
MACはシールドに記載されたものを直接書き込めば良い。
IPアドレスは自由に決めて良いが、**ルーターの割り当てIPの範囲を超えないように**注意する必要がある。
たとえば、私たちの環境では192.168.0.2から192.168.0.32まで利用可能IPだった。
Nexus 5X におけるカメラ画像上下反転問題についての対応


Nexus 5Xでカメラ撮影を行うと、アプリによってはpreviewまたは撮影した画像が反転するという不具合があります。その問題についてGoogleのAndroid Camera frameworkのTech Leadから声明(リンク下部)があり、どうやら結論がでたようです。

#結論
デバイスの仕様によるもので、アプリ側で対応する必要があります。

#何が問題なのか
camera API(deprecated)では明示的にカメラの回転情報を設定する必要がありますが、回転情報を設定していないカメラアプリもあります。それでも問題が発生しなかったのは、多くのAndroid端末ではイメージセンサーが回転を意識せずに済む方向(イメージセンサーの取り付け方は2通りあるようです)に取り付けられていたからのようです。
しかし、Nexus 5Xのイメージセンサーは設計上の制約で **他の多くのAndroid端末と異なり逆(reverse landscape)に取り付けられています。** そのため、rotationが設定されていないアプリはpreviewが反転するようになってしまいました。camera2 APIでは内部的に正しい画面回転情報を取得しているため、この問題は発生しません。なお、この現象は同じようにreverse landscapeで設計されているNexus 6のフロントカメラでも再現するようです。(手元のNexus 6では確認できませんでしたが...)

#じゃあどうすればよいのか
以下の2通りの対応が考えられます。  
**(1) camera2 APIに移行する**  
camera2 APIに移行すれば、この問題は解決するとのことです。(*)
  
**(2) setDisplayOrientationを設定する**  
[setDisplayOrientation](http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)) を設定してあげれば解決します。

```
public static void setCameraDisplayOrientation(Activity activity,
         int cameraId, android.hardware.Camera camera) {
     android.hardware.Camera.CameraInfo info =
             new android.hardware.Camera.CameraInfo();
     android.hardware.Camera.getCameraInfo(cameraId, info);
     int rotation = activity.getWindowManager().getDefaultDisplay()
             .getRotation();
     int degrees = 0;
     switch (rotation) {
         case Surface.ROTATION_0: degrees = 0; break;
         case Surface.ROTATION_90: degrees = 90; break;
         case Surface.ROTATION_180: degrees = 180; break;
         case Surface.ROTATION_270: degrees = 270; break;
     }

     int result;
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
         result = (info.orientation + degrees) % 360;
         result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360;
     }
     camera.setDisplayOrientation(result);
 }
```

camera2 APIはAPI Level 21からなので、(1)の対応を進めつつ、後方のversionは(今のところ反転するメジャーな端末はなさそうですが) (2)を設定して対応する必要がありそうです。

ソース：
 
```
https://www.reddit.com/r/Android/comments/3rjbo8/nexus5x_marshmallow_camera_problem/cwqzqgh  
(なぜかリンクが投稿禁止で貼れなかったのでソースコード形式で)
```
(*)撮影後の画像が反転する問題もあるので、そこの対応も必要そうです。
Ansible実行環境でserverspecを実行するためRuby実行環境を構築する

[Ansible実行環境でserverspecを実行するための実行端末設定](http://qiita.com/CsFactoryitter/items/40dea7e8ff45b501ffda)に引き続きAnsible実行端末の設定。
今回はRuby実行環境の構築について記述します。

#前提条件
rootユーザで実行

#Ruby実行環境構築手順
####1.gitとgccのインストール
```bash:
$ yum install -y gcc git openssl-devel readline-devel zlib-devel
```
####2.rbenvをgithubよりgit clone
※rbenvでRubyの指定バージョンでのインストールや切替を行う

```bash:
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```
rootの$HOMEに.rbenvが作成されることを確認

```bash:
$ ls -la
/root/.rbenv
```

####3.rbenvの環境変数を設定

```bash:
$ vi /etc/profile.d/init.sh
```

以下を記述する

```bash:/etc/profile.d/init.sh
export RBENV_HOME=\$HOME/.rbenv
export PATH=\${RBENV_HOME}/bin:\${PATH}
eval "$(rbenv init -)"
```
保存後環境変数を適用

```bash:
$ . /etc/profile.d/init.sh
```

####4.rbenvが使用可能か確認

```bash:
$ rbenv --version
```

以下のように現在のバージョンが出力される（バージョンは違う可能性あり)

```bash:
rbenv 0.4.0-183-gc18a3f9
```
####5.ruby-buildをgithubよりgit clone

```bash:
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

####6.インストール可能なRubyバージョンを確認
rbenvを使用してインストール可能なバージョンの一覧を表示する

```bash:
$ rbenv install --list | less
  2.1.2
  2.1.3
  2.1.4
  2.1.5
  2.1.6
  2.1.7
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview2
  2.2.0-rc1
　# 以下略... 
```

####7.Rubyをインストール
今回はRuby2.1.7をインストールする
「Installed」が出たらOK

```bash:
$ rbenv install -v 2.1.7

installing extension headers: /root/.rbenv/versions/2.1.7/include/ruby-2.1.0/ruby
installing default gems:      /root/.rbenv/versions/2.1.7/lib/ruby/gems/2.1.0 (build_info, cache, doc, extensions, gems, specifications)
                              bigdecimal 1.2.4
                              io-console 0.4.3
                              json 1.8.1
                              minitest 4.7.5
                              psych 2.0.5
                              rake 10.1.0
                              rdoc 4.1.0
                              test-unit 2.1.7.0
installing rdoc:              /root/.rbenv/versions/2.1.7/share/ri/2.1.0/system
installing capi-docs:         /root/.rbenv/versions/2.1.7/share/doc/ruby

Installed ruby-2.1.7 to /root/.rbenv/versions/2.1.7
```

####8.rbenv再読み込み

```bash:
$ rbenv rehash
```

####9.Rubyのバージョンを指定
複数のバージョンをインストールした場合はrehashした後バージョンを指定する

```bash:
$ rbenv global 2.1.7
```

####10.現在のRubyバージョンを確認
9.で指定したバージョンになっていることを確認する

```bash:
$ ruby --version
```

次回は、「[Ansible実行環境でserverspecを実行するための設定～serverspecインストール](http://qiita.com/CsFactoryitter/items/09b76ec46b17255f75dd#_reference-c879a1cf43ce6caeb684)」について
【初心者】インフラの知識をつないでみる

## はじめに
ずっと食わず嫌いだったインフラ関連のお話。
「難しそう」「ハードウェアか」みたいに思ってて、なかなか勉強にとりかかることもなくここまできてしまいました。
感覚的にざっくりどんな感じかはわかっているけど、何がどういう働きをしているのか、それぞれの専門用語をちょっとは調べたけど全部がつながっていない状態。

でも、一人だけチームの話についていけてない感満載だし、サーバどうとかいう話は完全には理解しきれなくて。。ただの悔しさから1冊の本を買ってみたので、その一部をまとめます。

## クラウドサービスのIaaSとPaaSの違い
ネットワークの階層構造を利用して、特定階層までをパッケージングして提供しているのがクラウドサービス。

IaaS(Internet as a Service)：サーバやネットワークなどインフラ部分をインターネット経由で利用できる
PaaS(Platform as a Service)：インフラ部分はあまり意識せずに用意された【開発環境】環境をインターネット経由で利用できる

なので、AWS(EC2)などはIaaS、HerokuなどはPaaS。
※1つの会社が両方用意する傾向あり

## ファイアウォールってなんだっけ
ファイアウォールはネットワーク内でのセキュリティに使われる。
中から外、外から中への通信内容を制御し、意図しない通信が発生しないように接続要求を遮断することで、ネットワークのセキュリティが向上する。

## 「ACID」という考え方
インフラの性能を向上するときに必要な考え方(意識)らしい。
- 原子性(Atomicity)：これがないと2つで1つの処理が片方実行されない状態が発生し、処理が中途半端になる
- 一貫性(Consistency)：これがないと、操作の途中に状態が見えるようになってしまう
- 独立性(Isolation)：これがないと一連の処理として順番に行いたいものが実行されず、処理途中で見えてしまう
- 永続性(Durability)：これがないと処理が完了したのにデータが保存されていない事態が起こる

## よく聞く「マスター」と「スレーブ」という言葉
システムの冗長化をする仕組みの中で出てくる

```
冗長化とは
システムの一部に何らかの障害が発生した場合に備えて、障害発生後でもシステム全体の機能を維持し続けられるように予備装置を平常時からバックアップとして配置し運用しておくこと。
```
by [Wikipedia](https://ja.wikipedia.org/wiki/%E5%86%97%E9%95%B7%E5%8C%96)

そのデータの整合性をとるための方法として「Shared Nothing方式」がある。
この方式の場合、ストレージ間で通信してデータの整合性を取っている。これを「レプリケーション」と呼び、データの送信元を「マスター」、データの受信元を「スレーブ」と呼ぶ。

マルチ・マスター(Multi-Master)という相互にマスターとスレーブの役割を持たせるやり方もあるが、トラブルが多くなりがちなので、あまり使わない。

## 負荷分散(ロードバランシング)とは
ロードバランシングの方法は2種類あり、
- ロードバランサというサーバ側の仕組み
- DNSラウンドロビンというクライアント側の仕組み
※基本的にはロードバランサを利用しながら、適宜DNSラウンドロビンを併用する

DNSラウンドロビンの仕組みは、同じURLに2つのIPアドレスを設定しておくことで、ランダムに振り分けられるので、負荷の軽減になると考えられたもの。

### ロードバランサのメリット・デメリット
メリットは確実に意図通りに分散できること。
デメリットはボトルネックにならないよう、冗長化も考える必要がある

### DNSラウンドロビンのメリット・デメリット
メリットは設備はいらないのでボトルネックにはなりません。
デメリットは切り替えがうまくいくわけではない。


## 実際にやってみる
Google Cloud Platformでやってみたけど、実力不足で全然前に進まず。。。
AWSの方が簡単らしいので、やり方変えてみる。
KotlinのGeneric型としてNotNullな型を宣言する


Kotlinで

```kotlin
fun <T> nullable(): T?{
  return "something" as? T
}
```

などと実装すると、
`'T'has a nullable upper bound. This means that a value of this type may be null. Using 'T?' is likely to mislead the reader`というwarningが出てきます。つまり、この型パラメータの`T`はすでにnullableな型の制約上にあるので、`T?`という書き方は読み手に誤解を与えるよ、ということです。

従ってこの`T`をそもそもNotNullな型として指定するには

```kotlin
fun <T:Any> nullable(): T? {
  return "something" as? T
}
```

というようにNotNullな`Any`型を制約としてつけてあげる必要があります。
Sppinerのテキストを右寄せにしたい Android

AndroidのSpinnerのテキストを右寄せにしたがったが、うまくいかなかった。
gravityをRight
TextAlignmentをgravity
としたらできそうだがならない。

なんでじゃ！と思い、調べると以下のサイトを発見。
http://nevescheng.blogspot.jp/2013/05/spinner-with-item-text-aligned-to-center.html

どうも中のTextViewに対してgravityをセットしなくちゃいけないみたい。

というわけで、以下のようなコードに変更。

```
ArrayAdapter<String> adapter = new ArrayAdapter<String>( spinner.getContext(), android.R.layout.simple_spinner_item){

    // テキストの位置
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);
        ((TextView) v).setGravity(Gravity.RIGHT);
             return v;
     }

        // 選択肢の位置
     public View getDropDownView(int position, View convertView, ViewGroup parent) {
         View v = super.getDropDownView(position, convertView,parent);
         ((TextView) v).setGravity(Gravity.CENTER);
         return v;
     }
};
```

これで、Spinnerのテキストの右寄せできました。

やったね！！
Error response from daemon: client is newer than server (client API version: 1.21, server API version: 1.20)

ローカルのDockerMachine環境で

```bash

kohey% docker ps                                           
Error response from daemon: client is newer than server (client API version: 1.21, server API version: 1.20)
```

になった場合

* ローカルのdocker version

```bash

kohey% docker version                                       
Client:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.5.1
 Git commit:   76d6bc9
 Built:        Tue Nov  3 21:17:46 UTC 2015
 OS/Arch:      darwin/amd64
```


* docker-machine上のdocker version

```
kohey% docker-machine ssh dev                               
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@dev:~$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      linux/amd64
```

どうやら、ローカルのdockerのバージョンと`docker-machine`上のdockerのバージョンが違うみたい。

以下で解決:ok_woman:


```bash

$ docker-machine upgrade dev
```

これで両者ともにdockerのversionが`1.9.0`になった
Hubのbrowseコマンドで、ターミナルからgithubのページをブラウザで開く

　Hub([github/hub](https://github.com/github/hub))はgithubをより使いやすくなるようにgitをラップしたコマンドラインツールです。このHubの`browse`というコマンドを使うことで、ターミナルから対象のローカルリポジトリのgithubのページを開くことが可能です。ブラウザ開いて検索窓に入力して〜という時間を短縮することが可能です。


　インストールはHomebrewで簡単にできます。Hubの[githubのページ](https://github.com/github/hub#installation)を参照することをお勧めします。[エイリアスを設定方法](https://github.com/github/hub#aliasing)や、[タブ補完の設定方法](https://github.com/github/hub#shell-tab-completion)も簡潔に示されています。

　開きたいローカルリポジトリにいるときに、下記のコマンドによりターミナルから、ブラウザで対象リポジトリのgithubページを開くことができます。

```shell-session:
git browse
```

　また、引数に`アカウント名/リポジトリ名`を渡すことで対象のリポジトリを開くことができます。

```shell-session:
git browse RyotaMurohoshi/UniLinq
```


　hubには他にも便利なコマンドがたくさんあるようです。下記のページが参考になります。

* [GitHubユーザーのためのhubコマンド](http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3)
* [hub コマンドチートシート](http://qiita.com/kasaharu/items/0dd35cf59e37f6e6b433)
* [hubコマンドはとても便利です](http://qiita.com/radioboo/items/6c0965d0a4fd5dedfa0b)
Eloquentモデルを取得する際に関連するモデルを紐付ける


シングルページアプリケーションを作成していて、一気に関連するデータを取ってきたい場面がありました。


# 遅延ロード
Eloquentリレーションをプロパティーとしてアクセスする場合、リレーションのデータは「遅延ロード」されます。
つまりプロパティーにアクセスしてはじめて、リレーションのデータがロードされます。

# Eagerローディング
Eloquentではモデルを取得した時点でリレーションをロードするようにできる、「Eagerローディング」という機能があります。

$withプロパティをオーバーライドします。

```php:User.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{

    protected $with = ['books'];

    public function books()
    {
        return $this->hasMany(Book::class);
    }
}
```

全てのUserを取得します。

```php
App\User::all();
// Userに関連するBookが既に紐付いた状態でUserを取得できる
```

#参考

- [Eloquent：リレーション 5.1 Laravel](http://readouble.com/laravel/5/1/ja/eloquent-relationships.html"Eloquent：リレーション 5.1 Laravel")
- [Eager loading all relationships](https://laracasts.com/discuss/channels/eloquent/eager-loading-all-relationships?page=0 "Eager loading all relationships")
JUnitでprivate/protectedメソッドにアクセスするメモ


JUnitに限った話では無いですが、外部からリフレクションを使ってprivateメソッドにアクセスするメモです。

> ※ソースコードはJUnit4の例です。

# privateメソッドにアクセス
## テスト対象
まず、適当にテスト対象のクラスを作ってみます。

```java
package dammy;

public class Main {
    //プライベートフィールド
	private String name;

    //初期化
	Main(){
		name = "プライベート";
	}
    //プライベートメソッド
	private int privateMethod(int in){
		return in * 2;
	}
    //プロテクテッド
	protected int protectedMethod(int in){
		return in * 3;
	}
    //パブリック
	public int publicMethod(int in){
		return in * 4;
	}
}
```

処理としては何も意味なしなので気にしないでください。

## リフレクションでアクセス

```java
public class MainTest {
	private Main obj;

	@Before
	public void setUp() throws Exception {
		obj = new Main();
	}

	@After
	public void tearDown() throws Exception {
		obj = null;
	}

    //日本語でメソッド名書くとわかりやすい
	@Test
	public void プライベート変数を参照() throws Exception{
        //名前を指定して取得
		Field field = Main.class.getDeclaredField("name");
        //アクセス権限を与える
		field.setAccessible(true);
        //指定のインスタンス内のfieldを取得
		assertEquals("プライベート", (String)field.get(obj));
	}

	@Test
	public void プライベートメソッドを実行() throws Exception {
        //名前と引数を指定して取得
		Method method = Main.class.getDeclaredMethod("privateMethod", int.class);
		method.setAccessible(true);
		assertEquals(2,method.invoke(obj, 1));
	}

}
```

1. `getDeclaredField()/Method()`で取得
2. `setAccessible()`でアクセス可能にする
3. `invoke`で対象のインスタンス指定して実行

でOKです。

# protectedはビルドパスで設定すると楽
テストコードからprotectedなメソッドにアクセスする場合、最も楽なのはテスト対象と同じパッケージに入れることですが、それはそれでソースコード管理が煩雑になります。
テスト用のコードを別ディレクトリ内に作成しておき、ビルドパスの設定でソースコードと一緒に指定しておくことで同一パッケージにあるように扱うことができます。
図はEclipseの例
![image](https://qiita-image-store.s3.amazonaws.com/0/83530/8795b046-871d-838f-d727-4df06abe41da.png)

```java
@Test
public void プロテクテッドメソッド(){
    //直接参照可能
	assertEquals(3, obj.protectedMethod(1));
}
```
Mithril.js と Phoenixで作ったAPIを連携


# やること

Mithril.jsからPhoenix(Elixir)で作ったAPIにリクエストを投げてjsonレスポンスを取得する

# APIサイド

APIの作成はmixコマンドから

慣れてるということでDBはMySQLを利用
本のタイトルと画像を返却するAPIを作るので、その通りのjsonレスポンスを返すようにコマンドから作る(3行目)
最後にmigrateすると合わせたテーブルが出来る。

```
$ mix phoenix.new api --database mysql
$ mix ecto.create
$ mix phoenix.gen.json Book books title:string img_url:string
$ mix ecto.migrate
```

これで下記のURLにリクエストをかけるとデータが返ってくるAPIが出来る。

```
http://localhost:4000/api/book/1
```


データを仮で入れてから
curlでリクエストを投げて、レスポンスがちゃんと返ってくるのを確認。

```
$ curl -H "Content-Type: application/json" http://192.168.33.10:4000/api/books/1
{"data":{"title":"本のタイトル","img_url":"http://img.url.jp/img.jpg","id":1}}
```

# クライアントサイド

MithrilのModel。 Book.read()を呼ぶとAPIからデータを取得してBookインスタンスを生成して返却する。

```javascript:book.js
var Book = function(data) {
  this.title = m.prop(data.title);
  this.img   = m.prop(data.img);
};

Book.read = function() {
  return m.request({method: "GET", url: "http://localhost:4000/api/books/1"})
    .then(function (jsonData) {
      return new Book({title: jsonData.data.title, img: jsonData.data.img_url});
    });
};
```

実際に実行すると下記のようなエラーが発生。(クライアントサイドはlocalhost:3000から配信)
クロスドメインのリクエストは許可されておらずリクエストが弾かれた。
許可設定をサーバサイドでしてあげないといけない。

```
XMLHttpRequest cannot load http://localhost:4000/api/books/1. The 'Access-Control-Allow-Origin' header has a value 'http://localhost:4000' that is not equal to the supplied origin. Origin 'http://localhost:3000' is therefore not allowed access.
```


下記を参考にPhoenix側に処理を追加する
参考: http://www.leighhalliday.com/cors-in-phoenix

# APIサイド

まず、上記参考のライブラリを導入。

mixの設定ファイル。最後にcors_plugを入れる

```elixir:mix.exs
  defp deps do
    [{:phoenix, "~> 1.0.3"},
     {:phoenix_ecto, "~> 1.1"},
     {:mariaex, ">= 0.0.0"},
     {:phoenix_html, "~> 2.1"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:cowboy, "~> 1.0"},
     {:cors_plug, "~> 0.1.4"}]
  end
```

上記を追加したら下記のコマンドでライブラリが追加される

```
$ mix deps.get
```

追加したらrouter.exのAPI用pipelineにCORSPlugのplugを追加。
originを指定するとheaderに Access-Control-Allow-Originが追加される。今回は作ったクライアントサイドから見れればいいので、下記のように指定。

```elixir:router.ex
pipeline :api do
    plug CORSPlug, [origin: "http://localhost:3000"]
    plug :accepts, ["json"]
  end
```

これで mix phoenix.server で再起動をかければめでたくクライアントサイドからAPIが叩けましたー！
[Java] XML でリモートDTDを読ませない方法


# 目的

- XMLを解析する際に、リモートDTDを読ませない「おまじない」をすることが多い
- おまじないじゃなく、ちゃんと理解しておいたほうが良いよね
- でも、詳しいことは自分でも調べてね
- 動作確認は Java 8u65 で行いました

# よくある実装例

Java で XML を解析する際、リモートDTDなどを読み込まないように、以下のような設定をすることがあると思います。

※もちろん、読み込ませなくて大丈夫な場合だけ。

```java
	public static Document readXML(File file)
			throws ParserConfigurationException, SAXException, IOException {

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		// リモートDTDなどを一切読み込まない
		factory.setNamespaceAware(false);
		factory.setValidating(false);
		factory.setFeature("http://xml.org/sax/features/namespaces", false);
		factory.setFeature("http://xml.org/sax/features/validation", false);
		factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
		factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse(file);
		return document;
	}
```

それぞれの意味を調べてみました。

参考：[Xerces の Setting Features](https://xerces.apache.org/xerces2-j/features.html)

# 整理

## Feature "http://xml.org/sax/features/namespaces"

XML名前空間を処理する(true)/しない(false)を指定します。
内容的には `DocumentBuilderFactory#setNamespaceAware()` と同じもののようです。
上記 Xerces のサイトではデフォルトは true と表記されていますが、Javadoc でも実際に動かしてみてもデフォルト値は false のようです。

## Feature "http://xml.org/sax/features/validation"

構文解析時にドキュメントの妥当性を検証する(true)/しない(false)を指定します。
内容的には `DocumentBuilderFactory#setValidating()` と同じもののようです。
上記 Xerces のサイトでも、Javadoc でも、実際に動かした結果も、デフォルト値は false のようです。

## Feature "http://apache.org/xml/features/nonvalidating/load-dtd-grammar"

解析する際に DTD に定義されているデフォルトの属性と属性セットの種類を追加する(true)/しない(false)を指定します。
上記 Xerces のサイトではデフォルトは true と表記されていますが、実際に動かしてみるとデフォルト値は false のようです。

## Feature "http://apache.org/xml/features/nonvalidating/load-external-dtd"

外部DTDをロードする(true)/しない(false)を指定します。
上記 Xerces のサイトでも、実際に動かした結果もデフォルト値は true のようです。

# まとめ

| Feature | Xerces | Java 8u65 |
|:--:|:--:|:--:|
| "http://xml.org/sax/features/namespaces" | **true** | false |
| "http://xml.org/sax/features/validation" | false | false |
| "http://apache.org/xml/features/nonvalidating/load-dtd-grammar" | **true** | false |
| "http://apache.org/xml/features/nonvalidating/load-external-dtd" | **true** | **true** |

- 必要なのは setFeature で "http://apache.org/xml/features/nonvalidating/load-external-dtd" を false にしておくことだけみたい
- ４つともやっておいたほうが安心できるなら、念のためしておいてもいいかもね（特に Xerces では true になっている項目は）
- setValidating(), setNamespaceAware() と、対応する Feature の両方を設定するのは意味がなさそう
BluemixのGITによるソースコードの管理。

最近、Bluemixを触る機会が増えたのでメモーとして、まとめておきたいと思います。
Bluemix上にコードをデプロイするとき、多くの方が「cf」を使う人が多いのではないかと思いますが、BluemixはGITによるソースコードができるのと、ウェブエディターを使えばブラウザからコードの修正も可能。

まず、Bluemixのアカウントを取得。
Bluemixは、30日間無料で使えるのと、30日が過ぎたとしても無料で使える枠が用意されています。（クレジットカード登録は必要）
Bluemixの新規登録は、下記のリンクをご覧ください。
[IBM Bluemixフリートライアルアカウント作成手順](http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)

Welcome to Bluemix！これから、Bluemixを楽しんでいきましょう！
まず、Bluemixのアプリを生成してみます。
今回は「[Cloud Foundry](https://ja.wikipedia.org/wiki/Cloud_Foundry)アプリ」を選びます。
![スクリーンショット 2015-11-06 16.30.26.png](https://qiita-image-store.s3.amazonaws.com/0/29452/1311f735-a079-2997-b84c-066fcc515287.png)

ここでは、「Web」を選択。
![スクリーンショット 2015-11-06 16.35.31.png](https://qiita-image-store.s3.amazonaws.com/0/29452/668d68a0-0fd8-284c-e5ba-84e02181ba29.png)

好きな言語を選択。
![スクリーンショット 2015-11-06 16.37.21.png](https://qiita-image-store.s3.amazonaws.com/0/29452/6ff0e8a7-edf9-a54b-5f74-ed9fe33842a6.png)

アプリ名を設定
この画面で「完了」をクリックすると、みなさん大好きな「ぐるぐる」が表れます。
![スクリーンショット 2015-11-06 16.39.02.png](https://qiita-image-store.s3.amazonaws.com/0/29452/152240f0-84b1-aceb-d5bf-ff04951c4ef5.png)

YES！できました。「ぐるぐる」が終わったら下記のように、Bluemixアプリが生成されます。
今回は、コーディング方法選択から「GIT」を選択。
![スクリーンショット 2015-11-06 16.42.53.png](https://qiita-image-store.s3.amazonaws.com/0/29452/b83ab553-6d07-68be-58f3-040d9d10e6bb.png)

上記の画面で、「GIT」を選択すると説明がでますのでその説明のとおり、下記の画面の「①、②」をクリック。
アプリ管理画面の左の「概要」→ 「GIT の追加」
![スクリーンショット 2015-11-06 16.49.30.png](https://qiita-image-store.s3.amazonaws.com/0/29452/b67f9f3f-fb1e-67fe-ac33-1dcdda8b35b4.png)

GITを追加したら、下記の画面にてURLの確認ができるようになります。
![スクリーンショット 2015-11-06 17.40.22.png](https://qiita-image-store.s3.amazonaws.com/0/29452/1346619e-eff2-7a28-dfb3-76631b34a7ec.png)

さあ！BluemixからGITを使うことができるようになりました。
下記の画面の赤い枠のメニューにて追加したGITの設定を変更することができます。
なお、「EDIT CODE」では、ブラウザ上でそのままコードの修正も可能。
![スクリーンショット 2015-11-06 17.44.06.png](https://qiita-image-store.s3.amazonaws.com/0/29452/a1f48500-41ca-04cd-f135-d24635f01ed1.png)

下記は、EDIT CODEの画面。
![スクリーンショット 2015-11-06 17.48.50.png](https://qiita-image-store.s3.amazonaws.com/0/29452/44e5db20-22f3-f68c-b090-fc2051309ad2.png)

最後に、上記画面のメニューのハグルマから、今回追加したGITのURLを確認できます。
![スクリーンショット 2015-11-06 17.52.49.png](https://qiita-image-store.s3.amazonaws.com/0/29452/9858ff6e-04a4-0c50-1acf-ad617c382ba3.png)

Git URLは、ここでも確認できます。
![スクリーンショット 2015-11-06 18.09.25.png](https://qiita-image-store.s3.amazonaws.com/0/29452/9b5bf5d2-4a1a-18b5-bb00-b6121af76455.png)

プロジェクトによって、ソースコード管理やバージョン管理方法は様々だと思いますが、Bluemixはローカルで管理されているソースコードをデプロイできる「CF」やGIT、Git Hubとの連動などいろんなデプロイ方法を提供しています。

Enjoy the Bluemix!
配列を指定単位で区切る方法

### 配列を指定単位で区切る方法  

大量のデータをloopで、n件単位でコミットしたい時ってありますよね?
そういう時に有用かなと

記載している内容は、dbとか一切関係ないです

おまけ:Pythonの方の記述で、あまりがNoneならないようにスマートに記述したいです。




* php5.x

```php:main.php
<?php

$input = array(0,1,2,3,4,5,6,7,8,9);
$unit = 3;
print_r(array_chunk($input, $unit));

/*
Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )

    [1] => Array
        (
            [0] => 3
            [1] => 4
            [2] => 5
        )

    [2] => Array
        (
            [0] => 6
            [1] => 7
            [2] => 8
        )

    [3] => Array
        (
            [0] => 9
        )
)
*/
```

* Python3  

```python3:main.py
# -*- coding: utf-8 -*-
import itertools
unit = 3
for x in itertools.zip_longest(*[iter(range(10))] * unit):
	print(x)
"""
(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, None, None)
"""
```
Android6.0で変わったアプリのアクセス権について(非開発者Android使い向け)

Android6.0からアプリ単位でアクセス権のON/OFFをユーザが自由に設定できるようになりました。これにより不正なアプリやプライバシーを侵害するアプリによる被害に対応しやすくなりました。

ここではユーザ向け(非開発者)にこの機能がつくことで何が起こるかON/OFFの仕方について紹介していきます。この機能を使ってセキュリティをより強固にしてくれれば幸いです。
(開発者の皆さまもこの記事を参考にユーザがどういう視点でこの機能を使うかを知ることができれば幸いです)


# そもそもここでいうアクセス権とは？
位置情報・連絡先・カメラなど個人情報を取得できるような機能を使うための権限です。「気づかぬうちに個人情報を引き抜かれて、情報漏えいしていました」的な被害を防ぐためにAndroid初期のころからついている機能です。

# Android6.0以前のアプリのアクセス権
アプリインストール時に付与するアクセス権についての確認を行います。
ここでアクセス権を付与することを許可すればアプリがインストールされます。インストール時にアクセス権付与を許可をしなければアプリがインストールされません。
インストール後、付与したアクセス権は固定です。

![スクリーンショット 2015-11-10 0.42.57.png](https://qiita-image-store.s3.amazonaws.com/0/14989/4d2eda79-1cac-f6c0-54ea-e45623e1ac5a.png)









これだとアプリ起動時に（気づかぬうちに）連絡先を抜かれて変なサーバに送られてしまう可能性はなくならないですよね。

# Android6.0以降のアプリのアクセス権
アプリインストール時に付与するアクセス権についての確認を行うのは変わりはありません。

しかし、カメラなどを使おうとするとアクセス権をONにするかどうかの確認をしてきます。ここで許可すれば普通に使えますが、許可しないとそこで処理が終わります。
（以下のキャプチャではtwitterをインストール直後、撮影写真を投稿しようとした時に出てくる画面です。カメラを使うことを許可するかどうか聞いています）



![スクリーンショット 2015-11-10 1.14.04.png](https://qiita-image-store.s3.amazonaws.com/0/14989/847cedfd-7056-cce1-2606-05b481b461ed.png)

![スクリーンショット 2015-11-10 1.14.38.png](https://qiita-image-store.s3.amazonaws.com/0/14989/8174f36b-5e28-b5c4-2d13-662419afa24c.png)


ちなみに、古いバージョンにしか対応していないアプリでアクセス権がOFFだと、アクセス権許可をするかの確認もせず処理がうまくいかない振る舞いをします。。。


# アクセス権ON/OFFの切り替え方法

1. アプリ一覧から設定アプリを起動します。
2. [端末]-[アプリ]をタップします。
3. アプリ一覧からアクセス権の設定をしたいアプリをタップします。
4. [許可]の項目をタップします。（ここでアプリに許可するアクセス権の設定を行います。）
5. 許可するアクセス権のON/OFFを設定します。

必要なときにアクセス権をONにして、もう使わなくなったらこの方法でOFFにしておく、というふうにしておくと安全だと思います。

# まとめ

ざっくりですが、Android6.0で追加されたアプリのアクセス権について紹介していきました。ユーザのみなさんはこの機能を使ってプライバシーを守っていきましょう。

開発者の皆さんへ
ユーザが使い易いように早めにAndroid6.0対応をしておきましょう。