OmniAICreator/Qiita-1.07M huggingface dataset:
Safariでフォームを選択した時のようなPickerViewの配置

今回はSafariでフォームを選択した時のようなPickerView を配置する方法をかきたいと思います。
![iOSシミュレータのスクリーンショット 2013.12.17 21.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/20529/030874f2-183c-5ad0-a5ee-73650679931c.png)

#ナビゲーションバー無しの場合
##画面を配置
今回は単純な実装にするためにDatePickerを置いた画面とそれを呼び出す画面にしています。
「Picker表示ボタン」からDatePickerを置いた画面をModalで呼び出すようにしています。
![スクリーンショット 2013-12-17 21.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/20529/4b70c661-23f8-62cb-577d-4a283e633a79.png)

呼び出す側の画面は分かりやすいように背景色を着色、呼び出される側の画面は背景色をDefaultにしています。
![スクリーンショット 2013-12-17 21.28.28.png](https://qiita-image-store.s3.amazonaws.com/0/20529/0d8e64a8-b5d4-81c1-c53e-2701f96bc8da.png)

##一旦実行
これをそのまま実行してしまうと真っ黒の画面が表示されてしまいます。
![iOSシミュレータのスクリーンショット 2013.12.17 21.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/20529/2c893611-7bb2-7849-e817-bd9ddb371af2.png)

##ViewControllerを修正
呼び出す側のViewControllerを修正します。
呼び出す側のmodalPresentationStyleをUIModalPresentationCurrentContextに変更します。

```objc:ViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    // ↓のコードを追加
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
}
```

##あらためて実行
背景がちゃんと透過されて表示されます。
![iOSシミュレータのスクリーンショット 2013.12.17 21.31.42.png](https://qiita-image-store.s3.amazonaws.com/0/20529/8a728e55-cab0-17f7-a78c-72ae6900e317.png)

#ナビゲーションバー有りの場合
##画面を配置
ナビゲーションバー無しの場合と同じような構成で画面を配置します。
今回も「Picker表示ボタン」からDatePickerを置いた画面をModalで呼び出すようにしています。
呼び出す側の画面は分かりやすいように背景色を着色、呼び出される側の画面は背景色をDefaultにしています。
![スクリーンショット 2013-12-17 21.33.09.png](https://qiita-image-store.s3.amazonaws.com/0/20529/586e7cb3-eb6c-5223-25f5-e96f24e9ea7f.png)

##そのまま実行
ナビゲーションバー無しの場合と同じように黒画面が表示されてしまいます。
![iOSシミュレータのスクリーンショット 2013.12.17 21.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/20529/2c893611-7bb2-7849-e817-bd9ddb371af2.png)

##ソースを修正
ナビゲーションバー有りの場合は呼び出す側のViewControllerを以下のように修正します。
ナビゲーションバー無しの場合と違って __navigationControllerのmodalPresentationStyle__ を変更します。

```objc:NaviViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    // ↓のコードを追加
    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
}
```

##あらためて実行
背景がちゃんと透過されて表示されます!
![iOSシミュレータのスクリーンショット 2013.12.17 21.34.51.png](https://qiita-image-store.s3.amazonaws.com/0/20529/a84b4a27-7d4b-c5bc-bc7e-a54ecb342d6e.png)

#まとめ
今回は中のデータを用意するコードまで説明出来ないのでDatePickerを使用しました。
PickerViewや他のUIパーツを配置するViewの背景を透明にする場合にも使用出来るかと思います。
カレントディレクトリをドキュメントルートとしてHTTPサーバを立てる

```
$python -m SimpleHTTPServer
```
>Serving HTTP on 0.0.0.0 port 8000 ...
> 127.0.0.1 - - [17/Dec/2013 11:39:07] "GET / HTTP/1.1" 200 -
> 127.0.0.1 - - [17/Dec/2013 11:39:08] code 404, message File not found
> 127.0.0.1 - - [17/Dec/2013 11:39:08] "GET /favicon.ico HTTP/1.1" 404 -

デフォルトでは8000番ポートが開く。ポート番号を指定することもできる

```
$python -m SimpleHTTPServer 3000
```

>Serving HTTP on 0.0.0.0 port 3000 ...
> 127.0.0.1 - - [17/Dec/2013 11:40:14] "GET / HTTP/1.1" 200 -
> 127.0.0.1 - - [17/Dec/2013 11:40:14] code 404, message File not found
> 127.0.0.1 - - [17/Dec/2013 11:40:14] "GET /favicon.ico HTTP/1.1" 404 -

なぜこんなことが可能なのかというと、SimpleHTTPServerというHTTPリクエストハンドラの機能を持つモジュールが提供されている。
参照： [20.19. SimpleHTTPServer — Simple HTTP request handler &mdash; Python v2.7.6 documentation](http://docs.python.org/2/library/simplehttpserver.html#module-SimpleHTTPServer)

そして、"-m"オプションを付けることで、モジュールをスクリプトとして実行できる。
> When called with -m module-name, the given module is located on the Python module path and executed as a script.
[1. Command line and environment &mdash; Python v2.7.6 documentation](http://docs.python.org/2/using/cmdline.html?highlight=m#interface-options)

ちなみに、Python3からは`http.server`にマージされたらしい
> The SimpleHTTPServer module has been merged into http.server in Python 3.
[20.19. SimpleHTTPServer — Simple HTTP request handler &mdash; Python v2.7.6 documentation](http://docs.python.org/2/library/simplehttpserver.html#module-SimpleHTTPServer)

```
python -m http.server
```

これで起動できる。
参照：[What is the python3 equivalent of &quot;python -m SimpleHTTPServer&quot; - Stack Overflow](http://stackoverflow.com/questions/7943751/what-is-the-python3-equivalent-of-python-m-simplehttpserver)
プラグイン毎にgrunt.loadNpmTasks()を追加する必要が無くなるload-grunt-tasksを紹介するよ

# load-grunt-tasksについて

`grunt.loadNpmTasks()`を、プラグインを読み込む毎に追加するのは面倒です。そういう時に[load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks)が便利です。

load-grunt-taksは、[globbing pattern](http://en.wikipedia.org/wiki/Glob_(programming))を使って、gruntの複数のタスクを読む込むプラグインです。
globbing patternというのは、ワイルドカードを使ったパターンマッチングのことです。


実際にload-grunt-tasksを使うと、

```js:Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-yuidoc');
grunt.loadNpmTasks('grunt-bower-task');
```
が

```js:Gruntfile.js
require('load-grunt-tasks')(grunt);
```
になります。


## Options
用意されているオプションは以下の3つです。
### pattern
型: `String|Array` 初期値: `grunt-*`  
特に指定が無ければ、globbing patternとして`grunt-*`が使われます。
### config
型: `String|Object` 初期値: 最も近い`package.json`です。  
※ 現状、型が`String`だと期待したファイルを読み込まないと思うので、[pull request](https://github.com/sindresorhus/load-grunt-tasks/pull/18)を送ってみました。
### scope
型: `String|Array` 初期値: `['dependencies', 'devDependencies', 'peerDependencies']`


## Install
npmでインストールします。

```shell
$ npm i --save-dev load-grunt-tasks
```
もしくは、`package.json`に記述して、`$ npm i --save-dev`でインストールします。

```json:package.json
"load-grunt-taks": "*"
```

## Usage
ほぼ[公式](https://github.com/sindresorhus/load-grunt-tasks#usage-examples)ままですが、
全てのgruntタスクを読み込むには、

```js
require('load-grunt-tasks')(grunt);
```
とします。パターンの初期値が`grunt-*`なので、

```js
require('load-grunt-tasks')(grunt, {pattern: 'grunt-*'});
```
と同じ意味になります。  

[grunt-contrib](https://github.com/gruntjs/grunt-contrib)のタスクだけを読み込みたいなら、

```js
require('load-grunt-tasks')(grunt, {pattern: 'grunt-contrib-*'});
```

で出来ます。  


全ての[grunt-contrib](https://github.com/gruntjs/grunt-contrib)のタスクとcontribじゃないタスクを読み込むには

```js:Gruntfile.js
require('load-grunt-tasks')(grunt, {pattern: ['grunt-contrib-*', 'grunt-shell']});
```
とします。  

一つだけを除外してcontribのタスクを読み込むには、否定のglobbing patternを使います。

```js:Gruntfile.js
require('load-grunt-tasks')(grunt, {pattern: ['grunt-contrib-*', '!grunt-contrib-coffee']});
```  

`package.json`をパス指定することも出来ます。

```js:Gruntfile.js
require('load-grunt-tasks')(grunt, {config: require('../package')});
```  

`devDependencies`のみから読み込むことも出来ます。

```js:Gruntfile.js
require('load-grunt-tasks')(grunt, {scope: 'devDependencies'});
```  

`devDependencies`と`dependencies`から読み込むことも出来ます。

```js:Gruntfile.js
require('load-grunt-tasks')(grunt, {scope: ['devDependencies', 'dependencies']});
```  

## 今後
[このissue](https://github.com/sindresorhus/load-grunt-tasks/issues/17)での[Sindre Sorhus氏](https://github.com/sindresorhus)の回答から考えると、このプラグインは、恐らく将来的には不要になると思われます。
このプラグイン自体がGruntのコアに取り込まれることは無いようですが、より良い解決策をGruntに取り込む考えのようです。

## Links
- [sindresorhus/load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks)
RepoForgeにRPMパッケージをputする

[RepoForge project](http://repoforge.org/)というプロジェクトがあります。かつて、RPMforge（その昔の[Dag RPMリポジトリー](http://dag.wiee.rs/rpm/)）と呼ばれていたものだと考えれば、概ね正解です。

## RepoForgeの目的

RepoForgeは、[Red Hat Enterprise Linux](http://jp.redhat.com/products/enterprise-linux/)で動くRPMパッケージを提供することを目的としています。（互換性のあるCentOSなどでももちろん動きます）

同種のものは[EPEL](https://fedoraproject.org/wiki/EPEL/ja)や[Remi](http://rpms.famillecollet.com/)などがあります。

## RepoForgeにRPMパッケージを提供する

http://repoforge.org/package/index.html にある手順で比較的簡単に提供できます。

1. GitHubにアカウント作る
2. [RepoForgeのgitリポジトリー](https://github.com/repoforge/rpms/)をフォークする
3. specファイルを作成してビルドしてみる
4. pull requestを送る

これだけです。specsディレクトリーの直下にパッケージ名のディレクトリーを作成し、specファイルを配置します。patchがある場合もこのディレクトリーに配置します。例えば https://github.com/repoforge/rpms/tree/master/specs/lv という感じです。

pull requestがマージされるとビルドされて、RPMパッケージが作成されます。作成されても特に連絡はないのでたまに http://pkgs.repoforge.org/ でも覗いてみてチェックするとよいでしょう。

## まとめ

* RepoForgeというRed Hat Enterprise Linux用のRPMパッケージの提供元がある
* RepoForgeにRPMパッケージを提供することは割と簡単
Pocket ObjC Sdkをアプリに組み込む方法

Showrtpathブラウザ( http://showrtpath.com )のバージョンアップ開発でポケットをサポートしました。
Qiitaで、Pocket Objc SDKの組み込み方法を紹介したいと思います。

# Pocket Objc SDKの入手方法
Pocket Objc SDKの入手方法の入手方法はいくつかあります。

- CocoaPodsで"PocketAPI"を追加する
- http://getpocket.com/api/v3/pocket-objc-sdk.zip をダウンロードする
- https://github.com/Pocket/Pocket-ObjC-SDK から入手する 

上記のいずれかの方法で入手できます。

# PocketのConsumerKeyの入手
Pocket Objc SDKを使うにはConsumerKeyの入手が必要です。

http://getpocket.com/developer/ で"CREATE NEW APP"ボタンで組み込みたいアプリを登録します。(要アカウント登録)
フォームが表示されますので入力します。

- Application Nameは、アプリの名前を入力します。
- Application Descriptionは、アプリの説明を入力します。
- Permissionsは、Pocket APIで操作する権限を設定します。ポケットへページ登録する場合はAddが必要です。
- Platformsは、アプリのプラットフォームを選択します。ShowrtpathブラウザはiPhoneとiPadで動作するので二つチェックしました。

登録が成功すると、http://getpocket.com/developer/apps/ にConsumerKeyが表示されるはずです。
プラットフォーム毎にConsumerKeyが生成されるようです。iPhone/iPad両方対応している場合は二つ生成されます。

# コーディング
Pocket Objc SDKを使用して、ポケットにWEBページを保存したいと思います。

## ConsumerKeyの設定

AppDelegateの- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsのタイミングで

```objc
[[PocketAPI sharedAPI] setConsumerKey:@"XXXXXXXXXXXXXXX"];
```
でConsumerKeyを設定します。

## URLスキームの設定
XCodeで、
Identifier:com.getpocket.sdk
URL Schemes: pocketappXX
を設定します。
XXは例えばConsumerKeyが31361-d3h1df4b118daa7848d7c692である場合、pocketapp31361となります。

これは、PocketAPIを初回実行した場合、インストールされているPocketを起動してAPIの認証を行います。認証時に先ほどの、アプリ登録フォームの文章が表示されます。認証後、Pocketから自分のアプリのURLスキームpocketapp31361にコールバックされます。

つまりPocketAPIを使用する場合はPocketのインストールが必要になります。
そして、以下のようにしてコールバックのハンドリングします。

```objc
-(BOOL)application:(UIApplication *)application 
           openURL:(NSURL *)url
 sourceApplication:(NSString *)sourceApplication
        annotation:(id)annotation{

    if([[PocketAPI sharedAPI] handleOpenURL:url]){
        return YES;
    }else{
        // if you handle your own custom url-schemes, do it here
        return NO;
    }

}
```
` [[PocketAPI sharedAPI] handleOpenURL:url]` を`- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotationに記述します。

ここまで記述するとPocketAPIが利用可能になります。

## PocketにWEBページを保存する
PocketにWEBページを保存します。

```objc
NSURL *url = [NSURL URLWithString:@”http://google.com”];
[[PocketAPI sharedAPI] saveURL:url handler: ^(PocketAPI *API, NSURL *URL, NSError *error){
    if(error){
        // there was an issue connecting to Pocket
        // present some UI to notify if necessary

    }else{
        // the URL was saved successfully
    }
}];
```
`saveURL`で、ポケットに保存されます。初回実行時は、アプリの認証が始まるので、Pocketが起動して認証画面が表示されます。認証後、WEBページが保存されます。

2回目移行は、通常に実行できるようになります。

ブログ( http://showrtpath.hatenablog.com/ )でも同記事を紹介しています。
yieldの罠

伝えたかった事とずれまくっていたので書き直しです。
今回は ```yield``` を使用したソースがターゲットです。

```csharp
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main( string[ ] args )
		{
			try { Yield( ); Console.WriteLine( "Yield: 通過" ); }
			catch { Console.WriteLine( "Yield: エラー" ); }
			try { NonYield( ); Console.WriteLine( "NonYield: 通過" ); }
			catch { Console.WriteLine( "NonYield: エラー" ); }
		}
		static IEnumerable<int> Yield( )
		{
			throw new InvalidOperationException( );
			yield return 0;
		}
		static IEnumerable<int> NonYield( )
		{
			throw new InvalidOperationException( );
			return new[ ] { 0 };
		}
	}
}
```

結果は次の通りです。

```
Yield: 通過
NonYield: エラー
```

('ω')

結果を見て分かるように、```Yield``` メソッドでは例外が発生しませんでした。
前回同様に逆コンパイルしてコードを見てみます。

```csharp
[CompilerGenerated]
private sealed class <Yield>d__0
	: IEnumerable<int>, IEnumerable, 
	  IEnumerator<int>, IEnumerator, IDisposable
{
	// 省略
}
private static void Main( string[ ] args )
{
	// 省略
} 
private static IEnumerable<int> Yield( )
{
	return new Program.<Yield>d__0( -2 );
}
private static IEnumerable<int> NonYield( )
{
	throw new InvalidOperationException( );
}
```

('ω')　　(d__0)

( 'ω')

ビルドは Debug ですが、 ```return``` まで到達しないので ```NonYield``` は ```throw``` 文のみに
なっています。```Yield``` メソッドは代わりにインスタンスを返却するコードに変換されています。
このクラスはコンパイラが作成したもので、実装(```MoveNext```メソッド)に元々記述していた
処理(```throw``` 文)が含まれています。

コンパイラは ```yield``` を指定した時点で 対象メンバの処理 をすべて移すようで、
今回記述した ```throw``` 文もこの中に移動されていました。

```csharp
// d__0 クラス内
bool IEnumerator.MoveNext( )
{
	int num = this.<>1__state;
	if ( num != 0 )
	{
		return false;
	}
	this.<>1__state = -1;
	throw new InvalidOperationException( );
}
```

ようするに ```IEnumerable``` なメンバの処理に ```yield``` を使用すると、コンパイラ製クラスの
インスタンス作成＆返却 という処理に置き換えられるため、```throw``` 文は反復処理が
開始されるまで実行されないということでした。

元々 ```return``` で書いていたメンバの処理を ```yield return``` に置き換えたり、
```yield return``` で書いていたメンバの処理を LINQ に置き換えたりすることは、今回のように
評価タイミングにズレが生じる結果になるので、周辺コードに注意することをお勧めします。

！ **条件が Code Contracts で記述された場合は結果は異なります。**
以下ソースコードと実行結果＆逆コンパイルで終わり。

```csharp
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main( string[ ] args )
		{
			try { Yield( ); Console.WriteLine( "Yield: 通過" ); }
			catch { Console.WriteLine( "Yield: エラー" ); }
			try { NonYield( ); Console.WriteLine( "NonYield: 通過" ); }
			catch { Console.WriteLine( "NonYield: エラー" ); }
			Console.ReadKey( );
		}
		static IEnumerable<int> Yield( )
		{
			Contract.Requires<InvalidOperationException>( false );
			yield return 0;
		}
		static IEnumerable<int> NonYield( )
		{
			Contract.Requires<InvalidOperationException>( false );
			return new[ ] { 0 };
		}
	}
}
```

実行結果

```
Yield: エラー
NonYield: エラー
```

逆コンパイル

```csharp
private static IEnumerable<int> Yield( )
{
	__ContractsRuntime.Requires<InvalidOperationException>( false, null, "false" );
	return new Program.<Yield>d__0( -2 );
}
private static IEnumerable<int> NonYield( )
{
	__ContractsRuntime.Requires<InvalidOperationException>( false, null, "false" );
	return new int[ 1 ];
}
```
Unity 4.3 / NGUI 3.0.x にアップグレードするまでの戦いの記録

# 前置き

* 2013年11月に Unity 4.3 がリリースされ、その前後で NGUI もメジャーバージョンアップしております。
* んで、諸々 deperecated になったりとかしてて涙目だったので、対応すべき点を書き綴ってみた次第です。
* そもそも、弊社では、Scene に対して GameObject をポチポチ設定していく方法ではなく、スクリプトでゴリゴリ Instantiate しまくって GameObject を生成していく方法を採っていました。
* 普通に Unity 的に素直な使い方している場合に於いては、NGUI Upgrade Tool なるものが提供されているので、それ使えば結構幸せになれるんじゃないかと。
* あ、普通に間違ったこと言ってる可能性は高いので、全てを鵜呑みにしないでくださいね？ｗ
* なんか、書いてるウチに Unity 4.3 殆ど関係ないコトに気付いたけど、まぁ、ご愛敬ってことで。

# UISprite / UITexture のサイズ問題

## 内容

* NGUI 2 系では `UISprite`, `UITexture` 共に `Transform.localScale` でサイズを設定していましたが、これが NGUI 3 系では `Transform.localScale` を `Vector3.one` とした上で `UIWidget.width`, `UIWidget.height` (Instpector 上で言うと Dimensions) にて設定するといった形に変更されています。
* 普通に使っている場合には問題無いのですが、弊社では `UITexture` の画像を PVRTC (正確には RGBA Compressed PVRTC 4bits で統一してます。) フォーマットで圧縮する必要があったため、 POT (Power of Two: 2の冪乗) な正方形に引き延ばしていました。
そのため、`MonoBehavior.Start()` とかで `transform.localScale = new Vector3(1280.0f, 800.0f, 1.0f);` みたいなコトをしていました。
で、これをそのままにして実行してみると…。
* <span style="font-size: 1.5em;">**「なんかデカイ！！！」**</span>
* <span style="font-size: 2em;">**「「なんか」なんてもんじゃなくて、アホみたいにデカイ！！」**</span>
* ってなコトになりました。
* 理由としては、`UIWidget.width`, `UIWidget.height` のデフォルト値が `100` になっているためです。
実際に描画する際に、`UIWidget.width * Transform.localScale.x` とか `UIWidget.height * Transform.localScale.y` とかで計算してくれちゃうので、元が 1,280px &times; 800px みたいな画像であったとしても、 ***128,000px &times; 80,000px*** みたいなクソデカイ値になっちゃうって理屈です。
* 前述の弊社の特殊 (？) 事情により、 `UITexture` は勿論のこと、Sliced/Filled/Tiled な `UISprite` とか、 `UILabel` なんかもバッチリ影響を受けちゃいました。

## 対策

* まぁ、素直に `UIWidget.width`, `UIWidget.height` を上書きすれば良いかと。
* AssetBundle とかを使っていて、読み込み完了までサイズが確定できない場合なんかは、一旦 `UIWidget.alpha` を `0.0f` とかにしといて、完了時に `1.0f` にすることで、「変な白い余白が出る」とかそういうことも起きないんじゃないかと。

# UIPanel / UIWidget 系の depth 問題

## 内容

* NGUI 2.7.x とかでは、 `UIPanel` や `UISprite` などの重なりを `depth` と `Transform.localPosition.z` の二つを使って定義してあげないとダメでした。
	* いや、もちろんダメじゃないケースもあるけど。
* NGUI 3.0.x では、様々な工夫の結果、 `depth` のみで重なりをキレイに表現できるようになったみたいです。(詳しくは追ってない。)

## 対策

* まぁ、普通に `depth` に設定するようにしましょう。
* `Transform.localPosition.z` は値が小さければ小さいほど手前に表示されますが、 `depth` は値が大きければ大きいほど手前に表示されます。

# UIDraggablePanel / UIDragPanelContents 問題

## 内容

* スクローラブルな要素を提供するために `UIDraggablePanel`, `UIDragPanelContents` ってのがあります。
* こいつらが NGUI 3.0.x になって名前が変わりました。
* が、 2013年12月17日 (v3.0.7f3) 時点に於いて、 **クラス名は変わっているが、ファイル名が変わっていない** という問題があり、 `AddComponent` とかできなくなってます。

## 対策

* ま、これはそのうち直るんじゃないかな？

# まとめ

* 素直に流儀に従って書きましょうってコトですね。
* オレオレライブラリとか作ってるからこんなコトになるわけです。
* ええ、ええ。知ってますよ。知ってますとも。
* 間違えの指摘や、質問、より良い対策など、ツッコミお待ちしております。
Running Rspec


[Resource: Rspec slide](http://kerryb.github.io/iprug-rspec-presentation/)

## Running rspec

    $ rspec 

## Output options

    -f, --format FORMATTER  [p]rogress | [d]ocumentation | [h]tml
    -o, --out FILE
    -c, --[no-]color,--[no-]colour 
    -p, --[no-]profile [COUNT] # enable profiling of examples and list the slowest examples (default: 10)

### Color Formatter 

    $ rspec --color spec/
    # add it in .rspec file

### Documentation

    $ rspec -f doc spec/

### html

    $ rspec -f html # or h

### Progress

    $ rspec -f p # or progress

####Fuubar

[Fuubar](https://github.com/jeffkreeftmeijer/fuubar)

Fuubar is an instafailing RSpec formatter that uses a progress bar instead of a string of letters and dots as feedback.

Installation:

    gem install ruby-progressbar

or in your Gemfile

    gem 'ruby-progressbar'

Then, when running rspec:

    rspec --format Fuubar --color spec

Or, if you want to use Fuubar as your default formatter, simply put the options in your .rspec file:

    --format Fuubar
    --color

### Multiple formatters

    $ rspec -f Fuubar -f html -o specs.html spec/

### Profiling

    $ rspec --profile spec/
    # or
    $ rspec -p spec/


## Pending specs


The followingss will output with Pending notes.

Example 1

    describe "Something" do
      it "does something" do
        ...
      end
 
     it "does something I haven't implemented yet"
    end

Example 2

    describe "Something" do
      ...
     
      it "does something I haven't implemented yet" do
        pending "waiting for inspiration"
        ...
      end
    end

Example 3


    describe "Something" do
      before { pending "Coming soon!" }
     
      it "does something" do
      end
     
      it "does something else" do
      end
    end


## Running one spec

Line number 5.

    $ rspec -f doc spec/something_spec.rb:5

## Filtering

### Filtering by tag

    describe "Something" do
      it "does stuff" do
        ...
      end
     
      it "does the thing I'm working on", :current => true do
        ...
      end
    end

Run only specs tagged ‘current’

    rspec --tag current ...

Run specs not tagged ‘current’

    rspec --tag ~current ...

### Filtering by tag value


    describe "Something" do
      it "behaves one way in Ruby 1.8", :ruby => "1.8" do
        ...
      end
     
      it "behaves another way in Ruby 1.9", :ruby => "1.9" do
        ...
      end
    end

Run 1.8 specs:

    rspec --tag ruby:1.8


### Implicit filtering


    RUBY_1_9 = (RUBY_VERSION =~ /^1\.9/)
     
    describe "Something" do
      it "does this when using 1.9", :if => RUBY_1_9 do
        ...
      end
     
      it "Does that when not using 1.9", :unless => RUBY_1_9 do
        ...
      end
    end


### Filtering by name


    describe "Something" do
      it "does stuff" do ...
     
      it "does other stuff" do ...
     
      it "does one more thing" do ...
    end

Select specs using a regular expression:

    $ rspec -e stuff spec/something_spec.rb
FuelPHPでComposer is not installed



サイトにアクセスした際に、下記のようなエラーが出た場合の対象法です。

```php
Composer is not installed. Please run "php composer.phar update" in the root to install Composer
```


###解決方法

composerの設定がきちんとされていないことが原因らしいです。
ただ解決は簡単で、
composer.pharがある場所に移動して、
下記のコマンドを実行するだけです。

 ```php
php composer.phar update
```
Unity Package を作ってみた。そして思ったコトがある。

# 前提

OS
: OS X Mavericks
Unity
: v4.3.1f1

# おさらい

そもそも UnityPackage ってなんぞ？

* シングルバイナリなパッケージファイル
	* 中身としては .tar.gz か何かだと思われ
* Asset Store とかで配布されている各種パッケージもこの形式
* Unity 上で表示される Asset なら何でも突っ込める
* 勿論、複数突っ込める
* なんなら Asset Store から Import したヤツとかも含められる
	* ライセンスはちゃんと見ましょう。
	* 違法コピーはダメ・絶対！

んで、UnityPackage を Export するのは以下の手順

1. Export したい Asset を選択
1. *Menu > Assets > Export Package…* を選択
1. 内容確認して *Export* ボタン押下
1. ファイル名と場所決めておしまい。

簡単ですね！

# んで、本題

今やってる仕事の絡みで UnityPackage を Export する必要が出てきたので、普通に上述の手順でやってみた。

まぁ、普通に構築は巧く行くんだけど、ふと **「あれ？これ、インポート先のプロジェクト的に、削除された Asset とか移動した Asset とかってどうなるんだ…？」** とか思ってみた。

んで、調べたところ、 [こんなページ](http://docs.unity3d.com/Documentation/Manual/HOWTO-InstallStandardAssets.html) を見付けた。(ページ最下部に書いてある点が肝。)

結論から言うと、 **「削除とか無理だから、自力で頑張ってね&hearts;」** ってコトらしい。

いやいや、そんなこと言われても…。

複数のプロジェクトで共通のスクリプトとか Prefab とかを使い回したいので、どうにかして管理したいっす！

# じゃあ、どうする？

今日ぶち当たった段階なので、具体的なソリューションは思い付いてない。

今思い付いてるのだと以下の4つあたり。

* git の submodule とかで管理しちゃう？
* 特定のディレクトリ配下に全部ぶち込んで、自前の UnityPackage をアップデートするときは、ディレクトリ毎削除してから、再インポート？
	* まぁ、それはそれで、一瞬大量のエラーが表示されるコトになりうるから気持ち悪いんだよなぁ…。
	* でも、NGUI とかはそういう方針なのかな？
* そもそも削除とか移動とかせずに、Deprecated 扱いにしてコンソールに警告出す形で回避？
	* それはそれでクラス名が完全に同じケースとかはエラーになるよなぁ…。
	* まぁ、そもそもそんな定義すんなって話だが。
* 漢は黙ってコピー&amp;ペースト

うーむ、正直どれも微妙だ…orz

「ウチはこうしてるよ！」みたいな事例ありましたら※してもらえると泣いて喜びます！ｗ
Y字路巡り(2012.9.7の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの17日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord3ynode/ にあります。

```hs
{-# LANGUAGE TupleSections #-}
module Doukaku.YRoad (solve) where

solve :: String -> String
solve = map snd . scanl next' ('B', 'A')
  where
    next' (f, t) d = (t, next f t d)

route :: Char -> (Char, Char, Char)
route 'A' = ('D', 'C', 'B')
route 'B' = ('A', 'C', 'E')
route 'C' = ('A', 'F', 'B')
route 'D' = ('F', 'A', 'E')
route 'E' = ('B', 'F', 'D')
route 'F' = ('D', 'E', 'C')

next :: Char -> Char -> Char -> Char
next f t d = case d of
  'r' -> r
  'l' -> l
  _   -> f
  where
    (l, r) = case route t of
               (n1, n2, n3) | n1 == f -> (n2, n3)
                            | n2 == f -> (n3, n1)
                            | n3 == f -> (n1, n2)
```

各点についてつながっている点を時計回りに定義してあげて、それを元に左右を判定させてます。実に素直ですね。
【AWS認定ソリューションアーキテクト資格②】Amazon EC2インスタンスの種類



イソギンチャクを飼ってる千葉です。

今回は、EC2の種類について記載しようと思います。
EC2では、どんなインスタンスが立てられる出でしょうか。

2013/12/17 時点では、以下のインスタンスが使用可能です。
ポチットすれば、

##インスタンスの種類

**でん！！**

![スクリーンショット 2013-12-17 20.27.25.png](https://qiita-image-store.s3.amazonaws.com/0/33834/bd3ab9c6-a32b-5a29-53ad-8452b11a6f53.png "スクリーンショット 2013-12-17 20.27.25.png")
![スクリーンショット 2013-12-17 20.27.54.png](https://qiita-image-store.s3.amazonaws.com/0/33834/865aa425-17aa-7cc8-d53d-098a867a59b2.png "スクリーンショット 2013-12-17 20.27.54.png")
![スクリーンショット 2013-12-17 20.28.08.png](https://qiita-image-store.s3.amazonaws.com/0/33834/7cc796da-a0eb-5cdd-7d31-924b298f0679.png "スクリーンショット 2013-12-17 20.28.08.png")
![スクリーンショット 2013-12-17 20.28.18.png](https://qiita-image-store.s3.amazonaws.com/0/33834/34fbcaf8-06ba-e8e0-7f4a-44d8df3705fe.png "スクリーンショット 2013-12-17 20.28.18.png")
![スクリーンショット 2013-12-17 20.28.28.png](https://qiita-image-store.s3.amazonaws.com/0/33834/4a9ee60b-94b7-dcd2-9ad7-a1f955032e60.png "スクリーンショット 2013-12-17 20.28.28.png")

## おお
ということで、最近のOSは全部作れますね。
オンプレでよく使う、Windows Server、Red Hat Enterprise Linuxも選べます。
ubuntu serverも選べますね。
社会課題とその解決目標，さらにその部分目標をオープンデータ化する試み

こんにちは，名古屋工業大学の[白松](http://www-toralab.ics.nitech.ac.jp/~siramatu/)と申します．
先週の土曜，2013年12月14日に名古屋大学で[Spending Data Party 2013 Winter in 東海](https://www.facebook.com/events/1416934368541537)（主催: CODE for TOKAI／[オープンデータ東海](http://opendata-tokai.jp/)の河口信夫先生）が開催され，そこでYahoo! JAPANの河合太郎さん率いる[CODE for NAGOYA](https://www.facebook.com/code4nagoya)のキックオフがありました．活動アイディアはいろいろありますが，それらのアイデアを実現していくためには，より多くの人々の協力が不可欠です．今後，賛同してくれる協力者を広く募ってプロジェクトを進めて行くことになるでしょう．

では，このように公共圏で組織を超えた協働を始めようとするとき，Facebook等の既存のSNSで充分でしょうか？
どこかに似たようなことを目指している潜在的協力者はいないか？と思った時，そのような人物検索を可能にするサービスが存在するでしょうか？
また，誰が協力してくれていて，誰の貢献度が高いのかをオープンにするサービスが存在するでしょうか？
さらに，世の中の影響力ある人々が何を目指してどのように活動しているのかを把握できるようにするサービスが存在するでしょうか？

## 「ゴオルシェア（仮）」の試作

試作段階ですが，今，「誰がどんな課題に注目しているのか」「誰が何を目指して動いているのか」をボトムアップにオープンデータ化して共有するためのサービスを作っています．
![goalshare_ui.png](https://qiita-image-store.s3.amazonaws.com/0/34445/84e72a66-ce57-c4d5-8f2b-af879f78ea54.png)

URLは追って公開しますが，[この文献](http://sigswo.org/papers/SIG-SWO-A1301/SIG-SWO-A1301-03.pdf)や[この発表資料](http://www.slideshare.net/siramatu/linked-open-data-25111804)で概要を説明しています．
具体的には，Linked Open Data (LOD) の枠組みを使って課題と解決目標の関係や，その部分目標との関係，協力者との関係などを紐付けした上で，どのような計算によって協力者を検索するのかを説明しています．

このようなシステムがあれば，以下のようなことができるのではないかと考えています．

(1) 身の回りの社会課題や目指す目標を一般市民が公開＆共有して，似た方向性の人々を探せるようにする
(2) 断片的なニュースから，社会課題や有力者の目標を抽出＆共有して，世の中の動きの透明性を向上させる


## (1) 身近な課題や目標を公開／共有して協働の相手を探す

いま，FacebookなどのSNSを使って組織を超えた市民協働が行われていますが，似たような試みが複数あると「協力すればいいのに」と思うことがありませんか？
「総論賛成・各論反対」に陥ったり，感情的な対立があったりして，そんなに簡単に一緒にやれない場合もあるだろうとは思います．が，単に互いの存在に気づいていない場合もありそうです．
私は，「誰がどんな課題に注目しているのか」「誰が何を目指して動いているのか」を共有するためのオープンデータをみんながボトムアップに構築することで，そのような仕組みを作ろうと考えています．

ただ，一般の人々の課題や目標をいきなり収集するのは敷居が高いと考えて，まずは震災復興に関するWebニュース記事から課題や目標を抽出してデータセットを作ってみようと試みました．
データセットは[こちら](http://data.open-opinion.org/socia/data/Goal?rdf:type=socia:Goal&limit=100)からご覧頂けますが，その経緯は[この文献](http://link.springer.com/chapter/10.1007%2F978-3-642-40346-0_10) や[この文献](https://kaigi.org/jsai/webprogram/2013/pdf/711.pdf)でご確認下さい．
このようなデータセットを作ってみて気付いたのは，身近な地域課題だけでなく，原発事故のように広域の多数の人々に影響を及ぼす社会課題についても，「誰がどのようなアプローチで解決しようとしているのか」に関する透明性を向上させることができそうだ，ということでした．

## (2) 有力者の目標を共有して世の動向の透明性を向上させる

私達がニュース記事を読んで世の中を理解するためには，ひとつひとつのニュースに記された断片的な情報を自分の中で再度つなぎ合わせ，編纂していく必要があります．影響力ある組織や有力者の何らかのアクションが報道されるとき，その背後にある「目指すビジョン」や「行動原理」は暗黙的である場合が多く，その場合，大多数の一般市民にとって理解が難しくなります．

そこで，影響力ある人々の目標をオープンデータ化することで，報道を聞いた時に我々がよく感じる「それは何のためにやっているのか？」という疑問を解消できないでしょうか．ただし，そのような目標を有力者本人が入力するインセンティブは（今のところ）ありませんので，まずは「世の中の動きをわかりやすくしたい」という動機を持つ市井の人々が，ニュース記事を読みながらクラウドソーシング的にデータを構築することになるでしょう．その場合，複数の解釈に基づくデータが並立する可能性もありますが，それらをマージする作業により，異なる立場からの観点を含む俯瞰的な解釈が可能になるかもしれません．また，それらの目標を時系列上に並べれば，有力者達がいつまでに何を成し遂げようとしているのかを共有することができ，近未来像をクリアにすることができるかもしれません．

## 「ゴオルシェア（仮）」体験イベントの開催
明後日12月19日に，大垣市 ソフトピアジャパンのドリームコアで，「ゴオルシェア（仮）」の試作版を使ったイベント（主催: [株式会社CCL](http://cc-lab.co.jp/)）を開催します．

[オープンデータ・カフェin 大垣「繋がるオープンデータ「LOD」で、身近な課題を解決しよう！」](https://www.facebook.com/events/579838578754910)

実際に，地域課題やその解決目標，さらにその部分目標を入力するワークを予定しています．
ご興味のある方は，どうぞお越しください．
Struts2とConventionプラグイン

## Conventionプラグインとは

一言で説明すると、
**Struts2のActionクラスに関する設定を、「すべて」アノテーションで定義できる**

これにより、以下のことが言えます
**struts.xmlにはActionクラスの振る舞いを書かない！**
**Actionクラスの動きは、Actionクラス自身がもっている！**

つまり、設定ファイルからActionクラスの定義が消えることで、アプリケーションの全体設定（共通設定）だけ書くところになり、きれいになり、他にもいくつかの「しきたり」ができ、自由奔放に実装できるStruts2のActionクラスを整理できる。

といいこと尽くしなので導入しない手はありません。

## Actionで設定したアノテーションの設定を見る
Struts2には現在のアプリケーション設定を一望できるConfig-Browserプラグインがありますので、これを導入するだけで良いです。
※設定から何から全部見れてしまうため、くれぐれも本番環境にはConfig-Browserプラグインは載せないようにしましょう。

## アノテーションで設定するもの
以下のものを設定できます。

+ @Namespace : struts.xmlのpackageと同じ。URLの一部となる。スラッシュ(/)から始まる。
+ @ParentPackage : 設定を継承する @Namespace または package
+ @InterceptorRefs : 利用するインターセプタ＆インターセプタスタック
+ @Results : Actionクラスのreturn値に対する遷移先( レスポンス先 )
+ @ExceptionMappings : 例外発生時の遷移先
+ @Action : ActionクラスのURLパスを設定 ( メソッド単位にも設定可能 )

リクエストされたURLとActionクラスのマッピングは次のルールで一意に決まります。

```html
@Namespaceの値/@Actionの値
```

例えば、@Namespace("/master/user")、publicメソッドに@Action("search")とした場合は、

```html
/(コンテキストパス)/master/user/search
```

@Namespace("/check")、@Action("")とした場合は、

```html
/(コンテキストパス)/check/
```

@Namespace("/")、@Action("")とした場合は、

```html
/(コンテキストパス)/
```

となります。
※Conventionプラグイン利用時は.actionを省略できる( Conventionプラグインの初期設定 )

## Conventionプラグインの設定に関するあいまいさ
Actionクラスの@Namespaceと@Actionのルールについては、少しゆるい設定ができます。

+ 1つのActionで複数のpublicメソッド＋@Actionを用意すると、URLを分割できる。
+ 複数のActionクラスで、同じ@Namespaceを共有できる。

このため、仕組み上では複数のActionクラスをグルーピングして、同じ@Namespaceに含めることもできます。
つまり好き勝手に作れる気楽さはありますが、複数人で作る場合にはルールが必要です。
また、例え複数のActionクラス内で、完全に同一の@Namespaceと@Actionの組み合わせがあった場合は、エラーが発生することはなく、「どちらかが優先されます」

**どちらかはわかりません**

ですので、ルール作りが必要です。
smartyの罠 ~for~ ~while~

#for文

ある案件でsmartyのテンプレートファイルを編集することになって、for文を使おうとしたんですが、  
エラーになります＾＾＾＾；  

> syntax  error unrecognized tag 'for'


ネットをうろうろと調べてみたのですが、どうやらあるバージョン以降でなければ対応していない模様・・・  
しかし、どのバージョンからの対応なのか、公式ドキュメントを見ても書いていない！  

日本語版　[{for} | Smarty](http://www.smarty.net/docs/ja/language.function.for.tpl)
英語版　[{for} | Smarty](http://www.smarty.net/docs/en/language.function.for.tpl)

---

##で
###結局sectionを使えってことみたいです。
[{section},{sectionelse} | Smarty](http://www.smarty.net/docs/ja/language.function.section.tpl)

注意としては、0オリジンであると言うことです。  
わざわざ書くというのは1オリジンのやつもあるからですが。。。

---
#追記

stack overflowによればどうやらV2系=未実装、V3系で実装ということがかいてある・・・。
[smarty for loop unrecognised tag - Stack Overflow](http://stackoverflow.com/questions/14481448/smarty-for-loop-unrecognised-tag)

しかし、for文みたいに、 たとえば" Present for you"みたいな文脈でも出現してくるキーワードを調べるのは  
ノイズが多く調べるのに難儀する・・・。

そして、ソースは今現在でも見つけられていない。

---
#さらに追記

while文も同様の被害報告が・・・
[smarty while-loop error - Stack Overflow](http://stackoverflow.com/questions/5975720/smarty-while-loop-error)


---
#閑話休題

日本語圏でのgoogle検索結果が残念すぎるのよね・・・
[forループ　smarty](https://www.google.co.jp/search?q=for%E3%83%AB%E3%83%BC%E3%83%97%E3%80%80smarty)

---
##最後に
駄文だけど、私みたいな被害者が少しでも減ればと思い起稿した次第であります。
Webviewのnavigator.userAgentを独自のユーザーエージェントにする方法と、その他諸注意（Googel Analytics etc..）

HTMLで作ったスマホページのレイアウトを、特定のWebviewから見られているときだけ変更したいと思い、アプリ側のWebViewに独自のUAを設定し、jsでユーザーエージェント取得・判定・表示の切り分けを行いました。試した中で気づいたことをメモ。


#■諸注意
UAの設定方法が、Googel Analytics(以下GA)とwebviewで表示されるページの見え方に影響する

**■完全オリジナルのUAを設定した場合**
・GAではアクセスをユーザーエージェント毎に分けて見られるので、アプリからのアクセスのみを簡単に把握できる。
・Webviewで開いたページ側がレイアウトをUAで判断して切り分けている場合に、スマホと見なされずPC版が表示されてしまう。

**■デフォルトUAに独自語句を付加した場合**
・GAの集計には、safariからのアクセスとして合算されてしまう。
・Webviewで開いたページはスマホ表示


#■設定方法
**1.デフォルトのuserAgentを取得して、接尾にカスタム語句" HOGEHOGE"を連結**
（見やすくするため頭にスペース入れた）

```objc
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *customUserAgent = [userAgent stringByAppendingString:@" HOGEHOGE"];
```

**2.UserAgentに設定**

```objc
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:customUserAgent , @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
```
bowerパッケージをbundlerで管理するRails Assetsを使ってみた

最近、[Rails Assets](https://rails-assets.org/ "Rails Assets")というサイトが話題になりました。

Rails Assetsは、Gemfileに`source 'https://rails-assets.org'`を追記することで、bowerで管理しているパッケージをgemにラップしたものをbundlerでインストールできるサービスです。しかもbower.jsonの依存関係をパースして解釈してくれます。

Railsで利用するJSのライブラリをどうやって管理して更新していくのか、という悩ましい問題に対する一つの解決策になるかもしれません。

RailsでJSのライブラリを扱う方法として、今まで以下のようなやり方を試したことがあります。

- vendor/assets/javascripts以下にそのまま配置する
- vendor/assets/javascripts以下にsubmoduleをcloneしてくる
- gem化されている`rails-backbone`のようなものを利用する
- bowerでインストールしてassets_pathを設定する

概ね、これらの組み合わせでなんとかしてる、というのがほとんどではないかと思います。

vendor以下に直接配置するのは、バージョンアップが非常に面倒臭くなるので、gistレベルのちょっとしたスニペットぐらいならアリかなと思います。

submoduleはgithubで管理されているものなら行けそうな感じですが、依存関係の自動解決ができないこと、submodule自体が若干運用し辛いことが少し難点です。

gem化されているものはassetsのパスも面倒見てくれるので、利用はしやすいのですがgemのメンテに縛られて、JSライブラリ自体のバージョンに追い付いていない場合があります。
forkして何とかすると、それはそれで追従が面倒です。

bowerはnode.js製のJSパッケージ管理システムです。これでプロジェクトで利用するJavaScriptをまとめてインストールする方法は、JSのライブラリ自体の管理はやりやすくなるのですが、Railsで使う際のパス設定が煩雑になることと、余計なファイルが混じるのが難点です。後、nodeの環境が無い場合、困ります。
gruntと組み合わせるとかすれば、いい感じにやれそうな気はするけど、あんま分からない…。

という感じで、私は中々良い方法が見つかってません。

そこにやってきたrails-assets.orgです

今、現在bowerでインストールしているJSのライブラリがいくつかあるので、それを利用できるか試してみました。

手順としては、`source`の定義を追加して、サイトの説明通りに`gem`の定義を書けば良いだけです。

```ruby
gem 'rails-assets-backbone.collectionView'
```

ただ、今現在はこれだけでは上手くいかない時があります。
サイトの説明によると、Gemfileに書かれたものを自動でgemにコンバートするのは無理のようです。
またbowerで検索できるパッケージ全てを網羅しているわけではありません。

そこでどうするかというと、手動で変換処理を依頼することができるようになっています。

サイトに右上にある[Component list](https://rails-assets.org/components "Rails Assets")という所から、rails-assets.orgが提供しているbowerパッケージのリストが検索できます。
ここで検索して存在しないbowerパッケージはフォーム下部にある`Convert`ボタンをクリックする事で変換処理を依頼できます。
変換にはしばらくかかりますが、数分ぐらいで反映されました。

反映された後は、説明書き通りにgemとしてインストールできます。

読み込みの際の注意点としては、一部JSライブラリ側のパッケージ定義が古いままだったり充分でない場合、サイトの案内通りのパスではrequireできない事があります。
もし、上手くrequireできない時は、インストールされたgemのディレクトリを開いてどういう配置になっているか確認してみましょう。

使ってみた感想としては、bowerを使った半手動より大分良さそうだし、`rails-なんたら`というgemに縛られなくて済むので、結構良い感じです。しかも、node.jsの実行環境が必要無い。
まあ、そもそもbowerパッケージだけで全部完結するような世界にはなってないのが多少残念ですがw

とりあえず、しばらくrails-assets.orgを利用して運用してみたいと思います。
CPANのライブラリ一覧取得・削除


###インストール履歴の確認

```bash
$ perldoc
```

###ディストリビューション名がわからない場合

```bash
$ cpan
cpan> i モジュール名
```

CPAN_FILE のファイル名がディストリビューション名

###ファイルの一覧を取得する

`/path/to/sitearchexp` は 通常は `/path/to/lib/perl5/lib/perl5/<platform>` (`$Config{sitearchexp}`で定義される)
`<distribution name>` は 上記で調べたもので、 - は / に置換したもの。

`ExtUtils::Install` モジュールの `uninstall` メソッドを使う。

シンタックスは次の通り。

```perl
uninstall($packlist_file, $verbose, $dont_execute);
```

一覧表示は dont_execute フラグをたてる。

```bash
$ grep -MExtUtis::Install -e ‘uninstall “/path/to/sitearchexp/auto/<distribution name>/.packlist”, 1, 1’
```

### アンインストールする

```bash
$ grep -MExtUtis::Install -e ‘uninstall “/path/to/sitearchexp/auto/<distribution name>/.packlist”, 1’
```

### cpanm を使ってもアンインストールできるみたい

local にインストールした場合。

```
$ cpanm -L local -U <module name>
```

EXPERIMENTAL (cpanm ver 1.7001現在) のようです。

注：ディレクトリは残ります
RubyのHashをsortするのにハマった

RubyのHashをsortするのにハマった

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

h = {"foo" => 10, "bar" => 30, "baz" => 50}

p h
# {"foo"=>10, "bar"=>30, "baz"=>50}

p h.sort
# [["bar", 30], ["baz", 50], ["foo", 10]]

p Hash[h.sort]
# {"bar"=>30, "baz"=>50, "foo"=>10}
```

Hashを明示的にしたらイケた。もっと良い方法ありそう。
Vim plugin NERDTree


## NERDTree doc

[NERDTree doc](https://github.com/scrooloose/nerdtree/blob/master/doc/NERD_tree.txt)

## Quick help 

    NERD tree (4.2.0) quickhelp~
    ============================
    File node mappings~
    single-click,
    <CR>,
    o: open in prev window
    go: preview
    t: open in new tab
    T: open in new tab silently
    middle-click,
    i: open split
    gi: preview split
    s: open vsplit
    gs: preview vsplit

    ----------------------------
    Directory node mappings~
    single-click,
    o: open & close node
    O: recursively open node
    x: close parent of node
    X: close all child nodes of
       current node recursively
    middle-click,
    e: explore selected dir

    ----------------------------
    Bookmark table mappings~
    double-click,
    o: open bookmark
    t: open in new tab
    T: open in new tab silently
    D: delete bookmark

    ----------------------------
    Tree navigation mappings~
    P: go to root
    p: go to parent
    K: go to first child
    J: go to last child
    <C-j>: go to next sibling
    <C-k>: go to prev sibling

    ----------------------------
    Filesystem mappings~
    C: change tree root to the
       selected dir
    u: move tree root up a dir
    U: move tree root up a dir
       but leave old root open
    r: refresh cursor dir
    R: refresh current root
    m: Show menu
    cd:change the CWD to the
       selected dir
    CD:change tree root to CWD

    ----------------------------
    Tree filtering mappings~
    I: hidden files (off)
    f: file filters (on)
    F: files (on)
    B: bookmarks (off)

    ----------------------------
    Custom mappings~

    ----------------------------
    Other mappings~
    q: Close the NERDTree window
    A: Zoom (maximize-minimize)
       the NERDTree window
    ?: toggle help

    ----------------------------
    Bookmark commands~
    :Bookmark <name>
    :BookmarkToRoot <name>
    :RevealBookmark <name>
    :OpenBookmark <name>
    :ClearBookmarks [<names>]
    :ClearAllBookmarks

## Using bookmarks

    # move to a directory where you want to bookmark
    :Bookmark name
    # To display bookmarks
    B

## Display hidden files and directory

`shift``i`

## Using a mouse

Add the following to your .vimrc.

    " For mouse click in NERDTree
    :set mouse=a
    let g:NERDTreeMouseMode=3 

## Changing current working directory

    # check your pwd/current working dir
    :pwd
    # go to a directory in NERDTree and change the working directory
    cd
    # display only your working directory
    C
MQTT - On  publish


I strongly recomend to use **on publish** if your application publish a message in short interval.  On publish pools a connection with MQTT Broker permanently, and you can reduce connection overhead by using this.

```on_publish.py

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

import mosquitto
import time
import datetime
import random

def on_connect(mosq, obj, rc):
    print("rc: "+str(rc))

def on_publish(mosq, obj, mid):
    print("mid: "+str(mid))

run = -1
mqtt = mosquitto.Mosquitto("test", run)
mqtt.on_connect = on_connect
mqtt.on_publish = on_publish

MQTT_BROKER = "{MQTT Broker IP}"
MQTT_PORT = 1883
MQTT_TIMEOUT = 0.5

count = 0

mqtt.connect(MQTT_BROKER, MQTT_PORT)
while mqtt.loop(timeout=MQTT_TIMEOUT) == 0:
    now = datetime.datetime.now()
    timestamp = time.mktime(now.timetuple()) + (now.microsecond / 1000000.0) 
    value = random.randint(1,100)
    payload = "[%s] %s,%s" % (str(count), str(timestamp), str(value))
    mqtt.publish("test", payload)
    count = count + 1
    pass

    


```
公開されたGASのYouTubeAPIを少し使ってみた。

なんか、間に合わせな内容で申し訳ないですが、Google Apps Script Advent Calendar 2013の17日目です。

### 簡単に追加されたAPIの紹介
つい先日、Google Apps Scriptから実行できるAPIが追加されました。追加されたのは以下のAPIです。
 
- Admin SDK
- Fusion Tables
- Google+ Domains
- Mirror
- YouTube
- YouTube Analytics

色々触ってみたいものですが、なかなか時間もなく…。
ということで、YouTube Data APIのsearchを実行してみました。
YouTube Data API以外にもYouTube Live Streaming APIも実行できるようです。

### APIを使う前の有効化や承認など。
まず、スクリプトエディタのリソース→「Advanced Google services...」を選択し、

![service有効化.png](https://qiita-image-store.s3.amazonaws.com/0/11925/07edde86-e582-2af1-9c2a-b29a88ee1d73.png)

有効にしたら、「Cloud Consoleでサービスも有効にしないといけない」というリンクがでるのでリンクをクリックして、Cloud Consoleを表示します。

![cloudconsole.png](https://qiita-image-store.s3.amazonaws.com/0/11925/96d165ce-7f40-ce4b-f7c3-a7a2de25130c.png)

Cloud ConsoleでYoutube Data APIを有効にしたら、コードを書いて、実行。

実行時に承認を求められるので承認します。（最初はログ出力だけにしていたのですが、Spreadsheetに結果を出力したので、実際には、Spreadsheetの承認も求められると思います）
![承認.png](https://qiita-image-store.s3.amazonaws.com/0/11925/4302561e-b42c-be1f-f674-b1a2110b707d.png)

### 公開されたGASのYouTubeAPIを少し使ってみた。

以下のコードを実行すると、今年のGoogle Apps Scriptの関連動画が最大25件表示されます。
せっかくですので、GAS関連の動画をお楽しみ下さい。

```js:コード.gs
function myFunction() {
  // eventType=completedはtype=videoの時に使える。
  // eventType=completedのみの指定だとエラーになる。
  // 公開されたのが2013年以降の動画
  // 日付の新しい順に、最大25件
  var results = YouTube.Search.list('id,snippet', {
    q: 'Google Apps Script',
    type: 'video',
    eventType: 'completed',
    maxResults: 25,
    order: 'date',
    publishedAfter: '2013-01-01T00:00:00Z'
  });
  
  var data = [];
  for(var i = 0; i < results.items.length; i++) {
    Logger.log(results.items[i]);
    var item = results.items[i];
    data.push([item.snippet.title, item.snippet.description, item.snippet.publishedAt, "http://www.youtube.com/watch?v=" + item.id.videoId]);
  }

  SpreadsheetApp.getActive().getRange("A1:D25").setValues(data);
}
```

Youtube Data APIのsearchのドキュメントは以下のURLにあります。
(https://developers.google.com/youtube/v3/docs/search/list)
How to use `gls' on Emacs dired with MacOSX and coreutils

Emacs で `dired` を使うと以下のようなメッセージが出るときがあります。

```text
ls does not support --dired; see `dired-use-ls-dired' for more details.
```

これは MacOSX の `ls` がオプション `--dired` をサポートしていないためです。
coreutils をインストールして `/usr/local/opt/coreutils/libexec/gnubin` を[パスに含めちゃうという手](https://qiita.com/eumesy/items/3bb39fc783c8d4863c5f#path-%E3%82%92%E9%80%9A%E3%81%99-1)もあるのですが、coreutils は日本語のサポートがいまいちなのでちょっと避けたい(たとえば `df`)。

で、`~/.emacs.d/.init` に以下を追加すればオッケーです。

```el
(let ((gls "/usr/local/bin/gls"))
  (if (file-exists-p gls) (setq insert-directory-program gls)))
```

下記サイトを参照しました。
http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-07/msg01208.html
プラグインの動かし方

## 概要
あっちこっちで、runtimepathで宣言されてるパスにプラグイン入れたら動くよ！みたいなことが書かれていた。
でも実際は、その中で更にディレクトリを作成する必要がある旨の記述が自分では探せなかったのでメモ書き。

## 参考
割と古い記事だけども・・・
http://vim-users.jp/2009/06/hack34/

## 結論
プラグインを入れるには、runtimepathで指定しているディレクトリ内に"plugin"というフォルダを作成し、その中に入れる必要がある。

## おまけ(必要コマンド)
```vim
" vimのコマンドとして入力する場合は":"を先頭につける必要がある

" 設定されたランタイムパスの確認
set runtimepath
" ランタイムパスを追加("[]"は除く)
set runtimepath+=[追加するランタイムパス(絶対パス)]

" ロードされたプラグインを表示する
:scriptnames
```
【jQuery】jQueryの形と、呼び出し方

こんにちは。  
勉強したことのメモ。
  
まず、そもそも論ですが
###jQueryはほとんどがWebページ(HTML)を
###読み込んだあとではないと実行ができない。  
  
まぁこれは以前JavaScriptでもご教授頂いたように、
先にJavaScriptを読んでしまうと、機能が動かない！
というのと同じですかね。

>
http://qiita.com/g_lay_tomohiko/items/d7e1efab29f7f2a62407
外部 JS を読み込むということは、そのタイミングで外部 JS を実行するということです。
結果として実行時点ではなんの要素も存在しない状態となります。


ではjQueryではどうか。
>
jQuery( function )
DOM要素が全て読み込まれた段階で、functionを返します。
###※「"jQuery"は"$"に置き換えることも可能」###
→$(function)

僕はずっとこっちで書いていました。

*****
そしてではどうすれば、onclickとかで呼び出せるか色々試してみました。
もともとはページ内で完結させていて、実行させれば動く～みたいなのにしていましたが
せっかくなのでイベントも使いたいと思い、最初に書いたコード

※ダメだったコード

```html

<ul> 
  <li>１番目</li> 
  <li>２番目</li> 
  <li>３番目</li> 
</ul>

<input type="button" onclick='function()' value="てすと">
```

```js
 $(function(){
        $("ul li:even").css("color","blue");
        $("ul li:odd").css("color","red");
   });
```

これ、どうやってonclickで呼び出すんだ。

と、更に調べたところjQuery側で実行させているこの機能を
functionで定義させて上げました。

```js
function  changeColor(){
   $(function(){
        $("ul li:even").css("color","blue");
        $("ul li:odd").css("color","red");
   });
}
```

おぉ、これなら

```html
<ul> 
  <li>１番目</li> 
  <li>２番目</li> 
  <li>３番目</li> 
</ul>

<input type="button" onclick='changeColor()' value="てすと">
```

onclickイベントに定義したchangeColor()を呼び出すようにすれば
無事にいける～いけました～。

まだ他にも便利な方法(もっと簡略化とか)ありそう。
結構楽しくなってきました。

それでは、これからも宜しくお願いいたします。
go-irceventでお手軽IRC bot作成

この記事は Go Advent Calender 2013 の 17 日目の投稿です。

今回は、go-irceventというライブラリを利用して手軽にIRCボットが作成できることを紹介します。

# go-ircevent
[go-ircevent](https://github.com/thoj/go-ircevent/)は、IRCメッセージをイベントとして、イベントにコールバックを登録することができる便利なライブラリです。実装がとてもシンプルなので、golangを学び始めたときのサンプルとしても有用でしょう。

# 簡単な使い方
```go
package main

import "bytes"
import "log"
import "math/rand"
import "time"
import "github.com/thoj/go-ircevent"
 
func main() {
  // 接続のための記述
  ircobj := irc.IRC("parrot", "parrot")
  ircobj.UseTLS = true // bad certificate とエラーがでたら TLSConfigの設定を追記しましょう
  ircobj.Password = "XXXXXXX"
  if err := ircobj.Connect("irc.example.com:6667"); err != nil {
    log.Fatal(err)
  }

  // 接続後、#hogeチャンネルにjoinする
  ircobj.AddCallback("001", func (e *irc.Event) {
    ircobj.Join("#hoge")
  })
  
  // PRIVMSGメッセージをイベントとして、コールバックを登録する
  ircobj.AddCallback("PRIVMSG", func (e *irc.Event) {
      time.Sleep(1000 * time.Millisecond)
      ircobj.Notice("#hoge", e.Message) // おうむ返し
  })

  ircobj.Loop()
}
```

# 対応しているメッセージ(イベント)
go-irceventでは以下のメッセージ(イベント)に対応しています

* 001 Welcome
* PING
* CTCP Unknown CTCP
* CTCP_VERSION Version request (Handled internaly)
* CTCP_USERINFO
* CTCP_CLIENTINFO
* CTCP_TIME
* CTCP_PING
* PRIVMSG
* MODE
* JOIN
 その他...

# 適当に曲を選んでくれるボットの例
僕は巷で **SPEEDが好きなエンジニア** として有名になりつつあるので、適当にSPEEDの往年の名曲(僕にとっては往年ではないですが)を返してくれるボットをつくってみましょう。

```go
package main

import "bytes"
import "log"
import "math/rand"
import "time"
import "github.com/thoj/go-ircevent"

func main() {
  ircobj := irc.IRC("speed_bot", "speed_bot")
  ircobj.UseTLS = true
  ircobj.Password = "XXXXXXX"
  if err := ircobj.Connect("irc.example.com:6667"); err != nil {
    log.Fatal(err)
  }

  songs := [...]string{"Body & Soul", "STEADY", "Go! Go! Heaven",
                       "Wake Me Up!", "White Love", "my graduation",
                       "ALIVE", "ALL MY TRUE LOVE"}
  r := rand.New(rand.NewSource(time.Now().UnixNano())) // 現在時間を使って乱数源を生成

  ircobj.AddCallback("001", func (e *irc.Event) {
    ircobj.Join("#speed")
  })
  ircobj.AddCallback("PRIVMSG", func (e *irc.Event) {
    // 「pick song」とメッセージが飛んできたら
    if bytes.Contains([]byte(e.Message), []byte("speed_bot: pick song")) {
      time.Sleep(1000 * time.Millisecond)
      picked_song := songs[r.Int31n(int32(len(songs)))] // ランダムに選択して
      ircobj.Privmsg("#speed", picked_song) // 返す
    }
  })

  ircobj.Loop()
}
```

こんなかんじで使います

```irc
14:19 kitak: speed_bot: pick song
14:19 speed_bot: White Love
14:20 okkun_: ?
```

# まとめ
go-irceventを利用して、簡単にIRCボットを作成できることを紹介しました。
皆さんも自分が欲しいと思ったbotをgolangで実装して、幸福度を高めてみてはいかがでしょうか?
.screen


使っている設定だけ

zshrc

使ってる設定だけ

```shell:.screendefbce "on"attrcolor b "^["term xterm-256colordefscrollback 10000altscreen onvbell offautodetach onshell zshstartup_message offlogfile "$HOME/.screen/screen-%Y%m%d-%n.log"deflog onshelltitle '$ |localhost'msgwait 3msgminwait 1hardstatus onhardstatus alwayslastline '%{= .b}%H%{-} %L=%-w%45L>%{=u b.}%n %t%{-}%+w %-17<%=%m/%d %02c:%s'caption always '%?%F%{= bw}%:%{= wk}%?%2n%f%07=%t%='sorendition '+r .b'escape ^Tt#ウィンドウ操作モードbind w eval 'echo "Operate window"' 'command -c operate'bind -c operate ^]  commandbind -c operate j eval 'focus down' 'command -c operate'bind -c operate k eval 'focus up' 'command -c operate'bind -c operate h eval 'focus left' 'command -c operate'bind -c operate l eval 'focus right' 'command -c operate'bind -c operate t eval 'focus top' 'command -c operate'bind -c operate b eval 'focus bottom' 'command -c operate'bind -c operate + eval 'resize -v +1' 'command -c operate'bind -c operate - eval 'resize -v -1' 'command -c operate'bind -c operate > eval 'resize -h +1' 'command -c operate'bind -c operate < eval 'resize -h -1' 'command -c operate'bind -c operate = eval 'resize -v =' 'command -c operate'bind -c operate + eval 'resize -h =' 'command -c operate'bind -c operate s eval 'split' 'command -c operate'bind -c operate c eval 'screen' 'command -c operate'bind -c operate x eval 'remove' 'command -c operate'bind -c operate v eval 'split -v' 'command -c operate'#通常の操作キーbind x removebind j eval 'focus down'bind k eval 'focus up'bind h eval 'focus left'bind l eval 'focus right'bind + eval 'resize -v +1'bind - eval 'resize -v -1'bind > eval 'resize -h +1'bind < eval 'resize -h -1'bind v eval 'split -v' focus screenbind s eval 'split' focus screenbind = eval 'resize -v ='bind + eval 'resize -h +'bind ^h#splitsplit

```
IntelliJ IDEAでほぼ使わないチーム内コラボレーション機能

# 注意事項
* 本エントリはネタエントリです。あまり参考になることはありません。
* 特に、一人でIntelliJ IDEAをご利用の方はほぼ確実に参考になりません。
* 本文中に出てくるソースコードは、[新人女子プログラマの書いたコードを直すだけの簡単なお仕事です！｜paizaオンラインハッカソンVol.1](https://paiza.jp/poh/ec-campaign)の一部です。

# チーム内コラボレーション機能
IntelliJ IDEAには、誰得？と首を傾げざるを得ない機能がいくつか搭載されています。
今回はそのうち、チーム内コラボレーションとして使える機能3つを紹介します。

1. IDEtalkによるチャット
2. Send Code Pointerによるコードポイントの指摘
3. Show Diff With Userによるチームメンバーとのコード比較

## IDEtalkによるチャット
標準で入るプラグインIDEtalkを使うことにより、同一LAN上に居るIntelliJ IDEAユーザーとチャットすることが出来ます。
以下がIDEtalkのメイン画面です。
各ユーザーについて、オンライン・オフライン・NA(Not Available)・不在などの状態が分かるようになっています。
![スクリーンショット_121713_104651_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/871e7daa-2b49-a38a-deb7-03735ea4e82c.jpeg)

また、ユーザーの名前をダブルクリックすることにより、チャットすることも出来ます。
添付ファイル送信などの機能はありませんし、履歴もあまり当てになりません。

![スクリーンショット_121713_124911_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/fa58eb16-13c2-5889-9a8e-645ff3b7063d.jpeg)

ちなみに、[Jabber](http://www.jabber.org/)というサービス？につなげてチャットすることもできるようです。
さて、チャットができるようになったら、次の2機能の出番です。

## Send Code Pointerによるコードポイントの指摘
ソースコードを眺めていて、「あれ？ここ変じゃね？」と思うことはよくあると思います。
その際に担当者のもとまで聞きに行くのも面倒だしチケット化するものでもないし、でもIDEtalkでファイルの場所を説明するのも面倒だし…というときに使えるのが、このSend Code Pointerです。

使い方は簡単。気になる行を右クリックして、`Send Code Pointer`を選び、相手を選べばOKです。
![無題クリップ_121713_105428_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/5149cb60-08c7-f253-334d-0cf1a24908dc.jpeg)

その際にメッセージを残すことも出来ます。
![スクリーンショット_121713_010354_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/0916d286-f3dd-18ad-56b7-938a7906f632.jpeg)

送った結果、私にも相手にも、下記のようなリンク付きチャットログが表示されます。
![スクリーンショット_121713_105509_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/b9e21095-2271-9a99-ff90-0c2afcd6e2ac.jpeg)

このリンクをクリックすることにより、該当ファイルの指定行を開くことができるようになるわけです。

ただここで注意点がひとつ。相手が私と同じフォルダ・ファイル構成のプロジェクトを持っていなければ、リンクをクリックしても該当ファイルを開くことが出来ません。
何かしらのソース管理システムを使っている限り、この問題は深刻なことにはならないと思いますが、注意しましょう。

## Show Diff With Userによるチームメンバーとのコード比較
さて、相手さんにソースコードを修正してもらいました。となると次はコードレビュー。昨今はPull Requestによるコードレビューが当たり前になりつつあるかと思いますが、IntelliJ IDEAでは、自分のローカルフォルダと相手のローカルフォルダのファイルDiffを取得することが出来ます。それがShow Diff With User機能です。

使い方は簡単。エディタで開いているファイルを右クリックして、`Show Diff With User` → 相手を選択します。

![無題クリップ_121713_111608_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/1f080cd2-cf15-88db-fb40-512ade26fb90.jpeg)


その際、相手には「この人にローカルファイルの閲覧を許可する？」的なダイアログが出てきますので、広い心でOKしてください。
閲覧の許可がされている場合、相手のファイルとの差分を表示することが出来ます。
左が私、右が同僚のソースです。
![スクリーンショット_121713_111809_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/c1e2a45b-a015-b8f7-3d68-4e1ea3666882.jpeg)

なお、ユーザーを指定して`Selected user can read my files`のチェックを外せば、本機能が使えなくなります。セキュリティが気になる環境や、同僚に頻繁にdiffを取られて切ない方は、このチェックを外しましょう。

![無題クリップ_121713_112223_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/ae70eabc-74d9-7e86-0b20-3e0087115f8f.jpeg)


# 最後に
うちのチームでは、これらの機能は基本的に使用していません。あしからず。