OmniAICreator/Qiita-1.07M huggingface dataset:
python-memcachedのサーバーに接続できなかった際のチェック方法

python-memcachedを使っていて、接続先のサーバーが死んでるのに処理が進んでしまっていたので、ちょっと困った。

# 原因
```python:memcache.py
    def _set(self, cmd, key, val, time, min_compress_len = 0):
        self.check_key(key)
        server, key = self._get_server(key)
        if not server:
            return 0
```
setすると、サーバーが無くても0が帰ってくる。

```python:memcache.py
    def _get(self, cmd, key):
        self.check_key(key)
        server, key = self._get_server(key)
        if not server:
            return None
```
getしてもサーバーが無くてもNoneが帰ってくる。

これだと、実際に値がsetされていないでNoneなのか、サーバーが無くてNoneなのかがわからない。

# 解決方法
これが正しい訳ではないと思うんですが、それでも判別できそうだったので、とりあえず。

```python
client = memcache.Client(['192.168.1.1:11211'])
		
if len(client.get_stats()) == 0:
	raise Exception('Kestrel server not connected.')
```

stats()関数が、各サーバーステータスをとってくるのですが、それが接続されていないととってこないようです。

寿命を短くした値をセットしてみて、0が帰ってくるかをチェックしてもいいかなと思ったのですが・・・サーバーの接続回数的にそっちの方がいいかもですね？w

なんかいい方法あったら皆様ご教授くださいませ。
Canvasに描画するとWebM動画を作ってくれる「Whammy」を使ってみた

とりあえずChromeで動かすことができたので、そのメモ

# 準備
フレームレート決めてNewする

```
var video = new Whammy.Video(15);
```

# WebMの動画に入れたいシーンの登録
勝手にCanvasに描画したものを記録するわけではなく、
プログラムで任意のタイミングで、フレームを追加する必要があります。

Canvasから取得したContextを追加

```
ctx = canvas.getContext('2d');
video.add(ctx);
```

# WebMを作成する
createObjectURLでURLを作り、このURLをVideoタグのsrcに指定すると
はい出来上がり！

```
var output = video.compile();
var url = webkitURL.createObjectURL(output);
document.getElementById('videoItem').src = url;
```

## 2017年10月　追記＊

- https://www.fxsitecompat.com/ja/docs/2017/url-createobjecturl-stream-has-been-deprecated/

ということで、createObjectURLは廃止予定だそうです。

が、2017/10/26現在　Whammyの公式のリポジトリでは、とくにこれに対応するなどの話もなさそうな気配。。。

