OmniAICreator/Qiita-1.07M huggingface dataset:
R で文字列を POSIX time に変換するには lubridate::parse_date_time2() がちょっぱや #rstatsj

こういう話がある。

> 日時を表す文字列を内部形式に変換する as.POSIXct() が遅すぎてどうにもなりません。

https://oku.edu.mie-u.ac.jp/~okumura/stat/datatable.html

リンク先での解決策は `fasttime` パッケージを使えということですが、`fasttime` は CRAN に登録されておらず、RForge からインストールしなければなりません。

そこでみなさんに朗報です。
`lubridate` パッケージには `fasttime` から引き継いだ高速に POSIX time に変換できる関数が備わっています。

> Lubridate has an inbuilt very fast POSIX parser, ported from the fasttime package by Simon Urbanek.

http://cran.r-project.org/web/packages/lubridate/lubridate.pdf

ここでは、従来の変換方法(`strptime()`, `as.POSIXlt()`, `as.POSIXct()`) と `lubridate` の高速変換関数(`fast_strptime()`, `parse_date_time()`, `parse_date_time2()`) の速度を比較してみます。

まずは、POSIX time に変換するための日付の文字列データを作成します。
データ作成には `easyRFM` パッケージの `rfm_generate_data()` 関数で生成したデータの `date` のみを取り出して使用します(参考：[R でランダムに日付を生成する](http://qiita.com/hoxo_m/items/8c98f6b5282576f72147))

```r:R
library(easyRFM)

data <- rfm_generate_data(10000, date_type = "POSIXlt")
dates <- as.character(data$date)
head(dates, 3)
```

```:結果
[1] "2014-12-23 11:55:49" "2014-12-20 13:10:27" "2014-12-30 11:36:13"
```

速度比較には `microbenchmark` パッケージを使用します(参考：[Performance - Advanced R.](http://adv-r.had.co.nz/Performance.html))

```r:R
library(lubridate)
library(microbenchmark)

format <- "%Y-%m-%d %H:%M:%S"
microbenchmark(
  strptime(dates, format),                    # POSIXlt
  as.POSIXlt(dates),                          # POSIXlt
  as.POSIXct(dates),                          # POSIXct
  fast_strptime(dates, format),               # POSIXct
  parse_date_time(dates, format, locale="C"), # POSIXct
  parse_date_time2(dates, format)             # POSIXct
)
```

```:結果
Unit: milliseconds
                                         expr        min         lq       mean     median         uq        max
                      strptime(dates, format) 119.282499 121.572364 125.532569 123.448221 126.284024 226.923822
                            as.POSIXlt(dates) 356.200412 361.551208 370.189893 366.233237 373.489523 482.525819
                            as.POSIXct(dates) 461.641756 470.231105 479.100893 475.003683 483.682588 527.847680
                 fast_strptime(dates, format)   1.754354   1.842088   1.994004   1.935617   2.024675   4.292026
 parse_date_time(dates, format, locale = "C")  12.997912  13.606424  14.342025  13.951237  14.918299  18.339108
              parse_date_time2(dates, format)   1.409045   1.486185   1.667954   1.589646   1.697741   3.779194
```

結果は、`lubridate` の `parse_date_time2()` 関数がちょっぱやという結果になりました。

enjoy!
Ruby で HTTP ステータスコード一覧を出力するワンライナー

```bash
$ ruby -r rack/utils -e 'Rack::Utils::HTTP_STATUS_CODES.each_pair { |code, desc| puts "#{code} #{desc}" }'
```

```
100 Continue
101 Switching Protocols
102 Processing
200 OK
201 Created
202 Accepted
...
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected
510 Not Extended
511 Network Authentication Required
```

HTTP ステータスコード一覧、Rack の Rack::Util モジュールに定数定義されている（[コード該当箇所](https://github.com/rack/rack/blob/master/lib/rack/utils.rb#L581)）ので、それを引っ張ってきているだけ。
peco にリダイレクトして絞り込みとかできる。

## REF
- [httpstatus コマンドで、HTTP のステータスコードをすばやくしらべる! - blog.64p.org](http://blog.64p.org/entry/2013/02/21/121830)
 - Perl の App::httpstatus モジュール
 - この記事にインスパイアされた
gitでパスワードを毎回聞かれる問題の解決方法

# gitで毎回パスワード聞かれて困った

公式が記事を出しています、そちらを参考にしてください
2015年に投稿してから9年間、この記事を見ていただきありがとうございました。

https://docs.github.com/ja/enterprise-server@3.10/get-started/getting-started-with-git/why-is-git-always-asking-for-my-password

原因：<b><font color="red">https通信だったので毎回聞かれる</font></b>

## 解決策：httpsではなく`Use SSH`の方を利用する
リポジトリの `clone or download` を押すと `Clone with HTTPS` という文字が表示されるはず。
この右上の `Use SSL` をクリックし、出てきたURLをコピーする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69647/f6f70842-c8b0-2fc1-e418-74b67bc5c17d.png)

あとはターミナルから以下のコマンドを実行したら完了

```zsh:sshを用いてgitと通信を行うように設定するコマンド
git remote set-url origin コピーしたものをここに貼り付け
```

あとは以下の記事を参考に、`git hub`に公開鍵を登録したら完了です

<a href="https://qiita.com/shizuma/items/2b2f873a0034839e47ce">GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~</a>


以下はこれでもわからなかった人向けドキュメントです。
うまくいかない際のデバッグ方法について書いてあります。

## 現状把握：https通信を使ってしまっていないかチェック
現在git管理利用しているディレクトリで以下を実行する

```
git remote -v
```
```
origin	https://github.com/keisuke2236/temp.git (fetch)
origin	https://github.com/keisuke2236/temp.git (push)
```

このように `https://github.com` で始まっていると毎回パスワードを聞かれてしまう。


## gitにパスワードを毎回聞かれないようにするコマンド
`https通信` ではなく `sshプロトコル` で通信するように設定します。


```zsh:git_remote_-vを打つと出て来るこれ
https://github.com/keisuke2236/CODE-COFFEE.git
```

``` zsh:前半のこの部分を
https://github.com/　　　　　　　　　　　　　　　　　keisuke2236/CODE-COFFEE.git
```

```zsh:これに置き換える
git@github.com:             keisuke2236/CODE-COFFEE.git
```

```zsh:完成形
git@github.com:keisuke2236/CODE-COFFEE.git
```


これでgitに毎回パスワードを聞かれなくなるコマンドが完成。


## 以下のコマンドを実行すれば毎回パスワードを聞かれなくなります。

```zsh:git_command
git remote set-url origin git@github.com:keisuke2236/CODE-COFFEE.git
```

`git@github.com:keisuke2236/CODE-COFFEE.git` この部分は適宜自分のリポジトリに書き換えてください。

## sshプロトコル通信に変更できたかチェック

```zsh:変更されたかどうかこのコマンドでチェック
git remote -v
```

```zsh:結果
origin	git@github.com:keisuke2236/startPage (fetch)
origin	git@github.com:keisuke2236/startPage (push)
```

`git@github.com:`で始まるssh接続に変更されていることができたら成功。

これでssh通信になっていますので、これでgitに毎回パスワードを打たなくても良くなります。

##gitにパスワードを毎回聞かれなくなっているかチェック
```zsh:git_password_Check
git push origin master
```

```zsh:結果
Everything up-to-date
```
もう全部アップデートされてますと、gitにパスワードなしでpushできることが確認できました。
Railsでlink_toの中にHTMLを入れ子で入れる

Railsのテンプレートの「link_to」でHTMLのタグを入れたい場合。

以下のような記述だとエラーになります。

```erb
<%= link_to "<i class="MyClass"></i><em>リンク</em>", :session, method: :delete %>
```

「文字列.html_safe」という方式が使えないので、HTMLの入れ子で入れる場合には以下のようにします。


```erb
<%= link_to :session, method: :delete do %>
<i class="MyClass"></i><em>リンク</em>
<% end %>
```

尚、HTMLの表示では以下のようになります。

```html
<a rel="nofollow" data-method="delete" href="/session">
<i class="MyClass"></i><em>リンク</em>
</a>
```
いい感じにtopコマンドを表示

# topコマンドを かっちょよく :sparkles: 表示してみよう
紹介する方法は、私が普段よく利用している方法です。（一例）
topコマンドはいろいろとオプションがあるので各々のやり方があると思います。

## では、まずおもむろにtop
普通ですね

![Screenshot from 2015-02-17 18^%23^%24.png](https://qiita-image-store.s3.amazonaws.com/0/53494/18e15f7d-f929-83c1-3900-a9781b081c1f.png)

## そして 「z」
色がつきます

![Screenshot from 2015-02-17 18^%23^%59.png](https://qiita-image-store.s3.amazonaws.com/0/53494/20d46d24-5f5a-0727-7fe6-a7d8774473a5.png)

## そして 「x」
もっと色が付きます

![Screenshot from 2015-02-17 18^%24^%20.png](https://qiita-image-store.s3.amazonaws.com/0/53494/ed8c2b94-5aca-2a82-9032-f8956f73ef7a.png)

## さらに　「c」
コマンドが全部でました!（COMMANDのところに注目）

![Screenshot from 2015-02-17 18^%40^%02.png](https://qiita-image-store.s3.amazonaws.com/0/53494/ae48f1fa-84a9-15f0-0b8d-49b970c33619.png)


## ほげほげで、ソートしたいなーという時は 「shift + < 」or 「shift + >」でカーソル移動
色が付いているからどこでソートしているかわかりやすいですね。
shit + M で％MEMでソートとかショートカットあるけど覚えられないのでこのコマンド使ってます。

![Screenshot from 2015-02-17 18^%26^%23.png](https://qiita-image-store.s3.amazonaws.com/0/53494/09d9cdcb-7fb2-618c-2923-07dd814ec21a.png)

# まとめ
いまのところこの使い勝手で困ってないので、よければ参考にどうぞ。
（人それぞれ好みがでるとこですね）
ゲストＯＳ(ubuntu)からホストＯＳ(windows)の共有フォルダにアクセスする



VMWareToolsを使うと簡単
[VMware player で共有フォルダ設定の仕方]
(http://www.atmarkit.co.jp/flinux/rensai/linuxtips/756fstabnum.html)


以下、手作業で設定する。ただし、

* 最新版のubuntuでも有効かどうかは未確認
* ディレクトリ名とかは環境に合わせる
* kernel2.6以降


1. __windows共有フォルダを作成する__

    [ドライブのルートを共有する方法]
    (http://windows.microsoft.com/ja-jp/windows7/how-do-i-share-the-root-of-a-drive)（Win7）

    [他のユーザーとファイルを共有する](http://windows.microsoft.com/ja-jp/windows/share-files-with-someone#1TC=windows-7)（Win7）

    > Vistaより前のバージョンなら、共有フォルダ名に$（ドル）をつけると外部からエクスプローラで見えなくなる
[最後に「$」文字で、共有名は表示されません。](http://support.microsoft.com/kb/90929/ja)

1. __sambaをインストール__

    インストール確認

    ```shell-session
which smbclient
```
     なければインストール

    ```shell-session
apt-get install samba
```
1. __マウントポイントを作成する__

    ```shell-session
mkdir -p /volumes/hogedir
```

1. __mountできるか確認__
 
    ```shell-session
mount -t cifs -o username=hoge,password=hoge,uid=1000,gid=1000,codepage=cp932,iocharset=utf8 //hostname/shared /volumes/hogedir
```
> linuxからwindows共有フォルダへのマウントは、cifs でマウントする（kernel2.6以降）

    マウントできなかったとき、`dmesg | grep CIFS` でエラーコード確認
22のときは、//hostname/ を IPアドレスに変えてみる

    マウントできたら、マウントポイントに cd して ls でファイル一覧が出るか確認する。
 
1. __起動時にマウントする__

    viなどで/etc/fstabを開く
    
    ```shell-session
sudo vi /etc/fstab
```

    > [vi コマンドリファレンス](http://hp.vector.co.jp/authors/VA016670/unix/vi_reference.html)

    最終行に以下を追加して保存

    ```shell-session
//hostname/shared /volumes/hogedir cifs username=hoge,password=hoge,uid=1000,gid=1000,codepage=cp932,iocharset=utf8 0 0
```

    > [/etc/fstabに記述されている数字の意味](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/756fstabnum.html)
 
    4.で行ったマウントを削除する

    ```shell-session
umount -a -t cifs
```
 
    /etc/fstabで追加したマウントが正しいか確認

    ```shell-session
mount -a -t cifs
```
 
    マウントポイントに移動して ls で確認
cocos2d-js でアニメーションを読み込む関数書いた

最近 cocos-2d-js やってて、パラパラアニメを読み込むのが面倒だなと思って書いた。
cc.SpriteFrame の配列作って cc.AnimationCache に追加してくだけ。
enchant.js はこういうの用意してた気がするんだけど cocos2d もじつはあったりするのかなぁ。
（追記: plist っていうのを作ってもらえば SpriteFrame 使ってらくできる模様。けど今エフェクト作ってもらってる形式がパラパラアニメな png なので）

```javascript
var loadAnimation = function (animation_name, width, height, turn_point, count, delay_time, image_path) {
    var x_count = 0;
    var y_count = 0;
    var frames_array = [];
    for (var i = 1; i < count; i++ ) {
        var current_x = width  * x_count;
        var current_y = height * y_count;

        var frame = cc.SpriteFrame.create(
            image_path,
            cc.rect( current_x, current_y, width, height )
        );
        frames_array.push(frame);

        if ( turn_point == 1 || i % turn_point == 0 ) {
            x_count = 0;
            y_count++;
        }
        else {
            x_count++;
        }
    }

    var animation = cc.Animation.create(frames_array, delay_time);
    cc.AnimationCache.getInstance().addAnimation(animation, animation_name);
};
```

使うときはこんな感じ

```javascript
loadAnimation("a", 320, 240, 3, 15, 1/20, "parapara_anime.png");
var anim_cache = cc.AnimationCache.getInstance();
var a = anim_cache.getAnimation("a");
a.setRestoreOriginalFrame(true);
var anim = cc.Animate.create(a);
var anim_sprite = cc.Sprite.create();
anim_sprite.setTextureRect(cc.rect(0, 0, 320, 240));
anim_sprite.setPosition(200, 200);
this.addChild(anim_sprite);

anim_sprite.runAction(cc.RepeatForever.create(anim));
```
CentOS7 + systemd + Docker でインフラCIをやっていく

やっていけそうなので手順をメモします。

### systemdが動くCentOS7ベースイメージを探す

* 結論

```dockerfile
FROM tukiyo3/centos7-ja-systemd

# 必要に応じ
RUN yum -y install systemd-libs-208-11.el7_0.4 systemd-sysv-208-11.el7_0.4
RUN echo 'exclude=systemd*' >> /etc/yum.conf
RUN yum -y update

# ...　あとは自分のプロビジョン手順をやっていく
```

現状なら、こんな感じのDockerfileで行けると思う。

* 背景

まず、 [公式のCentOSイメージのとこに書いてある手順（Systemd integration のとこ）](https://registry.hub.docker.com/_/centos/) は、今のDockerのバージョンだと動かないみたいだな???

なので、成功する時代に作られた以下のイメージを使う。

* https://registry.hub.docker.com/u/tukiyo3/centos7-ja-systemd/tags/manage/

だがしかし、このイメージ内部でナイーブに `yum update` をすると、systemdもアップデートされるのでその際にインストールが失敗する。

```
error: unpacking of archive failed on file /usr/bin/systemd-detect-virt: cpio: cap_set_file
```

こんなん言われる。したがって `echo 'exclude=systemd*' >> /etc/yum.conf` とでもしてアップデートを抑止しなければならない。

また、その抑止作業は `systemd-libs` や `systemd-sysv` のインストールのあとで実行しなければならなく、そのバージョンはイメージに最初から入っている `208-11.el7_0.4` である。

### その後

いつもの（いつもの？）DockerベースインフラCIな感じでよかった。Puppetの例。 `/var/puppet` 配下に Puppet のプロジェクトを `ADD .` してます。


```bash
docker build --rm -t $IMAGE_NAME .
docker run -h ${role}.develop.ci --name=$CONTAINER_NAME --privileged -d $IMAGE_NAME
docker exec $CONTAINER_NAME /bin/bash -c \
    'cd /var/puppet && \
     RUBYOPT=-Eutf-8:utf-8 puppet apply --test --environment=development \
     --modulepath=modules:roles manifests/site.pp'
ret=$?
test "$ret" -eq "0" -o "$ret" -eq "2"

docker exec $CONTAINER_NAME /bin/bash -c \
    "cd /var/puppet && \
     RUBYOPT=-Eutf-8:utf-8 FORCE_EXEC=1 bundle exec rake spec:ci:${role}"
ret=$?
test "$ret" -eq "0"

docker stop $CONTAINER_NAME
# なんかたまにrmが失敗するのでアドホックで || true してる...
# なお run の段階で --rm してないのは調査用にコンテナを残すため
docker rm $CONTAINER_NAME || true
```

特記することなど：

* 以前書いた docker exec の [終了コードの件](http://qiita.com/udzura/items/cf0fb8322bb616a733a2) はもう直ってるようだ。
* `--privileged` じゃないとsystemdさんが立ち上がらないので大胆に行きましょう。CIだし... 細かく権限を与えても良いけど、調べるのが厳しい...。
* `RUBYOPT=-Eutf-8:utf-8` 環境変数を渡してるのは、ServerspecやPuppetがRuby 2.0（みなさん、CentOS7ですよ！）で動作するのでおまじない的な意味で。
    * たぶんDockerfileに書いても良いはずなんだが、なんかうまく行かない時があって...要確認。

### まとめ

やや強引（特にexcludeしたところが）なので、もっといい方法がある気がする...

----

### 追記


> `echo 'exclude=systemd*' >> /etc/yum.conf` とでもしてアップデートを抑止しなければならない。

こう言っていたが、 `yum-versionlock` プラグインを使った方がスマートだろう。

Dockerfile は以下のようになる。

```dockerfile
RUN yum -y install systemd-libs-208-11.el7_0.4 systemd-sysv-208-11.el7_0.4
RUN yum -y install yum-versionlock
RUN touch /etc/yum/pluginconf.d/versionlock.list && \
    echo 'systemd-208-11.el7_0.4'      >> /etc/yum/pluginconf.d/versionlock.list && \
    echo 'systemd-libs-208-11.el7_0.4' >> /etc/yum/pluginconf.d/versionlock.list && \
    echo 'systemd-sysv-208-11.el7_0.4' >> /etc/yum/pluginconf.d/versionlock.list
RUN yum -y update
# ...
```

### 更なる追記

* https://github.com/docker/docker/issues/6980

aufs の場合だけsystemdのアップグレードができないらしい。。 doot2dockerなんかはデフォルトがaufsである。一時的にdevicemapperを使うとかすれば良いかもしれない。
MacのターミナルからConoha VPSにSSHでログインする

## SSH Private Keyを取得
下記のサイトを参考に取得します。
https://www.conoha.jp/guide/guide.php?g=6

## ログイン
初期状態では下記のようにログインする

```
ssh -i keyのパス root@xxx.xxx.xxx.xxx
```
sshのパーミッションエラーが出る場合は

```
chmod 700 keyのパス
```
を一度実行した後、もう一度ログインする。
ActiveRecord::RecordNotFoundのエラーメッセージを翻訳する

# はじめに
railsでUser.find(9999)などで検索して指定したIDのデータがなかった場合、ActiveRecord::RecordNotFoundという例外が発生し、 "Couldn't find User with 'id'=9999"というエラーメッセージが出ます。

そのエラーメッセージをI18nで翻訳したいと思って調査したのですが、[ソース](https://github.com/rails/rails/blob/b06f64c3480cd389d14618540d62da4978918af0/activerecord/lib/active_record/relation/finder_methods.rb#L179)を確認すると直接エラーメッセージを書いているのでI18nのキーワードで翻訳出来ません。

ということで力技で翻訳してみました。

## ActiveRecord::RecordNotFoundをrescueする。
とりあえず今回はわかりやすくControllerのactionで直接例外をキャッチする例を使います。例外が発生した場合に統一した方法でレスポンスを返したい場合は独自のMiddlewareを作っても良いと思います。

````ruby
class UserController < ApplicationController

  def show
    begin
       @user = User.find(9999)
    rescue ActiveRecord::RecordNotFound => e
       # 翻訳処理を書く。   
    end
  end
end

````

## 例外メッセージを翻訳する
例外メッセージを翻訳するためのtranslate_record_not_foundメソッドを定義します。

````ruby
def translate_record_not_found(error_msg)
        match = error_msg.match(/^Couldn't find ([\S].*) with '([\S]*)'=([\S].*)$/)

        # モデル名を翻訳する
        t_model = I18n.t('activerecord.models.' + match[1].underscore)
        # 属性名を翻訳する
        t_attr  = I18n.t('activerecord.attributes.' + match[1].underscore + '.' + match[2])

        I18n.t('errors.messages.not_found',
               { klass: t_model, attribute: t_attr, value: match[3] })

end

````

翻訳用のja.ymlファイルを用意します。

````config/locales/ja.yml
ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        id: "ID"

  errors:
    messages:
      not_found: "%{klass}の%{attribute}=`%{value}`は見つかりません"

````

そして、先ほど例外をキャッチしていたactionにtranslate_record_not_foundメソッドを使って翻訳した例外メッセージで再度例外を発生させます。


````ruby
class UserController < ApplicationController

  def show
    begin
       @user = User.find(9999)
    rescue ActiveRecord::RecordNotFound => e
       raise ActiveRecord::RecordNotFound, translate_record_not_found(error_msg)
    end
  end
end

````

あとはほかの箇所で例外を補足してエラーメッセージを表示するとメッセージが翻訳されているはずです。
配列を使って複数のディレクトリにgulp.dest()する

# やりたかったこと

いくつかのファイルを複数のフォルダにコピーする処理を作りたかった。
`gulp.src()`のときは対象ファイルを配列で投げることができるが、`gulp.dest()`では引数として配列が使えない。

# 解決策


**追記@2015-02-23**

59nagaさんがより簡潔なやり方を教えてくれたので、そちらを追記します!

```coffeescript
gulp.task 'moduleSync', ->
  pathList = [
    # ここにコピー先のパスを書く。fs.readdir とかで動的にも作れる
    './target/hogePath1'
    './target/hogePath2'
    './target/hogePath3'
  ]
  stream= gulp.src [
    # ここにコピーしたいファイルを書く
    './source/item1.html'
    './source/item2.css'
    './source/item3.js'
  ]
  stream.pipe gulp.dest path for path in paths
```

### merge-streamを使った解決策(旧)

公式ページの例を参考にした実装
 [Generating a file per folder](https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-task-steps-per-folder.md)

* Array.map()を使う
* merge-streamモジュールを使用する

```coffeescript
merge = require 'merge-stream'

gulp.task 'moduleSync', ->
  pathList = [
    # ここにコピー先のパスを書く。fs.readdir とかで動的にも作れる
    './target/hogePath1'
    './target/hogePath2'
    './target/hogePath3'
  ]

  tasks = pathList.map (path) ->
    gulp.src [
      # ここにコピーしたいファイルを書く
      './source/item1.html'
      './source/item2.css'
      './source/item3.js'
    ]
    # 必要があれば途中に好きな処理を挟む
      # .pipe something()
      .pipe gulp.dest path

  # 最後にmerge-streamを使う
  merge tasks
```
意外とおろそかになる、要求確認を再認識

要求確認とは

要求仕様書の一貫性、完全性、正確性、実現可能性を確認するフェーズです。
一般的に要求確認のフェーズで上席者の参加が増える場合が多く、出戻りが多く発生するフェーズです。
出戻りを防ぐためには、要件抽出・分析時に上席者承認を行う事が大切です。
フェーズの後半で帳尻をあわせようとすると、だいたい破綻するので注意してください。

要求確認のポイントは下記一点につきます。
「何が確認できれば、要求仕様の妥当性を確認できたことになるか」という評価基準について関係者と合意しておく事。


では具体的に、どういった観点で確認がとれたと判断すべきなのでしょうか？下記に項目を並べます。
・要求の正確性：要求の記述が曖昧でないことを確認する。
・記述の最小性：要求の記述が重複していないか、設計段階で解決するようなことまで含めて詳細に記述しすぎていないかを確認する。
・外部環境との一貫性：業務やシステム環境、組織の中で要求が一貫しているかを確認する。
・要求の完全性：必要な要求がすべて記述されていることを確認する。
・要求の実現可能性：記述された要求を実現するために、技術的に開発可能であることと、必要な経費や開発期間、開発要員が用意できることを確認する。

次に、どのような手法を用いて要求確認を行えば良いかを列挙します。
・要求仕様のレビュー
　現在採用されている確認手法です。
　妥当性の確認基準を定めて対応するチェックリストを用意しておくと効率的で公平なレビュを実施できるという利点があります。
　裏を返せば、確認基準が曖昧な場合この手法は用いるべきではありません。

・プロトタイピング
　要求に基づいてシステムのプロトタイプを作成する手法です。
　相手に触ってイメージしてもらえるため、文書よりも深い議論が可能性になります。
　欠点としては、プロトタイプの作成に工数がかかる、プロトタイプのイメージに縛られるため、革新的なアイデアが生まれにくいといった点が上げられます。

・モデルの確認
　文書だけのレビューでなく、図を用いて確認する手法です。
　フローを追うことでロジックが明確になる半面、担当者に対してある程度の業務知識を要求します。

・要求テスト
　受け入れテスト仕様書と要求仕様を照らし合わせるパターン。

いかがでしたでしょうか？
要求確認はアイデアを生み出す場でなく確定させる場ですので、
このフェーズにおける最大の失敗は新しいアイデア、要求が発生する事です。
かと言っても上席者と要求確認をしていると・・・
・やっぱりこうした方が良くない？
・こういうのは出来ない？
と言われる事など日常茶飯事なはずです。
偉い人は忙しく、要求確認より前のフェーズに参加をする事が難しいのは理解出来ます。
ただ、結果的に早く要件定義を終わらせるためには偉い人を速いタイミングで巻き込んでいかなければいけない事を理解してください。
JavascriptでiPhone/Androidのソフトウェアキーボード出現を検出したい

# 概要

iOS/Androidのソフトウェアキーボードが出てきた時のイベントをaddEventListenerとかで検出したい

# 問題

色々調べたが、キーボードの出し入れに対するイベントは存在しないっぽい

# 代わりに

「キーボードが出てきた/引っ込んだ」というのは
input="text"とかにフォーカスが当たったか否かによるので

DOMFocusIn/DOMFocusOut
http://help.dottoro.com/ljuoivsj.php
というのが使えそうというのが調べてて分かった



```js:example.js
document.addEventListener("DOMFocusIn", function(event) {
    //キーボードが出現した時
}, false);
document.addEventListener("DOMFocusOut", function(event) {
    //キーボードが引っ込んだ時
}, false);
```


もうちょっと厳密にするには下記のようにする必要があるかもしれない
\#textareaもあればそっちも検知しないといけない
\#input typeもdateとかがページにあれば追加する必要があるかも…

```js:example.js
//input typeを限定する
var focuscheck_type = ["text", "search", "tel", "url", "email", "password"];

document.addEventListener("DOMFocusIn", function(event) {
    if(!event.target) {
        return;
    }
    var is_target = false;
    for(var i = 0; i < focuscheck_type.length; i++) {
        if(event.target.type === focuscheck_type[i]) {
            is_target = true;
            break;
        }
    }
    if(!is_target) {
        return;
    }

    //キーボードが出現した時の処理

    
}, false);

```

# 追記
下記のようなAndroidの一部端末において

- ARROWS NX F-02G(Android 4.4.2) - chrome
- GALAXY SC-02G(Android 4.4.2) - chrome

普通にaリンクを叩いた時もイベントが発生する場合があるのを確認できました。
やはり発生させるオブジェクトを限定させたほうが良さそう。。
sipsといういいコマンドをみつけた！

# sipsとは
コマンド名は sips 機械的な画像変換をすることができます

主な使い方は

```
sips [OPTION] [FILE PATH] [--out OUT FILE]
```

詳しくはこれを参照していただいた方が、わかりやすいです
http://d.hatena.ne.jp/toolkit/20060726/p1
http://d.hatena.ne.jp/oniloq/20121111/1352625190


以下は、日本語では、検索であまり引っかからなかった方法です
sipsのヘルプには英語でちょろっとのっています

##オプション（補足）
--padToHeightWidth pixelsH pixelsW :画像の領域のサイズ指定することができます
	例 sips --padToHeightWidth 108 108 INPUT.jpg --out OUTPUT.jpg
--padColor hexcolor :バックグラウンドの色を指定することができます。これは上のオプションと併用すると効果的かもしれません
	例 sips --padToHeightWidth 108 108 --padColor FFFFFF INPUT.jpg --out OUTPUT.jpg
Genymotion + Android Studio + Google Play

# 背景
* windows7に、Android Studioとgenymotionを試して、やったことを記述した


# virtualboxのインストールとアップデート
* DL
 * https://www.virtualbox.org/wiki/Downloads
* updateの問題
 * https://www.virtualbox.org/ticket/11567
* 対策
 * 新しいインストールファイルをDLして、インストールしよう

# Android Studioのインストールとアップデート
* http://developer.android.com/intl/ja/sdk/index.html
* update
 * Help -> check for update
* http proxy設定
 * http://www.jetbrains.com/idea/help/http-proxy.html

# genymotion登録
* https://www.genymotion.com/
* 右上の「Sign in」をクリックして、サインインページに、[create account]を押して、登録できる

# genymotion ダウンロード
* https://www.genymotion.com/#!/pricing
* 「Download」ボタンを
* Genymotionには無料版・有料版の2種類がありますが、通常の開発においては無料版で十分

# virtual deviceを追加
* genymotionを開ける
![genymotion_open.png](https://qiita-image-store.s3.amazonaws.com/0/13451/d9b18c09-acbd-aa3d-cf78-6e0018aec220.png)

* proxy設定
![genymotion_proxy.png](https://qiita-image-store.s3.amazonaws.com/0/13451/9302422b-8b58-923d-c1e1-7224471c13cd.png)

* ログイン
![genymotion_login.png](https://qiita-image-store.s3.amazonaws.com/0/13451/532b695c-2eb2-0f2b-8b8d-04f9b09ec921.png)

* virtual deviceを選択
![genymotion_add_device.png](https://qiita-image-store.s3.amazonaws.com/0/13451/1b7627fa-c730-7026-3cc9-f8af39bc7565.png)

* 追加完了
![genymotion_add_device_over.png](https://qiita-image-store.s3.amazonaws.com/0/13451/0683765c-9b5b-f432-7d22-2d767539074d.png)


# Google Playの導入
* 以下のファイルをダウンロードする
 * ARM Translation Installer v1.1
 * http://filetrip.net/dl?4SUOrdcMRv
 * gapps-lp-20141109-signed.zip
 * https://s.basketbuild.com/filedl/gapps?dl=gapps-lp-20141109-signed.zip
* ダウンロードしたファイルを解凍せず、virtual deviceにドラッグアンドドロップ

# Android Studioに、genymotionプラグインの導入
* File -> Setting -> 「plugin」で検索して、Pluginsをクリックする
![android_studio_genymotion_plugin.png](https://qiita-image-store.s3.amazonaws.com/0/13451/73388b48-c747-0585-5809-5137c887560c.png)

* [genymotion]で検索して、Browerをクリックして、インストールする
![android_studio_genymotion_plugin_install.png](https://qiita-image-store.s3.amazonaws.com/0/13451/b54952a0-bd4e-0d31-0f49-aaeb4b13ddbc.png)

* 設定：　genymotionの起動ファイルのパスを追加
![android_studio_genymotion_plugin_path.png](https://qiita-image-store.s3.amazonaws.com/0/13451/642016ba-1b7a-e8f7-38b6-2f0a482a2800.png)
公開鍵はどこで作成すべき？

(2015/02/18 追記)
続編（というなの結論修正）を書きました
⇛ [公開鍵はどこで作成すべき？（続）](http://qiita.com/satonasu/items/eb7d633f45506967980e)

-----

タイトルに対する結論を最初に書くと、

　**SSH の接続先**

で作成するのが、楽。
（正確には接続先の ~/root/.ssh/）

なぜそういう結論に至ったのか、
忘れないうちにメモしておこう。

## なぜか公開鍵認証が通らない

アクセス権や所有権の設定は間違いないはず。

```
mkdir -m 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```

うっかり忘れてしまうやつ。
これは何度も確認した。

iptables も確認したし、
パスワード認証を試すと通るから問題ないはず。

## もしかして： SELinux

いろいろ調べていく中で、SELinuxというワードを見て思い出した。

Disable にしていない！

きっとそのせいだ…と思いつつ試してみると、

```
:
debug1: Trying private key: ***_rsa
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
```

通った…。

だがしかし納得がいかない。

どのみち SELinux は Disable にするから問題は解決するんだけど、
なぜ通らないのか気になるので調べていたら、

> ssh-keygen コマンドや ssh-copy-id コマンドなどで ~/.ssh 直下に公開鍵を"直接"作成した場合などは問題ありませんが、別のホストから持ってきた公開鍵を一時的にどこかのディレクトりに配置してから ~/.ssh に移動した場合は sshd(sshd_t)から公開鍵が読み取れず(読み取る権限がなく)エラーになってしまいます。
>
> SELinuxが有効な環境でSSH公開鍵認証を使う
> http://2done.org/76.html

のだそう。

公開鍵は PuTTY もしくは他のサーバで作って転送するのが常だったが、
それをすると SELinux コンテキストが正しくセットアップされないようだ。

というわけで、引用元にもある通り、

```
restorecon -R -v /home/$ACCOUNT/.ssh
```

と実行して、無事公開鍵認証が通るようになった。

## 結論

そんなこんなで解決はしたが…

最初から **SSH の接続先**で鍵生成していれば何の問題もなかったわけで、
冒頭に出した結論に至った、というわけです。

# 追記

iwaim@github さんにコメントを頂いてから、ひとつ疑問が。

**それって危なくないか？**

一時的とはいえ、秘密鍵を接続先のサーバに置くのってどうなんだろう。
置き忘れることだってあるかもしれない。

…と考えると、楽 だけど 危ない やり方なのか。
AWS SDK for Ruby v2を使ってみる


そろそろv2にも慣れておこうと、ドキュメント(※)見ながらちまちま触ってみたのでメモ。
(※) http://docs.aws.amazon.com/sdkforruby/api/frames.html


windows以外のEC2インスタンス名を列挙するプログラム。

```rb
require 'aws-sdk-core'

client = Aws::EC2::Client.new(
   region: config['Region'],
   access_key_id: config['AccessKey'],
   secret_access_key: config['SecretKey']
)
 
instance_name       = ""
 
r = client.describe_instances
r.each_page {|page|
  page.reservations.each { |reservation|
    info = reservation.instances[0]
 
    is_linux = (info[:platform] == nil)
    unless is_linux
      next
    end

    info[:tags].each { |tag|
      if tag[:key] == "Name"
        instance_name = tag[:value]
      end
    }
 
    p instance_name
  }
}
```

自身のコーディング力不足もあるが、イマイチみにくい。。。
`aws-sdk-resources`を使うべきなのか。
CentOS上でのplay frameworkの簡易的なデプロイ 

# これは何？
* play framework で作ったWebアプリケーションをCentOS上に簡易的にデプロイするメモ。

# 方法
* ソース等を```git clone```や```rsync```等なんらかの方法でもってくる
* ソースのフォルダに移動する。（例：```cd hogehoge```）
* ソースフォルダ直下で、```./activator start -Dhttp.port=xxxx```を実行する。
* ```Ctrl + D```で終了させてもプロセスは生き残っている。

# その他
* メモリが足りない場合は、```-mem 256```とかでオプションを与えてあげる。

例）```./activator -mem 256 start -Dhttp.port=12000```
Systemユーザーで動作しているサービスからの共有フォルダの認証を行う(C# .NET)

#はじめに

作成していたプログラムで、Systemユーザーで動作しているWindowsサービスから共有フォルダの認証を行いファイルのコピーを行う処理ではまったためメモとして残します。

#共有フォルダの認証

##まずは認証
`WNetAddConnection2()`で認証して`WNetCancelConnection2()`で認証解除を行う。
Win32APIなので、DllImport属性を使用してマネージドコードから呼び出せるようにする必要がある。

##結果

通常ユーザー(Windowsにログオンする時に使用するユーザー)のプロセスで実行した場合には成功する。
しかし、System(Local System)ユーザーで動作するWindowsサービスから実行すると`WNetAddConnection2()`の呼び出しでエラーコード:1312となって失敗する。必ず失敗する訳ではなく、一度目は成功して二度目以降は失敗、しばらくするとまた成功するがそれ以降失敗となる動作が続く。

##問題点

Systemユーザーはなんやかんやで共有フォルダーへの認証が使用出来ない。(っぽい。いろいろググった結果。なんかネットワーク資源へのアクセス許可がないとかだった気がする…)

##解決策

* Systemユーザーではなく、NetworkServiceユーザーでプロセスを起動する。
* 当該処理実行時にユーザー偽装を行う。

Systemユーザーで動作する必要があったので、ユーザー偽装を行う事とする。

#ユーザー偽装

認証と認証解除の処理を行う際にユーザーの偽装を行う。
(そんな機能があったことを初めて知りました…勉強が足りないですね…)

ユーザー偽装の処理の流れ

1. `LogonUser()`で偽装先のユーザー(今回はNetworkServiceユーザー)のトークンを取得
1. `WindowsIdentity`クラスのスタティックメソッド`Impersonate()`で1で取得したトークンを使用して1で指定したユーザに偽装(ここから、偽装を解くまでは1で指定したユーザで処理が実行される)
1. 偽装中に行いたい処理を実行(今回の場合は`WNetAddConnection2()`、認証中に行う処理、`WNetCancelConnection2()`を実行)
1. 2の`Impersonate()`の戻り値として取得した`WindowsImpersonationContext`クラスのインスタンスの`Undo()`で偽装を解除

##実装
「[Stack Overflow : How to use LogonUser properly to impersonate domain user from workgroup client](http://stackoverflow.com/questions/5023607/how-to-use-logonuser-properly-to-impersonate-domain-user-from-workgroup-client)」のJJ_Coder4Hire氏の回答を参考にした。
このコードはユーザー偽装を行うコードであり、今回の目的の「共有フォルダー認証を行う」ために以下の設定で`LogonUser()`を呼び出した。

* user : "NetworkService"
* domain : "NT AUTHORITY"
* password : ""
* logonType : LOGON32_LOGON_NEW_CREDENTIALS
* logonProvider : LOGON32_PROVIDER_DEFAULT

NetworkServiceユーザに偽装するための指定は「[Windows SDK Support Team Blog : How to programmatically create a LogonService or Network Service token with LogonUser?](http://blogs.msdn.com/b/winsdk/archive/2013/07/17/how-to-programmatically-create-a-logonservice-or-network-service-token-with-logonuser.aspx)」を参考にした。
LogonTypeも何らかのサイトを参考にしたが失念。

##結果

WNetAddConnection2も動作し、正常に共有フォルダーへのファイルのコピーが出来た。

#最後に

とりあえず目的の処理を実装させる事は出来た。けれどもなぜ動いているのか完全に理解できないため気持ちが悪い。(logonTypeをLOGON32_LOGON_SERVICEにすると動かないとか)
ちゃんとドキュメント読まないとなぁ

いまいち理解出来ていない点があるため、間違っている点がありましたら指摘願います。
【サービスを紹介】codota for android

# codota for androidとは
* Androidのプログラムコードサンプル「Codota」　Android用のプログラムコード例を検索できる
* サイト
 * https://www.codota.com/

# 特徴
### ベスト例を見つける
![codota_class.png](https://qiita-image-store.s3.amazonaws.com/0/13451/c914615a-b67e-cd83-598f-45ec8bf90fb7.png)

* よく使っている例
 * 例えば：　Parsing JSON documents、Displaying web pages 
* よく使っているクラス
 * 例えば： Fragment, Service

### HighlightとAPI Docリンク
![codota_highlight.png](https://qiita-image-store.s3.amazonaws.com/0/13451/8c561d35-2ca5-8a82-912f-ca2679f313f1.png)

* コードをクリックすると、Androidドキュメントのリンクが表示されて、highlightも含んでいる
* Androidクラスを勉強することが、とても便利

### プライベートコードボックス
![codota_codebox.png](https://qiita-image-store.s3.amazonaws.com/0/13451/2ee4b5de-77f0-8b1a-1796-0f083b8be712.png)

* 好きなコードを自分のボックスに保存できる


### chrome extensionの利用
![github_codota.png](https://qiita-image-store.s3.amazonaws.com/0/13451/67db0dfe-d684-a618-a88f-40b29dccadd1.png)

* https://www.codota.com/extension
* chrome extensionを利用すると、以下のサイトに、コードを見るときに、highlightも表示される
 * StackOverflow.com
 * developer.android.com
 * GitHub.com (public repos only)
 * vogella.com
 * androidhive.info
Lessでベース色から相関値で指定する

明るさを30％高くする：　lighten(@base, 30%);
明るさを20％低くする：　darken(@base, 20%);

彩度を30％高くする：　saturate(@base, 30%);
彩度を20％低くする：　desaturate(@base, 20%);

色相を10度大きくする：　spin(@bcolor, 10);
色相を20度小さくする：　spin(@bcolor, -20);

透明度を10％減らす：　fadein(@basec, 10%);
透明度を30％増やす：　fadeout(@basec, 30%);


```
@base: #ffa000;  /* ベースの色を変数に格納 */

h1 { color: @base;                   } /* 変数そのまま */

h2 { color: lighten(@base, 20%);     } /* 20%明るく */
h3 { color: darken(@base, 30%);      } /* 30%暗く */

h4 { color: saturate(@base, 20%);    } /* 20%鮮やかに */
h5 { color: desaturate(@base, 30%);  } /* 30%くすませる */

h6 { color: spin(@base, 10);         } /* 10度色相が大きく */
h7 { color: spin(@bcolor, -20);      } /* 20度色相が大きく */

h8 { color: fadein(@basec, 10%);     } /* 10％透過で薄く */
h9 { color: fadeout(@basec, 30%);    } /* 30％透過で濃く */
```
Linuxのプロセス一覧をC#(mono)で取得すると、実行プロセスが落ちる

C#(mono)でLinux(CentOS6)のプロセスを監視するプログラムが必要になったので、

```csharp:
    var processes = System.Diagnostics.Process.GetProcesses();
```

みたいにするとですね、実行プロセス自体が落ちちゃうんですよ。
tryブロックを無視して...相当なfatalのようです。
それもときどき発生するというレベルなので、たちが悪い -ω-

仕方がないので、psコマンドをProcess.Startしてプロセス一覧を取得し、解析しました。

[追記]

プロセス制御のソースをgithubに上げました。

https://github.com/aooni/LinuxProcess
ember.js 1.10 で HTMLBarsのhelper定義方法

ember.jsが1.10に上がってHandlebarsからHTMLBarsにテンプレートエンジンが変わりました。

~~Handlebarsで定義していたhelperが軒並みエラーしてたので書き直しが必要です。~~

※2015年3月9日 追記：どうやら```window.Handlebars```のundefined errorを勘違いしていたようです。

Handlebarsのhelper

```js
Ember.Handlebars.helper('yen', function(amount) {
  var result = '&yen;' + Handlebars.Utils.escapeExpression(amount);
  return new Ember.Handlebars.SafeString(result);
})
```

HTMLBarsのhelper

```js
window.App.YenFormatHelper = Ember.HTMLBars.makeBoundHelper(function(params, hash, options, env) {
  var amount = Ember.Handlebars.Utils.escapeExpression(params[0]);
  var result = '<span>&yen;' + amount + '</span>';
  return result.htmlSafe();
})
```

変更点


- helper名にハイフンが必須になった
    - 上記の例で```yen```のままだとエラーするので```x-yen```等で回避する必要がある
- Applicationのプロパティに```XxxYyyHelper```と定義する
- 引数は```params```か```hash```に格納される
    - ```{{yen-format 0}}```と渡すと```params```に```[0]```が格納される
    - ```{{yen-format amount=0}}```と渡すと```hash```に```{amount: 0}```が格納される
- 引数の```options```と```env```の使い道はまだ調べてません
- html文字列は```String.prototype.htmlSafe```を使ってエスケープを回避する
    - これはHandlebars.SafeStringを返すみたいだけど前からあったメソッド？
    - でも入力値もエスケープ回避されてしまうので、危険なデータには ```Ember.Handlebars.Utils.escapeExpression``` を使う


しかし```Ember.Handlebars.Utils.escapeExpression```て長いなぁ…
boot2docker(Windows) 内にローカルのフォルダをマッピングする

### boot2docker(Windows) 内にホスト側のフォルダをマッピングする

Windows 上で動かしているboot2docker上に、ローカルの任意のフォルダをマッピングします。

### 手順
とりあえずboot2dockerが正常に起動できるのが前提 ( ver 1.5.0 )

#### VirtualBox の GUI で共有フォルダの設定を追加する
又は以下のコマンドを叩いて追加する

```bash
VBoxManage sharedfolder add "boot2docker-vm" -name "workspace" -hostpath "C:\workspace"
```

#### boot2docker を起動してフォルダをマッピングする
以下のコマンドを叩く

```bash
boot2docker up
boot2docker ssh "sudo mkdir /workspace"
boot2docker ssh "sudo mount -t vboxsf -o uid=1000,gid=50 workspace /workspace"
```
代入式で左辺にスライスを入れるのはなぜか

以下の2行の違い（左辺にスライスを入れるのはなぜか）がわかりにくかったので備忘録。

```py
y[:] = x
```

```py
y = x
```

以下のように、`y[:] = x`ではyのidは変わらないが、`y = x`ではyのidはxのそれになる。

```py
>>> x = [1,2,3]
>>> y = [4,5,6]
>>> id(x)
4481009352
>>> id(y)
4481133744
>>> y[:] = x
>>> y
[1, 2, 3]
>>> id(y)
4481133744
>>> y = x
>>> y
[1, 2, 3]
>>> id(y)
4481009352
```

---
ブログやってます：[Weed software](http://weed.cocolog-nifty.com/wzero3es/)
Cocoapodsでターゲット分ける時の書き方


色々な書き方が出来るみたいだが今のところこれで落ち着いた。

``` 
pod '共通して必要なもの'
pod '共通して必要なもの'

target 'xxxTests' do
	pod 'テストだけに必要なもの'
end
```
力技でphpクラスのプライベートメンバ変数にアクセスする


# Goal

サードパーティのライブラリなど自分がさわれないクラスでプライベート属性を参照するメソッドが用意されていないケースで、
var_dumpすればprivateメンバ変数が見えているのに、その値を取得することができないのが歯がゆい.
**デバッグ用途に限定して**readだけでもプログラムからアクセスできるようにしたい.

```
object(Person)#1 (3) {
  ["name":"Person":private]=>
  string(12) "Isaac Newton"
  ["birthday":"Person":private]=>
  string(10) "1643-01-04"
  ["role":"Person":private]=>
  string(9) "physicist"
}
```

var_dumpすれば見えている↑のprivate値をどうにかプログラムから取得したい.

# Code

インスタンスをprivateメンバ変数も含めて連想配列に変換する
* インスタンスを配列型でキャストしてjson文字列に変換
* NULLバイトを削除
* 連想配列モードでjson文字列をデコード
* "クラス名プロパティ名"のキーでアクセスできるようになる

```php
function convert_debuggable_assoc($obj) {
  $json_str = json_encode( (array) $obj );
  $json_str = str_replace("\u0000", "", $json_str);
  $obj_array = json_decode( $json_str, /*assoc=*/ true );
  return $obj_array;
}
```

テストコード

```php
<?php

# privateのメンバ変数を持ち、参照用publicメソッドを持たないクラスを定義
class Person {
  private $name;
  private $birthday;
  private $role;

  public function __construct($params) {
    $this->name = $params['name'];
    $this->birthday = $params['birthday'];
    $this->role = $params['role'];
  }
}

function convert_debuggable_assoc($obj) {
  $json_str = json_encode( (array) $obj );
  $json_str = str_replace("\u0000", "", $json_str);
  $obj_array = json_decode( $json_str, /*assoc=*/ true );
  return $obj_array;
}

$person = new Person([
  'name' => 'Isaac Newton', 'birthday' => '1643-01-04', 'role' => 'physicist',
]);

$person_arr = convert_debuggable_assoc($person);
echo $person_arr['Personname'];
  # Personクラスのnameプロパティが、Personnameとしてアクセスできるようになる
  # Isaac Newton
# echo $person->name;
  # Fatal error: Cannot access private property Person::$name
```

Environment

```
$ uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

$ /usr/local/php-5.5.4/bin/php -v
PHP 5.5.4 (cli) (built: Mar 11 2014 11:06:57)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

$ /usr/local/php-5.6.0/bin/php -v
PHP 5.6.0 (cli) (built: Aug 29 2014 06:35:44)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
```
ScratchとArduinoでレゴロボットを動かす


青山学院大学、津田塾大学の阿部先生に教えていただいた、レゴロボットをScratchから操作します。

# はじめに

レゴでロボットを作成しようとすると、レゴマインドストームがありますが高価になりなかなか手がでません。
レゴの歯車のセット[Lego Crazy Action](http://www.amazon.co.jp/dp/1591747694)を使用すると安価にロボ作成が楽しめます。

# レゴロボット作品例

[こちら](http://scratch.mit.edu/studios/191786/)は阿部先生の作品です。
上述のLego Crazy Actionと[NanoBoardAG](http://tiisai.dip.jp/?page_id=935)とモーターを組み合わせて、ロボを制御してます。  

私は、NanoBoardAGの代わりに、手元にあるArduinoを使用する事にします。
また、モータは市販のものを試してみたのですが、市販のギヤボックスを使うとどうしても、サイズが大きくなり、ロボに付けるのが難しいです。よって、モータは[ちっちゃいものクラブ](http://tiisai.dip.jp/)で購入しました。「ギアモーター　+ LEGO用ゴムチューブ + ケーブル 送料別300円」です。
話は脱線しますが、ちっちゃいものクラブを見ていると、いろいろと欲しくなるので要注意です。

# レゴロボット作成

それでは実際に作成していきます。
上述の阿部先生の作品例の中から動きの面白そうな「レゴなのどっぐ」を作成することにします。
作り方は上述のScratchを再生してもいいですが、作るのが追いつかないので、Scratchのソースを直接みるか、[こちら](https://plus.google.com/photos/117983182594948407262/albums/5696624000933921921)を参照して作っていきます。

# 回路作成

ブレッドボードを使って作成します。
モータードライバ(TA7267BP)を使って、モーターの回転を制御します。  
![なのどっぐ回路図.png](https://qiita-image-store.s3.amazonaws.com/0/4779/f6368cb3-6d55-6768-65d3-029fcb1beb91.png "なのどっぐ回路図.png")  

TA7267BPの端子の説明は下記。
端子1,2の入力を操作する事で、モーターの正回転・逆回転を行います。

![TA7267BP-1.png](https://qiita-image-store.s3.amazonaws.com/0/4779/9d3cbd6e-c431-8153-b99c-c0c77aea5004.png "TA7267BP-1.png")
![TA7267BP-2.png](https://qiita-image-store.s3.amazonaws.com/0/4779/875fef53-6166-a2d2-bc55-28fc7f76cba3.png "TA7267BP-2.png")  

[こちら](http://www.slideshare.net/parupico/coma-study-room-vol2)を参考にさせていただきました。

# プログラム作成

キーボードの操作で、ロボットが前進・更新。停止するようにします。
キーボードの矢印キーを押下時に、Arduinoの12,13ピンの出力をHIGH,LOWに切り替えます。  

プログラムは子供に教える事を想定してScratchを使いますが、今回は、Scratchをベースに、外部センサーとの連携が可能な[S4A](http://s4a.cat/)を使用します。

S4Aのinstallは「Download and Install」の手順通りです。
MacOSでのはまりポイントは、事前にMacの[システム環境設定]-[セキュリティとプライバシー]で、[ダウンロードしたアプリの実行許可]を[全てのアプリケーションを許可]にする必要があります。これをしないと、[壊れたアプリ]と認識され、installできません。  

S4Aをinstall後、S4Aを起動すると通常のScratchとほぼ同じような画面が表示されます。
矢印キーを押すことで、Arduinoの12,13ピンのHIGH,LOWを切り替えることで、前進・後進・停止をします。
![なのどっぐ-_S4A_1_6.png](https://qiita-image-store.s3.amazonaws.com/0/4779/364ae9ec-987a-9f18-7d34-884ab6d9af17.png "なのどっぐ-_S4A_1_6.png")

# まとめ

* Lego ACtion Crazyというセットとモーターを使って、ロボット作成しました。
* さらに、Scratch(S4A)とAruduinoを使うことで、ロボットを制御しました。
* 今回の方法だと、子供も、自分ひとりで作ることができそうです。(まだ子供に試していません)
Rails で Wicked PDF 使って PDF を出力してみた ( 日本語もバッチリ )

# はじめに

Rails で PDF を出力する方法を調べて実装した時のメモ。

「Rails PDF 出力」とかでググると、ThinReports とか引っかかってくるけど、
別途 テンプレートファイルの作成が、必要でかつ、それを作るための別ツールのインストールが必要など、
導入に手間がかかるなぁとおもったので、もっと手軽な [Wicked PDF](https://github.com/mileszs/wicked_pdf) を使って実装してみた。

Wicked PDF は、HTML を変換して PDF として表示する方式のため、
いつも View を html で作っているやり方に、実装できる。
作成中のデバッグも、ブラウザで html を表示してできるので、かなりお手軽。

# 準備

## Gem インストール
Gemfile に下記を追加して、`bundle install` する

```rb:Gemfile
# pdf export
gem 'wkhtmltopdf-binary'
gem 'wicked_pdf'
```

## PDF 変換コマンドを設定
initializers に wicked_pdf.rb を追加

```rb:wicked_pdf.rb
WickedPdf.config = {
  :exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
}
```

pdf に変換するコマンドのパスを設定している

# サンプルコード
下記のような controller 、view テンプレートを用意。
今回は pdf 出力用のテンプレートファイル pdf.html.haml を作成。
売上の一覧表を出力してみる

その前に、テンプレートファイルのタグの書き方が変わるので記載します。

|タグ|標準|Wicked PDF|サンプルソース (HAML)|
|:---:|---|---|---|
|CSS| stylesheet_link_tag | wicked_pdf_stylesheet_link_tag |`= wicked_pdf_stylesheet_link_tag 'filepath'`|
|JS| javascript_include_tag | wicked_pdf_javascript_include_tag |`= wicked_pdf_javascript_include_tag 'filepath'`|
|IMAGE| image_tag | wicked_pdf_image_tag |`= wicked_pdf_image_tag 'filepath'`|

ただし、html でのデバッグする際は、標準のタグにしておく必要がある。

## controller

```rb:app/controllers/sales_controller.rb
class SalesController < ApplicationController

  def index
    @sales = Sale.all

    respond_to do |format|
      # .html でアクセスした際は、リダイレクト(show_as_html を true にするため、debug: 1 で)
      format.html { redirect_to :action => 'detail', :format => 'pdf', debug: 1 }
      format.pdf do
        render pdf: 'detail',                        # pdf ファイル名
               encording: 'UTF-8',                   # 日本語を使う場合には指定する
               layout: 'pdf.html',                   # レイアウトファイルの指定
               show_as_html: params[:debug].present? # debug するか？
      end
    end
  end
end
```

html で debug 可能なように記載
url に .html でアクセスすると、html でデバッグ出来る

## view

```haml:app/views/layouts/pdf.html.haml
!!!
%html
  %head
    %meta{ 'http-equiv' => 'content', content: 'text/html; charset=utf-8' }
      = wicked_pdf_stylesheet_link_tag '//ajax.googleapis.com/ajax/libs/yui/3/build/cssreset/reset-min.css'
  %body
    = yield
```
とりあえずのリセット CSS 入り。

```haml:app/views/sales/index.pdf.haml
%table
  %tr
    %td sales_amount
    %td sales_tax
    %td sum
  - @sales.each do |sale|
    %tr
      %td ¥ #{number_with_delimiter(sale.sales_amount)}
      %td ¥ #{number_with_delimiter(sale.sales_tax)}
      %td ¥ #{number_with_delimiter(sale.sales_sum)}
```

`@sales` のレコード数分、テーブルの行が作成される。

# 日本語対応

日本語を表示したい場合は、別途日本語フォントをインストールが必要。
※ Linux に日本語が入っていないため

下記コマンドで IPA フォントをインストールできる。

```
$ yum install -y ipa-gothic-fonts
$ yum install -y ipa-mincho-fonts
```
SSHの設定いろいろ

# 設定について

## ssh_config (sshの接続**元**)

### GSSAPI 認証

`ssh -v <hostname>` で詳細なログを出した時に、

```
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
Cannot determine realm for numeric host address
```

こんなものが出ることがある。
"GSS failure" つまり失敗している。

GSSAPI 認証とは何か…は調べきれていないが、
使わないのであれば切ってしまったほうが良いだろう。

```bash:/etc/ssh/ssh_config
Host *
       GSSAPIAuthentication yes ← 削除(デフォルトに戻す)
```

`service sshd restart` で反映。

## sshd_config (sshの接続**先**)

### パスワード認証

公開鍵認証しか使わないのであれば（以下略

```bash:/etc/ssh/sshd_config
PasswordAuthentication yes
↓
PasswordAuthentication no
```

`service sshd restart` で反映。
postgresでgroup by エラー

このようなデータがあったとして、

```sql
 id | content 
----+---------
  1 | 渋谷
  2 | 恵比寿
  3 | 五反田
  4 | 渋谷
  5 | 中目黒
```

contentがユニークな下記のようなデータを取得したいとします。


```sql
 id | content 
----+---------
  1 | 渋谷
  2 | 恵比寿
  3 | 五反田
  5 | 中目黒
```

mysqlに慣れたいた自分は下記のようなsql文を発行。

```sql
select * from result group by content;
```

すると

```sql
ERROR:  column "result.id" must appear in the GROUP BY clause or be used in an aggregate function
行 1: select * from result group by content;
```

ふむ。`result.id`は`group by`節に現れるか、集計関数として使われなければならない。
後者のほうはイマイチ意味がわからないので、`group by`節に追加。

```sql
select * from result group by id, content;
```

```sql 
 id | content 
----+---------
  3 | 五反田
  5 | 中目黒
  1 | 渋谷
  4 | 渋谷
  2 | 恵比寿
(5 行)
```

 んん？予想した結果と違う。

ここで色々ぐぐってみると要するに`group by`した結果、`id = 1`の渋谷と`id = 4`の渋谷どちらを表示すればよいかわからないのでエラー、ということらしい。

なるほど、たしかに。

こうゆうときは`distinct`句を使うと "一番最初の行" を取得してくれるから、これを使うと良いらしい。

> SELECT DISTINCT ON ( expression [, ...] )は各行集合の中で、指定した式が等しいと評価した最初の行のみを保持します。

最初の行ということは `id = 1`の渋谷、ですかね。

```sql
select distinct on (content) * from result;
``` 

```
 id | content 
----+---------
  5 | 中目黒
  3 | 五反田
  2 | 恵比寿
  1 | 渋谷
(4 行)
```

`id = 1`の予想はあっていましたが、順番が逆順になっています。

じゃぁこうしよう。

```sql
select distinct on (content) * from result order by id asc;
``` 

またエラー。

```sql
ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
行 1: select distinct on (content) * from result order by id;
                          ^
```

`distinct on`の条件式は`order by`の一番最初の条件式とマッチする必要がある、とのこと。

え、、こうゆうこと？

```sql
select distinct on (content) * from result order by content, id asc;
```

```sql
 id | content 
----+---------
  5 | 中目黒
  3 | 五反田
  2 | 恵比寿
  1 | 渋谷
(4 行)
```

エラーこそ出ないもののちがう。。

ここで`distinct`句のリファレンスをもう一度読んでみる。

>  各集合の"最初の行"は、ORDER BYを使用して目的の行が確実に最初に現れるようにしない限り予測することはできないことに注意してください。

なるほど・・。つまりここで使っている`order by`は`id = 1`の渋谷と`id = 4`の渋谷のどちらを選ぶか、ってゆう条件に使用されているのかな。たとえば前述の式を`asc`→`desc`にしてみる。

```sql
select distinct on (content) * from result order by content, id desc;
```

```sql
 id | content 
----+---------
  5 | 中目黒
  3 | 五反田
  2 | 恵比寿
  4 | 渋谷
(4 行)
```

ほら、`id = 4`のほうになった。つまり`distinct on`と`order by`はセットで使うべきなのですな。となると、この結果をサブクエリにして再度`id`で`order`してやるくらいしか思いつきません。

```sql
select * from (select distinct on (content) * from result order by content, id asc) as distincted_table order by id asc;
```

```sql 
 id | content 
----+---------
  1 | 渋谷
  2 | 恵比寿
  3 | 五反田
  5 | 中目黒
(4 行)
```

できました〜パチパチ。

とはいえ`distinct_on`でなく`group by`でやる方法はないものか。
三項演算子の吐き出し方がわからなかったけど解決した

正直まだよくわかってないかもしれませんが……。つっこみどころとか、ここはこうしたほうがいいよとか、もっと外交に力を入れろとか、なんでも言ってください。

```js
var bust = 76;
var happy = (bust >78) ? touch : photoshop;
```

これだとエラーになる。なんで何にも吐き出されないの？　と疑問に思っていたのですが、
コンソール・ログをつけていませんでした。テストに名前書き忘れて落第した気分です。

```js
var bust = 76;
var happy = (bust > 78) ? console.log("touch") : console.log("photoshop");
```

でも調べてみると、三項演算子は一行で済むとかいてある。bustに値を代入しなければならないので、複数行になるのでは……？
Ansibleで深い階層にある配列を利用する方法が知りたい


Ansibleで

```
vars:
  foo:
    bar: 
      - baz1
      - baz2
```

こういう設定があって、この`baz1`、`baz2`を

```
- name: foo bar baz
  template: src={{ baz1 }} dest={{ baz1 }}
```

のように利用したい場合どうやって書けば良いのだろう
XPathで特定のテキストを含む要素を含む一番小さな(近い)tableを選択する


```````
$x('//*[text()="テキスト"]/ancestor::table[1]')
````````

`/ancestor`でヒットした要素の親が全部取れて来るのでそこから`::`で選択，最初の要素を取ればclosestなものがある

また，次のようにも書けるが，こちらは要素の変更に弱い

``````
$x('//table[tbody/tr/td/b/text()="テキスト"]')
`````
virshメモ

## DISKのチューニング

* [PC便利帳: KVMの管理 第5回 (仮想ディスクの管理)](http://tenten909.exblog.jp/15353157)
  * writeback派とnone派に分かれている。自分はnone派。

* QEDフォーマットを使う。[KVM - QED : qcow2より早い、最速ディスクフォーマット - Qiita](http://qiita.com/tukiyo3/items/7bfb07c06101c806a47a)

## 自動起動

* 参考: [libvirt (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/libvirt_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#QEMU_.E3.81.AE_KVM_.E3.82.A2.E3.82.AF.E3.82.BB.E3.83.A9.E3.83.AC.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.92.E6.9C.89.E5.8A.B9.E3.81.AB.E3.81.99.E3.82.8B)


```bash:有効
virsh autostart wwwXX
```

```bash:無効
virsh autostart --disable wwwXX
```

## システム情報確認

* 参考: [KVMでホストマシンや仮想マシン(VM)の情報を確認する - id:rx7(@namikawa)の技術メモ - 技術日記](http://tech.g.hatena.ne.jp/rx7/20101025/p1)


```bash:ホストの情報を確認
# virsh nodeinfo
CPU モデル:       x86_64
CPU:                 4
CPU 周波数:       2834 MHz
CPU ソケット数: 1
ソケットあたりのコア数: 2
コアあたりのスレッド数: 2
NUMA セル数:      1
メモリー容量:  8049360 KiB
```


```bash:ゲストの情報を確認
# virsh dominfo wwwXX
Id:             5
名前:         wwwXX
UUID:           d86a3d6d-c713-4d2d-b3cb-XXXXXXXXXXXX
OS タイプ:   hvm
状態:         実行中
CPU:            4
CPU 時間:     103.0s
最大メモリー: 4194304 KiB
使用メモリー: 4194304 KiB
永続:         はい (yes)
自動起動:   無効にする
管理済み保存: いいえ (no)
セキュリティモデル: none
セキュリティ DOI: 0
```


## console接続

参考:

* [virshの使い方 - 雑記](http://momoto.github.io/blog/2013/08/17/guide-to-managing-guests-using-virsh/)
* [逆引きKVM(Kernel-based Virtual Machine) - Qiita](http://qiita.com/fetaro/items/65fa1d136406251ce898)

```diff:/etc/grub.conf
-     kernel /vmlinuz-2.6.18-398.el5PAE ro root=LABEL=/
+     kernel /vmlinuz-2.6.18-398.el5PAE ro root=LABEL=/ console=tty0 console=ttyS0,115200n8
```

```diff:/etc/inittab
+ S0:12345:respawn:/sbin/agetty ttyS0 115200
```

```bash:接続
virsh console wwwXX
```

`^]`で抜ける。


## バックアップ

@fetaroさんの

* [KVM Disk Images Backup Script with "ruby-libvirt" - Qiita](http://qiita.com/fetaro/items/6e4c88fa9b5e5346eae4)
centosにlibyaml-develをいれようとしたときにerrorがでる場合の対処法

#概要
カスタマイズされたruby環境を整えるためのcookbookを作っていたんだけど、毎回`yum install libyaml-devel` で謎のエラーがでて、対処法を思い出すのに時間がかかるため、メモっておく

#エラー内容
```
---> Package glibc-headers.x86_64 0:2.12-1.149.el6_6.5 will be an update
---> Package nss-softokn-freebl.x86_64 0:3.14.3-9.el6 will be updated
---> Package nss-softokn-freebl.i686 0:3.14.3-22.el6_6 will be installed
---> Package nss-softokn-freebl.x86_64 0:3.14.3-22.el6_6 will be an update
--> Finished Dependency Resolution
Error:  Multilib version problems found. This often means that the root
       cause is something else and multilib version checking is just
       pointing out that there is a problem. Eg.:

         1. You have an upgrade for libyaml which is missing some
            dependency that another package requires. Yum is trying to
            solve this by installing an older version of libyaml of the
            different architecture. If you exclude the bad architecture
            yum will tell you what the root cause is (which package
            requires what). You can try redoing the upgrade with
            --exclude libyaml.otherarch ... this should give you an error
            message showing the root cause of the problem.

         2. You have multiple architectures of libyaml installed, but
            yum can only see an upgrade for one of those arcitectures.
            If you don't want/need both architectures anymore then you
            can remove the one with the missing update and everything
            will work.

         3. You have duplicate versions of libyaml installed already.
            You can use "yum check" to get yum show these errors.

       ...you can also use --setopt=protected_multilib=false to remove
       this checking, however this is almost never the correct thing to
       do as something else is very likely to go wrong (often causing
       much more problems).

       Protected multilib versions: libyaml-0.1.3-4.el6_6.i686 != libyaml-0.1.6-1.el6.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
```

こんな感じのエラーが出る。ちょっとググった感じだと、だいたいepelを設定しろみたいな感じの対処法がでてくるが、そういう話じゃないっぽい。むしろ、それがノイズになって、毎回対処法が出てこなくなる。

#対処法
ここに載っていた
[libyaml architecture check during install · Issue #3206 · wayneeseguin/rvm](https://github.com/wayneeseguin/rvm/issues/3206)

```
# yum downgrade libyaml
# yum install libyaml-devel
```
これで行けた。