OmniAICreator/Qiita-1.07M huggingface dataset:
Wiresharkをubuntuでbuildする

開発版WiresharkをUbuntuでbuildしてみました。Wiresharkは1.12.0-rc2, Ubuntu 14.04上でbuildしました。

# 依存関係パッケージのインストール

必要なパッケージを入れます。

```shell-session
$ sudo apt-get install bison flex libgtk-3-dev  libqt4-dev  libpcap-dev
```

# コンパイル

```shell-session
$ wget https://1.as.dl.wireshark.org/src/wireshark-1.12.0-rc2.tar.bz2
$ tar jxvf wireshark-1.12.0-rc2.tar.bz2 
$ cd wireshark-1.12.0-rc2/
$  ./configure --prefix=/usr/local/wireshark
$ make
$ sudo make install
```

# 権限付与

一般ユーザでキャプチャできるようにするため、以下のように権限を与える必要があります。

```shell-session
$ sudo groupadd wireshark
$ sudo usermod -a -G wireshark YOURNAME
$ sudo chgrp wireshark /usr/local/wireshark/bin/dumpcap
$ sudo chmod 750 /usr/local/wireshark/bin/dumpcap
$ sudo setcap cap_net_raw,cap_net_admin=eip /usr/local/wireshark/bin/dumpcap
```

# 起動

一般ユーザで起動します。rootで実行する必要なくキャプチャできます。

```
$ /usr/local/wireshark/bin/wireshark
```

![wireshark 2.png](https://qiita-image-store.s3.amazonaws.com/0/13877/60bcc176-7690-fa50-81f9-f961bd3a4b42.png)

開発版ではHTTP/2の解析パッケージが含まれています。画像のとおりHTTP/2のパケットを解析することができました:)
ボタンの中央揃え

```lang:html
<div class="button_wrapper">
   <button class="button1">ボタン1</button>
</div>
```

```lang:CSS
.button_wrapper{
   text-align:center;
}
```

ボタンには`text-align:center;`や`margin:0 auto;`によるセンタリングが効かないので、
ボタンを囲んだdivに`text-align:center;`を指定する。
nagiosのevent_handlerで障害時に任意のコマンドを実行する

## services.cfg

```diff:event_handlerでmisccommandsのcommand_nameを指定
 define service{
     use                     generic-service
     hostgroup_name          www_servers
     service_description     CPU Load Average
     contact_groups          admin_all
     check_command           check_nrpe!check_load
+    event_handler           sample-mail
     }
```

## misccommands.cfg

```bash:command_lineにコマンドを指定する
define command{
    command_name    sample-mail
    command_line    sh -c '[ "$SERVICESTATE$" == "CRITICAL" -a "$SERVICESTATETYPE$" == "HARD" ] && ssh -i /etc/nagios/id_dsa nagios@$HOSTNAME$'
    }
```

## www01:/home/nagios/.ssh/authorized_keysに追記

```bash:
command="色々コマンド | mail -s '件名' 送信先",from="192.168.2.90,192.168.2.91",no-agent-forwarding,no-port-forwarding,no-pty,no-X11-forwarding ssh-dss <id_dsa.pubの内容> nagios@nagios01.server
```
スライス手順メモ

1.PSDの名前に-sliceを加えて別名保存
　※レイヤーの統合や後の別バージョン作成のため

2.スライス作業
・移動ツール(V)でスライスする画像を選択
・(V)で動かしたりしながら(cmd+Zで戻す)レイヤーに分かれているかチェック
　　ex)画像の影など
（・shiftで全レイヤーを選択　cmd+Eで結合　※消したい所は非表示に）
・(V)メニュー→レイヤー→レイヤーに基づくスライス
・(C)右クリック→スライスオプションの編集→名前：種類_個性

※背景を全て非表示にする

3.Web用に保存
・png24
・Shiftで選択
・フォルダ指定
・選択したスライス
SwiftでObj-Cのコードを参照する際にcannot find interface declaration for 'UIViewController'等のエラーが出る

SwiftのプロジェクトにCocoaPodsでAMScrollingNavbar (1.0)を入れた際に出てはまりました。
Bridge-Headerファイルを作って、Build SettingsのObjective-C Bridging Headerにも記載し、ビルドすると上記のエラーで失敗する。

Obj-Cライブラリに#import <UIKit/UIKit.h>が記載されてないためでした。
bundler + peco + atom で今使っているgemの詳細を見る

## tl;dr

```zsh
function peco-bundle-gem-open() {
    local selected_dir=$(bundle show --paths | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="atom ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-bundle-gem-open

bindkey '^[;b' peco-bundle-gem-open
```

`Meta-; b` で便利最高が発生する：

