OmniAICreator/Qiita-1.07M huggingface dataset:
Failure/Error: Unable to find matching line from backtrace      DRb::DRbConnError:        druby://127.0.0.1:8989 - #<Errno::ECONNREFUSED: Connection refused - connect(2)>がでる

rspecでsporkを使ってて下記のようなエラーがでた。単に`raise`している箇所が原因だった。

```bash:
     Failure/Error: Unable to find matching line from backtrace
     DRb::DRbConnError:
       druby://127.0.0.1:8989 - #<Errno::ECONNREFUSED: Connection refused - connect(2)>
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:736:in `rescue in block in open'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:730:in `block in open'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:729:in `each'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:729:in `open'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:1191:in `initialize'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:1171:in `new'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:1171:in `open'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:1087:in `block in method_missing'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:1105:in `with_friend'
     # /Users/toyoshi/.rvm/rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/drb/drb.rb:1086:in `method_missing'
     # /Users/toyoshi/.rvm/gems/ruby-1.9.2-p320@charipo/gems/rspec-core-2.9.0/lib/rspec/core/drb_command_line.rb:19:in `run'
     # /Users/toyoshi/.rvm/gems/ruby-1.9.2-p320@charipo/gems/rspec-core-2.9.0/lib/rspec/core/runner.rb:63:in `run'
     # /Users/toyoshi/.rvm/gems/ruby-1.9.2-p320@charipo/gems/rspec-core-2.9.0/lib/rspec/core/runner.rb:10:in `block in autorun'
```
mongodbででっかいデータを入れすぎてファイルがけせない場合の対処法

でっかいデータをずどーんと入れてファイル容量が圧迫すると
mongodb本体がロックをかけてremove()ができなくなります。

```mongo
db.access_before.remove()
Can't take a write lock while out of disk space
```

re….removeができない

## 対処法

### その１ mongoをまず止める

止めましょう

```shell
/etc/init.d/mongod stop
```

### その2 lockfileを削除する

デフォルトの設定なら/var/lib/mongoにあります

```shell
cd /path/to/mongo
rm /path/to/mongo/mongod.lock
```

### その3 再度mongoを起動させる

起動させましょう

```shell
/etc/init.d/mongod start
```

### その４ もう一回remove()を使用して消去する

消去しましょう

```shell
mongo
> use apache
> db.access_before.count()
0
```
 
消せました。
Git on CentOS 6.4

いれてみる

```shell-session:
# cat /etc/redhat-release 
CentOS release 6.4 (Final)

# yum install git
```

設定する

```shell-session:
$ git config --global user.name "Katsutoshi Nagaoka"
$ git config --global user.email "katsutoshi.nagaoka@gmail.com"
$ git config --global color.ui true
```
Objective-C で Singleton の実装

確か [Objective-C フレーズブック](http://www.amazon.co.jp/dp/4864011079) に載っていた。
知っている限りで一番シンプルな実装方法。
alloc-init や new でのインスタンス化は許容していない。

```obj-c:document.h
#import <Foundation/Foundation.h>

@interface Document : NSObject
+ (Document*)sharedDocument;
@end
```

```obj-c:document.m
#import "Document.h"

@implementation Document

static Document* _sharedDocument;

+ (void)initialize
{
    if ([Document class] == self) {
        _sharedDocument = [self new];
    }
}

+ (Document*)sharedDocument
{
    return _sharedDocument;
}

+ (id)allocWithZone:(NSZone *)zone
{
    if (_sharedDocument && [Document class] == self) {
        [NSException raise:NSGenericException format:@"May not create more than one instance of Document."];
    }
    return [super allocWithZone:zone];
}

@end
```
SeleniumでChromeを動かす

## はじめに
* IEを使った自動テストはできるようになったので次はChromeに手を出してみる
* Selenium-WebDriverを使ってChromeでテストを動かす手順を残しておく
* Windows環境で動くJenkinsスレーブを構築済み
 * リモートで動かす
* 実行環境は以下のとおり
 * OS ： Windows8
 * Google Chrome ： 27
 * Ruby ： 1.9.3@429
 * selenium-webdriver ： 2.33.0
 * chromedriver ： win_26.0.1383.0


## 設定ファイル作成
* 以下を設定ファイルに書くだけ

```rb:
Capybara.register_driver driver do |app|
  caps = eval "Selenium::WebDriver::Remote::Capabilities.chrome"
  opts = { browser: :remote,
           url: 'http://localhost:4444/wd/hub',
           desired_capabilities: caps }
  Capybara::Selenium::Driver.new app, opts
end
```

* プロキシ環境で動かす場合は以下のように書く

```rb:
Capybara.register_driver driver do |app|
  client = Selenium::WebDriver::Remote::Http::Default.new
  opts = { browser: :chrome, http_client: client }
  opts[:profile] = Selenium::WebDriver::Chrome::Profile.new  
  opts[:switches] = ["--proxy-server=http://PROXYHOST:PROXYPORT"]
  Capybara::Selenium::Driver.new app, opts
end
```

## はまったところ
* [ここ](http://code.google.com/p/chromedriver/downloads/list)からchromedriverがダウンロードできる
 * chromedriver_win32_2.0.zipを入れていたがこれではプロキシ設定がきかなかった(プロキシ環境でなければ問題なく動いてそうだった)
 * chromedriver_win_26.0.1383.0.zipだとイケた

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
月末指定のshellscriptを実行した際にエラーが出たら疑うべきこと

ほぼメモです。

wordpressにアクセス解析の結果を投稿するプログラムを書いていました。月ごとのまとめなので，月末に投稿したいなという欲が出て来ました。ステキなスクリプトを見つけました。

参考：[cron(crontab)で月末を指定する方法 ぎじゅっやさん](http://hain.jp/index.php/tech-j/2006/10/17/p91)

ただ，エラーが出てなかなか実行できず，はれほれ〜となりました。そんな私みたいに皆さんがならないために，断片知識を置いときます。

* %dの前にエスケープをしているか。```¥%d``` である。
* 時間指定のプログラムも実行するプログラムにおいても相対パスではなく絶対パスを使用しているか。
* 月・日等の時間の書き方が間違っていないか。


```sample.sh
58 23 28-31 * * /usr/bin/test $( date -d '+1 day' +\%d ) -eq 1 && sh /var/www/html/sample/honyahonya.sh
```

参考：[crontabでは```%```をエスケープしなきゃいけない](http://d.hatena.ne.jp/pacodelucia/20090128/1233138521)
VagrantでPHPの開発環境を構築する

ブログ記事に執筆しましたが、このVagrantfileを使えば瞬殺です。
https://github.com/yandod/php5-nginx-vagrant-sample

<pre>
git clone https://github.com/yandod/php5-nginx-vagrant-sample.git
cd php5-nginx-vagrant-sample
vagrant up
</pre>

スタック構成は下記の通りです。

<table>
<tr>
<th>OS</th>
<td>Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)</td>
</tr>
<tr>
<th>PHP</th>
<td>PHP 5.3.10-1ubuntu3.6 with Suhosin-Patch</td>
</tr>
<tr>
<th>Nginx</th>
<td>1.1.19</td>
</tr>
<tr>
<th>MySQL</th>
<td>5.5.31-0ubuntu0.12.04.2 (Ubuntu)</td>
</tr>
</table>

詳細の解説:
[Chef + VagrantによるPHP5.3 + MySQL + nginxの開発環境](http://www.engineyard.co.jp/blog/2013/chef-and-vagrant-gives-you-next-dev/)
Screen on CentOS 6.4

いれてみた

```shell-session:
### 環境
# cat /etc/redhat-release 
CentOS release 6.4 (Final)

### インストール
# yum install autoconf automake ncurses-devel git gcc make
# git clone git://git.savannah.gnu.org/screen.git
# cd screen/src
# ./configure --prefix=/usr/local --enable-color=256
# make
# make install

