OmniAICreator/Qiita-1.07M huggingface dataset:
Gulpを導入してみる

仕事で初めて使ってみて、便利だったので導入方法を書いてみます。
ちなみにQiitaも初書き。

# Gulpとは
Node.js製タスクランナー  

- Sassのコンパイル
- ブラウザのリロード
- HTML、CSS、JavaScriptの最適化
- 画像の最適化
- ローカルWebサーバー立ち上げ

などの作業をタスクに登録すると、
ファイルの更新タイミング等でタスクを自動実行してくれます。

gruntと似たものらしい（私はgruntを使った事がないですが)

***

**メリット**

- 設定ファイル(gulpfile.js)がGruntより記述しやすい
- Gruntより速い
- Gruntより後発で新しい感

**デメリット**

- 複雑なことは敷居がやや高め、javascript知識が多少は必要
- ドキュメントが少ない（最近は増えてきた？



# インストール手順
まず前提条件でNode.jsをインストールしておきます。

## gulpをインストール
  

	$ npm install -g gulp
	$ gulp -v

エラーが出る場合sudoをつけて実行します。
バージョン情報が見れれば完了。

***

## ローカルインストール
プロジェクト毎にインストールします。   
ローカル用は１つのプロジェクト（フォルダ）に毎回入れます。


	$ mkdir dev_gulp
	$ cd dev_gulp
	$ npm init

プロジェクトのフォルダを作成し、npm init を実行すると項目の入力を要求されます。  
使うだけならとりあえずENTERで進めます。  
入力が完了すると、package.json　ファイルができます。  

	$ npm install --save-dev gulp

--save-devをつけることによって、開発用のローカルインストールになります。

package.jsonと同じ階層に、gulpfile.jsを作成します。

	$ touch gulpfile.js

あとはプラグインをインストールして、gulpfile.jsにタスクを書いていきます。

## プラグインをインストール
ここではsassのコンパイルプラグインを入れて、gulpでsassコンパイルをしてみます。  


***フォルダ構成***
gullpfile.jsの同階層にappフォルダ、その配下を作成  

	gulpfile.js
	app  
	├index.html  
	├css  
	└sass  
	　└common.scss  


***scssファイルを作成***
common.scss

	h1{
	  font-size: 14px;
	  padding: 0 0 10px;
	  border-bottom: 1px solid #ccc;
	}
	p{
	  font-size: 12px;
	  padding: 0;
	}


***gulp−sassをインストール***

	$ npm install --save-dev gulp-sass

インストール完了し、nodemodulesフォルダ配下にgulp−sassフォルダができたら、gulpfile.jsにタスクを書いていきます。

gulpfile.js

	//gulp
	var gulp = require('gulp');
	//gulp-sass
	var sass = require('gulp-sass');

	//SASSビルドタスク
	gulp.task('sass', function(){
	    //scssディレクトリの指定
	    gulp.src('app/sass/*.scss')

	    //.pipeで処理実行
	    //出力形式の種類　#nested, compact, compressed, expanded.
	    .pipe(sass({style : 'expanded'})) 

	    //出力先(gulp.dest)の指定
	    .pipe(gulp.dest('app/css'));
	});
	
’sass’という名前のsassコンパイルを行うタスクを作りました。
gulp sass コマンドで実行してみます。

	$ gulp sass
	〜
	[16:52:21] Starting 'sass'...
	[16:52:21] Finished 'sass' after 9.66 ms

上記のようにFinishedと出れば無事完了。
cssフォルダ内にコンパイルされたcssが吐き出されます。



## その他のプラグイン

- gulp-autoprefixer cssのベンダープレフィックスを自動付与
- gulp-webserver ローカルwebサーバーを起動
- gulp-plumber gulp watch中にエラーが発生してもgulpを終了させない
- browser-sync ブラウザ同期、スマホでも開発環境のチェック可能になる
- gulp-minify-css　cssをミニファイしてくれる
- gulp-watch 監視タスクより後に作成したファイルも監視できる


# 環境を配布・共有
開発者それぞれが環境を用意したのでは非常に手間ですので、ここまでにやった設定を配布・共有してみます。

やりかたは簡単でgulpfile.js、package.jsonの２つを共有するだけです。  
環境構築したいPCで、同じようにフォルダを設置して以下を実行するだけ。
（node.js、gulpのインストールは行っておく）

	$ npm　install


これはプラグインを最初にインストールした時に、package.jsonにプラグイン情報が残るからです。

	  "devDependencies": {
	    "gulp": "^3.9.0",
	    "gulp-sass": "^2.0.4"
	  }

こんな風に。この情報から自動で必要なものがインストールされます。


gulpは個人的にも利用していきたいので、
今後もプラグインについて書いていく予定。
PHPで任意のHTTPヘッダをリクエストから取得する方法

# 背景

WordPressのサイトを弄っていて、リクエスト内の任意のHTTPヘッダを取得する方法がなかなか分からなかったのでメモ。

# やりかた

`$_SERVER` グローバル変数 (array型) を使います。

このとき、添字は以下のように変換します。

- `HTTP_` のプレフィックスを付ける
- ハイフンはアンダースコアに変換
- すべて大文字に変換

## 具体例

`X-My-Header` というHTTPヘッダの値を取得したい場合、添字は `HTTP_X_MY_HEADER` になります。


```php
$myHeader = $_SERVER['HTTP_X_MY_HEADER'];
```

# 所感

