OmniAICreator/Qiita-1.07M huggingface dataset:
BeagleBone Black の初期設定


BeagleBone Black Rev.Cに関する個人的メモ

##仕様 
BeagleBone Black Rev.C

CPU : ARM Cortex-A8
MEM : 512MB DDR3 RAM
eMMC: 4GB
OS  : Debian
Interface : USB/LAN/HDMI/microSD (SDHC対応)


##SSH接続
ここでは、あらかじめeMMCにインストールされているDebianにSSH接続する。
有線LANを用いてBeagleBoneをルータに接続。
ターミナルソフトからSSH接続をする。なお、パスワードは無し。

```
$ ssh root@beaglebone.local
```


## Ubuntu 14.04をSDカードにインストール

### インストール
DebianがインストールされたBeagleBoneにSSH接続した後、microSDをBeagleBoneに挿入し、以下のコマンドを実行。

```
$ wget https://rcn-ee.net/deb/microsd/trusty/bone-ubuntu-14.04-2014-05-06-2gb.img.xz
$ unxz bone-ubuntu-14.04-2014-05-06-2gb.img.xz
$ sudo dd if=./bone-ubuntu-14.04-2014-05-06-2gb.img of=/dev/mmcblk0
```

※ubuntuのイメージデータの解凍、そしてSDカードへのOSのインストールは時間がかかるため、気長に待つ。

インストール終了後、BeagleBoneを一度シャットダウンする。

```
$ shutdown　-h now
```

###起動
USBポート側にあるSW2を押しながら電源を投入することで、SDカード上のOS(Ubuntu)がブートされる。

Debian時と同様にターミナルからSSH接続をする。
なお、パスワードは temppwd である。

```
$ ssh ubuntu@ubuntu-armhf 
```

###新規ユーザの追加
1. sudo権限を持ったユーザの追加をする。

	```
	$ sudo adduser ユーザ名 
	```
	※ ```adduser``` コマンドではホームディレクトリは作成されないことに注意。


2. 管理権限グループへの追加

	```
	$ sudo gpasswd -a ユーザー名 sudo
	```




##ローカルホスト名の変更
デフォルトである ローカルホスト名 ubuntu-armhf を任意のローカルホスト名に変更する

1. ローカルホスト名の確認

	```
	$ hostname
	ubuntu-armhf
	```

2. ローカルホスト名の編集
```hostname``` コマンドで任意のホスト名に変更

	```
	$ sudo hostname hogehogefoobar.local
	```

3. /etc/hostnameの編集

	```hostname``` を使用した場合、 ```/etc/hostname``` も書き換える必要がある。

	```
	$ sudo nano /etc/hostname
	```

4. 再度ローカルホスト名の確認
	ローカルホスト名が変更されていることを確認

	```
	$ hostname
	hogehogefoobar.local
	```

	変更したローカルホスト名は再起動後、適用される。


##無線LAN設定
BeagleBoneにUSBタイプの無線LANを増設することで、ワイヤレス接続を可能にする。
今回使用した無線LAN子機はBUFFALOの[WLI-UC-GNM2](http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/ "WLI-UC-GNM2")である。
[WLI-UC-GNM2](http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/ "WLI-UC-GNM2")はUSBに接続するだけで、ドライバ認識される。
下記のコマンドを実行することで、無線LANが認識されているか確認することができる。

```
$ iwconfig
```


下記のコマンドを用いて無線LANの設定を行う。


1. SSIDとパスワードの設定

	```
	$ sudo nano /etc/network/interfaces
	```

	```
	auto wlan0
	 iface wlan0 inet dhcp
	    wpa-ssid "接続先のSSIDの名前"
	    wpa-psk "パスワード"
	```

2. 無線LANの有効化

	```
	$ sudo ifup wlan0
	```


