OmniAICreator/Qiita-1.07M huggingface dataset:
[質問です] bootstrap の nav-tabs と collapse それとsmooth scroll を一緒に使いたい

はじめまして。

bootstrapの nav-tabs と collapse と smooth scroll を
一緒に使おうと試みていますが、コンフリクトを起こしています。

使っているsmooth scrollは下記のスクリプトになります。

```lang:smooth-scroll.js
$(function() {

    function filterPath(string) {
        return string
        .replace(/^\//,'')
        .replace(/(index|default).[a-zA-Z]{3,4}$/,'')
        .replace(/\/$/,'');
    }

    var locationPath = filterPath(location.pathname);
    var scrollElem = scrollableElement('html', 'body');

    // Any links with hash tags in them (can't do ^= because of fully qualified URL potential)
    $('a[href*=#]:not([data-toggle="tab"]) {

        // Ensure it's a same-page link
        var thisPath = filterPath(this.pathname) || locationPath;
        if (  locationPath == thisPath
            && (location.hostname == this.hostname || !this.hostname)
            && this.hash.replace(/#/,'') ) {

                // Ensure target exists
                var $target = $(this.hash), target = this.hash;
                if (target) {

                    // Find location of target
                    var targetOffset = $target.offset().top;
                    $(this).click(function(event) {

                        // Prevent jump-down
                        event.preventDefault();

                        // Animate to target
                        $(scrollElem).animate({scrollTop: targetOffset}, 400, function() {

                            // Set hash in URL after animation successful
                            location.hash = target;

                        });
                    });
                }
        }

    });

    // Use the first element that is "scrollable"  (cross-browser fix?)
    function scrollableElement(els) {
        for (var i = 0, argLength = arguments.length; i <argLength; i++) {
            var el = arguments[i],
            $scrollElement = $(el);
            if ($scrollElement.scrollTop()> 0) {
                return el;
            } else {
                $scrollElement.scrollTop(1);
                var isScrollable = $scrollElement.scrollTop()> 0;
                $scrollElement.scrollTop(0);
                if (isScrollable) {
                    return el;
                }
            }
        }
        return [];
    }

});
```





下記の箇所で tabクリック の場合は除くという処理ができているので

```lang:tabクリック除外箇所
$('a[href*=#]:not([data-toggle="tab"]) {
```

下記の様に書いて tab と collapse の場合は除くというようにしたいのですが
うまくいかず、この場合ですとcollapseの場合にはsmooth.scrollの影響が出てしまいます。
```lang:tabとcollapseクリック除外
$('a[href*=#]:not([data-toggle="tab"]) || $('a[href*=#]:not([data-toggle="collapse"]) {
```

tab と collapse と両方の場合に smooth scroll の影響を受けなくさせるには
どのようにしたらよいでしょうか？

よろしくお願いします。
MTクラウドのサーバ配信ログを取得する

Movable Typeクラウド版のサーバ配信機能は機能自体は申し分ないのですが、設定を行う画面しかないので、履歴等が確認できず使用していていまいち安心感がありません。

ですが、MTのログを見てみると「サーバー配信が正常に処理されました」というものが記録されていたりします。これをいい感じに表示すれば配信履歴として使用できそうです。

MTのログにはcategoryという情報を付けることができ、これによってログを分類することができます。前述のログには「contents_sync」というcategoryがつけられていた為、このcategoryでログを抜き出せばサーバ配信系のログだけを取得できるはずです。

ということで、以下のコードでサーバ配信系のログの最新5件を取得することができます。

```pl
    my @logs = MT::Log->load(
                   { blog_id => $blog->id, category => 'contents_sync' },
                   {
                        sort => 'created_on',
                        direction => 'descend',
                        limit => 5
                    }
    );
```

これを表示するダッシュボードウィジェットを適当にこしらえると安心感がましていい感じになります。

```yaml:config.yaml
id  : MTCloudDeployLog
key : MTCloudDeployLog
name: MTクラウドサーバ配信ログ
version: 1.0
author_name: rryu
author_link: 
description: MTクラウドのサーバ配信ログを表示するダッシュボードウィジェットを追加します。

widgets:
    deploy_log:
        label: サーバ配信ログ
        plugin: $MTCloudDeployLog
        singular: 1
        set: main
        template: deploy_log_widget.tmpl
        handler: $MTCloudDeployLog::hdlr_deploy_log_widget
```

```html:tmpl/deploy_log_widget.tmpl
<mtapp:widget
   label="サーバ配信ログ"
   id="deploy_log_widget"
   class="widget"
   can_close="1">

    <ul>
      <mt:Loop name="logs">
        <li>
          <$mt:Var name="log.format_created_on"$> : 
          <$mt:Var name="log.message"$>
        </li>
      </mt:Loop>
    </ul>

</mtapp:widget>
```

```pl:lib/MTCloudDeployLog.pm
package MTCloudDeployLog;
use strict;
use utf8;

sub hdlr_deploy_log_widget {
    my ($app, $tmpl, $param) = @_;

    my $blog = $app->blog;

    my @logs = MT::Log->load(
                   { blog_id => $blog->id, category => 'contents_sync' },
                   {
                        sort => 'created_on',
                        direction => 'descend',
                        limit => 5
                    }
    );

    @logs = map { 
        my $item = $_->to_hash();
        $item->{'log.format_created_on'} = _format_ts_gmt($app, $_->created_on, $blog);
        $item;
    } @logs;

    $param->{'logs'} = \@logs;
}


sub _format_ts_gmt {
    my ($app, $ts, $blog) = @_;

    return '' unless $ts;

    $blog = $app->blog unless $blog;
    my $epoch = MT::Util::ts2epoch(undef, $ts);
    $epoch = MT::Util::offset_time($epoch, undef, 1);
    $ts = MT::Util::epoch2ts(undef, $epoch);

    my $lang = $app->user ? $app->user->preferred_language : undef;

    return MT::Util::format_ts(MT::App::CMS::LISTING_TIMESTAMP_FORMAT(), $ts, $blog, $lang);
}

1;
```
Dockerのコマンドチートシート

# はじめに

ここ数ヶ月で、Dockerを本番環境で運用しています。
 
鳥頭の自分にとってはコマンドがパッとでてこないので、
自分的によく使うコマンドをピックアップして、
忘失録としてQiitaのスペースをお借りしたいと思います。

使用しているのはDocker v1.4です。
(はやくv1.7にしたい)

# よく使うコマンド

大文字の部分は変数として読み替えてください。

### centosにdockerをインストール(要epel)

※古いdockerパッケージが入ってたら削除する
`sudo yum remove docker`

centos6 にdockerをインストールする
`sudo yum install --enablerepo=epel dokcer-io`

### docker-regisryをバックグラウンドで立ち上げる(ポート:5000番)
`docker run -p 5000:5000 -d registry`


### 起動中のコンテナにbashでアタッチ
`docker exec -it ID_or_NAME bash`

### 起動中のコンテナにbashコマンドをアタッチせずに実行(複数引数、パイプも可能)
`docker exec ID_or_NAME COMMANDS`

- ex. (コンテナ名 test_container と想定)
`docker exec test_container ls -l /home/test-user`

### 起動中のコンテナを停止
`docker stop ID_or_NAME`

### dockerコンテナを削除
`docker rm ID_or_NAME`

### dockerイメージを削除
`docker rmi ID_or_NAME`

### dokcerの情報を表示する
`docker inspect ID_or_NAME`

### dockerにタグをつける
`docker tag IMAGE[:TAG] NAME[:TAG]`

### docker-registryをconfig.yml使って立ち上げる
`docker run -p 5000:5000 -v /etc/docker/:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry`


# さいごに

とりとめのない記事になってしまいますがご了承ください。

もうちょっとDockerのTipsとかを書いていければと思います。

# 参考資料

