OmniAICreator/Qiita-1.07M huggingface dataset:
SafariのLocalStorageを削除する

SafariにはWeb Inspectorというデバッグツールが付属しており、他のブラウザでいうFirefoxのfirebugやChromeのDeveloper Toolsに相当する。
このWeb Inspectorを使えばJavaScriptのエラーを確認したりCSSの内容を一時的に書き換えて見た目を確かめたりといったことができるのだが、何故かLocalStorageの確認と削除ができないので、代わりに `$HOME/Library/Safari/LocalStorage/` の中にあるファイルを削除する。

```sh:Terminal
ls -l $HOME/Library/Safari/LocalStorage/http_localhost_*
# -rw-r--r--@ 1 yuku  staff    12K Mar  5 00:02 http_localhost_8000.localstorage
```

このファイルを消せばlocalhost:8000のLocalStorageが削除される。

```sh:Terminal
rm $HOME/Library/Safari/LocalStorage/http_localhost_8000.localstorage
```
bowerにパッケージを登録する


```Bash:
$ bower register packagename git://github.com/package/path.git
```

https://github.com/twitter/bower#authoring-packages より
パッケージ名は被らなければなんでもいいっぽい。先手先取り。

## ハマったこと
* bowerに登録したいライブラリが"v1.1"というタグでバージョンを表していたため、