<del>※ 無線LAN経由でSSH接続した場合、当環境では有線LANと比べて多少のラグが感じられた。
> [Ubuntuの無線LANが遅い時の対処](http://qiita.com/Hiroshi-Ito/items/77610be6e49de62a5b48 "
Ubuntuの無線LANが遅い時の対処") にて解決策を記載




##zshの導入
デフォルトのシェルからzshへ変更する。

1. zshのインストール

	```
	$ apt-get install zsh
	```

2. デフォルトのシェルの変更
	
	```
	$ chsh
	Password: 
	Changing the login shell for USERNAME
	Enter the new value, or press ENTER for the default
		Login Shell [/bin/bash]: /bin/zsh
	```

3. 変更の確認
	ターミナルに再度入り直すと、デフォルトシェルが変更される。
	以下のコマンドでデフォルトシェルの確認ができる。

	```
	$ echo $SHELL
	/bin/zsh
	```
VB.NET でヒアドキュメント風

SQL文をVB.NETコード内で直接記述したいとき、

```vbnet:(1)
Dim query = _
	"select  *" & vbLf & _
	"from    hoge" & vbLf & _
	"where   a=1" & vbLf & _
	"and     b in('1','2','3')" & vbLf & _
	"order by" & vbLf & _
	"        a,b,c"
```

こんな書き方をしてませんか？
面倒ですよね。
ヒアドキュメント風にしてみましょう。

```vbnet:(2)
Dim query = <Query>
	select  *
	from    hoge
	where   a=1
	and     b in('1','2','3')
	order by
	        a,b,c
	</Query>.Value.Trim()
```

スッキリしました。
これはXMLリテラルを利用しています。
そのため、"<" や ">" が含まれる場合はエラーになってしまいます。
もうちょっと工夫してみましょう。

```vbnet:(3)
Dim query = <Query><![CDATA[
	select  *
	from    hoge
	where   a=1
	and     b<>1
	order by
	        a,b,c
]]></Query>.Value.Trim()
```

CDATAセクションを使うことで、"<" や ">" が含まれる場合も対応できます。
"]]>" という文字列が含まれる場合はこのやり方でもエラーになってしまいますが、
SQL文などを扱う分にはほぼ問題にならないでしょう。
jQuery Defferedオブジェクトとpromiseオブジェクトの違い


いままで`jQuery.Deferred.promose`使ったことがなくてでも困らなかったからそのままにしててずっともやもやしてた。

検索してもちゃんと説明されてるのがなくて(サンプル数2)よくわかんなかったけどreferenceにちゃんと書いてあった。
>    The Promise exposes only the Deferred methods needed to attach additional handlers or determine the state
>  [deferred.promise() | jQuery API Documentation](http://api.jquery.com/deferred.promise/)


```
sleep = (n) ->
  deferred = $.Deferred()
  setTimeout (n) ->
     deferred.resolve(true)
  , n

d = sleep().then () ->
 ...

```
みたいなときにsleepの外側で`d.resolve()`されたりしないようにするだけなのね。
というよりDeferredにはpromiseの値を変更できるメソッドがついてるということか。
わかってからほかのを読むと、たしかにそう書いてある...
capistrano3でssh agent forwarding

capistranoでSSH接続するときにssh agent forwardingが使えます。
書き方は、

```rb:production.rb
set :ssh_options, {
  user: 'ec2-user',
  keys: %w{~/.ssh/x.pem ~/.ssh/y.pem},
  forward_agent: true,
  auth_methods: %w{publickey}
}
```

こんな感じです。

これで何がやれるのかというと、

* デプロイ対象のサーバーがX
* デプロイしたいソースのGitリポジトリ（SSH接続)がY

という状況でサーバーXにY.pemを置かずに X->YのSSH接続をすることができます。

![](https://cacoo.com/diagrams/ucmqfEjJP08qqHkz-8B9F3.png)

上図のように作業端末にX,Yそれぞれの鍵があればいいのです。

ただ、上記のCapistranoのssh設定だけでは使うことができません。
作業端末で```ssh-add -l```を叩いた時に以下のようになっている必要があります。

```shell-session
$ ssh-add -l
2048 f7:07:18:66:97:f0:8f:7b:40:6f:0b:97:98:de:5e:18 /home/newgyu/.ssh/y.pem (RSA)
```

どうすりゃいいのかというと、予め下記のコマンドを叩いておく必要があります。

```shell-session
$ ssh-add /home/newgyu/.ssh/y.pem
```
In-Outパラメータについて


Swiftの予約語として `inout` がある。良くわからなかったので覚え書き。

日本語で`参照渡し`と呼んで正しいのか不明であるが、パラメータを受ける関数側にて、`参照渡し`の場合に`inout`を使用する。
そしてパラメータを呼ぶ側では、`&` を付ける。

```値渡し.swift 
func swapInt(var a:Int, var b:Int)
{
    var tmp:Int
    tmp = a
    a = b
    b = tmp
}

var x:Int = 2
var y:Int = 3

println("x:\(x)") //x:2
println("y:\(y)") //y:3

swapInt(x, y)

//値渡しなのでSwapされない
println("x:\(x)") //x:2
println("y:\(y)") //y:3
```

```参照渡し.swift
func swapInt(inout a:Int, inout b:Int)
{
    var tmp:Int
    tmp = a
    a = b
    b = tmp
}

var x:Int = 2
var y:Int = 3

println("x:\(x)") //x:2
println("y:\(y)") //y:3

swapInt(&x, &y)

//参照渡しなのでSwapされている
println("x:\(x)") //x:3
println("y:\(y)") //y:2
```

私は基本的にJava系の土壌なので、C系に良くみられる`hogehoge渡し`には、とても疎く敬遠していたのであったが、Swiftであまり使わないと思うが復習になった。
DBにランダムなデータを大量に挿入する

#目的
とりあえず大量のデータを突っ込む、データの質は問わない
MariaDB,MySQL,PostgreSQL関係なく使えるよ

環境
OS:Ubuntu14.04
DB:MariaDB 10.0.11
thinkpad T440p

以下のようなテーブルに適当なデータを大量に入れてみる

```create.sql
SET CHARSET utf8;
USE my_test;
CREATE TABLE test_table2(
 col1  INT   NOT NULL	DEFAULT 0,
 col2  INT   NOT NULL	DEFAULT 0,
 col3  INT   NOT NULL	DEFAULT 0,
 create_time DATETIME	NOT NULL,
 update_time DATETIME	NOT NULL,
 delete_time DATETIME	DEFAULT NULL,
PRIMARY KEY (col1,col2,col3)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

#クエリを生成する
ジェネレータツールのような何かは使用せずに簡単にシェルスクリプトでクエリを作る

```gen_random_rows.sh
#!/bin/sh

echo "INSERT IGNORE INTO test_table2 (col1,col2,col3,create_time,update_time) VALUES" > insert.sql
for i in `seq 1 1000`
do
    echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
    echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
    echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
    echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
    echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
done
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW());" >> insert.sql
```
FLOORとRANDを使ってcol1は300万以下、col2は15以下、col3は3以下の整数を入れるようなbulk insertクエリを作成
これで5000行を挿入するクエリが作成完了
IGNOREを使用しているので、プライマリキーのデータが被った場合は無視される

これを繰り返して適当な回数挿入する

```insert_random_rows.sh
#!/bin/sh

set -e

mariadb='/PATH/mariadb/bin/mysql'

for i in `seq 1 2000`
do
    $mariadb -u* -p*** -Dmy_test < insert.sql
done
```


#Insert
$ time bash insert_random_rows.sh

real	3m40.434s
user	0m15.065s
sys	0m3.685s


MariaDB [my_test]> select table_schema, table_name, table_rows from information_schema.tables where table_schema='my_test' AND table_name='test_table2';
+--------------+-------------+------------+
| table_schema | table_name  | table_rows |
+--------------+-------------+------------+
| my_test      | test_table2 |    9273104 |
+--------------+-------------+------------+
1 row in set (0.00 sec)


4分かからずに1000万行近くのデータを挿入できた


#その他
時刻のところもランダムっぽくしたいならNOW()のところをINTERVAL関数を使って
NOW() - INTERVAL FLOOR(RAND()*10000) HOUR
とか書くと適当っぽい時刻になる
Capistrano3のデプロイ対象のRoleをEC2のタグで指定する

EC2を使っていると、再起動のたびにIPが変わるのでデプロイ対象のIPをレシピに書くの嫌ですよね。
こんな素敵なプラグインがあります！
https://github.com/douglasjarquin/capistrano-ec2tag


```rb:Capfile
require 'aws-sdk'
require 'capistrano/ec2_tagged'
```

```rb:production.rb
# 各サーバーはAWSのinstanceのRoleタグから取得する
role :hogehoge, ec2_tagged("Role" => "hogehoge")
```
Capistrano3でAWS EC2インスタンスにタグ付けする

## やりたいこと

* デプロイ完了後にEC2インスタンスにタグ付けしたい

## 困ったこと

* [aws-sdk for ruby](http://aws.amazon.com/jp/sdkforruby/) を使えばタグ付けはできる
    * [add_tagメソッド](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/TaggedItem.html#add_tag-instance_method)
* だけどタグ付けすべきインスタンスIDがわからん…

## こんなレシピ
まずはaws-sdkを読み込む

```rb:Capfile
require 'aws-sdk'
```

aws-sdkを使うために必要な通過儀礼。

```rb:production.rb
# AWSの接続用の情報
set :aws_access_key_id, "HOGEHOGE"
set :aws_secret_access_key, "fugafugafugafuga"
set :aws_region, "ap-northeast-1"
```

そしてレシピ

```rb:deploy.rb
  desc '指定したバージョンをVersionタグに設定する'
  task :finished do
    ec2 = AWS::EC2.new(
      access_key_id: fetch(:aws_access_key_id),
      secret_access_key: fetch(:aws_secret_access_key),
      region: fetch(:aws_region)
    ) 
    puts "set version tag #{fetch(:branch)}"
    on roles(:console) do
      instance_id = capture 'curl -s http://169.254.169.254/latest/meta-data/instance-id'
      ec2.instances[instance_id].add_tag('Version',:value=>fetch(:branch))
      # rollbackしたときにバージョン番号を戻す方法がTODO
    end
  end
```

ポイントは「AWSに用意されている[謎のmetadata取得URL](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html)を叩いて自身のインスタンスIDを引っ張ってくる」です。
最新のCocoaPodsへのアップロード方法の変更点

by mixiappwchr

最近CocoaPodsへライブラリをあげようといつものように,pull reqをだしたら

```
We have just launched 'Trunk', which is the new way for you to submit your Pods. For more information on this have a read through the post at http://blog.cocoapods.org/CocoaPods-Trunk/ If you have previously had your Pod merged into the master repository, please ensure you claim your Pod http://blog.cocoapods.org/Claim-Your-Pods/
```

と返信がきて、みてみると、アップロードの方法が変更になったようでした。

確認したところ、今までのやり方は

- Specレポジトリをfork
- 自身のライブラリにspecファイルを追加
- pull reqを送ってとりこんでもらう

だったのですが、最新のcocoapodsではpodコマンドにアップロード機能が追加されていました。


手順は以下のように変更になりました。

- 初回時は pod trunk registerコマンドで開発者登録をする。
- pod trunk push <specファイルのパス>でuploadする

と言ったようにコマンドベースでアップロードが完結するようになりました。
大分楽チンになりましたね！

## 初回登録時

初回の登録は以下の用にコマンドをうちます。

```bash
pod trunk register <email> <name>
```

コマンドをうつと,認証メールが指定したアドレスに届くのでクリックします。

これで完了です。登録されたかは以下のコマンドをうつと

```bash
 pod trunk me
```

```bash
  - Name:     <name>
  - Email:    <email>
  - Since:    May 20th, 07:04
  - Sessions: 
  - June 11th, 23:59 - October 18th, 00:09. IP: xxx.xxx.xxx.xxx
```
のような表示が出ます.


###アップロード
アップロードは簡単です。

```bash
pod trunk push xxx.podspec
```
これで自動的にlintも走って問題なければ登録完了です。


以前よりサクサクuploadできるので皆さんもライブラリをガンガン開発してください！
Playgroundで println() の出力を確認する方法


普通に Playgroundを開いても、変数の中身しか画面に表示されない。

そこで、xcodeのメニューで、[View]-[Assistant Editor]-[Show Assistant Editor]を選択する。

すると Console Output の画面が表示され、println()の結果を確認することができる。


![println.png](https://qiita-image-store.s3.amazonaws.com/0/3184/b26e205c-5013-38e0-52da-1218787908e9.png "println.png")
capistrano3でcomposer installするときにwithinで指定したディレクトリが無視されてる

capistrano3を使ってPHPのアプリのデプロイを使用としたところ変なところでハマりました。

大体ここに書いてあるとおりです。
http://stackoverflow.com/questions/19452983/capistrano-3-execute-within-a-directory

### これで動きそうなもんなんだけど
```rb:deploy.rb
  desc 'pubilshされたあとにゴニョゴニョ'
  task :published do
    on roles(:all) do
      within '/usr/local/webapps/current' do
        execute './composer.phar install'
      end
      execute :sudo, "service","nginx" ,"start"
    end
  end
```

なんだかcomposer.pharがないと言われます。
あるんだけど。あるんだけど・・・。

調べてみるとどうもwithin で指定した場所で実行されていない。
要するにwithinの指定値を無視してやがる。

### 結局どうしたか
```rb:deploy.rb
   :
SSHKit.config.command_map[:composer] = "#{fetch(:deploy_to)}/console/composer.phar"

namespace :deploy do

   :

  desc 'pubilshされたあとにゴニョゴニョ'
  task :published do
    on roles(:console) do
      execute :composer,:install,'-d',"#{fetch(:deploy_to)}/console"
      execute :sudo, "service","nginx" ,"start"
    end
  end

```
こんな感じ。

ポイントは、

* [Command Map](https://github.com/capistrano/sshkit/blob/master/README.md#the-command-map)でcomposeコマンドの場所を定義してやる
* [composerの-dオプション](https://getcomposer.org/doc/03-cli.md#global-options)でworking-dirを指定してやる

というところでした。
cocos2d-xでextensionsを含めてandroid向けにコンパイルする

## 目的

Xcodeを使用してアプリ制作をしていて、android向けにコンパイルする

### 前提

* Xcodeでの作成
* extensions系(例えばScale9Spriteなど)を利用している

## 問題

まずは、
[cocos2d-x｜github](https://github.com/cocos2d/cocos2d-x)のREADMEに書かれている通りコマンドを実行してみます

```
cocos run -p android -j 4
```

そうするとコンパイルエラーになります( **extensions系** をつかっていると)
吐かれるエラーログは指定の仕方によりますが…

> No such file or directory #include "extensions/cocos-ext.h".

であったり、直接指定している場合は

> No such file or directory #include "GUI/CCControlExtension/CCScale9Sprite.h". 

こんな感じで出力される

## 原因

コンパイルルールなんかが記述されている`{your_proj_root}/proj.android/jni/Android.mk`にextension系を読み込む記述がないため

## 対策

デフォルトだとこんな内容

```
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static


include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)
```

これに **extensions系** を読み込むように記述する
箇所は2箇所

```
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
# 追加
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static


