OmniAICreator/Qiita-1.07M huggingface dataset:
立つハッカー、シェルを濁さず

**おことわり**

このTipsは不作法だとして異論が出るかもしれないが、私自身がよくやるのでここで公開してみる。それは一体何かというと……

# コマンドヒストリーが残るのイヤだ!

と思うことってよくないだろうか? 開発環境で、後に再利用することは到底ありえないくらい長ーいワンライナーを書いたり、あるいは `rm -rf *` みたいなキケンなコマンドを実行したりして、ログアウト後にそういうのを残したくない、と思うこと。

そんなアナタにオススメのTipsだと思う。

# 次のコマンドを実行すればOK

```sh:ヒストリーを残さないログアウト
$ kill -9 $$
```

変数 `$$` は、今ログインしているシェルのプロセスIDを持っている特殊な変数だ。これを強制終了すれば、ヒストリーファイルを更新する余地を与えずログアウトすることができる、というわけだ。

簡単でしょ。
MacにCobolを入れていじってみた話


今までの仕事とはぜんぜん違う言語を扱いそうなので、予め勉強してみようの巻。

## MacでCobolを使う準備

どうやらopen-cobol(gnu-cobol)というのを使えばいいというのを聞いたので、macで使うにはどうしたらいいか調べてみた。

http://www.opencobol.org/
http://jp.opencobol.org/

するとhomebrewに存在したので、それを使うことにする。

```
% brew info open-cobol
open-cobol: stable 1.1
http://www.opencobol.org/
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/open-cobol.rb
==> Dependencies
Required: gmp, berkeley-db
```

インストールは通常通りこんな感じで。

```
% brew install open-cobol
==> Installing dependencies for open-cobol: gmp, berkeley-db
==> Installing open-cobol dependency: gmp
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/gmp-6.0.0a.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring gmp-6.0.0a.mavericks.bottle.tar.gz
  /usr/local/Cellar/gmp/6.0.0a: 15 files, 3.2M
==> Installing open-cobol dependency: berkeley-db
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/berkeley-db-5.3.28.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring berkeley-db-5.3.28.mavericks.bottle.tar.gz
  /usr/local/Cellar/berkeley-db/5.3.28: 5271 files, 105M
==> Installing open-cobol
==> Downloading https://downloads.sourceforge.net/project/open-cobol/open-cobol/1.1/open-cobol-1.1.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/open-cobol/1.1 --infodir=/usr/local/Cellar/open-cobol/1.1/share/info
==> make install
  /usr/local/Cellar/open-cobol/1.1: 35 files, 1.1M, built in 27 seconds
```

## HelloWorldしてみる

http://dotinstall.com/lessons/basic_cobol
これを参考にやってみた。

```
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       PROCEDURE DIVISION.
       MAIN SECTION.
           DISPLAY 'HELLO WORLD!!'.
           STOP RUN.
```

こんな感じのコードを書いてコンパイル。
コマンドは`cobc`で、実行形式のファイルを作るオプション`-x`と自由書式を使うオプション`--free`を指定する。

```
% cobc -x --free hello.cob
% ls
hello*     hello.cob
```

`hello`が実行ファイルなので、それを実行してみる。

```
% ./hello
HELLO WORLD!!
```

でたー。

## Cobolの印象

コード内にも`PROCEDURE`と入っているだけあって、PLSQLなどストアドプロシージャなどと似ている印象。
昔は手書きでコーディングしていたなどと説明あったけど、信じられない。

正直これをかなりの行数を読まないといけないとなると、やや不安。
でも、知らない言語とか学べるのは楽しいでしょう！
がんばろう。
VPS環境でLaravelをセットアップしてみた。

今更ですが、VPS環境でLaravelをセットアップしてみました。タイトルに「VPS」とありますがVPS関係ありませんし、Laravelがどうこうと言うよりはnginxの設定でやたら苦労したので備忘録も兼ねてまとめます。

#環境
OS: Ubuntu 14.04.1 LTS
WEBサーバ: nginx 1.6.1
PHP: PHP 5.5.9
PHPフレームワーク: Laravel Framework 4.2.8

#準備
基本的なところは省略します。
Linuxのセットアップが終わったら、apt-getで次のソフトウェアをインストールします。

* Vim(Vimに限らずお好きなエディタを使うといいと思います)
* php5-fpm
* php5-cli
* php5-mcrypt

#nginxのインストール
nginxは公式のリポジトリを使ってインストールします。

/etc/apt/source.listに次の行を追加します。

```
deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx
```

保存して、PGP公開鍵を追加しましょう。

```
wget http://nginx.org/keys/nginx_signing.key
sudo cat nginx_signing.key | apt-key add -
```

apt-getでnginxをインストールしましょう(updateを忘れずに)。

```
sudo apt-get update
sudo apt-get install nginx
```

以上で完了です。
あとは念のため、Apacheが動いている場合はポートを専有してしまうため停止させましょう。

```
px aux | grep apache
（Apacheが動いていたら・・・）
sudo service apache stop (あるいは、 sudo /etc/init.d/apache2 stop)
```

ただ、これでは再起動した時にApacheが起動してしまうので、正しくはsysv-rc-confなどを使ってApacheのデーモンを無効化しましょう。

以上で、nginxが動いていることを確認できるはずです。お使いの環境に応じてブラウザからアクセスしてみましょう（e.g: `127.0.0.1`, `localhost`）。
ブラウザに「Welcome to nginx！」と表示されれば成功です。

#ComposerのセットアップとLaravelのダウンロード

nginxのインストールが完了したら、次にcomposerをダウンロードします。

```
curl -sS https://getcomposer.org/installer | php
```

/bin以下に移動させて、コマンドとして認識させます。

```
sudo mv composer.phar /usr/local/bin/composer
```

早速、Laravelをダウンロードします(`/var/www/laravel`は適当に置き換えてください)。

```
sudo composer create-project laravel/laravel /var/www/laravel
```

以上で、Laravelのダウンロードが完了しました。

#nginxの設定
Laravelのインストールが完了したので、いよいよ動かせるようにしましょう。
基本的には以下nginxの設定をいじることでLaravelが動かせるようになります。

まず、nginxはデフォルトではユーザ`www-data`権限で実行されます。
そこで、/var/www/laravel以下の権限も以下の様に書き換える必要があります。

```
sudo chown -R :www-data /var/www/laravel
```

次に、nginxの設定ファイルをいじります。

```
sudo vim /etc/nginx/conf.d/default.conf
```

と入力すると、設定ファイルが開きますので以下のように書き換えます(一部不要な箇所は省略)。

```
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/laravel/public;
        index  index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/laravel/public/$fastcgi_script_name;
        include        /etc/nginx/fastcgi_params;
    }
}
```

保存して、php5-fpmとnginxを再起動します。
最後に、app/storage以下への権限が必要なようですので、そちらを書き換えます。

```
sudo chmod -R 777 /var/www/laravel/app/storage/
```

先ほどと同じようにブラウザから、`/var/www/laravel/`にアクセスしてみましょう。

![Screen Shot 2014-08-31 at 10.24.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/29152/e89ec2e1-2c35-9d38-687c-730047c3a1c8.png)

このような表示が出れば作業完了です。
【読書】神話のマネジメント

Amazonより

●著者初の中小企業・起業家向けマネジメント本が登場
「マーケター神田昌典が、マネジメント本!?」
そう思われた方も多いはず。
しかし、経営コンサルタントとして
稼げば稼ぐほど生じる、さまざまな問題を抱える
多くの経営者・起業家と接してきた。
しかも、その問題は同じようなパターン、
同じようなタイミングで現れることを発見した。

なぜなのか?

この本は、著者が答えとしてたどり着いた、
事業を成長させるうえで避けては通れない、
問題の本質を解き明かしていく。


#なぜ「神話のマネジメント」なのか

この本はある尊敬する人から借りたもの。

最初に借りたときに、**なんでこんなタイトルなんだろう・・・。**

って思った訳ですよ、

神話って！！！

ゼウスとかそっち系か？！と身構えて、読んでいました。

なるほど。。。

会社の経営自体を神話に例えているのね、と

とても簡単に言うと少年ジャンプにも置き換えることができますね

つまり、経営には「起承転結」みたいのがあって、それが神話の構造に似ていますねっていうことから

この本のタイトルになったです。

内容はというと、泥臭いようだけど、中小企業の経営者が衝突するであろう問題、それをどう乗り越えるべきなのかが書いてあります

「もし自分が経営者になったら」、「今の雇用者（経営者のフォロワー）として」なにをするべきなのか考える一冊だったと思います


以上、で終わりますwwwwww
【読書】暗黒のシステムインテグレーション

