OmniAICreator/Qiita-1.07M huggingface dataset:
ディレクトリ指定できるコマンドのオプションまとめ

ディレクトリ指定できるコマンドのオプションまとめ
====================

* `wget -P`

```bash
$ wget -P target_dir http://example.com/
```

* `tar -C`

```bash
$ tar zxvf aaa.tar.gz -C target_dir
```

* `unzip -d`

```bash
$ unzip aaa.zip -d target_dir
```

* まだまだたくさんあるので随時まとめていきます
twitter-bootstrap-railsでbootswatchを使う

twitter-bootstrap-railsでbootswatchを使う
=========================

## 環境
* Ruby 2.0.0-p0
* Rails 4.0.0.beta1

## 手順

* rails プロジェクト作成

```bash
$ rails new rails-project
$ cd rails-project/
```

* twitter-bootstrap-rails のインストール

```bash
$ vim Gemfile
```
```rb
# To use twitter-bootstrap-rails (less)
gem "therubyracer"
gem "less-rails" #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
gem "twitter-bootstrap-rails"
```
```bash
$ bundle install
$ rails generate bootstrap:install less
```

* layout作成

```bash
$ rails g bootstrap:layout application fluid
```

* 試しにscaffoldでページを作る

```bash
$ rails g scaffold Post title:string description:text
$ rake db:migrate
$ rails g bootstrap:themed Posts
```

* デフォルトページ設定

```bash
$ vi config/routes.rb
```
```rb
- # root to: 'welcome#index'
+ root to: 'posts#index'
```

* rails server起動 (localhost:3000を確認)

```bash
$ rails s
```

* bootswatch のインストール
    * 例として cerulean を使っています

```bash
$ mkdir vendor/assets/stylesheets/bootswatch
$ wget -P vendor/assets/stylesheets/bootswatch http://bootswatch.com/cerulean/variables.less
$ wget -P vendor/assets/stylesheets/bootswatch http://bootswatch.com/cerulean/bootswatch.less
```

* app/assets/stylesheets/bootstrap_and_overrides.css.less でimportする

```bash
$ vi app/assets/stylesheets/bootstrap_and_overrides.css.less
```
```css
@import "twitter/bootstrap/bootstrap";
@import "twitter/bootstrap/responsive";
+ @import "bootswatch/variables.less";
+ @import "bootswatch/bootswatch.less";
```

* 確認
    * localhost:3000 にアクセスして http://bootswatch.com/cerulean/ と同じ配色になっていることを確認する

## 参考
* https://github.com/haman29/twitter-bootstrap-rails-bootswatch-sample
    * githubに上げました
* http://tkawachi.github.com/blog/2013/01/04/use-bootswatch-with-rails/
* https://github.com/seyhunak/twitter-bootstrap-rails
Project Euler #71 Ordered fractions

[Ordered fractions](http://projecteuler.net/problem=71:Ordered fractions)

回答者12459人。

HaskellはRationalを扱うのが楽だ。
ただ問題の意味は簡単だけど、愚直にやると引数が200000あたりから`Stack space overflow: current size 8388608 bytes.`とすぐに言われてしまうので、空間計算量を広げないようにするために試行錯誤してみたが、慣れればもっとスマートにやれるかも。
参考: http://www.kotha.net/hperf/basics.html

※回答に確実に至る方法を公開するのはNGらしいのでコードを削除しました
Railsで、あるモデルに関連付けて別のモデルを保存するには

例：現在のUserに関連付けられたRecordを保存する

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :current_user

  private
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end
```

```ruby:app/controllers/record_controller.rb
  def create
    #@record = Record.new(params[:record])
    @record = current_user.records.new(params[:record])
```

```erb:app/views/records/_form.html.erb
<%= form_for(@record) do |f| %>
  <% if @record.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@record.errors.count, "error") %> prohibited this record from being saved:</h2>

      <ul>
      <% @record.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <!--<div class="field">
    <%#= f.label 'user id' %><br />
    <%#= f.text_field :user_id %>
  </div>-->
  <div class="field">
    <%= f.label :weight %><br />
    <%= f.text_field :weight %>
  </div>
  <div class="field">
    <%= f.label :memo %><br />
    <%= f.text_area :memo %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
ターミナルで使える色一覧（8色ANSIエスケープシーケンス）

標準出力に何かを出力するスクリプトを書いている時、私はよく文字に色を付けるようにしています。色を付けることで、注目すべき箇所（エラーや、例えばその行番号など）に目が行きやすくなったり見落としが減ったりして、作業効率が上がります。

色付けは簡単で、 `ESC` `[` `色コード` `m` の順番で色付け開始、`ESC` `[` `0` `m` で色付け終了、になります。
`ESC` は、エスケープ文字と言って、16進数で 0x1b 、8進数で 033、10進数で 27 の文字コードです。

シェルスクリプトだと、例えばこうします。
```echo "foo \033[32mbar\033[0m baz"
```

・・・とここまではいいのですが、だいたい色出力をさせようとすると、どの色を使うのいいのか、実際に出力させて試行錯誤することになります。このとき、何番が何色なのかをいちいち調べていると面倒でイラッとします。そこで、私はいつも次のスクリプトをつかって、実際の色を確認しています。

```ruby:color.rb
#!/usr/bin/env ruby

print "  --   "
for b in 40..47
  s = b.to_s
  print "\033[", s, "m    ", s, "   \033[0m "
end
print "\n"
for c in [ 30, 31, 32, 33, 34, 35, 36, 37, 90, 91, 92, 93, 94, 95, 96, 97 ]
  s = c.to_s
  print "\033[", s, "m ", s, "   \033[0m "
  for b in 40..47
    s = c.to_s + ";" + b.to_s
    print "\033[", s, "m ", s, "   \033[0m "
  end
  print "\n"
  for a in [ 1, 4 ]
    s = c.to_s + ";" + a.to_s
    print "\033[", s, "m ", s, " \033[0m "
    for b in 40..47
      s = c.to_s + ";" + b.to_s + ";" + a.to_s
      print "\033[", s, "m ", s, " \033[0m "
    end
    print "\n"
  end
end
```

実行結果は、↓こんな感じになります。

