OmniAICreator/Qiita-1.07M huggingface dataset:
Typhoon Framework はじめる前に

# DI : Dependency Injectionとは
自分で調べてください:-p
DIについては詳しい人たちがまとめてくれているので、僕はあくまでもObjective C上のDIコンテナである、Typhoonに関する話だけを書こうと思います。
Javaで発展したデザインパターンなので、サンプルとしてはGoogle Guiceがオススメです。

# Typhoon Framework
Objective C用のDIコンテナです。Google Guiceのような使い勝手とまでは言いませんが、自分でなんちゃってDIをやるよりははるかに柔軟です。

## 公式サイト
http://www.typhoonframework.org

ただ、このページは ~~無駄に~~ いろいろな情報が載っているので、github上のドキュメント見た方がシンプルで分かりやすいです。
https://github.com/typhoon-framework/Typhoon/wiki/Assembling-Components-with-Blocks

## Install方法
Cocoa Podsから入れられます。
http://cocoapods.org/?q=Typhoon

Cocoa Podsを使っていない人は、、まずcocoa podsを入れましょう:-p
http://guides.cocoapods.org/using/getting-started.html


# DIコンテナへの依存
DIを導入するために、Typhoon Frameworkに強依存するのは本末転倒だと思います。
それを回避するため、下記のようなInjectorインタフェイスを用意し、DIのInjector自体を注入する形で設計を進めて行きます。

```objc:BTKInjector.h
#import <Foundation/Foundation.h>

@protocol BTKInjector <NSObject>

- (id) instanceForProtocol : (Protocol *)protocol;

@end

@interface BTKInjectorDefault : NSObject

+ (id<BTKInjector>) get;

@end
```

これによりTyphoon Frameworkに関する記述は局所化できるので、他のDIコンテナにも簡単に乗り換えることができます。コンポーネント間のインタフェイスを明示的に定義し、依存関係の定義はDIにまかせる。DIの基本ですね。

## Typhoon Framework独自の機能について
Autowiring等も触ってはみましたが、黒魔術的な側面が強すぎてかえって見通しが悪くなるように感じます。非常に多機能で面白いフレームワークですが、まずはシンプルに使ってみることをお勧めします。
mkdirとcdを同時に


```
$ mkdir -p xxx/yyy; cd xxx/yyy
```
って面倒だなと思いながらやってましたが、やっぱり面倒だなと。
調べてみるといくつか方法がありました。

２つ目の方を使うことにしました。

> ```
$ vi .bash_profile
function mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
```


```
$ mkdircd xxx/yyy
```

---

\$_ を使うだけでも便利ですね。ていうか、\$_なんてのがあるんですね。

```
$ mkdir -p xxx/yyy; cd $_
```


参考にしたサイト

mkdirとcdを同時に実行したい時
> 
http://blog.tstylestudio.com/2013/06/26/mkdir%E3%81%A8cd%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84%E6%99%82/

>```
mkdir XXX && cd $_
```

>```
$ ~/bin/mkcd.sh
#!/bin/sh
mkdir $1 && cd $_
$ chmod u+x ~/bin/mkcd.sh
alias mkcd='source ~/bin/mkcd.sh'
```


Hack 3. １つのコマンドで mkdir と cd を実行する
> http://d.hatena.ne.jp/bobchin/20090401/1238557613

> ```
$ vi .bash_profile
function mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
```
mkdir関数でSGIDはセットできない？

結局わからなかったのでタイトルは疑問形で。
結論としては、SGIDセットしたいときはmkpathに続いてchmod(perl関数)するとする。

File::Pathにmode,owner,groupを設定するオプションが追加されていたので試してみた。

```pl:mkpath.pl
#!/usr/bin/env perl
use strict;
use warnings;
use File::Path;

printf "%04o\n", umask();       # 0022

mkpath("./dir1", 0);            # drwxr-xr-x (0755)
mkpath("./dir2", 0, 0700);      # drwx------ (0700)
mkpath("./dir3", 0, oct "700"); # drwx------ (0700)
mkpath("./dir4", 0, oct "2770");
mkpath("./dir5", 0, oct "700"); # drwx------ (0700)

# drwx--x--x (0711)
mkpath("./dir6", +{ mode => oct "711" }); root
# apache nobody
mkpath("./dir7", +{ owner => "apache", group => "nobody" });
```

結果はこんなかんじ

```bash
# sudo perl mkpath.pl
0022
$ ll
drwxr-xr-x 2 root   root   4096  4月 16 03:08 2014 dir1
drwx------ 2 root   root   4096  4月 16 03:08 2014 dir2
drwx------ 2 root   root   4096  4月 16 03:08 2014 dir3
drwxr-x--- 2 root   root   4096  4月 16 03:08 2014 dir4
drwx------ 2 root   root   4096  4月 16 03:08 2014 dir5
drwx--x--x 2 root   root   4096  4月 16 03:08 2014 dir6
drwxr-xr-x 2 apache nobody 4096  4月 16 03:08 2014 dir7
-rw-r--r-- 1 ymko   users   477  4月 16 03:08 2014 mkpath.pl
```

