OmniAICreator/Qiita-1.07M huggingface dataset:
[Cocos2dx]build_native.sh実行で「please define NDK_ROOT」が表示される Mac

環境変数に直接追加してもダメなようです。
このようになります。

`NDK_ROOT=/yyy/xxx/zzz/android-ndk-r7`
`echo $NDK_ROOT`
`/yyy/xxx/zzz/android-ndk-r7`
`./build_native.sh`
`please define NDK_ROOT`

.bash_profileにNDK_ROOTを設定してやることにより解決出来ます。
textFieldが隠れない！NSNotificationCenterの使い方その１

最近つかっているNSNotificationCenterがかなり便利だったのでまとめてみた。

おすすめの使い方はいくつかあるが、その一つを紹介する
今回NSNotificationCenterで主に使うメソッドは以下の2つ


```objectivec:NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver: selector: name:object:]
 [[NSNotificationCenter defaultCenter] removeObserver: name: object:]
```
これを使って、キーボートと一緒にせりあがるtextFieldを作れる
実装は以下のとおり。

```objectivec:Keyboard.h
@interface Keyboard : UIViewController
@property (strong, nonatomic) UITextField * textField;
@end
```

```objectivec:Keyboard.m
@implementation Keyboard
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

//キーボード表示・非表示の通知を開始
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];    
}

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    //キーボード表示・非表示の通知を終了
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


#pragma mark - Keyboard animation method

- (void)keyboardWillShow:(NSNotification *)aNotification {
    //キーボードの高さをとる
    CGRect keyboardRect = [[aNotification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardRect = [[self.view superview] convertRect:keyboardRect fromView:nil];
    NSNumber *duration = [aNotification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    
    //アニメーションでtextFieldを動かす
    [UIView animateWithDuration:[duration doubleValue]
                     animations:^{
                         CGRect rect = self.textField.frame;
                         rect.origin.y = keyboardRect.origin.y - self.textField.frame.size.height;
                         self.textField.frame = rect
                     } ];
}

- (void)keyboardWillHide:(NSNotification *)aNotification {
    NSNumber *duration = [aNotification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

    //アニメーションでtextFieldを動かす
    [UIView animateWithDuration:[duration doubleValue]
                     animations:^{
                         CGRect rect = self.textField.frame;
                         rect.origin.y = self.view.frame.size.height- self.textField.frame.size.height;
                         self.textField.frame = rect
                     }];
}

#pragma mark - textField

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    // エンターをおしたら、キーボードを閉じる
    [textField resignFirstResponder];

    return YES;
}
@end
```