![スクリーンショット](http://www.nmn.jp/~hidai/tmp/colorlist-terminal.png)
readするときはIFS=を付けておくとstrictな感じで気持ちが良い

`while read`するなら`while IFS= read`した方が良いかもよっていう話です。

説明は後にして、まずはlsしたファイル名をechoする例で違いを見てみます。

```
$ touch " abc  " "ho  ge" $'\txyz' #3つのファイルを作成します

## 普通にwhile readした場合
$ ls | while read f; do echo "[$f]"; done
[xyz]
[abc]
[ho  ge]

## IFS= を付けた場合
$ ls | while IFS= read f; do echo "[$f]"; done
[	xyz]
[ abc  ]
[ho  ge]
```

違いは一目瞭然ですね。単にreadをした場合は、前後のタブや空白が全て消えてしまっていますが、IFS= をつけた場合はタブや空白もオリジナルのまま読み込めています。ちなみに *ho  ge* の間は空白2つなんですが中にある空白文字はIFS関係なしにそのまま残ります。


## 解説
ここで登場した`IFS`ってのはbashの環境変数で、デフォルトでは`$' ¥t¥n'`(スペース・タブ・改行)が入っています。bashはこれらの文字を単語の区切りとして認識することになっており、結構色んな所で使われている値です。
普段意識することは少ないですが、この存在を忘れているとイリーガルなケースに出会ったときに痛い目を見ることになるので頭の片隅で常に意識しておいたほうが良いでしょう。

さて上記の例の説明ですが、前者の例では前後の半角スペースとタブがIFSに含まれるために消されてしまっています。後者は勝手に文字を消されるのを防ぐために`IFS= `を付けてIFSに空文字を代入した状態でreadを実行させています。そのおかげで変数には無加工の値を得ることが出来ました。


##注意
ちなみに IFS= をやるのは基本 IFS= read foo のようにコマンドの前に付けてコマンドと一緒に実行するようにしておきましょう。
もし普通に IFS= とだけ書いて現在のシェルの変数自体をを変更してしまうと、デフォルトに想定していた挙動が変わってしまうため、色んな部分で想定外の不具合が出てくる可能性がありますので注意です。
パイプ出力を現在のシェル上のwhileに喰わせる上手いやり方

ここに書くTipsは、そもそもパイプとwhileにまつわる問題を経験したことないと何を言ってるか分からないと思うのでまず経緯から書く。

## よくやる失敗例
シェルスクリプトを書いていると以下の様に`while`と`read`を組み合わせたコードを書くことがよくあります。

```bash
find -type f | while read -r f; do
  echo "$f" #ここのコードは色々
done
```

これはコマンドの標準出力を1行ずつ f という変数に読み込んで何らかの処理を行うってやつです。
whileの中でやることがファイル操作などの一般的なことならこれで全然問題ないんですが、実行中のシェル環境に対する処理（具体的には変数の設定など）を行おうとすると期待通りにいってくれなくなります。例えばこんな感じ↓

```bash
# findで見つけたファイル名をfilesという配列変数に詰め込みたい
files=()
find -type f | while read -r f; do
  files+=("$f")
done
echo "${files[@]}" # 確かにfilesに値を入れた筈なのに空が出力される？？
```

これはパイプで繋げると後ろのwhileがサブシェルで実行されてしまうために起こる現象です。噛み砕いて説明すると…

- 現在findを実行中のbashとは別に、パイプの後ろでもう一つのbashが起動されてその子プロセスのbash上でfiles変数をセットしていることになります。
- すると当然、子プロセスが終了(whileの全てが終了)した時点で子bashプロセス上に設定されたfiles変数の中身も消え去ります。
- 親プロセスのfilesは最初に初期化したままなので空が出力されることになります。


## 解決編
これ実は上手い解決策に結構悩みます、パイプしたいのにパイプすると駄目なんだから…あーもー。となって、んで一時ファイルを作ってから <tmpfile とかで標準入力に流しこでとりあえず解決しちゃったりするわけです。ですがそうすると一時ファイルの後処理をしなくちゃいけないし見た目も汚いしでやっぱ気持ち悪いです。

そこで登場するのが [Process Substitution](http://qiita.com/items/98768ba5eea8d6fe6a19) という機能です。よく2つのコマンドの標準出力のdiffを取るとかの例で紹介されてるやつです。この機能が今回のwhile問題にも活用出来ます。
まずは上述の失敗例を解決したコードを書いてから説明します。

```bash
# findで見つけたファイル名をfilesという配列変数に詰め込みたい
files=()
while read -r f; do
  files+=("$f")
done < <(find -type f)
echo "${files[@]}" # 期待通りファイル名の一覧が出力される！
```

まぁ見たまんまですが、結構これが思いつかないんですよね(^^;

ただし1つだけ注意点があって、標準入力に突っ込む`< <(...)`のところですが`<`と`<(...)`の間にスペースを空けてるのが重要です。この空白が無いと`<<`がヒアドキュメントの開始と解釈されてエラーになってしまいます。それさえ気をつければOKです。

まぁ、シェルスクリプト書きまくってる人でもなければあまり使うケースは無いかもしれませんが、覚えておくと便利です。
標準出力をファイルのように扱う方法、例えば2つのコマンドの出力結果のdiffを取るとか

結論を先に書くと↓例えばこんなことが出来ます。

```bash:
diff <(command1) <(command2)
```

これは以下のようなことを、一時ファイルを作らずに行なっているのと同じです。

```bash:
command1 > out1
command2 > out2
diff out1 out2
rm -f out1 out2
```

これは **Process Substitution** という名前の機能です。

ちなみに `echo <(command)` すると `/dev/fd/63` などと表示されます。
これは一時的に作られたファイルディスクリプタの名前で、そのファイルディスクリプタは実行された`command`の標準出力に繋がっており、他のプログラムからはファイルと同じように扱うことが出来る、というわけです。
とっても便利なので、覚えといて損はないです。
Alfredから特定のサイトをブラウザの新規タブで開く

MacのランチャーAlfredのCustom Searchesの機能を利用して、キーワードで直接開く事ができます。

1. Alfred環境設定の[Features] -> [WEB & URL] -> [Custom Searches]左下の[+]から設定を追加する
2. [Search URL] に開きたいURLを入力し、タイトルとキーワードを設定し保存
3. Alfredでキーワードを入力すると設定したURLが開きます

* * *

自分はいま話題のfeedlyをReeder for macの代わりにしたかったので、feedlyというキーワードでfeedlyのサイトを直接開くようにしてます。これでgoogle reader & Reederからfeedlyの乗り換えが捗る！！
Twitter Ruby Gemを使って、RubyでTwitterキーワード検索を試す

Twitter Ruby Gemを使って、引数で受け取った単語でTwitterキーワード検索して、結果を取得するRubyプログラムのサンプルです。
since_idを用いて最新結果を取得して、古いものから順(Tweet IDで昇順)に表示させます。

## 環境
- Ruby (Ver 2.0.0-p0)
 - [Ruby 2.0.0-p0 リリース](http://www.ruby-lang.org/ja/news/2013/02/24/ruby-2-0-0-p0-is-released/)
- Twitter Ruby Gem (Ver 4.6.2)
 * [sferik / twitter](https://github.com/sferik/twitter)
- Twitter API (Ver 1.1)
 - [Overview: Version 1.1 of the Twitter API | Twitter Developers](https://dev.twitter.com/docs/api/1.1/overview)

## サンプルコード
```Twitter_KeywordSearch.rb
#!/bin/env ruby
#encoding:UTF-8
require "twitter"

# アプリケーションキー(consumer key/secret)の読み込み
Twitter.configure do |cnf|
  cnf.consumer_key = "XXXX"
  cnf.consumer_secret = "XXXX"
end

# OAuth アクセストークンの読み込み
@client = Twitter::Client.new(
  :oauth_token => "XXXX",
  :oauth_token_secret => "XXXX"
)

# 変数の初期化
since_id = 0
counter = 0

# 無限ループ
while counter == 0  do
    # 60秒待機
    sleep(60)
    begin
      # 引数で受け取ったワードを元に、検索結果を取得し、古いものから順に並び替え
      # ※最初はsince_id=0であるため、tweet ID 0以降のTweetから最新のもの上位100件を取得
      @client.search(ARGV[0], :count => 100, :result_type => "recent", :since_id => since_id).results.reverse.map do |status|

        # Tweet ID, ユーザ名、Tweet本文、投稿日を1件づつ表示
        "#{status.id} :#{status.from_user}: #{status.text} : #{status.created_at}"

        p status.id
        p "@" + status.from_user
        p status.text
        p status.created_at

        print("\n")

        # 取得したTweet idをsince_idに格納
        # ※古いものから新しい順(Tweet IDの昇順)に表示されるため、
        #  最終的に、取得した結果の内の最新のTweet IDが格納され、
        #  次はこのID以降のTweetが取得される
        since_id=status.id
      end

    # 検索ワードで Tweet を取得できなかった場合の例外処理
    rescue Twitter::Error::ClientError
      # 60秒待機し、リトライ
      sleep(60)
      retry
  end
end
```

## 実行
```
% ruby Twitter_KeywordSearch.rb 検索ワード
```
nginxとuwsgiの連携方法


```
$ sudo pacman -S nginx python2 python2-pip
$ sudo pip2 install Flask uwsgi
```

```/opt/webapp/
hello/
    __init__.py
    templates/
        index.html
```

```__init__.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')
```

```templates/index.html
<!DOCTYPE html>
<h1>Hello, world!</h1>
```

## uwsgiソケットを使う方法

```nginx
server {
    listen 80;
    server_name localhost;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:5000;
    }
}
```

```shell
$ uwsgi -s 127.0.0.1:5000 -w hello:app
```

## httpプロクシを使う方法

```
$ uwsgi --http 127.0.0.1:5000 -w hello:app
```

```
server {
    listen 80;
    server_name localhost;
    location / {
        include uwsgi_params;
        proxy_pass http://127.0.0.1:5000;
    }
}
```

## Arch Linux

```/lib/systemd/system/helloapp.service
[Unit]
Description=Hello Application
Wants=nginx.service
Before=nginx.service

[Service]
ExecStart=/usr/bin/uwsgi -s :5000 --chdir /opt/webapp -w hello:app --pidfile /tmp/helloapp.pid
ExecReload=/usr/bin/uwsgi --reload /tmp/helloapp.pid
ExecStop=/usr/bin/uwsgi --stop /tmp/helloapp.pid

[Install]
WantedBy=multi-user.target
```

```Shell
$ sudo systemctl enable helloapp.service
$ sudo systemctl start helloapp
$ sudo systemctl reload helloapp
$ sudo systemctl stop helloapp
```
git merge 時に内容が異なるファイルをマージ対象から除外する

### 設定

.gitattributes に以下を追記

```
ignore_target_file merge=ours
```

.git/config に以下を追記

```
[merge "ours"]
    name = "Keep ours merge"
    driver = true
```

### テスト

```zsh
# develop で commit && push
$ git checkout develop
$ echo "by develop" >> ignore_target_file
by develop
$ git add . & git commit -m "by develop" & git push

# master で commit && push
$ git checkout master
$ echo "by master" >> ignore_target_file
by master
$ git add . & git commit -m "by develop" & git push

# Marge: develop -> master
$ git merge develop
Merge made by the 'recursive' strategy.

# merge 対象から除外されていることを確認する
$ cat ignore_target_file
by master

# Note: 本来であれば，develop の ignore_target_file の内容がマージされる(この場合conflictしちゃうと思います)．
```
以上．
これで，ignore_target_file をブランチごとに別々の値を持つことができます．
.gitignore との最大の違いはバージョン管理下に置ける点でしょうか．

また，.gitignore と同様に "config/* merge=ours"の様に書くと複数ファイルを対象にすることができます．
"config/ merge=ours" の様にディレクトリのみ指定するだけでは上手く機能しないようです．

### 参考
* http://git-scm.com/book/ja/Git-のカスタマイズ-Git-の属性#マージの戦略
* http://stackoverflow.com/questions/5465122/gitattributes-individual-merge-strategy-for-a-file
Node.jsでFacebook Chatを送信する＆Herokuでやる場合

# はじめに
http://developer.cybozu.co.jp/tech/?p=2173
これを知ってから気になっていたメッセージ（チャット）の送付。

# Node.jsでやるには
XMPPという仕様に従って送信すれば良いらしいので、何かライブラリが存在しないか探った。
https://github.com/astro/node-xmpp

また、node-xmppをラップしてFacebook専用にした以下がある。これでやれば良さそうだ。
https://github.com/SideraX/node-facebook-chat

node-facebook-chatをインストールする際にはICUが必要なので環境構築しよう。
http://qiita.com/items/fd76d67fd5d63c3cb4a5

node-facebook-chatには簡単なExampleが本家ページにあるので参考にすると良さそう。これでMacのクライアント程度で動かす事はできた。

# Herokuでやる場合
ICUをインストールするのにHeorkuではbuildpackの構築が必要だったが、ICUを必要とするnode-stringprepはnode-xmppではoptional扱いだった。実際node-stringprepを外しても警告は出るもののMac上では動作させられたので、node-facebook-chatのコードを自身のコードへ移植することで対応した。

# これってスパムアプリ作れてしまうよね？
下記参照。
https://developers.facebook.com/docs/chat/

> Please do not use this API to send spammy messages to users. Facebook takes user experience and spam extremely seriously and if users report your app as using the Chat API to spam them, we will disable your app.

適当な訳：
このAPIをスパムっぽいメッセージをユーザーへ送信するのに利用しないで下さい。Facebookはユーザーエクスペリエンスとスパムに関して極めて真面目に取り組んでおり、もしユーザがあなたのアプリをChat APIのスパム利用であるとレポートした際には、あなたのアプリケーションを利用不可能にします。

というわけで当然悪用厳禁と思われる。
conscript/giter8 をWindowsで使う

## conscript/giter8 をWindowsで使う
ファイルのダウンロードとかに手間取ったのでメモ

### conscriptのダウンロード/インストール
conscriptはgithubをリポジトリと見立ててScalaのソフトウェアのインストールを行うツール？のようなもの。

[ここ](https://github.com/n8han/conscript ) からダウンロード。
以下のコマンドでインストールされる

`java -jar conscript-0.3.4.jar`

インストールが完了すると、cs.batが作成される。

## giter8のダウンロード/インストール
giter8はgitHubをリポジトリと見立ててからScalaベースのプロジェクトを作成するツール。

こいつのダウンロード/インストールは先ほどのconscriptを使って行う。

`cs n8han/giter8`

完了すると、g8.batが作成される。
Steel Bank Common Lisp 1.1.6の変更点

[News - Steel Bank Common Lisp](http://www.sbcl.org/news.html)の内容を日本語訳したものです。内容の正しさは保証しません。

-----

# 機能拡張

* 既存のfndbエントリを上書きしてDEFKNOWNするときの再開可能なエラーを、SB-C:DEFKNOWNへのキーワード引数として（ATTRIBUTESのあとに）:OVERWRITE-FNDB-SILENTLY Tを渡すことで無視できるようになりました。DEFKNOWNの再読み込みを許すのに便利です。後方互換性を保ちたいときは:ALLOW-OTHER-KEYS Tを使ってください。

# 最適化

* [SVREF](http://www.lispworks.com/documentation/HyperSpec/Body/f_svref.htm#svref)と(SETF SVREF)フォームのコンパイルで、コンパイラが格段に速くなりました。

# バグ修正

* [MAKE-ARRAY](http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_ar.htm#make-array)での、変更されている変換元のフォームからの変換を止めました。インライン化されたコードで問題を引き起こします。Bart Bottaのおかげです。（1.0.42.11-bisからのリグレッションです）
* [CLEAR-OUTPUT](http://www.lispworks.com/documentation/HyperSpec/Body/f_finish.htm#clear-output)が、正しい[Gray stream](http://www.nhplace.com/kent/CL/Issues/stream-definition-by-user.html)のルーチン、SB-GRAY:STREAM-CLEAR-OUTPUTを呼び出すようになりました。（[#1153257](https://bugs.launchpad.net/sbcl/+bug/1153257)）
* 無効なフォーマット修飾子~<~@>に対してエラーが通知されます。（[#1153148](https://bugs.launchpad.net/sbcl/+bug/1153148)）
* パッケージ操作での、より良いエラーメッセージ。（[#1154776](https://bugs.launchpad.net/sbcl/+bug/1154776)）
* 存在しないパッケージへの[DELETE-PACKAGE](http://www.lispworks.com/documentation/HyperSpec/Body/f_del_pk.htm#delete-package)は[CERROR](http://www.lispworks.com/documentation/HyperSpec/Body/f_cerror.htm#cerror)を通知すべきです。（1.0.37.44からのリグレッションです）
* &MORE（スタックに割り当てられる&REST）引数へのアクセスで境界チェックをするようになりました。（[#1154946](https://bugs.launchpad.net/sbcl/+bug/1154946)、[#1072112](https://bugs.launchpad.net/sbcl/+bug/1072112)）
* [MAKE-ARRAY](http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_ar.htm#make-array)のコンパイルで、ELEMENT-TYPEが未知の型だったときにエラーが通知されなくなり、代わりに警告が通知されるようになりました。James Kaleniusのおかげです。（[#1156095](https://bugs.launchpad.net/sbcl/+bug/1156095)）
* （[VECTOR](http://www.lispworks.com/documentation/HyperSpec/Body/t_vector.htm)や[LIST](http://www.lispworks.com/documentation/HyperSpec/Body/t_list.htm)でない）総称シーケンス型（訳注：sb-sequenceで提供されるユーザが拡張できるシーケンスです）に対する[SEARCH](http://www.lispworks.com/documentation/HyperSpec/Body/f_search.htm#search)が、一部の入力に対して間違った結果を生成していたのが直りました。（Jan Moringenのおかげです。[#1153312](https://bugs.launchpad.net/sbcl/+bug/1153312)）
seqを使ってログファイルを一気に漁る

以下のような構成で圧縮されたログファイルがあるとします。

ファイル名：prefix.日付_時間.bz2

```
access.2013-03-29_00.bz2
access.2013-03-29_01.bz2
	〜略〜
access.2013-03-29_22.bz2
access.2013-03-29_23.bz2
```
00-24までの24ファイルあるとします。

とりあえず、1ファイルだけを調べる
調べる中身はなんでもいいんですが、HTTPのレスポンスコードの数でも出してみます。

```bash
$ bzcat access.2013-03-29_00.bz2 | gsed -e "s/HTTP\/1.0/\n\HTTP\/1.0/g" | awk '$1=="HTTP/1.0\"" {print $2}' | sort | uniq -c
  11 200
   3 301
   1 302
   1 304
   1 404
```

bz2で圧縮されているので、bzcat等で調べれますが、これを1日で集計する場合、1つずつ調べるのはめんどくさいです。
なので、seqを使ってループ文にして、一気にGrepしましょう。

```bash
$ for i in `seq -w 00 23`; do  bzcat access.2013-03-29_${i}.bz2 | sed -e "s/HTTP\/1.0/\n\HTTP\/1.0/g" | awk '$1=="HTTP/1.0\"" {print $2}' >> total_access.log; done
$ cat total_access.log | sort | uniq -c
 264 200
  72 301
  24 302
  24 304
  24 404
```


同じディレクトリ内にファイルが固まっているなら*でも使えばできるんですが、ディレクトリが区切られたりしているとめんどくさいので、こういう使い方をすればいけます。
エフェメラルポート


詳細な説明は Wikipedia を参照の事．
ネットワークでは，IPアドレスはよく話に登りますが，意外とポートについては話に登らない場合があります．

TCP/IPは，基本的には[IPアドレス:ポート番号]が一つの通信端点です．この通信端点で通信を行います．

TCP/IP受信側，概ねサーバとして動き，クライアントからの通信を待ち受ける場合は，ポート番号を事前に仕様として決めて使う場合が殆どですが，他方，クライアント側は，ポート番号はOSの自動割り当てを使う場合が多いです．この様な場合で，二台以上の機器が互いにサーバを持っており互いに通信しあうケースでは，サーバとして待ち受けるポート番号がエフェメラルポートに被っていると，OSの自動割り当てと被るケースがあります．

Linux のエフェメラルポートは，IANAが提言する範囲からズレています．/proc/sys/net/ipv4/ip_local_port_range を見て確認したほうが良いでしょう．「ここは空いているはず．．．」と思ったポート番号でも，エフェメラルポートの範囲内に入っていると，「あれ？ bind に失敗する．．．」と言うトラブルにハマる可能性があるので，空いていると思ったポート番号の bind に失敗して，他の（関係無さそうな）プロセスがそのポート番号を使用していたら，エフェメラルポートに被っているかを確認すると良いでしょう．

サーバソフトウェアで，独自にポート番号を定義する必要がある場合は，Wikipedia の情報に照らすと，5001〜32767の範囲で定義すれば，少なくともエフェメラルポートとは被らなさそうです．
Goodbye Adobe, With Inexpensive And Highly Functional Softwares For Mac!!


Hey mac users, Don't you think the recent adobe interface is not cool on Mac? They are expensive, and upgraded every year with high-cost. But Apps from AppStore can be updated for nothing forever, if buy it once.
I tried to pick the Apps that can cover as much as possible in terms of functionality Adobe softwares.

## Adobe wares VS Free or Low Price wares

(+:and, -:or)

|Adobe CS6| Substitute Software|Place|Price|Description|
|:--|:--|:--|--:|:--|
|Photoshop|Pixelomator|AppStore|¥1300|Equivalent functionality, and very cool UI!!|
|-|Gimp|Website|Free|Equivalent functionality
|Illustrator|iDraw|AppStore|¥2200|Equivalent functionality, and cool UI! (But no 3D, no Gradient mesh)|
|-|InkScape|Website|Free|Now being developed Gradient mesh!!(But not Cocoa native App (X11))|
|+|Blender|Website|Free|Complements the capabilities of 3D|
|InDesign|iBooks Author|AppStore|Free|Released by Apple, looks good!|
|Acrobat Pro|Skim|Website|Free|Marker to PDF, same to Acrobat|
|Flash Professional|Hype|AppStore|¥5200|In html5 In html5 instead of flashinstead of flash|
|Flash Builder|Titanium Studio|Website|Free|Multi-platform development environment for smartphone apps|
|Dreamweaver|Coda|AppStore|¥6500|Edit website with WYSIWYG editor|
|-|Aptana Studio|Website|Free|IDE for the web developments|
|Fireworks|Slicy|AppStore|¥2600|Slice the PSD file|
|+|Css-Borders|AppStore|Free|Split image and deploy with CSS|
|+|BlueGriffon|Website|Free|Draw and convert to SVG, and Embed into HTML. Edit html with WYSIWYG editor
|After Effects|Javie|Website|Free|Can be enhanced with plugins|
|Premiere Pro|Motion|AppStore|¥4300|Released by Apple|
|Audition|Audacity|Website|Free|can be enhanced with plugins|
|Encore|Compressor|AppStore|¥4300|Released by Apple, can burn to BD/DVD|
|SpeedGrade|DaVinci Resolve Lite|Website|Free|Another choice, 'Color' is included in 'Final Cut Studio'
|Prelude|
|Bridge|XnViewMP|Website|Free|Management and evaluation of the files|
|MediaEncorder|WonTube Free Video Converter|AppStore|Free|Also optimum for iOS, AppleTV|

|Adobe Others| Substitute Software|Place|Price|Description|
|:--|:--|:--|--:|:--|
|Lightroom|iPhoto|AppStore|¥1700|Pre-installed in recent Mac|
|Photoshop Elements|Aperture|AppStore|¥6900|iPhoto library can be shared|
|Premiere Elements|iMovie|AppStore|¥1700|Pre-installed in recent Mac|

##Impression

Adobe wares have advantage in concerning the compatibility between each software.
Pixelomator can import and export 'ps' files. iDraw can only import 'ai' files. If each software can import and export filetype based on adobe, Interchange between each software should be able to smoothly. 
Ironically, Adobe standards is the industry standard...

##Extras

|Adobe Service| Substitute Service|Description|
|:--|:--|:--|
|Creative Cloud Storage|iCloud Storage|Adobe is 2GB free, Apple is 5GB free|
|Sink device and PC|iTunes|? ? ?|
DBサーバ障害

DBサーバで障害発生
　↓
WEBサーバ内にDB作って、バックアップデータをリストア
　↓
WEBサーバ内のDBに接続するようにする
　↓
DBサーバ復旧

さてどうやってDBサーバに追加されたデータを戻して切り替えようか。

・WEBサーバ内のDBを使い続けるのは負荷が怖い
・ダンプとってリストアとなるとまたサービス止めなきゃいけないからイヤ

サービス止めずに最新データをDBサーバに反映して、DBサーバに切り替える！

ってことで、DBレプリケーションを使ってWEBサーバ内のDBとDBサーバを同期させて、切り替えるという方法で対応することにした。

レプリケーションには以前に使用したことのあるSlony-Iを使うことにして、下記を参考にさせていただきながらレプリケーション。
http://www.interdb.jp/techinfo/web+db48/slony.html

レプリケーションしてて、ふと気づいたらシーケンスの設定忘れてた。。。
シーケンスも同期できるけど1件1件設定面倒くさいし。。。
http://old.postgresql.jp/wg/jpugdoc/slony/1.1.0/adminguide/stmtsetaddsequence.html

ってことでWEBサーバ内DBで全シーケンスで下記SQLを打って、結果のSQLをそのままDBサーバに反映するっていうちょっと強引な感じで。値がずれたら手動対応！

select 'SELECT SETVAL(''hoge_id_seq'',' || last_value || ');' from hoge_id_seq;

切り替え後はDBサーバ側で更新できるように、同期を止めてシーケンス確認してトリガとか設定して無事復旧！
QiitaプロフィールページのURLを7文字削減する短縮URLサービス作った件について


![](https://dl.dropbox.com/u/949822/qiita.com/130330-qiitame/1.png)

自分のブログと並行してQiitaにコンテンツを書いている人や、Qiitaを自分のメインブログとして記事をあげている人もいるとおもいます。私もQiitaを始めてから、個人ブログはほとんど更新しなくなったうちのひとりです。

ところで、みなさん。Qiitaのプロフィールページを自己紹介などで掲載していますか? 発表のスライドに載せたり、名刺に印字していますか? 2012年の秋ごろにQiitaのプロフィールページがパーソナライズされたUIになり、「自分のブログ」として自己紹介にあげても遜色のないものになっています。

ですが、なかなかメインブログとして紹介しにくい理由のひとつにプロフィールページの URL があかぬけていないという点があります。というのも、URLに `/users/` という部分がどうしても入ってしまうのです。qiita.com/users/suin のようなURLでは、なんとなく自分が所有している感がでませんよね。できれば、Facebookのパーマリンクのように facebook.com/suinyeze といった風に表現したいものです。

この課題を解決するために、このたび QiitaのプロフィールページURLから `/users` を取り去り、個人を連想しやすいTLDの `.me` ドメインを取得し、Qiitaのプロフィールページにリダイレクトするだけのウェブサービスを作りました。だれでも設定不要で使えますので、自己紹介に掲載したい人、発表会のスライドに投影したい人、名刺に印刷したい人など、ご自由に使ってください!

### 使い方

`http://qiita.com/users/{あなたのID}`

を

`http://qiita.me/{あなたID}`

にするだけです。

設定などは不要です。

### UPDATE 2013.04.01

qiita.me を Qiita で提供してもらえるかどうか Increments に連絡してみたところ、ドメイン&コンセプトを引き継いでいただけるとの快諾をいただきました！すぐにでも qiita.me を移管したいところだったのですが、レジストラの制約で60日間は移管できないことが分かり、少なくとも3/29からの60日間は suin のほうで一時的にホスティングすることになりました。また何か報告できることがあればお知らせしますm(_ _)m

### UPDATE 2013.04.02

同じレジストラ内であれば60日以内でもドメインの移動が可能だったので、ドメインの移動手続きを進めさせていただいてます。Incrementsさんのほうでは、運用準備中であるとのことですので今後が楽しみですね(^-^)/
「例の背景」をUIViewに出す

 ![image](http://farm9.staticflickr.com/8092/8599792341_31d4b83faa.jpg "image")

これです。例のアレです。

やりかたは簡単

```
    aView.backgroundColor = [UIColor underPageBackgroundColor];
    bView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
```

一応サンプルです
https://github.com/Ushio/BackgroundUIViewTips
AWSでebsのスナップショットを自動作成

【AWS】クラウド時代のバックアップ管理術　　～tagを活用したsnapshotの世代管理～
http://shanon-tech.blogspot.jp/2013/02/awstagsnapshot.html
にある、タグを使ったスナップショット管理方式を参考に、
python botoを使って行うようにしたスクリプト

```python:create_snapshot.rb
# coding: utf-8

import boto.ec2

region = 'ap-northeast-1'
aws_access_key = ''
aws_secret_key = ''

ec2 = boto.ec2.connect_to_region(region, aws_access_key_id=aws_access_key, aws_secret_access_key=aws_secret_key)

# タグ'backup'が'ON'のEC2インスタンスをバックアップ対象とする
instances = [i for r in ec2.get_all_instances(filters={'tag-key':'backup', 'tag-value':'ON'}) for i in r.instances]

for instance in instances:
  print "backup instance: %s" % instance.id

  # バックアップ世代数を、instanceのタグ'generation'から取得
  generation = int(instance.tags.get('generation'))
  print "backup generation: %s" % generation

  volumes = ec2.get_all_volumes(filters={'attachment.instance-id': instance.id})

  for v in volumes:
    # 新しいsnapshotを作成する
    print "create snapshot: %s" % v.id
    v.create_snapshot(description='snapshot: ' + v.id)

    # start_timeの降順で並び替え、古い世代のsnapshotを削除する
    snaps = v.snapshots()
    sorted_snaps = sorted(snaps, key=lambda snap: snap.start_time, reverse=True)
    for i, snap in enumerate(sorted_snaps):
      if i >= generation:
        print "delete snapshot: %s" % snap.id
        snap.delete()
```
ブラウザ上とDeveloperコンソール上でのJS速度比較

forEachとforに関して結果の違う二種類のベンチ結果を見て少し悩んだのですが、どうやらこれは、ブラウザ上のJavaScript と Developerコンソール上での JavaScriptの速度の違いなのかな？という気もしています。

・forEachよりforが早いベンチ
　　http://jsperf.com/lo-dash-each-vs-native-foreach/3
・forとforEachが早いベンチ
　　http://qiita.com/items/94d13de417e042b56d48
　　http://qiita.com/items/c07329ec9500094e0ad7

ということで、同じベンチをブラウザ上で走らせた場合と、それをコンソール上で走らせた場合の比較をしてみました。

##テストコードは下記の通り

```
var a = [];
var loopLen = 1000000;
//配列を作るa[0,1,2,3,...loopLen]
for (var i = 0; i <= loopLen; i++) a.push(i);
var aLen = a.length;

//コールバック
var cb = function (item, i) {
    if (item >= loopLen) console.timeEnd('bench');
};

console.log('===== Native for =====');
console.time('bench');
for (var i = 0; i < aLen; i++) {
    cb(a[i]);
};

console.log('===== Native forin =====');
console.time('bench');
for (var i in a) {
    cb(a[i]);
}

console.log('===== Native forEach =====');
console.time('bench');
a.forEach(function (item) {
    cb(item);
});

console.log('===== Native forEach 2 =====');
console.time('bench');
a.forEach(cb);
```

##ブラウザ上で走らせた場合

テストコードとデモはここにあります。
http://socketapi.com/jsbu/forBench/test0.htm

```
===== Native for =====
bench: 39.000ms
===== Native forin =====
bench: 335.000ms
===== Native forEach =====
bench: 78.000ms
===== Native forEach 2 =====
bench: 76.000ms 
```

forの方が早いです。

##コンソール上で走らせた場合

上記ページで、コンソールを開きテストコードをコピペして実行した結果です。

```
===== Native for =====
bench: 2559.000ms
===== Native forin =====
bench: 2051.000ms
===== Native forEach =====
bench: 693.000ms
===== Native forEach 2 =====
bench: 382.000ms
```

爆遅ですね。そのうえ、forとforEach の速度関係が逆転しています。

まぁ、実際に使うのがブラウザ上である以上、forEachよりforが早いという評価は正しいといえますね。。。

うーん。console重いとは思っていたけど、こんなことが起きていたとは。。。

せっかくなので、UnderscoreとLo-Dashも追加して比較したのも作ってあります。
http://socketapi.com/jsbu/forBench/test1.htm

```
===== Lo-Dash each =====
bench: 34.000ms
===== Underscore each =====
bench: 94.000ms
===== jQuery each ===== 
bench: 140.000ms 
===== Native for =====
bench: 33.000ms
===== Native forin =====
bench: 338.000ms
===== Native forEach =====
bench: 79.000ms
===== Native forEach 2=====
bench: 74.000ms 

```

Lo-Dash早いですね。
forEachとforとforinの速度テスト2

追記 20120329：その後、調べ直した結果 forEachよりforが早いというのが今の私の評価です。
参照＞ブラウザ上とDeveloperコンソール上でのJS速度比較
　　　http://qiita.com/items/cf8d031f2d234aff73c9

-----


forEach と for と forin の速度比較を試したら forEachが早かった http://goo.gl/u54Yq のですが、forEachよりforが早いというベンチを教えてもらいました。http://jsperf.com/lo-dash-each-vs-native-foreach/3

ぱっとみですが、これは、コールバックで計測していることと、ライブラリを同時にテストしてるようですが、この手のコールバック処理するケースを試してみました。

でも、やっぱ forEach が早い。うーん。。。と思って、ライブラリを含んだテストをしたら、forが早くなりました。＞　http://socketapi.com/jsbu/forBench/test1.htm

うーん。うーん。仮説：Devコンソールのforなどの速度とブラウザ上の速度が違う?

先方のコードは次の通り。

```html
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.1/underscore-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.8.2/lodash.min.js"></script>
<script>
 var lodash = _.noConflict();
 var pi = Math.PI,
 a = "t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t".split(","), e;
</script>
<script>
//Lo-Dash each
lodash.each(a, function(item) {
  item = pi;
});

//Underscore each
_.each(a, function(item) {
  item = pi;
});

//Native forEach
a.forEach(function(item) {
  item = pi;
});

//Native for
var cb = function(item) {
        item = pi;
    };
for (var ix = 0; ix < a.length; ix++) {
    cb(a[ix]);
}

//Native forEach v2
var cb = function(item) {
    item = pi;
};
a.forEach(cb);
</script>
```

##テストコード

ここでは、Underscore と Lo-Dash は試しません。(これらを含んだテストはここ  http://socketapi.com/jsbu/forBench/test1.htm ）

で、こんな感じで試してみます。

```javascript
var a = [];
var loopLen = 10000;
//配列を作るa[0,1,2,3,...loopLen]
for (var i = 0; i <= loopLen; i++) a.push(i);
var aLen = a.length;

//コールバック
var cb = function (item, i) {
    if (item >= loopLen) console.timeEnd('bench');
};

console.log('===== テスト =====');

//for
console.time('bench');
for (var i = 0; i < aLen; i++) {
    cb(a[i]);
};

//forin
console.time('bench');
for (var i in a) {
    cb(a[i]);
}

//forEach
console.time('bench');
a.forEach(function (item) {
    cb(item);
});

//forEach2
console.time('bench');
a.forEach(cb);
```

##結果

```
Chrome 25.0.1364.172 m
--------------------------
===== テスト =====
bench: 24.000ms
bench: 19.000ms
bench: 10.000ms
bench: 4.000ms

Firefox 19.0.2
--------------------------
[15:13:06.654] ===== テスト =====
[15:13:06.654] bench: タイマー開始
[15:13:06.661] bench: 7ms
[15:13:06.661] bench: タイマー開始
[15:13:06.668] bench: 7ms
[15:13:06.668] bench: タイマー開始
[15:13:06.672] bench: 4ms
[15:13:06.672] bench: タイマー開始
[15:13:06.674] bench: 2ms
```
Observerでキャッシュの破棄のタイミングを制御する


Observerを使うとモデルを変更したタイミングでキャッシュを破棄するというような制御ができるといので試してみた。

## 準備

まず開発環境でキャッシュを有効にするため config/environments/development.rb の変更しキャッシュを有効化する（あとでこの設定は戻せるようにしておく）

```
config.action_controller.perform_caching = true
```

## Viewをキャッシュさせる

view でキャッシュさせたい箇所を cache ヘルパーのブロックで囲む。

```
<% cache('users') do %>
   〜キャッシュさせる箇所〜
<% end %>
```

'hoge'はキャッシュのキーとなる文字列、{:action => 'index', :action_suffix => 'hoge'} のようにハッシュを渡すこともできる。

## Observerを登録する

上記でキャッシュした部分が User モデルに依存している場合、Userモデルが変更されてたタイミングでキャッシュを破棄したい。

そのような場合以下のような Observer を作成する。

```
$ rails g observer User
```

で app/models/user_observer.rb にひな形が作られるので、それに以下のように実装する。

```
class UserObserver < ActiveRecord::Observer
  def after_save(user)
    expire_cache
  end

  def after_destroy(user)
    expire_cache
  end

  def expire_cache
    ActionController::Base.new.expire_fragment('users')
  end
end
```

Observer クラスが実装できたら、config/application.rb に以下の行を記述する（通常この設定行はコメントアウトされている）

```
config.active_record.observers = :user_observer
```

## ログで動作を確認する

Viewを読み込んだときまだキャッシュが作成されていない場合、

```
[2013-03-29 20:25:16] Read fragment views/users (0.2ms)
  :
[2013-03-29 20:25:16] Write fragment views/users (0.5ms)
```

のように、キャッシュから'views/users'（キャッシュのキーで'users'を指定したので）をキーとしてキャッシュされたviewの断片を探しに行き、見つからないのでViewのレンダリングを行った後、該当箇所を'vews/users'というキーでキャッシュに保存される。

キャッシュが作成されている場合、

```
[2013-03-29 20:25:19] Read fragment views/users (0.3ms)
```

のように Read のみで、該当箇所のレンダリングも行われず、キャッシュへの Write は行われていないことがわかる。


## 参考

- [A Cache Expiration Strategy in RailsAdmin | End Point Blog](http://blog.endpoint.com/2012/03/cache-expiration-railsadmin.html)
- [» Railsのオブザーバまとめ TECHSCORE BLOG](http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B6%E3%83%BC%E3%83%90%E3%81%BE%E3%81%A8%E3%82%81/)
- [Observerとは - Ruby on Rails - gendosuの企画開発室](http://redmine.gendosu.jp/projects/1/wiki/Observer%E3%81%A8%E3%81%AF)
- [Ruby on Rails Guides: Caching with Rails: An overview](http://guides.rubyonrails.org/caching_with_rails.html)
Sublime Text 2 で箱型選択する


Mac の場合、「**``option`` キーを押しながらマウスをドラッグ**」でした。

キーボードでやるとか、Windows の人は、

* [Column Selection - Sublime Text 2 Documentation](http://www.sublimetext.com/docs/2/column_selection.html)

を見てください。

!["1"](https://dl.dropbox.com/u/264530/qiita/sublimetext2_boxselection_1.png)

切り取った後は、左詰めされます。

!["2"](https://dl.dropbox.com/u/264530/qiita/sublimetext2_boxselection_2.png)
icuのインストール

ICUはC++の文字コード変換器…で説明合ってるかな？iconvみたいな？もの（不安）。

Macにインストールしたかったので検索したらここが引っかかり、参考になった。
https://npmjs.org/package/fts

丁寧にさまざまな環境で書いてくれていたので転載。

```sh
# ubuntu and debian-based systems
apt-get install libicu-dev

# gentoo
emerge icu

# os x
port install icu +devel                 # with macports
brew install icu4c && brew link icu4c   # homebrew
```

本当にやりたいのはnode.jsでnode-xmppの利用なんだけれども。
herokuで静的ファイルをホスティングする

## 概要

herokuの使用用途はrubyなどに限定されているので、rubyを認識する最小限のファイルを追加することによって静的ページをherokuにデプロイすることができる
Gemfileなどに'sinatra'の設定が書いてある

## 手順

```bash:deploy-static-files-to-heroku
# Login
$ heroku login

# Create Application (アプリ名は適当に付ける)
$ heroku create static-app-name

# Clone ruby config files
$ cd ~/repository/
$ git clone git://github.com/machida/kuroigamen-sandbox.git

# Copy ruby config files
$ cd kuroigamen-sandbox/
$ cp -r * ~/git-repository-dir/

# Add & Commit & Push
$ cd ~/git-repository-dir/
$ git add .
$ git ci -am "Add files for heroku deploy"

# Deploy to heroku
$ git push heroku master
$ cd public/

# Check
$ heroku open
```

http://static-app-name.herokuapp.com/ を確認する

## 参考

* http://kuroigamen.com/22#
nvmとかnpmとかrvmとかの補完スクリプトを遅延読込させる

bash_completionの話です。`npm`とか`nvm`とか`rvm`とかにはそれ自身のコマンドライン補完を補助するスクリプトがついていて、~/.bashrc とかでそれを読み込んでおけば便利に使えるように出来ています。

例えば今までは↓こんなふうにしてました。

```~/.bashrc
# npm の補完が効くようにする
which npm >/dev/null 2>&1 && . <(npm completion)
# nvm の補完が効くようにする
[[ -f ~/.nvm/bash_completion ]] && . ~/.nvm/bash_completion
# rvm の補完が効くようにする
[[ -f ~/.rvm/scripts/completion ]] && . ~/.rvm/scripts/completion
```

ですがいつもこれらコマンドを使うわけでもないのにそこそこ大きい補完スクリプトを、毎回読み込んでるのは、メモリの無駄だし起動時間だって1ミリ秒も無駄にしたくない。そう思って以下のように設定を変えてみました。

```~/.bashrc
# 初めてnpmの補完を実行するまで読み込みを遅延する
function _npm_completion() {
  unset _npm_completion
  complete -r npm
  if which npm >/dev/null 2>&1; then
    . <(npm completion) && return 124
  fi
}
complete -F _npm_completion npm

# 初めてnvmの補完を実行するまで読み込みを遅延する
function _nvm_completion() {
  unset _nvm_completion
  complete -r nvm
  if [[ -f ~/.nvm/bash_completion ]]; then
    . ~/.nvm/bash_completion && return 124
  fi
}
complete -F _nvm_completion nvm

# 初めてrvmの補完を実行するまで読み込みを遅延する
function _rvm_completion() {
  unset _rvm_completion
  complete -r rvm
  if [[ -f ~/.rvm/scripts/completion ]]; then
    . ~/.rvm/scripts/completion && return 124
  fi
}
complete -F _rvm_completion rvm
```

こうすることで初めて補完が呼ばれた時に本物の補完スクリプトを読み込まれるようになる、という見たまんまの感じです。

工夫があるとしたら最後に return 124 を返しているところです。補完関数が124を返した場合はbashは補完をもう一度実行することになっています。どういうことかというと↓こういうことです。

```text
# return 124 しない場合
nvm [TAB][TAB]
     ↑    ↑ 
     │  なのでもう一度TABを押して初めて本来の補完関数が実行される
ここで本物の補完関数が読み込まれる(が、この時点で本物の補完関数は呼ばれない)

# return 124 する場合
nvm [TAB]
     ↑
ここで本物の補完関数が読み込まれる＆読み込んだ補完関数がこの時点で再実行される
```

まぁ、実際は殆ど気づかないだろうけど遅延読み込みのせいでTABを1回余分に押すハメになるのを防げるという意味があります。

おしまい。
MACでのSubversion日本語対応

ちょっと調べる事があったので、MACでのSVN日本語対応パッチのインストール方法

Homebrew：
   $ brew install subversion --unicode-path
http://nobeans.hatenablog.com/entry/20110401/1301634519

MacPorts：
   $ sudo port -v install subversion +unicode_path
http://tips.traction.jp/2012/05/macsubversion.html

メモメモ


追記1）
homebrewでインストールしてみたら、makeで停止した・・・

$brew install svn --unicode-path
-> makeの時に停止
$brew install svn --unicode-path
$brew link subversion --unicode-path

こんな手順でやりなおすみたい。
http://d.hatena.ne.jp/irof/20120529/p1

追記2）
SVNクライアントソフトのSubversionへのパスを切り替える必要もあるのか
グラフ - google_visualr

* [winston/google_visualr · GitHub](https://github.com/winston/google_visualr)
* [GoogleVisualr](http://googlevisualr.herokuapp.com/)
* [Charts Gallery - Google Chart Tools — Google Developers](https://developers.google.com/chart/interactive/docs/gallery?hl=ja)

----

Gemfile

```rb
# Graph
gem 'google_visualr'
```

```
bundle update
```

app/controllers/items_controller.rb

```rb
  # グラフ
  def graph
    items    = Item.where( user_id: current_user.id ).select("buy_year, buy_month").group(:buy_year, :buy_month)
    sums     = items.sum(:price)
    averages = items.average(:price)
    items    = items.map{ |i| [i.buy_year, i.buy_month] }

    # グラフ用データ
    data = GoogleVisualr::DataTable.new

    # Column
    data.new_column( 'string', '月' )
    data.new_column( 'number', '合計金額' )
    data.new_column( 'number', '平均' )

    # Rows
    rows = Array.new
    items.each { |value|
      rows.push( ["#{value[0]}年#{value[1]}月", sums[value], averages[value]] )
    }
    data.add_rows( rows )

    line_column = 1  # 折れ線グラフ対象データカラム指定
    options     = { width: 700, height: 400, title: '月額合計推移', vAxis: { title: '合計金額' }, hAxis: { title: '合計金額' }, seriesType: 'bars', series: { line_column => { type: 'line' } } }
    @bar_chart  = GoogleVisualr::Interactive::ComboChart.new( data, options )
  end
```

app/views/items/graph.html.erb

```erb
<center class="chart">
  月額合計推移</div>
  <div id='bar_chart'></div><%= render_chart @bar_chart, 'bar_chart' %>
</center>
```
危険な crontab -r を封印する

cronの設定するとき`crontab -e`って使うよね？でもこれ結構危険なんです。キーボードの`e`の隣にある`r`、これを間違えて`crontab -r`なんてやってしまったら目も当てられない。何の警告もなしにいきなりcrontabの設定が全部消えちゃうんです！

怖いですねー。実際のところは過去何百回と`crontab -e`を打ってきたけどこの打ち間違えはしたことがない。でも今日までは大丈夫でも明日やってしまうかもしれない…、そんな不安を少しでも拭えればと最近は bashrc に以下の設定をしています。

```~/.bashrc
# crontab -r を封印する
function crontab() {
  local opt
  for opt in "$@"; do
    if [[ $opt == -r ]]; then
      echo 'crontab -r is sealed!'
      return 1
    fi
  done
  command crontab "$@"
}
```
bashrcの変更を反映させます。

```
source ~/.bashrc
```

これで間違えて`crontab -r`を実行しちゃっても大丈夫です。

```
$ crontab -r
crontab -r is sealed!
```
jruby on windows コマンドライン引数からのファイル名の扱い

`--1.9` モード前提。最終的に `jruby -E Windows-31J:UTF-8` で起動させて、encodingはさわらない。

```
# encoding: Shift_JIS
require 'optparse'

opts = OptionParser.new
opts.on("-i VAL") { ifilename = v }

File.exist?(ifilename)
open(ifilename)
```

ソースの `# encoding: Shift_JIS` はべつに UTF-8 にしてソースのエンコードを変えてもいいと思われ。
-E オプションなしで、`ifilename = v.encode("UTF-8")` とかしてもうまくいかなかった。
cd /path/to/file→失敗→fileを削って再びcd /path/to　をもうやりたくないお

ログとかからファイルのフルパスをコピペしてそのファイルのあるディレクトリへ`cd`したいことってよくありますよね？そんなときこの記事タイトルのようなことをやった経験が誰にもあると思います。少なくとも僕はよくやるし、長いファイル名をBS連打で削るのがもう嫌です。

>cd先がファイルだったらそのファイルがあるディレクトリに行きたいって思ってるに決まってるじゃん。分かるでしょ？だからもう勝手にファイル名削ってcdしちゃってよ！

って夢が叶うのが以下の設定です。

```~/.bashrc
# cd file でそのfileのあるディレクトリに移動する
function cd() {
  if [[ -e $1 && ! -d $1 ]]; then
    builtin cd -- "$(dirname -- "$1")"
  else
    builtin cd "$@"
  fi
}
```

この結果…

```
# httpd.confを弄ろう…
$ sudo vim /etc/httpd/conf/httpd.conf

# ちょっとヒストリ1個戻ってconfディレクトリに行きたいな…
$ cd /etc/httpd/conf/httpd.conf

# しまったファイル名のままcdしちまった
# あれ？　エラーが出ない…だと！？

$ pwd
/etc/httpd/conf

# これは楽ちん！
```
historyにコマンドの実行時刻が表示されるようにする

作業の痕跡を探るには`history`コマンドが使えます。でも更に、このコマンドを実行したのは何時頃だっけ？ということを調べたくなったりします。例えば何かトラブルをやらかしてしまったときの原因調査の時とかね。ですがデフォルトでは実行時刻は分かりません。

そんな時に困ることが無いよう、普段から以下の設定をしておけばhistoryで各コマンドの実行時刻が表示出来るようになります。環境変数にexportせず単に変数をセットしておくだけでOKです。

```~/.bashrc
# history にコマンド実行時刻を記録する
HISTTIMEFORMAT='%Y-%m-%dT%T%z '
```

これがセットされていると ~/.bash_history ファイルには以下のようにコマンド毎の実行時刻がUNIXタイムでメモが残されて…

```~/.bash_history
#1364542436
history
#1364542451
ls -al
#1364542454
ps axf
#1364542456
pwd
#1364542458
history
```

更に`history`を実行時にはその時間が`HISTTIMEFORMAT`で指定したフォーマットに従って以下のように表示してくれるようになります。

```text
 $ history
 1796  2013-03-29T16:34:11+0900 ls -al
 1797  2013-03-29T16:34:14+0900 ps axf
 1798  2013-03-29T16:34:16+0900 pwd
 1799  2013-03-29T16:34:18+0900 history
```

便利なので僕は新環境をセットアップしたら常に設定するようにしてます。

この設定が生きるのはbashのバージョン3.0からですが、変数設定するだけなので古いbashで実行しても特に害は無いので安心です。
ワイルドカードを使用した文字列マッチ

.Netの標準のライブラリにはワイルドカードを用いた文字列マッチは存在しない(と思う)ので、ワイルドカードを使用した文字列マッチをするには、ちょっとした変換が必要になります。
以下の通り、ワイルドカードの文字列を正規表現に変換してから正規表現の機能を用いて文字列マッチを行うのが良いと思います。

```
 using System.Text.RegularExpressions;
 //ワイルドカードの文字列を正規表現の文字列に変換する
 var regexPattern = System.Text.RegularExpressions.Regex.Replace(
   "ワイルドカードの文字列",
   ".",
   m =>
   {
     string s = m.Value;
     if(s.Equals("?")) {
       //?は任意の1文字を示す正規表現(.)に変換
       return ".";
     } else if(s.Equals("*")) {
       //*は0文字以上の任意の文字列を示す正規表現(.*)に変換
       return ".*";
     } else {
       //上記以外はエスケープする
       return System.Text.RegularExpressions.Regex.Escape(s);
     }
   }
   );
 
 //あとは以下のように正規表現の文字列として用いれば良い
 if(new Regex(regexPattern).IsMatch("regexPatternにマッチするか検査する文字列")) {
  }
```
CentOS5.9にtmux


某Bクラウドで、CentOSインストールしたけど、™uxがパッケージインストールになかったので、追加方法。

```bash
# uname -i
x86_64
```

上記の様に、64bitなので、以下をダウンロード

http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm


```bash
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -K rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpn -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
```

これで、rpmforgeのリポジトリが追加されているので、

```bash
yum -y install tmux
```
MODXを別のサーバーに移行

例として、ウェブサーバー上のMODXを、ローカル環境（MAMP）に移行する際の手順です。

***注意***
  /config.core.php や /manager/config.core.php などで大元の設定がされている。

---
　

## （１） /core/cache/ 内のディレクトリを全削除
　
下で無駄に置換しないため

　
## （２） 全ファイルでパスを置換
　

```
/home/sites/hoge/web/mysite.com
```

↓

```
/Applications/MAMP/htdocs/mysite
```

　
## （３） /core/config/config.core.php
　
12行目あたりまでにまとめて書いてあるデーターベース関係の設定値を変更

62行目あたりのホスト名を変更

```
$http_host='mysite.com';
```

↓

```
$http_host='localhost:8888';
```
hardwareAcceleratedとHTMLCanvasの不都合な関係

OS 4.1以降のAndroidで、hardwareAcceleratedが有効時にHTMLCanvasが２重化して表示される不具合。

### OS 4.2.0以前に有効な対策（hardwareAcceleratedを無効化）
```
AndroidManifest.xmlで
android:hardwareAccelerated="false"
にする。
```

しかし、4.2.1以降の実機では、逆に複数重ねたCanvasが描画されなくなってしまった。

### OS 4.2.1以降でも有効な対策（CSS側で対策）
```
AndroidManifest.xmlで
android:hardwareAccelerated="true"
もしくは、書かない（デフォルトはtrue）
```
```
canvasの親要素にoverflow:hidden;やoverflow:scroll;を持つものがないようにする。
```

参考：
- [下に表示されるOptionsMenuを明示的に非表示にする方法 | 日本Androidの会](https://groups.google.com/d/topic/android-group-japan/PUcsP4GuL1g/discussion)
- [Android HTML5 Hardware Acceleration - Canvas | StackOverflow](http://stackoverflow.com/questions/13280195/phone-android-html5-hardware-acceleration-canvas)
Zshでn進数を扱うには

[Bashでn進数を扱うには](http://qiita.com/items/b29eef5e1934b1995949)を見て、zshでもやってみた。微妙に違うみたい。

```sh
# 2進数
echo $(( 2#101 ))         # 5
echo $(( 2#101 & 2#100 )) # 4 (=2#100)

# 8進数
# zshはデフォルトでは0から始まる数値を8進数とみなさない
echo $(( 0744 ))   # 744

# OCTAL_ZEROESをセットすると0から始まる数値を8進数として扱える
setopt OCTAL_ZEROES
echo $(( 0744 ))   # 484

# 8進数(続き)
echo $(( 8#744 ))  # 484
echo $(( 8#0744 )) # 484

# 16進数
echo $(( 0xff ))  # 255
echo $(( 16#ff )) # 255

# 36進数
echo $(( 36#10 )) # 36
echo $(( 36#zz )) # 1295

# zshの場合は大文字小文字区別なしで36進数までらしい
echo $(( 37#10 )) # invalid base (must be 2 to 36 inclusive): 37

#----------------------------
# zshは数値に基数を設定できる

# 16進数で表現
# 出力は上記のインプットとして使える形式になる
echo $(( [#16] 255 )) # 16#FF
# "##"にすると基数の情報なしになる
echo $(( [##16] 255 )) # FF

# 2進数から16進数へ
echo $(( [##16] 2#1011 )) # B

# 基数を設定した変数
typeset -i 16 x
x=255
echo $x # 16#FF
```

詳しくは`man zshmisc`の`ARITHMETIC EVALUATION`を。

Arithmetic Evaluation
http://zsh.sourceforge.net/Doc/Release/Arithmetic-Evaluation.html
PhpStormでまず覚えるべきショートカット


個人的に使用頻度の高いショートカット。winとmacで標準に設定されているショートカットキーを表記しています。OSのショートカットと被っていたりすることもあるので注意。名称とカテゴリはkeymap設定に準じています。

##Editor Actions
###Complete Current Statement

おそらく最もお世話になるショートカット。現在のステートメントをカカッと終了させてくれる。行末にセミコロンを追加してくれるだけでなく`function Hoge`まで書いてコレすると`function Hoge(){}`まで補完してフォーマットも整えてくれる。

win:`Ctrl + Shift + Enter`
mac:`⇧⌘⏎`

##View
###Recent Files

過去に開いたファイルやウィンドウの履歴。さっき編集してたファイルとか間違えて閉じたときとかするりと戻れる。あと検索できる。

win:`Ctrl + E`
mac:`⌘E`

##Navigate
###Navigate Class

クラス名で検索。ネームスペースでも探せるしスペース区切りで絞り込みできる。

win:`Ctrl + N`
mac:`⌘O`

###Navigate File

ファイル名で検索。

win:`Ctrl + Shift + N`
mac:`⇧⌘O`

###Navigate Symbol

シンボル(変数名、メソッド名、定数名etc)で検索。

win:`Ctrl + Alt + Shift + N`
mac:`⌥⌘O`

###Navigate Line

行番号を指定して移動

win:`Ctrl + G`
mac:`⌘L`


###Declaration

定義元

win:`Ctrl + B`
mac:`⌘B`


##Bookmark
###Toggle Bookmark

現在の行に0番〜9番のブックマークをつける/外す

win:`Ctrl + Shift + 0` 〜 `Ctrl + Shift + 9`
mac:`^⇧0` 〜 `^⇧9`

###Go to Bookmark

指定したブックマークへジャンプ

win:`Ctrl + 0` 〜 `Ctrl + 9`
mac:`^0` 〜 `^9`

##Run
###Run

Run/Debug Configrationsで設定されたものを実行する。テストの実行とか。

win:`Shift + F10`
mac:`^R`

### Run Context configration

テスト書いてるところで実行すると現在フォーカスしているメソッドだけ走らせられますphpunitのfilterを勝手に設定してくれる感じ

win:`Ctrl + Shift + F10`
mac:`^⇧R`

##Code
###Reformat Code

コードの自動整形。phpstromはコーディング規約の設定がプロジェクト毎にかなり細かくできるので素晴らしいと思います(小並感

win:`Ctrl + Alt + L`
mac:`⌥⌘L`

###Generate

生成のコンテクストメニュー。getter/setterやphpdocもいい感じに生成できます。

win:`Alt + Insert`
mac:`^⏎`

##Other
###Show intention Actions

電球のマークをクリックした時のコンテクストメニューを出すショートカット。

win:`Alt + Enter`
mac:`⌥⏎`

----

キー移動系は書いてませんが、標準でもemacsライクなキーバインド使えるみたいです。ぼくはviのキーバインドが使えるプラグイン入れてます。
新MacBookAirを入手したのでセットアップメモ

次の機会のためにも、やったことメモしておく。

## とりあえずやった順の一覧
- Chromeインストール

- KeePassX
  - ふつうにダウンロード&インストール

- ssh-keygen
  - 公開鍵作成して、githubに登録

- Xcode
  - App Storeからダウンロード&インストール

- Xcode command line tool
  - http://connect.apple.com からダウンロード&インストール
  - これがないとHomebrew入れる時点でおこられる

- Homebrew
  - http://mxcl.github.com/homebrew からインストール

- brew install git

- 開発中のものをclone
  - ※業務中である

- .emacs.dをclone
  - これがなくっちゃ開発できない
  - http://github.com/fnobi/emacs.d

- brew install emacs
  - 上の.emacs.dは、デフォルトのEmacsではヴァージョン低くて動かなかった。
  - 最新にしたら問題なく動いた
  - このポータビリティ、さいこうだぜ…!

- brew install mysql

- Adobe(Photoshop・Illustrator)のユーザー登録
  - ライセンスの移動が微妙によくわからなかったので後回し。

- prelbrew
  - http://perlbrew.pl
  - しばらく、.bashrcに```perlbrew use```入れるの忘れてて阿呆だった。

- nodebrew導入
  - https://github.com/hokaccha/nodebrew
  - ちょうどv0.10.2が出てたので入れてみた

- kokoインストール (npm動作確認)
  - npm -g install koko
  - https://npmjs.org/package/koko

- Kobitoインストール
  - しかし、qiitaのパスワード忘れてて起動できず…。後回し。

- Chromeのブックマーク引っ越し
  - 案外、ないと業務に差し支えた

- rvm導入
  - https://rvm.io/
  - Rubyの2.0.0いれるの初めてだそういえば

## 感想
- 何より先に、KeePassXを入れることになるとは思わなかった。
  くらうどのじだいなので、とにかくアカウントを押さえるのが大事ってことですね。。

- あと同様に、とにかくgithubにつなげば安心みたいなところある。

- 本当はMacの自動セットアップみたいなやつあったよね…
  次回は挑戦します。
Bashでn進数を扱うには

Bashの算術式では`0755`で8進数や`0x1a`で16進数といった表記をを扱うことが出来ますが、`基数#数字…` で2～64進数までの全てが使えることは余り知られてないと思うのでメモ。

```bash
# 2進数
echo $(( 2#101 ))         # 5
echo $(( 2#101 & 2#100 )) # 4 (=2#100)

# 8進数
echo $(( 0744 ))   # 484
echo $(( 8#744 ))  # 484
echo $(( 8#0744 )) # 484

# 16進数
echo $(( 0xff ))  # 255
echo $(( 16#ff )) # 255

# 62進数 fの続きはzまで行って更にA～Zへと続く！
echo $(( 62#f + 62#z + 62#A + 62#Z )) # 147 (=15+35+36+61)
echo $(( 62#10 )) # 62

# 64進数 Zの続きは @ と _ だ！もはやイミフｗ
echo $(( 64#Z ))  # 61
echo $(( 64#@ ))  # 62
echo $(( 64#_ ))  # 63
echo $(( 64#10 )) # 64

# 65進数～は扱えないようだ
echo $(( 65#10 )) # invalid arithmetic base (error token is "65#10")
```
ディレクトリ配下のファイルを再帰的に並列でrsyncする

DB移行の際、slaveのサーバにmysqlのコールドバックアップを送る時の
転送時間がボトルネックになり、試行錯誤して最終的に使ったシェル。  

#### 注意点

* ディレクトリ構造を先にコピー先にコピーしておかないとrsyncがこける  
* 帯域に依存しているので、帯域が狭いとあまり効果が無いらしい  
* ファイル数のプロセスを起動するため、100万個ファイルがあると100万プロセスたちあがる  
* 完了後に普通のrsyncを実行し、差分が無いかをチェックするとベター

```
rsync -avz /tmp/backup/mysql/ username@hostname:/tmp/backup/mysql/
```

```bash
#!/bin/bash

# パスの末尾に/をつけてもつけなくても大丈夫なようにsedする
from_dir=`echo $1 | sed -e "s|/$||"`
to_host_user=$2
to_host=$3
to_dir=`echo $4 | sed -e "s|/$||"`

# 引数チェック
if [ "$from_dir" == "" ]; then
  echo "usage $0 from_directory_path to_host_user_name to_host_ip to_directory_path"
  exit -1
elif [ "$to_host_user" == "" ]; then
  echo "usage $0 from_directory_path to_host_user_name to_host_ip to_directory_path"
  exit -1
elif [ "$to_host" == "" ]; then
  echo "usage $0 from_directory_path to_host_user_name to_host_ip to_directory_path"
  exit -1
elif [ "$to_dir" == "" ]; then
  echo "usage $0 from_directory_path to_host_user_name to_host_ip to_directory_path"
  exit -1
fi

# ディレクトリ構造を先にコピーしておかないとこける
rsync -a --include "*/" --exclude "*" ${from_dir}/ ${to_host_user}@${to_host}:${to_dir}/

# findでディレクトリ配下のファイルを再起的に取得し、それを引数にrsyncを実行する
# つまり、ファイルが100万個あればプロセスが100万起動することになるので注意
cd ${from_dir}
for f in `find . -type f`
do
  f=${f:2}
  /usr/bin/rsync -avz --bwlimit=0 --whole-file --sockopts=TCP_NODELAY --delay-updates ${from_dir}/$f ${to_host_user}@${to_host}:${to_dir}/$f &

  usleep 500000
done
```
Apache Hive のビルド周りについて

Apache Hive のビルド周りに関するドキュメントが不足しているように見えたので，記述しておきます．

## レポジトリからのソースコードの取得

Apache Hive のレポジトリは，svn か git で利用可能です．

    svn co http://svn.apache.org/repos/asf/hive/trunk hive
    git clone https://github.com/apache/hive.git

## ビルド

ソースコードをダウンロード後，ソースコードのルートディレクトリで以下のコマンドを実行します．

    ant 

## 配布用パッケージを作成する．

ソースコードをダウンロード後，ソースコードのルートディレクトリで以下のコマンドを実行します．

    ant package

$HIVE_SRC_DIR/build/dist にビルド済みの配布パッケージが生成されます．


## ソースコードから eclipse プロジェクトを生成する

ソースコードをダウンロード後，ソースコードのルートディレクトリで以下のコマンドを実行します．

    ant eclipse-files


その後，eclipse のメニューより，[Import] > [Existing Projetcts into Workspace] で elicpse でインポートできます．
Andriodの overridePendingTransition() はスレッドたちあげて実行すると効かないっぽい

splash screenで実装するときに、一定時間後にsplash screenをfade outさせつつ次のactivityをfade-inとかやると思うけど、ThreadをたちあげてTheread.sleep()するのではoverridePendingTransition()が効かなかった。Handler#postDelayed()するのがいいようだ。