OmniAICreator/Qiita-1.07M huggingface dataset:
Sassのよく使いそうな関数まとめ



```scss:_function.scss

// ------  YUIのフォントサイズ指定変数
// ex) font-size: $fs10;
// Output→  font-size: 77%;
$fs8: 63%;
$fs9: 70%;
$fs10: 77%;
$fs11: 85%;
$fs12: 93%;
$fs13: 100%;
$fs14: 108%;
$fs15: 116%;
$fs16: 123.1%;
$fs17: 131%;
$fs18: 138.5%;
$fs19: 146.5%;
$fs20: 153.9%;
$fs21: 161.6%;
$fs22: 167%;
$fs23: 174%;
$fs24: 182%;
$fs25: 189%;
$fs26: 197%;
$fs27: 207.7%;
$fs28: 215.4%;
$fs29: 223.1%;
$fs30: 230.8%;
$fs48: 369.2%;


// ------  背景指定
// ex) bg(path/to/hoge.jpg, lt, no);
// Output→ 
//   background-image: url(path/to/hoge.jpg);
//   background-position: left top;
//   background-repeat: no-repeat;

@mixin bg($path, $pos : "lt", $repeat : "no", $size: 'n'){

    // ------ パス
    @if $path == "n" {
    } @else if $path == "no" {
    } @else {
        background-image: url(#{$path});
    }

    // ------ ポジション
    @if $pos == "lt" {
        $pos : 'left top';
    } @else if $pos == "rt" {
        $pos : 'right top';
    } @else if $pos == "lb" {
        $pos : 'left bottom';
    } @else if $pos == "rb" {
        $pos : 'right bottom';
    }
    background-position:#{$pos};

    // ------ リピート
    @if $repeat == "no" {
        $repeat : 'no-repeat';
    } @else if $repeat == "n" {
        $repeat : 'no-repeat';

    } @else if $repeat == "np" {
        $repeat : 'no-repeat';

    } @else if $repeat == "x" {
        $repeat : 'repeat-x';
    } @else if $repeat == "rx" {
        $repeat : 'repeat-x';
    } @else if $repeat == "y" {
        $repeat : 'repeat-x';
    } @else if $repeat == "ry" {
        $repeat : 'repeat-x';
    }
    background-repeat:#{$repeat};

    // ------ サイズ
    @if $size == "no" {
    } @else if $size == "n" {
    } @else {
        -webkit-background-size: $size;
             -o-background-size: $size;
                background-size: $size;
    }
}

// ------ clearfix
@mixin clearfix{
     *zoom: 1;
     &:after {
          content: ".";
          display: block;
          clear: both;
          height: 0;
          visibility: hidden;
     }
}

// ------  aタグに高さが出るときに使う
@mixin listNoHeight (){
    line-height: 0;
    font-size:0;
}

// ------  透明度IE対応
@mixin opacity ($aOpacityNum) {
    opacity: #{$aOpacityNum};
    filter: alpha(opacity=($aOpacityNum * 100));
}

// ------  ポジション省略
@mixin pos ($left:0,$top:0){
    position: absolute;
    left: #{$left}px;
    top: #{$top}px;
}

```
##おまけ（textExpander）

###@include記述を省略する。
最近「@include 関数();」を打つのが辛くなってきたのでショートカット

``` text:textExpander
// 呼び出し ;safunc
@include %filltext:name=関数名%();
```

###フォントサイズ指定するの辛い
Hayaku + ショートカット + Sass変数使ってても辛いので、
もっとショートカット。

``` text:textExpander
// 呼び出し ;safs
font-size: $fs%filltext:name=フォントサイズ%;
```
twitter apiでつぶやけなかった時の解決策メモ

twitterOauthでツイートする際にくだらない事で嵌ったのでメモ。


## 現象
twitterで認証して戻ってくるcallbackurlでは、statuses/updateを使ってツイートできる。
しかし、oauth_tokenとoauth_token_secretをCookieに保存して、別ページでstatuses/updateをすると、Invalid or expired token [code] => 89 がでて投稿できない。

## 原因
Callbackurlで使えたoauth_tokenとoauth_token_secretは別ページに行くと使えなくなる。
$access_token内にあるtokenを保存しなければならない。

## コード
ポイント部分だけ。

```php:qiita.php

$tw = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET,
$_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

//アクセストークン所得
$access_token = $tw->getAccessToken($_REQUEST['oauth_verifier']);

//oauth_tokenとoauth_token_secret所得
$oauth_token=$access_token['oauth_token'];
$oauth_token_secret=$access_token['oauth_token_secret'];

//保存
setcookie("oauth_token",$oauth_token,time()+3600,'/');
setcookie("oauth_token_secret",$oauth_token_secret,time()+3600,'/');

$message = 'test';
 
//投稿
$tw->post('statuses/update', array('status' => $message));
```
C++で「あ、このコードあかん」という兆候を集める

人のコードを扱ってると「あ、これはちょっとあかんコードだ」と気づく時がある。設計かコーディングかにこだわらず書き連ねていく。実は過去に自分がやらかした例もある。

できるだけ簡潔な箇条書きになることを目指す。それぞれ単発の記事にするには短いのでちょいちょい更新していく。

この記事でアプリケーションコードとはライブラリやフレームワークを使う側のコードを指し、ライブラリコードとはライブラリやフレームワークを提供する側のコードを指している。

# STLのコンテナを使わず自分でリストなどのデータ構造を実装している
設計の領域。単に連結リストが使いたいという動機で自分で実装すべきではない。
実装・メンテナンスのコストが得られるパフォーマンスに見合わない。
加えてコードを引き継いだ者が非標準のデータ構造のインターフェースと実装を理解するコストが発生する。

# 参照型がローカルに宣言されている、参照型を変数に別名をつけるのために使用している
参照型はライフタイムが尽きたインスタンスを参照する可能性がある。

```cpp

std::string get_some_string()
{
  // 簡単な例
  std::string& head = long_long_name_string_vector[0]; // 長いし名前を付け替えておこう

  /*
    いろいろな処理
  */

  long_long_name_string_vector.clear(); // さよなら long_long_name_string_vector[0]

  return head; // アウト。headの参照先はすでに存在しない。
}
```

基本的に参照型は（lvalue reference、rvalue referenceともに）関数のインターフェース（引数、戻り値）においてのみ現れるべきである。少なくともアプリケーションコードでローカルに参照型を宣言する合理的なシチュエーションはない。

# アプリケーションコードでnewが使用されている
メモリの確保はクラスを提供する側が行うべきである。
アプリケーションコードのクラスがインスタンスを保持したい場合、実体で保持するか、std::make_sharedを使用する。

# ローカル変数の宣言が関数の冒頭のみで行われている
実装の問題。Cの癖が抜けていない。コードの読みやすさの観点と（一応）速度の観点から害悪。
変数は必要になった時に必要なスコープの中で宣言すべきである。

```cpp
void func(int a, int b)
{
  int i; // iの説明
  int foo; // fooの説明
  int bar; // barの説明

  /*
    ...
  */
  foo = sub_func(); // 「fooの型ってなんだったっけ・・・？」「そもそもfooはなんだっけ・・・？」

  for(i = 0; i < 10; ++i)
  {
    bar = sub_func2();
    // 「barはもういらないんだけど宣言どこだ？」「forの外で使われていないか？」
    // 「値を上書きして大丈夫なのか？」
  }

  /*
    ...
  */
}
```


# メンバ変数という名前のクラス内グローバル変数
気が向いたら書く

# メンバ関数を実行した結果を別のメンバ関数で取り出させている。

設計の問題。

```cpp
ObjectDetector detector;

detector.detect(input);

Objects objects = detector.getResult();
```

_detector_ が状態を持つことになり _detect()_ がconstでなくなる。したがって _ObjectDetector_ のconst参照渡しができなくなる。またマルチスレッド化がめんどくさくなる。

クラスに状態を持たせるのはデータを表すクラス、またはリソースだけに止める。

っつーかそもそも計算だけならクラスじゃなくて関数でいいじゃん、という話ではある。

# オブジェクトをvoid*で渡す

```cpp
result_t some_function(void* p_Obj)
{
  some_class* sc_p = (some_class*)p_Obj;

  // ...

  return sc_p->some_action();
}
```

