OmniAICreator/Qiita-1.07M huggingface dataset:
postgresをアップグレードする（Ubuntuメイン）

# 背景
PostgreSQLは、9.4 からhstore やjson形式に対応したので、古いバージョンからUpgradeが必要になる場合もあり、自分のアップデートの経験をここで記しておきたい。

# 使える資料
https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d

基本はこれ一つをそのままやれば、なんとかなる。自分のUpgradeしたいバージョンに合わせて、適宜変える。しかし、やはり途中でエラーなどが出るものである。

# 環境

ubuntu 14.04
postgres 9.3 -> 9.5 

あれ？自分のバージョンは？という人は、

クライアントバージョン

```
psql --version
```

サーバーバージョン

```
pg=config --version 

```  

# Ubuntu

### とりあえず設定ファイルをコピー
（必要性はない気がする。まあ念のため）

```bash
sudo cp /etc/postgresql/9.3/main/postgresql.conf ~/
sudo cp /etc/postgresql/9.3/main/pg_hba.conf ~/ 
```

## Postgres9.5をインストール
updateして最新の状態にしてからインストール
（最後のpostgisはインストール失敗。なぜかよくわからない）


```bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install postgresql-9.5 postgresql-server-dev-9.5 postgresql-contrib-9.5
sudo apt-get install postgresql-9.5-postgis
```

##データをDump

### （Dump用のDirectoryを作成（必須ではない））
リンクでは、新しくDirectoryを作っているが、Sudo権限が必要になるので、場所は適宜自分で変更して良いので、これは飛ばしてもいい。

```bash
mkdir /mnt/dumps 
cd /mnt/dumps
```

### Dump

以下を実行しDumpする（この場合CurrentDirectoryにDumpされるので、どこにいるか確認する）
```bash
sudo /usr/lib/postgresql/9.5/bin/pg_dumpall > pre_upgrade_from_9.3_to_9.5.dump
```

（うまくいかない場合は、`sud su postgres` でpostgres User で実行するとできるかもしれないが、postgres がsudoerでない場合は、上のコマンドの`sudo`をつけない）

## （Configファイルでデータ保存場所の変更（必須ではない））

今回は変更せず。

##Postgresをストップ

postgresユーザに切り替えて、postgresユーザがsudoer でない場合は、Sudoerになってから以下を実行すると、今あるPostgreSQLがとまる。（僕の場合は9.3と9.5）

```
sudo /etc/init.d/postgresql stop
```

## Clusterを新しくして起動

```
sudo pg_dropcluster 9.5 main
sudo pg_createcluster 9.5 main
```

注意：Localeの設定ができてないとエラーが出る場合は、http://qiita.com/d6rkaiz/items/c32f2b4772e25b1ba3ba などを参考に、 `export=en_US.UTF-8`と`export LC_ALl=$LANG`などを実行してからpg_createclusterをすると大丈夫かも。

```
sudo /etc/init.d/postgresql start 9.5
```

## Dumpしたデータを取り込む

今の状態では、前のデータはないので、データを取り込む。
- ポート番号は、`/etc/postgresql/9.5/main`を確認する。Upgradeした場合は、5433に多分なっている。
- データは自分のDumpがおいてある場所を指定

```
sudo su postgres
psql -d postgres -p 5433 -f ~/pre_upgrade_from_9.3_to_9.5.dump
```


##最後にRestart（必要かどうかはわからないが。。）

```
sudo service postgresql restart 9.5
```

これで完了


##最後に
前のバージョンが要らなければ削除

```
sudo apt-get autoremove postgres-9.3
```


#Mac

以下にUninstallとInstallするのを貼った。

https://www.moncefbelyamani.com/how-to-upgrade-postgresql-with-homebrew/

残りは、DumpしてRestoreすれば大丈夫！
redigoがredis-cluster対応してない問題

