OmniAICreator/Qiita-1.07M huggingface dataset:
masonry + ajaxでpinterest風タイルビューを実現する

![top.png](https://qiita-image-store.s3.amazonaws.com/0/27828/a7ad1c7d-f612-d625-5f18-1104b8b325d0.png)

[pinterest](http://www.pinterest.com/)のような、
・要素を隙間なく敷き詰める
・ブラウザのリサイズに応じて配置も変わる
といった機能を持つタイルビューを実現するjsのライブラリはいくつかあります

その中でも今回は定番の[masonry](http://masonry.desandro.com/)を使い、
ajaxでページングして下に下にコンテンツをページ遷移なしで追加してみます
基本的なmasonryの使い方は他に記事が大量にあるのでここでは解説しませんよ!

完成イメージは(手前味噌ですが)こんなかんじです↓
[tokyotownname.com](http://tokyotownname.com/photos)

では始めます、
画像がいくつかトップにあり、
その下に「もっと読む」ボタンがあるとします。ありがちですね。

```html

<!-- タイルビュー -->
<div id="images">
  <div id="image-unit">....</div>
  <div id="image-unit">....</div>
  ......
  <div id="image-unit">....</div>
  <div id="image-unit">....</div>
</div>

<!-- もっと読むボタン -->
<a href="javascript:void(0)" id="read-more">もっと読む</a>

```


```js

window.onload = function() {
  $("#images").masonry({
    itemSelector: '#image-unit',
  });
}

```

2ページ目の画像たちを表示させるhtmlをajax経由で取ってきましょう
取ってきたhtmlはコンテナである$("images")にappendします
現在のページ数はwindow.pagingに保存しておくとします

```js

$('#read-more').click(function() {
  $.ajax({
    url: "photos/",
    type: "GET",
    data: { page: window.paging },
    dataType: "html",
    beforeSend: function(){ $('#read-more').text("読み込み中..."); },
    success: function(data){
      if (data != '') {
        $container = $("#images");
        $container.imagesLoaded(function(){
          var el = $(data);
          el.css('display', 'none');
          $container.append(el);
          $container.imagesLoaded(function(){
            el.css('display', 'inline');
            $container.masonry('appended', el, true);
            $('#read-more').text("もっと読む");
          });
        });
      } else {
        $('#read-more').text("もう画像はありません");
      }
    },
    error: function(data){
      console.log("some error occured! majioco! punpunmaru!");
    }
  });
})

```

コールバックのsuccessに次ページのhtmlが返ってきます。
これを jQueryオブジェクトにした後にコンテナのimagesにappendして、
masonryのappendedメソッドを呼んで整列させればいいのですが、
正しくmasonryが画像の位置を決めるためには
画像がすべて読み込まれてからじゃないといけない点に注意しましょう
でないと縦横のサイズが分からないのでmasonryさんが位置を計算できないのです

なので、[imagesLoaded.js](http://desandro.github.io/imagesloaded/)を使って
コンテナに追加した次ページのhtml内の画像がすべて読み込まれるのを待ってから、
masonryのappendedで整列処理を行います

```js
$container = $("#images");
$container.imagesLoaded(function(){
  var el = $(data);
  el.css('display', 'none');
  $container.append(el);
  $container.imagesLoaded(function(){
    el.css('display', 'inline');
    $container.masonry('appended', el, true);
    $('#read-more').text("もっと読む");
  });
});

```

また、コンテナに次ページのhtmlを追加して整列が完了するまでの間、
画像が未読み込みがhtmlがチラッと見えてしまい非常に見苦しい事になるので、
追加してすぐにdisplay:noneして隠してしまいましょう

以上です。コンテンツを楽しく見せる事ができるMasonryをぜひとも検討してみてください!
MeCabをPython3上から使えるようにする

Python3からMeCabを使う方法がWebを調べても見つけられなかったので自力で何とかした。ここに使えるようにするまでのメモをまとめます。

##問題と解決方法
以下の問題が発生していました。

* mecab-python:  
  (GoogleCodeから落としてきたmecab-pythonのsetup.pyをpython3からbuild出来ない。)
* mecab:  
  (初回のパース処理でnode.surfaceが空になる現象が発生する。)

これに対してGoogleCodeのMeCabページにあるIssueのうち2件の修正を適用する事で解決させます。Python3への対応はmecab-pythonの修正のみで可能です。しかし、MeCab本体のバグを修正しなければPython上で使った時にパース処理でバグります。そのため、MeCab自体も修正パッチを当てて新たにビルドしたものをインストールして使います。

* [Issue 7: swig version used for mecab-python too old.](https://code.google.com/p/mecab/issues/detail?id=7)  
  mecab-pythonをsetup.py buildをする前に内部のMeCab.py, MeCab_wrap.cxxをリンク先のものに差し替える。
* [Issue 5: Python wrapper: surface text garbled in first call to parseToNode](https://code.google.com/p/mecab/issues/detail?id=5)  
  MeCabを./configureする前にrequest_type.patchを当て、src/tagger.cppを修正する。

##当環境で行った操作
使用するパッチのURLには変なtokenが付いていたので、代わりにIssueへのリンクを書きました。そのため、パッチはブラウザを用いてリンク先で取得してください。また、事前にg++, python3-devが必要です。

> $ wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
> $ tar -zxvf mecab-0.996.tar.gz
> $ wget [request_type.patch(リンク先で取得)](https://code.google.com/p/mecab/issues/detail?id=5)
> $ cd ~/mecab-0.996
> $ **patch -u < ../request_type.patch**
> $ ./configure --enable-utf8-only
> $ make
> $ sudo make install

> $ wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
> $ tar -zxvf mecab-ipadic-2.7.0-20070801.tar.gz
> $ cd ~/mecab-ipadic-2.7.0-20070801
> $ ./configure --with-charset=utf8
> $ make
> $ sudo make install

> $ wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
> $ tar -zxvf mecab-python-0.996.tar.gz
> $ wget [MeCab.py(リンク先で取得)](https://code.google.com/p/mecab/issues/detail?id=7)
> $ wget [MeCab_wrap.cxx(リンク先で取得)](https://code.google.com/p/mecab/issues/detail?id=7)
> $ **mv MeCab.py mecab-python-0.996/**
> $ **mv MeCab_wrap.cxx mecab-python-0.996/**
> $ cd ~/mecab-python-0.996
> $ vi setup.py
> > python3向けの修正を適用(http://anond.hatelabo.jp/20121113070853)
> > return string.split (cmd1(str)) を
> > return cmd1(str).split() に書き換える。
>
> $ python3 setup.py build
> $ sudo python3 setup.py install

##注意点
インストールが完了した後のmecab-python-0.996/test.pyは実行できません。原因はpython2で書かれているためです。修正してから動作確認をしてください。
スムーススクロールするときにクリックした選択テキストを解除するメモ


クリックでスクロールイベントを発生させるとクリック範囲のテキストが選択されてさらにスクロール量の範囲まで選択されることがあるのでそういうときに使う。
rangeオブジェクトを使うのか。

IEは現状違うメソッドでの対応でIEのgetSelectionの対応は11からってことなのかな？
http://msdn.microsoft.com/en-us/library/ms535869(v=VS.85).aspx



```js:test.js
window.getSelection().collapse(document.body,0);
```
(sqlalchemy)selectのフィールドにテキストを表示する

度忘れしそうなのでメモ

```py
from sqlalchemy.sql.expression import literal

query = session.query(Table.column1, literal('sample_text'), Table.column2)

```

このqueryから生成されるのは以下のSQL

```sql
select column1, 'sample_text', column2 from Table;

```
テンプレート関数の宣言と実装を分離する方法 ( 補足 )

以前の投稿 ( http://qiita.com/MasayaMizuhara/items/37f8c2a5462a4f7f8ea0 ) の補足。

以前の投稿で行ったテンプレートの宣言と実装を分離する方法は、 **非明示的インスタンス化** と呼ばれる。非明示的インスタンス化には実装の詳細を隔離できるというメリットがある一方で、

* オブジェクトファイルのサイズが大きくなる
* コンパイルやリンクに時間がかかる
* ( Utility.hの最終行の ) #includeによりAPIの結合度があがる

といったデメリットもある。上記問題を解決する方法として、 **明示的インスタンス化** と呼ばれる方法がある。明示的インスタンス化による、テンプレートの宣言と実装を分離するサンプルを下記に示す。

Utility.h : テンプレート関数の宣言のみ記述したファイル

```cpp
// Utility.h
#pragma once

#include <string>                                                                               

template<typename T>                                                                            
class Utility
{
    public:
        std::string toString(const T & value);                                                  
};
```

Utility.cpp : Utility.hの実装ファイル

```cpp
// Utility.cpp
#include "Utility.h"
#include <sstream>

template<typename T>
std::string Utility<T>::toString(const T & value)
{
    std::stringstream ss; 
    ss << value;
    return ss.str();
}

// 明示的テンプレートのインスタンス化
template class Utility<int>;
```

main.cpp : Utilityクラスの使用法を説明するためのファイル

```cpp
// main.cpp
#include <iostream>
#include "Utility.h"

int main()
{
    Utility<int> utility;
    std::cout << utility.toString(20) << std::endl;
    return 0;
}
```

明示的インスタンス化には非明示的インスタンス化の持つ問題を解決できるメリットがあるが、

* テンプレートの明示的インスタンス化を予め行わなくてはならない

というデメリット ( ? ) がある ( 上記の例では、Utility.cppの最終行でインスタンス化した型 ( int ) 以外のUtilityインスタンスを作成できない ) 。

**結論**

明示的にインスタンス化する型が決まっている、またはユーザが自由にインスタンス化を行うことを許可したくない場合は明示的インスタンス化、そうでない場合は非明示的インスタンス化により宣言と実装の分離を行うのが良いと思う。
PDO_MySQLでSSLクライアント証明書を使う


[MySQLでSSLクライアント証明書を使うようにしてみたので](http://qiita.com/ngyuki/items/146252102315282e1f12)、PDOから接続してみます。

```php:pdo-mysql-ssl.php
<?php
$db = new PDO(
    'mysql:host=example.jp;dbname=test;charset=utf8',
    'ssluser',
    'pass',
    array(
        PDO::MYSQL_ATTR_SSL_KEY  => '/home/ore/.mysql/client.key',
        PDO::MYSQL_ATTR_SSL_CERT => '/home/ore/.mysql/client.crt',
        PDO::MYSQL_ATTR_SSL_CA   => '/home/ore/.mysql/ca.crt',
    )
);

$stmt = $db->query("select 'ok'");
$row = $stmt->fetchColumn();
var_dump($row);
```

```console
$ php -v
PHP 5.5.3 (cli) (built: Sep 21 2013 20:49:51)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
    with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

$ php pdo-mysql-ssl.php
string(2) "ok"
```

ただしこの方法はマニュアルの記載によると PHP 5.3.7 からです。それより前のバージョンだとダメです。

試しに RHEL6/CentOS6 のリポジトリの PHP 5.3.3 で試してみると・・・

```console
$ php -v
PHP 5.3.3 (cli) (built: Jul 12 2013 20:35:47)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

$ php pdo-mysql-ssl.php

Fatal error: Undefined class constant 'MYSQL_ATTR_SSL_KEY' in /home/ore/pdo-mysql-ssl.php on line 7
```
JMeterでOutOfMemoryが発生した場合の対応方法


JMeterを使用して負荷試験を実施していたら、javaのOutOfMemoryが発生したのでその対処方法をメモ。

##■動作環境
Java 1.4.6
JMeter 2.3.2

##■エラー
java.lang.OutOfMemoryError

##■原因
JavaVMに割り当てられたヒープメモリが枯渇しメモリリークが発生。

##■対処方法
(任意のディレクトリ)¥jakarta-jmeter-2.3.2¥bin配下にある`jmeter`をエディタで編集。ヒープサイズをアップさせました。

```jmeter
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availablity:
HEAP="-Xms256m -Xmx256m"
```
↓

```jmeter
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availablity:
HEAP="-Xms512m -Xmx512m"
```

これで無事、解決しました。

##※余談
バージョンが古かったので、JMeterのバージョンアップも実施しました。
JMeter 2.3.2　➡　JMeter 2.3.4
そしたら、jmeter.batを動かしてもjmeterが起動しませんでした。

###■原因
Javaバージョンの互換性のため起動しない(?)

###■解決方法
Javaのバージョンをアップ
Java 1.4.6　➡　Java 1.4.17

これで無事、解決しました。
なお、JMeter 2.3.4はデフォルトでヒープサイズが512MBでした。

以上。
PHPでアルゴリズム「再帰呼び出し」~1が何個あるか数える関数

```php:saiki_ver1.php

<?php


//1が何個あるか数える関数
function num_of_one($value){
    //桁がなくなったら0を返す
    if($value == 0){
        return 0;
    }
    //一番下の位が1の場合1に
    elseif($value % 10 == 1){
        $ret = 1;
    }
    //1でなければ0
    else{
        $ret = 0;
    }
    //10で割って桁を1つずらし、自分を呼び出す
    return $ret + num_of_one((int)($value / 10));

}

$var = num_of_one(222311103711);
var_dump($var);
```
オフラインどう書く14回参考問題をGo言語で解いてみた

面白そうだったしだれも書いてなかったから書いてみたけど、何だかものすごくつまらないアルゴリズムになってしまった。

解くのにかかった時間は一時間ぐらい。解法はすぐ出たんだけどGo言語でどうやって点を四つ選ぶかで少し悩んだ。

問題：<http://nabetani.sakura.ne.jp/hena/ord14crosscircle/>

```go:crossing.go
package main

import (
	"fmt"
)

func test(n int, input string, except int) {
	actual := 0
	
	//四重ループっておい
	for i1, c1 := range input {
		for i2, c2 := range input[i1+1:] {
			for i3, c3 := range input[i1+i2+2:] {
				for _, c4 := range input[i1+i2+i3+3:] {
					//向かいの点がそれぞれ同じなら交差してる
					if c1 == c3 && c2 == c4  {
						actual += 1
					}
				}
			}
		}
	}
	
	fmt.Printf("%d : %d == %d => %t\n", n, except, actual, except == actual)
}

func main() {
	test(0, "aabbca1bcb", 14);
	test(1, "111ZZZ", 0);
	test(2, "v", 0);
	//以下省略...
}
```
iOS7でNavigationBarに入れたSearchBarにキャンセルボタンを出現させる方法

Xcode4でiOS6用に作成していたプロジェクトを
Xcode5でiOS7用にしていた際に発生した問題があったのでメモ代わりに。

※追記
iOS7.1では修正されているようで、本記事のようなバッドノウハウは必要ないとのコメントを頂きました。

## CancelButtonが表示されない
iOS6では、UINavigationBarにUISearchBarを入れた場合、
showsCancelButtonにYESを入れてやるだけでちゃんとキャンセルボタンが表示される。

しかし、どうもiOS7ではそうゆう訳にはいかないようで少し工夫する必要があった。
具体的にはUISearchBarを適当なUIViewに入れてやり、それをUINavigationBarに挿入することで解決。

```objc
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 300, 44)];
searchBar.placeholder = @"検索語句を入力";
searchBar.keyboardType = UIKeyboardTypeDefault;
searchBar.showsCancelButton = YES;
searchBar.delegate = self;

// UISearchBarを入れるためのコンテナViewをつくる
UIView *searchBarContainer = [[UIView alloc] initWithFrame:searchBar.frame];
[searchBarContainer addSubview:searchBar];

// UINavigationBar上に、UISearchBarを追加
self.navigationItem.titleView = searchBarContainer;
self.navigationItem.titleView.frame = CGRectMake(0, 0, 300, 44);
```

## UINavigationBarに同化させたい
iOS6ではUINavigationBarとUISearchBarのデフォルト色が同じだったため、
そのまま使う場合は特に何も特別な処理を書く必要はなかった。

iOS7でも直接NavigationBarに挿入する場合は問題なかったのだが、
キャンセルボタンを追加させるために1つViewを噛ませてしまったため、
UINavigationBarに同化させるにはまた少し工夫する必要があった。

iOS7ではUISearchBarにUISearchBarStyleという新しいプロパティが用意されたので、
今回のようなケースではそれを使うのが手っ取り早い。

```objc
searchBar.searchBarStyle = UISearchBarStyleMinimal;
```
これで、もともとこんな感じだったものが、
![searchBar_fix.png](https://qiita-image-store.s3.amazonaws.com/0/12896/3360b076-92f3-fba4-b9e3-ff9f74bdb1de.png)

こうなる。
![searchBar.png](https://qiita-image-store.s3.amazonaws.com/0/12896/9572df33-71b1-fa48-cd29-14a99fda4d0d.png)
Rakeでなぜデフォルトでtaskから自分のdescriptionにアクセスできないのか分からない

以下のようにすることでtaskのブロックから自分のdescriptionを読み出すことができる。

```rb
Rake::TaskManager.record_task_metadata = true

desc "foo.
bar"
task :default do |task|
  p task.comment       # => "foo"
  p task.full_comment  # => "foo.\nbar"
end
```

(参考: [ruby - Access Rake Task Description from within Task - Stack Overflow](http://stackoverflow.com/questions/8781263/access-rake-task-description-from-within-task), [class Rake::Task - Rake](http://rake.rubyforge.org/Rake/Task.html))

`Rake::TaskManager.record_task_metadata`が真値でないとタスクのオブジェクトに説明文が紐付けられない。なぜデフォルトではこの値が`false`になっているのか気になったので調べた。

`git blame lib/rake/application.rb`で変更履歴を見てみると、[Optimized comment loading to only happen with -T, -D or -W options. · f191142 · jimweirich/rake](https://github.com/jimweirich/rake/commit/f191142580155c38d02172a1960d65505b7bc51f)というコミットが見つかる。`-T`などのタスクの説明を表示するオプションが有効になったときだけタスクに説明文を紐付けるという変更。"Optimize"ということは、常に紐付けているとパフォーマンス上の問題があったのだろうか。

試しに説明を常に紐付けるように書き換えてRakeの`rake test`を走らせても速度に変化はなかった。大規模なRakefileになると問題が出てくるのかもしれないが、関連する処理を見てもタスク数などが増えたとき極端にパフォーマンスが悪くなりそうな部分が見つけられなかった。
オフラインどう書く14回参考問題解答例( Scala )

```scala
object Hena {
  def solve(src:String) = {
    val p = src.toList
    val cc = (0 until p.size).toList.combinations(2).map(arg => {
      val (x, y) = (arg.head, arg.last)
      if((p(x) == p(y)) && (x + 1 < y)) {
        val a1 = p.drop(x + 1).dropRight(p.size - y)
        val a2 = (if(0 < x) p.take(x) else List()) ++ (if(y < p.size - 1) p.drop(y + 1) else List())
        a1.map(arg => a2.count(_ == arg)).sum
      } else {
        0
      }
    }).sum
    (cc / 2).toString
  }

  def test(src:String, expected:String) = {
    val actual = solve(src)
    println(if(expected == actual) { "ok" } else { "***NG***" })
  }

  def main(args:Array[String]) = {
    /*0*/ test( "aabbca1bcb", "14" )
    /*1*/ test( "111ZZZ", "0" )
  }
}
```
nginxで日本語のサブドメインを設定する

```
server {
  listen 80 default_server;
  server_name ゆうこ.おおしま.com;
  root  /var/www/yuko;
}

server {
  listen 80;
  server_name みゆき.おおしま.com;
  root  /var/www/miyuki;
}
```

だと両方 _default_server_ にアクセスしちゃう。

```
server {
  listen 80 default_server;
  server_name xn--p8j0a5k.xn--t8ja3b4j.com;
  root  /var/www/yuko;
}

server {
  listen 80;
  server_name xn--w8j5eva.xn--t8ja3b4j.com;
  root  /var/www/miyuki;
}
```

って書くとうまくいく。
**ChromeのURL欄に日本語URLを入力してアクセスした後にURLをコピペすると↑みたいな文字列になる。**
便利。

cf. http://ja.wikipedia.org/wiki/Punycode
[Go言語] reflectパッケージで変数の値を変える


以下の記事に書いてあることをまとめる。

* http://golang.org/doc/articles/laws_of_reflection.html

## 変数の値を変える

よく考えれば当たり前だが、一度ポインタにしないと変数の値を変えることができない。

http://play.golang.org/p/grX4uYh2VO

````
package main

import (
	"fmt"
	"reflect"
)

func main() {
	n := 100

	// ダメ
	nv := reflect.ValueOf(n)
	fmt.Println(nv.CanSet())

	// ポインタを使う
	npv := reflect.ValueOf(&n)
	fmt.Println(npv.Elem().CanSet())
	npv.Elem().SetInt(200)

	fmt.Println(n)
}
````

一度ポインタにして、`Elem`メソッドでまたポインタの指す先に戻しているあたりが気持ち悪い。
`Elem`メソッドの[ソース](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#780)を見ると、[`flagRO `](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#76)フラグは元の`Value`の物を保持して、[`flagAddr`](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#78)フラグと[`flagIndir`](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#77)フラグを立てている。そのため、[`CanSet`](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#330)メソッドで`true`が返る（つまり、代入可能にしている）ことが分かる。
一方、`reflect.ValueOf(100)`のようにした場合は、[`flagIndir`](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#77)しか[フラグがたてられない](https://code.google.com/p/go/source/browse/src/pkg/reflect/value.go#2130)。よって、`CanSet`はfalseとなり、`Set`できない。

## 構造体のフィールドの値を変える

上記と同様に、構造体のフィールドの値を変えるのにも一度ポインタに変換する必要がある。

http://play.golang.org/p/SSW28W5bXn

````
package main

import (
	"fmt"
	"reflect"
)

type Hoge struct {
	N int
}

func main() {
	h := Hoge{10}
	hpv := reflect.ValueOf(&h)
	hpv.Elem().FieldByName("N").SetInt(200)

	fmt.Println(h)
}
````
[Go言語] constとiota面白い


## 連番を付ける

iotaを使うと連番が付けれる。

http://play.golang.org/p/w9KX9ry0Da

````
package main

import "fmt"

const (
	a = iota
	b
	c
)

func main() {
	fmt.Println(a, b, c)
}
````

## iotaとシフトを組み合わせてみる

シフトと組み合わせると簡単にフラグが作れる。

http://play.golang.org/p/rHew6bPIWQ

````
package main

import "fmt"

type flag uint
const (
	flag1 flag= iota << 1
	flag2
	flag3
	flag4
	bits = iota - 1
	mask = 1<<bits - 1
)

func main() {
	fmt.Printf("%b, %b, %b, %b, %d, %b", flag1, flag2, flag3, flag4, bits, mask)
}
````
Mac で rbenv を使って Ruby をインストールするときに使うスクリプト

僕が考えた最強の Ruby インストールスクリプトがこちらになります。

ruby-build が RUBY_CONFIGURE_OPTS_ARRAY をきちんと処理してくれない・・・

```bash
#! /bin/bash

PATH=~/.rbenv/bin:~/.rbenv/plugins/ruby-build/bin:$PATH

version=${1:-2.1.0-dev}

trap 'exit 1' 2

eval "$(rbenv init -)"

export RUBY_CONFIGURE_OPTS_ARRAY=( \
  CC=clang CXX=clang++ \
  optflags="-O2 -march=corei7-avx -mtune=corei7-avx" \
  debugflags="-ggdb3" \
)

export RUBY_CONFIGURE_OPTS=" \
  --with-arch=x86_64 \
  --with-valgrind \
  --with-out-ext=tk,tk/* \
  --enable-shared \
  --enable-pthread \
  --disable-install-doc \
  --disable-libedit \
  --with-gdbm-dir=$(brew --prefix gdbm) \
  --with-dbm-dir=$(brew --prefix gdbm) \
  --with-dbm-type=gdbm_compat \
  --with-libyaml-dir=$(brew --prefix libyaml) \
  --with-libffi-dir=$(brew --prefix libffi) \
  --with-openssl-dir=$(brew --prefix openssl) \
  --with-readline-dir=$(brew --prefix readline) \
  --with-opt-dir=$(brew --prefix) \
"

export MAKE_OPTS="-j 2"

[ -d ~/.rbenv/sources/$version ] && rm -rf ~/.rbenv/sources/$version

rbenv install -k -f $version

export RBENV_VERSION=$version
rbenv exec gem update --system 2.1.4
rbenv exec gem install bundler --pre --no-ri --no-rdoc
rbenv rehash
```

最新版は [Gist](https://gist.github.com/mrkn/6647630) にあるよ。
Vagrant+chef-soloの練習


#概要
VirtualBox(VMWare)で仮想マシンが作れるのを、更にコマンドで簡単に設定していく （備忘録）

# 環境・レシピの用意

* OS X 10.8.4
* ruby-1.9.3-p392

`$gem install chef -- --no-ri --no-rdoc`

`$knife configure`

`$gem install knife-solo -- --no-ri --no-rdoc`

##cookbook 作成

リポジトリを作って、その中にmycookbookというcookbookを作る

`knife solo init myrepo`

`knife cookbook create mycookbook -o myrepo/site-cookbooks/`


* デフォルトは/var/chef/以下にいろいろ作られる

* /etc/chef/solo.rb
=> 生まれたてのVagrantVM上で
`chef-solo`
だけ実行すると探していた。

## chef-soloをVM上で実行する
* ゲストで/etc/chef/solo.rb を作成。
* /vagrant/myrepoをcookbookpathに指定
* sudo chef-solo -o cookbookname
* これでとりあえずいける

chef-soloを実行する際に参照するファイル
cookbook作成のファイルパスを指定することなどができる

```solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path ["/vagrant/myrepo/site-cookbooks"]
log_level :debug
```

```/vagrant/myrepo/site-cookbooks/mycookbook/recipes/default.rb
#
# Cookbook Name:: mycookbook
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

log 'Hello Chef'
package 'httpd' do
	action :install
end

package "postgresql-server" do
	action :install
end

#version_file = "/var/lib/post
```

##cookbook実行
vagrantで生成したVMにchef-soloでcookbookを流し込むのをしたい

下記のように追加する

```Vagrantfile
config.vm.provision :chef_solo do |chef|
	chef.cookbooks_path = "myrepo/site-cookbooks"
	chef.add_recipe "mycookbook"
	chef.json = {:nameservers => ["10.0.0.1"]}
end
```

`vagrant up`ですべて正常にいけば終わり
このコマンドレット、この前 PowerShell で実行した、ような・・・・・・

# こんなの絶対おかしいよ！

Powershell で、いろいろ操作して、昨日打ったコマンドを、また実行できると、それはとっても嬉しいなって思うのですが、Powershell を一旦終了してしまうと履歴が保存されずに消えてしまっています。。。  

それでもいいの？
さっき打ったコマンドレットを忘れちゃうのに？
さっき打ったコマンドレットのこと、もう二度と感じ取ることさえ出来なくなっちゃうのに？？


# 履歴保存も、履歴補完も、あるんだよ

がんばれば、きちんとした履歴保存機能を作ることができるでしょうが、
できるだけがんばらずに、履歴保存する方向で。

## 履歴保存も、あるんだよ

* $Profile の中の `function Prompt` に `Export-Csv -Path ~\.posh_history.csv -InputObject (Get-History)[-1] -Append` を追記
- ただし、 `exit` 以外の方法で終了してしまうと、最後に実行した履歴が残らない（終了イベントとかで保存すればいいけど面倒。そこまでするなら、プラグイン化するか、既存のものを使いたい
- あと、コマンドなしで Enter を連打してしまうと同じ履歴が、いっぱい残ってしまう（面倒。そこまでするなら（以下略
- <del>PowerShell 3.0 以上じゃないと、 Export-Csv に -Append オプションがないので、Out-File コマンドで、csv に追記する(初回にヘッダありのファイルを作成しなければならない。。。3.0に比べて、かなり面倒。。。)</del> PowerShell 2.0 のことは忘れましょう

```ps1:
# 2.0 向け（PowerShell 2.0 のことは忘れましょう
if (-not (Test-Path ~\.posh_history.csv)) {
    "#TYPE Microsoft.PowerShell.Commands.HistoryInfo" | Out-File ~\.posh_history.csv -encoding UTF8
    '"Id","CommandLine","ExecutionStatus","StartExecutionTime","EndExecutionTime"' | Out-File ~\.posh_history.csv -encoding UTF8 -append
}
$h = (Get-History)[-1]
$csv = "`"$($h.Id)`",`"$($h.CommandLine)`",`"$($h.ExecutionStatus)`",`"$($h.StartExecutionTime)`",`"$($h.EndExecutionTime)`""
$csv | Out-File ~\.posh_history.csv -encoding UTF8 -append
```

## 履歴読込も、するんだよ

* $Profile に `Import-Csv ~\.posh_history.csv | Add-History` を追記

## 履歴補完も、あるんだよ

* #`検索したい文字列`\<Tab\>

## 例

```ps1:$Env:USEPROFILE\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
function Prompt {
    # PowerShell 3.0+
    Export-Csv -Path ~\.posh_history.csv -InputObject (Get-History)[-1] -Append
    return "$pwd > "
}

Import-Csv ~\.posh_history.csv | Add-History
```


# 参考

* [lzybkr/PSReadLine](https://github.com/lzybkr/PSReadLine)
    - デフォルト教を信仰するつもりなので、デフォルトの環境と、かなり変わってしまいそうなので、使ってみるのをためらっているが便利そう。
* [Windows PowerShell: 歴史を忘れる者たち](http://technet.microsoft.com/ja-jp/magazine/hh241048.aspx)
* [PowerShell コンソールにおける入力履歴管理について - tech.guitarrapc.com](http://tech.guitarrapc.com/entry/2013/07/12/220515)


# 追記

はやく Windows 10 に移行しましょう。
default_value_for + protected_attributesでmass assignment roleがおかしい

```rb
class Test < ActiveRecord::Base
  attr_accessor :sample
  default_value_for :sample, true
  attr_accessible :sample, as: :admin
end
```
とすると、

```rb

Test.new({sample: false}, as: :admin)
```
で、
`WARNING: Can't mass-assign protected attributes for ...`
となる。

`default_value_for`を使わずに、`after_initialize`で対応すると成功した。


```rb

class Test < ActiveRecord::Base
  attr_accessor :sample
  attr_accessible :sample, as: :admin
  after_initialize :initialize_defaults
  def initialize_defaults
    self.sample = true if self.sample.nil?
  end
end
```

原因は、
`default_value_for `が`InstanceMethods::initialize`を再定義して`ActiveRecord::Base`に`extend`させていることと、`protected_attributes`が`ActiveRecord::MassAssignmentSecurity::Core`で`initialize`を再定義しており、`ActiveRecord::Base`に`include`させていることが、競合していることだと思う。
すぐにできるページランク計算(全行コメント解説つき)

激しく簡単。難しそうなことが実は激しく簡単にできるということを知っておくことは重要なことだと思う。

##必要なものをインストール
せっかくなので周辺のライブラリもインストール。特にハマることもなくインストールできた。

```sh:準備
brew update #homebrewが錆びついてたらいかんので
brew install gfortran #scipyいれるのに必要だった気がする
easy_install pip #pythonのライブラリ管理ツールのインストール
pip install numpy #科学計算用ライブラリのインストール
pip install scipy #高度な科学計算用ライブラリのインストール
pip install networkx #グラフ処理用ライブラリのインストール
```

##ページランクを出力するコード

```python:ページランクを出力
# -*- coding: utf-8 -*-
import networkx as nx#先ほど入れたnetworkxをインポート

g = nx.DiGraph()#有向グラフを表現するためのオブジェクトを作成
g.add_edge("user1","user3")#user1からuser3に投票
g.add_edge("user2","user3")#user2からuser3に投票
g.add_edge("user2","user1")#user2からuser1に投票
g.add_edge("user3","user1")#user3からuser1に投票
g.add_edge("user4","user2")#user4からuser2に投票
g.add_edge("user1","user4")#user1からuser4に投票
print nx.pagerank_scipy(g,alpha=0.85)#ダンピングファクターを0.85としてページランクを出力
#{'user4': 0.18597431523080427, 'user2': 0.19557861112876537, 'user3': 0.2690949378990845, 'user1': 0.3493521357413458}
```
Homebrew で reinstall (再インストール)する方法

インストールオプションとかを変えたい時にphpを再インストールしたくなったけどやり方がわからない。
調べてみたら brew には reinstall コマンドが用意されてないので `$ brew uninstall` してから `$ brew install` します。 以上。


## 参考

osx - How do you re-install a package with Homebrew (Mac)? - Super User
http://superuser.com/questions/324980/how-do-you-re-install-a-package-with-homebrew-mac
Ubuntuで手動で削除してしまった設定ファイルが再インストールで生成されない件

手動でファイルを削除してしまいました。
CentOSなら自動的に見つからない設定ファイルは生成してくれたのでUbuntuでもそうだろうと思っていました。
再インストールしてもデフォルトの設定ファイルは復元されませんでした。。。
いろいろと試行錯誤したのでまとまりがないです。

## 問題の行動

### まず削除

```
$ sudo apt-get remove glance
```

### 再度インストール

```
$ sudo apt-get install glance
```

### 結果

`/etc/glance/glance-api-paste.ini` が見つかりませんでした。。。

## どうにかする

まずパッケージを削除。

```
$ sudo apt-get purge glance
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required
  python-jsonschema python-json-pointer python-warlock glance-common python-httplib2 python-json-patch glance-registry
  python-swiftclient libyaml-0-2 python-anyjson python-glance python-boto python-kombu python-yaml python-oslo-config
  python-amqplib python-dateutil python-glanceclient python-xattr glance-api
Use 'apt-get autoremove' to remove them.
The following packages will be REMOVED:
  glance*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 32.8 kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 89765 files and directories currently installed.)
Removing glance ...
```

依存パッケージは削除してくれない？
以下のようにして対処。

```
$ sudo apt-get autoremove glance
$ sudo apt-get install glance

No apport report written because the error message indicates its a followup error from a previous failure.
                                                                                                          Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
Errors were encountered while processing:
 glance-registry
 glance
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

エラーコードを吐いて一部インストール出来ない。
とにかくpurgeしまくる。
全部設定ファイルを削除。

```
$ sudo apt-get --purge remove glance-registry
$ sudo apt-get --purge remove glance
$ sudo apt-get install glance
```

とりあえずインストール時にエラーは出なくなったけど依然として `/etc/glance/glance-api-paste.ini` が生成されない。
他の設定ファイルは復元されているっぽい。
依存関係定義のミス？
直接依存パッケージ `glance-api` を指定して設定ファイルを強制的に再生成させる。

```
$ sudo apt-get -o DPkg::Options::="--force-confmiss" --reinstall install glance-api
```

やっと生成された。。。

## 参考サイト

- [The Following Packages Were Automatically Installed And Are No Longer Required Warning](http://www.cyberciti.biz/faq/debian-ubuntu-linux-following-packages-were-automatically-installed/)
- [installation - How can I replace missing configuration files after removing a package? - Ask Ubuntu](http://askubuntu.com/questions/26228/how-can-i-replace-missing-configuration-files-after-removing-a-package)
yield で async/await 的な何か

実験用に「指定ミリ秒後に `resolve` される `Deferred` （というか `Promise`）」を返してくれる `delay` 関数を作っておく。ついでに `resolve` 結果として連番が返ってくるようにしておく。

```js
var i = 0;

function delay(ms){
    var d = jQuery.Deferred();
    setTimeout(function(){
        d.resolve(i++);
    }, ms);
    return d.promise();
}
```

で、何がしたいかというと C# の async/await もしくは F# のコンピューテーション式よろしく、非同期タスクを同期的に書きたい。

```js
async(function(){

    var x = yield delay(1000);
    console.log(x);
    x = yield delay(1000);
    console.log(x);
});
```

こんな感じ。

これをやるために用意する `async` 関数が下のようになる。

```js
function async(action){

    var iterator = action();
    var promise = iterator.next();

    if (promise) {
        promise.done(next);
    }
    
    function next(result){
        promise = iterator.send(result);
        if (promise) {
            promise.done(next);
        }
    }
}
```

これ、Internet Explorer でまともに動くようになれば Web アプリでのメッセージボックス表示とかがコーディングしやすくなるんだけどなぁ。
TranslateAnimationを動的に設定しやすくするクラスを作ってみました

この間の勉強を元に、TranslateAnimationを拡張して、簡単に「今の位置から任意の位置へ」移動したり、「点Aから点Bへ」移動させるTranslateAnimationExを作ってみました。
また、移動完了後に実際にアニメーション後の位置にビューを移動させたり、移動中はクリックを無効にする機能をつけています。

```java:TranslateAnimationEx.java
public class TranslateAnimationEx extends TranslateAnimation implements
		AnimationListener {

	private AnimationListener mListener;
	private View mView;
	private int mFromX;
	private int mFromY;
	private int mToX;
	private int mToY;

	public TranslateAnimationEx(View animatedView, int dulation, int toXValue,
			int toYValue) {
		super(0, toXValue, 0, toYValue);
		setDuration(dulation);
		mView = animatedView;
		mFromX = mView.getLeft();
		mFromY = mView.getTop();
		mToX = toXValue;
		mToY = toYValue;
		setAnimationListener(this);
	}

	public TranslateAnimationEx(View animatedView, int dulation,
			int fromXValue, int toXValue, int fromYValue, int toYValue) {
		super(fromXValue - animatedView.getLeft(), toXValue
				- animatedView.getLeft(), fromYValue - animatedView.getTop(),
				toYValue - animatedView.getTop());
		setDuration(dulation);
		mView = animatedView;
		mFromX = fromXValue;
		mFromY = fromYValue;
		mToX = toXValue - fromXValue;
		mToY = toYValue - fromYValue;
		setAnimationListener(this);
	}

	public void animate() {
		mView.startAnimation(this);
	}

	@Override
	public void setAnimationListener(AnimationListener listener) {
		if (listener.equals(this)) {
			super.setAnimationListener(listener);
		} else {
			mListener = listener;
		}
	}

	@Override
	public void onAnimationEnd(Animation animation) {
		int x = mFromX + mToX;
		int y = mFromY + mToY;
		mView.layout(x, y, x + mView.getWidth(), y + mView.getHeight());
		mView.setAnimation(null);
		mView.setClickable(true);
		if (mListener != null) {
			mListener.onAnimationEnd(animation);
		}
	}

	@Override
	public void onAnimationRepeat(Animation animation) {
		if (mListener != null) {
			mListener.onAnimationRepeat(animation);
		}
	}

	@Override
	public void onAnimationStart(Animation animation) {
		mView.setVisibility(View.VISIBLE);
		mView.layout(mFromX, mFromY, mFromX + mView.getWidth(),
				mFromY + mView.getHeight());
		mView.setClickable(false);
		if (mListener != null) {
			mListener.onAnimationStart(animation);
		}
	}

}
```

使い方はこんな感じ

```java:使用例
	final ImageView relative_anime = (ImageView) findViewById(R.id.relative_anime);
	final ImageView abstract_anime = (ImageView) findViewById(R.id.abstract_anime);
	new TranslateAnimationEx(relative_anime, 1000, 10, 10).animate();
	new TranslateAnimationEx(abstract_anime, 1000, 20, 30, 20, 30).animate();
```

アニメーションをリピート再生したときのことは何も考えてないのでsetRepeatCount()で何かの値を指定すると、移動後の位置がおかしくなったりすることがあります。

詳しくはBitbucketにソースコードをあげているのでそちらをご覧あれ。
https://bitbucket.org/TakamiChie/animationex/
CocoapodsとXcode5の組み合わせでエラー出た+解決した


なんかXcode5にアップデートしてみたらCocoapods関連で下記のwarning出てたのだけど気にせずビルドしたら案の定failした。
`Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'armv7 armv7s' didn't contain all required architectures 'armv7 armv7s arm64'`

エラーの内容はこれ。
`ld: library not found for -lPods`

解決策は、まずこれからCocoapodsを使う人は最新版に上げてから使いましょう。

また、このエラーでた人は、
`Pods (the project) -> Pods (the target) -> Build settings`
にあるArchitectureの設定のところで、`Standard Architecture(armv7, armv7s)`を指定してビルドしなおせば解決します。

参考：
https://github.com/CocoaPods/CocoaPods/pull/1352
NSString+NSUserDefaults


NSUserDefaultsを出来るだけ短く書きたいと考えた結果、こんなものを作ってみました。
ソースは[こちら](https://gist.github.com/sora0077/6638739)にあります。

```objectivec:
    @"hoge".defaultsBool = YES;
    NSLog(@"%@", @"hoge".defaultsBool ? @"YES" : @"NO");

    @"fuga".defaultsFloat = 3.14;
    NSLog(@"%f", @"fuga".defaultsFloat);

    @"url".defaultsURL = [NSURL URLWithString:@"http://qiita.com/"];
    NSLog(@"%@", @"url".defaultsURL);

    @"string".defaultsString = @"string";
    NSLog(@"%@", @"string".defaultsString);

    @"array".defaultsArray = @[@1, @2, @3];
    NSLog(@"%@", @"array".defaultsArray);

    @"dict".defaultsDictionary = @{@"key": @"obj"};
    NSLog(@"%@", @"dict".defaultsDictionary);
```


間接的な利用を推奨します。


1.定義文字列経由

```objectivec:
#define DEFAULTS_FLOAT_VAR @"defaults.var"

DEFAULTS_FLOAT_VAR.defaultsFloat = 0.01;
// @"defaults.var".defaultsFloat = 0.01; // Do not use
```

2.ラッパークラス経由

```objectivec:
@interface Wrapper : NSObject
@property BOOL hoge;
@end

@implementation Wrapper

- (BOOL)hoge
{
    return @"hoge".defaultsBool;
}

- (void)setHoge:(BOOL)hoge
{
    @"hoge".defaultsBool = hoge;
}

@end

Wrapper *wrapper = //;
wrapper.hoge = YES;
```
「第2回オフラインリアルタイムどう書くの問題」をPHPで解く

Bit Tetris
http://nabetani.sakura.ne.jp/hena/ord2/

配置済のテトリスです。
横に揃った行を削除して、消した結果を出力します。

```php
<?php
	class TETRIS{
		
		/**
		* テトリス
		* @param  String 「ff-2f-23-f3-77-7f-3b」みたいな文字列
		* @return String 「1f-03-00-1c-0d-0f-06」みたいな文字列
		*/
		public function get($input){
			// 入力
			$input = explode('-', $input);
			$arr = array_fill(0, 8, '');
			$arr2 = array_fill(0, count($input), '');
			$ret = '';
			
			// 横向きに切る
			foreach($input as $key=>$val){
				$tmp = sprintf('%08s', base_convert($val, 16, 2));
				for($i=0; $i<8; $i++){
					$arr[$i] .= $tmp[$i];
				}
			}
			// 揃ってるところは消えて落ちる
			foreach($arr as $key=>$val){
				if(strpos($val, '0')=== false){
					unset($arr[$key]);
					array_unshift($arr, str_repeat('0', strlen($val)));
				}
			}
			// 縦に戻す
			foreach($arr as $key=>$val){
				for($i=0; $i<strlen($val); $i++){
					$arr2[$i] .= $val[$i];
				}
			}
			// 文字列にして戻す
			foreach($arr2 as $key=>$val){
				$ret .= '-' . sprintf('%02s', base_convert($val, 2, 16));
			}
			return substr($ret, 1);
		}
	}
	
	// テスト
	$test = [
		['ff-2f-23-f3-77-7f-3b', '1f-03-00-1c-0d-0f-06'],
		['01', '00'],
		['00', '00'],
		['7a-4e', '0c-02'],
		['56-b6', '08-14'],
		['12-12-12', '00-00-00'],
		['de-ff-7b', '0a-0f-05'],
		['95-be-d0', '05-1e-20'],
		['7c-b0-bb', '1c-20-2b'],
		['7a-b6-31-6a', '3a-56-11-2a'],
		['32-0e-23-82', '18-06-11-40'],
		['ff-7f-bf-df-ef', '0f-07-0b-0d-0e'],
		['75-df-dc-6e-42', '35-5f-5c-2e-02'],
		['62-51-ef-c7-f8', '22-11-6f-47-78'],
		['0c-47-8e-dd-5d-17', '04-23-46-6d-2d-0b'],
		['aa-58-5b-6d-9f-1f', '52-28-2b-35-4f-0f'],
		['ff-55-d5-75-5d-57', '0f-00-08-04-02-01'],
		['fe-fd-fb-f7-ef-df-bf', '7e-7d-7b-77-6f-5f-3f'],
		['fd-fb-f7-ef-df-bf-7f', '7e-7d-7b-77-6f-5f-3f'],
		['d9-15-b5-d7-1b-9f-de', '69-05-55-67-0b-4f-6e'],
		['38-15-fd-50-10-96-ba', '18-05-7d-20-00-46-5a'],
		['fe-fd-fb-f7-ef-df-bf-7f', 'fe-fd-fb-f7-ef-df-bf-7f'],
	];

	$tetris = new TETRIS();
	foreach($test as $key=>$data){
		$answer = $tetris->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

言いたいことはわかる。
何回ループ回してんだよ。

見たかんじビット演算使えば即座に解けるような内容だと思うんですよね。
しかし私はビット演算が苦手(というかまともに勉強したことがない)ので、入力を横に切って全部1だったら消すという超絶力業での回答です。
いやはや酷いもんだ。

かかった時間は1時間くらい。
読み込み時のLoadingViewのシンプルな実装


シンプルな読み込み用View

読み込み中は、ユーザーにそのことを伝えておくとストレスが軽減されるため、多くのアプリでカスタマイズされたLoadingViewを表示しています。
標準的でシンプルなLoadingViewは以下の手順で簡単に実装できます。

また、非常に単純な実装にしてあるので、自分でいじってさらにリッチにカスタマイズすることも可能です。

サンプルプロジェクトは[こちら](https://github.com/EntreGulss/LoadingViewTest)からダウンロードしてください。

## 必要なファイル
* LoadingView.h
* LoadingView.m

## LoadigViewの初期化
**インスタンス変数を定義**

```ViewController.m
@interface ViewController ()
{   
    LoadingView *loadingView;           // 標準
    LoadingView *loadingViewWithTitle;  // カスタム
}
@end
```

**初期化（標準とカスタムの2つ）**

```ViewController.m
// デフォルトテキストで初期化
loadingView = [[LoadingView alloc] init];
loadingView.center = CGPointMake(self.view.center.x, self.view.center.y-40);
[self.view addSubview:loadingView];
    
// カスタムテキストで初期化
loadingViewWithTitle = [[LoadingView alloc] initWithTitle:@"処理中..."];
loadingViewWithTitle.center = CGPointMake(self.view.center.x, self.view.center.y-40);
[self.view addSubview:loadingViewWithTitle];
// 色をカスタム
loadingViewWithTitle.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.7];
```

**表示・非表示の切り替え**

```ViewController.m
// 表示
[loadingView show];
// 非表示
[loadingView hide];
```

※ 表示・非表示時には拡大縮小のアニメーションにより、ユーザーにとって何をしているかわかりやすいUXになっています。
CrashPlanをアーカイブ目的のクラウドストレージとして使う


##目的
あまり使わなくなったファイルをクラウドへアーカイブしたい

ってことでAmazonS3とかGlaicer、そしてこれから書くCrashPlanとかを調べてたんですが、なかなか「これがベスト！」というところに行き当たらないので、CrashPlanベースでちょっと考えてみます。

## CrashPlanとは

[CrashPlan](http://www.crashplan.com/)

クラウドバックアップサービスって感じですかねぇ。プランいろいろあるけど10台までOKなプランでも月額$9までは安くできます。

サービス名に「Crash」って言葉がはいってるところからも「いざというときのためのバックアップ」が主目的のサービスと思われる。

じっさい、GUIをみると、クラウドに保存されたファイルはバックアップ元のフォルダへ「リストア」する取り出し方になってます。

これだとアーカイブ目的にはちょっと使いにくい。

## CrashPlanをアーカイブ目的に使う

まずCrashPlanの設定で、バックアップからファイルを削除しない設定にする。

PCにアーカイブ用フォルダをつくる

アーカイブ用フォルダからCrashPlanでバックアップさせる

アーカイブ用フォルダの中身は定期的に古いファイルを削除するように[Hazel](http://www.noodlesoft.com/hazel.php)を設定しておく

あとは、「最近つかってないしもうアーカイブ送りでいっかー」って思えるファイルやフォルダがあったら、アーカイブフォルダへ移動すれば、自動的にCrashPlanでクラウドに保存され、しばらくするとローカルのファイルは削除されるはず。

アーカイブ用フォルダはCrashPlanへの中継フォルダって感じですね。

## もしかしたら…
homeフォルダまるごと上記の運用でもいいかもしれない。んーCrashPlan側でファイルの削除しないからゴミファイルがいっぱいバックアップされてうっとおしいかな。
LeiningenでRingサーバを起動するときにNo X11 DISPLAYと言われる

```bash
2013-09-19 05:25:36.345:INFO:oejs.Server:jetty-7.6.8.v20121106
2013-09-19 05:25:36.356:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3001
Started server on port 3001
Exception in thread "main" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
```

これはcompojure（の中のring）が勝手にブラウザを起動させようとしてるらしい. リモートで開発してる場合は余計な挙動なのでheadlessで起動する.

```bash
$ lein ring server-headless 3333
```

とすればok. 3333はポート番号.
stackoverflow.comへのサインアップの時に、facebookへのログイン、fb許可、stackoverflowの規約表示などのタイミングを調査

* stackoverflowのサインアップ画面
![stackoverflow_sign_up.png](https://qiita-image-store.s3.amazonaws.com/0/13451/2c2a0fd0-3912-40cc-5818-1572aa52086f.png)

* facebookロゴをクリックして、facebookログイン画面が出た
![fb_login.png](https://qiita-image-store.s3.amazonaws.com/0/13451/ceb6c24a-9ebd-23f4-9c14-edd9d0fa104d.png)

* facebookへログインした後に、許可画面が出た
![fb_許可.png](https://qiita-image-store.s3.amazonaws.com/0/13451/02009dcb-89b5-50d9-6486-3ff890ac519d.png)

* stackoverflow規約画面が出て、同意したら、サインアップ完成
![stackoverflow_規約.png](https://qiita-image-store.s3.amazonaws.com/0/13451/8711ef92-72f8-edaa-0d97-722add601aa3.png)

* stackoverflowとfacebookからログアウトして、再ログインすると、fb許可とstackoverflow規約画面が出たことがなし

## 結論
* fbログイン(-> fb許可) -> stackoverflow規約 の順だ
* 逆になると、まずいな

## 何でまずいか？请听下面分解
* 契约只有在用户首次登陆的时候，与服务方的签约
* 一旦签约完成，再次登陆的时候，就没有显示的必要
* 可如果在fb的OAuth之前显示，如何确定用户是否登陆过呢？
* 不能确定，所以必须在fb的OAuth完成之后，显示契约。
Haskellの基本まとめ1

## Haskellの特徴

* 純粋関数型プログラミング言語（⇔命令形プログラミング言語）
* 設定した変数の値は変更出来ない
* 同じ引数で呼ばれた関数は同じ結果を返す（**参照透明性**）
* 結果が必要になるまで関数を実行しない（**遅延評価**）
* 静的型付け言語
* コンパイラは型を自力で導き出す（**型推論**）
* エレガントで簡潔なコード

## Haskellの開発環境

* コンパイラ
  * GHC ( The Glasgow Haskell Compiler )
  * Haskell Platform ( GHC + Haskellライブラリ )
* 任意のテキストエディタ

### 1. 対話モードでの学習

#### 1-1 基本

* 対話モードの起動
  * `$ ghci`
* 対話モードの終了
  * `> :quit` or `> :q`
* スクリプトファイル(myfunction.hs)の読み込み（※ファイルはカレントディレクトリに）
  * `> :l myfunction.hs`
* スクリプトファイルの再読み込み
  * `> :l myfunction.hs` or `> :r`

#### 1-2 簡単な計算

Haskellでは、一般的な四則演算の優先順位に従って実行する。

```
> 1 + 1
2

> 200 - 110
90

> 11 * 11
121

> 5 / 2
2.5
```

#### 1-3 ブール代数

Haskellの真理値は、"True"と"False"がある。  
論理積( && )や論理和( || )、論理否定( not )のための演算子もある。  
値の比較には、"==" or "/=" を使う。

```
> True && False
False

> True && True
True

> False || True
True

> not False
True

> not (True && True)
False

> 5 == 5
True

> 1 == 0
False

> 5 /= 5
False

> "hello" == "hello"
True
```

#### 1-4 関数の呼び出し

中置関数：2つの引数で関数を挟む

```
// 中置関数の例
> 2 * 2
4
```

前置関数：関数名の後にスペースで区切って引数を書く

```
// 前置関数の例
> succ 8
9
```

前置関数を中置関数として呼び出す：関数をバッククオート( ` )で括る

```
// 下記は同じ意味
> div 10 2
> 10 `div` 2
```
date コマンドで N ヶ月先の月末の日付を取得する方法

```shell-session
date +'%Y-%m-%d' -d "1 days ago `date +%Y%m01 -d '+(N+1) month'`"
```

`date +%Y%m01 -d '+(N+1) month'` で (N+1)ヵ月先の初日が返ってきます。

`1 days ago` でその1日前の日付 = 月末の日付を参照することになります。

例 1: 来月の末日を取得したい場合

```shell-session
date +'%Y-%m-%d' -d "1 days ago `date +%Y%m01 -d '+2 month'`"
```

例 2: 今月の末日を取得したい場合

```shell-session
date +'%Y-%m-%d' -d "1 days ago `date +%Y%m01 -d '+1 month'`"
```

実行するとスクリーンショットのようになります。

![date_command.png](https://qiita-image-store.s3.amazonaws.com/0/6051/d75c261b-4f3f-2a0c-253b-df84dd53eefd.png)

動作確認は下記OSで行っています。
- Debian jessie
- CentOS 6
RubyからWordpressに投稿・削除・表示


``` 
# coding: utf-8
#
require 'time'
require 'xmlrpc/client'

def post
  user = 'admin'
  pass = 'password'
  post = 'post'
  date = Time.parse('2013/07/01 10:00')
  publish = 1 #0:下書き,1:公開 
  description = '内容'

  server = XMLRPC::Client.new('localhost', '/path/to/xmlrpc.php') #/(スラッシュ)は必須

  struct = {
    'title' => 'title',
    'categories' => ['カテゴリ１'],
    'description' => description,
    'dateCreated' => date
  }

  id = server.call("metaWeblog.newPost",1,user,pass,struct,publish)
  puts "Posted ID: #{id}"

  id = server.call("blogger.deletePost", "", id, user, pass, 1)
  puts "delete #{id}"

  id = server.call("blogger.getRecentPosts", "", "", user, pass)
  puts "#{id}"
end

post
```

- カテゴリごとの記事一覧はAPIにはなかった。フィードから取れるけど、ページ指定はできるのかな？


Wordpress ruby http://www.mk-mode.com/octopress/2012/06/18/18002033/
http://blog.bungu-do.jp/archives/619
http://lowlevellife.com/2010/10/ruby%E3%81%8B%E3%82%89xmlrpc%E3%81%A7wordpress%E3%81%AB%E6%8A%95%E7%A8%BF/
http://www.kantenna.com/pg/2010/05/wordpressxmlrpc.php

wordpress管理画面以外から http://ameblo.jp/linking/entry-11253888216.html
ブロックについてのあれこれ


## break, next, return

- next: 以降は実行せず、次のループを開始
- break: ループを抜ける。
- return: メソッドを抜ける

JavaScriptでいうと、next は continue に相当。
return するとブロックを抜けて、メソッドも抜けることに注意。

```
def block_next
  puts '----'
  (1..5).each do |i|
    next if i % 3 == 0
    puts i
  end
  puts 'end'
end

def block_break
  puts '----'
  (1..5).each do |i|
    break if i % 3 == 0
    puts i
  end
  puts 'end'
end

def block_return
  puts '----'
  (1..5).each do |i|
    return if i % 3 == 0
    puts i
  end
  puts 'end'
end

block_next
block_break
block_return
```

出力結果

	----
	1
	2
	4
	5
	end
	----
	1
	2
	end
	----
	1
	2


## ブロックの戻り値を指定する

break に引数を指定したら、ブロックの戻り値になる。

```
1.tap {|i| break i+1}
# => 2

1.tap {|i| }
# => 1
```
Pow


マニュアル
http://pow.cx/manual.html


## nodeアプリを実行

http://differential.io/blog/serve-ruby-on-rails-php-and-node-with-pow-pow

ポート3000番で動作してるとして、以下を実行。

	% echo 3000 > ~/.pow/nodeapp

http://nodeapp.dev/ でアクセスできる。

## 同じLAN内の別PCからアクセスする

http://appname.dev/ なら
http://appname.192.168.0.2.xip.io/ とかで。

http://pow.cx/manual.html#section_6



## Rails 一時的にproductionにする

.powenvファイルを作る

``` #{Rails.root}/.powenv
export RAILS_ENV=production
```

## Apacheと共存する

毎回 powder down, powder up するという方法があるが面倒。
http://thelucid.com/2012/03/11/using-both-pow-and-apache-on-osx-lion/

マニュアルに設定方法がのってある。

まず、Apacheの proxy_module と proxy_http_module が有効でなければ、有効にする。

次に [Running Pow with Apache](https://github.com/37signals/pow/wiki/Running-Pow-with-Apache) に書いてある通りに、以下をガガッと実行

```
$ curl get.pow.cx/uninstall.sh | sh #if you have pow installed
$ echo 'export POW_DST_PORT=88' >> ~/.powconfig
$ sudo curl https://raw.github.com/gist/1058580/zzz_pow.conf -o /private/etc/apache2/other/zzz_pow.conf
$ sudo apachectl restart
$ curl get.pow.cx | sh
```

以上でOKです。

途中、

> [warn] proxy: No protocol handler was valid for the URL /portal. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.


こんなエラーが出ましたが、proxy_http_module が有効になってないだけでした。



## powder

便利なやつ

```
$ gem install powder
$ cd /path/to/rails/
$ powder link
```
円周上のCrossing

どういうわけか入力がC/C++/Java用なので、採点プログラムを
https://github.com/cielavenir/procon/commit/38b0ad5bedaefc507fb32b5b5866046a51ddad50
に用意しました…。

```rb:hena14pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42
#http://nabetani.sakura.ne.jp/hena/ord14crosscircle/
STDOUT.sync=true
while gets
	l=$_.chomp.split('')
	a=l.uniq.map{|e|
		l.each_with_index.select{|f|e==f[0]}.map{|f|f[1]}
	}
	# aabbca1bcb -> [[0, 1, 5], [2, 3, 7, 9], [4, 8], [6]]
	n=0
	a.size.times{|i|
		# a[i]角形の対角線の交点の個数はa[i]C4
		n+=(a[i].size-3..a[i].size).reduce(:*)/24 if a[i].size>3
		(i+1).step(a.size-1){|j|
			a[i].combination(2){|c,d|
				a[j].combination(2){|e,f|
					e_inside=c<e&&e<d
					f_inside=c<f&&f<d
					n+=1 if e_inside^f_inside
				}
			}
		}
	}
	puts n
end
```
さくらVPS（CentOS）にPassenger+Apache+Sinatra


###1.Passengerのインストール

```
% gem install passenger
```

###2.PassengerのApacheモジュールのインストール

```
# モジュールのインストールに必要なものをインストール
# 自分の環境ではこの４つがなかった
% yum install curl-devel

% yum install httpd-devel

% yum install apr-devel

% yum install apr-util-devel

# passengerのapacheモジュールのインストール
% passenger-install-apache2-module
```

インストール後、以下のコマンドを実行。

```
% passenger-install-apache2-module --snippet

# 以下をPassengerの設定で使うので、メモ
LoadModule passenger_module /home/masa2sei/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/passenger-4.0.18/buildout/apache2/mod_passenger.so
PassengerRoot /home/masa2sei/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/passenger-4.0.18
PassengerDefaultRuby /home/masa2sei/.rbenv/versions/1.9.3-p194/bin/ruby
```

###3.Passengerの設定

`/etc/htpd/conf.d`の下にpassenger.confを以下の内容で作成。
※作成するファイルは拡張子が.confなら、何でもいい。

```/etc/httpd/conf.d/passnger.conf
# 2でメモったメッセージ
LoadModule passenger_module /home/masa2sei/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/passenger-4.0.18/buildout/apache2/mod_passenger.so
PassengerRoot /home/masa2sei/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/passenger-4.0.18
PassengerDefaultRuby /home/masa2sei/.rbenv/versions/1.9.3-p194/bin/ruby

# Passengerが追加するHTTPヘッダを削除するための設定。
Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"

# この辺の設定は必要なら
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
```

```
# Apacheの文法チェック
% apachectl configtest
Syntax OK
```

Apacheの再起動

```
% service httpd restart
```

###4.VirtualHostの設定
`/etc/httpd/conf.d/passnger.conf`に以下を追記。

```/etc/httpd/conf.d/passnger.conf
------------------略------------------

<VirtualHost *:80>
  # ドメイン
  ServerName 自分のドメイン
  # sinatraアプリのルート
  DocumentRoot "/var/www/apps/sinatra/sinatra_sample/public"
  RackEnv production
</VirtualHost>
```
`/etc/httpd/conf/httpd.conf`を編集し、VirtualHostを有効にする。

``` /etc/httpd/conf/httpd.conf
# コメント解除
# NameVirtualHost *:80
NameVirtualHost *:80
```

Apacheの再起動

```
% service httpd restart
```

###5.Sinatraアプリの作成
sinatra.confで指定したsinatraアプリのルートディレクトリの下に以下のようなファイルとディレクトリを作成。
`public`、`tmp`ディレクトリの中はとりあえず、空でOK。

```
sinatra_sample
		|
		ー config.ru
		|
		ー hello.rb
		|
		ー public/
		|
		ー tmp/
```

```sinatra_sample/hello.rb
require 'sinatra'

get '/' do
  'Hello World!'
end
```

```sinatra_sample/config.ru
require File.expand_path(File.dirname(__FILE__)) + '/hello'
run Sinatra::Application
```

##参照
・[さくらVPS/CentOS 6.3 Passengerのインストール手順[Apache][Railsサーバへの道]](http://morizyun.github.io/blog/passenger-install-apache-ruby-rails/ "さくらVPS/CentOS 6.3 Passengerのインストール手順[Apache][Railsサーバへの道]")
・[Linux（CentOS）のApache＋PassengerでRuby on Railsを動かす](http://itmemo.phpapps.jp/linux-centos-apache-passenger/ "Linux（CentOS）のApache＋PassengerでRuby on Railsを動かす")
・[ModularStyleのSinatraをPassengerで公開](http://qiita.com/doima_/items/5ae755d53183eca9d0ca "ModularStyleのSinatraをPassengerで公開")