[Using the command line](https://docs.docker.com/reference/commandline/cli/)
UID must be less than 65535が出てログインできないンゴ

## 問題

なんか、とあるCent6.5のサーバにとある人達が入れないみたいンゴ  
症状としてはイカ  

```bash
kakerukaeru@PC-kakeru:~/chef/kakeru (master)$ ssh 192.168.32.161 -lkakeru_kaeru_test
kakeru_kaeru_test@192.168.32.161's password:                                        
UID must be less than 65535                                                          
Connection closed by 192.168.32.161  
```

uidNumberを65535イカにしろ。ハイ。  
 
## 原因＆対応

ログイン出来ない原因自体はイカ  

```bash
$ cat /etc/pam_ldap.conf
105 # Specify a minium or maximum UID number allowed
106 pam_min_uid 10001
107 pam_max_uid 65535
```

uidNumberがそもそもどうなんとか関係なく一旦入りたいなら
コメントアウトしてnslcd restartでイナフ
httpd startしたら「Unknown DAV provider: svn」した際の対処方法検討記録

#概要
httpd startしたら「Unknown DAV provider: svn」した。
これはその際の原因探しと対処方法を検討していった際の記録。

#起きた事
サーバーを再起動させたら httpd が start できなくなってしまった。
その際にエラーとして「Unknown DAV provider: svn」が出てきた。

尚今までは起きておらず、何かしらが原因でこれが起こるようになった。

#このエラーは何？
適当にぐぐった限りだとSVNサーバーを立てる際の設定らしい？
元々前任者が居て自分はよくわからないままに引き継いだけど、SVNサーバーとして使えるようになってたとはいざ知らず・・・
そもそもSVNサーバーとして使ってすらいないし・・・これ以外にも余計なもの入ってたりするから、これも毎度のことながら遊びで入れたのだろう・・・。

#原因
今までは動いていたのに何で急にこんなことが起きたか。
svn って文字が出てるし数ヶ月前に svn を 1.8.9 に上げたのが原因なのだろうと予想。

今更このエラーが出たのは、単に今まで httpd を再起動せず付けっぱなしで、今になって restart した所為でこのエラーが出たっぽい。

本来SVNサーバーとして使えるようにするにはこれと一緒に mod_dav_svn のバージョンも併せて 1.8.9 にする必要があったらしい。

しかし yum list installed | grep mod_dev_svn するも見つからず・・・昔はインストールしなくても動いたのだろうか。
yum でインストールできればいいなぁと思いつつも

```bash
$ yum --enablerepo=epel,remi,rpmforge info mod_dav_svn
...(中略)
Version    : 1.6.11
```

バージョンが古い...

バージョンが古い原因は元々 svn 1.8 は rpm 落としてそっからやったものだから当然っちゃ当然。svnもyumからだと1.6.11が最新だしね...

落とした先の WAN-Disco を見てみると mod_dav_svn 1.8 の rpm が普通にあったのでこれをインストールしようとした。
・・・が、色々依存するライブラリが足りない。

このまま依存するライブラリの泥沼にはまらなければいいなぁとか思いつつ yum で探すも epel も remi にも必要なライブラリはあるもののバージョンが古い。rpm からインストールしようとしたら更に必要な依存ライブラリが・・・うーん詰んでいる・・・

んで仕方ないのでSVNサーバーとして使う予定はサラサラないので設定を切ることにした。

#やったこと
設定ファイルが無ければいいっぽかったのでコンフィグの名前を変えた。

```bash
$ cd /etc/httpd/conf.d/
$ mv svn.conf svn.conf_
```

さてさて...

```bash
$sudo service httpd start
httpd を起動中:                                            [  OK  ]
```

よし（画面から目をそらしつつ心の中でガッツポーズ
エンジニア全般のtips(初心者向け）

#良い情報がありましたのでshareさせていただければと思います。

shareslideなのですが、タイトルがなんと

「学生時代に知っておきたかったweb技術の学び方」http://www.slideshare.net/livesense/web-49772012

これは、新卒や学生などまだ経験がないエンジニアの方に書かれたものでとてもためになります。

僕みたいな初心者の指針を見出してくれるようなスライドです。

ここでは前提として、
◎技術のトレンド（言語など）が短期的に変わる今の時代において
エンジニアとは長いマラソンを走り切ることができるランナーになるべきだ。

ポイントは以下の３つ

1,基礎を抑えれば、学び直しがOK
2,主体性を持って日々勉強できるようなやつになれ！
3,モチベーション維持が難しいので勉強会に参加して切磋琢磨の環境に身を置け！！！

このスライドは内定をもらい、準備期間、何をしようかと模索していた僕には鶴の一声。
AWSのことを勉強しつつ、基礎をしっかり押さえて、いきたいと思います。

みなさんもぜひご一読ください。
vmstatをgnuplotでグラフ化したときの参考文献


gnuplotスクリプトの解説 - 米澤進吾 ホームページ
<http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/index.html>

vmstat コマンドの読み方 - やっぱり Sun がスキ！
<https://blogs.oracle.com/yappri/entry/vmstat>

vmstatの結果をgnuplotでグラフ化する - think it over
<http://piccagliani.hatenablog.com/entry/2013/03/05/135523>

GNUPLOT, DSTAT – EASY GRAPHING ON LINUX - NIFTY TIDBITS
<https://niftybits.wordpress.com/2008/03/28/gnuplot-dstat-easy-graphing-on-linux/>
組合せ最適化 - 典型問題 - 最大安定集合問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最大安定集合問題
無向グラフ$G=(V, E)$において、重みの和が最大の安定集合(互いに隣接していない節点の集合)を求めよ。

##実行方法

```text:usage
Signature: maximum_stable_set(g, weight='weight')
Docstring:
最大安定集合問題
入力
    g: グラフ(node:weight)
    weight: 重みの属性文字
出力
    最大安定集合の重みの合計と頂点番号リスト
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import graph_from_table, networkx_draw, maximum_stable_set
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
t = maximum_stable_set(g)
pos = networkx_draw(g, node_color='white')
nx.draw_networkx_nodes(g, pos, nodelist=t[1])
plt.show()
print(t)
```

```text:結果
(5.0, [1, 4])
```

![mss2.png](https://qiita-image-store.s3.amazonaws.com/0/13955/459726af-167b-252e-b863-aaadc422c32a.png)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import MaximumStableSet
MaximumStableSet('data/node0.csv','data/edge0.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>x</th>
      <th>y</th>
      <th>demand</th>
      <th>weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>5</td>
      <td>8</td>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>4</td>
      <td>2</td>
      <td>2</td>
      <td>1</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import networkx as nx, matplotlib.pyplot as plt
from ortoolpy import networkx_draw, maximum_stable_set
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 1)
t = maximum_stable_set(g)
pos = networkx_draw(g, nx.spring_layout(g), node_color='white')
nx.draw_networkx_nodes(g, pos, nodelist=t[1])
plt.show()
```

![mss.png](https://qiita-image-store.s3.amazonaws.com/0/13955/5174c066-68e3-f39f-082f-d4d57a6c6a54.png)

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
aws[EC2]にphp5.6.xとremiのphp-phalconをインストールする際のメモ

# インストールメモ
~~~
sudo yum -y update
sudo yum install gcc make wget git tree patch sysstat dstat
sudo ln -nfs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
sudo yum install nginx
sudo wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6.rpm
sudo yum install php56 php56-devel php56-fpm php56-mysqlnd php56-mbstring php56-opcache
sudo yum --enablerepo=epel install phpMyAdmin
sudo yum install --enablerepo=remi,remi-php56 php-phalcon
~~~


## シンボリックリンクでつなぐ
remiでインストールされるphalcon.soのパスが異なるので注意


~~~
sudo ln -s /usr/lib64/php/5.6/modules/phalcon.so /usr/lib64/php/modules/phalcon.so
~~~
PowerShellからputtyのscpコマンドを使用してファイルをアップロードする

PowerShellから外部コマンド（puttyのpscp）を呼び出して、リモートへファイルをコピーします。

# 使い方 #


```ps1:usage.ps1
Set-StrictMode -Version Latest

# プログラム本体ファイルの読みこみ
. "UploadFile.ps1"

# pscpコマンドへのパス
[string] $ScpCmd = "C:\opt\putty\pscp.exe" 

# sshサーバのホスト名
[string] $SshHostname = "myserver" 

# コピー先のパス
[string] $DstPath = "tmp/upload/"

# pscpのコマンドラインオプション
[string] $ScpOptions = "-q -batch -l myname -i `"C:\Users\myname\AppData\putty\id_rsa.ppk`"" 

# コピー元ファイル名
[string[]] = $srcfiles = @(
 "file1"
 "file2"
 "file3") 

$srcfiles | UploadFile -ScpCmd $ScpCmd -ScpOptions $ScpOptions -SshHostname $SshHostname -DstPath $DstPath

```

# プログラム本体 #

```ps1:UploadFile.ps1
Set-StrictMode -Version Latest

function UploadFile([string]$ScpCmd, [string]$ScpOptions, [string]$SshHostname, [string]$DstPath) {
<#
.SYNOPSIS
pcscpコマンドを使用してファイルをアップロードします。
#>
    begin {
        [string[]] $ScpOptionsArray = $ScpOptions -split " "
    }

    process {
        Write-Debug "Uploading '${_}' to ${SshHostname}:${DstPath}."
        "Uploading '${_}' to ${SshHostname}:${DstPath}."

        [string[]] $args = $ScpOptionsArray
        $args += "`"$_`""
        $args += "${SshHostname}:${DstPath}"

        Write-Debug "Executing $ScpCmd"
        Write-Debug ($args -join " ")

        # Start-Process cmdletはERRORLEVELを取得できないのでProcessStartInfoを使う
        $pinfo = New-Object System.Diagnostics.ProcessStartInfo
        $pinfo.FileName = $ScpCmd
        $pinfo.RedirectStandardOutput = $true
        $pinfo.RedirectStandardError = $true
        $pinfo.Arguments = $args
        $pinfo.UseShellExecute = $false

        $proc = New-Object System.Diagnostics.Process
        $proc.StartInfo = $pinfo
        [void]$proc.Start()
        $proc.WaitForExit()
        $stdout = $proc.StandardOutput.ReadToEnd()
        $stderr = $proc.StandardError.ReadToEnd()

        if (-not [String]::IsNullOrEmpty($stdout)) {
            $stdout
        }

        if (-not [String]::IsNullOrEmpty($stderr)) {
            $stderr
        }

        Write-Debug "Command exit code: $($proc.ExitCode)"

        if ($proc.ExitCode -ne 0) {
            throw "${_}: Upload failed."
        }
    }
}

```
Contact Form 7 で bootstrap3を使う


form にclassを追加する
ショートコードに追加

```shortcode
[contact-form-7 id="120" title="フォーム" html_class="form-horizontal"]
```

```html
<div class="panel panel-default">
	<div class="panel-heading">
		<h2 class="panel-title"><i class="fa fa-file-text-o"></i>フォーム</h2>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">お名前</label>
		<div class="col-sm-8">
			[text* your-name class:form-control]
		</div>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">ふりがな</label>
		<div class="col-sm-8">
			[text* your-hurigana class:form-control]
		</div>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">メールアドレス</label>
		<div class="col-sm-8">
			[email* your-email class:form-control] </p>
		</div>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">性別</label>
		<div class="col-sm-8">[checkbox* your-sex class:form-control use_label_element exclusive "男性" "女性"]</div>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">生年月日</label>
		<div class="col-sm-8">[text* your-birthday class:form-control] </div>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">住所</label>
		<div class="col-sm-8">[text* your-add class:form-control] </div>
	</div>
	<div class="form-group">
		<label class="col-sm-2 control-label">電話番号</label>
		<div class="col-sm-8">[text* your-tel class:form-control] </div>
	</div>
	
	<div class="form-group">
		<label class="col-sm-2 control-label">結婚</label>
		<div class="col-sm-8">[select* your-marriage class:form-control "既婚" "未婚"] </div>
	</div>
	<div class="form-group">
		<div class="col-sm-offset-2 col-sm-10">[submit class:btn class:btn-default "送信"]</div>
	</div>
	</div>
</div>
```

複数classを指定したい場合は並べる。
[submit で利用可能なオプション](http://contactform7.com/ja/submit-button/)
お手軽 AWS的Wordpressお引っ越しの方法


Wordpressサイトの引越をAWS環境から、AWS環境へ複製した流れが非常に簡単だったので作業手順のメモを残します。
両方AWSの同リージョン内であること、WP CLIが使えることが条件になっています。

##VPCの構築

新しく引越し先を作る場合はまずはVPCの作成から。
引越し元と同じ構成なら問題ありません。

今回は以下の構成にしてます。

* サブネットを２つのアベラビリティゾーンに計４つ作成
* パブリックサブネット用ルートテーブルを作成
* 各AZにひとつずつインターネットアクセス用のルートテーブルをサブネットに設定
* セキュリティグループをWEBサーバー用、DBサーバー用の２つを作成

##RDSの複製

DBSubnetGroupの作成し、 DBインスタンスの複製
複製したスナップショットからRDSインスタンスを作成

##EC2の複製

AMIの作成、 作成したAMIからインスタンスの起動
※ インスタンスタイプは変更できるがEBSのストレージ容量は変更できない

##Wordpressの設定の変更

ここからはwp cliを利用します。
もともとのインスタンスにインストールされていない場合はインストールをする必要があります。

まずはEC2にsshログイン。

Wordpressがインストールされているルートに移動し、wp-configのデータベースエンド
ポイントを変更します。
`define('DB_HOST','devdbinstance.cxwlma3qfgn9.ap-northeast-1.rds.amazonaws.com');`

次にドメインが変更になる場合はドメインの置換をします。  
`wp serch-replace 'http://before-sample.com' 'http://after-sample.com'`

最後に
`wp db optimize`

ユーザを変更したい場合、などワードプレスに関する編集作業は[こちら](http://qiita.com/bobu_web/items/cbaefc9f167aed039441)をご参考に
もしくは[オフィシャルサイト](http://wp-cli.org/)へ
組合せ最適化 - 典型問題 - 最小全域木問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最小全域木問題
無向グラフ$G=(V, E)$上の辺$e$の重みを$w(e)$とするとき、全域木$T=(V,E_T)$上の辺の重みの総和$\sum_{e \in E_T}{w(e)}$が最小になる全域木を求めよ。

##実行方法
```text:usage
Signature: nx.minimum_spanning_tree(G, weight='weight')
Docstring:
Return a minimum spanning tree or forest of an undirected
weighted graph.

A minimum spanning tree is a subgraph of the graph (a tree) with
the minimum sum of edge weights.
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import graph_from_table, networkx_draw
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
t = nx.minimum_spanning_tree(g)
pos = networkx_draw(g)
nx.draw_networkx_edges(t, pos, width=3)
plt.show()
print(t.edges())
```

```text:結果
[(0, 1), (0, 3), (0, 4), (2, 3), (4, 5)]
```

![mst2.png](https://qiita-image-store.s3.amazonaws.com/0/13955/b0c6eabc-93b0-ab1d-d35e-0fc461c94ff4.png)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import MinimumSpanningTree
MinimumSpanningTree('data/edge0.csv')
```
<table>
  <thead>
    <tr>
      <th></th>
      <th>node1</th>
      <th>node2</th>
      <th>capacity</th>
      <th>weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>3</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0</td>
      <td>4</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2</td>
      <td>3</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>4</td>
      <td>5</td>
      <td>2</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import math, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import networkx_draw
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 1)
pos = nx.spring_layout(g)
for i, j in g.edges():
    g.adj[i][j]['weight'] = math.sqrt(sum((pos[i] - pos[j])**2))