意味わからん。
大貧民(2012.11.9の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの20日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord5dahimi/ にあります。

```hs
module Doukaku.PoorMan (solve) where
import Data.Char (isDigit, digitToInt)
import Data.List

data Card = C Char Char | J deriving (Show)

instance Eq Card where
  J == J = True
  C _ n1 == C _ n2 = n1 == n2
  _ == _ = False

instance Ord Card where
  _ <= J = True
  C _ n1 <= C _ n2 = pow n1 <= pow n2
    where
      pow 'T' = 10
      pow 'J' = 11
      pow 'Q' = 12
      pow 'K' = 13
      pow 'A' = 14
      pow '2' = 15
      pow n | isDigit n = digitToInt n
      pow x = error $ "Unknown card: " ++ x : []
  _ <= _ = False

showC :: Card -> String
showC J = "Jo"
showC (C s n) = s:n:[]

showCs :: [Card] -> String
showCs = intercalate "" . map showC

showCss :: [[Card]] -> String
showCss [] = "-"
showCss css = intercalate "," . map showCs $ css

solve :: String -> String
solve input = showCss . filter (isSuitable fs) . pickCards (length fs) $ hs
  where
    (field, _:hand) = break (== ',') input
    fs = parse field
    hs = parse hand

parse :: String -> [Card]
parse ('J':'o':xs) = J : parse xs
parse (s:n:xs) = C s n : parse xs
parse _ = []

powerOfCards :: [Card] -> Card
powerOfCards cards = if null notJ then J else head notJ
  where
    notJ = filter (/= J) cards

isSuitable :: [Card] -> [Card] -> Bool
isSuitable fs hs = issamecards && powerOfCards fs < powerOfCards hs
  where
    notJ = filter (/= J) hs
    issamecards = if null notJ then True
                               else all (issame . head $ notJ) (tail notJ)
    issame (C _ n1) (C _ n2) = n1 == n2

pickCards :: Int -> [Card] -> [[Card]]
pickCards 0 _ = [[]]
pickCards _ [] = []
pickCards n (c:cs) = fmap (c :) (pickCards (n - 1) cs) ++ pickCards n cs
```

手数が必要な問題で、1時間で解くのは大変です。特にジョーカーの扱いには注意が必要です。また、歴代の問題で唯一答えが一意ではない問題であり、単体テストはそのことを意識して書かなければなりません。実装は場の枚数と同じ枚数のカードの組を総当りして、出せるカードのみ出力する戦略をとりました。

この回答では`Card`を`Ord`のインスタンスに気軽にしたのですが、このクラスは`Eq`の実装を引き継ぐため、例えばハートの4とスペードの4の同値関係はどうなるのかというところでかなりハマりました。`Eq`を自前で実装して対応しましたが、これだと`Eq`の意味を殺してしまうので、本来は`Ord`のインスタンスにすべきではなさそうです。

http://qiita.com/items/5c10c132e1f78131563f に他の方の回答もありますので、見ると参考になるでしょう。
(malloc/freeを用いた) デバッグ用 allocator

```cpp
#include <cstdio>
#include <cstdlib>
#include <new>
#include <typeinfo>

namespace epi {

  template<typename T> struct mallocator {
    typedef T value_type;
    template<typename U> mallocator(const mallocator<U>&) {}

    mallocator() {}
    bool operator==(const mallocator&) const{ return true;  }
    bool operator!=(const mallocator&) const{ return false; }

    T* allocate(const size_t n) const {
      if ( n == 0 ) 
        return nullptr;
      if (n > static_cast<size_t>(-1) / sizeof(T) )
        throw std::bad_array_new_length();
      void* pv = std::malloc(n * sizeof(T));
      if ( !pv )
        throw std::bad_alloc();
      printf("%d %s MALLOC : %p\n", n, typeid(T).name(), pv);
      return static_cast<T*>(pv);
    }

    void deallocate(T* const p, size_t n) const {
        printf("%d %s FREE :   %p\n", n, typeid(T).name(), p);
        std::free(p);
    }

    void construct(T* p, const T& val) { new ((void*)p) T(val); }

    void destroy(T* p) { p->T::~T(); }

    template<typename Other> struct rebind {
        typedef mallocator<Other> other;
    };
  };

}

/*
 * おためし
 */
#include <vector>
#include <string>
#include <iostream>

// epi::mallocator を使った vector と string (alias templates)
template<typename T> using my_vec = std::vector<T, epi::mallocator<T>>;
template<typename T> using my_str = std::basic_string<T, std::char_traits<T>, epi::mallocator<T>>;

using namespace std;

int main() {
  my_vec<int> vi;
  my_vec<my_str<char>> vs;
  vi.emplace_back(1); vi.emplace_back(2); vi.emplace_back(3);
  vs.emplace_back("one"); vs.emplace_back("two"); vs.emplace_back("three");
  for (int n : vi) { cout << n << ' '; } cout << endl;
  for (my_str<char> s : vs) { cout << s << ' '; } cout << endl;
}

/* 実行結果: (Visaul C++ 2013)
1 int MALLOC : 00B3B1D0
2 int MALLOC : 00B3B0E0
1 int FREE : 00B3B1D0
3 int MALLOC : 00B37B18
2 int FREE : 00B3B0E0
1 class std::basic_string<char, struct std::char_traits<char>, struct epi::mallocator<char> > MALLOC : 00B34F58
2 class std::basic_string<char, struct std::char_traits<char>, struct epi::mallocator<char> > MALLOC : 00B37810
1 class std::basic_string<char, struct std::char_traits<char>, struct epi::mallocator<char> > FREE : 00B34F58
3 class std::basic_string<char, struct std::char_traits<char>, struct epi::mallocator<char> > MALLOC : 00B3AF18
2 class std::basic_string<char, struct std::char_traits<char>, struct epi::mallocator<char> > FREE : 00B37810
1 2 3
one two three
3 class std::basic_string<char, struct std::char_traits<char>, struct epi::mallocator<char> > FREE : 00B3AF18
3 int FREE : 00B37B18
*/
```
Amazon RDS のスケールアップ


* 本日、弊社ではオフラインメンテナンスを行い、データベースサーバのスケールアップを行った次第ですよ。
* んで、色々あったので、<del>恥をさらしてみる。</del> <ins>ハマった事案を共有してみる。</ins>

# 概要

* Master サーバのクラスを m1.small から m1.large に上げる。
	* RDBMS は MySQL 5.5 系
	* Read Replica は 2 台
	* Master の Availability Zone は ap-northeast-1b
	* 大人の事情で Multi-AZ にしていない (´･ω･`)
	* あ、ちなみに「そもそも m1.small とか NE-YO!!!」ってツッコミは MySQL Casual の時に散々受けてますので、以下その話題禁止ｗ
* ダウンタイムは最大2時間を予定。
* 勿論、夜中 (27:00〜29:00) に実施。

# 計画

* 普通に AWS Management Console から Modify でクラスを変更するだけの簡単なお仕事。
* 「ダウンタイムはせいぜい10分とかだろ。」

# 実際

* 世の中、そんなに甘くはないっすね！
* 10分どころか、余裕で1.5時間掛かっちゃいましたよ。ええ。
* まぁ、事前調査・検証が足りてなかったのが諸悪の根源なわけですが。

# 事象 / 其の壱

## ハマったコト

* プルダウンから m1.large を選択して Apply Immediately にチェックして実行！
* **Cannot modify the instance class because there are no instances of the requested class available in the current instance's availability zone. Please try your request again at a later time.**
* 「………え？」
* どうやら、ap-northeast-1b では m1.large を選択出来ない様子。
* 「マジかよ！！！」
* 詳しい情報は調べ切れていないが、Availability Zone 単位に選択出来るクラスに制限というか上限があるっぽい。
	* ちなみに、m1.medium もダメだった。
	* 大人の事情的に m1.xlarge とかは試してない。

## やったコト

1. m1.large として既存の Master サーバの Read Replica を作る。
1. 新しい Master 候補のサーバを Promote Read Replica で昇格させる。
1. 廃止予定の Master サーバの DB Instance Identifier を変更して避難させる。
	* この間、サービスダウン。
1. DB Instance Identifier を元々の名前にする。

# 事象 / 其の弐

## ハマったコト

* Read Replica の作成から〜の〜、Promote Read Replica までは普通に進む。
* んで、いざ Promote した Master 候補の状態を見てみると…。
* 「ありゃ？ Read Replica が 1 台も居ない…？」
* まぁ、そりゃ冷静に考えてみたら、Promote したインスタンスは完全に独立した Master サーバになるわけで、既存の Read Replica が付いてきてくれるワケないっすよねー！
	 * どこまでレプリケーションしたか、とかその辺の情報がズレるわけだから、あたりまえ体操。

## やったコト

1. 新しく作った Master 候補をベースにした Read Replica を 2 台 (元々の台数分) 作成。
1. 既存の DB サーバ群 (3台) の名前を退避。
1. 新規の DB サーバ群 (3台) の名前を元々の名前にする。

# 結果

* 上記二つの「やったコト」のお陰で、どうにかメンテナンスを終了させることが出来た。
* なお、元々ミッションクリティカルなデータ書き込みが存在しないような状態にしてあったので、End Point の名称切り替え中などに大きな問題は起きず。
	* いや、「そういう問題じゃないっしょ！」ってお話しなのは重々承知してますよ。ええ。

# 結論

* 事前の調査と検証はしっかりやりましょう。
* そもそもの考え方として、既存のサーバ群のクラス変更とかは行わずに、新規に同等のサーバ群を作成して、向き先をガツッと切り替える方法を採るのが正解だったかも。
* こういった Ops 系の上手な運用ノウハウとか学ばないとなぁ…。
地元の 5374 を、自前サーバを用意せずに github pages で公開する手順

# 1. [github](https://github.com) のアカウントを作る
まだ作ってない人は今すぐ作りましょう! 今後もいろいろと役に立つはずです。
# 2. 5374 プロジェクトを Fork する
[code for Kanazawa](https://github.com/codeforkanazawa-org/5374) のページ右上のボタンをクリックすると、ご自分の github アカウントに 5374 リポジトリがコピーされます。
(実際、単なるコピーなのですが、どの時点から「枝分かれ」したか、の情報が github サーバに残るので Fork と呼んでいます)
Fork を実行する前に、Forkボタン右隣の数字をクリックしてみましょう。既に枝分かれしたリポジトリ群を見ることが出来ます。

![codeforkanazawa-org_5374-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/1610/187862ac-112f-86b6-7041-edf04b76d777.jpeg "codeforkanazawa-org_5374-5.jpg")

# 3. gh-pages ブランチを選択する
gh-pages は github が定めたルールで、この名前のブランチはwebに公開されます。

![kuboon_5374-9.jpg](https://qiita-image-store.s3.amazonaws.com/0/1610/9b4079b9-0658-62fe-0c45-a9fd809c0d96.jpeg "kuboon_5374-9.jpg")

# 4. データを閲覧
5374ではどのようにデータを持っているのかを見てみましょう。
dataディレクトリを開くと 4 つの csv ファイルが見えると思います。
どれでも1つ開いてみましょう。テーブルが見えますね？これは github の親切機能の1つで、実際にはこのファイルは カンマ区切りのテキストファイルですが、githubさんがテーブルに整形してくれています。
4つのcsvファイルを全て閲覧して、どのように地元の情報を当てはめればいいか見当をつけてください。表の一行目は変更出来ません。

# 5. データを編集
いよいよ編集です。ついに git と戦う時が来た、と身構える必要はありません。(いずれ戦うべきですが、今日のところは大丈夫。)
よく見ると、EDIT ボタンがありますね。
![5374_data_target_csv_at_master_·_kuboon_5374-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/1610/71556ecf-07c2-2c74-fb44-81113f03199e.jpeg "5374_data_target_csv_at_master_·_kuboon_5374-3.jpg")
さて、EDITボタンをクリックすると、さっきまで表示されていた表が csv として編集可能になるはずです。これを直接編集すると何かと不具合に悩まされるので、一旦テキストエディタにコピーするなり、 LibreOffice に貼り付けるなりして、内容を編集し、再び csv として上書きするのがお勧めです。最後に、下の方にある “Commit Changes” をクリックするとサーバに変更が保存されます。

# 6. 確認
では早速、 http://あなたのアカウント.github.io/5374/ にアクセスしてみてください。(反映に10分程度時間がかかることもあるみたいです)

簡単でしたね！

# 7. 終わりに
Civic Tech にどんな方々が集まっているのかあんまり良くわかってないのですが、非ギークの方も少なからずいらっしゃるようなので、いささか冗長に説明してみました。
Gitは使い始めはわけわからんと思いますが、これも慣れです。5374はデータが綺麗に分離しているので、練習にはちょうど良いですね。

コーディングが全くわからなくても civic tech に貢献出来る事は沢山あります。ですが、分かるようになれば、そこにもっと広い世界が開けているのを見ることが出来ます。
github も git も、開発者だけに使わせておくのはもったいないくらい素晴らしいシステムです。(実際、世界の civic tech ムーヴメントを引き起こしたきっかけの１つと言えるでしょう)
civic tech を通して、新たな civic hacker がどんどんと増えていくのを願っています。
FreeBSDのportsでインストールしたアプリケーションの脆弱性情報を調べる

FreeBSDを使っているとソフトウェアのインストールにはportsを使っていることでしょう。FreeBSDでは、portaudot(1)を使うことで、portsでインストールしたソフトウェアの脆弱性情報を手軽に調査することができます。

## インストール
ports-mgmt/portauditにありますのでいつもの方法でインストールしてください。

## 脆弱性情報を調べる

portaudit(1)を「-Fda」オプションと共に実行します。「-F」は脆弱性データベースをサーバーから取得、「-d」はデータベースを作成した日時を表示、「-a」は全てのインストール済みソフトウェアを対象とするオプションとなります。

```shell-session
$ sudo /usr/local/sbin/portaudit -Fda
auditfile.tbz                                 100% of   91 kB  269 kBps
New database installed.
Database created: Wed Dec 18 01:00:00 JST 2013
Affected package: subversion-1.8.4
Type of problem: subversion -- multiple vulnerabilities.
Reference: http://portaudit.FreeBSD.org/e3244a7b-5603-11e3-878d-20cf30e32f6d.html

1 problem(s) in your installed packages found.

You are advised to update or deinstall the affected package(s) immediately.
$
```

どうやらsubversionに脆弱性があるようです。更なる情報を得るために、出力結果にあるリファレンスのURL http://portaudit.freebsd.org/e3244a7b-5603-11e3-878d-20cf30e32f6d.html にアクセスするとmod_dontdothat、mod_dav_svnに脆弱性があるようです。これらを使っている場合はアップグレードした方がよさそうですね。

## 定期的な実行

ports-mgmt/portauditをインストールするとperiodic用のファイルもインストールされます。

/usr/local/etc/periodic/security/410.portauditを読めばわかりますが、デフォルトでportaudit(1)を実行するようになっていますので、当然periodicを活用している皆さんは安心ですね。

## まとめ

* FreeBSDではportaudit(1)でportsの脆弱性情報を取得できる
* 「-Fda」オプションで実行すると良い
* periodic用のファイルも生成されるので安心

ディストリビューション/パッケージマネージャー Advent Calendar 2013の21日目の担当は[bleuscrさん](http://qiita.com/bleuscr)で、NixOSの話題になる予定です。よろしくお願いします。
プレースホルダで「= ?」と「IS NULL」に同時に対応する方法

# こんなとき、あなたならどうする？

プレースホルダにバインドされる値が  **文字列** 、 **NULL** の2通りあって、どちらにも対応してSQLを発行しなければならないとき。

これらのケースは動作します。

```sql
SELECT * FROM test WHERE hoge = 'yeah'
```

```sql
SELECT * FROM test WHERE hoge IS NULL
```

ところがこれらは動作しません。

```sql
SELECT * FROM test WHERE hoge IS 'yeah'
```

```sql
SELECT * FROM test WHERE hoge = NULL
```

さてどうしましょう？

## 解決策1

プリペアドステートメントの生成時点で場合分けすればOK。

```php
$array = array('yeah', null);
$value = $array[array_rand($array)];

$holder = $value === null ? 'IS NULL' : '= ?';
$stmt = $pdo->prepare("SELECT * FROM test WHERE hoge {$holder}");
$value === null ? $stmt->execute() : $stmt->execute(array($value));
```

## 解決策2

**spaceship** (宇宙船) っていうカッコイイ名前の演算子があるようです。

![ss (2013-12-20 at 04.01.19).png](https://qiita-image-store.s3.amazonaws.com/0/25060/5e4d3c5e-5007-4e74-0063-d6699e1a37ac.png)

**[MySQLマニュアル](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html)** を見てみると・・・

![ss (2013-12-20 at 04.00.20).png](https://qiita-image-store.s3.amazonaws.com/0/25060/45ea05d4-18f0-10ca-6667-4ed843cd217d.png)

**NULL-Safe** だって！これはもう使うしかない！

```php
$array = array('yeah', null);
$value = $array[array_rand($array)];

$stmt = $pdo->prepare("SELECT * FROM test WHERE hoge <=> ?");
$stmt->bindValue(1, $value, $value === null ? PDO::PARAM_NULL : PDO::PARAM_STR);
$stmt->execute();
```

これいいですね・・・！
[Twitter]アイコン画像URLをサイズ別に取得する


まず、RESTAPIかなにかでアイコン画像URLを取得する
`TwitterRESTAPIのアカウント情報取得`
https://dev.twitter.com/docs/api/1.1/get/users/show

上記リンク先のExample Requestの戻り値6行目に
 "profile_image_url": "http://a0.twimg.com/profile_images/1777569006/image1327396628_normal.png”
となってるので、こいつを例に。

http://a0.twimg.com/profile_images/1777569006/image1327396628_normal.png

↑のリンクの末尾、_nomalを書き換えることで画像の大きさを変更できる

`もっと小さくしたい場合→_mini`
http://a0.twimg.com/profile_images/1777569006/image1327396628_mini.png

`もっと大きくしたい場合→ _bigger`
http://a0.twimg.com/profile_images/1777569006/image1327396628_bigger.png

`さらに大きくしたい場合→_以降無し`
http://a0.twimg.com/profile_images/1777569006/image1327396628.png

Webサービスやアプリつくるときは基本最後のやつから画像取得してます。

`Facebookはこちら`
http://qiita.com/stkn_bb/items/b0496b2e0e54efc0e9f5
UnityでバランスWiiボードを使う方法について

この記事は[Oculus Rift Advent Calender](http://atnd.org/events/45316)の20日目です。

第一回[Oculus Game Jam](http://www.oculusgamejam.jp/blog/)で作成した「VR エ○レカ」に利用したAssetについてご紹介いたします。

#[WiiBuddy](http://u3d.as/3yb)
__※Windowsでは利用できないのでご注意ください。__
__※利用にはUnity Proのライセンスも必要となります。__

Macでしか利用できませんが、調べた範囲では一番簡単に
バランスWiiボードをUnityで利用できるAssetではないかと思われます。

 バランスWiiボードだけでなく、Wiiリモコンやヌンチャク、
ギターヒーローのギターコントローラーも利用できるようですが、
動作確認をおこなえたのはバランスWiiボードとWiiリモコンのみです。

ギターコントローラーやドラムセットを利用したゲームを考えてる方がいましたら、
このAssetがあることを思い出して頂ければと思います。

#使い方
AssetをImportしてDemonsrationシーンを再生すると、
コントローラーをペアリングするための画面が表示されます。

画面左上の「Find」ボタンを押すと一定時間コントローラーのペアリングが行われます。

※PCのBluetoothが有効になっているのを確認してください。

###ペアリング画面
![スクリーンショット 2013-12-20 3.02.47.png](https://qiita-image-store.s3.amazonaws.com/0/23814/ed5fdc31-63da-9489-8ae1-9acfdac1cfe9.png)

####Wiiリモコンをペアリングした状態
![スクリーンショット 2013-12-20 3.08.47.png](https://qiita-image-store.s3.amazonaws.com/0/23814/f8b46a75-d26a-c870-262e-4fa12f37701d.png)

####バランスWiiボードをペアリングした状態
![スクリーンショット 2013-12-20 3.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/23814/1beec58a-9949-9eab-ff91-43f519e4f80b.png)

後は同梱のAPI.txtを参考にスクリプトをバリバリ書けばOKです！

#終わりに
Oculusでは視界が全て覆われてしまうため、
実際の体の動きに合わせて利用できるコントローラーが入力装置として
望ましいのではないかと思います。

その点Wiiのコントローラーは家電量販店でも購入できるため入手しやすく、
中古であれば価格も手頃なことが多いので、アプリ作成時の選択肢として
オススメさせて頂きます。

次のOculus Advent Calender21日目は[@yuujii](https://twitter.com/yuujii)さんです。
よろしくお願いします。
[Facebook]アイコン画像URLをサイズ別に取得する


※リンク内のsatoukentaは僕のIDなので適宜読み替えてね

https://graph.facebook.com/satoukenta/picture?type=large
https://graph.facebook.com/satoukenta/picture?type=normal
https://graph.facebook.com/satoukenta/picture?type=small

↑上にいくほど大きい（GETパラメータのtypeを見てね）

この方法だと、縦長、横長の画像をプロフィール画像に設定している人のアイコンを正方形で取ってこれないので、

https://graph.facebook.com/satoukenta/picture?type=square

とする。（type=square!）
けど、サイズ小さいよね・・・。

そこで、

https://graph.facebook.com/satoukenta/picture?width=320&height=320

とやってやると320×320でトリミングされた大きい画像が取得できる！
アプリやWebサービスでFacebookアイコンを使う場合はこちらでアイコン取得するのがおすすめ！

`Twitterはこちら`
http://qiita.com/stkn_bb/items/e5ad4bcca4b959b70d9d
gitやvagrantに小手先だけでサブコマンドっぽいものを追加する

gitやvagrantに普通にサブコマンドを追加するならpluginを作ることになったりすると思いますが、そういうことしません。作り方知りません。
私の考えたやり方は、

1. 新しいサブコマンドなら専用の処理、既存のサブコマンドなら今までどおりの処理を行うシェル関数を書く
2. その関数を目的のコマンドにaliasする

だけです。
と、これだけ言っても分からんと思うので、例としてvagrantに、boxをdestroyしてupするrestartサブコマンドを追加します。
.zshrcに以下の記述をします。

```zsh
function vagrant_wrapper() {
    if [ $1 = 'restart' ]; then
        shift
        \vagrant destroy -f $@ && \vagrant up $@
    else
        \vagrant $@
    fi
}

alias vagrant=vagrant_wrapper
```

これで`vagrant restart BOX_NAME`でdestroy && upが出来ます。もちろんrestart以外のコマンドも使えます。

ポイントとしては`vagrant_wrapper`の中で使う`vagrant`コマンドのサフィックスにバックスラッシュ`\`をつけることです。バックスラッシュをつけるとaliasを無視して元のコマンドが発動します。つけないと多分無限ループするので注意。

こんな感じでプラグインを作らずともサブコマンドを追加出来るよ、というお話でした。
Padrino であとからコンポーネントを追加/変更したい


0.11.4 から Component Generator が追加され、
プロジェクト作成後でもコンポーネントを追加したり変更することができるようになりました
(参照: [Padrino 0.11.4 Released - On the Road to 0.12](http://www.padrinorb.com/blog/padrino-0-11-4-released-on-the-road-to-0-12))

使い方は上記のブログに書いてある通りなんですが、

```
$ padrino g component
```
というように、オプションを指定しないでコマンドを叩けば、
指定できるオプションと現在選択されているコンポーネントが表示されます

たとえば、

```
$ padrino g project demo_project -t rspec -e haml -m rr -s jquery -d datamapper -c sass
```

というようにプロジェクトを作成後、やっぱり slim をデフォルトで使いたいなーと思ったときは、

```
$ padrino g component -e slim
```

とすると、デフォルトのテンプレートエンジンを切り替える事ができます

ただし、ORM の追加/変更をした場合には注意が必要です
Rake ファイルに選択した ORM のタスクを使える様にするため
以下のようにメソッドを追加する必要があります

```Rakefile
require 'bundler/setup'
require 'padrino-core/cli/rake'

PadrinoTasks.use(:database)     # これもなければ追加
PadrinoTasks.use(:activerecord) # これを追加(ARの場合)
PadrinoTasks.init
```

この問題は次のバージョン(0.12.0 かな?) には[解消されていると思われます](https://github.com/padrino/padrino-framework/pull/1523)
Padrino の runner コマンド


Padrino には runner コマンドがあるのですが、
その存在に気づいている人が少ないのでは？と思ったので紹介します
([Padrino 公式ドキュメント](http://www.padrinorb.com/guides/development-commands#terminal-commands)にもそのうちにサラッとし
た感じで載ると思います)

ちなみに、runner コマンドは 0.11.0 で追加されました。([Change Log](http://www.padrinorb.com/changes))

## つかいかた

スクリプトの断片もしくはファイルを引数にしてコマンドを実行します

```
$ padrino runnner ‘puts Padrino.env’
development
```

```script/confirm_padrino_env.rb
puts Padrino.env
```
```
$ padrino r script/confirm_padrino_env.rb -e production
production
```
こんな感じでもOKですね

```lib/greeting.rb
module Greeting
  def self.say
    puts 'Hello'
  end
end
```
```
$ padrino r Greeting.say
hello
```
Codeforces Beta Round #1


はい。ふらふらとして何も進歩しておりませんが過去問始めました。
[http://codeforces.com/contest/1](http://codeforces.com/contest/1)

A問題
ざっくり大意
Berland市のTheatreの庭、面積n*mがある。
a*aの石を使って最小の個数で庭を敷き詰める。

原点Oから埋めていく感じでイメージすると端っこのほうが石がいれられなくなるはずなのですが、It's not allowed to break the flagstones らしくよくわからじ。
大勢が見た限りでは共通した方法を使っていたので定番の問題、式が成り立つのだろうか。。。

```
((n+a-1)/a)*((m+a-1)/a)
((庭の縦+石-1)/石)*((庭の横+石-1)/石)
```

石は今回は正方形なので縦横が変わりませんが長方形の石の場合の式の当てはめ方は現状不明。

```python:a.py
(n,m,a)=map(int,raw_input().split())
#if n%a != 0: n+= n%a
#if m%a != 0: m+= m%a
print ((n+a-1)/a)*((m+a-1)/a)
```

B問題
ざっくり大意
エクセルのようなスプレッドシート
与えられるn行の入力は2種類ある。
BC23 BCは列、23は行
R23C55 RはRow(行)、Cはcolumn(列)

解法を参照したのは602523 ItsLastDayさん。


```python:b.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import timeit
import time
import sys
import io
import re
import math

n=int(raw_input())
for i in range(n):
    m=raw_input()
#入力がR数値C数値であるかチェック
#元々はmatch=で書かれていたが、将来に使いまわす際にmatch文と衝突するので避けました。
    chk=re.search(r'R(\d+)C(\d+)',m)
    if chk:
#searchしてる1カ所目、2カ所目とか取り出せるのか？？すげぇ
        x=int(chk.group(2))
        res=''
        while x:
#組み込み関数ordを要見直し
            res=chr(ord('A')+(x-1)%26)+res
            x=(x-1)/26
#行は数値取り出せれば何も加工する必要なし
        print (res+chk.group(1))
    else:
#ここもsearchを数値以外と数値のみを取り出す仕込みになっている
        t=re.search(r'(\D+)(\d+)',m)
        x=0
        for letter in t.group(1):
            x=x*26+(ord(letter)-ord('A')+1)
#行は取りさせれば加工する必要なし
#列はここもord()を
        print ('R%dC%d' % (int(t.group(2)), x))
```

C問題
なるほどわからん
問題文の和訳付きで解説してる方がいらっしゃいました。
[http://d.hatena.ne.jp/kyuridenamida/20120124/1327336975](http://d.hatena.ne.jp/kyuridenamida/20120124/1327336975)

ちょっとここは保留で
モダンブラウザで blink

CSS の text-decoration プロパティの設定値として、blink というものがかつて存在しました。

```css
#some-element {
  text-decoration: blink;
}
```

これは、[かの有名な BLINK タグ]と同じく、「テキストを点滅させる」というとっても素敵な効果を実現するためのものでした。

[かの有名な BLINK タグ]: (http://www.montulli.org/theoriginofthe%3Cblink%3Etag)

いや、正確にいうと、現在の CSS でも blink は有効な設定値の一つとして残ってはいますが、非推奨となっていて、blink による点滅を実装したブラウザは今ではもう存在しません[^firefox]。

[^firefox]: 最後まで残っていた Firefox が 2013 年 3 月頃にサポートを取りやめました。

blink が使えないことは大抵の人にとってはどうでもいいことだと思われますが、中には「点滅しない Web なんてクリープしていないコーヒーみたいなもんだ」という人もいるかも知れません。そういう人のために、CSS3 Animation を利用してかつての BLNK タグのような点滅を実現する方法を紹介します。

```css
@keyframes blink {
  75% { opacity: 0.0; }
}
#some-element {
  /* text-decoration: blink; の代わりに以下の指定を入れる */
  animation: blink 1s step-end infinite;
}
```

IE11、Edge、Firefox、Chrome[^chrome] はこの指定で動作しました。一方 Safari ではこのままでは動作せず、ベンダ接頭辞（`-webkit`）を付ける必要があるようです。なので、それも一緒に設定したものを書いておきます。

[^chrome]: Chrome はバージョン43以降でベンダ接頭辞（`-webkit`）が不要になりました。

```css
@keyframes blink {
  75% { opacity: 0.0; }
}
@-webkit-keyframes blink {
  75% { opacity: 0.0; }
}
#some-element {
  animation: blink 1s step-end infinite;
  -webkit-animation: blink 1s step-end infinite;
}
```

ちなみに、この設定を利用すると、テキスト以外のもの（画像など）も点滅させることができます。というわけで、皆さん早速、点滅する素敵な Web ページを作りましょう！
Gruntのtaskの実行にかかる時間を劇的に短縮する方法

# Gruntのtaskの実行にかかる時間を劇的に短縮する方法

最近ではGrunt無しでのフロントエンド開発は考えられなくなってきた気がしますが、大抵taskを実行した際に結構時間がかかってしまいます。
Gruntの実行にかかる時間を減らすにはどうすれば良いのか調べてみたら、[loadTasks as they are needed to speed up Grunt load time · Issue #975 · gruntjs/grunt](https://github.com/gruntjs/grunt/issues/975)のissueに方法がありました。
　　
## 何に時間がかかっているか
taskを走らせた際、何で時間がかかっているのかを[time-grunt](https://github.com/sindresorhus/time-grunt)で確認してみると、実行しているtask自体ではなくnpmタスク(適切な表現かは分かりませんがGruntプラグインの事です。)の読み込みの方に時間がかかっている事が分かります。

#### loadNpmTasks()で2秒はかかっている状態
![grunt_1.png](https://qiita-image-store.s3.amazonaws.com/0/11465/81249056-3afd-3d51-5423-9c88cb825676.png)
　
  
npmタスクの読み込みに何故時間がかかるかというと、Gruntではどのtaskを実行した場合でも全てのnpmタスクを読み込むことが原因のようです。
つまり、[grunt-contrib-jshint](https://github.com/gruntjs/grunt-contrib-jshint)だけが必要な`lint`というtaskを定義してあったとして

```zsh
$ grunt lint 
```

と実行すると、`Gruntfile`に記述されている`lint`のtaskとは関係の無い[grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)だとか[grunt-browserify](https://github.com/jmreidy/grunt-browserify)といったnpmタスクまで全てロードしているということです。

```js
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-cssmin'); // lintのtaskとは関係なくてもロードする
grunt.loadNpmTasks('grunt-browserify'); // lintのtaskとは関係なくてもロードする
```

　　
## 実行するtaskに必要なプラグインのみをロードする
[maslen氏のコメント](https://github.com/gruntjs/grunt/issues/975#issuecomment-29058707)の方法を取ると、npmタスクの読み込みは実行するtaskのコールバック関数で行われるようになるので、そのtaskに必要なものだけを読み込むことが可能になります。
全てのnpmタスクを読み込まなくなるので、ロードにかかる時間は必要なnpmタスクだけに限定されます。

```js
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-browserify');

