OmniAICreator/Qiita-1.07M huggingface dataset:
scikit-learnで機械学習を試す SVM


こんにちは。初心者です。
あるサービス（念写できる人と何か念写してほしい人のマッチングサービスです）で機械学習ためそうと思っていて、調べている最中です。

## 問題
試しに、これの1問目を解くよー。

http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002315


教師あり学習の問題です。上記ページの回答例のように、SVMを使ってみます。
ライブラリは、scikit-learnを使ってみた。

http://scikit-learn.org/stable/index.html

SVM使いたいだけならほかにもライブラリあるみたいだけど、scikit-learnいいよ~的なことを言う人が多いので使ってみました。

## とりあえずやってみる

``` svmtest.py
# -*- coding: utf-8 -*-
from sklearn.svm import LinearSVC
import numpy as np

# 学習データ
data_training_tmp = np.loadtxt('CodeIQ_auth.txt', delimiter=' ')
data_training = [[x[0], x[1]] for x in data_training_tmp]
label_training = [int(x[2]) for x in data_training_tmp]

# 試験データ
data_test = np.loadtxt('CodeIQ_mycoins.txt', delimiter=' ')

# 学習
estimator = LinearSVC(C=1.0)
estimator.fit(data_training, label_training)

# 予測するよー
label_prediction = estimator.predict(data_test)

print(label_prediction)
```

``` 結果
[1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1]
```

例題のページにはRでの解答が載っているけど、scikit-learnでもほぼ同じ感じでいけました。

ほかの分類器も同じ感じで使えるっぽい。とてもいいね！

超絶参考になったサイト
http://sucrose.hatenablog.com/entry/2013/05/25/133021

## ところであってんの？

ほんとは、未知データでの予測出す前に、分類器の精度を確認しないとあってるかどうか分からない。確認する必要がある。
っていうかパラメタもチューニングしないといけない。

ちょっとやってみたけど、これ学習用のデータが検証するには少なすぎるのかそれとも簡単すぎるのか、パラメタ変えても大体100%当たってしまってチューニングしてる感が全くありませんでした。

また別のデータでやります。

今日はおしまい
oplog tailingを使ったリアクティブウェブ

