OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript(node.js)で競技プログラミングするためのテンプレ書いた

AOJでjavaScript(node.js)が使えることに気づいたので早速やってみたのですが、非同期I/Oでプロコンするのはなかなか斬新な体験だった（皮肉です）ので、後世のために残しておきます。
入力が馬鹿みたいにでかかったり変則的な形式を取る問題の場合、これじゃ対処できないです。でも、そもそもNode.jsで競技プログラミングしようっていう発想が間違ってるので、そういうときは諦めてRubyとかPython使ってください。自分で入力を処理しようとすると多分詰みます。

```javascript:procon-template.js
function main() {
  //ここで問題を解く
  //`input` に入力が改行で区切られた配列として入ってくるので頑張って
}

var
input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
  input += chunk;
});
process.stdin.on('end', function() {
  input = input.split('\n');
  main();
});
```

多分、入力の無い問題を上記のコードをベースにして解いたらコケると思いますがそこはさすがに判断してください。

その2

```js:procon-template2.js
var fs = require('fs'),
    length = fs.fstatSync(process.stdin.fd).size,
    buffer = new Buffer(length),
    bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
    input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();
function main(){
// do something
}
```
こっちは入力の有無は関係なしです。
その分、パイプラインで流し込む必要がありますが。

なんで会津大学はよりによってnode.jsを選んだんだよ…。

