OmniAICreator/Qiita-1.07M huggingface dataset:
root権限のないLinuxサーバーの/home下にzsh5.0.2とvim7.4をローカルインストールする

よくインストールする割にメモを無くしてしまうので健忘録

# zsh5.0.2のインストール

```shell-session
$ cd ~
$ mkdir -p ~/local/source
$ cd ~/local/source
$ wget "http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz"
$ tar xzvf ncurses-5.9.tar.gz
$ cd ncurses-5.9
$ ./configure --prefix=$HOME/local
$ make
$ make install
$ cd ..
$ wget "http://sourceforge.net/projects/zsh/files/zsh/5.0.2/zsh-5.0.2.tar.gz/download"
$ tar xzvf zsh-5.0.2.tar.gz
$ cd zsh-5.0.2
$ ./configure --prefix=$HOME/local --enable-cflags="-I$HOME/local/include" --enable-cppflags="-I$HOME/local/include" --enable-ldflags="-L$HOME/local/lib"  --enable-multibyte --enable-locale
$ make
$ make install
```

最後に、alias zsh="$HOME/local/bin/zsh" を.bashrcに追記。これでzshを実行するとzshに切り替わる。

# vim7.4のインストール

```shell-session
$ cd ~
$ mkdir -p ~/local/source
$ cd ~/local/source
$ wget "ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2"
$ bzip2 -dc vim-7.4.tar.bz2 | tar xvf -
$ cd vim74/
$ ./configure --enable-multibyte --enable-xim --enable-fontset --with-features=big --prefix=$HOME/local
$ make
$ make install
```

最後に、alias vim="$HOME/local/bin/vim" を.zshrcと.bashrcに追記。これでvimがローカルのものに切り替わる。

各種dotfilesは、以下のものをcloneしてsetupしたりして使う。
https://github.com/sifue/dotfiles

.zshrcは以下のものをコピーして使うと便利。
https://raw.github.com/sifue/dotfiles/master/.zshrc.linux
他のdotfileは好き嫌いが結構あるので、参考程度に。
配列の順番を無視して中身を比較する（expect().to 〜 対応版）


```
expect([1,3,2]).to match_array [1,2,3]
```

のように `match_array` を使うようです。

参考: https://github.com/rspec/rspec-expectations/blob/ab19116c099c4050ba6baaff34a4ee12b634cf1e/spec/rspec/matchers/match_array_spec.rb#L82
perlのcallerが何かと便利、ログ取るときとか

Perlでサービス開発しているのですが、今ログデータを取るプログラムをφ(｀д´)ｶｷｶｷしてます。
まあ、ログ取りはサービス展開している際には基本なので、むしろ何故に今頃やっとんねんって感じです( ´Д`)σ)Д`)ﾌﾟﾆｮﾌﾟﾆｮ

さっき書いたものは、あるデータの送るときそれがどの関数からいつ来たのか任意の文字列なり関数名なりをDBに保存させるといったもの。

