OmniAICreator/Qiita-1.07M huggingface dataset:
入社一年目の新人とVaultを学ぶ。チュートリアル編①

#Vault 0.2 とは
Vault 0.2は、2015/07/14にリリースされたばかりの
非常に新しい機密情報管理ツールです。

どんなツールなのか、何ができるのか
実際に手を動かしながら学んでいこうと思います。

#チュートリアル

さっそくチュートリアルをやってみました。

まずは下記のリンクからチュートリアルを開けるようです。
[Vault Interactive Tutorial](https://vaultproject.io/#/demo/0)

##Step 0: Welcome page
>Welcome to the Vault Interactive Tutorial!
Use the command "next" to move forward.
This will work throughout the tutorial, along with "previous" to go back a step.

なるほど。

`next` で次の画面にいけて、
`previous`　で前の画面に戻れるってことか。

`next` と入れて`Enter`。

※＄サインからわかると思うんですが、Shellっ
ぽいものなので↑でコマンド履歴が使えます。
##Step 1: Overview

このチュートリアルでは以下の4つのことが学べるらしい。
1. Vaultの初期化と公開方法。
2. リクエストを 
3. 機密情報の読みこみ、書き込み
4. Vaultの閉じ方。

`next` `Enter`。

##Step 2: Initialize your Vault

まず初めに、Vaultインスタンスを初期化する必要があるようだ。
今回は、Vaultを開くキーの数を１つとする。
コマンドは以下の通り：
```vault init -key-shares=1 -key-threshold=1```

>Key 1: *********************************
Initial Root Token: *******-***-***-****-********

おそらく　
~~Key 1がVaultのアクセスキーで、~~　ちょっと意味が違う。Step 3に詳細があります。
Initial Root Token が管理者トークンなのかな？
##Step 3: Unsealing your Vault

以下が、意訳です。（google translate の方が精度高いかもしれない。）
>Vaultサーバーは非公開状態ではじまって、
どこの物理ストレージにどうやって保存されるかまで設定されている。
しかし、どうやってそれを解読するかは知らない。

>Vaultはデータを暗号キーで暗号化する。
このキーは、保存されないマスターキーというもので暗号化されている。
通常マスターキーの解読には、破片のしきい値を利用するが、
今回のケースでは、1つの破片でこのマスターキーを解読することとする。

Vaultを公開設定にするコマンド:
```vault unseal <key1>```　※ <> は不要です。

>Sealed: false

公開されたようです。

##Step 4: Authorize your requests

以下意訳。

>Vaultの操作をする前に、接続クライアントはかならず認証されている必要があります。
認証のプロセスは、個人や、マシーンが自分で言ってる通りの人/ものであるかを確認し、
それらに対してIDを割り当てることです。

>今回は、単純化のために、Step 2 で生成された Root Token を使うことにします。

クライアントトークンで認証するコマンド:
```vault auth <root token>```

root token のところにはさきほどの
Initial Root Token：ってのをいれれば良さそう。
これを実行すると、
>Successfully authenticated! The policies that are associated
with this token are listed below:

>root

このトークンにひもづいているポリシーの一覧： root
どうやらこのトークンは**root**権限を持っているらしい。

すこし長くなったので、続きは[チュートリアル編②](http://qiita.com/hikachan/items/a64219834bcf400faeae)で！
語呂で覚えるbashのショートカット


bashのコマンドがいつまでたっても覚えれないので、語呂合わせで覚えることにしました。

|操作|説明|語呂あわせ|
|---|---|---|
|Ctrl + a|文頭に移動する|**atama**（頭に移動）|
|Ctrl + e|文末に移動する|**end**|
|Ctrl + k|カーソルから文末まで削除する|**kokokara**（ここから削除）|
|Ctrl + u|カーソルから文頭まで削除する|**ue**（上削除）|
|Ctrl + w|次のスペースまで削除する|**word**（ワード削除）|
|Ctrl + y|前回削除したテキストをペーストする|**yank**|
|Ctrl + _|操作を１つ戻す|**underbar**（undo...undo...underbar）|
|Ctrl + r|コマンド履歴をインクリメンタルサーチする|**recall**|
|検索中に<br>Ctrl + s|検索結果から最近に進む|**saikin**（最近の）|
|検索中に<br>Ctrl + r|検索結果から過去に遡る|**recall**|
|Cmd + k|ターミナルのバッファを消す|**kakusu**（隠す）|

けっこう無理矢理ですが、まあ自分用ということで。。。
react.jsでシンプルにMediaQueryを実現

# react.jsのrenderをMediaQueryの条件で変えていく方法

## 概要

下記のライブラリをいれると簡単に実現できます。シンプル設計で素晴らしいです。

自分で書くとイベントをうけてレンダリングしたりしないといけないのでけっこう面倒です。

https://github.com/wearefractal/react-responsive

## 使い方

browserifyなどでrequireするだけです。

例えばMediaQueryという変数に展開すると
そちらがカスタムタグのような使い方ができます。
あとはqueryの中に条件を書いて囲むだけです。

```js
var MediaQuery = require('react-responsive');
var React = require('react');

var Td = React.createClass({
    render: function(){
        if (this.props.src)
        {
            return (
                <td key={this.props.key}>
                    <MediaQuery query='(max-width: 768px)'><span className="headName">{this.props.headName} </span> <Anchor key={this.props.value} text={this.props.value} src={this.props.src} /></MediaQuery>
                    <MediaQuery query='(min-width: 768px)'><Anchor key={this.props.value} text={this.props.value} src={this.props.src} /></MediaQuery>
                </td>
            )
        }else{
            return (
                <td key={this.props.key}>
                    <MediaQuery query='(max-width: 768px)'> <span className="headName">{this.props.headName}</span> {this.props.value} </MediaQuery>
                    <MediaQuery query='(min-width: 768px)'> {this.props.value} </MediaQuery>
                </td>
            )
        }
    }
});
```

## 仕組み

すごくシンプルです。条件に合致しない場合はnoscriptで囲われて非表示になります。

```
<noscript data-reactid=""></noscript>
```

## 注意点

css3のMediaQueryでの条件分けとReact.jsのMediaQueryを同時に使うと
エラーになる場合があります。

同じ要素に対して条件分けをいれる場合はうまく使い分けたほうがいいですかね。
Subversionのコミット通知をbashとcurlを使ってSlackのチャンネルに流す


# 概要
Subversionのコミット通知をSlackに長そうとしたけど、bashと最小限のコマンドだけで実現したかったので、Subversionのhooks用シェルを作ってみたときの覚え書きです。
本来なら[Hubot](https://hubot.github.com/)を使って連携をするのが今風だと思うのですが、node.js環境を勝手に構築出来ない状況だったので、node.js環境を構築することに問題がなければ[Hubot](https://hubot.github.com/)を利用すべきだと思います。


## Slackの準備
### 1.「Configure Integrations」を選択する
![ConfigureIntegrations.png](https://qiita-image-store.s3.amazonaws.com/0/27097/ba57ff80-a88a-8864-4ba0-3041e96ecc26.png "ConfigureIntegrations.png")
<br>
### 2.「Incoming WebHooks」を選ぶ
![IncomingWebHooks.png](https://qiita-image-store.s3.amazonaws.com/0/27097/26dfd775-35a0-7f7d-3c66-420960cc8d6b.png "IncomingWebHooks.png")
<br>

### 3. 通知をするためのチャンネルを選択し、「Add Incoming WebHooks Integration」を押す（今回は#svn-test)
![PostChannel.png](https://qiita-image-store.s3.amazonaws.com/0/27097/37038752-eb84-c400-936f-e48f46374249.png "PostChannel.png")
<br>

### 4. WebHookURLが発行される
![WebhookUrl.png](https://qiita-image-store.s3.amazonaws.com/0/27097/f339fbf4-1259-fe41-1e60-404c9b1a3e0c.png "WebhookUrl.png")



## Subversionの準備

### 1. post-commitの配置
リポジトリに「hooks」ディレクトリがあるので、そこにpost-commitを配置します。（実行権限を付けるのを忘れずに）
「Slack Setting」と「SVN Setting」の設定を環境に合わせて下さい。

```bash:post-commit
#!/bin/sh

export LANG=ja_JP.UTF-8

REPOS="$1"
REV="$2"
TXN_NAME="$3"

# ------------------------------
# Slack Setting
# ------------------------------
# 通知するSlackのチェンネルを書く（プライベートグループの時は「#」は不要)
channel="#svn-test"
# 通知するときのユーザ名
username="svn"
# 通知するユーザのアイコン
iconemoji=":shell:"
# WebHookURL（環境に合わせて下さい。）
webhookUrl="https://hooks.slack.com/services/XXXXXXXXX"

# ------------------------------
# SVN Setting
# ------------------------------
# Subversionのリポジトリのベースディレクトリ（環境に合わせて下さい。例：/home/svn/repos）
baseRepository="/home/svn/repos"
# Subversionのリポジトリ名（環境に合わせて下さい。例：svn-test）
repositoryName="svn-test"
# Subversionのリポジトリ
repository=$baseRepository/$repositoryName
# コミットしたAuthorを取得
author=$(/usr/bin/svnlook author -r $REV $repository)
# コミットメッセージを取得
commit_msg=$(/usr/bin/svnlook log -r $REV $repository | tr '\n' '\\' | sed 's/\\/\\n/g')
# コミットサマリーを取得
commit_summary=$(/usr/bin/svnlook changed -r $REV $repository | tr '\n' '\\' | sed 's/\\/\\n/g')
# コミット通知するときのヘッダ
header="New commit:"
# コミット通知するときにボディ（commit_summaryとか不要だったら省く)
value="Revision:$REV\n$commit_msg\n$commit_summary"

# Slackに通知
/usr/bin/curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"text\": \"${header}\", \"attachments\": [{ \"fallback\": \"${header}\", \"color\": \"good\", \"fields\": [{\"title\": \"${author}\", \"value\":\"${value}\"  }]  }], \"icon_emoji\": \"${iconemoji}\"}" ${webhookUrl}
```

これで、コミットするとSlackにSVNコミット通知が流れてくるようになると思います。
Test from Kazumasa Tomita

**Am** trying `the test` for being familiar with this web *service*.

[My past blog](http://tomitazuu.com/archives/67)
![alt](http://tomitazuu.com/wp-content/uploads/medium_5234031659.jpg)

There are 3 important points for **Onisoku PDCA**.

* Speed
* Deep
* Commitment
Building Apps with Over 65K Methods

AndroidStudioでアプリを開発している際に、メソッド数が65000を超えてしまった場合の対策例


#####まず、ビルド実行時に下記のエラーのいずれかまたは複数がでたとき可能性がある
```
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
 
Error:Execution failed for task ':your appname:dexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
 
 
Error:Execution failed for task ':your appneme:dexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java'' finished with non-zero exit value 3
```

#####私が行った対策を下記に記す
AndroidManifest.xml に以下を追加

```
<application
android:name="android.support.multidex.MultiDexApplication"
```

build.gradleを変更

```
（省略）
dependencies {
  …
        compile 'com.android.support:multidex:1.0.0' 　//これを追加
  …
}
 
 
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
 
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 16
        versionCode 1
        versionName "1.0"
        multiDexEnabled = true
    }
 
    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }
    ...
}
 
（省略）
```
#####まとめ
Multidexを設定することで今回は対策できたが、バージョンなど制約があるので、
ProGuardを使って、解決するほうが良いみたいである。


参考：
Building Apps with Over 65K Methods
>http://developer.android.com/tools/building/multidex.html
Git コマンド簡単リファレンス

# 初期設定する
`$ git config --global user.name "<your name>"`
`$ git config --global user.email "<your email>"`
`$ git config --global color.ui true # カラー出力する`
`$ git config -l # 設定値を表示する`

# 初期化する
`$ git init # リポジトリを作る`

# ログを見る
`$ git log --oneline # ログの一列表示`
`$ git log -p # 変更内容を見る`
`$ git log --stat # ファイルごとの変更箇所を見る`

# 現在の状況を把握する
`$ git status # 現在の状況を把握する`
`$ git checkout -- <file> # 変更を取り消す`

# 差分を確認する
`$ git diff # ステージング前の差分を確認する`
`$ git diff --cached # ステージング後の差分を確認する`

# ステージングする
`$ git add . # 現在のディレクトリ配下のファイルをすべてステージングする`
`$ git rm / git mv # ステージングしたファイルを削除／移動する`

# コミットする
`$ git commit -m "comment" # 1行程度のコメント付きでコミットする`
`$ git commit -am "comment" # ステージングして、コミットする`
`$ git commit --amend # 直前のコミットを修正する`

# 過去のコミットした状態に戻る
`$ git reset --hard HEAD # 直前のコミットに戻す`
`$ git reset --hard <commit id> # 任意のコミットに戻す。<id>は'git log'で確認する`

# ブランチを作る
`$ git branch # ブランチの状態を見る`
`$ git branch <branch name> # ブランチを作る`
`$ git checkout <branch name> # ブランチを移動する`
`$ git checkout -b <branch name> # ブランチを作って移動する`
`$ git branch master # masterブランチに戻る`
`$ git merge <branch name> # masterブランチにマージする`
`$ git branch -d <branch name> # ブランチを削除する`

# リモートリポジトリを使う
`$ git remote add origin <repos location> # リモートリポジトリを登録する`
`$ git config -l # リポジトリの一覧を表示する`
`$ git remote rm origin # リポジトリの登録を削除する`


# リポジトリの内容を共有する
`$ git clone <repos location> <dir name> # 指定したディレクトリに複製する`
`$ git push origin master # リモートリポジトリにプッシュする`
`$ git pull origin master # リモートリポジトリからプルする`

# タグをつける
`$ git tag <tag name> # 直前のコミットにタグをつける`
`$ git tag # タグを一覧で表示する`
`$ git tag <tag name> <commit id> # 任意のコミットにタグをつける`
`$ git tag -d <tag name> # タグを削除する`

# エイリアスをつける
`$ git config --global alias.co checkout`
`$ git config --global alias.st status`
`$ git config --global alias.br branch`
`$ git config --global alias.ci commit`

# コメントを英語で書く
- 現在形で書く
- 主語は不要
- ネタ帳
 - Fix foobar（～を修正した場合）
 - Modify foobar（～を変更した場合）
 - Improve foobar（～を改良した場合）
 - Revert foobar（～の変更を取り消した場合）
 - Add foobar（～を追加した場合）
 - Change A to B（AからBに変更した場合）
 - Finish foobar（～の開発を終了した場合）
MongoDBでlogrotate

## rpm(mongo-10gen)でインストールしたらログローテート入ってなかった
あっ・・・

```bash
$ ll -h /var/log/mongo/
合計 651M
-rw-r----- 1 mongod mongod 651M  7月 27 16:02 2015 mongod.log
```

## logrotateでやってみる

適当にやってみる

```bash
$ cat /etc/logrotate.d/mongo
/var/log/mongo/mongod.log
{
        rotate 4
        daily
        missingok
        create 0644 mongod mongod
}
$ logrotate -f /etc/logrotate.conf
```

ローテート後の 1196765 の inode 見ちゃってる

```bash
$ lsof | grep mongod.log
mongod    28392    mongod    1w      REG                8,3        71    1196765 /var/log/mongo/mongod.log-20150727
$ ls -li /var/log/mongo/
合計 8
1196912 -rw-r--r-- 1 mongod mongod   0  7月 27 15:11 2015 mongod.log
1196765 -rw-r--r-- 1 mongod mongod 210  7月 27 15:12 2015 mongod.log-20150727
```

## 公式

http://docs.mongodb.org/manual/tutorial/rotate-log-files/
SIGUSR1 でやるみたいです

## 直した

pid出すようにしてないので`killall`で。出しとけばよかった(´Д｀)

```bash
$ cat /etc/logrotate.d/mongo
/var/log/mongo/mongod.log
{
        rotate 4
        daily
        missingok
        nocreate
        sharedscripts
        postrotate
                killall -SIGUSR1 mongod >/dev/null 2>&1 || true
        endscript
}
```

## もう１回確認
1188640 の inode 見てる。

```bash
$ ls -li /var/log/mongo/
合計 8
1188640 -rw-r--r-- 1 mongod mongod 584  7月 27 15:26 2015 mongod.log
$ lsof | grep mongod.log
mongod    32353    mongod    1w      REG                8,3       584    1188640 /var/log/mongo/mongod.log
```

ローテート実行

```bash
$ logrotate -f /etc/logrotate.conf
```

正しくローテートできた。（1196912 の inode を見てる）

```bash
$ ls -li /var/log/mongo/
合計 12
1196912 -rw-r--r-- 1 mongod mongod  71  7月 27 15:26 2015 mongod.log
1188640 -rw-r--r-- 1 mongod mongod 584  7月 27 15:26 2015 mongod.log-20150727
$ lsof | grep mongod.log
mongod    32353    mongod    1w      REG                8,3        71    1196912 /var/log/mongo/mongod.log
```

## 参考サイト

- http://dayafterneet.blogspot.jp/2011/07/mongodb.html
- http://sa3g.blogspot.jp/2011/06/mongodblogorotate.html
KVM構築 (CeontOS 6.4)

# KVM構築
## yumで関連パッケージをインストールする．
```yum -y groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools"```

## libvirtdサービスを稼働させる．
```
/etc/init.d/libvirtd start
chkconfig libvirtd on
```

## qemuによって，qcow2フォーマットの空イメージディスクを作成する．
```qemu-img create -f qcow2 www.qcow2 15G```
※qcow2は，圧縮をかけることができる形式，rowでも特に問題はない．

## ブリッジインターフェースの作成
1) ```yum install bridge-utils```でパッケージ取得，
2) brctlでブリッジbr0を作成する．
```
brctl addbr br0
brctl stp br0 off (スパニングツリープロトコルを使用しない設定，デフォでoffなのでしなくても良い)
brctl addif br0 eth0
```
3) 
```
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0
```
で，ifcfg-br0に以下を追記．
```
DEVICE=br0
TYPE=Bridge
```
ifcfg-eth0に以下を追記．
```
BRIDGE=br0
```
4) /etc/init.d/network restart

※ブリッジ作成時は，往々にしてネットワークが落ちる，現地でやること推奨．

## virt-managerを起動
```
virt-manager
```
でGUIを起動する．

### GUI操作
注意点
1) Select managed or other existing storageでqemu-imgで作ったイメージを選択．
2) customized configurationにチェックを入れて以下を設定． 
a) Disk 1のPerformance optionsで，
Cache mode: writeback
IO mode: native
にする．

## コンソール接続をするためのゲストの設定
(1) /etc/grub.confにカーネルオプションに以下のconsole=...追加する．
kernel /vmlinuz-... console=tty0 console=ttyS0,115200n8

(2) /etc/inittabに以下の行を追加．
S0:12345:respawn:/sbin/agetty ttyS0 115200

# 管理コマンド
```virsh list --all```: 現在導入されている仮想ゲストマシンの列挙
```virsh start OS```: OSの起動
FuelPHPで特定のコントローラーのアクセスを制限する

※コメントにて複数指摘を頂いている記事です。
ひとまず取り下げることはしていませんが、あくまで参考程度に留め置いてくださいませ。

## 前提

 - FuelPHPの内の特定メソッドをcronで動かす
 - 同じFuelPHP内にユーザーがアクセス可能なメソッドがある
 - cron用のメソッドをユーザーとかクローラに踏まれたくない

大人しくFWごと分ければいいんですけどcronで動かすコントローラが一個だったので横着、もとい、サーバー容量の節約ということで上記課題をクリアします(´@ω@｀)


## Basic認証を使ってみる

``` php:cron.php
    public function before(){
		 parent::before();
        switch (true) {
            case !isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']):
            case $_SERVER['PHP_AUTH_USER'] !== 'admin':
            case $_SERVER['PHP_AUTH_PW']   !== 'test':
                throw new HttpNotFoundException;
        }
    }
```

エラー部分についてBasic認証でよく見る書き方は以下

``` php:basic.php
	header('WWW-Authenticate: Basic realm="Enter username and password."');
	header('Content-Type: text/plain; charset=utf-8');
	die('このページを見るにはログインが必要です');
```

なんですが、
今回は間違えて訪れたユーザーにダイアログとか表示したくなかったので上の書き方にしました。
（上：FuelPHP、下：PHPなので少々構文違いますが、脳内で補完してください）

### ところが

URLにIDとパスを組み込む形 http://admin:test@example.com が使えない！という事態に陥りました。
$_SERVERの中にIDもパスも入ってないんですな。そういえばFuelのアクセス先って全部index.php？そのせい？と思ったんですが、あんまり調べずに手を変えました。
動けばよかろうなのだ(｀@ω@´)

## アクセス元を判定してみる

cronは同サーバー内に設定する（これもFW都合でwget --spider使うんですけど）ので、自分と同じIPからのアクセスなら通常処理、そうでなければ404という形に書き換え。

``` php:cron.php
    public function before(){
        parent::before();
        if($_SERVER['REMOTE_ADDR']!=$_SERVER['HTTP_HOST']){
            throw new HttpNotFoundException;
        }
    }
```

サーバー内からwget打ったらこれで動いたんでオッケーオッケー。
Cのconstと*の位置関係メモ

よく忘れるのでメモ
typedef時の挙動が個人的にうっかりポイント


```c
int main(void){
    int foo = 0;
    int bar = 1;

    const int* x = &foo; //or [int const*]
    //*x = 1; //error
    x = &bar; //ok
    
    int* const y = &foo;
    *y = 1; //ok
    //y = &bar; //error

    typedef int* pInt;
    const pInt z = &foo;
    *z = 1; //ok
    //z = &bar; //error
} 
```


[詳しい解説](http://qiita.com/SUZUKI_Masaya/items/6af7e3d8c56d5805a6c5)
dockerのPostgreSQLコンテナのデータを永続化する


色々なサイトの方法を読んだけど自分の言葉で説明するほうがしっくりくる。

前提としてはPostgreSQLは[DockerHub公式リポジトリのpostgres](https://registry.hub.docker.com/_/postgres/)を使っている。

# PostgreSQLコンテナのデータを永続化するだけの最もシンプルなパターン

とにかく永続化したいときホスト側にデータを保存する。

[DockerHub公式リポジトリのpostgres](https://registry.hub.docker.com/_/postgres/)のPostgreSQLデータ領域は/var/lib/postgresql/dataなので、このデータ領域をホスト側から共有できればPostgreSQLのコンテナを消してもデータは残る。

docker runの-vでホスト側のパスを指定し、コンテナのデータ領域を指定する。

```bash
$ docker run -d --name postgres-container -v ~/docker/postgres:/var/lib/postgresql/data postgres:9.4.1
```

docker runのオプションは下記

- d: デーモンとして起動
- name: コンテナ名を指定
- v: ホスト側のパスとコンテナ側のデータ領域

ホスト側のパス~/docker/postgresを調べるとPostgreSQLのデータが有る

```bash
$ ls -la ~/docker/postgres
合計 124
drwx------ 18  999 root  4096  7月 27 14:39 2015 .
drwxr-xr-x  8 root root  4096  7月 27 14:39 2015 ..
-rw-------  1  999  999     4  7月 27 14:39 2015 PG_VERSION
drwx------  7  999  999  4096  7月 27 14:42 2015 base
drwx------  2  999  999  4096  7月 27 14:42 2015 global
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_clog
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_dynshmem
-rw-------  1  999  999  4496  7月 27 14:39 2015 pg_hba.conf
-rw-------  1  999  999  1636  7月 27 14:39 2015 pg_ident.conf
drwx------  4  999  999  4096  7月 27 14:39 2015 pg_logical
drwx------  4  999  999  4096  7月 27 14:39 2015 pg_multixact
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_notify
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_replslot
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_serial
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_snapshots
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_stat
drwx------  2  999  999  4096  7月 27 14:43 2015 pg_stat_tmp
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_subtrans
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_tblspc
drwx------  2  999  999  4096  7月 27 14:39 2015 pg_twophase
drwx------  3  999  999  4096  7月 27 14:39 2015 pg_xlog
-rw-------  1  999  999    88  7月 27 14:39 2015 postgresql.auto.conf
-rw-------  1  999  999 21251  7月 27 14:39 2015 postgresql.conf
-rw-------  1  999  999    37  7月 27 14:39 2015 postmaster.opts
-rw-------  1  999  999    85  7月 27 14:39 2015 postmaster.pid
```

このデータはdocker rmしても消えない
僕のSwift入門メモ(初心者向け)

仕事で簡易的なiOSアプリ作成をする気がするのでSwift入門しました。

#1,変数と定数

```swift:samole
// 変数
var str = "ハローswift"
//型指定あり
var str2:String = "ハローswift" 

// 定数
let CONST_STRING = "hogehoge"
```

#2,for文
おしゃれだ

```swift:samole
for i in 1...9{
    println(i);
}
// 1 2 3 4 5 6 7 8 9
```


#2,if文
綺麗だ

```swift:samole
var flg = true
if flg {
    println("trueだよ")
} else{
     println("falseだよ")
}
// trueだよ
```

#3,配列と辞書

```swift:samole
// 配列
var todos = ["映画", "買い物", "公園デート"];
for task in todos{
    println(task);
}
// 映画 買い物 公園デート

// 辞書
var numOfTires = ["車":4, "バイク":2, "船":0] // タイヤの数の辞書
println(numOfTires["車"]);   //4
```

#4,関数

```swift:samole
// func 関数名(引数:型)->戻り値の型
func addNum(num1:Int, num2:Int)->Int{
    return num1 + num2;
}
println(addNum(3, 3))
// 6
```


#5,クラス
コンストラクタ→イニシャライザ？

```swift:samole
class Dog{
    var name:String
    var age:Int
    
    // イニシャライザ init
    init(name:String, age:Int){
        self.name = name
        self.age = age
    }
    
    // デニシャライザ
    deinit{
        
    }
    
    // インスタンスメソッド
    func greeting(){
        println("私は" + self.name + "ですわん。" + String(self.age) + "歳だよ")
    }
    
    // クラスメソッド
    class func bow(){
        println("犬はみんな吠えるよワン！(キャンかもしれないけど)")
    }
}

// インスタンス化
var pochi = Dog(name: "ぽち", age: 17)

// インスタンスメソッドの実行
pochi.greeting() //私はぽちですわん。17歳だよ。

// クラスメソッドの実行
Dog.bow() // 犬はみんな吠えるよワン！(キャンかもしれないけど)

```

#5,オプショナル型
■ Optional型についてのまとめ
  http://qiita.com/cotrpepe/items/e30c7442733b93adf46a
ベーシック認証とJSONとUIwebView。

ベーシック認証が設定されているサーバーのJSONを読み込んでやりたかった事。
① 画像までのパスを取得してUIImageに設定したかった。
② UIWebViewに読み込みたいページのURLを取得して表示したかった。

で、、、
JSONに関してはAlamofireを使ってJSONを取得

```lang:JSON
{
  "responseData": {
    "feed": {
      "entries": [
        {
          "id": "220",
          "title": "タイトルが入ります。",
          "text": "記事の本文です。",
          "cat": "カテゴリー",
          "subCat": "サブカテゴリー",
          "thumbnail": "http://◯◯◯.com/img/entry/☓☓☓.jpg",
          "url": "http://◯◯◯.com/△△△△.html"
        }
      ]
    }
  }
}
```
というJSONデータを読み込みます。


```lang:Swift
let user = "userId"
let password = "userPass"

// JSONのパース
func parse(url: String, completion: (([JSON]?, NSError?) -> Void)){
   var url = NSURL(string: url)
   Alamofire.request(.GET, url!, parameters: nil, encoding: .JSON)
      .authenticate(user: user, password: password)
      .responseJSON{ (request, response, data, error) in
         let json = JSON(data!)
         let entries = json["responseData"]["feed"]["entries"].array
            completion(entries, error)
   }
}
```

**.authenticate(user: user, password: password)**
と、この一文を足すとベーシック認証下のJSONは読み込めましたが、画像、UIWebViewへの埋め込みはできませんでした。

色々と考えたのですが結局JSONファイルを修正しました。

```lang:JSON
{
  "responseData": {
    "feed": {
      "entries": [
        {
          "id": "220",
          "title": "タイトルが入ります。",
          "text": "記事の本文です。",
          "cat": "カテゴリー",
          "subCat": "サブカテゴリー",
          "thumbnail": "http://userId:userPass@◯◯◯.com/img/entry/☓☓☓.jpg",
          "url": "http://userId:userPass@◯◯◯.com/△△△△.html"
        }
      ]
    }
  }
}
```

てな感じで、URLに直接ユーザー名・パスワードを埋め込みました。
（このページを参照）
[http://qiita.com/ngkazu/items/6da021edf177f40e1f26](http://qiita.com/ngkazu/items/6da021edf177f40e1f26)

これで無事、表示しました。
開発中のアプリ内のJSONキャッシュは結構きついのでキャッシュ対策をしておく方が無難です。

```
http://◯◯◯.com/▲▲▲▲▲.json?123
```

とURLに?〜をつければOK。
background-imageを全画面表示!!



##cssで background{ }で画像を全画面表示できなかったので調べた

```
html { 
  background: url(画像のパス) no-repeat center center fixed; 
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
}

```


*background-imageはいらない
*画質があれだと あんまりキレイに表示できないので
JAWSUG コンテナ支部: Dockerハンズオン #1

　
[JAWS-UGコンテナ支部 Docker入門 #1](https://jawsug-container.doorkeeper.jp/events/27766) のハンズオン資料です。
（当日利用したスライドは[こちら](http://www.slideshare.net/ryonakamaru/jawsug-docker-10)）

# 1. Docker操作用のEC2インスタンスを起動します

## 1.1. CloudFormationを実行します

https://goo.gl/zeiGib を開き、Next。
（ちなみに、実行されるテンプレートは [これ](https://github.com/supinf/docker-handson/blob/master/provision/cloudformation.template)です）

![20150727153622_948fe3268eb520677495387adf522192.png](https://qiita-image-store.s3.amazonaws.com/0/66457/ae3e6631-2a5c-9e1f-d437-5a42e624c1e6.png)

インスタンスタイプは `t2.micro` のまま[^1]
キーペアをひとつ選択して、Next。

次の画面はなにもせず、Next。
次の画面で内容を確認して、Createを押します。
画面を更新して、

![20150727153942_52f16746e8936276c5173a9ddcfa853b.png](https://qiita-image-store.s3.amazonaws.com/0/66457/2f7fe932-b97c-af6d-7e97-8a164b5e5a3a.png)

ステータスが `CREATE_COMPLETE` になるのを待ちます。

## 1.2. 起動した EC2インスタンス[^2]のパブリックIPアドレスを控えます

CloudFormationが完了したら、`Outputタブ`を開き、
`PublicIP`に表示されているIPアドレスをコピーします。

![20150727155147_5dfa6609f5d4f7f0f9e1bfb4aa51c846_1.png](https://qiita-image-store.s3.amazonaws.com/0/66457/1638eea9-ba21-747c-2100-b834b9a08987.png)


# 2. EC2インスタンスに SSH接続して遊ぶ

## 2.1. SSH接続する

ターミナルを開き、以下の`ec2.public.ip.address`を
1.2.のパブリックIPアドレスに置き換えて

```bash
your-host$ ssh -i your-ec2.pem core@ec2.public.ip.address
```

のようにして EC2インスタンスに入ります。
この時、ユーザ名は **ec2-user** ではなく **core**[^3] です！！

## 2.2. 遊べるアプリ一覧を確認します

```bash
core@ec2$ ls handson/how-to
apache.txt                jenkins.txt              postgres.txt
centos.txt                logstash-deprecated.txt  python.txt
drupal.txt                mongo.txt                rails-deprecated.txt
fedora.txt                mono-deprecated.txt      redis.txt
glassfish-deprecated.txt  mysql.txt                tomcat.txt
go.txt                    nginx.txt                ubuntu.txt
java.txt                  node.txt                 wordpress.txt
```

この中から、`deprecatedでないもの`を選んでください。

## 2.3. 遊び方を確認します

例えば MySQLなら、以下のコマンドで遊び方がわかります。
（`mysql.txt`の部分を適宜置き換えてください）

```bash
core@ec2$ echo -e $(cat handson/how-to/mysql.txt)
```

## 2.4. 手順に沿って、コンテナを起動してみましょう

2.3の手順にそって、例えば MySQLならこんな感じでコンテナを起動します。

```bash
core@ec2$ docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.6
```

外部から、起動したコンテナへアクセスしてみてください。
うまくいきましたか？

```bash
your-host$ mysql -h ec2.public.ip.address -u root -p
```

普通ならインストールが大変なアプリケーションも
Dockerを使えば簡単に、素早く起動できましたね！！

## 2.5. Dockerのコマンドで遊んでみましょう

この EC2インスタンスでは Dockerコマンドが使えます。
いろいろ試してみてください！

```bash
core@ec2$ docker images
core@ec2$ docker ps -a
```

　
[^1]: t2.microは 1時間起動で、およそ $0.02かかります。
[^2]: AMIに入っているのは Dockerイメージと [これ](https://github.com/supinf/docker-handson)のクローンです
[^3]: CoreOSを使っているためです・・
リモートデスクトップ(Windows→Mac)

# トンネリングの作成
## ソフトウェアによる作成
coccinellidaをインストールする．
http://coccinellida.sourceforge.net/
coccinelidaで以下を設定する．
1) Name: トンネリング名
2) Host: ゲートウェイマシンのドメイン名
3) Port: 使用するポート番号，sshなら22
4) User: ユーザ名
5) Password: パスフレーズ
6) Identity: 秘密鍵
Port Forwarding
7) Local Port: 設定する自分のマシンのポート番号，10000以降の適当な番号
8) Remote Host: 操作したいマシン名
9) Remote Port: トンネリングしたいプロトコルのポート番号，windows remote desktopのポートは3389

## コマンドによる作成
上記の内容と対応させると以下のようなコマンドになる．
```ssh -v -N  -L localhost:(7):(8):(9) -o ConnectTimeout=15 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -i (6) -p 22 (4)@(2)```

# 
Macのアプリ，remote desktop connectionでlocalhost:(7)で接続できる．
mackerelでmysqldを監視するための設定


#背景

mackerelは公式プラグインで簡単にmysqldを監視できる。

* [mackerel-pluguin-mysql](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-mysql)

しかし、デフォルト設定ではrootユーザーを使ってしまうので、別途ユーザーを作成することにした。

#作業手順

## mysql側のユーザー作成

mysqlに特権でログイン。以下は例なので、環境に合わせて。

```bash
$ mysql -u root
```

ユーザーを作る。以下の例では『monitor_user』という名前にした。

```mysql
mysql> create user 'monitor_user'@'127.0.0.1';
mysql> grant PROCESS, REPLICATION CLIENT on *.* to 'monitor_user'@'127.0.0.1';
mysql> flush privileges;
```

どうせローカルホストだし、mackerel-plugin側に平文でパスワードを書く必要があるので、パスワード設定はなし。
※ 権限に過不足があれば教えて下さい。


## テスト

```bash
$ /usr/local/bin/mackerel-plugin-mysql -username=monitor_user -tempfile /tmp/mackerel-plugin-mysql-localhost-3306
mysql.innodb_lock_structures.innodb_lock_structs	0	1434080228
mysql.innodb_adaptive_hash_index.hash_index_cells_total	34679	1434080228
mysql.innodb_adaptive_hash_index.hash_index_cells_used	0	1434080228
mysql.innodb_buffer_pool_read.read_ahead	0	1434080228
以下略
```

いっぱい出ればOK。権限エラーが出たら権限不足。
tempfile作成でpermission deniedの時はsudoとかしないとダメかと。

## mackerel-agentへの設定適用

mackerel-agent.confを修正する。

```/etc/mackerel-agent/mackerel-agent.conf
[plugin.metrics.mysql]
command = "/usr/local/bin/mackerel-plugin-mysql -username=monitor_user"
```

設定適用

```bash
$ service mackerel-agent restart
```
Bundlerの秘密

BundlerとはRubyGemsたちの依存関係を上手いこと整理してくれる賢い奴

# コマンド
－Gemsのインストール
　`bundle install`
　本番環境のみにインストールしたい場合は、
　`bundle install --without production`
　このオプションを一度使うと以降は入力を省略できる
－bundle execを省略してコマンドを打つ方法
　RVMをインストールする
－その他
　適宜更新
ケツカンマの簡易検知方

IE7以前ではオブジェクトのケツカンマでエラーになります

```js
var a = {
  a: 1,
  b: 2, // ケツカンマでエラー
};
```
関連 [JavaScriptの「ケツカンマ問題」まとめ](http://dqn.sakusakutto.jp/2012/05/javascript-last-comma-matome.html)

気を付けていてもコメントアウト時などついうっかりケツカンマを入れてしまう場合があるかと思います。

以下の正規表現で簡易的にケツカンマの箇所を検知できます。

```
,\R\t*\}\R
```

改行やインデントなどのフォーマットがされていること前提です。

(改行コードは``\R``、インデントはタブ使用の環境の場合ですが、お使いの環境に合わせてください。)

ちなみに、jshintのオプションでケツカンマの検知を有効にすることもできます。
[JavaScript - jshint でケツカンマを見つける - Qiita](http://qiita.com/martini3oz/items/708d598b7601534beb36, 'JavaScript - jshint でケツカンマを見つける - Qiita')


2015/7/29 追記
コメントで教えていただいたのですが、

```
,\s*\}
```

で、改行やタブに依存せず簡易的に検知できます。こっちの方が楽なのでよいですね。
Python2のバージョン確認-Vは出力先が標準エラー出力

シェル変数に代入できなくて焦った
3では普通に標準出力です。


```

$ python -V 1>/dev/null
Python 2.7.9
$ python -V 2>/dev/null
$
```

```
$ python3 -V 1>/dev/null
$ python3 -V 2>/dev/null
Python 3.4.3

```

[書いてないし]`-v`でも焦るしでやめて欲しい(やめている)

[書いてないし]:http://docs.python.jp/2/using/cmdline.html
gitコマンドまとめ(.DS_Storeを間違えてpushしたとき)

## **<i class="fa fa-refresh"></i>  gitが見ているレポジトリを変えたい**
git cloneして引っ張ってきた後、他のレポジトリに上げたいときなど
`git remote set-url origin <your repository url>`

## **<i class="fa fa-refresh"></i>  .DS_Storeを間違えてremoteにpushしてしまった**
.gitがあるディレクトリで、
`find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch`
これで憎き.DS_Storeが抹殺できるので、後はcommit、pushするだけです。


## 参照
http://d.hatena.ne.jp/wats/20100915/1284478558
http://blog.marsbar.us/2013/06/05/git-remove-ds-store/
git メモ

最近gitで詰まったり こんな時どうするんだ？？
ってなる事が結構あるので、学んだ事をまとめていきます。

## git 作業場所について
.git があるところがgitから管理できる

## gitの状態表示のためのコマンド

過去のコミット履歴を一行で表示する

```
git log --oneline
```

commitしてないファイルを確認

```
git status
```

```
git checkout -- index.html git add の後に戻れる
```
### git diffまとめ
addする前のファイルと後のファイルを比較する

```
git diff 
```

commit する前と比較

```
git diff --cached 
```

## リモートレポジトリのマスターと比較するときには？
まずは

```
git fetch origin master
git diff origin/master
```

git rm inde.html 削除
git mv index.html 移動

vim .gitignore 
	*.logとか *.pngとか みたいな感じで書ける 
	
##直前のcommitを変更する。

一つ前のcommit に追加するには
```
git commit --amend
```

## git reset 
オプションには大きく分けて3種類存在する
--soft
ファイルに対して変更を加えない
--mixed
>> TODO 後で調べる
--hard
ファイルに対して変更を加える

### git reset 基本的な使い方

git reset HEAD(最新のコミット) 
git reset HEAD^

特定のコミットに戻る
git reset (commitのハッシュ値)

##git branch
git branch hoge     新しいbranchを作れる。
*がついてる所に今 自分はいますよっと

git checkout ブランチ名
git merge hoge(ブランチ名) 混ぜる（笑）
git branch -d hogebranch ブランチをmergeした後は消していいので branchを消す時のコマンド

branchの衝突の解消

git checkout -b dokodoko branchを作って移動

git statusでなおせメッセージがでる

普通に画面が出るのでそこを手動で削除できる。

##gitのタグ(あんま使わない)
git tag hogehoge
git show hogehoge 
git tag v0.1 nvejfnnvjnf
git tag -d v0.9 (タグを消す)

## gitでやらかした時

###git reset --hardしてしまった！！
イライラしてついやってしまう時ありますよね(ねええよ)

git reflogというコマンドがあります。
このコマンドは名前の通りlogを出力してくれるのですが、レポジトリのログではなく
コミットへのログを出力してくれます。
ですので 自分が間違って打ってしまった reset --hardをreset --hardしなくてはいけません(錯乱)
念の為に
git reflogで幾つ前に戻すのか見てから
git reset --hard "HEAD@{x}"ですね
大体
git reset --hard "HEAD@{1}です

##git エイリアス

git config --global  alias.co checkout
git config --global  alias.st status
git config --global  alias.br branch
git config --global  alias.cm commit

##github

git init --bare 

A

B


git romete add orgin ~/どこどこ.git
git remote rm どこどこ 
git push origin master 

git pull origin master 変更をとってきて保存する。

addとcommitを同時にする
git cm -am "test commit"


共有場所でconflictしたら
mergeの時と同じ感じでやればok

githubでpush先でミスったらこの辺が参考になります

http://transitive.info/article/git/command/remote/
rails dbconsoleで使えるコマンド

この記事は[RailsGuides](http://railsguides.jp/)の補完メモです。

# [1.5 rails dbconsole](http://railsguides.jp/command_line.html#rails-dbconsole)

## rails dbconsoleで使えるコマンド

### SQLite3

－テーブルの一覧を確認する
　`sqlite> .table`
－テーブルの構成を確認する
　`sqlite> .schema <foobar>`
－テーブルの内容を確認する
　`sqlite> SELECT * FROM <foobar>;`
－SQLクライアントを終了する
　`sqlite> .quit`

### PostgreSQL

準備中
digコマンドの基本的な使い方

## About
digコマンドを理解していなかったので、この機会に基本的な使い方をまとめました。

## digとは
domain information groperのこと。ネームサーバから情報を引き出すツール。

## 基本的な使い方
* ドメイン名に対応するAレコードを取得する

```
$dig <domain>

; <<>> DiG 9.8.3-P1 <<>> ANY <domain>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29775
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 4
...
;; QUESTION SECTION:
...
;; ANSWER SECTION:
...
;; AUTHORITY SECTION:
...
;; ADDITIONAL SECTION:
...
;; Query time: 31 msec
;; SERVER: 61.122.116.147#53(61.122.116.147)
;; WHEN: Tue Jul 14 15:23:07 2015
;; MSG SIZE  rcvd: 285

```

ヘッダ・フッタを除くと最大で4つのセクションが表示される。QUESTIONが実行した検索内容、ANSWERが検索結果、AUTHORITYがANSWERに権威を持つDNSサーバ（NSレコード）、ADDITIONALは追加情報を示す。

* ドメイン名に対応するNSレコードを取得する

```
$ dig NS <domain>
$ dig NS google.com
```

NSの部分に他のタイプを入れれば対応するレコードを確認できる（A/CNAME/ANYなど）

* IPアドレスからドメイン名を取得する（逆引き）

```
$ dig -x <ipaddress>
```

* 特定のネームサーバに対してQUERYを発行する

```
$ dig A <domain> @<name server>
$ dig A google.com @ns2.google.com
```

## 応用編
### 出力結果を短くする

```
$ dig google.com +short
```

## インストール方法
centos系で`dig`を導入しようと思った時、`sudo yum install dig`ではインストールできません。

下記のパッケージを指定してインストールします。

```
$ sudo yum install bind-utils
```

ちなみにubuntuでは下記のようにインストールするようです。

```
$ sudo apt-get install dnsutils
```
ui > badui 

最近、購入した本から以下のようなサイトを知った。

http://badui.org/

過去に作られた色々な失敗UIを知ることにより、自分では同じ失敗をしないよう気を付けたいと思う。

本の方は「失敗から学ぶユーザインタフェース by 中村聡史さん」
Apacheのmoduleをソースビルドする場合に気をつけること

## これはなに？

(めったにないけど) Apacheのmoduleをソースビルドする際に気をつけること。

たまたま担当したサービスに自社製Apache moduleがあったので備忘録を兼ねてます。


## まずはビルド方法

/Path/to/apache/bin/apxsを使うのがお手軽い

```bash
/Path/to/apache/bin/apxs -ci mod_xxx.c

or

/Path/to/apache/bin/apxs -c mod_xxx.c
/Path/to/apache/bin/apxs -i mod_xxx.la
```

## 気をつけること

### 1. Apacheプロセス起動中に apxs -i mod_xxx.la しない

すでにLoad済みのモジュールの更新をする場合、Apacheプロセス稼働中にapxs -iしちゃうと
Segmentation faultをくらっちゃいます。

```bash:/Path/to/apache/logs/error_log
[Mon Jul 27 12:42:43 2015] [notice] child pid 6926 exit signal Segmentation fault (11)
```


いちおう回避策もあります。

/Path/to/apache/build/instdso.sh を以下のように編集してから、apxs -iしてやると
稼働中のApacheでもSegmentation faultしないはず。
※更新が反映されるのは、Apache restart後。

```bash:/Path/to/apache/build/instdso.sh
< CMD="$SH_LIBTOOL --mode=install cp $DSOARCHIVE $TARGETDIR/"
---
> CMD="$SH_LIBTOOL --mode=install install $DSOARCHIVE $TARGETDIR/"
```

詳細はこちらをご確認ください。
参考: http://dsas.blog.klab.org/archives/50972695.html


## 2... は特に無かった。 apxs -c時に出たWarningなどはきっちり潰さないと Segmentation faultくらいますよ。くらい。
【TravisCI改善】sudo apt get installしていたところをsudo使わないようにする　〜sudo: falseで利用するために〜

# 背景
* ```sudo: false``` でビルド回すと早いよという記事をよく見たので実際やってみると5分くらい違った
 * 起動後の処理が早いようだ
 * 60分が55分になってもあまり感動はないかもしれないが、15分が10分になるのって結構でかい
* ビルドにも以下のようなメッセージがでるようになったので、sudoつけている箇所をとっぱらいたい
 * ![build.png](https://qiita-image-store.s3.amazonaws.com/0/19778/4917b287-691b-c2dd-3d08-624fa857df09.png)


# 変更
### sudo を使っていたやり方

```:.travis.yml
before_install:
  - sudo apt-get update -y
  - sudo apt-get install -y [パッケージ名]
```

### addonsにインストールしたいパッケージを書くやり方
* 公式のドキュメントにちゃんとかいてあるが@oh_rusty_nailは見落としていたので、そんな方も他にいらっしゃるかもと思い投稿しました！
 *  http://docs.travis-ci.com/user/apt/
* そして、インストールの前にはupdateが先に叩かれる

```:.travis.yml
addons:
  apt:
    packages:
    - [パッケージ名]
```

* すべてのsudoが取り除ければ、```sudo: false```と書いてやれば良いです

----

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
YahooAPI yconnect 注文検索APIでの証明書について

現在、YConnectServlet.javaを見本に、YahooID連携を行い、注文検索APIでデータを取得しています。

YahooID連携ボタンからログインを行い、注文検索APIによりデータは取得できていますが、12時間でリフレッシュトークンの有効期限が切れるため、
運用上問題があり、証明書を申請し4週間の間隔にしようとしております。

システムには、大きく分けて２プロセスがあり、
【１】．YahooID連携ボタンからログインを行いリフレッシュトークンを取得、データベースに保存
【２】．データベースに保存されているリフレッシュトークを使用し、アクセストークンを取得後、注文検索APIを動作させ情報の取得
を行っております。

証明書を申請し、ストアクリエイターProよりダウンロードを行い、ヘルプページ（ http://developer.yahoo.co.jp/webapi/shopping/help.html ）の
Javaの場合（サンプル） にある。
 $ openssl pkcs12 -export -inkey "秘密鍵を指定" -in "証明書を指定" -out "出力ファイル名"
によりPKCS12のファイルを作成、サーバに配置を行い。サンプルプログラムを、リフレッシュトークンの取得前、 YConnectServlet.javaの場合
46行目の　protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
のあとに記述し、コメントとなっている。
		// SSL証明書チェック無効 ※Production環境では必ず有効にすること
		// YConnectExplicit.disableSSLCheck();
をコメントをはずし有効にしました。

再度、YahooID連携ボタンからの実行を行い、注文検索のデータを取得できていることを確認
しかし、12時間後に【２】の動作を行うと注文検索APIの箇所で401エラーとなり取得できない状態となります。

【２】の動作で、リフレッシュトークンによりアクセストークンは取得できています。(証明書を必要としないAPIで使用するため取得できるのだと思っております。)
取得したアクセストークンを使用して、注文検索APIを呼ぶと401エラーとなります。
証明書の実装が正常に動作していないと判断しております。

そこで、幾つか質問なのですが

１．ヘルプページのサンプルコード（PKCS12ファイル読み込み）を記述する箇所は、リフレッシュトークンの取得時、アクセストークンの取得時、注文検索APIの実行時、どこに設定すればよいですか？
２．プロセスが2つに分かれておりますので、【１】と【２】それぞれで、サンプルコード（PKCS12ファイル読み込み）の記述が必要でしょうか？
３．YahooID連携ボタンの実行後、12時間後にしか結果がわかりませんが、実行後に確認する方法などありますでしょうか？
４．このプログラムを実行してOKが帰ってくれば証明書の確認は出来ているというような、サンプルコードはありますでしょうか？
５．証明書を使用する事の出来る３API、注文検索API、注文詳細API、注文内容変更APIの証明書を使用したフローやサンプルコードなどはありますでしょうか？

よろしくお願いいたします。
リモートデスクトップ(Linux→Mac)

# VNC serverの構築　（CentOS)
1) tiger vnc serverをyumる．
```yum install tigervnc-server```
2) vncserverのパスワードを設定する．
```vncpasswd```
3) vncserverを起動する．
```vncserver```
これで，5900+idのポートを使用したvncがビルドされる．

※```vncserver -list```で現在のvncのステータスが見れる．
※```vncserver -kill :id```でid番号のvnc serviceをkillできる．

# Macの場合
1) coccinellidaによってトンネリングを作成する．
(もちろんコマンドでも可)

2) RealVNCでvncクライアントを設定する．
Webpack: jade-loaderでJadeファイル内でincludeする。


app <- template <- particalという感じでapp.jsないでjadeでテンプレートを展開したい。

https://github.com/st44100/webpack-jade-loader-with-include-example

**app.js**

読み込み先

```js
var template = require('jade?includeInline=false!./template.jade')();
console.log(template);
```



**partical.jade**

別のJade内でincludeされるJade

```jade
div
 p Partical
```


**template.jade(誤)**

jade-loadeを使ってapp.jsへrequireされるJade


これを普通に

```jade
div
  include partcial
```

とすると`partical.jade`の中身がnodejsとして解釈されてしまう。そのため下記の様に`include`の代わりに`require`してあげる。

**template.jade(正)**

```jade
div
  != require('jade!./partcial.jade')
```
業務用SVGの使いかた

# SVGを使う意味



## 1. Retinaでの画面のクオリティを上げるため
画像をしこたま用意して、Retinaで出し分けする方が低コストですが、
ファイル数が肥大化して管理が煩雑になります。

## 2. 動くUIをつくる
そもそも、UIのコンポーネントにPNG画像が使われている方が違和感だという思想が芽生えてきました。
Hoverで色が変わったり形が変わるUIComponentを作るために、`img`や`div(background-image)`を使う時代は終わらせましょう。


# 使い方
SVGの良さを活かすなら、inlineで埋め込む以外の選択肢はありません。
DOM感覚でいじれるのでみんなだいすきな`$`で`attr`しましょう。

# 書き出し方

Illustratorだったら、普通に保存形式でSVGを選べば大丈夫です。
viewboxを原点からにしたかったら、新規ファイルから作らないとダメです。
イラレのだめなところは、SVG書き出し設定があんまり細かいところまで出来ないところです。
XML宣言まで指定されちゃうんで、jsから動的に動かそうとしたら、svgo噛ませるか、手動でXML宣言消さないとちゃんと動いてくれません。

```xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="280px" height="40px" viewBox="-339 261 280 40" style="enable-background:new -339 261 280 40;" xml:space="preserve">
~
</svg>
```

svgo噛ませたら

```xml
<svg xmlns="http://www.w3.org/2000/svg" width="280px" height="40px" viewBox="-339 261 280 40">
```
こう削ってくれます

sketchだったら`sketch-tool`からの`svgo`かませれば自動化できます。らくちんちん。

## 埋め込み方
- jadeだったら`@include hoge.svg`
- 非同期だったら、`$.get("hoge.svg",cb_append)`
- バリバリ使いたかったら、`Snap.svg.js` (Snapはrequireできないので注意)
- 慣れてきたら直書き

## 注意点
widthとheightは指定してあげたほうが安全かもです。
Android2.0系では両方指定しないと勝手に伸縮された経験があります。つらい。


# 手書き

```xml
<svg xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="10" height="10"/>
  <circle cx="10" cy="10" r="10"/>
</svg> 
```

htmlを手書きできるひとだったら、これくらい造作も無いのではと思います。
さらっとHTMLの中にコレを書けるとニュージェネ感出てくると思います。
classとかつけちゃってCSSあてちゃってください。
`hover`とか`transition`とかあてちゃって、イケてるComponent作ってください。


# IE8対策
IE7は割りとガン無視されてきてる昨今ですが、８は最低限対応しろという視線を感じています。

こればっかりはしょーがないので、PNG画像をつくらないといけないですが、どうせなら楽したいですよね。
[SVGEXPORT](https://github.com/shakiba/svgexport) - （phantom使ってcanvasつかってってかんじっぽいです。あんまりよくなさそう。どうせならnode canvasつかえよーっていう）
[imagemagick](http://www.imagemagick.org/script/magick-vector-graphics.php) - 王道

鍵はサイズ指定になってきそう。
ここらへんは試してません（まて）

動きなどを担保する必要性がないならば、テキストで代替させるくらいの度量は必要な気がします。
`ハンバーガーボタン`→`MENU` という表記にする。とか・・・（IE8使う層には適切なUI設計です！<棒）
Windows10 調べて分かったこと

#インストールの手段（無償アップグレード）
Windows 10メディア作成ツールを利用
Windows Update経由でのインストール
Windows起動中にDVD/USBメディアからセットアップ

#インストールの手段（要ライセンス）
DVD/USBメディアからのクリーンインストール
新規購入したPCへのセットアップ

#インストールの手順によっては無償アップグレード対象にならない。
http://ascii.jp/elem/000/001/035/1035711/

#Wikipedia
https://ja.wikipedia.org/wiki/Microsoft_Windows_10

#RTMのISOが配布されているらしい。こんなこと今まで無かったような気がする
http://qiita.com/tonkotsuboy_com/items/fc0c0c974f27a88309a7

#7/8.1からのアップデートを早めるにはWuaucltコマンドが便利らしい
http://qiita.com/mly520/items/aad0de262b8686d27ec8

# Windows10のライフサイクル

|key|value|
|:-----------|:-----------|
|製品名|Windows 10 Home, released in July 2015|
|ライフサイクル開始日|2015/07/29|
|メインストリーム サポート終了日|2020/10/13|
|延長サポート終了日|2025/10/14|

# SQLServerのサポート
2012,2014にアップデートしないとサポート対象外に。業務アプリとか注意。
https://support.microsoft.com/en-us/kb/2681562

|key|value|
|:-----------|:-----------|
|2016|Unknown|
|2014|You must apply SQL Server 2014 Service Pack 1 or a later update.|
|2012|You must apply SQL Server 2012 Service Pack 2 or a later update.|
|2008|not supported on Windows 10.|
|2005|not supported on Windows 10.|



SQL Server 2005 
Microsoft SQL Server 2005 (the release version and service packs) and earlier versions of SQL Server are not supported on Windows 10, Windows Server 2012 R2, Windows Server 2012, Windows 8.1, or Windows 8. 
You will receive a warning in the Action Center if Windows 10, Windows 8.1, or Windows 8 detects an instance of SQL Server 2005.

For SQL Server 2008 R2
SQL Server 2008 R2 is not supported on Windows 10.

For SQL Server 2008
SQL Server 2008 is not supported on Windows 10
Electron でデスクトップガジェット

最近 nodejs や electron を使い始めて、なんとなくわかって来て
何か作りたくなったので、思いつきでガジェットを作る事にしました。
[electron-gadget](https://github.com/h141dev/electron-gadget)

nodejs も electron もまだ使いこなせていませんが、思いつきでこの程度の物なら
簡単に作れてしまう手軽さは素晴らしいの一言だと思います。

目標としては、linux の conky + Windows のデスクトップガジェット + α

現状としては、まだ時計とCPUしか表示出来るようになってないので、
見た目の良さや、表示項目を追加したりしていく過程で、nodejs や electron の
理解が深まれば良いなと思っています。

あと、私はマックを持っていないので、マック用の実装と動作確認をして頂ける方を
絶賛募集中です！ :smile:
開発者インタビュー記事の良くないパターン


ネット媒体に載せるインタビュー記事で気をつけるところをパターン化し、それの対応策っぽいものをまとめた

- まえがきが長い
	- だらだらと一般的なことを持論のように述べられても読みたくない
		- 例：「ネットが当たり前の昨今、これからの開発者というものは...」
		- どうしても書きたいなら最後に書けばいい
- インタビュー対象の成果が分かりづらい
	- 具体的なアウトプットを示さないと興味もわかない
		- 例:「リーン・スタートアップやグロース・ハックに長けた人物として、社内で高く評価されている」
	 		- インタビューは人ありきだが、まず成果があってその開発者のインタビューの形がいい
- つまらないポジショントーク
	- 会社のPRをするためのインタビューはいいことしか書かない
		- インタビュー対象はPRをしたいが、インタビュアーがPRするとつまらない
	- エッヂがきいてないと面白く無いのでネットでは注目されない
- 写真のメッセージ性が伝わらない
	- おしゃれなオフィスならおしゃれさが伝わるように徹底する
	- 男前を写したいならふざけた感じに
	- 例外的に遊び心が少しでもあればワケが分からない写真は面白いがそれは難しい
	- オフィスでインタビューするなら周りを見て面白い題材を見つける
- 読んだ人が得るものがない
	- インタビュー対象のノウハウや考えていることが重要
		- 引き出すのは難しい
			- 成功談と失敗談を聞く
				- 本当は失敗談のほうが得られることが多いが自分の失敗をしゃべりたがる人は少ないのでまずは成功談から話を聞く
	- インタビュー対象はいつも普通に仕事をしているので特別な事はないと思っている
		- 外から見ると特別だったりする
			- ディスカッションしてあえて反対の意見を投げかけてみる
	- インタビュー対象が他のインタビューに答えているならそれを見ておく

その他、オレはこう思うっす

- 思い込みを持ってインタビューに挑んではいけない、というのは誤り
    - むしろガチガチの偏見で挑んでいい
        - 自分の偏見が正しいか踏み込んで具体的に質問すればいい
            - 踏み込んだ具体的な質問にこそ価値がある
        - 偏見が正しくない事が分かればなぜ偏見を持っていたか振り返る
            - 自分はこう思っていたが意外にもそうではなかった、という話に意味がある
            - 実際にインタビュー相手にも自分がこういう偏見を持っていたと話してさらに深く対話する
mongod設定項目まとめ(wiredTiger編）


使うにあたって設定項目ざっと調べ太郎。

## 設定ファイル例(wiredTiger使用)
	# mongodb_wt.conf
	storage:
	    dbPath: "/data/mongod_wt"
	    engine: "wiredTiger"
	    directoryPerDB: true
	    wiredTiger:
	        engineConfig:
	            cacheSizeGB: 1
	            directoryForIndexes: true
	            statisticsLogDelaySecs: 0
	        collectionConfig:
	            blockCompressor: "snappy"
	        indexConfig:
	            prefixCompression: true
	    journal:
	         enabled: true
	systemLog:
	   destination: file
	   path: "/var/log/mongodb/mongodb_wt.log"
	   logAppend: true
	processManagement:
	    fork: true

## storage設定項目例

### dbpath
データベースファイルの作成先ディレクトリ

### journal
ジャーナルファイル作成するかどうか

### directoryPerDB
デフォルトfalse
データベースごとにディレクトリを作成するかどうか

### engine
ストレージエンジンの選択

- mmapv1 - 従来のストレージエンジン
- wiredTiger - wiredTigerストレージエンジン

3.0ならwiredTiger使わないと意味ないと思うので、そちらをメインにみる。


## wiredTiger設定項目例

### engineConfig

#### cacheSizeGB

デフォルトではシステムメモリの半分 or 1GB
wiredTigerで実データをキャッシュするためのメモリ領域の指定。
スレッドやIndexでもメモリ食うので、最初はシステムメモリの6〜7割とる形が良いと思われる

#### directoryForIndexes

MySQLだとinnodb_file_per_table相当ですな。

#### statisticsLogDelaySecs

デフォルトは0（出力しない）

wiredTigerの統計情報ファイルを何秒ごとに出すかの設定。
0だと出力しない。
出力時に重くなる傾向があるので、テスト時は30秒とかで設定して本番の時は10分に一回とか、出さないとかで設定するのがいいかと。

### collectionConfig

#### blockCompressor

データ圧縮するかどうか、デフォルトはsnappy。圧縮時のCPU負荷など気になる場合はnone

- none - 圧縮しない
- snappy - ほどほどの圧縮率で高速に圧縮
- zlib - snappyよりも圧縮率はいいけど低速


### indexConfig

#### prefixCompression

デフォルトTrue
index圧縮を行うかどうか

## その他

### engineConfigStrings
    storage.wiredTiger.engineConfig.engineConfigStrings

で、wiredTigerの細かいオプション設定出来た気がしたんだけど、ドキュメントから消えてる。ので使う場合は注意がいりそう。


## 補足資料
### MongoDB設定
http://docs.mongodb.org/manual/reference/configuration-options/

### snappyアルゴリズム
Googleで作ったプロトコルらしい、lzoとほぼ同じ圧縮率と速度。

http://www.slideshare.net/moaikids/snappy


http://static.tumblr.com/lbtm3t2/8PAn0kziu/mongodb-logo.png
シリアライズフォーマットに関する所感

このエントリーはポエムです。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">msgpackにschemaがないと使いものにならないとい言う人がjsonについてどのような意見をお持ちなのか聞きたい</p>&mdash; tagomoris (@tagomoris) <a href="https://twitter.com/tagomoris/status/625490953453711360">July 27, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

JSONはプレーンテキストで読み書きできて、RFCで標準化されてて、多くの処理系で標準サポートされているというのは強みですね。特に、E4Xが死に絶えた今、ブラウザという環境がネイティブで対応しているのがJSONしかない、という意味でもJSONはオンリーワン。後付ではあるものの(とはいえ、XML Schemaですら後付けなので後付けがデメリットではない)、色々な言語環境にポートされているJSONスキーマもあるので、固くしようと思えばできる。といってもウェブのAPIの出入口ぐらいでしか書こうというモチベーションはわかないし、それであまり困ったこともない。

JSONと比べると、一部すぐれたフォーマットはいろいろあります。

MessagePackは速い。でも小さいかというと、lz4で上から圧縮するとJSONとサイズがほとんど変わらない。しかもプレーンテキストでなくてスキーマもないという点で、リポジトリに入れたり、長期間保存するデータには向かないかなぁと思っています。ストリームフォーマットで使ったり、ストレージに一時的にキャッシュする用途ぐらい。goの処理系がうまくできている( https://github.com/ugorji/go )ので、JSONである程度実装していて特別に速度が欲しいときに移行するというのは便利。RPCは使ったことないです。

YAMLはJSONと比べると少しはリポジトリ上のマージがしやすいというのはあるけど、まあ一部ですね。標準化されてなくて、処理系によってどこまでサポートされているのか分からんというのと、マップ、配列の書き方が2種類あって云々というのはマイナス。というかパーサ書くのツライ。1ラインで書ける表記を封印して、インデント固定、JSONと100%相互変換なYAML--な感じで、スキーマ、エディタ拡張、Chrome拡張でカラーリングみたいなツールがそろっているようなやつ、誰か作って。

iniは安定のフォーマットですね。シリアライズ用途ではなく、手でコンピュータにデータをインプットするにはまだまだ使えます。Pythonとか標準でサポートしてますしね。コメントも書けるし、ブロックも持てるので可読性高いです。まあストリームで使うとか、シリアライズで使うことはないですね。

Protocol Buffersはバイナリではあるものの、スキーマがあってさまざまな言語のパーサがあって、HTTP/2でRPCできるgRPCができた今、保存用以外の用途はすべてこれにしたいランクno.1ですね。周辺ツールサポートが強い。gRPCがnode.jsだけじゃなくて、ブラウザのクライアントも出力できたら完璧だったのに！

ということで、僕の中の順位としては

1. JSON(オールマイティ)
2. Protocol Buffers(保存用途以外は今後はこれにしたい)
3. ini(設定ファイル用途では無難)
4. MessagePack(JSONの用途のごく一部で速度が欲しい時)
5. YAML(Unityで仕方なく)

Thriftはあまり使ったことないので省略。

あ、型情報持てる/スキーマがある/クエリーが得意という意味では、意外とSQLiteがシリアライズフォーマットとしては強いのかも、と思ったり。参照用途が多い場合は・・・ですが。
Laravelのrewriteあれこれ



###おしりの/処理

laravelでは、おしりに/があると、/がないURLにrewriteされる。それは、public直下の.htaccessによる。

```bash
RewriteRule ^(.*)/$ /$1 [L,R=301]
```

/$で、おしりが/で終わってたら、リクエスとされたディレクトリ/にrewriteされる。
$1には、()内のマッチしたものが入る。

###publicの処理

あるサーバで、実であれ仮想であれ、Document Rootをpublicに設定できる場合は何も問題はない。
ただ、public_html等に、Laravelフォルダを作らなければならない時もある。そんな時は、URLが、

>http://localhost/laravel/public

となる。せめて

>http://localhost/laravel

としたい。そんなときは、Laravelフォルダの直下に、.htaccessを作って、

```bash
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public
</IfModule>
```
などとする。
WEB見積書項目


## 制作開始前に必要な見積もり項目
- 企画・ディレクション費用
- 旧サーバからのデータ移管費用
- デザイン案

## 素材購入費用
- 素材のスキャン・トレース
- 有料システム、プログラム、ライセンス購入費用
- システム設置費用
- 携帯・スマートフォン対応費用
- サーバ関連費用

## 納品後に必要になるかもしれない見積もり項目
- 仕様書作成費用
- マニュアル作成費用
- テスト・動作確認費用
- 操作説明・レクチャー費用
- 各種更新費用
- メールアドレス取得・設定費用
- サーバ保守費用
- サポート費用

## その他見積もり前に決めておきたいこと
- 対応ブラウザ
- アクセシビリティ
- 想定アクセス数
- 納品方法
- 納品物
SafariのプライベートブラウジングでWebStorageが使用できない挙動と対処法

iOSとMacのSafariでプライベートブラウジング中に**localStorage**と**sessionStorage**を使うとエラーになってしまいます。（Windowsは確認してない）

```js:プライベートブラウジング中
sessionStorage.setItem("test", "test");
// Error: QuotaExceededError: DOM Exception 22
```

そして**window.sessionStorage**が**undefined**とならないためif文での分岐はできません。

```js:プライベートブラウジング中
!!(window.sessionStorage);
// true
```

しかしエラーが発生するのは**setItem**のときのみで、それぞれ**getItem**ではエラーになりません。データをセットできないので返り値は**null**です。

```js:プライベートブラウジング中
sessionStorage.getItem("test");
// null
```

## 対処法
**sessionStorage.setItem**を直接使用せずにデータセット用の関数を作ってしまう。

```js
function setSessionStorage(key, value) {
  if (!window.sessionStorage) return;
  try {
    sessionStorage.setItem(key, value);
  } catch (err) {
    console.error(err);
  }
}

function setLocalStorage(key, value) {
  if (!window.localStorage) return;
  try {
    localStorage.setItem(key, value);
  } catch (err) {
    console.error(err);
  }
}
```

こんな感じでtry-catchで囲んでエラーで処理が止まらないようにしました。
WebStorageを使うときは必ず**setSessionStorage()**、**setLocalStorage()**から呼び出します。


## ちなみに
ChromeのシークレットモードやFirefoxのプライベートブラウジングでは通常モードとはStorageが切り離されますがWebStorageは普通に使えます。
Safari・・・