OmniAICreator/Qiita-1.07M huggingface dataset:
PlayFrameworkで、C言語のライブラリを実行したい

簡単なC言語ライブラリ(32bitコンパイル)を64bitJVMで動くPlayFramework内で実行したいが、その方法を悩み中。

## 一番シンプルな Runtime#execを使う

```java
Runtime.getRuntime().exec()
```

は通常の環境であれば有効な策だが、PlayFrameworkでは利用しない方が良い。
このexecを実行する際、forkを行って自分のプロセスと同じだけメモリを確保するらしく、
何百MBも利用しているplayframeworkから実行するのは非現実的。

## JNAを利用する

JNIよりも簡単にNativeコードを実行する方法としてJNAがある。

```java
public interface HogeDLL extends Library {
    HogeDLL INSTANCE =
            (HogeDLL) Native.loadLibrary(
                    "/home/admin/workspace/Hoge.dll",
                    HogeDLL.class);

    int function1(String text, String filename);
}
```

```java
final HogeDLL dll = HogeDLL.INSTANCE;
dll.function1(text, filePath);
```

が、この場合、対象のライブラリとJVMは同じbit数で動いていなければならない。
このため、32bit向けにコンパイルされたライブラリを64bitのJVMで動かすことができない。

軽く調べた限りではJNIも同様の様子。

## 次の手
探し中。
PlayFramework2.0で JNA を利用する

PlayFrameworkには、初めからjna.jarが用意されているが、依存関係を持たないようになっているらしい。

eclipseで、com.sun.jna.Libraryなどを利用すると、
eclipse上ではエラーにならないが、実際にcompileしてみると、

`package com.sun.jna does not exist`

というエラーが出る。

なので、依存関係を明記してフレームワークにjnaの利用を伝える必要がある。

project/Build.scala
に

```java:project/Build.scala
val appDependencies = Seq(
    // Add your project dependencies here,
    "net.java.dev.jna" % "jna" % "3.4.0"
)
```

と追記して、reload後にrunをすればclasspathに追加してくれる。
Git における SSH オプション指定方法あれこれ

