OmniAICreator/Qiita-1.07M huggingface dataset:
Haxe/Nekoでコマンドラインツール制作入門

Haxeでは制作できるのは、JavaScriptや、Flash、スマホアプリだけではありません。Neko出力を使うことで簡単にコマンドラインツールを制作することが出来ます。

FlashDevelopにはHaxe/Nekoのプロジェクトがあるので、これを選択することで簡単にHaxe/Nekoのツールを制作することができます

#こんにちは！！

srcフォルダに以下のようなHaxeファイルを書きます。

```hx:src/Main.hx
class Main {
    static function main(){
        Sys.println( "こんにちは！！" );
    }
}
```

##HaxeからNekoへコンパイルする。
コマンドラインからコンパイルする場合、以下のようなコマンドを使います

```bat:
haxe -cp [ソースの入ったフォルダ] -main [メインクラス] -neko [出力ファイル(*.n) ]
```

例:

```bat:
haxe -cp src -main Main -neko test.n
```

##生成したNekoファイルを実行する。

さきほどの例で生成したtest.nファイルは以下のコマンドで実行できます。

```bat:
neko test.n
```

```
こんにちは！！
```

#基本的な使い方


##標準出力

```hx:
class Main {
	static function main() {
		Sys.print( "Hello, " ); //Helloを出力
		Sys.println( "World" ); //Worldを出力して改行
	}
}
```

##パラメータを取得

Sys.args()関数を使うことで、パラメータとして与えられた文字列を取得することが出来ます。

```hx
class Main {
	static function main() {
		var args = Sys.args();
		Sys.println( args[0] + ", " + args[1] );
	}
}
```

コマンドを実行すると

```bat:
neko Test.n -hoge fuga
```

以下のような出力がされます

```text:
-hoge, fuga
```

##標準入力
```hx:
import haxe.io.Input;

class Main {
	static function main() {
		var input:Input = Sys.stdin();
		
		input.readLine(); //標準入力を一行読み込み
		input.readAll();  //標準入力を最後まで読み込み
	}
}
```

##ファイル操作

```hx:
import haxe.io.Output;
import sys.FileSystem;
import sys.io.File;

class Main {
	static function main() {
		if ( FileSystem.exists( "tmp" ) ) { //ファイルの有無を調べる
			if (! FileSystem.isDirectory( "tmp" ) ) { //ディレクトリかどうかを調べる。
				FileSystem.deleteFile( "tmp" ); //ファイルを消去
				FileSystem.createDirectory( "tmp" ); //ディレクトリを作成
			}
		}else{
			FileSystem.createDirectory( "tmp" ); //ディレクトリを作成
		}
		
		var file:Output = File.write( "tmp/Main.hx" ); //ファイルへの書き込みを開始。
		
		//ファイルへの書き込み
		file.writeString( 
			"class Main{ static function main(){ Sys.println( \"hello\" ); } }"
		);
		
		file.close(); //ファイルへの書き込みを終了
		
		//コマンドを実行
		Sys.command( "haxe", ["-cp","tmp","-main","Main","-neko","tmp/Hello.n" ] );
	}
}
```
バックアップにBakthatいいんじゃね？

# バックアップに思いを馳せる日々...

精神が勝手に汚濁している毎日、
バックアップどうすりゃいいんだと考える毎日。