リアクティブウェブはウェブアプリケーション開発者の桃源郷だ、と考えるのは僕だけではないと思う．参考: [Trigger と Stream ベースの Reactive スタイルについて考える](http://jxck.hatenablog.com/entry/20120509/1336566474)

[Meteor 0.7.1: oplog support for complex queries, Meteor developer accounts](https://www.meteor.com/blog/2014/02/24/meteor-071-oplog-support-for-complex-queries-meteor-developer-accounts)

> リリースされた0.7.1で、実践環境のMongoDBでよく使われるクエリのほとんどを`oplog driver`が対応した．

> The 0.7.1 release extends the set of MongoDB queries supported by the oplog driver to cover most of the common queries needed in production apps.

以前のMeteorでは、複雑なクエリに関してはポーリングすることでサーバーサイドの変更をクライアントサイドに通知していた．今回の変更で、登録されたクエリに関連する変更差分のみがサーバーサイドからプッシュすることが出来るようになった．ポーリングはリアルタイム性の観点でプッシュに劣り、さらに無駄な負荷を生む事になるためスケーリングの障害になりうるため、これは非常に大きい前進だ．Meteorではこの機構を、

1. [MongoDBのoplog](http://www.slideshare.net/doryokujin/mongodb-oplog) を[tailing](http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/)(監視)
2. 変更差分を独自のセレクタ([minimongo](https://github.com/meteor/meteor/tree/devel/packages/minimongo)の一部）を使ってオンメモリでクエリ
3. 該当変更差分のみをプッシュ

というやり方で実装している．（ソースを流し読みしただけなので間違っている部分があるかもしれません．その場合はご指摘お願い致します:)）

また、同じくリアクティブウェブを指向したデータ同期を目指すプロジェクトに[cloudup/mydb](https://github.com/cloudup/mydb)がある．

参考:  [Introducing MyDB](https://cloudup.com/blog/introducing-mydb)  [MyDB の紹介](http://null.ly/post/70497518795/mydb)

MyDBでは、まだ複雑なクエリに対して変更差分を送るのではなくネームスペース単位でoplogをクライアントサイドに通知している．(ただしオンメモリでのクエリライブラリ[cloudup/mongo-query](https://github.com/cloudup/mongo-query)がすでにあるので、これを今後組み込むことはあり得る．)


**補足**

プロジェクトを長期的に考えると一つ一つの機能はなるべく薄くあって欲しい．その点フルスタックのmeteor.jsよりもcloudupのやり方がデベロッパーフレンドリーだと思う．好みのテンプレートバインディングに加えて、監視([cloudup/oplog](https://github.com/cloudup/oplog))と軽量のクエリシステム([cloudup/mongo-query](https://github.com/cloudup/mongo-query)、[logicalparadox/filtr](https://github.com/logicalparadox/filtr)、[nedb](https://github.com/louischatriot/nedb))などを組み合わせて自前のリアクティブウェブを実現出来る．

とはいえ上記のようなやり方(oplog tailing+query)はまだまだ洗練されていない．より原始的に、プロキシのようなものを介して変更を検知し、ネームスペース(または権限)ごとに変更が起きたことをクライアントサイドに伝えて再クエリする、というのが現状の現実路線だろう．
socatでunixドメインソケットにつなぐ


tcpソケットではなく、unixドメインソケットをlisten起動しているサーバ(unicornとか)に対して直接ターミナルからつなぎたいときがある。

tcpソケットならtelnetをつかえばよいが、unixドメインソケットにはつなげない。


socatを使えば簡単にunixドメインソケットにもつなげられる

http://www.dest-unreach.org/socat/


以下のように`stdin`とソケットへのパスを引数にわたせばよい


``` bash
$ sudo apt-get install socat
$ echo -en 'GET / HTTP/1.0\r\n\r\n' | socat stdio /tmp/.sock
```


### 参考

* http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLES
* http://momijiame.tumblr.com/post/48934531325/socat
JRubyスクリプトを配布可能な形にパッケージする


JRubyスクリプトを実行可能な形にして配布したい場合には、[Rawr](http://rawr.rubyforge.org/)を使用する。RawrはJRuby用のパッケージングのツールで、Rawrを使うことでWindowsやMac用の実行ファイルを簡単に作成することができる。

## Rawrのインストール

Rawrは以下のようにしてインストールできる。

```
% gem install rawr --source http://gems.neurogami.com
```

## プロジェクトのセットアップ

Rawrによるパッケージングを可能にするには、パッケージングを行いたいプロジェクトで以下のコマンドを実行する。

```
% rawr install
```

このコマンドを実行することで、必要なファイルのダウンロードやディレクトリレイアウトの作成などが行われる。内容は以下のような感じ:

```
% tree
.
├── Rakefile
├── build_configuration.rb
├── lib
│   └── java
│       └── jruby-complete.jar
└── src
    └── org
        └── monkeybars
            └── rawr
                ├── Main.java
                └── Path.java
```

## プロジェクトのパッケージング

上記で生成された`Rakefile`にてパッケージング用のタスクが定義されるので、それらのrakeタスクを使ってプロジェクトのパッケージングを行う。

```
% rake -T
rake rawr:base_jar
rake rawr:build_extra_jars
rake rawr:bundle:app
rake rawr:bundle:exe
rake rawr:clean
rake rawr:compile
rake rawr:compile_duby_classes
rake rawr:compile_java_classes
rake rawr:compile_mirah_classes
rake rawr:compile_ruby_classes
rake rawr:get:current-jruby
rake rawr:get:current-stable-jruby
rake rawr:jar
```

exe形式にパッケージングしたい場合は、上記のrakeタスクのうち`rawr:bundle:exe`を実行することで`./package/windows`配下にパッケージされたアプリケーション一式が出力される。

```
% rake rawr:bundle:exe
```

パッケージング時の振る舞いについては`build_configuration.rb`で設定できる。例えば以下のような感じ:

* `executable_type`: アプリケーションがCUIかGUIか
* `source_dirs`: ソースディレクトリ
* `files_to_copy`: パッケージに含めたいファイルの指定
* `jvm_arguments`: JVMに渡すオプション

## Rubyスクリプトのパッケージングの選択肢としても

JRubyではなく、Rubyで書いていたものをパッケージして社内に配布したいというケースの選択肢としても活用可能（実際にそのケースで採用したのであった）。

## 参考

* プロジェクト: http://rawr.rubyforge.org/
* GitHub: https://github.com/rawr/rawr
CentOS 6.xでMySQL環境(CentOS -> Community)の入れ替え手順のメモ


- もともと CentOS 標準の mysql-5.1が入っていた。
- でも Community Server を使いたい (http://dev.mysql.com/downloads/mysql/5.5.html#downloads)


# MySQL Community Release のYum Repositoryを使う(thanks to @ngyuki)

既存のMySQLをアンインストールしなくても大丈夫。
```
$ sudo yum localinstall http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ sudo yum install mysql-community-client mysql-community-devel mysql-community-server
```

# Chef recipeバージョン

```ruby:default.rb
default['mysql']['file_name']  = "mysql-community-release-el6-5.noarch.rpm"
default['mysql']['remote_uri'] = "http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm"

default['mysql']['packages'] = %w[
  mysql-community-client
  mysql-community-devel
  mysql-community-server
]
```

```ruby:mysql.rb
remote_file "/tmp/#{node['mysql']['file_name']}" do
  source "#{node['mysql']['remote_uri']}"
end

package "mysql-community-release" do
  action :install
  provider Chef::Provider::Package::Rpm
  source "/tmp/#{node['mysql']['file_name']}"
end

node['mysql']['packages'].each do |package|
  package package do
    action :install
  end
end

service "mysqld" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable, :start ]
end
```

# 以前使っていた手順

<pre>
# 標準のMySQL関連のRPMを削除
sudo rpm -e mysql-server mysql mysql-devel 
# mysql-libs と libmysqlclient に依存しているRPMを全部削除
sudo rpm -e mysql-libs perl-DBD-MySQL postfix php-mysql cronie cronie-anacron crontabs
# Community server のRPMをインストール
sudo rpm -ivh MySQL-*.rpm
# mysql-libs以外のRPMは念のため元に戻しておく(厳密には別バージョンになってしまうがこの場合はあまり気にしなかった)
sudo yum install perl-DBD-MySQL postfix php-mysql cronie cronie-anacron crontabs
</pre>
Ansible-installerってのを作ってみた


[ryurock/ansible-installer](https://github.com/ryurock/ansible-installer)


[Ansible](http://www.ansible.com/home)の関係でpythonを入れる時に[yyuu/pyenv-installer](https://github.com/yyuu/pyenv-installer)ってのを見つけて、にゃるほどと思いansibleを入れる時も同じ要領で作っておけば楽チンだと思いまして作ってみました。

作ったばっかなので自己責任でお願いします。(キリッ!!)

## 環境 

* osx
* Linux


## 注意事項

* Pythonのインストールで[pyenv-installer](https://github.com/yyuu/pyenv-installer)を使用しています。pyenvを既にお使いの方はpython2.6.9がインストールされますのでご注意ください。globalも2.6.9になります。

## 参考にしたサイト

* [yyuu/pyenv-installer](https://github.com/yyuu/pyenv-installer)

## 使い方

README.mdどおりでいけます。

```bash
curl https://raw.github.com/ryurock/ansible-installer/master/bin/setup | bash
# OSX
source ~/.bashrc
# Linux
source /etc/profile
```

## 動作確認

```bash
ansible --version
ansible 1.4.5
```

Ansibleとか使ってみたい〜とか思いましたら使ってみてください
2/26日のJavaScript学習内容

P136-P143 オブジェクト(RegExp/Error/Function/Object/JSON)
P146-P166 5.1関数とは？～5.4関数の引数

本日の学習内容は、JavaScriptにおける関数の定義の仕方と、実際に関数を用いてプログラムを作成することです。
関数の定義を一度行えば、
同じプログラムを用いる複数の変数に対していちいちプログラムを与えずに、
関数によってそれらのプログラムを書くのは１度でいいので大変便利です。

関数の定義の仕方は主に３種類あって、
①function文を使う
②関数リテラルを使う
③Functionオブジェクトを使う
とありますが、①が最も見やすく定義しやすいと感じました。

次回はプログラミングテクニックの一つである5.5クロージャからやっていきたいと思います。
任意の曜日に登録されたレコードを取りたい


あるテーブルから任意の曜日の`created_at`を持つレコードを取りたい場合には、

```
where(["DATE_FORMAT(created_at, '%w')=?", X])
```

のようにして、Xに取りたい曜日のインデックス(0=日曜..6=土曜)を指定すると良い。


参考:

- http://dev.mysql.com/doc/refman/5.1-olh/ja/date-and-time-functions.html#function_date-format
（何も書いてない）自分用メモTwistOAuthを使う

[TwistOAuth](https://github.com/Certainist/TwistOAuth)の自分用メモ
[TwistOAuthれどめ勝手に日本語化 - Qiita](http://qiita.com/bonyochan/private/8ae288f61a6f5b8a2637)こんなのも作っています
#現状
1. これajaxと夢のコラボしたらUserStreamできるんじゃね？って思ってjavascriptとjQuery勉強してる　このへんを見ている（http://www.hp-stylelink.com/news/2013/12/20131206.php）
2. 自分用メモなのに他人（Twist中の人）が書いている 詳しくは編集履歴を見てください

#とりあえずツイートする
<del>Sampleにあったのでコメントをつけただけ</del>まっぴーさんが<del>勝手に</del>書き換えてる

```php
<?php

// TwistOAuth.php, CK, CSを読み込む 
require '../settings_for_tests_and_examples.php';
// $_SESSION を使えるようにする
@session_start();

try {
    
    // リクエストトークンを取りに行く処理
    if (!isset($_SESSION['to'])) {
        // TwistOAuthオブジェクトを新規生成
        $to = new TwistOAuth(new TwistCredential(CK, CS, '', ''));
        // リクエストトークンを取得させる
        $to->postAuto('oauth/request_token');
        // セッションにTwistOAuthオブジェクトを保存(バージョン1.0から可能に)
        $_SESSION['to'] = $to;
        // Twitterに遷移
        header('Location: ' . $_SESSION['to']->credential->getAuthorizeURL()); 
        exit;
    }
    
    // アクセストークンを取りに行く処理
    if (!isset($_SESSION['authed'])) {
        try {
            if (isset($_GET['oauth_verifier'])) {
                // TwitterのコールバックURLに付加されているoauth_verifierをセットする
                $_SESSION['to']->credential->setVerifier($_GET['oauth_verifier']);
            }
            // アクセストークンを取得させる
            $_SESSION['to']->postAuto('oauth/access_token');
            // ログイン済みであるとしてセッションに記録する
            $_SESSION['authed'] = true;
            // メッセージをセット
            $messages[] = "Hello, @{$_SESSION['to']->credential->screenName}!!";
        } catch (TwistException $e) {
            // 例外が発生したらいったんTwistOAuthオブジェクトを破棄する
            unset($_SESSION['to']);
            throw $e;
        }
    }
    
    // ツイート処理
    if (isset($_POST['tweet'])) {
        // ツイートする
        $response = $_SESSION['to']->postAuto('statuses/update', array('status' => $_POST['tweet']));
        // 結果メッセージをセット
        $messages[] = "Tweeted: {$response->text}";
    }

} catch (TwistException $e) {
    
    // エラーメッセージをセット
    $messages[] = $e->getMessage();
    
}

// UTF-8のHTML文書であることをブラウザに知らせる
header('Content-Type: text/html; charset=utf-8');

?>
<!DOCTYPE html>
<html>
<head>
  <title>TEST</title>
</head>
<body>
<?php if (!empty($messages)): ?>
  <ul>
<?php foreach ($messages as $msg): ?>
    <li><?php echo $msg; ?></li>
<?php endforeach; ?>
  </ul>
<?php endif; ?>
<?php if (isset($_SESSION['authed'])): ?>
  <p>
    <form method="post" action="">
      <input type="text" name="tweet" value="">
      <input type="submit" value="TWEET">
    </form>
  </p>
<?php endif; ?>
</body>
</html>
```

#次はTLを表示したい

```php
function printTL($TwistOAuth){
  foreach($TwistOAuth->getAuto('statuses/home_timeline') as $status)
    var_dump($status);
}
```
GitHub と Qiita でサブアカウントを切り替える

## 要件
個人用と会社用で GitHub と Qiita を使い分けたい。

### 説明
少々面倒だが以下の方法で可能。

GitHub でサブアカウント、ユーザー切り替え
http://d.hatena.ne.jp/calpo/20120601/p1

Qiita は OAuth なのでこんな感じで。
仕事用へ切り替え: 個人用アカウントからログアウト → 仕事用の GitHub にログイン → GitHub 認証
個人用へ切り替え: Qiita と GitHub からログアウト → 個人用の GitHub/Twitter にログイン → 認証

### 考察
個人と会社のアクティビティログが混ざると色々と支障をきたすので面倒でも分けたほうがオススメ。
「起動中のアプリ」に開発中のアプリが表示されないときの対処法

LAUNCHERカテゴリを設定したactivityのlabel属性を空にすると、端末によっては「起動中のアプリ」に開発中のアプリが現れない模様。

# 対処方法
android:labelに何かしらの文字を設定してあげるとよい。
（空にすることは稀だと思いますが・・・）
Appium をインストールするときにハマったこと

##はじめに
UIの自動テストを導入するためにサーバに appium を入れるときにネットで手順を調べてためしていたのですが、一部ハマったところがあったので忘備録を兼ねて記事にしました

##Appium をインストールするときにハマったこと
結論から言うと、npm が node.js を入れたタイミングで同時にインストールされるようになっていて、今までの npm をインストールする curl コマンドが失敗してハマってましたｗ

今の手順

```bash
$ brew install node
==> Downloading http://nodejs.org/dist/v0.10.25/node-v0.10.25.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/node/0.10.25
==> make install
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
?  /usr/local/Cellar/node/0.10.25: 1125 files, 16M, built in 4.6 minutes


$ n[Tab]
nano                     netbiosd                 nm
nasm                     netstat                  nmedit
natd                     nettop                   node
native2ascii             networksetup             nohup
natutil                  newaliases               nologin
nbdst                    newfs_exfat              notifyd
nc                       newfs_hfs                notifyutil
ncal                     newfs_msdos              npm
ncdestroy                newfs_udf                nroff
....

★★以前はココで $ curl https://npmjs.org/install.sh | sh を実行していた★★

$ sudo npm install -g appium
Password:
npm http GET https://registry.npmjs.org/appium
npm http 200 https://registry.npmjs.org/appium
npm http GET https://registry.npmjs.org/appium/-/
....
minimatch@0.2.14, rimraf@2.0.3, lodash@0.9.2, glob@3.1.21, coffee-script@1.3.3, underscore.string@2.2.1, iconv-lite@0.2.11, findup-sync@0.1.2, js-yaml@2.0.5)
├── plist@0.4.3 (xmlbuilder@0.4.3, xmldom@0.1.19)
├── express@3.4.8 (methods@0.1.0, merge-descriptors@0.0.1, cookie-signature@1.0.1, range-parser@0.0.4, fresh@0.2.0, debug@0.7.4, buffer-crc32@0.2.1, cookie@0.1.0, send@0.1.4, commander@1.3.2, connect@2.12.0)
└── socket.io@0.9.16 (base64id@0.1.0, policyfile@0.0.4, redis@0.7.3, socket.io-client@0.9.16)

$ npm install wd
npm http GET https://registry.npmjs.org/wd
npm http 200 https://registry.npmjs.org/wd
...
aws-sign2@0.5.0, tunnel-agent@0.3.0, oauth-sign@0.3.0, node-uuid@1.4.1, mime@1.2.11, http-signature@0.10.0, tough-cookie@0.12.1, form-data@0.1.2, hawk@1.0.0)

└── archiver@0.5.2 (lazystream@0.1.0, readable-stream@1.0.26, zip-stream@0.1.4, file-utils@0.1.5)

$ appium
info: Welcome to Appium v0.15.0 (REV a7b47d73a27074cc928cc5b325e...)
info: Appium REST http interface listener started on 0.0.0.0:4723
   info  - socket.io started
info: Spawning instruments force-quitting watcher process
info: [FQInstruments STDERR] Force quit unresponsive instruments v0.0.1
```

２週間前にローカル環境に appium をインストールしたときにメモしておいた手順どおりにやったら curl の部分で動作しなくて３０分近く調べてしまいました・・・orz

##おわりに
node.js を入れることで npm まで入るようになってたのは便利ですが、できれば curl したときにそれがわかるようなメッセージを出してほしいっすね・・・
virtualenv利用がはかどるzsh設定


virtualenvディレクトリを全部.venvに共通化してる想定です。

```zsh:.zshrc
alias ve='source ./.venv/bin/activate'
vec() {
    PWD_FOR_VE_CREATE=`pwd`
    virtualenv ./.venv --prompt='('`basename $PWD_FOR_VE_CREATE`')'
}
```
vecと打つと、prompt名が現在いるディレクトリの名前に設定された上で、virtualenvディレクトリ(.venv)が作られます。

veと打つと、source ./.venv/bin/activate が実行され、virtualenvが有効ninarimasu.
ChatWork を更に便利にする (ただし、Mac に限る)


ChatWork さん、便利ですね！

元々弊社では Skype を使っていたんですが、ファイルのやりとりとアカウント管理の側面から不便さを感じて ChatWork に浮気したクチです。

非常に便利なサービスではあるんですが、ちょっと困ったこともあったりしたので、エンジニアとしては「困っていることがあるなら、自分で解決しちゃえば良いじゃ無い。」ってコトで、色々調べて試してみたことを書き殴る。

# 背景

ChatWork さんは、Web ベースのサービスなので、クライアントアプリが存在しませぬ。

故に、以下のような困ったことが。

* Command + Tab で切り替え出来ない
* 標準で、ブラウザのデスクトップ通知機能を用いた通知は表示出来るが、ブラウザにバッヂ付けるとかは無理
* Dock アイコン跳ねさせるとかも無理

# 準備

## Single Application 化

[Fluid](http://fluidapp.com/) という、 **任意のウェブページを Single Application 化する** アプリを用いる。

Single Application 化するだけなら無料版で OK。
バッヂ付けるとか Dock アイコンを跳ねさせるとかをしたい場合は、$4.99 払いましょう。

無事にインストールが出来たら、普通に起動しましょう。

![ScreenShot_01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140226-01/Fluid/01.png)

設定項目埋めて **Create** ボタン押下で、Single Application 化完了！
簡単ですねっ！

**Use Website Favicon** を選択すると、当該ページの favicon を使ってくれるんだけど、解像度が若干残念なケースが多いので、自前で作るコトをオヌヌメする。

なお、無料版だと Cookie は Safari と共有されるっぽい。
有料版を購入すると、Cookie を独自のストレージに保持してくれるので、ログイン ID/Password とかを記憶させる派の人は $4.99 払いましょう。

## 通知周り改良

ある意味本題。

Single Application 化したところまでは良いが、離席中に呼び掛けられた場合とかに通知が残らない (まぁ、アプリ版使っていればある程度回避できるけどね。) ので、「戻ってきたときに気付けない。」みたいなコトが発生しうる。

それを解消するために、以下のアプローチを試みる。

1. Command + Tab 時などに気付けるように未読件数をバッヂに出す
1. 何らかのメッセージを受信した瞬間に気付けるように Dock アイコンを跳ねさせる

そのための方法は **UserScript を用いる** のが手っ取り早い。

先ずはコードをぺたり。

```js:ChatWorkNotification.js
window.fluid.dockBadge = '';
setTimeout(updateDockBadge, 1000);
setInterval(updateDockBadge, 5000);

function updateDockBadge() {
  var badge = '';
  var unread = document.getElementById('_chatUnreadStatus');
  if (unread.style.display != 'none' && unread.innerHTML) {
    badge = unread.innerHTML + '';
    if (window.fluid.dockBadge != badge) {
      window.fluid.requestUserAttention(true);
    }
  }
  window.fluid.dockBadge = badge;
}
```

Gist は [コチラ](https://gist.github.com/monry/7483161) 。

簡単な解説としては、DOM 解析して条件に該当する場合に Fluid に実装されている API をキックして実現している。
※Fluid の API リファレンスは [コチラ](http://fluidapp.com/developer/) 。

もーちょっと詳しく書くと以下のような感じ。

* Line: 7 で DOM 解析して未読チャット数を拾ってる。
	* getElementById の引数を _chatToUnreadStatus にすると、TO の未読件数になる。
	* getElementById の引数を _chatTaskStatus にすると、未完了タスク数になる。
	* 「チャットリストに於ける全チャットの未読件数を取得して総和を求める」とかも出来るとは思う。
* Line: 11 で Dock アイコン跳ねさせるメソッドをキック
	* 何故かマニュアルに載ってない…。
	* 第一引数を false にすると、永遠に跳ねさせる。
* Line: 14 はバッヂの表示内容を変更
	* 空文字を食わせると非表示になる。

なお、UserScript を設定する方法は以下の通り。

1. [ メニュー ] &gt; [ Window ] &gt; [ Userscripts ]<br />まぁ、ショートカットでも良いけどね。<br />![ScreenShot_02](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140226-01/Fluid/02.png)
1. [ + ] を押下し、ChatWork なドメイン用の Script を設定<br />Patterns のトコは __\*chatwork.com\*__ で良いんじゃないかと。 ![ScreenShot_0#](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140226-01/Fluid/03.png)

# 備考

Fluid は一回設定しちゃうとアイコンとか変更出来ないっぽいので、変更したいときは、作成済みの Single Application を削除してから、再設定するのが正解かな？

あと、Fluid にお金支払うときは PayPal アカウント必須なので、アカウント凍結されてるオレとしては、非常に涙目だった。
隣の席のエンジニアに頼んで立て替えてもらいましたよ、ええ。
JavaScript文字列のバイト数を数える - Blob版

[JavaScript文字列のバイト数を数える - encodeURIComponent版](http://qiita.com/xtetsuji/items/a8490a7fea3f5a01e49c) にインスパイアされました。

HTML5 で追加された [Blob オブジェクト](https://developer.mozilla.org/ja/docs/DOM/Blob) を使うことで、マルチバイト文字も正確に高速にバイト数を求めることが出来ます。

### prototype 汚染を気にしない人向け
```js:str_size.js
String.prototype.size = function () {
  return (new Blob([this], {type: "text/plain"})).size;
};
```

### 生理的に prototype 拡張が無理な人向け
```js:getStrSize.js
function getStrSize(str) {
  return (new Blob([str], {type: "text/plain"})).size;
}
```

### 結果
```js:example.js
console.log( "あああa".size() ); // -> 10
console.log( "èî".size() ); // -> 4
console.log( "?野家".size() ); // -> 10
```

短文では、 Blob インスタンスの生成コストの分 encodeURIComponent版 よりも遅くなりますが、長文では威力を発揮します。

File API をサポートしていない IE9 以前では動かないので、 IE9 が切り捨てられる環境で使いましょう。
[Blob の使えるブラウザ](http://caniuse.com/#search=blob)
[Objective-C] UIAlertViewを同期処理する


JavaScriptなどではアラートは同期処理になりますが、Objective-Cでは非同期処理になります。（デリゲートで処理するため）

ただ、場合によっては同期的に処理をしたい場合があるので、どうするかのメモです。

*※ちなみに、`viewDidLoad`内でやっちゃうとちゃんとviewの描画処理が終わらなくなるのでうまく動きません。慣れてる人はそんなミスしないんだと思いますが、さっと処理を書いたらうまく動かなくてハマりました。*

##`NSRunLoop`を使って同期処理にする

```objc
@property (assign, nonatomic) BOOL finished;
```

```objc
- (void)anyMethod
{
	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"TItle"
message:@"message"
delegate:self
cancelButtonTitle:@"cancel"
otherButtonTitles:@"other", nil];

	[alert show];

	self.finished = NO;

	while(!self.finished) {
		[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
	}

	NSLog(@"OK!");
}
```

```objc
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(UIInteger)buttonIndex
{
	self.finished = YES;
}
```
実行可能ファイルについて、特定の接続先に接続しているものを抽出する

```shell-session
find < path > -name < file_name_pattern > -exec test -x {} \; -exec echo {} \; | xargs grep < 接続先 >
```

findで名前が一致するファイルを探して、testでpermissionをチェック、OKならechoでファイル名を出力します。
出力した結果がxargsでgrepされます。
最初はechoは不要かと思いましたがそれだとうまくいかなかったので、明示的にechoしています。

接続先を一気に変えたいときに急場で作ったので、正直美しくないです。
きっともっとスマートなやり方があるはず…
kobitoでアカウント再設定の方法



基本的にはこれ

>現在はアカウント切り替え機能がないため，連携させるアカウントを変更するにはKobitoアプリを終了させた後
**~/Library/Preferences/com.qiita.Kobito.plist**
というファイルを削除し，再度立ち上げてログインを行ってください．


ただ一度ログインしてしまうとキーチェーンアクセスに認証情報が保存され、このファイルを削除してもその設定を見に行くためそちらも削除する


**アプリケーション** → **ユーティリティ** → **キーチェーンアクセス**
`qiita` で検索
Vim起動時にE576が出る問題の直し方

何らかの原因で、Vim起動時にこんなエラーが出たことはないでしょうか。

```bash
$ vim
E576: viminfo: Missing '>' in line: 9
E576: viminfo: Missing '>' in line: ^I+^I7^I2
E576: viminfo: Missing '>' in line: ^I+^I9^I34
E576: viminfo: Missing '>' in line: ^I+^I12^I39
E576: viminfo: Missing '>' in line: ^I+^I9^I8
Press ENTER or type command to continue
```

どうやらこれは~/.viminfoが何らかの原因で破損してしまったときに発生します。これを直すには.viminfoを削除すればOKです（＾ω＾）
#mapのチェーンを逆にする

関数をメソッドチェーンするとなんかみっともない時があるので、逆にしたくなる。

具体的には

```rb
[1] pry(main)> [1,2,3].map {|x| x * 2 }
=> [2, 4, 6]
```

はHaskellだと

```hs
λ map (*2) [1,2,3]
[2,4,6]
```

こう書ける。こんな感じにしたい。ちょっとやってみたらできた。

```rb
class Pipe
  attr_accessor :receiver

  def initialize(thunk)
    @thunk = thunk
  end

  def self.map &block
    self.new lambda { |h| h.receiver.map &block }
  end

  def receive receiver
    @receiver = receiver
    self.instance_eval &@thunk
  end
  alias_method :<<, :receive

end

one = Pipe.map {|x| x * 2} << [1,2,3]
p one # => [2,4,6]

two = Pipe.map(&:reverse).receive Pipe.map(&:upcase).receive ["foo", "bar", "baz"]
p two # => ["OOF", "RAB", "ZAB"]
```

しかしこれは`Pipe`なのか？
adbにgoogle glass explorerを認識させる(Windows, Linux)

【追記(2014/04/29)】Linuxでの認識方法を追記。

# 現象
Google glassはandroidデバイスですので、開発の手順として、Android SDKをインストールしたのちにglassをUSB接続し、adb (Android Debug Bridge)に認識させることになります。このとき、glassを接続したのちにusb_driverを指定してもドライバがインストールされず、「不明なUSBデバイス」のままとなってしまい、adbから認識できない場合があります。
このような現象が発生する要因として考えられるのは、Android SDKで配布されているusb_driverのinfファイルにgoogle glass explorerのプロダクト情報が入っていないことです。

# 解決策(Windows)
usb_driverが参照するinfファイルにglassのプロダクト情報を追記します。対象となるファイルは以下の通り。
* {Android SDKをインストールしたディレクトリ}\extras\google\usb_driver\android_winusb.inf

```ini:android_winusb.inf
[Google.NTx86]
...
; Google Glass Explorer (x86)
%SingleAdbInterface% =  USB_Install, USB\VID_18D1&PID_9001
%CompositeAdbInterface% =  USB_Install, USB\VID_18D1&PID_9001&MI_01

[Google.NTamd64]
...
; Google Glass Explorer (AMD64)
%SingleAdbInterface% =  USB_Install, USB\VID_18D1&PID_9001
%CompositeAdbInterface% =  USB_Install, USB\VID_18D1&PID_9001&MI_01
```

なお、上記のプロダクト情報(__VID_18D1&PID_9001__)は2013年に配布されたexplorerのものです。次の世代のgoogle glassではおそらく変更になりますので、デバイスマネージャーでプロダクト情報を参照[*1]し、infファイルに記載する必要があります。

# 解決策(Linux)
Linuxの場合は、Windowsと比較してより簡単にadbにexplorerを認識させることができます。Android Developersサイト[*2]にあるように、/etc/udev/rules.d/51-android.rulesに以下のようにUSB VendorIDにGoogle (18d1)を指定した行を追加します(はじめてAndroidの開発をする場合はファイルがないので新たにファイルを作成します)。

```/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR(idVendor)=="18d1", MODE="0666", GROUP="plugdev"
```

そして、USBを再認識させます。Ubuntu 13.10の場合は以下のコマンドです。

```shell-session
$ sudo chmod a+r /etc/udev/rules.d/51-android.rules 
$ sudo udevadm control --reload
```

# 参考
* [*1] [tappli blog: [Android] android_winusb.inf に追記する内容](http://blog.tappli.com/article/43427484.html)
* [*2] [Using Hardware Devices](http://developer.android.com/tools/device.html)
テキストファイルの特定文字列の行から特定文字列の行までを抽出したい

例えば、START という行から STOP という行までを抽出したいとき。

## awk を使う場合

シェルでこの手の作業をしようと思ったら、まず思いつくのが awk です。
実は簡単な記述法が用意されています。

```sh
cat file.txt | awk '/START/,/STOP/'
```

抽出した行をさらに加工したい場合は、awk で書くなら以下のような感じです。

```sh
cat file.txt | awk '/START/,/STOP/ { 何か加工処理 }'
```

しかし、sed と組み合わせるほうが自然な気がします。

```
cat file.txt | awk '/START/,/STOP/' | sed '何か加工処理'
```

## ruby を使う場合

上記のフィルタ処理を ruby で書くとこうなります。
こちらもわりと簡単な記述で書けます。

```sh
cat file.txt | ruby -ne 'print if /START/../STOP/'
```

抽出した行をさらに加工したい場合は、ruby スクリプトで書くなら以下のような感じです。

```ruby
File.open('file.txt').each do |line|
	next unless line =~ /START/ .. line =~ /STOP/
	何か加工処理
end
```
AEでsetIntervalみたいなの

Aftereffectsのjsxで、
setIntervalみたいなの（scheduleTaskというメソッド）
で定期的に命令たたいて
レンダ―キューにコンポを追加していくスクリプトを書きました。


```js:

//選択されてるコンポを取得
var srcCompos=[];
for (var i=1; i<=app.project.items.length; i++)
{
	if( app.project.item(i).selected ){
		srcCompos.push(app.project.item(i));
	}
}

//テンプレート名を選択させる。
var t_name=prompt("select templete", "FLV_3M");

var taskID = 0;
var i=0;

//毎回実行するメソッド
var myFunc = function (){
	
	var compo = srcCompos[i];
	var renderque = app.project.renderQueue.items.add(compo);		
	renderque.outputModule(1).applyTemplate(t_name);
	i++;
	if( i>=srcCompos.length ){
		app.cancelTask(taskID);//終了
	}
}

//定期的に実行
taskID = app.scheduleTask('myFunc()', 250, true);


```

#参考にしたページ
https://sites.google.com/site/annamillersclub/script-menu/gyakubikiscript
Xcodeでチーム開発するとき、ビルド Scheme を共有する方法

Xcodeのプロジェクトのビルド Scheme は、デフォルトではプロジェクトファイルに紐付いておらず、
バージョン管理ツールにコミットしても他のユーザに共有できない。

これを共有可能にするには、Xcode メニューバーから、
"Product/Scheme/Manage Scheme"を選択して、Manage Scheme 画面を開き、
次のスクリーンショットにあるように "Shared" チェックボックスにチェックを入れれば良い。

![XcodeManageScheme.png](https://qiita-image-store.s3.amazonaws.com/0/36624/0c7d8beb-4ac1-35dc-9048-238b021a9c9b.png)

こうすることにより、ワークスペースフォルダやプロジェクトフォルダの下位に、
"xcshareddata" というフォルダが作られ、その下にスキーマ情報が格納されるので、
これを適宜バージョン管理ツールに追加すれば良い。

```
$ svn add project.xcworkspace/xcshareddata
...
$ svn add HogeHoge.xcodeproj/xcshareddata
```
【jQuery】親要素を削除する

親要素を削除したいときに、どうすればいいのかわかったのでメモ。
下記のようなHTMLのときに、pをクリックしたらdivを消すとする。

```html
<div>
<p>ここをクリックする</p>
</div>
```

#remove()は×

```js
$('div p').click(function(){
    $(this).parent().remove(); //divとその中身が全て消えちゃう
});

```

#unwrap()を使う

```js
$('div p').click(function(){
    $(this).unwrap(); //divだけを消す
});

```

※jQuery1.4系以降対応

デモ：http://jsdo.it/Ituki/dr43
参考：http://h2ham.seesaa.net/article/143970370.html
play test 実行時に指定したconfファイルを読み込む


## 環境
* Mac OSX Version 10.8.5
* Play Framework 2.2.1

## 手順
### conf/以下にtest.confを作る。

```sh:shell
$ touch conf/test.conf
```

### test.confにてapplication.confを読み込み、上書きしたい設定を記述する。

```sh:shell
$ vi conf/test.conf
```
```vim
include "application.conf"

db.default.url="jdbc:mysql://database.localdomain/test_database" 
```

### build.sbtの```javaOptions```にテスト環境の時に読み込むconfファイルを指定する。 

```sh:shell
$ vi build.sbt
```
```vim
javaOptions in Test += "-Dconfig.file=conf/test.conf"
```

## 参考
コマンドラインで```$ play -Dconfig.file=test.conf test```としても読み込まれなかったので、以下サイトを参考にして読み込まれるようにした。

http://stackoverflow.com/questions/14724788/playframework-settings-depending-on-environment?answertab=votes#tab-top
iOSでキーボードのアニメーションを止める方法

iOSのアプリでキーボードの出現や消滅のアニメーションを止めると、動作がキビキビになります。その方法を共有します。

```objc:ObjectiveC
@interface ViewController : UIViewController
@end

@implementation ViewController
-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardDidShow:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardDidHide:)
                                                 name:UIKeyboardDidHideNotification
                                               object:nil];
}

-(void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillShowNotification
                                                  object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardDidShowNotification
                                                  object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillHideNotification
                                                  object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardDidHideNotification
                                                  object:nil];
}

static BOOL needRevert;

-(void) keyboardWillShow:(NSNotification*)notif
{
    needRevert = [UIView areAnimationsEnabled];
    [UIView setAnimationsEnabled:NO];
}
    
-(void) keyboardDidShow:(NSNotification*)notif
{
    if (needRevert) [UIView setAnimationsEnabled:YES];
}

- (void)keyboardWillHide:(NSNotification*)notif
{
    needRevert = [UIView areAnimationsEnabled];
    [UIView setAnimationsEnabled:NO];
}

- (void)keyboardDidHide:(NSNotification*)notif
{
    if (needRevert) [UIView setAnimationsEnabled:YES];
}

@end
```
モデルでデフォルトモデル以外を使う方法

App:usesとApp::importとClassRegistry::init();がある。

##使い方

```php:import
App::import('Model','KeiyakuList');
$KeiyakuList = new KeiyakuList;

$res = $KeiyakuList->find('all');
```

```php:uses
App::uses('KeiyakuList','Model');
$KeiyakuList = new KeiyakuList;

$res = $KeiyakuList->find('all');
```

App:usesとApp::importは引数が逆なので注意！

```php:ClassRegistry
$KeiyakuList = ClassRegistry::init('KeiyakuList');

$res = $KeiyakuList->find('all');
```

##どれ使うか？
何が適するかは人それぞれだと思う。

ちなみに自分は、モデルが規約通りなのと、遅延ロードでパフォーマンスが優れているのでApp::usesを使っている。

また、ClassRegistryはインスタンスが生成済みであれば、生成済みのインスタンスを返す。いわゆるGoFのシングルトン形式でインスタンスを生成している。なので違う性質のインスタンスをいくつか作る場合は適していない。

##インスタンス生成用のメソッドを作る

AppModelあたりに生成用の関数を作る。
パラメータのモデル名を受けて、importしてnewして、プロパティに設定する。
一工夫でarrayのキャストを使って、パラメータが文字列でも配列でもいいようにしている。

```php:AppModel
public function loadModel($model_list) {
  foreach((array)$model_list as $model){
    App::uses($model,'Model');
    $this->{$model} = new $model();      
  }
}
```

各モデルのメソッドからはこんな感じで使う。

```php:各モデル
//生成するモデルがひとつの場合
$this->loadModel('Foo');
$this->Foo->find('all');

//生成するモデルが複数の場合
$this->loadModel(['Foo','Bar']);
$this->Foo->find('all');
$this->Bar->find('all');
```

参考：[[cakePHP]Model内で利用できるloadModelの実装](http://cheesememo.blog39.fc2.com/blog-entry-594.html)
Laravel でモデルからテーブル名を取得

テーブル名をモデル（Eloquent）から取得する方法。
https://github.com/laravel/framework/issues/1436

```php
$user = new User;
$user->getTable();
```

with()関数を使えば、もう少し短く。

```php
with(new User)->getTable();
```

PHP 5.4 以降なら、これでも ok。

```php
(new User)->getTable();
```
UIWebViewでYouTube動画を全画面再生した場合に、ランドスケープ表示にも対応する方法

iPhone用のアプリだと、ポートレート表示にのみ対応したアプリを作ることはまあ多いことだろうと思います。この場合に困るのは、UIWebViewでWebページを表示した場合に、その中にある動画もポートレートでしか再生できないことです。

「動画が横長なのに画面が回転できないなんて！星ひとつ！！」と言われたことはありませんが、不便に感じるのでできるだけ解消してあげたいところです。

UIWebViewの画面だけでも回転対応すればいいやんとか言われそうですが、まあ…なかなかそうもいかないのが社会のツラさです。

## 3行でわかる対応方法

単純な話なので結論を先に書きます。

 1. Info.plistのUISupportedInterfaceOrientationsで全画面回転対応しておく
 2. 各ViewControllerでshouldAutorotateの戻り値をNoにしたりとか回転を抑制する
 3. 申請する

わかってると5分でアップデート申請できます。具体的なやり方については、以下をご覧ください。

## Info.plistの全画面回転対応

XcodeのビルドターゲットのGeneralってところにDevice Orientationsってのがあるので、Landscapeにチェックを入れます。これであなたのアプリはランドスケープ表示に対応するようになりました！

このまま動作して何の問題もないなら、それで解決みんなハッピーなんですけどね…。

![xcode-targets-general.png](https://qiita-image-store.s3.amazonaws.com/0/3336/080ab496-293a-e35b-6464-cd66a7bdba27.png)

## 各ViewControllerで回転を抑制

各地のViewControllerに以下のメソッドを実装して、デバイスを回転させても画面が回転しないようにします。

```objc
- (BOOL) shouldAutorotate {
   return NO;
}

- (NSUInteger) supportedInterfaceOrientations {
   return UIInterfaceOrientationMaskPortrait;
}
```

UITabBarControllerとかUINavigationControllerなどのコンテナのViewControllerを使っている場合は、そちらで実装しておく必要があります。たとえばUITabBarControllerに実装しておけば、その中のViewControllerには実装しなくていいので楽です。ただしmodalなどを呼び出す場合はmodalのViewControllerにも実装しておく必要があります。

まあ普通にUITabBarControllerとUINavigationControllerを継承したクラスを作ってそちらで実装しておけば、ほとんど大丈夫じゃないでしょうか。（カテゴリを使ってもできますが、オリジナルのメソッドを変更するようなカテゴリはあんまり良くないと思います。）

今回の目的と外れますが、もし表示されているViewController毎に回転するかしないかを決めたいような場合は、UITabBarControllerの子供のViewControllersの戻り値を見るような処理にしないといけないです。Qiitaの記事があったので、興味があればご参照ください。

 * [iOS6以上とiOS5の自動回転の制御について - Qiita](http://qiita.com/yimajo/items/9cdf56b5f7bffbfc8e5f)

以上で対応は完了です。

この状態で動画を再生すると、ランドスケープで全画面表示できるようになるので「超ベンリです！星5個です！」とか言ってもらえるかもしれません。
メールを保存 (bcc)

## 定義ファイルを指定

```bash:/etc/postfix/main.cf
# 送信者のアドレスにマッチ
sender_bcc_maps = hash:/etc/postfix/bcc_sender
# 受信者のアドレスにマッチ
recipient_bcc_maps = hash:/etc/postfix/bcc_recipient
```

## 書式

### ドメイン指定の場合

```bash:/etc/postfix/bcc_sender
@mydomain.com mailarchive
```

```bash:/etc/postfix/bcc_recipient
@mydomain.com mailarchive
```

### アカウント名指定の場合

```bash:/etc/postfix/bcc_sender
user1 mailarchive
user2 mailarchive
user3 mailarchive
```

```bash:/etc/postfix/bcc_recipient
kotani mailarchive
tanaka mailarchive
jon mailarchive
```

## 反映

```sh
postmap /etc/postfix/bcc_recipient
postmap /etc/postfix/bcc_sender
```
JSF2.2でresourcesフォルダの場所を変更する


JSF2.2では、stylesheetなどで`library`を指定した場合、デフォルトでは、`APP_ROOT/resources/`を参照しにいきます。

これを任意のディレクトリにする場合は`web.xml`に以下のような記述を行う事で実装出来ます。

```xml
    <context-param>
        <param-name>javax.faces.WEBAPP_RESOURCES_DIRECTORY</param-name>
        <param-value>/libs</param-value>
    </context-param>

```

使う時はjsfcだとこんな感じになります。

```xml
<link rel="stylesheet" href="css/common.css" type="text/css" jsfc="h:outputStylesheet" library="css" name="common.css"/>

```


なお、この設定だとアプリケーション直下の`libs`フォルダ以下からのパスが参照されます。

上記の例だと`APP_ROOT/libs/css/common.css`へアクセスされます。
VMWareのサスペンドが異常に重くなってきた時の対策

最近やたらVMWare Playerのサスペンド(一時停止)が遅くなってきました。
前はほぼ一瞬だったのですが、最近はホストOSが固まる程重く
時間も5分ほどかかるようになってしまいました。
これでは作業に支障が出る、ということで原因を探ってみたところ
意外な解決策が見つかりました。

## 解決策
**VMをシャットダウンする。**
これだけ。
長期間VMをシャットダウンせずにいると、だんだんサスペンドに時間がかかるようになるみたいです。
VMのハードディスクの断片化が原因らしく、あまり長期間にわたってVMを立ち上げとくのは良くないみたいです。
なので、VMはシャットダウン出来るタイミングでは終了して、
内部のメモリを綺麗にしてあげるのが得策みたいです。

## 参考
[vmware playerが遅い、重いなどの不具合の解消](http://ripea.blog.so-net.ne.jp/2012-10-24)
UnityのGUIで日本語が文字化けする

MacでUnity開発してるとGUIで日本語が「????」に文字化けしました。
原因は、C#ファイルが「UTF-8 BOM無し」になってるためでしたので、
「UTF-8 BOM有り」に変換すると解消されます。

ちなみにWindowsでは、文字化けせずにコンパイルエラーになります
Haxe de Web Audio API


Haxeの勉強がてらにWeb Audio APIで遊んでみました。

##基本的な情報
基本はg200kgさんのページに詳しく載ってます。
http://www.g200kg.com/jp/docs/webaudio/

##Haxeで使う場合
Web Audio APIのライブラリが __一応__ 用意されています。

```Haxe
import js.html.audio.*;
```

exportから書く必要は無さそうで一安心です。

##一応？

Haxeのドキュメントを信じて正直に

```Haxe
var audioctx = new js.html.audio.AudioContext();
```

とか書いて、ChromeやSafariで開くと

```
Uncaught ReferenceError: AudioContext is not defined 
```

とか

```
[Error] ReferenceError: Can't find variable: AudioContext
```

と、AudioContextの取得失敗のエラーが発生して、途方に暮れる罠が仕掛けられてます。

なので、動作させるために、次のようにしてあげます。

```Haxe
var audioctx : AudioContext;

audioctx = if (untyped __js__("typeof(webkitAudioContext)") != "undefined") {
	untyped __js__("new webkitAudioContext()");
} else {
	new js.html.audio.AudioContext();
}
```

後、プロパティなどの定数値は各クラスが持ってる事が多いので、ドキュメントを読んだ方が良いです。

私は読まずに作って、enum定義と実装が終わった後に気づいて、泣きながら直しました。

##実際動くの？

動かしてみるとこんな感じ
http://wokowa.github.io/webaudio-haxe-practice/
ChromeとSafariで動作確認しました（俺調べ）
Customが選択出来ないのは仕様でs（ry

コードはこちら
https://github.com/wokowa/webaudio-haxe-practice
なお、enumのWaveTypeが残ってるのは、Firefoxでも動かそうとして諦めた物の産物です。

##今後の課題
各ブラウザごとにビミョーに実装方法が異なるので、その差異の吸収が今後の課題かも。
Kobitoのパスワードをコマンドラインから調べる


以前、[Kobito.appのパスワードを忘れた時にやること - Qiita](http://qiita.com/suin/items/8d123c1a8b27101d8921)という記事を書いたが、コマンドから調べられるのでメモ。

```
security find-internet-password -w -s com.qiita
```
クラスメソッド・インスタンスメソッドが呼び出せるかを確認する方法

##
Objective-C において、下位互換のあるコードを書いていると
特定のメソッドがある場合はそれを使い、そうでない場合は違う方法で
という書き方をよくする。

その中で、このインスタンスはこのインスタンスメソッドが呼び出せるかというのはよく使っていて、それは

```objc
@interface NSObject
- (BOOL)respondsToSelector:(SEL)aSelector;
@end
```

を使えばよいのだけど、
でもこれ NSObject のインスタンスメソッドなので、
じゃあクラスメソッドが呼び出せるかどうかはどうしたらいいのよってことで調べてみた。

上記と同じように NSObject にあるだろうと思ってそれらしいメソッドを探してみたけところ、それっぽいのでクラスメソッドとして提供されているのは

```objc
@interface NSObject
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
@end
```

というものがあった。
しかしメソッド名から判断するに、インスタンスはこのセレクタに応答出来るかってメソッドなのでクラスメソッドには使えなさそう。

ということで試行錯誤した結果が以下

```objc
#import <Foundation/Foundation.h>
int main(void) {
    @autoreleasepool {
        NSLog(@"-respondsToSelector: Class Method : %@", @([[NSObject class] respondsToSelector:@selector(new)]));
        NSLog(@"-respondsToSelector: Instance Method : %@", @([[NSObject new] respondsToSelector:@selector(description)]));
        NSLog(@"+instancesRespondToSelector: Class Method : %@", @([NSObject instancesRespondToSelector:@selector(new)]));
        NSLog(@"+instancesRespondToSelector: Instance Method : %@", @([NSObject instancesRespondToSelector:@selector(description)]));
    }
    return 0;
}
```

これを実行すると

```
-respondsToSelector: Class Method : 1
-respondsToSelector: Instance Method : 1
+instancesRespondToSelector: Class Method : 0
+instancesRespondToSelector: Instance Method : 1
```

となる。

##まとめ##
クラスメソッドの存在もインスタンスメソッドの存在も respondsToSelector: で確認出来る。
そのセレクタを渡すレシーバに、インスタンスを渡すか Class を渡すかで切り替えられる。

##おまけ##
実は、調査の過程でNSObjectのI/Fには書いていなかったが上記テストコードの実装ミスから見つけたものがあって、
respondsToSelector: をクラスメソッドとしても呼び出せ、そうすることでクラスメソッドの存在が確認できた。

```objc
NSLog(@"+respondsToSelector: Class Method : %@", @([NSObject respondsToSelector:@selector(new)]));
```

こんな感じ。これは YES が返る。
上述のテストコードで respondsToSelector: がクラスメソッドとして存在するか、インスタンスメソッドとして存在するかを確認したところ、どちらも YES となった。
AWSコマンドメモ


## 一覧表示

```shell
> aws s3 ls --recursive s3://<bucket>..
```

ls にも --recursive オプションはあるはずなのに、昨年末まで未実装（というか素で忘れていた気配）だったようなので、`unknown option --recursive`と言われた人は`pip install --upgrade`をしましょう。

参考: https://github.com/aws/aws-cli/issues/465

出力は

```txt
2013-10-08 19:05:59          0 test/
2014-02-25 04:07:31 2060138324 test/test.tar.bz2
2014-01-27 04:08:44      70401 mysql/rose/140127/blog.sql.gz
2013-10-08 19:06:12          0 repo/
2014-01-26 03:49:06  603526574 repo/repo.tar.bz2
```

こんなフォーマットになっていますので、

`aws s3 ls --recursive s3://<bucket>/ | awk 'BEGIN{s=0}{s+=$3;}END{print s};'` とすれば、バケット内の総容量がわかるはずです。
SailsのAssetsでbootstrap（3.x.x）を使う場合

##assets/linker以下のディレクトリを用意
***
**※この投稿はSailsのv0.9.9当時のものです。肝心のsailsのバージョン書き忘れていました。現行バージョン(v0.10.x系)はAssetsまわりの実装がこの当時と異なります。現行バージョンでの対応は公式ドキュメントが充実してきたので、そちらを見ていただければわかると思います（TODO:どっかのタイミングで現行バージョン対応版を投稿しろ、俺）。**
***
公式ドキュメントにあるとおりlinkerオプションを付けてプロジェクトを作ればlinkerディレクトリ以下が自動で用意される。もしlinkerオプションを付けずに作ったプロジェクトであれば、自分でlinkerディレクトリ含め、それ以下のディレクトリを作成する。

linkerオプション付きのプロジェクト作成は以下。

```
sails new <project名> --linker
```

作成されるディレクトリ構成

```
assets
 |_linker
     |_js
     |_styles
     |_templates
```
linkerオプションなしで作成したプロジェクトはこのディレクトリ構成を手動で作成

##bootstrapのjs、cssその他を配置
jsにbootstrap.min.jsを配置。もしjqueryをローカルにファイルを持って使うならjqueryもこちらに配置。
ただし、jqueryをローカルに置く場合はassetsで自動にviewにインジェクションされる時の順番をjquery→bootstrapにしておく必要がある。その設定はGruntfile.jsで行う。

```js:Gruntfile.jsのインジェクション指定
  /**
   * Javascript files to inject in order
   * (uses Grunt-style wildcard/glob/splat expressions)
   *
   * To use client-side CoffeeScript, TypeScript, etc., edit the 
   * `sails-linker:devJs` task below for more options.
   */

  var jsFilesToInject = [

    // Below, as a demonstration, you'll see the built-in dependencies 
    // linked in the proper order order

    // Bring in the socket.io client
    'linker/js/socket.io.js',

    // then beef it up with some convenience logic for talking to Sails.js
    'linker/js/sails.io.js',

    // A simpler boilerplate library for getting you up and running w/ an
    // automatic listener for incoming messages from Socket.io.
    'linker/js/app.js',

    // *->    put other dependencies here   <-*

    // All of the rest of your app scripts imported here
    //'linker/**/*.js'
    'linker/js/jquery-2.1.0.min.js',
    'linker/js/bootstrap.min.js'
  ];
```
linker/**/*.jsの設定で上から順にviewへインジェクションされる。

CSSはディレクトリごとstylesの下に配置する。配置するのはminifyされたものだけでよい。あわせてフォントもfontsディレクトリごとstylesの下に配置する。

##インジェクションのためのフラグコメントの記述
すべてのviewに共通で組み込むならlayout.ejs（jadeで作っている場合はlayout.jadeに）にコメントで以下を追記する。

```html:フラグコメントの追記（ejsの場合）
<!--SCRIPTS-->
<!--SCRIPTS END-->

<!--STYLES-->
<!--STYLES END-->
```
Jadeで作っている場合も同じように//でコメント追加すればよい。
SQLiteOpenHelper#onCreate()のトランザクション処理

以前、DB周りを実装していた時にいろんなサイトを参考にしていたけど

SQLiteOpenHelper#onCreate()でbeginTransaction()しているサイトもあればやっていないサイトもある。

やらなくても特に怒られるわけじゃないけど、何か気持ち悪いから調べてみる。

まずはドキュメントのonCreate()をみてみる。

* [SQLiteOpenHelper#onCreate | Android Developers](http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onCreate(android.database.sqlite.SQLiteDatabase))

特にトランザクションについては書かれていない。

ついでにonUpgrade()も見てみる。

* [SQLiteOpenHelper#onUpgrade | Android Developers](http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int))

こっちにはトランザクション内で実行されてるって書かれてる。

したらonCreateはトランザクションする必要ありそう？

これでも気になるからソースを見てみる。

```
db.beginTransaction();
try {
    if (version == 0) {
        onCreate(db);
       } else {
           if (version > mNewVersion) {
               onDowngrade(db, version, mNewVersion);
           } else {
               onUpgrade(db, version, mNewVersion);
           }   
       }   
       db.setVersion(mNewVersion);
       db.setTransactionSuccessful();
    } finally {
       db.endTransaction();
    }   
}
```
[Cross Reference: /frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java](http://tools.oesf.biz/android-4.4.0_r1.0/xref/frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java#249)

onCreateしっかりトランザクションされてるじゃん！

なので、わざわざSQLiteDatabase#beginTransaction()する必要はないみたい。

逆にSQLiteDatabase#beginTransaction()していても特に怒られるわけじゃないけど、

既にやってくれてるなら書く必要はないよね。

というお話しでした。


## 参考
* [SQLiteOpenHelper#onUpgrade | Android Developers](http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int))
* [Cross Reference: /frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java(OS 2.2)](http://tools.oesf.biz/android-2.2_r1.1/xref/frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java)
* [Cross Reference: /frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java(OS 4.4.0)](http://tools.oesf.biz/android-4.4.0_r1.0/xref/frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java)
エラーのときに画面にエラー内容を表示する


NSLog以外で簡単にエラー内容を知りたいときには、こんな感じで画面に表示するといいかも。

```objectivec:
[[[UIAlertView alloc] initWithTitle:@"エラー" message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil] show];
```
論文紹介「Distributed Representations of Words and Phrases and their Compositionality」


word2vecに関してのもっと詳しい話。

## Skip-gram

Skip-gramについてもうちょっと詳しく。入力ベクトルを元に出力ベクトルを決めるのは、Softmax関数を使うんだけど、この分母の計算が素直にやると語彙オーダーで重たい。階層的SoftmaxとNagetive Samplingの2つの方法が紹介されている。

階層的Softmaxだと語彙の対数オーダーに減る。これは最初に単語をハフマン符号にしておいて、符号の各位置のビットを見て一致するかどうかを教師データにしてビットの数だけ学習を繰り返す手法。ビットはword2vecの実装では40個になってる。各単語ごとに40回学習するのは効率が悪いと感じるけど、各単語ごとに出力層の各単語(数万個！)の出力を計算することに比べればはるかに安い。

Negative Samplingはざっくり言うと適当に選んだk個を「正しくない回答」として逆向きの学習をさせるって方法。小さいデータセットでkは5–20個、大きいデータセットなら2-5個でよいとのこと。word2vecの実装では--negativeでkを設定する。デフォルトでは階層的Softmaxを使うようになっていてNegative Samplingは使われない。もっぱら高速化のためのテクニックだから、必要がなかったら使わなくていいかも。ちなみに僕の蔵書100冊分のデータ(96MB)で学習に3分半、中谷さんにもらった日本語Twitterのデータ(1GB)で40分だった。

## Subsampling of Frequent Words

出現頻度の高い単語を間引きましょうって話。よくtheだとかをstop wordとか呼んで、最初から学習データから取り除いてしまう処置が行われているけども、それを頻度を使って滑らかにやろうとしている。

式(5)のsqrt(threshold / freq(word))ってのはどういうことかって言うと、まず頻度freq(word)がthresholdより小さい場合にはsqrtの中身が1を超えて、間引く確率が負になる。つまり間引かない。

ところでword2vecの該当部の実装はこれなんだけど、論文の数式と違ってthreshold / freq(word)の項が残ってしまう気がするんだ気のせいだろうか。そして残ったとしても上記振る舞いには全く影響がない…sqrtいらんのとちゃうん…。

```py
if (sample > 0) {      real ran = (sqrt(vocab[word].cn / (sample * train_words)) + 1) * (sample * train_words) / vocab[word].cn;      next_random = next_random * (unsigned long long)25214903917 + 11;      if (ran < (next_random & 0xFFFF) / (real)65536) continue;    }## Learning Phrases
```

複数単語からなる節も学習したいよねという話。既存の色々な節抽出アルゴリズムがあるけどここではunigramとbigramと、適当に決めた割引係数と閾値でくっつけたら良さげなものをくっつけるという作業を何パスかやりました、とのこと。割引系数や閾値をどう変えるとどうなるかは書かれてなくて、たぶんパラメータを変えながら何度も実験して、良い値になったものを出してるんだろうな。

## 出典
http://arxiv.org/pdf/1310.4546.pdf


## さいごに
この記事はDeep Learningに興味を持った著者が、関連論文を読んで勉強しながら書いているものです。そのため間違いなどが含まれている可能性があります。もしなにか気になる点がありましたらご指摘いただけるとありがたいです。
論文紹介「Efficient Estimation of Word Representations in Vector Space」


単語を整数(とか1-of-Kベクトル)に写像する自然言語処理では単語の間の関係性を考えることができない。単語を密な実ベクトルに写像したら色々捗るという提案がある。しかし既存の方法は計算が重い。もっと軽い方法でやってみてどの程度の精度が出るか試してみたら意外といい精度が出た。これでいいんじゃね。という話

モデルは2つあるけど結論から言えばSkip-gramがよいってこと。

* CBOW: フィードフォワードのニューラルネットから、エイヤッと中間層を取り除いてみる。入力層には複数の単語を入れるのだけど、この単語ごとの入力から出力層への重みは共有する。（これは画像処理系のニューラルネットでよく知られた手法）

* Skip-gram: CBOWをエイヤッとひっくり返してみたもの。ちなみに"same sentence"と書いているとおり、文の区切りの情報を使っている。

モデルについての詳しいことはあんまり書いていない。次回「Distributed Representations of Words and Phrases and their Compositionality」に乞うご期待。

## 出典
http://arxiv.org/pdf/1301.3781.pdf


## さいごに
この記事はDeep Learningに興味を持った著者が、関連論文を読んで勉強しながら書いているものです。そのため間違いなどが含まれている可能性があります。もしなにか気になる点がありましたらご指摘いただけるとありがたいです。
複合コマンド


`A`コマンドは、2つの操作(`$a`)を1つのキーストロークに合成するといえる。このようなコマンドを下記にまとめる。
これらのコマンドに共通する特徴はすべて、ノーマルモードから挿入モードへと切り替わること。

|複合コマンド|同じことをする長いコマンド|
|:--|:--|
|`C`|`c$`|
|`s`|`cl`|
|`S`|`^C`または`cc`|
|`I`|`^i`|
|`A`|`$a`|
|`o`|`A<CR>`|
|`O`|`ko`|

## 参考
[実践Vim](http://www.amazon.co.jp/dp/4048916599) TIP2
コードチェックを向上させるちょっとしたコツ

開発を急がされていてコミットする時。
以下のようにするとタイプミス等を見つける確率が上がる、気がする。

1. 深呼吸する
2. 目をつぶって５秒待つ
3. 再度コード差分を眺める

目を一旦つぶって、精神を落ち着けるのが重要なのかも。
ChromeAppsでのメッセージ表示について

ChromeApps独特なのかもしれないけれど、すでにこれでアプリを作っている方はわかっているかもしれない。
ChromeAppsでは、ちょっとした確認や大事な警告のためにメッセージを表示しようとしても、

```js
window.alert("...");
window.confirm("...");
```

が使えないのだ！
この大事な情報については、[Disabled Web Features](http://developer.chrome.com/apps/app_deprecated "Disabled Web Features - Chrome Platform APIs")に掲載されている。

ではユーザーに何かメッセージを出したい時や、デバッグ時にはどうしたらいいのか？


# 1 コンソールを使う

これは開発時にのみ有効な手段だが、permissionなども気にせずにどこでも使えるので便利。

```js
console.log("...");
```

これだけである。なお、これだけだとぱっと見どこにでるかわからないので、
アプリの適当なところで右クリックして、 **要素を検証** を選ぼう。
![win8_devcap001.png](https://qiita-image-store.s3.amazonaws.com/0/38416/258c470c-27d6-1115-243a-9e696ec4048b.png)
すると出てくる開発者ツールの **Console** タブを開けばコンソールに出力したメッセージが見られる。


# 2 適当なメッセージ・ポップアップ系のライブラリを使う

我らがGoogle先生も _Use a custom lightbox/popup._ とおっしゃっているので、もう思い切り堂々と使おう。
探せば数多く存在するだろうが、自分が最近見つけたもので気に入ってるのが、
[jQuery EasyUI](http://www.jeasyui.com/index.php "jQuery EasyUI")だ。
_jQuery UI_ よりも手軽に使え、標準で多くのコントロールが揃っている。
メッセージ表示も、必要な準備を済ませたら、次の一文でいつでもどこでも実行できる手軽さ。

```js
$.messager.alert("title","message","icon",callback);
$.messager.confirm("title","message",callback);
$.messager.prompt("title","message",callback);
```

callbackの関数はそれぞれ効果が違う。

+ alertの場合 : 閉じたあとに実行される関数
+ confirmの場合 : ボタンが押された時に実行される関数(引数はBoolean - OKボタン時にtrue, それ以外はfalse)
+ promptの場合 : ボタンが押された時に実行される関数(引数は入力値そのもの)

詳しくはjQuery EasyUIの[ドキュメント](http://www.jeasyui.com/documentation/index.php)を参照してほしい。リファレンスもスッキリまとまっていて、
かなり見やすくて探しやすいのもポイントが高い。

.jsのサイズは大きめだが、どうせオフラインで使われるアプリで使うのだからあまり気にしないでいる。
ファイル一式をダウンロードしたら、.jsと.cssをインクルードするのは当然。必要なのは次の通り。

```html
<link rel="stylesheet" type="text/css" href="styles/easyui/bootstrap/easyui.css">
<link rel="stylesheet" type="text/css" href="styles/easyui/icon.css">
<script src="scripts/jquery.easyui.min.js"></script>
<script src="scripts/easyui-lang-jp.js"></script>
```

パスは適当に読み替えるとして、CSSは _bootstrap_ となっているフォルダは、実際には
テーマごとにフォルダがわかれているので好きなテーマをフォルダごと持ってきて指定する。
そして忘れずにローカライズ用の _easyui-lang-jp.js_ ファイルを指定する。

これでEasyUIの全てのコントロールが使用可能になる。
EasyUIのコントロールの特徴として気に入っているのが、コントロールの定義方法が、
javascriptだけでなく、HTML側だけでほとんどの定義を完結できる方法があるということ。
詳しくは[ドキュメント](http://www.jeasyui.com/documentation/index.php)を参照してほしい。

複数のライブラリを使っているとjavascriptの定義で干渉してしまって・・・ということも
たまにあると思う。そんな時にこのEasyUIならば、 **必要に応じてHTML側で済ませることも可能** となる。
実際使っていて実行速度とかどうなるのかは確認したことはないが、見た目の定義は
HTML側のタグ内に書き加えて、javascript側はなるべくスッキリさせようという分け方でもいいと思う。

## ポップアップのネスト
＄.messager.prompt で入力させた値を$.messager.alertで表示させたり。

```js
$.messager.prompt("appName","入力してください",function(inp){
  $.messager.alert("appName",inp);
});
```

きちんとそれぞれのポップアップごとに画面が停止してくれる。

## ChromeAppsで気になる挙動
普通のウェブサイト・ウェブアプリで使うと問題ないのだが、ChromeAppsで使うとポップアップを
掴んで移動させる際スムーズではない。 **移動し終わったら一気に表示される** 感じ。
だがまあ、使用上他に問題はなさそう。


# 3 終わりに
まとめとして、ChromeAppsでは、window.alertやconfirm, promptが使えないので、
適当なライブラリを使って代替しようということ。
デバッグ目的では _console.log()_ でもいいし、一般的なメッセージ表示には
自分としてはjQuery EasyUIのmessagerコントロールが一番window.alertなどに近い使用感覚で気に入っている。

window.alertがなくて困っているChromeApps開発し始めの皆さん、自分の好みのライブラリを使って
クールに演出しましょう。
Vimのデフォルト設定を使う


```Bash
$ vim -u NONE -N
```

- `-u NONE` フラグは、Vim起動時に`vimrc`を読み込まないように伝える。この場合、カスタマイズは適用されず、プラグインも無効化される
- `-N` フラグを指定すると、`nocompatible`オプションが設定される。`vimrc`を読み込まずにVimが起動すると、vi互換モードに退行し、便利な機能の多くが利用できなくなってしまうが、`nocompatible`オプションを設定することでこれを避けられる

## 参考
[実践Vim](http://www.amazon.co.jp/dp/4048916599)