![benri-bundle2.gif](https://qiita-image-store.s3.amazonaws.com/0/569/a8e9a2fc-e352-8eaa-5c3f-6238f00c717b.gif)

### 詳細

`bundle show --paths` ってやると、そのプロジェクトで使っているgemの在処が一覧できる。そのパスを `atom` に渡しているだけ。atomじゃなくてもいいと思う。でもatomのプロジェクト検索そこそこ便利っぽい気がする。

これでGitHub上のプロジェクトで検索しまくらなくてもよくなりそうで便利。古いgemでも安心...。
centos7でifconfig 見つからない。。。

ネットワーク確認してif-eth0を設定しようとして、ifconfigを打つと下記ビックリさせるほどメッセージ出てきた。

![20140716104731.png](https://qiita-image-store.s3.amazonaws.com/0/35530/6388901f-f1d1-0de6-1937-c7fcb089e7c9.png)

なんだこれ！！

```lang:sh
# dmesg | grep eth
```
![20140716104526.png](https://qiita-image-store.s3.amazonaws.com/0/35530/8c9cdef8-6997-5e24-032c-d49418e08b60.png)

試してenp0s3起動します。

```lang:sh
# ifup enp0s3
```

![20140716105806.png](https://qiita-image-store.s3.amazonaws.com/0/35530/29975cb2-1bc8-68a3-d21d-e7bf593d94e6.png)

ネット設定確認すると

![20140716105303.png](https://qiita-image-store.s3.amazonaws.com/0/35530/f7c3392e-0202-c1ae-8e25-23df6c96290b.png)

おっ！できました！　
ネットワーク管理方法変わったことね。ifcfg-eth0 編集しなくて済むので楽になった。

以上。
ページ内の自動スクロール

```lang:js
$(function () {
   $('a[href^=#]').click(function() {
        var speed = 400;
        var href= $(this).attr("href");
        var target = $(href == "#" || href == "" ? 'html' : href);
        var position = target.offset().top;
        $('body,html').animate({scrollTop:position}, speed, 'swing');
        return false;
   });
});
```

```lang:html
<a href="#move1">
   #move1に移動
</a>

<div id="move1">
   <p>ここに移動</p>
</div>
```

上記jsを記述しておくと、aタグをクリックした際、idで指定したリンク先に自動スクロールします。
ぬるぬる具合は、`var speed = 400;`の設定で変更可。
VagrantのプロバイダにVMWare Fusionを使いたい


# VMWare Fusionをインストールする

Homebrew caskでインストールする。たまにHomebrew caskで提供されるアプリのバージョンが古い場合があるので、下記コマンドで提供されているバージョンが[VMWare Fusion](http://www.vmware.com/products/fusion/)のサイトで提供されているバージョンと同じか確認する。

```console
$ brew cask info vmware-fusion
```

インストールする。

```console
$ brew cask install vmware-fusion
```


# Vagrantfileでboxを指定する

ここで指定しておくとVagrant Cloudから自動的にダウンロードされる。

```ruby
  config.vm.box = "shouldbee/ubuntu-14.04-with-docker"
```

> ※ vagrant 1.6.5より古いバージョンでは、[vagrantがvmware_fusionのboxをvmware_desktopとして認識してしまう不具合]があるため、これができない。回避するために、URLを直接指定して `vagrant box add` する。
>
> ```console
> $ vagrant box add shouldbee/ubuntu-14.04-with-docker https://vagrantcloud.com/shouldbee/boxes/ubuntu-14.04-with-docker/versions/1/providers/vmware.box
> ```

# VMWare Fusionプラグインをインストールする

インストールする際にはXcodeのCommand Line Toolsが必要なので `xcode-select --install` でインストールしておく。


```console
$ vagrant plugin install vagrant-vmware-fusion
```


# Vagrant VMWare providerのライセンスを登録する

[Vagrantのウェブサイト](http://www.vagrantup.com/vmware)で有料のオプションでVMWare providerを購入する。

次のコマンドでライセンスを登録する。

```console
$ vagrant plugin license vagrant-vmware-fusion license.lic
```

# Vagrantを起動する

```console
$ vagrant up --provider=vmware_fusion
```


[vagrantがvmware_fusionのboxをvmware_desktopとして認識してしまう不具合]: https://github.com/mitchellh/packer/search?q=Provider+expected%3A+vmware_fusion+Provider+of+box%3A+vmware_desktop&ref=cmdform&type=Issues


参考: [vagrant - ScalaのコンパイルはVirtualBox環境だと5倍時間がかかる - Qiita](http://qiita.com/reoring/items/df338d715c271c14a663)
BacklogのタスクをSlackに通知する その3

# 参照

[BacklogのタスクをSlackに通知する](http://qiita.com/masuyama/items/6875fcbf936bb5f01922)
[BacklogのタスクをSlackに通知する その２](http://qiita.com/masuyama/items/72160c496bb0f7edf471)

# やりたいこと

その２までのやり方では、backlogの通知を全て取得していたので件数が多くなると重くなっていた。
取得条件にupdate時間を与えて、それ以降のissueを取るようにしてみる。

# サンプルコード
前回までとの変更点のみを記載しています。

```rb:backlog.rb
require 'xmlrpc/client'

class BacklogClient

  def issuelist(project_id, last_update=nil)
    opt = {"projectId" => project_id}
    opt["updated_on_min"] = last_update if last_update
    @client.call('backlog.findIssue', opt)
  end

end
```

```rb:sample.rb
def main
  pass = ARGV[0]
  last_sent_date = Time.now.strftime("%Y%m%d%H%M%S").to_i
  issue_last_update_date = (last_sent_date / 1000000).to_i

  backlog = BacklogClient.new(BACKLOG_HOST, BACKLOG_USER, BACKLOG_PASS)
  slack = SlackClient.new(SLACK_TEAM, SLACK_TOKEN, SLACK_ROOM, SLACK_NAME)
  while true
    issue_update_on = 0
    begin
      backlog.projectlist.each{|project|
        backlog.issuelist(project["id"], issue_last_update_date).each{|issue|
          if last_sent_date < issue["updated_on"].to_i
            slack_send(slack, project, issue)
            issue_update_on = issue["updated_on"].to_i if issue["updated_on"].to_i > issue_update_on
          end
        }
      }
    rescue => e
      puts e.message
    end
    last_sent_date = issue_update_on if issue_update_on > 0
    issue_last_update_date = (last_sent_date / 1000000).to_i if issue_last_update_date != (last_sent_date / 1000000).to_i
    sleep(10.0)
  end
end
```
Rで2変数ガウス分布を因子分解して変分近似

PRML図10.2(a)と同様に、相関のある2つの変数$\mathbf{z}=(z_1,z_2)^T$についてのガウス分布

```math
p(\mathbf{z})=N(\mathbf{z}|\mathbf{\mu},\mathbf{\Lambda}^{-1}),\ 
\mathbf{\mu}=\left(\begin{array}{c}
\mu_1 \\
\mu_2
\end{array}\right),\ 
\mathbf{\Lambda}=\left(\begin{array}{cc}
\Lambda_{11} & \Lambda_{12} \\
\Lambda_{12} & \Lambda_{22}
\end{array}\right)

```

を、分解したガウス分布$q(\mathbf{z})=q_1(z_1)q_2(z_2)$で変分近似します。そして、元のガウス分布と近似した分布それぞれについて、標準偏差の1,2,3倍の等高線を描画します。


まず、変分近似により最適な因子$q_1^\star(z_1), q_2^\star(z_2)$を求めると、以下のようになります。

```math
q_1^\star(z_1)=N(z_1|m_1,\Lambda_{11}^{-1}),\ 
m_1=\mu_1-\Lambda_{11}^{-1}\Lambda_{12}(E_{z_2}[z_2]-\mu_2) \\
q_2^\star(z_2)=N(z_2|m_2,\Lambda_{22}^{-1}),\ 
m_2=\mu_2-\Lambda_{22}^{-1}\Lambda_{12}(E_{z_1}[z_1]-\mu_1)

```

$E_{z_1}[z_1], E_{z_2}[z_2]$は、ガウス分布の平均パラメータで与えられるので、以下のようになります。

```math
E_{z_1}[z_1]=\mu_1-\Lambda_{11}^{-1}\Lambda_{12}(E_{z_2}[z_2]-\mu_2) \\
E_{z_2}[z_2]=\mu_2-\Lambda_{22}^{-1}\Lambda_{12}(E_{z_1}[z_1]-\mu_1)
```

この場合、PRMLに記載の通り、$q_1^\star(z_1), q_2^\star(z_2)$は解析的に求まりますが、ここでは適当な初期値から初めて、$q_1^\star(z_1)$と$q_2^\star(z_2)$を交互に更新していく手法で$q(\mathbf{z})$を求めています。

![27.GaussianVariationalInference.png](https://qiita-image-store.s3.amazonaws.com/0/12670/6bd9d1bd-e394-3b0a-9fa2-ccad672aad36.png)

```r
library(plotrix)
frame()
set.seed(0)
par(mfrow=c(3, 3))
par(mar=c(2.3, 2.5, 1, 0.1))
par(mgp=c(1.3, .5, 0))
colors <- hsv(seq(0.3, 1, 0.01), 0.2, 1)
z1range <- c(0, 1)
z2range <- c(0, 1)
z1 <- seq(z1range[1], z1range[2], 0.01)
z2 <- seq(z2range[1], z2range[2], 0.01)

# 真のガウス分布のパラメータ
mu <- c(.5, .5)
L11 <- 420
L12 <- -400
L22 <- 420
L <- matrix(c(L11, L12, L12, L22), 2)
sigma <- solve(L)

# E[z2]を適当な初期値に設定する
Ez2 <- 1

for (iteration in 0:40) {
	# 因子 q1(z1)=N(z1|m1,L11^-1) を求める
	m1 <- mu[1] - L12 / L11 * (Ez2 - mu[2])
	Ez1 <- m1  # E[N(z|u,s^2)] = u

	# 因子 q2(z2)=N(z2|m2,L22^-1) を求める
	m2 <- mu[2] - L12 / L22 * (Ez1 - mu[1])
	Ez2 <- m2  # E[N(z|u,s^2)] = u

	cat(paste("m1=", m1, " m2=", m2, "\n"))
	if (iteration %% 5 == 0) {
		# 近似した分布を描画する
		q <- outer(z1, z2, function(z1, z2) {
			dnorm(z1, m1, sqrt(L11 ^ -1)) * dnorm(z2, m2, sqrt(L22 ^ -1))
			});
		image(z1, z2, q, xlim=z1range, ylim=z2range, col=colors)
		for (i in 1:3) {
			draw.ellipse(m1, m2, sqrt(L11 ^ -1) * i, sqrt(L22 ^ -1) * i, 0,
				border=4)
		}

		# 真の分布を描画する
		e <- eigen(sigma)
		for (i in 1:3) {
			draw.ellipse(mu[1], mu[2], sqrt(e$values[1]) * i, sqrt(e$values[2]) * i,
				atan2(e$vectors[2, 1], e$vectors[1, 1]) / pi * 180,
				border=3)
		}

		legend("bottomright", c(
			expression(p(bold(z))), 
			expression(q(bold(z)))
			), col=c(3, 4), lty=1, bg="gray")
		title(paste0("#", iteration))
	}

}
```
EC2インスタンスのNameタグを取得する

毎回忘れるのでQiitaにメモしておく　

```bash
$ aws ec2 describe-instances --region REGION \
                             --instance-ids INSTANCE_ID \
                             --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' \
                             --output text
```
Mailchimp エラーケースを列挙する

列挙するといってるのに、一件のみでごめんなさい


# Mailchimpにて、複数のsubscriberを一気に削除したいケース

`Sorry, the 'delete' bulk operation is not available for this list right now.`
て出て、subscriberを複数選択 > delete ができないのは：

そのlistをつかってキャンペーンを7日以内に送ってしまっているから。
7日たったらまた、bulk deleteできるようになるようだ.


c.f.
https://longreply.com/r/0bbe76f2
Swiftでシングルトンパターンを実装する３つの方法


![How_to_design_Singleton_Pattern_using_Java____So_Many_Word.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/2425032f-fc89-814c-5a70-5becea9599f3.jpeg "How_to_design_Singleton_Pattern_using_Java____So_Many_Word.jpg")


Swiftでシングルトンパターンを実装する方法はいくつかあるのでまとめました。

遅延初期化（lazy initialization）とスレッドセーフ（thread safety）を考慮された実装です。
遅延初期化はシングルトンのインスタンスを利用開始するまで当該インスタンスを生成しないことです。
スレッドセーフは複数のスレッドで同時にインスタンスの生成を試みても、誤って複数のインスタンスを生成しないことです。


この実装は以下のバージョンで確認しています。

- Xcode6 Beta3


## structのstatic定数で定義 （推奨）

`static`定数に初期化したインスタンスを保持する実装です。ただSwiftの`class`は`static`定数を[利用できない][1]ので、`struct`でネストして`static`定数を保持しています。現状この実装方法が一番良いと言われています。

```Swift
class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}
```

## グローバル定数で定義

グローバル定数に初期化したインスタンスを保持する実装です。グローバルに変数を保持するのは汚染と言われ推奨されませんが、今後Swiftの言語仕様が変更され局所的グローバル変数が定義できるようになれば、この実装方法がもっともシンプルになります。

```Swift
let _SingletonSharedInstance = Singleton()

class Singleton  {
    class var sharedInstance : Singleton {
        return _SingletonSharedInstance
    }
}
```
		
## dispatch_onceで実装

ObjCと同様の実装方法です。毎回これを書くにのは大変ですね。

```Swift
class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}
```

## 参考

- [SwiftSingleton - Github](https://github.com/hpique/SwiftSingleton)
- [SINGLETON PATTERN IN SWIFT](http://vperi.com/2014/06/05/singleton-pattern-in-swift/)
- [ispatch_once singleton model in swift - stackoverflow](http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift)


[1]: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-XID_322 
"Type Property Syntax - The Swift Programming Language"
別のUIPanelの上にUISpriteを表示する方法

NGUIにおいて、UIPanel(PanelAとする)の上に別のUIPanel(PanelBとする)を重ねていたとき、PanelAに配置したUISpriteをPanelBの表示の上に重ねて表示させる方法。

そんなものはなかった。
※3.0.6時点。

なので、実現したいときにはさらにもう一枚のUIPanel (PanelCとする)をPanelBの上に重ねて、そちらに配置する。
Wiresharkで任意のパケットを指定してエクスポート

複数パケットを選択してpcapngで保存したかったのでそのときのメモ。

Selected Packet onlyでは指定したパケット１つしかエクスポートできないので
複数選択する場合はマークする。

エクスポートしたいパケットを選択して右クリックからMark Packetを選択しマークする。 

メニューfile - Export Specified Packetsで画面左したmarked packets onlyを指定し保存。
Jenkinsのイメージ作った (537.8 MB)

# 使用方法

```bash:
docker run -it -p 8080:8080 tukiyo3/centos-ja:6.5-jenkins /bin/bash
```

http://localhost:8080/ にアクセスすればJenkinsの画面が表示される。

# 作成手順

```bash:インストール
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
curl -o /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
yum install -y jenkins java-1.7.0-openjdk
```

port番号は`/etc/sysconfig/jenkins`で定義されている。

```bash:/.bashrc
/etc/init.d/jenkins start
```
PythonでSendKeys

[ダウンロードファイル一覧 - Notepad++ Python Script - SourceForge.JP](http://sourceforge.jp/projects/sfnet_npppythonscript/releases/)から

*  ExtraPythonLibs -> SendKeys.zip

をダウンロードし展開。

```py:使用例
import SendKeys
SendKeys.SendKeys("{ENTER}")
```

もしimport出来ない場合はPATHが通っていない。

```py:PATHの追加
import sys
sys.path.append('sendkeys')
import SendKeys
```

詳しい使い方は[Pythonから電卓を起動し勝手に計算してもらう - MTKの日記](http://d.hatena.ne.jp/mtk0308/20110818/1313687028)を見るとよい。
ネット回線を変えたら、サーバーにssh出来ず、ssh_exchange_identification: read: Connection reset by peer になった時の対応

# 前置き
チョット前に自宅のネット回線をADSLに戻しました。
そしたら、さくらVPSにsshできなくなってしまいました。
その時の対応です。

# 状況
* PC: MacBookPro (Mavericks)
* サーバー: さくらVPS(CentOS 6.5)
* ssh出来ていた時の回線: WiMAX(レンタル)
* 現在の回線: ADSL

# エラーメッセージ

Macからサーバーにssh仕様としたらこんなメッセージが出ました。

```shell-session
watashi% ssh sakuradev
ssh_exchange_identification: read: Connection reset by peer
```

*Connection reset?*

とりあえずサーバー側のせいで繋がらなくなっちゃったかなって思いました。

詳細をみます。

```shell-session
watashi% ssh -v sakuradev
OpenSSH_hoge, OSSLShim hogehoge dd mm yyyy
debug1: Reading configuration data /Users/hoge/.ssh/config
debug1: /Users/hoge/.ssh/config line 7: Applying options for sakuradev
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to xxx.xxx.xxx.xxx [xxx.xxx.xxx.xxx] port xxxxx.
debug1: Connection established.
debug1: identity file /Users/watashi/.ssh/kagi type -1
debug1: identity file /Users/watashi/.ssh/kagi-cert type -1
debug1: Enabling compatibility mode for protocol hoge
debug1: Local version string SSH-hogehoge-OpenSSH_hogehogehogehoge
ssh_exchange_identification: read: Connection reset by peer
```

やっぱり、ローカル側でなくサーバー側の問題かな。

# wifiを変更

これまで入っていたwifiに繋ぎ直して、サーバーに入ります。
私の場合は、softbankのlte回線のテザリングを使いました。

# /var/log/secure を見る

サーバーへの接続状況を見るために、サーバー側の/var/log/secureを見ます。

```shell-session
$ sudo cat /var/log/secure
----
mm dd 00:00:00 watashi sshd11111]: refused connect from softbankhogehogehogehoge.bbtec.net (xxx.xxx.xxx.xxx)
```

確かにsoftbankhogehogehogehoge.bbtec.netからのアクセスが拒否されています。

# /etc/hosts.allow へIPを追加

以下の様にxxx.xxx.xxx.xxxからのアクセスを許可します。

```shell-session
server watashi$ sudo vim /etc/hosts.allow
----

ALL: 127.0.0.1, xxx.xxx.xxx.xxx
sshd: .jp
```

ちなみに /etc/hosts.denyはこんな感じ。

```shell-session
server watashi$ sudo vim /etc/hosts.deny
---

sshd: ALL
```

これでローカルからのsshが通るようになりました。
Vagrant でgui-MODE

次の3工程で起動させます。
vagrant box へ登録 vagrant box add <vms名> [boxファイルURL]
vagrant 初期化 vagrant init <vms名
vagrant で対象の起動 vagrant up

設定 (Vagrantfile)
仮想ウィンドウを起動したい仮想マシーンのフォルダにある設定ファイル「Vagrantfile」をテキストエディタで編集します。 だいたい47行目あたりにある行のコメントを次のように外します。

```


config.vm.provider :virtualbox do |vb|
  # Don't boot with headless mode
  vb.gui = true
#
#   # Use VBoxManage to customize the VM. For example to change memory:
#   vb.customize ["modifyvm", :id, "--memory", "1024"]
end
```
編集を保存し、vagrant up コマンドで仮想マシーンを起動しましょう。 すると、今までとは違い仮想ウィンドウが表示されます。
VafrantBox

boxファイルの追加

Vagrant ではあらかじめOSがインストールされたboxファイルを使用して仮想マシンを作成します。
以下からOSを選んでダウンロード、登録します。
今回は Ubuntu13.04 を使います。

http://www.vagrantbox.es/

1
// boxの登録。結構時間かかります。
2
$ vagrant box add ubuntu13.04 http://goo.gl/ceHWg
これで ubuntu13.04 という名前の box が作られました。

1
// 追加されているか確認
2
$ vagrant box list
3
ubuntu13.04       (virtualbox)
Vagrant の初期化

1
$ mkdir ubuntu13vm
2
$ cd ubuntu13vm
3
$ vagrant init ubuntu13.04
vagrant initを実行するとカレントディレクトリに Vagrantfile が作成されていると思います。
こちらが Vagrant の設定ファイルになります。
Chefなどのプロビジョニングの設定や同期フォルダの設定、ネットワークの設定が出来ます。

Vagrantfileのネットワークの設定を少しいじってみましょう。

1
# config.vm.network "private_network", ip: "192.168.33.10"
2
↓
3
config.vm.network "private_network", ip: "192.168.33.10"
これで起動したときの仮想マシンのIPが192.168.33.10になります。
WEBサーバなどを立ち上げた時に上記のIPでアクセスできます。

Vagrant の起動

さて起動してみましょう。初回のみ時間がかかります。

1
$ vagrant up
立ち上がったら起動した仮想マシンに入ってみましょう。

1
$ vagrant ssh
2
Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-19-generic x86_64)
3
 
4
 * Documentation:  https://help.ubuntu.com/
5
Your Ubuntu release is not supported anymore.
6
For upgrade information, please visit:
7
 
8
http://www.ubuntu.com/releaseendoflife
9
 
10
New release '13.10' available.
11
Run 'do-release-upgrade' to upgrade to it.
12
 
13
Last login: Wed Jun 12 06:36:33 2013 from 10.0.2.2
14
vagrant@raring64-vanilla:~$ 
入れました。
vagrantというユーザーでログインしています。

抜けたいときはexitで抜けましょう。

ためしに仮想マシンにApacheをいれてブラウザで表示してみましょう。

1
// Apacheのインストール
2
vagrant@raring64-vanilla:~$ sudo aptitude -y install apache2
インストールできたら先ほど設定したIPアドレスにブラウザでアクセスしていみましょう。

ブラウザ

無事アクセスできました。
std::bindとstd::functionを利用してswitch文のコピペを回避する方法

#何が起きたのか#
とある enum class の設定に基づいて、実務クラスの挙動を微妙に変える必要があり、行き当たりばったりでコードを書いていたら、いつの間にかswitch文のコピペが大量に発生していた。
ぱっと見コードが汚い…。
どうしよう　(´・ω・`)
#解決#
```cpp
#include <iostream>
#include <functional>


// 何らかの意味があるモードがあったとします。
enum class flag_t : unsigned char
{
    mode_01,
    mode_02,
    mode_03,
};

// 関数を登録しておくためのもの
class flag_pattern_func_t
{
public:
    using func_t = std::function< void() >;

    func_t mode_01;
    func_t mode_02;
    func_t mode_03;
    func_t mode_dc; // case default:
};

// 状態を持っているクラス
class state_t
{
public:
    flag_t flag;
public:
    void pattern_call( flag_pattern_func_t &func );
};

// 状態に基づいた関数の呼び出し
void state_t::pattern_call( flag_pattern_func_t &func )
{
    switch( flag )
    {
    case flag_t::mode_01:
        if ( func.mode_01 ) return func.mode_01();
        break;
    case flag_t::mode_02:
        if ( func.mode_02 ) return func.mode_02();
        break;
    case flag_t::mode_03:
        if ( func.mode_03 ) return func.mode_03();
        break;
    default:
        break;
    }
    if( func.mode_dc ) return func.mode_dc();
}

// 何らかの仕事をしなければならないクラス
class worker_t
{
public:
   state_t state;
   
   void work_01();
   void work_02();

private:
   void work_01_mode_01() { printf("work_01_mode_01()\n"); }
   void work_01_mode_02() { printf("work_01_mode_02()\n"); }
   void work_01_mode_dc() { printf("work_01_mode_dc()\n"); }

   void work_02_mode_02() { printf("work_02_mode_02()\n"); }
   void work_02_mode_03() { printf("work_02_mode_03()\n"); }
};

// 呼び出し元から丸投げされた実務処理01
void worker_t::work_01()
{
    flag_pattern_func_t pf;
    pf.mode_01 = std::bind( &worker_t::work_01_mode_01, this );
    pf.mode_02 = std::bind( &worker_t::work_01_mode_02, this );
    pf.mode_dc = std::bind( &worker_t::work_01_mode_dc, this );
    state.pattern_call( pf );
}

// 呼び出し元から丸投げされた実務処理02
void worker_t::work_02()
{
    flag_pattern_func_t pf;
    pf.mode_02 = std::bind( &worker_t::work_02_mode_02, this );
    pf.mode_03 = std::bind( &worker_t::work_02_mode_03, this );
    state.pattern_call( pf );
}


int main()
{
   worker_t work;
   work.state.flag = flag_t::mode_01; work.work_01();
   work.state.flag = flag_t::mode_02; work.work_01();
   work.state.flag = flag_t::mode_03; work.work_01();

   work.state.flag = flag_t::mode_01; work.work_02();
   work.state.flag = flag_t::mode_02; work.work_02();
   work.state.flag = flag_t::mode_03; work.work_02();
   return 0;
}
```

[Wandbox]で確認。
http://melpon.org/wandbox/permlink/TeEbdN9k3EgfzXLm

scoped enum とは
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#dcl.enum.scoped

#それで？#
1. switch文をコピペするよりはマシになった気がします。
2. こういう方法はループの深い階層の場所では使わない気がします。
3. 処理の浅い場所で細かい挙動を変えたい時とかに使うんだと思います。
4. とあるモードに対する実務処理が一つだけならここまでする必要はないと思われます。
5. 意味のある実務処理が複数存在してしまうとか、複数のソースにおんなじような switch 文が現れたら使ったほうがいいと思います。
6. ステートマシンを使う程でもないときに利用できるかと思います。


何かもっと、より良い方法があったら教えて下さいm(_ _)m
Unity開発について:プログラマの初めてのUnity

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/07/16/unity_first_pg/)のほうで更新します。

プログラマじゃなくても簡単にゲームが作れる！
と言う話を聞き、
プログラマだったらどうだろう？と気になってUnityを細々と手を出しています。

その際、Unityならではの引っかかった部分を書き出してみました。
プログラマならではなのか、プログラマじゃなくても引っかかるのかは…どうなんでしょうか。

自分が最初に躓いたのはこれです。
・何すればいいの？
・プロジェクトはどう用意するの？
・プログラムはどうすれば使えるの？

具体的に書いていきますね。

##何すればいいの？
1.UnityをDL。
　※WindowsでもMacでも開発出来ます。

　こちらからDL出来ます。
　http://japan.unity3d.com/unity/download/

　UnityをDLした事が無ければ、30日限定で有料版(Pro)のお試しが出来ます。

2.公式チュートリアルを見ながら作る。
　はじめてのUnityと言うページがあります。
　http://japan.unity3d.com/developer/document/tutorial/my-first-unity/

　現状、第3回までしか紹介されていませんが、とっかかりとしては十分だと思います。
　自分が見た時は、第1回しかありませんでした。

　その他にもドキュメントページを眺めると結構勉強になります。
　http://japan.unity3d.com/developer/document/

3.公式Asset StoreからサンプルプロジェクトをDLしていじる。
　Asset Storeとは、宝の山です。

　世界中の人達が作った色々な物(絵、音、プログラム等)が、無料or有料で公開されている場所です。
　誰もが必要な物全てを用意出来るわけではないため、ここで探してみると良いかもしれません。
　※いつの間にか、一部日本語化されてて見やすくなってきています。
　https://www.assetstore.unity3d.com/jp/

　この中に、完成プロジェクトと言うカテゴリがあり、そこで丸ごと実行環境含めて配布されているものがあります。
　パブリッシャーにUnity Technologiesと言うUnity公式さんがいて、結構プロジェクトを配布しているのでオススメです。

　個人的にはこれがオススメです。
　2Dゲームプロジェクトで、3Dはちょっと難しそう…って人でも見やすいと思います。
　https://www.assetstore.unity3d.com/jp/#!/content/11228

　プロジェクトでは無いですが、最近では3DモデルのUnity Chan!データが公式から公開されています。
　3Dをバリバリ動かしたいんだ！って方はこちらをDLして、色々いじるといいかもしれません。
　(しかも2Dデータも本当に最近公開されたそうです)
　http://unity-chan.com/
　https://www.assetstore.unity3d.com/jp/#!/content/18705

##プロジェクトはどう用意するの？
1.プロジェクトフォルダを用意
2.Unityで、プロジェクト生成

ここまでは、通常の開発と同じだと思います。

unityでは、プロジェクトだけではゲームを作れず、シーンというものを生成する必要があります。
シーン=画面と言うイメージで、タイトル、ゲーム、メニュー等のシーンを用意する事になると思います。
※シーン切り替えに時間かかるので、シーン分けずに共通化する手法もあるので一概にこれ！とは言えませんが。

シーン毎に、ヒエラルキーというものがあり、シーンにオブジェクトを配置すると、ここに表示されます。
オブジェクトの詳細は、オブジェクトを選択するとInspectorウィンドウ上で見ることが出来ます。


##プログラムはどうすれば使えるの？

まず、プログラムは、UnityではScriptと呼ばれています。
・JavaScript
・C#
・Boo
の3つの言語が使えます。

Unity独自の挙動で、
　1.オブジェクトにScriptを設定(Add Component)。
　2.そのオブジェクトをHierarchyに配置。
　3.シーン実行時に、オブジェクトが生成され設定しているScriptがnewされる。
と言うイメージを持てるまで時間がかかりました。

オブジェクトには、様々な機能を設定出来、Transformが必ず設定されています。
それを追加するのはAdd Component。
削除するのはRemove Component。
Inspector、Scriptからいじる事が可能です。



Qiitaの記述にまだまだ不慣れで、見にくいかと思います。
徐々に整形しつつ、詳細追加していきたいと思います。
もう眠いのでとりあえず投稿しちゃいます。。


- 14/07/17 0:50　更新<br>
整理しました。<br>
Asset Storeについて、詳細追記しました。<br>
Unity Chan!について追記しました。
IEの条件付きコメントを使ったjQuery1系2系の使い分け

# jQuery2.xとIE


jQueryの1系と2系、実は機能的に大きな違いはありませんが、2系は1系に比べて軽量でかつ高速です。
なぜ軽量で高速なのかというと、2系はIE6～8をサポートしなくなったから。


私は常に最新のバージョンのものを使用したいので、迷わず2系を使用していましたが、やはり古いIEを使用している人はいるもの。サポートしません、という手もありますが、古いIEもサポートするには、やはりjQuery1系を使用しなければいけません。


# IEの条件付きコメント


> 条件付きコメントとは、Microsoft Internet Explorerによって解釈されるHTMLソースコード中にある条件付きのステートメントである。条件付きコメントは、マイクロソフトのInternet Explorer 5ブラウザーで初めて登場し、バージョン9までサポートされた。なお、バージョン10以降はこの機能は廃止され、他のブラウザと同様、単なるコメントとして扱われる事となった。 [Wikipedia](http://ja.wikipedia.org/wiki/%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)


この条件付きコメントを使用することで、古いIEはjQuery1系を使用し、IE9以上かつIE以外のブラウザは2系を使用するということが可能になります。


なお、jQueryの1.10と2.0、1.11と2.1のようにペアになっておりそれぞれ互換性をもっています。1系は1.10、2系は2.1.1を使用するなどバージョンの齟齬がおきないようにしましょう。


## 使用可能な演算子


IE6以上だの未満だのIE6を含むとか含まないとかいろいろ指定はできますが、今回は、jQuery1系2系をそれぞれ使用する場合を想定し、IE8以下か、IE9以上かを判定する方法を説明します。


### IE8以下かどうか


```html
<!--[if lte IE8]>
<script type="text/javascript" src="/jquery/1.11.1/jquery.min.js"></script>
<![endif]-->
```


ltの場合、IE8を含まない、e(=equal)をつけるとIE8を含む


### IE9以上かどうか


```html
<!--[if gte IE9]>
<script type="text/javascript" src="/jquery/2.1.1/jquery.min.js"></script>
<![endif]-->
```


gtの場合、IE9を含まない、e(=equal)をつけるとIE9を含む


### IE9以上、かつIE以外のブラウザに対応する場合


```html
<!--[if gte IE 9]><!-->
<script type="text/javascript" src="/jquery/2.1.1/jquery.min.js"></script>
<!--<![endif]-->
```


# jQuey Migrate


1系だの2系だのいってきましたが、1系の中でもバージョン1.9から大きな変更が加えられ、いくつかの機能が削除されました。

現在は削除されていないものの削除予定のものや、今後削除されていく機能はあると思います。
バージョンがあがることで突如機能が削除されることはなく、削除予定段階を経て削除されるわけですが、それでもすぐにバージョンアップに対応するのは難しいということもあります。



そんなときは、jQuery Migrate機能を使用することで、最新のjQueryを使用しつつ、削除済み機能を使用するということが可能になります。



非圧縮版のMigrateを使用した場合、Firebugなどのコンソールに、使用中のjQueryバージョンではdeprecatedだよーとかremovedだよーといった警告を表示してくれます。

デバッグやバージョンアップのためのテストを行っている場合であれば、この警告を利用してdeprecatedやremovedな機能を最新のものに置き換えるヒントになるかもしれません。



使用方法は簡単、ただMigrateファイルを読み込むだけです。
サンプルはCDNのファイルを使用した方法です。



## 非圧縮版


削除予定、もしくは削除済みのメソッドを使用した場合、コンソールに警告を発します。


```html
<script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.2.1.js"></script>
```


## 圧縮版


非圧縮版と異なり、警告はでません。通常使用時と違和感無く使用できます。


```html
<script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
```
Connectを使った静的ファイル配信サーバが動かなくなった


# 概要

最近、Connect3になってから、仕様がだいぶ変わったらしい。
前に書いたスクリプトが以下のようなエラーを出力して動かなくなった。

```
has no method 'static'
```


# 2.xx

以下のようにバージョンを指定して、インストールする。

```shell
$ npm install connect@2.X.X
```

前のコードが使用できる。

```javascript:server.js
var connect = require('connect');
connect.createServer(
    connect.static(__dirname)
).listen(5000);
```


# 3.xx

最新版を使う場合は、`serve-static`をインストールする。

```shell
$ npm install serve-static
```

コードは以下のようになる。

```javascript:server.js
var connect = require('connect'),
    serveStatic = require('serve-static');

var app = connect();

app.use(serveStatic(__dirname));
app.listen(5000);
```

# 参考

nodejs connect cannot find static
http://stackoverflow.com/questions/24346161/nodejs-connect-cannot-find-static
[Go] port 80を開いたあとroot権限を捨てるwebサーバの例

port 80を開くためにはroot権限が必要だが、開いたあとはセキュリティーリスクを最小限にするために一般ユーザ権限に降格したい、というWebサーバをGoで書く例です。

【追記3】
下記の例ではLinuxで動作させた場合に不十分です。

Linuxではsetuidを呼び出したスレッドにしか効かないので、以下の例をそのままLinuxで動かすと`syscall.Setuid()`は成功しますが、HTTPのHandlerでは別スレッドで動くことがあるため、rootのままで動作することになります。

[methaneさんのコメントを参照ください](http://qiita.com/sfujiwara/items/b312fbdd2660e43b6717#comment-fe348261245569bcd76a)


* rootで起動した状態で":80"をlistenして
* `syscall.Setuid()` で一般ユーザになり
* `http.Serve()`する

```go
package main

import (
	"net"
	"net/http"
	"syscall"
	"log"
)

func main() {
	listener, err := net.Listen("tcp", ":80")
	if err != nil {
		log.Panic(err)
	}
 	err = syscall.Setuid(501) // 501 == uid
	if err != nil {
		// setuid に失敗したらroot権限のままなので死ぬべき
		log.Panicf("setuid failed", err)
	}
	handler := http.FileServer(http.Dir("/tmp"))
	err = http.Serve(listener, handler)
	if err != nil {
		log.Panic(err)
	}
}
```

ところで、ユーザ名からuidを解決するために getpwnam(3) 相当のことをするのにはどうすればいいんでしょう。

[cgoで実装する例](http://akrennmair.github.io/golang-cgo-slides/#4) は見つけましたが、~~Go自体ではサポートされていないのかな…~~

【追記】
コメントで教えて頂きましたが [os/userのLookup](http://golang.org/pkg/os/user/#Lookup) でユーザ名からuidが取得できます。User.Uidがstringなのは、uidが数値ではないシステムがあるからでしょうね。[具体的にはPlan9…?](http://golang.org/src/pkg/os/user/lookup_plan9.go)

```go
// (略)
	userInfo, err := user.Lookup("nobody")
	if err != nil {
		log.Panicf("no such user", err)
	}
	uid, _ := strconv.Atoi(userInfo.Uid)
	syscall.Setuid(uid)
```

【追記2】
setuidに失敗した場合は権限が放棄できていないので、ちゃんとエラーチェックして対処するべきでしたのでコードを修正しました。

【追記3】
Linuxの場合、setuid は呼び出したスレッドにしか効かないというのを教えて頂きました。
nvmをinstall時に他の場所に導入する方法


nvmには便利なinstall scriptが用意されています。

```
curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | bash
```

しかし、これを実行してしまうと、~/.nvm に導入されてしまいます。
これでも良いのですが、foreverなど、sudo必須なモジュールを動かすのには適しません。

そこで、install場所を`/opt/nvm`に導入すれば普段はsudo必須ではなく、また`/etc/sudoers`を編集すればsudo foreverなどといった事ができるようになります。

## How To

```shell-session:shell
mkdir /opt
cd /opt
export NVM_DIR=/opt/nvm
curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | bash
```

これで`/opt/nvm`に導入されるので、後は

```shell-session:.*shrc
if [[ -s /opt/nvm/nvm.sh ]] ;
	then source /opt/nvm/nvm.sh ;
fi
```

を`.*shrc`に追加すれば導入完了です。
Shellを再起動すれば`nvm`コマンドが使用可能になっているかと思います。

後は

```shell-session:shell
nvm ls-remote # node.jsのサイトからバージョン一覧を取得
nvm install v0.10.29
node -v
npm -v
```

以上で導入完了です。
canvasで画像の２値化



# 画像の２値化
画像の画素を白か黒かの２階超に変換する処理を２値化といいます。

# 閾値
画像の2値化の白か黒かを判別するための閾値をきめなくてはいけません。
閾値の設定はヒストグラムを作成し、その山が二つある場合その山の間の谷に閾値を設定すると、うまく２値化できるようです。
以前つくった輝度のヒストグラムを使ってみます。


![binary.png](https://qiita-image-store.s3.amazonaws.com/0/4044/a2722c08-7554-fd3b-9d2b-de71941aa28c.png "binary.png")

だいたい65を境に色を変えてみたらいい感じになったので、
65を閾値にしてみます。

# 2値化のプログラム


````binarization.html
<!DOCTYPE html>
<html>
<head>
<title>画像処理</title>
<script type="text/javascript">
const THRESHOLD = 65;

window.onload = function() {
    var canvas = document.getElementById("c1");
    var ctx = canvas.getContext("2d");
    var img = new Image();
    img.src = "test.jpg";
    img.onload = function() {
        ctx.drawImage(img, 0, 0);
        var src = ctx.getImageData(0, 0, canvas.width, canvas.height);
        var dst = ctx.createImageData(canvas.width, canvas.height);

        for (var i = 0; i < src.data.length; i=i+4) {
            var y = ~~(0.299 * src.data[i] + 0.587 * src.data[i + 1] + 0.114 * src.data[i + 2]);
            var ret = (y > THRESHOLD) ? 255 : 0;
            dst.data[i] = dst.data[i+1] = dst.data[i+2] = ret;
            dst.data[i+3] = src.data[i+3];
        }

        ctx.putImageData(dst, 0, 0);
    };
};
</script>
</head>
<body>
  <canvas id="c1" width="300" height="300">
</body>
</html>

````

結果は以下のようになります。
ちょっといい感じにできましたかね？

![binary2.png](https://qiita-image-store.s3.amazonaws.com/0/4044/103ad253-7194-6a12-337f-be9e5bd649e3.png "binary2.png")
[小ネタ]Mozillaのサイトで開発者ツールのコンソールを立ち上げると...

## 確認方法

[FireFoxのDLページ](https://www.mozilla.org/ja/firefox/new/)から、開発者ツールのJavaScriptコンソール画面を立ち上げてみよう。

ちょっとした感動が味わえます。

## 切り替え方法
もう二度と見たくなければ、そのまま開発者ツールで↓を叩けばよい。

```js
Tabzilla.disableEasterEgg()
```

「やっぱもう一回見たい…」となった場合は、再度↓を。

```js
Tabzilla.enableEasterEgg()
```
AOJ0067

　深さ優先探索の練習として、AOJ0067を解いてみました！今まで敷居が高く、あまり解ける気がしなかったのですが、実装してみて意外とすんなり通ったのでとても嬉しいです！
　まぁ、他の方からしたら簡単な問題なのかもしれませんが・・・、自分にとっては大きな一歩でした。

```java:
import java.util.Scanner;
public class Main {
	boolean[][] board;
	int[] fdx = new int[]{1, -1, 0, 0};
	int[] fdy = new int[]{0, 0, -1, 1};
	void dfs(int x, int y) {
		if(x < 0 || y < 0 || x >= 12 || y >= 12) return;
		if(!board[x][y]) return;
		if(board[x][y]) board[x][y] = false;
		for(int r = 0; r < fdx.length; r++) {
			dfs(x + fdx[r], y + fdy[r]);
		}
	}

	void doIt() {
		Scanner stdIn = new Scanner(System.in);
		while(stdIn.hasNext()) {
			board = new boolean[12][12];
			for(int r = 0; r < 12; r++) {
				String input = stdIn.next();
				for(int c = 0; c < 12; c++) {
					if(input.charAt(c) == '1') board[r][c] = true;
				}
			}
			int count = 0;
			while(true) {
				boolean flag = false;
				for(int r = 0; r < 12; r++) {
					for(int c = 0; c < 12; c++) {
						if(board[r][c]) {
							flag = true;
							dfs(r, c);
							count++;
							break;
						}
						if(flag) break;
					}
				}
				if(!flag) break; //見つからなかったら既に探索が完了している。
			}
			System.out.println(count);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}
}


```

　もし、コードの改善案がありましたら、教えて頂けると幸いです。
A Tour of Go, Exercise: Loops and Functions

## A Tour of Go

### Exercise: Loops and Functions
http://go-tour-jp.appspot.com/#24

```go
package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) float64 {
    z := float64(2.)
    s := float64(0)
    for i := 0; i < 10; i++ {
    	z = z - (z*z - x)/(2*z)
        if math.Abs(z - s) < 1e-10 {
            break;
        }
        s = z
    }
    return z
}

func main() {
    fmt.Println(Sqrt(2))
    fmt.Println(math.Sqrt(2))
}
```

1.4142135623730951
1.4142135623730951

Program exited.


## math

http://golang.org/pkg/math/

## math.Abs

http://golang.org/pkg/math/#Abs

## math.Sqrt

http://golang.org/pkg/math/#Sqrt
JJSコマンドでJavaScriptコード内でJavaコードを呼び出す

## 実行環境
* MacOS X Mavericks
* Java1.8.0_05

## JJSコマンドのパスを通す
```bash
cd /usr/bin
sudo ln -s $JAVA_HOME/bin/jjs jjs
```

## JavaScriptのファイルを作成する
```js:collection.js
var list = java.util.Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
var odd = list.stream().filter(function(i) {
  return i % 2 == 0;
});
odd.forEach(function(i) {
  print(">>> " + i);
}); 
```
* ラムダ式で表せるインターフェースの実装に関して、JSの関数で代用できるらしい

## JJSコマンド実行
```bash
$ jjs collection.js
>>> 2
>>> 4
>>> 6
>>> 8
```

## 参考
http://orablogs-jp.blogspot.jp/2014/03/oracle-nashorn-next-generation.html
simple_formで動的にフォーム要素を追加・削除する


#やりたいこと

[simple_form](https://github.com/plataformatec/simple_form)を使っていて、ネストされたフォームを動的に追加、削除したい

# 解決方法

[nested_form](https://github.com/ryanb/nested_form)を使う。

## 使用方法

### Gemfileに記入して ```bundle```

```ruby:Gemfile
gem 'nested_form'
```

### application.jsに追加
```javascript:application.js

//= require jquery_nested_form

```

### ```simple_nested_form_for```でフォームを作成する


要素を追加する場合、 ```link_to_add```で指定する。その際、```data: { target: '#tasks' }``` を指定することで、idがtasksのところに追加されていく。

要素を削除する場合は、```link_to_remove```で削除することが可能。

```
<%= simple_nested_form_for @post do |m| %>
	<%= m.input :title, label: 'タイトル' %>
		<table id='tasks'>
			<%= m.simple_fields_for :steps do |s| %>
				<tr class='steps-field'>
					<td>
						<%= s.text_area :content' %>
					</td>
					<td>
						<%= s.link_to_remove '削除' %>
					</td>
				</tr>
			<% end %>
		</table>
		<%= m.submit %>
		<%= m.link_to_add "追加", :steps, data: { target: '#tasks'} %>
<% end %>
```

# 参考

- https://github.com/ryanb/nested_form#simpleform-and-formtastic-support

- [Rails4でフォーム要素を動的に追加したり削除したり〜nested_form | Scimpr Blog](http://blog.scimpr.com/2014/01/20/rails4%E3%81%A7%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E8%A6%81%E7%B4%A0%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%82%8A%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%82%8A/)
Create a New Todoist Task from Python Script


## Background

At work, we just began to use (or experiment with) Todoist to keep track of log files we need to collect from sites. Todoist is a task management tool that is available on mobile, desktop and web platforms. 

## Motivation

I wanted to see if I can manipulate the tasks from scripts. I'm using [yowsup](https://github.com/tgalal/yowsup) to develop a Whatsapp bot so I was wondering if I can somehow get the bot to interact with the tasks (such as create new tasks, mark them as complete, etc). At a casual look, the script needs to use OAuth 2.0 token before it can interact with the tasks. Since I do not know anything about the OAuth 2.0 token, here's what I've done to get started.

## Steps

### Install pytodoist

```bash
pip install pytodoist
```

### Get Google OAuth 2.0 Token

I don't know anything about OAuth 2.0 token. I definitely need to learn more about it later, but I found [Google OAuth 2.0 Playground](https://developers.google.com/oauthplayground/), where you can get a working token.

1. Choose Google OAuth2 API v2 
2. Select https://www.googleapis.com/auth/userinfo.email and click Authorize APIs button
3. Click Accept when Google OAuth 2.0 Playground requests to have offline access
4. You will be given an authorization code. Click Exchange authorization code for tokens
5. You will receive refresh and access tokens (If you do not see them, click Step 2 to reveal the tokens)
6. Copy the access token

### Login with Your OAuth 2.0 Token

```python
from pytodoist import todoist
user = todoist.login_with_google('your-gmail-address', 'your-access-token')
print user.full_name
print user.is_logged_in()
```
便利な関数の甘い罠

#はじめに
いつの間にか`JOIN`と`UNION`が使えるようになった！
さらに出来るようになったなBigQuery！！

と、いうことでBigQueryには便利な関数が用意されています。
でも使い方を誤る（つーか、あとで気づくのだが）と後で『やり直しかぁぁぁ！』となります。Oracleに慣れていると『あぁ、暗黙変換ってとっても便利だったんだなぁ。』と思うこともしばしば。まぁ、甘えすぎなんですけどね。ちゃんと指定せぃっ！

まぁ、そんなこんなで。
#時間はあくまでUTC
時間や日付に関する関数が色々用意されています。
https://developers.google.com/bigquery/query-reference?hl=ja#datetimefunctions
使い始めると本当に便利です。
でね、このあたりでよく使うのが``CURRENT_DATE``とか``CURRENT_TIMESTAMP``とか。
DATE_ADDとかと組み合わせて帳票なんかで過去1週間のデータだけを毎日出すなどあるわけですよ。
そんなときに``DATE_ADD(CURRENT_DATE(),-7,"DAY"))``とすると・・・
2014-07-28 00:00:00 UTC
と、出てきます。だが、しかーーーし！ここで注目！！
**UTC**
これ！これが曲者！BigQueryで現在時間はUTCで処理されるんです！
だから、明け方にBigQuery上で集計するバッチなどは要注意！上のSQLで日付比較なんかすると前々日までのデータしか集計されません。じゃ、どうすりゃいいのってことでうちではこうやってます。
``DATE_ADD(DATE_ADD(CURRENT_TIMESTAMP(),+9,"HOUR"),-7,"DAY")``
解説を書くまでもないかもしれませんが、+9でJSTに直して日付を足すって感じです。
昼間開発してると案外気が付かないもんです。

#COUNT(DISTINCT ***)はおおよそです！
何を言っているのかよくわからないでしょ？
私自身も最初、何のことかよくわかりませんでした。
例えばうちの場合だと注文番号があって、明細番号というのがあります。こういう場合、注文番号が一意ではなくなります。で、注文番号だけがいくつあるのか集計したい場合がよくあります。そんなときに``COUNT(DISTINCT SLIP_NO)``とします。

でも、これは**おおよそ**の数値が出るだけ。

レコード数にもよるのかもしれませんが、万件レベルで数値がズレます。**なぜか？知りません！**じゃ、どうするのでしょうか？『Google Big Query Analytics』にもありますが、例文を書いておきます。

```
SELECT
 COUNT(SLIP_NO)
FROM
 (SELECT
   SLIP_NO
  FROM
   SLIP_TABLE
  GROUP BY SLIP_NO)
```
一度``GROUP BY``でまとめてから、それを``COUNT()``するってことです。
#最後に
どうですか？面倒ですか？でも、少しSQLを書くのが面倒かもしれませんが、IndexをきかせるSQLを書くのに悩むよりはずっと良いかと。

すいません、今日は2つだけで。
小出しにするつもりはないんですけどね。
と、いうよりもこの2つだけが強烈にハマるんです。ほかの関数は案外素直ですよ。週とか月とかの関数って帳票作るのにすごい便利ですから。使っていくうちに『そうそう、そういうの欲しかった！』って思うことが多いです。きっとBigQuery作ってる人は、『これよく使うから関数にしちゃえ』的なノリだったんだろうなぁと思ったりします。そんな妄想を抱きながら毎日使っています。

ではまた。
RubyからRSpecを実行する


RSpecをシェルからではなくRubyから実行したいときのやり方を調べた。
`rspec`コマンドは`RSpec::Core::Runner.run`を呼び出しているのでそれを使えばいい。

RSpecのバージョン: 3.0

```ruby
require 'rspec'

# 引数の配列を渡す
RSpec::Core::Runner.run(['spec.rb'])
```

```ruby:spec.rb
describe 'addition' do
  it 'adds 2 values' do
    expect(1 + 2).to eq(3)
  end
end
```

カスタムformatterを使う
========

[カスタムformatter](https://www.relishapp.com/rspec/rspec-core/docs/formatters/custom-formatters)を実装してその場で使うこともできる。

```ruby
require 'rspec'

class MyFormatter
  RSpec::Core::Formatters.register self, :example_passed

  def initialize(output)
  end

  def example_passed(notification)
    puts "passed: #{notification.example.description}"
  end
end

RSpec::Core::Runner.run(['spec.rb', '--format', 'MyFormatter'])
```

複数回実行する
========

複数回実行するときは`RSpec.reset`すればよいようだ。

```ruby
require 'rspec'

RSpec::Core::Runner.run(['spec.rb'])
RSpec.reset
RSpec::Core::Runner.run(['spec.rb'])
```

参考
========
* [Execute Rspec from Ruby - Stack Overflow](http://stackoverflow.com/questions/6986319/execute-rspec-from-ruby)
* [custom formatters - Formatters - RSpec Core - RSpec - Relish](https://www.relishapp.com/rspec/rspec-core/docs/formatters/custom-formatters)
* [rspec/rspec-core](https://github.com/rspec/rspec-core)
yo webappにてエラーが出たときの対処方法


## YEOMANの標準の骨組みを作ろうとして
```shell-session
$ yo webapp
```

を実行したところ、以下のようなエラーが大量に・・・

```shell-session
npm WARN package.json my-yo-project@0.0.0 No description
npm WARN package.json my-yo-project@0.0.0 No repository field.
npm WARN package.json my-yo-project@0.0.0 No README data
npm ERR! Error: EACCES, mkdir '/Users/XXXXXXXXXXX/.npm/uglify-js/2.4.15'e? (Y/n) -
npm ERR!  { [Error: EACCES, mkdir '/Users/XXXXXXXXXXX/.npm/uglify-js/2.4.15']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/XXXXXXXXXXX/.npm/uglify-js/2.4.15',
npm ERR!   parent: 'grunt-contrib-uglify' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 13.3.0
npm ERR! command "node" "/usr/local/bin/npm" "install"
npm ERR! cwd /Users/XXXXXXXXXXX/work/03_Develop/YEOMAN/my-yo-project
npm ERR! node -v v0.10.12
npm ERR! npm -v 1.4.23
npm ERR! path /Users/XXXXXXXXXXX/.npm/uglify-js/2.4.15
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, mkdir '/Users/XXXXXXXXXXX/.npm/uglify-js/2.4.15'
npm ERR! Error: ENOENT, utime '/Users/XXXXXXXXXXX/work/03_Develop/YEOMAN/my-yo-project/node_modules/grunt-mocha/node_modules/grunt-lib-phantomjs/node_modules/temporary/node_modules/package/.travis.yml'
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>
:
:
```

今日もまたエラーかい・・・と。ちょっと心折られそうになりながらも、エラーを解決して一歩前進していきたいと思う今日この頃。。。

## 落ち着いてエラーの箇所を見てみると
エラーの内容を見てみると、/Users/XXXXXXXXXXX/.npm/配下にディレクトリを作ろうとしてパーミッションエラーになっている様子。

この`.npm`フォルダというのは、`npm`のキャッシュフォルダとして使用されているようで、自動的に内容が作成されるみたい。

しかも、`.npm`ディレクトリ内に作成されるディレクトリがroot権限のものだったり、ユーザ権限のものだったりと、まぁ入り乱れている様子。。。

## そして今日も調べてみる。
すると、[ここ](http://stackoverflow.com/questions/16151018/npm-throws-error-without-sudo)のサイトに同じような事象に遭遇した人が。。。

ここの遭遇した人の対処に倣って

```shell-session
$ sudo chown -R `whoami` ~/.npm
```

を実行する事で、`.npm`ディレクトリ以下全てユーザ権限のものに置き換わり、結果として`$ yo webapp`コマンドが正常に実行できた。
Dockerメモその2 -Buildできない-



##現象
docker buildが出来ない。エラーメッセージに以下のように出る。

```bash:
$ docker build -t test .
Sending build context to Docker daemon
2014/08/04 00:00:00 Error write /tmp/docker-build860858978/Dockerfile: no space left on device
```

##原因
前回に引き続き容量不足。特に今回は/tmp用のディスクがいっぱいになってました。

##解決法1
空き容量がなくなってしまったので/tmp以下いらないファイルを消しましょう。
##解決法2
temporary用のディレクトリを/tmpから別ディスクに変更します。
dockerのパラメータとしてTMPDIRを設定します。

```bash:/etc/sysconfig/docker
export TMPDIR=/mnt/disk2/tmp
```
その後、dockerを再起動します。
Ubuntu 14.04 Desktop 64bit on VMware Playerでの「内部エラー」irqbalance編

#エラーメッセージ
「内部エラーが発生しました」(System program problem detected)

![Screenshot from 2014-08-04 22_15_10.png](https://qiita-image-store.s3.amazonaws.com/0/35698/6d225bce-6c7c-90b5-512e-ce3d35bb6d9d.png)
![Screenshot from 2014-08-04 22_13_58.png](https://qiita-image-store.s3.amazonaws.com/0/35698/90d0d5f3-4a36-7f32-10a1-309ee2005ce0.png)

#エラーレポート内メッセージ
/var/crash/_usr_sbin_irqbalance.0.crash

`irqbalance crashed with SIGSEGV in __libc_start_main`

/var/log/syslog

`balancing is ineffective on systems with a single cache domain`

#原因
CPUを２つ割り当てしていたところ、irqbalanceが正常に動作せずエラーが発生

#対処
とりあえず再起動を行ってみる。
直らなかったらおとなしくCPUの割り当てを１つにする。
Mac版AndroidStudioが立ち上がらないワナ

自分はJavaは1.8が入ってたので見事にハマりました。
こんなんワナじゃないとか言われるかもしれないけど、自分にとってはワナだったんだもん仕方ない。

人生初のAndroidStudioに文字通りウキウキしながら

```bash:bash
$ brew cask install android-studio-bundle
```

でインスコし、Launchpadにできたアイコンみてニヤニヤしつつドキドキの初起動。

初起動。

初起動。。。

・・・

起動しない。
起動しないよママン。

いつもならピョンピョンはねて自己主張するはずのドックアイコンにも姿を現さない。
コンソールアプリで検索窓に `android` って入れてフィルタってみると、

```
2014/08/04 22:09:35.675 com.apple.launchd.peruser.501[274]: (com.google.android.studio.44736[3443]) Exited with code: 1
```

![スクリーンショット 2014-08-04 22.09.47.png](https://qiita-image-store.s3.amazonaws.com/0/34880/1352a926-a77c-fced-2f27-474288ca6df2.png)

こんな単純なログしか出さずに落ちやがってる。

仕方ないのでターミナルから直接起動しようとしても

```bash:bash
$ cd /opt/homebrew-cask/Caskroom/android-studio-bundle/0.8.0\ build-135.1245622/ #homebrew-caskのｲﾝｽｺ先
$ open Android\ Studio.app #ｵﾌﾟｰｿ
LSOpenURLsWithRole() failed with error -10810 for the file /opt/homebrew-cask/Caskroom/android-studio-bundle/0.8.0 build-135.1245622/Android Studio.app.
```

って出てダメ。

あれこれ悩んだり調べたりした結果、Mac系アプリの基本設定集である `Info.plist` にたどり着く。
そういえば昔アイフォーンアプリ作ったときに見た覚えあるなぁ・・・。
早速アプリディレクトリに移動して見てみると

```bash:bash
$ cd Android\ Studio.app/Contents/
$ vim Info.plist
```

こんな設定値が。

```xml:Info.plist
      <key>JVMVersion</key>
      <string>1.6*</string>
```

さっそく `1.6*` -> `1.8*` に変更して再起動。

![スクリーンショット 2014-08-04 22.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/34880/f03d4755-c471-be9c-3ccb-e7fb4753c7bf.png)

ｷﾏｼﾀﾜｰ

これでいつでもアプリ作れますね！
RuboCop | Style/WhileUntilModifier

# RuboCop | Style/WhileUntilModifier

## 概要

RuboCopの「Style/WhileUntilModifier」警告について。

while, until が1行80文字収まる場合に1行で記述しているかチェックする。
1行あたりの文字数は設定により変更可能。

## WhileUntilModifier

### 検証プログラム

~~~ruby:while_until_modifier.rb
def safe_while
  while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  end
end

def out_while
  while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  end
end

def safe_until
  until aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  end
end

def out_until
  until aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  end
end
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
WhileUntilModifier:
  MaxLineLength: 80

LineLength:
  Max: 120
~~~

~~~bash
$ rubocop while_until_modifier.rb
Inspecting 1 file
C

Offenses:

while_until_modifier.rb:2:3: C: Favor modifier while usage when having a single-line body.
  while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  ^^^^^
while_until_modifier.rb:14:3: C: Favor modifier until usage when having a single-line body.
  until aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  ^^^^^

1 file inspected, 2 offenses detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/while_until_modifier.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/metrics/while_until_modifier_spec.rb

* 長い文字列のチェック用のヘルパー呼び出しに利用

https://github.com/bbatsov/rubocop/blob/master/spec/support/statement_modifier_helper.rb

## ソースコードリーディング

様々なテストで利用する文字数チェック用の検証用コードを作成するために、ヘルパーメソッドを利用しています。
テストコードもDRYにする方針のようです。

https://github.com/bbatsov/rubocop/blob/master/spec/support/statement_modifier_helper.rb#L19-L31

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
【Android】Android StudioプロジェクトにVolleyを組み込む


## 1. はじめに

Qittaroを作る上で使ったライブラリの導入と使い方を紹介したいと思います。

というより、この記事はお世話になった記事の紹介になります。

その上で、自分で修正を加えた部分も合わせて紹介したいと思います。

## 2. Volleyの追加

[Androidプロジェクトを新規作成してVolleyが使えるようになるまで](http://kwmt27.net/index.php/2014/07/10/how-to-use-volley-library/)

このブログの記事を読んで、なんの問題もなく導入できました。

本当にありがとうございました。

## 3. ちょっと修正

まず自分のbuild.gradleです。

```groovy:build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "xyz.ryochin.qittaro"
        minSdkVersion 9
        targetSdkVersion 20
        versionCode 2
        versionName "1.0.1"
    }

    signingConfigs {
        debug {
        }
        release {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            signingConfig signingConfigs.release
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':modules:volley')
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:appcompat-v7:20.+'
}
```

注目は`compileSdkVersion 20`と`buildToolsVersion "20.0.0"`です。

この状態でのVolleryの`build.gradle`は以下のコードで特にエラーが出ずに済みました。

```groovy:modules/volley/build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.+'
    }
}

apply plugin: 'com.android.library'

android {
    compileSdkVersion 20
    buildToolsVersion = 20

    sourceSets {
        defaultConfig {
            testApplicationId 'com.android.volley.tests'
        }

        main {
            assets.srcDirs       = ['assets']
            res.srcDirs          = ['res']
            aidl.srcDirs         = ['src']
            resources.srcDirs    = ['src']
            renderscript.srcDirs = ['src']
            java.srcDirs         = ['src']
            manifest.srcFile 'AndroidManifest.xml'

        }

        instrumentTest.setRoot('tests')
        instrumentTest.java.srcDirs = ['tests/src']
    }
}
```

という感じになりました。

なので、同じバージョンでビルドしようとしている人がいるなら、これで大丈夫かと思います。

## 4. 使い方

Volleryは基本シングルトンで使います。

これは[Android working with Volley Library](http://www.androidhive.info/2014/05/android-working-with-volley-library-1/)にすべて書いてあります。

そして自分のコードはすべてこれのコピペになっています。

それで使えたので問題ないかと思います。

## 5. 終わりに

Volley、とっても使いやすいです。

わかりやすいので、ぜひ使って少しでもアプリリリースまでの時間を短くしてみてください！

[![GooglePlayStore](http://cdn-ak.f.st-hatena.com/images/fotolife/p/programmatore/20140804/20140804072124.png)](https://play.google.com/store/apps/details?id=xyz.ryochin.qittaro)

QiitaAPIを使ったアプリをリリースしましたので、良かったらダウンロードして使ってみてください！