OmniAICreator/Qiita-1.07M huggingface dataset:
grunt-contrib-copyでついでにリネーム


```
copy: {
  hoge2fuga: {
    files: [
      {
        expand: true,
        cwd: 'src/',
        src: 'hoge.js',
        dest: 'dest/',
        rename: function(dest, src) {
          return dest + 'fuga.js';
        }
      }
    ]
  }
}
```
Unityで再生しているアニメーションをスキップする方法

@yomogi_ft さんからおしえてもらった方法の備忘録

主に↓を使うとかの話
http://docs.unity3d.com/Documentation/ScriptReference/Animation.html

Unityで演出にAnimationを使っていてスキップする方法がぱっと見つからなかったので聞いてみたらススッと答えが返って来てコレが上手く動いてくれたのでシェア（掲載許可はもらいずみ）

なおMecanim のAnimatorだと使えないのでご注意。

```csharp:SkipCurrentAnimation.cs
void SkipCurrentAnimation()
 {
  // 現在再生中のアニメーションクリップ名を取得
  // もっとよい方法があれば...
  var clipName = "";
  foreach(AnimationState state in this.animation) {
   if (this.animation.IsPlaying(state.name)) {
    clipName = state.name;
    break;
   }
  }

  //clipNameが現在の再生クリップと一致していればうまいこと動作する
  this.animation[clipName].time = this.animation.GetClip(clipName).length;
 }
```

超カンタンにできたのでもし同じ事やろうとして見つからなかった人は是非。
あとこの方法だとこういう問題あるよ！！とかあればだれか突っ込んくださいm(_ _)m

ではでは٩( 'ω' )و
C style output in maxima

