OmniAICreator/Qiita-1.07M huggingface dataset:
140文字を越えるとハイライト風

Twitterみたいな特定文字数超えるとハイライトされるTextarea風なものを作ってみた。
Choromeくらいでしか確認してない＆Textareaがスクロールできるくらいの文字量になるとずれる

#コード

```html:
<div id="realText">
    <p class="textarea"></p>
    <textarea name=""></textarea>
    <p class="count">0文字</p>
</div>
```

```css:
* {
  margin: 0;
  padding: 0;
  border: 0;
}

body {
  background: #dfd;
  font: 14px sans-serif;
}

#realText {
    position: relative;
    padding: 0 10px;
    word-wrap: break-word;
}

.textarea {
    position: absolute;
    top: 0;
    left: 10px;
    color: transparent;
    height: 100px;
    width: 300px;
}

.red {
    background-color: rgba(255,0,0,.5);
}

.count {
    text-align: right;
}

textarea {
    width: 300px;
    min-height: 100px;
    font: 14px sans-serif;
}
```

```js:
$(function(){
    function heightlighter() {
        $('#realText textarea').bind(' blur keydown keyup keypress change',function(){
            var textWrite = $('#realText textarea').val().trim(),
            textarea = $('#realText p.textarea'),
            inputLimit = 140;
            $(textarea).text('');
            $('p.count').text(textWrite.length+"文字");
            for (var i=0; i<textWrite.length; i++) {
                if(i >10) {
                    textarea.append('<span class="red">'+textWrite.substr(i, 1)+'</span>'); 
                } else {
                    textarea.append('<span>'+textWrite.substr(i, 1)+'</span>'); 
                }           
            }
        });
        
        $('#realText p.textarea').click(function(){
            $('#realText textarea').select();
        });
    }
    heightlighter();
});
```

デモ：http://jsdo.it/Ituki/1MNt
CapistranoでChef-soloのリモートマシンの準備


よく考えたら、Vagrantばっかり使ってて、Chef-Soloを実行できる環境をリモートマシンへ設定する方法がわかってなかったので、
それの勉強がてら、Capistranoでスクリプトを作っておいた。

まっさらなUbuntuを落としてきてから、Chef-soloを実行できるようにするまで（正確にはknife prepareを実行できるようにするまで）下記の手順を踏めばよかった。

## 手順
### ローカルマシン側
1. sshをインストールする。

2. knife-solo(0.3.0)をインストールする。
　下記コマンドでインストールできます。

```
sudo gem install knife-solo --pre
```

3. capistrano(2.15.4)をインストールする。(その前にRubyもインストールする)
    ホントはversionがどれじゃないとダメ、とか知らないけど、とりあえずこれで動きました。

```
sudo gem install capistrano
```



### リモートマシン側

1.  リモートマシンにSSHをインストール

```
sudo apt-get install openssh-server
```

2. aptのアップデート

```
sudo apt-get update
```

3.  `sudo`をパスワード無しで実行できるようにする。下記ファイルに追記。rasennはsudoができるユーザ名（適宜変えてください）

```/etc/sudoers
rasenn ALL=(ALL) NOPASSWD:ALL
```

4.  パスワード無しでSSHログインできるようにする。
    ローカルマシンの`~/.ssh/id_rsa.pub`をリモートマシンにアップロードし、内容をリモートマシンの`~/.ssh/authorized_keys`に追記する。リモートマシンにアップロード後、下記コマンドを実行すればよい。

```
cat id_rsa.pub >> ~/.ssh/authorized_keys
```

## 最後に確認

これで準備が整ったので、ローカルマシンで下記コマンドを打って、エラーが出なければ万々歳。[host]はリモートマシン名。

```
knife solo prepare [host]
```

今回作ったCapistranoのファイルは下記にあります。
https://github.com/rasenn/capistrano
`config/chef_solo.rb`が該当のスクリプトです。


簡単なはずなのに、ちょいちょいこけて手間取ってしまった。。。
jQueryで表示文字数制限+α

