OmniAICreator/Qiita-1.07M huggingface dataset:
Qiitaに投稿した記事のリンクをfacebookにも投稿する

Qiitaに投稿していていつも思うのですが、

![facebookにも同時投稿したい！](https://lh6.googleusercontent.com/-ouf2JZ-KShc/T8N85IUOR2I/AAAAAAAAEJU/qg2T8REbBwk/s640/2012-05-28_22h20_21.png)

Twitterには投稿できるのに・・・

そこで、Qiitaに投稿したことをTwitter だけでなく、facebookにも投稿できるよう、
iftttのレシピを書いてみました。

# ifttt のレシピ

  自分がqiitaに投稿した記事のリンクをfacebookにも投稿する
  [http://ifttt.com/recipes/37719](http://ifttt.com/recipes/37719)

# 使い方

1. (iftttのアカウント取得、ログイン、facebook や Twitter へのCHANNEL接続の過程は省略します)

2. 上記のURLのレシピを開き、`your_twitter_id` の部分をあなたのTwitterIDに書き換えて、`Create Task`

```
"qiita.com/items/" AND from:your_twitter_id
```

3.  あとは、Qiitaに投稿するだけです。(Twitter投稿がトリガーになっているので、Twitter投稿にチェックを入れるのをお忘れなく)

# レシピ詳細

![レシピ画像](https://lh5.googleusercontent.com/-1g5eFLqI3f0/T8N87jdnKmI/AAAAAAAAEJc/z0n0KpdNo34/s640/2012-05-28_22h17_29.png)
GoogleLatitudeの公開バッジから現在の位置情報を取得する

GoogleLatitudeのブログパーツとして公開バッジを使うように設定しているユーザーの情報だけ取れる。
公開設定にすると誰でも現在地を取れるようになるので注意（or覚悟?）が必要


```ruby:latitude.rb
require 'open-uri'
require 'json'
# https://www.google.com/latitude/apps にjson apiのURLが書いてある。そこからIDを抜き出す
yuiseki = '4598697423011019361'
badge = "https://www.google.com/latitude/apps/badge/api?user=#{yuiseki}&type=json"
data = JSON.parse(open(badge).read())

# 精度
acrcy = data['features'].first['properties']['accuracyInMeters']
time = data['features'].first['properties']['timeStamp']
icon = data['features'].first['properties']['photoUrl']
lat = data['features'].first['geometry']['coordinates'][0]
lng = data['features'].first['geometry']['coordinates'][1]
# だいたいの住所もとれる
rgeo = data['features'].first['properties']['reverseGeocode']
puts rgeo

# Google Static Maps APIで500x100の静止画像にしてみる例
map = "http://maps.google.com/maps/api/staticmap?"+
      "center=#{lng},#{lat}" +
      "&zoom=15&size=500x100&sensor=false" +
      "&markers=icon:#{icon}|#{lng},#{lat}"
puts map
```

オマケ
ぼくの公開バッジ用JSON APIだと、
https://www.google.com/latitude/apps/badge/api?user=4598697423011019361&type=json
こういうJSON構造になっている

```javascript
{
  type: "FeatureCollection",
  features: [
    {
      type: "Feature",
      geometry: {
        type: "Point",
        coordinates: [
          139.7675734,
          35.7011698
        ]
      },
      properties: {
        id: "4598697423011019361",
        accuracyInMeters: 42,
        timeStamp: 1338202878,
        reverseGeocode: "日本, 東京都千代田区",
        photoUrl: "https://www.google.com/latitude/apps/badge/api?type=photo&photo=WZImkzcBAAA.Q47_7dfAqny0ALmGvVcg1w.ZDejmc8WR9myfjUomKHszQ",
        photoWidth: 96,
        photoHeight: 96,
        placardUrl: "https://www.google.com/latitude/apps/badge/api?type=photo_placard&photo=WZImkzcBAAA.Q47_7dfAqny0ALmGvVcg1w.ZDejmc8WR9myfjUomKHszQ&moving=true&stale=true&lod=1&format=png",
        placardWidth: 56,
        placardHeight: 59
      }
    }
  ]
}
```
ruby-gmailを使ってGmailの重要な未読メールの件数を知る

```bash
sudo gem install ruby-gmail pit mime
```

Pitの設定

```bash
ruby -e 'require "pit";Pit.set("google", :data=>{"username"=>"yuiseki", "password"=>"kogaidan"})'
```


```ruby:gmail.rb
#!/usr/bin/env ruby
require 'pit'
require 'gmail'

config = Pit.get('google')
gmail = Gmail.new(config['username'], config['password'])
important_and_unread = gmail.mailbox('[Gmail]/Important').count(:unread)
puts important_and_unread
```

ワンライナー

```bash
ruby -e 'require"pit"; require"gmail"; g=Pit.get("google"); p Gmail.new(g["name"], g["pass"]).label("[Gmail]/Important").count(:unread)'
```
24時間以内かどうかで書き込む内容を変える

データベースに保管されているタイムスタンプが**現在時刻の24時間以内かどうか**を調べ、
24時間以内なら現在時刻、
そうでなかったら保管されているタイムスタンプの24時間後の時間を
書き込むSQL文。

```24h.sql
update timelog set out_timestamp = 
(select if(now() > (in_timestamp + interval 24 hour), in_timestamp + interval 24 hour, now())
where …
```

たぶんこれで大丈夫。
（**24 hour**のところは**1 day**でもいいのかな？未確認。）

[MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.2 制御フロー関数 - http://dev.mysql.com/doc/refman/5.1/ja/control-flow-functions.html](http://dev.mysql.com/doc/refman/5.1/ja/control-flow-functions.html)

>IF(expr1,expr2,expr3)
expr1 が TRUE である場合は ( expr1 <> 0 および expr1 <> NULL ) 、IF() は expr2 を戻します。それ以外では、expr3 を戻します。IF() は、使用されている文脈によって、数値値もしくはストリング値を戻します。
Galaxy系端末でBitmapFactory.decodeResourceが失敗する

drawable配下においた画像のBitmapオブジェクトを取得するのは以下でいけるはずだが、
Galaxy系(4.0未満?)は失敗する(nullが返る)。
＃または、OpenGLのテクスチャに渡すとNGだったかも。ちょっと記憶が曖昧。

```java
Bitmap bmp = BitmapFacgtory.decodeRecouce(resourceId);
```

BitmapFactory#decodeStream/decodeByteArrayなどを使用すればいけるはず。

```java
InputStream is = null;

try{
	is = getResources().openRawResource(resourceId);
	Bitmap bmp = BitmapFactory.decodeStream(is);

}finally{
	if(is!=null){
		try {
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```
日付・時間を加算する

[TIMEDIFF - http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html](http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html)

たとえば明日の今なら

```test.sql
SELECT DATE_ADD(now(),INTERVAL 1 DAY);
```

もっと短く

```test.sql
SELECT now() + interval 1 day;
```

とも書ける。

dayとかyearとか。
onunload時にPOSTしたい時。

アクセスログを取るのに、PHPにPOSTでID等を渡しつつ、ページ読み込み時にpage_in_timestamp、離脱時にpage_out_timestampをデータベースに書き込みたかったのだが、

```Javascript
$(window).unload(function(){
	$.POST("hoge.php",{id='hoge'})
});
```
とか 

```Javascript
$(window).onbeforeunload(function(){
	$.POST("hoge.php",{id='hoge'})
});
```

とか書いても上手く動かなかった。

POSTしたかったら、

```Javascript
$(window).unload(function() {
	$.ajax({
		type: "POST",
		async: false,
		url: "hoge.php",
		data: "id=hoge",
		success: function(){}
	});
});
```

こうすればいいらしい。（実際にこれなら動いた。）

ミソは**`async: false`**。

[$.ajax() - http://api.jquery.com/unload/](http://api.jquery.com/unload/)
ここのコメントに書いてあった。

[jQuery.ajax(options) - jQuery 日本語リファレンス - http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/](http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/)

>async / boolean
>非同期通信フラグ。初期値ではtrue（非同期通信）で、リクエストが投げられてから応答があるまで、ユーザエージェントは非同期に処理を続行します。falseに設定（同期通信）した場合、通信に応答があるまでブラウザはロックされ、操作を受け付けなくなることに注意してください。

ふむ…？
auto-installのインストールおよび設定

auto-installをダウンロードしてバイトコンパイルします。

```
$ mkdir -p ~/.emacs.d/auto-install
$ cd ~/.emacs.d/auto-install
$ wget http://www.emacswiki.org/emacs/download/auto-install.el
$ emacs --batch -Q -f batch-byte-compile auto-install.el
```

Emacsの設定ファイルに下記を追加してEmacsを再起動します。

```common-lisp:~/.emacs.d/init.el
;; (install-elisp-from-emacswiki "auto-install.el")
(require 'auto-install)
(add-to-list 'load-path auto-install-directory)
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
```
さっそくGTAでDPの練習

チェスのナイトが盤面の端から端まで特定の手数で移動する経路をすべて求める。
typelevel-tensor と numeric-prelude も必要。

```haskell:Knight.hs
#!/usr/bin/env runhaskell
{-# LANGUAGE NoImplicitPrelude, RecordWildCards #-}
{-# OPTIONS -Wall #-}
module Main where
import Data.Maybe
import Data.Tensor.TypeLevel
import GTA.Data.JoinList
import GTA.Core hiding (items)
import NumericPrelude



knightMoves :: [Vec2 Int]
knightMoves =  [Vec :~ x :~ y | x <- [-2..2], y<-[-2..2], x^2 + y^2 == 5]

canMoveTo :: Vec2 Int -> Vec2 Int -> Bool               
canMoveTo a b = (a - b) `elem` knightMoves

bdSize :: Int
bdSize = 8

maxStep :: Int
maxStep = 7


knightSeq' :: JoinList (Vec2 Int) -> Bool
knightSeq' = isJust . ws
  where
    ws Nil = Just Nothing
    ws (Single r) = Just $ Just (r,r)
    ws (x1 `Times` x2) = do
      a1 <- ws x1
      a2 <- ws x2
      case (a1, a2) of
        (Nothing, _) -> return a2
        (_, Nothing) -> return a1
        (Just (r0,r1),Just (r2,r3)) 
          | canMoveTo r1 r2 -> return $ Just (r0,r3)
          | otherwise       -> Nothing


knightSeq :: (Maybe a -> Bool, JoinListAlgebra (Vec2 Int) (Maybe (Maybe (Vec2 Int, Vec2 Int))))
knightSeq = (isJust) <.> ws
  where
    ws = JoinListAlgebra{..} where
      nil = Just Nothing
      single r = Just $ Just (r,r)
      x1 `times` x2 = do
        a1 <- x1
        a2 <- x2
        case (a1, a2) of
          (Nothing, _) -> return a2
          (_, Nothing) -> return a1
          (Just (r0,r1),Just (r2,r3)) 
            | canMoveTo r1 r2 -> return $ Just (r0,r3)
            | otherwise       -> Nothing


knightSeq2 :: (Maybe a -> Bool, JoinListAlgebra (Vec2 Int, t) (Maybe (Maybe (Vec2 Int, Vec2 Int))))
knightSeq2 = (isJust) <.> ws
  where
    ws = JoinListAlgebra{..} where
      nil = Just Nothing
      single (r,_) = Just $ Just (r,r)
      x1 `times` x2 = do
        a1 <- x1
        a2 <- x2
        case (a1, a2) of
          (Nothing, _) -> return a2
          (_, Nothing) -> return a1
          (Just (r0,r1),Just (r2,r3)) 
            | canMoveTo r1 r2 -> return $ Just (r0,r3)
            | otherwise       -> Nothing




fromTo :: Eq a => a -> a -> (a1 -> a1, JoinListAlgebra (a, Int) Bool)
fromTo start goal = id <.> joken where
  joken = JoinListAlgebra{..}
  c1 `times` c2 = c1 && c2
  single (r,n) 
    | n == 1       = start == r
    | n == maxStep = goal  == r
    | otherwise    = True
  nil = True

main :: IO ()
main = do
  putStr $ pprint2$ assigns [Vec :~ x :~ y| x<- [1..bdSize], y<-[1..bdSize]] [1..maxStep]  
    `filterBy` knightSeq2 
    `filterBy` fromTo (Vec :~ 1 :~ 1)  (Vec :~ bdSize :~ bdSize) 
    `aggregateBy` result 
  return ()


pprint :: Bag (JoinList (Vec2 Int)) -> String
pprint (Bag xs) = unlines $ map (unwords . map (\ (Vec :~ x :~ y) -> show x ++ "," ++ show y) . dejoinize) xs

pprint2:: Bag (JoinList (Vec2 Int,Int)) -> String
pprint2(Bag xs) = unlines $ map (unwords . map (\ ((Vec :~ x :~ y),_) -> show x ++ "," ++ show y) . dejoinize) xs

```
GoogleMaps polyline をdecodeしてMKPolylineを作成する

```objectivec
+ (MKPolyline*)polylineWithEncodedString:(NSString*)encodedString
{
    NSUInteger length = [encodedString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    NSUInteger count = length / 4;
    CLLocationCoordinate2D *coords = calloc(count, sizeof(CLLocationCoordinate2D));
    NSUInteger coordIdx = 0;
    
    NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[encodedString length]];  
    [encoded appendString:encodedString];  
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"  
                                options:NSLiteralSearch  
                                  range:NSMakeRange(0, [encoded length])];  
    NSInteger len = [encoded length];  
    NSInteger index = 0;  
    NSInteger lat=0;  
    NSInteger lng=0;  
    while (index < len) {  
        NSInteger b;  
        NSInteger shift = 0;  
        NSInteger result = 0;  
        do {  
            b = [encoded characterAtIndex:index++] - 63;  
            result |= (b & 0x1f) << shift;  
            shift += 5;  
        } while (b >= 0x20);  
        NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));  
        lat += dlat;  
        shift = 0;  
        result = 0;  
        do {  
            b = [encoded characterAtIndex:index++] - 63;  
            result |= (b & 0x1f) << shift;  
            shift += 5;  
        } while (b >= 0x20);  
        NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));  
        lng += dlng;  
        NSNumber *latitude = [[[NSNumber alloc] initWithFloat:lat * 1e-5] autorelease];
        NSNumber *longitude = [[[NSNumber alloc] initWithFloat:lng * 1e-5] autorelease];
        
        CLLocationCoordinate2D coord = CLLocationCoordinate2DMake([latitude doubleValue], [longitude doubleValue]);
        coords[coordIdx++] = coord;
        if (coordIdx == count) {
            NSUInteger newCount = count + 10;
            coords = realloc(coords, newCount * sizeof(CLLocationCoordinate2D));
            count = newCount;
        }
    }
    MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coords count:coordIdx];
    free(coords);
    [encoded release];
    return polyline;
}


```
コマンドプロンプト上で、ctrl+v で貼りつけできるようにする

AutoHotKeyをインストールして、以下のファイルを実行・常駐させれれば、コマンドプロンプト上で `CTRL`+`V`で貼り付けができるようになります。

```ahk:paste_commandprompt.ahk
#IfWinActive ahk_class ConsoleWindowClass
^v::
  keywait, ctrl
  Send, !{SPACE}ep
  return

#IfWinActive
```
TeXにpng画像を挿入するときの注意

2と3はどちらかのみで構わない。

1. プリアンブルに `\usepackage[dvipdfmx]{graphicx}` のように dvipdfmx を付けて記述(colorを使用する場合、そちらにも `\usepackage[dvipdfmx]{color}` のように dvipdfmx を付けなければならない)。
2. `$ extractbb hoge.png` で xbb ファイルを作成する(/usr/local/texlive/texmf/web2c/texmf.cnf の shell_escape_commands に extractbb を記述しておけば自動的に xbb ファイルを作成してくれるので便利)
3. `\includegraphics[bb=0 0 1000 1000,width=0.8\textwidth]{hoge.png}` のように四隅を「bb=」以降に記述。

2は以下のように `extractbb,\` を追記する。

```
shell_escape_commands = \
bibtex,bibtex8,\
kpsewhich,\
makeindex,\
repstopdf,\
extractbb,\
```
LIBEAY32.DLL 関連のエラー -> OpenSSLの最新DLLを入れれば解決

アプリケーションを動かそうとして以下のようなエラーが出る場合、OpenSSLの最新DLLをインストールすれば解決

* 「序数 xxxx がダイナミックライブラリLIBEAY32.DLLから見つかりませんでした。」
* 「LIBEAY32.DLLが見つからなかったため、このアプリケーションを開始できませんでした。～」


# 手順

32bit Windows の場合は、以下の手順でダウンロード

1. [Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)](http://www.microsoft.com/downloads/ja-jp/details.aspx?familyid=a5c84275-3b97-4ab7-a40d-3802b2af5fc2) をインストールする

2. [Win32 OpenSSL](http://slproweb.com/products/Win32OpenSSL.html) をインストールする（リストの一番上の「Win32 OpenSSL v1.0.1c Light」でOK）

以上で　問　題　解　決　！
TeX Live 2011 で日本語が含まれたソースコードを扱う

TeX Live 2011 には listings は含まれるが、これを使用すると日本語のコメントがコメントとして認識されないなどの不具合が生じる。
この問題を解消するには、jlisting をインストールすれば良い。Ubuntu であれば以下の通り。

1. http://mytexpert.sourceforge.jp/index.php?Listings から jlisting をダウンロードし解凍する。
2. 「sudo mv jlisting.sty /usr/local/texlive/texmf-dist/tex/latex/listings」でダウンロードしたstyファイルをtexliveディレクトリに配置する(移動先はインストール環境によって異なる)。
3. 「sudo mktexlsr」を実行する。
クラス定義用のあれ

一つの式でクラスを定義できるようにfunctionオブジェクトにメソッドを生やしてみる。一応、Function.prototypeは汚さず、IE6でも動く感じにしてみた。うん、読みにくいですね。。

```javascript
function Class(c) {
    if (c == null) {
        c = function(){};
    }
    c.extend = _extends;
    c.mixin = _mixin;
    c.statics = _static;
    return c;
}
function _extends(uber) {
    function f(){}
    f.prototype = uber.prototype;
    this.prototype = new f;
    return this;
}
function _mixin() {
    var i=0, len=arguments.length
      , prop
      , cur
      , proto=this.prototype
      ;
    for (; i<len; i++) {
        cur = arguments[i];
        for (prop in cur) {
            proto[prop] = cur[prop];
        }
    }
    return this;
}
function _static() {
    var i=0, len=arguments.length
      , prop
      , cur
      ;
    for (; i<len; i++) {
        cur = arguments[i];
        for (prop in cur) {
            this[prop] = cur[prop];
        }
    }
    return this;
}

```


```javascript:使い方
/*
var クラス名 = Class(コンストラクタ関数)
.extend(親クラス)
.mixin(インスタンスメソッドをまとめたオブジェクト, [...複数指定可能...] )
.statics(クラスメソッドをまとめたオブジェクト, [...複数指定可能...] );

必要ない句は省略できる。
*/

var Bird = Class(function(name){this.name = name})
.mixin({
    fly: function(){
        console.log(this.name + "はぱたぱた飛ぶよ");
    }
});

var b = new Bird('ぴよぴよ');
b.fly();

var Penguin = Class(function(name){
    Bird.call(this,name)
}).extend(Bird)
.mixin({
    fly: function(){
        console.log(this.name + "は飛べないんだ…");
    },
    swim: function(){
        console.log(this.name + "はすいすい泳ぐよ");
    }
});

var p = new Penguin('ぺんぺん');
p.fly();
p.swim();
```
ブログを継続的に書くための7つのルール


[自身のブログ](http://d.hatena.ne.jp/tuto0621/)に記事を継続的に書くことを今年の目標にしていたのだけど、言うは易しというやつでなかなか続かない。その理由を時間をとって考えてみた。思考ツールにはiPhoneアプリの[なぜなぜアナリスト](http://energist.web.fc2.com/5whysanalyst/japanese.html)を使った。

これからは以下のことに気をつけながら書いてみる。

- 締め切りを設ける、毎週..曜日とか
- 記事のストックを3個位作っておく
- [ポモドーロ](http://stack3.com/old/pomodoro_technique.html)を使って一回に書く時間を絞る
- 推敲出来る状態まで一気に書く
  - 全ての書きたいことを吐き出すまでは戻らない
  - 何度も行頭の書き出しを書き直したりしない
- kobitoで書く、後ではてブ記法に変換して投稿
  - 使いやすいエディタを選ぶ
- 次に書く記事のリストを作っておく
- タイトルは公開ギリギリまでよく練る

皆さんがブログを継続的に書くために気をつけていることがあったら、教えてもらえると嬉しいです。
SETX コマンドで環境変数を永続的に設定する

環境変数PATHに永続的に値を設定したい場合には、
[システムのプロパティ → 詳細設定 → 環境変数] と画面を辿るよりも、`SETX` コマンドを使う方が楽です。

![環境変数設定画面](https://lh6.googleusercontent.com/-k3ElmdWNkg4/T8GO1X_rl3I/AAAAAAAAEI8/IXkvps9l6Lo/s800/2012-05-27_11h12_30.png)

* ユーザー環境変数に値をセットする場合 `SETX    [環境変数名] [値]`
* システム環境変数に値をセットする場合 `SETX /M [環境変数名] [値]`

# 環境変数PATHに値をセットする(上書き)

## ユーザー環境変数に値をセットする場合

```bat:sample_set_to_user_environment_variable.bat
> SETX DropboxDir "c:\users\foo\dropbox"
```

## システム環境変数に値をセットする場合

```bat:sample_set_to_system_environment_variable.bat
> SETX /M DropboxDir "c:\users\foo\dropbox"
```

# 環境変数PATHに値を追加する

## システム環境変数に値をセットする場合

```bat:sample_add_system_path.bat
> SETX /M PATH "%PATH%;c:\users\foo\dropbox"
```
Uint8Array を Int16Array にキャストする

TypedArray を別の TypeArray のコンストラクタに入れると、そのまま変換して新しい TypedArray を生成します。

```js:copy.js
a = new Uint8Array([0x01, 0x00, 0x01, 0x80]); // [ 1, 0, 1, 128 ]
b = new Int16Array(a);                        // [ 1, 0, 1, 128 ]
b[0] = 10;
a[0] !== 10; // 更新されない
```

TypedArray#buffer を TypedArray のコンストラクタに入れると、同じデータを参照しながらキャストします。

```js:cast.js
a = new Uint8Array([0x01, 0x00, 0x01, 0x80]); // [ 1, 0, 1, 128 ]
b = new Int16Array(a.buffer);                 // [ 1, -32767 ] == [ 0x0001, 0x8001 ]

b[0] = 10;
a[0] === 10; // 更新される
```

たとえば外部のバイナリデータを読み込んでデコードしたいときなどに便利です。
[RubyMotion]Sublime Text2で補完を行う



![catch](http://pchw.github.com/images/st2.png)

ついに来ました！

いままで，RubyMotionを書いていて補完が効くのはVimとredcarとTextMateだけでした！
ところが，RubyMotionのフォーラムに「[RubyMotion] Sublime Text 2 Support」という質問が投げかけられ，ついに今日そのパッケージが登場しました！

[RubyMotionSublimeCompletions](https://github.com/diemer/RubyMotionSublimeCompletions)

インストール方法は簡単で，
    
    $ cd ~/Library/Application Support/Sublime Text 2/Packages
    $ git clone git://github.com/diemer/RubyMotionSublimeCompletions.git

してSublime Text2を再起動すればOKです．

PackageControlを導入している人なら，

    Cmd+Shift+p
    Package Control: Add Repository
    https://github.com/diemer/RubyMotionSublimeCompletions
    Package Control: Install Package
    RubyMotionSublimeCompletions

でインストール出来るはずです．

後は，普通にエディタを起動して`UIApp`とか打てば，補完に`UIApplication`とか`UIAppearance`とか出るようになります！
Twigのdate関数



Twig1.6からdate関数が導入されたらしい。こんな感じで使えるそうな。


```twig
{% if date(user.created_at) < date() %}

    {# always! #}

{% endif %}
```


date関数の引数が空の場合、今日の日付が返される。
1.6.1ではこれの残対応としてタイムゾーンをサポートしているとのこと。
日付比較ができるようになったのはかなりありがたい。
Perlモジュールの読み込みに失敗する場合のチェックポイント

結論から言うと 3 のケースがいっちゃんだるい。

　
## 1. モジュールのパス通してるか

### このケースの典型エラーメッセージ

Can't locate Foo/Bar.pm in @INC

（※ 後述するがパスを通してない以外の原因でもこのメッセージが出ることがある）

### 対処法

use lib 'モジュールを置いてる Dir'; のしわすれてると思われる。ので、する。

use lib ってなんぞ？ とか @INC がわからない場合はここを読むいいでしょう。

[モジュールの検索パスを調べる @INC - サンプルコードによるPerl入門](http://d.hatena.ne.jp/perlcodesample/20080428/1209380085)

さらに詳しい解説がほしいばあいは perldoc -v @INC するもよし、あるいはほとんどのPerl入門書に解説が書いてるのでそれを読むもよし。

　
## 2. モジュールの最後で 1; してるか

### このケースの典型エラーメッセージ

Foo/Bar.pm did not return a true value at ...

### 対処法

モジュールの最後で 1; する。（真を返す値ならなんでもいいけど）

　
## 3. パッケージ名の Typo

まともなエラーが出ない場合があるから一番めんどくさい

### チェックポイント

a. そのモジュールを使うスクリプトのなかで正しい名前で use してるか
b. そのモジュールのディレクトリとファイル名が合ってるか（Foo::Bar というモジュールなら Foo/Bar.pm という名前が合ってるか）
c. そのモジュール内の **パッケージ宣言で記述した名前があってるか（Foo/Bar.pm 内で package Foo::Bar; と確かに正しく書かれているか）**

a と b は Can't locate ... とエラーが出て死ぬからまだ気づきやすいんだけど、b のケースは **ロードまでは成功してしまう（メソッドを呼ぼうとした時点で突然の死を迎える）** から一番厄介。

逆に言うと、**ロードは成功してるのに メソッドの呼び出し で「そんなメソッドねーよ！」と怒られて死ぬ（確かに定義してるのに！）場合は、 c のケースを疑うと良い** でしょう。
[TwitterBoostrap]画面上部のメニュー（ナビゲータ）

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <title></title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="navbar navbar-fixed-top">
        <div class="navbar-inner">
            <div class="container">
                <a class="brand" href="">kuwa.jp</a>
                <ul class="nav">
                    <li class="active"><a href="">Home</a></li>
                    <li><a href="">Menu</a></li>
                </ul>
            </div>
        </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</body>
</html>
```
[TwitterBoostrap]テキストボックスの予測変換

aっていれるとapple,action,archive,antがでる。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <title></title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container">
    <input type="text" class="span3" data-provide="typeahead" data-items="4" data-source='["apple", "action", "archive", "ant"]'>
  </div>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  <script src="js/bootstrap.min.js"></script>
</body>
</html>
```
Google App Engineのpythonのバージョンが噛み合わない問題について


Google App Engineでpythonは2.5と2.7が動く。どちらを使うかは、アプリのapp.yamlのruntimeの記述によって変わる。下記参照。それと、もしかしたら古いGAEだと参照できない新しいGAEのライブラリなんかがあっても不思議ではない。古いGAEは2.5で動き、新しいGAEは2.7で動く。

```yaml:python2.5の場合のapp.yaml
runtime: python
```
```yaml:pytnon2.7の場合のapp.yaml
runtime: python27
```

それと、GAEのランチャーをアクティブにした状態で"command + ,"するとpreferencesが起動し、参照しているpythonを変更ができる(はず)。

ちなみに、terminalで確認できる自分のpythonのバージョンは2.7.1で、GAEのランチャーが参照しているpythonもそれに合わせている。今使っているpythonはpathやバージョンを見るに、lionのデフォのpython。今ざっと開発したアプリを起動したりして動作確認した限りでは特に問題はないが、lionにしてからあまりGAEを触っていないので信用ならない。

```sh:pythonのパスやバージョンなど
%which python
/usr/bin/python
% python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>
```
Elastic Load Balancer(ELB)の概要（ほぼ和訳）


特徴をつらつらとまとめてみる。

Overview
http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/arch-loadbalancing.html

# 生存確認をするよ

デフォルトでELBに関連付けたインスタンスに生きてるか確認するリクエストをELBは送るよ。

portやリクエスト先のURLは指定できるよ。
自分は専用のendpoint作ってそれで確認できるようにしてるよ！

ちなみに、動的なアプリケーションが動いているならそっちで受け取ったほうがいいよ。
静的ファイルだとApacheやnginxが落ちてないのは確認出来るけど、
奥のunicornやmongrelやpassengerらへんで詰まってるかもよ！

# SSL楽チンだよ

ロードバランサーに証明書と秘密鍵をアップロードするだけでいいよ。
それぞれのインスタンスに証明書たちを配備したり、
設定する必要がないので楽だよ。

というのも、SSL Terminationとして知られているけど、
clientとELBの間はHTTPSで通信するけど、
ELBとinstance(s)の間はHTTP(port=80)で通信するよ。

# clientのIPもとれるよ

clientとappサーバーのみだったら、
間に邪魔する奴はいなかったので簡単にclientのIPがとれたけど、
間にELBがいるからappサーバーからremote_ipをとろうとするとELBのIPになっちゃうよ。萎え。

でも、ちゃんと対処法があって、
request headerに以下のheaderが付与されるよ！

```
X-Forwarded-For: clientIPAddress
```

簡単だね！

ただ、場合によってはELBが複数枚噛んでる場合があって、
詳しくは割愛するけど、複数のIPアドレスが入ってる可能性があるよ！

```
X-Forwarded-For: clientIPAddress, previousLoadBalancerIPAddress
```

気をつけてね！自分はこれで少しハマったことがあるよ！

# clientとのプロトコルもとれるよ

例えば、HTTPできたひとはHTTPSにリダイレクトしたいとする。
でも、先の通りELBとinstanceの間の通信は常にHTTP（にしないのもできるけど、メリットがね）だから、
clientとELB間のプロトコルが分からないよ！

なので、IPのときと同様にheaderを付与するよ！

```
X-Forwarded-Proto: originatingProtocol
```

これで分かるね！
instanceはこのheaderをみてhttpアクセスの人はhttpsのアドレスにリダイレクトするとかするんだね。

--

結局はただの和訳なんだけど、
ゆるーく書いてみた。
Debian Vim でヤンクしてクリップボードへ

Debian の Vim (7.3) でヤンクしたテキストをブラウザなどに貼り付ける方法。

適当にググると「`set clipboard=unnamed` or `set clipboard+=unnamed` すると良い」みたいな情報がたくさん出てきたが、これを試してみてもうまくいかなかった。もう少し調べてみると、[Accessing the system clipboard - Vim Tips Wiki](http://vim.wikia.com/wiki/Accessing_the_system_clipboard) に「`set clipboard=unnamedplus` すると良い」と書いてあった。これを .vimrc に書き加えて大勝利！

ちなみになぜか = ではなく += にして (`set clipboard+=unnamedplus`) みたら、これまた上手く行かなかった。理由はよく分かってない。
反則技 git push -f

このエントリーは[Gitアドベントカレンダー](http://qiita.com/advent-calendar/git)の15日目です。

今回紹介するコマンドは、基本的には反則技と言われる事が多いです。一人プロジェクトにおいて自己責任で利用するコマンドと考えた方が良いと思います。複数人で管理しているプロジェクトで実行すると、色々困った事になる事が多いです。私は、一人プロジェクトにおいてremote reposigitoryをbackupとして位置づけている場合に利用する事が有ります。

```git commit```したあとに直前のメッセージの変更やcommit内容の変更を修正する際には ```git commit --amend``` をします。
もっと過去の歴史を書き換えたい場合は```git rebase -i```というコマンドで書き換える事が可能です。

しかし、すでに```git push```した後に上記のようにcommit内容を修正してもremoteとlocaleのrepositoryに不整合が生じてしまうので```git push```時にエラーとなります。

その際には、

```
git push -f origin master 
```

する事で、強制的にpushする事が出来ます。ただし、複数人での作業時に、```git push```時にエラーが発生するからとりあえず```git push -f```とすることは絶対に避けましょう。

その他のシーンで```git push -f```を利用する事例が、Heroku Dev Centerの[Deploying with Git](https://devcenter.heroku.com/articles/git)に記載されています。
ClearSilver on Mac OS X


## 取得
```sh
wget http://www.clearsilver.net/downloads/clearsilver-0.10.5.tar.gz
tar zxvf clearsilver-0.10.5.tar.gz
cd clearsilver-0.10.5
```


## 64bit環境にあわせて修正
```diff
--- cs/cs.h	2012-04-06 07:21:10.000000000 +0900
+++ cs/cs.h	2012-04-06 07:21:35.000000000 +0900
@@ -111,7 +111,7 @@
   CSTOKEN_TYPE op_type;
   char *argexpr;
   char *s;
-  long int n;
+  int n;
   int alloc;
   struct _funct *function;
   struct _macro *macro;
--- cs/csparse.c	2007-07-12 11:37:34.000000000 +0900
+++ cs/csparse.c	2012-04-06 07:22:41.000000000 +0900
@@ -4250,7 +4250,7 @@
       {
 	if (node->arg1.op_type == CS_TYPE_NUM)
 	{
-	  snprintf (buf, blen, "%ld ", node->arg1.n);
+	  snprintf (buf, blen, "%d ", node->arg1.n);
 	}
 	else if (node->arg1.op_type == CS_TYPE_MACRO)
 	{
@@ -4267,7 +4267,7 @@
       {
 	if (node->arg2.op_type == CS_TYPE_NUM)
 	{
-	  snprintf (buf, blen, "%ld", node->arg2.n);
+	  snprintf (buf, blen, "%d", node->arg2.n);
 	}
 	else
 	{
@@ -4284,7 +4284,7 @@
 	{
 	  if (arg->op_type == CS_TYPE_NUM)
 	  {
-	    snprintf (buf, blen, "%ld ", arg->n);
+	    snprintf (buf, blen, "%d ", arg->n);
 	  }
 	  else
 	  {
```

## make
```sh
./configure --disable-apache --disable-java --disable-ruby --disable-python --disable-perl --disable-csharp --enable-gettext
make
sudo make install
```
http://www.barneyb.com/barneyblog/2006/12/07/clearsilver-on-osx/
シェルからEmacsを立ち上げるときの起動を速くする

Emacsを一つ立ち上げっぱなしにして、シェルからファイルを編集するときにいちいちEmacsを新しく立ち上げないで、その立ち上がっているEmacsで編集できるようにする設定をします。

```common-list:.emacs.d/init.d
;;; emacsclient
(server-start)
(defun iconify-emacs-when-server-is-done ()
  (unless server-clients (iconify-frame)))
;; 編集が終了したらEmacsをアイコン化する
(add-hook 'server-done-hook 'iconify-emacs-when-server-is-done)
;;  C-x C-cに割り当てる
(global-set-key (kbd "C-x C-c") 'server-edit)
;; M-x exitでEmacsを終了できるようにする
(defalias 'exit 'save-buffers-kill-emacs)
```

再起動してEmacsを立ち上げます。シェルから下記を実行すると最初に立ち上げたEmacsで編集ができるようになります。

```
$ emacsclinet test.txt
```

ちょっとした設定ファイルをいじるときはemacsだと起動が遅かったのでviを使っていたのですが、これでemacsでもよくなりそうです。

## 参照

「Emacsテクニックバイブル」P91
気になる動的デザインサイトのJS研究に役立つツール

すごいカッコいい動きのサイトを見ると、どう動いてるか知りたくなる？
大抵のサイトではJSは圧縮されていてかなり読みづらいけど、圧縮率がある程度低かったり、探究心がハンパない場合は、以下のサービスを使えば研究できるかも。

http://jsbeautifier.org/
Capistranoで"Could not parse object"


RVM 1.14.2
Ruby 1.9.3p194

capistrano (2.12.0)
capistrano-ext (1.2.1)

--

こんなふうにでたんよ。

```bash
fatal: Could not parse object '789740e97a03558cf252c988b50b05a331dea386'.
```


```ruby:deploy.rb
set :deploy_via, :remote_cache
```


参考
Deploying with Capistrano
https://help.github.com/articles/deploying-with-capistrano

remote_cacheってのはremoteサーバーにgitリポジトリをlocalに作って、
デプロイの度にクローンするんじゃなくて差分だけ落とすだけにする方法。
そのリポジトリが壊れた可能性があるから、それを消そうって解決策が載ってた。
https://groups.google.com/group/capistrano/browse_thread/thread/60de741e9691de12


```bash
cd shared/
rm -rf cached-copy/
```

で解決した。
facebook graph api explorerを使ってapiを叩く


facebookのapiを簡単に叩いて実行できるwebアプリ。
https://developers.facebook.com/tools/explorer

##例:お友達が減ったときに調べる手順

###1.facebook graph api explorerを使って友達のjsonを取得
下記をGETの横のテキストボックスに入力
https://graph.facebook.com/me/friends

###2.友達の情報をjavascriptで読み込んで差分を取る
上記で出力した結果をchromeのdebugging toolsにコピペして適当な変数に格納して、下記の関数で引数にとって実行すると、友人の名前一覧が表示される。
その結果を適宜保存しておけば、お友達がいなくなったときにすぐにわかる。

```javascript
facebook_friend = function(o){
  friends = o.data;
  for(var i = 0;i<friends.length;i++){
    console.log(friends[i].name);
  }
}
~/.ssh/config のホスト名を一覧表示するだけ

``` perl
#!/usr/bin/perl
open my $f, $ENV{HOME} . '/.ssh/config' or die 'config無いよヽ(゜▽、゜)ノ';
my $filter = $ARGV[0];
$filter and $filter =~ s/\//\\\//g;
print grep {  $filter ? /$filter/ : 1 } map { /Host\s+(\S+)/ and "$1\n" } grep { /Host\s+/ } <$f>;
close $f;
```
AutoHotKey_L でCOMを利用してiTunes を操作する

このファイルを常駐させて、

* `WIN`+`LEFT` で前の曲
* `WIN`+`RIGHT` で次の曲

Appのアップデートも自動化出来ないかな・・・？

```ahk:SampleControliTunes.ahk
; control iTunes
;
iTunes := ComObjCreate("iTunes.Application")

#right::
  iTunes.NextTrack()
  return

#left::
  iTunes.PreviousTrack()
  return
```

# 参考
* [Using iTunes with AutoHotkey_L - Andrew Guyton's Blog](http://www.disavian.net/itunes-autohotkeyl/)
How to Install Lighttpd for Mac


昨日書いたJSONPのネタを検証するためにローカル環境にlighttpdを入れたのでその手順です。
昨日書いたネタはこちら[JSONPとJSON](http://qiita.com/items/b08f6bcf6f7b45013eac)

私の環境はMacなのでMacPortでインストールします。

```commandline
$sudo port install lighttpd

$ pwd
/opt/local/etc/lighttpd

$ ls -ltr
total 64
-rw-r--r--   1 root  admin   3235  5 11 12:22 modules.conf.default
-rw-r--r--   1 root  admin   3235  5 11 12:22 modules.conf
-rw-r--r--   1 root  admin  10918  5 11 12:22 lighttpd.conf.default
-rw-r--r--   1 root  admin  10918  5 11 12:22 lighttpd.conf
drwxr-xr-x  50 root  admin   1700  6 13 22:59 conf.d

$sudo mkdir /etc/lighttpd/

$sudo ln -s lighttpd.conf /etc/lighttpd

```	


以下のように lighttpd.confを修正

```setup 
$cd /opt/local/etc/lighttpd

$diff lighttpd.conf lighttpd.conf.default

88c88
< server.port = 9999
---
> server.port = 80
98c98
< server.bind = "localhost"
---
> #server.bind = "localhost"
191c191
< #server.network-backend = "linux-sendfile"
---
> server.network-backend = "linux-sendfile"
ytakata:lighttpd TakataYasushi$ 

```

起動の方法

```commandline
$lighttpd -f /opt/local/etc/lighttpd/lighttpd.conf

/opt/local/www/htdocsにおかれたファイルにアクセスされる

//シャットダウン
kill -3 [PID]
```
リストの要素数を数えるコードの速度比較

配列をスカラコンテキストで評価すると要素数が返ってきますが、リストの要素数を直接的に取得する方法がありません。

なのでリストの要素数を数える方法を色々試してみた結果。

ベンチマークスクリプト
---

```perl:list_count.pl
#!/usr/bin/env perl

use strict;
use warnings;
use Benchmark qw/cmpthese/;

sub get_list { 1 .. 1_000_000 }

cmpthese(
  -5,
  +{
    q/alias/ => sub { sub { 0 + @_ }->(get_list) },
    q/anon_array/ => sub { 0 + @{[get_list]} },
    q/array/ => sub { 0 + (my @ary = get_list) },
    q/empty_assign/ => sub { scalar (() = get_list) },
    q/grep/ => sub { scalar grep 1, get_list },
  }
);
```

各手法の説明
---

- `alias` - 無名サブルーチンに引数として渡し、`@_` の要素数を取得
- `anon_array` - 無名配列を作り、その場でデリファレンスして要素数を取得
- `array` - 配列にコピーし、その要素数を取得
- `empty_assign` - 空リストに代入してスカラコンテキストで評価 (http://d.hatena.ne.jp/fbis/20071113/1194931452 を参考にしました)
- `grep` - 各要素を恒真式で `grep` した結果をスカラコンテキストで評価

結果
---

Perl 5.14.2 で走らせた結果は以下の通り：

```
               Rate empty_assign       array  anon_array        grep       alias
empty_assign 7.68/s           --         -2%        -10%        -17%        -39%
array        7.84/s           2%          --         -9%        -15%        -37%
anon_array   8.57/s          12%          9%          --         -7%        -31%
grep         9.21/s          20%         18%          8%          --        -26%
alias        12.5/s          63%         60%         46%         36%          --
```

まとめ
---

試した中では `alias` が一番速くて、すごいなあと思いました (小並感)。

`@_` は実引数のエイリアスなので、要素をコピーするコストがない分速いのだと思われます。

次点は `grep` でした。スカラコンテキストの `grep` は式が真となるような要素数を返しますが、あまり知られていない気がします。個人的には `alias` よりも読み易いので専らこれを使っています。
デリゲートをコールする


XOOPS Cubeにはデリゲートと言われる、イベントファイアの仕組みがあります。デリゲートは自由に追加、ファイアすることができます。イベントに対するコールバック(オブザーバー)は、通常 preload を利用します。

デリゲートは次のようにファイアすることができます。

```php
XCube_DelegateUtils::raiseEvent('デリゲート名');
```

デリゲート名には、慣習的に半角英字とドット(.)を使用します。命名規則などは特に決まっていませんが、他のデリゲートとかぶらないように、モジュール名を接頭辞に使用するといいでしょう。

たとえば、bulletinモジュールで記事を保存したタイミングでイベントをファイアする場合は次のようにします。

```php
XCube_DelegateUtils::raiseEvent('Bulletin.Article.Save');
```

コールバックに変数を渡す場合は、第二引数以降に変数をセットします。

次の例では、作成された記事と作者の情報を渡す例です。

```php
XCube_DelegateUtils::raiseEvent('Bulletin.Article.Save', $articleObject, $autherInfo);
```

このようにXOOPS Cubeではデリゲートと言われるイベント処理を利用することができます。
ps コマンドの総和

ps コマンドの出力の、メモリー使用量の総和

```shell
> ps awwux --forest | awk '{if ($6 != "RSS") print $6}' | paste -sd+ | bc
138780
> ps awwux --forest | awk '{if ($5 != "VSZ") print $5}' | paste -sd+ | bc
4140544
```

## *注意* 

2019/06/11 今頃追記

Mac OS10.x の場合は `paste` が Gnu CoreUtils のものではないので、`brew install coreutils` でインストールした `paste` を使わないと動かないかと思われます。多分。
zsh の zmv を使って画像ファイルを一括コピー、リサイズをする


よく忘れるのでメモ。要 zsh & ImageMagick

```zsh
% autoload -Uz zmv
% alias zmv='noglob zmv -W'

% ls
activity_card_01@2x.png
activity_card_02@2x.png
activity_card_03@2x.png
activity_card_04@2x.png

% zmv -C activity_card_*@2x.png activity_card_*.png

% ls
activity_card_01.png
activity_card_01@2x.png
activity_card_02.png
activity_card_02@2x.png
activity_card_03.png
activity_card_03@2x.png
activity_card_04.png
activity_card_04@2x.png

% mogrify -resize 40x62 activity_card_[0-9][0-9].png
```

参考：http://d.hatena.ne.jp/mollifier/20101227/p1
php5.4.3 の pear でパッケージがインストールできない

php 5.4.3 で pear install net_socket とすると

```
downloading Net_Socket-1.0.10.tgz ...
Starting to download Net_Socket-1.0.10.tgz (5,429 bytes)
.....done: 5,429 bytes
Could not get contents of package "/tmp/pear/install/Net_Socket-1.0.10.tgz". Invalid tgz file.
Download of "pear/net_socket" succeeded, but it is not a valid package archive
Error: cannot download "pear/Net_Socket"
Download failed
install failed
```

などとエラーになり、インストールできない。 --force をつけても同じ。

#解決法

php.ini の ```zend.script_encoding = SJIS``` をコメントアウトすると、インストール可能になった。sjis でソースを書くと死ぬ。
vim-fugitiveがやっぱり便利


このエントリーは[Git Advent Calendar / June](http://qiita.com/advent-calendar/git)の十四日目です。十三日目は [Cside_](http://qiita.com/users/Cside_) さんの「[ブランチ名 + 作業状態 + stash数 をzshのプロンプトに表示](http://qiita.com/items/13f85c11d3d0aa35d7ef)」でした。

[vim-fugitive](https://github.com/tpope/vim-fugitive)便利ですよね。いい機会だったのでGitのVim-wrapperのひとつvim-fugitiveを復習してみました。

vim-fugitiveの便利なところと言えば、２画面で前後のコードも含めてdiffが見られるところとか、blameが見やすくて楽しいってところだけだと思ってたんですが、調べてみるともっと便利なことがわかりました。

今回は以下について書いてます。

* :Gread
* :Gedit
* :Ggrep
* 補完
* 3-way diff

##いままで

いままでのボクはと言えば、ただ:GstatusでVimエディタ上にステータス画面を開いて-(add/reset)したり、D(diff)を見たり、C(commit)するだけでした。.vimrcの設定もこれだけ。意識が低すぎます。

```~/.vimrc
nnoremap <silent> <Space>gb :Gblame<CR>
nnoremap <silent> <Space>gd :Gdiff<CR>
nnoremap <silent> <Space>gs :Gstatus<CR>
```

##:Greadで変更を取り消す。
現在開いているファイルのコミット前の変更をすべて取り消したい場合は、:Gread を実行するだけです。コマンドラインで、git checkout FILE_NAMEとやるのと同じです。

##:Geditで別ブランチのファイルを開く。
:Gedit BRANCH_NAME:% を実行すると、現在のファイルの別ブランチのものを参照することができます。

##:GgrepでGitディレクトリ内を検索。
これの便利なところは.gitignoreに記述したファイルを検索の候補から外してくれること。第２引数にはBRANCH_NAME,TAG_NAME,SHAなどを渡せます。

##ブランチ名などの補完が効く！
:Git を使えば、コマンドラインでgitコマンドを実行するのと同じことができます。branchやcheckoutとかできます。このとき\<Tab>を押すと補完が効くんですね。便利！（補完する前に最初の１文字は自分で入力する必要があるみたいだけど。oを押してから\<Tab>を押すとorigin/のブランチリストが出てきました）

おまけですがwildmenuを有効にしておくと、補完候補も一覧で見れたりしてもっと便利！！

```~/.vimrc
"command-line completion
set wildmenu
set wildmode=list:longest
```

補完候補が多いなと感じたら、ブランチをお掃除するタイミングですね。

##3-way diffが素晴らしい！
CONFLICTが起きたときって、少なからず精神状態が乱れるし、その状態であの入り乱れたラインの謎を解くのはそう容易くないです。少なくともボクにはハードル高過ぎます。

vim-fugitiveを使えば、左にtarget-branch,中央にworking-copy,右にmerge-branchといった感じで比較しながら作業できるようになります。たぶん使い方の詳細は動画を見た方がわかりやすいので書きません（え？w [動画](http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/)

ボクが使いそうなコマンドだけまとめておきます。

* :Gstatus
（ステータス画面を開く）
* D（both modifiedになっているファイルを3-way diff表示）
* :diffget //2 | diffup（target-branchの変更を取り込んで画面を更新）
* :diffget //3 | diffup（merge-branchの変更を取り込んで画面を更新）
* ]c（次のhunkに飛ぶ）
* [c（前のhunkに飛ぶ）
* :only（現在のウィンドウだけ残して他を閉じる）


#あとがき

quickfix listに表示してもキーを押すとすぐに閉じてしまうので、開きっぱなしにしたり、uniteと連携させたりしたいですね。はやくCONFLICT起きないかなー（こらw

###参考：スクリーンキャスト

[その１](http://vimcasts.org/episodes/fugitive-vim---a-complement-to-command-line-git/) [その２](http://vimcasts.org/episodes/fugitive-vim-working-with-the-git-index/) [その３](http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/) [その４](http://vimcasts.org/episodes/fugitive-vim-browsing-the-git-object-database/) [その５](http://vimcasts.org/episodes/fugitive-vim-exploring-the-history-of-a-git-repository/)

* 時間のない人はその１〜３まで見れば十分かと。


明日は [ppworks](http://qiita.com/users/ppworks) さんです。
Automater で Retina 画像を非 Retina に変換

予め用意された 〜@2x.png ファイルを縮小してファイル名をリネームしてるだけ。

![Qiita](http://resources.qnote.jp/automator-retina.png 'Automator retina')

あとはファイルをドロップするだけ。

だれか sips コマンド版おねがい。
carton で社内レポジトリなどを指定する

環境変数 PERL_CARTON_MIRROR を指定すれば良いみたいです。

[ソース](https://github.com/miyagawa/carton/blob/master/lib/Carton.pm)を読むと

```lib/Carton.pm
our $DefaultMirror = 'http://cpan.metacpan.org/';

sub new {
    my($class, %args) = @_;
    bless {
        path => $ENV{PERL_CARTON_PATH} || 'local',
        mirror => $ENV{PERL_CARTON_MIRROR} || $DefaultMirror,
    }, $class;
}
```

となっています。で、

```lib/Carton.pm
        ( $mirror ne $DefaultMirror ? "--mirror-only" : () ),
```

とか、

```lib/Carton.pm
       ( $is_default_mirror ? () : "--mirror-only" ),
```

とかされているので、PERL_CARTON_MIRROR を使うと --mirror-only
になるようです。

PERL_CPANM_OPT＝--mirror 社内レポジトリ --mirror-only していた
のに反映されないので確認したらこうなってました。

内部的に cpanm を使っているのでこの辺うまく共有してもらえると
嬉しいなー。。
Canvasを部分的に任意の色で塗りつぶす（消しゴムみたいの）

[Canvasを透明色で塗りつぶす](http://qiita.com/items/a1ed36d3743d5b8cb771)の応用。

Canvasクラスのdraw系メソッドに渡すPaintパラメーターに、上記と同じようにPorterDuffルールを設定してあげる。

例：透明な四角を描画する。

```SubSurfaceView.java
Canvas canvas = getHolder.lockCanvas();

Paint paint = new Paint();
paint.setColor(Color.TRANSPARENT);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRect(0, 0, 30, 30, paint);

getHolder().unlockCanvasAndPost(canvas);
```
Canvasを透明色で塗りつぶす

SurfaceView上で描画をするには、Canvasを使用することが多いと思うけど、
Canvasをクリアしたい時の方法。

例として、透明色でクリアする場合。

```SubSurfaceView.java
Canvas canvas = getHolder().lockCanvas();
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
// 描画処理...
getHolder().unlockCanvasAndPost(canvas);
```


`drawColor(Color.TRANSPARENT)`とやってもダメ。
第二引数を省略すると、`drawColor(Color.TRANSPARENT, PorterDuff.Mode.SRC_OVER);`に置き換えられて実行されてしまう。
（※ソース：[リファレンス](http://developer.android.com/reference/android/graphics/Canvas.html#drawColor(int))）

ちなみに、PorterDuffの各モードの意味は、下記サイトが参考になる。
[Merlinの魔術: Porter-Duffのルール](http://www.ibm.com/developerworks/jp/java/library/j-mer0918/)
リンク先を別ウィンドウで開く

Octopressでリンク先を別ウィンドウで開くようにしたかったのですが、Markdownで記述をしているとtarget="_blank"が指定できないようなので、自サイト以外のリンクは別ウィンドウで開くようにしました。

`_include/custom/head.html`ファイルに下記を追加しました。

```js:_include/custom/head.html
<script language="JavaScript">
$(document).ready( function () {
   $("a[href^='http']:not([href*='" + location.hostname + "'])").attr('target', '_blank');
})
</script>
```

別ウィンドウを開かせるのは賛否両論あるようなのですがサイトの特性次第でしょうね。自分のサイトの場合は別ウィンドウ開いた方がユーザビリティはよさそうなのでこうしました。
RailsアプリケーションのセキュリティチェックするRails Brakemanを試してみる

[Moongiftの記事](http://www.moongift.jp/2012/06/20120608-2/)で紹介のあったRailsアプリケーションのセキュリティをチェックするアプリケーション「Rails Brakeman」を使ってみたので簡単に使い方をまとめます。

## インストール

gemでインストールします。

```
$ gem install brakeman
```

## Railsプロジェクトを作成する

セキュリティーの問題を表示したいのでRailsの3.1.0を使用します。

```
$ rails -v
Rails 3.1.0
$ rails new demo
$ cd demo
```

`rails generate`用に下記を`Gemfile`に追加します。

```ruby:Gemfile
gem 'therubyracer'
```

`bundle`コマンドを実行してgemを追加します。

```
$ bundle
```

scaffoldを追加します。

```
$ rails generate scaffold User name:string password:string admin:boolean
```

## 検査

### コマンドライン

まず、コマンドラインで実行してその結果を表示します。

```
$ brakeman
```

### HTML

次に検査の結果をHTMLに出力します。

```
$ brakeman -o report.html
```

report.htmlをブラウザで表示します。

## おわりに

セキュリティチェックのツールはいろいろありまずが、Railsプロジェクトに絞っている分シンプルで使いやすいと思います。あと、テストと一緒にCIツールとかと自動化できるようにしたいですね。
UIImageViewに、長辺をクロップした画像を縮小表示する


``` objectivec:AppDelegate.m

// 画像
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"test" ofType:@"jpg"];
UIImage *img = [UIImage imageWithContentsOfFile:path];

// UIImageViewにセット
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, 128.0, 128.0)];
imgView.clipsToBounds = YES;
imgView.contentMode = UIViewContentModeScaleAspectFill;
imgView.image = img;

// 表示
[self.window addSubview:imgView];

```

![図版](https://lh6.googleusercontent.com/-PRqbgIB83HA/T-F-ml7SOOI/AAAAAAAAAmg/KQh2LFwOmy8/s690/objc20120614.jpg "図版")
よく使うdefine


```objectivec:defines.h
#define SYNTHESIZE(_X_) @synthesize _X_ = _X_##_;
#define RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
#define CFRELEASE_SAFELY(__POINTER) { if (__POINTER) { CFRelease(__POINTER); __POINTER = NULL; } }
#define L(__STR) NSLocalizedString(__STR, @"")

#ifdef DEBUG
  #define LOG(...) NSLog(__VA_ARGS__)
  #define LOG_METHOD NSLog(@"%s", __func__)
  #define LOG_CURRENT_METHOD NSLog(@"%@/%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd))
#else
  #define LOG(...)
  #define LOG_METHOD
  #define LOG_CURRENT_METHOD
#endif
```
親要素の表示領域内でabsoluteな配置

親要素の表示領域内でabsoluteな配置

普通に`position: absolute`を使うと画面内での絶対座標に配置されてしまう。

だが、親要素の`position`に`static`以外を指定することで、親要素の表示領域内での絶対座標に配置することができる。

```css
.parent {
  position: relative;

  margin-left: auto;
  margin-right: auto;
  width: 80%;
}

.child {
  position: absolute;
  right: 0px;
  top: 0px;
}
```

`static`以外だと`position`には`absoltute`, `relative`, `fixed`が指定可能だけれども、
ここでは`top`等を指定しなければ`static`となんら変わらない`relative`を親要素.parentに指定している。
`absolute`と`fixed`を指定した場合には絶対座標に配置されてしまうためである。
縦方向にセンタリング

残念ではあるけど、`display`で`table`と`table-cell`を使う。

```css
.outer {
  display: table;
  height: 100px;
}
.inner {
  display: table-cell;
  height: 100%;
  vertical-align: middle;
}
```

```html
<div class="outer">
  <div class="inner">
    <p>ほげ</p>
  </div>
</div>
```
Pryの色一覧を見たい


Pryの色付きがとてもかわいいけど、青は見づらいなー。カラーセットの一覧が見たい。

```
$ pry
$pry> CodeRay::Encoders::Terminal::TOKEN_COLORS
```

####[pryの色の変え方:http://qiita.com/items/d5f3257ee885943f53a1]
既存リポジトリをGithubにpushするときにパスワードを求められたら

手元のgitリポジトリを新しく作った自分のGithubリポジトリにpushしようとしたら、Githubにリポジトリを作ってからcloneした手順の時と異なり、pushのたびにユーザー名とパスワードを要求されるようになった。
originの設定が https://github.com/ 接続になってたりするので、SSH接続に変更してパスワードなしで行けるようにする。

Githubの該当リポジトリのトップページにある「HTTP / SSH / Git Read-only」から「SSH」を選択して表示されたURLをコピー。configに貼り付け。

```ワーキングツリー/.git/config
[remote "origin"]
    url = git@github.com:calpo/LearnYouAHaskellForGreatGood.git
```

初めからgit remote add の時にこっちを指定しとけばいい話だけど、リポジトリ作成時に表示されるチュートリアルメッセージにはHTTPのURLが書いてあるのでついそのままコピーしてハマった。
Check and get a CSS3 propeties.


```javascript
        var CSS3Props = (function () {

            var ret = {},
                style = document.createElement('div').style,
                props = ['webkit', 'Moz', 'ms'],
                p, i = 0;

            //transform
            for (p; p = props[i]; i++) if (p + 'Transform' in style) {
                ret.TRANSFORM = p + 'Transform';
            }

            //transition
            for (i = 0, p = null; p = props[i]; i++) if (p + 'Transition' in style) {
                ret.TRANSITION = p + 'Transition';
            }
        
            return ret;
        }());
```
Copy and clone object/array


```javascript
    var objProto = Object.prototype,
        arrProto = Array.prototype,
        toString = objProto.toString,

    function isObj(obj) {
    
        if (toString.call(obj) === '[object Object]') {
            return true;
        }

        return false;
    }
    function isArray(obj) {
    
        if (toString.call(obj) === '[object Array]') {
            return true;
        }

        return false;
    }

    function copy(base, target, opt) {
    
        var key, i, l;

        opt || (opt = {});

        for (key in target) if (target.hasOwnProperty(key)) {

            if (base[key] && !opt.overwrite) {
                continue;
            }

            if (isObj(target[key]) && opt.deepCopy) {
                base[key] = copy({}, target[key]);
            }
            else if (isArray(target[key])) {
                if (opt.deepCopy) {
                    base[key] = [];

                    for (i = 0, l = target[key].length; i < l; i++) {
                        if (isObj(target[key][i])) {
                            base[key].push(copy({}, target[key][i]));
                        }
                        else {
                            base[key].push(target[key][i]);
                        }
                    }
                }
                else {
                    base[key] = target[key];
                }
            }
            else {
                base[key] = target[key];
            }
        }

        return base;
    }
```
Elisp の変数の内容が無名関数かどうかチェックする

変数が無名関数かどうかは funcall が invalid-function エラーを発生するかで確認できそう。

```cl
(defun lambda-p (var)
  (condition-case nil
      (progn
        (funcall var)
        t)
    (invalid-function nil)))


(setq str "hoge")
(lambda-p str)                          ; => nil

(setq lmd (lambda () (format "%s" "huga")))
(lambda-p lmd)                          ; => t
```


Elisp の変数が「文字列そのもの」と「文字列を返す関数」のどちらかに関わらず、その変数を文字列として扱いたい場合はこんな感じ。

```cl
(defun lambda-to-str (str)
  (condition-case nil
      (funcall str)
    (invalid-function str)))


(setq str "hoge")
(lambda-to-str str)                          ; => "hoge"

(setq lmd (lambda () (format "%s" "huga")))
(lambda-to-str lmd)                          ; => "huga"
```
JSONとJSONP

現在のWebでは異なるクロスドメインのサーバからデータを取得する機能を実装することがごく普通に行われていますね。

例えば、
http://examle.com
にホストされたサイトからtwitterのタイムラインを取得したり、Facebookのいいねボタンを押したりするとか。そんなときに役に立っているのがJSONPという仕組みなんです。

まず、JSONPが必要となった経緯とは…
SOP(Same Origin Policy)[同一生成元ポリシー]によって、最初にページを取得したホスト以外のホストに対してリクエストを送ることができないんです。
つまり、
http://example.com
にホストされたWebページから
http://example.org/xxxxx
にリクエストを送信してデータを取得することは原則的にできません。

じゃあ、どうするか。ここで登場するのがJSONPです。
SOPの制限によりリクエストを飛ばすことはできないけど、リソースをインクルードすることはできるんです。
どういうことかというと

```sample.html
<script src="http://exampleA.com"/>
<script src="http://exampleB.com"/>
```
と言う形でリソースを取得してくることは可能。
ならば、取り込んだソースを実行すればいいじゃんというのがJSONP

つまりこんなイメージ
以下のソースの①が読まれると、宣言してあるcallbacksampleが呼ばれるという仕組みですね。

```sample.html
<script>
	function callbacksample(json){
		//use jsonコード	
	}
</script>
<script src="http://example.com"/>　…①
// ①では以下のソースを取得する。
// callbacksample({id:"id1",name:"name"});

```

で実際どう使うのかというのはまたいつか書きます。
※jQueryなどのライブラリを使った方が楽なので推奨です。
Heroku First Step!


１．Herokuにアプリケーションを作成する

```commandline
//Herokuにログインする
$heroku auth:login

Enter your Heroku credentials.
Email: example@example.com
Password (typing will be hidden): 

//Herokuに新しいスタックを作成する
//明示的にcedarスタックを作成する
$Heroku create --stack cedar ytakataapps

Creating ytakataapps... done, stack is cedar
http://ytakataapps.herokuapp.com/ | git@heroku.com:ytakataapps.git
 !    Notice: on Wed, 20 June, our default stack will change to Cedar. http://bit.ly/Lh0rM5

```


heroku create --stack cedarについては以下のページの相澤さんからのコメントを見るとわかりやすい
http://dqn.sakusakutto.jp/2012/04/github-heroku-push.html

リンクが切れると嫌なので以下引用

```引用　
また -s cedar というオプションはherokuに作られる実行環境の種類を指定するものです。
この場合はCedarスタックという最新の実行環境が適用された実行環境ができます。
ちなみに -s cedar を指定しないと bambooスタックで実行環境がつくられます。
CedarスタックとBambooスタックの最も大きな違いはBambooスタックではRubyアプリケーション
しか実行できないがCedarスタックではRuby以外の言語（Java、Python、Node.js、Scalaなど）が
実行可能なことです。
```

正式な情報はこちら（追記）
https://devcenter.heroku.com/articles/stack


２．Herokuにデプロイするアプリケーションを作成する

```create 
//ここは好きなアプリを作成してね
$play new sample -with scala

$cd sample

$play run

//これでとりあえずplayのアプリができる
```

３．アプリケーションをgitに登録

```commandline
//gitのリポジトリを初期化
$git init

//１で作成したリポジトリをherokuという名前で登録
$git remote add heroku git@heroku.com:XXXXXXXXXX.git
//ここで登録したリポジトリherokuを削除するには
$ git remote rm heroku

//herokuのリポジトリのmasterにプッシュ
$git push heroku master


//蛇足ですが…
//herokuのアプリケーション名を変えたいときは
$heroku apps:rename newname --app oldname
//別にコマンドからじゃなくて、herokuのウェブコンソールからでも簡単にできます。

```
node.jsを使った停止なしサーバ (Graceful restart in node.js)

node.jsの最近のバージョンで標準に追加されたclusterモジュールを使用しての停止なしサーバ．メモリの解放を忘れたり，ファイルを開きっぱなしであったりなどのバグから身を守るために，自動的な世代交代をダウンタイム無しで行います．

>Using the cluster module, which is included in recent Node.js, I implemented a graceful restarting server. It prevents a server from leaking memories or file descriptors by restarting periodically. The restart can be done without disconnecting clients immediately (the interval to wait for clients can be set in server.shutdown_timeout).

```javascript
var http = require('http');
var server = http.Server(function(req, res) {
	res.writeHead(200);
	res.end("Hello, world!\n");
});

// ポート番号 (Port number to listen)
server.port = 8000;
// 世代交代を行う周期(ミリ秒) (The period of generational change)
server.interval = 10000;  // milli-seconds
// サーバの並列度 (Concurrency of servers (it must be more than 1))
server.concurrency = 2;
// 強制終了までの猶予時間 (How long it waits for closing its sockets)
server.shutdown_timeout = 10000;  // milli-seconds

var cluster = require('cluster');
if (cluster.isMaster) {
	var fork = function() {
		var worker = cluster.fork();
		worker.timer = setTimeout(function() {
			process.kill(worker.pid);
		}, server.interval + server.shutdown_timeout);
	}
	cluster.on('death', function(worker) { clearTimeout(worker.timer); });
	fork();
	setInterval(fork, server.interval / server.concurrency);
} else {
	server.listen(server.port);
	server.on('close', function() { process.exit(); });
	setTimeout(function() { server.close(); }, server.interval);
}
```