OmniAICreator/Qiita-1.07M huggingface dataset:
Oculusの映像をモニター用に出力する


Oculus は体験者にしか映像が見えないため、イベントなどの場合は、Oculus の映像をミラーリングで出力するのが一般的かと思います。

しかし Oculus は二眼の映像になっていて、そのまま表示してもあまり見栄えが良くないです。
そこで出力用のアプリを用意して、きれいな一眼映像を表示できるようにします。

![img.png](https://qiita-image-store.s3.amazonaws.com/0/20773/2e6b68f8-39bd-d1be-87be-4decbe2e4c23.png "img.png")


2つのアプリのカメラを同期させる
---------------
Oculus用と出力用アプリ、それぞれのカメラの位置と角度を OSC、WebSocket などで同期させます。
Unity の NetworkView であればスクリプトをほぼ書かずに済むので、今回はこの方法を紹介します。

(OculusUnityIntegration)[https://developer.oculus.com/downloads/] をインポートしたプロジェクトを例にして進めます。

基本的には、同期させたいものに NetworkView を追加していくことになります。


Oculus カメラ側シーンをつくる
---------------
まずは、Oculsu カメラ側の制御として、Tuscany/Scenes/VRDemo_Tuscany を開きます。
ヒエラルキーの OVRPlayerController と、OVRPlayerController/OVRCameraRig/LeftEyeAnchor に NetworkView コンポーネントを追加します。

![oculus-inspector.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/6dda8491-5158-793c-f000-1a6841329f6a.jpeg "oculus-inspector.jpg")


__赤枠の GameObject が同期される__

次に、Oculus カメラ側をサーバーとする、スクリプトを作成します。
NetworkCameraServer.cs を新規作成し、OVRPlayerController に追加します。

```c#:NetworkCameraServer.cs
using UnityEngine;
using System.Collections;

public class NetworkCameraServer : MonoBehaviour
{
    public int portNumber =  9999;

    void Start ()
    {
        Network.InitializeServer (4, portNumber, true); 
    }
}
```

Screen カメラ側シーンをつくる
---------------

続いてプロジェクトペインの Tuscany/Scenes/VRDemo_Tuscany を複製し、出力用シーンを作ります。
複製したシーンのヒエラルキーにある OVRカメラを削除し、通常のカメラを配置します。
空の GameObject を作成し、構造を OVRカメラと似せておきます。
そして先ほどと同様に NetworkView コンポーネントを追加します。

![screen-inspector.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/d4706d51-1927-2469-6baf-431a409730fb.jpeg "screen-inspector.jpg")


クライアント用スクリプトを作成し、追加します。
IPとポートは適宜変更してください

```c#:NetworkCameraClient.cs
using UnityEngine;
using System.Collections;

public class NetworkCameraClient : MonoBehaviour
{
    public string connectionIP =  "127.0.0.1";
    public int portNumber =  9999;

    void Start ()
    {
        Network.Connect (connectionIP, portNumber);
    }
}
```

以上で準備は完了です。

アプリケーションにする
---------------

それぞれのシーンを別々のアプリとして書き出します。
同一PCで使用するのであれば、バックグラウンドで実行できるようにしておきます。

![player-setting.png](https://qiita-image-store.s3.amazonaws.com/0/20773/9d9c5a88-15b3-b39b-be61-213c79ca3597.png "player-setting.png")


サーバーとなる、Oculus カメラのほうから起動させます。
接続が成功していると、Oculus の動きに合わせて、出力用カメラが回転します。

![app.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/1aef4839-6f2b-a3ef-0e4b-2225bcffe449.jpeg "app.jpg")
JUnitのテストの階層化と@InjectMocks

Springで開発していると、テストを書くときにmockを注入したくなります。

```
public class HogeService {
  @Autowired
  private HogeDao dao;  //これをモックにしてテストしたい
}
```

JUnitでテストを階層化するやり方でよく知られているのは、Enclosed.classというランナーを使うやり方です。


```
@RunWith(Enclosed.class)
public class HogeServiceTest {
  public static class 参照系 {
  }
 
  @RunWith(Enclosed.class)
  public static class 登録系 extends HogeServiceTestBase {
       //こういう風に、static classをネストしていくことで構造を持たせられる
       public static class 重複データがある場合 {}
  } 

}
```

こうした場合、mockを定義する基底クラスは下記のようにしたくなるのですが、これだとうまくいきません。理屈はおさえていないですが、staticにしているのがだめな原因のようです

```
public class HogeServiceTestBase {
　//階層化されたクラスはstaticなので、呼び出せるようにするにはstaticにする必要あり　
  @Mock 
  protected static HogeDao mockDao; 

  @InjectMocks
  protected static HogeService service;

  @Before
  public void setMocks() {
    MockitoAnnotations.initMocks(this)
  }
}
```

さくっとmockを注入したいし、テストの階層化もしたいと調べたところ、別のテストランナーを使えば、static classにしなくてもテストの階層化ができるようです。

**HierarchicalContextRunner.class** です。
https://github.com/bechte/junit-hierarchicalcontextrunner/wiki

このテストランナーなら、中のclassをstaticにしなくてもテストの階層化ができます。なので、モックの変数からもstaticがはずせて、モックのインスタンス化と注入が昨日するようになります。

現時点で最新のJunit4.12のもとで、下記のdependencyを加えることで利用できます。

```
<dependency>
  <groupId>de.bechte.junit</groupId>
  <artifactId>junit-hierarchicalcontextrunner</artifactId>
  <version>4.12.0</version>
  <scope>test</scope>
</dependency>
```


*参考サイト*
http://kamegu.hateblo.jp/entry/junit4.12-context-nest
http://kyon-mm.hatenablog.com/entry/2014/08/05/175032
フォームエディタでタブオーダー(TabIndex)を一気に付け直す



1. 「表示」から「タブオーダー」を選択
1. "1", "2" とか "3.1.2" といったような数字が書かれた青い四角が各コントロールの上に表示される
1. 順番にその青い四角をクリックする
Perlで作るユーザデーモン

# Perlが提供するデーモンのフレームワーク #

Ubuntu 14.10のパッケージで、perlとdaemonをキーに検索すると、以下がヒットします。
この中でも私がデーモンの実装に便利だと感じたlibdaemon-generic-perlが提供するDaemon::Genericを紹介します。

	libhttp-daemon-perl - simple http server class
	libapp-daemon-perl - Perl module to start an Application as a Daemon
	libdaemon-control-perl - module for creating init scripts in Perl
	libdaemon-generic-perl - framework to provide start/stop/reload for a daemon
	libhttp-daemon-ssl-perl - A simple HTTP server class with SSL support
	libnet-daemon-perl - Perl module for building portable Perl daemons easily
	libproc-daemon-perl - module for running scripts as daemons
	libmoosex-daemonize-perl - Moose ベースのアプリケーションをデーモン化するモジュール

# Daemon::Genericの特徴 #

Daemon::Genericは、以下の特徴を持ちます。

* Object Orientedで実装したフレームワークを提供

	* メイン処理部分メソッド(**gd_run**)をオーバライドすることで、手早くオリジナルのデーモンを作成可能

* System-Vスタイルに沿った以下のコマンドを標準提供
	<dl>
		<dt>start</dt><dd>デーモンがランニング状態でない場合、デーモンを開始します。</dd>
		<dt>stop</dt><dd>デーモンを停止します。</dd>
		<dt>reload</dt><dd>コンフィグレーション・ファイルの再読み込みします。</dd>
		<dt>restart</dt><dd>実行中のデーモンを停止して、新しいインスタンスのデーモンを開始します。</dd>
		<dt>check</dt><dd>コンフィグレーション・ファイルのチェックを行って、デーモンの状態を表示します。</dd>
		<dt>help</dt><dd>使用方法を表示します。</dd>
		<dt>version</dt><dd>バージョン情報を表示します。</dd>
		<dt>install</dt><dd>root権限でコールすると、System-Vスタイルのスクリプトとして/etc/init.d配下へのシンボリック・リンクを張ります。</dd>
		<dt>uninstall</dt><dd>root権限でコールすると、/etc/init.d配下へのシンボリック・リンクを削除します。</dd>
	</dl>

# Daemon::Genericのインストール #

以下のコマンドを実行するのみです。

`$ sudo apt-get install libdaemon-generic-perl`

# Daemon::Genericの実装 #

## Daemon::Genericの使用方法 ##

Daemon::Genericで、デーモンを実装するには、gd\_runメソッドをオーバーライドして、newdaemonをコールするだけです。
ただし、gd\_runの中身は、無限ループにする必要があります。例えば、以下のように。

```perl
#!/usr/bin/perl

use Daemon::Generic;

sub gd_run {
	while(1) {
		# write main routine here
		sleep(60);
	}
}

newdaemon();
```

## Daemon::Genericでユーザデーモンを実装するために ##

Daemon::Genericは、System-Vスタイルの慣例に従って、デーモン実行時のpid情報を/var/run配下に保存しようとします。しかし、一般ユーザ権限では、/var/run配下への書き込み権限がないため、デーモンの実行に失敗します。
Daemon::Genericでは、newdaemonの引数に、`pidfile`キーとその値を指定することで、pidの保存先を変更することができます。例えば、$HOME配下に隠しファイルとしてpidファイルを準備するには、以下のように指定します。

```perl
sub gd_run {
    # ...
}

newdaemon(pilfile => $ENV{HOME} . "/.mydaemonPid");
```

ただし、将来的にコンフィグレーション・ファイルを使用予定がある場合は、`progname`キーと`pidbase`キーを使用することをお勧めします。指定方法の詳細は、`man Daemon::Generic`でオンライン・マニュアル参照してください。

# Daemon::Genericの実装例 #

最後に、Daemon::Genericの実装例として、30秒毎にエポックタイムを画面通知するユーザデーモンのソースコードを以下に示します。

```perl:daemon.pl
#!/usr/bin/perl -w

use 5.14.1;
use strict;
use utf8;
use Daemon::Generic;
use File::Basename;

sub gd_run {
    while(1) {
        system('/usr/bin/notify-send', 'DaemonTest', 'Epocime in seconds from 1970/1/1: ' . time);
        sleep(30);
    }
}

my $prg;
($prg) = fileparse($0);
my $pidfile = $ENV{HOME} . "/." . $prg . "_pid";
newdaemon(pidfile => $pidfile);
```

そして、実行方法は、以下となります。

`$ ./daemon.pl start`
【VS2005】環境設定


## キーボード・ショートカット

「ツール(T)」－「オプション(O)...」で出てくる「オプション」ダイアログボックスで「環境」－「キーボード」で確認できる。

##### 既定のショートカット

|||
|:--|:--|
|編集, メンバの一覧|Ctrl+J|
|編集, パラメータヒント|Ctrl+Shift+Space|
|編集, パラメータヒントのコピー|Ctrl+Shift+Alt+C|
|編集, パラメータヒントの貼り付け|Ctrl+Shift+Alt+P|
|編集, クイックヒント Ctrl+K|Ctrl+I|
|編集, 入力候補|Ctrl+Space|
|編集, 定義へ移動|F12|
|表示, 戻る|Ctrl+-(ハイフン) <br>F12を押した後にカーソル移動してなければ、このショートカットで元へ戻れる|
JenkinsのjQueryプラグインでTableSorterをつかう


## 準備

- [TableSorter](http://tablesorter.com/docs/)

- Jenkinsに[jQueryプラグイン](https://wiki.jenkins-ci.org/display/JENKINS/jQuery+Plugin)をいれておく。

## 導入

(実際に使ったのはRich Text Publisherの中で呼んでるHTML内)

- 出力するHTMLにjQueryを読み込む文は書かない。表示が崩れる。

- tablesorterのjsファイルは読み込む。

- $じゃなくてQをつかう。

こんな感じ(↓のコードは参考文献を改変)。

```
<script type="text/javascript">
   Q(document).ready(function() 
       { 
           Q("#sampleTable").tablesorter();
       } 
   ); 
</script>
```

### 参考文献
[Tablesorterで HTMLの表をソート(並び替え)可能にする [ホームページ作成] All About](http://allabout.co.jp/gm/gc/434260/)

## 何がしたかったのか
RedmineのREST APIを使ってチケットをもってくる
スクリプトでCSV化
トラッカーごとまとめた表形式でJenkinsのジョブのページに表示
でも細かく分類するのは面倒だったし時間もなかったし

できる人はもっといい方法を思いつくんだろうけど今の自分にはこれが限界
Raspberry Pi 2 Model B で物理モデル音源を鳴らす


# 概要

この記事では、Raspberry Pi 2 Model B に、STK (The Synthesis ToolKit) をインストールし、USB MIDI キーボードを使って、物理モデリング音源を鳴らすまでの方法を説明しています。

# STK (The Synthesis ToolKit)

[STK](https://ccrma.stanford.edu/software/stk/) は、C++ で実装された、[物理モデル音源](http://ja.wikipedia.org/wiki/物理モデル音源) を含む、オープンソースのライブラリです。マルチプラットフォームに対応しているため、Mac や iOS, Windows, Linux などで利用することができます。今回紹介する物理モデル音源以外にも、様々な音源のサンプルコードが含まれているので、私のお気に入りライブラリのひとつです。

この記事では、このライブラリを Raspberry Pi 2 へ組み込み、小さな物理モデル音源モジュールに見立てて音を鳴らしてみます。

# STK のコンパイルに必要なライブラリのインストール

あらかじめ、STK のコンパイルに必要な、ALSA の開発用ライブラリを、Raspberry Pi にインストールしておきます。

> $ sudo apt-get install libasound2-dev

# STK をダウンロード

以下のページから、STK のアーカイブをダウンロードします。
https://ccrma.stanford.edu/software/stk/download.html

Raspberry Pi に組み込まれている Web ブラウザからダウンロードするか、手元のコンピュータでダウンロードしたものを、scp などで Raspberry Pi に転送してください。

# コンパイル

アーカイブを展開してコンパイルします。

> $ tar xvzf stk-4.5.0.tar.gz
> $ cd stk-4.5.0
> $ ./configure --with-alsa
> $ make

無事コンパイルが終了すれば、音源の準備は完了です。

# MIDI キーボードの接続確認

音源を鳴らすための MIDI キーボードを準備します。USB MIDI キーボードを、Raspberry Pi の USB 端子に接続します。そして、次のコマンドを入力して、接続したキーボードが、STK 上で何番目のデバイスに割り当てられたかを確認します。

> $ projects/examples/midiprobe

次のような画面が表示されます。

![スクリーンショット 2015-02-09 21.16.47.png](https://qiita-image-store.s3.amazonaws.com/0/45254/541cd850-a269-840a-278e-c26bf5a5c445.png)

ここで繋いだのは KORG microKEY-25 ですので、Input Port #2 および Output Port #2 として認識されていることがわかります。ここで調べた番号を、後ほど、音源起動スクリプトで指定しますので覚えておいてください。

# 音源起動

STK を使って作られたサンプルプログラムが、projects/demo 内にあります。Physical が、物理モデル音源のサンプルプログラム（を起動するためのスクリプト）です。

このスクリプトを若干修正して、先ほど繋いだ MIDI キーボードからの入力を受けられるようにします。

> $ cd projects/demo
> $ vi Physical
>
> 変更前：wish < tcl/Physical.tcl | ./demo Clarinet -or -ip
> ↓
> 変更後：wish < tcl/Physical.tcl | ./demo Clarinet -or -ip **-im 2（追加）**
> ※ -im オプションには、前節の midiprobe コマンドで調べた MIDI キーボードの番号を設定します。

スクリプトの修正を終えたら、音源を起動します。

> $ ./Physical

次のような画面が表示されます。

![スクリーンショット 2015-02-09 21.24.34.png](https://qiita-image-store.s3.amazonaws.com/0/45254/95155264-4711-2417-49c7-82ab9a9e6df7.png)

ここで、MIDI キーボードを演奏すると、Raspberry Pi のヘッドフォン端子に接続したイヤホン／スピーカから、クラリネット（っぽい）音が出てくると思います。画面上部のボタンで、音色を切り替えることができます。また、画面のスライダーを動かして、物理モデルのパラメータを変えることができます。

# 同時発音数を増やす

この設定では、同時に 1 音だけしか発音できません。少し発音数を増やしてみます。起動スクリプトを修正して、オプションを追加します。

> $ vi Physical
>
> 変更前：wish < tcl/Physical.tcl | ./demo Clarinet -or -ip
> ↓
> 変更後：wish < tcl/Physical.tcl | ./demo Clarinet -or -ip -im 2 **-n 3（追加）**
> ※ -n オプションに、最大同時発音数を指定します。

私の手元の実験では、3 音までなら問題なく発音できるようです。4 音を超えると、ノイズが発生します。

# まとめ

この記事では、Raspberry Pi 2 で STK を動作させ、物理モデル音源に見立てて MIDI キーボードから演奏するまでの方法を紹介しました。

実際に音源として利用するためには、電源投入で自動的に音源プログラムが起動されるようにしたほうが良いでしょう。また、Raspberry Pi のヘッドフォンアウトは音質が悪いため、外部 Audio I/O を利用するなどしたほうが良いでしょう。
django on ubuntu via vagrant host

Vagrantで立て終わったUbuntu Guest OS上でdjango wepappを動かしてみた時の記録。
apache用の資材置く先とか怪しいので間違いが判明次第適宜直します。

# 環境

django 1.6.1
apache2 2.4.7
libapache2-mod-wsgi 3.4

vagrant 1.7.2
Vagrant Guest: Ubuntu 14.04
Vagrant Host: Cent OS 6.6 (というかConoha)

## 前提

Vagrant Guest OSはインストール及び起動済み。

# djangoインストール

参考：http://qiita.com/mountcedar/items/179fb0d9f4f87f9241c6

```
$ sudo apt-get update
$ sudo apt-get install -y apache2 libapache2-mod-wsgi
$ sudo apt-get install -y python-django
```

# djangoでテスト用に何か作る

```
django-admin startproject webservice
```

ディレクトリ構造は下記のような形になる。

```
webservices/
  django.wsgi★最初は存在しないので追加する
  manage.py
  webservices/
    __init__.py
    settings.py
    urls.py
    wsgi.py
```

設定ファイル

```django.wsgi
#!/usr/bin/env python
# coding: utf-8

import os
import sys

sys.path.append('<webservicesを配置したディレクトリ>')
sys.path.append('<webservicesを配置したディレクトリ>/webservices')

os.environ[ 'DJANGO_SETTINGS_MODULE' ] = 'webservices.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
```

/etc/apache2/sites-available/django

```
WSGIScriptAlias /services <django.wsgiの絶対パス>

<Directory /home/issei/django/webservices/>
Order deny,allow
Allow from all
</Directory>
```

# VagrantのHost - Guest間を繋ぐ

||Host|Guest|
|----|----|----|
|HTTP|8888|8000|

## Host側設定

### iptables

Cent OSのiptablesはここ。

/etc/sysconfig/iptables

REJECTルールよりも上に書かないとREJECTされるので注意する。

```shell-session
(前略)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT ★この行を追加する
-A INPUT -j REJECT --reject-with icmp-host-prohibited
```

### Vagrantfile

参考：http://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11#2-4

hostとguestを繋ぐルールと、NICをブリッジ接続する設定を有効にする。

```rb
  #(前略)
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "forwarded_port", guest: 8000, host: 8888, id:"http" #★この行を追加する

  config.vm.network "public_network" #★この行をコメントインする
```

## Guest側設定

ファイアウォール"ufw(uncomplicated firewall)"を使う。

### 有効化

```shell-session
$ sudo ufw enable
```

### ポート8000番を許可する

```shell-session
$ sudo ufw allow 8000
```

※SSHで作業してるので下記も恐らく必須。

```shell-session
$ sudo ufw allow 22
```

### 反映する

```shell-session
$ sudo ufw reload
```

### 確認する

```shell-session
$ sudo ufw status
```

# django起動する

manage.pyのディレクトリに移動後

```
$ python manage.py runserver 0.0.0.0:8000
```

これでHost OSの"グローバルアドレス:8888"からdjangoにHTTPアクセスできるはず。
【gulp】livereloadxを実行する

#gulpから黒画面のコマンドを叩いて実行

gruntでlivereloadxを実行ってのはあったけど、gulpはなかったので載せてみた。

```js:gulpfile.js
var gulp = require('gulp'),
	exec = require('child_process').exec;

gulp.task('livereloadx', function(){
	exec('livereloadx -s -p 8000');
});

gulp.task('livereloadx', ['livereloadx']);
```
最低限必要な記述。
node.js,livereloadx,gulpは別途コマンドラインでインストールしておいてください。
child_processを使うことで、gulpから黒画面のコマンドを叩いて実行させることが出来ます。

gulpfile.jsが存在するディレクトリでlivereloadxコマンドが実行されるので、
ルートディレクトリを変更したい場合は適宜コードを修正してください。
Visual Basic 14.0の新機能

簡潔に紹介していくよ！
###Getterのみの自動実装プロパティ
英語名：Getter-only auto properties

```vbnet
Public ReadOnly Property Y As Integer = 10
```

今までは、プロパティと定数で分離する必要がありましたが、プロパティだけでできるようになりました。
###コンストラクタ内での、ReadOnlyのプロパティへ割り当て
英語名：Assignment to readonly autoprops in constructors
###パラメータを持たない構造体のコンストラクタ
英語名：Parameterless constructors in structs

>上2つの例

```vbnet
Public Structure S 
   Public ReadOnly Property x As Integer
   Public Property y As Integer

   Public Sub New()
      x = 15
      y = 23
   End Sub
End Structure
```

###部分的モジュール・インターフェース(Partial Module/Inteface)
例を示さなくてもわかるので、省略します。
###文字列を改行するリテラル(C#でいう、\n)
英語名：Multiline string literals
**修正しました**

```vbnet
"あいうえお" & Environment.NewLine & "かきくけこ" & Environment.NewLine & "さしすせそ"
```
と書いていたのを、

```vbnet
"あいうえお
かきくけこ
さしすせそ"
```
と書けるようになったってこと
###日付リテラル(C#にはない！)
英語名：Year-first date literals

```vbnet
#2014-03-12#
#2016-11-23 12:30#
#2015-07-18 4:20 PM#
```
上の3つの書き方が可能なようです。
###LINQなどの構文で改行したところにもコメントが書けるようになる
英語名：Line continuation comments

```vbnet
Dim invitees = {"Jim",    ' got to invite him!
                "Marcy",  ' Jim's wife
                "Jones"}

Dim addresses = From i In invitees      ' go through list
                Let address = Lookup(i) ' look it up
                Select i, address
```
そんなところにコメントを書いても怒られなくなりました。
### TypeOf IsNot
英語名：そのまま

```vbnet
Dim x As Boolean = Not(TypeOf y Is Integer)
```
というコードを、

```vbnet
Dim x As Boolean = TypeOf y IsNot Integer
```
と書けるようになりました。
###Null条件演算子
英語名：Null-conditional operators

```vbnet
customer.Address?.Country
```
###文字列補間
英語名：String interpolation

```vbnet
$"Now: {DateTime.Now :f}"
```
ちなみに以下の様なことはできません。

```vbnet
"Now: \{DateTime.Now : f}"
```
###NameOf

```vbnet
Dim x As String = NameOf(System.Console) 'x = "System.Console"
```
C#と全く同じですね。
### コンパイラが賢くクラス名・関数名を判別するように

```vbnet
Imports System
Imports System.Windows

REM 途中省略

Threading.Thread.Sleep(1000)
'ちゃんと判別されるように！
```
### StructureでNew()をかけるように

```vbnet
Friend Structure Hoge
   Friend N As Integer
   Sub New()
      N = 0
   End Sub
End Structure
```
### #Enable/Disable Warning
以下のようにワーニングを無効化・有効化することができるようになりました．

```vbnet
#Disable Warning BCM00000
#Enable Warning BCM00000
```
###その他
\#Regionがメソッド内に書くことができたりするようになりました。
詳しくは[こちら](http://roslyn.codeplex.com/discussions/571884)を…
これからGo言語を書く人への三種の神器

## はじめに

Go言語は、標準でツールが揃っています。
これらを使わずにオレオレで書くと、手に馴染んだ言語の書き方に無意識に寄ってしまい後悔します。

そうならないように、これからGo言語を初める人はこの3つのツールは、**必ず**使って行きましょう。

## 三種の神器

1. goimports - http://godoc.org/golang.org/x/tools/cmd/goimports
2. vet - https://godoc.org/golang.org/x/tools/cmd/vet
3. golint - https://godoc.org/github.com/golang/lint/golint

## CIに仕込みましょう

こんな感じで書くと、CI時にコケる様にできます。

```yaml:.travis.yml
before_install:
  - go get golang.org/x/tools/cmd/vet
  - go get golang.org/x/tools/cmd/goimports
  - go get github.com/golang/lint/golint

...

before_script:
  - go vet ./...
  - golint ./... | xargs -r false
  - goimports -l ./ | xargs -r false
```

## 準備は整いました

これらのツールを使用すると、自然とGo言語っぽい書き方に矯正されていくので、除々に慣れて行きましょう。
また、コメント付与に対しても指摘を受けるので、自然と `GoDoc` も綺麗に書けます。

## 追記

便利コマンド作りました。

[osamingo/gochic](https://github.com/osamingo/gochic) - Check source code by go vet, golint, goimports

```bash
$ go get github.com/osamingo/gochic
$ gochic ./...
```

気軽に使ってみて下さい。
気に入ったら、:star: をして頂けるとテンションが上ります。
SSHで接続してるけどサーバ本体(物理)がどれか分からない時にはejectコマンド


SSH等の作業中に今どのサーバに繋いでるのか不安になった時は `eject` コマンドで光学ドライブのトレイを飛び出させておけば目印にできます。

物理サーバ触る機会がもしあるなら、
* ホスト名に応じたラベル貼る時
* 貼ってあるラベルが正しいか確認したい時
* 何らかの部品交換する前の最終確認
などにどうでしょう。
Swiftで現在からの経過時間を計算するNSDateのExtension

Swiftでつかえる、TwitterやFacebookのような現在からの経過時間を計算するライブラリをExtensionで作りました。「1sec,2minutes,3hours,4days」と表示するアレです。

## ソース
```Swift:TimeInterval+NSDate.swift
import UIKit

extension NSDate {
    func stringForTimeIntervalSinceCreated() -> String {
        return stringForTimeIntervalSinceCreated(nowDate:NSDate())
        
    }
    
    func stringForTimeIntervalSinceCreated(#nowDate:NSDate) -> String {
        var MinInterval  :Int = 0
        var HourInterval :Int = 0
        var DayInterval  :Int = 0
        var DayModules   :Int = 0
        let interval = abs(Int(self.timeIntervalSinceDate(nowDate)))
        if (interval >= 86400) {
            DayInterval = interval/86400
            DayModules = interval%86400
            if (DayModules != 0) {
                if (DayModules>=3600) {
                    //HourInterval=DayModules/3600;
                    return String(DayInterval) + " days"
                } else {
                    if (DayModules >= 60) {
                        //MinInterval=DayModules/60;
                        return String(DayInterval) + " days"
                    } else {
                        return String(DayInterval) + " days"
                    }
                }
            } else {
                return String(DayInterval) + " days"
            }
        } else {
            if (interval >= 3600) {
                HourInterval = interval/3600
                return String(HourInterval) + " hours"
            } else if (interval >= 60) {
                MinInterval = interval/60
                return String(MinInterval) + " minutes"
            } else {
                return String(interval) + " sec"
            }
        }
    }
}

extension NSDate {
    func toString(#format:String, localeIdentifier:String = "ja_JP") -> String? {
        let formatter = NSDateFormatter()
        formatter.dateFormat = format
        formatter.locale = NSLocale(localeIdentifier: localeIdentifier)
        let dateStr = formatter.stringFromDate(self)
        return dateStr
    }
}

extension String {
    func toDate(#format:String, localeIdentifier:String = "ja_JP") -> NSDate? {
        let formatter = NSDateFormatter()
        formatter.dateFormat = format
        formatter.locale = NSLocale(localeIdentifier: localeIdentifier)
        let date = formatter.dateFromString(self)
        return date
    }
}
```

## 使い方
### その１
```Swift:TimeInterval+NSDate.swift
if let createdDate = "2015-02-01 14:54:09".toDate(format: "yyyy-M-d HH:mm:ss") {
    let a = createdDate.stringForTimeIntervalSinceCreated() // non optional
    println(a) // "5 days"
}
```

### その２
```Swift:TimeInterval+NSDate.swift
var createdDate = "2015-02-06 14:54:09".toDate(format: "yyyy-M-d HH:mm:ss")
var b = createdDate?.stringForTimeIntervalSinceCreated() // optional
println(b) // Optional("4 hours")
```

### その３
```Swift:TimeInterval+NSDate.swift
var c = "2015-02-06 19:48:31".toDate(format: "yyyy-M-d HH:mm:ss")?.stringForTimeIntervalSinceCreated() // optional
println(c) // Optional("5 days")
```


[引用 http://hayatomo.com/2015/02/09/1504](http://hayatomo.com/2015/02/09/1504)
BeagleBone BlackのUbuntu14.04.1にNode.jsとnpmをインストールする

以前BeagleBone BlackのUbuntuにCloud9をインストールしたときは、[ARMhf.com](http://www.armhf.com/)からビルド済みにバイナリをダウンロードして使いました。現在では[Downloads (old)](http://www.armhf.com/downloads-old/)のサイトに移動してUbuntu Saucy用にNode.jsのv0.10.21がダウンロードできます。新しいバージョンはビルドされていないようです。


## Windows7とUSB-Ethernet接続

BeagleBone BlackとWindows7のPCをUSBケーブルをつないでSSH接続します。デフォルトのusernameとpasswordは以下です。

* username: ubuntu
* password: temppwd

``` bash
$ ssh ubuntu@192.168.7.2
```

デフォルトゲートウェイを設定します。

``` bash
$ sudo route add default gw 192.168.7.1
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.7.1     0.0.0.0         UG    0      0        0 usb0
192.168.7.0     0.0.0.0         255.255.255.252 U     0      0        0 usb0
$ ping -c 1 www.yahoo.co.jp
PING www.g.yahoo.co.jp (183.79.43.200) 56(84) bytes of data.
64 bytes from f5.top.vip.kks.yahoo.co.jp (183.79.43.200): icmp_seq=1 ttl=53 time=25.7 ms
```

## Node.jsのインストール

Ubuntuのバージョンを確認します。

``` bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
```

apt-cacheでNode.jsとnpmのバージョンを確認します。少しバージョンは古くなりますが、野良ビルドすると時間がかかるのでパッケージマネージャを使います。

``` bash
$ sudo apt-get update
$ apt-cache show nodejs | grep Version
Version: 0.10.25~dfsg2-2ubuntu1
$ apt-cache show npm | grep Version
Version: 1.3.10~dfsg-1
```

apt-getからインストールします。`/usr/bin/node`からも実行できるように`update-alternatives`します。

``` bash
$ sudo apt-get install nodejs npm
$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
```

Node.jsとnpmのインストールを確認します。

``` bash
$ node -v
v0.10.25
$ npm -v
1.3.10
```
RaspberryPi 2にSnappy Ubuntu Coreを入れて色々試してみる

[RaspberryPi2にSnappy Ubuntu Coreを入れてdockerがインストール出来なかったショック](http://qiita.com/KeitaMoromizato/items/25500e76195c6817d988)から一夜、こいつにも何かできる事はあるんじゃないかと色々触ってみた。

まずは[公式にあるチュートリアル](https://developer.ubuntu.com/en/snappy/)を参考に、webserverを探してみる。

```
ubuntu@localhost:~$ snappy search webserver

Part                       Version  Description
go-example-webserver  1.0.4    Minimal Golang webserver for snappy
xkcd-webserver        0.3.1    Show random XKCD compic via a build-in webserver
```

## xkcd-webserver
試しに`xkcd-webserver`をインストール。

```
ubuntu@localhost:~$ sudo snappy install xkcd-webserver

xkcd-webserver     21 kB     [=====================================================================================================================================================================================================]    OK    
Part            Tag   Installed  Available  Fingerprint     Active  
xkcd-webserver  edge  0.3.1      -          3a9152b8bff494  *    
```

インストールが完了したら既に起動しているので、PCからアクセス。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/52054/2cf8100d-e8c8-fe23-78a0-ce25aec569fa.png)

これだけ...

## Golang Server
今度こそはとGo言語のWebサーバーをインストールしてみる。

```
ubuntu@localhost:~$ sudo snappy install go-example-webserver

go-example-webserver      3 MB     [===============================================================================================================================================================================================]    OK    
Part                  Tag   Installed  Available  Fingerprint     Active  
go-example-webserver  edge  1.0.4      -          74c86cd4ed154a  *    
```

今度はport8081で起動しているようなので、ポート番号をアクセスしてみると...

![3.png](https://qiita-image-store.s3.amazonaws.com/0/52054/5e6f4093-02a4-b393-3e31-54624e61f465.png)

動いた！(HelloWorldだけど...)
表示されているファイルの実態は`/apps/go-example-webserver/current/main.go`らしい。
GO触ったことないけどコレを書き換えてもダメなんですね。コンパイルが必要なのかと思ったけど`go`コマンドは使えないし、どうしたらいいんだろう...
ELB + Nginx 利用時にRailsでHTTPSアクセスを識別する

ELB+Nginxの構成でHTTPSアクセスをする場合は、以下の様にELBでHTTPSで受けて、その後ろはHTTPでリクエストするという方法がよく採用されると思う。

```
client
  ↓    (HTTPS)
 ELB
  ↓    (HTTP)
 nginx 
  ↓    (HTTP)
 Rails
```

この時、Railsではどうやって大元のリクエストがHTTPSであることを判定できるかについての解説。

## RailsでのHTTPSアクセスを判定する方法

request.ssl?　メソッドで判定できる。

```rb
request.ssl?
```

## request.ssl?の実装はどうなってるか

HTTPヘッダー等を見て具体的にこのような判定をしている。

```rb
def scheme
    if @env['HTTPS'] == 'on'
        'https'
    elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
        'https'
    elsif @env['HTTP_X_FORWARDED_SCHEME']
        @env['HTTP_X_FORWARDED_SCHEME']
    elsif @env['HTTP_X_FORWARDED_PROTO']
        @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
    else
        @env["rack.url_scheme"]
    end
end

def ssl?
    scheme == 'https'
end
```

schemeメソッドで「https」が返されれば、https判定されることになる。

今回の構成のような例では、「url_scheme」はhttpになるため、その他のヘッダー項目での判断が必要となる。

では、フロントがELB+Nginxの場合、Railsにはどのようなヘッダが渡されるか？

## ELBからNginxへ渡されるリクエストヘッダー

ELBでは以下のHTTPヘッダを付与して、Nginxへ渡してくれる。

- X-Forwarded-For　：クライアントのIPアドレス
- X-Forwarded-Port ：クライアントの接続ポート ( 80 / 443)
- X-Forwarded-Proto：クライアントの接続プロトコル ( http / https)

httpsアクセスの場合は、「X-Forwarded-Proto」にhttpsが設定されているので、
nginxでは特別な設定はせず、これをRailsに受け流してあげれば、request.ssl?にてhttps判定が行われる。

[参考) AWS Document X-Forwarded ヘッダー](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-headers)
Railsのfind_by_sqlで取得できるモデルからは、select句で指定した名前で値が取れる

生のSQLを使ってデータを集計する場合、`COUNT(*)`などの項目は、モデルに対応する属性がありません。
なので集計とかする場合は`select_all`を使ってハッシュの配列で取得するしかないと思ってました。

```rb:コンソール
[50] pry(main)> sql = %q/select author, count(*) as count from contents group by author/
[51] pry(main)> Article.connection.select_all(sql).to_a                            
=> [{"author"=>"Jirou", "count"=>1}, {"author"=>"Tarou", "count"=>1}]
```

`find_by_sql`で取得すると、以下のように`count(*)`で取得した件数の値が見えないので、取得できないものと思いこんでいたのですね。

```rb:コンソール
[52] pry(main)> Article.find_by_sql(sql).to_a
=> [#<Article:0x007fc9d2e63478 id: nil, author: "Jirou">,
 #<Article:0x007fc9d2e631a8 id: nil, author: "Tarou">]
```

しかし`attributes`メソッドで属性を確認してみると

```rb:コンソール
[53] pry(main)> Article.find_by_sql(sql).first.attributes
=> {"author"=>"Jirou", "count"=>1, "id"=>nil}
                       ^^^^^^^^^^^
```

取得できていました！

```rb:コンソール
[54] pry(main)> Article.find_by_sql(sql).first.count
=> 1
```

`find_by_sql`のselect句に指定した項目で、対象となるモデルの属性に無いものは、特異メソッドとして属性が追加されてくるんですね。
知らなかったー。
【js】メニュー以外をタッチでナビゲーションのメニューを閉じる

![logo_pippi.png](https://qiita-image-store.s3.amazonaws.com/0/63640/e598517a-5179-7f1d-451a-264d984a6649.png "logo_pippi.png")

ハンバーガーボタンのナビゲーションを設置したは良いが、もう一度ボタンを押さなければメニューが閉じない(>o<)
困っていたけど一行のコードでメニュー以外の画面をタッチするとナビゲーションのメニューを閉じる実装ができたので、メモ！！

```javascript
$('.wrapper').click(function(){
$('.menu').removeClass('menuOn');
});
```

$('メニュー以外の画面').click(function(){
$('メニュー').removeClass('クラス名(.は無し)');
});

これでできたーーー！！！
[Swift] Closure記述方法の一覧


書き方が色々ありすぎてややこしいよ！
ということで一覧でさっと見れるようにまとめてみた。

```swift
var fruits = ["Apple", "Orange", "Banana", "Lemon"]

// 1. 基本形
fruits.sort({ (s1: String, s2: String) -> Bool in
    return s1 < s2
})

// 2. 引数の型名（String）を省略　※型推論
fruits.sort({ (s1, s2) -> Bool in
    return s1 < s2
})

// 3. 引数の()を省略　※シンタックスシュガー
fruits.sort({ s1, s2 -> Bool in
    return s1 < s2
})

// 4. 戻り値の型（-> Bool）を省略　※型推論
fruits.sort({ s1, s2 in
    return s1 < s2
})

// 5. returnを省略　※シンタックスシュガー
fruits.sort({ s1, s2 in
    s1 < s2
})

// 6. 引数の省略形を使用　※シンタックスシュガー
fruits.sort({ $0 < $1 })

// 7. 関数演算子（func < (String, String) -> Bool）を指定
fruits.sort(<)

// 8. 引数の外で指定（{}）　※シンタックスシュガー
fruits.sort{ $0 < $1 }
```

「型推論」によるものか「シンタックスシュガー」によるものかはコメントで書いています。
（厳密には型推論もシンタックスシュガーですけれど、理解しやすさを目的に分けています）

それぞれの詳しい解説については、Qiita上に分かりやすい記事がいくつも上がっていましたので、そちらをご覧いただければと思います。

プロジェクトでSwiftを使うときには、コーディング規約などで書き方を決めたほうが良さげですね。

P.S.
同じような記事がすでに上がってそうな気もして、ちょっと投稿をためらった。
Django 1.7のモデルマイグレーション内で、モデルの値を更新する


マイグレーションを進める場合、戻す場合にどのようにするか説明。South以前の書き方とはやや異なりますが、簡単な関数を書くだけで処理することが出来ます。

手順は以下の2つ。

* マイグレーションを進める場合、戻す場合、それぞれで利用する関数を作成する
* Migrationクラスの`operations`にフックを追加する

ユーザ設定の項目に単位が含まれており、その値を変更するようなマイグレーション例。

```python:0002_add_distance_unit.py
def apply_unit_settings(apps, schema_editor):
    """マイグレーションを進める場合に実行する関数
    """
    
    # user_settingsアプリからUserSettingsというモデルクラスを取得する
    UserSettings = apps.get_model('user_settings', 'UserSettings')

    # モデルオブジェクト全ての`distance_unit`を、`unit`の値を利用して書き換える
    for settings in UserSettings.objects.all():
        if settings.unit == 'metric':
            settings.distance_unit = 'km'
        elif settings.unit == 'imperial':
            settings.distance_unit = 'mile'
        settings.save()


def unapply_unit_settings(apps, schema_editor):
    """マイグレーションを戻す場合に実行する関数
    """
    UserSettings = apps.get_model('user_settings', 'UserSettings')
    for settings in UserSettings.objects.all():
        if settings.distance_unit == 'km':
            settings.unit = 'metric'
        else:
            settings.unit = 'imperial'
        settings.save()
```

`Migration`クラスの最後に`migrations.RunPython`を追加します。

```python:0002_add_distance_unit.py
class Migration(migrations.Migration):
    dependencies = [
        ('user_settings', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='usersettings',
            name='distance_unit',
            field=models.CharField(choices=[('km', 'KM'), ('mile', 'Mile')], null=True, default='km', max_length=8, verbose_name='Distance uni
t'),
            preserve_default=True,
        ),
        migrations.AddField(
            model_name='usersettings',
            name='temperature_unit',
            field=models.CharField(choices=[('celsius', 'Celsius'), ('fahrenheit', 'Fahrenheit')], null=True, default='celsius', max_length=10
,
                                   verbose_name='Temperature unit'),
            preserve_default=True,
        ),
        # 以下の行を足します
        migrations.RunPython(apply_unit_settings, unapply_unit_settings)  
    ]
```
耽美系ことうみ無限SSライティング装置

php始めたばかり。某サイトみながら書きました。
更新するたび本文増えるよ。みんなで叶える物語ってことだよね？

```php
<?php

$testfile = “fightdayo.php”;
$umisay =“ことりのすりおろしリンゴ入りヨーグルト美味しいです。”;
if (is_writable($testfile)){
} else {
     echo “not writable!”;
     exit;
}
$fp = fopen($testfile,”a”);
if (!$fp) {
     echo “could not open!”;
     exit;
}
if (write($fp,$umisay) === false) {
     echo “could not write!”;
     exit;
}
echo “success!”;
fclose($fp);
$testfile = “fightdayo.php”;
if (!$fp = open($testfile, “r”)) {
     echo “could not open”;
     exit;
}
$umisay = fread($fp,filesize($testfile));
var_dump($umisay);
fclose($fp);
```
Kinoma Create: PWM を試すの巻


[PWM](http://www.natural-science.or.jp/article/20081222135431.php)制御を試してみました。
PWMのサンプルプログラムというと、以下のページにサンプルがあります。このサンプルでは、アノードコモンLEDを使っています。
http://kinoma.com/create/samples/pwm-tri-color-led/
手元にあったのが、カソードコモンLEDだったので、ちょっと変更が必要になりました。

動作としては、スライダーのつまみが左にあるときに光らない、右にあるときに光るようにしたいのです。

アノードコモンの場合、アノードは HIGH(=1) なので　光らない時 HIGH(=1)である必要があり、
つまみが右に行くにつれ、LOW(=0)に近づいていく設定にします。
スライダーのつまみが左から右にいくにつれ、スライダーの値が 0 から 1 まで変化するので、ちょうど逆向きになります。

カソードコモンの場合には、この逆でスライダーの値をそのまま LED の出力に入れればいいことになります。楽チン。


まず、初期値を変更します。anode については丸無視です。これについては後ほど。

```javascript:device/led.js(初期値の変更)
exports.pins = {
    red: { type: "PWM", value: 1 },
    green: { type: "PWM", value: 1  },
    blue: { type: "PWM", value: 1  },
    anode: { type: "Digital", direction: "output", value: 1  } 
};
// 初期値を全て０にする --->　
exports.pins = {
    red: { type: "PWM", value: 0 },
    green: { type: "PWM", value: 0  },
    blue: { type: "PWM", value: 0  },
    anode: { type: "Digital", direction: "output", value: 1  } 
};
```

そして、スライダーで値が変化した時に呼ばれるであろうところの挙動を変えます。

```javascript:device/led.js
exports.write = function( parameters ) {
	switch( parameters.color ){
		case( "red" ):
			this.red.write( 1 - parameters.value );
			return;
		case( "green" ):
			this.green.write( 1 - parameters.value );
			return;
		case( "blue" ):
			this.blue.write( 1 - parameters.value );
			return;
	}
}
// スライダーのつまみの値をそのまま入れる　--->
exports.write = function( parameters ) {
	switch( parameters.color ){
		case( "red" ):
			this.red.write( parameters.value );
			return;
		case( "green" ):
			this.green.write( parameters.value );
			return;
		case( "blue" ):
			this.blue.write( parameters.value );
			return;
	}
}
```

(simulator/led.xmlのところにも、同じような式があるのですが、こちらは名前の通り simulatorを動作させた時に動くコードのようです)

配線ですが、KinomaCreateの後ろのピンのPin28 を赤、Pin30を緑、Pin34を青につなぎます。
前のピンでは、PWM 制御はできないようなのね。ちょっと残念。
そして、カソードをPin1 の GND につなぎます。
ですので、プログラム中の anode 設定は全く意味をなさなくなります。
（そもそも直接 3.3Vなり5Vなりにつないでおけばいいのだと思いますが。。。）

```javascript:src/main.xml
		application.invoke( new MessageWithObject( "pins:configure", {
			led: {
	            require: "led",
	            pins: {
	                red: { pin: 28 },
	                green: { pin: 30 },
	                blue: { pin: 34 }, 
	                anode: { pin: 24 }
	            }
			}
		}));
```

![kobito.1423484681.028846.png](https://qiita-image-store.s3.amazonaws.com/0/60968/1f467310-d013-8a94-b68f-ef918ed79748.png "kobito.1423484681.028846.png")



こうすると、ちゃんと　http://kinoma.com/create/samples/pwm-tri-color-led/ のサンプルの動画と同じように動くようになりました。

![kobito.1423485569.611147.png](https://qiita-image-store.s3.amazonaws.com/0/60968/d64d6bed-1ec4-3464-7900-57bad68f8018.png "kobito.1423485569.611147.png")

そろそろ、それらしいところを変更するだけじゃなく、ちゃんと Kinoma Create のフレームワーク?(KPR:Kinoma Platform Runtime)を理解したいところです。

'exports' とかいうあたりは、ここだな。
http://www.kinoma.com/develop/create/pins/
スマホサイトでOrbitControls.jsを使う際の注意


three.jsのコントローラとしてよく使われるOrbitControlsですが、
これは内部でtouchmoveをpreventDefaultしているので、
スクロール等がうまくきかなくなるという副作用が生じてしまいます。

3Dビューと、通常のWebページ部分を同時に見せることはあまりないと思うので、
3Dビュー以外の箇所では、orbitcontrolのenablesプロパティをfalseに
することで、機能を無効化しておきましょう。
macにnginx + php-fpmを導入する際の手順

# nginxのインストール

`brew install nginx`

# nginxのアップグレード

`brew upgrade nginx`

# nginxの自動起動設定

`ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents`

# nginxを起動する

`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist`

# php-fpmのインストール

`brew tap homebrew/dupes`
`brew tap homebrew/versions`
`brew tap homebrew/php`
`brew install php56 --with-fpm`
**※過去のバージョンがインストールされている場合はphp56へリンク変更しておく**
`brew unlink php55`
`brew link php56`

# phpの自動起動設定

`ln -sfv /usr/local/opt/php56/*.plist ~/Library/LaunchAgents`
`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php56.plist`

# nginxの設定

nginx.confのserverディレクティブに下記を追加する

```lang:/usr/local/etc/nginx/nginx.conf
        location ~ \.php$ {
            root           /var/www;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }   

```

# PHPスクリプトの格納ディレクトリを作成

`sudo mkdir /var/www`
`chmod 777 /var/www`

# 適当なPHPスクリプトを作成

```php:/var/www/index.php
<?php
   phpinfo();
```

# nginxを再起動

設定を反映する為にnginxを再起動する。

`nginx -s reload`

# ブラウザで動作確認

http://localhost:8080/index.php にアクセスするとPHPスクリプトが動作していることを確認できます。
CD/DVDデバイスが原因でESXiへのデプロイに失敗するOVA/OVFファイルの修正方法

### はじめに

VMware ESXi 5.1/5.5で仮想マシンをOVFテンプレートとしてエクスポートする際に、CD/DVDデバイスとしてISOファイルを選択したままになっていると、いざデプロイする段階になってデプロイできないという問題が知られています。

デプロイ開始直後に以下のように表示されて失敗します。

> OVFパッケージのデプロイに失敗しました：タスクは、ユーザーによってキャンセルされました。

* [CentOS6.4 のOVFテンプレートのデプロイに失敗する。 | VMware Communities](https://communities.vmware.com/message/2255792)
* [VMware vSphere HypervisorでのOVA/OVF - Qiita](http://qiita.com/meets/items/18b7d78bb738a817aa0a)

この場合、CD/DVDデバイスをクライアントデバイスに変更して再エクスポートすれば解決しますが、エクスポート済みのOVA/OVFファイルを変更してデプロイ可能にすることもできます。

### 参考サイト

以下のKnowledge Baseが参考になります。ただVMware Toolsは本質的でないにも関わらず、それが原因であるかのように書かれていてわかりにくいため、改めて手順を残しておきます。

* [VMware KB: VMware Tools のインストール時に vCenter Server 5.1/5.5 での OVF のデプロイに失敗する](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2092994)
* [VMware KB: Deploying an OVF fails on vCenter Server 5.1/5.5 when VMware tools are installed](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2034422)


### 手順

#### 1. OVA形式の場合は展開する

OVF形式でエクスポートした場合はこの手順は飛ばしてOKです。
OVA形式の実体はtarアーカイブなので、tarとして展開します。

MyVM.ovaを展開すると以下のファイルが出てくるはずです。

* MyVM.mf：ファイルのハッシュを保持するファイル
* MyVM.ovf：仮想マシンの設定を保持するXMLファイル
* MyVM-disk<i>n</i>.vmdk：ディスクイメージ（ディスクの数だけある）

#### 2. MyVM.ovfを編集する

以下のような箇所を探し、

```xml
<Item ovf:required="false">
  <rasd:AddressOnParent>0</rasd:AddressOnParent>
  <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
  <rasd:ElementName>CD-ROM 1</rasd:ElementName>
  <rasd:InstanceID>9</rasd:InstanceID>
  <rasd:Parent>4</rasd:Parent>
  <rasd:ResourceSubType>vmware.cdrom.iso</rasd:ResourceSubType>
  <rasd:ResourceType>15</rasd:ResourceType>
  <vmw:Config ovf:required="false" vmw:key="backing.exclusive" vmw:value="false" />
  <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true" />
</Item>
```

`vmware.cdrom.iso`となっているところを

```xml
<rasd:ResourceSubType>vmware.cdrom.iso</rasd:ResourceSubType>
```

次のように`vmware.cdrom.remotepassthrough`に書き換えます。

```xml
<rasd:ResourceSubType>vmware.cdrom.remotepassthrough</rasd:ResourceSubType>
```

#### 3. MyVM.mfのハッシュ値を更新する

sha1sumコマンドなどでMyVM.ovfの新しいSHA1ハッシュを計算し、MyVM.mfを更新します。

MyVM.mfの中身は以下のようになっています。

```
SHA1(MyVM.ovf)= <.ovfのSHA1ハッシュ>
SHA1(MyVM-disk1.vmdk)= <.vmdkのSHA1ハッシュ> 
```

#### 4. OVFファイルをデプロイする

再びデプロイすればうまくいくはずです。
TestLinkの構造を理解したかったんだ

# 構造

ざっくり以下のような構成。Test Project <==> Test Suite の間には Test Specification っていう階層があるけど、図がまとまらなかったので省略。

Test Plan 下の Test Case は Test Specification 下の Test Case の部分写像。Test Specification の中から Test Case を抽出して Test Plan をつくる。

Test Plan の下には1つ以上の Build が存在する。Buildごとにテスト結果が残る。同じTest Plan　の下にいる Buildだからといってテスト結果は継承されず独立している。Build1でPassでも、その後Build2を作るとNot Runになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/f8f3fb71-0d36-28e9-d09d-7a2bd295c12e.png)

# Test Project
リリースするアプリケーション単位で作成する。ゲームならそのゲームタイトルがプロジェクトとなる。もしかするとモジュール単位がプロジェクトになっている現場もあるかもだけど、私はそうやって使ってる。

# Test Suite ( In Test Specification )
テストケースをまとめるフォルダ。Details っていう項目に色々書けるみたいだけど、私は使ってない。

# Test Case
テストの手順などを記述する。
概要。前提条件。テスト手順。期待する結果を記載できる。

# Test Plan
テスト計画。リリースバージョンごとに作成する。
作成したテストケースのどれを実施するかを選定し登録することができる。
実施しない項目に対してなぜ実施しないかの理由の記載がないので不便。(グチ)

# Build
実際使い方がよくわからない。本来であれば、アプリケーションがビルドされる毎に作成し、ビルド毎にテスト。なんてのをするんだろうけど、私はTest Plan と Buildが1:1の関係になってる。テストしたビルドバージョンはカスタムフィールドに入力してもらう運用にしてる。(正しいかといわれると正しくないと思う)

Buildを作るとテスト実施が可能となる。Test Planで選定した Test Case にしたがってテストを実施し、Passed / Failed / Blocked の中から結果を選択する。

## Passed
結果が合格であることを表す。期待する結果と実際の結果がマッチしたときにこのステータスにする。

## Failed
結果が不合格であることを表す。期待する結果と実際の結果がアンマッチだった場合にこのステータスにする。

## Blocked
なんらかの理由でテストが実施できなかったことを表す。Android で実施するって書いてるのに、iPhoneしか対応してないアプリだったりとか。(違うかも)

# まとめ
書いてから、あまりよくわからないなと気づいたので、偉い人教えてください。
Mac; OS X MavericsにOpenJTalkを導入する

# 追記

Homebrew本家に自分の書いたFormulaをマージしてもらったので、以下のコマンドだけでインストールすることができます。

```
brew install open-jtalk
```

Homebrewのインストールがまだの方は、

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## ...

ほとんど以下のサイトの焼き直しです。感謝！

[Mac OS X Lion で OpenJTalk-1.05 を動かす](http://naoh-dev.blogspot.jp/2012/01/mac-os-x-lion-openjtalk-105.html)

## 準備
/usr/local以下にOpenJTalkディレクトリを用意する。
その下にvoiceディレクトリをそれぞれ用意する。

```
mkdir -p /usr/local/OpenJTalk/voice
```

## hts_engine APIのインストール
[本家サイト hts_engine API](http://hts-engine.sourceforge.net/)

ターボールは以下のリンクから。
http://sourceforge.net/projects/hts-engine/files/hts_engine%20API/hts_engine_API-1.09/hts_engine_API-1.09.tar.gz/download?use_mirror=jaist

例によって

```
tar xzvf hts_engine_API-1.09.tar.gz
cd hts_engine_API-1.09
./configure --prefix=/usr/local/OpenJTalk
make && make install
```

## OpenJTalkのインストール
[本家サイト OpenJTalk](http://open-jtalk.sourceforge.net/)

ターボールは以下のリンクから。
http://downloads.sourceforge.net/open-jtalk/open_jtalk-1.08.tar.gz

例によって

```
tar xzvf open_jtalk-1.08.tar.gz
cd open_jtalk-1.08
./configure --prefix=/usr/local/OpenJTalk --with-hts-engine-header-path=/usr/local/OpenJTalk/include --with-hts-engine-library-path=/usr/local/OpenJTalk/lib --with-charset=UTF-8
```

ここで、-with-hts-engine-header-pathと--with-hts-engine-library-pathとが先ほどインストールしたhts_engine APIのヘッダーとライブラリを参照している。

ここですぐにmakeするとunknown argumentsというエラーが出てビルドできない。
config.statusを編集して余計なオプションを削除してからmakeする。

```
sed -e 's/-finput-charset=UTF-8 -fexec-charset=UTF-8//' config.status > tmp
mv tmp config.status && rm tmp
make && make install
```

### HTS Voiceのインストール
ダウンロードは以下のリンクから。
http://sourceforge.net/projects/open-jtalk/files/HTS%20voice/hts_voice_nitech_jp_atr503_m001-1.05/hts_voice_nitech_jp_atr503_m001-1.05.tar.gz/download?use_mirror=jaist

バイナリなので解凍してvoice以下に設置する。
利便性のために適当なシンボリックリンクを貼る。

```
tar xzvf hts_voice_nitech_jp_atr503_m001-1.05.tar.gz
mv hts_voice_nitech_jp_atr503_m001-1.05 /usr/local/OpenJTalk/voice
cd /usr/local/OpenJTalk/voice
ln -s hts_voice_nitech_jp_atr503_m001-1.05 m001
```

インストール完了！

## OpenJTalkを使ってみる。
sample.txt中のテキストを読み上げてout.wavとして出力。

```
open_jtalk -x /usr/local/OpenJTalk/dic -m /usr/local/OpenJTalk/voice/m001/nitech_jp_atr503_m001.htsvoice -ow out.wav sample.txt
```

* -xで辞書ディレクトリを指定。
* -mでHTS Voiceファイルを指定。
* -owでアウトプットのファイル名指定。

## HomebrewのFormula
上記の手順をHomebrewのFormulaの形にまとめたものをGitHub Gistに公開している。
https://gist.github.com/yawara/fa2245b48430dbd1bbf5

このファイルを/usr/local/Library/Formulaに設置して

```
brew install open-jtalk
```

とすれば簡単にインストールできる。

[Homebrew](http://brew.sh/)とはMacのパッケージ・マネージャーでrubyで記述されている。
競合するものにMacPortsがある。
rails環境でのMysqlのdyld: lazy symbol binding failed: Symbol not foundエラー

railsの環境をローカルで構築していてrails sやrake db:createなどmysqlに関連するコマンドを使うと毎回下記のエラーが出ます。 

dyld: lazy symbol binding failed: Symbol not found: _mysql_get_client_info 
  Referenced from: /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-14/2.0.0/mysql2-0.3.17/mysql2/mysql2.bundle 
  Expected in: flat namespace 

dyld: Symbol not found: _mysql_get_client_info 
  Referenced from: /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-14/2.0.0/mysql2-0.3.17/mysql2/mysql2.bundle 
  Expected in: flat namespace 

Trace/BPT trap: 5 


Ruby ver 2.1.3 
rails ver 4.1.8 
mysql ver 14.14 
上記が開発環境のヴァージョンです。 

解決方法は
gem uninstall mysql2で一旦消して
gem install mysql2で再インストールで完了！！
【Git】git rm --cached [ファイル名]：ファイルを管理対象から除外する

しばしば調べてる気がするのでメモ。
タイトル見ただけでほぼ分かるようにしてみた。

自分はたいてい、
ファイル名の camelcase を書き間違えたのに気付いてリネームした後、
git に誤認識されておかしくなったのを直すために使ってる気がする。。

## ファイルを管理対象から除外する

```sh:
$ git rm --cached [ファイル名]
```

--cached オプションを付けることにより、ファイルを残したまま管理対象から外すことができる。
--cached オプションつけないと、ファイルごと削除しちゃうので注意。

## ファイルごと削除

```sh:
$ git rm [ファイル名]
```

## 参考

参考にさせていただきました。今日も先人様に感謝。

* [gitの管理対象から特定のファイル、ディレクトリを削除する - Qiita](http://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25)

以上
FLAG_ACTIVITY_REORDER_TO_FRONTで画面遷移するときのアニメーションを変更する

過去に自分の[ブログ](http://blog.chibatching.com/blog/2014/10/22/transition-anim-with-flag-activity-reorder-to-front/)に書いたものをQiitaにも転載。
***
アクティビティを遷移する際のアニメーションを変更する場合は、`startActivity`の後に`overridePendingTransition`を呼ぶのが普通だと思いますが、インテントのフラグにFLAG_ACTIVITY_REORDER_TO_FRONTが設定されていると指定したアニメーションが適用されません。

```java
Intent intent = new Intent(this, SampleActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
getActivity().overridePendingTransition(0, 0);
```

解決策はいつものようにStack Overflowで見つけましたが、備忘録として記録しておきます。  
[android - overridePendingTransition does not work when flag_activity_reorder_to_front is used - Stack Overflow](http://stackoverflow.com/questions/4633543/overridependingtransition-does-not-work-when-flag-activity-reorder-to-front-is-u)


## 解決方法

FLAG_ACTIVITY_REORDER_TO_FRONTで既存のアクティビティを前面に移動させる場合には、呼び出された側のアクティビティの`onNewIntent`で`overridePendingTransition`を実行する。

```java
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // FLAG_ACTIVITY_REORDER_TO_FRONTでActivityを起動した場合に
    // 起動元のoverridePendingTransitionが有効に機能しないため
    // インテントで起動時に呼び出すようにする
    overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);
}
```

`onResume`で実行しても同じ動きになるけど、`onResume`はいろいろなタイミングで呼ばれるのでおすすめしないよとのこと。

`onNewIntent`で実行すれば、インテントの内容でアニメーションを制御することもできるのでこちらでやるべきでしょう。
配色サイト


[ColorHexa](http://www.colorhexa.com/)

* Shade、Tone、Tintが**13色**
* RGB、CMYKのグラフ表示
* borderのCSSサンプル
* **いろんなカラースキーム（色見表？）がある**

[Color Hex Color Codes](http://www.color-hex.com/)

* Shade、Tone、Tintが10色
* RGB、CMYKのグラフ表示（**グラフ内に%表示がある**）
* borderのCSSサンプル　 **＋ CSS3の影文字や影付きborderのサンプルがある**

[HTML Color Picker] (http://www.w3schools.com/tags/ref_colorpicker.asp)

* その色を中心にしたShadeとTintが表示される
* **操作しやすい（カラースキームからクリックする）**（hex直接入力も可能）

[HTML Color Mixer] (http://www.w3schools.com/tags/ref_colormixer.asp)

* Color Pickerと同じサイト
* **色を2つ選ぶと、両端が選択した色のShadeが表示される**

[CSS3 Color Names](http://www.codenique.com/web_color/css3_color_names.php)

* **CSSの色の名称と実際の色が一覧表で見れる（147色）**
Faker::Internet.emailでEメールアドレスが生成できない



ここのとおりなのですが、

http://qiita.com/kyanny/items/00ef3727c7738f2cc26c

Railsで使うときにどうするかということで、以下にこんな感じで設定するようにしました。

```ruby:config/initializers/faker.rb
Faker::Config.locale = :en if Rails.env.development? || Rails.env.test?
```
動画の再生をSpriteKitで行うという発想


##SKVideoNodeの概要
SpriteKitにはSKVideoNodeというクラスが存在し、その名の通りビデオの再生を実現するクラスです。
他のSKNodeのサブクラス同様にSKSceneにaddChildすることで利用することが出来ます。

##SKVideoNodeの初期化

###AVPlayerから初期化する場合

SKVideoNodeはAVPlayerを初期化の際に渡すことで再生するリソースを指定することが可能。

```swift
let urlStr = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4")
let url = NSURL(fileURLWithPath: urlStr!)

playerItem = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: playerItem)

videoNode = SKVideoNode(AVPlayer: player)
videoNode?.position = CGPointMake(scene.size.width/2, scene.size.height/2)
        
scene.addChild(videoNode!)
```

###NSURLから初期化する場合

SKVideoNodeはNSURLを渡すだけでも初期化することができる。

```swift
let urlStr = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4")
let url = NSURL(fileURLWithPath: urlStr!)

videoNode = SKVideoNode(videoURL: url!)
videoNode?.position = CGPointMake(scene.size.width/2, scene.size.height/2)        

scene.addChild(videoNode!)
```

###ファイル名だけで初期化も出来るぜ

この書き方が一番シンプルです。
リソースがmainBundleの中に入っていれば、ファイル名を指定するだけでSKVideoNodeは作成出来ます。

```swift
videoNode = SKVideoNode(videoFileNamed: "sample.mp4")
videoNode?.position = CGPointMake(scene.size.width/2, scene.size.height/2)      
  
scene.addChild(videoNode!)
```

##SKVideoNodeの再生方法

SKVideoNodeで再生と停止するのは```play()```と```pause()```を利用するだけ。

```
videoNode?.play()
videoNode?.pause()
```

##応用として

前述にもあるようにSKVideoNodeはAVPlayerから初期化出来るため、AVPlayerItemのObserverを設定することが出来る。

なので、再生が終了した際のコールバック処理などもカンタンに書くことが出来るよ。

SKVideoNodeはplayとpauseくらいしか出来ることがないので、複雑なプレイヤーを作成するのはあまり向いていないけれど、アプリ内でちょっとしたアニメーションなどを表現する際や、背景などを動かしたい場合などはかなり活躍するクラスだと思いました。

##サンプルコード
[reoy/SKVideoNodeSample](https://github.com/reoy/SKVideoNodeSample)
dplyr で PostgreSQL への接続を簡単にする #rstatsj

以前こういう記事を書いたわけですが

- [dplyr、PostgreSQL、Windows の組み合わせで文字化けを防ぐ](http://qiita.com/hoxo_m/items/1ef8666ab939fd68ed72)

PostgreSQL への接続時に環境変数で指定できるものは他にもたくさんあります。

- [環境変数 - PostgreSQL 9.2.4文書](https://www.postgresql.jp/document/9.2/html/libpq-envars.html)

この記事では、DB 接続に必要となる、DB名、ホスト、ポート、ユーザ名、パスワードを環境変数で設定してみます。

例えば、dplyr で次のように DB 接続していたとします。

```r:R
db <- src_postgres(dbname = "hoxo-m-my-db",
                   host = "192.168.1.1", 
                   port = 5432, 
                   user = "hoxo-m", 
                   password = "******")
```

このとき、環境変数として、次のように設定します。([Windows 環境変数の設定方法](http://next.matrix.jp/config-path-win7.html))

|変数      |値          |
|----------|------------|
|PGDATABASE|hoxo-m-my-db|
|PGHOST    |192.168.1.1 |
|PGPORT    |5432        |
|PGUSER    |hoxo-m      |
|PGPASSWORD|******      |

このようにしておくと、dplyr からの DB 接続は次のように簡単になります。

```r:R
db <- src_postgres()
```

すっきり！

環境変数の値は DB 接続のデフォルト値になっただけなので、これとは別の DB につなげたいときは、いつも通り `src_postgres()` の引数に入れてやればよいです。
一番よく使う DB の設定にしておけば色々とはかどるかと思います。

ただし、パスワードについては、環境変数に直接書き込むのではなく、パスワードファイルを作成する方法が推奨されていますのでご注意を。

- [パスワードファイル - PostgreSQL 9.2.4文書](https://www.postgresql.jp/document/9.2/html/libpq-pgpass.html)

enjoy!

### 関連

- [dplyr でデータベースを扱うときの情報をそろそろまとめておく](http://qiita.com/hoxo_m/items/341f499eb4117eec41df)