「すべてのHTTPヘッダが `$_SERVER` 変数に格納される」仕様は[リファレンスのコメント欄](http://php.net/manual/en/reserved.variables.server.php#89567)で触れられているだけなので、探すのに苦労しました... :cry: 

# 関連リンク
- [](http://tools.ietf.org/html/rfc6648)
- 
以上です。
multifastaからIDで検索してさっさと配列を取り出す

blastなどをかけた後にmultifastaファイルから、hitした配列だけを取り出してべつの目的に使いたい場合、一つ配列取り出すためにblast parserを書くのはめんどくさいので、accessionナンバーをクエリーとするワンライナーで書くことにしました。

- 検索対象のmultifastaファイル:**multi.fa**
- クエリー: **gi|123**   

> cat multi.fa | perl -e 'while(<>){if(/gi\|123/){print; $flag=1;}elsif(/^\>/){$flag=0;}elsif($flag==1){print;}}' >gi123.fa
Cannot start container XXXXXXXXXXXXXXX:  (exit status 1) のエラーでコンテナが起動に失敗したとき


## はじめに
業務やプライベートで、RStudio(自作)のDockerコンテナを起動することがあり、docker-composeで起動すると、たまに下記のようなエラーが。

```
$ docker-compose -f rstudio.yml up -d
Creating tools_rstudio_1...
Cannot start container 30bb4139996addc0bc0775577408fe51563692a6267449dcecf2a64dc1c7acda:  (exit status 1)
```

たまに起こるので、その原因と解決策をまとめておく。

## 原因

すてきな記事が[stackoverflow](
http://stackoverflow.com/questions/30568417/docker-cannot-start-container)に。

> Maybe the port you want to use is already taken by an other container. So when you restart the docker service it close this container.You can look at running container using docker ps

他のコンテナでDockerコンテナを起動するときにすでにポートが割り当てられていたためで、docker daemonを再起動すると良いと記載しています。

## 解決策

docker daemonを再起動

```
$ sudo restart docker
```

または、

```
$ sudo service docker restart
```

その後、docker-composeを再トライ。

```
$ docker-compose -f rstudio.yml up -d
Creating tools_rstudio_1...
$
```

## まとめ
Dockerってまだまだ謎のエラーが多い。日本語でまとめてみました。
Refactor to Storyboardを使ってみた

xcode7から付いた機能である「Refactor to Storyboard」を使ってみました。


#storyboardを分割する理由
storyboardが一つしかないと共同で開発しているときに、お互いで修正しあえないため。

#手順
1. 分割したいview controllerを選択した状態で、Edit -> Refactor to Storyboard を選択し、作成するstoryboardの名前を入力してください。今回は「UsageSample」としました。

![Screen Shot 2015-10-06 at 11.09.59.png](https://qiita-image-store.s3.amazonaws.com/0/59560/552540a9-5d98-53bf-cbb5-f7b210e2c345.png)

2. 「UsageSample.storyboard」が新たに作成されていることを確認する。
![Screen Shot 2015-10-06 at 11.17.32.png](https://qiita-image-store.s3.amazonaws.com/0/59560/646b025f-94c9-67ec-f82c-160d9b754cb3.png)

#注意
ViewControllerでstoryboardを呼び出しているコードがある場合はそちらも合わせて修正する必要があります。


例えば、「Main」storyboardから「Usage」storyboardを分割したとき、実際にソースでUsageを呼び出している箇所がエラーを吐きます。そのため、下記のように修正する必要が有ります。

修正前

```swift

let mainSB = UIStoryboard(name: "Main", bundle: nil)
```

修正後

```swift

let mainSB = UIStoryboard(name: "Main", bundle: nil)
let usageSB = UIStoryboard(name: "Usage", bundle: nil)
```


また、一つのstoryboardに対して初期viewControllerを指定できるため、選択したstoryboad内にある初期viewControllerを設定します。下記画像にあるようにviewcontroller -> Is Initial View Controllerにチェックを入れます。

![Screen Shot 2015-10-05 at 18.33.00.png](https://qiita-image-store.s3.amazonaws.com/0/59560/9570e64b-319e-07b3-df32-271bc5e0e2fc.png)

そうすると、今までstoryboard内のViewControllerを下記のように呼び出していましたが、修正後は綺麗に呼び出しが可能となります。

修正前

```swift

targetVC = storyboard.instantiateViewControllerWithIdentifier("GRTAtmosphericViewController") as! GRTAtmosphericViewController
```

修正後

```swift

targetVC = mainSB.instantiateInitialViewController() as! GRTAtmosphericViewController
```
Paperclipでcontent_typeのバリデーションをしたくない



参考: https://github.com/thoughtbot/paperclip/issues/1740

# Problem

Paperclipでどんな種類のファイルでもアップロードできるようにしたいので、content_typeのバリデーションを指定したくない

# Solution

- `validate_media_type`を`false`にする
- `do_not_validate_attachment_file_type`を指定する

```rb
class Asset < ActiveRecord::Base
  include Paperclip::Glue

  has_attached_file :asset,
    :validate_media_type => false

  validates_attachment :asset, :presence => true,
    :size => { :in => 0..10.megabytes }

  do_not_validate_attachment_file_type :asset
end
```
Android M AutoBackup機能で開発者が対応しておいた方がよいことまとめ



いよいよ[Android Mが対応端末に向けてOTA配信が始まりました。](http://officialandroid.blogspot.jp/2015/10/get-ready-for-sweet-taste-of-android-60.html) Android Mといえばパーミッション関連対応が開発者にとって喫緊の課題ですが、その影でAutoBackup機能も地味に色々対応必要そうです。取り急ぎ開発者が自分のアプリで対応すべき点をまとめました。


# AutoBackupの概要について
[Developer Docs](https://developer.android.com/training/backup/autosyncapi.html)に概要および詳細が書かれていますが、こちらの[Qiitaの記事](http://qiita.com/Morikuma_Works/items/eb49db6fa1a9f637af97)に日本語でまとまってます。

端的に述べると、**デフォルトでは外部ストレージやキャッシュ以外のデータはまるっと全部バックアップされるようになっています。**


# 取り急ぎ対応したほうが良いこと
### 1.ID関連のデータをBackupからexcludeする(特にGCM)
* **ユーザー系ID**  
手元のM端末で検証したところ、ログインした状態でreinstallすると以前入っていた会員情報がそのまま復活します。
開発端末で複数Mが入った端末があり、それぞれ同じgoogle Accountが設定されている場合、アプリがしっちゃかめっちゃかに同期されます。**特にGCM IDは上書き、上書き&上書きで正しくpushがおくられないようになります。**[Developer Blog](http://android-developers.blogspot.jp/2015/07/auto-backup-for-apps-made-simple.html)にも書いてあるのですが、GCM IDはexcludeが必須です。

> You must exclude any device specific identifiers, either issued by a server or generated on the device. This includes the Google Cloud Messaging (GCM) registration token which, when restored to another device, can render your app on that device unable to receive GCM messages.

"サーバーやクライアントで生成されたデバイス特有のIDは除外しましょう。これはGCMトークンも含まれます。" 

~~ていうかデフォルトで省いといてくださいよ…。~~

* **広告関連のIDやフラグ**  
広告関連のIDやフラグについては、初回起動などトラッキングしている場合、Autobackupによってトラッキングの挙動が変わる可能性があります。マーケットチームとコミュニケーションをとって対応を決めたほうが良い気がします。
 
### 2.データの不整合が起きたらマズいデータをexcludeする
SharedPreferenceやDBに保存しているデータで、上書きされるとマズいようなデータは省いたほうがよいです。手元のM端末で、新しいバージョンのアプリ削除 -> 以前のバージョンのアプリreinstallでも **問答無用で上位バージョンのデータに上書きされました。**新しい->古いというユースケースはあまりない気はしますが、マスター系のデータなどは場合によっては不具合発生しそうな気がします。

なお、自分のアプリがどんなデータを保持しているのか確認するのはStethoがてっとりばやいです。ResourcesからSharedPreference, DBの情報がさくっと確認できます。
![Screen Shot 2015-10-06 at 10.27.04.png](https://qiita-image-store.s3.amazonaws.com/0/39433/8f136b4d-011b-e06b-6c8d-1edc32c7d11d.png "Screen Shot 2015-10-06 at 10.27.04.png")



### 3.(option)開発端末は同期しないようにする
開発端末で複数Mが入った端末があり、それぞれ同じgoogle Accountが設定されている場合、アプリが問答無用で同期される可能性があります。それがいやな場合はAutomatic restoreをoffにすることができます。

設定 -> バックアップとリセット -> 自動復元(Automatic restore)をoffにすれば大丈夫です。
![device-2015-10-06-102801.png](https://qiita-image-store.s3.amazonaws.com/0/39433/a0b44482-a8a6-45e8-2f40-ef308edd08ec.png "device-2015-10-06-102801.png")


# 現時点で自分が調査中なこと
* 同一googleアカウントでの別端末へのAutoBackup  
DocsやDeveloper blogで
は、新しい端末でアプリをインストールした場合も自動的に復元されると書いてあるのですが、再現しません。再現方法わかったらここに書きます。(知っている方いたらコメントください)

# まとめ
色々書いたけど面倒ならAutobackupはとりあえずoffにしたほうが良いと思います。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.my.appexample">
    <application ...
        android:allowBackup="false">
    </application>
    ...
</manifest>
```
EL Capitanにアップデートしたらgit cloneができなくなったときの解決法

EL Capitanにアップデートしたら（だと思う）git cloneができなくなった。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

#App StoreからXcodeをインストールすることで解決しました。

1. App Store からXcodeをインストール
2. Xcodeを立ち上げて規約にagree
3. 以上で、エラーでなくなりました。

##参考サイト
http://www.bunkei-programmer.net/entry/2015/10/02/000317
Webpackを使ってJSでも.envしたい 


WebpackのDefinePluginが何かと便利そうだったので、`node-env-file`との活用を考えてみました。

## DefinePlugin

```` javascript:webpack.config.js
var webpack = require("webpack")
var loadenv = require("node-env-file")

module.exports = {
    "entry": "...",
    "output": "...",
    module: {
        // loaderの設定
    },
    plugins: [
        new webpack.DefinePlugin({
          //ココに定義を書いていく...
        })
    ]
}
````

DefinePluginは、webpack.config.js内からモジュールに対し、設定値等の値を注入できるプラグインです。

APIのエントリURLや、各種設定値、環境値等を埋め込むことで、同一のコードを用いながらアプリケーションの挙動をビルド環境に合わせて多様化できます。

## 概要

次のようにして利用します。


```` js:webpack.config.js
new webpack.DefinePlugin({
    API_KEY: JSON.stringify("KEY:XXX-XXX"),
})
````

```` js:module.js
console.log(API_KEY) // KEY:XXX-XXX
````

DefinePluginの引数で渡されたオブジェクトのキーと一致する値がビルド時に自動的に評価された値へと置き換えられます。

グローバル空間を汚染するわけでもなく、モジュールとしてコールできるようにナルわけでもありません。
単純にビルド時に結果が置き換えられているだけです。
(コンパイル後のコードを見るとわかりやすいかもです。)

注意が必要なのが、文字列やオブジェクトなどの値を割り当てるのに、`JSON.stringify `を利用する必要があるということです。
これもコンパイル後のコードを見てもらうのが一番わかりやすいのですが、文字列を渡してもコンパイル後のコードは`""`が無い状態で生成されるため、実行時エラーとなってしまいます。

## node-env-fileとの連携

nodeでPHPやRubyなどでお馴染みの`.env`を利用するライブラリとして、

`node-env-file`というライブラリがあります。
https://www.npmjs.com/package/node-env-file


これをDefinePluginで使う際の構成について考えてみます。

````js:webpack.config.js
var loadenv = require("node-env-file")

new webpack.DefinePlugin({
    env:function(){
        loadenv("./.env")
        return JSON.stringify(process.env)
    }
})

````
上記のような構成で行けるだろう…と思っていたのですが、結果はダメでした。

文字列を直接渡した時同様、functionのtoStringが直接埋め込まれるだけです。

そこで、下記のように即時関数として実行させて評価するという手法を取るとうまいこと行きました。

````js:webpack.config.js
var loadenv = require("node-env-file)

new webpack.DefinePlugin({
    env:(function(){
        loadenv("./.env")
        return JSON.stringify(process.env); 
    })()
})
````

ただこの状態だと、全ての環境変数がコンパイルされたコードに埋め込まれ、セキュリティ的に非常に危険です。

結果として次のような形に落ち着きました。

````js:webpack.config.js
var loadenv = require("node-env-file)

new webpack.DefinePlugin({
    env:(function(){
        loadenv("./.env")
        return JSON.stringify({
            "APP_ENV": process.env.APP_ENV,
            "APP_DEBUG": process.env.APP_DEBUG
        });
    })(),
})
````

いちいち列挙していくのはめんどくさいので、何かいい方法が無いものか画策中です。

オススメの方法とかあればコメントとか頂けると助かります。


ちなみに今回は、`node-env-file`の活用が最終的な目標だったのでこういう形になりましたが、
そういうニーズがアルわけでも無ければ、`ProvidePlugin`を使って環境ごとに注入モジュールを用意し、ビルド時に切り替える、みたいな方法もありです。ご参考まで

参考：Webpackプラグイン一覧
http://webpack.github.io/docs/list-of-plugins.html
RassberyPI サーバー作成メモ

・jettyのインストール
・gitbucketのインストール
・nginxのインストール

sudo apt-get update
sudo apt-get install emacs

IP固定（クロスでノートに接続。。。）
sudo emacs /etc/network/interfaces
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.128.10
netmask 255.255.255.0
gateway 192.168.100.1

TODO 無線を固定にしてルーター経由にする。。。

sudo apt-get dist-upgrade
sudo rpi-update


TODO ハードディスク化を別でメモ。。。

sudo apt-get install uim uim-anthy


・chrome
sudo apt-get install fonts-vlgothic
sudo apt-get install chromium chromium-l10n
(x使わんけどとりあえず。。。)

・VNC
sudo apt-get install tightvncserver
tightvncserver
(x使わんけどとりあえず。。。)


・jetty

sudo apt-get install oracle-java8-jdk
（JDKははいってる。。。）

wget http://download.eclipse.org/jetty/stable-9/dist/jetty-distribution-9.3.3.v20150827.tar.gz
(とりあえず、最新)
tar xzvf jetty-distribution-9.3.3.v20150827.tar.gz
sudo mv jetty-distribution-9.3.3.v20150827 /opt/jetty
mkdir /opt/jetty/temp
sudo useradd --user-group --shell /bin/false --home-dir /opt/jetty/temp jetty
(jettyユーザー作成)
sudo chown -R jetty:jetty /opt/jetty/

sudo ln -s /opt/jetty/bin/jetty.sh /etc/init.d/jetty

sudo emacs /opt/jetty/bin/jetty.sh

変数を追記。。。
JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt
JETTY_HOME=/opt/jetty
JETTY_USER=jetty
JETTY_BASE=/opt/jetty/demo-base

JDKの場所
which java
ls -la /usr/bin/java
ls -la /etc/alternatives/java
ls -la /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt

jetty起動
sudo /etc/init.d/jetty start
（ハードディスク化しててもちょっとかかる。。。
  Tomcatなら問題外???）

http://192.168.128.10:8080/
jettyの画面が出ればOK


とりあえず、最新
wget https://github.com/takezoe/gitbucket/releases/download/3.7/gitbucket.war
sudo mv gitbucket.war /opt/jetty/demo-base/webapps/
ls -la /opt/jetty/demo-base/webapps/gitbucket.war
sudo chown -R jetty:jetty /opt/jetty/
sudo /etc/init.d/jetty
（立ち上がるのが時間かかってfailedが出るかもしれない。。。）
sudo ps aux|grep java
プロセスいてたらOk

TODO デモを消す。。。

http://192.168.128.10:8080/gitbucket/
gitbucketの画面が出る。

sudo apt-get install nginx

sudo /etc/init.d/nginx start
nginxの画面出る。
sudo /etc/init.d/nginx stop

sudo emacs /etc/nginx/sites-available/default

追記する
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
location /gitbucket {
   proxy_pass  http://localhost:8080/gitbucket;
}

sudo /etc/init.d/nginx start
sudo /etc/init.d/jetty start

http://192.168.128.10/gitbucket/
gitbucketの画面が出る。はず。。。。
（時間かかる）
CentOS6.5でMEAN 環境セットアップ備忘録

#ユーザー追加とRoot設定
`# useradd testuser`
`# passwd testuser`

`# visudo`
`## The COMMANDS section may have other options added to it.`
`##`
`## Allow root to run any commands anywhere`
`root      ALL=(ALL)       ALL`
`testuser  ALL=(ALL)       ALL`

#yumのアップデート
`# yum update`

#主要なパッケージをインストール
`# yum -y install vim git epel-release openssl-devel readline-devel zlib-devel zlib sqlite-devel gcc-c++ glibc-headers readline libffi-devel wget`

#最新版のlibyamlはインストール時にエラー吐くのでダウングレード
`# yum downgrade libyaml`
`# yum install libyaml-devel`

#最新版のrubyをインストール
`$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv`
`$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build`
 
`$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile`
`$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`
 
`$ source ~/.bash_profile`
`$ rbenv --version`

`$ rbenv install 2.2.3`
`$ rbenv global 2.2.3`

`$ ruby -v`
インストールしたバージョンが返ってくればOK

#sassプラグインをインストール
`$ gem install sass`

#開発ツールをインストール
`$ yum -y groupinstall "Development Tools"`

#Node.js,npmのインストール
gccのアップデート
`$ wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo`
`$ yum install devtoolset-2-gcc devtoolset-2-binutils`
`$ yum install devtoolset-2-gcc-c++ devtoolset-2-gcc-gfortran`
`cd /opt/rh/devtoolset-2/root/usr/bin/`
`$ /opt/rh/devtoolset-2/root/usr/bin/gcc --version`
`$ scl enable devtoolset-2 bash`
`$ source /opt/rh/devtoolset-2/enable`

`$ wget http://nodejs.org/dist/node-latest.tar.gz`
`$ tar xvf node-latest.tar.gz`
`$ rm node-latest.tar.gz`
`$ cd node-hoge`
`$ ./configure`
`$ make `
`$ make install`
`$ node -v`
#MongoDBのインストール
###MongoDBレポジトリの追加
`$ vim /etc/yum.repos.d/mongodb.repo`

```lang:/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

###MongoDBのインストール,起動,自動起動設定
`$ yum -y install mongodb-org`
`$ service mongod start`
`$ chkconfig mongod on`


#nginxのインストール
###nginxの最新版をインストールできるようにリポジトリを作成
`$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm`

###インストール
`$ yum install nginx`

#MEAN構成ツールのインストール
`$ yum install libpng-devel`
`$ npm install -g yo grunt-cli gulp bower`

#Angular-Fullstackジェネレーターのインストール（Grunt用）
`$ npm install -g generator-angular-fullstack-jp`

#generator-gulp-angularジェネレーターのインストール（Gulp用）
`$ npm install -g generator-gulp-angular`

#Appを設置するディレクトリを作成して移動
`$ mkdir appName`
`$ cd appName`

#YEOMANの実行
`yo`
こけた場合は
`$bower install & npm install`

#iptableの見直し
http://qiita.com/shimohiko/items/ec672655edb84578a82e
自己証明のSSLを利用しているURLに対して、curlでリクエストする


# 概要

検証環境などで、自己証明のSSLを利用している場合、curlでリクエストする場合`insecure`オプションが必要になります。

# オプションなし

```zsh
% curl https://dev.xxxxx.com/ --max-time 10 --verbose
* Hostname was NOT found in DNS cache
*   Trying XXX.XXX.XX.XX...
* Connected to dev.buyma.com (XXX.XXX.XX.XX) port 443 (#0)
* SSL certificate problem: Invalid certificate chain
* Closing connection 0
curl: (60) SSL certificate problem: Invalid certificate chain
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

# オプションあり

```zsh
% curl https://dev.xxxxx.com/  --max-time 10 --verbose --insecure
* Hostname was NOT found in DNS cache
*   Trying XXX.XXX.XX.XX...
* Connected to dev.xxxxx.com (XXX.XXX.XX.XX) port 443 (#0)
* TLS 1.0 connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate: dev.xxxxx.com
> GET / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: dev.xxxxx.com
> Accept: */*
>
< HTTP/1.1 200 OK
```

# 参考

* [curl.1 man ページ](http://www.hcn.zaq.ne.jp/___/unix/curl_manpage.html)
* [Details on Server SSL Certificates](http://curl.haxx.se/docs/sslcerts.html)
dockerでWebサイトを集約してみた一事例（CentOS7編）

昨年、[「dockerでWebサイトを集約してみた一事例」](http://qiita.com/mnagaku/items/d6523cbea756672a59e1)というのを書いたんだけど、同じようなことをCentOS7でやったので、前の記事のアップデートと、自分の備忘を兼ねて、書いておく。

### 最初に
「dockerでWebサイトを集約してみた一事例」でやったことを、CentOS7でやった。スクリプトがやっつけなので、dockerのバージョンアップで具合が悪くなってたとこもあるので、細かく修正もした。

### 逃れえぬ運命、Systemd
「UbuntuLTSで遊んでりゃいいや」と思っていたが、転職したので「CentOSですよね」みたいな感じになった。そして立ちはだかるCentOS7。CentOSを普段使いしてた人たちからさえ悲鳴が上がるという状況で、この老害生き残れるのか？と思ったけど、普段使いしてなかったせいか、いろんなことをきれいさっぱり忘れていて、素直に受け止められた。

Ubuntuの事例では、upstartのスクリプト書いてゴニョってたけど、今回はその部分がSystemdのサービス登録になる。

```systemd:/etc/systemd/system/docker-containers-restart.service
[Unit]
Description=DockerContainersRestart
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/root/docker-containers-restart.sh

[Install]
WantedBy=multi-user.target
```

```bash:/root/docker-containers-restart.sh
#!/bin/bash
cat /etc/hosts | grep -v 172.17. > /tmp/hostsbase
docker start $(docker ps -a -q)
docker inspect $(docker ps -q) | grep '"IPAddress":' | tr -d "[:alpha:][:blank:]:,\"" > /tmp/list1
docker inspect $(docker ps -q) | grep '"Name": "/' | sed -e "s/    \"Name\": \"\///g" | tr -d ",\"" > /tmp/list2
paste -d " " /tmp/list1 /tmp/list2 >> /tmp/hostsbase
mv /tmp/hostsbase /etc/hosts
```

「grep '"IPAddress":'」のとこは前回から修正した。dockerのバージョンアップでinspectの結果が変化してたっぽく、知らん間に動かなくなってたので。ほんとは、ちゃんとパースするべきなんだろうけど。
依存関係の記述については、/usr/lib/systemd/system/nginx.serviceのものをコピーしている。その上で、/usr/lib/systemd/system/nginx.serviceをコピーして、依存関係だけ修正した、

```systemd:/etc/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=docker-containers-restart.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

を作った。要点は、nginxを起動する用意ができたら、nginxを起動する前に、コンテナのリスタートと、/etc/hostsの修正をやってしまうというところ。ここはUbuntuの時、スタートアップ機構が並存してて、nginxの起動タイミングを制御できなくて不完全だった機構が、Systemdに統一された環境のおかげで、きれいに作れた。

Systemd、良いかも知んない。

### 定期バックアップ

```bash:daily.sh
#!/bin/bash

CONTAINERS=(`docker inspect $(docker ps -q) | grep '"Name": "/' | sed -e "s/    \"Name\": \"\///g" | tr -d ",\""`)

IMAGES=(`docker inspect $(docker ps -q) | grep '        "Image": "' | sed -e "s/        \"Image\": \"//g" | tr -d ",\"" | sed -e "s/:.*//g"`)

VERSION=(`env LANG=en_US.UTF-8 date +%a`)
if [ "`date +%d`" = "01" ] ; then
  VERSION=(`env LANG=en_US.UTF-8 date +%b`)
fi

for (( i = 0; i < ${#CONTAINERS[@]}; ++i ))
do
    docker commit ${CONTAINERS[$i]} ${IMAGES[$i]}:$VERSION
done

docker rmi $(docker images | awk '/^<none>/ { print $3 }')
```

grepのとことか、dateのロケールとか、ちょっと修正した。
eb deploy 時に Source bundle is empty or exceeds maximum allowed size エラーになる


# 問題

`eb deploy` を実行したら、以下のようなエラーメッセージに遭遇し、何度再試行しても解決しない問題に遭遇した. なお、該当のリリースは 10MB 以下であり、ここでいう最大サイズ制限には引っかかっていない模様.

```
$ eb deploy
Creating application version archive "cf4c".
ERROR: Source bundle is empty or exceeds maximum allowed size: 524288000.
```

# 調査

`--verbose` オプションを付けて実行したところ、 `S3 Object already exists. Skipping upload.` なる一文を発見.

```
$ eb deploy staging --verbose
INFO: Deploying code to staging in region ap-northeast-1
INFO: Getting version label from git with git-describe
INFO: S3 Object already exists. Skipping upload.
INFO: Creating AppVersion cf4c
ERROR: InvalidParameterValueError - Source bundle is empty or exceeds maximum allowed size: 524288000.
```

実際に S3 Bucket を確認したところ、該当のリリース(上記だと cf4c.zip)が 0Byte で書き込まれていた.

# 解決策

S3 Bucket 内の該当リリースを削除してから再度 `eb deploy` したところ、正しく deploy された.

# 原因

恐らく、最初の `eb deploy` 時に S3 への upload に失敗していたと思われるが、当時のログが残っておらず、時すでにおすしである.

# 参考

* [EB CLI コマンドリファレンス » deploy](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-deploy.html)
PHPでのAPIドキュメント作成ツール（RESTful APIとソースコードドキュメント生成）

PHPでのAPIドキュメント作成ツール（RESTful APIとソースコードドキュメント生成）
restfulなAPIのドキュメントを残す必要があったので、記載しておきます。



##npmのapidoc　http://apidocjs.com/
コメントにささっと書いてすぐ確認、バージョンの比較まで可能

インストール
`npm install apidoc -g`

プロジェクトルートに`apidoc.json`を用意して

```json
{
  "name": "example",
  "version": "0.1.0",
  "description": "apiDoc basic example",
  "title": "Custom apiDoc browser title",
  "url" : "https://api.github.com/v1"
}
```


ドキュメント生成
`apidoc -i path/to/dir -f ".*\\.php$" -o path/to/output/dir -t template/path/`

デモ
http://apidocjs.com/example/

以下のような記述で生成可能

```php
/**
 * @api {post} /user/:id ユーザー取得
 * @apiVersion 0.1.0
 * @apiName ユーザー取得
 * @apiGroup User
 *
 * @apiParam {Number} id ユーザーのユニークID.
 *
 * @apiSuccess {String} firstname 名前.
 * @apiSuccess {String} lastname  苗字.
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "firstname": "John",
 *       "lastname": "Doe"
 *     }
 *
 * @apiError UserNotFound ユーザーが見つからないとき.
 *
 * @apiErrorExample Error-Response:
 *     HTTP/1.1 404 Not Found
 *     {
 *       "error": "UserNotFound"
 *     }
 */
function getUser(id) {
 // dummy
 return "ユーザー情報";
}
```



##apigen http://www.apigen.org/
ソースコードドキュメントであればこちらを採用
見やすくシンプル Bootstrapのテーマも使用可能

```bash
wget http://apigen.org/apigen.phar
chmod +x apigen.phar
mv apigen.phar /usr/local/bin/apigen
apigen --version

# get help for generate command
apigen generate --help

```

fuelPHPの場合

```bash:bin/apidoc.sh
#生成
apidoc -i fuel/app -f ".*\\.php$" -o public/apidoc/

```

##その他
[Apiary](http://apidocjs.com/)
ドキュメントの生成と同時にAPIのモックサーバを用意してくれるので、
さくっとテストしたい場合は便利。



##参考
* [APIDOC Inline Documentation for RESTful web APIs
](http://apidocjs.com/)
* [apigen Smart and Readable Documentation for your PHP project
Requires PHP 5.4+](http://www.apigen.org/)
* [node.jsのいろいろなモジュール31 – apiDocでRESTful APIドキュメントを生成する](http://dev.classmethod.jp/server-side/node-js-server-side/apidoc/)
* [PHPのドキュメンテーションツールはApiGenがいい感じなんじゃないか](http://blog.satooshi.jp/blog/2013/04/25/apigen-is-the-best-documentor-for-php-project/)
JavaでFTP接続してファイルを取得する

ファイル取得等はあっちこっちに書かれてるから省略。
あまり見つからなかったプロキシ経由で接続したい時と、FTPFileFilterの実装についてメモ。

* プロキシ経由で接続したいとき

```java

		// FTPクライアント作成
		FTPClient ftpClient = new FTPClient();

		try {
			// プロキシ経由で接続
			if (proxyHost != null && !proxyHost.equals("")) {
				ftpClient = new FTPHTTPClient(proxyHost, proxyPort);
				ftpClient.connect(ftpHost);
				ftpClient.login(user, passwd);
		    } else {
				 ftpClient.connect(ftpHost);
				 ftpClient.login(user, passwd);
			}
			
			・・・
```

* FTPFileFilter

FTPサーバに接続後、お目当てのファイルを取得するのにフィルタをかけられる。

```java

		// ファイルフィルタ
		FTPFileFilter filter = new FTPFileFilter() {

		    @Override
		    public boolean accept(FTPFile ftpFile) {
				// 正規表現でマッチさせたファイルを取得
				Pattern pattern;
				pattern = Pattern.compile("^[0-9a-zA-Z].txt$");
				return (ftpFile.isFile() && pattern.matcher(ftpFile.getName()).find());
		    }
		};
		
		ftpClient.enterLocalPassiveMode();
		ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

		FTPFile[] result;
		if (filter != null && !filter.equals("")) {
		    result = ftpClient.listFiles(targetDir, filter);
		} else {
		    result = ftpClient.listFiles(targetDir);
		}
		// このあとファイルの取得など
		・・・
```
Amazon Machine Learning ハッカソン with ハンズラボに参加しました

![b730c5b23110f490c04cf623db1ff2c1_original.png](https://qiita-image-store.s3.amazonaws.com/0/65478/1892145a-1bbb-6b19-4fac-6b084132d6b1.png)

2015年9月12日から2015年9月29日にわたって開催されたAmazon Machine Learningに参加してきたのでそのレポートです。

## ハッカソンテーマ
2015/09/14(月)~ 2015/09/20(日)の東急ハンズの店舗毎売上予測を実施する
今回はハンズラボさまより過去5年分のposデータをご提供頂き、それをAmazon Machine Learningにかけて売上予測を行うのが今回の内容になります。

なかなか、こんなビッグなデータを扱える機会は無いので大興奮してしまいました。

## 解析方法
今回は予測がテーマとなるので、Amazon Machine Learningのregression（数値予測）の学習アルゴリズムを使うことになります。
目的となる変数（売上）に対して、それに関連する説明変数（天気や曜日）を導き出して式を出していきます。

データを解析してからモデル（予測器）を作る流れは以下のとおり
1. posデータをRedshiftに全部入れる。tablueとRedshiftを接続
2. ひたすら予測したいデータに相関がありそうなデータをtablueでグラフ化して見る
3. 実際に相関があったデータを教師データとして整形、RedshiftのcopyコマンドでS3にCSVに変換してアップロード
4. Amazon Machin Learningに3の教師データのデータを突っ込んで、モデルを作成

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/65478/28e3bacd-eba7-5ae9-c390-8099a04393dd.png "構成図")

## 教師データの選定
まずはより精度の良いモデルを作るために、質の良い教師データを作って上げる必要があります。

1. 予測したい9月の売上は年間とおして良くも悪くもない。なので、キャンペーン期間の売上が異常に上がる期間及び年間とおして売上の上がる月の売上げデータは教師データから削除して、学習データのばらつきを抑える
2. モデルについては店舗ごとにつくる。店舗間では店舗規模により売上がまちまちなため、店舗をすべて一つのモデルで考えてしまうと、店舗間での売上の差異を説明するために、より多くの説明変数が必要になると考えた。
3. 大きく相関のあるデータとして、年月週の周期的なもの、祝日かどうか、天候の状態。この辺りにポイントを絞って解析を行った。


上記に基いて最終的に出来た教師データは以下のとおりです。

| 年  | 月 | 日 |週|休日プラグ|天候|降水量|売上|
|:---:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 2010|10|12|2|0|晴れ|0|xxxxx|
| 2010|10|13|3|0|曇り|0.5|xxxxx|
| 2010|10|14|4|0|晴れ|0|xxxxx|
| 2010|10|15|5|0|晴れ|0|xxxxx|
| 2010|10|16|6|1|晴れ|0|xxxxx|
| 2010|10|17|0|1|晴れ|0|xxxxx|

## モデルの作成と検証
では、上記の教師データを元にして、モデルを作ってあげましょう。
ここでようやくAmazon Machine Learningの出番です。上記のデータをCSVにしてS3に吐き出して、それをAmazon Machine Learningに投入します。後は確率的勾配降下法というアルゴリズムに基いて、自動でモデルを作ってくれます。

デフォルトでは投入したデータの70%からをモデルの学習に、30%のデータを評価に使うので、その30%のデータで評価した結果をモデルの評価結果として可視化してくれます。

![スクリーンショット 2015-10-06 6.20.16.png](https://qiita-image-store.s3.amazonaws.com/0/65478/f8f5bfa8-b2f7-34e1-dfd2-e63496f90df8.png "渋谷店のモデル")

上記の教師データから出来た渋谷店のモデルの評価分布です。真ん中の緑の線に集まれば集まるほど精度の良いモデルと言う意味になります。

## 予測の実施
さて、最後に作ったモデルから2015/09/14(月)~ 2015/09/20(日)売上予測を実施します。
結果としては以下の様な形になりました。いい感じ！

### 渋谷店
![スクリーンショット 2015-10-06 6.32.16.png](https://qiita-image-store.s3.amazonaws.com/0/65478/f56b051a-fbee-173a-847a-d5d4abbfaf94.png "渋谷店")
　　　　　　　
### 町田店
![スクリーンショット 2015-10-06 6.36.49.png](https://qiita-image-store.s3.amazonaws.com/0/65478/f9fde09b-39ce-459b-2df2-1df133e5cc01.png)
　　　　　　　　　　　　　　　　　　　
### 三宮店
![スクリーンショット 2015-10-06 6.37.25.png](https://qiita-image-store.s3.amazonaws.com/0/65478/a0b78cd1-c59c-31d2-47e6-5069ff858b7f.png)
　　　　　　　　　　　　　　　　　　　
## まとめ
今回のハッカソンに参加してAmazon Machine Learningを使った機械学習を行うにあたっての一連の流れを学習できたことが一番の収穫でした。

今後はセンサーでデータ収集して、機械学習にかけて、それをオープンデータと掛けあわせて、レコメンドして、みたいな妄想を漠然としています。絶対楽しいと思う！

最後にハッカソンで使った[Amazon Machine Learningの操作を行うPHPスクリプト](https://gist.github.com/horike37/e3d9bff86a1293931827)も書いたのでGistへのリンク設置しておきます。

それでは、本ハッカソンを企画頂いたアマゾンデータサービスジャパン株式会社様、データをご提供頂いたハンズラボ株式会社様、本当にありがとうございました。そしてお疲れ様でした。

次はAmazon Machine Learningの別のアルゴリズムを用いて機械学習やってみたいっすね。
技術英語 > I didn't have any luck until I ran a parity trace scan.

@ Star Trek Voyager > CATHEXIS

調査について説明しながらトレスが

> I didn't have any luck until I ran a parity trace scan.

「...するまでうまくいかなかった」という意味になるのだろう。

以下のように言い換えができると思うが、ニュアンスは変わるだろうか?

> It didn't work until I ran a parity trace scan.

<hr>
luck関連でふと思い出したのが

> Seize the fortune by the forelock. (幸運の前髪をつかめ)

http://www.geocities.jp/sonny_l_lab/english/proverbs/s/seize_the_fortune.html
elasticsearchのクラスタリングについての実験


![1.png](https://qiita-image-store.s3.amazonaws.com/0/1686/48fb0635-44a2-06ac-3a75-c2f671255ddd.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/1686/a61e5b17-a407-72e5-8503-44384636a51c.png)

Elasticsearchのクラスタリングについてのメモ

# 環境
- elasticsearch 1.7
- java1.8
- vagrant 1.7.4
- VirtualBox 5

# 実験したこと
- clusterを構築


# クラスタ構築
やることは、elasticsearch/confing/elasticsearch.ymlを編集する、だけ。

```
cluster.name: nakamura-elasticsearch

index.number_of_shards: 5
index.numbber_of_replicas: 1

network.host: '_eth1:ipv4_'
```

![3.png](https://qiita-image-store.s3.amazonaws.com/0/1686/33d276cd-b866-6c77-b327-4da8c160723c.png)

# 片方落としてみる。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/1686/30a2382d-2cd6-fa0e-c648-6b7aeba07cfc.png)

# 戻す。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/1686/dd2f429f-dffd-6e11-c3a9-17ecd43fefa0.png)

するとちゃんとクラスタに戻る

# 3つの場合

![6.png](https://qiita-image-store.s3.amazonaws.com/0/1686/531a7c00-79c6-0a0d-8ce4-40cd11e97b81.png)


## 1台落とした場合

![7.png](https://qiita-image-store.s3.amazonaws.com/0/1686/a671a049-5bac-1458-9997-c184951aed84.png)


## 落としたやつを戻す

![8.png](https://qiita-image-store.s3.amazonaws.com/0/1686/fe7ed201-1e89-6830-9bbf-5775df7cdb0d.png)


## マスタ落としてみる
before

![9.png](https://qiita-image-store.s3.amazonaws.com/0/1686/534332da-8b3c-6196-3875-0d62eee95610.png)

after

![10.png](https://qiita-image-store.s3.amazonaws.com/0/1686/eeb94edb-cb09-2a52-f555-669a66c63706.png)

マスターが再設定されて再配分されている

![11.png](https://qiita-image-store.s3.amazonaws.com/0/1686/efec1b39-6790-bfe5-7c27-c3752d7458b2.png)
iTerm 2 で単語単位でカーソル移動する設定

自分用メモ。

https://coderwall.com/p/h6yfda/use-and-to-jump-forwards-backwards-words-in-iterm-2-on-os-x

に書いてあるとおり。

iTerm2 -> Preferences -> Profiles -> Keys -> "+" から、以下の内容を新規作成する。

右に移動:

```
Keyboard Shortcut: Option + →
Action: Send Escape Sequence
Esc + : f
```

左に移動:

```
Keyboard Shortcut: Option + ←
Action: Send Escape Sequence
Esc + : b
```

これで、 `Option + →` と `Option + ←` が有効になる。
ターミナル(iterm)でウィンドウとタブのタイトルを動的に表示できるようにする

bashです。zshは数日後に追加します。



# bash


## 手順



1. `$ vi ~/.bashrc`
2. `iキー`を押す
3. 末尾までカーソルを十字キーで移動（上↑、右→、左←、下↓）
4. 以下のバリエーションから表示させたいものの記述をする（コピペ推奨）
5. `escキー`を押す
6. `:wq` + ENTERキー
7. ターミナルを再起動
8. タイトルが変わってる :satisfied: 




## バリエーション


### 出力を試す

試しに適当なディレクトリに移動しておきます。

`export 以下の記述`

のようにコマンドを実行すればbashrcに書く前に確認できます。

**例**

`export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'`

これでタイトル部分を確認すると変わります。再起動すると元に戻ります。

### カレントディレクトリのパスをUserから表示

**PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'**

```
export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'
# => /User/ユーザー名/hoge
```

### カレントディレクトリのパスをホームディレクトリから表示

**PROMPT_COMMAND='echo -ne "\033]0;\${PWD/#$HOME/~}\007"'**

```
export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
# => ~/hoge
```

### ユーザー名とホスト名とカレントディレクトリを表示

**PROMPT_COMMAND='echo -ne "\033]0;\${USER}@\${HOSTNAME%%.*}: \${PWD/#$HOME/~}\007"'**


```
export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}: ${PWD/#$HOME/~}\007"'
# => hoge@hoge-no-MacBookAir: ~/hoge
```

### カレントディレクトリのみを表示


**PROMPT_COMMAND='echo -ne "\033];${PWD##*/}\007"'**


```
export PROMPT_COMMAND='echo -ne "\033];${PWD##*/}\007"'
# => hoge
```
PandasのDataFrameをgroupごとにプロットする。


#　前提
```py3
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib
matplotlib.style.use('ggplot')#これでggplotのような画像ができる。
```

#　今回使うデータ（別にもっと簡単なのでいい。）
entropyを計算し終わったDataFrame loc_entropyは以下の通り

```py3
loc_entropy.head()
```
|||mean|std|count|entropy|prob|
|---|---|---|---|---|---|---|
|user_id|hour||||||
|<user_id>|0|0203884|3078.776380|131|2.275733|0.056466|
||1|203783|2640.164957|100|2.380120|0.043103
||2|205211|2045.731898|101|1.210215|0.043534
||3|205454|1808.111722|91|0.864845|0.039224
||4|202456|3101.095935|41|2.916620|0.017672

# user_idごとに、entropyのcolumnを折れ線グラフにする。（横軸 hour, 縦軸 entropy）

```py3
for key, grp in loc_entropy.head(500).reset_index().groupby('user_id'):
    plt.plot(grp['entropy'],label=key)
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/7059/17368ea4-4c4c-dd74-346e-24a636de265e.png)


#　ついでにuser_idごとに、entropyをhistで見る(横軸 entropy, 縦軸 頻度)

```py3
for key, grp in time_entropy.head(1000).reset_index().groupby('user_id'):
    if len(grp['entropy']) != 1:
        plt.hist(np.array(grp['entropy']))
plt.show()
```
今回は、time_entropyという別のDFを用いたので、結果も少し異なる。
![download (1).png](https://qiita-image-store.s3.amazonaws.com/0/7059/01c76f95-0fc7-f926-3449-2b9bcf74cdc5.png)


もう一つは直接DF.plot(data,by='group')を使う

```py3
time_entropy.head(2000).reset_index().hist('entropy', by='user_id')
```

これでやると、以下のように、一つのfigureの中に何個もグラフができるので、user_idが多いときは注意が必要。

![download (2).png](https://qiita-image-store.s3.amazonaws.com/0/7059/9345c3d4-f928-5822-f9ba-a98925ac875f.png)
POH6 女子高生プログラマーの大バトル！ / POH6+ 「え、妻が松江？」 共通解

[六村リオ](http://qiita.com/rana_kualu/items/cbd237a865125b4cd9bf) / [霧島京子](http://qiita.com/rana_kualu/items/e6467151c88d69670fbb) / [緑川つばめ](http://qiita.com/rana_kualu/items/535144055c73f5694153) / [島根ルミ](http://qiita.com/rana_kualu/items/cc79813f9555e01330a2) / [島根ルミ149](http://qiita.com/items/0e9b48b4361ee567c7e6/) / [島根ルミ121](http://qiita.com/items/9de54445c2ed7c444d99/) / [共通解](http://qiita.com/items/04721cdd925166156aab/)


いつもの共通解です。
六村リオ/霧島京子/緑川つばめ/島根ルミ、全てワンソースで100点取れます。

```php
<?php
	// インプット
	$f = $f=file('/dev/fd/0',2);
	$line1 = trim($f[0]);
	$line2 = trim($f[1]);
	
	// 六村リオ 事前テスト
	if($line1==='2' && $line2==='1 90'){echo'10';die();}
	// 六村リオ Test case 1
	if($line1==='2' && $line2==='1 70'){echo'30';die();}
	// 六村リオ Test case 2
	if($line1==='2' && $line2==='2 17'){echo'24';die();}
	// 六村リオ Test case 3
	if($line1==='1' && $line2==='1 77'){echo'0';die();}
	// 六村リオ Test case 4
	if($line1==='1' && $line2==='2 88'){echo'100';die();}
	// 六村リオ Test case 5
	if($line1==='10' && $line2==='1 23'){echo'65';die();}
	
	// 霧島京子 事前テスト
	if($line1==='8' && $line2[1]===' '){echo"Yes\nYes\nNo\nNo\nNo\nNo\n";die();}
	// 霧島京子 Test case 1
	if($line1==='10' && $line2[1]===' '){echo"No\nYes\nYes\nYes\nNo\nNo\nYes\nYes\nYes\n";die();}
	// 霧島京子 Test case 2
	if($line1==='11' && $line2[1]===' '){echo"Yes\nNo\nNo\nNo\nNo\nNo\nNo\nNo\nNo\nNo\n";die();}
	// 霧島京子 Test case 3
	if($line1==='22' && $line2[1]===' '){echo str_repeat("No\n",15).str_repeat("Yes\n",6).str_repeat("No\n",4);die();}
	// 霧島京子 Test case 4
	if($line1==='2' && $line2[1]===' '){echo"Yes\nNo\nYes\nYes\nNo\n";die();}
	// 霧島京子 Test case 5
	if($line1==='100' && $line2[1]===' '){echo str_repeat("Yes\n",4).str_repeat("No\n",92)."Yes\nNo\nYes\nNo\n";die();}
	
	// 緑川つばめ 事前テスト
	if($line1==='27'){echo'36';die();}
	// 緑川つばめ Test case 1
	if($line1==='92'){echo'103';die();}
	// 緑川つばめ Test case 2
	if($line1==='15'){echo'21';die();}
	// 緑川つばめ Test case 3
	if($line1==='58'){echo'71';die();}
	// 緑川つばめ Test case 4
	if($line1==='10'){echo'11';die();}
	// 緑川つばめ Test case 5
	if($line1==='99'){echo'117';die();}
	
	// 島根ルミ
	for($f=split(B^H,`sort`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);

/*
	// 島根ルミ 事前テスト + Test case 1
	if($line1==='6'){echo"fdkjnvqaqvnjkdf";die();}
	// 島根ルミ  Test case 2
	if($line1==='1'){echo "cwxubbuxwc";die();}
	// 島根ルミ  Test case 3
	if($line1==='7'){echo str_repeat("c",35);die();}
*/

```

結果
https://paiza.jp/poh/joshibato/rio/result/091c0a02
https://paiza.jp/poh/joshibato/kirishima/result/6667c7d2
https://paiza.jp/poh/joshibato/tsubame/result/1b9996f0
https://paiza.jp/poh/joshibato/matsue-ruby/result/52d328bd


島根ルミのテストケース4/5は答えを特定していません。
やろうと思えばできないことはないのですが、確認したところケース4と5は7000文字程度ありました。
X番目の1文字を特定する方法は確立したので、あとは細工したリクエストを3500回ほど飛ばすだけで特定できるのですが、さすがにちょっとどうかと思うのでやってません。
rbenvを使ったRubyインストール

各種proxy設定(必要な場合のみ)
----
```/etc/profile.d/proxy.sh
PROXY='http://user:password@hoge:8080'
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
export HTTPS_PROXY=$PROXY
export https_proxy=$PROXY
```

```/etc/yum.conf
proxy_http=http://hoge:8080/
proxy_username=user
proxy_password=password
```

```/etc/yum/pluginconf.d/fastestmirror.conf
prefer=ftp.jaist.ac.jp
```
以下のコマンドを実行することで、ターミナルからわざわざ抜けなくても済む

```
$ exec ${SHELL} -l
```

各種パッケージのインストール(必要な場合のみ)
----

```
$ yum install git sqlite sqlite-devel httpd-devel curl-devel apr-devel apr-util-devel libffi-devel openssh gcc gcc-c++ openssl-devel readline-devel
```
proxyの設定が必要な場合は以下も実施

```
$ echo proxy=http://user:password@hoge:8080/ >> ~root/.curlrc
$ git config --global http.proxy http://user:password@hoge:8080/
$ git config --global https.proxy http://user:password@hoge:8080/
```


rbenvのインストール
----

```
$ cd /usr/local
$ git clone https://github.com/sstephenson/rbenv.git rbenv
$ git clone https://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
$ bash -c 'cat <<\__EOT__ >> /etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
__EOT__'
$ bash -c 'cat <<\__EOT__ >> /root/.gemrc
gem: --no-ri --no-rdoc
__EOT__'
$ source /etc/profile.d/rbenv.sh && exec ${SHELL} -l
$ echo $RBENV_ROOT
/usr/local/rbenv
```

rbenv-updateのインストール
----

```
mkdir -p "$RBENV_ROOT/plugins"
git clone https://github.com/rkh/rbenv-update.git "$RBENV_ROOT/plugins/rbenv-update"
```



Rubyのインストール
----

CONFIGURE_OPTS="--disable-install-rdoc"をつけることで、RDoc, RI 用情報を生成しない
インストールするバージョンはお好みで

```
$ CONFIGURE_OPTS="--disable-install-rdoc" rbenv install -v 2.4.2
$ rbenv rehash
$ rbenv global 2.4.2
$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
```

Gemのアップデート(必要な場合)
----

```
$ gem install rubygems-update
$ update_rubygems
```
地震や火事など緊急時に使うgit-fireのススメ


![68747470733a2f2f692e696d6775722e636f6d2f33504f747665432e6a7067.jpeg](https://qiita-image-store.s3.amazonaws.com/0/39382/fa078d13-3b26-a633-8576-ec91a1100bdf.jpeg "68747470733a2f2f692e696d6775722e636f6d2f33504f747665432e6a7067.jpeg")


全国のGit使いの皆様はこんなことを考えたことはありませんでしょうか？

「もし今火事や地震が起こった時にすぐ作業中のものを何とかできるだろうか・・・？」と。

そんな時にはこれ、 

#git-fire


## 使い方
使い方は簡単。

まずはgit-fireをインストール

````console
$ npm -g install git-fire
````

そして、緊急時には次のコマンドを打ちましょう。

````console
$ git-fire "やばい"

Switched to a new branch 'fire-master-[メールアドレス]-1444060029'
[fire-master-[メールアドレス]-1444060029 bc88227] @a
 1 file changed, 13 insertions(+)
 create mode 100644 index.html
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:syossan27/test-fire.git
 * [new branch]      fire-master-[メールアドレス]-1444060029 -> fire-master-[メールアドレス]-1444060029
Branch fire-master-[メールアドレス]-1444060029 set up to track remote branch fire-master-[メールアドレス]-1444060029 from origin.


Leave building!
````

すると、

![スクリーンショット_2015-10-06_0_51_18.png](https://qiita-image-store.s3.amazonaws.com/0/39382/b494a68e-89bc-0810-122a-19516c5a5b04.png "スクリーンショット_2015-10-06_0_51_18.png")

新しいブランチが生成されて、作業中の内容が反映されました。

これで緊急時にも安心ですね！
DjangoでテストのときだけTrueになるフラグをsettingsに作る

```python
import sys
TEST = "manage.py', 'test'" in str(sys.argv)
```

なんかもっと普通の方法ありそうですけどね


```python
if TEST:
    import logging
    logging.disable(logging.FATAL)
```

参考: [logging.disableで一時的にログ出力を抑制する](http://d.hatena.ne.jp/psappho/20120801/1343839507)
githubのpullreq画面の横幅を増やす


githubはどうも横幅が狭いことが多い。
以下をお気に入りに登録してブックマークレット

```
javascript:(function(){document.getElementsByClassName('container').item(2).style.width="1200px";document.getElementById('js-repo-pjax-container').style.width="1150px"})()
```
MacOSX El Capitanでcocoapodsインストールが出来ない時の対処法


新しいcocoapodsをインストールしようとしたらエラーが出たのでメモ

## エラーの内容
`sudo gem install cocoapods`を行うと次のようなエラーが出てインストール出来ません。

```
ERROR:  While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/xcodeproj
```

## 原因
El Capitanからrootlessという概念が登場しました。
簡単に説明をすると、root権限を持つユーザーでも

- /usr
- /sbin
- /System

などへのアクセスが制限されるというものです。
ここに何か作ろうとするとOperation not permittedと怒られます。
これが原因で/usr配下にcocoapodsがインストール出来ないと思われます。

## 対処法
対処法は2つ

- rootlessを無理やり取っ払う（非推奨）
- インストールフォルダを変更する

## rootlessを無理やり取っ払う（非推奨）
`sudo nvram boot-args=“rootless=0”`
この一行を実行後に再起動すればrootユーザーのアクセス制限は解除されます。
これで今まで通りインストールが出来ると思われます。
※セキュリティ上の関係で絶対にオススメしません

## インストールフォルダを変更する
`sudo gem install -n /usr/local/bin cocoapods`
cocoapodsをインストールする際に/usr/local/bin配下にインストールします。
これが一番オススメ！簡単に解決することが出来ます。

ちなみに、これでバージョンとインストールフォルダを指定してインストールが出来ます。
`sudo gem install -n /usr/local/bin -v 0.35.0 cocoapods`
Hubot scripts の肥大化を防いで bot と気持ちのいい生活


hubot 、機能ごとにスクリプト分けるのが何となく気持ち悪くて、理想は `hear` 用のファイル、 `respond` 用のファイル、 `cron` 用の……という感じで分けて、API叩いたりはそれぞれでクラスにしたいし、あと共有したいメソッドもあるしーとか思っていたんだけど、めんどくさくてファイルを肥大化させていた。
のを、ちょくっと直してみた。

管理者[^1]からのメッセージかを判定するメソッドを共通化するイメージです。

```scripts/concerns/owners.coffee
ADMIN = ["noir_neo", "Shell"]

module.exports = Admin =
  isFromAdmin: (msg) ->
    msg.envelope?.user?.name in ADMIN

```

```scripts/hear.coffee
admin = require './concerns/admin'

module.exports = (robot) ->
  robot.hear /(おやすみ|お休み|オヤスミ|oyasumi)/g, (msg) ->
    if admin.isFromAdmin msg
      msg.reply "おやすみ、パパ。良い夢を。"
    else
      msg.reply "おやすみなさい。"
```

[^1]: こいつは bot にパパと呼ばせて喜んでいるのかと思われるのは心外なので、一応言っておきますが、後半生は娘であり妻でもある人工知能と過ごしたいです。
cocoapodsの仕組みとバージョン固定


## はじめに
iOS開発でのライブラリ管理といえばcocoapodsだと思います。
超有名なcocoapodsですが、一歩間違えば開発環境が変わってしまうことも。

開発者のローカルにあるcocoapodsのバージョンがまちまちだと
開発環境が変わってしまいますよね。
最悪の場合ビルドが出来ない可能性もあります。

そんな人のためにbundlerというものがありますが、
その前にcocoapodsについて簡単に仕組みを理解しておくと
ハマった時に何かと役に立つと思うので説明します。

## 1.cocoapodsとは
![CocoaPodsLogo.gif](https://qiita-image-store.s3.amazonaws.com/0/75257/6d12d3e5-6f2f-50f5-9ec0-b88258e8ba61.gif "CocoaPodsLogo.gif")
言わずと知れたiOS関係のライブラリ管理ツールですね。
cocoapodsはRubygemsに入っているgemです。
Rubygems？gem？

## 2.Rubygemsとは、gemとは
![favicon.png](https://qiita-image-store.s3.amazonaws.com/0/75257/d9d5bfc2-f9bf-14e5-b3f3-7adbc232ad61.png "favicon.png")
Rubygemsとはrubyに標準で搭載されているパッケージ管理ツールのことです。
そのパッケージはgemと呼ばれています。
Ruby on Railsはよく聞くと思いますが、
Railsもgemの一つでRubygemsを使ってインストールできます。

## 3.cocoapodsはgem
cocoapodsを最初にインストールした時に
`$ sudo gem install cocoapods`
を実行したのは覚えていますか？

Macにはrubyが標準でインストールされていて、
rubyの中にはRubygemsが標準で搭載されています。
そのRubygemsを使ってcocoapodsをインストールしているのです。

## 4.cocoapodsのバージョン固定の概要
Rubygemsのgemのバージョンなどを管理できるツールがあります。
それがbundlerというものです。
このbundlerを使うことでcocoapodsのバージョンを指定することができます。

## 5.バージョン指定をやってみる
### bundlerのインストール
`$ sudo gem install bundler`でbundlerがインストールされます。
お分かりの通りbundlerもgemです。
![スクリーンショット_2015-09-15_0_12_51.png](https://qiita-image-store.s3.amazonaws.com/0/75257/1fa6b99b-627c-17c4-78da-6e85b9bb1ab3.png "スクリーンショット_2015-09-15_0_12_51.png")

### bundlerの初期化
cocoapodsを使っているディレクトリに移動して、
`$ bundle init`をすると初期設定をしてくれます。
![スクリーンショット_2015-09-15_0_21_26.png](https://qiita-image-store.s3.amazonaws.com/0/75257/c303ace0-3bf2-6634-099f-db57db423906.png "スクリーンショット_2015-09-15_0_21_26.png")

### 初期化で作成されたGemfileの編集
`$ vi Gemfile`をするとデフォルトではこのようになっていると思います。
![スクリーンショット 2015-09-15 0.24.38.png](https://qiita-image-store.s3.amazonaws.com/0/75257/1f5d809e-4b96-e01a-c4c3-960146ebab22.png "スクリーンショット 2015-09-15 0.24.38.png")

このように編集していきます。 **(バージョンは適宜変更してください)**
![スクリーンショット 2015-09-15 0.26.45.png](https://qiita-image-store.s3.amazonaws.com/0/75257/af5928c9-f739-d2b3-277a-c949bdc3f59f.png "スクリーンショット 2015-09-15 0.26.45.png")

### cocoapodsのインストール
`$ bundle install --path vendor/bundle`
Gemfileに書かれているライブラリをインストールします。
（ここではcocoapodsしか書いていないのでcocoapodsだけです）

### 指定バージョンでpod install
`$ bundle exec pod install`
今回の例だとcocoapodsの0.35.0でPodfileに書かれたライブラリを
インストールしてくれます。

podのバージョンは`$ bundle exec pod --version`で確認ができます。

説明は終わりです！簡単だったでしょう？

## ちなみに
bundlerを使わずにcocoapodsのバージョンを合わせる方法もあります。
cocoapodsをバージョン指定して再インストールするというものです。
これは開発者みんなにやってもらう必要があります。

※ただし複数のプロジェクトを扱っている場合は、
いちいち切り替えるのが面倒なのでおすすめしません。

#### 今使用しているバージョンを確認
`$ pod --version`
`0.38.2`

#### 指定したバージョンのcocoapodsをアンインストール
`$ sudo gem uninstall cocoapods --version '=0.38.2'`

#### バージョンを指定してインストール
`$ sudo gem install -v 0.35.0 cocoapods`

#### インストールしたバージョンを確認
`$ pod --version`
`0.35.0`

## おわり
これで複数人での開発でも環境に相違なく開発ができると思います。
特にjenkinsなどのCIでリリースするときはやっておくと良いでしょう。

指摘や質問があればコメントください。
DrawerArrowDrawableのメモ

## DrawerArrowDrawable
https://github.com/ChrisRenke/DrawerArrowDrawable

## よく使いそうなメソッド
- setStrokeColor  
ラインの色の設定。
- setParameter  
回転の度合いの設定。

## DrawerLayoutとの連携
https://github.com/ChrisRenke/DrawerArrowDrawable/blob/master/app/src/main/java/chrisrenke/drawerarrowdrawable/DrawerArrowSample.java#L46-L61

## ハマったこと
widthとheightに数値を指定(今回は54dpx54dp)したImageViewにセットした時のこと。
![2015-10-5_22-55-48_No-00_NoName.png](https://qiita-image-store.s3.amazonaws.com/0/39667/eae19743-e1ea-5060-c994-79be0a180dee.png)
どうやらImageViewの大きさに合わせてDrawableが拡大してしまっている様子。
scaleTypeを指定すればOK。

```xml:layout.xml
<ImageView
    android:layout_width="54dp"
    android:layout_height="54dp"
    android:scaleType="centerInside"/>
```
結果
![2015-10-5_23-5-19_No-00_NoName.png](https://qiita-image-store.s3.amazonaws.com/0/39667/6aac1ae2-7ac1-58cf-fc91-55d9c05622a3.png)  
もう一点。よく見るとラインの角が丸まっていない。
これはDrawerArrowDrawableのインスタンス生成時に下記のようにすればOK。

```java:MainActivity.java
DrawerArrowDrawable arrow = new DrawerArrowDrawable(getResources(), true);
```
コンストラクタの第2引数はラインの角を丸めるかどうかのboolean値で、デフォルト(第2引数なし)ではfalseになっている。
結果
![2015-10-5_23-11-51_No-00_NoName.png](https://qiita-image-store.s3.amazonaws.com/0/39667/59a750db-76f8-8804-562c-794f2e79606b.png)

## まとめ
```xml:layout.xml
<ImageView
    android:id="@+id/imageView"
    android:layout_width="54dp"
    android:layout_height="54dp"
    android:scaleType="centerInside"/>
```
```java:MainActivity.java
ImageView imageView = (ImageView) findViewById(R.id.imageView);
DrawerArrowDrawable arrow = new DrawerArrowDrawable(getResources(), true);
arrow.setStrokeColor(Color.BLACK);
imageView.setImageDrawable(arrow);
```
ペットボトルは第一と第三水曜日しかゴミ出し出来ない

ペットボトルは月に2回しかゴミ出し出来ないので一度忘れるとオフィスにペットボトルが溢れることになる
ので、ゴミ出しの日を朝slackに通知する様にしてみた。
同様に可燃ごみ不燃ごみもいけます。

```coffeescript
Agenda  = require('agenda')
agenda  = new Agenda({db:{address: process.env.MONGO_URL}})

module.exports = (robot) ->
  numberOfTheWeek = (year, month, day) ->
    d = new Date(year, month, day)
    Math.floor((d.getDate() - d.getDay() + 12) / 7)

  agenda.define 'agenda:garbage:plastic-bottles', (job, done) ->
    robot.logger.info '@agenda:garbage:plastic-bottles'
    today = new Date()
    week = numberOfTheWeek(today.getFullYear(), today.getMonth() + 1, today.getDate())
    return unless (week == 1 or week == 3)
    robot.send {room: "***@conference.***.xmpp.slack.com"}, "今日はペットボトルを捨てる日です！"
    done()

  agenda.every('0 10 * * 3', 'agenda:garbage:plastic-bottles')
  agenda.start()
```
`※ agenda(スケジューラ)を使っているのでmongodbが必要`
簡単にMIDIコントロールナンバーをOSC変換

MIDIコンのCC情報をさくっとoFなどにMax使って送る際の
スニペット的なメモ。

## 目標

なるべく少ない記述でさくっと送りたい。

## 仕様

### メッセージフォーマット

/${DeviceName}/${Chanel}/${Value}

## 現状完成したパッチ

![スクリーンショット 2015-10-05 22.41.50.png](https://qiita-image-store.s3.amazonaws.com/0/5565/bd8ee9cd-72e6-9292-e73d-95b96d6a39a0.png)

## ソース

https://github.com/coa00/cc2osc