grunt.registerTask('lint', ['jshint']);
```

という従来の形ではなく、

```js
grunt.registerTask('lint', [], function () {
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.task.run('jshint');
});
```

とすれば、ロードにかかっていた時間は劇的に短縮することが出来ます。

#### 2秒かかっていたloadNpmTasks()が130ミリ秒にまで短縮されています
![grunt_3.png](https://qiita-image-store.s3.amazonaws.com/0/11465/994abe7f-0b57-8649-376e-782fb311892e.png)

　　
記述が冗長になってしまう点はあるものの、パフォーマンスの点ではかなり改善できるので、Gruntのtaskの実行にかかる時間を短縮したい場合には試してみると良いかもしれません。


## Links
- [loadTasks as they are needed to speed up Grunt load time · Issue #975 · gruntjs/grunt](https://github.com/gruntjs/grunt/issues/975)
- [sindresorhus/time-grunt](https://github.com/sindresorhus/time-grunt)
WordPressでのパス記述に関するちょっとしたメモ

WordPressを使っていて、はじめに躓いたのがパスの記述。
ルート相対パスなるものを知ったのだけれど、テスト環境だと使えなかったりもする。

結局、一番使ってるのは

```php:
bloginfo('template_url');
```

だったりする。

[テンプレートタグ/bloginfo](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/bloginfo) からの引用

> 'template_url' / 'template_directory' - アクティブなテーマのディレクトリー URL を表示します。 
> ('template_directory' は Version 2.6 以前ではローカルパスを表示していました。ハック的な代替策は 
> get_theme_root() と get_template() を参照してください)。 子テーマの中では、 get_bloginfo('template_url') と 
> get_template() はどちらも親テーマのディレクトリーを返します。そのため、親テーマでは 
> get_template_directory_uri() を、子テーマでは get_stylesheet_directory_uri() を使うよう考慮してください。


他にも

```php:
// プライマリーな CSS (usually style.css) ファイルの URL
bloginfo('stylesheet_url');  
get_stylesheet_uri();

