OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-Cでよく使う便利マクロを10個集めてみた


## 1. AppDelegateの参照
AppDelegate≒グローバルとして使う場合にとても便利です。
ゆとり向けです。あまり使う頻度が高いと設計ができてないということなので要注意かも。

```objectivec:
#define APP_DELEGATE ((AppDelegate*)[[UIApplication sharedApplication] delegate])
```

## 2. テストの時に便利なBundleの参照
ユニットテストを書いてみたけどmainBundleがうまく取れなくってこける、という時のために。bundleForClass:[self class]を使うことで対応するバンドルを取得するようにします。

```objectivec:
#define BUNDLE	[NSBundle bundleForClass:[self class]]
```

## 3. 画面サイズ
480とか320とかは今時直書きしないと思いますが^^
IB使わずに配置すると画面全体のサイズを頻繁に参照することになるので、ショートカットを定義しています。

```objectivec:
#define SCREEN_BOUNDS	([UIScreen mainScreen].bounds)
```

## 4. ログ出力
printfデバッグ厨には必須ですね。行数とメソッド情報加えてログ表示します。

```objectivec:
#define LOG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
```

## 5. UIColorを簡単に書く
これもIB使わない時に便利。

```objectivec:
#define RGB(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r, g, b, a)	[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]
```

## 6. max, min

NSObjCRuntime.hに定義されているので個別の定義は不要ですが、地味に便利ですね。

```objectivec:
#define MIN(a,b)    ((a) < (b) ? (a) : (b))
#define MAX(a,b)    ((a) > (b) ? (a) : (b))
```

## 7. iPhone, iPad の確認
ユニバーサルアプリを作るときにあると便利。

```objectivec:
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
```

## 8. Retina判定

Retina Displayを判定します。あんまり使わないかも。。

```ObjectiveC:
#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [UIScreen mainScreen].scale > 1)
```

## 9. 言語取得

現在の言語を取得します。

```Objective-C:
#define LANGUAGE	([NSLocale preferredLanguages][0])
```

## 10. よく使う標準コントロールのサイズ
UIStatusBar, UITabBar, UINavigationBar, UIToolbarの高さを定義しています。ランドスケープも対応する場合は別途調整が必要です。

```Objective-C:
#define STATUSBAR_H	20
#define TABBAR_H	48
#define NAVBAR_H	44
#define TOOLBAR_H	44
```
libumemとmdbを使ったメモリリーク検査

結構前に調べたことですが、メモしておきます。
solarisでメモリ検査する方法が中々見つからなくて、結構探した覚えがあります。

## 手順

1. 環境変数の設定
2. プロセスの実行
3. mdbの起動
4. メモリリーク検査
5. プロセスを開放
6. c++の名前を複合

### 環境変数の設定

```
$ LD_PRELOAD=libumem.so
$ UMEM_DEBUG=default
$ export LD_PRELOAD
$ export UMEM_DEBUG
```

### プロセスの実行

検査対象のプロセスを実行します。

### mdbの起動

```
$mdb -p [pid]
```
 ここでプロセスの動作は一時停止します。

### メモリリーク検査

```
>::findleaks -d
```
結果が表示されます。

 * findleaksがエラーになるときは `pargs -e [pid]` で環境変数の確認をしてみるといいです。
 * libumemがロードできていない場合 `>::load libumem` で手動でロードできます。

ex. リークあり

```
CACHE     LEAKED   BUFCTL CALLER
00162008      81 001ac168 libCrun.so.1`__1c2n6FI_pv_+0x2c
----------------------------------------------------------------------
   Total      81 buffers, 3888 bytes

umem_alloc_48 leak: 81 buffers, 48 bytes each, 3888 bytes total
            ADDR          BUFADDR        TIMESTAMP           THREAD
                            CACHE          LASTLOG         CONTENTS
          1ac168           1abcc0    a2c68a13d8570                1
                           162008                0                0
                 libumem.so.1`umem_cache_alloc+0x13c
                 libumem.so.1`umem_alloc+0x60
                 libumem.so.1`malloc+0x28
                 （中略）
                 main+0x1ec
                 _start+0x108
```

ex. リークなし

```
CACHE     LEAKED   BUFCTL CALLER
----------------------------------------------------------------------
  Total       0 buffers, 0 bytes
```

### プロセスを解放

```
>:R
```
プロセスは動作を再開します。
再びプロセスにアクセスするには

```
>:A [pid]
```
で行けます。（そもそもプロセスを止めずに、gcoreでcoreファイルを作成してそれをmdbで検査しても良いようです。）

### c++の名前を復号

```
$ dem [名前]
```

 c++関数の名前が復号できます。

## 参考にした主な情報ソース

簡単な例は下記Q&Aが参照している"Adam のブログ"記事に載っています。

・BigAdmin  (DTraceのQ&A)
http://otn.oracle.co.jp/technology/global/jp/sdn/solaris/solaris10/dtrace/private/questions1.html#9

抜粋