このエントリーは[Gitアドベントカレンダー](http://qiita.com/advent-calendar/git)の十日目です。九日目は [KitaitiMakoto](http://qiita.com/users/KitaitiMakoto) さんの「[ファイルの変更を監視するプログラムと仲良くする](http://qiita.com/items/3220ced549799f5e9aed)」でした。ローカルリポジトリとフックスクリプトの組み合わせはあまり見かけませんが、いろいろ応用できそうですね。

## SSH Protocol URL

さて、 Git でリモートリポジトリを扱うとき、もっとも馴染み深いのは以下のような URL でしょう。

```
git@github.com:kyanny/hello.git
```

これは SSH Protocol の URL なので、以下のようにも表現できます。

```
ssh://git@github.com:22/kyanny/hello.git
```

SSH Protocol の URL では、リモートホストのユーザー名、ホスト名、 SSH のポート番号、そしてリポジトリのパスを指定できます。

## ssh_config

その他の SSH オプションを指定したい場合は `~/.ssh/config` を利用します。GitHub へのアクセス時に、 `~/.ssh/id_rsa` や `~/.ssh/id_dsa` ではなく特定の秘密鍵ファイルを使いたい場合は以下のように設定します。

```~/.ssh/config
Host github.com
	IdentityFile ~/.ssh/github_id_rsa
```

※ `~/.ssh/config` を利用する場合は、ファイルのパーミッションを `0600` に変更する必要があります

## 環境変数 GIT_SSH

`~/.ssh/config` は大変便利ですが、 Git とは無関係の SSH 接続時にも参照されるので不都合なこともあります。別の方法として、 `GIT_SSH` 環境変数に SSH のラッパースクリプトを指定することができます。

```git-ssh.sh
#!/bin/sh
exec ssh -oIdentityFile=~/.ssh/github_id_rsa "$@"
```

```
$ GIT_SSH=git-ssh.sh git push git@github.com:kyanny/hello.git master
```

リモートホストに SSH 接続する場合と Git アクセスする場合で、それぞれ別の接続情報を使い分けたいときなどに便利です。必要に応じて `~/.bashrc` や `~/.zshrc` などにエイリアスを定義するのもよいでしょう。


```
alias git="GIT_SSH=git-ssh.sh git"
```

## 参考 URL

* [git-push(1)](http://git-scm.com/docs/git-push#_git_urls) - GIT URLS の項に SSH Protocol の詳細が載っています
* [git(1)](http://git-scm.com/docs/git#_other) - GIT_SSH は other の項で解説されています

----

明日は [tyabe](http://qiita.com/users/tyabe) さんです。
Ubuntu で特定のアプリケーションを全てのワークスペースに表示したい

特定のアプリケーションはどのワークスペースでも常に表示していたいという場合がある。例えば、私はデュアルディスプレイの左側に Firefox を常に表示しており、右のディスプレイにはワークスペースごとに Emacs や Eclipse などを立ちあげて、どの開発環境でもブラウザ検索がすぐに行えるようにしている。

このような設定は CompizConfig Settings Manager(CCSM) で行うことができる。例えば、Firefox を全てのワークスペースで表示したい場合は以下のように設定する。

1. CCSM の 「Window Management > Window Rules」を選択。
2. Matches のタブを選択。
3. Sticky の欄に「class=Firefox」と記述 (右の + ボタンから対話的に設定も可能)。

他にもここで様々な設定が行えるので、いろいろ試してみるといいだろう。
Ubuntu のワークスペースの数を増やす

Ubuntu は初期設定で 2*2 のワークスペースとなっているが、この枚数は CompizConfig Settings Manager(CCSM) で設定可能 (CCSM は apt-get でインストール)。

1. CCSM の 「General > General Options」を選択。
2. Desktop Size のタブを選択。
3. Horizontal/Vertical Virtual Size を変更する。
Ubuntu 上の Eclipse を Windows 仕様に設定する

Windows 上の Eclipse で開発していたプロジェクトを Ubuntu で開くと文字化けする。Windows の文字/改行コードで開発を継続したい場合、Ubuntu 上の Eclipse で以下の設定をすればよい(おそらく Linux 共通)。

1. [Window]-[Preferences] から「General > Workspace」を選択。
2. 「Text file encoding」の Other を選択し "MS932" とする(プルダウンにないため自分で入力)。
3. 「New text file line delimiter」で "Windows" を選択。

なお、これは Windows での開発をそのままの文字/改行コードで継続する設定である。プロジェクト作成時に既に両OSで開発を行うと決まっているなら、Windows 側の Eclipse で文字コードを UTF-8 に設定するほうがいいだろう。
Javascriptのcallback周りを共通化して可読性を向上させる


特別なことではなく、通信部分を共通化する関数を書くといいという話。特に、通信はややこしくなりがちで、共通化するとうれしい部分なので、ここはべた書きしないように気をつけたい。url success callback等のメソッドを持つオブジェクトをそれに適用するとみかけ上のコールバックの記述を減らせ、可読性が向上する。もちろん、通信回数を減らす発想はそれに優先する(http://qiita.com/items/09929c072b342adec2a2)。
下記は最小構成のイメージ。実際は他にもローカルのデータを利用する部分を組み込んだり、UIのrollbackの共通処理を組み込んだり、UIのhtmlをjsonからparseして自動で構築したりしている。繰り返しになるが、通信周りは共通化できる部分が多い。他はさぼってもいいけど、ここは頭をひねる所だと思う。たとえば、ざっくりとした話で言うと、1度だけ使う個別具体的な処理よりも、5回使われる共通処理に力を入れた方が、何らかの生産性が5倍くらいあるイメージが頭にある。そういったプログラミングにおける力を入れるところと入れないところの見極めが、念能力の流っぽくて心踊る。

下記の処理の順番は、
1.event.coffeeで着火
2.common.coffeeで処理するオブジェクトを選択
3.response.coffeeで実際の処理をする

```coffeescript:event.coffee
$(window).load ()->
  common.contact 'feed'
```

```coffeescript:common.coffee
#共通の通信部分
common.contact = (name,p={}) ->
  req = request[name]
  req.setup p.setup 
  $.ajax 
    url: req.url p.url
    type: 'GET'
    dataType: 'json'
    data: p.param
    success:req.success
	error:req.error
  req.teardown p.teardown
```

```coffeescript:request.coffee
request.feed = 
  url:()-> '/feed'
  setup:()->
    #POST系なら、ここに通信に先行してIF側の処理を記述しておけば、
    #通信前にレスポンスできるので、体感速度が向上する(http://qiita.com/items/876fc951866001fb7f83)
    console.log "get feed"
  success:(data)->
    #ここに、通信成功時の処理を記述する
    #もしsetupで既に処理を書いているなら、
    #特に書くものはない
    console.log data
  error:(status)->
    #setupでPOST系の処理を記述している場合、
    #IFのrollback処理をここに記述する
    #rollback処理も簡単に書けるので、そのうち紹介する
    console.log status
  teardown:()->
    #最後の処理
    #何かやることがあればどうぞ
    console.log "teardown" 
```
Execute command with each file

Use xargs with "-n 1" option.

```sh
echo dir/* | xargs -n 1 command
```

Of course. find, ls and other commands are usable instead of echo.

Thanks to [@sechiro](http://twitter.com/#!/sechiro) and Twitter followers!

I use this command in [Reed's makefile](https://github.com/repeatedly/reed/blob/master/posix.mak#L50)
javascript_include_tag :all でall.jsが参照される

どなたか解決策を教えてください。rails 3.2.3です。
public/javascripts/ 以下の全ファイルをロードしたいのですが、
javascript_include_tag :all でall.jsが見つからない、とエラーが出ます。

一通り検索して :cache => true や  enviromentsにて
config.action_controller.perform_caching = true
にする、precompileするなど試したのですが、all.jsが生成されません。

うまくいけば :recursive => true で再帰的にロードしようと思っています。
MacでEmacsを使うときにCommandキーとOptionキーを入れ替える

デフォルトではCommandキーがSuper, OptionキーがMetaに割り当てられているため、親指が痛くてMacでのEmacs操作が苦痛。

なので、TerminalとCocoa EmacsでのみCommandとOptionを入れ替える方法。

## Terminal: KeyRemap4MacBook
キーボードカスタマイズの定番KeyRemap4MacBookに、Terminal使用時のみ左Commandと左Optionを入れ替えるというありがたい設定があるので、これをオンに。
![KeyRemap4MacBook](http://4.bp.blogspot.com/-USokmhlsn6k/T9NTc6STe6I/AAAAAAAAAeM/NmjVe03B9W0/s1600/Screen+Shot+2012-06-09+at+22.34.44.png)

## Cocoa Emacs: 設定ファイルにElispで
KeyRemap4MacBookに「Command_L to Option_L (only in Emacs)」という項目もあるんだけど、これをオンにするとCommand+TabといったOSのショートカットキーが機能しなくなってしまい、ちょっと使いづらい。
なので設定ファイルに以下を書く。

```Lisp:init.el
;; CommandとOptionを入れ替える
(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))
```
ruby-opencv を使ってテンプレートマッチングしてみた


ちなみに opencv をほとんど知らないので間違いや用語の間違い，回りくどいことをやっている等ありましたら教えて下さい．

# 今回の環境

* osx
 * homebrew
* ruby-2.3.0

## opencv を install する

```bash:
% brew install homebrew/science/opencv
```

opencv2.4.12_2 がインストールされます．

## ruby-opencv の install

ruby-opencv 0.0.14 を使います

```
% gem install opencv
```

## 画像を読み込む

```ruby
require "opencv"

image = OpenCV::IplImage.load("image.jpg")
```

簡単に画像が読みこめて，
image.width, image.height とかでサイズが取れます．

## テンプレートマッチングしてみる

```ruby:
template = OpenCV::IplImage.load("template.jpg")

result = image.match_template(template)
```
result は OpenCV::CVMat 形式で，
全てのチャンネルでテンプレートマッチした結果が格納されている模様です．
一瞬でマッチングされるのですが，すごいですね．

なお，match_templateは第2引数で評価関数を指定できます．デフォルトは :sqdiffになっています．

## 最良の結果を取得する

```ruby:
min_score, max_score, min_point, max_point = result.min_max_loc
```

先程はデフォルトの:sqdiff（最小二乗法）で評価したので，最小値の方を利用しないといけません．

:ccorr（なんですかね？） とかを指定したら，最大値の方を利用します．
ややこしいですね．

なお，{min,max}_point は OpenCV::CvPoint 形式です．

## マッチングしたことを目視確認する

マッチングしたところを矩形で囲んでデバッグするのが一般的ですよね．
image に矩形を重畳してみましょう．

```ruby:
from = min_point
to = OpenCV::CvPoint.new(from.x + template.width, from.y + template.height)
image.rectangle!(from, to, :color => OpenCV::CvColor::Black, :thickness => 1)
```

矩形を描画するのは rectangle メソッドです．
from と toは矩形の対角線上の頂点を指定します．
第3引数はオプションですが，矩形の色とか線の太さとかを指定できます

### Window に表示してみよう

矩形を重畳しただけでは，見られないので，表示しましょう
OpenCV は GUI に簡単に表示できます．

```ruby:
window = OpenCV::GUI::Window.new("canvas")
window.show image
```

### ファイルに書き出してみよう

```ruby:
image.save_image("otuput.png")
```

これで基本はばっちりですね！
今見ているページのタイトルとURLをMarkdown形式で取得する(VIChrome)

先日以下の記事を書きましたが、

* [今見ているページのタイトルとURLをMarkdown形式で取得するブックマークレット](http://qiita.com/items/55111e2b8e73b4542b89)

Chrome拡張「[ViChrome](https://github.com/k2nr/ViChrome)」を使っているなら、タイトル＆URLの取得がもっと楽にできます。

* ViChrome: Chromeでブラウジング時にVI風なキーバインドで操作できる拡張

# VIChrome の設定

(VIChromeのインストール方法は省略)

1.Chrome のメニューから、ツール -> 拡張機能 -> ViChrome オプション -> Key Mappingへ移動して、以下の１行を追記 -> `Update Key Mapping` をクリックして保存

![VIChrome設定画面](https://lh5.googleusercontent.com/-E5ZN8WEYJ24/T9M9na-I1AI/AAAAAAAAENo/xtljM5-kxBk/s640/2012-06-09_21h05_11.png)

```vim
nmap yq :Copy '* [%title](%url)'
```

# 使い方

そして、Chromeを再起動したら、ページを見ている時に`yq`と連続してタイプすれば、
(画面に何のリアクションも出てこないので、わかりにくいですが)
今見ているページのタイトルとURLをMarkdown形式で取得することができます。

```md
* [k2nr/ViChrome · GitHub](https://github.com/k2nr/ViChrome)
```

こんな感じ。
とあるサイトから画像をダウンロードする

```ruby:get_from_naver.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'digest/sha1'
require 'nokogiri'
require 'parallel'
require 'pathname'
require 'open-uri'

def get_total_page(url)
  links = Array.new
  doc = Nokogiri::HTML(open(url))
  doc.css('.MdPagination03 a').each do |link|
    links << link.content.to_i
  end                    
  return links.max
end
 
def get_individual_pages(url)
  individual_pages = Array.new
  doc = Nokogiri::HTML(open(url))
  doc.css('.mdMTMWidget01ItemImg01 a').each do |link|
    individual_pages << link['href']
  end
  return individual_pages
end

dir = Pathname.new('')
dir.mkdir unless dir.exist?

url = ARGV[0]

for page in 1..get_total_page(url) do
  Parallel.each(get_individual_pages("#{url}?page=#{page}"), :in_threads => 10) do |individual_page|
    doc = Nokogiri::HTML(open(individual_page))    
    image = doc.css('.mdEndView01Img01 a img').first.attribute('src').value
    filename = Digest::SHA1.hexdigest(image) + '.jpg'
    filepath = dir + filename                      
    next if filepath.file?                         
    puts "Download... #{image}"                    
    res = open(image) rescue next                  
    if res.content_type =~ /^image/
      open(filepath, 'w').print res.read
    end
  end
end
```
Google Chrome で ページのHTML要素に対応するソース箇所を調べる

ページ上の要素を右クリックして、要素を検証を実行すれば、Chrome Developer Toolsが開き、要素に対応するHTMLソースコードをハイライト表示してくれます。

[Watir で操作](http://qiita.com/items/389d75daa97e9d2275cc)したい要素の class, id, name 等調べるのに役立ちました！
実はまともに使ったの今日が初めて・・・

![Chrome Developer Tools](https://lh5.googleusercontent.com/-9JhlVDQDImY/T9MMpS1Iv5I/AAAAAAAAENc/zVDHfyGsmAc/s640/2012-06-09_17h39_15.png)

* Chrome Developer Tools は `F12`キーからも呼び出せるようです。

# 参考

* [Developer Tools for HTML5 Programming](http://wickedlysmart.com/hfhtml5/devtools.html)
* [Chrome Developer Tools の使い方 | TM Life](http://tmlife.net/web/chrome-developer-tools-how-to-use.html)
Watir でIEやGoogle Chromeを自動操縦する

Watir を使えば、IEやGoogle Chromeを自動操縦することができます。
Webサイトの自動操縦やテストの自動化など、色々と便利に使えそう。

# Watirのインストール

下記記事の時と同じく、 `msys.bat` でコマンドプロンプトを起動した状態でコマンドを入力します。

* [Windowsに ソースコード検索エンジン「Milkode」をインストールする #Windows #milkode #Ruby - Qiita](http://qiita.com/items/5eae5c581dc37b6efbe4)

```bat:
gem update --system
gem install watir
gem install watir-webdriver
```

# Watirを使って、Picasaウェブアルバムに自動ログイン

* 一度Picasaウェブからログアウトしてから試してください
* mail_address と password はご自分のものに置き換えてください

```rb:sample_autologin_picasaweb.rb
require "rubygems"
require "watir"			# for IE
#require "watir-webdriver"	# for Firefox/Chrome

# your gmail account
mail_address = "xxxxxxxx@gmail.com"
password = "password"

browser = Watir::IE.new
browser.goto "https://picasaweb.google.com/"

element = browser.text_field(:name, "Email")
element.flash
element.value = mail_address

element = browser.text_field(:name, "Passwd")
element.flash
element.value = password

element = browser.button(:name, "signIn")
element.flash
element.click
```

IEが起動して、メールアドレス欄、パスワード欄、ログインボタンが点滅しつつログイン後の画面に遷移すると思います。

![イメージ](https://lh6.googleusercontent.com/-FsGtVZldaco/T9MH_6ZPelI/AAAAAAAAENQ/p_1NsMIvx9o/s640/2012-06-09_17h22_29.png)

# Google Chrome を操作したい場合

1. [chromedriver](http://code.google.com/p/chromedriver/downloads/list) をダウンロード＆解凍して、PATHの通っているところに置く
2. あとは先程のコードを、以下のように一部だけ変える。

```rb:sample_autologin_picasaweb.rb
#require "watir"			# for IE
require "watir-webdriver"	# for Firefox/Chrome

#browser = Watir::IE.new
browser = Watir::Browser.new :chrome
```

# 制限

IEは問題無いとして、Chrome とかだと既存のインスタンスにAttach できないみたい。

```rb:
# まだ試してないけど代わりにこんな感じでいけるらしい
browser.window(:title => 'annoying popup').use do
  browser.button(:id => 'close').click
end 
```

# 誰か教えて下さい

以下のような要素を click するにはどう書けばいいのでしょうか？

```
<div class="goog-inline-block goog-toolbar-button" id=":f" roll="button">
```

下記のいずれもエラーにならなかったけど、クリックもされなかったのです。なぜ？

```rb
browser.div(:class,"goog-inline-block goog-toolbar-button").click
browser.div(:id => ":f").click
```

# 参考

* [いろいろなブラウザ用のWatir:お題目うぉっち](http://blog.livedoor.jp/maru_tak/archives/50654466.html)
* [5分でわかるWatir - にのせき日記](http://d.hatena.ne.jp/ninoseki/20111003/1317650033)
* [Watir API Reference](http://wtr.rubyforge.org/rdoc/1.6.5/)
* [Watir.com | Web Application Testing in Ruby](http://watir.com/)
* [Examples | Watir.com](http://watir.com/examples/)
* [Watir : Cheat Sheet](http://pettichord.com/watirtutorial/docs/watir_cheat_sheet/WTR/Cheat%20Sheet.html)
* [Watir : Methods supported by Element](http://pettichord.com/watirtutorial/docs/watir_cheat_sheet/WTR/Methods%20supported%20by%20Element.html)
ファイルの変更を監視するプログラムと仲良くする

このエントリーは[Gitアドベントカレンダー][adcal]の九日目です。

昨日は[aereal][aereal]さんの「[内容が空のファイルをインデックスに追加する][prev]」でした。`git-add`の`-N`オプション、知らなかったんですが使えそう。

新規ファイルに暫く書き込んだ後で「あ、`git-add`しなくちゃ」って思うことが多いんです。そういう時に取り敢えず登録だけして、後で差分を見ながら他のファイルとまとめて整理してコミットできるようになる、というのは地味（失礼！）だけど強い。

[adcal]:  http://qiita.com/advent-calendar/git
[aereal]: http://qiita.com/users/aereal
[prev]:   http://qiita.com/items/8bbc16f19b4d1dea9870

さて、今日の話題は「ファイル変更を監視するプログラム」です。

例えばSCSSを使っている時、開発中は`scss --watch`や`compass watch`でSCSSファイルを監視しながら作業していると思います（Rails以外はね）。ファイルを変更したらそれを検知して、コンパイルして、CSSを上書きしてくれる。

ところがGitでは、`git-checkout`でブランチを切り替えると、一瞬でファイルの内容が変わってしまいます。それでも`scss`はけなげに頑張ってSCSSを再コンパイルしてくれるのですがたまに混乱しちゃいます（キャッシュファイルと整合性がとれなくなる）。

なので、ブランチ切り替えのタイミングで`scss`を再起動してしまいましょう。

もしかして？ [`Sass::Plugin::Rack`][rack]
--------------------------------------

SCSSファイルをCSSにして返すRackサーバーを立てて、CSSへのアクセスをリバースプロキシーすればいいのでは、というアイディアもありますが、それではアドベントカレンダーの当番をこなせげふんげふん、千行二千行オーダーのファイルではパフォーマンスに不安があるので見送りました。

[rack]: http://sass-lang.com/docs/yardoc/Sass/Plugin/Rack.html

方針
----

1. `scss --watch`をデーモンとして起動
2. `git-checkout`時にデーモンを再起動（post-checkoutフックを使う）

という方針で行こうと思います。

※ デーモンは`sudo`を *付けずに* 起動します。`git-checkout`の度にパスワード入れるとかめんどいんで。

scss --watchをデーモンとして起動
--------------------------------

まず自分の`scss`コマンドを作ります。

```ruby:scss
require 'sass'
require 'sass/exec'
dir = File.expand_path('..', __FILE__)

argv = ['--watch', "#{dir}/sass:#{dir}/css"]
opts = Sass::Exec::Sass.new(argv)
opts.parse!
```

（Gitと関係無いので省略しますが、自分で`scss`コマンドを作っておくと、コンパイルが失敗した時の通知などが設定できて便利です。もちろんCompassを使ってもいいです）

次にこれをデーモン化するスクリプトを作ります。RubyGemの[Daemons][daemons]を使うので、無ければ

    $ gem install daemons

でインストールしておきます。

```ruby:scssd
#!/usr/local/bin/ruby
require 'daemons'
    
prog = File.expand_path('../scss', __FILE__)
Daemons.run prog
```

実行可能にします。

    $ chmod a+x scssd

デーモンを起動しておきます。

    $ ./scssd start

[daemons]: http://daemons.rubyforge.org/

git-checkout時にデーモンを再起動
--------------------------------

.git/hooks/post-checkoutファイルを作ります。

```bash:post-checkout
$(cd $(dirname $0)/../..;pwd)/scssd restart
```

実行可能にします。

    $ chmod a+x .git/hooks/post-checkout

これで、`git-checkout`した時に、`scss`を再起動するようになります。`git-merge`、`git-pull`などについても同様に設定しておくといいでしょう。

次回予告
--------

今日は、フックスクリプトの実用例（に見せ掛けたSCSS運用方法？）でした。
明日は[Git Advent Calendar / June 当番カレンダー][gitcal]を作った[kyanny][kyanny]さんの担当です。

[gitcal]: http://qiitagitcalendartoban-kyanny.sqale.jp/
[kyanny]: http://qiita.com/users/kyanny
git-svn の妙な Warning

git-svn を使っているとき、以下のような Warning が出た。

```
W: Refspec glob conflict
```

このとき .git/config ファイルを見てみると、以下のようになっていた。

```ini
[svn-remote "svn"]
	branches = branches/*:refs/remotes/*
	tags = tags/*:refs/remotes/tags/*
	branches = branches/*:refs/remotes/*
	tags = tags/*:refs/remotes/tags/*
```

なぜか同じ内容が2回書かれている。重複行を削除すると、Warning がなくなった。たぶん、問題ないだろう。
開発環境用Procfile

- Herokuでwebrickじゃなくてthinを使いたい
- 開発環境ではforemanでguardを起動したい。.envで必要な環境変数をロードしたいので。
- でもHerokuではguardはいらない。

という理由から、production環境用Procfileとdevelopment環境用Procfileを分けたいと思ったので、以下のようにしてみた。

```ruby:Procfile
web: rails s thin -p $PORT
```

```ruby:Procfile.development
web: rails s thin
guard: guard
```

```ruby:.foreman
procfile: Procfile.development
```

```sh:.gitignore
.foreman
```

- .foremanはforemanコマンドのデフォルトオプションを指定できる。
- procfileオプションで実行するProcfileを指定できる。
- .foremanファイルを.gitignoreに追加してHerokuで実行しないようにする。
macメニューバーのspotlightアイコンを非表示に

terminalから以下のコマンドを実行し、macをログオフあるいは再起動。

```bash
sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search
```

再度表示する場合は

```bash
sudo chmod 755 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search
```

アイコンを非表示にしてもfinder等から検索出来ます。
Grant Permissionで権限付与できるパスを制御する

詳細：http://yuki312.blogspot.jp/2012/06/androidgrant-permission_09.html

```xml:AndroidManifest.xml
<provider
    android:authorities="yuki.test.provider"
    android:name="yuki.test.MyContentProvider"
    android:readPermission="yuki.test.signature"
    android:grantUriPermissions="false" >
    <grant-uri-permission
        android:path="/test/hoge/foo/lv5" />
</provider>
```
passportでfacebookにOAuthログインする際にdevice=touchを有効にする（応急処置）

以下のような感じでどうぞ。
UA見て切り替えるとかしたい場合にはまた別途考えるのでしょうね。

```javascript

var fbs = new FacebookStrategy(
    {...},
    function (accessToken, refreshToken, profile, done) {
       //...
    });

fbs.authorizationParams = function(){
    return {display:'touch'};
};

```
内容が空のファイルをインデックスに追加する

変更が追跡できる、つまり差分が見れる、ということは価値です。

空のファイルが作られてもUnstagedである限り差分は見れません。
Gitはコミットしていなくともインデックスワークツリーといった版管理のステージがいくつかあるので、それらのうちのどれかに含まれていれば回復、修正は格段に容易になります。
ファイルの内容をインデックスに登録せずファイルが追加されたということだけを記録したいこともあります。


git-addには-Nオプションがあります。このオプションをつけるとファイルの存在のみをインデックス登録できます。
言葉を換えるとファイルの中身をインデックスに登録しません。

ファイルを自動生成するジェネレータと相性がよいので覚えておいて損はないとおもいます。
curlを捨ててhttpieを使おう

- [jkbr/httpie : Github](https://github.com/jkbr/httpie) : HTTPie is a CLI, cURL-like tool for humans

curl（<del>see urlと発音するらしい</del>[本家のFAQ](http://curl.haxx.se/docs/faq.html#What_is_cURL)によると開発陣は *kurl* と発音してるらしいです）はプログラムから使うには便利だけど、オプションがわかりにくい。

httpieはより直感的なcurl代替コマンド。よほどcurlに思い入れがない限りhttpieをおすすめする。

##インストール

```sh
easy_install httpie
# OR
pip install -U httpie
```

##使用例

![httpie](https://github.com/jkbr/httpie/raw/master/httpie.png)

奥がcurlで、手前がhttpieを使った場合。見れば分かるようにhttpieは自動で色付けをしてくれるし、コマンドもかなり直感的だ。内部的にはPythonのrequestsというモジュールを使っている。Python組み込みのHTTPクライアントに辟易している人はそちらも調べてみるととても幸せになれる。

- [kennethreitz/requests : Github](https://github.com/kennethreitz/requests) : Python HTTP Requests for Humans™
今見ているページのタイトルとURLをMarkdown形式で取得するブックマークレット

Qiitaに投稿する際に、参考にしているWebページのタイトルとURLをいちいちコピーしてMarkdown形式に書き換えるの面倒くさい！
・・・というわけで、単純なブックマークレットを作ってみました。
(ChromeとIE9で動作確認済み)

```js:copy_title_and_url.js
javascript:(function(){prompt('今見ているページのタイトルとURL：コピーしてQiitaに貼り付けてください','* [' + document.title + ']('+document.URL+')')})();
```

# 使い方

![](https://lh6.googleusercontent.com/-RA9s1wBGHDo/T9ICPXZmKeI/AAAAAAAAEM4/KaGaE48o1c0/s800/2012-06-08_22h45_53.png)

1. インターネットブラウザ(例：Google Chrome)で適当なページをブックマークする
2. そのブックマークを編集して、ブックマークのURLに上記のjavascriptをすべて貼り付けて登録する
3. あとはページを閲覧している時に、このブックマークレットを呼び出す。
4. プロンプトが開いて、Qiita に投稿できる形のMarkdown形式でコピーできます。

![](https://lh6.googleusercontent.com/-G-BHDZoVIV8/T9ICPe4CmDI/AAAAAAAAEM8/s7Ln4gFWt6M/s800/2012-06-08_22h46_04.png)

こんな感じ。

	* [Installation | Watir.com](http://watir.com/installation/)
exprは計算に成功してもリターンコードが0とは限らない

シェルスクリプトで整数計算を行うコマンド"expr"を使うことがあるが、
exprは計算の結果が0の場合、"0=偽"と判定するため、リターンコードとして0以外を返す。
このため"set -e"とexprでのカウントダウンを併用していると問題になる場合がある。
例えば、以下のようなケース

```ShellScript:loop.sh
#!/bin/sh
set -e
i=5
while [ $i -ge 1 ]
do
  echo now $i
  i=`expr $i - 1`
  echo result $i
done
```

最後の"result 0"が出力される前に、エラーが発生したとして中断される。
RailsCastsの動画をタグごとにダウンロードしてくるスクリプト


個人的に使ってたやつをちょっと整えて公開。なんでタグごとかっちゅうと、

* 同じテーマの動画を古い順に続けてみることでRailsの歴史的な流れがつかめたりする
* 複数のtagがついてる動画は何度も遭遇するので復習になる

とか。Ryanさんのトークも、最初はこなれてないけどだんだん本職のナレーターみたいになってくる、そのへんの成長も見守ることが出来ます。

大仰だけどMechanize使った。保存場所(`@save_dir`)はお好きなところへ。

~~~~~~ruby:railscasts.rb
# -*- coding: utf-8 -*-
require 'rubygems'
require 'mechanize'
# require 'pry'

@save_dir = "~/Dropbox/Movie/"
runtag = ARGV.shift.to_i

a = Mechanize.new {|agent| agent.user_agent_alias = "Mac Safari" }
a.get("http://railscasts.com/?tag_id=#{runtag}") {|page| @total_page = page.at(".next_page").previous_element.text.to_i}

for i in 1..@total_page do
  a.get("http://railscasts.com/?page=#{i}&tag_id=#{runtag}") do |page|
    page.links.each do |link|
      if (path = link.attributes.attributes["href"].value) =~ /(episodes).*?autoplay=true$/
        puts path
        a.get("http://railscasts.com"+path) do |mvpage|
          mvpage.links.each do |link|
            if (mp4 = link.attributes.attributes["href"].value) =~ /\.mp4$/
              puts filename =  runtag.to_s + "_" + mp4.split("/")[-1]
              `wget #{mp4} -o mv.log -O #{@save_dir}#{filename}` # if mp4.scan(/\d+/)[0].to_i < 158
            end
          end
        end
      end
    end
  end
end
~~~~~~


使い方は `$ ruby railscasts.rb 15` こんな感じ。引数に落としたいタグ番号を与える。タグ番号は

http://railscasts.com/

↑の右にある"Categories"から選んでます。（もっと簡単な方法ないかね
ブラウザからURLスキームの動作確認をするときの注意点

アプリでURLスキームの動作を検証する際に、ブラウザのアドレス欄に直接URLを打ち込んでも、googleの検索ページに飛ばされるケースがある。

例えば「mailto:〜」はアドレス欄に直打ちしてもメールクライアントが起動されない。「mailto:〜」の検索結果が表示される。ただし、「http://〜」から始まるスキームの検出は正しくできる模様（たとえばtwitter[http://www.twitter.com/yamacraft]はtwitterクライアントとブラウザの起動選択ダイアログが表示される）。

なのでアプリにURLスキームを組み込んだ場合のテストは、ブラウザのアドレス欄に直打ちせず、ちゃんとwebページのリンクからテストしましょう。（ただしアドレス欄直打ちの挙動は各ブラウザアプリ任せになるので、ちゃんと動くものもあるかもしれません）

追記：リンクしたはずのURLが短縮アドレスになっていた場合も、ただしくURLスキームが検出されない場合があります。
cronを2分,7分,12分...みたいな半端なタイミングで動かす

半端な時間から5分間隔で実行。。とかやりたいけど、*/5とかだと切りのいい時間でしか動かない。
そういう時はcrontabにこう書く。

```
02-59/5 * * * * command
```

これは、「毎時02分から59分までの間の時間を、5分おきに実行」という意図になって、
02分から始まって 07,12,.... という時間に動く。

もちろん、31-59/3 とかやれば毎時31分から始まって34,37。。。58分、と動きます。
Railsで画像とテキストにリンクを貼る

<%= link_to "リンク先情報" do %>
  <span>文字列</span> 
  <%= image_tag("画像パス", :alt => 'ほげほげ' %>
<% end %>

情報元　http://d.hatena.ne.jp/akitsukada/20110530/1307027950
Chatter REST APIでコメントをpostする方法


どなたかご存知の方いらっしゃいましたら解決策をご教授ください。

##できたこと

###コメントのget
GETのリクエストをproxy.phpを間に噛ませて下記のrest apiのurlにforcetk.jsのajaxメソッドで送り、コメントを取得

https://na12.salesforce.com/services/data/v24.0/chatter/feed-items/FEED-ITEM-ID/comments

###likeのpost
上記同様にPOSTで下記のURLにリクエストを送り、likeをpost
https://na12.salesforce.com/services/data/v24.0/chatter/feed-items/FEED-ITEM-ID/likes

##できないこと
上記のコメントをgetしたURLにPOSTで{text:"test"}と{body:"test"}と{text:"test,body:"body"}をパラメータとして送ってたところ、下記のエラーが出て、失敗する

Can not deserialize instance of core.chatter.connect.resources.input.CommentInputRepresentation out of START_ARRAY token at [line:1, column:1]","errorCode":"JSON_PARSER_ERROR"

##参考にした資料

下記の73〜75,173〜174ページ
http://www.salesforce.com/us/developer/docs/chatterapipre/salesforce_chatter_rest_api.pdf

下記の右上のAdd Commentsの欄
http://media.developerforce.com/cheatsheets/SF_chatter_API_2Pg_HR.pdf
jQuery.ajax() のダミーデータを素早く作る


メリット

- HTMLとJSだけで完結
- マークアップの人がローカルファイルで作業できる
- 本番コードの修正をしなくて良い (たぶん)

デメリット

- ajax の beforeSend　が設定してあると動かない


```Javascript:dummydata.js
$(function () {	
	// 返したいダミーデータ	var result = {"result": "some dummy data"};
	
	
	// ajaxメソッドパラメータのデフォルト値	$.ajaxSetup({		beforeSend: function(xhr) {
			
			// GET のパラメータを考慮して、前方一致			if( this.url.match(/^\/target_url.*/) ) {
				
				// Ajax 通信をキャンセル				xhr.abort();				
				// 結果を出力
				this.success(result, "success", xhr);			}		}	});});
```

beforeSend を使わない方法を模索中。。。
HOMEボタンで自Activityを終了

Alarmを作成して思ったこと
鳴動画面でHOMEを押してもActivityは残ったままで鳴り続けてしまう

##解決法
	@Override
	public void onStop() {
		super.onStop();	
		stop_process(); '鳴動STOP等の処理
		finish();
	}


HOMEボタンではonDestroyされない為、onStopで解消した
マーケットに公開されているAlarmはHOMEを押しても鳴り続けるのが多かった
Rubyで、日本語を含めたランダムな文字列を生成

```ruby:rand_str.rb
# ランダム文字列を取得
# 日本語は平仮名と常用漢字
def self.rand_str(length = 20)
  a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a + "あいうえおかきくけこさしすせそたちつてとはひふへほはひふへほやゆよつわあいうえおかきくけこさしすせそたちつてとはひふへほはひふへほやゆよつわ亜哀挨愛曖悪握圧扱宛嵐安案暗以衣位囲医依委威為畏胃尉異移萎偉椅彙意違維慰遺緯域育一壱逸茨芋引印因咽姻員院淫陰飲隠韻右宇羽雨唄鬱畝浦運雲永泳英映栄営詠影鋭衛易疫益液駅悦越謁閲円延沿炎宴怨媛援園煙猿遠鉛塩演縁艶汚王凹央応往押旺欧殴桜翁奥横岡屋億憶臆虞乙俺卸音恩温穏下化火加可仮何花佳価果河苛科架夏家荷華菓貨渦過嫁暇禍靴寡歌箇稼課蚊牙瓦我画芽賀雅餓介回灰会快戒改怪拐悔海界皆械絵開階塊楷解潰壊懐諧貝外劾害崖涯街慨蓋該概骸垣柿各角拡革格核殻郭覚較隔閣確獲嚇穫学岳楽額顎掛潟括活喝渇割葛滑褐轄且株釜鎌刈干刊甘汗缶完肝官冠巻看陥乾勘患貫寒喚堪換敢棺款間閑勧寛幹感漢慣管関歓監緩憾還館環簡観韓艦鑑丸含岸岩玩眼頑顔願企伎危机気岐希忌汽奇祈季紀軌既記起飢鬼帰基寄規亀喜幾揮期棋貴棄毀旗器畿輝機騎技宜偽欺義疑儀戯擬犠議菊吉喫詰却客脚逆虐九久及弓丘旧休吸朽臼求究泣急級糾宮救球給嗅窮牛去巨居拒拠挙虚許距魚御漁凶共叫狂京享供協況峡挟狭恐恭胸脅強教郷境橋矯鏡競響驚仰暁業凝曲局極玉巾斤均近金菌勤琴筋僅禁緊錦謹襟吟銀区句苦駆具惧愚空偶遇隅串屈掘窟熊繰君訓勲薫軍郡群兄刑形系径茎係型契計恵啓掲渓経蛍敬景軽傾携継詣慶憬稽憩警鶏芸迎鯨隙劇撃激桁欠穴血決結傑潔月犬件見券肩建研県倹兼剣拳軒健険圏堅検嫌献絹遣権憲賢謙鍵繭顕験懸元幻玄言弦限原現舷減源厳己戸古呼固孤弧股虎故枯個庫湖雇誇鼓錮顧五互午呉後娯悟碁語誤護口工公勾孔功巧広甲交光向后好江考行坑孝抗攻更効幸拘肯侯厚恒洪皇紅荒郊香候校耕航貢降高康控梗黄喉慌港硬絞項溝鉱構綱酵稿興衡鋼講購乞号合拷剛傲豪克告谷刻国黒穀酷獄骨駒込頃今困昆恨根婚混痕紺魂墾懇左佐沙査砂唆差詐鎖座挫才再災妻采砕宰栽彩採済祭斎細菜最裁債催塞歳載際埼在材剤財罪崎作削昨柵索策酢搾錯咲冊札刷刹拶殺察撮擦雑皿三山参桟蚕惨産傘散算酸賛残斬暫士子支止氏仕史司四市矢旨死糸至伺志私使刺始姉枝祉肢姿思指施師恣紙脂視紫詞歯嗣試詩資飼誌雌摯賜諮示字寺次耳自似児事侍治持時滋慈辞磁餌璽鹿式識軸七叱失室疾執湿嫉漆質実芝写社車舎者射捨赦斜煮遮謝邪蛇尺借酌釈爵若弱寂手主守朱取狩首殊珠酒腫種趣寿受呪授需儒樹収囚州舟秀周宗拾秋臭修袖終羞習週就衆集愁酬醜蹴襲十汁充住柔重従渋銃獣縦叔祝宿淑粛縮塾熟出述術俊春瞬旬巡盾准殉純循順準潤遵処初所書庶暑署緒諸女如助序叙徐除小升少召匠床抄肖尚招承昇松沼昭宵将消症祥称笑唱商渉章紹訟勝掌晶焼焦硝粧詔証象傷奨照詳彰障憧衝賞償礁鐘上丈冗条状乗城浄剰常情場畳蒸縄壌嬢錠譲醸色拭食植殖飾触嘱織職辱尻心申伸臣芯身辛侵信津神唇娠振浸真針深紳進森診寝慎新審震薪親人刃仁尽迅甚陣尋腎須図水吹垂炊帥粋衰推酔遂睡穂随髄枢崇数据杉裾寸瀬是井世正生成西声制姓征性青斉政星牲省凄逝清盛婿晴勢聖誠精製誓静請整醒税夕斥石赤昔析席脊隻惜戚責跡積績籍切折拙窃接設雪摂節説舌絶千川仙占先宣専泉浅洗染扇栓旋船戦煎羨腺詮践箋銭潜線遷選薦繊鮮全前善然禅漸膳繕狙阻祖租素措粗組疎訴塑遡礎双壮早争走奏相荘草送倉捜挿桑巣掃曹曽爽窓創喪痩葬装僧想層総遭槽踪操燥霜騒藻造像増憎蔵贈臓即束足促則息捉速側測俗族属賊続卒率存村孫尊損遜他多汰打妥唾堕惰駄太対体耐待怠胎退帯泰堆袋逮替貸隊滞態戴大代台第題滝宅択沢卓拓託濯諾濁但達脱奪棚誰丹旦担単炭胆探淡短嘆端綻誕鍛団男段断弾暖談壇地池知値恥致遅痴稚置緻竹畜逐蓄築秩窒茶着嫡中仲虫沖宙忠抽注昼柱衷酎鋳駐著貯丁弔庁兆町長挑帳張彫眺釣頂鳥朝貼超腸跳徴嘲潮澄調聴懲直勅捗沈珍朕陳賃鎮追椎墜通痛塚漬坪爪鶴低呈廷弟定底抵邸亭貞帝訂庭逓停偵堤提程艇締諦泥的笛摘滴適敵溺迭哲鉄徹撤天典店点展添転塡田伝殿電斗吐妬徒途都渡塗賭土奴努度怒刀冬灯当投豆東到逃倒凍唐島桃討透党悼盗陶塔搭棟湯痘登答等筒統稲踏糖頭謄藤闘騰同洞胴動堂童道働銅導瞳峠匿特得督徳篤毒独読栃凸突届屯豚頓貪鈍曇丼那奈内梨謎鍋南軟難二尼弐匂肉虹日入乳尿任妊忍認寧熱年念捻粘燃悩納能脳農濃把波派破覇馬婆罵拝杯背肺俳配排敗廃輩売倍梅培陪媒買賠白伯拍泊迫剝舶博薄麦漠縛爆箱箸畑肌八鉢発髪伐抜罰閥反半氾犯帆汎伴判坂阪板版班畔般販斑飯搬煩頒範繁藩晩番蛮盤比皮妃否批彼披肥非卑飛疲秘被悲扉費碑罷避尾眉美備微鼻膝肘匹必泌筆姫百氷表俵票評漂標苗秒病描猫品浜貧賓頻敏瓶不夫父付布扶府怖阜附訃負赴浮婦符富普腐敷膚賦譜侮武部舞封風伏服副幅復福腹複覆払沸仏物粉紛雰噴墳憤奮分文聞丙平兵併並柄陛閉塀幣弊蔽餅米壁璧癖別蔑片辺返変偏遍編弁便勉歩保哺捕補舗母募墓慕暮簿方包芳邦奉宝抱放法泡胞俸倣峰砲崩訪報蜂豊飽褒縫亡乏忙坊妨忘防房肪某冒剖紡望傍帽棒貿貌暴膨謀頰北木朴牧睦僕墨撲没勃堀本奔翻凡盆麻摩磨魔毎妹枚昧埋幕膜枕又末抹万満慢漫未味魅岬密蜜脈妙民眠矛務無夢霧娘名命明迷冥盟銘鳴滅免面綿麺茂模毛妄盲耗猛網目黙門紋問冶夜野弥厄役約訳薬躍闇由油喩愉諭輸癒唯友有勇幽悠郵湧猶裕遊雄誘憂融優与予余誉預幼用羊妖洋要容庸揚揺葉陽溶腰様瘍踊窯養擁謡曜抑沃浴欲翌翼拉裸羅来雷頼絡落酪辣乱卵覧濫藍欄吏利里理痢裏履璃離陸立律慄略柳流留竜粒隆硫侶旅虜慮了両良料涼猟陵量僚領寮療瞭糧力緑林厘倫輪隣臨瑠涙累塁類令礼冷励戻例鈴零霊隷齢麗暦歴列劣烈裂恋連廉練錬呂炉賂路露老労弄郎朗浪廊楼漏籠六録麓論和話賄脇惑枠湾腕".split(//)
  return Array.new(length){a[rand(a.size)]}.join
end
```

テスト用に、ランダムなテキストを生成・取得するのは良くやりますが、ネットに転がってるサンプルは、ほとんどがアルファベットと数字のみ。
日本語が含まれていても、せいぜいが平仮名、片仮名くらいで、漢字が含まれたサンプルが意外と無かったので作ってみました。

もちろん、漢字を含む日本語を配列にする方法も、常用漢字の一覧も探せば簡単に見つかりますが、多少の需要はあるかなと。
ちなみに、常用漢字の一覧はネットで公開されてる時、縦のテーブルになっていることが多くて、コピペで一括で取ってこれるサイトを探すのがちょっと面倒でした（数分程度のことですが）。

試してはいませんが、UTF-8なら中国漢字でもハングルでもキリル文字でも、日本語の部分と置き換えてやれば多分いけるんじゃないかと思います。
AIR for iOSでCameraを使う

CameraUIが使えれば良いんですが、Stage表示ツリー上でCameraからの映像を表示させたいとき、いろいろポイントがあったのでまとめておきます。
基本的には普通にFlashでカメラの映像を表示するように、Camera.getCamera()で取得したCameraオブジェクトをvideo.attachCameraすればいいのですが、iOS独自で詰まったポイントをいくつか。

まず、カメラの画像が何故か横に回転した状態で取得されるので、videoを90度回転させるようにしています。
カメラをsetModeでstageサイズと一緒にしても、ちょっとずれるのでvideoオブジェクトとさらにそれを内包するコンテナー用Spriteオブジェクトさんをちょっと拡大縮小表示してもらっています。
カメラの縦横比率はこちらのページを参考にさせて頂きました。
[カメラのサイズの比率でゆがまないように調整をする。](http://blog.livedoor.jp/s26_fla/archives/4274323.html "カメラのサイズの比率でゆがまないように調整をする。")
こちらの記事がなければ自分だけでは縦横比を保持する考えは生まれませんでした。ありがとうございます。

今回スニペット化するにあたり個人的にはこういう機種ごとに差異が生まれる可能性を場当たり的に対処法をストックしていくのは嫌いなんですが、かといってこんなところで時間をとられるのも嫌なので、また同じ現象で悩んだ人が居たときに過去にこういう対処法をしたというのが見つかるだけでも心強いかも知れないので記録しておきます。
すがすがしいまでの手続き型で書いてますが、実際には必要に応じて書き換えていきたいと思います。


```as3
import flash.media.Camera;
import flash.media.Video;
import flash.display.Sprite;

//Cameraを初期化
var cam:Camera = Camera.getCamera();
var _w:Number;
var _h:Number;
var _p:Number = 4/3;
const _FPS:int = 10;
if(stage.stageHeight / stage.stageWidth > _p){
	_w = stage.stageWidth;
	_h = _w * _p;
}else{
	_h = stage.stageHeight;
	_w = _h * _p;
}
cam.setMode(_h, _w, _FPS);
//Viewoを初期化。90度回転
var video:Video = new Video(cam.width, cam.height);
video.attachCamera(cam);
video.rotation = 90;
video.x = cam.height;
//コンテナーを初期化
var cont:Sprite = new Sprite();
cont.addChild(video);
cont.width = stage.stageWidth;
cont.scaleY = cont.scaleX;
if(cont.height < stage.stageHeight){
	cont.height = stage.stageHeight;
	cont.scaleX = cont.scaleY;
}
cont.x = (stage.stageWidth - cont.width) * 0.5;
cont.y = (stage.stageHeight - cont.height) * 0.5;
addChild(cont);
```
加速度／傾きセンサーの値を取得


```javascript
window.addEventListener("devicemotion", function(evt){
    
    //加速度
    var x = evt.acceleration.x;
    var y = evt.acceleration.y;
    var z = evt.acceleration.z;
    

    //傾き
    var xg = evt.accelerationIncludingGravity.x;
    var yg = evt.accelerationIncludingGravity.y;
    var zg = evt.accelerationIncludingGravity.z;
    
    //回転値
    var a = evt.rotationRate.alpha; //z方向
    var b = evt.rotationRate.beta; //x方向
    var g = evt.rotationRate.gamma; // y方向

    var txt  = "x:"+x+"<br>";
        txt += "y:"+y+"<br>";
        txt += "z:"+z+"<br>";

        txt += "傾きx:"+xg+"<br>";
        txt += "傾きy:"+yg+"<br>";
        txt += "傾きz:"+zg+"<br>";
    
        txt += "alpha(z):"+a+"<br>";
        txt += "beta(x):"+b+"<br>";
        txt += "gamma(y):"+g+"<br>";

    console.log(txt);
   
}, true);
```
GPSデータの取得

```javascript

window.onload = function(){
    navigator.geolocation.watchPosition(update); //現在位置情報を定期的に監視
    
    // navigator.geolocation.getCurrentPosition(); //現在位置情報を取得
    // navigator.geolocation.clearWatch(); //watchPosition()での監視を中止
}
    
function update(position){
	//下記すべての情報が取得できるわけでは無い
	var lat = position.coords.latitude; //緯度
	var lng = position.coords.longitude; //経度
	var alt = position.coords.altiude; //高度
	var acc = position.coords.accuracy; //緯度経度の誤差
	var alc = position.coords.altiudeAccuracy; //高度の誤差
	var hed = position.coords.heading; //方角
	var spe = position.coords.speed; //スピード
	
	var txt  = "緯度:" + lat + "<br>";
	    txt += "経度:" + lng + "<br>";
	    txt += "高度:" + alt + "<br>";
	    txt += "緯度経度誤差:" + acc + "<br>";
	    txt += "高度誤差:" + alc + "<br>";
	    txt += "方角:" + hed + "<br>";
	    txt += "速度:" + spe + "<br>";	
	console.log(txt);
}

```
WebkitとGekoでのCSS3プロパティの値の違い


```javascript
var style = document.creatElement('div').style;

//Transform
//webkit(chrome)
'-webkit-transform' in style //=> true;
'webkitTransform' in style //=> true;

//Geko
'MozTransform' in style //=> true;

//IE
'msTransform' in style //=> true;
'-ms-transform' in style //=> true;

///////////////////////////////////

//Transition
//webkit(chrome)
'-webkit-transition' in style //=> true;
'webkitTransition' in style //=> true;

//Geko
'MozTransition' in style //=> true;

//IE
'msTransition' in style //=> true;
'-ms-transition' in style //=> true;
```
SSL認証の設定


以前ec2にバーチャルホスト設定を行った
http://qiita.com/items/075ccbf147ca8eb568b8


今回はバーチャルホスト毎に同じ証明書でSSLの設定を行った
■準備
・openssl install
・mod_ssl install
・port443開放
・サーバー秘密鍵・証明書作成


```/etc/httpd/conf/httpd.conf
#追加
NameVirtualHost *:443

# 元ドメイン
<VirtualHost *:80>
   DocumentRoot /var/www/html
   ServerName ドメイン１
</VirtualHost>

#追加　SSL
<VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName ドメイン１
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    SSLOptions +StdEnvVars
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>

# 追加ドメイン
<VirtualHost *:80>
   DocumentRoot /var/www/virtual
   ServerName ドメイン２
</VirtualHost>

#追加　SSL
<VirtualHost *:443>
    DocumentRoot /var/www/virtual
    ServerName ドメイン２
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    SSLOptions +StdEnvVars
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>
```



■注意点

```/etc/httpd/conf.d/ssl.conf
以下記述以降は全て削除
##
## SSL Virtual Host Context
##
```


参考HP
http://d.hatena.ne.jp/eth0jp/20090920/1253394739
Cancanで管理者と一般ユーザを簡単にわける方法 - ユーザタイプごとの役割の設定（認可）


CanCanを使ってみたのでメモ。
ユーザグループAとBとCそれぞれに対して出来るアクションを分けたいときに便利。
例えば、管理者と一般ユーザで分けるとか。

## 1. まずはAbilityクラスを作る

```bash:
rails g cancan:ability
```

## 2. メイン設定
めちゃくちゃ簡単。誰が何をすることが出来るか(can)定義。

CRUD(:create, :read, :update, :delete)の操作それぞれ、またはそれら全てを意味する :manage に対して"can"を決めるだけ。

```ruby:app/models/ability.rb
def initialize(user)
  user ||= User.new
  if user.type == 1
    can :manage, User
    can :manage, Product
  else                                                                                                                           
    can :read, User
    can :read, Product
  end
end
```

canの代わりに

```ruby:
cannot :delete, User
```

みたいに書くこともできます。

## 3. ラスト！

該当するコントローラに

```ruby:app/controllers/user_controller.rb
load_and_authorize_resource
```

を追加したら完了！
これで、user.typeが1のユーザのみユーザ(User)や商品(Product)の追加が出来るようになりました。

## もうひと押し

### ヘルパー

このままだとuser.typeが1でないユーザに、行えないアクション（ユーザの追加など）のリンクを表示してしまうことになるので、

- can?
- cannot?

を使いましょう。

例えば、

```ruby:app/views/users/index.html.erb
<% if can? :create, User %>
  <%= link_to 'New User', new_user_path %>
<% end %>
```

### CanCan::AccessDenied のために

最後に、認可されてないアクションを行おうとした際の処理をを書いておく。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end
end
```

## とりあえず

めちゃくちゃ簡単！
mysql.h is missing ...



Rails3をインストールしたので、MySQLをデータベースにしてプロジェクトを作成しようとした。

```
$ rails new app -d mysql
```

ところが、bundle installの際にmysql2のインストールに失敗し、

```
mysql.h is missing.  please check your installation of mysql and try again.
```

というエラーメッセージを出してしまった。
インクルードヘッダが見つからないということなので、

```
$ ls /usr/include
```

で確認したところmysqlがない。

```
$ yum install mysql-devel
```

mysql-develをインストールしたところ、mysql.hが作成されていたので、改めてmysql2をインストール

```
$ gem install mysql2
```

無事にプロジェクトも作成できた。
debian でロケールのエラーが出るときの対処法

## アップデートなどで以下のようなエラーが出る時の対処方法

```bash
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LANG = "en_US"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
```

## 対処方法

以下の通り実行

```bash
export LANG=en_US.UTF-8
export LC_ALL=$LANG
locale-gen --purge $LANG
dpkg-reconfigure -f noninteractive locales && /usr/sbin/update-locale LANG=$LANG LC_ALL=$LANG
```
Emacs でオブジェクトを永続化するための参考コード

Auto Complete のコードあたりが参考になると思う。

```cl
(defun ac-comphist-serialize (db)
  (let (alist)
    (maphash (lambda (k v)
               (push (cons k v) alist))
             (ac-comphist-tab db))
    (list alist)))

(defun ac-comphist-deserialize (sexp)
  (condition-case nil
      (ac-comphist-make (let ((tab (ac-comphist-make-tab)))
                          (mapc (lambda (cons)
                                  (puthash (car cons) (cdr cons) tab))
                                (nth 0 sexp))
                          tab))
    (error (message "Invalid comphist db.") nil)))

(defun ac-comphist-init ()
  (ac-comphist-load)
  (add-hook 'kill-emacs-hook 'ac-comphist-save))

(defun ac-comphist-load ()
  (interactive)
  (let ((db (if (file-exists-p ac-comphist-file)
                (ignore-errors
                  (with-temp-buffer
                    (insert-file-contents ac-comphist-file)
                    (goto-char (point-min))
                    (ac-comphist-deserialize (read (current-buffer))))))))
    (setq ac-comphist (or db (ac-comphist-make)))))

(defun ac-comphist-save ()
  (interactive)
  (require 'pp)
  (ignore-errors
    (with-temp-buffer
      (pp (ac-comphist-serialize ac-comphist) (current-buffer))
      (write-region (point-min) (point-max) ac-comphist-file))))
```
アーカイブマネージャーでRAR書庫やＬＺＨ書庫を解凍できるようにする

アーカイブマネージャーでRAR書庫やＬＺＨ書庫を解凍できるようにするには、
ターミナルを起動して以下のコマンドでパッケージをインストールします。

## LZH書庫を解凍できるようにする

```
sudo apt-get install lha-sjis
```

## RAR書庫を解凍できるようにする

```
sudo apt-get install unrar
```

# 参考

* [ubuntuでLZHやRARファイル解凍](http://blog.wolf.boy.jp/?eid=1095612)
transform3dに対応しているかのチェック


transformのプロパティに`rotateY(90deg)`を入れてみて、その後にその値が空でなければ対応、空だったら（代入拒否されたら）非対応、ということみたい。  
Modernizrを参考にしました。

```javascript
var style = document.createElement('div').style,
	props = ['-webkit-transform', 'MozTransform'];

for (var i = 0, p; p = props[i]; i++) if (p in style) {
	style[p] = '';
	style[p] = 'rotateY(90deg)';
	return style[p] !== '';
}

```
XOOPS Cube Legacyチートシート 

![](http://atnd.org/pict/3/23/C00000009233/9/c1/469373796537187_5e830c19.png)

![](https://raw.github.com/suin/xoopscube-cheatsheet/master/thumbnail.png)

[XOOPS Cube Conference 2012](http://xoopscube.net/conference/2012/) が6月23日（土）に開催されるらしいので、XOOPS Cubeの開発者向けチートシートを[GitHub](https://github.com/suin/xoopscube-cheatsheet)で公開しました。なんでも、このチートシートを会場で配ってくれるらしいです。
一時的にパーミッションを付加する方法

指定のパッケージに対してパーミッションを一時的に付加する。

```java:qiita.rb
grantUriPermission("opponent.package.name",
    Uri.parse("content://test.provider/allow"),
    Intent.FLAG_GRANT_READ_URI_PERMISSION);
```

指定のパッケージに付加したパーミッションを破棄する。

```java:qiita.rb
revokeUriPermission(Uri.parse("content://test.provider/allow"),
    Intent.FLAG_GRANT_READ_URI_PERMISSION);
```

詳細：http://yuki312.blogspot.jp/2012/06/androidgrant-permission.html
安全なcrontabの設定管理

crontabのオプションは隣にあるeとrで意味が逆になる(edit/remove)のでcrontabコマンドを実行するのは怖いけれど，crontabの引数にファイル名を渡すと，そのファイルから読んで設定してくれる．

```bash
crontab -l > ~/crontab # 今の内容を出力
edit ~/crontab # 設定変更
crontab ~/crontab # ファイルから読み込む．現在の設定は上書きされるので注意
```
NSStringからNSJSONSerialization#JSONObjectWithData


文字列表記されているJSONをiOS SDK 5から使える `NSJSONSerialization#JSONObjectWithData:options:error:` で `NSArray/NSDictionary` に変換するとき、ちゃんと書かないとnilになっちゃう。

_書くのが楽なので[RubyMotion](http://www.rubymotion.com/)で説明ｗ_

### 単純な値

```ruby
error_ptr = Pointer.new(:object)
data = "true".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:false)
NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments, error: error_ptr)
=> true
```

単純な値の場合`options`に`NSJSONReadingAllowFragments`の指定を含めないとnilになっちゃう。

optionsについては[JSONObjectWithData:options:error: のオプションの意味 -- MD Blog](http://md.hatenablog.com/entry/2012/03/17/185959)が分かりやすいです。

### 配列

```ruby
data = "[1,2,3]".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:false)
NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments, error: error_ptr)
=> [1, 2, 3]
```

配列は自然にこれで。

### オブジェクト

ちょっとハマりました。

```ruby
data = "{'a':1, 'b':2}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:false)
NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments, error: error_ptr)
=> nil
```

orz

何がいけないのだろうと、StringからじゃなくNSDictionaryからJSONObjectを生成して文字列に変換すると

```ruby
data = NSJSONSerialization.dataWithJSONObject({'a'=>1,'b'=>2}, options: 0, error: error_ptr)
NSString.alloc.initWithData(data, encoding:NSUTF8StringEncoding)
=> "{\"a\":1,\"b\":2}"
```

ダブルクォートで！JSONの仕様ってそうなんですかね？
了解しました。

```ruby
data = '{"a":1, "b":2}'.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:false)
NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments, error: error_ptr)
=> {"a"=>1, "b"=>2}
```

できたヽ(´ー｀)ノ

### 複合

どんとこい！

```ruby
data = '[1,{"a":1,"b":2},[3,4,[5,6]]]'.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:false)
json_obj = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments, error: error_ptr)
=> [1, {"a"=>1, "b"=>2}, [3, 4, [5, 6]]]
json_obj[1]
=> {"a"=>1, "b"=>2}
json_obj[2][2]
=> [5, 6]
```

### 追記

[RubyMotion](http://www.rubymotion.com/)に慣れてないと、コード見てもなんのこっちゃと思われるかも知れませんね（汗）
[RubyMotion](http://www.rubymotion.com/)（おそらく[MacRuby](http://macruby.org/)も同じだとおもう）ではNSArrayをRubyのArrayとして、NSDictionaryをRubyのHashとして同じように扱うことができるのですよ！

プログラム内で使用していない変数はREPLから呼べなかったのですがRubyMotion3.5から呼べるようになってました！(\\( ⁰⊖⁰)/)
get current branch name

現在のブランチ名を文字列として取り出す方法いろいろ。
正直よく理解していない部分も多いので、間違いなどあればご指摘いただけると嬉しいです。


## git-symbolic-refを使う
branch名の取得なら、多分これが一番良い？ `HEAD`を指定することで現在のワーキングツリーがどのブランチかを得ることができる。
zshの`VCS_INFO_git_getbranch`でもこれが使われている模様。

```
$ git symbolic-ref --short HEAD
```

`--short`オプションはv1.7.10以降から？
https://github.com/git/git/blob/master/Documentation/RelNotes/1.7.10.txt#L125


<br>


## git-name-rev, git-describeを使う
`git-name-rev`は指定したrevに対するsymbolic name(?)を返すので、`HEAD`を指定することで現在の最新コミットに関連するbranch名やtag名を得ることができる。

```
$ git name-rev --name-only HEAD
```

`git-describe`は指定したrevに最も近いtagなどを取得することができるようで、`--all`オプションを指定すればbranch名も対象になり、取得することができる。

```
$ git describe --all
```

どちらもbranch名だけでなくtag名も対象になるので純粋にbranch名だけを取り出したい場合はさらにフィルタリングが必要になるかも。

<br>

## git-branchの出力を加工する
`git branch -a`ですべてのブランチが表示され、current branchには行先頭に"*"がつくのでその行からブランチ名を取り出して使うことができる。

```
$ git branch -a | grep -E '^\*' | cut -b 3-
```
```
$ git branch -a | grep -E '^\*' | sed -e 's/^\* //'
```

<br>

## git-statusの出力を加工する
`git status --short --branch --untracked-files=no`でもcurrent branch名が取れるのでそれを加工することでも取得できる。

```
$ git status -sbu no | cut -b 4-
```

<br>

## 参考URL
- https://gist.github.com/2886755 (@r7kamura++)
- http://stackoverflow.com/questions/6245570/get-current-branch-name
- http://stackoverflow.com/questions/1593051/how-to-programmatically-determine-the-current-checked-out-git-branch
KobitoにQiitaへのpostのショートカットをつくってほしい

他の部分のショートカットは細かいところまで手が回っている印象ですが、QiitaへのPostだけ実装されていないのでかなしいです。
記事選択画面と編集画面からcommand + p(ost)で投稿できるとわかりやすいです。
あと、gist連携もお願いしたいです(こっちよりもタイトルのpostのショートカットを優先的に実装して欲しいです)
SurfaceViewの背景を透過する

ポイントは以下の２点です。

+ `setFormat(PixelFormat.TRANSLUCENT)` で背景に半透明を設定する
+ `setZOrderOnTop(true)` で SurfaceView を一番上に表示させる

```OverlayCanvas.java
package com.example;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.text.AttributedCharacterIterator;

public class OverlayCanvas extends SurfaceView implements SurfaceHolder.Callback, Runnable {

    private SurfaceHolder mHolder;
    private Thread mLooper;

    public OverlayCanvas(Context context) {
        super(context);
        initialize();
    }

    // カスタムビューとしてXMLに定義するときに必要なコンストラクタ
    public OverlayCanvas(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }

    private void initialize() {
        // 半透明を設定
        getHolder().setFormat(PixelFormat.TRANSLUCENT);
        // コールバック登録
        getHolder().addCallback(this);
        // フォーカス可
        setFocusable(true);
        // このViewをトップにする
        setZOrderOnTop(true);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        mHolder = holder;
        mLooper = new Thread(this);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if (mLooper != null) {
            mLooper.start();
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        mLooper = null;
    }

    public void run() {
        while (mLooper != null) {
            doDraw();
        }
    }

    private void doDraw() {
        Canvas canvas = mHolder.lockCanvas();
        /*
        描画更新処理をかく
         */
        mHolder.unlockCanvasAndPost(canvas);
    }
}
```

上記を layout ファイルに書くなら、こんな感じ。

```main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <!-- background は何か適当な画像 -->
    <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/xxxx">
    </ImageView>
    <com.example.OverlayCanvas
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
</FrameLayout>
```
最近使ったファイル一覧を表示

最近使ったファイル一覧を表示するように、`recentf-ext.el`を導入します。

```
M-x install-elisp-from-emacswiki recentf-ext.el
```

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.el
;; recentf-ext
(setq recentf-max-saved-items 5000)
(setq recentf-exclude '("/TAGS$" "/var/tmp/"))
(require 'recentf-ext)
(global-set-key (kbd "C-@") 'recentf-open-files)
```

`M-x recentf-opne-files`とすると履歴のバッファーが開かれます。頻繁に使用しそうなので`C-@`に割り当てをしました。
Check to has style on an element


```javascript
    chkDivStl = document.createElement('div').style,
    prefixes = [
        'webkit', 'moz', 'Moz', 'ms', 'o'
    ];


SOY.Util.isTouch = isTouch = 'ontouchstart' in window;
SOY.Event.MOUSE_CLICK = 'click';
SOY.Event.MOUSE_DOWN  = (isTouch) ? 'touchstart' : 'mousedown';
SOY.Event.MOUSE_MOVE  = (isTouch) ? 'touchmove'  : 'mousemove';
SOY.Event.MOUSE_UP    = (isTouch) ? 'touchend' : 'mouseup';

SOY.Util.CSSType = {};

//check for transition type.
for (i = 0, l = prefixes.length; i < l; i++) {
    if (prefixes[i] + 'Transition' in chkDivStl) {
        SOY.Util.CSSType.TRANSITION = '-' + prefixes[i] + '-transition';
        SOY.Util.CSSType.TRANSITION_DURATION = '-' + prefixes[i] + '-transition-duration';
        break;
    }
}
```
条件付き書式の、数式を指定した書き方

「数式が」の場合の書き方をいつもド忘れするのでメモ。

```
=($A$1="土曜日")
```

いつも外側の=() 書き忘れてエラー連発させるのよね。

# 相対指定

ちなみに、2つ目の`$`を外すと、行列の行の方は相対指定となり、
縦方向に書式をコピーした場合に、意図通りに動作します。

```
=($B2<>"")
```

![](https://lh5.googleusercontent.com/-lbHWPnoxhaA/UEivKz2FaxI/AAAAAAAAEoI/-a5YgkRKlso/s800/2012-09-06_23h06_03.png)

![](https://lh5.googleusercontent.com/-hi7W8Eph-Kc/UEivKnfe12I/AAAAAAAAEoA/ulrvtWAJWJE/s800/2012-09-06_23h06_19.png)
Safariのcookieをlaunchdで定期的に削除する


外部からSafariのcookieを消すには、まずcookiedを終了して、それから`~/Library/Cookies/Cookies.binarycookies`を削除する必要があるみたいです。

####やり方

cookiedの終了とCookies.binarycookiesの削除をするスクリプトを書きます。

```bash:deleCookie.csh
#!/bin/tcsh

killall cookied
rm /Users/wwvwvv/Library/Cookies/Cookies.binarycookies
```

スクリプトを定期的に動かすための以下のようなplistを作り、`~/Library/LaunchAgents/`下に置きます。

```xml:jp.watasi.deleCookie.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>jp.watasi.deleCookie</string>
        <key>ProgramArguments</key>
        <array>
                <string>tcsh</string>
                <string>/Users/wwvwvv/置き場所/deleCookie.csh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StartCalendarInterval</key>
        <dict>
                <key>Hour</key>
                <integer>3</integer>
                <key>Minute</key>
                <integer>45</integer>
        </dict>
</dict>
</plist>
```

ターミナルで以下を実行し、plistをロードします。cookieが消えていることをSafariから確認できたら正常です。

```
% cd ~/Library/LaunchAgents/
% launchctl load jp.watasi.deleCookie.plist
```

これで夜のうちにlaunchdがSafariのcookieを消しておいてくれるようになります。

Cookies.binarycookiesを削除するだけではうまくいかず困っていたら、友達のスーパーマカー（@banjun）が「cookiedというデーモンが動いてる」と教えてくれて、このようになりました。
自前のサーバのレポジトリを GitHub for Windows から使う

[GitHub for Windows](http://windows.github.com/) は実は GitHub 以外のレポジトリも扱えるらしい．

1. サーバに公開鍵を登録する．
   `C:\Users\yourname\.ssh\github_rsa.pub` に公開鍵があるので，このファイルの内容をサーバの `~/.ssh/authorized_keys` の末尾に追加する．

2. サーバ上のレポジトリを，ローカルに clone する．

3. GitHub for Windows の local の repositories を開いて，そこに clone したディレクトリをドラッグ&ドロップ．

4. 後は普通に利用できる．

sync が失敗する場合は，レポジトリの primary remote が正しいかチェックしてみるといいかも．GitHub for Windows が使う ssh は PuTTY の設定を参照しないことに注意．