// アクティブなテーマディレクトリーの URL
bloginfo('stylesheet_directory');  
get_stylesheet_directory_uri();
```

なんかがあるようだ。
使い分けについては今後の課題。
Groongaを使うとドリルダウン検索は簡単です


![drilldown](http://ongaeshi.me/slide/groonga04/images/slide-groonga04-01.png)

Groongaを囲む夕べ4で発表したスライドにて、Milkodeにおけるドリルダウンの使い方を紹介してなかなか評判が良かったので記事にしてみました。Milkodeではドリルダウンの実装は実質2〜3日で出来ました。全文検索と一緒にドリルダウンを使いたいWebサービスを検討している人にはおすすです。

[[本文へ]](http://ongaeshi.hatenablog.com/entry/groonga-drilldown)
NSDictionary/NSMutableDictionary関連のメモ


```objectivec:NDictionary
    NSDictionary *dic = @{@"手":@"手袋", @"足":@"靴下", @"頭":@"帽子"};
    NSLog(@"%@", dic[@"足"]);
    
    // 追加.
    NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithCapacity:1];
    mdic[@"first"] = @"1st";
    mdic[@"second"] = @"2nd";
    mdic[@"third"] = @"3rd";
    NSLog(@"%@", mdic);
    
    // 変更.
    mdic[@"second"] = @"SECOND";
    mdic[@"fourth"] = @"FOURTH";
    NSLog(@"%@", mdic);
    
    // 削除.
    [mdic removeObjectForKey:@"fourth"];
    NSLog(@"%@", mdic);
    [mdic removeAllObjects];
    NSLog(@"%@", mdic);
    NSLog(@"%d", mdic.count);

    // ループ.
    for (NSString *key in dic) {
        id value = dic[key];
        NSLog(@"%@ => %@", key, value);
    }
    // キーをソートしてループ.
    dic = @{@"3":@"GHI", @"1":@"ABC", @"2":@"DEF"};
    NSArray *keys = [dic keysSortedByValueUsingSelector:@selector(compare:)];
    for (NSString *key in keys) {
        NSString *value = dic[key];
        NSLog(@"%@ => %@", key, value);
    }
    // ブロック使用.
    [dic enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
        NSLog(@"%@ => %@", key, obj);
    }];