Amazonより・・・。

 『システム管理者の眠れない夜』が、素人に苦しめられるシステム管理者の悲哀を描いたのに対して、こちらは顧客に苦しめられるシステムインテグレーターやその下請けといった、プロ対プロのやりとりが主題となっている。ジョークを挟みながら軽いタッチで話が進められているが、内容は、決して笑えない。

   サービスの質の低下を招く下請け依存体質、顧客がITにうといのをいいことに責任をなすりつけるシステム会社、高邁な理想とはかけ離れ、単なる金儲けと化した認定技術者試験制度、理不尽な要求を突きつける官公庁や銀行…。マスコミ報道では決して知ることのできない、理不尽なIT業界の裏事情を明かした、貴重なドキュメントである。

   決して失敗の許されないシステム統合、万が一にも漏れてはいけない個人情報、絶対に消してはいけない貴重なデータ…。本書を読む限り、これらは非常に脆弱なしくみによって支えられているようである。業界人よりもむしろ、これらの業者に仕事を委託している企業経営者やビジネスパーソンにこそ、読んで欲しい1冊である。（土井英司）


ほんとにちょっとギャグっぽい小説みたいに書いてあるこの本。

##最初に読んだ感想は、、、

#ふーん。すごい世界だなぁ（他人事）

と、思ってしまった。

それはなぜかというと・・・

「自分に全くの実感がないから」というのが、一番のように感じます。

ただ、この本から学ぶことができたのは、「エンジニアの大変さ」です。

自分ももっと本気になっていかなければいけないなぁと思いました。
Jbuilderのpartialを使ってDRYにjsonを書く


jbuilderを使っていると、各アクションで重複する情報を扱わなければならない場面がしばしばある。そういうとき、`partial!`でテンプレートを呼び出す。

``` ruby:_article.json.jbuilder
json.extract! article, :id, :amount
json.url article_url(article)
```

``` ruby:index.json.jbuilder
# @articles = Article.all
json.articles @articles do |article|
  json.partial! article
end
```

``` ruby:show.json.jbuilder
json.article do
  json.partial! @article
end
```

すっきり。
phpで「配列」〜 array構文の使い方


##配列の書き方と要素の取り出し方。
以下の様に書いた場合の意味は
「azumanga」という変数に「"ちよ"〜"とも"」のいつもの６人を格納して、「0番目の"ちよ"を表示する」という文になります。

```php


<html>
<head>
</head>
<body>
		
<?php  
$azumanga = array("ちよ", "かぐら", "おおさか", "さかき", "よみ", "とも");

echo $azumanga[0];

?>

</body>

</html>

```

