OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant Tips#4 puppetのmanifestファイルを階層的に読み込む

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# puppetのmanifestファイルを階層的に読み込む
Vagrantを利用していると、shellによるプロビジョニングでは、いろいろと面倒な記述をしなければならなかったり、OSによっては書き方を変えないと動かなかったりして、不都合な場合もあります。そういった問題を緩和するために、puppetやchefなどの構成管理ツールを使うと便利です。
今回は、chefと比べると古くから利用されているpuppetについての記事です。
puppetでは、manifestと呼ばれる設定ファイルに、構成管理情報を記述します。（Vagrantでは、デフォルトの設定で、manifests/default.ppを読みに行くように設定されているようです。）

単純な構成であれば、default.ppに全て記述してしまえばよいのですが、複雑な構成をする場合、default.ppに全てを書いてしまうと、管理が大変になってしまうため、目的ごとにmanifestを管理したい場合の方法を紹介します。（目的毎にmanifestファイルを作成することで、再利用性も高まります。）

```ruby:Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_4"
  config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"
  # provisioningにはpuppetを利用
  config.vm.provision "puppet"

end
```

```puppet:manifests/default.pp
import 'parent_manifest.pp' # このように別ファイルを読み出すことが可能
notice("This is a default.pp")
```

```puppet:manifests/parent_manifest.pp
import 'child_*.pp' # 正規表現による一括読込も可能
notice("This is a parent_manifest.pp")
```

```puppet:manifests/child_manifest.pp
notice("This is a child_manifest.pp")
```

```puppet:manifests/child_manifest2.pp
notice("This is a child_manifest2.pp")
```

上記ファイルを作成して、「vagrant up」を実行すると、
default.ppからparent_manifest.ppやchild_manifest.pp、child_manifest2.ppが呼び出されていることがわかります。
～中略～
==> default: Notice: Scope(Class[main]): This is a child_manifest.pp
==> default: Notice: Scope(Class[main]): This is a child_manifest2.pp
==> default: Notice: Scope(Class[main]): This is a parent_manifest.pp
==> default: Notice: Scope(Class[main]): This is a default.pp
==> default: Notice: Compiled catalog for localhost in environment production in 0.11 seconds
==> default: Notice: Finished catalog run in 0.04 seconds


上記manifestでは、何もしていませんが、それぞれapacheのインストールやtomcatのインストール、javaのインストールなどと分割してファイルを作成することで、柔軟にmanifestを作成することが可能です。
FFmpeg 静止画と音声から動画を作成する


FFmpegは動画を扱うソフトウェアでLinuxだけでなくWindowsでもバイナリが配布されているそうです。今回は静止画と音声から動画をつくるのに利用しました。Versionの違いかGoogleって出てきた方法そのままではできなかったのでメモ。
ちなみにFFmpeg 2.2.3, Apple LLVM version 5.1で確認しました。

# Install
OSXだとHomebrewで入ります。

```
brew install ffmpeg
```

# 静止画と音声から動画を作成する

```
ffmpeg -loop 1 -i picture.png -i audio.mp4 -shortest movie.mp4
```

shortestオプションをつけると入力ファイルのうち最も短いものにあわせてエンコードします。これをつけないと延々とエンコードし続けるので気をつけてください。
logrotateでlog4jのFileAppenderをローテーションさせる

Webアプリケーションのログを、logrotateで一律ローテーションさせたい、という話をときどき聞きます。

log4jのローテーションを外部から指示する術は、ExternallyRolledFileAppenderを使えば可能です。

```xml
<appender name="file" class="org.apache.log4j.varia.ExternallyRolledFileAppender">
    <param name="file" value="application.log" /> 
    <param name="threshold" value="INFO"/>
    <param name="port" value="9000"/>
    <param name="append" value="true" />
</appender>
```
org.apache.log4j.varia.Roller を使ってローテーション指示を送ることができますが、ローテーションファイルが*.1が自動で作られてしまい、うまくありません。


そこで、他のログローテーショナブルなプロセスたちと同じように、SIGHUPを受け取ったらファイルを一度クローズし、再度開き直すようにしてみます。

```java
public class LogRotatableFileAppender extends FileAppender {
    public LogRotatableFileAppender() {
        Signal.handle(new Signal("HUP"), new SignalHandler() {
            @Override
            public void handle(Signal signal) {
                closeFile();
                activateOptions();
            }
        });
    }
}
```

これで、例えばTomcatで動いているアプリケーションの場合、以下のように`logrotate.conf`にpostrotateでSIGHUPをtomcatプロセスに送るようにすれば、logrotateで設定にしたがい、ローテーションされるようになります。

```text:logrotate.conf
/var/log/app.log
{
    rotate 6
    size=100k 
    missingok 
    daily
    sharedscripts 
    postrotate
        /bin/kill -HUP `cat /var/run/tomcat.pid 2>/dev/null` 2> /dev/null
    endscript
}
```
net/httpでSOCKS proxyを扱う

GoはデフォルトではHTTP_PROXY環境変数を使うことでHTTP Proxyを使うことが出来るのですが、SOCKSは対応していません。

hailiang/socksがSOCKSのライブラリを適用してくれているのでTransportに突っ込むことでSOCKS経由で通信することができます。

```bash
mkdir -p go-socks-example/src
cd go-socks-exmaple
export GOPATH=`pwd`
go get -u "github.com/hailiang/socks"
```

```go
package main

import (
	"fmt"
	"github.com/hailiang/socks"
	"io/ioutil"
	"net/http"
)

func main() {
	dialSocksProxy := socks.DialSocksProxy(socks.SOCKS5, "127.0.0.1:1080")
	tr := &http.Transport{Dial: dialSocksProxy}
	httpClient := &http.Client{Transport: tr}

	req, _ := http.NewRequest("GET", "http://google.com", nil)
	res, err := httpClient.Do(req)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer res.Body.Close()
	contents, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("result: %s\n", contents)
}
```


```
# 別ターミナルでSOCKSつくっとく
ssh YOUR_SERVER -D 1080
# 動かす
go run example.go
```

社内ツールなどはSOCKS経由でアクセスできると色々楽だったりするので、組み込んでおくと捗るかもしれません。
JavaScriptの独自コンテキストメニューでテキストのコピーができなくなる問題への対処

contextmenuで独自メニューを表示するような場合、ページ内のテキストがコピーできなくなったという苦情が寄せられることがあります。

Ctrl+Cなどのショートカットを利用すればコピーは可能ですが、利用者にショートカットキーを強要するのも悩ましいので、テキスト選択中にはデフォルトのメニューを表示するように工夫してみます。

## テキスト選択中はデフォルトのコンテキストメニューを表示する

テキストが選択中かどうかは、window.getSelection() の戻り値で判別ができます。テキストが選択されるタイミングは keyup/mouseup のいずれかと思われるので、それぞれのイベントで選択中であるかをチェックします。

```js
var hasSelection = false;
$(document).on("keyup mouseup", function(e) {
    hasSelection = (window.getSelection().toString() !== "")? true : false;
});
```

メニュー表示時に、テキスト選択中であれば独自処理に遷移しないようにします。

```js
$(document).on("contextmenu", function(e) {
    if (hasSelection) return;  // テキスト選択中であれば何もしない
    
    // 以降は独自メニューを表示するなどの処理
    ...
});
```

簡単にチェックするだけであれば、これでよいのですがいくつか問題があるので解決します。

### 改修

#### 選択したテキスト上以外でもデフォルトメニューが開く

最後にkeyup/mouseupしたタイミングでテキスト選択状態を判別しているので、右クリックした位置が全く違う場所でもデフォルトメニューが開きます。右クリックした瞬間に選択状態を判定すればよさそうですが、Google Chromeなどではテキスト上で右クリックすると自動選択されてしまうため、正しく判別できません。

そのため、多少強引ですがRangeオブジェクトの各プロパティを比較して、前回keyup/mousedown時と右クリック時で選択範囲が同じ場合のみデフォルトとなるよう変更します。