```
おさらい autocmd/augroup

本記事は [Vim Advent Calendar 2013](http://atnd.org/events/45072) の 20 日目の記事です。
19 日目は @orga_chem さんによる、[vim-splashを使い倒してこそ真のVimmerですぞ](http://orgachem.hatenablog.com/entry/2013/12/19/130701) でした。@orga_chem さんは VAC2013 のトップ絵も書かれています。素敵ですよね、Vimgirl かわいい。

最近巷で噂の [vimrc 読書会](http://vim-jp.org/reading-vimrc/) ですが、この最中によく指摘される事柄として、autocmd に付随する augroup の定義がない、というものがあります。
autocmd は便利かつ多用されますが、その裏で気づかれにくい・知られにくいこの件について今回は記事を書いてみます。

# autocmd の概要

autocmd は Vim で指定したイベントが起きた際に自動的に実行するコマンドを指定するコマンドです。

```vim:.vimrc
autocmd BufNewFile * put ='ﾋﾞﾑｩ'
```

例えばこのような `autocmd` を定義すると、存在しない新しいファイルの編集を始める際に自動で

```
ﾋﾞﾑｩ
```

と入力され、大変便利です。ここでは BufNewFile というイベントを指定しており、存在しないファイルの編集を始めたときにコマンドを実行させることができます。
イベント一覧については`:help {event}`を参照してください。

# 問題点

ところで .vimrc をモリモリ編集した後、再読み込みすると思います。`:source ~/.vimrc`
上記の設定がある .vimrc を再読み込みした後、新しいファイルを編集します。

```
ﾋﾞﾑｩ
ﾋﾞﾑｩ
```

上記のようになってしまうはずです。これは大事なことなので 2 回出たわけではなく、`autocmd` は上書きされずに複数回定義されてしまうからです。
`au BufNewFile *` で確認することができます。
.vimrc を読み込む際に `autocmd!` することで定義済みの `autocmd` が削除されこの問題は回避することができますが、想定していない autocmd の定義まで削除されてしまう恐れがあります。

# augroup

そこで `augroup` を使っていきます。
`augroup` は `autocmd` をグループ化します。

```vim:.vimrc
augroup vimrc_loading
  autocmd!
  autocmd BufNewFile * put ='ﾋﾞﾑｩ'