### 確認
# /usr/local/bin/screen -v
Screen version 4.01.00devel (GNUc2cd059) 2-May-06
```
設定してみる

```shell-session:
$ cd ~/
$ git clone https://github.com/na-ga/screen-configurations.git
$ cp ./screen-configurations/.screenrc* ~/
$ cp ./screen-configurations/.bash_screen ~/
$ echo "source ~/.bash_screen" >> ~/.bash_profile
$ source ~/.bash_profile
```
Engine Yard LocalでChefを再実行する方法

Engine Yard Localでインスタンスを起動した後に調整したクックブックを再実行したい場合のコマンドは下記の通り。
またdna.jsonファイルを変更する事でデータベースの変更などのスタック変更も行えます。

<pre>
$ sudo su root
# /usr/local/ey_resin/bin/chef-solo -j /etc/chef/dna.json -c /etc/chef/solo.rb
</pre>

カスタムクックブックを再実行する場合はファイルのパスが変更になります。dna.jsonを変更した場合は /etc/chef 配下のファイルとの整合性に注意してください。カスタムクックブックはプロジェクト直下にcookbooks という名前で配置しておくと /etc/chef-custom/recipes/cookbooks としてマウントされクラウド上と同じレイアウトになります。

<pre>
$ sudo su root
# /usr/local/ey_resin/bin/chef-solo -j /etc/chef/dna.json -c /etc/chef-custom/solo.rb
</pre>

なお、この方法で変更できないベースとなるイメージの変更が必要なスタックについては現在Localでの実行は難しい状況です。またEngine Yard LocalはChef 0.6を使っているのでクックブックの書式についても注意が必要です。

dna.jsonの編集例

* db_stack_name
  * mysql5_1
  * mysql5_5
ParseResourceでモデル名と異なるテーブル名をつける


`ActiveRecord`であれば`table_name=`を使うことで、モデル名の複数形とは違うテーブル名を使用することができるが、それを`ParseResource`でやる方法。
ちなみに、Parse.comではこれは本当はテーブルじゃなくてクラスと呼ばれている。

parse_resourceのソースコードを読むと`model_name_url`というのがテーブル名を決定していることが分かるので、これを変えてあげれば良い。

```ruby:lib/parse_resource/base.rb
# Gets the current class's model name for the URI
def self.model_name_uri
  if self.model_name == "User"
    "users"
  elsif self.model_name == "Installation"
    "installations"
  else
    "classes/#{self.model_name}"
  end
end

# Gets the current class's Parse.com base_uri
def self.model_base_uri
  "https://api.parse.com/1/#{model_name_uri}"
end
```

実際には以下のようにする。

```ruby:app/mdels/product_parse.rb
class ProductParse < ParseResource::Base
  def self.model_name_uri
    "classes/Product"
    # or "classes/products"
  end
end
```

こうすることで、

```ruby:app/models/product.rb
class Product < ActiveRecord::Base
end
```

というようにProductモデルが既に存在していてもParse用のProductモデルを作ることが出来る。
Dir.glob と Find の違い


Ruby には find という標準ライブラリがあるんだけど、Dir.glob と違ってパターン指定できないし、どこで使うの? と思っていた。

が、調べてみると下記のような違いがあるようだ。

- `Dir.glob` は対象となるファイルをすべてリストアップしてから処理を開始する
- `Find.find` は見つかったファイルをその都度処理する

大量のファイルがあるディレクトリで、最初のファイルを処理しはじめるまでの時間を計ってみた。

```bash
# time ruby -e 'Dir.glob("**/*"){ exit 1 }'
0.46s user 5.34s system 94% cpu 6.125 total
0.47s user 5.45s system 96% cpu 6.136 total
0.48s user 5.49s system 89% cpu 6.634 total

# time ruby -rfind -e 'Find.find("."){ exit 1 }'
0.04s user 0.03s system 94% cpu 0.070 total
0.03s user 0.03s system 95% cpu 0.060 total
0.03s user 0.03s system 94% cpu 0.069 total
```

`Dir.glob` はパターンマッチングしてるのでフェアな比較ではないが、オーダーが違うことがわかる。

すべてのファイルを処理する時間はあまり変わらない (find が若干分が悪い)。

```bash
# time ruby -e 'Dir.glob("**/*").to_a'
0.47s user 5.41s system 96% cpu 6.107 total
0.46s user 5.39s system 95% cpu 6.119 total
0.46s user 5.33s system 93% cpu 6.211 total

# time ruby -rfind -e 'Find.find(".").to_a'
1.25s user 5.52s system 94% cpu 7.185 total
1.22s user 5.39s system 96% cpu 6.879 total
1.26s user 5.46s system 96% cpu 7.000 total
```

使い勝手と総処理時間では Dir.glob のが有利だが、Find は処理を始めるまでの時間が短い (O1) ので、ユーザにすばやいレスポンスを提供することができる。CUI で大量のファイルを処理する場合などはこちらを使ったほうがよいだろう。

ちなみに、`Dir.glob` に似たパターンマッチが `File.fnmatch` で行えるが `{}` や `**` が使えず、若干不便なので、正規表現で処理するのが楽。
月初から当日までのコミット数ランキングを表示するコマンド

```bash:

git shortlog -sn --no-merges --after='date +%Y/%m/01' --before='date +%Y/%m/%d' | cat -n

```

* 開発チームでコミット数を管理したいとき
* プロジェクト内で「アイツにコミット数で勝ったぜ、へっへーん」とモチベーションをあげたいとき

などにぜひ！

### git shortlog

コミットメッセージの一行目が 著者ごとにグループ分けされて表示される

##### 主なオプション

* -n : 著者のアルファベット順ではなく、コミットの数で並び替える
* -s : コミット数だけを表示する
* -e : メールアドレスを表示する
* -w : 一行の文字数、インデントのサイズを指定
nvmって最近はls-remoteが出来るんだね

# 入れっぱなしで放置プレーのnvmをアップデートするには

```shell-session:
cd ~/.nvm
git pull
```

どうやらgitの使い方が分かってないからこんなことをメモにしているらしい。

# でOSXだと問題が発生した

```text:
sha1sumが無いと怒られる！
```

# 解決方法
## shasumなるものがOSXにある

```shell-session:
cd ~/local/bin
ln -s /usr/bin/shasum5.12 sha1sum
```

手元の環境はなぜかshasumは実行ビットが立ってなくて、一回ハマったのは内緒
(~/local/binはお好みで調整してください。PATHに入った割と個人寄りのディレクトリに作るのが吉かと)
im4java(ImageMagick for Java)でリサイズ/中央切抜き

サムネイル画像生成などでよく行われる、短辺基準でリサイズして中央を正方形に切り抜く処理をImageMagickで行うためのサンプル。

```java:CenterCropSample.java
package sandbox;

import java.io.File;

import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;

public class CenterCropSample {
	public static void main(String[] args) throws Exception {
		File src = new File("c:/temp/src.jpg");
		File dest = new File("c:/temp/dest.jpg");
		int width = 200;
		int height = 200;

		ConvertCmd cmd = new ConvertCmd();
		cmd.setSearchPath("C:\\Program Files (x86)\\ImageMagick-6.8.5-Q16");

		IMOperation op = new IMOperation();
		op.addImage(src.getAbsolutePath());
		op.resize(width, height, '^');
		op.gravity("center");
		op.crop(width, height, 0, 0);
		op.addImage(dest.getAbsolutePath());
		System.out.println(op.toString());

		cmd.run(op);
	}
}

```
結果

> c:\temp\src.jpg -resize 200x200^ -gravity center -crop 200x200+0+0 c:\temp\dest.jpg

(※dest.jpgが生成されます)
Objective-C のリテラルとシンタックスシュガー

Objective-C は何かと長々としたメソッドを使う必要があるが、基本の型についてはシンタックスシュガーが用意されている。

http://clang.llvm.org/docs/ObjectiveCLiterals.html

### NSNumber

定数の前に @ を付けると NSNumber として扱われる。

```objc:
    NSNumber* n1 = @42;
    NSNumber* n2 = @1.5;
    NSNumber* n3 = @33LL;
    NSNumber* n4 = @YES;
#ifdef __cplusplus
    NSNumber* n5 = @false;
#endif
    NSNumber* n6 = @'a';
    NSNumber* n7 = @(INT_MAX);
    NSNumber* n8 = @(M_PI / 2.0);
```

### NSString

C の文字列(const char*)も NSString にできる。

```objc:
    NSString* s1 = @"test";
    NSString* s2 = @(getenv("PATH"));
```

### NSArray, NSMutableArray

@[] で NSArray を生成できる。
NSMutableArray にそのまま代入して使うことはできない。

またインデクサを使った参照と更新が可能。
飛び石にならない追加に限っては行える模様。

```objc:
    NSArray* a1 = @[@"test", @21, @1.2];
    for (id obj in a1) {
        NSLog(@"value = %@", obj);
    }
    NSLog(@"i=1: %@", a1[1]);
    
    NSMutableArray* a2 = [NSMutableArray new];
    a2[0] = @1;
    a2[1] = @2;
    a2[2] = @4;
    NSLog(@"a2=%@", a2);
```

### NSDictionary, NSMutableDictionary

@{} で NSDictionary を生成できる。
NSArray 同様インデクサが使える。

```objc:
    NSMutableArray* a2 = [NSMutableArray new];
    a2[0] = @1;
    a2[1] = @2;
    a2[2] = @4;
    NSLog(@"a2=%@", a2);
    
    NSDictionary* d1 = @{@1: @"富士", @2: @"鷹", @3: @"なすび"};
    for (id key in d1) {
        NSLog(@"%@ => %@", key, d1[key]);
    }
    
    NSMutableDictionary* d2 = [NSMutableDictionary new];
    d2[@"hello"] = @"こんにちは";
    d2[@"thanks"] = @"ありがとう";
    NSLog(@"d2=%@", d2);
