OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ECSのDockerログをpapertrailで収集する


DockerコンテナでRailsとかを運用していると気になるのがログの管理。何らかの理由でコンテナが正常に起動しなかったり、障害時に原因を探るためにログを見たい…という時にいちいちDockerコンテナに入ってログを確認するの面倒です。なので、papertrailというサービスを利用しています。

- [papertrail](https://papertrailapp.com/)

これは複数のサーバやコンテナのログを一つに集約して `tail` コマンドのようにログファイルを閲覧できるいい感じのサービスです。似たようなものとして最近出た [logDNA](https://logdna.com/) というのもあります。ほぼ同じような機能です。

## AWS ECSの設定

### papertrailのタスク定義

ログには `/var/run/docker.sock` を利用するので、最初にボリュームを作成しておきます。

| 項目 | 内容 |
|--------|--------|
|ボリューム名名前|dockersock（自由に）|
|ソースパス|/var/run/docker.sock|


公式でDockerイメージがあるのでそれを利用します。

| 項目 | 内容 |
|--------|--------|
|コンテナ名|papertrail（自由に）|
|イメージ|gliderlabs/logspout|
|メモリ制限|ハード（128MB）|
|ポートマッピング|なし|
|CPUユニット数|100|
|コマンド|syslog://logs00.papertrailapp.com:000000（papertrailで発行されたアドレス）|
|マウントポイント|先程作った dockersock|
|コンテナパス|/var/run/docker.sock|

タスク定義は以上です。

### デプロイ

あとは稼働しているクラスタにpapertrailのタスクを実行します。「クラスター」→「タスク」→「新しいタスクの実行」でOKです。追加後は、以下のような感じになっていると思います。

![ecs.png](https://qiita-image-store.s3.amazonaws.com/0/2152/d47d6c78-8332-644e-b7d2-a03279716ab0.png "ecs.png")

## Railsの設定

次にpapertailで収集したいログの出力先をアプリケーション側で設定します。今回はRailsを例にします。

### config/enviroments/production.rb

各環境設定ファイルに以下のような感じで書くことでログが標準出力になります。

```ruby
logger           = ActiveSupport::Logger.new(STDOUT)
logger.formatter = config.log_formatter
config.log_tags  = [:subdomain, :uuid]
config.logger    = ActiveSupport::TaggedLogging.new(logger)
```

これでアプリケーション側の設定は完了です。

![papertrail.png](https://qiita-image-store.s3.amazonaws.com/0/2152/4c6dc18a-2c1c-2203-0ef7-68526589ffbb.png "papertrail.png")

たぶんこんな感じでログが流れてきます。検索も色々できるので捗ると思います。

## papertrailからS3へ

papertrailは基本的にテンポラリ的な使い方になります。 `tail` がメイン。なのでログファイルの永続化は別に考える必要があります。幸いにもpapertrail（logDNAも）にはS3に転送する機能があります。

設定は簡単で、バケット名を設定して、papertrailのIAMアカウントを書き込み許可権限を与えるだけで1日1回ローテーションファイルを配置してくれます。

ただし、papertrailに送った全てのログが1つのファイルにマージして保存されるので、複数サービスを運用している場合は全部混ざってしまいます。後から解析する場合は、自前でフィルタするようにしなくてはならないのが微妙な所ですね…。

なので綺麗にログの永続化をしたいならfluentd→S3のような形を別途作ってあげたほうが良いかもしれません🤔
serverless-webpackのwebpack.config.jsでハマった話

# なにがあったの
`sls deploy`したlambdaのテストしたら`Handler 'say' missing on module 'hello'`と怒られた。

# 問題のwebpack.config.js
```js
var nodeExternals = require('webpack-node-externals')

module.exports = {
    entry: './src/handler.js',
    target: 'node',
    output: {path: 'dist'},
    externals: [nodeExternals()],
};
```

# 出てきたコード
```js
/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
以下略
```

# 望んでいたコード
```js
(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
以下略
```

お分かりいただけただろうか。
`output: {path: 'xxx' }`で指定するとglobalのexportsを渡してくれなくなるのである。

# とりあえずの対応
と言うかserverless frameworkで作るAPIなので、複数ファイルで管理していた。
そのため、
`entry: {file1: './src/create.js', file2: './src/list.js'}`
のようにしていたので、outputが必須だった。

とりあえず、arrayで渡せばoutputは必要なくなるので、暫定対応として。
`enrty: ['./src/create.js', './src/list.js']`

各lambda functionの中身を微調整する必要は出てきたが、是非もないネ！
AWS SNS から Android アプリに Push通知する

AWSのSNS を利用して、Android アプリにPush通知をしたときのメモ。

#全体の流れ
1. Firebase console にプロジェクトの設定
2. アプリの設定
3. AWSSNSの設定
4. Push通知実行

#Firebase console にプロジェクトの設定
##プロジェクト作成
Firebase console にアクセス（https://console.firebase.google.com/）
「新規プロジェクトを作成」から「プロジェクト名」、「国/地域」を指定し、プロジェクトを作成する。

ウェブAPIキーを控えておく。
##Androidアプリ追加
「パッケージ名」を指定し、アプリを追加する。
「google-services.json」をダウンロードし、控えておく。（Androidアプリ作成時に必要）

#アプリの設定
ダウンロードした「google-services.json」をcordovaプロジェクト直下に配置する。
※ 今回はcordovaで作成したAndroidアプリで実施する。
※ cordovaプラグインとして「cordova-plugin-fcm」を利用。

#AWS SNSの設定
##Androidアプリケーションの追加
AWS SNSにアクセスする。

「Create Platform application」からアプリケーションを追加する。
「Application name」を設定する。
「Push notification platform」に「GCM」を選択する。
「API key」を設定する。（Firebase consoleで取得したウェブAPIキーを設定する）

##エンドポイントを追加する
「Device token」にPush通知を受信するAndroid端末のデバイストークンを設定する。

#Push通知実行
送信対象のToken をチェックし、「Publish to endpoint」をクリック。
「Message format」をJSONを選択。
「Message」に下記を入力。

```
{
"GCM": "{ \"notification\": { \"text\": \"メッセージ\", \"title\": \"タイトル\" } }"
}
```
「Publish Message」をクリックし、送信する。

※cordova プラグインとして「com.phonegap.plugins.PushPlugin」を利用の場合は、下記形式で送信する。

```
{
"GCM": "{ \"data\": { \"message\": \"メッセージ\", \"title\": \"タイトル\" } }"
}
```
vimコマンド備忘録

vimで開いてから分割して目視確認とか差分確認の流れ

```:vsplit 比較ファイル名``` 同時に別ファイルを開く
```Ctrl+w, p``` ファイル間移動
```Ctrl+w, =``` ファイルのビューサイズを同じにする
```:set scb```　両方のファイルでスクロール同期
⇒どっちかで```gg```とかして一番上にもってくとかする
```:windo diffthis``` 差分チェック


```:set enc=utf-8``` utf-8にする
```:set number``` 行番号表示
```Ctrl+f``` 下に進む
```Ctrl+b``` 前に戻る
```:任意数字``` 任意の行に飛ぶ（例：```:100```で100行目）


```:%s/置換前の文字列/置換後の文字列/g``` 一気に置換する
UISearchController 使ってると出てくる、Attempting to load the view of うんたらかんたら

UISearchController 使ってたら、ViewController が dealloc されるタイミングで、こんなログが出てきてました。

```Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UISearchController: 0x17805800>)```

ぐぐってみると StackOverflow なんかでも同じように出てる人がいっぱいいるようですが、
何故か

「こうすると解決するよ！」

っていう返答に対して、

「いやそれじゃ解決しなかったよ」

っていうのばかりのようです・・・。
ちなみに、私の場合はこれで解決しました。

```objc:ViewController.m
- (void)dealloc
{
    // 解決！
    [searchController.view removeFromSuperview];
}
```

最初、

```objc:ViewController.m
- (void)dealloc
{
    // 間違い！
    [searchController.searchBar removeFromSuperview];
}
```
のように、
「searchController.<font color="red">view</font>」
を
「searchController.<font color="red">searchBar</font>」
と書いて、俺も解決しない！って騒いでました・・・ｗ
swiftlint 0.18.1 の設定ファイル(.swiftlint.yml)のサンプル 

#swiftlint
https://github.com/realm/SwiftLint

# バージョン
0.18.1
Homebrewで入れました。
`brew install swiftlint`

#本題

.swiftlint.ymlサンプルで検索してもあんまり出てこなかったので、今回作成したものを上げておきます。

今回作成して、自分のプロジェクトで使用している.swiftlint.ymlファイルの内容は下記になります。

```yml:.swiftlint.yml
# 無効にするルール。
disabled_rules:
# コードの記載のない改行を許可したい
- trailing_whitespace
# force_cast は場合によっては使用するため
- force_cast

# デフォルト無効のルールのうち、有効にするもの。
opt_in_rules:
- attributes
- closure_end_indentation
- closure_spacing
- conditional_returns_on_newline
- empty_count
- explicit_init
- explicit_type_interface # new
- fatal_error_message   # new
# ファイルヘッダを修正してもエラー解除されないため
#- file_header
- first_where
# 場合によっては特に問題ないので
#- force_unwrapping
- implicitly_unwrapped_optional # new
- missing_docs
- nimble_operator
- number_separator
- object_literal
- operator_usage_whitespace
- overridden_super_call
# 基本的にはprivateにしたほうが良いがアプリ規模が小さいので今回は無効
#- private_outlet
- prohibited_super_call
- redundant_nil_coalescing
# そこまで多くならないので整列していなくても問題ない
#- sorted_imports
- switch_case_on_newline
- valid_docs

# 追加したOSSライブラリは対象に含めたくない
excluded:
- Pods/
- Carthage/

# 1行あたりの文字数制限を300に変更
# プロジェクト作成時にデフォルトで追加されるコメントをひっかけないため
line_length: 300

# 変数名が１文字以上なら許可に変更
identifier_name:
  min_length: 1
```

基本的な方針としては、できるだけルールを適用させて、どうしてもめんどくさいものだけ省くようにしました。
そのため、opt-in-rulesもたくさん書いてます。

force〇〇系は、あまりswiftを書いたことがない方は外さないほうが良いと思いますが、なれてきたら外してしまったほうが良いと思います。毎回nilチェックするのも大変ですし。
まだswiftlintは安定していないので、結構バグが多いので動かない時もありますので注意が必要です。
あと、変数名の部分は２文字以上や３文字以上にしたほうがいいのかもしれません。(僕は"v"とか"e"とか使いたいので１文字以上にしています...)

#参考
ルールの解説に関しては下記を参考にさせていただきました。
【SwiftLintのRules全まとめ】
http://qiita.com/KAGE_MIKU/items/80e6d905dc0059c342b3
【swiftlint 0.18.1 までの rule まとめ】
http://qiita.com/rd0501/items/103c33d2df20f052523a


他のサンプル
【SwiftLint を導入しました】
http://qiita.com/hoshi-takanori/items/b82e62de8313ff256044
Parameter vs Argument

<table>
<thead><tr>
<td colspan=2>日本語</td>
<td></td>
<td colspan=2>英語</td>
</tr></thead>
<tr>
<td rowspan=2>引数</td><td>仮引数</td><td>関数などが値を要求する表明</td><td>formal parameter/<br>（狭義の）parameter</td><td rowspan=2>（広義の）parameter</td>
</tr>
<tr>
                      <td>実引数</td><td>表明に対して実際に渡された値</td><td>argument/<br>actual parameter</td>
</tr>
</table>

ソースはen.wiktionary
Grails 3 + MySQLでrun-app時にSSL証明書で警告が出る場合の対処

# 事象

Grailsの`application.yml`にMySQLへの接続設定を記載した上で `grails run-app` すると、以下のような警告が出る。（起動自体は成功する）

```
PS C:\Users\KKZ\Git\SampleApp> grails run-app
| Running application...

Thu Apr 13 10:49:22 JST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. 
According to MySQL 5.5.45+,5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set.
For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'.
You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
```

## 使用環境
* Windows7 64bit
* posh-gvm
* Grails 3.2.7
* Groovy 2.4.9
* MySQL 5.7.17
* mysql-connector-java 6.0.6

# 原因
まあ、メッセージに書いてあるとおりで、

```
Thu Apr 13 10:49:22 JST 2017
警告：サーバーの身元確認なしにSSL接続を確立することはお勧めできません。
MySQL 5.5.45 +、5.6.26 +、および5.7.6+の要件明示的なオプションが設定されていない場合、デフォルトでSSL接続を確立する必要があります。
SSLを使用しない既存のアプリケーションに準拠するため、verifyServerCertificateプロパティは 'false'に設定されています。
useSSL = falseを設定してSSLを明示的に無効にするか、useSSL = trueに設定してサーバー証明書の検証にtruststoreを指定する必要があります。
```

5.7.6以降のMySQLではSSL接続がデフォルトになったので、明示的に指定しないとSSL接続するのですがちゃんとした証明書がないと警告が出る、という仕組みですね。

# 対処
本番環境ならちゃんとSSL証明書作った方がいいような気もしますが、とりあえずdevelopmentの環境なら、JDBCの接続文字列に `?useSSL=true&requireSSL=true` を付与すればいいです。

`conf/application.yml` のdevelopmentのとこのJDBC接続文字列にパラメータを追加。

```yaml
environments:
    development:
        dataSource:
            dbCreate: create-drop
            url: jdbc:mysql://localhost:3306/myschema?useSSL=false&requireSSL=false
```
objective-Cからswiftになってどこかに行ったものメモ

メモです。
使うときに少しでも調べたもの。

たまに増やすと思います。
swiftは3.0です。

## Notification
```objc:objective-C
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
```

```swift:swift
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: Notification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
```

## bounds
```objc:objective-C
CGRect bounds = [UIScreen mainScreen].bounds;
```

```swift:swift
let bounds = UIScreen.main.bounds
```


## CGAffineTransform
```objc:objective-C
self.view.transform = CGAffineTransformMakeTranslation(0, 100);
self.view.transform = CGAffineTransformIdentity;
```

```swift:swift
self.view.transform = self.view.transform.translatedBy(x: 0, y: 100)
self.view.transform = CGAffineTransform.identity
```

## 変換
```objc:objective-C
NSInteger num = 10;
NSString *str = [NSString stringWithFormat:@"%@", @(num)];
```

```swift:swift
let num:Int = 10
let str = String(num)
```


## readonly
```objc:objective-C
@property (readonly) NSString* name;
...
- (NSString*)name {
    return @"name";
}
```

```swift:swift
var name:String {
    get {
         return "name"
    }
}
```

## dispatch_async
```objc:objective-C
dispatch_async(dispatch_get_main_queue(), ^{ });
```

```swift:swift
DispatchQueue.main.async { }
```

## 同期
```objc:objective-C
@synchronized (self) { ... }
```

```swift:swift
fileprivate func synchronized(_ obj: AnyObject, closure: () -> Void) {
    objc_sync_enter(obj)
    closure()
    objc_sync_exit(obj)
}

synchronized(self) {
    ...
}
```

## テンプレ
```objc:objective-C
```

```swift:swift
```
AdminLTE に同梱の古いChart.jsではなく最新版を使用する


## 前提

css,jsパッケージを bower-rails で管理している

## Bowerfile

Chart.js の最新をインストール

Bowerfileに以下の行を追加

```Bowerfile
asset "chart.js"
```

その後、

```
rake bower:install
```

でインストール

## マニフェストの編集

app/assets/javascripts/application.js で require している箇所を変更


```app/assets/javascripts/application.js
// AdminLTE の Chart.js は無効化
//# = require admin-lte/plugins/chartjs/Chart
// 最新の Chart.js を読み込み
//= require chart.js/dist/Chart.js
```
Grails 3 + MySQLでrun-app時に「The server time zone value」でエラーが出る場合の対処

# 事象

Grailsの`application.yml`にMySQLへの接続設定を記載した上で `grails run-app` すると、以下のようなエラーが出て起動に失敗する。

```
PS C:\Users\KKZ\Git\SampleApp> grails run-app
| Running application...

2017-04-13 10:37:39.630 ERROR --- [ost-startStop-1] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.

java.sql.SQLException: The server time zone value '?ｿｽ?ｿｽ?ｿｽ?ｿｽ (?ｿｽW?ｿｽ?ｿｽ?ｿｽ?ｿｽ)' is unrecognized or represents more than one time zone. You must co
nfigure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize
time zone support.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
```

## 使用環境

* Windows7 64bit
* posh-gvm
* Grails 3.2.7
* Groovy 2.4.9
* MySQL 5.7.17
* mysql-connector-java 6.0.6

# 原因

Windows環境だと文字化けしてて読めないのですが、おそらくマシンの環境からタイムゾーンを取得して、**Asia/東京(UTC+9:00)**のような文字列をサーバー標準時としてMySQLに渡そうとしているのですが、MySQL側でこのタイムゾーン設定を受け付けていないのでエラーになっている、という事象かと思われます。

# 対処

一番楽なのは、MySQL側のデフォルトタイムゾーンに明確な指定を入れてしまうことです。
`my.ini` に `default-time-zone` の設定を加えて、プロセス再起動。

```ini
[mysqld]
default-time-zone = +9:00
```

試してませんが、たぶんmysqlのコンソールからのSET GLOBALでも直せそう。

```sql
SET GLOBAL default-time-zone = `+3:00`;
```

さらに別解としては、JDBCの接続文字列を
```
jdbc:mysql://localhost:3306/myschema
```
じゃなくて
```
jdbc:mysql://localhost:3306/myschema?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
```
みたいな感じでJDBC接続文字列のオプションとして渡すやり方でも直せそうな気はします。serverTimezoneで指定できるようなので。（未検証）
railsでlink_toを使いidを付与してリンクを作成

railsでaタグにidなどを付けてリンクを作成したい場合があると思います。
詳細画面へ遷移させたい時に「/rentals/1」というパスを作成したい時です。

まず、どのようなパスが設定されているか調べる必要があります。

プロジェクトルートディレクトリで以下のコマンドを入力します。

```
rake routes
```

すると以下のような結果が出力されます。

```
 Prefix Verb URI Pattern            Controller#Action
   root GET  /                      homes#index
rentals GET  /rentals(.:format)     rentals#index
 rental GET  /rentals/:id(.:format) rentals#show
```

一番左のPrefix列に「_path」を付加したものがパスになります。

```
<%= link_to '詳細画面へ', rental_path(3) %>
```

上記のように記述すると「詳細画面へ」というテキストがリンクになり/rentals/3をパスに持つurlが作成されます。
Assertion failed on expression: 'success && actual == (UInt64)size'

いつものようにJenkinsでUnityアプリをビルドしていると、こんなエラーが。

```
Compiled shader 'TMPro/Distance Field (Surface)' in 18.91s
    gles (total internal programs: 90, unique: 50)
    gles3 (total internal programs: 90, unique: 71)
Assertion failed on expression: 'success && actual == (UInt64)size'
```

当該のシェーダーを見ても問題はないどころか、そもそもこんなassertを書いている箇所はありません。

…で、ざっくり言うと、

**PCのハードディスクがいっぱいになった**

が原因です。

調べたところ、たまたまこのシェーダーをコンパイルした瞬間にハードディスクがいっぱいになり、ファイルが書き込めず、想定と実際のファイルサイズが違ってしまったのでビルドスクリプトのassertで止まった、ということのようです。

特に自動ビルドPCには過去の成果物ファイルがたまったりしてHDDがいっぱいになりがちで、かつ、普段はログインしないPCなので確認がおろそかになります。注意しましょう。イマドキ500GB程度ではこころもとないですね…。

なお、Windowsで出力されるファイルが2GBを超えた場合などにも同じエラーが出ることがあったようなんですが、これはUnity5.3.0で解消されているようです。

[BUILDING] WINDOWS STANDALONE NOT BUILDABLE WHEN SHAREDASSETS FILE IS LARGER THAN 2GB
https://issuetracker.unity3d.com/issues/building-windows-standalone-not-buildable-when-sharedassets-file-is-larger-than-2gb
GKEでclusterに繋ぐためのクライアント証明書と秘密鍵を取得する

# tl;dr

~~~
gcloud container clusters describe ${cluster_name} --project=${project} \
  --zone ${zone} \
  --format 'value(masterAuth.clientCertificate)'  |  base64 -d > client.pem

gcloud container clusters describe ${cluster_name} --project=${project} \
  --zone ${zone} \
  --format 'value(masterAuth.clientKey)'  |  base64 -d > key.rsa

gcloud container clusters describe ${cluster_name} --project=${project} \
  --zone ${zone} \
  --format 'value(masterAuth.clusterCaCertificate)'  |  base64 -d > ca.pem

# 繋がる
kubectl get pod --server https://xxx.xxx.xxx.xxx \
  --client-certificate=./client.pem  \
  --client-key=./key.rsa \
  --certificate-authority=ca.pem

~~~

- - -

殆どの場合gcloudで認証情報を取得すればいい、もしくはgcpメタデータ認証とか使えば問題ない

~~~
$ gcloud container clusters get-credentials ＄cluster_name
~~~

いいんだけど、ごくたまに証明書を指定して認証したい時がある(jenkinsとかで別Projectのclusterにつなぎたいとか)
で、証明書ってどうやって取るんだっけ？って毎回忘れる

`gcloud container clusters describe` で取れることまでは思い出せるんだけど
`これがbase64されてることをマジで忘れる。`
ドキュメントにもちゃんと書いてあるんだけどこのドキュメント到達するの結構大変

https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#MasterAuth

と、いうわけでbase64でdecodeする

~~~
gcloud container clusters describe ${cluster_name} \
  --project=${project} \
  --zone ${zone} \
  --format 'value(masterAuth.clientKey)'  |  base64 -d > key.rsa
~~~
Cloud ShellでContainer EngineのDashboardを見る

Kubernetesにはとっても便利な [Dashboard](https://kubernetes.io/docs/user-guide/ui/) の機能があります。

<img width="1654" alt="Screen Shot 2017-04-13 at 10.33.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/50f56069-019d-c412-7d16-ec8759e8b46f.png">


KubernetesのフルマネージドサービスであるContainer Engineでももちろん確認できます。
この記事では、Container Engineを操作する時によく利用する [Cloud Shell](https://cloud.google.com/shell/docs/) から、Kubernetes Dashboardを確認する方法を説明します。

# credential取得コマンドの表示

Cloud ShellからContainer Engine上のNodeにアクセスする場合、最初にCredentialを取得します。
Container Engineの場合は、 `gcloud command` を利用して簡単に取得できます。
commandの内容はContainer EngineのConsoleで表示してくれます。

<img width="1086" alt="container_engine_001.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/98950f8b-c20e-1671-41c2-c7aefd987b54.png">

<img width="506" alt="container_engine006.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/d0233d0c-f9b0-4126-3a39-03c6f29973aa.png">

# Cloud Shell上でkubectl proxyを起動する

credentialを取得してから、 `kubectl proxy` を起動します。
`kubectl proxy` のデフォルトポートは `8001` になっていますが、Cloud Shellからは8001は見れないので、 `--port 8081` を付けて起動するポートを変更します。

```
gcloud container clusters get-credentials {your Container Engine Node Name} \
    --zone {your Container Engine Node Zone} --project {your project ID}

kubectl proxy --port 8081
```

実際実行したShell

<img width="640" alt="container_engine_002.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/a1eb5aec-082b-9c7f-7b14-875068d3048e.png">

# Webプレビューの表示 

Cloud Shell上の左上のメニューから、Port 8081へのアクセスを行います。

<img width="315" alt="container_engine_003.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/0b260a6d-c306-44a1-c363-0f785ce0a2a9.png">

Port 8081へアクセスすると、以下のような画面が表示されます。

<img width="657" alt="container_engine_004.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/227535fd-f3a3-3b74-1b8f-fdf74da40f5c.png">

後は、URLを `https://8081-dot-XXXXXX-dot-devshell.appspot.com/ui/` に変更すれば、Dashboardが表示されます。

# おわり

KubernetesのDashboardはとっても便利です。
Docker Imageを変更したり、Podの数を変更するのも、Podのログを確認するのもチョイなのです。
Deploymentを作ってみたけど、ひたすらPodがCrashしてる！みたいな時も、Podのログを見れば、なぜCrashしてるのかが分かります。
Container Engineを利用する場合は、活用していきたいですね！
matplotlibで簡単にアニメーションをつくる（mp4, gif)

[matplotlib.animation](http://matplotlib.org/api/animation_api.html): matplotlibベースの、お手軽アニメーション生成ライブラリ。

インストール

```bash:@mac
$ pip install matplotlib
$ brew install imagemagick # gif 保存用
$ brew install ffmpeg # mp4 保存用
```

```bash:matplotlib.rcの修正
$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
/Users/riki/.pyenv/versions/ML-2.7.13/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
$ atom /Users/riki/.pyenv/versions/ML-2.7.13/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc

# line 38
- backend : macosx
+ backend : Tkagg
```

Animationを生成する関数が2種類ある

* ArtistAnimation: あらかじめ全てのフレームをlistで用意しておく 
* FuncAnimation: 各フレームを動的に生成する

個人的には ArtistAnimationの方がわかりやすいのでこちらをオススメする。
FuncAnimationの方が柔軟ではあるが、ArtistAnimationで不便は特に感じない。

## ArtistAnimation

>animation.ArtistAnimation(fig, artists, interval=200)
* fig: 大枠。matplotlibのfigureオブジェクト
* artists: 各フレームで描くartistオブジェクト(lineなど)のlistのlist
* interval: 各フレームの再生間隔 [ms]

artists引数をlistのlistにしないといけないところでerrorを出しやすいので注意。（詳細後述）

---

### 例1: sin波のアニメーション

```python:anim_sin_wave.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
x = np.arange(0, 10, 0.1)

ims = []
for a in range(50):
    y = np.sin(x - a)
    line, = plt.plot(x, y, "r")
    ims.append([line])

ani = animation.ArtistAnimation(fig, ims)
ani.save('anim.gif', writer="imagemagick")
ani.save('anim.mp4', writer="ffmpeg")
plt.show()
```

![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/158680/ecf41393-432d-c082-3887-c4d6f190c960.gif)


pyplot.plot関数は複数のグラフを一度にプロットできるので、返り値の型がlist。

```python
lines = plt.plot(x1, y1, 'r', x2, y2, 'g', x3, y3, 'b')
print type(lines) # list
print len(lines) # 3
print type(lines[0]) # matplotlib.lines.Line2D
```

わかりやすさのため、メインコードでは敢えて unpackしてLine2Dオブジェクトを取り出して、そのあと、listに変更してからlistに追加する。

```python
line, = plt.plot(x, y, "r")
ims.append([line])
```

animationの保存は、以下で行える（gifかmp4の好きな方でやればいい）

```python
ani.save('anim.gif', writer="imagemagick")
ani.save('anim.mp4', writer="ffmpeg")
```

---

### 例2: 2次元画像のアニメーション

```python:dynamic_image.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()

def f(x, y):
    return np.sin(x) + np.cos(y)

x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
ims = []

for i in range(60):
    x += np.pi / 15.
    y += np.pi / 20.
    im = plt.imshow(f(x, y), animated=True)
    ims.append([im])

ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
                                repeat_delay=1000)

ani.save('anim.gif', writer="imagemagick")
ani.save('anim.mp4', writer="ffmpeg")
plt.show()
```

![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/158680/1553ddb1-6fb8-30c3-9f3b-6393d7425562.gif)

pyplot.imshow関数は、返り値の型がAxesImageオブジェクトなので、listにしてからlistに追加する。

```python
im = plt.imshow([[]])
print type(im) # matplotlib.image.AxesImage
ims.append([im])
```
GCP リソースの割り当てを増加(上限緩和申請)

# リソースの上限を確認/増加リクエスト

「IAMと管理」→「割り当て」で全ての一覧が確認できる
![all.png](https://qiita-image-store.s3.amazonaws.com/0/117032/d02e8df8-723a-980b-a3c5-d0631553fa6d.png)



クリックすると各リソースページに飛び、そこから増加をリクエストできる
![request.png](https://qiita-image-store.s3.amazonaws.com/0/117032/32f28714-5fac-a103-fb55-f4f3f5bf2b89.png)

# GCPではこのアクションを何と呼んでるの？
英語： Resource Quotas 
https://cloud.google.com/compute/quotas

日本語：リソースの割り当てを増加
https://cloud.google.com/compute/docs/resource-quotas?hl=ja&_ga=1.181298212.2042940000.1483498197

# ちなみに無料使用時は緩和できません
書いてないけどね
https://cloud.google.com/free/docs/frequently-asked-questions#limitations
Android 7.1.2で突然Android Studioからデバックできなくなった時に試すこと

ただいまとある事情でメモリ8GのPCでAndroid Studioを運用しているため、エミュレーターなんて贅沢品はとても使用できません。

~~はよ新しいPCこないかな。~~

実機デバックあるのみです。
で、現在デバックに使用しているNexus6PのOSを7.1.2にあげたとたんにAndroid Studioから認識されない事態に！

**なんでだよーー！？**
と全泣きでggりまくったところ、頼って安心、でもポイント貯めるのがしんどいstackoverflowがヒットしました。

> Nougat 7.1.2 debug issue
http://stackoverflow.com/questions/43112459/nougat-7-1-2-debug-issue


引用すると
> Just a simple solution (Working on Nexus 5X, 7.1.2),
Developer options
Select USB configurations
Choose MTP (Media Transfer Protocol)



まじか！MTPモードにするだけか！！ていうかもともとMTPモードだったのが勝手に解除されたのか！！
というわけで設定から**USB接続モードをMTPに変えるだけ**ですんなり認識されました。

もし同じ問題で苦しんでいる方のお役に立てば。
3点リーダを打ち消して改行させるCSS


Reactのコンポーネントにデフォルトで設定されているoverflow時の3点リーダを打ち消して改行させる。

## Material-UIのTableRowColumn
http://www.material-ui.com/#/components/table
Material-UIのTable（TableRowColumn）には下記のようなスタイルがデフォルトであたっている。

```
text-overflow: ellipsis;
```
これは、内容のテキストがテーブルセルの幅よりも大きくなったときに三点リーダを表示する。

![スクリーンショット 2017-04-13 10.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/29971/d0744c65-fcb7-a5ac-af8d-1d33030b78d3.png "スクリーンショット 2017-04-13 10.21.41.png")


## 長い文字列を改行して全て表示させる
```
<TableRowColumn 
    key={index}
    style={{
        paddingLeft: 5,
        paddingRight: 5,
        whiteSpace: 'normal',
        wordWrap: 'break-word'}}>
    長い文字列長い文字列長い文字列長い文字列長い文字列長い文字列長い文字列長い文字列長い文字列
</TableRowColumn>
```

```
whiteSpace: 'nomal',
wordWrap: 'break-word'
```
を指定すれば改行されるようになる。

![スクリーンショット 2017-04-13 10.21.58.png](https://qiita-image-store.s3.amazonaws.com/0/29971/82054399-837c-8adc-7cb3-0551590cd7c1.png "スクリーンショット 2017-04-13 10.21.58.png")
VMware Workstation 12 でフルスクリーン表示のときにツールバーを完全に非表示にする

## まえがき - VMwareをフルスクリーン表示して操作を動画キャプチャーしたいが、ツールバーが邪魔！
ある日、仮想マシンで実行中のRAD Studio/Delphi/C++BuilderのIDEの操作を動画キャプチャーすることになりました。キャプチャーの方法はいろいろありますが、サードパーティアプリケーションやHDMI outの信号をキャプチャするハードウェアを追加したりせずにOSの機能だけを使って動画キャプチャーしたいと考えました。

そうすると、macOSとWindowsでは、それぞれ次の方法でキャプチャーできそうです。

- macOS上の仮想マシンの操作をQuickTime Playerで動画キャプチャーする
- Windows10でWin+Gキーで動画キャプチャーする

しかしmacOSにVMware FusionでWindowsの環境を作ってRAD Studio/Delphi/C++BuilderをインストールするのはmacOSやiOS向けのアプリも作成するケースに限られますのでここでは除外し、ユースケースとしてはWindowsで仮想マシンをセットアップし、そこにRAD Studio/Delphi/C++Builderをインストールするケースを対象に考えてみます。

さて、Windows10でサポートされる動画キャプチャの方法、Win+GキーはGame DVRという機能であり、本来はゲーム録画のためのものです。
http://support.xbox.com/ja-JP/xbox-on-windows/social/record-game-clips-game-dvr-windows-10

ですがこれはゲーム以外の操作の録画にも使えます。必須の条件は、何をキャプチャーするにせよハードウェア要件を満たしていることです。
http://support.xbox.com/ja-JP/xbox-on-windows/system-requirements/pc-hardware-requirements-for-game-dvr

しかし残念なことに仮想マシンはこの要件を満たさないので、実行すると以下のようなメッセージが出てしまいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/539d409c-8ffa-d183-f34d-1ff9b957683a.png)

でもホストOS側が要件を満たしていsれば、仮想マシン実行中のウィンドウをWin+Gでキャプチャできます。（ちなみにこれは実質的にmacOSでVMware Fusionの画面をQuickTimeでキャプチャするのと同じ方法となります）

では実際にキャプチャーするためにVMware WorkstationのゲストOSをフルスクリーン表示にしてみたのですが、どうも以下のように画面の上部にツールバーが微妙に居座ってしまいます……。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/2ee35099-7811-3b55-d9c9-8561ce1e6256.png)

これはよろしくない。キャプチャーした動画にも見えてしまいますね。

そこで、これを消す方法を調べてみました。

## インターネット上で良く出てくる情報を調べて試す
preferences.ini に pref.vmplayer.fullscreen.nobar = "true" や pref.vmplayer.fullscreen.nobar = 1 と記述せよ、という説明を良く見かけます。

しかし、手元の VMware Workstation 12.5 でコレを試しても全く効果がありませんでした。

これは困った……。

## 実はメニューから設定変更できた……

他の方法はないかと調べてみたら、下記のページに良い情報がありました。

https://superuser.com/questions/246644/can-i-completely-hide-toolbar-in-vmware-workstation

> Took me a little searching to find the answer to this because I didn't want to change the position of my screens. If you go to Edit > Preferences > Display > Uncheck "Show toolbar edge when unpinned in full screen" you'll be all set!

というわけで、**[編集]=>[環境変数]のメニューから、[ディスプレイ]=>[フルスクリーンで固定が解除された場合にツールバーのエッジを表示する] を無効にする**わけですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/cebb1c09-348a-ca37-3aad-b22e8f833e03.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/8ff154f9-56d1-8817-adfd-563c517d51c3.png)

実際にやってみると、あっさり消せました。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/63b47123-ae05-04e2-c84b-ad656420149c.png)

そしてこの状態で preferences.ini を調べてみると、以下の設定が追加されてました。

```
pref.fullscreen.toolbarPixels = "0"
```

設定を再度有効にしてみると、値が以下のように変わりました。

```
pref.fullscreen.toolbarPixels = "3"
```


設定項目が違うじゃん。だからpref.vmplayer.fullscreen.nobar を設定してもエッジが残ってしまったわけだ……


ちなみにツールバーのエッジを非表示にしても画面最上端にマウスを移動すればツールバーは表示されます。この方法で操作画面を録画する際は、マウスを画面の最上端にもっていかないように気を付けましょう。またフルスクリーン表示の解除はツールバーを表示せずとも[ctrl]+[alt]+[enter]で可能です。
IntelliJを2017にアップデートしてキーマッピングがおかしくなった時の対処法


僕は1年ほど前から、intellij系列のIDE(Rubymine, Appcode, Pycharm)を愛用しています。
最近`Rubymine`をアップデートして、`Rubymine2017.1`にしたのですが、キーマッピングがおかしくなってしまったので調べて直しました。

## 環境

MacbookPro の El Capitan です。
JIS配列のキーボードを使ってます。

## 対処法

1. Help -> Edit Custom Properties を開く
2. `~/Library/Preferences/Rubymine2017.1/idea.properties` がない場合はダイアログが表示されるので作成する
3. `idea.properties` に `com.jetbrains.use.old.keyevent.processing=true` を追加
4. Rubymineを再起動

参考にしたのは以下のツイートです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Life-saving tip to restore old keymap behavior in IntelliJ 2017 with non-US keyboard layouts <a href="https://t.co/31o71mmef8">https://t.co/31o71mmef8</a></p>&mdash; Edoardo Vacchi (@evacchi) <a href="https://twitter.com/evacchi/status/851695852666146816">2017年4月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### 参考URL

- https://twitter.com/evacchi/status/851695852666146816
- https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000163784-macOS-keymap-changed-in-2017-foreign-keyboard-layout-

## 原因

どうやら、US配列でないキーボードでバージョンを2017にアップデートした時に、この問題が起こるようです。

今回は、Rubymineで [Select Next Tab] の `⌘ + ⇧ + [` を入力したところ、次のタブに移動せずに前のタブに移動したことでイラッとして気付きました。

しかし、まだ、バージョンアップしていない`Appcode2016.3`のkeymap設定を見てみると、

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/65193/f44a1769-359f-28ae-3745-b1f012fc59e8.png "Preferences.png")

`⌘ + ⇧ + [`で、実際には次のタブに移動するのに、keymap上では前のタブに移動することになっています。
もともとがバグっている挙動だったのを2017にしてあるべき挙動に戻したのかもしれません。
inject(:merge)で配列内のhashを結合する

# はじめに
先日友人から以下のようなリクエストをうけました。

>
```rb
[{0=>{:number=>1}}, {1=>{:number=>2}}, {2=>{:number=>3}}]
```
これを
>
```rb
{0=>{:number=>1}, 1=>{:number=>2}, 2=>{:number=>3}}
```
こんな感じに変換するいい感じの方法って何かありますかね？？


どういう状況でこんな形になったんだろうと思いつつも、なかなか面白い頭の体操だと思い取り組んでみました。
※ hashの中身は適当です。

# 解答例

## 解答1
ゴリゴリ頑張る。eachで頑張ります。

```ruby
hash = {}
[{0=>{:number=>1}}, {1=>{:number=>2}}, {2=>{:number=>3}}].each do |h|
  hash.merge!(h)
end

hash
=> {0=>{:number=>1}, 1=>{:number=>2}, 2=>{:number=>3}}
```

## 解答2
`Hash[X.map(&:flatten)]`を使う。一回配列にしてhashに戻す方法ですね。

```ruby
Hash[[{0=>{:number=>1}}, {1=>{:number=>2}}, {2=>{:number=>3}}].map(&:flatten)]
=> {0=>{:number=>1}, 1=>{:number=>2}, 2=>{:number=>3}}
```

## 自分の解答

`inject(:merge)`を使う方法が思いつきました。(または`inject(&:merge)`)

```ruby
[{0=>{:number=>1}}, {1=>{:number=>2}}, {2=>{:number=>3}}].inject(:merge)
=> {0=>{:number=>1}, 1=>{:number=>2}, 2=>{:number=>3}}
```

`inject(:+)`はよく使用するのでそれを応用して`inject(:merge)`も配列の要素内のhashを結合するのに使えるのではという発想です。

もし仮に(ないとは思いますが)同じキーを持った値があったときは上書きされてしまうので注意が必要ですね。

```ruby
[{0=>{:number=>1}}, {1=>{:number=>2}}, {2=>{:number=>3}}, {0=>{:number=>4}}].inject(:merge)
=> {0=>{:number=>4}, 1=>{:number=>2}, 2=>{:number=>3}}
```
MacでC#のコードをコンパイルして実行する

#手元でちょっとしたC#プログラムを実行したい
最近のエディタは再生ボタンを押すだけで自動でコンパイルして実行までを行ってくれるので、手動でコンソールからコマンドを叩いてコンパイルすることの**必要性はほとんどありません**が、学習のためにサンプルのクラスだけ作って実行結果を見たい時などは有用そうなので、手動コンパイル実行の手順をまとめてみました。

この記事はその記録になります。

DOS/Vとかの頃からプログラマだった人には当たり前すぎる内容かもしれません。
しかし、最近の**ゆとり開発環境**に慣れきった自分は手動コンパイルをやったことがなかったので実際に試して見ました。

といってもMONOを使えば簡単にC#のコードをコンパイルして実行できました。

##C#のコンパイラ(Mono)をインストール

###Monoとは
Ecma標準に準じた.NET Framework互換の環境を実現するためのオープンソースのソフトウェア、**C#のコンパイラが含まれています**
>Mono, the open source development platform based on the .NET Framework, allows developers to build cross-platform applications with improved developer productivity.

>C# Compiler - Mono’s C# compiler is feature complete for C# 1.0, 2.0, 3.0, 4.0 and 5.0 (ECMA). A good description of the feature of the various versions is available on Wikipedia.

###インストール
公式のDownloadから.pkgファイルをダウンロードしてインストールする方法もありますが、Homebrewでもインストール可能です。ターミナルで下記のコマンドを実行してみてください。
>Homebrewとは？
Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システム

```terminal:Terminal
$ brew install mono
```

###MONOについて詳しく知りたい人
[公式サイト](http://www.mono-project.com/docs/getting-started/mono-basics/)へ

##コードを書いて保存する
テキストエディタかvimコマンドなどで`hello.cs`ファイルを作成し、保存する

```csharp:hello.cs
using System;
public class HelloWorld
{
    static public void Main ()
    {
        Console.WriteLine ("Hello Mono World");
    }
}
```

##コンパイルと実行
hello.csを保存したディレクトリで下記を実行

```terminal:Terminal
$ mcs hello.cs
#結果 -> [1]+  Done mcs hello.cs

$ mono hello.exe 
#結果 -> Hello Mono World
```

`mcs:コンパイルコマンド`
`mono:実行コマンド`

##複数ファイルのコンパイル

ファイルが複数に分かれている場合はスペースで区切って並べて指定するか、*.csで一括指定出来ます。出力されるexeファイルの名前は-outオプションを使うことで変更可能です。
(フォルダが階層になっている場合とか外部ライブラリ使う場合どうすればいいかわかってません)

```terminal:Terminal
$ mcs hello1.cs hello2.cs -out:hello.exe
$ mcs *.cs -out:hello.exe
```

##参考にさせていただいたサイト
[https://nkmk.github.io/blog/mac-c-sharp-compile/](https://nkmk.github.io/blog/mac-c-sharp-compile/)
[http://qiita.com/omega999/items/6f65217b81ad3fffe7e6]
(http://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
Zynq + Linux Kernel 4.5(以降) で "mmc0: Timeout waiting for hardware interrupt" が起きる場合の対処方法(続編)

[「Zynq + Linux Kernel 4.5(以降) で "mmc0: Timeout waiting for hardware interrupt" が起きる場合の対処方法」](http://qiita.com/ikwzm/items/9d64d9583f8e3eb5c94a) の続編です。

## 症状

Zynq で Linux Kernel 4.5以降 を動作させた時、"mmc0: Timeout waiting for hardware interrupt" が起きて SD-Card が読めません。
SD-Card に root file system を作っていた場合、Linux が起動出来なくなります。

## 参考

実はこの原因は「技術書典2」で販売されていた次の本で説明されていました。

* 「AGPF WORKS Vol 1.0」
 - 発行者: AQUAXIS TECHNOLOGY
 - 発行日: 2017年4月9日
 - Web: http://www.sweetcafe.jp

この本には、このバグの説明や解析する過程が詳細に記述されています。ぜひ読んでみてください。

## 原因

sdhci.c のデバイスドライバ内で DMA 転送に失敗しています。「AGPF WORKS Vol 1.0」で記載されていたDMA転送の失敗のメカニズムを簡単に説明すると次の通りです。

* Zynq にはシステムメモリ空間上に DMA 転送出来ない領域があります。
  - 具体的には 0x00000000 - 0x0007FFFF の 512KByte
  - 詳細は「Zynq-7000 All Programmable SoC Techinical Reference Manual」UG585 Xilinx
* Linux Kernel の v4.4 以前に比べて、それ以降のバージョンではメモリ管理がより緻密になりました。
  - v4.4 以前では kmalloc 等でメモリ領域を確保した時、Linux がロードされた後ろのメモリ領域から確保されます。
  - v4.5 以降では kmalloc 等でメモリ領域を確保した時、場合によっては メモリの低位の方からも確保されるようになりました。
* mmc ドライバはバッファを kmalloc で確保しています。
  - v4.4 以前ではバッファは **たまたま** 物理アドレス 0x00080000 以降に確保されていました。
  - v4.5 以降ではバッファが 物理アドレス 0x00000000 - 0x0007FFFF に確保されることがあります。
* sdhci ドライバは mmc からのリクエストやデータを DMA 転送しています。
  - バッファの物理アドレスが Zynq の DMA転送不可領域だった時、DMA に失敗してタイムアウトします。
  - DMA 転送にはスキャッターギャザー可能な ADMA モードと、シンプルな SDMA モードがあります。
  - DMA エラーが起きるのは ADMA モードの時。SDMA モードでは「何故か」起きませんでした。

## 対処方法

Linux 起動時に使用する Device Tree に次の記述を追加して Zynq の DMA 転送不可領域をリザーブします。

```
	reserved-memory {
		#address-cells = <0x1>;
		#size-cells = <0x1>;
		ranges;

		zynq-dma-unusable-area {
			reg = <0x0 0x80000>;
		};
	};

```

このようにすれば、Linux が使う領域に Zynq の DMA 転送不可領域が含まれなくなるようです。

## 補遺

ここで疑問点があります。原因が DMA 転送時のエラーなら、ADMA モードでも SDMA モードでも同じようにエラーになるはずです。しかし、SDMA モードでは発生しませんでした。

カーネルのソースコードを見たり、sdhci.c にデバッグ出力を組み込んで実動作で確認したところ、次のような事がわかりました。

* MMC ドライバは SDHCI ドライバに対して ADMA モードでは一度に数ブロックの転送要求を行っています。
* MMC ドライバは SDHCI ドライバに対して SDMA モードでは１ブロックずつ転送要求を行っています。
* SDMA モードでは MMC が確保しているバッファは常に 0x00080000 以降でした。

sdhici.c の次の記述があります。

```C:sdhci.c
int sdhci_setup_host(struct sdhci_host *host)
{
   :
   :
	/*
	 * Maximum number of segments. Depends on if the hardware
	 * can do scatter/gather or not.
	 */
	if (host->flags & SDHCI_USE_ADMA)
		mmc->max_segs = SDHCI_MAX_SEGS;
	else if (host->flags & SDHCI_USE_SDMA)
		mmc->max_segs = 1;
	else /* PIO */
		mmc->max_segs = SDHCI_MAX_SEGS;
   :
   :
 }   
```

MMCドライバはこの max_segs をみてバッファを確保するのですが、SDMA モードの場合は **たまたま** 確保領域が Zynq の DMA 転送不可領域にならないようでした。

## まとめ

前回の[「Zynq + Linux Kernel 4.5(以降) で "mmc0: Timeout waiting for hardware interrupt" が起きる場合の対処方法」](http://qiita.com/ikwzm/items/9d64d9583f8e3eb5c94a)で説明した対策では、おそらく不十分です。v4.5 以降の sdhic の ADMA モードで *たまたま* 症状が出た(地雷を踏んだ)だけであって、実は SDMA モードや、あるいは別のドライバでも同じような症状がでる可能性があります。この記事で説明したように、Linux が使う領域に Zynq の DMA 転送不可領域を含まないようにした方が確実です。
ターミナルの描画を爆速にする(mac/linux)

## はじめに
ターミナルの描画速度が遅いです
vimmerにとって深刻な問題となっています[^1]
> 僕のMacの環境では Terminal.app が一番悪くて、
> カーソル移動するだけでも、かなり遅く感じる。
> iTerm2ではスクロールが発生しないカーソルの移動は問題ないが、
> スクロールが発生するカーソル移動を行うと遅く感じる。
> 調べてみると、困っている人は他にもいて、vimの設定などをいろいろ工夫している。
>> Vim - General - Vim is too slow with syntax highlighting
>> vim syntax highlight improve performance - Stack Overflow
>> http://andrewbrookins.com/tech/slow-scrolling-in-vim-and-macvim-on-os-x-increase-key-repeat-settings/

vim描画で重いとされる[^2]
行ハイライトや相対行をやめても
移動が重いと感じていました

## alacritty導入
alacrittyを使います
[jwilm/alacritty](https://github.com/jwilm/alacritty)
GPUを使ってレンダリングをしているため高速に動作するターミナルらしいです[^3]

ターミナルと同じ事ができるので、
ターミナルやiTermから乗り換えるようなイメージです

今回はmacに導入します
linuxも使えるみたいです

### インストール(mac)

```sh
brew tap mscharley/homebrew
brew install --HEAD alacritty
```

### 設定ファイル

ターミナル、iTermのようにPreferencesでの設定ではなく、
ymlファイルで管理する(別PCと共有しやすく、個人的に好き)

```sh
$XDG_CONFIG_HOME/alacritty/alacritty.yml
$XDG_CONFIG_HOME/alacritty.yml
$HOME/.config/alacritty/alacritty.yml
$HOME/.alacritty.yml
```

上記パスのいずれかにymlファイルが無ければ起動時に
`$HOME/.config/alacritty/alacritty.yml`
が自動生成される

alacritty.ymlはcloneしたプロジェクトの直下に初期ymlが置いてあるので
それを参考に、色やフォント情報を変える

## alacritty注意点
* 日本語が表示できない(2016/04/13時点)
* ホットキー登録が標準で無いので、必要なら自前で用意する必要がある
	- `/usr/local/Cellar/alacritty/HEAD-7bc1691/bin/Alacritty.app`<a name ="clipboard">
* ~~画面フォーカス時や特定のコマンド後、現在パスへ移動のようなコマンドが毎回自動で入力される~~
	- ~~見た目が気になる上、macのクリップボードをパスで上書きしてくるので困る~~
* macOS + tmux + vim is slow!というFAQがある
	- mac + tmux + neovim 環境では問題無し
* F13キー以降が使えない
	- vimで特殊なキー割り当てを使用していたため別キーに変えて対応
* tmuxのステータスバー情報にshellを使っていると、更新の度ステータスバーが増え続け、画面が埋まる
	- shellを使ったバッテリー残量やwifi情報は一旦無しにする
- マウスが表示され続ける

## 使ってみて
* フォントをRictyにしたら日本語表示された(入力はできない)
	- BoldのフォントをRictyにしたら特定の文字が消えたのでBoldのみMenlo(デフォルト)にしている
	- ペーストすれば日本語の挿入ができる
* タブや画面分割機能が無いのでtmuxが無いと厳しいかも
* 見た目や使用感はターミナルやiTermと同じ
* 描画が爆速すぎてiTermに戻れなくなる
* ~~[クリップボード荒らし](#clipboard)が本当に困る~~

## 終わりに
日本語を打つ機会は日常的にあるので
現時点ではiTermと共存して使うのが良いかな、と思いました
tmux使っていればsession切り替えで端末の切り替えがすぐできて相性良い感じがします

alacrittyは新規のプロジェクトで、コミットが盛んなので今後の更新に期待です

[^1]: http://hakobe932.hatenablog.com/entry/2013/08/11/161337
[^2]: http://unskilled.site/vimでjkでの縦スクロールが遅くなる（重くなる）件/
[^3]: http://www.moongift.jp/2017/01/alacritty-gpuで描画する高速ターミナルエミュレータ/
Monodevelopのショートカットまとめ

## 環境
* Mac
* Unity5.6

## Command + x
* 切り取り。行削除の代わりに使う

## Command + d
* カーソルが当たっている変数・関数の宣言部分に飛ぶ

## Command + r
* カーソルが当たっている変数の一括リネーム

## Command + f
* 検索

## Command + l
* 指定行へ移動

## Command + マイナスキー / Shift + プラスキー
* 文字の縮小
* 文字の拡大

## スラッシュ3回
* 複数行コメント

## Command + /
* コメントアウト・解除

## 短形範囲選択
* Option + マウスドラッグ選択

## 合わせて使いたいMacのショートカット
### Ctrl + n
* 下の行へ移動

### Ctrl + p
* 上の行へ移動

### Ctrl + a
* 行頭へ移動

### Ctrl + e
* 行末へ移動

### Ctrl + f
* 右に進む

### Ctrl + b
* 左に進む

### Ctrl + h
* 左の1文字を消す

### Ctrl + d
* 右の1文字を消す
Oracleについての個人的まとめ

#この記事について#
自分の備忘録として、Oracle全般についての自分の考えや調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。

#sqlplus内でLinuxコマンドを実行するには

! をつけることで、Linuxコマンドを実行できる。
もちろんSQLファイル内に書くことも可能。

例
SQLplus実行

```
SQL>! ls
```
lsコマンドが実行される

#&&の意味#

引数の入力の省略を意味する。

```test.sql
select '&1' from dual;
select '&1' from dual;
```
だと2回引数を聞かれるが、

```test.sql
select '&&1' from dual;
select '&&1' from dual;
```
だと1回で済む。
技術英語 > For some kinds of software, [need is not the issue] / The issue here is that ...

http://thecodist.com/article/the-six-goals-of-every-programming-project

> For some kinds of software, **need is not the issue**, for example games are more about desire (to be entertained or amused or pass the time) and not need

意訳（間違っているかもしれない)
「ある種類のソフトウェアにとって、必要性は取り上げるべき事項ではない。例として、ゲームはより欲望に対してのものであり、必要性のためのものではない(楽しんだり、夢中になったり、時間を過ごしたりするためのもの)。」

<hr>
関連して思い出したのは

> The issue here is that ... 

https://news.ycombinator.com/item?id=12786213
> The issue here is that git is:

gitについての意見が書かれている。
SSL証明書を更新しようぜ

経過：　4月13日設定開始　→　4月18日時点　https つながらず。
去年の証明書は設定できる　→　https つながらず。

|||
|---|---|
|サーバー|コアサーバー|
|中間証明書|RapidSSL|

# 要点

第一段階

- そのサイトの持ち主であることを確認する文字列

第ニ段階

- 中間証明書
- 証明書
- プライベート・キー

という４つの文字列がある。段階的に　分けて考えよう。

# 要点じゃないもの（第一段階）
入金の発生するような 商用Webサイトを作っていて、購入ボタンを押したら URLのドメイン（www.なんとか.comみたいなやつ）が変わって入金ページに行くようなときに、入力情報が平文（ひらぶん；暗号でないこと）で飛んでたら　パスワードなどが空中キャッチされてしまうかもしれない。

そういうことを防ぐために　情報を飛ばすサイトと　情報を受け取るサイトの両方で SSL証明書を購入しておく。証明書の使用期限がくると　更新が必要だ。　証明書を購入すると、**サイトが持ち主のものであることを確認する文字列**をもらうんで、それをサーバーに置いておいて、認証局が　その文字列を読みに来てくれるのを待つんだが、

手順の手引書を読んでいると　**えっ、マジで？**　と思うような　プログラマーが読むようなフォルダー階層から始まる素朴な書き方がしてあったりするので、

**ボタン１つで　アップロードできる方法を探したい。** レンタルサーバーには　それがあるはずだ。

**キーボードのローマ字入力ができないとか、アルファベットのセミコロンは　どれなの、とか　ナムロックが解除できないというのが　基本なのであって、ＰＣのインターフェースはまったく進化していない。スマホに後れを取っている。**


と一人で文句を言いながら　ログイン画面に来たんだが　パスワードが変わっているのか　入れなかった。よくある。
管理者の１人なのに　はじき出されたが、これからの定期的なメンテナンス作業　どうするのか。

じゃあ、 **FileZilla を使って** 指定のフォルダー階層に 指定のファイルを置くか。

ディレクトリを作るぞ。
タイポを防ぐために　メールの文面をコピペし、なるべく手打ちを避ける。

文字コードの指定がない。 Shift-JIS がいいのか、UTF-8 BOM有り がいいのか……。
とりあえず迷ったら UTF-8 BOM有り にしておこう。

置いた。

自分でそのURLにアクセスする。
404 ページが見つかりません。

フォルダー階層を間違えたようだ。

CORE SERVER を使っていると public_html の下が外から見えると思うんだが、
わたしは構成を間違って　おかしなフォルダー構成をしているんで　それを踏まえて見直す。

よし、今度は　**サイトが持ち主のものであることを確認する文字列** が見れた。

# まとめ（第一段階）
証明書を購入したとき教えてもらう**文字列**を　テキスト・ファイル形式で　アップロードするだけなんだが。

このあと、認証局が確認したら　証明書がメールか何かで送られてくるだろう。

# 要点じゃないもの（第二段階）

新しいパスワードを教えてもらった。やっと　ログインできた。

手元には新しい

- 中間証明書
- 証明書

という文字列がやってきた。

- プライベート・キー

は１年前ぐらいにもらっている。

CORE SERVER には 「SSL証明書」というメニューがある。
ここに３つを入れてみよう。

プライベート・キーが合わない。

証明書が生成されたときの　プライベート・キー　が要るらしい。古いのじゃダメなのか。

# 2017-04-18

プライベート・キーも指定して　設定は通っていると思ったんだが
１日待っても https がつながっていない。
webpack 2でTSLint

webpack 1系の記事を読んでいてハマったので2系で動かすためのメモ

# 手順
1. `tslint`(本体)と`tslint-loader`(webpackで使用)をインストール  
`npm install --save-dev tslint tslint-loader`  
1. `webpack.config.js`の設定  
1系の場合はpreLoaderの項目内に設定を書き込むんだけど、2系は`enforce`で指定するみたい。
既存のts-loaderの上にtslint-loaderの設定を追加して、`enforce: 'pre'`をつける。

    ```js
    module: {
      rules: [
        {
          enforce: 'pre',
          test: /\.tsx?$/,
          exclude: /node_modules/,
          loader: 'tslint-loader'
        },
        {
          test: /\.tsx?$/,
          exclude: /node_modules/,
          loader: 'ts-loader'
        },
      ]
    }
```
1. `tslint.json`をプロジェクトルートに配置
中身は色んな人が公開しているので、良さげなものを取ってきて自分ナイズしていくのが良いと思う。

これでwebpackのコンソールにlintの結果が出力されるようになる。

# おまけ
tslintのルールについては、大御所のAirBnBスタイルガイドを適用できるnpmパッケージもある。
`npm install tslint-config-airbnb --save-dev`
    
`tslint.json`に以下を記述  
    
```js
{
  "extends": "tslint-config-airbnb"
}
```
Mac OSにSonnetをインストール

# Sonnetをインストールする

Anacondaを使い、2.7の環境を作ります。

```
$ conda create --name py2.7 python=2.7
$ source activate py27
$ cd
$ pip install numpy tensorflow scipy pandas matplotlib
$ pip install --upgrade IPython
$ git clone --recursive https://github.com/deepmind/sonnet
$ cd sonnet/tensorflow
$ ./configure
$ cd ../
$ mkdir /tmp/sonnet
$ bazel build --config=opt :install
$ ./bazel-bin/install /tmp/sonnet
$ pip install /tmp/sonnet/*.whl
$ pip install sonnet
```

TensorFlowが1.0.1であることを確認。もしくはそれ以上

```
$ python -c "import tensorflow as tf; print(tf.__version__)"
$ cd ~/
```

```
$ python
>>> import sonnet as snt
>>> import tensorflow as tf
>>> snt.resampler(tf.constant([0.]), tf.constant([0.]))
```

Importエラー等が出たら、再度以下を実行し最初から試す。

```
$ pip uninstall sonnet
$ cd
$ cd sonnet/tensorflow
$ ./configure
$ cd ../
$ bazel build --config=opt :install
$ ./bazel-bin/install /tmp/sonnet
$ pip install /tmp/sonnet/*.whl
```

# Sonnetが正常にインストールされたことを確認

```
(py27) HawkMacBook-Air:~ hawk$ python
Python 2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import sonnet as snt
>>> import tensorflow as tf
>>> snt.resampler(tf.constant([0.]), tf.constant([0.]))
<tf.Tensor 'resampler/Resampler:0' shape=(1,) dtype=float32>
>>> 
```

# 参考記事
https://github.com/deepmind/sonnet
http://www.procrasist.com/entry/sonnet-memo
http://deeplearning.hatenablog.com/entry/sonnet
windowsのブートマネージャーが起動しない。未解決。

# 背景と症状

windows10とUbuntu16.04をデュアルブートするようにしている。
前にubuntuのgrubなど修復した後から，windowsのブートマネージャーが起動しなくなった。
同時に，windowsの更新が構成できなくなった。
セーフブートもできない。
一応起動できるので使っているが，かなり気持ちは悪いので何とか治したい

# bcdeditがうまく起動しない？

管理者権限コマンドプロンプトでbcdeditをやるも

```
C:\Windows\system32>bcdedit /v
ブート構成のデータ ストアを開けませんでした。
指定されたファイルが見つかりません。
```
とでる.

ググって試す。
https://panyaa.herokuapp.com/blog/54
https://msdn.microsoft.com/ja-jp/library/hh824874.aspx

```
C:\Windows\system32>bcdboot C:\Windows
ブート ファイルをコピーしようとして、エラーが発生しました。
```
ググって試す。
http://tuttitan.hatenablog.com/entry/2016/07/12/200043
http://ameblo.jp/littlemouseman/entry-12067310068.html

```
C:\Windows\system32>bcdboot c:\windows /l ja-JP /s c:
ブート ファイルは正常に作成されました。
```
となるが，再起動しても治らず。

https://note.chiebukuro.yahoo.co.jp/detail/n292619
https://yuu.nkjmlab.org/diary/20120720.html
http://ameblo.jp/pochifx/entry-12155777954.html

bootrecを打ち込んでも。

```
'bootrec' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

DVDから起動してbootrecのコマンドをいくつかやろうとしたら，いつのまにか起動しなくなっていた。しかもUbuntuのブートマネージャに遷移しない。ちょっと悪化した。たぶんdiskpartかbcdbootのどちらかが原因。後にやったほうから戻していってみよう。

# 症状悪化
diskpartいろいろやる。
→
シャットダウンしても再起動してしまう
BIOS画面を出すことができない。
UBUNTUのブートマネージャーにもいかない。
前もあったけど問題悪化。逆にいえばdiskpartで起動するときに読み込む？パーティション？をいじれば変わる可能性ある。

# MBR(マスターブートレコード)修復
まずMBR方式である（GPT方式ではない）ことを「ディスクの管理→ディスク0のプロパティ→ボリューム→パーティションのスタイル」から確認。

https://note.chiebukuro.yahoo.co.jp/detail/n292619
http://tipstour.net/windows/4410

diskpartやる
→うまくいかない。

http://freesoft.tvbok.com/tips/efi_installation/uefi_bootrec.html
Mysqlの全テーブルを削除するためのコマンド 

いろいろ探して、個人的に一番しっくりきたコマンドがこれです。
参考にしていただければ。


```sql
SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
```
[stackoverflow](http://stackoverflow.com/questions/12403662/how-to-remove-all-mysql-tables-from-the-command-line-without-drop-database-permi)
SRM 428 Round 1 - Division II, Level One

topcoderの問題をやってみようかなシリーズ。
動的計画法で絞って簡単な方から少しずつやり始めている。
https://community.topcoder.com/stat?c=problem_statement&pm=10240

この問題は、式通りに加算していくだけ。

public class ShorterSuperSum {

	public int calculate(int k, int n) {
		int[][] dp = new int[k + 1][n + 1];
		for (int i = 0; i <= n; i++) {
			dp[0][i] = i;
		}
		
		for (int i = 1; i <= k; i++) {
			for (int j = 1; j <=n; j++ ) {
				for (int p = 1; p <= j; p++) {
					dp[i][j] += dp[i - 1][p];
				}
			}
		}
		
		return dp[k][n];
	}

}
SRM 500 Round 1 - Division II, Level One

topcoderの問題をやってみようかなシリーズ。
動的計画法で絞って簡単な方から少しずつやり始めている。
今回のは、SRMCardsという問題。
https://community.topcoder.com/stat?c=problem_statement&pm=10240
キーポイントは、同じ数のカードが存在しない。
dp[i]:i番まででmaxターン数
public class SRMCards {

	public int maxTurns(int[] cards) {
		int[] dp = new int[cards.length];
		dp[0] = 1;
		Arrays.sort(cards);
		for (int i = 1; i < cards.length; i++) {
			if (cards[i - 1] + 1 == cards[i]) {
				if (i >= 2) {
					dp[i] = dp[i - 1] == dp[i - 2] ? dp[i - 1] + 1 : dp[i - 1]; //連続した３つの数の場合は +1しなければいけない。
				} else {
					dp[i] = 1;
				}
			} else {
				dp[i] = dp[i - 1] + 1;
			}
		}
		return dp[cards.length - 1];
	}

}
MacでVim使うのダルい

はい。ということでmacOSでVimを使おうとしたらWindowsよりもLinuxよりもダルかったという話です。
あれもこれもMacがVimをSEGVさせるのと、Python2系を使わないといけないのが悪い。
お察しの通り、ただの愚痴です。結論だけ知りたい方は一番下の[結論](#結論)へ。

## 動作環境
- macOS Sierra(10.12.4)
- XCode8.3.1
- Command Line Tools for XCode 8.3
- (Homebrew導入済み)

## 過程
- デフォルトで入ってるvimが普通にSEGVする。←この時点でおかしい。
- にっちもさっちもいかないので別途Vimを導入しようとする。
- Homebrewで入れたVim, MacVim、そしてdmgからインストールしたMacVim-KaoriYaで特定のプラグインを使用するとSEGVする。
- ひとまずMacVim-KaoriYaが一番使いやすかったので使う。←SEGVするプラグインを避けることができた。
- Python2を書く機会があって、Python3インターフェースを使うVimプラグインを使用した後にjedi-vimを使ったらオムニ補完が効かない。
- Python2を書くときにVimではPythonインターフェースだけ使うようにプラグインも設定し直したら、最重要なプラグインで95% SEGVで落ちる。
  - 実は落ちないと思ってたプラグインもHOMEディレクトリとかで使うと普通にSEGV。

- MacVimでPython/Python3を同時ロードするにはbrew installしたPython/Python3では駄目。
  - pyenvを使用してPython/Python3をビルドし、MacVimもビルドし直す必要がある。
  - しかも動作が安定が保証されているわけではない。変わらずSEGVする可能性がある。

- 仮に安定したMacVimをビルドできたとして、以下の懸念点がある。
  - Updateのたびに壊れる可能性がある。
  - pyenvで入れたPython/Python3の入力補完をするのに、別途Vimのプラグインが必要。
  - 仮想環境を使うのに、デファクトスタンダードのvirtualenv/venvでなくpyenv-virtualenvを使うことになる。
  - それで更にVimのプラグインがうまく動かない可能性がある。

- ここから別エディタの導入を考え始める。
  - neovim導入を考えるが、Vimとの差異を把握することや設定を新たにやり直すのがダルい。
  - VSCodeとかいいらしいけど結局プラグイン入れたり、設定色々やること考えたらダルい。
  - 最初からフルスペックな環境が欲しい。
- **PyCharmでいいんじゃね？**←今ここ。

Vimにかぎらず、標準から外れた方法で導入したPython(pyenv, Anacondaで入れたPython)を導入することでPyCharmでも入力補完がうまく動かないという意見がチラホラ見られるので、以下のように役割を分けることにしました。

- Python: PyCharm
- それ以外: MacVim-KaoriYa

<a name="結論"></a>
## 結論
- Python書くならPyCharm使おう。PyCharmはいいぞ！
- macOSでVim使うならMacVim-KaoriYa使おう。
- Python2は捨ててPython3を使おう。
Mastodon用語まとめ

MastodonではTwitterと同じ機能でも違う名前だったりして初見だと結構混乱する。
なので簡単にまとめてみた。
間違ってたり足りなかったらご指摘ください。

#Mastodon用語
##Toot
Twitterのツイートと同じ
##Boost
Twitterのリツイートと同じ
##Favourite
Twitterのいいねと同じ
##instance
Mastodonサーバのインスタンス。
[mastodon.social](https://mastodon.social/about)とか[mastodon.cloud](https://mastodon.cloud/about)とか[mstdn.jp](https://mstdn.jp/about)とか
公開されているものだけでもかなりたくさんある。
##コネクト
instance同士が繋がること。
どうすれば繋がるのかはよくわかりませんでした…。
##Local timeline
instance内のTootが表示されるタイムライン。
フォローしてなくてもお構いなしに流れてくるのでユーザ数が増えると流速が大変なことに。
##Federated timeline
Local timelineに加えてコネクトされた他のinstanceのTootも表示されるようになったタイムライン。
フォローしてなくてもお構いなしに流れてくるので略
##CW
Content warning.
Tootの一部を折りたたんで投稿できる。
~~飯テロするときなどに使おう。~~
画像はCWに指定してても普通に表示されるみたい…。
##NSFW
Not suitable for work(職場閲覧不適切)
R18画像など公の場での閲覧には不適切な画像を投稿するときはこれにチェックをいれる。
飯テロにも。
#その他
##認証済みアカウント
認証済みマークを付けたいときは自分で:white_check_mark:(white_check_mark)をプロフィールに付けよう。
#参考
http://d.hatena.ne.jp/keyword/NSFW
pythonのインストール（pyenv, pyenv-virtualenv）


ローカル環境で複数のpythonを使いたいときのメモ 
簡単に言うとpyenvはpythonのバージョンを管理するもので、そのプラグインであるpyenv-virtualenvはpythonの環境を作るもの。 
pyenv-virtualenvでpythonの環境を閉じ込めて使い分けることができる。

## pyenvのインストール
```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo "export PYENV_ROOT=$HOME/.pyenv" >> .bash_profile
$ echo "export PATH=$PYENV_ROOT/bin:$PATH" >> .bash_profile
$ echo "eval '$(pyenv init -)'" >> .bash_profile
```

## pythonのインストール
```
$ pyenv install 3.5.0
```

## pyenv-virtualenvのインストール
```
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> .bash_profile
```

## 環境の作成
```
pyenv virtualenv 3.5.2 app # appは環境の名前
```

## 環境の設定を有効にする
```
pyenv activate app # appは先程の名前
```



##