OmniAICreator/Qiita-1.07M huggingface dataset:
MacAppStoreで購入した TextExpander のアップグレード


最新のTextExpanderは[公式サイト](http://smilesoftware.com/TextExpander/index.html)からの購入となります。

MacAppStoreでも販売されているのですが、AppStoreで購入しても最新版にアップデートできません。

FAQsによれば、MacAppStoreで購入した人も、2012/1/15以降に買った人は無料でアップグレード出来るとあります。

ダウンロードして実行すればMacAppStoreのライセンスを自動で判断しますよということなのですが、なぜかうまく行きません。

ライセンスアップデートの画面

![スクリーンショット_2014_06_23_18_37.png](https://qiita-image-store.s3.amazonaws.com/0/10441/5ad3424d-f705-740d-a732-47c8eafb63ac.png "スクリーンショット_2014_06_23_18_37.png")

この画面はすでに認証した後で、日本語に戻したレジストレーションのダイアログですが、
認証前も<< Do not localize >> という項目がありました。

どうも、日本語で立ち上げているのが悪いようで、Macの言語設定を英語にして起動したら、登録することが出来ました。
カレントディレクトリ以下で改行コードがCR+LFのファイルを探す

Linux または Cygwin でカレントディレクトリ以下で改行コードがCR+LFのファイルを探すには以下ようにします。

# やり方1
grep を使う方法です。grep にファイル名だけを表示する -l を指定しています。
(このやり方ではバイナリファイルも結果に含めてしまいますが、例2のように拡張子を指定すればより意味のある検索になるかもしれません)

> 追記(2014/06/23 19:10): CR+LFの検出を意図していましたが、<del>現状以下のコマンドではCRのみの場合にもヒットしてしまいます。良い方法が見つかったら修正します。</del>良い方法が見つかったので修正しました。

> 追記(2014/06/24 15:25): [elfmimi](http://qiita.com/elfmimi) さんが見つけてくれた方法で、CR+LFを検出することができました。

```bash:例1
$ find . -type f | xargs grep -lzUP '\r\n'
```

```bash:例2
$ find . -name "*.java" | xargs grep -lzUP '\r\n'
```

# やり方2

とりあえず、C言語でコマンドを自作して対処 (^ー^); というのは…どうでしょうかｗ
(このやり方<del>では</del>でもバイナリファイルも結果に含めてしまいます)

```bash:使い方
$ gcc -o /usr/local/bin/crlf crlf.c
$ find . -type f | xargs crlf
```

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

int main(int argc, char **argv)
{
  if(argc < 2) return 1;
  int i;
  for(i=1; i<argc; i++)
    {
      FILE *fp = fopen(argv[i], "r");
      if(!fp) continue;
      int last = 0;
      int c = 0;
      while((c=fgetc(fp)) != EOF)
        {
          if(last=='\r' && c=='\n')
            {
              printf("%s\n", argv[i]);
              break;
            }
          last=c;
        }
      fclose(fp);
    }
  return 0;
}
```

# やり方3

Linux (or Cygwin) の file コマンドを実行した際の出力(標準出力)を取り出して、"with CRLF line terminators" が含まれていたらファイル名を出力するという方法です。バイナリファイルを対象外とすることができます。
(シェルでやる前に、とりあえずC言語のコマンドを使って実現してみました)

```bash:使い方
$ gcc -o /usr/local/bin/textcrlf textcrlf.c
$ find . -type f | xargs textcrlf
```

```c:textcrlf.c
#include <stdio.h>
#include <string.h>
#define MAXLEN (1024)

int main(int argc, char **argv)
{
  if(argc < 2) return 1;
  int i;
  for(i=1; i<argc; i++)
    {
      static char cmd[MAXLEN];
      sprintf(cmd, "file %s", argv[i]);
      FILE *fpin = popen(cmd, "r");
      if(!fpin) continue;
      static char line[MAXLEN];
      if(!fgets(line, MAXLEN, fpin))
        {
          pclose(fpin);
          continue;
        }
      if(strstr(line, "with CRLF line terminators"))
        {
          printf("%s\n", argv[i]);
        }
      pclose(fpin);
    }
  return 0;
}
```

# 番外編

Linux (or Cygwin) で改行コードが LF のファイルを見つけるC言語のコマンドも作ってみました。
このコマンドも file コマンドの出力に依存しています。

```bash:使い方
$ gcc -o /usr/local/bin/textlf textlf.c
$ find . -type f | xargs textlf
```

```c:textlf.c
#include <stdio.h>
#include <string.h>
#define MAXLEN (1024)

int main(int argc, char **argv)
{
  if(argc < 2) return 1;
  int i;
  for(i=1; i<argc; i++)
    {
      static char cmd[MAXLEN];
      sprintf(cmd, "file %s", argv[i]);
      FILE *fpin = popen(cmd, "r");
      if(!fpin) continue;
      static char line[MAXLEN];
      if(!fgets(line, MAXLEN, fpin))
        {
          pclose(fpin);
          continue;
        }
      if(strstr(line, "with CR line terminators"))
        {
          ;
        }
      else if(strstr(line, "with CRLF line terminators"))
        {
          ;
        }
      else if(strstr(line, "ASCII text"))
        {
          printf("%s\n", argv[i]);
        }
      pclose(fpin);
    }
  return 0;
}
````
mental.js（仮）

Mental Pokerなどの非公開情報を含むゲームをJavaScriptとWebRTC（P2P）だけで実装するためのライブラリ開発を目指す。

# 仕様

[Contribution to Mental Poker](http://www.tdx.cat/bitstream/handle/10803/5804/jcr1de1.pdf)のChapter 6で述べられている手法を用いる。（ただ、この通りに実装すると一部動作しなかったので、その部分を修正した日本語に翻訳したものを用意した。http://qiita.com/_yyu_/items/8d8c82ba729b06b26e67 ）

Python3と[Charm-Crypt](http://www.charm-crypto.com/Main.html)により、Chapter 6で紹介されているプロトコルを[実装したもの](https://gist.github.com/yoshimuraYuu/d8897e9dce479b620606)が上手く動くことを確認した。

閾値暗号に対応してプレイヤーのドロップアウトに寛容な実装も提供してもいいかもしれない。

# 必要なもの

Pythonによる実装によって、JavaScriptでどのような機能が必要なのか分ったこと。

## 整数を扱うライブラリ

~~最初は巨大な素数を生成する機能など、よりよいライブラリを求めていたが、素数は別のプログラムで予め計算しておいてJSONなどの形にして渡すという手段も取れるので、四則演算程度しかないようなライブラリでもよいと思われる。
ただ、DH鍵交換を行う必要があるので、これらをJavaScriptで実装している[jsbn](http://www-cs-students.stanford.edu/~tjw/jsbn/)というライブラリを使うのがよいと考えている。~~
Charm-Cryptoのように、モジュラ数や楕円を同じインターフェースで使いたいと思うので、Charm-Cryptoのスタイルを参考に自力で _汎用的な整数_ を扱うライブラリを作りたいと思う。
最初からすごいボリュームのものを実装するのは大変なので、ひとまずは素数の上で動くものを作ることを最初の目標にする。

### とりあえず必要な演算

- モジュラ数の乗算、べき乗（バイナリ法など）
- 逆元（素数を法とした数の逆元は容易に求められる）

## WebRTC

[PeerJS](http://peerjs.com/)を使う。
GAE/J でgoogle account 認証を使ったページが404 Not Foundになる時

## UserService を使ってログイン

ログイン状態をチェックして、ユーザーが取得出来ない時に、
Googleのページに処理を飛ばそうとして、↓見たいに書くと間違う。

## 間違い

```
public class IndexController extends Controller {
    
    private UserService userService = UserServiceFactory.getUserService();
    
    @Override
    public Navigation run() throws Exception {
        User user = userService.getCurrentUser();
        if(user == null) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            String targetUri = request.getRequestURI();
            return forward(userService.createLoginURL(targetUri));
        }
        requestScope("username", user.getEmail());
        return forward("index.jsp");
    }
}
```

ローカル環境では間違いに気付かない。（普通にローカル環境用ログインページが表示される）

## 正しくは・・

```
return redirect(userService.createLoginURL(targetUri));
```

外部ページに飛ばすところにforwardを使ってはいけない。

- - -
参考URL : 
- [GAE + Slim3でGoogleアカウント認証 - highwinの日記](http://d.hatena.ne.jp/highwin/20090826/1251300432)
- [redirect と forward の違い | プログラミング☆手帳](http://tmopro.jugem.jp/?eid=45)
【Chrome】GoogleMapと印刷に関してのメモ

ChromeとSafariで埋め込みのGoogleMapの印刷ができないものがあったので、状況をメモ。

#GoogleMapを開いて右下の設定アイコンからの埋め込み：×
iframeで埋め込むタイプのやつ。
表示されず空白に。
※検索したらChromeバージョン20で直る予定というものを発見したが、これか？
https://productforums.google.com/forum/#!topic/chrome-ja/bpPAAP9v6hE

#マイマップ：○
見た目をカスタマイズしたりできるやつ。
埋め込み方がわからなかったので、共有コードのeditをviewにしてiframeにつっこんでみたらいけた。

```CSS
//コード修正
https://mapsengine.google.com/map/edit?mid=zp9YOynKFddo.kkFqfEH-XKeU
↓
https://mapsengine.google.com/map/view?mid=zp9YOynKFddo.kkFqfEH-XKeU
```

#Google Maps JavaScript API V3：○
jsを書くのが必要なやつ。
これはiframeじゃないみたい？

デモ：http://jsrun.it/Ituki/s9aR
独書会 Scala IN DEPTH @大人のバーガー屋 その3

[独書会 Scala IN DEPTH @大人の喫茶店 その2](http://qiita.com/asmasa/items/d36a48515e8b95ad14a4)で記述した、第2章 __The core rules__ の続き。

# 要約

## 不変性を選ぶ

- 不変性は、オブジェクトを生成した後に状態を変えないこと。
- 関数型プログラミングの優れた特徴の1つであるけど、オブジェクト指向設計のオススメのプラクティスでもある。
- Scalaでも多くのケースで、デフォルトで不変性になる。
- 不変性は特に __equality issues__ と __concurrent program__ で役に立つ。
- __immutable object__ と __immutable reference__ は違う。

### immutable reference

- Scalaでは全ての変数が、オブジェクトへの参照。
- `val`で変数定義することは、 __immutable reference__ であることを指す。
- 全てのメソッドパラメータは、 __immutable references__ である。
- クラスの引数はデフォルトでは、 __immutable references__ である。
- mutable変数を作るための方法の一つが、`var`シンタックス。。
- 参照の不変性は、参照されるオブジェクトがimmutableかどうかは関係ない。
    - immutable objectのためのmutable referenceを持てる。
    - mutable objectのためのimmutable referenceを持てる。
- オブジェクト自体がimmutable or mutableなのかを知ることが重要であることを意味している。

### オブジェクトの不変性の制約の定義

- 定義は明らかになっていない。
- 一般的にドキュメントが述べているなら、オブジェクトはimmutableと仮定しても安全であり、それ以外の場合は注意が必要。
- Scala標準ライブラリでは、パラレルパッケージ階層とimmutable class, mutable classを持つことによりコレクションクラス内での線引を明確にしている。
- 不変性の利点は、equality issueとconcurrent programで顕著になる。
 
### オブジェクトのequality

- 不変性はオブジェクトのequalityを簡略化する。
- ライフサイクルの中でオブジェクトが状態変化がなければ、深さと正確さの両方でを満たす等価の実装を作ることができる。
- これは`hash`関数を作るときにも重要で、`hash`関数はオブジェクトの簡略された表現を返すものであり、通常は`Integer`である。すばやくオブジェクトの識別をするために使われる。
- `hash`関数は`equals`メソッドとペアにするべき。
- オブジェクトの状態が変化した時、hashコードは壊れる。


#### Scalaでのequalityの実装

Scalaでは`java.lang.Object`で定義された`equals` `hashCode`メソッドを利用する。

- primitiveオブジェクトは、`scala.AnyVal`のサブタイプである。
- 一方、`java.lang.Object`を拡張している標準objectは、`scala.AnyRef`のサブタイプである。
- `scala.AnyRef`は`java.lang.Object`のためのエイリアスと考えるられる。
- `hasCode`と`equals`は、`AnyRef`で定義している。メソッド`##` `==`で提供していて、`AnyRef` `AnyVal`の両方で使える。
- `hasCode`と`equals`は、常に実装するべき。例えば、`x == y` なら `x.## == y.##`。

#### equalityの実装制約

equalityは以下の実装を取り入れる。そしてこの制約を満たすのが __immutable object__。

- 2つのオブジェクトが等しい場合は、同じ`hashCode`を持つべき
- オブジェクトのために計算された`hashCode`は、オブジェクトのライフサイクルで変更しない
- 別のJVMにオブジェクトを送るとき、equalityは両方のJVMで利用できる属性であるべき

1つ目、2つ目の制約を満足させる簡単な方法が、2つある。

- `hashCode`の計算内ではimmutable objectの内部状態のみを利用する
- `equals`と`hashCode`のために、デフォルトの概念を使う

オブジェクト内に存在するモノはimmutableでなければ __いけない__ 。  
全てのobjectをimmutableにすることは、プロセス全体を簡素化する。

### Concurrency

- 不変性はconcurrentのデータアクセスを単純化する。
- concurrent threadでの実行の必要性が高まっている。
    - スレッド間でのデータ共有の手段が必要。
    - 伝統的な手段は、mutable dataを守るためlockの仕組み。
- 不変性だとlockを減らして状態の共有ができる。
- lockはパフォーマンスのオーバヘッドを生じる。


## Rule
### 3. 不変性を選ぶ

- immutable classを作ることは、潜在的な実行時の問題をドラスティックに減らす。
 
# 所感

- immutable objectは安全性を高めれる。関数型プログラミングに馴れるための最初の一歩として、immutable objectを使い続けてみるのが良さそう。
- 所謂 __情報保持役__ のオブジェクトに関しては、`##`と`==`メソッドを実装した方が良いのは、Javaと変わらない。
Hardening参加してきました。


　[Hardening](http://wasforum.jp/hardening-project/)とは、セキュリティのイベントです。CTFが攻める側のイベントだとすると、守る側のイベントです。Hardening(堅牢化)ですね。ECサイトや各種サーバのIPアドレス表的なものをポンと渡され、「さあ、守ってね！」という感じ。ひえぇ。
メンバーは僕とyota, shien, sugi,そして社会人枠(ピン枠)のykameさんのチームE(チームecho)として参加してきました。
一般に公開されてるECサイト、旧ECサイト、本社サイトを守ればいいらしい。
　とりあえず行ったことは

- 不必要なユーザの削除(僕ら五人なのでuser6,user7は削除)
- パスワードの変更(案の定デフォルトのパスワードひどかったです。user1のパスワードがpass1111。。。)
- 不要なプロセスを止める
	- なんかatdなるデーモンが走ってた。調べてみると指定時間にコマンドを走らせるとか。怪しい……

　で、このうちユーザーの削除はチョンボだったみたいですね。ユーザごとに送られてくるメールとかあって、不必要なユーザなんかないらしいです。他の参加者にこのこと話したら笑われました。
　こんな感じで大量にあるサーバのアカウントとプロセスを確認したり、と色々やってると……

＿人人人人人人人人人人人人人人人人＿
＞　全参加チームのサーバが落ちてる ＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

　慌てましたね。だって落ちてないし。
　このサーバの生死は会場の中央にレゴブロックでできた各チームのお店の模型が置かれていて、その上のランプの点灯により確認できるシステム。全てのウェブサイト閲覧できるのに、なぜかランプはつかない。

運営「管理すべき4つのサーバのうちどれかが落ちてますねー」
え、4つ？3つじゃないの？
DNSやFWを見なおしても全然おかしなところは見つかりません。

　四苦八苦してると運営側からのヒントが。

「落ちてるのはweb1ですね」
え、web1？
と、そこで思い出される競技開始時の会話。

「とりあえず資料見てみよう」

shop1 旧ECサイト
shop2 新ECサイト
web2　本社サイト

「え、web2?web1はどこいった？」
「あ、本社サイト、旧サイトへのリンクが死んでる。これのことじゃね」
「後で問い合わせメール送っとくわ」


　こ、これだ！yotaとykameさんの瞬速の対応でどうにかサーバは復帰しました。というか、最初で気付いてたじゃん……。いや、次々発生するインシデントに流されて対応を忘れてた結果ですね。これはあるあるなのかな？
　このミスが結構でかく、僕らより先に気付いたチームがガンガン得点伸ばしてました。この敗因は後回しにしてしまった事自体ではなく、
**　タスクの管理体制が甘いから**だよね。まあ本当はgoogleドライブでの管理を色々事情があって頓挫してしまったからではあるんだけど、それならそれでポストイットとか使った管理に切り替えるべきだった。タスクの優先度、担当者、今どのタスクをやっているかを明確にすべきでした。

　そのあとも色々攻撃を受けました。
　サイト改ざんを受けて背景真っ赤に黄色い文字で「お前らのサイトはいただいた」的な表示になってたり、DDOS受けて社内ポータルサイトがくっそ重くなってたり。
あと商品の在庫がゼロになってしまい、しばらくサイトの売上がゼロになってることに気づきました。在庫の発注を行い上手く対応したと思ったのですが……。5000ある商品が二時間で在庫切れするわけないんですよね。その後監視してみると、普通一時間で200注文されるかどうか。どう考えても5000ある商品が在庫切れになるのは不自然です。
そう、SQLインジェクションです。これは後になって(懇親会で)気づきました。

　あとyum updateするとバックドアがしかけられる……という罠もありました。gpgcheckが0になっていて、保証されていないパッケージがインストールされるという。僕らは幸か不幸かアップデートしてなかったのでかかりませんでした。

　最近話題になった脆弱性も攻撃に使われてました。
* 管理用PCのIMEにbaiduがインストールされていて、ほぼキーロガーに
* Strutsで作られたページがあって、脆弱性のあるバージョンだった
など。情報処理試験とかだと最近話題になったものが問題になるかも……と警戒できたのに、これは気づきませんでした。事前準備である程度調べるべきでしたね。

　サイト改ざんはwebDAVを用いたようです。そりゃあWebDAVの設定甘かったら改ざんし放題だわな……。

　反省点としては、圧倒的な勉強不足ですね。yotaとykameさんに大分迷惑かけました。勉強のしかたがわかんないんだったら頻繁に勉強会を開いてもらうべきでした。時間を作ってもらって。わからない立場のくせに自分から動かなさすぎでした。反省。

　感想として、実際の現場の空気感を少しでも味わえたことが良かったですね。それくらい気づけただろ、ってことでも次々起こるインシデントやメール対応等に追われるとだんだん冷静な判断ができなくなりますね。あと大人チームは色々と用意してました。監視用のスクリプトやプリンタやスキャナまで持ち込んでました。ほんと、プロの方が攻撃側にも参加チームにもいて良い刺激になりました。
　貢献できたかは疑問ですが、参加してよかったです。B4,M1なんかも参加していいかもしれませんね。
VMware / Parallels で x86 Android エミュレーター / Genymotion を動かす

こんにちは。

Mac で Xamarin & Visual Studio のデモをする時など、VMware か Parallels をインストールしてその上で Windows を動かし、VS をインストールし、Android アプリを作りますよね。その後、Android Virtual Device Manager (AVD) からエミュレーターを起動すると… 起動完了まで何分も掛かる… とか、ザラですよね。Xamarin の場合は更に初回デバッグ時に Mono Shared Runtime や 各バージョンの API ライブラリなどがインストールされるため、更に時間が掛かります。せめて x86 エミュレーターや Genymotion が動いてくれれば…

前置きが長くなりましたが、x86 エミュレーターを VMware / Parallels で動かせることが最近分かりましたので、お知らせします。

なお、大前提として、PC / Mac で Android アプリを開発する場合は、標準で付いている ARM のエミュレーターは絶対に使ってはいけませんので注意しましょうｗ 

[Android再入門 - エミュレータの作成 - Qiita](http://qiita.com/gabu/items/8bc1a11f1382409f1d2a)
や、
[Genymotion + Android Studio on Mac - Qiita](http://qiita.com/Sam/items/8d551f575b617fa0be7e)
などを参考に、Intel HAXM の x86 エミュレーターや Genymotion を使用しましょう。


##VMware 上の仮想マシンでハイパーバイザーを有効にする

VMware の仮想マシンの設定から、`プロセッサとメモリ` を選択し、以下ように詳細オプションの `この仮想マシンでハイパーバイザー アプリケーションを有効にする` にチェックをつけましょう。

![x86_emu.png](https://qiita-image-store.s3.amazonaws.com/0/32453/e1fa0c11-4948-5e6b-6068-736456f38d2d.png)

その後、普通に Intel HAXM をインストールして、x86 エミュレーターを起動できます。

###Parallels でも同様の設定があるみたいです。


VMware の仮想マシン上で x86 エミュレーターが動作している画面がこちらです。

![スクリーンショット 2014-06-23 15.01.50.png](https://qiita-image-store.s3.amazonaws.com/0/32453/f77bd96c-71ea-f636-469a-de8dbd7f3172.png)


これで快適なデモ環境が作れそうです！
rails 4.1 + rspec 3 にあげたらデータベースの schema が更新されない

- rails 4.1 で `db:test:prepare` が Deprecated ([Deprecated rake db:test:* tasks as the test database is now automatically maintained. See railties release notes.](http://edgeguides.rubyonrails.org/4_1_release_notes.html#active-record-deprecations))
- `spec_helper` に `ActiveRecord::Migration.maintain_test_schema!` を足せばいい。
- 新しい `rspec-rails` なら対応しているので `rails g rspec:install` で生成し直すのでも OK
プログラム覚え書き

以下おもにC++について

# typename
http://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html

# 関数の入り口と出口をフックする
以下armccについて

・コンパイルオプション

```
--gnu_instrument
```

・関数

```
void __cyg_profile_func_enter(void *current_func, void *callsite);
void __cyg_profile_func_exit(void *current_func, void *callsite);
```

[参照](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491bj/CHDCEBEE.html)

# 不動小数点を比較する
浮動小数点を比較するときはこれ

```
__FLT_EPSILON__ 
```

https://www.jpcert.or.jp/sc-rules/c-flp35-c.html
OmniauthCallbacksController をテストする

Feature テスト
=====

wiki の通り。

[Integration Testing · intridea/omniauth Wiki](https://github.com/intridea/omniauth/wiki/Integration-Testing)


Controller テスト
=====

`request.env["omniauth.auth"]` に値を設定してやる。

例

```rb
describe CustomDevise::OmniauthCallbacksController do

  before do
    stub_env_for_omniauth
  end

  describe "GET #facebook" do
    context "as a guest user" do
      before { get :facebook }
      it { should redirect_to my_edit_user_registration_path }
    end
  end


  def stub_env_for_omniauth(uid="1234567890")
    # devise を使っている場合
    @request.env["devise.mapping"] = Devise.mappings[:user]

    request.env["omniauth.auth"] = OmniAuth::AuthHash.new({
      "provider"=>"facebook",
      "uid"=>uid,
      ...
    })
  end
end


```
特徴抽出と TF-IDF

今日は [TF-IDF](http://ja.wikipedia.org/wiki/Tf-idf) についてざっくりとまとめます。

## 特徴量と特徴抽出

TF-IDF は情報検索や文書推薦などで幅広く利用される特徴量の指標です。

* 特徴量 - 対象の特徴を表現する値
* 特徴抽出 - 対象から特徴量を取り出す

### 日本語の特徴抽出

英語の場合はホワイトスペースで分割してから記号などを取り除くだけで特徴抽出できます。
日本語の場合は形態素解析または N-Gram などの索引文字列抽出方法を利用します。

### 索引語頻度 TF (Term Frequency)

ある文書 d の中に出現する索引語 t の頻度です。文書中にその単語が何回現れたかをあらわします。

|単語|回数|
|:--|:--|
|私|1|
|東大|1|
|受験|1|
|合格|1|
|勉強|2|
|徹夜|2|

これを tf(t,d) であらわします。これは索引語 - 文書行列の要素です。この索引語 t の重みを次式であらわします。

```math
w_t^d = tf(t,d)
```

### DF (Document Frequency)

文書全体でその単語が何回現れたかをあらわします。

|単語|回数|
|:--|:--|
|合同|6|
|合格|3|
|合法|6|
|合流|7|
|合理|3|

つまり文章全体で登場回数が少ない単語は、よりその文書を特徴付けるものだとして取り扱われるわけです。

DF の対数を IDF (Inverse Document Frequency) と言います。なぜ対数を取るのかというと、文書集合の規模に対して IDF の値の変化を小さくするためです。

IDF は次式であらわされます。

```math
idf(t) = log\frac {N} {df(t)} + 1
```

### TF-IDF

TF / DF であらわします。 (IDF は DF の対数)

ある辞書が 24 万語の単語を格納していたとします。この場合、文書は 24 万次元の空間上の点としてあらわされます。なお文書に登場しない単語は TF が 0 になりますから TF-IDF も 0 になります。

あとはこれを 24 万の要素を持つ数値の配列として、類似度を求めるなりすれば文書の推薦や情報検索をすることができるようになります。

じゃあこれだけで良いのかというとそうではなく、雑音を排除したり、特徴量を正規化したりする必要があります。そのあたりの話はまた次回に。

## 参考

情報検索と言語処理 (言語と計算)
http://www.amazon.co.jp/dp/4130654055
VagrantfileでCPUコアを複数割り当て(ホスト Win7 64bit)

Win7(64bit)環境にVagrant1.6.3、VirtualBox4.3.12をインストール。
Vagrantfileでメモリ、CPUコア数を変更したがCPUコア数が変わらなかった。
調べた結果、VirtualBoxの設定でI/O APICを有効化しないとダメだったので追加。

```ruby
config.vm.provider "virtualbox" do |vb|
  vb.customize ["modifyvm", :id, "--memory", "768", "--cpus", "2" ,"--ioapic", "on"]
end
```
AngularJSとwindow関数あれこれのメモ

理解があっているか自信はないのですが、たぶんこういう風にするのだろうということをメモ。
（違うぞ、、という場合はすみませんがコメントお願いします。）

## onload後にさせたい処理

次のように `.run` フェーズに書く。
（各種のリスナー登録はこのフェーズでやると良い？）

```javascript:app.js
'use strict';

angular.module('angularJsWindowTestApp', [
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ngRoute'
])
  .config(['$routeProvider', function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  }])
  .run(['$window', function ($window) {

    //ここにonload時にさせたい処理
    console.log("ロード終了");
    $window.applicationCache.update();

  }]);
```

## window関数の利用

JavaScriptなので、普通に次のように `window` にアクセスできてしまう。

```javascript
  〜
  .run(['$http', function ($http) {

    addEventListener("online", function() {
      applicationCache.update();
    }, false);

    location.reload();

  }]);
```

だが、AngularJSでそれは推奨されていないので、`$window` をDIして利用する。
参考：https://code.angularjs.org/1.2.16/docs/api/ng/service/$window）

```javascript
  〜
  .run(['$http', '$window', function ($http, $window) {

    $window.addEventListener("online", function() {
      $window.applicationCache.update();
    }, false);

    $window.location.reload();

  }]);
```

## setTimeoutのようなことをする

`window.setTimeout` のラッパーである `$timeout` サービスを利用する。例えばブラウザでのアプリケーション読み込み後、5秒経過したらアラートを表示するには次のようにする。
`$timeout` は promise を返すので、処理待ちで固まることはない。

```javascript
  〜
  .run(['$window', '$timeout', function ($window, $timeout) {

    $timeout(function() {
      $window.alert('アラート表示')
    }, 5000);

  }]);
```

参考：https://code.angularjs.org/1.2.16/docs/api/ng/service/$timeout
[jQuery, Colorbox] Colorboxを使って開いたページで処理した何らかの結果を元のページに反映させる

###### ※ Backbone.jsを使っています。

###### ※ Colorbox はこちら→ [Colorbox - a jQuery lightbox](http://www.jacklmoore.com/colorbox/)

## 親ページのHTML

```html:parent.html
<!-- 中略 -->
<!-- CSS 読み込み -->
<link href="bootstrap.min.css" rel="stylesheet">
<link href="colorbox.min.css" rel="stylesheet">
<!-- 中略 -->
<!-- Form 部分 -->
<div class="input-group">
  <span class="input-group-btn"><button id="btnSearch" class="btn btn-default" type="button"><span class="glyphicon glyphicon-search"></span></button></span>
  <input type="hidden" name="parent_id" id="parent_id" class="form-control"><!-- 順番大事（CSS崩れる） -->
  <input type="text" name="parent_name" id="parent_name" class="form-control" readonly="readonly">
</div>
<!-- 中略 -->
<!-- JavaScript　読み込み -->
<script src="jquery.min.js"></script>
<script src="underscore-min.js"></script>
<script src="backbone-min.js"></script>
<script src="jquery.colorbox-min.js"></script>
<script src="bootstrap.min.js"></script>
<script src="parent.js"></script>
```


## 親ページのJavaScript

```coffeescript:parent.coffee
#
# Modelの定義
#
class ParentModel extends Backbone.Model
  defaults:
    iframe: true
    href:   "child.html"

#
# Viewの定義
#
class ParentView extends Backbone.View
  el: "#btnSearch"

  events:
    "click": "search"

  search: ->
    $.colorbox @model.toJSON()

#
# インスタンスの生成
#
mParent = new ParentModel()
vParent = new ParentView model:mParent
```


## Colorbox で開かれる子ページのHTML

```html:child.html
<!-- 中略 -->
<!-- parent.html に渡すデータ -->
<a href="#b44c89cd2ae18632bdb1a98500e766d1/ユニークなID">ユニークなID</a>
<!-- 中略 -->
<!-- JavaScript　読み込み -->
<script src="jquery.min.js"></script>
<script src="underscore-min.js"></script>
<script src="backbone-min.js"></script>
<script src="child.js"></script>
```


## Colorbox で開かれる子ページのJavaScript

```coffeescript:child.coffee
#
# Routerの定義
#
class Router extends Backbone.Router
  routes:
    ":id/:name": "close"

  close: (id, name) ->
    $("#parent_id", window.parent.document).val id
    $("#parent_name", window.parent.document).val name
    parent.$.fn.colorbox.close()

#
# インスタンスの生成
#
window.router = new Router()
Backbone.history.start()
```

## 動き
子ページのリンクをクリックすると、親ページのフォームに値が入力された後、colorboxが閉じる。

## 味噌
 * jQueryオブジェクトを生成するさい、第二引数（context）に``window.parent.document``を指定すると、親windowのdocument内を対象としてくれる。
 * そもそも、``$("#hoge")`` では、``$("#hoge", document)``　というように、第二引数が省略されているそうです。→[jQuery Core](http://api.jquery.com/jQuery/)
 * contextを指定してあげたほうが、処理が速くなるかも？（未検証）
go/Windows の filepath.Join はダメっぽい

```pathcombine.go
package main

import "fmt"
import "os"
import "path/filepath"

func main(){
	fmt.Println(filepath.Join(os.Args[1:]...))
}
```

```text
$ go run pathcombine.go c:\opt \ahaha b:\ihihi
c:\opt\ahaha\b:\ihihi
```

にょおおおお

# Pythonだと

期待どおりの動作をする

```pathcombine.py
import os.path
import sys

print os.path.join(*sys.argv[1:])
```

```text
$ ipy pathcombine.py c:\Opt \ahaha b:\ihihii
b:\ihihii
```

# （追記）VB.Netでも

期待どおりの動きをする

```pathcombine.vb
 Module Module1
    Sub Main()
        Dim args As String() = System.Environment.GetCommandLineArgs()
        If args.Count >= 3 Then
            Dim args2 As String() = New String(args.Count - 2) {}
            Array.Copy(args, 1, args2, 0, args.Count - 1)

            Console.WriteLine(System.IO.Path.Combine(args2))
            Console.ReadLine()
        End If
    End Sub
End Module
```

コマンドライン引数

```text
c:\opt \ahaha b:\ihihi
```

結果

```text
b:\ihihi
```

# （追記）ということで

自分はとりあえず、簡単なラッパーをかまして逃げた。([元ソース](https://github.com/zetamatta/nyagos/blob/master/dos/dos.go))

```dos.go
package dos
// 中略
var rxDriveOnly = regexp.MustCompile("^[a-zA-Z]:$")
var rxRoot = regexp.MustCompile("^([a-zA-Z]:)?[\\/]")

func Join(paths ...string) string {
	start := 0
	for i, path := range paths {
		if rxDriveOnly.MatchString(path) {
			paths[i] = path + "."
		} else if rxRoot.MatchString(path) {
			start = i
		}
	}
	if start > 0 {
		paths = paths[start:]
	}
	return filepath.Join(paths...)
}
```

これ、具体的にどこで使っているかというと、[go製のコマンドラインシェル NYAGOS](https://github.com/zetamatta/nyagos) の内蔵 [ls](https://github.com/zetamatta/nyagos/blob/master/ls/ls.go) でございます。
Devise::RegistrationsController を継承した Controller にて authenticate_user! が呼ばれない

現象
=====

- devise を利用している
- Devise::RegistrationsController を継承したコントローラを使っている
- そのコントローラの中で独自のアクションを定義している
- 独自アクションに authenticate_user! フィルタを適用させたいのだけれども・・・適用されていない


対応方法
=====

この対応はベストではないかもしれませんが。

`Devise::RegistrationsController` を継承したクラスではなく、別のコントローラ(`UsersController` など)にアクションを書く。

before
-----

```
class CustomDevise::RegistrationsController < Devise::RegistrationsController

before_filter :authenticate_user!, only: [:connect_with_facebook] # 呼び出されない

def connect_with_facebook
  ...
end

end
```

after
-----

```
class UsersController < ApplicationController
  before_filter :authenticate_user!, only: [:connect_with_facebook]

  def connect_with_facebook
    ...
  end

end
```


参考
=====

- [devise のコントローラを継承して authenticate_user! するときの注意事項 - willnet.in](http://willnet.in/108)
- [authenticate_scope! Problem · Issue #1155 · plataformatec/devise](https://github.com/plataformatec/devise/issues/1155)
- [before_filter in registration controller · Issue #1630 · plataformatec/devise](https://github.com/plataformatec/devise/issues/1630)
気になる言葉メモ


#シンボル
シンボルとは「文字列を整数で表したもの」です。

+ シンボルを作るとRubyの内部では「文字列→一意の整数」の変換が行われ、整数値として管理される。

+ シンボルは１つの文字列が１つのオブジェクトに１対１で対応する

+ シンボルの内容は変更できない。upcase!のような！付きのメソッドを持たない。

>多くのRubyプログラマーは、ソースコードの可読性を高める目的でシンボルを使います。シンボルを使えば、ある文字列が特別な意味を持つ「名前」を表していることを明示できます。また、"name"よりも:nameの方が書きやすいという理由もあります。

#ミックスイン

> Rubyにはクラスに似たものとして **モジュール** があります。
「module モジュール名　〜end」でモジュールを定義し、その中にメソッドを記述できます。
xcode6 beta2 + github でソース管理 その1(リモートリポジトリにソースをアップロード)

xcode6から新規プロジェクトを作成した後、最初にやるべきことはソースのバーション管理ですね。本ブログではxcode6からgithub(HTTP方式)にソースをあげるまでの流れについて説明します。

**※テスト環境について**
mac os x 10.9.3
xcode6 beta2

## git 初期化不要

xcode6の新規プロジェクトを作成してgit管理をしようとメニューを開いてみたら、各種gitコマンドが有効になっていて使えるようになっていました。

ソース管理の設定から確認をしてみました。
menu > Source Control > プロジェクト名 - master > Configure プロジェクト名 で表示される設定画面でBranchesを選択すると、master bancheがある。

![スクリーンショット 2014-06-23 11.27.11.png](https://qiita-image-store.s3.amazonaws.com/0/46268/67ac9b80-f866-cfeb-7e91-887aed9450f0.png)

xcode6プロジェクト作成と同時にmaster branch が自動的に作成されるようですね。
これは便利!!

gitをプロジェクトディレクトリに入れるためにはプロジェクト作成時に「create git repository on ...」にチェックする必要があります。

![スクリーンショット_2014_07_05_10_23.png](https://qiita-image-store.s3.amazonaws.com/0/46268/c1532040-d3af-b0e2-a9e6-6e1ea3969e4e.png)


## githubリモートリポジトリ作成

テスト用のリポジトリをgithubに作成しました。
https://github.com/kilhyungdoop/ios8_swift_app

※ githubのリポジトリ作成時、gitignore選択メニューにまだswift言語はありませんでした。


## xcodeにリモートリポジトリを設定

+ menu > Source Control > プロジェクト名 - master > Configure プロジェクト名 で表示される設定画面でRemotesを選択。
+ 画面左下の＋ボタンクリック。
+ Add Remote ... を選択すると次の画面が現れる。

![スクリーンショット 2014-06-23 11.45.16.png](https://qiita-image-store.s3.amazonaws.com/0/46268/6a696a10-1dad-b609-ffd6-25622e0d2535.png)

Name: リモートリポジトリ名。originのままでよし！
Address: githubリモートリポジトリのURI。今回はHTTP用のURI設定

+ Name, Addressの設定後、Add Remoteボタンをクリック。
+ originリポジトリが作成されていることを確認し、Doneをクリック。

## xcodeからgithubへpush

+ menu > Source Control > Push を選択すると次の画面が現れる。Pushをクリックする。

![スクリーンショット 2014-06-23 11.46.31.png](https://qiita-image-store.s3.amazonaws.com/0/46268/e92995ca-a787-0291-d73e-9f919ac29713.png)

+ 次の画面からgithubのgithubのユーザ名とパスワードを入力し、OKクリック。

![スクリーンショット 2014-06-23 11.47.08.png](https://qiita-image-store.s3.amazonaws.com/0/46268/8f9f8b33-6ce8-9a23-a684-bb91dfa29da4.png)

## githubのリポジトリを確認

https://github.com/kilhyungdoop/ios8_swift_app
無事にソースがアップできました。
githubにあがってるswiftソースを確認したら、まだハイライトされてなくて残念でしたがそのうちきれいに表示されるでしょうね。

xcode6 beta2 + github でソース管理 その2 ではxcode6から新規ブランチの作成、ソースのcommit, pullなどについて説明する予定ですので、興味あるかたはフォーロをお願いいたします。^^v

[IOS8アプリ開発日誌掲載中！！](http://qiita.com/kilhyungdoo/items/087dcbf971ac5e05d3f0)
FormControllerをControllerからごにょごにょする

HTML:

```html:foo.html
<div ng-conroller="FooCtrl">
  <form name="form1">
    <div ng-init="putForm(form1)"></div>
    <label><input>・・・</input></label>
　　...
  </form>
  <form name="form2">
    <div ng-init="putForm(form2)"></div>
    <label><input>・・・</input></label>
　　...
  </form>
  <button ng-click="register()">Register</button>
</div>
```

Controller:

```js:foo.js
function FooCtrl($scope){
  $scope.putForm = function(form){
     if (!$scope._forms) {
            $scope._forms = {};
     }
     $scope._forms[form.$name] = form;
  };

  $scope.register = function(){
    if($scope._forms.form1.$invalid || $scope._forms.form2.$invalid){
      window.alert("invalid!!");
      return;
    }
    ...
  };
}
```
macのローカルにexpressインストールしようとしてハマった



```
$ npm install -g express
```


でインストールした後に`~/.nvm/v0.10.29/lib/node_modules`にはしっかり入っているのに`bash: express: command not found`と出て迷走してしまった備忘録。

express 4系ではexpress-generatorを入れないといけない模様。

```
$ npm install -g express-generator
```

で問題なく動くようになりました。

```
$ express myapp
$ cd myapp && npm install
$ DEBUG=myapp ./bin/www
```

```
$ open http://localhost:3000
```
でExpressの画面が出ればひとまず準備完了。

ポートを変える場合は起動する前に下記のように指定してから起動。

```
export PORT=3001
```



via: [http://stackoverflow.com/questions/23002448/express-command-not-found/23003386#23003386?newreg=e0a4aad84b844532b5c1488c84bfc17a](http://stackoverflow.com/questions/23002448/express-command-not-found/23003386#23003386?newreg=e0a4aad84b844532b5c1488c84bfc17a)
rbenv のよく使うコマンドメモ

rbenv のよく使うコマンドの個人的なメモ。

# インストール可能な Ruby のバージョン一覧

```console
$ rbenv install -l
```

# Ruby をインストールする

```console
$ rbenv install 2.1.2
```

# インストールした Ruby を使えるようにする

```console
$ rbenv rehash
```

# インストールされている Ruby のバージョン一覧

```console
$ rbenv versions
```

# 使用する Ruby のバージョンの切り替え

## 現在実行しているシェル環境の Ruby のバージョンを切り替える

```console
$ rbenv shell 2.1.2
```

## システム全体の Ruby のバージョンを切り替える

```console
$ rbenv global 2.1.2
```

# Ruby のアンインストール

```console
$ rbenv uninstall -f 2.1.2
```

## 削除後には rehash しておく

```console
$ rbenv rehash
```

# 参考

- Ruby - Mountain Lion環境への「rbenv」のインストール手順 + 設定方法 - Qiita  
http://qiita.com/skinoshita/items/2cf0c27a6ff4f0602568
- rbenv rehashは何をやっているのか？ - DQNEO起業日記  
http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html
[Riak] VagrantでRiakを動かす

# はじめに
VagrantでRiakを動かして、ローカルPC上でRiakを使ったアプリを動作できるようにします。

# Vagrantをインストールする
refs: http://www.webcyou.com/?p=4632

```
vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
vagrant box list | grep centos64
vagrant init centos64
vagrant ssh-config > .vagrant.ssh.config
```

# Vagrantで起動したOSにscpでファイルをコピーする

```
vagrant ssh-config > .vagrant.ssh.config
scp -F .vagrant.ssh.config hogehoge default:
```

# Vagrantで起動したOSにHTTPアクセスできるようにする
refs: http://www.webcyou.com/?p=4632

### httpdをインストール

```
vagrant up
sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on
```

### iptablesを無効化

```
sudo service iptables stop
sudo chkconfig iptables off
```

### VagrantfileにIPアドレスを設定

Windowsのネットワークと共有センターでVirtualBox Host-Only NetworkのIPv4アドレスを確認します。
Vagrantfileのprivate_netowkrに、確認したIPv4アドレスを設定します。

```
vagrant reload
```

# Riakをインストールする

http://docs.basho.com/riak/latest/downloads/ から、rpmイメージをとってきて、rpm -ivh *.rpmします。

```
wget http://s3.amazonaws.com/downloads.basho.com/riak/2.0/2.0.0beta1/rhel/6/riak-2.0.0beta1-1.el6.x86_64.rpm
sudo rpm -ivh riak-2.0.0beta1-1.el6.x86_64.rpm
```

# ulimitを設定する
refs: http://blog.father.gedow.net/2012/08/08/ulimit-configuration/

# riak.confを設定する
file: /etc/riak/riak/conf
listener.http.internal, listener.protobuf.internalのipアドレスに、Vagrantfileで設定したIPv4アドレスを記載します。
もしくは、0.0.0.0でもよいです。

# Riakを起動する

```
$ riak start
```

これでVagrantfileで設定したIPv4アドレス経由で、Riakを使えるようになりました。
Project SienaやWindowsストアアプリで地図を起動し、特定の住所を表示させる

Project Sienaで使ったネタですが、Windowsストアアプリ開発でも適用できる内容だと思ったのでこちらに。

基本的にWindowsストアアプリでは、別のストアアプリを起動するということができません(でしたよね？)。ただし、「URLを指定してそれを起動する」 ということはできますので、それを使えば別のストアアプリを起動することもできます。


というわけでおわかりですね？地図アプリのURLに特定のパラメータを送ることで、特定の住所を表示させるということも出来ます。

# 地図アプリの起動URL

地図アプリの起動URLは、「bingmaps://」です。WindowsストアアプリからこのURLを指定すると、地図アプリが起動します(余談ですが、Windows+Rで表示されるファイル名を指定して実行 ダイアログでこのURLを入力しても、地図アプリが起動します。アプリの表示テストをするときにちょうど良いかもしれません)。

また、ここに住所などのパラメータを追加すると、地図を表示した上で特定の住所を検索するということも出来ます。

## 特定の住所を表示する
住所を指定して特定の場所を表示します。住所はどこからはじまる書式でも良いですが、うっかり区や町からはじめると、偶然他の県の住所とかぶってしまうことがあるので、県から書くことをお勧めします。

 * `bingmaps://?q=[住所]`
 * ex). `bingmaps://?q=横浜市西区高島二丁目`(横浜駅の住所を表示します)

## 特定のGPS座標を表示する
GPS座標値を指定して地図を表示します。まだ設立して間もない施設など住所が振られていなかったり住所が地図アプリに反映されていない場所を示すときにも使えます。
ただ、Project Sienaからではなぜか正しく指定できませんでした。

 * `bingmaps://?q=[緯度],[経度]`
 * ex). `bingmaps://?q=35.466190,139.622696`(横浜駅の住所を表示します)

# おまけ どんなURLを指定できるのか？
Project SienaやWindowsストアアプリでどんなURLを指定可能かどうかは、実はコントロールパネルから確認可能です。

「コントロール パネル\プログラム\既定のプログラム\関連付けを設定する」より「プロトコル」を表示(下の方にスクロールさせると出てきます)します。
![登録済みプロトコルの一覧](https://qiita-image-store.s3.amazonaws.com/0/14499/b00e9b26-83b2-37ab-7db7-ca9821731351.png)

プロトコルの列に書かれている英文字の最後に:を付けることで、アプリが起動できます。たとえばここでは「BINGFINANCE」と書かれている行があるので、「bingfinance://」と書くとプリインのファイナンスアプリが起動します。

アプリによってはパラメータがないと起動しないものもあるので、あくまでこんなアプリが起動できるという参考にしかならないのですが、ひとまず考えるきっかけにでもなれば と。
Rubyの構文について

#変数について
変数は数値や文字列などさまざまな **オブジェクトを指し示す**のに使います。
＝でオブジェクトと変数を結べば、その場で変数ができます。


+ message:ローカル変数
+ $message:グローバル変数
+ @massage:インスタンス変数
+ @@message:クラス変数
+ MESSAGE:定数

## 数値
数値を表すオブジェクトには、Fixnum Bignum Floatがあります
>
num= 1234                      #Fixnum
world_population = 6464750000  #Bignum
pi = 3.14159                   # Float


##文字列
Rubyの文字列はStringクラスのオブジェクト。

二重引用符で囲まれた文字列の中に#{○○}という形の部分があると「○○」を式として評価し、文字列に変換した結果が埋め込まれます。これを **式展開** と呼びます。


```chapter2\2-1-3c.rb

# coding: utf-8

puts "２かける３は#{2 * 3}です。"
name = "佐藤"
puts "#{name}さん、こんにちは。"

```

>RESULT
２かける３は６です。
佐藤さん、こんにちは。

## 数値と文字列の変換
Rubyは数値を文字列を自動的に相互変換しない。
** 数値を文字列を＋で連結したち＞で比較したりするとエラーとなる **

>ある変数が何のオブジェクトを指しているかわからないときは、文字列連携の代わりに式展開を使う

# 配列
配列とはいくつものオブジェクトを並べてまとめるためのオブジェクトです。
Rubyの配列は **Arrayクラス**のオブジェクトです。

## 特殊オブジェクト

+ nil 「何もない」  

+ true 「真」

+ false 「偽」
Bundlerについて

#Bundlerとは？
>Gemパッケージの管理とインストールのために使われるツール。

+ rails new でアプリケーションを作成すると、Gemfileが作成される。

+ Gemfileには必要なGemパッケージが記載されている

+ ソースを受け取った他の開発者は　> bundle install を実行するだけで。必要なGemパッケージをインストールして環境を揃えることができる

## bundle コマンドオプション
> bundle list  

  必要なGemパッケージをすべて一覧表示する

>bundle check
 
 必要なGemパッケージがインストールされているか調べる。インストールされていれば、「The Gemfile's dependencies are satisfied」と表示される。

>bundle update

 Gemfile.lockを無視して、Gemfileを元にGemパッケージをインストールし直し、Gemfile.lockを作り直します。Gemパッケージを最新版にしたい時につかいます。
iOS開発者がMacお引っ越し/クリーンインストール前にやっておきたいこと

#それは「証明書」の書き出し

* まず、キーチェーンアクセスを開く
* "iPhone Developer"や"iPhone Distribution"などの証明書を探す
* 右クリックし、「(書き出したい証明書の名称)を書き出す…」を選択
* フォーマットは「個人情報交換(.p12)」
* パスワードを設定して、保存
* USBなどにうつしておく
* 新しいPCにコピーして、ダブルクリック
* 先ほど設定したパスワードをいれればOK!


一回クリーンインストールしてしまい、
Xcodeで開発、archiveしようとしたらうまくいかず…
証明書が必要でした！(まるごとバックアップとっておいてよかった…)
Warning: DOMDocument::loadHTML() を抑制する

HTML5 な文書を DOMDocument::loadHTML 使って読み込ませると Warning が出る。

```php
<?php
$html = '<!doctype html><html><body><video loop><source src="test.mp4"></source></video></body></html>';
$dom = new \DOMDocument();
$dom->loadHTML( $html );
var_dump( $dom->getElementsByTagName( "video" )->length );

//Warning: DOMDocument::loadHTML(): Tag video invalid in Entity, line: 1 in /path/to/sample.php on line 4
//Warning: DOMDocument::loadHTML(): Tag source invalid in Entity, line: 1 in /path/to/sample.php on line 4
// int(1)
```

loadHTML の前後に ```libxml_use_internal_errors``` と ```libxml_clear_errors``` を呼び出せばエラー抑制できる。

```php
<?php
$html = '<!doctype html><html><body><video loop><source src="test.mp4"></source></video></body></html>';
$dom = new \DOMDocument();
libxml_use_internal_errors( true );  // これと
$dom->loadHTML( $html );
libxml_clear_errors();  // これ
var_dump( $dom->getElementsByTagName( "video" )->length );

// int(1)
```
capistranoデプロイ時に、新しくリリースされるgitのコミットログをHipChatに通知


# 環境
* Rails 3.2.18
* capistrano 3.2.1
* capistrano-pending 0.0.1
* capistrano-rails 1.1.1
* hipchat 1.2.0

# capistrano-pending

[capistrano-pending](https://github.com/a2ikm/capistrano-pending)というgemを利用した。

```ruby:Gemfile
group :development do
  gem 'capistrano-pending', require: false
end
```

これを利用することで、capistrano3でも`cap deploy:pending`コマンドが提供される。
デプロイ先の`REVISION`ファイルとローカルでのコミットを比較して、コミットの差分ログを表示してくれる。

実行すると、こんな感じのが表示される。

```
commit 94dc3ba967072e48baa39cd5754b838444a9e2ce
Merge: 13d432a df6ca9d
Author: Bob <hoge@example.com>
Date:   Mon Jun 23 09:55:19 2014 +0900

    Merge pull request #437 from Hoge/Fuga
    
    Add hoge
```

# HipChatに通知

capistranoの設定を編集。
上記の`cap deploy:pending`で得られる情報を適当に抜き出して、HipChatに通知する。
以下のように設定。（雑なコードですが）

```ruby:lib/capistrano/hipchat.cap
namespace :hipchat do
  token = "<HipChat Token>"
  room_id = "<通知するRoomのID>"
  client = HipChat::Client.new(token, api_version: "v2")[room_id]

  def deploy_user
    `git config user.name`.strip || ENV['USER']
  end

  def release_commits
    commits_str = `cap #{fetch(:rails_env)} deploy:pending`
    commits = commits_str.split("\n\n")
    return if commits.blank?
    messages = []
    commits.each_with_index{|ci, index| messages << ci.strip if index.odd? }
    commiters = []
    commit_hashes = []
    commits.each_with_index do |info, index|
      next if index.odd?
      info_ary = info.split("\n")
      hash_elem = info_ary[0]
      commiter_elem = info_ary.select{|elem| elem if elem =~ /Author:/ }.first
      match_index = (commiter_elem =~ /</)
      commiters << commiter_elem[8..(match_index - 2)]
      commit_hashes << hash_elem[7..-1]
    end

    release_info = "<br><br>These commits are released at #{fetch(:rails_env)}!!<br>"
    (commits.length / 2).times do |n|
      release_info <<
        "- <a href='https://github.com/Hoge/#{fetch(:application)}/commit/#{commit_hashes[n]}'>" \
        "#{messages[n]}</a> " \
        "by #{commiters[n]}<br>"
    end
    release_info
  end

  namespace :update do
    desc 'Set releasing commit data'
    task :set_release_commit do
      run_locally do
        set :release_commits, release_commits
      end
    end

    desc "Notify when finishing deploy"
    task :finish do
      run_locally do
        client.send(
          "Capistrano",
          "#{deploy_user} finished deploying #{fetch(:application)}/#{fetch(:branch)} to #{fetch(:rails_env)}." \
          "#{fetch(:release_commits)}",
          { notify: true, color: 'green' }
        )
      end
    end
  end
end

before 'deploy:updating', 'hipchat:update:set_release_commit'
after 'deploy:finishing', 'hipchat:update:finish'
```

これで、デプロイ終了時、リリースされたコミットがGithubのリンク付きで表示される。

```
Bob finished deploying Hoge/master to production.

These commits are released at production!!
- Add hoge by Bob
- (以下略)
```

みたいな感じです。
Swiftのautoreleasepool等で注意する点


Swiftの`autoreleasepool`は引数として関数を受け取るもので、Objective-Cと似たような構文で記述することができます。

しかしこれには罠があり、今までObjective-Cで書いていた時と同じような感覚で使ってしまうと実行結果が異なる場合があります。

以下、再現を目的としたサンプルコードです。

```objc:Objective-C
@implementation Hoge
{
    int _counter;
}

- (void)test
{
    _counter = 0;
    for (int i = 0; i < 10; i++) {
        @autoreleasepool {
            if (i == 5) {
                return;
            }
            _counter++;
        }
    }
}

- (void)start
{
	[self test];
    NSLog(@"%d", _counter); // 5
}
```

```swift:Swift

class Hoge {
	var _counter = 0
    
	func test() {
        _counter = 0
        for i in 0..<10 {
            autoreleasepool {
                if i == 5 {
                    return
                }
                self._counter++
            }
        }
    }

	func start() {
	    test()
        println(_counter) // 9
	}
}
```

`autoreleasepool`の中で特定の条件の時に`return`で関数から抜けようというものです。
Objective-C版は5, Swift版は9と、コードの見た目は似ているのに結果が異なります。

気がついてしまえば簡単なのですが、Swiftのautoreleasepoolに書かれた`return`はtest関数から抜けるわけではなく、引数に渡した内部関数（＊用語正しいか判りません）から抜けるだけです。

当然、`break`で外部の`for`ループから抜ける事もできません（上の例ではコンパイルエラーになります）。

また、Swiftではメンバ変数にアクセスする際にわざわざ`self.`を付ける必要が有るのも違いと言えます（これが結構面倒になりそうな予感ですが、だったら関数ごと外に出してしまった方が良いかもしれませんね）。

## おまけ

`@synchronized`に関しても、Swiftの`autoreleasepool`関数のように、なんとなくObjective-Cと同様に書くことができるようです（こちらは非公式ですが）。

```Swift:
// どこかに用意しておく
func synchronized(obj: AnyObject, code: () -> ()) {
    objc_sync_enter(obj)
    code()
    objc_sync_exit(obj)
}

...

// このように使う
synchronized (self) {
    // ここに排他処理を書く
}
```

参考：http://stackoverflow.com/questions/24045895/what-is-the-swift-equivalent-to-objective-cs-synchronized

当然ながら`autoreleasepool`同様の問題がこちらでも起きます。
こちらのなんちゃって`synchronized`関数は、ベストな選択とは言えないかもしれませんね。
設計哲学

#DRY
> Don't Repeat Yourself 繰り返しを避けよ

同じことを繰り返し記述するのは無駄であり、仕様変更やバグフィックスの時に一部を変更し忘れる可能性が高くなる。


#設定より規約
>Convention pver Configuration

「規約」＝「デフォルトの設定」。
あらかじめ用意された規約に従ってアプリケーションを開発することで、記述量を大幅に減らせる。

例）モデルの命名規約
テーブル名：members
モデルのクラス名：member
クラスを記述するファイル名：member.rb

> 「制約が自由をもたらす」

決まり切った手順に従うことで余計な設定を記述する必要がなくなり、プログラマはコードに集中できる。
SpreadsheetsでGAS無しで条件によって行に色つける

時々GASの質問で更新されるごとに行に色付けたい(Todoリストとかで)って話を頂くのですが
「それGAS無しでできますお( ｰ`дｰ´)ｷﾘｯ」なのです。

というかいつもそれを口頭で伝えるの面倒なので記事にします。

# 前提

「新しいSheets」でないと無理です。
新しいSheetsになっているかはSpreadsheetsを開いて右下に緑のチェックアイコンが付いているかを見てみて下さい。

![無題スプレッドシート_-_Google_スプレッドシート_と_1__tominaga_BN1329____git_gas-library-box__zsh__と_LINE.png](https://qiita-image-store.s3.amazonaws.com/0/2965/6a216500-69fa-425d-3fc5-566a86d563ea.png)

# やりかた

条件付き書式を使います。

1. シートを準備します。  
![シート1.png](https://qiita-image-store.s3.amazonaws.com/0/2965/b7fe1a92-5286-fb75-2fc5-ab2f016659a1.png)
2. 条件付き書式を付けたい行を全部選択します。(CTRL+Aでも多分OK)
![シート2.png](https://qiita-image-store.s3.amazonaws.com/0/2965/b7d05b2b-d9db-5880-24d5-944727764ab2.png)
3. 右クリックして「条件付き書式...」を選択します。
![シート3.png](https://qiita-image-store.s3.amazonaws.com/0/2965/58e2f3dc-c13e-08de-cdf0-30961e827fe0.png)
4. 条件部分を「カスタム数式」にします。
![シート4.png](https://qiita-image-store.s3.amazonaws.com/0/2965/37d60ce0-62bb-0374-d19c-cc48603eaafc.png)
5. 数式で条件を書きます。「$D」の様に列が固定されるように数式を書いて下さい。
![シート5.png](https://qiita-image-store.s3.amazonaws.com/0/2965/07970ad3-4d06-5b08-039e-aed539153676.png)
6. 任意の条件を設定して、「条件を保存」ボタンを押せば完了です。
![シート6.png](https://qiita-image-store.s3.amazonaws.com/0/2965/34faa036-1cb2-2c6f-d2a8-94c57d87d2bc.png)

# まとめ

以上で終了です。
本気を出すと以下の様なガントチャート(白目 をGAS無しで作ることも可能です(震え声
ただしあまりにも条件を増やしたりすると更新速度や、描画速度が下がるので注意が必要です。

![シート7.png](https://qiita-image-store.s3.amazonaws.com/0/2965/4a794c1f-3e8d-909f-91cd-fd90bfbd4e5d.png)
書式付き文字列の実装方法多すぎとちゃうか？

書式付き文字列の関数を実装する方法色々。
他にも実装方法があったりするが、使った事あるのだけ。

#可変数引数
cでもc++でも動かしたいならこんな感じ。
特徴としては
・メモリリークが怖い、危険
・書式を間違えると何も表示されないし、無駄に引数を増やすと無視されるし、順番が分かりにくい
・桁数指定などのフォーマットが覚え易いかも
・自分の場合たまにしか実装しないので、毎回実装方法を忘れる
・複数の可変数引数を持つことは出来ないので、書式付き文字列AとBを比較する関数が書けない
・デフォルト引数と両立出来ない

```cpp
#include <iostream>
#include <stdarg.h>

void log(const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    char* buffer;
    vasprintf(&buffer, format, ap);
    va_end(ap);
    
    std::cout << buffer << std::endl;   
    free(buffer);
}

int main()
{
    log("1+1=%d", 1 , "あ" , 0.1 );    
}
```
[参考1](http://hitorilife.com/verargs.php)
[参考2](http://jianji.noor.jp/wiki/index.cgi?page=%A5%D5%A5%A9%A1%BC%A5%DE%A5%C3%A5%C8%CA%B8%BB%FA%CE%F3%A4%F2%C5%B8%B3%AB%A4%B9%A4%EB%A5%D0%A5%C3%A5%D5%A5%A1%A4%CE%B3%CE%CA%DD)

#Boost.Format
[参考](https://sites.google.com/site/boostjp/tips/format)
リンク先の方が詳しい
･型指定しなくて良いので安全だし、楽
･フォーマット指定がやや豊富
･一応printfの代替手段であるため、引数をstd::stringにする実装になり関数の利用者がboost::formatと書く必要がある(初期化子リストでなんとか出来そう?)
･const char*やstd::stringが引数になっている関数を再実装せずに可変数引数っぽく使える
･可変数引数ではないので、デフォルト引数や複数の書式付き文字の比較も可能

#可変数引数テンプレート
c++11で追加されたあれで実装。
・安全だし、順番が分かりやすい
・フォーマット指定はiomanipのstd::setwとかを使う、多機能だけど冗長かも
・可変数引数なので、デフォルト引数や書式付き文字列同士の比較関数は書けない
・テンプレートなので仮想関数に使えない
・テンプレートの展開量が気になる場合、可変数引数を文字列に変換する関数を使いまわそう。
[参考](http://lnseab.hatenablog.jp/entry/2012/12/13/172753)

```cpp
#include <iostream>
#include <string>
#include <boost/format.hpp>
#include <stdarg.h>

template <class TLast>
void Log(TLast last)
{
    std::cout << last;
}
template < class TFirst, typename ... TRest>
void Log(TFirst first, TRest... rest)
{
    std::cout << first;
    Log(rest...);
}

int main()
{
    Log( "1+1" , "=" , 1);
}
```

#可変数引数テンプレートで初期化可能な型を引数にする
　例えばstd::maxでは、複数の値の最大値を返すのに、可変数引数を使わずコンテナを引数にして初期化子リストを使っている。(配列だっけ?)
　この考え方を応用して、可変数引数コンストラクタを持つ文字列型を引数にすると可変数引数っぽくなる。
　実装例はサンプルなので、エラー処理とかは演算子のオーバーロードとか端折りまくってます。
可変数引数コンストラクタを持っていれば良いだけなので、実装方法の自由度は高い。

特徴は
・安全(実装にva_listとか使うと危険にも出来る)
・1回VariadicStreamに相当する型を実装すれば、以降可変数引数の処理を実装する必要がない
・今回はiomanip想定だけど書式指定をboost::format風にしたりする事も可能なはず
・ちゃんと実装しようとすると結構面倒だし分かりにくい、下の実装だとstrで文字列をコピーしてたり云々
・仮想関数OK、デフォルト引数OK、書式付き文字列同士の比較もOK
・仮引数に{}が必要なのが冗長かも？
・書式付き文字列を指定した座標に指定した色で描画する関数等だと、どの部分が可変数引数かが分かりやすいのはメリットにもなる

```cpp
#include <iostream>
#include <string>
#include <sstream>
#include <iostream>

class VariadicStream
{
  private:
    std::ostringstream ost;

  public :

    template < typename ... TStream>
    VariadicStream( TStream... tst)
    {
        Change(tst...);
    }

    std::string str()
    {
        return ost.str();
    }

    template < class TLast>
    void Change(TLast tlast)
    {
        ost << tlast;
    }
    
    template < class TFirst, typename ... TRest>
    void Change(TFirst tf, TRest... trest)
    {
        ost << tf;
        Change( trest...);
    }
};

void Log(VariadicStream vst)
{
    std::cout << vst.str();
}

int main()
{
    Log( {"1+1" , "=" , 2} );
}
```

　余談ですが、boost::anyの配列の配列を引数にすると、可変数引数が可変数個あるみたいな事も出来るとかなんとか。誰かが変な用途に使ってそう。
　個人的にはboost::formatと最後の方法をよく使う。
[Ruby] コマンド一発でgemを開いてソースを読む



## 事前準備

gemを開く時のエディタを設定しておきます。

```
$ export BUNDLER_EDITOR=vim
```

`vim`の箇所はお好みのツールで。
※ RubyMine派の方は「おまけ」をご覧下さい。

## 使う

```
$ bundle open gem_name
```

これだけ。
gemのソースは勉強になるのでどんどん読みましょう！


## おまけ（RubyMineユーザの方）

デフォルトでは「RubyMineで開く」コマンドのパスが通ってないので、別途RubyMine側で設定してやる必要があります。

ターミナルからRubyMineを呼んで任意ファイルを開く
http://qiita.com/kidachi_/items/bf2316038fbbd7d1ed2a

設定できたら、`export BUNDLER_EDITOR=mine`でok。
ターミナルからRubyMineを呼んで任意ファイルを開く


ターミナルから

```
$ rubymine path_to_file
```

とかしたいけど、デフォルトでは存在しない。

## 設定（RubyMine）

### Tools > Create Command-line Launcher

![スクリーンショット_2014_06_22_21_32.png](https://qiita-image-store.s3.amazonaws.com/0/8790/4887813c-44c0-1bb6-bec7-7a55b8ff8b8a.png "スクリーンショット_2014_06_22_21_32.png")


### 好みのコマンドを設定


![スクリーンショット_2014_06_22_21_32.png](https://qiita-image-store.s3.amazonaws.com/0/8790/9ea09afc-7b90-db15-8a95-dcc79bc58426.png "スクリーンショット_2014_06_22_21_32.png")

## 使う

これで

```
$ mine path_to_file
```

で好みのファイルが開けるようになる。

`git status`で表示させたパスを`mine`で開く、はよく使います。
[Rails] Grapeのroutesを参照する


RailsでAPIを開発する時大活躍の[grape](https://github.com/intridea/grape)

しかし、grapeで作成したrouteは`rake routes`には反映されないのでちょっと困る。

そんな時は、

```ruby
AppName::API.routes
```

でアクセス可能です。


例えば、ルーティングが以下のような構造の時は、

```api/sample_app/api.rb
    resource :conversions do
      post :create do
        # create conversion
      end
      post :update do
        # update conversion
      end
    end
```

`AppName::API.routes`で以下を取得できます。

```ruby
[2] pry(main)> SampleApp::API.routes
=> [#<Grape::Route:0x007fd0ca428e50
  @options=
   {:prefix=>nil,
    :version=>"v1",
    :namespace=>"/conversions",
    :method=>"POST",
    :path=>"/conversions/create(.:format)",
    :params=>{},
    :compiled=>/\A\/conversions\/create(?:\.(?<format>[^\/.?]+))?\Z/}>,
 #<Grape::Route:0x007fd0cb11aaa0
  @options=
   {:prefix=>nil,
    :version=>"v1",
    :namespace=>"/conversions",
    :method=>"POST",
    :path=>"/conversions/update(.:format)",
    :params=>{},
    :compiled=>/\A\/conversions\/update(?:\.(?<format>[^\/.?]+))?\Z/}>]
```


pathだけ抜き出したい時は

```
[3] pry(main)> SampleApp::API.routes.each { |route| p route.instance_variable_get(:@options)[:path] }
"/conversions/create(.:format)"
"/conversions/update(.:format)"
```

こんな感じ。

## cf

grape自体については、公式以外では以下が参考になりました！

RailsとGrapeで行う最高のWeb API開発
http://qiita.com/anoworl/items/756f01cc3d188ebad139

Grape - RailsでスピーディにAPIを作成！
http://morizyun.github.io/blog/rails-grepe-api-heroku-ruby/
The Swift Programming Language ゆるふわ和訳　その3 ~A Swift Tour~


原文: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l

#Swiftツアー 
[その2](http://qiita.com/kiita312/items/2f4284eefef8f5a6c94b)からの続きです

## プロトコル・拡張
### プロトコル(インターフェース)
- プロトコルの宣言にはprotocolを使用します

```
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}
```

- クラス、列挙体、構造体はプロトコルを継承することができます

```
class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
        simpleDescription += "  Now 100% adjusted."
    }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
 
struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
```

- SimpleStructureにあるmutatingは、メンバの値を変更するメソッドであることを意味しています
- ただし、クラスのメソッドはプロパティを変更することは一般的なことなので、mutatingをつける必要はありません

###拡張
- extensionを使い、既にある型に新しいメソッドやプロパティを追加することができます
- 既に定義されている型に対してプロトコルを付与することができ、インポートしたライブラリやフレームワークで宣言されている型に対しても使用できます

```
extension Int: ExampleProtocol {
    var simpleDescription: String {
    return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
}
7.simpleDescription
```

- プロトコル名は他の型名と同じ様に使うことができます。例えば、一つの同じプロトコルを継承しているそれぞれ違う型のオブジェクトの配列を作りたいときは、プロトコル名で配列をつくります
- プロトコル型の値は、プロトコル定義外で実装されているメソッドにはアクセスできません

```
let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription
// protocolValue.anotherProperty  // Uncomment to see the error
```
- 上記の定数protocolValueにはSimpleClass型の値が代入されていますが、ExampleProtocol型で定義しているので、ExampleProtocol型として扱われます。プロトコルに後で追加された変数に誤ってアクセスしようとしてもエラーを返します。

## ジェネリック

- 名前を<>の中に書くことでジェネリックの型や関数をつくることができます

```
func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
    var result = ItemType[]()
    for i in 0..times {
        result += item
    }
    return result
}
repeat("knock", 4)
```
- ジェネリックのクラス、列挙体や構造体、関数やメソッドもつくることができます

```
// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
    case None
    case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)
```
- whereを型の後ろに使うことで、必要な条件を指定することができます。例えば、プロトロルを継承していること、２つの型は同じであること、特定のスーパークラスをもったクラスであること等です。

```
func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
    return false
}
anyCommonElements([1, 2, 3], [3])
```
- whereを省略して、プロトコルやクラス名をコロンの後に書くことも出来ます。\<T: Equatable>は\<T where T: Equatable>と同じ意味です
php、拡張子なしのファイル名取得

php、拡張子なしのファイル名取得
==========


■about
----------

php、拡張子なしのファイル名取得




■code
----------

```php:php
echo basename(__FILE__,'.php');
```




■reference
----------

phpで拡張子なしのファイル名取得 - kikukawa's diary
http://kkkw.hatenablog.jp/entry/2013/08/17/232412
php、array_unshift()、一つ以上の要素を配列の最初に加える

php、array_unshift()、一つ以上の要素を配列の最初に加える
==========


■about
----------

一つ以上の要素を配列の最初に加える




■code
----------

```php:php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
```




■reference
----------

PHP: array_unshift - Manual
http://www.php.net//manual/ja/function.array-unshift.php