```
gitに追加してしまった不要なファイル群を根絶する。

何気なく

git add .
git commit

してしまい、大量の要らないファイルを追加してしまって、それを削除したいとき。

たとえばPythonの*.pycファイルならこんな感じ

find . -name "*.pyc" -print0 | xargs -0 -t git rm --ignore-unmatch


・追加されてないファイルは--ignore-unmatchで対象外に。
・ファイル名、フォルダ名にスペースが入っているものも正しく処理。
必要なファイルからインストールするべきパッケージを探す


たとえば、ant-nodeps.jar が必要だとする。そんな場合、


```
$ yum whatprovides */ant-nodeps.jar
```

で、そのファイルを提供しているパッケージが出てくる。

## 参考

http://major.io/2010/12/08/locate-rpm-packages-which-contain-a-certain-file/
Windowsでwhichコマンド

Windowsでwhichコマンドを利用する。

```bat:which.bat
@echo off
for %%I in (%1 %1.com %1.exe %1.bat %1.cmd %1.vbs %1.js %1.wsf) do if exist %%~$path:I echo %%~$path:I
```

PATHに登録しているコマンドを検索できる。

````
> which notepad
C:\Windows\System32\notepad.exe
````

````
> which diff
C:\GNUstep\bin\diff.exe
````


> [＠IT：Windows TIPS -- Hint：whichコマンドを作る](http://www.atmarkit.co.jp/fwin2k/win2ktips/319which/which.html)
Smarty の多次元配列の繰り返し処理

意外とハマったSmartyで3次元配列の繰り返し処理

```php:配列サンプル
array
  0 => 
    array
      0 =>
        array
          'id'   => '1'
          'name' => '田中'
      1 =>
          'id'   => '2'
          'name' => '鈴木'
```

```php:TPL側繰り返し処理
{section name=item loop=$arrayData}
  {section name=unit loop=$arrayData[item]}
    {$arrayData[item][unit].id}
    {$arrayData[item][unit].name}
  {/section}
{/section}
```
vimの更新

vimの更新

参考
http://nob-log.info/2012/01/20/vim-install-use-mercurial/
http://www.limemo.net/blog/2012/03/yum-segmentation-fault.html
http://serverfault.com/questions/256385/yum-segmentation-fault-in-centos

```
#yum remove -y vim-enhanced
#yum install -y python-devel python-setuptools easy_install mercurial
```
⇒セグメンテーション違反ですエラー

ソースからインストールしたzlibをアンインストール

```
#cd /source/dir/zlib-*.*.*
#make uninstall
```

インストールできた。

vimのインストール

```
# cd /usr/local/src/
# hg clone https://vim.googlecode.com/hg vim
# cd vim
./configure \
--with-features=huge \
--enable-multibyte \
--enable-rubyinterp \
--enable-pythoninterp \
--enable-perlinterp \
--enable-gpm \
--enable-cscope \
--enable-fontset

#make
#make test
#make install
```
なぜvimをアップデートしようかと考えたのは、
http://bugrammer.g.hatena.ne.jp/nisemono_san/20130618/1371491115
を見てsyntasticを使おうと思いインストールしたが、
vimを開くと

```
function <SNR>21_BufWinEnterHook..20..21 の処理中にエラーが検出されました:
行    1:
E117: 未知の関数です: getmatches