次 : [delegateいらず！NSNotificationCenterの使い方その2](http://qiita.com/liver_sea/items/cf21ca5015cff7293038)
C++でクラス名を取得する

C++で、typeid()とabi::__cxa_demangle()を使って実行時に型情報を取得した時のメモ。

```cpp
#include <string>
#include <typeinfo>
#include <cxxabi.h>

class Foo;

{
    Foo obj;
    const type_info& id = typeid(obj);
    int stat;
    char *name = abi::__cxa_demangle(id.name(),0,0,&stat);
    if( name!=NULL ) {
        if( stat==0) {    // ステータスが0なら成功
            printf("name=%s",name);
        }
        free(name);        // freeする必要がある
    }

}
```

こんな感じで、typeid()で型情報を取得するのですが、そのままではマングリングされています。
デマングル処理を行う事で、クラス名を取得できるようになります。

※追記
__cxa_demangle()は明示的にfreeする必要があるそうです。下記参照。
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html
> A pointer to the start of the NUL-terminated demangled name, or NULL if the demangling fails. 
> The caller is responsible for deallocating this memory using free.
railsでreloadを禁止するためのtips (reload 取得、reload 判定、再読み込み 禁止)

railsでreloadをどうしても禁止したかったので書きました。
実際は禁止というよりもリロード時と通常のアクセスを分けるということですが、

フローとしては

+ requestされたuriを取得
+ requestされたuriをsessionに保存
+ requsetされたuriとsessionを比較する

このような流れで判断します。
コードは次のような形になります。

```rb 
if request.path_info != session[:ref]
  session[:ref] = request.path_info
  # 通常時の処理
else
  # reload時の処理
end
```

こうすることでリロード時と通常のアクセスで処理を分けることができます。
セッションの削除に関しては、任意のところで

```rb
session[:ref] = nil
```

とすればOK!
ヒアドキュメント内に関数オブジェクトを埋め込む

ヒアドキュメント内に関数呼び出しを埋め込みたいのだができないらしい。
オブジェクトのメソッドなら呼べるようだ。

```
{hoge()}  NG
{$boo->hoge()}   OK
```

__invoke()を使うといわゆる関数オブジェクトのクラスを定義できる。(>=5.3)
関数をラップする関数オブジェクトで置き換えられたらうれしいかもと、いろいろやってみた。

ラッパークラス

```functor.php
<?php
class Func {
	private $callable;

	public function __construct($callable) {
		if (!is_callable($callable)) 
		 	throw new Exception("not callable");
		$this->callable = $callable;
	}
	
	public function __invoke() { // >= 5.3
		return call_user_func_array($this->callable, func_get_args());
	}
}
```

サンプルコード。

```php 
<?php

include 'sample.php'

// example
class HogeHelper {
	private $path = "/image";
	function image_tag($file) {
		return "<img src=\"{$this->path}/{$file}\">";
	}
	function __call($name, $args) {
		return "<{$name}>{$args[0]}</{$name}>";
	}
	static function dateformat($date) {
		return date('Y年m月d日', $date);
	} 
}
$helper = new HogeHelper();

// data
$user = (object)array(
  'name' => 'Taro&Bros', 
  'email' => '"Taro" <taro@example.jp>', 
  'icon' => 'taro.jpg', 
  'comment' => "> awsome!\nthanx!",
  'update' => time(),
);

// functors       
$s  = new Func('htmlentities'); // global  function
$br = new Func('nl2br');
$img = new Func( array($helper, 'image_tag')); // instance method
$em = new Func( array($helper, 'em'));    // magic method
$df = new Func('HogeHelper::dateformat'); // static method
$C  = new Func('strval');     // for const value

// here doc
$comment = <<<AAA
<div id="100" class="comment">
<p>{$img($user->icon)}</p>
<p>{$s($user->name)}</p>
<p>{$s($user->email)}</p>
<p>{$br($s($user->comment), false)}</p>
<p>{$em($df($user->update))}</p>
<p>{$C(__FILE__)}</p>
</div>
AAA;

echo $comment;
```

出力

```html 
<div id="100" class="comment">
<p><img src="/image/taro.jpg"></p>
<p>Taro&amp;Bros</p>
<p>&quot;Taro&quot; &lt;taro@example.jp&gt;</p>
<p>&gt; awsome!<br>
thanx!</p>
<p><em>2013年05月31日</em></p>
<p>C:\phpproj\sample.php</p>
</div> 
```
忘れそうな命令をregに登録しておく

# レジスターへのコピー 例　レジスターｋ

　忘れそうな便利な命令を使いそうにないregに登録する。例えば、g/^\s*$/d(空行の削除）をreg kに記録して、@kでマクロ実行するようにする。

   * 適当な編集画面でg/^\s*$/dを入力、
   * 入力した命令部分をビジュアルモードにて、範囲指定
   * "kyでreg kにコピーする。
   * これで、@kで実行できる。
   * 使用は空行のある、ラインを範囲指定して、:@kを実行する。

　vimを終了、再立ち上げしてもregには残っているので、reg kを別の用途で使用しない限り継続して利用できる。

# マクロの内容の変更　例　レジスターｔ

   * ノーマルモードで、"tp　するとｔのレジスターの内容が表示される。
   * 表示されたｔ　:　0i[ ] jj$A [d:2016/06/18]!!jj0j
   * この一部を変更して、たとえば、日付の部分を変更する。
   * 表示されたｔの内容を変更　:　0i[ ] jj$A [d:2016/06/25]!!jj0j
   * 該当の行で、0桁位置、"ty$ でレジスタｔに入れ直す。

これで@tのマクロの一部を変更できる。
Raspberry Pi をGUIで動かす時のメモ


##VNCサーバのインストール
```
pi@raspberrypi ~ $ sudo apt-get install tightvncserver
```

##VNCサーバの起動
インストールが完了したらVNCサーバを起動する。

```
pi@raspberrypi ~ $ vncserver :1 -geometry 1024x600 -depth 16 -pixelformat rgb565
```
初回起動時は設定を聞かれる。

```
//デスクトップからアクセスするときはパスワード聞かれるよ
You will require a password to access your desktops.

//アクセス時のパスワード
Password:
Warning: password truncated to the length of 8.
Verify:

//ビューオンリーの時のパスワードも設定する？
Would you like to enter a view-only password (y/n)? y
Password:
Verify:
```

##VNCサーバへの接続

Finderのサーバーへ接続（⌘＋K）で画面共有を利用できる。特別なVNCクライアントアプリとかは不要。
接続先に

```
vnc://192.168.XX.XX:5901
```
と入力すると画面共有が開き、先ほど設定したパスワードが聞かれるのでそれを入力して接続する。

##VNCサーバの切断

```
pi@raspberrypi ~ $ vncserver -kill :1
```
bashで環境変数を削除するにはunset

追加は*export*

```
$ export A_VARIABLE=aaa
```

削除は*unset*

```
$ unset A_VARIABLE
```

値を確認する時は*echo* 、`A_VARIABLE=""`みたいな時も無いことを確認したい時は*env | grep*

```
$ echo $A_VARIABLE
aaa 

$ env | grep A_VARIABLE
A_VARIABLE=value
```

参考:[bashで環境変数を削除する:Linuxとは日記](http://what-linux.seesaa.net/article/144251644.html)
TOPへ戻るをpreloadにしてみるテスト。[XCL2.2系専用]

JQueryで、スクロールしながらTOPに戻るプラグイン「jQuery Scroll to Top Control v1.1」を
XOOPS Cubeで利用可能にするプリロードを作ってみました。（XCL2.2系専用）


※3つのファイルを、以下のような感じで配置する事になります。

html
├─[preload]─JQueryScrollTopControl.class.php
├─[common]─scrolltopcontrol.js
├─[images]─up.png
・
・

***

###１．preload作成

作成ファイル：/html/preload/JQueryScrollTopControl.class.php

```JQueryScrollTopControl.class.php
<?php

if (!defined('XOOPS_ROOT_PATH')) exit();

class JQueryScrollTopControl extends XCube_ActionFilter
{
	public function preBlockFilter()
	{
		$this->mRoot->mDelegateManager->add('Site.JQuery.AddFunction',array(&$this, 'addScript'));
	}

	public function addScript(&$jQuery)
	{
		$ImgIcon = "up.png";	//画像ファイルの名前
		$ImgWidth = "50";	//画像ファイルの横幅（単位：px）
		$ImgHeight = "50";	//画像ファイルの高さ（単位：px）

		$ControlIcon = XOOPS_URL . "/images/" . $ImgIcon;
		$JQueryScrollTopControlScript = "/common/js/scrolltopcontrol.js?" . "url=" . $ControlIcon . "&width=" . $ImgWidth . "&height=" . $ImgHeight;

		$jQuery->addLibrary($JQueryScrollTopControlScript, true);
	}
//class END
}
?>
```

※画像ファイル名を変更する場合、$ImgIconにファイル名、
　$ImgWidthに画像の横幅、$ImgHeightに画像の高さを指定してください。

***

###２．jQuery Scroll to Top Controlの変更
[jQuery Scroll to Top Control v1.1](http://www.dynamicdrive.com/dynamicindex3/scrolltop.htm "jQuery Scroll to Top Control v1.1")をダウンロードして、scrolltopcontrol.jsを開き、
先頭に下記コードを追加。

```
var configs = new Object;
var scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
  var s = scripts[i];
  if (s.src && s.src.match(/scrolltopcontrol\.js(\?.*)?/)) {
    var params = s.src.replace(/.+\?/, '');
    break;
  }
}

params = params.split("&");
for(var i = 0; i < params.length; i++) {
  var tmp = params[i].split("=");
  configs[tmp[0]] = unescape(tmp[1]);
}

imgtag = '<img src="' + configs.url + '" style="width:' + configs.width + 'px; height:' + configs.height + 'px;" />';

```

更に、12行目あたりにある

```
controlHTML: '<img src="up.png" style="width:48px; height:48px" />',

```

…を、以下の通りに変更。

```
controlHTML: imgtag,
```

変更したscrolltopcontrol.jsを /html/common/js/ にアップロード。

***

###３．TOPへ戻る画像
jQuery Scroll to Top Control同梱の画像（若しくは自分で作った画像）を、
/html/images/　へアップロード。

***

GitHubにあげてあるので、こちらからどうぞ。
[pianoman-net / JQueryScrollTopControl](https://github.com/pianoman-net/JQueryScrollTopControl.git " pianoman-net / JQueryScrollTopControl")
WebRTCのgetUserMediaでビデオ出力

カメラとマイクへのアクセスを許可するとブラウザに表示されます。
 
 
 
サポート状況

- Google Chrome 27、Firefox 21で動作しました。
- Opera 12では映像のみ出力され、音声は出力されませんでした。
- Internet Explorer、Safariでは動作しませんでした。

```html
<video id="video" autoplay controls></video>
```

```javascript
navigator.getMedia = (
    navigator.getUserMedia ||
    navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia ||
    navigator.msGetUserMedia
);
if (navigator.getMedia) {
    var prop = {
        video: true,
        audio: true,
        toString: function() {
            return 'video, audio';
        }
    };
    navigator.getMedia(
        prop,
        onStream,
        onStreamFailed
    );
} else {
    alert('エラー: getUserMediaがサポートされていません');
}
function onStream(stream) {
    if (!window.URL) {
        window.URL = {};
        window.URL.createObjectURL = function(obj) { return obj; };
    }
    var video = document.getElementById('video');
    video.src = window.URL.createObjectURL(stream);
}
function onStreamFailed(err) {
    console.error('エラー: ' + err);
}
```
Google Analytics SDK for iOS v2 (Beta) でカスタム変数を使う

#GoogleAnalytics for iOS の基礎の基礎

## 入手先
[Downloads - iOS SDK - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/collection/ios/resources?hl=ja)

##とりあえず使ってみる

とりあえず使うだけなら非常に簡単。
以下のようにするだけでトラッキングしてくれる。

この例ではViewDidLoadでsendViewしているが、基本的にどこで実行してもよい。
同じViewController内で画面が切り替わるような場合は、
画面を切り替えるメソッド内で実行してやればよい。

```objective-c:AppDelegate.m
#import "GAI.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // GoogleAnalytics
    // (オプション)キャッチされない例外エラーをトラッキングするか。デフォルト:有効
    [GAI sharedInstance].trackUncaughtExceptions = YES;
    
    // (オプション)ディスパッチインターバル。デフォルト:20秒
    [GAI sharedInstance].dispatchInterval = 20;
    
    // (オプション)YESにするとより多くのデバッグ情報を取得する。デフォルト:有効
    [GAI sharedInstance].debug = YES;
    
    // トラッカーインスタンスの生成。自分のトラッカーIDに変える
    id<GAITracker> tracker = [[GAI sharedInstance] trackerWithTrackingId:@"UA-YOUR-TRACKING-ID"];
    
    // トラッカーIDひとつしか使わないならここでデフォルトトラッカーを置き換え
    [GAI sharedInstance].defaultTracker = tracker;

    return YES;
}
```

```objective-c:YourViewController.m
#import "GAI.h"

@implementation YourViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[GAI sharedInstance].defaultTracker sendView:@"任意のスクリーンネーム"];
}

@end
```

##カスタム変数(Custom Dimensions & Metrics)を使う

GoogleAnalyticsはデフォルトでiOSのversionや画面解像度、地域、デバイスの種類、アクティブユーザー数、などなど様々な値を取得してくれる。
しかし、独自の値を取得したいということもある。

そのような場合、まずGoogleAnalyticsのWebページからアナリティクス設定を開く。
![GoogleAnalytics.png](https://qiita-image-store.s3.amazonaws.com/0/12896/5a2a5c16-282c-c7f6-510a-94e95ec91152.png)

次にカスタム定義から[カスタムディメンション]や[カスタム指標]を開いて任意のカスタムディメンション/指標を作成する。
![custom.png](https://qiita-image-store.s3.amazonaws.com/0/12896/ca467474-1868-ec66-bde8-e4b3b827e8cf.png)

あとはコード上でそれらに対して送信してやるだけ。

```objective-c:CustomMetric
id tracker = [GAI sharedInstance].defaultTracker;

// NSNumber
[tracker setCustom:1
                    metric:@1];

[tracker sendView:@"任意のスクリーンネーム"];
```

```objective-c:CustomDimension
id tracker = [[GAI sharedInstance].defaultTracker;

// NSString
[tracker setCustom:1
              dimension:@"任意の文字列"]; 

[tracker sendView:@"任意のスクリーンネーム"];
```
配列を高速に探索するTips

[追記]気づいたらいつの間にか50ストックを超えていました。みなさんありがとうございます。[/追記]

どうも、Opera Nextに（色んな意味で）驚きを隠せないあらっきぃです。

大抵の場合は`Array#indexOf`で事足りるんだけど、時々高速に配列に要素が存在するか調べたくなることがあります。

例えばこんな風に、要素数`100000`の配列があったとします。

```javascript
var
arr = (function(len) {
  var
  i,
  arr = [];
  for(i = 0; i < len; i++) arr.push(~~(Math.random() * len));
  return arr;
})(1000000);
```

この配列に`999983`（`1000000`以下の最大の素数）が含まれているか調べるには、通常こう書きます。

```javascript
var
search_num = 999983;
if(arr.indexOf(search_num) !== -1) {
  //要素があった場合
} else {
 //要素が無かった場合
}
```

（CoffeeScriptの`in`演算子も`Array#indexOf`を呼びますね）

ですが、この`Array#indexOf`は単純なリニアサーチ（線形探索）なので、最悪要素数に比例した時間がかかります。なので、複数回呼ぶ場合は速度においてネックになります。

ソートされていればバイナリサーチでもいいのですが、あいにくこの配列はソートされていそうにもありませんし（ボゴソート的確率でソートされていることはありますが…）、バイナリサーチを書くのは正直面倒です。

そこで、JavaScriptの全てとも言えるオブジェクトを使って、こんな風に書いてみることにしました。

```javascript
var
arrTable = arr.reduce(function(m, a, i) {
  m[a] = (m[a] || []).concat(i);
  return m;
}, {});
if(searchNum in arrTable) {
  //要素があった場合
} else {
  //要素が無かった場合
}
```

はい、ハッシュ法です（まあJavaScriptのオブジェクトをハッシュ法で実装しなきゃいけないという法律があるわけでもないので、もしかしたら二分探索かもしれませんが…）。
戯言は無視しましょう。

この方法を使うと、ハッシュテーブルを作るのには要素数に比例した時間がかかりますが、探索時間自体は（理論上）定数時間で終わることになります。
つまり、`Array#indexOf`を使っていた時には五回の探索で`5000000`のコストが掛かっていたわけですが、ハッシュ法だと`1000005`になるわけです。約五分の一です。すごい。

しかも、

```javascript
console.log(arrTable[searchNum]);
```

のようにすれば、配列中の要素のある位置が全て求まるように実装しました。便利ですね。

最後に、この探索をコンポーネントにしておきたいと思います。

```javascript:search.js
var
Search = (function() {
  
  /* constructor */
  function Search(arr){
    if(!(this instanceof Search)) return new Search(arr);
    this._arr = arr;
    this._createTable();
  }
  
  var
  /* member */
  proto = Search.prototype = {
    _arr: null,
    _table: null,
  };
  
  /* private */
  proto._createTable = function() {
    this._table = this._arr.reduce(function(m, a, i) {
      m[a] = (m[a] || []).concat(i);
      return m;
    }, {});
  };
  
  /* public */
  proto.has = function(a) {
    return a in this._table;
  };
  
  proto.index = function(a) {
    return this._table[a] || [];
  };
  
  proto.search = function(a) {
    return this.index(a).reduce(function(m, i) {
      m.push(this._arr[i]);
      return m;
    }, []);
  };
  
  return Search;
})();
```

[追記]ちなみに、コメント欄でも触れられていますが、JavaScriptのオブジェクトのキーは文字列のみなのでオブジェクトに対してこの方法を使うことはできません。[/追記]
今日作りたくなる簡単cookbook [Kim'sキッチン] timezone


以下全ても●みち風に書いたメモ

皆さんおはようございます。
[ryurock@github](http://qiita.com/users/ryurock@github)です。

```shell:フガすけ(14歳)
timezoneの設定変えたいっす
```

今日はそんなtimezoneを変更する簡単なcookbookをknife-soloでご紹介したいと思います。


## レシピ作成時間
約2分

## 環境
* mac-osx（ホストOS）
* centos6.4-x86-minimal (ゲストOS)

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※1.9.3-p286でもいけた
* chef ※入れていない方は```gem install chef```とshellから打ってください
* vagrant ※入れていない方は[chef-soloで使用するvirtualbox(vagrant)をveeweeを使用して作る](http://qiita.com/items/3cb756a9c951371a4089)を参考に入れておいてください
* git
* knife-soloのセットアップ ※やっていない方は[今日作りたくなる簡単cookbook [Kim'sキッチン] yumsetup(yum-fastestmirrorにyum update添え)](http://qiita.com/items/c99215e25bd2ff846207)の前準備を参考にしてやっておいてください。

## 参考にしたサイト（書籍）
* [入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)(達人出版)
* [rbenvを使ってシステムワイドにrubyをインストールする方法](http://qiita.com/items/8e973a544b592376a07e)


## [その１] レシピ名を決める

今回のレシピ名はtimezoneで行きましょう

```shell
cd chef-repo
knife cookbook create timezone -o site-cookbooks
```

## [その2] chef-repo/timezone/recipes/default.rbを編集

```ruby:chef-repo/timezone/recipes/default.rb
template "/etc/sysconfig/clock" do
  notifies :run, "execute[timezone_update]", :immediately
end

execute "timezone_update" do
  command "cp /usr/share/zoneinfo/Japan /etc/localtime"
  action :nothing
end
```

## [その3] timeozoneの設定をtemplateに書く

シンプルです。

```ruby:chef-repo/timezone/templates/default/clock.erb
ZONE="Asia/Tokyo"
```

やっていることは

* timezoneの設定をコピー
* /etc/sysconfig/clockを日本時間に変更

です。



[Chef Resources](http://docs.opscode.com/resource.html)を使用した

* [execute](http://docs.opscode.com/resource_execute.html)
* [template](http://docs.opscode.com/resource_template.html)

で実行します。

## [その4]rbenv cookbookをリモート側で実行する設定を追加

```shell
vim chef-repo/nodes/{接続名称（任意）}.json

{"run_list":[
        "timezone"
]}
```

run_listをすでに記載している場合は追記でお願いします。
またrbenvのインストールのみで問題ないならrbenvだけでも問題ないです。

## [その5] リモート側に実行依頼をする

```shell
cd chef-repo
knife solo cook {接続名称（任意）}

```

## 今日はこれで決まり「timezone」の完成です

簡単にtimezoneの設定が変更できますね。
厳密にやりたい場合はattibuteなどもつかってみてください。

使った[Chef Resources](http://docs.opscode.com/resource.html)

----

* [template](http://docs.opscode.com/resource_template.html)
* [execute](http://docs.opscode.com/resource_execute.html)


ソースをgithubに置いてあります。
https://github.com/ryurock/chef-timezone
WebDriverを使ってtarget=_blankで開いた別ウインドウにフォーカスする

SeleniumのWebDriverでテストするときにtarget=_blankで別ウィンドウを開いた場合、そのままだとウィンドウが変わってくれません。

以下のようにすればウィンドウを変更できます。

## 最後のウィンドウにフォーカスする
```ruby
new_window = page.driver.browser.window_handles.last
page.within_window new_window do    
  # code
end 
```

## window_idを取得して移動する
```ruby
# 全てのwindow_idを取得
window = page.driver.browser.window_handles()  

# 指定したキーにウィンドウをフォーカス
page.driver.browser.switch_to.window(window[1])
```
複数のカラムの値が連携する場合のバリデーション

複数のカラムの値が連携する場合のバリデーションはカスタムメソッドで実現できました。
たとえば、Personモデルに真偽値のカラム`flg_a`と`flg_b`があり、それらが同時にfalseになってはいけない場合には以下のように記述します。

```ruby:persons.rb
class Person < ActiveRecord::Base
  validate :flgs_cannot_be_false_at_once
 
  def flgs_cannot_be_false_at_once
    error_msg = "flg_aとflg_bが同時にfalseになることはできません。"
    errors.add(:flg_a, error_msg) unless flg_a || flg_b
  end
end
```

モデルにカスタムメソッド`flgs_cannot_be_false_at_once`を定義して、メソッド名をシンボルの形で`validate`に渡します。（`validates` ではなく `validate`（sがない））

参考：[Ruby on Rails Guides: Active Record Validations and Callback 6.2 Custom Methods](http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods)
文字列に一致するファイルを表示するコマンド

カレントディレクトリで"aaa"という文字列が含まれるファイルを表示する

``` 
find . | xargs egrep -l "aaa"
```

カレントディレクトリで"aaa"という文字列が含まれるファイル数を表示する

``` 
find . | xargs egrep -l "aaa" | wc -l
```
strftimeで和暦表示

PHPで和暦表示をしたい場合、オリジナルな関数を作成しなくても、
strftimeで以下のように変換指定子を指定するといけるかも。
（Cライブラリに依存、windowsでは動作しなかった）

例えば、
平成x年x月x日 x曜日と表示したいのなら、以下のようにする。

```php:
<?php
   setlocale(LC_TIME, "ja_JP.utf8", "Japanese_Japan.932");
   print strftime('%EC%Ey年%B%#d日 %A');
?>
```

結果

>平成25年5月30日 木曜日

<br>

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

<br>


'%Ec'を指定すると、ロケールの日付・時間を表示してくれる。

```php:
<?php
   setlocale(LC_TIME, "ja_JP.utf8", "Japanese_Japan.932");
   print strftime('%Ec');
?>
```

結果

>平成25年05月30日 18時04分52秒

<br>
<br>
参考：
[» Open Group による strftime() の定義](http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html)
Bashのプロンプト変更


残さないと分からなくなるので、いくつかのパターンをメモ

# 変更方法

PS1変数に代入されている
常に使うのであれば、~/.bashrcに書いとけ！

# サンプル

## 赤文字で、カレントディレクトリ/ホスト名　時刻を表示

```
PS1="\[\033[0;31m\][\W/\h \t]\$ "
```
[~/www 17:08:50]$

## 日付時刻を表示（dateを実行）

```
PS1="[\$(date)]\$ "
```

[2013年 5月30日 木曜日 17時28分22秒 JST]$


# リファレンス

## エスケープ文字

|エスケープ文字|意味|
|---|---|
|\\a|ASCIIベル(07)|
|\\d|日付|
|\\e|ASCIIエスケープ文字(033)|
|\\h|ホスト名|
|\\H|FQDN名|
|\\n|改行|
|\\r|復帰|
|\\s|シェル名|
|\\t|時刻 HH:MM:SS形式(24時間)|
|\\T|時刻 HH:MM:SS形式(12時間)|
|\\@|時刻 am/pm付き|
|\\u|ユーザー|
|\\v|bashバージョン|
|\\V|bashバージョン・リリース番号|
|\\w|現在のディレクトリ（フルパス）|
|\\W|現在のディレクトリ（ベース名）|
|\\!|コマンドのヒストリー番号|
|\\#|コマンドのコマンド番号|
|\\$|UIDが0であれば"#"、それ以外は"$"|
|\\nnn|8進数nnnに対応する文字|
|\\\|バックスラッシュ|
|\\[|表示されない文字列エスケープシーケンスを埋め込む|
|\\]|表示されない文字列の終わり|

## 文字色変更

|色|コード|
|---|---|
|Black|0;30|
|Red|0;31|
|Green|0;32|
|Brown|0;33|
|Blue|0;34|
|Purple|0;35|
|Cyan|0;36|
|Light Gray|0;37|
|Dark Gray|1;30|
|Light Red|1;31|
|Light Green|1;32|
|Yellow|1;33|
|Light Blue|1;34|
|Light Purple|1;35|
|Light Cyan|1;36|
|White|1;37|


※参考
[Bash Prompt HOWTO](http://archive.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO.html)
fontFamily="_等幅"を指定すると、Chrome の Flash プレイヤー (PPAPI)で文字化けする


以下の issue が関係しているように思われるが、まだ直ってないのかな？

[[PepperFlash] Incorrect mapping from Japanese device font to PPAPI font family](http://code.google.com/p/chromium/issues/detail?id=145203)

引用：
<blockquote>
What steps will reproduce the problem?
1. Run chrome
2. Open http://wonderfl.net/c/d0Gf
3. Click the triangle "play" button on the right dark box.

What is the expected result?
Rendered by "_ゴシック", "_明朝", "_等幅": Chrome Setting Font "Sans Serif Font"

What happens instead?
Rendered by "_ゴシック" -> Gothic-like font, "_明朝": -> Ming-like font, "_等幅" -> Monospace-like font
</blockquote>

とりあえず、該当箇所については "_等幅" とする必要性が感じられなかったので fontFamily の指定を外しておいた。

## 参考

"_等幅" については以下を参照
http://livedocs.adobe.com/flex/3_jp/langref/flash/text/engine/FontDescription.html#fontName
EC2に作成したOracleDatabaseサーバでEnterpriseManagerを構築するには？

AWSのEC2上にOracle１１ｇR2をインストールしたのですが、
EM（EnterpriseManager）を作成することが出来なくて困っています。

EC2は起動のたびにホスト名、ローカルIPが変わるので、ホスト名を指定して作成しようとしているのですが、
上手くいきません。

emca -config dbcontrol db -ORACLE_HOSTNAME=********

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
You have specified the following settings

Database ORACLE_HOME ................ /u01/app/oracle/product/11.2.0/db_1

Local hostname ................ ****　←引数で指定したHOSTNAMEとは違う値が出ます！
Listener ORACLE_HOME ................ /u01/app/oracle/product/11.2.0/db_1
Listener port number ................ 1521
Database SID ................ hdaba01
Email address for notifications ............... 
Outgoing Mail (SMTP) server for notifications ............... 

-----------------------------------------------------------------
Do you wish to continue? [yes(Y)/no(N)]: Y
May 29, 2013 4:11:10 AM oracle.sysman.emcp.EMConfig perform
INFO: This operation is being logged at /u01/app/cfgtoollogs/emca/hdaba01/emca_2013_05_29_04_10_39.log.
May 29, 2013 4:11:14 AM oracle.sysman.emcp.EMConfig perform
SEVERE: Listener is not up or database service is not registered with it. Start the Listener and register database service and run EM Configuration Assistant again .
Refer to the log file at /u01/app/cfgtoollogs/emca/hdaba01/emca_2013_05_29_04_10_39.log for more details.
Could not complete the configuration. Refer to the log file at /u01/app/cfgtoollogs/emca/hdaba01/emca_2013_05_29_04_10_39.log for more details.

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


どなたか作成方法をご存知でしたら教えて下さい。
10系のchef-serverをApache + Passengerで動かす

chef-serverはどうやらIPv6をListenできないっぽい。（使われていたMerbのコードを見たけれど、それっぽいのが見つからない。。。）

最も簡単なのは、nginxでもapacheでもいいんですが、IPv6でlistenするproxyを立てちゃうことなんですが、MerbなんでPassengerでもいけるはず。。。ということで、Apache + Passengerで動かしてみました。

ちなみにChef 11系使えば不要です。（Merbもないし）
諸事情あり11系にアップグレードできなくて、かつ、半ば趣味が入っている人向けです。

## 手順
AWS上のubuntu 12.04でやりました

### Apache + Passengerのインストール
ここは至って普通です。一応書いておきますが、お好きな手順で大丈夫です。

```bash:install_passenger
# パッケージを取ってきて
$ sudo apt-get install apache2 libapache2-mod-passenger

# passengerを入れる
$ sudo gem install passenger
$ sudo passenger-install-apache2-module 

# 失敗する場合、恐らくこのあたりを要求されてます。詳細はメッセージを読んで判断してください
$ sudo apt-get install apache2-threaded-dev libapr1-dev libaprutil1-dev libcurl4-gnutls-dev

# うまく行った場合は、passengerの設定ファイルを作ってくれと言われるので、それに従って作ります
$ sudo vim /etc/apache2/conf.d/passenger.conf
```


### Chef ServerのPassenger用の設定
Chef ServerはMerb、つまりRackアプリなので、Passengerが有効な状態でconfig.ruの階層にあるpublicディレクトリをドキュメントルートにすると、アプリケーションとして動作します。

```bash:config_passenger
# まずはconfig.ruのありかを探す（aptで入れている場合はdpkgで）
$ gem contents chef-server-api|grep config.ru

# 見つかったので確認すると、publicディレクトリがある！
$ ls /var/lib/gems/1.9.1/gems/chef-server-api-10.xx.0/
LICENSE  README.rdoc  Rakefile  app  bin  config  config.ru  development.ru  lib  public  spec
```

あとは、このpublicディレクトリをapacheのDocumentRootに設定すればOKです。

### パーミッションの修正
起動の仕方が変わるので、パーミッション（もしくは、apacheのプロセスユーザ）の修正が必要になります。
server.rbの設定内容やそこで設定しているパスへのパーミッション、認証に使っているpemファイルへのパーミッションを確認してください。

### プロセスの切り替え
chef-serverのプロセスを停止し、apacheを起動します。

## あとがき
WebUIを基本的に使っていないのでWebUIの手順は省きましたが、やるべき事は基本的に一緒です。ただ、同一アドレス・ポートでの共存は厳しそうなので、アドレスなりポートをapache側で分けてあげる必要があります。
Apacheでhttpsにリバースプロキシする

 * Apacheでhttpsをリバースプロキシする場合はmod_sslとSSLProxyEngine onの設定が必要
  * 以下の例では次のようにプロキシする
  * [クライアント] => http => [リバースプロキシサーバー] => https => [hoge.example.com]

```apache
<VirtualHost *:80>

  RewriteEngine on
  SSLProxyEngine on

  RewriteCond %{HTTP_USER_AGENT} hogemoge
  RewriteRule ^(.*)$ https://hoge.example.com$1 [P]
```

## はまった
 * mod_ssl入ってない、SSLProxyEngine onの設定ない状態だと500発生
 * mod_ssl入ってなくて、SSLProxyEngine onに設定したらそんなのないって怒られた
 * Amazon Linuxだとmod_sslは以下のように入れた

```bash
sudo yum install mod_ssl -y
```
Align の実装

こんなのを作っておく

```as:Align.as
class Align
{
	public static const TOP_LEFT: Align		 = new Align(0);
	public static const TOP: Align			 = new Align(1);
	public static const TOP_RIGHT: Align	 = new Align(2);
	
	public static const LEFT: Align			 = new Align(3);
	public static const CENTER: Align		 = new Align(4);
	public static const RIGHT: Align		 = new Align(5);
	
	public static const BOTTOM_LEFT: Align	 = new Align(6);
	public static const BOTTOM: Align		 = new Align(7);
	public static const BOTTOM_RIGHT: Align	 = new Align(8);
	
	private var _value: int;
	
	public function Align(value: int) { _value = value % 9; }
	
	public function get value(): int { return _value; }
}
```

使う時はこんなん感じ

```as:test.as
function layout(target: DisplayObject, align: Align, width: Number, height: Number): void
{
	var value: int = align.value;
	target.x = (width  - target.width)  / 2 * (value % 3);
	target.y = (height - target.height) / 2 * (value / 3 | 0);
}

```
$@ と "$@" の違い

個人見解: 大半は "$@" にしておけば、期待する動作となる

```bash
#!/bin/bash
#
# $ dump-vars.sh [args]
#

function dump_vars() {
  while [[ "$1" ]]; do
    echo "'$1'"
    shift
  done
}

echo '#1'; dump_vars $@
echo
echo '#2'; dump_vars "$@"
```

```bash
$ ./dump-vars.sh a b c d
#1
'a'
'b'
'c'
'd'

#2
'a'
'b'
'c'
'd'
```

```bash
$ ./dump-vars.sh "a b" "c d"
#1
'a'
'b'
'c'
'd'

#2
'a b'
'c d'
```
無限テーブル


```.h
#import <UIKit/UIKit.h>

@interface InfiniteTableView : UITableView
<UITableViewDataSource>
@end
```

```.m
#import "InfiniteTableView.h"

@interface InfiniteTableView() {
	int mTotalCellsVisible;
}
@end

@implementation InfiniteTableView

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
		self.showsVerticalScrollIndicator = NO;
    }
    return self;
}

-(void)resetContentOffsetIfNeeded {

	NSArray *indexpaths = [self indexPathsForVisibleRows];
    int totalVisibleCells = indexpaths.count;
    if( mTotalCellsVisible > totalVisibleCells )
    {
        //we dont have enough content to generate scroll
        return;
    }
    CGPoint contentOffset  = self.contentOffset;
    
    //check the top condition
    //check if the scroll view reached its top.. if so.. move it to center.. remember center is the start of the data repeating for 2nd time.
    if( contentOffset.y <= 0.0) {
        contentOffset.y = self.contentSize.height / 3.0f;
    }
    else if( contentOffset.y >= ( self.contentSize.height - self.bounds.size.height) )//scrollview content offset reached bottom minus the height of the tableview
    {
        //this scenario is same as the data repeating for 2nd time minus the height of the table view
        contentOffset.y = self.contentSize.height/3.0f- self.bounds.size.height;
    }
    [self setContentOffset: contentOffset];
}

- (void)layoutSubviews
{
    [super layoutSubviews];
	mTotalCellsVisible = self.frame.size.height / self.rowHeight;
	[self resetContentOffsetIfNeeded];
}

-(NSInteger)numberOfSectionsInTableView: (UITableView *)tableView {return 1;}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 10 * 3;}

-(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	NSString *cellid = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid];
	if (cell == nil) {
		cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid];
	}
	cell.textLabel.text = [NSString stringWithFormat:@"cell: %d", indexPath.row % 10];
	return cell;
}

@end
```
直接アクセスを拒否するけどSSIのincludeアクセスは許可したい時の.htaccess設定

SSIで読み込むファイルが入ったディレクトリへの直接アクセスを禁止したいと思った時にハマって、そして解決したのでメモ。


# 設定例
/_ssi/ というディレクトリにSSI用のファイルがあって、ここへの直接アクセスを禁止したい。

## 失敗例
`.htaccess`に以下のように単純に書くと失敗します。

```apache
RewriteEngine on
RewriteRule ^/?_ssi/ - [F]
```

確認のために http://example.com/_ssi/ へ直接アクセスしてみると全て 403 Forbidden になって出来たー。と思うのもつかの間、実はこれだと**SSIのinclude読み込みまでも拒否してしまう**ので全然駄目です…orz


## 成功例

SSIでの読み込みか直接アクセスなのかを区別したいときには`%{IS_SUBREQ}`というのが使えます。これはそのリクエストが通常のリクエストなのかhttpd内部でのサブリクエストかどうかを判定する為の[RewriteCondで使える特殊変数](http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond)で、trueかfalseが入っています。

```apache
RewriteEngine on
RewriteCond %{IS_SUBREQ} =false
RewriteRule ^/?_ssi/ - [F]
```

なので、こんな感じの設定をしてやれば「SSIでは読み込めるけど直接アクセスは禁止」が実現できるってわけですす。

# 参考
[mod_rewrite - Apache HTTP Server](http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond)
PHPUnitで複数回session_start()してしまうエラーを回避する方法。


```
 A session had already been started - ignoring session_start()
```

PHPUnitテストコードのsetUp()を以下の様にする。

```xxx_Test.php
protected function setUp(){
    if(!isset($_SESSION)){
        $_SESSION=array(  );
    }
}
```
 
$_SESSIONはarray()なので、空の配列をそのまま入れる。  
tearDown()でsession_destroy()してもいいのかもしれないけど、
自分の場合、別途影響が出て、うまく行かなかったのと、
Stack Overflowに同様の対処方法があった上記を採用しました。
gvimのツールバーにdiff用ボタンを追加した

![スクリーンショット_053013_025304_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/13183/1be8f23a-2e8f-1581-5c50-34a0d080d67d.jpeg)

gvim +1 -d ファイルA　ファイルB

なんて感じにdiffモードで起動した時に、ボタンクリックで差分を前後に移動できるようにしてみた。マウスだけでボケーッと使える。

```vim:_gvimrc

if has("toolbar")
  " セパレータ
  an ToolBar.-MySeparatorNo01- <Nop>

  " ]cで前の差分に移動してzzでカーソル行を画面中央にする
  tmenu ToolBar.JumpPreviousDiff Jump previous diff
  an ToolBar.JumpPreviousDiff [czz

  " ]cで次の差分に移動してzzでカーソル行を画面中央にする
  tmenu ToolBar.JumpNextDiff Jump next diff
  an ToolBar.JumpNextDiff ]czz

  " セパレータ
  an ToolBar.-MySeparatorNo02- <Nop>

  " パスが長すぎてファイル名が読めないと困る。
  " カレントディレクトリをファイルパスに変更する。
  tmenu ToolBar.SetCurrentDir Set current directry to file path
  an ToolBar.SetCurrentDir :cd %:h<CR>

  " セパレータ
  an ToolBar.-MySeparatorNo03- <Nop>
endif

```

そして、ランタイムディレクトリのbitmapsに
JumpPreviousDiff.bmp
JumpNextDiff.bmp
SetCurrentDir.bmp
を置く。
linuxではxpmらしい。共通フォーマットにしたいがまだやってない。

すこぶる便利や・・・・
【Sails.js 入門 - 02】Get Started

http://sailsjs.org/#getStarted

## Get Started

ここはできるだけシンプルにするため、めっちゃ頑張っている。 ただ Sails.js をインストールして、新しいプロジェクトを作って、サーバに載せる。

・・・らしいです。ここからは、訳者勝手にアレンジ。

### Installation

最新の sails をコマンドラインでインストール。各種のコマンドラインからのテンプレート生成のためにグローバル(-g)でインストール

```
sudo npm -g install sails
```

### コマンドは何があるかな

```
$ sails

debug: Welcome to Sails! (v0.8.91)  

info: Usage: sails <command>

sails lift                       Run this Sails app (in the current dir)
  [--dev]                        with development environment specified 
  [--prod]                       with production environment specified 
sails console                    Run this Sails app (in the current dir & in interactive mode.)
sails new <appName>              Create a new Sails project in the current dir
sails generate <foo>             Generate api/models/Foo.js and api/controllers/FooController.js
sails generate model <foo>       Generate api/models/Foo.js
sails generate controller <foo>  Generate api/controllers/FooController.js
sails version                    Get the current globally installed Sails version  
```

### Creating a New Sails Project

新しいプロジェクトを作成

```
$ sails new app02

debug: Generating app directory...  
info: Generating Sails project (app02)...  
debug: Generating package.json...  
debug: Generating README.md... 
```

中身を見てみる。

```
$ tree

.
└── app02
    ├── api
    │   ├── adapters
    │   ├── controllers
    │   ├── models
    │   ├── policies
    │   │   └── authenticated.js
    │   └── services
    ├── app.js
    ├── assets
    │   ├── js
    │   ├── mixins
    │   │   ├── reset.css
    │   │   └── sails.io.js
    │   ├── styles
    │   └── templates
    ├── config
    │   ├── adapters.js
    │   ├── application.js
    │   ├── assets.js
    │   ├── bootstrap.js
    │   ├── locales
    │   │   └── english.js
    │   ├── local.ex.js
    │   ├── local.js
    │   ├── policies.js
    │   ├── routes.js
    │   └── views.js
    ├── package.json
    ├── public
    │   ├── favicon.ico
    │   ├── images
    │   └── robots.txt
    ├── README.md
    └── views
        ├── 404.ejs
        ├── 500.ejs
        ├── home
        │   └── index.ejs
        └── layout.ejs
```

### 起動してみる

作成したプロジェクトに cd して、lift コマンドを打つ

```
$ cd app2
$ sails lift

debug: Starting server in /path/to/sails/app02...  
   info  - socket.io started
debug: 
debug:   
debug:   
debug:   
debug:                    <|  
debug:                     |  
debug:                 \\____//  
debug: --___---___--___---___--___---___  
debug: --___---___--___---___--___---___  
debug:   
debug: Sails (v0.8.91)  
debug: Sails lifted on port 1337 in development mode.  
debug: 
debug: ( to see your app, visit: http://localhost:1337 ) 
```

http://localhost:1337/ を開く。


>![qiita-sails-beginner-02.png](https://qiita-image-store.s3.amazonaws.com/0/12228/1582b9ed-1cf5-4cc9-1068-c9f77cca41e4.png)
簡単実装！RailsのActiveRecordでクエリをキャッシュする小技

RailsのQuery Cacheを見ると、発行したSQLはハッシュで管理されており、
発行済の場合は、キャッシュを使うようになっていました。

この考えに従い、以下のようにすると、
見事１回のクエリだけで終わりました。

```ruby
<% if @user.hoge.present? %>
    <% @user.hoge.order(:created_at.desc).each do |hoge| %>
	    XXXXX
    <% end %>
<% end %>
```
・・・クエリ２回

⬇

```ruby
<% if @user.hoge.order(:created_at.desc).present? %>
    <% @user.hoge.order(:created_at.desc).each do |hoge| %>
	    XXXXX
    <% end %>
<% end %>
```
・・・クエリ１回


本当は変数用意して使えって感じですがね。。

以上、豆知識でした。
knife-solo cookでrsync errorが出た時の対応

Jenkinsからknife-soloを使ってEC2に環境構築をしている際に、以下のエラーが発生した。
ただし、別の環境から実施した際は同現象は発生しなかったので、特定のバージョンに依存した現象かも。
なお、cookする前に、knife solo prepareでEC2側にchefをインストールしている。

環境

* OS : CentOS 6.3
* knife-solo :  gem installした0.2.0
* chef : 11.4.4
* rsync : 3.0.6

EC2

* OS : AmazonLinux 64bit
* type : t1.micro

エラー内容

````
+ bundle exec knife solo cook ec2-XXX.amazonaws.com
Checking Chef version...
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
ERROR: RuntimeError: Failed to launch command rsync -rl  --rsh="ssh ec2-user@ec2-XXX.amazonaws.com" --delete --exclude revision-deploys --exclude tmp --exclude '.*' --exclude *~ --exclude *.sw[a-z] --exclude */.svn/*  ./ :/tmp/chef-solo
````

# 回避策

原因不明で色々悩んでいたところ、sshした際に出る公開鍵登録の確認にyesで答えて、出なくしてあげると現象が出なくなる事を確認した。

````
Are you sure you want to continue connecting (yes/no)? yes
````

knife-solo実行側の~/.ssh/configに

````
Host *.amazonaws.com
  StrictHostKeyChecking no
````

と書いてあげる事で、yes/noは聞かれなくなり、エラーが解消された。
GitLabのNetwork Graphが優れている4つの理由

1. コミットのAuthor、ログメッセージ、レビューコメントの件数が表示される
1. ブランチ・タグの切替とフィルターができる
1. コミットの検索ができる
1. スクロールバーによるスクロールが可能

[[詳細を表示](http://hiroponz.hateblo.jp/entry/2013/05/29/195056)]
Handlebarsで配列にアクセスする場合


GoogleのYouTube検索APIにて

![スクリーンショット_2013_05_30_12_06.png](https://qiita-image-store.s3.amazonaws.com/0/4319/659fb32e-4220-c858-62bd-520e87e2f544.png "スクリーンショット_2013_05_30_12_06.png")

これだとエラー

```
# Expecting 'ID', got 'INVALID'とかエラー
<ul style="list-style:none;padding:0">
	{{#each results}}
		<li>
			<img src="{{this.media$group.media$thumbnail[0].url}}">
			{{this.title.$t}}
		</li>
	{{/each}}
</ul>
```
以下ならOK

```
<ul style="list-style:none;padding:0">
	{{#each results}}
		<li>
			<img src="{{this.media$group.media$thumbnail.[0].url}}">
			{{this.title.$t}}
		</li>
	{{/each}}
</ul>
```
【Sails.js 入門 - 01】Sails.js とは

(走り訳なので・・・細かいニュアンスの違い・見落としはご容赦ください)

http://sailsjs.org/

### What Is Sails.js?
Sails.js は、エンタープライズレベルの Node.js アプリを簡単に作成することができる。Rails のような MVC フレームワークを真似てはいるけれども、スケーラブルなデータ駆動API、サービス指向のアーキテクチャといったモダンなアプリの要求をサポートする。チャットやリアルタイムダッシュボード、マルチプレーヤのゲームをつくるのに特に向いている。

### Features

Sails.js を使えば開発時間は、ぐっと小さくなる。世に出せるレベルのリアルタイムアプリを数ヶ月でなく、たった数週間で作れる！

Sails.js は、他の MVC フレームワークができないことができる：

* Sails.js は、データベース不可知。 ORM である *Waterline* は、どのデータベースに対しても動作するシンプルなデータアクセス層を提供する。しなければいけないことは、コミュニティで作られたアダプタをひとつプラグインすることだ。もし、レアないしはプロプライエタリなシステムに繋ぎたいときも、独自のアダプタを書くのはたやすい！

* Sails.js は、自動的に RESTful JSON API を作成するよ。つまり、シンプルなデータベースアプリであれば、バックエンドのコードを書かなくていいってことだ！

* リアルタイム Socket.io リクエストは他のすべてと同じように、コンベンションとURLマッピングによって、コントローラにルーティングされる。 リアルタイムアプリにしたい時も、アプリ全体を再作成する必要がないってこと。

* Sails.js は、既定で基本的なセキュリティ機構とロール制御を提供するし、好きなようにカスタムのポリシーを追加できる。柔軟なマッピングによって、コントローラやアクションに様々なアクセス制御をかけられるし、パラメータのバリデーションも適用できる。そうすれば、ビジネスロジックを書き始める前に、ユーザーに権限があることがわかり、必要なすべてのデータが既に得られていることになる。

* Express と Socket.io は、同一の設定可能なセッションストアを共有するから、すべてのセキュリティポリシーは WebSocket リクエストでも同様に再利用される。

* Sails.js は、自動的にアセットのコンパクト化をおこなう。過去には、UI の CSS と JavaScript は手動でリンクしなければならなかったが、Sails.js なら、 適切なフォルダに入れておけば自動的にレイアウトに含まれる。 そして、本番化の準備ができたなら、コンパクト化されgzipが掛けられる。これは CloudFront のような CDN に置き換えることも簡単にするし、ロードを速くする。

as of 2013.5.31
gitで不要なタグ、ブランチを一括削除

## タグの削除

* 2.0.2beta3とかのタグを削除したい場合

```bash
for tag in `git tag`; do if [[ ${tag} =~ "^.*beta[0-9]*$" ]] ; then git tag -d ${tag}; fi done
```

## ブランチの削除

* feature_xxxxみたいなブランチを削除したい

```bash
for branch in `git branch`; do if [[ ${branch} =~ "^feature_.*$" ]]; then git branch -D ${branch}; fi done
```
複数行の先頭にスペース挿入/削除コマンド

html編集時にインデントをミスっていて、
・複数行の先頭にスペースを挿入したい
・複数行の先頭のスペースを削除したい
とたまに思うのですが、
たまに過ぎて、コマンドがぶっ飛んでしまうので忘備録に...

## 複数行の先頭にスペースを挿入したい

` C-x r o`

#### 使い方

1. 挿入したい行の先頭（左上隅）でC-Space
2. 範囲選択の最後（選択範囲の右下隅）に到達したら挿入したい文字分先にカーソルを移動する
3. C-x r o

## 複数行の先頭のスペースを削除したい

` C-x r d`

#### 使い方

1. 削除したい行の先頭（左上隅）でC-Space
2.  範囲選択の最後（選択範囲の右下隅）に到達したら削除したい文字分先にカーソルを移動する
3. C-x r d
ELBにSSLを設定で Invalid Private Key.

Certificate Name：[任意のサーバ用CAファイルの名前を入力]
→任意

Private Key：[サーバ用秘密鍵ファイルの中身]
→*****.key

Public Key Certificate：[証明書ファイルの中身]
→*****.crt

Certificate Chain：[中間CA証明書ファイルの中身]
→*****.ca

以上の内容で[Save]ボタンを押した際に

Invalid Private Key.

と怒られた場合の対応方法。

秘密鍵のファイルが

```text:*****.key
-----BEGIN PRIVATE KEY-----
```

で始まっていませんか？
もしこの文字列で始まっている場合はファイルの中身を変換しましょう。

```sh
openssl rsa -in [old_key_file] -out [new_key_file]
```

これで

```text:*****.key
-----BEGIN RSA PRIVATE KEY-----
```

で始まるファイルが生成されるので、これをそのままコピペして解決。
UTF-8で保存してるけどSyntax Error

ものすごく基本的なことだけど、備忘録的に。

pythonのファイルをUTF-8で保存しているのに実行時にSyntax Errorが出ることがある。
たとえコメントでもascii範囲外の文字が含まれると出ると怒られるらしい。

そんな時はファイル冒頭に
`# coding: utf-8`
または
`#-*- coding: utf-8 -*-`
と記述することで解決!!

ちなみにこれは**python2.x系での話**
python3.x系は書かなくても怒られなかったけど、書いておくほうが無難かな?
Node.js(Express) x Heroku で最速アプリ公開


Node.jsが流行っているので使ってみようと思い使ってみました。
Node.jsにおけるデファクト・スタンダードなフレームワーク、Expressを使いました。

作ってみたのは超シンプルアプリです。
FacebookURL to ID
http://fburl2id.herokuapp.com/

ソースはこれです。
https://github.com/sumyapp/fburl2id.git

データベースもなし、Node.jsが活かされるというイベントベースの通信もなしです。

## 個人的な結論

- Node.js(Express)のみだと、Expressのインスパイア元であるSinatraと比較してもまったくメリットを感じない。Sinatraよりも高い学習コスト、低生産性。Railsと比較すると圧倒的な低生産性
- Javascriptではあるが、HTML+Javascriptしか触っていないJavascriptエンジニアにはおそらく使用不可能な難易度
- Socket.IOなど、イベントハンドリング系のサービスでは有効かも

といったところです。

疲れたので、流れだけ目次として記載します。
## 流れ
1. Node.jsのインストール
 - http://nodejs.org/
 - ただ、node.jsのバージョン管理ツールがあるらしいので、そちらがオススメです。ただ、どれがデファクト・スタンダードかは定まってない感じがします。 [nvmでnode.jsをインストールする](http://h2plus.biz/hiromitsu/entry/154)
2. Node.jsについて学ぶ
 - 完全にエンジニアの方向けの内容ですが [Nodeビギナーズブック](http://www.nodebeginner.org/index-jp.html)
 - 初心者の方にはこちらのほうが良いかもです。 [基礎から学ぶNode.js](http://gihyo.jp/dev/serial/01/nodejs/0001)
2. Expressのインストール。記事があったのでリンク貼っときます。
 - [Express.jsを使ったWebアプリケーションを構築](http://gihyo.jp/dev/serial/01/nodejs/0003)
3. view頑張る
 - jadeという形式が標準のようです。
 - viewsフォルダに入ってます
4. ロジック頑張る
 - routesフォルダにjsファイルが入ってます
 - routesっていう名前が私は気に入らないですが。。。
5. Herokuで公開する
 - 上に書いた記事にHerokuで公開する方法も載ってたのでそちらで。。。
 - Gemfileに相当するpackage.jsonを書く以外は特に変わったことは必要ありませんでした。

## 疲れた。何でもかんでもCallback前提Javascript嫌い。
絶対「JavascriptとHTMLなら書けます」ってエンジニアには使えんだろ、これ。
とはいえ、やはりイベントベースは良いっちゃ良いです。開発生産性は低いですが、パフォーマンスやユーザビリティの良さはありますね。

この記事がよさそうでした。
[Node.js + WebSocket + Backbone.jsのすすめ](http://takesy.cocolog-nifty.com/atico/2012/12/nodejs-websocke.html)
Chefでopscode-cookbooksのntpレシピを使う

opscodeのpublic cookbooksを使ってntpによる時刻合わせをするサンプルです。

このサンプルでは、chef-soloを使ってローカルホストに対してレシピを実行します。
レシピ管理にはBerkshelfを使い、serverspecでテストします。

## 使用するレシピ
Opscode Cookbook ntp
https://github.com/opscode-cookbooks/ntp

## レシピのダウンロード
```ruby:Berksfile
site :opscode
cookbook 'ntp'
```

```
bundle exec berks install --path vendor/cookbooks
```

## レシピを読む
```ruby:vendor/cookbooks/ntp/recipes/default.rb
# ntpパッケージをインストールする
node['ntp']['packages'].each do |ntppkg|
  package ntppkg
end

# ntpが使うディレクトリの所有者と権限を設定する
[ node['ntp']['varlibdir'],
  node['ntp']['statsdir'] ].each do |ntpdir|
  directory ntpdir do
    owner node['ntp']['var_owner']
    group node['ntp']['var_group']
    mode 0755
  end
end

# ntpサービスを開始し、自動起動設定する
service node['ntp']['service'] do
  supports :status => true, :restart => true
  action [ :enable, :start ]
end

# files/default/ntp.leapsecondsファイルを
# node['ntp']['leapfile']のパスに配置する
cookbook_file node['ntp']['leapfile'] do
  owner node['ntp']['conf_owner']
  group node['ntp']['conf_group']
  mode 0644
end

# 設定ファイルを作成し、サービスを再起動する
template "/etc/ntp.conf" do
  source "ntp.conf.erb"
  owner node['ntp']['conf_owner']
  group node['ntp']['conf_group']
  mode "0644"
  notifies :restart, resources(:service => node['ntp']['service'])
end
```

## レシピの実行
default['ntp']['servers']アトリビュートに時刻同期先のサーバを設定します。

```js:nodes/localhost.json
{
  "ntp": {
    "servers": ["ntp.nict.jp", "ntp.jst.mfeed.ad.jp"]
  },
  "run_list": [
    "recipe[ntp]"
  ]
}

```

```
sudo bundle exec chef-solo -c solo.rb -j nodes/localhost.json
```

## serverspecでテスト
```ruby:spec/localhost/ntp_spec.rb
require 'spec_helper'

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

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

describe file('/etc/ntp.conf') do
  it { should be_file }
  it { should contain '^server ntp.nict.jp' }
  it { should contain '^server ntp.jst.mfeed.ad.jp' }
end

# アスタリスク "*" が左端に表示され参照中であること
describe command('ntpq -pn') do
  it { should return_stdout /^\*\d/}
end
```

```
bundle exec rake spec 

Package "ntp"
  should be installed

Service "ntpd"
  should be running
  should be enabled

File "/etc/ntp.conf"
  should be file
  should contain "^server ntp.nict.jp"
  should contain "^server ntp.jst.mfeed.ad.jp"

Command "ntpq -pn"
  should return stdout /^\*\d/
```
IE8以下で透過pngをフェードさせるときAlphaImageLoader使っても直らないのは

実験した結果、形によって効かないことがあることが判明しました。
曲線が多いもの（曲線が半分以上くらいある）とダメなようです。

形によって効くかどうか決まるので，形を変えるか諦めましょう。
IE8でjQueryでフェードすると、ガタガタするのを直す

##原因
font-familyにメイリオが入っているとIE8でjQueryのフェードを使うとfilterとClearTypeの相性のせいで、アンチエイリアスが効かなくなる（なんかガタガタする）みたいです。

##直し方
メイリオを消す

##それでもなんかおかしい
メイリオが入ってなくてもテキストが横にずれたら下記のように書くと直りました。

```css:CSS
a {
	filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
}
```
gitで差分ファイルを抽出する

案件で「作業の差分を納品してくれ」とか言われることってよくあります。
今までは手作業でディレクトリ作って、ファイルをコピーしてましたが、
もう、そんなうんざりする作業とはおさらばできそうです。
`git archive` と `git diff` の合わせ技で差分を出力できる事がわかったからです。

例えば、一個前のコミットから現在のコミットまでの差分を取り出したい時は、

```bash
git archive --format=zip --prefix=root/ HEAD `git diff --diff-filter=d --name-only HEAD^ HEAD` -o archive.zip
```

まずは、`git archive` について。
`--format=zip` を付けるとzipで固めてくれます。
`--prefix=root/` は抽出したファイルをrootディレクトリに入れた状態にしてくれます。
`-o archive.zip` で出力先と出力名を指定しています。
`HEAD` は抽出元のコミットで、
抽出したいファイルやディレクトリを`git diff`を使って指定しています。

`git diff` は `--name-only` を付けると、ファイルのパスを返してくれるのです。
`--diff-filter=d` オプションで不要な削除の差分をフィルタリングすると、
差分ファイルに必要なファイルパス一覧が取得できます。
例では、`HEAD^` と `HEAD` のコミット間での差分のファイル一覧が返るので、
それを `git archive` がzipにしてくれるというわけです。


## 関数化した
毎回コマンド書くのは辛いので、
関数化してみました。
zshとbashで動作を確認しました。

```bash
function git_diff_archive() 
{
  local diff=""
  local h="HEAD"
  if [ $# -eq 1 ]; then
    if expr "$1" : '[0-9]*$' > /dev/null ; then
      diff="HEAD~${1} HEAD"
    else
      diff="${1} HEAD"
    fi
  elif [ $# -eq 2 ]; then
    diff="${2} ${1}"
    h=$1
  fi
  if [ "$diff" != "" ]; then
    diff="git diff --diff-filter=d --name-only ${diff}"
  fi
  git archive --format=zip --prefix=root/ $h `eval $diff` -o archive.zip
}
```
---
引数なしで `git_diff_archive` と呼ぶと `HEAD` を丸っとzipにします。

```bash
git_diff_archive
```

---
引数に数値を指定すると、`HEAD` と `HEAD~数値` の差分を抽出します。
つまり、数値分前のコミットからの差分になります。

```bash
git_diff_archive 数値
```

---
引数にコミット識別子(IDとかHEADとかHEAD^とかdiffの引数として使えるもの)を指定すると、
`HEAD` と コミット識別子 の差分を抽出します。
IDで一発指定したい時とか便利です。
この時、HEADよりも新しいIDとかは渡さないようにしてください。
想定している抽出物を得られない可能性が高いです。

```bash
git_diff_archive コミット識別子
```

---
コミット識別子を2つ渡すと、その2つのコミットの差分を抽出します。
ちょっと前のバージョンの差分が欲しいとか言われたときに使えます。
渡す順番は新しいコミット、古いコミットの順番で渡してください。
間違うと、想定している抽出物を得られない可能性が高いです。

```bash
git_diff_archive コミット識別子1 コミット識別子2
```

---
何かおかしなところがありましたら、
やさしいツッコミお待ちしております。


## 修正履歴
*2015/06/25*
引数を1つだけ渡すときに、数字で始まるコミットIDを渡すとエラーが起きていました。

*2015/06/24*
差分にファイルの削除が含まれると、それも差分として一覧に追加されてしまい、
zipに固めるときにファイルがなくてエラーになってました。

*2016/11/05*
`git diff` に渡すコミット識別子の順番を入れ替えました。
以前の順番だと、新しいコミットから古いコミットを比べた差分になってしまい、
差分が上手く取得できないケースがありました。
それにともない `--diff-filter` も `D` から `d` に変更しました。
double precision range


This return a double precision interator like the built-in range function.

```python
class drange :
    """
    return double precision range.
    """
    def __init__(self,nx,sx,ex) :
        # check type
        if   type(nx) is not type(1)  : raise TypeError
        elif type(sx) is not type(1.) : raise TypeError
        elif type(ex) is not type(1.) : raise TypeError
        # initialize
        self.nx, self.sx, self.ex = nx, sx, ex
        self.dx, self.i = ( ex - sx ) / float(nx), -1

    def __iter__(self) : return self

    def next(self) :
        self.i += 1
        if self.i > self.nx-1 :
            self.i = -1
            raise StopIteration
        else :
            return self.sx + self.dx * float(self.i)

if __name__ == "__main__" :
    print [ x for x in drange(2**3,1.,2.) ]
    dx = drange(3,1.,2.)
    for x  in dx :
        print dx.i, x
```

results

```
[1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 1.875]
0 1.0
1 1.33333333333
2 1.66666666667
```