# 概要
* goでredis操作する定番の[redigo](https://github.com/garyburd/redigo)がredis cluster対応されてないので、SET GETなど出来ない
* 一応PRは出てる。[https://github.com/garyburd/redigo/pull/170](https://github.com/garyburd/redigo/pull/170)
* [redis-go-cluster](https://github.com/chasex/redis-go-cluster)は対応してるっぽい

# 問題点
* [redis-go-cluster](https://github.com/chasex/redis-go-cluster)でもやってるように、複数Nodeの選択が出来ない
* Node選択が出来ないので、<br>`MOVED 1525 127.0.0.1:6379`（値が別のNodeに格納されてるよ！というエラー）が返ってくる

# 調査
* https://github.com/garyburd/redigo/pull/170 をブランチ切って実験
* ノード情報は下記の通り

|Node|IPとPort|
|:---|:---|
|Node1|127.0.0.1:6379|
|Node2|127.0.0.1:6380|
|Node3|127.0.0.1:6381|

## 通常メソッドでのSET GET

```go
package main

import (
	"fmt"
	"os"

	// https://github.com/garyburd/redigo/pull/170　分をbranch切ってる状態
	"github.com/garyburd/redigo/redis"
)

func main() {
	c, err := redis.Dial("tcp", "127.0.0.1:6380") // わかりやすいようにこのポートで

	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// Connection Close
	defer c.Close()

	// SET
	t, err := c.Do("SET", "hoge", "fuga")
	if err != nil {
		fmt.Println("SET_ERR", err)
	}
	fmt.Printf("SET: %#v\n", t)

	// GET
	s, err := redis.String(c.Do("GET", "hoge"))
	if err != nil {
		fmt.Println("GET_ERR", err)
	}
	fmt.Printf("GET: %#v\n", s)
}

// SET_ERR MOVED 1525 127.0.0.1:6379
// SET: "MOVED 1525 127.0.0.1:6379"
// GET_ERR MOVED 1525 127.0.0.1:6379
// GET: ""
```


## Cluster用メソッドを用いたのSET GET

```go
package main

import (
	"fmt"
	"os"

	// https://github.com/garyburd/redigo/pull/170　分をbranch切ってる状態
	"github.com/garyburd/redigo/redis"
)

func main() {
	c, err := redis.NewCluster("tcp", []string{"127.0.0.1:6379", "127.0.0.1:6380", "127.0.0.1:6381"})

	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// Connection Close
	defer c.Close()

	// SET
	t, err := c.Do("SET", "hoge", "fuga")
	if err != nil {
		fmt.Println("SET_ERR", err)
	}
	fmt.Printf("SET: %#v\n", t)

	// GET
	s, err := redis.String(c.Do("GET", "hoge"))
	if err != nil {
		fmt.Println("GET_ERR", err)
	}
	fmt.Printf("GET: %#v\n", s)
}

// SET: "OK"
// GET: "fuga"
```

# 最後に
* 早くmergeされて欲しい
* [https://github.com/garyburd/redigo/pull/170](https://github.com/garyburd/redigo/pull/170)　がmergeされたらこの記事は消します
Concourse CIをBinaryから構築した時にハマったこと2点


[ConcourseCI](http://concourse.ci/index.html)を[Binary](https://github.com/concourse/bin)で構築する際、以下2点でハマったことと対処方法のメモ

## 前提環境
ConcourseCI: v1.3.0
PostgreSQL: 9.3.13
guestOS: Ubuntu 4.2.0-38-generic
IaaS: OpenStack Kilo


## 1. Concourse Webの初回起動に失敗する

### 事象

[構築手順](http://concourse.ci/binaries.html)の
Starting the Web UI & Scheduler - Single node, local Postgres
でconcourse web起動時に以下エラーが返却されてmigrationに失敗する

```bash
{"error":"pq: password authentication failed for user \"ubuntu\"","session":"1"}}
```

### 対処方法

公式documentにPostgreSQLを設定する記述が不足している
この[Issue](https://github.com/concourse/concourse/issues/449)に記載されている通り

1. atc用databaseの作成
2. 起動ユーザのdatabase作成
3. 起動ユーザのpassword設定
4. concourse web の起動オプションに
```
--postgres-data-source postgres://[起動ユーザ]:[3で設定したパスワード]@127.0.0.1/atc
```
を追加する

を実施して無事起動できた

## 2. task内のdocker pullがtimeoutする

#### 事象

ConcourseCI起動後、Taskを実行した際timeoutエラーが発生
以下のようなtask.ymlを実行した際、Docker Imageのpullで応答無し -> timeout errorが発生

```yaml:task.yml
---
platform: linux
image_resource:
  type: docker-image
  source:
    repository: alpine
run:
  path: echo
  args: ["Hello", "World"]
```


#### 対処方法

OpenStack(kilo)が用意した[MTU値](https://specs.openstack.org/openstack/neutron-specs/specs/kilo/mtu-selection-and-advertisement.html)とConcourseCI(garden)のデフォルトMTU値(1500)が異なっていた為、IP fragmentationが発生してネットワークが遅延 -> timeout error

concourse worker[起動時のオプション](http://concourse.ci/binaries.html)に以下を追加する

```bash
--garden-mtu=[VMの外向けNICに振られているMTU]
```
[PHP]Blackfireを使ってプロファイリングしてみよう！

# Blackfire

![blackfire.png](https://qiita-image-store.s3.amazonaws.com/0/97615/a0d90592-1591-8273-e384-18a0b1cc1460.png)


[Blackfire](https://blackfire.io/)

- どのメソッドを通り、どれくらい時間がかかり、メモリはどの位消費している等をプロファイリングしてくれる素晴らしいサービス
- フリープラン・プレミアムプラン・エンタープライズプランと3種類ある
    - [Pricing](https://blackfire.io/pricing)
- フリープランでも十分なサービスを受けることができる

# さっそく使ってみる

## 試した環境

- Vagrant 1.7.4
- CentOS 6.7
- PHP 5.6.24

## アカウントの作成

[Sign up](https://blackfire.io/signup)

- 今回はGoogleアカウントで登録

## インストール

[Installation](https://blackfire.io/docs/up-and-running/installation#installation-instructions)

- 上記ページに遷移
- 環境別タブから「CentOS」を選択
- 手順に沿ってひたすらインストール
    - 基本的にコピー・インストールの繰り返しでOK
    - ドキュメントが丁寧なので迷わ無いはず

## プロファイリング

- インストールの工程が全て完了したらプロファイリングを行う
- コマンドラインかChrome拡張でプロファイリングが可能

と、ちょっとその前に、、、

## トラブルシューティング

- 1件ハマったところがあったので記載
- 全てのインストール完了したけれど、プロファイリングが上手くいかない。。。
- 現象は以下（コマンドラインの場合）

```console
$ blackfire curl [検証URL]
Are you authorized to profile this page? No probe response, missing PHP extension or invalid signature for relaying agent.
```

`ﾟ(∀) ﾟ ｴｯ?　ﾍ(ﾟдﾟ)ﾉ ﾅﾆｺﾚ?`

- 対処方法としてはインストール後に `httpd` の再起動も必要（たぶん、、、）

```console
$ sudo service httpd restart
```

- この後は問題なくプロファイリングできた！
- 成功すると以下のような感じ（コマンドライン版）

```console
$ blackfire curl [検証URL]
Profiling: [########################################] 10/10
Blackfire cURL completed
Graph URL https://blackfire.io/profiles/[key]/graph
No tests! Create some now https://blackfire.io/docs/cookbooks/tests
No recommendations

Wall Time     324ms
CPU Time      223ms
I/O Time      101ms
Memory       5.27MB
Network         n/a     n/a       -
SQL             n/a       -
```

## 気を取り直してプロファイリング

### コマンドラインでプロファイリング

- もうやったので割愛

### Chrome拡張でプロファイリング

#### インストール

[Chrome extension](https://blackfire.io/docs/integrations/chrome)

- 上記ページへ遷移
- `install the Companion` ボタンを押下して拡張をインストール

#### プロファイリング

- プロファイリングしたいページヘ遷移
    - Blackfireをインストールした環境のページ
- Chrome拡張を選んで `Profile` ボタンをクリック
    - ![backfire-chrome-extension.png](https://qiita-image-store.s3.amazonaws.com/0/97615/f723ef72-d81b-9a96-db69-954e224e9e83.png)
- プロファイリング中
    - ![blackfire-processing.png](https://qiita-image-store.s3.amazonaws.com/0/97615/d8173251-20ae-d9d4-bde3-8afa22390f96.png)
- できた！
    - ![blackfire-complete.png](https://qiita-image-store.s3.amazonaws.com/0/97615/d891186b-14fd-33dc-314b-376174fb3c23.png)

## プロファイリング結果を見る

[Profiles](https://blackfire.io/dashboard/mine/profiles)

- 上記ページへ遷移
- 取得したプロファイリングが一覧で表示されるはずなので、閲覧したプロファイリングを選択する
- なんや色々見られる！！
    - ※プロファイリング結果の見方は今回割愛させていただきます（＾ω＾）

## プロファイリング結果を見て得られるもの

まだまだ使い始めたばかりなので何がなんやら状態ですが、
以下の情報からどこを最適化すればよいか分かるようになった

- 全体でどのくらい時間かかっているか分かる
- どこがボトルネックになっているか分かる
- メソッドが何回コールされているか分かる

以上、インストールからプロファイリングの取得・閲覧まででした。
solr json api ベンチ

solrの従来のリクエストとjsonapiのリクエストをsiedgeを使って比較してみた。

http://localhost:8983/solr/select?q=*:*&rows=100&wt=json
siege --concurrent=50 -t 10s test.url 
Transactions:                727 hits
Availability:             100.00 %
Elapsed time:               9.41 secs
Data transferred:        1152.53 MB
Response time:              0.62 secs
Transaction rate:          77.26 trans/sec
Throughput:           122.48 MB/sec
Concurrency:               48.26
Successful transactions:         727
Failed transactions:               0
Longest transaction:            1.07
Shortest transaction:           0.13
test.json
{
    query:"*:*",
    limit : 100
}
siege --concurrent=50 -t 10s --content-type="application/json" 'http://localhost:8983/solr/query  POST < ./test.json'
Transactions:                640 hits
Availability:             100.00 %
Elapsed time:               9.57 secs
Data transferred:        1324.77 MB
Response time:              0.23 secs
Transaction rate:          66.88 trans/sec
Throughput:           138.43 MB/sec
Concurrency:               15.28
Successful transactions:         640
Failed transactions:               0
Longest transaction:            0.51
  Shortest transaction:           0.06

jsonの方がスループットはいいんですがConcurrency同時接続が極端に低い
従来
Concurrency:               48.26
json api
Concurrency:               15.28
まだベータ版という感じ。
btrfs関連のリンクめも

* https://events.opensuse.org/conference/oSC16/program/proposal/982
* https://lwn.net/Articles/576276/
* https://jp.linux.com/news/linuxcom-exclusive/415181-lco20140331
* https://jp.linux.com/news/linuxcom-exclusive/415459-lco20140407
* https://wiki.archlinuxjp.org/index.php/Btrfs
* https://wiki.archlinuxjp.org/index.php/Snapper
* https://docs.oracle.com/cd/E39368_01/b71105/ol_btrfs.html
* http://manual.geeko.cpon.org/ja/cha.snapper.html
* https://launchpad.net/apt-btrfs-snapshot


その他
* https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Logical_Volume_Manager_Administration/LVM_overview.html
エスケープされたJSON文字列をrubyのワンライナーで雑にパースする方法

自分用メモ

```shell-session
# 普通のJSON文字列
echo '{"key1":"value1","key2":"value2"}' | ruby -r json -ne 'json = JSON.parse($_); puts json["key1"]' # => value1

# エスケープされてる場合
echo '"{\"key1\":\"value1\",\"key2\":\"value2\"}"' | ruby -r json -ne 'json = JSON.parse(eval($_)); puts json["key1"]' # => value1
```

ruby: 2.3.1
El CapitanとSierraでphpenv + php-buildのインストールに失敗する場合

ライブラリが足りなかったり、openssl仕様が最近変わったりしてるのに対応


```
$ git clone https://github.com/CHH/phpenv.git
$ ./phpenv/bin/phpenv-install.sh
$ git clone git://github.com/php-build/php-build.git $HOME/.phpenv/plugins/php-build
$ echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(phpenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ brew install openssl libxml2 autoconf automake libjpeg libpng libmcrypt
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)" PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install お好きなバージョン
```
pythonでのデータサイエンスのお供、pandasでの要素指定の仕方

# 背景
たまにはちゃんとコードを書く系の内容も。pandasでdataframeの指定をするところでいろいろと混乱してしまって無駄に時間がかかった。整理するがてらにまとめたいと思う。pandasビギナーがまとめたものなので、間違ってたりもっといいまとめがあるならばアドバイスくれればと思います。

運営しているブログはこちら：[努力1mm](http://www.doryoku-1mm.tech/)

それぞれのversionは以下のとおり。

```
pandas (0.18.1)
numpy (1.11.0)
Python 2.7.10
```

# ３つの要素指定の方法

pandasのDataFrameでの要素の指定の仕方は３つ。

- df[ a ]
- df.loc[ a, b ]
- df.iloc[a, b]

前提とするDataFrameは[10minites to pandas](http://pandas.pydata.org/pandas-docs/stable/10min.html)を参考に以下のコードで作成した。

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

できたDataFrameはこんな感じ。

```
                   A         B         C         D
2013-01-01 -0.682002  1.977886  0.348623  0.405755
2013-01-02  0.085698  2.067378 -0.356269  1.349520
2013-01-03  0.058207 -0.539280  0.023205  1.154293
2013-01-04 -0.319075  1.174168 -1.282305  0.359333
2013-01-05 -2.557677  0.922672  0.202042  0.171645
2013-01-06  1.039422  0.300340  0.701594 -0.229087
```

## df[ a ]型の指定方法

指定の仕方で行方向だったり、列方向だったりに処理ができるっぽい。

```
#単独のカラム（列）を指定
df[‘A’]  # カラム名 = A を指定
df.A     # 同上

#行方向のスライス：df[ 0:3 ]
df[0:3]                    # 0行目から3行目まで指定
df[‘20130102’:’20130104’]  # インデックスが2013-01-02~2013-01-04 までを指定
```

## インデックス・カラムのラベル名で指定する -> locメソッド

指定する引数（って呼んでいいのかな？）の１つ目がインデックスに対する操作、２つ目がカラムに対する操作。

```
# 該当するインデックスの取得
# A    0.469112
# B  -0.282863
# C   -1.509059
# D  -1.135632
# Name: 2013-01-01 00:00:00, dtype: float64
df.loc[dates[0]]

# インデックス・カラムを同時に指定する。
#                    A        B
# 2013-01-01  0.469112 -0.282863
# 2013-01-02  1.212112 -0.173215
# 2013-01-03 -0.861849 -2.104569
# 2013-01-04  0.721555 -0.706771
# 2013-01-05 -0.424972  0.567020
# 2013-01-06 -0.673690  0.113648
df.loc[:, [‘A’, ‘B’]]

# インデックスをインデックス名で取得する
#                    A        B
# 2013-01-02  1.212112 -0.173215
# 2013-01-03 -0.861849 -2.104569
# 2013-01-04  0.721555 -0.706771
df.loc[‘20130102’:’20130104’, [‘A’, ‘B’]]  # カラムを複数指定する時は、リストで渡す

# 一個だけ指定する場合は、loc よりも at を使ったほうが早い
#0.46911229990718628
df.at[dates[0],'A']
```

## インデックス・カラムの位置番号で指定する

行列に置き換えた時の要素の位置で指定する方法。これももちろん、複数選択できる。


```
# インデックスの位置で指定（今回は３行目）
# A    0.721555
# B  -0.706771
# C  -1.039575
# D    0.271860
# Name: 2013-01-04 00:00:00, dtype: float64
df.iloc[3]

# インデックス / カラム の同時指定(ここでは３〜４行、０〜１列目)
#                   A        B
#2013-01-04  0.721555 -0.706771
#2013-01-05 -0.424972  0.567020
df.iloc[3:5,0:2]

# とびとびの特定の要素を指定
#                    A        C
# 2013-01-02  1.212112  0.119209
# 2013-01-03 -0.861849 -0.494929
# 2013-01-05 -0.424972  0.276232

df.iloc[[1,2,4],[0,2]]

```


慣れるしかない！

運営しているブログはこちら：[努力1mm](http://www.doryoku-1mm.tech/)
MTBFとMTTR

**◆MTBF**・・・平均故障間隔。故障から復旧し、次に故障するまでの間隔。つまり故障していない期間。長ければ長いほど良い。

**◆MTTR**・・・平均修復時間。故障時、修復にかかる時間。短ければ短いほど良い。


**稼働率**　＝　MTBF  /  MTBF  +  MTTR


<br>

夫婦に例えると、
MTBFが喧嘩(故障)していない期間で、MTTRが喧嘩してから仲直り(復旧)するまでの時間。

色んな夫婦のMTBFとMTTRをヒアリングして、仲のよさ(稼働率)を算出して比較すると面白いかもしれませんね。
phpでmysqlとmemcachedの接続確認方法


## はじめに

みんな大好きPHPだけど、ミドルウェアの設定はちょっと面倒だ
設定はしたはずだけどちゃんと接続できているかどうか確認するのにちょっとしたスニペットを用意した

PHPとミドルウェアの設定が正しければ、以下のコードからPHPからMysqlとMemcachedにはアクセスを確認できる
動かなければ途中の設定で失敗していることとなる

phpinfo()と合わせて環境をチェックするのが良いだろう

**注意**
MemcachedのライブラリはMemcacheではなくMemcachedを利用しているので、Memcacheを利用する場合は適宜読み替えるように

## チェック用のファイルを作成し動作確認する

下記chack.phpをドキュメントルートに置いてブラウザでアクセスする

```check.php
<html>
  <body>
<?php

  // データベース接続チェック
  //　mysql_connectの引数にホスト名、接続ユーザ、パスワードの順に入れる
  $dbc = mysql_connect('mysql', 'root', 'password');
  if (!$dbc) {
    die('db connection failed<br/>'.mysql_error());
  }
  print('DB connect success!!<br/>');

  // databaseに選択チェック
  // your_databaseに接続するデータベース名を入れる
  $db_selected = mysql_select_db('your_database', $dbc);

  if (!$db_selected){
    die('db select failed<br/>'.mysql_error());
  }
  print('db select success!!<br/>');

  if (mysql_close($dbc)){
    print('disconnect success!!<br/>');
  }

  // memcached接続チェック
  $m = new Memcached();
  // addServerの引数にmemcachedのホスト名、ポート番号を入れる
  $m->addServer('memcached', 11211);

  $m->set('integer', 100);
  $m->set('string', 'string 1234');

  var_dump($m->get('integer'));
  print('<br/>');
  var_dump($m->get('string'));
?>
  </body>
</html>
```

成功すると以下の様なものが画面に表示される

```html
DB connect success!!
db select success!!
disconnect success!!
int(100) 
string(11) "string 1234"
```
git archive でリリースファイルをzipファイルでまとめる方法

# まるごとアーカイブ
現在のブランチの最終コミットのツリーを archive.zip というファイル名でアーカイブする場合です。

```bash:
git archive HEAD -o archive.zip
```

# 差分のみアーカイブ
HEADから1つ前のコミットの差分フィアルだけをアーカイブする場合です。2つ前や3つ前のコミットを指定したい場合は「HEAD~2」「HEAD~3」など。

```bash:
git archive HEAD `git diff --name-only HEAD HEAD~` -o archive.zip
```

■参考
http://rfs.jp/server/git/gite-lab/git-archive.html
特定の文字列を含む行を抽出してファイルに保存する

vimで20000行くらいあるファイルから、特定の文字列を含む行を抽出して、別ファイルに書き出したかった。
備忘録的として残しておきます。

```
e large_file.txt  #検索対象のファイル
let @a = ''       #バッファaを空にする
/foo              #対象となる文字列をサーチ
g//y A            #グローバルコマンドでマッチした行をヤンクしてバッファaに追記する
e output.txt      #出力先ファイル
put a             #バッファaをカレント行にPUTする
wq
```

hoge.vimとかで保存してsourceコマンドから叩く。

input/output/search_wordあたりを変数にしてvim Script化したいところですね。
ActiveAdmin 一般的設定

【これは http://activeadmin.info/docs/1-general-configuration.html を翻訳したものです。】
***

## ActiveAdmin 一般的設定
Active Admin の設定は `config/initializers/active_admin.rb` で行います。以下に共通設定をいくつか示します。

### 認証
アプリケーション内で Active Admin による認証と current user の使用を行うには2箇所設定しなければなりません。

- メソッド・コントローラを強制的認証に用います。

```ruby
config.authentication_method = :authenticate_admin_user!
```

- current user アクセス用のメソッドを用います。

```ruby
config.current_user_method = :current_admin_user
```

認証を無効にするにはこれらの設定を false に設定します。

```ruby
config.authentication_method = false
config.current_user_method   = false
```

### サイト・タイトル・オプション
すべてのページで、サイト・タイトルがメニュー・バーの左側に表示されます。カスタマイズするには以下のようにします。

```ruby
config.site_title       = "My Admin Site"
config.site_title_link  = "/"
config.site_title_image = "site_image.png"
config.site_title_image = "http://www.google.com/images/logos/google_logo_41.png"
```

### 国際化 (I18n)
翻訳ファイルを新規作成したり既存の翻訳ファイルを使うには、アプリケーションの `config/locales` フォルダに [config/locales/en.yml](https://github.com/activeadmin/activeadmin/blob/master/config/locales/en.yml) をコピーして編集します。我々は新しい/アップデートされた翻訳ファイルを歓迎するので、遠慮なく [参加](https://github.com/activeadmin/activeadmin/blob/master/CONTRIBUTING.md) してください！

### 名前空間
Active Admin のリソースは、名前空間内に登録されます。デフォルトの名前空間は「admin」です。

```ruby
# app/admin/posts.rb
ActiveAdmin.register Post do
  # ...
end
```

例えば Post リソースは「admin」名前空間に登録され、 `/admin/posts` でアクセスできます。設定は名前空間ごとに行うことができ、アプリケーションの設定を継承します。

例えば、2つの名前空間 (`:admin` と `:super_admin`) があり、それぞれに異なったサイト・タイトルを表示するには、 初期化ファイル内の個別の `config.namespace(name)` ブロックの内側で設定します。

```ruby
ActiveAdmin.setup do |config|
  config.site_title = "デフォルトのサイト・タイトル"

  config.namespace :admin do |admin|
    admin.site_title = "管理サイト"
  end

  config.namespace :super_admin do |super_admin|
    super_admin.site_title = "特権サイト"
  end
end
```

### ロード・パス
デフォルトでは Active Admin のファイルは `app/admin/` に置くようになっています。このディレクトリを変更するには、初期化ファイルで以下のように指定します。

```ruby
ActiveAdmin.setup do |config|
  config.load_paths = [File.join(Rails.root, "app", "ui")]
end
```

### コメント
デフォルトでは Active Admin の各リソースにはコメントが付きます。ときどきこれは不要になります。コメントを無効にするには以下のように指定します。

```ruby
# アプリケーション全体で不要の場合
ActiveAdmin.setup do |config|
  config.allow_comments = false
end

# 名前空間ごとに指定する場合
ActiveAdmin.setup do |config|
  config.namespace :admin do |admin|
    admin.allow_comments = false
  end
end

# リソースごとに指定する場合
ActiveAdmin.register Post do
  config.comments = false
end
```

### ユーティリティ・ナビゲーション
「ユーティリティ・ナビゲーション」は通常右上にあり、current user とログアウトへのリンクが表示されます。ユーティリティ・ナビゲーションは大抵の他のメニューシステムに似ていますが、独自にレンダリングすることもできます。

```ruby
ActiveAdmin.setup do |config|
  config.namespace :admin do |admin|
    admin.build_menu :utility_navigation do |menu|
      menu.add label: "ActiveAdmin.info", url: "http://www.activeadmin.info",
                                          html_options: { target: :blank }
      admin.add_current_user_to_menu  menu
      admin.add_logout_button_to_menu menu
    end
  end
end
```
AVPlayerItem(AVPlayerItemPlayability)

AVPlayerItem(AVPlayerItemPlayability)についてまとめました。

# loadedTimeRanges
すでに再生可能になっている時間を取得、CMTimeRangeの配列。
CMTimeRangeについては[「CMTimeについて」](http://qiita.com/KatagiriSo/items/4adb6960d774a84bcda9)参照

```objc:AVPlayerItem.m
@property (nonatomic, readonly) NSArray<NSValue *> *loadedTimeRanges;
```

# playbackLikelyToKeepUp
* 再生がstallに陥らないで可能であるならばYESがかえる。
* この判断はI/O のスループットやメデイアのデコードのパフォーマンスを考慮して決まっている。
* playbackBufferFullがYESであってもisPlaybackLikelyToKeepUpがNOの可能性がある。
 これはバッファは容量に達しているが再生が追いつかないという統計的データが得られないときにおきる。
* アプリプログラマには再生を続けるかどうかの判断を任される。

```objc:AVPlayerItem.m
@property (nonatomic, readonly, getter=isPlaybackLikelyToKeepUp) BOOL playbackLikelyToKeepUp;
```

# playbackBufferFull
バッファが容量に達し、さらなるI/Oが停止されている場合、YESがかえる。
この値がYESでもplaybackLikelyToKeepUpがNOである場合がある。(playbackLikelyToKeepUp参照)

```objc:AVPlayerItem.m
@property (nonatomic, readonly, getter=isPlaybackBufferFull) BOOL playbackBufferFull;
```

# playbackBufferEmpty
再生がすべてのバッファを食いつぶし、近くにstallか終了することを示す。

```objc:AVPlayerItem.m
@property (nonatomic, readonly, getter=isPlaybackBufferEmpty) BOOL playbackBufferEmpty;
```

# canUseNetworkResourcesForLiveStreamingWhilePaused
* 一時停止中の間に、プレイヤーアイテムが再生状態を維持するためにネットワークを使用できるかを示す。
* ライブストーリーミングコンテンツではプレイヤーアイテムは一時停止中に再生状態を保つに余分にネットワークを使用し電力を消費する必要がある場合がある。
* 例えばこの値をYESにすると、seekableTimeRangesが周期的に現在のライブストリームを反映して周期的に更新される。
* デフォルトはNO。
* 電力消費を抑えるため、一時停止中の再生状態の維持が必要でないのならこの値をYESにするのは避けること。 

```objc:AVPlayerItem.m
@property (nonatomic, assign) BOOL canUseNetworkResourcesForLiveStreamingWhilePaused NS_AVAILABLE(10_11, 9_0);
```
MySQLとPostgresのデータ型対応表

よく使うものを中心に。

:dolphin:  MySQL | :elephant: Postgres  | 容量
:-------:|:--------:|----
TINYINT | - | :dolphin: 1B
SMALLINT | SMALLINT  | 2B
INT | INT  | 4B
BIGINT | BIGINT  | 8B
FLOAT | NUMERIC | 4B
DATE | DATE | :dolphin: 1000-01-01〜9999-12-31<br>:elephant: 4713-01-01 BC〜:9999-12-31
DATETIME | - | 1000-01-01 00:00:00〜9999-12-31 23:59:59
TIME | TIME | 00:00:00〜23:59:59
TIMESTAMP| TIMESTAMP | :dolphin: 1970-01-01 00:00:01〜2038-01-19 03:14:07<br>:elephant: 4713-01-01 00:00:00 BC〜9999-12-31 00:00:00
CHAR | CHAR | :dolphin: 255B<br>:elephant: 1GB
VARCHAR | VARCHAR | :dolphin: 65KB<br>:elephant: 1GB
TINYTEXT | - | :dolphin: 255B
TEXT | TEXT | :dolphin: 65KB<br>:elephant: 1GB
MEDIUMTEXT | - | :dolphin: 16MB
LONGTEXT | - | :dolphin: 4GB
RecyclerViewをSwipeRefreshLayoutでpull-to-refresh

RecyclerViewをGroupViewで囲ったらいけました。くるくる。

# レイアウト（NG例）

```xml:layout
...中略
<android.support.v4.widget.SwipeRefreshLayout>
  <RecyclerView />
</android.support.v4.widget.SwipeRefreshLayout>
```

# レイアウト（OK例）

```xml:layout
...中略
<android.support.v4.widget.SwipeRefreshLayout>
  <FrameLayout>
    <RecyclerView />
  </FrameLayout>
</android.support.v4.widget.SwipeRefreshLayout>
```
KibanaをCentOSにインストールする

# Elasticsearch
## リポジトリーの追加
```ini
cat << _EOF_ > /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
_EOF_
```
## インストール
```bash
yum install elasticsearch java
```
## 自動起動設定
```bash
systemctl enable elasticsearch
```
## 設定
```bash
sed -i 's/# network.host: 192.168.0.1/network.host: localhost/' /etc/elasticsearch/elasticsearch.yml
```
## 起動
```bash
systemctl daemon-reload
systemctl start elasticsearch
```

# Kibana
## リポジトリーの追加
```ini
cat << _EOF_ > /etc/yum.repos.d/kibana.repo
[kibana-4.5]
name=Kibana repository for 4.5.x packages
baseurl=http://packages.elastic.co/kibana/4.5/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
_EOF_
```
## インストール
```bash
yum install kibana
```
## 自動起動設定
```bash
systemctl enable kibana
```
## 設定
```bash
sed -i 's/# server.host: "0.0.0.0"/server.host: "localhost"/' /opt/kibana/config/kibana.yml
```
## 起動
```bash
systemctl start kibana
```
QPDFを用いたPDF便利操作集

QPDFの入手先
[QPDF: A Content-Preserving PDF Transformation System](http://qpdf.sourceforge.net/)
Win32Texには最初から入っているので，コマンドプロンプトで`qpdf --version`と入力して実行できることを確認する．

### 閲覧可能だが編集＋印刷不可のPDFからパスワード削除したPDFを生成

閲覧パスワードなしの場合
`qpdf --decrypt input.pdf output.pdf`

閲覧パスワードありの場合
`qpdf --decrypt input.pdf --password=PASSWORD  output.pdf`

### Web表示用に最適化
`qpdf --linearize input.pdf output.pdf`

### 参考
[Qpdf : コマンドラインのPDFツール | PDF](http://pdf-file.nnn2.com/?p=865)
d-iのディスクパーティショニングはどうなのか、とか

* d-i で ext3が出てたような気がするんだけども、[もう不要](https://kernelnewbies.org/Linux_4.3)なのではないだろうか。
    * げげ、ext2まであるぞ。JFSとか誰が使う形になるのか（これはあっても良いのかもしれんが）。FAt16/32をインストーラーで使う？
![VirtualBox_debian_22_08_2016_22_18_42.png](https://qiita-image-store.s3.amazonaws.com/0/33063/f169cc91-723a-e2fc-babe-3d279c938373.png)

   ```
#
# File systems
#
CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_EXT2_FS is not set
# CONFIG_EXT3_FS is not set
CONFIG_EXT4_FS=m
CONFIG_EXT4_USE_FOR_EXT23=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ENCRYPTION=m
CONFIG_EXT4_FS_ENCRYPTION=y
```

 configファイル見ると、すでにカーネルにはext4しかカーネルモジュールは無いのか。

* ext4選んだ際に5%も予備領域をとられるのは現代のディスクでは大きすぎないか。しかもオプション無いぞ。6TBディスク買ったら300Gぐらい使われるってこと？なんのためにやねん。

```
       -m reserved-blocks-percentage
```
　syslogのため、ってそれで5%も取ってたら2010年代にはマズイと思う。パーセンテージじゃなくて、サイズから決めたほうが良さそう。パーセンテージしか指定方法がないなら、それで計算して実施、とか。


* そもそもext4をデフォルトで選ぶ理由はある？xfsの方がRed Hatによってメンテされてたりしないだろうか。（upstreamに取り込まれている、という前提で）
* btrfsを選んだ時のオプションは最適だろうか
![VirtualBox_debian_22_08_2016_22_19_59.png](https://qiita-image-store.s3.amazonaws.com/0/33063/685cd0f3-da49-2b94-42be-22c30cba2fd7.png)
* SSDの際のマウントオプションなどは無いか。
  * 参考：https://wiki.archlinuxjp.org/index.php/%E3%82%BD%E3%83%AA%E3%83%83%E3%83%89%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96
  * https://wiki.debian.org/SSDOptimization
  * https://btrfs.wiki.kernel.org/index.php/Mount_options
  * https://wiki.gentoo.org/wiki/SSD
CentOS7でNginexが動かない時はfirewalldを疑え！

ブラウザからの応答が拒否されているのに、AWSのfirewallは80ポートを通している・・・
nginxのプロセスを何度切っても、間違っていれたhttpdをkillしても、よみがえるnginxのpid。
「このリビングデットプロセスめっ！」

と吐き捨てた。
怒り心頭だったが、私はそっと賢者に確認した。

「iptablesは大丈夫か？」
と質問が返ってきた。

（iptablesは使っていないはずだ・・・）

そして、賢者に私は確認した。
「神は無慈悲なのか？」
賢者はこう答えた。
「アナタは神に逆らっている」
firewalldなるものがあった。

謎が謎を呼ぶ展開だったが、答えは簡単だった。
”インスタンス”が止めていたのだ。
ならばどうしろと？

```
$ systemctl status firewalld
```

私は、神との対話を古代語を使い行った。
その結果が空から降り注いできた。大気は渦巻き、嵐が我々の住居を脅かしている。
強大な風がそのうねりからか、禍々しい声を言い放っていた。
人々は恐怖しながらも道無き道を歩き、今日も生きているのだ。

```
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 月 2016-08-22 06:03:27 UTC; 2s ago
 Main PID: 11989 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─11989 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 8月 22 06:03:27 ip-172-31-20-206 systemd[1]: Starting firewalld - dynamic firewal....
 8月 22 06:03:27 ip-172-31-20-206 systemd[1]: Started firewalld - dynamic firewall....
Hint: Some lines were ellipsized, use -l to show in full.
```

神は無慈悲だ。私は神と対話した。


```
$ systemctl stop firewalld
```

神は私の願いを聞き届けた。

```
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 月 2016-08-22 06:05:16 UTC; 1s ago
  Process: 11989 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 11989 (code=exited, status=0/SUCCESS)

 8月 22 06:03:27 ip-172-31-20-206 systemd[1]: Starting firewalld - dynamic firewal....
 8月 22 06:03:27 ip-172-31-20-206 systemd[1]: Started firewalld - dynamic firewall....
 8月 22 06:05:16 ip-172-31-20-206 systemd[1]: Stopping firewalld - dynamic firewal....
 8月 22 06:05:16 ip-172-31-20-206 systemd[1]: Stopped firewalld - dynamic firewall....
Hint: Some lines were ellipsized, use -l to show in full.
```

```Active: inactive(dead)```

神は死んだのだ。神が防いでいた、防壁を私はたやすく登ることが出来た。

```
listen:80
```

それが扉を開く合言葉だ。

扉は開いた。
Web地図サービス (Mapbox, MapQuest)のイロハと静的地図画像のこと

（備忘録としてのメモ）
#Web地図サービスのAPIの選択の難しい所と、その選び方
##地図ってお高いんですよ？
まず一番最初に思い浮かべるのは、「**Google Maps**」
日本国内のもので言えば、「**Yahoo! Open Local Platform (YOLP)**」
「**いつもNAVI API**」や、「**MapFan API**」など、 
いくつか有償も含めて有名なものが挙げられます。

これらには、「**Google Maps**」を筆頭に多くの条件(利用規約)を満たす必要性があり、
個人でこれらの地図サービスを利用するのと、ソフトウェアに組み込んだり、地図を配布したりするのとは、
別ものという理解が必要です。

##利用しやすいWeb地図サービスって？
Web地図サービスの中で、比較的利用条件が軽い**OpenStreetMap**関連の
ものをいくつか紹介します
（もちろん、完全自由・無料ではありませんが...）

#OpenStreetMapとは？
そもそも、「**OpenStreetMap**」とは...?という話ですが、
OpenStreetMap Japanのページに概要が載っています
>OpenStreetMap(OSM)は、道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクトです。
誰でも自由に参加して、誰でも自由に編集でき、誰でも自由に利用する事が出来ます。
OpenStreetMap(OSM)は、道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクトです。誰でも自由に参加して、誰でも自由に編集でき、誰でも自由に利用する事が出来ます。本サイトは、日本語での情報提供や相互互助の支援を行っています。 編集は、[本家サイトOSM.org](https://www.openstreetmap.org/)で行うことができます。

引用 - [OpenStreetMap Japan](https://openstreetmap.jp/)

この、OpenStreetMapにて公開されているフリー（[Open Database License](http://opendatacommons.org/licenses/odbl/1.0/)）の地理情報データを利用した
Web地図サービス & マッシュアップを行っているのが下記のようなサービスになります

- [Mapbox](https://www.mapbox.com/)
- [MapQuest](https://www.mapquest.com/)

#Mapbox
##Mapboxとは？
>Mapbox is a mapping platform for developers
Our building blocks make it easy to integrate location into any mobile or online application. We want to change the way people move around cities and understand our planet.

引用 - [Mapbox -TopPage-](https://www.mapbox.com/)

Mapboxは、Google mapsのように、自前のユーザー向けウェブサービスを展開せず、
開発者向けのプラットフォームをサービスしています。

##できること。
リアルタイムレンダリングする仕組みや、
地図デザイン（色や文字サイズ、道のサイズなど）を自由に設定が可能な仕組み（Mapbox Studio）、
GIS解析など、
地図表示以外にも、多くの機能を持っています。
詳しくは下記リンク参照。
[Products | Mapbox](https://www.mapbox.com/products/)

##開発利用方法・手段
Webブラウザ向けのJavascriptや、iOS, Android向けのSDKが用意されています。
また、REST APIsとして、ルート検索やジオコーディング、静止画像取得などもできます。
詳しくは下記リンク参照。
[Developers | Mapbox](https://www.mapbox.com/developers/)

##料金
0円プラン、有償プランもあります。
アクセス数など、開発者ページログイン後に見ることができるので、
自前で数える必要はありません。
詳しくは下記リンク参照。
[Pricing | Mapbox](https://www.mapbox.com/pricing/)

#MapQuest
##MapQuestとは？
AOLがサービスしている地図サービスです。
自前でもサービスを行っており、スマートフォン向けアプリなどもサービス展開しています。
[Official MapQuest - Maps, Driving Directions, Live Traffic](https://www.mapquest.com/)

##できること。
Mobile firstの記述があり、最適化・特化しています。
>We're a mobile-first company and we know we're not alone. Our native mobile, mobile web, and standalone web services are a core part of hundreds of location-enabled mobile experiences.

引用 - [Official MapQuest - Maps, Driving Directions, Live Traffic](https://www.mapquest.com/)

##開発利用方法・手段
Mapboxと同様に、
Webブラウザ向けのJavascriptや、iOS, Android向けのSDKが用意されています。
また、REST APIsとして、ルート検索やジオコーディング、静止画像取得などもできます。
詳しくは下記リンク参照。
[Documentation](https://developer.mapquest.com/documentation)

##料金
0円プラン、有償プランもあります。
料金設定方法が、Mapboxと異なりますので、
アクセス数などによっては、こちらを選択するのもいいかもしれません。
[Pricing and Plans](https://developer.mapquest.com/plans)

#まとめ
２つのWeb地図サービスを紹介しました。
Mapboxは多機能なので、継続的に多くの機能を追加しながら
サービスを利用するのに適しているかもしれません。

どちらにしても、OpenStreetMapがデータ元になっているので、
地方都市や山間部などの多くのデータがない場所にて
求める地図レベルを超えているかの確認は必要です。
Android Autoアプリでデベロッパーモードにする


https://developer.android.com/training/auto/testing/index.html
ここに書いてあったんですが、見落としていてかなり迷ってしまいました。

> On the mobile device, enable Android Auto developer mode by starting the Android Auto companion app, and then tapping the Android Auto toolbar title 10 times. This step is only required the first time you run the companion app.

やりたかったのは[Android Auto](https://play.google.com/store/apps/details?id=com.google.android.projection.gearhead&hl=ja)で、開発者用のメニューを出すことです。

出したかったのはこんな感じのメニュー。初期状態だと「ヘルプとフィードバック」しか出してません。

![20160822_030212.png](https://qiita-image-store.s3.amazonaws.com/0/6061/3b6abc82-543f-efe7-debe-824789cd4ec8.png "20160822_030212.png")

結論から言うと、これを出すためにはアプリのタイトル部分を10回押す必要がありました。。。
説明を見落とすとツラいやつですね。。

![20160822_030159.png](https://qiita-image-store.s3.amazonaws.com/0/6061/ef47f09a-2168-0b55-a8ca-fe729a951231.png "20160822_030159.png")
Loggly(Syslogger)を使っているとActiveJobでエラーする件

## はじめに

### Loggly

本番環境で複数のサーバーを使っているので、ログを見やすくするためにlogglyを使っていた。

Loggly https://www.loggly.com/

railsでlogglyを使う場合の手順として、公式ドキュメントが用意されていたのでこの通りにconfigを書いていた。
=> https://www.loggly.com/docs/rails-logs/

### ActiveJob

ActiveJobを使うと非同期の処理が行えるようになる。
ただし、ActiveJobは数多ある非同期ライブラリのインターフェースを統一するものなので、内部ではsidekiqやdelayed_job等を開発者が自由に選択し設定する。

## 問題

ActiveJobを使っていると、自動的にキューに登録された時や、ジョブが実行された時になどにログを出力してくれるようになる。
だがここで `current_tags` というメソッドを呼んでいるが、Sysloggerにはそれが実装されていないのでエラーしてしまう。

`syslogger activejob error current_tags` 等でググるとこのissueが見つかった
=> https://github.com/rails/rails/issues/19439

何やらもめている（？）ようで、パッチを送っているがまだマージされていない。
というかそもそもこのパッチで直るのかどうかも知らんけど。

## 解決方法

rails側ではなくsyslogger側から探してみたらまさにピッタリのissueを発見
=> https://github.com/crohr/syslogger/issues/29

結局のところLogglyのドキュメント通りにではなく、SysloggerをActiveSupport::TaggedLogging.newでラップしてあげればいいみたい。

```diff
- config.logger = Syslogger.new("rails-application",Syslog::LOG_PID, Syslog::LOG_LOCAL7)
+ config.logger = ActiveSupport::TaggedLogging.new(Syslogger.new("rails-application", Syslog::LOG_PID, Syslog::LOG_LOCAL7))
```

## まとめ

基本logglyなんて本番でしか動かさないし、まさかloggerとActiveJobの組み合わせでエラーするとか、かなり渋い
storyboardで「Must translate autoresizing mask into constraints to have _setHostsLayoutEngine:YES.」というエラーがでた場合

分担してデザイナーと**storyboard**を触っていて、よく競合がおきるので、
毎回手動で修正しているのですが、下記エラーにあってハマってしまったのでメモ

```
Must translate autoresizing mask into constraints to have _setHostsLayoutEngine:YES.
```

というエラー。

色んな原因で起きる見たいなのですが、僕の場合は、storyboardを２画面で比較しながら作業分を調整して言っているですが、コピーもとのConstransがdisables状態でも残っているとこのエラーがアプリが落ちてしまっておりました。

下記のような感じ

![スクリーンショット 2016-08-22 14.14.24.png](https://qiita-image-store.s3.amazonaws.com/0/37406/e0e930e9-99d4-9e80-7ce5-31aa83c3b367.png)

このConstrainsを削除したら無事動きました。

同じエラーでも別の原因の方もいるようなので、
下記も参考にしてみてはいかがでしょうか。。？


TableViewCellがContentViewより親になってしまっている場合。
http://qiita.com/kaktaam/items/1c07f6bf003cee77cc31
git


下記の手順でgithubにコードををアップする（上から順に行う）
## git init
対象ファイルの階層でgit initを行う。Gitを使えるように変換する。

## git add　`ファイル・ディレクトリ名`
ファイルをローカルに保存する準備

## git commit -m `コメント`
ローカルにコミットする。

## git status
上手く、ローカルに登録されているか確認。

## git remote add origin `URL名`
githubの保存する場所を指定してあげる

## git push origin master
ここでgithubの「code」に入る
私が考えるPythonのプロジェクトテンプレート。

　ここでは私が考えるPythonのプロジェクトテンプレートを紹介します。実際にチームを組んでプロジェクト開発を行ったことがないので、**現場を知りません。**ご指摘があれば是非ともお教えください。
##ディレクトリ構成
まずはディレクトリの構成です。Pythonでimportする際の名前がmodulenameになります。buildやvenvは用意する必要がありませんが、buildはsetup.pyの利用を、venvはvirtualenvの利用を促す意味で作成しています。これらはREADME.mdに書いてもいいかもしれません。

```text:Direcotry
Project\
    modulename\
        hoge.py
    build\
    test\
        test_hoge.py
    docs\
    venv\
    requirements.txt
    setup.py
    LICENCSE
    README.md
    MANIFEST.in
```

###requirements.txt
開発環境をrequirements.txtに書き出しましょう。

```
pip3 freeze > requirements.txt
# install : pip3 install -r requirements.txt
```

###setup.py
```python:setup.py
#!/usr/bin/env python3
# coding:utf-8

from setuptools import setup

setup(name='Hoge_Project',
      version='0.0.1',
      description='Python Hoge_Project.',
      author='spam',
      author_email='hoge@spam.com',
      url='http://hoge.com',
      packages=['modulename'],
      #install_requires=['hoge','spam','hoge_spam'],
    )
```

## 追記：2016/08/23
### MANIFEST.in
hatchineeさんにご指摘をいただいたので、追加させていただきます。パッケージ化する際にsetup.pyを使うと、デフォルトではpythonのソースファイル以外が追加されません。そのためパッケージ化する際に、python以外のファイルは明示的指定する必要があります。

```bash
#パッケージ化
python setup.py sdist   
#or 
python setup.py bdist_wheel
```

```python:MANIFEST.in
include MANIFEST.in                                                                                                                
include *.txt                                                                                                                      
# Top-level                                                                                                                        
include setup.py README.md LICENCSE                                                                                                                 
# All-source file                                                                                                                  
recursive-include modulename *                                                                                                     
# All documentation                                                                                                                
recursive-include docs *
# Exclude what we don't want to include
global-exclude *.pyc *~ *.bak *.swp *.pyo
```
- [Pythonのパッケージ化ついて](http://docs.python.jp/3/distutils/sourcedist.html?highlight=manifest)

簡単ですが、これでおしまいです。
シェルスクリプトの条件式の評価 [[]] とtestコマンド []


bashにおけるtestコマンド`[]`と条件式の評価`[[]]`の違いが分かりにくかったので、備忘録としてまとめました。

## testコマンド []
* if文やwhile文での条件判断に使用される
* 文字列の比較、数値の比較、ファイルの存在や属性のチェックといった条件判断に使用される
* シェルの組込みコマンドとして実装されている

### 使い方
* `test`でも`[`でも起動できる
	* `[`で起動した場合は最後の引数を`]`にする
* 各引数はスペースで区切る
* 文字列の比較は`==`ではなく`=`
* 演算子の`< >`や`( )`を使用するには`\`を頭に付ける

## 条件式の評価 [[]]
* 条件式を評価し、その結果によって終了ステータスを返す
* testコマンドの`[]`と似ているが、いくつか異なる部分がある
* シェルの文法上で直接条件式を解釈する

### testコマンドとの違い

|項目|testコマンド|`[[]]`|
|:--|:--|:--|
|AND条件|`条件式1` -a `条件式2`|`条件式1` && `条件式2`|
|OR条件|`条件式1` -o `条件式2`|`条件式1` \|\| `条件式2`|
|ワード分割|変数展開後にワード分割される|ワード分割されない|
|パス名展開|される|されない|
|文字列の比較演算子 == の動作|`文字列1` == `文字列2`|`文字列` == `パターン` (パターンマッチとなり、*, ?, [a-Z]などのパターンで文字列の判定を行える)|

## どちらを使用すべきか
どちらを使用すべきかは状況によりそうです。
個人的には以下のように判断していますが、使い分けの基準がございましたら教えてください。

* `[[`がある bash, ksh, zsh だけならば、testコマンドの`[`はハマりどころが多いため、`[[`を使用したほうが安全
* 移植性を考慮するなら、testコマンドの`[`を使用したほうがいい

## 参考
* [test \[と \[\[コマンドの違い ](https://fumiyas.github.io/2013/12/15/test.sh-advent-calendar.html)
ios10beta6以降Xcode error “Unable to read from device”となる

https://www.jailbreakiosiphone.com/xcode-error-unable-to-read-from-device/
https://forums.developer.apple.com/message/170829
http://stackoverflow.com/questions/38963815/xcode8-0-beta-6-unable-to-read-from-device

こまったわー
anyenvのndenvを使ってnode.jsのバージョンを管理する

## anyenvとは
anyenvは複数バージョンをインストールできる **env 系まとめて管理出来る環境管理ツール。
GitHub : [riywo/anyenv](https://github.com/riywo/anyenv)

### インストール
Githubからcloneする。

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
```

###PATH設定
```
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l //シェルを再起動するコマンド
```
```~/.your_profile``` の箇所は、利用しているシェルを指定。
私の場合は、 zshrcを使ってるので ```~/.zshrc``` 

こちらでanyenvのインストールは完了。

## **envのインストール
ruby、perl、python、php、node.js、など**envからインストールできる。

```
$ anyenv install rbenv
$ anyenv install plenv
$ anyenv install pyenv
$ anyenv install phpenv
$ anyenv install ndenv

etc....
```

### ndenvをインストール

```
$ anyenv install ndenv
```

インストールが無事完了すると、下記のように表示される。

```
$ anyenv version
ndenv: system (set by /Users/USERNAME/.anyenv/envs/ndenv/version)
```

### インストール可能なバージョンの確認

```
$ ndenv install -l
```

下記のようにインストール可能なバージョン一覧が表示される。

```
  v0.11.13
  v0.11.14
  v0.11.15
  v0.11.16
  v0.12.0
  v0.12.1
  v0.12.2
  v0.12.3
  v0.12.4
  v0.12.5
  v0.12.6
  v0.12.7
  v0.12.8
  v0.12.9
  v0.12.10
  v0.12.11

etc....
```

### 必要なバージョンをインストール
今回は、v0.12.7をインストールする。

```
$ ndenv install v0.12.7
```

### インストールされてるかの確認
```
ndenv versions
```

下記のように、インストール済みのバージョン一覧が確認できる。

```
$ ndenv versions
  system
  v0.12.0
  v0.12.4
  v0.12.7
* v4.1.1 system (set by /Users/USERNAME/.anyenv/envs/ndenv/version)
  v4.4.5
  v5.2.0
```

### インストールしたバージョンに切り替える

PC全体でバージョンを指定したい場合は、 ```global``` を指定。

```
$ ndenv global v0.12.7
```
今いる位置のローカルで指定したい場合は、 ```local``` を指定。

```
$ ndenv local v0.12.7
```

私は、プロジェクトごとにnodeのバージョンが違うので、 ```local``` で指定している。


### 切り替わったか確認

```
$ node -v
```

指定したバージョンに切り替わっていれば完了。

```
v0.12.7
```

### 切り替わらない時の対処法

```
$ ndenv rehash
```

## 参考
GitHub : [riywo/anyenv](https://github.com/riywo/anyenv)
NSUserDefaultsの保存場所


NSUserDefaultsの内容を確認したり、編集する方法（iOSシミュレータ）
　
Xcode 7.3.1
iOS Simulator 9.3

## 保存場所の検索
下記に各シミュレータに対応したディレクトリ（デバイスID）がある。

```
$ cd ~/Library/Developer/CoreSimulator/Devices/
$ ls -l1
039E5240-A268-46B6-A4BD-B226E352A731 ←シミュレータのデバイスID
0BAF5EF0-FF55-4BA5-9ADB-E44580532411
147CCBBC-ABAD-456B-80CF-EE84BA8FDA9F
148DFF59-914D-4995-8242-F44D36BF4723
189DDEDD-9298-418C-9EFF-B71BF7C4DDFC
191DF5A9-59A3-44E4-9058-F2782061D224
・
・
（省略）
```

デバイスIDは、Xcodeのメニューから[Window]→[Devices]で、シミュレータのidentifierから確認できる。

![Devices.png](https://qiita-image-store.s3.amazonaws.com/0/49022/6585f9f4-2fb1-b78c-5164-36ad67a8a8b8.png "Devices.png")

デバイスに対応したディレクトリが特定できたら、さらに`<アプリのBundle Identifier>.plist`で検索する。

```
$ cd DC7975C3-AD13-4EDC-92E3-F347E8E16B24/
$ find ./ -name <アプリのBundle Identifier>.plist
.//data/Containers/Data/Application/4EF36E25-D852-4EC6-B688-D2C8194CF683/Library/Preferences/<アプリのBundle Identifier>.plist
```

私の環境では、以下のパスにあった。

```
~/Library/Developer/CoreSimulator/Devices/<デバイスID>/data/Containers/Data/Application/<なんかのID>/Library/Preferences/<アプリのBundle Identifier>.plist
```
※↑<なんかのID>が何なのかがわからない。

## Xcodeで開いて編集

```
$ cd .//data/Containers/Data/Application/4EF36E25-D852-4EC6-B688-D2C8194CF683/Library/Preferences/
$ open <アプリのBundle Identifier>.plist
```

## 参考

[Xcode 6におけるNSUserDefaultsのplistの在り処と、内容を確認・書き換え・削除する方法](http://egg-is-world.com/2014/10/09/xcode6-nsuserdefaults-plist/)
[IOSシミュレータ8でのアプリ内ファイルの保存場所](http://www.soleilsystems.jp/2014/09/25/ios8simulator-applocalfile-dir.html)
[【swift】NSUserDefaultsの保存場所が知りたい](https://teratail.com/questions/11145)
Windows Subsystem for Linuxを使ってみる

## インストール

![開発者モード.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4bd0ab9a-ad30-e760-4a8f-4f281c1e7fe4.png)

* ユーザー名の指定

![y.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ba405d5a-d26d-ff4d-d11b-9d436731f677.png)

## 設定

```
sudo sed -i -e 's/archive/jp.archive/' /etc/apt/sources.list
```

```
sudo apt-get update
```

## dockerを動かしてみようとしたが無理だった

```
sudo apt install -y docker.io
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > docker-compose
chmod +x docker-compose
sudo gpasswd -a `whoami` docker
```

```bash:
sudo /etc/init.d/docker start
/etc/init.d/docker: 71: /etc/init.d/docker: cgroupfs_mount: not found
```

無理だった。


## X11

* [Xming-6-9-0-31-setup.exe](https://osdn.jp/projects/sfnet_xming/releases/)

```
sudo apt install -y fonts-takao xfce4-terminal
```

```
export DISPLAY=:0
xfce4-terminal
```
csharp > 部分一致検索 > Dictionary <string, string>() > FirstOrDefault 使用

関連 http://qiita.com/7of9/items/50557697949d3ddb30e7

上記のリンクにて`Dictionary <string, List<string>>()`の検索を実施した。

しかしながら、自分が使いそうなのは`Dictionary <string, string>()`の検索かもしれない。

実装してみた。

### code v0.1

[ @ C# Online Snippet Compiler](http://volatileread.com/utilitylibrary/snippetcompiler?id=72681)

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
			
public class Program
{
  public static string getElementWithLikeSearch(ref Dictionary<string,string>myDic, string searchKey)
  {
    var list = from name in myDic
      where name.Key.Contains(searchKey)
      select name;

    if (list.Count() == 0) {
      return "";
    }
        
    foreach(var element in list) {
      return element.Value;
    }
    return "";
  }
  
  public static void Main()
  {
    Dictionary <string, string> myDic = new Dictionary<string, string>();
    
    myDic.Add("HC-SR04", "Ultrasonic sensor...");
    myDic.Add("MAX232",  "The Max 220-Max249...");
    myDic.Add("MAX44242", "The MAX44242 provides...");
    
    string val;
	 	val = getElementWithLikeSearch(ref myDic, "MAX232");
    Console.WriteLine(":" + val);

	 	val = getElementWithLikeSearch(ref myDic, "MAX44242");
    Console.WriteLine(":" + val);
    
    val = getElementWithLikeSearch(ref myDic, "MAX");
    Console.WriteLine(":" + val);
  }
}
```

```txt:結果
:The Max 220-Max249...
:The MAX44242 provides...
:The Max 220-Max249...
```

### 備考

複数候補が見つかった時に１つ目を返す方法として以下としている。

```csharp
    foreach(var element in list) {
      return element.Value;
    }
```

インデックス0のValueを返すようにする方法は未消化なのでforeachを使ってごまかしている。

### 改善code

@KeisukeKudo さんの[コメント](http://qiita.com/7of9/items/eaf2fe5c6f7d0ad2fa3a#comment-eb2702b1bf41c9ec7583)を参照ください。

[@ C# Online Snippet Compiler](http://volatileread.com/utilitylibrary/snippetcompiler?id=72904)
UITextView Scrolling Enabled = NOのときに想定した行数分テキストが表示されない

UITextViewを2行分の高さ (今回はheight = 40)にして、表示を確認した時にテキストが1行分しか表示されなかったので少し調べてみました。

**こういうこと**
<img width="375" alt="uitextview.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/57579/79126f87-864d-4fe1-0722-b9351d0f2e59.jpeg">

UITextViewにはデフォルトで上下に余白が設定されていて、Scrolling EnabledをNoに設定すると行が切れてしまうことになります。

なのですべて表示させたい場合は、UITextView.textContaineerInsetsを調整するか、表示フォントサイズ * 行数 + 20などして、下部Inset分足してあげる必要がありました。
CBQを使って帯域制限(CentOS7バージョン)

研究の過程で，イーサネット(Gbitイーサ)で接続してデスクトップPC間の帯域を制限する必要があった．
CentOS6環境におけるやり方はネットにあったが，CentOS7の環境におけるやり方がなかったので書きます．
(※CentOS7で動作確認できたよ～って話で，CentOS6のときのやり方とさして変わりません)

#STEP1(下準備1)
- (参考サイト) http://good-stream.com/goodstream/qos/cbq.html
- 以下のコマンドでcbq.initをダウンロードします

```
# wget http://jaist.dl.sourceforge.net/sourceforge/cbqinit/cbq.init-v0.7.3
```

- 配置

```
# mv cbq.init-v0.7.3 /etc/init.d/cbq.init
# chmod 755 /etc/init.d/cbq.init
# chkconfig --add cbq.init

```

#STEP2(下準備2)
- 本来ならば設定ファイル(STEP3で登場)を設定して，cbq.initをstartさせれば動くが，cbq.init内のfindコマンドの書式がおかしくてエラー(オプション -maxdepthについて)をはくと思います
    - cbq.init内の -maxdepthオプションを全て削除

- (参考サイト) http://memo-off.blogspot.jp/2012/06/linuxcentos.html

#STEP3(設定ファイル作成)
- defaultで/etc/sysconfig/cbq/cbq-0000.exampleファイルがあるので削除/退避
- 適当にcbq-100.testみたいなファイル名で/etc/sysconfig/cbq/直下に作成
    - ※ファイル名の書式はcbq.initにコメントとして記述されているのでそちらを参考に
    
- ここでは約90Mbpsに帯域制限する場合の設定を行う
    - 各パラメータの意味や設定例  http://hogem.hatenablog.com/entry/20110212/1297699361

```cbq-100.test
DEVICE=enp3s0,1000Mbit,100Mbit
RATE=90Mbit
WEIGHT=9Mbit
PRIO=5
RULE=192.168.12.0/24
#90Mbps
```

- ここでCentOS6との違いはDEVICE名である
 - CentOS6 **DEVICE = eth0** , CentOS7 **DEVICE=enp3s0**
 - ※デバイス名を調べるコマンド **nmcli device**コマンド等(http://www.unix-power.net/centos7/network.html)で調べると良い

#STEP4(帯域制限をかける)
```
# service cbq.init start nocache
```
- これで帯域制限(今回は約90Mbps)がかかる

#おまけ
- 念のため，iperfツールを使って通信性能を計測したところ86Mbps(約90Mbps)となっていたので，正しく帯域制限できたといえる
ELB(https) + nginx でヘルスチェックがこける問題

 SSL が必要な簡単なページを稼働させる際に、ELB の無料の SSL 証明書を利用した時にハマったお話

# 構成
簡単な図です。

![b00ff7c3-fd0a-d4d4-3eec-960725c15b96.png](https://qiita-image-store.s3.amazonaws.com/0/26206/8db6b1e2-c831-5e32-e14c-d3a8b9b4e59b.png)

1. ec2 の前段に ELB
2. HTTPS(SSL) は ELB が対応
3. ec2 へのアクセスは http
4. http -> https へのリダイレクトは nginx 側で対応
5. ec2 は一台のみ


# 問題が起きた設定

http://qiita.com/snoguchi/items/f5ccb67592f87942480d
はじめに、こちらの記事を参考に以下のように設定しました。

```nginx
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  example.com;  # 利用するドメインを設定

        # アクセスが http なら https としてリダイレクト
        if ($http_x_forwarded_proto != https) {
            return 301 https://$host$request_uri;
        }

        location / {
                root /var/www/index/;
                index index.html;
        }
    }
```

これで一時はうまくいったのですが、しばらくするとページにアクセスできなくなり、`503 Service Unavailable: Back-end server is at capacity` というステータスが返されて表示できなくなりました。
どうやら ELB のヘルスチェックがこけて、ec2 が外されたようでした。


## 原因

ヘルスチェック自体は http で行っていたので、`$http_x_forwarded_proto` は http。
https へのリダイレクトの条件に合致して、ステータスコード 301 を返したのでヘルスチェックで fail 判定となって外された。
というのが原因だと推測されました。

## 対処

対処はいくつか考えられます。

- ヘルスチェック用のルーティングを追加 (/healthcheck 等)
- 別のポートで Server コンテキストを追加
- default_server と server_name で別の server コンテキストを作成して分ける

他にもやり方は色々とあるかと思います。

ここでは一番最後の default_server と server_name で別の server コンテキスト作成して分ける方法で対応しました。
既存のドメイン指定の server コンテキストの `default_server` を削除して、ヘルスチェック用の 1px gif を返すだけのコンテキストを追加します。

```nginx
    # health check 用 (とにかく 200 を返せれば OK)
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root   /usr/share/nginx/html;

        location / {
                # empty_gif というモジュールで 1x1 の透過 gif を返します
                empty_gif;
                access_log off;
                break;
        }
    }

    server {
        # default_server を削除
        listen       80;
        listen       [::]:80;
        server_name  example.com;  # 利用するドメインを設定

        # アクセスが http なら https としてリダイレクト
        if ($http_x_forwarded_proto != https) {
            return 301 https://$host$request_uri;
        }

        location / {
                root /var/www/index/;
                index index.html;
        }
    }
```

これで問題なく稼働するようになりました。

ただ、上記の設定は IP 直でアクセスすると 1px の gif が表示されます。
対応した案件が、クローズドなサイトで IP でアクセスする必要が皆無の為このような設定になりましたが、IP でもドメインでも同様にアクセスさせたい場合は、ヘルスチェックを考慮した設定を考える必要があると思います。
proxycommand の書き方によって Bad tun device エラーが出る

## Bad tun device ってエラーが出る話


### ダメだった書き方
~/.ssh/configでトンネルの設定をして、

```~/.ssh/config
host server1
    proxycommand ssh -q bastion-server -w %h:%p
```

エラーになる。Bad tun deviceってなに。

```
ssh server1                                                                                                     
Bad tun device 'server1:22'
ssh_exchange_identification: Connection closed by remote host
```

(追記) Chef (Knife-solo) だとこういうエラーが出てた。

```
Checking Chef version...
ERROR: Net::SSH::Disconnect: connection closed by remote host
```




### 大丈夫な書き方

こうすればよし。

```~/.ssh/config
host server1
    proxycommand ssh -CW %h:%p bastion-server
```


いいのか。