OmniAICreator/Qiita-1.07M huggingface dataset:
ユーザのログインシェルを調べる

Linuxなど
---------

ふつうのUNIX系システムでは `/etc/passwd` に格納されてるので、これを調べてやればいいです。

```shell-session:
% grep $USER /etc/passwd
megurine:x:1000:1000:Megurine Luka,,,:/home/megurine:/usr/bin/zsh
% grep $USER /etc/passwd | cut -d: -f7
/usr/bin/zsh
````

*(AWKならパイプで繋がずに書けるかもしれない)*

Mac OS X (v10.5〜)
------------------

が、Mac OS Xは「ふつうの」UNIXではないので、この方法では一般ユーザのログインシェルは *取得できません* X-D

じゃあどうすればいいか。

OS Xではユーザ情報はOpen Directoryに格納されてるので、これを参照しにいきます。

```shell-session:
% dscl localhost -read Local/Default/Users/$USER UserShell
UserShell: /usr/local/bin/zsh
% dscl localhost -read Local/Default/Users/$USER UserShell | cut -d' ' -f2
/usr/local/bin/zsh
```

ほむ、いい感じですね。やりましたよ。

参考資料
--------

* [【コラム】OS X ハッキング! (251) Leopard解体新書(2) ～さようならNetInfo～ | パソコン | マイナビニュース](http://news.mynavi.jp/column/osx/251/index.html)
* [One Liners - The Smalley Creative Wiki](http://wiki.smalleycreative.com/One_Liners)
[どう書く]受け取った値のみからAND条件でWHERE句を生成したい場合

http://qiita.com/items/c64ce7477169a710f755

この青い夏空の下にはarray_intersect_keyとかaddcslashesとかあるのですよ。。

```php:
<?php
use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Where;

require_once 'vendor/autoload.php';

$adapter = new Adapter([
    'driver' => 'Mysqli',
    'database' => 'foo',
    'username' => 'USERNAME',
    'password' => 'PASSWORD',
]);

$sql = new Sql($adapter);

// 不特定のキーをもつ配列から特定のキーだけ対象に抽出
$whereSet = array_intersect_key(
    array_filter($_REQUEST), // たいていは、どこかのメソッドでの$parametersとかでは
    array_fill_keys(['name', 'gender', 'address'], true)
);


equal: // どこのご家庭にもある配列渡しでのバインド

$select = $sql->select('myTable')->where($whereSet);

equal_or_like: //特定の項目だけLIKE検索

$select = $sql->select('myTable')->where(function(Where $where) use ($whereSet) {
    foreach ($whereSet as $column => $value) {
        if ($column === 'address') {
            $where->like($column, '%'.addcslashes($value, '%_\\').'%');
        } else {
            $where->equalTo($column, $value);
        }
    }
    return $where;
});

$statement = $sql->prepareStatementForSqlObject($select);
$results = $statement->execute();

```

ついスーパーグローバル変数を見てカッとなりました。反省はしません。
AngularJSで共通メニューを作る

AngularJSで共通メニューを表示するための機能を作ってみました。
機能としては、リンクをクリックした時に、classを変更してカレントページをハイライトしています。

AngularJSのdirectiveを使って、作っています。

```javascript:main.js
app.directive('activetab', ['$location', function(location) {

    return {
        restrict: 'C',
        link: function($scope, $element, $attrs) {
            var elementPath = $attrs.href.substring(1);
            $scope.$location = location;
            $scope.$watch('$location.path()', function(locationPath) {
                var locationDirArray = locationPath.split('/');
                if (elementPath === '/' + locationDirArray[1] + '/') {
                    $element.parent().addClass('active');
                } else {
                    $element.parent().removeClass('active');
                }
            });
        }
    };
}]);
```

こちらの [Stackoverflow](http://stackoverflow.com/questions/12669674/how-to-update-angularjs-directive-when-url-is-changed "Stackoverflow")を参考にさせてもらいました。
少し改造したのは以下の2点です。

+ イベントが発生したelementではなく、その親のelementにclassを追加している
+ locationの第一階層のみ見るようにしている。

これは、僕の作っているサンプルが以下のようなURL構造で作っていたからです。

+ 一覧ページ /guestbook/
+ 登録ページ /guestbook/entry

一覧ページ、登録ページ共に同じメニューがハイライトされて欲しかったので、URLの第一階層のみ見るようにしています。
親のelementにclassを追加しているのは、cssの都合で、a tagの親のli tagにclassを追加する必要があったからです。

上記のdirectiveを設定しているhtmlのサンプルです。
a tagのclassにdirectiveを設定しています。
これで、URLが変更された時に、a tabのhrefとURLの第一階層が一致していれば、a tagの親のli tagのclassにactiveが追加されます。

```html:index.html
<ul class="nav">
    <li><a href="#/guestbook/" class="activetab">GuestBook</a></li>
</ul>
```

上記のサンプルは[Github](https://github.com/sinmetal/angularjs-sample "Github")に置いてます。

[改訂版](http://qiita.com/sinmetal/items/096474ba9c9c1ed705eb, "改訂版")の記事を書きました。
AWS の S3 のファイルを別の bucket にコピーする方法

s3のバケットの名前を変更することは出来ないので、URLをファイルアップロード後に変更する必要が出てきた場合はコピーする必要がある。しかし、S3本体ではbucketのコピーはサポートしていない。

以下のスクリプトを作ってみた。copy自体はS3側で直接送信する形になるのである程度高速ではある。

````ruby
require 'right_aws'

aws_access_key_id, aws_secret_access_key = "key_id", "access_key"
old_bucket_name = 'from-bucket'
new_bucket_name = "to-bucket"

s3 = RightAws::S3.new(aws_access_key_id, aws_secret_access_key)
bucket = s3.bucket(old_bucket_name)

puts "Copy S3 files from '#{old_bucket_name}' to '#{new_bucket_name}'"

total_count = bucket.keys.count
puts "total_count: #{total_count}"

print "Are you sure? (y/N) > "
if gets.strip == 'y'
  puts "Start to copy at #{Time.now}"
  bucket.keys.each_with_index do |key, i|
    print "\r#{i}"
    s3.interface.copy(old_bucket_name, key.name, new_bucket_name, key.name)
  end
end
````

アカウントを超えて転送する場合、権限が正しくつかない場合があるのでその対応を行ったパターン

````ruby
require "rubygems"
require 'right_aws'
require "parallel"
 
aws_access_key_id, aws_secret_access_key = "xxx", "xxx"
new_bucket_email_address = "xxx@xxxx.com"
 
old_bucket_name = 'old'
new_bucket_name = "new"
 
s3 = RightAws::S3.new(aws_access_key_id, aws_secret_access_key)
bucket = RightAws::S3::Bucket.new(s3, old_bucket_name)
 
puts "Copy S3 files from '#{old_bucket_name}' to '#{new_bucket_name}'"
 
total_count = bucket.keys.count
puts "total_count: #{total_count}"
 
print "Are you sure? (y/N) > "
if gets.strip == 'y'
  Parallel.each_with_index(bucket.keys, in_processes: 10) do |key, i|
    print "\r#{i}: #{key}"
    s3.interface.copy(old_bucket_name, key.name, new_bucket_name, key.name, :replace, {'x-amz-grant-full-control' => %!emailAddress="#{new_bucket_email_address}"!, 'x-amz-grant-read' => 'uri=http://acs.amazonaws.com/groups/global/AllUsers'})
  end
end
````
Vagrant で入れた CentOS6.x 環境に X Window System + VNCサーバ 環境を構築する


# パッケージのインストール（ゲストOS）

ゲストOS下で以下のコマンドを叩いて必要なパッケージをインストール

```
$ sudo yum groupinstall "Desktop" "Desktop Platform" "X Window System" "Fonts"
$ sudo yum install vnc-server
```

# ポートフォワーディングの設定追加（ホストOS）

インストールが完了したら、ゲストOSからホストOSへのポートフォワーディングの設定を行う。
該当環境の Vagrantfile を開いて、以下のような設定を追加する。

```
  config.vm.network :forwarded_port, guest: 5901, host: 15901