t = nx.minimum_spanning_tree(g)
pos = networkx_draw(g, nx.spring_layout(g))
nx.draw_networkx_edges(t, pos, width=3)
plt.show()
```

![mst.png](https://qiita-image-store.s3.amazonaws.com/0/13955/2a183039-a7c4-4b05-5e6c-78149f8bd0d3.png)

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
再起動をしないでunicorn + railsのログの出し直しをする

再起動でもいいのですがめんどくさいので、脇腹をつっつくだけで出力し直すことができます。

ファイルをいじったりリネームしたりしたあとはログが止まってしまうので、そういうときにサクッと使えるかなと思います。

間違ってkillしてしまうのが玉に瑕☆

```bash
kill -USR1 `pgrep -f 'unicorn_rails master '`
```

※怖い場合はpsコマンドで確認してください
AWSアカウント(ルート)の代わりになるIAM特権ユーザの作成手順（その３）

**「[IAM のベストプラクティス](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/IAMBestPractices.html)」**では特権ユーザーに対して、MFA を有効化するという記述があります。
**[AWSアカウント(ルート)の代わりになるIAM特権ユーザの作成手順（その１）](http://qiita.com/RyuKahou/items/afd0ad95f6ba5701b86d)**と
**[AWSアカウント(ルート)の代わりになるIAM特権ユーザの作成手順（その２）](http://qiita.com/RyuKahou/items/696f5ee27644a125784e)**で作成したIAM特権ユーザの多要素認証(MFA)を有効にします。

**１．**まず、IAM特権ユーザのアカウントでサインインします。

![newuser_mfa1.png](https://qiita-image-store.s3.amazonaws.com/0/65589/898c0939-a83a-aa61-81fd-178a2a8ded11.png)

**２．**IAMサービスをクリックします。

![newuser3.png](https://qiita-image-store.s3.amazonaws.com/0/65589/8b5f1da4-eaeb-63f6-5197-cf1bf8a899f7.png)

**３．**IAMサービス画面で、左側の「ユーザ」メニューを選び、右側のユーザ一覧からIAM特権ユーザをクリックします。
![newuser_mfa2_1.png](https://qiita-image-store.s3.amazonaws.com/0/65589/aacbb86a-dddf-b344-a27d-e7b7708116cc.png)


**４．**ユーザ情報画面の「サインイン認証情報」までスクロールし、「MFAデバイスの管理」ボタンをクリックします。

![newuser_mfa2.png](https://qiita-image-store.s3.amazonaws.com/0/65589/898d79e3-196f-6d92-b18c-6739e14e78a4.png)

**５．**今回Google Authenticatorを使用するので、「仮想MFAデバイス」を選び、「次のステップ」ボタンをクリックします。

![newuser_mfa3.png](https://qiita-image-store.s3.amazonaws.com/0/65589/14a0e955-2707-e899-6f5a-1bf383b4887d.png)

**６．**「進む前にMFAアプリをインストールしてください」という旨のメッセージが表示され、まだインストールしていない場合は、ここでスマートフォンにGoogle Authenticatorをインストールしましょう。
![newuser_mfa4.png](https://qiita-image-store.s3.amazonaws.com/0/65589/bfaf4529-a08e-677a-af24-520679bf2ae8.png)

**７．**次に進むと、ORコードが表示されます。スマートフォンでGoogle Authenticatorを起動して、ORコードをスキャンします。Google Authenticatorで表示された６桁の数字を「認証コード１」に入力し、３０秒後数字が変わったら「認証コード２」に入力します。２つ入力すれば「仮想MFAのアクティブ化」ボタンをクリックし確定します。

![newuser_mfa5.png](https://qiita-image-store.s3.amazonaws.com/0/65589/9a88de3c-e434-7f4a-f4f4-24f28b5f73c7.png)

**８．**iPhoneの画面は下記のようになります。数字のしたに、ORコードに含まれている「IAMユーザ名@アカウント別名」が表示されているので、識別のために使えます。

![newuser_mfa5_iphone.png](https://qiita-image-store.s3.amazonaws.com/0/65589/5b67a270-67d1-67c7-0e0a-0b309c5793a8.png)

**９．**サインアウトしてもう一回IAMユーザでサインインすると、エラーが発生します。MFAはもう有効になっています。

![newuser_mfa6.png](https://qiita-image-store.s3.amazonaws.com/0/65589/27e6e695-db69-477c-c970-f9f7b8d37265.png)

**１０．**「MFAトークンを持っています」をチェックし、「MFAコード」にスマートフォンのGoogle Authenticatorで表示されている６桁の数字を入力します。３０秒で無効になるので、早めにサインインボタンをクリックしてください。

![newuser_mfa7.png](https://qiita-image-store.s3.amazonaws.com/0/65589/b5d60d7e-14d8-60a6-58b4-a08904b9de9c.png)


**１１．**成功した場合は、管理画面が表示されます。
![newuser_mfa8.png](https://qiita-image-store.s3.amazonaws.com/0/65589/c01b76da-aaf7-b3c2-554f-21b518f6dd41.png)



これで、多要素認証の有効化したIAM特権ユーザで普段のAWSの管理業務を行うことが可能となりました。
***

**「[IAM のベストプラクティス](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/IAMBestPractices.html)」**ではAWSアカウントのMFAも有効にすると書いています。しかし、MFAデバイスの紛失及び故障時AWSにMFAの無効化を依頼する必要があるので、今回省略しました。IAMユーザのMFAの無効化はAWSアカウントでサインインした後、ステップ４と同じ操作方法で自らすぐにできるので、手間がかかりません。
RSpecの速度を並列実行で3倍速に〜3行書き換えて〜

RSpecの実行に数分〜数十分単位がかかるようになってきたので、並列実行を導入しました。ちなみに最近日本で流行りのCircleCIなどは使わず、古きよきJenkinsを使っています。

高速化の方法の選択として、下記記事を参考にしました。
[20150106: RailsのRSpecテストを速くする方法まとめ](http://ruby-rails.hatenadiary.com/entry/20150106/1420545920#fast-test-test-queue)

私は[test-queue](https://github.com/tmm1/test-queue)というgemを実行に使うことで高速化をはかりました。

## どれぐらい早くなった？

まず先に結論から。およそ**3倍早くなりました**。
なぜ3倍かというと、Jenkinsのホストマシンが3コアのマシンだからです。

__Before__
![スクリーンショット 2015-07-10 16.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/1676/91f8cda6-9aee-c63f-6977-25a7bf40dbde.png)

__After__
![スクリーンショット 2015-07-10 16.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/1676/679de92b-4abb-af3c-8326-c91a3bcfae3f.png)

もしこれが10コアだったら、10倍速になることでしょう。
一応、「データベースとの兼ね合いで...」「テストの実行順序が...」といった話はもちろん出ると思うんですが、私が今回試したアプリはActiveRecordを使っていないRailsアプリケーションなので、その点は問題ありませんでした。
純粋にコア数など並列実行数を上げれば上げるほど早くなるはずです。

## どうやるの？

やったことはたった2つです。

1. test-queueをInstall
2. Jenkins上での実行コマンドをtest-queueを利用する `rspec-queue --format progress spec` に変更

データベースを使う場合にはテストの並列実行の数(worker数)だけデータベースを作らないといけません。そのためのコード・方法も[test-queue README.md](https://github.com/tmm1/test-queue)に書いてありますのでどなたでもすぐ出来ると思います。

多くの人はデータベースを必要とするでしょうから、上記2点に加えてデータベース関連のコードをコピペするという工程が加わって、計3工程で行えるものと思います。

## 『Parallel tests』 vs 『test-queue』

RSpecの並列実行のためのgemは[Parallel tests](https://github.com/grosser/parallel_tests)の方が有名です。GitHubのスターも1400を超えていますし、[ruby-toolbox](https://www.ruby-toolbox.com/categories/distributed_testing)でもparallel_testsの方がスコアが高いです。test-queueのGitHubスターは333しかありません。(本記事投稿時点)

基本はparallel_testsの方をおすすめします。

並列化したいけどめんどくさいなーって思ってた方にはtest-queueがおすすめです。設定もシンプルですし、`rake`系の独自コマンドを覚えたりする必要もありません。

いや、Parallel testsもシンプルに出来るはずなんですけどね、ドキュメントの量自体が多くって、どうしても、とっつきがめんどくさいんですよね。。。

## おまけ

参考までに実行中の各コアのCPU使用率を貼ってみます。ほぼ全コア平均して50%~80%を消費していました。

![スクリーンショット 2015-07-10 16.35.37.png](https://qiita-image-store.s3.amazonaws.com/0/1676/4fc8289d-d523-db4f-39d2-f7372556e50f.png)

## おわりに

Jenkins万歳！  ＼(^o^)／
Dockerコマンドを多用している[SideCI](https://www.sideci.com/)はCircleCIではテストが動きません。フロントエンドのテストはCircleCIを使っていますが。

Dockerを使った「コードレビュー」のためのCI環境である[SideCI](https://www.sideci.com/jobs)はユーザ様だけでなく一緒に働いて頂けるエンジニアの方も募集しております！ `_(._.)_`
NODE_ENVを使って環境ごとに変数を切り替えてbuildするときに他の環境の変数は見せないようにする方法

client sideをReactのようなSingle Page Applicationで開発している場合、ソースコードは自由に閲覧できてしまうため必要ない情報は入れないようにすべきです。

開発環境と本番環境でkeyやurlを切り替え、さらに他の環境のkeyやurlはソースコードに含まれないようにしたかったので方法を調べました。


gulpやgruntは使わずにnpmのscriptだけでやってみました。

#サンプルコード
結論から書くと以下のようなscriptで実現できました。

##npm script
```
  "scripts": {
    "build-production": "NODE_ENV=production browserify app/index.js -t babelify -t envify | uglifyjs -c warnings=false > public/bundle.js",
    "build-staging": "NODE_ENV=staging browserify app/index.js -t babelify -t envify | uglifyjs -c warnings=false > public/bundle.js",
    "build-development": "NODE_ENV=development browserify app/index.js -t babelify -t envify | uglifyjs -c warnings=false > public/bundle.js"
  }