augroup END
```

このように記述することで、`autocmd` は `augroup vimrc_loading` に属することとなります。グループの中で行われた `autocmd!` コマンドは同じグループの `autocmd` 定義のみを削除します。


```vim:.vimrc
augroup erase
  autocmd!
  autocmd BufNewFile * put ='ﾋﾞﾑｩ'      " 消える
augroup END

autocmd erase BufNewFile * put ='ﾋﾞﾑｩ?' " 消える

augroup erase
  autocmd BufNewFile * put ='ﾋﾞﾑｩｯ'      " 消える
augroup END

augroup not_erase
  autocmd BufNewFile * put ='ﾋﾞﾑｩ!!'    " 消えない
augroup END
```

このようにして目的の `autocmd` だけを再定義する、リローダブルな .vimrc を書くことができます。

# 補足

実際のところ日本人の vimrc ではきちんと設定されていることがほとんどで、読書会で上がる際は大抵外国の方の vimrc ばかりだったりします。
ただ<del>英語力が</del> Vim 始めたての方がわかりにくいところでもあると思うので、そういう方のお役に立てばと思います。

以上 Vim Advent Calendar 2013 21 日目の記事でした、次回 22 日目は @harukey2525 さんです。

## 参考

http://whileimautomaton.net/2008/08/vimworkshop3-kana-presentation
http://vim-users.jp/2009/07/hack40/
http://vim-users.jp/2009/09/hack74/
http://vim-users.jp/2011/10/hack234/
NSSet/NSMutableSet/NSMutableOrderedSet関連のメモ


```objectivec:NSSet
    // 和集合.
    NSArray *arr1 = @[@"one", @"two", @"three", @"four", @"five"];
    NSArray *arr2 = @[@"three", @"four", @"five", @"six", @"seven"];
    NSSet *set1 = [NSSet setWithArray:arr1];
    NSSet *set2 = [NSSet setWithArray:arr2];
    NSMutableSet *allSet = [NSMutableSet setWithCapacity:1];
    [allSet unionSet:set1];
    [allSet unionSet:set2];
    NSLog(@"%@", allSet);
    
    // 配列で取り出す.
    NSArray *array = [allSet allObjects];
    NSLog(@"%@", array);
    
    // 積集合.
    NSMutableSet *intersect = [NSMutableSet setWithArray:arr1];
    [intersect intersectSet:set2];
    NSLog(@"%@", intersect);
    
    // 差集合.
    NSMutableSet *except = [NSMutableSet setWithArray:arr1];
    [except minusSet:set2];
    NSLog(@"%@", except);
    
    // 含まれているか.
    NSSet *set3 = [NSSet setWithArray:@[@"two", @"three", @"four"]];
    NSLog(@"set1にset2が含まれている？[%@]", ([set2 isSubsetOfSet:set1] == YES ? @"YES" : @"NO"));
    NSLog(@"set1にset3が含まれている？[%@]", ([set3 isSubsetOfSet:set1] == YES ? @"YES" : @"NO"));
    
    // フィルタリング.
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K beginswith %@", @"self", @"t"];
    NSSet *filtered = [set1 filteredSetUsingPredicate:predicate];
    NSLog(@"%@", filtered);
    
    // 順番.
    NSMutableOrderedSet *ordered = [NSMutableOrderedSet orderedSetWithArray:arr1];
    [ordered addObject:@"six"];
    NSLog(@"%@", ordered);
    NSLog(@"%@", ordered[1]);
    
    // ソート.
    NSComparisonResult (^comparator)(id, id)=^(id obj1, id obj2)
    {
        int v1 = [obj1 intValue];
        int v2 = [obj2 intValue];
        if (v1 < v2) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        else if (v1 > v2) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        else {
            return (NSComparisonResult)NSOrderedSame;
        }
    };
    NSArray *nums = @[@2, @8, @22, @5, @9];
    NSMutableOrderedSet *orderedNums = [NSMutableOrderedSet orderedSetWithArray:nums];
    NSLog(@"%@", orderedNums);
    [orderedNums addObject:@11];
    NSLog(@"%@", orderedNums);
    NSArray *sorted = [orderedNums sortedArrayUsingComparator:comparator];
    NSLog(@"%@", sorted);```
MacOSXにSphinxをインストール

Mac OS X 10.8.5 ＋ Python 2.7.5の環境にて、Sphinxをインストールしました。
インターネットに接続していることが前提条件になります。

まず、ez_setup.pyのダウンロード＆インストールを行います。
Mac OS Xのため、取得コマンドはwgetではなくcurlになります。

```bash
$ curl https：//bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -o ez_setup.py
$ python ez_setup.py
```

インストールに失敗する場合は、管理者権限で実行してみて下さい。

```bash
$ sudo python ez_setup.py
```

インストールされたeasy_installにてSphinxをインストールします。
今回は1.1.3が選択されました。（最新は1.2です。）

```bash
$ easy_install sphinx
Searching for sphinx
Best match： Sphinx 1.1.3
...
```

プロジェクト用ディレクトリー（ここでは「sphinx」）を作成して、カレントを移動します。

```bash
$ mkdir sphinx
$ cd sphinx/
```

sphinx-quickstartにてSphinxプロジェクトを生成します。
今回は「お試し」のため、sphinx-quickstart実行後の質問には、ほぼ初期値（[Enter]キー押下）で回答しました。

```bash
$ sphinx-quickstart
$ ls
Makefile build/    make.bat source/
```

sourceディレクトリー内の「 index.rst」がreStructuredTextファイルです。

```bash
$ ls source/
_static/    _templates/ conf.py    index.rst
```

sourceディレクトリー内のファイルから、HTMLを作成します。

```bash
$ make html
$ ls build/html/
_sources/       genindex.html  objects.inv    searchindex.js
_static/        index.html     search.html
```

WWWブラウザー（ここではSafari）を起動して、作成されたHTMLを確認します。

```bash
$ open /Applications/Safari.app build/html/index.html
```
ゲーム制作13日目!!

昨日は時間がなくてひどい浅さだったので、
今日はもう少し頑張ろうと思います。

#今日のメニュー
・カウントの場所変更&クラス化
・ツイッターでつぶやく機能

#カウントについて
カウントの場所を変更しました。
右側のステータス画面の下側です。
ついでに文字を絵に差し替えました。
数字部分は一桁ずつがSpriteになっていて、
フレームを使って表示する数値を操作しています。
画像の内容は以下の感じ
![number.png](https://qiita-image-store.s3.amazonaws.com/0/32926/c8ccc120-43d8-d5a5-4b53-2a7e8507ac45.png)

この並びにしてあるのでframeの数値と画像の数値がちょうど一致します。

同時にクラス化もしたので、ソースコードを貼ります。
かける演算子以降のSpriteのx座標はサンプルからの相対的な座標を指定しています。
このようにすることで、サンプルの要素の座標を変更するだけで、
全体の位置を動かすことができるのです。

表示人数はcountという変数で管理しているので、
countを割ったりあまり出したりして、一桁ずつの人数をもとめます。

```js
			var CountSystem=Class.create(Sprite,{
				initialize:function(){
					this.count=0;

					//背景
					const w=160;
					const h=80;
					const y=HEIGHT-h/2-32;
					Sprite.call(this,w,h);
					this.image=game.assets['./img/countBackground.png'];
					this.x=WIDTH;
					this.y=HEIGHT-h;
					scene.addChild(this);


					//サンプル本体
					this.sample=new Sprite(64,64);
					this.sample.x=WIDTH;
					this.sample.y=y;
					this.sample.image=game.assets['./img/charTip8dir.png'];
					this.sample.frame=42;
					scene.addChild(this.sample);

					//かける
					this.kakeru=new Sprite(32,32);
					this.kakeru.x=this.sample.x+64;;
					this.kakeru.y=y+32;
					this.kakeru.image=game.assets['./img/kakeru.png'];
					scene.addChild(this.kakeru);

					//10のくらい
					this.numOfTen=new Sprite(32,64);
					this.numOfTen.x=this.kakeru.x+32;
					this.numOfTen.y=y;
					this.numOfTen.image=game.assets['./img/number.png'];
					scene.addChild(this.numOfTen);

					//1のくらい
					this.numOfOne=new Sprite(32,64);
					this.numOfOne.x=this.numOfTen.x+32;
					this.numOfOne.y=y;
					this.numOfOne.image=game.assets['./img/number.png'];
					scene.addChild(this.numOfOne);

					this.onenterframe=function(){
						this.numOfTen.frame=this.count/10%10;
						this.numOfOne.frame=this.count%10;
					}
				},
				countUp:function(){
					this.count++;
				}
			});