```

これで、ゲストOSの ディスプレイ:1 に対するポート 5901 が ホストOSのポート 15901 にフォワーディングされる。

上記設定が完了したら、vagrant reload でVMを再起動する。

# vnc server の起動（ゲストOS）

ゲストvnc-server に接続するためのパスワードを設定する

```
$ vncpasswd
```

パスワードの設定が完了したら、以下のコマンドでサーバを起動する

```
$ vncserver
```

# vnc server への接続（ホストOS）

ホストOS側からゲストOSのVNCサーバに接続してみる。
Mac OS X  Lion の場合はOS標準の「画面共有.app」がVNCクライアントなので、ターミナルなどから、

```
$  open vnc://localhost:15901
```

などと叩くとゲストOSの画面を開くことができる。

![result](http://gyazo.com/45a8d07017041004a2b7f561e4ac4a71.png)

# 参考

http://www.idevelopment.info/data/Unix/Linux/LINUX_AddGNOMEToCentOSMinimalInstall.shtml

http://kajuhome.com/vnc.shtml
ChaSenのインストール


形態素解析による日本語自然言語処理システムであるChaSenをインストールしたメモ。
環境:centos6.3

[ここ](http://getassoc.cs.nii.ac.jp/?%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%2FChasen%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)と[ここ](http://sail.i.ishikawa-nct.ac.jp/whale/whale_install.pdf)を参考にインストールしてみました
環境:centos6.3

まずはChaSenの情報を見に行く
http://chasen-legacy.sourceforge.jp/
http://sourceforge.jp/projects/chasen-legacy/

iconvと Darts-0.31が必要らしい。

まずはDartsから。3,2があったので、そっちを入れる。

```
$ wget http://chasen.org/~taku/software/darts/src/darts-0.32.tar.gz
gtar xvzf darts-0.32.tar.gz
cd darts-0.32
./configure
make
make check
sudo make install
```
で完了。

iconvは既に入っていたので省略します。

##ChaSenインストール

```
$ wget http://iij.dl.sourceforge.jp/chasen-legacy/56305/chasen-2.4.5.tar.gz
$ tar xzf chasen-2.4.5.tar.gz 
$ cd chasen-2.4.5
$ sudo ./configure
$ sudo make 
$ sudo make install
```

##ipadic をインストール

```
$wget http://jaist.dl.sourceforge.jp/ipadic/24435/ipadic-2.7.0.tar.gz
# tar zxf ipadic-2.7.0.tar.gz
# cd ipadic-2.7.0
# ./configure
```
辞書ファイルをUTF-8に変換

```:convert.sh
#!/bin/sh
for file in *.dic *.cha
do
if [ -f $file ]; then
echo $file
iconv -f euc-jp -t utf-8 $file > tmpfile
mv tmpfile $file
fi
done
exit
```
上記シェルスクリプトを実行して辞書ファイルをUTF-8に変換し生成します。

```
$ sh ./convert.sh
$ `chasen-config --mkchadic`/makemat -i w
$ `chasen-config --mkchadic`/makeda -i w chadic *.dic
$ make install
```

chasenrcもUTF-8に変換

```
$ cd /usr/local/etc
$ iconv -f euc-jp -t utf-8 chasenrc > chasenrc.tmp
$ mv chasenrc.tmp chasenrc

```


これで、UTF8で操作出来るようになりました。
hukashigi.cpp

boostライブラリ　& c++11で書きました。再帰を利用してます。
コンパイルオプション(windows)
mingw32-g++ -std=c++11 -Ic:\boost\include\boost-1_53 hukashigi.cpp

```cpp:
#include <iostream>
#include <string>
#include <boost/algorithm/string.hpp>

struct table
{
  int t[11][11];
};

struct position 
{
  int p[2];
};

enum E_POS { ROW, COL };

long move(const struct table & ct, const struct position & cpos, long cnt)
{
  const int t_move[2] = {-1,1};
  if(cpos.p[ROW] == 9 && cpos.p[COL] == 9) return (++cnt);
  for(int i = 0; i < 2; ++i) //ROW,COL
  {
    for(int j = 0; j < 2; ++j) //上下、左右
    {
      struct table t = ct;
      struct position pos = cpos;
      pos.p[i] += t_move[j];
      if(t.t[pos.p[ROW]][pos.p[COL]] != 0) continue;
      pos.p[i] += t_move[j];
      if(t.t[pos.p[ROW]][pos.p[COL]] != 0) continue;
      t.t[pos.p[ROW]][pos.p[COL]] = 1;
      cnt = move(t, pos, cnt);
    }
  }
  return cnt;
}

int solve(const std::string & input)
{
  struct table t = 
  {{
    1,1,1,1,1,1,1,1,1,1,1,
    1,1,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,0,0,0,0,0,0,0,0,0,1,
    1,1,1,1,1,1,1,1,1,1,1,
  }};
  if(input.length() != 0)
  {
    std::list<std::string> results;
    boost::split(results, input, boost::is_any_of(" "));
    for(const std::string str: results)
      t.t[(((str.at(0)-'a')/5*2+1)+((str.at(1)-'a')/5*2+1))/2]
         [(((str.at(0)-'a')%5*2+1)+((str.at(1)-'a')%5*2+1))/2] = 1;
  }
  struct position pos = {{1,1}};
  long cnt = 0;
  cnt = move(t, pos, cnt);
  return cnt;
}

void test(const std::string & input, int ans)
{
  std::string check = (solve(input)==ans) ? 
    "ヾ(*≧∀≦)ﾉﾞ 嬉ｽｨ～★♪": "｡･ﾟ･(*ﾉД`*)･ﾟ･。";
  std::cout << check << std::endl;
}

int main(void)
{
  test("",8512);
  test("af",4256);
  test("xy",4256);
  test("pq qr rs st di in ns sx",184);
  test("af pq qr rs st di in ns sx",92);
  test("bg ch di ij no st",185);
  test("bc af ch di no kp mr ns ot pu rs",16);
  test("ab af",0);
  test("ty xy",0);
  test("bg ch ej gh lm lq mr ot rs sx",11);
  test("ty ch hi mn kp mr rs sx",18);
  test("xy ch hi mn kp mr rs sx",32);
  test("ch hi mn kp mr rs sx",50);
  test("ab cd uv wx",621);
  test("gh mn st lq qr",685);
  test("fg gl lm mr rs",171);
  return 0;
}

```
Clang 3.4 documentの興味あるところだけ翻訳する-Clangをライブラリとして使う編(2)

*このドキュメントは、[ Clang 3.4 documentation](http://clang.llvm.org/docs/index.html ) をテキトーな日本語にゆるふわ翻訳しているドキュメントです。誤解釈などがたくさんあると思いますので信用しないでください。*

# Clangの外部のサンプル
> ここでいう「外部」とは、Clangプロジェクト以外という意味だと思われる。

## 紹介
このページでは、あなたがClangのツールを開発するのに役立つガイド（または出発点）になるであろういくつかのサンプルを紹介します。
Clangのライブラリベースの設計は、外部のプロジェクトでも容易に使えるようにするためです。そして、我々は常にClangを外部のユーザにもより使いやすいよう改善することに興味を持っています。

Clangが使われる典型的なアプリケーションのカテゴリ：

* 静的解析
* ドキュメント/クロスリファレンス生成

もしClangが使われているプロジェクトやツールを知っていたら（あるいは書いたのなら！）、以下に追加するので Clang's development discussion mailing list にメールを送ってください（またはあなたが既にClangのコンとリビュータなら直接以下に追加して頂いても結構です）。このページの主な目的は開発者の手助けをするような例の提供なので、ソースコードを閲覧できることが必要です。

## プロジェクトとツール集
https://github.com/Andersbakken/rtags/
**RTags**は、C/C++コードのインデックスを作り、参照やシンボル名、補完情報のインメモリデータベースを永続的に保持するクライアント/サーバ用のアプリケーションです。


http://rprichard.github.com/sourceweb/
C/C++コードのインデキサー、ナビゲータ

https://github.com/etaoins/qconnectlint
**qconnectlint**は、QObject::connectで生成されたシグナルとスロット接続の静的一貫性証明するツールです。

https://github.com/woboq/woboq_codebrowser
**The Weboq Code Browser**は、C/C++プロジェクト向けウェブベースのコードブラウザです。サンプルは http://code.woboq.org/ をチェックしてください！

https://github.com/mozilla/dxr
**DXR**は、コンパイラによる静的解析データ収集を使ったソースコードクロスリファレンスツールです。

https://github.com/eschulte/clang-mutate
このツールはC言語ソースファイルの操作の数を実行します。

https://github.com/gmarpons/Crisp
LLVM/Clang用のコーディングルールバリデーション・アドオンです。CrispのルールはPrologで書きます。新しいルールを書くことが簡単なハイレベルなDSLは開発中です。おそらくCRISPと呼ばれることになりますが、これはCoding Rules in Sugared Prologのアナグラムです。

https://github.com/drothlis/clang-ctags
C++ソースコード用のタグファイルジェネレータです。

https://github.com/exclipy/clang_indexer
これはC/C++用のLibClangライブラリをベースにしたインデキサです。

https://github.com/holtgrewe/linty
**Linty**は、PythonとLibClangによるC/C++スタイルチェッカです。

https://github.com/axw/cmonster
**cmonster**はClangのC++ パーサのためのPythonラッパです。

https://github.com/rizsotto/Constantine
**Constantine**は、Clang Pluginを学ぶための小さいプロジェクトです。偽の（おそらく適当なという意味の）const解析を実装しています。constなしで変数が宣言されたときに注意を生成します。

https://github.com/jessevdk/cldoc
**cldoc**はClangをベースにしたC/C++のドキュメントジェネレータです。cldocはC/C++のソフトウェアドキュメントを書かなければならないという問題を解決できる、近代的で（作業に）割り込まない強気なアプローチです。
ssh で踏み台サーバを経由して画面共有(VNC)する


以下のような構成で、端末AのVNCクライアントから端末Cで稼働しているVNCサーバに接続する場合の設定。

![踏み台サーバ経由で画面共有(VNC).png](https://qiita-image-store.s3.amazonaws.com/0/8219/a5392013-fcdb-98b0-dd29-d2a150968b9b.png "踏み台サーバ経由で画面共有(VNC).png")

端末A で以下のように .ssh/config に設定を記述する（VNCサーバのポートが 5900 という前提）

```
Host host_C
  User user_c
  ProxyCommand ssh host_B nc -w 10 3.3.3.3 22
  LocalForward 5901 3.3.3.3:5900