include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)
# 追加
$(call import-module,extensions)
```

これで **extensions** も含めてコンパイルしてくれます

## 補足

**extensions系** ってなに？

`{your_proj_root}/cocos2d/extensions/`配下に設置されているもの 
`#include "GUI/...."`的な者達ですかね

## おわりに

ココらへんの知識は乏しくて、エラー＆トライでやった結果なので
おかしなところとかあれば、コメンとなりリプなりでご指摘頂けると嬉しいです
MySQL の JOIN で パフォーマンスが落ちる行為

こんな風に定義すると遅い

```sql
SELECT * 
FROM  `table1`
LEFT JOIN (
SELECT * 
FROM `table2`
) AS tbl2 ON tbl2.id = table1.id
```

こうすると良い

```sql
SELECT * 
FROM  `table1`
LEFT JOIN `table2` ON table2.id = table1.id
```

`select * from` なら 新たに テーブルを作成する必要はない。`*`をいろいろ条件付けるならテーブル指定は難しいので、`()`でくくるしかない
LabVIEW Tips: LabVIEW 開発環境のツールメニューに機能追加

# 概要
VC++などのIDEでは外部エディタで編集中のソースを開いたりできるようにコマンドをメニューに追加できたりしましたが、
LabVIEWでも、開発環境のツールメニューに自分で機能を追加することができます。


# ツールメニューに表示される項目に該当するVIが保存されているフォルダ
LabVIEW起動時に以下のフォルダをスキャンしてツールメニューに表示するようになっているようです。

    C:\Program Files\National Instruments\LabVIEW 20xx\project


# ツールメニューに登録されているおもな機能

* MAXの呼び出し
* VI比較
* VI統合
などなど

# 自分で作ったVIを追加する
このフォルダに自分で作成したVIを追加することで、ツールメニューに機能を追加できます。

サンプルコードが貼り付けられないので、自作のツールをgithubで公開してみました。
現在アクティブなVI（実際にはメニューを呼び出したVI）が保存されているフォルダをエクスプローラで表示するというものです。

https://github.com/alucky4416/openExplorer_LvPlugin

openExplorer_LvPlugin.vi というファイルを所定のフォルダにコピーして、LabVIEWを再起動すると、ツールメニューに"openExplorer..." というメニューが表示されます。
適当なVIを開いて"openExplorer..."を選択すると、エクスプローラが起動してフォルダが表示されるはずです。
TortoiseSVN/Gitなどを使っている方なら、そこからエクスプローラのメニューから呼び出すことができて多少は便利になるかと思います。

なお、複数のバージョンのLabVIEWをインストールされている場合は、それぞれのprojectにこのVIをコピーしてください。

# おまけ

ついでに、ツールメニューからTortoiseSVNのlog/add/commitを呼び出すプラグインも作ってみました。

https://github.com/alucky4416/TSVN_LvPlugin

TortoiseProc.exeを呼び出しているだけなので、ちょっと修正すればTortoiseGit用にも利用できそうです。
unity-webview で自前のHTMLを表示するサンプル