```

##client side
ParseSDKのkeyを環境ごとに設定しています。
build後のファイルには該当する環境以外の部分は含まれません。

```
if (process.env.NODE_ENV === 'production') {
  Parse.initialize('production-key1', 'production-key2');
}else if (process.env.NODE_ENV === 'staging') {
  Parse.initialize('staging-key1', 'staging-key2');
}else if (process.env.NODE_ENV === 'development') {
  Parse.initialize('development-key1', 'development-key2');
}
```

#Scriptの説明
##envify
envifyを使うとnodeの環境変数(process.env.NODE_ENV)を設定したstringsに置き換えてくれます。


NODE_ENV=productionとしていた場合に

これが

```
if (process.env.NODE_ENV === "development") {
  console.log('development only')
}
```

こうなります。

```
if ("production" === "development") {
  console.log('development only')
}
```

##uglifyjs
さらにuglifyjsを使うとbuild時に絶対通ることがないコード("if(false)"のような)を削除してくれます。

NODE_ENV= developmentだと削除されませんが

```
if ("development" === "development") {
  console.log('development only')
}
```

NODE_ENV=productionだと削除されます。

```
if ("production" === "development") {
  console.log('development only')
}
```


##uglifyjsのoption

uglifyjsにはソースの削減に関する様々なオプションがあります。

-cオプションを付けないと上記のような条件判定部分の削除はしてくれませんでした。

optionは細かく設定できるようなので詳細はgithubのreadmeを読んでみてください。
https://github.com/mishoo/UglifyJS2

-cオプションをつけると削除する部分についてwarningが出力されるのですが、量が多かったのでwarnings=falseで出ないようにしています。
ssh localhostをパスワードなしで

微妙につまずいたのでメモ。うまくいかないのは、どこかのパーミッションがおかしいと思った方がよいのかも

1. パスワードなしで実行させたいユーザで、ssh-keygen
2. できた公開鍵をauthorized_keysに追記
3. ユーザのhomeディレクトリのパーミッションを755
4. authorized_keysのパーミッションを600
Goでテストコードのみのリポジトリを作る時の落とし穴

# やろうとしたこと
## 起
製品のリポジトリを作った。

```
github.com/hoge/fuga
```

コードいっぱい書いた。ユニットテストもいっぱい書いて同じリポジトリに入れた。

## 承
リポジトリがあまりに大きくなってしまったので、インテグレーションテストは別のリポジトリに分けようと思った。

```
github.com/hoge/fugatest
```

またいっぱいテストコード書いた

## 転
折角だから別のマシンでもテストしてみよう。
Goはgo getコマンド一つで依存パッケージ含めてダウンロードできるから楽だよね。

## 結

```
> go get github.com/hoge/fugatest
package github.com/hoge/fugatest
        imports github.com/hoge/fugatest
        imports github.com/hoge/fugatest: no buildable Go source files in c:\gopath\src\hoge\fugatest