```Bash:
$ bower install ほげ
```
でライブラリをインストールできなかった。これは、bowerが[semver](http://semver.org/)に対応したタグのみバージョンとして認識するからだった。つまりここでは"v1.1.0"がbower的には正しいタグである。
gitのタグはリポジトリのコミッタでないと変更できないため、issueを作って対応してもらう必要があった。

semverに沿った形式であるかはsemverコマンドで確認できる。

```Bash:
$ npm install semver
$ semver v1.1

$ semver v1.1.1
1.1.1
```


## reveal.jsをbowerに登録したときのメモ
```Bash:
$ bower register reveal.js git://github.com/hakimel/reveal.js/
```
パッケージ名が衝突するとエラーがでたりする。

```Bash:
$ bower install reveal.js
```
components/reveal.js 以下に git://github.com/hakimel/reveal.js/ の内容がcloneされた。このとき元のリポジトリには存在しないcomponent.jsonがcomponents/reveal.js/に含まれている。

component.jsonはなくても上記の様に自動生成してくれるが、自分で作っておくとdependenciesやignoreが定義できる。
dependenciesは

```Bash:
$ bower install
```

したときに一緒にcloneしてくる依存パッケージを指定できる。ignoreは取得しないディレクトリやファイルを指定できる。
Homebrew + rbenv + ruby-buildでruby 2.0.0-p0をインストール


他の方も既に書かれていますが、自分用のメモだからいいよね。。Homebrewはインストール済み。

## 0. 準備 (HomebrewのFormulaのupdate)

まず、

```
brew update
```

でHomebrewのFormulaをアップデート。

## 1. openssl、readlineのインストール

```
brew install openssl
brew install readline
```

でインストールする。
openssl、readlineがHomebrewで既にインストール済みならば

```
brew upgrade openssl
brew upgrade readline
```

でアップグレードする。

## 2. ruby-buildをインストール

```
brew install --HEAD ruby-build
```

でruby-buildをインストール。

既にruby-buildをインストールしている場合、HEADをインストールしたいので、

```
brew uninstall ruby-build
```

で一度アンインストールしてからruby-buildをインストールする。

## 3. rbenvのインストール

rbenvをインストールしていなければ、

```
brew install rbenv
```

でインストールする。

## 4. ruby 2.0.0-p0をインストール

```
rbenv install -l
```

で`2.0.0-p0`があることを確認する。

```
RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p0 
```

でruby 2.0.0-p0をインストールする。

```
rbenv rehash
rbenv global 2.0.0-p0
```

のあと、`ruby -v`で`2.0.0p0`が出力されれば、ひとまずインストールは完了。

## 4. キーワード引数を使って動作確認

ruby 2.0.0で新しく追加されたキーワード引数を使って動作確認をしてみましょう。
irbを起動して以下のスクリプトを試してみる。

```ruby
def hoge(a :'a', b:'hanyaaaan')
  puts a
  puts b
end

hoge(a: 'hoehoe')

# hoehoe
# hanyaaaan
```

## 5. bundlerのインストール
bundlerをインストールしてみる。

`gem -v`でgemのバージョンを確認すると2.0.0となっている。

`gem install bundler`でbundlerをインストールする。

`bundle -v`でバージョンを確認すると1.3.1となりました。

## 補足 bundle installで証明書エラーとなった場合の対処

bundle installすると、証明書のエラーが発生し、インストールできない場合がある。そんな時は以下のように証明書を設定する。

```
$ brew install curl-ca-bundle
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem 
```
Xamarin.Android で暗黙的Intent を発行する


まあ特に特別なことはないんですが。。。

## 電話をかける

```c#:
var intent = new Intent(Intent.ActionCall, 
    Android.Net.Uri.Parse("tel:1234567890"));
context.StartActivity(intent);
```
※ 電話をかけるには ``CALL_PHONE`` 権限が必要です。権限の追加の仕方は[こちら](http://amay077.github.com/blog/2013/03/02/xamarin-android-permission/)。

## 地図を呼び出す

```c#:
var uri = String.Format("geo:{0},{1}?q={0},{1}({2})", 
    35.710211, 139.810874,
    "東京スカイツリー");

var intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(uri));
context.StartActivity(intent);
```

``Android.Net.Uri`` クラスは ``System.Uri`` クラスで代替できると嬉しかったかも。ちょっとだけ。いやダメか。
Qiitaの記事をニュース形式で毎日メールする(マシンがスリープしてても大丈夫)


![](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130303/20130303004116.jpg)

手動でコマンドを実行しなくてもよくなりました。

マシンがスリープしている状態でもマシン起動→メール送信→再度スリープ状態へ、になります。

[[記事本文へ]](http://ongaeshi.hatenablog.com/entry/2013/03/04/154033)
JUnit で日時のフェイク

最近、システム時計を読み出す処理を単体テストにかける仕事が有りまして、みなさんどうしているのかとGoogleで検索してみました。
でも、実際にこうしたという例がほとんど見つからず、あちこち探し回っているうちにこのサイトに行き着きました。
[システムのタイマーをラップしてテスト工数を削減する - Sacrificed](http://d.hatena.ne.jp/cnaos/20100105/1262694743"システムのタイマーをラップしてテスト工数を削減する - Sacrificed")

そこで、このアイディアにしたがって実装してみました。

```java:DateWarpper.java
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

/**
 * 単体テスト用のDateラッパー/Date Warpper for Unit Test(JUnit).
 * 単にgetInstanceすると、システム時計を内包するインスタンスが取れる。
 * シングルトンにしてあるので、どこかの処理で setDate を呼んでやれば、その日付を持ったインスタンスになる。
 * @author peki
 *
 */
public class DateWarpper
{
	/**
	 * シングルトンインスタンス
	 */
	private static final DateWarpper instance = new DateWarpper();
	/**
	 * Dateのインスタンス
	 */
	private Date date = new Date();

	/**
	 * インスタンス取得
	 * テスト対象からは、システム時刻を取得しているつもり
	 * @return
	 */
	public static DateWarpper	getInstance()
	{
		return	instance;
	}

	/**
	 * 任意の時刻を覚えさせる処理。JUnitのテストケースから使うことを想定している。
	 * @param dateTime 設定したい時刻。DateTime.parse にそのまま渡す。
	 * @return DateWapperのインスタンスを返す
	 * @throws ParseException DateTime.parseが例外を返したときに、そのままthrowする
	 */
	public static synchronized DateWarpper	setDate( String dateTime ) throws ParseException
	{
		/*
		 * TODO:重要な日付であれば、特定のサーバーのユーザーしかsetDateできないとか、
		 * ここで認証処理を書いたほうが良いでしょう。
		 */
		DateWarpper	inst = getInstance();

		inst.date = null;	// 気休め
		if ( dateTime == null )
		{
			inst.date = new Date();
		}
		else
		{
			inst.date = DateFormat.getInstance().parse( dateTime );
		}

		return	instance;
	}

	/**
	 * Dateインスタンスの読み出し.
	 * テスト対象からは、システム時刻を取得しているつもり、テストケースからは任意の時刻を取得させることが出来る。
	 * @return Dateのインスタンス
	 */
	public Date	getDate()
	{
		return	date;
	}
}
```

こんなものでどうでしょう？
私はJavaを使い始めて一年ほどで、Javaのお作法はあまり知らないのですが、もっといい方法があったりするのでしょうか?
Go言語で使えるAWSのライブラリ


使い方は良くわからないけど、メモ

#[github.com/kr/s3](https://github.com/kr/s3)
使った事無い

#[goamz](https://wiki.ubuntu.com/goamz)
* [S3のサンプル](https://github.com/golang-samples/goamz/tree/master/s3/simple)

#[github.com/bmizerany/aws4](https://github.com/bmizerany/aws4)
使った事無い
Emacsで1行複製

Emacsを使っている時「この行を複製してちょっと改変」ということが多いので、こんな関数を作って使っている。

```lisp:emacs.d/init.el
(defun duplicate-line (&optional p)
  "カーソルのある行を二重化します。
前置引数や引数があると、カーソル行以下n行を二重化します。"
  (interactive "p")
  (let ((orgp (point))(kill-whole-line t))
    (beginning-of-line)
    (if p
        (kill-line p) (kill-line))
    (yank)
    (yank)
    (goto-char orgp)))

(if window-system
    (global-set-key "\C-z" 'duplicate-line))
```

`C-z`で当該行をすぐ下に複製する。`C-u C-z`で4行複製する。
killバッファを潰してしまうのがちょっと難点である。windowsシステムでない時にC-zを押してsuspendさせるのはご愛嬌ということで。
入力された時間を５分単位に丸めるメソッド

```Objective-C:
@implementation NSDate (NSDateRounding)
- (NSDate *)dateByRoundingUpToFiveMinutes
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"m"];
    int ref = [[formatter stringFromDate:self] intValue];//基準分を切り抜き

    if(ref % 5 == 0) return self;

    float def = round(ref * .1f) * 10;//0.1かけてから四捨五入して10かける
    if(def < ref) def += 5;//元値より小さければ5足す
    return [self dateByAddingTimeInterval:60*(def - ref)];//基準分から差分をひいて秒数に変換
}
@end
```
PythonでCIDR表記を変換

Python だと netaddr というモジュールを使えばできそうですが、
CIDR変換だけが必要だったので自分で書いてみました。

```python
>>> import socket, struct
>>> def cidr2mask(len):
...     return socket.inet_ntoa(struct.pack('!L', 0xffffffff ^ ((1 << 32-len)-1)))
... 
>>> cidr2mask(8)
'255.0.0.0'
>>> cidr2mask(16)
'255.255.0.0'
>>> cidr2mask(24)
'255.255.255.0'
>>> cidr2mask(20)
'255.255.240.0'
```

もっとエレガントな書き方がありそう。
td-agentでfluentdを常駐させる

fluentdをシステムの起動時に立ち上げてバックグラウンドで常駐させるにはtd-agentというパッケージを入れるのが良いと以下のページを読んで知った

[Installing Fluentd Using deb Package | Fluentd](http://docs.fluentd.org/articles/install-by-deb)
[FAQ | Fluentd - What is the difference with td-agent and Fluentd?](http://docs.fluentd.org/articles/faq#what-is-the-difference-with-td-agent-and-fluentd)

以下のようなコマンドを実行するとインストールして起動してくれる

`curl -L http://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh`

設定ファイルは
`/etc/td-agent/td-agent.conf`
にある

また、実行されるfluentd本体やプラグインは通常のgemとは別になっており、
Ubuntu12.04の場合
`/usr/lib/fluent/ruby/lib/ruby/`
以下にある
pryでlvを使う

Rubyのインタラクティブシェルpryで、ページャにlvを使いたい時は、$HOME/.lv に -c を加える。
pry 0.9.12でこれがないとエスケープシーケンスがそのまま出てしまう。

``` ruby:pry/lib/pager.rb
  class SystemPager < Pry::Pager
    def self.default_pager
      pager = ENV["PAGER"] || ""

      # Default to less, and make sure less is being passed the correct options
      if pager.strip.empty? or pager =~ /^less\s*/
        pager = "less -R -S -F -X"
      end

      pager
    end
```

lessの-Rはraw control sequenceをそのまま通すというもので、これに相当するlvのオプションが-cである。他は相当するlvのオプションがない。
環境変数LVに文字列-cを加えてもよい。

----
pry-themeを入れて一部のテーマを使うと、pagerに渡った時にブリンクなどの不具合が出ることがあった。今はpryにのみlessを用いている。
Eshellをpopwinで

Eshellを開く・閉じるのにGitHubにあるEshell付属の[esh-toggle.el](https://github.com/emk/eshell/blob/master/esh-toggle.el)を使っていたが、どうも開き方・閉じ方に不満があったのでpopwinを使おうと思い立った。

eshell-popを呼び出せばEshellが画面下半分に現れ、必要なくなったらC-gでEshellのウィンドウが消えます。

また、Universal Argument (C-u) を先に与えると、開いているバッファのカレントディレクトリにcdします。

これだけだとなんかいろいろ不具合があるような気がしますが、取り敢えず公開します。

```my-eshell.el
(when (featurep 'popwin)
  (push '("*eshell*" :height 0.5) popwin:special-display-config)
  
  (defun eshell-pop (universal-argument)
    "open eshell window using popwin-elf"
    (interactive "P")
    (let* ((eshell-buffer-name "*eshell*")
	   (eshell-buffer (get-buffer eshell-buffer-name))
	   (file-name (buffer-file-name (current-buffer)))
	   (current-directory (with-current-buffer (current-buffer) default-directory)))
      (if eshell-buffer
	  (popwin:display-buffer eshell-buffer)
	(eshell))
      (when (and universal-argument file-name)
	(eshell-kill-input)
	(insert (concat "cd " current-directory))
	(eshell-send-input)
	(end-of-buffer)))))
```
iOSアプリ未インストール時にSafariでカスタムURLスキームを開く時の対策


iOSアプリケーションにカスタムURLスキームを実装し、SafariからそのURLを開く際にまだユーザがそのアプリケーションをインストールしていなければそのURLを開けずにページエラーになってしまう。その場合はアプリケーションをインストールする導線を張りたい。

## 対策1

workaroundとして以下のhackがある。

```javascript
setTimeout(function() {
  window.location = "http://itunes.com/apps/yourappname";
}, 25);
window.location = "custom-uri://";
```

### hack1の説明

window.locationにてカスタムURLスキームを設定し、そのURLに対応したアプリケーションがない場合（Safari自身も対応していない場合）、``window.location = "custom-uri://"`` の処理で画面遷移はせず、Safariは現在のページにとどまるためsetTimeoutがすぐ処理され、``window.location = "http://itunes.com/apps/yourappname"`` によりStoreへ飛ばすコードが実行される。

これによりアプリがインストールしていない場合にStoreに飛ばすということが実現できる。

### hack2の説明

SafariはURL ( ``custom-uri://`` ) を開くアプリケーションが見つからない場合にAlertを表示する。

Alertを表示後にさらに別のアプリケーション(上記の例ではApp Storeアプリが ``http://itunes.com/apps/yourappname`` をハンドリング)で開けるカスタムURLスキームを開くと、SafariがAlertを消す動きを見せるため、25msのような短い間隔であればユーザにAlertを見せないように振る舞うことができる。

逆にsetTimeoutで開くページがSafariで扱えるウェブページの場合Alertはキャンセルされず残ったままになるようだった。そのためApp Storeの前に自前のヘルプページを挟みたいという要件があるとsetTimeoutの間隔を短くするこのhackは使えずにAlertが残ったままになる。

### 対策1の問題点

カスタムURLスキーム ( ``custom-uri://`` )  を実装したアプリケーションがインストール済みの場合のフローが問題になる。

インストール済みならURL ( ``custom-uri://`` ) をそのアプリケーションがフォラグランドになって処理を行うが、setTimeoutの処理はキャンセルされないので、ユーザがSafariに戻ったときにインストール済みにもかかわらず毎回 ``window.location = "http://itunes.com/apps/yourappname";`` が実行されストアのページが開れてしまうという問題が起きる。

## 対策2

対策1の問題点を回避するworkaroundとして時刻をチェックするというhackがある。

```javascript
var checkedAt = new Date();
setTimeout(function() {
  var t = new Date() - checkedAt;
  if (t < 2000) {
    window.location = "http://itunes.com/apps/yourappname";
  }
}, 1000);
window.location = "custom-uri://";
```

### hack3の説明

アプリケーションがURLを開いてフォラグランドになれば当然Safariがバックグランドに回るためSafariの実行が停止し、すぐにはsetTimeoutの処理は実行されない。

Safariに戻ったあとにこのsetTimeoutが実行されるがこの時には時間が経っているのでsetTimeout内で時刻をチェックすれば、インストール済みのフローではApp StoreのURLを開かないようにできる。

iPhone 4Sで試したところ500msくらいであればSafariがバックグランドに入る前にsetTimeoutが実行されてしまったので、1000msにしてみたがこの辺りはタイミング次第なので調整が必要かもしれない。

### 対策2の問題点

対策1のhack2が使えないということになる。対策1のhack2ではアプリケーション未インストール時に表示されるAlertをsetTimeoutを25msにすることで即座にキャンセルしていたが、この対策を使うと1000msなのでその間1秒間ユーザにAlertを見せてしまうことになる。

## まとめ

今のところこれ以外のworkaroundを知らないため全ての解決方法がわからない。対策1と対策2の問題を比較した場合、インストール前のフロー問題とインストール後のフローの問題のどちらに優先度を置くかによって判断が変わる。

個人的にはインストール前にちょっとAlertが表示されることよりも、インストール後に毎回ストアに遷移してしまうほうが問題だと感じているので対策2を選ぶのがよいと考えている。

## 参考にしたもの
* Stack Overflow - [Is it possible to register a http+domain-based URL Scheme for iPhone apps, like YouTube and Maps?](http://stackoverflow.com/questions/1108693/is-it-possible-to-register-a-httpdomain-based-url-scheme-for-iphone-apps-like/1109200#1109200)
* Stack Overflow - [iPhone Safari: check if URL scheme is supported in javascript?](http://stackoverflow.com/questions/627916/iphone-safari-check-if-url-scheme-is-supported-in-javascript)
* Safari Developer Guide - [Safari Web Content Guide: Handling Events](http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)
Haskellでオブジェクト指向プログラミング

Lensを活用すれば、オブジェクト指向すら表現できる…これが、Haskellの力なのか…

クラスはデータ型、メソッドはインスタンスの状態を変更するStateモナド、インスタンスはIORefに対応している。

```haskell
{-# LANGUAGE TemplateHaskell, Rank2Types, ExistentialQuantification #-}
import Control.Lens
import Control.Applicative
import Control.Monad.State
import Control.Monad.IO.Class
import Data.IORef

infix 9 .-
infix 9 .!

data Vec2 = Vec2 Float Float deriving Show

(&+) :: Vec2 -> Vec2 -> Vec2
Vec2 x0 y0 &+ Vec2 x1 y1 = Vec2 (x0 + x1) (y0 + y1)

newtype Default a = Default { getDefault :: a } deriving (Show)

ofDefault :: Iso (Default a) (Default b) a b
ofDefault = iso getDefault Default

-- 指定されたLensに対するメソッドの呼び出し
(.-) :: MonadState s m => Lens' s c -> StateT c m a -> m a
l .- m = do
    s <- get
    (a, s') <- zoom l m `runStateT` s
    put s'
    return a

-- IORefに対するメソッドの呼び出し
(.!) :: MonadIO m => IORef c -> StateT c m a -> m a
ref .! m = do
    s <- liftIO $ readIORef ref
    (a, s') <- runStateT m s
    liftIO $ writeIORef ref s'
    return a

data Obj = Obj -- 基底クラスのメンバー変数
    { _position :: Vec2
    , _velocity :: Vec2
    , _name :: String
    } deriving Show

makeClassy ''Obj

instance HasObj a => HasObj (Default a) where obj = ofDefault . obj

class Objs c where -- 基底クラスのメソッド
    update :: MonadState c m => m ()
    draw :: (MonadState c m, MonadIO m) => m ()

instance HasObj c => Objs (Default c) where -- メソッドの実装
    update = do
        v <- use velocity
        p <- use position
        position .= v &+ p
    draw = liftIO . print =<< use position 

data ObjA = ObjA -- クラスの継承(メンバー変数の拡張)
    { _superObjA :: Default Obj
    , _accel :: Vec2
    }

makeLenses ''ObjA

instance HasObj ObjA where obj = superObjA . ofDefault

instance Objs ObjA where
    update = do
        a <- use accel
        v <- use velocity
        velocity .= a &+ v

        superObjA .- update -- スーパークラスのメソッドの呼び出し

    draw = superObjA .- draw

class Objs c => ObjsA c where -- クラスの継承(メソッドの拡張)
    reset :: MonadState c m => m ()

instance ObjsA ObjA where
    reset = superObjA . velocity .= Vec2 0 0

data WrapObjs = forall a. (Objs a, HasObj a) => WrapObjs (IORef a)

test = do
    a <- newIORef $ Default $ Obj { _position = Vec2 0 0, _velocity = Vec2 1 1 , _name = "Hoge" }
    b <- newIORef $ ObjA
        { _superObjA = Default $ Obj { _position = Vec2 10 0, _velocity = Vec2 (-1) (-4), _name = "Fuga" }
        , _accel = Vec2 0 0.5 }
    let objs = [WrapObjs a, WrapObjs b]
    forM_ [1..10] $ \_ -> do 
        forM_ objs $ \(WrapObjs i) -> do
            putStr =<< i .! use name
            putStr " "
            i .! update
            i .! draw
```
SonicGardenメンバーがおすすめするRailsを学ぶ情報源


# まず読むべき書籍

* [プロを目指す人のためのRuby入門](http://amzn.to/2zXKrTt)
* [RailsによるアジャイルWebアプリケーション開発](http://goo.gl/Ju59R)
* [Rails3レシピブック 190の技](http://goo.gl/F2HNM)
* [Ruby on Rails 3 アプリケーションプログラミング](http://goo.gl/SGYue)
* [初めてのRuby](http://goo.gl/naHsZ)
* [プログラミング言語Ruby](http://goo.gl/Plt3X)
* [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)

# Web

* [Ruby on Rails Tutorial](https://www.railstutorial.org/)
* [RailsGuides](http://guides.rubyonrails.org/)
* [Better Specs](http://betterspecs.org/)
* [Ruby on Rails: Core](https://groups.google.com/forum/#!forum/rubyonrails-core)
* [rails/rails](https://github.com/rails/rails)
* [The Ruby Toolbox](https://www.ruby-toolbox.com/)

# Podcast

* [Railscasts](http://railscasts.com/)
* [Ruby5](http://ruby5.envylabs.com/)

# レベルが上がったら読む書籍

* [メタプログラミングRuby](http://goo.gl/550vp)
1桁同士の四則演算

```c:math.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double bekijo(char str[]) {
    int operator, count = 0;
	double num1, num2;
    for (int i = 0; str[i] != '\0'; i++) {
		if (str[i] == '+') {
			operator = 0;
            count++;
		} else if (str[i] == '-') {
			operator = 1;
            count++;
		} else if (str[i] == '*') {
			operator = 2;
            count++;
		} else if (str[i] == '/') {
			operator = 3;
            count++;
		} else {
			if (count != 1) {
				num1 = atof(&str[i]);
			} else {
				num2 = atof(&str[i]);
			}
		}
	}
    if (operator == 0) {
        return num1 + num2;
    } else if (operator == 1) {
        return num1 - num2;
    } else if (operator == 2) {
        return num1 * num2;
    } else {
        return num1 / num2;
    }
}

int main(int argc, char *argv[]) {
	char str[256] = "5/2";
	printf("%s = %lf\n", str, bekijo(str));
	return 0;
}
```
Android - 縦横比を守ってネットから画像を取得

Android - 縦横比を守ってネットから画像を取得
------------------------

IMAGE_MAX_HEIGHT、IMAGE_MAX_WIDTHを適当に設定してあげれば、引数のURLの画像をBitmapにして返します。Android端末において、Bitmapがメモリ的にかなりくせものなので、finallyでgcしてます。本当にこれが最適なのかは謎^^

```java:
	public static Bitmap getBitmapFromURL(String strUrl) throws IOException {
		HttpURLConnection con = null;
		InputStream in = null;
		Bitmap bitmap = null;
		Matrix matrix = null;
		try {

			URL url = new URL(strUrl);
			con = (HttpURLConnection) url.openConnection();
			con.setUseCaches(true);
			con.setRequestMethod("GET");
			con.setReadTimeout(500000);
			con.setConnectTimeout(50000);
			con.connect();
			in = con.getInputStream();
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inPurgeable = true;
			options.inPreferredConfig = Bitmap.Config.RGB_565;
			bitmap = BitmapFactory.decodeStream(in, null, options);

			int h = bitmap.getHeight();
			int w = bitmap.getWidth();
			float resizeScaleHeight = IMAGE_MAX_HEIGHT / Float.valueOf(h);
			float resizeScaleWidth = IMAGE_MAX_WIDTH / Float.valueOf(w);
			if (resizeScaleHeight > resizeScaleWidth && w > IMAGE_MAX_WIDTH) {
				resizeScaleHeight = IMAGE_MAX_WIDTH / Float.valueOf(w);
				resizeScaleWidth = IMAGE_MAX_WIDTH / Float.valueOf(w);
			} else if (h > IMAGE_MAX_HEIGHT) {
				resizeScaleHeight = IMAGE_MAX_HEIGHT / Float.valueOf(h);
				resizeScaleWidth = IMAGE_MAX_HEIGHT / Float.valueOf(h);
			}

			matrix = new Matrix();
			matrix.postScale(resizeScaleWidth, resizeScaleHeight);
			return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
		} finally {
			try {
				if (con != null)
					con.disconnect();
				if (in != null)
					in.close();
			} catch (Exception e) {
			}
			bitmap = null;
			matrix = null;
			System.gc();
		}
	}
```
Railsサーバーの`WARN  Could not determine content-length…`のログを表示しないようにする


Webrickのログに、
`WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true`ていう警告がいっぱい出ていて鬱陶しかったので、表示しないようにした。

このページに載ってる通りにやっただけ。
https://bugs.ruby-lang.org/attachments/2300/204_304_keep_alive.patch

## 環境
* ruby 1.9.3p392 (rbenvとruby-buildで入れたやつ)
* Rails 3.2.11

## 方法
`~/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/webrick/httpresponse.rb`を1行編集するだけで良いらしい。

```ruby:~/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/webrick/httpresponse.rb 
# 205行目あたり
# if chunked? || @header['content-length'] （編集前）
if chunked? || @header['content-length'] || @status == 304 || @status == 204  # 編集後       
  @header['connection'] = "Keep-Alive"
else
```

サーバー再起動したら警告ログが出なくなった。
EmacsでインタラクティブにSQLを使うための設定(sql.el)


emacsにauto-install機能を用いてSQL関連のelispを導入する。

まず、emacsのauto-installコマンドを使って必要なelispをダウンロード,コンパイル、ロードを行う。

##elispのインストール

> M-x install-elisp
それぞれのURLを入力

sql.el: http://www.emacswiki.org/emacs/download/sql.el
sql-indent.el: http://www.emacswiki.org/emacs/download/sql-indent.el
sql-complete.el: http://www.emacswiki.org/emacs/download/sql-complete.el
sql-transform.el: http://www.emacswiki.org/emacs/download/sql-transform.el

それぞれ、C-c C-cでLoadし終わったら.emacsを編集する。

##.emacsの編集
以下を.emacsに追記してください。
(default設定は適当に変えてください。)

```.emacs
;; C-c C-c : 'sql-send-paragraph
;; C-c C-r : 'sql-send-region
;; C-c C-s : 'sql-send-string
;; C-c C-b : 'sql-send-buffer
(require 'sql)

(add-hook 'sql-interactive-mode-hook
          #'(lambda ()
              (interactive)
              (set-buffer-process-coding-system 'sjis-unix 'sjis-unix )
              (setq show-trailing-whitespace nil)))

;; starting SQL mode loading sql-indent / sql-complete
(eval-after-load "sql"
  '(progn
     (load-library "sql-indent")
     (load-library "sql-complete")
     (load-library "sql-transform")))

(setq auto-mode-alist
      (cons '("\\.sql$" . sql-mode) auto-mode-alist))

(sql-set-product-feature
 'ms :font-lock 'sql-mode-ms-font-lock-keywords)

(defcustom sql-ms-program "sqlcmd"
  "Command to start sqlcmd by SQL Server."
  :type 'file
  :group 'SQL)

(sql-set-product-feature
 'ms :sql-program 'sql-ms-program)
(sql-set-product-feature
 'ms :sqli-prompt-regexp "^[0-9]*>")
(sql-set-product-feature
 'ms :sqli-prompt-length 5)

(defcustom sql-ms-login-params
  '(user password server database)
  "Login parameters to needed to connect to mssql."
  :type '(repeat (choice
                  (const user)
                  (const password)
                  (const server)
                  (const database)))
  :group 'SQL)

(defcustom sql-ms-options '("-U" "-P" "-S" "-d")
  "List of additional options for `sql-ms-program'."
  :type '(repeat string)
  :group 'SQL)

(defun sql-connect-ms ()
  "Connect ti SQL Server DB in a comint buffer."
  ;; Do something with `sql-user', `sql-password',
  ;; `sql-database', and `sql-server'.
  (let ((f #'(lambda (op val)
               (unless (string= "" val)
                 (setq sql-ms-options
                       (append (list op val) sql-ms-options)))))
        (params `(("-U" . ,sql-user)("-P" . ,sql-password)
                  ("-S" . ,sql-server)("-d" . ,sql-database))))
    (dolist (pair params)
      (funcall f (car pair)(cdr pair)))
    (sql-connect-1 sql-ms-program sql-ms-options)))

(sql-set-product-feature
 'ms :sqli-login 'sql-ms-login-params)
(sql-set-product-feature
 'ms :sqli-connect 'sql-connect-ms)

(defun run-mssql ()
  "Run mssql by SQL Server as an inferior process."
  (interactive)
  (sql-product-interactive 'ms))
```

##使い方

emacs上でのコマンド
基本的に

>M-x sql-xx

でそれぞれのsqlクライアントをインタラクティブに利用するモードに切り替わる。

例えばMySQLの場合はemacs上で

>M-x sql-mysql


その他のSQLモードについては
http://www.sixnine.net/roadside/sqlmode.html
に載ってます。

sqlモードのhelpについては

>M-x sql-help

で参照できる。
About CSS3

そもそもCSSって何？

↓
http://www.htmq.com/csskihon/001.shtml


じゃあCSS3って何？

↓
http://css3.sophia-it.com/reference/CSS3%E3%81%A8%E3%81%AF1


対応ブラウザ
http://www.findmebyip.com/litmus/



CSS3で何ができるの？
１、画像がいらない！？

角丸と影：https://webdesigntutsplus.s3.amazonaws.com/tuts/181_css3_vs_psd/Samples/Navigation_non_bleed/index2.html



透過
http://webdesigntutsplus.s3.amazonaws.com/tuts/186_css3_vs_psd/Samples/Transparency%20and%20Opacity/index.html
※全体が透過しない方法
http://www.job-share.net/jobs/101



グラデーション
http://cssgradientbutton.com/



図形
http://css-tricks.com/examples/ShapesOfCSS/

図形を利用し使えそうなサンプル
http://www.profinder.asia/freelance/search/index



挟み込み
http://www.red-team-design.com/css3-tucked-corners

２、Javascriptのような処理
hover挙動

色が変わる：http://www.profinder.asia/jobs/show/131
ツールチップみたいな動き：http://www.profinder.asia/jobs/show/131


３、FLASHみたいな動き
http://tympanus.net/Tutorials/3DHoverEffects/
http://demo.marcofolio.net/3d_animation_css3/

４、レスポンシブ対応
bootstrap等

５、おまけ
http://css3.zxq.net/doraemon/doraemon_css3.html
http://rei.idv.tw/sample/mio.html
http://hanasan38.web.fc2.com/lion.html



下記まとめ
http://matome.naver.jp/odai/2132886197465017301




css3とJavascript、どのように使い分ける？
http://coliss.com/articles/build-websites/operation/work/relationship-between-css-javascript-by-smashingmagazine.html
WEB開発をするにあたって私的「これだけは入れとけ!」っていう開発環境構築手順(virtualbox編)


自分は根っからのPHPerですが最近はPHPerといえども色々な言語のツールなども駆使しないと現代社会では生けていけない状態になって参りました。

そこで最近ホットなものも開発できる環境を一から作りなおした時のメモです。

## あるあるこんなこと

* 開発を複数受け持っている場合に言語のバージョンが違う
* webサーバーもnginxとapacheの組み合わせが多くなってきた
* DBもRDBMSとnoSQLと選択多くなってきた
* MYSQLの複数インスタンス欲しい
* kvsとかもたまに使うよね？(memcacheもね)
* 継続的インテグレーションをやるためにはjenkinsも入れなきゃいけない

上記を踏まえた上での開発環境構築手順を紹介させて頂きます。


## 環境

* macosx10.8(ホストOS)
* centos6.3（ゲストOS）

尚、構築手順はMACOSXでの構築手順になります。
※windowsも適時コマンドを読み替えれば特に問題ないと思います。


## 入れるもの

### [VirtualBox](https://www.virtualbox.org/)

CentOSを動かすための仮想開発環境

### 開発言語

#### PHP

PHPerなんで

* [phpenv](https://github.com/CHH/phpenv)

PHPのバージョン変更がコマンド一発でできるもの

* [php-fpm](http://php-fpm.org/)

nginxでPHPを使うために必要なプロセスマネージャー

* memcache
* mongo etc… (適当に必要そうなもの全部)

#### ruby

ビルドツールとかshell以外で構築するにあたって便利なものが色々あります。(Capistranoとか)言語切替とかのスクリプトは大体rubyで書かれていることが多いです。

* [rbenv](https://github.com/sstephenson/rbenv/)

rubyのバージョン変更がコマンド一発でできるもの

* [chef](http://higelog.brassworks.jp/?p=654)

環境構築を自動化できるツール。当初はこれでやろうと思ったが理解力が乏しく断念しました。

* [fluentd](http://fluentd.org/)

ログを何でもかんでもjsonにできるツール。jsonって便利ですよね

#### node.js

scoket.ioとか聞いてるとワクワクしますよね！！

* [nodebrew](https://github.com/hokaccha/nodebrew)

node.jsのバージョン変更がコマンド一発でできるもの
node.jsは頻繁にアップデートするのでバージョン切り替えがないと死ねるかもしれません。

#### JAVA

自分はJAVA知らないがjenkinsは使いたかったので

* [jenkins](http://jenkins-ci.org/)

自動ビルドとかに使うツール

### WEBサーバー

#### apache

いつもどおり

#### nginx

最近はこれ多い

### DB

#### MYSQL

いつもどおり

* phpMyAdmin

最近は使いやすくなりました

#### mongodb

最近話題のnoSQL

* rockmongo

mongodb版phpmyadminのようなもの

## 目次

* [virtualbox導入](http://qiita.com/items/31029ea9ac3fcb34abdc) (OSインストールからSSHでホストOSの接続確認まで)
* [yum外部レポジトリの追加](http://qiita.com/items/662e41376efa97251575) 
* [rubyインストール](http://qiita.com/items/1cb882b48b1a827a420d)
* [virtualbox(centos)でのhttpdインストールメモ](http://qiita.com/items/5ef125b0384a9c23ba6a)
* [fluentdインストール](http://qiita.com/items/ae25133156aeddd7c24b)
* [nginxインストール](http://qiita.com/items/40b527c390f068985f75)
* [MYSQLインストール](http://qiita.com/items/73df4ab45c96092b63b8)
* [PHPインストール](http://qiita.com/items/7d031440bb174a55a6a1)
* [php-fpm設定](http://qiita.com/items/b51b7ec9d7c378f60237)
* [phpMyAdminインストール](http://qiita.com/items/dae3649e412c323015c0)
* [mongodbインストール](http://qiita.com/items/3ed551c440cf7b48bbfe)
* [PECL::mongo追加](http://qiita.com/items/ed7c86d3a7c183c76081)
* [PECL::memcached追加](http://qiita.com/items/b2ce06e8f2ee0237d723)
* [PHP composerインストールメモ](http://qiita.com/items/43beef25d26966fff8cc)
* [node.jsインストール](http://qiita.com/items/c85fcca393492a12ec38)
* [jenkinsインストール](http://qiita.com/items/e41a821a8287091d7510)

本当はデプロイツールの[capistrano](https://github.com/capistrano/capistrano)とかも書きたかったのですが断念しました。また時間があれば書きます。
ファイルのオーバーライド

相変わらず blog からの転載ネタですが（そろそろネタ切れ）

*sort* (1) の -o オプションの様に元ファイルのオーバライド指定ができる（この動作をスポンジ動作というらしい）コマンド以外で元ファイルを直接オーバーライドする方法。

```sh:sample
$ (rm ファイル; command > ファイル) < ファイル

```

先行する *rm* (1) は必須である。 *rm* (1) がない場合は外側のシェルが '<' により O_RDONLY で *open* (2) するファイルと内側のシェルが '>' により O_RDONLY|O_TRUNC で *open* (2) するファイルの inode が等しいので OS は同一ファイルと見做し、 command の標準入力は O_TRUC により truncate されたファイルとなってしまう。

対して *rm* (1) がある場合は外側のシェルが O_RDONLY で *open* (2) するファイルと内側のシェルが O_RDONLY|O_TRUNC で *open* (2) するファイルの inode が異なるので OS は別なファイルと見なすので O_TRUNC による truncate は影響を受けない。
ファイルに Plain ASCII 以外が含まれているかチェックする方法

英語版の Web サイト構築など Plain ASCII 以外が含まれていると
文字化けなどの問題が発生する可能性がある場合に、Plain ASCII 以外の文字が含まれているか簡単にチェックする更にもう一つの方法。

*nkf* (1) 等のコード変換プログラムを利用して異なる文字コードに変換した結果を比較すれば、
文字は文字コードが異なるので Plain ASCII 以外の文字が含まれているか簡単にチェックできる。

```sh:sample
$  nkf -e ファイル | ( nkf -j ファイル | diff /dev/fd/3 -) 3<&0
1c1
< abc??def
---
> abcB:#def

```

この場合は EUC と ISO-2022-JP にそれぞれ変換して比較
brew install fontforgeがerrorになる原因解決。

問題の詳細は下記。
https://github.com/mxcl/homebrew/issues/18046

最近のbrewではインストールに失敗するらしい。(2013/0304現在)
恐らく近いうちにupdateされると思うが、それまで待ってられない人は下記コマンドでインストールすると良い。

```sh
brew install https://raw.github.com/rubenfonseca/homebrew/04654811d9870b429a19940059fc0d561d9bd3a0/Library/Formula/fontforge.rb
```
ASP.NET 2.0 でREST風Webサービスを作成する を 読んで

ASP.NET 2.0 でREST風Webサービスを作成するhttp://d.hatena.ne.jp/kendik/20110723/1311439270
という すばらしい記事を見て作ってみました。

何点か ぱっとわからないことがありました。
ですので、今後のために書きました。

最初 .asmx で作っていました。
新しいクラスは、picture.cs というファイルで作りました。

``` csharp:picture.cs
namespace hoge.REST
{
	public class picture : IHttpHandler, IRequiresSessionState
	{
		public void ProcessRequest( HttpContext context )
		{
			using( var conn = new SqlConnection( connectionString ) )
			using( var cmd = conn.CreateCommand() ) {
				SqlCommand com = new SqlCommand( "select hoge", conn );
				com.Parameters.AddWithValue( "@id", context.Session["HOGE"].ToString() );
				SqlDataAdapter dp = new SqlDataAdapter( com );
			// 中略
				context.Response.ContentType = "image/png";

				byte[] buffer = stream.ToArray();
				context.Response.ContentType = "image/png";
				context.Response.BinaryWrite( buffer );
				context.Response.Flush();
			}
		}

		public bool IsReusable
		{
			get { return false; }
		}
	}
}
```
記事のとおりですと Session情報がとれませんで、調べた結果
IRequiresSessionState
を追加すると Session情報が取得できました。
http://forums.asp.net/t/1058823.aspx/1

```xml:config.xml
<system.web>
  <httpHandlers>
      <add type="hoge.REST.picture, hoge" path="Service1/*" verb="GET" />
    </httpHandlers>
</system.web>
```
の add の意味は、
type 1番目:クラス名
type 2番目:DLL名
path:クライアントからのリクエストのパス
verb:アクセスの種類
だと思われます。
http://msdn.microsoft.com/ja-jp/library/7d6sws33(v=vs.80).aspx
ちなみに ```<clear />```してしまうと 元々作っていた物にアクセスできなくなったので、はずしました。
rubyでビット文字列から'1'の位置を求める

ビットの開始位置を右（右端を位置0）として。

```ruby:scan_bits_index.rb
"10100100110".reverse.split('1',-1).inject([]){|ret,i| ret << i.size + (ret.last.nil? ? 0 : ret.last + 1); ret }[0..-2]
# => [1, 2, 5, 8, 10]
```

自分が必要だったのは左端から数えた位置だったので、ビットの開始位置を左から（左端を位置0）と考えるとこうなる。

```ruby:scan_bits_index_from_left.rb
"10100100110".split('1',-1).inject([]){|ret,i| ret << i.size + (ret.last.nil? ? 0 : ret.last + 1); ret }[0..-2]
# => [0, 2, 5, 8, 9]
```
Markdown記法の強調表示定義ファイル for K2Editor

[秀丸エディタ向けの定義ファイル](http://hide.maruo.co.jp/lib/hilight/mrkdwn102.html)を参考にさせていただきました。

- K2Editorは（秀丸エディタと同様）複数行に未対応のため、コードブロックをうまく検出できません
- もちろんどの強調表示を割り当てるかはお好みがあると思いますので（例：見出し4, 5, 6は同じ強調表示にしたい，など）ニーズに応じて改変してください
- 変なマッチング結果が出る，ご要望などあればお気軽にご連絡ください

```
VERSION=1.4
Quotation="
Canceler="
Commenter=
CommenterRegExp=0
CommenterCase=1
CommenterWord=0
CommenterFuzz=0
BracketCount=0

// 23:行の強調1 - 28:行の強調6
23,0,0,0,1,0,(?#見出し1)(^#[^#]*?$)
24,0,0,0,1,0,(?#見出し2)(^##[^#]*?$)
25,0,0,0,1,0,(?#見出し3)(^###[^#].*?$)
26,0,0,0,1,0,(?#見出し4)(^####[^#].*?$)
27,0,0,0,1,0,(?#見出し5)(^#####[^#].*?$)
28,0,0,0,1,0,(?#見出し6)(^######[^#].*?$)

// 23:行の強調1
23,0,0,0,1,0,(?#見出し1)(^=+$)
23,0,0,0,1,0,(?#見出し2)(^-+$)

// 17:強調表示1 - 22:強調表示6
// 44:強調表示7 - 47:強調表示10
17,0,0,0,1,0,(?#引用)(^>.*$)
18,0,0,0,1,0,(?#リスト)(^ {0,3}¥*[ ¥t]+.*$|^ {0,3}¥+[ ¥t]+.*$|^ {0,3}-[ ¥t]+.*$|^ {0,3}[0-9]+¥.[ ¥t]+.*$)
19,0,0,0,1,0,(?#コードブロック)(^ {4,}$|^¥t{1,}$)
20,0,0,0,1,0,(?#罫線)(^(¥* ){3,}$|^¥*.$|^(- ){3,}|^-{3,}$|^(_ ){3,}$|^_{3,}$)
21,0,0,0,1,0,(?#リンク)(¥[.*¥]¥((https?|ftp)(:¥/¥/[-_.!‾*¥'()a-zA-Z0-9;¥/?:¥@&=+¥$,%#]+)[¥t{1,}| {1,}]¥".*¥"¥))
22,0,0,0,1,0,(?#リンク)(¥[.*¥]¥((https?|ftp)(:¥/¥/[-_.!‾*¥'()a-zA-Z0-9;¥/?:¥@&=+¥$,%#]+)¥))
44,0,0,0,1,0,(?#リンク)(¥[.*¥]:[¥t{1,}| {1,}](https?|ftp)(:¥/¥/[-_.!‾*¥'()a-zA-Z0-9;¥/?:¥@&=+¥$,%#]+)[¥t{1,}| {1,}]¥".*¥")
45,0,0,0,1,0,(?#強調)(¥*.*¥*|_.*_|¥*¥*.*¥*¥*|__.*__)
46,0,0,0,1,0,(?#ソースコード)(`.*`)
47,0,0,0,1,0,(?#自動リンク URL)(!¥[.*¥]¥(.*¥)|!¥[.*¥]¥[.*¥]|¥[.*¥]: .*¥".*¥")
47,0,0,0,1,0,(?#自動リンク URL)(<(https?|ftp)(:¥/¥/[-_.!‾*¥'()a-zA-Z0-9;¥/?:¥@&=+¥$,%#]+)>)
47,0,0,0,1,0,(?#コメントアウト)(<!--((?:.|$^)+)-->)
```
opencv2.4 マスク処理


```C++:hoge.cpp

// 取得先、マスク、貼り付け先の画像を読み込む
// 全ての画像は同じサイズのものを使う
cv::Mat img            = cv::imread("base.bmp");
cv::Mat mask_img       = cv::imread("mask.bmp");
cv::Mat background_img = cv::imread("bakground.bmp");

// マスク処理
img.copyTo(background_img,　mask_img); 

```
Coffee-script非同期関数色々。


[IcedCoffeeScript](http://maxtaco.github.com/coffee-script/)
------
CoffeeScriptそのものを拡張する[IcedCoffeeScript](http://maxtaco.github.com/coffee-script/)、作者は[tameJS](https://github.com/maxtaco/tamejs)を作った[@maxtaco](https://github.com/maxtaco)。

```coffee-script
host = "http://search.twitter.com/"
list = [key1, key2, key3]
res  = []
await for keyword, i in list
  url = "#{host}/search.json?q=#{keyword}&callback=?"
  $.getJSON url, defer res[i]
console.log JSON.stringify res
```

kriskowal / [q](http://documentup.com/kriskowal/q/)
------
CommonJS [Promise/A](http://wiki.commonjs.org/wiki/Promises/A)

```coffee-script
host = "http://search.twitter.com/"
list = [key1, key2, key3]
tesk = []
res  = []
for keyword, i in list
  url = "#{host}/search.json?q=#{keyword}&callback=?"
  tesk[i] = $.getJSON url, (data) -> res[i] = data
Q.all(tesk).then -> console.log JSON.stringify res
```

mbostock / [queue](https://github.com/mbostock/queue)
------
[D3](http://d3js.org)の作者が作ったミニマルな同期関数ツール。
queueの引数で、なんとパラレリズム(同時に実行されるタスクの量)が調整出来ちゃいます。

```coffee-script
host = "http://search.twitter.com/"
list = [key1, key2, key3]
res  = []
que = queue(3)
for keyword, i in list
  url = "#{host}/search.json?q=#{keyword}&callback=?"
  que().defer($.getJSON, url)
que.awaitAll (error, res...) ->
  console.log JSON.stringify res
```
ubuntuでdpkg: error: parsing file '/var/lib/dpkg/status' near line *** 

ubuntuが(おそらく)セキュリティの自動アップデートの後、apt-get installで、タイトルの現象になってハマったのでメモ。

## ダメだった情報
ここに色々対処案が投稿されていて、これでなおるならこれの方が良さそう。自分の場合ダメだった。
http://askubuntu.com/questions/109994/dpkg-error-parsing-file-var-lib-dpkg-status-near-line-6449

## 結局
/var/lib/dpkg/status を開くと、Descriptionにバイナリ文字が混入したらしく文字化けしてぶっこわれたデータが…エディタでぶっこわれたデータをDescriptionタグごと全部消し、上記URLの以下対処で綺麗にして、その後どうにか動いている。

```sh
sudo apt-get update
sudo apt-get autoclean
sudo apt-get clean
sudo apt-get autoremove
sudo apt-get -f install
```

## 関連？
その後 libupnp3-dev というパッケージが壊れていたらしく、依存パッケージのインストールが失敗した。個別でremoveして復旧。
サーバー/クライアント両方を javascript(coffee-script)で書くときのビルド設定

サーバー/クライアントを両方jsないしcoffeeで書くときの、ディレクトリ構造や、Gruntfileのサンプルがあまりみつからなかったので自分で実施しはじめている内容をまとめてみる。

ディレクトリ構造は以下のようにした。
coffee-scriptのソースは、src/ に全て入れ、client/ server/ でディレクトリを分ける。

```
.
├── Gruntfile.coffee
├── README.md
├── app.coffee
├── component.json
├── lib
├── package.json
├── public
│   ├── css
│   ├── img
│   └── js
├── src
│   ├── client
│   └── server
└── views
```

分けておくと、Gruntfileで以下のようにclientとserverでビルドターゲットを分けることがけっこう簡単にできる。


```coffee-script
module.exports = (grunt) ->
  grunt.initConfig
    pkg: grunt.file.readJSON('package.json')

    coffee:
      server:
        files: [
          {
            'app.js': 'app.coffee'
          }, {
            expand: true,
            cwd: 'src/server',
            src: ['**/*.coffee'],
            dest: 'lib/',
            ext: '.js'
          }
        ]
      client:
        options:
          bare: false
        files: [
          {
            expand: true,
            cwd: 'src/client',
            src: ['*.coffee'],
            dest: 'public/js/lib/',
            ext: '.js'
          }
        ]

    concat:
      options:
        separator: ";"
      vendor:
        src: [
          'components/underscore/underscore-min.js',
          'components/jquery/jquery.min.js',
          'components/backbone/backbone-min.js'
          ],
        dest: "public/js/vendor.js"
      app:
        src: ["public/js/lib/**/*.js"]
        dest: "public/js/app.js"

    uglify:
      options:
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
      app:
        files:
          'public/js/app.min.js': ['<%= concat.app.dest %>']

    watch:
      src_server:
        files: ['app.coffee', 'src/server/**/*.coffee']
        tasks: ['coffee:server']
      src_client:
        files: ['src/client/**/*.coffee']
        tasks: ['coffee:client', 'concat:app']

  grunt.loadNpmTasks('grunt-contrib-uglify')
  grunt.loadNpmTasks('grunt-contrib-coffee')
  grunt.loadNpmTasks('grunt-contrib-concat')
  grunt.loadNpmTasks('grunt-contrib-watch')

  grunt.registerTask 'default', ['coffee', 'concat', 'uglify']
  grunt.registerTask 'server', ['coffee:server']
  grunt.registerTask 'client', ['coffee:client', 'concat:app']
```

watchもターゲットも分けておくと、クライアントのソースを保存したときにサーバもコンパイルされるなどの無意味なタスクが走らなくなるので良い。

ちなみに自分は、人の5倍くらいの回数ファイルを保存するので、watchは使ってない。
gruntは、rakeとかとちがって、プロジェクトのサブディレクトリからでもgruntコマンドを叩けるので、自分でemacsからタスクを叩けるように設定している。

```cl
(defun grunt-for-build ()
  "coffee-script compile for grunt task"
  (interactive)
  (let ((cur-dir (expand-file-name default-directory)))
    (compile 
     (if (string-match "/\\(server\\|client\\)s?/" cur-dir)
         (concat "grunt " (match-string 1 cur-dir))
       "grunt"))))

(define-key coffee-mode-map (kbd "C-c C-l") #'grunt-for-build)
```

こちらも、クライアント/サーバどっちのディレクトリに居るかによって、ターゲットを分けて実行している。
第8回オフラインリアルタイムどう書く解答例(C++)

横に長い所が多々ありますが、許してください。

```cpp
#define BOOST_TEST_MAIN
#include "boost/test/included/unit_test.hpp"
#include "boost/function.hpp"
#include "boost/lambda/lambda.hpp"
#include "boost/format.hpp"
#include <bitset>

namespace {
const int width = 6;
const int height = 5;

std::string convert_hex_to_binary_number(const std::string& hex)
{
    std::bitset<4> bits(strtol(hex.c_str(), NULL, 16));
    return std::string(boost::lexical_cast<std::string>(bits));
}

std::string get_binary_number(const std::string& input)
{
    std::string binary_number = "";
    for(size_t i=0; i<input.length(); ++i) {
        binary_number += convert_hex_to_binary_number(input.substr(i, 1));
    }
    return binary_number;
}

std::string convert_binary_number_to_hex(const std::string& input)
{
    long n = strtol(input.c_str(), NULL, 2);
    std::stringstream ss;
    ss << boost::format("%1$x") % n;
    return ss.str();
}

std::string get_hex(const std::string& input)
{
    std::string hex = "";
    for(size_t i=0; i<input.length(); i+=4)
    {
        hex += convert_binary_number_to_hex(input.substr(i, 4));
    }
    return hex;
}

void update_blast_impl(std::string& blast, std::string& wall, size_t i, int inc, boost::function<bool(int)> condition)
{
    while(condition(i))
    {
        if(wall.substr(i, 1) == "1")
        {
            blast.replace(i, 1, "0");
            break;
        }
        blast.replace(i, 1, "1");
        i += inc;
    }
}

void update_blast(std::string& blast, std::string& wall, size_t cur_pos)
{
    blast.replace(cur_pos, 1, "1");
    update_blast_impl(blast, wall, cur_pos + width, width, (boost::lambda::_1 < static_cast<int>(blast.length())));
    update_blast_impl(blast, wall, cur_pos - width, -width, (0 <= boost::lambda::_1));
    update_blast_impl(blast, wall, cur_pos + 1, 1, (boost::lambda::_1 % width));
    update_blast_impl(blast, wall, cur_pos - 1, -1, (boost::lambda::_1 % width != width - 1 && 0 <= boost::lambda::_1));
}

std::string solve(const std::string& input)
{
    std::string wall = get_binary_number(input.substr(0, input.find('/'))).substr(0, 30);
    std::string bomb = get_binary_number(input.substr(input.find('/') + 1, input.length())).substr(0, 30);
    std::string blast(width * height, '0');
    for(size_t i=0; i<wall.length(); ++i)
    {
        if(bomb.substr(i, 1) == "1")
        {
            update_blast(blast, wall, i);
        }
    }
    return get_hex(blast + "00");
}
}

BOOST_AUTO_TEST_CASE( ord_8 ) {
    /*0*/ BOOST_CHECK_EQUAL(solve("802b1200/01400c20"), "53c40cfc" );
    /*1*/ BOOST_CHECK_EQUAL(solve("28301068/84080504"), "d64fef94" );
    /*2*/ BOOST_CHECK_EQUAL(solve("100a4010/80010004"), "e241850c" );
    //以下略
}
```
Xamarin.Android でオレオレ Application クラスを使う


オレオレApplicationクラスって、[コレ](http://techbooster.org/android/application/2353/)のことなんですが、正式名称知らないので勝手にこう呼んでます(^_^;)

Xamarin.Android では、Application クラスを継承するのに加えてもう二手間くらい必要みたいです。割と苦労したのでメモしておきます。

## AndroidManifest.xml へ追記
Xamarin.Android では最初は AndroidManifest.xml は存在しないのですが、[このような手順](http://amay077.github.com/blog/2013/03/02/xamarin-android-permission/)で追加できます。

んで、\<application> タグに ``android:name`` 属性を追記します。ここは Android本家と同じ要領です。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    android:versionCode="1" android:versionName="1.0" package="HelloXamarinAndroiid.HelloXamarinAndroiid">
	<uses-sdk />
	<application android:label="HelloXamarinAndroiid" android:name=".MyApplication">
	</application>
</manifest>
```

## Application クラスを継承したクラスを作る

次に、クラスの実装ですが、Application クラスから派生させる他、

* [Application] 属性を付ける
* ``(IntPtr, JniHandleOwnership)`` なコンストラクタを用意する

ことが必要なようです。

こんなかんじ。

```c#:MyApplication.cs
namespace HelloXamarinAndroiid
{
    [Application] // この属性が必要らしい
    class MyApplication : Application
    {
        // このコンストラクタを明示的に override する必要があるらしい
        public MyApplication (IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {
        }

        public override void OnCreate()
        {
            base.OnCreate();
            // Test
            Android.Util.Log.Debug("MyApplication", "OnCreate called.");
        }
    }
}
```

アプリを動かすと、ログが出力されてるのでこの手順でいいのかと。

## 参考

* [Working with AndroidManifest.xml | xamarin](http://docs.xamarin.com/guides/android/advanced_topics/working_with_androidmanifest.xml) 公式。ちょっとこれだけじゃ分かんなかったっす。
* [c# - Custom Application child class in Mono for Android - Stack Overflow](http://stackoverflow.com/questions/9928386/custom-application-child-class-in-mono-for-android) Application そして StackOverflow のお世話に。
gist に git@~ でアクセスしたいブックマークレット

Gist がアップデートしてから、アクセスするための URL 表示が https になった。

https://gist.github.com/xxxxxxxx.git


でも git@~ でアクセスしたい。

git@gist.github.com:xxxxxxxx.git


それを実現するブックマークレット。 gist のページで実行すると、 Clone this gist に表示されているアドレスが変わる。

```javascript
javascript:var $field = $("input[name=url-field]"); var url = $field.val(); $field.val(url.replace("https", "git").replace("://", "@").replace("/", ":"));
```

面倒なので拡張にはしてない。
NSString 半角・全角の判定


NSStringに全角文字(マルチバイト文字)が含まれているかどうかの判定です。
検索してもシンプルな方法が見つからなかったので投稿します。

## [追記] よりシンプルな解決方法
NSStringの`- canBeConvertedToEncoding:`で[ASCIIコード](http://ja.wikipedia.org/wiki/ASCII)にロスなくエンコード出来るかどうかを調べる方法です。

```objectivec:使用例
[text canBeConvertedToEncoding:NSASCIIStringEncoding]
```

投稿のメソッドですと、 `\0` がNOと判定される問題もありましたので `- canBeConvertedToEncoding:` を使用した方がよさそうです。

*コメント欄にて[icecocoa6](http://qiita.com/users/icecocoa6)さんに教えて頂きました。
ありがとうございます。*

## サンプルコード
NSStringのlengthは半角も全角も1文字でカウントします。
C言語のstrlen関数は全角を2でカウントしますのでそれを利用します。

NSStringのカテゴリに実装しました。

```objectivec:NSString+Validation.h
@interface NSString (Validation)

- (BOOL)isAllHalfWidthCharacter;

@end
```
```objectivec:NSString+Validation.m
@implementation NSString(Validation)

- (BOOL)isAllHalfWidthCharacter
{
    NSUInteger nsStringlen = [self length];
    const char *utf8 = [self UTF8String];
    size_t cStringlen = strlen(utf8);
    if (nsStringlen == cStringlen) {
        return YES;
    } else {
        return NO;
    }	
}

@end
```

## 実行例

1文字でも全角が含まれているとNOを返します。

```objectivec:Sample.m
NSString *text = @"aiueo";
NSLog(@"%@", text.isAllHalfWidthCharacter ? @"YES" : @"NO");
// YES

text = @"あiueo";
NSLog(@"%@", text.isAllHalfWidthCharacter ? @"YES" : @"NO");
// NO
```
仮引数を破壊してはならない


表題の通り、メソッド内で仮引数に対し破壊的な操作を行なってはならいという話です。

細かい説明は省いて、以下に具体的な (ただしあまり現実的ではない) コードを示します。

```ruby
def strip_and_add_star(a)
  a.strip!
  "#{a}☆"
end

str = "  ねむい  "
new_str = strip_and_add_star(str)
p new_str #=> "ねむい☆"
p str     #=> "ねむい" # OPS!
```

メソッド `strip_and_add_star` 内で仮引数 `a` に対して `String#strip!` という破壊的操作を行なったことで、実引数である `str` の内容も変更されてしまいました。恐いですね。

たとえば、Rails プロジェクトで `some_method(options = {})` というメソッド中があったとして、その中で `options` に初期値を設定しようと `options.reverse_merge!(:foo => :bar)` と書かかれているケースをたまに見かけますが、これはメソッド呼び出し元の `options` の中身を書き換えていて危険です。
一見冗長に見えても `options = options.reverse_merge(:foo => :bar)` と書きましょう。
【Githubの使い方】ソースコードだけじゃもったいない！！

[達人出版会](http://tatsu-zine.com/)で、面白い試みしてました。
電子書籍のバージョンを管理するという試みです。
初版とか第n版とかありますけど、あれもひとつのバージョンなわけで、
一回買ってしまえば更新されたら無料で新しいバージョンの電子書籍に更新できるって素敵だなって思いました。

バージョン管理といえば

* Git
* Mercurial
* Bazzar
* Subversion

ですね。

達人出版会をみて、ソースコードだけをバージョン管理するのはもったいないと思い考えてみました。
(まぁ、Githubでブログしてる人はいますけど)

ソースコード -> ソース -> デミグラスソース -> ごはん -> レシピ

ってことで、料理レシピをバージョン管理してみました。

https://github.com/tienlen/cook_recipe/

第一弾はみんな大好きなカレーです。

GitHubを使うと、
バージョンを管理できるので、更新したら更新履歴まで全部見れます。
さらに、Markdownで書くとHTML形式でプレビューしてくれますし。

これって、デザインだけキレイにすれば、
 C●●kpadより良いんじゃない？

すごぃ！！伏字が伏字になってない！！ ∑(ﾟдﾟlll)ｶﾞｰﾝ
rsolrを使う

RubyからSolrを使うためのライブラリ[rsolr](https://github.com/mwmitchell/rsolr)の使い方覚え書き
[solr-ruby](https://github.com/erikhatcher/solr-ruby-flare)というのも見つけたけど、Solr4.1では使えないみたい

####インストール

```
$ gem install rsolr
```

Solrのインストール手順は省略、設定はデフォルトのまま

####使ってみる

```ruby:rsolr_sample.rb
require 'rubygems'
require 'rsolr'

url = "http://localhost:8983/solr"
solr = RSolr.connect :url => url

solr.add :id => 1234, :name => "rsolr sample", :price => 100
solr.commit #commitしないとインデックスに反映されないので注意

contents = (0..10).map do |id|
    {:id => id, :name => "sample-#{id}", :price => id * 100}
end

solr.add contents
solr.optimize
solr.commit

#デフォルトだと結果はHashで返ってくる
#:wt => json 等の指定でjsonやxmlでの取得も可能
res = solr.get 'select', :params => {:q=>'*:*', :start => 5, :rows => 5}

puts "get contents: #{res['response']['numFound']}"
res['response']['docs'].each do |doc|
    puts "#{doc['name']} #{doc['price']}"
end

solr.delete_by_id 1234
solr.delete_by_query 'name:"sample-5"'
solr.commit

res = solr.get 'select', :params => {:q=>'*:*'}
puts "get contents: #{res['response']['numFound']}"
res['response']['docs'].each do |doc|
    puts "#{doc['name']} #{doc['price']}"
end
```

####結果

```
$ ruby rsolr_sample.rb
get contents: 12
sample-5 500.0
sample-6 600.0
sample-7 700.0
sample-8 800.0
sample-9 900.0
get contents: 10
sample-0 0.0
sample-1 100.0
sample-2 200.0
sample-3 300.0
sample-4 400.0
sample-6 600.0
sample-7 700.0
sample-8 800.0
sample-9 900.0
sample-10 1000.0
```

簡単ですね
anything-imenuって便利ですね

最近、helmという文字列をよく見かけるようになりましたが、
まだまだanything使っております。

今日紹介したいのは、anything-imenuというanything関数で、
imenuというのはemacs標準に搭載されている機能で、
バッファ内の特定箇所に直接移動できる機能だとか。
これをanythingのインターフェイスで実行できるのがanything-imenuですね。
以上。

巨大なファイルでもこんな感じでぱっとメソッドの一覧を作成して、
anythingで軽々選択して移動できる。コードリーディングする時に便利ですね。
![anything-imenu](http://gyazo.com/e09c48c89f07c5852ba5a5d08b675421.png?1362310182)

使い方は簡単で、M-x anything-imenu を呼ぶだけ。
ちなみに自分はこれをC-rに割り当てました。

    (define-key global-map (kbd "C-r") 'anything-imenu)

ゴメン、emacsとanythingのこと何もわかってなかったよ・・・。

参考ページ：
[imenu.el の使い方と応用 — ありえるえりあ](http://dev.ariel-networks.com/Members/matsuyama/imenu/)