OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Piセットアップメモ（RaspbianのSDカード書き込み）


##Raspberry PiのOSをダウンロード
http://www.raspberrypi.org/downloads
上記サイトの**Raspbian “wheezy”**からダウンロードする。

##SDカードへのOSの書き込み
Raspbianのダインロードが完了したらSDカードにそれを書き込みます。
SDカードは2GBあれば十分なようです。

###"RPi-sd card builder"を使う場合
http://alltheware.wordpress.com/2012/12/11/easiest-way-sd-card-setup/
上記サイトを参考に**RPi-sd card builder**をダウンロードし、SDカードを作成する。
**これが一番簡単とのことだけど、トラブルも報告されているそうなのでコマンドラインツールで作成を行う。**

###コマンドラインツールを使う場合
http://elinux.org/RPi_Easy_SD_Card_Setup
上記のサイトより、
**Using Mac OSX**の**Using command line tools (1)**を参考に、

```
$ diskutil list
```
こんな感じで表示される。

```
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *2.0 GB     disk1
   1:                 DOS_FAT_32 RPI                     2.0 GB     disk1s1
```

SDカードのことをしめしている**IDENTIFIER**を覚えておく。
ここでは**IDENTIFIER = disk1**

ここでdiskのアンマウント（取り外し）を行う。

```
$ diskutil unmountDisk /dev/disk1 //ここのdisk1はIDENTIFIERをもとに。
```

アンマウントされていることを確認して、
下記のコマンドを実行。
**これを間違えるとmac内のデータを全て消してしまいかねないので注意**

```
sudo dd bs=1m if=/Users/<USER_NAME>/Downloads/2013-02-09-wheezy-raspbian-1.img of=/dev/disk1
```
rootのパスワードを入力し、しばし（数分）待つ。


```
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 1012.100576 secs (1916673 bytes/sec)
```

完了したようなのでSDカードを取り出してRaspberry Piに装着する。
macにJenkins導入


##jenkinsのインストール
homebrewにパッケージが存在するのでそこからインストール

```Terminal
brew install jenkins
```

jenkinsのインストールを行ったらversionを確認する

```Terminal
brew info jenkins
```

`jenkins: stable 1.513, HEAD`このように表示されるので
数値はversionでこれはディレクトリ名になっている。

ここまで確認したら下記のコマンドでjenkinsを立ち上げる

```Terminal
java -jar /usr/local/cellar/jenkins/1.513/libexec/jenkins.war
```

http://localhost:8080/ にアクセスして管理画面の確認が出来ればインストールは完了


##自動起動
この方法で立ち上げる場合macを立ち上げるたびにコマンドを打たなくてはいけなくなり面倒なのでlaunchctlというサービスに登録をしてやり自動的に起動をするように設定してやる

```Terminal
ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```
STDERRにppする

```ruby
PP.pp(obj, STDERR)
```
```sh
$ ruby -r pp -e 'PP.pp [1,[*2..30],{a:4, b:5}], STDERR' > /dev/null
[1,
 [2,
  3,
  4,
  5,
  6,
  7,
  8,
  9,
  10,
  11,
  12,
  13,
  14,
  15,
  16,
  17,
  18,
  19,
  20,
  21,
  22,
  23,
  24,
  25,
  26,
  27,
  28,
  29,
  30],
 {:a=>4, :b=>5}]
```
externalのところをgdbclient

Nexus7のexternalをデバッグしたかった。
eclipseが使えるとよかったのだが、まだよくわからない。。

$ cd master
$ source build/envsetup.sh
$ lunch full_grouper-eng
$ adb shell ps
  (アタッチしたいプロセス番号を探す)
$ gdbclient app_process :5039 (プロセス番号)

/system/binにある実行ファイルにアタッチするのであれば、プロセス番号ではなく実行ファイル名でもよさそう。
Androidアプリの場合はpsでプロセス番号を指定するようだった。


Android側でgdbserverを動かすことになるが、gdbclientが自動的にやってくれる。
パラメータが間違っていてもgdbが起動するので、コンソールのエラーは目視確認しよう。

dddも使えるようであるが、build/envsetup.shに手を加えるようである。
http://www.omappedia.com/wiki/Android_Debugging


うまくやればWindowsからでもデバッグできそうだが、まだよくわかってない。。
neocomplcache#smart_close_popup()とsmartinputの機能を両立させる