>Q:  DTrace は、ユーザーアプリケーションのメモリ破壊やメモリリークの検出に使用できますか。 もし使用できるのであれば、
>Purify のライセンスを破棄しても構わないのですか。
>
>A: これらの作業には、Purify よりも libumem(3LIB) の方が適しています。 libumem は、Solaris 10 の新しいメモリアロケータです。
>詳細については、umem_debug(3MALLOC) のマニュアルページや、この件についての Adam のブログ
>(http://blogs.sun.com/roller/page/ahl/?anchor=solaris_10_top_11_20) を参照してください。

・作者によるlibumemの説明
[Jonathan Adams's Weblog](https://blogs.oracle.com/jwadams/entry/debugging_with_libumem_and_mdb)
Non-Euclidean Manifold上での近似最近傍探索

こんにちは。@xiangze750です。Machine Learning Advent Calendar 2012 の13日目の投稿になります。
今回はコンピュータビジョンにおける最近傍探索と幾何学についての論文紹介です。
Fast ANN Methods for Non-Euclidean Manifolds with Applications to Human Activity Analysis in Videos
という(題名どおり)人間の動作の分類を近似再近傍探索を用いて行うという論文を読んでいたのですが、リーマン幾何などの比較的高度な数学的概念が前提とされ、先行研究も多数あげられていたので内容理解のための個人的な覚え書き,疑問点の整理をかねてその内容をまとめます。
http://d.hatena.ne.jp/xiangze/20121213
Nokogiri 1.5.6で、属性アクセサーが大きく変わった

先日、Nokogiriの1.5.6がリリースされました。
このアップデートで属性アクセサーに変更があって、GitHubでも[イシューが上がっています][issue]。その中でメンテナーの[@flaverjones][flaverjones]も認めているように、これは1.5.5→1.5.6というパッチレベルリリースには相応しくないほど大きな変更です。

というか、実際僕もハマりました（余談ですがTravisがテストのこけたのを教えてくれて気付きました、改めて素晴らしいサービスだと思いました）。

ここで属性アクセサーと言っているのは、

```html
<input type="email">
```

というメールアドレスフィールドがあった時に

```ruby
input['type'] # => "email"
```

という風にアクセスして値を取れる[`Nokogiri::XML::Node#[]`][brackets]メソッドのことです。

では、どのように変化したのでしょうか、ちょっとプログラムを書いてみました。

```ruby:nokogiri-attribute.rb
version = ARGV.shift
gem 'nokogiri', version
require 'nokogiri'
puts Nokogiri::VERSION
doc = Nokogiri.XML(DATA.read)
nav = (doc/'nav').first
p [nav['type'], nav['epub:type']]

__END__
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:epub="http://www.idpf.org/2007/ops">
  <head>
    <title>Table of Contents for Example Book</title>
  </head>
  <body>
    <nav epub:type="toc">
    </nav>
  </body>
</html>
```

    $ ruby noogiri-attribute.rb 1.5.5
    1.5.5
    ["toc", nil]
    $ ruby noogiri-attribute.rb 1.5.6
    1.5.6
    [nil, "toc"]

今まで取れていた値が取るのに、名前空間プリフィクスが必要になってしまっています。

当然、`epub:type`なんて、任意の名前空間プリフィクスを使ったキーは使いたくない（環境を限定できればその限りではない）。
ではどうすればいいのか？　というと、書き捨てのスクリプトはともかく、ある程度長く使うことが分かっているものは、[`#[]`][brackets]の代わりに[`#attribute_with_ns`][attribute_with_ns]を使うのがいいかなあと思っています。

```ruby
ns_uri = 'http://www.idpf.org/2007/ops'
nav = (doc/'nav').first
attr = nav.attribute_with_ns('type', ns_uri)
type = attr.nil? ? nil : attr.value # attr.to_sでいいことも多いけど、nilと空文字列""を区別したいこともある
p type # => 1.5.5でも1.5.6でも"toc"
```

他にいいメソッド見付けたら教えてください！

ま、XML名前空間を使った属性アクセスなんて、している人殆どいないでしょうけど……。

[issue]: https://github.com/sparklemotion/nokogiri/issues/816
[flaverjones]: https://github.com/flavorjones
[brackets]: http://nokogiri.org/Nokogiri/XML/Node.html#method-i-5B-5D
[attribute_with_ns]: http://nokogiri.org/Nokogiri/XML/Node.html#method-i-attribute_with_ns
NeoBundleでのプラグインの削除と`buftabs.vim`


vimで複数のファイルを開ける事を知り、しかも開いてるファイルが
TAB風に表示できるオシャレプラグインがあるというので、入れてみました。それが`minibufexpl.vim`です。

しかし今回やりたい事は以下。

##`minibufexpl.vim`の使い方がよくわからないので、削除して`buftabs.vim`使いたい

理由がなんともあれですが、いいんです。
だって`:bd`すると全部閉じちゃうんだもの。

*あとで分かった事ですが、vimのバッファ閉じるとウィンドウごと閉じてしまうようで、
`buftabs.vim`に変えても同様の現象は起きます。
その対策は最後にやります。`minibufexpl.vim`は犠牲になったのだ。*

あと、`buftabs.vim`はステータスバーに表示されるらしく、
ギーク感でてかっこいいです。乗り換えましょう。

##`.vimrc`から該当プラグインを削除

	- fholgado/minibufexpl.vim

##`:NeoBundleClean`で削除

	`:NeoBundleClean`

消えましたね。

##`.vimrc`に`buftabs.vim`追加

本家にgitリポジトリが無い？？
http://vim.sourceforge.net/scripts/script.php?script_id=1664

NeoBundleで全部管理したい身としては困りました。

ですが、https://github.com/vim-scripts/buftabs
ありました。ミラーだそうです。
vim-script周りの事は後で調べるとして、とりあえず、これ使えば問題なさそうです。

以下を`.vimrc`に追加します。

	NeoBundle 'vim-scripts/buftabs'
	"buftabs
	" バッファタブにパスを省略してファイル名のみ表示する
	let g:buftabs_only_basename=1
	" バッファタブをステータスライン内に表示する
	let g:buftabs_in_statusline=1
	" 現在のバッファをハイライト
	let g:buftabs_active_highlight_group="Visual"
	" ステータスライン
	set statusline=%=\ [%{(&fenc!=''?&fenc:&enc)}/%{&ff}]\[%Y]\[%04l,%04v][%p%%]
	" ステータスラインを常に表示
	set laststatus=2

で	

	$ vi
	:NeoBundleInstall

ですです。

これで、入りました。
がバッファを切り替えるのにいちいち、`:bn`とか`:bp`してたら日が暮れるので、ショートカット的な物を定義しておきます。

`.vimrc`に以下を追加します。

	nmap <C-n> :bn<CR>
	nmap <C-p> :bp<CR>

これで、コマンドモード時に、CTRL + Nでどんどんバッファを切り替えます。素敵ですね。`:w`してからじゃないと移動できなかったけど、本当？

##バッファ閉じるとwindowが閉じちゃう問題

Vimを複数のウインドウで使っている時に開いているバッファを閉じると、全てのウインドウが閉じてしまうので、以下のプラグインで回避。

http://nanasi.jp/articles/vim/kwbd_vim.html

これで、`:Kwbd`でバッファを閉じればウインドウが閉じなくなります。

僕はこんな感じでCTRL-Kに割り当てました

	nmap <C-k> :Kwbd<CR>

とりあえず、基本的な設定はこれでokだとおもいますので、とっととプログラミング始めます。
プロキシ環境下でdotCloudにプッシュ

外向きの 443 ポートが閉じているプロキシ環境で dotcloud push すると次のようなエラーになりました。

    ==> Pushing code with rsync from "./" to application sample
    rsync: connection unexpectedly closed (0 bytes received so far) [sender]
    rsync error: unexplained error (code 255) at io.c(600) [sender=3.0.6]

rsync over ssh が uploader.dotcloud.com:443 に直接アクセスしようとして失敗しているようです。dotcloud 側でどうにかする方法が判らなかったので、ssh の方で HTTP プロキシ経由になるように設定しました。

下記の方法はプロキシサーバが CONNECT メソッドに対応している必要があります。外向き 443 ポートが閉じられている環境であれば対応していると思います（じゃないと https が困る）。

ssh で HTTP プロキシを使うには ProxyCommand を使用します。ひとまず次のようにして HTTP プロキシ経由で接続出来ることを確認します（192.2.3.4:8080 はプロキシサーバのIPアドレスとポート番号）。

    ssh uploader.dotcloud.com -p 443 -o ProxyCommand="nc -X connect -x 192.2.3.4:8080 %h %p"

パスワード入力のプロンプトが表示されれば上手く接続出来ています。成功したら .ssh/config に追記します。

    vi ~/.ssh/config

次のように追記します。

```
Host uploader.dotcloud.com
    ProxyCommand nc -X connect -x 192.2.3.4:8080 %h %p
```

これで uploader.dotcloud.com への SSH はプロキシサーバを経由するようになりました。
javaで月末日を取得する


月末日の取得方法をjava.util.CalendarとJoda Timeの両方で取得するやり方の説明です。

ちなみにJoda Timeとはこちらのライブラリです。
http://joda-time.sourceforge.net/

## java.util.Calendarの場合

`getActualMaximum`を使います。

```java:月末を取得
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.MONTH, 1);
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE);
```

## Joda Timeの場合
Joda TimeのLocalDateやDateTimeで取得する際には以下のように`withMaximumValue()`を使って取得するのがお作法です。

```java:月末を取得
// LocalDate
LocalDate date = new LocalDate();
LocalDate lastDayOfThisMonth = date.dayOfMonth().withMaximumValue();

// DateTimeでも同様
DateTime dateTime = new DateTime();
DateTime lastDayOfThisMonth2 = dateTime.dayOfMonth().withMaximumValue();
```
SBCL 1.1.3変更点まとめ

# 機能強化

* ロケールの設定（環境変数LANGなど）がおかしいときに警告が出るようになった
* WindowsでもC-cでフォアグラウンドのスレッドを中断できるようになった
* FFIで[stdcall呼出規約](http://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84#stdcall)によるコールバックをサポートした
* ビルド時に指定をすることで、POSIX環境ではpseudo-atomicの処理を利用せずにsb-safepointをビルドできるようになり、その分の実行時のオーバヘッドをなくすことができるようになった
* sb-safepointを使っている場合、FFIでのコールバックを通して、Lispの外部で作られたスレッドからLispの内部に入ることができるようになり、その関数呼び出しの間はLispのスレッドとして見えるようになった
* Windowsでの[ネームストリング](http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_n.htm#namestring)とファイルシステムへのアクセスに関するシステムコールの扱いが改良された
* WindowsでのMSIインストーラでバージョン3.5以降のWindows Installer XMLを使うようになり、色々とユーザビリティが改善された
* sb-bsd-socketsモジュールがWindowsでノンブロッキングモードをサポートするようになった
* Windowsバックエンドがx86-64をサポートするようになった

# バグ修正

* [シバン（shebang）](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29)をサポートし、SBCLが適切にインストールされた環境で、FASLが直接実行できない不具合が修正された
* make.sh --helpを実行したときにclean.shが実行されていた問題が解決された
* 同じconc-nameを共有するサブクラスがある場合の、構造体クラスの[ダイレクトインスタンス](http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_d.htm#direct_instance)のスロットへの[CAS](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9A%E3%82%A2%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97)によるアクセスの修正
* Windowsでの[論理パスネーム](http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_l.htm#logical_pathname)のネームストリングが、POSIX環境との差を減らすために小文字に変換されるようになった
Vimからクリップボードインテグレーションシーケンス(PASTE64/OSC52)を利用する


はじめに
-------
今回もまたxterm由来のクリップボードインテグレーション(PASTE64/OSC52)の話題なんですが、先日iTerm2がサポートしたことで、ほんのちょっとだけ認知度が上がったようですね。よかったです。
PASTE64/OSC52って何のことか知らないという人は、お先にこちらをどうぞ。

- [リモートの tmux でコピーした内容のローカルのクリップボードへの反映](http://doda.b.sourceforge.jp/2011/12/15/tmux-set-clipboard/)
- [iTerm2のクリップボードインテグレーション(OSC 52/PASTE64)のつかいかた](http://qiita.com/items/1f635fe66b778932e278)

Vimからの利用
------------
この機能はXが無い環境からでもssh先とクリップボード連携できるという特性があり、なかなか使い勝手がよいものです。
tmuxだけにつかわせておくのはちょっともったいないですよね。

そこで今回は、VimにPASTE64/OSC52をインテグレートする設定例を書いてみました。

```

function! s:Paste64Copy() range
  let l:tmp = @@
  silent normal gvy
  let l:selected = @@
  let l:i = 0
  let l:len = strlen(l:selected)
  let l:escaped = ''
  while l:i < l:len
    let l:c = strpart(l:selected, l:i, 1)
    let l:escaped .= printf("\\u%04x", char2nr(l:c))
    let l:i = l:i + 1
  endwhile
  if $TMUX != ""
    "tmuxのとき
    call system('printf "\x1bPtmux;\x1b\x1b]52;;%s\x1b\x1b\\\\\x1b\\" `echo -en "' . l:escaped . '" | base64` > /dev/tty')
  elseif $TERM == "screen"
    "GNU Screenのとき
    call system('printf "\x1bP\x1b]52;;%s\x07\x1b\\" `echo -en "' . l:escaped . '" | base64` > /dev/tty')
  else
    call system('printf "\x1b]52;;%s\x1b\\" `echo -en "' . l:escaped . '" | base64` > /dev/tty')
  endif
  redraw!
endfunction

command! -range Paste64Copy :call s:Paste64Copy()
```

.vimrcにこれを書いて、テキストを選択後、

> :'<,'>Paste64Copy

とコマンドを打ち込んでやれば、OSC52シーケンス経由でのクリップボードコピーができます。
もちろんSSH越しでも使えます。

解説
----
Vimから端末に対して、任意のタイミングで生文字列を送る方法をちょっと探してみたのですが、どうやらsystem関数でやるしかなさそうだったので、ここではそうしています。
正直こんなかっこわるいやり方はゆるせない、と思っているので、他にもっといい方法があれば教えてください。

さて、OSC52シーケンスが制御端末まで届いたとしても、まだ障害があります。
GNU Screenやtmuxのようなターミナルマルチプレクサは、基本的に自分の知らないシーケンスを全部たべてしまうので、フロントエンド端末まで届かないのです。
私がターミナルマルチプレクサを使わない理由の3割くらいはこれなんですが、普通の人は使うと思うので、ここではGNU Screen/tmuxの独自拡張であるパススルーシーケンスを使用し、OSC 52を貫通させました。
GNU Screenとtmuxでのエスケープの仕方の違いを考慮するあたりがとても重要なポイントですね。
Rails等でURLにランダムな文字列を使いたい時のアレ

> http://example.com/samples/lk23Affa

みたいなURLにランダムな文字列を使いたい時ありますよね。
上記がRailsのActiveResourceのRESTfulっぽいルーティングだとしたら、
samplesというresourceのid=lk23Affaにアクセスしてることになりますね。

ActiveRecordだと普通にテーブルを作成していったら、
主キーのidは、auto_incrementのただの数字連番になってしまいます。
また、文字列の主キーを設定するのが結構面倒なので *1、
access_tokenというようなカラムで別に値を保持しておくのがよさそうです。

```ruby:db/migrate/xxx_create_samples.rb
class CreateSamples < ActiveRecord::Migration
  def change
    create_table :samples do |t|
      t.string :access_token, :null => false, :limit => 6
      t.timestamps
    end
    add_index :samples, :access_token, :unique => true
  end
end
```

```ruby:app/model/sample.rb
class Sample < ActiveRecord::Base
  validates_uniqueness_of :access_token
  validates_presence_of :access_token
  after_initialize :set_access_token

  private
  def set_access_token
    self.access_token = self.access_token.blank? ? generate_access_token : self.access_token
  end                                                                                                                                                                                          

  def generate_access_token
    tmp_token = SecureRandom.urlsafe_base64(6)
    self.class.where(:access_token => tmp_token).blank? ? tmp_token : generate_access_token
  end
end
```

```ruby:config/routes.rb
  get '/samples/:access_token' => 'samples#show'
```

```ruby:app/controller/samples_controller.rb
class SamplesController < ActionController::Base
  def  show
    @sample = Sample.where(:access_token => params[:access_token]).first
  end
end
```

こんな感じに書いたらユニークな文字列をURLに含めて、
リソースを表示させることが出来るかと思います！
とりあえず、access_tokenって名づけましたが、もっと一般的に使われてる良い名前があったら教えて欲しいです。

**追記：2012.01.02**
@tkawa さんの作った https://github.com/tkawa/resources_id_replace 
を使うと、綺麗にRoutingが出来るようになるようです。
詳しくは↓のコメント欄をどうぞ。


*1: MySQLでは、migrationファイル中にexecuteメソッドを使ってSQLを直に書き、alter tableでprimary keyを追加できるけど、sqlite3では、alter tableこそ使えるものの、primary keyを追加できないという問題あり。

参考ページ：
- [URL短縮サービスで使われるような、ランダムでユニークなアクセストークンを発行するプラグイン - 篳篥日記](http://d.hatena.ne.jp/hichiriki/20100124/1264343424)
- [ActiveRecord で id 以外のカラムをプライマリキーにして、しかも型が int じゃないときの話 - 何かの記録](http://d.hatena.ne.jp/moja8/20120601/1338483670)
- [SQLite Query Language: ALTER TABLE](http://sqlite.org/lang_altertable.html)
RubyFlux を使って Ruby から Java へコードを変換する


[RubyFlux](https://github.com/headius/rubyflux) を使うと、Ruby で書いたコードを Java コードに変換することができます。
ほぼ README に書かれているままですが、こんな感じです。
あ、環境は mac です。

```bash:
# JRubyが入ってなかったのでインストールする
# ( rbenv 使ってます)
$ rbenv install jruby-1.7.1
$ rbenv local jruby-1.7.1
# リポジトリを引っ張ってくる
$ git clone git://github.com/headius/rubyflux.git
$ cd rubyflux
# maven でパッケージを作る
# maven が入ってない場合は
# $ brew install maven
# とかで、インストールしておく
$ mvn package
# ここまでは、1回やっておけば良い
```

```
# Rubyでコード書く
$ vim fib.rb
$ cat fib.rb
```
```ruby:fib.rb
def fib(a)
  if a < 2
    a
  else
    fib(a - 1) + fib(a - 2)
  end
end

puts fib(40)
```
```bash:
# とりあえず、JRubyで実行してみる
$ ruby fib.rb
102334155
# Javaコードを生成、コンパイルして実行する
$ rake run[fib.rb]
jruby -I target:src/main/ruby src/main/ruby/ruby_flux.rb fib.rb
javac fib.java
java fib
102334155
# 生成されたJavaのコードを見てみる
$ cat build/fib.java
```
```java:build/fib.java
public class fib extends RObject {
    public static void main(String[] args) {
        new fib().$main();
    }

    public void $main() {
        RObject $last = RNil;
        $last = puts(fib(new RFixnum(40L)));
        ;
    }

    public RObject fib(RObject a) {
        RObject $last = RNil;
        if (a.$less(new RFixnum(2L)).toBoolean()) {
            $last = a;
        } else {
            $last = fib(a.$minus(new RFixnum(1L))).$plus(
                    fib(a.$minus(new RFixnum(2L))));
        }
        $last = $last;
        return $last;
    }
```

実用性があるかどうかはまだ分かりませんが、面白いですね。
Flaskを1ヶ月間使ってみた感想



2012年にpyconjpなどでFlaskを知ってマイクロフレームワークだし小さなサービス作るぐらいには使えそうって良さ気な印象をもった。
それからしばらくして、RDBを使ってREST APIを作る話があったんだがそれにFlaskを使って苦労・失敗したって感想を書いていく。  


1. MethodViewクラスが使いやすい 
   エントリポイントごとにMethodViewクラスを継承したクラスを作成して get/post/put/deleteメソッドを定義するとそれぞれGET/POST/PUT/DELETEリクエストに対応出来るのでREST APIを作るのはほんとうに簡単だった。
 
1. リソース更新のためにPOSTを使わない  
   API利用者のために更新もPOSTで受け付ける仕様にしたんだが実装始めた段階でやっぱり面倒くさいなって思ってしまった。
SQLAlchemyをORMな使い方してうまくやるにはこの方式はあんまり向いていなかった。  
  REAST APIはPOST/PUT/DELETE/GETで作るようにすれば開発者も利用者も幸せになれるでしょう。
1. Flask-SQLAlchemyが使いにくい。  
   Flask-SQLAlchemyについてもあんまり参考になるような利用例がなくてサンプル以上の使い方をするのが難しい。素のSQLAlchemyを使ったほうが柔軟性が高いし他のバッチ処理とかでもコードを流用できるので拡張はなるべく使わないほうがあとあとウレシイんじゃないかな。

1. Blueprintのドキュメントがあんまり無い  
   しばらくしてコードが成長してくると1つのスクリプトでは大きすぎるように感じてBlueprintというコードを分割するモジュールを使いたくなるんだがこれもドキュメントが無くてどうやって使っていいのかコード読んだりして使えるようになるまで手間と時間がかかる。オレはBlueprint使った分割をあきらめて1ファイルに無理矢理収めてしまった。

1. テストのやりかたがわかりにくい  
3,4,5 に関しては全般的にドキュメント/サンプルコードが少ないってことに帰結すると思う。Flaskはまだまだ利用例が少ないからこれからこの辺りのセクションの情報量が増えることに期待したい。

1. DELETリクエストでパラメータを受けとれない
   実装をはじめるまで気づかなかったので削除するタイミングでリソースを変更する仕様を採用しているとあとで困ることになるので知っておいて欲しい。
  `追記`
  ちゃんと、下のようなDELETEリクエストでrequest.args["hoge"]でパラメータ取れました。
  % curl -X DELETE "http://localhost:9999/users/100?hoge=100"


SQLAlchemyに関してはちょっと利用したことがあるだけの知識で使ってみたので的が外れてたかもしれない。初心者でFlask + SQLAlchemy で何か作るってときにはハマるかもしれないので書いておいた。

2012年はFlaskを使っていろいろ経験できたので、2013年はFlaskよりも機能が充実したDjangoを使って新しい経験を増やしてみようと思います。

今年もよろしくおねがいします。

----

[Amazon.co.jp： Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus): 山本 陽平: 本](http://www.amazon.co.jp/dp/4774142042/ "Amazon.co.jp： Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus): 山本 陽平: 本")

[PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール](http://www.slideshare.net/atsuoishimoto/pycon-jp-2012-handson-flaskweb "PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール")
gemrc

```
gem install rails --no-rdoc --no-ri
```
を毎回やるのが面倒な場合は`.gemrc`を設置する。

```
vi ~/.gemrc
```

```
gem: --no-rdoc --no-ri
```
gemに与えるデフォルトのオプションを設定できる

http://docs.rubygems.org/read/chapter/11
Emacsに環境変数を取り込む… の次。(with 初めてのelisp)

> ## 結論
> Emacsのことが全然わかってないので使ってコード読んでフルボッコにしてください

## はじめに
しばらく前に[Emacsにzshの環境変数PATHを取り込む](http://qiita.com/items/9ba5eb157e09463740f4)といふ記事を書きました童貞です。
こんばんはこんばんは。

標準以外のシェル (Zshellとか) を愛用してると、 GUI な Emacs を利用したときに環境変数、たとへば`PATH`などがふだんのシェル環境と一致しなくて困ったことが起こりえます。

具体的にはユーザディレクトリ下に`.rbenv`ディレクトリがあって、ここにある`ruby`を使用したい。そのために`$HOME/.rbenv/shims`が`PATH`の先頭にあって欲しい。みたいなケースですね。

そんな問題を、`.emacs`にちょっとしたコード断片を書き加へて解決しようとしたのが前回の記事でした。が、

> 練習がてらにもうちょっと汎用性持たせて Windows のこともちょびっと考慮しつつ Emacs Lisp としてまとめてみるのも良いですかね。

……などと、前の記事で口走ってしまったので、旧年中に伏線を回収に上がりました。

つまるところ、この記事は**人柱募集所**なのですがヾ(〃＞＜)ﾉﾞ☆

## 対象環境

**Emacs24**が動いてるUNIXっぽい環境(**OS X**とか、**Linux**とか、**\*BSD**とか…)なら、きっと動く気がします。Windowsとか**Cygwin**環境のことはちょっとわからないので、そのうち調べます……。

**Emacs23**では動作確認すらしてないです……!

## 導入

 * [zonuexe/shellenv-el · GitHub](https://github.com/zonuexe/shellenv-el)

インストール方法は`shellenv.el`をダウンロードして`load-path`の通ったディレクトリに抛り込むなり、`git clone`してきてディレクトリを`load-path`に追加するなり、お好みの方法でどうぞ。

個人的には[el-get](https://github.com/dimitri/el-get)を使ったパッケージ管理が最近のイチオシです。ただ、まだちゃんとしたレシピファイルを用意してないので、`.emacs`ファイル(できれば`$HOME/.emacs.d/init.el`)にel-getセットアップ用のスクリプトを加へて、さらにその下に以下のコードを貼ってくださると良さげです。

```cl:.emacs.d/init.el
(setq el-get-sources
      '((:name shellenv
               :type github
               :pkgname "zonuexe/shellenv-el"
               :description "load environment variables of your shell")))
(el-get 'sync 'shellenv)
```

## 設定

いちばんシンプルなのはこんな感じです。`custom-set-variables`じゃなくて`setq`でも可。

```cl:.emacs.d/init.el
(require 'shellenv)
(custom-set-variables
 '(shellenv/shell 'zsh))
(shellenv/setpath)
```

あるいは、起動するシェルのパスを直接指定することもできます。

```cl:.emacs.d/init.el
(require 'shellenv)
(custom-set-variables
 '(shellenv/path "/usr/local/bin/zsh"))
(shellenv/setpath)
```

わざわざ`'zsh`と指定するのは、このスクリプトが`bash`, `dash`, `ash`(それとPOSIX.1準拠っぽいその他`sh`)にも対応してるからですヾ(〃＞＜)ﾉﾞ☆

わざわざ「対応」って呼ぶほどの最適化をしてるわけではないのですが…‥。

## 書いてみて

自分でLispのコードをちゃんと書いたのはこれが初めてなのですが、こんな書き方で良いんですかね…? よくわからないので、無作法なところがあれば指摘が欲しいです ヾ(〃＞＜)ﾉﾞ

変数名や函数名の付け方はかなりオレオレで、プレフィクスには`shellenv/`を付ける、スクリプトローカル用の函数はプレフィクスの次に`.`を付ける、ローカル変数は`let*`束縛内で`.`を付けて短めな名前にする、みたいなルールでつけました。
スマフォからサーバにアプリのダウンロードリクエストが送信される時のフロー

# iOSの場合
iOSからOTA形式でアプリをダウンロドする時は最初に、HEADリクエストが来てその後にPOSTリクエストが来る。
 
# Androidの場合
androidで`Content-Type: application/vnd.android.package-archive`でダウンロードされる場合はGETリクエストが２回来る。（２回目のGETリクエストでダウンロードが始まる）
シェルのコマンドライン上で自分の移動したい位置にカーソルを瞬時に移動する方法

例えば '■' をカーソルとして

```
$ grep tset /var/log/php.log■
```

って入力したとするじゃないですか。ここで、grep の第一引数がたいぽってることに気づきます。それを直したくて十字キーの左ボタンおしっぱにしてカーソルを移動させるのもいいですが、一発で`tset`のところまで行きたいじゃないですか。そういう時はおもむろに`Control+r`を押してから、`e`を押します。すると

```
$ grep ts■et /var/log/php.log
```

カーソルがこの位置に移動します。Emacsライクに。ここで`Tab`を押すと検索が終了してカーソルがこの位置で普通の入力モードに戻ります。
便利ですね！これで本エントリのメインディッシュは終わりです。

その他よく使う検索を終了する入力として`Control+b`(カーソルを左に移動), `Control+f`(カーソルを右に移動), `Control+d`(カーソル右の文字(今回の場合`e`)を削除)などがあります。
注意点としては、Emacsだと`Enter`を押すと検索が終了するんですが、シェルで`Enter`を押すとそのコマンドを実行してしまいます。また、`Control+h`は検索するために入力した文字列の削除になります。

また、検索を終了させずにもう一度`Control+r`を押すと、もう一度`e`を検索します。

```
$ gr■ep tset /var/log/php.log
```

検索して戻りすぎた場合、`tset`のところに戻りたい場合は`Control+s`を押します(zsh限定？少なくともbashじゃ無理) （追記：bashでも設定すれば出来ました。コメント参照。thanks to paselaさん）
1回押すと

```
$ gre■p tset /var/log/php.log
```

こうなって、もう一度押すと

```
$ grep tse■t /var/log/php.log
```

こうなります。
`Control+r`や`Control+s`は普通過去のコマンドを検索することに使われますが、「過去のコマンド」に今入力した記述も含まれる、という感じでしょうか。

ちなみに余談ですがbashで`Control+s`を押すと端末をロックして動かなくなるので注意です。`Control+q`でロック解除になります。シェル使い始めた頃は、シェルがバグったと勘違いして毎回強制終了してました。。。
Flashの動きをCoronaで再現する

* トレース開始フレーム

```as
var mc = shine;
var xcoords = "";
var ycoords = "";
var widths = "";
var heights = "";
var alphas = "";

addEventListener(Event.ENTER_FRAME,traceMc);
function traceMc(event:Event) { 
    xcoords += (mc.x + ",");
    ycoords += (mc.y + ",");
    widths  += (mc.width + ",");
    heights += (mc.height + ",");
    alphas  += (mc.alpha + ",");
}
```

* トレース終了フレーム

```as
trace( "xcoords = { " + xcoords.slice( 0, -1 ) + " }");
trace( "ycoords = { " + ycoords.slice( 0, -1 ) + " }");
trace( "widths = { "  + widths.slice( 0, -1 ) + " }");
trace( "heights = { " + heights.slice( 0, -1 ) + " }");
trace( "alphas = { " + alphas.slice( 0, -1 ) + " }");
removeEventListener(Event.ENTER_FRAME, traceMc);
stop();
```

* Corona

```lua
(Paste coords trace info from Flash)
local i = 1
local function moveObject()
  if i <= #xcoords then
    object.x = xcoords[i]
    object.y = ycoords[i]
    object.width = widths[i]
    object.height = heights[i]
    i = i + 1
  else
    Runtime:removeEventListener( "enterFrame", moveObject )
  end
end
Runtime:addEventListener('enterFrame', moveObject)
```

* [取得できるDisplayObjectのプロパティ一覧](http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/display/DisplayObject.html)

* [See also](http://developer.coronalabs.com/code/animation-along-path-flash)
git daemonのrcスクリプト


```
#!/bin/sh

PIDFILE=/var/run/git-daemon.pid
REPODIR=/var/git

case $1 in
    start)
        git daemon --detach --export-all --enable=receive-pack --pid-file=${PIDFILE} --base-path=${REPODIR}
        ;;
    
    stop)
        if [ -f ${PIDFILE} ]; then kill `cat ${PIDFILE}` && rm ${PIDFILE}; fi
        ;;
    
    restart)
        $0 stop && $0 start
        ;;
esac

exit 0
```

* これを ```/etc/init.d/git-daemon```とかに保存する。
* サーバ起動時に自動的に起動させたいなら、```/etc/rc3.d/S99git```とかにシンボリックリンクを保存する
* 起動ユーザとかリポジトリディレクトリのパーミッションとかは適宜調整
Ubuntu 12.04でLaTeX環境を構築する


Ubuntu 12.10のTex Liveバックポートを利用することでとても簡単に環境を構築できるようになっています。
<font color="#E0E0E0">それにしても、あまりに簡単でUbuntu 10.10の頃を考えると…(笑)</font>

## 1.TeX Liveバックポートリポジトリ
```bash:Bash
# リポジトリを追加
$ sudo apt-add-repository ppa:texlive-backports/ppa

# パッケージ情報を更新
$ sudo apt-get update
$ sudo apt-get upgrade
```

## 2.TeX Live本体
1つのパッケージですがとても時間がかかります。

```bash:Bash
$ sudo apt-get install texlive-lang-cjk
```

## 3.動作確認

### 3.1.コマンド存在確認
```bash:Bash
# コマンド確認
# tex -> dvi
$ which platex

# dvi -> pdf
$ which dvipdfmx

# ビューア
$ which evince
```

### 3.2.サンプルファイル作成
```tex:sample.tex
¥documentclass{jarticle}
¥begin{document}
This is a sample document.
これはサンプルドキュメントです。
¥end{document}
```

### 3.3.コンパイル
```bash:Bash
# dvi生成
$ platex sample.tex

# pdf生成
$ dvipdfmx sample
```

### 3.4.閲覧
```bash:Bash
$ evince sample.pdf
```

## 参考
+ [Ubuntu日本語フォーラム / 【自己解決】12.04環境にUTF8対応のLatexを導入](https://forums.ubuntulinux.jp/viewtopic.php?id=14547)
RubyでWorkpile

```ruby
require 'thread'

class Workpile
  def initialize(num_workers)
    raise ArgumentError, 'Require at least 2 workers' if num_workers < 2
    @queue = Queue.new
    @workers = []
    num_workers.times do
      @workers << Thread.new{ loop{@queue.pop.call} }
    end

    ObjectSpace.define_finalizer(self, proc{@workers.each{|w| w.exit}})
  end

  def push(&block)
    @queue.push block
    @workers.each{|w| w.run} 
  end
end
```

```ruby
work = Workpile.new 10

work.push do
  # 処理1
end

work.push do
  # 処理2
end

...
```
Vimで一定時間ごとに処理を割り込む

Vimで一定時間ごとに処理を割り込むやり方を忘れるのでメモ。

[Vim で一定時間ごとに処理を割り込む - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20121102/1351836801)
phpunit autotest(using guard-shell)


```
$ vi Gemfile
```

```
source 'https://rubygems.org'
group :development do
  gem 'guard-shell'
  # Notify
  gem 'libnotify',  require: false
  gem 'rb-inotify', require: false
  gem 'rb-fsevent', require: false
  gem 'growl',      require: false
end
```

```
$ bundle
$ rbenv rehash
```

```
vi Guardfile
```

```
guard 'shell' do
  watch(%r{^protected/(models|components)/(.*)\.php$}){|m|
    testfile = "tests/unit/#{m[0]}/#{m[1]}Test.php"
    run_phpunit(testfile)
  }
  watch(%r{^tests/(.*)Test\.php$}){|m| run_phpunit(m[0]) }
end

def run_phpunit(filename)
  unless FileTest.exist?(filename)
    puts "\n>> Not found #{filename}"
    return
  end

  puts "\n>> run: #{filename}"
  result = `phpunit --bootstrap tests/bootstrap.php #{filename}`
  result =~ /\((.+test.?,.+assertion.?)\)/
  if success = $+
    n "#{success}", File.basename(filename)
    puts ">> passed: #{success}"
  else
    result =~ /(Tests:.+Assertions:.+Failures:.+)/
    failure = $+
    n "Failed", File.basename(filename)
    puts ">> failed"
    puts ">> Error report\n#{result}"
  end
end
```
rbenv-version

## Switch to ruby version per project on rbenv

```
cd [project_dir]
echo "1.9.3-p362" > .rbenv-version
```

## Example
```
$ cd ~
$ rbenv global 2.0.0-preview2
$ rbenv versions
  1.9.3-p362
* 2.0.0-preview2 (set by /Users/kengos/.rbenv/version)
$ ruby -v
ruby 2.0.0dev (2012-12-01 trunk 38126) [x86_64-darwin12.2.1]
$ cd [project_dir]
$ rbenv versions
* 1.9.3-p362 (set by /[project_dir]/.rbenv-version)
  2.0.0-preview2
$ ruby -v
ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-darwin12.2.1]
$ cd ~
$ ruby -v
ruby 2.0.0dev (2012-12-01 trunk 38126) [x86_64-darwin12.2.1]
```
Emacsの起動時間を短縮する方法

Emacsでlazyloadというautoloadとeval-after-loadを組み合わせたマクロを使った起動時間短縮方法について書きました。「自分のEmacsの起動が重いなー」と感じてる人で、「でも、autoloadとかeval-after-loadとかよくわからないよなー」という人はこのマクロを使ってみると楽に設定できるかなと思うのでどうぞ見てってください。
http://d.hatena.ne.jp/pogin/20121230/1356880875
[超基本] LEFT JOIN で参照されてない（？）レコードを抽出


SQL をろくに使ったことがないので、超基本的なことです。

まず、適当なデータベースを用意します。

```sql
create database join_test;
use join_test;
create table customers (
  id int not null,
  name varchar(255)
);
create table items (
  id int not null,
  name varchar(255)
);
create table purchases (
  customer_id int not null,
  item_id int not null
);

insert into items values (1, 'Burger');
insert into items values (2, 'Ham');
insert into items values (3, 'French Fry');
insert into items values (4, 'Beer');

insert into customers values (1, 'John');
insert into customers values (2, 'Mary');
insert into customers values (3, 'Bob');

insert into purchases values (1, 1);
insert into purchases values (1, 2);
insert into purchases values (1, 4);
```

John がハンバーガーとハムとビールを買いました。他の二人は何も買ってません。

まず INNER JOIN で、買った人と商品のペアを抽出してみます。一番良くあるやつですね。

```sql
select c.name customer, i.name item
from customers c
inner join purchases p on c.id = p.customer_id
inner join items i on i.id = p.item_id;

+----------+--------+
| customer | item   |
+----------+--------+
| John     | Burger |
| John     | Ham    |
| John     | Beer   |
+----------+--------+
3 rows in set (0.00 sec)
```

LEFT JOIN を使ってみます。

```sql
select *
from customers c
left join purchases p on c.id = p.customer_id;

+------+------+-------------+---------+
| id   | name | customer_id | item_id |
+------+------+-------------+---------+
|    1 | John |           1 |       1 |
|    1 | John |           1 |       2 |
|    1 | John |           1 |       4 |
|    2 | Mary |        NULL |    NULL |
|    3 | Bob  |        NULL |    NULL |
+------+------+-------------+---------+
5 rows in set (0.00 sec)
```

LEFT JOIN では ON にあてはまらないレコードの右側に NULL が入るようです。これを利用して、何も買ってない人を抽出できます。

```sql
select c.name scrooge
from customers c
left join purchases p on c.id = p.customer_id
where p.customer_id is null;

+---------+
| scrooge |
+---------+
| Mary    |
| Bob     |
+---------+
2 rows in set (0.00 sec)
```

ただし WHERE で NULL かどうかを見るのは NOT NULL なカラムでないと、違うレコードが紛れ込む可能性があるので注意しましょう。

参考
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
パイプを使った外部プログラムとの入出力

外部プログラム(tcpdump)に標準入力から有限なデータを渡して，その標準出力を受け取りたい場面に出くわしたのだけれども，ライブラリ一発でうまくいかなかったので試行錯誤の末，それができる関数を作ってみた．

```ruby
dump = File.read('tcpdump.dump')
filterd_dump = exec_stdio("/usr/sbin/tcpdump -r - -w - port 80 2>/dev/null", dump)
```

こんな感じで呼び出してデータを加工したい．

```ruby:exec_stdio.rb
def exec_stdio cmd, input
	output = ''
	buf_size = 4096
	IO.popen(cmd, "r+b") do |io|
		offset = 0
		writable = true
		while offset < input.bytesize
			begin
				if writable
					chunk_size = [buf_size, input.bytesize-offset].min
					chunk = input.byteslice(offset, chunk_size)
					offset += io.write_nonblock(chunk)
				else
					output += io.read_nonblock(buf_size)
				end
			rescue IO::WaitReadable
				writable = true
				retry
			rescue IO::WaitWritable
				writable = false
				retry
			end
		end
		io.close_write
		while !io.eof
			begin
				output += io.read_nonblock(buf_size)
			rescue IO::WaitReadable
				retry
			end
		end
	end
	output
end
```

最初IO.writeで普通に書いていたらwiteでブロックされてプログラムがIO待ちで停止していた．調べたところパイプのバッファのサイズは65536（環境によっては4096）byteしか無く，どうもこのバッファを読み書き両方に使ってるみたい？なのでwrite_nonblockで適当な数だけ書いて，書き込めなくなったら例外をキャッチしてread_nonblockで読み出すということをやって，読み込めなくなったら今度は書き込むということをしている．書き込みが終わったらあとは読むだけなので，close_writeした後，read_nonblockで読み出している．本当にこんなコードで良いのだろうか？

バッククォートと一時ファイルで出来なくはないんだけど，わざわざディスクIOを発生させるのも嫌なので，直接データをやり取りしたかった．他にスマートな方法があったら教えて欲しい．
Backbone.jsのModelのPropertyを変数を用いてSaveする方法

saveしたいpropertyが一つの場合は、下記のようにすれば、保存できる。

```coffeescript:CoffeeScript
Model.save variable, value
```

しかし、propertyが二つ以上の場合は、Hashを使う必要があります。

```coffeescript:CoffeeScript
Model.save
    variable1: value1
    variable2: value2
```

とすると当然エラーが返ってくるので、下記のようにします。

```coffeescript:CoffeeScript
hash = {}
hash[variable1] = value1
hash[variable2] = value2
Model.save hash
```

参考
[backbone.js set model internal attributes hash directly](http://stackoverflow.com/questions/7409454/backbone-js-set-model-internal-attributes-hash-directly)
複数アカウントに対応したカスタムツイートの投稿方法



TWTweetComposeViewControllerを使わないやりかた。
基本的には[サンプルコード(Tweeting)](http://developer.apple.com/library/ios/#samplecode/Tweeting/Introduction/Intro.html)に準じています。

## ポイント
- 複数アカウントに対応させるため、ActionSheetなどで場合分けする
- delegateやBlocks使用時はアカウントを取得し直す

ちなみに、`ACAccountStore`の`requestAccessToAccountsWithType:withCompletionHandler:`メソッドはiOS6ではDeprecatedになっています。
iOS6以降のみ対応なら、`requestAccessToAccountsWithType:options:completion:`を使用するのが望ましいですね。

## コード
※ ActionSheetのBlocks対応には[UIAlertView-Blocks](https://github.com/jivadevoe/UIAlertView-Blocks)を使っています。

``` objc:viewController.m
- (void)viewDidLoad
{
    // 循環参照避け
    __weak typeof(self) id _self = self;
    
    ACAccountStore* store = [[ACAccountStore alloc] init];
    ACAccountType* type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
    // iOS6ではDeprecated
    [store requestAccessToAccountsWithType:type withCompletionHandler:^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray* accounts = [store accountsWithAccountType:type];
            if ([accounts count] > 0) {
                if ([accounts count] == 1) {
                    [self tweet:0];
                    return;
                }
                // 複数アカウントの場合
                UIActionSheet* sheet = [[UIActionSheet alloc] initWithTitle:@"使用するアカウントを選択してください。" cancelButtonItem:nil destructiveButtonItem:nil otherButtonItems:nil];

                // アカウントの数ぶんボタンを増やす
                for (NSInteger i=0; i<[accounts count] i++) {
                    RIButtonItem* button = [RIButtonItem itemWithLabel:[NSString stringWithFormat:@"@%@", [[accounts objectAtIndex:i] accountDescription]]];
                    [button setAction:^(void){
                        [_self tweet:i];
                    }];
                    [sheet addButtonItem:button];
                }
                [sheet addButtonItem:[RIButtonItem itemWithLabel:@"キャンセル"]];
                [sheet setCancelButtonIndex:[accounts count]];
                [sheet showInView:self.view];
            }
        } else {
            // エラー通達など
        }
    }];
}

- (void)tweet:(NSInteger)index
{
    // アカウントを再取得
    ACAccountStore* store = [[ACAccountStore alloc] init];
    ACAccountType* type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    NSArray* accounts = [store accountsWithAccountType:type];

    // リクエストを生成
    TWRequest* req = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"] parameters:@{@"status" : @"テストです。"} requestMethod:TWRequestMethodPOST];

    // アカウントをセット
    [req setAccount:[accounts objectAtIndex:index]];

    // 送信
    [req performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if (urlResponse.statusCode == 200) {
            NSLog(@"投稿しました");
        }
        else {
            NSLog(@"投稿できませんでした\nstatus code : %d", urlResponse.statusCode);
        }
    }];
}

```
git-ftp インストールと設定(Windows) 

https://github.com/git-ftp/git-ftp

Git のバージョン管理と連携して、最新のコミットを FTP でアップロードしてくれます。

動作環境）
・Git-1.7.8
・Windows XP, 7


# インストール

参考）
https://github.com/git-ftp/git-ftp/blob/develop/INSTALL.md

Git Bash で下のコマンドを実行してください。

```bash
cd ~
git clone http://github.com/git-ftp/git-ftp git-ftp.git
cd git-ftp.git && chmod +x git-ftp
cd /bin/
ln -s ~/git-ftp.git/git-ftp git-ftp
```

１行目でユーザディレクトリに移動。
C:\Users\[ユーザ名]\  (Windows 7 の場合)

５行目で git-ftp へのシンボリックリンクを作成しています。

これでインストール作業は完了。


正しくインストールされているか、まずは確認しましょう。
"git ftp" と入力して、とりあえず [Enter] を押してください。

```bash
> git ftp
git-ftp <action> [<options>] <url>
```

上記の表示が出たら、ＯＫです。



# 設定

Git リポジトリのあるディレクトリに移動します。
Git Bash で下のコマンドを実行します。

git config git-ftp.[固有名称].url ftp://[ドメイン名][:ポート番号]/[FTPで接続されたディレクトリからの相対パス]/
git config git-ftp.[固有名称].user [ユーザ名]
git config git-ftp.[固有名称].password [パスワード]

```bash
git config git-ftp.service.url ftp://domain.com/html/application/
git config git-ftp.service.user admin
git config git-ftp.service.password xxxxxxx
```

※）url の注意

FTP で接続したときに、自動的に "/var/www" の位置にいる場合、
上記のＵＲＬのパスは、"/var/www" を省略してください。

```bash
誤：
git config git-ftp.service.url ftp://domain.com/var/www/html/application/
正：
git config git-ftp.service.url ftp://domain.com/html/application/
```

最初にファイルをアップロードするときは "init" コマンドを使います。
上記の「固有名称」(ここでは service) を -s の後につけます。

```bash
git ftp init -s service
```

FTP でアップロードされたディレクトリに ".git-ftp.log" が作成されます。

２回目以降は、Git で更新されたファイル差分のみを "push" コマンドでアップロードします。

```bash
git ftp push -s service
```

なお、Git で編集中のファイルがあるとアップロードするときに必ずエラーになるので commit は終えておいてください。

初めて git-ftp を使うときは、テスト用のリポジトリでアップロードしてみることをお勧めします。

アップロードに失敗したときは、"-v" で詳細な情報を "-vv" (v 2つ) でさらに詳細な情報を確認できます。

```bash
git ftp init -v -s service
```

私の場合、サーバ側で FTP の PASV モードがうまく設定されていなくて、何度も接続に失敗しました。エラーが起こる場合は、-vv で確認してみてください。
Objective-Cで定数


"=" 要らないけど文字列は@が必要だったりしてややこしかったのでメモ。

## 数値

```
#define NANIKA 100

NSString *str = [NSString stringWithFormat:@"%d", NANIKA];
NSLog(str);
```
=> 100

###大文字、小文字で別扱い

```
#define NANIKA 100
#define nanika 200

NSString *str = [NSString stringWithFormat:@"%d & %d", NANIKA, nanika];
NSLog(str);
```
=> 100 & 200

###計算

```
#define NANIKA 100
#define nanika 200

NSString *str = [NSString stringWithFormat:@"%d", NANIKA + nanika];
NSLog(str);
```
=> 300

## 文字列
### @が必要

```
#define MOJI mojidesuyo

NSLog(MOJI);
```
=> ビルドエラー

```
#define MOJI "mojidesuyo"

NSLog(MOJI);
```
=> ビルドは通るけど__呼び出し時にクラッシュ__

```
#define MOJI @"mojidesuyo"

NSLog(MOJI);
```
=> mojidesuyo

### stringWithFormatと組み合わせられる

```
#define NANIKA 100
#define nanika 200
#define MOJI @"%d は %d より %d 大きい"

NSLog([NSString stringWithFormat:MOJI, nanika, NANIKA, nanika - NANIKA]);
```
=> 200 は 100 より 100 大きい
twitter-bootstrap-rails、Ruby対応状況について


JRubyで[twitter-bootstrap-rails](https://github.com/seyhunak/twitter-bootstrap-rails)を使おうとしたらハマったので、まとめておく。

賞味期限は2.1.10がリリースされるまでかな?

## 2.1.6未満 
 * therubyracer/libv8に依存している
 * C拡張(`-Xcext.enabled=true`)を有効にしないとJRubyでは使えない
 * C拡張が無効になっているtravisだと使えない

## 2.1.6〜2.1.9(最新)
  * libv8のかわにりRhinoを使える。
 * CRubyなら`therubyracer`、JRubyなら`therubyrhino`を別途入れる必要がある(?)
 * Ruby 1.9のハッシュ記法が使われているので、**Ruby 1.8で使えない**

## [bf3d49](https://github.com/seyhunak/twitter-bootstrap-rails/commit/bf3d4e9d0c8ff8866c201ba8997af5abfd57c637)以降

 * [bf3d49](https://github.com/seyhunak/twitter-bootstrap-rails/commit/bf3d4e9d0c8ff8866c201ba8997af5abfd57c637)で修正された
 * まだこのコミットを含んだバージョンはリリースされていない

## まとめ

とりあえず現状(2012-12-30)ではGemfileを以下のようにするのがいい気がする。

    gem 'twitter-bootstrap-rails', :github => 'seyhunak/twitter-bootstrap-rails', :ref => 'b126c86a57fd0512e296be9f73b0613c34a89bfb'
    gem 'therubyracer', :platform => :ruby
    gem 'therubyrhino', :platform => :jruby
scp と ipv6 が美しくない

ipv6でそもそもアドレス直打ちするなんてありえないんだろうけど…

あまりにださい。。

```
scp hoge sowawa@\[2601:9:5401:c:2061:3833:8d47:7556\]:./ 
```

ちなみにurlとかも`http://[2601:9:5400:c:2061:3833:8d47:7556]/`こんな感じだから仕方ないのだけど。
gentoo, zsh, rbenvのときにPATHはどこに書いておくべきか。

タイトルがそのまま言いたいことだ。

githubの[rbenv](https://github.com/sstephenson/rbenv)のREADMEだと.zshenvに貼っとけ(2012.12.30現在)となっていますがgentooでemergeで入れたzshは、
`/etc/zsh/zprofile`でPATHを上書きしてくれます。

といわけで、 `~/.zprofile`に書いておくと良い感じでした＠

> P.S. 
> rbenvのUbuntu Noteでは`~/.profile`に書いておくと良いとあります。
> /etc 以下のShellの起動時に呼び出されるスクリプトたちは自由にPATHとか書き換えてくれるんで、使ってるディストリビューションごとに確認しないとダメです。（OSごとに提供側で最適化してるのかもしれないけど、気にしないとダメなら結局めんどうだ。。。）
> ※: gentooのzsh はemerge直後は`/etc/zsh/zprofile`だけでした。
GentooでIPv6を利用する

GentooでIPv6を使おうとして
適切な情報が無さそうだったので書いておきます。

> 注: 今回は以下のような例ではありません。
> - 6rd でさくらのVPSで利用しているケースとかはあるみたい
> - radvdの例は公式のフォーラムにあった
> - comcastのdual stack環境だとDHCPv6-PDで何も気にせず使えた

ipv6をつけてgenkernelしておくとか当たり前のことは書きません。
リンクアドレスをデフォルトルートにした場合、
それをconf.d/netへの書き方が見つからなかったので。

## このエントリの前提

- Static IPv6
- link addressをgwにする

その時のconf.dを貼っておきます。

```/etc/conf.d/net
config_eth0="133.*.*.*/24
  2401:*:*::240/64"
routes_eth0="default via 133.*.*.*
             default via fe80::1 dev eth0"
dns_servers_eth0="*.*.*.* 2401:*::100"
```

アドレスは適当に`*`とかにしてます。

グローバルなv6アドレスの場合はv4と同じように`default via ...`と書くのですが、
リンクアドレスを使ってる場合は`default via ... dev eth0`と記述する必要があります。
言われれば当たり前なのですが、OSがどのローカルリンク流すのかわからないよね。

ここにdev eth0って書けるのかが不明でしばらく悩んで試しに書いてみたらうまく行ったので
エントリにまとめておきます。
brewbygemsでgemのPATH設定をもっと楽に


ruby、どうやってインストールしていますか？rvm？それともrbenv？

私はhomebrewを使っています。楽です。
しかしながら、その場合gemの実行ファイルのPATHを手動で設定する必要があります。
`PATH=$PATH:/usr/local/Cellar/ruby/1.9.3-p327/bin` みたいな感じですね。
これを自動でやるという手もあります([gem の PATH を動的に設定する - すぱぶろ](http://superbrothers.hatenablog.com/entry/20111109/1320849121))が、もっと楽かもしれない手段がありました。

[brewbygems](https://github.com/indirect/brewbygems) を使いましょう。
`gem install`をhookして、`/usr/local/bin`以下にgem実行ファイルのシンボリックリンクをおいてくれます。楽です。

### 注意
rubygems.orgにあがっているのは古い(v0.4.0)ので、うまく動かない可能性があります。
githubからcloneして最新版(v0.5.0)をインストールしましょう。

```
% git clone git://github.com/indirect/brewbygems.git
Cloning into 'brewbygems'...
remote: Counting objects: 104, done.
remote: Compressing objects: 100% (51/51), done.
remote: Total 104 (delta 38), reused 102 (delta 36)
Receiving objects: 100% (104/104), 12.61 KiB, done.
Resolving deltas: 100% (38/38), done.

% cd brewbygems
% rake install  #そもそもrake入っているか、PATH通っているかは確認してね
brewbygems 0.5.0 built to pkg/brewbygems-0.5.0.gem
brewbygems (0.5.0) installed

% gem install _任意のgem_

```
カスタムブロックでFacebookとかTwitterの内容を表示する方法


![](http://i.imgur.com/SusY1.png)

[XOOPS Themes and Templates Advent Calendar 2012](http://qiita.com/advent-calendar/2012/xoops-themes-templates/participants) の20日めの投稿です。
⇒　19日目の投稿 [suinさん: XOOPS+Smartyテンプレートテクニック 13個詰め合わせ](http://qiita.com/items/b6e52aa73a9b24846632 "suinさん: XOOPS+Smartyテンプレートテクニック 13個詰め合わせ")
⇒　21日目の投稿 [kilicaさん: XOOPS のテーマ雛形を生成する](http://qiita.com/items/2168dc8a184f74068613 "kilicaさん: XOOPS のテーマ雛形を生成する")

## ソーシャルと連携しよう！
最近はFacebookやTwitterといったソーシャルなサービスが主流になっていて、ウェブサイトとソーシャルサービスとの連携をすることでウェブサイトの利用価値をさらに高めることができるようになっていることから、「連携をさせたい！」と思っている方も多いのではないかと思います。

そこで、今回はFacebookとTwitterのFeedをウェブサイトに表示する方法を紹介したいと思います。
それでは今日もはりきっていってみましょう！

## Facebook編

###1. はじめに
----

Facebookの「コメント」や「いいね！」をサイトに表示するのは至って簡単です！しかもXOOPS側で特別な何かをしないといけないということはありません。

ただし、Facebook側で`App ID`を取得したり、FacebookのAPIを呼び出すためのJavascriptをウェブサイト側のHTMLに（今回はXOOPSのThemeに）書く必要があります。

今回は**Facebookページ**を対象に作業をしてみましょう！

###2.Facebookの`App ID`ってどこで取得するのか
----

はじめにFacebookの開発者向けページ https://developers.facebook.com/apps/ で `App ID`を取得します。ここでは Facebookページ が既ににある前提で話を進めます。（Facebookページをまだ持っていない方は別途Facebookページを作成する必要があります）

###3.Facebookの `App ID` を取得する
----

####3-1.取得するページへ行く
https://developers.facebook.com/apps/ へ行き、ページの右上にある `+ 新しいアプリを作成` のボタンをクリックします。

![](http://i.imgur.com/dMl61.png)

####3-2.必要な情報を入力する
下記の2項目を入力します。

・App Name
・App Namespase

※ 入力した項目の右側が`App Name` の場合はValid、 `App Namespace` の場合はAvailableになることを確認してください。

![](http://i.imgur.com/VMGdx.png)

####3-3.取得完了
取得が完了するとこういった画面に `App ID` が表示されます。

![](http://i.imgur.com/vaNLy.png)

----
----

###4.ウェブサイトに表示するコードをゲットする！
----

ここまでくればあと一息です！
頑張ってください。

####4-1.Facebookページへ行く

https://www.facebook.com/xoopscube.beginners へ行きます。
※ ここではXOOPS初心者勉強会のFacebookページを対象とします。

####4-2.ソーシャルプラグイン取得ページへ行く

「Facebookページを編集」
 ⇒ 「基本データを編集」」
 ⇒ 「リソース」
 ⇒ 「ソーシャルプラグインを利用する」
の順でクリックして進みます。

![](http://i.imgur.com/N4oUj.png)
![](http://i.imgur.com/O0JPd.png)
![](http://i.imgur.com/Z7WvF.png)

####4-3.いいね！Boxを選ぶ

今回は「いいね！Box（like box）」を使うことにします。

![](http://i.imgur.com/CdPKh.png)

####4-4.3つの情報を入力する
最低限としては `Facebook Page URL` だけがあれば作成はできますが、ウェブサイトのどこに配置するかでサイズを考慮する必要があると思います。今回はトップページのセンターに配置するため、幅を700、高さを400としました。

・Facebook Page URL
・Width
・Height

![](http://i.imgur.com/thva7.png)

###4-5.Get Codeをクリック！

![](http://i.imgur.com/aw4EB.png)

Get Codeをクリックすると、ウェブサイトに貼り付けるコードが2種類表示されます。

![](http://i.imgur.com/OObdr.png)

1はHTMLの<body>タグのすぐ下に貼り付けます。
これで必要なJavascriptのコードが読み込まれます。

2は今回はカスタムブロックにそのまま貼り付けました。

###5.完成！！

出来上がるとこんな感じでウェブサイトに表示されます。
意外と簡単にできてしまうので、ぜひチャレンジしてみてください！

![](http://i.imgur.com/W3iTT.png)
CLtL2: 第27章 プリティプリント

Advent Calendar 2012と言いながら年を越してしまったらいかにも申し訳ないので、遅ればせながら参加することにしました。最初から、多分三回くらいの記事になるのではないかと思っていたので、年内は軽く助走的に始めます。

プリティプリントと言えば、何となくそれはきれいにインデントをつけて印刷してくれるもの、と思っていらっしゃる方は大勢いると思います。でもそれを実際にこの27章の記述に従って書こうとすると、なかなか一筋なわではいかず、結局普通のformat文できれいに印刷しておしまい、という方も大勢いらしゃるのではないでしょうか。

プリティプリントを使った場合と使わない場合で何がちがうかというと、印刷時の有効幅に合わせて成型してくれるということです。逆に言うと、そういうようにコマンドなり、フォーマット制御文なりを使うということです。たとえば、以下のようなテキストがあったとしましょう。

```cl
(defun scheme (&optional x)
  "A Scheme read-eval-print loop (using interp).
  Handles call/cc by explicitly passing continuations."
  ;; Modified by norvig Jun 11 96 to handle optional argument
  ;; instead of always going into a loop.
  (init-scheme-interp)
  (if x
      (interp x nil #'print)
    (loop (format t "~&==> ")
      (interp (read) nil #'print))))
```

そしてちょっと変則的ですが、例題として以下のようなことをしてみます。

```cl
cg-user(3): (setq foo 
  '(defun scheme (&optional x)
    "A Scheme read-eval-print loop (using interp).
    Handles call/cc by explicitly passing continuations."
    ;; Modified by norvig Jun 11 96 to handle optional argument
    ;; instead of always going into a loop.
  (init-scheme-interp)
    (if x
        (interp x nil #'print)
      (loop (format t "~&==> ")
        (interp (read) nil #'print)))))
```

ここでクォートをつけていることをお見逃しなく。
すると、Windows が広い場合にはこのように印刷されますし、

```cl
cg-user(4): foo
(defun scheme (&optional x)
  "A Scheme read-eval-print loop (using interp).
    Handles call/cc by explicitly passing continuations."
  (init-scheme-interp)
  (if x (interp x nil #'print) (loop (format t "~&==> ") (interp (read) nil #'print))))
```

狭い場合にはこんな風に印刷されます。

```cl
cg-user(5): foo
(defun scheme (&optional x)
  "A Scheme read-eval-print loop (using interp).
    Handles call/cc by explicitly passing continuations."
  (init-scheme-interp)
  (if x
      (interp x nil #'print)
    (loop (format t "~&==> ")
          (interp (read) nil #'print))))
```

その時々の環境に合わせて、ダイナミックにインデンテーションが変化します。

世の中にはこんな機能はいらないものもあります。
たとえばセマンティックウェブ系におけるNTripleフォーマットは１トリプルは必ず１行で終わりです。しかしその拡張であるTurtleは全くjsonと似ていて、複数行に渡ったまとまりでインデンテーションがほしいものだし、XMLでも同様ですね。そんなインデンテーションは機械可読としてはあってもなくてもいいけど、人間向きにはあってほしい、みたいなものにはこういうプリティプリント機能が有効ということですね。
逆にインデンテーション依存の言語ではプリティプリントは余分な機能なのかしら。

Common Lisp のプリティプリントには関数を使う方法と、format文の制御文を使う方法があります。後者のほうが使うのは実は簡単だったりするのですが、[次回は](http://qiita.com/items/c8223c9cb825e064130a)とりあえず関数を使う方法について説明します。
第六回オフラインリアルタイム参考問題をC++で解いた

初めて投稿します。よろしくお願いします。

ゴルフしたかったわけではありませんが、最初は普通に解いたものをコンパクトにしているうちにこのような形になりました。関数作ったあたりがあまりゴルフっぽくなさそうです。

C++で面白い回答をしている方がいれば是非参考にしたいので教えてください。

問題：http://nabetani.sakura.ne.jp/hena/ord6lintersection/
解答例：http://qiita.com/Nabetani/items/4c60f10b73812e86441c

```cpp
#include <iostream>

bool a(int a, int b, int c) {
  return a <= b & b <= c | c <= b & b <= a;
}

int main() {
  char s[99];
  std::cin >> s;
  int c = 0;
  for (int x = 48; x < 58; ++x)
    for (int y = 48; y < 58; ++y)
      c += a(s[0], x, s[3]) & a(s[1], y, s[4]) | a(s[0], x, s[6]) & a(s[1], y, s[7])
          && a(s[9], x, s[12]) & a(s[10], y, s[13]) | a(s[9], x, s[15]) & a(s[10], y, s[16]);
  std::cout << c;
}
```
Debian squeeze にGUI版でないemacsを入れる

素直に `sudo apt-get install emacs` すると、サーバーでは全く要らないライブラリが入ってしまう。

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  anthy-common emacs23 emacs23-bin-common emacs23-common gconf2-common hicolor-icon-theme libanthy0 libasound2 libatk1.0-0 libatk1.0-data libcairo2 libcroco3
  libdatrie1 libdbus-glib-1-2 libfontenc1 libfribidi0 libgconf2-4 libgif4 libgsf-1-114 libgsf-1-common libgtk2.0-0 libgtk2.0-bin libgtk2.0-common libidl0
  libm17n-0 liborbit2 libotf0 libpango1.0-0 libpango1.0-common libpixman-1-0 librsvg2-2 libthai-data libthai0 libxcb-render-util0 libxcb-render0 libxcomposite1
  libxcursor1 libxdamage1 libxfixes3 libxfont1 libxft2 libxi6 libxinerama1 libxrandr2 libxrender1 m17n-contrib m17n-db x-ttcidfont-conf xfonts-encodings
  xfonts-utils
提案パッケージ:
  emacs23-common-non-dfsg emacs23-el libasound2-plugins librsvg2-common gvfs m17n-docs ttf-japanese-gothic ttf-japanese-mincho ttf-thryomanes ttf-baekmuk
  ttf-arphic-gbsn00lp ttf-arphic-bsmi00lp ttf-arphic-gkai00mp ttf-arphic-bkai00mp librsvg2-bin
以下のパッケージが新たにインストールされます:
  anthy-common emacs emacs23 emacs23-bin-common emacs23-common gconf2-common hicolor-icon-theme libanthy0 libasound2 libatk1.0-0 libatk1.0-data libcairo2
  libcroco3 libdatrie1 libdbus-glib-1-2 libfontenc1 libfribidi0 libgconf2-4 libgif4 libgsf-1-114 libgsf-1-common libgtk2.0-0 libgtk2.0-bin libgtk2.0-common
  libidl0 libm17n-0 liborbit2 libotf0 libpango1.0-0 libpango1.0-common libpixman-1-0 librsvg2-2 libthai-data libthai0 libxcb-render-util0 libxcb-render0
  libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxfont1 libxft2 libxi6 libxinerama1 libxrandr2 libxrender1 m17n-contrib m17n-db x-ttcidfont-conf
  xfonts-encodings xfonts-utils
アップグレード: 0 個、新規インストール: 51 個、削除: 0 個、保留: 0 個。
```

No X!!!!!!

```bash:INSTALL
sudo apt-get install emacs23-nox
```