以下、表示結果↓
![php_array.png](https://qiita-image-store.s3.amazonaws.com/0/35975/a5618b8b-f000-2425-89cb-6e37aef579e4.png "php_array.png")
シェルを再起動させる簡単な方法

開発作業では、ターミナルでシェルってよく使っていますよねー♪　
僕は **zsh** を使っています！！ シェルは色々カスタマイズしているんですが、通常シェルの設定をした後はファイルを読み込み直したりします。
やり方としては大体以下の感じだと思います。

1. sourceコマンドで **.zshrc** などを読み込む
2. シェルを再ログイン(再起動)して読み込む

今回は **2. シェルの再ログイン** について書いてみます。


シェルの再起動方法
------------------------------------

**一旦 exit してターミナルを立ち上げなおす** ということをしていましたが、なんかだるいなーということで調べてみるとありました！！
以下のコマンドを実行することで、ログインシェルから起動したようにシェルを再起動できます！！

```
exec $SHELL -l
```

aliasを作ると便利かもしれません。

```
alias relogin='exec $SHELL -l'
```

 `relogin` というコマンドで実行できます。


以上！ということで終わりでもいいですが、`exec $SHELL -l` の意味がよくわからない。。。
シェルの情弱な僕としてはどういう意味なのか気になったのでちょっと調べてみました。

execコマンドについて
----------------------------------

[UNIXの部屋 コマンド検索:exec (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?exec) にある説明がとてもわかり易かったので引用します。 **exec** を使った場合と使わない場合の意味が以下のように書かれていました。
`exec ls` のコマンドをサンプルに解説されています。

- **exec** を使わない場合に関しては以下のとおり書かれています。

> - システムコール fork(2) を呼び、子プロセスを生成する。
- 子プロセスは ls を exec(2) する。
- 親プロセスであるシェルは、ls の実行が完了するのを待つ (wait する)。

- そして **exec** を使った場合は

> シェルは fork(2) せず、いきなり ls コマンドを exec(2) する (シェルの内部コマンド exec(1) を実行すると、内部でシステムコール exec(2) が呼ばれるということ)。シェルのプロセス情報は ls のプロセスの情報で上書きされる。なお、子プロセスは生成されないので、シェルと ls のプロセス ID は同じになる。

要するに通常の **exec** を使わないコマンドは、コマンド実行時に **子プロセス** を起動するということのようです。

実際に `exec ls` を試してみると、起動中のターミナルのプロセス上で `ls` が実行され一瞬出力が見えたと思うと、すぐにターミナルのプロセスごと終了してしまいます！


要するに `exec $SHELL -l` の意味は
------------------------------------

`$SHELL -l` の `-l` オプションは **zsh** のヘルプを見ると以下の感じになっていました。
シェルをログインシェルで起動するという感じでしょうか！？

```
-l    equivalent to --login
```

**ということで、、**

**環境変数 $SHELL をログインシェルから起動させる** ことを **exec** するという意味となり、ターミナルが再起動できるようになります。
ruby の 文字列の連接

# 連接について

意外なことに、ruby には C言語と同じような文法の、文字列の連接がある。

```ruby
p( "x" "Y" ) #=> "xY"
p( "x" 'Y' ) #=> "xY"
p( 'x' 'Y' ) #=> "xY"
```

`String#+` はどうあがいてもメソッド呼び出しになる（と思う）ので、実行時の効率という点で、文字列の連接は意味がある。その辺りは Java や（たぶん）perl とは事情が違う。

で。

連接の結果がリテラルになるのであって連接自体が何かの操作というわけではないので、括弧は書けない。

```ruby
p( ( "x" )"Y" ) #=> SyntaxError: unexpected ')', 以下略
```

この辺りも C/C++ と同様。

また、連接は演算ではないので、どんな演算子よりも優先順位が高い。

```ruby
p( ! "x" "y" ) #=> false
p( "x" "y".size ) #=> 2
p( { "x" "y"=>"a" "b" } ) #=> {"xy"=>"ab"}
```

この点も C/C++ と同じ。

# いろいろなリテラル

C/C++ と違って、ruby には色々な文字列がある。

```ruby
p( ?x 'Y' ) #=> "xY"
p( 'x' ?Y ) #=> SyntaxError: unexpected ')', expecting ':'
p( %Q!x! "Y" ) #=> "xY"
p( 'x' %Q!Y! ) #=> SyntaxError: unexpected tFID,(以下略)
```

という感じで、順序に依存する。
文字列の後に `?` や `%` があると、演算子に見えてしまうんだとおもう。

ヒアドキュメントも同様

```ruby
p( <<"HOGE" "Y" ) #=> "x\nY"
x
HOGE

p( <<HOGE "Y" ) #=> "x\nY"
x
HOGE

p( "x" <<"HOGE" ) #=> "xHOGE"
Y
HOGE
#=> Y と HOGE で、NameError: uninitialized constant

p( "x" <<HOGE ) #=> NameError: uninitialized constant HOGE
Y
HOGE
#=> Y と HOGE で、NameError: uninitialized constant
```

# Groovy の場合

ちなみに。
groovy では文字列の連接のように見えることを書くとメソッド呼び出しになる。

```groovy
"print" "x" // 「x」を出力
```

# Python の場合

ciel さんのお陰で python も連接があるとわかったので調査。

```python
#coding:utf-8
from pprint import pprint

# ダブルクオート・シングルクオート・三連引用符は区別せず連接する
pprint( "x" "Y" ) #=> 'xY'
pprint( "x" 'Y' ) #=> 'xY'
pprint( "x" """Y""" ) #=> 'xY'
pprint( """x""" 'Y' ) #=> 'xY'
pprint( '''x''' """Y""" ) #=> 'xY'

# prefix の u は、どれかひとつについていれば有効。
# 全部に必要な C/C++ とは異なる。
pprint( u'x' u'Y' ) #=>u'xY'
pprint( u'x' 'Y' ) #=>u'xY'
pprint( 'x' u'Y' ) #=>u'xY'
pprint( u'x' Ur'Y' ) #=>u'xY'
pprint( 'a' "b" '''c''' """d""" u'e' "f" '''g''' """i""" ) #=>u'abcdefgi'

# prefix の R は、ついているものだけについて有効。
# C++11 の R と同じ動作だと思う。
pprint( '\x78' '\x59' ) #=>'xY'
pprint( R'\x78' '\x59' ) #=>'\\x78Y'
pprint( '\x78' R'\x59' ) #=>'x\\x59'
pprint( uR'\x78' R'\x59' ) #=>u'\\x78\\x59'
pprint( r'\x78' u'\x59' ) #=>u'\\x78Y'
```

そもそも python に文字列の連接があるのが意外だったんだけど、
prefix の `u` がどれかひとつについていれば良いというのはさらに意外。

# D言語の場合

D言語は C/C++ の強い影響下にあるのでどうせ連接もあるだろうと思って調べたら、やっぱりあった。
でも、どうせ C/C++ と同じルールだろうと思ったら、ちょっと違っていた。
詳しくは
http://www.kmonos.net/alang/d/lex.html
を参照のこと。

大事なところを引用しておくと：

> 演算子 ~ でつなげられているか、 あるいは単純に並べて書かれている文字列どうしは結合されます：

とのこと。
でも、`~` でつなげるのと空白でつなげるのでは違いがあり、

```D
  writeln("Hel" "lo W" "orld!".length); //=> 12
  writeln("Hel"~"lo W"~"orld!".length); //=> エラー
```

となる。


緩募：文字列の連接のある言語( C/C++/ruby/python/D 以外で )

# 参考記事

tbpgr さんの
「Ruby | 文字列リテラル同士の標準的な結合方法と標準的ではない結合方法」
http://qiita.com/tbpgr/items/08014f867f7d8cc1200f
Ruby | 文字列リテラル同士の標準的な結合方法と標準的ではない結合方法

# Ruby | 文字列リテラル同士の標準的な結合方法と標準的ではない結合方法

## 概要
文字列リテラル同士の標準的な結合方法と標準的ではない結合方法について。
きっかけは、Twitterで

~~~ruby
"a" "b"
~~~

が文字列結合になる、というつぶやきを見たことです。
1年以上Rubyを使っていますが全く知りませんでした。

## サンプルコード

~~~
# 標準的な文字列結合
text = "a" + "b"
puts text

# String#<<、による文字列結合
text = "a"<<"b"
puts text

# String#<<、による文字列結合（ASCII Code）
text = "a"<<98
puts text

# String#concat、による文字列結合
text = "a".concat("b")
puts text

# String#concat、による文字列結合（ASCII Code）
text = "a".concat(98)
puts text

# -----------------------------------------------
# ここからは普段あまり利用する機会のない連結方法
# -----------------------------------------------

# スペース区切りによる文字列結合(タブでも可)
text = "a" "b"
puts text

# スペース区切りによる文字列結合（シングルクォートダブルクォート混在）
text = "a" 'b'
puts text

# 区切りなし、による文字列結合
text = "a""b"
puts text

# 区切りなし、による文字列結合（シングルクォートダブルクォート混在）
text = "a"'b'
puts text
~~~

※そもそも想定されていない文法になっているためか、シンタックスハイライトがうまく動作しないので、
無効にしました。

## 出力
~~~
ab
ab
ab
ab
ab
ab
ab
ab
ab
~~~

## 関連記事
Nabetani さんの 「ruby の 文字列の連接」
http://qiita.com/Nabetani/items/29a82811e95f80edbb27
Macに明日の天気予報をアナウンスしてもらう

# 概要
RaspberryPiにスピーカーを繋げて、天気予報を喋ってもらう用のスクリプトを、とりあえずMacで書いたのでメモ。`say`コマンドで話してもらう。

天気予報を取得してくるのには、[Weather Hacks - livedoor 天気情報](http://weather.livedoor.com/weather_hacks/webservice)のAPIを利用する。単純な作りなので、とりあえずこちらを採用。今回は利用しなかったが、[OpenWeatherMap](http://openweathermap.org/)の利用も検討した。こちらも良さ気。

# sayコマンドを日本語化
`say`はデフォルトだとアメリカ人の声に設定されており、`$ say 'ほげほげ'`などとTerminalで実行しても、なにも言ってくれない。

なので、「システム環境設定」 -> 「音声入力と読み上げ」 -> 「テキスト読み上げ」 に行き、「システムの声」セレクトボックス中の「カスタマイズ」を選択。各国の人のボイスがダウンロードできる。日本語には「Kyoko」（女）と「Otoya」（男）という2種類が選択できるので、前者を選択。ダウンロードが完了すれば、`say`で日本語が読める（逆に英語が読めなくなる...）

# スクリプト
http://weather.livedoor.com/forecast/webservice/json/v1?city=130010
こちらにアクセスすれば分かるが、[Weather Hacks](http://weather.livedoor.com/weather_hacks/webservice)のAPIからは、今日・明日・明後日の天気や、詳細な天気の説明（ニュースで読まれるようなやつ）が取得できる。
これをMacに発音させるだけの簡単なコードです。

```rb:say_weather.rb
require 'net/http'
require 'json'

# 東京都 東京 の天気を取得、他の地域の場合はパラメータcityの値を変える
uri = URI('http://weather.livedoor.com/forecast/webservice/json/v1?city=130010')
weather_data = JSON.parse(Net::HTTP.get(uri))

tomorrow_forecast = weather_data['forecasts'][1]
forecast_message = "#{tomorrow_forecast['dateLabel']}の天気は#{tomorrow_forecast['telop']}です。" \
  "最高気温は#{tomorrow_forecast['temperature']['max']['celsius']}度、" \
  "最低気温は#{tomorrow_forecast['temperature']['min']['celsius']}度です。"
  
description = weather_data['description']['text'].gsub(/\n/, '')

`say "#{forecast_message}" #{description}`
```

```
$ ruby say_weather.rb
# 声が流れる
```

Macを起動してないといけないけど、cronに登録したりすれば定時予報に。

RaspberryPiで利用するときは、最終行を変えなきゃいけないですね。
2003/04 - 2014/08 の間に増えたLinuxコマンド（GNU coreutils）

# はじめに

最近、`timeout` コマンドを教えてもらいました。
こんな便利なコマンドがあったんですね。
最近できたコマンドだよ、と教えていただきましたが、他にもそういった最近できたコマンドがあるのではないか、と思って調べてみました。

# 調査方法

http://ftp.gnu.org/gnu/coreutils/ から、coreutils-5.0 と、coreutils-8.23 をダウンロードし、AUTHORS ファイルの中身を比較しました。

本当は、make して作られたバイナリファイルの数を比較したかったのですが、
自分の環境だとcoreutils-5.0がコンパイルできなかったので早々に諦めました。

# 結果

|コマンド|概要(man より)|備考|
|:------|:------------|:------------|
|arch|```print machine hardware name (same as uname -m)```||
|base64|```base64 encode/decode data and print to standard output```|base64方式によるエンコード/デコード|
|chcon|```change file security context```|SELinuxコンテキストを変更する|
|dir|```list directory contents```||
|groups|```print the groups a user is in```||
|mktemp|```create a temporary file or directory```||
|nohup|```run a command immune to hangups, with output to a non-tty```|ssh との組み合わせで良く使われる|
|nproc|```print the number of processing units available```||
|numfmt|```Convert numbers from/to human-readable strings```|`numfmt --to=iec 2048` や <br> `numfmt --from=iec 2G` などでバイト計算に使えそう|
|readlink|```print resolved symbolic links or canonical file names```|``readlink -f `which java` `` などと良く使います|
|realpath|```return the canonicalized absolute pathname```|コマンドではなく関数のようです|
|runcon|```run command with specified security context```||
|sha1sum|```compute and check SHA1 message digest```||
|sha224sum|```compute and check SHA224 message digest```||
|sha256sum|```compute and check SHA256 message digest```||
|sha384sum|```compute and check SHA384 message digest```||
|sha512sum|```compute and check SHA512 message digest```||
|shuf|```generate random permutations```|入力行ランダムに並び替える|
|stdbuf|```Run COMMAND, with modified buffering operations for its standard streams.```|使用例: [stdbufコマンドを使用してコマンドの標準出力にタイムスタンプを追加](http://qiita.com/yyamamot/items/60a0a007b0016da61b32)|
|timeout|```run a command with a time limit```||
|truncate|```shrink or extend the size of a file to the specified size```||
|vdir|```list directory contents```|`dir -l` や `ls -l` と同じ出力でした|

# まとめ

stdbuf は便利そうですね。使用例先のように、タイムスタンプを出力するときに使えそうです。
Swiftで既存のクラスに新たにプロパティを追加する方法

# Swiftで既存のクラスに新たにプロパティを追加する方法

Objective-Cでも使えていましたランタイムAPI(俗にいう黒魔術)を使う事で、Swiftでも動的にプロパティを追加することが可能です。

Runtime API Reference URL  
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

## 使用するランタイムAPIの関数

* objc_setAssociatedObject(object: AnyObject!, key: CConstVoidPointer, value: AnyObject!, policy: objc_AssociationPolicy)  
引数で受け取ったオブジェクトに対して、動的に引数のプロパティをセットします  
　  
【object : AnyObject!】  
動的にプロパティを追加したい対象オブジェクト  
　  
【key : CConstVoidPointer】  
プロパティにアクセスするためのセレクタのポインタ、Objective-Cと違い文字列をポインタにするとクラッシュ  します  
　    
【policy : objc_AssociationPolicy】  
UIntに変換して指定することで属性を指定します

* objc_getAssociatedObject(object: AnyObject!, key: CConstVoidPointer) -> AnyObject!  
引数で受け取ったオブジェクトから、動的に引数のプロパティを取得します  
　  
【object: AnyObject!】   
動的にプロパティを取得したい対象オブジェクト     
　  
【key : CConstVoidPointer】  
プロパティにアクセスするためのセレクタのポインタ、Objective-Cと違い文字列をポインタにするとクラッシュ  します  

## objc_AssociationPolicyについて

上記でも説明しましたがobjc_AssociationPolicyはUInt型に変換する必要があります。その理由としては定義を見れば分かります。

    typealias objc_AssociationPolicy = UInt

以下AssociationPolicyの種類

* OBJC_ASSOCIATION_ASSIGN
* OBJC_ASSOCIATION_RETAIN_NONATOMIC
* OBJC_ASSOCIATION_COPY_NONATOMIC
* OBJC_ASSOCIATION_RETAIN
* OBJC_ASSOCIATION_COPY

## 使用例

AクラスのオブジェクトにStringのプロパティである「hoge」を動的に追加してみます

```swift
class A {

  var hogeSelector = Selector("hoge")

  // プロパティを動的にセットします
  func setHoge(hoge : String) {
    objc_setAssociatedObject(
      self,
      &hogeSelector,
      hoge,
      UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
  }
  
  // プロパティを動的に取得します
  func hoge()->String! {
    if let hoge = objc_getAssociatedObject(
      self,
      &hogeSelector
      ) as? String
    {
      return hoge
    }
    return nil
  }
}

```

動的に追加したプロパティにアクセスします

```swift
var a = A()
a.setHoge("swift")
println( a.hoge() ) //-> swift
```

## おわりに

SwiftでもObjective-Cと全く同じランタイムAPIが用意されているため、他にもSwizzlingやClosureからのIMP生成などの処理も可能です。  
本来設計がしっかりしていれば使う事はないですが、この柔軟性こそがSwift(Objective-C)の特徴ではないでしょうか。
UIViewのビューとレイアウトを分離する「MOAViewLayout」

# MOAViewLayout

## MOAViewLayoutとは？

UIView を拡張したことで簡潔にレイアウト部分の実装を可能にしたiOS用のモジュールです。  
このモジュールでレイアウト部分を実装することにより、ビューとレイアウトの実装を分離することができます。

## ダウンロード

https://github.com/MO-AI/MOAViewLayout

## 使い方

### 1.ダウンロードした以下ファイルをプロジェクトに追加

* MOAViewLayout.swift
* UIView+MOAViewLayout.swift

### 2.MOAViewLayoutオブジェクトの実装

    let layout = MOAViewLayout()
    let barHeight : CGFloat = 40
    
    // ヘッダー部分のレイアウトを実装
    layout["header"] = {
        view, orientation in
        return CGRectMake(
            0,
            0,
            view.bounds.size.width,
            barHeight
        )
    }

    // フッター部分のレイアウトを実装
    layout["footer"] = {
        view, orientation in
        return CGRectMake(
            0,
            view.bounds.size.height-barHeight,
            view.bounds.size.width,
            barHeight
        )
    }

### 3.親のUIViewに3で実装したMOAViewLayoutを適用する

    parentView.setViewLayout(layout)

### 4.MOAViewLayoutを適用した親UIViewのsubviewにレイアウト用のIDを適用し、addSubviewする

    let headerView = UIView()
    headerView.setViewLayoutID("header")
    parentView.addSubview(headerView)
    
    let footerView = UIView()
    footerView.setViewLayoutID("footer")
    parentView.addSubview(footerView)

## 実行

以下のように subview に対してレイアウトIDを適用しただけでヘッダー／フッターのレイアウト領域が反映されていることが分かります。

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/M/MO-AI/20140624/20140624021501.png"  itemprop="image"></span></p>


回転にも対応

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/M/MO-AI/20140624/20140624021508.png"  itemprop="image"></span></p>

## 課題

* view.setViewLayout(layout)としていますが、本当は view.viewLayout = layout としたいです

## おわりに

モジュールとしての要望・意見・突っ込みありましたら、何でも受け付けますのでお待ちしてます。
pptpdがいつまでたっても起動しない時は設定ファイルの末尾改行を確認しよう



```
> sudo service pptpd start
Starting PPTP Daemon:
```
で止まってしまう時がある。
そんなときは `/var/log/syslog` のログを確認しよう。

```:/var/log/syslog
pptpd[***]: Long config file line ignored
```

のようなログがある時は、設定ファイル `/etc/pptpd.conf` のファイル末尾に空行が存在するか確認する。
どうやら設定ファイルの末尾に空行が無いとハングアップしてしまうらしい。

## おまけ
ハングアップしたプロセスがずっと残っていることがあるので、psやtopで固まっているpptpdが居ないか確認しておく。

## 参考
https://wiki.archlinux.org/index.php/PPTP_server#pptpd.5Bxxxxx.5D:_Long_config_file_line_ignored
Node.js ログまわり

自前でこったことをするわけでなければ log4js-node と node-config で。

- https://github.com/nomiddlename/log4js-node
- https://github.com/lorenwest/node-config

fluentd にログを送りつけたい場合は fluent-logger-node を使う。

https://github.com/fluent/fluent-logger-node

log4js を使ってログをはきつつ、環境ごとの設定を node-config できりわける。 node-config は &lt;environment&gt;.json という名前で環境ごとに設定を書けるみたい。開発用と本番用でログまわりの設定を変えてみる。

基本的に以下の 3 つのログをとることにするよ。

- アプリのシステムログ
- アクセスログ
- エラーログ

開発用ではすべてのレベルのログをコンソールにたれながす。

```json:config/development.json
{
  "log4js": {
    "level": "ALL",
    "configure": {
      "appenders": [
        {
          "category": "system",
          "type": "console"
        },
        {
          "category": "access",
          "type": "console"
        },
        {
          "category": "error",
          "type": "console"
        }
      ],
      "replaceConsole": true
    }
  }
}
```

本番用では info 以上のログだけをファイルに記録、 fluentd 経由でログサーバーに送る。

```json:config/production.json
{
  "log4js": {
    "level": "INFO",
    "configure": {
      "appenders": [
        {
          "category": "system",
          "type": "file",
          "filename": "logs/system.log"
        },
        {
          "category": "access",
          "type": "file",
          "filename": "logs/access.log"
        },
        {
          "category": "error",
          "type": "file",
          "filename": "logs/error.log"
        }
      ],
      "replaceConsole": true
    }
  },
  "fluentd": {
    "host": "192.168.50.120",
    "port": 24224,
    "timeout": 3.0
  }
}
```

で、こういう風に初期化する。モジュール化するのがいいかも。

```js:logger.js
var config = require('config');
var log4js = require('log4js');
log4js.configure(config.log4js.configure);

if (process.env.NODE_ENV === 'production') {
    var appender = require('fluent-logger').support.log4jsAppender('node', {
        host: config.fluentd.host,
        port: config.fluentd.port,
        timeout: config.fluentd.timeout
    });
    log4js.addAppender(appender);
}

var logger = {
    system: log4js.getLogger('system'),
    access: log4js.getLogger('access'),
    error: log4js.getLogger('error')
}
for (key in logger) {
    logger[key].setLevel(config.log4js.level);
}
```

使うときはこんなかんじで。

```js
logger.access.info({
    httpVersion: 1.1,
    httpMethod: 'GET',
    url: '/'
});
```
OS X 10.9でNokogiriのインストールエラーを解決

かなりハマったのでメモ。どなたかの参考になれば！

環境：
OS X 10.9.4
ruby 2.0.0p451("$ ruby -v")
homebrew 0.9.5("$ brew -v")


bundle installでエラー、個別にやっても失敗

```
$ gem install nokogiri
```


以下のエラーが発生。

```
An error occurred while installing nokogiri (1.6.0), 
and Bundler cannot continue.Make sure that gem install 
nokogiri -v '1.6.0' succeeds before 
bundling.
```


Nokogiriのサイトの手順に沿ってもエラー
（http://nokogiri.org/tutorials/installing_nokogiri.html）

```
$ brew install libxml2 libxslt
$ brew link libxml2 libxslt
$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
（※直接URLを叩いてtar.gzファイルをDLし、/usr/local/Cellar/libiconv/に置きました）
$ tar xvfz libiconv-1.13.1.tar.gz
$ cd libiconv-1.13.1
$ ./configure --prefix=/usr/local/Cellar/libiconv/1.13.1
$ make
$ sudo make install
$ sudo gem install nokogiri -- 
--with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib 
--with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28 
--with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include 
--with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib
```

以下のエラーが発生

```
checking for iconv_open() in iconv.h... yes
checking for iconv_open() in -liconv... no
checking for iconv_open() in -liconv... no
checking for libiconv_open() in iconv.h... no
checking for libiconv_open() in -liconv... no
checking for libiconv_open() in -liconv... no
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessarylibraries and/or headers.  Check the mkmf.log file for more details.  You mayneed configuration options.
```


iconv.hは認識されてるけど、iconv_open()でエラー！？mkmf.logを見たりしつつ、わわからないなりに色々と調べてみたが、とりあえずはこちらのコマンドで解決。
XcodeのCommand Line Toolsがインストールされてませんでした。。
単純なミスだけどなかなか気付けず、ハマってしまいました。

```
$ xcode-select --install
```


その後、先ほどのコマンドでNokogiriのインストールできました。

```
$ sudo gem install nokogiri -- 
--with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib 
--with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28 
--with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include 
--with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib
```
C# 条件付きコンパイルで動作を変える

一番よく使いそうなのはデバッグ時のみ実行するコードですね。
Debug.WriteLine メソッドは DEBUG 定数が定義されているときだけに実行されますし、Trace.WriteLine メソッドは TRACE 定数が定義されているときだけに実行されます。

![2014-08-31_181111.png](https://qiita-image-store.s3.amazonaws.com/0/52104/120b6181-19f8-dc64-fa3e-1116f4556f82.png)

自作の関数で同じことをしたい場合は Conditional 属性を使います。

```csharp
[Conditional("DEBUG")]
public class Hoge
{
]

public class Huga
{
    [Conditional("DEBUG")]
    private void Dump()
    {
    }
]
```

このようにクラスに付けたり、特定のメソッドだけに付けたりすることが出来ます。
属性に渡す定数が、条件コンパイル シンボルに含まれているかどうかで決るので、独自の MODE_A と MODE_B を定義して使い分けたりすることも可能です。

私が使ったケースを紹介します。
ある社内システムのデータをクラウドへ毎朝コピーするプログラムを作成しました。
運用を開始して一ヶ月後に、お客さんからエラーが発生したと聞いて現地で調査しました。
デバッグ実行で追いかけてみることにしましたが、その際にデータが更新されて再現しなくなってしまうと困るので、レコードの追加・更新・削除はいつでも無効化できるように、クラスに Conditional("DB_UPDATE") を付けておきました。
おかげでデバッグ実行するときに DB_UPDATE を削除するだけでコードを変更せずに動作を変更出来ました。

ほかにも効果的な使い方があったら教えてください(ﾟ∀ﾟ)ﾉ
iOSシミュレータの日本語フォント表示が変な場合の対処法


[Edit scheme]-[Run ???.app]を表示し、[Arguments Passed On Launch]に以下の値を追加すればＯＫ。

```
-AppleLanguages (ja)
```

![140831-0002.png](https://qiita-image-store.s3.amazonaws.com/0/24804/b49b1e16-e9cc-f2f2-ca25-1b82bf79962e.png "140831-0002.png")
Apache Cordova 環境準備


## インストール
Apache Cordovaを利用する環境をインストールをする手順をメモっておきます。（開発端末はMacOSXです）

```
brew install node
brew install ios-sim
brew install ant
npm install -g cordova
npm install -g ios-deploy
```

エミュレータを起動するために、Android SDKのandroid,adb コマンドにパスを通す。

### Android エミュレータの高速化
さすがに、Androidエミュレータが遅いのがつらいので、ARMをエミュレートしないですむようにします。

```android```でAndroid SDK Managerを起動し、Extras/Intel x86 Emulator Accelerator(HAXM installer)をインストールしておきます。Installedがでても実は、インストールされていないので、```$(Android-SDK-Install)/extras/intel/Hardware_Accelerated_Execution_Manager/intelHAXM_1.0.8.dmg``` を実行してインストールする必要があります。

インストール後、```android avd```で仮想デパイスマネージャを実行し、仮想デバイスを作成します。

その際にCPU/ABIにIntel Atom (x86)を作成し、必要に応じて、Use Host GPUをONににします。


## Cordova プロジェクトの作成と実行

テンプレートアプリを作成し、ios、androidでエミュレータを実行させます。

```
cordova create ngDemo org.takastudy.ngphonegap Demo
cordova platforms add ios
cordova emulate ios -d
cordova emulate ios
cordova emulate android
```

後は作っていけばいいのですが、ここまできて、AngularJSが使えるのかとはっと思ってしまい、方向変換することにしましたw
戸籍調査人問題について

『[エレガントな問題解決](http://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%AC%E3%83%B3%E3%83%88%E3%81%AA%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA-%E2%80%95%E6%9F%94%E8%BB%9F%E3%81%AA%E7%99%BA%E6%83%B3%E3%82%92%E5%BC%95%E3%81%8D%E5%87%BA%E3%81%99%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%A8%E6%8A%80-Paul-Zeitz/dp/4873114055)』の例1.1.3。

## 解けなかった理由
1. 完全に数学的な問題なのに、なぞなぞのように見えた。
2. 36を3つの正の整数に因数分解することを考えたが、やる前に全部列挙することを諦めてしまった。
3. 3つめのヒントの「~一番上の娘は~」はヒントになっていないと思う(双子の場合でも、どちらかが一番上の娘になる)。

## どうすれば解けたと思うか
1. 1つめのヒントからまず、3人の娘の年齢の組み合わせを列挙することが、答えに近づくことかもしれないとは気付いていたのだから、それをしてみるべきだった。できないと感じた理由は、一般的な場合の計算方法を見つけることにこだわったからであって、36を3つに分けるくらいならできたかもしれない。
2. 年齢の組み合わせがあれば、その後の会話がヒントになっていることに気付けたかもしれない(実際には気付けなかったし、ヒントでない、無駄な会話であるかもしれないとも思っていた)。
3. 「一番上の娘」がthe oldest daughterの訳だとして、1年以下の年齢差を無視するとしたら。つまり、双子が3人の娘に含まれていて(6, 6, 1)の場合、the oldest daughtersとしないといけないとしたら、これが3つめのヒントになる。これに気付いたら、答えを1つに絞れる。

## 娘の年齢の組み合わせを求める

長女の取りうる年齢は、36の約数の中で次女以上の年齢のものである。だからまず、
36の約数を全て求める。そのためにまず、36を素因数分解する。

```math
  36 = 2^2 \cdot 3^2
```

すると、36の約数は $(2 + 1) \cdot (2 + 1) = 9$個ある。

```math
\begin{aligned}
\left\{2^0 \cdot 3^0 , 2^1 \cdot 3^0 , 2^2 \cdot 3^0 , \right.\\
\left. 2^0 \cdot 3^1 , 2^1 \cdot 3^1 , 2^2 \cdot 3^1 , \right.\\
\left. 2^0 \cdot 3^2 , 2^1 \cdot 3^2 , 2^2 \cdot 3^2 , \right\}\\
= \{1, 2, 4, 3, 6, 12, 9, 18, 36\}
\end{aligned}
```

### 長女が36の場合

次女と三女の年齢の積は1なので$(\text{次女}, \text{三女}) = (1, 1)$の1通り。

### 長女が18の場合

次女と三女の年齢の積は2なので$(\text{次女}, \text{三女}) = (2, 1)$の1通り。

### 長女が12の場合

次女と三女の年齢の積は3なので$(\text{次女}, \text{三女}) = (3, 1)$の1通り。

### 長女が9の場合

次女と三女の年齢の積は4なので$(4, 1), (2, 2)$の2通り。

### 長女が6の場合

次女と三女の年齢の積は$6 = 2^1 \cdot 3^1 $なので$(6, 1), (3, 2)$の2通り。

### 長女が4の場合

次女と三女の年齢の積は$9 = 3^2$なので$(3, 3)$の1通り。他の積が9になる場合は、
次女が長女の年齢を超えるので除外される。

長女の年齢が4より小さい場合は、積を36にするために、次女の年齢が長女を超えてしまうので、
0通り。

以上より、3人の娘の取りうる年齢の組み合わせは以下の8通りのみ。

```math
\{(36, 1, 1), (18, 2, 1), (12, 3, 1), (9, 4, 1), (9, 2, 2), (6, 6, 1), (6, 3, 2), (4, 3, 3)\}
```

残りの2つのヒントを適応すれば、答えにたどり着く。
シェルスクリプトの実体が置かれているディレクトリを取得する

```
DIR=$(dirname $0)
```

とすると、シェルスクリプトがシンボリックリンクの場合、シンボリックリンクの置かれているパスを取得してしまいます。

このとき

```
DIR=$(dirname `realpath $0`)
```

とすると実体の置かれている場所を取得できます。
Goには三項演算子a?b:cはない ―― 代わりの書き方

Goには三項演算子?:は存在しない。Cの派生言語（C++とかJava）だと三項演算子はわりと頻繁に使われるものだと思う。三項演算子を使いたいところでGoではどう書けばいいのか戸惑うことがあると思うので、三項演算子の代わりの書き方を紹介したい。

```go
x := 0
if condition {
    x = 1
}
```

上記のコードは`x := condition ? 1 : 0`と同じだ。デフォルトの値がリテラルの数値や文字列などの計算にコストがかからないものであれば、上のパターンを使うのが普通だと思う。

もしデフォルトの値が関数呼び出しの結果などで、その値を得るコストが高い場合、デフォルト値を得てから再度上書きするのは無駄が多い。そういう場合には下のように書くしかない。

```go
var x XTtype
if condition {
    x = ifTrue()
} else {
    x = ifFalse()
}
```

5行になるのは残念だと思うかもしれないし、私も多少そう思うが、これがGoの書き方なので、この点については諦めるほうがよい。
jQueryと複数選択リストの勉強

jQueryをつかってselectタグで選択された値を取得する方法。

.val()で選択した値を取得できる。
.children(':selected').lengthで選択したリスト値の件数を取得できる。
.children(':selected').text()で選択したリスト値のラベルを取得できる。
<br/>
###画面
![スクリーンショット 2014-08-31 17.35.22.png](https://qiita-image-store.s3.amazonaws.com/0/8407/56406e56-34dd-9dd1-11ff-0e1e0e198f34.png)
<br/>
###Log
![スクリーンショット 2014-08-31 17.35.34.png](https://qiita-image-store.s3.amazonaws.com/0/8407/e6602094-f3a5-eefe-e06f-820d473f4870.png)
<br/>
###サンプルコード

```
console.log($('#users').val());
console.log($('#users').children(':selected').length);
console.log($('#users').children(':selected').text());
```
ElixirのEnumerablesとStreams


2015/08/06のmaster(v1.1.0-dev)で動作確認

## Enumerables

`Enumモジュール`を使う。

    > Enum.map([1, 2, 3], fn x -> x * 2 end)
    [2, 4, 6]
    > Enum.map(%{1 => 2, 3 => 4}, fn {k, v} -> k * v end)
    [2, 12]

    > Enum.map(1..3, fn x -> x * 2 end)
    [2, 4, 6]
    > Enum.reduce(1..3, 0, &+/2)
    6

[ドキュメント参照](http://elixir-lang.org/docs/master/elixir/Enum.html)

少し調べた感じでは、

* List
* Map
* Function
* GenEvent.Stream
* HashDict
* HashSet
* Range
* Stream

が[`Protocols`](http://elixir-lang.org/getting-started/protocols.html)を使って`Enumerable`を実装している。

## Enumerables -> Streams

Enumモジュールの殆どの関数はEnumerableを引数にとり、戻り値はlistを期待している。

    > odd? = &(rem(&1, 2) != 0)
    #Function<6.90072148/1 in :erl_eval.expr/5>
    > Enum.filter(1..3, odd?)
    [1, 3]

上記は、中間リストを生成している。

    > 1..100_000 |> Enum.map(&(&1 * 3)) |> Enum.filter(odd?) |> Enum.sum
    7500000000

上記の場合は、100_000のリストをEnum.mapに渡し、3倍したあと、Enum.filterで奇数のみ取得して、最後にEnum.sumを行っている。
Lazy operationsをサポートしているStreamモジュールを使うと以下のように書ける。

    > 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
    7500000000

上記は中間リストを生成する代わりに、ストリームを生成する。
毎回リストを作る事をしないので大量のデータを扱う場合、または無限な値を扱うのに適している。
実際に`Enum.map/Enum.filter`を`Stream.map/Stream.filter`に変えてみたけど、劇的には変わらなかった。
例が悪いのかな？？
と思ったけど、以下の場合は処理速度が全然違う。一つ目が _20秒_ 二つ目が _0.00008秒_

    > Enum.map(1..10_000_000, &(&1+1)) |> Enum.take(5)
    [2, 3, 4, 5, 6]
    > Stream.map(1..10_000_000, &(&1+1)) |> Enum.take(5)
    [2, 3, 4, 5, 6]


* `Streamモジュール`の殆どは、enumerableを引数のとり、streamデータ型を返す関数となっている。
* `Streamモジュール`は無限値(streamデータ型)を得る事が出来る関数が備わっている。
    * 例) `Stream.cycle/1`で得られるstreamをEnum.mapに渡すと無限ループする。

            > stream = Stream.cycle([1, 2, 3])
            #Function<44.83110278/2 in Stream.unfold/2>
            > Enum.take(stream, 10)
            [1, 2, 3, 1, 2, 3, 1, 2, 3, 1]
            > Enum.map stream, fn(x) -> x * x end
            結果が返ってこない。
            
あとは、

* `Stream.unfold/2`
* `Stream.resource/3`

など、色々な関数が存在する。使い方はドキュメントを見た方が早い。
あとは

    iex> h Stream.unfold
とかで調べる。あーでも`@spec`の情報が無いからドキュメント見た方がいいか。

他の使い方

    > Stream.map([1, 3, 5, 7], &(&1 + 1)) |> Enum.to_list
    [2, 4, 6, 8]


## 参考
* [Enumerables and Streams](http://elixir-lang.org/getting-started/enumerables-and-streams.html)
* [Elixir document(Stream)](http://elixir-lang.org/docs/stable/elixir/Stream.html)
* [Programming Elixir](https://pragprog.com/book/elixir/programming-elixir)
MacPortsでPHP用にImageMagickをインストールする


```shell
$ sudo port install php54-imagick
```

とやればいいのですが、これだとxorg関連のパッケージがガンガン入ってきます。


まずは

```shell
$ sudo port install ImageMagick -x11
```
として、xorgサポート無しでImageMagickをビルドします。

その後

```shell
$ sudo port install php54-imagick
```

とすれば、xorgなしでインストールされます。
Goの正規表現のよいところ

Goの正規表現はRuss Coxさんの書いたre2が元になっている。re2はよくできた正規表現エンジンなのだけど、一つほかの正規表現エンジンに見られる機能が欠けている。バックリファレンスがないのだ。

ほかの正規表現エンジンではカッコでキャプチャした文字列を番号を指定して正規表現中でもう一度使うことができて、/(\w+) \1/というようなパターンを書くことができる。このパターンは(\w+)にマッチするもの（たとえば単語）に続いて空白文字列があって、さらに()の内容と同じ文字列があること、という条件になる。たとえばこれは"foo foo"はこのパターンにマッチするけど（最初の"foo"が繰り返しているので）、"foo bar"はマッチしない（"foo"と"bar"は違うので）というわけだ。

バックリファレンスがないのは欠点に思えるが（実際に不便なときもないわけではないが）、しかしこれはGoの正規表現エンジンがほかの正規表現エンジンとは異なるアルゴリズムを採用しているために生じる副作用である。この機能だけを外すことによって得るものは大きいので、Goの正規表現エンジンは全体的にはほかの正規表現エンジンより大変よくできているといってよいと思う。

re2あるいはGoの正規表現エンジンの一番大きな特長は、入力が長くなったぶんだけしか（リニアにしか）実行時間が長くならないことだ。普通のことだと思うかもしれないが、他の正規表現エンジンでは、入力長に対して指数的に実行時間が長くなりえる。たとえばxxxxxxxxxxxxxxxという文字列に対して/(x+x+)+y/をマッチさせてみるとまるでハングアップしたみたいになる正規表現エンジンというのは特別なものではない。

そういった正規表現エンジンでは、正規表現とマッチ対象の文字列の両方を与えられるUIがあったとすると、簡単にサーバプロセスをハングアップさせることができてしまう。

re2で使われているアルゴリズムはこのような性質は持っていないのでこの点は安全だ。動作が単純で予測しやすいのはよいことだ。
gem install redis-namespace に失敗するときの対処法

GitLab の `bundle install` 中に下記のようなエラーになりました。サクッと調べて出てこなかったので需要はあるかもしれないということで書いておくことにします。 CentOS 6.5 です。

```
An error occurred while installing redis-namespace (1.4.1), and Bundler cannot continue.
Make sure that `gem install redis-namespace -v '1.4.1'` succeeds before bundling.
```

## Redis 入ってない

入ってなければ入れてください。

```
# yum install redis
```

## Redis 起動してない

起動してなければ起動しましょう。

```
# service redis start
```

自動起動するように chkconfig しとくのがよいかと思います。

```
# chkconfig redis on
```
Goのtimeパッケージのリファレンスタイム（2006年1月2日）は何の日？

Goのtimeパッケージのフォーマットは独特だ。普通のUnixのstrftimeとかだとフォーマット文字列は%Yとか%mといった文字列なのだけど、Goの場合はそのかわりにある種の「サンプル文字列」を与えるという仕組みになっている。

たとえば次の文字列はGoでは時刻の正しいフォーマット文字列だ。

```go
const RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700"
```

%Y（年）の代わりに"2006"、%b（月の名前）の代わりに"Jan"と書くといったルールになっている。"%Y-%m-%d"の代わりに"2006-01-02"と書くのは見た目にわかりやすいといえばわかりやすいが、"2006年1月2日15時04分05秒"以外の時刻は正しいフォーマット文字列としては認識されない。2006の代わりに2007とか書いても意味がない。

では一体この2006年1月2日という特別な日は、なんの日なのか？

最初は1970年1月1日（エポック）から特定の時間が経過した日だとか、あるいはGoが最初に作られた日ではないかと思ったが、それは考えすぎだった。

答えは単純だ。これはアメリカ式の時刻の順番なのだ。"1月2日午後3時4分5秒2006年"（つまり「自然な順番」で1, 2, 3, 4, 5, 6）を指しているのである。Go開発者のRob Pikeさんがgolang-nutsメーリングリストで、最初からよく考えていればこの順番にはしなかったと言っていたが（英語圏でもイギリスとかだと違う順番だしね）、もうその順番になっているので変えられないし、それにきちんと文章化もされているともコメントしていた。従ってこれは単純にそういうものだと思うしかなさそうだ。
sync.WaitGroupの正しい使い方

Goroutineを複数使って並列で処理を行って、それがすべて完了したら次に進みたいとしよう。Goroutineの完了はそれを生成したgoroutineに通知されるわけではないので、メインのgoroutineは何らかのメカニズムを使って全員が完了するまで待って、全員が完了したら実行を再開する必要がある。

sync.WaitGroupは複数のgoroutineの完了を待つための値だ（Javaを知っていれば、java.util.concurrent.CountDownLatchによく似ている）。WaitGroupの値に対してメソッドWaitを呼ぶと、WaitGroupが0になるまでWaitはブロックされる（待たされる）。従って、やりたい処理の数だけWaitGroupの値をインクリメントしておいて、処理完了時にデクリメントすれば、Waitを呼んで処理完了を待っているメインのgoroutineは、すべての処理が完了する（カウンタが0に戻る）まで待って、処理完了時に再開されるというわけだ。

というわけで概念的には単純なWaitGroupだが、マルチスレッドプログラミング特有の落とし穴があるので注意されたい。ありがちな間違いは、下のコードのように、新たに起動したgoroutineの中でWaitGroupをインクリメントしてしまうことだ。

```go
wg := &sync.WaitGroup{}  // WaitGroupの値を作る
for i := 0; i < 10; i++ { // （例として）10回繰り返す
    go func() {
        wg.Add(1)  // wgをインクリメント
        // ここで何か処理を行う
        wg.Done()  // 完了したのでwgをデクリメント
    }()
}
wg.Wait()  // メインのgoroutineはサブgoroutine 10個が完了するのを待つ
```

上のプログラムは一見正しそうにみえる。Goroutineを複数起動しているが、子goroutineはまずwgをインクリメントして、完了時にデクリメントしているので、親のメインのgoroutineはすべての子が完了するまで待たされるはずだ ―― そうだよね？

しかし実際にはそうではない。Goroutineがスケジューリングされるタイミングは任意なので、goroutineが10個生成されて、しかしまだどれもまったく走っていないという状態がありえる。その状態でメインのgoroutineが最後の行に到達すると、wgは0（初期値）のままなので、メインのgoroutineはそのまま下に抜けてしまう。

このバグを直すには次のようにすればよい。いつ走るかわからないgoroutineの中でwgをインクリメントするのではなく、goroutineを起動する前にwgをインクリメントすればよいのである。

```go
wg := &sync.WaitGroup{}  // WaitGroupの値を作る
for i := 0; i < 10; i++ { // （例として）10回繰り返す
    wg.Add(1)  // wgをインクリメント
    go func() {
        // ここで何か処理を行う
        wg.Done()  // 完了したのでwgをデクリメント
    }()
}
wg.Wait()  // メインのgoroutineはサブgoroutine 10個が完了するのを待つ
```

このようにすると最後の行は確実にすべてのgoroutineの完了を待つことになる。マルチスレッドプログラミングは意外な落とし穴があるが、これもその一つなので注意されたい。
Goroutineの最大数を制御する方法

Goで複数の仕事があるとして、goroutineを新たに作成してそれに1つ1つの仕事を任せるのは普通のやり方だと思う。たとえばクライアントからの接続を待っているサーバをGoで書いているとして、クライアントからのリクエストごとにgoroutineを起動してその後のやりとりを任せるといったようなパターンは普通だ。

そういったパターンでリクエストが多いと、どんどんgoroutineが起動してしまってメモリが足りなくなることがある。そういった場合に、goroutineの起動を待たせて、最大でもある一定数以上はgoroutineが並行して走っていないようにしたいことはよくあるのだが、そのためにはどうしたらよいだろうか？

一般的なやり方はチャネルを「残りいくつのgoroutineを起動してよいか」という値（セマフォ）として使う方法である。

チャネルを作成するときにチャネルのバッファサイズを決めることができる。バッファが一杯になるとそのチャネルへの送信はブロックされる（それを実行しているgoroutineがその行で実行が停止してチャネルに空きができるまで先に進まなくなる）。この性質をうまく使うと、チャネルのバッファサイズと同じ個数だけgoroutineを起動することができるのである。

下に例を示す。

```go
c := make(chan bool, 10) // 最大でgoroutineは10個
for /* なにかをする */ {
    c <- true // もしcが一杯ならこの行で待たされる
    go func() {
        // cから読みだしてその値を捨てる -- ほかのgoroutineのための空きを作る
        defer func() { <-c }()
        // このgoroutineが行うことをする
    }()
}
```

上記のプログラムではgoroutineは最大でも10個しか並列には走らない。このようにチャネルを使って最大数を制御すると、無秩序にgoroutineが起動するという問題を解決できる。
Beego を触ってみる (Controller/Router)


## 独自の Controller を作成する
Controller は `controllers` 配下に配置する。
とりあえず適当に空の Controller を作成してみる。
また、合わせて中身適当な views/users/index.tpl を配置しておく。

```users.go
package controllers

import (
	"github.com/astaxie/beego"
)

type UsersController struct {
	beego.Controller
}

func (this *UsersController) Get() {
	this.TplNames = "users/index.tpl"
}
```

## ルーティングの設定を行う
/users/ にアクセスすると、作成したコントローラが動作するようにルーティングの設定を行う。
ルーティングの設定は routes/router.go に記述する。

```
func init() {
	beego.Router("/", &controllers.MainController{})
	beego.Router("/users/", &controllers.UsersController{})
}
```

変更後、http://localhost:8080/users/ にアクセス可能なことを確認する。

## その他のルーティングの設定について
Beego では上記以外にも様々なルーティング設定の方法がある。(詳細は[こちら](http://beego.me/docs/mvc/controller/router.md))

例として、アノテーションによるルーティング設定を試してみる。
UsersController を以下のように修正する。

```
// @router /users/ [get]
// @router /users/index [get]
func (this *UsersController) Get() {
	this.TplNames = "users/index.tpl"
}
```

続けて router.go を以下のように修正する。

```
func init() {
	beego.Router("/", &controllers.MainController{})
	beego.Include(&controllers.UsersController{})
}
```

変更後、http://localhost:8080/users/ と http://localhost:8080/users/index にアクセス可能なことが確認できる。

## URLパラメータを受け取る
/users/show/(ID) といった URL から ID を抽出してみる。
UsersController に新たに Show を追加する。 (本来は Controller を分けるべきだがサンプルなので)

```
// @router /users/show/:id [get]
func (this *UsersController) Show() {
	this.Data["ID"] = this.Ctx.Input.Param(":id")
	this.TplNames = "users/show.tpl"
}
```

views/users/show.tpl を追加する。

```
ID: {{.ID}}
```

http://localhost:8080/users/show/1 とアクセスすると、IDが取得できていることが確認できる。
memcached appendの実行時間を確認する

## 概要
Memcached の append が、同じキーで既に登録されている値の長さによって処理速度が異なるのかを確認した。
性能が徐々に劣化する事が確認できた。

## 環境
・ホストマシン
プロセッサ：Intel Core2 Duo CPU U9400 @ 1.40GHz
実装メモリ(RAM)：4.00GB (2.96GB使用可能)
システムの種類：32ビットオペレーティングシステム

・ホストOS
Windows 7 Home Premium Service Pack 1

・VM
VirtualBox 4.3.8 r92456
プロセッサー数：1
メインメモリー：1024MB

・ゲストOS
Fedora release 20 (Heisenbug)

・各種バージョン
Memcached 1.4.17 (memcached-1.4.17-1.fc20.i686)
PHP 5.5.9 (php-5.5.9-2.fc20.i686)
libmemcached-1.0.16-2.fc20.i686
php-pecl-memcached-2.1.0-8.fc20.i686

## 実行した内容
* 予めMemcachedにaddしておく。ここでの値の長さを変えながら何回か検証する。
* 1バイトのデータをappendする。このappend処理の実行時間を計測する。

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

len=1
while [ $len -le 1000000 ]
do
	pkill memcached
	sleep 1
	echo pgrep:`pgrep memcached`
	memcached -p 11211 -m 256m -d
	sleep 1
	echo pgrep:`pgrep memcached`

	php mtest.php $len

	len=`expr $len \* 10`
done
```

```php:mtest.php
<?php

$len = $argv[1];

print "len:$len\n";

$m = new Memcached();
$m->addServer('localhost', 11211);
$m->setOption(Memcached::OPT_COMPRESSION, false);

$value = str_repeat('a', $len);

$time_total = 0;
for ($i = 0; $i < 100; $i++) {
	$key = uniqid();
	if (!$m->add($key, $value)) {
		error_log('ERROR add');
	}

	$time_start = microtime(true);
	if (!$m->append($key, 'a')) {
		error_log('ERROR append');
	}
	$time_end = microtime(true);
        $time = $time_end - $time_start;
	$time_total += $time;
}

$avg = $time_total / $i;

print "time:" . $avg . "\n";
print "----------\n";
```

## 結果
1回目

```shell-session
$ ./mtest.sh
pgrep:
pgrep:7177
len:1
time:0.001196608543396
----------
pgrep:
pgrep:7191
len:10
time:0.0013752150535583
----------
pgrep:
pgrep:7205
len:100
time:0.0012749838829041
----------
pgrep:
pgrep:7219
len:1000
time:0.0013504481315613
----------
pgrep:
pgrep:7233
len:10000
time:0.001392662525177
----------
pgrep:
pgrep:7247
len:100000
time:0.0020507955551147
----------
pgrep:
pgrep:7261
len:1000000
time:0.011878855228424
----------
```

2回目

```shell-session
$ ./mtest.sh
pgrep:
pgrep:7276
len:1
time:0.0013153910636902
----------
pgrep:
pgrep:7290
len:10
time:0.0012726187705994
----------
pgrep:
pgrep:7304
len:100
time:0.0014189291000366
----------
pgrep:
pgrep:7318
len:1000
time:0.0013002800941467
----------
pgrep:
pgrep:7332
len:10000
time:0.0013521313667297
----------
pgrep:
pgrep:7346
len:100000
time:0.0019809556007385
----------
pgrep:
pgrep:7360
len:1000000
time:0.010912144184113
----------
```

平均

| 元のデータ長(bytes) | append実行時間の平均(ms) |
|--------------------:|-------------------------:|
|                   1 |                     1.25 |
|                  10 |                     1.32 |
|                 100 |                     1.34 |
|                1000 |                     1.32 |
|               10000 |                     1.37 |
|              100000 |                     2.01 |
|             1000000 |                    11.39 |
Goでxxxのポインタを取っているプログラムはだいたい全部間違っている

Goで、文字列、インターフェイス、チャネル、マップ、スライスのポインタを取っているプログラムは、書いた本人がきちんと自分がなにをしているのか理解しているのでなければ、ほぼ確実に間違っているといっていい。

Goではある種の型の値はそもそもポインタのようなものである。上記の型はどれも任意の大きさになり得るが、大きくなりうる実体のデータはヒープに確保されていて、値そのものが持っているのはそのヒープ上への値へのただのポインタ＋多少の付随的なデータにすぎない。こういった値を値渡しではなくポインタ渡しする必要はない。ポインタのデリファレンスのほうがポインタのコピーより高くつくし、余計な混乱を引き起こすだけだからだ。もしこういう値をポインタ渡ししているとしたら、そのコードはなにか深い意味があるのではなく、それを書いた人が大きな値がコピーされると勘違いしていて書いた可能性のほうがずっと高い。

文字列は2ワードの値で、文字列実体の先頭へのポインタと文字列の長さ（バイト長）からできている。どちらのワードも書き換えることはできない。Goでは文字列は不変だから、コピーを渡そうがそれへのポインタを渡そうができることに違いはなく、文字列を渡すときはポインタのポインタを渡す（文字列へのポインタを渡す）より素直に文字列（実体へのポインタ）を値渡しするほうがよい。

インターフェイスも2ワードの値で、実際の値の型へのポインタと実際の値へのポインタからできている。インターフェイスを書き換えることも普通はできない（インターフェイス型の値が指している先をすげ替えたりインターフェイスが指している値の型を変更したりすることは普通はありえない）。従って値渡しするほうが素直だ。

チャネル、マップも同じだ。

スライスもやはり同じである。スライスは3ワードの値で、実体のデータへのポインタと、配列のキャパシティ、それから長さの3つの値からできている。スライスは要は配列へのポインタなので、これもわざわざポインタへのポインタを渡すのではなく値渡しするほうが普通だ。

というわけで、こういう型の値は正当な理由なくポインタをとったりしないことに注意されたい。
普段使いなbashのfor文

bashプログラミングじゃなくて、普段のターミナル作業での便利なfor文の使い方について。


### C言語っぽい形式

まずいちおう紹介で、数字をインクリメントするだけならC言語っぽい形式でも書けます。

```
$ for((i=0;i<5;i++));do echo $i;done
0
1
2
3
4
```

ただ個人的にはあんまり使いません。後述する『for in形式 + ブレース展開』のほうが好みなので。

### for in形式

続いてfor in形式のfor文。
基本はこんな感じです。

```
$ for i in aaa bbb ccc;do echo $i;done
aaa
bbb
ccc
```

グロブと合わせたファイル処理はよく使います。

```
$ for i in *.log;do cp $i $i.back;done
```

コマンド実行結果と組み合わせることもできますが、

```
$ for i in `find . -name "*.log"`;do cp $i $i.back;done
```

こういう場合はwhile文のほうが見やすい気がしますし、

```
$ find . -name "*.log" | while read l;do cp $l $l.back;done
```

xargsで簡単にすむ場合はそうします。

```
$ find . -name "*.log" | xargs grep -i error
```

### ブレース展開との組み合わせ

ブレース展開というのは{}でくくったテキストをbashがいい感じに展開してくれる機能です。

```
$ echo {0..4}
0 1 2 3 4

$ echo app0{1..2}
app01 app02

$ echo {app,db}0{1..2}
app01 app02 db01 db02
```

for文を組み合わせるといろいろ便利に使えます。

単純な数値のインクリメントはこう書けますし、

```
$ for i in {0..4};do echo $i;done
0
1
2
3
4
```

ホスト名、IPアドレスを指定して複数サーバにsshでの連続ログイン、連続コマンド実行なんかに使っても便利です。

```
$ for i in 192.168.1.10{1..2};do ssh $i;done

[mikeda@test01 ~]$ exit
logout

[mikeda@test02 ~]$ exit
logout

$ for i in 192.168.1.10{1..2};do ssh $i hostname;done
test01
test02
```
Serviceの挙動について

####経緯

Activityで再生している音楽を、アプリ終了しても再生し続けるようにしたい！

####目的

* アプリを終了してもサービスをstopするまで破棄されないようにする
* ActivityからMediaPlayerを渡すために、bindを利用する

####コード

```java:MusicPlayService.java
public class MusicPlayService extends Service {

  private NotificationManager mNM;
  private final IBinder mBinder = new MusicPlayBinder();

  public class MusicPlayBinder extends Binder {
    public MusicPlayService getService() {
      return MusicPlayService.this;
    }
  }

  @Override
  public void onCreate() {
    Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
  }

  @Override
  public IBinder onBind(Intent intent) {
    Toast.makeText(this, "onBind", Toast.LENGTH_SHORT).show();
    // 通知押下時に、MusicPlayServiceのonStartCommandを呼び出すためのintent
    Intent notificationIntent = new Intent(this, MusicPlayService.class);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, notificationIntent, 0);
    // サービスを永続化するために、通知を作成する
    NotificationCompat.Builder builder = new　NotificationCompat.Builder(getApplicationContext());
    builder.setContentIntent(pendingIntent);
    builder.setTicker("準備中");
    builder.setContentTitle("title");
    builder.setContentText("text");
    builder.setSmallIcon(android.R.drawable.ic_dialog_info);
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    mNM.notify(R.string.service_music_play, builder.build());
    // サービス永続化
    startForeground(R.string.service_music_play, builder.build());
    return mBinder;
  }

  @Override
  public void onDestroy() {
    Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
  }

}

```

***

####まとめ

* **Activity側**
    * `startService(new Intent(this, MusicPlayService.class));`
        * bindのみだとコネクションしているアクティビティ破棄時にサービスが終わる
        * サービスを起動しておく(stopServiceまで終わらない)
    * `bindService(new Intent(this, MusicPlayService.class), mConnection, BIND_AUTO_CREATE);`
        * コネクションを利用してデータを引数で簡単に渡せるのでbindを利用している
        * bindは永続化に必須ではない

* **Service側**
    * `startForeground(R.string.service_music_play, builder.build());`
        * これに通知を渡すと、通知バーに表示され続ける(サービス終わるまで)
        * これが無いと、ホーム長押し→アプリスワイプでキル(GalaxyS4)するとサービス終わる


* **サービスの止め方**
    * startのみの場合→stopすれば止まる
    * bindのみの場合→unbind or アクティビティ破棄
    * startとbindの両方を利用した場合→**両方止める必要がある**
Beego を触ってみる (環境構築)

## Beego とは？
Golang で書かれたフルスタック Web アプリケーションフレームワーク。どうも中国で実績があるフレームワークのよう。
同様のフレームワークとして Revel や Martini が有名だが、Beego はドキュメントが充実していて初心者でも取っ付き易い印象。

## インストール
[公式サイト](http://beego.me/quickstart)に従って Beego をインストールしてみる。
beego はフレームワーク本体、bee は CUI ツールのらしい。

```
go get github.com/astaxie/beego
go get github.com/beego/bee
```

## プロジェクトを作成する
$GOPATH/src に移動して `bee new <プロジェクト名>` コマンドを実行する。

```
bee new github.com/macococo/template-beego
```

## 起動してみる

`bee run` で起動する。デフォルトでは 8080 ポートで動作する。
ポート番号を変更したい場合は、conf/app.conf の httpport を適宜変更する。

```
bee run
2014/08/31 14:47:41 [INFO] Uses 'template-beego' as 'appname'
2014/08/31 14:47:41 [INFO] Initializing watcher...
...
2014/08/31 14:47:41 [INFO] Start building...
2014/08/31 14:47:43 [SUCC] Build was successful
2014/08/31 14:47:43 [INFO] Restarting template-beego ...
2014/08/31 14:47:43 [INFO] ./template-beego is running...
2014/08/31 14:47:43 [I] .../template-beego/controllers don't has updated
2014/08/31 14:47:43 [I] Running on :8080
```

http://localhost:8080/ にアクセスすれば起動が確認できる。

![スクリーンショット 2014-08-31 14.50.10.png](https://qiita-image-store.s3.amazonaws.com/0/38816/81e13793-a02b-7ace-20f3-a6b9c02a052b.png)