OmniAICreator/Qiita-1.07M huggingface dataset:
Parallella で HDMI 出力


漢なら Parallella で GUI も出したいですよね!

しかし現時点(2014 年 2 月ころ)の Parallella パッケージについている OS イメージでは, 私のように HDMI 出力がうまくいかなくて(LG のモニタで「範囲超過」というエラーが出た), 涙で枕を濡らす日々が続くかと思われました.

そんな折, Andreas さんからカーネルをアップデートすれば(直るかも?)という神対応いただきました.

https://twitter.com/adapteva/status/436461744534609921

早速カーネルをアップデートして HDMI 出力できるようにしましょう.


## カーネルをアップデートする

すでにビルドされたカーネルイメージが

https://github.com/parallella/parallella-bin

にあるのでこれを使いましょう.

Parallella 用 SD カードを別途 Linux などに刺してマウントし(/media/BOOT にマウントされると仮定します), rel.14.02.06.tgz (2014 年 2 月時点での最新版) を展開, /media/BOOT に内容をコピーします. 

### 領域が足りないと言われたら…

場合によっては /media/BOOT の領域が足りないと言われるかもしれません. その場合は /media/BOOT にある .Trash フォルダを削除しておきましょう.

## 再起動する

カーネルをアップデートしたら, 再度 SD カードを Parallella に刺して起動させます.