**設定方法を改めて、新たに投稿しました→[http://qiita.com/items/bdad8e28843bfb3cd8bf](http://qiita.com/items/bdad8e28843bfb3cd8bf)**

------

[neocomplcache](https://github.com/Shougo/neocomplcache.vim)の設定例にある…

> ```vim
> " <C-h>, <BS>: close popup and delete backword char.
> inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
> inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
> ```

これらのマッピングはなくても[neocomplcache](https://github.com/Shougo/neocomplcache.vim)は動作しますが、補完候補のポップアップが出ているときに`<BS>`や`<C-h>`を押したときにポップアップを確実に消してくれるもので、候補の誤爆を防いだり、表示がスッキリしたりする効用があります。

ところが、この設定を使うと、[smartinput](https://github.com/kana/vim-smartinput)の以下のような機能が使えなくなってしまいますorz

```
_ をカーソルと仮定して、<BS>を使う前と後

Before: hoge(_)    After: hoge_
Before: hoge()_    After: hoge_
```

括弧のペアを削除する機能です。まあ、ペアの括弧が入力されるだけでもかなり便利なんだけど、これはもったいない。

[smartinput](https://github.com/kana/vim-smartinput)のローカルな関数を呼び出すために、スクリプト番号をどうやって取ろうとかなり悩んだのですが、ソースをよくよくみたら`smartinput#sid()`という関数があるじゃん。一難去った。しかし、どうやっても、マッピングの内容がそのまま文字列として入力されるな… そして、helpを見てみると、関数`eval()`というのがある。これだ！`eval()`で囲ってみる。よし。できあがったものを`.`で結合して完成。

```vim
inoremap <expr> <C-h>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<BS>", "\<C-h>")')
inoremap <expr> <BS>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<BS>", "\<BS>")')
```

----------

2013-05-23 `<CR>` の分を追加しておきます。

```vim
inoremap <expr> <CR>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<Enter>", "\<Enter>")')
```
Android Studioを適当に触ってみた。

##環境
- パソコン:MacBook Pro
- OS:Mac OS X Mountain Lion
- Android Studioのバージョン:AI-130.677228

##JDKのインストール
※ JDK 7をインストールしていない場合は必要。 JDK 6じゃ動かないっぽい。

1.[Java SE Downloads](http://www.oracle.com/technetwork/java/javase/downloads/index.html)から最新のJDKのインストーラをダウンロードする。
2.インストーラを起動し、JDKをインストールする。

##Android Studioのインストール
1.[ダウンロードサイト](http://developer.android.com/sdk/installing/studio.html#download)からダウンロードする。
2.適当なフォルダにおく。※今回は/Applicationsにおいた。

##プロジェクトの作成
- Android Studio.appを起動すると、[New Project]があるので、そこから画面の案内に従ってプロジェクトを作成する

##アプリケーションの実行
- [Run]→[Run プロジェクト名?]を選択するとエミュレータが起動する。
- はずなんだが…コンソールにエラーが表示されている。

`emulator: ERROR: unknown skin name 'WVGA800'`

- AVD Managerでエミュレータを編集したら直った。(詳細は後述)

##AVD Manager
- [Tools]→[Android]→[AVD Manager]から起動できる。
- [Edit]で[Skin]を"WVGA800"から他のに変更したら、unknown skin nameエラーが直った。

##SDK Managerの起動
- [Tools]→[Android]→[SDK Manager]から起動できる。

##日本語化
1.[Pleiadesプラグイン日本語化プラグイン](http://mergedoc.sourceforge.jp)から日本語化プラグインをダウンロードして適当なフォルダに解凍する。※今回は[Eclipse 4.2]の[Java]の[Standard Edition]をダウンロードした。
2.フォルダ
`[pleiadesのダウンロードフォルダ]/eclipse/dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades`
を
`/Applications/Android Studio.app/plugins`
フォルダにコピー＆ペーストする。
3.`/Applications/Android Studio.app/bin/idea.vmoptions`にJVMオプションを追加する。

```Java:idea.vmoptions
-ea
-javaagent:../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

4.Android Studioを起動する。
5.日本語化されていない箇所に、独自にpropertiesを作成する。(気が向いたら・・・)
MacにRubyをインストールする時のメモ

MacにRubyをインストールする時のメモ

* homebrewはあらかじめインストールしておく。
* インストールにはrbenvを使う。
* MBA(Mid 2012) + OS X 10.9.3

```
# rbenv, ruby-buildのインストール
brew install rbenv
brew install ruby-build

# 依存ライブラリのインストール
brew install readline
brew install openssl

# 環境変数の設定
vim ~/.bash_profile #手書き編集
cat ~/.bash_profile
export PATH=~/.rbenv/shims:$PATH
eval "$(rbenv init -)"
source ~/.bash_profile

# Ruby 2.1.2のインストール
RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.2

# 更新
rbenv rehash

# Ruby 2.1.2を使うとき
# rbenv global 2.1.2
```
手動バックアップでドライブツリーを作成して差分をとる

## 経緯
巷にでまわっているディスクミラーリングのソフトがなんかいまいち信用できないので、毎度手動にてバックアップをミラーリングしている。そのときファイルツリーをつくって差分を見て確認する。ファイルツリーを作成するソフトもなんかいまいち信用できないのでDOSのコマンドをつかって毎度つくっている。要約すると、バックアップを手動でやると、やったぞ感が得られる。ソフトつかうの、なんか信用できない。


## 実装
DOSのバッチをつくってダブルクリックしてツリー構造をテキストファイルに出力。差分はテキストエディタか、コマンドでも可能。Linuxでも似たようなことができる（やったことないのでよくわからん）

## メリット＆デメリット
メリット
・余計なアプリをインストールしなくて済む
・Linuxやらでも応用可能
・ツリー作成、差分見るのがテキストベースなので高速
・効率より自己満足

デメリット
・面倒くさい


## コード

```bat:tree_[H].bat


cd /d H:\
tree /F > C:\Users\HOME\Dropbox\tree.txt


```


```bat:tree_sub[J].bat


cd /d J:\
tree /F > C:\Users\HOME\Dropbox\tree_sub.txt


```


cd /d のあとにドライブ名を指定します。
あとはドライブのルートから全部をリダイレクト。ツリー表示に生成されたテキストファイルが出力されます。
あとは差分をとって異常がないか確認すればおわり。



```bat:merge.bat

fc /n tree.txt tree_sub.txt
pause

```


Linuxではdiffを使うようですが、Windowsではfcコマンド（"file compare"の略称？）を使うようです。
このコマンドを使用するとファイル同士を比較できます。
/nで行番号を表示するように指定しています。
バッチで一連の作業をひとつにまとめることも可能。ドライブレターの固定などしないとデバイスが増える際めんどいことになる。

# まとめ
更新日時表示させたいのですがわかりません。
Movable Type: ユーザーダッシュボードを初期状態で「ブログ」を展開させる

Movable Typeのユーザーダッシュボード画面はタブ形式になっており、初期状態では「ウェブサイト」が開くようになっている。

サイト構成の都合で、更新担当者がウェブサイト管理画面を訪問することがまずない場合は、「ブログ」タブが開くようになり、ステップがひとつ減る。

「MTAppjQuery」プラグインを導入し、「user.js」に以下のコードを追記する。

```javascript:mtapp_jquery_dashboard_tabs.js
if(mtappVars.screen_id == 'dashboard'){
	var Tabs = $('#dashboard #favorite-blogs-tabs');
	$('ul li', Tabs).eq(0).removeClass('ui-tabs-selected ui-state-active');
	$('ul li', Tabs).eq(1).addClass('ui-tabs-selected ui-state-active');
	Tabs = null;

	var TabCont = $('#dashboard #favorite_blogs');
	$('#favorite-website', TabCont).addClass('ui-tabs-hide');
	$('#favorite-blog', TabCont).removeClass('ui-tabs-hide');
	TabCont = null;
}
```
Movable Type: 画像アップロード時に、ファイルパスに年月日が自動で入るようにする

Movable Typeのファイルアップロード画面では、ファイルを年月日で整理するには一旦プルダウンで選択する必要がある。

「MTAppjQuery」プラグインを導入し、「user.js」に以下のコードを追記すると、自動で入力欄に現在の年月日が入るようになる。

- もちろんMovable Type以外にも応用できる。
- バージョンアップで正常に動作しなくなった場合は、最終行のセレクタを書き替えること。

```javascript:mtapp_jquery_getUploadDate.js
var getUploadDate = function() {
  var d = new Date();
  // 年月日の取得
  var month  = d.getMonth() + 1;
  var day    = d.getDate();
  var hour   = d.getHours();

  // 1桁を2桁に変換する
  if (month < 10) {month = "0" + month;}
  if (day < 10) {day = "0" + day;}
  if (hour < 10) {hour = "0" + hour;}

  // 整形して返却
  return "img/" + d.getFullYear() + "/" + month + "/";
}
$('.insert-asset-dialog form#upload-form #extra_path, #main-content form#upload-form #extra_path').val(getUploadDate());
```
GitHubで最速転職活動

1. [GitLabにPull Requestを送る](http://qiita.com/items/b7319f92581bd3facdc4)
2. [GitLabのMVPを取る](http://d.hatena.ne.jp/hiroponz/20130424/p1)
3. ITベンチャーからオファーが殺到する
4. 朝起きたら夢だった

### 参照
- [OSSのcontributorとして活動するということ](http://hiroponz.hateblo.jp/entry/20130516/p1)
PHPUnitをMacにインストールしてみた

OS 10.8.3
PHPUnitをインストールしたときのメモ
1.pearインストール
2.sudo pear channel-discover pear.phpunit.de
3.sudo pear install phpunit/PHPUnit
　にてインストール完了。
　確認方法は

phpunit --version

なんかエラーが出るときは、 /usr/lib/php/ へ移動してみる。
CanvasRenderingContext2Dで三角形を描画できるようにする

strokeRectとかfillRectと同じように三角形を使いたいので・・・。

```javascript
CanvasRenderingContext2D.prototype.strokeTriangle = function(x,y,w,h){
	this.beginPath();
	this.moveTo(x+(w/2) , y);
	this.lineTo(x+w     , y+h);
	this.lineTo(x       , y+h);
	this.closePath();
	this.stroke();
}
CanvasRenderingContext2D.prototype.fillTriangle = function(x,y,w,h) {
	this.strokeTriangle(x,y,w,h);
	this.fill();
};
```

```javascript
// ctxにはコンテキストをセット。三角形を描画する場合は辺の比率に気をつける。
// 正三角形を描画するのであれば以下の様な感じ
ctx.fillTriangle(30,30,15*2,15*Math.sqrt(3));
```
AlermManagerとネットワークアクセス

アラート時間の指定には次のタイプがあります。
　・絶対時間で指定するRTCタイプ
　・相対時間で指定するELAPSED_REALTIMEタイプ

どちらのタイプを使用するかはアプリ要件に左右されますが、もし
　"タイマー発火を契機にネットワークアクセスする仕様、かつRTCタイプ"
を採用しようとしているのであれば一度次のことを検討してみましょう。
　"この処理/仕様は、相対時間指定(○○分後)で実現可能か。あるいはそのように処理/仕様を変更できないか。"

もし、この問いに"YES"であるならRTCタイプではなくELAPSED_REALTIMEタイプを採用するのがよい選択です。
...

参考：http://yuki312.blogspot.jp/2013/05/androidalermmanager.html
CakePHPのセッション管理をDBに変更する

CakePHPのセッション管理をDBに変更する方法をメモします。

core.phpの190行目以下を下記のように変更します。

```php:core.php
	Configure::write('Session', array(
		'defaults' => 'database',
		'cookie' => 'SID',
		//セッションの保持時間（秒数）
		'timeout' => 86400,
	));
```

データベースにテーブルを作成します。

```sql:session.sql
CREATE TABLE IF NOT EXISTS `cake_sessions` (
	`id` varchar(255) NOT NULL DEFAULT '',
	`data` text NOT NULL,
	`expires` int(11) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

以上です。
5秒でビルド

サンプルプログラムを書いて速攻ビルドして動作確認したいってときに
Makefileの書き方なんて直ぐに忘れてしまうのでメモ。

同一ディレクトリにソース置いてある環境を想定

 ./temp
  main.c
  sub.c
  sub.h
  Makefile

```make
TARGETS=main
main: main.o sub.o
CFLAGS += -Wall -g　 -Wextra
LDFLAGS += 
all: $(TARGETS)

.PHONY: clean
clean:
	$(RM) *.o $(TARGETS)
```

windowsでcygwinのときはcleanは*.exe 
C++ならCXXFLAGS
Slimのテンプレートにjavascriptを組み込む


```sample.slim
doctype html
html
   head
      script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"
      script src="js/animatedtablesorter/tsort.min.js"
      link rel="stylesheet" href="js/animatedtablesorter/style.css" type="text/css"
   body
      javascript:
        $(document).ready(function(){$('table.tableSorter').tableSort();});

      table border=1 class="tableSorter"
        tr
          th ID
          th Thumnail
以下略
```

scriptへのリンク自体はimgを埋め込む時と同じ感じ。
scriptを直接記入する時は`javascript:`の下の行にインデントつけて記述する。

今回は[jquery-animated-table-sorter](http://www.matanhershberg.com/plugins/jquery-animated-table-sorter/)を組み込んでみた。

sinatraでは静的なファイルはpublicディレクトリに格納する。
従ってスクリプトは以下のような配置となる。

```tree
├── public
│   └── js
│       └── animatedtablesorter
│           ├── arrow_asc.png
│           ├── arrow_desc.png
│           ├── style.css
│           ├── tsort.js
│           └── tsort.min.js
├── views
│   └── index.slim
│   └── slideshow_list.slim
```

`script src="js/animatedtablesorter/tsort.min.js"`
と記載しているようにURL自体にはpublicのディレクトリ名は記入しない。
[NFC]TechnologyとPlatform

NFC Forumでは、無線方式として「NFC-A」「NFC-B」「NFC-F」と大きく３つに分けた。
これを「Technology」と呼んでいる。
例えば、MIFARE Ultralight(NXP社)とFeliCa(SONY社)は、それぞれ「NFC-A」と「NFC-F」で異なる無線方式を使っているため、使用するためにはそれぞれ別にアクセス手段を作らなくてはならない。

ただ、同じ無線方式だからといって、同じようにアクセスできるわけではない。
たとえばMIFARE Ultralight(NXP社)と、Topaz(Broadcom社)とは、どちらも無線方式としてNFC-Aを採用しているが、メモリ構造などが異なる。


どう例えるとよいだろうか。

地球の人間であれば、可聴音域は20Hz～20kHz程度(そこまでは聞こえんと思うが)といわれている。
これは、NFCの通信が13.56MHzである、ということと同じである。

NFC-A, B, Fという「Technology」は、可聴音域の中でしゃべる言語の違い、になるか。

先ほど書いた、MIFARE UltralightとTopazの違いは、NFC Forumでは「Platform」と呼んでいる。
文化の違いによって生まれた「方言」くらいになるだろうか。

NFCタグは、搬送波によって電源を供給されて動くOSを持っていると考えてよい。
なるべく安価に仕上げるため、他の言語は解釈しないようになっているだけだと思われる。
NFC-A, NFC-B, NFC-F

2013年4月のところでは、NFC Forumでは以下の3つのNFC無線通信が仕様として登録されている。

 - NFC-A
 - NFC-B
 - NFC-F

# NFC-A
NXP社のMIFAREや、Broadcom社のTopazなどが有名。
国際規格であるISO/IECに「ISO/IEC-14443」があり、そこの「Type-A」として登録されている。
タバコのTaspoも、これ。

# NFC-B
モトローラの規格だったはず。
IC運転免許証やパスポートなどで使われている。
住基ネットもおそらくそうである。
国際規格であるISO/IECに「ISO/IEC-14443」があり、そこの「Type-B」として登録されている。

# NFC-F
FeliCaの'F'と思われる。
nimocaやSuicaなどのおサイフケータイで使われている。
社員証のようなセキュリティ分野でもよく使われている。
また、お金やセキュリティの絡まない分野で、安価なタグ(FeliCa Lite)が用いられることもある。
[NFC]おサイフケータイはFeliCaである(今のところ)

フィーチャーフォンのおサイフケータイ。

そもそも「おサイフケータイ」とは、ドコモの登録商標で、普及のためにauやソフトバンクにも同じ規格を提供しているようなところがある(と思う)。

携帯電話でNFCを使った汎用的な金融システムではなく、「FeliCa」を使った、という前置きがある。
将来的には知らないが、今のところ(2013年5月)おサイフケータイはFeliCaベースである。

FeliCaはSONYの技術だが、おサイフケータイ自体はSONYではなくFeliCaネットワークスとドコモ(主にドコモだと思う)がやっている。
よって「MIFAREでおサイフケータイ」という表現は、今のところ不正確である。
C99 の sizeof と可変長配列

C99 は、配列のサイズに変数を使うことができる。

こんな感じ。

```c:test1.c
void test1( int n )
{
  int fixed_array[10];
  int varlen_array[n];
   printf( "sizeof(fixed_array)==%ld\n", sizeof(fixed_array) );
   printf( "sizeof(varlen_array)==%ld\n", sizeof(varlen_array) ); 
}
```

`test1(10);` と、引数 10 で呼ぶと、

```text:
sizeof(fixed_array)==40
sizeof(varlen_array)==40
```

となる。
しかし、普通の配列とは違ってコンパイル時には `sizeof` の値が確定しないので

```c:test2.c
void test2( int n )
{
  int fixed_array[10];
  int varlen_array[n];

  // sizeof(fixed_array) は enum の値に使える
  enum{ FIXED_ARRAY_SIZE=sizeof(fixed_array) };

  // sizeof(varlen_array) は enum の値に使えないのでコンパイルエラー
  enum{ VARLEN_ARRAY_SIZE=sizeof(varlen_array) };
}
```

`enum` の値や case ラベルには使えない。
それと。

```c:test3.c
#define COUNT_OF(x) (sizeof(x)/sizeof(*(x)))
void test3( int n )
{
  int varlen_array[some_func(n)];
  for( size_t ix=0 ; ix<COUNT_OF(varlen_array) ; ++ix ){
    do_something( varlen_array, ix );
  }
}
```

のようなケースで、コンパイラが気づいてくれないと、COUNT_OF マクロ内の除算をループの数だけ実行してしまってもったいない。
[ZF2] 404エラーの発生条件

意図せず404エラーが発生した場合は以下の項目をチェックする。

1. リクエストされたURIに対応するルートが見つからなかった。
2. Service Manager（[Service Locater](http://en.wikipedia.org/wiki/Service_locator_pattern)の実装）がリクエスト（タスク）の処理を担当するコントローラ（サービス）を見つけられなかった。
3. コントローラがDispatchableInterfaceを実装していない。
4. コントローラがレスポンスコードに404を設定した。

ほぼ[Quick Start](http://zf2.readthedocs.org/en/latest/modules/zend.view.quick-start.html#usage)の直訳。
StoryboardでUIScrollViewとUIPageControlを連携させるときの注意点


StoryboardでUIScrollViewを使ってページ遷移を実装したあと、
UIPageControlを追加してページ数や現在のページが
分かるように機能拡張したときにハマったので、その解決方法を書いておきます。

1つのViewにUIScrollViewを追加すると、
[View Controller Scene]はこうなっていると思います。
▼View Controller
　▼View
　　▼Scroll View

この状態で、UIPageControlを追加すると、
UIScrollViewの上に乗せる事になります。
このときの[View Controller Scene]はこうなっています。
▼View Controller
　▼View
　　▼Scroll View
　　　▼Page Control

これで実行するとSigabrtします。

以下のようにViewの直下に置くと意図した動きになります。
▼View Controller
　▼View
　　▼Scroll View
　　▼Page Control

やり方は、[View Controller Scene]上で"Page Control"を"View"の下に
ドラッグ＆ドロップするだけです。
NFC Forumの３本の流れ

# R/Wモード
Reader / Writerモードのこと。
自分が搬送波を出す側になり、タグにアクセスする。
用語でいえば、自分がInitiatorになる、ということ。

# Card Emulationモード
自分がタグになりすます。
用語でいえば、自分がTargetになる、ということ。
Card Emulationモードになってるときは、R/Wからの指示を待つ。

# P2Pモード
Peer to Peerモードのこと。
R/Wモード、Card Emulationモードは「NRM」(Normal Response Mode)と呼ばれ、Initiatorが要求を出し、Targetが応答を返す、という形を取る。
P2Pモードの場合は「ABM」(Asynchronous Balanced Mode)と呼ばれ、InitiatorでもTargetでも要求が出せるようになっている。
memcached

# スラブの一覧と使用状況の表示
memcached-tool localhost:11211

	  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
	  1      96B  15263026s       1    1868      no        0        0    0
	  2     120B  15263040s       1      49      no        0        0    0
	  3     152B  15263101s       1       8      no        0        0    0
	  4     192B  15263101s       1       3      no        0        0    0
	  5     240B  15263101s       1      36      no        0        0    0
	  6     304B  15263101s       1       1      no        0        0    0
	  7     384B         0s       1       0      no        0        0    0
	  8     480B         0s       1       0      no        0        0    0
	  9     600B         0s       1       0      no        0        0    0
	 10     752B         0s       1       0      no        0        0    0
	 11     944B         0s       1       0      no        0        0    0
	 12     1.2K         0s       1       0      no        0        0    0
	 13     1.4K  15263040s       1       1      no        0        0    0
	 14     1.8K         0s       1       0      no        0        0    0
	 15     2.3K         0s       1       0      no        0        0    0
	 16     2.8K         0s       1       0      no        0        0    0
	 17     3.5K         0s       1       0      no        0        0    0
	 18     4.4K  15263040s       1       1      no        0        0    0

#memcachedの統計データの表示
memcached-tool localhost:11211 stats

	#localhost:11211   Field       Value
	         accepting_conns           1
	               auth_cmds           0
	             auth_errors           0
	                   bytes      184911
	              bytes_read  3349077405
	           bytes_written  5006875896
	              cas_badval           0
	                cas_hits           0
	              cas_misses           0
	               cmd_flush           0
	                 cmd_get   117706322
	                 cmd_set     1441787
	             conn_yields           0
	   connection_structures          12
	        curr_connections          11
	              curr_items        1965
	               decr_hits           0
	             decr_misses           0
	             delete_hits           0
	           delete_misses           0
	               evictions           0
	                get_hits   117106634
	              get_misses      599688
	               incr_hits           0
	             incr_misses           0
	          limit_maxbytes    67108864
	     listen_disabled_num           0
	                     pid        3733
	            pointer_size          64
	           rusage_system 3382.159833
	             rusage_user 1114.690541
	                 threads           4
	                    time  1368876892
	       total_connections         156
	             total_items     1441787
	                  uptime    15263261
	                 version       1.4.4

#データのダンプ
memcached-tool localhost:11211 dump > /tmp/memcache.dump
第11回オフラインリアルタイムどう書くの参考問題。python による実装例。


オフラインリアルタイムどう書く
http://atnd.org/events/38770
の参考問題
http://nabetani.sakura.ne.jp/hena/ord11arithseq/
の実装例を python で書いた。
python2.7 と python3.3 の両方で動作確認済み。

他の言語などの解答例は
http://qiita.com/items/c206fbc645c255cb7de6
から辿れます。

で。
こんな感じ。

```python:solver.py
#coding:utf-8
import re

def solve( src ):
    def impl( s, seq ):
        if 2<len(s) and ( s[1]-s[0] != s[-1]-s[-2] ) :
            return 0
        if len(seq)==0:
            return len(s)
        return max(  impl( s, seq[1:] ),  impl( s+seq[0:1], seq[1:] ) )
    nums="0123456789abcdefghijklmnopqrstuvwxyz"
    return "%d" % impl( [], [ nums.index(c) for c  in list( src ) ] )

def test( samples ) :
    for line in samples.splitlines():
        a=re.split( "\s+", line ) # num, input, expected
        if len(a) <3:
            continue
        actual = solve( a[1] )
        ok=actual==a[2]
        print( [ "ok" if ok else "***NG***", a[1:3], actual ] )

test( """
0   12345abcz   5   12345
1   012abku 4   0aku
2   01245689cdeghik 6   048cgk
49  012346abceghjknortv 5   01234 他 2 件""" )
```

例によってテストデータの大半を省略。

F# で色々試してくださっている matarillo さんのコメント
http://qiita.com/items/6ab69f5f514cb2d0e7a8#comment-73ec472aa6be28061f68
から着想を得て書いた。

末尾再帰にならない再帰なのでスタックが溢れる感じだけど、たかだか36なので大丈夫。だった。

python らしさを出したいと思っているんだけれども、内包表記を一個使えただけで、いまひとつ。今回も for 文の else を使うチャンスがなかった。残念。

python 初心者なので色々発見があり。

 * `#coding:utf-8` には効果がある。(python2.7の場合)
 * 定義の前にメソッド（関数？）呼んだらエラー
 * 36進数をなんとかする関数はないらしい。
 * やっぱり後置 if はないらしい。
Objective-C で avi ファイルの FourCC を書き換える

## avi の特徴

0-4 バイト: `RIFF` RIFF ヘッダー
8-12 バイト: `AVI ` RIFF の FourCC
12-16 バイト: `LIST`
20-28 バイト: `hdrlavih` データフォーマット定義リスト、avi メインヘッダー
96-104 バイト: `strlstrh` ストリームヘッダーチャンク
108-112 バイト: `vids` ならヘッダの次にビデオストリームがある
112-116 バイト: FourCC
164-168 バイト: `strf` ストリームフォーマットチャンク
188-192 バイト: FourCC

QuickTime だと 188-192 の FourCC 書き換えが影響するっぽいので、ここをいじれば良いかもしれない。
`YUY2` な avi は `yuvs` にすれば QuickTime で読める。

http://msdn.microsoft.com/ja-jp/library/cc352264.aspx
http://www.usagi-goten.com/jp/AVI_structure.html

## 書き換え

```objc:NSFileHandleでシークして上書き
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:aviFilePath];
	
NSData *newData = [NSData dataWithBytes:(void*)[fourCC cString] // 最近はDeprecatedメソッドらしい。別の方法で
							 length:4];

[fileHandle seekToFileOffset:188];
[fileHandle writeData:newData];
[fileHandle closeFile];
```
CakePHPで無限スクロール

CakePHPでの無限スクロール実装をメモします。
今回は下記のプラグインで実装します。


[jQueryプラグイン「Infinite Scroll」](http://www.infinite-scroll.com/infinite-scroll-jquery-plugin/ "jQueryプラグイン「Infinite Scroll」")

コントローラーを作成します。

```php:ProductsController.php
function index(){
	// ページング処理
	$this->set('products',$this->paginate('Product'));
}
```

ビューを作成します。

```html+php:index.ctp
<?php echo $this->Html->script('jquery.infinitescroll.min', array('inline' => false)); ?>
<?php echo $this->Html->script('products_index', array('inline' => false)); ?>
<div id="products">
	<?php
		// 表示内容
		foreach($products as $product){
			echo '<div class="product">';
			echo '<h3>'.$post['Product']['title'].'</h3>';
			echo '<p>'.$post['Product']['content'].'</p>';
			echo '</div>';
		}
	?>

	<?php // 次のページへのリンク ?>
	<div id="page-nav">
		<?php echo $this->Paginator->next('次のページ',array('class'=>'next')); ?>
	</div>
</div>
```
	
jQueryを実装をします。

```javascript:products_index.js
$(function() {
	$("#products").infinitescroll({
		navSelector : '#page-nav', // ナビゲーション
		nextSelector : '#page-nav a', // 次ページへのリンク
		itemSelector : '.product', // 次ページ内で探す要素
		loading : {
			finishedMsg : 'これ以上、画像がありません。',
			img : '../img/loader.gif'// ローディング画像
		}
	});
});
```
	
	
以上です。
Titanium Mobile(Android)でActionBarをカスタマイズする

1.ActionBarの素材を http://jgilfelt.github.io/android-actionbarstylegenerator/ で作る．名前は適当に付ける．（ここではmyappと付けたとします）

2．zipを解凍して，[プロジェクトのルートディレクトリ]/platform/以下にそのまま投げ込む

3. tiapp.xmlのandroid manifestのところで以下のように指定．

```
<android xmlns:android="http://schemas.android.com/apk/res/android">
    <tool-api-level>16</tool-api-level>
    <manifest>
    <application android:theme="@android:style/Theme.Myapp"></application>
    </manifest>
</android>
```

4.プロジェクトをクリーンして再ビルド

AndroidManifest.xmlに直書きしたらダメだった．もっと単純だった．．．
Node.jsで、取得したWebページをUTF-8へ自動変換する

追記 
ajido@githubさんにコメント頂き、HTML5のケースに対応して修正しました。ありがとうございます！

Node.jsでスクレイピングをしようとしたところ、文字コードを判定、変換する必要に迫られました。
そこで取得したWebページの文字コードを自動で識別し、UTF-8へ変換するようにしました。
CoffeeScriptで書いてます。


# Requirements
以下の npm パッケージが必要です。
 - iconv
 - buffer
 - request
 - cheerio


# 文字コードの識別・変換
取得したWebページのmetaタグから文字コードを取得し、IconvでUTF-8へ変換します。
エラー処理などは特に意識していません。

```coffeescript:charset.coffee
{Iconv}  = require "iconv"
{Buffer} = require "buffer"


# エンコーディングの判別
getCharset = (body) ->
  bin = body.toString('binary')
  re = bin.match(/<meta\b[^>]*charset=["']?([\w\-]+)/i)
  if re
    charset = re[1]
  else
    charset = "utf-8"
  charset


# エンコーディングをUTF-8へ変換
toUtf8 = (body) ->
  iconv = new Iconv(getCharset(body), 'UTF-8//TRANSLIT//IGNORE')
  body = new Buffer(body, 'binary')
  body = iconv.convert(body).toString()


module.exports =
  toUtf8: toUtf8
```


#いざスクレイピング
上記のコードをcharset.coffeeとして保存して使います。
requestで取得したWebページをcharset.toUtf8へ渡すと、UTF-8へ変換して返します
あとはcheerioで好きにスクレイピングができます。


```coffeescript
request = require "request"
cheerio = require "cheerio"
charset = require "charset"


# 指定URLを処理する
processPage = (url) ->
  request
    uri: url
    encoding: "binary"
  , scrapingPage


# 取得したページをスクレイピングする
scrapingPage = (error, response, body) ->
  if not error and response.statusCode is 200
    # UTF-8へ変換
    $ = cheerio.load(charset.toUtf8(body))

    #
    # 好きなスクレイピング ...
    #


# 実行
processPage('http://www.jma.go.jp/jma/index.html')
```


スクレイピングは夢が広がります:)
Ruby on Railsとfllcalendar pluginでGoogleカレンダークローンを作る(3)


CRUDのうち、RとCまでやったので今回はUを実装してみる。

## 選択したイベントを更新する
選択したイベントを更新するためには、eventClickオプションに関数を登録する。
関数の中身は登録のときとほぼ同じでいける。
違いはリクエストを投げるURLが`/events/[event.id]`になるところと
dataの中身を`_method: 'PUT', event: event`というようにして擬似的にPUTリクエストを投げるようにしているところ。
これによりrails側でupdate処理が実行される。

```js:updateEvent
    var updateEvent = function(event, revertFunc) {
	var title = window.prompt("Edit title", event.title);
	var url = "/events/" + event.id;
	var data = {_method: 'PUT',
		    event: {title: title,
			    start: event.start,
			    end: event.end,
			    allDay: event.allDay}};
	$.ajax({
	    type: "POST",
	    url: url,
	    data: data,
	    success: function() {
		calendar.fullCalendar("refetchEvents");
	    },
	    error: revertFunc
	});
    };
```

## カレンダー上の変更に応じてイベントを更新する
カレンダー上でイベントを変更できるようにするためには、jquery-uiが必要になるとのことなので、jquery-ui-railsを追加する。

Gemfileに```gem 'jquery-ui-rails'```を追加する

```
bundle install --path/vendor
```

application.jsに``` //= require jquery.ui.all```、application.cssに``` *= requi
re jquery.ui.all```を追加する。

これで、fullCalendarのオプションに```editable: ture```を追加すると、カレンダー上での変更、移動ができるようになる。

変更・移動後のeventの中身はコールバック関数の引数で渡されるので、さきほどのupdateEventをeventResizeオプション・eventDropオプションで指定すればよい。
fullCalendarの呼び出しの箇所を抜粋すると以下のようになる。

```js:fullCalendar
    var calendar = $("#calendar").fullCalendar({
	    events: "/events.json",
	    selectable: true,
	    selectHelper: true,
	    ignoreTimezone: false,
    	editable: true,
    	select: select,
    	eventClick: updateEvent,
    	eventResize: updateEvent,
    	eventDrop: updateEvent
    });
```
PayPal Sandbox にログインできない問題の対処法

PayPal の Sandbox にログインしようとしてもログインできない問題、という問題があります。Sandbox のログイン画面が出てこない、Sandbox のログイン後に通常サイトのトップページにリダイレクトされてしまう、などなど。とにかくいろいろな現象のせいで Sandbox にログインできないのです。何が原因なのかまったくわかりません。

あまりにもひどいクオリティなので PayPal の人に問い合わせをした結果、こうしろという返事が返ってきました。

1. Firefox を起動 (他のブラウザではダメらしい)
2. Cookie を全部消す (とりあえず消せということらしい)
3. https://developer.paypal.com でログイン (ここは普通)
4. https://www.sandbox.paypal.com/webapps/mpp/home を URL バーに直接入れて、Sandbox のアカウント・パスワードを入力

たしかにこの通りにやるとうまくいきました。……うまくいったのはいいんだけど、なぜこれでうまくいくのか、解せません。ほんとにこれでいいのか、PayPal。ひどすぎるぞ。
The reason why the Regular Expression(RE) fail to parse .tex source.



nested commands
-----------------------------

Example .tex source with nested commands.

```tex
\frac{1}{1+\frac{1}{1+\frac{1}{1+x}}}
```

In this case, it's impossible to search the othor of third bra's pair with RE.

(non-)greedy RE
-----------------

Let's try!

1) use greedy match

```python
a = r"\frac{1}{1+\frac{1}{1+\frac{1}{1+x}}}"
m = re.search(r"\\frac\{.*\}\{.*\}", a)
```

This match to first frac's braket.

```python
'\\frac{1}{1+\\frac{1}{1+\\frac{1}{1+x}}}'
```


2) use non-greedy match

```python
a = r"\frac{1}{1+\frac{1}{1+\frac{1}{1+x}}}"
m =re.search( r"\\frac\{.*?\}\{.*?\}", a)
m.group()
```

This match to 

```python
'\\frac{1}{1+\\frac{1}'
```

conclusion
------------

Of cource you can maybe solve this problem using more complicated RE. However, everone hates to write intricately. I think that how to solve it is only parsing strings par one letter.
Do you have any othor solusions?
インタプリタ無改造！ Lua on Windows で shebang

Perl には -Sx オプションがあって、Perl を呼び出したバッチファイルそのものを、Perl スクリプトと一体化させることができました。

標準の Lua には、そういうオプションはありませんが、ちょっとした工夫で同等のものができました。

```lua
::rem:: --[[
@lua "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
]]--

print(string.format("[%s]",arg[1]))
-- vim:set ft=lua:
```

* -S (PATHを検索する) のかわりに "%~f0" を使って、CMD.EXE にバッチファイルのフルパスに置換してもらう。
* -x (バッチコマンド行を読み飛ばす)のかわりに rem と --[[コメント文]]-- を使う。

バッチファイルのラベル構文(:ラベル)と、Lua のラベル構文(::ラベル::)が似ていたのがラッキーでした。ただ、このやり方は Windows の CMD.EXE の機能に依存しているので、OS/2 や DOS では動きません。

Windows には拡張子とアプリケーションの関連付け機能があるので、別段、バッチファイルにスクリプトを組み込めてもそれほど嬉しくはありません。ですが、関連付けを予めしておかなくても済むので、static link で作成した lua.exe(あるいは NYAOS.EXE)とバッチファイル二つだけを持ち歩けばどこでも動かせるというのは、それなりに便利かと思います。

Lua 5.1 の場合
=============

ラベル構文は Lua 5.2 から導入された文法なので、Lua 5.1 の場合は：

```
rem = [[
@lua "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
]]
```

で逃げる形になります。１行目がエコーされてしまうので、ややみっともない点は否めませんが。
英語のコメントや issue で頻出する略語の意味 (FYI, AFAIK, ...)

コメント／編集リクエスト歓迎します。載っていない語があればぜひ追加してください。

|略語|元の語|意味|
|---|---|---|
|AFAICT|As far as I can tell|分かる限りでは○○|
|AFAIK|As far as I know|知る限りでは○○|
|AKA, aka, a.k.a.|Also known as|○○としても知られる|
|ASAP|As soon as possible|できる限り早く|
|BTW|By the way|ところで|
|c.f., cf.|ラテン語 confer / 英語 compare|○○を参照|
|e.g., E.g.|ラテン語 exempli gratia / 英語 for example|たとえば|
|ETA|Estimated time of arrival|（作業の）完了予定時刻　（用例は[コメントを参照](http://qiita.com/items/86c3a09d17792ab62dfe#comment-54f3d7872ba953941e7d)）|
|FTW|For the win|〔何か良い案を挙げて〕これで決まり；これでよし|
|FWIW|For what it's worth|役に立つかどうかは分からないが|
|FYA|For your action|要対応；要返信|
|FYI|For your information|参考；ご参考までに|
|HTH|Happy to help|（用例は[コメントを参照](http://qiita.com/items/86c3a09d17792ab62dfe#comment-54f3d7872ba953941e7d)）|
|idk, IDK|I don't know|知らない；分からない|
|i.e., I.e.|ラテン語 id est / 英語 that is|すなわち|
|IIRC|If I remember [recall] correctly|記憶が正しければ○○|
|IIUC|If I understand correctly|〔相手の発言を受けて〕私の理解が正しければ|
|IMO, IMHO|In my (humble) opinion|〔ていねいに〕○○だと思います|
|LGTM|Looks good to me|〔提案に対して〕いいと思う；問題ないと思う；〔コードレビュアーが、問題ないコードに対して〕レビュー終了；（コードの）承認|
|LOL, lol|Laugh out loud| 〔くだけて〕www；（笑）|
|NA, N/A|Not applicable; not available|〔表などで、項目の組み合わせが無効な欄に記載して〕該当なし；〔表などで、まだ値がない欄に記載して〕該当値なし|
|NB, N.B.|ラテン語 nota bene / 英語 note well|〔通例コメントの先頭で〕特に注意せよ|
|NP, np|No problem|〔依頼・謝罪などに対してくだけて〕（問題ないから）気にしないで；大丈夫〔感謝に対してくだけて〕どういたしまして|
|OTOH|On the other hand|もう一方では、これに反して|
|PTAL|Please take another look|〔再レビューの要求などで〕再度ご確認ください|
|PR|Pull request|プルリクエスト|
|RFC|Request for comments|〔おもに issue のタグとして〕意見募集|
|ROFL, rofl|Rolling on the floor laughing|〔くだけて〕www；（笑）|
|RTFM|Read the fucking manual|〔乱暴に〕マニュアルを読め|
|TBA|To be advised|あとで連絡する|
|TBA|To be announced|あとで発表する|
|TBD|To be determined|あとで決める|
|TBW|To be written|あとで書く|
|TLDR, tldr, TL;DR, tl;dr, TL/DR, tl/dr|Too long, didn't read|長すぎるので読んでいない；（長い文を読みたくない人向けの）要約|
|UTSL|Use the source, Luke|〔くだけて〕ソースを読め（スター・ウォーズのセリフとかけた言葉遊び）|
|w/|with|（with の省略形）|
|w/o|without|（without の省略形）|
|WIP|Work in progress|作業中|
|wrt, w.r.t., WRT|With regard [respect, reference] to|〜に関して言えば|
|WTF, wtf|What the fuck|〔想定外の事・ものにくだけて〕なんてこった；どうすりゃいいんだ；マジかよ|
|XD|顔文字：90度右に回すと、目をつぶって大きく口を開けた笑顔に見える|〔くだけたコメントで〕(≧▽≦)|

# おまけ

ソフトウェアのバージョン：

|略語|元の語|意味|
|---|---|---|
|LTS|Long-term Support|長期サポート対象版|
|GA|General availability|一般向け提供；正式リリース版|
|GM|Golden master|（CD プレスの）原盤；正式リリース版|
|RTM|Ready to manufacturing|量産可能；正式リリース版|
|RC|Release candidate|リリース候補版|
|ES|Engineering Sample|機能評価版|

慣用表現：

|語|直訳|意味|
|---|---|---|
|Bikeshed, Bikeshedding|自転車置き場|重要でない議論に時間を取られること（家のペンキを塗り終える前に自転車置き場を何色で塗るか揉めることから）|
|Yak shaving|ヤクの毛刈り|ある大きな問題を解決するために、 一見無関係な小さい問題をいくつも片付けること。転じて、大きな問題を解決するつもりが、一見関係しているように見えて実は無用な小さい問題に気を取られること（長く固いヤクの毛を刈ってウールにするには多くの下準備が必要なことから）|

略語関連サイト：

- [Abbreviations.com - Computing Abbreviations](http://www.abbreviations.com/category/COMPUTING)
- [Acronym Finder](http://www.acronymfinder.com)
第11回オフラインリアルタイムどう書くの参考問題。C99による実装例。

オフラインリアルタイムどう書く
http://atnd.org/events/38770
の参考問題
http://nabetani.sakura.ne.jp/hena/ord11arithseq/
の実装例を C99 で用意しました。
他の言語などの解答例は
http://qiita.com/items/c206fbc645c255cb7de6
から辿れます。

で。

```c:solver.c
// compiled with "clang -std=c99 -Wall solver.c"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int char_to_num( char c )
{
  char s[] = { c, 0 };
  return strtol( s, NULL, 36 );
}

void solve( char const * src, char * r )
{
  int k[36*36]={0}; // Hash looks better unless C
  int m=0;
  for( char const * a = src ; a[0] && a[1] ; ++a ){
    for( char const * b = a+1 ; b[0] ; ++b ){
      int nb=char_to_num(*b);
      int na=char_to_num(*a );
      int d = (nb-na)*36;
      int newval = k[nb+d]=k[na+d]+1;
      if ( m<newval ){
        m=newval;
      }
    }
  }
  sprintf( r, "%d", m+1 );
}

void test( char const * src, char const * expected )
{
  char actual[10]={0};
  solve( src, actual );
  _Bool ok = 0==strcmp( actual, expected );
  printf( "%s %s -> %s ( %s )\n",
    ok ? "ok" : "***NG***", 
    src, actual, expected );
}

int main()
{
/*0*/ test( "12345abcz", "5" );
/*1*/ test( "012abku", "4" );
  return 0;
}
```

出題した時点で書いていたものは三重ループだったんだけど、二重ループで書けることに気がついたので、それを C99 で書いてみた。

C でなければ先に整数の配列に変換してから作業するんだけど、バッファの確保が面倒だったので毎回変換している。

書いてみてから気づいたんだけど、すごく手続き型脳である。もう少し関数型脳になりたいものであるよ（詠嘆）。
OSのバージョンとか調べるには uname -a


さくらVPSで確認

```
# uname -a
Linux www13140ui.sakura.ne.jp 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
```
Macのシステムフォルダを英語にする方法

Mac のシステムフォルダが「デスクトップ」とか「ダウンロード」と表示されるのが嫌なので。

```Mac:コマンド
$ cd /System/Library/CoreServices/SystemFolderLocalizations/Japanese.lproj
$ sudo mv SystemFolderLocalizations.strings SystemFolderLocalizations.strings.disable
$ sudo cp ../en.lproj/SystemFolderLocalizations.strings .
```

１．日本語ローカライズファイルがあるディレクトリに移動する
２．日本語ローカライズファイルのファイル名を変更し有効にならないようにする
３．英語ローカライズファイルをコピーしてくる

＃要するに日本語ローカライズファイルを英語ローカライズファイルに置き換える
Ubuntu 13.04 での Vimコンパイル

時間があったのでコンパイルしました。Vim 7.3.967です。
ほとんど http://vim-jp.org/docs/build_linux.html の通りでよかったのですが、一点だけ。

よーしパパpython拡張つかっちゃうぞーって感じで、

```bash
./configure --with-features=huge --enable-pythoninterp --enable-fail-if-missing
```

とすると

```bash:
checking Python version... 2.7
checking Python is 2.2 or better... yep
checking Python's install prefix... /usr
checking Python's execution prefix... /usr
checking Python's configuration directory... 
can't find it!
configure: error: could not configure python
```

となってしまいます。
たぶんubuntu側が設定変えたんですかね？

ubuntuのpython設定ディレクトリは、普通にaptで入れた場合/usr/lib/python2.7/config-i386-linux-gnuにあるようなので、

```bash:
./configure --with-features=huge --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-i386-linux-gnu --enable-fail-if-missing
```

でうまく通りました。

追記（2013/6/3）：
上記の問題はパッチ1101で修正されたようです。
https://groups.google.com/forum/?hl=ja&fromgroups#!topic/vim_dev/zghHy2bWK1o

PS
パッチ1101とかvimこわい
ランダムなデータセットを生成するジェネレーター


```javascript:モジュール
if (!Function.prototype.partial){
    (function(){
    var slice = Array.prototype.slice;
     
    Function.prototype.partial = function(){
        var target = this;
        var args = slice.call(arguments);
         
        return function(){
        var allArgs = args;
        if (arguments.length > 0){
            allArgs = args.concat(slice.call(arguments));
        }
        return target.apply(this, allArgs);
        };
    };
    }());
}

function R(s){ return Math.floor(Math.random() * s) }; 
 
function createData(obj, length){
    var data = [];
    for(var i=0; i < length; i++){
        if(typeof obj === 'function'){ data.push(obj())} 
        else{data.push(obj)};   
    }
    return data;
}
```


使用方法は以下。

```javascript:データセットの初期化
var rmdArray = function() { return R(100) };
var dataArray = createData.partial(rmdArray);

var rmdObj = function() { return {x:R(100), y:R(100)} };
var dataObj = createData.partial(rmdObj);
```

```javascript:実行
dataArray(2); //->[29,28] 
dataArray(5); //->[11,60,53,29,0] 

dataObj(3); //->[{"x":19,"y":35},{"x":30,"y":35},{"x":24,"y":52}] 
dataObj(6); //->[{"x":14,"y":72},{"x":10,"y":4},{"x":88,"y":83},{"x":35,"y":7},{"x":50,"y":16},{"x":24,"y":12}] 
```
今週のRedis 2013/05/11-2013/05/18

redisのunstableブランチの変更を淡々とメモします。

5947f170f..78167807be

今週は、config rewriteコマンドができたのと、それに伴い、設定周りのコードのリファクタリング祭りのもよう。

config rewriteは、今動作している設定で設定ファイルを上書きしてくれる。onlineで設定変更したけど、設定ファイルに反映してないわー、とかそういうのをし忘れにくくのが目的なのかな。

試しにやってみたところ、コメントとして書いた行とかはちゃんとそのまま保存してくれるっぽい。

設定のバックアップをしてくれないのがちょっと怖いな
monkeyrunnerで画像比較


練習を兼ねて投稿。
Androidのmonkeyrunnerで画像比較するサンプル。

```python:qiita.py

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
#device.installPackage('myproject/bin/MyApplication.apk')

# sets a variable with the package's internal name
#package = 'com.example.android.myapplication'

# sets a variable with the name of an Activity in the package
#activity = 'com.example.android.myapplication.MainActivity'

# sets the name of the component to start
#runComponent = package + '/' + activity

# Runs the component
#device.startActivity(component=runComponent)

# Presses the Menu button
#device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

ref = MonkeyRunner.loadImageFromFile('shot1.png', 'png')


while 1:
	# Takes a screenshot
	result = device.takeSnapshot()

	# Writes the screenshot to a file
	#result.writeToFile('shot2.png','png')

	if result.sameAs(ref, 0.99):
		print "OK"
		break
	else:
		print "NG"
Yeoman（ヨーマン）


Yeoman（ヨーマン）とは
-
ツールやライブラリを迅速で華麗にビルドし、Web環境を構築するワークフローツールです。

インストール
-
```bash
$ curl -L get.yeoman.io | bash
```

インストールするためには以下のモジュールが必要となります。

 - Homebrew
 - Command Line Tools for Xcode
 - Compass
 - Git
 - JPEGTran
 - NodeJS
 - npm
 - OptiPNG
 - PhantomJS
 - Ruby
 - RubyGems


プロジェクトファイルの作成
-
```bash
$ yeoman init
```

サーバ起動
-
```bash
$ yeoman server
```
homebrew


homebrewとは
-
パッケージ管理ツール

インストール
-
```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

インストールしたパッケージ一覧
-
```bash
$ brew list
```

パッケージのインストール
-
```bash
$ brew installl [パッケージ名]
```
auto-install.el


elispをダウンロードしてインストールする。
ダウンロード->バイトコンパイルまでしてくれる。
~/.emacs.d/elisp/へ格納するのがベター。

コマンド
-
```emacs
M-x install-elisp RET
[ElispのURL]
C-c C-c -> ダウンロード完了後に実行することでインストールする
```
package.el


Emacs24から標準で搭載されるパッケージ管理。
Emacs23へもインストールすることが可能
ELPA(Emacs Lisp Package Archive) or Marmaladeからダウンロードしてインストールする。
基本的にinit.elにインストールしたパッケージの設定を追加する必要がない。

パッケージ一覧の表示
-
```emacs
M-x list-packages
```

パッケージ一覧上でのコマンド
-
```emacs
i -> インストール候補としてマーク
u -> 現在行のマークを外す
d -> 削除候補としてマーク
x -> マークしたパッケージをインストール／削除する
q -> 一覧を閉じる
```

インストールしたパッケージの適用
-
```emacs
M-x pakage-initialize
```
anything.el


統一されたUI提供してくれる。
anything本体とプラグインを同時にインストールするためには、auto-installを使用してインストールします。（package.elではプラグインも含めてインストールできない）

install
-
```emacs
M-x auto-install-batch RET
anything RET
```

init.elへ以下の１行を追加すればフル装備のanything.elが使用できます。

```emacs
(require 'anything-startup)
```


おすすめプラグイン

 - anything-c-moccur -> 検索結果をリアルタイムで一覧表示
 - anything-show-kill-ring ->キリングの履歴からペースト
Rinari


Railsに特化したEmacsのプラグイン。

インストール
-
```emacs
package-install RET
rinari RET
```

ナビゲーションコマンド
-
```emacs
C-c ; f c  -> app/controller/の一覧表示 C-c ; f m  -> app/models/の一覧表示
C-c ; f v  -> app/views/の一覧表示
C-c ; f j  -> public/javascript/の一覧表示
C-c ; f e  -> config/enviroment/の一覧表示
```

Railsツールコマンド
-
```emacs
C-c ; r  -> Rakeタスクを実行
C-c ; c  -> script/consoleを実行
C-c ; q  -> データベースをブラウズ
C-c ; t  -> 現在行にある関数のテストを実行
```
Emacsでshellの実行


ミニバッファにシェルの実行結果を表示
-
```emacs
M-! RET [Shell Command] RET
```

カレントバッファにシェルの実行結果を表示
-
```emacs
C-u M-! RET [Shell Command] RET
```

カレントバッファの内容を標準入力として利用する
-
```emacs
M-| RET [Shell-Command] RET
```
※リージョンの範囲に対して実行される
RailsでRspecを使用する


インストール
-
Gemfileに以下を追記して'bundle install'する

```Gemfile
group :development do
  gem 'rspec-rails'
end

group :test do
  gem 'rspec','2.5.0'
end
```

以下のコマンドでRspecに必要なディレクトリを作成

```bash
$ rails g rspec:install
```

以下のコマンドでRspecのコードを生成する

```bash
$ rails g rspec:controller [Controller_name]
$ rails g rspec:model [Model_Name]
```

以下のコマンドでRspecを実行する

```bash
$ rake rspec
```
bundle installでエラー


```エラー内容
Could not load OpenSSL.
You must recompile Ruby with OpenSSL support or change the sources in your Gemfile from 'https' to 'http'.
Instructions for compiling with OpenSSL using RVM are available at rvm.io/packages/openssl.
```

Gemfileを以下のとおり変更。（https->http）

```Gemfile
source 'https://rubygems.org' ->  source 'http://rubygems.org'
```
egg


Emacsからgitを操作するプラグイン

インストール
-
```emacs
M-x install-elisp RET https://raw.github.com/byplayer/egg/master/egg.el RET
M-x install-elisp RET https://raw.github.com/byplayer/egg/master/egg-grep.el RET
```

ショートカット
-
```emacs
C-x v s  -> git status
C-x v l  -> ログビューア
```

ステータス表示上での操作
-
```
s  -> ステージ／アンステージの切替
c  -> コミットログのメッセージ入力に切替
C-c C-c  -> コミット実行
C-c C-k  -> コミットせずに終了
```
DB不要のRailsアプリの作り方


## config/application.rbの編集
```ruby
#require 'rails/all'		#->コメントアウト
require "action_controller/railtie" #->追加
require "action_mailer/railtie"		#->追加
require "active_resource/railtie"	#->追加
require "rails/test_unit/railtie"	#->追加
require "sprockets/railtie"			#->追加
```
chefの使い方


## chefののインストール
```
curl -L http://www.opscode.com/chef/install.sh | sudo bash
```
or

```
gem install chef
```

## knifeの設定
```
knife configure
```
(*)"~/.chef/knife.rb"に保存される

## cookbookの作成
```
$ knife cookbook create hello -o cookbooks
```
```出力結果
** Creating cookbook hello
** Creating README for cookbook: hello
** Creating CHANGELOG for cookbook: hello
** Creating metadata for cookbook: hello
```

## レシピの修正
```
$ emacs cookbooks/hello/recipes/default.rb
```

## chef-soloの設定
```
$ emacs ./localhost.json
```
```
$ emacs ./solo.rb
```

## chef-soloの実行
```
$ sudo chef-solo -c solo.rb -j ./localhost.json
```

## chef-soloの内容
1. レシピを作って
2. jsonファイルで実行するレシピを指定して
3. chef-soloコマンドでそれを実行する

## zshのインストール
```recipes/dafult.rb
package "zsh" do
	action :install
end
```

## template
erbで記述されたnginx等の設定ファイル
変数を埋め込むことができる
templates/default/*.*.erb

## attribute
templateに埋め込んだ変数の値を定義する
./localhost.json

## vagrantのportの設定
デフォルトの場合、iptablesが有効になっているため、80番ポートを含むほとんどの外部ポートにlocalhost以外からアクセスできない。
そのため、"/etc/init.d/iptables stop"でiptablesごと止めれば良い。但し、本番では絶対にダメ！！
以下、chefでの設定

```dafault.rb
service 'iptables' do
	action [:disable, :stop]
end
```

## vagrantのネットワーク設定
```Vagrantfile
config.vm.network :hostonly, "192.168.50.12"
```
ホストOSからゲストOSへネットワークアクセス機能をアクティブ化
ゲストOSのIP設定

## sahara
vagrantにsandbox機能を追加してロールバックができる

```
git clone https://github.com/ryuzee/sahara.git
cd sahara
bundle install
bundle exec rake build
vagrant plugin install pkg/sahara-0.0.14.gem
```

## knife-solo
リモートにrsyncで転送した後、chef-soloを実行してくれる。
(*)sshでログインする必要がなくなる

```
$ gem install knife-solo
``` 

## chefのリポジトリ作成
```
$ knife solo init <リポ名>
```

## berkshelf
chefのRubygems的存在
windowsのパッケージ管理chocolateyを使ってmongodbを入れる

いちいち、インストーラーでソフトウェアをインストールするのはめんどくさい。
Macのbrewみたいのがwindowsでないか調べてみた。
そしたら、chocolateyというものが見つかったのでこれを使ってみる。

##[chocolatey](https://chocolatey.org/)
[https://github.com/chocolatey/chocolatey](https://github.com/chocolatey/chocolatey)
[https://github.com/chocolatey/chocolatey/wiki/Installation](https://github.com/chocolatey/chocolatey/wiki/Installation)

##インストール手順

###Command Line(コマンドプロンプト)
コマンドプロンプトでchocolateyをインストールする。

```bash
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('http://bit.ly/psChocInstall'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

###WindowsPowerShell
WindowsPowerShellでchocolateyを使いmonogodbをインストールする。

```bash
cinst mongodb
```

[https://chocolatey.org/packages](https://chocolatey.org/packages)
ここでインストールできるパッケージを調べることができる。

簡単！
Citation memo


```sample.html
<div itemscope itemtype="http://schema.org/ScholarlyArticle">
<span itemprop="hasCitation" itemscope itemtype="http://schema.org/ScholarlyArticle">
In each of the successively more derived clades Ornithodira, Dinosauria, and Saurischia, the primitive state was an increasingly long neck 
  <ul id="references">
    <li itemprop="citation" itemscope itemtype="http://schema.org/ScholarlyArticle" id="ref-1">
      <span itemprop="author" itemscope itemtype="http://schema.org/Person">
        <span itemprop="familyName">Sereno</span> <span itemprop="givenName">PD</span>
      </span> 
      (<span itemprop="datePublished">1991</span>)
      <cite itemprop="name"><a itemprop="url" href="http://dx.doi.org/10.2307/3889336">Basal archosaurs: phylogenetic relationships and functional implications</a></cite>
      <span>
        <cite class="source">Society of Vertebrate Paleontology Memoir</cite> <span class="volume">2</span>:<span class="fpage">1</span>
      </span>
    </li>
  </ul>
</span>
</div>
```
![graph](http://gyazo.com/ea996ca2d99598d0107e7a2f5955d479.png)
パスワードのストレッチング処理に抵抗を感じる理由

# ストレッチング処理とは？
`ハッシュ化された文字列に対して更にハッシュ化の処理を行う` * n
を行う処理

`ハッシュ化されたパスワード` (と `利用したソルト`) が悪意のある第三者に渡った場合でも、解析までの時間を稼ぐ事ができる

## パスワードをハッシュ化して保存する処理 に対する個人的な感想
+ ソルト処理 (パスワードに適当な文字列を付加してからハッシュ化)
    + やらなきゃだめだよね！
+ ストレッチング (ハッシュ化された文字列をハッシュ化 * n)
    + やりたくねぇぇぇ

## 以下は個人的な感想です(´・ω・｀)
ストレッチングが手軽で有効なのはわかるんだけど・・・という気持ちをまとめてみました。

### 抵抗を感じる理由

#### 高速に動作する処理を複数回実行して低速に！

もともと、プログラムを書いていて、「ハッシュを使いたい！」と思う場面では、「高速」であるからハッシュを使っている、ということが多い。

+ データ比較処理の高速化 (自分の感覚ではログインなどの認証もここに入る)
+ 検索の高速化 (ハッシュテーブルにキーを入れてデータを引っ張りたい的な)
+ (リアルタイムで)改竄の検出

など。
なので、

+ 高速に動作するから利用している処理

を複数回実行することで

+ 低速になってしまう！

というところに抵抗を感じます。

#### ストレッチの回数に対して線形でしか解析時間が伸びない
`肉を切らせて肉を切る`
という感じになっているんじゃないかというところも、もやもやするところです。
ハッシュの生成にかかる時間と、解析にかかる時間に大きな差があるから有効であるとはわかっているんですが。

#### 実装は手軽だけど、ストレッチングかかる負荷は長期的に見ると大きなコストがかかっているのと同じでは？
これは、実装するシステムの現在の負荷と将来の負荷によるとしかいえませんが。


# まとめ
とはいっても、総当りでやられちゃいそうなパスワードルールだったら、やらないわけにはいけないよね！
flaファイル内のフレームスクリプトを全部外部.asにするJSFL


出力パネルを使ってファイルの書き出しをする。

```FrameScript2AS.jsfl
fl.outputPanel.clear(); 
var dom = fl.getDocumentDOM();
var dir = dom.pathURI.split(dom.name).join("");
var exportDir = 'as/';
var count = 0;

parseLibrary();

fl.outputPanel.clear();
fl.outputPanel.trace('total ' + count + ' files');

function parseLibrary()
{
	var items = dom.library.items;
	var len = items.length;
	for (var i=0;i<len;i++)
	{
		var item = items[i];
		var name = item.name;
		var fileName = exportDir + name.split("/").join("-");

		if (item.symbolType == "movie clip")
			parseTimeline(fileName, item.timeline);
	}
}

function parseTimeline(name, timeline)
{
	var layers = timeline.layers;
	var len = layers.length;
	for (var i=0;i<len;i++)
		parseLayer(name, i, layers[i]);
}

function parseLayer(name, index, layer)
{
	name += ".L" + index;
	var frames = layer.frames;
	var len = frames.length;
	for (var i=0;i<len;i++)
		parseFrame(name, i, frames[i]);
}

function parseFrame(name, index, frame)
{
	var fileName = name + ".f" + (index + 1) + ".as";
	var script = frame.actionScript;
	var replaceScript = 'include "' + fileName + '";';
	if (frame.startFrame == index && !!script)
	{
		if (script == replaceScript) return; // include に差し替え済みのときは何もしない。

		fl.outputPanel.clear();
		fl.outputPanel.trace(script);
		fl.outputPanel.save(dir + fileName, false, false);
		frame.actionScript = replaceScript;
		count++;
	}
}
```
クリップボードからVimへのコピー

ブラウザー、他のプログラムからクリップボード経由でコピーするとき、特殊なキー操作を行う。

クリップボードからコピー
"+gp
クリップボードへコピー
"+y

Gvimのショートカットキーをみて、気づく。
わからないで、苦労した。
GitlabのInstall (Ubuntu)

Gitlabのインストールまとめ.備忘録的なもの.
方針としては以下のとおり.

- 使用するのはrbenv, unicorn, nginx, mysql
- Proxy環境ではない
- gitユーザーによる運用.

とりあえずそのまま打ち込んで動くように.
https://gist.github.com/setsulla/5600264