探してたら[Bakthat](https://github.com/tsileo/bakthat)というものを見つけた。
指定したディレクトリを暗号化し、また
S3 or Glacierにバックアップする機能もついている。

[Bakthat ドキュメント](http://docs.bakthat.io/en/latest/)

## bakthat インストール

まずは環境構築をしよう。
botoを利用しているので、環境はPython 2.x系じゃないといけない。
今回は2.7.5で動作確認をしている。

* (S3/Glacierを利用してバックアップするのにbotoを利用している。)

```
> mkdir -p ~/Sandbox/bakthat
> cd ~/Sandbox/bakthat
> virtualenv-2.7 .venv
> source ~/.venv/bin/activate
> easy_install bakthat
> rehash
```

# S3へのバックアップを行なってみる

安くて安心なバックアップ先でクラウドで〜となるとS3しかない…
リージョン3つに跨ってバックアップとかS3してるし。
時間経てばGlacierに転送しちゃうみたいなのも可能だし。

## AWS側の設定

AWS S3のAPI_KEY, API_SECRET_KEYについて必要なので用意しておく。
準備するには[AWS IAM](http://aws.amazon.com/jp/iam/)でS3にバックアップするためのユーザーを作成して、
テスト用のユーザーを作成するのがオススメ。

作成方法については省く。(時間があればスクショ取ります)

## bakthatの初期設定

以下のコマンドを打ち込むと、
対話状態になる。その時にAWS_KEY, API_SECRET_KEYを入力する。
またデフォルトのバックアップ先設定はS3向けにしとけばいいので
(S3バケットの設定でGlacierに飛ばすとかやればいいし)
そうしといた。

```
> bakthat configure
> AWS Access Key: XXXXXXXXXXXXXXXXXXXXXXXX
> AWS Secret Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
> S3 Bucket Name: bakthat-test
> Glacier Vault Name: bakthat-test
> Default destination (s3):
> Region Name (us-east-1): us-west-2
> Config written in /Users/matsuzakikeiji/.bakthat.yml
> Run bakthat configure_backups_rotation if needed.
```

# bakthatによるバックアップテスト

## バックアップ用のテストファイル作成

バックアップをテストしたいので、
テストに利用したいディレクトリを作成する。

```
> mkdir -p ~/Sandbox/bakthat/hoge
> cd ~/Sandbox/bakthat
```

作成したhogeディレクトリに適当なファイルを作成しよう。

```
> echo "こんにちは..." > hoge/poem.txt
```

## ほいじゃバックアップ

以下のコマンドを打ち込むとバックアップが開始される。
その時、ファイルを暗号化するためのパスワード入力を促される。

```
> bakthat backup
```

![bakthat backup](https://dl.dropboxusercontent.com/u/614755/qiita/bakthat/screen-2.png)

## バックアップされているか確認

AWS Management console上からバックアップされてるか確認してみる。
さっそくアクセス。

![S3 backup](https://dl.dropboxusercontent.com/u/614755/qiita/bakthat/screen-3.png)

あった。バックアップされてる！よかった。

## リストアに挑戦

バックアップに利用したhogeディレクトリを削除してリストアしてみよう。

```
> rm -rf hoge
```

その上で、bakthatによってリストアを試みる。
リストア時に、バックアップ時に入力した暗号化キーの
入力を促されるので入力する。

```
> bakthat restore hoge
```

![S3 restore](https://dl.dropboxusercontent.com/u/614755/qiita/bakthat/screen-4.png)

リストアされてる！

![cat poem.txt](https://dl.dropboxusercontent.com/u/614755/qiita/bakthat/screen-5.png)

ポエムもバッチリだ。

# 感想

似たツールに[s3cmd](https://github.com/s3tools/s3cmd)があるけど、
バックアップする先のバケットを一つに絞っておいて、あとは
適当に```bakthat backup```コマンドを適当に打つだけなので個人的には
bakthatのがいいかな〜と思ってる。

細かいバックアップ調整(ディレクトリやら作成バケット名やらリージョン選択)とかしたければ、
[boto](https://github.com/boto/boto)やら[aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby)使えばいいし。
Hashの再構築

mapはHashではなくArrayを返す.(当たり前だけど)

```rb:
h = {"a"=> 1, "b"=>2}
h.map{|k, v| [k.upcase. v] } => [["A", 1], ["B", 2]]
```

hがHashだとわかっているならこういうコードが手っ取り早い.

```rb:
Hash[h.map{|k, v| k = k.upcase; [k, v] }]
=> {"A"=>1, "B"=>2}
```
RhodeCodeでPull Requestするとエラーになるのでアドホックパッチ

[RhodeCode](http://rhodecode.org/)でPull Requestするとエラーが起きて、以下のログが出力されました。
`UnicodeEncodeError`なのでpythonで定番のstrとunicodeを混ぜてしまったパターンです。
このとき`production.ini`で`lang=ja`を設定して日本語表示にしていたのですが、もしやと思い`lang=en`にするとPull Requestは成功しました。

```text:
[error] 2013-07-26 00:55:06.550 ERROR [rhodecode.controllers.pullrequests] Traceback (most recent call last):
[error]   File "/home/rhodecode/rhodecode-venv/lib/python2.7/site-packages/rhodecode/controllers/pullrequests.py", line 340, in create
[error]     other_ref, revisions, reviewers, title, description
[error]   File "/home/rhodecode/rhodecode-venv/lib/python2.7/site-packages/rhodecode/model/pull_request.py", line 87, in create
[error]     pull_request=new
[error]   File "/home/rhodecode/rhodecode-venv/lib/python2.7/site-packages/rhodecode/model/changeset_status.py", line 135, in set_status
[error]     text='Auto status change to %s' % (ChangesetStatus.get_status_lbl(status)),
[error]   File "/home/rhodecode/rhodecode-venv/lib/python2.7/site-packages/pylons/i18n/translation.py", line 42, in __str__
[error]     return str(self.eval())
[error] UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
```

Tracebackであやしそうな`ChangesetStatus.get_status_lbl(status)`の処理を追うとgettextを使っているので当たりです。
`lang=en`ではASCIIコードの範囲内なのでstrでも動くのですが、他の言語ではASCIIコードの範囲外になるので予想通りのパターンです。
以下のパッチのようにフォーマット文字列をunicodeにすると運良くPull Requestが動くようになりました。

```diff:rhodecode/model/changeset_status.py
--- rhodecode/model/changeset_status.py.orig    2013-06-16 12:58:07.000000000 +0900
+++ rhodecode/model/changeset_status.py 2013-07-26 01:39:31.683912780 +0900
@@ -132,7 +132,7 @@
         if not comment:
             from rhodecode.model.comment import ChangesetCommentsModel
             comment = ChangesetCommentsModel().create(
-                text='Auto status change to %s' % (ChangesetStatus.get_status_lbl(status)),
+                text=u'Auto status change to %s' % (ChangesetStatus.get_status_lbl(status)),
                 repo=repo,
                 user=user,
                 pull_request=pull_request,

```

※追記
本家にバグ報告したらさくっと[取り込まれました](https://secure.rhodecode.org/rhodecode/changeset/7baea802f739c2af885e98865c1a5ad8ccfeab10)。
次回以降のバージョンでリリースされると思います。
LWP::UserAgentでHTTPSプロキシ越しに通信する (LWP::Protocol::connect編)

# 概要

LWP::UserAgent(__バージョン6.06未満__)でプロキシ越しにHTTPS通信をやろうとすると、何も考えずに設定すると

```
GET https://example.com/index.html
```

のように、CONNECTメソッドを使わずhttpsスキームのリクエストURLをそのままプロキシに投げてしまう。
このようなリクエストはSquidなどのプロキシではサポートされておらず、エラーになってしまう。
(Apache mod_proxyならイケるっぽい？)

[「LWP::UserAgentでHTTPSプロキシ越しに通信する」](http://qiita.com/debug-ito@github/items/4b3fec645f15af9b4929)の投稿では、環境変数を設定することでCONNECTメソッドを有効にした。

今回は、[LWP::Protocol::connect](https://metacpan.org/module/LWP::Protocol::connect)モジュールを使ってCONNECTメソッドを使う。


# 検証環境

- Ubuntu 12.04.2
- perl 5.14.2
- IO::Socket::INET6 2.71
- IO::Socket::IP 0.22
- IO::Socket::SSL 1.953
- LWP::UserAgent 6.05
- LWP::Protocol::connect 6.03
- LWP::Protocol::https 6.02
- Net::HTTPS 6.04

# サンプルコード

```perl:proxy_connect.pl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;

my $ua = LWP::UserAgent->new;
$ua->proxy('https', 'connect://localhost:3128/');

## ** If you want to disable peer verification (NOT RECOMMENDED)
## $ua->ssl_opts(verify_hostname => 0);

## ** If you want to explicitly specify the directory containing CA certificates.
## $ua->ssl_opts(SSL_ca_path => '/etc/ssl/certs');

my $req = HTTP::Request->new('GET', 'https://metacpan.org/module/LWP::UserAgent');
my $res = $ua->request($req);

print $res->as_string, "\n";
```

# ポイント

`LWP::Protocol::connect`をインストールした状態で、

```perl
$ua->proxy('https', 'connect://PROXY_HOSTNAME:PORT');
```

を設定する。

`LWP::Protocol::connect`は`connect://`という独自スキームを使うので、これだけだと一般的な環境変数の設定を解釈できないのが玉にキズではある。


# ハマりどころ

上記のサンプルコードを実行すると、以下のようなエラーが出ることがある。

```
Bad arg length for Socket6::unpack_sockaddr_in6, length is 16, should be 28 at /usr/lib/perl5/Socket6.pm line 282.
```

これは`IO::Socket::INET6`のバグ: https://rt.cpan.org/Public/Bug/Display.html?id=68282
(さらに元をたどると`IO::Socket`のバグらしい)

`IO::Socket::IP`をインストールすると直る。これは、`IO::Socket::SSL`が`IO::Socket::IP`を優先して使うため。


## 参考: 各モジュールの使役関係

- 同じレベルの`->`は **「いずれかを選択して使う」** という意味
- 継承関係を表すわけではないので注意！
- 間違いがあったらご指摘お願いします

```
LWP::UserAgent 
-> LWP::Protocol::connect
   -> LWP::Protocol::https::connect
      -> LWP::Protocol::https
         -> Net::HTTPS
            -> IO::Socket::SSL
               -> IO::Socket::IP
               -> IO::Socket::INET6
               -> IO::Socket::INET
            -> Net::SSL
               -> IO::Socket::INET + Crypt::SSLeay
```
Xamarin Studio/Visual Studio for Mac で複数のソリューションを開く方法

わかりにくいのでメモっておきます。 Visual Studio for Mac でも使えました。

### 1. ソリューションをひとつ開く

![](http://blog.amay077.net/assets/images/posts/open_multi_solution_in_xamarin_studio_04.png)

### 2. ２つ目のソリューションを開く 

![](http://blog.amay077.net/assets/images/posts/open_multi_solution_in_xamarin_studio_03.png)

ファイル選択ダイアログで ``.sln`` ファイルを選択して・・・、

![img1](http://blog.amay077.net/assets/images/posts/open_multi_solution_in_xamarin_studio_01.png) 
左下の「Options」を展開し、「Close current workspace」のチェックを **外す**

### 3. すると２つ目のソリューションが追加されてます。 

![img1](http://blog.amay077.net/assets/images/posts/open_multi_solution_in_xamarin_studio_02.png)

ソリューションを新規作成する時には行えないようです。
分かりにくいよママン。
Vagrant基本コマンド


###Box追加
```terminal Command
$ vagrant box add precise32 \
    http://files.vagrantup.com/precise32.box
```

名前：precise32
追加元：http://files.vagrantup.com/precise32.box

box list
http://www.vagrantbox.es/

###Box list表示
```terminal Command
$ vagrant box list
```

###初期化
```terminal Command
$ vagrant init
```
###sshログイン
```terminal Command
$ vagrant ssh
```
###仮想マシン起動
```terminal Command
$ vagrant up
```
###仮想マシン停止
```terminal Command
$ vagrant halt
```
###仮想マシン再起動
```terminal Command
$ vagrant reload
```
###仮想マシン削除
```terminal Command
$ vagrant destroy
```
###仮想マシンの状態確認
```terminal Command
$ vagrant status
```
###仮想マシンスリープ
```terminal Command
$ vagrant suspend
```
###仮想マシンスリープ解除
```terminal Command
$ vagrant resume
```

#随時追加予定
ansible pyenvを使った環境に依存しないインストール

```bash:install

# pyenvするのに必要なパッケージ
sudo yum install -y vim-enhanced gcc gcc-c++ make git patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel

# pyenv インストール
cd ~
git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
. ~/.bash_profile

# pyenvで python 2.7.5 を入れる
VERSION=2.7.5
pyenv install $VERSION
pyenv rehash
pyenv global $VERSION

# ansibleに必要なモジュールをpipで入れる
pip install paramiko jinja2 PyYAML pycrypto markupsafe

# ansible のインストール
cd ~
git clone git://github.com/ansible/ansible.git
cd ansible
# 環境変数設定
. ./hacking/env-setup
echo ". ~/ansible/hacking/env-setup -q" >>~/.bashrc
```
UIViewのframe指定での移動をちょっとだけ楽にする

iPhoneアプリを作ってる際によくUIViewを移動させることが多いです。（私だけかも知れません）

sizeを変更しないでx,y座標だけを変更する場合に

```objc:
// UIViewの座標をx = 100, y = 50に動かしたい場合
UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view.frame = CGRectMake(100, 50, view.frame.size.width, view.frame.size.height);
```
と書けば動きますが、めんどくさい！（と思っても4回ぐらい上の用に書いてます。）

めんどくさいので思い腰を上げた結果
Category作って多少楽になりました。

```objc:
// UIView+Util.h
@interface UIView (Util)
-(void) moveBy:(CGPoint) point;
-(void) moveTo:(CGPoint) point;
@end

// UIView+Util.m
-(void) moveBy:(CGPoint)point {
    self.frame = (CGRect){.origin = point, .size = self.frame.size};
}
-(void) moveTo:(CGPoint)point {
    CGPoint nowPoint = self.frame.origin;
    self.frame = (CGRect){.origin.x = nowPoint.x + point.x, .origin.y = nowPoint.y + point.y, .size = self.frame.size};
}
```

使い方は至って簡単

```objc:
#import "UIView+Util.h"
UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[view moveBy:CGPointMake(100, 50)];

```

あーちょっと楽になった気がするー
Vagrantの便利機能メモ


『入門Chef Solo』１周読んだ後に、ドットインストール「Vagrant入門」を学習して知った便利機能についてメモ

##1.共有フォルダ

Vagrantの初期化を行ったディレクトリが、仮想OSとの共有フォルダになっている

```
#Vagrantの初期化を行ったフォルダ
$ pwd
/var/root/centos

#ファイル一覧
$ ls
.vagrant     Vagrantfile  provision.sh

#仮想OSにログイン
$ vagrant ssh

#下記、フォルダが共有フォルダになっている
$ cd /vagrant/

#Vagrantfileがあることがわかる
$ ls
provision.sh  Vagrantfile

#試しにファイルを作成してみる
$ sudo touch test

#仮想OSをログアウト
$ logout

#ホスト側で作成したファイルを確認できた
$ ls
.vagrant     Vagrantfile  provision.sh test
```

##2.Provisioning
Provisioningで、仮想マシンが立ち上がったあとに実行される処理を指定できる
講義内でも言われてたがChefと機能が被りそうだけど、
プロジェクト内に既存のセットアップシェルなどがあれば、こっちのがお手軽そうではある

####(1)起動時にシェルを実行する
Vagrantfileに以下、設定を追加する
　config.vm.provision :shell, :inline => "コマンド"

```
#編集
$ vi Vagrantfile
〜中略〜
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "centos"
  config.vm.provision :shell, :inline => "echo hello world"　←　追加
〜中略〜

#仮想OS起動
$ vagrant up
〜中略〜
[default] -- /vagrant
[default] Running provisioner: shell...
[default] Running: inline script
hello world　←　コマンドが実行された
```

###(2)ファイルを読み込ませる
Vagrantfileに以下、設定を追加する
　config.vm.provision :shell, :path => "ファイルパス"

```
#ファイル作成
#学習内容通り、Apacheインストールから起動まで
$ vi provision.sh
sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on

#編集
$ vi Vagrantfile
〜中略〜
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "centos"
  config.vm.provision :shell, :path => "provision.sh"　←　追加
〜中略〜

#仮想OS起動
$ vagrant up

#仮想OSにログイン
$ vagrant ssh

#Apache起動確認
$ sudo service httpd status
httpd (pid  2382) is running...
```

##3.起動中の仮想サーバからBox作成

```
#起動中の仮想OSはシャットダウンされてしまうので注意!!
$ vagrant package
[default] Attempting graceful shutdown of VM...
[default] Clearing any previously set forwarded ports...
[default] Creating temporary directory for export...
[default] Exporting VM...
[default] Compressing package to: /private/var/root/centos/package.box

#package.boxが作成されている
$ ls
.vagrant     Vagrantfile  package.box  provision.sh
```

以上
ti.ui.defaultunitをdipにした場合の取得サイズ

完全なる未検証のメモ。今後時間ができたら検証していく。

iOS と Android 両対応のアプリを Titanium Mobile で作る場合、単位系の指定は **dp** 一択だと思う。（オレ調べ）

その場合、いちいち TSS とかに `dp` と書くのは面倒なので、`tiapp.xml` にこんな指定をすると思う。少なくとも僕はしてる。

```xml:tiapp.xml
<property name="ti.ui.defaultunit" type="string">dip</property>
```

これでデフォルトの単位が **dp** になり、いちいち **dp** って書かなくていいぞヒャッホーーーー！！・・・と言いたいところなんだけど、プロパティやメソッドによっては、システムデフォルトユニットでしか取れないものも存在する。ちなみにシステムデフォルトユニットは、iOSが **dp** で、Android は **px** です。

それがかなりややこしかったので、とりあえず今ハマってるところだけでもメモしておく。

|メソッド・プロパティ|iOS|Android|備考|
|:----|:----|:----|:----|
|Alloy.PA.View.deviceWidthとHeight|dp|px| |
|view.rect.xとかwidthとか|dp|dp|Android自信なし|
|touchmoveとかのイベントxやy|dp|px| |
|ImageView.toBlog().widthとかheight|px|px| |
Ruby C拡張でプロファイルをとる

google-perftools を使うのがおすすめ.

```sudo aptitude install libgoogle-perftools-dev```

```
$ LD_PRELOAD=/usr/lib/libprofiler.so > profile.out ruby examples/hoge.rb 
^CBye.
PROFILE: interrupts/evictions/bytes = 12/0/164
$ google-pprof --dot `which ruby` ./profile.out > prof.dot
Using local file /usr/local/bin/ruby.
Using local file ./profile.out.
$ dot -T png prof.dot > prof.png
$ eog prof.png 
```

部分的に取得したいとき

```
#include "google/profiler.h"

//とりたいとこでかく
ProfilerStart("profile.out");
...
ProfilerStop();
```

callgrind でみたいとき

```
$ sudo aptitude install kcachegrind
$ google-pprof --callgrind `which ruby` ./profile.out > prof.callgrind
```
helm-mode 有効時でも helm-find-files は無効にする

既存のコマンドを Helm インターフェイスに置き換える方法として `(helm-mode 1)` とする方法があります． execute-extended-command (M-x) などを置き換えると非常に便利なのですが， find-file (C-x C-f) や write-file (C-x C-w) は Helm が便利だと感じたことがありません．

helm-mode を有効にしているときでも find-file はデフォルトのものを使いたい場合は .emacs に以下を記述します．

```common-lisp
(require 'helm-mode)
(helm-mode 1)
;;; 処理を変更したいコマンドをリストに登録していく
(add-to-list 'helm-completing-read-handlers-alist '(find-file . nil))
```
Rubyコードでgdb使う

特別なことはしない。

gdb rubyで起動して、r <ファイル名>でできる。

```
$ gdb ruby
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /usr/local/bin/ruby...done.
(gdb) r examples/hello.rb 
```
GitHubレポジトリにあるファイルや特定行のリンク貼る時に知っておきたい唯一のこと


GitHub内やチャットサービス等他のサービスでGitHubレポジトリにあるファイルや特定行のリンクを貼ることが多々あると思われます。

具体的なシチュエーションとしては、


> ビル: なぁなぁジョン、この前直したいって言ってたコードってどこだっけ？

> ジョン: あぁ、ここやで → *ぎっはぶのリンク*

みたいな時です。

その時に以下の様なリンクを貼るのはとても残念です

```
https://github.com/account_name/repo_name/blob/master/file_name
```

残念な場所がどこかというと

`master` というところです。

先ほどのリンクが何を意味してるかというと、

> master branchのHEADのfile_nameファイル

です。

master branchのHEADというのは時と場合によってもちろん変わるので、数カ月後先ほどのビルとジョンのやりとりを見れば、ジョンがどこのコードのことを言ってたのかがすごい分かりにくいです。


その問題を解決するには

```
https://github.com/account_name/repo_name/blob/master/file_name
```

ではなく、

```
https://github.com/account_name/repo_name/blob/7d7c9f4d6b57671117e97d48c7434b504db28a25/file_name
```

のように、具体的なコミットの時のfile_nameのリンクを貼るべきです。


ただGitHubで、その時のHEADのcommitの状態にしてからファイルを探す〜ってやってると超めんどくさいです。


そんなめんどくさがりのあなたのためにとっておきのショートカットキーがあります

![railsGemfile at master · railsrails · GitHub 2013-07-27 18-06-42.jpg](https://qiita-image-store.s3.amazonaws.com/0/4163/d24a2bbb-1a94-9d75-2a21-601c70e219f4.jpeg "railsGemfile at master · railsrails · GitHub 2013-07-27 18-06-42.jpg")

が、

`y`を押すと

![スクリーンショット 2013-07-27 18.07.46.png](https://qiita-image-store.s3.amazonaws.com/0/4163/54dd4355-50b9-57fe-c9dc-2b64ae031249.png "スクリーンショット 2013-07-27 18.07.46.png")


になります！


これでどんな時においても正確な情報を伝達することが可能になります！ :smile:
vim起動とともにファイルをタブ表示

```Bash
$ vim -p *.php
```

windowsだと、shell:sendto にgvim.exeのショートカットをおいておき、
プロパティで、 `gvim.exe` の箇所に `gvim.exe -p`と書いておくと、
複数ファイルをgvim.exeに送って最初からタブ表示できます。
vinelinux インストール

最小インストール後。

```Bash
$ dhclinet eht0
$ apt-get install openssh-server openssh-clients
$ /etc/init.d/apache2 start
$ apt-get install apache2
$ apt-get install git
```


sudo /etc/init.d/network start


## apacheでphpが使えないとき

```Bash
/sbin/update-alternatives --config apache2 
```

## mysqlのインストール

```Bash
sudo apt-get install MySQL-client MySQL-server
```

## pipのインストール

```bash:
$ sudo apt-get install python-pip python27-devel
```
sphinx覚書

themeの追加 (twitter-bootstrap)
====

* [twitter-bootstrapテーマ](https://pypi.python.org/pypi/sphinx-bootstrap-theme/)を使ってみる。

* [サンプルページ](http://ryan-roemer.github.io/sphinx-bootstrap-theme/examples.html)
* [サンプルrst](http://ryan-roemer.github.io/sphinx-bootstrap-theme/_sources/examples.txt)

```bash:
$ sudo pip install sphinx_bootstrap_theme
```

```Python:conf.py
import sphinx_bootstrap_theme
html_theme = 'bootstrap'
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
html_theme_options = {"bootswatch_theme": "united"}
```

```bash:
$ make html
```

themeの修正
====

1. 読み込んでいるcssの一つがbasic.cssとする。
1. 現在使われている `basic.css` を `_static/basic.css` にコピー
1. 修正して `make html` すると反映されていることを確認できる。


独自タグの使用
====

出力したhtmlをphpなどで文字列の置換を行う。

* %%TAG_START%%文章%%TAG_END%% というように任意のタグでくくったものを出力させ、別言語で文字列置換したものを生成する。

例:

```php
$html = preg_relace('%%TAG_START%%','<font color="red">',$html);
$html = preg_relace('%%TAG_EMD%%','</font>',$html);
```

* {%だと、\<span\>{\<span\>% に展開される場合があったので見づらいけど%%が無難。


インストール
====

```Bash:mac
easy_install sphinx
```

```Bash:vine_linux
apt-get install python-sphinx
```

書式
====

* http://people.ee.ethz.ch/~creller/web/tricks/reST.html

```
====
見出し
====

h1
====

h2
----

h3
++++

|   改行した時、<br>扱い。code-blockを頻繁に使う場合、 | を行頭に持ってきたほうがrstファイル上で判別しやすい。

.. code-block:: bash

    ping 8.8.8.8

```

* h2は表示されないので使わない方がいい。
* 見出し は目次に使われるが、コンテンツには出力されない。

便利と思った機能
====

* 自動見出し作成
* rstファイル上でcode-block 〜 次のcode-block までのコマンドの区切りがわかりやすい。
* pandocで markdown を html出力させて使うよりも、テンプレートの用意が楽。


# sphinxで出力したepubの文字化け対応

conf.py に `epub_language = 'ja'` を追加すればよい。
【Qiita要望】投稿時に投稿記事のライセンスを明記/選択できるようにしてもらえると助かります

技術的なTipsを投稿してないので申し訳ないです…

# 投稿時にライセンス明記できるとうれしい

Qiitaへの投稿規約についてしっかり確認していないのですが、
もし問題がなければ、[github](https://github.com/)が最近サポートしてるライセンス選択のようにできると
うれしいかな、と思います。

![スクリーンショット 2013-07-27 22.36.29.png](https://qiita-image-store.s3.amazonaws.com/0/3985/0822cc44-e4b0-2927-bda7-724cd1c28807.png)

う(づ|ず)らさんが[このような内容のツイート](https://twitter.com/udzura/status/361116460451500032)してたので投稿してみました。
カンマフォーマット

[cognitomさんの投稿](http://qiita.com/cognitom/items/1225da93174ce1721b2a#comment-b6b4b387ef52d4a0f09b)にコメントしたやつ。

```coffeescript:
numberFormat = (n, r)-> (n = "#{n}") and (r = if r? then "#{n[-3..]},#{r}" else n[-3..]) and (n = n[0...-3]) and arguments.callee(n, r) or r
```

使うときの引数は1個だけで。


----------------------------------
追記
もう一個思いついたけどこっちはかなり遅い。

```coffeescript:
numberFormat = (n)-> (n = "#{n}") and (((v + n[k]) for v,k in ((if w % 3 or w == n.length then "" else ",") for w in [1..n.length]).reverse())).join("")
```
Xamarin.iOS でジェスチャを認識する

[Xamarin.iOS](http://xamarin.com/) でも ``UIGestureRecognizer`` が普通に使えるわけですが、Objective-C に比べてコードが短く書けて感動した話です。

本日の Obj-C の先生はこちら。

* [Gesture Recognizers 〜簡単にタッチ操作を検知 | iPad Techfirm Lab ](http://labs.techfirm.co.jp/ipad/cho/466)

このサンプルを Xamarin.iOS に移植してみます。

## サンプルコード

```cs:GesturesSample_ViewDidLoad.cs
// Tap gesture
this.View.AddGestureRecognizer(new UITapGestureRecognizer(tap => 
{
    Debug.WriteLine("Double Tap.");
}) 
{ 
    NumberOfTapsRequired = 2 // Double tap 
});

// Drag(Pan) gesture
this.View.AddGestureRecognizer(new UIPanGestureRecognizer(pan => 
{
    var p = pan.TranslationInView(this.View);
    var v = pan.VelocityInView(this.View);
    Debug.WriteLine("Pan. transration:{0}, velocity:{1}", p, v);
}));

// Pinch gesture
this.View.AddGestureRecognizer(new UIPinchGestureRecognizer(pin => 
{
    var scale = pin.Scale;
    var v = pin.Velocity;
    Debug.WriteLine("Pinch. scale:{0}, velocity:{1}", scale, v);
}));

// Swipe gesture
this.View.AddGestureRecognizer(new UISwipeGestureRecognizer(sw => 
{
    Debug.WriteLine("Swipe.");
}));

// Rotate gesture
this.View.AddGestureRecognizer(new UIRotationGestureRecognizer(ro => 
{
    var rotation = ro.Rotation;
    var v = ro.Velocity;
    Debug.WriteLine("Rotate. rotation:{0}, velocity:{1}", rotation, v);
}));

// Long press gesture
this.View.AddGestureRecognizer(new UILongPressGestureRecognizer(lp => 
{
    Debug.WriteLine("Long press.");
}));
```

ViewController 全体のソースは [コチラ](https://gist.github.com/amay077/6094422)

元のサイトのサンプルコードは 70行弱ありますが、Xamarin.iOS では 45行くらいで書けました。しかも、GestureRecongnizer の登録とハンドラが同じ場所に書けるので見やすい。

しかしこれ、ハンドラとか GesutureRecognizer、破棄しなくていいのかなあ。。。
【Unity】【NGUI】NGUIにVirtual Joystick(NGUI用)を追加してみた

NGUIではdepthなどいろいろ問題があるようなので
このままStandard Asset(mobile)のSingle Joystickが使えません。
なにか方法はないかと探したところNGUIでも
Packgeを追加だけで仮想Joysitckで動かす方を見つかったので紹介します。
これを動かすためにソース読んだり資料がまったくなかったので
時間食ってしまった;;

#開発環境
NGUI 2.6.3
NGUI Joystick.unitypackage(添付ファイル)
Unity4

#手順
1. NGUI インポート
2. Asset -> Import Pacakge -> Custom PackageからNGUI Joystick.unitypackageをインポート
3. インポートするとProject ViewからNGUIフォルダーの中にRobotsNGUIフォルダーがあることを確認
![1.png](https://qiita-image-store.s3.amazonaws.com/0/18411/60cebcbe-20f8-e954-16b7-470af0ae7aaf.png)
4. RobotsNGUI -> joysticktest ->NGUIjoystickでシーンをロードしてみる
![2.png](https://qiita-image-store.s3.amazonaws.com/0/18411/410d29a8-4843-6d3f-b110-1106aa10528d.png)
5. これで実行すると仮想Joystickが動きます。
6. 動きが確認できればHirerarchy ViewからUI Root (2D)の中でJoysitc ゲームオブジェクトだけ取ります。
7. Joysitcームオブジェクトをマウス右側クリックでコピーして追加したシーンにペスト(Tag名はJoystickで追加)
8. 動かすスクリプトを作る前にこの方向を決め手はなにか説明しますね。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/18411/26653b24-43df-20d7-c091-e219ca488c31.png)

9. 画像にUIJoystic(Script)と書いてあるPositionが方向をあらわします。値は-1から1までです。
一番左に向くと-1右は1になります。上下も同じ!
10.スクリプトを追加します。

```csharp:Player.cs
    UIJoystick joystick;
 
    void Start() {
        this.joystick = GameObject.FindGameObjectWithTag("Joystick").GetComponent<UIJoystick>();
    }

    void Update() {

        if (this.joystick.position.y > 0)
        {
            transform.position += new Vector3(0, _speed * Time.deltaTime, 0);
        }
        else if (this.joystick.position.y < 0)
        {
            transform.position -= new Vector3(0, _speed * Time.deltaTime, 0);
        }
        if (this.joystick.position.x > 0)
        {
            transform.position += new Vector3(_speed * Time.deltaTime, 0, 0);
        }
        else if (this.joystick.position.x < 0)
        {
            transform.position -= new Vector3(_speed * Time.deltaTime, 0, 0);
        }
    }
````

これで完成ですね。Tag名がJoystickのゲームオブジェクトからUIJoysitckを探し、
その中の方向(joystic.position)で動きを定められます。
要注意は値が-1から1の間ということです。

#参考
http://www.tasharen.com/forum/index.php?topic=55.0
http://sekainonaka.tistory.com/180
http://blueasa.tistory.com/895
git hookでサイトを更新、やってみた


gitで自鯖のレポジトリにpushがあったら、
同じく自鯖にあるhtmlを更新したい。

(github-hookはちょっと前にやったけど、こっちは初めてだった)

## git hook

git hookは、gitが持っている「コミットされたらなんかする」系の仕組み。

- [Git - Git フック](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)

開発環境側で「コミットする直前」とか、
サーバーの側で「プッシュされた直後」とか、
いろんなタイミングで、決まったshell scriptを実行できる。

shell scriptは、```.git/hooks```に置く仕組みになっている模様。

今回は、この **サーバーサイドフック**の、 **post-receive**を使ってみる。

## 設定する
クライアントサイドでやる作業はなし。

サーバー側でやる作業はだいたいこんな感じ。

```bash
# gitレポジトリへ移動
cd git/my-website.git

# post-receiveのスクリプトを設置
vi .git/hooks/post-receive

# 実行権限付ける
chmod +x .git/hooks/post-receive
```
スクリプトは、今回はこのくらいシンプルに。
```--git-dir=.git```は付けないと怒られました。

```.git/hooks/post-receive
#!/bin/sh

cd /home/fnobi/sites/my-website
git --git-dir=.git pull
```

これで完了。
　
```git/my-website.git```へpushがあったら、
```/home/fnobi/sites/my-website```に設置してあるhtmlが自動更新されるようになりました。わーい!


## 成功したかどうかの確認
hookのスクリプトが失敗したときのログとか、どこに出るのかなぁと思っていたら、
pushしたとき手元に出てた。

"remote:"っていう行。

```bash
% git push
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 631 bytes, done.
Total 6 (delta 3), reused 0 (delta 0)
remote: fatal: Not a git repository: '.'
To sasyugo:git/bukko-music-children.git
   f225eab..f7932b2  master -> master
```

うまく行ったときは、ちゃんとそういうログが出てますよ。

```bash
remote: From /home/fnobi/git/my-website
remote:    bbec307..8becb96  master     -> origin/master
remote: Updating bbec307..8becb96
remote: Fast-forward
remote:  index.html             |    4 ++++
remote:  src/ejs/index.html.ejs |    4 ++++
remote:  2 files changed, 8 insertions(+), 0 deletions(-)
```


べんりだなぁ。

## まとめ
クライアントサイドフックで、コミットメッセージに「バルス」が含まれてるかどうかを検知して、
含まれてたらレポジトリを破壊するやつとかあって笑った。

- ['git-バルス'をgit-hookにした - 這い寄るゆろよろ・アンド・ライジングフォース日記](http://yuroyoro-blog.tumblr.com/post/28319112466/git-git-hook)

そういえば[コミットした瞬間の顔を撮影するやつ](http://www.ideaxidea.com/archives/2012/05/lolcommits.html)とかもあったし、
いろんなことできそう。

## 参考
- [gitのhookを使ってみた。 - 画竜点睛を衝く](http://mapyo.hatenablog.com/entry/2013/04/14/git%E3%81%AEhook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82)
シンプルに書いてあってよかった。

- [Git hooks まとめ - Qiita [キータ]](http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)
それぞれのhookのタイミングが細かく載ってる

- [Lightweight git hook management tool その名も git-hook を作りました - 鳩舎](http://rosylilly.hatenablog.com/entry/2012/07/30/082748)
  設置の作業を簡単にやるための拡張あった。いい。
SensorManager# registerListener()で値の取得間隔をマイクロ秒単位で指定する

[SensorManager](http://developer.android.com/reference/android/hardware/SensorManager.html)の`registerListener()`ではAPI Level 9から値のおおよその取得間隔をマイクロ秒単位で指定できる(もちろん、`SensorManager.SENSOR_DELAY_*`キーワードでも設定できる)。

```java
SensorManager manager = (SensorManager)getSystemResource(SENSOR_MANAGER);
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// だいたい1秒間隔で加速度の値をlistenerで受け取る
manager.registerListener(listener, sensor, (int)1e6 /* micro sec. */);
```

ただし、設定が効かないものもあった。自前のIS12Sで確認したところ、加速度センサと近接センサは効かなかった。

このうち、近接センサはセンサの値が変更になった時にもらえる設定（`Sensor#getMinDelay()`が 0 を返す）になっていた。

加速度センサの取得間隔が設定できないのはよくわからない。システムとかで使っているからだろうか。ほしくないデータを捨てるのは自分で実装するしかなさそう。

実際にデータを取って検証したことは[ブログ](http://akihito104.hatenablog.com/entry/2013/07/27/144501)に書きました。
LVM各種操作コマンド

LVM関連の操作まとめ

###LV(論理ボリューム), VG(ボリュームグループ)、 PV(物理ボリューム)の情報を見る

```shell-session:
 # lvscan
 # vgscan
 # pvscan
 # lvdisplay
 # vgdisplay
 # pvdisplay
```
覚えやすいコマンド。

### 論理ボリューム(LV)の追加
ボリュームグループvg10に1Gの新たな論理ボリュームを追加して, ext4でフォーマットしてみる

```shell-session:
 # pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               vg00
  PV Size               9.77 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              2499
  Free PE               195
    => ディスクの空きがあることを確認
 # lvcreate -L 1G -n  LogVol02 vg10
  Logical volume "LogVol02" created
 # lvdisplay vg10
    => /dev/vg10/LogVol02が作成されていることを確認
 #  mkfs.ext4 /dev/vg10/LogVol02
    => ext4でフォーマット
 # mkdir /tmp2; mount -t ext4 /dev/vg10/LogVol02 /tmp2
 # df
    => マウント表示されることを確認
```

### 論理ボリューム(LV)の拡張
先ほど作った/dev/vg10/LogVol02のサイズを２Gに拡張してみる

```shell-session:
(ディスク容量があることは事前に確認)
 # umount /tmp2
 # e2fsck -f /dev/mapper/vg10-LogVol02
   => ファイルシステムが壊れていないか確認
 # lvextend -L 2G /dev/mapper/vg10-LogVol02
 # mount -t ext4 /dev/vg10/LogVol02 /tmp2
```

### 物理ボリューム(PV)の追加
fdiskでパーティションを作る(今回は/dev/sda4)

```shell-session:
 # fdisk /dev/sda
 コマンド (m でヘルプ): p
    => 現在のパーティション確認
 コマンド (m でヘルプ): n
 コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
 p 
    (テストなので基本パーティションにしている)
 選択した領域 4
 最初 シリンダ (2106-2610, 初期値 2106):
 初期値 2106 を使います
 Last シリンダ, +シリンダ数 or +size{K,M,G} (2106-2610, 初期値 2610):
 初期値 2610 を使います

 コマンド (m でヘルプ): p

/dev/sda4            2106        2610     4055513   83  Linux
  => パーティションが作成されていることを確認

 コマンド (m でヘルプ): t
 パーティション番号 (1-4): 4
 16進数コード (L コマンドでコードリスト表示): 8e
 領域のシステムタイプを 4 から 8e (Linux LVM) に変更しました

 コマンド (m でヘルプ): p

 /dev/sda4            2106        2610     4055513   8e  Linux LVM 
 => パーティションがLVMになっていることを確認

 コマンド (m でヘルプ): w
 
 # reboot 
    => リブートがいるといわれたらする
 (起動後)
 # pvcreate /dev/sda4
 # pvscan
    => PVが増えていることを確認
```

### ボリュームグループ(VG)の追加
 先ほど作ったPVに割り当ててみる

```shell-session:
 # vgscan
 # pvscan
 # vgcreate vg20 /dev/sda4
  Volume group "vg20" successfully created
 # vgscan
 # pvscan
    => VGが作成されていること確認
```
Python用ケムインフォマティクスツールRDKitのインストール

(2014.02.12更新 Boostの再インストール、PILのインストールについて追記しました)
(2014.02.19更新 Cairoを利用した構造式描画について追記しました)
(2014.03.11更新 Cairoを利用した構造式描画について更新しました)


ケムインフォマティクス用のツールとしては
オープンソースではOpenBabel（C++）やCDK（Java）が有名ですが、
RDKitはPythonで使用できるため、比較的簡単なスクリプトを書くだけで
化学構造式の描画や検索、解析ができるので便利です。


## インストール（Mac OS X 10.7）

HomebrewのPythonを使う場合は.bash_profile等でPATHを通すのを忘れずに

NumPyが入ってない場合は入れておきます。

```
pip install numpy
```

有志のHomebrew formuraが公開されているのでtapしてインストールします。
https://github.com/edc/homebrew-rdkit

```
brew tap edc/homebrew-rdkit
brew install rdkit
```

依存モジュールのcmake, wget, swig, boost, そしてrdkitがインストールされます。
boostとrdkitのインストールにやや時間がかかります。

HomebrewのPythonを使用している場合、Boostが原因でFatal Python errorが出るので、
以下のコマンドでBoostをソースからビルドして再インストールします。

```
brew uninstall boost
brew install boost --build-from-source
```

コマンドラインからfrom rdkit import Chemできればインストール成功です。

構造式画像を表示する場合、PILが必要になります。

```
pip install pillow
```


## 使ってみる
例えば、SMILESから化学構造式を描画してPNGで出力するのは以下のコードです。

```py:rdkittest.py
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem import rdDepictor

mol = Chem.MolFromSmiles('CCC(CC)O[C@@H]1C=C(C[C@@H]([C@H]1NC(=O)C)[NH3+])C(=O)OCC')
rdDepictor.Compute2DCoords(mol)
Draw.MolToFile(mol, 'mol.png')
```

結果:

![mol.png](https://qiita-image-store.s3.amazonaws.com/0/17925/84b16074-1314-86b3-d220-2c5eb1b60e0a.png)


CDKに比べると圧倒的に短いコードで済みます。
描画、検索、解析など計算量の多い機能はC++で実装されているようなので
速度で劣ることもそれほど無いように思います。

ただし、見ての通り現段階では画像のクオリティはCDKに比べると非常にしょぼいです。
なので、僕の場合検索や解析をRDKitで行い、描画だけCDKに投げるようにしてます。



## (補足)Cairoを利用した高画質な構造式画像の描画

Cairo及びPyCairoが利用可能(つまりimport cairoできる状態)であれば、Draw.MolToFile()で構造式を描画する際に自動的にCairoを使用するため画像のクオリティがかなり改善します。

![mol.png](https://qiita-image-store.s3.amazonaws.com/0/17925/6436fd4c-8b49-7ce6-8336-b38ca2c8eccf.png)

Cairo, PyCairoはともにHomebrewでインストールできます。

```
brew install cairo
brew install py2cairo
```

(Python2.7の場合、pycairoではなくpy2cairoです。)
HomebrewでCairoを入れる場合X11デフォルトのCairoと競合するのでおそらくライブラリパスの設定等が必要な気がします。

(2014.03.11追記)
pangoおよびpygtkをインストールします。

```
brew install pango
brew install pygtk
```

Pythonからimport pangoできる状態になっていればOKです。
これでフォントが改善し原子数の下付きやイオンの上付きが正常に表示されます。

![mol.png](https://qiita-image-store.s3.amazonaws.com/0/17925/4b663b49-a3a3-96cb-e857-21e1b669705e.png)
XCode Command Line Toolsを古いバージョンに戻す


beta版のXcodeをインストールして、コマンドラインツールも更新してしまった。安定版のXcodeに戻してもコマンドラインツールはbeta版を使ってしまいます。
そんな時は、

```
% xcode-select -print-path
```
でパスを調べてみる

```
/Applications/Xcode5-DP.app/Contents/Developer
```
と消したはずのXcode5にリンクしている

```
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
```
と使いたいXcodeを設定すればOK
PySide - モードレスダイアログを表示中にバックグラウンドで何らかの処理を行う


PySideでモードレスダイアログを表示する場合はshowメソッドを使用しますが、
呼び出し元で何らかの処理が継続中の場合、
その処理が終わるまでダイアログは待ち状態になってしまいます。

それを防ぐためには、モードレスダイアログの中で定期的に
QtGui.QApplication.processEvents()を呼び出す必要があります。
（QProgressbarDialogなどもsetValueメソッドの中でprocessEventsを呼び出し
ダイアログを定期的に更新しています）

以下、時間のかかる処理を行う際に、「Please wait...」と書かれたモードレスダイアログ
を表示させる例です。

```py::waitdialog.py
import sys
from PySide import QtGui, QtCore


class WaitDialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(WaitDialog, self).__init__(parent)

        label1 = QtGui.QLabel("Please wait...")

        layout = QtGui.QVBoxLayout()
        layout.addWidget(label1)
        self.setLayout(layout)

        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowTitle("Work in progress")
        self.resize(200, 100)
        self.setModal(True)
        self.show()
        self.raise_()
        QtGui.QApplication.processEvents()


def main():
    app = QtGui.QApplication(sys.argv)
    widget = WaitDialog()
    u""" 時間のかかる処理開始 """
    import time
    time.sleep(10)
    u""" 時間のかかる処理終了 """
    widget.close()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
```
ZendService\Twitterの利用

今 ZendService\Twitterとかでググると、古いzf 2.1のマニュアルが上位に来るのでSSL certificateまわり気づきにくいですね。


http://framework.zend.com/manual/2.2/en/modules/zendservice.twitter.html
 
```php

<?php
include __DIR__.'/vendor/autoload.php';

use ZendService\Twitter\Twitter as BaseTwitter;
use ZendService\Twitter\Response;
use ZendOAuth\Token\Access;
use Zend\Http\Client\Adapter\Curl;

/**
 * 足りないメソッド用
 */
class Twitter extends BaseTwitter
{
    /**
     * @todo if id is passing as "int" / biginteger
     */
    public function statusesRetweet($id)
    {
        $this->init();
        $path = 'statuses/retweet/'.$id; // 
        $response = $this->post($path);
        return new Response($response);                                
    }

    public function followersList()
    {
        $this->init();
        $path = 'followers/list'; 
        $response = $this->get($path);
        return new Response($response);                                
    }
}

$twitter = new Twitter([
    //'username' => '',
    'accessToken' => (new Access)
        ->setToken('')
        ->setTokenSecret('')
    ,
    'oauthOptions' => [
        'consumerKey' => '',
        'consumerSecret' => '',   
    ]
]);

$twitter->getHttpClient()->setAdapter((new Curl)->setCurlOption(CURLOPT_SSL_VERIFYPEER, false));

// アカウント認証の取得
$twitter->accountVerifyCredentials();

// つぶやく
$twitter->statusesUpdate('');

// リツイート
$twitter->statusesRetweet('360938098219167744');

// フォロワー取得
$twitter->followersList();

// ユーザ名でユーザ情報の取得
$twitter->usersShow('sasezakit');

// デバッグ用
//var_dump($twitter->getHttpClient()->getLastRawRequest());

```

```json:composer.json
{
    "require": {
        "zendframework/zendservice-twitter": "dev-master"
    }
}
```

https://github.com/zendframework/ZendService_Twitter
Zend\Db でデータベースのリバースエンジニアリング

```php
<?php
use Zend\Db\Adapter\Adapter;
use Zend\Db\Metadata\Metadata;

$adapter = new Adapter([
    'driver' => 'Mysqli',
    'database' => 'sore',
    'username' => 'ore',
    'password' => 'are',
]);

$metadata = new Metadata($adapter);

foreach ($metadata->getTables() as $table) {
    echo $table->getName(), PHP_EOL;
    show_column_infos($table);
}

function get_key_infos($table) {

    $keyInfos = ['primary' => [], 'foreign' => []];
    foreach ($table->getConstraints() as $constraint) {
        if ($constraint->isPrimaryKey()) {
            $keyInfos['primary'] = array_flip($constraint->getColumns());
        }
        if ($constraint->isForeignKey()) {
            $keyInfos['foreign']['cols'] = implode(', ', $constraint->getColumns());
            $keyInfos['foreign']['name'] = $constraint->getReferencedTableName();
            $keyInfos['foreign']['refs'] = implode(', ', $constraint->getReferencedColumns());
        }
    }
    return $keyInfos;
};

function show_column_infos($table) {
    $keyInfos = get_key_infos($table);
    foreach ($table->getColumns() as $column) {
        $name = $column->getName();
        if (isset($keyInfos['primary'][$name])) {
            echo " * ", $name, PHP_EOL;
        } else {
            echo "   ", $name, PHP_EOL; 
        }
    }

    if ($foregin = $keyInfos['foreign']) {
        echo "     ... fkey ( {$foregin['cols']} ) ref {$foregin['name']} ( {$foregin['refs']} )" . PHP_EOL;
    }
}

```
Doctrine でデータベースのリバースエンジニアリング - http://qiita.com/ngyuki/items/4fd29d58dc90100c55b8
webrubyをUbuntuとOSXで動かした

# 背景
www.moongift.jpで以前に紹介されていて気になっていた。
特にWebGLのデモ画面に興味を持った。

## gemでインストール
最近はgemで一発インストール出来るようになった。
qiitaで記事が出てないのは、フツーにruby使えれば簡単に試せるから
記事が無いのかとも。。

```
gem install wewbruby
```

### rbenv環境だからかも
which webrubyしても出てこなかったので、以下を実施

```bash:
rbenv rehash
```

## 自前のwebrubyのプロジェクトを作成

```bash:
webruby new MyFistProject
cd MyFirstProject
```

### 多くの場合必要そうな設定

#### mruby-jsの有効化
プロジェクトフォルダ直下のRakefileの編集して
mruby-jsを有効にする。これがmrubyとJavaScriptの
橋渡し的な事やっているらしい。

具体的には以下の様のコメントアウトされている行を
有効にする。

```bash:
   conf.gem :git => 'git://github.com/xxuejie/mruby-js.git', :branch => 'master'
```
### app.rbを編集

あとはご自由に

# あとがき
今回WebGLのデモの中身を見たのですが、
rubyでOpenGLなスクリプトを書いてそれが動くというより、
WebGLをrubyから操作する感じでした。

# 関連記事
- [Webrubyを試した #OSX](http://kjunichi.cocolog-nifty.com/misc/2013/07/webruby-osx-a5f.html)
数字にカンマを入れてフォーマット

3桁ずつ数字の間に","を挟むには、

```coffeescript:
numberFormat = (n) -> (n + '').split('').reduceRight (x, y) -> if (x.length + 1) % 4 then y + x else y + ',' + x
```

とするのがシンプル?

```coffeescript:
numberFormat = (n) ->
  s = n + '';
  s = s.replace(/(\d+)(\d{3})/, '$1,$2') while /(\d+)(\d{3})/.test s;
  s
```

でも良いけど、ワンライナーにはならない。(そして、正規表現の方が少し早い)

どちらも、使い方は↓こんな感じ。

```coffeescript:
s = numberFormat 1234567 # "1,234,567"
```
VisualStudio使用時にSVNに追加したほうがよい無視設定

追加しておくとはかどる？

\*\ipch
*.sdf 
*.bak
*.old
*\_UpgradeReport_File 
*\.svn
*\_svn
*.opensdf

今思いつくものではコレくらい

ほかにあればコメントで教えていただけると幸いです

追記　私の無視設定を出しておきます

\*.o
\*.lo
\*.la
\*.al
\.libs
\*.so
\*.so.[0-9]*
\*.a
\*.pyc
\*.pyo
\*.rej
\*~
\#*#
\.#*
\.*.swp
\.DS_Store
\*.obj
\*\obj
\*.scc
\*.suo
\*.ncb
\*.vcproj
\*.user
\*.opt
\*.clw
\*.ncb
\*.aps
\*.mak
Thumbs.db
\*\ipch
\*\Debug
\*\Release
\*.sdf
\*.bak
\*\_UpgradeReport_File
\*\.svn
\*\\_svn


コピー用
```Copy:
*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store *.obj *\obj *.scc *.suo *.ncb *.vcproj *.user *.opt *.clw *.ncb *.aps *.mak Thumbs.db *\ipch *\Debug *\Release *.sdf *.bak *\_UpgradeReport_File *\.svn *\_svn
```
TwitterOAuthの正しい使い方


__※この記事は古いため、2014年8月以降のTwitterOAuthでは動作しません。__
__新しい使い方はこちらを参照 → http://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a__

[使い方](http://qiita.com/rana_kualu/items/357a031c0453a3538ad3) / [ラッパー](http://qiita.com/rana_kualu/items/677dafa9bfa0c135ff4d)

「[PHP TwitterOAuth 1.1](https://www.google.co.jp/search?q=PHP+TwitterOAuth+1.1)」でググると、

```php:
$TwitterOAuth->OAuthRequest("http://api.twitter.com/1.1/statuses/update.json","POST",array("status"=>$tweet));
```

みたいなコードばっかり引っかかってぅぇぇとなるんですが。
誰かが最初に適当に書いたのをみんながコピペしたという過去が透けて見えるようだ。
まあ、動けばそれでいいというPHPの精神には則っているかもしれませんね。

```php:
<?php

	// TwitterOAuth
	require_once('path/to/twitteroauth.php');
	$TwitterOAuth = new TwitterOAuth('コンシューマキー', 'コンシューマシークレット', 'アクセストークン', 'アクセスシークレット');
	
	// 1.1向け。2013/06/12以降の版であれば不要
	$TwitterOAuth->host = 'https://api.twitter.com/1.1/';
	
	// 認証が有効か+ユーザ情報取得
	$user = $TwitterOAuth->get('account/verify_credentials');
	
	// つぶやく
	$status = $TwitterOAuth->post('statuses/update', ['status' =>'ツイート内容']);
	
	// リツイート
	$retweet = $TwitterOAuth->post('statuses/retweet/ツイートID');
	
	// フォロアーを取得
	$followers = $TwitterOAuth->get('followers/list');
	
	// フォローしてる人を取得
	$follows = $TwitterOAuth->get('friends/list');
	
	// ユーザ名でユーザ情報を取得
	$userinfo = $TwitterOAuth->get('users/show', ['screen_name'=> '@以降の表示名']);
	
	// ユーザIDでフォローする
	$follow = $TwitterOAuth->post('friendships/create', ['user_id'=> 'ユーザID']);
```

[API](https://dev.twitter.com/docs/api/1.1)は他にもたくさんありますが、呼び出し方はどれも同じです。
oAuthRequest()はJSONデコードもされていないし、このメソッドを直接呼ぶ意義は、今のところ全くありません。

さらに、TwitterOAuthは[2013/06/12にTwitter API 1.1に対応した](https://github.com/abraham/twitteroauth/commit/7d212801ca9049d8e492b2c33e287cc9b4f713b4)ので、それ以降のバージョンであれば$connection->hostを書き換える必要すらありません。

ちなみにTwitterOAuth、[テストコードがついてくる](https://github.com/abraham/twitteroauth/blob/master/test.php)のですが、これがけっこう間違いがあったりして困りものです。

というか、どうして呼び出し側でget/post判断やURLを渡させるのですかね。
適当にinterface作ってそっちで吸収してくれよと非常に思う。
C++でYコンビネータ（Boost.Any使用）

#Yコンビネータ
[rosettacodeにあるD言語によるYコンビネータ](http://rosettacode.org/wiki/Y_combinator#D)をC++に書き直してみた。
型がアレしてるとこはBoost.Anyでアレした。
ジェネリックにしたいけど引数が複数あるときどうしようかなぁ

#いつもどおりmsvcでしか動かしていないコード

```cpp:

#include <boost/any.hpp>
#include <functional>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	using namespace std;
    
	const auto factorial = [](function<int(int)> sel)->function<int(int)>{
		return [=](int n1)->int{return n1==0?1:(sel(n1-1)*n1);};
	};
    
    
	typedef int Ret;
	typedef int Arg;
	const auto Y = [](function<function<Ret(Arg)>(function<Ret(Arg)>)> f){
		return ([](function<function<Ret(Arg)>(boost::any)> x){
			return x(x);
		})(
			[=](boost::any y){return f(
    			[=](Arg a)->Ret{return (
					boost::any_cast<function<Ret(Arg)>>(
					   	(boost::any_cast<function<function<Ret(Arg)>(boost::any)>>(y))(y)
					)
				)(a);}
			);}
		);
        
	};
    
    
	cout << "7! = " << Y(factorial)(7) << endl;
	return 0;
}

```
モバイルアプリのユーザー行動解析サービスのFlurry Analyticsについて調べてみた


モバイルアプリの解析に特化したwebサービスなので、GoogleAnaryticsでは取れないデータも取れるらしい？
http://www.flurry.com/flurry-analytics.html

flurryで解析したいアプリ情報を事前に登録する必要が有るが、SDKも公開されている。
https://dev.flurry.com/uploadVersionSelectProject.do

![](http://www.flurry.com/images/industry.jpg)

解析機能を無料で公開して、バナーなども提供して、そこでマネタイズしてるっぽい？
とにかくユーザー行動の解析は無料だ。

#管理画面から閲覧可能な機能
 - 参考：http://logmania.masakiplus.net/archives/6194
 - レベル毎、キャラ毎、などにレベルアップ、ステージ進行度合いのデータが取れる

##Usage
 - New Users: UIDで判別された新規ユーザー数
 - Active Users: いわゆるUU数だが、日,週,月ごとにUUを取れるので所謂DAU,WAU,MAUを見る事も出来る
 - Sessions: ゲームをしてるユーザ数。基本的にはアプリの起動から終了までだが、定義は実装によってことなる
 - Session Length： ゲーム起動時間の長さ
 - Frequency of Use: １ユーザーあたりのセッション数
 - Lifecycle: ログイン継続率
 - User Retention： 利用開始からの継続率
 - Top Versions： アプリケーションのバージョン
 - Page Views： ページビュー（実際には取得せず）

##Audience
 - アプリを遊んでくれてるUserが他にどんなジャンルのアプリをinstallし、プレイしているかのデータを出してくれる(そんな事が可能なのか...!?

##Errors
 - [TutorialMovieが優秀だった](http://support.flurry.com/index.php?title=Analytics/Overview/Lexicon/CrashReporting)
 - 『投げられた例外』『アプリversion』『使用端末のファームウェア』『機種』などの情報が取れる

##User Acquisition
 - adNetwork的な何かなので今回は関係無さそう


##Event
###`Event Summary`
 - 取得しているEvent一覧が見れる
 - application内の任意のタイミングでflurryにそこをUserがプレイした事を知らせる
 - コードから任意のタイミングを指定しなければならない
 - Summary毎にパラメータが指定出来る

```
(例：LevelUp(Summary) --- charaName: ボブ;
					 --- level: 10;
```

###`User Path`
 - 取得しているEventの遷移を確認する

###`Event log`
 - 詳細なlogを表示する。csvデータをdownloadできる

###`Funnels`
 - Userに期待するEventの手順を登録する（例：Stage5をプレイする前にLvが5以上になっているか？…など

##Manage
 - Alert: 指定した条件で登録しているメールアドレスにアラートを出す（例：週間登録User1000人超えた)とか？
 - Segment: 各データのフィルタリングを行いたい時に使う(データをSegmentに分ける)
 - その他アプリケーションの設定

##Technical
 - 『端末』『キャリア』『ファームウェアversion(iOS6.1.4とか)』これらのUser毎の情報の集計を提示する

#参考
 - [ログマニアックス](http://logmania.masakiplus.net/archives/6194)がかなり参考になりました、ありがとうございます！！！
rails console から API を簡単に叩けるようにする

```rb:api.rb
module MyApp
  module API
    class Railtie < Rails::Railtie
      class Command
        attr_accessor :user

        def initialize(user = nil)
          @user = user || User.first
        end

        %i(get post patch put delete head).each do |method|
          define_method(method) do |path, parameters = {}, headers_or_env = {}|
            app.__send__ method, path, default_params.merge(parameters), default_headers.merge(headers_or_env)
            ActiveSupport::JSON.decode app.response.body
          end
        end

        private

        def default_params
          {}.tap do |h|
            h[:api_key] = @user.api_key if @user
          end
        end

        def default_headers
          {}.tap do |h|
            h['Accept'] = 'application/json'
          end
        end

        def app
          TOPLEVEL_BINDING.eval('app')
        end
      end

      module ClassMethods
        def api
          @api ||= Command.new
        end
      end

      console do
        TOPLEVEL_BINDING.eval('self').extend ClassMethods
      end
    end
  end
end
```

```rb:console
api.get 'users' #=> [{"id"=>1, "name"=>"foo"}, {"id"=>2, "name"=>"bar"}]
api.user = nil
api.get 'users' #=> {"status"=>401, "message"=>"Unauthorized"}
```

api_key はそれぞれのサービスの認証に必要なパラメータ名に変えてください。
New v7 appcompat library で対応したActionBarを試してみた

Android Support Library, revision 18 でついにActionBarがサポートされたようなので、試してみました。
これで、ActionBarSherlockがお役御免になる？？？

以下に記載があります。
[http://developer.android.com/tools/support-library/index.html](http://developer.android.com/tools/support-library/index.html)


>New v7 appcompat library:
>Added ActionBar to allow implementation of the action bar user interface design pattern 
>back to Android 2.1 (API level 7) and higher. 
>Use of this class requires that you implement your activity by extending the new ActionBarActivity class.


以下、簡単な対応方法です。

- **１.SDKを更新していない場合は、SDKを更新します。(現時点の最新は22.0.4です。)**

- **２./Applications/android-sdk-macosx/extras/android/support/v7/appcompatを
プロジェクトのライブラリでとして取り込みます。**

- **３.appcompat/libs/android-support-v7-appcompat.jarをプロジェクトのlibsディレクトリにコピーしてビルドパスに追加します。**

- **４.Activityの継承元をActionBarActivityに変更します**

```MainActivity:java
public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
```

- **5. values/style.xmlのparentを「Theme.AppCompat.Light.DarkActionBar」に変更します**

```style.xml:xml
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>
```

試しにActionBarSherlockからsupport libraryへの移行してみましたが、さほど手間はかかりませんでした。
ほぼ、SherlockActivity(SherlockFragmentActivity)を継承しているクラスを
ActionBarActivity(FragmentActivity)に変更するだけで済みました。(あとstyle.xmlも)

Navigation Drawerと組み合わせたサンプルを作成しましたので、参考にしてください。
[ActionBarWithSupportLibrary](https://github.com/myaaaaa-chan/ActionBarWithSupportLibrary)