maximaにはfortranが直接読める形で出力する機能があるが、C言語用には出力してくれない。
そこで拡張機能を導入する。[cform.lisp](http://www.rbt.his.u-fukui.ac.jp/~naniwa/pub/maxima/cform.lisp)をダウンロードして
`/usr/share/maxima/*.*.*/src`
以下に保存する(srcディレクトリは無いので作る)。これでmaxima内で
 
```maxima
load(cform.lisp);
```

で読みこみ(warningが出る)

```maxima
cform(x^2);
```

とすると

```c
pow(x,2);
```

としてくれる。
titaniumでtabのiconをカスタマイズする時に気をつける事

titanium × alloyでtabのiconをカスタマイズしている時に
ちょっとした事でつまり時間をとられたので備忘録として。。

## つまったところ
retina display対策としてiphone用に2倍の解像度のアイコンを1つ用意。
iconプロパティからurlを指定して読み込ませたが、画像が大きいままひずんでしまった。。

## 解決した方法
android用の小さい画像とiphone用の2倍解像度の2つの画像を同じディレクトリに配置するとひずまなく表示できた。
tabicon.png
tabicon＠2x.png

alloyで書いてるけどtssは小さいものを読むようにするといいみたい。

```
"#tab": {
	icon: "tabicon.png"
}
```

ちなみに参考にしたのは[ここ](http://developer.appcelerator.com/question/85741/tab-bar-high-res-icons)
Phalcon + MySQL の文字化けに対処する


PHP 5.3.6 以降の場合は、PDO に charset パラメータがあるのでそれで指定する。

`services.php` などで、

```
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
:
$di->set('db', function() use ($config) {
  $dbAdapter = new DbAdapter([
    'host' => 'HOST',
    'username' => 'USERNAME',
    'password' => 'PASSWORD',
    'dbname' => 'DBNAME',
    'charset' => 'utf8'
  ]);
  :
```

PHP 5.3.6 より前の場合は、お手軽に `SET NAMES utf8` で一応対処できる。(このやり方はよろしくないことが起こることがあるらしいがちゃんと調べてない)

```
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
:
$di->set('db', function() use ($config) {
  $dbAdapter = new DbAdapter(array(
    'host' => 'HOST',
    'username' => 'USERNAME',
    'password' => 'PASSWORD',
    'dbname' => 'DBNAME',
    'options' => array(
      \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    )
  ));
  :
```
WPFでネストしたScrollVIewerの親ScrollViewerがスクロールできなくなる現象を何とかする

WPFのScrollViewerはネストするとビジュアルツリー上で末端の方にあるScrollViewerがマウススクロールイベントを握りつぶしてしまい、上にあるScrollViewerがスクロールできなくなる糞仕様がある。これを末端ScrollViewerのスクロールを無効化し、上のScrollViewerがスクロール出来るようにする。

#糞の原因
ScrollViewerがMouseWheelイベントをhandle = trueにしており、ここでスクロールイベントが握りつぶされている。そのため、MouseWheelイベントがScrollViewerより上へバブルしてくれない。

#対策
ScrollViewerのPreviewMouseWheelイベントを購読し、握りつぶすこれに代わってMouseWheelを親要素で投げてやる。なお、当然"親"要素で投げてやる必要がある。ScrollViewerで投げると握り潰される。Behavior\<ScrollViewer\>として書くといい感じ。

```java
public class WheelScrollKillBehavior : Behavior<ScrollViewer>
{
    protected override void OnAttached()
    {
      base.OnAttached();
      AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
    }
    protected override void OnDetaching()
    {
      base.OnDetaching();
      AssociatedObject.PreviewMouseWheel -= AssociatedObject_PreviewMouseWheel;
    }
    void AssociatedObject_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
      e.Handled = true;
      var newEventArgs = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
      {
        RoutedEvent = UIElement.MouseWheelEvent
      };
      ((UIElement)AssociatedObject.Parent).RaiseEvent(newEventArgs);
    }
}
```
elasticsearch+Kibanaのセットアップ


ログをfluentdからelasticsearchに流し込みKibanaを使って表示させるため、elasticsearchとKibanaをセットアップした時の備忘録。

## セットアップするサーバ
* EC2 (Amazon Linux)

## elasticsearchのインストール

```
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.noarch.rpm
$ sudo rpm -ivh elasticsearch-1.0.1.noarch.rpm 

$ rm elasticsearch-1.0.1.noarch.rpm
```

* `/usr/share/elasticsearch`以下に本体がインストールされた？？
* `/etc/elasticsearch/elasticsearch.yml`が設定ファイル
* `/var/lib/elasticsearch/elasticsearch/nodes/0/indices/`下に、データが突っ込まれていくようだ

### 起動

```
$ sudo /etc/init.d/elasticsearch start
$ sudo chkconfig elasticsearch on
```

9200番ポートにアクセス、ちゃんと起動してれば以下のレスポンスが返ってくる。

```
$ curl localhost:9200
{
  "status" : 200,
  "name" : "Trader",
  "version" : {
    "number" : "1.0.1",
    "build_hash" : "5c03844e1978e5cc924dab2a423dc63ce881c42b",
    "build_timestamp" : "2014-02-25T15:52:53Z",
    "build_snapshot" : false,
    "lucene_version" : "4.6"
  },
  "tagline" : "You Know, for Search"
}
```

## Kibanaインストール

続いてKibana。

```
$ wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.0milestone5.tar.gz
$ tar zxf kibana-3.0.0milestone5.tar.gz
$ rm kibana-3.0.0milestone5.tar.gz
$ sudo mv kibana-3.0.0milestone5 /usr/local/kibana
```

* 落としてきたファイルを`/usr/local/kibana`以下に置いた
* 設定ファイルは`/usr/local/kibana/config.js`

### 接続先を指定

```/usr/local/kibana/config.js
/*
elasticsearch: "http://"+window.location.hostname+":9200",
*/

elasticsearch: "http://<グローバルIPアドレス>:9200",
```

24行目付近を修正、elasticsearchを動かしているサーバのグローバルIPアドレスを指定。

## Nginx設定
Kibanaを配信できるようにするため、Nginxの設定も編集する。

```Nginx:/etc/nginx/nginx.conf
location / {
    root /usr/local/kibana/;
    index  index.html index.htm;
}
```

元々書いてあったのをいったんコメントアウトして、こんな感じに。

### 参考
NginxやApacheの設定例などは[公式ページ](https://github.com/elasticsearch/kibana/tree/master/sample)に載ってたりもする

## security groupの設定
9200番ポートが外部に対して開放されていなかったので開けた。EC2 Management Consoleから設定。Custom TCP Ruleで9200を指定、特定IPからのみ参照できるように

## 動作確認
ちゃんとセットアップできているか確認。

Nginxを再起動して、ブラウザで該当サーバにアクセス（http://[IPアドレス（ホスト名）]）。Kibanaのダッシュボード画面が確認できた。

![スクリーンショット 2014-03-07 0.18.39.png](https://qiita-image-store.s3.amazonaws.com/0/1795/502ed5a3-f316-da15-ce4a-e6b35a69e74b.png "スクリーンショット 2014-03-07 0.18.39.png")
DNSは本登録しないと使えない

忘れないようにメモ

さくらのVPSを契約して他社で管理しているドメインをDNSに登録しようとしたけど
DNSが使えない。おかしーと思ってサポートにメールしたら下記の返事。

******************************************************
弊社ネームサーバにてゾーンを設定し、他社で管理されている独自
ドメインを「さくらのVPS」にて利用される場合は、仮想サーバと
ドメインの紐付けやネームサーバ利用申請、ゾーンの設定が必要で
ございます。

仮想サーバとドメインの紐付けに関しましては、設定を行うための
GUI などはございませんため、ssh接続やリモートコンソール・VNC
コンソールよりコマンド操作にて紐付けをお願いいたします。

仮想サーバとドメインの紐付け後、ネームサーバにてゾーンの設定を
お願いいたします。
******************************************************

頭の中は「？？？」状態。コマンド操作による紐付けって？？
よくわからないので、サポートに電話して聞いたらまだ仮登録なので使えませんて言われた。
メールにもそう書いてくれたらすぐわかったのに。

DNSは本登録終わるまで使えない。よく考えたらあたりまえの話しだけど混乱したのでメモ。


![契約無しだとー！.png](https://qiita-image-store.s3.amazonaws.com/0/37958/1b9f9cab-421e-c429-2375-78011ac3f6b9.png)
tmuxのコピーモードのキーバインドを考えてみた



```bash:~/.tmux.conf
# 設定リロード
bind r source-file ~/.tmux.conf \; display-message "Reload Config!!"

# "C-b, [" コピーモードの設定 vi
#set-window-option -g mode-keys vi
setw -g mode-keys vi

# [?]キーバインドの確認

# [p]貼り付け
bind p paste-buffer

# c[Enter]コピー
#bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
bind -t vi-copy Enter copy-pipe "xclip -i -selection clipboard"

# c[Space]選択

# [y]1行コピー(クリップボードとの連携がない場合)
bind -t vi-copy Enter copy-pipe "xclip -i -selection clipboard"
bind -t vi-copy Y select-line
bind y run 'tmux copy-mode\; send-keys Y Enter'

## [y]1行コピー(クリップボードとの連携がある場合)
#bind -t vi-copy Y copy-line
#bind y run 'tmux copy-mode\; send-keys Y'

# [v]全行コピー
bind -t vi-copy V begin-selection
bind v run 'tmux copy-mode\; send-keys ggVG Enter'
```

ポイントは､`send-keys`です。最後の行だけを見ていきましょう｡

`bind v run 'tmux copy-mode\; send-keys ggVG Enter'`

これは、続けて `ggVG Enter` の順でキーを押すという命令になっています。


`copy-mode`で使えるコマンドは以下の記事が参考になります。


[tmux での1行コピー または man tmux に載っていないコマンド](http://blog.m4i.jp/entry/2012/02/13/155233)

最終的に使うキーは簡易なものを設定し､それまでのキーはできるだけ押しにくいキーを設定すると便利です｡
変数

##繰り返し使う言葉には「変数」を使う

phpでたとえば`echo`を使って文字列を出力するとします。

例えば春日歩が「なんでやねん!」を３回言ったなら↓

```php
<?php
echo "なんでやねん！";
echo "なんでやねん！";
echo "なんでやねん！";
?>
```

![php_02.png](https://qiita-image-store.s3.amazonaws.com/0/35975/70806096-f0f2-ec14-bf0d-b1a3c81f3d75.png "php_02.png")


と書く必要があります。(↑実行結果)

##変数の使い方
シンプルにするために「なんでやねん！」というセリフを`mesage`という変数(箱)に入れて扱ってみます。
変数は$(ドル記号)で始まる名前をつけます。↓使用例

```php
<?php
$mesage = "なんでやねん！";
echo "$mesage";
echo "$mesage";
echo "春日歩です";
?>
```

![php_03.png](https://qiita-image-store.s3.amazonaws.com/0/35975/7e4dd859-c2ee-2149-c869-3bf3ba0784d1.png "php_03.png")

###変数に格納した値の変更方法
次のように書くと、後から格納された値に変更されます。

```
<?php
$mesage = "なんでやねん！";
$mesage = "へーちょ！";
echo $mesage;
?>
```

![php_04.png](https://qiita-image-store.s3.amazonaws.com/0/35975/4c7b33d7-b4b7-82a8-f913-e33d664dc0fe.png "php_04.png")

##変数を囲むとき「"○○○○"」と「'○○○○'」の違いについて！

これについては結果を実際に見た方が早いと思います。

①「"」の場合

```php
<?php
$mesage = "なんでやねん！";
echo "$mesage";
?>
```
結果は↓変数に入れた中身が表示されてますね！
![php0001.png](https://qiita-image-store.s3.amazonaws.com/0/35975/a55f47d7-ce7c-f407-0d45-dd96d1a8dfee.png "php0001.png")


②「'」の場合

```php
<?php
$mesage = "なんでやねん！";
echo '$mesage';
?>
```

結果は以下の様になります。
![php0002.png](https://qiita-image-store.s3.amazonaws.com/0/35975/535bc304-1d43-622c-0269-0025bb90b3c2.png "php0002.png")

##２つの使い分け
例えば長い文字列を組み立てる時は、変数を「"」でくむ方法が便利です。

たとえば、「ちよちゃんが大阪さんに挨拶したとしましょう」

```php
<?php
$name = "大阪";
echo "{$name}さん、おはようございます。えへ！";
?>
```

結果↓この様にキチンと表示されます。

![php0003.png](https://qiita-image-store.s3.amazonaws.com/0/35975/075480fe-7a08-3d67-0345-8ebe4c8b4aae.png "php0003.png")
redmine のメール通知を纏めて off にする方法

検証環境で、API を使ったチケット登録・削除・変更をやっていると
登録されているユーザにメールが飛んで煩わしい・紛らわしいので、まとめて
off にしてみた。

PostgreSQL を使っているので psql を起動した後に

```bash
redmine=# update users set mail_notification = 'none';
```

とやれば良い。


40アカウントあるデータベースを使っての検証だったので、一瞬、一つずつ
Web 管理画面から off にしようかとおもったが、やらなくて良かった…
PlayFrameworkのprojectをアップデートする

## はじめに
- play frameworkのアップデートをして、プロジェクトも新しいバージョンで動かしたいときの方法

## 前提
- PlayFramework 2.2.0 => 2.2.2へアップデート

## 方法
### PlayFrameworkのupdate
- play 2.2.2をダウンロードし、pathを通す
	- [Play Framework 2.2.2](http://downloads.typesafe.com/play/2.2.2/play-2.2.2.zip)

```bash:play-2.2.2
$ wget http://downloads.typesafe.com/play/2.2.2/play-2.2.2.zip
$ unzip play-2.2.2.zip
$ echo 'export PATH=/path/to/play-2.2.2:$PATH' >> ~/.bashrc
```

- plugins.sbtを編集

```scala:plugins.sbt
// project/plugins.sbt
addSbtPlugin("play" % "sbt-plugin" % "2.2.2")
```

- play clean

```bash:clean
$ play clean
```
PandocでMarkdownをTextileに


## 理由

* RedmineがTextileだから。
* RedmineでMarkdownする方法もあるみたいだけど、既にTextileで書きためたWikiがあるから。
* Kobitoで書いたMarkdownをRedmineのWikiにコピーしたいから。

## Haskell

参考：[Mac に Homebrew で Haskell 入れて HelloWorld](http://qiita.com/amay077/items/f2f7f1324ca5ea296dbb)

```
brew install ghc
brew install haskell-platform
```

## Pandoc

参考：[多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)

```
cabal update
cabal install pandoc
```

cabalでインストールしたので、.bashrcなどでパスを通します。

```bash:.bashrc
export ~/.cabal/bin:$PATH
```

## Markdown to Textile

```
pandoc -s input.md -t textile -o output.textile
```

これで一応Textileが出力できましたが、あんまり良い出来ではないかも・・・。
Tera Term マクロ、ログイン先指定で 自動ログインと背景色変更

INIファイルを それぞれttpmacro.exeと同じディレクトリにおいて切り替えるだけ
3つ程度なら これでよいが増えた時の修正が面倒かもしれない


```
;=====================================================================
; 自動ログイン TTL
;=====================================================================
; ホスト設定
strdim HOSTNM 3
HOSTNM[0] = 'ローカル'
HOSTNM[1] = '開発'
HOSTNM[2] = '本番'
strdim HOSTIPLIST 3
HOSTIPLIST[0] = 'XXX.XXX.XXX'
HOSTIPLIST[1] = 'XXX.XXX.XXX'
HOSTIPLIST[2] = 'XXX.XXX.XXX'

; ログインユーザ
strdim USERLIST 3
USERLIST[0] = 'username'
USERLIST[1] = 'username'
USERLIST[2] = 'username'

; ログインパスワード
strdim USERPWLIST 3
USERPWLIST[0] = 'password'
USERPWLIST[1] = 'password'
USERPWLIST[2] = 'password'

; 設定INIファイル
strdim INILIST 3
INILIST[0] = 'ini_local.ini'
INILIST[1] = 'ini_dev.ini'
INILIST[2] = 'ini_system.ini'

;; 接続先ホスト選択
listbox '接続するホストを選択して下さい' '接続ホスト選択' HOSTNM
if result >= 0 then
	HOSTADDR = HOSTIPLIST[result]
	USERNAME = USERLIST[result]
	PASSWORD = USERPWLIST[result]
	INIFILE  = INILIST[result]
else
    end
endif

; コマンド
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
strconcat COMMAND ' /F='
strconcat COMMAND INIFILE

; 接続
connect COMMAND

; マクロ終了
end
```
Retina Display 環境で幅1pxの線を描画する

## UIView

幅1pxの横線または縦線を描画する場合。

```
// 線幅
CGFloat wide = 1.0f　/　[UIScreen mainScreen].scale;

UIView *horizontal = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, wide)];

UIView *vertical = [[UIView alloc] initWithFrame:CGRectMake(0, 0, wide, 100)];
```

## CALayer

幅1pxの枠線を描画する場合。
`borderWidth` は CGFloat なので0.5とかでも受け付ける。

```
// 線幅
CGFloat wide = 1.0f / [UIScreen mainScreen].scale;

CALayer *layer = [[CALayer alloc] init];
layer.borderWidth = wide;
```

## iOS 7.0以降の Retina Display 環境に特化

```
CGFloat wide = 1.0f; // 1pt

// iOS 7.0以降のRetinaに限り、1pxにする
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
	wide /= [UIScreen mainScreen].scale;
```

OSバージョン判定用に `SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO()` を使用している。

http://stackoverflow.com/questions/3339722/how-to-check-ios-version/5337804#5337804
Rails4でCompassのsprite-mapを利用しつつ、対応するcssをファイル名で自動で生成してみる


##環境

rails (4.0.2)
compass (0.12.2)
compass-rails (1.1.2)
sass (3.2.14)
sass-rails (4.0.1)

###sprite対象のpng画像を配置

利用箇所毎にsprite画像を分けられるようにフォルダで分けておく

app/assets/images/sprites/common/icon_foo.png
app/assets/images/sprites/common/icon_bar.png
app/assets/images/sprites/home/btn_foo.png
app/assets/images/sprites/home/btn_bar.png

##Retina対応のsprite画像を作る

```sass:application.sass
@import "compass/utilities"
@import "compass/css3"

// Retina対応sprite画像cssのmixin
@mixin sprite-background($name, $sprites, $sprites-image)
  background-image: $sprites-image
  background-repeat: no-repeat
  overflow: hidden
  display: inline-block
  width: image-width(sprite-file($sprites, $name)) / 2
  height: image-height(sprite-file($sprites, $name)) / 2
  $xpos: round(nth(sprite-position($sprites, $name), 1) / 2)
  $ypos: round(nth(sprite-position($sprites, $name), 2) / 2)
  background-position: $xpos $ypos
  $wbgz: image-width(sprite-path($sprites)) / 2
  @include background-size($wbgz auto)

// $nameを利用したクラス名のcssを作る部分
@mixin sprite-css($name, $sprites, $sprites-image)
  .#{$name}
    @include sprite-background($name, $sprites, $sprites-image)
```

##各画像のcssをファイル名から生成

sassから指定したフォルダにおいてある画像名を取得処理(SassFunctionの拡張)
(file_namesをsortせずにいたらサーバ毎に違うハッシュのapplication.cssが作成されてハマった)

```ruby:config/initializers/sass_functions.rb
module Sprockets::SassFunctions
  module CustomSassFunctions
    def sprite_image_names(path)
       file_names = Pathname.glob(Rails.root.join("app/assets/images", path.value)).collect{|f|f.basename(".*").to_s}
      Sass::Script::List.new(file_names.sort.map{|v| Sass::Script::String.new(v)}, :comma)
    end
  end
  include CustomSassFunctions
end

```

sass側から上記functionでファイル名のSass::Script::List配列を取得してeachしてsprite画像と各画像のcssを生成

```sass:application.sass
// sprite画像を生成した後、
// Rails側に用意したsass_functionを呼び出して該当フォルダの画像ファイル名を取得してファイルに応じたcssを作成する
$folders: common, home
@each $folder in $folders
  $path: "sprites/" + $folder + "/*.png"
  $sprites: sprite-map($path, $layout: smart)
  $sprites-image: sprite-url($sprites)
  @each $name in sprite_image_names($path)
    @include sprite-css($name, $sprites, $sprites-image)
```

実際に利用する場合ファイル名がそのままclass名になっている

```html
<span class="icon_foo"></span>
<span class="icon_bar"></span>
<span class="btn_foo"></span>
<span class="btn_bar"></span>
```

cssのクラス名にフォルダ名も含めたほうがいいかもしれない

##参考にさせてもらったサイト

http://qiita.com/good_flat/items/2bd9a37d450272562836
http://cappee.net/coding/sass-scss/sprite-path
ファイルナビゲータのショートカット

つかってなかったのですが便利そうなので。。

Option + Command + J でフィルタバーにいけるのでファイルを制限(フィルタリング)できます

ちなみに
プロジェクトナビゲータ、ファインドナビゲータ等はCommand + 数字　で切り替えられますので

Command + 1
Option + Command + J
でフィルタリングしてから
プロジェクトナビゲータでファイルを選択
(リターン、タブキーで抜けてからあとは上下移動や文字列)

最期にフォーカスをエディタに戻す
Command+J

で一連の操作がキーボードだけでできます。
Rails 4.1.0.rc1でdeviseのメールをプレビューする

Rails 4.1からメールのプレビューが出来るようになります。

認証にDeviseを使っている場合も簡単にプレビューできました。

### 1. メールプレビュー用のディレクトリを準備する

RSpecを使っていてtestディレクトリが無い場合は以下のようにメールプレビュー用のディレクトリを作成します。

```zsh
% mkdir -p test/mailers/previews/
```

### 2. Devise用のプレビュークラスを作成する

メールプレビュー用のディレクトリにDevise用のプレビュークラスを作成します。クラス名はPreviewで終わる必要がありますが、その他はクラス名やメソッド名に制限や規約は無いようです。

```rb:test/mailers/previews/devise_preview.rb
class DevisePreview < ActionMailer::Preview
  def confirmation_instructions
    Devise::Mailer.confirmation_instructions(User.new, Devise.friendly_token[0,20])
  end
end
```

### 3. プレビューする

ブラウザで http://localhost:3000/rails/mailers/devise/confirmation_instructions にアクセスしてメールをプレビューします。
UILocalNotificationがタップされたときに実行される箇所３パターン


全て`UIApplicationDelegate`に書きます。（普通は`HogeApplicationDelegate.m`ですかね）

```objective-j
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (userInfo != nil) {
        //パターン１：アプリのプロセスが完全に切れていた時に通知をタップ
    }

    return YES;
}

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    if (application.applicationState == UIApplicationStateActive) {
        //パターン２：画面が既に表示されていて通知が飛んできた時に勝手に呼ばれる
        return;
    }
    
    if (application.applicationState == UIApplicationStateInactive) {
        //パターン３：アプリがバックグラウンドでは生きている時に通知をタップ
        return;
    }
}
```
FMDBでEXC_BAD_ACCESSが出た場合の対処法メモ


このような場所でエラーが出て止まる時があります。

```objc:FMDatabase.m
// FIXME - someday check the return codes on these binds.
    else if ([obj isKindOfClass:[NSData class]]) {
```


SQL文の"?"に引数がセットできない場合に起こるようです。
以下の様なSQLを投げたとして

```objc
[database executeUpdate:@"UPDATE testTable SET id = ?, name = ?;",self.id,self.name];
```

1.
引数の型がおかしい場合はエラーになります。数値やBool値はNSNumberで渡す必要があります。

```objc
[database executeUpdate:@"UPDATE testTable SET id = ?, name = ?;",
    [NSNumber numberWithInt:self.id],self.name];
```

2.
初歩的ですが、SQL文の"?"の数と引数の数が合わない場合も同様のエラーになるようです。

```objc
[database executeUpdate:@"UPDATE testTable SET id = ?, name = ?, age = ?;",id,name];
```
【Ruby on Rails】使いどころがわからない最小二乗法のモジュール【勉強用】

```ruby:linner_least_squares.rb

# 最小二乗法
module LinnerLeastSquaresCalculator
  # [[1, 2, 3...], [2, 4, 6, ...]]みたいな形で渡す
  def linner_least_squares(matrix)
   a = b = c = d = 0.0
    matrix[0].each_with_index do |x,i|
      y = matrix[1][i]
      a += x*y
      b += x
      c += y
      d += x**2
    end
    n = matrix[0].size
    return [(n*a-b*c)/(n*d-b**2),  (d*c-a*b)/(n*d-b**2)] #傾きと切片
  end
end

```
古いノートPCにubuntuをインストールする時に地味にめんどくさかったお話

古いノートPCの再生しようという事でThinkPad X41にubuntu13.10をインストールしようとしたら
インストーラがちゃんと動きませんでした。
（うろ覚えですが確か最初のNextボタンが無効になってしまって次に行けなかった気がします）

いろいろググってみるとPAE（物理アドレス拡張）非搭載のCPUだとダメな模様。
ThinkPad X41のCPUはPentium M 1.50GHz（超低電圧版）。見事にヒット。

こちらによると、
http://gihyo.jp/admin/clip/01/ubuntu-topics/201203/09

>Ubuntu 12.04では，インストーラーに含まれるカーネルがPAE非対応のハードウェアに対応せず，ブートすることができません。これにより，Pentium Mなどの古い世代のCPUの一部では，12.04は直接インストールが行えなくなる見込みです。
Tim Gardnerいわく，「Your only option for a non-PAE CPU is to upgrade from a previous release. The 12.04 installer will not boot a non-PAE CPU.」（訳：PAE非対応のCPUで取れる唯一の選択肢は，以前のリリースからアップグレードすることだ。12.04のインストーラーはPAE非対応のCPUでは動作しない）ということで，古いマシンに12.04をインストールするときは少々注意が必要になりそうです。

との事で12.04以降は、11.10をインストールしてからアップグレードするのがセオリーのようなのですが、
なんとなく面白くないので他の方法をググってみると他にも方法があったので試してみたらうまくいきました。

その方法は、「MinimalCDのisoをDLしてきて、ネットインストールする」です。
自分はこの方法でPAE非対応でも目的のバージョン（13.10）のubuntuが一発で入りました。
https://help.ubuntu.com/community/Installation/MinimalCD

元々古いノートPCの再生目的だったので、不要なものも入らず一石二鳥でした。
めでたしめでたし。
Java8関数型インターフェース チートシート

Java8でLambdaを書く際によく使用する関数型インターフェースのほとんどは、java.util.functionに用意されています。

しかし、どのシチュエーションで、そのインターフェースを使えば良いか最初はわかりにくいです。
なので、引数の型や戻り値などから使うべきインターフェースを、逆引きで一覧にしてみました。

- Function系

引数が1つまたは2つあり、戻り値があるパターン

|1つ目の引数の型|2つ目の引数の型|戻り値の型|インターフェース名|備考|
|-------------|-------------|---------|----------------|---|
|指定|-|指定|Function||
|Integer|-|指定|IntFunction||
|Long|-|指定|LongFunction||
|Double|-|指定|DoubleFunction||
|指定|指定|指定|BiFunction||
|指定|-|Integer|ToIntFunction|
|指定|-|Long|ToLongFunction|
|指定|-|Double|ToDoubleFunction|
|指定|指定|Integer|ToIntBiFunction|
|指定|指定|Long|ToLongBiFunction|
|指定|指定|Double|ToDoubleBiFunction|
|Integer|-|Long|IntToLongFunction||
|Integer|-|Double|IntToDoubleFunction||
|Long|-|Integer|LongToIntFunction||
|Long|-|Double|LongToDoubleunction||
|Double|-|Integer|DoubleToIntFunction||
|Double|-|Long|DoubleToIntFunction||

- Consumer系

引数が1つまたは2つあり、戻り値がないパターン

|1つ目の引数の型|2つ目の引数の型|戻り値の型|インターフェース名|備考|
|-------------|-------------|---------|----------------|---|
|指定|-|void|Consumer||
|Integer|-|void|IntConsumer||
|Long|-|void|LongConsumer||
|Double|-|void|DoubleConsumer||
|指定|指定|void|BiConsumer||
|指定|Integer|void|ObjIntConsumer||
|指定|Long|void|ObjLongConsumer||
|指定|Double|void|ObjDoubleConsumer||

- Supplier系

引数が無く、戻り値があるパターン

|1つ目の引数の型|2つ目の引数の型|戻り値の型|インターフェース名|備考|
|-------------|-------------|---------|----------------|---|
|-|-|指定|Supplier||
|-|-|Integer|IntSupplier||
|-|-|Long|LongSupplier||
|-|-|Double|DoubleSupplier||
|-|-|boolean|BooleanSupplier||

- Predicate系

引数が1つまたは2つあり、戻り値がbolean型のパターン

|1つ目の引数の型|2つ目の引数の型|戻り値の型|インターフェース名|備考|
|-------------|-------------|---------|----------------|---|
|指定|-|boolean|Predicate||
|指定|指定|boolean|BiPredicate||
|Integer|-|boolean|IntPredicate||
|Long|-|boolean|LongPredicate||
|Double|-|boolean|DoublePredicate||

- UnaryOperator系

1つ目の引数と戻り値の型が同じパターン

|1つ目の引数の型|2つ目の引数の型|戻り値の型|インターフェース名|備考|
|-------------|-------------|---------|----------------|---|
|指定|-|1つ目の引数と同じ|UnaryOperator||
|Integer|-|Integer|IntUnaryOperator||
|Long|-|Long|LongUnaryOperator||
|Double|-|Double|DoubleUnaryOperator||
カテゴリでプロトコルに適合する

# カテゴリ+プロトコル

JAVAで言うところのインターフェースのような使い方ができるObjective-Cのプロトコル。デリゲートとして使われることが多いですが、複数のプロトコルを採用していくとクラスの宣言が徐々に肥大化してきます。
このプロトコルの採用は、次のようにカテゴリに分散して記述することができます。


```objc:カテゴリでのプロトコル採用

@interface ClassName (Category) <Protocol>

@end

```

## こんなときに便利

* .mファイルが肥大化してファイルを分割したいとき
* クラスを外部へ公開したい場合採用しているプロトコルを隠蔽したい場合
Tomcat のセッション永続化について

Tomcat でセッション（ javax.servlet.http.HttpSession ）を
永続化（＝つまり Tomcat 再起動後も使用できるようにすること）させるには、
context.xml の設定を変更することで可能になります。
(以下の情報は Tomcat 6, 7 のケースになります)

※ context.xml は、Amazon EC2 に Tomcat をインストールした場合は以下にあります。
```/usr/share/tomcat7/conf/context.xml
```

##設定値
context.xml に、
```<Manager pathname=""/>``` を記載しないと、 __SESSIONS.ser__ という永続化ファイルが作成されます
※インストール直後のデフォルトがこれです

```xml
<?xml version='1.0' encoding='utf-8'?>
<Context>
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
</Context>
```


context.xml に、
```<Manager pathname="foo.ser"/>``` と記載すると、foo.ser という永続化ファイルが生成されます

```xml
<?xml version='1.0' encoding='utf-8'?>
<Context>
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <Manager pathname="foo.ser" />
</Context>
```

context.xml に、
```<Manager pathname=""/>``` と記載すると、 __永続化ファイルは作成されません__

```xml
<?xml version='1.0' encoding='utf-8'?>
<Context>
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <Manager pathname="" />
</Context>
```


##作成した永続化ファイルのありか
server.xml または コンテキストファイルに記載された workDir の場所に生成されます

※ Amazon EC2 に Tomcat をインストールした場合のデフォルトは以下になります
```/usr/share/tomcat7/work/Catalina/localhost/<コンテキスト名>/SESSIONS.ser
```

##永続化ファイルの作成タイミング
Tomcat の終了時に生成され、起動時に破棄されます。

##保存される情報について
セッションIDの他に HttpSession.setAttribute で設定した情報も永続化されます。
ただし、第2パラメータの java.lang.Object value は、
実クラスがシリアライズ可能な __Serializable でないと値が正常に保存されません__ のでご注意を。

↓これだと復元されないので

```java
public class SessionAttr {
    private String username;
    private String group;

    //以下省略 （setter getter など）

}
```

↓ Serializable を implements します

```java
import java.io.Serializable;

public class SessionAttr implements Serializable  {
    private String username;
    private String group;

    //以下省略 （setter getter など）

}
```


※ java.lang.String の場合は Serializable が implements されているので、値が正常に保存されてますが
独自定義したクラスで、Serializable でない場合は、toString() の値が設定されているだけのように見えます。

参考リンク：[Apache Tomcat Configuration Reference](http://tomcat.apache.org/tomcat-6.0-doc/config/manager.html#Special_Features)
UIWebViewのCookieを削除する（Googleアカウントでログインなどで前の状態が保持されてしまう問題）


![写真 2014-03-10 14 27 53.png](https://qiita-image-store.s3.amazonaws.com/0/21397/5f74894e-04f2-a976-3043-cff0b3f060f9.png "写真 2014-03-10 14 27 53.png")

iOSアプリでGoogleアカウント（Facebookアカウントも同様）を使用してログインすることができるサービスを作ってた時に遭遇しました。
一度、アプリ内のUIWebViewでGoogleアカウントにログイン。
その後、一度ログアウトし、もう一度Googleアカウントでログインしようとすると、メールアドレスとパスワードを聞かれることなく、勝手に前にログインしたアカウントでログインしてしまうという問題に遭遇しました。

UIWebViewのキャッシュを削除しても変わらず。

結果として、Cookieを削除するといけました！

## UIWebViewのCookieを削除する
### 特定のURLのCookieを削除する

```objectivec:hoge.m
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [cookieStorage cookiesForURL:[NSURL URLWithString:@"http://hogehoge.com"]];
[cookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop) {
		[cookieStorage deleteCookie:cookie];
	}];
```

### Cookieを全部削除する

```objectivec:hoge.m
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[[cookieStorage cookies] enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop) {
		[cookieStorage deleteCookie:cookie];
	}];
```

## 余談
NSArrayの高速列挙はfor-inではなく、enumerateObjectsUsingBlockがオススメです！
iTunesで取得したm4aをwavに変換する方法


普通にやろうとすると、soxでの変換になるが、soxはm4aのエンコーダを拡張子から解決できない。ffmpegで行うのが良い。

以下、同時変換用のpythonスクリプトの例を示す。日本語名を含むファイルが多数ある場合でも変換できるように書いた。

```
#!/usr/bin/env python

import os
import commands

import logging
import traceback

if __name__ == '__main__':
	outputdir = os.path.abspath(“<path to output>”)
	for root, dirs, files in os.walk('.'):
		for f in files:
			path = os.path.join(root, f)
			base, ext = os.path.splitext(f)
			outputpath = os.path.join(outputdir, base + ".wav")
			if ext == '.m4a':
				print 'converting %s to %s' % (path, outputpath)
				status, output = commands.getstatusoutput('ffmpeg -i "%s" "%s"' % (path, outputpath))
				if status:
					logging.error (output)
```

\<path to output>の部分は自分で設定すること。
Javaの拡張ForループでMapをループ

JavaでMap系のオブジェクトを拡張Forループで繰り返しする方法。
いつも書き方忘れてしまうのでメモです。

```java:MapLoop.java
for(Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}
```
pythonでzip、unzip

といっても、.zipを作るわけじゃない。
listを結合する方のzipのお話。

zip関数の挙動はこんな感じ

```py
>>> list1 = [1,2,3,4]
>>> list2 = [5,6,7,8]
>>> list3 = zip(list1,list2)
>>> list3
[(1, 5), (2, 6), (3, 7), (4, 8)]
```

で、zipできるならunzipしたいと思うが、pythonにunzip関数はない！
なので、unzipしたい時は可変変数を使うといいらしい。

```py
>>> zip(*list3)
[(1, 2, 3, 4), (5, 6, 7, 8)]
```
UIViewControllerとxibを紐づける

## 用意するファイル
* HogeUIViewController（.hと.m）
* HogeUIViewController.xib

xibファイルはUIViewControllerと同名にする

## 紐づけ
* HogeUIViewController.xibをInterface Builderで開く
* File's Ownerを選択し、Identity InspectorのCustom ClassにHogeUIViewControllerを指定

![スクリーンショット 2014-03-10 12.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/11433/34d90cd1-473f-4c77-7978-c0dc4f2e03d6.png)


* File's Owner右クリックから、viewとIBのviewを結びつける

![スクリーンショット 2014-03-10 12.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/11433/14e51722-5b27-8d64-223d-05bd1e73a39f.png)

## 表示
普通にHogeUIViewControllerを表示するコードを書けば、xibのviewが表示される
Mac OS X MavericksへのKakasiのインストール


#はじめに

Kakasiは、日本語をローマ字に変換するまたはその逆を行うUnixコマンドである。もはや古い部類に属するコマンドだが、たまに日本語名だらけのリソースをシステムが扱いやすいように変換したい場合、それらの処理を自動化したい場合に効果を発揮する。

ここでは、リマインダとして、kakasiをmavericksにインストールする方法とその運用方法についてまとめる。

# インストール

以下のページから、kakasiの最新バージョンのtarballを持ってきて、解凍しビルドする。

* http://kakasi.namazu.org/stable/

ホストオプションをつけるのがポイント。現状で、2.3.5が最新だった。

```
$ tar xzf kakasi-2.3.5.tar.gz
$ cd kakasi-2.3.5
$ configure —host=powerpc-apple-bsd
$ make
$ sudo make install
```

# 運用

kakasiはeuc-jpの文字コードをサポートしているので、mac標準のutf8の文字列をnkfで変換してから与えないと、変な変換をする

## 悪い例

```bash
$ echo "あいうえお" | kakasi -Ha
?yu??うえお
```

## 良い例

```bash
$ echo "あいうえお" | nkf -e | kakasi -Ha
aiueo
```

nkfがインストールされていないなら、homebrewでさくっとインストールする

```
$ brew install nkf
```

## オプション

入力の中のどの種の文字を変換するかは、前後二文字のオプションをつけて、指示する。それぞれの文字の意味は以下の通り

* a: ascii
* j: jisroman
* g: graphic
* k: kana (j,k defined in jisx0201)
* E: kigou
* K: katakana
* H: hiragana
* J: kanji(E,K,H,J defined in jisx0208)

上記の例では、ひらがなから、ローマ字(acciicode)に変換したかったので、-Haというオプションをつけた。漢字からローマ字の場合は、-Ja、カタカナからローマ字の場合は-Kaもつけること。

# サンプル

以下、同じディレクトリにある日本語名のファイルをkakasiを使って、英語名にするためのスクリプト例

```translate_and_move.py
#!/usr/bin/env python

import os
import commands
import logging
import traceback

logging.basicConfig(level=logging.DEBUG)

for root, dirs, files in os.walk('.'):
        for fname in files:
                inpath = os.path.join(root, fname)
                fname = fname.replace("\s", "_")
                fname = fname.replace(" ", "_")
                status, engfname = commands.getstatusoutput('echo "%s" | nkf -e | kakasi -Ha -ka -ja -Ja -Ka -Ea -ga' % fname)
                if status:
                        logging.error ("error: status: " + str(status))
                        continue
                outpath = os.path.join(root, engfname)
                logging.debug ('mv "%s" "%s"' % (inpath, outpath))
                status, output = commands.getstatusoutput('mv "%s" "%s"' % (inpath, outpath))
                if status:
                        logging.error ("error: status: " + str(status))
                        continue
```

# homebrewを使ったインストール

Homebrewを使ってインストールしたい場合は以下で紹介されているタップを利用するといいらしい

* http://koshigoeb.hateblo.jp/entry/2013/05/20/165310
Vagrantの共有ファイルシステム

VagrantにはゲストOSとホストOS間でファイル（ディレクトリ）を共有する機能がある。
標準ではゲストOS側が/vagrant、ホストOS側がVagrantfileが置いてあるディレクトリとなる。

これはVagrantfileを編集することで変更できる。

```ruby:Vagrantfile
Vagrant::Config.run do |config|

  config.vm.share_folder "v-root", "/var/www/html", "C:/Users/hoge/Desktop/hoge"
end
```

ApacheをChefなどでインストールすれば、そのまま第3引数で指定したディレクトリ（上記の例では"C:/Users/hoge/Desktop/hoge"）がDocumentRootになってくれるので開発時に便利。
Jenkinsで使用するノードの空きディスク容量の設定を変更する

# はじめに
* Jenkinsのノードとして登録しているものはいくつかの項目について定期監視が走っている
* その中で「空きディスク容量」の設定方法をご紹介

# 監視対象
* 登録している全ノード

# 監視項目
* アーキテクチャ
 * ON/OFF
* クロック誤差
 * ON/OFF
* 応答時間
 * ON/OFF
* 空きスワップ容量
 * ON/OFF
* 空きテンポラリ容量
 * 空き容量の閾値(例 1GB,500KBなど)
* 空きディスク容量
 * 空き容量の閾値(例 1GB,500KBなど)

# 注意事項
* 空きテンポラリ容量と空きディスク容量は以下のように書かれている
 * このオプションは、スレーブが正常動作するために最低限必要な空きディスク容量を設定します(例 "1.5GB"、"100KB"など)。 
 * スレーブの空き容量がこの値より少ない場合、 *オフライン* になります。 
* 私はこれにやられたので本記事を書きましたm(_ _)m
* ビルドの生成物を残し続けたり、はじめから設定している空き容量に対してカツカツな容量しか空けていないとき接続は切れオフラインになります

# 設定方法
* 以下の方法のどちらか(http://localhost:8080 でjenkinsのマスターが動いていると仮定)
 * Jenkinsのホーム -> Jenkinsの管理 -> ノードの管理 -> 設定 -> 空きディスク容量の設定
 * http://localhost:8080/computer/configure にアクセス後、空きディスク容量の設定

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
CanvizPlain: Xdotの描画ライブラリCanvizのprototype.js非依存版


はじめに
=======

[Canviz](https://code.google.com/p/canviz/) という GraphvizのxdotデータをHTMLのCanvasを使って描画するJavaScriptのライブラリがあります。

Canvizは便利なのですが内部でprototype.jsを使っていてjqueryなどと相性が悪いので、外部ライブラリに依存しない[CanvizPlain](https://github.com/mokemokechicken/CanvizPlain)というのを作ったので共有します。

CanvizPlain
===========

生い立ち
-------
CanvizPlain は Canviz-0.1 の移植です。
Canviz-0.1がprototypejsを主にClass継承などに使っていたので、その辺りをCoffeeScriptで書き直すことで外部ライブラリを必要としないようにしました。

CanvizPlain は [GitHub](https://github.com/mokemokechicken/CanvizPlain) で公開しています。

使い方
------

こんな感じで使います。

```javascript:sample.js
// include canviz.js

var xdotText = "... Your xdot text ...";
var canviz = new Canviz("canvas");  // ID of a div like tag.
canviz.parse(xdotText);
```

サンプル
-------

GitHubにあげてあるサンプルを実行するとこんな感じに表示されます。
![スクリーンショット 2014-03-10 10.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/11124/fd4e75a4-6632-c7f8-066c-d018fe9713b8.png "スクリーンショット 2014-03-10 10.45.25.png")




移植に際して
----

`load_graph()` というメソッドがOriginalにはあったのですが、JQueryやその他の手段を使えば通信自体は非常に簡単なので、そこの部分は実装していません。というか、そういうの無しで通信を記述するのが面倒なのでやめました。

移植の際に新しいBugを埋め込んだ可能性はあります。
一応、Canvizに付属していた何種類かのサンプルは概ね動いていることは確認しています。

License
--------

MIT License です。
GitLab4.2をお引っ越しする

#GitLab移設計画
都合によりGitLabサーバを移設しなければならなくなったので、その作業メモを残しておきます。GitLabのバージョンは4.2です。次はバージョンアップしたいのですが、機能差分の把握も含め大変そうです。。。
##参考URL
http://d.hatena.ne.jp/jin_kojima/20130820/1376980652
GitLabにはバックアップとリストアのタスクがあるので、それ一発で済むのかと思ったら甘かったです。
##バックアップデータの転送
バックアップはそのまま行けました。

```
sudo -u gitlab bundle exec rake gitlab:backup:create RAILS_ENV=production
```

すると、下記のようなファイルができます。
`/home/gitlab/gitlab/tmp/backups/1394392385_gitlab_backup.tar`
こいつをscpで移行先のサーバの下記フォルダに転送します。
`/home/gitlab/gitlab/tmp/backups`

##リストア
GitLab4.2を初期インストールした状態でリストアを行います。
まずはbackup.rakeにバグがあるので、下記URLを参考にパッチをあてます。
https://github.com/gitlabhq/gitlabhq/issues/3077

/home/gitlab/gitlab/lib/tasks/gitlab/backup.rakeの160-161行目を下記のように変更します。

```
path_to_repo = File.join(repos_path, project.path_with_namespace + ".git")
if Kernel.system("git clone --bare #{path_to_bundle} #{path_to_repo} > /dev/null 2>&1")
```

新しいサーバでバックアップデータをリストアします。数字のところだけ指定するのがコツです。

```
sudo -u gitlab bundle exec rake RAILS_ENV=production gitlab:backup:restore BACKUP=1394392385
```

##後処理
rakeコマンドでリストアが終わっただけではだめだめでした。試行錯誤して下記の手順で本番はやりましたが、もっといい方法があったら教えてください。

###チェック
チェック結果は必ずエラーが含まれるので、ファイルにリダイレクトしておくことにしました。

```
sudo -u gitlab bundle exec rake gitlab:check RAILS_ENV=production > /tmp/result
```

###post-receiveフックのリンクを作成
lnコマンドで作成するよう大量にエラー出力されました。Gitリポジトリのオーナがgitlabになっていたので、オーナ修正とリンク作成を下記コマンドで実行しました。

```
find /home/git/repositories -name "*.git" -print | xargs chown -R git:git #rootで実行
cat /tmp/result | grep ln > /tmp/make-post-recieve-hook.sh
chmod +x /tmp/make-post-recieve-hook.sh
/tmp/make-post-recieve-hook.sh
```

###satellites作成
satellitesを作成してリポジトリをアップデートします。

```
sudo -u gitlab bundle exec rake gitlab:satellites:create RAILS_ENV=production
sudo -u gitlab bundle exec rake gitlab:gitolite:update_repos RAILS_ENV=production
```

###SSH Keyのアップデート
GUIに表示されているSSHキーをgitoliteに認識させるために必要なようです。

```
sudo -u gitlab bundle exec rake gitlab:gitolite:update_keys RAILS_ENV=production
```

##最終チェック
もういちどrake gitlab:checkをかけて問題がなければ終了です。

```
sudo -u gitlab bundle exec rake gitlab:check RAILS_ENV=production
```

#バージョンアップは大変そう。。。
最新の安定版は6.6ですか！バージョンアップは大変そうです。。。いい情報がありましたら教えてください。
numpy tips



#配列周りの関数

|機能|コマンド|備考|
|---|---|---|
|リスト→配列|numpy.array(*リスト変数*)|変換元の変数はタプルでもOK|
|リスト→配列(型指定)|numpy.array(*リスト変数*, numpy.*データ型*)||
|配列→リスト|***ndarray***.tolist()||
|配列サイズ|***ndarray***.shape||
|配列次元数|***ndarray***.ndim||
|配列の要素数|***ndarray***.size|
|配列のバイト数|***ndarray***.nbytes||
|配列の内容|numpy.type(***ndarray***)||
|配列の変数型|***ndarray***.dtype||
|変数型の変更|***ndarray***.astype(numpy.*データ型*)||


# 配列の結合
dstack、hstack、vstackの3種類。それぞれの頭文字がdepth wise (along third axis)、horizontally (column wise)、vertically (row wise)を表している

以下の変数で試す

```python
>>> a = np.array((1,2,3))
>>> b = np.array([4,5,6])
>>> a
array([1, 2, 3])
>>> b
array([4, 5, 6])
```

## dstack
depth wise (along third axis)
転置してから結合ってことかな？

```python
>>> np.dstack((a,b))
array([[[1, 4],
        [2, 5],
        [3, 6]]])
```

## hstack
horizontally (column wise)

```python
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5, 6])
```

## vstack
vertically (row wise)

```python
>>> np.vstack((a,b))
array([[1, 2, 3],
       [4, 5, 6]])
```

#配列のソート
`ndarray.sort()`を利用すればいい。この場合、ndarray変数の中身がソートされる。
`numpy.sort(ndarray)`とした場合は、ソートした結果のコピーが返却される。
ちなみに、sortした場合のインデックスを返す`ndarray.argsort()`なんてのもある。
`ndarray.sort()`はsortする軸の指定があるので、実行時に注意が必要。

以下の変数をソートしてみる

```python
>>> hoge = np.array([[1,3,2],[6,5,4],[9,7,8]])
>>> hoge
array([[1, 3, 2],
       [6, 5, 4],
       [9, 7, 8]])
```

通常のソート。
行ごとにソートが走る。

```python
>>> np.sort(hoge)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

```

axisを使えば、列ごとにソートする。

```python
>>> np.sort(hoge, axis=0)
array([[1, 3, 2],
       [6, 5, 4],
       [9, 7, 8]])
```

Structured Arraysにして配列に名前つければ、特定の列指定でソートできるみたい。
しかし、Structured Arraysを上手く作る方法がわからん・・・


*numpyデータ型一覧
調べたら書く
10.9.2 にpearをインストールしてみた

インストール
===========

```bash:pearのインストール
$ curl -O http://pear.php.net/go-pear.phar
$ sudo php -d detect_unicode=0 go-pear.phar
Enter押下。
```

PATHの追加
===========

php.ini
----------

```bash:php.iniにinclude_pathを記述
$ sudo cp -p /etc/php.ini.default /etc/php.ini
```

```diff:php.ini
+ include_path = ".:/Users/owner/pear/share/pear/"
```

pear
--------

```bash:~/.profile
export PATH=$PATH:/Users/owner/pear/bin/
```

パッケージのインストール
================

```bash:Mail_mimeDecodeのインストール例
$ sudo pear install -a Mail_mimeDecode
```
PythonでListの論理和を取る(zip関数)

統計モデル用の特徴行列を作る時にListの論理和を取ろうとしたら、いろいろ悩んだのでメモしとく。

先に結果だけ書くと、次の様に書けばいい

```python
>>> list1 = [1, 1, 0, 0]
>>> list2 = [1, 0, 1, 0]
>>> 
>>> #論理和
>>> [max(t) for t in zip(list1, list2)]
[1, 1, 1, 0]
>>> 
>>> #論理積
>>> [min(t) for t in zip(list1, list2)]
[1, 0, 0, 0]
```

 
 
上記の方法では、zip関数を使っている。
zip関数は、複数のリストをindexの位置毎にタプルにしてくれる。

```python
>>> list1 = [1, 1, 0, 0]
>>> list2 = [1, 0, 1, 0]
>>> zip(list1, list2)
[(1, 1), (1, 0), (0, 1), (0, 0)]
>>> 
>>> #3つ以上のListでも作れる
>>> zip(['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i', 'j', 'k', 'l'])
[('a', 'e', 'i'), ('b', 'f', 'j'), ('c', 'g', 'k'), ('d', 'h', 'l')]
>>> 
>>> #長さが異なるListが混じってる場合、最短のListの長さまでしか作られない
>>> zip(['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i', 'j'])
[('a', 'e', 'i'), ('b', 'f', 'j')]
```
iOS/Androidのブラウザ開いた時に、URLスキームが存在すればアプリ・存在しなければマーケットを開く方法

Androidだとそれ用の書き方があるからいいんだけど、iOSだとJSでやるしかなさげ。


### Androidの場合
```html
"intent://hoge.com#Intent;scheme=get-hoge;package=com.hoge.activity;end"
```

### iOSの場合
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>iOSで開いた時に、URLスキームが存在すればアプリを開く、存在しなければAppStoreを開く</title>

  <script type="text/javascript">
    $(function(){
      var userAgent = navigator.userAgent.toLowerCase();
      if (userAgent.search(/iphone|ipad|ipod/) > -1) {
        // Launch myapp via URL scheme
        launch_frame.location.href= "myapp://";

        setTimeout(function(){
          // Open App DL page in iTunes Store
          location.href= "itmss://itunes.apple.com/us/app/myapp/id99999999?ls=1&mt=8";
        } , 500);
      }
    });
  </script>
</head> 
<body>
  <div style="width:0; height:0; overflow:hidden;">
  <iframe id="launch_frame" name="launch_frame">
  </iframe>
  </div>
</body> 
</html>
```
pythonのenumerate関数

pythonでenumerate関数を使うと、拡張forループを回す時に、indexを一緒に返してくれる。


```python
>>> for i, s in enumerate(['a', 'b', 'c']):
...     print i, s 
... 
0 a
1 b
2 c
>>> 
>>> for i, s in enumerate([('a', 'b'), ('c', 'd'), ('e', 'f')]):
...     print i, s
... 
0 ('a', 'b')
1 ('c', 'd')
2 ('e', 'f')
```

今のところ使う予定ないけど、面白そうだったので。
sedって-eで置換命令を追加できるんですね

```bash:sample.txt
Date: Tue, 04 Mar 2014 05:23:05 +0900
```

```bash:
$ sed -e 's/2014/2015/' -e 's/Mar/Oct/' sample.txt
Date: Tue, 04 Oct 2015 05:23:05 +0900
```
SublimeText3でHTML5の構文チェック


SublimeText3でHTML5の構文チェックを行うためのプラグイン **SublimeLinter-HTML-tidy** のインストール方法について解説します。

なお以下はMacでの作業内容です。

# 前提として"tidy-html5"が必要

## tidy-html5とは？

>HTML Tidy は、妥当ではない HTML文書を修正しそのレイアウトと字下げスタイルを良く整えることを目的とする、コンピュータプログラムでありまたライブラリとして使うことができるソフトウェアである。
*via [HTML Tidy - Wikipedia](http://ja.wikipedia.org/wiki/HTML_Tidy)*

tidy-html5は、このHTML5版ですね。
W3C開発なので安心です。
[w3c/tidy-html5](https://github.com/w3c/tidy-html5)

# tidy-html5のインストール
brew等を使わず直接インストールする方法です。

```Bash
git clone https://github.com/w3c/tidy-html5
cd tidy-html5
make -C build/gmake/
sudo make install -C build/gmake/
```

# パスの優先度変更

tidyはMacだとデフォルトで入っているようなので、/usr/local/binを優先するよう設定を変更しておきます。

```Bash
sudo vi /etc/paths
```

```Text:paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
```

[Mac - PATHの通し方 - Qiita](http://qiita.com/tk3fftk/items/8b389c0e4b1f9c64ebe3)

## 確認
以下のように表示されたら成功です。

```Bash
$ tidy -v
HTML Tidy for HTML5 (experimental) for Mac OS X https://github.com/w3c/tidy-html5/tree/c63cc39
```

# SublimeLinter-HTML-HTML-tidyのインストール

[SublimeLinter/SublimeLinter-html-tidy](https://github.com/SublimeLinter/SublimeLinter-html-tidy)

コマンドパレットからインストールして、SublimeText3を再起動します。

# 厳密なチェックでないことに注意
たとえばHTML5ではa要素にはインタラクティブ要素を含めることができないと規定されているので、
button要素を含めることはできませんが、以下の構文はエラーになりません。

```HTML:HTML5
<a href='/'><button>ボタン</button></a>
```

# 厳密チェックにはW3CValidators

[W3CValidatorsがSublimeText3で動かなかったので動くようにした - Qiita](http://qiita.com/maccotsan/items/3dc4d16b836b1213f11a)

# 参考

[Vim - HTML5 を手元でチェック・整形する - Qiita](http://qiita.com/janus_wel/items/852b6816827e58a6f0c6)
W3CValidatorsがSublimeText3で動かなかったので動くようにした


# W3CValidatorsとは

[【Sublime Text2】W3Cのバリデーションチェックができるパッケージ「W3CValidators」 | バシャログ。](http://c-brains.jp/blog/wsg/13/12/26-100000.php)


[dubharmonic/Sublime-W3CValidators](https://github.com/dubharmonic/Sublime-W3CValidators)

# はじめてのPython
初めて触るPythonだったけど単純なソースだったので直してみることにした。
結果的には主にPython2 -> 3の対応。

公式のリファレンスを参考に。
[API Reference - Sublime Text 3 Documentation](http://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.ApplicationCommand)
[Porting Guide - Sublime Text 3 Documentation](http://www.sublimetext.com/docs/3/porting_guide.html)

あとPython 2 -> 3の以降ガイド。
[Python 3 Porting Guide — Porting to Python 3 v1 documentation](http://docs.pythonsprints.com/python3_porting/py-porting.html)

## 変更内容
urllibの仕様変更と、リクエスト送受信時はバイナリでエンコード/デコードしなきゃいけなくなった模様。

参考：
[Python 3.x: urllib.request error - Stack Overflow](http://stackoverflow.com/questions/7081488/python-3-x-urllib-request-error)

```Diff
-    encodedParams = urllib.urlencode(params)
-    output = urllib.urlopen(validatorUrl, encodedParams).read()
+    encodedParams = urllib.parse.urlencode(params)
+    binary_data = encodedParams.encode('utf-8')
+    output = urllib.request.urlopen(validatorUrl, binary_data).read().decode("utf-8")
+    
```

# インストール

以下からダウンロードして手動インストール後、SublimeText3を再起動してください。

[ksz/Sublime-W3CValidators](https://github.com/ksz/Sublime-W3CValidators)

```Bash:Macの場合
git clone https://github.com/ksz/Sublime-W3CValidators
mv Sublime-W3CValidators ~/Library/Application Support/Sublime Text 3/Packages/
```
ChromeAppsを最前面に表示したいんだ。

# ChromeAppsを常に最前面に表示したい！

何がしたいかはお察しください…常に最前面に置いておきたいアプリってあるよね。


# そんな前例あったっけ

ChromeAppsっでは今のところ見たことが無いような…

# ほんとにできるの?

とりあえず http://developer.chrome.com/ を見てみましょう…windowのことだし[chrome.app.window](https://developer.chrome.com/apps/app_window)辺りが怪しいよな…

# あった！
`setAlwaysOnTop`なんていうオプションがあるじゃないすか！
どうやら使うには`alwaysOnTopWindows`っていうパーミッションが必要らしい。

bool型で指定してやるらしい。要するにtrueかfalseだね。

# 試してみよう！

今回はgithubにGoogleが用意してるサンプルから[Twitter-webview-client](https://github.com/GoogleChrome/chrome-app-samples/tree/master/twitter-webview-client)を借用させてもらいます。

## まずはパーミッションを追加しよう

```manifest.json
{
  "name": "Sample of a Twitter Client",
  "description": "Twitter Client in a WebView.",
  "version": "0.2",
  "app": {
    "background": {
      "scripts": ["src/background.js"]
    }
  },
  "permissions": [ "webview" , "alwaysOnTopWindows"]
}
```

## 起動時にフラグを立てよう

```src/background.js
"use strict";

chrome.app.runtime.onLaunched.addListener(function () {
    chrome.app.window.create('../html/window.html', {
        'id': 'main-view',
        'width': 450,
        'height': 500,
        'minWidth': 450,
        'minHeight': 500,
        'alwaysOnTop': true
    });
});
```

## 読み込んでみよう

AppsDeveloperTool(chrome://flagsから有効化)でパッケージ化されていない…で読み込んでやった。もちろんchrome://extensionsからでもOK.

## なんか怒られた
> 
<div class="install-warnings item">
              <span i18n-content="extensionSettingsInstallWarnings">この拡張機能をインストールしようとしたときに、次の警告がありました。</span>
              <ul><li>'alwaysOnTopWindows' requires Google Chrome dev channel or newer, but this is the stable channel.</li></ul>
            </div>


![Error](https://qiita-image-store.s3.amazonaws.com/0/23997/a0a39ac8-339d-0ceb-3a19-828cc1058d71.png)

どうやらstableチャンネルではこの機能は使えないらしい…

それって ***実用的じゃない!!***

## とりあえずリベンジ
こういう時は共存させてるChromiumなりChrome Canaryなりの出番ですね。

同様にロードしてやる。

今度は問題なく読み込めたみたい。

起動をクリックしてみる。

ちゃんと出るね。

ほかの窓で覆おう。

隠れない。

よし！成功!

# そういやAppWindowにもあったよな

AppWindowからもON/OFF出来るんだ。とりあえずコンソールから試してみよう。

```js
chrome.app.window.get("main-view").setAlwaysOnTop(true)
```

って打ってやると最前面、`false`にしてやると解除される筈だ。

出来たかな。

# あくまでもまだ開発中らしい

なんかこの作業を繰り返していたら最前面に居てくれなくなっちゃったよ……
バグはあるみたいだけど、とりあえずやりたいことは出来そう。
mochaで各テストごとにテストデータを設定してbeforeEachで使う

微妙に違う処理を`beforeEach`でまとめたいんだけど、テストごとにデータ設定してもどうやって参照すればいいの・・・
なときに使えるスニペット。
テストのオブジェクトにプロパティ追加してるのが少し気になるけど、現状これ以上にスマートなやり方を思いつけない。

```js:test.js
var message;

function setMessage(str) {
  message = "Hello " + str + "!";
}

describe('メッセージのセット', function() {
  beforeEach(function() {
    setMessage(this.currentTest.testData);
  });
  
  it('hoge', function() {
    expect(message).to.equal('Hello hoge!');
  }).testData = 'hoge';
  
  it('fuga', function() {
    expect(message).to.equal('Hello fuga!');
  }).testData = 'fuga';
});
```
Tomcatのmanager機能を使ってmavenでデプロイする

# Tomcatのmanager機能を使ってmavenでデプロイする

デプロイ作業を簡略化して楽に開発を行う


## tomcat-users.xmlを修正してroleとuserを作成する

${TOMCAT_DIR}/conf/tomcat-users.xml

私の環境だと/usr/share/tomcat/conf/tomcat-users.xml

```

<tomcat-users>
  <role rolename="manager-script"/>
  <user username="あなたのユーザネーム" password="あなたのパスワードをSHA-1で暗号化した物" roles="manager-script"/>
</tomcat-users>

```

<tomcat-users>タグは元々あるので、中を追加する


## pom.xmlにtomcat7-maven-plugin追加(6なら6を追加)

```
          <plugin>
              <groupId>org.apache.tomcat.maven</groupId>
              <artifactId>tomcat7-maven-plugin</artifactId>
              <version>2.2</version>
              <configuration>
                  <server>適当なサーバ名</server>
                  <url>http://localhost:8080/manager/text</url>
              </configuration>
          </plugin>
```

server.xmlにdigest='sha-1'追加

```
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase" digest="sha-1"/>
      </Realm>
```

Catalina/localhost/manager.xml 
```
<Context path="/manager" docBase="${catalina.home}/webapps/manager"
  debug="0" privileged="true">
  <Valve
    className="org.apache.catalina.valves.RemoteHostValve"
    allow="127.0.0.1|192.168.1.*" />
</Context> 
```

Catalina/localhost/host-manager.xml 

```
<Context path="/host-manager" docBase="${catalina.home}/webapps/host-manager"
  debug="0" privileged="true">
  <Valve
    className="org.apache.catalina.valves.RemoteHostValve"
    allow="127.0.0.1|192.168.1.*" />
</Context> 
```


## 設定ファイルに接続の為の設定を記載する


${.M2_HOME}/settings.xml
なければ作る

```
<settings>
  <servers>
    <server>
      <id>pom.xmlに書いた適当なサーバ名</id>
      <username>あなたのユーザネーム</username>
      <password>あなたのパスワード</password>
    </server>
  </servers>
</settings>
```

後は、mvn tomcat7:deployでOK
update-alternativesで、 ld.bfd と ld.gold の切り替え

あらまし
=======

開発時に、`/usr/bin/ld`を、`ld.bfd`(GNU ld、昔からある)と`ld.gold`(GNU gold、近年新しく追加された)を切り替える必要があった。

`apt-get install binutils`した直後は`/usr/bin/ld -> ld.bfd`とシンボリックリンクされている。
`ld.gold`を使いたいなら、これを`ld.gold`にシンボリックリンクしなおせば良い。

が、 **なんかスマートじゃない** ので、もうちょっと良い方法を探してみる。

環境
====

* Ubuntu 12.04 LTS 32bit, 64bit

本題
====

答えはWebKitのページから見つかった。
http://trac.webkit.org/wiki/WebKitGTK/SpeedUpBuild

以下のようにすれば、`ld.bfd`と`ld.gold`を切り替えられるようになる。

```bash
$ sudo update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.gold" 20
$ sudo update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.bfd" 10
```

```bash
$ sudo update-alternatives --config ld # どれにするか聞いてくる
```

```bash
$ sudo update-alternatives --set ld /usr/bin/ld.bfd # 明示的に設定
```

注意
----

http://trac.webkit.org/wiki/WebKitGTK/SpeedUpBuild
> Be aware that colorgcc might cause linking issues when using ld.gold. 

と書いてあるので、`colorgcc`をお使いの方はご注意ください。

結び
====

不幸にも`ld`がGNU goldを期待するプロジェクトと、
`ld`がGNU ldを期待するプロジェクトの双方を期待されているときは上記を使うと少し幸せになるかも。

参考
====

* http://trac.webkit.org/wiki/WebKitGTK/SpeedUpBuild
    * 下の方に`ccache`, `distcc`, `icecc`など、ビルド効率アップにつながるツールが書いてある。お勧め。

* http://www.gnu.org/software/binutils/
    * GNU ld, GNU gold も`binutils`に含まれるソフトウェアの1つらしい