```js
// keyup, mouseupのタイミングで文字列選択があるか判別
var lastSelection = null;
$(document).on("keyup mouseup", function(e) {
    lastSelection = (window.getSelection().toString() !== "")? window.getSelection().getRangeAt(0) : null;
});

// カスタム右クリックメニュー
$(document).on("contextmenu", function(e) {
    // テキスト選択中であれば何もしない
    if (lastSelection !== null) {
        var isSame = true;
        var currentSelection = window.getSelection().getRangeAt(0);
        for (var key in currentSelection) {
            if (currentSelection[key] != lastSelection[key]) {
                isSame = false;
                break;
            }
        }
        
        if (isSame) return;
    }

    // 以降は独自メニューを表示するなどの処理
    ...
});
```

#### IE8以下への対応

window.getSelection()はIE9以降でのみ対応されているため、それっぽく動作するように代わりの処理を実装します。

```js
// IE8以下対応
if (!window.getSelection) {
    window.getSelection = function() {
        return {
            toString: function() {
                return document.selection.createRange().text;
            },
            getRangeAt: function() {
                return {};                
            }
        }        
    }    
}
```

### デモ

完成した動作はこんな感じです。
Chrome 36/Firefox 30/IE 8-11で動作確認しました。

![contextmenu.gif](https://qiita-image-store.s3.amazonaws.com/0/16407/b63510c2-fa06-5045-7b22-0be46518e1e9.gif)

http://jsfiddle.net/castor_4bit/AFnkA/
CFBundleVersion をカウントアップしつつ TestFlight に送り、idobata に通知するスクリプト

## 背景

僕は今のところ Version (CFBundleShortVersionString) を 1.0.0 のように設定し、Build (CFBundleVersion) を単純にビルドごとに 1, 2, 3... と連番でカウントアップするような運用にしています。

TestFlight に投げるときにわざわざ手動で Build を上げて、git でコミットして、tag 打って...とやるのは面倒なのでスクリプト化しました。


## 準備

- [direnv](https://github.com/zimbatm/direnv) が必要です (`brew install direnv` で入ります)
- [shenzhen](https://github.com/nomad/shenzhen) が必要です (`gem install shenzhen` で入ります)


## 設定

.envrc をプロジェクトルートに作ります。リポジトリにはコミットしない方がいいでしょう。

```bash:.envrc
export PRODUCT_NAME=YOUR_PRODUCT_NAME
export TESTFLIGHT_API_TOKEN=YOUR_API_TOKEN
export TESTFLIGHT_TEAM_TOKEN=YOUR_TEAM_TOKEN
export TESTFLIGHT_DISTRIBUTION_LISTS="testers, developers"
export IDOBATA_ENDPOINT_URL=YOUR_ENDPOINT_URL
```

## スクリプト

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

#
# $ brew install direnv
# $ cp dotenvrc .envrc && vim .envrc
# $ gem install shenzhen && rbenv rehash
# $ ./build.sh -m "hoge"
#

_usage() {
  echo "Usage:"
  echo "${0} -m MESSAGE"
  exit 1
}

while getopts :m: OPT
do
  case $OPT in
    "m" ) FLG_M="TRUE"; MESSAGE="$OPTARG";;
    :|\?) _usage;;
  esac
done

shift `expr ${OPTIND} - 1`

[ "${FLG_M}" != "TRUE" ] && _usage

# bump build version
plistFile=${PRODUCT_NAME}/${PRODUCT_NAME}-Info.plist
bundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $plistFile)
shortVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $plistFile)
bundleVersion=$(($bundleVersion + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bundleVersion" $plistFile

# # commit && tag
git add $plistFile
git commit -m "build $shortVersion($bundleVersion)"
git tag $shortVersion-$bundleVersion

# build
ipa build

# testflight
ipafile=$(ls *.ipa)
dsymfile=$(ls *.dSYM.zip)
response=$(curl http://testflightapp.com/api/builds.json \
    -F file=@$ipafile \
    -F dsym=@$dsymfile \
    -F api_token=$TESTFLIGHT_API_TOKEN \
    -F team_token=$TESTFLIGHT_TEAM_TOKEN \
    -F notes="$MESSAGE" \
    -F notify=True \
    -F distribution_lists="$TESTFLIGHT_DISTRIBUTION_LISTS"
  )

# notify
title="$PRODUCT_NAME $shortVersion($bundleVersion) is now available."
curl --data-urlencode "source=<p>$title</p><pre>$response</pre>" -d format=html $IDOBATA_ENDPOINT_URL
```
カレントラインをハイライト付きでechoする。


`synID`系の関数の扱いをすぐ忘れるので備忘録。
タイトルそのままですが、カレントラインをハイライト付きでechoするコードです。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/8325/71b6c97b-ee85-d629-9880-ebce124cd08e.png)


```vim:
function! s:echo_currline_with_hl()
  let line = getline('.')
  for c in range(1, len(line))
    let name = synIDattr(synIDtrans(synID(line('.'), c, 1)), 'name')
    execute 'echohl ' . (empty(name) ? 'None' : name)
    echon line[c-1]
  endfor
  echohl None
endfunction
nnoremap <tab>     :call <sid>echo_currline_with_hl()<cr>
```
【メモ】【まとめ】Ubuntu 14.04をインストールしたらやること

# アップデート
```
sudo aptitude update
sudo aptitude full-upgrade 
```

# aptリポジトリの追加

## Git/Oracle JDK/Dockerのリポジトリを追加
```
sudo add-apt-repository ppa:git-core/ppa
sudo add-apt-repository ppa:webupd8team/java
wget -qO- https://get.docker.com/ | sh

sudo aptitude update
```

## CassandraとMongoDBのリポジトリを追加(optional)
8C718D3B5072E1F5に関しては、aptitude updateで出る値に置き換える

```
sudo sh -c "echo deb http://www.apache.org/dist/cassandra/debian 20x main > /etc/apt/sources.list.d/cassandra.list"
sudo sh -c "echo deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen > /etc/apt/sources.list.d/mongodb.list"
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

gpg --keyserver pgp.mit.edu --recv-keys 8C718D3B5072E1F5
gpg --export --armor 8C718D3B5072E1F5 | sudo apt-key add -

sudo aptitude update
```

# 色々とインストール

```
sudo apt-get -y install lxc-docker git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev clamav oracle-java8-set-default
```

# rubyとかのインストール

```
git clone https://github.com/riywo/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(anyenv init -)"' >> ~/.profile
exec $SHELL -l
mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
anyenv install rbenv
anyenv install pyenv
exec $SHELL -l
rbenv install 2.2.2
rbenv global 2.2.2

git clone git://github.com/jf/rbenv-gemset.git $(anyenv root)/envs/rbenv/plugins/rbenv-gemset
git clone https://github.com/sstephenson/rbenv-gem-rehash.git $(anyenv root)/envs/rbenv/plugins/rbenv-gem-rehash
gem update --system
gem install bundler
```

# GVMのインストール
```
curl -s get.gvmtool.net | bash
```
連番になっている複数のファイルを読み込む

ある年からある年まで、１年に１つのCSVファイルがあるとする。一つ一つのファイルを`read.csv()`で読み込んでも良いのだけど、ファイルが多いと面倒くさい。というわけで、規則性のある連番ファイルを読み込む、という試み。

例えば平成10年から23年まで、各年に１つのCSVファイル（`H10.csv`, `H11.csv`... `H23.csv`）を読み込む場合。

```{r}
year <- 10:23 # for文を回すため、年数を設定
```

```{r}
for (i in year) {
    mypath <- file.path(getwd(), paste("H", i, ".csv", sep = "")) 
    assign(paste("df", i, sep = ""), read.csv(mypath, header = T))
}
```

とするとデータフレームとして各CSVファイルを読み込んだ（`df10`, `df11` ... `df23`）が作成される。

## ミソ

`assign()`を使うとダミー変数を作成することができる。
ターミナルで楽しむ Twitter ストリーミング・クライアント

# Rainbowstream
ターミナルでTweetできるツールとしては、いままでいくらでもあったが、使ってみたらなかなか満足できるモノはない。それで自分で作ってみたのはこれから紹介するRainbow Streamというモノ。

Rainbow Streamは名前の通り、川の流れのように目の前をフローしていく世界中の Tweet たちをカラフル・ストリーミングで楽しめるのが特徴。さらにCLIベースでイメージ表示もできる。

Homepage: [www.rainbowstream.org](http://www.rainbowstream.org/)
Github: [github.com/DTVD/rainbowstream](https://github.com/DTVD/rainbowstream)
a
![Show case](https://raw.githubusercontent.com/DTVD/rainbowstream/master/screenshot/rs.gif)

# インストール
pipで簡単インストール

```bash
sudo pip install rainbowstream
```
ただ、`virtualenv`を使って独立の環境でインストールするのがオススメ：

```bash
virtualenv venv
# Python 3 users : use -p to specify your Python 3 localtion as below
# virtualenv -p /usr/bin/python3 venv
source venv/bin/activate
pip install rainbowstream
```

# Twitterストリーミングを楽しむ
インストールが終わったら次のコマンドで起動

```bash
rainbowstream
```

さらにイメージをターミナルで直接見れるストリーミングを起動したい場合には

```bash
rainbowstream -iot
```

# コマンド
サポートするコマンド一覧は [ReadTheDocs](http://rainbowstream.readthedocs.org/en/latest/)に参照できるが、主には下記となる。

* Exploreコマンド
  * Trend, home timeline, view profile, search....
* Tweetコマンド
  * Tweet, retweet, reply, quote, favourite...
* Messageコマンド
  * View inbox, sent, send a message... 
* Follow コマンド
  * follow, mute, block...
* Listコマンド
  * List home timeline, add, remove, create, delete...
* Streamコマンド
  * Switch to public/private stream, filter, ignore...
* Smart シェル
  * 電卓、カレンダ
* Configコマンド
  * config値確認、変更、テーマ選択、変更...
* 共通コマンド
  * help, clear screen, exit...
    
# テーマ
下記のテーマがすでに用意された。
* Monokai
![Monokai](https://raw.githubusercontent.com/DTVD/rainbowstream/master/screenshot/themes/Monokai.png)
* Solarized
![Solarized](https://raw.githubusercontent.com/DTVD/rainbowstream/master/screenshot/themes/Solarized.png)
* Tomorrow Night
![TomorrowNight](https://raw.githubusercontent.com/DTVD/rainbowstream/master/screenshot/themes/TomorrowNight.png)
* Larapaste
![Larapaste](https://raw.githubusercontent.com/DTVD/rainbowstream/master/screenshot/themes/larapaste.png)

# 実際に使ってみた
CLIなので色んなデバイスや環境で動かせるのは面白いだろう。
* [自分のMac](https://www.youtube.com/watch?v=tykCvPMJq8s)
* [netbuffaloさんのLinux](http://netbuffalo.doorblog.jp/archives/4814863.html)
* [russellさんのRaspherry-Pi](http://www.russelldavis.org/2014/07/06/rainbowstream-twitter-client-on-headless-raspberry-pi/)
* [Peter BlairさんのAndroidでも！](https://www.youtube.com/watch?v=Ik1DbmtJeZ8&feature=youtu.be)
* [なんとインドネシア語で紹介された記事 @.@](http://kusaeni.com/2014/07/13/RainbowStream.html)
CoreOS のバージョンを確認する.


CoreOS は自動でアップデートされると行っても, 本当にアップデートされているのか気になりますね.
今使っている CoreOS のバージョンがいくつなのか確認してみましょう.

昔から? よくある手である /etc/issue はなんだか化けてしまっていますね.

```
$ cat /etc/issue 

This is \n.\O (\s \m \r) \t
SSH host key: XXXXX (DSA)
SSH host key: XXXXX (ED25519)
SSH host key: XXXXX (RSA)
ens4v1: \4{ens4v1} \6{ens4v1}
```

/etc/os-relase を見てみます.

```
$ cat /etc/os-release 
NAME=CoreOS
ID=coreos
VERSION=367.1.0
VERSION_ID=367.1.0
BUILD_ID=
PRETTY_NAME="CoreOS 367.1.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"
```

Voala!
SinatraをApache上のFastCGIで動かす


Sinatraをサーバに設置して公開するためには，リバースプロキシを使った構成が推奨されています．
しかし，初心者にはハードルが高いですし，この起動方法ではSSH操作やApacheの設定ファイルを書く知識が必要になります．

初心者でもファイルをアップロードする程度でSinatraアプリを動かせるような設定をしてみたので紹介します．

## 環境

* OS: Ubuntu
* Web Server: Apache2.2
  * ServerAlias, VirtualDocumentRootを使ったユーザごとのサブドメイン環境
  * .htaccessが使用可能

## Apacheにmod_fastcgiを導入

まずは，ApacheでFastCGIを使えるようにします．
mod_fcgidもありますが，今回はmod_fastcgiを利用しました．

```sh
sudo apt-get install libapache2-mod-fastcgi
```

ファイルが更新されたときにリロードする設定を追加します．
（ただし，dispatch.fcgiの更新のみしか捕らえられないので，Sinatraの方のコードを変更した時にdispatch.fcgiのタイムスタンプも変更する必要があります．）

* /etc/apache2/mods-available/fastcgi.conf

```apache
FastCgiConfig -autoUpdate
```


## 必要なgemのインストール

gemがインストールされていないと動作しません．sinatraとfcgiが必要です．

```sh
sudo gem install sinatra fcgi
```

## ディレクトリ・ファイル構成

公開ディレクトリの直下にapp_nameというフォルダで設置した例です．

```
公開ディレクトリ/app_name/
├── app [755]
│   ├── app.rb
├── .htaccess
├── log [777]
│   ├── fastcgi.log
└── public [755]
    ├── dispatch.fcgi [755]
    └── .htaccess
```

## それぞれのファイルの中身

* `app_name/.htaccess`

まず，public以下を見せるようにしたいので，rewriteでURLを書き換えてpublic以下に見せかけます．

```apache
RewriteEngine on
RewriteBase /app_name
# 全てpublic以下へ書き換える
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
```

* `app_name/public/.htaccess`

次に，public内の静的ファイル以外はdispatch.cgiを通し，Sinatraに問い合わせさせるようにします．

```apache
AddHandler fastcgi-script .fcgi

Options +FollowSymLinks +ExecCGI

RewriteEngine on
RewriteBase /app_name/public
DirectoryIndex dispatch.fcgi
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [QSA,L]
```

* `app_name/public/dispatch.fcgi`

このファイルでSinatraをFastCGIとして起動します．

```ruby
#!/usr/bin/env ruby

require 'rubygems'
require 'rack'

fastcgi_log = File.open("../log/fastcgi.log", "a")
STDOUT.reopen fastcgi_log
STDERR.reopen fastcgi_log
STDOUT.sync = true

load '../app/app.rb'

builder = Rack::Builder.new do
  map '/' do
    run App.new
  end
end

Rack::Handler::FastCGI.run(builder)
```

* `app_name/app/app.rb`

Sinatraのコードです．クラスとして定義する必要があります．

```ruby
require 'sinatra'

class App < Sinatra::Application
  set :public_folder, './public'

  get '/' do
    'hello'  
  end

  get '/hoge' do
    'hoge'
  end
end
```

## テンプレート

これらのテンプレートをGithubに公開しました．

* https://github.com/nnct-jo-ken/sinatra_fcgi_template

## 参考

* http://recipes.sinatrarb.com/p/deployment/fastcgi
elasticsearch/curatorを使ってみる


こちらの投稿に思い切り影響されて、curatorを使うことにした
http://qiita.com/hakobera/items/48e15c4bb4cc8110c495

### インストール
https://github.com/elasticsearch/curator
READMEの通り

```
pip install elasticsearch-curator
```

### 使ってみる
現在、
http://qiita.com/hakobera/items/48e15c4bb4cc8110c495
で記載されている方法が使えない模様。
curatorの1.1系から、オプション形式からコマンド形式に変わったぽい

```
# $ curator --host my-elasticsearch --prefix logstash- -b 2 -c 60 -d 90
# こちらのコマンドは、以下のように書ける
$ curator --host my-elasticsearch bloom --older-than 2 --prefix logstash-
$ curator --host my-elasticsearch close --older-than 60 --prefix logstash-
$ curator --host my-elasticsearch delete --older-than 90 --prefix logstash-
```

オプションの順序がまあまあ重要らしく、
```--host```、```--port```などはcuratorコマンドに対するオプションで、
```--older-than```、```--prefix```は```bloom```、```close```、```delete```などのコマンドに対するオプションらしい

[curator wiki](https://github.com/elasticsearch/curator/wiki)

### 他
##### dryrun
```-n```でdry runできるみたい。
これはcuratorに対するオプションとして指定する必要あり

##### 複数コマンド
複数コマンドを一度に実行できないのか？
→できないっぽい。
[Combining Arguments](https://github.com/elasticsearch/curator/wiki/Combined-Arguments)

１行にしたければ、シェルの機能でやれ、と。
tmuxとssh-agentを同時に使う時に環境変数を便利に扱う邪悪な方法

ssh-agent を使えば鍵を転送できるので非常に便利です

しかし tmux と同時に使うと tmux の上で動く shell では古い環境変数を読み込んだままなので環境変数を使う ssh-agent とは非常に相性がよくないです

そこで無理やり tmux の環境変数を消して新しい環境変数を登録し直す邪悪な方法を紹介します

```sh:.zshrc
function tmux-session-refresh () {
  if [ -n "$TMUX" ]; then
    unset $(tmux show-env | sed -n 's/^-//p')
    eval export $(tmux show-env | sed -n 's/$/"/; s/=/="/p')
  fi
}
```

これを `~/.zshrc` とかに登録して `tmux-session-refresh` を実行します

tmux の中でしか動きません

とても邪悪な方法ですが，大体の場合うまくいくので紹介します
インターネットに直接出れないホストで yum する方法

まれによくある次のような構成。

```text
        +-----+
        | gw  |
        +--+--+
           |
+---+---+  |  +-------+    +-------+
| hostA |--+--| hostB |----| hostC |
+-------+     +-------+    +-------+
```

 - hostA からは直接インターネットに出れる
 - hostC からは直接インターネットには出られない
 - hostA から hostC には hostB を経由しなければアクセスできない

この状況で hostC で yum する方法。

## ProxyCommand

hostA から hostC へは ProxyCommand を使えば簡単に接続できます。ググるといろいろ情報は出てきます。

```console:hostA
$ ssh -o "ProxyCommand ssh hostB nc -w 60 %h %p" hostC
```

あるいは、

```console:hostA
$ ssh -o "ProxyCommand ssh hostB -W %h:%p" hostC
```

普通は `~/.ssh/config` に書いておくのでしょうね。

この hostA → hostC の接続を使って hostC から hostA を経由して yum します。

## SOCKS Proxy

hostC の libcurl が比較的新しいバージョンであれば `ALL_PROXY` 環境変数で SOCKS プロキシが指定できるので簡単です。

まずは hostA に SOCKS プロキシを立てます。

```console:hostA
$ ssh -D 1080 localhost
```

次に ssh の `-R` で「hostC → hostA」の方向でポートフォワードしつつ hostC にログインします。

```console:hostA
$ ssh -R 1080:localhost:1080 -o "ProxyCommand ssh hostB -W %h:%p" hostC
```

hostC の 1080 ポートが hostA の 1080 ポートに転送されているので `ALL_PROXY` 環境変数で SOCKS プロキシとして指定しつつ yum します。

```console:hostC
$ ALL_PROXY=socks5h://localhost:1080 yum list
```

`socks5://` と指定すると名前解決が hostC で行なわれます。`socks5h://` と指定すれば名前解決も SOCKS プロキシ（つまり hostA）で行われます。

## HTTP Proxy

CentOS 6 だと libcurl が微妙に古いようで yum の中の curl に SOCKS プロキシを指定する簡単な方法がわかりませんでした。curl そのものは SOCKS プロキシに対応しているようなのですが・・・

なので、hostA で HTTP プロキシを立てることにします。

プロキシサーバなら Squid とか Apache とかでも出来ますが、これだけの用途なら node.js で作るのが簡単かもしれません。

```console:hostA
$ npm install http-proxy@0.9

$ cat <<EOS> fproxy.js
var net = require('net');
var url = require('url');
var server = require('http').createServer();
var httpProxy = require('http-proxy');
var proxy = new httpProxy.RoutingProxy();

server.on('request', function(req, res) {
    var uri = url.parse(req.url);
    proxy.proxyRequest(req, res, {
        host: uri.hostname,
        port: uri.port || 80
    });
});

server.on('connect', function(req, socket, head) {
    var arr = req.url.split(':', 2);
    var conn = net.connect(arr[1], arr[0], function() {
        socket.write("HTTP/1.1 200 OK\r\n\r\n");
        socket.pipe(conn);
        conn.pipe(socket);
    });
});

server.listen(8080, '127.0.0.1');
EOS
```

プロキシサーバを実行します。

```console:hostA
$ node fproxy.js &
```

`-R` でポートフォワードしつつ hostC にログインします。

```console:hostA
$ ssh -R 8080:localhost:8080 -o "ProxyCommand ssh hostB -W %h:%p" hostC
```

hostC の 8080 ポートが hostA の 8080 ポートに転送されているので `ALL_PROXY` 環境変数でプロキシとして指定しつつ yum します。

```console:hostC
$ ALL_PROXY=http://localhost:8080 yum list
```
git & github

##command
###create new branch
```
git branch development
```
###switch existing branch

```
git checkout
```

###check current branch

```git branch```

```
[22:25:38 - 14-07-22] /Users/toripiyo/program/angularjs/logging % git branch
* development
  master
```

### git diff
####check the difference with latest commit

```
git diff HEAD .gitignore
```

####check the difference commits of specific file
```
git diff <commit>..HEAD spec/foo.rb
```

####prevent git from using a pager
```
git --no-pager log
```

###revert specific file to specific commit
```
git checkout <commit> filepath
```

### git log
#### show file name

```
git log --name-status
```

### git reset
#### delete unnecessary commit
http://qiita.com/shuntaro_tamura/items/06281261d893acf049ed

### git reflog
show commit reference

```
git reflog
```

# trouble shooting
## error: cannot lock ref

```
$ git pull
error: cannot lock ref 'refs/remotes/origin/hogehoge/hugahuga': 'refs/remotes/origin/hogehoge' exists; cannot create 'refs/remotes/origin/hogehoge/hugahuga'
From github.com:Org/Repo
 ! [new branch]            hogehoge/hugahuga -> origin/hogehoge/hugahuga  (unable to update local ref)
```

Reason: "hogehoge" file and "hogehoge" dir can't coexist. Reflect latest remote repository info if remote repository no longer has "hogehoge" branch.

```
git fetch --prune
```

# search issues by filter

- by username and repository
    - `repo:hogehoge-user-name/something-repo-name`

#reference
3.1 Git Branching - What a Branch Is
http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is
uuid gem って酷くない？

別に [uuid gem](https://rubygems.org/gems/uuid) を使いたかったわけではないけど、はまったので恨み節 (--;

```rb
class Growl
  def initialize(ip, name = 'ruby-growl')
    @g = ::Growl::GNTP.new ip, name
    @g.add_notification "notification", "#{name}", FAX::FAX_LOGO_PNG
  end

  def notify(title, message, url)
    begin
      @g.notify "notification", title, message, 0, true, nil, url
    rescue Growl::GNTP::UnknownApplication
      @g.register
      retry
    end
  end
end
```

このコードで Linux の /etc/crontab から定期的に Growl の通知を行うようなスクリプトを実行したところ、意味不明な以下のメッセージに悩まされた。

```shell-session
rake aborted!
Permission denied - /.ruby-uuid
```

「.ruby-uuid って何だ？」と思って lib/ruby/ 以下で find したところ、uuid gem の lib/uuid.rb の self.state_file メソッド中に以下のコードが (--;

```rb
    begin
      require 'Win32API'
     （省略）
    rescue LoadError
      state_dir = Dir.tmpdir
    end

    @state_file = File.join(state_dir, 'ruby-uuid')
```

これ、Windows 環境以外だと、特定のアカウント権限でのみ実行している場合には良いけど、複数アカウントで ruby-growl 使ったスクリプトを動かすとおかしなことになるんでは…

とりあえず

```rb
require 'uuid'

class Growl
  def initialize(ip, name = 'ruby-growl')
    UUID.state_file = false
    @g = ::Growl::GNTP.new ip, name
    @g.add_notification "notification", "#{name}", FAX::FAX_LOGO_PNG
  end
```

と UUID.state_file = false することで回避できたので、細かくは追っかけていない。気が向いたらもうチョイ、コードを読むけど、誰か分かる人がいたら本家にパッチでも送ってあげて欲しい。
【Smarty】配列のキーにハイフンを使ったらアウトらしい



#問題

PHPテンプレートエンジンのSmartyで、変数の内容がうまく表示されないという問題がありました。

それは、入力フォームで発生した問題。

```form.html
 <input type="text" name="r1-date" value="{$post.r1-date}">
```

```form.php
$post = $_POST;
$smarty->assign('post', $post);
```

入力欄には日付を"2014/07/22"の形式で入力し、ポストされた日付はvalue の値になる、という仕組みでした。

しかし、何度やっても出力が __0__ （ゼロ）になる。。

どうしたもんか。

#解決策

name とキーの "r1-date" から __ハイフンを取り除いたら__ 解決しました。

```form.html
 <input type="text" name="r1date" value="{$post.r1date}">
```

```form.php
$post = $_POST;
$smarty->assign('post', $post);
```

けっこう長い時間つまっていたのですが、エディタのハイライト機能のおかげで「ハイフンがあやしい」と気づいて解決できました。

#参考
解決した後に見つけた参考サイト。

http://babie.hatenablog.com/entry/20060306/p2
http://tohokuaiki.hateblo.jp/entry/20090525/1243228581
fs.readFileSyncでエンコードの指定をしないとHogan.jsがつかえなかった件

# 背景

STLファイルを吐き出そうとして、Hogan.jsのテンプレートを読み込んで、コンパイルしたらエラー。

# fs.readFileSyncはエンコード指定の有無で返されるオブジェクトが変わる

[APIの説明](http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_options)を読むと以下のような記述されていた。

```
If the encoding option is specified then this function returns a string. Otherwise it returns a buffer. 
```

エンコードの指定がされいないとHogan.jsでテンプレートとして読み込んだ
つもりでも、buffer型のため、charAtメソッドが無いとエラーとなる。

# 関連記事

- [Node.jsで簡単にSTLファイルを作る](http://kjunichi.cocolog-nifty.com/misc/2014/07/nodejsstl-056d.html)
- [node.jsで大きな数を扱う](http://kjunichi.cocolog-nifty.com/misc/2014/05/nodejs-083e.html)
- [Node.jsでパイプを使う外部コマンドを実行するには](http://kjunichi.cocolog-nifty.com/misc/2014/03/nodejs-707a.html)
- [MavericksでNodObjCを試すには](http://kjunichi.cocolog-nifty.com/misc/2013/12/mavericksnodobj.html)
- [Node.jsでデバッガを使う際に必要なたった2つのこと](http://kjunichi.cocolog-nifty.com/misc/2013/12/nodejs2-ac9e.html)
- [[soloved]Mavericksでnode-webclがビルドできた](http://kjunichi.cocolog-nifty.com/misc/2013/10/solovedmaverick.html)
- [Node.jsでコマンドラインアプリを書く　JSONファイル編](http://kjunichi.cocolog-nifty.com/misc/2013/08/nodejsjson-c89d.html)
- [node.jsでHTTPプロキシ経由でhttpsアクセスするには](http://kjunichi.cocolog-nifty.com/misc/2013/06/nodejshttphttps.html)
- [node.jsでhttpsも使えるHttp proxyを書いている](http://kjunichi.cocolog-nifty.com/misc/2012/04/nodejshttpshttp.html)
- [node.jsで顔検出してみた](http://kjunichi.cocolog-nifty.com/misc/2012/08/nodejs-175a.html)
- [node.jsが80番ポートで動かない #windows](http://kjunichi.cocolog-nifty.com/misc/2012/04/nodejs80-window.html)
GitLab | GitLabがデフォルトで連携可能なService群について

# GitLab | GitLabがデフォルトで連携可能なService群について

## 概要
GitLabがデフォルトで連携可能なService群について

GitLabはデフォルトで下記のサービスと連携可能です。

![gitlab_services.png](https://qiita-image-store.s3.amazonaws.com/0/43480/7d5722db-5bb8-9529-189c-738d9c876327.png)

## Assembla

### 公式サイト
https://www.assembla.com/home

### 概要
GitHubなどと同様のリポジトリホスティングサービス。
SVNを無料で利用できるのが特徴。
また、容量制限はあるもののGitHubと異なり無料でprivateリポジトリを利用できるのが特徴。

## Campfire

### 公式サイト
https://campfirenow.com/

### 概要
リアルタイムグループチャットツール。Ruby on Rals製。
Ruby on Railsの作者であるDHHが在籍している会社である、Basecamp(旧37signals)製品。

## Emails on push

### 概要
プロジェクトへのpushに対して、任意のメールアドレスのリストにcommit内容のdiffをメールする。

## Flowdock

### 公式サイト
https://www.flowdock.com/

### 概要
BTS, Wiki, リポジトリ管理ツールなどのリアルタイムな情報を一か所にまとめ
整理・議論などをするために利用されるツール。

## Gemnasium

### 公式サイト
https://gemnasium.com/

### 概要
プロジェクトで利用しているGemの更新情報をチェックしてくれるサービス

## GitLab CI

### 公式サイト
https://github.com/gitlabhq/gitlab-ci

### 概要
継続的インテグレーションサーバー。

## Hipchat

### 公式サイト
https://www.hipchat.com/

### 概要
Atlassian製のチャットツール。
永久に無料で利用できる。

## PivotalTracker

### 公式サイト
http://www.pivotaltracker.com/

### 概要
アジャイルプロジェクト管理ツール。

## Slack

### 公式サイト
https://slack.com/

### 概要
自称21世紀のコミュニケーションツール
開発向けチャットツール。
ソースコードやドキュメントを書くことも可能。
GitLab | GitLabのWebHookのPushイベントをWEBRicで取得してみる

# GitLab | GitLabのWebHookのPushイベントをWEBRicで取得してみる

## 概要
GitLabのWebHookのPushイベントをWEBRicで取得してみます。

## 前提

* 対象リポジトリとして, 自作gem gottani を使ってみます

## 手順

### WebHookを受け取る側のコードを作成します

GitLabのサンプルそのままの最低限のサーバー側コードです。

~~~ruby
require 'webrick'

server = WEBrick::HTTPServer.new(Port: ARGV.first)
server.mount_proc '/' do |req, res|
  puts req.body
end

trap 'INT' do server.shutdown end
server.start
~~~

### 受信側サーバーを起動します

~~~bash
ruby server.rb 8000
~~~

### WebHookを登録します

GitLabのプロジェクトメニューのSetting=>Web HooksからURLを登録。
登録後の画面が以下です。

![add_webhooks.png](https://qiita-image-store.s3.amazonaws.com/0/43480/e54814f6-9652-0473-69f1-d860ffc4db7d.png)

### gottani プロジェクトを適当に変更して *push* します

~~~bash
$ echo hige > hige.txt
$ git add hige.txt
$ git commit -m "Add hige.txt"
$ git push origin master
~~~

### 受信を確認できました

~~~bash
$ ruby server.rb 8000
[2014-07-22 23:28:35] INFO  WEBrick 1.3.1
[2014-07-22 23:28:35] INFO  ruby 2.0.0 (2014-02-24) [i386-mingw32]
[2014-07-22 23:28:35] INFO  WEBrick::HTTPServer#start: pid=2316 port=8000
{"before":"a1b404795c2285662b6bba049320703abaf8f74b","after":"e44542e4f4b6cab353563a2807b7df7e0b3b765e","ref":"refs/heads/master","user_id":4,"user_name":"some_group","project_id":110,"repository":{"name":"gottani","url":"git@some_path:some_group/gottani.git","description":"GitLab CIテスト用","homepage":"http://some_path/some_group/gottani"},"commits":[{"id":"e44542e4f4b6cab353563a2807b7df7e0b3b765e","message":"Add hige.txt","timestamp":"2014-07-22T13:05:25+09:00","url":"http://some_path/some_group/gottani/commit/e44542e4f4b6cab353563a2807b7df7e0b3b765e","author":{"name":"some_user","email":"some_group@example.com"}}],"total_commits_count":1}
some_path - - [22/Jul/2014:23:28:40 JST] "POST / HTTP/1.1" 200 0
- -> /
~~~
RuboCop | Style/Semicolon

# RuboCop | Style/Semicolon

## 概要

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

セミコロンによって、同一行に複数ステートメントを記述しているかをチェックします。
デフォルトではセミコロンによる複数ステートメントの記述を認めません。

## Semicolon

各設定値での検証結果をまとめます。

### 検証プログラム

~~~ruby:predicate_name.rb
msg = 'hoge'; print msg
~~~

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

~~~yaml:.rubocop.yml
Semicolon:
  AllowAsExpressionSeparator: false
~~~

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

Offenses:

semicolon.rb:1:13: C: Do not use semicolons to terminate expressions.
msg = 'hoge'; print msg
            ^

1 file inspected, 1 offense detected
~~~

### 実行結果 独自定義で _hoge を追加, is_/has_/have_ は無効にします

~~~yaml:.rubocop.yml
Semicolon:
  AllowAsExpressionSeparator: true
~~~

~~~bash
$ rubocop semicolon.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Phalcon で Flash を拡張してみる

エラーメッセージなどをビューで表示する際には Phalcon では flash を使うときがあるが，これの見た目を変えたいと思うこともある．ここでは Flash を拡張して bootstrap の見た目を使うようにしてみる．

# コード

bootstrap のアラートを使うようにするコード．何も設定してなければ bootstrap で使われてる class 名を指定するようにしている．

```php:Bootstrap/Flash/Session.php
<?php

namespace Bootstrap\Flash;

use Phalcon\Flash\Session as PhFlash;

class Session extends PhFlash
{
        public function __construct($cssClasses = null)
        {
                if ($cssClasses === null) {
                        $cssClasses = array(
                                'success' => 'alert alert-success',
                                'notice'  => 'alert alert-info',
                                'warning' => 'alert alert-warning',
                                'error'   => 'alert alert-danger',
                       );
                }
                parent::__construct($cssClasses);
        }
}
```

同じように bootstrap を使ってアラートを表示してさらに閉じられるようにするクラス．
与えられた class 名に fade in を追加している．

```php:Bootstrap/Flash/Closable.php
<?php

namespace Bootstrap\Flash;

class Closable extends Session
{
        public function __construct($cssClasses = null)
        {   
                if (is_array($cssClasses)) {
                        $cssClasses = array_map(function ($cssClass) {
                                return $cssClass.' fade in';
                        }, $cssClasses);
                }   
                parent::__construct($cssClasses);
        }   

        public function message($type, $message)
        {   
                $button = '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">x</button>';
                parent::message($type, $button.$message);
        }   
}
```

使う場合は DI で flash コンポーネントがこれらのクラスのインスタンスを返すようにする．

```php:config/service.php

$di['flash'] = function () {   
     return new Bootstrap\Flash\Closable();
}; 
```



# 動作例



例えばこんなメッセージを出してみる．

```php:controllers/IndexController.php
<?php

use Phalcon\Mvc\Controller;

class IndexController extends Controller
{
    public function indexAction()
    {
        $this->flash->success('Well done! You successfully read this important alert message. ');
        $this->flash->notice('Heads up! This alert needs your attention, but it\'s not super important. ');
        $this->flash->warning('Warning! Better check yourself, you\'re not looking too good. ');
        $this->flash->error('Oh snap! Change a few things up and try submitting again. ');
    }
}
```

ここでは bower で bootstrap を入れてるので components ディレクトリで指定している．

```twig:views/index.volt
<!DOCTYPE html>
<html>
<head>
    <title>Phalcon PHP Framework</title>
    {{ stylesheet_link('components/bootstrap/dist/css/bootstrap.min.css') }}
</head>
<body>
    {{ content() }}
    {{ javascript_include('components/jquery/dist/jquery.min.js') }}
    {{ javascript_include('components/bootstrap/dist/js/bootstrap.min.js') }}
</body>
</html>
```

```twig:views/index/index.volt
<div class="container">
    {{ flash.output() }}
</div>
```

表示してみるとこんな感じ．x を押すと消える．

![screenshot 2014-07-22 20.53.01.png](https://qiita-image-store.s3.amazonaws.com/0/6975/d91dd8a1-b2e2-d9f5-42f4-d7ba0a978132.png)
Yahoo!スタティックマップAPIにおける画像の扱いについて

Yahoo!スタティックマップAPIを用いたアプリケーションを制作しています。
その中で、禁止事項に抵触する恐れのある行為に関しての質問です。

1.出力されたマップ画像をバイナリデータとしてローカルにキャッシュし、アプリ内　のみに使う用途においてデータの読み書きを行う行為は可能でしょうか（この行為　がYOLPの利用方法2-5の『外部出力』に当たるかどうか）。

2.取得した地図画像に対する処理についてです。
　いずれも、base:simpleで、文字情報をオフにした画像に対する処理です。

・取得された画像に対して、特定の色成分を強くするフィルタを上からかける処理。
　もしくは画像リクエスト時に、ポリゴンを半透明にして画像全体を覆い、色合いを　変える行為。

・取得された画像に対して、ピクセルの色を見て、道や地面などの色を別の色に置き　換える処理（白→緑、灰色→白などに置き換える。道の一部を消すなど、地図の　　データの一部を損なうような処理ではない）。

はそれぞれ可能でしょうか。
YOLPの禁止事項には、
5.地図上に付されている表示を改変、削除（表示を判読できなくする行為を含みます）してはならないものとする。
とあるため、こちらとしては「出力された画像にはいかなる編集も出来ないのでは」という認識でいます。

お手数ですが、ご回答の程お願い申し上げます。
Linux とかでも Unicode 絵文字を表示するためのフォント

[Symbola フォント](http://users.teilar.gr/~g1951d/)か、Google 製の絵文字フォントである <del>[AndroidEmoji.ttf](https://github.com/android/platform_frameworks_base/blob/master/data/fonts/AndroidEmoji.ttf)</del> 改め [Noto Emoji](http://www.google.com/get/noto/#emoji-qaae) などが使えます。

Symbola フォントは Unicode の例示字形をそのまま用いているものであるため、Noto Emoji や Apple Emoji ほどファンシーではありません。
また、Noto の絵文字フォントには Android などで使われている Noto **Color** Emoji もありますが、一般的な Linux のデスクトップ環境では色付きの絵文字フォントをモノクロでしかレンダリングできません。


# スクリーンショット

撮影環境は Arch Linux + Xfce です。

## Symbola

![スクリーンショット_2016-01-02_11-09-13.png](https://qiita-image-store.s3.amazonaws.com/0/32911/64724cf8-c68b-d974-05c8-9aaba2ff7fb8.png)

## Noto Emoji

![スクリーンショット_2016-01-02_11-06-01.png](https://qiita-image-store.s3.amazonaws.com/0/32911/f0e78a82-f0a9-c66f-d37d-734e84ba1ecd.png)

## Noto Color Emoji

![スクリーンショット_2016-01-02_11-03-14.png](https://qiita-image-store.s3.amazonaws.com/0/32911/1531ab74-dac3-73b4-bfb2-f62f5e38c956.png)

# インストール方法

主要な Linux distro では、以下のようにパッケージとして提供されているようです:

| distro | Symbola | Noto Emoji |
|---|---|---|
| Ubuntu | [`ttf-ancient-fonts-symbola`](http://packages.ubuntu.com/search?keywords=ttf-ancient-fonts-symbola) | - |
| Debian | [`ttf-ancient-fonts`](https://packages.debian.org/search?keywords=ttf-ancient-fonts) | - |
| Arch Linux  |  [`ttf-symbola`](https://www.archlinux.org/packages/community/any/ttf-symbola/) | [`noto-fonts-emoji`](https://www.archlinux.org/packages/extra/any/noto-fonts-emoji/) |
| CentOS, Fedora, RHEL | [`gdouros-symbola-fonts`](http://rpm.pbone.net/index.php3?stat=3&search=gdouros-symbola-fonts&srodzaj=3) | - |

## 手動でインストールする

Symbola は、[Web サイト](http://users.teilar.gr/~g1951d/)から手動でダウンロードできます。
Noto Emoji も、[Google のページ](http://www.google.com/get/noto/#emoji-qaae) や [GitHub](https://github.com/googlei18n/noto-emoji/tree/master/fonts) からダウンロードできます。

ダウンロードしたフォントを Linux デスクトップ環境に手動でインストールするには、以下のような手順をとれば良いはずです:

1. フォントファイルを `$HOME/.fonts/` や `/usr/share/fonts/` 以下の適当なところにコピー
1. 端末で `fc-cache -fv` を実行してフォントキャッシュを再構築

余談ですが、mozc は簡単に単語から絵文字へ変換できます (例: `すし` で変換して :sushi: を出せる)
Vim から migemogrep を使う方法

# migemogrep とは

https://github.com/peco/migemogrep

migemogrep は kaoriya 氏によって開発されている [gomigemo](https://github.com/koron/gomigemo) を使用し、[peco](https://github.com/peco/peco) から migemo 検索をする為だけに作られた外部コマンドです。動機は peco ですが、通常の grep として使えたら便利だろうなと思いましたので、grep としても使える程度の実装を目指しています。現在バージョンは 0.1.0 ですが、0.1.1 がリリースされた際にはとても有用な外部コマンドとなる予定です。

# インストール

0.1.1 がリリースされた際にはバイナリパッケージも用意される予定です。以下待ちきれない人向けのビルド手順です。

```bash
$ go get github.com/peco/migemogrep
```

# Vim から使おう

migemogrep のリポジトリに `misc/vim` というフォルダが含まれていますので、それをローカルにコピーして頂くか、rtp に追加します。以下はvimrcで動的にrtpを追加する場合のコードです。

```
exe "set rtp+=" . globpath(substitute($GOPATH, (has('win32')||has('win64'))?';':':',',','g'), 'src/github.com/peco/migemogrep/misc/vim')
```

あとは

```
:MigemoGrep sonomasakada **/*
```

といった具合にお使い下さい。
ブロックの仮引数をテキストオブジェクトとして扱う

`|`で囲まれたブロックの仮引数を変更したいときに、`ci|`で変更できるよう、[vim-textobj-user](https://github.com/kana/vim-textobj-user)の設定をした。


```vim:.vimrc
" vim-textobj-user
call textobj#user#plugin('charpairs', {})
call textobj#user#plugin('charpairs', {
\   'bar_a': {
\     'pattern': '|[^|]*|',
\     'select': 'a<Bar>'
\   },
\   'bar_i': {
\     'pattern': '|\zs[^|]*\ze|',
\     'select': 'i<Bar>'
\   }
\ })
```

1度、空の辞書を渡しているのは、キーの名前(`bar_a`など)を変更したときに、
古いキー名を参照してしまい、エラーになるのを回避するため。

あと、`virtical_bar_a`のように、`_a`と`_i`の箇所以外にアンダースコアがある名前は使えなかった。

参考サイト：
['*pattern*': [a, b] does not work when a and b are equal #15](https://github.com/kana/vim-textobj-user/issues/15)

　
**追記：**
[vim-textobj-between](https://github.com/thinca/vim-textobj-between/blob/master/doc/textobj-between.txt)でもキーマップを変更すれば、`ci|`でブロックの仮引数をテキストオブジェクトとして扱えるが、
上述の[vim-textobj-user](https://github.com/kana/vim-textobj-user)と違い、カーソルが`|`で囲まれた内側にいる場合のみ有効。

```vim:.vimrc
" vim-textobj-between
let g:textobj_between_no_default_key_mappings = 1
vmap i<Bar> <Plug>(textobj-between-i)<Bar>
omap i<Bar> <Plug>(textobj-between-i)<Bar>
vmap a<Bar> <Plug>(textobj-between-a)<Bar>
omap a<Bar> <Plug>(textobj-between-a)<Bar>
```
herokuで詰まったところいろいろ

##SSHの鍵追加でAuthentication failureになったときの対処
`heroku keys:add`でherokuに公開鍵を追加しようとした際、以下のようなエラーが発生。

```bash:GitBush
$ heroku keys:add
Found existing public key: C:/Users/ユーザ名/.ssh/id_rsa.pub
Uploading SSH public key C:/Users/ユーザ名/.ssh/id_rsa.pub... Authentication
failure
```

私の場合、直前にインストール・設定を行っていたheroku-accountsプラグインの動作とバッティングしていた模様。
>http://stackoverflow.com/questions/22957664/authentication-failure-in-heroku-cli-after-password-change

ここを参考に、heroku-accountsプラグインをアンインストール。

```bash:GitBush
heroku plugins:uninstall heroku-accounts
rm -r ~/.heroku/accounts
heroku logout
heroku login
```

これで無事鍵追加できた。

##'git_url' does not appear to be a git repositoryと出てpushできないときの対処
以下のようなエラーが出てpushできなかった。

```bash:GitBush
$ git push heroku master
fatal: 'git_url' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

`'git_url'`がリポジトリじゃないよと言っているような気がする。

```bash:GitBush
$ heroku create templa
Creating name... done, stack is stack
web_url | git_url
Git remote heroku added
```
herokuアプリをcreateしたときに上記のようなメッセージが出ており、また`Git管理フォルダ/.git/config`のリモートリポジトリの定義が

```:Git管理フォルダ/.git/config
[remote "heroku"]
	url = git_url
	fetch = +refs/heads/*:refs/remotes/heroku/*
```
となっていた。


```:Git管理フォルダ/.git/config
[remote "heroku"]
	url = git@heroku.com:templa.git
	fetch = +refs/heads/*:refs/remotes/heroku/*
```

上記のように書き換え再度pushしたところ、無事実行できた。

##静的なファイルを置くだけのデプロイをしたい時
普通にpushすると以下のようなエラーが出てしまう。
静的なファイルのみの配置はサポートされていない模様？

```bash:GitBush
 !     Push rejected, no Cedar-supported app detected
```
そこで、index.phpを作成・コミットし、デプロイするファイルに含める。
そうするとpushを受け入れてくれるようになる。
現状のtypescript-railsの対応状況


# はじめに

RailsでTypeScriptを使いたいと願う方は多いのではないでしょうか。
すでに有志の方でいくつか試みがなされておりまして、現在Rails4.1で「一応」利用できる状況になっています。

~~`typescript-rails`というGemを導入することにより利用可能なのですが、元々の開発者の方がメンテを止められてしまい（？）、今は他の方がフォークして改良されています。~~

日本人の[gfx](https://github.com/gfx)さんがメンテナーになられたようです。素晴らしい！　ありがとうございます。

そのもうちょっと詳しい経緯についてはこちらの記事を参照してください。
[Rails初心者がRails4でTypeScriptを使えるようにするまでのお話](http://qiita.com/funnythingz/items/)

# 導入方法

Gemfileに以下のように記述して導入します。

```gemfile
...(途中省略)...
gem "typescript-rails", '~> 0.4.0'

```

で、利用するときは
`{RAILS_ROOT}/app/assets/javascripts/`以下に、拡張子`js.ts`を付けて、TypeScriptファイルを書いていきます。

# 細かい話

さて、以下の記事によると、
[RailsでTypeScript、再び](http://tkawachi.github.io/blog/2013/04/25/typescript-and-rails-again/)

この記事当時では`/// <reference>`を使うに当たり、色々と不便があったようです。コンパイル時に違う場所にjs.tsファイルがコピーされてそこでコンパイルが行われるため、参照先を絶対パスで指定しなければならず、そのためにわざわざ拡張子を.js.ts.erbにして、

```
/// <reference path="<%= File.join(File.dirname(__FILE__), "jquery.d.ts") %>" />
```

のように指定する必要が（当時は）あったようです。

しかし、今度は.js.ts.erbのファイルを他のjs.tsファイルから参照することが拡張子の関係でできないという、非常に不便な状況であったらしいですね。

で、現在はどうなっているのか。

一応、解決してます。

が、どうやって解決されているのかというと、例えば次のようなファイルがあるとするじゃないですか。

```people.js.ts
class People {
    public name:string = "Adam";
}
console.log("People!!");
```

```game.js.ts
/// <reference path="people.js.ts" />

class Game {
    public main() {
        console.log("Game Main!");
    }
}
```

アセットパイプラインによるコンパイル時には、こうなります。

```people.js?body=1
var People = (function () {
    function People() {
        this.name = "Adam";
    }
    return People;
})();
console.log("People!!");
```

```game.js?body=1
var People = (function () {
    function People() {
        this.name = "Adam";
    }
    return People;
})();
console.log("People!!");
/// <reference path="/Users/hogehoge/Dropbox/Program/RailsProject/app/assets/javascripts/people.js.ts" />
var Game = (function () {
    function Game() {
    }
    Game.prototype.main = function () {
        console.log("Game Main!");
    };
    return Game;
})();

```

ま、まるまるコピーされてる！？(ﾟдﾟ)！
確かに、これなら依存関係も解決できるしコンパイルも通るけど、直球すぎやしませんかこれ。
ちなみ、`bundle exec rake assets:precompile RAILS_ENV=production`してuglifyしてもこの重複は除去されません。大規模なコードになってきたら、これって結構問題じゃないかなぁ。
それに、クラス定義だけでなく、まるまるコードがコピーされているんで、people.js.tsにベタに書いている`console.log("People!!")`もコピーされた結果、二重に実行されています。ここらへん気をつけないといけませんね。

というわけで、一応現状のtypescript-railsの対応状況はこんな風になっています。

まともな用途で使うかどうかは……皆様のご判断にお任せします。

でも僕は趣味で使うぉ（＾ω＾）

# 参考情報

* [Rails初心者がRails4でTypeScriptを使えるようにするまでのお話](http://qiita.com/funnythingz/items/2563542611a18fd98a13)
* [Rails で TypeScript を動かそうとして失敗した記録](http://tkawachi.github.io/blog/2012/12/09/trying-typescript-rails-out/)
* [RailsでTypeScript、再び](http://tkawachi.github.io/blog/2013/04/25/typescript-and-rails-again/)

# 最後

TypeScript好きなくせにスキルは初心者なので、もしかしてこの記事の内容に関して私の思い込みとか勘違いがあるかもしれません。間違いがあると思わしき場合は、遠慮なくコメントくださいませ。
Docker: コンテナのlocaleを設定したい


DockerでbuildしたイメージはロケールがPOSIXになっている。これに起因して、文字コード変換まわりの不具合が発生したりする。

```console
% locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```

よくあるLinuxのTipsとして `/etc/default/locale` をセットすればデフォルトのロケールを変更できるが、docker runしただけではこのファイルが読み込まれないらしくDockerでは通用しない。

[dotcloud/dockerのissue](https://github.com/dotcloud/docker/issues/2424#issuecomment-27269233)でもこれについての質問があったが、中の人の回答ではENVとして設定すればいいとのこと。


そしてこれがDockerfileに書く設定

```
RUN locale-gen en_US.UTF-8  
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8
```

※この設定はUbuntuで効果があるとのことなので、[CentOSはこの方法](http://qiita.com/yuki2006/items/6cea8c352e38f047b52a#comment-8e863c71962008035d0d)でやってみてください


これでdocker buildすればデフォルトのロケールが変更される。

```console
% locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
```
SwiftにおけるSingletonパターン実装方法がBeta4でついに完成！？


過去に３回ぐらい`Singleton`パターンの記事を見かけた事がありますが、Singletonパターンと言い張るためには「インスタンスが１つしか生成されない事を保証する」という約束ごとがあります。

Beta3まではこれが言語仕様的に困難であり、過去に紹介されてきたものは
**「なんちゃってSingletonパターン」**だったわけなのですが、Xcode6 Beta4でアクセスコントロールが可能になり、ついに１インスタンスを保証する事ができるようになりました。

```swift:サンプルコード
class Singleton {
    private init() { // 1.イニシャライザをprivateに
        
    }
    class var instance: Singleton { // 2.インスタンスを取得するためのプロパティなり関数なりを用意し、共有インスタンスを返す
        struct Instance {
            static let i = Singleton()
        }
        return Instance.i
    }
}

println(Singleton.instance === Singleton.instance) // true
        
let newInstance = Singleton() // コンパイルエラー（新しいインスタンスは生成できない ※ただし同じswiftファイル内からは生成できてしまうので別ファイルにするなど、注意が必要です(^_^;）
```

名前の付け方(instanceプロパティ)については、ちょっと悩みますね(sharedにすべきか等)。

## Swift 1.2 での実装方法(2015/02/11追記)

クラスでも静的なプロパティが宣言できるようになりましたので、よりシンプルに書くことができるようになりました。

```swift:
class Singleton {
    private init() { // 1.イニシャライザをprivateに

    }
    static let instance = Singleton() // 2.staticとしてインタンスを用意
}
```

release noteによると、最初に静的プロパティへアクセスしたときに初期化が行われるようなので、振る舞いとしても問題なさそうです。

[2017/05/15追記]
以前の記事では`final class`にしてたのですが、イニシャライザを`private`にした時点で派生クラスを生成することはできないと思いますので（？）削除しました（間違っていたらツッコミお願いします）。

## シングルトンパターンの弊害

シングルトンパターンは便利なようで弊害も結構ありますので、本当にシングルトンにすべきかどうかは良く検討した方が良いです。

参考：[[プログラマ97]シングルトンパターンの誘惑に負けない](http://d.hatena.ne.jp/asakichy/20110803/1312323474)


私の周りの実体験だと、開発チームAが以下のような設計のアプリを開発

* データクラスが複数あって、それぞれがシングルトンパターンで実装されている
* データをバイナリファイルから読み込むと他の複数のシングルトンのデータクラスへそのデータを詰め込む感じ

以上が扱うデータは「個人」のデータとします。

後々、開発チームBがこの個人データを複数読み込み、数百人分のデータを集計したり様々な表やグラフにしたりするようなツールを開発することになりました。
（あらかじめ集計ツールが開発される事は予想されていた。）

集計ツールは若いエンジニアが担当したのですが、データクラスが`Singleton`なので、複数のデータがメモリにロードできない（＝ソースが流用できない）ってんで困り果ててました（`Singleton`よいうよりエンジニア同士のコミュニケーション不足のような気もしますが最初から集計しやすいように作っておいてほしかった...）。
Dartでの環境構築のメモ(ubuntu)

Dartlangの環境構築についてメモを残しておきます。

###1.Dartを落としてくる。

自分のバージョンにあったものを落としてきてください。公式サイトの一番初めにあります。

[Dart: Structured web apps](https://www.dartlang.org/)

###2.適当なディレクトリに解凍する。

僕は/bin以下に解凍しました。どこでも構わないと思います。

###3.PATHを通す。

簡単なことですが忘れがちです。~/.bashrcに追記しておきましょう。僕の場合はこのようになります。

```zsh
PATH=$PATH:/bin/dart/dart-sdk/bin
PATH=$PATH:/bin/dart 
```

###4.lib32stdc++6を入れる。

もし入っていなければこれを入れてください。ubuntuなら

```zsh
apt-get install lib32stdc++6
```

をすれば簡単に入れられるはずです。

Dartiumなどが入っていない場合は[ここから](https://www.dartlang.org/tools/download.html)インストールしてください。

それでは皆さん、楽しいDartlang Lifeを。

###2014/8/26 追記

Google+においてアドバイスを頂いたので、追記しておきます。

最近のubuntuで、libudev.so.0がlibudev.so.1に変わっているものがありますが、この場合libudev.so.1からlibudev.so.0にsymlinkを貼らないと、Dartiumが動かない状態になっています。

symlinkを貼る方法はこちらのサイトをどうぞ。

[installation - Dart Ubuntu Server 14.04 how to install missing library for Dartium - Stack Overflow](http://stackoverflow.com/questions/25191210/dart-ubuntu-server-14-04-how-to-install-missing-library-for-dartium)

ご指摘してくださったKazutoshi Takemoto様、本当にありがとうございました。