[jQueryで表示文字数制限](http://qiita.com/blurblue/items/a7d120c53ab1ce260f90 "jQueryで表示文字数制限")を触ってみたら、閉じれるものを作りたくなったので作ってみた。

#コード

```html:
<ul>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
    <li class="textOverFlow02">開いて閉じる。あいうえおかきくけこさしすせそ</li>
</ul>
```

```css:
.moreLead {
    color: blue;
    cursor: pointer;
}

.textOverFlow02 .moreTxt {
    display: none;
}
```

```js:
$(function(){
    function textOverFlow02(){ //表示文字数制限+α
        var count = 10,
            target = $('.textOverFlow02');
        $('.textOverFlow02').each(function(){
            $(this).html($(this).text().replace($(this).text().slice(count),'<span class="moreTxt">'+$(this).text().slice(count)+'</span><span>…</span><span class="moreLead">[全文表示]</span>'));  
            $('.moreLead',this).toggle(function(){
                $(this).text('[閉じる]').parent().children('.moreTxt').show().next().hide();
            },function(){
                $(this).text('[全文表示]').parent().children('.moreTxt').hide().next().show();
            });
        });
    }
    textOverFlow02();
});
```

デモ：http://jsdo.it/Ituki/cwcA
Redmine や Backlog でサクっとチケットページを開く

## 概要
Google Chrome の検索エンジン機能を利用することによって、
Redmine や Backlog などの BTS にて課題ページを簡単に開くことができます。

「◯◯番のチケットに書いといたからー」と言われた時などに重宝しています。

### 利用イメージ (Backlog)
1. `cmd + l` でアドレスバーに移動して
![qiita1-1.png](https://qiita-image-store.s3.amazonaws.com/0/7823/b8b25d39-8411-6aad-a778-e378ceb41d3c.png)

2. 「`キーワード（変更可能）` `チケット番号`」を入力
![qiita2-1.png](https://qiita-image-store.s3.amazonaws.com/0/7823/fc4cbd09-84b6-1680-409c-9e1cbbadbf6c.png)

3. 該当のページが開かれる
![qiita3-2.png](https://qiita-image-store.s3.amazonaws.com/0/7823/bf368254-39f3-ad8d-fe5e-12dae71a9b27.png)

## 手順
1. アドレスバーを右クリックし「検索エンジンの編集」を選択する
![qiita4.png](https://qiita-image-store.s3.amazonaws.com/0/7823/8f6e8ead-5422-13e9-8cc8-757bb6746822.png)

2. 「その他の検索エンジン」の「新しい検索エンジン」「キーワード」「検索キーワードの代わりに %s を含む URL」を入力する
<例>
新しい検索エンジン: `タイトル`
キーワード: `hoge`
検索キーワードの代わりに %s を含む URL: `https://xxx.backlog.jp/view/XYZ-%s`
![qiita6-2.png](https://qiita-image-store.s3.amazonaws.com/0/7823/77d39c6e-547c-3daa-7491-00c5ebd670fd.png)

3. `cmd + l` でアドレスバーを選択「 `hoge` `100` 」と入力すると...
![qiita7.png](https://qiita-image-store.s3.amazonaws.com/0/7823/491987d6-8dd6-8a5c-6d70-150f1f859aae.png)

4. 補完されます！
![qiita8.png](https://qiita-image-store.s3.amazonaws.com/0/7823/60de037e-45a3-cbcc-9fc9-cb658b923c6c.png)

## 応用
以下、わたしのオススメの設定です！
シンプルながら応用次第で色々と利用可能な機能だと思います。
便利な設定、面白い設定があれば是非コメント欄にて共有ください！

#### wikipedia（日本語）で検索
* 新しい検索エンジン: `Wikipedia (ja)`
* キーワード: `wiki`
* 検索キーワードの代わりに %s を含む URL: `http://ja.wikipedia.org/wiki/Special:Search?search=%s`

#### 英和、和英辞書で英単語と例文を調べる
* 新しい検索エンジン: `アルク`
* キーワード: `alc`
* 検索キーワードの代わりに %s を含む URL: `http://eow.alc.co.jp/search?q=%s`

#### 英英辞書で英語の勉強
* 新しい検索エンジン: `Oxford`
* キーワード: `oxf`
* 検索キーワードの代わりに %s を含む URL: `http://oxforddictionaries.com/definition/english/hybrid?q=%s`

#### amazon で商品検索
* 新しい検索エンジン: `Amazon (ja)`
* キーワード: `amz`
* 検索キーワードの代わりに %s を含む URL: `http://www.amazon.co.jp/exec/obidos/external-search/?field-keywords=%s&mode=blended`

#### ドラクエ10公式サイトでアイテム検索
* 新しい検索エンジン: `DQX（広場）`
* キーワード: `dqx`
* 検索キーワードの代わりに %s を含む URL: `http://hiroba.dqx.jp/sc/search/%s/item/`

#### DQXDB でドラクエ10のアイテム・モンスター検索
* 新しい検索エンジン: `DQXDB`
* キーワード: `dqxdb`
* 検索キーワードの代わりに %s を含む URL: `http://dqxdb.com/search/?q=%s`
grunt-templateを開発するときの工夫いろいろ


最近、けっこう頻繁にgrunt-templateを作るようになってきた。

じみに決まりが多かったり、動作確認がしづらかったり、
grunt-templateはいろいろ開発しづらい要素満載なので、

そのあたりを楽にする工夫を色々考えている。

## なにはともあれ、シンボリックリンク

```
ln -s ~/Project/grunt-init-hogehoge ~/.grunt-init/hogehoge
```

これをやっておけば、
まだ開発用のディレクトリに置いてあるgrunt-template、「hogehoge」でも、
grunt-initができるようになる。

シンボリックリンクさいきんすごいよくつかう。

## reset.sh

template作るときに面倒なのが、

- templateにミスが見つかった!
- なおす
- grunt-initしてみる
- まだミスあった
- またなおしてgrunt-initして…

というサイクル。

これを速くしたいので、最近はtemplateに**reset.sh**っていうものをまぎれこませて開発している。

```sh:reset.sh
rm -rf *
grunt-init hogehoge
npm install
grunt build
```

これがあると、
動作確認用につくったprojectを、修正入れた最新のtemplateで作り直したい!
というときに、下の1行ですぐ動作可能な状態になる。

```
source reset.sh
```

べんり。
【備忘録】JDKインストール先フォルダ

- MacのJDKインストール先フォルダは、Appleが提供するJDKとOracleJDKとで異なることがわかったので、メモする。

## Apple提供JDK
`/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/`にインストールされている。
※Appleが提供するJDKは2013年6月時点で1.6系


## OracleJDK
`/System/Library/Frameworks/JavaVM.framework/Versions/Current`にインストールされている。
tmux で作業している時だけ zsh の設定を変えたいあなたに

環境変数 `TMUX` に値が入っているか否かで分けられるみたいです

[tmux上のコピペをうまく設定する方法 - Qiita [キータ]](http://qiita.com/catatsuy/items/71b0f4932f00c6711ef5)

で書いたように Mac で tmux を動かすとなぜか `pbcopy` がうまく動きません

なので

```zsh
if [ -n "$TMUX" ]; then
  alias pbcopy="reattach-to-user-namespace pbcopy"
fi
```

こんな感じにするとよさげです
jQuery で JSON ファイルを読み込む

JSONファイル読み込みのおさらいメモ。
下記ファイルを読み込みます。

```js:data.json
[
  {"id":1,"name":"田中"},
  {"id":2,"name":"鈴木"},
  {"id":3,"name":"佐藤"}
]
```
これを、id を id属性に。name を li タグ内に表示します。

```html:
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script>
$(function() {
  $.getJSON("data.json" , function(data) {
    var
      ulObj = $("#demo"),
      len = data.length;

    for(var i = 0; i < len; i++) {
      ulObj.append($("<li>").attr({"id":data[i].id}).text(data[i].name));
    }
  });
});
</script>
</head>
<body>
<ul id="demo"></ul>
</body>
</html>
```
webページの最終更新時刻を表示するワンライナー

```shell-session:
$ wget -S --spider http://www.ietf.org/rfc/rfc2616.txt 2>&1|grep "Last-Modified" |cut -d ":" -f2- |xargs -i date -d "{}"
1999年  6月 12日 土曜日 03:46:53 JST
```

Last-Modifiedを送ってこないページには使えないけど。。
PostgreSQLのテーブル定義の一覧を頑張って取得してみた

はじめましての方ははじめまして。
そうでない方はまずいないと思いますのではじめまして。

psqlのデータ量が多くなってくると、たまに全体がどういった構成になっているか確認したくなることはないでしょうか。
しかも、いちいち各テーブルで```\d```するのが面倒なくらいの量だったら。
```select tablename,attname from pg_stats;```とやれば、テーブル名とカラム名の一覧は作れます。
でも、型とか、説明とか、そういう情報も欲しいですよね。
そういう便利なビューは検索しても見当たりませんでした。

ならば作るしかないでしょう。

```sql:
WITH res AS (
    SELECT c.oid
         , NULL AS tablename
         , a.attnum AS no
         , a.attname AS col
         , CASE WHEN a.atttypmod > 0 THEN t.typname || '(' || (a.atttypmod-4) || ')' ELSE t.typname END AS type
         , CASE WHEN a.attnotnull THEN 'not null' ELSE '' END AS cannull
         , d.description
    FROM pg_class c
    JOIN pg_namespace n ON c.relnamespace = n.oid
    JOIN pg_attribute a ON c.oid = a.attrelid
    JOIN pg_type t ON a.atttypid = t.oid
    LEFT JOIN pg_description d ON c.oid = d.objoid
                                  AND a.attnum = d.objsubid
    WHERE n.nspname = 'public'
      AND a.attstattarget = -1
      AND pg_get_userbyid(c.relowner) = 'hiwasa'
    UNION
        SELECT c.oid
             , c.relname AS tablename
             , 0 AS no
             , CASE WHEN c.relkind = 'r' THEN '  テーブル'
                    WHEN c.relkind = 'v' THEN '  ビュー'
                    WHEN c.relkind = 'S' THEN '  シーケンス'
                    WHEN c.relkind = 'i' THEN '  インデックス'
                    ELSE '  ' || c.relkind
               END AS col
             , NULL AS type
             , NULL AS cannull
             , d.description
          FROM pg_class c
          JOIN pg_namespace n ON c.relnamespace = n.oid
          LEFT JOIN pg_description d ON c.oid = d.objoid
                                        AND d.objsubid = 0
         WHERE n.nspname = 'public'
           AND pg_get_userbyid(c.relowner) = 'hiwasa'
    ORDER BY oid, no
)
SELECT tablename
     , col AS column
     , type
     , cannull AS "null制約" 
     , description AS "説明" 
  FROM res
  ;
```

```pg_stats``` の定義などを参考に作成してみました。
これで、テーブル名とカラム名、説明、null制約までは取得できます。
デフォルト値などの情報はないですけど、これくらいでも十分テーブル構成は把握できるんじゃないかと思います。
二重サブミット防止策（IE6も動くよ♪）

```js:application.js 
$('#form_id').submit(function() {
   $('#submit_id').attr("disabled", "disabled");
});
```

こんな感じでいけるっぽい。
IEでどこまで動くかはわからない＞＜

7/4修正
IE6まで動作確認済み！！
webサーバーaccessログ収集メモ[過去データ収集編]


apacheのアクセスログを解析する為にごにょごにょやってみたときのメモ

## やりたいこと

apacheのアクセスログをmongodbに入れて解析をごにょごにょしたい。
今回は元になるapacheのアクセスログを解凍するのにどの方法が一番早いかを検証する

## 前提条件

apacheの過去ログは.gzで圧縮されていてストレージサーバーに保存されているものとする

## ストレージの構成(圧縮されているファイルのディレクトリ構成)

```shell
tree

ストレージ/
└── 日付ディレクトリ
    ├── WEB01
    │   └── access_log.gz
    ├── WEB02
    │   └── access_log.gz
    ├── WEB03
    │   └── access_log.gz
    #……これが370台ある
```

上記で保存されているデータをmongodbに突っ込むのが目的

##一台あたりのapacheログの容量

スマホ用270台とガラケー用100台でそれぞれ容量が異なる

```
#スマホ用
du -m access_log.gz 
34	access_log.gz

#ガラケー用
du -m access_log.gz 

10	access_log.gz

```

###総容量


```
du -m /path/to/ログストレージ/ | awk '{sum += $1} END {gb = sum / 1024} END {print gb "GB"}'
29.5322GB
```

おふっ。。。。apacheのログだけで30GBある


## 実行環境(Amazon EC2)

### OS

```shell
cat /etc/redhat-release

CentOS release 6.2 (Final)
```

### CPU

```shell
cat /proc/cpuinfo 

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 45
model name	: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
stepping	: 7
cpu MHz		: 1800.001
cache size	: 20480 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae cx8 cmov pat clflush mmx fxsr sse sse2 ss ht syscall nx lm rep_good unfair_spinlock pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor lahf_lm
bogomips	: 3600.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:
```

上記の同様の構成で8コア


### メモリ

```shell
cat /proc/meminfo
MemTotal:        7130488 kB

#見づらいので
cat /proc/meminfo |grep MemTotal | awk '{sum= $2} END {mb = expr sum / 1024} END {print mb "MB"}'

6963.37MB
```

約7GBです。


## ログ収集するWEBサーバーの台数

370台

## 検証

### 一台のWEBサーバーの解凍にかかる時間を計る

```shell
time gzip -dc /path/to/ストレージ/日付/サーバー名/access_log.gz > /path/to/展開先のディレクトリ/raw_log/日付/サーバー名/access_log

real	0m9.531s
user	0m2.408s
sys	0m0.551s
```

1台あたり10秒(四捨五入)かかる計算なので370台だと

```
(10 * 370) / 60 = 61.6666666667
```

約62分(約1時間)かかる計算です

## CPU数に応じてパイプ処理をして解凍をしてみた

一番最初一気に370台分の子プロセスを積んでやってみたが
やっぱりパフォーマンスが出なかった

```shell
#これで370の子プロセスに一気に積んだ (このコマンドを370回ループさせるshellを書いた)
time gzip -dc /path/to/ストレージ/日付/サーバー名/access_log.gz > /path/to/展開先のディレクトリ/raw_log/日付/サーバー名/access_log &
```

とある人から「CPU数に応じて子プロセスを作れば並列で一番早くできるんじゃあない？」と言われたので試してみた

```shell
#これでCPUの数がだせる
cat /proc/cpuinfo | grep processor | wc | awk '{print $1}'

8

#このコマンドをパイプ処理で8個に連結して(370 /8) = 47回ループさせる
time gzip -dc /path/to/ストレージ/日付/サーバー名/access_log.gz > /path/to/展開先のディレクトリ/raw_log/日付/サーバー名/access_log |

```

結果

```shell:370台のログの解凍にかかった時間
real	32m13.975s
user	12m11.686s
sys	2m32.123s

```

30分弱で解凍できたが理論上の数字と合わない。。。。

```shell
#理論上ででるスピード
((47 * 10) / 60) = 7.83333333333 分
```

メモリが多分追っ付かないのでしょう。。。

### 解凍したファイルの総容量を調べる

```shell
du -m /path/to/展開先のディレクトリ/raw_log/ | awk '{sum += $1} END {gb = sum / 1024} END {print gb "GB"}'

207.183GB
```

一日でapacheのアクセスログだけで207GBあるんですね。。。
第12回オフラインリアルタイムどう書くの参考問題をRubyで解く

第12回オフラインリアルタイムどう書くの参考問題をRubyで解きました。
問題はこちらのリンクから。
http://qiita.com/Nabetani/items/1de39df381dfeee305ab

```rb:
CHARS1=[
  ('A'..'K').to_a,
  ('L'..'V').to_a,
  ('W'..'Z').to_a+('a'..'g').to_a
]
CHARS2=[
  '52zwtqnkh'.split(''),
  '630xuroli'.split(''),
  '741yvspmj'.split('')
]

def make_map
  map = {}
  [CHARS1,CHARS2].each{|chars|
    chars.each_with_index{|row, i|
      row.each_with_index{|c, j|
        map[c] = []
        if j > 0
          nc = chars[i][j-1]
          map[nc][0] = c
          map[c][2] = nc
        end
        if i > 0
          nc = chars[i-1][j]
          map[nc][1] = c
          map[c][3] = nc
        end
      }
    }
  }
  3.times{|i|
    c = CHARS1[2][-1-i]
    nc = CHARS2[i][0]
    map[c][1] = nc+'L'
    map[nc][2] = c+'R'

    c = CHARS2[i][-1]
    nc = CHARS1[2][i]
    map[c][0] = nc+'L'
    map[nc][1] = c+'R'
  }
  map
end

def rotate(dir,c)
  if (c == 'L')
    dir -= 1
    dir = 3 if dir < 0
  else
    dir += 1
    dir = 0 if dir > 3
  end
  dir
end

def solve(q)
  map = make_map
  seq = "A"
  cur = "A"
  dir = 0
  q.chars.each{|c|
    move = c.to_i(16)
    if move == 0
      dir = rotate(dir,c)
    else
      move.times{
        cur = map[cur][dir]
        return seq + '?' if cur.nil?
        if cur.size > 1
          dir = rotate(dir, cur[1])
          cur = cur[0]
        end
        seq += cur
      }
    end
  }
  seq
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	2RcL3LL22	ABCNYjmpsvy147edcbcdef
1	L3R4L5RR5R3L5	A?
2	2ReLLe	ABCNYjmpsvy147eTITe741yvspmjYNC
3	1ReRRe	ABMXilorux036fUJUf630xuroliXMB
```
クラスロード問題ではまる




`::Bar::Foo` というクラスを読み込もうとした時に、 `::Foo` と `::Bar` というクラスがいると、名前解決がうまくいかない事がある、という事象。

```zsh
$ tree app/models
app/models
├── bar
│   └── foo.rb
├── bar.rb
└── foo.rb

$ cat app/models/foo.rb app/models/bar.rb app/models/bar/foo.rb
class Foo
end
class Bar
end
module Bar
  class Foo
  end
end

$ rails c
Loading development environment (Rails 4.0.0.rc2)
2.0.0p195 :001 > Bar::Foo
TypeError: Bar is not a module
        from /Users/koichi/experiment/missing_name_resolution/ponpon/app/models/bar/foo.rb:1:in `<top (required)>'
###### (省略) #####
2.0.0p195 :002 > Bar
 => Bar
2.0.0p195 :003 > Foo
 => Foo
2.0.0p195 :004 > Bar::Foo
(irb):4: warning: toplevel constant Foo referenced by Bar::Foo
 => Foo
```

解決するには、そもそもの名前空間を設計しなおすか、もしくは initalize あたりで require させる。

```rb:conifg/application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(:default, Rails.env)

module SampleApple
  class Application < Rails::Application
    # 追加
    config.after_initialize do
      require File.join(Rails.root, "app", "models", "bar", "foo")
    end
  end
end
```

warning が出るだけならいいが、何故かステージング環境で動かしてる時に限って `::Bar::Foo` が読み込めなくて**落ちた**りした。ローカルで production で動かしても、再現せず…
その後、Unicorn が warning を出してることに気付いて、その warning メッセージから以下の記事を発見して何とか解決した。良かった。

[ruby - Preventing &quot;warning: toplevel constant B referenced by A::B&quot; with namespaced classes in Rails - Stack Overflow](http://stackoverflow.com/questions/9807827/preventing-warning-toplevel-constant-b-referenced-by-ab-with-namespaced-cla "ruby - Preventing &quot;warning: toplevel constant B referenced by A::B&quot; with namespaced classes in Rails - Stack Overflow")
ローカライズしたBundle display nameの取得

```Bundle display name```をプログラム中で使おうと思って、

```objc:
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
```
と書いたら、なぜか英語名（というか*-Info.plistで設定している```Bundle display name```）になってしまったので調べてみたら、```infoDictionary```ではなくて```localizedInfoDictionary```を使わないといけないらしい。

ということで、正しくは、

```objc:
[[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"];
```

なんで**localized**を意識せにゃならんのだ。
CentOS 6.4 に Riak Cluster を構築する

公式で配布されている RPM でインストールする
erlang は RPM にバージョン R15B01 が含まれているが、最新バージョンの erlang を試したい場合は別途インストールすること

```shell-session:
[on server01]# wget http://s3.amazonaws.com/downloads.basho.com/riak/1.3/1.3.1/rhel/6/riak-1.3.1-1.el6.x86_64.rpm
[on server01]# yum -y install expect
[on server01]# rpm -ihv riak-1.3.1-1.el6.x86_64.rpm
```

セキュリティを意識せずに、とりあえず動くように設定をおこない起動する
$(hostname -f) は DNS で名前解決できるドメイン名、または IP アドレスを指定する

```shell-session:
[on server01]# sed -i 's/127.0.0.1/0.0.0.0/g' /etc/riak/app.config 
[on server01]# sed -i "s/name riak@127.0.0.1/name riak@$(hostname -f)/g" /etc/riak/vm.args
[on server01]# /etc/init.d/riak start
```

ステータスを取得する
この状態では単一ノードのみなので、次のように出力される

```shell-session:
[on server01]# riak-admin member-status
Attempting to restart script through sudo -H -u riak
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid     100.0%      --      'riak@server01.domain'
-------------------------------------------------------------------------------
Valid:1 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```

ここまでの手順を同様に 4 台のサーバ (server02, server03, server04, server05) で行い、クラスタを構築する
各サーバで join をおこない、plan を確認して、commit する

```shell-session:
[on server02]# riak-admin cluster join riak@server01.domain
[on server03]# riak-admin cluster join riak@server01.domain
[on server04]# riak-admin cluster join riak@server01.domain
[on server05]# riak-admin cluster join riak@server01.domain
[on server01]# riak-admin cluster plan
[on server01]# riak-admin cluster commit
```

ステータスを取得する
この状態では 5 ノードでクラスタを構成しているため、次のように出力される

```shell-session:
[on server01]# riak-admin member-status
Attempting to restart script through sudo -H -u riak
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      20.3%      --      'riak@server01.domain'
valid      20.3%      --      'riak@server02.domain'
valid      20.3%      --      'riak@server03.domain'
valid      20.3%      --      'riak@server04.domain'
valid      18.8%      --      'riak@server05.domain'
-------------------------------------------------------------------------------
Valid:5 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```
pyenvとautojumpを共存させる

pythonでコードを書く場合、最近人気なのはpyenvです。でもこれ、python周りのパスががらっと変わってしまうので、あるディレクトリ以下に特定のpythonバージョンを適用していると、そのディレクトリ内ではautojumpなんかも動かなくなってしまいます

## 原因は...
pyenvを設定したディレクトリでpython --versionすると、目的のバージョンになっていると思いますが、/usr/local/binなどのディレクトリも、このバージョンで動作させようとしますので、pythonのライブラリが見つからなくて、autojump等は動かなくなってしまいます

## 対処法！
/usr配下など、明らかにpyenvによる動作を期待していない部分に対して、pythonのバージョン指定をかけるとうまくいきます。

```bash:pyenv_to_system_dir
$ cd /usr
$ sudo pyenv local system
```

こんな感じで、私の場合は/usr以下にsystem（OSデフォルト）のpythonが適用されるように設定しました。
brewでインストールするものは/usr/local/binに基本的に入るので、そいつらには現在居るディレクトリに関わらず、systemのpythonが適用されるようになります。
NullObject+TemplateMethod


既存の処理に特定の条件の時だけ実行する処理を追加したい、
従来のパフォーマンスに影響は出したくない、条件は後から増えそう…
って時にNullObjectパターンとTemplateMethodパターンを使うと捗るというお話。

まず追加処理のインタフェース。

```Service.java
public interface Service {
	public void execute();
}
```
追加処理は別スレッドでやらせたいので、抽象クラスで共通化する。

```AbstractService.java
public abstract class AbstractService implements Service {
	private final ExecutorService threadPool = Executors.newCachedThreadPool();

	@Override
	public void execute() {
		threadPool.submit(new Runnable() {
			@Override
			public void run() {
				executeInternal();
			}
		});
	}

	public abstract void executeInternal();
}
```
追加処理の中身を実装。ここまでTemplateMethodパターン。

```HogeService.java
public class HogeService extends AbstractService {
	@Override
	public void executeInternal() {
		System.out.print("hoge");
	}
}
```
条件分岐で実行する処理を決定。ここでNullObjectパターンの出番。

```Factory.java
public class Factory {
	private final NullService nullService = new NullService();

	@Inject
	private HogeService hogeService;
	
	public Service getService(int type) {
		switch (type) {
			case 1:
				return hogeService;
			case 2:
			default:
				return nullService;
		}
	}

	private class NullService implements Service {
		@Override
		public void execute() { }
	}
}
```
既存の処理に追加して完成。

```Controller.java
public class Controller {
	@Inject
	private Factory factory;

	public void hoge() {
		// 既存の処理
		int type = 1;
		System.out.print("hoge");

		// 追加する処理
		Service service = factory.getService(type);
		service.execute();
	}

	public void fuga() {
		// 既存の処理
		int type = 2;
		System.out.print("fuga");

		// 追加する処理
		Service service = factory.getService(type);
		service.execute();
	}
}
```

Controller#hoge()は「hogehoge」と表示され、Controller#fuga()は「fuga」と表示される。
Xcodeでプリプロセス処理後のソースを見る

ブログに記載しました。
プリプロセス後のソースを見ることで、色々発見したり、デバッグに役立てたりします。

Productメニュー -> Generate Output -> Preprocessed File

詳しくはこちら
http://wowdev.jp/?p=423
現在行をそのまま上下に連続移動させる

行を保ったまま上下に連続して移動できます。
行の順番を変えたいとき、前後の行を入れ替えたいときに非常に役に立ちます。

| Key           | Direction    |
|:--------------|:-------------|
| `Alt+Shift+p` | 現在行を上へ |
| `Alt+Shift+n` | 現在行を下へ |

設定ファイルに以下を貼り付け。

```el:.emacs.d/init.el
(defun move-line-down ()
  (interactive)
  (let ((col (current-column)))
    (unless (eq col 0)
      (move-to-column 0))
    (save-excursion
      (forward-line)
      (transpose-lines 1))
    (forward-line)))

(defun move-line-up ()
  (interactive)
  (let ((col (current-column)))
    (unless (eq col 0)
      (move-to-column 0))
    (save-excursion
      (forward-line)
      (transpose-lines -1))
    (forward-line -1)))

(global-set-key (kbd "M-P") 'move-line-up)
(global-set-key (kbd "M-N") 'move-line-down)
```

キーバインドはご自由に

参照: [What the .emacs.d!?](http://whattheemacsd.com/)
~/.zshrc にとりあえず突っ込んでおくといいalias


```rb:
# ls を適当にalias化
alias ll='ls -lF'
alias la='ll -aF'
alias l=ll

# rails系
alias r='rails'
alias f='foreman'
alias fs='foreman start'
alias rr='bundle exec rake routes'
alias rs='r s'
alias rsf='r s -p 5000'
alias beg='bundle exec guard'
alias be='bundle exec'
alias dj='bundle exec rake jobs:work'

# その他、自分が作業するプロジェクトに一発で行く系
#alias cd***='cd ~/projects/***'
#alias cd***='cd ~/projects/***'
```
誰よりも先にイベントリスナを呼び出す

JavaScriptでは **addEventListener** を使ってイベントリスナを登録できます。(ただしIEは除く)

通常 **addEventListener** で登録されたイベントリスナは登録された順番に実行されていきます。たとえば

```js
document.addEventListener('click', function() { alert('1回目'); });
document.addEventListener('click', function() { alert('2回目'); });
document.addEventListener('click', function() { alert('3回目'); });
```

という風にイベントが登録されていれば **1回目** **2回目** **3回目** と順番に実行されます。

# useCapture

**addEventListener** は以下のような3つの引数を受け取ります。
※参考 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener

```js
target.addEventListener(type, listener[, useCapture]);
```

**type** と **listener** はよく使うのでわかりますね。 **useCapture** というものがありますが、これを `true` にすることで、最初にイベントを実行することができます。

さっきのコードをちょっと書き換えて

```js
document.addEventListener('click', function() { alert('1回目'); });
document.addEventListener('click', function() { alert('2回目'); }, true);
document.addEventListener('click', function() { alert('3回目'); });
```

とすると **2回目** **1回目** **3回目** と順番に実行されます。

たとえばwebアプリにキーボードショートカットを実装しようとしていて、他のターゲットよりもいち早く **keydown** を捕捉したい場合なんかに使えそうです。

# 詳しくは

ここに記すには余白がせますぎｔ・・

要するに **useCapture** を `true` にするとイベントリスナの実行位置が変わります。

デフォルトではイベントのバブリング時にターゲット要素までたどり着いた時にイベントリスナが実行されますが **useCapture** を `true` にすると、イベントのキャプチャ時にイベントリスナが実行されます。

イベントのバブリングやキャプチャについては詳しい解説ページがたくさんあると思うのでここでは割愛。

# ただしIE以外に限る

冒頭にも(ただしIEは除く)と書きました。

IEは **addEventListener** が無くて、代わりに **attatchEvent** を使うのですが、これで登録されたイベントリスナは登録された順序で実行されないこともあるようです。実行順序が保証されていません。

残念。
reveal.js+Markdown

## お手軽スライド作成

@siguremon
/[twitter](twitter.com/siguremon)
/[github](http://siguremon.github.io)
/[Qiita](http://qiita.com/users/siguremon)

---

## reveal.jsって

HTMLで書けるプレゼンツールです

[reveal.js - The HTML Presentation Framework](http://lab.hakim.se/reveal-js/)

--

### 特徴
- スライドが横だけでなく、縦にも配置できる
- Overviewがみれて、プレゼンの途中で行ったり来たりできる(Escキー)
- コードスニペットが書ける上にsyntax highlightもしてくれる
- Pdfにも出力できる

---

## reveal.jsの簡単な使い方

このページが詳しいので以下略

(reveal.jsで作ったスライドによる説明)

[reveal.jsを使ってみた](http://tmlife-storage.googlecode.com/svn/trunk/reveal.js-guide/index.html)

---

## スライドを作る

でもhtmlをせっせと書くのはめんどくさい…

hamlとかmarkdownで書けるといいなー

--

同じようなことを考えた先人たちがいました

- [Reveal.jsとMarkdownでちょっとしたスライドを手軽に作る](http://n.blueblack.net/articles/2013-03-02_reveal_js_and_markdown_presentation/)

- [あのreveal.jsでのプレゼンをMarkdownで簡単に書けるようにした](http://blog.nishimiyahara.net/2013/02/revealjs-markdown.html)

--

でも実は公式の機能そのままでできます！

---

## markdownでスライドを作る

通常は以下のようにhtmlタグで書きます

```html
<div class="slides">
    <section>
        <h2>スライドタイトル</h2>
	    <p>
		本文　本文　本文　本文　本文
		本文　本文　本文　本文　本文
		本文　本文　本文　本文　本文
		</p>
	</section>
    <section>
        <h2>スライドタイトル</h2>
		<p>
		...
		</p>
	</section>
</div>
```


--

こんな感じでページの内容をmarkdownで書けます

ただし、markdownの中に&lt;&#47;script&gt;があるとだめなようです(markdown.jsの制約？)


```html
<div class="slides">
    <section date-markdown>
   	    <script type="text/template">
        ## スライドタイトル

		本文　本文　本文　本文　本文
		本文　本文　本文　本文　本文
		本文　本文　本文　本文　本文

     	<//script><!-- そのままだと書けないので/を余計に書いています -->
    </section>	
</div>

```

--

さらに、以下のようにページ区切りの文字列を指定すると

複数ページをmarkdownで書けます

```html
<div class="slides">
  <section data-markdown 
           data-separator="\n---\n$"
		   data-vertical="\n--\n">
	<script type="text/template">
        ## スライドタイトル

		本文　本文　本文　本文　本文

        ---

        ## 2ページめ

		本文　本文　本文　本文　本文
	<//script><!-- そのままだと書けないので/を余計に書いています -->
  </section>
</div>
```

--

さらにさらに、data-markdownにファイル名を指定することで、
スライドの中身を別ファイルに切り出すことができます

```html
<div class="slides">
  <section data-markdown="revealjs.md"
           data-separator="\n---\n$"
		   data-vertical="\n--\n">
  </section>
</div>
```

--

ちなみに、このスライド（ページ）もmarkdownで書かれています。

- [markdownとしてみた場合](http://qiita.com/siguremon/items/c717eca388070215712c)
- [slideとしてみた場合](http://siguremon.github.io/slides/revealjs.html)

---


こんな感じでお手軽にスライドを作ることができるので、
使ってみてはいかがでしょうか


---

## おわり
パターンマッチ実装奮闘記(11)

今回は型のチェックを作ります。
型のチェックと型推論は似ているのですが、推論は大変なのでチェックをしつつ推論っぽいことが出来そうな時だけ推論っぽいことをしてみます。
型推論っぽい実装については、[2週間で出来る！スクリプト言語の作り方](http://gihyo.jp/book/2012/978-4-7741-4974-5)[1]を参考にしました。
パーサコンビネータの作成は、[Packrat Parserを使ってみた](http://sca-lab.blogspot.jp/2011/12/packrat-parser.html)[2]や、[tapl-scala](https://github.com/ilya-klyuchnikov/tapl-scala)[3] を参考にしました。

## 実装

環境を作って型を環境に保存し、また取り出して取り出して、２項演算子の型を求めると言った処理を追加します。

α変換を行った後に型チェックを行う事で、名前がぶつからないようになっていますが、これが良い事なのかどうかは分かりません。とにかく、うまくいっていればいいですよね。それで、テスト的なプログラムが動作するくらいまで出来たら終了としました。

## まとめ

パーサコンビネータ作ったパーサのASTに型チェックを入れた事で、動作するようになりました。おそらくバグっているとは思いますが、これで終了とします。

## 今後の予定

この後の予定は、ほんとうに使える言語に仕上げて行ったりする事と、パターンマッチの作り方を奇麗に纏める事です。文章能力は低いので大変ですけど、悩んでない方が多分分かりやすいだろうというのがあってそのように作ろうと思っています。今回はScalaで作成しましたが、Haxeで作ってみるのもありだよなぁと思っています。Haxeで作れば、CPPに変換できるのでC言語風の言語で奇麗にネイティブなコンパイラをかけるはずなんです。問題は、パーサコンビネータのライブラリである、ParserXをCPPで出力しようとするとエラーになってしまうので、パーサは別な方法で実装する必要があります。

## 参考文献

[1][２週間でできる！スクリプト言語の作り方](http://gihyo.jp/book/2012/978-4-7741-4974-5)
[2][Packrat Parserを使ってみた](http://sca-lab.blogspot.jp/2011/12/packrat-parser.html)
[3][tapl-scala](https://github.com/ilya-klyuchnikov/tapl-scala)
パターンマッチ実装奮闘記(10)

パーサを作ります。Scalaだと、パーサコンビネータのライブラリが標準でついているのでそれを使います。PackRatParserを使うとメモ化されるので、メモリは食いますが高速に処理できるので、こちらを使いました。また、正規表現も使いたいので、RegexpParserを使いました。

パーサコンビネータの良い所は小さいパーサを先に作ってそれを元に拡張して行けばよいので作るのが楽です。また、Yaccとは違ってコンフリクトが起きないので簡単です。お手軽なパーサを書くならパーサコンビネータは良いものです。

## 実装

実装ははじめに数値と識別子を実装して動かしてみました。次に、足し算、かけ算とprintの実装。で、ASTをコンパイルしてしまえば、動くので動かしながら、後は、ASTのテストを再現するコードを書いて、テストしながら成長させて行きました。それで、型のチェックが必要な箇所がでて来たのでそこは、パーサを作るだけで飛ばしたりしてます。



## まとめ

パーサコンビネータでパーサを作りました。
次回は、型チェックを作って、パーサからテストプログラムが全て動くようにしたいと思います。
RubyMotionでの定数の扱いと注意点


外部ライブラリなどで定義されている定数などを扱おうとした場合、うまくいかないことがある。

大きく注意する点は以下の2点

1つ目は、[公式ガイド](http://www.rubymotion.com/developer-center/guides/runtime/#_enumerations_and_constants)にもある通り、小文字で始まる定数は大文字にすると動く。（kCLLocationAccuracyBest → KCLLocationAccuracyBest）

2つ目は、`$ rake`時のREPLで動かなくてもその定数が使えない訳ではない。
厳密にはREPLはプロジェクトの中で読み込まれたもののみを利用可能にしているらしい。

これについては簡単に検証できた。

```sh:
$ motion create ConstTest
$ cd ConstTest/
$ vi Rakefile
```

```diff:Rakefile
 require 'motion/project/template/ios'
+require 'motion-cocoapods'

 Motion::Project::App.setup do |app|
   # Use `rake config' to see complete project settings.
   app.name = 'ConstTest'
+
+  app.pods do
+    pod 'Dropbox-iOS-SDK'
+  end
 end
```

`$ rake`

```sh:stdout
(main)> kDBRootDropbox
=> #<NameError: undefined local variable or method `kDBRootDropbox' for main:TopLevel>
(main)> KDBRootDropbox
=> #<NameError: uninitialized constant KDBRootDropbox>
(main)> exit
```
`$ vi app/app_delegate.rb`

```diff:app_delegate.rb
 class AppDelegate
   def application(application, didFinishLaunchingWithOptions:launchOptions)
+    puts KDBRootDropbox
     true
   end
 end
```
`$ rake`

```sh:stdout
(main)> KDBRootDropbox
=> "dropbox"
```

irbで確認 → プロジェクトで実装とやる人も少なくないと思うが、今回の定数がらみのものはREPLで動作しなくても、できないと思ってはいけない。

検証に利用したライブラリは[Dropbox SDK](https://www.dropbox.com/developers/core/sdk)
【Closure library】クラス継承とgoog.baseの呼び出し


Closure libraryを用いたクラスの継承とgoog.baseを用いた時の呼び出しについてのサンプルを用意した。

##1. 概要
<hr>
cClass,
cClassを継承したbClass,
bClassを継承したaClass

を用意し、
aClassのインスタンス生成によって
cClassのメソッドと呼び出す

##2.コード
<hr>

まずディレクトリの構成から。
<a href="http://kotazi.com/wp-content/uploads/2013/06/6bc117a48197b34c62de3840d73a80c5.png"><img src="http://kotazi.com/wp-content/uploads/2013/06/6bc117a48197b34c62de3840d73a80c5.png" alt="ディレクトリ構成" width="253" height="136" class="alignnone size-full wp-image-126" /></a>

次にindex.htmlのbody部分。
この時、
c,b,a,の順番で読み込まなければ動作しないので注意。
 
```index.html
<!--c,b,aの順番で読み込む-->
<script src="js/cclass.js"></script>
<script src="js/bclass.js"></script>
<script src="js/aclass.js"></script>

<script>
    //aClassのインスタンスを生成
    var aInstance = new js.aClass();
</script>
```

次にaClass 

 
```aclass.js

js.aClass = function (){

goog.provide('js.aClass');
goog.require('js.bClass');

js.aClass = function (){

  //継承先のコンストラクタを実行する
  goog.base(this);

  this.aMethod();
};

//js.bClassを継承する
goog.inherits(js.aClass, js.bClass);

//aClassの持つメソッド
js.aClass.prototype.aMethod = function(){
  console.log("this is aClass");
};
```


bclass。

```bclass.js

goog.provide('js.bClass');
goog.require('js.cClass')

js.bClass = function (){

  //継承先のコンストラクタを実行する
  goog.base(this);

  this.bMethod();
};

//js.cClassを継承する
goog.inherits(js.bClass, js.cClass);

//cClassの持つメソッド
js.bClass.prototype.bMethod = function(){
  console.log("this is bClass");
};
```

最後にcclass。

 
```cclass.js

goog.provide('js.cClass');

js.cClass = function (){
  this.cMethod();
};

//cClassの持つメソッド
js.cClass.prototype.cMethod = function(){
  console.log("this is cClass");
};
```



##3.結果
<hr>
サンプルを動かすと
"this is cClass "
↓
"this is bClass "
↓
"this is aClass "

の順番で処理が走る。

もしも
a→b→cの順に処理させたければ、

```aclass.js 
js.aClass = function (){

  this.aMethod();

  //継承先のコンストラクタを実行する
  goog.base(this);

};
``` 

のように、goog.baseを後ろに書くことで
継承先のメソッド呼び出しをあとに持ってくることができる。
CapistranoをNanocで使う

[Capistrano](https://github.com/capistrano/capistrano) はとっても便利で、Railsを使ったら間違いなく反映はこれ！
ってぐらいよく出来てるツールなんですがコイツをNanocなプロジェクトで使う編です。

[Nanoc](http://nanoc.ws/) はRubyで出来てる静的ページのCMSなんですが、

* HTMLをHamlで書きたい
* CSSをSassで書きたい
* Compassを使いたい
* JSをCoffeeScriptで書きたい

なんかの時にはとてもとても重宝しているツールです。
ちょっとこんなJS試したいなーの時とか簡単なサイト作るのに使ってます。
だって、HTMLとか書くの面倒じゃないですか！

開発時にはHamlとかでゴリゴリ書いていくんですが、
コイツをサーバーに乗せる時にはHTMLにしなきゃなりません。
そのため、一度「コンパイル」することが必要です。

ちなみにNanoc自体にも[Deploy](http://nanoc.ws/docs/guides/deploying-nanoc-sites/)機能はありますが、ちょっと手の込んだことをしたいケース等を想定しています。単純なrsyncだけならNanocだけで十分ですね。

## Capfileの修正
Non-RailsなプロジェクトにCapistranoを利用すると、`finalize_update` あたりでコケます。

```
No such file or directory
```

public/imagesなんてねーよ！と怒られる。そりゃそうです。
もともとCapistranoはRailsを想定していますからね。


そもそも、Non-Railsであるプロジェクトであれば不要なタスクが多いので、そいつらは始めに殺してしまう感じです。
`migrate`、`finalize_update`、`start`、`stop`、`restart` なんかは要らないですね。

```ruby
# config/deploy.rb
namespace :deploy do
  task :migrate do
    puts "    not doing migrate because not a Rails application."
  end
  task :finalize_update do
    puts "    not doing finalize_update because not a Rails application."
  end
  task :start do
    puts "    not doing start because not a Rails application."
  end
  task :stop do
    puts "    not doing stop because not a Rails application."
  end
  task :restart do
    puts "    not doing restart because not a Rails application."
  end
end
```

* [Deploying With Capistrano Without Rails](http://ryanflorence.com/deploying-with-capistrano-without-rails/)

## Nanocを自動でコンパイルさせる
Capistranoのソースをgitリポジトリにしているなんかだと、
当然コンパイルされないままプロジェクトが一式送信されてしまうので
私の場合はリモートでコンパイルするようにしてます。

Bundlerを利用していますので、

```ruby
# Capfile
require 'bundler/capistrano'
```

をCapfileに追記した後、タスクを

```ruby
# config/deploy.rb
namespace :deploy do
  # code
  after "deploy:update_code", "compile_nanoc"
end

task :compile_nanoc do
  puts "    Compiling nanoc..."
  run "cd #{release_path} && bundle exec nanoc compile"
end
```

こんな感じで書いてやるとリモートサーバーで `bundle install` が行われた後、
コンパイルが掛かります。失敗するともちろんデプロイは中断、 `rollback` してくれますよ。
AndroidのLayoutXML入力を効率化するIntellJ設定

デビューということでまずは簡単な記事でも書いてみます。

AndroidStudioでIntelliJデビューした方も多いと思うので、備忘録かねて半年ぐらい前に移行した自分がよく使う便利設定の紹介です。

__LiveTemplate__という機能があり、これを使うと【任意のキーワード＋TAB】で任意のコードを自動入力できます。
たとえば、sout(TAB)でSystem.out.println(""); とでますが、これもLiveTemplateの一種。

これをLayoutXMLで頻出するキーワードに割り当てるとすごく楽になるのでオススメ。

自分のオススメは、
 *layww* で
 *android:layout_width="wrap_content"* 
 *android:layout_height="wrap_content"* 
と出すようにしてます。
頻出するのに非常に長いタイプが必要なので、それをTAB込で6タイプに省略可能。

派生形で、layfw / layff を用意し、それぞれ match-wrap/ match-match に割り当ててます。
あとdip指定の　laydd　も便利。 お好みでlayfd や laydw などもどうぞ。

---------------------------------------
設定方法
(1)File>Settingsから設定画面を開く
(2)左ペインから LiveTemplatesを選択（上から2/3ぐらいの場所)
(3)右ペインから HTML/XML を選択（別になんでもいいんですが）
(4)右側の緑色のプラスボタンを選択
(5)下側に入力項目が出るので以下のように入力（最後に改行も入れておくと便利)

![livetemplate_add.png](https://qiita-image-store.s3.amazonaws.com/0/25944/d6f43d45-20b5-46e4-4b68-9415827d4574.png)

(6)このままでは、まだどのファイルタイプで使うか選んでいないので使えない。
　　下側に青い「Defaults」というリンクがあるので選択し、XMLにチェックを入れる。
(7)これでTemplate自体はできたのだが、せっかくなので独自グループに移動させたい
　　laywwを右クリックして、Move->NewGroupを選択。AndroidXMLとか入力
(8)あとはlaywwをコピーして他のバリエーションを作成


これで layww[TAB]でサクサクレイアウトXMLが記述できます。
かなり楽になるのでオススメです。
第12回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント : http://atnd.org/events/40389
をやります。

で。

これまで同様参考問題を出しました。
「道なりの亀」という名前で、
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思います。
とはいえ、これよりは若干簡単にすると思います。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますので出来ればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
startしたのにstartしないよ！

例：Apache2を起動

```py:fabric.py
from fabric.api import env, sudo


def servers():
    env.hosts = ["b13t.net"]


def startd():
    sudo("service apache2 start")
```

とか書いて，shellで

```
$ fab servers startd
````

とかすると，

```
[b13t.net] Executing task 'startd'
[b13t.net] sudo: service apache2 start

[b13t.net] out:  * Starting web server apache2
[b13t.net] out: httpd (pid 20130618) already running
[b13t.net] out:    ...done.
[b13t.net] out: 


Done.
Disconnecting from b13t.net:65537... done.
```
などとドヤ顔されますが，実際にsshで入ってps axしてもapache2は居ないしservice apache2 stateしてもNot runningとか言われてこの世の絶望を味わうわけです．

じゃあ絶望を振り払うにはどうすればいいのかというと

```py:
def startd():
    sudo("service apache2 start", pty=False)
```

と，pty=Falseを書けば絶望せずに幸せになる訳です．
ぼくは英語が読めないのでよくわかりませんが，
http://stackoverflow.com/questions/6379484/fabric-appears-to-start-apache2-but-doesnt
http://docs.fabfile.org/en/1.6/api/core/operations.html#fabric.operations.run
ここを読むと，pty=Trueの時の仮想端末がなにか情報を漏らしてしまっているのでしょうか．

事前にfabtoolsをpip installとかしてenv.userに十分な権限を与えられたuserを指定してあれば，以下でも起動するようです．（未検証）

```py:
from fabtools import service
def startd():
    service.start("apache2")
```
Sendmail: ISPのメールサーバー経由でメールを送る設定

Sendmailがプロバイダのメールサーバー経由でメールを送るようにするための設定について。

最近の MTA は Exim や Postfix が主流だと思っているのですが、未だ SendMail が入ったサーバーを触る機会があります。

tracサーバーから、社外へのメール通知が届かないという相談を受けました（社内の、サーバーと同じドメインをもつメールアドレスには届く）。調べたところ、sendmail が宛先のホストへ直接配送しようとして失敗しているようでした。
これを、(例えば)自社のISPが持っているメールサーバーを経由して配送するように修正します。


```
Jun 18 15:00:00 localhost sendmail[1433]: r5I57VlE0011234:
to=<xxxx@example.com>, delay=01:34:33, xdelay=00:04:00, mailer=esmtp,
pri=439587, relay=mx2.fsi.co.jp. [157.120.127.242], dsn=4.0.0,
stat=Deferred: Connection timed out with mx2.example.com.
```

## やった事
root で

```shell-session:
# yum install sendmail-cf  # 必要なパッケージをインストール (CentOSの場合)
# cd /etc/mail/
# vi sendmail.mc  # 設定を修正 (後述)
# make sendmail.cf  # sendmail.cf を更新
# pkill -HUP sendmail  # sendmail を再起動
```

## sendmail.mc の修正内容
```
--- /etc/mail/sendmail.mc.bak	2013-06-18 16:00:09.000000000 +0900
+++ /etc/mail/sendmail.mc	2013-06-18 16:30:00.000000000 +0900
@@ -171,6 +171,12 @@
 dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl
 dnl MASQUERADE_DOMAIN(mydomainalias.com)dnl
 dnl MASQUERADE_DOMAIN(mydomain.lan)dnl
+
+FEATURE(`masquerade_envelope')
+MASQUERADE_AS(`itpl.co.jp')dnl
+MASQUERADE_DOMAIN(`localhost.localdomain')dnl
+
 MAILER(smtp)dnl
 MAILER(procmail)dnl
 dnl MAILER(cyrusv2)dnl
+define(`SMART_HOST',`relay:mailhost.itpl.co.jp')dnl
```

- 送信者の localhost.localdomain を itpl.co.jp に書き換える (masquerae_envelope)
- メールを直接配送せず、 mailhost.itpl.co.jp を用いる (SMART_HOST)
【iOS7】フラットデザインUI実装に役立つライブラリのまとめ

iOS7で採用された**フラットデザインっぽいUIを、現行iOS（〜6.x）で実装する際に役立つライブラリ**（OSS）をまとめました。後半ではiOS7っぽく**下のビューをブラーかけて半透過表示**するライブラリや、**パララックス表示**するライブラリも紹介しています。


###[FlatUIKit](https://github.com/Grouper/FlatUIKit)

フラットデザインなUIコンポーネント詰め合わせ。ソースをみると、ほとんどのコンポーネントが該当するUIKitコンポーネントのカテゴリやサブクラスとしてつくってあって、使いやすそうです。

![](https://raw.github.com/Grouper/FlatUIKit/master/Example/README%20images/fuibutton-small.gif)

![](https://raw.github.com/Grouper/FlatUIKit/master/Example/README%20images/fuiswitch-small.gif)

![](https://raw.github.com/Grouper/FlatUIKit/master/Example/README%20images/fuislider-small.gif)

![](https://raw.github.com/Grouper/FlatUIKit/master/Example/README%20images/fuinavbar-small.gif)


###[UI7Kit](https://github.com/youknowone/UI7Kit)

iOS5, iOS6 で iOS7 の見た目を実現するUIKitのサブクラス集。

![](http://f.cl.ly/items/2e2Z351w2d2p3D3J090j/UI7Kit_r1_c1_.png)


###[iPhone Flat Design UI](http://www.appdesignvault.com/iphone-flat-ui-design-patterns/)

フラットデザインのサンプル集的なXcodeプロジェクト。コンポーネント化されて使い回せるわけではありませんが、こう設定すればこういう見た目にできるのか、という参考になります。

![](http://f.cl.ly/items/1o1K2o0j1G120j010z2q/ADVFlatUI1.png)
![](http://f.cl.ly/items/1u1Z0v3z422v1i260m3i/ADVFlatUI2.png)


###[QBFlatButton](https://github.com/questbeat/QBFlatButton)

フラットな見た目にできるUIButtonのサブクラス。

![](https://a248.e.akamai.net/camo.github.com/f00079bcfe23a36c31cefba35ea281dbdf6ce9ea/687474703a2f2f61646f746f75742e73616b7572612e6e652e6a702f6769746875622f5142466c6174427574746f6e2f737330312e706e67)


###[Flat Pill Button](https://github.com/brianmichel/FlatPillButton)

![](https://s3.amazonaws.com/cocoacontrols_production/ios_screens/1366/full.png?1352686733)


###[FlatWebView](https://github.com/aaronbrethorst/FlatWebView)

UIWebViewの後ろのドロップシャドウをなくしたUIWebViewサブクラス。実装をみると、subviewsを辿ってUIImageViewをhiddenにしているようです。

![](https://github.com/aaronbrethorst/FlatWebView/raw/master/Screenshot.png)


###[FlatButton](https://github.com/jessesquires/FlatButton)

![](https://raw.github.com/jessesquires/FlatButton/master/Screenshots/screenshot-iphone4-2.png)


##おまけ1：iOS7ぽいビューを実現するUIライブラリ

###[DKLiveBlur](https://github.com/kronik/DKLiveBlur)

![](https://s3.amazonaws.com/cocoacontrols_production/ios_screens/2086/full.png?1371472065)

動的に下のビューをぼかして半透過っぽく表示してくれるビュー。ちゃんと**Accelerate.frameworkを使用**して実装されてるのでレスポンス面は期待してよさげ。

###[CFIFrostedOverlayView](https://github.com/CodaFi/CFIFrostedOverlayView)

![](https://s3.amazonaws.com/cocoacontrols_production/ios_screens/2084/full.png?1371424260)

上記同様、superviewをブラーをかけて表示してくれるビュー。こっちはGPUImageを使用。


###[Parallax](https://github.com/acoomans/Parallax)

![](https://raw.github.com/acoomans/Parallax/master/ParallaxDemo/parallax.gif)

パララックス表示するビュー。ただサンプルのアニメーションGIFにあまりパララックス感がないような。。（あとで動かしてみます）


##おまけ2：フラットUIデザイン素材

###[Free iOS 7 UI Kit](http://medialoot.com/item/free-ios-7-ui-kit/)

> Start designing iOS 7 apps today with this comprehensive GUI kit for Photoshop. Absolutely every element you see is 100% vector and completely editable!

![](http://medialoot.com/images/thumbs/640x440x1_iOS_7_UI_Kit_Preview1.png)
JSLintでnewcap:trueを指定しても小文字から始まるコンストラクタに警告を返す

古いJSLintでは、'use strict'があると、newcap:trueを上書きしてしまうようです。

```js:
/*jslint newcap:true*/
(function () {
	"use strict";
	var o;
	function myClass() {
	}
	
	// A constructor name 'myClass' should start with an uppercase letter. となる
	//o = new myClass();

	// use strictより後にnewcap:trueすると警告は出ない
	/*jslint newcap:true*/
	o = new myClass();
}());

```
2012-04-15に修正されています。
https://github.com/douglascrockford/JSLint/commit/4f2bf65ed59a0ba16fb22a6a90f76fc0060a2c22

Brackets Sprint 26に同梱のJSLintで現象を確認しました。jslint.jsのeditionは2012-01-13となっていました。
【バッチファイル】ファイル数のカウント【備忘録】

ファイル数を調べる備忘録

```bat:

@echo off

set /a counter=0
rem for /r にすると　その下のものすべて対象
for  %%A in (*) do ( if exist %%A (set /a counter=counter+1) )

echo %counter%

```
【バッチファイル】日付の取得【備忘録】

日付の取得の備忘録

```bat:
@echo off
rem 年
set YＹＹY=%date:~,4%
rem 月
set MM=%date:~5,2%
rem 日
set DD=%date:~8,2%

echo "%YYYY%年\%MM%月\%DD%日"

```

実行結果は言わずもがな今日の日付

全部つながってていいならこっちのが楽

```bat:
%date:/=%
```

yymmdd形式ならこう
20130615ならば
130615で取得

```bat:
rem 日付の計算
set dat=%date:/=%
set dat=%dat:~-6%
```
jQueryで表示文字数制限

表示文字数を制限して、デフォルトでは「ほげほげ…[全文表示]」のように表示しておいて、[全文表示]をクリックしたら全文表示されるよくあるやつです。

```js:
$(window).on('load', function(){
  if($('.textOverFlow').length > 0){
    var count = 100; // デフォルトで表示する文字数
    $('.textOverFlow').each(function(){
      var target = $(this),
          fullTxt = target.text();
      if(fullTxt.length > count){
        target.text(fullTxt.substr(0,count) + '…');
        var moreLead = $('<span class="moreLead">[全文表示]</span>');
        target.append(moreLead);
        moreLead.on('click', function(){
          target.text(fullTxt);
          $(this).remove();
        });
      }
    });
  }
});


 ```
```html:
<p class="textOverFlow">テキストテキスト</p>
 ```

```css:
,moreLead {
 color: blue;
 cursor: pointer;
}
 ```
第11回オフラインリアルタイムどう書く Erlang による実装

http://qiita.com/items/93cde1a6b7561426a3ac
Erlangでやってみました。

線が交叉しているポイントを取得し(cross_p)、その列を入れ替えています(reorder_cols)。これをデーターの数だけ繰り返しています(foldl)。

```erlang:ba.erl
-module(ba).
-export([tests/0, test/2, amida/1]).

tests() ->
  test("d6-7b-e1-9e", "740631825"), % 0
  test("6f-dd-ff-ff", "230685147"). % 41

test(Data, Expected) ->
  io:fwrite("~s -> ~s, ~w~n", [Data, Expected, amida(Data) =:= Expected]).

amida(Data) ->
  Hexes = string:tokens(Data, "-"),
  Init_cols = array:from_list("012345678"),
  array:to_list(lists:foldl(fun reorder_one_row/2, Init_cols, Hexes)).

% change column order of one row.
reorder_one_row(Hex, Cols) -> reorder_cols(Cols, cross_p(bin(Hex))).

% array(0123456789), [{0, 2}, {3, 4}] -> array(2104356789).
reorder_cols(A, [])         -> A;
reorder_cols(A, [{X, Y}|T]) -> reorder_cols(swap(A, X, Y), T).

% array(abcd), 1, 3 -> array(adcb). Indexes are zero origin.
swap(A, X, Y) ->
  Xvalue = array:get(X, A),
  Yvalue = array:get(Y, A),
  array:set(Y, Xvalue, array:set(X, Yvalue, A)).

% "d6" -> "11010110".
bin(Hex) -> integer_to_list(list_to_integer(Hex, 16), 2).

% "11010110" -> [{5, 7}, {3, 4}, {0, 2}].
cross_p(Bin)              -> cross_p(Bin ++ "0", $0, 0, []).
cross_p([], _, _, L)      -> L;
cross_p([$0|T], $0, S, L) -> cross_p(T, $0, S, L);
cross_p([$1|T], $0, _, L) -> cross_p(T, $1, 8 - length(T), L);
cross_p([$0|T], $1, S, L) -> cross_p(T, $0, 0, [{S, 8 - length(T)} | L]);
cross_p([$1|T], $1, S, L) -> cross_p(T, $1, S, L).
```
Lubuntu でキーボードの配列をコマンドラインから変える

外付けのキーボードを後から繋ぐとそのキーボードだけ日本語配列になってしまうという不具合に遭遇した (ログイン時から繋ぎっぱなしなら問題無い．謎い)．

多分 `/etc/default/keyboard` 内に

```text:/etc/default/keyboard
# (前略)
XKBMODEL="jp106"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS="lv3:ralt_switch"
# (後略)
```

なんてのがあるせいじゃないだろうか．よく分からんが．

`sudo` がなければ変えられないところの設定は出来ればそんなに変えたくない．外付けキーボードを付けるたびに GUI で設定をいちいち変えに行くのは面倒．

ただキーボードを繋いだ時に一度だけ特定のコマンドを実行するくらいなら別に構わない (どうせターミナルは開きっぱなしにしてるし)．

どうやら `setxkbmap` というコマンドを使えばいいような気がする．ということで，

* [Lubuntu でキーボードの Repeat delay と Repeat interval を設定 - Qiita [キータ]](http://qiita.com/items/fbf15ead4f0c57ffdfe3)
* [Lubuntu で Caps Lock を Left Control に変更 - Qiita [キータ]](http://qiita.com/items/44c6f3c044846eed4c2e)

も参考にしつつ `$HOME/local/bin/init-kbd` として

```bash:$HOME/local/bin/init-kbd
#! /bin/sh

setxkbmap us
xmodmap $HOME/.xmodmap
xset r rate 250 50
```

というファイルを作った．外付けキーボードを繋ぐ度に `init-kbd` と実行すれば心に平穏が訪れる．

## References

* [LXDE (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/LXDE_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29#.E3.82.AD.E3.83.BC.E3.83.9C.E3.83.BC.E3.83.89.E9.85.8D.E5.88.97)
Nokogiriでスクレイピング

# nokogiriとは

gemで提供されているスクレイピングライブラリのこと。

**公式サイト**
http://nokogiri.org/

# install

gemでインストールする。

``` 
gem install nokogiri
```

# 使い方

使い方はとにかく簡単。
スクレイピングしたいページにアクセスし、HTMLを取得してきた後、nokogiriを通して各要素にアクセスする。
要素へのアクセス方法は、XPathというものとCSS記法によるものがあるらしいが、普段使い慣れているCSSが使えれば十分だと思った。

### サンプル

```nokogiri.rb
require 'nokogiri'
require 'open-uri'

html = Nokogiri::HTML(open('https://www.google.co.jp/'))
logo = html.css('#hplogo').first # id="hplogo"
logo.name # タグ名
logo.attributes # 属性情報のハッシュ
logo.children # 子要素の配列
logo.content # タグの中身のテキストのみ
logo.inner_html # タグの中身のHTML
```

nokogiriオブジェクトにはcssメソッドが提供され、このcssメソッドを使用して各要素にアクセスする。
cssメソッドの引数には、ほぼそのままCSS記法が使える。

```css.rb
html.css('.hoge') # class="hoge"
html.css('.hoge > img') # class="hoge"の子要素にあるimgタグ
```
node-spritesheetのサンプルが違ってた

[node-spritesheet](https://github.com/richardbutler/node-spritesheet)というnpmがありまして。

今これ使ってるんですが、[README](https://github.com/richardbutler/node-spritesheet/blob/master/README.md)のサンプルが違ってたんで、ここでメモ。

具体的には以下のようなコードが書いてるんですが

```javascript
builder.build( function() {
    console.log( "Built from " + builder.images.length + " images" );
});
```

これだと`undefined`になってしまいます。いつからなのかは分かりませんが、`images`というプロパティは現在のnpmに上がってるバージョンには無いため以下のようにしないと、渡したファイルの数が取れません。

```javascript
builder.build( function() {
    console.log( "Built from " + builder.files.length + " images" );
});
```

`files`に渡した画像の配列が入ってるので、これに変更すれば取れます。

誰もハマらないと思うけど。