OmniAICreator/Qiita-1.07M huggingface dataset:
MacでのVim環境構築メモ

MacでのVim操作でのコーディング環境の構築メモ

#XVim

XcodeのキーバインドをVimのものへ変更する。
https://github.com/Jugglershu/XVim

詰まった点は、
Cocoa.h
が見つからずコンパイルが通らなかった。
以下を変更すればOK。

XVimのプロジェクトの設定を変更。
Setting->Architectures->Base SDK
これを、
Latest OSX(OSX 10.8)
へ修正する。これでコンパイルが通るようになる。

#MacVim

Mac用のVimエディタ。
（説明がアバウトです(；´Д｀)
以下のURLとかを参考にした。
http://mknthk.hatenablog.com/entry/20130405/1365169187

#.vimrc
NeoBundleのインストールと設定
http://vimblog.hatenablog.com/entry/vimrc_plugin_management

```vim:.vimrc
"--------------------
"" 基本的な設定
"--------------------
""新しい行のインデントを現在行と同じにする
set autoindent

"バックアップファイルのディレクトリを指定する
set backupdir=$HOME/vimbackup

"クリップボードをWindowsと連携する
set clipboard=unnamed

"vi互換をオフする
set nocompatible

"スワップファイル用のディレクトリを指定する
set directory=$HOME/vimbackup

"タブの代わりに空白文字を指定する
"set expandtab

"タブ幅の設定
set tabstop=4

"変更中のファイルでも、保存しないで他のファイルを表示する
set hidden

"インクリメンタルサーチを行う
set incsearch

"行番号を表示する
set number

"閉括弧が入力された時、対応する括弧を強調する
set showmatch

"新しい行を作った時に高度な自動インデントを行う
set smarttab

"新しい行を作った時に高度な自動インデントを行う
set smarttab

" grep検索を設定する
set grepformat=%f:%l:%m,%f:%l%m,%f\ \ %l%m,%f
set grepprg=grep\ -nh

" 検索結果のハイライトをEsc連打でクリアする
nnoremap <ESC><ESC> :nohlsearch<CR>

" vimgrepやgrep した際に、cwindowしてしまう
autocmd QuickFixCmdPost *grep* cwindow

" エスケープシーケンスの表示 tab eol
set list
set listchars=tab:▸\ ,eol:¬

" 全角スペースの表示
function! ZenkakuSpace()
	highlight ZenkakuSpace cterm=reverse ctermfg=DarkGray gui=reverse guifg=DarkGray
endfunction
if has('syntax')
	augroup ZenkakuSpace
		autocmd!
		"ZenkakuSpace をカラーファイルで設定するなら、
		"次の行をコメントアウト
		autocmd ColorScheme       * call ZenkakuSpace()
		autocmd VimEnter,WinEnter * match ZenkakuSpace /　/
	augroup END
	call ZenkakuSpace()
endif


"
" NeoBundle
"
"
" NeoBundle がインストールされていない時、
" もしくは、プラグインの初期化に失敗した時の処理
function! s:WithoutBundles()
  colorscheme desert
  " その他の処理
endfunction

" NeoBundle よるプラグインのロードと各プラグインの初期化
function! s:LoadBundles()
  " 読み込むプラグインの指定
  NeoBundle 'Shougo/neobundle.vim'
  "NeoBundle 'tpope/vim-surround'
  NeoBundle 'Shougo/unite.vim'
  NeoBundle 'Shougo/vimfiler.vim'
  " ...
  " 読み込んだプラグインの設定
  " ...
endfunction

" NeoBundle がインストールされているなら LoadBundles() を呼び出す
" そうでないなら WithoutBundles() を呼び出す
function! s:InitNeoBundle()
  if isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    filetype plugin indent off
    if has('vim_starting')
      set runtimepath+=~/.vim/bundle/neobundle.vim/
    endif
    try
      call neobundle#rc(expand('~/.vim/bundle/'))
      call s:LoadBundles()
    catch
      call s:WithoutBundles()
    endtry 
  else
    call s:WithoutBundles()
  endif

  filetype indent plugin on
  syntax on
endfunction

call s:InitNeoBundle()


```

#EscキーでのIME off
Google IMEを使用する。
環境設定ｰ>キー設定の選択
ことえりを選択し、右の編集。
全モードで、Escキー入力で 「キャンセル後IMEを無効化」を追加。
参考URL
http://d.hatena.ne.jp/sifue/20120411/1334161078

#ViVi

これがあれば、個人的には楽だった…
まだ開発途中で未公開。
Vimの勉強も兼ねて今回はVimでやってみる。
Chromeのコンソールにテーブルを表示する

**サンプル1**

```js:
var data = [[1,2], [3,4]];
console.table(data);
```

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/153/95052e13-a54f-e3aa-b899-0d70e0bfabf0.png)

**サンプル2**

```js:
var data = {data1:[1,2], data2:[3,4]};
console.table(data);
```

![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/153/cfe5b4a8-0d3c-e0e1-07d2-31045f443121.png)

**サンプル3**

```js:
function Add(name, price){
    this.name = name;
    this.price = price;
}

var data = {};
data[0] = new Add("すごいテレビ", 100);
data[1] = new Add("伝説の雑誌", 200);
data.test = new Add("テスト", 9999);    

console.table(data);
```
![image1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/26847/f0217872-0708-8ed0-bd00-16cc9829e0ae.jpeg)

**console.table未対応ブラウザを考慮する場合**

```js:
if (void 0 !== window.console && void 0 !== console.table) {
    // 対応していた場合のコードをここ書く
} else {
    alert("このブラウザはconsole.tableに未対応です");
}
```
ヘッダが固定されているページで、ページ内リンクの位置を調整する

Twitter Bootstrapとかを使っていると、ヘッダ部分を簡単に固定することができます。Qiitaのヘッダとかもそうです。
ただここで問題なのが、同一ページ内でidとかnameを使って遷移する場合、そのままだとリンク先の部分がヘッダに隠れてしまいます。
Qiitaでまさにこの問題にハマりました。

## 解決方法
方法はいろいろあると思いますが、とりあえず簡単にやりたいなーということで空の`<span>`を使う方法を選択しました。
**コメントで教えていただいたのですが、見出しの中にblock要素を入れるのは標準規約違反となるので注意して下さい。**
見出し部分のソースは下のとおりになっています。

```html
<h1>
  <span id="1-1"></span>
    <a href="#1-1"><i class="icon-link"></i></a>簡単なまとめ
</h1>
```

`<h1>`に空の`<span>`が入っているのがわかるかと思います。
この空spanに対して、下のようにスタイルを適用します。

```css
h1 > span {
  position: relative;
  top: -65px;
  display: block;
}
```
topは開けたい空間のサイズを設定してください。Qiitaの場合、ヘッダが40pxあって、ヘッダのすぐ下だと見難いので若干広めに幅を持たせるために多めにしています。
こうするとリンク先はヘッダにめり込むようになるんですが、空divなので表示上は特に問題ないですし、変な影響も出てない(はず)です。