Host host_B
  Hostname 2.2.2.2
  Port 22
  User user_b
  Identityfile ~/.ssh/Aの秘密鍵
```

このように設定した後、 端末A から 'ssh host_C' として接続すると、端末Aの localhost:5901 が 端末Cの port 5900 にフォワーディングされるようになる。

この状態で、ターミナルから

```
$ open vnc://localhost:5901 
```

と叩くと、画面共有.app が起動し、端末CのVNCサーバに接続することができる。

# 参考

[サルでも分かる多段ssh - 射撃しつつ前転](http://d.hatena.ne.jp/tkng/20110225/1298596697)
Clang 3.4 documentの興味あるところだけ翻訳する-Clangをライブラリとして使う編(1)

*このドキュメントは、[ Clang 3.4 documentation](http://clang.llvm.org/docs/index.html ) をテキトーな日本語にゆるふわ翻訳しているドキュメントです。誤解釈などがたくさんあると思いますので信用しないでください。*

# アプリケーションに合ったインターフェースを選ぶ
Clangは、ツールを作るのに必要なインフラストラクチャ-プログラムのセマンティック・シンタクティクな（構文的・意味的）情報-を提供します。
このドキュメントでは、Clangのツールを作成するのにいくつかの違った手法とその特徴を簡潔に紹介します。

## LibClang
***LibClang*** は、ハイレベルで安定したCのインターフェースです。LibClangはだいたいあなたの求めているインターフェースでしょう。 LibClangを使わない大きな理由があるとき以外は、他のインターフェースを使わなくてもよいでしょう。

典型的な例としては、以下のツールが使いたい時などにLibClangは有効です：

* Xcode
* Clang Python Bindings

LibClangは他にもこんなときに使えます：

* C++のような他の言語とclangのインターフェースが欲しいとき
* 古いバージョンと互換性のある安定したインターフェースが必要なとき
* ハイレベルでパワフルな抽象化-たとえばカーソル付きでASTを繰り返し通るとか-ができることを求めているけれど、ClangのASTのすべてを知りたくはないとき

こんなときは使えません：

* ClangのASTの全てを操作したい

## Clang Plugins
***Clang Plugins*** を使うことで、ClangのAST（抽象構文木）に追加の操作を付け加えることができます。プラグインはランタイム時にコンパイラによってロードされるダイナミックライブラリで、各ビルド環境で簡単に結合することができます。

プラグインを使うような例：

* 特別なlintスタイルの警告やエラーが必要なとき
* 1つのコンパイルステップから追加の操作を作りたいとき

他にもClang Pluginはこんなときに使えます：

* もし依存関係が変更されていたらそれを教えてくれるようなツールが欲しいとき
* ビルドする、ビルドをブレークするツールが欲しいとき
* ClangのASTの全てを操作したいとき

こんなときは使えません：

* ビルド環境外でツールを使いたいとき
* メモリ内の仮想ファイルのマッピングを含めて、Clangがどのように設定されているかを全て操作したい
* リビルドのトリガなどの変更に関連づけられている必要の無い、プロジェクト内のファイルの特定のサブセットを実行することが必要なとき

## LibTooling
***Lib Tooling*** は、Clangのツールとしてだけではなく、スタンドアローンなツールを書くことを目的としているC++インターフェースです。

Lib Toolingを使う例：

* 簡単なシンタックスチェッカ
* リファクタリングツール

他にもこんなときに使えます：

* １つのファイルまたは特定のファイルのサブセットとしてツールを独立させて実行させたいとき
* ClangのASTの全てを制御したいとき
* Clang Pluginとコードを共有したいとき

こんなときには使えません：

* 依存性の変更をトリガにしてビルドするパーツとして実行したいとき
* ASTのAPIが変更されたときでも、今までのコードは変更する必要のないような安定したインターフェースが必要なとき
* 箱（？）の外でハイレベルな抽象化-カーソルやコード補完が必要なとき
* ツールをC++で書くのが嫌なとき

***Clang tools*** はClangプロジェクトの一部であるLibTooling基盤上で動いている特定の開発ツール群です。これらはC/C++開発者の開発活動の中核を自動化・改善することを目標としています。

Clangプロジェクトとして製作中・計画中のツールの例：

* シンタックスチェック (**clang-check**)
* コンパイルエラーの自動修正 (**clang-fixit**)
* 自動コードフォーマット化 (**clang-format**)
* 新しい言語標準の新しい特徴のためのマイグレーションツール
* リファクタリングツール
Clang 3.4 documentの興味あるところだけ翻訳する-Index編

*このドキュメントは、[ Clang 3.4 documentation](http://clang.llvm.org/docs/index.html ) をテキトーな日本語にゆるふわ翻訳しているドキュメントです。誤解釈などがたくさんあると思いますので信用しないでください。*

## Using Clang as a Compiler - Clangをコンパイラとして使う
* Clangコンパイラユーザーズマニュアル
* Clangの言語拡張
* アドレスサニタイザ
* スレッドサニタイザ
* メモリサニタイザ
* モジュール
* よくある質問 (FAQ)

## Using Clang as a Library - Clangをライブラリとして使う

* アプリケーションに合ったインターフェースを選ぶ
* Clangの外のサンプル
* ClangのAST（抽象構文木）のイントロダクション
* Libツール
* Libフォーマット
* Clangのプラグイン
* ASTFrontendActionベースのRecursiveASTVisitorの書き方
* LibツールとLibASTマッチャーを使ったツールビルドのチュートリアル
* Clang ASTのマッチング
* ClangのツールをLLVMにセットアップする方法
* JSONコンパイルデータベースフォーマットの仕様書

## Using Clang Tools - Clangのツールの紹介
* 概要
* ClangCheck
* ClangFormat

## 設計書
* “Clang” CFE 内部マニュアル
* ドライバの設計と内部
* プリ字句解析（？）されたヘッダ (PTH)
* プリコンパイルされたヘッダとモジュールの内部

## 索引とテーブル
* 索引
* モジュールの索引
* ページ検索
TileMill をLubuntu13.04 にインストールする

# まえがき
Mapnik 2.2 がリリースされたようなのでさっそくインストールにチャレンジしてみようとしたところ、MapnikのWikiに「TileMillが非常にべんりだよ」とあったので、さっそく「TileMill」なるものをインストールしてみましょう。
（ちなみに「TileMill」がなんなのか、どういう機能なのかはまったく理解していません）

下記のページにインストール方法が記載されていますが、Lubuntu13.04ではうまくインストールできません。
http://www.mapbox.com/tilemill/docs/linux-install/

たぶん、ubuntu12.10 までにしか対応していないためだと思われます。

ubuntu13.x以降のひとは下記の方法を試してみてください。

# インストール
## PPAの登録

１． 「Synapticパッケージマネージャ」を起動します。

2. メニュー [設定(S)] -> [リポジトリ(R)] と選択すると、「ソフトウェアとアップデート」フォームが開きます。

3. 「他のソフトウェア」タブをクリック

4. 「追加」ボタンをクリック

5. 「APTライン：」に下記の呪文を入力して「＋ソースを追加(A)」をクリック
```
deb http://ppa.launchpad.net/developmentseed/mapbox/ubuntu quantal main
```

![TileMill_APTline.png](https://qiita-image-store.s3.amazonaws.com/0/25141/7910edcf-3519-6288-c6ad-20607428bde4.png)

6. 「ｘ閉じる(C)」

７． 「再読込」ボタン

８． 「すべてアップグレード」

９． 「Synapticパッケージマネージャ」を終了

## TileMillのインストール

1. コマンドターミナルから
```
$ sudo apt-get install tilemill libmapnik nodejs
```
を実行

## TileMill の起動

Lubuntuのメニュー [グラフィックス] -> [TileMill] から起動することができます。

![TileMill_Projects.png](https://qiita-image-store.s3.amazonaws.com/0/25141/d295fe17-0652-d345-408c-317cd9547d67.png)
パターンマッチ実装奮闘記(3)

前回は、開発方針を決めました。今回は、四則演算が出来て、構造体が扱える所までの実装します。

## この日記の意味

この日記は、パターンマッチの出来るコンパイラを悩みながらつくった時の記録です。まどろっこしいことやってんなーと思うんですけど、ここで伝えたいのはどうしたらいいのか分からない問題をどう克服して行ったのかということです。アイディアはあっても実装できないと意味がないと良く聞きます。参考書があれば嬉しいのですが、ない場合は考えだすしかありません。簡単に出来そうなのに出来ないのには必ず理由があります。そこの理由を考えて、対策していけばいずれ解決するのです。答えだけでは、魂までは伝わらない訳で、メイキングの話が結構重要だったりする。そこら変のことを考えつつ見て見てもらえると嬉しいです。


## 四則演算

実はLLVMの勉強用に作っていたもの既にあったのでそれを使いました。テストは書いていないのでバグは沢山潜んでいるでしょう。この実装についての数段階のドキュメントが欲しい所です。しかし、本当に考えなければならないのはパターンマッチの実装です。ですから、ここは、コレを使うと言う事にして次の段階に進もうと思います。

## ざっくりとした構想

ASTを定義します。四則演算とprintが出来るだけの簡単なコンパイラをScalaを使って書きます。

```
main: kNormalとemitの呼び出し
kNormal: 式のリストをLLリストに変換。
emit: LL -> ファイル
asm: ファイルの出力
exec: プロセス実行
```

上記の構成で、kNormalではコンパイルしたら結果のレジスタ名を返却するようにして作ります。

# 構造体のコンパイル

構造体を作って領域を確保し、値を設定し、読み込みを行います。構造体の定義はemitの最初で、ソースの先頭にまとめて出力してしまいます。ここは、初めて作る場合は簡単なようで難しい所です。なので、最初は構造体内の構造体は考えずに、フラットな構造体だけを考えるのがよいです。実際ここで作成したプログラムは構造体の構造体はサポートしていません。最終目標が簡単なパターンマッチの例を作る事にあるのでこれで十分なのです。

構造体の構造体もそんなに難しくはありません。複雑に絡み合ったものを作ろうとする場合は、構造体や配列、ポインタ等のアドレスを取り出す関数を作ってそこに式を入れれば結果が返ってくるようにしておき、そのアドレスのレジスタを使ってアクセスするようにしてやるとよいようです。

## 領域確保

型をきちんとしていしてアロックするだけで特に難しい事はありません。


## 値の設定

ここは、やったことないと悩むかもしれないんですけど、LLVMだと楽です。
構造体定義の何個目のアドレスを取得とかってやって、最後はstoreでストアします。

## 読み込み

値の設定の逆の操作で出来ます。
アドレス取得操作を作っておけば関数を読んで値を設定する代わりに値を読み込むだけです。

## まとめ

今回は、構造体までのソースを探して来て、こんな文章を書こうってことを考えました。で、文才がないので文章書いてると時間が永遠と必要になってしまいます。それじゃ、いつまで立っても出来上がらないじゃないか！！
ってことで、適当に構想を考えて終わってたので、後から何考えてたのかを思い出して書いてみました。

ここで考えていた内容の文章は、パターンマッチの作り方っていうので書こうと思っています。
Vim scriptでのイミディエイトウィンドウを作った。 

この記事は[Vim Advent Calendar 2012 : ATND](http://atnd.org/events/33746)203日目の記事になります。


今回はGoogle Chrome Developer ConsoleのようなものVim scriptにも欲しいなっと思って、
Vim scriptでのイミディエイトウィンドウっぽいのを作ってみました。 

> https://github.com/rbtnn/vimconsole.vim

![](https://raw.github.com/rbtnn/vimconsole.vim/master/vimconsole.png)

# インストール

インストールはNeoBundleとかでさくっとインストールしてください。
依存しているプラグインは基本的にありません。

<del>インストール後の設定は特に必要ないです。
あえて設定するとすればウィンドウの高さとキーマッピングぐらい。
</del>

追記(2013/06/26)： 設定しなくても十分使えるようにデフォルト設定していますが、設定についての詳細はhelpを参照してください。(オプションについては仕様が変わる可能性が大なのでここでは説明しないことにしました。)


```vim:
" VimConsoleを開いた時のウィンドウの高さを設定。（デフォルト値は6です。）
let g:vimconsole#height = 10