```

＿人人人人人人＿
＞　突然の死　＜
￣Y^Y^Y^Y^Y￣

# 傾向と対策
## 何がダメだったの？
go getはリモートリポジトリからのダウンロード後に自動でgo installするので、リポジトリの直下にmainが無いとエラーになっちゃうみたい。

## 試してみたこと
https://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies
> The -d flag instructs get to stop after downloading the packages; that is, it instructs get not to install the packages.

公式ドキュメント読んでみたら、-dオプション使えばダウンロードだけでinstallしないって書いてあった。早速やってみよう。

```
> go get -d -u github.com/hoge/fugatest
package github.com/hoge/fugatest
        imports github.com/hoge/fugatest
        imports github.com/hoge/fugatest: no buildable Go source files in c:\gopath\src\hoge\fugatest
```

＿人人人人人人人人人人人人＿
＞　やっぱり駄目だった！　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

## 結局

リポジトリ直下にダミーのmain.goを作ってエラーを回避しました。なんかすっきりしない。
てかこの方法だとテストコードの依存パッケージ落ちてこないしgo getの恩恵が薄い。悲しいなあ。

## ここまで書いて気付いた

> The -t flag instructs get to also download the packages required to build the tests for the specified packages.

テストコードの依存パッケージを取るためのオプションがあった。何故見逃したし。
これでなんとかなるといいなあ。
Herokuでsinatraのデプロイ(padrinoも)

## 参考

* [Ruby - 【mkdirからデプロイまで3分】Sinatra+Haml+Sass+Coffee でサクッとHerokuに公開して捨てるwebアプリ - Qiita](http://qiita.com/gogotanaka/items/760d4e6ad2b19ff78ff9)

# 手で準備

```bash:
mkdir myapp && cd myapp
git init
bundle init
```

```rb:Gemfile
source 'https://rubygems.org'

gem 'sinatra'
gem 'haml'
gem 'sass'
gem 'coffee-script'
group :development do
  gem 'foreman'
end
```

```bash:
bundle install
```

## プログラム準備

```rb:app.rb
require 'bundler/setup'
require 'sinatra'

require 'haml'
require 'sass'
require 'coffee-script'

get '/' do
  @mes = 'こんにちは'
  haml :index
end
```

```rb:Procfile
web: bundle exec ruby app.rb -p $PORT
```

```haml:views/index.haml
!!!
%meta(charset="UTF-8")
%title #{@title="たいとる"}
%script(src="//code.jquery.com/jquery-2.1.4.min.js")
//%script(src="myscript.js")

:sass
  h1
    color: red

:coffee
  console.log('Hello!')

%h1 #{@title}
```

## ローカル確認

```bash:
foreman start
```

http://localhost:5000

## Herokuにpush

```bash:
heroku create
git add -A && git commit -m "init"
git push heroku master

heroku open
```

# padrino

* [Ruby - Padrinoをオススメする6つの理由 - Qiita](http://qiita.com/kakkunpakkun/items/488f2d427fc77ba61470v)

```bash:
padrino g project myapp \
  -d activerecord -t rspec -e slim -s jquery
cd myapp
bundle
```

```diff:app/app.rb
  module Myapp
    class App < Padrino::Application
      use ConnectionPoolManagement
      register Padrino::Mailer
      register Padrino::Helpers
      enable :sessions
+     get '/' do
+       "Hello World"
+     end
    end
  end
```

## 管理画面

* [Guides Blog Tutorial - Padrino Ruby Web Framework](http://www.padrinorb.com/guides/blog-tutorial)

```bash:
padrino g admin
bundle install
padrino rake ar:create
padrino rake ar:migrate
padrino rake seed  #管理画面ログイン用のメールアドレス、パスワードを入力
```

```bash:
padrino s -h 0.0.0.0
```

http://localhost:3000/admin/ にアクセスすると管理画面が表示される。

## heroku用にpostgres対応

```diff:Gemfile
-gem 'sqlite3'
+group :development do
+  gem 'sqlite3'
+end
+group :production do
+  gem 'pg'
+end
```

```bash:
bundle install
brew install postgresql
```

```diff:config/database.rb
-ActiveRecord::Base.configurations[:production] = {
-  :adapter => 'sqlite3',
-  :database => Padrino.root('db', 'myapp_production.db')
-}
+postgres = URI.parse(ENV['DATABASE_URL'] || '')
+
+ActiveRecord::Base.configurations[:production] = {
+  :adapter  => 'postgresql',
+  :encoding => 'utf8',
+  :database => postgres.path[1..-1],
+  :username => postgres.user,
+  :password => postgres.password,
+  :host     => postgres.host
+}
```

## herokuにデプロイ

```bash:
git init
git add -A && git commit -m "init"
heroku create
git push heroku master