ちなみに僕はnode.jsで [AOJ 109 Smart Caluculator](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0109) を解いたのですが、それはそれで非常に罠がありました。そっちのコードは [gist](https://gist.github.com/alucky0707/5475273) に貼っておいたので興味ある人は覗いてみてください。
Google日本語入力の辞書を複数PCでクラウド同期させる

# 同期辞書の廃止が決定！＼(^o^)／ｵﾜﾀ
[Google 日本語入力開発版の同期機能廃止について - Google Japan Developer Relations Blog](http://googledevjp.blogspot.jp/2013/12/google.html)

これによると2013年12月9日をもって終了らしいです。

廃止理由も書かずにサラッと終了とか…、Google Readerのトラウマに続いてまたかって感じですね。もうGoogleのプロダクトやサービスは安心して使えないとみんな学習しだしてると思う。

多分今後Googleが何か新サービス出してもみんな警戒してすぐには使わない→ユーザ伸びない→廃止っていう駄目スパイラルになってくんじゃないかしら。


#以下、元々の本文。

## 序文（読み飛ばして良い）
僕は自宅やノートPCや会社や実家などいろんな環境でPCを使っています。最近はIMEならGoogle日本語入力、ブラウザはChrome、後は適当なターミナルソフト、この３大アプリがあればWindowsだろうがMacだろうがLinuxだろうがほぼ同じ環境みたいなもんで作業の９割はできちゃいます。Googleのお陰で便利になったもんだｗｗ

んで、便利といえばChromeのブックマークやパスワード同期ですがこれが超便利。複数PCどころかスマホでも同期できちゃうしね！

そんな便利なクラウド同期機能なんだけど、Google日本語入力の辞書も同期したいよねー、Googleなのに何で無いの？と最近まで思ってたんですが…、実はもう１年くらい前から辞書のクラウド同期ができるようになってたんですね！

当然のことながら、Windows、Macの両方で対応してて双方向に同期できます！

# 設定方法
前置きが長くなりましたが設定方法です。Google日本語入力の設定画面のどこを探してもクラウド同期機能なんて見つからない？それもそのはず、実はまだ辞書のクラウド同期は **開発版にしか無い** んです！そりゃーいくら探したって見つからないわけだ…。

## 開発版をインストール
お手元のGoogle日本語入力が通常版なら、まずは開発版にアップデートするとこから始まります。ダウンロードは↓こちらから（これ実は通常版のダウンロードページの下の方からもこっそりリンクが張ってあります）。
https://tools.google.com/dlpage/japaneseinput/eula.html?hl=ja&extra=dev

開発版なだけに通常版よりも同意項目が多いですが、同意しないとインストール出来ませんのでまぁそこは各人でご判断ください。

## クラウドタブ登場
さて無事、開発版Google日本語入力のインストールが済みましたらおもむろに設定画面を開いてみましょう。

![クラウドタブ](http://cdn-ak.f.st-hatena.com/images/fotolife/y/y-kawaz/20130428/20130428004812.png)
はい出た！クラウドタブが出ました！あとはボタンをぽちっと押して指示通りにGoogleにログインして連携設定すればOKです。

## 同期用辞書
するとユーザ辞書内に`同期用辞書`ってのが出来てるはずなので、ここに適当な単語を追加しておくとそれが全PCでほぼリアルタイムで有効になるわけですね。
![クラウド辞書](http://cdn-ak.f.st-hatena.com/images/fotolife/y/y-kawaz/20130428/20130428011745_original.png)

んー、便利！
bootswatchをRailsで使う


##bootswatch とは

Twitter Bootstrapをカスタマイズしたテーマが置いてあるサイトです。

[Twitter Bootstrapのさまざまなテーマをダウンロードできる『Bootswatch』 | 100SHIKI](http://www.100shiki.com/archives/2012/02/bootswatch.html)


##Railsでbootswatchを使う「twitter-bootswatch-rails」

[scottvrosenthal/twitter-bootswatch-rails · GitHub](https://github.com/scottvrosenthal/twitter-bootswatch-rails)

[seyhunak/twitter-bootstrap-rails · GitHub](https://github.com/seyhunak/twitter-bootstrap-rails)も入っているそう。

##使い方
1.Gemfileに以下を記述後 bundle

```Gemfile
group :assets do
	gem 'twitter-bootswatch-rails', '~> 2.3.1.2'

end

gem 'twitter-bootswatch-rails-helpers', '>= 2.3.1'

```

2.[Bootswatch: Free themes for Twitter Bootstrap](http://bootswatch.com/)に掲載されているテーマを指定する（今回は[cyborg](http://bootswatch.com/cyborg/)を選択）

```bash:
rails g bootswatch:install cyborg
rails g bootswatch:import cyborg
rails g bootswatch:layout cyborg
```

3.application.css, application.jsに以下を追加

```css:application.css
/*
 *= require_self
 *= require [theme_name]/loader
 *= require font-awesome/font-awesome
*/
```

```javascript:application.js
//= require jquery
//= require jquery_ujs
//= require [theme_name]/loader
```

これで使えるようになるはず。

##詳細は
[ドキュメント](https://github.com/scottvrosenthal/twitter-bootswatch-rails)にいろいろ書いてます。
突然の死文字列を生成してクリップボードに追加する

```ruby
# coding: UTF-8

def sudden_death_generator(_str)
    # 文字列長を生成する。length では半角・全角が1字になるのでバイト長で判断する
    length_multibyte_strings = (_str.bytesize / 2) + 1 # +1は文字の前後の空白分

    # 文字列を生成する
    sudden_death_str = <<EOS
＿#{"人" * length_multibyte_strings}＿
＞ #{_str} ＜
￣#{"Y^" * (length_multibyte_strings - 1)}Y￣
EOS

    # 突然の死を表示
    puts sudden_death_str
    # 突然の死をクリップボードにコピー（Mac）
    system "echo \"#{sudden_death_str.chomp}\" | pbcopy "
end
```
GithubのREADMEで使える拡張子(書式)一覧



以下の書式がサポートされいます。

Emacsユーザーにはorg-modeが使えるのが嬉しいんじゃないでしょうか。

* [.markdown, .mdown, .md](http://daringfireball.net/projects/markdown/) -- `gem install redcarpet` (https://github.com/vmg/redcarpet)
* [.textile](http://www.textism.com/tools/textile/) -- `gem install RedCloth`
* [.rdoc](http://rdoc.sourceforge.net/) -- `gem install rdoc -v 3.6.1`
* [.org](http://orgmode.org/) -- `gem install org-ruby`
* [.creole](http://wikicreole.org/) -- `gem install creole`
* [.mediawiki](http://www.mediawiki.org/wiki/Help:Formatting) -- `gem install wikicloth`
* [.rst](http://docutils.sourceforge.net/rst.html) -- `easy_install docutils`
* [.asciidoc](http://www.methods.co.nz/asciidoc/) -- `brew install asciidoc`
* [.pod](http://search.cpan.org/dist/perl/pod/perlpod.pod) -- `Pod::Simple::HTML`
  comes with Perl >= 5.10. Lower versions should install Pod::Simple from CPAN.

### 参考

[markup](https://github.com/github/markup)

GithubでREADMEのレンダリングに使われているライブラリです。
PromiseとAsyncでサンプルを書いてみた

# はじめに
先日Node.jsの勉強会に参加したらそんな話が出ていて、今回の発端は下記なのかな？
http://togetter.com/li/487252

勉強の為もあって下記のようなサンプルを書いてみたのです。node-promise（ https://github.com/kriszyp/node-promise ）でやった場合と、async（ https://github.com/caolan/async ）でやった場合。
WEBのアプリを書いているなら最終的には画面へ戻す為に全ての処理を待つと思うので、そんな想定で書きました。

https://github.com/ms2sato/promise.sample

# 以下は細かい話
## 今回書いていて気づいた事
 * async初めて使いましたが、便利ですね。綺麗に書けるようです。
 * 今回のように同じPromiseを再利用する場合、node-promiseの実装ではエラーが発生した際にハンドルできないエラーになってしまう場合があります。既にキャンセルされたPromiseをさらにコールしてしまう為なようです。

## node-promiseのエラーハンドリング
Promiseの実際の仕様は忘れてしまいましたが、少なくともnode-promiseでは、then(success, error)のerrorが書かれていない場合は、さらに上位のthenが探られるはずなので、エラー処理が煩雑になるということは無いと思います。実際のコードを見ると、try-catchしているような印象になると思います。

## 私のスタンス
「Node.jsは一番低レベルな実装のコールバック関数の形で指定してくれているんだから、何でも好きに乗っけて使ったらええやん。標準APIはコールバックで良いです。簡単にラップできる仕組み作れば（欲を言えばデファクトスタンダードがあれば）いいよね。」

という訳で、Promiseを使えとかコールバックを使えとか他人に言う気は無いです。ただ、自分は処理がわかりやすいし、コールバックを呼ぶ流れを追うよりも戻り値でやってくれている方が見やすいので、Promiseを使っています。処理の合成もしやすいです。書きやすいとか見やすいというのは人によるので、あくまで私はそう感じる、という話です。

jQueryでもDeferred使っています。どうやら少数派だったんですね。
eclipseが起動できない

メモ。
Eclipseが起動できなくなった。

Eclipse -clean で実行してみたところ、

No binding table for org.Eclipse.ui.contexts.dialog
Status ERROR: com.android.ide.eclipse.adt code=0 Unknown exception in parseSdkContent. java.lang.NullPointerException

と出た。

workspaceにある
.metadata/.plugins/org.Eclipse.core.resources/.snap
を削除したら起動できた。

原因は不明。
GitLabのNetworkの表示速度を改善してみた

GitLab 5.1にNetworkにコミットメッセージなどを表示する[プルリク](https://github.com/gitlabhq/gitlabhq/pull/3258)がマージされて、どのような反応があるのか気になっていたのですが、早速、[ネットワークの表示が2～4倍遅くなった](https://github.com/gitlabhq/gitlabhq/issues/3684)というありがたいIssueを頂きました。

表示する情報が増えたため、表示が遅くなるのはある程度仕方の無いことなので、「機能改善の要望は[Feedback and suggestions forum](http://feedback.gitlab.com/)に投稿してね」とつっこみたいところをグッとこらえて、とりあえず表示の高速化に挑戦することにしました。
※GitLabはIssueの増加が激しいため、明らかな不具合の報告以外はGitHubのIssueには投稿しないようにというポリシーになっています。詳しくは[このへん](https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#issue-tracker)に書いてあります。

5.0->5.1におけるNetworkの表示速度悪化の要因としては、以下の2点が考えられました。

1. コミットへのレビューコメントの件数を表示する機能を追加したため、DBアクセスのオーバーヘッドが増えた
2. 表示する情報量が増えたため、ブラウザの描画処理に時間がかかるようになった

1については、コミット1件毎(1リクエストで最大650件)にクエリを発行している部分を1リクエストで1回のクエリを発行するように書き換えました。これで、数百ミリ秒の処理時間を節約できました。

2については、表示可能なコミットの最大件数を半分ぐらいに減らせば簡単に修正できていいかなと考えましたが、そうすると次は「表示できる件数が少なくなった」とIssueを投稿される可能性がありました。
そのため、最初に行っていたグラフ全体の描画処理をブラウザの表示領域付近を部分的に描画するように変更しました。これで、初回の描画処理が最大で1/10程度に軽減できました。

以上の修正により、Networkの描画時間が1/5程度には高速化されたと思います。具体的な変更内容は[プルリク](https://github.com/gitlabhq/gitlabhq/pull/3741)を参照して下さい。

それと、表示の高速化のついでに、マウスのドラッグで表示領域の移動をしていたところを縦方向のスクロールバーで移動するように変更し、セレクトボックスでタグの切替が正常に動作していないところも修正しました。

GitLabは毎月22日に定期的にリリースされているので、次回は5/22頃にリリースされると思います。
sinatraのデーモン起動とpadrino移行

sinatraでアプリを作ったけど、デーモン起動と他のマシンからのアクセスがしたかったので結局padrinoに移行した。

# sinatraで動かす
最小限のサンプルアプリ書いてそれを実行してみた。
gemがインストールされていなければ```gem install sinatra slim```が必要。
### コードを書く

```ruby:app.rb
require 'sinatra'
require 'slim'

get '/index' do
  slim :index
end

def greet
  "Hello World!"
end

__END__

@@index
h1 = greet
```

### 起動

```
$ ruby app.rb -p 3000
```

ポート指定がない場合は4567ポートで起動される。
http://localhost:3000/indexにアクセスするとHello World!と表示される。

# sinatraをデーモンで起動する
unicornを使ってデーモン起動する。
基本的には先ほど作ったapp.rbを改造する。
gemがインストールされていなければ```gem install unicorn```が必要。
### コードを書く
```ruby:app.rb
require 'sinatra'
require 'slim'

class App < Sinatra::Base
  get '/index' do
    slim :index
  end

  def greet
    "Hello World!"
  end
end

App.run!
```

```ruby:views/index.slim
h1 - greet
```

```ruby:unicorn.conf
worker_processes 2
listen '/tmp/unicorn.sock'
stderr_path File.expand_path('unicorn.log', File.dirname(__FILE__))
stdout_path File.expand_path('unicorn.log', File.dirname(__FILE__))
preload_app true
```

tmpフォルダを作成しておく
### 起動

```
$ unicorn -c unicorn.conf -D
```

* http://localhost:4567/index にアクセスするとHello World!と表示される。
* しかし、localhostまたは127.0.0.1ではなく、別のマシンからアクセスしようとしたらつながらなかった。
 * [Sinatraがデフォルトでは外部から繋がらなくなってたよ](http://qiita.com/u1_fukui/items/b86b21f6ed39f4c10d5d)に詳細・対策が書いてあった
 * (@k-ta-yamada さんから頂いたご指摘より)

# padrinoで動かす
gemがインストールされていなければ```gem install padrino```が必要。
padrino generateとかで適当に構成が作られるのであとは上で作ったファイルを配置して、ちょこっと修正するだけ。
### コード
以下を実行した。

```
$ padrino g project sample -e slim
$ padrino g controller sample get:index
```

以下のファイルを変更した

```ruby:app/views/sample/index.slim
h1 = greet
```

```ruby:app/controllers/sample.rb
Sample::App.controllers :sample do
  get :index, :map => '/' do
    slim :"sample/index"
  end
end
```

```ruby:app/helpers/sample_helper.rb
Sample::App.helpers do
  def greet
    "Hello World!"
  end
end
```

### 起動

```
$ padrino start -p 3000 -d
```

# おわりに
http://localhost:3000/indexにアクセスするとHello World!と表示される。
別のマシンからhttp://(padrinoで起動したマシンのIPアドレス):3000にアクセスしても見れた。
小さいアプリでもサクット作って動かしてみる程度ならsinatraでもいいが、ある程度の期間使うならpadrinoを使ったほうがいいと感じた。

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
お手軽に相対時刻を吐き出す関数

こちらの記事の内容をかなり使わせていただきました
http://www.tinybeans.net/blog/2008/11/02-070720.html

```javascript

function getRelativeTime(baseDateStr, targetDateStr){

	var baseDate = new Date(baseDateStr);
	var targetDate = new Date(targetDateStr);

	var elapsedTime = Math.ceil((baseDate.getTime() - targetDate.getTime())/1000);

	var message = null;

	// これ以下で一定時間未満のごとのメッセージの表示方法を条件分岐
	// 表示する数字が1桁のときは関数 digit で頭に半角スペースを付ける
	if (elapsedTime < 60) { //  1 分未満
		message =  'たった今';
	} else if (elapsedTime < 120) { //  2 分未満
		message =  '約 1分前';
	} else if (elapsedTime < (60*60)) { //  1 時間未満
		message =  '約' + (Math.floor(elapsedTime / 60) < 10 ? ' ' : '') + Math.floor(elapsedTime / 60) + '分前';
	} else if (elapsedTime < (120*60)) { //  2 時間未満
		message =  '約 1時間前';
	} else if (elapsedTime < (24*60*60)) { //  1 日未満
		message =  '約' + (Math.floor(elapsedTime / 3600) < 10 ? ' ' : '') + Math.floor(elapsedTime / 3600) + '時間前';
	} else if (elapsedTime < (7*24*60*60)) { // 1 週間未満
		message =  '約' + (Math.floor(elapsedTime / 86400) < 10 ? ' ' : '') +Math.floor(elapsedTime / 86400) + '日前';
	} else { // 1 週間以上
		message =  '約' + (Math.floor(elapsedTime / 604800) < 10 ? ' ' : '') + Math.floor(elapsedTime / 604800) + '週間前';
	}
	
	return message;
}

```
Node.js Websockets が利用できそうなクラウドをザックリ調査

ちょっと調べたので備忘録として。ドキュメントを見ただけで実際に利用した訳ではないです。

http://joyent.com/

https://modulus.io/

https://www.dotcloud.com/

https://www.nodejitsu.com/

http://node-ninja.com/

http://cloudno.de/
beta

https://www.appfog.com
https://docs.appfog.com/roadmap
WebsocketsはComming Soon

http://www.ntt.com/cloudn/


他にもあったら知りたいです。オートスケーリングも乗っているものがあったら嬉しいのに。Cloudnは良い事いっぱい書いてあるが実際どうなんだろう。
sublime text 2でmakeする

sublime textではデフォルトのビルドシステムにmakeがあってCtrl+Bで使えるのですごく便利です。

今回はGnu makeをwindowsにインストールしてmakeします。

まずはmain.cppとhello.cppの2つを用意します。

```main.cpp
void printHello();

int main(int argc, char const *argv[])
{
  printHello();
  return 0;
}
```

```hello.cpp
#include <iostream>


void printHello()
{
  std::cout << "Hello!!";
}
```

次にMakefileを用意します。

```make
hello: main.o hello.o
	g++ -Wall main.o hello.o -o hello

main.o: main.cpp
	g++ -c main.cpp

hello.o: hello.cpp
	g++ -c hello.cpp
```

次にsublime textで先程のファイルが保存してあるディレクトリを開いてください。

Project -> プロジェクトにフォルダを追加 -> 保存しているフォルダを選択します。

あとこのままビルドしようとしてもutf-8がどーのこーどって出てくるので文字コードの解決をしなきゃいけません。

何かWindows限定の問題っぽいです。

sublime textのパッケージのディレクトリを開いてください。

Makefile/Make.sublime-buildをいじくるのですが、念のためファイルをバックアップして置いてください。

`"encoding": "cp932",`を追加してください。

これで多分文字コードの問題は解決します

Tools -> ビルドシステム -> Make 選択して

Ctrl+Bでmakeできます。

```
g++ -c main.cpp
g++ -c hello.cpp
g++ -Wall main.o hello.o -o hello
[Finished in 0.7s]
```

今回はデフォルトで用意されてるビルドシステムを使いましたが

Tools -> ビルドシステム -> ビルドシステムの追加　

から独自のビルドシステムを定義することができます。

例えばプロジェクトごとにビルドシステムを分けるとかもできます。
RailsとherokuでURLスクリーンキャプチャーを取る方法

URLスクリーンキャプチャを行う方法は、
大きく３つあります。

## １、スクリーンショット取得用WEBサービスの利用

簡単に導入できるけど、他社サービスに依存。

## ２、JSで取得

⬇みたいなのがありましたが、canvasタグを使うのでHTML5が前提。

http://html2canvas.hertzen.com

よって、オールドブラウザは使えない


## ３、仮想フレームバッファ（Xvfb）＋ブラウザ経由

何でもできる。けど実装難度（工数）が高い。

ということで、何でもできるという点を評価し、
上記３で実装を行いました。

## 実装方法

実装難度が高いと言いましたが、
これはルート権限があれば、比較的簡単に実装が出来ます。

ところが、今回はherokuが前提となっているため。
少々手こずりました。（少々じゃないか。。）

結論から言うと、
### IMGkitを使う

IMGkitとは、wkhtmltoimage(Qt4を使用してhtmlレンダリングを行い、イメージ出力するソフト)をラッパーしたgemです。

wkhtmltoimageをダウンロードして、IMGkitでパスを指定してあげれば、
以下のような記述でスクリーンショットを取得できます。

```ruby:config
IMGKit.configure do |config|
  config.wkhtmltoimage = Rails.root.join('bin', 'wkhtmltoimage-amd64').to_s if ENV['RACK_ENV'] == 'production'
end
```

```ruby:model
file = Tempfile.new(["hogehoge", '.png'], 'tmp', :encoding => 'ascii-8bit')
file.write(IMGKit.new(hogehoge_url, quality: 100, :"crop-w" => 1024).to_png)
```

で、コントローラ側でDJで呼びつつ、
保存先にcarrierwaveを組み合わせるとベストかと。


## 日本語が文字化けするんですけど・・・

herokuな方は、[fontconfigを使う](http://qiita.com/items/58be855f909f29c05ae6)を参考にしてみてください。


### 追記

※ リクエスト処理のバリデーションが甘いのでexconを使って事前にチェックするといいですよ。
※ DJは、まわす方じゃないよ、Delayed_job！本家みるとDJで呼んでほしいみたい。
※ wkhtmltoimageはwkhtmltopdfの一部で、PDF出力することも出来ます。
開いているファイルのプロセスを特定（lsofコマンド）

## lsofコマンドの使い方です。

lsofコマンドは、、、
PortやPID、プロセス名からファイルがオープンしている情報を表示するコマンド。

## よく利用する場面

「netstat -an |grep LISTEN 」とかでListenしているPortを調べてそのPortが何のプロセスとかで動いているのかとかを確認するのに使っています！

## 使い方サンプル

```bash:ファイルを指定
% lsof /var/log/system.log
COMMAND   PID      USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
tail    97529 USERNAME    3r   REG    1,2   498299 12085861 /private/var/log/system.log
```
/var/log/system.logはtailコマンドで開いていることがわかりますねー

----

```bash:ポート指定
% lsof  -i:80,443
COMMAND PID      USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
Dropbox 376 USERNAME   14u  IPv4 0x2b3f22aae05f3e3      0t0  TCP 192.168.100.102:58140->108.160.162.100:http (ESTABLISHED)
Dropbox 376 USERNAME   19u  IPv4 0x2b3f22ab4456703      0t0  TCP 192.168.100.102:54071->108.160.160.177:https (CLOSED)
```
portが80, 443で開いているプロセスを表示指定ます。
LISTENしているプロセスも表示されます。(DROPBOX って HTTPポート(80) を使って同期しているんですねー)

#### 明示的にLISTENされているプロセスを調べたい場合

```bash:redisのポート
lsof -i:6379 |grep LISTEN

# TCPとして指定する
lsof -iTCP:6379 |grep LISTEN
```

---------------------

```bash:プロセス名指定
% lsof -c ruby
COMMAND   PID      USER   FD    TYPE             DEVICE  SIZE/OFF     NODE NAME
ruby    18910 USERNAME  cwd     DIR                1,2      1190        2 /
ruby    18910 USERNAME  txt     REG                1,2   2805460  1903306 /Users/USERNAME/.rbenv/versions/1.9.3-p385/bin/ruby
ruby    18910 USERNAME  txt     REG                1,2     13384  1903333 /Users/USERNAME/.rbenv/versions/1.9.3-p385/lib/ruby/1.9.1/x86_64-darwin12.2.1/enc/encdb.bundle
ruby    18910 USERNAME  txt     REG                1,2     13168  1903375 /Users/USERNAME/.rbenv/versions/1.9.3-p385/lib/ruby/1.9.1/x86_64-darwin
```
rubyプロセスが開いているファイルを表示していますねー

----

```bash:PIDを指定
% lsof  -p 376
COMMAND PID      USER   FD     TYPE             DEVICE  SIZE/OFF     NODE NAME
Dropbox 376 USERNAME  cwd      DIR                1,2      2550  7815603 /Applications/Dropbox.app/Contents/Resources
Dropbox 376 USERNAME  txt      REG                1,2     89808  7815600 /Applications/Dropbox.app/Contents/MacOS/Dropbox
```
PIDが376のプロセスが開いているファイルを表示

----

```bash:ユーザ名を指定
% lsof  -u ユーザ名
```
指定したユーザが開いているプロセスを表示
HTMLタグのためのGoogle日本語入力用の辞書作った

初投稿です。
Qiitaの作法のようなものを学ぶ目的を兼ねています。

##内容
　[Github](https://gist.github.com/suneo3476/5462528)にて公開しています。2KBに満たないテキストデータです。Google日本語入力でエクスポートを行いました。簡潔な書式なので、他のIMEへの対応も容易かと思われます。

##作成理由
　HTMLは意味構造の記述にとても役立つ言語ですが、本文が日本語である場合には[**半角/全角**]キーを適切なタイミングでタイプしなければなりません。しかも、名前の短くて覚えやすいタグならばともかく、長めの名前を間違えやすい、思い出しにくいタグや属性の用途などを思い出すためにわざわざリファレンスを開いて確認する作業は大変です。以上のことから、半角に切り替える必要を無くすために、IMEの辞書機能を利用してHTMLタグ用の辞書を作ってみました。

##その他
　実体参照文字や変換ワードの網羅、対応タグの量、HTML5導入タグへの未対応などの課題が存在していますが、HTMLを利用して簡単なブログ記事や資料を書く場合には十分な程度の内容だと思います。アドバイス・コメントなどありましたら、お願いします。

同じ趣旨について、ブログでも[記事](http://suneo3476.hateblo.jp/entry/2013/04/26/051128)を書きました。適宜ご参照ください。
[PC-6001] PSG制御

#I/O
| ポート番号 | 内容 |
|:---:|--------------------|
| $A0 | レジスタ指定ポート |
| $A1 | 出力データ         |
| $A2 | 入力データ         |

#read/write

##BIOS使わない
```
;read
        ld      a,register      ;レジスタ番号
        out     ($A0),a
        in      a,($A2)

;write
        ld      a,register      ;レジスタ番号
        out     ($A0),a
        ld      a,data
        out     ($A1),a
```

##BIOS使う
```
;write
        ld      a,register
        ld      e,data
        call    $1BC5

;read & write
        ld      a,register
        ld      e,data
        call    $1BBE
        ;Dreg = 書き込み前のデータ
```
* readは無い

#レジスタ
| register | PC-6001  | AY-3-8910 | Operation                   | 
|----------|----------|-----------|-----------------------------|
| \$00~$05  | R0~R5    | R0~R5     | Tone Generator Control      |
| \$06      | R6       | R6        | Noise Generator Control     |
| \$07      | R7       | R7        | Mixer Control-I/O Enable    |
| \$08~$0A  | R8~R10   | R10~R12   | Amplitude Control           |
| \$0B~$0C  | R11~R12  | R13~R14   | Envelop Period Control      |
| \$0D      | R13      | R15       | Envelop Shape/Cycle Control |

* R8以降はAY-3-8910と番号がズレているので注意
メモリキャッシュの解放

`echo 1 > /proc/sys/vm/drop_caches
`

```bash
[root@***********]# free -m                                                                                                                             
             total       used       free     shared    buffers     cached
Mem:          1866       1802         64          0         75       1422
-/+ buffers/cache:        304       1562
Swap:         3999          0       3999
[root@**********]# echo 1 > /proc/sys/vm/drop_caches
[root@**********]# free -m                                                                                                                             
             total       used       free     shared    buffers     cached
Mem:          1866        301       1565          0          0         23
-/+ buffers/cache:        277       1589
Swap:         3999          0       3999
```
CoffeeScriptのレキシカルスコープ

CoffeeScriptでは基本的に、
ローカルスコープの外側で宣言された変数と同名の変数を
ローカルスコープ内で別の目的で使えない。
外側の変数を書き換えちゃうからね。

ちょっと古い記事だけど、どんな問題があるかはこちらとかを参考に。
http://www.sixapart.jp/techtalk/2012/01/coffeescript.html

自分は、今のところ問題になった事ないし、
自分が把握して書いている範囲であれば、今後もあまり問題ないかなぁと思う。

けど、複数人で作業する場合や、
joinオプションで連結とかで事故が起こるのは、
確かにちょっとありそうですね。

CoffeeScriptには明示的にレキシカルスコープを宣言する構文はありませんが、
抜け道を見つけたのでメモっておく。

ただ、常に明示的に宣言を書いて使い分けない限りは、
上記の問題は回避できないです。

CoffeeScriptが好きな人は、
そんな使い方しないと思うけど、
ちょっと同じ名前を使いたい時とかには使えると思う。

``` coffeescript
hoge = 'hoge'

do ->
    `var hoge` #ここ
    hoge = 'fuga'
    console.log hoge
    
do ->
    console.log hoge
```

単純にjsとしてムリヤリ出力しているだけです。

ちなみに、ローカルのみで使っても、
`var hoge`が2回出力される事はありませんでした。

``` coffeescript
do ->
    `var hoge` #ここ
    hoge = 'fuga'
    console.log hoge
```
ASP.NETの<asp:Table>にjQueryのDataTablesを適用する。





jQueryのDataTablesを使うのは、対象の&lt;table&gt;が&lt;thead&gt;と&lt;tbody&gt;の子を持ち、`id="~"`と`class="display"`の属性を持たなければなりません。
なので、&lt;asp:Table&gt;に`ID="Table1" CssClass="display"`を持たせ、&lt;thead&gt;を持たせるために` headerRow.TableSection = TableRowSection.TableHeader`を設定しています。

```:html
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css">
<link rel="stylesheet" type="text/css" href="http://www.doctorsim.com/css/ui-lightness/jquery-ui-1.7.2.custom.css">
<link rel="stylesheet" type="text/css" href="http://www.datatables.net/release-datatables/media/css/demo_table_jui.css">

...
<asp:Table cellpadding="0" cellspacing="0" border="0" ID="Table1" CssClass="display" style="width:980px" runat="server">
</asp:Table>
...

```


```:vb.net

' テーブルの中身をクリアにしておく。
Table1.Rows.Clear()

' テーブルにヘッダをつける。
Dim headerRow As New TableRow
Dim headerCell As New TableCell
headerRow.TableSection = TableRowSection.TableHeader
headerCell.Text = "HeaderText"
headerRow.Cells.Add(headerCell)

Table1.Rows.Add(headerRow)

' ループしながら、データをテーブルに追加していく。
While cReader.Read()
  Dim row As New TableRow
  Dim cell As New TableCell
  Dim label As New Label
  label.Text = cReader("columnName").ToString()
  cell.Controls.Add(label)
  row.Cells.Add(cell)

  Table1.Rows.Add(row)  
End While

```
Delete local & remote tags (batch)

```
$ git tag | grep ^release | \
  xargs -I % sh -c 'git tag -d % && git push --delete origin %'
```

gitflow を使っていたころ `release-YYYYMMDD-HHmm` という書式で機械的につけていたタグ (ほとんど意味が無くて活用してなかった) を、 working copy からも remote repo からもまとめて削除したかった。
MySQLメモ


## サーバの起動/停止(Mac Homebrew)

手動で

```
mysql.server start
```
```
mysql.server stop
```

自動起動の設定

```
reattach-to-usernamespace launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```
```
reattach-to-usernamespace launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```

いつのころからか、tmux 上で launchctl できなくなってるので、reattach-to-usernamespace する(tmux 上でなければ不要)


※上記は`brew info mysql` で確認できる

参考: [HomebrewでMySQLをインストールする時に知っておきたいこと](http://tukaikta.blog135.fc2.com/blog-entry-197.html)

## インストール直後の作業 (5.6.x系以降)

以下のページを参照（Linux系）

[CentOS 6.4にMySQL 5.6をサクッとインストールする | はったりエンジニアの備忘録](http://blog.manabusakai.com/centos-mysql56-install/)

## コンソール起動

```
$ mysql -uroot -p
プロンプト>（パスワード入力）
```

## データベース一覧

```
mysql> show databases;
```

## ユーザー一覧の確認

mysql クライアントからSQL発行

```
select user, host from mysql.user;
```

## ユーザ作成と権限付与

```
GRANT ALL PRIVILEGES ON *.* TO <USER> IDENTIFIED
BY '<PASSWORD>' WITH GRANT OPTION;
```

### リードオンリーなユーザを作成する

```
GRANT SELECT ON hoge_db.* TO 'hoge'@'%' IDENTIFIED BY 'password';
```

## テーブルの一覧

```
mysql> show tables from DATABESE_NAME;
```



## プロセスのリスト表示

```
mysql> show processlist;
```

## クエリの結果を縦に

SQL文に\Gをつける
AppWidget配置時の設定画面を中断すると、見えないAppWidgetが生成されてシステム上に残り続ける

# 現象

AppWidget配置時の設定画面を中断すると、見えないAppWidgetが生成されてシステム上に残り続ける。
見えないAppWidgetインスタンスが存在し続けるため、次に新たなAppWidgetを配置して削除した場合でも、AppWidgetProviderでのonDisabledが呼ばれないことになる。

# 詳細

AppWidgetは、新規配置時に表示する設定アクティビティをAppWidgetProviderInfoのandroid:configureで指定できる。

設定アクティビティがRESULT_OKかつ、ExtraにappWidgetId格納されている状態で終了すると、新規ウィジェットが配置される。
RESULT_CANCELで終了すると、ウィジェットの配置は行われない。

しかし、AppWidgetProviderでのonUpdate時に渡されるIDsには、ウィジェットが残ってしまっている。
また、キャンセル時にonDeletedが呼ばれる事もない。
さらに、ホーム画面から見えている全ウィジェットを削除してもonDisabledが呼ばれない。

つまり、不可視で削除不可のAppWidgetインスタンスが存在しているような状態になる。

なお、キャンセル以外のBackボタン・Homeボタン・電源ボタン押下によるアクティビティの中断でも同様の状況となる。

# 影響

この件で出来てしまったゾンビAppWidgetがどの程度リソースを圧迫するかは不明。
onDisabledが実行されないのが痛手で、ここに後処理を入れていると、画面上からウィジェットが消えても呼ばれない事になる。

# 対処方法

設定アクティビティをRESULT_CANCELで終了させず、必ずRESULT_OKで終了する。設定を中断した場合、内容が空のウィジェットを表示させ、ユーザーに手動で削除してもらう。

## 他に検討した案

### 設定完了していないウィジェットはonUpdateで破棄

設定アクティビティ起動前にまずウィジェットのonUpdateが呼ばれるため、設定前なのか設定中断後なのかの判別が難しい。設定中にonUpdateが走った場合なども考える必要がある。

### 設定アクティビティのonPauseなどで設定中断を検知して破棄

電源断などでハンドラが呼ばれない場合がある。

# 関連URL

## AndroidのIssues（2009年には報告済だがなぜか未対応）

https://code.google.com/p/android/issues/detail?id=2539

## 日本アンドロイドの会の関連投稿
https://groups.google.com/forum/#!msg/android-group-japan/zFmGHj1LyrA/0x1b7wRhLnAJ

## StackOverFlow

http://stackoverflow.com/questions/4393144/widget-not-deleted-when-passing-result-canceled-as-result-for-configuration-acti

## ドキュメントのAppWidgetガイド

http://developer.android.com/guide/topics/appwidgets/index.html
OpenCV2系のAPIを使って歪み補正を行う

cvInitUndistortMap()&cvRemap()か[cv::distort()](http://opencv.jp/opencv-2svn/cpp/camera_calibration_and_3d_reconstruction.html#cv-undistort)を使ったやり方しか見つからなかったのでメモ。

```cpp:opencv2_calibration.cpp
cv::Mat objectPoints;
cv::Mat imagePoints;
cv::Size imageSize(width, height);

// cv::findChessboardCorners, cv::cornerSubPixなどを使って
// objectPoints, imagePointsを求める。

//
// 中略
//   参考: OpenCV2 プログラミングブック 4.2.1章
//   http://book.mycom.co.jp/support/pc/opencv2/
//

// キャリブレーションの実施
cv::Mat cameraMatrix;
cv::Mat distCoeffs;
cv::Mat rotationVectors,
cv::Mat translationVectors;

cv::calibrateCamera(
					objectPoints,			// 特徴点の世界座標系における座標値
					imagePoints,			// objectPointsに対応する特徴点の画像上での座標値
					imageSize,				// 画像サイズ
					cameraMatrix,			// 入出力用のカメラ内部パラメータ行列
					distCoeffs,				// 歪み係数の出力ベクトル
					rotationVectors,		// 各ビューにおいて推定された回転ベクトル
					translationVectors		// 各ビューにおいて推定された並進ベクトル
					);

// 以降の処理は下記の呼び出しと同じ。ただしcv::undistortは歪みマップを都度求めるため遅い。
//   cv::undistort(image, undistorted, cameraMatrix, distCoeffs);

// 歪みマップを求める
cv::Mat matx, maty;
cv::initUndistortRectifyMap(cameraMatrix, distCoeffs, cv::Mat(), cameraMatrix, imageSize, CV_32FC1, matx, maty);

// 歪み補正を行う
cv::Mat image = cv::imread("input_images.jpg");
cv::Mat undistorted;
cv::remap(image, undistorted, mapx, mapy, INTER_LINEAR);
```
StringFormat内で書式指定子をそのまま出す

````html:Xaml
<TextBlock Text="{Binding MeetingDate, StringFormat='次のPM会議は yyyy/MM/dd です'}" />
````
みたいな XAML を書いたら以下のようになりました。

「次のP4会議は 2013/04/25 です」 

P4 て何。文字化け？と一瞬わからなかったけど、遅れて気付いた。
Monthly で置換されている…！

なるほど、エスケープが必要らしい。
<br>

書式指定子をそのまま出すにはどうするんだっけ…
ああクォーテーションで囲ってやれば良いのか。
<br>

ちなみに StringFormat 全体をシングルクォートで囲っている場合は \' と書くと怒られました。
その場合は &amp;quot; なら良いようです。（←これでまたちょっと躓いた）

````html:Xaml
<TextBlock Text="{Binding MeetingDate, StringFormat='&quot;次のPM会議は&quot; yyyy/MM/dd です'}" />


<TextBlock Text="{Binding MeetingDate, StringFormat=\'次のPM会議は\' yyyy/MM/dd です}" />
````

ちゃんと出た。ふう。
【メモ】NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough argumentsについて

jQueryでajaxを使っているとき「NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments」が出る場合、たいていの場合送るdataプロパティに問題がある。
例えばinputのvalueをとってきて入れたいのにinputのオブジェクトを入れているなど。
謎の現象

http://qiita.com/items/b2df1309cc117caca444

上記のエントリーの puriketu99 の編集リクエストを受け入れようとすると、500エラーで弾かれる。

なぜか jQueryMobileDialogs タグの先頭の j が全角文字になっている。
ならば自分で直そうと、編集画面を開いてみたら、 j はちゃんと半角になっている。
そのまま投稿すると、やはり jQueryMobileDialogs タグの先頭の j が全角文字になっている。
タグを消すと、問題はなくなる。
Markdown記法、これだけ覚えてればあなたのテキストファイルが変わるかも？

みなさんMarkdown記法使ってますか？

自分は、テキストでちょっとしたメモを書くときに使ってたりします。
その上で身についた、綺麗なテキスト文書が出来上がるコツをお教えします。

すべての文法を知らなくても、この文法さえ知ってれば綺麗に書けるかも？

# 見出し

見出しをつけるにはタイトルの下に`====`を付けます。

```
千早がかわいいのは当たり前
==========================
```

もしくは、行の頭に`#`を付けます。

```
# ネイトはトーリの嫁
```

## 小見出し

小見出しは`---`か`##`です。

```markdown:
千早の人気の理由とは
--------------------
```

```markdown
## ミトツダイラかわいい
```

### さらに小さい小見出し

`#`を増やすとさらに小さい小見出しが作れます。

```markdown
### 蘭子ちゃんも厨二かわいい
```

# 箇条書き

箇条書きを書くときに皆さんはどうしているでしょうか？
`・`とかを使っていませんか？

Markdownなら箇条書きも綺麗に書けてHTMLにも変換出来ますよ！
（これが本記事のメインでもあります）

## 順序のない箇条書き

`*`を行頭につけるとリストになります。

```
* 杏
* きらり
```

## 順序のある箇条書き


`1.`のように書くか、`-`をつけると順序のある箇条書きになります。でも後者は、本記事の趣旨から外れる気がするので、前者を使ったほうがテキストが読みやすいでしょう。

ただし、Markdownをレンダリングする際には以下のように順番が飛んでも考慮されないので注意です。

```
1. 「牛」、牛を使う。
2. 牛のお肉を、なんかね、味が付いてるの。味付けるの。
3. なんかね、あんね、外できっと食べたら、食べた事があるはず。
72. 俺、ビーフストロガノフ食べたことない。
```

## 箇条書きのネスト

タブ、もしくは4文字の空白を入れると一階層深いリストになります。

```
1. お願い!シンデレラ (M@STER VERSION)
    * 島村卯月
    * 小日向美穂
    * 三村かな子
    * 渋谷凜
    * 多田李衣菜
    * 神崎蘭子
    * 本田未央
    * 城ヶ崎美嘉
    * 城ヶ崎莉嘉
2. お願い!シンデレラ (Cute VERSION)
    * 島村卯月
    * 小日向美穂
    * 三村かな子
3. お願い!シンデレラ (Cool VERSION)
    * 渋谷凜
    * 多田李衣菜
    * 神崎蘭子
4. お願い!シンデレラ (Passion VERSION)
    * 本田未央
    * 城ヶ崎美嘉
    * 城ヶ崎莉嘉
```

# これらをふまえて

これらを踏まえて文書を作るとこうなります。

```
俺の好きな作品
==============

ゲーム
------

* アイドルマスター
    * 好きな理由
        1. 千早かわいい
    * 好きなキャラクター
        * 千早
        * ちはや
        * 蘭子ちゃん
        * ミンゴス

ライトノベル
------------

ラノベとも略される。

* 電撃文庫
    * 境界線上のホライゾン
        * ネイト・ミトツダイラ
            * 俺の中で好きなキャラランキング一位。
            * トーリの嫁
* オーバーラップ文庫
    * 気になる。

その他
------

1. 内田真礼かわいい
    * 神崎蘭子
        * アイドルマスターシンデレラガールズ
    * 小鳥遊六花
        * 中二病でも恋がしたい
    * ミイ
        * あいまいみー
2. ネタ切れ
3. 半分以上書き終わったのにvimがエラー吐いて消えたので書き直した。
    * そのときとネタが変わってしまいました。
```

俺の好きな作品
==============

ゲーム
------

* アイドルマスター
    * 好きな理由
        1. 千早かわいい
    * 好きなキャラクター
        * 千早
        * ちはや
        * 蘭子ちゃん
        * ミンゴス

ライトノベル
------------

ラノベとも略される。

* 電撃文庫
    * 境界線上のホライゾン
        * ネイト・ミトツダイラ
            * 俺の中で好きなキャラランキング一位。
            * トーリの嫁
* オーバーラップ文庫
    * 気になる。

その他
------

1. 内田真礼かわいい
    * 神崎蘭子
        * アイドルマスターシンデレラガールズ
    * 小鳥遊六花
        * 中二病でも恋がしたい
    * ミイ
        * あいまいみー
2. ネタ切れ
3. 半分以上書き終わったのにvimがエラー吐いて消えたので書き直した。
    * そのときとネタが変わってしまいました。

# 終わりに

自分はMarkdownでメモをとる時にはvimを使っています。
vimにmarkdownのプラグインを入れると、vimのシンタックスハイライトが綺麗につくのでMarkdown記法を心がけるよいきっかけになりました。
Markdown記法だとシンタックスハイライトの付く環境で書くだけで、味気ないテキストを書いているつもりでもだいぶ気分が変わるので、一度試してみてください。

それではよいメモライフを！
意外かもしれない例外インスタンスの比較

```ruby
RuntimeError.new() == SyntaxError.new()     #=> false
RuntimeError.new('') == SyntaxError.new('') #=> true
```

[2.0からは変わったみたい](https://github.com/rubyspec/rubyspec/blob/5cf0c986df746605e1a6a76e265321d74762fbbd/core/exception/equal_value_spec.rb#L32-L54)
string.to_sym.to_s == string ・・・とは限らない

```ruby
string = '+(binary)'   #=> "+(binary)"
string.length          #=> 9
symbol = string.to_sym #=> :+
symbol.length          #=> 1
string == symbol.to_s  #=> false
```

[他いくつか](https://github.com/rubyspec/rubyspec/blob/58d279feb29dd1c4b1278f39101cb281ec60aad1/core/string/shared/to_sym.rb)
Ruby on Railsとfullcalendar pluginでGoogleカレンダークローンを作る(1)


## 前提
rbenvでruby環境を構築済み。
bundlerインストール済み。

確認環境

| app                | version |
|:-------------------|:--------|
| ruby               | 2.1.5   |
| rails              | 4.1.8   |
| fullcalendar-rails | 2.2.2.0 |
| momentjs-rails     | 2.8.3   |



## ひな形を作る

railsのテンプレートを作る。
gemはアプリごとに持つようにするので、ここでは`--skip-bundle`オプションを付けておく。

```
bundle exec rails new calendarclone --skip-bundle
cd calendarclone
```

Gemfileにfullcalendar-railsを追加する

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails', '4.1.8'
gem 'sqlite3'

gem 'fullcalendar-rails'
gem 'momentjs-rails'
gem 'uglifier'

gem 'jquery-rails'
```

```
bundle install --path vendor/bundle
```

## カレンダーを表示させてみる
コントローラとアクションを生成する

```
bundle exec rails g controller calendar index
```

生成されたテンプレートを修正する

```erb:app/views/calendar.index.html.erb
<div id="calendar"></div>
```

calendar.jsの中でfullcalendarを呼ぶ

```js:app/assets/javascript/calendar.js
$(document).ready(function() {
    $('#calendar').fullCalendar({
    })
});
```
app/assets/javascript/application.jsの`require_tree .`の前に以下の二行を追加

```js:application.js
+ //= require moment
+ //= require fullcalendar

```

app/assets/stylesheets/application.cssの`require_tree .`の前に以下の一行を追加

```css:application.css
+  *= require fullcalendar
```

アプリケーションを起動する

```
bundle exec rails s
```

`http://localhost:3000/calendar/index`にアクセス
vim に慣れたい人に向けて、おすすめセットアップ

# 追記
## 2015-01-27
最近 Qiita また活発に見始めたので思い出してきました。
今は NeoBundle も更新されて ```neobundle#rc()``` は非推奨になっているので、更新しています。

## 2013-05-22
.vimrc のサンプルの設定が一部間違っていたのを修正しました。
if has('vim_starting') 内に call neobundle#rc(expand('~/.vim/bundle')) を記述していたのは誤りです。

# はじめに
「vim なんか使うかよ！」って人に、30分ぐらいで「使っていこうかな」となってもらえたので、その時におすすめした設定やプラグインを書いていこうと思います。

# この記事に書いてあること

- インストールするプラグインの説明
- モダンな環境にするための、最小のセットアップ手順

# ターゲット
この記事は以下のような人を対象にしています。

- 設定ファイルを書き換える時とかは vim 使ってるよ
- ローカルのファイルを編集する時は Sublime Text かなー
- でも ssh 先のファイルを編集したりする時辛いんだよね
- vim 使ってる人ってカッコいいし、僕も使えるようになりたい

# 前提

- vim が割と新しいこと
- 対象の環境に git が導入されていること

# プラグイン
## neobundle
このプラグインが提供する機能は、いわゆるプラグインのパッケージマネージャです。
こちらは導入後、ほんの少し設定が必要なので後述します。
（他のプラグインを導入するのが非常に楽になるので、入れておいてもらいたいです。）

## ctrlp
このプラグインは *必須* といっていいぐらい、導入すると効率が変わります。
提供する主な機能は Sublime Text, 各種 IDE でも存在している
```再帰的にファイルを列挙し、絞り込んで開く``` です。
とりあえず導入して Ctrl+p をノーマルモードで打鍵すれば使い方は分かるでしょう。

## NERDTree
このプラグインが提供する機能も、各種 IDE などに存在している
```ファイルエクスプローラ（左側に表示されるやつ）``` です。
ctrlp を入れておけばいらないんじゃないの？という感じもしますが、
NERDTree を入れると「ファイルの削除/追加/移動」などを直感的に行えます。
とりあえず導入して :NERDTreeToggle で開き、削除したいファイルの上で m を打鍵すれば使い方は分かるでしょう。

## syntastic
このプラグインが提供する機能も、各種 IDE にあるものです。
```保存時にシンタックスチェックを自動で行う``` です。
こちらはとりあえず導入すれば勝手に動きだすので本当に初心者にもおすすめです。

# セットアップ
とりあえず、今回は自分の環境と同じ状態を目指します。
必要な作業は4つあります。どれも簡単な作業です。

## 1. ディレクトリの作成
下記のディレクトリ構造を用意してください。

```:directory
~/
    .vim/
        bundle/
    .vimrc
```

## 2. neobundle.vim の導入
~/.vim/bundle の下に ```git clone git://github.com/Shougo/neobundle.vim``` してください。

## 3. .vimrc の編集
これは一旦、下記の内容を .vimrc の先頭にコピペしてください。

```vim:.vimrc
scriptencoding utf-8
set nocompatible

if has('vim_starting')
  filetype plugin off
  filetype indent off
  execute 'set runtimepath+=' . expand('~/.vim/bundle/neobundle.vim')
endif

call neobundle#begin(expand('~/.vim/bundle'))
NeoBundle 'git://github.com/kien/ctrlp.vim.git'
NeoBundle 'git://github.com/Shougo/neobundle.vim.git'
NeoBundle 'git://github.com/scrooloose/nerdtree.git'
NeoBundle 'git://github.com/scrooloose/syntastic.git'
call neobundle#end()

syntax on
filetype plugin on
filetype indent on

" SSH クライアントの設定によってはマウスが使える（putty だと最初からいける）
set mouse=n
```
※ その他の設定はお好みで！

## 4. neobundle.vim で、プラグインをインストール
上記の設定をすべて終えたら、一度 vim を立ち上げ直してください。
立ち上げ直したら ```:NeoBundleInstall``` を実行します。
実行が終わったら、もう一度 vim を立ち上げ直すと終了です！

# チートシート（2つしかない）
作業ディレクトリにカレントディレクトリを変更し vim を起動してください。
また、キーの表記は vim に合わせて書きます。
※ *&lt;C-p&gt;* と書いてある場合は *Ctrl + p* を表します。 

## ファイルを開きたい
*&lt;C-p&gt;* キーを打鍵し、ファイル名を入力して、*&lt;CR&gt;* を打鍵して開けます。

## ファイル/ディレクトリを操作したい
*:NERDTreeToggle* コマンドを実行後、操作対象の上にカーソルを移動させます。
その後 *m* キーを打鍵すると、メニューが出てくるのでお好みの操作を選択します。

# 終わりに
自分は上記プラグインとは別の、類似の機能をもったプラグインを入れたりしてます。
ただ、高機能な分設定が複雑だったりするので、とっつきやすいものを選びました。
この設定を行って、気に入ったらどんどん他のプラグインも探してみてくださいね！
状況によってsave時に実行するバリデーションを切り替える


`save`メソッドを呼び出してモデルのデータを保存するときに、状況によって実行するバリデーションを切り替えたい場合がある。

そんな時は、`validates`メソッドの`on`オプションが使える。

例えば、

```ruby
validates :username, presence: true, on: :create
```

とすれば、モデルのデータを最初に永続化するときにだけ、バリデーションが実行されるようになるし、

```ruby
validates :username, presence: true, on: :update
```

とすれば、モデルのデータを更新するときにだけ、バリデーションが実行されるようになる。

`on`オプションには任意のシンボルを指定することができて、`save`メソッドの`context`オプションを呼び出し時に指定することで、自由に実行するバリデーションを切り替えることができる。

例えば、

```ruby
validates :username, presence: true, on: :registration
```

としていた場合、

```ruby
@user.save(context: :registration)
```

のような形で`save`メソッドを呼び出した時にだけ、バリデーションが実行される。

`valid?`メソッドや`invalid?`メソッドで保存処理を行う前にデータのバリデーションを実行したい場合は、

```ruby
@user.valid?(:registration)
```

のように、単に引数としてシンボルを渡すだけでよい。

ちなみに、以下のように複数のバリデーション定義に同じ`on`オプションを指定する場合、

```ruby
validates :username, presence: true, on: :registration
validates :email, presence: true, on: :registration
```

`with_options`メソッドを使って複数のバリデーション定義をひとつにまとめることができる。

こんな感じ。

```ruby
with_options on: :registration do |registration|
  registration.validates :username, presence: true
  registration.validates :email, presence: true
end
```

便利。
[ZF1] 独自のValidatorを作成する際の注意

(1). Zend_Filter_Inputと自作のValidatorを併用している
(2). 自作のValidator内で空入力をチェックしている
(3). 2で発生するエラーに独自のメッセージを設定している

Zend_Filter_Inputは独自に空入力をチェック、エラーメッセージを発行するので、(2)の空入力チェックは実質的に無駄な処理になり、(3)のエラーメッセージが無視される。

類似のIssue (http://framework.zend.com/issues/browse/ZF-8446) とかを眺めてみた限り、独自のValidatorにわざわざ空入力のチェックをやらせる必要はない、というのが暗黙の了解っぽい。
[PC-6001] 2msタイマー

大体2ms間隔で割り込みが掛かります。

##登録

```
        di
        ;保存して
        ld      hl,($FA06)
        ld      (work),hl
        ;登録
        ld      hl,handler
        ld      ($FA06),hl
        ei

        ;元に戻す
        di
        ld      hl,(work)
        ld      ($FA06),hl
        ei
```

##ハンドラ
カウントアップするだけ

```
handler:
        push    hl
        ld      hl,(counter)
        inc     hl
        ld      (counter),hl
        pop     hl
        ei
        ret
```
順列をC#で

```Program.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var ps = "0123".Permute(3);
        Console.WriteLine(string.Join(",", ps.Select(x => new string(x.ToArray()))));
    }
}

public static class EnumerableEx
{
    public static IEnumerable<IEnumerable<T>> Dist<T>(this IEnumerable<T> source, T element)
    {
        if (source.Any())
        {
            var head = source.First();
            var tail = source.Skip(1);
            yield return Enumerable.Repeat(element, 1).Concat(source);
            foreach (var source2 in tail.Dist(element))
                yield return Enumerable.Repeat(head, 1).Concat(source2);
        }
        else
        {
            yield return Enumerable.Repeat(element, 1);
        }
    }

    public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> source)
    {
        if (source.Any())
        {
            var head = source.First();
            var tail = source.Skip(1);
            foreach (var source2 in tail.Permute())
                foreach (var source3 in source2.Dist(head))
                    yield return source3;
        }
        else
        {
            yield return Enumerable.Empty<T>();
        }
    }

    public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> source, int c)
    {
        if (c == 0)
        {
            yield return Enumerable.Empty<T>();
        }
        else if (source.Any())
        {
            var head = source.First();
            var tail = source.Skip(1);
            foreach (var source2 in tail.Permute(c))
                yield return source2;
            foreach (var source2 in tail.Permute(c - 1))
                foreach (var source3 in source2.Dist(head))
                    yield return source3;
        }
    }
}
```
laravel3: GoogleAnalyticsの入れ忘れをふせぐ


layoutにいれてばいいのですが、いろいろ事情があってlayoutを使わないページとかあります。
その時問題なのが
・GA設置し忘れる
・GA設置しているページとしてないページがある
  (どっちかに統一するのも今更面倒)

なので とりあえず filterで解決してみました。
ページ内に _setAccount という文字列があったら 何もしない。
なかった場合は GAを埋め込む感じです。
後は、filterの設定で 'after' => 'ga' すればいい。

```routes.php
Route::filter('ga', function( $response = null )
{
// Google Analytics
$ga_tag = <<<EOM
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXX-XXX']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>
EOM;
// 200 OK の時だけ入れる。
if ( $response->status() == 200 ){
  if ( !preg_match('/_setAccount/', $response->content ) ) {
    $response->content = preg_replace('/(<\/head>)/i', $ga_tag . '$1', $response->content );
  }
}
});
```
htmlでblock要素は空要素でも、widthとheightが反映される。inline要素では反映されない。

inline要素は何もしないと、widthやheightを指定しても反映されない。
以下のhtmlとcssでは、divが500px*500pxで表示されるが、spanは表示されない。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="css/app.css" media="all">
</head>
<body>
  <div id="red"></div>
  <span id="blue"></span>
</body>
</html>
```

```css:app.css
#red{
  background-color: red;
  width: 500px;
  height: 500px;
}

#blue{
  background-color: blue;
  width: 500px;
  height: 500px;
}
```

ちなみに、`display:inline-block;`をspanに指定すると、表示される様になる。

```css:app.css
#red{
  background-color: red;
  width: 500px;
  height: 500px;
}

#blue{
  background-color: blue;
  width: 500px;
  height: 500px;
  display:inline-block;
}
```
[PC-6001] ポート$B0

| bit | 内容                | 値                                     |
|----:|---------------------|----------------------------------------|
| 7-4 | reserved            | -                                      |
|   3 | CMTのリレー         | 0:OFF, 1:ON                            |
| 2-1 | VRAMアドレス        | 00:\$C000, 01:\$E000, 10:\$8000, 11:\$A000 |
|   0 | 2msタイマー割り込み | 0:Enable, 1:Disable                    |

#BIOSを利用した変更方法
##仕様
```
ld      b,mask          ;マスク(変更したいbitを1にする)
ld      a,data          ;変更値(マスクが0のbitは影響を受けない)
call    $1B54
```
##変更例
###VRAMアドレスを$8000にする
```
ld      b,%00000110     ;bit2-1
ld      a,%00000100     ;10:$8000
call    $1B54
```

###2msタイマーを止める
```
ld      b,%00000001     ;bit0
ld      a,%00000001     ;1:Disable
call    $1B54
```
UITableViewControllerを継承してUITableViewを作る

デフォルトで生成されるコードだとcellForRowAtIndexPathで例外が発生して動きません。

>Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a >class for the identifier or connect a prototype cell in a storyboard'

下記のように修正すると動きます。。。

```objc:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    
    cell.textLabel.text = @"hogehoge";
    
    return cell;
}
```

[参考]
[UITableViewでのNSInternalInconsistencyException](http://ameblo.jp/otsubo-yuichi/entry-11380695888.html)
[PC-6001] キークリック音のON/OFF

```
save:
        ld      a,($FA2D)
        ld      (work),a

off:
        xor     a
        ld      ($FA2D),a

on:
        ld      a,1
        ld      ($FA2D),a

restore:
        ld      a,(work)
        ld      ($FA2D),a
```
chef-solo,chef-shellより更にミニマムなchef-apply



Chefのクライアントバージョン11から`chef-apply`とコマンドラインツールが追加されていた。

ヘルプを見るとレシピのDSLを渡して実行してくれるものらしい。

> 追記： Chef12.1.0からnode.json的なファイルを渡せるようになったよ。
>     -j JSON_ATTRIBS,                 Load attributes from a JSON file or URL
>        --json-attributes



```bash:Shell-Out
$ chef-apply --help
Usage: chef-apply [RECIPE_FILE] [-e RECIPE_TEXT] [-s]
        --[no-]color                 Use colored output, defaults to enabled
    -e, --execute RECIPE_TEXT        Execute resources supplied in a string
    -j JSON_ATTRIBS,                 Load attributes from a JSON file or URL
        --json-attributes
    -l, --log_level LEVEL            Set the log level (debug, info, warn, error, fatal)
    -s, --stdin                      Execute resources read from STDIN
    -v, --version                    Show chef version
    -W, --why-run                    Enable whyrun mode
    -h, --help                       Show this message
```


レシピDSLを渡してみた。単体のレシピファイルでも使えるので、solo用に`chef-repo`を用意するのが面倒、などの時に使うのかな。

```bash:Shell-Out
$ chef-apply -e 'service "cron" do action :enable end'         
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * service[cron] action enable (up to date)
```

ちなみにレシピ用DSLということで、普通にRubyも実行出来る。

```bash:Shell-Out
$ chef-apply -e '10.times { |x| puts [x.to_s, node.platform ].join("-") }'
0-smartos
1-smartos
2-smartos
3-smartos
4-smartos
5-smartos
6-smartos
7-smartos
8-smartos
9-smartos
```

Ohaiも効いているね。

----

追記：


シェルからattributesを使いたいとき、Ohaiを直接叩くより地味に便利？

```bash:Shell-Out
$ chef-apply -e 'puts  node[:ipaddress]'
210.152.xxx.xxx
```

```bash:Shell-Out
$ chef-apply -e 'node.keys.map {|x| puts x }'      
tags
languages
kernel
os
os_version
hostname
fqdn
domain
virtualization
etc
current_user
chef_packages
network
counters
ipaddress
macaddress
ip6address
ohai_time
keys
platform_version
platform_build
platform
platform_family
dmi
command
zpools
uptime_seconds
uptime
filesystem
recipes
roles
```
Gitlabのバージョンを5.0→5.1に

こんにちは。
欅の若葉が芽吹き初めました。

久しぶりに[Gitlahq](https://github.com/gitlabhq/gitlabhq)を見てみると、バージョンが5.1に上がっていたので、アップグレードしました。


手順は[公式のwiki](https://github.com/gitlabhq/gitlabhq/blob/5-1-stable/doc/update/5.0-to-5.1.md)に載っていたので、問題なく進めまられました。

## 5.0→5.1の主な変更点
・`unicorn`利用を廃止し、`puma`を利用する様に変更
・`Merge request`のキャッシュされた差分が捨てられる (公式にあったが、自分としては意味不)
・`Network`が派手になった
・ダッシュボードにアイコンで選べるフィルター機能がつく
・プロジェクト毎にNotificationsレベルが設定出来るように

## 構築環境
[こっち](http://qiita.com/items/45a9dbed300949ca5813)で構築したGitlabをアップグレードします。

## アップグレード
### gitlabを動かしているunicornを止める
まずはgitlabを止める。

nginxと連携している場合でも、そっちを止める必要は無い。

```
$ sudo service gitlab stop
```

### gitlabを最新に
**gitlab本体**
gitlabのバージョンを5.0→5.1にする。

```
$ sudo su - git

$ cd /home/git/gitlab
$ git fetch
```

設定などをいじっているからなのか、`fetch`後に`Aborting`と出てしまう。
まだまだgitがよく分かっていないので、ググって見ると、一回`reset --hard`するといいよとあったので、やってみる。

```
$ git reset --hard HEAD
$ git fetch
$ git checkout 5-1-stable
```

何か途中色々と出たけど出来た。

設定ファイルの変更点を見てみる。

```
$ cd config
$ diff gitlab.yml gitlab.yml.example
```

こちらの環境では、Redmineとの連携周りに設定が追加されているようだったのでマージした。
`database.yml`については特に変更なしだった。

**gitlab-shell**
同じ要領でgitlab-shellもアップグレードする。

```
$ cd /home/git/gitlab-shell
$ git fetch
```

同様に`Aborting`が出たので、`reset --hard`して`checkout`すると、

```
$ git reset --hard HEAD
$ git fetch
$ git checkout -b v1.3.0 v1.3.0

```

設定ファイルの変更点の確認

```
$ diff config.yml config.yml.example
```

httpのセッテイングと、Redisのセッティング項目が増えているのでマージ。


### pumaの設定
railsのサーバがpumaに変更になったので、`unicorn.rb`はお払い箱で、`puma.rb`を作成。変更点は特にないので、コピーして完了。

```
$ sudo su - git
$ cp config/puma.rb.example config/puma.rb
```

### ライブラリインストールしたり、DB再構築したり
します。

```
$ bundle install --without development test postgres --deployment
$ bundle exec rake db:migrate RAILS_ENV=production
$ bundle exec rake migrate_merge_requests RAILS_ENV=production
```

### デーモン再登録
今のサービスはunicorn起動のものなので、pumaのものに入れ替える。

```
$ cd /etc/init.d

$ sudo rm /etc/init.d/gitlab
$ sudo curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/5-1-stable/init.d/gitlab
$ sudo chmod +x /etc/init.d/gitlab
```

今回は、頭にexportを追加する必要は無かった。

### 起動
起動する。
前のsocketが生きているとエラーが出るので消す。

```
$ cd /home/git/gitlab
$ sudo rm tmp/sockets/gitlab.socket

$ sudo service gitlab start
```

これで問題なく起動。

## 操作感
なんだか、再起動してからアクセス可能になるまでに30秒程度時間がかかるようになった。それ以外は特に問題はないようでした。

networkが綺麗になったのは良かったです。
iOS6.1&Xcode4.6.1でAdMobを表示させる

いろいろハマったのでメモしておきます。

・参考にしたサイト
[Google AdMob Ads iOS（初級）](https://developers.google.com/mobile-ads-sdk/docs/ios/fundamentals?hl=ja)

[iPhoneアプリ】iOS SDK 6.0、Xcode4.5.2の環境でAdmob（AdMob Ads SDK 6.2.1）を表示する方法](
http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90iphone%E3%82%A2%E3%83%97%E3%83%AA%E3%80%91ios-sdk-6-0%E3%80%81xcode4-5-2%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7admob%EF%BC%88admob-ads-sdk-6-2-1%EF%BC%89%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99-2/)

[Objective-C:iPhoneアプリにAdMobを実装](http://narudesign.com/devlog/objc-implement-admob/)

1.SDKをダウンロード。解答してプロジェクトに追加する。追加するのは、**Add-onsフォルダーとReame.txt以外のファイル**

2.**必要なライブラリ**
StoreKit
AudioToolbox
MessageUI
SystemConfiguration
CoreGraphics
AdSupport

3.**PROJECT**と**TARGETS**の**Build Settings**の**Other Linker Flags**に**-ObjC**を追加する
ActiveRecordのattributeとalias_method_chain

dbでは文字列型のカラムをsymbolとして引きたくて、```alias_method_chain```を使ってgetterでラップしたらいいのでは？と思ったら軽くつまづいたのでメモ。意外と日本語情報なかった。

テーブル ```hoges``` には ``` `fuga` text ``` が定義されているとする。

```ruby
class Hoge < ActiveRecord::Base 
  attr_accessible :fuga
end

def fuga_with_to_sym
  fuga_without_to_sym.to_sym
end

alias_method_chain :fuga, :to_sym

```

怒られた。


```
NameError (undefined method `fuga' for class `Hoge'):
```

解決法はここにあった。

http://ruby.11.x6.nabble.com/alias-method-chain-and-ActiveRecord-Attributes-td2960362.html

```ruby
class Hoge < ActiveRecord::Base 
  attr_accessible :fuga
end

def fuga
  super
end

def fuga_with_to_sym
  fuga_without_to_sym.to_sym
end

alias_method_chain :fuga, :to_sym

```

これで ```Hoge#fuga``` はsymbolを返してくれる。```nil```が入らないよう注意しよう。

ちなみに解決法についてるリプライ「```attr_accessor```使えばいいんじゃね？」って言ってる。確かに```NameError```は出なくなるけど、それは```@fuga```へのアクセサなので意味がないのでした。
順列をF#で

リストの要素をすべて使用する関数 (permute) と、n個を取り出して組み合わせる関数 (permuteN) を写経。

もちろん、permute xs = permuteN (List.length xs) xs と書いてもいい。

```fsharp:Permutation.fs

let rec dist e = function
  | []    -> [[e]]
  | x::xs -> (e::x::xs)::[for ys in dist e xs -> x::ys]

let rec permute = function
  | []    -> [[]]
  | x::xs -> List.collect (dist x) (permute xs)

let rec permuteN n xs =
  match (n,xs) with
  | (0,_)      -> [[]]
  | (_,[])     -> []
  | (_,x::xs') -> (permuteN n xs') @ (List.collect (dist x) (permuteN (n-1) xs'))
```