OmniAICreator/Qiita-1.07M huggingface dataset:
Rspec の it を「それ」と書けるようにする


# alias を追加する

```ruby
class RSpec::Core::ExampleGroup
  alias_example_to :それ
end
```

#するとこのように、たいしてかわらない

```ruby
describe "全てのこと" do
  それ "はうまくいく" do
    true.should be_true
  end
end
```


describe とか context はうまく日本語に約せない...
gauche.testを楽にするひげぽんさんのマクロ


が便利だった。ソースは[こちら](http://d.hatena.ne.jp/higepon/20071107/1194447993)。

~~~~scheme
(define-syntax eqt
  (syntax-rules ()
    ((_ a b)
     (test* (quote b) a b))))
~~~~

こいつを定義しておけば、

~~~~scheme
(test* "(tree->list-2  mytree)" '(1 2 3 4 5 6 7) (tree->list-2 mytree))
~~~~

↑のように書いていたテストを、

~~~~scheme
(eqt '(1 2 3 4 5 6 7) (tree->list-2 mytree))
~~~~

このように表現できるようになる。なるほど便利。テストのタイトル変更したのにテストコード変更してなかったー！とか防止できる。


## テスト例

~~~~scheme:tree->list-2
(define (tree->list-2 tree)
  (define (copy-to-list tree result-list)
    (if (null? tree)
      result-list
      (copy-to-list (left-branch tree)
                    (cons (entry tree)
                          (copy-to-list (right-branch tree)
                                        result-list)))))
  (copy-to-list tree '()))
~~~~

~~~~scheme:mytree
(define mytree
  (make-tree 4
             (make-tree 2
                        (make-tree 1 '() '())
                        (make-tree 3 '() '()))
             (make-tree 6
                        (make-tree 5 '() '())
                        (make-tree 7 '() '()))))
~~~~

~~~~scheme:gosh
gosh> mytree
(4 (2 (1 () ()) (3 () ())) (6 (5 () ()) (7 () ())))
~~~~


~~~~scheme:gosh
gosh> (eqt '(1 2 3 4 5 6 7) (tree->list-2 mytree))
test (tree->list-2 mytree), expects (1 2 3 4 5 6 7) ==> ok
#<undef>
~~~~
エラー: 'cannot load such file -- rake/extensiontask' が出たら "gem install rake-compiler"


こんなエラーが出たけど

```
$ rake test
rake aborted!
cannot load such file -- rake/extensiontask
```

*rake/extensiontask* を参考にgemを探しても見つからない・・

```
$ sudo gem install rake/extensiontask
ERROR:  Could not find a valid gem 'rake/
$ sudo gem install extensiontask
ERROR:  Could not find a valid gem 
```

**正解** *rake-compiler* をインストールしましょう

```
$ gem install rake-compiler
```
PS SuiteでテストとVisualStudioを使う方法

PS SuiteはPS VitaやAndroid等で動くプラットフォームです。C#で書けます。
4月19日に晴れてオープンβになったので早速使ってるのですが、テストが書けずに四苦八苦していました。

PS Suiteはアセンブリを出力しないのでテスト側からプロジェクト参照できないわけですね。
そこで、PS Suiteの各種アセンブリを参照したクラスライブラリ形式のプロジェクトを作り、
PS Suiteアプリがそれをただ呼ぶだけの形を取れば、アセンブリ出力でPS Suiteアプリを作れるようになります。
後は普通にそのライブラリ出力のプロジェクトに対して好みのテストフレームワークを用いてテストするだけですね。
しかも、ただのプレーンなC#プロジェクトを作るという話なので、PS Suite専用IDEでなく、VisualStudio等の任意のC#IDEを使用できます。

こんな感じ。
![結果](http://blog-imgs-44.fc2.com/k/o/k/kokudori/7cf1a5ccf1a19897673cccfbcf37b114.png)

詳しい説明はブログの方にて。
[PlayStation Suite StudioがダメならVisual Studioを使えばいいじゃない](http://kokudori.blog69.fc2.com/blog-entry-66.html)
TeX Live 2011 ユーザが org 文書を pdf に出力するための設定

org-export-as-pdf(C-c C-e p) は pdflatex コマンドを使って pdf 出力しようとするため、これを platex & dvipdfmx に変更するための設定。

まずパスの通ったところに以下のシェルスクリプトを作成し、実行権限を付ける。

```sh:mypdflatex
#!/bin/bash

if [ "${1##*.}" = 'tex' ]; then
    echo "A"
    src="$1"
    basename="${1%%.tex}"
elif [ -r "${1}.tex" ]; then
    echo "B"
    src="${1}.tex"
    basename="${1}"
else
    echo "file not found: $1" 1>&2
    exit 8
fi

platex "$basename" && \
platex "$basename" && \
dvipdfmx "$basename"
```

org-export-as-pdf でこのシェルスクリプトを使用するように、.emacs に以下を記述。

```cl
(setq org-latex-to-pdf-process
      '("mypdflatex %f"))
```

これで pdf 出力が1発で行えるようになる。

org-export-as-pdf-and-open(C-c C-e d) を使用するなら、pdf を開くソフトの設定もしておくといい。例えば evince で開くなら .emacs に以下のように記述するとか。

```cl
(setq org-file-apps
      '(("pdf" . "evince %s")))
```
忘れがちなコマンドメモ

## 一括置換(確認なし)
	:%s/置換前文字列/置換後文字列/g
	:vs 縦割り
	:sp  横割り


## 読み直し
	:e ++enc=utf-8　# utf-8で開き直す

## 文字操作	
	>>	カーソルの行を右にインデント
	<<	カーソルの行を左に逆インデント
	カーソル位置の文字の大文字と小文字を変換
	Ctrl+a	カーソル位置の数字をインクリメント
	Ctrl+x	カーソル位置の数字をデクリメント

## 単語補完	
	Ctrl+p	カーソル位置よりも前にある単語で入力を補完
	Ctrl+n	カーソル位置よりも後にある単語で入力を補完

## 読み直し
	:e	ファイルをリロード
	Ctrl+l ファイル再読み込み

## 折りたたみ	
	(領域選択して)zf	折りたたみ
	(折りたたみ行で)Space	折りたたみ展開
	zfa{	カーソル位置の{}をたたむ
	zo	折りたたみを展開

## 自動インデント
	ggVGで前選択したら=でインデント
	gg=G

参考サイト
http://archiva.jp/web/tool/vim_basic.html
Linuxあれこれメモ(主にCentOS5.8)


何かと忘れたりハマることが多かったもののメモ

```txt:★/etc/init.d/にある起動スクリプトたち
/etc/init.d/httpd restartは下記のように実行できる
service httpd restart
chkconfig --add httpd　でサービス登録
```  

```txt:★/usr/binと/usr/local/binの違い
システムの標準は/usr/bin、
そうでないものは/usr/local/bin
yumでアップデートされるのは/usr/bin

「システム管理者が自分でコンパイルしたアプリケーションをインストールする場所が/usr/local/bin」
基本的にはコマンドは/usr/local/binから先に探すようになってる
順番はecho $PATHで確認
```


	コマンドのパスの設定で、
	/usr/binよりも、
	/usr/local/binの方が優先的に使われるように設定している場合、
	/usr/local/binにコマンドの最新版を入れるだけで、
	最新のコマンドを利用することができます。
	もし、最新のコマンド版のコマンドが正常に動作しなくても、
	/usr/local/bin以下の実行ファイルを削除するだけで元に戻すことができます。

```txt:★自作スクリプト
/home/ユーザー名/bin(script)
```

```txt:★効率的なソフト管理法
# シンボリックリンクを使って複数バージョンを管理
/usr/local/
/usr/local/ ┬ app/ ┬ php    → php-5.3
            │      ├ nginx  → nginx-1.0.14
            │      ├ apache  → apache-2.2
            │      ├ nginx-1.0.14/ ┬ sbin/nginx
            │      │               └ logs/ ─ error.log
            │      ├ php-5.4/ ┬ bin/ ┬ php
            │      │          │      └ pear
            │      │          └ man/
            │      ├ php-5.3/ ┬ bin/ ┬ php
            │      │          │      └ pear
            │      │          └ man/
            │      └ apache-2.2/ ┬ bin/apachectl
            │                    ├ conf/httpd.conf
            │                    └ log/error_log
            ├ bin/ ┬ php       → ../app/php/bin/php
            │      ├ apachectl → ../app/apache/bin/apachectl
            │      └ pear      → ../app/php/bin/pear
            ├ include/ ─ php → ../app/php/include
            └ sbin/ ─ nginx    → ../app/nginx/sbin/nginx
```

```txt:★基本的なフォルダ構成
/ ルートディレクトリ
├	/bin	基本コマンド
├	/boot	起動に必要なファイル
├	/dev	デバイスファイル
├	/etc	設定ファイル
├	/home（オプション）	ユーザーのホームディレクトリ
├	/lib	共有ライブラリ
├	/lib<qual>（オプション）	　
├	/mnt	一時的なマウントポイント
├	/opt	追加アプリケーション
├	/proc（Linux固有）	プロセス情報など
├	/root（オプション）	root用ホームディレクトリ
├	/sbin	システム管理用コマンドなど
├	/tmp	一時的なファイル
├	/usr	各種プログラムなど
└	/var	変更されるデータ
```

```txt:★LD_LIBRARY_PATHを全ユーザに反映させるには(linux)
ライブラリが反映されないときはパスを追加しよう
/etc/ld.so.conf.d/*.conf に追加したいパスを書いて、ldconfigコマンドを実行する。
ld.so.confは直接編集しない！
```

```txt:★※何かソースから入れるときはこれは必須だね！！
sudo su -
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_path.conf
echo /usr/local/lib64 >> /etc/ld.so.conf.d/usr_local_path.conf
ldconfig
```

```txt:★configureにつかうpkgconfig
# 一時的な対応
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# 再起動後も対応
vi /etc/profile.d/pkg-config.sh
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
```

```txt:★yum設定
vi /etc/yum.repos.d/CentOS-Base.repo
[centosplus]
enabled=0 ⇒ 1
yum update
```


```txt:★メモリ解放
#------memory-usage----- ----total-cpu-usage---- -dsk/total-
# used  buff  cach  free|usr sys idl wai hiq siq| read  writ
# 100M   24M  135M  238M|  0   0 100   0   0   1|   0     0 
#  98M  248k   12M  387M|  1   2  96   1   1   0| 960k 1272k

# 2がいいよ。3は重くなるかもよ。

sync && echo 1 > /proc/sys/vm/drop_caches #ページキャッシュ
sync && echo 2 > /proc/sys/vm/drop_caches #ダーティページ,inodeキャッシュ
sync && echo 3 > /proc/sys/vm/drop_caches #ベージキャッシュ,ダーティページ,inode
ソースファイルの総行数の数え方

```shell:.javaで終わるファイルの総行数
$ find . -name "*.java" | xargs wc -l
```

こうすると↓こんな感じでカレントディレクトリ以下のディレクトリで
".java"で終わるファイルの行数を足すと何行あるかをカウントできる。

```Tomcatのソースで試してみた
...
     220 src/org/apache/tomcat/util/net/NioChannel.java
    2399 src/org/apache/tomcat/util/net/NioEndpoint.java
     302 src/org/apache/tomcat/util/net/NioSelectorPool.java
     692 src/org/apache/tomcat/util/net/PoolTcpEndpoint.java
     488 src/org/apache/tomcat/util/net/SecureNioChannel.java
     173 src/org/apache/tomcat/util/net/ServerSocketFactory.java
     384 src/org/apache/tomcat/util/net/SocketProperties.java
      27 src/org/apache/tomcat/util/net/SocketStatus.java
      93 src/org/apache/tomcat/util/net/SSLImplementation.java
     130 src/org/apache/tomcat/util/net/SSLSupport.java
     110 src/org/apache/tomcat/util/net/TcpConnection.java
      66 src/org/apache/tomcat/util/net/TcpConnectionHandler.java
     732 src/org/apache/tomcat/util/net/URL.java
     196 src/org/apache/tomcat/util/res/StringManager.java
     844 src/org/apache/tomcat/util/threads/ThreadPool.java
      39 src/org/apache/tomcat/util/threads/ThreadPoolRunnable.java
     102 src/org/apache/tomcat/util/threads/ThreadWithAttributes.java
  327933 total
```
Sench Touch2 で、NavigationBar の Back ボタンのテキストを変更する

Ext.navigation.View クラスの defaultBackButtonText という config を変更する。デフォルトは BACK という文字列

```coffeescript:view/Viewport.coffee
Ext.define "MyApp.view.Viewport",
  extend: "Ext.navigation.View"
  config:
    defaultBackButtonText: 'もどる'
    id: 'viewport'
    ui: 'dark'
    fullscreen: true
```
snake_caseとCamelCaseの相互変換


```php:snake->Camel
<?php
function camelize($str) {
  $str = ucwords($str, '_');
  return str_replace('_', '', $str);
}

// test
echo camelize('foo_goo_hoo'); //FooGooHoo
```


```php:Camel->snake
<?php
function snakize($str) {
  $str = preg_replace('/[a-z]+(?=[A-Z])|[A-Z]+(?=[A-Z][a-z])/', '\0_', $str);
  return strtolower($str);
}

// test
echo snakize('getURLAndInfo'); //get_url_and_info
```

この辺参考になります。(LICENSEはdietcake参照)
https://github.com/dietcake/dietcake/blob/master/core/inflector.php#L28
KitchenSinkのphone.js（Titaniumの勉強メモ）


###入門になったら、勉強がなかなか進まなくて、KitchenSinkのサンプルソースを追って勉強しようかと思っています。興味のある方は一緒に勉強しましょう。コミュニケーションの場になればなあと思います。

■ソースのURL：
https://github.com/appcelerator/KitchenSink/blob/master/Resources/main_windows/phone.js
![](http://hkanna.minibird.jp/ks/wp-content/uploads/2012/02/Phone.png)

```js:
// create table view data object
var data = [
	{title:'Play Movie', hasChild:true, test:'../examples/movie.js'},
	{title:'Vibrate', hasChild:true, test:'../examples/vibrate.js'},
	{title:'Geolocation', hasChild:true, test:'../examples/geolocation.js'},
	{title:'Accelerometer', hasChild:true, test:'../examples/accelerometer.js'},
	{title:'Sound', hasChild:true, test:'../examples/sound.js'},
	{title:'Photo Gallery', hasChild:true, test:'../examples/photo_gallery.js'}
];

data.push({title:'Orientation', hasChild:true, test:'../examples/orientation.js'});
data.push({title:'Contacts', hasChild:true, test:'../examples/contacts.js'});

if (Titanium.Platform.osname!='ipad')
{
	data.push({title:'Camera', hasChild:true, test:'../examples/camera.js'});
}

// add iphone specific tests
if (Titanium.Platform.name == 'iPhone OS')
{
	data.push({title:'Screenshot', hasChild:true, test:'../examples/screenshot.js'});
	data.push({title:'Save to Gallery', hasChild:true, test:'../examples/photo_gallery_save.js'});
	data.push({title:'Shake', hasChild:true, test:'../examples/shake.js'});
	if (Titanium.Platform.osname!='ipad')
	{
		data.push({title:'Record Video', hasChild:true, test:'../examples/record_video.js'});
	}
	data.push({title:'Music', hasChild:true, test:'../examples/music.js'});
	data.push({title:'Proximity Events', hasChild:true, test:'../todo.js'});
	data.push({title:'App Badge', hasChild:true, test:'../examples/app_badge.js'});
	data.push({title:'Status Bar', hasChild:true, test:'../examples/statusbar.js'});
	data.push({title:'Push Notifications', hasChild:true, test:'../examples/push_notification.js'});
}

if (Titanium.Platform.name == 'android') {
	data.push({title:'Notfications', hasChild:true, test:'../examples/notification.js'});
}

// create table view
var tableview = Titanium.UI.createTableView({
	data:data
});

// create table view event listener
tableview.addEventListener('click', function(e)
{
	if (e.rowData.test)
	{
		var win = Titanium.UI.createWindow({
			url:e.rowData.test,
			title:e.rowData.title
		});
		Titanium.UI.currentTab.open(win,{animated:true});
	}
});

// add table view to the window
Titanium.UI.currentWindow.add(tableview);

```

***
##サンプルから勉強になった内容：
###下記の内容を上記のソースから探すことが出来れば、上記のソースがもう理解できた証だと思います。後はどのように組み合わせて自分のソースの中に入れれば良いかを考えればよいと思います。

まとめ中。。。
KitchenSinkのmashups.js（Titaniumの勉強メモ）


###入門になったら、勉強がなかなか進まなくて、KitchenSinkのサンプルソースを追って勉強しようかと思っています。興味のある方は一緒に勉強しましょう。コミュニケーションの場になればなあと思います。

■ソースのURL：
https://github.com/appcelerator/KitchenSink/blob/master/Resources/main_windows/mashups.js
![](http://hkanna.minibird.jp/ks/wp-content/uploads/2012/01/Mashups.png)

```js:
// create table view data object
var data = [
	{title:'Twitter', hasChild:true, test:'../examples/twitter.js', title_image:'../images/twitter_logo_header.png'},
	{title:'Foursquare', hasChild:true, test:'../examples/foursquare.js', title_image:'../images/light-poweredby-foursquare.png'},
	{title:'Facebook', hasChild:true, test:'../examples/facebook.js'},
	{title:'YQL', hasChild:true, test:'../examples/yql.js'}
];

//add iphone specific tests
if (Titanium.Platform.name == 'iPhone OS')
{
	data.push({title:'RSS', hasChild:true, test:'../examples/rss.js', barColor:'#b40000'});
}
 
data.push({title:'SOAP', hasChild:true, test:'../examples/soap.js'});

// create table view
var tableview = Titanium.UI.createTableView({
	data:data
});

// create table view event listener
tableview.addEventListener('click', function(e)
{
	if (e.rowData.test)
	{
		var win = Titanium.UI.createWindow({
			url:e.rowData.test,
			title:e.rowData.title
		});
		if (e.rowData.barColor)
		{
			win.barColor = e.rowData.barColor;
		}
		if (e.rowData.title_image)
		{
			win.titleImage = e.rowData.title_image;
		}
		Titanium.UI.currentTab.open(win,{animated:true});
	}
});

// add table view to the window
Titanium.UI.currentWindow.add(tableview);

```

***
##サンプルから勉強になった内容：
###下記の内容を上記のソースから探すことが出来れば、上記のソースがもう理解できた証だと思います。後はどのように組み合わせて自分のソースの中に入れれば良いかを考えればよいと思います。

まとめ中。。。
KitchenSinkのcontrols.js（Titaniumの勉強メモ）


###入門になったら、勉強がなかなか進まなくて、KitchenSinkのサンプルソースを追って勉強しようかと思っています。興味のある方は一緒に勉強しましょう。コミュニケーションの場になればなあと思います。

■ソースのURL：
https://github.com/appcelerator/KitchenSink/blob/master/Resources/main_windows/controls.js
![](http://hkanna.minibird.jp/ks/wp-content/uploads/2012/02/Controls1.png)

```js:

// create table view data object
var data = [
	{title:'Slider', hasChild:true, test:'../examples/slider.js'},
	{title:'Switch', hasChild:true, test:'../examples/switch.js'},
	{title:'Activity Indicator', hasChild:true, test:'../examples/activity_indicator.js'},
	{title:'Progress Bar', hasChild:true, test:'../examples/progress_bar.js'},
	{title:'Button', hasChild:true, test:'../examples/button.js'},
	{title:'Button States', hasChild:true, test:'../examples/button_state.js'},
	{title:'Label', hasChild:true, test:'../examples/label.js'},
	{title:'Search Bar', hasChild:true, test:'../examples/searchbar.js'},
	{title:'Text Field', hasChild:true, test:'../examples/textfield.js'},
	{title:'Text Area', hasChild:true, test:'../examples/textarea.js'}
];

// add iphone specific tests
if (Titanium.Platform.name == 'iPhone OS')
{
	data.push({title:'Button Bar', hasChild:true, test:'../examples/buttonbar.js'});
	data.push({title:'Tabbed Bar', hasChild:true, test:'../examples/tabbedbar.js'});
	data.push({title:'System Buttons', hasChild:true, test:'../examples/system_buttons.js'});
	data.push({title:'Toolbar', hasChild:true, test:'../examples/toolbar.js'});
}
data.push({title:'Picker', hasChild:true, test:'../examples/picker.js'});

// create table view
var tableview = Titanium.UI.createTableView({
	data:data
});

// create table view event listener
tableview.addEventListener('click', function(e)
{
	if (e.rowData.test)
	{
		var win = Titanium.UI.createWindow({
			url:e.rowData.test,
			title:e.rowData.title
		});
		Titanium.UI.currentTab.open(win,{animated:true});
	}
});

// add table view to the window
Titanium.UI.currentWindow.add(tableview);

```
***
##サンプルから勉強になった内容：
###下記の内容を上記のソースから探すことが出来れば、上記のソースがもう理解できた証だと思います。後はどのように組み合わせて自分のソースの中に入れれば良いかを考えればよいと思います。

まとめ中。。。
RubyでMac版ExcelでインポートできるCSVデータを作成する

Mac版ExcelはBOM付きUTF-16LEでないと正常にインポートできません。

以下Railsのコントローラーからの抜粋。
ポイントは、BOMのバイト列を force_encoding("UTF-16LE") しているところです。
こうしないと、output（UTF-16LE）と連結する際にエラーが出ます（ソースコードがUTF-8だとBOMのバイト列も当然UTF-8文字列とみなされるので）。

``` ruby
format.csv {
  header = "ID,氏名,住所,年齢,電話番号\r\n"
  CSV.generate(output = header) do |csv|
    @users.each do |user|
      csv << [user.id, user.name, user.address, user.age, user.tel]
    end
  end
  
  bom = "\xFE\xFF".force_encoding("UTF-16LE")
  
  send_data(bom + output.encode("UTF-16LE"),
    :type => 'text/csv',
    :filename => "your_file_name.csv")
}
```
macでスクリーンショットのショートカット


スクリーンショット
1.「コマンド」キー　+　「Shift」キー　+　「3」キー
　　画面全体  
  2.「コマンド」キー　+　「Shift」キー　+　「4」キー
　　ドラッグで選択した部分 

 3.「コマンド」キー　+　「Shift」キー　+　「4」キー　+　「Space」キー
直近5件のFacebookイベントをFQLで取って来る


Graph APIだと取れないものがあったりするので、FQLを使うサンプル。

**2012/4/24現在、API仕様の変更でこのままだと上手くいかず。調査中。**

```php
<?php
function get_events ($fid, $appid, $secret, $limit = 5) {
	$fb = new Facebook(array('appId'=>$appid, 'secret'=>$secret));
	$yesterday = time()-60*60*24;//24時間前のタイムスタンプ
	$fql = <<<____FQL
		SELECT creator, description, eid, end_time, location, name, pic, pic_big, pic_small, start_time
		FROM event
		WHERE
			eid in (
				SELECT eid 
				FROM event_member 
				WHERE uid = $fid AND $yesterday < start_time)
			AND privacy = 'OPEN'
		ORDER BY start_time ASC
		LIMIT $limit
____FQL;
	return $fb->api(array('method'=>'fql.query','query'=>$fql));
}
```

実動例はこちら。

* 下北沢オープンソースCafeのイベント一覧 - http://www.osscafe.net/ja/meetups.html
RD形式のドキュメントをコンソールで読む

よくRubyのライブラリでRD形式のドキュメントが付随していることがあるのですが、それをHTMLとかに変換せずにその場でさっとコンソールで読みたいような場合があります。

PerlだとPOD形式のファイルをperldocで読むようなイメージです。

いろいろと調べたのですが、結局perldocまんまのようなソリューションは見つけられず、rdtoolをいれて下記で表示するとそれなりに表示できるようになりました。

```
$ rd2 -r rd/rd2man-lib.rb README.rdoc | nroff -man | less
```

rdtoolもgemに対応していないし、もうちょっとなんかいいやり方がないのだろうか。
ソースからvim7.3をぶち込む

なうでヤングなプラグインが使えないからバージョンうｐ  
だってVimが好きだから。

```shell:vim7.3
cd /usr/local/src
sudo wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
sudo tar jxvf vim-7.3.tar.bz2 
cd ./vim73/
sudo ./configure --enable-multibyte --disable-selinux --prefix='/usr/local/app/vim-7.3'
sudo make 
sudo make test
sudo make install
```

```shell:バージョンの切り替えに対応するため
cd /usr/local/app/
ln -s ./vim-7.3 vim
```

```shell:上記で作ったシンボリックを使う
cd /usr/local/bin
ln -s ../app/vim/bin/vim vim
```

```shell:.bashrc読み直し
. ~/.bashrc
```

又はログインしなおすとvim7.3になってると思います。
Clang 4.0


Clang 4.0以降から変態的文法が増えてる気配なのでメモ

全ては追い切れないので、象徴的なものだけ抜粋

## Literal

NSString以外にもリテラルが使えるようになる

### NSNumber

```Before
NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];
```

```New
NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;
```

### NSArray

```Before
array = [NSArray arrayWithObjects:a, b, c, nil];
```

```New
array = @[ a, b, c ];
```

### NSDictionary

```Before
dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
                                   forKeys:@[k1, k2, k3]];
```

```New
dict = @{ k1 : o1, k2 : o2, k3 : o3 };
```

取得側も変更有り

```GetLiteral
arr[@1]      === [arr objectAtIndex:1]
dict[@1]     === [dict objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]
```


## lambda

C++11 から Block のような文法をサポート

```objc
  NSArray *array = @[
	@"string 1", @"string 21", @"string 12", @"String 11",
	@"String 02"]; //"

  const NSStringCompareOptions comparisonOptions =
		NSCaseInsensitiveSearch | NSNumericSearch |
		NSWidthInsensitiveSearch | NSForcedOrderingSearch;
  NSLocale *currentLocale = [NSLocale currentLocale];
  NSArray *sorted =
	[array sortedArrayUsingComparator:[=](id s1, id s2) ->
		NSComparisonResult {
               NSRange string1Range = NSMakeRange(0, [s1 length]);
               return [s1 compare:s2 options:comparisonOptions 
                          range:string1Range locale:currentLocale];
       }];
  NSLog(@"sorted: %@", sorted);
```



参考
- [Apple LLVM 4.0 new features on Xcode 4.4 (Literals) -- stackoverflow](http://stackoverflow.com/questions/9347722/apple-llvm-4-0-new-features-on-xcode-4-4-literals)
- [llvm clang LanguageExtensions#objc_lambda -- clang.llvm.org](http://clang.llvm.org/docs/LanguageExtensions.html#objc_lambdas)
Emacs 起動時の .emacs 読み込みが終わらない原因の1つ

Emacs に auto-install をインストールしていて，.emacs に

```cl
(auto-install-update-emacswiki-package-name t)
```

を記述していると，emacswiki が接続できない場合に .emacs の読み込みがいつまで経っても終わらない．
そのときは上のコードをコメントアウトするだけで解決するのだが，エラーを発生してくれないため，知らないと解決に時間がかかる．頭の片隅にでも置いておくといいかと．
inject の代わりに each_with_object を使う


メモ。Ruby 1.9 なら標準で、1.8.7 環境なら active_support で。

```ruby
require 'active_support/core_ext/enumerable'
```

で。

```
{:foo => '1', :bar => '2'}.each_with_object({}) {|(key, value), object|
  object[key] = value.to_i
}
# => {:foo=>1, :bar=>2}
```
規約から外れた接続先を見るモデルを含む場合のOctopusによるreplication


[Octopus](https://github.com/tchandy/octopus)というライブラリを用いるとActiveRecordでsharding/replicationが実現できる。

## DB構成

ユーザデータを持つDB

ホスト: userdb.localhost
データベース名: user
replication: しない (アプリケーションでは読み取りしかしないので最初からslaveのみ参照するようになっている)

アプリケーションのデータを持つDB

ホスト: app.localhost
データベース名: app_{RAILS_ENV}
replication: する


## 何が問題か

Octopusが`ActiveRecord::Base#connection`と`ActiveRecord::Base#connection_pool`を乗っ取って、クエリを監視して適宜、shardもしくはmaster/slaveへ投げるようになる。

Octopusを使ってreplicationをする設定 (config/shards.ymlに`replicated: true`) の場合、masterはconfig/database.yml, slaveはconfig/shards.ymlを見る。

replicationをしたくない場合 (config/shards.ymlに`fully_replicated: false`) であっても、Octopusがクエリ監視をするため、モデルで個別の接続先を指定していてもOctopusが上書きしてしまう。


## 対処法

目には目を、歯には歯を、メタプログラミングにはメタプログラミングを。

`alias_method_chain`で上書きしている。 (cf. [lib/octopus/model.rb:L80](https://github.com/tchandy/octopus/blob/master/lib/octopus/model.rb#L80))

`alias_method_chain(original_method, feature_name)`で`{original_method}_with_{feature_name}`と`{original_method}_without_{feature_name}`というメソッドを定義する。

`{original_method}_without_{feature_name}`がオリジナルの実装なのでこれをさらにaliasすればよい。

```ruby:user.rb
class User < ActiveRecord::Base
  if defined?(Octopus::Model::InstanceMethods) && self < Octopus::Model::InstanceMethods
    alias_method :connection, :connection_without_octopus
    alias_method :connection_pool, :connection_pool_without_octopus
  end

  establish_connection("user_db_#{Rails.env}")
  self.table_name = :user
end
```
SSL のリクエストを http で叩く


フロントの proxy や ELB 等で ssl を処理し、バックエンドには http のリクエストで処理してるサーバに ssl のアクセスだよ、と明示的にアクセスするには

rack 1.4.1 の場合

```ruby
    def scheme
      if @env['HTTPS'] == 'on'
        'https'
      elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
        'https'
      elsif @env['HTTP_X_FORWARDED_SCHEME']
        @env['HTTP_X_FORWARDED_SCHEME']
      elsif @env['HTTP_X_FORWARDED_PROTO']
        @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
      else
        @env["rack.url_scheme"]
      end
    end
```

の通り適切にリクエストを送ればよい。ので curl なら

```
curl -H 'X-FORWARDED-SSL: on' http://localhost/
```

のようにアクセスすることで、SSL のリクエストとして処理が行える
ShiftJISをUnicodeにデコードする


ShiftJISの文字列を取ってきてput()したりするとdecodeエラーが出る場合

```python:decode.py
def DecString(self,target):
    DecBuf = str(target)
    RetStr = DecBuf.decode("ShiftJIS")
    return RetStr
```

※ unicode(変換する文字列)では×
Excelでワークシート名をセルに表示

`=RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1)))`

どのセルでも同じ（A1を絶対値指定してる）。
やっている内容は、セルの情報をファイルネームごと（ワークシート名も入っている）もってきて
「]」の位置を見極めて、右から文字列を取得している

※ファイル名やフォルダ名に「]」が含まれていると、正しく取得ができない…
その場合は、ユーザー関数を使うしかないかな。

```Excel:SheetName()
Function SheetName() As String
　Application.Volatile
　SheetName = Application.Caller.Parent.Name
End Function
```
MacOSX-Lionでrbenvを使ってRubyOnRailsの環境構築すると、以下のようなメッセージが出てドハマリしたけど、なんとか解決したことについてのメモ(推理なので正しいかどうかの確証持てない)


Last-Update:2012/04/23

メッセージはこちら↓

```Bach:泣くほどみた無限ループメッセージ
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```

で、いくら`sudo gem install rails`を入力しても、railsコマンドを実行すると上記メッセージが表示されて変わらないと。

状況はといえば
[非常に丁寧なこちらの解説サイト](http://www.oiax.jp/rails/zakkan/rails_3_1_installation_on_macosx.html)を参考に
homebrewでruby-buildとrbenvをインストールして、ruby本体はrbenvにてインストールしたものが動いている状態でした。

で、railsがいくらやっても動かないと。


ここで、一から整理しながら考えてみて、rbenvやgemの仕組みを調べてみたところ

+ gemはシステム(Mac本体)ではなく、rubyが持つツールである。
+ rbenvでは、rubyごとにgemを持つ。

ということ。

なので、いくらrbenvでrubyのモードを切り替えても、gem自体はシステムデフォルトのrubyのgemが使われていた様子。
さらに、rbenvでいれたrubyごとにgemを持つから、rbenvではrubyを入れる(切り替える)ごとにgemファイルが変わる模様（それを回避する方法もあるそうな。）


つまり私のドハマリした状況は

+ ruby⇛rbenvのものが作動(1.9.3系)
+ gem⇛MacOSXのデフォルトのruby(1.8.7系)のgemが作動
+ rails⇛上記のgemでinstallされたから、デフォルトruby内のgemに配置＝/usr/bin/の中のrailsが使われている

という入り組んだ状態になっていた。

調べてみると、railsは確かに/usr/bin/の中から呼ばれている。

正しく動作させるには

+ gem⇛rbenvで入れたruby1.9.3系のgemを起動させるようにする
+ rails⇛rbenv内のrubyの指定位置から呼ばれるようにする

ということで、.bashrcなどにPATHを記述してPATHを貼り直す(システムの優先順位を決める：/usr/bin/よりもrbenvのものを優先させる)


ここで注意点？がありまして
いろんな「rbenvを使ったruby環境構築解説記事」では、PATHの指定が以下のようになっている

```
export PATH="$HOME/.rbenv/bin:$PATH"
```

が、いくら探しても~/.rbenv/のなかに、binというフォルダはない。私が特殊なのか、仕様が変わったのかはわかりません。

しかし、かわりに「shims」という似たようなフォルダを見つけた。
どうやら、この中にいろんなシステムが入っている様子。

ということで、.bashrcに以下を追記

```
export PATH="$HOME/.rbenv/shims:$PATH"
```

その後、`gem install rails`としてrailsをインストールすると…


動いた！！


まとめると

*gemとはrubyそれぞれがもつツールである。しかし、rbenvをいれてもMacOSXはデフォルトでrubyとgemを持っているから、いくらgemコマンドを打ち込んでもデフォルトのrubyのgemが起動してしまう。gemコマンドが自分が使いたいrbenvのrubyで動くように、きちんとPATHを指定する必要がある。そうすれば、railsだって動く*

ということです。
Excelでの文字整形（VBでいうformat）あれこれ

- `=TEXT(1234567,"#,##0")` -> 1,234,567
- `=TEXT(1,"00)` -> 01
- `=TEXT(C1,"平成ge年m月d日(aaa)")` -> 平成12年1月1日(土)
- `=TEXT(0.05,"0.0%")` -> 5.0%

参考URL:http://maglog.jp/excel/Article260288.html
/etc 以下を自動でバージョン管理する

`etckeeper` を使うと簡単にできる。

Debian系ならaptで簡単インストール。

``` sh
sudo apt-get install etckeeper
```

デフォルト設定だとGitでバージョン管理されるけど、他のVCSも選べる。

``` sh:/etc/etckeeper/etckeeper.conf
# The VCS to use.
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"
```
Hello Slim!


SlimはPHPで作られた比較的新しいフレームワークです。「マイクロフレームワーク」のひとつで、SynfonyやCakePHPなどのフルスタックのものとは異なり、非常にシンプルな構成になっています。機能も、フロントコントローラにフォーカスしているので、モデルやDBへのアクセスといった部分はごっそり省略されています。まさに「Slim」です。

* Slimのサイト - http://www.slimframework.com/
* ダウンロード - http://www.slimframework.com/install
* ソースコード - https://github.com/codeguy/Slim

## Let's start!

何はともあれ、まずはサンプルを作成してみましょう。

GitHubのmasterブランチから[Slimをダウンロード](https://github.com/codeguy/Slim/zipball/master)して、ZIPファイルを解凍します。ここでは、

* .htaccess
* js/
* css/
* php/
	* index.php
	* Slim/

みたいな感じで、ファイルを配置します。(配置の仕方に特に決まりはないので、各人の好みで変えてしまってOKです)

.htaccessで、ファイルが存在しない場合にすべてをphp/index.phpに渡すよう設定しています。※Webサーバの設定によっては、RewriteBaseの行をコメントアウトする必要があります。

```.htaccess
RewriteEngine On
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ php/index.php [QSA,L]
```
それでは、下準備が完了したので、お決まりの「Hello World」をやってみましょう。php/index.phpに次のように書きます。

```php:php/index.php
<?php
require 'Slim/Slim.php'; //ライブラリの読み込み
$app = new Slim(); //インスタンスを初期化
$app->get('/hello/:world', function ($world) { //ルーティング設定
	echo "Hello $world! (GET version)";
});
$app->run(); //実行
```

ブラウザから、http://<ホスト名>/hello/slim にアクセスしてみましょう。画面に

> Hello slim! (GET version)

と表示されていたらOKです。

## Slimでルーティング

Slimでは、

```
$app->get('/path/to/:variable', some_function);
```

の形式でルーティングの設定が可能です。":variable"の部分は、関数に変数として渡されます。それぞれのメソッドに合わせて関数が用意されています。

* GETメソッド : $app->get()
* POSTメソッド : $app->post()
* PUTメソッド : $app->put()
* DELETEメソッド : $app->delete()

また、SlimはPHP5.3以降で無名関数を使って書くと非常に読みやすいコードになります。

```
$app->get('/path/to/:variable', function ($variable) {
	//ここに処理を書く
});
```

無名関数の内部で、Slimのインスタンス($app)にアクセスする必要がある場合は、次のように書く事もできます。

```
$app->get('/path/to/:variable', function ($variable) use ($app) {
	$name = $app->request()->params('name'); //リクエスト変数を取得
	//ここに処理を書く
});
```

(つづく)

この記事は、4/18(水)に開催された「軽量WEBフレームワーク祭り」の発表内容を整理したものです。

* イベントページ - https://www.facebook.com/events/268874156532536/
* Ustream録画 - http://www.ustream.tv/recorded/21935476
IE7でのposition:relative;時の配置のバグの対応

IE7で、position:relative;を指定しているのにも関わらず、left:[n]px;がおかしいバグ。
親要素のtext-alignにcenterとかを指定していると、leftが中央揃えでの配置になる。
親要素のtext-alignにleftを指定すると回避出来る。
hack rankリリースしました

http://hackrank.herokuapp.com/

####概要
qiitaの各ユーザーの被ストック数によるランキングサイト

####構成
scala
play 2.0
heroku
mysql on ec2
cron + phpでスクレイピング
\#サーバーに負荷をかけるとあれなので、1リクエストごとに1秒sleepを入れてる。これを4700回。

####制作期間
5時間くらい

####ハマったところ
特に無し
前回のweb manga checkerと同じ
http://qiita.com/items/71fb0f606d62e3171b0b

####課題
キャッシュしてない
#####俺はhackerじゃない
ブラウザの背景全体に画像を出すcss


```css
.fix_image {
  position: fixed;
  width: 100%;
  height: 100%;
  background-repeat: no-repeat;
  background-attachment: fixed;       /* 背景画像固定 */
  background-position: center center; /* 背景を中央に */
  background-size: cover;             /* 背景領域を完全に覆うサイズに */
  background-image: url("example.jpg");
}
```
rails newの-mオプションを使うと捗る

ruby 1.9.3
rails 3.2
に依存するが

```
$ rails new appname -m https://raw.github.com/RailsApps/rails3-application-templates/master/rails3-devise-rspec-cucumber-template.rb -T
```

を実行してみるといろいろやってくれる。これからrailsアプリを開始する人は是非とも使ってみるべし。

mysqlを使う場合は

```
$ rails new appname -m https://raw.github.com/RailsApps/rails3-application-templates/master/rails3-devise-rspec-cucumber-template.rb -T  -d mysql
```

を実行する前に `appname_development` というデータベースを自分で先に作っておかないとエラーが出る。
osx の nginx を 80 番ポートで launchctl から起動する


## 前提条件

* homebrew

## インストール

```bash
% brew install nginx
```

## 設定ファイル

nginx を sudo つけて起動するシェルスクリプトを作成する。
(実行権限つけるのを忘れないこと）

```bash:/usr/local/bin/nginx_with_sudo
#!/bin/bash

BIN="/usr/local/sbin/nginx"

function on_die() {
    sudo $BIN -s stop
    exit 0
}

trap on_die TERM

sudo $BIN $@ &

wait
```

nginxはdaemon offで起動するので nginx.conf に記述する。
（ここはplistで指定したかったけどうまくいかなかった）
ポートは 80 に設定する

```/usr/local/etc/nginx/nginx.conf
(…snip…)
daemon off;
(…snip…)
http {
(…snip…)
  server {
    listen 80;
(…snip…)
```

plist ファイルは{USER_NAME}を適宜置き換えること

```xml:~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.nginx</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>UserName</key>
    <string>{USER_NAME}</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/nginx_with_sudo</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
  </dict>
</plist>
```

## 起動確認

```bash
% launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
```

http://localhost:80 にアクセスしてみると nginx が起動していることが確認できる
cURLについてまとめておく


RESTなAPIなんか作っていると、いちいちテストするのでブラウザとか使うのはとっても面倒。そこで、コマンドのcurlがとても便利なんです。

オプションの-vと-bと-cに-dを組合せて、アクセスをするとテストなどで使えます。

本家をみてびっくりしたけど、実はかなり色々できるコマンドだった。恐るべし。そして本名が「cURL」と初めて知った。

自動で色々やりたい場合は、こちらが参考になる。（もちフルEnglish）
http://curl.haxx.se/docs/httpscripting.html


## URLで便利なファイル名の展開

使い方はこんな感じ。

	curl "http://hogehoge.com/[1-5].jpg"


以下、展開についてのパターン

	[1-5].jpg
1.jpg, 2.jpg・・・と連続取得

	{1,3,5}.jpg
1.jpg, 3.jpg・・・と指定したもので取得

	{a,b}{1,2}.jpg
a1.jpg, a2.jpg, b1.jpgと組合せてくれる


## オプションについて

__ファイルへ出力__
-O URL


__ファイル名指定の出力__
-o ファイル名 URL

__リダイレクトに追随__
-L URL

__cookieの保存__
-c cookie.txt

__cookieの送信__
-b cookie.txt

__httpヘッダーの追加・変更__
-H "key: value"

__フォーム送信__
-d name=value
複数送りたい場合は、上記を繰り返す

__ヘッダー取得__
-I URL

__サーバとのやり取りを表示する__
-v URL

## 使用例

Redmineのチケットを更新している例
http://www.r-labs.org/projects/r-labs/wiki/Rest_api_with_curl

```
$ curl -v -H "Content-Type: application/json" -X PUT --data "@388.json" -u login:password http://redmine/issues/388.json
```

以下のファイルを作っておく

```json:388.json
{
  "issue": {
    "subject": "subject123",
    "notes": "Changing the subject" 
  }
}
```

## ネタ元URL

http://sitearo.com/cocoa/0800_internet/curl/

本家
http://curl.haxx.se/


WindowsAzureにてRestAPIを叩くのに、cURLを使っている例も発見。
http://troushoo.blog.fc2.com/blog-entry-38.html
プログラムにおける参照透過性と副作用とは

####まとめ
参照透過性があると、テストが楽?
カリー化の話がようやく理解できてきたような気がしている。
カリー化するならオブジェクトのプロパティ変化させりゃーいいじゃんって思ってたけど、それをすると参照透過性が崩れる。
というようなことを教わったけどあんまりピンときてなかったのがうっすらわかってきたようなきがしている。


####以下引用
wikipedia 副作用 (プログラム)
http://goo.gl/Jz5B
***
プログラミングにおける副作用（ふくさよう）とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。
例えば与えられた数字を二倍して返す機能"double"があるとする。

```:double
double: x -> 2*x
example:
4 <- double: 2
```

このような機能では次のことが成立する。

#####1.同じ条件を与えれば必ず同じ結果が得られる
#####2.他のいかなる機能の結果にも影響を与えない

このような性質を参照透過性という[1]。参照透過な機能はそれ自身状態を持たないことで副作用と独立している。
一方状態を持つ機能"add"を考える。addは外側の変数eを増加させて返すものとすれば:

```:add
add: x -> e:e+x
例:
e: 1
2 <- add:1
2 <- e
```

のようになるだろう。このような機能では見えない所で条件を変化させてしまうために、参照透過性の一つ目の仮定が崩れ、また他のeを利用する機能の結果も変化させるので二つ目の仮定も成立しない。addは副作用を持つ機能である。
副作用を伴う機能の例としては、I/O制御(write/print等)、上記addのように破壊的代入を行う機能などがある。ノイマン型のアーキテクチャは副作用を前提として動作するため、多くのプログラミング言語では変数の破壊的代入機能を持つ。一方関数型言語では原則として副作用を存在しないものとみなし、モナドなどの手法で抽象化している。
機能が副作用を持たないことの利点は、いかなる状況でも常に同じ結果が得られるために、機能を純粋にアルゴリズムとして定義でき、状況依存でのバグの発生が抑えられるということである[2]。反面副作用を持たない言語設計はノイマン型アーキテクチャと反りが合わず、効率の点で不利になることが多い。また単純な逐次処理を行う場合は状態を中心に命令的な思考をした方が扱いやすい場合がある。このためLISPやMLなどは原則として関数型ながら、副作用を許容する設計になっている。
空白区切りの文字列を整数の配列に変換する

Ruby1.9用．プロコンなどで便利かも．

```ruby
"1 1 2 3 5 8 13 21".split.map(&:to_i)
# => [1, 1, 2, 3, 5, 8, 13, 21]

# 多重代入との組み合せ
w, h = "30 35".split.map(&:to_i)
```
PhoneGapプロジェクトをコマンドラインからコンパイルする

```
$ cd lib/android/example/
$ android list targets
$ android update project -p . -t 1
携帯をUSBでつなぐ
$ ant debug install
```

本来はこれでいけるはずだが、ターゲットをAndroid2.1にしてしまったので

```
-code-gen:
     [echo] ----------
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
[renderscript] No RenderScript files to compile.
     [echo] ----------
     [echo] Handling Resources...
     [aapt] Generating resource IDs...
     [aapt] /Users/yhara/Downloads/phonegap-phonegap-b4e695d/lib/android/example/AndroidManifest.xml:4: error: No resource identifier found for attribute 'xlargeScreens' in package 'android'
```
というエラーになった。

昨日このエラーの説明をどっかで見たので、AndroidManifest.xmlから「xlargeScreens」が含まれる行を削除し再度installすると、端末に「CordovaExample」というアプリがインストールされた。

----

昨日Eclipseで作ったやつもこれでいけるかどうか試してみる。

```
$ android update project -p . -t 1
Updated project.properties
Updated local.properties
Updated file ./proguard-project.txt
携帯をUSBでつなぐ
$ ant debug install
```

うまく行った。
PhoneGapでHello Worldした

「PhoneGapやTitaniumを使えばBiwaSchemeでモバイルアプリが作れるのではないか？」と思ったので、とりあえずHello Worldまでやってみた。

# PhoneGapとTitaniumの違い

PhoneGapはHTML+CSSで画面を作る。一方TitaniumはTitanium.UI.createWindow()みたいにして画面を作る。QtとかGTKとか、いわゆるGUIライブラリな感じかな。

PhoneGapの方が仕組みとしてLightweightで、今回の目的には取っつきやすそうだったのでPhoneGapを使うことにする。

# PhoneGapを使う

単にHTMLとCSSを使うだけなら、わざわざモバイルアプリを作らずとも、単にモバイル向けのWebサイトを作るという選択肢もある。なぜPhoneGapを使うのか。

* モバイルアプリなら、サーバを用意しなくて済む。(←Herokuとかあるので意義は薄い…)
* モバイルアプリなら、ホーム画面に独自のアイコンを設置できる (←iOSだとWebサイトでもアイコン変えられるけど…)
* PhoneGapなら、SDカードへのアクセスとかができる

3つめが重要で、PhoneGapを使うとモバイルWebサイトでは使えない機能がいくつか使えるようになる。
位置情報や加速度センサはHTML5のJavaScript APIから使えそうだけど、SDカードへのアクセスとかはPhoneGapでないとできない、んじゃないかなぁ。(調べてない)

http://docs.phonegap.com/en/1.6.1/index.html

PhoneGapのAPI部分は「Apache Cordova」と呼ばれるプロジェクトになっている。http://incubator.apache.org/cordova/ PhoneGapとの正式な関係は知らない。

機能はいろいろあるが、位置情報などいくつかはW3Cが定義するHTML5のAPIそのままなんで、「それ普通のモバイルWebでもできるよ」っていうのも含まれている (AndroidとiOSの話)。

# PhoneGapのチュートリアル

公式サイトにある。http://phonegap.com/start 

iOSの場合、XCode 4が必要ぽかった(3だとなんかエラーになった)。4のダウンロードは有料の開発者登録が必要。

Androidの場合、Eclipseを使うチュートリアルになっている。ターミナルからもできるらしいが→ http://wiki.phonegap.com/w/page/30864168/phonegap-android-terminal-quickstart

チュートリアルをそのまま順にやったら、INFOBARで「Hello World」と表示するアプリが動く状態になった。
Git: バグの修正と新機能の追加を同時にやってしまった場合の対処方法

動作確認を行いつつ分割コミットするやりかた．

以下のような手順を行う．(バグ修正 → 新機能追加の順にコミットする場合)

1. `git add -p` などを使って，バグの修正の部分だけを index に上げる．

2. `git stash --keep-index` をして index にない変更を脇にどける．

3. コンパイルしたり実行したりテストしたりして，ちゃんと動作することを確かめる．
[追記] ダメだった場合は `git stash pop` して `git reset` することで最初の状態に戻れる．

4. `git commit` する．間違えて `-a` を付けないように注意．

5. `git stash pop` して，新機能追加の部分を working tree に戻す．

6. `git commit -a` する．

## 例

例として以下のようなfizzbzzのコードを考える．

```c:fizzbazz.c
#include <stdio.h>

int main() {
  int i;
  int n = 30;

  for (i = 1; i <= n; ++i) {
    if (i % 15 == 0) {
      puts("fizzbazz");
    } else if (i % 3 == 0) {
      puts("fizz");
    } else if (i % 5 == 0) {
      puts("bass");
    } else {
      printf("%d\n", i);
    }
  }
  return 0;
}
```

このコードに対して次の2つの修正をしてしまったとする．

* `"bazz"` と書くべきところを `"bass"` と書いてしまっているので修正した．
* `n` の値をコマンドライン引数から読むようにした．

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

int main(int argc, char** argv) {
  int i;
  int n = (argc > 1) ? atoi(argv[1]) : 30;

  for (i = 1; i <= n; ++i) {
    if (i % 15 == 0) {
      puts("fizzbazz");
    } else if (i % 3 == 0) {
      puts("fizz");
    } else if (i % 5 == 0) {
      puts("bazz");
    } else {
      printf("%d\n", i);
    }
  }
  return 0;
}
```

このとき，分割コミットは以下のような手順になる．

```bash
$ git diff
2つの変更が混ざったdiffが表示される

$ git add -p fizzbazz.c
puts("bass"); を含む hunk だけを stage する

$ git stash --keep-index

$ git diff
何も表示されない

$ git diff --cached
バグ修正の部分だけが表示される

$ gcc -Wall fizzbazz.c
$ ./a.out
動作確認する

$ git commit -m "Fix typo"

$ git stash pop

$ git diff
新機能追加の部分だけが表示される

$ git commit -a -m "Take n from argv[1]"
```
#C/C++初心者≠プログラマ初心者用 基礎知識チートシート#1

// Pythonとかの言語しかやったことのないワタシが知らなかった概念とかをメモ。かつkobitoの投稿テスト

##型のキャスト

###C言語だと

 - 基礎的な型変換

```Cpp
int a = 3, b = 2;
float f, h;
f = a/b;
h = (float) a/b;
// fは1となり、hは1.5になる。
```
　　

- ポインタの型変換

```Cpp
int i = 0x41;
char = *c = (char *) &i;
// 出力結果はAとなる。 *追記 (指摘を受けた部分について補足を追加)
// 追記: iを指す参照をcharのポインタへ変換している
// 処理系依存の記述なので正常に動かないこともある。
// あくまでデモであり、こういった読めない処理はするべきでない
```

```Cpp
int x = 1;
printf("%d", (int)&x );
//コンパイラによっては警告を吐く？ が、intのポインタがintに変換されて出力される
```

  
 * * *

##define(マクロ)について

C言語において、defineがよく使われるのは以下の三つ

1. 記号定数の定義
2. 関数マクロ
3. 条件付きコンパイル

###記号定数の定義

 - 他の言語でいうところの、constのような形で使う

ソース上にリテラルを直接書くのは望ましくない。そういったものは
` #define MAX 100`
などというように定義する。

###関数マクロ

表記の仕方は
` #define マクロ名(引数) 処理`
というようにする。

プリコンパイラによるマクロ関数の展開例:

```Cpp:macrofunc.cpp
#define MIN(a, b) ((a) < (b) ? (a) : (b))
// ~ 省略 ~
x = MIN(n1, n2);
// x = ((n1) < (n2) ? (n1) : (n2)); というように展開される
```

関数マクロは、一般に関数呼び出しのオーバーヘッドをさける為に使用される。
演算子の優先順位などで、直感的ではない挙動をすることがあるので、()の付け方などに注意する。

　　
　　

###条件付きコンパイル

###ifdef

```Cpp
#ifdef MACRO

// ~処理~

#endif
```

これは、'MACRO'が定義されている場合は#ifdef~#endifまでの中を有効にする。という意味である。

###ifndef

これは上記の#ifdefとは逆で、MACROが定義されていない場合は#ifndef~#endifまでの間を有効にする。という意味である。

 * * *

###これらの使いどころ

 - header fileをかく時の定石として次のようなものがある

```Cpp:my_h.h
#ifndef MY_H //ヘッダの最初
#define MY_H

// ヘッダの定義

#endif //ヘッダの最後
```

このようにすることで、複数のソースからmy_h.hがインクルードされても一度だけmy_h.hの中身を有効にすることができる。
\# Xcodeでヘッダファイルを定義すると自動でこの一文が挿入される
rbenv で Ruby を Debian にインストール

[RVM](http://beginrescueend.com/) よりもシンプルな Ruby のバージョン切り替えシステムである [rbenv](https://github.com/sstephenson/rbenv) を使って Ruby を Debian にインストールするメモ．

ビルドに必要なパッケージ一式を入れる．(RVM の notes を参考にした)

    $ sudo apt-get install build-essential bison openssl libreadline6 \
        libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev \
        libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf \
        libc6-dev ncurses-dev

[公式](https://github.com/sstephenson/rbenv)を参考にして rbenv をインストールする．

    $ cd
    $ git clone git://github.com/sstephenson/rbenv.git .rbenv
    $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
    $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

rbenv 単体では Ruby をインストールする機能がないので，[ruby-build](https://github.com/sstephenson/ruby-build) をインストールする．

    $ mkdir -p ~/.rbenv/plugins
    $ cd ~/.rbenv/plugins
    $ git clone git://github.com/sstephenson/ruby-build.git

シェルを再起動する．端末を再起動するなり `exec $SHELL` するなり適当に．

rubyをインストールする．`rbenv install` とするとインストールできるrubyのバージョン一覧が表示されるので，欲しいバージョンを選ぶ．ここでは `1.9.3-p194` をインストールすることにしたとする．

    $ rbenv install 1.9.3-p194
    $ rbenv rehash

`rbenv rehash` はシンボリックリンクを張り直すコマンドで，rubyやgemのインストールによってコマンドが増えるたびに行う必要がある．

最後に，今インストールしたrubyを使用するように設定する．

    $ rbenv global 1.9.3-p194
    $ hash -r
    $ ruby -v
    ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
Navigation Timing APIの仕様


## 利用可能なブラウザ
- Google Chrome Ver18〜
- Firefox 7〜
- Android OS Ver4〜

## 概要
> Webサイトの制作では、ページデータの読み込み時間が問題になることがあります。ページが表示されるまでに時間がかかると、ユーザーのストレスが増加し、場合によってはユーザーが離れてしまう場合もあります。すばやく表示されるWebサイトであれば、ユーザーも使いやすいはずです。また、Googleはページの表示速度を検索結果の順位算出に使っていると明らかにしています（Googleの発表）。
ページの読み込み速度はJavaScriptで計測できます。ところが、JavaScriptではHTMLファイルが読み込まれHTMLの解釈が始まった段階からしか計測できず、どの処理に時間がかかっているのか、詳細な処理時間を把握できません。
そこで登場したのが、「Navigation Timing API」です。Navigation Timing APIは、DNSの処理時間や、HTTPリクエスト／レスポンス時間など、HTMLの処理の前段階から計測します。さまざまなタイミングで自動的にパフォーマンスが計測され、結果が各種プロパティに格納されます。

引用: http://ascii.jp/elem/000/000/675/675568/#ixzz1raCVZFi1

## APIについて
`window`オブジェクトのオブジェクト`window.performance`に必要な情報が全て詰め込まれている. 

### window.performance.navigation
プロパティに _**type**_ と _**redirectCount**_ を持つオブジェクト. typeの値は, 0/1/2/255のいずれか1つを取る. ただし, 255は将来のために予約語として確保しているだけで現仕様では, 0/1/2のいずれかになる. 

- 0: TYPE_NAVIGATE(クリックされたかURLを入力してページに移動してきた)
- 1: TYPE_RELOAD(リロードしてページを表示した)
- 2: TYPE_BACK_FORWARD(ブラウザの「進む」「戻る」ボタンでページを移動した)

プロパティ _**redirectCount**_ は, その名の通り, 最終的なドキュメントに辿り着くまでに何回リダイレクトされたかを表す.

### window.performance.timing
`window.performance.timing`オブジェクトは	ユーザーがページを開こうとしたとき(ナビゲーション開始)からロードが終わるまでの各イベント毎の時間情報を取得できる. 

``` timing.js
var timing = window.performance.timing;
console.log(timing.navigationStart); // ナビゲーション開始時刻
console.log(timing.redirectStart);		// リダイレクト開始時刻, 0の場合はリダイレクトなし
console.log(timing.redirectEnd);		// リダイレクト終了時刻, 0の場合はリダイレクトなし
console.log(timing.fetchStart);			//
console.log(timing.domainLookupStart);	//
console.log(timing.domainLookupEnd);	//
console.log(timing.connectStart);		//
console.log(timing.connectEnd);			//
console.log(timing.requestStart);		//
console.log(timing.responseStart);		//
console.log(timing.responseEnd);		// レスポンスを全て受け取った
console.log(timing.domLoading);			//
console.log(timing.domInteractive);	//
console.log(timing.domContentLoadedEventStart);	//
console.log(timing.domContentLoadedEventEnd);	
console.log(timing.domComplete);		// DOMの構築が完了した
console.log(timing.loadEventStart);	// onLoadイベントが開始された
console.log(timing.loadEventEnd);		// onLoadイベントが終了した.
```

実際に利用するときには, これらそれぞれの値1つづつには大きな意味はなく,  **2つの項目の差** に着目することになります. 具体的には以下の項目に着目します.

``` timing2.js
var timing = window.performance.timing;
console.log("リダイレクト: " + (timing.redirectEnd - timing.redirectStart));
console.log("アプリケーション・キャッシュ: " + (timing.domainLookupStart - timing.fetchStart));
console.log("DNS取得時間: " + (timing.domainLookupEnd - timing.domainLookupStart));
console.log("TCP接続時間: " + (timing.connectEnd - timing.connectStart));
console.log("リクエスト時間: " + (timing.responseStart - timing.requestStart));
console.log("レスポンス時間: " + (timing.responseEnd - timing.responseEnd));
console.log("DOMの構築時間: " + (timing.domComplete - timing.domLoading));
console.log("onLoadイベント: " + (timing.loadEventEnd - timing.loadEventStart));
```

## 参考サイト
- http://ascii.jp/elem/000/000/675/675568/
- http://d.hatena.ne.jp/jovi0608/20111209/1323428049
- http://blog.livedoor.jp/aki_mana/archives/5573238.html
org-modeでmulticolumnな表を扱う

org-modeでLaTeX出力するための文書を書くとき、\multicolumnを使用する表が必要な時がある。org-modeには一部のセルをつなげた表を書くことが(おそらく)できないので、そういう時は諦めが肝心。org文書にLaTeXを埋め込んでしまうのが手っ取り早い。

```latex
#+begin_latex
  \begin{table}[b]
    \caption{caption} \label{label}
    \begin{center}
      \begin{tabular}{|l|cc|cc|}
        \hline
        & \multicolumn{2}{|c|}{multi1} & \multicolumn{2}{|c|}{multi2} \\
        &  1-1  &  1-2  &  2-1  &  2-2  \\
        \hline
        a  &     1  &      2  &    3  &      4  \\
        b  &     5  &      6  &    7  &      8  \\
        \hline
      \end{tabular}
    \end{center}
  \end{table}
#+end_latex    
```

このように、#+begin_latex と #+end_latex で挟むことで LaTeX 記述を埋め込める。後はその間にカーソルを合わせて C-c ' を入力して、latex-mode で内容を編集しよう。
RubyGemインストール時に何らかの処理を実行するにはextディレクトリーを使う

[kindlegen gem][kindlegen]と言うのがあって、システムにkindlegenコマンドが無い時にkindlegenコマンドをインストールして使えるようにしてくれるものです。
[kindlegen]:https://github.com/tdtds/kindlegen

で、この「システムにkindlegenコマンドをインストール」っていうのはどうしているんだろうと思って覗いてみると、
ext/kindlegen/extconf.rb というファイルに、
1. kindlegenのtarボールをAmazonサイトからダウンロード
2. ↑を展開
3. コマンドファイルを$GEMPATH/binにインストール
という処理を書いていました（厳密にはMakefileを書くスクリプトです）。

なるほど、extディレクトリーにはこんな使い方もあるのか―。
Railsプロジェクトのディレクトリー下にRails Guides（含 Kindle用*.mobi）を作る

Gitのrailsプロジェクトをcloneすれば（或いはvendor/bundle以下のrailties gemの中に潜れば）Rails Guidesを作れるんですが、実はそんなことをしなくてもRailsプロジェクトであればRakeタスクで作れることを知りました。

プロジェクトルートで `$ bundle exec rake --describe doc` とすると

    rake doc:app
        Generate docs for the app -- also available doc:rails, doc:guides, doc:plugins (options: TEMPLATE=/rdoc-template.rb, TITLE="Custom Title")

と出力されて `doc:guides` タスクが使えることが分かります。ので、

    bundle exec rake doc:guides

とすれば、 doc/guides 以下にRails Guidesが出来ます。

Kindle用のmobiファイルが欲しい場合は

    $ KINDLE=1 bundle exec rake doc:guides

とすれば `doc/guides/ruby_on_rails_guides_xxxxxx.mobi` というファイルが出来ます。
（`kindlegen` コマンドが必要なので、無い人は `$ gem install kindlegen` でインストールしてください）

これでオフライン開発でも安心。
MacOSX_Lionを購入した瞬間(初期化後)にすぐにやる設定集-ウィルス対策込み


主にシステム環境設定をいじったあと、あとはFinderの設定をしてターミナルなどからもちょちょっと変更を加えます。
基本的に「変更した部分」を記載しているため、記載されていない部分については初期設定のままとなっています。

基本的に上から実行します。
ウィルス対策ソフトは早い段階で入れておきたいので。その後の順番はどうでもいいでしょう。


## 1.システム環境設定(個人の趣味が色濃く反映しています)

### ■トラックパッド

#####[ポイントとクリック]

+ 副ボタンのクリックのプルダウンリスト-「右下隅をクリック」に変更
+ 3本指のドラッグ-ON
+ 軌跡の速さ-2~3目盛りほど速いに

#####[スクロールとズーム]

+ スクロールの方向-OFF

#####[その他のジェスチャ]

+ すべてチェック


### ■キーボード

#####[キーボード]

+ キーのリピート-MAX「速い」に
+ リピート入力認識までの時間-MAX「短い」に
+ F1、F2などのすべてのキーを標準のファンクション〜-ON
+ 右下「修飾キー」をクリックして開く-CapsLoclキーをCommandキーに変更


### ■Dock

+ サイズ-左から1/4くらいの位置にして小さく
+ 拡大-ONにして、左から3/4


### ■日付と時刻

+ 秒を表示-ON
+ 日付のオプション-曜日・日付の表示を両方ON


### ■起動ディスク

+ 通常使う方のハードディスクを選択する
*この設定は電源ONのときに表示されるリンゴマークの画面で、インジケータ(ロードのマーク)が表示される時間を軽減することができる。あのロード時間は、起動するハードディスクを検索している時間らしい


### ■Time Machine

+ Time Machine の状況をメニューバーに表示-OFF



## 2.Finderの設定

### ■ 一般

+ 新規Finderウィンドウで次を表示:(username:家のアイコンのもの)を選択

### ■ サイドバー

1. よく使う項目(ONのもの)：アプリケーション、デスクトップ、書類、ダウンロード、ミュージック、ピクチャ、username(:家のアイコン)
2. 共有：全部ON
3. デバイス:全部ON

### ■ 詳細

+ すべてのファイル名拡張子を表示-ON




## 3.ウイルス対策ソフトの導入

### ■ 使うソフト：ClamXav

ダウンロードURLはこちら: http://www.clamxav.com/

1. ダウンロードしたら起動、開いたフォルダの一番上の列の左側にあるソフトのアイコンをドラッグして右側のApplicationsフォルダにドロップ。
2. Applicationsフォルダに移動して、ClamXavソフトをダブルクリックして起動
3. インストールの手順を適当に消化して進める。
4. ソフトが立ち上がると、最新のウィルス対策定義がダウンロードされるので、待つ。
5. 画面右上の環境設定より設定します
	+ 一般-基本的に全部チェック
	+ スケジュール-手動でやらない人は週末にでも設定しておきます
	+ [重要]Sentryにて管理するフォルダに「ダウンロード」を追加します(下のほうにある＋マークより選択する)、そして「ログイン時にClamXav Sentryを起動」と「感染ファイルを削除」にチェックをいれます。-この設定により、もし危険なファイルをダウンロードしても、デフォルトのダウンロード先ではるダウンロードフォルダを指定している限り、ダウンロードした時点で弾かれるので安全な状態を保てます。また、もしマシンパワーに余裕があれば、各種ブラウザのキャッシュ(cache)にあたる部分も指定して弾くといいと思います。(参考サイト: [必ず入れておきたいMac用アンチウイルスソフト「ClamXav」](http://www.sky-s.net/sky-blog/archives/2010/02/05-114118.php))


## 4. ターミナルにて細かな部分の設定

### ■ 非表示ファイルをFinderにて常に表示
ターミナル(アプリケーション>ユーティリティ>ターミナル.app)を起動して、以下を入力

```Bash:フォルダの非表示
# [name]は最初にあなたが行った設定の名前。「$」マーク以後の部分をコピペして貼付けてください。一行ごとに[Return]キーを押します

〜[name] $ defaults write com.apple.finder AppleShowAllFiles TRUE
〜[name] $ killall Finder
```

参考サイト: [このブログは証明できない-MacのFinderで隠しファイルを表示する方法2つ](http://d.hatena.ne.jp/shunsuk/20090714/1247567640)

### ■ Finderの中の日本語になってしまっているフォルダを英字にする

Finderのよく使う項目部分が、「ダウンロード」「アプリケーション」などと日本語になっていてダサいので、英字に変更します。
これらのファイルの文字情報はどうやら同フォルダ内にある非表示ファイルの「.localized」にて管理しているらしいので、これらを削除するか、名前を変更すればよいと思います。
非表示フォルダには権限の関係でFinderから名前を変えられないものもあるので、そちらはターミナルにてmvコマンドで変更してください。

## 5. Kobitoをダウンロードする 

宣伝ok.


***



だいたいこんなもんすかね。

あと入れたいソフトは別記事の[こちら(Qiitaの記事です)](http://qiita.com/items/7caf1ef59520d969fca0)にまとめてますのでよろしければついでにどぞ。
リストの変換


関数型言語によくあるmap関数のように、あるオブジェクトのリストのそれぞれの要素に対してある関数を適用して別のリストを作りたい時、guavaライブラリのLists.transformを使うと便利です。

例えば、何かのオブジェクトのリストがあって、それぞれのオブジェクトのidのリストを作りたいときなどに便利です。

```Java:Lists.transformの使用例
List<SomeObject> list = …;
List<Long> ids = Lists.transform(list, new Function<SomeObject, Long>() {
	@Override
	public Long apply(SomeObject arg0) {
		return arg0.getId();
	}
});
```