E15: 無効な式です: getmatches()
```

のエラーが出たから。
Node.jsのインストール(Ubuntu)

# Node.jsをインストールしたときのメモ

OS:Ubuntu12.10
virtualBox上のゲストOSにインストール

## 最新版のダウンロード
	
	wget http://nodejs.org/dist/v0.10.5/node-v0.10.5.tar.gz

## ディレクトリの移動とコンパイルとインストール
	
	解凍したディレクトリに移動して以下を実行
	
	./configure
	make
	sudo make install

## npmのインストール ※Node.jsのパッケージ管理ツール
	
	curl https://npmjs.org/install.sh | sudo sh

	npmをインストールする場合には-gオプションをつける
		wsのインストール
		sudo npm install -g ws

	websocket.ioのインストール
		sudo npm install -g websocket.io
Git & GitHubのインストール

Windowsにインストールしたときの自分メモです。
忘れないように記録。

##**Git&GitHubのインストール手順**

1.Gitのインストール

	Git fo windowsをダウンロード(msysgit)
	
	Gitのインストール
		[Windows Explorer integration]を外す
		[Associate .sh files to be run with Bash]を外す
		
		Configuring the line ending conversions
			[Checkout as-is,commit Unix-style line endiings]をチェック
	
	参考：http://www.02.246.ne.jp/~torutk/git/gitonwindows.html
	
2.GitHubのインストール

	GitHubのアカウント作成
		https://github.com/
		
	GitHubから GitHub for Windows をダウンロード
		インストールを実行
		
		Loginし、設定をする
			dashboard→tools→optionを実施
			
			「default storage directory」でデフォルトディレクトリを入力
			「default shell」でシェルを選択(Git bash)
		
	暗号化キーの作成
		鍵の作成
			ssh-keygen -t rsa -C "foo@hoge.com"    // Githubに登録したメールアドレス
		
			Generating public/private rsa key pair.
			Enter file in which to save the key (/home/.ssh/id_rsa):    ← なにも入力せずに［Enter］
			Enter passphrase (empty for no passphrase):    ← 好きなパスワードを入力
			Enter same passphrase again:        ← 確認のためにもう一度入力
			Your identification has been saved in /home/.ssh/id_rsa.
			Your public key has been saved in /home/.ssh/id_rsa.pub.
			The key fingerprint is:
			e8:ae:60:8f:38:c2:98:1d:6d:84:60:8c:9e:dd:47:81 foo@hoge.com
		
			$HOME/.ssh/ 配下に「id_rsa（秘密鍵）」と「id_rsa.pub（公開鍵）」が作成される。
			
		GitHubへ公開鍵の登録
			id_rsa.pubの中身をコピー
			
			GitHubのページで、アカウントの設定→SSH公開鍵に登録
			
		秘密鍵をローカルへ登録
			$ eval `ssh-agent`    // ssh-agent を起動
			Agent pid 6356
			$ ssh-add $HOME/.ssh/id_rsa
			Enter passphrase for /home/.ssh/id_rsa:    ← 鍵を作成したときのパスワードを入力
			Identity added: /home/.ssh/id_rsa (/home/.ssh/id_rsa)
		
		パスフレーズの省略したい場合、以下をbash_profileにでも記載
			
			# Setup ssh-agent
			if [ -f ~/.ssh-agent ]; then
			    . ~/.ssh-agent
			fi
			if [ -z "$SSH_AGENT_PID" ] || ! kill -0 $SSH_AGENT_PID; then
			    ssh-agent > ~/.ssh-agent
			    . ~/.ssh-agent
			fi
			ssh-add -l >& /dev/null || ssh-add

##**GitHubの使い方**
	
       リポジトリの作成と初期化
		$ mkdir $HOME/work/tmd45.github.com
		$ cd $HOME/work/tmd45.github.com
		$ git init
		
	ローカルへのコミットとリモートへの登録とPUSH
		$ echo "This is my first GitHub." > README
		$ git add README
		$ git commit -m 'first commit'
		$ git remote add origin git@github.com:tmd45/tmd45.github.com.git
		    // 「tmd45/tmd45.github.com」は Github に作ったリポジトリの名前
		$ git push origin master
	
##**Gitコマンド**

	git init リポジトリの初期化
	git add <File名> コミットするファイルを指定する
	git commit 変更点をコミットする
			-a 変更を加えられたファイルを自動検出してコミット。新規作成ファイルは対象位ならない
			-m コミットメッセージ
	git diff ファイルに加えられた変更点をdiff形式で表示する
	git status 変更が加えられたファイルを表示する
	git log コミットログを閲覧
	
	git clone git://github.com/～ 既存Gitリポジトリのコピーを取得
	git remote add origin git@github.com:DQNEO/sample.git URLに別名(origin)をつける
	git push origin master masterはブランチを指定
unite-javaimportというプラグイン書いた。

この記事は[Vim Advent Calendar 2012](http://atnd.org/events/33746)の201日目の記事です。
前日は @IMAGEDRIVE さんの [Vim Girl Ver 7.4（イラスト）を描いた](http://blog.imagedrive.jp/diary/2013-06-18/vim-advent-calendar-2012-200th) でした。vim girlカワイイ。

今日の話題は、vimでjavaを書く際、import文を手軽に挿入するためのプラグイン unite-javaimport を作成しましたので、
そのプラグインを紹介させていただきます。

リポジトリ http://github.com/kamichidu/unite-javaimport

vimでjavaを編集しているときに、使いたいクラスがある度にファイル先頭まで戻ってimport文を記述するのが面倒でした。
現状、いくつかのプラグインはありましたが、気に入らなかったので作ってみました。
ちなみにまだアルファ版です。

unite-javaimportの概要
--------------------------------------------------------------------------------
カレントディレクトリに`.javaimport`というファイルを用意し、次のような形式で設定を行います。
すると、列挙したパスやurlから取得できる型名がuniteインタフェイス上に列挙されます。

```text:.javaimport
# this is a comment
{
    'path': 'path/to/directory',
    'javadoc': 'http://url/to/javadoc/',
},
{
    'path': 'path/to/jarfile',
    'javadoc': 'http://url/to/javadoc/',
},
{
    'path': 'http://url/to/javadoc',
    'javadoc': 'http://url/to/javadoc/',
},
```
`path`は必須、`javadoc`は省略可能です。
`javadoc`を省略した場合、javadocのプレビュー機能は使えません。


少々わかりにくいと思うので、画像を用意しました。
絞り込みからimport文の追加が行われる様子がわかると思います。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/13653/c7338780-4a01-d358-debb-f4a21ce95f04.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/13653/ae8ae546-292d-bbb7-23b4-58064000b25f.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/13653/c9eec9dd-52ae-e998-3d13-a3af9361bb64.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/13653/b9b4073a-150b-be74-9fd4-27e83e0eb4d5.png)

unite-javaimportのインストール
--------------------------------------------------------------------------------
NeoBundleをお使いなら、`.vimrc`に以下を書くだけです。

```vim:.vimrc
NeoBundle 'KamunagiChiduru/unite-javaimport', {
\   'depends': ['Shougo/unite.vim'], 
\}
```
javadocのプレビュー機能を使用する場合、`w3m.vim`をdependsに追加してください。

unite-javaimportの問題点
--------------------------------------------------------------------------------
* 非同期で候補取得をしていないので、初回実行時が遅い


unite-javaimportの依存関係
--------------------------------------------------------------------------------
unite-javaimportの依存しているあれやこれを、以下に列挙します。

* unite.vim
* Exuberant Ctags 5.8 (他のctagsでも動くかも？未検証)
* java runtime environment (jre) 1.6以上
* wget or curl (javadoc取得に使用。またurlからの型名取得に使用)
* w3m.vim (uniteのプレビュー機能でjavadoc表示に使用。javadocの表示を行わない場合は不要)


unite-javaimportに追加したい機能
--------------------------------------------------------------------------------
* static importを追加する
* javadocを参照しながら絞り込みする(preview機能を使用予定)
    * 暫定的に実装しました。が、もう少し読みやすい形で出したいなぁこれ。
* .javaimportでの設定方法をより良い形にする
    * yamlで設定するようにしてみた。設定方法を本記事に追記しました。
* filetypeがjavaの場合にのみ、unite-sourceとして登録する(補完候補に出す)
    * Shougoさんからこういった機能はないと回答を頂きました。

(他に何かあるかな？)


最後に
--------------------------------------------------------------------------------
unite-javaimportという自作プラグインをご紹介しました。
これでeclipseを使わなければいけない理由が1つ減ったと思います。
javaをvimで開発するためのプラグインは、後は補完周りかなぁ。

pullreqやissuesお待ちしています！

以上でvim advent calendar 2012の201日目の記事を終わります。
ここまでお付き合いいただきありがとうございました。
MacのDockを擬似的に非表示にする方法

※ これは「Dockを自動的に隠す / 表示」の設定ではなく、Dockが邪魔で仕方がないから（擬似的に）MacからDock自体消し去りたいという人のためのエントリです。

MacのDockって邪魔だと思いませんか？僕はそうは思いません。
ただ、友人が邪魔で消したいけどやり方が見つからないと言ってたのでちょっと調べて見ました。
結果、そういう設定は出来ないが擬似的にだがほぼ実現は出来るらしいことが分かりました。
やり方は以下のコマンドをターミナルで打つだけ。

``` 
defaults write com.apple.Dock autohide-delay -float 10; killall Dock
```

これがどう言う意味かというと、Dockが表示されるまでの時間を10秒にする、というもの。10のところを変えると秒数が変わります。Dockを非表示にしたいという欲求の原因は大体画面下部のボタンをクリックしようとしたらDockが現れて押せないとかそういうものだから、これで問題は解決出来ると思われます。

元に戻すにはターミナルで

``` 
defaults write com.apple.Dock autohide-delay; killall Dock
```

と打つだけ。割りとぐぐってもすぐ見つからない情報だったのでQiitaのエントリにしてみました。

Reference to http://superuser.com/questions/222715/is-it-possible-to-change-the-delay-before-the-dock-appears-in-os-x-on-mac
brewで特定の古いバージョンのものをインストールする

brew versionsはもうない
[Homebrewで古いバージョンのアプリケーションをインストールする](http://qiita.com/ryam/items/066818fd149e68a98797)

---

~~brewで特定の古いバージョンのものをインストールする方法~~

```sh:
$ brew uninstall node
$ brew versions node
0.10.10  git checkout b492279 /usr/local/Library/Formula/node.rb
...
0.10.0   git checkout 687062f /usr/local/Library/Formula/node.rb
0.8.22   git checkout 3c4a714 /usr/local/Library/Formula/node.rb
...

$ cd /usr/local/
$ git checkout 3c4a714 /usr/local/Library/Formula/node.rb
$ brew install node
```

[brew install specific version of formula](https://coderwall.com/p/lqphzg)

正直あまり使う機会はそんなに多くない

すでに古いものが過去にインストールされている場合は、symlinksだけを切り替える
brew switch というものもあるらしい

[Homebrew install specific version of formula?](http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula)
Go の浮動小数点型の割り算

問題: 次の出力はなんでしょう?

```go:
package main

import (
        "fmt"
)