heroku run rake ar:migrate
heroku run rake seed
heroku open
```

![スクリーンショット 2015-07-10 16.01.07.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4345dd62-57ba-434d-63f3-f5ac8fbb96d5.png)
SourceTreeでHerokuで動かしているGitプロジェクト名を変える

**cloudbit**というプロジェクトを**cloudbit-webapi**という名前に変えたくなったとします。

以下の流れで進めます。

1. ローカルの変更
2. GitHubの変更
3. Herokuの変更

### ローカル

プロジェクトフォルダ名を変えます。

```shell-session
$ mv cloudbit cloudbit-webapi
```

するとブックマークが以下のようになります。

![ブックマーク_と_新規投稿_-_Qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/ec2e9298-f69b-6b66-2762-c20ede9aac9a.jpeg)

右クリック→「削除」します。そして、「新しいリポジトリ」→「作業コピーを追加」します。

![ブックマーク_と_新規投稿_-_Qiita1.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/4da27d0c-2f2d-df87-4d85-05c966ae7e8d.jpeg)

### GitHub

GitHubのプロジェクトのページへ行き、「Settings」→「Settings: Repository name」を「cloudbit」から「cloudbit-webapi」に「Rename」します。

![Options.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/0eced8dc-10d2-2f49-76ca-d274309645f6.jpeg)


SourceTreeで「cloudbit-webapi」プロジェクトを開き、メニュー「リポジトリ」→「リポジトリ設定」をクリックします。

![cloudbit-webapi-p150705__Git_.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/58a0430c-0185-afa3-3b9e-87a398360515.jpeg)

「origin」を選択→「編集」→「URL / パス」の「cloudbit」を「cloudbit-webapi」に変えます。

![スクリーンショット_2015_07_10_15_44.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/2dc4a2dc-2479-58a2-1f97-7b0be4c6fdd3.jpeg)


### Heroku

Herokuのサイトへ行き、ダッシュボードから→「cloudbit」→「Settings」→「Name」を「cloudbit」から「cloudbit-webapi」に変えます。

![cloudbit-webapi-p150705_·_Settings___Heroku.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/3b0a4d02-b802-0ba1-612e-5be9c4345442.jpeg)


SourceTreeで「cloudbit-webapi」プロジェクトを開き、メニュー「リポジトリ」→「リポジトリ設定」→「heroku」→「編集」→「URL / パス」の「cloudbit」を「cloudbit-webapi」に変えます。

![スクリーンショット_2015_07_10_15_48.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/c9c88dff-af22-4d60-9855-7177ec65349c.jpeg)

これで完了です。

---
ブログやっています：http://weed.nagoya
Pepperハンズオン まとめ [Tech-Circle#7]

本記事は [Tech-Circle#7 Pepper ハンズオン](http://techcircle.connpass.com/event/16275/) 勉強会の内容です。

---

## はじめに

勉強会で必要な情報については、本記事にリンクをまとめています。ハンズオン中、各記事へのリンクは本ページを参考にしてください。

* [この勉強会へのイベントページ](http://techcircle.connpass.com/event/16275/)

## Pepperハンズオン勉強会について

Softbankの感情認識ロボットPepperのハンズオン勉強会を行います。
Pepperには様々なカメラ、マイク、センサが搭載されており、それらセンサから収集したデータを活用してパターン認識などの機械学習を行います。Pepperが人物の年齢、性別推定、表情認識するアプリを開発しましょう。
Pepperをクラウドとつないで賢くするハンズオンです。 Google Speech APIや、ReKoginition APIなどのweb APIをつかって音声認識や、画像認識した結果をPepperに喋らせます。

## 事前準備 （所要時間目安: 20～30分）
* [事前準備内容](http://qiita.com/shiraco/private/e3029a3c458debfa909e)

## Tech-Circle紹介
* [紹介資料](http://www.slideshare.net/shiraco/techcircle007welcome)

## 発表内容
* [発表資料](http://www.slideshare.net/shiraco/techcirclepepper)

## ハンズオン内容
### [～基本編A 対話基礎～ Dialogを使ってPepperと対話してみる](http://qiita.com/shiraco/private/182a95873cd6f5274d9b)（所要時間目安: 15分）
* ① (復習) Speech Reco. + SayでPepperと対話してみる
* ② Dialogを使ってPepperからの質問に答えてあげよう

### [～基本編B 音声認識～ Google Speech APIを使ってPepperにあなたの名前を知ってもらう](http://qiita.com/shiraco/private/460b9a6ce7c9426d6be3)（所要時間目安: 15分）
* ① Google Speech APIをターミナルから実行してみる (要Pythonインストール)
* ② Google Speech APIを使ってPepperにあなたの名前を確実に覚えてもらう
* ③ (おまけ) よしもとロボット研究所モーションボックスライブラリでPepperに動きを付けてみよう

### [～基本編C 画像認識～ ReKognition APIを使ってPepperにあなたの見た目の印象を聞いてみる](http://qiita.com/shiraco/private/9836048e30612bb96582)（所要時間目安: 20分）
* ① ReKognition APIをターミナルから実行してみる (要Pythonインストール)
* ② Pepperにあなたの性別と年齢を聞いてみる

----

## ヒント（参考資料）

ハンズオンで必要になる知識全てを講師から紹介できません。比較的参考になる情報を以下にまとめています。必要に応じて以下より辿ってください。
（他にもあれば、コメントいただければ適宜追加します。）

* [ワークショップ資料 | アトリエ秋葉原公式ブログ](http://pepper-atelier-akihabara.jp/archives/439)
* [モーション作成を効率化するボックスライブラリを公開 | アトリエ秋葉原公式ブログ](http://pepper-atelier-akihabara.jp/archives/259)
* [Pepperチュートリアル (1)：SDKインストールとアプリケーションの作成/実行 - Qiita](http://qiita.com/Atelier-Akihabara/items/c5f57358a7b333eef397)
* [Pepperチュートリアル (2)：ボックスの考え方- Qiita](http://qiita.com/Atelier-Akihabara/items/7a898f5e4d878b1ad889)
* [Pepper開発に向けて、Pythonを理解する。-Pythonボックス入門編- - Qiita](http://qiita.com/DeveloperRyo87/items/fe00ae0f0c0cc34092ba)
* [HTTP Getボックスの作成 - Qiita](http://qiita.com/Atelier-Akihabara/items/acc8d2ad6c3881f112a4)

---
本ハンズオンのイベントページ
[Tech-Circle#7 Pepper ハンズオン](http://techcircle.connpass.com/event/16275/)
AWSアカウント(ルート)の代わりになるIAM特権ユーザの作成手順（その２）

**[AWSアカウント(ルート)の代わりになるIAM特権ユーザの作成手順（その１）](http://qiita.com/RyuKahou/items/afd0ad95f6ba5701b86d)**で作成したIAMアカウントは、請求サービスをまだ利用できません。

***
アクセスすると、下記のようにエラーが発生します。


**１．**IAMアカウント名をクリックし表示されたメニューから「請求とコスト管理」を選びます。

![newuser_bill0.png](https://qiita-image-store.s3.amazonaws.com/0/65589/e4434317-3fff-0108-d9df-d4c66b7bd8c0.png)


**２．**下記のように「権限がない」という旨のエラーが表示されます。

![newuser_bill2.png](https://qiita-image-store.s3.amazonaws.com/0/65589/32e3fcb0-8697-96df-3f59-682ac411af5d.png)

***
この権限はIAM画面で設定できません。もう一度AWSアカウント(ルート)でサインインして、「アカウント」画面で設定する必要があります。

**１．**まずサインアウトして、AWSアカウント(ルート)でサインインします。下記のようなIAMサインイン画面が表示されたとき、「ルールアカウント認証情報を使用してサインイン」をクリックします。

![newuser_bill3.png](https://qiita-image-store.s3.amazonaws.com/0/65589/4261ec77-2791-f82d-022b-7c7b9cf299ca.png)


**２．**AWSアカウントサインイン画面でAWSアカウント(ルート)の情報でサインインします。
***(IAMユーザではない)***

![newuser_bill4.png](https://qiita-image-store.s3.amazonaws.com/0/65589/aca73f58-45ab-b758-fc56-948d9c0e2b06.png)


**３．**右上のメニューから「アカウント」を選びます。

![newuser_bill1.png](https://qiita-image-store.s3.amazonaws.com/0/65589/49ab1d7a-1dde-5dcf-6ce4-55c20d0ccf10.png)

**４．**アカウント画面のIAM設定までスクロールし、「編集」をクリックします。

![newuser_bill5.png](https://qiita-image-store.s3.amazonaws.com/0/65589/0856a571-db06-9b62-4e8a-0b6e1b2d849c.png)

**５．**「IAMアクセスのアクティブ化」をチェックし、更新ボタンをクリックします。

![newuser_bill6.png](https://qiita-image-store.s3.amazonaws.com/0/65589/7aac498c-bb7e-2e20-a99d-db1f20e7d6b7.png)

**６．**先「IAM設定は現在ご利用いただけません」で表示されたところ、「請求情報に対するIAMユーザーアクセスがアクティブ化されます」という文字に更新されたことを確認します。

![newuser_bill7.png](https://qiita-image-store.s3.amazonaws.com/0/65589/1367d667-8ae1-1750-d51b-46f0a9e9ac9e.png)

**７．**現在サインイン中のAWSアカウントをサインアウトし、IAM特権ユーザでサインインします。

![newuser22.png](https://qiita-image-store.s3.amazonaws.com/0/65589/fb1ace30-ae19-3c35-b9f2-3f6821bc7a01.png)

**８．**成功にサインインしたら「請求とコスト管理」メニューをクリックします。

![newuser_bill0.png](https://qiita-image-store.s3.amazonaws.com/0/65589/e4434317-3fff-0108-d9df-d4c66b7bd8c0.png)

**９．**請求情報が表示されれば成功です。

![newuser_bill8.png](https://qiita-image-store.s3.amazonaws.com/0/65589/fd22b371-fbdd-daf4-2d70-8b38fb19fc17.png)


**[続きを読む](http://qiita.com/RyuKahou/items/625788a39729d0757986)**
SymfonyをCentOSにインストール

# SymfonyをCentOSにインストール
**Symfony 2.7** を CentOS 6 または Centos 7 にセットアップする手順のまとめ。
## 環境構築
### Yumリポジトリの追加
```bash
$ yum install http://rpms.famillecollet.com/enterprise/remi-release-`rpm -q --whatprovides /etc/redhat-release --qf '%{version}\n'`.rpm
$ yum install http://dev.mysql.com/get/mysql-community-release-el`rpm -q --whatprovides /etc/redhat-release --qf '%{version}\n'`-5.noarch.rpm
```
remiリポジトリーインストール時に依存性解消でEPELレポジトリーが自動的にインストールされる。
### Apache/PHP/MySQLのインストール
```bash
$ yum install php php-xml php-mbstring php-mysql php-pecl-xdebug mysql-server --enablerepo=remi-php56
```
```bash
$ sed -i 's/;date\.timezone =/date.timezone = Asia\/Tokyo/' /etc/php.ini
$ sed -i 's/\[mysqld\]/\[mysqld\]\ncharacter-set-server = utf8/' /etc/my.cnf
```
## Symfonyプロジェクトの作成
Composer でインストールすると一部のディレクトリーやファイルが展開されないなどの微妙な差異が生じる。
### Composerでセットアップ
```bash
$ cd /var/www/html
$ curl -s https://getcomposer.org/installer | php
$ php composer.phar create-project symfony/framework-standard-edition my-project
```
### Symfonyコマンドでセットアップ
```bash
$ cd /var/www/html
$ curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony
$ chmod a+x /usr/local/bin/symfony
$ symfony new my-project
```
## ブラウザーで確認
### PHPビルトインサーバーで起動
```bash
$ cd my-project
$ php app/console server:run 192.168.56.101:8000
```
* http://192.168.56.101:8000/
Mail.appのデータをThunderbirdに手動で移行する

# はじめに

Thunderbirdデータのインポートは、Apple Mail 5.0 以前のバージョンにしか対応していないらしい。ローカルにある大量のメールデータをなんとかして移行したい。そこで、EMLX to mbox converterを使って手動で移行する。以下、試すなら自己責任で。

# EMLX to mbox Converterの取得

以下よりダウンロードする。
http://www.cosmicsoft.net/emlxconvert.html

# emlxデータのコピー

emlxデータは/Users/username/Library/Mail/V2/Mailboxes以下にある。Mac Mailでローカルにフォルダを作っていれば、inbox.mboxなどのディレクトリがそこにあるはず。しかし、emlxファイルはさらにそこの階層深くに眠っている。EMLX to mbox converterは、emlxファイルそのものをドロップしてやらないといけないようだ。

仕方ないので、findコマンドで一括して見つけて、適当なディレクトリ(例えば~/mailtemp)にコピーし、そのディレクトリから一括してドロップしてやることにする。Macの端末のcpはxargsと相性が悪いので、rubyのワンライナーで。

```shell-session
$ find inbox.mbox -name *.emlx | ruby -ne 'file=$_.chomp;`cp #{file} ~/mailtemp`;puts file'
```

# EMLX to mbox Converterで変換

このあと、mailtempにある*.emlxファイルを一度にEMLX to mbox Converterに食わす。ファイルが全て表示されたら、Save mboxとし、例えばデスクトップにinbox.mboxというファイル名で置いておく。するとemlxファイルがまとめてmboxファイルに変換される。

# Thunderbirdのディレクトリにコピー

できたinbox.mboxの中にある「mbox」というファイルを、inbox.mboxという名前にリネームした上で、Thunderbirdのディレクトリにコピーする。

*作成されたnbox.mbox(これはディレクトリ)をそのままコピーするのではなく、その中にあるmboxというファイルをリネームした上でコピーすることに注意。*

コピー先は~/Library/Thunderbird/Profiles/hogehoge.default/Mail/Local Foldersとかいう名前になっているはず。ここに先ほど作成したinbox.mboxというファイルをコピーしてからThunderbirdを立ち上げると、ローカルフォルダの中に「inbox.mbox」というフォルダが作成されており、中のメールが読めるようになっているはず。

上記の作業を、Mail.appで作成したローカルフォルダの数だけ繰り返せば終了。繰り返しになるが、くれぐれも自己責任で。
AWS EC2インスタンスストアをSwap領域に活用する

# 困ったこと

SWAP領域はLinuxのメモリ管理に重要な役割を果たしています。
一方で、AWSの公式AMIではSWAP領域を用意していません。

よくある解決策はEBS(OS上領域)にSWAPファイルを作成してSWAPとして使用するというやり方です。
ただし、EBS上のIOアクセスは課金されてしまうため、気を付けないと予算をオーバーしてしまう危険性があります。

# 解決方法

m3などのインスタンスタイプに用意されているIOアクセスが課金されない「インスタンスストア」に注目しました。

しかし、「インスタンスストア」はインスタンス再起動時インスタンスストアのデータはすべて削除され、自動的にext3に再フォーマットされてしまいます。
これらの特性を踏まえて以下の案を考えました。

## 1. ボリューム追加

AWSインスタンス作成時「ストレージの追加」のステップで、`インスタンスストア0`を`/dev/sdb`としてボリューム追加します。


## 2. インスタンス起動後設定

`/etc/fstab`を以下のように修正します。

```sh:/etc/fstab
...
↓ 従来設定をコメント
# /dev/xvdb /media/ephemeral0 auto defaults,nofail,comment=cloudconfig 0 2
/dev/xvdb swap swap defaults 0 0
```

## 3. SWAP領域作成スクリプト準備

`/var/lib/cloud/scripts/per-boot`直下に、実行権がある`makeswap.sh`ファイルを作成します。
`makswap.sh`中身は以下です。

```sh:makeswap.sh
#!/bin/bash
SWAPDEVNAME=/dev/xvdb
if [ -b $SWAPDEVNAME ]; then
    /sbin/swapoff -a
    /sbin/mkswap $SWAPDEVNAME > /dev/null
    /sbin/swapon -a -e