![スクリーンショット 2013-07-11 13.42.33.png](https://qiita-image-store.s3.amazonaws.com/0/2/5459a4ae-64b4-2368-d05e-55880308876f.png "スクリーンショット 2013-07-11 13.42.33.png")
この左側のアイコンがリンクになっているのでクリックすると、

![スクリーンショット 2013-07-11 13.42.45.png](https://qiita-image-store.s3.amazonaws.com/0/2/fc4c3e3e-595e-2d34-3534-e20d59034f77.png "スクリーンショット 2013-07-11 13.42.45.png")
こんなかんじでリンク先の見出しがヘッダにめり込んでしまっていたのが、

![スクリーンショット 2013-07-11 13.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/2/40165cb9-ff28-1a0f-d456-cd2c55af48e4.png "スクリーンショット 2013-07-11 13.43.39.png")
良い感じの位置になりました。

他にもっといい方法あればコメントいただけるとうれしいです。

### 注意点
- クロスブラウザチェック甘いので、ブラウザの種類やバージョンによっては正しく動作しない可能性があります。
よくある全選択チェックボックス jQuery 実装

[こちら](http://qiita.com/ituki_b/items/17eab8c38a2ad5392660)にインスパイアされました。

```html:
<ul>
    <li><label><input type="checkbox" id="all" /> Check all</label></li>
    <li><label><input type="checkbox" name="check" value="1" /> value 1</label></li>
    <li><label><input type="checkbox" name="check" value="2" /> value 2</label></li>
    <li><label><input type="checkbox" name="check" value="3" /> value 3</label></li>
    <li><label><input type="checkbox" name="check" value="4" /> value 4</label></li>
</ul>
```

```js:
$('#all').on('change', function() {
    $('input[name=check]').prop('checked', this.checked);
});
```

~~[デモ](http://jsdo.it/otchy/tvgB)~~
[2020-05-03 追記] サービス終了によりデモは利用できなくなりました。
JavaScriptでsprintf

少し探したが、これがよさそう
http://homepage3.nifty.com/aya_js/js_sub/sprintf.htm

以下引用

>例
>sprintf("%d", 12345));        12345           //符号付き10進整数
>sprintf("%d", 123.6));        123             //四捨五入でなく切り捨て
>sprintf("%6d", 123));            123          //幅指定
>sprintf("%06d", 123));        000123          //flag 0
>sprintf("%06d", -123));       -00123          //先頭は -
>sprintf("%6.4d", 123));         0123          //整数の精度
>sprintf("%6.8d", 123));       00000123        //精度優先
>sprintf("%f", 123.45));       123.450000      //小数 デフォルトの精度は6
>sprintf("%11f", 123.45));      123.450000     //幅指定
>sprintf("%.3f", 123.45));     123.450         //精度指定
>sprintf("%7.1f", 123.25));      123.2         //四捨五入ではない
>sprintf("%7.1f", 123.251));     123.3         //5より大きければ切り上げ
>sprintf("%7.0f", 123.45));        123         //精度0なら.無し
>sprintf("%08.2f", 123.45));   00123.45        //flag 0
>sprintf("%08.2f", -123.45));  -0123.45        //先頭は -
>sprintf("%E", 123.45));       1.234500E+02    //指数 デフォルトの精度は6
>sprintf("%13E", 123.45));      1.234500E+02   //幅指定
>sprintf("%.4E", 123.45));     1.2345E+02      //精度指定
>sprintf("%13.5e", 123.45));     1.23450e+02   //指数e
>sprintf("%s", "abc"));        abc             //文字列
>sprintf("%4s", "abc"));        abc            //幅指定
>sprintf("%.2s", "abc"));      ab              //精度指定
>sprintf("%4.s", "abc"));                      //精度 0
>sprintf("%d", 123.45));       123             //小数は整数にして表示
>sprintf("%d", "123"));        123             //文字列も整数にして表示
>sprintf("%d", "abc"));        0               //数値と解釈できないときは0
>sprintf("%7s", 123.45));       123.45         //数値を文字列に変換
>sprintf("%-7d", 123.45));     123             //左詰め
>sprintf("% f", 123.45));       123.450000     //空白追加
>sprintf("%+7.3f", 123.45));   +123.450        //+追加
>sprintf("%+- 9.2fa", 123.45)); +123.45 a      //複数のオプション

===追記===
↑のを使うとけっこうNaNが出るので、
↓の方がよさそう

https://github.com/alexei/sprintf.js
tmuxで同時にコマンド実行

window内の行数、列数指定
超えると次のwindow作成
window内はコマンド同期
/etc/hostsからサーバー取得

```
#!/bin/bash

HOSTS_FILE="/etc/hosts"

row=$1
column=$2
hostname_prefix=$3

hostname=(`grep ${hostname_prefix} ${HOSTS_FILE} | awk '{ print $2 }' | grep ^${hostname_prefix}`)

tmux start-server
tmux new-session -d -s tmux-ssh

window_num=0

for ((i=0;i<${#hostname[@]};i++)); do
  if [ `expr ${i} % \( ${column} \* ${row} \)` -eq 0 ]; then
    window_num=`expr ${i} / \( ${column} \* ${row} \)`
    window_name="tmux-ssh-window${window_num}"
    tmux new-window -n ${window_name}
    tmux set-window-option -t ${window_name} synchronize-panes on
    tmux select-window -t ${window_name}
    tmux split-window -h -t ${window_name}
    tmux select-layout -t ${window_name} main-horizontal
    pane0=${i}
  elif [ ${i} -lt `expr ${pane0} + ${column}` ]; then
    tmux split-window -h -t ${window_name}
    tmux select-layout -t ${window_name} main-horizontal
  else
    row_num=`expr \( ${i} / ${column} \) % ${row} + 1`
    column_num=`expr \( ${i} % ${column} \) + 1`
    tmux select-pane -t `expr ${row_num} \* ${column_num} - 1`
    tmux split-window -v -t ${window_name}
  fi
  tmux send-keys "ssh ${hostname[i]}" C-m
done

for i in `seq 0 ${window_num}`;do
  tmux select-window -t tmux-ssh-window${i}
  tmux kill-pane -t 0
done

tmux select-window -t tmux-ssh-window0
tmux kill-window -t 0
tmux attach-session -t tmux-ssh
```

例)/etc/hostsからdev-wap*のホスト名を取得し一斉ログイン。1window内は2行3列

```
./tmux_ssh 2 3 dev-wap
```
JQueryMobileで、どのセレクタでポップアップを開いたかわからないけど、popup('close')したい時

```js:
$('.ui-popup-active').length
```
でポップアップが開いてる場合は１、閉じてれば0が返る。
なので閉じる時は、

```js:
if ( $('.ui-popup-active').length > 0 ) {
    $('.ui-popup-active').find(':jqmData(role="popup")').popup('close');
}
```

みたいにすれば閉じれる。
ui-popup-active　というクラスがあるってことどっかに書いといてよ・・・
【MySQL】CSVファイルをインポートするコマンド

```mysql
# TERMINATED BY 区切り文字
# ENCLOSED BY 囲み文字
LOAD DATA LOCAL INFILE '/tmp/import.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"'
```

```mysql:
# データを入れるカラムを指定
LOAD DATA LOCAL INFILE '/tmp/import.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' (column1, column2)
```
MYSQLをrubyで操作するスクリプト


## genのインストール

```
gem install mysql
gem list
```

`gem list`で`ruby-mysql`が入っていればインストール成功

## rubyのスクリプト作成

```ruby:test.ruby
require 'rubygems'
require 'mysql'

my = Mysql::new("サーバー名(ipでも可)", "データベース名", "パスワード", "スキーマー名", ポート番号)
selectSql = "select id, name from table;"
res = my.query(selectSql)
res.each_hash do |row|
  id = row["id"]
  tel = row["name"]
  print "id:" + id + "name:" + name
end
```

ファイル名は`test.ruby`などrubyの拡張子を指定して作成

## スクリプト実行

```
ruby test.ruby
```

これで結果が返ってくる

## おまけ

電話番号を半角数字に正規化するプログラム

```ruby
require 'rubygems'
require 'mysql'
require 'nkf'

deleteWordHan = Array["-",")","(","+"]

my = Mysql::new("192.XXX.XXX.XXX", "XXXXX", "XXXXXXXX", "XXXXX", 00000)
selectSql = "select id, tel from m_corporation;"

res = my.query(selectSql)
res.each_hash do |row|
  id = row["id"]
  tel = row["tel"]
  tel = NKF.nkf('-m0Z1 -w', tel)

  for var in deleteWordHan do
    tel = tel.delete(var)
  end

  updateSql = "update m_corporation set tel_normalized = '" + tel + "' where id = " + id + "" + "\n"
  print updateSql
  my.query(updateSql)

end
```

`update`文も`select`文のときと同じようにかける。
全角文字を半角にするためにnkfを使っているがこれはgemのインストールは不要で使える。
Objective-C のコンテナ操作


http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/Collections/Collections.html

## 主なコンテナクラス