NeoBundle 'rbtnn/vimconsole.vim'
```

「基本的に」というのは、https://github.com/thinca/vim-prettyprint をインストールしていた場合には
出力にPrettyPrint()を使うようになっています。なので入れていると、辞書やリストをいい感じに出力することができます。


# 使い方

基本的なインターフェースはjavascriptっぽくしてあります。
出力されるウィンドウはVimConsoleと言い、基本的にシングルトンなものです。
VimConsoleを2ウィンドウにすることは想定していません。

VimConsoleを開くには`:VimConsoleOpen`コマンドで、閉じるには`:VimConsoleClose`コマンドでできます。
一応、`:VimConsoleToggle`コマンドも用意しています（開閉をトグルするコマンド）。
VimConsoleの内容を更新するには`:VimConsoleRedraw`コマンドで更新できます。


VimConsoleの出力関連は以下のような関数やコマンドが用意されています。

### VimConsoleの出力をクリアにする。

```vim:
" 関数バージョン
call vimconsole#clear()
" コマンドバージョン
VimConsoleClear
```

### VimConsoleに出力する。(1)

```vim:
" 関数バージョン
call vimconsole#log(123)
" コマンドバージョン
VimConsoleLog "hoge\nfoo"
```

### VimConsoleに出力する。(2)

```vim:
" 関数バージョン(ハイライトは`WarningMsg`)
call vimconsole#warn("this is a warn message.")
call vimconsole#warn("this is a %s message.", 'warn') " printfのような引数にも対応しています。
" コマンドバージョン
VimConsoleWarn { 'A' : 23, 'B' : { 'C' : 0.034 } }
```

### VimConsoleに出力する。(3)

```vim:
" 関数バージョン(ハイライトは`Error`)
call vimconsole#error("this is an error message.")
" コマンドバージョン
VimConsoleError function('tr')
```

### VimConsoleに出力する。(4)

```vim:
" 第1引数が真なら出力されます。これに当たるコマンドは用意されていません。
call vimconsole#assert(1,"(true) this is an assert message.")
call vimconsole#assert(0,"(false) this is an assert message.")
```

### VimConsoleのN行目に当たるオブジェクトを収得する。

```vim:
" 引数を省略した場合、`line(".")`を指定したことになります。
let  obj = vimconsole#at()

" VimConsoleの2行目のオブジェクトを返す。
let  obj = vimconsole#at(2)

" 不正な引数は`{}`を返します。
let  obj = vimconsole#at(-12)
```

-----------------

以上、vimconsole.vimでした。まぁ、Vim scriptのデバッグとかに使ってもらえればいいなーと思います。
[PHP]Google Analytics API v3.0 使い方〜データ取得編

今回はいよいよGoogleAnalyticsからデータを取得する処理です。

５月にPV数が多かった日付を降順に10件取得してみます。

Client IDの作成方法は[[PHP]Google Analytics API v3.0 使い方〜前準備編](http://qiita.com/items/581f7c9390de92f4b81a "[PHP]Google Analytics API v3.0 使い方〜前準備編")を御覧ください。
アカウント認証処理については[[PHP]Google Analytics API v3.0 使い方〜認証編](http://qiita.com/items/d1f67592e7b84a8b1e9e "[PHP]Google Analytics API v3.0 使い方〜認証編")を御覧ください。

■ ディレクトリ構成
前回同様以下の様に配置しています
/www
　/lib
　　/google-api-php-client・・・ダウンロードしてきたライブラリ
　signin.php
　index.php

■ index.phpにGoogleAnalyticsからデータを取得する処理を追加

```html+php:index.php
<?php
require('lib/google-api-php-client/src/Google_Client.php');
require('lib/google-api-php-client/src/contrib/Google_AnalyticsService.php');

session_start();
$client = new Google_Client();

// クライアントID
$client->setClientId('Your Client ID');
// クライアントSecret
$client->setClientSecret('Your Client Secret');
// リダイレクトURL
$client->setRedirectUri('http://example/index.php');

// 使用するサービスを作成
$service = new Google_AnalyticsService($client);

// トークンセット
$client->setAccessToken($_SESSION['token']);

// 以下４つは必須項目
$profile_id = 'ga:123456789'; // プロファイルID
$start_date = '2013-05-01'; // 開始日付(YYYY-MM-DD)
$end_date = '2013-05-31'; // 終了日付(YYYY-MM-DD)
$metrics = 'ga:visits'; // 取得する指標(複数指定する場合は「,」でつなげる

// その他指定する場合は連想配列にまとめる
$optParams = array(
        'dimensions'=> 'ga:date', // ディメンション(複数指定する場合は「,」でつなげる
        'sort' => '-ga:visits', // 何でソートするか(降順の場合は先頭に「-」をつける
        'max-results' => 10,// 取得する最大件数
);

$data = $service->data_ga->get($profile_id, $start_date, $end_date, $metrics, $optParams);
$list = array();
foreach ($data['rows'] as $row => $value) {
    $result = array();
    foreach ($data['columnHeaders'] as $key => $header) {
        $result[$header['name']] = $value[$key];
    }
    $list[] = $result;
}
?>