![parallella_gui.JPG](https://qiita-image-store.s3.amazonaws.com/0/36275/1ce7b657-97a4-7e65-fa91-e87809d8ee34.jpeg "parallella_gui.JPG")

Cool!

Parallella でレイトレに一歩近づきましたね!
Cocos2d-X + Android + AdMob でホームボタンで停止するとエラーがでるメモ


# 状況

Android でCocos2d-xと組み合わせてAdMobを使っていたら、
実機でホームボタンを押してアプリを終了すると、
下記のエラーがでて本体がハングアップする状況にであった。
>Eclipseから実行していなかったし、電源ボタンも反応ないので、バッテリーをとりはずして再起動するしかなくなった。
>あらためて、Eclipseを使って確認したのが下記のエラーメッセージ。

```text:エラーメッセージ
couldn't save which view has focus because the focused view
```

原因はよくわからなかったのだが、OnStop()でAdMobを表示しているビューを廃棄し、
OnStart()でまた作り直すように変更したら、ハングアップはしなくなった。
これが正しい対処なのかどうかは不明。

```java:
public class MyGame extends Cocos2dxActivity {
	private WindowManager wm;
	private AdView adView = null;
	private static Cocos2dxActivity me = null;

    protected void onCreate(Bundle savedInstanceState){
    	super.onCreate(savedInstanceState);

    	me = this;

    	showAdMob();
    }

	//...

   @Override
    protected void onStart() {
        super.onStart();
        
        if(adView == null){
        	showAdMob();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
    	if(adView != null){
    		wm.removeView(adView);

    		adView.destroy();
    		adView = null;
    	}

    }

   protected void showAdMob(){
        if(adView != null) return;

        try{
            adView = new AdView(me.getApplicationContext());
    		adView.setAdUnitId(AD_APPID);
    		adView.setAdSize(AdSize.BANNER);
            
//    		AdRequest adRequest = new AdRequest.Builder().build();  // For Distribution
    		AdRequest adRequest = new AdRequest.Builder()           // For DEBUG
    			.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)        // All emulators
    			//.addTestDevice("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")  // 実機デバッグ用
    			.build();
    		adView.loadAd(adRequest);

    	    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();  
    	    layoutParams.gravity = Gravity.TOP | Gravity.CENTER;
    	    layoutParams.x       = 0;
    	    layoutParams.y       = 0;
    	    layoutParams.width   = WindowManager.LayoutParams.WRAP_CONTENT;
    	    layoutParams.height  = WindowManager.LayoutParams.WRAP_CONTENT;
    	    layoutParams.type    = WindowManager.LayoutParams.TYPE_TOAST;
    	    layoutParams.flags   = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
             
    	    if(wm == null){
    	    	wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    	    }

            wm.addView(adView, layoutParams);  

        }catch (Exception e) {
            //FlurryAgent.logEvent("ADMOB ERROR: "+e);
        }
    }
}
```
即時関数 javaプログラマのjavascript入門 

// 通常のやり方
// 関数を定義
function func1(id) {
&nbsp;&nbsp;&nbsp;&nbsp;document.write(id + '&lt;br&gt;');
}

// 関数を実行
func1('id1');


// 即時関数の場合、関数を定義してすぐに実行できる
// 書き方は関数をカッコで囲み、後に引数を付ける
// もちろん引数無しのfunctionも可能
// 無名関数も可能
// (function(xxx){})(引数);
(function func2(id) {
&nbsp;&nbsp;&nbsp;&nbsp;document.write(id + '&lt;br&gt;');
})('id2');

// function定義がスコープ外になるため、後で実行することはできない
try {
&nbsp;&nbsp;&nbsp;&nbsp;func2('id2-2'); // これはエラーになる
} catch(e) { document.write('id2-2はエラー' + '&lt;br&gt;'); }

// 即時実行関数をあとで実行する場合は変数に格納する
// （でも、あまりきれいじゃない気がする）
var later;
(later = function func3(id) {
&nbsp;&nbsp;&nbsp;&nbsp;document.write(id + '&lt;br&gt;');
})('id3');

later('id3-2');


■ 実行結果
id1
id2
id2-2はエラー
id3
id3-2


// 利用例としてDWRとjQuery、Prototype.jsを同時に使う場合、
// ＄がバッティングするのを防ぐ対応がある
// この例の場合＄がバッティングしてもjQueryの$を実行できる
// jQueryはjQuery.noConflict()を使う方法もある
 (function (＄, id) {
&nbsp;&nbsp;&nbsp;&nbsp;alert(＄(id).html());
 })(jQuery, 'id1')

↑半角＄がなぜかうまく入力できないため全角にしています
Storyboardのsegueでパラメタ受け渡したった


iOS7が出た以降、新規プロジェクトを起こすときは、
SBを使うようにしていて、その辺のメモ。

performSegueWithIdentifierする時に、
もっと色々と渡せたらいいのにー。

##遷移方法
Storyboardから遷移先に引いたpush(例えば)の線にIDを設定し、
そのIDを使って、下記実装をすれば遷移可能

```objectivec:FirstViewController.m
- (void) openChatView
{
    [self performSegueWithIdentifier:@"openChatView" sender:self];
}
```

##おっと本当に遷移していいかチェックしようぜ

```objectivec:FirstViewController.m
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier
                                  sender:(id)sender {

  // 仮にテーブルセルを選択して、次画面遷移するとしたら・・・
  NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

  // チェック対象の遷移はこれかな？ segueの名前から、チャット系なのかな？
  if ([identifier isEqualToString:@"openChatView"]) {

    // 選択セルの情報はとれたかな？ _chatListはNSArray的なやつで、isEmptyはnil & countチェックメソッドdeath!
    if (_chatList.isEmpty || ![_chatList objectAtIndex:indexPath.row]) {
      return NO;
    }
  }

  // いくぜ
  return YES;
}
```

##遷移時のパラメータ受け渡し方法

渡す時は、UIViewControllerのメソッドをオーバーライドして、


```objectivec:FirstViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"openChatView"]) {
        SecondViewController *controller = segue.destinationViewController;
        controller.name = @"neiraza";
    }
}
```

受け取る側は、プロパティを用意しておけば。

```objectivec:SecondViewController.h
@interface SecondViewController : UIViewController
@property (nonatomic, strong) NSString *name;
@end
```

```objectivec:SecondViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
	NSLog(@"name %@", self.name);    
}
```
アイコン用Webfont（シンボルフォント）作成メモ＠基本的にフリーウェア

当方の環境はWinです。Macでもほぼ同じ感じのはず、たぶん。
いろいろひっかかって面倒だったので作業の備忘録的な。

## 使用するソフト
+ [Inkscape](http://www.inkscape.org/ "Inkscape")

> Inkscape は Windows、Mac OSX、および Linux 用のベクターグラフィックエディターです。オープンソースであり、そしてフリーです。

フリーらしいです。ありがとうございます！


## アイコンをSVGで用意する
使用したいアイコンを [Inkscape](http://www.inkscape.org/ "Inkscape") で頑張って描いて保存。
Adobeラブな場合、FW(要拡張)とかイラレとかで描いてSVG保存。
ちなみにこの時、アウトラインをとってあると後が楽。


## SVGフォント化
[Inkscape](http://www.inkscape.org/ "Inkscape") を起動。


「ファイル」→「ドキュメント設定」。「ページ」タブの「カスタムサイズ」でとりあえず大きめの正方形に（とりあえず1000px*1000pxにした）。


D&Dなどで上記で保存したSVGを読み込む。

![webfont01.png](https://qiita-image-store.s3.amazonaws.com/0/37883/a4b5fc8a-a13f-ce4f-4eff-f0d9b57dc52c.png)

1. 今回はドキュメントサイズぎりぎりまで拡大（場合によりけり）
2. だいたい真ん中にくるように配置


「テキスト」→「SVGフォントエディタ」を表示。

![webfont02.png](https://qiita-image-store.s3.amazonaws.com/0/37883/15133b30-ec75-1048-4fea-3ee4b94ba7a1.png)

1. 「SVGフォントエディタ」の「新規」をクリック
2. 作成されたフォントを選択
3. 「グリフ」タブを選択
4. 「グリフを追加」をクリック
5. 追加されたグリフのマッチング文字列を入力


マッチング文字列に対して割り当て。

![webfont03.png](https://qiita-image-store.s3.amazonaws.com/0/37883/d36c9582-b218-fc6d-a1cd-c2f8933a2e27.png)

1. 「プレビューテキスト」に上記で設定した「マッチング文字列」を入力
2. 読み込んだSVGを選択
3. 追加したグリフを選択
4. 「選択オブジェクトから曲線を取得」をクリック
5. ここにアイコンが表示されれば成功
6. 「ファイル」→「保存」でSVGを保存

### アイコンが表示されない場合

![webfont04.png](https://qiita-image-store.s3.amazonaws.com/0/37883/d2669af5-f162-924f-53e7-926a95f57712.png)

1. 選択ツールからノードツールに切り替えて、読み込んだSVGを選択
2. 「パス」→「結合」を選択
3. 再度「選択オブジェクトから曲線を取得」をクリック

で、アイコンが表示されるようになります。
これでもダメなら、「パス」→「連結」とかを
適当に選んでから再度、「選択オブジェクトから曲線を取得」を
クリックするとそのうち表示されます（体験談）


### アイコンを追加する場合
+ 「レイヤー」→「レイヤー」を表示。1レイヤーに1アイコンとかにすると管理しやすいかも
+ あとはひとつめと同様に、SVGを読み込んで～で増やせる


### ソフトのバグ？

![webfont05.png](https://qiita-image-store.s3.amazonaws.com/0/37883/54209ad8-4cca-fe18-a1e7-1e8e99ace98d.png)

この時のInkscapeのバージョンは0.48だったんだけど、
ノードツールに切り替えてパスの結合とかしてると、
SVGのサイズ変更をしようにも、上記の値が真っ白になってしまう。
ソフトを再起動すると再度弄れるようになるよ。ぐぬぬ。


## SVGフォントをwoffとかに変換
+ [Online Font Converter](http://onlinefontconverter.com/ " Online Font Converter")
 + ここで変換したらうまくいった。
 + - でもなんかサイトに繋がらなくなった。。
 + 2014/02/25追記：とりあえずつながった。ここがオススメ。

+ [IcoMoon App](http://icomoon.io/app/ " IcoMoon App")
 + SVGをアップロードしてみても真っ白だと思ったら、個別編集でMoveDownしたら出てきた。たぶんベースラインの解釈がなんかおかしいらしい。
 + 1個ずつ調整してくのは流石になぁ。。
 + [Choromeアプリ版](https://chrome.google.com/webstore/detail/icomoon/kppingdhhalimbaehfmhldppemnmlcjd " Choromeアプリ版")なんてのもあるのね。

オンラインサービスって繋がらなくなった時点で使えなくなるのはリスクだよなぁ、と改めて。
もうちょっと調べてみるか。

とりあえずunicode一覧
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
【CakePHP】findメソッド

#findのオプション

```php
find('all',array(
    'fields' => array('Model.field1','Model.field2'), //取得するカラム。配列指定。
    'conditions' => array('Model.field' => $thisValue), //検索条件。カラムと値を連想配列で指定。
    'order' => array('Model.created', 'Model.field3 DESC'), //並び順。文字列または配列で指定。
    'group' => array('Model.field'), //group byするカラム。
    'limit' => 2, //limit句。数値で渡す。
    'recursive'=>-1//
))

```

###recursiveについて
-1 ： JOINしない。自分だけとってくる。
0 ： 自分と自分がbelongsToしているモデルだけとってくる。
1 ： 自分とbelongsToとHasManyをとってくる。
2 ： 自分とbelongsToとHasManyと、BelongsToとHasMany先が関連しているモデルを一階層分とってくる。

デフォルトは1

#joinする場合

```php
$this->Hoge->find('all', [
  'joins'=>[
    [
      'type' => 'inner',
      'table' => 'fuga_table',
      'alias' => 'Fuga',
      'conditions' => [
        'Fuga.id = Hoge.id',
      ],
    ],
    [
      // 複数のテーブルを joinできる
    ],
  ]
]);
```

# 該当レコードが存在しない場合のチェック方法
array()が返るので、取得チェックはemptyで行う。

```php:レコードが取得できたかのチェック
$hoge = $this->find('all');
if(empty($hoge)){
  //取得できなかった場合の処理
}
```

#find('list')
key,value形式で値を取得できるため、セレクトボックスを作るときに便利。

デフォルトでは、idカラムがkeyで、nameカラムがvalueになる。

```php:基本形
$res = $this->find('list',array(
  'conditions'=>array('hoge'=>'huga')
));

var_dump(res);
/*
idカラムがキー、nameカラムがvalueで取得できる。
array(
  1=>'aa',
  2=>'bb',
  3=>'cc'
)
*/
```

keyはidで、valueをデフォルトのnameやtitle以外のカラムを使いたい場合は、displayFieldプロパティを使用する。

```php
$this->displayField = 'valueに使用するカラム名';
$res = $this->find('list');

var_dump($res);
/*
array(
  1=>'aa',
  2=>'bb',
  3=>'cc'
)
*/
```

keyとvalueに対応するカラムを設定したい場合は、fieldsに設定する。

```php
$res = $this->find('list',array(
  'fields' => array(keyにあたるカラム,valueにあたるカラム),
  'conditions'=>array('hoge'=>'huga')
));

var_dump($res);
/*
array(
  'A'=>'aa',
  'B'=>'bb',
  'C'=>'cc'
)
*/
```

#find('count')

```php:find('count')
$cnt = $this->find('count',array(
  'conditions'=>array('hoge'=>'huga')
));

var_dump($cnt);
//=>671  件数がそのまま返る。

```

#最大値の取得

```php
$max = $this->find('first',array(
  'fields'=>array('max(age) as age_max'),
  'conditions'=>array('hoge'=>'huga')
));

var_dump($max);
/*
array(
  0=>array(
    'age_max'=>'20'
  )
)
*/
```

バーチャルフィールドを使った方が楽。
[【CakePHP】バーチャルフィールド](http://qiita.com/kazu56/items/82e049118a70a735fdc7)

#複数のorをandでつなげる場合

####正しい例
配列でくくると良い。

```php:正しい例
$conditions = [
  [ 'or' => ['name'=>'hoge', 'age'=>'20']],
  [ 'or' => ['name'=>'foo', 'age'=>'30']],
];
```

####誤った例
これだとorが上書きされてしまう。

```php:誤った例
$conditions = [
  'or' => ['name'=>'hoge', 'age'=>'20'],
  'or' => ['name'=>'foo', 'age'=>'30'],
];
```

参考：[find で複数の or を and でつなげる連想配列](http://qiita.com/SeiRei/items/79d9d28f17ad8c65e26e)


#同一カラムに条件をつける場合

####正しい例
配列でくくると良い。

```php:正しい例
$conditions = [
  [ 'name'=>'hoge'],
  [ 'name'=>'foo'],
];
```

####誤った例
これだと上書きされてしまう。

```php:誤った例
$conditions = [
  'name'=>'hoge',
  'name'=>'foo',
];
```

参考：[findで複数のORを使う場合はarrayで囲む](http://monmon.hateblo.jp/entry/20110207/1297068346)
sshについての諸々

これまでとりあえずコピペで済ましてきたところもあるので勉強と復習も兼ねて
# ProxyCommandによる多段ssh

```bash:.ssh/config
Host 接続先名
	HostName 接続先IP
	ProxyCommand ssh -W %h:%p 踏み台
```

* 接続ユーザを指定したい場合には -l オプション。-l オプションで指定した場合と接続先の前に@でくっつけた場合の違いってなんなんだろう。
* HostNameを省略するとHostが使われる

## 参考
http://d.hatena.ne.jp/dayflower/20080204/1202457379

# リモートでのコマンド実行
## リダイレクトはローカルになる

```bash
ssh 接続先 cat < ローカルファイル
ssh 接続先 cat リモートファイル < ローカルファイル
```

## リモートにリダイレクトしたい場合

```bash
ssh 接続先 'cat < リモートファイル'
ssh 接続先 'cat リモートファイル > リモートファイル'
ssh 接続先 cat リモートファイル\> リモートファイル
```

## 実行したいコマンドをクォートした場合の挙動

```bash
# インタラクティブシェル(bash -c $command)として実行される
ssh 接続先 'cat < リモートファイル'

# ログインシェル(-bash $command)として実行される
ssh 接続先 cat リモートファイル\> リモートファイル
```

-bash と bash -c の違いに関しては下記参照
[bashのログインシェルとインタラクティブシェル](http://kanonji.info/blog/2013/06/20/bash%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B7%E3%82%A7%E3%83%AB/)

## 参考
[sshでリモートコマンドを実行する時の書き方と注意点](http://kanonji.info/blog/2013/06/07/ssh%E3%81%A7%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%99%82%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%A8%E6%B3%A8/)
backboneのmodel.destroyではまったのでメモ

backboneのmodelでdestroyを使ったらはまったのでメモ。

modelに対してdestroyを使うと対象のModelがCollectionに保存されている場合は、Collectionからは削除されます。

なんと。。。

つまり

```coffeescript
collection.add(model)

concole.log collection.length  # 1
model.destroy =>
   success: =>
      hogehoge
   error: =>
      hugahuga
   complete: =>
      hogefuga

concole.log collection.length  # 0
```
と勝手にcollectionから削除されてました。

特定の場合だけcollectionから削除したいときはお気をつけ下さい。
【Rails】guard-livereloadでエラー


KobitoをブログのエディタにするにあたってQiitaに投稿を始めてみます。不足あればコメントください。

デザインの微調整やらをテストと併せてやっていこうとした矢先。livereloadが機能しない。

```
Could not connect to LiveReload server. Please make sure that LiveReload 2.3 (or later) or another compatible server is running.
```

このようなトラブルはGemfileのバージョンを全く固定していないので、仕方がないのですが（Livereloadなしではデザイン微調整なんてやってられません。

GuardfileなどはREADMEの通りにやっているし、何せ前回まで動いてた時と特に何も変えていない。したとすればbundle update。

# 結論

`guard-livereload`のバージョンを1.4.0から2.1.1に指定してあげると解消しました。


## 環境

- OSX Marvericks
- Ruby 2.1.0
- Rails 4.0.3
- Guard 2.4.0
- Chrome Extentionで利用

## どのようにして原因に辿り着いたか

今回の現象はguardコマンドは問題なく動いているように見えることが厄介でした。

```
13:50:23 - INFO - Guard is using Growl to send notifications.
13:50:23 - INFO - Guard is using TerminalTitle to send notifications.
13:50:23 - INFO - LiveReload is waiting for a browser to connect.
13:50:23 - INFO - Guard::RSpec is running
13:50:23 - INFO - Guard is now watching at '/private/var/www/html/app'

```

そこで、guardのオプションで`-d`を実行してみたところ。

```
14:42:47 - INFO - Browser disconnected.
/private/var/www/html/app/vendor/bundle/ruby/2.1.0/gems/guard-livereload-1.3.0/lib/guard/livereload/websocket.rb:13:in `dispatch': undefined method `request_path' for #<HTTP::Parser:0x007fa33aeb4508> (NoMethodError)
	from /private/var/www/html/orda/vendor/bundle/ruby/2.1.0/gems/em-websocket-0.3.8/lib/em-websocket/connection.rb:73:in `receive_data'
```

エラーっぽいのが出てました。
そこで検索してみると以下のページに辿り着きました。

- [Mac OSX 10.9, browser not connecting, `dispatch': undefined method `request_path' for #<HTTP::Parser:0x0000010285b4e0> (NoMethodError)](https://github.com/guard/guard-livereload/issues/100)


まさにこれです。そこでGemfileを以下のように修正した。

```
group :development do
  #gem 'guard'
  gem 'guard-rspec'
  gem 'guard-livereload', '~> 2.1.1', require: false
end
```

`guard-rspec`があればguardは指定しなくてもいいようです。
けれど環境によっては依存性？のエラーが出ると思います。

```
Bundler could not find compatible versions for gem "http_parser.rb":
  In Gemfile:
    guard-livereload (~> 2.1.1) ruby depends on
      http_parser.rb (~> 0.5.3) ruby

    twitter (>= 0) ruby depends on
      http_parser.rb (0.6.0)
```

そのような場合、私のようにバージョンを指定していなくて本番運用していなければGemfile.lockを一度削除すれば解決します。

以上です。
【raspberry pi】nginxにdokuwikiを導入

## 参考

* [install:nginx [DokuWiki]](https://www.dokuwiki.org/install:nginx)
* [php-fpm は、php-cgi で代用できる | レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/php-fpm-php-cgi.html)

## 環境

* 256MB版 Raspberry Pi (raspbian)
* nginxは[【raspberry-pi】nginx + passenger + node.js 環境作成メモ (1)](http://qiita.com/daisuke0604/items/3918b8b4ff227fb3d048)で導入したもの

## php5-cgiパッケージをインストール

```shell-session
$ sudo aptitude install -y php5-cgi
$ /usr/bin/php-cgi -v
PHP 5.4.4-14+deb7u7 (cgi-fcgi) (built: Dec 13 2013 02:09:22)
```

## 起動スクリプト

* 冒頭の参考サイトのものを多少編集して使用する。
  * 結果 → [php-fastcgi 起動スクリプト for raspbian](https://gist.github.com/daisuke0604/9129406)


* 自動起動

```shell-session
$ sudo update-rc.d php-fastcgi default
$ sudo sysv-rc-conf --list | grep php
php-fastcgi  0:off      1:off   2:on    3:on    4:on    5:on    6:off
```

## nginx設定

```nginx:/opt/nginx/conf/nginx.conf
server {

    # 省略...

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $uri;
    }

    location ~ ^/dokuwiki/(data|conf|bin|inc)/ {
        deny all;
    }

    location ~ ^/dikuwiki/lib/^((?!php).)*$ {
        root html/dokuwiki/lib;
        expires 30d;
    }
}
```
videoAtPathIsCompatibleWithSavedPhotosAlbum:NOなmp4のカメラロール保存

AVAssetExportSessionでcompatible:NOのmp4をcompatible:YESなmp4にexportする

```objc
- (void) saveMovie{
	NSString* tempPath=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
    NSURL *url = [NSURL fileURLWithPath:tempPath];

	AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: [AVURLAsset URLAssetWithURL:url options:nil] presetName:AVAssetExportPresetMediumQuality];
    exporter.outputURL=[NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"test.mp4"]];
    exporter.outputFileType = AVFileTypeMPEG4;
   
    [exporter exportAsynchronouslyWithCompletionHandler:^
     {
         dispatch_async(dispatch_get_main_queue(), ^{
             [self exportDidFinish:exporter];
         });
     }];
}

- (void)exportDidFinish:(AVAssetExportSession*)session
{
    NSURL *outputURL = session.outputURL;
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
       
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL]) {
        [library writeVideoAtPathToSavedPhotosAlbum:outputURL
                                    completionBlock:^(NSURL *assetURL, NSError *error){
                                        dispatch_async(dispatch_get_main_queue(), ^{
                                            if (error) {
                                                NSLog(@"Error: %@", error);
                                            }else{
                                                NSLog(@"success!");
                                            }
                                           
                                        });
                                       
                                    }];
    }else{
        NSLog(@"no compatible");
    }
}
```
TestLink Cloud Hosting - Bitnamiを使ってみた

# はじめに
* こんな方におすすめです
 * TestLinkってなんぞや？！な方
 * 導入しようかなと検討中の方
 * 最新のTestLinkを触ってみたい方
 * 5分ほどでさくっと実感したい方

# セットアップ手順
* 以下にアクセス
 * http://bitnami.com/stack/testlink/cloud
* 「Launch Free Server Now」をポチっと
* 認証を求められるので以下のいずれかのアカウントで認証してください
 * Google
 * Yahoo
 * FACEBOOK
 * github
* Terms of Serviceの画面で規約を確認の上、問題がなければ「check agree」をポチっと
* Launching TestLink in the Cloudの画面でステータスバーが走り始める
 * Your Server is Readと表示されれば完了
* 完了後、すぐに先ほど認証したアカウントのメールアドレス宛にメールが届く
 * メールにセットアップされたTestLinkのURL(EC2のURL)が載っているのでアクセスする
* Congratulations!と表示されていれば完了
* あとはTestLinkのページでメールに記載されていたログインユーザ/パスワードを入力すれば使える

----

以上、カップ麺に湯を入れてのびないうちにできちゃいます^q^

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
XCode5でエディタ画面しかされなくなってしまった際の対処法

##XCodeがエディタ画面だけになって困る
[XCode4でエディタ画面しか表示されなくなってしまった際の対処方法](http://iphonework.biz/2012/02/19/xcode4%E3%81%A7%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E7%94%BB%E9%9D%A2%E3%81%97%E3%81%8B%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84/)
これを見てふとね。

XCode5でもわりとエディタ画面しか表示されなくなるケースが発生するんですが、とはいえworkspaceを削除するのはworkspaceを使ってる身としては怖い。怖いというか絶対困る。なのでなんとかそれ以外の方法で復活させる方法を模索しました。

##答え：メニューのViewから復活させまくる
わかってしまえば簡単で、メニューバーから
View->Show Toolbar
View->Navigator->Show xxxx
View->Utilities->Show xxxx
あたりを選べば見慣れた上と左右が戻ってくる!

![before](https://qiita-image-store.s3.amazonaws.com/0/2245/cd0ba278-6b5c-827a-d47a-d858593e21b9.png)

![after](https://qiita-image-store.s3.amazonaws.com/0/2245/3b9ccc8d-e263-665b-4196-61462df818cd.png)

あるいはToolbarさえ出てくれば右上のボタン（青く光るアレ）を押すだけで出てくるようになる。
これでもXCodeの再起動すら要らない。心置きなく開発できる。
ちょっと変わったGoの日付フォーマット

多数の言語で日付をフォーマットするとき、`yyyy-MM-dd`ようなパラメータを指定していますが、Goの場合はちょっと違った。

例えばRubyでは

```rb
Time.now.strftime('%Y-%m-%d %H:%M:%S')
```

Goではこのようになります：

```go
  now = time.Now()
  fmt.Println(now.Format("2006-01-02 15:04:05.000000000"))
```

上記に2006のような具体的な数字は決まりで、ルールがあります：

>年　：06,2006
月　：1,01,Jan,January
日　：2,02,_2
時間：3,03,15
分　：4,04
秒　：5,05
週　：Mon,Monday
TimeZone：-07,-0700,Z0700,Z07:00,-07:00,MST

例えば今日(2014/02/21)でを下記のように計算すると：

```go
  // output: Fri (short)
  fmt.Println(now.Format("Mon"))

  // output: Friday (full)
  fmt.Println(now.Format("Monday"))

  // output: 14 (short)
  fmt.Println(now.Format("06"))

  // output: 2014 (full)
  fmt.Println(now.Format("2006"))

  // output: 2 (short)
  fmt.Println(now.Format("1"))

  // output: 02 (full)
  fmt.Println(now.Format("01"))
```

参考：
http://golang.org/pkg/time/#Parse
requirejs-i18n を使ったWebアプリの多言語対応

[RequireJS][] を使っている人は、[requirejs-i18n][] プラグインを使うと簡単に多言語対応できます。

詳細は下記ページに書いてある通りです。

http://requirejs.org/docs/api.html#i18n


# インストール

`i18n.js`をインストールします。

```bash
bower install requirejs-i18n
```

もちろん手動でもいいです。
[i18n.js][]


# 注意事項

[data-main属性][]で指定したconfigスクリプトのパスに `nls`ディレクトリを作成してください。
それ以外のパスでは正しく動作しません。

```bash
YOUR_CONFIG_PATH/nls/**/*.js
```

また、同種のリソースファイルのファイル名を同じにします。以下の説明では、`wording.js`としています。


# メモ

## 何の情報をもとに言語判定しているのか

`navigator.language` または `navigator.userLanguage`




## 基本形

### ルートとなる文字列リソース

言語コードに対応するリソースが存在しない場合、ルートのリソースが表示されます。

```js
// YOUR_CONFIG_PATH/nls/wording.js
define({
  "root": {
    "trend": "Trends",
    "loading": "Loading...",
    "search": "Search"
  }
});
```

"en"（英語）をルートのlocaleとするのが良いでしょう。


### リソースの読み込み方

```js
// YOUR_CONFIG_PATH/test.js
define(["i18n!nls/wording.js"], function (aWording) {
  console.log("The name for trend in this locale is: " + aWording.trend);
  // The name for trend in this locale is: Trends
});
```

## localeを追加

例）pt-br を追加する場合

```js
// YOUR_CONFIG_PATH/nls/wording.js
define({
  "root": {
    // 省略...
  },
  "pt-br": true    // ポルトガル語（ブラジル）
                   // 以降、同じように列挙.
}
```

ポルトガル（ブラジル）語のリソースを追加します。

```js
// YOUR_CONFIG_PATH/nls/pt-br/wording.js
define({
  "trend": "Trends",
  "loading": "Carregando...",
  "search": "Pesquisar"
});
```

localeを追加する毎にディレクトリを作成します。
例では `nls/pt-br/wording.js` となるようにファイルを配置します。


## 特定の言語を固定表示

```js
require.config({
  config: {
    i18n: {
      locale: 'ja'    // 日本語の文字列リソースのみを表示
    }
  }
});
```

## リソース読み込みの優先順位

以下のようにポルトガル語のリソースが存在する場合を想定したときに、pt-br の
wording.jsが存在しない場合は pt のwording.jsがロードされます。

```
YOUR_CONFIG_PATH/nls/pt-br/wording.js
YOUR_CONFIG_PATH/nls/pt/wording.js
YOUR_CONFIG_PATH/nls/wording.js
```

## rootリソースをバンドル化

localeと同じようにディレクトリを作成することもできます。

```js
// YOUR_CONFIG_PATH/nls/wording.js
define({
  "root": true,
  "pt-br": true,
  "pt": true,
  "ja": true,
  "es": false
});
```

```js
// YOUR_CONFIG_PATH/nls/root/wording.js
define({
  "trend": "Trends",
  "loading": "Loading...",
  "search": "Search"
});
```


[RequireJS]: http://requirejs.org/
[requirejs-i18n]: http://requirejs.org/docs/api.html#i18n
[data-main属性]: http://requirejs.org/docs/api.html#data-main
[i18n.js]: https://raw.github.com/requirejs/i18n/latest/i18n.js
JSのObjectをforEachで処理する方法

どうにかforEachで出来ないのかなと思って調べる。

```js
// こういうオブジェクトがあったとしてね
var obj = { tanuki:'pon-poko', kitsune:'kon-kon', neko:'nyan-nyan' };

// forEachで回したいなと

// しかしこれはエラーです
obj.forEach(function (v,i) {
  // 処理...
});

// こうすればOK
Object.keys(obj).forEach(function (key) {
  console.log(key + "は" + obj[key] + "と鳴いた！");
});
```

Object.keysであればプロトタイプチェーンは対象外なので、そのオブジェクトだけが保持しているものだけでループを回せる。
日本人のプログラミング配信を視聴する環境まとめ

皆さんライブコーディング見ていますか？僕は **毎日** 見ています。

ネットワークが発達して個人でも容易に動画配信が出来るようになった昨今、コーディング風景をキャプチャしてライブストリーミングで配信する人が増えつつあります。
こういった配信は *プログラミング配信*  、 *プログラミング生放送* などと呼ばれています。

国内の主要なライブストリーミング環境で、プログラミング配信の視聴環境の違いを確認してみました。

USTREAM
----
### メリット
- 過去の配信を視聴できる
- **勉強会で用いられることが多い**

### デメリット
- 日常的に配信している人はほぼいない

ニコニコ生放送
----
### メリット
- 比較的配信は多め
- プログラミング生放送というコミュニティがある

### デメリット
- **基本的に一つの配信を30分以上続けることが出来ない**
- ユーザー登録が必須かつ課金しない場合は視聴中に追い出される事がある

PeerCast
----
### メリット
- **インディーズゲームの作者などが日常的に配信している**
- 視聴ウィンドウがシンプルで、デスクトップ上に自由に配置できる

### デメリット
- 初期設定が煩雑

CaveTube
----
### メリット
- ブラウザアプリでありながらP2P式なので高画質

### デメリット
- 比較的配信が少なめ
- 個人運営なので将来性が不透明

----

ニコニコ生放送はフリーミアムモデルならではの欠点が目立ちます。（登録済みの方も多いと思いますが）ユーザー登録が必須な上、30分ごとに必要ないわゆる枠移動は長時間になりがちなライブコーディングのテンポを乱してしまうので、良い環境とは言い難いですね。

Ustreamは無料で手軽に環境が整うからか、勉強会で使われるケースはよく目にしますが、プログラミング配信はほとんど見かけませんね。（見かけた方は教えてください）

次点で配信数が多いと思われるPeerCastは、初期設定さえ乗り越えてしまえばかなり快適な視聴環境と言えるでしょう。視聴ウィンドウはサブディスプレイに最大化してみてもいいし、複数配信を同時に見ることも出来るのが良いです。解像度を高くできるのもプログラミング向きと言えるでしょう。

表にしてみるとこんな感じですね。

|サイト|配信数|初期導入コスト|視聴の快適さ|
|--:|:--:|:--:|:--:|
|USTREAM     |×|○|○|
|ニコニコ生放送|○|△|×|
|PeerCast    |○|×|◎|
|CaveTube    |△|○|○|

----

PeerCastは最近だと本格的なシューティングゲームを作る同人サークルの方が頻繁に配信されています。PeerCastは要チェックですね。

PeerCastの視聴方法についてはこちらにまとめました。
[**日本人のプログラミング配信を視聴する PeerCast編 - Qiita**](http://qiita.com/progre/items/61f1e63e3f2619a8a16c "日本人のプログラミング配信を視聴する PeerCast編 - Qiita")
Xcodeのコード補完が超絶便利になるプラグイン


#FuzzyAutocompletePlugin

Xcodeのコード補完機能がファジー(曖昧)になり、かなり使いやすいです。

GitHub:https://github.com/chendo/FuzzyAutocompletePlugin
![FuzzyAutocompletePlugin](https://raw.github.com/chendo/FuzzyAutocompletePlugin/master/demo.gif)

導入方法
初めてプラグイン導入手順はこちらを参照してください。
[初めてのXcodeプラグイン導入手順](http://qiita.com/SparklerApps/items/f15bea3dfb245f69750f "初めてのXcodeプラグイン導入手順")

```FuzzyAutocompletePlugin
$ git clone https://github.com/chendo/FuzzyAutocompletePlugin.git
$ cd FuzzyAutocompletePlugin
$ xcodebuild -project FuzzyAutocomplete.xcodeproj build
```

これだけです。
あとはXcodeを再起動すれば、導入完了です。

実際に使ってみると、こんな感じです。
__self.view as__と入力すると __addSubview:(UIView*)__ が補完されます。
![](http://farm8.staticflickr.com/7364/12742833833_d6c8b118a1_z.jpg)

うろ覚えのデリゲートメソッドとか書くときに便利ですね！
お使いのフレームワークのお供に Illuminate

普段使われているフレームワーク等に、簡単にlaravel4のコンポーネントを組込む事が出来ます。
なかでもおすすめなのはDIコンテナとしても軽量、かつ簡単なilluminate/containerと、
illuminate/databaseです。

今回はdatabaseを実際に使ってみます。
導入方法はいつものcomposer

```json
"require": {
    "illuminate/database": "v4.1.*"
}
```
もれなくcontainerも依存パッケージで入りますので、
是非一緒に使ってみましょう
お使いの環境に合わせてください

```php
require __DIR__ . "/vendor/autoload.php";
use Illuminate\Database\Capsule\Manager as DatabaseManager;

class Database {

    protected $db;
    //
    public function __construct()
    {
        $this->db = new DatabaseManager;
    }

    public function connect()
    {
        $this->db->addConnection([
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database',
            'username'  => 'root',
            'password'  => 'password',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ]);
	    $this->db->setAsGlobal();
	    return $this->db->connection();
    }
}
```
Eloquentを使いたい場合は、
$this->db->bootEloquent();
を追記するとそのまま使える様になります。
複数接続する場合はconfigなどで指定して、connection()で変更できます。

ベーシックなsql

```php
$this->connect()->select('select * from users where id = ?', array(1));
```

query builder

```php
$this->connect()->table('users')->where('id', $id)->get();
```

などなど、簡単に導入して使う事が出来ますので
導入してみてはいかがでしょうか？
cacheが必要であればcacheも入れると使える様になります

さらにcontainerも一緒になっていますので、
containerも組込むことで簡単に入れ替えが可能となります。

```php
class Database {

    protected $db;
    //
    public function __construct(DatabaseManager $db)
    {
        $this->db = $db;
    }
/ etc...
```

個人的には大掛かりなORMを導入するよりもこれで良いのではと思いますが、
好みで色々選択してみてください。
カプセル化＋アクセサメソッド＋メソッドチェーン

[使い方](http://anderson.hatenablog.jp/entry/2014/02/21/JavaScript%E3%81%A7%E3%80%81%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96%E3%81%97%E3%81%A4%E3%81%A4%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5)

```js:Prop.js
var Prop = function (initialValue) {
	var self = this;
	self.prop = (initialValue)?(initialValue):(null);
	return function (param) {
		if (param) {
			self.prop = param;
			return this;
		} else {
			return self.prop;
		}
	};
};
```
mysql で sequence

# テーブル
```mysql
create table sequence ( id varchar(20) primary key, seq int);
```

# 関数
```mysql
delimiter ;;

-- 次のシーケンス
create function next_val (aid varchar(20)) returns integer
begin
    insert into sequence values (aid, 1) on duplicate key update seq=seq+1;
	return (select seq from sequence where id = aid);
end;;

-- シーケンス設定
create function set_val (aid varchar(20), aseq int) returns integer
begin
    insert into sequence values (aid, aseq) on duplicate key update seq=aseq;
	return (select seq from sequence where id = aid);
end;;

-- 現在のシーケンス
create function current_val (aid varchar(20)) returns integer
begin
	return (select seq from sequence where id = aid union all select 0 limit 1);
end;;

delimiter ;
```

# 実行確認
```mysql
select next_val('test');
select next_val('test1');
select next_val('test');
select next_val('test1');
select next_val('test');
select next_val('test2');
select set_val('test2', 5);
select set_val('test3', 3);

select * from sequence;
```

# 実行確認結果

|id|seq|
|:--|--:|
|test|3|
|test1|2|
|test2|5|
|test3|3|

# 番外/削除
```mysql
drop table if exists sequence;
drop function if exists next_val;
drop function if exists current_val ;
drop function if exists set_val ;
```
Norikra を upstart でデーモン化する

Norikra はコマンド自体がデーモン起動オプションを持っているが、標準の仕組みに載せたいの upstart 化してみた。これが正しいかは分からないが、とりあえず動いてはいる。みんな、どうやっているんだろうか？

## 事前準備
- `norikra` ユーザの作成
- [xbuild](https://github.com/tagomoris/xbuild) で `/usr/local/bin/jruby-1.7.10` に jruby-1.7.10 を インストール
- ログディレクトリを `/var/log/norikra` に作成し、所有者を `norikra:norikra` にしておく

## upstart スクリプト

```
description "norikra"

start on runlevel [2345]
stop on runlevel [016]

setuid norikra
setgid norikra

env PORT=26571
env LOGDIR=/var/log/norikra
env STATS=/var/log/norikra/norikra.stats.json
env SIZE=small
env JAVA_OPTS="-Xms1g -Xmx1g"

script
  export PATH=/usr/local/bin/jruby-1.7.10/bin:$PATH
  norikra start $JAVA_OPTS --port=$PORT --logdir=$LOGDIR --stats=$STATS --$SIZE
end script

respawn
```
Android Studioでgradleが実行されるときの $PWD はどこか

```groovy
println System.getProperty("user.dir")
```

結果:

```
/Applications/Android Studio.app/bin
```

なのでプロジェクトのディレクトリにいるつもりで git command などを呼びたいならcdしてからじゃないと使えません。
urlについて

htmlヘルパーのlink生成するときちょっとややこしいことになった。

これが出力したいやつ

```html
アプリケーション/コントローラ/アクション/from:〇〇/id
```

〇〇は文字列で自分で生成してます。
idは数字で数は不定
複数だとこんな風になります。

```html
アプリケーション/コントローラ/アクション/from:〇〇/1/2/3
```

これをHtml->linkで頑張って生成してみました。

無難にget風に書いていけるかなって思ったけど「/」のエスケープ文字でこけました。

```php
$this->Html->link('リンク文字', array(
'controller' => 'コントローラ',
'action' => 'アクション'. 'from:〇〇/'. id
));
```

サーバの設定を変えることでこの問題も解決できるようですがコーダとしてそれは負けだと思ったのでもう少し頑張りました。
解決方法は以下のサイトに掲載されていました。(CakePHP 2.0で解消されたURLの特殊文字問題)
http://tkyk.name/blog/2012/02/22/cakephp20-special-characters-in-url/
※自分は試していないのでご了承ください

どうにか自分で「/」を書かないようにしてみた結果、次のようになりました。

```php
$this->Html->link('リンク文字', array(
'controller' => 'コントローラ',
'action' => 'アクション',
'from' => '〇〇',
id
));
```

しかし結果エラーにはならなかったのですが以下の様なURLになってしまいました。

```html
アプリケーション/コントローラ/アクション/id/from:〇〇
```

これでも自分の場合は問題なかったのでこれで終わりとしました。
しかし、なんか気持ち悪いな・・・
rails開発に加わる前に学んで欲しいこと

## github
* gitのスライドがまとまってる http://www.find-job.net/startup/7-git-slides
* webベースでgitを勉強 http://try.github.io/
* githubフローの説明 https://gist.github.com/Gab-km/3705015


### ゴール
* add, commit, push, branch, checkoutを覚える
* 自分でトピックブランチを作ってpush、その後githubでpull requestを作成することができる
* githubフローを理解する

## rails
* railsのチュートリアル http://railstutorial.jp/
* MVCの挙動(特にしっかり理解) http://railstutorial.jp/chapters/a-demo-app#sec-mvc_in_action
* GitHubに自分のアプリをPushする http://railsgirls.jp/github/ 
* Heroku に Rails アプリをアップ http://railsgirls.jp/heroku/ 

### ゴール
* routes、model、controllerを自分で作れる
* githubに自分のコードを公開する
* herokuに自分のコードをアップする
* railsのチュートリアルを自分で全部やる

## さらに
* 新人エンジニアに読んで欲しい英語ドキュメントまとめ (Ruby/Rails編)(次はここ)  http://engineer.wantedly.com/2013/12/26/getting-started.html 
* rails cast(半年くらい契約してた) http://railscasts.com/
* pro git(一通りgitが分かったら読むべき) http://git-scm.com/book/ja/

## その他ブックマーク
* rubyのmethodを探したいとき http://ruby-doc.org/core-2.1.1/
* railsのメソッドを探したいとき http://api.rubyonrails.org/
* gemを探したいとき(カテゴリを見るとどういう種類があるのかも勉強になる) https://www.ruby-toolbox.com/
* dash(ローカルでrailsやrubyを検索) https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12

## インターン生・未経験者向け投稿
以下も同じように、これからスキルを身につけたい人向けに開発インターンで役立つことを書いています。

* 開発インターンで気をつける5つのポイント http://qiita.com/reikubonaga/items/d00c179957d57f48bf73
* 初めてコードレビューされる人のためのpull requestとcommitの作り方 http://qiita.com/reikubonaga/items/e3b3b19c14d4ef4efb95
* 技術面接を受ける前に確認しておくといいこと https://www.wantedly.com/companies/wantedly/post_articles/42207
* Webサービスのための7つのデータ分析基本パターン
 https://www.wantedly.com/companies/wantedly/post_articles/62759
【個人メモ】デプロイするためにdeployを使ってみる

[TJさん](https://github.com/visionmedia)がリリースしてるプロダクトで、
deployというツールが有る。

https://github.com/visionmedia/deploy

[capistrano](https://github.com/capistrano/capistrano)の代わりに使えたりするのかなあと
思って軽く調査してみる。

# 利用するためには

git cloneしてmake installすれば良い

```shell-session
> git clone git@github.com:visionmedia/deploy.git
> cd deploy
> make install
```

これで終わり。deployコマンドが使えるようになる。

# 試しに利用してみる

試すためにファイルを作って環境を作ってみた。

https://github.com/Substanz/sample-of-deploy

実行には```vagrant``` と ```packer``` と ```VirtualBox``` が必要。

```vagrant up --provision``` を行うと以下の処理(コマンド実行)を行う

https://github.com/Substanz/sample-of-deploy/blob/master/Vagrantfile

1. packerにてvagrant boxを作成(未作成時)
2. デプロイユーザーを作成
3. ncのインストール
4. iptablesの停止

使いたい場合は、ここの部分を適宜自分のものに置き換えて欲しい :)

https://github.com/Substanz/sample-of-deploy/blob/master/Vagrantfile#L34

# デプロイのための設定ファイルを書く。

設定ファイルについては、ディレクトリ直下に```deploy.conf``` を用意する。

```shell-session:deploy.conf
[vagrant]
user anoonna
host vagrant.192.168.33.50.xip.io
repo https://github.com/futoase/simple-web.git
path /var/app
ref origin/master
post-deploy nohup ./startup.sh > app.log &
forward-agent yes
```

設定内容の意味はこんな感じ。

1. vagrant 環境が対象である
2. anoonna ユーザーでデプロイ
3. デプロイ元のリポジトリはhttps://github.com/futoase/simple-web.git
4. デプロイ先は ```/var/app```
5. 対象のリモートブランチは ```origin/master```
6. デプロイ後に実行するコマンドを指定(nohup...)

[xip.io](http://xip.io/)というサブドメインにIPアドレスを指定すると
IPアドレスを返すという便利なDNSサービスがあるのでhost名に利用してみた。

# deploy先のディレクトリ作成

deploy先のディレクトリを作成し、
deployを行える準備を整えるためにコマンドを実行する

```
> deploy vagrant setup
```

deploy [対象] [option]

という形でコマンドを実行する。

![スクリーンショット 2014-02-21 1.53.47.png](https://qiita-image-store.s3.amazonaws.com/0/3985/f6b1cc49-1830-c40e-1d13-b9d3c1842bf9.png)

実行後、```/var/app``` 以下にsource, sharedディレクトリが作成される。



![スクリーンショット 2014-02-21 10.13.06.png](https://qiita-image-store.s3.amazonaws.com/0/3985/434a30bc-32a9-8f02-9c5e-4452aac71914.png)

# deploy実行

```deploy vagrant setup``` を実行した後、
```deploy vagrant``` を実行する。

![スクリーンショット 2014-02-21 10.08.29.png](https://qiita-image-store.s3.amazonaws.com/0/3985/1a00d270-c2c4-7163-a810-0a5abd8612f6.png)

# 動作確認

ブラウザからVagrantで立ちあげたゲストマシンに接続し確認する

```
> open http://vagrant.192.168.33.50.xip.io:8080/
```

![スクリーンショット 2014-02-21 10.44.17.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b0bdf344-66dd-f234-b354-c2738f978a94.png)

無事デプロイできた。

# その他

deploy.confを管理しているディレクトリで
未コミットの状態では以下の警告がでる。

![スクリーンショット 2014-02-21 2.25.50.png](https://qiita-image-store.s3.amazonaws.com/0/3985/ec5d3f31-50d6-8620-07dd-1fc1366a382f.png)

リモートリポジトリからのデプロイが行えるけど、
tar ballとしてパッケージ化してマシンに転送とかできないもんかな。

簡素なので使っていきたい...
Safari 7.0.1でのバグ?


こんな簡単な SQLをSafari 7.0.1上で phpMyAdminをレンタルサーバーで走らせると
mport.php: パラメータがありません： import_typeドキュメント
import.php: パラメータがありません： formatドキュメント

などというエラーが出ます
同じサーバーに対して、OSX上のChrome, Firefox, Windows7上の IEで走らせても当然のことながらエラーが出ません

```SQL
SELECT COUNT( * ) 
FROM  `dr_tbls` 
WHERE  `is_answered` =  '1'
AND  `is_continue` =  '0';
```

これまでも SafariでphpMyAdminを使っていて「あれ?」と思うことはあったのですが、見過ごしてきました
Unity C# で GUIパーツのα値を設定する方法

Unity C# で GUIパーツのα値を以下のようにして設定しようとするとおこられます。
（Javascriptだと問題ないのですが・・・）

```csharp
GUI.color.a = 0.5f;
```

結果：コンパイルエラー

error CS1612: Cannot modify a value type return value of `UnityEngine.GUI.color'. Consider storing the value in a temporary variable

解決するには以下のように書きます。

```csharp
GUI.color = new Color(GUI.color.r, GUI.color.g, GUI.color.b, 0.5f);
```
Herokuデプロイ時にBASIC認証をかける方法


手元でサクッと作ってHerokuに上げたけど誰にでもアクセス可能になるのは困るけどdeviseを組み込むのはもう少し後の工程でやりたい...という時にBASIC認証をかける方法です

![スクリーンショット_2014_02_21_9_58-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/5a29bbd9-d06c-8ee9-21d4-cffa2c29e801.jpeg "スクリーンショット_2014_02_21_9_58-4.jpg")


##決め打ちBASIC認証

コントローラーに以下を記述します。

```app/application_controller.rb
http_basic_authenticate_with :name => 'admin', :password => 'hogehoge' if Rails.env == "production"
```

これだけです。コントローラーを限定したい場合は各々のコントローラーに記述します。

> :only => [:index, :show]
> :except => [:index]

のように追加すると認証範囲を限定する事もできます。

##Herokuで環境変数を使う方法

ソース上にはパスワードを残したく無い場合は、コントローラーには以下のように記述します。

```app/application_controller.rb
http_basic_authenticate_with :name => ENV['BASIC_AUTH_USERNAME'], :password => ENV['BASIC_AUTH_PASSWORD'] if Rails.env == "production"
```

Herokuで環境変数を設定すればOKです。

> heroku config:add BASIC_AUTH_USERNAME="admin" BASIC_AUTH_PASSWORD="hogehoge" --app APPNAME


## 参考：
http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html
Linux kernelメモリモデル関連ドキュメント

Why the "volatile" type class should not be used
https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt

LINUX KERNEL MEMORY BARRIERS
https://www.kernel.org/doc/Documentation/memory-barriers.txt

Memory barriers for TSO architectures
http://lwn.net/Articles/576486/

C11 atomic variables and the kernel
http://lwn.net/SubscriberLink/586838/77c5c01b6361c5b4/
Wicketでボタンを押したときにJavaScriptによる処理を挟む方法


例えば```AjaxButton```に対して、ユーザがボタンを押したときに```confirm```で確認ダイアログを出したときだけサブミットを実行したい、というときは、次のようにすれば実現出来ます。
ポイントは```updateAjaxAttributes```メソッドのオーバーライドです。

```java:SomePage.java
final IndicatingAjaxButton button = new IndicatingAjaxButton("deleter") {

    @Override
    protected void updateAjaxAttributes(final AjaxRequestAttributes pAttributes) {
        super.updateAjaxAttributes(pAttributes);
        final AjaxCallListener ajaxCallListener = new AjaxCallListener();
        ajaxCallListener.onPrecondition("return confirm('この操作は取り消せません！本当に削除してよろしいですか？');");
        pAttributes.getAjaxCallListeners().add(ajaxCallListener);
    }

    @Override
    protected void onSubmit(final AjaxRequestTarget pTarget, final Form<?> pForm) {
        // サブミットしたときの処理
        ...
    }
};
```

確認ダイアログを出すくらいの単純な処理なら、上記のように直接JavaScriptの実行コードを書いてもいいですが、もっと複雑な処理を実行する必要がある場合、別途JavaScriptの関数を作っておいて、そちらを呼び出すJavaScriptコードを書けばよいでしょう。
たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ

* [たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ | コリス](http://coliss.com/articles/build-websites/operation/work/choose-a-license-by-github.html)

さんの記事がとても良かったので表形式にしました。

* [Google docs](https://docs.google.com/spreadsheets/d/1smp9rjunA2DeagL65gy2fqUC-7i-90gQZk2uJ81hE0M/edit#gid=0)にまとめられている方も居ます。


共通 (No License以外)
-------------
* 許可: 商用利用、修正、配布
* 禁止: 責任免除


ライセンスの種類
=============

| ライセンス | Required(必須) | Permitted(許可) | Forbidden(禁止) |
|----------|------|------|----|
| [Apache v2](http://www.apache.org/licenses/LICENSE-2.0.html) | 著作権の表示、変更箇所の明示 | 商用利用、修正、配布、サブライセンス、特許許可 | トレードマークの使用、責任免除 |
| [GPL v2](http://choosealicense.com/licenses/gpl-v2/) | 著作権の表示、変更箇所の明示、ソースの明示 | 商用利用、修正、配布、特許許可 | 責任免除、サブライセンス |
| [MIT](http://choosealicense.com/licenses/mit/) | 著作権の表示 | 商用利用、修正、配布、サブライセンス | 責任免除 |
| [Mozilla Public v 2.0](http://choosealicense.com/licenses/mozilla/) | ソースの明示、著作権の表示 | 商用利用、修正、配布、サブライセンス、特許許可 | 責任免除、トレードマークの使用 |
| [LGPL v2.1](http://choosealicense.com/licenses/lgpl-v2.1/) | 著作権の表示、ライブラリの使用、ソースの明示 | 商用利用、修正、配布、サブライセンス、特許許可 | 責任免除 |
| [The BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) | 著作権の表示 | 商用利用、修正、配布、サブライセンス | 責任免除、トレードマークの使用 |
| [Artistic 2.0](http://opensource.org/licenses/Artistic-2.0) | 著作権の表示、変更箇所の明示、ソースの明示 | 商用利用、修正、配布、サブライセンス、個人利用 | 責任免除、トレードマークの使用 |
| [GPL v3](http://choosealicense.com/licenses/gpl-v3/) | 著作権の表示、変更箇所の明示、ソースの明示 | 商用利用、修正、配布、特許許可 | 責任免除、サブライセンス |
| [LGPL v3](http://choosealicense.com/licenses/lgpl-v3/) | 著作権の表示、ライブラリの使用、ソースの明示 | 商用利用、修正、配布、サブライセンス、特許許可 | 責任免除 |
| [Affero GPL](http://choosealicense.com/licenses/agpl/) | 著作権の表示、変更箇所の明示、ソースの明示 | 商用利用、修正、配布 | 責任免除、サブライセンス | 
| [Public Domain](http://choosealicense.com/licenses/unlicense/) | - | 個人利用、商用利用、修正、配布、サブライセンス | 責任免除 |
| [No License](http://choosealicense.com/licenses/no-license/) | 著作権の表示 | 個人利用、商用利用 | 修正、配布、サブライセンス |
| [Eclipse Public v1.0](http://www.eclipse.org/legal/epl-v10.html) | ソースの明示、著作権の表示 | 商用利用、修正、配布、サブライセンス、特許許可 | 責任免除 |
| [BSD 2-Clause](http://opensource.org/licenses/BSD-2-Clause) | 著作権の表示 | 商用利用、修正、配布、サブライセンス | 責任免除 |


備考：各項目の補足説明
======================

Required（必須）
----------------

|項目|説明|
|----|----|
| Rename（リネーム）| 修正した場合は、ソフトウェアの名前を変えなくてはいけません。 |
| License and copyright notice（著作権の表示）| ライセンスと著作権のコピーをコードに含めなくてはいけません。 |
| Library Usage（ライブラリの使用） | ライブラリは非オープンソースのアプリケーションで使用されるかもしれません。 |
| State Changes（変更箇所の明示） | コード内の重要な変更箇所を明示してください。 |
| Disclose Source（ソースの明示） | ライブラリのソースを明らかにしてください。 |


Permitted（許可）
------------------

|項目|説明|
|----|----|
| Sublicense（サブライセンス）| このソフトウェアはサブライセンスを与えてもよいです。 |
| Modifications（修正）| このソフトウェアは修正してもよいです。 |
| Commercial Use（商用利用）| このソフトウェアは商用目的のために使用してもよいです。 |
| Private Use（個人利用）| このソフトウェアを配布しないで、個人的に修正・使用してよいです。 |
| Distribution（配布）| このソフトウェアを配布してもよいです。 |
| Patent Grant（特許許可）| このライセンスは個人または企業（コントリビュータ）をはじめ全ての利用者に特許権の特別な許可を提供します。 |


Forbidden（禁止）
------------------

|項目|説明|
|----|----|
| Use Trademark（トレードマークの使用）| ロゴやトレードマークでの使用は禁止です。 |
| Hold Liable（責任免除）| ソフトウェアは保証無しで提供されます。ソフトウェアによる損害賠償金などの法的責任は負わされません。 |
| No Sublicense（サブライセンス禁止）| ライセンスに含まれない変更して、ソフトウェアにサブライセンスを与えてはいけません。 |
| Modifications（修正なし）| このソフトウェアは修正してはいけません。 |
| Distribution（配布の禁止）| このソフトウェアを配布してはいけません。 |
RSpecでテストデータベースの準備


```ruby
bundle exec rspec spec/
```

を実行すると、以下のエラーが発生する。

```
~vendor/bundler/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:379:in `check_pending!': Migrations are pending; run 'rake db:migrate RAILS_ENV=test' to resolve this issue. (ActiveRecord::PendingMigrationError)
```

テストデータベースが無いかららしい。
以下を実行し、テストデータベースを準備する。

```ruby
bundle exec rake db:test:prepare
```

以前はこれだけでOKだったらしいが、Rails4だと以下も実行しないと解消されない。

```ruby
bundle exec rake db:migrate RAILS_ENV=test
```

参考URL
[Ruby on Rails Tutorial News - Preparing the test database](http://news.railstutorial.org/failing-rails-4-0-rc1/)

- - -
補足

最初に以下を実行しておけば、ハマらなかったっぽい。

```ruby
bundle exec rake db:create:all
```

・・・読み飛ばしてた・・・orz
Pythonを使って一瞬で連立方程式を解く

##連立方程式をSympyを使ってIPython上で解く
・xyz = -234
・x + y + z = 20
・5x – y + 2z = 85

(環境: Ubuntu12.04LTS)

###IPythonのインストール

```bash
$ sudo apt-get install ipython-notebook
```

###その他の関連する科学技術計算ライブラリもインストール

```bash
$ sudo apt-get install python-matplotlib python-scipy python-pandas python-sympy python-nose
```

###IPythonの起動

```bash
$ ipython
```

###連立方程式の解答を出力する


IPythonシェルで以下のように入力します。

```bash
from sympy import *
x, y, z = symbols('x y z')
init_printing()
solve([x * y * z + 234, x + y + z - 20, 5 * x - y + 2 * z - 85], [x, y, z])
```

xyz = -234 という数式の場合、 x * y * x + 234 と記述します。

###解答出力結果

init_printing()を記述した場合（レイアウトの都合上画像を3分割しています）:
![sympy2_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/34365/72cd5366-c398-486b-7a90-e8329d272341.jpeg)
![sympy2_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/34365/ad2363db-f4a2-a229-c2fd-13782ddaca7d.jpeg)
![sympy2_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/34365/06583e7e-3fa2-7a10-114d-7e5d87900915.jpeg)


init_printing()を記述しなかった場合:

```bash
[(-9*17**(1/2)/4 + 39/4, -9*17**(1/2)/4 - 21/4, 31/2 + 9*17**(1/2)/2),
 (13, -2, 9), (9*17**(1/2)/4 + 39/4, -21/4 + 9*17**(1/2)/4, -9*17**(1/2)/2 + 31/2)]
```

###環境構築をしないでオンライン上で計算を行う方法

以下のWebサイトにアクセスします。
・SymPy Live
http://live.sympy.org/

iPythonと同じようにコンソールから、Sympyを使って計算を行うことができます。
namespaceを設定したときのpath


下記のようなnamespaceを設定したき


```ruby:routes.rb
resources :users do
  resources :notifications
end
```
配列かpathの引数に2つの値を指定する必要があります。

```ruby:hoge.html.haml
= link_to 'Show', [@user, @notification]　#or user_notification_path(@user, @notification)

#例
#@user @user.id = 1
#@notification  @notification.id = 1
#/users/1/notifications/1
```

`admin/notifications/:notification_id`のようなnamespaceにしている場合は`[:admin, @notification]`にすれば良いみたい。
Macのterminalでのログを保存する

# 執筆経緯
terminalの実行コマンドログを保存する必要性が出て来たので調べた。
Applicationのログ保存機能でも良かったが、せっかくなので/etc/profileをいじってみる  
shell起動時にscriptが起動し、起動時刻でログファイルを生成するよう設定する

# /etc/profileへのログ生成機能の追記
### ログファイルの置き場所の作成
  
```
$ mkdir -p ~/log/termlog
```  
### suになる

```
$ su
Password:

#
```  
### 所有者とアクセス権の確認  
  
```
# ls -l /etc/profile
-r--r--r--  1 root  wheel  292  2 21 03:43 /etc/profile
```  
### 編集を加えるためにアクセス権を変更する  
  
```
# chmod 755 /etc/profile
```  
### タイムスタンプの定義とログファイルの作成、scriptコマンドの追記
  
```text:/etc/profile
+ timestamp=`date "%Y%m%d-%H%M%S"`
+ logfile="$HOME/log/termlog/terminal_$timestamp.log"
+ script $logfile
```  
### アクセス権の戻しとshellの再起動  
  
```text
# chmod 444 /etc/profile
# exit
$
$ exit
``` 

# ログファイルの圧縮
### 後日記載
一ヶ月前のファイルを一日ごとに分けてtgzするだけ。
find -mtime ~
tar -z

# 問題点
ログファイルをcatとかで見ると変な挙動を示す。なんだこれ汗
luaでオブジェクト思考

最近仕事などでluaを使うことが多いので、オブジェクト思考ぽっくできないかなと思い調べてみました。

```lua:sample.lua
Data = {}
Data.new = function(id)
	local this = {}

	this.id = id
	this.startTime = 0
	this.endTime = 0

	this.getID = function(self)
		return self.id
	end

	this.tostring = function(self)
		local tmp = "[id="..tostring(self.id)..
		", startTime="..tostring(self.startTime)..
		", endTime="..tostring(self.endTime)..
		"]"
		return tmp
	end

	this.setStartTime = function(self, time)
		self.startTime = time
	end

	this.getStartTime = function(self)
		return self.startTime
	end

	this.setEndTime = function(self, time)
		self.endTime = time
	end

	this.getEndTime = function(self)
		return self.endTime
	end

	this.timeDiff = function(self)
		return self.endTime - self.setStartTime
	end

	return this
end

DataList = {}
DataList.new = function()
	local this = {}

	this.dataTbl = {}

	this.add = function(self, data)
		table.insert(this.dataTbl, data)
	end

	this.getItem = function(self, key)
		for i,v in ipairs(this.dataTbl) do
			if v:getID() == key then
				return v
			end
		end
		return nil
	end

	this.debugPrint = function(self)
		print("===== dump list ===========")

		for i,v in ipairs(this.dataTbl) do
			print(i.."=>"..v:tostring())
		end
	end

	return this
end

dataTbl = DataList.new()
data = Data.new(1)
data:setStartTime(10)
dataTbl:add(data)

dataTbl:debugPrint()

tmp = dataTbl:getItem(1)
assert(tmp ~= nil )
print(tmp:getID())
tmp:setEndTime(20)

dataTbl:debugPrint()
```
高機能REPL psysh

普段phpのREPLでは[boris](https://github.com/d11wtq/boris)を使っていて不便ではないものの
irbやpryに比べるとやっぱり貧弱だなぁと思っていた

で、たまたま見つけた[psysh](http://psysh.org/)が強そうだったので使ってみた

```shell-session
composer global require psy/psysh:dev-master
```
で入れてpsyshで起動

```shell-session
psysh vendor/autoload.php
```
と指定することで自分のプロジェクトのオートロード設定も読み込める

後は普通のREPLとしても使えるし、
![array.png](https://qiita-image-store.s3.amazonaws.com/0/37997/8514f772-484c-b89e-973b-6c3cbd7c6d35.png)

lsでメソッド一覧を見たり、
![ls.png](https://qiita-image-store.s3.amazonaws.com/0/37997/e9f88536-b021-5b31-2783-a4066a192511.png)


showでコードを読んだり、
![show.png](https://qiita-image-store.s3.amazonaws.com/0/37997/108af4ca-ecfe-0e8b-8705-8745db09339b.png)

docでドキュメントを読んだり出来る
![doc.png](https://qiita-image-store.s3.amazonaws.com/0/37997/7656e669-0e43-aa2b-f08b-5b1a15ad3bad.png)

[ここ](https://github.com/bobthecow/psysh#downloading-the-manual)からマニュアルをダウンロードして~/.psysh/に置けばビルトイン関数のドキュメントも読める

phpでこういうの欲しかったので今まで損してた気分

arrayの表示とかはborisの方が見やすいけど、便利なので移行する価値はありそう