func main() {
        fmt.Printf("%v\n", 1.0 / 2)
        i := 2
        fmt.Printf("%v\n", 1.0 / i)
}
```

答え:

```bash:
0.5
0
```

これに一時間くらいハマった。

追記: 仕様らしい: https://groups.google.com/forum/?fromgroups#!topic/golang-nuts/BtdivXuo2-o
パターンマッチ実装奮闘記(6)

前回は、LLVMでパターンマッチを実装しようと、考えてみたのですが、難しくてもがいていました。
ただ、もがいていてもどうしようもないと言う事で型をどう変換するかとパターンマッチ用の構文は分けて考える事にしました。

今回は、型についてのみ考えます。

## 型

まず、TVariant型を考えます。
以下が、ヴァリアントを表す型の使用例です。

```
TVariant(List(
  "A"->TStr(List("a"->TInt(32))),
  "B"->TStr(List("a"->TInt(32), "b"->TInt(32))
))
```

この型で変数領域を確保するのは以下のようにします。

```
EVal(TVariant(List(
  "A"->TStr(List("a"->Ti(32))),
  "B"->TStr(List("a"->Ti(32), "b"->Ti(32)))
)),"data", null)
```

確保する領域のサイズは、TVariant内のリストの中の最も大きいサイズを持つ型+4バイトになります。
この式をコンパイルする事で領域が確保されるところまでを実装してみましょう。

ここで気がついたのですが、パターンマッチを行う前に、値の設定もしたい所です。

しかし、値の設定も難しいので値の設定はまた別に分けて考える事にします。

## 実装する

さて、実装しながら考えてみましょう。

まず、型を定義します。

```
case class TVariant(ls:List[(String,TStr)]) extends T
```

次に、テストコードに以下のコードを追加します。

```
EVal(TVariant(List(
  "A"->TStr(List("a"->Ti(32))),
  "B"->TStr(List("a"->Ti(32), "b"->Ti(32)))
)),"data", null)
```

とりあえず実行してみます。
実行してエラーが出る箇所が実装しないと行けない所です。

ちょっと、パニクったのですが、文字列変換の箇所でエラーが出ていました。

```
case TVariant(ls) => "TVariant("+ls+")"
```
を入れてみると、出力されたllファイル内で、型がTVariantだからダメーってなっています。TVariantの文字列表現が本当はstructであって欲しいわけです。

エラーが起きた出力は、型にTVariantとかって出力されています。

	%data = alloca TVariant(List((A,%.struct2), (B,%.struct1)))


正しい動作は、%struct.Data型にしたいのです。

```scala
%struct.A = type { i32 }
%struct.B = type { i32, i32 }
%struct.Data = type { i32, %struct.B }
```

%struct.Dataに入れる２番目の構造体の値は、構造体のサイズ計算が出来ないと決めることが出来ません。
とりあえず、サイズ計算関数はダミーで１を返す関数を作っておきましょう。

```scala
def size(t:T):Int = 1
```

そして、全リストの中で最も大きいサイズと型を求めます。
foldLeftを使えばよいでしょう。あとは、構造体名を出力すれば良いだけです。簡単じゃないかぁ！！

結局以下のコードをtrait TのtoStringメソッドに追加する事で、目的のコードを出力する事ができました。

```scala
      case TVariant(ls) =>
        // サイズ計算
        def size(t:TStr):Int = {
          T.string(t) // 構造体の登録
          1
        }
        val (maxsize, maxt) = ls.foldLeft((0,null:T)) {
          case ((n:Int,t),(name:String,vt:T)) =>
            val sizevt = size(vt)
            if (sizevt > n) (sizevt, vt) else (n, t)
        }
        val t = TStr(List("tag"->Ti(32),"data"->maxt))
        
        T.string(t)
```

## まとめ

今回は型を考えました。
また、変数領域の確保まで実装をしてみました。
値の設定だけでも結構複雑そうなので、値の設定は別に分けて考える事にしました。

従って、パターンマッチは３つに分けて考えると良さそうです。

1. 型と変数領域の確保について考える
2. ヴァリアント値の初期化について考える
3. パターンマッチ構文について考える

次回は、ヴァリアント値の初期化について考えようと思います。
Cocos2d-x CCAnimation メモリリーク

下記の様なコードを書いた場合

 // アニメーションフレームを管理するクラスを生成
 CCAnimation *animation = CCAnimation::create();
animation->addSpriteFrameWithFileName(fileName->getCString());

そのSceneのデストラクタに2行追加しないとメモリリークします。
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames();
CCTextureCache::sharedTextureCache()->removeUnusedTextures();

1時間くらいハマりました^^;
Evernote Mac用ショートカットまとめ 


kotaziです。
- [kotazi.com](http://kotazi.com)


Evernoteのショートカットまとめてみました。


|||
|---|---|
|⌘ N|新規ノート|
|⌃ ⌘ N|新規ノートブック|
|⌃ ⌘ N|新規タグ|
|⌥ ⌘ N|新規Evernote Window|
|⌘ W|閉じる|
|⌘ S|保存|
|⌘ Y|添付ファイルをクイックルック|
|⇧ ⌘ P |ページ設定|
|⌘ P |印刷|
|⌘ Z |取り消す|
|⇧ ⌘ Z|やり直す|
|⇧ ⌘ V|書式なしでペースト|
|⇧ ⌘ M|ノートをマージ|
|⇧ ⌘ X|選択テキストを暗号化|
|⌥ ⌘ F|ノートを検索|
|⌥ ⌘ S|検索を保存|
|⌘ R|検索をリセット|
|⌘ F|ノートで検索|
|⌘ G|次を検索|
|⇧ ⌘ G|前を検索|
|⌘ J|セクションへ移動|
|⌘ ：|スペルチェックと文章校正を表示|
|⌥ ⌘ T|ツールバーを表示|
|⌘ 1|リストビュー|
|⌘ 2|ミックスビュー|
|⌘ 3|サムネールビュー|
|⇧ ⌘ A |割り当てのないタグを隠す|
|⇧ ⌘ I|ノート情報を表示/非表示|
|⌘ L |選択したノートに移動|
|⌘ T|フォントパネル表示|
|⇧ ⌘ C|カラーパネル表示|
|⇧ ⌘ T|To Do の挿入|
|⇧ ⌘ H|水平線の挿入|
|⇧ ⌘ F|スタイルを削除する|
|⇧ ⌘ O|番号付きリストに切り替え|
|⇧ ⌘ U|箇条書きリストに切り替え|
|⇧ ⌘ Tab |リストのレベルを上げる|
|⇧ Tab|リストのレベルを下げる|
|⌘ {|左揃え|
|⌘ }|右揃え|
|⌘ :|中央揃え|
aPartHide jQuery Pluginを修正して使う

ulタグで「続きを読む」を実装したかったのだが、
[aPartHide jQuery Plugin](http://fredibach.ch/jquery-plugins/aparthide.php)では`.live()`でエラーが出た。

##問題の箇所
38行目と41行目。

```js:jquery.aparthide-0.2.js(L36-L46)
if ($element.find(plugin.settings.listElement+" "+plugin.settings.listItems).length > plugin.settings.hidingTriggerLength) { // L36
  plugin.hideElements(); // L37
  $element.find('.'+plugin.settings.controlElementShowClass).live('click',function() { // L38
    plugin.showElements(); // L39
  }); // L40
  $element.find('.'+plugin.settings.controlElementHideClass).live('click',function() { // L41
    plugin.hideElements(); // L42
  }); // L43
} else { // L44
  $element.find(plugin.settings.listControlElement).hide(); // L45
} // L46
```

### .live()関数の置き換え方法
`.live()`関数は、

> version deprecated: 1.7, removed: 1.9

[とある](http://api.jquery.com/live/)通り、jQuery1.9で削除されたので、他の関数を使って書き換える必要がある。
修正方法はそのサイトに載っていたので以下にそのまま引用。

#### Before

```js:
$(selector).live(events, data, handler);
```

#### After

```js:
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+
```

これに従って、コードを修正する。

### 修正後
修正後はこんな風になる。

```js:jquery.aparthide-0.2.js(L38、修正後)
  $(document).on('click', '.'+plugin.settings.controlElementShowClass, function() { 
```
```js:jquery.aparthide-0.2.js(L41、修正後)
  $(document).on('click', '.'+plugin.settings.controlElementHideClass, function() { 
```

`$element.find('.'+plugin.settings.controlElementShowClass)`をそのままセレクタとして突っ込むと動かないので注意。
ランダムなsleep

#概要
ランダムな秒数スリープするコマンド

#使い方

```text
Usage: sleep_random [<Options>] <from sec> <to sec>
Options:
  -v  output verbosely.
  -h  show help.
```

#使用例
10～20秒スリープ

```bash
sleep_random 10 20
```

#インストール
好きな場所にコード保存してPATH通せば良いですが楽したければ以下のコマンドでも。

```bash
mkdir /usr/scripts
cd /usr/scripts
git clone git@github.com:kobake/scripts.git .
echo "export PATH=\$PATH:/usr/scripts" >> /etc/bashrc
```

#コード
https://github.com/kobake/scripts

```bash:sleep_random
#!/bin/sh

# options
while getopts vh OPT
do
  case $OPT in
    "v" ) FLG_V="TRUE" ;;
    "h" ) FLG_H="TRUE" ;;
  esac
done
shift `expr $OPTIND - 1`

# arguments check
if [ $# -ne 2 -o "$FLG_H" = "TRUE" ]; then
  echo "Usage: sleep_random [<Options>] <from sec> <to sec>"
  echo "Options:"
  echo "  -v  output verbosely."
  echo "  -h  show help."
  echo ""
  exit 1
fi

# arguments assignment
FROM=$1
TO=$2
if [ $FROM -gt $TO ]; then
  TMP=$FROM
  FROM=$TO
  TO=$TMP
  echo "----"
fi
RANGE=`expr $TO - $FROM`

# calc random sec
if [ "$RANGE" -ne "0" ]; then
  SEC=`expr $FROM + $RANDOM % $RANGE`
else
  SEC=$FROM
fi

# into
if [ "$FLG_V" = "TRUE" ]; then
  echo " FROM: $FROM"
  echo "   TO: $TO"
  echo "RANGE: $RANGE"
  echo "  SEC: $SEC"
fi

# sleep
sleep $SEC
```
Servletをgzip対応にする

通常Apache/Nginxの層でやることだけど、事情があってServlet内にgzip対応をしたときのメモ。

ehcache-core は Java 1.5 に対応するため 2.5.7 に。
通常は最新版でOK。

### pom.xml

~~~xml
<project>
  ...
  <dependencies>
    ....
    <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache-core</artifactId>
      <version>2.5.7</version>
    </dependency>
    <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache-web</artifactId>
      <version>2.0.4</version>
    </dependency>
  </dependencies>
</project>
~~~

### web.xml

~~~xml
<web-app>
  ...
  <filter>
    <filter-name>GZipFilter</filter-name>
    <filter-class>net.sf.ehcache.constructs.web.filter.GzipFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GZipFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
~~~
CoffeeScript で名前空間を定義

他の JavaScript ライブラリとの名前衝突を回避するため、名前空間を定義できるようにしてみる。

まず名前空間 Fx にクラスを定義する関数を用意。

```coffeescript:
@Fx = (fn) ->
  klass = fn()
  @Fx[klass.name] = klass
```

クラス定義は次のように行う。

```coffeescript:
@Fx -> class Person
  constructor: (@firstName, @lastName) ->
    ...
```

使い方は予想通り。

```coffeescript:
person = new Fx.Person('John', 'Smith')
```

require.js とか使う方がいいのだろうか？
Unicorn munin


```sh
$ cd /usr/share/munin/
$ git clone git://github.com/munin-monitoring/contrib.git
$ ln -s /usr/share/munin/contrib/plugins/unicorn/unicorn_*
$ vim /etc/munin/plugin-conf.d/unicorn
[unicorn_*]
env.rails_root ${Rails.rootを指定}
$ service munin-node restart
```
Sublime Textで空白以外の行頭に移動する．



http://kataok.hatenablog.com/entry/2012/11/26/172858
こちらのサイトを参考に設定．
この設定をするとCtrl-aを入力するたびに
1. 空白を除く行頭へ移動
2. 行頭へ移動
3. 空白を除く行頭へ移動
…
のようなトグル動作が出来て非常に便利．

```json

{ "keys": ["ctrl+a"], "command": "move_to", "args": { "to": "bol", "extend": false} }

```

上の設定ではC-aの動作を上書きしています．
【CQ５】テンプレート作成において

CQ5のテンプレート化を担当するにあたり、開発者であればさほど問題にならないかと思いますが、
制作側（主にhtmlを触ってる方々）だとなかなか設計しづらい部分もあるかと思います。
そのあたりの考え方を今回はメモ。

# テンプレートは「雛形」
ページを作成する、という思考は捨ててください。
あくまで**ページの基礎**となるページを作成するのです。

# ページの構成部を考える
![CQ5　JSP画面イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/25775/11bd74fd-c927-1aa4-b4b0-4dcba85f8db4.png)

**HTML**をベースに考えます。
head.jsp（CQ5内だとheadlib.jspにあたります。<head>タグ内の内容です）とbody.jspに分けました。

その後、bodyの中身の検討です。
現状のデザインだと大体ヘッダー・フッターとメインがあります。
bodyとなる部分は自由に編集できると思いますが、大方これで土台ができたと思います。

図の中にあるmain.jspの中身をブログ（CMS）などで設定できる、2カラム3カラムで割るテンプレートを
それぞれ作成すれば拡張がやりやすくなります。

# main.jspのデザインは。。
作成するサイトにもよりますが、まずはサイトストラクチャを作成し現在のデザインの全体を捉えることが大切。
1カラムで大きめの画像で構成されているもの、2カラム構成で右カラムにはバナーやindex、twitterAPIが
表示されているものなど

新規でサイトを立ち上げる場合には大方1カラム、2カラム、3カラムはサイトイメージや載せる情報で決めて
いいかと思います。
土台のテンプレートがあれば拡張に工数もかからないですし、とりあえず2カラムのものを構築、でも全然問題ないです。
sshポートフォワーディング

https://robotmoon.com/ssh-tunnels/

ポートフォワーディングを使うとリモート環境もあたかもローカルにあるように扱うことができる。

ローカル -> リモート
===============

書式
-------------

$ ssh -fNL `ローカルポート`:`リモートネットワーク`:`リモートポート` `リモート`

[こちらのサイト](http://chamibuddhika.wordpress.com/2012/03/21/ssh-tunnelling-explained/)の
![この図](http://chamibuddhika.files.wordpress.com/2012/03/sshsessionforwarding.jpg)を参考。

mysql
--------------

```bash:mysql
$ ssh -fNL 3307:localhost:3306 remote
$ mysql -uroot -P 3307
```

http
--------------

```bash:http
$ ssh -fNL 8080:localhost:80 remote
```

* [http://localhost:8080](http://localhost:8080) にアクセスし画面が表示されることを確認。

ローカル <- リモート
==========

```bash:ssh
$ ssh -N -R 8090:localhost:22 remote
(リモート)$ ssh localhost -p 8090
```

その他
=========

VPN代わり （ローカル -> リモート）
-------------

```bash:
$ sshuttle -r remote 0/0 -vv
```

* 構成
  * ローカル: 192.168.12.0/24
  * リモート: 192.168.24.0/24
* 解説
  * ローカルからリモート内のネットワークに自由にアクセスできる。

接続元を確認
-------------

```bash:
$ who am i
```

keepalive (ローカルに設定)
-------------

```bash:サーバーからの自動切断を防ぐ
# 秒
ServerAliveInterval 10
ServerAliveCountMax 12
```

```sh:サーバー側で自動切断したい場合(sshd_config)
# 秒
ClientAliveInterval 60
```


踏み台を利用してそのままSSH
-------------

```bash:
$ ssh -t myhome.co.jp ssh myserver.co.jp
```

解説

* 接続元から、myhome.co.jpに接続し、そのままmyserver.co.jpに接続。
* リモートに直接入りたい＆切断を一回で終わりたい場合使用。


ダイナミックフォワーディング(socksサーバー)
=====================

```bash:
$ ssh -ND 8080 myserver.co.jp
```

解説

* 接続元の端末でsocksサーバーの指定をlocalhost:8080にする。
* ブラウザでmyserver.co.jp内のローカルネットワークにアクセスできる。
  * 例) http://192.168.40.? のアドレスを入力すると、そのアドレスにアクセスできる。
CreateJSのスプライトシートで時間ベースのアニメーションをする方法

スプライトシートアニメーションをスペックの異なるデバイス環境で同じように動作させたい
↓
**フレームレートが異なる**からアニメーションが違って見えてしまう
↓
**時間ベースにすることで解決**

```ts:
// スプライトシートの作成
var spriteSheet:createjs.SpriteSheet = new createjs.SpriteSheet(data)
// アニメーションの作成
var effect:createjs.BitmapAnimation; = new BitmapAnimation(spriteSheet);
this.addChild(effect);

// 時間ベースのフレーム制御
var numFrames:number = effect.spriteSheet.getNumFrames("run");
var sec:number = numFrames/30 * 1000; // 総フレーム数 * 目標FPS * 1000(ミリ秒)
var effectFrame = 0;
createjs.Tween
    .get(this)
    .to({effectFrame: numFrames}, sec, createjs.Ease.linear)
    .call(function (event:any) => {
    // 不要になったら表示ツリーから削除
        this.removeChild(effect);
    })
    .addEventListener("change", (event:any):any => {
        effect.gotoAndStop(this.effectFrame>>0);
    });
```

※こちらは通常の方法

```ts:

// タイムラインベースのフレーム制御
effect.onAnimationEnd = function (event:any) => {
    // 不要になったら表示ツリーから削除
    this.removeChild(effect);
};
effect.gotoAndPlay("run");

```
Google Apps Scriptで簡単にレスポンスタイムを監視する

管理しているサービスのレスポンスタイムを計測し，設定時間以上に遅い場合には，アラートメールを飛ばすスクリプト

下記コードの必要な部分を書き換えて，スクリプトの実行トリガーを1時間毎とかにすると自動的にチェックしてくれます。

```js:ResponseTimeChecker.js
var BASE_URL     = "http://hogefuga.com";
var DEFAULT_LIMIT = 200;
var MAIL_ADDRESS  = "hogehoge@hogefuga.com";
var checkApiMap = {
  '/api1' : DEFAULT_LIMIT,
  '/api2' : DEFAULT_LIMIT,
  '/api3' : 300,
}

function sendMail(overApiMap) {
  var title = "#alert some api exceed the limit response time"
  var msg = ""
  for (var api in overApiMap) {
    msg += api + "\t" + overApiMap[api] + "\n"
  }
  if (msg != "") {
    MailApp.sendEmail(MAIL_ADDRESS, title, msg);
  }
}

function doCheck() {
  var overApiMap = {};
  for (var api in checkApiMap) {
    var url    = BASE_URL + api
    var before = new Date();
    var res    = UrlFetchApp.fetch(url);
    var after  = new Date();

    var responseTime = after - before;
    if (res.getResponseCode() !== 200) {
      overApiMap[api] = -1;
    } else if (responseTime > checkApiMap[api]){
      overApiMap[api] = responseTime;
    }
  }
  sendMail(overApiMap);
}

```
nexus7にubuntuを入れたまとめ

[公式ガイド](https://wiki.ubuntu.com/Nexus7/Installation)見てもわからない点を書きました。

ファイルをダウンロード
====
[配布元](http://cdimage.ubuntu.com/daily-preinstalled/last-good-image/)から

 + raring-preinstalled-desktop-armhf+nexus7.bootimg
 + raring-preinstalled-desktop-armhf+nexus7.img.gz

windowsの場合[xda](http://forum.xda-developers.com/showthread.php?t=1809195)からダウンロード。

 + !CLICK HERE TO DOWNLOAD THE GOOGLE NEXUS 7 TOOLKIT V5.0.0! をクリックするとダウンロード出来ます。

インストール
====
  $ fastboot-toolkit.exe erase boot
  $ fastboot-toolkit.exe erase userdata
  $ fastboot-toolkit.exe flash boot raring-preinstalled-desktop-armhf+nexus7.bootimg
  $ fastboot-toolkit.exe flash userdata raring-preinstalled-desktop-armhf+nexus7.raw

電源ボタンを押すとインストーラーが走る。PCのubuntuと一緒。

設定
====
compizのエラーが出るので、compizを無効化する。
----
  $ gconftool --recursive-unset /apps/compiz

ミラーサイト変更
----
[ミラーサイト情報](https://forums.ubuntulinux.jp/viewtopic.php?id=5838)より、
/etc/apt/sources.list内を置換

 + $ sudo sed -i -e 's@http://ports.ubuntu.com@http://jp.archive.ubuntu.com@'
 + $ sudo apt-get update

母艦のUbuntuからUSBシリアル接続
----
 + sudo gpasswd -a $USER dialout (この後一回ログアウト。)
 + screen /dev/ttyACM0 115200 (何も表示されない場合、Enterキーを押すと表示されるかと思います。)

その他
----
 + 13.10は、インストールが失敗したので仕方なく12.10で行いました。(2013-06-17現在)
 + 途中13.04にアップデートしませんか？と聞かれたら、アップデートし再起動して大丈夫でした。
 + lubuntuにするとタッチの座標に絶望します。
 + Bluetoothキーボードのキー配列がおかしいときはUSキー配列に変更してみるとよいかと。
 + ディスクアクセスが遅い(HDDより遅い)のでもっさり。VMWareのほうがよほど早いです。
 + ミラーサイトに切り替えないとパッケージまともに入れられないです。
 + [オリジナルROM](https://developers.google.com/android/nexus/images#nakasi)
ecwid-mailchimpでListにSubscribersを追加する時にGroupsも指定する方法

事前にGroupsを以下のように作っておく。

![List Groups for Example   MailChimp.png](https://qiita-image-store.s3.amazonaws.com/0/7809/171ff2a2-2e2f-2119-4067-6b4fe1755786.png)

Javaコードの中では、GROUPINGSというフィールドで上記Groupsを扱える。

```java:
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ecwid.mailchimp.MailChimpClient;
import com.ecwid.mailchimp.MailChimpException;
import com.ecwid.mailchimp.MailChimpObject;
import com.ecwid.mailchimp.method.list.ListSubscribeMethod;

public class Example {

    @SuppressWarnings("serial")
    public static class MergeVars extends MailChimpObject {
        @Field
        public String EMAIL, FNAME, LNAME;

        @Field
        public List<Map<String, Object>> GROUPINGS = new ArrayList<>();

        public MergeVars() {
        }

        public MergeVars(String email, String fname, String lname, String groups) {
            this.EMAIL = email;
            this.FNAME = fname;
            this.LNAME = lname;
            Map<String, Object> group = new HashMap<>();
            group.put("name", "Exmple Groups");
            group.put("groups", groups);
            GROUPINGS.add(group);
        }
    }

    public static void main(String[] args) throws IOException,
            MailChimpException {
        MailChimpClient mailChimpClient = new MailChimpClient();

        ListSubscribeMethod listSubscribeMethod = new ListSubscribeMethod();
        // ここにAPI Keyを入れる。
        listSubscribeMethod.apikey = "****";
        // ここにリストIDを入れる。
        listSubscribeMethod.id = "****";
        // メールアドレスは実在するものを使うこと。このまま使うとエラーになる。
        listSubscribeMethod.email_address = "ryu22e@example.com";
        listSubscribeMethod.double_optin = false;
        listSubscribeMethod.update_existing = true;
        listSubscribeMethod.merge_vars = new MergeVars("ryu22e@example.com",
                "Ryuji", "TSUTSUI", "group1");
        mailChimpClient.execute(listSubscribeMethod);
    }

}

```
Backbone.jsのViewで「el」を指定する方法「tagName,id」を指定する方法

最近、Backbone.jsを使ってシングルページアプリを作ろうと試行錯誤中・・・
そんな中、Viewについて自分なりに理解したことをメモ

今回作ったサンプル
https://github.com/JK0602/backbone_single_page

こんな感じのページ・・・デザインは・・・サンプルなので。。。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/25870/c60cee69-4954-b014-858c-9e67e24d9a7a.png)

chromeだとローカルファイルへのアクセスを許可するために、設定が必要...
http://www.finefinefine.jp/web/jquery/kiji861/


<br><br>
Viewのelを指定する方法は2通りある
(1).既に存在しているDOMエレメントをelに指定する
(2).新しくelを作る場合

以下はサンプル内で使用しているベースのHTML

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <link href="css/common.css" type="text/css" rel="stylesheet" />
    <script type="text/javascript" src="js/lib/require.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
  </head>
  <body>
    <div id="wrapper">
      <!-- ヘッダー -->
      <div id="header"></div>
      <!-- メインコンテンツ -->
      <div id="content"></div>
      <!-- フッター -->
      <div id="footer"></div>
    </div>
  </body>
</html>
```

ヘッダーは既にindex.htmlで存在している「\<div id="header">\</div>」を以下のように、
el: $("#header"),
としてelに指定した。（(1)の場合）

```js:HeaderView.js
var HeaderView = Backbone.View.extend({
  el: $("#header"),                   //←既に存在するDOMエレメントを指定

  //以下イベント登録など
  events: {
   ...
});
```

そして、コンテンツ内（\<div id="content">\</div>）はページAとページBの内容で切り替えたかったので、tagNameとidを指定することで、elを新しく作ることにした。（(2)の場合）
tagName: "div",
id: "cnt-index",
こうすることで、
 this.elが「\<div id='cnt-index'>\</div>」となる。

```js:AppView.js
var AppView = Backbone.View.extend({
  tagName: "div",              //←新しくelを作る場合
  id: "cnt-index",
  template: null,

  //イベント登録など
  ...

  //描画
  render: function(){
    this.$el.html(this.template());
    $("#content").html(this.el);
   
    ...

    return this;
  },
});
```

上記の描画の部分で、
$("#content").html(this.el);
とすることで、index.html内の

```html:index.html
<div id="content"></div>
```

を

```html:index.html
<div id="content">
    <div id='cnt-index'>
        ページＡ
        ....
    </div>
</div>
```

のように書き換えることができる。
別のViewで同じようにすれば

```html:index.html
<div id="content">
　　<div id='cnt-next'>
        ページB
        ....
    </div>
</div>
```

のようにcontent内を書き換えられる。

el: $("#content"),
のように指定して中身をページAとBで切り替えればいいじゃんと、最初は思ってたけど、elが同じだと、ページAで設定したイベントがページBでも動いてしまうので、このように新しくelを作る方法で作ってみました。。。
chefでchef-rvmを利用してみる

chefでrvm環境を取り扱いたかったので[chef-rvm](https://github.com/fnichol/chef-rvm)を利用してみる。
ついでにberkshelfでcookbookを管理してみる。

あまり他のレシピを利用するとかしたことなかったので勉強になったがこんなんで良いのかな？

## 環境

 * Amazon Linux：2012.09
 * rvmをシステム(/usr/local/rvm以下)にインストール済
 * chefを以下の方法でインストール済

```bash:
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
```

 * berkshelf：2.0.3インストール済

## chefでchef-rvmを利用してみる

 * ベース作成

```bash:
$ mkdir hoge
$ cd hoge
$ berks init
```

 * berkshelfでchef-rvm導入

```bash:
 $ echo "cookbook 'chef-rvm', git: 'https://github.com/fnichol/chef-rvm.git'" >> Berksfile
 $ berks install --path cookbooks
```

 * chef-rvmを利用するcookbook作成
  * リソースの書き方がgithubにあるReadmeと違って苦労した

```bash:
 $ cd cookbooks
 $ berks cookbook hoge

 $ vi hoge/recipes/default.rb 
 $ cat vi hoge/recipes/default.rb 
include_recipe "chef-rvm"

chef_rvm_ruby "jruby" do
  action :install
end

 $ echo "depends          'chef-rvm'" >> hoge/metadata.rb

 $ cd ..
```

 * chef-soloでの実行準備

```bash:
 $ mkdir .chef

 $ vi .chef/solo.rb
 $ cat .chef/solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path "/home/ec2-user/hoge/cookbooks"

 $ vi .chef/chef.json 
 $ cat .chef/chef.json
{
  "run_list": [ "recipe[hoge]" ]
}
```

 * chef-soloで実行
  * => rvmでjrubyがインストールされる

```bash:
 $ sudo chef-solo -c .chef/solo.rb -j .chef/chef.json
Starting Chef Client, version 11.4.4
Compiling Cookbooks...
Recipe: chef-rvm::default
  * chef_gem[rvm] action install (up to date)
/home/ec2-user/chef-repo/cookbooks/chef-rvm/libraries/rvm_chef_user_environment.rb:49: warning: class variable access from toplevel
Converging 2 resources
  * chef_gem[rvm] action install (up to date)
Recipe: hoge::default
  * chef-rvm_ruby[jruby] action install/home/ec2-user/chef-repo/cookbooks/chef-rvm/libraries/rvm_chef_user_environment.rb:32: warning: class variable access from toplevel
```
このくらいまでならjsで三項演算子使ってもいいよね、っていうパターン(個人的に)

初投稿なのでちょっと読み物っぽく三項演算子について書いてみます。（たぶん内容的にはたいしたことは書いてません。）

- - -

みなさん三項演算子って使いますか？僕はこいつがけっこう好きで好んで使っています。
僕が使うパターンとしてはだいたい２パターンだけに限られています。

###僕がよく使うパターン１：ふつうの三項演算子による式

```javascript
var ans = ( ( Math.random() * 100 ) > 50 ) ? 'larger' : 'smaller';
```

```
変数 = 条件式 ? trueの時の値 : falseの時の値 ;
```

これは一般的ですよね。
だいたい、誰が書いても書き方はだいたい一緒のはず。僕もよく使います。

ついでに別バリエーションも（値が長くなった時は僕はこう書いてます。）

```javascript
var ans = (
	  ( somethingBool === true ) && ( ( Math.random() * 100 ) > 50 )
	? ( somethingHead1 + 'larger' + somethingTail1 )
	: ( somethingHead2 + 'smaller' + somethingTail2 )
);
```

```
変数 = (
	  条件式
	? trueの時の値
	: falseの時の値
);
```




###僕がよく使うパターン２：if文で変数に代入する構文の代替

もうひとつ、個人的によく使うパターンの書き方です。
「変数に代入する値を複数条件で変えたいだけ」の時に使うパターンです。

```javascript

//こういうif文があるとします。
var score = Math.round( Math.random() * 100 );
var str;
if( score === 100 ){ str = "100点"; }
else if( score >= 80 ){ str = "80～99点"; }
else if( score >= 50 ){ str = "50～79点"; }
else if( score >= 30 ){ str = "30～49点"; }
else{ str = "0～29点"; }
alert( str );

//
// ↓ こんなかんじに書きかえます。少し見通しを良くできる。
// ↓ また、後で見た時にstrに値を代入しているだけということがわかりやすいのもポイントかと。
//

//三項演算子による式の結果を変数に代入するパターン。
var score = Math.round( Math.random() * 100 );
var str =
	  (score === 100) ? "100点"
	: (score >= 80) ? "80～99点"
	: (score >= 50) ? "50～79点"
	: (score >= 30) ? "30～49点"
 	: "0～29点";
alert( str );

//
// ↓ 制御構造じゃなくて式なので直に関数の引数にもとれます。
// ↓（でもちょっとわかりにくいかもしれん。。）
//

//三項演算子による式の結果を引数として渡すパターン。
var score = Math.round( Math.random() * 100 );
alert(
	  (score === 100) ? "100点"
	: (score >= 80) ? "80～99点"
	: (score >= 50) ? "50～79点"
	: (score >= 30) ? "30～49点"
 	: "0～29点"
);
```

書き方の作法としては決まりは無いと思いますが、僕は並び方がif文と同じ感じになるように書いています。コロンは行末じゃなくて頭です。

```
変数 =
     条件式① ? ①が真なら値A
    : ①が偽なら条件式② ? ②が真なら値B
    : ②が偽なら条件式③ ? ③が真なら値C
    : ③が偽なら条件式④ ? ④が真なら値D
    : ④が偽なら値E;
```

どうでしょうか。

さらに、もし、条件式や結果が長くなったらこう書いてます。

```javascript
var score = Math.round( Math.random() * 100 );
var str = 
	  ( score === 100 )
	? ( somethingHead1 + "100点" + somethingTail1 )
	: ( score >= 80 )
	? ( somethingHead2 + "80～99点" + somethingTail2 )
	: ( score >= 50 )
	? ( somethingHead2 + "50～79点" + somethingTail2 )
	: ( score >= 30 )
	? ( somethingHead2 + "30～49点" + somethingTail2 )
 	: ( somethingHead3 + "0～29点" + somethingTail3 );
alert( str );
```

以上、値を変数に代入するだけならif文じゃなくて三項演算子にしたほうがすごく効果的だよね！っていう話でした。
いちおう、jsでは分岐をネストさせるパターンなんかはあまり書かない方がよいのではないかと思っていますが、このくらいまでならOKではないか、と思ってます。
利点としては、演算子による式なので制御構造に比べて速度が速いとか聞いたことがあります。細かい話ですが。
ちょっと調べたら昔見たサイトがでてきた。三項演算子をネストさせたい方はご一読ください！

[http://hp.vector.co.jp/authors/VA010341/conditional.html](http://hp.vector.co.jp/authors/VA010341/conditional.html)

####参考

[http://blog.satt.jp/article/272435607.html](http://blog.satt.jp/article/272435607.html)

####蛇足

最近、自分のコードのスペースのあけ方やらが書籍と異なっているのがやたら気になっています。
ていうか、これ駄文だなあ…w
RubyMotionでrakeした際にcannot load such file -- bridgesupportparser (LoadError)になった時の対処

RubyMotionでrakeした際にrakeした時に以下エラーでコンパイルに失敗した時の対処方法を記述
※前提としてシステムデフォルト/usr/bin/ruby ver1.8を上書きしてしまってver1.9以降になっている場合の対処方法です

>/Users/user/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in require: cannot >load such file -- bridgesupportparser (LoadError)
>	from /Users/user/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in require
>	from /usr/bin/gen_bridge_metadata:55:in <main>
>rake aborted!


```rb:/usr/bin/gen_bridge_metadata
#!/usr/bin/ruby
```

になっている部分を以下に変更

```rb:/usr/bin/gen_bridge_metadata
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
```
写経していて思うこと２

こんばんわ

つまらない投稿ですが。。。

写経していてきおつけないといけないが、テキストの誤字・脱字ですね。
特になれていないコードのテキスト場合は注意が必要で、テキストの誤字・脱字なのにそれに気づかずに、時間・やるきともに失ってしまう事があります

と、注意書きをした僕も下記の誤字・脱字で３日程ハマってしまいました。

```objc:ViewController.m
#import "ViewController.h"

@implementation ViewController
@synthesize imageView;
@synthesize scrollView;

- (void)viewDidLoad
{
    // コンテンツビューを作成する
    [super viewDidLoad];
    self.imageView = [[ContentView alloc] initWithFrame:CGRectMake(0, 0, 1024, 1024)];
    [imageScrollView addSubview:contentview];
    
    // スクロールビューのコンテンツサイズを設定する
    imageScrollView.contentSize = contentview.frame.size;    
}
```

上記のコードサンプルが記載されておりまして、例の如くビルドが通らないんです。

ビルダ：**contentview** ってなに？
おれ：えっ、テキストに書いている通りなんだけど
ビルダ：だからなに？**contentview**なんのつもり？
おれ：（滝汗）

言語になれていると、『あ、宣言足りてない』とか気づきますけど、テキストを神のように崇めている僕だとついつい『ぼくの写経ミスかな？』『あれ、ページ飛ばしちゃった？』『説明を読み飛ばしたかな？』なんて考えちゃって、やる気を失っていくんですよね。

上記の場合だと、次のページの別のサンプルコードに、おれ悪くないからと言わんばかりに、しれっと編集されてました。

```objc:
- (void)viewDidLoad
{
    // コンテンツビューを作成する
    [super viewDidLoad];
    ContentView * contentview = [[ContentView alloc] initWithFrame:CGRectMake(0, 0, 1024, 1024)];
    [imageScrollView addSubview:contentview];

    ...
```

結構厚いテキストですが、ビリビリ破りたい衝動にかられました

* サンプルコードが付属でついていればそれと見比べる
* HPで本の訂正がないか見てみる

とか、重要ですね。

あ、３日ハマったというのはちょっと違って、ちょうどFF14ベータ版解放されて、それを遊んでてそれどころじゃなくなったんですよね。

でわ、また。