```

#ツイッターでつぶやく

ツイートボタンをenchant.jsの画面内に設置しました。
はじめ、enchant.jsのプラグインを使用して行うものだと勘違いしており、苦労しました。
後に、プラグインはユーザー情報を取得したりなど認証が必要な処理用であることが判明しました。

画面からウィンドウを表示する処理にはwindow.open関数を使用しました。
この関数では、URLを使用して新しいウィンドウを開くことができます。
この関数をSpriteのクリック時イベントに追加することで機能を実装しています。
実際のコードは以下の感じです。

```js
			tweetButton.addEventListener(Event.TOUCH_START,function(){
				var tweetText=count+'人の子供達を育て上げました！';
				var features='width=650, height=450, menubar=no, toolbar=no, scrollbars=yes';
				var win = window.open("https://twitter.com/share?text="+tweetText+"&amp;","twitter-share-button",features);
			});
```

tweetTextの内容を指定することで、はじめから入力されているツイート内容を指定することができます。
今日の時点ではスペースの入れ方がわからず、
このままではハッシュタグを使用することができないため、
明日はそれについてしらべようと思います。

参考
window.openについて
[イヌでもわかるJavaScript講座Step.13 - 新しいウィンドウで表示させる](http://www.red.oit-net.jp/tatsuya/java/winopen.htm)

ツイートボタンについて
[Share Bookmarklet](https://dev.twitter.com/docs/share-bookmarklet)
[【小窓編】SNSボタン設置方法マトメ facebook, Pin it (Pinterest), twitter, Googleプラス, Mixiチェック](http://zxcvbnmnbvcxz.com/%E8%B6%85%E7%B0%A1%E5%8D%98-sns%E3%83%9C%E3%82%BF%E3%83%B3%E8%A8%AD%E7%BD%AE%E6%96%B9%E6%B3%95%E3%83%9E%E3%83%88%E3%83%A1-facebook-pin-it-pinterest-twitter-google%E3%83%97%E3%83%A9%E3%82%B9-mixi/)

#ソースコード全体
[こちらです(github)](https://github.com/picoslime/SnakeGame)
商用iBeaconを探してみる

<a href="http://android-akihabara.info/">日本Androidの会 秋葉原支部</a>で活動をしている<a href="https://twitter.com/KazuyukiEguchi">KazuyukiEguchi</a>です。
２回目の投稿になります。

昨日、アプリックスさん、頓智ドットさんがそれぞれニュースリースを出しており、<a href="http://www.aplix.co.jp/?p=7908">『アプリックスのBeaconモジュールが大型商業施設渋谷パルコへ導入開始　～　プッシュ型O2Oサービスの新ソリューションとして頓智ドット社が運営する『tab』で採用　～』</a>、<a href="http://www.tonchidot.com/ja/pressroom/articles/press20131219/">『『tab』がアプリックス社のBeaconモジュールを全面採用』</a>っていういう内容でした。

<a href="http://qiita.com/KazuyukiEguchi/items/a5642d65c9fb0f686a38">前回、商用ビーコン探し</a>に失敗した私は、リベンジするために、渋谷パルコに行ってきました。

頓智ドットさんの『tab』アプリをダウンロードし、ユーザー登録して、渋谷で迷ってしまう私が、Google MAPSのアプリを使って、パルコを目指しました。

あるところで、インストールしていたiPhone 5Sがブルブルいうので、画面を開くと、

![IMG_0788.PNG](https://qiita-image-store.s3.amazonaws.com/0/33220/7d6963c7-b0e2-8ed2-5c58-0d56cb575830.png)

あしあとを残したとの記録が！おお、これは、iBeaconを受信したってことです。

しかも受信した場所からの写真ですが、道路を歩いている時に受信したんです。
これは、超音波を使ったしょっぷらっととかでは体験できなかった出来事です。
まさにバッググラウンドで動作できるiBeaconの良さですね。

![IMG_0791.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/513b187b-55d2-5644-3c34-650907a70c87.jpeg)

是非、みなさんも、パルコに行って、iBeaconの良さを体感して
みてください。

本当にiBeaconが出ているのか？を確認するということで！
Nexus 5が登場！

![Screenshot_2013-12-19-17-10-25.png](https://qiita-image-store.s3.amazonaws.com/0/33220/44748100-4422-df0e-a1e5-eda52bb3601a.png)

確かに、iBeaconと検出できています。
不正利用を考え、UUIDにはモザイク処理しておきました。

以上、予告通り、商用のビーコンを見つけることが出来ました！よかったよかった。パチパチ
ペーパープロトタイピング用のステンシルを入手しました


[UI Stencils](http://www.uistencils.com)で購入しました。

![IMG_3824.JPG](https://qiita-image-store.s3.amazonaws.com/0/14605/65de84eb-d31e-6fdd-98f3-d0ce01752d09.jpeg "IMG_3824.JPG")

ステンレス製のステンシルシートと専用の用紙。

用紙の方は、ポストイット的な裏面にのりが付いてるタイプと
ノート型の3連タイプを入手しました



![IMG_3825.JPG](https://qiita-image-store.s3.amazonaws.com/0/14605/8ed5a8a6-16b2-18cf-6ef7-363c25bfd634.jpeg "IMG_3825.JPG")

実寸の140%のサイズなので、ほかのペーパープロトタイピング用紙には使えないと思います。

[PDF](http://cdn.shopify.com/s/files/1/0042/9602/files/iphoneSketchpad_a4_v9-BW.pdf?301)も配布されているので、ステンシルシートさえ入手すればいくらでも画面設計ができそうですね。


![IMG_3827.JPG](https://qiita-image-store.s3.amazonaws.com/0/14605/869d58e6-b471-0821-af44-82665ed65140.jpeg "IMG_3827.JPG")

iOS7対応なので2月1日以降も安心ですねw
privateなコンストラクタを外部からコールする

こちらでprivateなコンストラクタがあるクラスをnewする方法について模索しています。
http://qiita.com/mpyw/items/b3d974c073e6484d51a4
が、解決策1～3どれも結局__construct()を呼び出してないじゃない、ということで無理矢理呼び出してみます。

```php
<?php
class HOGE{
	public $value = 0;
	private function __construct(){
		$this->value = 1;
	}
}


function getInstance($class){
	$tmp = <<< HOGEHOGE
	class HOGEHOGE extends $class{
		public function __construct(){
			\$method = new ReflectionMethod('$class', '__construct');
			\$method->setAccessible(true);
			\$method->invoke(\$this);
		}
	}
	
	\$hogehoge = new HOGEHOGE();
HOGEHOGE;

	eval($tmp);
	return $hogehoge;
}
	
	
	$instance = getInstance('HOGE');

	print $instance->value; // 1
