OmniAICreator/Qiita-1.07M huggingface dataset:
ワンライナーWebサーバをまとめた

[ワンライナーWebサーバを集めてみた](http://qiita.com/sudahiroshi/items/e74d61d939f18779970d)

ワンライナー Web サーバを起動するとき100%毎回どう書くのか忘れるのでいつもこの記事をみていたのですが、毎回記事を探すところから始まるのでシェルスクリプトにまとめました。

https://github.com/5t111111/http-server-one-liner

## 使いかた

以下の Web サーバのどれかを起動するラッパースクリプトです。

- Python 2.x SimpleHTTPServer
- Python 3.x http.server
- Ruby WEBrick via un
- PHP (5.4+)

デフォルトは Python 2.x か 3.x です。環境によって変わります。

## Usage

```text
$ httpserver プログラム ポート番号
```

### 例

```bash
# デフォルト (Python 2.x or 3.x) ポート番号もデフォルトのやつ
$ httpserver

# デフォルト (Python 2.x or 3.x) ポート番号指定あり
$ httpserver 8080

# Python 2.x or 3.x
$ httpserver python 8080

# Python 3.x
$ httpserver python3 8080

# Ruby
$ httpserver ruby 8080

# PHP
$ httpserver php 8080
```

## インストール

適当なところにリポジトリをクローンするかスクリプトファイルをダウンロードしてパスを通してください。

### インストール例

```text
$ cd ~
$ git clone git@github.com:5t111111/http-server-one-liner.git
$ export PATH=$HOME/http-server-one-liner:$PATH
$ rehash # オプション
```
arduinoでRTC

オークションで購入したDS1307を、arduino unoに、つないで見ました。
##写真
![MVC-016S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/573b7940-b28d-2a78-7fe3-b1af12b23668.jpeg)
##回路図
![ds1307kairo.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/d6944eda-3ea0-2ef0-6634-5618a536d7a5.png)
##ハイパーターミナル
![ds1307.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/813efc7f-717d-1f3a-6bd4-4ffb8fdd20a3.png)

##ライブラリー作りました。ide1.6.5用
https://github.com/ohisama/Ds1307

##サンプルコード
```
#include <Wire.h>
#include <Time.h>
#include "Ds1307.h"

Ds1307 rtc;
void printDigits(int digits)
{
	Serial.print(":");
	if (digits < 10) Serial.print('0');
	Serial.print(digits);
}
void digitalClockDisplay()
{
    Serial.print(year());
    Serial.print("/");
    Serial.print(month());
    Serial.print("/");
    Serial.print(day());
    Serial.print(" ");
	Serial.print(hour());
	printDigits(minute());
	printDigits(second());
	Serial.println();
}
void setup()
{
	pinMode(13, OUTPUT);
	rtc = Ds1307();
	Serial.begin(9600);
	Serial.println("\r\nread rtc ->");
	setSyncProvider(rtc.get);
	if (timeStatus() != timeSet) Serial.println("Unable to sync with the RTC");
	else  Serial.println("RTC has set the system time");
}
void loop()
{
	digitalClockDisplay();
	digitalWrite(13, HIGH);
	delay(3000);
	digitalWrite(13, LOW);
	delay(3000);
}

```
git add しようとすると fatal: Unable to create

# git add のコマンドを叩いたら、エラー

開発サーバー@develop
```
git add ./
fatal: Unable to create '/home/httpd/html/.git/index.lock': ????????
```

これは”ロックファイルがつくれないよーふぇぇと言われています。

# フォルダの権限をチェック

``` 
drwxr-sr-x   7 root    root
```

あっさり原因が判明しました。フォルダの権限の問題でした。

* 解決１　root 権限で実行する
* 解決２　フォルダの権限を変更する

これで無事にadd できました。
Windows Server 2012 R2にPHPとSQL Serverのドライバーを入れた時のメモ


Windows Serverでは、APS.NETを利用していますが、PHPも使えるようにする際のメモ。

##前提

* OSインストール済
* IISインストール済
* SQL Serverインストール済（ここでは2014で検証)
* インストールするPHPは5.6（Laravel5.1.xに対応するため）

##インストール

インストールの方法はいろいろあるが、WebPIを利用するのが一番簡単そうなので、それで行います。

WebPI(Web Platform Installer)をダウンロードし、起動して、検索ウインドウで"php"を検索。そこで出てくる、

* php5.6
* Microsoft Drivers 3.2 for PHP v5.6 for SQL Server in IIS

の２つを選択肢、インストールする。依存コンポーネントも含め、いくつかのものがインストールされます。

##動作確認

###インストール場所
インストールは

```
C:\Program Files (x86)\PHP
```

に行われ、php.iniは、

```
C:\Program Files (x86)\PHP\v5.6\php.ini
```

となる。SQL Serverアクセスに必要なモジュールは標準でONになっているもよう。
その他、IISへの登録とかも終わっているので後は使うだけ。

```
extension=php_pdo_sqlsrv.dll
extension=php_sqlsrv.dll
```
私はPDOを使う派。ちゃんと動いているかは、

```php
<?php

	phpinfo();
```

でどうぞ。設定を変更したらIISの再起動が必要です。

###SQL Serverへの接続確認

PDO生成時の文字列が少し違う程度で、後はMySQLなどと同じ。まあ、それがPDOですが。
こんな感じ。

testdb,usersテーブル,nameカラムはあることが前提。

```php
<?php

	//PDO
	$dbh = new PDO("sqlsrv:server=localhost;database=testdb","sa","password!");
	//エラー出力設定（別にいらない）
	$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	//通常の利用
	$stmt = $dbh->prepare("select * from users");
	$status = $stmt->execute();

	//出力
	foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row)
	{
		echo $row["name"]."<br>";
	}

```
普通にアクセスできました。
コマンドラインでSQL Serverを使う最低限のメモ


いつもMySQLをコマンドラインで使うことが多いので、SQLServerもメモ。

##クライアントツールのインストール

CLIのツールはSQL Serverを普通にインストールすれば、インストールされます。
追加でインストールする場合は、

* SQLのディスクからなら、共通機能->管理ツール 完全でインストール
* SQL Server Feature Packから単体でのインストールも可能
	* 依存ファイルであるsqlcli.msi（sql client tool)をインストール
	* SqlCmdLnUtils.msc(sqlcmd)をインストール
	
Feature PackはSQLのバージョンに合わせて随時ググってDL場所を検索。

##基本的なコマンド

基本、sqlcmdコマンドを使う。SQL Serverをインストールすれば、Pathは通ってるはず。
通ってなければ通す。


###ログイン

IDをPWでログインする場合。もちろん複合認証にしておく必要があります。

```bash
sqlcmd -S server -U user -P password
```


統合認証。

```bash
sqlcmd -E -S localhost
```

という感じ。

データベースも指定する場合は、

```bash
sqlcmd -S server -U user -P password -d database
```
とする。

###データベース一覧

```sql
select name from sys.databases;
go
```

コマンドラインでは命令の後にgoをつけると実行される。

>以下go省略。

###データベースの作成

```sql
create database testdb;
```

とにかく命令の最後はGOを付ける。

###データベースの指定

```sql
use testdb;
```

###テーブルの作成

いわゆるオートインクリメント指定。

```sql
create table members(
	id int identity(1,1) primary key,
	name nvarchar(32),
	birthday datetime
);
```

###テーブルの一覧

```sql
select name from sysobjects where xtype = 'U'
```

###愚痴

しかし、T-SQLの管理系コマンドってなんでこんな利便性低いのでしょう？
GUI前提というのもあるのだろうけど、昔はCLIだったし。


##参考

