OmniAICreator/Qiita-1.07M huggingface dataset:
adb経由でPCからAndroid上のPythonと対話する

[SL4A](https://code.google.com/p/android-scripting/)では、Android上でもPythonのREPLが使えます。ただ、せっかく目の前にPCがあるなら、キーボードとモニタでREPLできると何かと便利です。

# SL4Aサービスを起動する

まずRPCサービスを起動します。アプリを操作する方法と、シェル
から起動する方法があります。

## アプリから起動

SL4Aのアプリでインタプリタの一覧を開き、メニューから"Start Server"を選びます。

![server.png](https://qiita-image-store.s3.amazonaws.com/0/1955/c2e5b1a1-bedc-6677-163c-116c75cbdac7.png)

"Public"を選ぶと外部にポートが開き、"Private"では内部のみになります。

サーバが起動すると、RPC用のポートが開きます。通知バーに出る項目からポート番号を確認できます。

ポート番号は通常ランダムに決まりますが、アプリの設定項目にある"Server Port"でポートを固定できます。

## シェルから起動

シェルで次のように `am` コマンドを使います。

```bash:
$ am start \
 -a com.googlecode.android_scripting.action.LAUNCH_SERVER \
 -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher
```

Server Portの設定は影響しませんが、[インテントのパラメータ](https://github.com/damonkohler/sl4a/blob/master/android/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java#L215)で[指定](https://github.com/damonkohler/sl4a/blob/master/android/Common/src/com/googlecode/android_scripting/Constants.java#L59)することができます。

```bash:
$ am start \
 -a com.googlecode.android_scripting.action.LAUNCH_SERVER \
 -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher \
 --ei com.googlecode.android_scripting.extra.USE_SERVICE_PORT 12345
```

標準ではプライベートとして開きますが、パラメータでパブリックにすることができます。

```bash:
$ am start \
 -a com.googlecode.android_scripting.action.LAUNCH_SERVER \
 -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher \
 --ez om.googlecode.android_scripting.extra.USE_PUBLIC_IP true
```

# Pythonを起動する

次に、Pythonを起動します。

Android本体のPythonを使う方法と、PCのPythonを使う方法があります。

## Android本体のPythonを使う

Pythonインタプリタ本体を直にadbシェル上で起動します。その際、`AP_PORT`環境変数に起動したサーバのポートを指定します。

```bash:
# 環境設定は試行錯誤して通ったものなのでお使いの環境で動くかはわかりません
# 12345はRPCサーバのポート番号です
$ AP_PORT=12345 \
  LD_LIBRARY_PATH=/data/data/com.googlecode.pythonforandroid/files/python/lib:$LD_LIBRARY_PATH \
  PYTHONPATH=/sdcard/com.googlecode.pythonforandroid/extras/python \
  PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python \
  /data/data/com.googlecode.pythonforandroid/files/python/bin/python
```

pythonが起動すればそのまま対話が可能です。

## PCのPythonを使う

パソコン側のPythonからもポートがつながればRPCができます。python_extras.zipに入っている[android.py](https://github.com/damonkohler/sl4a/blob/master/python/ase/android.py)を`import`して使います。

サーバをPrivateで起動した場合は、`adb`のポートフォワードを使います。

```pycon:
$ adb forward tcp:12345 tcp:12345
$ AP_PORT=12345 python
```

サーバをPublicで起動した場合は、`AP_HOST`環境変数でAndroidのIPアドレスを指定します。

```pycon:
$ AP_HOST=192.168.1.123 AP_PORT=12345 python
```

いずれの場合も`AP_PORT`環境変数でRPCサーバのポート番号を指定します。環境変数の代わりに、`droid = android.Android(('127.0.0.1', 12345))` のように引数でアドレスを指定することもできます。

うまくいけばSL4A本体と同様の機能が使えます。

```pycon:
>>> import android
>>> droid = android.Android()
>>> droid.makeToast("hello, world!")
Result(id=0, result=None, error=None)
```

(参考: [Stack Overflow - Unable to connect to SL4A server](http://stackoverflow.com/questions/8022970/unable-to-connect-to-sl4a-server/8032174))
Githubアカウントのリポジトリを全部cloneする

CLIでAPIを使う。

    curl https://api.github.com/users/github/repos | grep "\"clone_url\": \".*\"" | sed -e "s/.*\(http.*\.git\).*/\1/" | xargs -n1 -P15 git clone

-P は最大平行プロセス数。30秒で30個ぐらい一気にチェックアウトしてた。
rubyでカウンティングセマフォ

探したがなかったのでつくった。

```rb:
require 'monitor'

class CountingSemaphore
    def initialize(count)
        @count = count
        @monitor = Monitor.new
        @zero_cond = @monitor.new_cond
    end

    def synchronize
        @monitor.synchronize do
            @zero_cond.wait_while{ @count == 0 }
            @count -= 1
        end
        ret = yield
        @monitor.synchronize do
            @count += 1
            @zero_cond.broadcast
        end
        ret
    end
end
```

以下のように使う

```rb:
cs = CountingSemaphore.new(10)

Array.new(100) do
    Thread.start do
        cs.synchronize{ `sleep 10` }
    end
end.each(&:join)
```

`watch --interval=1 "ps auxw | grep sleep"`(ubuntu)などとすれば最大10個であることが確認できる。
Vagrant+chefの入門 (CentOS6.4)

vagrantにCentOS6.2のひな形を登録し、yum reposをレシピから登録するところまでの手順まとめました。

### 開発環境

```
$ vagrant -v
Vagrant version 1.2.2
$ chef-solo -v
Chef: 11.4.4
```

# Vagrantの設定編
VagrantでCentOSが起動できるところまで、まとめてました。

## box追加
作成済みのvagrant用のboxをダウンロードし、ひな形として登録。

```
# 以下コマンドでも行けるけど、回線貧弱なので、下記で対応
# vagrant box add http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

# ローカルにbox落としてから、追加
$ wget http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
$ vagrant box add base ~/Downloads/CentOS-6.4-x86_64-v20130427.box
```

## VM起動

Vagrant用に作業用ディレクトリを作成し、初期化

```
$ mkdir Vagrant
$ cd Vagrant
$ vagrant init
```

## ネットワークの設定
Vagrantfileを編集し、ホストオンリーで接続できるように設定

```
$ diff Vagrantfile Vagrantfile.org
10a11
>   config.vm.network :private_network, ip: "192.168.50.12"
```


テスト用のVM操作簡略化のためホスト名(melody)を追記

```
$ cat /etc/hosts | grep melody
192.168.50.12   melody
```

VM起動確認

```
$ vagrant up
```

sshで疎通確認

```
# 認証鍵追加
$ vagrant ssh-config --host melody >> ~/.ssh/config

# 接続確認
$ ssh melody

# ip振られてるか確認
[root@melody] $ ifconfig | grep 192.168.50.12
inet addr:192.168.50.12  Bcast:192.168.50.255  Mask:255.255.255.0

$ exit
```

### 動作確認
vmを一旦止めて、起動できるか念のため確認

```
# VM停止コマンド
$ vagrant halt

# 起動すればOK
$ vagrant up
```


# Chefの設定編
リモートサーバにchefをインストールし、yumのレシピをインストールするところまでをまとめました。

##リモートサーバにchefをインストール

```
$ knife solo prepare melody
```


## chefリポジトリの生成

```
$ knife solo init chef-repo
$ cd chef-repo
$ git init .
$ git add .
$ git commit -m "first commit"
```

## レシピを生成
```
$ knife cookbook create my-cookbook -o site-cookbooks
```

## knife.rbにcookbook_pathを設定
chefの設定は.chef/knife.rbに書く見たい


```
$ vim .chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'ur_name'
client_key               '/Users/ur_name/Documents/Vagrant/chef-repo/.chef/ur_name.pem'
validation_client_name   'chef-validator'
validation_key           '/etc/chef/validation.pem'
chef_server_url          'http://URHOSTNAME.local:4000'
syntax_check_cache_path  '/Users/ur_name/Documents/Vagrant/chef-repo/.chef/syntax_check_cache'
```


## 外部リポジトリを追加
レシピを外部から追加する場合、一旦全部コミットしないといけないみたいなので、
全部コミットしておく


###リポジトリにファイルをコミット

```
$ git add .
$ git commit -m "append cookbook"
```

### yumのレシピをOpscode Communityから導入
opscodeからchefのレシピを導入するにあたり、
ユーザー登録を行い、認証キーの作成をする必要がある。

下記引用

> Opscode - http://www.opscode.com/hosted-chef/
> FreeTrialで登録する。 (5nodeまで使える様子)
> 
> Organizationsにて Regenerate validation key, Generate knife config 等を押してダウンロード。
> UserProfileで自分を選択して get private key でkey作成してダウンロード。
> (今回、保存先は~/Desktop)
>
> 引用元：OpscodeのSaaSを使用したChef環境の構築 | vMasturbation .:. 
> http://j.mp/168GqFg


認証キーは以下に設置

 ```
$ '/Users/ur_name/Documents/Vagrant/chef-repo/.chef/ur_name.pem'
```


認証キーを登録後は、以下コマンドでレシピを追加できる

```
% knife cookbook site install yum -o site-cookbooks
```

### レシピをリモートホストに紐付け
nodesにはサーバー設定を書き込む
登録したレシピをjson形式でリモートホストに紐付ける

```
$ vim nodes/melody.json
{"run_list":[
  "recipe[yum::epel]"
]}
```
 
### レシピをコンパイルして実行
いろいろ出力されるので、監視しとくといい

```
$ knife solo cook melody
```


## 動作確認
リモートホストにログインし、リポジトリが追加されているか確認

```
vagrant ssh

# リポジトリ確認
yum repolist
```
postfixで頭が「-」のアドレスも処理する

表題の処理, デフォルトでは禁止されている.

`````````/etc/postfix/main.cf
allow_min_user = yes
``````````

の1行を加え, `sudo postfix reload` でリロードすれば「-」で始まるメアドにも送信できるようになる.
Bundlerのインストールメモ

Bundlerをインストールしたときにエラーが出力されて先に進めないので回避策をメモした。

```bash
$ ./ruby/bin/gem install bundler
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_set_tlsext_host_name: cert already in hash table (https://rubygems.org/latest_specs.4.8.gz)
```

```bash
$ ./ruby/bin/gem source --add http://rubygems.org
https://rubygems.org is recommended for security over http://rubygems.org
Do you want to add this insecure source? [yn]  y
http://rubygems.org added to sources
```

もう一度実行する。

```bash
$ ./ruby/bin/gem install bundler
Fetching: bundler-1.3.5.gem (100%)
Successfully installed bundler-1.3.5
Parsing documentation for bundler-1.3.5
Installing ri documentation for bundler-1.3.5
WARNING:  Unable to pull data from 'https://rubygems.org/': SSL_set_tlsext_host_name: cert already in hash table (https://rubygems.org/latest_specs.4.8.gz)
1 gem installed
```

セキュリティー的に問題なので、手元の開発環境のみで実行する。
Vimで英文をうちこむときにはかどりそうなプラグインと設定


\# test_modeがrstなどに標準で対応したので`g:neocomplete#text_mode_filetypes`の設定変更は不要になりました。

　
## neco-look

#### 必要なもの ####

 - [vimのプラギン]neocomplcacheかneocomplete。および依存プラギン
 - [vimのプラギン]neco-look
 - lookコマンド(neco-lookの動作に必要)



neco-lookという、lookを使って英単語を補完候補に出してくれるプラグインがあります。
参考: [Vim-users.jp - Hack #208: 英語を正確に素早く入力する](http://vim-users.jp/2011/03/hack208/)

lookコマンドを背後で使うことで、英語のスペルの補完候補を出してくれます。

以前は、設定なしではreStructuredTextなどのファイルタイプでは動作しなかったのですが、 https://github.com/Shougo/neocomplete.vim/compare/7cff9aa63f37...f742e15e7aab によって標準で動作するようになりました。
　
もし、うまく動いてくれないという方がいた場合は` skip_auto_completion_time`あたりの設定を見直してみてみると解決するかもしれません。

　　

## excitetranslate-vim

\# alpaca_taichouさんに教えていただきました

```viml
NeoBundleLazy 'mattn/excitetranslate-vim', {
      \ 'depends': 'mattn/webapi-vim',
      \ 'autoload' : { 'commands': ['ExciteTranslate']}
      \ }
xnoremap てきとうなコマンド :ExciteTranslate<CR>
```
こんな感じで導入します。

バッファ、あるいはヴィジュアルモードで指定した文章をexcite翻訳に投げ込んでくれるプラグインです。
和英と英和を自動的に判断してくれたりします。軽く単語の意味とか調べたいような時に重宝するんじゃあないかと思います。

　

## スペルチェックな設定

参考 :[Hack #72: 英語の誤入力を防ぐ](http://vim-users.jp/2009/09/hack72/)

参考ページのように、Vimには標準で英語のスペルチェックを行える機能が付属しています。
ただ、いちいち`setl spell` `setl nospell`と打ち込むのは面倒なのでトグル出来るようにキーバインドに設定します。
Vimの多くの設定項目は、末尾にbangをつけることで有効の時は無効へ、無効の時は有効へ、というような動きをさせることが出来ます。

僕はこんな感じで設定しています。

```viml
nnoremap [Show] <Nop>
nmap <Space>s [Show]

nnoremap [Show]s  :<C-u>setl spell!<CR>
```

　

以上。当初と記事の主旨が全く変わってしまいましたが僕は元気です。
半角カナを全角カナに変換したときに困ったこと

ローマ字と記号は半角、ひらがなとカタカナは全角で表示した〜い、みたいな要件を求められた場合、
CFStringTransform　ではなんだかうまくいかなかった。OSのバージョンによって誤変換もあるみたいだし。

仕方ないので…

```objective-c
- (NSString *)hoge:(NSString *)str
{
	if([str isEqualToString:@"ｶﾞ"]) return @"ガ";
	if([str isEqualToString:@"ｷﾞ"]) return @"ギ";
	…
}
```

みたいなのを一文字づつダラダラかいた関数を作成して、とりあえずおっけーと思ってたのですが、上記の関数を利用して実際に帰ってきた文字列は

「ガ」「ギ」…ではなくて「カ"」「キ"」でした。

**なんで!？**

どうやらUTF-8における濁点の全角カタカナは文字コードが異なる2種類の文字があるそうで。こまった。

##どうすればいいか
###解決方法：Unicodeの正規化というのが必要(Normalize)
NSStringには下記のメソッドが用意されているようです。
各メソッドについての詳細はリファレンスや後述の参考サイトなどにて確認して下さい。。。

```
– decomposedStringWithCanonicalMapping
– decomposedStringWithCompatibilityMapping
– precomposedStringWithCanonicalMapping
– precomposedStringWithCompatibilityMapping
```

###というわけで…

```objective-c
NSString* str = @"ｶﾞ";
NSLog(@"%@",[[self hoge:str] decomposedStringWithCompatibilityMapping]);
```

無事に「ガ」が出力されました〜。

とりあえず解決はしたが、そもそも根本的な何かがおかしいのかな？


>参考サイト
>http://homepage1.nifty.com/nomenclator/unicode/normalization.htm
>http://akisute.com/2010/05/utf-8-normalize.html
Xperia A (SO-04E) の adb ドライバインストール方法

非常に苦労したのでメモ。
*もっと良い方法をご存じでしたら教えて下さい！*


***
###1.adb ドライバを落とす
下記からドライバを落とす
[Xperia A driver](http://developer.sonymobile.com/downloads/drivers/xperia-a-driver/)

***
###2.inf の編集
zip を解凍すると sa0107adb.inf が直下にあるので、エディタで開く
下記のセクション両方に

[AdbDevice.NTx86]
[AdbDevice.NTamd64]

下記の項目を追加

%CompositeAdbInterface%     = USB_Install, USB\VID_0FCE&PID_4198&MI_01
%CompositeAdbInterface%     = USB_Install, USB\VID_0FCE&PID_2198&MI_02

***
###3.接続
■接続
　Xperia A を USB に接続
■PC 側
　デバイスマネージャを開くと Xperia A が見える
■Xperia 側
　設定→Xperia → MirrorLink の開始をタップ
■PC 側
　デバイスマネージャに SO-04E が現れるので、ドライバの更新からダウンロードしたドライバを入れる
■切断
　Xperia A を USB から切断
■Xperia 側
　設定→Xperia → USB 接続モードを MSC に変更
■接続
　Xperia A を USB に接続
■PC 側
　デバイスマネージャに Sony sa0107 が現れていれば成功
　adb devices でデバイスが表示されるハズ
RubyMotionで常時Retinaなシュミレータを起動する

RubyMotionでRetinaなシュミレータを起動したい場合は、

```
rake retina=true
```

というように`retina=true`といった引数を指定する必要があります。iPhone5（Retina 4-inch）が主流なので、毎回、引数を指定するのが面倒になってきます。引数なしで常時Retinaなシュミレータを起動するようにするために`Rakefile`の最後に次の行を追加します。

```
ENV['retina'] ||= 'true'
```

iPhone4なシュミレータを起動したい場合は、`rake retina=false`とします。
bundlerが遅いからミラーサイトのbundler-apiを使う

以前の [bundlerが遅い(Error Bundler::HTTPError)のを解決](http://qiita.com/quattro_4/items/fcc2ff8b04c43229a2fb) の続き

また bundlerが遅いと感じる時代が来た
bundler-apiにすると確かに早い気がするが、いちいち変えるのが面倒

aliasを作った (`bapi_on` ⇄ `bapi_off` で切り替え)

```bash:.bashrc
alias bapi_on='ruby -i -pe "gsub %r{^(source.*)https://rubygems\.org(.*)}, '\''\1http://bundler-api.herokuapp.com/\2'\''" Gemfile'
alias bapi_off='ruby -i -pe "gsub %r{^(source.*)http://bundler-api\.herokuapp\.com/(.*)}, '\''\1https://rubygems.org\2'\''" Gemfile'
```

コマンドラインでは

```bash:
ruby -i -pe "gsub %r{^(source.*)https://rubygems\.org(.*)}, '\1http://bundler-api.herokuapp.com/\2'" Gemfile

ruby -i -pe "gsub %r{^(source.*)http://bundler-api\.herokuapp\.com/(.*)}, '\1https://rubygems.org\2'" Gemfile
```

Let's `$ time bundle`

参考

`Gemfile`とかファイルの一部を行単位で置換する -> [Ruby -p -i -e](http://dougireton.com/blog/2013/03/24/ruby-p-i-e/)

`.bashrc`とかにaliasを作る時にquotの変換が訳分からない -> [quotifyというquot置換スクリプト](http://stackoverflow.com/questions/1250079/bash-escaping-single-quotes-inside-of-single-quoted-strings)


そもそもbundler-apiを指定した状態で本番運用ってありなのかな
heroku上のテストアプリとかやっても良さそう
GHE対応！Jenkinsのビルドステータスをアイコン表示する


GitHub + TravisCIな環境でよく見かけるビルドアイコン、いいですよね。私の会社ではリポジトリとしてGithub Enterprise（以下、GHE）を使っていますので、Travisと連携というのはちょっと難しくて、主流はJenkinsです。

でもビルドステータスをアイコン表示したかったので、探してみたらありました、表示できるプラグインが。というわけで、その紹介です。

## 導入手順
Jenkinsの管理画面から以下のプラグインを入れます。

[Embeddable Build Status Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Embeddable+Build+Status+Plugin)

このプラグインを入れると、ジョブの画面に日本語環境だと「埋め込み用ステータスアイコン」というメニューが表示されます。あとはこれを目的の場所にあった形式で取得し、貼り付ければOKです。
私はこれをGHEで使っていますので、README.mdのタイトル真下あたりに入れて、いい感じの表示になっています。

## その他
また、GHEは[GitHub plugin](https://wiki.jenkins-ci.org/display/JENKINS/Github+Plugin)でgithub.comと同様にService Hooksで連携させることができるので、これでpushされたら自動でビルドしステータス表示できるようになります。
Pull Requestをがっつり使っている場合は、[GitHub pull request builder plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin)なんかも良いかと思います。
Java で private なコンストラクタをお気楽に実行するユーティリティ

Qiita で初 Java です。

Unit テストを書いていると、Java なんかではどうしても private なコンストラクタを実行したいケースというのが出てくるのですが、ググってみた限り、どうも使いやすいユーティリティなどがない様子。
private な field にセットしたり、private な setter とかをいい感じに扱ってくれる BeanUtils 的なのとか、そういうのはいくつでも見つかるものの、何故かコンストラクタは見つからないのです。
(あるよ！っていう情報あったら教えて下さい。枯れてる方がいいに決まってるので。)

そりゃリフレクション使えば書けるのは分かりきっているけど、こんな定型文みたいなの毎回書きたくないよね？…というわけでユーティリティクラス化したので置いておきます。
プリミティブ型の引数を取る場合でも、引数が複数の場合でも、比較的楽に書けるのがいいかなー、と思ってます。

```java:こんな感じに使えます。
MyClass obj1 = ConstructorTestUtil.builder(MyClass.class).build();

MyClass obj2 = ConstructorTestUtil.builder(MyClass.class)
	.types(boolean.class)
	.args(true)
	.build();

Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
MyClass obj3 = ConstructorTestUtil.builder(MyClass.class)
	.types(boolean.class, String.class, Map.class)
	.args(false, "text", map)
	.build();
```

```java:MyClass.java
class MyClass {
	private MyClass() {
		System.out.println("no args.");
	}
	private MyClass(boolean arg1) {
		System.out.println("primitive arg: " + arg1);
	}
	private MyClass(boolean arg1, String arg2, Map<Integer, String> arg3) {
		this(arg1);
		System.out.println("string arg: " + arg2);
		System.out.println("map arg: " + arg3);
	}
}
```
```java:ConstructorTestUtil.java
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * This class can execute a private constructor.
 * NOTE: Strongly recommended to use test only.
 * MyPrivateClass obj = ConstructorTestUtils.builder(MyPrivateClass.class).types(Arg1.class, Arg2.class).args(arg1, arg2).build();
 */
public final class ConstructorTestUtil {
    private ConstructorTestUtil() {}

    public static <T> Builder<T> builder(Class<T> type) {
        return new Builder<T>(type);
    }

    public static class Builder<T> {
        private Class<T> type;
        private Class<?>[] types;
        private Object[] args;

        private Builder(Class<T> type){
            this.type = type;
        };

        public Builder<T> types(Class<?>... types){
            this.types = types;
            return this;
        }

        public Builder<T> args(Object... args){
            this.args = args;
            return this;
        }

        public T build() {
            try {
                Constructor<T> constructor = this.type.getDeclaredConstructor(this.types);
                constructor.setAccessible(true);
                return constructor.newInstance(this.args);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            }
        }

    }
}
```

まあ書いたはいいものの、結局使わなかったからいまここに公開しているっていう話だったりはするんですけどね。いつまた使いたくなるか分からないのでメモとして残しておきます。
Twitter風の「約○○分前」を計算する

PHP5.3以降ならDateIntervalを使うと楽。

```php
<?php
/**
 * Twitter風の「約○○分前」を計算する関数
 * @param DateTime $target
 * @param DateTime $now    基準時間をずらしたい場合に指定。
 * @return string
 */
function toLastUpdateString(DateTime $target, DateTime $now=null)
{
    if (!$now) $now = new DateTime('@' . $_SERVER['REQUEST_TIME']);
    /** @type DateInterval $diff */
    $diff = date_diff($target, $now);

    if ($diff->invert) {
        trigger_error('$targetが$nowより未来になっています');
        return '今さっき';
    }

    if ($diff->y) return $diff->y . '年前';
    if ($diff->m) return $diff->m . 'ヶ月前';
    if ($diff->d) return $diff->d . '日前';
    if ($diff->h) return $diff->h . '時間前';
    if ($diff->i) return $diff->i . '分前';
    if ($diff->s) return $diff->s . '秒前';
    return '今さっき';
}

//テスト
echo toLastUpdateString(new DateTime('- 1 minute')), PHP_EOL;
echo toLastUpdateString(new DateTime('yesterday')), PHP_EOL;
echo toLastUpdateString(new DateTime('last week')), PHP_EOL;
echo toLastUpdateString(new DateTime('last month')), PHP_EOL;
```
markdown+StackEdit+Bloggerで快適HP作成


markdownやrstを使いはじめると、普通のページやドキュメントを書くのが、億劫になってきます。GoogleのBloggerへ投稿する方法を紹介します。

1. まず、Chromeを用意します。
2. 次に、[StackEdit](https://chrome.google.com/webstore/detail/stackedit/iiooodelglhkcpgbajoejffhijaclcdg)を導入します。
3. 文章を書きます。（インポートもできます（DropBoxやたGoogleDocsやら））
4. 右上のメニューから「Publish on」を選んで、「Blogger」を選びます。
5. 「url欄」に自分のBloggerアドレス（http://``username``.blogspot.com）を入れます。
6. 「Format」の欄では「HTML」を選びます。

以上です。
これで、文章はhtmlで公開されます。

でも、元のrstを保存しておきたい、または、共有したい場合は、「menu」「SYNCHRONIZE」からDropboxやらGoogle Driveに共有も可能です。
brew upgradeでError: SHA1 mismatchが出た時の対処法

HomevbrewでFormulaを更新しようとしたら「Error: SHA1 mismatch」が発生して更新出来なかったのでその時の対処法。

```
$ brew upgrade
==> Upgrading 1 outdated package, with result:
ricty 3.2.2
==> Upgrading ricty
==> Downloading https://github.com/yascentur/Ricty/archive/3.2.2.tar.gz
Already downloaded: /Library/Caches/Homebrew/ricty-3.2.2.tar.gz
==> Downloading http://levien.com/type/myfonts/Inconsolata.otf
Already downloaded: /Library/Caches/Homebrew/Inconsolata.otf
==> Downloading http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fmix-mplus-ipa%2F59022%2Fmigu-1m-20130617.zip
Already downloaded: /Library/Caches/Homebrew/redir.php
Error: SHA1 mismatch
Expected: a0641894cec593f8bb1e5c2bf630f20ee9746b18
Actual: 5fb8634d4f67df3889e98c1491e9d6b335bc95c7
Archive: /Library/Caches/Homebrew/redir.php
(To retry an incomplete download, remove the file above.)
```

一旦ダウンロード済みのファイルをCachesディレクトリから削除。

```
$ rm /Library/Caches/Homebrew/Inconsolata.otf /Library/Caches/Homebrew/ricty-3.2.2.tar.gz /Library/Caches/Homebrew/redir.php
```

念のためHomebrewを最新にする。

```
$ brew update
```

再度upgradeで成功。

```
$ brew upgrade
```
githubのリポジトリをwgetでだけで取得したい時

gitコマンドがないけどソースだけ落としたい時（という状況がどれだけあるかわかりませんが）

例えばfluentdのソースコードを落としたいとします。

```
$ wget --no-check-certificate https://github.com/fluent/fluentd/archive/master.tar.gz
$ tar xpvf master
$ rm master
$ ls
fluentd-master
```

zipしかだめだと思ったら拡張子をtar.gzにすることでダウンロードできるようです。

参考
[GitHub Api download zip or tarball link](http://stackoverflow.com/questions/8377081/github-api-download-zip-or-tarball-link)
zsh の分からないフラグ類を man から素早く探す

以下の記事が目からウロコだったので触発されました。

- [zsh の分からない用語を man から素早く探す - Qiita](http://qiita.com/mollifier/items/14bbea7503910300b3ba)

zsh といえばフラグを使った黒魔術ですよね。

- 変数展開フラグ (Parameter Expansion Flags)
- 編集子 (Modifiers)
- グロブフラグ (Globbing Flags)
- グロブ修飾子 (Glob Qualifiers)
- などなど

というわけでフラグ類を調べるバージョンを考えてみました。

```zsh:.zshrc
zfman() {
    local w='^'
    w=${(r:8:)w}
    w="$w${(r:7:)1}|$w$1(\[.*\].*)|$w$1:.*:|$w$1/.*/.*"
    PAGER="less -g -s '+/"$w"'" man zshall
    echo "Search word: $w"
}
```

```
$ zfman h
```

![qiita_zfman02.png](https://qiita-image-store.s3.amazonaws.com/0/10548/defc5c66-7c5f-8e90-a223-21df5e0368e6.png)

```
$ zfman j
```

![qiita_zfman01.png](https://qiita-image-store.s3.amazonaws.com/0/10548/d3e0e572-3f63-b3ce-ed2c-5eaa5244c3c2.png)

**なお、発展途上につき全てに対応できていないかもしれません。**

自分がよく使うものはこれでだいたい検索できるなぁぐらいしか確認していないので、他に検索できないパターンがあれば教えて下さい。

## まとめ

参考元と合わせて以下のようにすると、使いやすいと思う。

```zsh:.zshrc
## man zshall
# zman [search word]
zman() {
    if [[ -n $1 ]]; then
        PAGER="less -g -s '+/"$1"'" man zshall
        echo "Search word: $1"
    else
        man zshall
    fi
}

# zsh 用語検索
# http://qiita.com/mollifier/items/14bbea7503910300b3ba
zwman() {
    zman "^       $1"
}

# zsh フラグ検索
zfman() {
    local w='^'
    w=${(r:8:)w}
    w="$w${(r:7:)1}|$w$1(\[.*\].*)|$w$1:.*:|$w$1/.*/.*"
    zman "$w"
}
```
Kobitoのタグを一括で置換する

1  Macのターミナル.appを起動
2  KobitoのDBを開く

```
sqlite3 $HOME/Library/Kobito/Kobito.db
```
3  タグを置換

```
UPDATE ztag SET zname = '置換対象のタグ' WHERE zname = '置換後のタグ';
```

4 DBを閉じる

```
.exit
```
Doctrine でデータベースのリバースエンジニアリング

同僚が php と graphviz を使って MySQL の外部キー制約から ERD っぽいものを作成するツールを作っていたのだけど、データベースのリバースエンジニアリングを INFORMATION_SCHEME とかから自力で行なっていたのを見て

「それ Doctrine で簡単に出来るよ」

と突っ込んだときのサンプルコード。

```php
<?php
require __DIR__ . '/vendor/autoload.php';

use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\ForeignKeyConstraint;

// 接続情報
$cfg = array(
    'driver'   => 'pdo_mysql',
    'host'     => 'localhost',
    'dbname'   => 'test',
    'user'     => 'ore',
    'password' => 'himitu',
);

$conn = DriverManager::getConnection($cfg);
$tables = $conn->getSchemaManager()->listTables();

// ここから下は解析結果を表示してるだけ

/* @var $table Table */
foreach ($tables as $table)
{
    echo $table->getName() . PHP_EOL;

    $pkeys = [];

    if ($table->hasPrimaryKey())
    {
        $pkeys = array_flip($table->getPrimaryKeyColumns());
    }

    /* @var $column Column */
    foreach ($table->getColumns() as $column)
    {
        $name = $column->getName();

        if (isset($pkeys[$name]))
        {
            echo " * " . $name . PHP_EOL;
        }
        else
        {
            echo "   " . $name . PHP_EOL;
        }
    }

    /* @var $fkey ForeignKeyConstraint */
    foreach ($table->getForeignKeys() as $fkey)
    {
        $cols = implode(", ", $fkey->getColumns());
        $name = $fkey->getForeignTableName();
        $refs = implode(', ', $fkey->getForeignColumns());
        echo "     ... fkey ( $cols ) ref $name ( $refs )" . PHP_EOL;
    }

    echo PHP_EOL;
}
```
Androidのコピペで使えるProguard

\#Javascriptインターフェイスは以下のようにアノテーション自体の保護をしてやらないと
\#最新のアンドロイドOSでは動作しません。
\#そしてよくStackなんたら風呂でもお決まりなのが自作のJSインターフェイスのクラス自体を
\#Keepを具体的に記述してやるパターン。
\#しかしめんどうなので以下のようにすればイケました。（自己体験談。イケるとイイネ。）
-keepattributes JavascriptInterface
-keepclasseswithmembers class * {
    @android.webkit.JavascriptInterface \<methods\>;
}

\# ネイティブメソッド守る。もしかしたらSDKに含まれるデフォのほうに既に記述してあるかも。
-keepclasseswithmembers,allowshrinking class * {
    native \<methods\>;
}

\# お金を取る系の部分。これは要る。オフィシャルもそう言ってる。
-keep,allowshrinking public class com.android.vending.billing.*

\# きっと最近じゃTwitter連携は当たり前だね。
\# 以下のように外部ライブラリ使ってるよ、守るよ、の他にワーニング消さないとうまくいかない。
 twitter4j (external library for twitter)
-libraryjars libs/twitter4j-core-3.0.3.jar
-dontwarn twitter4j.management.**
-dontwarn twitter4j.TwitterAPIMonitor
-dontwarn twitter4j.internal.**
-dontwarn twitter4j.Annotation
-keep class twitter4j.** { *; }
Unity向け.gitignoreファイル　(OSX,Xcode,Mono Developer利用)

意外と出回ってないのでアップ
基本的にはgiboで作成して、mono developer分はあとで追加

これも必要というのがあったらコメントください。

--------
```bash:.gitignore
### Unity

[Ll]ibrary/
[Tt]emp/
[Oo]bj/

*.csproj
*.unityproj
*.sln

#Unity User Specific
*.userprefs
*.usertasks

#Mono Developer Project Files
*.pidb
*.resources
test-results/

### iOS向けにXcodeプロジェクトを管理する場合(Xcodeのプロジェクト設定が必要な場合がある、とくにPluginを使っている場合、Splashの4inchがなぜか警告がでるので入れ替えたりとか)

# Xcode
.DS_Store
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap


### OSX　Mac用

.DS_Store
.AppleDouble
.LSOverride
Icon

# Thumbnails
._*

# Files that might appear on external disk
.Spotlight-V100
.Trashes
```
LaTeX について最低限覚えて欲しいこと

LaTeX について書くと長くなるので最低限覚えて欲しいことだけ書いてみた

# 最新の TeXLive を入れる

研究室によっては化石レベルの LaTeX を使っているかもしれない

しかし LaTeX の周辺環境というのはここ数年で劇的に改善された

今では TeXLive に完全な日本語 LaTeX 環境が含まれているので安心して TeXLive をインストールするべき

[Installing TeX Live over the Internet - TeX Users Group](http://www.tug.org/texlive/acquire-netinstall.html)

また Mac の場合は TeXLive ベースの MacTeX もあるのでそちらの方が便利かもしれない

[MacTeX - TeX Users Group](http://tug.org/mactex/)

# 文字コードは UTF-8 に

文字コードは当然のごとく UTF-8 にする

まだ pLaTeX では UTF-8 のネイティブ対応はされていない（別プロジェクトとして upLaTeX などはある）が，UTF-8 を使った場合は内部的に EUC に変換して擬似的に対応している

そのため PDF のラベルなどが文字化けすることがあるが，それは EUC で使う場合と同じ対策が必要になる

また最近の LaTeX は nkf 相当の文字コード判定機能も含まれているので文字コードを意識することはない

唯一意識しなければならないのは外部パッケージを読み込む際で，pLaTeX では文字コードが JIS であれば常に読み込めるので UTF-8 以外の文字コードを使用している人とスタイルファイルを共有しなければならない場合などは JIS にしなければならない

しかし全て UTF-8 で統一する方が管理が楽だと思うので普通はそちらをお勧めする


# 画像は PDF に

画像を EPS にしたがる人が多いが，EPS にするのはトラブルの元であるし，dvipdfmx で PDF に変換する際に Ghostscript を呼び出すので処理が一気に遅くなる

PDF ならファイルも軽いし，EPS よりはトラブルに巻き込まれることが格段に減るはずだ


# 新ドキュメントクラス（js*）は english オプションを

jsarticle などを使っている場合は english オプションを付与するだけで色々英語仕様になるので活用するとよいと思う
流れるようにPHP関数を呼び出す

メソッドチェーンと「流れるようなインタフェース」は違うものらしいですが。

PHP関数を使っていて、「流れるように使えたらなあ」と思ったこと、ありません？

てことで、作ってみました。

```php:
<?php

class piped_call
{
	var $context;
	var $functions;

	public function __construct( $context = NULL )
	{
		$this->context = $context;
	}
	public function __call( $func_name, $args ) {
		if ( isset($this->functions[$func_name]) ) {
			$this->context = $this->functions[$func_name]->call( $args, $this->context );
		} else {
			throw new Exception('Undefined functon call:'.$func_name);
		}
		return $this;
	}
	public function bind( $func_name, pipe $func )
	{
		$this->functions[$func_name] = $func;
	}
}

interface pipe
{
	public function call( $args, $context );
}

class dirname_pipe implements pipe
{
	public function call( $args, $context )	{	return dirname($context);	}
}

class sprintf_pipe implements pipe
{
	public function call( $args, $context )	{	return sprintf($args[0],$context);	}
}

class glob_pipe implements pipe
{
	public function call( $args, $context )	{	return glob($context);	}
}

class array_map_pipe implements pipe
{
	public function call( $args, $context )	{	return array_map($args[0],$context);	}
}

class implode_pipe implements pipe
{
	public function call( $args, $context )	{	return implode($args[0],$context);	}
}

class print_pipe implements pipe
{
	public function call( $args, $context )	{	return print($context);	}
}

$f = new piped_call( __FILE__ );	// 初期値を与える

// パイプたちを使えるようにする
$f->bind( 'dirname', new dirname_pipe() );
$f->bind( 'sprintf', new sprintf_pipe() );
$f->bind( 'glob', new glob_pipe() );
$f->bind( 'array_map', new array_map_pipe() );
$f->bind( 'implode', new implode_pipe() );
$f->bind( 'print', new print_pipe() );

// 流れるようにPHP関数を呼び出す
$f->dirname()->sprintf('%s/*')->glob()->array_map('basename')->implode('<br>')->print();

```

上記を実行すると、

1.  スクリプトの存在するディレクトリを取得(dirname)
1.  ディレクトリ名から、ディレクトリ以下を検索する文字列を作成(sprintf)
1.  スクリプトの存在する同ディレクトリ内のファイルを検索(glob)
1. パスの最後の文字列を取得(arraymap+basename)
1. brタグで分割(implode)
1. 結果を表示(print)

を順次実行します。

上記は以下のプログラムと等価になりますが、思考の順番と関数呼び出しが一致している分、直感的になっていると言えます。カッコの対応も分かりやすいですし。

```php:

print(implode("<br>",array_map('basename',glob(sprintf('%s/*',dirname(__FILE__))))));

```

１関数＝１クラス作成なのであまり効率的ではないですが、まあ小ネタということでお許しください。__callを使っているので、流れているように見えてIDEで賢く候補を補完はしてくれないのが残念。
（クロージャは詳しくないのですが、クロージャならたくさんクラス作らなくていいのかもですね）

参考：
[PHP変態文法最速マスター](http://dororon.seesaa.net/article/140488659.html)
coffee mode を Emacsにインストール、あとRailsで使う。

elispを追加することを「インストール」と呼ぶのは正しいのだろうか。
Railsの初期設定でjsよりもcoffee スクリプトのほうが推奨っぽいかったのでとりあえずEmacsのモードを入れてみた。

## インストール

```
cd ~/.emacs.d/site-lisp
wget https://raw.github.com/defunkt/coffee-mode/master/coffee-mode.el
```

## 設定
http://qiita.com/sawamur@github/items/2b5b0303f5a7aa69392a
のタブ幅を2にする設定をする。

```/.emacs.d/inits/30-coffee.el
(require 'coffee-mode)
(defun coffee-custom ()
  "coffee-mode-hook"
  (and (set (make-local-variable 'tab-width) 2)
       (set (make-local-variable 'coffee-tab-width) 2))
  )

(add-hook 'coffee-mode-hook
  '(lambda() (coffee-custom)))
```

## Railsで使ってみる
controller を作れば自動的に post.js.coffee などが作られるので

```/app/assets/javascript/post.js.coffee
$ ->
  console.log "Morning Coffee!"
```

これで

```/app/assets/javascript/post.js
$(function(){
  console.log("Morning Coffee!");
};
```
と等価になる。
メモ 下線付きラベル

```objc:
UILabel *underLineLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 100, 100, 44)];
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"puhipuhi" attributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1], NSUnderlineStyleAttributeName, nil]];
underLineLabel.textColor = [UIColor greenColor];
underLineLabel.backgroundColor = [UIColor whiteColor];
// [underLineLabel sizeToFit]; // 消えちゃう？
underLineLabel.attributedText = attributedString;
[self.view addSubview:underLineLabel];
```
underscore.jsの_.bindAll() 


[http://underscorejs.org/#bindAll](http://underscorejs.org/#bindAll)

thisを束縛するらしい。
何のことかいまいち分からないので、試してみました。
上記のunderscore.jsのサイトでgoogle chromeだと、

```
var hoge = {
  hello:function(){console.log('hello '+ this.name)}, 
  name: 'daichi'
};

function Fuga(){}

var fuga = new Fuga();

fuga.name = 'ogawa';

fuga.hello = hoge.hello;

fuga.hello();
//=>hello ogawa
//=>this.nameがfugaのogawaになっている。
```

```
var hoge = {
  hello:function(){console.log('hello '+ this.name)}, 
  name: 'daichi'
};
_.bindAll(hoge, 'hello');

function Fuga(){}

var fuga = new Fuga();

fuga.name = 'ogawa';

fuga.hello = hoge.hello;

fuga.hello();
//=>hello daichi
//=>this.nameはhogeのdaichiになったまま。

```

`_.bindAll(object,  'メソッド名1', 'メソッド名2', …);`

見たいにして複数指定できるようです。
PIL（Python Imaging Library）で、画像をセピア調に変換する

※自分の学習用のメモです。

## なにをやりたいのか

ここでは、ピクセルの読み込みのサンプルです。

元画像のピクセルを読み込む → 加工する → 加工したデータを書き込む
といった手順になります。

具体的には、ピクセルを読み込む → グレースケールに変換 → セピア調の色合いにに変換 → ピクセルを書き込む
という処理を、ひとつづつ、全てのピクセルに行います。

より効率的な方法があることは知っています。

## 実行結果

元画像
![haku12.png](https://qiita-image-store.s3.amazonaws.com/0/26107/26dc00a4-db10-9b9c-e0a7-56b71348eef4.png)

実行結果
![haku12sepia.png](https://qiita-image-store.s3.amazonaws.com/0/26107/612ee19a-97d3-e1c6-68bd-6798494a37e3.png)

## スクリプト
Python 2.7で実行。まだPILはPython 3系には対応していないもよう。

```python:image-sepia.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
画像をセピア調に変換するフィルタ

第一引数 : 入力ファイル名
第ニ引数 : 出力ファイル名（省略可）

セピアとはイカ墨から作られる黒茶色の絵の具のことで、画像をセピア調にするということは、これで描かれたように見せるということである。 
- グレイスケール化することによって輝度情報を取り出す
- 全体を茶色っぽく変換
'''
import sys
import Image

def grayscale(r,g,b):
    '''
    RGB値をグレースケール（白黒）に変換する
    '''
    # NTSC 系加重平均法
    gray = int(r * 0.298912 + g * 0.586611 + b * 0.114478)
    # 単純平均法
    #gray = int((r+g+b)/3)
    return gray

def sepiatone(r,g,b):
    '''
    RGB値をセピア調に変換する
    セピア調に変換する決まり事はないみたいなので、それっぽくなれば OK.
    '''
    gray = grayscale(r,g,b)
    #sr = int(gray * 0.9);sg = int(gray * 0.7);sb = int(gray * 0.4)
    #sr = gray; sg = int(gray * 0.8);sb = int(gray * 0.6)
    sr = int(gray * 0.8 + 2); sg = int(gray * 0.6 + 2);sb = int(gray * 0.4 + 2)
    return sr,sg,sb

def make_image(infile, outfile):
    '''
    画像をセピア調に変換する
    '''
    img = Image.open(infile)
    img = img.convert("RGB")
    x,y = img.size
    for ly in range( y):
        for lx in range( x):
            r,g,b = img.getpixel((lx, ly))
            sr,sg,sb = sepiatone(r,g,b)
            img.putpixel((lx,ly), (sr,sg,sb))
            # ↓やや色あせた感じにしたい場合
            #img.putpixel((lx,ly), ((r+sr)/2,(g+sg)/2,(b+sb)/2))
    img.save(outfile)
    return

def usage():
    sys.stderr.write("Usage: %s infile [outfile] \n" % sys.argv[0])
    return

if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)
    # 引数チェック
    if ((argc == 1 ) or (argc > 3)):
        usage()
        sys.exit(1)
    if (argc > 2):
        outfile = argvs[2]
    else:
        outfile = "output.png"

    infile = argvs[1]

    make_image(infile , outfile)

# EOF
```
Mongo[DB|id]-1系でオートインクリメント

find_and_modify を Mongoid から使いたいんだけど、最新のドキュメント通りだと上手く行かなくて(当たり前)、古い MongoDB と Mongoid でオートインクリメントしたい時の話。

``` auto_inc.rb
gem 'bson', '1.0.9'
require 'bson'
gem 'mongoid', '1.9.2'
require 'mongoid'

class Sequence
  include Mongoid::Document
  store_in :sequences
  field :collection_name
  field :seqid,:type=>Integer
  index :seqid, :unique=>true
end

class User
  include Mongoid::Document
  store_in :users
  field :user_id, :type => Integer
  field :name
  field :age, :type => Integer
  field :created_at,:type => Time
  field :updated_at,:type => Time

  before_create :set_seq

  private
  def set_seq
    self.user_id = Mongoid.master.collection("sequences").find_and_modify( :query => { "collection_name" => "users" }, :update => { "$inc" => { "seqid" => 1 } }, :new => true )["seqid"]
  end
end
```
って定義しといてからオートインクリメントしたいコレクションのレコード作っとく。

``` command
Sequence.create!(:collection_name => "users", :seqid => 0)
```
後はなんも考えずに

``` command
User.create!(:name => "hoge", :age => 31)
```
って感じで。
Emacs に zen-coding の後継の Emmet mode を入れる

便利ならしいzen-codingを入れてみたら、何でもEmmet という後継のがでてるらしいのでそっちを入れてみた。

Emmetの方はcssにも対応してるっぽい。多分他にも色々と違いがあるみたい。

## インストール

```
cd ~/.emacs.d/site-lisp
wget https://raw.github.com/smihica/emmet-mode/master/emmet-mode.el
```

## 設定

```el
(require 'emmet-mode)
(add-hook 'sgml-mode-hook 'emmet-mode) ;; マークアップ言語全部で使う
(add-hook 'css-mode-hook  'emmet-mode) ;; CSSにも使う
(add-hook 'emmet-mode-hook (lambda () (setq emmet-indentation 2))) ;; indent はスペース2個
(eval-after-load "emmet-mode"
  '(define-key emmet-mode-keymap (kbd "C-j") nil)) ;; C-j は newline のままにしておく
(keyboard-translate ?\C-i ?\H-i) ;;C-i と Tabの被りを回避
(define-key emmet-mode-keymap (kbd "H-i") 'emmet-expand-line) ;; C-i で展開
```

## 使い方

html ファイルで

```
ul#id>li.list*3
```

とか
css ファイルで

```
p1-2!+m10e+bd1#2s 
```

とか書くとステキに展開してくれる。

(初め動かなかったけど、scssファイルだったのが原因でした。パッチファイルを書いてマージしてもらったので今は動きます。)

他の使い方に関してはこちらを。
https://github.com/smihica/emmet-mode
D-BUS 経由で connman と通信する

# はじめに
元ネタはここ。
https://gist.github.com/tranthamp/2721326

# Connman Technology API examples: (Object Path: /net/connman/technology/<wifi/ethernet>, Interface: net.connman.Technology)
# GetProperties
    dbus-send --system --dest=net.connman --print-reply /net/connman/technology/wifi net.connman.Technology.GetProperties

# Scan
    dbus-send --system --dest=net.connman --print-reply /net/connman/technology/wifi net.connman.Technology.Scan

# Disable/Enable wifi
    dbus-send --system --dest=net.connman --print-reply /net/connman/technology/wifi net.connman.Technology.SetProperty string:Powered variant:boolean:true

# Disable/Enable ethernet
    dbus-send --system --dest=net.connman --print-reply /net/connman/technology/ethernet net.connman.Technology.SetProperty string:Powered variant:boolean:true

# Connman Manager API examples: (Object Path: /, Interface: net.connman.Manager)
    dbus-send --system --dest=net.connman --print-reply / net.connman.Manager.GetProperties
    dbus-send --system --dest=net.connman --print-reply / net.connman.Manager.GetTechnologies
    dbus-send --system --dest=net.connman --print-reply / net.connman.Manager.GetServices

# See: http://git.kernel.org/?p=network/connman/connman.git;a=tree;f=doc;hb=HEAD
Mac OS Marvericks にHomebrewを使ってpyenv,pythonの環境設定を行うメモ


##pythonバージョン管理ツール(pyenv)セットアップ
CPython 2.7系や3.3系、jythonやpypyと言った様々なPythonのバージョンや実装を並列でインストールが可能なツール pyenv をセットアップします。
>$ brew install pyenv-virtualenv pyenv

rehashもしてくれるpyenv-pip-rehashもついでにインストールしておきます。

> $ git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash

以下に従って、自分のログインシェルに対応した設定ファイル(.bashrc, .zshrc, etc)に記述

```.zshrc
To enable shims and autocompletion add to your profile:
  if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

To use Homebrew's directories rather than ~/.pyenv add to your profile:
  export PYENV_ROOT=/usr/local/opt/pyenv
```

####インストール可能なバージョンや実装の一覧を表示

```
$ pyenv install -l
Available versions:
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6

...省略...

  pypy-2.0-src
  pypy-2.0.1
  pypy-2.0.1-src
  pypy-2.0.2
  pypy-2.0.2-src
  pypy-2.1
  pypy-2.1-src
  pypy-2.2
  pypy-2.2-src
  pypy-2.2.1
  pypy-2.2.1-src
  pypy-dev
  pypy3-2.1-beta1
  pypy3-2.1-beta1-src
  pypy3-dev
  stackless-2.7-dev
  stackless-2.7.2
  stackless-3.2-dev
  stackless-3.2.2
  stackless-3.3-dev
  stackless-dev
```

####pythonのインストール
```
$ pyenv install 2.7.6
$ pyenv install 3.3.3
$ pyenv install pypy-2.2.1
```

####設定結果の確認
```
$ pyenv versions
* system (set by /Users/tstomoki/.pyenv/version)
  2.7.6
  3.3.3
```

####バージョンの切り替え
```
#### 現在のシェルのバージョン切り替え
$ pyenv shell 2.7.6
# カレントディレクトリのバージョン切り替え
$ pyenv local 2.7.6
# 全体のバージョン切り替え
$ pyenv global 2.7.6
```

##各パッケージのインストール
主にデータ解析に使用するnumpyやscipy、matplotlib等をインストールしていきたいと思います。

scripy用にgfortranのインストールも合わせて

```
 $ brew install gfortran
 $ pip install numpy
 $ pip install yamlog
 $ pip install scipy
 $ pip install matplotlib
```
途中で

```
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 46: ordinal not in range(128)
```
のエラーが出ましたが[このページ](http://python.blog-slime.com/2007/08/utf8.html#more)で解決しました。
(~/.pyenv/versions/2.7.6/lib/python2.7/site-packages/sitecustomize.py に以下を記述)

```sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
```

また、「/System/Library/Frameworks/vecLib.framework/Headers/vBasicOps.h:153:23: error: immintrin.h: No such file or directory」というエラーが出ててscipyインストール失敗したので[このページから](https://github.com/scipy/scipy/issues/3194)以下をexportすることで解決しました。
Xcodeのheaderの問題だったようです。

```
$ export CC=clang
$ export CXX=clang
$ export FFLAGS=-ff2c
```

matplotlibのインストール時に怒られたので[このページ](http://stackoverflow.com/questions/20572366/sudo-pip-install-matplotlib-fails-to-find-freetype-headers-os-x-mavericks)のようにfreetype2のリンクを張りました。

> $ ln -s /usr/local/opt/freetype/include/freetype2 /usr/local/include/freetype

##動作確認
###テストファイルの作成
```test.py
from pylab import *
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
plot(t, s, linewidth=1.0)
xlabel('time (s)')
ylabel('voltage (mV)')
title('About as simple as it gets, folks')
grid(True)
savefig("test.png")
show()
```

###実行

> $ python test.py

これでサインカーブが出力されればpythonとpipのインストールは終了です。

##参考資料
・[Mac mountain lionにmatplotlibを入れる](http://blog.keit.me/20121220/139/)
自作の有理数クラスに比較演算子をつけたい

[プログラミング言語Scala 日本語情報サイト](https://sites.google.com/site/scalajp/home/documentation/scala-by-example/chapter6)などを参考に自作した有理数同士を比較するため、
このクラスに比較演算子をつけてみた。
が、これでいいのだろうか…。

```scala:Rational.scala
case class Rational(n: Int, d: Int) {
  private def gcd(x: Int, y: Int): Int = {
    if (x == 0) y
    else if (x < 0) gcd(-x, y)
    else if (y < 0) -gcd(x, -y)
    else gcd(y % x, x)
  }
  private val g: Int = gcd(n, d)

  val numer: Int = n / g
  val denom: Int = d / g
  def +(that: Rational): Rational = Rational(numer * that.denom + that.numer * denom, denom * that.denom)
  def -(that: Rational): Rational = Rational(numer * that.denom - that.numer * denom, denom * that.denom)
  def *(that: Rational): Rational = Rational(numer * that.numer, denom * that.denom)
  def /(that: Rational): Rational = Rational(numer * that.denom, denom * that.numer)

  override def toString(): String = {
    s"${n}/${d}"
  }
  override def equals(other: Any): Boolean = {
    if (other.isInstanceOf[Rational]) {
      this == other.asInstanceOf[Rational]
    } else {
      false
    }
  }

  def <(that: Rational): Boolean = {
    if (this.denom == that.denom) {
      this.numer < that.numer
    } else {
      ((this.numer * that.denom) < (that.numer * this.denom))
    }
  }

  def <=(that: Rational): Boolean = {
    if (this.denom == that.denom) {
      this.numer <= that.numer
    } else {
      ((this.numer * that.denom) <= (that.numer * this.denom))
    }
  }

  def >(that: Rational): Boolean = {
    if (this.denom == that.denom) {
      this.numer > that.numer
    } else {
      ((this.numer * that.denom) > (that.numer * this.denom))
    }
  }
  def >=(that: Rational): Boolean = {
    if (this.denom == that.denom) {
      this.numer >= that.numer
    } else {
      ((this.numer * that.denom) >= (that.numer * this.denom))
    }
  }

  def ==(that: Rational): Boolean = {
    if (this.denom == that.denom) {
      this.numer == that.numer
    } else {
      ((this.numer * that.denom) == (that.numer * this.denom))
    }
  }
  def !=(that: Rational): Boolean = ! ==(that)
}
```

前半部分は上記サイトからほぼコピペ。
case class にしたのは、equals を == 演算子と同義にしたかったためオーバーライドし、
合わせて hashCode もオーバーライドするのが面倒だったので。
(case class にするかどうかの判断もこれでいいのか悩ましい。)

後半部分が比較演算子。
分母が同じであれば分子同士を比較し、分母が異なれば分子に比較相手側の分母をかけて比較する。

とりあえずやりたいことはできているが、
それぞれのメソッドで演算子以外ほぼ同じことをやっているのでもう少し共通化したかったが、
うまいやり方が分からなかった。
イメージとしては、

```scala:
  // こんなことはできない
  def <(that: Rational): Boolean = operate(<, that)
  def <=(that: Rational): Boolean = operate(<=, that)
  def >(that: Rational): Boolean = operate(>, that)
  def >=(that: Rational): Boolean = operate(>=, that)
  def ==(that: Rational): Boolean = operate(==, that)
  def !=(that: Rational): Boolean = operate(!=, that)

  private def operate(operator:(Int => Boolean), that:Rational): Boolean = {
    if (this.denom == that.denom) {
      this.numer operator that.numer
    } else {
      ((this.numer * that.denom) operator (that.numer * this.denom))
    }
  }
```

こんな感じで operate メソッドにまとめてそれを呼べれば良かったんだが…。

また、比較自体も分母が異なっていれば相手側の分子にかける、という
結構大ざっぱな計算をやっているような印象がある。

もうちょっとスマートなやり方はないものか…。
TypeScriptでNode.jsのモジュールをrequireする


TypeScriptで、Node.jsのモジュールをrequireしようとして次のようなコードを書くと”error TS2095: Could not find symbol 'require'.”とか言われてエラーになる。

```typescript:hoge.ts
var http = require('http');
```

ネットで検索しても、なかなか思う回答に辿り着けない。
で、試行錯誤して辿り着いた答が以下。

```typescript:hoge.ts
declare function require(x: string): any;

var http = require('http');
```

declareで使いたい関数を宣言してやれば良かったようです。

ついでに、TypeScript + Node.js で動く簡単なWebサーバーを書いてみた。
TypeScriptらしさがかけらもないけど、まあしょうがない。

```typescript:server.ts
declare function require(x: string): any;

var http = require('http');
var server = http.createServer(function(request, response){
    response.statusCode = 200;
    response.setHeader('Content-type', 'text/plain');
    response.write('Hello, TypeScript!');
    response.end();
});

server.listen(8080);
console.log('Server start.');
```

使い方は、コンパイルしてから、nodeで実行。

```bash:
$ tsc server.ts
$ node server.js
```

これで、ブラウザから、 http://localhost:8080/ にアクセスすれば”Hello, TypeScript!”と表示されるはず。
mountain lionにしたら、emacsが悲しいことになった


色々使えなくなってたので対処。
ちなみに、emacs自体の再インストールはしなくて大丈夫だった。

## 1. マシンが変わったら、.elcを消そう
いろいろエラーが出てつらいーと思っていたら、大きな原因はコレだったみたい。

- [emacs - Wrong number of arguments: called-interactively-p, 1 - Stack Overflow](http://stackoverflow.com/questions/10400328/wrong-number-of-arguments-called-interactively-p-1)

.elをbyte-compileした.elcは、文字通りコンパイルしたファイルなので、
端末変わると動かなくなるみたい。

端末変えたら、.elcは一旦抹消しなくちゃだめ。
というのが、OSアップデートでも言えるようです。

## 2. なんかregionのハイライトが消えてた

ので明示的に指定。

- [カスタム編 Emacsリージョンをハイライトする | eyesrobe](http://blog.eyesrobe.com/2007/07/14/p=29)

```
(setq-default transient-mark-mode t)
```

## 3. なんかscss-mode効かなくなった

なんかcss-mode.elが消えてた。ので入れ直した。
http://takashi-yokoyama.blogspot.jp/2011/10/emacscss-mode.html

そんなの入れたのもう昔すぎて、よくおぼえてない…。
/etc/groupを管理するコマンド "gpasswd"



admin, mysql, wwwグループに所属しているユーザscottを、hogeグループにも所属させたい場合、

````sh
$ usermod -Ghoge scott
````

とかやってしまうと、ユーザscottはhogeグループに所属するようになるのですが、その代わりadmin, mysql, wwwグループから外れてしまいます。

かといって

````sh
$ usermod -Gadmin,mysql,www,hoge scott
````
とかするのは面倒です。

そんな時に`gpasswd`コマンドです。

詳細はマニュアルを読んでいただくとして
とりあえずこんな感じでscottをhogeグループに追加します。

````sh
$ gpasswd -a scott hoge
````

で、idコマンドでユーザー情報を確認するとちゃんとhogeグループに追加できました。

````sh
$ id scott
uid=1000(scott), gid=1000(scott),groups=1000(scott),10(admin),11(mysql),12(www),13(hoge)
````
ejsでextendっぽいことをする方法


最近よく使っているテンプレートエンジンのejs、気に入っているんですが、
**extendがつかえない**というところがちょっと不満でした。

これをなんとかする方法を見つけたので、紹介します。

## テンプレートのextend

まず、extendというのがどういうことか。

例えば別のテンプレートエンジン・jadeでは、

* ヘッダーとフッターは共通で
* 中身のコンテンツだけ書く
* ただし、jsライブラリもひとつ追加で入れたい

というとき、以下のように書けます。

```content.jade
extends ./layout

block scripts
  script(src="/underscore.js")

block content
  h1 きじたいとる!
  p 本文
```

```layout.jade
!!! 5
html
  head
    title サイトタイトル
    block scripts
      script(src="/jquery.js")
  body
    section#content
      block content
```

つまり、content.jadeはlayout.jadeを継承(**extend**)して、
必要な部分だけ追記しているわけです。

これによって、content.jadeは必要な情報だけ書けばよいことになるので、
ファイルが短くなり、変な場所をイジる危険・ミスの可能性も減ります。

## ejsの場合

このextendが、ejsだとできない。
決まった別のテンプレートをincludeすることはできるんですが、
提供されている機能としてはそれだけです。

↑と同じことをやろうとした場合、こんなかんじです。

```content.ejs
<% include header %>
<script src="/underscore.js">
<h1>きじたいとる!</h1>
<p>本文</p>
<% include footer%>
```

```header.ejs
<!DOCTYPE html>
<html>
<head>
<title>サイトタイトル</title>
<script src="/jquery.js"></script>
</head>
<body>
<section id="content">
```

```footer.ejs
</section>
</body>
</html>
```

headerとfooterを分ける必要があり、
また追加のscript読み込みを、headタグの中に入れるのが無理です。

ぬー。

## サンプルを見たらなんかあった

何とかならないのかなーと思いつつ、公式のサンプルを見ていたら、
いいものがありました。

https://github.com/visionmedia/ejs/blob/master/examples/functions.ejs

```
<h1>Users</h1>

<% function user(user) { %>
  <li><strong><%= user.name %></strong> is a <%= user.age %> year old <%= user.species %>.</li>
<% } %>

<ul>
  <% users.map(user) %>
</ul>
```

おーーー、functionで囲めば、再利用可能な部分テンプレートを、テンプレート内で定義できる!
これを応用すれば、extendに近いことできそう!

てなわけで、いろいろ試した結果、以下の形でうまく動きました。

```content.ejs
<% function scripts (buf) { %>

<script src="/underscore.js">

<% }; function content (buf) { %>

<h1>きじたいとる!</h1>
<p>本文</p>

<% }; include layout %>
```

```layout.ejs
<!DOCTYPE html>
<html>
<head>
<title>サイトタイトル</title>
<script src="/jquery.js"></script>
<% scripts(buf) %>
</head>
<body>
<section id="content">
<% content(buf) %>
</section>
</body>
</html>
```

## bufってなにさ

これを使うときのポイントがひとつ。

関数定義・呼び出しの部分で、bufっていう引数が入ってますね。
これは、ejsのテンプレートファイルのコンテキストみたいなものが入ってる変数です。
(ejsのコード読んで判明。そういう内部変数みたいやなつは、ほんとは_bufとかそれっぽい名前にしてほしいけど…)

includeを使ってテンプレートが別ファイルになったとき、
このコンテキストが変わってしまうようで。

そのままでは、**content.ejsで定義した関数は、常にcontent.ejsの範囲に出力される**、というわけです。

実際、このbufを渡さない形でテンプレートを実行すると、以下のような悲しい結果が返ってきます。

```

<script src="/underscore.js">


<h1>きじたいとる!</h1>
<p>本文</p>


<!DOCTYPE html>
<html>
<head>
<title>サイトタイトル</title>
<script src="/jquery.js"></script>

</head>
<body>
<section id="content">

</section>
</body>
</html>
```

これはejsのバグって言ってもいいような、仕様って言ってもいいような。。


## まとめ

ejsでもextendできるってことがわかったので、
不満だいぶ減った。

ついでに、includeするときの基準パスをカスタマイズする方法も見つけたので
そちらもまたそのうち。
特定の文字列を含むファイルの一覧を得るコマンド

特定の文字列がカレントディレクトリの下のどのファイルにあるのか探したいということはよくある。unixの強者はfindとgrepとxargにsedやcutやuniqを絡めてパイプでつなぐということをするのだそうだけど、毎度そこまでやっていられない。

非常にいい加減ではあるのだけど、以下のようなbash関数を作った (aliasだと引数を取れないので)

```bash
function inspect(){
	find . -type f -name "*" -print|xargs grep $1 |sed -e "s/^Binary file.*$//g"|sort|uniq
}
```
見てのとおり、対象はカレントディレクトリ以下限定。一応バイナリファイルの結果は除外する。頭に空行が1つ残ってしまうがそのままにしている。

上を.bashrcに追加して、source .bashrcとすれば使える。

引数は一つ。そのままgrepに与えられるので、検索したい文字は "" で囲んでも囲まなくても使える (もちろんスペースを含む文字列は "" で囲む必要がある)。以下のような感じで使う。

```bash
inspect scss
inspect "a??.zip"
```
#追記
このコマンドは見てのとおりかなり能率が悪いので、ルートディレクトリやそれに近いところで実行したりすると実行完了までものすごい時間がかかる。実行するならせいぜいRailsのアプリケーションディレクトリ程度の深さにしておくこと。

#追記2
コメント欄で以下の方法を教えていただいた。ありがとうございます。xargsやfindをこねくり回すよりはるかにシンプル。マッチした文字列そのものの出力は別になくてもよかったことに今頃気が付いた。

>
grep -rlI <文字列> .

- rオプション: 再帰探索
- lオプション: files-with-match、マッチしたときのファイル名だけを出力
- Iオプション: バイナリを無視

今度からちゃんとman読もう。

#追記3
The Silver Searcher (ag) の方が断然高速かつ使いやすいことが判明。即座に乗り換えた。
http://qiita.com/yuyuchu3333/items/4c57186e37db9eb3db15
MacBookAirでスリープ状態にするショートカットキー

# MacBookAirでのスリープショートカットキー
席を離れる時などに、ロックするためにスリープ状態にする必要があるのですが、MBAだとイジェクトキーがないため[公式](http://support.apple.com/kb/HT1343?viewlocale=ja_JP&locale=ja_JP)に載ってるショートカットは使えません。orz..

いろいろ調べた結果。。

**電源ボタンを押したあと「ｓ」**

これで解決しました。
本体を閉じてもスリープになりますが、外部ディスプレイをつないでいる場合などはならなかったりするので、その際はぜひ使ってください。