<table class="table table-bordered table-striped">
    <thead>
        <tr>
            <th>Pagepath</th>
            <th>visits</th>
        </tr>
    </thead>
    <tbody>
    <?php
        foreach ($list as $val) {
            echo "<tr>";
            foreach ($val as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
    ?>
    </tbody>
</table>

```
![Bootstrap, from Twitter (4).png](https://qiita-image-store.s3.amazonaws.com/0/14172/7ff7bada-3839-a59e-3c1d-6c3429928445.png)
Rubyで指定したコマンドが存在するかを調べるには?


`cat`, `xargs`, `grep` のような一部環境に無いコマンドがあるかを調べて分岐する時に使う。

```ruby:util.rb
# 指定したコマンドが存在するか？
def exist_command?(command)
  begin
    Open3.capture3("type #{command}")[2].exited?
  rescue Errno::ENOENT
    false
  end
end
```

使い方。

```ruby:use_exist_command.rb
# cat, grep, xargs コマンドの存在を確認
if exist_command?('cat') && exist_command?('grep') && exist_command?('xargs')
  system("cat /path/to/file | xargs grep keyword") # ばんばん使える！
else
  puts "Not found command..."
end
```

- [module Open3](http://doc.ruby-lang.org/ja/2.0.0/class/Open3.html)を使うことで、結果をコンソールに表示せずに実行結果を受け取ることが出来た
- OS種類で判定するとcygwinが入ったWindows等が検出出来ないので直接コマンドを探す方がよい時が多い
- typeコマンドが存在しない時、常にfalseになってしまうのはもう少し改善の余地がありそう(他のコマンドも試すなど)
Rails 3 でサブドメインを使う場合のルーティング設定


ルーティングで api ドメイン以下だけで使用できるコントローラや Rack middleware を設定したいという場合について考えたいと思います。

## サブドメインからだけアクセスできるようにする

以下のようなクラスを定義します。

```ruby:config/routes.rb
class UseSubdomain
  def initialize(domain)
    @domain = domain
  end

  def matches?(request)
    request.subdomain.present? && request.subdomain == @domain
  end
end
```

以下のようにして使用します。

```ruby:config/routes.rb
Test::Application.routes.draw do
  constraints(UseSubdomain.new('api')) do
    mount Test::Api => '/'
  end

  constraints(UseSubdomain.new('dashboard')) do
    root to: 'dashboard#index'
  end
end
```

## ネイキッド / www ドメインからだけアクセスできるようにする

上記のままではネイキッドドメイン/www ドメインでアクセスしたい部分でもサブドメインでアクセスすることを許容してしまいますので、さらに以下のクラスを定義し、制限を行います。

```ruby:config/routes.rb
class OmitSubdomain
  def matches?(request)
    request.subdomain.blank? || request.subdomain == 'www'
  end
end
```

この使用方法は以下のようになります。

```ruby:config/routes.rb
Test::Application.routes.draw do
  constraints(OmitSubdomain.new) do
    resources :articles
    root to: 'site#index'
  end
end
```
黒魔術を使ったメソッドの呼び出し

RailsでDBにアクセスするときにmodel上に定義したメソッドはわざわざ.eachとかを使わなくても以下のようにアクセスできる。
テーブル名をnamesとすると、

```names.controller.rb
def get_names
   names = Name.all
   names.sort_by(&:method).reverse
end
```
こんな感じ。
methodはname.rbみたいなmodel上に定義されている必要がある。

Ruby黒魔術の片鱗を垣間見ているようである。

##参考ページ
[Rubyでメタプログラミング 〜暗黙的に呼ばれるto_procメソッド〜](http://blog.livedoor.jp/sasata299/archives/51541958.html)
Rails のヘルパーについての悩み


## 悩み

view にこんなコードがあったとする。

```erb
<a id="foo" href="<%= new_foo_path %>">
  <% if @foo.doable? %>
    <img src="/images/bar.gif" alt="実行可能" />
  <% else %>
    <img src="/images/baz.gif" alt="実行不可能" />
  <% end %>
</a>
```

`@foo#doable?` によって、リンク先は同じだけれども、画像を変えたい。（例は微妙だけど、そういう事があるはず）

まず Rails のヘルパーを使うように修正。

```erb
<%
  image_tag_for_link = if @foo.doable?
    image_tag("bar.gif", alt="実行可能")
  else
    image_tag("baz.gif", alt="実行不可能")
  end
%>
<%= link_to image_tag_for_link, new_foo_path, :id => "foo" %>
```

テンプレートに条件分岐が入るのが嫌なので、ヘルパーにする

```rb
def image_tag_for_new_foo_link(foo)
  if foo.doable?
    image_tag("bar.gif", alt="実行可能")
  else
    image_tag("baz.gif", alt="実行不可能")
  end
end
```
```erb
<%= link_to image_tag_for_new_foo_link(@foo), new_foo_path, :id => "foo" %>
```

こうなると `image_tag_for_foo_link` がオブジェクト指向っぽく無い事に気付いてモヤモヤしだす。(Ruby はオブジェクト指向言語である！)
つまり、こう書きたい。

```erb
<%= link_to @foo.image_tag_for_new_link, new_foo_path, :id => "foo" %>
```

かといって、これを Foo モデルには書きたくない。モデルはデータを提供するけど、表示の仕方だとかどんなタグを使うかだとかに関心を持ちたく**ない**。

## 解決策

ActiveDecorator を使えば良いんだろうなーと思っている。
https://github.com/amatsuda/active_decorator


## 更なる悩み

今やってる案件が Rails 2 系なの…(´・ω・｀)

## その他の悩み

こういう時に link_to までヘルパーにするか、image_tag だけをヘルパーにするか。
省略形式での変数再宣言が許される場合

Go では変数は宣言されていないといけません。

```go
var i int
i = 10
```

関数の中などの条件が揃う場合は、省略形式で型推論による宣言ができます。

```go:
i := 10 // i は int として宣言され代入される
```

そして、同じ変数の宣言は同じブロックでは一度しかできません。

```go
var i int
// snip
var i int // i redeclared in this block
```

省略形式も同じ(がエラーは違う)

```go
var i int
i := 10 // no new variables on left side of :=
```

しかし、省略形式の時は宣言する変数のうち少なくともひとつがブランク変数(_)ではない、
新しい変数であれば、他は再宣言ではなく単なる代入として扱えます。

```go
var i int
i, j := 10, 20
```

最初なんでこれが動くのか謎だったんですが、ちゃんとドキュメントにありました。
http://golang.org/ref/spec#Short_variable_declarations
http://golang.jp/go_spec#Short_variable_declarations

こが使える場面なんですが、自分が見つけたのは以下のような場合でした。
すでに err のような取回す変数が宣言されていて、それ以外の値も含めた多値を返す関数を呼ぶとき。

```go
var err error
i, err := hoge()
```

もし err 側で再宣言とみなされると、 i にあたるものはいちいち宣言しないといけない。
これが err の方は単なる代入になり、いちいち i にあたるものを宣言しないでいい。
行列から条件に合う行だけを選択する


Ruby の `select` みたいな感じです。

例えば、以下のような行列 X と、X の行に対応するベクトル c があったとして、c が 1 の行だけを抜き出したいとすると・・・。

```octave
X = [
  12  21  30
  51  63  70
  94 109 111
  24  54  63
];
c = [1 2 1 3]';
```

true か false の入ったベクトルを使うことで抜き出すことができます。

```octave
idx = c == 1;
X_selected = X(idx, :);

% X_selected =
%
%    12    21    30
%    94   109   111
%
```

どうやら logical indexing というらしいです。便利！

http://stackoverflow.com/questions/8111860/selecting-only-a-specific-number-of-rows-fulfilling-a-condition
grunt-contrib-watchを使ってlivereloadする

これまでgruntでlivereload（grunt-contrib-livereload）をするにはregarde（grunt-contrib-regarde）とlivereload（grunt-contrib-livereload）が必要だったみたいなんですが、watch（grunt-contrib-watch）の0.4からlivereloadがビルトインされたようなので、使ってみました。
確か、livereloadを入れようとすると「Deprecated in favor of grunt-contrib-watch which now have Livereload support built-in.」って怒られたはず。watchの0.4以降だとconnectとwatchがあればlivereloadできるみたいです。watch内の設定でlivereload: trueにします。

```js:
'use strict';
module.exports = function(grunt){

     grunt.initConfig({

           pkg: grunt.file.readJSON("package.json"),

           watch:{
                options: {
                     livereload: true
                },
                html: {
                     files: '*.html',
                     tasks: ['']
                }
           }, 

           connect: {
                livereload: {
                     options: {
                          port: 9001
                     }
                }
            }
     });

     grunt.loadNpmTasks("grunt-contrib-watch");
     grunt.loadNpmTasks("grunt-contrib-connect");

     grunt.registerTask("default", ["connect","watch"]);

};
```

watchのアップデートとブラウザにエクステンションを入れるのを忘れずに。
ejectフレームワーク

# ejectフレームワーク

より効率的にejectさせるプログラムを書くために自動処理フレームワークの[automaticruby] (https://github.com/automaticruby/automaticruby)にejectプラグインを追加した。

ejectプログラムを作成するときにネックになるのが「何をフックとさせるか」「１回ejectさせたらそのフックは次にejectさせるか、させないか」になると思われる。
例えばjenkinsのビルド失敗RSSを取得したらejectだったり、
Twitterで特定の単語がつぶやかれたらejectだったり等。

より早く、効率的にejectさせる仕組みを作りたいだけなので
rssの取得だったり、Twitterの検索だったり毎回実行させないためにDBに値保存だったりのプログラムを毎回組むのは面倒、もとい非効率的なので
以下のyml形式のファイルを作成してやればejectする仕組みを作成する事ができる。

## yml例

### jenkinsの失敗ビルド

```jenkins_failed_eject.yml
global:
  timezone: Asia/Tokyo
  cache:
    base: /tmp
  log:
    level: info

plugins:
  - module: SubscriptionFeed
    config:
      feeds:
        - http://jenkins.id774.net/jenkins/job/automaticruby-with-ruby2.0/rssFailed

  - module: StorePermalink
    config:
      db: jenkins_failed_eject.db

  - module: PublishEject
```

### Twitterでejectとつぶやかれたときにeject

```twisearch_eject.yml
global:
  timezone: Asia/Tokyo
  cache:
    base: /tmp
  log:
    level: info

plugins:
  - module: SubscriptionTwitterSearch
    config:
      consumer_key:       'your_consumer_key'
      consumer_secret:    'your_consumer_secret'
      oauth_token:        'your_oauth_token'
      oauth_token_secret: 'your_oauth_token_secret'
      search:             'eject'
      opt:
        lang : "ja"
        count : 10

  - module: StorePermalink
    config:
      db: twisearch_eject.db

  - module: PublishEject
```

## automaticrubyのインストール

    $ git clone git://github.com/automaticruby/automaticruby.git
    $ cd automaticruby
    $ bundle install --path vendor/gems
    $ bin/automatic scaffold
    $ bin/automatic -c ~/.automatic/config/example/feed2console.yml

## 実行

以下で実行できる。cronに登録しておけば定期的に実行される。

    $ bin/automatic -c jenkins_failed_eject.yml
    $ bin/automatic -c twisearch_eject.yml

これで効率的にejectさせる事ができる。
Star WarsのあのオープニングをiPhoneで再現してみた。


shu223さんの著書『[iOSアプリ開発 達人のレシピ100](http://qiita.com/items/6ee131aff8751b42666a)』をパラパラとめくっていると
「あっ。こういうのつくれるかも」と思いついてしまうので、早速つくってみました。

![opening](http://vantageartprojects.com/jennifermawby.com/ma_journal/wordpress/wp-content/uploads/2011/05/Star-Wars-opening.png)
##Chapter1 アニメーション／演出

###「001 CATransform3D を用いて3D 表現をおこなう」を参考に。

で紹介されていたCATransform3Dの使い方を見ていて、あのカルト的人気映画のあのオープニングが再現できるんじゃね？
と思い早速実装してみました。

##SWScrollView

普通のスクロールビューでも良いんですが、テキストが選択されるのはイヤなので、canBecomeFirstResponderをオーバライドします。

```
#import "SWScrollView.h"

@implementation SWScrollView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (BOOL)canBecomeFirstResponder {
    return NO;
}
@end
```

##SWViewController
表示するほうにCATransform3Dの処理を書く。
本で紹介されているより奥行き深めで表示されるようにしている。

```
@interface SWViewController ()
@property (nonatomic, strong) IBOutlet SWScrollView *textView;
@end

@implementation SWViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    CATransform3D transform = CATransform3DIdentity;
    //z distance
    float distance = [[UIScreen mainScreen] bounds].size.height;
    float ratio    = [[UIScreen mainScreen] bounds].size.height/[[UIScreen mainScreen] bounds].size.height;
    transform.m34 = - ratio / distance;;
    transform = CATransform3DRotate(transform, 60.0f * M_PI / 180.0f, 1.f, 0.0f, 0.0f);
    _textView.layer.transform = transform;
    _textView.layer.zPosition = distance * ratio;
    _textView.layer.position = CGPointMake(
                                           [[UIScreen mainScreen] bounds].size.width/2,
                                           [[UIScreen mainScreen] bounds].size.height/3);

	// Do any additional setup after loading the view, typically from a nib.
}
＜略＞
@end
```
![sample0](http://f.cl.ly/items/393R2b2I0a1D2K1g3l36/SWScroll0.png)　![sample1](http://f.cl.ly/items/3p2S0z203w0x0k2A3Y3a/SWScroll1.png)   ![sample2](http://f.cl.ly/items/1j1d1f2W3B0e041p2n2A/SWScroll2.png) 

リポジトリはこちら
[somtd / SWScrollView](https://github.com/somtd/SWScrollView)
smartinput の <BS> や <CR> の汎用性を高める

この投稿は、変にややこしいやり方を使ってた[この投稿](http://qiita.com/items/958ef3b4c32b4f992e0e)を改善したものです;-)

[smartinput](https://github.com/kana/vim-smartinput) は括弧のペアを入力してくれるプラグインとして知られてますが、ペアになった括弧をまとめて削除するような機能もあります。しかし、`<BS>`や`<CR>`に別のプラグインの機能をマッピングしていて忘れ去られていることが多いように思います。(※当社比)

この問題に対処するためにsmartinputが提供する機能を含んだ`<BS>`や`<CR>`に対して代わりの名前を付けて、呼び出しやすくします。

まずは、 smartinput 側の設定です。

```vim
call smartinput#map_to_trigger('i', '<Plug>(smartinput_BS)',
      \                        '<BS>',
      \                        '<BS>')
call smartinput#map_to_trigger('i', '<Plug>(smartinput_C-h)',
      \                        '<BS>',
      \                        '<C-h>')
call smartinput#map_to_trigger('i', '<Plug>(smartinput_CR)',
      \                        '<Enter>',
      \                        '<Enter>')
```

これで、smartinputが提供する機能を含んだ`<BS>`、`<C-h>`、`<CR>`を、`<Plug>(smartinput_BS)`、`<Plug>(smartinput_C-h)`、`<Plug>(smartinput_CR)`で使えるようになりました。


例としてこれらを、 [neocomplcache](https://github.com/Shougo/neocomplcache.vim) の一般的な設定に当てはめて利用してみましょう。

```vim
" <BS> でポップアップを閉じて文字を削除
imap <expr> <BS>
      \ neocomplcache#smart_close_popup() . "\<Plug>(smartinput_BS)"

" <C-h> でポップアップを閉じて文字を削除
imap <expr> <C-h>
      \ neocomplcache#smart_close_popup() . "\<Plug>(smartinput_C-h)"


" <CR> でポップアップ中の候補を選択し改行する
imap <expr> <CR>
      \ neocomplete#smart_close_popup() . "\<Plug>(smartinput_CR)"

" <CR> でポップアップ中の候補を選択するだけで、改行はしないバージョン
" ポップアップがないときには改行する
imap <expr> <CR> pumvisible() ?
      \ neocomplcache#close_popup() : "\<Plug>(smartinput_CR)"
```

`<BS>`、`<CR>`、`<C-h>`の代わりに、新たに作ったマッピングを利用しています。また、`inoremap`を`imap`に変更しているのがポイントです。
Ethnaの古い履歴を調査する方法

## Git履歴は途中までしか遡れない

EthnaのGitレポジトリでは、2007/12/11にコミットされた下記のコミットが始祖コミットになっており、そこより過去に遡ることができません。
https://github.com/ethna/ethna/commit/730bc7d4e979a6ba768d85ef76acbcca97df1ff8

## SVNなら最初のコミットまで遡れる
sourceforgeにSubversionのレポジトリが置いてあります。
これを見れば、ずっと過去まで（最初のコミットまで）遡ることができます。
http://sourceforge.jp/projects/ethna/scm/svn/

特定のコミットを見る場合はこんな感じ
http://sourceforge.jp/projects/ethna/scm/svn/commits/602

手元でsvnコマンドが使えるなら、こんな感じでsvnコマンドで履歴を見ることもできます。

```
svn blame http://svn.sourceforge.jp/svnroot/ethna/ethna/trunk/class/Plugin/Ethna_Plugin_Logwriter.php@700
```
nginxの開発MLにパッチを送る

先日nginxでValgrindの警告を消すパッチを開発メーリングリストに投稿した時のメモ。

nginxはバージョン管理にMercurialを使っている。Mercurialには指定したリビジョンのコミットからパッチを生成するコマンドと、パッチファイルをコミットとして取り込むコマンドがあるので単なるunified diffテキストを送るよりはこれを使う方が良さげ。

パッチ作成対象のコミットは以下のリビジョンのもの。なお、これ自体は既にnginx本体に取り込まれたものなので、実際に送ったパッチやその際のやりとりについては[こちらのスレッド](http://mailman.nginx.org/pipermail/nginx-devel/2013-June/003833.html)を参照。

```zsh:
$ hg log -r 5252
changeset:   5252:982678c5c270
tag:         tip
user:        Tatsuhiko Kubo <cubicdaiya@gmail.com>
date:        Wed Jun 12 00:41:24 2013 +0900
files:       src/os/unix/ngx_channel.c
description:
Valgrind: another complaint about uninitialized bytes.


$
```

コミットからパッチを作成するにはexportコマンドを使用する。

```zsh:
$ hg export 5252
# HG changeset patch
# User Tatsuhiko Kubo <cubicdaiya@gmail.com>
# Date 1370965284 -32400
#      Wed Jun 12 00:41:24 2013 +0900
# Node ID 982678c5c270f93a0c21ab6eb23cb123c0dc3df0
# Parent  4ef49081ef4c261a2138aeb4944be0afeee5a586
Valgrind: another complaint about uninitialized bytes.

diff -r 4ef49081ef4c -r 982678c5c270 src/os/unix/ngx_channel.c
--- a/src/os/unix/ngx_channel.c Thu Jun 13 16:28:42 2013 +0400
+++ b/src/os/unix/ngx_channel.c Wed Jun 12 00:41:24 2013 +0900
@@ -34,6 +34,8 @@
         msg.msg_control = (caddr_t) &cmsg;
         msg.msg_controllen = sizeof(cmsg);

+        ngx_memzero(&cmsg, sizeof(cmsg));
+
         cmsg.cm.cmsg_len = CMSG_LEN(sizeof(int));
         cmsg.cm.cmsg_level = SOL_SOCKET;
         cmsg.cm.cmsg_type = SCM_RIGHTS;
$
```

exportコマンドの出力にはコミットの作成者や変更元のリビジョンのハッシュ値(Parent)も含まれるのでパッチを取り込む側にとっては何かと都合が良い。また、リビジョン番号の代わりにコミットのハッシュ値でもできるし、この場合はtip(gitでいうHEAD)でもパッチが作れる。

```zsh:
$ hg export tip
       ・
    (中略)
       ・
$ hg export 982678c5c270
       ・
    (中略)
       ・
$
```

あとは生成したパッチを添付したメールを[nginx-devel@nginx.org](http://mailman.nginx.org/mailman/listinfo/nginx-devel)に送ればいい。なお、nginxのMercurialリポジトリは以下のURLからcloneできる。

```zsh:
$ hg clone http://hg.nginx.org/nginx
```
git コマンド集


#branch関係
##branchの作成
###branchを作成
> $ git branch "branch名"

###branchを作成してそのbranchへ移動
> $ git checkout -b "branch名"

##branchの削除
###merge前
>$ git branch -D "branch名"

###merge後
>$ git branch -d "branch名"

#差分確認
##diff
###最新コミットファイルとの差分確認
>$ git diff HEAD

#ロールバック
##ローカルの編集の取り消し
> $ git checkout ファイル名

#リセット
##前回のコミット内容にリセット
>$ git reset --hard HEAD^

##コミットidを指定してリセット
>$ git reset --hard コミットID

#Cheryy-pick

##管理下全体でのコミット確認
> $ git reflog

##管理下全体でのコミット反映
> $ git cherry-pick {commit ID}

#Log

##行単位のログ確認
> $ git blame ファイル名

##commit IDを指定して内容の確認
> $ git show コミットID

##前回のコミットに結合してコミットする方法（前回のコミットに新しいコミットを結合）
>$ git commit --amend

##コミットログを編集してきれいにする方法
>$ git rebase -i HEAD~4

これで直前４つのコミットログを編集できる
Sublime Text3 の Package Control に自作プラグインを対応させる際のポイント


Sublime Text 3 対応を検討しているプラグイン開発者向け情報です。

現在 Package Control では、Packages フォルダの中にそのままの形でファイルが配置されています。ところが Sublime Text 3 になると、デフォルトで Installed Packages の中に圧縮形式 (.sublime-package) で配置されるようになります。

つまり、今まで自作プラグインで自分のプラグインフォルダのファイルを参照している人は、Sublime Text 3 向けに以下のいずれかの対応をしなければなりません。

* load_resource() か load_binary_resource() を使ってファイルにアクセスするように、スクリプトを変更する ([Sublime Text API Refrence](http://www.sublimetext.com/docs/3/api_reference.html))。

> ただしこの方法にすると、Package Control を使わずに git clone などでインストールしたときに、プラグインでファイルにアクセスできなくなります。ならば最初から .sublime-package を作って、それを公開してしまう手があります。その場合の packages.json は[こちらが参考になります](http://sublime.wbond.net/packages.json)。

* .no-sublime-package ファイルを置く。


参考 URL :
https://github.com/wbond/sublime_package_control/issues/349
Android TextViewを「あいうえおかき…」と省略して1行にまとめる

android:scrollHorizontallyをtrueにしろ、android:linesを1にしろ、android:maxLinesを1にしろ、そして、android:ellipsizeを設定しろ、とネット上にいろいろと情報がありますが、なぜか僕の環境だと「…」を表示してくれませんでした。
その解決方法がわかったのでメモ。

```xml:
<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@drawable/menu_right_text" />
```

このように、singleLineとellipsizeを設定したらいけました。
ちなみに、ellipsizeには以下の設定ができます。

例：あいうえおかきくけこ

|指定値|デフォルト|動作|
|------|:--------:|----|
|none|○|何もしない|
|start||…おかきくけこ|
|middle||あいう…くけこ|
|end||あいうえおか…|
Android　Bitmapをあらかじめ縮小してから読み込む（OutOfMemory対策） 

今の端末だと10Mピクセルを越えるカメラを搭載した端末が普通になってきており、そのファイルサイズも数MBに及びます。
AndroidでBitmapFactoryを利用してフォトライブラリーから画像を読み込んだりすると思いますが、そのままその画像を読み込んでしまうと、しばしば**OutOfMemory**となりアプリが強制終了してしまいます。
そこで、実際に画像を読み込む前にある程度縮小してから読み込むことで、メモリが足りなくなることを防ごうというのが今回のネタです。

##BitmapFactory.OptionsのinSampleSizeを指定して画像を縮小した状態で読み込む
処理の流れ的にはまず画像のサイズを取得して、サイズが大きかったら縮小指定してから読み込もう、という感じです。

 ```java
InputStream inputStream = getContentResolver().openInputStream(data.getData());

// 画像サイズ情報を取得する
BitmapFactory.Options imageOptions = new BitmapFactory.Options();
imageOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, imageOptions);
Log.v("image", "Original Image Size: " + imageOptions.outWidth + " x " + imageOptions.outHeight);

inputStream.close();

// もし、画像が大きかったら縮小して読み込む
//  今回はimageSizeMaxの大きさに合わせる
Bitmap bitmap;
int imageSizeMax = 500;
inputStream = getContentResolver().openInputStream(data.getData());
float imageScaleWidth = (float)imageOptions.outWidth / imageSizeMax;
float imageScaleHeight = (float)imageOptions.outHeight / imageSizeMax;

// もしも、縮小できるサイズならば、縮小して読み込む
if (imageScaleWidth > 2 && imageScaleHeight > 2) {	
	BitmapFactory.Options imageOptions2 = new BitmapFactory.Options();

	// 縦横、小さい方に縮小するスケールを合わせる
	int imageScale = (int)Math.floor((imageScaleWidth > imageScaleHeight ? imageScaleHeight : imageScaleWidth));	

	// inSampleSizeには2のべき上が入るべきなので、imageScaleに最も近く、かつそれ以下の2のべき上の数を探す
	for (int i = 2; i <= imageScale; i *= 2) {
		imageOptions2.inSampleSize = i;
	}

	bitmap = BitmapFactory.decodeStream(inputStream, null, imageOptions2);
	Log.v("image", "Sample Size: 1/" + imageOptions2.inSampleSize);
} else {
	bitmap = BitmapFactory.decodeStream(inputStream);
}

inputStream.close();
```

BitmapFactory.OptionsのinSampleSizeに2のべき上を入れ、それを指定して画像を読み込むことで、2のべき上で縮小された画像を読み込むことができます。
たとえば、inSampleSize=2であれば、 1/2に縮小された画像が、inSampleSize=4であれば、1/4に縮小された画像が読み込まれます。
**inSampleSizeには2,4,8,16と2のべき上を入れます。**


##読み込む画像の階調を指定して読み込む
読み込む際の画像サイズの縮小は解像度だけでなく、階調を変えることでサイズを落とすこともできます。

```java:
BitmapFactory.Options imageOptions = new BitmapFactory.Options();
imageOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
```

設定できる階調は以下です。

* ARGB_8888：alpha/R/G/B 各8bit ー 8*4 = 32bit = 4byte / pixel
* ARGB_4444：alpha/R/G/B 各4bit ー 4*4 = 16bit = 2byte / pixel
* RGB_565：R(5bit)/G(6)/B(5) ー 5+6+5 = 16bit = 2byte / pixel
* ALPHA_8：αのみを8bit ー 8bit = 1byte / pixel

体感的にはアルファー値の無い写真などは、RGB_565とかはそこまで劣化が気にならない程度でサイズが半分になるのでおすすめです。

##まとめ
画像取得系はメモリを消費して大きい画像を取得するとすぐにOutOfMemoryで落ちるので、読み込む前にサイズを小さくしよう！
Qiita用Markdownスニペットを吐き出すシェルスクリプト


ファイルの内容をバッククォートでくくって、拡張子:ファイル名を付け加えるだけのシェルスクリプトです。

```sh:qiita-snipet.sh
#!/usr/bin/env bash

extension=${1##*.}
if [ "$extension" = "$1" ]
then
	type="text"
else
	type="$extension"
fi
echo "\`\`\`$type:$1"
cat $1
echo '```'
```

Macの場合 `pbcopy` にパイプで繋ぐと、クリップボードに入るので、あとはKobitoやQiitaにペーストするだけです:

```
./qiita-snipet.sh tips.php | pbcopy
```
NSJSONSerializationの落とし穴


落とし穴、というかパースする前にはnilチェックしましょうと言う話。

iOS5からJSONを便利に扱えるNSJSONSerializationクラスだが、JSONをパースするためのJSONObjectWithData:options:error:メソッドは、引数として渡すNSDataがnilだと例外を発生させる。

```objective-c:
//パースさせたいNSDataがnilの場合例外が発生する
id jsonObject = [NSJSONSerialization JSONObjectWithData:nil
                                                options:NSJSONReadingAllowFragments
                                                  error:nil];

```

引数にNSErrorのアドレスを渡すことでエラーがセットされるが、これはあくまでパースエラーが起こった場合であり、パースさせたい対象がnilだとパースエラーではなく例外が発生するためにこのエラーでは判断できない。

例外が発生するのならばtry catchで囲むことを考える

```objective-c:
id jsonObject;
@try {
    jsonObject = [NSJSONSerialization JSONObjectWithData:nil
                                                    options:NSJSONReadingAllowFragments
                                                      error:nil];
@catch (NSException *exception) {
    /*…*/
}
```
try catchにより例外発生時に強制終了することはなくなったが、nilの場合に例外が発生していると原因が特定されていて防げるのであれば、下記のようにnilチェックをするだけでよいのではないか

```objective-c:
if (data) {
    id jsonObject = [NSJSONSerialization JSONObjectWithData:data
                                                    options:NSJSONReadingAllowFragments
                                                      error:nil];
  /*…*/
} else {
    /*…*/
}
```

また、try catchをあまり使いたくない理由としては、例外発生時にcatchできようが、tryのコードブロック（スコープ）を抜けてしまうことでコード末尾に辿りつけず、ARC使用時に自動で挿入されたreleaseが実行されないためメモリリークしてしまうため（そのような状況を防ぐにはLLVM コンパイラーのオプションとして "-fobjc-arc-exceptions" につけると良いらしい）。


## 参考
EZ-NET: 例外発生時の ARC 制御
http://program.station.ez-net.jp/special/objective-c/llvm/arc/exception.asp

Google Objective-Cスタイルガイド 日本語訳
http://www.textdrop.net/google-styleguide-ja/objcguide.xml#Avoid_Throwing_Exceptions
iTunes で再生中のトラック情報を、 Tweetbot の新規ツイートにコピペする Applescript

お世話になってた #NowPlaying ウィジェットがAPI1.0で使えなくなったため、Applescript でごにょごにょしてみた。

Tweetbot が Applescript に対応していないため、 iTunes でトラック情報をクリップボードに収めてから、 Tweetbot をアクティブにしてショートカットを実行するという力技。アプリケーションとして保存して、 Alfred とかで呼び出せば OK。クリップボードの中身を書き換えるので、作業中に使う時は注意。

Tweetbot の部分を書き換えれば、他の Twitter クライアントでも行けるはず。（公式の Twitter.app はApplescript に対応してるので、クリップボードを使わなくていいかも）

```applescript:
if application "iTunes" is running and application "Tweetbot" is running then
	tell application "iTunes"
		if player state is playing or player state is paused then
			
			set nowPlayingTrack to current track
			set theAlbum to album of nowPlayingTrack
			set theAlbumArtist to album artist of nowPlayingTrack
			if theAlbumArtist is "" then
				set theAlbumArtist to artist of nowPlayingTrack
			end if
			set theSong to name of nowPlayingTrack
			set the clipboard to "♪" & theSong & " - " & theAlbumArtist & ": " & theAlbum & " #nowPlaying"
			
			tell application "Tweetbot"
				activate
			end tell
			
			tell application "System Events" to keystroke "n" using command down -- New Tweet
			tell application "System Events" to keystroke "v" using command down -- Paste
			tell application "System Events" to keystroke "a" using command down -- Select All
			
		end if
	end tell
end if
```
Windows Haskell でのReadlineの代わり

# Readline
http://hackage.haskell.org/packages/archive/readline/1.0.1.0/doc/html/System-Console-Readline.html

```hs:
import System.Console.Readline
```
とするために、普通は```cabal install readline```としてreadlineをインストールするようですが、Windowsではエラーが出て（というかヘッダファイルがなくて）インストールできませんでした。
なので以下を代替として使用します。

# Haskeline
http://hackage.haskell.org/packages/archive/haskeline/0.6.4.5/doc/html/System-Console-Haskeline.html

Windowsでも```cabal install haskeline```でインストールが出来ます。

```hs:
import System.Console.Haskeline
```

cmd.exeからインストールする際に文字コード関連のエラーが出たのですが、解決方法を探すのも面倒なためCygwinからインストールしました。
しかしどうやらプロンプト上で```set LANG=C```とすると上手くいくようです（未確認）。
Foreman で機密な認証キーなど機密な情報を管理する


## Foremanとは
簡単に言うと、下記のことが出来る

* バックグラウンドで動くプロセスの管理
* 必要な環境変数の管理

## 環境
```
Ruby 2.0.0-p0
Rails 4.0.0.rc1
```

## インストール
```Gemfile
gem 'foreman'
```
* `bundle install` を実行

## 使い方
* 必要な環境変数を `.env` ファイルに

```.env
TW_KEY=asdflaksjzxocuv
TW_SECRET=lkzjxcljvoiuqewrnzoixcvulansdflasdljf
```

* 起動したいプロセスを設定ファイルに

```Procfile
web: bundle exec rails server thin -p $PORT
```

* `foreman start`で設定したプロセスを起動する

* `.env`ファイルに書いた内容を環境変数に設定してくれるイメージなので、ソースには、普通に`ENV['TW_KEY']`を書けば値を取得出来る

## ハマったこと

### `foreman start` を実行しても、リアルタイムのログが出てこない
#### 現象
* `11:59:32 web.1  | started with pid 22383`以外は、他は何のログ的なものが出てこない

#### 原因
* `Ruby` デフォルトが `stdout` をキャッシュしているせいですって
* [Foreman missing output](https://github.com/ddollar/foreman/wiki/Missing-Output)を参照

#### 解決方法
* `[Rails.root]/config.ru` に上記リンクにオプションを追加すればOK

```config.ru
...
# 下記の行を追加
$stdout.sync = true
```
* これで、`foreman start` を実行すると、下記のように、お馴染みの `Rails` 起動されるログが出てくる

```
11:59:32 web.1  | started with pid 22383
11:59:36 web.1  | => Booting Thin
11:59:36 web.1  | => Rails 4.0.0.rc1 application starting in development on http://0.0.0.0:3000
11:59:36 web.1  | => Run `rails server -h` for more startup options
11:59:36 web.1  | => Ctrl-C to shutdown server
11:59:36 web.1  | >> Thin web server (v1.5.1 codename Straight Razor)
11:59:36 web.1  | >> Maximum connections set to 1024
11:59:36 web.1  | >> Listening on 0.0.0.0:3000, CTRL+C to stop
```

## !!注意!!
* `.env`ファイルの内容は`git`などに追加しちゃうのはダメなので、`.env`を`git`の無視リストに追加するほうが
* `config.re` に追加した１行は、他に影響があるかどうかは調べてないので、自己責任で

## 補足
* Procfileについて
    * `web:` はラベル的なものなので、自分が好きなものでいい
    * `Heroku` でも使える為に `-p $PORT` オプションを付いていますが、 `Heroku` でない場合は、普通に `bundle exec rails server` 書けばOK。詳細の設定については、参考リンクの[Heroku profile](https://github.com/herokaijp/devcenter/wiki/procfile)を参照

* `foreman check`で設定内容をチェック出来る。`valid procfile detected…`の文言が出来ればOK


## 参考
* [Railscasts #281](http://railscasts.com/episodes/281-foreman?language=ja&view=asciicast)
* [Foreman missing output](https://github.com/ddollar/foreman/wiki/Missing-Output)
* [Heroku profile](https://github.com/herokaijp/devcenter/wiki/procfile)
Qiitaに要望:コードを折りたためるようにしてほしい

コード部分の右上あたりにボタンつけて折りたためるようにしてくれると助かるなー
便利だなーと思ったので

折りたたむとこんな感じで

```cpp:main.cpp
```

展開するといつもどおりの表示

```cpp:main.cpp
#include <iostream>
using namespace std;

int main(void){
	cout << "Hello,world"<<endl;
	return 0;
}
```