* [ここやら](http://www.geocities.jp/kandou_quester/Knowledge/Programming/SQL/_how_to_use_sqlcmd.html)
* [ここやら](http://tuotehhou.y.ribbon.to/index.php?SqlCMD%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
mBaaSでAndroid端末へのPush通知を実現するまでの簡単な比較・感想

##はじめに

Android端末に対してPush通知するまでを、Parse.comとniftyクラウドmobile backendの両方で試しました。

それぞれに一長一短があると感じたので、簡単にまとめておきます。

試した手順は以下の通りです：

1. mBaaSサイトに登録
2. Push通知を受け取るアプリ作成（Android）
3. 管理画面で設定
4. 管理画面からPush通知登録
5. REST APIをC#から叩いてPush通知登録

##Parse.comを利用した感想

1の登録は特に問題なく完了しました。

2のアプリ作成では、Android向けのプロジェクト一式がダウンロードできたため、特につまずくことなく実装できました。また、以下の記事も大変参考になりました。
[爆速でAndroidにPush通知を実装する（Parse + Android Studio使用）](http://qiita.com/kassy_kz/items/f32e3e91c97973ce71a8)

3では特に設定する項目はありませんでした。また、4も管理画面から簡単に利用できました。

5については、C#でRESTやJSONを扱うライブラリを利用することでさほど苦労なく実装できました。

「爆速で～」の記事通り、単なるPUSH通知を実装するのは非常に早かったですが、そこから少し凝ったこと（ダイアログを出すとかURLを送付して開くとか）をしようとすると、Androidアプリの実装が大変そうでした（Androidアプリ開発は今回ほぼ初めてだったため）。

そこで、「凝ったPush通知ができるよ」とあったniftyクラウドmobile backendを利用してみました。

##niftyクラウドmobile backendを利用した感想

1の登録は特に問題なく完了しました。

2のアプリ作成では、空のプロジェクトから構築していきました。
[SDKガイド（プッシュ通知）](http://mb.cloud.nifty.com/doc/current/sdkguide/android/push.html)が充実していたので、その通りにやればできるのですが、変更箇所が意外に多かったです。Parse.comのようにプロジェクトファイル一式が用意されていると楽だったかと思います。

3ではGoogle Cloud Messaging (GCM)の番号が必要になり、登録作業を行いました。これも[チュートリアル（mBaaSとGCMの連携に必要な設定）](http://mb.cloud.nifty.com/doc/current/tutorial/push_setup_android.html)を見ればできる作業ですが、Parse.comでは不要な作業だったので、手間に感じました。

4は問題なく利用できました。Parse.comにはない、ダイアログ表示とかURL表示（richURLと呼ばれている）が簡単にできて楽でした。

5のREST APIを利用する際は、[シグネチャを取得する必要がある](http://mb.cloud.nifty.com/doc/current/rest/common/signature.html)とのことで、その取得方法を実装するのが面倒でした。これについては[別記事](http://qiita.com/dgw/items/414296046acd5d6492fc)を書きました。

##両者の比較

両者ともにPush通知の部分しか試してないですが、お試しで雰囲気をつかむにはParse.comが非常に楽でした。少し凝ったこと（ダイアログ表示とかURL表示とか）を試す場合はniftyクラウドmobile backendの方がAndroidアプリ開発はほぼ不要なため楽ですが、その前後の各種登録作業やREST API署名のところが少し面倒でした。

ヘルプやチュートリアルは両者ともに充実してます。Parse.comは全体的にシンプルな考え方でいろいろ構成しているような印象を受けました。niftyクラウドmobile backendは日本語で書かれているのがポイントが高いです。
brew cask install で undefined method error出た時

## brew cask install でエラー出て困った・・・。

brew update caskroom/cask/brew-cask でアップデートかければいいみたい。

```
% brew update caskroom/cask/brew-cask
This command updates brew itself, and does not take formula names.
Use `brew upgrade <formula>`.
```

おっと、updateじゃなくて、upgradeじゃないとダメだった・・・。

```
% brew upgrade caskroom/cask/brew-cask
==> Upgrading 1 outdated package, with result:
caskroom/cask/brew-cask 0.56.0
==> Upgrading caskroom/cask/brew-cask
==> Cloning https://github.com/caskroom/homebrew-cask.git

・・・中略・・・

==> Checking out tag v0.56.0
🍺  /usr/local/Cellar/brew-cask/0.56.0: 2802 files, 11M, built in 20 seconds
```

無事アップデートできた！
PySideのインストールにハマった

* LinuxMint17.2

## 参考

* [Freemat - problems to built on ubuntu8.04 [Archive] - Ubuntu Forums](http://ubuntuforums.org/archive/index.php/t-830929.html)

## インストール

```bash:
apt-get install -y cmake qt4-qmake libxml2-dev libxslt1-dev libqt4-core libqt4-gui qtcreator-dev libqt4-opengl-dev
```

* libqt4-opengl-dev を入れるのに気が付かずハマった。

```bash:15分くらいかかる
sudo easy_install PySide
```

続きは http://qiita.com/tags/pyside を参照
PostGISにEPSGコードを追加する

##状況・背景

* PostGISで利用できる空間参照系は、spatial_ref_sysテーブルに登録されているもののみ
* マニアックな空間参照系（今回の例では、EPSG:55005）は定義されていない
* sparial_ref_sys登録には、投影情報のproj記法とwkt記法の両方が必要
* projまたはwktのどちらかだけが分かっている（今回の例では、proj記法だけが公開されている）

##環境

CentOS 7.1
PostgreSQL 9.4
PostGIS 2.94

##projからwktを求める

GDALのライブラリを利用する。下記参考サイトにproj/wkt双方向の変換が可能なpythonスクリプトがあったので拝借。
参考サイト：[Converting WKT projection info to Proj4 (and back)]
(http://spatialnotes.blogspot.jp/2010/11/converting-wkt-projection-info-to-proj4.html)

pythonがインストールされていることを確認し、
<pre>
$ python -V
Python 2.7.5
</pre>

yumでgdalをインストール。
<pre>
$ sudo yum install -y gdal gdal-devel gdal-python
</pre>

あとは、[参考サイト](http://spatialnotes.blogspot.jp/2010/11/converting-wkt-projection-info-to-proj4.html)に掲載されたスクリプト（↓↓↓）を適当なところに置き、

```lang:proj2wkt.py
#!/usr/bin/env python

import os
import sys
import string
import osgeo.osr

if (len(sys.argv) <> 2):
        print 'Usage: proj2wkt.py [Proj4 Projection Text]'
else:
        srs = osgeo.osr.SpatialReference()
        srs.ImportFromProj4(sys.argv[1])
        print srs.ExportToWkt()
```

パラメータにproj記法の文字列を指定して実行

<pre>
$ ./proj2wkt.py "+proj=eqc +a=6377397.155 +b=6356079 +lat_ts=35.43094469 +lon_0=0 +lat_0=0 +k=1.0 +x_0=0 +y_0=0 +units=m no_defs"
PROJCS["unnamed",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",6377397.155,299.1533345638937]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",0],PARAMETER["standard_parallel_1",35.43094469],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]
</pre>

##PostGISに登録

上で求めたwktを、projと合わせてspatial_ref_sysにインポート。
<pre>
INSERT INTO spatial_ref_sys(srid, auth_name, auth_srid, srtext, proj4text) VALUES (55005, 'EPSG', 55005, 'PROJCS["unnamed",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",6377397.155,299.1533345638937]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",0],PARAMETER["standard_parallel_1",35.43094469],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]', '+proj=eqc +a=6377397.155 +b=6356079 +lat_ts=35.43094469 +lon_0=0 +lat_0=0 +k=1.0 +x_0=0 +y_0=0 +units=m no_defs');
</pre>

##補足

今回のケースではprojからwktを求めて登録したが、逆のパターン（wktが分かっているけどprojが不明なケース）にも対応可能。その際は以下のスクリプトを利用する。

```lang:wkt2proj.py
#!/usr/bin/env python

import os
import sys
import string
import osgeo.osr

if (len(sys.argv) <> 2):
        print 'Usage: wkt2proj.py [WKT Projection Text]'
else:
        srs = osgeo.osr.SpatialReference()
        srs.ImportFromWkt(sys.argv[1])
        print srs.ExportToProj4()
```

以上
Powershellを使ってFTPでデータ取得

FTPサーバーからテキストデータを取得するという作業があります。

以前はコマンドプロンプトのバッチファイルで行っておりました。
以下の欠点がありました。

##コマンドプロンプトのFTP送信の欠点

- 相対パスでは動かずフォルダを動かすだけで動かなくなる
- ソースが非常に読みにくい

ナウでヤングなWindowsユーザーであれば、
コマンドプロンプトは窓から投げ捨ててPowerShellを使うべきでしょう。

##PowershellでFTP

Powershellで作ってみました。
スクリプトファイルのパスを取得するようになっているので、
どの場所に置いても動き出します。

```ps1:FTPでデータを取得
$user     ='username'
$password = 'password'
$url      = 'ftp://serveripaddress'
 
# WebClientを生成
# FTP設定
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential($user,$password)
$wc.BaseAddress = $url


# スクリプトファイルのパスを取得
$mypath=Split-Path ( & { $myInvocation.ScriptName } ) -parent

# ファイルをダウンロード
## %2f を付けると / (root) からのデータ取得になる。
## .DownloadFile(ダウンロード元ファイル名,ダウンロード先ファイル名)
$wc.DownloadFile("%2f/tmp/filename",$mypath+"\filename.txt")

# 終了
$wc.Dispose()

```

WindowsXPを管理する時代が長かったので、
System.Net.WebClientを直接呼び出しています。

PowerShell v3.0以降が動く環境であれば、
Invoke-WebRequestでもいいかもしれません。

###Invoke-WebRequestでFTP

Invoke-WebRequestでFTPからダウンロードも作ってみました。
Invoke-WebRequestはダウンロードはできてもアップロードはできませんので、あしからず。

- PowerShell v3.0 以降

```ps1:InvokeWebRequestでFTP
$user     ='username'
$password = 'password'
$url      = 'ftp://serveripaddress'

# FTP認証 Nework.CredentialではなくPSCredentialを使用
$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($user,$str)


# スクリプトファイルのパスを取得
$mypath=Split-Path ( & { $myInvocation.ScriptName } ) -parent


# データのダウンロード
## %2f を付けると / (root) からのデータ取得になる。
Invoke-WebRequest -Uri $url"$2f/tmp/filename.txt" -OutFile $mypath"\filename.txt" -Credential $cred

```

##参考文献
相対パスと絶対パスのところを参照
[FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする](http://dobon.net/vb/dotnet/internet/ftpwebrequest.html)

[実行しているスクリプトのパスを取得 (PowerShell)](http://www55.atwiki.jp/sabakanse/pages/19.html)
[Invoke-WebRequest - MSDN](https://technet.microsoft.com/en-us/library/hh849901.aspx)
Rails ActiveRecord のバリデーションエラーを各 attribute の最初の一件だけにフィルターしたい

Rails の ActiveRecord が提供するバリデーション機能で以下のようなことをやりたい：

- 各 attribute に複数のバリデーションルールが指定されている（例: `validates :name, { presence: true, length: { maximum: 100 } }`）
- 画面上で各 input の横に出すのではなく一番上にまとめてエラーメッセージを列挙したい
- 画面上でそれぞれの attribute に対して最初にひっかかった一つだけエラーメッセージを表示したい
- バリデーションルールにいちいち if で「前のエラーがなかったら」とか前後関係を指定したくない

私が知る限り、こういうことは標準ではできないように思います（Rails 4.2.3 時点）。「一個引っかかったら次以降のバリデーションはスキップする」とか宣言できると便利だと思うのですが・・。

とりあえず、ちょっと力技な感じで対応しました。まず、こういう共通メソッドを定義しておきます。

```rb
def set_one_error_for_one_attribute!(model)
  model.errors.keys.each do |key|
    single_error = model.errors.get(key).try(:first)
    model.errors.delete(key)
    model.errors[key] = single_error
  end
end
```

で、入力エラーのパターンで render する前にこれを呼び出して model.errors を書き換えてしまうだけ。

```rb
  def create
    # 省略...
    if @comment.save
      redirect_to comments_path
    else 
      set_one_error_for_one_attribute!(@comment)
      render action: 'new'
    end
  end
```
JavaScript ショートハンドまとめ

# JavaScriptショートハンドまとめ

## 更新履歴
- 2015/08/19 作成

---

### 文字列が含まれていたら
```javascript:
var someStr = 'abcdefg';

/* Long */
if (someStr.indexOf('abc') != -1) {
  // => Found
} else {
  // => Not Found
}

/* Shorten */
if (~someStr.indexOf('abc')) {
  // Found
} else {
  // Not Found
}
```

---

### 文字列から数値への型キャスト
```javascript:
var someStr = '123';

/* Long */
parseInt(someStr, 10);

/* Shorten */
+someStr;
```

---

### 数値から文字列への型キャスト
```javascript:
var someNum = 123;

/* Long */
someNum.toString();

/* Shorten */
''+someNum;
```
gulp-ejsを利用してJSONファイルからURLを一括挿入

大量のURLをHTMLに挿入する場合、
エクセルからURLをコピペしてちまちま貼り付けることも多いですが、
gulp-ejsを利用すると一括でURLを挿入できます。
※node.jsとgulpは既にインストール済みとしてインストール方法は省略します。

* このサンプルのファイル構成

```lang:project
┣ gulpfile.js
┣ sample.json <- ejsテンプレートに読み込ませるjsonファイル
┣ sample.ejs  <- ejsテンプレート
┗ sample.html <- 出力結果
```

# gulp-ejsのインストール
```
npm install --save-dev gulp-ejs
```

# jsonファイルを用意する

```lang:sample.json
[
	{
		"url":	"http://www.test1.com/"
	}
	,
	{
		"url":	"http://www.test2.com/"
	}
	,
	{
		"url":	"http://www.test3.com/"
	}
	,
	{
		"url":	"http://www.test4.com/"
	}
]
```
# gulpfile.jsの記述例

```lang:gulpfile.js
var plumber = require('gulp-plumber');
var rename = require('gulp-rename');
var ejs = require("gulp-ejs");

var jsonData = require('./sample.json'); // jsonファイル読み込み

gulp.task('setEjs', function() {
    gulp.src("./sample.ejs")
    .pipe(plumber())
    .pipe(ejs({jsonData:jsonData })) // ejsテンプレートに渡す
    .pipe(rename("sample.html"))
    .pipe(gulp.dest("./"))
});

//ファイルの監視
gulp.task("default",['server'], function() {
    gulp.watch(["./sample.ejs"], ["setEjs"]);
});
```

# ejsテンプレートの記述例
```lang:sample.ejs
<% 
var len = jsonData.length;
var url;
// URLを順番に取得するクロージャ
function setURL(){
  var i = 0;
  return function(){
    url = i < len ? jsonData[i].url : 'error';
    i++;
  };
}
var set = setURL();
%>
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<p><a href="<% set(); %><%= url %>"><%= url %></a></p>
<p><a href="<% set(); %><%= url %>"><%= url %></a></p>
<p><a href="<% set(); %><%= url %>"><%= url %></a></p>
<p><a href="<% set(); %><%= url %>"><%= url %></a></p>
</body>
</html>
```

# 出力結果
```lang:sample.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<p><a href="http://www.test1.com/">http://www.test1.com/</a></p>
<p><a href="http://www.test2.com/">http://www.test2.com/</a></p>
<p><a href="http://www.test3.com/">http://www.test3.com/</a></p>
<p><a href="http://www.test4.com/">http://www.test4.com/</a></p>
</body>
</html>
```
＜自分用メモ＞よく使うGitコマンド一覧

## コミット履歴を継承してマージ
git merge


```
$ git checkout master
$ git merge hotfix
```

## マージコミットを作って一括マージ

```
$ git merge --no-ff
```

## 派生元ブランチが更新された場合にベースを合わせる
git rebase

```
$ git co <branch name>
$ git rebase master
```

## まちがって修正したファイルを元に戻す
```
$ git checkout HEAD <誤って修正したファイル名>
```

## HEADの状態にファイルを戻す

```
$ git reset --hard
```
* 参考: http://transitive.info/article/git/command/reset/


## 後からファイルを非管理対象にする
すでにコミットしてしまったファイルをignoreする場合に実行。
これとは別にgitignoreファイルには記述する

```
git rm --cached
```
* 参考：
http://blog.hello-world.jp.net/?p=1536

## git co -b  branch-name origin/branch-name
リモートリポジトリからブランチ作成
http://sessan.hatenablog.com/entry/2012/11/04/132746

## 一括add . & commit
```
git commit -a
```

## 1つ前のコミットのコメントを修正
```
git commit --amend
```

## 前のコミットを取り消し

```
# ファイルを残す
git reset --soft HEAD^

# ファイルを残さない
git reset --hard HEAD^
```

## branchの削除
```
git branch -d <branchname>
```

## 現在の変更を一時的に退避させる
作業途中でブランチ切り替えたいときに便利。

```
git stash save
# 復活コマンド
git stash pop
```
Vagrant vagrant upしたときに"Authentication failure. Retrying..."警告がでてvagrant sshできない状態からの脱出

## 遭遇した問題

なぜかvagrant upをすると以下のような警告

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
```

仮想マシンの起動自体はできていて、sshの鍵認証に失敗している模様

```
$ vagrant ssh
vagrant@127.0.0.1's password:
```

をするとパスワードを求められてしまう

## 解決策

半日くらい悩んで、
仮想マシン側の/home/vagrantのパーミッションが不適切なのが原因だと判明
これは別にVagrantに限った問題ではなく、sshの仕様のせい。
仮想マシンなので悪びれることもなくおっぴろげの777にしていたことを反省。

vagrantだとデフォルトのパスワードが"vagrant"なので、
パスワードログインしてパーミッションを755に変更して解決

## 大事なこと
**公開鍵認証の仕様でパーミッションが適切で無いとエラーになる**
1. 接続先ホームディレクトリは700 or 711 or 755
2. 接続元は.sshは700, .ssh/id_rsa（秘密鍵）は600

2はこれまでも遭遇していたが、1に関しては今回初めて知った。
2と違ってエラーが明示されないので苦戦した。

## 参考
http://www.pistolfly.com/weblog/2007/02/ssh.html
CentOS7.3にpostgresql9.5とPostGIS2.2.5-1インストール

##リポジトリ追加

・Postgresql
<pre>
 $ sudo rpm -ivh https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm
</pre>

・EPEL
<pre>
 # yum -y install epel-release
</pre>

##インストール

・Postgresql
<pre>
 # yum -y install postgresql95 postgresql95-server postgresql95-libs postgresql95-contrib postgresql95-devel
</pre>

・PostGIS
epelを有効にしてインストール
<pre>
 # yum -y --enablerepo=epel install postgis2_95
</pre>

##起動

下記サイトを参考にしました。
[CentOS7にPostgreSQL9.3と最新のもので環境構築してみた。](http://maplesystems.co.jp/blog/all/programming/11668.html)

・環境変数設定
<pre>
 $ sudo su postgres
[postgres]$ vi ~/.bash_profile

export PATH=$PATH:/usr/pgsql-9.5/bin # PostgreSQLのコマンドパスを設定
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/pgsql-9.5/lib # PostgreSQLの共有ライブラリを設定

[postgres]$ source ~/.bash_profile
</pre>

・DBクラスタ初期化
<pre>
[postgres]$ initdb --encoding=UTF8 --no-locale
</pre>

・サーバプロセス起動
<pre>
 # systemctl start postgresql-9.5.service
</pre>

・自動起動設定
起動スクリプトは作成されるので、項目の修正が必要な場合には/etc/systemd/system/postgresql-9.5.serviceを作成して追記する。
<pre>
 # vi /etc/systemd/system/postgresql-9.5.service

.include /lib/systemd/system/postgresql-9.5.service

・・・ここに追記・・・

 # systemctl enable postgresql-9.5.service
</pre>

以上

※2016/4/9追記内容：
・CentOS7.2で動作確認（タイトル7.1→7.2に変更）。
・自動起動設定で、/lib/systemd/system/postgresql-9.4.service を直接修正せず、/etc/systemd/system/postgresql-9.4.serviceを新規作成したうえで上記をインクルードし、変更したい項目だけ記述するように変更（コメントにて指摘いただきました）。
・タイトルにPostGISバージョンを記載。
・EPELリポジトリインストール方法をrpmからyumに変更。

※2017/4/10追記内容：
・CentOS7.3, PostgreSQL9.5, Postgis2.2.5-1に対応。
pecoインストール

## 方法1

* [Releases · peco/peco · GitHub](https://github.com/peco/peco/releases)

からバイナリダウンロード

## 方法2

```bash:
sudo apt-get install gccgo-go
```

```bash:~/.bashrc
export GOPATH=$HOME/bin/go
export PATH=$PATH:$HOME/bin:$GOPATH/bin
```

```bash:
source ~/.bashrc
mkdir -p $GOPATH
cd $GOPATH
go get github.com/peco/peco/cmd/peco
```

## 使い方

```bash:
man man | peco
```

* ctrl-n, ctrl-p で上下に移動。

## ctrl-r を強化する

* [golang - Ubuntu12.04にGoを入れてPecoが使えるようになるまで（bash編） - Qiita](http://qiita.com/tokumura11/items/a47368b7a9f66851024c)

```bash:~/.bashrc
# scp時、「bind: 警告: 行編集が有効になっていません」対策
if [ -z "$PS1" ]; then
    return;
fi

peco-select-history() {
    declare l=$(HISTTIMEFORMAT= history | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$READLINE_LINE")
    READLINE_LINE="$l"
    READLINE_POINT=${#l}
}
bind -x '"\C-r": peco-select-history'
```

* ctrl-r を押すとpeco-select-historyが実行される。便利
ST_MultiがGeometryCollection型を返したら、Geometry型に変換する

多数のポリゴンをST_Unionで結合したあと、ST_Multiでマルチポリゴン化すると、予期せずGeometryCollectionが返ることがある。
 GeometryCollectionを扱えない関数が多いので、そんな時にはST_CollectionExtractを利用する。

例）
municipalityテーブルのgeomを、pref-code毎にUNIONしてprefテーブルに登録する。
municipalityテーブルのgeomはシングルポリゴン、prefテーブルに登録する際にはマルチポリゴンにする。
<pre>
INSERT INTO pref (
	municipality-code,
	population,
	geom)
	SELECT pref-code, count(*), ST_CollectionExtract(ST_Multi(ST_Union(geom)), 3) FROM municipality GROUP BY pref-code;
</pre>
io.Copy and timeout


io.Copy is useful in passing date from Reader to Writer. However, io.Copy hides Read(), Write() method calls.

When we want to set timeout to TCP socket I/O, I found wrapping this with customized type is the straight forward way like this:

```golang
package main

import (
	"io"
	"log"
	"net"
	"syscall"
	"time"
)

type IdleTimeoutConn struct {
	Conn net.Conn
}

func (self IdleTimeoutConn) Read(buf []byte) (int, error) {
	self.Conn.SetDeadline(time.Now().Add(5 * time.Second))
	return self.Conn.Read(buf)
}

func (self IdleTimeoutConn) Write(buf []byte) (int, error) {
	self.Conn.SetDeadline(time.Now().Add(5 * time.Second))
	return self.Conn.Write(buf)
}

func main() {
	ln, err := net.Listen("tcp", ":7")
	if err != nil {
		panic(err)
	}
	for {
		con, err := ln.Accept()
		if err != nil {
			if eno, ok := err.(syscall.Errno); ok && eno.Temporary() {
				continue
			}
			panic(err)
		}
		go func() {
			tcon := IdleTimeoutConn{
				Conn: con,
			}
			log.Print(io.Copy(tcon, tcon))
		}()
	}
}
```
Promiseを外からresolveする

#### TypeScript
`aaaaaaaaa`の10秒後に`bbbbbbbbb`が出力されます↓

```ts

class DeferredPromise{
    promise:Promise<any>
    resolve:Function
    reject:Function
    constructor(){
        this.promise = new Promise((_resolve, _reject)=> {
            this.resolve = _resolve
            this.reject = _reject
        })
    }
}

var deferred = new DeferredPromise()

setTimeout(()=> {
    deferred.resolve()
}, 10000)

Promise.resolve().then(()=> {
    console.log('aaaaaaaaa')
}).then(()=> {
    return deferred.promise
}).then(()=> {
    console.log('bbbbbbbbb')
})
```

#### JavaScript
ちなみにコンパイル後↓

```js

var DeferredPromise = (function () {
	  function DeferredPromise() {
	      var _this = this;
	      this.promise = new Promise(function (_resolve, _reject) {
	          _this.resolve = _resolve;
	          _this.reject = _reject;
	      });
	  }
	  return DeferredPromise;
})();
var deferred = new DeferredPromise();
setTimeout(function () {
	  deferred.resolve();
}, 10000);
Promise.resolve().then(function () {
	  console.log('aaaaaaaaa');
}).then(function () {
	  return deferred.promise;
}).then(function () {
	  console.log('bbbbbbbbb');
});
```
[参考にした記事](http://matsu-chara.hatenablog.com/entry/2015/03/03/120000)
[よく見たらPromiseの本にも書いてあった](http://azu.github.io/promises-book/#deferred-and-promise)
oFとkinect V2で子供向けインスタレーションを作って学んだこと。

先日、業務で子ども向けのインスタレーションを作成して2日間展示・運営しました。
非常に勉強になったのでメモです。

インスタレーションの展示は、趣味ではいくつか作ってデザインフェスタなどに出展などしてましたが、実務では初めてでした。


#内容
子ども向けのイベント用コンテンツ。
キネクトが人の顔を検知すると、
上半身に魔法のアニメーションがかかり、目や鼻や耳にパーツがつく。
最大6人プレイ。
「いないいないばあ」で再度パーツチェンジ

#制作環境
openFrameworks
kinect v2
windows8
Visual Studio Express 2012





#感想

現場には魔物が住んでいる。。
「たぶん大丈夫」はほとんどトラブルにw

入念な準備とテスト。
大小のトラブルに冷静に対処していく能力が必要だと思いました。


#起こった問題

##  問題1.キネクト出す穴がサイズ違う

夜中の設営作業中。
セットの板からキネクトを出す予定だったのですが、なぜか図面とサイズが違ってキネクトがでないww
大工さんにお願いして板を切って穴を大きくしてもらいました。（「切ってやるよ！」と言ってくれた親方かっこいい。。）


## 問題2.ディスプレイにうつらない
ディスプレイをイベント会社の方から借りたのですが、なぜか時機winとディスプレイが接続されない。。
ケーブルの相性？結局自分で持っていったHDMIケーブルにすることでかいけつ。原因は謎のまま。予備大事。

## 問題3. 出力の色味が変
なぜかディスプレイの色味が変だったので、パソコン側は正常だったので、ディスプレイのリモコンで調整しました。（この辺でディスプレイ持って来てくれた方と苦労を共有し、少し仲良くなるw）


## 問題4、デザイン見切れる 
ディスプレイの上に装飾するデザインだったのですが、それで隠れた
画面の端に写るはずの画像がうつらない！w
結構聞いてたサイズと違う。
すかさず調整。
主要パラメーターをGUIで調整できるようにするのは必須だなぁ、、、と思いました。unityだとこういうとこも調整しやすいし、良いんだろうなぁ。



## 問題6、小さい子が非常に検知しにくい 
100cm前後の小さい子供がなかなか検知してくれない、、。
ググッたら130cm以上だと安定して検知するらしいと海外の開発ブログに書いてあり（信憑性は謎）、のことで、
「小さい子は難しい」とアナウンスしていたのですが、親が抱き抱えてキネクトの前で待っている。。笑
どっちかというと親があきらめてない。
しょうがないので初日の夜に、
マウスポインタでクリックすると
変身する機能追加。→ちょっと不自然だけど喜んでくれた。
最大6人プレイなのだが、テスト時は常に6人いけたけど、当日は安定して同時検知したのは4人くらいだったなぁ。。俺のプログラムのせいなのだろうか。。
そもそも大量の子供を呼んでテストできる機会が少なかったのでデバッグ難しかった！


## 問題7、子ども大暴走

セットを壊そうとしたり、わざと検知されないように逃げたり、子供大暴走ww
すごく走り回るから、すぐわかりやすいレスポンスを返してあげたほうが喜ぶかも。
当日、変身のアニメーションを半分のコマ数に修正。



## 問題8、混乱時の奥の手を用意
6人入れ替わりで運営するはずが、
15人くらい入ってきて大混乱。。
バイトの子がさばききれてなかったみたいです。
事前に実装してた、
手動でキーを押すと、カーテンがしまるアニメーションが流れる機能が大活躍。
終わりかな？と入れ替えにも使えたし、検知のリセットにも使えた。
カーテンの開閉だけで子供がキャッキャ言ってたのでOKかと思いましたw
（ちらっとだけカメラの映像が見える部分を残しといたのがウケました）


#まとめ

以上、本当にいろいろ勉強になりました。
キャッキャ楽しそうに遊んでくれるのを見るとやっぱり嬉しいのでまた作りたいです。

・場数が大事だ。現場は勉強になった！！
・キネクトSDKがC++ の勉強になった。
・子供の動きは想像を超えてくるので面白いけど大変！w


魔法の美術館とかでもそうだけど、
センサー系って難しいなぁ。
ハロウィンのやつも椅子に座らせて距離とってたり計算されてたもんなぁ。

がんばろっと！
Dynamosaurusを使ってamazon DynamoDBをrubyで操作する

Dynamosaurusは、rubyでAmazon DynamoDBを操作するOR Mapperです。使い方は簡単です。dynamosaurusのgemをinstallします。

    gem install dynamosaurus

bundleを使っている場合には、Gemfileに追加して

    bundle install

続いてmodelを定義します。

    require "dynamosaurus"
        
    Aws.config = {
      :endpoint => "http://localhost:8000",
      :region => 'local_test',
    }
    
    class SimpleKVS < Dynamosaurus::DynamoBase
      key :simple_key, :string
    end

    class SimpleOrderedKVS < Dynamosaurus::DynamoBase
      key :simple_key, :string, :simple_id, :string
      secondary_index :updated_at_index, :updated_at, :number
    end
    
    class Comment < Dynamosaurus::DynamoBase
      key :content_id, :string, :message_id, :string
      global_index :user_index, :user_id, :string
    end

dynamosaurusはaws-sdkのv2を使っていてawsの設定はaws-sdkの設定をみます。上記では、ローカルで動いているdynamodb_localを使うように設定しています。
modelのクラスにはkeyとindexを定義しています。
keyは、key名と型を書きます。１つ目はHASHキー、２つ目はRANGEキーです。
indexは、global_indexとsecondary_indexが定義できます。keyと違う点は１つ目にkey nameを指定します。global_indexはkeyと同じ内容、secondary_indexはRANGEキーのみが定義できます。

    Dynamosaurus::DynamoBase.create_tables

で、テーブルが作成されます。作成されるテーブル名は#{table_name}_localと自動的に決定されます。今回のモデルでは、comment_local, simpleorderedkvs_localの２つのテーブルが作成されます。ENV['DYNAMODB_SUFFIX']で"_production", "_development"など指定して、テーブル名のsuffixを変更できます。

SimpleKVSで、CRUDとadd(加算)をします。

    SimpleKVS.put({:simple_key => "key", :num => 1})
    SimpleKVS.get("key").num      # => 1
    SimpleKVS.first.num           # => 1
    SimpleKVS.add("key", {:num => 1})
    SimpleKVS.first.num           # => 2
    kvs = SimpleKVS.first
    kvs.update({:opt => "1"})
    kvs.opt                      # => 1
    kvs.attr_delete(["opt"])
    kvs.try(:opt)                # => nil
    kvs.delete
    SimpleKVS.get("key")         # => nil


secondary indexを使う場合は

    SimpleOrderedKVS.put({:simple_key => "key", :simple_id => "1"})
    sleep 1
    SimpleOrderedKVS.put({:simple_key => "key", :simple_id => "3"})
    sleep 1
    SimpleOrderedKVS.put({:simple_key => "key", :simple_id => "2"})

    SimpleOrderedKVS.get(
        {:simple_key => "key"},
        {:scan_index_forward => false, :limit => 50}).
    map{|kvs| kvs.simple_id }  
    # => [2, 3, 1]

dynamosaurusでは更新時に updated_at にtimestampをつけて保存しています。上記例ではupdated_atの時刻をずらすためにsleep 1をしています。これで作成したデータを更新順に取得しています。secondary indexはmodelで定義しているので、データ取得時にはindexを明示的に指定する必要がありません。

また、keyがHASHキーとRANGEキーのmodelはデータをgetするときにkeyを配列で指定します。

    SimpleOrderedKVS.get(["key", "1"]).simple_id    # => "1"

global indexを使う場合も同様です。

    Comment.put({:content_id => "1", :message_id => "1", :user_id => "abc"})
    Comment.put({:content_id => "1", :message_id => "2", :user_id => "abc"})
    Comment.put({:content_id => "1", :message_id => "3", :user_id => "xyz"})

     Comment.get(
         {:user_id => "abc"}
     ).map{|comment| comment.message_id}   
     # => ["2", "1"]

このようにdynamosaurusを使うとjsonのスキームと格闘してテーブルを作成する必要がなくなり、またindexを使ったデータ取得が簡単に行うことができます。
Three.jsの基礎基礎メモ

##準備

####下記からjsをダウンロード

<a href="http://threejs.org/" target="_blank">http://threejs.org/</a>

####CDNは下記から
<a href="//cdnjs.cloudflare.com/ajax/libs/three.js/r71/three.min.js" target="_blank">//cdnjs.cloudflare.com/ajax/libs/three.js/r71/three.min.js</a>

##基本構成

* Scene (舞台）
* ーMesh (部品）
* ーーGeometry (形状）
* ーーMaterial (素材）
* ーLight (光）
* ーCamera (カメラ）

これらをレンダリング（描画）する。

##Scene
####シーンの作り方
```lang:js
var scene = new THREE.Scene();
```

##Light
DirectionalLight・・・太陽光のような一方向から光をあてるライト

```lang:js
var light = new THREE.DirectionalLight(0xffffff,1);
light.position.set(0,100,30);
scene.add(light);
```

AmbientLight・・・自然光のように全体的に光を当てるライト

```lang:js
var ambient = new THREE.AmbientLight(0x550000);
scene.add(ambient);
```
##Geometry
BoxGeometry・・・立方体を作る
new THREE.BoxGeometry(幅, 高さ, 奥行き)

```lang:js
    var geometry = new THREE.BoxGeometry(50, 50, 50);
```

SphereGeometry・・・球体を作る
new THREE.SphereGeometry(半径, 経度分割数, 緯度分割数, 開始経度, 経線中心角, 開始緯度, 緯線中心角)

```lang:js
    var geometry = new THREE.SphereGeometry(50);
```


CylinderGeometry・・・円柱を作る
new THREE.CylinderGeometry(上面の半径, 底面の半径, 高さ,円周の分割数, 高さの分割数, フタをしない:true,フタをする:false)

```lang:js
    var geometry = new THREE.CylinderGeometry( 5, 5, 20);
```

##Material
* MeshBasicMaterial・・・光をほとんど反射しない（質感小）
* MeshLambertMaterial・・・光をそこそこ反射する（質感中）
* MeshPhongMaterial・・・光をよく反射する（質感大）

```lang:js
    var material = new THREE.MeshLambertMaterial({
        color: 0x2FCDB4
    });
```
##Mesh
Geometry (形状）、Material (素材）を元に、Mesh (部品）を作成します。

```lang:js
 var cube = new THREE.Mesh(geometry, material);
```
Mashに影をつける場合

```lang:js
cube.castShadow = true;
```
表示位置を指定する

```lang:js
cube.position.set(0, 50, 0);
```
Sceneに追加する

```lang:js
scene.add(cube);
```

##Camera
カメラの作り方

```
var camera: THREE.PerspectiveCamera = new THREE.PerspectiveCamera(45, width / height, 1, 1000);
camera.position.set(200, 300, 500);
camera.lookAt(cube.position);
```

PerspectiveCamera・・・奥行きを見渡せる遠近法のカメラ

```
new THREE.PerspectiveCamera(視野角,画面サイズ,カメラの見える範囲最小値,最大値)
```

camera.lookAt・・・カメラの視野の中心座標を指定

```
camera.lookAt({x:0, y:0, z:0 });
```

##AxisHelper
部品を追加したあとに、3D空間がわかりやすくなるガイドのようなもの。

```
var axis = new THREE.AxisHelper(1000);
axis.position.set(0,0,0);
scene.add(axis);
```

##OrbitControls.jsで画面を操作する
###OrbitControls.jsとは
OrbitControls.jsを使用すると、マウスドラッグやマウスホイールによるカメラ移動を簡単に実装できる。

※OrbitControls.jsを使用中はlookAt関数が使えなくなります。

###使い方
①カメラオブジェクトをOrbitControlsクラスの引数に設定する

```lang:js
var controls = new THREE.OrbitControls(camera);
```
②renderの直前でupdateする(直後でもいいみたい）

```lang:js
var renderer = new THREE.WebGLRenderer();
controls.update();
renderer.render(scene, camera);
```
##記載内容のサンプル
<a href="http://codepen.io/satofaction/pen/ZGyOEE" target="_blank">サンプル</a>
大学、職場、研究室でしか閲覧出来ないWebへ接続

#プロキシって？
通信の中継ぎです。本来は
**クライアントマシン → Webサーバー**
ですがプロキシをかませると
**クライアントマシン → プロキシサーバー → Webサーバー**
となります

**特定のネットワークからしかアクセスできないWebサーバー（学内サーバー、社内サーバー、研究室内サーバー等）へアクセスするため**に、そのネットワーク内部のマシンをプロキシサーバーとして使うことができます。
またWebサーバーから見た時、プロキシからアクセスが来ているのでクライアントマシンの特定が簡単にはできません。

#設定
`$ssh -D 1080 username@hostname`
これで1080番ポートにSSHトンネルが掘られます

Macであれば
システム環境設定→ネットワーク→詳細
![スクリーンショット 2015-08-19 8.57.06.png](https://qiita-image-store.s3.amazonaws.com/0/62043/561e9823-0350-a58e-3727-06ad4b9925b5.png)
以上のように設定

https://www.cman.jp/network/support/go_access.cgi
のようなip情報確認Webページで確認すると

![スクリーンショット 2015-08-19 9.03.26.png](https://qiita-image-store.s3.amazonaws.com/0/62043/4027bb79-263b-795f-cccc-ae88b241ea3c.png)
↓
![スクリーンショット 2015-08-19 9.05.22.png](https://qiita-image-store.s3.amazonaws.com/0/62043/f55633eb-bacc-a7c5-9945-8b65b77fbbcc.png)

しっかり大学ホストからのアクセスに変わっていることが確認できます

これで大学、職場、研究室からしかアクセス出来ない資料にローカルブラウザでアクセスできます
SSHサーバーがない場合サーバー建てる必要がありますが、すごく簡単ですね
Macの場合ネットワーク設定を保存してすぐ切り替えられるので保存しておくのをおすすめします。
brew で Java をインストールして、jenv で管理する


パッケージ管理に brew-cask を使います。
brew-cask,anyenv,jenv の使い方は、各自調べてください。

```
brew install caskroom/cask/brew-cask
brew tap caskroom/versions
brew cask info java
brew cask install java7
brew cask install java
```
java 1.6 は元々入ってる

### anyenv で jenv をインストールしておく

```
anyenv install jenv
exec $SHELL -L
```

### jenv に java ホームを追加する

```
jenv add /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home
jenv global oracle64-1.8.0.51
```
Windows Azureの管理サイトから作成したCoreOSを使う

# AzureでCoreOSを使う

Windows AzureにはCoreOSのイメージ（テンプレート）があり、作成すればすぐに使えるようになります。
しかし、作成にはCLIを使え、という解説しか無かったりします。
（[CoreOSのガイド](https://coreos.com/os/docs/latest/booting-on-azure.html) / [Azureのガイド](https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-linux-coreos-how-to/)）

CLI入れるのも面倒くさいんだけど、それしかないの？
というと、そんなことはなくて、管理サイトから作ったCoreOSでも簡単にカスタマイズできます。

# 実作業

## 作る

普通に管理サイトから仮想マシンを作って

![q1.png](https://qiita-image-store.s3.amazonaws.com/0/59270/84378aed-a935-9c20-be6d-5cee2ccd613e.png)

CoreOSのイメージを選び

![q2.png](https://qiita-image-store.s3.amazonaws.com/0/59270/22f6eca1-aba0-bd79-bd50-06dd290f17dc.png)

仮想マシンの構成でユーザーを適当に作る

![q3.png](https://qiita-image-store.s3.amazonaws.com/0/59270/9ccfb2e7-df05-0a99-32c4-5b21e5d9ef8f.png)

出来上がります。

## カスタマイズ

sshで先ほど作った仮想マシンに作ったユーザーでログインします。

いつものcloud-configはいつもの場所に勝手に置きます。
書いたら再起動です。

```shell-session
$ sudo mkdir -p /var/lib/coreos-install
$ sudo vi /var/lib/coreos-install/user_data
$ sudo reboot
```

実は-pは要りません。
気分です。

これでいつものようにCoreOSを使うことができます。

# 追記

## ユーザーのこと

最初に作ったユーザーでsudoができるのは、waagentが

```shell-session:/etc/sudoers.d/waagent
azureuser ALL = (ALL) ALL
```

こんなファイルを作っているからです。
なので、仮想マシンを作るときにエージェントのチェックは付けたままにしておかないとダメです。
また、そのためにcloud-configで最初に作ったユーザーを含めても、

```yaml:/var/lib/coreos-install/user_data
users:
  - name: azureuser
    groups:
      - sudo
```

とかしても、sudoしたときにパスワードを聞かれます。
（後から- sudoでグループを割り当てるとパスワードを聞かれません）

## IPアドレスのこと

いつものcloud-configでは、$private_ipv4 の変数が使えます。
[CoreOSのcloud-configの説明](https://coreos.com/os/docs/latest/cloud-config.html)にはAzureは使えるとは書いていないのですが、[AzureのCoreOSの説明](https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-linux-coreos-how-to/)には使えることが書いてあります。
GitHub / GitLab で Unity 関連ファイルを折り畳んで楽々レビュー


## GitHub で Unity プロジェクトをレビューすることの辛み

`.meta` とか `.meta` とか `.meta` とか、レビューするときに表示されていると、本来、レビューすべきポイントが隠蔽されてしまって、色々とヨロシクないわけですよ。

そこで、先人の知恵を借りようと思って、まずは、ググってみたところ・・・

- [GitHubのdiff表示でUnity関係のファイルだけ折りたたむUserScript](https://gist.github.com/ymrl/6318334)
- [Improved Unity Diffs in GitHub - Johnny Code](http://johnnycode.com/2014/05/20/improved-unity-diffs-in-github/)

後者の Johny 氏のやり方は、ブラウザのブックマークレットとして実装する方法で、一番手軽でヨサソウだったので、実際に、試してみたところ、一部、GitHub 上のクラス名などが変更になっていて、そのままでは動作しなかったけど、修正したらそれなりに動いたので入れておくとヨサソウ。

## GitHub で Unity 関連ファイルを折り畳むブックマークレット

折り畳みたいファイルの拡張子は、ご自由に。

```
javascript:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};

$('.file-header').each(function(index, value) {
    var path = $(value).data('path');
    var ignores = ['.unity', '.meta', '.anim', '.controller', '.prefab', '.asset', '.mat', '.tpsheet'];
    for (i = 0; i < ignores.length; i++) {
      if(path.endsWith(ignores[i])) {
        $(value).parent().hide();
      }
    }
});
```

## GitHub で全てのファイルを開くブックマークレット

これ使うかな、使わないかな？

```
javascript:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};

$('.file-header').each(function(index, value) {
    $(value).parent().show();
});
```

## ショートカットキーからブックマークレットを呼び出して、更に、楽をする

Chrome を利用している場合、以下の Chrome 拡張を利用することで、自分のお気に入りのショートカットキーにブックマークレットを登録出来て大変便利なので、オススメ。

- [Keyconfig - Chrome ウェブストア](https://chrome.google.com/webstore/detail/empty-title/okneonigbfnolfkmfgjmaeniipdjkgkl?hl=ja)

## GitLab をお使いの方はこちら

### Unity 関連ファイルを折り畳むブックマークレット

```
javascript:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};

$('.diff-file').each(function(index, value) {
    var path = $(value).data('blob-diff-path');
    var ignores = ['.unity', '.meta', '.anim', '.controller', '.prefab', '.asset', '.mat', '.tpsheet'];
    for (i = 0; i < ignores.length; i++) {
      if(path.endsWith(ignores[i] + '/diff')) {
        $(value).hide();
      }
    }
});
```

### 全てのファイルを開くブックマークレット

```
javascript:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};

$('.diff-file').each(function(index, value) {
    $(value).show();
});
```
pattern > 依存関係逆転の法則 > 使用例

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

## draw関数がcoutクラスに直接結合する例

>描画を担当するdraw関数に注目してください。

```cpp
class Circle {
public:
  Circle(const Vector2& center, float radius) :
   center_(center), radius_(radius) {
  }
  void draw() {
    std::cout << "x:" << center_.x << " y:" << center_.y
        << " r:" << radius_ << std::endl;
  }
  double area() const {
    return radius_ * radius_ * M_PI;
  }
private:
  Vector2 center_;
  float radius_;
};
```

## draw関数が描画クラスとは直接結合しない例

```cpp
class Circle {
public:
  class Renderer {
  public:
    virtual ~Rendered() {}
    virtual void draw(const Vector2& center, float radius) = 0;
  };
public:
  Circle(const Vector2& center, float radius) :
   center_(center), radius_(radius) {
  }
  void draw(Renderer renderer) {
    renderer.draw(Center_, radius_);
  }
  ...
};
```

> RendererクラスはCircleクラスの内部クラスになっています。Circleクラスは外部の描画クラスとは直接結合しなくなりました。「依存関係逆転の原則」で紹介した方法です。
c++ > クラスの役割 >  作業役クラスと管理役クラス | 仲介役クラス | 窓口役クラス | 生成役クラス | 専用クラスと汎用クラス

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

> 設計の意図を明示するためにも、ある程度の役割分担を決めておく必要があります。クラスの役割と責任を考えるためのヒントとして活用ください。

>- 作業役クラスと管理役クラス
- 仲介役クラス
- 窓口役クラス
- 生成役クラス
- 専用クラスと汎用クラス

仲介役と窓口役の違いは
> 仲介役との違いは、仲介役は職場内の同僚との調整役をしますが、窓口役は外の職場との窓口業務を担当します。

専用クラスと汎用クラスについては
> 特定のアプリケーション固有の専用クラスと、再利用を目的とした汎用クラスは、はっきりと区別して設計する必要があります。
udp/tcp > 入力遅延と遅延エミュレータ > バッファリング

引用: オンラインゲームのしくみ: Unityで覚えるネットワークプログラミング by 河田匡稔（まさとし）さん
7.5 通信プログラムの動作確認とデバッグの仕方

> LANでは数msでデータが届いてしまうため、大きな遅延が発生するときの動作確認には使えません。そのため、LAN上でわざと通信遅延を発生させて、通信遅延の大きな環境を擬似的に作るための<font color=red>遅延エミュレータ</font>が必要になります。遅延エミュレータは、本章で学習した入力遅延のしくみを利用して作成することができます。

> キー入力遅延では、入力された情報を遅延させるフレーム数分、データをバッファリングします。バッファに情報が溜まるまでゲーム処理を停止させ、バッファがいっぱいになったときから１フレームに１回、バッファから入力データを取出します。こうすることで遅延を発生させています。送信するデータに対してこれと同様なことを行えば、通信遅延を発生させることができます。


通信環境が悪い状況をどのように再現するか検討していたが、この本に答えが書いてあった。

送信側を制御できない場合は、受信側でも同様にバッファリングを使って遅延を再現できそう。
esa APIでCreate or Updateをする #esa_io #ruby

esa APIを使って、

* 新規記事なら登録
* 登録済みなら更新

という処理を実装します。

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 前提
* esa-ruby gem を利用
* 環境変数の管理に dotenv gem を利用

※dotenvについては下記を参照  
<a href="http://qiita.com/tbpgr/items/b7126c3d2d8f0329b11c" target="_blank">Ruby | dotenv gem で 環境変数をスマートに管理</a>

## esa APIの利用準備
* esaのTEAMメニューを選択
* 自ユーザーを選択
* Personal access tokensタブを選択
* Generate new tokenをクリック
* Read / Write 双方にチェックをして Token description にAPIの用途を説明する内容を入力
* Saveをクリック
* tokenが表示されるので、内容を保存しておきます

## <i class="fa fa-code" style="font-size:1em;"></i> プログラム
### <i class="fa fa-gears" style="font-size:1em;"></i> dotenv
~~~
# 利用準備で取得したtokenを設定
ESA_API_TOKEN=your token
TEAM=your team
~~~

### 
~~~ruby
require 'dotenv'
require 'esa'
Dotenv.load

name = '記事タイトル'
category = 'サンプル/カテゴリ'
# 検証用のためtrueにしてます。実際はfalseが良いです
wip = true

client = Esa::Client.new(access_token: ENV['ESA_API_TOKEN'], current_team: ENV['TEAM'])
response = client.posts(q: "name:#{name} category:#{category}")
if response.body['total_count'] == 0
  client.create_post(
    category: category,
    name: name,
    wip: wip,
    body_md: "なんか適当な本文"
  )
else
  post_number = response.body['posts'].first['number']
  client.update_post(post_number, body_md: body)
end
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> 実用
こんな感じで必要になりました。
※リンク先に実際に実行した場合の画面キャプチャあり

<i class="fa fa-external-link-square" style="font-size:1em;"></i> [DRYな画面一覧管理。プログラムから画面名を抽出し、esa APIで共有する](http://cnxt.jp/topics/screenlist/)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> <a href="https://docs.esa.io/posts">esa api Document</a>
* <i class="fa fa-external-link" style="font-size:1em;"></i> <a href="https://github.com/esaio/esa-ruby">esa API client library, written in Ruby</a>
技術英語 > I can offer no [tangible evidence] on his behalf.

@ Star Trek Voyager > EX POST FACTO

診断結果について聞かれたTuvokが言った言葉

> I can offer no tangible evidence on his behalf.

「証言を裏付ける証拠がない」という訳がついていた。

<hr>
http://ejje.weblio.jp/content/tangible
> 1 触れて感知できる; 実体的な; 有形の.
> 2 明白な; 確実な.

<hr>
MITの石井裕教授がTangible Media Groupというグループを率いている。
http://tangible.media.mit.edu/person/hiroshi-ishii/

<hr>
Ruby - Hashをkey|valueでASC|DESCソート

# 経緯

- 一見、単純そうだが、クセがあるのでメモ。
- 手法は幾つかあるらしいが、自分のお気に入りのみメモ。


# ソートするデータ例
```rb
h = { "a" => 57, "c" => 81, "b" => 49, "d" => 77 }
```

# keyでソート

## ASC

```rb
Hash[ h.sort ]
#=> { "a" => 57, "b" => 49, "c" => 81, "d" => 77 }
```

## DESC

```rb
Hash[ h.sort.reverse ]
#=> { "d" => 77, "c" => 81, "b" => 49, "a" => 57 }
```

# valueでソート

## ASC

```rb
Hash[ h.sort_by{ |_, v| v } ]
#=> { "b" => 49, "a" => 57, "d" => 77, "c" => 81 }
```

## DESC

```rb
Hash[ h.sort_by{ |_, v| -v } ]
#=> { "c" => 81, "d" => 77, "a" => 57, "b" => 49 }
```

# 資料

- [class Hash](http://docs.ruby-lang.org/en/2.0.0/Hash.html)
- [How to sort a hash by value in descending order and output a hash in ruby?](http://stackoverflow.com/questions/13216092/how-to-sort-a-hash-by-value-in-descending-order-and-output-a-hash-in-ruby)
- [Hash Tricks in Ruby](http://thirtysixthspan.com/posts/hash-tricks-in-ruby)
iOS/Androidで容量ギリギリでアプリの動作を確認するTips

## 目的
ストレージが逼迫してくると思わぬ動作をすることがあります。
そこで、端末の容量に応じた挙動やエラー処理を確認したかったので、逼迫させる方法をまとめました。

## 動作環境
MacOSX 10.10

## アクション
1. `dd`コマンド
2. ダミーファイルの転送

## ddコマンドとは
cpみたいなものですが、これを使うと柔軟に好きなファイルのサイズを作ることができます。

## ダミーファイルを作る
```shell-session
~ ❯❯❯ dd if=/dev/zero of=/tmp/test.txt bs=1048576 count=100

100+0 records in
100+0 records out
104857600 bytes transferred in 0.130478 secs (803642577 bytes/sec)
```
これで、`1024^2 * 100`つまり100MBのダミーファイルを作ることができました。

#### オプションの説明
* if → input path
* of → output path
* bs → 単位バイトサイズ
* count → 単位バイトサイズをいくつ書き込むか

## 端末の容量を調べる
各OSの設定から確認してください。容量に応じてダミーファイルを作成していきます。

## ダミーファイルを転送する
#### Android 
`adb push /tmp/test.txt /storage/sdcard0/`
のようなコマンドで転送可能です。指定可能なディレクトリは権限通りです。

試したところ、
1. 18G空いてる
2. 18Gのファイル送る
3. 一瞬、容量が200MBくらいになる
4. 500MBくらいに増える
5. 500MBのダミーファイルを再度送る
6. 200MBくらいになる
と、**3~5を繰り返していったら1MBくらいまで減らせました**。tmpのパージとかがあるのでしょう。ちなみに容量1MB未満にしてテスト対象のアプリを起動したら、強制終了でした(´；ω；｀)ブワッ

#### iOS
iTunes経由でファイルを転送できるアプリをインストールすれば誰でも転送できます。
[Send AnyWhere](https://itunes.apple.com/jp/app/send-anywhere-fairu-zhuan/id596642855?mt=8)というアプリを自分は使いました。
![Screen Shot 2015-08-19 at 1.49.35 AM.png](https://qiita-image-store.s3.amazonaws.com/0/51409/6a64234f-4d33-98dd-8d71-fbcbaeb80f91.png)

## 動作確認の結果
1. Androidの場合、設定画面で表記される容量通りの挙動をしました。私のテスト対象アプリは起動時強制終了だった(´；ω；｀)ブワッ
2. iOSの場合、設定では0バイトと表記されていながら、下記のコードでは200MBという値が取得されました。写真を撮ることも可能だったので、標準アプリ用に確保されているのかも。また、0バイトと表記された後はファイル転送ができないので写真を撮るなりして追い詰めるしかないようです。

```objc
long get_space
{
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
 NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error:nil];
 return [[dictionary objectForKey: NSFileSystemFreeSize] longValue];
}
```
PolymerとBrowserifyを一緒に使う

どうも@laco0416です。PolymerとBrowserify一緒に使ってみました。

#結論
vulcanize後のHTMLがやばい。

# `<gravatar-img>`作った
とりあえず面白そうなのでGravatarのアイコンを表示するPolymerElementを[作った](https://github.com/laco0416/gravatar-img)。GravatarはemailのMD5をハッシュとしてURLに付与することでアイコンを取得できるらしいがそこらへんはパスしたいので今回は[node-gravatar](https://github.com/emerleite/node-gravatar)というNode.js用のライブラリを使った。

## PolymerからNode.jsを使えるようにする
当然そのままでは無理なのでBrowserifyを使う。とりあえず`window`に紐付けようと思ってエントリポイント的なJSを書いた。

```js:js/gravatar.js
window.gravatar = require("gravatar");
```

これをbrowserifyで`build/gravatar.js`にビルドする感じ。

```ts:gulpfile.ts
///<reference path="typings/gulp/gulp.d.ts"/>

import gulp = require("gulp");
var browserify = require("gulp-browserify");

gulp.task("build", () => {
  gulp.src("js/***")
  .pipe(browserify())
  .pipe(gulp.dest("build"))
});

gulp.task("default", ["build"]);
```

で、`build/gravatar.js`をPolymerから呼ぶ

```html:gravatar-img.html
<link rel="import" href="../polymer/polymer.html">

<dom-module id="gravatar-img">
  <template>
      <img src="{{ url }}">
  </template>
</dom-module>

<script src="build/gravatar.js"></script>
<script>

  Polymer({
    is: 'gravatar-img',

    properties: {
      email: {
        type:String
      }
    },

    ready: function() {
      this.url = ""
    },
    attached: function() {
      this.url = window.gravatar.url(this.email);
    }
  });
</script>
```

ちなみにすでにbowerには`gravatar-img`というパッケージがあって、まったく同じ機能のPolymerElementが配布してあった。それはgravatarのAPIのあたりも全部自前で書いてるっぽくてすごいなと思った。(地味にMD5のあたり面倒だと思う)

これで動くようになる。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="bower_components/webcomponentsjs/webcomponents.min.js"></script>
  <link rel="import" href="bower_components/gravatar-img/gravatar-img.html"/>
</head>
<body>
  <gravatar-img email="laco0416@gmail.com"></gravatar-img>
</body>
</html>
```

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/a5d4a3ec-6ca5-7bbe-c5f7-7515c3e61c67.png)

楽しい。

# vulcanizeしてみる
このindex.htmlをvulcanizeしてみる。

```
> vulcanize --inline-scripts index.html > build.html 
```

出来上がるbuild.htmlがこちら

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/3d086fdb-ae14-61c2-f447-294db27350cc.png)

WebStormの行番号のところ(ガターと呼ぶのだけど)が壊れてるあたりで察してほしい。

```
> ls -l
-rw-r--r--  1 laco  staff  332577 Aug 19 01:31 build.html
-rw-r--r--  1 laco  staff     330 Aug 19 01:28 index.html
```

まあNodeのcryptoとかbufferとか取り込んでるしPolymer自体も取り込んでるから仕方ない。
JavaScriptのXHRは認めてHTMLインポートだけどマージするとこうなる。

```
> vulcanize index.html > build.html 
```

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/98729b9e-ff0b-86c0-c74b-95e7f99e2c79.png)

ガターが直った。

```
> ls -l
-rw-r--r--  1 laco  staff  157196 Aug 19 01:36 build.html
-rw-r--r--  1 laco  staff     330 Aug 19 01:28 index.html
```

だいたい半分になった。

# まとめ
BrowserifyされたJSでもPolymerで何の問題もなく動いたのでNode.jsのパッケージ使ったPolymerElements作っていこうかなとちょっとモチベが上がった。
しかしPolymerとBrowserify組み合わせてHTMLとJSどっちもvulcanizeするとだいぶでかくなるのでモバイル向けとかで使うときは少し気にしたほうがいいかもしれない。300KBくらいならまあええんちゃう？って感じだけど。
Godepでpackageをupdateするとき


いつも忘れるので書いておきます。
aws-sdk-goのパッケージをアップデートする場合。

パッケージアップデート

```bash
go get -u github.com/aws/aws-sdk-go
```

依存関係のアップデート

```bash
godep update github.com/aws/aws-sdk-go
```

保存

```bash
godep save
```

以上。


### ついでに

aws-sdk-goをアップデートした時に出たエラー


```bash
go get -u github.com/aws/aws-sdk-go
godep update github.com/aws/aws-sdk-go
```

aws-sdk-goをアップデートしたあと 
Godeps.jsonもアップデートしようとしたら以下のようなエラーが出た。(MacOSX)

```
godep: not in manifest: github.com/aws/aws-sdk-go
godep: cannot find package "github.com/aws/aws-sdk-go/internal/apierr" in any of:
	/usr/local/Cellar/go/1.4.2/libexec/src/github.com/aws/aws-sdk-go/internal/apierr (from $GOROOT)
	/Users/xxxxxx/go/src/github.com/aws/aws-sdk-go/internal/apierr (from $GOPATH)
```

なので、

```bash
mv Godeps{,.bak}
godep save
```

した。