fi
```


## 4. 確認作業

OS再起動後、`swapon -s`でSWAP領域が作成されたことを確認できます。


# 参考情報

インスタンスストアを利用できないAWSインスタンスタイプの場合は、こちらを参考にしてください。
http://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/
chainerで少しつまったところ

#エラー内容

```
$ python
>>> from chainer import cuda
>>> cuda.init(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "(pythonのディレクトリ)/site-packages/chainer/cuda.py", line 125, in init
    cumisc.init(mem_alloc)
TypeError: init() takes no arguments (1 given)
```

#原因
scikits.cudaパッケージのバージョンが適切でなかったっぽい(0.42でやってたら失敗しました)

#解決方法
```
$ pip uninstall scikits.cuda
$ pip install scikits.cuda==0.5.0b3
```
Makoってパッケージが入ってなかったらそれも入れる

```
$ pip install Mako
```
.NETのexe/dllとMSILを相互に変換する

# exe/dll → msil

ildasm.exeを使います。格納位置は以下の様な場所です。お察しの通りVisualStudioなどをインストールすると一緒に入ってくるようです。簡易なILSpyのようなGUIもついています。クラス名などの確認だけなら普通に使えます。

例
`C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe`

### 構文
`ildasm [options] [PEfilename] [options]`

## よく使うオプション
|名前|意味|
|---|---|
|/out=filename.il|GUIで表示せずに、ファイルへ出力する|
|/nobar|変換中のプログレスバーを非表示|
|/utf8|ANSIではなく、UTF8で出力する|


例によってUnityのDLLをilに変換します。
`> ildasm /out=Assembly-CSharp.il Assembly-CSharp.dll`

公式ドキュメント
https://msdn.microsoft.com/ja-jp/library/f7dy01k1(v=vs.110).aspx



# msil → exe/dll

ilasm.exeを使います。こちらは、VSが入っていなくとも使えます。

例
`C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe`

## よく使うオプション
|名前|意味|
|---|---|
|/dll|標準のexeではなく、dllを出力|
|/output:filename|ファイル名を拡張子付きで指定。標準は入力ファイルと同等|
|/x64|ターゲットをAMD64に設定|
|/pe64|標準ではitaniumの64bitに設定|



`> ilasm.exe /dll Assembly-CSharp.il`

公式ドキュメント
https://msdn.microsoft.com/ja-jp/library/496e4ekx(v=vs.110).aspx


MSILを読みあたって、参考にしたサイト
http://www.asukaze.net/etc/cil/opcode.html
我が家を支えるChatOps

この記事は[Hubot Advent Calendar 2014](http://www.adventar.org/calendars/384)の15日目です。

我が家でやり始めたchatopsのことを書こうと思います。


# 家族構成

- 私、嫁の二人暮らし
- 共働き
- 私：めんどくさがり
- 嫁：めんどくさがり

# 巻き起こる問題

- どっちがゴミ捨てる問題
- どっちが洗濯、掃除するか問題
- どっちがシャンプーとか詰め替えるか問題

お互いめんどくさがりなので、
毎回、ギリギリまで耐えて相手にやらせようと戦っています

# その結果

- 貯まるゴミ、洗濯モノ・・・


これはイカン！

ということで、
家庭内問題解決のためChatOpsやってみました。


# ゴミ出しBot作った

毎日夕方に明日出すゴミとその担当をチャットに流します。

![20141215111852.png](https://qiita-image-store.s3.amazonaws.com/0/5219/f236a0ef-3863-3451-c10c-57e0c2aa33b6.png)


って感じでゴミ出し当番を回すようにしています。
毎回この通りにやっているわけではないですが、以前よりはよくなったような。


ソースはこんな感じです。

```coffeescript
persons = ['夫','嫁']
week = ["日","月","火","水","木","金","土"]
garbage_config = ["燃えるゴミ","ビン缶ペットボトル","燃えるゴミ","燃えないゴミ","燃えるゴミ","燃えるゴミ","燃えないゴミ"]


module.exports = (robot) ->

  #gabage
  new cron
    cronTime: "0 0 21 * * *"
    start: true
    timeZone: "Asia/Tokyo"
    onTick: ->
      now = new Date()
      target_day = now.getDay() + 1
      rand_num = (Math.floor(Math.random() * 100) + 1) % persons.length
      if target_day > week.length
        target_day = 0
      winner = persons[rand_num]
      robot.send {room: "xxxxxxx@conf.hipchat.com"}, "明日の#{week[target_day]}曜は#{garbage_config[target_day]}の日ですー！\n担当は#{winner}ですん"
```


チーム運用の改善に利用されるChatOpsですが、
今回は家庭運用に使ってみました。

家族も重要なチームと捉えれば色々改善できそうなとこありそうですね！


同じネタで社内LTをやったので、
その時のスライドも貼っておきます！


<iframe src="//www.slideshare.net/slideshow/embed_code/key/8IleWMJmevR66N" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/TakahiroOgasawara/chatops-42701213" title="我が家を支えるChatOps" target="_blank">我が家を支えるChatOps</a> </strong> from <strong><a href="//www.slideshare.net/TakahiroOgasawara" target="_blank">Takahiro Ogasawara</a></strong> </div>


<br />
<br />
感謝致します。
RedmineとGitHubを連携

チケット管理はRedmine、ソース管理はGithubでやっていたのですが、チケットとコミットの関連付けが欲しくなったので、RedmineとGitHubを連携させることにしました。

よくあるネタですが、GitHubとの連携のところですこしつまずいたので、ちょっとまとめてみました。

## RedmineのリポジトリとGitHub上のリポジトリを連動させる

### プラグイン追加

下記を追加します。
https://github.com/koppen/redmine_github_hook

* gemの追加

```
sudo gem install json
```

* ソースの配置

```
cd <REDMINE_ROOT>/plugins
git clone https://github.com/koppen/redmine_github_hook.git
```

* Redmineの再起動

```
cd <REDMINE_ROOT>/tmp
touch restart.txt
```

上記をしてから、redmineのサイトにアクセス。
管理ページ>プラグインに追加されていれば成功。

### Redmineサーバ上にリポジトリをclone

GitHubのリボジトリをcloneします。apacheユーザがgit pullなどをできるような形にする。
ここでつまずいたのですが、`sudo -u apache` をつけることで解決できました。以降のコマンドは、その前提のものとします。

#### GitHubのdeploy key用の鍵作成

参照だけで良いので、デプロイキーに登録する公開鍵を作成します。

※　プロジェクト毎に別のリポジトリを連携させるには、deploy keyではできない。複数のリポジトリにアクセス権を持つ専用ユーザ[^1]を作成して、そのユーザに対して公開鍵を登録すること。


```
ssh-keygen -t rsa
```

/var/www/.ssh　に鍵を配置。(ownerをapacheに)
パスフレーズなし。
作成された公開鍵をGitHubリポジトリのSetting＞Deploy Keys　から登録
https://developer.github.com/guides/managing-deploy-keys/


#### git clone

--bare　をつけて、サーバモードにする必要があるようです。

```
cd /opt/repos
 git clone --bare git@github.com:XXXXXXXXXXX/hoge.git
```

リモートの設定をして、fetchできるようにします。

```
git remote add origin git@github.com:<username>/<project>.git
```

### Redmineのリポジトリ設定

上記で作ったリポジトリを、プロジェクトのメインリポジトリとして追加します。

プロジェクトの画面の設定＞リポジトリ＞新しいリポジトリ　から、下記のように設定します

![repo_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/9880/22247edb-b66d-d2e9-72ba-ca4d3921368d.jpeg)


### GitHubのWebhook

GitHubにpushされたら、redmineのリポジトリにそれを通知させるために、webhookの設定をします。手順はプラグインのreadmeに書いてあります。
下記のように、通知先のURLを設定します。

`https://[your_redmine]/githook?project_id=[your_project_id]`

## チケットとコミット（リビジョン）の関連づけ

公式サイトにもありますが、簡単にやり方をまとめておきます。
http://redmine.jp/tech_note/subversion/

### リビジョンから

リボジトリタブを開くと、リビジョンの一覧が見られます。
リビジョンをクリックすると「関連するチケット」というのがあり、そこの右端にある追加を押すと、チケット番号の入力フォームが出ます。それで、そのリビジョンとチケットを関連づけられます。

### コミットから

管理＞設定＞リポジトリを開くと、「コミットメッセージ内でチケットの参照/修正」があります。
そこにある参照キーワードとチケット番号をコミットメッセージに含めると、そのチケットに関連づけができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/9bfdc475-269c-7443-5900-30ec015c0b8f.png)


`refs #1234 hogeを修正` といれてコミットすると、#1234 のチケットに「関係しているリビジョン」というのが表示されるようになります。


## まとめ

連携できると、Redmineの検索でコミットメッセージもひっかかるようになります。
どのチケットの議論でそういう実装をしたのか、このコミットはなんのための変更かなのか、といったことが追いやすくなります。

また、コミットするたびに「関係しているリビジョン」にどんどん追加されるので、進捗アピールのひとつになります。

仕様決めの経緯と実装を追跡しやすくなると、安心感が得られます。

## 参考サイト

http://hidechae.hatenablog.com/entry/2013/02/28/034126

http://qiita.com/kp_ohnishi/items/a15022efc6392ae2b51e

http://kentana20.hatenablog.com/entry/2014/03/30/090000

[^1]: GitHubでは上記のような、なんらかの自動化のためのアカウントを[machine-user](https://developer.github.com/guides/managing-deploy-keys/#machine-users) と呼ぶようです。[アカウント利用規約](https://help.github.com/articles/github-terms-of-service/#a-account-terms)によると、個人でも組織でも、そういうのはひとつだけにするようにとのことです。