* NSArray, NSMutableArray : 配列。順序維持。インデックス参照可能。
* NSSet, NSMutableSet : 集合。順序不定。重複が無い。
* NSDictionary, NSMutableDictionary : 連想配列。順序不定。キー参照可能。
* NSHashTable : 集合。弱参照モードがある。
* NSMapTable : 連想配列。弱参照モードがある。

弱参照モードについては[Objective-C の弱参照コンテナ](http://qiita.com/imk2o@github/items/558d10a9bf43f99dc91c)を参照。

## 参照

[Objective-C のシンタックスシュガー](http://qiita.com/items/6a2edc962f06e2b1d7dd)を使うとシンプルな構文で参照が行える。

```objc:
NSArray* array = @[@1, @2, @3];
NSDictionary* dict = @{@"header": @"Header data...", @"content": @"Content data..."};

NSNumber* topValue = array[0];    // topValue = @1
NSString* content = dict[@"content"];    // content = @"Content data..."
```

## 列挙

### for 文による列挙

NSArray や NSSet は要素を列挙する。

```objc:
for (NSString* value in array) {
    ...
}
```

NSDictionary は キーを列挙する。

```objc:
for (NSString* key in dict) {
    NSNumber* value = dict[key];
    ...
}
```

### blocks による列挙

for 文による列挙は配列のインデックスを得ることができず、キーに対する値の取得もその都度行うため効率が悪い。
これらの対策として blocks を使う方法がある。

```objc:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    ...
}];
```

```objc:
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    ...
}];
```

## 挿入

原則として NSObject を継承したクラスオブジェクトしか格納できない。
POD 型は NSNumber や NSData でラップして格納する。

```objc:
NSMutableArray* mutableArray = [NSMutableArray new];

double value = 5.6;
[mutableArray addObject:@(value)];

CGPoint point = CGPointMake(100, 200);
[mutableArray addObject:NSStringFromCGPoint(point)];
```

## 削除

### ループ中の削除

ある条件を満たす要素だけ削除するコードを書く場合、ループ中に削除を行おうとすると例外が発生する。

```objc:
[mutableArray enumerateObjectsUsingBlock:^(NSNumber* value, NSUInteger idx, BOOL *stop) {
    if (value.intValue == 0) {
        [mutableArray removeObjectAtIndex:idx];    // NG!!
    }
}];
```

ループでは削除する位置だけ求めておき、ループを抜けた後でまとめて削除を行う。

```objc:
NSMutableIndexSet* indexes = [NSMutableIndexSet new];
[mutableArray enumerateObjectsUsingBlock:^(NSNumber* value, NSUInteger idx, BOOL *stop) {
    if (value.intValue == 0) {
        [indexes addIndex:idx];    // 削除する位置だけ記録
    }
}];
// まとめて削除
[mutableArray removeObjectAtIndexes:indexes];
```
URLからファイル名を取得する正規表現


これは便利。

```
var url = window.location.href;

// 拡張子付きで
var filename_ex = url.match(".+/(.+?)([\?#;].*)?$")[1];
// 拡張子無しで
var filename = url.match(".+/(.+?)\.[a-z]+([\?#;].*)?$")[1];
```
参考
http://javascript-memo2.seesaa.net/article/159034796.html

※2013.7.11
参考URLのスクリプトでは、QueryStringやhashがあった場合、ファイル名が正常に取得出来ないの、修正しました。kawazさんのご指摘ありがとうございます！
vimをless代わりに使う

普段はemacsを使っているけれど，ちょっとターミナルでコードを見たいときにシンタックスハイライトするために以下のように見ている．`-R`はreadonly．

```sh
$ vim -R app/models/item.rb
```

以下コードを読む用の最低限の設定

```vim:~/.vimrc
set nocompatible  " おまじない
syntax on  " シンタックスハイライト有効化
set number  " 行数表示
nnoremap q :<C-u>q<CR>  " q でvimを閉じる
colorscheme darkblue

" 行末のスペースを赤く表示する
highlight WhitespaceEOL ctermbg=red
match WhitespaceEOL /\s\+$/

" 検索関連
set hlsearch  " マッチした箇所をハイライトする
set incsearch  " インクリメンタルサーチ
set smartcase  " 大文字小文字をいい具合に区別する
```

lessっぽく`alias l="vim -R"`とすると便利

<ins>追記: viewコマンドでreadonlyで開くことができます</ins>
Windows 98SE の初期設定に便利なコマンドとツール(98lite)

![98_32gb.png](https://qiita-image-store.s3.amazonaws.com/0/25728/79599cb7-175f-c3db-c1d4-becd564fa4f8.png)

参考 : [Virtual BOX で、Windows 98 を快適に使う方法 | Surlofia サーロフィア](https://www.surlofia.com/windows-98-svga-on-virtual-box/)

## 98lite

### 1.仮想HDDにWindows95のファイルコピー

* VirtualBoxでHDDイメージをVHD形式選択。容量は32GB。
* VHDイメージを「ディスクの管理＞VHDの接続＞フォーマット」
* VHDイメージに以下格納
* c:\98lite.exe
* Windows95のCD内\win95\win95_xx.cabを解凍し、"explorer.exe","shell32.dll","comdlg32.dll"を抽出し、c:\95\にコピー。
* VHDの切断

### 2.DOS起動し、Windows98seのセットアップファイルコピー

* VirtualBoxからFDD起動(英語モードで、CD-ROM利用可能な状態で起動。)
* c:\98lite.exeを起動。
* Windows98のPATHを、E:\win98\ に指定。
* c:\98etup\ にファイル郡がコピーされるので、c:\98setup\98lite.exeを実行。

### 3.DOS起動し、Windows95のファイルを指定、OSセットアップ開始

* c:\98lite.exeを起動。
* Windows95のPATHを、C:\95\ に指定。
* c:\98etup\ にファイル郡がコピーされ、セットアップが始まります。
* セットアップ終わったら、c:\_98.bat、c:\98setup\、c:\95\は削除して良いです。

### 4.EMM386 not installed で起動できない件対応

* c:\config.sys の以下を書き換える。（FDD起動してEDITコマンドか、VHDマウントして編集して下さい。）

```bash:c:\config.sys
#device=C:\WINDOWS\EMM386.EXE RAM
device=C:\WINDOWS\EMM386.EXE NOEMS
```

### 5.ネットワークパスワードの入力ダイアログを表示させなくする

* コントロールパネル＞ネットワーク＞プライマリログオン＞Windows ログオン＞再起動

### 6.display driver (virtualbox)

VirtualBox Guest Additionsがwindows98に対応していないため、
[VBEMP 9x Project - Universal VESA/VBE Video Display Driver](https://bearwindows.zcm.com.au/vbe9x.htm#2) のドライバーを有難く使わせて頂く。

\VBE9X\UNI\vbemp.inf

### 7.KernelEX

* [Microsoft Layer for Unicode](http://www.microsoft.com/en-us/download/details.aspx?id=4237)をダウンロード＞実行＞解凍＞unicows.dll と unicows.pdb を C:\windows\system\ にコピー
* [KernelEX](http://sourceforge.jp/projects/sfnet_kernelex/)をセットアップ、再起動

---

## Webブラウザ

* Firefoxは2.0 が対応している最終バージョン
    * https://ftp.mozilla.org/pub/firefox/releases/2.0.0.20/win32/ja/
* Opera は [10.63](https://bzizi.exblog.jp/14463584/) まで。
RubyでN桁のランダムな数字からなる文字列を得る

[SecureRandom](http://www.ruby-doc.org/stdlib-2.0/libdoc/securerandom/rdoc/SecureRandom.html)にはそういうメソッドはないみたい。

こんな感じ？

```rb:
require 'securerandom'

N = 10
p N.times.map { SecureRandom.random_number(10) }.join # "7260150113"
```

追記:
コメントより、以下のほうがずっと高速にできるようです。

```rb:
p format("%0#{n}d", SecureRandom.random_number(10**n))
```
Gruntfile 内で引数やオプションを受け取る方法

## 引数

- 引数は `grunt yourtask:yourchildtask:引数0:引数1` という風に指定する、指定していないサブタスクは自動的に引数として処理される
- これが `grunt.task.current.args` 内に入っている

例えば、以下のタスクの場合：

```js:
grunt.initConfig({
  yourtask: {
    options: {
      'youropt': '<%= grunt.task.current.args[0] %>'
    }
  }
});
```

`grunt yourtask:unk` を実行すると `"unk"` が `youropt` に指定される。


## オプション

- オプションは `grunt.cli.options` 内に入っている
- `options` は Object で、オプションだけならその指定したキーに true が、値も入れたらそれが入る

例えば、以下のタスクの場合：

```js:
grunt.initConfig({
  yourtask: {
    options: {
      'youropt': '<%= grunt.task.cli.unk ? grunt.task.cli.unk : "" %>'
    }
  }
});
```

`grunt yourtask --unk cnk` なら `youropt="cnk"`、オプション無しなら `youropt=""` になる。


## うまく動かんーよくわかんねー って人は

とりあえず、`grunt` をテンプレート変数内でダンプしてみそらしど！

`<%= console.log(grunt); %>`
SplFileObject::fgetsの罠

`fopen`・`fgets`などの関数から`SplFileObject`に乗り換えてきてはまった罠。
バグレポート出してやろうかと思ったけど、マニュアルよく読んでみたら仕様っぽいので我慢。
「そんなの知ってるがなｗ」って思った人にはごめんなさい。

Code
-------

```php
// empty.txtは0バイトのファイル
$fp = fopen("empty.txt", "r");
var_dump(
    feof($fp),
    fgets($fp),
    feof($fp)
);
fclose($fp);

$file = new SplFileObject("empty.txt", "r");
var_dump(
    $file->eof(),
    $file->fgets(),
    $file->eof()
);
```

Expected Result
--------------------

```
bool(false) bool(false) bool(true) bool(false) bool(false) bool(true)
```

Actual Result
--------------------

```
bool(false) bool(false) bool(true) bool(false) string(0) "" bool(true)
```

びっくりしすぎてパソコンに向かって

**「ﾊｱｱｱｱｱｱｱｱｱｱｱｱ？？？？？？？？？？？？？？？？」**

って叫んだ。

つまりだな・・・それぞれこういう書き方がお作法だということだ。

```php:手続き型
if ($fp = @fopen("data.txt", "r")) {
    $i = 0;
    while (false !== $tmp = fgets($fp)) {
        printf("%d行目: %s", ++$i, $tmp);
    }
    if (!feof($fp)) {
        echo "えふげっつえらー\n";
    }
    fclose($fp);
} else {
    echo "えふーおーぷんえらー\n";
}
```

```php:オブジェクト指向型
try {
    $file = new SplFileObject("data.txt", "r");
    $i = 0;
    while (!$file->eof() and "" !== $tmp = $file->fgets()) {
        printf("%d行目: %s", ++$i, $tmp);
    }
} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
```

・・・やっぱSplFileObjectのマニュアルがおかしい。

```php
$file = new SplFileObject("file.txt");
while (!$file->eof()) {
    echo $file->fgets();
}
```

さすがにこれは混乱を招くだろ。
Location#getAccuracy() の正確さ

http://developer.android.com/reference/android/location/Location.html#getAccuracy()

まとめると、ロケーションデータ(android.location.Locationのインスタンス)に含まれる経度・緯度・正確さで円を描いた時、実際にデバイスがその円の中に含まれる確率は68%ということのようです。

```
Get the estimated accuracy of this location, in meters.

We define accuracy as the radius of 68% confidence. In other words, if you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location is inside the circle.

In statistical terms, it is assumed that location errors are random with a normal distribution, so the 68% confidence circle represents one standard deviation. Note that in practice, location errors do not always follow such a simple distribution.

This accuracy estimation is only concerned with horizontal accuracy, and does not indicate the accuracy of bearing, velocity or altitude if those are included in this Location.

If this location does not have an accuracy, then 0.0 is returned. All locations generated by the LocationManager include an accuracy.
```

訳:

```
ロケーションデータの正確さの推定値をメートルで得る。

正確さは68%信頼区間と定義した。すなわち、このローケーションの緯度と経度を中心に半径正確さメートルの円を描くとすると、68%の確率でこのロケーションの真の値がその円の中に含まれる。

統計学的にいえば、ロケーションのエラー値は正規分布するランダムな値であると仮定し、68%の信頼度は標準偏差1の信頼区間を示す。ただし実際には、ロケーションのエラー値は必ずしもそのような単純な分布ではない。

この正確さの推定値は水平方向にのみ意味があり、向きや速度、高さについてはロケーションデータにそれらの値が含まれているとしても意味はない。

ロケーションデータが正確さを持っていない場合は 0.0 を返す。LocationManagerが生成したロケーションデータはかならず正確さを持っている。
```
ある数のグラフをgnuplotでタイル上に貼るときのマージンを組み合わせるスクリプト


タイトル通りなんですが、φ(..)メモ代わりに。

```python
def margin( n, nhor, nver ) :
    '''
    return top, bottom, left and right margins for the gnuplot command to describe diagrams as tile like arrangement.\n
    inputs: n is the number of diagrams and nhor is the number of column.
    '''
    def margin_fmt( t, b, l, r ) :
        return [ "set tmargin %d" % t, # top
                 "set bmargin %d" % b, # bottom
                 "set lmargin %d" % l, # left
                 "set rmargin %d" % r ]# right
    ret = []
    for i in range(n) :
        t,b,l,r = 0,0,0,0
        # vertical orientation
        if   i / nhor == 0 :
            t = 2
        elif i / nhor == nver - 1 :
            b = 2
            # horizontal orientation
        if   i % nhor == 0 :
            l = 2
        elif i % nhor == nhor - 1 :
            r = 2

        ret.append( margin_fmt( t, b, l, r ) )

    return ret


if __name__ == "__main__" :
    n = 2*6
    nhor = 5
    def get_the_number_of_rows( n, nhor ) :
        if   n % nhor == 0 : nver = n / nhor
        elif n % nhor != 0 : nver = n / nhor + 1
        return nver
    nver = get_the_number_of_rows(n,nhor)

    for _ in margin(n,nhor,nver) :
        print _
```

実行結果は以下のとおり。

```python
['set tmargin 2', 'set bmargin 0', 'set lmargin 2', 'set tmargin 0']
['set tmargin 2', 'set bmargin 0', 'set lmargin 0', 'set tmargin 0']
['set tmargin 2', 'set bmargin 0', 'set lmargin 0', 'set tmargin 0']
['set tmargin 2', 'set bmargin 0', 'set lmargin 0', 'set tmargin 0']
['set tmargin 2', 'set bmargin 0', 'set lmargin 0', 'set tmargin 2']
['set tmargin 0', 'set bmargin 0', 'set lmargin 2', 'set tmargin 0']
['set tmargin 0', 'set bmargin 0', 'set lmargin 0', 'set tmargin 0']
['set tmargin 0', 'set bmargin 0', 'set lmargin 0', 'set tmargin 0']
['set tmargin 0', 'set bmargin 0', 'set lmargin 0', 'set tmargin 0']
['set tmargin 0', 'set bmargin 0', 'set lmargin 0', 'set tmargin 2']
['set tmargin 0', 'set bmargin 2', 'set lmargin 2', 'set tmargin 0']
['set tmargin 0', 'set bmargin 2', 'set lmargin 0', 'set tmargin 0']
```
SublimeLinterの設定を見直す

ST3にUpdateするのにあわせて、`SublimeLinter`の設定を一通り見直しました。
最近はJavascriptばかり書いているので、JS向けの設定のみ設定を行っています。

### sublimelinter_syntax_map

任意のsyntaxを特定のsyntaxに合わせる事が出来ます。
例えば独自に拡張された`jQuery(Javascript)`というsyntaxがあった場合にそれをJavascriptと同等のLinterが必要だと認識させるためにはこの設定が必要になります。

ただこのマッピングKeyが分からなくて結局SublimeLinterのソースを見てどう判定しているかを確認しました。
結果的には、以下のコマンドを`Show Console`でコンソールを表示してから叩けば現在のsyntaxを表現するキー情報が分かります。

```python
os.path.splitext(os.path.basename(view.settings().get("syntax")))[0]
```

### sublimelinter_mark_style

`SublimeLinter`で問題があった場合にどのようにエディターに表示するかを定義します。
デフォルトは`outline`でエラーを枠線で囲むように表示されるのですが、自分の場合はもっと自己主張して欲しいのでエラー自体の色が変わるように`fill`を設定しました。

### sublimelinter_popup_errors_on_save
Linterが実行されたタイミングで、警告が存在した場合に`SublimeLinter:Show Error List`と同様にエラー情報をPOPUP表示します。自分は出来るだけJSHintのエラーはつぶしておきたいのであえてうざくなるように有効にしています。

### sublimelinter_notes
`annotations`で設定した文字列をハイライトします。

### annotations
デフォルト要素以外にも、JavaDocで自分が多用する`CHECK`と`XXX`を追加しています。

## 結果

以下のような感じになりました。

```javascript
{
    /*
        Maps syntax names to linters. This allows variations on a syntax
        (for example "Python (Django)") to be linted. The key is
        the name of the syntax **as it appears in the syntax list
        at the bottom right of the window**, and the value
        is the linter name **as listed in the README** (all lowercase)
        that the syntax maps to.
    */
    "sublimelinter_syntax_map":
    {
        "jQueryJavaScript": "JavaScript"
    },

    /*
        Selects the way the lines with errors or warnings are marked; "outline"
        (default) draws outline boxes around the lines, "fill" fills the lines
        with the outline color, and "none" disables all outline styles
        (useful if "sublimelinter_gutter_marks" is set).
    */
    "sublimelinter_mark_style": "fill",

    // // If true, the find next/previous error commands will wrap.
    // "sublimelinter_wrap_find": true,

    // If true, when the file is saved any errors will appear in a popup list
    "sublimelinter_popup_errors_on_save": true,

    // JavaScript linter: "gjslint" to use the closure javascript linter (if available),
    // or either "jshint" or "jslint" to use a built in linter.
    "javascript_linter": "jshint",

    // Set to true to highlight annotations
    "sublimelinter_notes": true,

    // The set of annotation phrases to highlight
    "annotations": ["TODO", "README", "FIXME", "CHECK", "XXX"]
}
```

以上です。
Web サイトがサクッと作れて公開できちゃう系サービスまとめ


テンプレートからデザインを選んで、文章や画像を入れて、Publish するだけでサービスや製品の Web サイトを公開できちゃう系のサービス(Online Site builder というらしい)のまとめです。

* [Reviews of the Best Website Builders in 2013](http://www.sitebuilderreport.com/)

こちらのサイトをほぼパクってます。

NAVER でやれ！とか言われそうですが、サービス自体のトップページを並べてみて、何か感じられないかなーと。(全然レビューしてないので、コメントは個人の主観です)

## Squarespace

http://www.squarespace.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_01.png)

* トップページがカッコいいです
* $8 / month〜

## Weebly

http://www.weebly.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_02.png)

* ドラッグ＆ドロップでデザインできちゃうみたいです
* FREE〜

## Webs

http://www.webs.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_03.png)

* トップページが某ざまりんにそっくりなのですが…
* まあスタンダードなWebサイトですね
* $0 / month〜（広告付きらしい）

## Virb

http://virb.com/ 

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_04.png)

* トップページは適度に Flat なデザインで、このテンプレート欲しいです
* $10 / month

## Yola

https://www.yola.com/

* ちょっとオーソドックスすぎる感じがします
* $4.95 / month〜

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_05.png)

## Edicy

http://www.edicy.com/

* 地味かなー
* €6 / month〜

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_06.png)

## Wix

http://ja.wix.com/

* 今回の中で唯一、日本でも展開しているサービス
* HTML5 の他に、Flash のテンプレート？もあるみたいです
* $4 / month〜

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_07.png)

## OnePager

http://onepagerapp.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_08.png)

* カッコ良さげです
* $8 / month〜

## Jimdo

http://www.jimdo.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_09.png)

* トップページはよくある感じです
* FREE〜

## Homestead

http://www.homestead.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_10.png)

* 唯一、電話番号が載っています（どうでもいい）
* $4.99 / month

## breezi

http://breezi.com/

![img](http://blog.amay077.net/assets/images/posts/online_site_builder_reviews_11.png)

* [PlaceIt](http://placeit.breezi.com/) 経由で発見したサービス
* 色や配置からテンプレートを検索できます
* FREE?

# まとめ的な何か

こんなにたくさんあるとは知りませんでした。
日本だと「御社のサイト、スマホ用に変換します！」ってサービスがアホのようにありますが、そんなノリでしょうか？

しかし僕は Web サイト制作の仕事について詳しくないのですが、こういう系のサービスが進出してくるとどうなっちゃんでしょうね。スクラッチで Web サイト作る案件って激減して、お客さんから「このデザインテンプレートに合う素材作って」みたいな仕事が増えるのでしょうか。あるいはデザインテンプレートを自体を作るお仕事とか。

個人的な希望としては、ホスティングには興味がないので、

* 作ったコンテンツをダウンロードできる（＆自分のサーバでホストできる）
* Twitter Bootstrap フレンドリである（個別 CSS 理解するの大変だし）

なサービスがあったらいいなと思います。(あるのかな？)

とりあえず「サービス Web サイトのプロトタイプ」を作って上司に見せる、くらいなら十分（Trial範囲内で）利用できそうです。
Vim 7.4 では :set relativenumber すると現在の行数を絶対値で表示できる

`:h version-7.4` より

> Show absolute number in number column when 'relativenumber' option is on.  Now there are four combinations with 'number' and 'relativenumber'.  (Christian Brabandt)

![37da0d9f7f1828e9bdb8af1286ba7d76.png](https://qiita-image-store.s3.amazonaws.com/0/320/44ed2276-9f1e-9988-444c-0c21bdcbd3a5.png)

これは便利。
rspecでログのテスト

rspecでログが吐かれていることをテストしたのでメモ。

-

3回エラーログが吐かれている場合、以下のように書く。

```rb:
Rails.logger.should_receive(:error).exactly(3).times
```

ただし、イベント前に呼ばないと評価されないので、before~doに書く等しておく。

-

補足

* ログは期待通り出ているのに、rspecでエラーになり、rspecのbacktraceが流れた。
* 読んでないメソッドをstubしてたのが原因の様子(消したら成功した)
 * 原因分かり次第追記する
jenkinsでfeature branchのテスト

## 背景
* jenkinsの"Build Per Branch"プラグインが上手くいかなかったので、hookスクリプト+パラメータ付きビルドでブランチ毎のテストを試した
 * 参考 : http://kotas.hatenablog.jp/entry/git-branches-to-jenkins-jobs

## git hook
rubyで書いてみた

* http://qiita.com/ogawatti@github/private/17a14742e31a535e10dc

###### jenkinsの設定

前述のgit hookスクリプトで、パラメータ付きで投げられるようにした。
Jenkinsジョブの設定で以下を設定。

* パラメータの追加 > 文字列 を選択、名前に受け取るパラメータ名を入力
* ソースコードの管理 > Git > Branches to build > Branch Specifier (blank for default) で、「origin/develop」 を入力
 * ※git plugin ではブランチの指定ができない
 * ※*/developではfeatureブランチがチェックアウトできなかった
* ビルド・トリガ > リモートからビルド で、認証トークン下の「リモートからビルドを実行するには次のURLを使用します」の後の以下のURLをメモしておく
 * /buildWithParameters?token=TOKEN_NAME

git hookスクリプトにtokenを設定して、完成。
gitのhookスクリプトをrubyで書く


## ブランチフックのためのスクリプトをrubyで書いてみた

###### 参考
* http://heart-shaped-chocolate.hatenablog.jp/entry/2013/05/29/144140

```rb:

#!/usr/local/bin/ruby

# command line
refname = ARGV[0]
oldrev  = ARGV[1]
newrev  = ARGV[2]
author  = `git log --pretty="%cn" -1 #{newrev}`.chomp


# Safety check
unless ENV["GIT_DIR"]
  puts <<-msg
Don't run this script from the command line.
 (if you want, you could supply GIT_DIR then run
  #{$0} <ref> <oldrev> <newrev>)
  msg
  exit 1
end

unless refname && oldrev && newrev
  puts "Usage: #{$0} <ref> <oldrev> <newrev>"
  exit 1
end

# Check types
# if newrev is 0000...0000, it's a commit to delete a ref.
if newrev == "0000000000000000000000000000000000000000"
  newrev_type = "delete"
else
  newrev_type = `git cat-file -t #{newrev}`
end

if newrev_type =~ /^commit$/
  case refname
  when /^refs\/heads\/feature\/(.*)/
    puts "hook #{refname}"
  end
end


```

##### jenkinsのジョブを叩くようにしてみる

* featureブランチではパラメータ付きでジョブをたたく
* developブランチではジョブを叩くだけにする

```rb:

#!/usr/local/bin/ruby

require 'net/http'

jenkins_job_for_feature = { :name   => "develop_job_name",
                      :token  => "feature_job_access_token",
                      :params => "BRANCHNAME" }
jeinkins_job_for_develop = { :name   => "develop_job_name",
                      :token  => "develop_job_access_token"}

# command line
refname = ARGV[0]
oldrev  = ARGV[1]
newrev  = ARGV[2]
author  = `git log --pretty="%cn" -1 #{newrev}`.chomp

# Safety check
unless ENV["GIT_DIR"]
  puts <<-msg
Don't run this script from the command line.
 (if you want, you could supply GIT_DIR then run
  #{$0} <ref> <oldrev> <newrev>)
  msg
  exit 1
end

unless refname && oldrev && newrev
  puts "Usage: #{$0} <ref> <oldrev> <newrev>"
  exit 1
end

# Check types
# if newrev is 0000...0000, it's a commit to delete a ref.
if newrev == "0000000000000000000000000000000000000000"
  newrev_type = "delete"
else
  newrev_type = `git cat-file -t #{newrev}`
end

# Commit hook only feature branch and request to jenkins
def execute_jenkins_job(job)
  uri_host = "hogefuga@example.com"
  if job[:params]
    uri_path  = "/jenkins/job/#{job[:name]}/buildWithParameters"
    uri_query = "token=#{job[:token]}&#{job[:params]}"
  else
    uri_path  = "/jenkins/job/#{job[:name]}/build"
    uri_query = "token=#{job[:token]}"
  end
  Net::HTTP.new(uri_host).post(uri_path, uri_query)
end

if newrev_type =~ /^commit$/
  case refname
  when /^refs\/heads\/feature\/(.*)/
    puts "Automatically execute feature job in jenkins"
    jenkins_job_for_feature[:params] += "=" + $1
    execute_jenkins_job(jenkins_job_for_feature)
  when /^refs\/heads\/develop$/
    puts "Automatically execute develop job in jenkins"
    execute_jenkins_job(jeinkins_job_for_develop)
  end
end


```
2 つの Date 間の差分を求める

まとめて github にあげた

https://github.com/januswel/jslib
http://januswel.github.io/jslib/demo/time-distance/index.html

---

たとえば記事が何日前に投稿されたかを表示したい場合など。

moment.js, XDate, その他いろいろなライブラリがあるので使える場合はそっちを使うのが正解。
ただし、オトナの事情で使えないとか気に入らないとかあると思うので適当コードで概念だけ書いてみる。


月以外の差分を求める場合
------------------------

年、週、日、時、分、秒、ミリ秒の場合。かんたん。

それぞれのスパンが決まりきっているのでミリ秒の差を求めてスパンのミリ秒で割る。
週、日、時、分は年・秒とほぼ同じなので省略。
結果は小数になるので適当に四捨五入などして表示するといい。

```js:timeDistance.js
var SECOND_MILLISECOND = 1000,
    MINUTE_MILLISECOND = 60 * SECOND_MILLISECOND,
    HOUR_MILLISECOND = 60 * MINUTE_MILLISECOND,
    DAY_MILLISECOND = 24 * HOUR_MILLISECOND,
    WEEK_MILLISECOND = 7 * DAY_MILLISECOND,
    YEAR_MILLISECOND = 365 * DAY_MILLISECOND;

/**
 *  @returns {number}
 *  @param {Date} src
 *  @param {Date} dst
 */
var yearDistance = function (src, dst) {
    var deltaMillsecond = dst.getTime() - src.getTime();
    return deltaMillsecond / YEAR_MILLISECOND;
},
// snip
secondDistance = function (src, dst) {
    var deltaMillsecond = dst.getTime() - src.getTime();
    return deltaMillsecond / SECOND_MILLISECOND;
},
millisecondDistance = function (src, dst) {
    return dst.getTime() - src.getTime();
};
```

月の差分を求める場合
--------------------

月はそれぞれでスパンが違うので 1 ミリ秒の割合が違う。
それを考慮して計算する。

```js:monthDistance.js
var SECOND_MILLISECOND = 1000,
    MINUTE_MILLISECOND = 60 * SECOND_MILLISECOND,
    HOUR_MILLISECOND = 60 * MINUTE_MILLISECOND,
    DAY_MILLISECOND = 24 * HOUR_MILLISECOND,
    WEEK_MILLISECOND = 7 * DAY_MILLISECOND,
    YEAR_MILLISECOND = 365 * DAY_MILLISECOND;

/**
 *  @return {number}
 *  @param {number} year
 *  @param {number} month
 */
var getNumberOfDaysForMonth = function (year, month) {
        return new Date(year, month + 1, 0).getDate()
    },
    /**
     *  @returns {number}
     *  @param {Date} src
     *  @param {Date} dst
     */
    monthDistance = function (src, dst) {
    var deltaYear = dst.getFullYear() - src.getFullYear(),
        deltaMonth = deltaYear * 12 + dst.getMonth() - src.getMonth(),
        srcOffsetMilliseconds = src.getDate() * DAY_MILLISECOND + src.getHours() * HOUR_MILLISECOND + src.getMinutes() * MINUTE_MILLISECOND + src.getSeconds() * SECOND_MILLISECOND + src.getMilliseconds(),
        srcNumberOfDaysForMonth = getNumberOfDaysForMonth(src.getFullYear(), src.getMonth() + 1),
        srcOffsetRate = srcOffsetMilliseconds / (srcNumberOfDaysForMonth * DAY_MILLISECOND),
        dstOffsetMilliseconds = dst.getDate() * DAY_MILLISECOND + dst.getHours() * HOUR_MILLISECOND + dst.getMinutes() * MINUTE_MILLISECOND + dst.getSeconds() * SECOND_MILLISECOND + dst.getMilliseconds(),
        dstNumberOfDaysForMonth = getNumberOfDaysForMonth(dst.getFullYear(), dst.getMonth() + 1),
        dstOffsetRate = dstOffsetMilliseconds / (dstNumberOfDaysForMonth * DAY_MILLISECOND);

    return deltaMonth - srcOffsetRate + dstOffsetRate;
};
```

Date を使って大雑把な月計算をしたあと、日単位のオフセットを引いたり足したりする。
2013/01/10 〜 2013/07/20 の期間を求めたい場合、 2013/01/01 から 2013/07/01 までを計算したあと、 2013/01/01 〜 2013/01/10 までを引き、 2013/07/01 〜 2013/07/20 を足す。
Compassが入らなくて困った


Compass入れようとして、

```bash
$ gem install compass
```

ってやったら、『local gemsにcompassなんてないよ！』って言われて、「？？？」ってなったので、とりあえずupdateしようと思ったらこれがまぁ大変だったのでメモっておく。

## gem update
```bash
$ gem update
```

まぁできないですね。
そもそもgem本体のupdateじゃなくてパッケージのupdateだったことに気づく

```bash
$ gem update --system
```

ググったらこんな感じのが出てきたのでやってみるもうまく行かず…。
(エラーメッセージ控えておくの忘れた…)

## rubygems-update
調べていたら、ここに行き着く。
http://ja.verbmode.net/2009/02/09/be_carefull_with_gems_verup

入ってたgemsのバージョンは1.3.2(確か)だったけど、一応試してみようと思ってやってみる。

```bash
$ sudo gem install -r rubygems-update
```

『local gemsにrubygems-updateなんてないよ！』って言われる。`-r`オプション着けたのに…。

ならもうDLしてこようと思い、
http://rubygems.org/
から最新版(2.0.6)を落としてくる。

```bash
$ sudo gem install ~/Downloads/rubygems-update-2.0.6.gem
```

やっと入った…。

```bash
$ gem -v
2.0.6 
```

## やっとCompass

これでだめならCompassもDLしてしまえと思いつつ、

```bash
$ gem install compass
```
sass3.2とかインストールしながらどうやら成功した模様。

```bash
$ compass -v
Compass 0.12.2  (Alnilam)
```
【ERROR 1197】max_binlog_cache_sizeが足らないって怒られた時の対処方法

## 注意

MariaDB5.5で発生・対応した内容です。
実際にMySQL5.5で試してはいないですが、参照したリファレンスはMySQL5.5で、コマンドもMySQL5.5と変わらないものを使用したので、MySQL5.5でも同様の動きをすると思われます。

## 現象

1800万行程のCSVをloadしたら下記のエラーが出た。

```
ERROR 1197 (HY000) at line 5: Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
```

load処理のバイナリログのサイズが `max_binlog_cache_size` を超えてしまうと出るエラーとのこと。
この変数のデフォルト設定値は4GBであり、このサイズを超えるとトランザクションが効かなくなってしまうためエラーになってしまう。

```sql
show variables like 'max_binlog_cache_size'; 

/*
+-----------------------+------------+
| Variable_name         | Value      |
+-----------------------+------------+
| max_binlog_cache_size | 4294963200 |
+-----------------------+------------+
1 row in set (0.01 sec)
*/
```

## 対応

リファレンスによると

http://dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html#sysvar_max_binlog_cache_size

```
The maximum possible value is 16EB (exabytes). The maximum recommended value is 4GB; this is due to the fact that MySQL currently cannot work with binary log positions greater than 4GB.
```

一応16EB（エクサバイト）まで設定はできるようなのだが、結局4GBを超えるとトランザクションが効かなくなるっぽいので、推奨は4GBらしい。

変更自体は下記SQLでできるが、あまり気軽に変更するような値ではないだろう。

```sql
SET global max_binlog_cache_size = 25769779200;
```

設定してロードした場合、バイナリログのファイルサイズが跳ね上がる。
（ちなみにMySQLのデフォルトは1GBでローテートされる設定になっている）

```
ls -la /var/lib/mysql

…
-rw-rw----  1 mysql mysql  1073741897  7月 29 18:59 mysql-bin.000117
-rw-rw----  1 mysql mysql  1073742056  7月 30 03:59 mysql-bin.000118
-rw-rw----  1 mysql mysql  1073742399  7月 30 12:31 mysql-bin.000119
-rw-rw----  1 mysql mysql 13954453678  7月 30 16:52 mysql-bin.000120
```

## 結果

load自体はこれで問題無く完了した。
また、slaveにも問題無くレプリケーションされていた。
MySQL5.1ではmax_binlog_cache_sizeを超えるトランザクションを実行するとslaveがクラッシュするバグがあったらしい。

参考: http://d.hatena.ne.jp/sh2/20101215

## 結論

素直にファイル分割してロードするほうが無難かな…
phpでデータベースから取得した配列を指定した順番に並び替える

Propelを例に

```php
<?php

// 並び順を与えられた通りに整える
$ids = array(1,3,2);
$_hoges = HogePeer::retrieveByPKs($ids);
# array(3) { [0]=> object(Hoge){["id":protected]=>1} [1]=> object(Hoge){["id":protected]=>2} [2]=> object(Hoge){["id":protected]=>3} }

$hoges = array_flip($ids);
foreach ($_hoges as $_hoge) {
    $hoges[$_hoge->getId()] = $_hoge;
}
$hoges;
# array(3) { [1]=> object(Hoge){["id":protected]=>1} [3]=> object(Hoge){["id":protected]=>3} [2]=> object(Hoge){["id":protected]=>2} }
```
emmetを使ってPHPのSmartyタグを挿入したselectタグの作り方

都道府県など多いときは、間違えることが多いので、
これで、凡ミスがなくせる。


emmetのWrap with Abbreviationを使用。
入力の値は、
`option[value=$# smarty={if\$smarty.request.pref=='$#'}checked{/if}]{$#}*`
を使う。

これだけでは足りないので、最後に
`smarty={if$`
を
`{if　$`
に
`{/if}"`
を
`{/if}`
に置換すると完成

###サンプル
変換前
北海道

変換後
`<option value="北海道" {if $smarty.request.pref=='北海道'}checked{/if}>北海道</option>`
JQueryでチェックボックス全選択

メモ

### 一段階

```html:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf8" />
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
        <title>全選択　ケース１</title>
        <script src="/jq-plugin/jquery/jquery-1.10.2.js">
            			<!-- jquery 1.10.2 -->
        </script>
        <script>
			$(document).ready(function() {

				$.fn.checkbox = function(args) {

					$(this).change(function() {
						var className = ($(this).attr("class") || "dummy").split(" ");

						for (var i in className) {
							var checked = true;
							$("." + className[i]).each(function() {
								checked = checked && $(this).prop("checked");
                                $("#" + className[i]).prop("checked", checked);
							});
						};
                        $("." + $(this).attr("id")).prop("checked", checked);
					});
				};

				// セレクタ変更
				$("#group1 input:checkbox").checkbox();
			});
        </script>
        <style>
        </style>
    </head>
    <body>
        <div id="group1">
            <ul>
                <li>
                    <dl>
                        <dt>
                            <input type="checkbox" class="area01" id="area0101"/>
                            <label>札幌市</label>
                        </dt>
                        <dd>
                            <input type="checkbox" class="area0101" id="area010101">
                            <label>中央区</label>
                        </dd>
                        <dd>
                            <input type="checkbox" class="area0101" id="area010102">
                            <label>北区</label>
                        </dd>
                        <dd>
                            <input type="checkbox" class="area0101" id="area010103">
                            <label> 南区</label>
                        </dd>
                        <dd>
                            <input type="checkbox" class="area0101" id="area010104">
                            <label>東区</label>
                        </dd>
                        <dd>
                            <input type="checkbox" class="area0101" id="area010105">
                            <label>西区</label>
                        </dd>
                    </dl>
                </li>
            </ul>
        </div>
    </body>
</html>
```
phpの配列内オブジェクトから特定のメソッドの値を配列で取得 


    array_map(function($obj){return $obj->getId();}, $array);

例

```php
<?php

class Hi
{
    protected $_id = 0;

    public function getId()
    {
        return $this->_id;
    }

    public function setId($id)
    {
        $this->_id = $id;
    }
}

$hi = new Hi;
$hi3 = clone $hi2 = clone $hi;
$hi->setId(1);
$hi2->setId(2);
$hi3->setId(3);
$hiList = array($hi, $hi2, $hi3);

$map = array_map(function($obj){return $obj->getId();}, $hiList);

var_dump($map);
#array(3) {
#  [0] =>
#  int(1)
#  [1] =>
#  int(2)
#  [2] =>
#  int(3)
#}

```


もっと簡単な書き方無いかな
AWSクレジットの消費優先順位

1つのアカウントに複数のAWSクレジットを適用(Redeem)していた場合、各クレジットの消費優先順位は失効期限のみに準じるらしいです。

- 失効日が一番早いクレジットから使われる。
- 失効日が同一のクレジットが複数ある場合は、ランダムな順番で消費される。
- クレジットの適用時期やクレジットの金額は関係ない。
dockerインストール方法

dockerの活躍の場
----------------
* 本番と開発環境を同じ環境にできる。
* レガシーなバージョンのアプリを最新OSにて起動できる。


こちらを見た方がいい
----------------
* [Docker のまとめと CentOS 6.5 へのインストール - Qiita [キータ]](http://qiita.com/phimcall/items/0ba7de15c045dbe8711b)



dockerのインストール
=========

OSXの場合
--------

```bash:インストール(osx)
$ brew update
$ brew install docker boot2docker
```

```bash:macでの作業
$ boot2docker download # boot2dockerイメージのversion up
$ mkdir docker && cd docker
$ boot2docker init
$ boot2docker start    # virtualboxのboot2docker仮想マシンを起動
$ boot2docker ssh      # pass: tcuser
```

```bash:docker内での作業
$ docker pull ubuntu:14.04
```


ubuntuの場合
--------

```bash:インストール(ubuntu)
$ curl get.docker.io | sh
```

CentOS6.8
--------


```bash:epelからインストールの場合
$ sudo rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum -y install docker-io
$ sudo chkconfig docker on
$ sudo service docker start
$ sudo usermod -G wheel,docker $(whoami)
```

```bash:/etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/6/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

```bash:
sudo yum install docker-engine
sudo service docker start
```

```bash:docker-cmopose1.5.2を入れる
curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```


ネットからdockerのコンテナ検索
==========
* [公開コンテナ一覧](https://index.docker.io)

```bash:
$ docker search ubuntu
```


使い方
=========

```bash:直前のコンテナID取得
alias dl='docker ps -l -q'
```


```bash:ubuntuを使いたい場合
$ docker run -d -i -t ubuntu /bin/bash
```

```bash:centosを使いたい場合
$ docker run -d -i -t centos /bin/bash
```

```bash:alias
$ alias cent='docker run centos'
$ cent yum search php
```

```bash:起動(ctrl+dで抜けると変更も破棄される。)
# docker run -i -t ubuntu /bin/bash
```

```bash:起動(コマンド実行しっぱなし。)
# docker run -d -i -t ubuntu /bin/bash
```


```bash:仮想マシンのコピー(dockyという名前でRepositoryにコミットする)
$ echo "FROM ubuntu" > Dockerfile
# docker build -t tukiyo/docky .
```

```bash:状態確認
# docker images
```


```bash:tukiyo/dockyを実行
# docker run -i -t tukiyo/docky /bin/bash
```

Ctrl+p, Ctrl+q と入力し抜ける。exitだと終了してしまう。変更も破棄される。


```bash:attach
# docker ps
# docker attach "CONTAINER ID"
ここでCtrl+l と入力し、端末を再描画させる。
```

```bash:状態の保存
# docker images
# docker commit XXXXXX tukiyo/docky
```

コンテナをコミットせずに終了するとすべての変更は失われます。

```bash:rebootコマンドは受け付けません。
# reboot
shutdown: Unable to shutdown system
```
Pythonの古いクラスと新しいクラスの話

5年以上使ってもPython初心者のあめ玉です

で、ある本でこういう記載がありまして

    class SomeClass(object):
      ..

この「object」ってなんですかね、と思ったので、メモ。

[Python class inherits object(Stack Overflow)](http://stackoverflow.com/questions/4015417/python-class-inherits-object)

Python2系だと2種類のクラスが存在し、新しい方でないと型に関する情報がぐっだぐだになる、という感じっぽいのです。Python3には新しい方しかないので、死にゆく知識の一つと思われます。

まぁ試してみます。結果から分かる愛ってのもあるよね

```py:class_exp.py
class OldClass:
  def a(self):
    print("I'm OldClass")

class OldChild(OldClass):
  def a(self):
    super(OldChild, self).a()

class NewClass(object):
  def a(self):
    print("I'm NewClass")

class NewChild(NewClass):
  def a(self):
    super(NewChild, self).a()

x = OldChild()
y = NewChild()
print(type(x))
print(type(y))
print('--')
try:
  # Will fail with Python 2.x
  x.a() 
except TypeError as e:
  import traceback
  traceback.print_exc()
print('--')
y.a()
```

    > python2.7 misc/class_exp.py
    <type 'instance'>
    <class '__main__.NewChild'>
    --
    Traceback (most recent call last):
      File "misc/class_exp.py", line 27, in <module>
        x.a()
      File "misc/class_exp.py", line 10, in a
        super(OldChild, self).a()
    TypeError: must be type, not classobj
    --
    I'm NewClass
    
    > python3.2 misc/class_exp.py
    <class '__main__.OldChild'>
    <class '__main__.NewChild'>
    --
    I'm OldClass
    --
    I'm NewClass

Python2では古い方のクラスのオブジェクトは型が期待した通りに見えてません。type(obj) の結果で ``<type 'instance'>'' となっている点に一つポイントがあるようです。その関係なんですかね、super() で正しく親クラスを見れていません。

あとは昔のドキュメントを読んでください。

(2 PEPs 252 and 253: Type and Class Changes)[http://docs.python.org/release/2.2.3/whatsnew/sect-rellinks.html]

ところで冒頭のとある本はPython3をメインに据えた本とのことで、なんでPython3では必要のないobjectを明示的に指定したのかについては、よくわかりません。
JQuery でタブ

メモ

```html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf8" />
		<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
		<title>タブ　ケース１</title>
		<script src="/jq-plugin/jquery/jquery-1.10.2.js">
						<!-- jquery 1.10.2 -->
		</script>
		<script>
			$(document).ready(function() {

				$.fn.tab = function(args) {
					var p = {};
					p.tabs = args.tabs || 'a.tab';
					
					$(this).click(function() {
						$(p.tabs).not($(this)).each(function(){
							$($(this).attr("href")).hide();
							if ($(this).is(".current")) {
								$(this).toggleClass("current");
							}
						});
						$($(this).attr("href")).show();
						if (!$(this).is(".current")) {
							$(this).toggleClass("current");
						}
						return false;
					});

				};

				// セレクタ変更
				$("#group1 a.tab").tab({
					tabs : "#group1 a.tab"
				});
				$("#group2 a.tab").tab({
					tabs : "#group2 a.tab"
				});
			});
		</script>
		<style>
			div.contents {
				width: 500px;
				height: 300px;
				border: 1px solid black;
			}
			div.contents div {
				display: none;
			}
			div.contents div:first-child {
				display: block;
			}
			ul.tab {
				width: 500px;
				border: 1px solid black;
				list-style: none;
				background: gray;
				padding: 0px;
				margin: 0px;
			}
			ul.tab li a {
				color: white;
				background-color: black;
				text-decoration: none;
			}
			ul.tab li a.current {
				color: black;
				background-color: white;
				text-decoration: none;
			}
			ul.tab li {
				display: inline-block;
				width: 70px;
			}
			ul.tab li a {
				width: 100%;
				display: block;
				text-align: center;
				vertical-align: middle;
			}
		</style>
	</head>
	<body>
		<div id="group1">
			<ul class="tab">
				<li>
					<a class="tab current" href="#tab1" >タブ１</a>
				</li>
				<li>
					<a class="tab" href="#tab2">タブ２</a>
				</li>
				<li>
					<a class="tab" href="#tab3">タブ３</a>
				</li>
				<li>
					<a class="tab" href="#tab4">タブ４</a>
				</li>
				<li>
					<a class="tab" href="#tab5">タブ５</a>
				</li>
			</ul>
			<div id="contents" class="contents">
				<div id="tab1">
					内容１
				</div>
				<div id="tab2">
					内容２
				</div>
				<div id="tab3">
					内容３
				</div>
				<div id="tab4">
					内容４
				</div>
				<div id="tab5">
					内容５
				</div>
			</div>
		</div>
		<div id="group2">
			<ul class="tab">
				<li>
					<a class="tab current" href="#tab11" >タブ１</a>
				</li>
				<li>
					<a class="tab" href="#tab12">タブ２</a>
				</li>
				<li>
					<a class="tab" href="#tab13">タブ３</a>
				</li>
				<li>
					<a class="tab" href="#tab14">タブ４</a>
				</li>
				<li>
					<a class="tab" href="#tab15">タブ５</a>
				</li>
			</ul>
			<div id="contents2" class="contents">
				<div id="tab11">
					内容１
				</div>
				<div id="tab12">
					内容２
				</div>
				<div id="tab13">
					内容３
				</div>
				<div id="tab14">
					内容４
				</div>
				<div id="tab15">
					内容５
				</div>
			</div>
		</div>
	</body>
</html>
```