どちらもそんな大変なことではなかったのですが（コントローラーまるっと書き換えましたけどね....(#･∀･)）そこで使ったものが caller という関数。
↓こんな感じで

```pl
my $oniku = $args{'syake'} || (caller 1)[3];
```

# 使い方

## 引数なし
リストで返されます。
0: 呼び出し元のパッケージ名
1: 呼び出し元のファイル名
2: 呼び出し元の行番号

```pl
($package, $file, $line) = caller; 
```

## 引数あり
リストで返されます。
0: 呼び出し元のパッケージ名
1: 呼び出し元のファイル名
2: 呼び出し元の行番号
3: 呼び出したサブルーチン名
4: 引数の有無（1: 引数あり、2: 引数なし）
5: リストの要望（1: リストコンテキストで呼び出された場合、2: スカラーコンテキストで呼び出された場合）

引数
1: 実行している関数名が対象
2: 呼び出し元の関数が対象

```pl
my$this_func_name = (caller0)[3];
$this_func_name =~ s/.*:://;
```
そうそう、このままでは完全修飾名が取得されるから、
↑みたいに正規表現で要らない部分を削除したら、関数名だけがとれます。

```pl
sub get_host_func_name {
  my $host_func_name = (caller1)[3];
  $host_func_name =~ s/.*:://;
}
```
↑みたいな関数をメソッドをBase.pmとかの汎用ライブラリに作っておいてもいいかもなぁって思ったりもします。


...ログデータはとっても大事_〆(・ω・｀ )ｶｷｶｷ
ファイルの行をランダムで抽出するワンライナー

```bash
perl -MList::Util=shuffle -e 'print shuffle(<>)' < hoge.txt
```

適当な行数を出力したい場合は tail -n で行数指定する。

```bash
perl -MList::Util=shuffle -e 'print shuffle(<>)' < hoge.txt | tail -n 1000 >> fuga.txt
```
kwik compress png files

Kwikでは、作品が完成したときに簡単にpngファイルを圧縮することができます。kwikのステータスバーの下記の Compress PNG filesのボタンを押してください。

![kwik_compress_icon.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28956/7ecdb549-c5f3-3b93-0299-36913d0a7468.jpeg)

予め ~/Documents/Kwikの配下にある、compress.commandに実行権限を付ける必要があります。!

![kwik_compress.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28956/8d928e9c-7448-acac-f85b-6bd0bf88912b.jpeg)
Hashのkeyをflatにする

何階層にも入れ子になっているHashのKeyを'_'で結合してフラットにします。

```rb
#!/usr/bin/env ruby

require "awesome_print"

def flatten_key(hash, key = "", result = {})
  hash.each do |k, v|
    k2 = "#{key} #{k}"

    if v.is_a?(Hash)
      flatten_key(v, k2, result)
    else
      result[k2.strip.gsub(" ", "_").to_sym] = v
    end
  end

  result
end


ap flatten_key(
  {
    studio3104: { sex: "male", age: "young", favorite: { tsukemen: "warito", sushi: "any" } },
    kenjiskywalker: { sex: "male", age: "ojisan", },
  }
)
```
```rb
{
                  :studio3104_sex => "male",
                  :studio3104_age => "young",
    :studio3104_favorite_tsukemen => "warito",
       :studio3104_favorite_sushi => "any",
              :kenjiskywalker_sex => "male",
              :kenjiskywalker_age => "ojisan"
}
```
Kwik Shared Asset

kwikのShared Assetとは、一つのレイヤーの画像を複数ページで使用して、パブリッシュ時にそのレイヤー画像を一つだけをパブリッシュする機能です。この機能を使わない場合は、異なるページに同じレイヤー名をもった画像を配置した場合、p1_xx.png, p2_zz.pngと複数出力されます。

操作としては、レイヤー名をグローバルとして扱うために、レイヤー名の先頭にkwkの３文字を指定します。
各ページの対象のレイヤー名を共通のkwk○○○としてください。下記の例は左側のpage2.psdの雲の画像を右側の葉っぱのレイヤーと共通にする設定として、ともにkwkshapeというレイヤー名にしました。するとpage2.psdの雲の画像が共通の画像として使用されます。パブリッシュして確認するとpage1, page2とも雲の画像が表示されます。

![kwkShared02.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28956/ff2577f8-6afc-cc80-09f9-e46e35894294.jpeg)
javascript and jQuery めも

##init: function
functionの前のinitはメソッド名を表す
## (object名).find
全ての◯要素からfindを用いて◯要素を捜し、そのあとに続く命令を実行する
例: $("p").find("span").css('color','green');
##("object名").bind(type, [data], fn)
オブジェクトで指定した要素にイベントハンドラを設定する
イベントハンドラとはイベントが発生した時に実行するfunction
例: ("object名").bind("click", function (evt) 
##(object名).attr( 属性名 )
引数に属性名を指定することで属性の値を取得する
例:$("button").click(function(){
	$("a").attr("リンク名とか");
})
##(object名).change( function )
内容が変更されたら引数のfunctionを実行します。このイベントはselect要素、input要素、textarea要素が変更されたときに発生
##(object名).each()
すべてのオブジェクト上で実行される関数
rubyのeach文みたいなもの
例: var arr = [ "one", "two", "three", "four", "five" ];
    jQuery.each(arr, function() {
      $("#" + this).text("Mine is " + this + ".");
       return (this != "three");
   });
##(object名).first()
要素集合のうち、最初の要素のjQueryオブジェクトを返す
##(object名).keyup
keyupイベントは通常、キーボードのキーが押され、上がった際に呼び出される
Kwik New Project 設定

|                |                                              |
|:---------------|---------------------------------------------:|
| New Universal  |    2048x1536 (Latina iPad), @2 for the iPad2 |
| New iPad       |    (New Universalと同じ)※                      |
| New iPad Only　 |　　2048x1536 (Latina iPad)                   |                     
| Universal　　　　|　　1024x768, @2 for small 959x719            |  
| iPad            |   1024x768                              |
| iPhone5         |   1136x640, @2 for small 1064x599       |
| iPhone          |   960x640,  @2 for small 899x599        |
| KindleFire      |   1024x600                              |
| KindelFireHD    |   1920x1200,@2 for small 1023x639       |
| NookHD+         |   1920x1280, @2 for small 1023x682      |
| NookHD          |   1440x900, @2 for small 1023x639       |
| NookColor       |   1024x600                              |
| Galaxy Tab 7    |   1024x600                              |
| Galaxy Tab 10   |   1280x800                              |
| Nexus 4         |   1280x768                              |
| Nexus 7         |   1280x800                              |
| Nexus 10        |   2560x1600                             |

                                                            
※ New iPad: kwik2.4.1でiphone3GのサポートがなくなっためUnivesalと一緒になった)

http://www.kwiksher.com/learn-kwik2/new-project/

  Universal      1024 x 768
  New Universal  2048 x 1536,   @2 for the iPad 2


kwik 2.4.1
  Do not export @4 images anymore (old 3G iPhones) 


http://www.coronalabs.com/blog/2012/12/04/the-ultimate-config-lua-file/
  600 / 320 = 1.875   --Kindle Fire & Nook
  640 / 320 = 2.0     --iPhone 5
  768 / 360 = 2.13    --iPad
  800 / 320 = 2.5     --Kindle Fire HD / Nexus7
  1200 / 320 = 3.75   --Kindle Fire HD 8.9
  1536 / 360 = 4.26   --Retina iPad
SQL構文　文法

#ASC
昇順
#DESC
降順
#WHERE
複数の条件を指定する
「AND」や「OR」などの論理演算子で記述
#ORDER BY "フィールド名" [ASC, DESC];
昇順か降順かを並べる
# INNER JOIN
左右両方のテーブルで対応するデータが存在するものしか表示しない
結合はそれぞれのテーブルの指定したカラムの値が同じものを1つのデータとして取得
カラムの値の中に一致するものがなかった場合はデータを取得しない
カラムの値が一致するデータが複数あった場合は、全ての組み合わせで結合を行いそれぞれデータとして取得する
# LEFT OUTER JOIN
FROMの後に書かれたテーブルのデータだけを取得する。
JOIN の左側のテーブルのデータは基本的に全て表示します（ WHERE 句で除かない限り）。そしてそこに、対応する右側のテーブルのデータを追加する
カラムの値がどちらかのテーブルにしかなかった場合でもデータとして取得します
RIGHT JOINで始まる場合はJOINの後のテーブルのデータを取得する
参考にサイト http://www.dbonline.jp/sqlite/join/index2.html
# RIGHT JOIN
JOIN の右側のテーブルのデータは基本的に全て表示されます。そしてそこに、対応する左側のテーブルのデータを追加する
#GROUP BY
集計関数を使う時に使う
#CURRENT_DATE 
現在の日付を返す
引数を持たず、DATE 型として日付を返します
mm/dd/yyyyのフォーマットで返す
#COALESCE
COALESCE ( expression [ ,...n ] ) 
引数の中からNULLでない値を返す


参考
http://www.1keydata.com/jp/sql/sql-syntax.php
DOSコマンドで環境変数にGitのコミットコメントを入れる方法(要ruby)

Gitの最新のコミットコメントをWindowsの環境変数に入れる方法です。
文字コード変換のためにruby(1.9以上が必要)を使っています。

このコマンドを直接コマンドプロンプトに打ち込んでも動きません。batファイルに書いて実行してください。
rubyにパスが通ってなければcommentには現在日時が入ります。

```
@echo off
set comment=%date% %time%
FOR /F "usebackq tokens=*" %%i IN (`ruby -v`) DO @set rubyver=%%i
if "%rubyver:~0,4%" == "ruby" (
git log -1 --oneline>gitlog-utf8.txt
type gitlog-utf8.txt|ruby -e "p STDIN.set_encoding('UTF-8', 'Windows-31J').read">gitlog-sjis.txt
FOR /F "usebackq tokens=*" %%i IN (`type gitlog-sjis.txt`) DO @set comment=%%i
)
if "%comment:~-3,-1%" == "\n" set comment=%comment:~9,-3%
echo %comment%
```

こんなことするくらいなら最初から全部rubyでやればよかった・・
Python3.3.1 + Bottle  でWebアプリケーション（1） - テンプレートエンジンをjinja2に変更する


``` app.py
from bottle import route, run
from bottle import TEMPLATE_PATH, jinja2_template as template

TEMPLATE_PATH.append("./views")

@route('/')
@route('/hello/<name>')
def greet(name="Stranger"):
    return template('hello.j2', name=name)

run(host='localhost', port=8080, debug=True, reloader=True)
```

ソースは上の通り（開発環境）。

* jinja2_templateをimportする（htmlファイルのパスを指定したい場合はTEMLATE_PATHも）
* jinja2テンプレートを返却（拡張子は何でもいいのか…？）

参考までに

``` hello.j2
{% extends "base.j2" %}

{% block content %}
    Hello {{ name }}! How are you?
{% endblock %}
```

``` base.j2
<html>
    <head>
        <title> Sample Bottle App </title>
    </head>
    <body>
        {% block content %} {% endblock %}
    </body>
</html>
```
でサーバを走らせて

```
% python app.py
```

http://localhost:8080/
と
http://localhost:8080/hello/hoge
にアクセスすると、デフォルトとパラメータ両方正しく画面が出力されることが確認されます。
サクラエディタでスクリプトをデバッグする

サクラエディタにはctrl+Bに割り当てられた「ブラウズ」で、編集中のスクリプトを実行する機能がありますが、
1.例外発生時にそのままシェルが終了してしまう
2.出力をコピーしにくい
3.既定のプログラムをpython.exeにしなければいけない
など、ちょっと使いづらいです。

サクラエディタに以下のマクロを導入することでデバッグのようなことができます。

```pythondebug.js
Editor.FileSave();
Editor.ExecCommand("python " + '"' + Editor.GetFilename() + '"', 1)
// '"' はパスに空白が含まれている時用
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23937/6472043a-3bc8-3714-186f-c9cefc134391.png)

例外発生時もちゃんと出力されています。
ruby、JSなどでもできるかもしれません。
JavaScript で動的オーバーライド時にもとのメソッドを呼び出す方法


JavaScriptでオブジェクトのメソッドを実行時に書き換えること自体は簡単ですが、
オーバーライドメソッド内でもとのメソッドを呼び出したい場合はどうすればよいのでしょうか。
このサンプルコードでは、クロージャーを利用することで名前空間を汚染することなくオリジナルのメソッドを保持し、オーバーライド<sub>[1](#1)</sub>を実現しています。

```
var anObject = {
  state: "hoge", 
  getState: function () { return this.state; }
};

anObject.getState(); // "hoge"


anObject.getState = (function () { 
  var context = anObject;
  var original = anObject.getState;
  return function () { return "state: " + original.call(context); };  // override-method
})();

anObject.getState(); // "state: hoge"
```

<small>(ちなみに黒魔術なので、過度な利用は控えたほうが良いかと思います。。)</small>

***
<a name="1">1.</a> JSにはクラスの概念が無いですが、「オブジェクトのメソッドを書き換える」ぐらいの意味で使っています
Sphinxで作成したドキュメントをherokuでホスティング、Continuous Documentationなススメ(Basic認証付き)

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

ドキュメント作成に色々とよいSphinx、さてhtmlを作ったら何処でホスティングしましょうかね。

Sphinx詳細は[公式:http://sphinx-doc.org](http://sphinx-doc.org)

適当なレンタルサーバやs3やら、Giithub Pages等ありますが、heroku上でsinatraを使って配信する方法を紹介。

## sinatraの準備

`Gemfile`にsinatraを入れましょう、rackupにはthinを使ってみます。

```ruby:Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "rake"
gem "thin"
```

で、`config.ru`に全部かいちゃいました。

```ruby:config.ru
require 'sinatra'
set :public_folder, File.dirname(__FILE__) + '/build/html'

get '/' do
  redirect "/index.html", 301
end

run Sinatra::Application
```

`:public_folder`をSphinxがhtmlを生成するディレクトリにすれば大体OKです、`:public_folder`に実ファイルがあればそれを配信するsinatraの機能に丸投げです。

ついでに`/`へのリクエストは`/index.html`に放り投げます。`DirctoryIndex`みたいな挙動にしようと。


### heroku上のrackup用

無くても良かったような気がしつつ、Foreman用の`Procfile`も設置。

```Procfile 
web: bundle exec rackup -p $PORT
```

これで準備OKです。

### ローカルで動作確認

一旦ローカルで動作を確認してみます。

```shell:execute-rackup
$ bundle exec rackup
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop
```

`http://localhost:9292`を開けばSpinxが作成したindexを表示できていると思います、スタイルもリンクもOK。

## Basic認証をかけてみる

herokuでホストするのはいいけど、一応軽く認証を掛けたいこともあるでしょう。
Basic認証を追加してみました。

```ruby:config.ru(basic_auth)
require 'sinatra'
set :public_folder, File.dirname(__FILE__) + '/build/html'


## >>>追記部分
use Rack::Auth::Basic do |username, password|
  username == 'hogehoge' && password == 'mogemoge'
end

before '*' do
  # authenticate!
end
## <<<<追記部分

get '/' do
  redirect "/index.html", 301
end

get '/:dir' do  ## 修正２,3
  unless request.path_info.end_with?('.ico')
    redirect "#{request.path_info}.html", 301
  end
end

run Sinatra::Application
```

----

> 修正： `authenticate!`部分は勘違い、不要でした。
> 修正2： 自動生成元によっては.htmlがついてないことがあるので付与してリダイレクト
> 修正3： `favicon.ico`の自動取得でリダイレクトループするので条件設定。

----


`before`で全てのリクエストに対して`authenticate!`を通すことにしました、これだけでOK。


## herokuにPush

適当な手段でherokuにアプリケーションを登録します。

```shell:execute-rackup
$ git push heroku
Counting objects: 38, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (37/37), done.
Writing objects: 100% (37/37), 148.40 KiB, done.
Total 37 (delta 4), reused 0 (delta 0)

-----> Ruby/Rack app detected
-----> Using Ruby version: ruby-2.0.0

-- snip --

-----> Compiled slug size: 26.2MB
-----> Launching... done, v4
```

これで認証付きのドキュメントをホストできました。
あとはJenkinsとでも連携して、継続的ドキュメントアップロード提供をやるといいでしょう。

----

認証をGithub連携にしてみたバージョン: [ShpinxをShinatraでホストしつつGithubのOAuth経由でチーム認証をかけたが](http://qiita.com/sawanoboly@github/items/9646c4c53d442a7c6b46)
ARC のメモリ解放タイミングを調べた

一つの関数内で容量の大きなファイルを読み込み加工する処理を連続して行っていたらメモリが足りなくなった。

ARC ではスコープを外れ(て参照カウンタがゼロになっ)たオブジェクトは、すぐに破棄されると思っていたのでしばらくハマった。

## 問題のソース(ARC使用)

ローカルでもWebでも何でもいいけど、ファイルから無視できない程度の容量のデータの読み込みを繰り返す処理。

```obj-c:
- (IBAction)buttonDownWithArc:(id)sender {
    NSString* path = @".../bigdata.img";

    for (int i = 0; i < 10000; i++) {
        NSData* data = [NSData dataWithContentsOfFile:path];
        [NSThread sleepForTimeInterval:0.5];
        data = nil;
    }
}
```

これを Instruments でプロファイルするとこうなる。

![arc_memory_release_timing_01.png](https://qiita-image-store.s3.amazonaws.com/0/8227/f45f50ec-ee00-83ec-3038-c05113f09c0d.png)

じゃんじゃんメモリ確保してしまう（汗
``data`` は ``nil`` にした時（あるいはスコープ外れた時）にメモリ解放されると思っていたのだが。

ちなみにこの関数の処理が終了すると、メモリが解放される。

## 非ARC でやってみた

メモリ管理をマニュアルでやったらどうなるかを確認した。

```obj-c:
- (IBAction)buttonDownNoArc:(id)sender {
    NSString* path = @".../bigdata.img";

    for (int i = 0; i < 10000; i++) {
        NSData* data = [NSData dataWithContentsOfFile:path];
        [NSThread sleepForTimeInterval:0.5];
        [data dealloc];
        data = nil;
    }
}
```

この時のメモリ確保状況は、期待した通りになった。

![arc_memory_release_timing_02.png](https://qiita-image-store.s3.amazonaws.com/0/8227/40bea9c5-54b0-3655-aa7d-d886787049fb.png)

メモリ使用量が線形に **増えない** ことが分かる。ARC 利用時にもこうなるようにしたい。

状況は、スコープ内変数の破棄が、関数を抜ける時に遅延されている。
ARC 周りの情報をいろいろ漁っていて、AutoReleasePool との関わりが怪しいと予想した。

* [[iOS5] ARC (Automatic Reference Counting) : Overview - iOS 開発ブログ Natsu's note ](http://blog.natsuapps.com/2011/11/ios5-arc-overview.html)

より引用：

> ###retain, release, autorelease, deallocはコンパイラのお仕事
>
>ARCを利用する場合、コンパイラが
>
> * retain, release, autoreleaseを挿入してくれる（自分で呼んではいけない。コンパイラエラーになる）。
> * deallocを適切な位置に挿入してくれる（deallocのオーバーライドは可能。ただし[super dealloc]は不可能）。
>
>ことになります。

コンパイラにより関数単位で ``@autoreleasepool {  }`` が挿入されているとしたら、最初の図のような動きになるはず。ということは、for ループの中に @autorelease を持ってったらどうか？

## ARC + @autoreleasepool 版

for の中の処理を ``@autoreleasepool { }`` で括ってみた。

```obj-c:
- (IBAction)buttonDownWithArcAndAutoRelease:(id)sender {
    for (int i = 0; i < 100; i++) {
        @autoreleasepool {
            NSData* data = [NSData dataWithContentsOfFile:_path];
            [NSThread sleepForTimeInterval:0.5];
        }
    }
}
```

すると、

![arc_memory_release_timing_03.png](https://qiita-image-store.s3.amazonaws.com/0/8227/69e43af6-4b7f-1768-425f-41ef2f5a3e60.png)

やたー、期待する動きになったぞ。

## まとめ

とここまで調べて、しばらく Obj-C さわってなかったので埃をかぶっていた

* [エキスパートObjective-Cプログラミング -iOS/OS Xのメモリ管理とマルチスレッド-](http://www.amazon.co.jp/gp/product/4844331094?ie=UTF8&camp=1207&creative=8411&creativeASIN=4844331094&linkCode=shr&tag=oku2008-22)

を引っ張り出してきて読んだら、P.25 にまさにその事が書かれていて泣いた。

>とはいえ、autorelease されたオブジェクトが大量に発生した場合、NSAutoReleasePool のオブジェクトが破棄されない限り、それらのオブジェクトは release されないので、メモリ不足に陥る場合があります。典型的な例は、大量の画像をリサイズしながら読み込む場合でしょう。…
>
>```obj-c:
for (int i = 0; i < 画像数; i++) {
    /*
     * 画像読み込み処理
     * autoreleaseされたオブジェクトが大量発生。
     * NSAutoReleasePoolのオブジェクトが破棄されないため
     * いずれメモリ不足発生！
     */	       
}
```

勉強しなおします。。。
Ansibleで自作モジュールを作成してplaybookと一緒に配布

## モジュールの開発

モジュールの作成については公式ドキュメントの[Developing Modules — Ansible Documentation](http://docs.ansible.com/developing_modules.html)に説明があります。

- モジュールはスクリプトファイルとして作成します。
- モジュールはどの言語で記述しても良いです。ただし、本家にpull requestを送って取り込んでもらうにはPythonで記述する必要があります。
- モジュールの実行結果のステータスをJSONとして標準出力に出力するようにします。```changed```というbooleanのキーは必ず含めるようにします。モジュールの実行によってシステムが変更されたかどうかを設定します。
- 上記のJSON以外にモジュールの中で標準出力や標準エラー出力に出力するのはご法度です。


あとは組み込み標準のモジュールのソース[ansible/library at devel · ansible/ansible](https://github.com/ansible/ansible/tree/devel/library)を参考にしつつ、モジュールの最後で

```
# include magic from lib/ansible/module_common.py
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
main()
```

として読み込んでいる[ansible/lib/ansible/module_common.py](https://github.com/ansible/ansible/blob/devel/lib/ansible/module_common.py)の中で定義されている共通関数を適宜利用しつつ、モジュールを作ります。

例としてhostnameという拙作のホスト名設定モジュールを示します。
[ansible-playbooks/library/system/hostname at master · hnakamur/ansible-playbooks](https://github.com/hnakamur/ansible-playbooks/blob/master/library/system/hostname)

RHEL/CentOS/Debian/Ubuntuのみ対応で、hostnameコマンドの実行と/etc/sysconfig/networkまたは/etc/hostnameを書き換える処理を行っています。

使う側はtaskのところで以下のように書くだけです。

```
hostname: name=_YOUR_HOSTNAME_TO_SET_
```

hostnameモジュールを使わない場合と比べると、かなりシンプルになりました。
[Add custom hostname module and modify hostname task to use it. · 6aa9f1e · hnakamur/ansible-playbooks](https://github.com/hnakamur/ansible-playbooks/commit/6aa9f1e2df25cc0308bca4fc7ed3743c01ce29eb#diff-3)

このhostnameモジュールは本家に取り込んでもらうべくpull request中です。[Add a hostname module, which sets system's hostname. by hnakamur · Pull Request #3940 · ansible/ansible](https://github.com/ansible/ansible/pull/3940)

## モジュールの配布

[Best Practices — Ansible Documentation](http://docs.ansible.com/playbooks_best_practices.html)にある通り、playbookのlibraryフォルダに自作モジュールを置いておくと自動で読み込まれます。

もし、それ以外の場所に置きたい場合はANSIBLE_LIBRARY環境変数か--module-pathコマンドラインオプションを指定すればそれも可能です。
[Developing Modules — Ansible Documentation](http://docs.ansible.com/developing_modules.html)

特別な理由がなければlibraryフォルダで良いと思います。
PowerShellのプロンプトを短縮する

Windows PowerShellのプロンプトが、標準だと

```
C:\Users\kuchitama\Documents > 
```

と長ったらしくフルパスを表示するので、カレントディレクトリ名だけ表示するように修正する。

フルパスが確認したいときは、`pwd`を使う。

# シェルの作成

MyDocumentsに`WindowsPowerShell`フォルダを作成
作成したフォルダ内に以下のファイルを作成

```Microsft.PowerShell_profile.ps1

function global:prompt {
    $idx = $pwd.ProviderPath.LastIndexOf("\")+1

    Write-Host($pwd.ProviderPath.Remove(0, $idx)) -nonewline

    return "> "
}

```
これで、カレントディレクトリ名だけが表示される。

# エラーが出る場合

下記を参考にする。
http://qiita.com/Kuchitama/items/6cdb29fcfd53b730aea7
ブラウザ以外からの認証をdeviseで簡単に行う方法

gem deviseは複雑で理解するのはひと苦労ですよね。

ブラウザからの認証は簡単に実装出来ますが、他の認証(APIなど)もdeviseを使い回したい…という時簡単に認証出来るメソッドがどれか分かりませんでした。
(もちろん下記の方法でブラウザからの認証も行えます)

下記の様に出来るようです。

Userモデルに下記の設定をしている時。

```rb
class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end
```

下記の様に`valid_password?`メソッドで認証することができます :smiley: 

```rb
  !!User.find(user).try(:valid_password?, pass)
```
.gitignoreでホワイトリストを使う

普段.gitignoreでは拡張子などをブラックリストで追加して行きますが，拡張子のないファイルなどもありそれらをいちいち追加して行くのは面倒です．一方でプロジェクト内で管理したいファイルの拡張子はたかだか数種類の場合が多い．そこでホワイトリスト方式です．

```
## .gitignore ##
# ignore all
*
*/

# allow any
!*.py
!*.bash
```
ポイントは"*/"．"*"だけではすべてのディレクトリが無視されてしまい，いかなるファイルも追加できなくなってしまう．なので"ディレクトリは無視しない"という条件をつける必要があるわけです．
あとは個別に".pyを無視しない"などをつけていけばOK
Mac の Subversion クライアント svnX の使い方

![svnX.png](https://qiita-image-store.s3.amazonaws.com/0/25727/20d47f83-cc98-ad13-f879-f221fce6598b.png)
(スクショ、ぼんやり気味ですんません...)

最近の VCS はもっぱら git だが、現場では Subversion がまだまだ現役。
その一方、Mac で使いやすいクライアントが少ないということで、自分が昔から使っている svnX を取り上げてみる。

## svnX のいいとこ

* 無料

以上！
機能的にはまあまあなんだけど、使い勝手はいまひとつというか、ある操作に対して何が起こるのか予測しにくいというか、いろんな機能がそこかしこに隠れている感じ。
それを発見できたときは面白いんだけど、はじめて触る人からしたら面倒なだけなんで、ここで簡単にまとめておきます。

ちなみにお金に余裕のある方は [Versions](http://versionsapp.com) がいいそうな。

## 配布元

本家は [こっち](http://www.lachoseinteractive.net/en/community/subversion/svnx/) なんだけど、古いバイナリしか置いてないので [こちら](http://code.google.com/p/svnx/) からダウンロード。
現時点の最新版は 1.3.4 です。
こいつはガワだけなので、Subversion の本体も別途入れておくこと。

## 使い方

最初の起動では、もしかしたらウィンドウが何も出てこないかもしれません。
とりあえず Window メニューを展開しましょう。

* Repositories : 登録リポジトリ一覧パネルを表示。
* Working Copies : チェックアウトした作業コピー一覧パネルを表示。
* Activity : 実施した操作の履歴パネルを表示。

### チェックアウト(svn checkout)

* Repositories パネルを開く。
* リスト右下の [+] ボタンをクリックし、以下を入力。
    * Name: 管理用の名称。(自由)
    * Path: リポジトリの URL。
    * User: リポジトリへログインユーザ名。
    * Password: ログインパスワード。
* リストに追加された項目をダブルクリックするとウィンドウが表示され、リポジトリに接続する。
* ウィンドウ最下部のツリーを下り、チェックアウトしたいディレクトリを選択。
* ツールバーの Checkout をクリックし、チェックアウト先を選択して実行。
    * チェックアウト対象ディレクトリは作成されないので、必要であれば自分で作成してそこをチェックアウト先にすること。
* Working Copies パネルにチェックアウト先ディレクトリが追加される。

### 更新(svn update)

* Working Copies パネルを開く。
* リストから更新対象の作業コピーをダブルクリックするとウィンドウが表示される。
* ツールバーの Update をクリック。
* 詳細は Output をクリックすると表示されるドロワーに出力される。

### コミット(svn commit)

* Working Copies パネルを開く。
* リストからコミット対象の作業コピーをダブルクリックするとウィンドウが表示される。
* コミット対象ファイルを選択し、Commit ボタンをクリック。
* コミットメッセージを入力して実行。

## 応用

### リポジトリウィンドウの詳細

以下の 4 つのペインで構成される。

> コミット内容ペインは履歴ペイン上にある「歯車アイコン」をクリックすると表示できる。

* 履歴ペイン : コミットの履歴。
* コミットメッセージペイン : 履歴ペインで選択されている行(リビジョン)のメッセージを表示。
* コミット内容ペイン : 履歴ペインで選択されている行(リビジョン)で実施された操作と対象ファイルを表示。
* ツリーペイン : 履歴ペインでチェックされているリビジョンのファイルツリーを表示。

#### 特定ディレクトリまたはファイルの履歴を見るには

* ツリーペインで対象ディレクトリまたはファイルをダブルクリック。
* 履歴ペインに、対象の変更が行われたリビジョンだけが表示される。
* 元に戻りたい場合は履歴ペイン上部の URL(太字の部分)をクリック。

#### 変更の差分(diff)を見るには

* 次のいずれかを選択し、ツールバーの Diff を実行する。
    * 履歴ペインの行 : 選択行のリビジョンと、その前のリビジョンの差分。
    * コミット内容ペインの行 : 選択行のファイルについて、そのリビジョンと前のリビジョンの差分。
    * ツリーペインの項目 : 選択ディレクトリ以下またはファイルと、その前のリビジョンの差分。

#### タグやブランチを作成するには

* ツリーペインから対象ディレクトリを選択。
* ツールバーの Copy をクリックして実行。
* Target で生成対象ディレクトリ(tags または branches)を選択。
* Name にディレクトリ名を入力。
* Commit Message に入力して実行。

### 作業コピーウィンドウの詳細

作業コピーウィンドウには次の表示モードがある。
モードの切り替えはツールバーの View から行える。

* 階層表示 : 左ペインにディレクトリ階層、右ペインに選択中の階層下にあるファイルとディレクトリを表示。
* フラット表示 : 作業コピー下にある全てのファイルを表示。
* フラット表示(スマート) : 作業コピー下で追加・変更および管理外のファイル・ディレクトリのみを表示。

#### リポジトリとの差分(diff)を見るには

* 変更した対象ファイルを選択。
* ツールバーの Diff をクリックして実行。

#### リポジトリの内容に戻す(revert)するには

* 変更した対象ファイルを選択。
* Revert をクリックして実行。
    * Recursive オプションを ON にすれば、指定ディレクトリ以下をまとめて戻せる。

## FileMerge のエンコーディングエラー対応

Diff を行ったときのデフォルトアプリケーションである FileMerge に UTF-8 で書いたテキストを渡すと警告が表示される場合があるので、それを止める方法。

http://builder.japan.zdnet.com/os-admin/sp_snow-leopard-09/20404333/

拡張子にワイルドカードが使えないのでいちいち指定しないといけないのが面倒。
JMockit で期待しないメソッド呼び出しを検出する

[JMockit][] をなにも考えずに使うと、期待しないメソッド呼び出しがあってもうっかりテストが通ってしまうことがある。

例えば:

```java
@Test
public void doTest(@Mocked final URL mockUrl) throws Exception {

	new NonStrictExpectations() {
		{
			mockUrl.getProtocol();
			result = "http";
			mintimes = 0;
		}
	};

	//

	System.out.println(mockUrl.getProtocol()); // => http
	System.out.println(mockUrl.getFile()); // => null
	System.out.println(mockUrl.getPort()); // => 0

	// テストが成功してしまう
}
```

この `getFile()` や `getPort()` の様に、期待していないメソッド呼んでも気づかず、テストが終わってしまう。

こういった期待しない呼び出しを検出しテスト失敗してくれるようにするには、テストのメソッドの最後に [FullVerification][] を呼びましょう:

```java
@Test
public void doTest(@Mocked final URL mockUrl) throws Exception {

	new NonStrictExpectations() {
		{
			mockUrl.getProtocol();
			result = "http";
			times = 1;
		}
	};

	//

	System.out.println(mockUrl.getProtocol()); // => http
	System.out.println(mockUrl.getFile()); // => null
	System.out.println(mockUrl.getPort()); // => 0

	// ↓追加

	new FullVerifications() { };
	// => 例外が発生 mockit.internal.UnexpectedInvocation: Unexpected invocation of: java.net.URL#getFile() on mock instance: java.net.URL@21801b
}
```

この場合、`Expectations` (or `NoStrictExpectations`) で `times` を指定しないと、 `FullVerifications` で指定が必要になるので冗長になってしまうので注意。

しかし、結局、スタブ的な挙動をさせたい時は、`FullVerifications` に書かないといけない:

```java
@Test
public void doTest(@Mocked final URL mockUrl) throws Exception {

	new NonStrictExpectations() {
		{
			mockUrl.getProtocol();
			result = "http";
		}
	};

	//

	System.out.println(mockUrl.getProtocol()); // => http
	// #getProtocol() を何度呼んでも大丈夫

	//

	new FullVerifications() { // ↓ここに書く
		{
			mockUrl.getProtocol();
			minTimes = 0;
		}
	};
}
```

この幅のある呼び出し回数の定義 (`minTimes` とか `maxTimes`) も上の `Expectations` に書けたら楽なのなぁ。
この辺は [EasyMock][] の方がスマートに定義できている気がする。

[JMockit]: https://code.google.com/p/jmockit/
[FullVerification]: http://jmockit.googlecode.com/svn/trunk/www/tutorial/BehaviorBasedTesting.html#FullVerification
[EasyMock]: http://easymock.org/
ボイスメモを一括で軽量化

iPhoneのボイスメモでの録音を軽量化してMP3に変換します。
ffmpegを使います。

```bash
cd ~/Music/trpg/session_name/records/
mkdir rec
for fn in *.mp3;do ffmpeg -i "$fn" -ab 64k "rec/$fn";done
```

このようなコマンドで動きます。-ab 64k のところを128kなどとしてビットレートを変更できます。
TRPGオフラインセッションしたとき用。

※この投稿は、[音声データを一括で軽量化](http://qiita.com/yang_orz/items/023251a725d3b823f89a)を改変したものです
MacでSCSSを使うための手順（Sass+Compass）

MacでSCSSを使うには、以下の手順で準備します。

1. Sass+Compassのインストール
2. フォルダ/ファイルの準備
3. 自動コンパイルの起動

# 手順

## 1. Sass+Compassのインストール

### Sassのインストール

まず、Sassをインストールします。
`gem install 〜`でインストールして、`〜 -v`でインストールされたかどうか確認します。

    $ gem install sass
    $ sass -v

install時に管理権限が必要な場合は、以下のように`sudo`コマンドを用います。

    $ sudo gem install sass

### Compassのインストール

上記と同じ要領でCompassもインストールします。

    $ gem install compass
    $ compass -v

## 2. フォルダ/ファイルの準備

### フォルダ構成の準備

あとは、SCSSを使うために各種ファイルを準備するだけです。
以下のような構造を準備します。

    css /
    scss /
      main.css.scss
    config.rb

例えば、`scss`ディレクトリに`main.css.scss`という名前でSCSSファイルを作ると、`css`フォルダに`main.css`というCSSファイルが自動で生成されるようになります。

### config.rbの設定

`config.rb`には、以下のように記述してください。

    http_path = "/"                   
    css_dir = "css"
    sass_dir = "scss"

## 3. 自動コンパイルの起動

上記だけでは、まだなにも起こりません。
SCSSファイルをCSSファイルに自動でコンパイルするには、`config.rb`があるディレクトリで以下のコマンドを実行してください。

    $ compass w

ちなみに、SCSSフォルダの中が空っぽだと、以下のように出力されます。
この場合は、SCSSファイルを作成してもう一度実行してみてください。

    Nothing to compile. If you're trying to start a new project, you have left off the directory argument.
    Run "compass -h" to get help.

# おわりに

以上でSCSSを使う準備が完了しました。
例えば、`main.css.scss`に以下のように書いてみてください。

    a {
        &:hover {
            text-decoration: none;
        }
    }

これを保存すると、以下の内容を持った`main.css`が自動で作成されます。

    /* line 2, ../scss/main.css.scss */
    a:hover {
      text-decoration: none;
    }

## 追伸：

フォルダ/ファイルは、以下のコマンドで自動で生成してくれます。
……が、上記では必要最小限の構成で説明するために手動で作成しました。
必要に応じて使い分ければよいと思います。

    $ compass create

## 追伸2：

やっぱりrails便利(*´∀｀)

## 参考ページ

- [Macのターミナルから Sass + Compass をインストールして使うまでの簡単な手順メモ | memobits](http://m.designbits.jp/13032511/)
laravel4： SQLに常に固定条件を入れる

公開サイトで 各テーブルのデータ公開条件を is_visible とかで制御してる場合があります。

```sql
select * from article where is_visible = 1
```

Laravelだと 以下。

```php
$articles = Article::where('is_visible','=',1)->get();
```

結構条件入れ忘れて出しちゃったりするよねー。

たとえば 記事1レコードほしいとき 以下で取得したいけどー
$article = Article::find(1);

公開ステータスみないといけないので
```
$article = Article::where('is_visible','=',1)
                          ->where('id','=',$id)
                          ->first();
```
とかしないといけない

面倒ですよねー。ついでに公開日とかチェックしないといけない時もある。

ってことで newQueryをフックすればできます。
各テーブルごとに条件やcolumn名が違う場合があるので 条件は whereRaw で指定できるようにしてます。

``` ベースのクラス(model/DbHook.php)
abstract class DbBase extends Eloquent {
    protected static $onlyPubliced = false;    // 公開条件を有効にしてクエリを発行するか
    protected static $condPubliced = null;     

    public function newQuery($excludeDeleted = true)
    {
        $query = parent::newQuery($excludeDeleted);
        if( static::$onlyPubliced ){
            if ( static::$condPubliced ){
                $cond  = static::$condPubliced;
                $query = $query->whereRaw($cond[0], $cond[1]);
                return $query;
            }
            return $query;
        }
        return $query;
    }

    public static function allowAll()
    {
        static::$onlyPubliced = false;
        return new static;
    }
    public static function denyAll()
    {
        static::$onlyPubliced = true;
        return new static;
    }
｝
```

```model/Article.php
class Article extends DbHook{
    protected $table = 'article';
    protected $primaryKey = 'id';

    protected static $onlyPubliced = true;
    protected static $condPubliced = array('article.is_visible=? and start_at<=now() ', array(1));
}
```
こうすると $condPubliced に書いた条件が必ずSQLで実行され Article::find(1); とかしても SQLは select * from article where id=1 and article.is_visible=1 and start_at<=now() が実行されます。

公開条件をいろいろかかなくても モデルに書いとけばいいでーす。

全データを対象にしたい時は Article::allowAll(); と呼んでから 普通に Article::all() とかすればいいでーす。
戻したいときは Article::denyAll();すれば 固定クエリがまた読み込まれるようになります！
ar8月号の煽り文「髪がイケてると絶対的に可愛く見えちゃう伝説」はlegendを誤訳した結果なのではないか


なんだよ伝説って。アホか。

box plotにカウントを載せる [参考](http://stackoverflow.com/questions/9815226/annotate-values-above-bars-ggplot-faceted)

```r:R
give.n <- function(x){
  return(c(y = mean(x) + 10, label = length(x)))
}
ggplot(df, aes(qtr, value)) + geom_boxplot(colour = "gold", outlier.colour = "gray", outlier.size = 1) + stat_summary(fun.y = mean, geom = "line", aes(group = 1)) + stat_summary(fun.data = give.n, geom = "text", size = 2)
```

色々載せる

```r:R
give.l <- function(x){
  return(c(y = mean(x)*1.01 + 10, label = mean(x)))
}
ggplot(subset(sample, sample$lib_strategy == "RNA-Seq"), aes(qtr, log(total_sequences))) + geom_boxplot(colour = "lightskyblue", outlier.colour = "gray", outlier.size = 1) + stat_summary(fun.y = mean, geom = "line", aes(group = 1)) + stat_summary(fun.data = give.n, geom = "text", size = 2) + stat_summary(fun.data = give.l, geom = "text", size = 2)
```

外れ値がでかすぎてY軸が死ぬの我慢ならん [参考](http://stackoverflow.com/questions/5677885/ignore-outliers-in-ggplot2-boxplot)
コードを抜粋

```r:R
# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)
```

最終的にこんな感じになっとる

```r:R
ylim1 = log10(boxplot.stats(rnaseq_sample$total_sequences)$stats[c(1,5)])
ggplot(rnaseq_sample, aes(qtr, log10(total_sequences))) + geom_boxplot(colour="lightskyblue", outlier.size = 2, outlier.colour = "gray") + coord_cartesian(ylim = ylim1+2) + stat_summary(fun.y = median, geom = "line", aes(group = 1)) + stat_summary(fun.data = give.n, geom = "text", size = 2) + stat_summary(fun.data = give.l, geom = "text", size = 2)
```

outliersをそもそも書かないという手段もある

```r:R
ggplot(data, aes(qtr, values)) + geom_boxplot(outlier.shape = NA)
```

後できれいにします

```r:R
ggplot(sample, aes(log10(total_sequences), log10(max_length))) + geom_point(alpha = 1/10)
```

scatter plotとか
AKBメンバーのGoogle+ IDを一気に取得する

SNSからデータを取得して、分析する練習をする時、AKBグループメンバーのGoogle+投稿を使用すると非常に楽しいです。それなりの分量もありますし。

メンバーのGoogle+ IDを、下記のサイトから一気に出力します。
http://www.google.com/intl/ja/+/project48/

BeautifulSoupというモジュールを使用します。下記がそのサイトです。
http://www.crummy.com/software/BeautifulSoup/
pip installでインストールできます。

Pythonで下記のようなスクリプトを書きました。
この例では結果をprintしていますが、リストとして別の処理に渡して、順次Activityを取得する、というような使い方ができると思います。

```gidprint.py

#!bin/python
#coding: utf-8

from BeautifulSoup import BeautifulSoup
import urllib

def gidlist_make():
    soup = BeautifulSoup(urllib.urlopen("http://www.google.com/intl/ja/+/project48/").read())
    lisoup=[]
    gidlist = []
    for lisoup in soup.findAll("li"):

        try:
            gidlist.append(lisoup['data-gplusid'])
        except:
            continue

    return gidlist

if __name__=='__main__':
    gidlist= gidlist_make()
    for gid in gidlist:


```
プロジェクトルートからの絶対参照で自分のファイルをインクルードする

別フォルダにあるヘッダーを持ってくるときにこう書いていませんか？

```cpp:
#include "../../any/more/foo.h"
```

これをインクルードフォルダに追加するだけでこう書けるようになります。

```cpp:
#include <any/more/foo.h>
```

設定方法は
プロパティを開き
VCディレクトリの設定
インクルードディレクトリ
に

```
$(SolutionPath)$(TargetName)
```
を追加するだけです。

ぜひお試しください。

これで入力が保管されるようになるのでとても便利です。
もしくは

```
./
```
でも大丈夫だと思います。
Rubyでクラスがどこで定義されているか調べる

Method#source_location はあるが、Class#source_location はない。そもそもクラス定義が複数のファイルにわたっていることも多いので、あったとしてもたいして意味はない。

それでは、あるクラスの（インスタンス）メソッドがどこで定義されているか調べたらどうか？

```rb
Rails.class.instance_methods(false).map { |s| Rails.method(s).source_location }.compact.map { |x| x[0] }.sort.uniq.map { |x| x.sub(/\A.*2.0.0./, '') }
```

```rb
=> ["pp.rb",
 "psych/core_ext.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/aliasing.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/anonymous.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/attr_internal.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/attribute_accessors.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/delegation.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/deprecation.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/introspection.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/method_names.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/qualified_const.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/reachable.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/remove_method.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/module/synchronization.rb",
 "gems/activesupport-3.2.11/lib/active_support/core_ext/object/duplicable.rb",
 "gems/activesupport-3.2.11/lib/active_support/dependencies.rb",
 "gems/activesupport-3.2.11/lib/active_support/deprecation/method_wrappers.rb",
 "gems/debugger-1.6.0/lib/ruby-debug-base.rb",
 "gems/liquid-2.5.0/lib/liquid/module_ex.rb",
 "gems/rake-0.9.2.2/lib/rake/ext/core.rb",
# (snip)
```

なんだかワサワサ出てきた。

参考文献: [Rubyのメソッドを数えましょう♫](http://melborne.github.io/2013/08/27/count-methods-of-ruby/)
Flycheck でインポートパスを追加する(D言語版)．

みなさん Flycheck 使ってますか?
Flycheck を使うと自動的に構文チェックをしてくれるので大変便利な上，モジュールのインポートパス等も標準的なディレクトリ構成の場合にはそれっぽく扱ってくれます．

が，モジュールとディレクトリ構成が異なっている場合にはインポートパスをうまく扱えません．

例えば，

```
hoge.d: hoge モジュール
fuga.d: tm_tn.fuga モジュール
```
のようなパッケージ構成かつ，

```
hoge.d
src/tm_tn/fuga.d
```
のようなディレクトリ構成になっている場合，

fuga.d に以下のように module 宣言があれば，Flycheck はそれをうまく考慮してくれます．

```d:fuga.d
module tm_tn.fuga;
```

一方，hoge.d 内に以下のように書いても，Flycheck は標準では src をインポートパスとして考慮してくれません．

```d:hoge.d
import tm_tn.fuga;
```

これでは困る場合があるので，なんとかしてみました．
以下を emacs.el に追加してください．

```el:emacs.el
(require 'flycheck)

(flycheck-def-option-var flycheck-d-custom-import-paths nil d-dmd
  "A list of additional import paths."
  :type '(repeat :tag "Additional paths"
          (string :tag "import path"))
  :safe #'flycheck-string-list-p
  :package-version '(flycheck . "0.14"))

(put 'd-dmd :flycheck-command
     (append (flycheck-checker-command 'd-dmd)
             '((option-list "-I" flycheck-d-custom-import-paths s-prepend))))
```

あとは hoge.d の先頭か末尾に以下を書いておけばいい感じにインポートパスを見てくれます．

```d:hoge.d
// Local variables:
// flycheck-d-custom-import-paths: ("src")
// End:
```
cygwinにfish-shellいれてみる[未解決]

なんか熱そうなので手を出してみた、ってだけです。
設定なんかはとりあえず置いといて、とにかくインストールしてみます。

環境：
Windows8 64bit

参考URL：http://superuser.com/questions/328340/how-to-use-fish-shell-in-cygwin

# 必要なライブラリを持ってくる
どうやって持ってくるのかはお好みで。apt-cygなりsetup.exeなり。

* libncurses-devel
* libiconv
* libiconv-devel
* autoconf
* gcc
* util-linux

# fish-shell持ってくる
stableな2.0.0ではiconvとかsys/sysctl.hとかでごちゃごちゃエラー出たので、仕方なく最新をcloneしてくることにします。
iconvは特に追跡してないですけど、sys/sysctl.hはPR上がってて、mergeもされてます。しかし、結果から鑑みるに2.0.0には含まれてないみたいです。

```
$ git clone https://github.com/fish-shell/fish-shell.git
```

# あとは普通に

```
$ autoconf && ./configure
$ make && make install
```

# 動かしてみる

```
$ fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
agen@laptop /u/l/s/fish-shell>
```

おお、動いた！

# んですけど...
fishもzshに負けず劣らず補完機能が凄くて（と聞いてて）、さっそくそれを体感しようと適当にいくつかコマンド入力してみました。

```
$ ls -[TAB]
--all                                                    (Show hidden)
--almost-all                             (Show hidden except . and ..)
...
-x                                             (List entries by lines)
-Z              (Display security context so it fits on most displays)
```

すばら！　じゃあ次は

```
agen@laptop ~> ge[TAB]fish: Unknown command 'x86'
in command substitution
        called on standard input,

fish: Unknown command 'x86'
in command substitution
        called on standard input,

fish: Unknown command 'R'
in command substitution
        called on standard input,

fish: Unknown command 'R'
in command substitution
        called on standard input,

fish: Unknown command 'x86'
in command substitution
        called on standard input,

fish: Unknown command 'R'
in command substitution
        called on standard input,

fish: Unknown command 'x86'
in command substitution
        called on standard input,

fish: Unknown command 'R'
in command substitution
        called on standard input,

fish: Unknown command 'x86'
in command substitution
        called on standard input,

fish: Unknown command 'x86'
in command substitution
        called on standard input,

fish: Unknown command 'x86'
in command substitution
        called on standard input,

agen@laptop ~> ge
gem                  (File, 582B)  gemlock.bat   (Executable, 63B)
gem.bat           (Unknown, 157B)  gemri         (Executable, 91B)
gem_mirror     (Executable, 104B)  gemri.bat     (Executable, 55B)
gem_mirror.bat  (Executable, 68B)  gemwhich     (Executable, 101B)
gem_server     (Executable, 104B)  gemwhich.bat  (Executable, 65B)
gem_server.bat  (Executable, 68B)  getconf.exe  (Executable, 23kB)
gemhelp.bat     (Executable, 35B)  getfacl.exe  (Executable, 11kB)
gemlock         (Executable, 99B)  getopt.exe   (Executable, 12kB)
```

！？

概ね正常に動いてるっぽいんですけど、[TAB]押してコマンドの補完をかけようとすると上記のエラーが出ます。

推測ですけど、PATHに `/cygdrive/c/Program Files (x86)/...` みたいなのが混ざってるからかなー、とかとか。

<追記>
issueを確認すると、カッコが含まれてるのがまずい？　ようです。
refs: https://github.com/fish-shell/fish-shell/issues/952
Unityで、ソースやリソースを共有する

Unityでチーム開発する場合、[Team Licence](http://unity3d.com/unity/collaboration/)を取得すればいいのだろうが、


![スクリーンショット 0025-09-02 12.32.08.png](https://qiita-image-store.s3.amazonaws.com/0/20722/fa573274-9676-fd72-c347-c758c9a7d2b4.png "スクリーンショット 0025-09-02 12.32.08.png")

そこまででもない場合、
たとえば、
　・予算をとおすために、その前にプロトタイプを作りたい
　・友達同士で儲けを考えずにUnityを触ってみたい
などの場合、どうすればソース＆リソースを共有できるのだろうか。

## そのままファイルを渡してみる

Assets,Library,ProjectSettingsの各フォルダの中身をZipででも固めて、そのまま受け渡した場合、うまくテクスチャが表示されないでピンク一色で表示されてしまうことがある。これは回避したい。

![スクリーンショット 0025-09-02 12.36.04.png](https://qiita-image-store.s3.amazonaws.com/0/20722/696fa68b-dcb8-3a38-e7af-8997b873a6ca.png "スクリーンショット 0025-09-02 12.36.04.png")


## オプションの設定で、Meta Filesを出力するようにする

[http://masa795.hatenablog.jp/entry/2013/04/01/102007](http://masa795.hatenablog.jp/entry/2013/04/01/102007)の記事をみると、
metaファイルがあれば、ピンクの物体だらけにならないで済みそうだ。

設定の手順は、Edit→Project Settings→Editorを選択。

![スクリーンショット 0025-09-02 12.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/20722/6d6d617e-762c-ecaf-3e49-c252e692d8f8.png "スクリーンショット 0025-09-02 12.27.24.png")


インスペクタウィンドウが表示されるので、そこで、Version ControlのModeをMeta Filesにすればいい。

![スクリーンショット 0025-09-02 12.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/20722/0afef76a-2307-a7c5-a1cb-9f09d02ec89d.png "スクリーンショット 0025-09-02 12.27.40.png")

あとは、Assetsフォルダ、Libraryフォルダ、ProjectSettingsフォルダを相手方に渡せばうまくいくと思われる（まだ試してはいない）。
Qiitaのtextarea自動補完がOSSになりました

[jQuery.textcomplete](https://github.com/yuku-t/jquery-textcomplete)（[デモ](http://yuku-t.com/jquery-textcomplete)）

![demo](https://github.com/yuku-t/jquery-textcomplete/raw/gh-pages//media/images/demo.gif)

[GitHubのようなtextareaの補完機能を実装する - カーソル位置の取得](http://qiita.com/yuku_t/items/fb92e173120d7b2e49ed) を書いたのも今は昔、いつか続きを書こう書こうと思いながら気がつけば5ヶ月が過ぎました :bow:

なんか続きを書くのが面倒くさくなったのと、某日本最大レシピ共有サイトの技術部長の人から「OSSにして欲しい」という要請を人伝に受け取ったこともあって、OSS化した次第です。

# ライセンス

MITライセンス

# 簡単な使い方

簡単に説明します。詳しくは [README](https://github.com/yuku-t/jquery-textcomplete/blob/gh-pages/README.md) を読んでください。

まず jQuery.textcomplete は名前からも分かるように jQuery プラグインになっているので、別途 jQuery が必要です。

```html
<script src="path/to/jquery.js"></script>
<script src="path/to/jquery.textcomplete.js"></script>
```

TEXTAREA 要素の jQuery オブジェクトに対して `textcomplete` メソッドを実行します。

```js
$('textarea').textcomplete({
    // mentionは単なる名前で意味はありません。
    // 分かりやすい名前をつけてください。
    mention: {
        // 必須設定
        match: /(^|\s)@(\w*)$/,
        search: function (term, callback) {
            // callback には文字列の配列を渡す
            $.getJSON('/search', { q: term })
                .done(function (resp) { callback(resp); })
                .fail(function ()     { callback([]);   });
        },
        replace: function (value) {
            return '$1@' + value + ' ';
        },

        // 任意設定（下記はいずれもデフォルト値）
        index: 2,
        maxCount: 10,
        template: function (value) {
            return value;
        }
    },
    // 複数設定することもできます
    emoji: { … }
});
```

`match` は各 Keyup イベントで TEXTAREA の先頭からカーソル位置までの文字列に対して適応される正規表現を指定します。この正規表現がマッチした場合、 `index` 番目のグループが `search` の第一引数 `term` として渡されます。
`search` では与えられた `term` に対応する文字列の配列を作って `callback` を実行します。この例では `jQuery.getJSON` を使ってリモートからデータを取ってきています。今回の例のように `search` の中に非同期処理が入っていたとしても、 `search` は同時に1回しか実行されないことが保証されます。また配列に100個の要素が入っていたとしても先頭から `maxCount` 個だけが表示されます。
`callback` が実行されると与えられた配列の個々の要素に対して `template` が実行されます。この関数の返り値が補完の各要素になります。上の方に貼り付けられた gif の場合、補完メニューに画像が埋め込まれていますが、これを実現するには例えば下記のようにします。

```js
template: function (value) {
    return '<img src="path/to/' + value + '.png"/>' + value;
}
```

最後に補完が確定したときに `replace` に選択された値が与えられて実行されます。この関数の返り値は次のように利用されるので、サンプルを参考に、条件を満たすように指定してください。String.replaceの詳しい仕様については [String.replace - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace) を参照してください。

```js
textarea.value = textarea.value.replace(matchRegExp, replaceFunc(value));
```

# デザイン

出力される補完メニューはBootstrapのDropdownと同じHTML構造をしています。なので、Bootstrapを使っている環境では特に何もしなくてもいい感じにスタイルが勝手に適応されます。

Bootstrapを使っていない場合は、BootstrapのDropdownを参考によしなにスタイルを書いてください。リポジトリに jquery.textcomplete.css というファイルがあるので、それを土台に使うといいかも知れません。

# 今後実装される予定の機能

- あいまい検索機能

    各利用者が `search` 関数を実装しなければいけませんが、その中で使えるあいまい検索用の組み込み関数を用意しようと思っています。

    ```js
    search: function (term, callback) {
        var data = this.fuzzySearch(term, /* データ配列 */);
        callback(data);
    }
    ````

    こんな感じで書くと勝手にいい具合に検索してくれる、みたいなイメージです。
ALMiniumをインストール、アンインストール

Ubuntu13.04 64bit版で確認。13.10ではパッケージのインストールに失敗しました。

インストール
==========

```bash:gemのバージョンを1.8.25に更新
$ sudo apt-get install -y wget git ruby build-essential imagemagick
$ wget -q http://rubyforge.org/frs/download.php/76729/rubygems-1.8.25.tgz
$ tar xzf rubygems-1.8.25.tgz
$ cd rubygems-1.8.25 && sudo ruby setup.rb && cd
```

```bash:alminiumのインストール
$ git clone https://github.com/alminium/alminium.git
$ cd alminium && sudo ./smelt
```

アンインストール
==============

```bash:
$ sudo sh ./uninstall
```

[issue報告](https://github.com/alminium/alminium/issues/104)
ComboBoxにEnumを列挙する。

enumに日本語も使えるので、そのままコンボボックスに表示して選択したいと考えまして、こんな結果になりました。

始めにenumを作成します。

```csharp:サンプル列挙体
public enum eSample{
	リンゴ,
	ゴリラ,
	ラッパ,
}
```

次にXAMLを次のように書きました。

```xml:XAML
<ComboBox Name="cbSample" DisplayMemberPath="Name"/>
```

enumそのものとenumの文字列を格納してクラスを作ります。

```csharp:enum格納用クラス
class cbItems<Type>
{
	public Type Code;
	public string Name{get;set;}
}
```

enumそのものとenumの文字列を全て呼び出す関数を作成します。

```csharp:列挙関数
private IEnumerable<cbItems<Types>> MakeComboItem<Types>()
{
	foreach( Types dow in Enum.GetValues( typeof( Types ) ) ) {
		yield return new cbItems<Types>
		{
			Code = dow,
			Name = dow.ToString(),
		};
	}
}
```

コンボボックスのItemSourceに関数で作成した 項目群を入れて、コンボボックスに表示します。

```csharp:コンボボックスに表示
cbSample.ItemsSource = MakeComboItem<eSample>();
```

コンボボックスで選択された、enumを取得してみます。

```csharp:選択されたenumを取得
eSample Data = (cbSample.SelectedItem as cbItems<eSample>).Code;
```

以上です。
lightline.vimとvim-anzuで検索ヒット数を表示する

この内容は以下の記事を元にしたlightline.vim版になります。

* [VAC2012とvim-anzuとvim-airline](http://lsifrontend.hatenablog.com/entry/2013/08/20/225913)

先日、以下の投稿でlightline.vimを導入した後に、上の記事を知って同じ事をやりたくなったのでカスタマイズしてみました。

* [vimのstatusline装飾プラグインのlightline.vimを導入してみた](http://qiita.com/shiena/items/a75d252e3814ad6ff7de)

## カスタマイズ後の見た目

画像は NeoBundle を検索して47件中、2件目に移動した結果をファイル名の右側に表示したものです。

![MacVim_anzu.png](https://qiita-image-store.s3.amazonaws.com/0/8995/44ff1f87-bf41-a7e3-8b32-4e2e9dc8d793.png)

# カスタマイズ内容

```vim:.vimrc
" lightline.vim関連 {{{
let g:lightline = {
    \ 'colorscheme': 'landscape',
    \ 'active': {
    \   'left': [
    \       ['mode', 'paste'],
    \       ['readonly', 'filename', 'modified', 'anzu']
    \   ]
    \ },
    \ 'component_function': {
    \   'anzu': 'anzu#search_status'
    \ }
    \ }
"}}}

" vim-anzu関連 {{{
nmap n <Plug>(anzu-n)
nmap N <Plug>(anzu-N)
nmap * <Plug>(anzu-star)
nmap # <Plug>(anzu-sharp)
augroup vim-anzu
" 一定時間キー入力がないとき、ウインドウを移動したとき、タブを移動したときに
" 検索ヒット数の表示を消去する
    autocmd!
    autocmd CursorHold,CursorHoldI,WinLeave,TabLeave * call anzu#clear_search_status()
augroup END
"}}}
```

## lightline.vimの設定

1. `anzu#search_status()`が検索ヒット数を出力するので、`component_function`にキー`anzu`で登録します。
1. 表示位置はキャプチャ画像の青い部分のファイル名の右側にしたいので、先程登録した`anzu`を`g:lightline.active.leftの2つ目のリストの最後に追加します。

また、`anzu`の位置を変えれば表示位置も変わります。
たとえば左端の白い場所に表示したいなら、1つ目のリストに追加します。

## vim-anzuの設定

`n`, `N`, `*`, `#`のキーマップは[vim-anzuのExample](https://github.com/osyo-manga/vim-anzu#example)と一緒ですが、消去は以下のタイミングで自動実行しています。

* 一定時間キー入力がないとき (CursorHold,CursorHoldI)
* ウインドウを移動したとき (WinLeave)
* タブを移動したとき (TabLeave)
Goの日付フォーマットでミリ秒の末尾0を省略しない書式

[time - The Go Programming Language](http://golang.org/pkg/time/#pkg-constants)
に日付フォーマットがいくつか定義してあります。

```
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
```

はナノ秒まで出るので、これを参考に"2006-01-02T15:04:05.999Z07:00"とすればミリ秒になったのですが、末尾のゼロは取り除かれます。つまり0.120秒の場合は.12になります。

書式フォーマットで9の代わりに0を指定して"2006-01-02T15:04:05.000Z07:00"とすれば、.120になります。ログの書式ではこちらのほうが私は好みです。


```go
package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Date(2013, 9, 2, 1, 55, 20, 120e6, time.Local)
	fmt.Println(t.Format("2006-01-02T15:04:05.999Z07:00"))
	fmt.Println(t.Format("2006-01-02T15:04:05.000Z07:00"))
}
```

```
2013-09-02T01:55:20.12Z
2013-09-02T01:55:20.120Z
```

と出力されます。

http://play.golang.org/p/Dvhhb7GLgR
で試せます。
Goでコマンドを実行して終了コードを取得する方法

## 2019-03-17追記 Go 1.12からはpkg/os/ProcessState.ExitCode()で取得可能です
[pkg/os/ProcessState.ExitCode()](https://golang.org/pkg/os/#ProcessState.ExitCode)を使って以下のように書けます。

```go
    cmd := exec.Command("uname", "-a")
    cmd.Run()
    exitCode := cmd.ProcessState.ExitCode()
```

## 元記事

実行するコマンドは[Command()](http://golang.org/pkg/os/exec/#Command)で作ってRun()するかStart()してWait()します。終了コードが0以外の場合は[ExitError](http://golang.org/pkg/os/exec/#ExitError)が帰ります。このos.ProcessStateから[Sys()](http://golang.org/pkg/os/#ProcessState.Sys)を取り出して[syscall.WaitStatus()](http://golang.org/pkg/syscall/#WaitStatus)にキャストして
[ExitStatus()](http://golang.org/pkg/syscall/#WaitStatus.ExitStatus)でコードが取れます。

https://groups.google.com/d/msg/golang-nuts/8XIlxWgpdJw/Z8s2N-SoWHsJ を参考にしました。ただ、APIが変わったのか、syscall.WaitStatusからコードを取り出すのはExitCodeではなく[ExitStatus()](http://golang.org/pkg/syscall/#WaitStatus.ExitStatus)でした。


```go
	cmd := exec.Command("uname", "-a")
	err := cmd.Run()
	var exitStatus int
	if err != nil {
		if e2, ok := err.(*exec.ExitError); ok {
			if s, ok := e2.Sys().(syscall.WaitStatus); ok {
				exitStatus = s.ExitStatus()
			} else {
				panic(errors.New("Unimplemented for system where exec.ExitError.Sys() is not syscall.WaitStatus."))
			}
		}
	} else {
		exitStatus = 0
	}
```

[os.ProcessStateのSys()](http://golang.org/pkg/os/#ProcessState.Sys)に"Convert it to the appropriate underlying type, such as syscall.WaitStatus on Unix, to access its contents."と書いてありますので、OSによっては違う型になっている可能性もあります。

ソースを確認したところ、Windowsでもsyscall.WaitStatusでした。

http://golang.org/src/pkg/os/exec_windows.go#L42
```go:src/pkg/os/exec_windows.go:42
    return &ProcessState{p.Pid, syscall.WaitStatus{ExitCode: ec}, &u}, nil
```