OmniAICreator/Qiita-1.07M huggingface dataset:
Github の Personal Access Token を使って `git submodule update --init --recursive` する in Travis CI

# はじめに

プライベートリポジトリをサブモジュールとして利用する必要があったので、 [Private Dependencies - Travis CI](https://docs.travis-ci.com/user/private-dependencies/#API-Token) をいろいろ調べていたら Github の Personal Access Token を利用して `git submodule update --init --recursive` が行える方法があったのでまとめてみました. 

本家では Gemfile を利用していましたが、作るのが面倒だったのでシェルスクリプトに置き換えました.

# なぜ Personal Access Token を利用するのか?

`.travis.yml` さえ作ってしまえば、コマンドを使わずに設定が可能だからです.
今から説明する方法は、Travis CI の [Environment Variables] にトークンを登録すれば簡単に更新することができます. SSH鍵の生成やら暗号化とかの手間が必要ありません. すべてブラウザの中で完結するので、引き継ぎ作業が発生した場合に楽になります.

ただし、今から説明する初期設定はターミナルを利用しています.
（Travis CI の [Environment Variables] にトークンを設定する作業なんて説明がなくてもできるので）

# Travis CI の設定

## Github Personal Access Tokens の生成

[Personal Access Tokens](https://github.com/settings/tokens) にて生成する.
[Generate new token] から生成画面へ移動します.
[Token description] と [Select scopes] に適切な入力を行います.

トークンの説明 (**Token description**) に 「Travis CI for myaccount/myrepository」 と記述すると myaccount/myrepository のために Travis CI で利用しているトークンであるということがわかりやすいです.

サブモジュールとして利用するのであれば、スコープ (**Select scopes**) の `repo` にチェックをするだけで十分です.

## Travis CI に Github Personal Access Token を登録

平文で扱うのはよくないので暗号化します.
（あらかじめ `gem install travis` で `travis` をインストールする必要があります.）

```bash
travis env set CI_USER_TOKEN the-generated-token --private -r myorg/main
```
（`the-generated-token` は先程取得した Github Personal Access Token です.）

これで、 **myaccount/myrepository** の Travis CI 内では `$CI_USER_TOKEN` が利用できるようになりました.

## .netrc の作成

ログイン処理を省略するために必要なファイルです.

```:.netrc
machine github.com
  login the-generated-token
```

中身に先程取得した the-generated-token (**Github Personal Access Token**) を記述する必要があるので bash コマンドで生成してしまいましょう.

```bash
echo -e "machine github.com\n  login $CI_USER_TOKEN" >> ~/.netrc
```

## .gitmodules

このファイル内の `git@github.com:myaccount/myrepository.git` 形式を `https://the-generated-token@github.com/myaccount/myrepository.git` 形式に変更しなければいけません.
このとき、 Personal Access Token を付与する必要があるのでこちらも bash コマンドで変更してしまいましょう.

```bash
sed -i -e "s/git@github.com:/https:\/\/$CI_USER_TOKEN@github.com\//" ./.gitmodules
```

## .travis.yml

上記に記載したスクリプト等を `.travis.yml` に追加すると以下のようになります.
例として、 Android のビルドを想定しています.

```yaml:.travis.yml
language: android
sudo: required
android:
  components:
    - tools
    - platform-tools
    - build-tools-25.0.1
    - android-25
    - extra
git:
  submodules: false
before_install:
  - sed -i -e "s/git@github.com:/https:\/\/$CI_USER_TOKEN@github.com\//" ./.gitmodules
  - echo -e "machine github.com\n  login $CI_USER_TOKEN" >> ~/.netrc
  - git submodule update --init --recursive
script:
  - "./gradlew clean build"
branches:
  only:
  - master
  - develop
  - "/^release.*$/"
```

# さいごに

スコープの設定をいじると他のことも簡単にできそうなので、いろいろ試してみるのも面白いと思います.
macOS Sierra に pyenv + python3.5 + OpenCV3 をインストール

去年秋頃に[同じ内容の記事](http://qiita.com/masaori/items/0c78fcd58a6c6bf4f655)がありますが、今日やってみたら細かいワークアラウンドが不要となっていたので、2017年4月版としてメモを残しておきます。

# 前提条件
- Homebrew 導入済み
  - `brew update` 実行済み
- macOS Sierra 10.12.3
- xcode 8.3(8E162) 
  - `xcode-select --install` 実行済み

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

~/.bash_profile の先頭に以下の行を追加。

```:~/.bash_profile
eval "$(pyenv init -)"
```

# python3.5 のインストール
```
$ pyenv install 3.5.3
$ pyenv global 3.5.3
```
pyenv install 時に zlib がなくてエラーになる場合は、```xcode-select --install```が実行されていないので、実行してインストールします。

# シェルを開き直す
.bash_profile の変更を反映させるため、ここで一度シェルを終了し、開き直しましょう。

# python 3.5を選択し、バージョンチェック
```
$ python -V
Python 3.5.3
```

# OpenCV3 のインストール
```
$ brew install opencv3 --with-python3
```

# pyenv から使えるように、リンクを貼る
OpenCV3 のインストールパス配下にある cv2.cpython-35m-darwin.so に対してシンボリックリンクを貼ります。
インストールパスは `brew install` 後の Caveats に出てきます。私が試した時点でのインストールパスは `/usr/local/Cellar/opencv3/3.2.0` でしたので、次のコマンドを実行しました。

```
$ ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so .pyenv/versions/3.5.3/lib/python3.5/site-packages/
```

# numpy のインストール
```
$ pip3 install numpy
```

# 動作確認

```
$ python
Python 3.5.3 (default, Apr  4 2017, 19:19:54) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
```

以上です。
Kotlinの拡張関数でService起動中の判定をする関数を作る

```kotlin

val Context.activityManager: ActivityManager
    get() = this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager


fun <T: Service> Class<T>.isRunning(context: Context) =
        context.activityManager.getRunningServices(Integer.MAX_VALUE)
                .any { this.name == it.service.className }

fun <T: Service> KClass<T>.isRunning(context: Context) = this.java.isRunning(context)


HogeService.class.isRunning(context) //=> true or false
```
こんな感じでいけるかな？
モブプログラミングを実際にやってみた

「巷で噂のモブプログラミングってどうなんだろう？」と興味を集まったメンバーで集まって、実際にモブプロをしてみました。参考までに簡単にまとめておきます。

# モブプログラミングとは

モブプログラミングは、2012年頃にHunter Industies社で取り組みが始まりました。そこで得た知見をWoody Zuillさん達がカンファレンス等で紹介することで広まっていきました。

- [Mob Programming – A Whole Team Approach by Woody Zuill](https://www.agilealliance.org/resources/experience-reports/mob-programming-whole-team-approach-woody-zuill/)

以下の動画を見ると、実際にモブプログラミングをしている様子を見ることができます。
[![A day of Mob Programming](http://img.youtube.com/vi/p_pvslS4gEI/0.jpg)](http://www.youtube.com/watch?v=p_pvslS4gEI)

さらに2016年の様子のビデオが下記です。複数のモブが動いている様子を見ることができます。
[![A day of Mob Programming 2016]
(http://img.youtube.com/vi/dVqUcNKVbYg/0.jpg)]
(https://www.youtube.com/watch?v=dVqUcNKVbYg)

モブプロは簡単に言うと、みんなで画面をみながらわいわいプログラミング（またはそれに準じた作業）をすることです。基本的な進め方・コツ・現場で出てきそうな問題点は、ペアプログラミングと似ていると思います。

# 実際にやってみた
![17778733_1339159689484930_676604171_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/43421/3419be0d-bbee-afbb-3ae5-64080f153a38.jpeg)

![17522037_1339159666151599_1224660125_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/43421/39dfd6d2-d047-aefd-fd94-71463ff04773.jpeg)

### 用意したもの

- 場所：モニターのある会議室
- 環境：プログラミングするためのPC
- お題：牛尾さんが公開されている [ゼロから始める DevOps](https://www.youtube.com/watch?v=OQ2ADtdOnRg)
- メンバー：愉快な仲間たち（全5名）

### 進め方

- お題の動画を見ながら実装する
- ドライバー以外はみんなナビゲーター
- ドライバー交代は特に取り決めせずに流れに任せる
- 終わった後にふりかえり

### 結果

- お題のデモ作成成功！！

# ふりかえり

### Y（やったこと）
モブプログラミング
牛尾さんのデモ（VSTSを使って.NETのアプリケーションをAzure WebAppsに自動デプロイする）を実際につくる

### W（わかったこと）
- 入れ替わりのタイミングがわからない
- 志村うしろうしろ問題がよく起こる
    - 志村うしろうしろ問題とは、ドライバー以外がガヤ芸人のように「もうちょい上！！」「右上！！」「うしろ！！」と指示しまくる現象のこと
- 得意なことを補完し合いながら進められるのがよい
- 一方でチームが変なテンションになってこだわってドハマリをしてしまうことがあった
- 現場でやる場合はメンバーの組み合わせ次第で工夫が必要そう

### T（次にやること）
- ファシリテーターを明確に立てる
- 実際の現場でできそうなところからやってみる

# 実際の現場で実施する場合
体験後に実際に現場でやってみる場合について議論をしました。結論はないですが、参考までに個人的に思ったことも含めて以下にまとめておきます。

### 問題になりそうなこと

- 生産性が下がるのではないか問題
    - ペアプロで出てくる問題と同じ
    - 手戻り・レビュー・テストを含めてホントにそうなんだろうか
- モブプログラミングをすることでチームのムードが悪くなる
    - これはモブプログラミングの問題ではなさそう
    - ふりかえりやコードレビューと同じで未来志向で進められるとよさそう
    - 批判・否定してもよい結果は絶対に生まれないのでNo Blameで進める
- 参加するメンバーの組み合わせによる問題
    - 発言しなくなってしまいそうな人にはドライバーをやってもらう
    - 無理に全員でやる必要はなさそう
    - できるところからはじめる

### どこからはじめるとよさそうか

- 体験の共有に価値があること、全員が理解・実施可能になったほうがよいこと
    - Continuous Deliveryの初期設定
    - フレームワークの設定・初期開発
- 意思決定を行いながら進めたほうがよいこと
    - 重要な機能の実装
    - 難しい問題・バグにぶち当たった時

### 気をつけた方がよさそうなこと

- 最低限のルール（マナー）を定義する
    - No Blame
    - 否定ではなく提案をする（✕「それはないわー」◯「こうやったらどう？」）
- 最初にその日の作業の流れを書き出してからはじめる
- ファシリテーターを置く
    - タイムキーピング
    - 作業の流れを定期的に確認する
- 毎回ふりかえりを実施する

**Let's モブモブ！！**

# 【更新】モブプログラミング関連リンク
ここで得た知見をもとにいろんなアウトプットをしているのでリンクだけ紹介しておきます。

- [モブプログラミングスタートアップマニュアル](https://takaking22.com/2018/mobpro_manual/)
- [モブプログラミング記事まとめ](https://takaking22.com/tag/mobprogramming/)
Kotlinの関数参照 #Kotlin_Sansan

## はじめに

この記事は[第5回Kotlin勉強会@Sansan](https://sansan.connpass.com/event/53312/)の発表で使用した内容です。

---

## 自己紹介

* たろう @ngsw_taro 
* [エムスリー株式会社](https://www.wantedly.com/companies/m3_inc/employee_interviews/55299)のAndroidエンジニア
* Kotlinエバンジェリスト（自称）
* 著書「[Kotlinスタートブック](http://amzn.asia/hHNP6F5)」

---

## もくじ

1. 関数参照
1. レシーバが未定のメソッド参照
1. レシーバが確定のメソッド参照
1. プロパティも関数

---

## 1. 関数参照

---

### 関数オブジェクト

* Kotlinでは定義済みの関数のオブジェクトを得ることができる
* 関数オブジェクトを変数に代入したり、別の関数の引数に渡したり、持ち回して便利に使える。
* 必ずしもオブジェクトではない（ヒント: インライン関数）

---

### コード例

```kotlin
// 普通の関数
fun succ(n: Int): Int = n + 1

// 関数オブジェクトを取得し、変数に代入
val myFunc: (Int)->Int = ::succ
//          ^^^^^^^^^^ 関数型

// メソッド呼び出しによる元の関数の計算を実行
myFunc.invoke(5) //=> 6

// 演算子オーバロードによる関数らしい記述
myFunc(7) //=> 8
```
---

### 応用例

```kotlin
// 高階関数の引数に「関数参照」を渡す
listOf(1, 2, 3).map(::succ) //=> [2, 3, 4]

// ラムダ式を使えば同じ
listOf(1, 2, 3).map { succ(it) } //=> [2, 3, 4]
```

* ラムダ式は、文を手続き的に記述していく
* 関数参照は、宣言的な記述になる

---

## 2. レシーバが未定のメソッド参照

---

### メソッド参照

* メソッドのオブジェクトも取得できる
* この場合は、レシーバが未定

```kotlin
// 「型::メソッド名」という書式で取得
val foo: String.()->String = String::reversed
//       ^^^^^^^^^^^^^^^^^ 関数型

// メソッドっぽく呼び出せる
"Kotlin".foo() //=> niltoK
```

---

### 拡張関数もOK

```kotlin
fun String.bold(): String = "**$this**"
val baz: String.()->String = String::bold
"Sansan".baz() //=> **Sansan**
```

---

### 普通の関数型にもなるよ

* `A.(B)->C`という型は、`(A, B)->C`と同じっぽい

```kotlin
fun String.bold(): String = "**$this**"

// 型どっちでもOK
val aaa: String.()->String = String::bold
val bbb: (String)->String = aaa

// 呼び出し方どっちでもOK
"hoge".aaa() //=> **hoge**
aaa("fuga") //=> **fuga**
```

---

### 高階関数で効果を発揮

```kotlin
"Hello".let { it.bold() }
"Hello".let(String::bold)
```

もし`String.()->String`が`(String)->String`とみなせなかったら、2行目の書き方がNGです。

---

## 3. レシーバが確定のメソッド参照

---

### Bound Function Reference

* bound = 束縛された
* → レシーバが確定してるメソッド参照
* Kotlin 1.1から使用できる

---

### コード例

```kotlin
// 「オブジェクト::メソッド名」の書式で取得
val succ: (Int)->Int = 1::plus
succ(5) //=> 6
```

```kotlin
userRepository.findById(123L)
  ?.let { user -> user.copy(blocked = true) }
  ?.let(userRepository::update)
```

---

## 4. プロパティも関数

---

### プロパティも関数として扱える

```kotlin
val prop: KProperty1<String, Int> = String::length
prop.get("Taro") //=> 4

val func: (String) -> Int = prop
func("Taro") //=> 4
```

---


### 高階関数で効果を発揮

```kotlin
listOf("foo", "wa").map { it.length }   // => [3, 2]
listOf("foo", "wa").map(String::length) // => [3, 2]
```

もし`KProperty1<String, Int>`が`(String)->String`とみなせなかったら、2行目の書き方がNGです。

---

## まとめ

* 関数オブジェクトを使うと宣言的な記述ができる
* `::hoge`: 関数参照
* `Foo::bar`: メソッド参照
* `foo::bar`: レシーバ固定メソッド参照 (Bound Function Reference)
* プロパティも関数オブジェクトになれる
* [次に見るべきスライド？（ネタ枠）](https://speakerdeck.com/ntaro/ramudashi-jin-zhi-ozisan-ver1-dot-1-number-kotlin-sansan)
Ajaxを用いた非同期通信の一連の流れ

## Ajax（Asychronous JavaScript XML）とは
- 一言でいうとJavaScriptの機能。
- ページ遷移させることなく、JSを用いて、ページの一部を書き換えることでスムーズなUXを提供するプログラミングの手法。

## 非同期通信の一連の流れ
- JSイベントの発火

```ruby:qiita.rb
  $('.js-form'). on('submit', function(e){
    e.preventDefault();
    e.stopPropagation();
    var formData = new FormData ($(this).get(0));
    var path_name = location.pathname;
    $.ajax ({
      type:'POST',
      url: path_name,
      data: formData,
      processData: false,
      contentType: false,
      dataType: 'json'
    })
    .done(function(data) {
      var html = buildHTML(data);
      $('.messages').append(html);
    })
    .fail(function() {
      alert('error');
    });
  });
});
```

- controllerでアクションが行われ、formatをhtml, Jsonといったデータの形式のどれで返すか決まる


```qiitas_controller.rb
  def create
    @message = Message.new(message_params)
    if @message.save
      respond_to do |format|
        format.html { redirect_to :group_messages, notice: "メッセージが投稿されました" }
        format.json
      end
    else
      flash[:alert] = "メッセージを入力してください"
      render :index
    end
  end
```

- viewの一部が上記で決まったデータ形式で切り替わる。
- 非同期通信完了！！！！
marginとpaddingや borderの使い分け

CSSの中でmarginとpaddingがありますが皆さんは詳しく説明できますか？

カンタンにいえば、箱の外側に余白を取る方を 
#### 「margin」
箱の内側に余白を取る方を
#### 「padiing」
箱の境界線の幅や色を変更できるのを
#### 「border」
と、なりますがもっとわかりやすく、
具体的にイメージが浮かばない人のために詳しくみていきましょう。


こちらをご覧ください
>![margin_padding_1 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/170088/2dd67970-cfc1-2b3e-d342-cff9dfa00544.jpeg)
>出典　4ki4.cocolog-nifty.com


今回の例でwidthで指定した幅というのは、コンテンツ（内容）にあたります。その「border」の内側で幅を「margin」、外側を「padding」と覚えましょう。
rbenvで2.4.1をインストールする手順

rbenvでruby2.4.1をインストールするときにちょっと手間取ったのでそのメモ。

# 作業環境
Mac OS X 10.11.6
ruby2.1.2 -> 2.4.1にします。

```zsh
$ rbenv version
2.1.2
```

# rbenvでインストール

```zsh
$ rbenv install 2.4.1
ruby-build: definition not found: 2.4.1

The following versions contain `2.4.1' in the name:
  rbx-2.4.1

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  brew update && brew upgrade ruby-build
```

なんか怒られたので確認。。

```zsh
$ rbenv install --list
```

するとたしかにバージョン2.4系が一覧にはなかった。

# homebrewのアップデート

ということで、rbenvをアップデートすべく、まずはhomebrewをアップデートしよう。

```zsh
$ brew update
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
...
Error: update-report should not be called directly!
```

なんか怒られた。。

```zsh
$ brew prune
Pruned 0 symbolic links and 2 directories from /usr/local
$ brew update
```

お、うまくいった。

# rbenvのアップデート

```zsh
$ rbenv install 2.4.1
ruby-build: use openssl from homebrew
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
ruby-build: use readline from homebrew

BUILD FAILED (OS X 10.11.6 using ruby-build 20170201)

Inspect or clean up the working tree at /var/folders/mt/q37kjktd79bd6315fwfqjj700000gn/T/ruby-build.20170328134756.36364
Results logged to /var/folders/mt/q37kjktd79bd6315fwfqjj700000gn/T/ruby-build.20170328134756.36364.log

Last 10 log lines:
make: *** Waiting for unfinished jobs....
dyld: lazy symbol binding failed: Symbol not found: _clock_gettime
  Referenced from: /private/var/folders/mt/q37kjktd79bd6315fwfqjj700000gn/T/ruby-build.20170328134756.36364/ruby-2.4.1/./miniruby (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _clock_gettime
  Referenced from: /private/var/folders/mt/q37kjktd79bd6315fwfqjj700000gn/T/ruby-build.20170328134756.36364/ruby-2.4.1/./miniruby (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

make: *** [encdb.h] Trace/BPT trap: 5
```

なんか怒られた。。
バージョンが古いっぽいので`xcode-select`で再インストール。

```zsh
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

もっかいチャレンジ！

```zsh
$ rbenv install 2.4.1
ruby-build: use openssl from homebrew
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
ruby-build: use readline from homebrew
Installed ruby-2.4.1 to /Users/nishihara/.rbenv/versions/2.4.1
```

インストールできた！

あとはrbenvでrubyバージョンを指定すればOK。

```zsh
$ rbenv global 2.4.1
```

以上。

# 参考
* [rbenv を update して最新のRuby バージョンをインストール[Homebrew] - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/rbenv-update-brew-new-ruby-version/)
* [Xcode8環境下でrbenvにてrubyのコンパイルに失敗する - Qiita](http://qiita.com/bloody_snow/items/11b7651db583b0e998b6)
* [Homebrewでbrew updateしたら/usr/local/Library/ENV/scm/git: No such file or directoryと言われてしまう - Smoky God Express](http://hkdnet.hatenablog.com/entry/2016/07/30/215925)
作成したscopeの紹介

# scopeとは？

scopeについての説明は色々な方が説明をしているので、割愛
参考URL　http://qiita.com/Ayaka14/items/eb4718bf076a82714089

# scopeにするコード
```ruby:users_controller.rb(修正前)
keyword = 検索したい文字列
@users = User.where("name like '#{keyword}'").or(User.where("kana like '#{keyword}'"))
```
```ruby:users_controller.rb(修正後)
keyword = 検索したい文字列
@users = User.where('name like ?', keyword).or(User.where('kana like ?', keyword)
```
orでwhereがつなげることもポイント！ここでは、nameカラム、kanaカラムどちらかに引っかかったものすべてを検索
※コメントを受けて、編集しました。scivolaさん、ありがとうございます。

# scopeを定義したコード
```ruby:user.rb
scope :including_name_or_kana, ->(keyword){ where('name like ?', keyword).or where('kana like ?', keyword) }
```
ラムダ記法については以下の参考記事を参照
http://www.atmarkit.co.jp/ait/articles/1409/29/news035_3.html

# 実際の使い方
```ruby:users_controller.rb
reg = params[:search_character]
@users = User.including_name_or_kana(reg)
```
上記のようにメソッドチェインで呼び出して、使え簡潔な記述となる。

是非、お試しあれ！！
iPythonの設定など


Windowsでipythonを使っているときに困っている点を解決しました。


# WindowsPowerShellでiPythonを使いこなすためのちょっとした設定
ちょっとしたコードの確認や、捨てスクリプトを書いて実行するために、WindowsPowerShell上でiPythonを使うことがしばしばありますが、その際にカラースキームをなんとかできないかな？と思っていました。

具体的には、ある種のキーワードがPowerShellの「画面の色」設定とバッティングして見えなくなってしまうことがあるのです。
例えば、「in」が表示されなくなってしまいます。こんなに頻繁に使うキーワードなのに。


これは、Windows PowerShellのコンソールで設定されている背景の色と、iPythonのカラースキームで設定されている色が同じであることから起きている問題と思われます。

```python
for x in range(100):
	...
```

![IMG_3104.PNG](https://qiita-image-store.s3.amazonaws.com/0/15553/ecf9e0ca-db74-3015-67f6-a26f3dfc587b.png "IMG_3104.PNG")



また、グラフを描いて確認したい時にipythonを起動するときに「--matplotlib」を付け忘れることもしばしばあって、そのたびにそれまでに書いた捨てスクリプトを本当に捨ててしまってipythonを終了して再起動しなければならないことにも不満を感じていました。

## iPythonに対する不満

- Windows PowerShell上で使うと見えなくなる文字がある
- 起動オプション「--matplotlib」を忘れがち

これらの不満を解決するためには、ipythonの起動時のデフォルト設定をきちんとしておく必要があります。

## iPythonの設定ファイルの作成

iPythonの設定ファイルは、Windows PowerShell上で以下のようにコマンドを入力すると、環境変数%HOME%に設定されているフォルダに、「.ipython¥profile_default」というフォルダが作成され、そこに「ipython_config.py」「ipython_kernel_config.py」というファイルが作成されます。

```
PS C:¥Users¥user01> ipython profile create
[ProfileCreate] Generating default config file: 'c:¥¥Users¥¥user01¥¥.ipython¥¥profile_default¥¥ipython_config.py'
[ProfileCreate] Generating default config file: 'c:¥¥Users¥¥user01¥¥.ipython¥¥profile_default¥¥ipython_kernel_config.py'
```

以降は、このipython_config.pyを編集することで設定を変更できます。

### カラースキームの変更
ipython_config.pyの183行目に、以下のような記載があります。

```
#c.InteractiveShell.colors = 'Neutral'
```

この先頭の「#」を削除した上で、NeutralをLinuxに変更します。残念ながら用意されているカラースキームは、「NoColor, Neutral, Linux or LightBG」のみらしいです。

```
c.InteractiveShell.colors = 'Linux'
```

これで下の図のように、キーワード```in```がちゃんと表示されるようになりました。

![IMG_3106.PNG](https://qiita-image-store.s3.amazonaws.com/0/15553/32dfd5f3-afa1-c96a-1dbf-9d2c7ff646f9.png "IMG_3106.PNG")


308行目には、「#c.TerminalInteractiveShell.highlighting_style = traitlets.Undefined」というコメントアウトされた記述があり、ここにもhighlighting_styleが記載できるとされているっぽいのですが、307行目に例示されているようなスタイルを記載してみても、動作しませんでした。
Windows PowerShellではサポートされていないのかもしれません。


### matplotlibの設定
iPythonをmatplotlibの機能付きで使うために、やはりipython_config.pyを設定します。

52行目に、次のようなコメントアウトされた行があります。

```
#c.InteractiveShellApp.matplotlib = None
```

この行頭の「#」を外して、次のように記載を変更します。

```
c.InteractiveShellApp.matplotlib = 'auto'
```

すると、```--matplotlib```を付けないで起動したiPython環境であっても、matplotlib.pyplotで定義された関数を使うと、グラフが表示されるようになりました。

```python
from matplotlib import pyplot as plt
from numpy import random

plt.scatter(random.rand(10), random.rand(10))
```

![IMG_3107.PNG](https://qiita-image-store.s3.amazonaws.com/0/15553/a46ce3ec-8668-8ad4-60f1-efb79fc76960.png "IMG_3107.PNG")

# まとめ
iPythonの設定ファイルは、```ipython profile create```により生成される。

生成されたipython_config.pyを編集することで、カラースキームを変更したり、matplotlibを呼び出した際に別Windowに画像等を表示することが可能になる。
Amazon Elastic MapReduce(EMR)で躓いたところ

## input が多段の場合 * で指定
  `-input s3://hogefuga/2017/04/04/*/` 
*※* を指定
Kinesis FirehoseからS3にログを投げると時間(hh)のディレクトリーを作ってしまうので * を利用

## output は存在しないものを指定
出力フォルダーを作るところまでがEMR
> エラー内容:Output directory already exists.

## Map から Reduce へ渡す時のデータは単一キーのソートにしかならない


``` 
A1 B1 C1
A1 B2 C2
A2 B1 C1
A2 B2 C2
A3 B1 C1
A3 B2 C2
```
上のような想定しているソートにはならない
やりたかったことはセカンダリーソートというらしい[Hadoop セカンダリソートについて](http://ritchiekotzen.hatenablog.com/entry/20120802/1343887199)

mapper から reducer に渡す時はKey-Valueにすること



## デバッグしづらい
 `--scale-down-behavior TERMINATE_AT_INSTANCE_HOUR` 
サーバを殺さずにステップを追加して動作確認

## 最後は
 `--auto-terminate`
Xcode でデバッグ中 AQDefaultDevice のログが邪魔で仕方ない方へ

いつの頃か、デバッグ中に下記のようなログが、大量に出てしまって、ずっと邪魔で他のログが追うのが大変だったのだが、解決法があったのでメモ書き。

```
AQDefaultDevice (173): skipping input stream 0 0 0x0
```

1. XCode メニューの Edit Schema を開く  
  Product -> Schema -> Edit Schema...  
2. Environment Variables に下記を追加  

```
Name: OS_ACTIVITY_MODE  
Value: disable          <= テキストで入力
```

これでさっぱり消えた！
Crystalのジェネリクスで簡単な型制約をかける

Crystal言語にはジェネリクスの仕組みがありますが，型変数に対する制約をかける構文は，v0.21.1時点ではまだ用意されていないようです[^1]。

[^1]: GitHub上で議論はされています。（https://github.com/crystal-lang/crystal/issues/934）

Ary Borenszweig氏などは，ジェネリクスを単純なコンテナ以外の目的で使用することについては消極的なよう[^2]ですが，Scalaと同じまでとは言わないまでも，特定のクラスの子孫だけを受け入れるジェネリクスがあると良いな，と思うことは間々あります。

[^2]: https://github.com/crystal-lang/crystal/issues/934#issuecomment-118516014

ジェネリクスの定義時点では型変数は何型でもありませんが，ジェネリクスを使用する時点ではその型変数が何型なのかがわかっているはずです。また，型変数はジェネリクス型の定義の中であれば通常の型と同じように使用できますので，ある型が他の型の子孫であるかどうかを判定できれば，オブジェクトの生成時に型チェックをして例外を投げることはできそうな気がします。

ところが，Rubyだと`SomeClass < OtherClass`で`SomeClass`が`OtherClass`を継承しているかどうかを調べられるのですが，Crystalの`Class`型には`#<`や`#>`などは用意されていません。

```
Int32 < Number
#=> Error in line 1: undefined method '<' for Int32:Class
```

さてどうしたものかと思ったのですが，Crystalコンパイラや標準添付ライブラリのソースを眺めていた時にそれっぽい記述を見たような薄っすらとした記憶があったため諸々調べてみると，マクロが使用する`TypeNode`型[^3]にはRubyのような`#>`や`#<`などのインスタンスメソッドが用意されており，これらを使って型の継承関係をチェックすることができるようです。

[^3]: https://crystal-lang.org/api/Crystal/Macros/TypeNode.html

という訳で，`N`型が先祖に`Number`を持っていない場合には，マクロを使って`#initialize`中に例外を吐くコードを埋め込むという強引な方法ですが，数値だけを入れられる箱`NumBox`型が実現できました。（何気に，型変数`N`を`{{N}}`で展開すると，実行時点の型名になってくれています）

```crystal:numbox.cr
class NumBox(N)
  class InvalidType < Exception; end

  getter value

  def initialize(@value : N)
    {% unless N < Number %}
      raise InvalidType.new("{{N}} is not a Number type.")
    {% end %}
  end

  def to_s(io)
    io << @value
  end

end

puts NumBox(Int32).new(1)
puts NumBox(Float64).new(1.0)
puts NumBox(String).new("1")
```

```shell:実行結果
$ crystal run numbox.cr 
1
1.0
String is not a Number type. (NumBox::InvalidType)
0x1073e3f52: *CallStack::unwind:Array(Pointer(Void)) at ??
0x1073e3ef1: *CallStack#initialize:Array(Pointer(Void)) at ??
0x1073e3ec8: *CallStack::new:CallStack at ??
0x1073e3221: *raise<NumBox::InvalidType>:NoReturn at ??
0x107410eef: *NumBox(String)@NumBox(N)#initialize<String>:NoReturn at ??
0x107410ecc: *NumBox(String)@NumBox(N)::new<String>:NumBox(String) at ??
0x1073ddb2e: __crystal_main at ??
0x1073e3068: main at ??
```

`#<`や`#>`以外にも，マクロの`TypeNode`型には，その型がユニオン型かどうかを判定する`#union?`や，インスタンス変数やメッソドのリストを返すメソッドなども用意されていて，使い様によってはかなり強力な道具になりそうです。

## 追記

実行時の例外よりもコンパイル時にエラーになって欲しいよね，ということで，マクロでコンパイル時エラーが出せるっぽいです。（`#initialize`の中でエラーを出しちゃったせいで，エラー箇所の表示が変なことになっちゃってますが）

```crystal:numbox2.cr
class NumBox(N)
  class InvalidType < Exception; end

  getter value

  def initialize(@value : N)
    {% unless N < Number %}
      {% raise "#{N} is not a Number type." %}
    {% end %}
  end

  def to_s(io)
    io << @value
  end

end

puts NumBox(Int32).new(1)
puts NumBox(Float64).new(1.0)
puts NumBox(String).new("1")
```

```shell:実行結果
$ crystal run numbox2.cr 
Error in test.cr:20: String is not a Number type.

puts NumBox(String).new("1")
                    ^~~
```
Module compiled with Swift 3.0.1 cannot be imported in Swift 3.1


# 動作環境

* Xcode8.3
* Swift3.1
* CocoaPod 1.2.0


# ビルドに失敗した

cocoapodにてフレームワークをインポートしてビルドしたところ`Module compiled with Swift 3.0.1 cannot be imported in Swift 3.1`というエラーがでてビルドできませんでした。


![20170404_1491269976.jpg](https://qiita-image-store.s3.amazonaws.com/0/31587/17a664b6-bb51-6e7a-b848-ee8e03d2fb11.jpeg "20170404_1491269976.jpg")


# 解決方法

Podsのプロジェクトの **Build Settings** の **User-DefinedのSWIFT-VERSION** がデフォルトでは3.0だったのを3.1に変更したらビルドが通りました。


![20170404_1491270019.jpg](https://qiita-image-store.s3.amazonaws.com/0/31587/796b3282-a116-35d1-d2a5-7e3c5e8591ee.jpeg "20170404_1491270019.jpg")


困った方の参考になればと思います。
Dockerもいいけど、LXCも使おうぜ

業界で話題になってるDockerですが、Docker以外にも素晴らしいコンテナ技術があります。
今回はLXC(Linux Container)を紹介します。

# LXCとDockerの違い
Dockerはそもそもアプリケーションのデプロイを目的として作られました。だから「1コンテナ1プロセス」の仕組みをとっています。起動時に/sbin/initを叩くこともしません。ほとんど「隔離環境」に近いでしょう。
（まあ実は/sbin/initを叩かせてDockerコンテナを通常のLinux仮想マシンとして動作させることもできますが。）

しかしLXCは、そもそも軽量な仮想マシンを動作させることを目的としているため、起動するイメージはOSのフルイメージであり、initやsystemdも完全に動作します。アプリケーションではなく単純な仮想マシンを作るためだけなら、こちらのほうが優れているでしょう。

もちろん両方とも、chrootやcgroups等のカーネルの機能を使っていることに違いはありませんが。
（追記: どうやら最近Dockerはchrootやcgroupsを使わずに自前で開発している模様です）

# 比較表
||Docker|LXC|
|:-:|:-:|:-:|
|用途|アプリケーションのデプロイの効率化・セキュリティ性の向上|コンテナを利用した仮想マシンの作成|
|イメージ|公式サイトにあるさまざまなイメージを、手軽に利用できる|基本的に、有名なテンプレートのみ用意されている。(Ubuntu,Centos, etc...)|
|ファイルシステム|イメージ。実態は１つのファイル|色々サポートしている。差分管理も可能。ディレクトリ形式にすれば、ホストからクライアントをマウントできて便利。|
|速度|作成・開始・停止・破棄ともに高速|作成と破棄は、OSイメージをまるまる一個コピーしてるため遅い。2分くらいかかる。開始・停止はDockerとの体感時間の差はない。|
|管理|Docker swarmやcomposeがある|特に無い（はず）。だがOpenstack等で仮想マシンのハイパーバイザをKVM等からLXCに変更できる。|
|ネットワーク|どうしてもNATを挟まなければ動かせず、また複雑なことは難しい。Dockerが内部的にiptableを利用している。|所属するブリッジやipアドレスなどを柔軟に割り当てられる。ホストと同じLANに所属させることも可能|

# 操作
||Docker|LXC|
|:-:|:-:|:-:|
|コンテナ作成|docker create|lxc-create|
|コンテナ起動|docker start|lxc-start|
|コンテナのttyに接続|docker attach|lxc-attach|
|コンテナの終了|docker stop|lxc-stop|
|コンテナの破棄|docker rm|lxc-destroy|

これだけ見る限り、操作の変更点は殆ど無い。

# まとめ
Dockerを授業や大会等で仮想マシン代わりに使おうとしてるフレンズは、LXCを使うともっと楽でいいかもしれない。
（以前シェル芸でLXCを150個立ち上げて設定をして、とある大会で参加者が触れるようにしていました。）
Pillowを使ってPythonで簡単に画像処理する

[pillow](http://pillow.readthedocs.io/en/latest/index.html): 画像処理ライブラリ。scikit-imageやopencvより軽量でお手軽。

インストール

```bash
$ pip install -U Pillow
```

wgetで画像取得

```bash
$ cd <workspace>
$ wget --no-check-certificate -O gorilla.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Male_silverback_Gorilla.JPG/236px-Male_silverback_Gorilla.JPG
$ atom test_pillow.py # 下記参照
```
![gorilla.jpg](https://qiita-image-store.s3.amazonaws.com/0/158680/45124b7b-44e9-55d5-e0dc-3cb0eca1f263.jpeg)

画像を読み込んで、お絵描きして保存するスクリプト

```python:test_pillow.py
from __future__ import print_function
from PIL import Image, ImageDraw, ImageFont

# fileから読み込み
im = Image.open('gorilla.JPG')

# 画像情報
print(im.format, im.size, im.mode)

# コード変換 Gray
# im = im.convert("L")
# コード変換 Alpha Channel 追加
# im = im.convert('RGBA')
# コード変換 RGB2BGR
# r, g, b = im.split() 
# im = Image.merge("RGB", (b, g, r))

# 領域切り取り
# box = (50, 50, 200, 200) # left, upper, right, lower
# region = im.crop(box)
# region
# region.show()
# 領域貼り付け
# im = im.paste(region, box)

# 画像変換
# im = im.transpose(Image.FLIP_LEFT_RIGHT)
# im = im.transpose(Image.ROTATE_90)
# im = im.rotate(45)

# フィルタリング
# from PIL import ImageFilter
# im = im.filter(ImageFilter.BLUR)

# お絵描き
# font_bookで調べて好きな fontを選ぶ @mac
fnt = ImageFont.truetype('/Library/Fonts/Arial.ttf', size=20)
d = ImageDraw.Draw(im)
d.line((0, 0) + im.size, fill=(128,0,0), width=2)
d.line((0, im.size[1], im.size[0], 0), fill=(128,0,0), width=2)
# draw rectangle
import numpy as np
thickness = 5
left, top, right, bottom = 30,20, 220, 220 # ほんとは deep_learning使う。今回は指定。
text_origin = (10,10)
label_size = d.textsize("gorilla", fnt)
for i in range(thickness):
    d.rectangle([left + i, top + i, right - i, bottom - i], outline=(0,0,128))
d.rectangle([text_origin, tuple(np.array(text_origin) + label_size)], fill=(0,0,128))
d.text(text_origin, "gorilla", font=fnt, fill=(255,255,255))
del d

# 画像保存
im.save('gorilla_convert.jpg')

# 画像表示
im.show()
```

実行

```bash
$ python test_pillow.py
```

![gorilla_convert.jpg](https://qiita-image-store.s3.amazonaws.com/0/158680/c15e65c5-7471-4375-0bca-c7c8121a7dc6.jpeg)


スクリーンキャプチャ

```python
from PIL import ImageGrab

ImageGrab.grab(bbox=(0, 50, 800, 650))
```
ERROR ITMS-90206:"Invalid Bundle."のエラー解消方法


#動作環境

* Xcode8.3
* Swift3.1
* iOS9.2以上
* 独自フレームワークをインポートしたプロジェクト

# エラー内容
アーカイブしたアプリをiTunens Connectにアップロードしようとしたところ以下のようなエラーがでました。

ERROR ITMS-90206:"Invalid Bundle."

![20170404_1491294534.jpg](https://qiita-image-store.s3.amazonaws.com/0/31587/5755b8d2-3691-37fb-8860-39d9f1e77f30.jpeg "20170404_1491294534.jpg")

アプリには独自のフレームワークを取り込んでいます。

# だめな対応

このエラーをググると以下のような記事が引っかかりました。

[ITMS-90206エラーの回避策](http://qiita.com/tomohisaota/items/6d1f0a2aea9d20ef2acb)

曰く、Extensionアプリを作成している場合は該当ターゲットに余計なFrameworkを含めては行けないそうで解決するには以下のようなスクリプトをBuild Phase Scriptに組む必要があるとのことです。

```
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then 
    rm -fr Frameworks
fi
```

しかし今回はExtensionアプリを作成していないので当てはまりませんでした。

しかもこの処理をメインのアプリターゲットに適応してしまって以下の記事ででるようなエラーが出てしまいました。

[Library not loaded エラー？ここを見直そう](http://qiita.com/kakipo/items/3cd87e00bc96bc3888b2)

エラー内容

```
Dyld Error Message:
  Library not loaded: /Library/Frameworks/xxx
  Referenced from: /Users/USER/Desktop/MyApp.app/Contents/MacOS/MyApp
  Reason: image not found
```

実行時に必要なフレームワークがロードできないというエラーです。

よくよく見れば、Build Phase Scriptに先程組み込んだスクリプトでフレームワークを消してるんですよね

```
rm -fr Frameworks
```

そりゃ、ロードできないはずだ。。

なのでこの対応は見当違いの対応でした。

# 今回上手く行った対応
今回、該当の独自フレームワークプロジェクトの「Always Embed Swift Standard Libraries」を`YES`から`NO`に変更しアーカイブし直したらうまくいきました。

![20170404_1491294543.jpg](https://qiita-image-store.s3.amazonaws.com/0/31587/25cbd169-2b49-e475-804e-626c8a30fcd5.jpeg "20170404_1491294543.jpg")


皆さん同じところでハマった場合は参考にしていただければと思います。


# 参考

[Invalid Bundle, The bundle contains disallowed nested bundles, contains disallowed file 'Frameworks'](http://stackoverflow.com/questions/30361864/invalid-bundle-the-bundle-contains-disallowed-nested-bundles-contains-disallow)
[td-agent] supervisordログをパースする際の正規表現

## インプット

```bash
2007-09-08 14:43:22,961 INFO RPC interface 'supervisor' initialized
2007-09-08 14:43:22,961 CRIT Running without any HTTP authentication checking
2007-09-08 14:43:22,962 INFO supervisord started with pid 27347
```

http://supervisord.org/logging.html

## 設定ファイル例

key: `level`,`message` のレコードがアウトプットされる。

```bash
### supervisord ###
<source>
  type        tail
  tag         supervisord
  format      /^(?<time>[^\]]*) (?<level>[A-Z]{4}) (?<message>.*)$/
  time_format %Y-%m-%d %H:%M:%S,%L
  path        /var/log/supervisor/supervisord.log
  pos_file    /var/log/td-agent/buffer/supervisord.pos
</source>
```

## 参考

[td-agentの正規表現デバッグに便利なサイト](http://fluentular.herokuapp.com/parse?regexp=%5E%28%3F%3Ctime%3E%5B%5E%5C%5D%5D*%29+%28%3F%3Clevel%3E%5BA-Z%5D%7B4%7D%29+%28%3F%3Cmessage%3E.*%29%24&input=2007-09-08+14%3A43%3A22%2C961+INFO+RPC+interface+%27supervisor%27+initialized&time_format=%25Y-%25m-%25d+%25H%3A%25M%3A%25S%2C%25L)
OSX El Capitan、Sierraでapple-gcc42をインストールする

railsの環境構築中にapple-gcc42がインストールできずに詰まったので、備忘録。

```
brew install apple-gcc42
```
でコケる場合

```
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/apple-gcc42.rb
```

このファイルの13行目あたりがmarvericsになってる場合があるので、自分のOSのバージョンに書き換える。

```
depends_on MaximumMacOSRequirement => :el_capitan
```

これで再度installすれば入るはず。
goの静的解析ライブラリのいろいろまとめ

## はしがき

以前、[go vet](http://qiita.com/marnie_ms4/items/b343165efb4235906db7)について触れましたが、
公式以外でも循環複雑度解析をしてくれたりとか、
いろいろ良いライブラリがあるので、その辺の紹介を。(後おまけでvimの設定:p

## 静的解析ライブラリ 御三家的なアレ。

* [go vet](https://golang.org/cmd/vet/)

[前の記事] (http://qiita.com/marnie_ms4/items/b343165efb4235906db7)でも紹介したgo謹製のツールですね。

* [go imports](https://godoc.org/golang.org/x/tools/cmd/goimports)

保存時とかに掛けると、使ってないimportを自動でお掃除してくれたり、追加してくれたりする、賢い子です。

* [go lint](https://github.com/golang/lint)

構文上微妙なものとかをsuggestしてくれます。
私はvimのファイル保存時にgo fmt,go lintは自動で掛けるようにしています :)

## 静的解析ライブラリ 複雑度、重複コードチェックとか少し凝ったやつ

* [go cyclo](https://github.com/fzipp/gocyclo)

分岐数などのプログラムの構造の複雑さ、[循環複雑度](http://szk-takanori.hatenablog.com/entry/20111219/p1)を測ってくれます。
あくまで指標なので普段からゴリゴリ使うものでもないですが、リファクタの対象探しとかに良いかなと。
` -over ` とかで閾値を決めて定期的に探したり、大きいモジュールを作った時にチェックしてみると楽しい。

* [errcheck](https://github.com/kisielk/errcheck)

エラーハンドリングしてない奴を抽出してくれます。
個人的にはエラーはちまちまハンドリングするんじゃなくて、上の層でごそっと捕まえてロギングするなりしたいので
そんな使ってない。（下手に握り潰されてもやなので、回復処理がないならとりあえず上にちゃんと返せ派)

* [dupl](https://github.com/mibk/dupl)

重複コード検出をしてくれます。

## vimmer向け

`go imports`,`go vet`,`go lint` 周りは保存時にかけちゃうのがオススメです。(go fmtは言わずもがな)
[syntastic](https://github.com/vim-syntastic/syntastic)あたりとか
[vim-go](https://github.com/fatih/vim-go)とかで。
vim-goは[チュートリアル](https://github.com/fatih/vim-go-tutorial#imports)も充実してて便利です。

```
 NeoBundle 'scrooloose/syntastic'
 let g:syntastic_mode_map = {
 \ "mode" : "active",
 \ "active_filetypes" : ["go"],
 \}
 let g:syntastic_go_checkers = ['go', 'golint', 'govet']
 let g:go_fmt_autosave = 1
 let g:syntastic_aggregate_errors = 1
 augroup GoSaveHook
 autocmd!
 autocmd BufWritePre *.go GoImports
 augroup END
```
とか(適当ですいません。)
そういえば最近NeoBundle聞かないなぁ。

## YOU全てかけちゃいなよ なライブラリ

だいたい上で紹介したもの+αをまとめて全部かけてくれる子もいます。
全ての項目を有効にした場合、結構な時間が掛かるのでCIで常時回すのは自己判断で..。
ただ手軽なので、一度回してみると良いと思います :)

[gometalinter](https://github.com/alecthomas/gometalinter)


```
gometalinter --install --update
gometalinter ./...
```
サボってると大量に出るので、metalinterのformatがしたくなると言う。


## 私見

個人的に、レビューでの構文指摘などは不毛なので、lint,vet,fmt通ればOK、みたいなボーダーラインやルールを作ると、
構造設計・パフォーマンスなど本来レビューするべきことに集中できるのでオススメです。
duplやerrcheck,cycloなどは定常的にCIで,,ってほどには正直思わないのですが、
コードベースが大きくなるにつれ、複雑度がおかしくなってゼウスクラスが出来上がったりするので
コードベースのたまのヘルスチェック くらいな気持ちで良いかなーと思ってます。
Oracle用語備忘録

# 概要
当資料は忘れっぽい自分のために、Oracleに登場する用語や技術概要などをまとめた用語集です。随時追加していきます。サラッと概要のみ把握したい時のための物なので、技術的な詳しい話などは「参考」ページなどにお任せしています。
また、ここでは「Oracle」の視点からの説明となるので、同じ用語であっても他のRDBMSでは別モノであったりしますのでご注意ください。
※間違い、補足などありましたらご指摘頂けたら幸いです。m(__)m

## マルチテナント（Multitenant）
１つのDBインスタンスで複数のDBを実現するOracle12cより導入された機能。　コンテナデータベース（CDB）上に複数の仮想DBであるプラガブルデータベース（PDB）を作成する構成。
単位関係を表すとこんな感じ↓
DBインスタンス ＞ CDB ＞ PDB
以下の利点がある。
・パッチ適用、アップグレード、バックなどはCDB単位でできるのでPDB一つ一つに対して作業するといった面倒はない。
・複数のPDBを１つのインスタンスで扱うことでメモリやプロセスなどのリソースを無駄なく使用する事ができる。
参考：https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197775_2274.html

## システムグローバル領域（SGA）
Oracle Databaseインスタンスに関するデータと制御情報が保存されている。SGAは、すべてのサーバー・プロセスおよびバックグラウンド・プロセスで共有される。SGAに格納されるデータの例には、キャッシュ・データ・ブロックや共有SQL領域がある。基本的にはテーブルのデータや、インデックス等がほとんどを占め、SQLの実行計画なども含まれる。

## プログラムグローバル領域（PGA）
サーバー・プロセスの開始時にOracle Databaseによって作成される非共有メモリー領域。つまり、Oracle Databaseインスタンスの各プロセス間で共有されない領域。

## ロールバックセグメント（RBS）
トランザクション開始後にロールバック用の情報（変更前の情報）を保存するためディスク領域の一部をそのトランザクションに対して割り当てる。この領域をロールバック・セグメントと呼ぶ。Oracle10g以降では「UNDOセグメント」と呼ばれている。
参考：http://itpro.nikkeibp.co.jp/article/COLUMN/20060118/227488/

## UNDOセグメント
Oracle9i以前では、「ロールバックセグメント」と呼ばれていた。「実行した操作を取り消す」役割を担う。トランザクション取り消し時（ロールバック）に用いられる。
参考：http://www.oracle.com/technetwork/jp/database/articles/tsushima/index-1672539-ja.html

## REDOログ
データベースに対して行なった操作を REDO(再実行) するためのログ＝作業履歴情報。つまり、「一度やったことをもう一度やる」役割を担うログファイル。障害発生直前まで処理をやり直す（ロールフォワード）際に用いられる。
参考：http://www.shift-the-oracle.com/oracle/redo-log-file.html
deployerでデプロイ完了時にうまるちゃんがSlackに通知してくれる様にした

#deployerでデプロイ時に通知する様にした

```php:deploy/deploy.php
task('slack_alert', function() {
    //どの環境にデプロイしているのか取得
    $stage = input()->getArgument('stage');
    //デプロイ先ディレクトリ
    $path   = run('pwd');
    $result = run('echo "phocaseデプロイ完了したよ〜"');
    //メンションをつける、 @hereを使いたい場合は特殊な書き方となり <!here>　と記述します
    $team = "@hogehoge";
    $message = '\"'.$team.$path.":".$stage."環境に".$result.'\"';
    $command = 'curl -s -S -X POST --data-urlencode "payload={\"link_names\" : 1, \"channel\": \"#送信チャンネル名\", \"username\": \"umaru\", \"icon_emoji\": \":umaru:\", \"text\": '.$message.' }" "slackのweb hook APIのキーをここに記述" >/dev/null';
    run($command);
});
after('deploy', 'slack_alert');
```



※うまるちゃんのアイコンは各自入れてください。。。
[CGiI]CGIの勉強

CGIとPerlを初めて会いました。
えっど、全く知らない、一先ず、参考したいいブログをまとめましょうか。

*参考*
・[CGIの概要](http://www.tohoho-web.com/wwwcgi1.htm#CgiAbout)
・[CGIが正常に実行できることを確認](http://www.bitlink.co.jp/server/scripts/perl.cgi)
・[PHPのヒアドキュメント](http://www.flatflag.nir87.com/eod-729#i)
・[ <<<\_\_HTML\_\_](http://kaz-ix.blogspot.jp/2011/02/php.html)


---I Love PHP (｡･ω･｡)ﾉ♡
railsのバージョンを指定してインストールする


## やりたい事
rails 5系ではなく、4.2.1が欲しい。

```
$ gem instll rails
```
とするとrails 5系が入ってくる。

## 解決方法

以下コマンドでインストールできる。

```
$ gem install -v 4.2.1 rails

```

インストール後の確認

```
$ rails -v

Rails 4.2.1
```

4.2.1が無事に入りましたー
Drupal8のフォームにリセットボタンをつける

Drupal8のフォームにはリセットボタンがデフォルトではないので、一手間加える必要があります。以下は、その手順です。

## 独自モジュールを作成する
独自モジュールを作成します。ここでは作成方法は割愛します。

## hook_form_alter()を実装する
hook_form_alter()を実装して、リセットボタンを追加するようにします。html_tagを利用してボタンタグを用意します。#attributesでtypeにresetを指定することでリセットボタンになります。classは配列にする必要があるので注意してください。

```php:hoge.module
function hoge_form_alter(&$form, ormStateInterface $form_state, $form_id)
{
	if ($form_id == 'my_form_id') {
		// リセットボタン追加
		$form['actions']['reset'] = [
		  '#type' => 'html_tag',
		  '#tag' => 'button',
		  '#attributes' => [
			'class' => ['some-class'],
			'type' => 'reset',
		  ],
		  '#value' => t('Reset'),
		];
	}
}

```

## 独自モジュールをインストールする
作ったモジュールを管理画面からインストールします。

## まとめ
比較的容易に、リセットボタンを用意することができました。独自のフォームのみに反映させるのであれば、FormBaseを拡張したクラスのbuildForm()に同様の記述を用意すれば実装可能です。
Julius×Unityで音声認識をさせようとしてつまづいたことのメモ

Julius-Client-for-Unity ver1.4
を使用して音声認識をやってみようとしたところ初心者なためにつまづいたことがあったのでメモ
※Unityのバージョンは5.3.2

1.microphone.csでのエラー
表現が古いため修正が必要だった。
新しくAudioSourceの変数としてaudioを用意したがNullReference～のエラー発生。原因はGetComponentを忘れたこと。
Start()にaudio=GetComponent< AudioSource>();を追加して解決

2.認識した声の文字表示が文字化けする問題
シーンを再生して声を出すと文字化けした文字が表示されてしまっていた。
原因は文字コード、UTF８であれば上手くいくはずなのでJulius_Client.cs内のget_stream()にある
stream = System.Text.Encoding.Default.GetString(data);
を以下のように変更
stream = System.Text.Encoding.UTF8.GetString(data);
シーンを再生すると日本語が表示された。

初めて見るコードが多すぎて諦めようかと思ったけれど諦めなくてよかった。
実際、初心者すぎてエンコード・デコードが行われていることに気づくまでに時間がかかったり(このせいでどこで文字化けを直せばいいか分からなかった)、正規化表現って何だ？と思って原因じゃないか探したり、そもそもどんな情報が送られてきているのか調べたりと横道にそれまくった結果3~4時間が無駄になったから次からはもっとスマートに原因に辿り着きたい。

参考にしたページ
Julius-Client-for-Unity ver1.4
※今回使用させていただいているもの
https://github.com/SavantCat/Julius-Client-for-Unity

Unityで音声認識
※Julius×Unityを使ってみようと思ったきっかけ
https://www.slideshare.net/hamayanhamayan/unity-54349052

バイト型配列を文字列に変換する
※他の文字コードへの変換の仕方とかも載ってる、ここに辿り着けなかったら死んでた
https://dobon.net/vb/dotnet/string/getencoding.html

第10章 モジュールモード
※Juliusのモジュールモードについて書かれておりどんな情報が送られているか参考になった
https://julius.osdn.jp/juliusbook/ja/desc_module.html
brew cask installのPermission deniedを解決する


## 環境
Mac OS Sierra
バージョン 10.12.3

## 現象
新たなMacにbrew cask installで環境を構築しようとするとPermission deniedになった。

```
$ brew cask install atom

==> Satisfying dependencies
complete
==> Downloading https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip
######################################################################## 100.0%
==> Verifying checksum for Cask atom
Error: Permission denied - /usr/local/Caskroom/atom
Follow the instructions here:
  https://github.com/caskroom/homebrew-cask#reporting-bugs
...
```
エラーメッセージ
Error: Permission denied - /usr/local/Caskroom/atom

困った時にはbrew cask doctor

```
$ brew cask doctor

==> Homebrew-Cask Version
Homebrew-Cask 1.1.12
caskroom/homebrew-cask (git revision 5cb3; last commit 2017-04-04)
==> Homebrew-Cask Install Location
<NONE>
==> Homebrew-Cask Staging Location
/usr/local/Caskroom (error: not writable by current user)
...

```
error: not writable by current user
どうやらcurrent userには書き込み権限が無いようですね

## 解決方法

Mac OS Sierraでは```/usr/local```の権限が強化され制限されているようだ。
以下コマンドで制限を回避する。

```
sudo chown -R $(whoami) /usr/local
```

再度、brew cask installを試す

```
$ brew cask install atom

==> Satisfying dependencies
complete
==> Downloading https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip
Already downloaded: /Users/ikemura/Library/Caches/Homebrew/Cask/atom--1.15.0.zip
==> Verifying checksum for Cask atom
==> Moving App 'Atom.app' to '/Users/z1tg6774/Applications/Atom.app'.
==> Linking Binary 'apm' to '/usr/local/bin/apm'.
==> Linking Binary 'atom.sh' to '/usr/local/bin/atom'.
🍺  atom was successfully installed!
```
cask installが成功し、無事にatomをインストールできました。
awslogsを入れるとログをまとめてtailできて便利だったのでこの幸せをおすそ分けしたいメモ

# 背景

![image](https://qiita-image-store.s3.amazonaws.com/0/38292/a7d854fc-ae41-1c18-41ca-7665ab8a1649.png)
aws CloudWatch LogsをLog Group横断でtailするヤツ。awsでAPI開発をしていると複数のEC2インスタンスに冗長化したり、更にその内部でnginx持っててDocker containerをClusteringしていたりして、Logを集約して見るのに若干不便な思いをすることがあります。CloudWatch Logsでは一応Log Groupをまとめていたものの、なにか良い方法はないものか？と日頃から思っていました。そこでawslogsのご紹介です(ショップジャ○ン感)。

![image](https://qiita-image-store.s3.amazonaws.com/0/38292/7c3459a1-199f-8682-260b-eec0a6f410b7.png)
[jorgebastida/awslogs: AWS CloudWatch logs for Humans™](https://github.com/jorgebastida/awslogs)

# 前提

- AWSで
    - CloudWatchを見る権限のあるIAMユーザーを作っている
- Logを見る環境で
    - awscliインストール位済
    - `aws configure`済
- 各EC2インスタンスたちで
    - agentを[インストール](http://dev.classmethod.jp/cloud/aws/show-cloudwatch-logs-with-awslogs-command/)している

# awslogsをインストール

ネットに散見する資料ではroot不要みたいに書いてあるけど必要。pip必須。

```
-bash-*.*$ sudo pip install awslogs
```

# Log Group一覧取得

仮にこんなLog Groupがあったとして…

```
-bash-*.*$ awslogs groups
production.log
staging.log
/var/log/messages
/var/log/docker
-bash-*.*$
```

# tailする

基本的に`awslogs get -w {log_group_name}`で取る。

## productionの場合

```
-bash-*.*$ awslogs get -w production.log
```

## stagingの場合

```
-bash-*.*$ awslogs get -w staging.log
```

# 所感

週末に( ﾟдﾟ)ﾎﾟｶｰﾝと眺めたいですね。それじゃまた。
Laravel5.3から5.4にあげたときにHTTPS強制でエラー


`forceSchema`が`forceScheme`になった話。

## Laravel5.3
```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        if (env('APP_ENV') == 'production' || env('APP_ENV') == 'staging') {
            \URL::forceSchema('https');
        }
    }
```

## Laravel5.4
このままバージョンアップすると`artisan`コマンドを打ったときに、

```bash
  [BadMethodCallException]
  Method forceSchema does not exist.
```

って出る。


```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        if (env('APP_ENV') == 'production' || env('APP_ENV') == 'staging') {
            \URL::forceScheme('https');
        }
    }
```
[正規表現] デリミタのエスケープに対応する

[vCardのように](https://tools.ietf.org/html/rfc6350#section-3.4)`;`で区切られたデータの中にエスケープされた`\;`が入る場合、

```perl:wrong.pl
my @sp = split /;/, $value;
```
などとすると不用意なところで文字列が分割される問題について対応した。

```perl:right.pl
my @sp = split /(?<!\\);/, $value;
```

`(?<!エスケープ文字)デリミタ`←こういうのを正規表現の拡張構文「後方一致検索の否定形」というらしい。

例によって、言語に依存せず使えるかどうかはわからない。
画像サイズを自動で取得する


## PostCSS Assets

https://github.com/borodean/postcss-assets

個人的にはまず以下のようなmixinを用意して・・・

```sass:mixin/_image.scss
// postCss Assets
@mixin image($url, $density: 1, $scale:1){
　@include hide-txt(); // 画像の説明テキストを表示しない自前mixin
　$scale: 1 / $scale;
  background-repeat: no-repeat;
  background-position: center center;
  background-image: resolve($url);
  background-size: size($url,$density * $scale);
  width: width($url,$density * $scale);
  height: height($url,$density * $scale);
}
// SPをベースにしてPCも同じ画像のケース
@mixin same-image($url, $scale:1){
  $scale: 1 / $scale;
  @include image($url,1 * $scale);
  @include mq(sp) { // sp環境用の自前mixin
    @include image($url,2 * $scale);
  }
}
```

```sass:style.scss
.sample{
  @include same-image('sample1.png');
  // SP用に640*480の画像があると仮定
  // PC -> 640*480
  // SP -> 320*240
}
```

上記のような１行を書くだけで、
画像サイズを自動で取得した上で、
PC、SP環境に対応したスタイルを、
キャッシュバスター付きで当てることができる。

Gulpの設定はこんな感じ↓

```javascript:gulpfile.js
ー（略）ー
.pipe(postcss([assets({
  basePath: `${DEST}`, // プロジェクトで公開するパス
  loadPaths: [`img/`], // basePathから見た画像フォルダの位置
  relative: `css/`, // img/とcss/の相対的な位置
  cachebuster: true,
  // baseUrl: '',
})]))
```


## Compass

画像のサイズを測るだけならCompassでもok

[Compass(Sass)で画像サイズを自動取得する](http://hacknote.jp/archives/1696/)
gulp や mocha を使う時は yarn が便利


以下の環境で確認

```bash:Terminal
$ node -v
v7.7.4
$ npm -v
4.4.4
$ yarn -v
yarn install v0.21.3
warning No license field
[1/4] 🔍  Resolving packages...
success Already up-to-date.
✨  Done in 1.76s.
```

**yarn** を使うと ``package.json`` の ``scripts`` フィールドに余計なことを書かなくてよくなります。

- [yarnpkg/yarn: 📦🐈 Fast, reliable, and secure dependency management.](https://github.com/yarnpkg/yarn)
- [別に $ npm install -g gulp しなくても大丈夫って話。 – Toro_Unit](https://torounit.com/blog/2016/06/06/2321/)

例えば以下のようなファイル構成だった場合。

- [MochaでJavaScriptのテストを書く - CLOVER](http://d.hatena.ne.jp/Kazuhira/20160306/1457271963)

```bash:Terminal
$ tree .
.
├── gulpfile.js
├── package.json
├── src
│   └── calc.js
└── test
    └── calc-test.js
```

```js:src/calc.js
function add(a, b) {
    return a + b;
}

function multiply(a, b) {
    return a * b;
}

module.exports = {add, multiply};
```

```js:test/calc-test.js
var assert = require("assert");
var calc = require("../src-js/calc.js");

describe("calc", function() {
    it("add", function() {
        assert.equal(4, calc.add(1, 3));
    });

    it("multiply", function() {
        assert.equal(6, calc.multiply(2, 3));
    });
});
```

```js:gulpfile.js
var gulp = require("gulp");
var mocha = require("gulp-mocha");

gulp.task("mocha", function() {
    return gulp
        .src(["test/*.js"], { read: false })
        .pipe(mocha({ reporter: "spec" }));
});

gulp.task("watch", function() {
    return gulp
        .watch(["src/**", "test/**"], ["mocha"]);
});
```

```json:package.json
{
  "dependencies": {
    "gulp": "^3.9.1",
    "gulp-mocha": "3.0.1",
    "mocha": "^3.2.0"
  }
}
```

``package.json`` に ``scripts`` フィールドがないので、以下の実行はエラーになります。

```bash:Terminal
$ npm run mocha
npm ERR! missing script: mocha
$ npm run gulp mocha
npm ERR! missing script: gulp
```

でも **yarn** だと ``scripts`` フィールドがなくても問題なく実行されます。

> 2017/4/10 追記。``run`` が無くても動くことに気づきました。

```bash:Terminal
$ yarn run mocha
// or
$ yarn mocha
yarn run v0.21.3
$ "/path/to/project/node_modules/.bin/mocha" 
  calc
    ✓ add
    ✓ multiply
  2 passing (12ms)
✨  Done in 0.66s.

$ yarn run gulp mocha
// or
$ yarn gulp mocha
yarn run v0.21.3
$ "/path/to/project/node_modules/.bin/gulp" mocha
[1X:33:00] Using gulpfile /path/to/project/gulpfile.js
[1X:33:00] Starting 'mocha'...
[1X:33:01] Finished 'mocha' after 686 ms
✨  Done in 8.62s.
```

``npm run`` でエラーなく実行するには、以下のように ``scripts`` フィールドを追加する必要があります。

```json:package.json
{
  〜略〜
  },
  "scripts": {
    "mocha": "mocha",
    "gulp": "gulp"
  }
}
```

そんなわけで自分はもっぱら **yarn** を使ってます。
``install``（yarn では ``add``）も、``npm`` より速い気がしますし。

でも Github とかで公開するコードでは ``scripts`` フィールドを書いておくと喜ばれるかも。
Railsで使いそうなlogrotateの設定まとめ

CentOSでの例。

### Rails
```sh:/etc/logrotate.d/rails
/path-to-app/log/*.log {
    weekly
    rotate 15
    missingok
    notifempty
    copytruncate
    dateext
    compress
    create 0666 username username

    lastaction
        pid=/path-to-app/tmp/pids/unicorn.pid
        test -s $pid && kill -USR1 "$(cat $pid)"
    endscript
}
```

### nginx
```sh:/etc/logrotate.d/nginx
/var/log/nginx/*log {
    create 0644 nginx nginx
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /etc/init.d/nginx reopen_logs
    endscript
}
```

### NewRelic
```sh:/etc/logrotate.d/newrelic-sysmond
/var/log/newrelic/nrsysmond.log {
    rotate 7
    daily
    missingok
    notifempty
    sharedscripts
    copytruncate
    compress
}
```
多言語サイトで自動リダイレクトを導入したらGoogleの検索結果が英語になった

## 前提条件

 - 多言語サイト、日英のみ
 - ブラウザの言語設定をみて、各言語ページへリダイレクトする処理をJavaScriptでかいている

## 現象

Google（日本）の検索結果のタイトルとdescriptionが英語ページのものになった

## 解決策

UAに'googlebot'が含まれていた場合、自動リダイレクトしないようにした

```javascript
// Googleクローラはリダイレクトしない
// 検索結果のdescriptionやtitleが英語ページのものになってしまうため
const userAgent = window.navigator.userAgent.toLowerCase();
if (userAgent.indexOf('googlebot') === -1) {
  /**
  　リダイレクトする処理
　**/
}
```

参考）[GoogleクローラーのUA一覧](https://support.google.com/webmasters/answer/1061943?hl=ja)


## 考察

Googleクローラーは言語が英語になっていて、クロールの最中に英語サイトへリダイレクトしてしまい、
英語のサイトのタイトルとdescriptionを取得してしまっていたと思われる🙉
OpenURIで10KB以下のファイルが開けないよ


`undefined method 'path' for #<StringIO...`に遭遇したため、解決した過程の忘備録です。


RubyでURLから画像などのファイルを開く場合、

```rb
OpenURI.open_uri('ファイルのURL')
```
で大抵は開けます。

で、この戻り値は`Tempfile`になるわけですが、ファイルが10kb以下だった場合には`StringIO`になっちゃうみたいです。

この10kbという数字は`OpenURI::Buffer`に`StringMax`という定数で定義されています。

[Class: OpenURI::Buffer ](http://www.rubydoc.info/stdlib/open-uri/OpenURI/Buffer)

なので、これを一時的に上書きすれば10kb以下のファイルでも対応できそうです。

```rb
OpenURI::Buffer.send('const_set', :StringMax, 0)
file = OpenURI.open_uri('10kb以下のファイルのURL')
file.class # => Tempfile
```

これで開くことができました。