OmniAICreator/Qiita-1.07M huggingface dataset:
【Swiftライブラリ】BAFluidViewの使い方（Swift3.0 Xcode8.0）

#BAFluidViewを使ってみる
画面に常に動いているアニメーションが欲しいなと思って探してたらいい感じのライブラリを見つけたのはよいもののSwiftで記述されたものがなかったのでメモ。
ちなみにBAFluidViewはこんな感じに水位が上がったり下がったりのアニメーションをしてくれるライブラリ。
- 公式HP：https://github.com/antiguab/BAFluidView

![example1.gif](https://qiita-image-store.s3.amazonaws.com/0/142791/00e8b774-768c-5e2a-65ac-f1ea82415890.gif)
![example4.gif](https://qiita-image-store.s3.amazonaws.com/0/142791/067dfc99-88bc-c5c6-ede3-e58a4e1411c1.gif)

#インストール方法
インストールにはCocoaPodsを使用。Podfileに以下を記述。
`pod "BAFluidView"`
インストール後xcworkspaceプロジェクトを開くとSwift3.0にコンバートしますかなどと出てくるが基本的にすべてOKで進む(自分の場合アラートが出てきたがBAFluidViewにチェックが入っていなかったのでそのままconvertを押した)

#使い方
##①ひたすら下から上にアニメーションする

```Swift:ViewController.swift

import UIKit
import BAFluidView

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //アニメーションのViewを生成
        let animeView = BAFluidView(frame: self.view.frame)
        //波の高さを設定(0~1.0)
        animeView.fill(to: 1.0)
        //波の境界線の色
        animeView.strokeColor = .white
        //波の色
        animeView.fillColor = UIColor(red: 0.274, green: 0.288, blue: 0.297, alpha: 1.0)
        //アニメーション開始（コメントアウトしてもアニメーションされる）
        animeView.startAnimation()
        self.view.addSubview(animeView)
    }
  
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

```
##②ある高さでひたすら波打つ
```Swift:ViewController.swift

import UIKit
import BAFluidView

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //アニメーションのViewを生成（startElevationで開始位置を設定）
        let animeView = BAFluidView(frame: self.view.frame,startElevation: 0.4)
        //波の高さを開始位置と同じにする
        animeView?.fill(to: 0.4)
        //波の境界線の色
        animeView?.strokeColor = .white
        //波の色
        animeView?.fillColor = UIColor(red: 0.274, green: 0.288, blue: 0.297, alpha: 1.0)
        
        //公式ではこの一文を入れていたが自分の環境では入れるとうまく動かなかった
        //animeView.keepStationary()
        
        //アニメーション開始（コメントアウトしてもアニメーションされる）
        //animeView.startAnimation()
        
        self.view.addSubview(animeView!)
    }
  
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

```

#最後に
とりあえず自分の用件を満たす動きは確認できたので満足。画像を波打たせることもできるようだがそれはまた次回。また、BridgingHeaderを作成しないといけないなど書いてあるページもあったが自分の環境では特に必要なかった。
Rubyで多次元HashやArrayから特定のキーを削除する

# Rubyで多次元HashやArrayから特定のキーを削除する

一次元のHashから特定のキーを削除したい場合は、

```
h = {a: 1, b: 2, c: 3}

# :bを削除
h.delete_if{|k, v| k == :b }
=>{a: 1, c: 3}
```

が1つの手ですが、多次元Hashの場合はどうするか。

```
h = {a: {aa: 1, ab: 2, ac: 3}, b: 2, c:3}

# :aaを削除したい

# NG
h.delete_if{|k, v| k == :aa }
=> {a: {aa: 1, ab: 2, ac: 3}, b: 2, c:3}

# OK
p = proc do |k, v|
  v.respond_to?(:delete_if) ? (v.delete_if(&p); nil) : k == :aa
end
h.delete_if(&p)
=> {a: {ab: 2, ac: 3}, b: 2, c:3}
```

条件をprocにして再帰的にdelete_ifをします。
`v.respond_to?(:delete_if)` 部分は、`v.instance_of?(Hash) ` でもいいかもしれません。どれだけ階層が深くなっても対応できるはず。


ただ、HashにArrayも入ってくると上記のコードだけではまかなえないため、以下のようなコードとしました。

```
h = {a: [{aa: 1, ab: 2, ac: 3}, {aa: 4, ab: 5, ac: 6}], b: 2, c:3}
p = proc do |k, v|
  k.respond_to?(:delete_if) ? (k.delete_if(&p); nil) : (v.respond_to?(:delete_if) ? (v.delete_if(&p); nil) : k == :aa)
end
h.delete_if(&p)
=> {a: [{ab: 2, ac: 3}, {ab: 5, ac: 6}], b: 2, c: 3}
```


`key`と`val`それぞれに`delete_if `の存在を確認しつつ、純粋なHashであればkeyを評価する処理です。
ただ、ちょっと長ったらしい感じなので、再帰の条件がもっとシンプルにならないものかなあとは思います。
AES-NI環境でSSHのプロトコルを比較してみる

AES-NI環境でrsyncを使いファイルを転送していたら、意外とSSHの負荷が高かったため下記のテストをしてみたところ、デフォルトのaes128-ctrよりもaes128-gcm@openssh.comの方が高速でした。実際に切り替えてみるとrsyncとSSHで1コアを使いきっていたものが、7〜8割の負荷になりました。またクロックで見てもクロックが下がる時間がやや長くなっているようでした。

```
# for i in `ssh -Q cipher`; do dd if=/dev/zero bs=1M count=1000 2> /dev/null \
  | ssh -c $i localhost "(time -p cat) > /dev/null" 2>&1 \
  | grep real | awk '{print "'$i': "1000 / $2" MB/s" }'; done
aes128-ctr: 495.05 MB/s
aes192-ctr: 469.484 MB/s
aes256-ctr: 469.484 MB/s
aes128-gcm@openssh.com: 574.713 MB/s
aes256-gcm@openssh.com: 507.614 MB/s
chacha20-poly1305@openssh.com: 184.843 MB/s
```
Android Studioのライブラリ追加方法


twitter4jを追加しようと思ったら古いAndroid Studioの追加方法やEclipseの設定方法が検索でhitして辛かった。

```
dependencies {
    compile 'org.twitter4j:twitter4j-core:4.0.2'
}
```

この書き方でいいとteratailで知った。
https://teratail.com/questions/3625
Spring Boot 1.4+Thymeleaf 3.0でSpELコンパイラを有効にしてパフォーマンスを向上させよう！！

以前の投稿で「[Spring Boot 1.4でThymeleaf 3.0系を使うための設定方法](http://qiita.com/kazuki43zoo/items/da64a68b9805e512cdc9)」を紹介しましたが、Thymeleaf-Spring 3.0からSpELのコンパイラを有効にするオプションが追加され、SpELのコンパイラを有効にすることでテンプレートファイルに指定する式を評価する速度が向上するみたいです。[Git HubのIssue](https://github.com/thymeleaf/thymeleaf-spring/issues/95)には、35%程度のパフォーマンス向上を得ることができたという旨のコメントが記載されていました。（どの程度向上するかは、式の数や使い方に依存すると思うますが・・・）

# 検証バージョン

* Spring Boot 1.4.1.RELEASE
* Thymeleaf 3.0.2.RELEASE
* Thymeleaf-Spring 3.0.2.RELEASE

# オプションの有効化

オプションを有効化したい場合は、Java Configクラスの内に`SpringTemplateEngine`をインジェクションするメソッドを用意し、インジェクションされた`SpringTemplateEngine`の`setEnableSpringELCompiler`メソッドに`true`を渡すだけです:smile:

```java
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

	// ...

	@Autowired
	void configureThymeleafSpringTemplateEngine(SpringTemplateEngine templateEngine) {
		templateEngine.setEnableSpringELCompiler(true); // trueを指定！！
	}

}
```

# まとめ

パフォーマンスが改善されたか測定もしてないし、体感もできませんでしたが:sweat_smile:・・・・デバッガ使ってSpELのコンパイラが有効になっていることは確認できました:+1:
現時点のSpring Bootのバージョンではプロパティを使ってカスタマイズすることはできませんが、Spring Bootで扱うThymeleafのデフォルトバージョンが3.0系になったら、プロパティでカスタマイズできるようにPRしようかな〜と思っています。（Spring Bootのdeveloperさんが対応してくれちゃう気もしてますが:blush:）

# 参考サイト

* http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html#performance-improvements
【Swift】電卓アプリのサンプルコード（UICollectionView版）

# 概要
電卓アプリのサンプルコードです。（UICollectionView版）
[PureLayout](https://github.com/PureLayout/PureLayout)を利用し、今回もStoryboardは未使用です。

UIButton版はこちらです。
[【Swift】電卓アプリのサンプルコード（Storyboard未使用、PureLayout）](http://qiita.com/menomoto/items/ad0ed0bc502a09e0766b)

# github
https://github.com/menomoto/Sample_Apps/tree/master/calculator
* ViewController全体で約200行
* 16個のbuttonをcollectionViewに集約したことでコード量が減少（280→200）

# 結果
![サンプル](http://i.imgur.com/PjzptDI.gif)
PrestoとHiveでクエリを使い回す時の注意点 ~配列編~

Treasure DataでPrestoとHiveでクエリを使いまわそうとしてハマった小ネタ。

### 配列のインデックスの開始がPrestoは1から、Hiveは0から

表題の通りなのですが、実例を。

例えば、Webアクセスログのagentとして

| agent |
|:--|
| Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS122159;  |
| Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)|
| Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) |
| Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0;|
| Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11 |

といった値が格納されている時に、ブラウザの文字列を切り出したくて`split`するとします。

Prestoだと、配列のインデックスは1から始まるので

```sql
SELECT 
  agent_string_arry[1]
FROM (
    SELECT 
      SPLIT(
        agent,
        '/'
      ) AS agent_string_arry,
      agent
    FROM
      www_access
  )
LIMIT 5
```
で、

```
Mozilla
Mozilla
Mozilla
Mozilla
Mozilla
```

と値が取れますが、同じクエリをHiveに投げてしまうと、

```
4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident
5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident
5.0 (compatible; Googlebot
4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident
5.0 (Windows NT 5.1) AppleWebKit
```

となってしまいます。

Hiveに投げる場合は配列のインデックスは0から始まるので

```sql
SELECT 
  agent_string_arry[0]
FROM (
    SELECT 
      SPLIT(
        agent,
        '/'
      ) AS agent_string_arry,
      agent
    FROM
      www_access
  )
LIMIT 5
```

とする必要があります。

### 補足

Prestoのドキュメントにもこの点は[Hiveからの移行時の注意点として書かれていた](https://prestodb.io/docs/current/migration/from-hive.html)。

> Arrays are indexed starting from 1, not from 0:

そこにも書かれているように、[ANSI SQL標準としては配列型のインデックスは1から始まると規定されているようだ](http://web.cecs.pdx.edu/~len/sql1999.pdf)。

> 4.11.1 Arrays
An array is a collection A in which each element is associated with exactly one ordinal position in A. If n is the cardinality of A, then the ordinal position p of an element is an integer in the range 1 (one)   p   n. If EDT is the element type of A, then A can thus be considered as a function of the integers in the range 1 (one) to n onto EDT.

[PostgreSQLもANSI SQL標準に従っている](http://www.postgresql.jp/document/9.5/html/arrays.html#arrays-accessing)

>デフォルトでPostgreSQLは配列に対し「1始まり」の振り番規定を採用しています。 つまり要素がn個ある配列はarray[1]で始まり、array[n]で終わります。

Hiveの弁護をするなら、CやJavaだと配列のインデックスは0から始まるので、あくまでMapReduceのラッパーとして実装されたHiveQLはそちらに引きずられているのかもしれない。

以上。
laravel5でクッキーを取得する際にエラーが出るときの対処法


### はじめに
ちょっとハマったのでメモ．

### エラーの内容

クッキーが存在するかどうか確認するためにlaravelの日本語ドキュメント通りに実装していくと

```
Non-static method Illuminate\Http\Request::cookie() should not be called statically, assuming $this from incompatible context
```

というエラーが発生．
このときのソースコードは，

```php:xxxController.php
<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

class xxxController extends Controller {

	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */
	public function index()
	{
		//cookie check
		$cookie = Request::cookie('xxxxx');
		if(!$cookie){
			return 'クッキーが存在しません．';
		}
		else{
			return 'クッキーが存在します．';
		}
	}
```

### Solution
どうやら、```Illuminate\Http\Request```クラスのベースクラスを読み込めばよさそうです．

なので，

```php
use Illuminate\Http\Request;
```

を

```php
use Request;
```

に変更すれば，クッキーの取得が行えます．
Wikiをつくる（ユーザーの招待機能について）

[Wikiを作る(1) - Qiita](http://qiita.com/toyoshi/items/eab2bc1355584d3448aa)の続き

## 実現したいユーザーの招待方法

- 登録した人だけがWikiに書き込みができる
- １人目（インストールした人）は普通にユーザー登録できる
	- １人目の登録者は他者を招待するための秘密のURLを参照できるようになる
- ２人目以降は秘密のURLからのみ登録ができる
- 秘密のURLは破棄と再作成ができる

## その他で検討したこと

- １人目について
	- インストールウィザードがあるのが望ましいが大変そうなので見送る
	- usernameとpasswordが決め打ちなのも気持ち悪いので見送る
- ２人目以降の招待方法について
	- 個別に招待メールを送る方法は嫌だった（[scambra/devise_invitable](https://github.com/scambra/devise_invitable)）
	- SNSのメッセンジャーなどで通知することを想定している

## どうやったか

まず普通にdeviseを使ってユーザー管理の仕組みをつくる。
そして、[Rails4でdeviseのControllerをカスタマイズする - Qiita](http://qiita.com/akasakas/items/138c29fa2cecd271cfe4)を参考にしながら`Users::RegistrationsController`の`new`と`create`のアクションに`before_filter`をかけて、そこでトークンがあるかどうかをチェックするようにした。

```ruby
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :check_registable, only: [:new, :create]

  protected

  def check_registable
    # 1人目のユーザーはトークン不要とした
    return true if User.count == 0

    #TOKEN is valid
    token = params[:rt] || cookies[:rt]
    if token == Option.user_registration_token # ※１
      cookies[:rt] = token #クッキーに保存しておく（Sessionに保存してもいい）
    else
      redirect_to root_path, notice: 'invalid token' 
    end
  end
end
```

※１`Option.user_registration_token`に保存してある。Optionは設定を保存しているところである。（後で詳細を書くかもしれない）
Tokenは下記のように生成している。

```ruby
class Option < ApplicationRecord
  def self.update_registration_token
    self.user_registration_token = SecureRandom.uuid.gsub!(/-/,'')
  end

  #省略
end
```

## 作った設定画面

![image](https://qiita-image-store.s3.amazonaws.com/0/4140/913d931e-e928-430c-0654-b0455eb5bf6f.png)

## まとめ

- 共通の招待URLを使った招待機能が実現できた。
- Deviseに乗っかることで比較的少ないコードで実現できた。

## 追記

だいたい作りました
https://github.com/toyoshi/wikigo
angular-cli で作成したアプリに bootstrap をインストールする


[前回からの続き](http://qiita.com/kkeisuke/items/0dd5bfdb2c8b457c4a6d)で、angular-cli で作成したアプリに bootstrap をインストールするところまで

## 手順

グローバルスコープで参照したいので以下を参考に行う
https://github.com/angular/angular-cli#global-library-installation

早速インストールできなかったので、調査
http://stackoverflow.com/questions/39017376/angular-cli-webpack-3rd-part-css-files

angular-cli のバージョンを上げて再インストール

```
npm install angular-cli@latest
```

次に、`ng new PROJECT_NAME` でアプリも再構築して、bootstrap のインストール

```
npm install bootstrap@next --save
```

`"bootstrap": "^4.0.0-alpha.5"` が package.json に追加されます

angular-cli.json を以下のように修正

![Kobito.EFLn4f.png](https://qiita-image-store.s3.amazonaws.com/0/61513/d0b3e970-1a23-8eca-d9de-ab3022814f1e.png "Kobito.EFLn4f.png")

修正後に `ng serve` をすると再ビルドされて、bootstrap が使えるようになりました。

今回の sample を GitHub に push しました。
https://github.com/kkeisuke/angular-cli-sample/commit/03cf9d100572cb5219640ae9aa2c5181c5d6f5a3


## その他に気づいた点

- 最新バージョンでは構成が変わっていました。

```
.
├── e2e
└── src
    ├── app
    ├── assets
    └── environments
```

- `ng new PROJECT_NAME` でリポジトリも出来るので、かなり便利

![Kobito.4UVEqf.png](https://qiita-image-store.s3.amazonaws.com/0/61513/d9f37a89-9fe1-937f-65b7-d2aacd24d245.png "Kobito.4UVEqf.png")

- `ng` コマンドを打つと、watchman のエラーがでる。
	- issue が出ているようですが、まだクローズされていない模様 (2016/10/26)
		- https://github.com/angular/angular-cli/issues/2791

```
Could not start watchman; falling back to NodeWatcher for file system events.
```
オーバーライドしていないメソッドをスタブに置き換える

# 概要

オーバーライドしていないvirtualでないメソッドや, 継承元の無いsealedなクラスなどの動作を, スタブに置き換える.

# 問題のコード

```csharp
class Motor	// このクラスはライブラリとかで用意されているものとする
{
	/// <summary>
	/// モーターの回転速度を取得する
	/// </summary>
	public int GetSpeed()
	{
		// このコードは, 実機にモーターが
		// 繋がっていないと動作しない.
		// (テスト環境では動作させることはできない)
	}
}

class SampleClass	// 自分で作ったクラス
{
	/// <summary>
	/// テスト対象のメソッド
	/// </summary>
	/// <param name="motor">処理したいモーター</param>
	public void SampleMethod(Motor motor)
	{
		int currentSpeed = motor.GetSpeed();

		// currentSpeedを取得して何か処理する.
		// 省略する.
	}
}
```

このコードは, 特別なデバイス(実機)上で動作させるものとする.
実機にはモーターが接続されており, `Motor`クラスを通じて制御をおこなう.

この`SampleMethod`メソッドのテストを作成し, CIツール(Travis CIとかAppVeyorとか)で自動テストさせたい.
でも, CIツールの環境では, モーターが接続されていないので, `GetSpeed()`メソッドは動作しない.
テストの時は, `GetSpeed()`は呼ばず, 代わりのメソッドを呼ぶようにしたい.

ここまでであれば, [自分が作ったクラスのインスタンスメソッドをスタブに置き換える](http://qiita.com/Geroshabu/items/99c5b0a0b22092e32ace)のと同じである.
しかしここでは, 上記の記事とは異なり, `Motor`クラスは自分で作ったものでなくライブラリなどで提供されているもので, 自分では手を入れることができないものとする.
つまり, 上記の記事にあるような"インタフェースに依存させる"ということができない.
また, `virtual`が付いてないので, `Motor`クラスを継承して`GetSpeed()`の動作を上書き(オーバーライド)することもできない.

以降で, Motorインスタンスをスタブに置き換えて, SampleMethodメソッドをテストできるようにしてみる.

# ラップするクラスを作る

インタフェースに依存させることもできず, 動作をオーバーライドすることもできないともあれば, もうしょうがないので`Motor`をラップするクラスを作るぐらいしかない.

具体的には次のようにする.

```csharp
class MotorWrapper
{
	public MotorWrapper()
	{
		Motor instance = new Motor();
		GetSpeed = instance.GetSpeed;
	}

	public Func<int> GetSpeed{ get; }
}
```

[こちら](http://qiita.com/Geroshabu/items/398499af4da0792f061e)で説明した, "メソッドを格納できる変数"を利用している.
使う側では, 次のようになるだろう.

```csharp
class SampleClass
{
	/// <summary>
	/// テスト対象のメソッド
	/// </summary>
	/// <param name="motor">処理したいモーター</param>
	public void SampleMethod(MotorWrapper motor)
	{
		int currentSpeed = motor.GetSpeed();

		// currentSpeedを取得して何か処理する.
		// 省略する.
	}
}
```

`MotorWrapper`インスタンスを受け取れば, あとは`Motor`のときと同じように`GetSpeed()`を実行できる.

# スタブに入れ替えてみる

では, テストコードで, `GetSpeed()`メソッドの動作を入れ替えてみる.

```csharp
[TestClass]
public class SampleClassTest
{
	[TestMethod, Description("SampleMethodメソッドのテスト")]
	public void SampleMethodTest()
	{
		// Arrange (準備)
		SampleClass instance = new SampleClass();
		MotorWrapper inputMotor = new MotorWrapper();
		inputMotor.GetSpeed = GetSpeedStub;	// GetSpeedの動作を入れ替える

		// Act (実行)
		instance.SampleMethod(inputMotor);

		// Assert (検証)
		// 何か処理が行われたことを確認する
		// 今回は省略
	}

	/// <summary>
	/// Motor.GetSpeedメソッドのスタブメソッド
	/// </summary>
	private int GetSpeedStub()
	{
		// 何もしない
		return 0;
	}
}
```

# もうちょっと改善

ラムダ式を知っていると, もうちょっと簡単に入れ替えられる.

```csharp
inputMotor.GetSpeed = () => 0;	// GetSpeedの動作を入れ替える
```

おしまい.

"メソッドを格納する変数"を使うと, Intellisenseによるメソッドの説明が出てこなくなるのがつらい.
インタフェースを用意していないライブラリを恨むしかないのか...
Qtで画像を重ねたアイコンを作る

**注意:** ここは作業メモ、大した情報は無いですょ。

---

## メモ

Qtのアイコンの上に数字を出してみたかったので色々とやってみたんですが、
[FontAwesome で動的にアイコン化 in Qt] という記事を参考にさせてもらったらできたので、メモとして残しておきます。

参考にさせていただいた記事と一緒で、QPainterを使ってみました。
とにもかくにも、16x16サイズのhoge.pngという画像の上に01.pngという画像画像(名前の通り数字です)を載せたアイコン作るには以下のようにすればいける模様。
正直Qtは手探りでいじっているので、きっと無駄な記述もあるんだろうなぁ。
\# もちろん、png画像についてはリソース登録してやってます。

```cpp
  QPixmap pixmap(16,16);
  QPixmap pic(":/images/icons/hoge.png");
  QPixmap _01pic(":/images/icons/01.png");
  QRectF icon_size(0, 0, 16, 16);

  pixmap.fill(Qt::transparent);

  QPainter painter(&pixmap);
  painter.drawPixmap(icon_size, pic, icon_size);
  painter.drawPixmap(icon_size, _01pic, icon_size);

  QIcon new_icon(pixmap);
```

最後の、 `new_icon` ってのを表示させると無事に画像が重なってました。
なお、

```cpp
  painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
```

と書くと、重ねる順番を逆にできたりする模様。
詳しくは、 [enum QPainter::CompositionMode] あたりを読むと良いのだと思います……。


## 参考サイト

* [FontAwesome で動的にアイコン化 in Qt]
* [enum QPainter::CompositionMode]

[FontAwesome で動的にアイコン化 in Qt]:http://qiita.com/shimacpyon/items/f3b6949d63d6a072d6f2
[enum QPainter::CompositionMode]:http://doc.qt.io/qt-5/qpainter.html#CompositionMode-enum
Laravel5.3 で超ラクにバリデーションしてエラーメッセージを変更する

#環境
- CentOS 7
- PHP 7
- Laravel 5.3

#バリデーション処理の実装
```Controller.php
\Validator::make(
    ['email' => $request['email']],
    ['email' => 'required|email|max:128']
)->validate();
```

```blade.php
<div class="form-group @if(!empty($errors->first('email'))) has-error @endif">
    <label for="email" class="col-md-2 control-label">メールアドレス</label>
	<div class="col-md-6">
	  <input type="email" class="form-control" id="email" name="email" placeholder="example@email.com" value="{{ old('email') }}" required="required">
	  <span class="help-block">{{$errors->first('email')}}</span>
	</div>
</div>
```
↑だけでバリデーションが行われ、エラーがあった際は、
![image](https://qiita-image-store.s3.amazonaws.com/0/57002/0cba9053-d6b5-23b5-b900-13f2243093fd.png)
のように前の画面に自動で遷移して、エラー出力ができる。

#エラーメッセージの場所
`resources/lang/en/validation.php`で定義されている。

```resources/lang/en/validation.php
<?php
return [
    ...
	'email'                => 'The :attribute must be a valid email address.',
    'exists'               => 'The selected :attribute is invalid.',
    'file'                 => 'The :attribute must be a file.',
	...
```

#エラーメッセージを日本語にする
今のままだとエラーメッセージが英語なので、日本語に直す。

1. `config/app.php`の`'locale' = >'en'`を`'locale' => 'ja'`に変更
2. 日本語版のエラーメッセージファイルを [GitHubからDL](https://gist.github.com/oppara/5160fcac9db0e3f8fbaf71da7ade10be) する
3. `resources/lang/ja/` に格納（ディレクトリは作る）

そうするとエラーメッセージが日本語になる。
![image](https://qiita-image-store.s3.amazonaws.com/0/57002/2c5aa7d3-69a8-bb07-14bf-4c5be2357783.png)


#エラーメッセージの内容を変更する
>emailは必須です。

だとユーザーに優しくないので変更する。
先ほど追加した`validation.php`の`'attributes'`の欄を以下のように変更する。

```resources/lang/ja/validation.php
'attributes' => [
    'email' => 'メールアドレス',
],
```

そうするとユーザーにも優しいエラーメッセージになる。
![image](https://qiita-image-store.s3.amazonaws.com/0/57002/dec9712b-ef20-ad93-e3ec-b000fe0ba2e3.png)
MonoBehaviour調査２

## AddComponent / Destroy はどのくらい重い？

1.Update()のあるスクリプトをアタッチし続ける
2.Update()のあるスクリプトを必要に応じて、AddComponentして、不要になればDestroyする
3.Update()のあるスクリプトをアタッチし続け不要になればenable=falseにしてやる

１は論外として、**速度的には３が一番速い**だろうが、不要なコンポーネントを持ち続けるのが**気持ち悪い**。2のコストがどのくらいなのかを検証してみたい。

```c#
public class TestScript : MonoBehaviour {
	const int NUM = 10000;
	List<GameObject> go_;
	void Start () {
		go_ = new List<GameObject>();
		for( int i=0;i<NUM;i++ ) {
			var	n = new GameObject("node"+i ); 
			go_.Add( n );
		}
	}
	void Update () {
		foreach( GameObject g in go_ ) {
			var c = g.AddComponent<WithoutUpdate>();
			Destroy( c );
		}
	}
}
```
空のGameObject10000個に対してスクリプトのAddComponent/Destroyを繰り返した。
><img width="302" src="https://qiita-image-store.s3.amazonaws.com/0/83068/90b7e439-6d7a-7e0c-88ff-a191f5b80e7e.png">
順当に重い。DestroyImmediateでも変わらず。

スクリプトにStart() Awake()が存在するとAddComponent時に呼ばれるため更に遅い。

```c#
public class TestScript : MonoBehaviour {
	const int NUM = 10000;
	List<GameObject> go_;
	void Start () {
		go_ = new List<GameObject>();
		for( int i=0;i<NUM;i++ ) {
			var	n = new GameObject("node"+i ); 
			var c = n.AddComponent<WithoutUpdate>();
			go_.Add( n );
		}
	}
	void Update () {
		bool e = false;
		foreach( GameObject g in go_ ) {
			var c = g.GetComponent<WithoutUpdate>();
			c.enabled = !c.enabled;
		}
	}
}
```
こんな具合にenabledを毎フレーム切り替えてみた場合

><img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/83068/3fe6b3a6-9496-07ae-df6e-55145b0b8757.png">
2に比べると圧倒的に速い。

動的にコンポーネントを生成破棄するのはやはりやめた方がよさそう。


知ってるようで確かめたことの無かった実験でした
MonoBehaviour調査１

# 
## Updateの負荷ってどのくらい？

MonoBehaviourのUpdate関数はvirtualじゃない。実装されていなければ実行されないのでUpdateなどは実装しないに超したことはない。
知識では知っているけど実際どのくらいなのか確認。

```c#
public class WithUpdate : MonoBehaviour {
	int a_;
	void Start () {
		a_ = 0;
	}
	void Update () {
		a_++;
	}
}
```
Update付きのスクリプトと

```c#
public class WithoutUpdate : MonoBehaviour {
	void Start () {
	}
}
```
Update無しのスクリプトを空のGameObject 10000個にAddComponentした場合を比較。

> <img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/83068/4d83394a-33d0-d392-57b3-9e311711ae5c.png">
Update有り

> <img width="299" src="https://qiita-image-store.s3.amazonaws.com/0/83068/959b9533-9f1c-3d19-46ee-aec596dc16b0.png">
Update無し

計測が適当すぎるからいい加減だけど、Update無い場合は明らかにコールされてない感じ。
（AddComponentしない状態と目視では変わらず）

-----
次に、WithUpdate / WithoutUpdateを継承したクラスで実験。継承先にはUpdateは無い。

```c#
public class ChildOfWithUpdate : WithUpdate {
	void Start () {
	}
}
```
><img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/83068/f21a59c5-ab59-e6ec-3188-815e63aa1469.png">


```c#
public class ChildOfWithoutUpdate : WithoutUpdate {
	void Start () {
	}
}
```
><img width="295" src="https://qiita-image-store.s3.amazonaws.com/0/83068/7ab43c82-fba1-f189-1e71-350572196059.png">


順当な結果。継承元にUpdateがあると呼ばれてしまうので無駄なコールが増える。継承でonUpdate()などと実装すると無駄になる。
Electronではnode-sassじゃなくsass.jsを使おう

Electronのアプリ上で`node-sass`を`require`すると、このOSバージョンには対応してない、詳しくは[リリースノート](https://github.com/sass/node-sass/releases/tag/v3.10.1)を見ろ、と言われたので見ても対応してる環境だったりする。

「electron node-sass」とググると様々なIssueが双方のリポジトリに大量に立てられている。相性が悪いのか……？

代わりに`sass.js`を使えばすんなりうまくいった。
君はsleepコマンドのdサフィックスの使い方を知っているか？

すいません。
タイトルは釣りです。

# まず…
UNIXで一般的な`sleep`コマンドは、指定した秒数スリープをするというおなじみのコマンドですね。

```bash
$ sleep 10
(10秒間…)
$
```

さて、この秒数には'm'や'h'、'd'サフィックスを指定することができるのをご存じでしたでしょうか？
helpを見てみましょう。

```bash
$ sleep --help
Usage: sleep NUMBER[SUFFIX]...
  or:  sleep OPTION
Pause for NUMBER seconds.  SUFFIX may be 's' for seconds (the default),
'm' for minutes, 'h' for hours or 'd' for days.  Unlike most implementations
that require NUMBER be an integer, here NUMBER may be an arbitrary floating
point number.  Given two or more arguments, pause for the amount of time
specified by the sum of their values.
(snip..)
```

つまり、'm'サフィックスを指定すれば分、'h'を指定すれば時、'd'を指定すれば日単位でスリープする時間を指定できるわけです。（デフォルトは's'で、当然ながら秒単位になります。）

# で？
この'd'サフィックスの使いみちって何でしょうか？　日単位でsleepをして何が嬉しいんでしょうか？

実はこれDockerでEntryPointが指定されていないイメージをRUNするときの代わりのEntryPointに使うことが出来ます。

```
$ docker run <container name> /bin/sleep 365d
$ docker exec -it <container name> /bin/bash
```
Dockerコンテナをrunning状態で維持させるためには、EntryPointのプログラムがフォアグラウンドで動作し続ける必要があります。

母艦を汚さないための作業環境を作ってそれを立てたい場合は、EntryPointとして`sleep`をフォアグラウンドデーモンとして立てるわけです。

Docker Composeを使うとこんな感じでもっと簡単になります。

```yaml:docker-compose.yml
---
version: '2'
services:
  base:
    image: <container name>
    entrypoint: /bin/sleep 365d
```

```bash
$ docker-compose -d up
$ docker exec -it <container name> /bin/bash
```

# 最後に
何でこの記事を書いたのかって？
sleepの思わぬ使いみちを見つけてしまったので、小躍りした勢いで書いてしまっただけです。はい。

どっとはらい。
最近いじった branchを出してくれる script

すみません、以下を書いた後、最近の gitはそのための optionがあるよと教えてもらいました:

http://gfx.hatenablog.com/entry/2016/06/10/153747

```
git branch --sort=-authordate
```

ストックしてくださったみな様、申し訳ありません。
このscriptでっち上げた頃はなかったんだよ、といいわけしときます。

### 以下ゴミ

作業してる branchがおおくて、名前が思い出せないわすれっぽい僕へ:

https://gist.github.com/dagezi/bf91c9e7d5c5307c5b47ebd674328c7c

execution bit を立てて pathにいれとくだけです。Mac OSで確認しました。

`-v` はタイムスタンプあると便利だなあ、と思った気がしてつけたんですが、どう役に立つのかはわかりません。
【Android】ProgressDialogを使用する

#【Android】ProgressDialogを使用する

##環境
 - AndroidStudio 2.2.2
 - Java 1.8.0
 - Android 2.3.3

```java:code.java
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("message");
progressDialog.setCancelable(true);
progressDialog.show();

final Handler handler = new Handler();

new Thread(new Runnable() {
    @Override
    public void run() {
        //ここで何らかの処理

        progressDialog.dismiss();

        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(CurrentActivity.this, "message", Toast.LENGTH_SHORT).show();
            }
        });
    }
}).start();
```
NativeScriptでPUSH通知を行いなおかつpayloadの情報を利用する

NativeScriptはちゃんとリモート通知、いわゆるPUSH通知のプラグインが存在する。
いや、PUSH通知がいわゆるリモート通知なのか？　まあどうでもいいす。

プロジェクトトップで、

```shell-session
tns plugin add nativescript-push-notifications 
```

とかやれば、よしなにプラグインをインストールしてくれます。
具体的な使い方は公式のドキュメントがあるので特にここで解説する必要は無いですよね。
https://github.com/NativeScript/push-plugin

ただし！
これだけで終わらないのが世の中のつらいところ。

PUSH通知はアプリが3つの状態の時にやってくる。
すなわち、

1. アプリが起動していない状態
2. アプリが起動している状態
3. アプリが裏に回っている状態

AndroidとiOSでは上記の厳密な意味合いは異なってくるけど、ざっくりすればこんな感じです。

このプラグインを利用すると、2.の時は特に問題ないです。
iOSならregistするときの引数内に指定したコールバック、AndroidならonMessageReceivedで指定したコールバックが呼ばれます。

1.と3.も、Androidなら問題ないです。

iOSの場合は1.と3.のケースでは、プラグインバージョン0.0.17の現在、コールバックが呼ばれません…。
ネイティブコードレベルではdidReceiveRemoteNotificationやdidFinishLaunchingWithOptionsのdelegateはケアしてるみたいなのですが、少なくともうちのiOS9なiPhone5では何も起こりません。

通知バーから単純にアプリを起動するだけならこれでも問題ないのですが、payloadに何か情報を入れてそれを利用したい場合に困る、困りすぎて犬のおまわりさんになってしまう。

色々と模索しましたが、結局1.については自分でなんとかする、3.については理由はよく分からないけどapplicationDidBecomeActiveを自分で用意してやると機能するようになりました。

以下、私がapp.tsに加えた内容です。

```ts:typecript
global.notificationData = null;
if (application.ios) {
    class CustomDelegate extends UIResponder implements UIApplicationDelegate {
        public static ObjCProtocols = [UIApplicationDelegate];

        applicationDidFinishLaunchingWithOptions(application, launchOptions): boolean {
            if (launchOptions) {
                var userInfo = launchOptions.objectForKey(UIApplicationLaunchOptionsRemoteNotificationKey);
                if (userInfo) {
                    global.notificationData = userInfo;
                }
            }
            return true;
        }

        applicationDidBecomeActive(application): void {
        }
    }
    application.ios.delegate = CustomDelegate;
}
```

iOSの定数はそのままではTypeScriptではエラーになってしまうので、適宜declareでダミーを用意してください。
これでglobalにpayloadの情報がNSDictionaryで入ってきますので、あとは好きなタイミングで参照すれば良いです。

ちなみに、Android用のコールバックでは、JSON文字列が返ってきますので、parseする必要があります。
iOSはそのまま連想配列としてアクセスできます。実体はNSDictionaryだと思いますが。
左ボタン、中央ボタン、右ボタンのマウス押下シミュレート

マウス押下のシミュレートは大体の場合 ```$('#hoge').click()``` とか ```$('#hoge').mousedown()``` とかで済んでしまうのだけど、どのボタンが押されたのかまで指定したい場合は MouseEvent オブジェクトを生成すると良い。

## HTML
```html
<div id="hoge">HOGE</div>
```

## JavaScript によるイベント監視
```js
document.getElementById('hoge').addEventListener('mousedown', function(event){
	switch (event.which) {
	case 1:
	    console.log('!! Left !!');
	    break;
	case 2:
	    console.log('!! Middle !!');
	    break;
	case 3:
	    console.log('!! Right !!');
	    break;
	default:
	    console.log('!! No-specified !!');
	}
});
```

## JavaScript によるイベント発行
```js
// 左ボタン押下シミュレート
var leftEvent = new MouseEvent('mousedown', {button: 0});
document.getElementById('hoge').dispatchEvent(leftEvent);

// 中央ボタン押下シミュレート
var middleEvent = new MouseEvent('mousedown', {button: 1});
document.getElementById('hoge').dispatchEvent(middleEvent);

// 右ボタン押下シミュレート
var rightEvent = new MouseEvent('mousedown', {button: 2});
document.getElementById('hoge').dispatchEvent(rightEvent);
```

## 参考
- https://developer.mozilla.org/ja/docs/Web/API/MouseEvent
- https://developer.mozilla.org/ja/docs/Web/API/MouseEvent/MouseEvent
[NVIDIA Jetson TX1] Boot Ubuntu from SATA HDD

## Environment

- NVIDIA Jetson TX1

    https://developer.nvidia.com/embedded-computing
    ![tx1.png](http://images.nvidia.com/content/tegra/embedded-systems/images/jetson-tx1-developer-kits.png)

## PreInstall

- Download JetPack for L4T
    Download from [NVIDIA Developer Site](https://developer.nvidia.com/embedded/jetpack)

- Run JetPack L4T
    - `./JetPack-L4T-2.3-linux-x64.run`
    - Select `TX1 (64-bit)` on `Select Development Environment`
        ![Screenshot from 2016-10-26 14:23:48.png](https://qiita-image-store.s3.amazonaws.com/0/10402/63e30498-7592-09d0-a8fb-c7ee8ad0eb37.png)
    - Press `Clear Actions`
    - Select `Install` on `Flash OS`
        ![Screenshot from 2016-10-26 14:27:17.png](https://qiita-image-store.s3.amazonaws.com/0/10402/47c376d6-a127-aaad-564c-42d79032d2e6.png)
    - After `Flash OS`, please check ubuntu on `TX1` boots up from internal MMC

## Connect SATA HDD to TX1

- Power off TX1
- Connect SATA HDD
- Power on TX1
- Check `sudo blkid /dev/sda1` and returns the result.
- If not format SATA HDD with `ext4` format.

## Change boot entrypoint from `MMC` to `SATA` HDD

- Ensure IP Address of TX1
    - Assumed Host PC is `192.168.0.11`
    - Assumed TX1 is `192.168.0.12`
- Copy Downloaded files by `JetPack L4T`

    ```bash
rsync -avh --progress jetpack_downloads/ ubuntu@192.168.0.12:/home/ubuntu/Downloads
```
    - `jetpack_downloads` exists under the same directory of `JetPack-L4T-X.X-linux-x64.run`

- Login to `TX1`, and create filesystem for SATA HDD

    ```bash
ssh ubuntu@192.168.0.12
cd Downloads
tar xjf TegraXXX_Linux_XXXXXXX.tbz2
cd Linux_for_Tegra/rootfs
sudo tar xjf ../../Tegra_Linux_Sample-Root-Filesystem_XXXXXXX.tbz2
cd ../
sudo ./apply_binaries.sh
sudo mkdir /media/ubuntu/sata
sudo mount /dev/sda1 /media/ubuntu/sata
cd rootfs
sudo cp -a * /media/ubuntu/sata
sync
umount /media/ubuntu/sata
```

- Change Boot Entrypoint to SATA

    ```bash
sudo vi /boot/extlinux/extlinux.conf
```
    edit below part

    ```diff
< ... root=/dev/mmcblk0p1 ...
---
> ... root=/dev/sda1 ...
```

- Reboot TX1

    ```bash
sudo reboot
```

### Check boot on SATA HDD

```bash
ubuntu@tegra-ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       1.8T  3.3G  1.7T   1% /
none            1.8G     0  1.8G   0% /dev
tmpfs           2.0G  168K  2.0G   1% /dev/shm
tmpfs           2.0G  9.3M  2.0G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           400M   68K  400M   1% /run/user/1000
/dev/mmcblk0p1   14G  7.1G  5.9G  55% /media/ubuntu/3b125ac7-4421-421e-b388-8a4a77c491ab
```

Here you can see that root mount point `/` has now `1.7TB` available space of SATA HDD.
You can also see that original `eMMC` partition is mounted on `/media/ubuntu/3b125ac7-4421-421e-b388-8a4a77c491ab`.

### Revert to boot from internal eMMC

In order to boot from `eMMC`, just revert entrypoint to `eMMC` by editing `extlinux.conf`.

```bash
sudo vi /media/ubuntu/3b125ac7-4421-421e-b388-8a4a77c491ab/boot/extlinux.conf
```

change

```diff
< ... root=/dev/sda1 ...
---
> ... root=/dev/mmcblk0p1 ...
```
さくらのクラウドでVPCルータを使ってみる(2)

前回、VPCルータを作成したのでその後をみていきたいと思います。
VPCルータはサーバと同じくコピーなどの処理が行われるらしく、実際に起動できるようになるまで多少時間がかかります。

##VPCルータを起動する
作成直後は停止状態なので電源を入れる必要があります。

![VPCルータ-一覧.png](https://qiita-image-store.s3.amazonaws.com/0/140995/5c8f1b61-74ea-f109-cd77-ccfb26bed71c.png)

電源を入れるルータにチェックを入れて「電源操作」から「起動」をクリックします。
課金対象を起動する旨のメッセージが出るのでそのまま起動させます。

![VPCルータ-一覧-起動.png](https://qiita-image-store.s3.amazonaws.com/0/140995/a871ffc1-1820-f898-6114-ed15719a3cda.png)

##ルータの基本情報

起動できたら中身をみていきます。
情報タブでは現在のプランなどが確認出来ます。
このスクリーンショットでは「スタンダード」プランになっています。

![VPCルータ-情報.png](https://qiita-image-store.s3.amazonaws.com/0/140995/261575f1-d1c2-0235-69e5-e75c45d0eee1.png)

編集ボタンを押してみます。
前回説明したとおり、プランの変更などは出来ません。
余裕があれば是非設定した方がいいのがsyslogサーバで、
VPN接続などで問題が発生した場合の手がかりになります。
(最近、ログ表示のタブが追加されたのですが、好みの表示方法が選択出来るsyslogの方が便利です)

![VPCルータ-情報-編集.png](https://qiita-image-store.s3.amazonaws.com/0/140995/b2ee87c0-daba-38fe-cb97-a4a1f59e82f0.png)

##インターフェース
ここではVPCルータの接続状況を確認出来ます。
それぞれ独立したインターフェースになっており、ローカルIPアドレスも別々に付与できます。
接続出来るのはスイッチのみになります。
(VPCルータ側からもサーバ側からもお互いを選択出来ません)

- グローバル
このスクリーンショットの例はスタンダードプランなので共有セグメントで割り当てられたグローバルIPが編集出来ない状態ですが、
プレミアム以上では「スイッチ+ルータ」で割り当てられたグローバルIPから任意のアドレスを選択・編集できるようになっています。

- プライベート
プライベートはクラウド内のスイッチを接続できるようになっており、
任意のプライベートアドレスとスイッチを選択出来ます。

![VPCルータ-インターフェース.png](https://qiita-image-store.s3.amazonaws.com/0/140995/14404716-93a2-b56b-e472-f37daba59318.png)

鉛筆マークの編集ボタンをクリックすると接続先の変更ができます。
基本的にはここで接続したスイッチにサーバなどを紐付けることになります。
IPアドレスはLAN側のルータアドレスとなるのでVPCルータ経由での通信を行う場合はこのアドレスがゲートウェイになります。
プリフィックスは規模に応じて任意に設定で問題ないでしょう。
尚、この接続操作はVPCルータの電源が入っている状態だと更新に失敗します。
停止状態で行う様にしましょう。

![VPCルータ-インターフェース-編集.png](https://qiita-image-store.s3.amazonaws.com/0/140995/8328ae9b-3ae0-0cb3-0020-477ca668821a.png)

##NAT
このスクリーンショットの例はスタンダードプランなので「スタティックNAT」タブが表示されていませんが、
プレミアムプラン以上ではグローバルインターフェースのIPエイリアスを登録しておけば
そのIPエイリアスを任意のローカルIPに紐付けるスタティックNATが設定出来ます。

スタンダードプランはグローバルIPを一つしか持たないので「ポートフォワーディング」しか設定出来ません。

![VPCルータ-NAT.png](https://qiita-image-store.s3.amazonaws.com/0/140995/5f7be97d-e611-94e6-0906-2e5bc62da6ad.png)

![VPCルータ-NAT-追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/a8d1f1e4-703f-4969-c73d-6fc82a31f260.png)

##ファイアウォール
ファイアウォールはこちらのページ([ファイアウォール設定 – さくらのクラウドニュース](http://cloud-news.sakura.ad.jp/vpc-router/vpc-firewall/))に詳しく解説されています。
VPNは特別に許可しなくても利用時に自動的に許可されるので
ポートフォワーディングかプレミアムプラン以上で利用出来るスタティックNATを利用したときなどが主な設定対象となるはずです。

![VPCルータ-ファイヤウォール.png](https://qiita-image-store.s3.amazonaws.com/0/140995/937fe464-60e0-ca65-13d5-9b657a65c7b9.png)

受信側のルールで宛先ネットワークはNAT後のローカルIP
送信側のルールで送信元ネットワークはNAT前のローカルIP
になるかと思います。
このファイアウォールルールの追加はVPCルータの電源が入っている状態でも反映ボタンをクリックすることで適用されます。
![VPCルータ-ファイヤウォール-追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/7d5f161a-8aca-f8a4-e9e6-beb53fce2612.png)


DHCP以降は次回に続きます。
LOOPを利用して、標準入力から渡されるデータをリストに格納する

とりわけ競技プログラミングなどでは、標準入力から数字や文字列が渡され、それをリストや配列に格納したいということがよくあります。

たとえば次のような5行の整数が標準入力から渡されるとします。

```
1
2
3
4
5
```

`LOOP`を利用しつつ、標準入力から渡される一連の数字をリストに格納したい場合、次のように書けばよいようです。

```cl
(loop for line = (read-line *standard-input* nil nil)
             while line
             collect (parse-integer line))
 ```

汎用性を考えて読み込みには`read-line`を利用していますが、上記の場合は`read`でも構いません。

それにしても`LOOP`マクロがすごい(´・ω・`)。別言語が埋め込まれているとしかおもえないですね。
pandasからBigQueryを扱う

pandasをからBigQueryに保存されているデータを扱うとき、わざわざCSVやJSONを経由したくない場合があります。pandasでは新たにライブラリなどを入れる必要もなく`read_gbq`を使うだけで簡単にBigQueryからデータを読み込むことができます。

## 必要なもの

- 適切な権限の付与されたサービスアカウント (もしくは個人アカウント)
- private key (JSON)
- google-api-python-client

## 事前準備

### サービスアカウントの作成と private key のダウンロード

権限の与えられたアカウントと対応する private key がない場合は作成しておきます。

1. Google Cloud Platform の「IAMと管理」のメニューから「[サービスアカウント](https://console.cloud.google.com/iam-admin/serviceaccounts)」を選択
1. 「プロジェクトを選択」から対象のプロジェクトを選択
1. 「サービスアカウントを作成」でアカウント名・IDを入力し適切な役割を選択
1. 「新しい秘密鍵の提供」にチェックを入れる
1. 「キーのタイプ」で「JSON」を選択（pandasから扱う場合はP12では扱いづらい）

## google-api-python-client のインストール

pip を使う場合は

```
pip install google-api-python-client
```

その他の場合は下記を参考に
[BigQuery API Client Library for Python](https://developers.google.com/api-client-library/python/apis/bigquery/v2#installing-the-client-library)

## 実装例

```python
import pandas

query = 'SELECT * FROM [project-999:dataset.table]'
project_id = 'project-999'
private_key = '/path.to/private_key.json'  # pathでもJSON形式の文字列でもいい

pandas.read_gbq(query, project_id=project_id, private_key=private_key)
```

## 参考

ドキュメント: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.gbq.read_gbq.html
Vagrantで外部のサーバを管理する

# Vagrantは
VrituaBoxの仮想環境を作ったり、壊したりし放題な便利なツール…。**だけではありません！**

この手のツールでは当たり前の話ではありますが、プラグインで機能を拡張できます。
`managed-servers`というプラグインをインストールすると、外部のサーバをVagrant配下に置けるようになります。

## 何が嬉しいの？
- 他のVagrant配下にある仮想マシンと同じコマンドでマシンを操作できる。
- Vagrantの仮想マシンの連携機能が使える。
  - 特にプロビジョニングツール（Ansibleなど）との連携機能が使えるのが便利。

ということでやってみましょう。

# インストール方法
プラグインをインストールするだけです。コマンド1発でOK。

```bash
$ vagrant plugin install vagrant-managed-servers
```

# 設定方法
```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "tknerr/managed-server-dummy"

  config.vm.provider :managed do |managed, override|
    managed.server = "<server name or IP address>"
    override.ssh.username = "vagrant"
    override.ssh.private_key_path="./path/to/id_rsa"
  end

  config.vm.provision "shell", inline: <<-SHELL
    if [ ! -f /usr/bin/python ]; then
      apt-get update
      apt-get install -y --no-install-recommends python
    fi
  SHELL

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.extra_vars = {
      ansible_python_interpreter: '/usr/bin/python2'
    }
  end
end
```
通常と違うのは以下の点です。

- boxにはダミーで用意されている`tknerr/managed-server-dummy`を指定すること。
- providorセクションに`managed`を指定して、`managed.server`に接続先サーバ名を指定すること。
- `override.ssh.username`, `override.ssh.private_key_path`で接続先sshユーザ名と秘密鍵を上書き指定すること。

# コマンド
## リンクの確立
まずは最初に通常のVagrantと同様に

```bash
$ vagrant up
```
を実行します。
サーバが外部にあるわけですから、実際に電源が入るわけではありません。sshの接続テストが行われて成功すれば管理情報が作成されます。

```bash
Bringing machine 'default' up with 'managed' provider...
==> default: Linking with managed server <server name>
==> default:  -- Server: <server name>
```

この状態でstatusを確認してみましょう。

```bash
$ vagrant status
Current machine states:

default                   running (managed)

The managed server is running. To ssh into this machine, you can run
`vagrant ssh`. To provision the machine, you can run `vagrant provision`.
```

うん。当然ですね。

## ssh接続
当たり前のように`ssh`コマンドが使えます。

```bash
$ vagrant ssh
```

## プロビジョニング
`up`コマンド時にはプロビジョニングは行われません。
`provision`コマンドで明示的に実行することが必要です。

```bash
$ vagrant provision
```

## マシンの再起動
`reload`コマンドが使えます。

```bash
$ vagrant reload
```

なぜか`halt`コマンドには対応していません。
間違ってリモートで電源を落としてしまうと再起動できなくなってしまいますので、その事故防止のためあえて未実装にしてるのかもしれません。
（sshで中に入って、`halt`コマンド実行すれば良いだけですし…。）

## Vagrantの管理下から外す
`destroy`コマンドを実行します。

```bash
$ vagrant destroy
==> default: Unlinking from managed server <server name>
==> default:  -- Server: <server name>
$ vagrant status
Current machine states:

default                   not linked (managed)

The managed server is not linked.
```

当然ですが、管理情報が消えるだけでリモートのマシンが削除されるわけではありません。
`up`コマンドでまたリンクを確立することが出来ます。


# 参考
- [本家](https://github.com/tknerr/vagrant-managed-servers)
PHPでもEmmetを使ってHTMLを展開する方法

##PHPでEmmetが使えなくて泣きそうになったあげく解決したのでメモ。

私の環境は以下の通りです。
・OS Windows
・Editor Atom

##解決方法
<br/>1. 設定からキーバンドを確認
<br/>2. Emmet展開のキーバインドをコピー（赤丸で囲んだ箇所をクリックすればコピーできます）
![01.png](https://qiita-image-store.s3.amazonaws.com/0/141872/7639caa3-309c-c230-1242-f0a20df56e00.png)
<br/>3. キーマップに貼り付け
![02.png](https://qiita-image-store.s3.amazonaws.com/0/141872/7ab955c5-da0b-9e9e-9d7b-6b257e40e70c.png)
<br/>4. PHPでも展開できるように以下を追加します
```atom-text-editor[data-grammar~="php"]:not([mini])```

追加後です。以下をコピペでもOK

```cson:keymap.cson
{
'atom-text-editor[data-grammar="text html basic"]:not([mini]), atom-text-editor[data-grammar~="erb"]:not([mini]), atom-text-editor[data-grammar~="jade"]:not([mini]), atom-text-editor[data-grammar~="css"]:not([mini]), atom-text-editor[data-grammar~="stylus"]:not([mini]), atom-text-editor[data-grammar~="sass"]:not([mini]), atom-text-editor[data-grammar~="scss"]:not([mini]), atom-text-editor[data-grammar~="php"]:not([mini])':
  'tab': 'emmet:expand-abbreviation-with-tab'
}
```

これで無事にPHPでも展開できました。
他にも解決策があるのかもしれませんが、取り急ぎこのまま使おうと思います。
* * *
####ちなみに、今回うまくいかなかった方法
snippets.jsonに以下を追記。

```json:snippets.json
{
    /////いろいろ設定が書いてありますが最終行に追加/////

    ,"php": {
        "extends": "html"
    }
}
```
参考：[AtomエディタのEmmetで、PHPファイルでもHTMLスニペットを使う](http://qiita.com/kijtra/items/09e14b83e4bed428f71e)
いろいろ記事を調べて出てくるのが上記の方法だったのですが、これはうまくいきませんでした。（泣）
その代わり別な設定方法が学べたので良かったです、ありがとうございます。

うまくいかないことがありましたらお知らせください。
C#:エマープでかつ上昇数を求める


## エマープでかつ上昇数とは  

素数を逆転させた数もまた素数である自然数のことを 「エマープ(Emirp)」と言います。 

例えば、167 は、素数ですが、これを反転した 761 も素数であり、この２つはエマープです。 Prime(素数)という単語を 反転させると Emirp になるので、そう呼ばれているそうです。 

また、1479のように、左から右へどんどん大きな数字になってゆく数を、ここでは「上昇数」と呼ぶことにします。 

## エマープでかつ上昇数を求めるには

さて、エマープでかつ上昇数を求める方法ですが、 1 から 123456789 までのすべての数字に対して、一つずつ条件を満たすかを調べていては 効率が悪すぎます。

そのため、「全ての上昇数を求め、それが、エマープかどうかを調べる」という方法で、答えを見つけることとします。

## C#のコード

```csharp:RisingEmirpNumbers.cs
    class Program {
        static void Main(string[] args) {
            var solver = new RisingEmirpNumbers();
            foreach (var n in solver.Solve().OrderBy(s => s.Length))
                Console.WriteLine(n);
        }
    }

    public class RisingEmirpNumbers {
        // 問題を解く 答えは文字列として列挙する
        public IEnumerable<string> Solve() {
            int[] nums = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            foreach (var s in GetRisingNumbers("", nums)) {
                if (IsEmirp(s))
                    yield return s;
            }
        }

        // 上昇数 を求める 再帰メソッドの中で、yield return を使っている。
        private IEnumerable<string> GetRisingNumbers(string rn, IEnumerable<int> nums) {
            if (nums.Count() == 0)
                yield break;
            int i = 0;
            foreach (var n in nums) {
                i++;
                string s = rn + n.ToString();
                yield return s;
                foreach (var r in GetRisingNumbers(s, nums.Skip(i)))
                    yield return r;
            }
        }

        // エマープか？
        private bool IsEmirp(string s) {
            if (s.Length >= 2 &&
                PrimeNumber.IsPrime(long.Parse(s)) &&
                PrimeNumber.IsPrime(long.Parse(ReverseString(s))))
                return true;
            return false;
        }

        // 文字列を反転する
        private string ReverseString(string s) {
            return new string(s.Reverse().ToArray());
        }
    }
```

上記コードの説明を簡単にします。

#### Solveメソッド
エマープでかつ上昇数をすべて列挙するメソッドです。このメソッドは、上昇数を列挙し、その値が、エマープかどうかを調べています。


#### GetRisingNumbersメソッド
上昇数を列挙するメソッドです。`IEnumerable<string>` 型を返す再帰メソッドとなっています。 メソッドの第1引数には、上昇数の途中結果が渡されます。初期値は 空文字列です。 第2引数には、上昇数で利用できる数字が小さい順に格納されている `IEnumerable<int>` 型です。 初期値は、 { 1,2,3,4,5,6,7,8,9 } です。

例えば、第1引数に "24" という文字列が渡された時には、 第2引数には、{ 5,6,7,8,9 } が渡されます。

再帰メソッドで、`IEnumerable<T>` を戻り値にする方法については、僕のブログの記事「[再帰メソッドで、yield returnしたい](http://gushwell.ldblog.jp/archives/51962603.html)」を読んでください。 

#### IsEmirpメソッド
素数判定は、「[ミラー・ラビン素数判定法による素数判定メソッド](http://qiita.com/gushwell/items/ff9ed83ba55350aaa369)」で示したクラスを使って素数判定をしています。この `PrimeNumber.IsPrime`メソッドと下記の文字列を反転する`ReverseString`を使い、エマープかどうかを判定しています。 

#### ReverseStringメソッド
LINQの Reverse拡張メソッドを利用し反転させ、文字列に変換しています。 
これを拡張メソッドとして定義すれば、 `string rs = s.ReverseString();` なんて書けますね。 


これらのメソッドができあがれば、Solveメソッドを書くのは簡単ですね。 


## 結果

上記コードを実行した結果(エマープでかつ上昇数の一覧)です。

<pre>
13
17
37
79
149
157
167
179
347
359
389
1237
1249
1259
1279
1789
3467
3469
12689
13457
13469
13789
15679
34589
345689
1235789
</pre>

-------------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
既存ホストへ監視テンプレートのリンクを自動作成する

# 目的
監視対象とするホストに任意の監視テンプレートとのリンクを作成する
# 方法
新規登録するホストであれば、active-checkにより自動登録で済むが、active-checkでは既存ホストへは対応できない為、NWディスカバリを使用する
# 設定
* ディスカバリルールを作成する
    * プロキシを使用できるのでAWSのVPC毎に設置したProxyサーバ経由でも利用できる
    * IPrange、Delayは要件毎に適宜設定するのが好ましい
        * 大きなレンジだと1つのプロセスがそれを実行するので、処理に時間がかかり、スケジュールどおりにならないことがある。
            * StartDiscoverersを増やしても効果はない
    * ディスカバリ用チェックにはZabbi-agentを選択し、[キー](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/items/supported_by_platform)はsystem.hostnameを指定
    ![discovery1.png](https://qiita-image-store.s3.amazonaws.com/0/58788/47ce67fe-ec6d-49f2-6a30-ec284bf8ae2f.png)

    * ディスカバリに使用するサポートされているチェックアイテムは複数ある
![Screenshot from 2016-10-26 19:39:48.png](https://qiita-image-store.s3.amazonaws.com/0/58788/b536cea2-d017-0f06-8aa6-257795f2463c.png)

* イベントソースをディスカバリにした自動アクションを作成する
![Screenshot from 2016-10-26 20:02:41.png](https://qiita-image-store.s3.amazonaws.com/0/58788/14eba1d2-f3fe-ac9e-09d1-ac8795ef11de.png)
    * 条件を作成
        * 作成したディスカバリルールを使用し、それで取得した値にexampleという文字列を含む
![Screenshot from 2016-10-26 20:06:19.png](https://qiita-image-store.s3.amazonaws.com/0/58788/64718d26-2c01-189e-ee42-d980a8c433f9.png)
    * 任意の監視テンプレートとのリンクを作成する実行内容を作成
![Screenshot from 2016-10-26 20:07:55.png](https://qiita-image-store.s3.amazonaws.com/0/58788/d9478629-6da8-5f94-4fbd-d5c6a03d9219.png)

# まとめ
NWディスカバリを使用することで、既存ホストへの設定はほぼ自動で処理できるようしたが、zabbix-serverのチューニングも必要になるケースがあると思います。

# 参考
[全自動Zabbix完全版](http://qiita.com/qryuu/items/39548aa77ef0e8152630)
仮想環境のゲストOS(Linux)でTomcatの起動がとても遅いときの対応方法

仮想環境のゲストOS(Linux)でTomcat(正確にはJavaVM?)の起動がとても遅いときの対応です。

私がぶちあった例はKVM上のゲストOS(CentOS 7, CPU2, mem 4GB)で
インストール直後のデフォルトのTomcat 8が起動に20分近くかかりました。
(VMWareなどでも起きるようです。)

# まず疑うことは2つです。

- メモリ不足
- エントロピー不足

# 切り分け

1. tomcatを起動する
2. 下記を実行して、出てきた数値(エントロピー)を確認する。  
   ※念のため数秒程度監視してください。

```
# cat /proc/sys/kernel/random/entropy_avail
```

でてきた数値が1000以下になっていたら、エントロピー不足です。

## エントロピー不足の対応

1. [Haveged](https://wiki.archlinuxjp.org/index.php/Haveged)をインストールしてください。
2. もしくは[乱数生成に伴う JVM の遅延の回避](http://otndnld.oracle.co.jp/document/products/E13153_01/wlcp/wlss40/configwlss/jvmrand.html)を行ってください。

※ どちらかだけを対応すればOKなはずです。

これで解決しない場合はメモリ不足ですので、KVMマシンのメモリ割り当ての確認と
Tomcatの起動オプションを確認しましょう。
（調べればいくらでも情報はでてきますので割愛します。）


少し話はそれますが、Linuxのエントロピーの生成方法を調べると原因がよくわかります。
[Linuxで扱う乱数に関する話](http://blog.daionet.gr.jp/knok/2014/12/04/random-numbers-on-linux/)の「仮想化の問題」を参照

ぱっと調べてでてこなかったので、これで苦労する人が減ることを祈ります。
Linuxでサービス自動起動の設定(覚え書き)

# 自動起動を設定できるサービスを確認する
サービスを起動するrcスクリプト(シェルスクリプト)が収められている。

```c:コマンド
$ cd /etc/init.d
$ ls
mysqld redis nginx ....
```

# サービス自動起動の設定をする
今回設定するのは、mysqld・redis・nginx。

```c:コマンド
$ sudo chkconfig mysqld on
$ sudo chkconfig redis on
$ sudo chkconfig nginx on
```

# サービス自動起動が設定されていることを確認する
各ランレベルに対応したディレクトリが用意されている。
[ランレベル](http://webkaru.net/linux/run-level/)
/etc/init.d内のrcスクリプト(シェルスクリプト)へのシンボリックリンクを作って利用する。
※上記コマンドを実行すると、シンボリックリンクが作成される。
※Sxx(rcスクリプト名)のように先頭にSが付いているものが実行され、xxは実行される順番。

```c:コマンド
$ cd /etc/
$ rc5.d
$ ls
lrwxrwxrwx 1 root root 16 10月 26 09:42 S64mysqld -> ../init.d/mysqld
lrwxrwxrwx 1 root root 18  9月 23 10:01 S80sendmail -> ../init.d/sendmail
lrwxrwxrwx 1 root root 15 10月 26 09:42 S85nginx -> ../init.d/nginx
```
【ubuntu-make】 Ubuntuでいろいろな開発環境をらくらく構築

**この記事でのUbuntu Makeのバージョンは16.09です**
## 長い前置き
きっかけは１年ほど前でした。Androidアプリの開発をしようと思い、開発環境構築の記事を漁っていると[こんなページ(第372回　Ubuntu Makeで簡単にAndroid開発環境を構築する：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社)](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0372)を見つけました。

その時[`ubuntu-make`](https://wiki.ubuntu.com/ubuntu-make) というものを知りましたが、当時は対応プラットホームが少なく、僕もプログラミング歴が浅かったのもあってか、あまり印象に残っていませんでした。

Ubuntu 16.04(Xenial Xerus)がリリースされ、ぐちゃぐちゃのファイルたちとバイバイするためにクリーンインストールしました。

そして、またしても Android Studio を入れようと思い、ubuntu-makeをPPAを追加し、インストールしました。

そしてヘルプコマンド(`$ umake --help`)を見てみたときのことです。

……あれ？なんか増えてね？

[こちら](https://wiki.ubuntu.com/ubuntu-make#Supported_platforms)に書いてありますが、 VSCode や Atom 、さらには Unity や Swift までコマンド一行でインストールできるようになっていたのです。

そこで、記事にまとめてみることにしました。

## 本題
### インストール方法
Ubuntu 16.04はもうインストールされているのですが、バージョンが古いのでアップデートする必要があります

```bash
sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get install ubuntu-make
```

### 使い方
パッケージ名はubuntu-makeなのにコマンドは`umake`です。短くて打ちやすいですがややこしいです。
#### インストール
```bash
umake [コマンド] [プラットフォーム名]
```
#### アンインストール
```bash
umake [コマンド] [プラットフォーム名] -r
```
#### ヘルプ
```bash
umake --help
```

### インストール可能なプラットフォーム
さて、ここまで読んできて、コマンドやプラットフォーム名ってなんだ……？とお思いだと思います。

プラットフォームはインストールするもの、コマンドはそれらの種類と言ったところでしょうか。

- `コマンド`
  - `プラットフォーム名` 

という形でまとめていきます。

- `android`
  - `android-sdk` SDK
  - `android-studio`
  - `android-ndk`
- `kotlin`
  - `kotlin-lang` :スタンドアロン型Kotlinコンパイラ
- `swift`
  - `swift-lang` :Swiftコンパイラ
- `ide`
  - `clion` CLion integrated C/C++ IDE
  - `visual-studio-code` Visual Studio focused on modern web and cloud
  - `eclipse-php` Eclipse PHP IDE
  - `eclipse-cpp` Eclipse C/C++ IDE
  - `datagrip` DataGrip SQL and databases IDE
  - `phpstorm` PHP and web development IDE
  - `eclipse-jee` Eclipse JEE IDE
  - `arduino` The Arduino Software Distribution
  - `lighttable` LightTable code editor
  - `pycharm-educational` PyCharm Educational Edition
  - `pycharm-professional` PyCharm Professional Edition
  - `eclipse` Eclipse Java IDE
  - `pycharm` PyCharm Community Edition
  - `rubymine` Ruby on Rails IDE
  - `idea-ultimate` IntelliJ IDEA
  - `sublime-text`  Sophisticated text editor for code, markup and prose
  - `atom` GitHub Atom
  - `idea` IntelliJ IDEA Community Edition
  - `netbeans` Netbeans IDE
  - `webstorm` Complex client-side and server-side javascript IDE
- `go`
  - `go-lang`
- `dart`
  - `dart-sdk` Dart SDK
- `games`
  - `superpowers` HTML5 2D+3D ゲームメイカー
  - `unity3d` みんな大好きUnity(DEじゃない方の)
  - `stencyl`
  - `twine`
- `nodejs`
  - `nodejs-lang` Node.js
- `rust`
  - `rust-lang`
- `web`
  - `firefox-dev` Firefox Developer Edition
  - `visual-studio-code` VSCode
- `scala`
  - `scala-lang`

……なんかもういっぱいありすぎてすごいです（語彙力）。
投稿のタグも上限が５つなのでどれをつければいいのか迷いました。
とりあえず Android Studio、Eclipse C++、Unityを入れていみましたが今の所は特に問題なく動いています。