[gree/unity-webview](https://github.com/gree/unity-webview)

unity-webview 備え付けのサンプルアプリがうまく動かなかったので自前でサンプルを作ってみた。

１． 空のシーンを作る

２． シーンに空の GameObject を追加する

３． 2.のGameObjectに WebViewObject をアタッチする

４． 以下のスクリプトを MyWebView.cs などの名前で保存して、3.のGameObjectにアタッチする

```CSharp:MyWebView.cs
using UnityEngine;
using System.Collections;
using System.IO;

public class MyWebView : MonoBehaviour {
	// Inspector で画面上に配置した GUI Text にアタッチする
	public GUIText DebugText;
	
	string m_filePath;
	
	void Start() {
		m_filePath = Path.Combine(Application.persistentDataPath, "sample.html");
		Debug.Log (m_filePath);
		PrepareHTML();
		
		// このスクリプトがアタッチされているGameObjectからWebViewObjectを取得する
		var webview = GetComponent<WebViewObject>();
		
		// WebViewObject の初期化時にWebページ側から呼び出すことができるコールバック関数を定義する。
		// Web側からコールバック関数呼び出すには、リンク要素の href 属性などURLを指定する箇所で
		// 'unit:(任意の文字列)' のように指定すると、コールバック関数が呼び出される。
       // このとき、"(任意の文字列)"の部分が関数の引数として渡される。
		webview.Init ((string msg) => {
			Debug.Log ("Call from Web view : " + msg);
			DebugText.text = msg;
		});
		webview.LoadURL("file://" + m_filePath);
		webview.SetVisibility(true);
		webview.SetMargins(10,100,10,10);
	}
	 
	void PrepareHTML() {
		using(var writer = new StreamWriter(m_filePath, false)) {
			writer.Write(
@"<html>
<body>
Hello unity-webview !!!<br/>
<ul>
  <li><a href='unity:hoge'>callback 'hoge'</a></li>
  <li><a href='unity:fuga'>callback 'fuga'</a></li>
</ul>
</body>
</html>
");
			writer.Close();
		}
	}
}

```

５． シーンに GUIText を配置する

６． 5.のGUITextを Inspector 上で、4.でアタッチした MyWebView スクリプトの Debug Text にドラッグして関連付ける

![kobito.1402493240.498332.png](https://qiita-image-store.s3.amazonaws.com/0/8219/6ea2196d-57e5-55b8-1ad9-0ee36b55f7eb.png "kobito.1402493240.498332.png")


iOS 向けにビルドして、以下のように表示されたらOK。
"callback〜" のリンクをタップすると、画面上の文字が "hoge" とか "fuga" とかに切り替わることを確認する。

![kobito.1402492549.127133.png](https://qiita-image-store.s3.amazonaws.com/0/8219/602c0ac3-78a7-7b5f-7c5c-61b6fee88a2b.png "kobito.1402492549.127133.png")

# サンプルがうまく動かない場合の注意点

* Player Settings の Company Name に空白などの文字が含まれていないか?

[Edit]-[Project Settings]-[Player] で Player Settings で Company Name の設定を確認し、この中にファイルパスとして使用すると問題が出るような文字が含まれていないことを確認する。

![kobito.1402492766.263823.png](https://qiita-image-store.s3.amazonaws.com/0/8219/9e30d85d-5572-7263-08a2-424667673f17.png "kobito.1402492766.263823.png")
Three.jsでWebGL(1)

WebGLを使うにはThree.jsが良いと聞いたのでいじってみる

## ダウンロード
[three.js](http://threejs.org/)の'download'からzipファイル一式を解凍

まずは
- build/three.min.js  ... three.jsメイン
- examples/js/libs/tween.min.js ... アニメーション用
- examples/js/controls/TrackballControls.js ... マウスコントロール用
をいじってみる。three.jsの初期化方法は`three.js webgl`あたりで検索すると出てくるサンプルがたくさん出てくるので省略

[サンプル](http://odorumaharaja.github.io/test/webgl_01.html)

![sample01.png](https://qiita-image-store.s3.amazonaws.com/0/35319/57532258-759d-9935-702e-f314ded4cf1a.png)

- マウスで視点変更
- 起動時にランダムの場所から開始点に画像が移動
- 画像とマウスの衝突判定
- 判定後に画像拡大

が200行くらいのスクリプトでできました。すごいね`three.js`

以下、ちょっとハマった部分

### マウスで視点変更
‘TrackControls.js‘のTHREE.TrackballControlsを起動する
```
controls = new THREE.TrackballControls(camera, renderer.domElement);
controls.rotateSpeed = 0.5;
controls.minDistance = 500;
controls.maxDistance = 6000;
controls.noRotate = false; //trueで回転操作を不可にする
controls.addEventListener('change', render);
```
### 画像の読み込み
ImageUtils.loadTextureで画像を読み込んでTHREE.MeshBasicMaterialでマテリアル化してTHREE.PlaneGeometryで平面を作成してTHREE.Meshで画像を平面に貼り付ける
```
var texture = new THREE.ImageUtils.loadTexture('sample.png');
var material = new THREE.MeshBasicMaterial({ map: texture });
material.side = THREE.DoubleSide; // 裏も見えるようにする
var geometry = new THREE.PlaneGeometry(300, 300);
object = new THREE.Mesh(geometry, material);
```

### 起動時に中心にアニメーション
‘tween.js‘を使う。beforeとafterの位置や視点を用いて以下のように書くだけ。本当に楽チンです
```
// beforeの座標
object.position.x = Math.random() * 4000 - 2000;
object.position.y = Math.random() * 4000 - 2000;
object.position.z = Math.random() * 4000 - 2000;
// afterの座標
target = new THREE.Object3D();
target.position.x = 0;
target.position.y = 0;
target.position.z = 0;
// 変換
new TWEEN.Tween(object.position)
    .to({ x: target.position.x, y: target.position.y, z: target.position.z }, Math.random() * duration + duration)
    .easing(TWEEN.Easing.Exponential.InOut)
    .start();
```

### 画像とマウスの衝突判定
参考：http://www.yomotsu.net/wp/?p=600
衝突判定はテンプレートがある模様
```
// var objectsにobjectの配列が入る
var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5);
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
var intersects = raycaster.intersectObjects(objects);
if (intersects.length > 0) {
   // ... intersects[0]に衝突した先頭のobjectが入る
}
```

### 判定後に画面拡大
上記衝突判定後に`tween.js`の機能を利用した以下のような関数を用意する
```
// obj:選択されたオブジェクト, e:マウスin時にtrue,mouseout時にfalse
function selectObject(obj, e) {
    if (obj) {
        if (e === true) {
            // サイズを大きくする
            new TWEEN.Tween(interesectedObject.scale)
            .to({ x: 1.4, y: 1.4, z: 1.4 }, 60)
            .start();
        } else {
            // サイズを元に戻す
            new TWEEN.Tween(interesectedObject.scale)
            .to({ x: 1, y: 1, z: 1 }, 60)
            .start();
        }
    }
}
```
複数のPNG画像をまとめて一つのPDFにする

制作したシステムやコンテンツにレイアウトの崩れがないかざっくりと効率よくみるために、CasperJSやPhantomJSでまとめてスクリーンショットを撮ることがあります。

それらの結果の閲覧効率を上げたり、エビデンスとして他の誰かに共有するためにひとつのPDFにしたいケースがあるためシェルスクリプトを作成しました。

```
#!/bin/sh
 
###########################################
# Convert PNG files to one PDF
###########################################
 
CURRENT_DIR=$(cd $(dirname $0);pwd)
TMP_PDF1=${CURRENT_DIR}/tmp1.pdf
TMP_PDF2=${CURRENT_DIR}/tmp2.pdf
OUTPUT_PDF=${CURRENT_DIR}/screen.pdf
PNG_DIR=${CURRENT_DIR}/images/origin
 
rm ${OUTPUT_PDF}
 
find ${PNG_DIR} -name '*.png' | while read PNG; do
    echo ${PNG}
    if [ -f ${OUTPUT_PDF} ]; then
        convert -page A4 ${PNG} ${TMP_PDF1}
        mv ${OUTPUT_PDF} ${TMP_PDF2}
        pdftk ${TMP_PDF2} ${TMP_PDF1} cat output ${OUTPUT_PDF}
    else
        convert -page A4 ${PNG} ${OUTPUT_PDF}
    fi
done
 
if [ -f ${TMP_PDF1} ]; then
    rm ${TMP_PDF1}
fi
 
if [ -f ${TMP_PDF2} ]; then
    rm ${TMP_PDF2}
fi
```

ちなみにpdftkコマンドとconvertコマンドはbrewから下記のようにすればインストールされます。

```
brew install --devel casperjs
brew tap docmunch/pdftk
brew install pdftk
brew install imagemagick
```
YUIDocのインストール

JavaScriptで開発を行う際、ドキュメントの自動生成ツールとして使い勝手の良かったYUIDocのインストール方法を記載する。

## まずはNode.jsをインストール
[Node.js](http://nodejs.org)のサイトにいき、"INSTALL"リンクを押す。すると、自動的にNode.jsのインストールパッケージ（node-v0.10.28.pkg）がダウンロードされる。  
ダウンロードされたパッケージをダブルクリックして、インストーラの指示に下がインストールを行う。

ちなみにデフォルトのインストール先は、 */usr/local/bin* となっており、その配下に、 **node** と **npm** インストールされる。

## YUIDocのインストール
無事に、 **npm** のインストールが完了したら、次に以下のコマンドを実行する。

```
$ sudo npm -g install yuidocjs
```

これだけで、YUIDocが使える様になりました。
GitHub | ショートカットを駆使して爆速で目的のソースコードを表示する

# GitHub | ショートカットを駆使して爆速で目的のソースコードを表示する

## 概要

Google と GitHub のショートカットを駆使して爆速で目的のソースコードに到達します

## 前提

* Google の検索ページを表示した状態でスタート
* 検証は GoogleChrome で行いました

## 検索対象1

Ruby on Rails の ActiveSupport の core_ext の strip.rb を表示します

## 手順1

* `github rails` で Google 検索
* 結果が表示されたら `Tab` , `Enter` で1件目の検索結果リンクへジャンプ
* Railsのリポジトリのトップページが表示されたら `t` を押して検索モードに
* `strip` と入力すると、結果リストの1件目に目的のファイルが表示されるので `Enter` を押します
* ActiveSupport の core_ext の strip.rb が表示されました

## 検索対象2

Ruby on Rails のリポジトリから ActiveSupportの core_ext の array.rb を表示します

## 手順2

* `github rails` で Google 検索
* 結果が表示されたら `Tab` , `Enter` で1件目の検索結果リンクへジャンプ
* Railsのリポジトリのトップページが表示されたら `t` を押して検索モードに
* array.rb は複数ファイル存在するので,フォルダ名を利用して絞り込みます。
* `core_ext/array` と入力すると2件目に core_ext/array.rb が表示されるのでカーソルの下を1回押して `Enter` を押します

![search_rails_array.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f466f528-c8c7-e8fa-8a28-d60dc2f7849a.png)

※黄色い部分がアクティブになっている。
カーソル上下で移動して `Enter` で対象コードを表示できます。

* ActiveSupport の core_ext の array.rb が表示されました

![search_rails_array2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/02ecb2e2-24eb-b9e0-a962-cc5e2072d718.png)
カレントディレクトリを変更せずに、特定のディレクトリでコマンドを実行する

### 概要

「`cd` してコマンドを実行して `cd -` で1つ前のディレクトリに戻る」という作業を
1行でできるので便利！

```
$ pwd
/Users/quanon

$ (cd /etc/apache2 && ls -l)
total 64
drwxr-xr-x  13 root  wheel    442  8 25  2013 extra
-rw-r--r--   1 root  wheel  18121 11  1  2013 httpd.conf
-rw-r--r--   1 root  wheel  12958 11  1  2013 magic
-rw-r--r--   1 root  wheel  53258 11  1  2013 mime.types
drwxr-xr-x   4 root  wheel    136  8 25  2013 original
drwxr-xr-x   3 root  wheel    102  8 25  2013 other
drwxr-xr-x   3 root  wheel    102  2  9 18:33 users

$ pwd
/Users/quanon
```

### 原理

`(command)` のようにコマンドを丸括弧でくくって実行すると、
サブシェル (別プロセス) で実行したことになる。
そして、カレントディレクトリはプロセスごとに管理されているので、
サブシェルで `cd` しても、もとのシェルには影響しない。

ということらしいです。

### 参考

* [UNIXの部屋 コマンド検索: サブシェル](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B5%A5%D6%A5%B7%A5%A7%A5%EB)
SublimeText | 秀丸の5行移動機能をマクロで実現する

# SublimeText | 秀丸の5行移動機能をマクロで実現する
## 概要

秀丸では

* Ctrl+上下キーで上下に5行移動できます。
* Ctrl+Shift+上下キーで上下に5行移動しつつ範囲選択できます。

SublimeTextの前は秀丸を使っていたこともあり、
この機能がすっかり手になじんでいるため、SublimeTextに移植してみました。

## マクロ保存機能を活用

以下の手順でマクロを保存します

1. マクロの記録開始（Ctrl+Q）
1. 5行下に移動 / 5行上に移動 / Shiftを押しながら5行下に移動 / Shiftを押しながら5行上に移動
1. マクロの記録終了（Ctrl+Q）
1. マクロの保存（Tools => Save Macro）
1. マクロのキー割り当て

上移動5、下移動5、上選択移動5、下選択移動5の回数分実施します。
内容に合わせて手順2を選択。

## 出来上がったマクロ

下移動5、下選択移動5を例示します。

### 下5移動のマクロ

~~~json
[
  {
    "args":
    {
      "by": "lines",
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "forward": true
    },
    "command": "move"
  }
]
~~~

### 下5選択移動のマクロ

~~~json
[
  {
    "args":
    {
      "by": "lines",
      "extend": true,
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "extend": true,
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "extend": true,
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "extend": true,
      "forward": true
    },
    "command": "move"
  },
  {
    "args":
    {
      "by": "lines",
      "extend": true,
      "forward": true
    },
    "command": "move"
  }
]
~~~

## 補足

移動行数に拡張性を持たせたい場合は Python を利用した Plugin として実装したほうが良いですね。  
私が欲しかったのは秀丸の5行移動だったので5行固定の機能のみ作成しました。
Subscript Options

SwiftにはSubscriptという機能がある。
これはArrayやDictionaryに使う[]演算子をオーバロードするような機能。
Scalaでいうとapplyのようなもの。これをクラスのメソッドとして実装できるのが便利。

```objc
struct Test {
    let v: Int
    subscript(index: Int) -> Int {
        return v * index
    }
}

let t = Test(v: 3)
t[3]
```

このSubscriptはいくつも定義することができて、実行時に最適な型のSubscriptが呼ばれる

```objc
struct Test {
    let v: Int
    var s: String
    subscript(index: Int) -> Int {
        return v * index
    }
    subscript(prefix: String) -> String {
        return "\(prefix) \(s)"
    }
}

let t = Test(v: 3, s: "Test")
t["This is"] // 2つ目のSubscriptメソッドが呼ばれる
```

docにも書いてあったけど数値計算用の行列ライブラリとか作るときに便利そう。

```objc
struct Matrix {
    let rows: Int, columns: Int
    var grid: Double[]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(count: rows * columns, repeatedValue: 0.0)
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            return grid[(row * columns) + column]
        }
        set {
            grid[(row * columns) + column] = newValue
        }
    }
}

var m = Matrix(rows: 3, columns: 3)  // ここはvarにする必要がある
m[0,2] = 1.0 // 参照にはカンマ区切りでパラメタを与えられる

m[0,2]
```

参照：[The Swift Programming Language ~Subscript~](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html#//apple_ref/doc/uid/TP40014097-CH16-XID_393)
shallow clone Error Object

思いつきでエラーのクローン。使い道とか全く思いつかないけど

```js:cloneError.js
;(function (global) {
    'use strict'

     var isBrowser = !! global.self
     var isWorker  = !! global.WorkerLocation
     var isNodeJS  = !! global.global

     function cloneError (err) {
        if (!(err instanceof Error)) throw new TypeError(
            ({}).toString.apply(err) + ' not instanceof Error')
        return new global[err.name](err.message)
     }

     isNodeJS ? (module.exports = cloneError)
               : (global['cloneError'] = cloneError)
})(this.self || global)
```


```js:error.test.js
var test = require('tape')
var cloneError = require('cloneError')

test('shallow clone "Error"', function (t) {
    var error = new URIError('not found')
    var clone = cloneError(error)

    t.equal(error.toString(), clone.toString(), '.toString() -> ' + clone.toString())
    t.not(error, clone, 'originalError !== clonedError')
    t.end()
})
```


`tap --tap error.test.js` してみる

```tap
TAP version 13
# error.test.js
# TAP version 13
# shallow clone "Error"
ok 1 .toString() -> URIError: not found
ok 2 originalError !== clonedError
# tests 2
# pass  2
# ok
ok 3 ./error.test.js


1..3
# tests 3
# pass  3

# ok
```
The Swift Programming Language - Deinitialization（デイニシャライゼーション）をまとめる


[The Swift Programming Language をまとめるトップ](http://qiita.com/kiyotaman/items/052f82e9f93590b79c64)

## Deinitialization（デイニシャライゼーション）
インスタンスが解放される直前に（deallocate）呼び出される
**deinit** をクラス内に定義する
これはクラスでのみ使える

### How Deinitialization Works（仕組み）
ARCなのでマニュアルでクリーンする事はないが、自分でリソース管理をしているときなどに使う場合が想定される
ファイルに書き込みをするクラスがあって、そのクラスのインスタンスがリリースされる時に閉じる必要があったりする場合に使ったりする

```swift
// () はない
deinit {
    // ここに記述
}
```

自分で呼び出す事はできない
サブクラスで定義されていなくても、スパークラスでは呼ばれる
この deinit　の後にリソースが解放されるので、deinit 内では全てのプロパティにアクセスできる
ファイルを閉じるとかなどできる
さくらVPS設定メモ

さくらVPSの設定

* 日本語化
etc/sysconfig/i18n
ja_JP.UTF-8

* ユーザーを作成
useradd yusuke
passwd yusuke

* yusukeをwheelグループに追加
usermod -G wheel yusuke

* wheelグループにroot権限を与える
visudo

* （このままだとid/passがばれるとまずい）鍵認証をつける
- VPS側 mkdir ~/home/yusuke/.ssh
		chmod 700 .ssh/
- mac側 scp ~/.ssh/id_rsa.pub yusuke@wwwさくらのURL.sakura.ne.jp:~/.ssh/authorized_keys 
- ssh yusuke@wwwさくらのURL.sakura.ne.jp

* ポート番号の変更
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

* パスワードログインの禁止
vim /etc/ssh/sshd_config
PasswordAuthentication no

* rootログインの禁止
vim /etc/ssh/sshd_config
PermitRootLogin no
* 再起動
service sshd restart

* ファイヤーウォールの設定をする
vim /etc/sysconfig/iptables
service iptables start
				
* webサーバーの設定
yum install httpd
chkconfig hpptd on 
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
vim /etc/httpd/conf/httpd.conf
	/ServerTokens Prod
	/ServerSignature Off
	/Options -Indexes FollowSymLinks 
service httpd configtest
service httpd start

* ドキュメントルートをyusukeユーザーでもつくれるように
chown -R yusuke:yusuke /var/www/html/

* VirtualHostの設定
mkdir -p /var/www/dev.example.com/public_html
chown -R yusuke:yusuke /var/www/dev.example.com/public_html/
vim /etc/httpd/conf.d/dev.example.com.conf
service httpd configtest
service httpd restart
vim /var/www/dev.example.com/public_html/index.html

* PHPの設定
yum install php php-devel php-mysql php-gd php-mbstring
php -v
cp /etc/php.ini /etc/php.ini.org
vim /etc/php.ini
	error_log = /var/log/php_errors.log
	mbstring.language = Japanese 有効
	mbstring.internal_encoding = UTF-8
	mbstring.http_input = auto   有効
	mbstring.detect_order = auto   有効
	expose_php = off
	date.timezone = Asia/Tokyo
service httpd restart

* MySQLの設定
yum install -y mysql-server
cp /etc/my.cnf /etc/my.cnf.org
vim /etc/my.cnf
service mysqld start
mysql_secure_installation
chkconfig mysqld on
mysql -u root -p
AWKで定義ファイルを元にデータファイルを処理する

定義ファイルAを元にデータファイルBを処理したいということがあります。
結論をいうと

```console
$ awk -f proc.awk file_a file_b
```

とやって、```proc.awk```の処理の中で```FILENAME```変数によって処理を分離して上げればいいようです。

# 動作確認環境
* awk : GNU awk 4.0.1

# kwsk

```define.csv
index  index
cart   買い物画面
info   最近の情報
ticket 割引券
```

```access.log
2014-04-01.09:10:00.05 ip-XX.XX.XX.12 /index
2014-04-01.09:10:01.25 ip-YY.YY.YY.5 /info/123?q=winter
2014-04-01.09:10:01.31 ip-ZZ.ZZ.ZZ.12 /ticket/ski-items/201412
2014-04-01.09:10:03.00 ip-YY.YY.YY.5 /info/3323?date=20140320&page=3
 :
```

上のaccess.logをプロセスして、時間と画面名のみのCSVファイルが最終的にほしい、なんてことがあります。
Excelのvlookupを使ったり、shellやrubyなどのLL言語で処理を書いてもいいんですが、AWKを使って実現させるのが処理の早さ的にも、実装の簡単さ的にも一番良さそう。

```proc.awk
# triming space or tab
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }

# get page-name in url
function page_name(s) {
  sub(/^\//,"",s)
  sub(/\/.*$/,"",s)
  return s
}

# 定義の取得して配列に格納
FILENAME == "define.csv" {
  def[$1] = $2 
}

# データのプロセス
FILENAME == "access.log" {
  page = page_name(trim($3))
  print $1 "," def[page]
}
```

```console
$ wc access.log 
  401408  1204224 23382016 access.log
$ time awk -f proc.awk define.csv access.log > proc.log
real  0m1.761s
user  0m1.727s
sys   0m0.034s
$ head proc.log
2014-04-01.09:10:00.05,index
2014-04-01.09:10:01.25,最近の情報
2014-04-01.09:10:01.31,割引券
2014-04-01.09:10:03.00,最近の情報
 :
```
特定のコマンドの出力をハイライトさせる

[ifconfig,netstatは非推奨](http://understeer.hatenablog.com/entry/2012/03/24/184346)という記事が(2年以上前に！)書かれていました。慣れ親しんできたifconfig,netstatですが、もはや非推奨となれば代替コマンドの使い方を覚えるのもやぶさかではありません。

さて自分のPCに割り当てられているIPアドレスを見るための代替コマンドはip addr(ip aと省略可)でよいそうです。試してみましょう。

```shell-session
% ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu ***** qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu **** qdisc mq state UP qlen ****
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
    inet6 1234:5678:90ab:cdef:1234:5678:90ab:cdef/64 scope global temporary dynamic
       valid_lft *****sec preferred_lft *****sec
    inet6 1234:5678:90ab:cdef:1234:5678:90ab:cdef/64 scope global dynamic
       valid_lft *****sec preferred_lft *****sec
    inet6 fedc:ba09:8765:4321:fedc:ba09:8765:4321/64 scope link
       valid_lft forever preferred_lft forever

```

うっ見にくい。一瞬どこに目的のIPアドレスがあるか分かりませんでした。ifconfigでは割とすぐ見つかったのになぜ？ 書式が異なるからか？ それともうちの環境ではifconfigの出力が日本語化されるから？ なぜ英語だと目grepの精度が落ちるのか？ 英文に慣れるには一体どうしたら？ ぶつぶつ……

話がそれました。要は重要な箇所を強調すればよいのです。出力の中のIPアドレスっぽいところを色つきで表示しましょう。

```zsh
alias ipa="ip a | perl -pe 's/(\d+\.){3}\d+(\/\d+)?/\e[93m$&\e[m/g'"
```

シェルにipaと入力することでハイライトされた出力を得ることができます。
上では置換にperlを用いましたが、sedではエスケープシーケンスの処理がうまく行きませんでした。暇があればそこらへんをまた調べてみたいです。

もうちょっと手を加えて

- IPv4アドレスっぽいところを黄色表示(ただしブロードキャストアドレスの部分は無視)
- IPv6アドレスっぽいところを赤表示
- MACアドレスっぽいところを緑表示(ただし00:00:00:00:00:00とff:ff:ff:ff:ff:ffは雑に無視)

としてみたのが下のようになります。

```zsh
COLORRED="\e[91m"
COLORGREEN="\e[92m"
COLORYELLOW="\e[93m"
COLOREND="\e[m"
alias ipa="ip a | perl -pe 's/(?<=inet )(\d+\.){3}\d+(\/\d+)?/${COLORYELLOW}$&${COLOREND}/g' | \
                  perl -pe 's/(?![0f:]{17})([\da-f]{2}:){5}[\da-f]+/${COLORGREEN}$&${COLOREND}/g' | \

                  perl -pe 's/(([\da-f]{4})?:){2,7}[\da-f]+(\/\d+)?/${COLORRED}$&${COLOREND}/g'"
```
zsh使いの人は.zshrc等に適当に挿入してください。多分bashでも動くと思います。他のシェルはよくわかりません。


今回はこれだけですが、他の(色付き出力非対応な)コマンドにも様々応用できるでしょう。
Arrayを指定した数のグループ数に分割する

[ActiveSupport - Array#in_groups](http://apidock.com/rails/Array/in_groups)

```rb
> (1..10).to_a.in_groups(3, false) {|group| p group}
[1, 2, 3, 4]
[5, 6, 7]
[8, 9, 10]
=> [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
```

Rubyの`each_slice`などで簡単にできるかと思ったが、なかなかできなくて調べたらRailsにあった。

第2引数で指定したもので、余った枠が埋められる(デフォルトの省略時は`nil`)
`false`指定だと余った枠を埋めない

Rubyの`each_slice`は違う

```rb
> (1..10).each_slice(3).to_a
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
> (1..10).each_slice(4).to_a
=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
```

参考：[StackOverflow - Splitting an array into equal parts in ruby](http://stackoverflow.com/questions/12374645/splitting-an-array-into-equal-parts-in-ruby)

今回のユースケースとしては、HTML上で3列表示のulに配列要素を分けるのに使った。
PC ブラウザで Retina ディスプレイを再現して表示する

Firefox をインストールします。
`about:config` を開きます。
警告は出ますが、勇ましい気持ちを持って進みます。
`layout.css.devPixelsPerPx` なる値を、デフォルトの -1 から 2 に変更します。

![abount-config.png](https://qiita-image-store.s3.amazonaws.com/0/24898/da95b2d5-b7a6-19c0-5a90-9b1dfca074b3.png)

Retina Fifefox キタコレ。

![retina-firefox.png](https://qiita-image-store.s3.amazonaws.com/0/24898/6c0e9653-2e7c-1d49-d095-7b2cc3da1c61.png)

http://contentloaded.com/ja/responsive/ のようなページを開いて動作確認するといいんじゃないでしょうか。
通常の PC ブラウザで開いたときと同じ解像度で見てるはずなのに、レティナ対応画像が凄い綺麗に見える気がする。不思議！

![how-it-works.png](https://qiita-image-store.s3.amazonaws.com/0/24898/f10f5156-21c3-381e-e687-00684a52fa99.png)

このプロパティはウィンドウ UI を含めて、まるっと解像度の指定を変更するプロパティのようです。もちろん、利用は個人の責任で。
scpコマンドでリモートサーバとローカルでファイルのやり取りをする


http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230878/

この辺りを参照してみてください。

基本的なルールとしては


```
$ scp [転送元] [転送先]
```

また、リモートの場合は

```
$ scp サーバアカウント情報:/ディレクトリ名/ファイル名
```

というルールを覚えておけばOK。
サーバアカウント情報は、基本的には

```
scp -P ポート番号 -i 鍵ファイル ユーザ名@IPアドレスorサーバ名
```
という形で入力します。オプションは以下です。

```
$ scp
usage: scp [-12346BCEpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2
```


もし、[簡単sshログイン設定]がされていれば、設定されたHost名だけでオッケー。

[簡単sshログイン設定]:http://qiita.com/maximum80/items/a453ed00ac96cab77f08

例としては、

```

①リモートサーバ(config設定あり)→ローカルホスト
$ scp test:/var/www/index.php /Applications/MAMP/htdocs/


②ローカルホスト→リモートサーバ(config設定あり)
$ scp /Applications/MAMP/htdocs/index.php test:/var/www/


③リモートサーバ→リモートサーバ(config設定あり)
$ scp test:/var/www/index.php test2:/var/www/


④リモートサーバ(config設定なし)→ローカルホスト
$ scp -P 00000 -i ~/.ssh/id_rsa admin@000.000.00.000:index.php /Applications/MAMP/htdocs/

```

といった具合です。
【WP】WordPressのサーバ移行手順

#**はじめに**

WordPressのバージョンアップに伴う検証を別サーバにて行うために、データを別サーバに移行しました。
移行の手順や参考にしたサイト等を紹介します。

#**実施環境**

##WordPress

ver 3.3.1

##サーバー環境

||PHP|Mysql|
|:---|:---|:---|:---|
|移行前|5.4|5.1.73|
|移行後|5.4|5.1|

##補足

今回は、別のドメインが設定されているサーバーへ移行しました。
DNSを変更して同じドメインを使用する場合は手順が異なる場合がありますので、ご注意ください。

#**STEP1 移行前のサーバからデータをダウンロード**

サーバ上にあるデータを全てダウンロードしてください。
FTPソフトなどを利用してダウンロードする場合は、 **必ず全てのファイルがダウンロードされたか確認してください。**
**ファイルが不足していると移行後にエラーが表示されます。**
正確にはWordPressの初期設定ではエラーを表示しないので、真っ白の画面になることがあります。
私はファイルが不足していることに気づかず何回もやり直しました。

#**STEP2 移行前のデータベースをダウンロード**

データベースに関しては、下記のサイトを参考して、phpMyAdminで「DROP TABLE/VIEW」にチェックをしてエクスポートしました。
データベースのエクスポート方法のみ参考しております。
下記のサイトとは移行方法が異なります。

[WordPressで公開しているサイトのサーバーを変更する | WordPressならファーストサーバ](http://wp.fsv.jp/guide/server-shift/)

#**STEP3 ダウンロードしたwp-config.phpの設定変更**

STEP1でダウンロードしたwp-config.phpを開き、下記の「*****」の箇所を移行後のデータベース情報に書き換えます。
念のため書き換える前のwp-config.phpファイルは別にコピー・保存しておいた方がいいかもしれません。

```php

/** WordPress のためのデータベース名 */
define('DB_NAME', '*****');

/** MySQL データベースのユーザー名 */
define('DB_USER', '*****');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', '*****');

/** MySQL のホスト名 */
define('DB_HOST', '*****');

```

#**STEP4 searchreplacedb2.phpをダウンロード**

STEP2でエクスポートしたデータベースのファイルには移行前の情報が記載されております。
単純にエクスポートしたデータベースファイルをテキストエディタなどで開き、情報だけ置換するとうまく移行できない場合があるそうです。
詳しくはこちらの「[テスト環境から本番環境へ、URLが異なる環境にWordPressを移行する方法](http://www.slideshare.net/ryujiroyamamoto/wordbenchchiba20130518)」のスライドをご覧ください。
移行前の情報を書き換えるために「searchreplacedb2.php」のスクリプトを利用します。

[WordPress Serialized PHP Search Replace Tool](https://interconnectit.com/products/search-and-replace-for-wordpress-databases/)にアクセスして「PROBLEMS? TRY V 2.1.0 STABLE」をクリックして「searchreplacedb2.php」をダウンロードします。

#**STEP5 移行後のサーバーへデータをアップロード**

STEP1でダウンロードしたデータを移行後のサーバーへ全てアップロードします。
**必ず全てのファイルがアップロードされてるか確認してください。**
wp-config.phpはSTEP3で書き換えたファイルをアップロードしてください。
STEP4でダウンロードした「searchreplacedb2.php」をWordPressインストールディレクトリにアップロードします。

#**STEP6 searchreplacedb2.phpでデータベース情報の書き換え**

アップロードした「searchreplacedb2.php」へアクセスします。
ウィザードが表示されますので、適切に入力等を行ってください。
こちらの手順は「[WordPressでサーバ移行時にデータベース上のドメインを書き換える方法](http://webcre-archive.com/2012/10/04/wordpress-db-url-replace/)」に詳細が書かれてますので、ご覧ください。
**設定が完了したら「searchreplacedb2.php」をサーバ上から削除してください。**

以上で終了です。
behavior定義の処理の流れを追う

lt.macros/behaviorマクロがどのように動くかのメモ

## lt/macros.clj

```clj:lt.macros.clj抜粋
(defn- namify [type keyword]
  (symbol (str "__" type "__" (.replace (name keyword) "." "__DOT__"))))

(defmacro behavior [name & {:keys [reaction] :as r}]
  (if (and (seq? reaction) (= 'fn (first reaction)))
    (let [[_ args & body] reaction]
      `(do
         (defn- ~(namify "BEH" name) ~args ~@body)
         (lt.object/behavior* ~name ~@(apply concat (assoc r :reaction (namify "BEH" name))))))
    `(lt.object/behavior* ~name ~@(apply concat r))))
```

* `:reaction`が`(fn ... )`のような関数定義の場合
    1. その関数を`defn-`で定義。関数名は`__BEH__name`のような形
    2. `:reaction`に`defn-`で定義した関数を設定してlt.object/behavior*を呼ぶ。
* `:reaction`が存在しないor関数定義でない場合、lt.object/behavior*を呼ぶ。（引数はbehaviorに渡されたものそのまま）

## lt/object.cljs

lt.object/behavior*の流れ

```clj:lt.object.cljs抜粋
(def behaviors (atom {}))
(defn add-behavior [beh]
  (swap! behaviors assoc (:name beh) beh))

(defn make-behavior* [name & r]
  (let [be (merge {:name name}
                  (apply hash-map r))]
    be))

(defn store-behavior* [beh]
  (add-behavior beh)
  (:name beh))

(defn wrap-throttle [beh]
  (if-let [thr (:throttle beh)]
    (assoc beh :reaction (throttle thr (:reaction beh)))
    beh))

(defn wrap-debounce [beh]
  (if-let [thr (:debounce beh)]
    (assoc beh :reaction (debounce thr (:reaction beh)))
    beh))

(defn behavior* [name & r]
  (-> (apply make-behavior* name r)
      (wrap-throttle)
      (wrap-debounce)
      (store-behavior*)))
```

1. `make-behavior*`で引数をマップに変換する
2. `wrap-throttle`でマップに`:throttle`があったら、`:reaction`の関数に`throttle`を適用した結果の関数を`:reaction`に設定したマップに変換する
3. `wrap-debounce`も同様
4. できたマップを、`store-behavior*`経由`add-behavior`でatomのマップに追加する


## throttle, debounceとは

ここらへんが参考になる。イベント処理の間引きを行うものらしい
http://blog.springdawn.info/post/40885154200/javascript-throttle-debounce
http://ktkne.st/elab/post/2012/strcount-throttle-debounce.html

## behaviorができたら・・・
behaviorを定義しただけだと何も起こらない（？）
objectとbehaviorを（tag経由で？）結びつける
同じバリデーションルールでも、フィールドごとにエラーメッセージを変更する方法


# 概要

例えば、同じ required のバリデーションでも、
テキストフォームの場合だったら「○○を入力してください。」とし、
セレクトボックスの場合だったら「○○を選択してください。」としたくなる。

# add_rule にクロージャを設定する方法

add_rule では、以下のようにクロージャを渡すことにより、
その場でルールを追加することができる。

```php:sample.php
$val = Validation::forge();
$val->add('number', '数字')
    ->add_rule(['odd' => function($v) { return (bool)($v%2); }]);
```

これを利用して以下のように、
各フィールドごとに異なるエラーメッセージを設定する。

```php:sample.php
$val = Validation::forge();

// クロージャを設定
// Validation の _validation_required メソッドを利用する
$required_rule = function ($v) use ($val) { return $val->_validation_required($v); };

// テキストフォーム
$val->add('name', 'お名前')
    ->add_rule(['required_name' => $required_rule]);
$val->set_message('required_name', 'お名前を入力してください。');

// セレクトボックス
$val->add('pref', '都道府県')
    ->add_rule(['required_pref' => $required_rule]);
$val->set_message('required_pref', '都道府県を選択してください。');
```

複数の場所で、同じバリデーション同じエラーメッセージを出力するのであれば、
独自バリデーションクラスを作成する方法をとったほうが良いと思う。


# 参考

Validation Errors - クラス - FuelPHP ドキュメント
http://fuelphp.jp/docs/1.7/classes/validation/errors.html
`bundle install`したときに`mysql2`のインストールでコケた時の対処法


`bundle install`したら以下のエラーが出てコケた。

```
Fetching gem metadata from https://rubygems.org/..........
Fetching additional metadata from https://rubygems.org/..
Installing rake 10.3.2

-- 中略 --

extconf failed, exit code 1

Gem files will remain installed in /Users/konya/Projects/qis/vender/bundle/ruby/2.1.0/gems/mysql2-0.3.16 for inspection.
Results logged to /Users/konya/Projects/qis/vender/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/mysql2-0.3.16/gem_make.out
An error occurred while installing mysql2 (0.3.16), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.16'` succeeds before bundling.
```

一番下に`gem install mysql2 -v '0.3.16'`しろって書いてあるからやってみたけど、同じ感じでコケた。

新しく買ったMBPだったし、そういえば`mysql`インストールしてねんじゃね？
と思って、

```
brew install mysql
```

したあとに

```
bundle install
```

したらでけた。
curlでAPIを叩く

# curlでAPIを叩く

* webでAPI作ったりしてる時、修正したら確認用にいちいちブラウザで叩いたりするのがめんどくさい。
* `jmeter`でシナリオ書いたり、`Mechanize`とかでスクレイピング書くほどでもない。
* というかその方がめんどくさい。本末転倒。

みたいな時は`curl`使えば良いと思う。

## 設定ファイル

`~/.curlrc` に置いておけばデフォルトで設定読んでくれるらしいけど、
オプションで設定指定できるのでそれで。

詳細は`man curl`するかググって。

```bash:curl.cnf
# UAの変更
-A = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25"

# カスタムヘッダつけたり
-H X-HOGEHOGE:123
-H X-FOOBAR:piyo

# basic認証用
--user user:pass

# ダウンロード進捗を表示しない
--silent

# リダイレクト辿る
-L

# レスポンスヘッダをstderrに吐く
-D /dev/stderr
```

こんな感じにしておいて

```bash:api_access.sh
#!/bin/bash

URLS=(
    localhost/test1.php.json
    localhost/test2.php.json
    localhost/test3.php.json
    localhost/test4.php.json
)

for x in ${URLS[@]}; do
    curl -K curl.cnf $x | jq .
done
```

みたいな。

とりあえず↑だとjson返すAPIを想定して`jq`に流して整形表示してるけど、
html+DOM で真面目に解析するなら、`ruby` + `Nokogiri` とかでぱぱっとvalidateするやつ書いてそれに食わせても良いかも。

ちなみにpostでデータ送ったりも出来るけど、
更新処理とかのロジックのとこは真面目にチェックしたいので使ってない。

その辺はまぁ、お好みで。

## 1秒毎に叩く

もういちいちコンソールに移ってシェル叩くのもめんどくさい。
勝手にコンソールに結果垂れ流してほしい。って時。

```bash:bash
while sleep 1; do clear && date +"%Y%m%d_%H%M%S" && ./api_access.sh; done;
```

正常終了で`sleep`は0返すからこれで無限ループになるはず。


## ちなみに

当然外部のAPIも叩けるので、
ちょっと手加えれば超カンタンにdos攻撃できちゃうけど、そういう事はしないように。
GitHubにあるリポジトリをローカルにcloneする方法


自分用メモ。
会社のPCやら、家のPCやら、違う環境で作業している場合に、
新しいプロジェクトを立ち上げた時とかGitHubからローカルにcloneしたい時のやり方。
環境はMacっす。

#リポジトリのページからclone URLをコピー

GitHubでcloneしたいリポジトリのページに行き、
画面右下のコピーボタン（下図）を押す。

![スクリーンショット-2014-06-11-18.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/7942/967aa882-e9b9-2067-cdf9-f15c24f85115.png "スクリーンショット-2014-06-11-18.02.05.png")

#terminalで`git clone`する

terminalでcloneしたいディレクトリに移動し、
`git clone `のあとに、先ほどコピーしたものをペーストする。

```
cd projects
git clone git@github.com:masamitsu-konya/example.git
```

これでできるはず。
RabbitMQ + Node.jsサンプル


    amqp = require "amqp"

    options =
      host: "localhost"
    con = amqp.createConnection options

	# 準備OK
    con.on "ready", =>
      # キューに接続
      con.queue "tasklist", (q) =>

        # キューからデータを取得
        q.subscribe (message) =>
          console.log "### task", JSON.parse message.task

          # 終了
          con.disconnect()

        # 送信データ
        task =
          title: "write some articles"
          time: "12:00"
          estimate: "1h"
          description: "brabrabra"

        # キューにデータをプット
        con.publish "tasklist", task: JSON.stringify task
Atlassian JIRA, Stash, Confluenceをインストールしたメモ

メモ書きです。

# 環境

- OS X 10.9
- apache2

# 要件

- サーバのアドレスは 192.168.1.111 としておく。
- JIRA, Stash, Confluenceはそれぞれスタンドアロンで動作させる。
- ポートはそれぞれ 8080, 8081, 8082 としておく。
- リバースプロキシで http://192.168.1.111/jira のようにアクセスできるようにする。
- ユーザーはJIRAユーザーディレクトリを使用する。

# 必要なもの

- Java 7 (Stashが7以上を要求する)

# 勘所

以下のコンフィグをデータベースセットアップ前に済ませておくこと。

- それぞれの server.xml で path を設定しておく
- それぞれの server.xml で proxyName と proxyPort を設定しておく
資料を参照 [Integrating JIRA with Apache](https://confluence.atlassian.com/display/JIRA/Integrating+JIRA+with+Apache)

- mod_proxy を用いて以下のように apache を設定しておく。

```text
ProxyPass /jira http://192.168.1.111:8080/jira
ProxyPassReverse /jira http://192.168.1.111:8080/jira

# 以下同様
```

データベース（と、その他もろもろ）のセットアップにおいて自動的に連携するアプリケーションの設定を行う。セットアップ前に上記の設定を済ませておかないとポート指定のアドレスが設定に紛れ込むことになってしまいよろしくない。

# 終わったら

- アプリケーションリンク、アプリケーションナビゲータの確認
- JIRA ユーザーディレクトリの動作確認

あとはお好みで。
SQLServerで、MySQLのLIMIT句、OFFSET句みたいなもの

SQLServer 2008以前では副問い合わせにしてROW_NUMBER()を使って絞り込みます。

```sql
SELECT * FROM (
  SELECT
	ROW_NUMBER() OVER(ORDER BY ba.LASTUPDATE DESC) as RN
	, *
  FROM T_TEST as ba
) as t
where t.RN BETWEEN 51 AND 100

```

SQLServer 2012ではOFFSET-FETCH句が使えるようになりました。

```sql
SELECT *
FROM T_TEST
ORDER BY LASTUPDATE DESC
OFFSET 50 ROWS
FETCH NEXT 50 ROWS ONLY
```