よくよく見てみるとdir4に[SGID（Set Group ID）](http://kazmax.zpp.jp/linux_beginner/setgroupid.html)がセットされていない。
ソースを追いかけてみると
・File::Pathではperlのmkdir関数へ
・perlのソースを見るとvms/vms.cのPerl_my_mkdirからsys/stat.hのmkdirへ

coreutilsのmkdirコマンドは・・・のところで時間切れ。
Google IO 2014に申し込むにあたって確認したい5つのこと

![Top](http://blog-imgs-68.fc2.com/x/e/n/xenonews/Google_I_O_2014-0408.png)

[Google IO 2014](https://www.google.com/events/io)の申し込みまであと6時間程度になりました。
皆様、いかがお過ごしでしょうか。

Google IO 2014の参加券は抽選制で、
2014/4/15から2014/4/18にわたって応募することができます。
当選者のみチケットを買う権利が与えられるっぽいです。

ここまでは有名な話なのですが、応募するに際し、いくつか確認しておきたいことがあるなと思い、
[Google IOのhelp](https://www.google.com/events/io/help)を見ながらツイートしていたら多少反応があったので確認ポイントをQiitaにも書いておきます。

なお、ここに書くことはすべて、2014/4/16 2:00(JST)現在での情報で、自分が理解している内容です。
実際に確認したい場合は[Google IOのhelp](https://www.google.com/events/io/help)をご自身でご確認ください。
出来るだけ間違った内容や、内容のアップデートはしますが、内容が正しいかつ最新かどうかは保証しません。

#1.申し込んだ本人でないと参加証が受け取れない
どうやら抽選応募から参加証受け取りまで、

1. Google+のアカウントでログインをして抽選応募をする
2. 当選したら、抽選応募をしたアカウントのGoogle Walletでお金を払う
3. Google IO 2014開催中に会場へ行き、参加証を受け取る(check-in)
4. 参加証を受け取るためには政府が発行した写真付き証明書(government issued photo ID)が必要
	* 免許証
	* パスポート　などが例に挙げられている
5. 参加証の販売、交換、オークションなどどんな手段でも移譲された場合は無効になる

つまり、 __他人名義のアカウントではダメ__ ってことですね。
アカウントいっぱい作ったり、友達や同僚に頼んで応募してもらったりの人海戦術ではだめっぽいです。
また、参加証は会期中身につけておかないといけない、かつ、求められたら提示しないといけないみたいですね。

#2.学割チケットを買う場合は証明書が必要
Academic Admission Ticketという学割価格のチケットを買う場合は、
参加証を受け取る(check-in)際に学生であることを証明する証明書を見せないといけないらしいです。
また、高校かそれ以上じゃないと学割は聞かないっぽいっすね。
School-ID(学生証)でいいっぽいんですが、英語表記じゃないとダメとかは特に書かれていません。
ちなみに、会期中に見せられないと、 __入れない__ 、 __チケットのアップデートはできない__ 、 __返金できない__ らしいです。

#3.15歳以上じゃないと応募できない
らしいです。
最近勉強会で中学生の方とかをお見受けしたので一応…。
なお、15歳, 16歳, 17歳の場合は親の同意書が必要らしいです。

#4. プレスは別途フォームがある
プレスには別途リクエストフォームがあるらしいです。
プレス用に限定数プレスパスが発行されるみたいですね。
[このフォーム](https://docs.google.com/a/google.com/forms/d/1QtNQsGoshDull_lbakZWp1GkCKklty57AXujioK4iXA/viewform)らしいです

#5.会期中に行われるセッションの予約はない
セッション、Code labs、その他イベントは来た人から入っていく(first-come, first-serve basis)らしいですね。
つまりイベント事の予約はなさそうです。毎度のことですが、結構混みそうですね。
また、すべてのプレゼンテーションは英語で行われるらしいです。

#まとめ

ほかにも細かいことを上げるとキリがないので、書きませんが、例えば、会場内は禁煙だとか、
会場近くにある6週〜12歳の子供を預けておける施設を無料で提供するよとか、
いろいろ書いてあって面白いです。

ｗｋｔｋして応募を待っている皆さんは[ここ](https://www.google.com/events/io/help)に目を通しつつ、
コードを書きつつ待っておけば良いんじゃないかなと思いました。
Railsでタスク管理アプリを作成_4

# タスク管理アプリを作ってみよう(続き)

## 1. 前置き

### 1. 前提・事前作業

 * [こっちの投稿](http://qiita.com/fujimohige/items/073a1a21f389d97a5b12)の内容を事前に実施済み
 * 例によって[ドットインストール](http://dotinstall.com/lessons/basic_rails_v2/24901)の写経
 * [#13 データを保存してみよう](http://dotinstall.com/lessons/basic_rails_v2/24913)から実施



## 2. データを保存してみよう

* POSTして `projects#create` というActionで登録する
* `/home/vagrant/taskApp/app/controllers` の `projects_controller.rb` を弄る。


```rb:ruby(before)
class ProjectsController < ApplicationController


  # indexアクションを追加
  def index
    # @をつけた変数はviewでそのまま使用可能
    # Projectの全データを引っ張ってくる
    @projects = Project.all
  end

  # showアクションを追加
  def show
    @project = Project.find(params[:id])
  end

  # newアクションを追加
  def new
    @project = Project.new
  end


end
```


```rb:ruby(after)
class ProjectsController < ApplicationController


  # indexアクションを追加
  def index
    # @をつけた変数はviewでそのまま使用可能
    # Projectの全データを引っ張ってくる
    @projects = Project.all
  end

  # showアクションを追加
  def show
    @project = Project.find(params[:id])
  end

  # newアクションを追加
  def new
    @project = Project.new
  end

  # createアクションを追加
  def create
    # Formからの入力値を受け取る
    @project = Project.new(project_params)
    # データの保存
    @project.save
    # HOMEへ移動
    redirect_to projects_path
  end

  # project_params を定義
  private
    def project_params
      # projectでわたってきたもののうち、titleだけ使用
      params[:project].permit(:title)
  end


end
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/40160/2312a02f-2003-c796-9a31-979b680de828.png)

↓入力してボタンをポチる

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/40160/6facba6e-9688-b89f-ffd1-ec3f4187a645.png)


## 3. Validationを設定しよう

* データの追加時にチェックを行う
* Modelの中でバリデーションを行う
* `/home/vagrant/taskApp/app/Models` の `project.rb` を弄る。

```rb:ruby(before)
class Project < ActiveRecord::Base
end
```

```rb:ruby(after)
class Project < ActiveRecord::Base
  # 必須制御
  # 「project」を未入力の状態では保存できなくなる
  validates :title, presence: true
end
```

* 上記の場合、未入力の状態では保存はされないがエラーメッセージの表示が出来ないので、Controllerでエラー制御を追加する。
* `/home/vagrant/taskApp/app/controllers` の `projects_controller.rb` を弄る。
* ソースが長くなってきたのでbefore, afterでは書かない。

```rb:ruby
class ProjectsController < ApplicationController


  # indexアクションを追加
  def index
    # @をつけた変数はviewでそのまま使用可能
    # Projectの全データを引っ張ってくる
    @projects = Project.all
  end

  # showアクションを追加
  def show
    @project = Project.find(params[:id])
  end

  # newアクションを追加
  def new
    @project = Project.new
  end

  # createアクションを追加
  def create
    # Formからの入力値を受け取る
    @project = Project.new(project_params)
    # データの保存
    if @project.save
      # saveがtrueだったらHOMEへ移動
      redirect_to projects_path
    else
      # saveがfalseだったら入力フォームに戻る
      render 'new'
    end
  end

  # project_params を定義
  private
    def project_params
      # projectでわたってきたもののうち、titleだけ使用
      params[:project].permit(:title)
  end

end

```

* これで、下記の制御となる。
 * 保存成功 --> HOMEへ移動
 * 保存失敗 --> 入力フォームを再表示
NSHipster で紹介されていた Xcodeの便利プラグイン達

	
[NSHipster : Xcode Plugins](http://nshipster.com/xcode-plugins/?utm_content=buffer5267e&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer) より

### [Alcatraz](http://alcatraz.io/)

XCodeのプラグインパッケージマネージャ. Project Template も管理,追加できる. シングルトンクラスのテンプレートとかありました.

### [BBUDebuggerTuckAway] (https://github.com/neonichu/BBUDebuggerTuckAway)

エディタ入力中は下にあるデバッグ用ウィンドウを自動的にハイドにしてくれる神プラグイン. Alcatraz でいれた.

### [Xprop] (https://github.com/shpakovski/Xprop)

ctrl + 6 ででるview (document itemsという) の中の @property などを消してくれる. 純粋にメソッドだけの一覧を見たいときがほとんどなのに propertyがこの中にあってメソッドなのか,プロパティなのかわからなくなるのを防いでくれるので便利.

### [ColorSense-for-Xcode] (https://github.com/omz/ColorSense-for-Xcode)

UIColorの色をエディタ内にポップアップで表示してくれる.


## Just Idea

* Xcode plugin の人気ランキングサイトが欲しい.
LinearLayoutにdividerを挿入する

LinearLayoutにDividerを表示する

今更ですが、、、
API Level11からLinearLayoutでもdividerが挿入できるようになっていました。

##使い方
ListViewでは標準的に使われますが、LinearLayoutでも全アイテムの間に共通の区切り線を入れたい場合や、アイテム間のマージンを楽に設定したい場合に使用できそうです。

レイアウト指定の場合は以下のようになります。

```layout.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@layout/divider"
    android:dividerPadding="20dp"
    android:showDividers="middle"
    android:orientation="vertical" >

    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="xxxx"
        />

    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="xxxx"
        />
    
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="xxxx"
        />
</LinearLayout>

```

必要な属性は以下のとおり。

| 属性   | 意味 |値   |
|:----- |:---- |:--- |
|divider|Divider|drawbleへの参照|
|dividerPadding|Dividerの両端のPadding|数値またはdimensへの参照|
|showDividers|Dividerの表示設定|none(デフォルト)、middle、beginning、end|

showDividersの値はOR指定可能です。

上記のレイアウトに以下のようなdividerを用意すると下図のように表示されます。

・layout下に配置

```divider.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/divider_item"
        android:top="5dp"
        android:bottom="5dp" />
        
</layer-list>

```

・drawable下に配置

```divider_item.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <size android:height="1dp" />

    <solid android:color="@android:color/black" />

</shape>

```

![Screenshot_2014-04-16-01-10-57.png](https://qiita-image-store.s3.amazonaws.com/0/13974/27de118f-a9ca-29c4-73d0-6303dab728f0.png)


dividerの色を透過にすることで、マージンとしても利用できます。

```divider_item.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <size android:height="1dp" />

    <solid android:color="@android:color/transparent" />

</shape>

```

![Screenshot_2014-04-16-01-19-49.png](https://qiita-image-store.s3.amazonaws.com/0/13974/1d2b161a-ffb5-be3b-ad77-a85492473814.png)


##注意点
dividerに対しては、画像リソースを設定することができますが、
divider="@android:color/black"
という色指定はできません。

色参照を渡した場合でもDrawableが生成されますが、高さが0になります。
ListViewとは異なり、dividerHeightが設定できないため高さをもったDrawableを渡す必要があります。
YesodでURLのクエリ文字列を取得する


```haskell
lookupQueryStringParameterValue :: MonadHandler m => Text -> m (Maybe Text)
lookupQueryStringParameterValue parameterName = getRequest
    >>= return . lookup parameterName . reqGetParams

getQueryStringParameterValues :: MonadHandler m => Text -> m ([Text])
getQueryStringParameterValues parameterName = getRequest
    >>= return . filter ((==parameterName) . fst) . reqGetParams
    >>= return . map fst
```

```getRequest```で```YesodRequest```が得られ、```YesodRequest {reqGetParams::[(Text,Text)]}```でクエリ文字列の一覧が得られる。
あとは```lookup :: Eq a => a -> [(a, b)] -> Maybe b```やらで値を取得すればOK。
AWS SDK for PHPのKinesisClientのラッパーを作った


# ソース
* [fukuiretu/amazon-kinesis-client-library-php · GitHub](https://github.com/fukuiretu/amazon-kinesis-client-library-php)
* [rf/amazon-kinesis-client-library-php - Packagist
](https://packagist.org/packages/rf/amazon-kinesis-client-library-php)


# インストール
制限が特になければComposer経由が良いと思います。
詳細はGithubのREDEMEを見てください。


# できること
* DataRecordのpush
* Shardの取得
* DataRecordの取得
* ShardIdとSequenceNumberの状態を管理 => **前回の処理以降のDataRecordを扱うことができる!!**


# 状態を管理するデータストア先の選択
* File
* Memcached



# DataRecordの取得(データストア先をFileとした場合)
```php

<?php

require 'vendor/autoload.php';

use Aws\Kinesis\KinesisClient;
use Aws\Common\Enum\Region;
use Rf\Aws\AutoLoader;
use Rf\Aws\Kinesis\ClientLibrary\KinesisProxy;
use Rf\Aws\Kinesis\ClientLibrary\KinesisShardFileDataStore;
use Rf\Aws\Kinesis\ClientLibrary\KinesisShardMemcacheDataStore;
use Rf\Aws\Kinesis\ClientLibrary\KinesisStorageManager;

define('STREAM_NAME', 'kinesis-trial');

$kinesis = KinesisClient::factory(array(
  'key' => 'XXXXX',
  'secret' => 'XXXXX',
  'region' => Region::VIRGINIA
));

$kinesis_proxy = KinesisProxy::factory($kinesis, STREAM_NAME);
$kinesis_storage_manager = new KinesisStorageManager($kinesis_proxy, new KinesisShardFileDataStore('/tmp/amazon-kinesis'));

// 前回保存したSequenceNumber以降のDataRecordを取得
// 初回は先頭から取得
$data_records = $kinesis_storage_manager->findWithMergeStoreDataRecords(null, 10, 5);
foreach ($data_records as $data_record) {
  // 取得したDataRecordに対しゴニョゴニョする
  echo $data_record->getData(), PHP_EOL;
}

// 今回分のSequenceNumberを保存
$kinesis_storage_manager->saveAll();

```

# TODO
* ストレージの選択肢としてDynamoとかRedisとかRDSとかは今後追加するかもしれない
* 並列(pthreads)で動くようになるかもしれない
Doctrine で２つのDBのスキーマの差分を出力

Doctrine には migrations:diff という XML や YAML で書かれたスキーマ情報と実際のDBのスキーマを比較して migration ファイルを作成する機能があるそうです。

 - [doctrine/migrations](https://github.com/doctrine/migrations "doctrine/migrations")

そんなことができるなら、実際のDBを２つ比較してスキーマの差分を出力することも簡単にできるんじゃない？
と思って doctrine/migrations の中を覗いてみたら凄く簡単にできました。

---

まずは doctrine/dbal を composer でインストールします。

doctrine/migrations が必要なのかと思っていましたが、差分を導出する機能も dbal にありました。


```console
$ composer require "doctrine/dbal:2.*"
```

次のように php のコードを作成します。接続情報の部分は適当に読み替えてください。

```php:db-diff.php
<?php
require __DIR__ . '/vendor/autoload.php';

use Doctrine\DBAL\DriverManager;

$fromDb = DriverManager::getConnection([
    'driver' => 'pdo_mysql',
    'host' => '127.0.0.1',
    'user' => 'ore',
    'password' => 'pass',
    'dbname' => 'db1',
]);

$toDb = DriverManager::getConnection([
    'driver' => 'pdo_mysql',
    'host' => '127.0.0.1',
    'user' => 'ore',
    'password' => 'pass',
    'dbname' => 'db2',
]);

$fromSchema = $fromDb->getSchemaManager()->createSchema();
$toSchema = $toDb->getSchemaManager()->createSchema();
$sqls = $fromSchema->getMigrateToSql($toSchema, $toDb->getDatabasePlatform());

foreach ($sqls as $sql)
{
    echo "$sql;\n";
}
```

実行すると２つのDBのスキーマの差分が表示されます。

```console
$ php db-diff.php
```

これなら Doctrine の XML とか YAML とか無関係なので、Doctrine を採用していないプロジェクトでもマイグレーションを作成するために使えるかもしれません。
初心者のためのgitコマンド


# git init
gitで管理させたいディレクトリ上で、

```git
$ git init
```
をたたくと、そのディレクトリ内に`.git`という隠しファイルが生成される。この`.git`というファイルが含まれているフォルダとそれより下位にあるフォルダがgitで管理されることになる。

「gitで管理される」とは、後述する`git add`などのコマンドを用いることができるということである。
逆に、一般のディレクトリにはもともと`.git`が含まれておらず、gitコマンドは使えない。

# git add ファイル名
素のファイルをstage環境にあげたい場合、

```git
$ git add 「ファイル名」
```
をたたくと、そのファイルをstage環境に上げることができる。
stage環境というのは、「gitのローカルリポジトリに上げる準備が整った環境」であり、stage環境にあるファイルをコミットすると、gitのローカルリポジトリにあげられる。

## おさえておくべき知識①
gitは、

- 素のファイル

　　↓add

- stage環境（indexとも言われる）

　　↓commit

- git local repository

　　↓push

- git remote repository

の順に操作することでリモートリポジトリに上げることができる。

## おさえておくべき知識②
こまめに確認する癖をつけると事故らなくて良い。
addしたら、

```git
$ git status
```
や

```git
$ git diff --staged
```
により変更を確認すると良い。それぞれ、

- git status：現在の状態を表示

- git diff --staged：stage環境にあげたファイルの変更箇所を表示

である。

# git commit -m "メッセージ"
stage環境にあげたファイルたちをローカルリポジトリにあげたい（変更を反映させたい）場合、

```git
$ git commit -m "メッセージ"
```
とすることであげられる。
`-m "メッセージ"`は省略可能だが、書いてしまったほうが分かりやすいし後々便利。

# git push origin master
- originはリモートリポジトリのURLのエイリアス

- masterのところはブランチ名を書く

- master:masterは単にmasterと省略可能

ローカルリポジトリからリモートリポジトリに変更を反映（プッシュ）させたい場合、

```git
$ git push origin master
```

をたたけばOK！

# プルリク
- プルリクは pull request の略

- pull は push の逆。変更を送るのが push で、変更を受け取るのが pull

- つまり、プルリクとは「プルしてくださいと言うこと」である

実際の操作はWeb上のGitHubのページの右サイドバーにある Pull Requests から可能。

# ブランチ系のコマンド
## git checkout -b ブランチ名
自分用のブランチを作って、そこに移動するには、

```git
$ git checkout -b 「ブランチ名」
```

とすればOK！

- 「-b」は「（ブランチを）作る」

- 「-b」の b は「branch」の b

- 「checkout」は「（ブランチを）移動する」

を意味する。

## git checkout ブランチ名
ブランチの「移動」をしたいときはこれ。

## git branch ブランチ名
これだとブランチを「作る」だけ。移動もしたかったら`checkout`が必要。

## git branch -a
作られたブランチを全て見る。`-a`がなければローカルのみ、`-a`をつけるとローカルとリモート両方、作られたブランチを見ることができる。

# 最後におまけ（操作性up↑↑）
`~/.gitconfig`や`~/.bashrc`に変更を加える（or新規作成する）ことで、gitを使いやすくすることができる。

例えば、`~/.gitconfig`を変更させる場合、

```shell
$ vim ~/.gitconfig
```

をたたけば良い。これにより`~/.gitconfig`に書き込むことができ、

```~/.gitconfig
[alias]
	st = status
	ch = checkout
	br = branch
	co = commit
```
などとすることで、gitコマンドのショートカットが可能となる。
同様にして、`~/.bashrc`に

```~/.bashrc
alias g = 'git'
```
と記述することで、エイリアスの設定が可能。
Pythonであるディレクトリ以下のファイル全てに対して特定の文字列があるかチェックして対象行を出力

# 概要

[DIR_NAME]以下ファイル全てを対象に、
[TARGET_ENCODING_LIST]に定義されている文字コードのテキストファイルかチェックして、
テキストファイルなら、[SEARCH_WORD]があるか検索して、
結果を、[OUTPUT_NAME]のファイル名に出力します。


# 環境
Windows8＋Python2.6系


# コード

```python:find_directory.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: fileencoding=utf-8

import os , sys , codecs

DIR_NAME = 'C:\\html\\HOGE\\'
OUTPUT_NAME = 'result_find_file_list.csv'

SEARCH_WORD = '<font'

TARGET_ENCODINGS = [
	'utf-8',
	'shift-jis',
	'euc-jp',
	'iso2022-jp'
]

FLAG_STDOUT = True
#FLAG_STDOUT = False

import os, sys

write = sys.stdout.write

def guess_charset(data):
	file = lambda d, encoding: d.decode(encoding) and encoding
	for enc in TARGET_ENCODINGS:
		try:
			file(data, enc)
			return enc
		except:
			pass
	return 'binary'

out = codecs.open(OUTPUT_NAME, 'w', 'shift-jis')
out.write('path,line_number,search,target_line\n')

for dirpath, dirs, files in os.walk(DIR_NAME):
	for fn in files:
		path = os.path.join(dirpath, fn)
		fobj = file(path, 'rU')
		data = fobj.read()
		fobj.close()
		try:
			enc = guess_charset(data)
		except:
			continue
		if enc == 'binary':
			continue
		count = 0
		try:
			for l in codecs.open(path, 'r', enc):
				count = count + 1
				if SEARCH_WORD in l:
					output = ''
					try:
						output = '"' + path + '","' + str(count) + '","' + SEARCH_WORD + '","' + l.replace('"',"'").replace('\r','').replace('\n','') + '"\r\n'
					except:
						continue
					if FLAG_STDOUT == True:
						write(output)
					out.write(output)
		except:
			continue
```

# 補足

例によって、例外処理は、適当です。
いろいろリファクタリングの余地ありですが、
明日実戦投入したいので、一旦、このまま投稿
[一日一Vim](その2)便利な選択法

# ビジュアルモード
基本中の基本ですが、ノーマルモード中に`v`を押すとビジュアルモードになります。
ある文字を選択してコピー＆ペースト。文章編集のよくある動作だと思います。

最近知ったのですが、vの後に続けるコマンドによって、色々できるみたいです。
例えば`v`の後に`iw`と打てば、現在カーソルが当たっている単語を選択することができるようです。

他にも`vi"`と打てば、ダブルクオテーションでくくられている文字の中を選択することができるよう。

ほかにも`i`の代わりに`a`を使って、`va"` とするとダブルクオテーションを含めた文字の選択ができるようです。

`v`の代わりに`d`を使うと、選択ではなく、削除ができるようです。

最近でびっくりしたのは、`vit`と打つと、XMLやHTMLのインナーテキストを選択してくれることです。プラグインではなく、デフォルトで入っているのは意外でした。

この辺り、まとまったサイトを昔に見つけたのですが、どこだったのか忘れてしまいました。残念。。。
Pythonであるディレクトリ以下のファイル全てに対して文字コードが何であるかチェックして出力

# 概要

[DIR_NAME]以下ファイル全てを対象に、
[TARGET_ENCODING_LIST]に定義されている文字コードのテキストファイルかチェックして、
[OUTPUT_NAME]のファイル名に出力します。
判別出来なければ、binaryと出力されます。


# 環境
Windows8＋Python2.6系


# コード

```python:check_encoding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: fileencoding=utf-8

import os , sys

DIR_NAME = 'C:\\Program Files\\'
OUTPUT_NAME = 'result_file_encoding_list.txt'

TARGET_ENCODING_LIST = [
	'utf-8',
	'shift-jis',
	'euc-jp',
	'iso2022-jp'
]

FLAG_STDOUT = True
#FLAG_STDOUT = False

import os, sys

write = sys.stdout.write

def guess_charset(data):
	file = lambda d, encoding: d.decode(encoding) and encoding
	for enc in TARGET_ENCODING_LIST:
		try:
			file(data, enc)
			return enc
		except:
			pass
	return 'binary'

out = open(OUTPUT_NAME, 'w')
for dirpath, dirs, files in os.walk(DIR_NAME):
	for fn in files:
		path = os.path.join(dirpath, fn)
		fobj = file(path, 'rU')
		data = fobj.read()
		fobj.close()
		try:
			enc = guess_charset(data)
		except:
			continue
		str = path + ',' + enc + '\n'
		try:
			if FLAG_STDOUT == True:
				write(str)
			out.write(str)
		except:
			continue
```


# 補足

例外処理は、適当です。
ファイル名に日本語文字が含まれていると、文字化けしたりします。
POSIX 2013 でシグナルハンドラで出来ることの制限が緩和された件

POSIX 2013 より前の POSIX 規格では、[シグナルハンドラ内で出来ることはかなり制限されてゐました](http://d.hatena.ne.jp/yupo5656/20040712/p2)。出来ることはせいぜい volatile な sig_atomic_t 型の静的記憶域期間変数に値を代入することによってフラグを立てる程度でした。

[POSIX 2013](http://pubs.opengroup.org/onlinepubs/9699919799/) ではシグナルハンドラの制約が緩和され、単一スレッドプログラムでは以下の様な場面で「シグナルハンドラ内で何をしても良い」ことになりました。

1. sigprocmask 関数でシグナルをブロックしておく。また sigaction 関数等でシグナルハンドラを設定しておく。
1. スレッドにシグナルが送信される (が、ブロックされてゐるのでシグナルハンドラはまだ呼ばれない)。
1. sigprocmask 関数 (または pselect や sigsuspend 等) でシグナルのブロックを解除する。この時 sigprocmask 関数等が返る前にシグナルハンドラが実行される。

これを利用すると、例へば以下の様なことが可能になります。

## シグナルを受信した回数を数へる

以前の制約のもとでは volatile sig_atomic_t 型の静的記憶域期間変数を読むことができなかったため、値をインクリメントすることができませんでした。そのためシグナルハンドラから代入できる値は固定値のみでした。

新しい制約では値を読むことができるので変数のインクリメントをすることができます。これにより同じシグナルを複数回受信したときに受信回数を正確に数へることができます。

## シグナルハンドラ内で直接複雑な処理をする

非同期シグナル安全でない関数 (malloc や printf 等) をシグナルハンドラ内で自由に呼ぶことができます。

特に、 sigaction で SA_SIGINFO フラグを使ってゐる時に、シグナルハンドラに渡された siginfo_t 型のデータを扱ふのが容易になりました。従来は、 siginfo_t の中身をパイプに write してシグナルハンドラの外で read するなどしなければ siginfo_t のデータを取り出した後さまざまな用途に応用することができませんでした。
Firefox、Thunderbird 使えるアドオン集


## Firefox

```
■Firebug 
=> Web開発の鉄板
■FireGestures 
=> マウスジェッシャー
■Gmail Manager
=> Gmail使っている人はこれ
■Tab Mix Plus
```

## Thunderbird

```
Thunderbirdは使いやすくするためにある程度設定する必要がある。
それをいかにまとめます。

■メールが72文字で改行されてしまう。
⇒ 「ツール」⇒「オプション」⇒「詳細」⇒「設定エディタ」⇒「mailnews.wraplength」の値を0にする。

■HTMLメールをやめる
「ツール」⇒「アカウント」⇒「編集とアドレス入力」⇒「HTML形式」のチェックを外す。

■お勧めのアドオン
1.Quicktext　　　 => 定型文を保存できる神アドオン
2.Lightning 　　　=> Googleカレンダーツール
3.Google Contacts => Google連絡先を同期させるツール
```
よく使うGemとその対応編


■概要
筆者がよく使うGemとその依存関係、バージョン依存等を記載します。

## [kaminari](https://github.com/amatsuda/kaminari)

ページネーション

最新安定板を常に使用するのがよい。
Rails 4.1に対応しています。

github master HEADの活用も合わせて推奨
※ すでにサービスリリースしてあるプロジェクトの場合、
  最新版が良いと思います。

## device

認証：デファクトスタンダードになっている。

非常に癖が強いが使いこなせば、かなり色々出来ます。
・facebook認証
・twitter認証
・Google+認証

## paperclip

 画像アップデート整形
 要imagemagic
 
## geocoder

 google mapのAPIです。

## [pry-rails](https://github.com/rweng/pry-rails)

 コンソールデバック用です。

## rack-mini-profiler

Webの速度計測をするツールです。
initializeに以下のことをかけばdeveloperモードのみ発動します。

	if Rails.env == 'development'
  		require 'rack-mini-profiler'

  		# initialization is skipped so trigger it
  		Rack::MiniProfilerRails.initialize!(Rails.application)
	end
Rでの例外処理(tryCatchの使い方メモ)


## 用語

Rでは、signalされたconditionをhandleすることで、例外を処理する。

## 基本

- 失敗するかもしれない処理を、tryCatchのexpr引数に渡す(この処理の返り値が、tryCatchの返り値になる)
- 例外情報は、conditionクラスのオブジェクトの中にまとめられて、signalされる
- 例外を捕まえるには、tryCatchの「...」引数に、「捕まえるconditionのクラス=handler」を渡す
- finallyに、後始末を書く

## 要するに

こう書く

```r:sample.r
tryCatch(失敗するかもしれない処理,
         error=エラーを処理する関数,
         message=メッセージを処理する関数, etc...
         finally=finallyな処理)
```

## 例

ODBC接続文字列とクエリを受け取り、DBに接続して、sqlを投げる。失敗したら、エラーと共に、接続文字列・クエリを表示。最後に、接続を切る。

```r:try_sql.r
library(RODBC)

try.sql <- function(con.str, sql){
    tryCatch({
        con <- odbcDriverConnect(con.str)
        sqlQuery(con, sql)
    },
             error=function(e){
                 print(sprintf("Query failed:
connection string=%s
sql=%s
",
                               con.str, sql))
                 print(e)
             },
             finally=odbcCloseAll()
             )
}
```
TortoiseSVN1.8.6でクライアント証明書を利用した認証がうまくいかない場合

## TortoiseSVNのversion 情報

~~~
TortoiseSVN 1.8.6, Build 25419 - 64 Bit , 2014/04/12 11:40:48
Subversion 1.8.8, -release
apr 1.5.0
apr-util 1.5.3
serf 1.3.4
OpenSSL 1.0.1g 7 Apr 2014
zlib 1.2.8
~~~

## 問題

何らかの操作時にクライアント証明書が必要な場合、ご丁寧に証明書選択ダイアログが表示されるんだけどwindowsにストアされている証明書を選択した場合、以下の様なエラーメッセージを吐いて失敗する。

~~~
Error running context: An error occurred during SSL communication
~~~

## 証明書情報のクリア

一度選択すると、それ以後どの証明書を利用するか記録されてしまうので、情報を一度クリアしてやる。
TortoiseSVN context menu > Settings > Saved Data > Authentication data > Clear... > 該当の証明書情報をチェックして削除

## p12を直接指定して接続

気を取り直してcheckoutをしようとすると例によって証明書選択ダイアログが出てくるんで、これをキャンセルすると証明書を選択するダイアログがでてくる。このダイアログでp12のファイルを直接指定してやった場合うまく動作する。

## svn servers設定の書き換え

毎度毎度p12のダイアログで証明書を選択してた場合発狂するので設定してやる。

「%APP_DATA%/Roaming/Subversion/servers」このファイルに追記　これで少なくともp12の選択ダイアログは出てこなくなる。

~~~
ssl-client-cert-file=C:/cert/hogehoge.p12
~~~

複数serverにいろんな証明書使ってる場合は[group]とか使って指定してやればいい、このへんのナレッジはそこら中にある


## 知りたい

* windowsの証明書ダイアログで選択したやつが上手く動かないのか。

* update,commit毎にwindowsにstoreされた証明書の選択ダイアログが出てきて正直使い物にならんのでこれを回避する方法が知りたい。

serversの中でssl-authority-filesとかも指定してやりゃいいのかな。

git使えgit

参考資料
同じ問題っぽい
http://tigris-scm.10930.n7.nabble.com/Trouble-with-client-certificates-in-Windows-certificate-store-td27524.html
https://groups.google.com/forum/#!topic/tortoisesvn/AE38rSyZV-k
ネストしたモデルでhuman_attribute_nameを使う

#モデルでの多言語対応
Railsのモデルでは、規則に沿った定義になっていればhuman_attribute_nameで多言語対応できる。
例えば、

```yaml:ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: 名前

```
だとすると

```irb

User.human_attribute_name :name
=> "名前"

```

app/models/以下に直接配置してあるような通常のモデルだとこれでOKだが、更にネストするようなモデルだと一工夫必要になる

#ネストしたモデル
## ActiveRecordの場合
例えば以下のような形であったとすると、

```rb:app/models/i18n_sample/a.rb

module I18nSample
  class A < ActiveRecord::Base
  end
end

```

localeファイルの構成は以下になる

```yaml
ja:
  activerecord:
    attributes:
      i18n_sample/a:
        name: 名前A

```

結果は

```irb
I18nSample::A.human_attribute_name :name
=> "名前A"

```

モデル名に当たるキーは

```irb

I18nSample::A.model_name.i18n_key
=> :"i18n_sample/a"

```

で取得できるみたい

## ActiveModelの場合
Rails4からはDBに保存しないモデルであってもActiveModelをincludeすることでValidation等の機能を追加することができる。
直接使用する機会が増えたような気がするActiveModelでも同じように対応するが、（あたりまえだけど）activerecordをactivemodelに変更しないと動かないのがハマりポイントだった。

```rb
module I18nSample
  class B
    include ActiveModel::Model
  end
end
```

だったとすると、

```yaml
ja:
  activemodel:
    attributes:
      i18n_sample/b:
        name: 名前B
```

```irb
I18nSample::B.human_attribute_name :name
=> "名前B"
```

#まとめ

```yaml

ja:
  activemodel:
    attributes:
      i18n_sample/b:
        name: 名前B
  activerecord:
    attributes:
      user:
        name: 名前
      i18n_sample/a:
        name: 名前A
```

#参考
ちなみにMongoIdとかでも同じように対応できるらしい（未確認）
http://apidock.com/rails/ActiveModel/Translation/human_attribute_name
擬似クラスのスタイルを確認するのに便利な機能


## やり方

* Elementsパネルで擬似クラスを付けたい要素を右クリック
* Force Element Psuedo States → [:avtive, :hover, :focus, :visited] から選択

![スクリーンショット 2014-04-15 21.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/17969/26e87efb-c9af-5c60-6deb-31f47b68ac54.png "スクリーンショット 2014-04-15 21.36.45.png")


もしくは

* 要素を選択
* Stylesパネルの右上、`+`の横の矢印をクリック
* [:avtive, :hover, :focus, :visited] から選択

![スクリーンショット 2014-04-15 21.37.31のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/17969/933af726-799a-11ae-2343-2cde4157f345.png "スクリーンショット 2014-04-15 21.37.31のコピー.png")


擬似クラスをつけた要素はElementsパネルに目印としてオレンジ色の●がつきます。


![スクリーンショット 2014-04-15 21.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/17969/a1bfa11f-9a71-1982-c105-de61ca9bc486.png "スクリーンショット 2014-04-15 21.37.46.png")


---

だいぶ前からあった機能なのに最近知って震えてる:;(∩´﹏`∩);:
Emacs23.3でmikutter-modeを導入してハマった所

#お知らせ
elファイルのインストールについては、今回のポイントになるところ以外は書きません。

# 対象読者
* Emacs24以前使ってる人
* mikutter関係な人
  - 使ってる人
  - plugin書いている人

# とりあえず、インストールしてみよう
mikutter-modeについてはtoshi_aさんの[githubのリポジトリ](https://github.com/toshia/mikutter-mode)からダウンロードできますので、依存条件も参照しながら必要な物をまずは導入してください。
そして、重要なのが導入要件がこちら
>
* ruby-mode
* **yasnippet**
 
先にruby-modeは入っていると仮定して、yasnippetを先に入れて
> M-x eval-buffer

と設定ファイルを評価してみましょう、こんな表示がミニバッファにやってくるはずです。

> Cannot cl-lib hogehoge(覚えてない)

これがEmacs24以前と対象読者に指定した最大の理由になります。
*cl-lib.elというファイルが無いんです*
重要なのでもう一度
**cl-lib.elというファイルが無いんです**。

では、「じゃじゃじゃあ、導入しようじゃないか！」と某ローカル番組のディレクターの様に動きますよ。

## cl-libを入れよう
cl-libは[GNU ELPA - cl-lib](http://elpa.gnu.org/packages/cl-lib.html)から、ダウンロードできます。
とりあえず、現時点(2014/04/15)で最新版の0.5をダウンロードしましょう。
ダウンロードしたらコマンドラインで所定の場所にコピーします(要root権限)

`sudo cp cl-lib.el /usr/share/emacs/Version/lisp/elisp`

そして、また設定ファイルを再評価すれば今度こそきちんと動くはずです。

# まとめ
* Emacsのバージョンによっては無いものがある
* mikutterプラグイン開発は結構楽しい
* 開発したものは[masayoshimashita - github](https://github.com/masayoshimashita/)にあるので、適当に煮炊きしてください
Titanium製iOSアプリの言語設定を日本語に

多言語対応の話とかではなくて、
何もしなくても日本語限定で作れば日本語なんですが
WebView内の画像選択のところとかみたいな弄らずに使うところがそのままだと英語になってしまうよねー
という話。

とりあえずなんでそうなってるのかなーと原因を探って作られたiPhoneアプリ側の
build/iphone/Info.plistを見てみると

```xml:Info.plist
〜略
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>English</string>
略〜〜
</dict>
```

あーこれだよねー。

ということで tiapp.xml に

```xml:tiapp.xml
〜略
    <ios>
        <plist>
            <dict>
                <key>CFBundleDevelopmentRegion</key>
                <string>Japanese</string>
略〜
```

といった感じでios>plist>dict内に追加しました。

Webviewからの画像選択のインターフェイスとかも無事日本語になりました。

iOSのplistのデータを弄るんじゃなくてTitanium側で何か設定したら吐き出すplistが変わるよ。
みたいな設定あるならそっちの方が良いと思われるのでそういうのあったら教えて下さい。
Linux上でアクセスされているファイルをtraceしてみる


# 背景

PHP初心者がPHPのデバッグをしていて、どのファイルがどんなタイミングで参照されているか知りたかったため。

# 自分の環境

 * Vagrant上のCentOS 6

# 一度だけやる準備

straceを導入

```bash:
$ sudo yum -y install strace
```

# トレースのたびに毎回やる準備

まず httpd のプロセスIDを調べる

```bash:
$ ps -ef | grep http[d]
root      2394     1  0 Apr14 ?        00:00:17 /usr/sbin/httpd
apache    3984  2394  1 20:34 ?        00:00:00 /usr/sbin/httpd
apache    3985  2394  0 20:34 ?        00:00:00 /usr/sbin/httpd
apache    3986  2394  0 20:34 ?        00:00:00 /usr/sbin/httpd
(略)
```

こいつが親プロセス(親PIDが1でUSERがroot)

```bash:
root      2394     1  0 Apr14 ?        00:00:17 /usr/sbin/httpd
```

ターミナルでstraceを起動

```bash:
$ sudo strace -f -p 2394 -e trace=file
```

別のターミナルで子プロセスを作り直す(説明は省略。 strace の -f オプションを与えている理由に通じている。)

```bash:
$ sudo service httpd reload
Reloading httpd:
```

あとはブラウザからapacheに接続すると、ファイルシステムに関するイベントがターミナル1にバンバン流れる。

結果をファイルに書き出したいときは：

```bash:
$ sudo strace -f -p 2394 -e trace=file -o /tmp/trace.log
```

詳しくは `man strace` する

# こんなログが取れる

CakePHPが起動していくさま

```
(略)
4046  stat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  stat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  stat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  getcwd("/", 4095)                 = 2
4046  chdir("/var/www/html/app/webroot") = 0
4046  lstat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  lstat("/var/www/html/app/webroot", {st_mode=S_IFDIR|0755, st_size=374, ...}) = 0
4046  lstat("/var/www/html/app", {st_mode=S_IFDIR|0755, st_size=612, ...}) = 0
4046  lstat("/var/www/html", {st_mode=S_IFDIR|0755, st_size=782, ...}) = 0
4046  lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
4046  lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
4046  open("/var/www/html/app/webroot/index.php", O_RDONLY) = 14
4046  lstat("/var/www/html/lib/Cake/bootstrap.php", {st_mode=S_IFREG|0644, st_size=14354, ...}) = 0
4046  lstat("/var/www/html/lib/Cake", {st_mode=S_IFDIR|0755, st_size=782, ...}) = 0
4046  lstat("/var/www/html/lib", {st_mode=S_IFDIR|0755, st_size=102, ...}) = 0
4046  open("/var/www/html/lib/Cake/bootstrap.php", O_RDONLY) = 14
4046  lstat("/var/www/html/lib/Cake/basics.php", {st_mode=S_IFREG|0644, st_size=23183, ...}) = 0
4046  open("/var/www/html/lib/Cake/basics.php", O_RDONLY) = 14
4046  lstat("/var/www/html/lib/Cake/Core/App.php", {st_mode=S_IFREG|0644, st_size=28002, ...}) = 0
4046  lstat("/var/www/html/lib/Cake/Core", {st_mode=S_IFDIR|0755, st_size=204, ...}) = 0
4046  open("/var/www/html/lib/Cake/Core/App.php", O_RDONLY) = 14
(略)
```

# 関連

Macの場合はfs_usageを使うのがよいと思う。

http://d.hatena.ne.jp/eco31/20091019/1255960823
ruby: wrong number of arguments


rubyでプログラミングする際に，良く間違えるけど，どう間違ったのか分かりにくいエラー．

例えば，

```ruby
class A
	attr_accessor :x

	def initialize(x)
		@x= x
	end	
end
```

のように，``x``という変数にアクセスできるクラスがある．
これにアクセスする次のようなプログラムを考える．

```ruby
a= A.new(1.0)
b= (a.x +1.0)
```

これを実行しようとすると，おそらく，「wrong number of arguments (1 for 0)」となる．
これは，「a.x」が関数なので，その関数が「+1.0」という引数を取っていると判断されているからである．

```ruby
a= A.new(1.0)
b= (a.x() +1.0)
```

このように，「a.x()」のように明示的に引数は0個だと書けば，上のような問題がなくなる．

しかしまぁ，関数呼び出しの書き方が複数あると便利なようだけど，分かりにくいエラーの原因となる．
よく使うgit command

# よく使うgit command

## git clone git@github.com:yanap/learning.git

リモートリポジトリをcloneする
ま、ダウンロードする感じ

## git add

新しいファイルを追加する

### 全部追加する

```
git add -A
```

## git commit

git add されたファイルをcommitする

### addか変更したファイルの差分を表示して、commit画面を出す

```
git commit -av
```

### commit画面をスキップする

```
git commit -m
```

### commitメッセージをやり直す

```
git commit --amend
```

## git status

編集状況を確認する

## git rm

gitの管理下からファイルを消す

### addしたファイルを取り消す

```
git rm --cached
```

## git diff

差分を表示

## git branch

ブランチを一覧を表示

### リモートブランチを表示

```
git branch -r
```

## git checkout

ブランチを切り替える

### checkoutするときにブランチを作る

```
git checkout -b any_branch
```

### ファイル指定で作業をリセットする

```
git checkout HEAD any_file
```

正確には、HEADのcommitの状態に切り替えることで、修正をなかったことにする

## git push

branchをリモートにpushする

### ブランチを指定してpush

```
git push origin any_branch
```

### 指定のリモートブランチを消す

```
git push origin :any_branch
```

空をpushしてるわけです。


## git log

commitの履歴を確認する

### 編集したファイル名を出す

```
git log --stat
```

### 編集したコードのdiffを出す

```
git log -p
```

tigの方が・・・

## git remote

リモートに関する作業

### 登録されているリモート情報を表示

```
git remote -v
```

### リモートリポジトリを登録する

```
git remote add git@github.com:yanap/learning.git
```

### リモートリポジトリを削除する

```
git remote remove git@github.com:yanap/learning.git
```

### リモート上の削除されたブランチがあるかどうか確認する

```
git remote show origin
```

### リモート上の削除されたブランチをローカルから消す

```
git remote prune origin
```

## git stash

作業を一時的に保存する

### 保存

```
git stash save
```

### 戻す

```
git stash pop
```

## misc

### 作業中のファイルをリセットして、リモートから最新のファイルを取得してリベースする

```
git reset --hard && git pull --rebase
```

### ブランチをまとめて消す

```
git branch | xargs git branch -d
```

### ブランチをまとめて消す (強制)

```
git branch | xargs git branch -D
```

### 人指定、期間指定、フォーマット指定、ソート指定で履歴を見る

```
git log --since=4.weeks --author=yanai --reverse --no-merges --format="%s%n%b"
```


### 直前のコミットのメッセージと日付を書き換える
```
 git commit --amend --date="Fri Jun 27 20:00:00 2014 +0900"
```
phantomJSのタイムアウト


ふつうはこう書けば20秒立った時にexitする。

```coffee
setTimeout ->
  console.error 'execution timeout.'
  phantom.exit 10
, 20 * 1000
```

リソースのロードのタイムアウトはこれ

```coffee
page.onResourceTimeout = () ->
  console.error 'resource timeout'
```

js loopで止まらない時はこれ。 [Define the new page callback for interrupting a long-running JavaScript · efcc6c7 · ariya/phantomjs](https://github.com/ariya/phantomjs/commit/efcc6c78)

```
page.onLongRunningScript = () ->
  
```

でもけっきょくphantomごと止めちゃうようなのがあるので外側でtimeout監視してkillするひつようあり。
細かい事を抜きにしてServerSpecを速攻試してみた

<img src="http://nikuniku.me/wp-content/uploads/serverspec_logo.png" alt="serverspec_logo" title="serverspec_logo.png" border="0" width="378" height="105" />
サーバーの設定をしていて、やはり設定が漏れてしまうことが多々ある。
そういえばサーバーのテストができるツールがあったよなーと思い出したのが、ServerSpecだった。
とりあえず細かいことは抜きにして、試してみた。

<h2>ServerSpecとは？</h2>
<BLOCKQUOTE>
With serverspec, you can write RSpec tests for checking your servers are configured correctly.

Serverspec tests your servers' actual state through SSH access, so you don't need to install any agent softwares on your servers and can use any configuration management tools, Puppet, Chef, CFEngine and so on.
</BLOCKQUOTE>
サーバーが正しく設定されているかチェックするためのRSpecのテストを書くことができます。
ServerspecはSSHアクセスを介して、サーバの実際の状態をテストしますので、あなたのサーバーにエージェントソフトウェアをインストールする必要はありませんし、どのような構成管理ツール、というようにPuppet、Chef、cfengineのとを使用することができます。

<strong>サーバー側にエージェントをインストールする必要がない！</strong>
これは大きいと思う。

<h2>インストールと実行</h2>
参考にしたサイト
<a href="http://qiita.com/ando-masaki/items/b03342b465b7159ffe1f" target="_blank">serverspecの使い方</a>
ありがとうございます！

<pre>
$ gem install serverspec
</pre>

<pre>
$ serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: www.example.jp
 + spec/
 + spec/www.example.jp/
 + spec/www.example.jp/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile
</pre>
initするとどんなサーバーなのか質問されるので、回答する。

コマンド実行したディレクトリにspecディレクトリが生成されている。
spec以下にさきほど入力したホスト名でディレクトリがあり、そこにサンプルのテストコードが生成される。
<pre>
require 'spec_helper'

describe package('httpd') do
  it { should be_installed }
end

describe service('httpd') do
  it { should be_enabled   }
  it { should be_running   }
end

describe port(80) do
  it { should be_listening }
end

describe file('/etc/httpd/conf/httpd.conf') do
  it { should be_file }
  its(:content) { should match /ServerName www.example.jp/ }
end
</pre>
apacheが入っているかチェックするテストコードみたい。


サンプルを試してみる。
<pre>
$ rake spec
・
・
・
略）
Finished in 0.79426 seconds
6 examples, 1 failure
</pre>
※最初はrakeが無い！って怒られたようなので、gem install rakeを行った。
6個のうち１個テストが通らなかったらしい。。。
httpd.confのServerNameがホスト名と合ってないっぽい。あとで見てみよう。

ハマったところとしては、sshするときのユーザーがよくなかったというのがあった。
実はサーバー（さくらのVPS）を設定したときに、rootでssh接続できないようにしていた。
なので、一般ユーザでテストを行っていたのだけど、rootじゃないと叩けないコマンド（たぶんserviceとか）が叩けなくてテストが通らずにいた。
rootでsshできるようにサーバーを設定し直したところ、テストが通るようになった。

まだまだ覚えることは多いなー^^;


<h2>まとめ</h2>
ServerSpecはサーバーにインストールいらずで、手軽に使える良いツール。
RSpecをチームで共有するとテストの効率があがるかも？
MacOSX で nkf を使う


nkf (http://sourceforge.jp/projects/nkf/) は、ファイルの文字セットを変換するコマンド。Network Kanji Filter の略らしい。改行コードの変換もできるんだって。

# MacPort で nkf をインストール

```
$ port search nkf
$ sudo port install nkf
```

# Homebrew で nkf をインストール

```
$ brew install nkf
```


# 参考にしたページ

詳しくはこちらのページを参考に。

- [Linuxコマンド集 - 【 nkf 】 文字コードを変換する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/)
- [Linux - macにnkfコマンドがないだと！？じゃあ入れよう！ - Qiita](http://qiita.com/kou_bacchus/items/6448608ee03b0a71dcd4)
- [[Mac] nkf を Homebrew でインストール | CodeNote.net](http://codenote.net/mac/homebrew/1747.html)
NSDate の compare 結果を100倍分かりやすくする

NSDate の compare: は NSComparisonResult を返すのだが、NSOrderedAscending と NSOrderedDescending はどっちがどっちなのか直感的に分かりにくい。比較演算子ならそうでもないんだけど、Ascending と Descending という単語を解釈するのに時間がかかる。なので最初から別の言葉に置き換えてしまう。

```objc
#define WKR_IsEarlier NSOrderedAscending
#define WKR_IsLater NSOrderedDescending

#define WKR_L_IsMorePastThan_R NSOrderedAscending
#define WKR_L_IsMoreFutureThan_R NSOrderedDescending


NSDate* now=[NSDate date];
NSDate* past=[now dateByAddingTimeInterval:-100000];

if ([now compare:past]==WKR_IsLater) {
    NSLog(@"now is later than past");
}
```
prefix header に書いとくとよいかもしれません。


CMTime を比較するマクロ `CMTIME_COMPARE_INLINE` をパクってこういうのもかっこいい ( @norio_nomura さんのおかげで思い出せました)。

```objc
#define MY_NSDATE_COMPARE_INLINE(date1, comparator, date2) ((BOOL)([date1 compare:date2] comparator 0))

NSLog(@"%d", MY_NSDATE_COMPARE_INLINE(now, <, past)); //NO
NSLog(@"%d", MY_NSDATE_COMPARE_INLINE(now, >, past)); //YES
NSLog(@"%d", MY_NSDATE_COMPARE_INLINE(now, ==, now)); //YES
NSLog(@"%d", MY_NSDATE_COMPARE_INLINE(now, ==, past)); //NO
```

あ、これもしかして3つ比較できるんじゃね？

```objc
#define MY_NSDATE_TRI_COMPARE_INLINE(date1, compA, date2, compB, date3) ((BOOL)(([date1 compare:date2] compA 0) && ([date2 compare:date3] compB 0)))

NSDate* now=[NSDate date];
NSDate* past=[now dateByAddingTimeInterval:-100000];
NSDate* future=[now dateByAddingTimeInterval:100000];

NSLog(@"%d",MY_NSDATE_TRI_COMPARE_INLINE(past, <=, now, <=, future)); //YES
```
Rubyメソッドの引数の数を知る

# Rubyメソッドの引数の数を知る

[Method#parameters](http://docs.ruby-lang.org/ja/1.9.3/class/Method.html#I_PARAMETERS)

> Method オブジェクトの引数の情報を返します。

> Method オブジェクトが引数を取らなければ空の配列を返します。引数を取る場合は、配列の配列を返し、 各配列の要素は引数の種類に応じた以下のような Symbol と、仮引数の名前を表す Symbol の 2 要素です。 組み込みのメソッドでは、仮引数の名前が取れません。

> :req
必須の引数

> :opt
デフォルト値が指定されたオプショナルな引数

> :rest
* で指定された残りすべての引数

> :block
& で指定されたブロック引数

サンプル

```rb
class Foo
  def self.foo(a)
  end
  def bar(a, b=1, &block)
  end
end

Foo.method(:foo).parameters
#=> [[:req, :a]]
Foo.new.method(:bar).parameters
#=> => [[:req, :a], [:opt, :b], [:block, :block]]
```

取れた ^^

必須引数だけカウントしたい場合)

```
m = Foo.new.method(:bar)
m.parameters.select {|param| param.first == :req }.size
```

オプション引数も合わせてカウントしたい場合)

```
m = Foo.new.method(:bar)
m.parameters.select {|param| param.first == :req || param.first == :opt }.size
```

# #initialize メソッドの引数の数を知る

疑問に思ったのは #initialize の引数の数をどうとるのか。

```rb
class Foo
  def initialize(a, b=1)
  end
end

Foo.new("a").method(:initialize).parameters
# => 取れるけど、new しちゃってるし、これはちょっと。。。
```

この場合は、[Class#allocate](http://ref.xaio.jp/ruby/classes/class/allocate) を使えばよさそう。オブジェクト作成だけやって、#initialize は呼ばない。

```rb
Foo.allocate.method(:initialize).parameters
# => [[:req, :a], [:opt, :b]]
```

取れた :D

追記：[@a_matsuda](https://twitter.com/a_matsuda) さんに、[Module#instance_method](http://ref.xaio.jp/ruby/classes/module/instance_method) が使えると教えてもらった。

```rb
Foo.instance_method(:initialize).parameters
=> [[:req, :a], [:opt, :b]]
```

取れた :D

## 補足


もしくは [Method#arity](https://docs.ruby-lang.org/ja/latest/method/Method/i/arity.html) を使う
[CakePHP 2.x] ComponentからModelを読んでDBにアクセスする（Readのみ）

cakePhp何日目だろ。
そもそも[ShellのコードをComponentに移していたのですが](http://qiita.com/tsumekoara/items/d302cc0eeec3adc18456)、ComponentからDBにアクセスしなくちゃいけなくなりまして。
今のところ、ReadはできるけどWriteは出来ない状況です。

（そもそもComponentからDBへのアクセスは推奨されていないみたいですが...）

```php
class TamagoyakiComponent extends Component {
 
    public function hanjuku() {
         $keiranInstance = ClassRegistry::init('Keiran');
         $keiranCnt = $keiranInstance->find('count');
         return $keiranCnt;
    }
```

これは通りました。
Componentからモデル(Model/Keiran.php)を通じて、DBへのRead出来ました。。

```php
    public function cheeseIn() {
        $cheeseInstance = ClassRegistry::init('TorokeruCheese');
        $cheeseSaved = $cheeseInstance->save(array(
            'price' => 'priceless',
            'when'  => 'morning',
        ),false);
    }
}
```

~~でもこれは通らない。モデル(Model/TorokeruCheese.php)を通してDBへはリジェクトされている感じ。~~
~~詳しいことは未調査ですが、 とりあえずComponentからDBへのWriteはダメそうですね。~~

違っていたら、訂正情報を頂けたら幸いです。
Gradle で Maven から依存関係を解決しようとしたら怒られた時の対処

Artifact に、aar と jar の二種類があるものに対して、以下のように依存関係を記述すると、怒られる。

```groovy

dependencies {
    compile 'jp.co.nohana:Eligor:1.1.+'
}
```

コンソールに以下のように表示され、ビルドが失敗する。

```
Module version jp.co.nohana:Eligor:1.1.0 depends on libraries but is not a library itself
```

なんのこっちゃい、という感じではあるが、aar が欲しいのか jar が欲しいのか理解してないっぽいようなことがあるんじゃないかという推測で、以下のように書きなおしたら通った。

```groovy

dependencies {
    compile 'jp.co.nohana:Eligor:1.1.+@aar'
}
```
MySQLのSHOW PROCESSLISTで実行中のSQLを全部表示。。。


```
SHOW PROCESSLIST
```

現在実行中のプロセスの一覧を見るコマンドです。
バッチが動いてること確認したり、重いクエリ投げて返ってこない時なんかに使ってました。

Infoのところに実行中のSQLが1行分くらいで途中で切れて表示されてて、大体わかればいいし、まぁそういうもんかな。KILLできればいいやくらいに思ってました。

何気なく、MySQL Workbenchで右端にSnipetsを表示してみて
show processlistの項目を見て思ったこと。

```
SHOW [FULL] PROCESSLIST
```
あ、もしかしてできるんじゃ、、、

`SHOW FULL PROCESSLIST`
FULL付けないと100文字しか表示してくれてなかったんですね。。。

常識でしょって思われるかもしれませんが、恥ずかしながら、ついさっき気付きました。
wordpressの参考になる資料

http://www.slideshare.net/yuka2py/wordpress-wordpresswebapp
http://www.slideshare.net/yuka2py/wp-apiword-pressshare
http://www.slideshare.net/HishikawaTakuro/ss-9207838
http://www.slideshare.net/miyauchi/wordpress-17272822
http://www.idia.jp/report/database-on-wordpress/
http://wpdocs.sourceforge.jp/Main_Page
http://stocker.jp/diary/wordcamp-tokyo-2012-croppy/
Backbone.ModelのurlPathを指定したときの複数回fetchでハマった

こういうREST APIがあるとする。

```
GET /user     # 現在ログイン中のユーザーを取得する {id: 'foo', name: 'aaa', ...}
GET /user/:id # user id を指定して情報を取得する
```

urlPathはid付きのAPIを叩く。model.get('id')が空ならばそのまま

```coffeescript
class User extends Backbone.Model
  urlPath: '/user'

# 初期化する
foo = new User() # GET /user

# サーバー上で副作用が起きたので更新したくなった
foo.fetch()      # GET /user/foo
```

二回目のfetchも/userを期待していたのだが、一回目の副作用で id が初期化され、二回目は /user/foo を叩いていた。

/user でのみ取得できる、ログインしたユーザーのみが閲覧できるデータが更新されなくて、困った。なんとなしに手癖でurlPathを使っていた。

RESTってそういうもんだよなーと、種がわかればなんてことないが、エンドポイントがずれてることに気づかなくて無駄に時間がかかった。

この問題を回避したい場合は urlPathじゃなくてurlを使う。
productFlavorsを使ってGCMでハマった話

下書きに残っていたのでちょっと古めな記事です。

# productFlavorsが扱い易くなったよ

Android Studioが*.gradleファイルを読み込んでくれるようになってproductFlavorsを
build.gradleを直接編集することなく扱えるようになりました。
これを使えばpackageNameのsuffixにstagingやdevelopを付けて環境別のアプリを同一端末に入れることができる。

# AndroidManifest.xmlは書き換えてくれない

ビルドシステムがgradleに切り替わってからAndroidManifestの依存度が少しずつ低くなってきています。
compileSdkVersionやminSdkVersionやtargetSdkVersionはgradleのほうが優先されます。
これで一度痛い目を見ました。

また、productFlavorsで書き換えられるのはAndroidManifestの上部にある`package="com.epy0n0ff"`あたりだけのようです。
ソースコードパッケージ名とアプリケーションパッケージ名は別扱いのため、アプリケーションパッケージ名を使うGCMのパーミッションもproductFlavorsを変えただけでは書き換わってくれません。

## どうするよ

よーし、パパsedで書き換えちゃうぞー。

```shell-session
# GCM周りをパッケージ名に合わせて書き換え
# <permission>と<uses-permission>タグ
sed -i -e 's/com.epy0n0ff.permission.C2D_MESSAGE/com.epy0n0ff.develop.permission.C2D_MESSAGE/g' ./Hatrakitakunai/src/main/AndroidManifest.xml

# <intent-filter>内の<category>タグ
sed -i -e 's/android:name="com.epy0n0ff"/android:name="com.epy0n0ff.develop"/g' ./Hatarakitakunai/src/main/AndroidManifest.xml

# アプリ名も変更
sed -i -e 's/android:label="@string\/app_name"/android:label="Hatarakitakunai develop"/g' ./7gogo/src/main/AndroidManifest.xml
```

よし、これでいける！と思ったがそうはいかなかった。
GCMレシーバクラスをデフォルトのままにしていると`GCMIntentService`クラスもアプリケーションパッケージ名に影響を受けて`com.epy0n0ff.develop.GCMIntentService`を呼び出してしまいます。

## レシーバーをカスタム

対策方法としては`GCMReceiver`を継承したクラスを作りパッケージ名を含めたクラス名を渡してやる必要があります。

```java
public class GCMReceiver extends GCMBroadcastReceiver {
    @Override
    protected String getGCMIntentServiceClassName( Context context ) {
        return GCMIntentService.class.getCanonicalName();
    }
}
```

また、AndroidManifestのほうはデフォルトのレシーバクラスなので追加したものに変更します。

```xml
<service android:name="com.epy0n0ff.GCMIntentService"/>
<receiver
    android:name="com.epy0n0ff.GCMReceiver"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>

        <category android:name="com.epy0n0ff"/>
    </intent-filter>
</receiver>
```

これで無事GCMへの登録ができ、環境別のアプリをビルドできるようになりました。
大量のファイルをフォルダーに整理

## いきさつ
格安監視カメラを導入した際に、画面内に変化があると動体検知が働いてその画像を任意のFTPサーバにアップロードする設定を行った。
動体検知のしきい値がいい感じに敏感で太陽の動きやちょっとしたショックでバシャバシャ撮影してアップロードしまくる。アップロード先は任意のPathなので、同一階層に何万ファイルも貯まることになってしまった。
## 対策
年月くらいのフォルダーに分散してくれると嬉しいなぁってことで、ファイル名を参考に、フォルダー掘ってひたすら移動するだけのスクリプトをこしらえることにした。

# コード
```:python


#!/usr/bin/env python
#coding:utf-8

import os
import shutil

JPG_FILE_LIST = []
TGT_FILE_TYPE = '*.jpg'

# JPGファイルの一覧作成
# 特定拡張子のファイル名だけ取得
def get_filename_only_ext(ext_str="*.jpg"):
  import glob
  global JPG_FILE_LIST
  file_list = glob.glob(ext_str)
  JPG_FILE_LIST = file_list
  #for file in file_list:
  #  print(file)
get_filename_only_ext( TGT_FILE_TYPE )
print JPG_FILE_LIST


def main():
  # 1行毎にファイル名抜き出す
  for cur_file in JPG_FILE_LIST:
    print cur_file
    ## ファイル名から移動先フォルダ名生成
    # sample_file_name : IPC_IPCamera_14_1_23_22_55_38.jpg
    fn = cur_file.split("_")
    dist_folder = "20" + fn[2] + "-" + "%02d"%int(fn[3])

    ## 移動先のフォルダー存在を確認する
    ## # フォルダーがない場合には作成する
    if False == os.path.exists( dist_folder ):
      os.mkdir( dist_folder )
      print "make dir: ", dist_folder

  ## 移動先のフォルダーに移動する
    else:
      shutil.move(cur_file, os.path.join( dist_folder, cur_file))
      print "move : ", cur_file


if __name__ == '__main__':
  main()
  print 'done'

```

# その後
sakuraのレンサバで動かそうと思ったら
色々import出来ずに動かせていない orz