```


実際にできあがるインスタンスはHOGEじゃなくてHOGEHOGEになるけどそこはまあ気にするな。

protectedであればinvokeとか使わず普通にparent::__construct()するだけでいいです。

なおeval()は超危険関数なので、間違ってもこんなことを実環境で行わないように。
まあprivateな__construct()に処理が書いてある時点で異常ですが。


反則ですが、使えるようであれば[runkit_method_redefine()](http://www.php.net/manual/ja/function.runkit-method-redefine.php)が最強でしょう。
vimで貼付け時に自動でpasteモードにする


vimでOSのクリップボードから貼り付けたいときは，
一度`set paste`でペーストモードにしてから貼り付ける．

これが，結構面倒くさいんだけど以下のスクリプトを使うと簡単に貼り付けができるようになる．

ノーマルモードでペーストを行うと自動でペーストモードになって，
クリップボードの中身を貼り付けてくれる．

オススメです．

```
if &term =~ "xterm"
    let &t_ti .= "\e[?2004h"
    let &t_te .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    noremap <special> <expr> <Esc>[200~ XTermPasteBegin("0i")
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
    cnoremap <special> <Esc>[200~ <nop>
    cnoremap <special> <Esc>[201~ <nop>
endif
```

## 参考文献
- あったけどロストしてしまいました．．．
Elixir の LTSV パーサがなかったので作ってみた

タイトル通り Elixir の LTSV パーサがなかった。
http://ltsv.org/ の Parser Implementations になかった。
github で [ltsv で検索](https://github.com/search?q=ltsv&type=Repositories&ref=searchresults)しても出てこなかった。 

ということで作ってみましたので、何はともあれ star つけてやってください。よろしくお願いします。
https://github.com/ma2gedev/ltsvex

## 使い方

`LTSV.parse` は HashDict のリストに変換されます。

```iex
iex(1)> LTSV.parse "name:taka\taddress:Japan\nname:tetsuo\taddress:Sea"
[#HashDict<[{"address", "Japan"}, {"name", "taka"}]>,
 #HashDict<[{"address", "Sea"}, {"name", "tetsuo"}]>]
```

`LTSV.dump` は HashDict のリストから LTSV 文字列を作成します。

```iex
iex(4)> LTSV.dump [HashDict.new([{"name", "taka"},{"address", "Japan"}]),
...(4)>            HashDict.new([{"name", "tetsuo"}, {"address", "Sea"}])]
"address:Japan\tname:taka\naddress:Sea\tname:tetsuo"
```

以上。

## まとめ
作るにあたり他言語の実装を色々参考にさせていただきました。Ruby, JavaScript, Erlang, Scala, Perl, D などなど。
今の実装はシンプルすぎるので、もう少し使いやすい形にしたいなとは思っています。例えば atom をキーとした HashDict を受け取れるようにするとか。
それと、ちょっとしたことでエラーが起きたり[問題が多い](https://github.com/ma2gedev/ltsvex/issues)ので、ちょこちょこ直していければなと思ってます。というか教えていただけると嬉しいです。

明日は @mururu さんです。[昨日の記事](http://qiita.com/mururu/items/033c9c60827bdeb62fdf)にも出ていましたが、Enumerable 気になりますね。

## See Also
http://ltsv.org/
https://github.com/condor/ltsv
https://github.com/sasaplus1/ltsv.js
https://github.com/shirou/erlang-ltsv
https://github.com/yteraoka/ltsv
https://github.com/seratch/ltsv4s
https://github.com/repeatedly/ltsv-d
Windows+Vagrant+Chef+Gitのインストールで少し悩む

Windows+Vagrant+Chef+Gitのインストールをしていたときに、なんか混乱したので、これは頭を整理するための単なるメモです。 こんなところでハマる人はいないと思うが。。

# 何に混乱したか？

インストールの過程で、MinGW や Ruby が入っていき、いったい何がどう使われているのか分からなくなった。

## 環境

* Windows7 64bit
* MinGW/Cygwin 入れてない
* Ruby 入れてない
* Git 入れてない

このような逆境からのスタートです。

##  混乱の要因１：Vagrant

*  「Vagrant は、『gem install vagrant』だと、古いバージョン(1.0.7とか)が入っちゃうので、純粋なインストーラーで入れるべし！」という記述を見た
 * よしインストール -> コマンドプロンプトから vagrant が呼べるようになった！
  * よしこれで ruby も使えるようになったな -> (カチャカチャカチャ…)`ruby -v`(ッターン！)-> 「'ruby' は、内部コマンドまたは（中略）認識されていません」
  * あれ？ruby 使ってない？？←ここで混乱

### Ruby はいずこ？

```bat:C:\HashiCorp\Vagrant\bin\vagrant.bat(デフォルトのインストール先)
～中略～
REM Run Vagrant...
"%EMBEDDED_DIR%\..\embedded\bin\ruby.exe" "%EMBEDDED_DIR%/../embedded/gems/bin/%~n0" %*
～中略～
```

組み込みの `ruby.exe` を使っていた。なんか vagrant の実行がモッサリしている気がしたのは、この長い bat ファイルのせいか？しかし、インストールすると 400MB 以上も HDD を消費するのがちょっとアレな上に ruby を使わせてくれないとはね。。

##  混乱の要因２：Chef

* 「Chef は gem でも入れられるけど Windows 版のインストーラーもあるよ！」という記述を見た
  * よしインストール -> コマンドプロンプトから knife が呼べるようになった！
  * よしこれで ruby も使えるようになったな -> (カチャカチャカチャ…)`ruby -v`(ッターン！)-> `ruby 1.9.3p484 (2013-11-22) [i386-mingw32]`キター
  * ・・・・あれ？でも`ruby.exe`は`C:\opscode\chef\embedded\bin`にあるんだけど、なんで呼べるようになった？ <- ここで混乱

### Ruby が呼べる理由

システムの環境変数 PATH に  `C:\opscode\chef\bin;C:\opscode\chef\embedded\bin`が追加されていた。embedded なのに、こちらは使わせるポリシーらしい。

##  混乱の要因３：Git

 * 「Chef で作った cookbook は Git で管理すると良いかも！」 という記述を見た
  * よし http://git-scm.com/ からインストール(vagrant も ssh 使うしちょうどいいや） -> git & ssh おｋ

すいません勢いで書いてみましたがここは特に混乱しませんでした。PATH が通ってるおかげで、 `C:\opscode\chef\embedded\bin\ruby.exe` もしっかり呼べます。ただ、chef の embedded\bin とのハイブリッドになるので、今後何かハマるかもしれません。

# まとめ

Windows ならではの苦労があります。
Proof General が "Searching for program: No such file or directory, coqtop" というときの対処法

# 問題の概要
HomebrewでCoqをインストールすると

```shell-session
$ which coqtop
/usr/local/bin/coqtop
```

`/usr/local/bin/coqtop` にインストールされます。しかしこのままでは Proof General が `Searching for program: No such file or directory, coqtop` とエラーを出します。

# 対処法
`/usr/bin/` にシンボリックリンクを置きます。

```shell-session
$ sudo ln -s /usr/local/bin/coqtop /usr/bin/
```
bridgeを活用する

MojoliciousのRoutingの中に「 **bridge** 」というモノのがあります。共通で使うアクションをコントローラの一つのメソッドにしてそこを一度経由してから他のコントローラ処理を行うことが出来ます。主なユースケースとしてユーザー認証などが考えられるでしょう。では使ってみます。`Mojolicious` を継承した `MyApp.pm` は以下のようになります。

```pl:lib/MyApp.pm
package MyApp;
use Mojo::Base 'Mojolicious';

sub startup {
    my $self = shift;
    my $r = $self->routes;
    my $logged_in = $r->bridge->to('root#login');
    $logged_in->get('/')->to('root#index');
}

1;
```
ここではログイン処理をするようなアクションを `MyApp::Root` の `loginメソッド` で定義するとしています。Routeオブジェクトを `$logged_in` という変数で保持しつつ `/` パスへのアクセスは `MyApp::Root` の `indexメソッド` へ通しています。

ではコントローラ。

```pl:lib/MyApp/Root.pm
package MyApp::Root;
use Mojo::Base 'Mojolicious::Controller';

sub index {
    my $self = shift;
    $self->render(text => 'You are logged-in!');
}

sub login {
    my $self = shift;
    my $password = $self->param('password');
    return 1 if $password && $password eq 'password';
    $self->render( text => 'Your password is "password"' );
    return undef;
}

1;
```
肝心なのは `loginメソッド` でパスワードが合っているか？どうかの判断をしたあと。 **真値を返す** ことでbridgeで定義した次のアクションである `indexメソッド` に移ります。逆に **偽を返した** 時には処理はそこで終わります。この場合だと `Your password is "password"` とテキストを表示するにとどまります。

「真偽を判断してbrigedの次のアクションへ行く」ことを把握していればbridgeは便利でしょうね！

**なお、ただいま絶賛、料理の途中なので飯写真はありません**