# Jsdo.itで実際に動くサンプル
[リアルタイムでレイトレして、WebMに記録するヤツ](http://jsdo.it/kjunichi/edwO)

# Whammyのサイト

[Whammy](https://github.com/antimatter15/whammy)

# 関連記事

- [CCV.jsで動画の顔認識](http://abrakatabura.hatenablog.com/entry/2012/01/23/060000)
- [libvpx.jsでOperaやFirefoxでループ再生出来ない動画で分かったこと](http://abrakatabura.hatenablog.com/entry/2014/09/27/071740)
- [ffmpegで静止画からQuickTime Playerで再生できる動画を作る](http://abrakatabura.hatenablog.com/entry/2014/07/19/110000)
- [Windowsでデスクトップキャプチャーして動画をつくるには](http://abrakatabura.hatenablog.com/entry/2017/04/07/070355)
HomebrewでインストールしたPostgreSQLをRailsから見つける


database.yml で接続先のホストなどを指定しなかった場合、UNIX domain socket で通信しようとする。
明示的に指定しなかった場合、既定のファイルパスのうちで見つかったものに繋ぐ。

(これはバックエンドが PostgreSQL に限った話ではない)

`/var/pgsql_socket` 以下にあることを期待しているが見つからなかった場合、`/var/pgsql_socket` がなければ作ってから PostgreSQL の設定を変えて再起動すればよい。

```sh
sudo mkdir -p /var/pgsql_socket
sudo chown $(id -un):$(id -gn) /var/pgsql_socket
```

```diff
--- old.conf	2012-09-03 02:43:20.000000000 +0900
+++ now.conf	2012-09-03 02:42:45.000000000 +0900
@@ -65,7 +65,7 @@
 # Note:  Increasing max_connections costs ~400 bytes of shared memory per
 # connection slot, plus lock space (see max_locks_per_transaction).
 #superuser_reserved_connections = 3	# (change requires restart)
-#unix_socket_directory = '/var/pgsql_socket'		# (change requires restart)
+unix_socket_directory = '/var/pgsql_socket'		# (change requires restart)
 #unix_socket_group = ''			# (change requires restart)
 #unix_socket_permissions = 0777		# begin with 0 to use octal notation
 					# (change requires restart)
```
最近の買ってよかった Mac アプリ

シェアウェアに金を出し惜しみして代わりのフリーソフトを探すよりサッと金払って快適さを得たほうがいいなーというのが最近の気づき。

## [Dash](http://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12)
[![Dash](https://bitbucket.org/uasi/p/raw/master/c4/c4892e697956fe8f5abcc8eabfb291ac692fc311.png)](http://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12)

ヘルプドキュメントビューア。1700円（現在セール価格850円、制限つきフリー版もあり）。

 Xcode のヘルプがバージョンアップにつれて改悪されていく（検索がとにかく遅い、 OS X のプロジェクトからヘルプを開いても iOS の API ドキュメントが開く）ため代替として購入。検索が速くて快適。

Objective-C のドキュメント以外にも PHP や JavaScript など多種のドキュメントを閲覧できる。さらにスニペットライブラリ機能もあり、 OS の任意のテキストフィールドでスニペットが展開できるようになる（下図）。スニペット機能だけを切り出した安価な別アプリ [DashExpander](http://itunes.apple.com/jp/app/dashexpander/id458867049?mt=12) もある。

![Dash スニペット](https://bitbucket.org/uasi/p/raw/master/45/459f4216f2fbf2512c13974bf1796689bea51925.png)

## [TaskPaper](http://itunes.apple.com/jp/app/taskpaper/id424281111?mt=12)
[![TaskPaper](https://bitbucket.org/uasi/p/raw/master/80/80d67f2646ea8d52c7a72fcd531ba27afedd31ee.png)](http://itunes.apple.com/jp/app/taskpaper/id424281111?mt=12)

シンプルな  to-do リスト。2200円。

To-do 管理に特化したシンプルなアウトラインエディタと言ったほうが実体に近い。テキストエディタでプレーンテキストを編集するような感覚でリストを管理する。バレットをクリックして項目をチェック済みにしたり、項目をドラッグして並べ替えたりと、ただのエディタにはできない機能もある。

TaskPaper は、アイディアを思うままに書き連ねる1次バッファとして使っている。量が溜まったら分割・整理し改めて別のタスク管理ツールに記録する。

## [Due](http://itunes.apple.com/jp/app/due/id524373870?mt=12)
[![Due](https://bitbucket.org/uasi/p/raw/master/c7/c7074983f1112f5e25aaa31a13838c32f17ed7b7.png)](http://itunes.apple.com/jp/app/due/id524373870?mt=12)

ツールバーに常駐するリマインダー。800円。

項目に含まれる日時から自動で期日をセットしてくれるため、ピッカーで日付を選ぶ手間がない。「○○さんと会う 9/13 17:00」や「××に行く tomorrow」など。日本語に対応していないのがマイナス。

## [Pomodorable](http://itunes.apple.com/jp/app/pomodorable/id503406673?mt=12)
[![Pomodorable](https://bitbucket.org/uasi/p/raw/master/0e/0eff6a5e9a88dda8703a94b9aefa428e6e88f28c.png)](http://itunes.apple.com/jp/app/pomodorable/id503406673?mt=12)

ツールバーに常駐する pomodoro タイマー。900円（現在セール価格450円）。

青いトマトが徐々に熟していくアニメーションタイマーが小気味良い。

## 他に気になるアプリ
- [Things](http://itunes.apple.com/jp/app/things/id407951449?mt=12)。高機能なタスク管理ツール。4300円。
- [1Password](http://itunes.apple.com/jp/app/1password/id443987910?mt=12)。パスワードマネージャ。4300円。

他に便利なアプリがあればコメントで教えていただけるとありがたいです。
自由度の高いネスト環境を newenvironment で作る

Beamer で、block 環境 + itemize 環境のネストとかが激しいことになってやってられなくなったので、block 環境 + (他の環境) という新しい環境を作りたくなった。やりたいことのイメージはこんな感じ:

```tex:expected-custom-environment.tex
\begin{bblock}{itemize}
\item block 環境の下に itemize 環境をネストしたのと同じ
\end{bblock}
```

ただでさえ frame 環境やら column 環境やら入り乱れてるので、ネストは一段でも浅くしたいところ。書いてるものがスライドなだけに、途中で気が変わって itemize だった所を enumerate にしたくなったりするし、こう書ければかなりの労力削減が見込める（ホンマか）。

\# ちなみに block 環境のタイトルをいつも設定し忘れちゃうんだけど、困ったことに `\begin{block} hoge \end{block}` みたいなのを渡すと platex 先生はスタックが足りないヨ！って怒ってくる。意味が分からない。オプションにして省略時は空ってしてくれればいいのに。

しかし、普通に `\newenvironment` しようとしてもこれは上手く行かない。

```tex:bad-newenvironment.tex
\newenvironment{bblock}[2][]%
{ \pause \begin{block}{#1} \begin{#2} }
{ \end{#2} \end{block} }
```

実は、引数を使えるのは BEGIN 側のみで END 側では引数を使えないらしい。ということで、どうしても END 側で引数を使いたい場合、無理やり変数に突っ込んで退避させとくという割と無理やりな回避策が。

```tex:custom-nested-environment.tex
\makeatletter
\newenvironment{bblock}[2][]%
{\def\@bblocktmp{#2}%
 \pause \begin{block}{#1} \begin{\@bblocktmp} }
{ \end{\@bblocktmp} \end{block} }
\makeatother 
```

```tex:use-custom-nested-environment.tex
\begin{frame}
\begin{bblock}[タイトルでっせ]{itemize}
\item どうでもいいですが pause コマンドも入れてるのはタダの好みなので
\item いらなきゃ消してください
\item 0は自然数
\end{bblock}

\begin{bblock}{enumerate}
\item タイトルの部分を書き忘れても怒られない！大勝利！
\end{bblock}
\end{frame}
```

あまり綺麗じゃないけどとりあえずこれで妥協…… あとこれで文書が論理的に綺麗になるかというとそれも微妙なので、bblock は補助にしてそれを使って更に \newenvironment{theorem} みたいなことしてくといいかも？

精進精進〜
Groovyで日本語プログラミングするときの注意点

日本語でクラス名を定義したりする場合、クラス名の先頭を英大字にしないとコンパイルが通らないことがあります。

```groovy:nihongo_daijobu.groovy
class 俺のクラス{
  public 俺のクラス(){
  }
  public boolean 俺のメソッド(俺のクラス 俺の引数){
    return false
  }
}
def 俺のインスタンス = new 俺のクラス()
```

上記のコードは通ります。
しかし、下記のコードは通りません。

```groovy:nihongo_daijobanai.groovy
class 俺のクラス{
  public 俺のクラス(){
  }
  
  public boolean 俺のメソッド(俺のクラス 俺の引数){
    return false
  }
}
俺のクラス 俺のインスタンス = new 俺のクラス()
```

色々ためしてみると、どうやら引数以外のところで「俺のクラス」を型として用いるとダメみたいです。

こんなの調べて何の役に立つのやら。
セルをドラッグして状態のON/OFFを切替


UITableViewCellの派生クラスに以下のコードを記述します。
ドラッグの検出はUIPanGestureRecognizerを利用しています。

```Objective-C:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
		// ドラッグジェスチャー
		UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
		[self addGestureRecognizer:pan];
    }
    return self;
}
```

```Objective-C:
// ドラッグジェスチャー処理
- (void)panGesture:(UIPanGestureRecognizer *)sender {
	// ドラッグ開始
    if (sender.state == UIGestureRecognizerStateBegan) {
        _startPt = [sender locationInView:self];
	}
	// ドラッグ移動
	if (sender.state == UIGestureRecognizerStateChanged) {
		CGPoint pt = [sender locationInView:self];
		self.contentView.center = CGPointMake(self.frame.size.width / 2 - (_startPt.x - pt.x), self.contentView.center.y);
	}
	// ドラッグ移動 or ドラッグ終了
	if (sender.state == UIGestureRecognizerStateChanged ||
		sender.state == UIGestureRecognizerStateEnded) {
		
		// ドラッグ移動量 閾値判定
		BOOL changing = (fabs(self.frame.origin.x - self.contentView.frame.origin.x) > 100);
		
		[UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveEaseOut
						 animations:^{
							 // セル位置を元に戻す
							 if (sender.state == UIGestureRecognizerStateEnded) {
								 self.contentView.center = CGPointMake(self.frame.size.width / 2, self.contentView.center.y);
							 }
							 if (changing) {
								 // セル色変更
								 if (! self.task.done) {
									 self.backgroundColor = [UIColor grayColor];
								 } else {
									 self.backgroundColor = [UIColor clearColor];
								 }
								 // 状態を反転
								 if (sender.state == UIGestureRecognizerStateEnded) {
									 self.task.done = ! self.task.done;
								 }
							 } else {
								 // セル色変更
								 if (sender.state == UIGestureRecognizerStateChanged) {
									 if (! self.task.done) {
										 self.backgroundColor = [UIColor clearColor];
									 } else {
										 self.backgroundColor = [UIColor grayColor];
									 }
								 }
							 }
						 } completion:^(BOOL finished) {
						 }];
	}
}
```
python でモック - mox の使い方

# まだ作ってないクラスのモックを作りたい

とりあえず制御側を作りたいときにモデル作成を後回しにできます。

```python:test_login.py
import unittest

class TestLoginMethod(unittest.TestCase)

    def test_login_returns_true(self):
        m = mox.Mox()
        user = m.CreateMockAnything() # 将来作るUserモデルクラスのつもり
        user.account().AndReturn("norobust") # アカウント名をとりあえず返す
        l = Login() # これから開発するLoginクラス
        l.user = user # Login クラス内から参照できるようモックを渡す

        m.ReplayAll() # mox 始動！
        self.assertTrue(l.login()) # ログインテスト！
        m.VerifyAll() # mox 結果チェック！
```

mox で VerifyAll することで、セットアップしたメソッド（ここではuser.account())が呼ばれたかどうかをチェックします。

# すでに存在するクラスのモックを作りたい

上のテストが終わって、Userクラスが出来上がったなら、CreateMockAnything をやめて、
m.CreateMock(User) にするだけです。

# メソッドを置き換えてダミーのデータ（モック）を渡したい

上の場合、```l.user = user``` という具合ですが、実際には Login.login() 内部で ```self.user = get_user_by_id(1)``` みたいなことを書いてユーザモデルを得ることになるかと思います。get_user_by_id が本当にコールされてしまうと、作った User モックを渡せません。この場合は、Login クラスのモックを作るのではなく、get_user_by_id() のみをスタブ化すればOKです。

```python:test_login.py
import unittest

class TestLoginMethod(unittest.TestCase)

    def test_login_returns_true(self):
        m = mox.Mox()
        user = m.CreateMockAnything() # Userモデルまだ作ってない・・・
        user.account().AndReturn("norobust") # アカウント名をとりあえず返す
        l = Login() # これから開発するLoginクラス
        m.StubOutWithMock(Login, 'get_user_by_id') # スタブ化
        Login.get_user_by_id().AndReturn(user) # スタブ化した関数の戻り値をセット

        m.ReplayAll() # mox 始動！
        self.assertTrue(l.login()) # ログインテスト！
        m.VerifyAll() # mox 結果チェック！
```

# 注意すること

* CreateMockAnything は、__存在しないクラスのモック__を作る。よって AndReturn などで戻り値を偽装するメソッドも存在しない
* CreateMock は、__存在するクラスのモック__を作る。よって、クラスも偽装するメソッドも実際にコードを書いてからモックにする
* StubOutWithMock も存在するクラスとメソッドでないとスタブ化できない
* 偽装したメソッドは、実装コードの中でコールされないと VerifyAll でエラーになる

# まとめ

1. CreateMockAnything は、コードの書き始めなど、おおまかな実装コードを書くのに向いてます
2. CreateMockAnything が嫌になってくるので、CreateMock によるテストを追加します
3. CreateMock だと実際にクラスを書く必要があるので、必要なクラスを書きます
4. さらに細かく実装を積み重ねるべく StubOutWithMock して完成を目指す
5. 気がついたら完成している(￣ー￣)ﾆﾔﾘ
guavaライブラリのLists.transformを使う際の注意点

## Lists.transformとは

Lists.transformは便利なメソッドです。
あるリストの各要素を変換して別のリストを生成したい時に使えます。
関数型言語界隈だとよくmapという名前で定義されているやつです。

例えば、

```java:サンプル
		List<Integer> nums = Lists.newArrayList(1,2,3);
		List<String> stringNums = Lists.transform(nums, new Function<Integer, String>() {
			@Override
			public String apply(@Nullable Integer arg0) {
				return String.valueOf(arg0);
			}
		});
```

とすると、numsの各要素にtransformの第2引数で渡した関数(以下、「変換関数」と呼ぶ)を適用した結果のリストを返してくれます。

## 変換関数は遅延評価される

このメソッドは色々な所で使い所があるのですが、使用する上で１つ注意する必要がある事があります。
それは、transformの結果返ってくるリストは、内部的にはTransformingRandomAccessList<F, T>かTransformingSequentialList<F, T>というものが返ってきています。
これらのリストは、その中の要素を取得する際に変換関数を適用するように実装されています。

つまり、先のサンプル中のstringNumsのイテレータを回したり、getメソッドを呼ぶと、そのたびに変換関数が元のリストの要素に対して適用されて、変換後の値が返されています。

なので、変換関数が非常に軽い処理しかしていなかったり、変換関数のコストが高くても一度しかその中の値を使わないのであれば、問題が起きることはありませんが

* 変換関数で行なっている処理が重い(重い計算をする、DBアクセスする、通信が発生する等)
* transformの結果返ってくるリストを何度もイテレータを回す
* 変換後のリストに対してcontainsやhashCodeのようなを内部的に要素を舐めるようなメソッド実行する

という場合は、transformが返すリストをそのまま使いまわすのはコストの観点からよろしくありません。

## 対処法

実は、transformのjavadocにもそのことはちゃんと書いてあります。

> The function is applied lazily, invoked when needed. This is necessary
 for the returned list to be a view, but it means that the function will be
 applied many times for bulk operations like {@link List#contains} and
 {@link List#hashCode}. For this to perform well, {@code function} should be
 fast. To avoid lazy evaluation when the returned list doesn't need to be a
 view, copy the returned list into a new list of your choosing.

つまり、変換関数は軽い処理をするべきだが、もし遅延評価が嫌なのであれば、transformが返すリストをコピーして使うべしという事です。

## なぜこのような実装になっているのか

javadocを読むと、

> Returns a list that applies {@code function} to each element of {@code
fromList}. The returned list is a transformed view of {@code fromList};
changes to {@code fromList} will be reflected in the returned list and vice
versa.

とあります。
このメソッド自体が変換後のリストを返すのではなく、変換されたリストに見えるもの(transformed view)を返すためのメソッドだということですね。
その証拠に変換元のリストに何か変更を加えたら、変換後のメソッドにもちゃんと反映されると。

```java:サンプル
		List<Integer> nums = Lists.newArrayList(1,2,3);
		List<String> stringNums = Lists.transform(nums, new Function<Integer, String>() {
			@Override
			public String apply(@Nullable Integer arg0) {
				return String.valueOf(arg0);
			}
		});
		nums.add(100);
		assertTrue(stringNums.contains("100")); // transformの後にaddした要素もちゃんと変換されている！！
```

## 結論

javadoc読め。
自由な２次元配列オブジェクト

範囲自由な２次元配列オブジェクトというのを作ってみました。

```objc:DimArrayTest.m
DimArray *matrix = [DimArray array];
[matrix setIntValue:3 X:10 Y:5];
[matrix setIntValue:5 X:8 Y:3];
[matrix setIntValue:4 X:5 Y:8];
[matrix setIntValue:2 X:3 Y:8];
```
のように使えます。入れた値の最大行(maxY)と列(maxX)が記録されています。
入れた値は
int e83 = [matrix intX:8 Y:3];
int e22 = [matrix intX:2 Y:2];
で取り出します。ここでe22は０となります。随時改良していきたいです。

DimArray
https://github.com/KatagiriSo/DimArray
TimingLoggerで処理間隔をログで出力する

TimingLoggerというクラスがあります。
処理間隔をわかりやすくログ出力できます。
詳細：http://yuki312.blogspot.jp/2012/09/androidtiminglogger.html

```java
TimingLogger timings = new TimingLogger("tag", "method");
// work a
timings.addSplit("work a");
// work b
timings.addSplit("work b");
// work c
timings.addSplit("work c");
timings.dumpToLog();
```

```txt
D/tag     ( 3459): method: begin
D/tag     ( 3315): method:      5 ms, work a
D/tag     ( 3315): method:      3 ms, work b
D/tag     ( 3315): method:      12 ms, work c
D/tag     ( 3315): method: end, 20 ms
```
redisにレプリケーションを設定する

ここまでのあらすじはここを読む。 「node-redisを入れてみるメモ( http://qiita.com/items/63de388bf40cff40a096 )」

#Redisレプリケーションの特徴

Redisレプリケーションの一般的な情報についてはここを読む。http://redis.shibu.jp/admin/replication.html
レプリケーションについてはここを読む。http://goo.gl/1tA00

ってことで（ぉぉ、上記の「ここを読む」文はまるでrequire文のようだっ！）、

#redis.confファイルの設定をいじる

redis.confファイルにちょっと書くだけでスレーブを追加できます。
apt-getで入れたのでredis.confファイルは以下にあります。

```
/etc/redis/redis.conf
```

他の入れ方すると違う場所にあったりredis-server起動時にパス指定したりするので、それらの方法に従った場所のredis.confを開きます。

#ここを書き換える

```
################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.

　(略)

# slaveof <masterip> <masterport>
#　　　　　　↑これを マスターのIP と port に変更してコメント外す
slaveof 192.168.1.12 6379
```

これだけ。

他の設定はここを読む http://redis.shibu.jp/admin/config.html#confval-slaveof

#マスターのredis.confも必要ならいじる

apt-getでインストールするとredis.confのbind ( http://redis.shibu.jp/admin/config.html#confval-bind ) が'127.0.0.1'に固定されてるかもしれません。

もし、上でいじった、スレーブからの接続先IPを192.168.1.12にしたり、ドメイン名を指定する場合は、ここをコメントアウトするか指定します。

今回は 192.168.1.12のマシンのredis.confのbindをコメントアウトしました。(パスワード使う場合は下記参照)

```
# bind 127.0.0.1
```

#再起動
あとは、apt-getなら下記のように2台とも再起動して完了です。

```
sudo /etc/init.d/redis-server restart
```

#確認

前回試したnode-redisのサンプルをマスターで書き込み、スレーブで見るという確認をしてみます。

###マスター側

```test.js
var redis = require("redis"),
    client = redis.createClient();
    client.set("test", "うひょー");
```

###スレーブ側

```test.js
var redis = require("redis"),
    client = redis.createClient();
    client.get("test", function(err, data){
      console.log(data);
    });
    
    // => うひょー
```

ちょっと変えてみます。

###マスター側

```test.js
var redis = require("redis"),
    client = redis.createClient();
    client.set("test", "うひぁああああ");
```

###スレーブ側

```test.js
var redis = require("redis"),
    client = redis.createClient();
    client.get("test", function(err, data){
      console.log(data);
    });
    
    // => うひぁああああ
```

#できました。

マスターでの書きかえがスレーブへも伝播しているのがわかります。

#パスワード

上記で、/etc/redis/redis.confのbindをコメントアウトしましたが、ローカルネットワークだけで使う場合は良いのですが、もし、外からもアクセスできる環境の場合はマスターにパスワードを設定しておきます。

（p.s. Redisはとても高速なため、性能の良いマシン上で実行している場合は、毎秒150,000回程度のパスワードチェックを行うことができます。そのため、弱いパスワードであれば簡単に突破されてしまうため、非常に強いパスワードを設定するようにしてください。とのことです。）

```マスターの/etc/redis/redis.conf
requirepass hogehogepiyopiyoPasword
```

```スレーブの/etc/redis/redis.conf
masterauth hogehogepiyopiyoPasword
```

あとnode-redisから扱う場合は

```
client.auth('hogehogepiyopiyoPasword', function(e,ok){
      console.log("authError " + e + '--' +client.host+ ': ' +ok);
})
//これはつながると下記のように表示されます
//authError null--192.168.1.12: OK
```

なにはともあれ、自分のサーバー環境へとりあえず放り込んでおくと、ちょうどlocalStorageのような手軽さ(+いろいろな機能付き)でkey/valueストアを利用できる感じ。

ふと、、、、こんなに手軽だと、これって通信のかわりに利用する手もあるんじゃないの^^? ＜表は手軽だけれど裏は大げさ？Pub/Subより楽だったりして、、、。あ、いやmessageイベントあるからやっぱPub/Subか。

というわけで、次は、RedisでPub/Sub通信。
ハッシュをソートしてハッシュで返す

ハッシュをソートしてハッシュで返す。

```ruby:hash_sort.rb
Hash[{:aaa => 1, :bbb => 2, :ccc => 3, :abc =>4}.sort]
=> {:aaa=>1, :abc=>4, :bbb=>2, :ccc=>3}
```
WordPressにXML-RPCを使ってメディア(画像・動画等)を追加する

```upload.rb
require 'xmlrpc/client'
@host = 'example.com'
@rpcPath = '/xmlrpc.php'
@user = 'user'
@pass = 'pass'

@file = './test.jpg'

server = XMLRPC::Client.new(@host, @rpcPath)
id = '1' #ライブラリに入れたい記事のPostId

fileName = File.basename(@file)

open(fileName, 'wb') do |file|
  open(@file) do |data|
    file.write(data.read)
  end
end

base64 = XMLRPC::Base64.new(File.read(fileName))
fileHash = {
  :name => 'uptest.jpg'
  :bits => base64
}
server.call("metaWeblog.newMediaObject",id,@user,@pass,fileHash )
```
ファイルをWebからダウンロードして保存する

```download.rb
require 'open-uri'
@path = 'http://example.com/files/test.txt'

fileName = File.basename(@path)

open(fileName, 'wb') do |output|     #※１
  open(@path) do |data|
    output.write(data.read)          #※２
  end
end
```

※１
指定できるアクセスモード

* r: 読み込みモード
* w: 書き込みモード(上書き)
* a: 書き込みモード(追記)
* +: 読み書き両用モード(他のアクセスモードと組み合わせて使用)
* b: バイナリモード(他のアクセスモードと組み合わせて使用)

画像や動画などをダウンロードする際は、バイナリ指定

※２
ファイルはRubyの作業フォルダ(このRubyファイルと同階層)に保存されます。
PhoneGapで使うplugins.xmlが梱包されてないのでメモ


なぜか、cordova2.0からAndroid版用のplugins.xmlが梱包されなくなったので、自分でコピペで新規作成した。
毎回内容さがすのめんどいのでメモ。
ちなみに参考はこちら→ https://groups.google.com/forum/?fromgroups=#!searchin/phonegap/plugin$20xml/phonegap/I-4_1Xik5pI/6ym4Sn8UrUEJ

```xml
<?xml version="1.0" encoding="utf-8"?> 
<!-- 
       Licensed to the Apache Software Foundation (ASF) under one 
       or more contributor license agreements.  See the NOTICE file 
       distributed with this work for additional information 
       regarding copyright ownership.  The ASF licenses this file 
       to you under the Apache License, Version 2.0 (the 
       "License"); you may not use this file except in compliance 
       with the License.  You may obtain a copy of the License at 

         http://www.apache.org/licenses/LICENSE-2.0 

       Unless required by applicable law or agreed to in writing, 
       software distributed under the License is distributed on an 
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
       KIND, either express or implied.  See the License for the 
       specific language governing permissions and limitations 
       under the License. 
--> 
<plugins> 
    <plugin name="App" value="org.apache.cordova.App"/> 
    <plugin name="Geolocation" value="org.apache.cordova.GeoBroker"/> 
    <plugin name="Device" value="org.apache.cordova.Device"/> 
    <plugin name="Accelerometer" value="org.apache.cordova.AccelListener"/> 
    <plugin name="Compass" value="org.apache.cordova.CompassListener"/> 
    <plugin name="Media" value="org.apache.cordova.AudioHandler"/> 
    <plugin name="Camera" value="org.apache.cordova.CameraLauncher"/> 
    <plugin name="Contacts" value="org.apache.cordova.ContactManager"/> 
    <plugin name="File" value="org.apache.cordova.FileUtils"/> 
    <plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager"/> 
    <plugin name="Notification" value="org.apache.cordova.Notification"/> 
    <plugin name="Storage" value="org.apache.cordova.Storage"/> 
    <plugin name="Temperature" value="org.apache.cordova.TempListener"/> 
    <plugin name="FileTransfer" value="org.apache.cordova.FileTransfer"/> 
    <plugin name="Capture" value="org.apache.cordova.Capture"/> 
    <plugin name="Battery" value="org.apache.cordova.BatteryListener"/> 
    <plugin name="org.apache.cordova.facebook.Connect" 
value="org.apache.cordova.facebook.ConnectPlugin" /> 
</plugins>
```
sugarcubeでREPLからviewを弄る


[sugarcube](https://github.com/epicagency/sugarcube)なるgemはその名の通り``self.view << subview``のように構文糖衣を提供してくれるのがメインの機能。
これはこれで便利だし面白いのだけど、REPLからviewを簡単に弄ることができるようになる機能も提供されていて、こちらのほうが面白い。

##インストール

普通にインストール。

```sh
gem install sugarcube
```

```ruby:Rakefile
require 'sugarcube'
```

##使う前の準備

``app_delegate.rb``の先頭に下記を追加だけで完了。

```ruby:app_delegate.rb
include SugarCube::Adjust
```

##使い方

適当に画面を作って実行。

![画面](http://f.cl.ly/items/362m2G1Q3I3d2u2i1q1Q/スクリーンショット 2012-09-02 12.46.33.png)

REPLから``tree``コマンドを実行するとviewの階層が取得でき、それぞれに番号が振られている。

```
(main)> tree
  0: . UIWindow(#114835968, {{0, 0}, {320, 480}})
  1: `-- UIView(#115775792, {{0, 20}, {320, 460}})
  2:     `-- UIRoundedRectButton(#115779232, {{100, 100}, {100, 100}})
  3:         `-- UIButtonLabel(#115781312, {{32, 40}, {36, 19}})
=> UIWindow(#114835968, [[0.0, 0.0],{320.0 × 480.0}], )
```

ボタンを弄りたいので2番を指定し下記のように実行。

```
(main)> b = (a 2)
=> UIRoundedRectButton(#115779232, [[100.0, 100.0],{100.0 × 100.0}],  child of UIView #115775792)
```

弄ってみる。

```
(main)> b.frame = [[0,0],[100,100]]
=> [[0, 0], [100, 100]]
```

即座に結果が反映される。

![調整後の画面](http://f.cl.ly/items/2u1x3h3H1E0X2g1W2f01/スクリーンショット 2012-09-02 12.48.03.png)
node-redisを入れてみるメモ

こないだ作ったmongoのレプリカセット( http://qiita.com/items/b5e99bf4923b84b2bb40 )が安定して仕事してくれてるぽいので、次は、欲を出して別のDBで「キーと値の対を、すべてメモリ上に保存する超高速な」redisのクラスタもテストしてみたくなる。

思い立ったが台湾吉日(注1)。牛久大仏の青銅鋳造は@台湾謹製、船で運びました。ってことで(＜関係ない^^?)、何はともあれ、さっそく、やってみる。

で、nodeで使えるredisはすでにいっぱいあるけれど、一番人気ありそうなnode-redis。
https://github.com/mranney/node_redis

![思い立ったが台湾吉日](http://sankei.jp.msn.com/images/news/120830/chn12083016590002-n1.jpg)

注1:「思い立ったが台湾吉日」2012年 台湾観光局の日本向け観光スローガン


#インストール

```
npm install redis
```

おしまい。でも、これはクライアントなので、サーバーが必要。

#redis-serverのインストール

redisの入手/インストール方法もいろいろあって、、、

```
wget http://redis.googlecode.com/files/redis-バージョン.tar.gz
```

```
git clone git://github.com/antirez/redis.git
```

などもありますが、うちはUbuntuなのでこれでいきます。

```
sudo apt-get install redis-server
```

これだけ。

#redis-serverのインストール完了

apt-getでやると redis.confは/etc/redis/redis.confに作られてて、最初から daemonize yesになってて、timeout は 300、logfileは /var/log/redis/redis-server.log ということになってました。portはデフォルトの6379、bindは'127.0.0.1'に固定です。

スタート・ストップ・再起動はこんな感じで行けます。

```
sudo /etc/init.d/redis-server start | stop | restart
```

#node-redisから使ってみる

さて、redisサーバーが立ち上がったので、node-redisで確認します
まぁ、gitにあるサンプルやってみるです。

```test.js
    var redis = require("redis"),
        client = redis.createClient();

    client.on("error", function (err) {
        console.log("Error " + err);
    });

    client.set("string key", "string val", redis.print);
    client.hset("hash key", "hashtest 1", "some value", redis.print);
    client.hset(["hash key", "hashtest 2", "some other value"], redis.print);
    client.hkeys("hash key", function (err, replies) {
        console.log(replies.length + " replies:");
        replies.forEach(function (reply, i) {
            console.log("    " + i + ": " + reply);
        });
        client.quit();
    });

    client.set("test", "うひょー");
    
    client.get("test", function(err, data){
      console.log(data);
    
    });
```

#結果

キー/バリューなのでとても簡単す。

```
node test.js
Reply: OK
Reply: 0
Reply: 0
2 replies:
    0: hashtest 1
    1: hashtest 2
うひょー
```

今日は、別のマシンからのレプリケーションも試したので、あとでそっちも忘れないようにメモしておきます( redisにレプリケーションを設定する http://qiita.com/items/7f97870ef06df9257fd4 )。これも超簡単^^ うれしい時代になってきました。



#参考
redisドキュメント日本語訳
http://redis.shibu.jp/index.html
Redis Command Reference
http://redis.io/commands
はじめての RackHub - 登録方法から使用例の紹介まで

![ScreenShot](https://dl.dropbox.com/u/2819285/ss-rackhub-newgame%2B.png)

本編はこちら：[RackHub - つよくてニューゲーム](http://www.slideshare.net/yasulab/rackhub-new-game)
＊スクリーンショットを使ったスライドで説明しています。

## もっと RackHub を使いたい人へ

[Gist一枚でまとめたRackhubの使い方](https://gist.github.com/fbbcf9404836e5627d52)
tooltip, popover等で自動生成したdivのjQueryオブジェクト

popoverやらtooltipはdataAPIでオプション指定して$.fn.popoverやらを呼ぶだけで楽なんですが、
肝心の生成したpopoverやらtooltipのdivオブジェクトには当然idはないので参照できず。
$.fn.popoverはjQueryの流儀に倣っているので戻り値はthis(つまりレシーバ)。
しかしメソッドを呼び出すとdata(jQueryのdataストアの方)に変化が。

``` popover.js
var popover = $('#hoge').popover('show').data('popover');
```

popoverを呼ぶとdata['popover']が、tooltipを呼ぶとdata['tooltip']が生えてました。
ちなみにdata['popover']の中身は以下みたいな感じ。

``` data['popover'].js
{
  $element: p.fn.p.init[1]
  $tip: p.fn.p.init[1]
  enabled: true
  options: {
    ...
  }
  type: "popover"
};
```

$elementは呼び出し元オブジェクトらしく$.fn.popoverメソッドのレシーバ(jQueryオブジェクト)、
$tipは生成したオブジェクトらしくpopoverクラスの付いたdiv(jQueryオブジェクト)。
残りのオブジェクトは名前の通りですね。

さてドキュメントが英語なんで読めずに困りながら感で突き進んでるんですが、
これはドキュメントに書かれてるんですかね。
Sporkが使われているときだけRSpecのdrbサポートを有効にする


Spork は drb プロトコルを用いて主にテストを走らせるときなどに、Ruby のオブジェクトをあらかじめメモリ上にロードさせておいてテストなどの実行を速めようというライブラリ。

これを RSpec で利用するためには drb サーバを見るよう設定する必要がある。

たいてい `rspec` ではなく `rake` なり `guard` なりを使って間接的に spec を実行するだろうから、`.rspec` やあるいは `spec_helper.rb` のようなファイルに用いるオプションをまとめて書いておくことが多い。

単に `--drb` オプションを設定していると、drb server に接続先できなかったときにその旨が標準エラー出力に出力される。

冗長なエラーメッセージは正しく抑制しなければならないので、Spork を使えないとき・使わないときには `--drb` オプションをつけずに実行するとよさそう。

```ruby:spec_helper.rb
RSpec.configure do |config|
  if defined?(Spork) && Spork.using_spork?
    config.drb = true
    # config.drb_port = 12345
  end
end
```
RSpecの設定ファイル (.rspec) でERBが使える


```ruby:.rspec
<%= '--debugger' if ENV['RSPEC_DEBUG'] %>
```

あまりいい例が思いつかないけど、便利そう。

参考: [using ERB in .rspec - Read command line configuration options from files](https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/configuration/read-command-line-configuration-options-from-files#using-erb-in-.rspec)
Twitter Ruby Gem の非スレッドセーフ API は使うべきではない


//最初から廃止すべきだとおもう。

決して推奨できないコードを多くのエントリで見かけたので指摘のために残しておく。

##使い方 : ダメなほう

OAuth の各種認証トークンを準備して

```Ruby
Twitter.configure do |config|
  config.consumer_key = "app_consumer_key"
  config.consumer_secret = "app_consumer_secret"
  config.oauth_token = "user_access_token"
  config.oauth_token_secret = "user_access_token_secret"
end
```

API を叩きにいく。とりあえず動くことには動く。

```
Twitter.update("こんにちはこんにちは")
```

####問題点
ユーザーに紐づく API リクエストをグローバルなクラスメソッドから実行しているため

* 処理のタイミングによって、<br>Twitter.configure 実行時のユーザーと<br />Twitter.update 実行時のユーザーが異なる可能性がある。
* つまり上記の例では、ユーザー A のツイートが、<br>異なるユーザー B のツイートとして流されるというバグの温床になる。

##使い方 : スレッドセーフなほう

ユーザーごとにインスタンスを生成する i/f が用意されている。

```
@client = Twitter::Client.new(
  :consumer_key => "app_consumer_key",
  :consumer_secret => "app_consumer_secret",
  :oauth_token => "user_access_token",
  :oauth_token_secret => "user_access_token_secret"
)
@client.update("こんにちはこんにちは")
```

consumer key の設定を切り出したいのなら下記のコードでも大丈夫。

```
Twitter.configure do |config|
  config.consumer_key = "app_consumer_key"
  config.consumer_secret = "app_consumer_secret"
end
@client = Twitter::Client.new(
  :oauth_token => "user_access_token",
  :oauth_token_secret => "user_access_token_secret"
)
@client.update("こんにちはこんにちは")
```

##まとめ

 * 設計は安全側に倒すべき
  * "X のときは**忘れずに** Y を実行する" という暗黙の i/f は最初から作るべきではない
      * そもそもそういう i/f は最初から使うべきではない
  * 今回の例ではスレッドセーフ云々に関係なく「configure 後に update するまでは別なユーザーはツイートできない」という暗黙の制限が発生している

##参考

http://rubydoc.info/gems/twitter/3.7.0/file/README.md#Threadsafe_Configuration
.gitignoreの存在を我々は見過ごしてはならない。

## .gitignoreとは？
`.gitignore`はGitのリポジトリのルート（.gitフォルダと同じ位置）にあるときに使えます。

## Railsの場合
Railsアプリとかだと、logディレクトリはバージョン管理したくないから

``` .gitignore
log/
```

とか書いてある。
同じように、バージョン管理の必要性がなかったり、していると不都合がおきる、
- `sqlite3`のDBファイル
- キャッシュが入る`tmp`フォルダ
- プロセス監視の`pid`ファイル
等はignoreしておくべきです。（デフォルトで.gitignoreに書かれていますが）

## .gitignore自体はignoreにするべき？
それを ignore するなんて とんでもない！
.gitignoreはプロジェクト全体で共有しておくと、環境が変わっても（パソコンが変わっても）ignoreされるファイルやフォルダは 一緒な"はず" なので、ignoreはしなくて大丈夫です。

## 一緒な"はず" ？
環境が変わるってことはもしかしたら他人が使うこともあるのです。
たとえば、僕みたいにEmacsとVimとSublimeを併用するときには、同じ人でありながら違う環境でコードを書くことさえあります。一般的にあまりないですが。

## 環境が違うとは
例えば使っているエディタが違うときがありますね。
これは、Vimにおける`*.swp`ファイルやEmacsにおける`*~`ファイルが該当しますね。
こういうのはもちろん ignore しておくべきですが、
プロジェクト毎、リポジトリ前に `.gitignore`へ

``` .gitignore
*~
*.swp
```

と書くのは面倒ですしおすし、
さらにプロジェクトメンバーにEmacs使いとVim使いが共存している中で、共通で見ることができる `.gitignore` に`*.swp`や`*~`などを記述してそれぞれのエディタの痕跡が残ってしまうと戦争になりかねません。

## 毎回、同じファイルを ignore するのは面倒、でも戦争も起こしたくはない
基本的に、DRY(Don't repeat yourself)という考え方で世の中は回っています。
つまり同じ事は一回だけにしようってことですね。GitでもDRYな `.gitignore` の書き方ができます。
まずはホームフォルダに`.gitignore`と`.gitconfig`ファイルをつくります。
それぞれ中身は

``` .gitignore
.DS_Store
*~
*.swp
```

こんな感じで書いて

``` .gitconfig
[core]
    excludesfile = ~/.gitignore
```

と書いておきます。
すると、Gitさんは基本的にホームフォルダにある`.gitconfig`を見に行くので。

1. `excludefile`で指定された.gitignoreをみる
2. リポジトリのルートにある.gitignoreをみる

という順序で見ていくので、
自分の環境に依存して、かつGitではバージョン管理をしたくない時にはホームフォルダの`.gitignore`にファイルを記述して、
プロジェクトでバージョン管理したくないファイルをリポジトリ内にある`.gitignore`に記述してメンバー全員で共有する

というのがベストプラクティではないでしょうか。

## あわせて読みたい

[Gitの設定](http://qiita.com/items/f86740dacb909a244b14 "gitの設定")
コンストラクタがprivateなクラスを1行でテスト可能にする


Singletonパターンで実装したクラスなど、`__construct()` が `private` や `protected` なクラスってそのままでは、インスタンス化できずテストが大変ですよね。

PHP5.4からは `ReflectionClass` でコンストラクタを使わないでインスタンスを作ることができるようになりました。

```php
<?php

class Singleton
{
	private function __construct() {}
}

// $singleton = new Singleton(); // Fatal error: Call to private Singleton::__construct() from invalid context

$singleton = (new ReflectionClass('Singleton'))->newInstanceWithoutConstructor();

var_dump($singleton);
```

便利ですね！


# 追記 2013/12/19

@mpyw さんによるまとめ: [private, protected なコンストラクタを外部からコールする方法](http://qiita.com/mpyw/items/b3d974c073e6484d51a4)
jQuery ValidationをTwitter Bootstrapと組み合わせて使う

[jQuery Validation](https://github.com/jzaefferer/jquery-validation)は名前の通り入力チェックを行うjQuery pluginです。サーバーサイドでチェックを行わないため画面遷移がなく、その場で入力ミスが分かるためユーザービリティーが上がります。

しかし、Twitter Bootstrapでデザインを組んでいると、エラー発生時に入力フォームが赤くならないため、以下のコードを追加します。

```Javascript
errorClass:'error',
errorElement:'span',
highlight: function (element, errorClass, validClass) { 
	$(element).parents("div[class='control-group']").addClass(errorClass); 
}, 
unhighlight: function (element, errorClass, validClass) { 
	$(element).parents(".error").removeClass(errorClass); 
}
```


利用にはjQueryが必要です。

```HTML
	<script src="js/jquery-1.8.0.min.js"></script>
	<script src="js/jquery.validate.min.js"></script>
```

JavaScriptの全体はこんな感じです。

```Javascript
$(document).ready(function() {
	$("#registrationForm").validate({
		errorClass:'error',
		errorElement:'span',
		highlight: function (element, errorClass, validClass) { 
			$(element).parents("div[class='control-group']").addClass(errorClass); 
		}, 
		unhighlight: function (element, errorClass, validClass) { 
			$(element).parents(".error").removeClass(errorClass); 
		},
		rules: {
			username: {
				required: true
			},
			email: {
				required: true
			},
			password: {
				required: true
			},
			confirmPassword: {
				required: true,
				equalTo: ".password"
			}
		},
		messages: {
			username: "ユーザ名を入力してください",
			email: "メールアドレスを入力してください",
			password: "パスワードを入力して下さい",
			confirmPassword: {
				required: "確認用パスワードを入力して下さい",
				equalTo: "パスワードが一致していません"
			}
		}
	});
	//Validation成功時の遷移先
	$("input.validate").click(function() {
		if($("#registrationForm").valid() == true){
			location.href = "confirm.html"
		}
		return false;
	});
});
```

HTMLはこんな感じ。

```HTML
<form id="registrationForm" class="form-horizontal well">
	<div class="control-group">
	<label class="control-label" for="username">ユーザ名</label>
		<div class="controls">
			<input type="text" class="span4" name="username">
		</div>
	</div>
	<div class="control-group">
	<label class="control-label" for="email">メールアドレス</label>
		<div class="controls">
			<input type="email" class="span4" name="email">
		</div>
	</div>
	<div class="control-group">
	<label class="control-label" for="twitter">twitterアカウント</label>
		<div class="controls">
			<input type="text" class="span4" name="twitter">
		</div>
	</div>
	<div class="control-group">
	<label class="control-label" for="password">パスワード</label>
		<div class="controls">
			<input type="password" class="password span4" name="password">
		</div>
	</div>
	<div class="control-group">
	<label class="control-label" for="confirmPassword">確認用パスワード</label>
		<div class="controls">
			<input type="password" class="span4" name="confirmPassword">
		</div>
	</div>
	<div class="control-group">
		<div class="controls">
			<input type="submit" class="validate btn btn-primary pull-right" value="確認">
		</div>
	</div>
</form>
```
BitbucketのOAuth：access token取得まで

どうも公式のHP通りだと上手く行かなかったのでメモっておく。
## Consumer 登録
Bitbucketのサイトにログインして、アカウント設定の所のIntegrated applicationsに登録する所があります。
## 認証する
Consumer keyとConsumer secretをゲットしたので、あとは認証のURLを調べる必要があります。
https://confluence.atlassian.com/display/BITBUCKET/oauth+Endpoint
が公式ドキュメントっぽいのですが、何故かこっちの日本語ページ
http://confluence.atlassian.jp/pages/viewpage.action?pageId=33687493
の方が正解っぽいです。!がURLについているのが気持ち悪かったので取ってみたら成功しました。


```
OAUTH_REQUEST = "https://bitbucket.org/api/1.0/oauth/request_token"
OAUTH_AUTH = "https://bitbucket.org/api/1.0/oauth/authenticate"
OAUTH_ACCESS = "https://bitbucket.org/api/1.0/oauth/access_token"
```

さて、あとは認証するだけです。お好きな方法でどうぞ、といいたいところですが、せっかくなのでサンプル(Python)を載せておきます。rauthというライブラリを利用しています。

```python
from rauth.service import OAuth1Service
def authorize():
    service = OAuth1Service(name='bitbucket', consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET,
                         request_token_url=OAUTH_REQUEST,
                         access_token_url=OAUTH_ACCESS,
                         authorize_url=OAUTH_AUTH)
    rtoken, rtokensecret = service.get_request_token(method='GET')
    auth_url = service.get_authorize_url(rtoken)
    print "Visit this url and copy&paste your PIN.\n{0}".format(auth_url)
    pin = raw_input('Please enter your PIN:')
    r = service.get_access_token('POST', request_token=rtoken, request_token_secret=rtokensecret,
                                 data={'oauth_verifier': pin})
    content = r.content
    return content['oauth_token'], content['oauth_token_secret']
```

では。
はじめてのDjangoで躓いた箇所まとめ


普通に使っている人にとっては常識すぎる内容だけど。

### コード内に日本語書いたらエラーが出た

コードの1行目に以下を追加。

````python:
# -*- coding: utf-8 -*-
````

### POSTしたらForbiddenになった

```CSRF verification failed. Request aborted.```

settings.py に追記（Django1.4.1だと設定は不要だった）

```python:settings.py

MIDDLEWARE_CLASSES = (
…
'django.middleware.csrf.CsrfViewMiddleware',
…
````

テンプレートファイルのフォームの中に以下を追加

````html
{% csrf_token %}
````

ビューファイルの変更（チュートリアルで作成したコードの場合）

```python:
from django.template import RequestContext
…
def detail(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    #return render_to_response('polls/detail.html', {'poll': p})
    return render_to_response('polls/detail.html', {'poll': p}, context_instance=RequestContext(request))
…
```


参考
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf
HTML5 で省略できるタグ


https://html.spec.whatwg.org/multipage/syntax.html#optional-tags

の和訳

1. `<html>` はその最初の内容がコメントでなければ省略できる
2. `</html>` は直後にコメントが続かなければ省略できる
3. `<head>` は内容が空か、最初の内容が要素なら省略できる
4. `</head>` は直後に空白文字かコメントがなければ省略できる
5. `<body>` は内容が空か、最初の内容が空白文字かコメントでなければ省略できるが、最初の要素が meta, link, script, style, template なら省略できない
6. `</body>` は直後にコメントが続かなければ省略できる
7. `</li>` は直後に li 要素が続くか、親要素にそれ以上内容がなければ省略できる
8. `</dt>` は直後に dt, dd 要素が続けば省略できる
9. `</dd>` は直後に dt, dd 要素が続くか、親要素にそれ以上内容がなければ省略できる
10. `</p>` は直後に address, article, aside, blockquote, details, div, dl, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, main, menu, nav, ol, p, pre, section, table, ul 要素が続くか、親要素が a, audio, del, ins, map, noscript, video 以外で親要素にそれ以上内容がなければ省略できる
11. `</rt>` は直後に rt, rp 要素が続くか、親要素にそれ以上内容がなければ省略できる
12. `</rp>` は直後に rt, rp 要素が続くか、親要素にそれ以上内容がなければ省略できる
13. `</optgroup>` は直後に別の optgroup 要素が続くか、親要素にそれ以上内容がなければ省略できる
14. `</option>` は直後に option, optgroup 要素が続くか、親要素にそれ以上内容がなければ省略できる
15. `<colgroup>` はその最初の内容が col 要素で、直前に終了タグを省略した colgroup 要素がなければ省略できる (ただし空要素の場合省略できない)
16. `</colgroup>` は直後に空白文字かコメントがなければ省略できる
17. `</caption>` は直後に空白文字かコメントがなければ省略できる
18. `</thead>` は直後に tbody, tfoot 要素が続けば省略できる
19. `<tbody>` はその最初の内容が tr で、直前に終了タグを省略した tbody, thead, tfoot 要素がなければ省略できる
20. `</tbody>` は直後に tbody, tfoot 要素が続くか、親要素にそれ以上内容がなければ省略できる
21. `</tfoot>` は親要素にそれ以上内容がなければ省略できる
22. `</tr>` は直後に tr 要素が続くか、親要素にそれ以上内容がなければ省略できる
23. `</td>` は直後に td, th 要素が続くか、親要素にそれ以上内容がなければ省略できる
24. `</th>` は直後に td, th 要素が続くか、親要素にそれ以上内容がなければ省略できる

いずれの場合にも属性を持つ場合、開始タグは省略できない。

下記で valid かチェックできる
http://validator.w3.org/

valid な例

```html
<!DOCTYPE html>
<meta charset="utf-8">
<title>タイトル</title>

<p>段落

<ul>
  <li>A
  <li>B
</ul>

<dl>
  <dt>HTML
  <dd>Hyper Text Markup Language
</dl>

<ruby>
  Ruby
  <rp>(<rt>ルビー<rp>)
</ruby>

<select>
  <optgroup label="one2two">
    <option>1
    <option>2
  <optgroup label="three">
    <option>3
</select>

<table>
  <colgroup span="2">
  <tr>
    <td>セル1
    <td>セル2
</table>
```
１コマンドで実行出来るリアルタイム端末配信システム「ScreenX on RackHub」 

![Screenshot](https://dl.dropbox.com/u/2819285/screenx-ss.png)

> ＊ これの日本語訳です
> ScreenX on RackHub - A Real-time Terminal Broadcasting System
> https://gist.github.com/3547668

## 概要

[ScreenX](https://github.com/tompng/screenx)と[RackHub](http://rackhub.net/)を使って、ターミナルを配信するシステムを構築します。RackHubだとまだうまく動きませんが、ウェブ上からターミナルを操作することもできます。

[デモ配信中 (2012/09/10迄)](http://screenx.rackbox.net:8080/screenx.html)

## やり方

1. [RackHub](http://rackhub.net/)にログインして、Rackを作成します（３時間無料プランがオススメ）。

2. こんな感じで、生成したRackにSSHでログインします。

    ` ssh rackhuber@YOUR_RACK_NAME.rackbox.net -p PORT_NUMBER -A`

3. 次のコマンドをコピペします。

    `curl -s -L https://gist.github.com/raw/3547668/install.sh | bash`

4. `screen -x`で配信中のターミナルに繋ぎます。

    NOTE: 配信中の端末が無い場合は、`screen -x screenx -R`で配信端末を作成します。

5. ブラウザで `http://YOUR_RACK_NAME.rackbox.net:8080/screenx.html` を開きます。

    NOTE: YOUR_RACK_NAMEには、生成したRack名を代入。


**TIPS: 遊び終わったら、忘れずにRackを削除しましょう。３時間以内なら無料です。**

## こんなときに使えるかも

1. コーディングの面接

2. リモートペアプログラミング w/ オーディエンス

3. Hackathon のリアルタイム中継

## 中の人たち

- ScreenX: [@tompng](http://twitter.com/tompng)
- ScreenX on RackHub: [@yasulab](http://twitter.com/yasulab)
- Special Thanks: [Lexues Academy](http://academy.lexues.co.jp)
エラトステネスの篩 （Ruby 版）

「エラトステネスの篩」の Ruby 版です。

「n 以下の素数を求める」という限定した条件下では、標準添付ライブラリの"prime.rb"よりかなり高速です。

```prime_list.rb
# -*- coding: utf-8 -*-
# call-seq:
#   prime_list(n)   ->   array
#
# * n 以下の素数を配列にして返す。
# * エラトステネスの篩 : 加算版
#
# === Example
#   prime_list(20) => [2, 3, 5, 7, 11, 13, 17, 19]
#

def prime_list(n)
  return [] if n < 2
  return [2] if n == 2

  limit = (n ** 0.5).to_i
  arr = (1 .. n).step(2).to_a
  arr[0] = 2
  len = arr.size

  i = 0
  while true
    i = i + 1
    j = arr[i]
    next unless j
    break if j > limit
    k = 2 * i * (i + 1)
    while k < len
      arr[k] = nil
      k = k + j
    end
  end
  arr.compact!
  return arr
end

a = prime_list(100_0000)
```

Windows7, Intel Core i5, 2.4GHz の環境で、n = 1000000 の場合、約 0.1 秒でした。
Djangoのコマンド補完設定

```
$ python manage.py 
$ django-admin.py
```

などをタブで補完する設定

```
$ wget https://raw.github.com/django/django/7515f6576b593c5f7a1ff2b2f934d5442b52b884/extras/django_bash_completion
$ mv django_bash_completion .django_bash_completion
```

```$ vi ~/.bashrc```

```~/.bashrc
	. ~/.django_bash_completion
```

以下は .bashrc が読み込まれていなかったので設定追加。ちゃんと読み込まれるのであれば不要

```$ vi ~/. bash_profile ```

```~/.bash_profile
if [ -f ~/.bashrc ] ; then
		. ~/.bashrc
fi
```
WafでそれっぽいD言語環境構築た際のwscriptの内容について


wafはpythoで書かれてるビルドツールです。
なんかD言語のコンパイル環境をある程度自動で作ってくれるとかで導入してみました。
pythonで書かれてるのでpythonが動く環境が必要です。

>* 公式は以下のページ。
>[http://code.google.com/p/waf/](http://code.google.com/p/waf/)

>* なんかこう使うのよ的なページ
>[http://docs.waf.googlecode.com/git/book_17/single.html](http://docs.waf.googlecode.com/git/book_17/single.html)

>* ドキュメント的なものwafのコードもここで見れる
>[http://docs.waf.googlecode.com/git/apidocs_17/index.html](http://docs.waf.googlecode.com/git/apidocs_17/index.html)



wafとか.dコードとかある環境は以下のとおり。

![フォルダ環境](http://desmond.yfrog.com/Himg875/scaled.php?tn=0&server=875&filename=9dlq.png&xsize=640&ysize=640)

~~.sublime-projectとか~~.sublime-wokspaceとかはSublimeText2で使っているプロジェクト関連のファイルなので無視して下さい。

wafがコンパイルツール本体。wscriptがビルドルールを記述してます。
.dファイルのimport関係(Phobosは除外)は以下のとおり

* src/main.dがsrc/unipa/courceinfo.dと/src/unipa/webdata.dをimport
* /src/unipa/courceinfo.dはなし
* /src/unipa/webdata.dがsrc/unipa/courceinfo.dをimport

ただ、/src/unipa/courceinfo.dはstd.net.curlをimportしてるので、curlのライブラリ参照とかしないといけないです。

では、wscriptの中身を

```python:wscript
import os.path

APPNAME='UNIPA_UFCS'
VERSION='1.0'

top='.'
out='./build'

def options(opt):
	opt.load('compiler_d')

def configure(conf):
	conf.load('compiler_d')

def build(bld):
	bld.add_post_fun(target_run)

	bld.program(
		source='./src/main.d ./src/unipa/webdata.d ./src/unipa/courceinfo.d',
		target=APPNAME,
		includes = './src/',
		libpath = '/dmd2/osx/lib',
		lib = 'curl'
		)

def target_run(ctx):
	ctx.exec_command(os.path.join(out, APPNAME) + '> result.txt')
```
APPNAMEは実行ファイルの名前、VIRSIONはそのまま、topはwscriptのあるフォルダ、outは.oとか実行ファイルとかの出力先です。
optionsとconfigureは上記の通り書くとD言語の開発環境に適した設定を構築してくれます。楽。
buildがビルドルール本体、bld.programにビルドのルール書きます。
色々書いてあります。まぁ大体意味は分かると思います。libpathとlibでcurlのライブラリ参照してたりとか。
bld.add_post_funの引数に関数を入れると、ビルドが成功した時に渡した関数を実行してくれます。
target_runはコンパイル成功時に実行ファイルを走らせて出力をresult.txtに出してます。

まぁ大体こんな感じです。

後はSublimeText2側でビルドの設定するとより幸せな環境になります。それはまた今度。
Beamer 2-column スライドで片方に画像を表示

**この記事の内容はかなり古くなってるので参考にしてはいけません！**

**[Beamer columns 環境で画像を配置するベストな方法](http://qiita.com/t_uda/items/8ef173eebf9827305135)**を参照してください！

Beamer でテキストと画像を両方差し込むので結構はまったのでメモ。

画像挿入はいろんなパッケージや命令があるけど、Beamer でそいつらを使おうとするとなぜか上手いこと行かない。（具体的には、floatflt とかで回り込ませていたのだけれど、beamer の theme を他のに変えたら急に画像が出なくなって、なぜか最後の方のスライドに単独で表示されてたとか、そんな感じの悲しい事態が起きた。他にも、frame title の方のレイアウトが崩れたりとか。）

テキストと画像を一緒に表示して回り込ませるとか、難しいことを考えるのは、やめよう。

単純に考えるんだ。スライドを **2-column** にすればいい。

```tex:two-column-rhs-image.tex
\pgfdeclareimage[width=116pt]{declared-image-name}{images/myimage.jpg}
\begin{frame}{スライドタイトル}
	\begin{columns}[t]
		\begin{column}{0.6\textwidth} % 左:60%
			\begin{itemize}
				\item ほげ！
				\item ふが！
			\end{itemize}
		\end{column}
		\begin{column}{0.4\textwidth} % 右:40%
			% ↓この行が正常な位置に表示させるためのオマジナイ
			\pgfputat{\pgfxy(0,0)}{\pgfbox[left,top]{
				% このブロックで画像を表示
				\pgfuseimage{declared-image-name}
			}}
		\end{column}
	\end{columns}
\end{frame}
```

はい、カンタンですね。columns 環境も pgf 系の命令も、beamer なら何もしなくても使えるハズ。これでテキストの横に画像を出せる。

サンプルでは、画像がズレずに正確な位置に出るように、pgf の命令でなんかオマジナイを入れてます。ちなみに画像の表示の部分もオマジナイに合わせて pgf の命令を使ってみましたが、別に includegraphics とかでも大丈夫っぽいです。お好きな方でどうぞ。

## 参考文献

* [Beamer v3.0 Guide](http://pages.pomona.edu/~aer04747/SeniorThesis/SeniorThSamples/beamer_guide.pdf "Beamer v3.0 Guide")
   * 2-column で画像を正確な位置に出力する方法はこれに載ってました。
Perl ワンライナーで直積

小規模な直積集合を求めたいときとか。
Perl 5.14.2
他のversionでも動くかどうかはちょっとわからないです（笑）

```
[@ichirin ~]$ perl -e '@a = @{[<{a,b,c}{1,2}{A,B,C,D}>]}; print"@a\n"'
a1A a1B a1C a1D a2A a2B a2C a2D b1A b1B b1C b1D b2A b2B b2C b2D c1A c1B c1C c1D c2A c2B c2C c2D
```
NSLogger でデバッグする


##概要
__NSLogger__
https://github.com/fpillet/NSLogger

__NSLogger Wiki__
https://github.com/fpillet/NSLogger/wiki/

> *Screenshot from Github:* ![Screenshot](https://raw.github.com/fpillet/NSLogger/master/Screenshots/mainwindow.png)

* Mac 上のビューアアプリ NSLogger.app に端末からログを送信、Xcode に繋がなくてもリアルタイムで確認できる
* 端末が LAN (Bonjour) 内のどこにいてもログを集められる。対応アプリをただ端末に入れておけばいい
* 通信には SSL も使える
* プロジェクトに3つのソースファイルを追加してから、NSLog() の感覚でログ送信するだけ
* OS X / iOS どちらのプロジェクトでも使える。Android にも対応している？
* ログレベルを設定できる
* 画像データを画像として表示できる

----
##準備

Github から NSLogger ソース一式を落としてきて、ビューアアプリをビルドする。`NSLogger.xcodeproj` を開いて Run を実行。Code sign のエラーが出たら`Don't Code Sign` に変更してビルド。詳細は [こちらを参照。](https://github.com/fpillet/NSLogger/wiki/Building-the-NSLogger-viewer)

出来上がった NSLogger.app を `/Applications/` なりにおいておく。

##NSLogger.app の設定

環境設定の Network タブには Bonjour service name やポート番号の設定があるので、適当に設定する。
"Apply" で反映することを忘れずに。

####Bonjour service name 
初期状態ではコンピュータ名が使われるので、それが嫌なら自分で空欄を埋める。おそらく英数でないといけない。
####ポート番号
初期状態では適当に割り振られているので、それが嫌なら自分で空欄を埋める。
####"Publish Bonjour service…"
チェックを入れておく。


##組み込む 1

Xcode プロジェクトの `Edit Scheme…`　> `Pre-actions` > `Run Script` に __`open -g -a NSLogger`__ を記述しておくと自動起動する。
これをしなくても、自分で NSLogger.app を起動させておけばよい。

以下3ファイルをプロジェクトに追加：
1. __LoggerCommon.h__
2. __LoggerClient.h__
3. __LoggerClinet.m__

以下のフレームワークをプロジェクトに関連づけ：
1. __CFNetwork.framework__
2. __SystemConfiguration.framework__

参考: [NSLoggerで手軽にログを取る方法について](http://safx-dev.blogspot.jp/2011/12/nslogger.html "NSLoggerで手軽にログを取る方法について")

##組み込む 2

AppDelegate なりで事前準備をする。
#####ホスト名とポート番号を指定する
ホスト名（ビューアアプリを動かす Mac の名前）は、"Bonjour service name" に設定した名前と同じものを設定する。ポート番号も同様。

```objectivec:ホスト名とポート番号
LoggerSetViewerHost(NULL, (CFStringRef)@"NSLoggerHost", (UInt32)12345);
```

#####オプションを設定する
SSL を使うとか Bonjour を使うとか。

```objectivec:オプション
LoggerSetOptions(NULL, kLoggerOption_BufferLogsUntilConnection |
					kLoggerOption_UseSSL | // SSL 使う
					kLoggerOption_BrowseBonjour | // Bonjour 使う
					);
```

##ログ送信
NSLog() の感覚でログ送信ができるが、API がいろいろ用意されている。ビューアアプリは送信されたメッセージを受け取ると、上記のスクリーンショットようなウインドウを表示する。

#####文字列
もっとも単純なものは、NSLog() のようにメッセージ送信するもの。
NSLog() と同じく、フォーマットや `__PRETTY_FUNCTION__` や `__LINE__` も使える。

```objectivec:文字列を送信する
LogMessage(NSString *tag, int level, NSString *format);
```

#####画像
画像の横幅、縦幅、画像データ（NSData）を引数に与えると、ビューア側で画像として表示される。

```objectivec:画像を送信する
LogImageData(NSString *tag, int level, int width, int height, NSData *data);
```


その他、詳細は [こちらを参照](https://github.com/fpillet/NSLogger/wiki/NSLogger-API)